diff --git a/interpreter/Cargo.toml b/interpreter/Cargo.toml index 7659945..aa3599b 100644 --- a/interpreter/Cargo.toml +++ b/interpreter/Cargo.toml @@ -8,7 +8,10 @@ edition = "2021" [dependencies.rlox2-frontend] path = "../frontend" +[dev-dependencies] +glob = "0.3" + [dependencies] -thiserror = "1.0.38" -itertools = "0.10.5" -rustc-hash = "1.1.0" +thiserror = "1" +itertools = "0.13" +rustc-hash = "2" diff --git a/interpreter/tests/lox/assignment/associativity.lox b/interpreter/tests/lox/assignment/associativity.lox new file mode 100644 index 0000000..1b9d93e --- /dev/null +++ b/interpreter/tests/lox/assignment/associativity.lox @@ -0,0 +1,9 @@ +var a = "a"; +var b = "b"; +var c = "c"; + +// Assignment is right-associative. +a = b = c; +print a; // expect: c +print b; // expect: c +print c; // expect: c diff --git a/interpreter/tests/lox/assignment/global.lox b/interpreter/tests/lox/assignment/global.lox new file mode 100644 index 0000000..48fb485 --- /dev/null +++ b/interpreter/tests/lox/assignment/global.lox @@ -0,0 +1,8 @@ +var a = "before"; +print a; // expect: before + +a = "after"; +print a; // expect: after + +print a = "arg"; // expect: arg +print a; // expect: arg diff --git a/interpreter/tests/lox/assignment/grouping.lox b/interpreter/tests/lox/assignment/grouping.lox new file mode 100644 index 0000000..dc6e79f --- /dev/null +++ b/interpreter/tests/lox/assignment/grouping.lox @@ -0,0 +1,2 @@ +var a = "a"; +(a) = "value"; // Error at '=': Invalid assignment target. diff --git a/interpreter/tests/lox/assignment/infix_operator.lox b/interpreter/tests/lox/assignment/infix_operator.lox new file mode 100644 index 0000000..fa55c47 --- /dev/null +++ b/interpreter/tests/lox/assignment/infix_operator.lox @@ -0,0 +1,3 @@ +var a = "a"; +var b = "b"; +a + b = "value"; // Error at '=': Invalid assignment target. diff --git a/interpreter/tests/lox/assignment/local.lox b/interpreter/tests/lox/assignment/local.lox new file mode 100644 index 0000000..2aaaf6d --- /dev/null +++ b/interpreter/tests/lox/assignment/local.lox @@ -0,0 +1,10 @@ +{ + var a = "before"; + print a; // expect: before + + a = "after"; + print a; // expect: after + + print a = "arg"; // expect: arg + print a; // expect: arg +} diff --git a/interpreter/tests/lox/assignment/prefix_operator.lox b/interpreter/tests/lox/assignment/prefix_operator.lox new file mode 100644 index 0000000..fdd143c --- /dev/null +++ b/interpreter/tests/lox/assignment/prefix_operator.lox @@ -0,0 +1,2 @@ +var a = "a"; +!a = "value"; // Error at '=': Invalid assignment target. diff --git a/interpreter/tests/lox/assignment/syntax.lox b/interpreter/tests/lox/assignment/syntax.lox new file mode 100644 index 0000000..d688ac7 --- /dev/null +++ b/interpreter/tests/lox/assignment/syntax.lox @@ -0,0 +1,5 @@ +// Assignment on RHS of variable. +var a = "before"; +var c = a = "var"; +print a; // expect: var +print c; // expect: var diff --git a/interpreter/tests/lox/assignment/to_this.lox b/interpreter/tests/lox/assignment/to_this.lox new file mode 100644 index 0000000..c1e4a6b --- /dev/null +++ b/interpreter/tests/lox/assignment/to_this.lox @@ -0,0 +1,7 @@ +class Foo { + Foo() { + this = "value"; // Error at '=': Invalid assignment target. + } +} + +Foo(); diff --git a/interpreter/tests/lox/assignment/undefined.lox b/interpreter/tests/lox/assignment/undefined.lox new file mode 100644 index 0000000..169a68f --- /dev/null +++ b/interpreter/tests/lox/assignment/undefined.lox @@ -0,0 +1 @@ +unknown = "what"; // Error: Undefined variable 'unknown'. diff --git a/interpreter/tests/lox/block/empty.lox b/interpreter/tests/lox/block/empty.lox new file mode 100644 index 0000000..982139a --- /dev/null +++ b/interpreter/tests/lox/block/empty.lox @@ -0,0 +1,7 @@ +{} // By itself. + +// In a statement. +if (true) {} +if (false) {} else {} + +print "ok"; // expect: ok diff --git a/interpreter/tests/lox/block/scope.lox b/interpreter/tests/lox/block/scope.lox new file mode 100644 index 0000000..2ece1a7 --- /dev/null +++ b/interpreter/tests/lox/block/scope.lox @@ -0,0 +1,8 @@ +var a = "outer"; + +{ + var a = "inner"; + print a; // expect: inner +} + +print a; // expect: outer diff --git a/interpreter/tests/lox/bool/equality.lox b/interpreter/tests/lox/bool/equality.lox new file mode 100644 index 0000000..2be86e2 --- /dev/null +++ b/interpreter/tests/lox/bool/equality.lox @@ -0,0 +1,23 @@ +print true == true; // expect: true +print true == false; // expect: false +print false == true; // expect: false +print false == false; // expect: true + +// Not equal to other types. +print true == 1; // expect: false +print false == 0; // expect: false +print true == "true"; // expect: false +print false == "false"; // expect: false +print false == ""; // expect: false + +print true != true; // expect: false +print true != false; // expect: true +print false != true; // expect: true +print false != false; // expect: false + +// Not equal to other types. +print true != 1; // expect: true +print false != 0; // expect: true +print true != "true"; // expect: true +print false != "false"; // expect: true +print false != ""; // expect: true diff --git a/interpreter/tests/lox/bool/not.lox b/interpreter/tests/lox/bool/not.lox new file mode 100644 index 0000000..2f55405 --- /dev/null +++ b/interpreter/tests/lox/bool/not.lox @@ -0,0 +1,3 @@ +print !true; // expect: false +print !false; // expect: true +print !!true; // expect: true diff --git a/interpreter/tests/lox/break/for.lox b/interpreter/tests/lox/break/for.lox new file mode 100644 index 0000000..f90f766 --- /dev/null +++ b/interpreter/tests/lox/break/for.lox @@ -0,0 +1,11 @@ +for (var i = 0; i < 10; i = i + 1) { + if (i == 5) + break; + + print i; +} +// expect: 0 +// expect: 1 +// expect: 2 +// expect: 3 +// expect: 4 diff --git a/interpreter/tests/lox/break/outside_loop.lox b/interpreter/tests/lox/break/outside_loop.lox new file mode 100644 index 0000000..8b6c59e --- /dev/null +++ b/interpreter/tests/lox/break/outside_loop.lox @@ -0,0 +1,2 @@ +break; +// expect: error diff --git a/interpreter/tests/lox/break/while.lox b/interpreter/tests/lox/break/while.lox new file mode 100644 index 0000000..6cb236a --- /dev/null +++ b/interpreter/tests/lox/break/while.lox @@ -0,0 +1,15 @@ +var i = 0; + +while (i < 10) { + if (i == 5) + break; + + print i; + + i = i + 1; +} +// expect: 0 +// expect: 1 +// expect: 2 +// expect: 3 +// expect: 4 diff --git a/interpreter/tests/lox/call/bool.lox b/interpreter/tests/lox/call/bool.lox new file mode 100644 index 0000000..859cd86 --- /dev/null +++ b/interpreter/tests/lox/call/bool.lox @@ -0,0 +1 @@ +true(); // expect runtime error: Can only call functions and classes. diff --git a/interpreter/tests/lox/call/nil.lox b/interpreter/tests/lox/call/nil.lox new file mode 100644 index 0000000..7fdf584 --- /dev/null +++ b/interpreter/tests/lox/call/nil.lox @@ -0,0 +1 @@ +nil(); // expect runtime error: Can only call functions and classes. diff --git a/interpreter/tests/lox/call/num.lox b/interpreter/tests/lox/call/num.lox new file mode 100644 index 0000000..1ed1b86 --- /dev/null +++ b/interpreter/tests/lox/call/num.lox @@ -0,0 +1 @@ +123(); // expect runtime error: Can only call functions and classes. diff --git a/interpreter/tests/lox/call/object.lox b/interpreter/tests/lox/call/object.lox new file mode 100644 index 0000000..dce58d9 --- /dev/null +++ b/interpreter/tests/lox/call/object.lox @@ -0,0 +1,4 @@ +class Foo {} + +var foo = Foo(); +foo(); // expect runtime error: Can only call functions and classes. diff --git a/interpreter/tests/lox/call/string.lox b/interpreter/tests/lox/call/string.lox new file mode 100644 index 0000000..91f62a0 --- /dev/null +++ b/interpreter/tests/lox/call/string.lox @@ -0,0 +1 @@ +"str"(); // expect runtime error: Can only call functions and classes. diff --git a/interpreter/tests/lox/class/empty.lox b/interpreter/tests/lox/class/empty.lox new file mode 100644 index 0000000..dc1b7c3 --- /dev/null +++ b/interpreter/tests/lox/class/empty.lox @@ -0,0 +1,3 @@ +class Foo {} + +print Foo; // expect: Foo diff --git a/interpreter/tests/lox/class/inherit_self.lox b/interpreter/tests/lox/class/inherit_self.lox new file mode 100644 index 0000000..8bb1dac --- /dev/null +++ b/interpreter/tests/lox/class/inherit_self.lox @@ -0,0 +1 @@ +class Foo < Foo {} // Error at 'Foo': A class can't inherit from itself. diff --git a/interpreter/tests/lox/class/inherited_method.lox b/interpreter/tests/lox/class/inherited_method.lox new file mode 100644 index 0000000..8b49b53 --- /dev/null +++ b/interpreter/tests/lox/class/inherited_method.lox @@ -0,0 +1,22 @@ +class Foo { + inFoo() { + print "in foo"; + } +} + +class Bar < Foo { + inBar() { + print "in bar"; + } +} + +class Baz < Bar { + inBaz() { + print "in baz"; + } +} + +var baz = Baz(); +baz.inFoo(); // expect: in foo +baz.inBar(); // expect: in bar +baz.inBaz(); // expect: in baz diff --git a/interpreter/tests/lox/class/local_inherit_other.lox b/interpreter/tests/lox/class/local_inherit_other.lox new file mode 100644 index 0000000..210cf98 --- /dev/null +++ b/interpreter/tests/lox/class/local_inherit_other.lox @@ -0,0 +1,8 @@ +class A {} + +fun f() { + class B < A {} + return B; +} + +print f(); // expect: B diff --git a/interpreter/tests/lox/class/local_inherit_self.lox b/interpreter/tests/lox/class/local_inherit_self.lox new file mode 100644 index 0000000..ffd0d4d --- /dev/null +++ b/interpreter/tests/lox/class/local_inherit_self.lox @@ -0,0 +1,4 @@ +{ + class Foo < Foo {} // Error at 'Foo': A class can't inherit from itself. +} +// [c line 5] Error at end: Expect '}' after block. diff --git a/interpreter/tests/lox/class/local_reference_self.lox b/interpreter/tests/lox/class/local_reference_self.lox new file mode 100644 index 0000000..009a3e8 --- /dev/null +++ b/interpreter/tests/lox/class/local_reference_self.lox @@ -0,0 +1,9 @@ +{ + class Foo { + returnSelf() { + return Foo; + } + } + + print Foo().returnSelf(); // expect: Foo +} diff --git a/interpreter/tests/lox/class/reference_self.lox b/interpreter/tests/lox/class/reference_self.lox new file mode 100644 index 0000000..65c1cc7 --- /dev/null +++ b/interpreter/tests/lox/class/reference_self.lox @@ -0,0 +1,7 @@ +class Foo { + returnSelf() { + return Foo; + } +} + +print Foo().returnSelf(); // expect: Foo diff --git a/interpreter/tests/lox/closure/assign_to_closure.lox b/interpreter/tests/lox/closure/assign_to_closure.lox new file mode 100644 index 0000000..7f38b77 --- /dev/null +++ b/interpreter/tests/lox/closure/assign_to_closure.lox @@ -0,0 +1,27 @@ +var f; +var g; + +{ + var local = "local"; + fun f_() { + print local; + local = "after f"; + print local; + } + f = f_; + + fun g_() { + print local; + local = "after g"; + print local; + } + g = g_; +} + +f(); +// expect: local +// expect: after f + +g(); +// expect: after f +// expect: after g diff --git a/interpreter/tests/lox/closure/assign_to_shadowed_later.lox b/interpreter/tests/lox/closure/assign_to_shadowed_later.lox new file mode 100644 index 0000000..5d22685 --- /dev/null +++ b/interpreter/tests/lox/closure/assign_to_shadowed_later.lox @@ -0,0 +1,13 @@ +var a = "global"; + +{ + fun assign() { + a = "assigned"; + } + + var a = "inner"; + assign(); + print a; // expect: inner +} + +print a; // expect: assigned diff --git a/interpreter/tests/lox/closure/close_over_function_parameter.lox b/interpreter/tests/lox/closure/close_over_function_parameter.lox new file mode 100644 index 0000000..7163bc7 --- /dev/null +++ b/interpreter/tests/lox/closure/close_over_function_parameter.lox @@ -0,0 +1,11 @@ +var f; + +fun foo(param) { + fun f_() { + print param; + } + f = f_; +} +foo("param"); + +f(); // expect: param diff --git a/interpreter/tests/lox/closure/close_over_later_variable.lox b/interpreter/tests/lox/closure/close_over_later_variable.lox new file mode 100644 index 0000000..16d92b8 --- /dev/null +++ b/interpreter/tests/lox/closure/close_over_later_variable.lox @@ -0,0 +1,15 @@ +// This is a regression test. There was a bug where if an upvalue for an +// earlier local (here "a") was captured *after* a later one ("b"), then it +// would crash because it walked to the end of the upvalue list (correct), but +// then didn't handle not finding the variable. + +fun f() { + var a = "a"; + var b = "b"; + fun g() { + print b; // expect: b + print a; // expect: a + } + g(); +} +f(); diff --git a/interpreter/tests/lox/closure/close_over_method_parameter.lox b/interpreter/tests/lox/closure/close_over_method_parameter.lox new file mode 100644 index 0000000..07c3798 --- /dev/null +++ b/interpreter/tests/lox/closure/close_over_method_parameter.lox @@ -0,0 +1,13 @@ +var f; + +class Foo { + method(param) { + fun f_() { + print param; + } + f = f_; + } +} + +Foo().method("param"); +f(); // expect: param diff --git a/interpreter/tests/lox/closure/closed_closure_in_function.lox b/interpreter/tests/lox/closure/closed_closure_in_function.lox new file mode 100644 index 0000000..e2e91b5 --- /dev/null +++ b/interpreter/tests/lox/closure/closed_closure_in_function.lox @@ -0,0 +1,11 @@ +var f; + +{ + var local = "local"; + fun f_() { + print local; + } + f = f_; +} + +f(); // expect: local diff --git a/interpreter/tests/lox/closure/nested_closure.lox b/interpreter/tests/lox/closure/nested_closure.lox new file mode 100644 index 0000000..46aabcd --- /dev/null +++ b/interpreter/tests/lox/closure/nested_closure.lox @@ -0,0 +1,25 @@ +var f; + +fun f1() { + var a = "a"; + fun f2() { + var b = "b"; + fun f3() { + var c = "c"; + fun f4() { + print a; + print b; + print c; + } + f = f4; + } + f3(); + } + f2(); +} +f1(); + +f(); +// expect: a +// expect: b +// expect: c diff --git a/interpreter/tests/lox/closure/open_closure_in_function.lox b/interpreter/tests/lox/closure/open_closure_in_function.lox new file mode 100644 index 0000000..ff85f2f --- /dev/null +++ b/interpreter/tests/lox/closure/open_closure_in_function.lox @@ -0,0 +1,7 @@ +{ + var local = "local"; + fun f() { + print local; // expect: local + } + f(); +} diff --git a/interpreter/tests/lox/closure/reference_closure_multiple_times.lox b/interpreter/tests/lox/closure/reference_closure_multiple_times.lox new file mode 100644 index 0000000..bc7c73c --- /dev/null +++ b/interpreter/tests/lox/closure/reference_closure_multiple_times.lox @@ -0,0 +1,14 @@ +var f; + +{ + var a = "a"; + fun f_() { + print a; + print a; + } + f = f_; +} + +f(); +// expect: a +// expect: a diff --git a/interpreter/tests/lox/closure/reuse_closure_slot.lox b/interpreter/tests/lox/closure/reuse_closure_slot.lox new file mode 100644 index 0000000..6086c6e --- /dev/null +++ b/interpreter/tests/lox/closure/reuse_closure_slot.lox @@ -0,0 +1,16 @@ +{ + var f; + + { + var a = "a"; + fun f_() { print a; } + f = f_; + } + + { + // Since a is out of scope, the local slot will be reused by b. Make sure + // that f still closes over a. + var b = "b"; + f(); // expect: a + } +} diff --git a/interpreter/tests/lox/closure/shadow_closure_with_local.lox b/interpreter/tests/lox/closure/shadow_closure_with_local.lox new file mode 100644 index 0000000..7f9164a --- /dev/null +++ b/interpreter/tests/lox/closure/shadow_closure_with_local.lox @@ -0,0 +1,12 @@ +{ + var foo = "closure"; + fun f() { + { + print foo; // expect: closure + var foo = "shadow"; + print foo; // expect: shadow + } + print foo; // expect: closure + } + f(); +} diff --git a/interpreter/tests/lox/closure/unused_closure.lox b/interpreter/tests/lox/closure/unused_closure.lox new file mode 100644 index 0000000..da7eff7 --- /dev/null +++ b/interpreter/tests/lox/closure/unused_closure.lox @@ -0,0 +1,13 @@ +// This is a regression test. There was a bug where the VM would try to close +// an upvalue even if the upvalue was never created because the codepath for +// the closure was not executed. + +{ + var a = "a"; + if (false) { + fun foo() { a; } + } +} + +// If we get here, we didn't segfault when a went out of scope. +print "ok"; // expect: ok diff --git a/interpreter/tests/lox/closure/unused_later_closure.lox b/interpreter/tests/lox/closure/unused_later_closure.lox new file mode 100644 index 0000000..524eb33 --- /dev/null +++ b/interpreter/tests/lox/closure/unused_later_closure.lox @@ -0,0 +1,28 @@ +// This is a regression test. When closing upvalues for discarded locals, it +// wouldn't make sure it discarded the upvalue for the correct stack slot. +// +// Here we create two locals that can be closed over, but only the first one +// actually is. When "b" goes out of scope, we need to make sure we don't +// prematurely close "a". +var closure; + +{ + var a = "a"; + + { + var b = "b"; + fun returnA() { + return a; + } + + closure = returnA; + + if (false) { + fun returnB() { + return b; + } + } + } + + print closure(); // expect: a +} diff --git a/interpreter/tests/lox/comments/line_at_eof.lox b/interpreter/tests/lox/comments/line_at_eof.lox new file mode 100644 index 0000000..924946d --- /dev/null +++ b/interpreter/tests/lox/comments/line_at_eof.lox @@ -0,0 +1,2 @@ +print "ok"; // expect: ok +// comment \ No newline at end of file diff --git a/interpreter/tests/lox/comments/only_line_comment.lox b/interpreter/tests/lox/comments/only_line_comment.lox new file mode 100644 index 0000000..e2c01e9 --- /dev/null +++ b/interpreter/tests/lox/comments/only_line_comment.lox @@ -0,0 +1 @@ +// comment \ No newline at end of file diff --git a/interpreter/tests/lox/comments/only_line_comment_and_line.lox b/interpreter/tests/lox/comments/only_line_comment_and_line.lox new file mode 100644 index 0000000..fef83a9 --- /dev/null +++ b/interpreter/tests/lox/comments/only_line_comment_and_line.lox @@ -0,0 +1 @@ +// comment diff --git a/interpreter/tests/lox/comments/unicode.lox b/interpreter/tests/lox/comments/unicode.lox new file mode 100644 index 0000000..be4f6fc --- /dev/null +++ b/interpreter/tests/lox/comments/unicode.lox @@ -0,0 +1,9 @@ +// Unicode characters are allowed in comments. +// +// Latin 1 Supplement: £§¶ÜÞ +// Latin Extended-A: ĐĦŋœ +// Latin Extended-B: ƂƢƩǁ +// Other stuff: ឃᢆ᯽₪ℜ↩⊗┺░ +// Emoji: ☃☺♣ + +print "ok"; // expect: ok diff --git a/interpreter/tests/lox/constructor/arguments.lox b/interpreter/tests/lox/constructor/arguments.lox new file mode 100644 index 0000000..36881e3 --- /dev/null +++ b/interpreter/tests/lox/constructor/arguments.lox @@ -0,0 +1,11 @@ +class Foo { + init(a, b) { + print "init"; // expect: init + this.a = a; + this.b = b; + } +} + +var foo = Foo(1, 2); +print foo.a; // expect: 1 +print foo.b; // expect: 2 diff --git a/interpreter/tests/lox/constructor/call_init_early_return.lox b/interpreter/tests/lox/constructor/call_init_early_return.lox new file mode 100644 index 0000000..c7c9524 --- /dev/null +++ b/interpreter/tests/lox/constructor/call_init_early_return.lox @@ -0,0 +1,11 @@ +class Foo { + init() { + print "init"; + return; + print "nope"; + } +} + +var foo = Foo(); // expect: init +print foo.init(); // expect: init +// expect: Foo instance diff --git a/interpreter/tests/lox/constructor/call_init_explicitly.lox b/interpreter/tests/lox/constructor/call_init_explicitly.lox new file mode 100644 index 0000000..b2deded --- /dev/null +++ b/interpreter/tests/lox/constructor/call_init_explicitly.lox @@ -0,0 +1,15 @@ +class Foo { + init(arg) { + print "Foo.init(" + arg + ")"; + this.field = "init"; + } +} + +var foo = Foo("one"); // expect: Foo.init(one) +foo.field = "field"; + +var foo2 = foo.init("two"); // expect: Foo.init(two) +print foo2; // expect: Foo instance + +// Make sure init() doesn't create a fresh instance. +print foo.field; // expect: init diff --git a/interpreter/tests/lox/constructor/default.lox b/interpreter/tests/lox/constructor/default.lox new file mode 100644 index 0000000..8b383b9 --- /dev/null +++ b/interpreter/tests/lox/constructor/default.lox @@ -0,0 +1,4 @@ +class Foo {} + +var foo = Foo(); +print foo; // expect: Foo instance diff --git a/interpreter/tests/lox/constructor/default_arguments.lox b/interpreter/tests/lox/constructor/default_arguments.lox new file mode 100644 index 0000000..21d073a --- /dev/null +++ b/interpreter/tests/lox/constructor/default_arguments.lox @@ -0,0 +1,3 @@ +class Foo {} + +var foo = Foo(1, 2, 3); // expect runtime error: Expected 0 arguments but got 3. diff --git a/interpreter/tests/lox/constructor/early_return.lox b/interpreter/tests/lox/constructor/early_return.lox new file mode 100644 index 0000000..4ee17ed --- /dev/null +++ b/interpreter/tests/lox/constructor/early_return.lox @@ -0,0 +1,10 @@ +class Foo { + init() { + print "init"; + return; + print "nope"; + } +} + +var foo = Foo(); // expect: init +print foo; // expect: Foo instance diff --git a/interpreter/tests/lox/constructor/extra_arguments.lox b/interpreter/tests/lox/constructor/extra_arguments.lox new file mode 100644 index 0000000..bee6ebc --- /dev/null +++ b/interpreter/tests/lox/constructor/extra_arguments.lox @@ -0,0 +1,8 @@ +class Foo { + init(a, b) { + this.a = a; + this.b = b; + } +} + +var foo = Foo(1, 2, 3, 4); // expect runtime error: Expected 2 arguments but got 4. \ No newline at end of file diff --git a/interpreter/tests/lox/constructor/init_not_method.lox b/interpreter/tests/lox/constructor/init_not_method.lox new file mode 100644 index 0000000..95730a8 --- /dev/null +++ b/interpreter/tests/lox/constructor/init_not_method.lox @@ -0,0 +1,12 @@ +class Foo { + init(arg) { + print "Foo.init(" + arg + ")"; + this.field = "init"; + } +} + +fun init() { + print "not initializer"; +} + +init(); // expect: not initializer diff --git a/interpreter/tests/lox/constructor/missing_arguments.lox b/interpreter/tests/lox/constructor/missing_arguments.lox new file mode 100644 index 0000000..cf26928 --- /dev/null +++ b/interpreter/tests/lox/constructor/missing_arguments.lox @@ -0,0 +1,5 @@ +class Foo { + init(a, b) {} +} + +var foo = Foo(1); // expect runtime error: Expected 2 arguments but got 1. diff --git a/interpreter/tests/lox/constructor/return_in_nested_function.lox b/interpreter/tests/lox/constructor/return_in_nested_function.lox new file mode 100644 index 0000000..8580f14 --- /dev/null +++ b/interpreter/tests/lox/constructor/return_in_nested_function.lox @@ -0,0 +1,10 @@ +class Foo { + init() { + fun init() { + return "bar"; + } + print init(); // expect: bar + } +} + +print Foo(); // expect: Foo instance diff --git a/interpreter/tests/lox/constructor/return_value.lox b/interpreter/tests/lox/constructor/return_value.lox new file mode 100644 index 0000000..115b450 --- /dev/null +++ b/interpreter/tests/lox/constructor/return_value.lox @@ -0,0 +1,5 @@ +class Foo { + init() { + return "result"; // Error at 'return': Can't return a value from an initializer. + } +} diff --git a/interpreter/tests/lox/continue/for.lox b/interpreter/tests/lox/continue/for.lox new file mode 100644 index 0000000..a434ea6 --- /dev/null +++ b/interpreter/tests/lox/continue/for.lox @@ -0,0 +1,16 @@ +for (var i = 0; i < 10; i = i + 1) { + if (i == 5) + continue; + + print i; +} +// expect: 0 +// expect: 1 +// expect: 2 +// expect: 3 +// expect: 4 +// expect: 6 +// expect: 7 +// expect: 8 +// expect: 9 + diff --git a/interpreter/tests/lox/continue/outside_loop.lox b/interpreter/tests/lox/continue/outside_loop.lox new file mode 100644 index 0000000..56ee1c7 --- /dev/null +++ b/interpreter/tests/lox/continue/outside_loop.lox @@ -0,0 +1,2 @@ +continue; +// expect: error diff --git a/interpreter/tests/lox/continue/while.lox b/interpreter/tests/lox/continue/while.lox new file mode 100644 index 0000000..c71c6b1 --- /dev/null +++ b/interpreter/tests/lox/continue/while.lox @@ -0,0 +1,21 @@ +var i = 0; + +while (i < 10) { + if (i == 5) { + i = i + 1; + continue; + } + + print i; + + i = i + 1; +} +// expect: 0 +// expect: 1 +// expect: 2 +// expect: 3 +// expect: 4 +// expect: 6 +// expect: 7 +// expect: 8 +// expect: 9 diff --git a/interpreter/tests/lox/empty_file.lox b/interpreter/tests/lox/empty_file.lox new file mode 100644 index 0000000..e69de29 diff --git a/interpreter/tests/lox/field/call_function_field.lox b/interpreter/tests/lox/field/call_function_field.lox new file mode 100644 index 0000000..46464aa --- /dev/null +++ b/interpreter/tests/lox/field/call_function_field.lox @@ -0,0 +1,15 @@ +class Foo {} + +fun bar(a, b) { + print "bar"; + print a; + print b; +} + +var foo = Foo(); +foo.bar = bar; + +foo.bar(1, 2); +// expect: bar +// expect: 1 +// expect: 2 diff --git a/interpreter/tests/lox/field/call_nonfunction_field.lox b/interpreter/tests/lox/field/call_nonfunction_field.lox new file mode 100644 index 0000000..cf43899 --- /dev/null +++ b/interpreter/tests/lox/field/call_nonfunction_field.lox @@ -0,0 +1,6 @@ +class Foo {} + +var foo = Foo(); +foo.bar = "not fn"; + +foo.bar(); // expect runtime error: Can only call functions and classes. diff --git a/interpreter/tests/lox/field/get_and_set_method.lox b/interpreter/tests/lox/field/get_and_set_method.lox new file mode 100644 index 0000000..8846583 --- /dev/null +++ b/interpreter/tests/lox/field/get_and_set_method.lox @@ -0,0 +1,25 @@ +// Bound methods have identity equality. +class Foo { + method(a) { + print "method"; + print a; + } + other(a) { + print "other"; + print a; + } +} + +var foo = Foo(); +var method = foo.method; + +// Setting a property shadows the instance method. +foo.method = foo.other; +foo.method(1); +// expect: other +// expect: 1 + +// The old method handle still points to the original method. +method(2); +// expect: method +// expect: 2 diff --git a/interpreter/tests/lox/field/get_on_bool.lox b/interpreter/tests/lox/field/get_on_bool.lox new file mode 100644 index 0000000..d8e1793 --- /dev/null +++ b/interpreter/tests/lox/field/get_on_bool.lox @@ -0,0 +1 @@ +true.foo; // expect runtime error: Only instances have properties. diff --git a/interpreter/tests/lox/field/get_on_class.lox b/interpreter/tests/lox/field/get_on_class.lox new file mode 100644 index 0000000..068b6f9 --- /dev/null +++ b/interpreter/tests/lox/field/get_on_class.lox @@ -0,0 +1,2 @@ +class Foo {} +Foo.bar; // expect runtime error: Only instances have properties. diff --git a/interpreter/tests/lox/field/get_on_function.lox b/interpreter/tests/lox/field/get_on_function.lox new file mode 100644 index 0000000..87c3845 --- /dev/null +++ b/interpreter/tests/lox/field/get_on_function.lox @@ -0,0 +1,3 @@ +fun foo() {} + +foo.bar; // expect runtime error: Only instances have properties. diff --git a/interpreter/tests/lox/field/get_on_nil.lox b/interpreter/tests/lox/field/get_on_nil.lox new file mode 100644 index 0000000..829bb1a --- /dev/null +++ b/interpreter/tests/lox/field/get_on_nil.lox @@ -0,0 +1 @@ +nil.foo; // expect runtime error: Only instances have properties. diff --git a/interpreter/tests/lox/field/get_on_num.lox b/interpreter/tests/lox/field/get_on_num.lox new file mode 100644 index 0000000..287f422 --- /dev/null +++ b/interpreter/tests/lox/field/get_on_num.lox @@ -0,0 +1 @@ +123.foo; // expect runtime error: Only instances have properties. diff --git a/interpreter/tests/lox/field/get_on_string.lox b/interpreter/tests/lox/field/get_on_string.lox new file mode 100644 index 0000000..8a56dad --- /dev/null +++ b/interpreter/tests/lox/field/get_on_string.lox @@ -0,0 +1 @@ +"str".foo; // expect runtime error: Only instances have properties. diff --git a/interpreter/tests/lox/field/many.lox b/interpreter/tests/lox/field/many.lox new file mode 100644 index 0000000..4185904 --- /dev/null +++ b/interpreter/tests/lox/field/many.lox @@ -0,0 +1,170 @@ +class Foo {} + +var foo = Foo(); +fun setFields() { + foo.bilberry = "bilberry"; + foo.lime = "lime"; + foo.elderberry = "elderberry"; + foo.raspberry = "raspberry"; + foo.gooseberry = "gooseberry"; + foo.longan = "longan"; + foo.mandarine = "mandarine"; + foo.kiwifruit = "kiwifruit"; + foo.orange = "orange"; + foo.pomegranate = "pomegranate"; + foo.tomato = "tomato"; + foo.banana = "banana"; + foo.juniper = "juniper"; + foo.damson = "damson"; + foo.blackcurrant = "blackcurrant"; + foo.peach = "peach"; + foo.grape = "grape"; + foo.mango = "mango"; + foo.redcurrant = "redcurrant"; + foo.watermelon = "watermelon"; + foo.plumcot = "plumcot"; + foo.papaya = "papaya"; + foo.cloudberry = "cloudberry"; + foo.rambutan = "rambutan"; + foo.salak = "salak"; + foo.physalis = "physalis"; + foo.huckleberry = "huckleberry"; + foo.coconut = "coconut"; + foo.date = "date"; + foo.tamarind = "tamarind"; + foo.lychee = "lychee"; + foo.raisin = "raisin"; + foo.apple = "apple"; + foo.avocado = "avocado"; + foo.nectarine = "nectarine"; + foo.pomelo = "pomelo"; + foo.melon = "melon"; + foo.currant = "currant"; + foo.plum = "plum"; + foo.persimmon = "persimmon"; + foo.olive = "olive"; + foo.cranberry = "cranberry"; + foo.boysenberry = "boysenberry"; + foo.blackberry = "blackberry"; + foo.passionfruit = "passionfruit"; + foo.mulberry = "mulberry"; + foo.marionberry = "marionberry"; + foo.plantain = "plantain"; + foo.lemon = "lemon"; + foo.yuzu = "yuzu"; + foo.loquat = "loquat"; + foo.kumquat = "kumquat"; + foo.salmonberry = "salmonberry"; + foo.tangerine = "tangerine"; + foo.durian = "durian"; + foo.pear = "pear"; + foo.cantaloupe = "cantaloupe"; + foo.quince = "quince"; + foo.guava = "guava"; + foo.strawberry = "strawberry"; + foo.nance = "nance"; + foo.apricot = "apricot"; + foo.jambul = "jambul"; + foo.grapefruit = "grapefruit"; + foo.clementine = "clementine"; + foo.jujube = "jujube"; + foo.cherry = "cherry"; + foo.feijoa = "feijoa"; + foo.jackfruit = "jackfruit"; + foo.fig = "fig"; + foo.cherimoya = "cherimoya"; + foo.pineapple = "pineapple"; + foo.blueberry = "blueberry"; + foo.jabuticaba = "jabuticaba"; + foo.miracle = "miracle"; + foo.dragonfruit = "dragonfruit"; + foo.satsuma = "satsuma"; + foo.tamarillo = "tamarillo"; + foo.honeydew = "honeydew"; +} + +setFields(); + +fun printFields() { + print foo.apple; // expect: apple + print foo.apricot; // expect: apricot + print foo.avocado; // expect: avocado + print foo.banana; // expect: banana + print foo.bilberry; // expect: bilberry + print foo.blackberry; // expect: blackberry + print foo.blackcurrant; // expect: blackcurrant + print foo.blueberry; // expect: blueberry + print foo.boysenberry; // expect: boysenberry + print foo.cantaloupe; // expect: cantaloupe + print foo.cherimoya; // expect: cherimoya + print foo.cherry; // expect: cherry + print foo.clementine; // expect: clementine + print foo.cloudberry; // expect: cloudberry + print foo.coconut; // expect: coconut + print foo.cranberry; // expect: cranberry + print foo.currant; // expect: currant + print foo.damson; // expect: damson + print foo.date; // expect: date + print foo.dragonfruit; // expect: dragonfruit + print foo.durian; // expect: durian + print foo.elderberry; // expect: elderberry + print foo.feijoa; // expect: feijoa + print foo.fig; // expect: fig + print foo.gooseberry; // expect: gooseberry + print foo.grape; // expect: grape + print foo.grapefruit; // expect: grapefruit + print foo.guava; // expect: guava + print foo.honeydew; // expect: honeydew + print foo.huckleberry; // expect: huckleberry + print foo.jabuticaba; // expect: jabuticaba + print foo.jackfruit; // expect: jackfruit + print foo.jambul; // expect: jambul + print foo.jujube; // expect: jujube + print foo.juniper; // expect: juniper + print foo.kiwifruit; // expect: kiwifruit + print foo.kumquat; // expect: kumquat + print foo.lemon; // expect: lemon + print foo.lime; // expect: lime + print foo.longan; // expect: longan + print foo.loquat; // expect: loquat + print foo.lychee; // expect: lychee + print foo.mandarine; // expect: mandarine + print foo.mango; // expect: mango + print foo.marionberry; // expect: marionberry + print foo.melon; // expect: melon + print foo.miracle; // expect: miracle + print foo.mulberry; // expect: mulberry + print foo.nance; // expect: nance + print foo.nectarine; // expect: nectarine + print foo.olive; // expect: olive + print foo.orange; // expect: orange + print foo.papaya; // expect: papaya + print foo.passionfruit; // expect: passionfruit + print foo.peach; // expect: peach + print foo.pear; // expect: pear + print foo.persimmon; // expect: persimmon + print foo.physalis; // expect: physalis + print foo.pineapple; // expect: pineapple + print foo.plantain; // expect: plantain + print foo.plum; // expect: plum + print foo.plumcot; // expect: plumcot + print foo.pomegranate; // expect: pomegranate + print foo.pomelo; // expect: pomelo + print foo.quince; // expect: quince + print foo.raisin; // expect: raisin + print foo.rambutan; // expect: rambutan + print foo.raspberry; // expect: raspberry + print foo.redcurrant; // expect: redcurrant + print foo.salak; // expect: salak + print foo.salmonberry; // expect: salmonberry + print foo.satsuma; // expect: satsuma + print foo.strawberry; // expect: strawberry + print foo.tamarillo; // expect: tamarillo + print foo.tamarind; // expect: tamarind + print foo.tangerine; // expect: tangerine + print foo.tomato; // expect: tomato + print foo.watermelon; // expect: watermelon + print foo.yuzu; // expect: yuzu +} + +printFields(); diff --git a/interpreter/tests/lox/field/method.lox b/interpreter/tests/lox/field/method.lox new file mode 100644 index 0000000..8410dbd --- /dev/null +++ b/interpreter/tests/lox/field/method.lox @@ -0,0 +1,9 @@ +class Foo { + bar(arg) { + print arg; + } +} + +var bar = Foo().bar; +print "got method"; // expect: got method +bar("arg"); // expect: arg diff --git a/interpreter/tests/lox/field/method_binds_this.lox b/interpreter/tests/lox/field/method_binds_this.lox new file mode 100644 index 0000000..5a5b110 --- /dev/null +++ b/interpreter/tests/lox/field/method_binds_this.lox @@ -0,0 +1,19 @@ +class Foo { + sayName(a) { + print this.name; + print a; + } +} + +var foo1 = Foo(); +foo1.name = "foo1"; + +var foo2 = Foo(); +foo2.name = "foo2"; + +// Store the method reference on another object. +foo2.fn = foo1.sayName; +// Still retains original receiver. +foo2.fn(1); +// expect: foo1 +// expect: 1 diff --git a/interpreter/tests/lox/field/on_instance.lox b/interpreter/tests/lox/field/on_instance.lox new file mode 100644 index 0000000..b3c5511 --- /dev/null +++ b/interpreter/tests/lox/field/on_instance.lox @@ -0,0 +1,9 @@ +class Foo {} + +var foo = Foo(); + +print foo.bar = "bar value"; // expect: bar value +print foo.baz = "baz value"; // expect: baz value + +print foo.bar; // expect: bar value +print foo.baz; // expect: baz value diff --git a/interpreter/tests/lox/field/set_evaluation_order.lox b/interpreter/tests/lox/field/set_evaluation_order.lox new file mode 100644 index 0000000..f9edb00 --- /dev/null +++ b/interpreter/tests/lox/field/set_evaluation_order.lox @@ -0,0 +1,2 @@ +undefined1.bar // expect runtime error: Undefined variable 'undefined1'. + = undefined2; \ No newline at end of file diff --git a/interpreter/tests/lox/field/set_on_bool.lox b/interpreter/tests/lox/field/set_on_bool.lox new file mode 100644 index 0000000..eb9fb3a --- /dev/null +++ b/interpreter/tests/lox/field/set_on_bool.lox @@ -0,0 +1 @@ +true.foo = "value"; // expect runtime error: Only instances have fields. diff --git a/interpreter/tests/lox/field/set_on_class.lox b/interpreter/tests/lox/field/set_on_class.lox new file mode 100644 index 0000000..a7700ec --- /dev/null +++ b/interpreter/tests/lox/field/set_on_class.lox @@ -0,0 +1,2 @@ +class Foo {} +Foo.bar = "value"; // expect runtime error: Only instances have fields. diff --git a/interpreter/tests/lox/field/set_on_function.lox b/interpreter/tests/lox/field/set_on_function.lox new file mode 100644 index 0000000..d28c193 --- /dev/null +++ b/interpreter/tests/lox/field/set_on_function.lox @@ -0,0 +1,3 @@ +fun foo() {} + +foo.bar = "value"; // expect runtime error: Only instances have fields. diff --git a/interpreter/tests/lox/field/set_on_nil.lox b/interpreter/tests/lox/field/set_on_nil.lox new file mode 100644 index 0000000..560dded --- /dev/null +++ b/interpreter/tests/lox/field/set_on_nil.lox @@ -0,0 +1 @@ +nil.foo = "value"; // expect runtime error: Only instances have fields. diff --git a/interpreter/tests/lox/field/set_on_num.lox b/interpreter/tests/lox/field/set_on_num.lox new file mode 100644 index 0000000..cd66c9b --- /dev/null +++ b/interpreter/tests/lox/field/set_on_num.lox @@ -0,0 +1 @@ +123.foo = "value"; // expect runtime error: Only instances have fields. diff --git a/interpreter/tests/lox/field/set_on_string.lox b/interpreter/tests/lox/field/set_on_string.lox new file mode 100644 index 0000000..c0fdb3b --- /dev/null +++ b/interpreter/tests/lox/field/set_on_string.lox @@ -0,0 +1 @@ +"str".foo = "value"; // expect runtime error: Only instances have fields. diff --git a/interpreter/tests/lox/field/undefined.lox b/interpreter/tests/lox/field/undefined.lox new file mode 100644 index 0000000..b6b6297 --- /dev/null +++ b/interpreter/tests/lox/field/undefined.lox @@ -0,0 +1,4 @@ +class Foo {} +var foo = Foo(); + +foo.bar; // expect runtime error: Undefined property 'bar'. diff --git a/interpreter/tests/lox/for/class_in_body.lox b/interpreter/tests/lox/for/class_in_body.lox new file mode 100644 index 0000000..86e76b3 --- /dev/null +++ b/interpreter/tests/lox/for/class_in_body.lox @@ -0,0 +1,2 @@ +// [line 2] Error at 'class': Expect expression. +for (;;) class Foo {} diff --git a/interpreter/tests/lox/for/closure_in_body.lox b/interpreter/tests/lox/for/closure_in_body.lox new file mode 100644 index 0000000..01587e6 --- /dev/null +++ b/interpreter/tests/lox/for/closure_in_body.lox @@ -0,0 +1,22 @@ +var f1; +var f2; +var f3; + +for (var i = 1; i < 4; i = i + 1) { + var j = i; + fun f() { + print i; + print j; + } + + if (j == 1) f1 = f; + else if (j == 2) f2 = f; + else f3 = f; +} + +f1(); // expect: 4 + // expect: 1 +f2(); // expect: 4 + // expect: 2 +f3(); // expect: 4 + // expect: 3 diff --git a/interpreter/tests/lox/for/fun_in_body.lox b/interpreter/tests/lox/for/fun_in_body.lox new file mode 100644 index 0000000..fd5c5d0 --- /dev/null +++ b/interpreter/tests/lox/for/fun_in_body.lox @@ -0,0 +1,2 @@ +// [line 2] Error at 'fun': Expect expression. +for (;;) fun foo() {} diff --git a/interpreter/tests/lox/for/return_closure.lox b/interpreter/tests/lox/for/return_closure.lox new file mode 100644 index 0000000..e6eafc2 --- /dev/null +++ b/interpreter/tests/lox/for/return_closure.lox @@ -0,0 +1,10 @@ +fun f() { + for (;;) { + var i = "i"; + fun g() { print i; } + return g; + } +} + +var h = f(); +h(); // expect: i diff --git a/interpreter/tests/lox/for/return_inside.lox b/interpreter/tests/lox/for/return_inside.lox new file mode 100644 index 0000000..9ed886d --- /dev/null +++ b/interpreter/tests/lox/for/return_inside.lox @@ -0,0 +1,9 @@ +fun f() { + for (;;) { + var i = "i"; + return i; + } +} + +print f(); +// expect: i diff --git a/interpreter/tests/lox/for/scope.lox b/interpreter/tests/lox/for/scope.lox new file mode 100644 index 0000000..9f38925 --- /dev/null +++ b/interpreter/tests/lox/for/scope.lox @@ -0,0 +1,26 @@ +{ + var i = "before"; + + // New variable is in inner scope. + for (var i = 0; i < 1; i = i + 1) { + print i; // expect: 0 + + // Loop body is in second inner scope. + var i = -1; + print i; // expect: -1 + } +} + +{ + // New variable shadows outer variable. + for (var i = 0; i > 0; i = i + 1) {} + + // Goes out of scope after loop. + var i = "after"; + print i; // expect: after + + // Can reuse an existing variable. + for (i = 0; i < 1; i = i + 1) { + print i; // expect: 0 + } +} diff --git a/interpreter/tests/lox/for/statement_condition.lox b/interpreter/tests/lox/for/statement_condition.lox new file mode 100644 index 0000000..a068c2e --- /dev/null +++ b/interpreter/tests/lox/for/statement_condition.lox @@ -0,0 +1,3 @@ +// [line 3] Error at '{': Expect expression. +// [line 3] Error at ')': Expect ';' after expression. +for (var a = 1; {}; a = a + 1) {} diff --git a/interpreter/tests/lox/for/statement_increment.lox b/interpreter/tests/lox/for/statement_increment.lox new file mode 100644 index 0000000..4f47d1d --- /dev/null +++ b/interpreter/tests/lox/for/statement_increment.lox @@ -0,0 +1,2 @@ +// [line 2] Error at '{': Expect expression. +for (var a = 1; a < 2; {}) {} diff --git a/interpreter/tests/lox/for/statement_initializer.lox b/interpreter/tests/lox/for/statement_initializer.lox new file mode 100644 index 0000000..9618e21 --- /dev/null +++ b/interpreter/tests/lox/for/statement_initializer.lox @@ -0,0 +1,3 @@ +// [line 3] Error at '{': Expect expression. +// [line 3] Error at ')': Expect ';' after expression. +for ({}; a < 2; a = a + 1) {} diff --git a/interpreter/tests/lox/for/syntax.lox b/interpreter/tests/lox/for/syntax.lox new file mode 100644 index 0000000..91be593 --- /dev/null +++ b/interpreter/tests/lox/for/syntax.lox @@ -0,0 +1,50 @@ +// Single-expression body. +for (var c = 0; c < 3;) print c = c + 1; +// expect: 1 +// expect: 2 +// expect: 3 + +// Block body. +for (var a = 0; a < 3; a = a + 1) { + print a; +} +// expect: 0 +// expect: 1 +// expect: 2 + +// No clauses. +fun foo() { + for (;;) return "done"; +} +print foo(); // expect: done + +// No variable. +var i = 0; +for (; i < 2; i = i + 1) print i; +// expect: 0 +// expect: 1 + +// No condition. +fun bar() { + for (var i = 0;; i = i + 1) { + print i; + if (i >= 2) return; + } +} +bar(); +// expect: 0 +// expect: 1 +// expect: 2 + +// No increment. +for (var i = 0; i < 2;) { + print i; + i = i + 1; +} +// expect: 0 +// expect: 1 + +// Statement bodies. +for (; false;) if (true) 1; else 2; +for (; false;) while (true) 1; +for (; false;) for (;;) 1; diff --git a/interpreter/tests/lox/for/var_in_body.lox b/interpreter/tests/lox/for/var_in_body.lox new file mode 100644 index 0000000..66d2257 --- /dev/null +++ b/interpreter/tests/lox/for/var_in_body.lox @@ -0,0 +1,2 @@ +// [line 2] Error at 'var': Expect expression. +for (;;) var foo; diff --git a/interpreter/tests/lox/function/body_must_be_block.lox b/interpreter/tests/lox/function/body_must_be_block.lox new file mode 100644 index 0000000..57552bc --- /dev/null +++ b/interpreter/tests/lox/function/body_must_be_block.lox @@ -0,0 +1,3 @@ +// [line 3] Error at '123': Expect '{' before function body. +// [c line 4] Error at end: Expect '}' after block. +fun f() 123; diff --git a/interpreter/tests/lox/function/empty_body.lox b/interpreter/tests/lox/function/empty_body.lox new file mode 100644 index 0000000..7d732e1 --- /dev/null +++ b/interpreter/tests/lox/function/empty_body.lox @@ -0,0 +1,2 @@ +fun f() {} +print f(); // expect: nil diff --git a/interpreter/tests/lox/function/extra_arguments.lox b/interpreter/tests/lox/function/extra_arguments.lox new file mode 100644 index 0000000..350ac63 --- /dev/null +++ b/interpreter/tests/lox/function/extra_arguments.lox @@ -0,0 +1,6 @@ +fun f(a, b) { + print a; + print b; +} + +f(1, 2, 3, 4); // expect runtime error: Expected 2 arguments but got 4. diff --git a/interpreter/tests/lox/function/local_mutual_recursion.lox b/interpreter/tests/lox/function/local_mutual_recursion.lox new file mode 100644 index 0000000..2cd6c47 --- /dev/null +++ b/interpreter/tests/lox/function/local_mutual_recursion.lox @@ -0,0 +1,13 @@ +{ + fun isEven(n) { + if (n == 0) return true; + return isOdd(n - 1); // expect runtime error: Undefined variable 'isOdd'. + } + + fun isOdd(n) { + if (n == 0) return false; + return isEven(n - 1); + } + + isEven(4); +} \ No newline at end of file diff --git a/interpreter/tests/lox/function/local_recursion.lox b/interpreter/tests/lox/function/local_recursion.lox new file mode 100644 index 0000000..7b02898 --- /dev/null +++ b/interpreter/tests/lox/function/local_recursion.lox @@ -0,0 +1,8 @@ +{ + fun fib(n) { + if (n < 2) return n; + return fib(n - 1) + fib(n - 2); + } + + print fib(8); // expect: 21 +} diff --git a/interpreter/tests/lox/function/missing_arguments.lox b/interpreter/tests/lox/function/missing_arguments.lox new file mode 100644 index 0000000..2acee00 --- /dev/null +++ b/interpreter/tests/lox/function/missing_arguments.lox @@ -0,0 +1,3 @@ +fun f(a, b) {} + +f(1); // expect runtime error: Expected 2 arguments but got 1. diff --git a/interpreter/tests/lox/function/missing_comma_in_parameters.lox b/interpreter/tests/lox/function/missing_comma_in_parameters.lox new file mode 100644 index 0000000..eeb2d49 --- /dev/null +++ b/interpreter/tests/lox/function/missing_comma_in_parameters.lox @@ -0,0 +1,3 @@ +// [line 3] Error at 'c': Expect ')' after parameters. +// [c line 4] Error at end: Expect '}' after block. +fun foo(a, b c, d, e, f) {} diff --git a/interpreter/tests/lox/function/mutual_recursion.lox b/interpreter/tests/lox/function/mutual_recursion.lox new file mode 100644 index 0000000..a5ff5c4 --- /dev/null +++ b/interpreter/tests/lox/function/mutual_recursion.lox @@ -0,0 +1,12 @@ +fun isEven(n) { + if (n == 0) return true; + return isOdd(n - 1); +} + +fun isOdd(n) { + if (n == 0) return false; + return isEven(n - 1); +} + +print isEven(4); // expect: true +print isOdd(3); // expect: true diff --git a/interpreter/tests/lox/function/nested_call_with_arguments.lox b/interpreter/tests/lox/function/nested_call_with_arguments.lox new file mode 100644 index 0000000..efa607d --- /dev/null +++ b/interpreter/tests/lox/function/nested_call_with_arguments.lox @@ -0,0 +1,13 @@ +fun returnArg(arg) { + return arg; +} + +fun returnFunCallWithArg(func, arg) { + return returnArg(func)(arg); +} + +fun printArg(arg) { + print arg; +} + +returnFunCallWithArg(printArg, "hello world"); // expect: hello world diff --git a/interpreter/tests/lox/function/parameters.lox b/interpreter/tests/lox/function/parameters.lox new file mode 100644 index 0000000..8f5f2bd --- /dev/null +++ b/interpreter/tests/lox/function/parameters.lox @@ -0,0 +1,26 @@ +fun f0() { return 0; } +print f0(); // expect: 0 + +fun f1(a) { return a; } +print f1(1); // expect: 1 + +fun f2(a, b) { return a + b; } +print f2(1, 2); // expect: 3 + +fun f3(a, b, c) { return a + b + c; } +print f3(1, 2, 3); // expect: 6 + +fun f4(a, b, c, d) { return a + b + c + d; } +print f4(1, 2, 3, 4); // expect: 10 + +fun f5(a, b, c, d, e) { return a + b + c + d + e; } +print f5(1, 2, 3, 4, 5); // expect: 15 + +fun f6(a, b, c, d, e, f) { return a + b + c + d + e + f; } +print f6(1, 2, 3, 4, 5, 6); // expect: 21 + +fun f7(a, b, c, d, e, f, g) { return a + b + c + d + e + f + g; } +print f7(1, 2, 3, 4, 5, 6, 7); // expect: 28 + +fun f8(a, b, c, d, e, f, g, h) { return a + b + c + d + e + f + g + h; } +print f8(1, 2, 3, 4, 5, 6, 7, 8); // expect: 36 diff --git a/interpreter/tests/lox/function/print.lox b/interpreter/tests/lox/function/print.lox new file mode 100644 index 0000000..3ecd86a --- /dev/null +++ b/interpreter/tests/lox/function/print.lox @@ -0,0 +1,4 @@ +fun foo() {} +print foo; // expect: + +print clock; // expect: diff --git a/interpreter/tests/lox/function/recursion.lox b/interpreter/tests/lox/function/recursion.lox new file mode 100644 index 0000000..56d3fbb --- /dev/null +++ b/interpreter/tests/lox/function/recursion.lox @@ -0,0 +1,6 @@ +fun fib(n) { + if (n < 2) return n; + return fib(n - 1) + fib(n - 2); +} + +print fib(8); // expect: 21 diff --git a/interpreter/tests/lox/function/too_many_arguments.lox b/interpreter/tests/lox/function/too_many_arguments.lox new file mode 100644 index 0000000..9b21b86 --- /dev/null +++ b/interpreter/tests/lox/function/too_many_arguments.lox @@ -0,0 +1,261 @@ +fun foo() {} +{ + var a = 1; + foo( + a, // 1 + a, // 2 + a, // 3 + a, // 4 + a, // 5 + a, // 6 + a, // 7 + a, // 8 + a, // 9 + a, // 10 + a, // 11 + a, // 12 + a, // 13 + a, // 14 + a, // 15 + a, // 16 + a, // 17 + a, // 18 + a, // 19 + a, // 20 + a, // 21 + a, // 22 + a, // 23 + a, // 24 + a, // 25 + a, // 26 + a, // 27 + a, // 28 + a, // 29 + a, // 30 + a, // 31 + a, // 32 + a, // 33 + a, // 34 + a, // 35 + a, // 36 + a, // 37 + a, // 38 + a, // 39 + a, // 40 + a, // 41 + a, // 42 + a, // 43 + a, // 44 + a, // 45 + a, // 46 + a, // 47 + a, // 48 + a, // 49 + a, // 50 + a, // 51 + a, // 52 + a, // 53 + a, // 54 + a, // 55 + a, // 56 + a, // 57 + a, // 58 + a, // 59 + a, // 60 + a, // 61 + a, // 62 + a, // 63 + a, // 64 + a, // 65 + a, // 66 + a, // 67 + a, // 68 + a, // 69 + a, // 70 + a, // 71 + a, // 72 + a, // 73 + a, // 74 + a, // 75 + a, // 76 + a, // 77 + a, // 78 + a, // 79 + a, // 80 + a, // 81 + a, // 82 + a, // 83 + a, // 84 + a, // 85 + a, // 86 + a, // 87 + a, // 88 + a, // 89 + a, // 90 + a, // 91 + a, // 92 + a, // 93 + a, // 94 + a, // 95 + a, // 96 + a, // 97 + a, // 98 + a, // 99 + a, // 100 + a, // 101 + a, // 102 + a, // 103 + a, // 104 + a, // 105 + a, // 106 + a, // 107 + a, // 108 + a, // 109 + a, // 110 + a, // 111 + a, // 112 + a, // 113 + a, // 114 + a, // 115 + a, // 116 + a, // 117 + a, // 118 + a, // 119 + a, // 120 + a, // 121 + a, // 122 + a, // 123 + a, // 124 + a, // 125 + a, // 126 + a, // 127 + a, // 128 + a, // 129 + a, // 130 + a, // 131 + a, // 132 + a, // 133 + a, // 134 + a, // 135 + a, // 136 + a, // 137 + a, // 138 + a, // 139 + a, // 140 + a, // 141 + a, // 142 + a, // 143 + a, // 144 + a, // 145 + a, // 146 + a, // 147 + a, // 148 + a, // 149 + a, // 150 + a, // 151 + a, // 152 + a, // 153 + a, // 154 + a, // 155 + a, // 156 + a, // 157 + a, // 158 + a, // 159 + a, // 160 + a, // 161 + a, // 162 + a, // 163 + a, // 164 + a, // 165 + a, // 166 + a, // 167 + a, // 168 + a, // 169 + a, // 170 + a, // 171 + a, // 172 + a, // 173 + a, // 174 + a, // 175 + a, // 176 + a, // 177 + a, // 178 + a, // 179 + a, // 180 + a, // 181 + a, // 182 + a, // 183 + a, // 184 + a, // 185 + a, // 186 + a, // 187 + a, // 188 + a, // 189 + a, // 190 + a, // 191 + a, // 192 + a, // 193 + a, // 194 + a, // 195 + a, // 196 + a, // 197 + a, // 198 + a, // 199 + a, // 200 + a, // 201 + a, // 202 + a, // 203 + a, // 204 + a, // 205 + a, // 206 + a, // 207 + a, // 208 + a, // 209 + a, // 210 + a, // 211 + a, // 212 + a, // 213 + a, // 214 + a, // 215 + a, // 216 + a, // 217 + a, // 218 + a, // 219 + a, // 220 + a, // 221 + a, // 222 + a, // 223 + a, // 224 + a, // 225 + a, // 226 + a, // 227 + a, // 228 + a, // 229 + a, // 230 + a, // 231 + a, // 232 + a, // 233 + a, // 234 + a, // 235 + a, // 236 + a, // 237 + a, // 238 + a, // 239 + a, // 240 + a, // 241 + a, // 242 + a, // 243 + a, // 244 + a, // 245 + a, // 246 + a, // 247 + a, // 248 + a, // 249 + a, // 250 + a, // 251 + a, // 252 + a, // 253 + a, // 254 + a, // 255 + a); // Error at 'a': Can't have more than 255 arguments. +} diff --git a/interpreter/tests/lox/function/too_many_parameters.lox b/interpreter/tests/lox/function/too_many_parameters.lox new file mode 100644 index 0000000..869767b --- /dev/null +++ b/interpreter/tests/lox/function/too_many_parameters.lox @@ -0,0 +1,257 @@ +// 256 parameters. +fun f( + a1, + a2, + a3, + a4, + a5, + a6, + a7, + a8, + a9, + a10, + a11, + a12, + a13, + a14, + a15, + a16, + a17, + a18, + a19, + a20, + a21, + a22, + a23, + a24, + a25, + a26, + a27, + a28, + a29, + a30, + a31, + a32, + a33, + a34, + a35, + a36, + a37, + a38, + a39, + a40, + a41, + a42, + a43, + a44, + a45, + a46, + a47, + a48, + a49, + a50, + a51, + a52, + a53, + a54, + a55, + a56, + a57, + a58, + a59, + a60, + a61, + a62, + a63, + a64, + a65, + a66, + a67, + a68, + a69, + a70, + a71, + a72, + a73, + a74, + a75, + a76, + a77, + a78, + a79, + a80, + a81, + a82, + a83, + a84, + a85, + a86, + a87, + a88, + a89, + a90, + a91, + a92, + a93, + a94, + a95, + a96, + a97, + a98, + a99, + a100, + a101, + a102, + a103, + a104, + a105, + a106, + a107, + a108, + a109, + a110, + a111, + a112, + a113, + a114, + a115, + a116, + a117, + a118, + a119, + a120, + a121, + a122, + a123, + a124, + a125, + a126, + a127, + a128, + a129, + a130, + a131, + a132, + a133, + a134, + a135, + a136, + a137, + a138, + a139, + a140, + a141, + a142, + a143, + a144, + a145, + a146, + a147, + a148, + a149, + a150, + a151, + a152, + a153, + a154, + a155, + a156, + a157, + a158, + a159, + a160, + a161, + a162, + a163, + a164, + a165, + a166, + a167, + a168, + a169, + a170, + a171, + a172, + a173, + a174, + a175, + a176, + a177, + a178, + a179, + a180, + a181, + a182, + a183, + a184, + a185, + a186, + a187, + a188, + a189, + a190, + a191, + a192, + a193, + a194, + a195, + a196, + a197, + a198, + a199, + a200, + a201, + a202, + a203, + a204, + a205, + a206, + a207, + a208, + a209, + a210, + a211, + a212, + a213, + a214, + a215, + a216, + a217, + a218, + a219, + a220, + a221, + a222, + a223, + a224, + a225, + a226, + a227, + a228, + a229, + a230, + a231, + a232, + a233, + a234, + a235, + a236, + a237, + a238, + a239, + a240, + a241, + a242, + a243, + a244, + a245, + a246, + a247, + a248, + a249, + a250, + a251, + a252, + a253, + a254, + a255, a) {} // Error at 'a': Can't have more than 255 parameters. diff --git a/interpreter/tests/lox/if/class_in_else.lox b/interpreter/tests/lox/if/class_in_else.lox new file mode 100644 index 0000000..8308434 --- /dev/null +++ b/interpreter/tests/lox/if/class_in_else.lox @@ -0,0 +1,2 @@ +// [line 2] Error at 'class': Expect expression. +if (true) "ok"; else class Foo {} diff --git a/interpreter/tests/lox/if/class_in_then.lox b/interpreter/tests/lox/if/class_in_then.lox new file mode 100644 index 0000000..f59f471 --- /dev/null +++ b/interpreter/tests/lox/if/class_in_then.lox @@ -0,0 +1,2 @@ +// [line 2] Error at 'class': Expect expression. +if (true) class Foo {} diff --git a/interpreter/tests/lox/if/dangling_else.lox b/interpreter/tests/lox/if/dangling_else.lox new file mode 100644 index 0000000..05e99d6 --- /dev/null +++ b/interpreter/tests/lox/if/dangling_else.lox @@ -0,0 +1,3 @@ +// A dangling else binds to the right-most if. +if (true) if (false) print "bad"; else print "good"; // expect: good +if (false) if (true) print "bad"; else print "bad"; diff --git a/interpreter/tests/lox/if/else.lox b/interpreter/tests/lox/if/else.lox new file mode 100644 index 0000000..326e1c5 --- /dev/null +++ b/interpreter/tests/lox/if/else.lox @@ -0,0 +1,6 @@ +// Evaluate the 'else' expression if the condition is false. +if (true) print "good"; else print "bad"; // expect: good +if (false) print "bad"; else print "good"; // expect: good + +// Allow block body. +if (false) nil; else { print "block"; } // expect: block diff --git a/interpreter/tests/lox/if/fun_in_else.lox b/interpreter/tests/lox/if/fun_in_else.lox new file mode 100644 index 0000000..694d1e8 --- /dev/null +++ b/interpreter/tests/lox/if/fun_in_else.lox @@ -0,0 +1,2 @@ +// [line 2] Error at 'fun': Expect expression. +if (true) "ok"; else fun foo() {} diff --git a/interpreter/tests/lox/if/fun_in_then.lox b/interpreter/tests/lox/if/fun_in_then.lox new file mode 100644 index 0000000..75421d8 --- /dev/null +++ b/interpreter/tests/lox/if/fun_in_then.lox @@ -0,0 +1,2 @@ +// [line 2] Error at 'fun': Expect expression. +if (true) fun foo() {} diff --git a/interpreter/tests/lox/if/if.lox b/interpreter/tests/lox/if/if.lox new file mode 100644 index 0000000..7f46c98 --- /dev/null +++ b/interpreter/tests/lox/if/if.lox @@ -0,0 +1,10 @@ +// Evaluate the 'then' expression if the condition is true. +if (true) print "good"; // expect: good +if (false) print "bad"; + +// Allow block body. +if (true) { print "block"; } // expect: block + +// Assignment in if condition. +var a = false; +if (a = true) print a; // expect: true diff --git a/interpreter/tests/lox/if/truth.lox b/interpreter/tests/lox/if/truth.lox new file mode 100644 index 0000000..97d302a --- /dev/null +++ b/interpreter/tests/lox/if/truth.lox @@ -0,0 +1,8 @@ +// False and nil are false. +if (false) print "bad"; else print "false"; // expect: false +if (nil) print "bad"; else print "nil"; // expect: nil + +// Everything else is true. +if (true) print true; // expect: true +if (0) print 0; // expect: 0 +if ("") print "empty"; // expect: empty diff --git a/interpreter/tests/lox/if/var_in_else.lox b/interpreter/tests/lox/if/var_in_else.lox new file mode 100644 index 0000000..59cff3d --- /dev/null +++ b/interpreter/tests/lox/if/var_in_else.lox @@ -0,0 +1,2 @@ +// [line 2] Error at 'var': Expect expression. +if (true) "ok"; else var foo; diff --git a/interpreter/tests/lox/if/var_in_then.lox b/interpreter/tests/lox/if/var_in_then.lox new file mode 100644 index 0000000..a8b111b --- /dev/null +++ b/interpreter/tests/lox/if/var_in_then.lox @@ -0,0 +1,2 @@ +// [line 2] Error at 'var': Expect expression. +if (true) var foo; diff --git a/interpreter/tests/lox/inheritance/constructor.lox b/interpreter/tests/lox/inheritance/constructor.lox new file mode 100644 index 0000000..16df18d --- /dev/null +++ b/interpreter/tests/lox/inheritance/constructor.lox @@ -0,0 +1,14 @@ +class A { + init(param) { + this.field = param; + } + + test() { + print this.field; + } +} + +class B < A {} + +var b = B("value"); +b.test(); // expect: value diff --git a/interpreter/tests/lox/inheritance/inherit_from_function.lox b/interpreter/tests/lox/inheritance/inherit_from_function.lox new file mode 100644 index 0000000..0d3ce48 --- /dev/null +++ b/interpreter/tests/lox/inheritance/inherit_from_function.lox @@ -0,0 +1,3 @@ +fun foo() {} + +class Subclass < foo {} // expect runtime error: Superclass must be a class. diff --git a/interpreter/tests/lox/inheritance/inherit_from_nil.lox b/interpreter/tests/lox/inheritance/inherit_from_nil.lox new file mode 100644 index 0000000..72cf8ed --- /dev/null +++ b/interpreter/tests/lox/inheritance/inherit_from_nil.lox @@ -0,0 +1,2 @@ +var Nil = nil; +class Foo < Nil {} // expect runtime error: Superclass must be a class. diff --git a/interpreter/tests/lox/inheritance/inherit_from_number.lox b/interpreter/tests/lox/inheritance/inherit_from_number.lox new file mode 100644 index 0000000..ab1539a --- /dev/null +++ b/interpreter/tests/lox/inheritance/inherit_from_number.lox @@ -0,0 +1,2 @@ +var Number = 123; +class Foo < Number {} // expect runtime error: Superclass must be a class. diff --git a/interpreter/tests/lox/inheritance/inherit_methods.lox b/interpreter/tests/lox/inheritance/inherit_methods.lox new file mode 100644 index 0000000..e11ccc1 --- /dev/null +++ b/interpreter/tests/lox/inheritance/inherit_methods.lox @@ -0,0 +1,14 @@ +class Foo { + methodOnFoo() { print "foo"; } + override() { print "foo"; } +} + +class Bar < Foo { + methodOnBar() { print "bar"; } + override() { print "bar"; } +} + +var bar = Bar(); +bar.methodOnFoo(); // expect: foo +bar.methodOnBar(); // expect: bar +bar.override(); // expect: bar diff --git a/interpreter/tests/lox/inheritance/parenthesized_superclass.lox b/interpreter/tests/lox/inheritance/parenthesized_superclass.lox new file mode 100644 index 0000000..4b59836 --- /dev/null +++ b/interpreter/tests/lox/inheritance/parenthesized_superclass.lox @@ -0,0 +1,4 @@ +class Foo {} + +// [line 4] Error at '(': Expect superclass name. +class Bar < (Foo) {} diff --git a/interpreter/tests/lox/inheritance/set_fields_from_base_class.lox b/interpreter/tests/lox/inheritance/set_fields_from_base_class.lox new file mode 100644 index 0000000..de02bdd --- /dev/null +++ b/interpreter/tests/lox/inheritance/set_fields_from_base_class.lox @@ -0,0 +1,38 @@ +class Foo { + foo(a, b) { + this.field1 = a; + this.field2 = b; + } + + fooPrint() { + print this.field1; + print this.field2; + } +} + +class Bar < Foo { + bar(a, b) { + this.field1 = a; + this.field2 = b; + } + + barPrint() { + print this.field1; + print this.field2; + } +} + +var bar = Bar(); +bar.foo("foo 1", "foo 2"); +bar.fooPrint(); +// expect: foo 1 +// expect: foo 2 + +bar.bar("bar 1", "bar 2"); +bar.barPrint(); +// expect: bar 1 +// expect: bar 2 + +bar.fooPrint(); +// expect: bar 1 +// expect: bar 2 diff --git a/interpreter/tests/lox/limit/loop_too_large.lox b/interpreter/tests/lox/limit/loop_too_large.lox new file mode 100644 index 0000000..79d696c --- /dev/null +++ b/interpreter/tests/lox/limit/loop_too_large.lox @@ -0,0 +1,2351 @@ +var a = 0; +while (false) { + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; + nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; nil; +} // Error at '}': Loop body too large. diff --git a/interpreter/tests/lox/limit/no_reuse_constants.lox b/interpreter/tests/lox/limit/no_reuse_constants.lox new file mode 100644 index 0000000..0742ac0 --- /dev/null +++ b/interpreter/tests/lox/limit/no_reuse_constants.lox @@ -0,0 +1,36 @@ +fun f() { + 0; 1; 2; 3; 4; 5; 6; 7; + 8; 9; 10; 11; 12; 13; 14; 15; + 16; 17; 18; 19; 20; 21; 22; 23; + 24; 25; 26; 27; 28; 29; 30; 31; + 32; 33; 34; 35; 36; 37; 38; 39; + 40; 41; 42; 43; 44; 45; 46; 47; + 48; 49; 50; 51; 52; 53; 54; 55; + 56; 57; 58; 59; 60; 61; 62; 63; + 64; 65; 66; 67; 68; 69; 70; 71; + 72; 73; 74; 75; 76; 77; 78; 79; + 80; 81; 82; 83; 84; 85; 86; 87; + 88; 89; 90; 91; 92; 93; 94; 95; + 96; 97; 98; 99; 100; 101; 102; 103; + 104; 105; 106; 107; 108; 109; 110; 111; + 112; 113; 114; 115; 116; 117; 118; 119; + 120; 121; 122; 123; 124; 125; 126; 127; + 128; 129; 130; 131; 132; 133; 134; 135; + 136; 137; 138; 139; 140; 141; 142; 143; + 144; 145; 146; 147; 148; 149; 150; 151; + 152; 153; 154; 155; 156; 157; 158; 159; + 160; 161; 162; 163; 164; 165; 166; 167; + 168; 169; 170; 171; 172; 173; 174; 175; + 176; 177; 178; 179; 180; 181; 182; 183; + 184; 185; 186; 187; 188; 189; 190; 191; + 192; 193; 194; 195; 196; 197; 198; 199; + 200; 201; 202; 203; 204; 205; 206; 207; + 208; 209; 210; 211; 212; 213; 214; 215; + 216; 217; 218; 219; 220; 221; 222; 223; + 224; 225; 226; 227; 228; 229; 230; 231; + 232; 233; 234; 235; 236; 237; 238; 239; + 240; 241; 242; 243; 244; 245; 246; 247; + 248; 249; 250; 251; 252; 253; 254; 255; + + 1; // Error at '1': Too many constants in one chunk. +} diff --git a/interpreter/tests/lox/limit/stack_overflow.lox b/interpreter/tests/lox/limit/stack_overflow.lox new file mode 100644 index 0000000..e98284b --- /dev/null +++ b/interpreter/tests/lox/limit/stack_overflow.lox @@ -0,0 +1,21 @@ +fun foo() { + var a1; + var a2; + var a3; + var a4; + var a5; + var a6; + var a7; + var a8; + var a9; + var a10; + var a11; + var a12; + var a13; + var a14; + var a15; + var a16; + foo(); // expect runtime error: Stack overflow. +} + +foo(); diff --git a/interpreter/tests/lox/limit/too_many_constants.lox b/interpreter/tests/lox/limit/too_many_constants.lox new file mode 100644 index 0000000..df73c80 --- /dev/null +++ b/interpreter/tests/lox/limit/too_many_constants.lox @@ -0,0 +1,36 @@ +fun f() { + 0; 1; 2; 3; 4; 5; 6; 7; + 8; 9; 10; 11; 12; 13; 14; 15; + 16; 17; 18; 19; 20; 21; 22; 23; + 24; 25; 26; 27; 28; 29; 30; 31; + 32; 33; 34; 35; 36; 37; 38; 39; + 40; 41; 42; 43; 44; 45; 46; 47; + 48; 49; 50; 51; 52; 53; 54; 55; + 56; 57; 58; 59; 60; 61; 62; 63; + 64; 65; 66; 67; 68; 69; 70; 71; + 72; 73; 74; 75; 76; 77; 78; 79; + 80; 81; 82; 83; 84; 85; 86; 87; + 88; 89; 90; 91; 92; 93; 94; 95; + 96; 97; 98; 99; 100; 101; 102; 103; + 104; 105; 106; 107; 108; 109; 110; 111; + 112; 113; 114; 115; 116; 117; 118; 119; + 120; 121; 122; 123; 124; 125; 126; 127; + 128; 129; 130; 131; 132; 133; 134; 135; + 136; 137; 138; 139; 140; 141; 142; 143; + 144; 145; 146; 147; 148; 149; 150; 151; + 152; 153; 154; 155; 156; 157; 158; 159; + 160; 161; 162; 163; 164; 165; 166; 167; + 168; 169; 170; 171; 172; 173; 174; 175; + 176; 177; 178; 179; 180; 181; 182; 183; + 184; 185; 186; 187; 188; 189; 190; 191; + 192; 193; 194; 195; 196; 197; 198; 199; + 200; 201; 202; 203; 204; 205; 206; 207; + 208; 209; 210; 211; 212; 213; 214; 215; + 216; 217; 218; 219; 220; 221; 222; 223; + 224; 225; 226; 227; 228; 229; 230; 231; + 232; 233; 234; 235; 236; 237; 238; 239; + 240; 241; 242; 243; 244; 245; 246; 247; + 248; 249; 250; 251; 252; 253; 254; 255; + + "oops"; // Error at '"oops"': Too many constants in one chunk. +} diff --git a/interpreter/tests/lox/limit/too_many_locals.lox b/interpreter/tests/lox/limit/too_many_locals.lox new file mode 100644 index 0000000..fdf5482 --- /dev/null +++ b/interpreter/tests/lox/limit/too_many_locals.lox @@ -0,0 +1,53 @@ +fun f() { + // var v00; First slot already taken. + + var v01; var v02; var v03; var v04; var v05; var v06; var v07; + var v08; var v09; var v0a; var v0b; var v0c; var v0d; var v0e; var v0f; + + var v10; var v11; var v12; var v13; var v14; var v15; var v16; var v17; + var v18; var v19; var v1a; var v1b; var v1c; var v1d; var v1e; var v1f; + + var v20; var v21; var v22; var v23; var v24; var v25; var v26; var v27; + var v28; var v29; var v2a; var v2b; var v2c; var v2d; var v2e; var v2f; + + var v30; var v31; var v32; var v33; var v34; var v35; var v36; var v37; + var v38; var v39; var v3a; var v3b; var v3c; var v3d; var v3e; var v3f; + + var v40; var v41; var v42; var v43; var v44; var v45; var v46; var v47; + var v48; var v49; var v4a; var v4b; var v4c; var v4d; var v4e; var v4f; + + var v50; var v51; var v52; var v53; var v54; var v55; var v56; var v57; + var v58; var v59; var v5a; var v5b; var v5c; var v5d; var v5e; var v5f; + + var v60; var v61; var v62; var v63; var v64; var v65; var v66; var v67; + var v68; var v69; var v6a; var v6b; var v6c; var v6d; var v6e; var v6f; + + var v70; var v71; var v72; var v73; var v74; var v75; var v76; var v77; + var v78; var v79; var v7a; var v7b; var v7c; var v7d; var v7e; var v7f; + + var v80; var v81; var v82; var v83; var v84; var v85; var v86; var v87; + var v88; var v89; var v8a; var v8b; var v8c; var v8d; var v8e; var v8f; + + var v90; var v91; var v92; var v93; var v94; var v95; var v96; var v97; + var v98; var v99; var v9a; var v9b; var v9c; var v9d; var v9e; var v9f; + + var va0; var va1; var va2; var va3; var va4; var va5; var va6; var va7; + var va8; var va9; var vaa; var vab; var vac; var vad; var vae; var vaf; + + var vb0; var vb1; var vb2; var vb3; var vb4; var vb5; var vb6; var vb7; + var vb8; var vb9; var vba; var vbb; var vbc; var vbd; var vbe; var vbf; + + var vc0; var vc1; var vc2; var vc3; var vc4; var vc5; var vc6; var vc7; + var vc8; var vc9; var vca; var vcb; var vcc; var vcd; var vce; var vcf; + + var vd0; var vd1; var vd2; var vd3; var vd4; var vd5; var vd6; var vd7; + var vd8; var vd9; var vda; var vdb; var vdc; var vdd; var vde; var vdf; + + var ve0; var ve1; var ve2; var ve3; var ve4; var ve5; var ve6; var ve7; + var ve8; var ve9; var vea; var veb; var vec; var ved; var vee; var vef; + + var vf0; var vf1; var vf2; var vf3; var vf4; var vf5; var vf6; var vf7; + var vf8; var vf9; var vfa; var vfb; var vfc; var vfd; var vfe; var vff; + + var oops; // Error at 'oops': Too many local variables in function. +} diff --git a/interpreter/tests/lox/limit/too_many_upvalues.lox b/interpreter/tests/lox/limit/too_many_upvalues.lox new file mode 100644 index 0000000..325448c --- /dev/null +++ b/interpreter/tests/lox/limit/too_many_upvalues.lox @@ -0,0 +1,105 @@ +fun f() { + var v00; var v01; var v02; var v03; var v04; var v05; var v06; var v07; + var v08; var v09; var v0a; var v0b; var v0c; var v0d; var v0e; var v0f; + + var v10; var v11; var v12; var v13; var v14; var v15; var v16; var v17; + var v18; var v19; var v1a; var v1b; var v1c; var v1d; var v1e; var v1f; + + var v20; var v21; var v22; var v23; var v24; var v25; var v26; var v27; + var v28; var v29; var v2a; var v2b; var v2c; var v2d; var v2e; var v2f; + + var v30; var v31; var v32; var v33; var v34; var v35; var v36; var v37; + var v38; var v39; var v3a; var v3b; var v3c; var v3d; var v3e; var v3f; + + var v40; var v41; var v42; var v43; var v44; var v45; var v46; var v47; + var v48; var v49; var v4a; var v4b; var v4c; var v4d; var v4e; var v4f; + + var v50; var v51; var v52; var v53; var v54; var v55; var v56; var v57; + var v58; var v59; var v5a; var v5b; var v5c; var v5d; var v5e; var v5f; + + var v60; var v61; var v62; var v63; var v64; var v65; var v66; var v67; + var v68; var v69; var v6a; var v6b; var v6c; var v6d; var v6e; var v6f; + + var v70; var v71; var v72; var v73; var v74; var v75; var v76; var v77; + var v78; var v79; var v7a; var v7b; var v7c; var v7d; var v7e; var v7f; + + fun g() { + var v80; var v81; var v82; var v83; var v84; var v85; var v86; var v87; + var v88; var v89; var v8a; var v8b; var v8c; var v8d; var v8e; var v8f; + + var v90; var v91; var v92; var v93; var v94; var v95; var v96; var v97; + var v98; var v99; var v9a; var v9b; var v9c; var v9d; var v9e; var v9f; + + var va0; var va1; var va2; var va3; var va4; var va5; var va6; var va7; + var va8; var va9; var vaa; var vab; var vac; var vad; var vae; var vaf; + + var vb0; var vb1; var vb2; var vb3; var vb4; var vb5; var vb6; var vb7; + var vb8; var vb9; var vba; var vbb; var vbc; var vbd; var vbe; var vbf; + + var vc0; var vc1; var vc2; var vc3; var vc4; var vc5; var vc6; var vc7; + var vc8; var vc9; var vca; var vcb; var vcc; var vcd; var vce; var vcf; + + var vd0; var vd1; var vd2; var vd3; var vd4; var vd5; var vd6; var vd7; + var vd8; var vd9; var vda; var vdb; var vdc; var vdd; var vde; var vdf; + + var ve0; var ve1; var ve2; var ve3; var ve4; var ve5; var ve6; var ve7; + var ve8; var ve9; var vea; var veb; var vec; var ved; var vee; var vef; + + var vf0; var vf1; var vf2; var vf3; var vf4; var vf5; var vf6; var vf7; + var vf8; var vf9; var vfa; var vfb; var vfc; var vfd; var vfe; var vff; + + var oops; + + fun h() { + v00; v01; v02; v03; v04; v05; v06; v07; + v08; v09; v0a; v0b; v0c; v0d; v0e; v0f; + + v10; v11; v12; v13; v14; v15; v16; v17; + v18; v19; v1a; v1b; v1c; v1d; v1e; v1f; + + v20; v21; v22; v23; v24; v25; v26; v27; + v28; v29; v2a; v2b; v2c; v2d; v2e; v2f; + + v30; v31; v32; v33; v34; v35; v36; v37; + v38; v39; v3a; v3b; v3c; v3d; v3e; v3f; + + v40; v41; v42; v43; v44; v45; v46; v47; + v48; v49; v4a; v4b; v4c; v4d; v4e; v4f; + + v50; v51; v52; v53; v54; v55; v56; v57; + v58; v59; v5a; v5b; v5c; v5d; v5e; v5f; + + v60; v61; v62; v63; v64; v65; v66; v67; + v68; v69; v6a; v6b; v6c; v6d; v6e; v6f; + + v70; v71; v72; v73; v74; v75; v76; v77; + v78; v79; v7a; v7b; v7c; v7d; v7e; v7f; + + v80; v81; v82; v83; v84; v85; v86; v87; + v88; v89; v8a; v8b; v8c; v8d; v8e; v8f; + + v90; v91; v92; v93; v94; v95; v96; v97; + v98; v99; v9a; v9b; v9c; v9d; v9e; v9f; + + va0; va1; va2; va3; va4; va5; va6; va7; + va8; va9; vaa; vab; vac; vad; vae; vaf; + + vb0; vb1; vb2; vb3; vb4; vb5; vb6; vb7; + vb8; vb9; vba; vbb; vbc; vbd; vbe; vbf; + + vc0; vc1; vc2; vc3; vc4; vc5; vc6; vc7; + vc8; vc9; vca; vcb; vcc; vcd; vce; vcf; + + vd0; vd1; vd2; vd3; vd4; vd5; vd6; vd7; + vd8; vd9; vda; vdb; vdc; vdd; vde; vdf; + + ve0; ve1; ve2; ve3; ve4; ve5; ve6; ve7; + ve8; ve9; vea; veb; vec; ved; vee; vef; + + vf0; vf1; vf2; vf3; vf4; vf5; vf6; vf7; + vf8; vf9; vfa; vfb; vfc; vfd; vfe; vff; + + oops; // Error at 'oops': Too many closure variables in function. + } + } +} diff --git a/interpreter/tests/lox/logical_operator/and.lox b/interpreter/tests/lox/logical_operator/and.lox new file mode 100644 index 0000000..9f2dc9a --- /dev/null +++ b/interpreter/tests/lox/logical_operator/and.lox @@ -0,0 +1,19 @@ +// Note: These tests implicitly depend on ints being truthy. + +// Return the first non-true argument. +print false and 1; // expect: false +print true and 1; // expect: 1 +print 1 and 2 and false; // expect: false + +// Return the last argument if all are true. +print 1 and true; // expect: true +print 1 and 2 and 3; // expect: 3 + +// Short-circuit at the first false argument. +var a = "before"; +var b = "before"; +(a = true) and + (b = false) and + (a = "bad"); +print a; // expect: true +print b; // expect: false diff --git a/interpreter/tests/lox/logical_operator/and_truth.lox b/interpreter/tests/lox/logical_operator/and_truth.lox new file mode 100644 index 0000000..dcb08cf --- /dev/null +++ b/interpreter/tests/lox/logical_operator/and_truth.lox @@ -0,0 +1,8 @@ +// False and nil are false. +print false and "bad"; // expect: false +print nil and "bad"; // expect: nil + +// Everything else is true. +print true and "ok"; // expect: ok +print 0 and "ok"; // expect: ok +print "" and "ok"; // expect: ok diff --git a/interpreter/tests/lox/logical_operator/or.lox b/interpreter/tests/lox/logical_operator/or.lox new file mode 100644 index 0000000..941eac4 --- /dev/null +++ b/interpreter/tests/lox/logical_operator/or.lox @@ -0,0 +1,19 @@ +// Note: These tests implicitly depend on ints being truthy. + +// Return the first true argument. +print 1 or true; // expect: 1 +print false or 1; // expect: 1 +print false or false or true; // expect: true + +// Return the last argument if all are false. +print false or false; // expect: false +print false or false or false; // expect: false + +// Short-circuit at the first true argument. +var a = "before"; +var b = "before"; +(a = false) or + (b = true) or + (a = "bad"); +print a; // expect: false +print b; // expect: true diff --git a/interpreter/tests/lox/logical_operator/or_truth.lox b/interpreter/tests/lox/logical_operator/or_truth.lox new file mode 100644 index 0000000..7ed1a8a --- /dev/null +++ b/interpreter/tests/lox/logical_operator/or_truth.lox @@ -0,0 +1,8 @@ +// False and nil are false. +print false or "ok"; // expect: ok +print nil or "ok"; // expect: ok + +// Everything else is true. +print true or "ok"; // expect: true +print 0 or "ok"; // expect: 0 +print "s" or "ok"; // expect: s diff --git a/interpreter/tests/lox/method/arity.lox b/interpreter/tests/lox/method/arity.lox new file mode 100644 index 0000000..594963e --- /dev/null +++ b/interpreter/tests/lox/method/arity.lox @@ -0,0 +1,22 @@ +class Foo { + method0() { return "no args"; } + method1(a) { return a; } + method2(a, b) { return a + b; } + method3(a, b, c) { return a + b + c; } + method4(a, b, c, d) { return a + b + c + d; } + method5(a, b, c, d, e) { return a + b + c + d + e; } + method6(a, b, c, d, e, f) { return a + b + c + d + e + f; } + method7(a, b, c, d, e, f, g) { return a + b + c + d + e + f + g; } + method8(a, b, c, d, e, f, g, h) { return a + b + c + d + e + f + g + h; } +} + +var foo = Foo(); +print foo.method0(); // expect: no args +print foo.method1(1); // expect: 1 +print foo.method2(1, 2); // expect: 3 +print foo.method3(1, 2, 3); // expect: 6 +print foo.method4(1, 2, 3, 4); // expect: 10 +print foo.method5(1, 2, 3, 4, 5); // expect: 15 +print foo.method6(1, 2, 3, 4, 5, 6); // expect: 21 +print foo.method7(1, 2, 3, 4, 5, 6, 7); // expect: 28 +print foo.method8(1, 2, 3, 4, 5, 6, 7, 8); // expect: 36 diff --git a/interpreter/tests/lox/method/empty_block.lox b/interpreter/tests/lox/method/empty_block.lox new file mode 100644 index 0000000..3825223 --- /dev/null +++ b/interpreter/tests/lox/method/empty_block.lox @@ -0,0 +1,5 @@ +class Foo { + bar() {} +} + +print Foo().bar(); // expect: nil diff --git a/interpreter/tests/lox/method/extra_arguments.lox b/interpreter/tests/lox/method/extra_arguments.lox new file mode 100644 index 0000000..76f3fab --- /dev/null +++ b/interpreter/tests/lox/method/extra_arguments.lox @@ -0,0 +1,8 @@ +class Foo { + method(a, b) { + print a; + print b; + } +} + +Foo().method(1, 2, 3, 4); // expect runtime error: Expected 2 arguments but got 4. diff --git a/interpreter/tests/lox/method/missing_arguments.lox b/interpreter/tests/lox/method/missing_arguments.lox new file mode 100644 index 0000000..734f455 --- /dev/null +++ b/interpreter/tests/lox/method/missing_arguments.lox @@ -0,0 +1,5 @@ +class Foo { + method(a, b) {} +} + +Foo().method(1); // expect runtime error: Expected 2 arguments but got 1. diff --git a/interpreter/tests/lox/method/not_found.lox b/interpreter/tests/lox/method/not_found.lox new file mode 100644 index 0000000..bbac99b --- /dev/null +++ b/interpreter/tests/lox/method/not_found.lox @@ -0,0 +1,3 @@ +class Foo {} + +Foo().unknown(); // expect runtime error: Undefined property 'unknown'. diff --git a/interpreter/tests/lox/method/print_bound_method.lox b/interpreter/tests/lox/method/print_bound_method.lox new file mode 100644 index 0000000..0ab5e72 --- /dev/null +++ b/interpreter/tests/lox/method/print_bound_method.lox @@ -0,0 +1,5 @@ +class Foo { + method() { } +} +var foo = Foo(); +print foo.method; // expect: diff --git a/interpreter/tests/lox/method/refer_to_name.lox b/interpreter/tests/lox/method/refer_to_name.lox new file mode 100644 index 0000000..df59d42 --- /dev/null +++ b/interpreter/tests/lox/method/refer_to_name.lox @@ -0,0 +1,7 @@ +class Foo { + method() { + print method; // expect runtime error: Undefined variable 'method'. + } +} + +Foo().method(); diff --git a/interpreter/tests/lox/method/too_many_arguments.lox b/interpreter/tests/lox/method/too_many_arguments.lox new file mode 100644 index 0000000..1777f72 --- /dev/null +++ b/interpreter/tests/lox/method/too_many_arguments.lox @@ -0,0 +1,260 @@ +{ + var a = 1; + true.method( + a, // 1 + a, // 2 + a, // 3 + a, // 4 + a, // 5 + a, // 6 + a, // 7 + a, // 8 + a, // 9 + a, // 10 + a, // 11 + a, // 12 + a, // 13 + a, // 14 + a, // 15 + a, // 16 + a, // 17 + a, // 18 + a, // 19 + a, // 20 + a, // 21 + a, // 22 + a, // 23 + a, // 24 + a, // 25 + a, // 26 + a, // 27 + a, // 28 + a, // 29 + a, // 30 + a, // 31 + a, // 32 + a, // 33 + a, // 34 + a, // 35 + a, // 36 + a, // 37 + a, // 38 + a, // 39 + a, // 40 + a, // 41 + a, // 42 + a, // 43 + a, // 44 + a, // 45 + a, // 46 + a, // 47 + a, // 48 + a, // 49 + a, // 50 + a, // 51 + a, // 52 + a, // 53 + a, // 54 + a, // 55 + a, // 56 + a, // 57 + a, // 58 + a, // 59 + a, // 60 + a, // 61 + a, // 62 + a, // 63 + a, // 64 + a, // 65 + a, // 66 + a, // 67 + a, // 68 + a, // 69 + a, // 70 + a, // 71 + a, // 72 + a, // 73 + a, // 74 + a, // 75 + a, // 76 + a, // 77 + a, // 78 + a, // 79 + a, // 80 + a, // 81 + a, // 82 + a, // 83 + a, // 84 + a, // 85 + a, // 86 + a, // 87 + a, // 88 + a, // 89 + a, // 90 + a, // 91 + a, // 92 + a, // 93 + a, // 94 + a, // 95 + a, // 96 + a, // 97 + a, // 98 + a, // 99 + a, // 100 + a, // 101 + a, // 102 + a, // 103 + a, // 104 + a, // 105 + a, // 106 + a, // 107 + a, // 108 + a, // 109 + a, // 110 + a, // 111 + a, // 112 + a, // 113 + a, // 114 + a, // 115 + a, // 116 + a, // 117 + a, // 118 + a, // 119 + a, // 120 + a, // 121 + a, // 122 + a, // 123 + a, // 124 + a, // 125 + a, // 126 + a, // 127 + a, // 128 + a, // 129 + a, // 130 + a, // 131 + a, // 132 + a, // 133 + a, // 134 + a, // 135 + a, // 136 + a, // 137 + a, // 138 + a, // 139 + a, // 140 + a, // 141 + a, // 142 + a, // 143 + a, // 144 + a, // 145 + a, // 146 + a, // 147 + a, // 148 + a, // 149 + a, // 150 + a, // 151 + a, // 152 + a, // 153 + a, // 154 + a, // 155 + a, // 156 + a, // 157 + a, // 158 + a, // 159 + a, // 160 + a, // 161 + a, // 162 + a, // 163 + a, // 164 + a, // 165 + a, // 166 + a, // 167 + a, // 168 + a, // 169 + a, // 170 + a, // 171 + a, // 172 + a, // 173 + a, // 174 + a, // 175 + a, // 176 + a, // 177 + a, // 178 + a, // 179 + a, // 180 + a, // 181 + a, // 182 + a, // 183 + a, // 184 + a, // 185 + a, // 186 + a, // 187 + a, // 188 + a, // 189 + a, // 190 + a, // 191 + a, // 192 + a, // 193 + a, // 194 + a, // 195 + a, // 196 + a, // 197 + a, // 198 + a, // 199 + a, // 200 + a, // 201 + a, // 202 + a, // 203 + a, // 204 + a, // 205 + a, // 206 + a, // 207 + a, // 208 + a, // 209 + a, // 210 + a, // 211 + a, // 212 + a, // 213 + a, // 214 + a, // 215 + a, // 216 + a, // 217 + a, // 218 + a, // 219 + a, // 220 + a, // 221 + a, // 222 + a, // 223 + a, // 224 + a, // 225 + a, // 226 + a, // 227 + a, // 228 + a, // 229 + a, // 230 + a, // 231 + a, // 232 + a, // 233 + a, // 234 + a, // 235 + a, // 236 + a, // 237 + a, // 238 + a, // 239 + a, // 240 + a, // 241 + a, // 242 + a, // 243 + a, // 244 + a, // 245 + a, // 246 + a, // 247 + a, // 248 + a, // 249 + a, // 250 + a, // 251 + a, // 252 + a, // 253 + a, // 254 + a, // 255 + a); // Error at 'a': Can't have more than 255 arguments. +} diff --git a/interpreter/tests/lox/method/too_many_parameters.lox b/interpreter/tests/lox/method/too_many_parameters.lox new file mode 100644 index 0000000..9e9b921 --- /dev/null +++ b/interpreter/tests/lox/method/too_many_parameters.lox @@ -0,0 +1,259 @@ +class Foo { + // 256 parameters. + method( + a1, + a2, + a3, + a4, + a5, + a6, + a7, + a8, + a9, + a10, + a11, + a12, + a13, + a14, + a15, + a16, + a17, + a18, + a19, + a20, + a21, + a22, + a23, + a24, + a25, + a26, + a27, + a28, + a29, + a30, + a31, + a32, + a33, + a34, + a35, + a36, + a37, + a38, + a39, + a40, + a41, + a42, + a43, + a44, + a45, + a46, + a47, + a48, + a49, + a50, + a51, + a52, + a53, + a54, + a55, + a56, + a57, + a58, + a59, + a60, + a61, + a62, + a63, + a64, + a65, + a66, + a67, + a68, + a69, + a70, + a71, + a72, + a73, + a74, + a75, + a76, + a77, + a78, + a79, + a80, + a81, + a82, + a83, + a84, + a85, + a86, + a87, + a88, + a89, + a90, + a91, + a92, + a93, + a94, + a95, + a96, + a97, + a98, + a99, + a100, + a101, + a102, + a103, + a104, + a105, + a106, + a107, + a108, + a109, + a110, + a111, + a112, + a113, + a114, + a115, + a116, + a117, + a118, + a119, + a120, + a121, + a122, + a123, + a124, + a125, + a126, + a127, + a128, + a129, + a130, + a131, + a132, + a133, + a134, + a135, + a136, + a137, + a138, + a139, + a140, + a141, + a142, + a143, + a144, + a145, + a146, + a147, + a148, + a149, + a150, + a151, + a152, + a153, + a154, + a155, + a156, + a157, + a158, + a159, + a160, + a161, + a162, + a163, + a164, + a165, + a166, + a167, + a168, + a169, + a170, + a171, + a172, + a173, + a174, + a175, + a176, + a177, + a178, + a179, + a180, + a181, + a182, + a183, + a184, + a185, + a186, + a187, + a188, + a189, + a190, + a191, + a192, + a193, + a194, + a195, + a196, + a197, + a198, + a199, + a200, + a201, + a202, + a203, + a204, + a205, + a206, + a207, + a208, + a209, + a210, + a211, + a212, + a213, + a214, + a215, + a216, + a217, + a218, + a219, + a220, + a221, + a222, + a223, + a224, + a225, + a226, + a227, + a228, + a229, + a230, + a231, + a232, + a233, + a234, + a235, + a236, + a237, + a238, + a239, + a240, + a241, + a242, + a243, + a244, + a245, + a246, + a247, + a248, + a249, + a250, + a251, + a252, + a253, + a254, + a255, a) {} // Error at 'a': Can't have more than 255 parameters. +} diff --git a/interpreter/tests/lox/nil/literal.lox b/interpreter/tests/lox/nil/literal.lox new file mode 100644 index 0000000..8546de9 --- /dev/null +++ b/interpreter/tests/lox/nil/literal.lox @@ -0,0 +1 @@ +print nil; // expect: nil diff --git a/interpreter/tests/lox/number/decimal_point_at_eof.lox b/interpreter/tests/lox/number/decimal_point_at_eof.lox new file mode 100644 index 0000000..9181925 --- /dev/null +++ b/interpreter/tests/lox/number/decimal_point_at_eof.lox @@ -0,0 +1,2 @@ +// [line 2] Error at end: Expect property name after '.'. +123. \ No newline at end of file diff --git a/interpreter/tests/lox/number/leading_dot.lox b/interpreter/tests/lox/number/leading_dot.lox new file mode 100644 index 0000000..93345a5 --- /dev/null +++ b/interpreter/tests/lox/number/leading_dot.lox @@ -0,0 +1,2 @@ +// [line 2] Error at '.': Expect expression. +.123; diff --git a/interpreter/tests/lox/number/literals.lox b/interpreter/tests/lox/number/literals.lox new file mode 100644 index 0000000..4fcdb4f --- /dev/null +++ b/interpreter/tests/lox/number/literals.lox @@ -0,0 +1,7 @@ +print 123; // expect: 123 +print 987654; // expect: 987654 +print 0; // expect: 0 +print -0; // expect: -0 + +print 123.456; // expect: 123.456 +print -0.001; // expect: -0.001 diff --git a/interpreter/tests/lox/number/nan_equality.lox b/interpreter/tests/lox/number/nan_equality.lox new file mode 100644 index 0000000..2807b65 --- /dev/null +++ b/interpreter/tests/lox/number/nan_equality.lox @@ -0,0 +1,8 @@ +var nan = 0/0; + +print nan == 0; // expect: false +print nan != 1; // expect: true + +// NaN is not equal to self. +print nan == nan; // expect: false +print nan != nan; // expect: true diff --git a/interpreter/tests/lox/number/trailing_dot.lox b/interpreter/tests/lox/number/trailing_dot.lox new file mode 100644 index 0000000..1af7dea --- /dev/null +++ b/interpreter/tests/lox/number/trailing_dot.lox @@ -0,0 +1,2 @@ +// [line 2] Error at ';': Expect property name after '.'. +123.; diff --git a/interpreter/tests/lox/operator/add.lox b/interpreter/tests/lox/operator/add.lox new file mode 100644 index 0000000..e28c5d4 --- /dev/null +++ b/interpreter/tests/lox/operator/add.lox @@ -0,0 +1,2 @@ +print 123 + 456; // expect: 579 +print "str" + "ing"; // expect: string diff --git a/interpreter/tests/lox/operator/add_bool_nil.lox b/interpreter/tests/lox/operator/add_bool_nil.lox new file mode 100644 index 0000000..6c4d7fd --- /dev/null +++ b/interpreter/tests/lox/operator/add_bool_nil.lox @@ -0,0 +1 @@ +true + nil; // expect runtime error: Operands must be two numbers or two strings. diff --git a/interpreter/tests/lox/operator/add_bool_num.lox b/interpreter/tests/lox/operator/add_bool_num.lox new file mode 100644 index 0000000..308245a --- /dev/null +++ b/interpreter/tests/lox/operator/add_bool_num.lox @@ -0,0 +1 @@ +true + 123; // expect runtime error: Operands must be two numbers or two strings. diff --git a/interpreter/tests/lox/operator/add_bool_string.lox b/interpreter/tests/lox/operator/add_bool_string.lox new file mode 100644 index 0000000..04739d5 --- /dev/null +++ b/interpreter/tests/lox/operator/add_bool_string.lox @@ -0,0 +1 @@ +true + "s"; // expect runtime error: Operands must be two numbers or two strings. diff --git a/interpreter/tests/lox/operator/add_nil_nil.lox b/interpreter/tests/lox/operator/add_nil_nil.lox new file mode 100644 index 0000000..b8371ab --- /dev/null +++ b/interpreter/tests/lox/operator/add_nil_nil.lox @@ -0,0 +1 @@ +nil + nil; // expect runtime error: Operands must be two numbers or two strings. diff --git a/interpreter/tests/lox/operator/add_num_nil.lox b/interpreter/tests/lox/operator/add_num_nil.lox new file mode 100644 index 0000000..1ce8fb7 --- /dev/null +++ b/interpreter/tests/lox/operator/add_num_nil.lox @@ -0,0 +1 @@ +1 + nil; // expect runtime error: Operands must be two numbers or two strings. diff --git a/interpreter/tests/lox/operator/add_string_nil.lox b/interpreter/tests/lox/operator/add_string_nil.lox new file mode 100644 index 0000000..5949630 --- /dev/null +++ b/interpreter/tests/lox/operator/add_string_nil.lox @@ -0,0 +1 @@ +"s" + nil; // expect runtime error: Operands must be two numbers or two strings. diff --git a/interpreter/tests/lox/operator/comparison.lox b/interpreter/tests/lox/operator/comparison.lox new file mode 100644 index 0000000..76e4e72 --- /dev/null +++ b/interpreter/tests/lox/operator/comparison.lox @@ -0,0 +1,25 @@ +print 1 < 2; // expect: true +print 2 < 2; // expect: false +print 2 < 1; // expect: false + +print 1 <= 2; // expect: true +print 2 <= 2; // expect: true +print 2 <= 1; // expect: false + +print 1 > 2; // expect: false +print 2 > 2; // expect: false +print 2 > 1; // expect: true + +print 1 >= 2; // expect: false +print 2 >= 2; // expect: true +print 2 >= 1; // expect: true + +// Zero and negative zero compare the same. +print 0 < -0; // expect: false +print -0 < 0; // expect: false +print 0 > -0; // expect: false +print -0 > 0; // expect: false +print 0 <= -0; // expect: true +print -0 <= 0; // expect: true +print 0 >= -0; // expect: true +print -0 >= 0; // expect: true diff --git a/interpreter/tests/lox/operator/divide.lox b/interpreter/tests/lox/operator/divide.lox new file mode 100644 index 0000000..771e93a --- /dev/null +++ b/interpreter/tests/lox/operator/divide.lox @@ -0,0 +1,2 @@ +print 8 / 2; // expect: 4 +print 12.34 / 12.34; // expect: 1 diff --git a/interpreter/tests/lox/operator/divide_nonnum_num.lox b/interpreter/tests/lox/operator/divide_nonnum_num.lox new file mode 100644 index 0000000..e406498 --- /dev/null +++ b/interpreter/tests/lox/operator/divide_nonnum_num.lox @@ -0,0 +1 @@ +"1" / 1; // expect runtime error: Operands must be numbers. diff --git a/interpreter/tests/lox/operator/divide_num_nonnum.lox b/interpreter/tests/lox/operator/divide_num_nonnum.lox new file mode 100644 index 0000000..9596cc6 --- /dev/null +++ b/interpreter/tests/lox/operator/divide_num_nonnum.lox @@ -0,0 +1 @@ +1 / "1"; // expect runtime error: Operands must be numbers. diff --git a/interpreter/tests/lox/operator/equals.lox b/interpreter/tests/lox/operator/equals.lox new file mode 100644 index 0000000..3497062 --- /dev/null +++ b/interpreter/tests/lox/operator/equals.lox @@ -0,0 +1,14 @@ +print nil == nil; // expect: true + +print true == true; // expect: true +print true == false; // expect: false + +print 1 == 1; // expect: true +print 1 == 2; // expect: false + +print "str" == "str"; // expect: true +print "str" == "ing"; // expect: false + +print nil == false; // expect: false +print false == 0; // expect: false +print 0 == "0"; // expect: false diff --git a/interpreter/tests/lox/operator/equals_class.lox b/interpreter/tests/lox/operator/equals_class.lox new file mode 100644 index 0000000..e8477c7 --- /dev/null +++ b/interpreter/tests/lox/operator/equals_class.lox @@ -0,0 +1,13 @@ +// Bound methods have identity equality. +class Foo {} +class Bar {} + +print Foo == Foo; // expect: true +print Foo == Bar; // expect: false +print Bar == Foo; // expect: false +print Bar == Bar; // expect: true + +print Foo == "Foo"; // expect: false +print Foo == nil; // expect: false +print Foo == 123; // expect: false +print Foo == true; // expect: false diff --git a/interpreter/tests/lox/operator/equals_method.lox b/interpreter/tests/lox/operator/equals_method.lox new file mode 100644 index 0000000..31a7f9e --- /dev/null +++ b/interpreter/tests/lox/operator/equals_method.lox @@ -0,0 +1,13 @@ +// Bound methods have identity equality. +class Foo { + method() {} +} + +var foo = Foo(); +var fooMethod = foo.method; + +// Same bound method. +print fooMethod == fooMethod; // expect: true + +// Different closurizations. +print foo.method == foo.method; // expect: false diff --git a/interpreter/tests/lox/operator/greater_nonnum_num.lox b/interpreter/tests/lox/operator/greater_nonnum_num.lox new file mode 100644 index 0000000..4746c03 --- /dev/null +++ b/interpreter/tests/lox/operator/greater_nonnum_num.lox @@ -0,0 +1 @@ +"1" > 1; // expect runtime error: Operands must be numbers. diff --git a/interpreter/tests/lox/operator/greater_num_nonnum.lox b/interpreter/tests/lox/operator/greater_num_nonnum.lox new file mode 100644 index 0000000..e06f67d --- /dev/null +++ b/interpreter/tests/lox/operator/greater_num_nonnum.lox @@ -0,0 +1 @@ +1 > "1"; // expect runtime error: Operands must be numbers. diff --git a/interpreter/tests/lox/operator/greater_or_equal_nonnum_num.lox b/interpreter/tests/lox/operator/greater_or_equal_nonnum_num.lox new file mode 100644 index 0000000..67994c6 --- /dev/null +++ b/interpreter/tests/lox/operator/greater_or_equal_nonnum_num.lox @@ -0,0 +1 @@ +"1" >= 1; // expect runtime error: Operands must be numbers. diff --git a/interpreter/tests/lox/operator/greater_or_equal_num_nonnum.lox b/interpreter/tests/lox/operator/greater_or_equal_num_nonnum.lox new file mode 100644 index 0000000..592eab4 --- /dev/null +++ b/interpreter/tests/lox/operator/greater_or_equal_num_nonnum.lox @@ -0,0 +1 @@ +1 >= "1"; // expect runtime error: Operands must be numbers. diff --git a/interpreter/tests/lox/operator/less_nonnum_num.lox b/interpreter/tests/lox/operator/less_nonnum_num.lox new file mode 100644 index 0000000..38a75db --- /dev/null +++ b/interpreter/tests/lox/operator/less_nonnum_num.lox @@ -0,0 +1 @@ +"1" < 1; // expect runtime error: Operands must be numbers. diff --git a/interpreter/tests/lox/operator/less_num_nonnum.lox b/interpreter/tests/lox/operator/less_num_nonnum.lox new file mode 100644 index 0000000..3abfe24 --- /dev/null +++ b/interpreter/tests/lox/operator/less_num_nonnum.lox @@ -0,0 +1 @@ +1 < "1"; // expect runtime error: Operands must be numbers. diff --git a/interpreter/tests/lox/operator/less_or_equal_nonnum_num.lox b/interpreter/tests/lox/operator/less_or_equal_nonnum_num.lox new file mode 100644 index 0000000..2bad506 --- /dev/null +++ b/interpreter/tests/lox/operator/less_or_equal_nonnum_num.lox @@ -0,0 +1 @@ +"1" <= 1; // expect runtime error: Operands must be numbers. diff --git a/interpreter/tests/lox/operator/less_or_equal_num_nonnum.lox b/interpreter/tests/lox/operator/less_or_equal_num_nonnum.lox new file mode 100644 index 0000000..c5daf7b --- /dev/null +++ b/interpreter/tests/lox/operator/less_or_equal_num_nonnum.lox @@ -0,0 +1 @@ +1 <= "1"; // expect runtime error: Operands must be numbers. diff --git a/interpreter/tests/lox/operator/multiply.lox b/interpreter/tests/lox/operator/multiply.lox new file mode 100644 index 0000000..ff459f3 --- /dev/null +++ b/interpreter/tests/lox/operator/multiply.lox @@ -0,0 +1,2 @@ +print 5 * 3; // expect: 15 +print 12.34 * 0.3; // expect: 3.702 diff --git a/interpreter/tests/lox/operator/multiply_nonnum_num.lox b/interpreter/tests/lox/operator/multiply_nonnum_num.lox new file mode 100644 index 0000000..fdeeb96 --- /dev/null +++ b/interpreter/tests/lox/operator/multiply_nonnum_num.lox @@ -0,0 +1 @@ +"1" * 1; // expect runtime error: Operands must be numbers. diff --git a/interpreter/tests/lox/operator/multiply_num_nonnum.lox b/interpreter/tests/lox/operator/multiply_num_nonnum.lox new file mode 100644 index 0000000..58fb3ae --- /dev/null +++ b/interpreter/tests/lox/operator/multiply_num_nonnum.lox @@ -0,0 +1 @@ +1 * "1"; // expect runtime error: Operands must be numbers. diff --git a/interpreter/tests/lox/operator/negate.lox b/interpreter/tests/lox/operator/negate.lox new file mode 100644 index 0000000..ea5d247 --- /dev/null +++ b/interpreter/tests/lox/operator/negate.lox @@ -0,0 +1,3 @@ +print -(3); // expect: -3 +print --(3); // expect: 3 +print ---(3); // expect: -3 diff --git a/interpreter/tests/lox/operator/negate_nonnum.lox b/interpreter/tests/lox/operator/negate_nonnum.lox new file mode 100644 index 0000000..e76792f --- /dev/null +++ b/interpreter/tests/lox/operator/negate_nonnum.lox @@ -0,0 +1 @@ +-"s"; // expect runtime error: Operand must be a number. diff --git a/interpreter/tests/lox/operator/not.lox b/interpreter/tests/lox/operator/not.lox new file mode 100644 index 0000000..869e06e --- /dev/null +++ b/interpreter/tests/lox/operator/not.lox @@ -0,0 +1,13 @@ +print !true; // expect: false +print !false; // expect: true +print !!true; // expect: true + +print !123; // expect: false +print !0; // expect: false + +print !nil; // expect: true + +print !""; // expect: false + +fun foo() {} +print !foo; // expect: false diff --git a/interpreter/tests/lox/operator/not_class.lox b/interpreter/tests/lox/operator/not_class.lox new file mode 100644 index 0000000..d76acec --- /dev/null +++ b/interpreter/tests/lox/operator/not_class.lox @@ -0,0 +1,3 @@ +class Bar {} +print !Bar; // expect: false +print !Bar(); // expect: false diff --git a/interpreter/tests/lox/operator/not_equals.lox b/interpreter/tests/lox/operator/not_equals.lox new file mode 100644 index 0000000..e0c24ea --- /dev/null +++ b/interpreter/tests/lox/operator/not_equals.lox @@ -0,0 +1,14 @@ +print nil != nil; // expect: false + +print true != true; // expect: false +print true != false; // expect: true + +print 1 != 1; // expect: false +print 1 != 2; // expect: true + +print "str" != "str"; // expect: false +print "str" != "ing"; // expect: true + +print nil != false; // expect: true +print false != 0; // expect: true +print 0 != "0"; // expect: true diff --git a/interpreter/tests/lox/operator/subtract.lox b/interpreter/tests/lox/operator/subtract.lox new file mode 100644 index 0000000..234bb8c --- /dev/null +++ b/interpreter/tests/lox/operator/subtract.lox @@ -0,0 +1,2 @@ +print 4 - 3; // expect: 1 +print 1.2 - 1.2; // expect: 0 diff --git a/interpreter/tests/lox/operator/subtract_nonnum_num.lox b/interpreter/tests/lox/operator/subtract_nonnum_num.lox new file mode 100644 index 0000000..2accd9f --- /dev/null +++ b/interpreter/tests/lox/operator/subtract_nonnum_num.lox @@ -0,0 +1 @@ +"1" - 1; // expect runtime error: Operands must be numbers. diff --git a/interpreter/tests/lox/operator/subtract_num_nonnum.lox b/interpreter/tests/lox/operator/subtract_num_nonnum.lox new file mode 100644 index 0000000..c7a4d68 --- /dev/null +++ b/interpreter/tests/lox/operator/subtract_num_nonnum.lox @@ -0,0 +1 @@ +1 - "1"; // expect runtime error: Operands must be numbers. diff --git a/interpreter/tests/lox/precedence.lox b/interpreter/tests/lox/precedence.lox new file mode 100644 index 0000000..f4d7a35 --- /dev/null +++ b/interpreter/tests/lox/precedence.lox @@ -0,0 +1,32 @@ +// * has higher precedence than +. +print 2 + 3 * 4; // expect: 14 + +// * has higher precedence than -. +print 20 - 3 * 4; // expect: 8 + +// / has higher precedence than +. +print 2 + 6 / 3; // expect: 4 + +// / has higher precedence than -. +print 2 - 6 / 3; // expect: 0 + +// < has higher precedence than ==. +print false == 2 < 1; // expect: true + +// > has higher precedence than ==. +print false == 1 > 2; // expect: true + +// <= has higher precedence than ==. +print false == 2 <= 1; // expect: true + +// >= has higher precedence than ==. +print false == 1 >= 2; // expect: true + +// 1 - 1 is not space-sensitive. +print 1 - 1; // expect: 0 +print 1 -1; // expect: 0 +print 1- 1; // expect: 0 +print 1-1; // expect: 0 + +// Using () for grouping. +print (2 * (6 - (2 + 2))); // expect: 4 diff --git a/interpreter/tests/lox/print/missing_argument.lox b/interpreter/tests/lox/print/missing_argument.lox new file mode 100644 index 0000000..78bf2c1 --- /dev/null +++ b/interpreter/tests/lox/print/missing_argument.lox @@ -0,0 +1,2 @@ +// [line 2] Error at ';': Expect expression. +print; diff --git a/interpreter/tests/lox/regression/394.lox b/interpreter/tests/lox/regression/394.lox new file mode 100644 index 0000000..77dd4fa --- /dev/null +++ b/interpreter/tests/lox/regression/394.lox @@ -0,0 +1,5 @@ +{ + class A {} + class B < A {} + print B; // expect: B +} diff --git a/interpreter/tests/lox/regression/40.lox b/interpreter/tests/lox/regression/40.lox new file mode 100644 index 0000000..37e0166 --- /dev/null +++ b/interpreter/tests/lox/regression/40.lox @@ -0,0 +1,22 @@ +fun caller(g) { + g(); + // g should be a function, not nil. + print g == nil; // expect: false +} + +fun callCaller() { + var capturedVar = "before"; + var a = "a"; + + fun f() { + // Commenting the next line out prevents the bug! + capturedVar = "after"; + + // Returning anything also fixes it, even nil: + //return nil; + } + + caller(f); +} + +callCaller(); diff --git a/interpreter/tests/lox/return/after_else.lox b/interpreter/tests/lox/return/after_else.lox new file mode 100644 index 0000000..115b112 --- /dev/null +++ b/interpreter/tests/lox/return/after_else.lox @@ -0,0 +1,5 @@ +fun f() { + if (false) "no"; else return "ok"; +} + +print f(); // expect: ok diff --git a/interpreter/tests/lox/return/after_if.lox b/interpreter/tests/lox/return/after_if.lox new file mode 100644 index 0000000..773ade6 --- /dev/null +++ b/interpreter/tests/lox/return/after_if.lox @@ -0,0 +1,5 @@ +fun f() { + if (true) return "ok"; +} + +print f(); // expect: ok diff --git a/interpreter/tests/lox/return/after_while.lox b/interpreter/tests/lox/return/after_while.lox new file mode 100644 index 0000000..1c8d715 --- /dev/null +++ b/interpreter/tests/lox/return/after_while.lox @@ -0,0 +1,5 @@ +fun f() { + while (true) return "ok"; +} + +print f(); // expect: ok diff --git a/interpreter/tests/lox/return/at_top_level.lox b/interpreter/tests/lox/return/at_top_level.lox new file mode 100644 index 0000000..22f39df --- /dev/null +++ b/interpreter/tests/lox/return/at_top_level.lox @@ -0,0 +1 @@ +return "wat"; // Error at 'return': Can't return from top-level code. diff --git a/interpreter/tests/lox/return/in_function.lox b/interpreter/tests/lox/return/in_function.lox new file mode 100644 index 0000000..2379c7d --- /dev/null +++ b/interpreter/tests/lox/return/in_function.lox @@ -0,0 +1,6 @@ +fun f() { + return "ok"; + print "bad"; +} + +print f(); // expect: ok diff --git a/interpreter/tests/lox/return/in_method.lox b/interpreter/tests/lox/return/in_method.lox new file mode 100644 index 0000000..13e6d28 --- /dev/null +++ b/interpreter/tests/lox/return/in_method.lox @@ -0,0 +1,8 @@ +class Foo { + method() { + return "ok"; + print "bad"; + } +} + +print Foo().method(); // expect: ok diff --git a/interpreter/tests/lox/return/return_nil_if_no_value.lox b/interpreter/tests/lox/return/return_nil_if_no_value.lox new file mode 100644 index 0000000..df88075 --- /dev/null +++ b/interpreter/tests/lox/return/return_nil_if_no_value.lox @@ -0,0 +1,6 @@ +fun f() { + return; + print "bad"; +} + +print f(); // expect: nil diff --git a/interpreter/tests/lox/run.t b/interpreter/tests/lox/run.t new file mode 100644 index 0000000..313dbff --- /dev/null +++ b/interpreter/tests/lox/run.t @@ -0,0 +1,1446 @@ +file empty_file.lox + $ mlox empty_file.lox + + +file precedence.lox + $ mlox precedence.lox + 14 + 8 + 4 + 0 + true + true + true + true + 0 + 0 + 0 + 0 + 4 + + +file unexpected_character.lox + $ mlox unexpected_character.lox + found 1 LexerError: + LexerError at line 3, column 6: Unexpected character '|' + [1] + + +file assignment/associativity.lox + $ mlox assignment/associativity.lox + c + c + c + + +file assignment/global.lox + $ mlox assignment/global.lox + before + after + arg + arg + + +file assignment/grouping.lox + $ mlox assignment/grouping.lox + + +file assignment/infix_operator.lox + $ mlox assignment/infix_operator.lox + found 1 ParserError: + ParserError at line 3, column 6: Invalid assignment target + [1] + + +file assignment/local.lox + $ mlox assignment/local.lox + before + after + arg + arg + + +file assignment/prefix_operator.lox + $ mlox assignment/prefix_operator.lox + found 1 ParserError: + ParserError at line 2, column 3: Invalid assignment target + [1] + + +file assignment/syntax.lox + $ mlox assignment/syntax.lox + var + var + + +file assignment/to_this.lox +$ mlox assignment/to_this.lox + + +file assignment/undefined.lox + $ mlox assignment/undefined.lox + RuntimeError at line 1, column 8: tried to assign to undefined variable unknown + [1] + + +file block/empty.lox + $ mlox block/empty.lox + ok + + +file block/scope.lox + $ mlox block/scope.lox + inner + outer + + +file bool/equality.lox + $ mlox bool/equality.lox + true + false + false + true + false + false + false + false + false + false + true + true + false + true + true + true + true + true + + +file bool/not.lox + $ mlox bool/not.lox + false + true + true + + +file break/for.lox + $ mlox break/for.lox + 0 + 1 + 2 + 3 + 4 + + +file break/outside_loop.lox + $ mlox break/outside_loop.lox + found 1 ParserError: + ParserError at line 1, column 0: Can use break only in loops + [1] + + +file break/while.lox + $ mlox break/while.lox + 0 + 1 + 2 + 3 + 4 + + +file call/bool.lox + $ mlox call/bool.lox + RuntimeError at line 1, column 4: Bool object is not callable + [1] + + +file call/nil.lox + $ mlox call/nil.lox + RuntimeError at line 1, column 3: Nil object is not callable + [1] + + +file call/num.lox + $ mlox call/num.lox + RuntimeError at line 1, column 3: Number object is not callable + [1] + + +file call/object.lox +$ mlox call/object.lox + + +file call/string.lox + $ mlox call/string.lox + RuntimeError at line 1, column 5: String object is not callable + [1] + + +file class/empty.lox +$ mlox class/empty.lox + + +file class/inherit_self.lox +$ mlox class/inherit_self.lox + + +file class/inherited_method.lox +$ mlox class/inherited_method.lox + + +file class/local_inherit_other.lox +$ mlox class/local_inherit_other.lox + + +file class/local_inherit_self.lox + $ mlox class/local_inherit_self.lox + + +file class/local_reference_self.lox + $ mlox class/local_reference_self.lox + + +file class/reference_self.lox +$ mlox class/reference_self.lox + + +file closure/assign_to_closure.lox + $ mlox closure/assign_to_closure.lox + local + after f + after f + after g + + +file closure/assign_to_shadowed_later.lox +$ mlox closure/assign_to_shadowed_later.lox +inner +assigned + + +file closure/close_over_function_parameter.lox + $ mlox closure/close_over_function_parameter.lox + param + + +file closure/close_over_later_variable.lox + $ mlox closure/close_over_later_variable.lox + b + a + + +file closure/close_over_method_parameter.lox +$ mlox closure/close_over_method_parameter.lox + + +file closure/closed_closure_in_function.lox + $ mlox closure/closed_closure_in_function.lox + local + + +file closure/nested_closure.lox + $ mlox closure/nested_closure.lox + a + b + c + + +file closure/open_closure_in_function.lox + $ mlox closure/open_closure_in_function.lox + local + + +file closure/reference_closure_multiple_times.lox + $ mlox closure/reference_closure_multiple_times.lox + a + a + + +file closure/reuse_closure_slot.lox + $ mlox closure/reuse_closure_slot.lox + a + + +file closure/shadow_closure_with_local.lox + $ mlox closure/shadow_closure_with_local.lox + closure + shadow + closure + + +file closure/unused_closure.lox + $ mlox closure/unused_closure.lox + ok + + +file closure/unused_later_closure.lox + $ mlox closure/unused_later_closure.lox + a + + +file comments/line_at_eof.lox + $ mlox comments/line_at_eof.lox + ok + + +file comments/only_line_comment.lox + $ mlox comments/only_line_comment.lox + + +file comments/only_line_comment_and_line.lox + $ mlox comments/only_line_comment_and_line.lox + + +file comments/unicode.lox + $ mlox comments/unicode.lox + ok + + +file constructor/arguments.lox +$ mlox constructor/arguments.lox + + +file constructor/call_init_early_return.lox +$ mlox constructor/call_init_early_return.lox + + +file constructor/call_init_explicitly.lox +$ mlox constructor/call_init_explicitly.lox + + +file constructor/default.lox +$ mlox constructor/default.lox + + +file constructor/default_arguments.lox +$ mlox constructor/default_arguments.lox + + +file constructor/early_return.lox +$ mlox constructor/early_return.lox + + +file constructor/extra_arguments.lox +$ mlox constructor/extra_arguments.lox + + +file constructor/init_not_method.lox +$ mlox constructor/init_not_method.lox + + +file constructor/missing_arguments.lox +$ mlox constructor/missing_arguments.lox + + +file constructor/return_in_nested_function.lox +$ mlox constructor/return_in_nested_function.lox + + +file constructor/return_value.lox +$ mlox constructor/return_value.lox + + +file continue/for.lox + $ mlox continue/for.lox + 0 + 1 + 2 + 3 + 4 + 6 + 7 + 8 + 9 + + +file continue/outside_loop.lox + $ mlox continue/outside_loop.lox + found 1 ParserError: + ParserError at line 1, column 0: Can use continue only in loops + [1] + + +file continue/while.lox + $ mlox continue/while.lox + 0 + 1 + 2 + 3 + 4 + 6 + 7 + 8 + 9 + + +file field/call_function_field.lox +$ mlox field/call_function_field.lox + + +file field/call_nonfunction_field.lox +$ mlox field/call_nonfunction_field.lox + + +file field/get_and_set_method.lox +$ mlox field/get_and_set_method.lox + + +file field/get_on_bool.lox +$ mlox field/get_on_bool.lox + + +file field/get_on_class.lox +$ mlox field/get_on_class.lox + + +file field/get_on_function.lox +$ mlox field/get_on_function.lox + + +file field/get_on_nil.lox +$ mlox field/get_on_nil.lox + + +file field/get_on_num.lox +$ mlox field/get_on_num.lox + + +file field/get_on_string.lox +$ mlox field/get_on_string.lox + + +file field/many.lox +$ mlox field/many.lox + + +file field/method.lox +$ mlox field/method.lox + + +file field/method_binds_this.lox +$ mlox field/method_binds_this.lox + + +file field/on_instance.lox +$ mlox field/on_instance.lox + + +file field/set_evaluation_order.lox +$ mlox field/set_evaluation_order.lox + + +file field/set_on_bool.lox +$ mlox field/set_on_bool.lox + + +file field/set_on_class.lox +$ mlox field/set_on_class.lox + + +file field/set_on_function.lox +$ mlox field/set_on_function.lox + + +file field/set_on_nil.lox +$ mlox field/set_on_nil.lox + + +file field/set_on_num.lox +$ mlox field/set_on_num.lox + + +file field/set_on_string.lox +$ mlox field/set_on_string.lox + + +file field/undefined.lox +$ mlox field/undefined.lox + + +file for/class_in_body.lox +$ mlox for/class_in_body.lox + + +file for/closure_in_body.lox +$ mlox for/closure_in_body.lox + + +file for/fun_in_body.lox + $ mlox for/fun_in_body.lox + found 1 ParserError: + ParserError at line 2, column 9: Expected valid expression, got Fun instead + [1] + + +file for/return_closure.lox +$ mlox for/return_closure.lox + + +file for/return_inside.lox + $ mlox for/return_inside.lox + i + + +file for/scope.lox + $ mlox for/scope.lox + 0 + -1 + after + 0 + + +file for/statement_condition.lox + $ mlox for/statement_condition.lox + found 2 ParserErrors: + ParserError at line 3, column 16: Expected valid expression, got LeftBrace instead + ParserError at line 3, column 29: Expected Semicolon, but got RightParen + [1] + + +file for/statement_increment.lox + $ mlox for/statement_increment.lox + found 1 ParserError: + ParserError at line 2, column 23: Expected valid expression, got LeftBrace instead + [1] + +file for/statement_initializer.lox + $ mlox for/statement_initializer.lox + found 2 ParserErrors: + ParserError at line 3, column 5: Expected valid expression, got LeftBrace instead + ParserError at line 3, column 25: Expected Semicolon, but got RightParen + [1] + + +file for/syntax.lox + $ mlox for/syntax.lox + 1 + 2 + 3 + 0 + 1 + 2 + done + 0 + 1 + 0 + 1 + 2 + 0 + 1 + + +file for/var_in_body.lox + $ mlox for/var_in_body.lox + found 1 ParserError: + ParserError at line 2, column 9: Expected valid expression, got Var instead + [1] + +file function/body_must_be_block.lox + $ mlox function/body_must_be_block.lox + found 1 ParserError: + ParserError at line 3, column 8: Expected LeftBrace, but got (Number 123.) + [1] + + +file function/empty_body.lox + $ mlox function/empty_body.lox + nil + + +file function/extra_arguments.lox + $ mlox function/extra_arguments.lox + RuntimeError at line 6, column 1: Function f has arity 4, but was called with 2 args + [1] + + +file function/local_mutual_recursion.lox +$ mlox function/local_mutual_recursion.lox +RuntimeError at line 4, column 11: name "isOdd" is not defined +[1] + +file function/local_recursion.lox +$ mlox function/local_recursion.lox + + +file function/missing_arguments.lox + $ mlox function/missing_arguments.lox + RuntimeError at line 3, column 1: Function f has arity 1, but was called with 2 args + [1] + + +file function/missing_comma_in_parameters.lox + $ mlox function/missing_comma_in_parameters.lox + found 1 ParserError: + ParserError at line 3, column 13: Expected RightParen, but got (Identifier "c") + [1] + + +file function/mutual_recursion.lox + $ mlox function/mutual_recursion.lox + true + true + + +file function/nested_call_with_arguments.lox + $ mlox function/nested_call_with_arguments.lox + hello world + + +file function/parameters.lox + $ mlox function/parameters.lox + 0 + 1 + 3 + 6 + 10 + 15 + 21 + 28 + 36 + + +file function/print.lox + $ mlox function/print.lox + + + + +file function/recursion.lox + $ mlox function/recursion.lox + 21 + + +file function/too_many_arguments.lox + $ mlox function/too_many_arguments.lox + found 2 ParserErrors: + ParserError at line 4, column 5: Can't call with more than 255 arguments + ParserError at line 261, column 0: Expected valid expression, got RightBrace instead + [1] + + +file function/too_many_parameters.lox + $ mlox function/too_many_parameters.lox + found 1 ParserError: + ParserError at line 2, column 0: Function f can't have more than 255 arguments + [1] + + +file if/class_in_else.lox +$ mlox if/class_in_else.lox + + +file if/class_in_then.lox +$ mlox if/class_in_then.lox + + +file if/dangling_else.lox + $ mlox if/dangling_else.lox + good + + +file if/else.lox + $ mlox if/else.lox + good + good + block + + +file if/fun_in_else.lox + $ mlox if/fun_in_else.lox + found 1 ParserError: + ParserError at line 2, column 21: Expected valid expression, got Fun instead + [1] + + +file if/fun_in_then.lox + $ mlox if/fun_in_then.lox + found 1 ParserError: + ParserError at line 2, column 10: Expected valid expression, got Fun instead + [1] + + +file if/if.lox + $ mlox if/if.lox + good + block + true + + +file if/truth.lox + $ mlox if/truth.lox + false + nil + true + 0 + empty + + +file if/var_in_else.lox + $ mlox if/var_in_else.lox + found 1 ParserError: + ParserError at line 2, column 21: Expected valid expression, got Var instead + [1] + + +file if/var_in_then.lox + $ mlox if/var_in_then.lox + found 1 ParserError: + ParserError at line 2, column 10: Expected valid expression, got Var instead + [1] + + +file inheritance/constructor.lox +$ mlox inheritance/constructor.lox + + +file inheritance/inherit_from_function.lox +$ mlox inheritance/inherit_from_function.lox + + +file inheritance/inherit_from_nil.lox +$ mlox inheritance/inherit_from_nil.lox + + +file inheritance/inherit_from_number.lox +$ mlox inheritance/inherit_from_number.lox + + +file inheritance/inherit_methods.lox +$ mlox inheritance/inherit_methods.lox + + +file inheritance/parenthesized_superclass.lox +$ mlox inheritance/parenthesized_superclass.lox + + +file inheritance/set_fields_from_base_class.lox +$ mlox inheritance/set_fields_from_base_class.lox + + +file limit/loop_too_large.lox + $ mlox limit/loop_too_large.lox + + +file limit/no_reuse_constants.lox + $ mlox limit/no_reuse_constants.lox + + +file limit/stack_overflow.lox +$ mlox limit/stack_overflow.lox + + +file limit/too_many_constants.lox + $ mlox limit/too_many_constants.lox + + +file limit/too_many_locals.lox + $ mlox limit/too_many_locals.lox + + +file limit/too_many_upvalues.lox + $ mlox limit/too_many_upvalues.lox + + +file logical_operator/and.lox + $ mlox logical_operator/and.lox + false + 1 + false + true + 3 + true + false + + +file logical_operator/and_truth.lox + $ mlox logical_operator/and_truth.lox + false + nil + ok + ok + ok + + +file logical_operator/or.lox + $ mlox logical_operator/or.lox + 1 + 1 + true + false + false + false + true + + +file logical_operator/or_truth.lox + $ mlox logical_operator/or_truth.lox + ok + ok + true + 0 + s + + +file method/arity.lox +$ mlox method/arity.lox + + +file method/empty_block.lox +$ mlox method/empty_block.lox + + +file method/extra_arguments.lox +$ mlox method/extra_arguments.lox + + +file method/missing_arguments.lox +$ mlox method/missing_arguments.lox + + +file method/not_found.lox +$ mlox method/not_found.lox + + +file method/print_bound_method.lox +$ mlox method/print_bound_method.lox + + +file method/refer_to_name.lox +$ mlox method/refer_to_name.lox + + +file method/too_many_arguments.lox +$ mlox method/too_many_arguments.lox + + +file method/too_many_parameters.lox +$ mlox method/too_many_parameters.lox + + +file nil/literal.lox + $ mlox nil/literal.lox + nil + + +file number/decimal_point_at_eof.lox + $ mlox number/decimal_point_at_eof.lox + found 1 ParserError: + ParserError at line 2, column 4: Expected Semicolon, but got Eof + [1] + + +file number/leading_dot.lox + $ mlox number/leading_dot.lox + found 1 ParserError: + ParserError at line 2, column 0: Expected valid expression, got Dot instead + [1] + + +file number/literals.lox + $ mlox number/literals.lox + 123 + 987654 + 0 + 0 + 123.456 + -0.001 + + +file number/nan_equality.lox + $ mlox number/nan_equality.lox + RuntimeError at line 1, column 11: Division by 0 + [1] +false +true +false +true + + +file number/trailing_dot.lox + $ mlox number/trailing_dot.lox + + +file operator/add.lox + $ mlox operator/add.lox + 579 + string + + +file operator/add_bool_nil.lox + $ mlox operator/add_bool_nil.lox + RuntimeError at line 1, column 5: Invalid operands of type Bool and Nil to operator Plus + [1] + + +file operator/add_bool_num.lox + $ mlox operator/add_bool_num.lox + RuntimeError at line 1, column 5: Invalid operands of type Bool and Number to operator Plus + [1] + + +file operator/add_bool_string.lox + $ mlox operator/add_bool_string.lox + RuntimeError at line 1, column 5: Invalid operands of type Bool and String to operator Plus + [1] + + +file operator/add_nil_nil.lox + $ mlox operator/add_nil_nil.lox + RuntimeError at line 1, column 4: Invalid operands of type Nil and Nil to operator Plus + [1] + + +file operator/add_num_nil.lox + $ mlox operator/add_num_nil.lox + RuntimeError at line 1, column 2: Invalid operands of type Number and Nil to operator Plus + [1] + + +file operator/add_string_nil.lox + $ mlox operator/add_string_nil.lox + RuntimeError at line 1, column 4: Invalid operands of type String and Nil to operator Plus + [1] + + +file operator/comparison.lox + $ mlox operator/comparison.lox + true + false + false + true + true + false + false + false + true + false + true + true + false + false + false + false + true + true + true + true + + +file operator/divide.lox + $ mlox operator/divide.lox + 4 + 1 + + +file operator/divide_nonnum_num.lox + $ mlox operator/divide_nonnum_num.lox + RuntimeError at line 1, column 4: Invalid operands of type String and Number to operator Div + [1] + + +file operator/divide_num_nonnum.lox + $ mlox operator/divide_num_nonnum.lox + RuntimeError at line 1, column 2: Invalid operands of type Number and String to operator Div + [1] + + +file operator/equals.lox + $ mlox operator/equals.lox + true + true + false + true + false + true + false + false + false + false + + +file operator/equals_class.lox +$ mlox operator/equals_class.lox + + +file operator/equals_method.lox +$ mlox operator/equals_method.lox + + +file operator/greater_nonnum_num.lox + $ mlox operator/greater_nonnum_num.lox + RuntimeError at line 1, column 4: Invalid operands of type String and Number to operator Greater + [1] + + +file operator/greater_num_nonnum.lox + $ mlox operator/greater_num_nonnum.lox + RuntimeError at line 1, column 2: Invalid operands of type Number and String to operator Greater + [1] + + +file operator/greater_or_equal_nonnum_num.lox + $ mlox operator/greater_or_equal_nonnum_num.lox + RuntimeError at line 1, column 4: Invalid operands of type String and Number to operator GreaterEqual + [1] + + +file operator/greater_or_equal_num_nonnum.lox + $ mlox operator/greater_or_equal_num_nonnum.lox + RuntimeError at line 1, column 2: Invalid operands of type Number and String to operator GreaterEqual + [1] + + +file operator/less_nonnum_num.lox + $ mlox operator/less_nonnum_num.lox + RuntimeError at line 1, column 4: Invalid operands of type String and Number to operator Less + [1] + + +file operator/less_num_nonnum.lox + $ mlox operator/less_num_nonnum.lox + RuntimeError at line 1, column 2: Invalid operands of type Number and String to operator Less + [1] + + +file operator/less_or_equal_nonnum_num.lox + $ mlox operator/less_or_equal_nonnum_num.lox + RuntimeError at line 1, column 4: Invalid operands of type String and Number to operator LessEqual + [1] + + +file operator/less_or_equal_num_nonnum.lox + $ mlox operator/less_or_equal_num_nonnum.lox + RuntimeError at line 1, column 2: Invalid operands of type Number and String to operator LessEqual + [1] + + +file operator/multiply.lox + $ mlox operator/multiply.lox + 15 + 3.702 + + +file operator/multiply_nonnum_num.lox + $ mlox operator/multiply_nonnum_num.lox + RuntimeError at line 1, column 4: Invalid operands of type String and Number to operator Mul + [1] + + +file operator/multiply_num_nonnum.lox + $ mlox operator/multiply_num_nonnum.lox + RuntimeError at line 1, column 2: Invalid operands of type Number and String to operator Mul + [1] + + +file operator/negate.lox + $ mlox operator/negate.lox + -3 + 3 + -3 + + +file operator/negate_nonnum.lox + $ mlox operator/negate_nonnum.lox + RuntimeError at line 1, column 0: Invalid operant of type String to operator Neg + [1] + + +file operator/not.lox + $ mlox operator/not.lox + false + true + true + false + false + true + false + false + + +file operator/not_class.lox +$ mlox operator/not_class.lox + + +file operator/not_equals.lox + $ mlox operator/not_equals.lox + false + false + true + false + true + false + true + true + true + true + + +file operator/subtract.lox + $ mlox operator/subtract.lox + 1 + 0 + + +file operator/subtract_nonnum_num.lox + $ mlox operator/subtract_nonnum_num.lox + RuntimeError at line 1, column 4: Invalid operands of type String and Number to operator Minus + [1] + + +file operator/subtract_num_nonnum.lox + $ mlox operator/subtract_num_nonnum.lox + RuntimeError at line 1, column 2: Invalid operands of type Number and String to operator Minus + [1] + + +file print/missing_argument.lox + $ mlox print/missing_argument.lox + found 1 ParserError: + ParserError at line 2, column 5: Expected valid expression, got Semicolon instead + [1] + + +file regression/40.lox + $ mlox regression/40.lox + false + + +file regression/394.lox +$ mlox regression/394.lox + + +file return/after_else.lox + $ mlox return/after_else.lox + ok + + +file return/after_if.lox + $ mlox return/after_if.lox + ok + + +file return/after_while.lox + $ mlox return/after_while.lox + ok + + +file return/at_top_level.lox + $ mlox return/at_top_level.lox + found 1 ParserError: + ParserError at line 1, column 0: Can use return only in functions + [1] + +file return/in_function.lox + $ mlox return/in_function.lox + ok + + +file return/in_method.lox +$ mlox return/in_method.lox + + +file return/return_nil_if_no_value.lox + $ mlox return/return_nil_if_no_value.lox + nil + + +file string/error_after_multiline.lox + $ mlox string/error_after_multiline.lox + RuntimeError at line 7, column 0: name "err" is not defined + [1] + + +file string/literals.lox + $ mlox string/literals.lox + () + a string + A~¶Þॐஃ + + +file string/multiline.lox + $ mlox string/multiline.lox + 1 + 2 + 3 + + +file string/unterminated.lox + $ mlox string/unterminated.lox + found 1 LexerError: + LexerError at line 2, column 0: Unterminated string literal + [1] + + +file super/bound_method.lox +$ mlox super/bound_method.lox + + +file super/call_other_method.lox +$ mlox super/call_other_method.lox + + +file super/call_same_method.lox +$ mlox super/call_same_method.lox + + +file super/closure.lox +$ mlox super/closure.lox + + +file super/constructor.lox +$ mlox super/constructor.lox + + +file super/extra_arguments.lox +$ mlox super/extra_arguments.lox + + +file super/indirectly_inherited.lox +$ mlox super/indirectly_inherited.lox + + +file super/missing_arguments.lox +$ mlox super/missing_arguments.lox + + +file super/no_superclass_bind.lox +$ mlox super/no_superclass_bind.lox + + +file super/no_superclass_call.lox +$ mlox super/no_superclass_call.lox + + +file super/no_superclass_method.lox +$ mlox super/no_superclass_method.lox + + +file super/parenthesized.lox +$ mlox super/parenthesized.lox + + +file super/reassign_superclass.lox +$ mlox super/reassign_superclass.lox + + +file super/super_at_top_level.lox +$ mlox super/super_at_top_level.lox + + +file super/super_in_closure_in_inherited_method.lox +$ mlox super/super_in_closure_in_inherited_method.lox + + +file super/super_in_inherited_method.lox +$ mlox super/super_in_inherited_method.lox + + +file super/super_in_top_level_function.lox +$ mlox super/super_in_top_level_function.lox + + +file super/super_without_dot.lox +$ mlox super/super_without_dot.lox + + +file super/super_without_name.lox +$ mlox super/super_without_name.lox + + +file super/this_in_superclass_method.lox +$ mlox super/this_in_superclass_method.lox + + +file this/closure.lox +$ mlox this/closure.lox + + +file this/nested_class.lox +$ mlox this/nested_class.lox + + +file this/nested_closure.lox +$ mlox this/nested_closure.lox + + +file this/this_at_top_level.lox +$ mlox this/this_at_top_level.lox + + +file this/this_in_method.lox +$ mlox this/this_in_method.lox + + +file this/this_in_top_level_function.lox +$ mlox this/this_in_top_level_function.lox + + +file variable/collide_with_parameter.lox + $ mlox variable/collide_with_parameter.lox + + +file variable/duplicate_local.lox + $ mlox variable/duplicate_local.lox + RuntimeError at line 3, column 2: Tried to define a, but a variable of that name was already defined + [1] + + +file variable/duplicate_parameter.lox + $ mlox variable/duplicate_parameter.lox + + +file variable/early_bound.lox +$ mlox variable/early_bound.lox +outer +outer + + +file variable/in_middle_of_block.lox + $ mlox variable/in_middle_of_block.lox + a + a b + a c + a b d + + +file variable/in_nested_block.lox + $ mlox variable/in_nested_block.lox + outer + + +file variable/local_from_method.lox +$ mlox variable/local_from_method.lox + + +file variable/redeclare_global.lox + $ mlox variable/redeclare_global.lox + nil + + +file variable/redefine_global.lox + $ mlox variable/redefine_global.lox + 2 + + +file variable/scope_reuse_in_different_blocks.lox + $ mlox variable/scope_reuse_in_different_blocks.lox + first + second + + +file variable/shadow_and_local.lox + $ mlox variable/shadow_and_local.lox + outer + inner + + +file variable/shadow_global.lox + $ mlox variable/shadow_global.lox + shadow + global + + +file variable/shadow_local.lox + $ mlox variable/shadow_local.lox + shadow + local + + +file variable/undefined_global.lox + $ mlox variable/undefined_global.lox + RuntimeError at line 1, column 6: name "notDefined" is not defined + [1] + + +file variable/undefined_local.lox + $ mlox variable/undefined_local.lox + RuntimeError at line 2, column 8: name "notDefined" is not defined + [1] + + +file variable/uninitialized.lox + $ mlox variable/uninitialized.lox + nil + + +file variable/unreached_undefined.lox + $ mlox variable/unreached_undefined.lox + ok + + +file variable/use_false_as_var.lox + $ mlox variable/use_false_as_var.lox + found 1 ParserError: + ParserError at line 2, column 4: Expected identifier, but got False + [1] + + +file variable/use_global_in_initializer.lox + $ mlox variable/use_global_in_initializer.lox + value + + +TODO: what to do here? +file variable/use_local_in_initializer.lox + $ mlox variable/use_local_in_initializer.lox + + +file variable/use_nil_as_var.lox + $ mlox variable/use_nil_as_var.lox + found 1 ParserError: + ParserError at line 2, column 4: Expected identifier, but got Nil + [1] + + +file variable/use_this_as_var.lox + $ mlox variable/use_this_as_var.lox + found 1 ParserError: + ParserError at line 2, column 4: Expected identifier, but got This + [1] + + +file while/class_in_body.lox +$ mlox while/class_in_body.lox + + +file while/closure_in_body.lox + $ mlox while/closure_in_body.lox + 1 + 2 + 3 + + +file while/fun_in_body.lox + $ mlox while/fun_in_body.lox + found 1 ParserError: + ParserError at line 2, column 13: Expected valid expression, got Fun instead + [1] + + +file while/return_closure.lox + $ mlox while/return_closure.lox + i + + +file while/return_inside.lox + $ mlox while/return_inside.lox + i + + +file while/syntax.lox + $ mlox while/syntax.lox + 1 + 2 + 3 + 0 + 1 + 2 + + +file while/var_in_body.lox + $ mlox while/var_in_body.lox + found 1 ParserError: + ParserError at line 2, column 13: Expected valid expression, got Var instead + [1] + + diff --git a/interpreter/tests/lox/string/error_after_multiline.lox b/interpreter/tests/lox/string/error_after_multiline.lox new file mode 100644 index 0000000..59bcbdf --- /dev/null +++ b/interpreter/tests/lox/string/error_after_multiline.lox @@ -0,0 +1,7 @@ +// Tests that we correctly track the line info across multiline strings. +var a = "1 +2 +3 +"; + +err; // // expect runtime error: Undefined variable 'err'. \ No newline at end of file diff --git a/interpreter/tests/lox/string/literals.lox b/interpreter/tests/lox/string/literals.lox new file mode 100644 index 0000000..986c6a7 --- /dev/null +++ b/interpreter/tests/lox/string/literals.lox @@ -0,0 +1,5 @@ +print "(" + "" + ")"; // expect: () +print "a string"; // expect: a string + +// Non-ASCII. +print "A~¶Þॐஃ"; // expect: A~¶Þॐஃ diff --git a/interpreter/tests/lox/string/multiline.lox b/interpreter/tests/lox/string/multiline.lox new file mode 100644 index 0000000..373232b --- /dev/null +++ b/interpreter/tests/lox/string/multiline.lox @@ -0,0 +1,7 @@ +var a = "1 +2 +3"; +print a; +// expect: 1 +// expect: 2 +// expect: 3 diff --git a/interpreter/tests/lox/string/unterminated.lox b/interpreter/tests/lox/string/unterminated.lox new file mode 100644 index 0000000..659625f --- /dev/null +++ b/interpreter/tests/lox/string/unterminated.lox @@ -0,0 +1,2 @@ +// [line 2] Error: Unterminated string. +"this string has no close quote diff --git a/interpreter/tests/lox/super/bound_method.lox b/interpreter/tests/lox/super/bound_method.lox new file mode 100644 index 0000000..42b60e3 --- /dev/null +++ b/interpreter/tests/lox/super/bound_method.lox @@ -0,0 +1,19 @@ +class A { + method(arg) { + print "A.method(" + arg + ")"; + } +} + +class B < A { + getClosure() { + return super.method; + } + + method(arg) { + print "B.method(" + arg + ")"; + } +} + + +var closure = B().getClosure(); +closure("arg"); // expect: A.method(arg) diff --git a/interpreter/tests/lox/super/call_other_method.lox b/interpreter/tests/lox/super/call_other_method.lox new file mode 100644 index 0000000..d37bfca --- /dev/null +++ b/interpreter/tests/lox/super/call_other_method.lox @@ -0,0 +1,16 @@ +class Base { + foo() { + print "Base.foo()"; + } +} + +class Derived < Base { + bar() { + print "Derived.bar()"; + super.foo(); + } +} + +Derived().bar(); +// expect: Derived.bar() +// expect: Base.foo() diff --git a/interpreter/tests/lox/super/call_same_method.lox b/interpreter/tests/lox/super/call_same_method.lox new file mode 100644 index 0000000..dcd3cc5 --- /dev/null +++ b/interpreter/tests/lox/super/call_same_method.lox @@ -0,0 +1,16 @@ +class Base { + foo() { + print "Base.foo()"; + } +} + +class Derived < Base { + foo() { + print "Derived.foo()"; + super.foo(); + } +} + +Derived().foo(); +// expect: Derived.foo() +// expect: Base.foo() diff --git a/interpreter/tests/lox/super/closure.lox b/interpreter/tests/lox/super/closure.lox new file mode 100644 index 0000000..6887afb --- /dev/null +++ b/interpreter/tests/lox/super/closure.lox @@ -0,0 +1,17 @@ +class Base { + toString() { return "Base"; } +} + +class Derived < Base { + getClosure() { + fun closure() { + return super.toString(); + } + return closure; + } + + toString() { return "Derived"; } +} + +var closure = Derived().getClosure(); +print closure(); // expect: Base diff --git a/interpreter/tests/lox/super/constructor.lox b/interpreter/tests/lox/super/constructor.lox new file mode 100644 index 0000000..eadacd8 --- /dev/null +++ b/interpreter/tests/lox/super/constructor.lox @@ -0,0 +1,16 @@ +class Base { + init(a, b) { + print "Base.init(" + a + ", " + b + ")"; + } +} + +class Derived < Base { + init() { + print "Derived.init()"; + super.init("a", "b"); + } +} + +Derived(); +// expect: Derived.init() +// expect: Base.init(a, b) diff --git a/interpreter/tests/lox/super/extra_arguments.lox b/interpreter/tests/lox/super/extra_arguments.lox new file mode 100644 index 0000000..b6b0735 --- /dev/null +++ b/interpreter/tests/lox/super/extra_arguments.lox @@ -0,0 +1,14 @@ +class Base { + foo(a, b) { + print "Base.foo(" + a + ", " + b + ")"; + } +} + +class Derived < Base { + foo() { + print "Derived.foo()"; // expect: Derived.foo() + super.foo("a", "b", "c", "d"); // expect runtime error: Expected 2 arguments but got 4. + } +} + +Derived().foo(); diff --git a/interpreter/tests/lox/super/indirectly_inherited.lox b/interpreter/tests/lox/super/indirectly_inherited.lox new file mode 100644 index 0000000..0a49e26 --- /dev/null +++ b/interpreter/tests/lox/super/indirectly_inherited.lox @@ -0,0 +1,18 @@ +class A { + foo() { + print "A.foo()"; + } +} + +class B < A {} + +class C < B { + foo() { + print "C.foo()"; + super.foo(); + } +} + +C().foo(); +// expect: C.foo() +// expect: A.foo() diff --git a/interpreter/tests/lox/super/missing_arguments.lox b/interpreter/tests/lox/super/missing_arguments.lox new file mode 100644 index 0000000..e055a6e --- /dev/null +++ b/interpreter/tests/lox/super/missing_arguments.lox @@ -0,0 +1,13 @@ +class Base { + foo(a, b) { + print "Base.foo(" + a + ", " + b + ")"; + } +} + +class Derived < Base { + foo() { + super.foo(1); // expect runtime error: Expected 2 arguments but got 1. + } +} + +Derived().foo(); diff --git a/interpreter/tests/lox/super/no_superclass_bind.lox b/interpreter/tests/lox/super/no_superclass_bind.lox new file mode 100644 index 0000000..bdb5fd6 --- /dev/null +++ b/interpreter/tests/lox/super/no_superclass_bind.lox @@ -0,0 +1,7 @@ +class Base { + foo() { + super.doesNotExist; // Error at 'super': Can't use 'super' in a class with no superclass. + } +} + +Base().foo(); diff --git a/interpreter/tests/lox/super/no_superclass_call.lox b/interpreter/tests/lox/super/no_superclass_call.lox new file mode 100644 index 0000000..d807e50 --- /dev/null +++ b/interpreter/tests/lox/super/no_superclass_call.lox @@ -0,0 +1,7 @@ +class Base { + foo() { + super.doesNotExist(1); // Error at 'super': Can't use 'super' in a class with no superclass. + } +} + +Base().foo(); diff --git a/interpreter/tests/lox/super/no_superclass_method.lox b/interpreter/tests/lox/super/no_superclass_method.lox new file mode 100644 index 0000000..89e6b17 --- /dev/null +++ b/interpreter/tests/lox/super/no_superclass_method.lox @@ -0,0 +1,9 @@ +class Base {} + +class Derived < Base { + foo() { + super.doesNotExist(1); // expect runtime error: Undefined property 'doesNotExist'. + } +} + +Derived().foo(); diff --git a/interpreter/tests/lox/super/parenthesized.lox b/interpreter/tests/lox/super/parenthesized.lox new file mode 100644 index 0000000..63fdc72 --- /dev/null +++ b/interpreter/tests/lox/super/parenthesized.lox @@ -0,0 +1,10 @@ +class A { + method() {} +} + +class B < A { + method() { + // [line 8] Error at ')': Expect '.' after 'super'. + (super).method(); + } +} diff --git a/interpreter/tests/lox/super/reassign_superclass.lox b/interpreter/tests/lox/super/reassign_superclass.lox new file mode 100644 index 0000000..cd918f8 --- /dev/null +++ b/interpreter/tests/lox/super/reassign_superclass.lox @@ -0,0 +1,22 @@ +class Base { + method() { + print "Base.method()"; + } +} + +class Derived < Base { + method() { + super.method(); + } +} + +class OtherBase { + method() { + print "OtherBase.method()"; + } +} + +var derived = Derived(); +derived.method(); // expect: Base.method() +Base = OtherBase; +derived.method(); // expect: Base.method() diff --git a/interpreter/tests/lox/super/super_at_top_level.lox b/interpreter/tests/lox/super/super_at_top_level.lox new file mode 100644 index 0000000..83c4213 --- /dev/null +++ b/interpreter/tests/lox/super/super_at_top_level.lox @@ -0,0 +1,2 @@ +super.foo("bar"); // Error at 'super': Can't use 'super' outside of a class. +super.foo; // Error at 'super': Can't use 'super' outside of a class. \ No newline at end of file diff --git a/interpreter/tests/lox/super/super_in_closure_in_inherited_method.lox b/interpreter/tests/lox/super/super_in_closure_in_inherited_method.lox new file mode 100644 index 0000000..c158895 --- /dev/null +++ b/interpreter/tests/lox/super/super_in_closure_in_inherited_method.lox @@ -0,0 +1,26 @@ +class A { + say() { + print "A"; + } +} + +class B < A { + getClosure() { + fun closure() { + super.say(); + } + return closure; + } + + say() { + print "B"; + } +} + +class C < B { + say() { + print "C"; + } +} + +C().getClosure()(); // expect: A diff --git a/interpreter/tests/lox/super/super_in_inherited_method.lox b/interpreter/tests/lox/super/super_in_inherited_method.lox new file mode 100644 index 0000000..a90e42a --- /dev/null +++ b/interpreter/tests/lox/super/super_in_inherited_method.lox @@ -0,0 +1,23 @@ +class A { + say() { + print "A"; + } +} + +class B < A { + test() { + super.say(); + } + + say() { + print "B"; + } +} + +class C < B { + say() { + print "C"; + } +} + +C().test(); // expect: A diff --git a/interpreter/tests/lox/super/super_in_top_level_function.lox b/interpreter/tests/lox/super/super_in_top_level_function.lox new file mode 100644 index 0000000..42997b1 --- /dev/null +++ b/interpreter/tests/lox/super/super_in_top_level_function.lox @@ -0,0 +1,3 @@ + super.bar(); // Error at 'super': Can't use 'super' outside of a class. +fun foo() { +} \ No newline at end of file diff --git a/interpreter/tests/lox/super/super_without_dot.lox b/interpreter/tests/lox/super/super_without_dot.lox new file mode 100644 index 0000000..3fe95a7 --- /dev/null +++ b/interpreter/tests/lox/super/super_without_dot.lox @@ -0,0 +1,8 @@ +class A {} + +class B < A { + method() { + // [line 6] Error at ';': Expect '.' after 'super'. + super; + } +} diff --git a/interpreter/tests/lox/super/super_without_name.lox b/interpreter/tests/lox/super/super_without_name.lox new file mode 100644 index 0000000..5917031 --- /dev/null +++ b/interpreter/tests/lox/super/super_without_name.lox @@ -0,0 +1,7 @@ +class A {} + +class B < A { + method() { + super.; // Error at ';': Expect superclass method name. + } +} diff --git a/interpreter/tests/lox/super/this_in_superclass_method.lox b/interpreter/tests/lox/super/this_in_superclass_method.lox new file mode 100644 index 0000000..57e58ab --- /dev/null +++ b/interpreter/tests/lox/super/this_in_superclass_method.lox @@ -0,0 +1,16 @@ +class Base { + init(a) { + this.a = a; + } +} + +class Derived < Base { + init(a, b) { + super.init(a); + this.b = b; + } +} + +var derived = Derived("a", "b"); +print derived.a; // expect: a +print derived.b; // expect: b diff --git a/interpreter/tests/lox/this/closure.lox b/interpreter/tests/lox/this/closure.lox new file mode 100644 index 0000000..b850963 --- /dev/null +++ b/interpreter/tests/lox/this/closure.lox @@ -0,0 +1,13 @@ +class Foo { + getClosure() { + fun closure() { + return this.toString(); + } + return closure; + } + + toString() { return "Foo"; } +} + +var closure = Foo().getClosure(); +print closure(); // expect: Foo diff --git a/interpreter/tests/lox/this/nested_class.lox b/interpreter/tests/lox/this/nested_class.lox new file mode 100644 index 0000000..588f101 --- /dev/null +++ b/interpreter/tests/lox/this/nested_class.lox @@ -0,0 +1,20 @@ +class Outer { + method() { + print this; // expect: Outer instance + + fun f() { + print this; // expect: Outer instance + + class Inner { + method() { + print this; // expect: Inner instance + } + } + + Inner().method(); + } + f(); + } +} + +Outer().method(); diff --git a/interpreter/tests/lox/this/nested_closure.lox b/interpreter/tests/lox/this/nested_closure.lox new file mode 100644 index 0000000..7c0f04f --- /dev/null +++ b/interpreter/tests/lox/this/nested_closure.lox @@ -0,0 +1,19 @@ +class Foo { + getClosure() { + fun f() { + fun g() { + fun h() { + return this.toString(); + } + return h; + } + return g; + } + return f; + } + + toString() { return "Foo"; } +} + +var closure = Foo().getClosure(); +print closure()()(); // expect: Foo diff --git a/interpreter/tests/lox/this/this_at_top_level.lox b/interpreter/tests/lox/this/this_at_top_level.lox new file mode 100644 index 0000000..918c806 --- /dev/null +++ b/interpreter/tests/lox/this/this_at_top_level.lox @@ -0,0 +1 @@ +this; // Error at 'this': Can't use 'this' outside of a class. diff --git a/interpreter/tests/lox/this/this_in_method.lox b/interpreter/tests/lox/this/this_in_method.lox new file mode 100644 index 0000000..e32dbba --- /dev/null +++ b/interpreter/tests/lox/this/this_in_method.lox @@ -0,0 +1,6 @@ +class Foo { + bar() { return this; } + baz() { return "baz"; } +} + +print Foo().bar().baz(); // expect: baz diff --git a/interpreter/tests/lox/this/this_in_top_level_function.lox b/interpreter/tests/lox/this/this_in_top_level_function.lox new file mode 100644 index 0000000..a564c43 --- /dev/null +++ b/interpreter/tests/lox/this/this_in_top_level_function.lox @@ -0,0 +1,3 @@ +fun foo() { + this; // Error at 'this': Can't use 'this' outside of a class. +} diff --git a/interpreter/tests/lox/unexpected_character.lox b/interpreter/tests/lox/unexpected_character.lox new file mode 100644 index 0000000..5e51396 --- /dev/null +++ b/interpreter/tests/lox/unexpected_character.lox @@ -0,0 +1,3 @@ +// [line 3] Error: Unexpected character. +// [java line 3] Error at 'b': Expect ')' after arguments. +foo(a | b); diff --git a/interpreter/tests/lox/variable/collide_with_parameter.lox b/interpreter/tests/lox/variable/collide_with_parameter.lox new file mode 100644 index 0000000..2c06bd1 --- /dev/null +++ b/interpreter/tests/lox/variable/collide_with_parameter.lox @@ -0,0 +1,3 @@ +fun foo(a) { + var a; // Error at 'a': Already a variable with this name in this scope. +} diff --git a/interpreter/tests/lox/variable/duplicate_local.lox b/interpreter/tests/lox/variable/duplicate_local.lox new file mode 100644 index 0000000..77cb951 --- /dev/null +++ b/interpreter/tests/lox/variable/duplicate_local.lox @@ -0,0 +1,4 @@ +{ + var a = "value"; + var a = "other"; // Error at 'a': Already a variable with this name in this scope. +} diff --git a/interpreter/tests/lox/variable/duplicate_parameter.lox b/interpreter/tests/lox/variable/duplicate_parameter.lox new file mode 100644 index 0000000..23c5049 --- /dev/null +++ b/interpreter/tests/lox/variable/duplicate_parameter.lox @@ -0,0 +1,4 @@ +fun foo(arg, + arg) { // Error at 'arg': Already a variable with this name in this scope. + "body"; +} diff --git a/interpreter/tests/lox/variable/early_bound.lox b/interpreter/tests/lox/variable/early_bound.lox new file mode 100644 index 0000000..4da3304 --- /dev/null +++ b/interpreter/tests/lox/variable/early_bound.lox @@ -0,0 +1,10 @@ +var a = "outer"; +{ + fun foo() { + print a; + } + + foo(); // expect: outer + var a = "inner"; + foo(); // expect: outer +} diff --git a/interpreter/tests/lox/variable/in_middle_of_block.lox b/interpreter/tests/lox/variable/in_middle_of_block.lox new file mode 100644 index 0000000..02a6ef7 --- /dev/null +++ b/interpreter/tests/lox/variable/in_middle_of_block.lox @@ -0,0 +1,10 @@ +{ + var a = "a"; + print a; // expect: a + var b = a + " b"; + print b; // expect: a b + var c = a + " c"; + print c; // expect: a c + var d = b + " d"; + print d; // expect: a b d +} diff --git a/interpreter/tests/lox/variable/in_nested_block.lox b/interpreter/tests/lox/variable/in_nested_block.lox new file mode 100644 index 0000000..5257fbe --- /dev/null +++ b/interpreter/tests/lox/variable/in_nested_block.lox @@ -0,0 +1,6 @@ +{ + var a = "outer"; + { + print a; // expect: outer + } +} \ No newline at end of file diff --git a/interpreter/tests/lox/variable/local_from_method.lox b/interpreter/tests/lox/variable/local_from_method.lox new file mode 100644 index 0000000..216ed54 --- /dev/null +++ b/interpreter/tests/lox/variable/local_from_method.lox @@ -0,0 +1,9 @@ +var foo = "variable"; + +class Foo { + method() { + print foo; + } +} + +Foo().method(); // expect: variable diff --git a/interpreter/tests/lox/variable/redeclare_global.lox b/interpreter/tests/lox/variable/redeclare_global.lox new file mode 100644 index 0000000..ed6cc2c --- /dev/null +++ b/interpreter/tests/lox/variable/redeclare_global.lox @@ -0,0 +1,3 @@ +var a = "1"; +var a; +print a; // expect: nil diff --git a/interpreter/tests/lox/variable/redefine_global.lox b/interpreter/tests/lox/variable/redefine_global.lox new file mode 100644 index 0000000..82d08c0 --- /dev/null +++ b/interpreter/tests/lox/variable/redefine_global.lox @@ -0,0 +1,3 @@ +var a = "1"; +var a = "2"; +print a; // expect: 2 diff --git a/interpreter/tests/lox/variable/scope_reuse_in_different_blocks.lox b/interpreter/tests/lox/variable/scope_reuse_in_different_blocks.lox new file mode 100644 index 0000000..e47932f --- /dev/null +++ b/interpreter/tests/lox/variable/scope_reuse_in_different_blocks.lox @@ -0,0 +1,9 @@ +{ + var a = "first"; + print a; // expect: first +} + +{ + var a = "second"; + print a; // expect: second +} diff --git a/interpreter/tests/lox/variable/shadow_and_local.lox b/interpreter/tests/lox/variable/shadow_and_local.lox new file mode 100644 index 0000000..6bbecbf --- /dev/null +++ b/interpreter/tests/lox/variable/shadow_and_local.lox @@ -0,0 +1,8 @@ +{ + var a = "outer"; + { + print a; // expect: outer + var a = "inner"; + print a; // expect: inner + } +} \ No newline at end of file diff --git a/interpreter/tests/lox/variable/shadow_global.lox b/interpreter/tests/lox/variable/shadow_global.lox new file mode 100644 index 0000000..fb7d68d --- /dev/null +++ b/interpreter/tests/lox/variable/shadow_global.lox @@ -0,0 +1,6 @@ +var a = "global"; +{ + var a = "shadow"; + print a; // expect: shadow +} +print a; // expect: global diff --git a/interpreter/tests/lox/variable/shadow_local.lox b/interpreter/tests/lox/variable/shadow_local.lox new file mode 100644 index 0000000..bdbfd10 --- /dev/null +++ b/interpreter/tests/lox/variable/shadow_local.lox @@ -0,0 +1,8 @@ +{ + var a = "local"; + { + var a = "shadow"; + print a; // expect: shadow + } + print a; // expect: local +} diff --git a/interpreter/tests/lox/variable/undefined_global.lox b/interpreter/tests/lox/variable/undefined_global.lox new file mode 100644 index 0000000..5ac89b8 --- /dev/null +++ b/interpreter/tests/lox/variable/undefined_global.lox @@ -0,0 +1 @@ +print notDefined; // expect runtime error: Undefined variable 'notDefined'. diff --git a/interpreter/tests/lox/variable/undefined_local.lox b/interpreter/tests/lox/variable/undefined_local.lox new file mode 100644 index 0000000..d196d59 --- /dev/null +++ b/interpreter/tests/lox/variable/undefined_local.lox @@ -0,0 +1,3 @@ +{ + print notDefined; // expect runtime error: Undefined variable 'notDefined'. +} diff --git a/interpreter/tests/lox/variable/uninitialized.lox b/interpreter/tests/lox/variable/uninitialized.lox new file mode 100644 index 0000000..4b174bb --- /dev/null +++ b/interpreter/tests/lox/variable/uninitialized.lox @@ -0,0 +1,2 @@ +var a; +print a; // expect: nil diff --git a/interpreter/tests/lox/variable/unreached_undefined.lox b/interpreter/tests/lox/variable/unreached_undefined.lox new file mode 100644 index 0000000..e7bf633 --- /dev/null +++ b/interpreter/tests/lox/variable/unreached_undefined.lox @@ -0,0 +1,5 @@ +if (false) { + print notDefined; +} + +print "ok"; // expect: ok diff --git a/interpreter/tests/lox/variable/use_false_as_var.lox b/interpreter/tests/lox/variable/use_false_as_var.lox new file mode 100644 index 0000000..206d51e --- /dev/null +++ b/interpreter/tests/lox/variable/use_false_as_var.lox @@ -0,0 +1,2 @@ +// [line 2] Error at 'false': Expect variable name. +var false = "value"; diff --git a/interpreter/tests/lox/variable/use_global_in_initializer.lox b/interpreter/tests/lox/variable/use_global_in_initializer.lox new file mode 100644 index 0000000..6e59cd5 --- /dev/null +++ b/interpreter/tests/lox/variable/use_global_in_initializer.lox @@ -0,0 +1,3 @@ +var a = "value"; +var a = a; +print a; // expect: value diff --git a/interpreter/tests/lox/variable/use_local_in_initializer.lox b/interpreter/tests/lox/variable/use_local_in_initializer.lox new file mode 100644 index 0000000..797a13c --- /dev/null +++ b/interpreter/tests/lox/variable/use_local_in_initializer.lox @@ -0,0 +1,4 @@ +var a = "outer"; +{ + var a = a; // Error at 'a': Can't read local variable in its own initializer. +} diff --git a/interpreter/tests/lox/variable/use_nil_as_var.lox b/interpreter/tests/lox/variable/use_nil_as_var.lox new file mode 100644 index 0000000..7624bce --- /dev/null +++ b/interpreter/tests/lox/variable/use_nil_as_var.lox @@ -0,0 +1,2 @@ +// [line 2] Error at 'nil': Expect variable name. +var nil = "value"; diff --git a/interpreter/tests/lox/variable/use_this_as_var.lox b/interpreter/tests/lox/variable/use_this_as_var.lox new file mode 100644 index 0000000..233a553 --- /dev/null +++ b/interpreter/tests/lox/variable/use_this_as_var.lox @@ -0,0 +1,2 @@ +// [line 2] Error at 'this': Expect variable name. +var this = "value"; diff --git a/interpreter/tests/lox/while/class_in_body.lox b/interpreter/tests/lox/while/class_in_body.lox new file mode 100644 index 0000000..c3cbe95 --- /dev/null +++ b/interpreter/tests/lox/while/class_in_body.lox @@ -0,0 +1,2 @@ +// [line 2] Error at 'class': Expect expression. +while (true) class Foo {} diff --git a/interpreter/tests/lox/while/closure_in_body.lox b/interpreter/tests/lox/while/closure_in_body.lox new file mode 100644 index 0000000..ebe00fa --- /dev/null +++ b/interpreter/tests/lox/while/closure_in_body.lox @@ -0,0 +1,19 @@ +var f1; +var f2; +var f3; + +var i = 1; +while (i < 4) { + var j = i; + fun f() { print j; } + + if (j == 1) f1 = f; + else if (j == 2) f2 = f; + else f3 = f; + + i = i + 1; +} + +f1(); // expect: 1 +f2(); // expect: 2 +f3(); // expect: 3 diff --git a/interpreter/tests/lox/while/fun_in_body.lox b/interpreter/tests/lox/while/fun_in_body.lox new file mode 100644 index 0000000..8a42a48 --- /dev/null +++ b/interpreter/tests/lox/while/fun_in_body.lox @@ -0,0 +1,2 @@ +// [line 2] Error at 'fun': Expect expression. +while (true) fun foo() {} diff --git a/interpreter/tests/lox/while/return_closure.lox b/interpreter/tests/lox/while/return_closure.lox new file mode 100644 index 0000000..fe2ee5a --- /dev/null +++ b/interpreter/tests/lox/while/return_closure.lox @@ -0,0 +1,10 @@ +fun f() { + while (true) { + var i = "i"; + fun g() { print i; } + return g; + } +} + +var h = f(); +h(); // expect: i diff --git a/interpreter/tests/lox/while/return_inside.lox b/interpreter/tests/lox/while/return_inside.lox new file mode 100644 index 0000000..11a7488 --- /dev/null +++ b/interpreter/tests/lox/while/return_inside.lox @@ -0,0 +1,9 @@ +fun f() { + while (true) { + var i = "i"; + return i; + } +} + +print f(); +// expect: i diff --git a/interpreter/tests/lox/while/syntax.lox b/interpreter/tests/lox/while/syntax.lox new file mode 100644 index 0000000..9f0fdeb --- /dev/null +++ b/interpreter/tests/lox/while/syntax.lox @@ -0,0 +1,21 @@ +// Single-expression body. +var c = 0; +while (c < 3) print c = c + 1; +// expect: 1 +// expect: 2 +// expect: 3 + +// Block body. +var a = 0; +while (a < 3) { + print a; + a = a + 1; +} +// expect: 0 +// expect: 1 +// expect: 2 + +// Statement bodies. +while (false) if (true) 1; else 2; +while (false) while (true) 1; +while (false) for (;;) 1; diff --git a/interpreter/tests/lox/while/var_in_body.lox b/interpreter/tests/lox/while/var_in_body.lox new file mode 100644 index 0000000..bafc2fd --- /dev/null +++ b/interpreter/tests/lox/while/var_in_body.lox @@ -0,0 +1,2 @@ +// [line 2] Error at 'var': Expect expression. +while (true) var foo; diff --git a/interpreter/tests/lox_tests.rs b/interpreter/tests/lox_tests.rs new file mode 100644 index 0000000..8969d7f --- /dev/null +++ b/interpreter/tests/lox_tests.rs @@ -0,0 +1,95 @@ +use std::cell::RefCell; +use std::io::stdin; +use std::path::PathBuf; +use std::rc::Rc; + +use rlox2_frontend::lexer::TokenType; +use rlox2_interpreter::{run, Runtime}; + +fn run_test(path: impl Into) { + let path = &path.into(); + // path.insert_str(0, "./tests/lox/"); + + let source = std::fs::read_to_string(path).unwrap(); + + let tokens = rlox2_frontend::lexer::scan_tokens(&source).unwrap(); + + let comments: Vec = tokens + .into_iter() + .filter_map(|token| { + if let TokenType::Comment(s) = token.token_type { + if s.starts_with(" expect: ") { + Some(s.strip_prefix(" expect: ").unwrap().trim().to_owned()) + } else if s.starts_with(" Error") || s.contains("error") { + Some(s.trim().into()) + } else { + None + } + } else { + None + } + }) + .collect(); + + for comment in comments.iter() { + println!("Comment: \"{comment}\"") + } + + print!("\n\n"); + + let output: Vec = Vec::new(); + let output = Rc::new(RefCell::new(output)); + + { + let output: Rc>> = Rc::clone(&output); + let mut runtime = Runtime::new(Rc::new(RefCell::new(stdin())), output); + + match run(&source, &mut runtime) { + Ok(()) => (), + Err(e) => { + println!("{e}"); + + assert_eq!(comments.len(), 1); + + let comment = &*comments[0]; + + assert!(comment.to_lowercase().contains("error")); + + return; + } + } + } + + let mut output = output.as_ref().borrow_mut(); + let output = String::from_utf8(std::mem::take(&mut *output)).unwrap(); + + println!("output: len = {}\n---", output.len()); + println!("{output}"); + println!("---"); + + let lines: Vec = output + .split_terminator('\n') + .map(|s| s.to_owned()) + .collect(); + + assert_eq!(lines.len(), comments.len()); + + for (line, comment) in std::iter::zip(lines.into_iter(), comments.into_iter()) { + assert_eq!(line, comment); + } +} + +#[test] +fn run_all_tests() { + for lox_file in glob::glob("tests/lox/**/*.lox").unwrap() { + let lox_file = lox_file.unwrap(); + + print!("\n\n\n"); + println!( + "================================================================================\n" + ); + println!("Running test for file {}\n", lox_file.display()); + + run_test(lox_file); + } +}