From 2f3a94678fc5847653b31a8125d2e7f1838c8366 Mon Sep 17 00:00:00 2001 From: Jeremy Ashkenas Date: Wed, 27 Jan 2010 07:55:40 -0500 Subject: [PATCH 01/37] fixing instanceof, with a quick test --- lib/coffee_script/rewriter.rb | 2 +- test/fixtures/execution/test_functions.coffee | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/coffee_script/rewriter.rb b/lib/coffee_script/rewriter.rb index d085c8f718..287d11c24a 100644 --- a/lib/coffee_script/rewriter.rb +++ b/lib/coffee_script/rewriter.rb @@ -22,7 +22,7 @@ class Rewriter IMPLICIT_FUNC = [:IDENTIFIER, :SUPER, ')', :CALL_END, ']', :INDEX_END] IMPLICIT_END = [:IF, :UNLESS, :FOR, :WHILE, "\n", :OUTDENT] IMPLICIT_CALL = [:IDENTIFIER, :NUMBER, :STRING, :JS, :REGEX, :NEW, :PARAM_START, - :TRY, :DELETE, :INSTANCEOF, :TYPEOF, :SWITCH, :ARGUMENTS, + :TRY, :DELETE, :TYPEOF, :SWITCH, :ARGUMENTS, :TRUE, :FALSE, :YES, :NO, :ON, :OFF, '!', '!!', :NOT, '->', '=>', '[', '(', '{'] diff --git a/test/fixtures/execution/test_functions.coffee b/test/fixtures/execution/test_functions.coffee index 50552ce347..0aa4939be4 100644 --- a/test/fixtures/execution/test_functions.coffee +++ b/test/fixtures/execution/test_functions.coffee @@ -4,6 +4,7 @@ y.x: -> 3 print x is 1 print typeof(y.x) is 'function' +print y.x instanceof Function print y.x() is 3 print y.x.name is 'x' From 5b2ab36246e25dbce6dd122b5d7deaac7a50b6ea Mon Sep 17 00:00:00 2001 From: Jeremy Ashkenas Date: Wed, 27 Jan 2010 08:01:18 -0500 Subject: [PATCH 02/37] CoffeeScript 0.3.1, quick patch for 'instanceof' --- coffee-script.gemspec | 4 ++-- documentation/index.html.erb | 2 +- index.html | 2 +- lib/coffee-script.rb | 2 +- package.json | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/coffee-script.gemspec b/coffee-script.gemspec index 8fdf3e5341..164844b22c 100644 --- a/coffee-script.gemspec +++ b/coffee-script.gemspec @@ -1,7 +1,7 @@ Gem::Specification.new do |s| s.name = 'coffee-script' - s.version = '0.3.0' # Keep version in sync with coffee-script.rb - s.date = '2010-1-26' + s.version = '0.3.1' # Keep version in sync with coffee-script.rb + s.date = '2010-1-27' s.homepage = "http://jashkenas.github.com/coffee-script/" s.summary = "The CoffeeScript Compiler" diff --git a/documentation/index.html.erb b/documentation/index.html.erb index 6ab260f8c0..cf7b287197 100644 --- a/documentation/index.html.erb +++ b/documentation/index.html.erb @@ -51,7 +51,7 @@

Latest Version: - 0.3.0 + 0.3.1

Table of Contents

diff --git a/index.html b/index.html index 86ed85b874..b6c9b27b48 100644 --- a/index.html +++ b/index.html @@ -37,7 +37,7 @@

CoffeeScript

Latest Version: - 0.3.0 + 0.3.1

Table of Contents

diff --git a/lib/coffee-script.rb b/lib/coffee-script.rb index 73189edd60..35fe16ab1b 100644 --- a/lib/coffee-script.rb +++ b/lib/coffee-script.rb @@ -10,7 +10,7 @@ # Namespace for all CoffeeScript internal classes. module CoffeeScript - VERSION = '0.3.0' # Keep in sync with the gemspec. + VERSION = '0.3.1' # Keep in sync with the gemspec. # Compile a script (String or IO) to JavaScript. def self.compile(script, options={}) diff --git a/package.json b/package.json index e891cfa1d0..7db27d07ef 100644 --- a/package.json +++ b/package.json @@ -5,5 +5,5 @@ "description": "Unfancy JavaScript", "keywords": ["javascript", "language"], "author": "Jeremy Ashkenas", - "version": "0.3.0" + "version": "0.3.1" } From 83285fe17069f53f7ad0bff82f8f6e5e275b2504 Mon Sep 17 00:00:00 2001 From: Jeremy Ashkenas Date: Wed, 27 Jan 2010 16:38:49 -0500 Subject: [PATCH 03/37] updating resources section with rack-coffee --- documentation/index.html.erb | 17 ++++++++++++----- index.html | 17 ++++++++++++----- 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/documentation/index.html.erb b/documentation/index.html.erb index cf7b287197..aefebf9aac 100644 --- a/documentation/index.html.erb +++ b/documentation/index.html.erb @@ -632,13 +632,14 @@ coffee --print app/scripts/*.coffee > concatenation.js create and install a custom version of the gem.
  • - Bugs, Feature Requests, and General Discussion + CoffeeScript Issues
    + Bugs reports, feature requests, and general discussion all belong here.
  • - CoffeePot
    - An implementation of CoffeeScript, written in CoffeeScript, by - Tim Caswell. Compiles just - a limited subset at this point. + rack-coffee
    + Rack middleware for serving CoffeeScripts as JavaScript directly to + the browser, without having to compile them first. From + Matt Lyon.
  • BistroCar
    @@ -653,6 +654,12 @@ coffee --print app/scripts/*.coffee > concatenation.js Ivan Nemytchenko, that embeds snippets of CoffeeScript within your HAML templates.
  • +
  • + CoffeePot
    + An implementation of CoffeeScript, written in CoffeeScript, by + Tim Caswell. Compiles just + a limited subset at this point. +
  • Change Log

    diff --git a/index.html b/index.html index b6c9b27b48..c780982d3c 100644 --- a/index.html +++ b/index.html @@ -1497,13 +1497,14 @@

    Resources

    create and install a custom version of the gem.
  • - Bugs, Feature Requests, and General Discussion + CoffeeScript Issues
    + Bugs reports, feature requests, and general discussion all belong here.
  • - CoffeePot
    - An implementation of CoffeeScript, written in CoffeeScript, by - Tim Caswell. Compiles just - a limited subset at this point. + rack-coffee
    + Rack middleware for serving CoffeeScripts as JavaScript directly to + the browser, without having to compile them first. From + Matt Lyon.
  • BistroCar
    @@ -1518,6 +1519,12 @@

    Resources

    Ivan Nemytchenko, that embeds snippets of CoffeeScript within your HAML templates.
  • +
  • + CoffeePot
    + An implementation of CoffeeScript, written in CoffeeScript, by + Tim Caswell. Compiles just + a limited subset at this point. +
  • Change Log

    From ba2d9df25f614fdec150ec28ca25d61baa5ab9cc Mon Sep 17 00:00:00 2001 From: Jeremy Ashkenas Date: Fri, 29 Jan 2010 22:51:51 -0500 Subject: [PATCH 04/37] first draft of node.js REPL --- lib/coffee_script/coffee-script.js | 20 ++++++++++++++++++ lib/coffee_script/command_line.rb | 2 +- lib/coffee_script/repl.js | 33 ++++++++++++++++++++++++++++++ src/coffee-script.coffee | 15 ++++++++++++++ src/repl.coffee | 26 +++++++++++++++++++++++ 5 files changed, 95 insertions(+), 1 deletion(-) create mode 100644 lib/coffee_script/coffee-script.js create mode 100644 lib/coffee_script/repl.js create mode 100644 src/coffee-script.coffee create mode 100644 src/repl.coffee diff --git a/lib/coffee_script/coffee-script.js b/lib/coffee_script/coffee-script.js new file mode 100644 index 0000000000..8ed114479a --- /dev/null +++ b/lib/coffee_script/coffee-script.js @@ -0,0 +1,20 @@ +(function(){ + var sys; + // Executes the `coffee` Ruby program to convert from CoffeeScript to JavaScript. + sys = require('sys'); + exports.compile = function compile(code, callback) { + var coffee, js; + js = ''; + coffee = process.createChildProcess('coffee', ['--eval', '--no-wrap', '--globals']); + coffee.addListener('output', function(results) { + if ((typeof results !== "undefined" && results !== null)) { + return js += results; + } + }); + coffee.addListener('exit', function() { + return callback(js); + }); + coffee.write(code); + return coffee.close(); + }; +})(); \ No newline at end of file diff --git a/lib/coffee_script/command_line.rb b/lib/coffee_script/command_line.rb index 2427169a1c..b2e4dba124 100644 --- a/lib/coffee_script/command_line.rb +++ b/lib/coffee_script/command_line.rb @@ -118,7 +118,7 @@ def eval_scriptlet def launch_repl exec "#{LAUNCHER}" rescue Errno::ENOENT - puts "Error: Narwhal must be installed to use the interactive REPL." + puts "Error: Node.js must be installed to use the interactive REPL." exit(1) end diff --git a/lib/coffee_script/repl.js b/lib/coffee_script/repl.js new file mode 100644 index 0000000000..0a0dfee414 --- /dev/null +++ b/lib/coffee_script/repl.js @@ -0,0 +1,33 @@ +(function(){ + var coffee, prompt, quit, readline, run; + // A CoffeeScript port/version of the Node.js REPL. + // Required modules. + coffee = require('./coffee-script'); + process.mixin(require('sys')); + // Shortcut variables. + prompt = 'coffee> '; + quit = function quit() { + return process.stdio.close(); + }; + // The main REPL function. Called everytime a line of code is entered. + readline = function readline(code) { + return coffee.compile(code, run); + }; + // Attempt to evaluate the command. If there's an exception, print it. + run = function run(js) { + var val; + try { + val = eval(js); + if (val !== undefined) { + p(val); + } + } catch (err) { + puts(err.stack || err.toString()); + } + return print(prompt); + }; + // Start up the REPL. + process.stdio.open(); + process.stdio.addListener('data', readline); + print(prompt); +})(); \ No newline at end of file diff --git a/src/coffee-script.coffee b/src/coffee-script.coffee new file mode 100644 index 0000000000..602032aa19 --- /dev/null +++ b/src/coffee-script.coffee @@ -0,0 +1,15 @@ +# Executes the `coffee` Ruby program to convert from CoffeeScript to JavaScript. + +sys: require('sys') + +exports.compile: (code, callback) -> + js: '' + coffee: process.createChildProcess 'coffee', ['--eval', '--no-wrap', '--globals'] + coffee.addListener 'output', (results) -> + js += results if results? + coffee.addListener 'exit', -> + callback(js) + coffee.write(code) + coffee.close() + + diff --git a/src/repl.coffee b/src/repl.coffee new file mode 100644 index 0000000000..1ab9c70b14 --- /dev/null +++ b/src/repl.coffee @@ -0,0 +1,26 @@ +# A CoffeeScript port/version of the Node.js REPL. + +# Required modules. +coffee: require './coffee-script' +process.mixin require 'sys' + +# Shortcut variables. +prompt: 'coffee> ' +quit: -> process.stdio.close() + +# The main REPL function. Called everytime a line of code is entered. +readline: (code) -> coffee.compile code, run + +# Attempt to evaluate the command. If there's an exception, print it. +run: (js) -> + try + val: eval(js) + p val if val isnt undefined + catch err + puts err.stack or err.toString() + print prompt + +# Start up the REPL. +process.stdio.open() +process.stdio.addListener 'data', readline +print prompt \ No newline at end of file From e08e99a403cbb36bd34832d168731bb203e97444 Mon Sep 17 00:00:00 2001 From: Jeremy Ashkenas Date: Fri, 29 Jan 2010 22:53:44 -0500 Subject: [PATCH 05/37] implementing the Node REPL. --- lib/coffee_script/command_line.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/coffee_script/command_line.rb b/lib/coffee_script/command_line.rb index b2e4dba124..1a1b26e7a6 100644 --- a/lib/coffee_script/command_line.rb +++ b/lib/coffee_script/command_line.rb @@ -116,7 +116,7 @@ def eval_scriptlet # Use Narwhal to run an interactive CoffeeScript session. def launch_repl - exec "#{LAUNCHER}" + exec "node #{ROOT}/lib/coffee_script/repl.js" rescue Errno::ENOENT puts "Error: Node.js must be installed to use the interactive REPL." exit(1) From f5a37035cf6d285372f26780344799da3ea9a4ea Mon Sep 17 00:00:00 2001 From: Jeremy Ashkenas Date: Fri, 29 Jan 2010 23:30:54 -0500 Subject: [PATCH 06/37] node conversion finished, narwhal removed. --- Rakefile | 7 +- documentation/index.html.erb | 8 +- examples/beautiful_code/binary_search.coffee | 6 +- .../beautiful_code/quicksort_runtime.coffee | 6 +- .../regular_expression_matcher.coffee | 12 +-- .../computer_science/binary_search.coffee | 8 +- examples/computer_science/bubble_sort.coffee | 4 +- examples/computer_science/linked_list.coffee | 20 ++--- .../computer_science/luhn_algorithm.coffee | 6 +- examples/computer_science/merge_sort.coffee | 4 +- .../computer_science/selection_sort.coffee | 4 +- index.html | 8 +- lib/coffee_script/coffee-script.js | 13 +++ lib/coffee_script/command_line.rb | 15 ++-- .../narwhal/coffee-script.coffee | 62 -------------- .../narwhal/lib/coffee-script.js | 80 ------------------- .../narwhal/lib/coffee-script/loader.js | 21 ----- lib/coffee_script/narwhal/loader.coffee | 19 ----- lib/coffee_script/runner.js | 10 +++ package.json | 4 +- src/coffee-script.coffee | 8 ++ src/runner.coffee | 6 ++ test/fixtures/execution/test_arguments.coffee | 10 +-- .../execution/test_array_comprehension.coffee | 16 ++-- .../fixtures/execution/test_assignment.coffee | 6 +- test/fixtures/execution/test_blocks.coffee | 2 +- .../execution/test_calling_super.coffee | 4 +- .../execution/test_chained_calls.coffee | 6 +- .../test_destructuring_assignment.coffee | 22 ++--- .../fixtures/execution/test_everything.coffee | 2 +- test/fixtures/execution/test_existence.coffee | 24 +++--- .../execution/test_expressions.coffee | 6 +- .../execution/test_fancy_if_statement.coffee | 6 +- test/fixtures/execution/test_functions.coffee | 36 ++++----- .../execution/test_funky_comments.coffee | 2 +- test/fixtures/execution/test_heredocs.coffee | 12 +-- .../execution/test_lexical_scope.coffee | 4 +- test/fixtures/execution/test_literals.coffee | 14 ++-- .../test_nested_comprehensions.coffee | 6 +- .../execution/test_newline_escaping.coffee | 2 +- .../fixtures/execution/test_operations.coffee | 10 +-- .../execution/test_range_comprehension.coffee | 6 +- .../execution/test_ranges_and_slices.coffee | 4 +- test/fixtures/execution/test_splats.coffee | 10 +-- test/fixtures/execution/test_splices.coffee | 2 +- test/fixtures/execution/test_switch.coffee | 10 +-- test/fixtures/execution/test_while.coffee | 6 +- .../statements_as_expressions.coffee | 6 +- 48 files changed, 208 insertions(+), 357 deletions(-) delete mode 100644 lib/coffee_script/narwhal/coffee-script.coffee delete mode 100644 lib/coffee_script/narwhal/lib/coffee-script.js delete mode 100644 lib/coffee_script/narwhal/lib/coffee-script/loader.js delete mode 100644 lib/coffee_script/narwhal/loader.coffee create mode 100644 lib/coffee_script/runner.js create mode 100644 src/runner.coffee diff --git a/Rakefile b/Rakefile index ce2a0b9783..bcf10d3067 100644 --- a/Rakefile +++ b/Rakefile @@ -17,10 +17,9 @@ namespace :build do sh "racc #{args[:racc_args]} -o lib/coffee_script/parser.rb lib/coffee_script/grammar.y" end - desc "Compile the Narwhal interface for --interactive and --run" - task :narwhal do - sh "bin/coffee lib/coffee_script/narwhal/*.coffee -o lib/coffee_script/narwhal/lib/coffee-script" - sh "mv lib/coffee_script/narwhal/lib/coffee-script/coffee-script.js lib/coffee_script/narwhal/lib/coffee-script.js" + desc "Continually compile the CoffeeScript/Node.js components with --watch" + task :node do + sh "bin/coffee -w src/*.coffee -o lib/coffee_script/" end desc "Compile and install the Ultraviolet syntax highlighter" diff --git a/documentation/index.html.erb b/documentation/index.html.erb index aefebf9aac..4adcd47e3e 100644 --- a/documentation/index.html.erb +++ b/documentation/index.html.erb @@ -118,7 +118,7 @@ gem install coffee-script Installing the gem provides the coffee command, which can be used to compile CoffeeScript .coffee files into JavaScript, as well as debug them. In conjunction with - Narwhal, the coffee + Node.js, the coffee command also provides direct evaluation and an interactive REPL. When compiling to JavaScript, coffee writes the output as .js files in the same directory by default, but output @@ -130,14 +130,14 @@ gem install coffee-script -i, --interactive Launch an interactive CoffeeScript session. - Requires Narwhal. + Requires Node.js. -r, --run Compile and execute scripts without saving the intermediate - JavaScript. Requires Narwhal. + JavaScript. Requires Node.js. @@ -194,7 +194,7 @@ gem install coffee-script -n, --no-wrap Compile the JavaScript without the top-level function safety wrapper. - (Used for CoffeeScript as a Narwhal module.) + (Used for CoffeeScript as a Node.js module.) diff --git a/examples/beautiful_code/binary_search.coffee b/examples/beautiful_code/binary_search.coffee index 9c6e02d1c1..8a1456a080 100644 --- a/examples/beautiful_code/binary_search.coffee +++ b/examples/beautiful_code/binary_search.coffee @@ -11,6 +11,6 @@ index: (list, target) -> if val < target then low: mid + 1 else high: mid return -1 -print(2 is index([10, 20, 30, 40, 50], 30)) -print(4 is index([-97, 35, 67, 88, 1200], 1200)) -print(0 is index([0, 45, 70], 0)) \ No newline at end of file +puts 2 is index([10, 20, 30, 40, 50], 30) +puts 4 is index([-97, 35, 67, 88, 1200], 1200) +puts 0 is index([0, 45, 70], 0) \ No newline at end of file diff --git a/examples/beautiful_code/quicksort_runtime.coffee b/examples/beautiful_code/quicksort_runtime.coffee index affd775a5e..6e9677f202 100644 --- a/examples/beautiful_code/quicksort_runtime.coffee +++ b/examples/beautiful_code/quicksort_runtime.coffee @@ -8,6 +8,6 @@ runtime: (N) -> t: n - 1 + sum / n t -print(runtime(3) is 2.6666666666666665) -print(runtime(5) is 7.4) -print(runtime(8) is 16.92142857142857) +puts runtime(3) is 2.6666666666666665 +puts runtime(5) is 7.4 +puts runtime(8) is 16.92142857142857 diff --git a/examples/beautiful_code/regular_expression_matcher.coffee b/examples/beautiful_code/regular_expression_matcher.coffee index 4ef8237e11..903c15d25a 100644 --- a/examples/beautiful_code/regular_expression_matcher.coffee +++ b/examples/beautiful_code/regular_expression_matcher.coffee @@ -26,9 +26,9 @@ match_star: (c, regexp, text) -> return false unless text and (text[0] is c or c is '.') text: text.slice(1) -print(match("ex", "some text")) -print(match("s..t", "spit")) -print(match("^..t", "buttercup")) -print(match("i..$", "cherries")) -print(match("o*m", "vrooooommm!")) -print(match("^hel*o$", "hellllllo")) \ No newline at end of file +puts match("ex", "some text") +puts match("s..t", "spit") +puts match("^..t", "buttercup") +puts match("i..$", "cherries") +puts match("o*m", "vrooooommm!") +puts match("^hel*o$", "hellllllo") \ No newline at end of file diff --git a/examples/computer_science/binary_search.coffee b/examples/computer_science/binary_search.coffee index 443eaaa0fe..2c5e020edf 100644 --- a/examples/computer_science/binary_search.coffee +++ b/examples/computer_science/binary_search.coffee @@ -19,7 +19,7 @@ binary_search: (items, value) -> # Test the function. -print(2 is binary_search([10, 20, 30, 40, 50], 30)) -print(4 is binary_search([-97, 35, 67, 88, 1200], 1200)) -print(0 is binary_search([0, 45, 70], 0)) -print(-1 is binary_search([0, 45, 70], 10)) \ No newline at end of file +puts(2 is binary_search([10, 20, 30, 40, 50], 30)) +puts(4 is binary_search([-97, 35, 67, 88, 1200], 1200)) +puts(0 is binary_search([0, 45, 70], 0)) +puts(-1 is binary_search([0, 45, 70], 10)) \ No newline at end of file diff --git a/examples/computer_science/bubble_sort.coffee b/examples/computer_science/bubble_sort.coffee index f671bedd98..f27a04df82 100644 --- a/examples/computer_science/bubble_sort.coffee +++ b/examples/computer_science/bubble_sort.coffee @@ -7,5 +7,5 @@ bubble_sort: (list) -> # Test the function. -print(bubble_sort([3, 2, 1]).join(' ') is '1 2 3') -print(bubble_sort([9, 2, 7, 0, 1]).join(' ') is '0 1 2 7 9') \ No newline at end of file +puts(bubble_sort([3, 2, 1]).join(' ') is '1 2 3') +puts(bubble_sort([9, 2, 7, 0, 1]).join(' ') is '0 1 2 7 9') \ No newline at end of file diff --git a/examples/computer_science/linked_list.coffee b/examples/computer_science/linked_list.coffee index 6af3fddfd0..1d38e175d8 100644 --- a/examples/computer_science/linked_list.coffee +++ b/examples/computer_science/linked_list.coffee @@ -91,16 +91,16 @@ LinkedList::toString: -> this.toArray().toString() list: new LinkedList() list.add("Hi") -print(list.size() is 1) -print(list.item(0) is "Hi") -print(list.item(1) is null) +puts(list.size() is 1) +puts(list.item(0) is "Hi") +puts(list.item(1) is null) list: new LinkedList() list.add("zero").add("one").add("two") -print(list.size() is 3) -print(list.item(2) is "two") -print(list.remove(1) is "one") -print(list.item(0) is "zero") -print(list.item(1) is "two") -print(list.size() is 2) -print(list.item(-10) is null) +puts(list.size() is 3) +puts(list.item(2) is "two") +puts(list.remove(1) is "one") +puts(list.item(0) is "zero") +puts(list.item(1) is "two") +puts(list.size() is 2) +puts(list.item(-10) is null) diff --git a/examples/computer_science/luhn_algorithm.coffee b/examples/computer_science/luhn_algorithm.coffee index 042b249d6c..ceb4f3dd88 100644 --- a/examples/computer_science/luhn_algorithm.coffee +++ b/examples/computer_science/luhn_algorithm.coffee @@ -31,6 +31,6 @@ is_valid_identifier: (identifier) -> # Tests. -print(is_valid_identifier("49927398716") is true) -print(is_valid_identifier("4408041234567893") is true) -print(is_valid_identifier("4408041234567890") is false) +puts(is_valid_identifier("49927398716") is true) +puts(is_valid_identifier("4408041234567893") is true) +puts(is_valid_identifier("4408041234567890") is false) diff --git a/examples/computer_science/merge_sort.coffee b/examples/computer_science/merge_sort.coffee index fb3f8ce8fc..77eabf97d6 100644 --- a/examples/computer_science/merge_sort.coffee +++ b/examples/computer_science/merge_sort.coffee @@ -15,5 +15,5 @@ merge_sort: (list) -> # Test the function. -print(merge_sort([3, 2, 1]).join(' ') is '1 2 3') -print(merge_sort([9, 2, 7, 0, 1]).join(' ') is '0 1 2 7 9') \ No newline at end of file +puts(merge_sort([3, 2, 1]).join(' ') is '1 2 3') +puts(merge_sort([9, 2, 7, 0, 1]).join(' ') is '0 1 2 7 9') \ No newline at end of file diff --git a/examples/computer_science/selection_sort.coffee b/examples/computer_science/selection_sort.coffee index f4b970a14a..b94c9704ca 100644 --- a/examples/computer_science/selection_sort.coffee +++ b/examples/computer_science/selection_sort.coffee @@ -19,5 +19,5 @@ selection_sort: (list) -> # Test the function. -print(selection_sort([3, 2, 1]).join(' ') is '1 2 3') -print(selection_sort([9, 2, 7, 0, 1]).join(' ') is '0 1 2 7 9') \ No newline at end of file +puts(selection_sort([3, 2, 1]).join(' ') is '1 2 3') +puts(selection_sort([9, 2, 7, 0, 1]).join(' ') is '0 1 2 7 9') \ No newline at end of file diff --git a/index.html b/index.html index c780982d3c..1e936013ba 100644 --- a/index.html +++ b/index.html @@ -215,7 +215,7 @@

    Installation and Usage

    Installing the gem provides the coffee command, which can be used to compile CoffeeScript .coffee files into JavaScript, as well as debug them. In conjunction with - Narwhal, the coffee + Node.js, the coffee command also provides direct evaluation and an interactive REPL. When compiling to JavaScript, coffee writes the output as .js files in the same directory by default, but output @@ -227,14 +227,14 @@

    Installation and Usage

    -i, --interactive Launch an interactive CoffeeScript session. - Requires Narwhal. + Requires Node.js. -r, --run Compile and execute scripts without saving the intermediate - JavaScript. Requires Narwhal. + JavaScript. Requires Node.js. @@ -291,7 +291,7 @@

    Installation and Usage

    -n, --no-wrap Compile the JavaScript without the top-level function safety wrapper. - (Used for CoffeeScript as a Narwhal module.) + (Used for CoffeeScript as a Node.js module.) diff --git a/lib/coffee_script/coffee-script.js b/lib/coffee_script/coffee-script.js index 8ed114479a..832be40762 100644 --- a/lib/coffee_script/coffee-script.js +++ b/lib/coffee_script/coffee-script.js @@ -17,4 +17,17 @@ coffee.write(code); return coffee.close(); }; + exports.compile_files = function compile_files(paths, callback) { + var coffee, js; + js = ''; + coffee = process.createChildProcess('coffee', ['--print'].concat(paths)); + coffee.addListener('output', function(results) { + if ((typeof results !== "undefined" && results !== null)) { + return js += results; + } + }); + return coffee.addListener('exit', function() { + return callback(js); + }); + }; })(); \ No newline at end of file diff --git a/lib/coffee_script/command_line.rb b/lib/coffee_script/command_line.rb index 1a1b26e7a6..32cafa6f13 100644 --- a/lib/coffee_script/command_line.rb +++ b/lib/coffee_script/command_line.rb @@ -28,9 +28,6 @@ class CommandLine # Path to the root of the CoffeeScript install. ROOT = File.expand_path(File.dirname(__FILE__) + '/../..') - # Command to execute in Narwhal - LAUNCHER = "narwhal -p #{ROOT} -e 'require(\"coffee-script\").run(system.args);'" - # Run the CommandLine off the contents of ARGV. def initialize @mtimes = {} @@ -114,7 +111,7 @@ def eval_scriptlet puts js end - # Use Narwhal to run an interactive CoffeeScript session. + # Use Node.js to run an interactive CoffeeScript session. def launch_repl exec "node #{ROOT}/lib/coffee_script/repl.js" rescue Errno::ENOENT @@ -122,12 +119,12 @@ def launch_repl exit(1) end - # Use Narwhal to compile and execute CoffeeScripts. + # Use Node.js to compile and execute CoffeeScripts. def run_scripts sources = @sources.join(' ') - exec "#{LAUNCHER} #{sources}" + exec "node #{ROOT}/lib/coffee_script/runner.js #{sources}" rescue Errno::ENOENT - puts "Error: Narwhal must be installed in order to execute CoffeeScripts." + puts "Error: Node.js must be installed in order to execute scripts." exit(1) end @@ -168,10 +165,10 @@ def install_bundle def parse_options @options = {} @option_parser = OptionParser.new do |opts| - opts.on('-i', '--interactive', 'run a CoffeeScript REPL (requires Narwhal)') do |i| + opts.on('-i', '--interactive', 'run a CoffeeScript REPL (requires Node.js)') do |i| @options[:interactive] = true end - opts.on('-r', '--run', 'compile and run a script (requires Narwhal)') do |r| + opts.on('-r', '--run', 'compile and run a script (requires Node.js)') do |r| @options[:run] = true end opts.on('-o', '--output [DIR]', 'set the directory for compiled JavaScript') do |d| diff --git a/lib/coffee_script/narwhal/coffee-script.coffee b/lib/coffee_script/narwhal/coffee-script.coffee deleted file mode 100644 index e9f496493d..0000000000 --- a/lib/coffee_script/narwhal/coffee-script.coffee +++ /dev/null @@ -1,62 +0,0 @@ -# This (javascript) file is generated from lib/coffee_script/narwhal/coffee-script.coffee - -# Executes the `coffee` Ruby program to convert from CoffeeScript -# to Javascript. Eventually this will hopefully happen entirely within JS. - -# Require external dependencies. -OS: require('os') -File: require('file') -Readline: require('readline') - -# The path to the CoffeeScript Compiler. -coffeePath: File.path(module.path).dirname().dirname().dirname().dirname().dirname().join('bin', 'coffee') - -# Our general-purpose error handler. -checkForErrors: (coffeeProcess) -> - return true if coffeeProcess.wait() is 0 - system.stderr.print(coffeeProcess.stderr.read()) - throw new Error("CoffeeScript compile error") - -# Run a simple REPL, round-tripping to the CoffeeScript compiler for every -# command. -exports.run: (args) -> - if args.length - for path, i in args - exports.evalCS(File.read(path)) - delete args[i] - return true - - while true - try - system.stdout.write('coffee> ').flush() - result: exports.evalCS(Readline.readline(), ['--globals']) - print(result) if result isnt undefined - catch e - print(e) - -# Compile a given CoffeeScript file into JavaScript. -exports.compileFile: (path) -> - coffee: OS.popen([coffeePath, "--print", "--no-wrap", path]) - checkForErrors(coffee) - coffee.stdout.read() - -# Compile a string of CoffeeScript into JavaScript. -exports.compile: (source, flags) -> - coffee: OS.popen([coffeePath, "--eval", "--no-wrap"].concat(flags or [])) - coffee.stdin.write(source).flush().close() - checkForErrors(coffee) - coffee.stdout.read() - -# Evaluating a string of CoffeeScript first compiles it externally. -exports.evalCS: (source, flags) -> - eval(exports.compile(source, flags)) - -# Make a factory for the CoffeeScript environment. -exports.makeNarwhalFactory: (path) -> - code: exports.compileFile(path) - factoryText: "function(require,exports,module,system,print){" + code + "/**/\n}" - if system.engine is "rhino" - Packages.org.mozilla.javascript.Context.getCurrentContext().compileFunction(global, factoryText, path, 0, null) - else - # eval requires parentheses, but parentheses break compileFunction. - eval("(" + factoryText + ")") diff --git a/lib/coffee_script/narwhal/lib/coffee-script.js b/lib/coffee_script/narwhal/lib/coffee-script.js deleted file mode 100644 index b2283d0fa6..0000000000 --- a/lib/coffee_script/narwhal/lib/coffee-script.js +++ /dev/null @@ -1,80 +0,0 @@ -(function(){ - var File, OS, Readline, checkForErrors, coffeePath; - // This (javascript) file is generated from lib/coffee_script/narwhal/coffee-script.coffee - // Executes the `coffee` Ruby program to convert from CoffeeScript - // to Javascript. Eventually this will hopefully happen entirely within JS. - // Require external dependencies. - OS = require('os'); - File = require('file'); - Readline = require('readline'); - // The path to the CoffeeScript Compiler. - coffeePath = File.path(module.path).dirname().dirname().dirname().dirname().dirname().join('bin', 'coffee'); - // Our general-purpose error handler. - checkForErrors = function checkForErrors(coffeeProcess) { - if (coffeeProcess.wait() === 0) { - return true; - } - system.stderr.print(coffeeProcess.stderr.read()); - throw new Error("CoffeeScript compile error"); - }; - // Run a simple REPL, round-tripping to the CoffeeScript compiler for every - // command. - exports.run = function run(args) { - var __a, __b, i, path, result; - if (args.length) { - __a = args; - for (i = 0; i < __a.length; i++) { - path = __a[i]; - exports.evalCS(File.read(path)); - delete args[i]; - } - return true; - } - __b = []; - while (true) { - __b.push((function() { - try { - system.stdout.write('coffee> ').flush(); - result = exports.evalCS(Readline.readline(), ['--globals']); - if (result !== undefined) { - return print(result); - } - } catch (e) { - return print(e); - } - }).call(this)); - } - return __b; - }; - // Compile a given CoffeeScript file into JavaScript. - exports.compileFile = function compileFile(path) { - var coffee; - coffee = OS.popen([coffeePath, "--print", "--no-wrap", path]); - checkForErrors(coffee); - return coffee.stdout.read(); - }; - // Compile a string of CoffeeScript into JavaScript. - exports.compile = function compile(source, flags) { - var coffee; - coffee = OS.popen([coffeePath, "--eval", "--no-wrap"].concat(flags || [])); - coffee.stdin.write(source).flush().close(); - checkForErrors(coffee); - return coffee.stdout.read(); - }; - // Evaluating a string of CoffeeScript first compiles it externally. - exports.evalCS = function evalCS(source, flags) { - return eval(exports.compile(source, flags)); - }; - // Make a factory for the CoffeeScript environment. - exports.makeNarwhalFactory = function makeNarwhalFactory(path) { - var code, factoryText; - code = exports.compileFile(path); - factoryText = "function(require,exports,module,system,print){" + code + "/**/\n}"; - if (system.engine === "rhino") { - return Packages.org.mozilla.javascript.Context.getCurrentContext().compileFunction(global, factoryText, path, 0, null); - } else { - // eval requires parentheses, but parentheses break compileFunction. - return eval("(" + factoryText + ")"); - } - }; -})(); \ No newline at end of file diff --git a/lib/coffee_script/narwhal/lib/coffee-script/loader.js b/lib/coffee_script/narwhal/lib/coffee-script/loader.js deleted file mode 100644 index 9fc8354bc9..0000000000 --- a/lib/coffee_script/narwhal/lib/coffee-script/loader.js +++ /dev/null @@ -1,21 +0,0 @@ -(function(){ - var coffeescript, factories, loader; - // This (javascript) file is generated from lib/coffee_script/narwhal/loader.coffee - coffeescript = null; - factories = { - }; - loader = { - // Reload the coffee-script environment from source. - reload: function reload(topId, path) { - coffeescript = coffeescript || require('coffee-script'); - return factories[topId] = function() { - return coffeescript.makeNarwhalFactory(path); - }; - }, - // Ensure that the coffee-script environment is loaded. - load: function load(topId, path) { - return factories[topId] = factories[topId] || this.reload(topId, path); - } - }; - require.loader.loaders.unshift([".coffee", loader]); -})(); \ No newline at end of file diff --git a/lib/coffee_script/narwhal/loader.coffee b/lib/coffee_script/narwhal/loader.coffee deleted file mode 100644 index 5b80e7330d..0000000000 --- a/lib/coffee_script/narwhal/loader.coffee +++ /dev/null @@ -1,19 +0,0 @@ -# This (javascript) file is generated from lib/coffee_script/narwhal/loader.coffee - -coffeescript: null -factories: {} - -loader: { - - # Reload the coffee-script environment from source. - reload: (topId, path) -> - coffeescript ||= require('coffee-script') - factories[topId]: -> coffeescript.makeNarwhalFactory(path) - - # Ensure that the coffee-script environment is loaded. - load: (topId, path) -> - factories[topId] ||= this.reload(topId, path) - -} - -require.loader.loaders.unshift([".coffee", loader]) diff --git a/lib/coffee_script/runner.js b/lib/coffee_script/runner.js new file mode 100644 index 0000000000..4623b2a8b5 --- /dev/null +++ b/lib/coffee_script/runner.js @@ -0,0 +1,10 @@ +(function(){ + var coffee, paths; + coffee = require('./coffee-script'); + process.mixin(require('sys')); + paths = process.ARGV; + paths = paths.slice(2, paths.length); + coffee.compile_files(paths, function(js) { + return eval(js); + }); +})(); \ No newline at end of file diff --git a/package.json b/package.json index 7db27d07ef..e32030ac5c 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "coffee-script", - "lib": "lib/coffee_script/narwhal/lib", - "preload": ["coffee-script/loader"], + "lib": "lib/coffee_script", + "preload": ["loader"], "description": "Unfancy JavaScript", "keywords": ["javascript", "language"], "author": "Jeremy Ashkenas", diff --git a/src/coffee-script.coffee b/src/coffee-script.coffee index 602032aa19..dd0bf89b7b 100644 --- a/src/coffee-script.coffee +++ b/src/coffee-script.coffee @@ -12,4 +12,12 @@ exports.compile: (code, callback) -> coffee.write(code) coffee.close() +exports.compile_files: (paths, callback) -> + js: '' + coffee: process.createChildProcess 'coffee', ['--print'].concat(paths) + coffee.addListener 'output', (results) -> + js += results if results? + coffee.addListener 'exit', -> + callback(js) + diff --git a/src/runner.coffee b/src/runner.coffee new file mode 100644 index 0000000000..1d73ac64af --- /dev/null +++ b/src/runner.coffee @@ -0,0 +1,6 @@ +coffee: require './coffee-script' +process.mixin require 'sys' + +paths: process.ARGV +paths: paths[2...paths.length] +coffee.compile_files paths, (js) -> eval(js) diff --git a/test/fixtures/execution/test_arguments.coffee b/test/fixtures/execution/test_arguments.coffee index 71a6c9c763..00580a71b7 100644 --- a/test/fixtures/execution/test_arguments.coffee +++ b/test/fixtures/execution/test_arguments.coffee @@ -4,12 +4,12 @@ area: (x, y, x1, y1) -> x: y: 10 x1: y1: 20 -print area(x, y, x1, y1) is 100 +puts area(x, y, x1, y1) is 100 -print(area(x, y, +puts(area(x, y, x1, y1) is 100) -print(area( +puts(area( x y x1 @@ -19,7 +19,7 @@ print(area( # Arguments are turned into arrays. curried: -> - print area.apply(this, arguments.concat(20, 20)) is 100 + puts area.apply(this, arguments.concat(20, 20)) is 100 curried 10, 10 @@ -29,4 +29,4 @@ func: -> arguments: 25 arguments -print func(100) is 25 +puts func(100) is 25 diff --git a/test/fixtures/execution/test_array_comprehension.coffee b/test/fixtures/execution/test_array_comprehension.coffee index 03c1e1f76b..a73b735625 100644 --- a/test/fixtures/execution/test_array_comprehension.coffee +++ b/test/fixtures/execution/test_array_comprehension.coffee @@ -1,15 +1,15 @@ nums: n * n for n in [1, 2, 3] when n % 2 isnt 0 results: n * 2 for n in nums -print results.join(',') is '2,18' +puts results.join(',') is '2,18' obj: {one: 1, two: 2, three: 3} names: prop + '!' for prop of obj odds: prop + '!' for prop, value of obj when value % 2 isnt 0 -print names.join(' ') is "one! two! three!" -print odds.join(' ') is "one! three!" +puts names.join(' ') is "one! two! three!" +puts odds.join(' ') is "one! three!" evens: for num in [1, 2, 3, 4, 5, 6] when num % 2 is 0 @@ -17,12 +17,12 @@ evens: for num in [1, 2, 3, 4, 5, 6] when num % 2 is 0 num -= 2 num * -1 -print evens.join(', ') is '4, 6, 8' +puts evens.join(', ') is '4, 6, 8' # Make sure that the "in" operator still works. -print 2 in evens +puts 2 in evens # When functions are being defined within the body of a comprehension, make @@ -37,6 +37,6 @@ for method in methods obj[name]: -> "I'm " + name -print obj.one() is "I'm one" -print obj.two() is "I'm two" -print obj.three() is "I'm three" +puts obj.one() is "I'm one" +puts obj.two() is "I'm two" +puts obj.three() is "I'm three" diff --git a/test/fixtures/execution/test_assignment.coffee b/test/fixtures/execution/test_assignment.coffee index 3fd42dd8eb..ebe72da772 100644 --- a/test/fixtures/execution/test_assignment.coffee +++ b/test/fixtures/execution/test_assignment.coffee @@ -7,7 +7,7 @@ catch error result2: try nonexistent * missing catch error then true -print result is true and result2 is true +puts result is true and result2 is true # Assign to conditional. @@ -16,8 +16,8 @@ get_x: -> 10 if x: get_x() then 100 -print x is 10 +puts x is 10 x: if get_x() then 100 -print x is 100 \ No newline at end of file +puts x is 100 \ No newline at end of file diff --git a/test/fixtures/execution/test_blocks.coffee b/test/fixtures/execution/test_blocks.coffee index 2efd8aa84e..98097dcc9b 100644 --- a/test/fixtures/execution/test_blocks.coffee +++ b/test/fixtures/execution/test_blocks.coffee @@ -1,4 +1,4 @@ results: [1, 2, 3].map (x) -> x * x -print results.join(' ') is '1 4 9' \ No newline at end of file +puts results.join(' ') is '1 4 9' \ No newline at end of file diff --git a/test/fixtures/execution/test_calling_super.coffee b/test/fixtures/execution/test_calling_super.coffee index 546744b236..4bf626e26a 100644 --- a/test/fixtures/execution/test_calling_super.coffee +++ b/test/fixtures/execution/test_calling_super.coffee @@ -20,7 +20,7 @@ ThirdChild::func: (string) -> result: (new ThirdChild()).func 'four' -print result is 'zero/one/two/three/four' +puts result is 'zero/one/two/three/four' TopClass: (arg) -> @@ -35,4 +35,4 @@ SubClass: -> SuperClass extends TopClass SubClass extends SuperClass -print((new SubClass()).prop is 'top-super-sub') \ No newline at end of file +puts((new SubClass()).prop is 'top-super-sub') \ No newline at end of file diff --git a/test/fixtures/execution/test_chained_calls.coffee b/test/fixtures/execution/test_chained_calls.coffee index 8f0b704307..eaad589a0d 100644 --- a/test/fixtures/execution/test_chained_calls.coffee +++ b/test/fixtures/execution/test_chained_calls.coffee @@ -3,7 +3,7 @@ identity_wrap: (x) -> result: identity_wrap(identity_wrap(true))()() -print result +puts result str: 'god' @@ -14,7 +14,7 @@ result: str. reverse(). reverse() -print result.join('') is 'dog' +puts result.join('') is 'dog' result: str .split('') @@ -22,4 +22,4 @@ result: str .reverse() .reverse() -print result.join('') is 'dog' \ No newline at end of file +puts result.join('') is 'dog' \ No newline at end of file diff --git a/test/fixtures/execution/test_destructuring_assignment.coffee b/test/fixtures/execution/test_destructuring_assignment.coffee index 3aa454c3de..da5ab0fc40 100644 --- a/test/fixtures/execution/test_destructuring_assignment.coffee +++ b/test/fixtures/execution/test_destructuring_assignment.coffee @@ -3,26 +3,26 @@ b: -2 [a, b]: [b, a] -print a is -2 -print b is -1 +puts a is -2 +puts b is -1 arr: [1, 2, 3] [a, b, c]: arr -print a is 1 -print b is 2 -print c is 3 +puts a is 1 +puts b is 2 +puts c is 3 obj: {x: 10, y: 20, z: 30} {x: a, y: b, z: c}: obj -print a is 10 -print b is 20 -print c is 30 +puts a is 10 +puts b is 20 +puts c is 30 person: { @@ -42,8 +42,8 @@ person: { {name: a, family: {brother: {addresses: [one, {city: b}]}}}: person -print a is "Bob" -print b is "Moquasset NY, 10021" +puts a is "Bob" +puts b is "Moquasset NY, 10021" test: { @@ -59,4 +59,4 @@ test: { {person: {address: [ignore, addr...]}}: test -print addr.join(', ') is "Street 101, Apt 101, City 101" \ No newline at end of file +puts addr.join(', ') is "Street 101, Apt 101, City 101" \ No newline at end of file diff --git a/test/fixtures/execution/test_everything.coffee b/test/fixtures/execution/test_everything.coffee index c6b54b95df..c52ae0a11a 100644 --- a/test/fixtures/execution/test_everything.coffee +++ b/test/fixtures/execution/test_everything.coffee @@ -26,4 +26,4 @@ func: -> c.single: c.list[1..1][0] -print func() is '-' +puts func() is '-' diff --git a/test/fixtures/execution/test_existence.coffee b/test/fixtures/execution/test_existence.coffee index 253a8bf288..eb7f5c0e31 100644 --- a/test/fixtures/execution/test_existence.coffee +++ b/test/fixtures/execution/test_existence.coffee @@ -1,8 +1,8 @@ -print(if my_special_variable? then false else true) +puts(if my_special_variable? then false else true) my_special_variable: false -print(if my_special_variable? then true else false) +puts(if my_special_variable? then true else false) # Existential assignment. @@ -12,7 +12,7 @@ a: null a ?= 10 b ?= 10 -print a is 10 and b is 10 +puts a is 10 and b is 10 # The existential operator. @@ -20,7 +20,7 @@ print a is 10 and b is 10 z: null x: z ? "EX" -print z is null and x is "EX" +puts z is null and x is "EX" # Only evaluate once. @@ -30,7 +30,7 @@ get_next_node: -> throw "up" if counter counter++ -print(if get_next_node()? then true else false) +puts(if get_next_node()? then true else false) # Existence chains, soaking up undefined properties: @@ -39,17 +39,17 @@ obj: { prop: "hello" } -print obj?.prop is "hello" +puts obj?.prop is "hello" -print obj?.prop?.non?.existent?.property is undefined +puts obj?.prop?.non?.existent?.property is undefined # Soaks and caches method calls as well. arr: ["--", "----"] -print arr.pop()?.length is 4 -print arr.pop()?.length is 2 -print arr.pop()?.length is undefined -print arr[0]?.length is undefined -print arr.pop()?.length?.non?.existent()?.property is undefined +puts arr.pop()?.length is 4 +puts arr.pop()?.length is 2 +puts arr.pop()?.length is undefined +puts arr[0]?.length is undefined +puts arr.pop()?.length?.non?.existent()?.property is undefined diff --git a/test/fixtures/execution/test_expressions.coffee b/test/fixtures/execution/test_expressions.coffee index 9686d1a418..eee4417973 100644 --- a/test/fixtures/execution/test_expressions.coffee +++ b/test/fixtures/execution/test_expressions.coffee @@ -9,7 +9,7 @@ findit: (items) -> for item in items return item if item is "bacon" -print findit(items) is "bacon" +puts findit(items) is "bacon" # When when a closure wrapper is generated for expression conversion, make sure @@ -26,5 +26,5 @@ obj: { this.num } -print obj.num is obj.func() -print obj.num is obj.result \ No newline at end of file +puts obj.num is obj.func() +puts obj.num is obj.result \ No newline at end of file diff --git a/test/fixtures/execution/test_fancy_if_statement.coffee b/test/fixtures/execution/test_fancy_if_statement.coffee index f71dd51193..978c9def75 100644 --- a/test/fixtures/execution/test_fancy_if_statement.coffee +++ b/test/fixtures/execution/test_fancy_if_statement.coffee @@ -7,10 +7,10 @@ result: if a if d true -print result +puts result first: if false then false else second: if false then false else true -print first -print second \ No newline at end of file +puts first +puts second \ No newline at end of file diff --git a/test/fixtures/execution/test_functions.coffee b/test/fixtures/execution/test_functions.coffee index 0aa4939be4..9c63f39ab0 100644 --- a/test/fixtures/execution/test_functions.coffee +++ b/test/fixtures/execution/test_functions.coffee @@ -2,11 +2,11 @@ x: 1 y: {} y.x: -> 3 -print x is 1 -print typeof(y.x) is 'function' -print y.x instanceof Function -print y.x() is 3 -print y.x.name is 'x' +puts x is 1 +puts typeof(y.x) is 'function' +puts y.x instanceof Function +puts y.x() is 3 +puts y.x.name is 'x' # The empty function should not cause a syntax error. @@ -17,10 +17,10 @@ obj: { name: "Fred" bound: -> - (=> print(this.name is "Fred"))() + (=> puts(this.name is "Fred"))() unbound: -> - (-> print(!this.name?))() + (-> puts(!this.name?))() } obj.unbound() @@ -44,18 +44,18 @@ Math: { FastAdd: memoize (a, b) -> a + b } -print Math.Add(5, 5) is 10 -print Math.AnonymousAdd(10, 10) is 20 -print Math.FastAdd(20, 20) is 40 +puts Math.Add(5, 5) is 10 +puts Math.AnonymousAdd(10, 10) is 20 +puts Math.FastAdd(20, 20) is 40 # Parens are optional on simple function calls. -print 100 > 1 if 1 > 0 -print true unless false -print true for i in [1..3] +puts 100 > 1 if 1 > 0 +puts true unless false +puts true for i in [1..3] -print_func: (f) -> print(f()) -print_func -> true +puts_func: (f) -> puts(f()) +puts_func -> true # Optional parens can be used in a nested fashion. call: (func) -> func() @@ -64,7 +64,7 @@ result: call -> inner: call -> Math.Add(5, 5) -print result is 10 +puts result is 10 # And even with strange things like this: @@ -72,8 +72,8 @@ print result is 10 funcs: [(x) -> x, (x) -> x * x] result: funcs[1] 5 -print result is 25 +puts result is 25 result: ("hello".slice) 3 -print result is 'lo' \ No newline at end of file +puts result is 'lo' \ No newline at end of file diff --git a/test/fixtures/execution/test_funky_comments.coffee b/test/fixtures/execution/test_funky_comments.coffee index 9fbc030e98..6a0940f1ed 100644 --- a/test/fixtures/execution/test_funky_comments.coffee +++ b/test/fixtures/execution/test_funky_comments.coffee @@ -18,4 +18,4 @@ switch 'string' code() # comment -print func() +puts func() diff --git a/test/fixtures/execution/test_heredocs.coffee b/test/fixtures/execution/test_heredocs.coffee index bb0becfda8..5304fb2639 100644 --- a/test/fixtures/execution/test_heredocs.coffee +++ b/test/fixtures/execution/test_heredocs.coffee @@ -3,7 +3,7 @@ a: """ on two lines """ -print a is "basic heredoc\non two lines" +puts a is "basic heredoc\non two lines" a: ''' @@ -12,12 +12,12 @@ a: ''' c ''' -print a is "a\n \"b\nc" +puts a is "a\n \"b\nc" a: '''one-liner''' -print a is 'one-liner' +puts a is 'one-liner' a: """ @@ -25,7 +25,7 @@ a: """ here """ -print a is "out\nhere" +puts a is "out\nhere" a: ''' @@ -34,7 +34,7 @@ a: ''' c ''' -print a is " a\n b\nc" +puts a is " a\n b\nc" a: ''' a @@ -43,4 +43,4 @@ a b c ''' -print a is "a\n\n\nb c" +puts a is "a\n\n\nb c" diff --git a/test/fixtures/execution/test_lexical_scope.coffee b/test/fixtures/execution/test_lexical_scope.coffee index 769b50961c..5693ecd672 100644 --- a/test/fixtures/execution/test_lexical_scope.coffee +++ b/test/fixtures/execution/test_lexical_scope.coffee @@ -1,10 +1,10 @@ num: 1 + 2 + (a: 3) -print num is 6 +puts num is 6 result: if true false other: "result" -print result is "result" and other is "result" \ No newline at end of file +puts result is "result" and other is "result" \ No newline at end of file diff --git a/test/fixtures/execution/test_literals.coffee b/test/fixtures/execution/test_literals.coffee index c462b565f1..416d498644 100644 --- a/test/fixtures/execution/test_literals.coffee +++ b/test/fixtures/execution/test_literals.coffee @@ -1,37 +1,37 @@ a: [(x) -> x, (x) -> x * x] -print a.length is 2 +puts a.length is 2 regex: /match/i words: "I think there is a match in here." -print !!words.match(regex) +puts !!words.match(regex) neg: (3 -4) -print neg is -1 +puts neg is -1 func: -> return if true -print func() is null +puts func() is null str: "\\" reg: /\\/ -print reg(str) and str is '\\' +puts reg(str) and str is '\\' i: 10 while i -= 1 -print i is 0 +puts i is 0 money$: 'dollars' -print money$ is 'dollars' \ No newline at end of file +puts money$ is 'dollars' \ No newline at end of file diff --git a/test/fixtures/execution/test_nested_comprehensions.coffee b/test/fixtures/execution/test_nested_comprehensions.coffee index 8f50c49082..77ed44b672 100644 --- a/test/fixtures/execution/test_nested_comprehensions.coffee +++ b/test/fixtures/execution/test_nested_comprehensions.coffee @@ -6,6 +6,6 @@ multi_liner: single_liner: [x, y] for y in [3..5] for x in [3..5] -print multi_liner.length is single_liner.length -print 5 is multi_liner[2][2][1] -print 5 is single_liner[2][2][1] +puts multi_liner.length is single_liner.length +puts 5 is multi_liner[2][2][1] +puts 5 is single_liner[2][2][1] diff --git a/test/fixtures/execution/test_newline_escaping.coffee b/test/fixtures/execution/test_newline_escaping.coffee index 9e91f45290..d5c30899f1 100644 --- a/test/fixtures/execution/test_newline_escaping.coffee +++ b/test/fixtures/execution/test_newline_escaping.coffee @@ -3,4 +3,4 @@ six: 2 + 3 -print six is 6 \ No newline at end of file +puts six is 6 \ No newline at end of file diff --git a/test/fixtures/execution/test_operations.coffee b/test/fixtures/execution/test_operations.coffee index 86332804ca..86699ca2f6 100644 --- a/test/fixtures/execution/test_operations.coffee +++ b/test/fixtures/execution/test_operations.coffee @@ -1,12 +1,12 @@ # CoffeeScript's operations should be chainable, like Python's. -print 500 > 50 > 5 > -5 +puts 500 > 50 > 5 > -5 -print true is not false is true is not false +puts true is not false is true is not false -print 10 < 20 > 10 +puts 10 < 20 > 10 -print 50 > 10 > 5 is parseInt('5', 10) +puts 50 > 10 > 5 is parseInt('5', 10) # Make sure that each argument is only evaluated once, even if used @@ -15,4 +15,4 @@ print 50 > 10 > 5 is parseInt('5', 10) i: 0 func: -> i++ -print 1 > func() < 1 +puts 1 > func() < 1 diff --git a/test/fixtures/execution/test_range_comprehension.coffee b/test/fixtures/execution/test_range_comprehension.coffee index 947c27d204..67d41e1921 100644 --- a/test/fixtures/execution/test_range_comprehension.coffee +++ b/test/fixtures/execution/test_range_comprehension.coffee @@ -5,16 +5,16 @@ negs: negs[0..2] result: nums.concat(negs).join(', ') -print result is '3, 6, 9, -20, -19, -18' +puts result is '3, 6, 9, -20, -19, -18' # Ensure that ranges are safe. This used to infinite loop: j = 5 result: for j in [j..(j+3)] j -print result.join(' ') is '5 6 7 8' +puts result.join(' ') is '5 6 7 8' # With range comprehensions, you can loop in steps. results: x for x in [0..25] by 5 -print results.join(' ') is '0 5 10 15 20 25' \ No newline at end of file +puts results.join(' ') is '0 5 10 15 20 25' \ No newline at end of file diff --git a/test/fixtures/execution/test_ranges_and_slices.coffee b/test/fixtures/execution/test_ranges_and_slices.coffee index a6a0bf18bf..af90156373 100644 --- a/test/fixtures/execution/test_ranges_and_slices.coffee +++ b/test/fixtures/execution/test_ranges_and_slices.coffee @@ -5,7 +5,7 @@ b: array[2...4] result: a.concat(b).join(' ') -print result is "7 8 9 2 3" +puts result is "7 8 9 2 3" countdown: [10..1].join(' ') -print countdown is "10 9 8 7 6 5 4 3 2 1" \ No newline at end of file +puts countdown is "10 9 8 7 6 5 4 3 2 1" \ No newline at end of file diff --git a/test/fixtures/execution/test_splats.coffee b/test/fixtures/execution/test_splats.coffee index 18083d894f..b50c2fb220 100644 --- a/test/fixtures/execution/test_splats.coffee +++ b/test/fixtures/execution/test_splats.coffee @@ -3,7 +3,7 @@ func: (first, second, rest...) -> result: func 1, 2, 3, 4, 5 -print result is "3 4 5" +puts result is "3 4 5" gold: silver: bronze: the_field: null @@ -29,7 +29,7 @@ contenders: [ medalists "Mighty Mouse", contenders... -print gold is "Mighty Mouse" -print silver is "Michael Phelps" -print bronze is "Liu Xiang" -print the_field.length is 8 \ No newline at end of file +puts gold is "Mighty Mouse" +puts silver is "Michael Phelps" +puts bronze is "Liu Xiang" +puts the_field.length is 8 \ No newline at end of file diff --git a/test/fixtures/execution/test_splices.coffee b/test/fixtures/execution/test_splices.coffee index e9baf87793..56e6787da6 100644 --- a/test/fixtures/execution/test_splices.coffee +++ b/test/fixtures/execution/test_splices.coffee @@ -2,4 +2,4 @@ array: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] array[5..10]: [0, 0, 0] -print array.join(' ') is '0 1 2 3 4 0 0 0' \ No newline at end of file +puts array.join(' ') is '0 1 2 3 4 0 0 0' \ No newline at end of file diff --git a/test/fixtures/execution/test_switch.coffee b/test/fixtures/execution/test_switch.coffee index 3911f043f8..b97fa011f9 100644 --- a/test/fixtures/execution/test_switch.coffee +++ b/test/fixtures/execution/test_switch.coffee @@ -14,7 +14,7 @@ result: switch num when 11 then false else false -print result +puts result func: (num) -> switch num @@ -24,7 +24,7 @@ func: (num) -> false else false -print func(2) -print func(6) -print !func(3) -print !func(8) +puts func(2) +puts func(6) +puts !func(3) +puts !func(8) diff --git a/test/fixtures/execution/test_while.coffee b/test/fixtures/execution/test_while.coffee index c065fe046d..e44a061f32 100644 --- a/test/fixtures/execution/test_while.coffee +++ b/test/fixtures/execution/test_while.coffee @@ -1,17 +1,17 @@ i: 100 while i -= 1 -print i is 0 +puts i is 0 i: 5 list: while i -= 1 i * 2 -print list.join(' ') is "8 6 4 2" +puts list.join(' ') is "8 6 4 2" i: 5 list: (i * 3 while i -= 1) -print list.join(' ') is "12 9 6 3" \ No newline at end of file +puts list.join(' ') is "12 9 6 3" \ No newline at end of file diff --git a/test/fixtures/generation/statements_as_expressions.coffee b/test/fixtures/generation/statements_as_expressions.coffee index 56baa37469..6f6f86166d 100644 --- a/test/fixtures/generation/statements_as_expressions.coffee +++ b/test/fixtures/generation/statements_as_expressions.coffee @@ -3,14 +3,14 @@ result: while sunny? go_outside() -print(3 + try +puts(3 + try nonexistent.no_way catch error - print(error) + puts(error) 3 ) func: (x) -> return throw x -print(x * x for x in [1..100]) \ No newline at end of file +puts(x * x for x in [1..100]) \ No newline at end of file From b0ecb39e9f9c5cd2d29eaba5e56b229ac6251525 Mon Sep 17 00:00:00 2001 From: Jeremy Ashkenas Date: Fri, 29 Jan 2010 23:41:18 -0500 Subject: [PATCH 07/37] made the path handling a little more robust --- lib/coffee_script/coffee-script.js | 11 ++++++++--- lib/coffee_script/runner.js | 1 + src/coffee-script.coffee | 12 +++++++++--- src/runner.coffee | 2 ++ 4 files changed, 20 insertions(+), 6 deletions(-) diff --git a/lib/coffee_script/coffee-script.js b/lib/coffee_script/coffee-script.js index 832be40762..e69de174b2 100644 --- a/lib/coffee_script/coffee-script.js +++ b/lib/coffee_script/coffee-script.js @@ -1,11 +1,15 @@ (function(){ - var sys; + var compiler, path, sys; // Executes the `coffee` Ruby program to convert from CoffeeScript to JavaScript. sys = require('sys'); + path = require('path'); + // The path to the CoffeeScript executable. + compiler = path.normalize(path.dirname(__filename) + '/../../bin/coffee'); + // Compile a string over stdin, with global variables, for the REPL. exports.compile = function compile(code, callback) { var coffee, js; js = ''; - coffee = process.createChildProcess('coffee', ['--eval', '--no-wrap', '--globals']); + coffee = process.createChildProcess(compiler, ['--eval', '--no-wrap', '--globals']); coffee.addListener('output', function(results) { if ((typeof results !== "undefined" && results !== null)) { return js += results; @@ -17,10 +21,11 @@ coffee.write(code); return coffee.close(); }; + // Compile a list of CoffeeScript files on disk. exports.compile_files = function compile_files(paths, callback) { var coffee, js; js = ''; - coffee = process.createChildProcess('coffee', ['--print'].concat(paths)); + coffee = process.createChildProcess(compiler, ['--print'].concat(paths)); coffee.addListener('output', function(results) { if ((typeof results !== "undefined" && results !== null)) { return js += results; diff --git a/lib/coffee_script/runner.js b/lib/coffee_script/runner.js index 4623b2a8b5..10f6ac9b3c 100644 --- a/lib/coffee_script/runner.js +++ b/lib/coffee_script/runner.js @@ -1,5 +1,6 @@ (function(){ var coffee, paths; + // Quickie script to compile and run all the files given as arguments. coffee = require('./coffee-script'); process.mixin(require('sys')); paths = process.ARGV; diff --git a/src/coffee-script.coffee b/src/coffee-script.coffee index dd0bf89b7b..c164936499 100644 --- a/src/coffee-script.coffee +++ b/src/coffee-script.coffee @@ -1,10 +1,15 @@ # Executes the `coffee` Ruby program to convert from CoffeeScript to JavaScript. -sys: require('sys') +sys: require('sys') +path: require('path') +# The path to the CoffeeScript executable. +compiler: path.normalize(path.dirname(__filename) + '/../../bin/coffee') + +# Compile a string over stdin, with global variables, for the REPL. exports.compile: (code, callback) -> js: '' - coffee: process.createChildProcess 'coffee', ['--eval', '--no-wrap', '--globals'] + coffee: process.createChildProcess compiler, ['--eval', '--no-wrap', '--globals'] coffee.addListener 'output', (results) -> js += results if results? coffee.addListener 'exit', -> @@ -12,9 +17,10 @@ exports.compile: (code, callback) -> coffee.write(code) coffee.close() +# Compile a list of CoffeeScript files on disk. exports.compile_files: (paths, callback) -> js: '' - coffee: process.createChildProcess 'coffee', ['--print'].concat(paths) + coffee: process.createChildProcess compiler, ['--print'].concat(paths) coffee.addListener 'output', (results) -> js += results if results? coffee.addListener 'exit', -> diff --git a/src/runner.coffee b/src/runner.coffee index 1d73ac64af..aed683874d 100644 --- a/src/runner.coffee +++ b/src/runner.coffee @@ -1,3 +1,5 @@ +# Quickie script to compile and run all the files given as arguments. + coffee: require './coffee-script' process.mixin require 'sys' From 854c796fd64f213de83267533bf09b5537e6c492 Mon Sep 17 00:00:00 2001 From: Jeremy Ashkenas Date: Sat, 30 Jan 2010 00:08:15 -0500 Subject: [PATCH 08/37] first little bit of the lexer --- lib/coffee_script/lexer.js | 96 +++++++++++++++++++++++++++++++ src/lexer.coffee | 114 +++++++++++++++++++++++++++++++++++++ 2 files changed, 210 insertions(+) create mode 100644 lib/coffee_script/lexer.js create mode 100644 src/lexer.coffee diff --git a/lib/coffee_script/lexer.js b/lib/coffee_script/lexer.js new file mode 100644 index 0000000000..9c01af228a --- /dev/null +++ b/lib/coffee_script/lexer.js @@ -0,0 +1,96 @@ +(function(){ + var lex, sys; + sys = require('sys'); + // The lexer reads a stream of CoffeeScript and divvys it up into tagged + // tokens. A minor bit of the ambiguity in the grammar has been avoided by + // pushing some extra smarts into the Lexer. + exports.Lexer = (lex = function lex() { }); + // The list of keywords passed verbatim to the parser. + lex.KEYWORDS = ["if", "else", "then", "unless", "true", "false", "yes", "no", "on", "off", "and", "or", "is", "isnt", "not", "new", "return", "arguments", "try", "catch", "finally", "throw", "break", "continue", "for", "in", "of", "by", "where", "while", "delete", "instanceof", "typeof", "switch", "when", "super", "extends"]; + // Token matching regexes. + lex.IDENTIFIER = /^([a-zA-Z$_](\w|\$)*)/; + lex.NUMBER = /^(\b((0(x|X)[0-9a-fA-F]+)|([0-9]+(\.[0-9]+)?(e[+\-]?[0-9]+)?)))\b/i; + lex.STRING = /^(""|''|"(.*?)([^\\]|\\\\)"|'(.*?)([^\\]|\\\\)')/m; + lex.HEREDOC = /^("{6}|'{6}|"{3}\n?(.*?)\n?([ \t]*)"{3}|'{3}\n?(.*?)\n?([ \t]*)'{3})/m; + lex.JS = /^(``|`(.*?)([^\\]|\\\\)`)/m; + lex.OPERATOR = /^([+\*&|\/\-%=<>:!?]+)/; + lex.WHITESPACE = /^([ \t]+)/; + lex.COMMENT = /^(((\n?[ \t]*)?#.*$)+)/; + lex.CODE = /^((-|=)>)/; + lex.REGEX = /^(\/(.*?)([^\\]|\\\\)\/[imgy]{0,4})/; + lex.MULTI_DENT = /^((\n([ \t]*))+)(\.)?/; + lex.LAST_DENT = /\n([ \t]*)/; + lex.ASSIGNMENT = /^(:|=)$/; + // Token cleaning regexes. + lex.JS_CLEANER = /(^`|`$)/; + lex.MULTILINER = /\n/; + lex.STRING_NEWLINES = /\n[ \t]*/; + lex.COMMENT_CLEANER = /(^[ \t]*#|\n[ \t]*$)/; + lex.NO_NEWLINE = /^([+\*&|\/\-%=<>:!.\\][<>=&|]*|and|or|is|isnt|not|delete|typeof|instanceof)$/; + lex.HEREDOC_INDENT = /^[ \t]+/; + // Tokens which a regular expression will never immediately follow, but which + // a division operator might. + // See: http://www.mozilla.org/js/language/js20-2002-04/rationale/syntax.html#regular-expressions + lex.NOT_REGEX = ['IDENTIFIER', 'NUMBER', 'REGEX', 'STRING', ')', '++', '--', ']', '}', 'FALSE', 'NULL', 'TRUE']; + // Tokens which could legitimately be invoked or indexed. + lex.CALLABLE = ['IDENTIFIER', 'SUPER', ')', ']', '}', 'STRING']; + // Scan by attempting to match tokens one character at a time. Slow and steady. + lex.prototype.tokenize = function tokenize(code) { + this.code = code.chomp; + // Cleanup code by remove extra line breaks + this.i = 0; + // Current character position we're parsing + this.line = 1; + // The current line. + this.indent = 0; + // The current indent level. + this.indents = []; + // The stack of all indent levels we are currently within. + this.tokens = []; + // Collection of all parsed tokens in the form [:TOKEN_TYPE, value] + this.spaced = nil; + // The last value that has a space following it. + while (this.i < this.code.length) { + this.chunk = this.code.slice(this.i, -1 + 1); + this.extract_next_token(); + } + if (process.ENV['VERBOSE']) { + sys.puts("original stream: #{@tokens.inspect}"); + } + this.close_indentation(); + return (new Rewriter()).rewrite(this.tokens); + }; + // At every position, run through this list of attempted matches, + // short-circuiting if any of them succeed. + lex.prototype.extract_next_token = function extract_next_token() { + if (this.identifier_token()) { + return null; + } + if (this.number_token()) { + return null; + } + if (this.heredoc_token()) { + return null; + } + if (this.string_token()) { + return null; + } + if (this.js_token()) { + return null; + } + if (this.regex_token()) { + return null; + } + if (this.indent_token()) { + return null; + } + if (this.comment_token()) { + return null; + } + if (this.whitespace_token()) { + return null; + } + return this.literal_token(); + }; + // Tokenizers ========================================================== +})(); \ No newline at end of file diff --git a/src/lexer.coffee b/src/lexer.coffee new file mode 100644 index 0000000000..0bf041c1c4 --- /dev/null +++ b/src/lexer.coffee @@ -0,0 +1,114 @@ +sys: require 'sys' + +# The lexer reads a stream of CoffeeScript and divvys it up into tagged +# tokens. A minor bit of the ambiguity in the grammar has been avoided by +# pushing some extra smarts into the Lexer. +exports.Lexer: lex: -> + +# The list of keywords passed verbatim to the parser. +lex.KEYWORDS: [ + "if", "else", "then", "unless", + "true", "false", "yes", "no", "on", "off", + "and", "or", "is", "isnt", "not", + "new", "return", "arguments", + "try", "catch", "finally", "throw", + "break", "continue", + "for", "in", "of", "by", "where", "while", + "delete", "instanceof", "typeof", + "switch", "when", + "super", "extends" +] + +# Token matching regexes. +lex.IDENTIFIER : /^([a-zA-Z$_](\w|\$)*)/ +lex.NUMBER : /^(\b((0(x|X)[0-9a-fA-F]+)|([0-9]+(\.[0-9]+)?(e[+\-]?[0-9]+)?)))\b/i +lex.STRING : /^(""|''|"(.*?)([^\\]|\\\\)"|'(.*?)([^\\]|\\\\)')/m +lex.HEREDOC : /^("{6}|'{6}|"{3}\n?(.*?)\n?([ \t]*)"{3}|'{3}\n?(.*?)\n?([ \t]*)'{3})/m +lex.JS : /^(``|`(.*?)([^\\]|\\\\)`)/m +lex.OPERATOR : /^([+\*&|\/\-%=<>:!?]+)/ +lex.WHITESPACE : /^([ \t]+)/ +lex.COMMENT : /^(((\n?[ \t]*)?#.*$)+)/ +lex.CODE : /^((-|=)>)/ +lex.REGEX : /^(\/(.*?)([^\\]|\\\\)\/[imgy]{0,4})/ +lex.MULTI_DENT : /^((\n([ \t]*))+)(\.)?/ +lex.LAST_DENT : /\n([ \t]*)/ +lex.ASSIGNMENT : /^(:|=)$/ + +# Token cleaning regexes. +lex.JS_CLEANER : /(^`|`$)/ +lex.MULTILINER : /\n/ +lex.STRING_NEWLINES : /\n[ \t]*/ +lex.COMMENT_CLEANER : /(^[ \t]*#|\n[ \t]*$)/ +lex.NO_NEWLINE : /^([+\*&|\/\-%=<>:!.\\][<>=&|]*|and|or|is|isnt|not|delete|typeof|instanceof)$/ +lex.HEREDOC_INDENT : /^[ \t]+/ + +# Tokens which a regular expression will never immediately follow, but which +# a division operator might. +# See: http://www.mozilla.org/js/language/js20-2002-04/rationale/syntax.html#regular-expressions +lex.NOT_REGEX: [ + 'IDENTIFIER', 'NUMBER', 'REGEX', 'STRING', + ')', '++', '--', ']', '}', + 'FALSE', 'NULL', 'TRUE' +] + +# Tokens which could legitimately be invoked or indexed. +lex.CALLABLE: ['IDENTIFIER', 'SUPER', ')', ']', '}', 'STRING'] + +# Scan by attempting to match tokens one character at a time. Slow and steady. +lex::tokenize: (code) -> + this.code : code.chomp # Cleanup code by remove extra line breaks + this.i : 0 # Current character position we're parsing + this.line : 1 # The current line. + this.indent : 0 # The current indent level. + this.indents : [] # The stack of all indent levels we are currently within. + this.tokens : [] # Collection of all parsed tokens in the form [:TOKEN_TYPE, value] + this.spaced : nil # The last value that has a space following it. + while this.i < this.code.length + this.chunk: this.code[this.i..-1] + this.extract_next_token() + sys.puts "original stream: #{@tokens.inspect}" if process.ENV['VERBOSE'] + this.close_indentation() + (new Rewriter()).rewrite(this.tokens) + +# At every position, run through this list of attempted matches, +# short-circuiting if any of them succeed. +lex::extract_next_token: -> + return if this.identifier_token() + return if this.number_token() + return if this.heredoc_token() + return if this.string_token() + return if this.js_token() + return if this.regex_token() + return if this.indent_token() + return if this.comment_token() + return if this.whitespace_token() + return this.literal_token() + +# Tokenizers ========================================================== + + + + + + + + + + + + + + + + + + + + + + + + + + + From eff2f4b520602c88d6ef8fdf873bdb703d29e8ac Mon Sep 17 00:00:00 2001 From: Jeremy Ashkenas Date: Sat, 30 Jan 2010 00:37:38 -0500 Subject: [PATCH 09/37] a little further on with the lexer --- lib/coffee_script/lexer.js | 55 +++++++++++++++++++++++++++++++++++--- src/lexer.coffee | 36 ++++++++++++++++++++++--- 2 files changed, 84 insertions(+), 7 deletions(-) diff --git a/lib/coffee_script/lexer.js b/lib/coffee_script/lexer.js index 9c01af228a..cbedbdcc97 100644 --- a/lib/coffee_script/lexer.js +++ b/lib/coffee_script/lexer.js @@ -10,9 +10,9 @@ // Token matching regexes. lex.IDENTIFIER = /^([a-zA-Z$_](\w|\$)*)/; lex.NUMBER = /^(\b((0(x|X)[0-9a-fA-F]+)|([0-9]+(\.[0-9]+)?(e[+\-]?[0-9]+)?)))\b/i; - lex.STRING = /^(""|''|"(.*?)([^\\]|\\\\)"|'(.*?)([^\\]|\\\\)')/m; - lex.HEREDOC = /^("{6}|'{6}|"{3}\n?(.*?)\n?([ \t]*)"{3}|'{3}\n?(.*?)\n?([ \t]*)'{3})/m; - lex.JS = /^(``|`(.*?)([^\\]|\\\\)`)/m; + lex.STRING = /^(""|''|"([\s\S]*?)([^\\]|\\\\)"|'([\s\S]*?)([^\\]|\\\\)')/; + lex.HEREDOC = /^("{6}|'{6}|"{3}\n?([\s\S]*?)\n?([ \t]*)"{3}|'{3}\n?([\s\S]*?)\n?([ \t]*)'{3})/; + lex.JS = /^(``|`([\s\S]*?)([^\\]|\\\\)`)/; lex.OPERATOR = /^([+\*&|\/\-%=<>:!?]+)/; lex.WHITESPACE = /^([ \t]+)/; lex.COMMENT = /^(((\n?[ \t]*)?#.*$)+)/; @@ -92,5 +92,54 @@ } return this.literal_token(); }; + // Look at a tag in the current token stream. + lex.prototype.tag = function tag(index, tag) { + var tok; + if (!((tok = this.tokens[index || -1]))) { + return null; + } + if ((typeof tag !== "undefined" && tag !== null)) { + return (tok[0] = tag); + } + return tok[0]; + }; + // Look at a value in the current token stream. + lex.prototype.value = function value(index, val) { + var tok; + if (!((tok = this.tokens[index || -1]))) { + return null; + } + if ((typeof val !== "undefined" && val !== null)) { + return (tok[1] = val); + } + return tok[1]; + }; // Tokenizers ========================================================== + // Matches identifying literals: variables, keywords, method names, etc. + lex.prototype.identifier_token = function identifier_token() { + var id, match, tag; + match = this.chunk.match(lex.IDENTIFIER); + if (!(match && (id = match[1]))) { + return false; + } + // Keywords are special identifiers tagged with their own name, + // 'if' will result in an ['IF', "if"] token. + tag = this.KEYWORDS.indexOf(id) >= 0 ? id.toUpperCase() : 'IDENTIFIER'; + if (tag === 'WHEN' && (this.tag() === 'OUTDENT' || this.tag() === 'INDENT')) { + tag = 'LEADING_WHEN'; + } + if (tag === 'IDENTIFIER' && this.value() === '::') { + this.tag(-1, 'PROTOTYPE_ACCESS'); + } + if (tag === 'IDENTIFIER' && this.value() === '.' && !(this.value(-2) === '.')) { + if (this.tag(-2) === '?') { + this.tag(-1, 'SOAK_ACCESS'); + this.tokens.splice(-2, 1); + } else { + this.tag(-1, 'PROPERTY_ACCESS'); + } + } + this.token(tag, id); + return this.i += id.length; + }; })(); \ No newline at end of file diff --git a/src/lexer.coffee b/src/lexer.coffee index 0bf041c1c4..3e028331d6 100644 --- a/src/lexer.coffee +++ b/src/lexer.coffee @@ -22,9 +22,9 @@ lex.KEYWORDS: [ # Token matching regexes. lex.IDENTIFIER : /^([a-zA-Z$_](\w|\$)*)/ lex.NUMBER : /^(\b((0(x|X)[0-9a-fA-F]+)|([0-9]+(\.[0-9]+)?(e[+\-]?[0-9]+)?)))\b/i -lex.STRING : /^(""|''|"(.*?)([^\\]|\\\\)"|'(.*?)([^\\]|\\\\)')/m -lex.HEREDOC : /^("{6}|'{6}|"{3}\n?(.*?)\n?([ \t]*)"{3}|'{3}\n?(.*?)\n?([ \t]*)'{3})/m -lex.JS : /^(``|`(.*?)([^\\]|\\\\)`)/m +lex.STRING : /^(""|''|"([\s\S]*?)([^\\]|\\\\)"|'([\s\S]*?)([^\\]|\\\\)')/ +lex.HEREDOC : /^("{6}|'{6}|"{3}\n?([\s\S]*?)\n?([ \t]*)"{3}|'{3}\n?([\s\S]*?)\n?([ \t]*)'{3})/ +lex.JS : /^(``|`([\s\S]*?)([^\\]|\\\\)`)/ lex.OPERATOR : /^([+\*&|\/\-%=<>:!?]+)/ lex.WHITESPACE : /^([ \t]+)/ lex.COMMENT : /^(((\n?[ \t]*)?#.*$)+)/ @@ -84,9 +84,37 @@ lex::extract_next_token: -> return if this.whitespace_token() return this.literal_token() -# Tokenizers ========================================================== +# Look at a tag in the current token stream. +lex::tag: (index, tag) -> + return unless tok: this.tokens[index || -1] + return tok[0]: tag if tag? + tok[0] + +# Look at a value in the current token stream. +lex::value: (index, val) -> + return unless tok: this.tokens[index || -1] + return tok[1]: val if val? + tok[1] +# Tokenizers ========================================================== +# Matches identifying literals: variables, keywords, method names, etc. +lex::identifier_token: -> + match: this.chunk.match(lex.IDENTIFIER) + return false unless match and id: match[1] + # Keywords are special identifiers tagged with their own name, + # 'if' will result in an ['IF', "if"] token. + tag: if this.KEYWORDS.indexOf(id) >= 0 then id.toUpperCase() else 'IDENTIFIER' + tag: 'LEADING_WHEN' if tag is 'WHEN' and (this.tag() is 'OUTDENT' or this.tag() is 'INDENT') + this.tag(-1, 'PROTOTYPE_ACCESS') if tag is 'IDENTIFIER' and this.value() is '::' + if tag is 'IDENTIFIER' and this.value() is '.' and !(this.value(-2) is '.') + if this.tag(-2) is '?' + this.tag(-1, 'SOAK_ACCESS') + this.tokens.splice(-2, 1) + else + this.tag(-1, 'PROPERTY_ACCESS') + this.token(tag, id) + this.i += id.length From f19360c6b956030da43a6ea650763a1f200a3d3c Mon Sep 17 00:00:00 2001 From: Jeremy Ashkenas Date: Sat, 30 Jan 2010 14:00:23 -0500 Subject: [PATCH 10/37] waypoint on lexing... parses basic strings, no indentation yet --- lib/coffee_script/lexer.js | 205 +++++++++++++++++++++++++++++-------- lib/coffee_script/lexer.rb | 3 +- src/lexer.coffee | 150 ++++++++++++++++++++++----- 3 files changed, 285 insertions(+), 73 deletions(-) diff --git a/lib/coffee_script/lexer.js b/lib/coffee_script/lexer.js index cbedbdcc97..00c261edbc 100644 --- a/lib/coffee_script/lexer.js +++ b/lib/coffee_script/lexer.js @@ -22,12 +22,12 @@ lex.LAST_DENT = /\n([ \t]*)/; lex.ASSIGNMENT = /^(:|=)$/; // Token cleaning regexes. - lex.JS_CLEANER = /(^`|`$)/; - lex.MULTILINER = /\n/; - lex.STRING_NEWLINES = /\n[ \t]*/; - lex.COMMENT_CLEANER = /(^[ \t]*#|\n[ \t]*$)/; + lex.JS_CLEANER = /(^`|`$)/g; + lex.MULTILINER = /\n/g; + lex.STRING_NEWLINES = /\n[ \t]*/g; + lex.COMMENT_CLEANER = /(^[ \t]*#|\n[ \t]*$)/mg; lex.NO_NEWLINE = /^([+\*&|\/\-%=<>:!.\\][<>=&|]*|and|or|is|isnt|not|delete|typeof|instanceof)$/; - lex.HEREDOC_INDENT = /^[ \t]+/; + lex.HEREDOC_INDENT = /^[ \t]+/g; // Tokens which a regular expression will never immediately follow, but which // a division operator might. // See: http://www.mozilla.org/js/language/js20-2002-04/rationale/syntax.html#regular-expressions @@ -36,8 +36,8 @@ lex.CALLABLE = ['IDENTIFIER', 'SUPER', ')', ']', '}', 'STRING']; // Scan by attempting to match tokens one character at a time. Slow and steady. lex.prototype.tokenize = function tokenize(code) { - this.code = code.chomp; - // Cleanup code by remove extra line breaks + this.code = code; + // Cleanup code by remove extra line breaks, TODO: chomp this.i = 0; // Current character position we're parsing this.line = 1; @@ -48,17 +48,14 @@ // The stack of all indent levels we are currently within. this.tokens = []; // Collection of all parsed tokens in the form [:TOKEN_TYPE, value] - this.spaced = nil; - // The last value that has a space following it. while (this.i < this.code.length) { - this.chunk = this.code.slice(this.i, -1 + 1); + this.chunk = this.code.slice(this.i); this.extract_next_token(); } - if (process.ENV['VERBOSE']) { - sys.puts("original stream: #{@tokens.inspect}"); - } - this.close_indentation(); - return (new Rewriter()).rewrite(this.tokens); + // sys.puts "original stream: #{@tokens.inspect}" if process.ENV['VERBOSE'] + // this.close_indentation() + // (new Rewriter()).rewrite(this.tokens) + return this.tokens; }; // At every position, run through this list of attempted matches, // short-circuiting if any of them succeed. @@ -81,9 +78,7 @@ if (this.regex_token()) { return null; } - if (this.indent_token()) { - return null; - } + // return if this.indent_token() if (this.comment_token()) { return null; } @@ -92,39 +87,16 @@ } return this.literal_token(); }; - // Look at a tag in the current token stream. - lex.prototype.tag = function tag(index, tag) { - var tok; - if (!((tok = this.tokens[index || -1]))) { - return null; - } - if ((typeof tag !== "undefined" && tag !== null)) { - return (tok[0] = tag); - } - return tok[0]; - }; - // Look at a value in the current token stream. - lex.prototype.value = function value(index, val) { - var tok; - if (!((tok = this.tokens[index || -1]))) { - return null; - } - if ((typeof val !== "undefined" && val !== null)) { - return (tok[1] = val); - } - return tok[1]; - }; // Tokenizers ========================================================== // Matches identifying literals: variables, keywords, method names, etc. lex.prototype.identifier_token = function identifier_token() { - var id, match, tag; - match = this.chunk.match(lex.IDENTIFIER); - if (!(match && (id = match[1]))) { + var id, tag; + if (!((id = this.match(lex.IDENTIFIER, 1)))) { return false; } // Keywords are special identifiers tagged with their own name, // 'if' will result in an ['IF', "if"] token. - tag = this.KEYWORDS.indexOf(id) >= 0 ? id.toUpperCase() : 'IDENTIFIER'; + tag = lex.KEYWORDS.indexOf(id) >= 0 ? id.toUpperCase() : 'IDENTIFIER'; if (tag === 'WHEN' && (this.tag() === 'OUTDENT' || this.tag() === 'INDENT')) { tag = 'LEADING_WHEN'; } @@ -142,4 +114,149 @@ this.token(tag, id); return this.i += id.length; }; + // Matches numbers, including decimals, hex, and exponential notation. + lex.prototype.number_token = function number_token() { + var number; + if (!((number = this.match(lex.NUMBER, 1)))) { + return false; + } + this.token('NUMBER', number); + return this.i += number.length; + }; + // Matches strings, including multi-line strings. + lex.prototype.string_token = function string_token() { + var escaped, string; + if (!((string = this.match(lex.STRING, 1)))) { + return false; + } + escaped = string.replace(STRING_NEWLINES, " \\\n"); + this.token('STRING', escaped); + this.line += this.count(string, "\n"); + return this.i += string.length; + }; + // Matches heredocs, adjusting indentation to the correct level. + lex.prototype.heredoc_token = function heredoc_token() { + var doc, indent, match; + if (!((match = this.chunk.match(lex.HEREDOC)))) { + return false; + } + doc = match[2] || match[4]; + indent = doc.match(lex.HEREDOC_INDENT).sort()[0]; + doc = doc.replace(new RegExp("^" + indent, 'g'), '').replace(lex.MULTILINER, "\\n").replace('"', '\\"'); + this.token('STRING', '"' + doc + '"'); + this.line += this.count(match[1], "\n"); + return this.i += match[1].length; + }; + // Matches interpolated JavaScript. + lex.prototype.js_token = function js_token() { + var script; + if (!((script = this.match(lex.JS, 1)))) { + return false; + } + this.token('JS', script.replace(lex.JS_CLEANER, '')); + return this.i += script.length; + }; + // Matches regular expression literals. + lex.prototype.regex_token = function regex_token() { + var regex; + if (!((regex = this.match(lex.REGEX, 1)))) { + return false; + } + if (lex.NOT_REGEX.indexOf(this.tag()) >= 0) { + return false; + } + this.token('REGEX', regex); + return this.i += regex.length; + }; + // Matches and conumes comments. + lex.prototype.comment_token = function comment_token() { + var comment; + if (!((comment = this.match(lex.COMMENT, 1)))) { + return false; + } + this.line += comment.match(lex.MULTILINER).length; + this.token('COMMENT', comment.replace(lex.COMMENT_CLEANER, '').split(lex.MULTILINER)); + this.token("\n", "\n"); + return this.i += comment.length; + }; + // Matches and consumes non-meaningful whitespace. + lex.prototype.whitespace_token = function whitespace_token() { + var space; + if (!((space = this.match(lex.WHITESPACE, 1)))) { + return false; + } + this.value().spaced = true; + return this.i += space.length; + }; + // We treat all other single characters as a token. Eg.: ( ) , . ! + // Multi-character operators are also literal tokens, so that Racc can assign + // the proper order of operations. + lex.prototype.literal_token = function literal_token() { + var match, tag, value; + match = this.chunk.match(lex.OPERATOR); + value = match && match[1]; + if (value && value.match(lex.CODE)) { + tag_parameters(); + } + value = value || this.chunk.substr(0, 1); + tag = value.match(lex.ASSIGNMENT) ? 'ASSIGN' : value; + if (this.value() && this.value().spaced && lex.CALLABLE.indexOf(this.tag() >= 0)) { + if (value === '(') { + tag = 'CALL_START'; + } + if (value === '[') { + tag = 'INDEX_START'; + } + } + this.token(tag, value); + return this.i += value.length; + }; + // Helpers ============================================================= + // Add a token to the results, taking note of the line number. + lex.prototype.token = function token(tag, value) { + return this.tokens.push([tag, value]); + // this.tokens.push([tag, Value.new(value, @line)]) + }; + // Look at a tag in the current token stream. + lex.prototype.tag = function tag(index, tag) { + var tok; + if (!((tok = this.tokens[this.tokens.length - (index || 1)]))) { + return null; + } + if ((typeof tag !== "undefined" && tag !== null)) { + return (tok[0] = tag); + } + return tok[0]; + }; + // Look at a value in the current token stream. + lex.prototype.value = function value(index, val) { + var tok; + if (!((tok = this.tokens[this.tokens.length - (index || 1)]))) { + return null; + } + if ((typeof val !== "undefined" && val !== null)) { + return (tok[1] = val); + } + return tok[1]; + }; + // Count the occurences of a character in a string. + lex.prototype.count = function count(string, char) { + var num, pos; + num = 0; + pos = string.indexOf(char); + while (pos !== -1) { + count += 1; + pos = string.indexOf(char, pos + 1); + } + return count; + }; + // Attempt to match a string against the current chunk, returning the indexed + // match. + lex.prototype.match = function match(regex, index) { + var m; + if (!((m = this.chunk.match(regex)))) { + return false; + } + return m ? m[index] : false; + }; })(); \ No newline at end of file diff --git a/lib/coffee_script/lexer.rb b/lib/coffee_script/lexer.rb index ecb56021ba..99f40a7f63 100644 --- a/lib/coffee_script/lexer.rb +++ b/lib/coffee_script/lexer.rb @@ -229,8 +229,7 @@ def literal_token # Helpers ========================================================== - # Add a token to the results, taking note of the line number, and - # immediately-preceding comment. + # Add a token to the results, taking note of the line number. def token(tag, value) @tokens << [tag, Value.new(value, @line)] end diff --git a/src/lexer.coffee b/src/lexer.coffee index 3e028331d6..096323a5cf 100644 --- a/src/lexer.coffee +++ b/src/lexer.coffee @@ -35,12 +35,12 @@ lex.LAST_DENT : /\n([ \t]*)/ lex.ASSIGNMENT : /^(:|=)$/ # Token cleaning regexes. -lex.JS_CLEANER : /(^`|`$)/ -lex.MULTILINER : /\n/ -lex.STRING_NEWLINES : /\n[ \t]*/ -lex.COMMENT_CLEANER : /(^[ \t]*#|\n[ \t]*$)/ +lex.JS_CLEANER : /(^`|`$)/g +lex.MULTILINER : /\n/g +lex.STRING_NEWLINES : /\n[ \t]*/g +lex.COMMENT_CLEANER : /(^[ \t]*#|\n[ \t]*$)/mg lex.NO_NEWLINE : /^([+\*&|\/\-%=<>:!.\\][<>=&|]*|and|or|is|isnt|not|delete|typeof|instanceof)$/ -lex.HEREDOC_INDENT : /^[ \t]+/ +lex.HEREDOC_INDENT : /^[ \t]+/g # Tokens which a regular expression will never immediately follow, but which # a division operator might. @@ -56,19 +56,19 @@ lex.CALLABLE: ['IDENTIFIER', 'SUPER', ')', ']', '}', 'STRING'] # Scan by attempting to match tokens one character at a time. Slow and steady. lex::tokenize: (code) -> - this.code : code.chomp # Cleanup code by remove extra line breaks + this.code : code # Cleanup code by remove extra line breaks, TODO: chomp this.i : 0 # Current character position we're parsing this.line : 1 # The current line. this.indent : 0 # The current indent level. this.indents : [] # The stack of all indent levels we are currently within. this.tokens : [] # Collection of all parsed tokens in the form [:TOKEN_TYPE, value] - this.spaced : nil # The last value that has a space following it. while this.i < this.code.length - this.chunk: this.code[this.i..-1] + this.chunk: this.code.slice(this.i) this.extract_next_token() - sys.puts "original stream: #{@tokens.inspect}" if process.ENV['VERBOSE'] - this.close_indentation() - (new Rewriter()).rewrite(this.tokens) + # sys.puts "original stream: #{@tokens.inspect}" if process.ENV['VERBOSE'] + # this.close_indentation() + # (new Rewriter()).rewrite(this.tokens) + this.tokens # At every position, run through this list of attempted matches, # short-circuiting if any of them succeed. @@ -79,32 +79,19 @@ lex::extract_next_token: -> return if this.string_token() return if this.js_token() return if this.regex_token() - return if this.indent_token() + # return if this.indent_token() return if this.comment_token() return if this.whitespace_token() return this.literal_token() -# Look at a tag in the current token stream. -lex::tag: (index, tag) -> - return unless tok: this.tokens[index || -1] - return tok[0]: tag if tag? - tok[0] - -# Look at a value in the current token stream. -lex::value: (index, val) -> - return unless tok: this.tokens[index || -1] - return tok[1]: val if val? - tok[1] - # Tokenizers ========================================================== # Matches identifying literals: variables, keywords, method names, etc. lex::identifier_token: -> - match: this.chunk.match(lex.IDENTIFIER) - return false unless match and id: match[1] + return false unless id: this.match lex.IDENTIFIER, 1 # Keywords are special identifiers tagged with their own name, # 'if' will result in an ['IF', "if"] token. - tag: if this.KEYWORDS.indexOf(id) >= 0 then id.toUpperCase() else 'IDENTIFIER' + tag: if lex.KEYWORDS.indexOf(id) >= 0 then id.toUpperCase() else 'IDENTIFIER' tag: 'LEADING_WHEN' if tag is 'WHEN' and (this.tag() is 'OUTDENT' or this.tag() is 'INDENT') this.tag(-1, 'PROTOTYPE_ACCESS') if tag is 'IDENTIFIER' and this.value() is '::' if tag is 'IDENTIFIER' and this.value() is '.' and !(this.value(-2) is '.') @@ -116,6 +103,115 @@ lex::identifier_token: -> this.token(tag, id) this.i += id.length +# Matches numbers, including decimals, hex, and exponential notation. +lex::number_token: -> + return false unless number: this.match lex.NUMBER, 1 + this.token 'NUMBER', number + this.i += number.length + +# Matches strings, including multi-line strings. +lex::string_token: -> + return false unless string: this.match lex.STRING, 1 + escaped: string.replace STRING_NEWLINES, " \\\n" + this.token 'STRING', escaped + this.line += this.count string, "\n" + this.i += string.length + +# Matches heredocs, adjusting indentation to the correct level. +lex::heredoc_token: -> + return false unless match = this.chunk.match(lex.HEREDOC) + doc: match[2] or match[4] + indent: doc.match(lex.HEREDOC_INDENT).sort()[0] + doc: doc.replace(new RegExp("^" + indent, 'g'), '') + .replace(lex.MULTILINER, "\\n") + .replace('"', '\\"') + this.token 'STRING', '"' + doc + '"' + this.line += this.count match[1], "\n" + this.i += match[1].length + +# Matches interpolated JavaScript. +lex::js_token: -> + return false unless script: this.match lex.JS, 1 + this.token 'JS', script.replace(lex.JS_CLEANER, '') + this.i += script.length + +# Matches regular expression literals. +lex::regex_token: -> + return false unless regex: this.match lex.REGEX, 1 + return false if lex.NOT_REGEX.indexOf(this.tag()) >= 0 + this.token 'REGEX', regex + this.i += regex.length + +# Matches and conumes comments. +lex::comment_token: -> + return false unless comment: this.match lex.COMMENT, 1 + this.line += comment.match(lex.MULTILINER).length + this.token 'COMMENT', comment.replace(lex.COMMENT_CLEANER, '').split(lex.MULTILINER) + this.token "\n", "\n" + this.i += comment.length + + + + + +# Matches and consumes non-meaningful whitespace. +lex::whitespace_token: -> + return false unless space: this.match lex.WHITESPACE, 1 + this.value().spaced: true + this.i += space.length + +# We treat all other single characters as a token. Eg.: ( ) , . ! +# Multi-character operators are also literal tokens, so that Racc can assign +# the proper order of operations. +lex::literal_token: -> + match: this.chunk.match(lex.OPERATOR) + value: match and match[1] + tag_parameters() if value and value.match(lex.CODE) + value ||= this.chunk.substr(0, 1) + tag: if value.match(lex.ASSIGNMENT) then 'ASSIGN' else value + if this.value() and this.value().spaced and lex.CALLABLE.indexOf(this.tag() >= 0) + tag: 'CALL_START' if value is '(' + tag: 'INDEX_START' if value is '[' + this.token tag, value + this.i += value.length + +# Helpers ============================================================= + +# Add a token to the results, taking note of the line number. +lex::token: (tag, value) -> + this.tokens.push([tag, value]) + # this.tokens.push([tag, Value.new(value, @line)]) + +# Look at a tag in the current token stream. +lex::tag: (index, tag) -> + return unless tok: this.tokens[this.tokens.length - (index || 1)] + return tok[0]: tag if tag? + tok[0] + +# Look at a value in the current token stream. +lex::value: (index, val) -> + return unless tok: this.tokens[this.tokens.length - (index || 1)] + return tok[1]: val if val? + tok[1] + +# Count the occurences of a character in a string. +lex::count: (string, char) -> + num: 0 + pos: string.indexOf(char) + while pos isnt -1 + count += 1 + pos: string.indexOf(char, pos + 1) + count + +# Attempt to match a string against the current chunk, returning the indexed +# match. +lex::match: (regex, index) -> + return false unless m: this.chunk.match(regex) + if m then m[index] else false + + + + From babeebcc1a5cf390aa0ed6a93b9b364b7ad51739 Mon Sep 17 00:00:00 2001 From: Jeremy Ashkenas Date: Sat, 30 Jan 2010 15:56:40 -0500 Subject: [PATCH 11/37] more progress with the lexer, perhaps it's done --- lib/coffee_script/coffee-script.js | 8 +- lib/coffee_script/lexer.js | 180 +++++++++++++++++++++-------- lib/coffee_script/runner.js | 1 - src/coffee-script.coffee | 4 + src/lexer.coffee | 178 ++++++++++++++++------------ src/runner.coffee | 1 - 6 files changed, 249 insertions(+), 123 deletions(-) diff --git a/lib/coffee_script/coffee-script.js b/lib/coffee_script/coffee-script.js index e69de174b2..7be281083c 100644 --- a/lib/coffee_script/coffee-script.js +++ b/lib/coffee_script/coffee-script.js @@ -23,7 +23,7 @@ }; // Compile a list of CoffeeScript files on disk. exports.compile_files = function compile_files(paths, callback) { - var coffee, js; + var coffee, exit_ran, js; js = ''; coffee = process.createChildProcess(compiler, ['--print'].concat(paths)); coffee.addListener('output', function(results) { @@ -31,7 +31,13 @@ return js += results; } }); + // NB: we have to add a mutex to make sure it doesn't get called twice. + exit_ran = false; return coffee.addListener('exit', function() { + if (exit_ran) { + return null; + } + exit_ran = true; return callback(js); }); }; diff --git a/lib/coffee_script/lexer.js b/lib/coffee_script/lexer.js index 00c261edbc..bc9a74cb78 100644 --- a/lib/coffee_script/lexer.js +++ b/lib/coffee_script/lexer.js @@ -1,39 +1,41 @@ (function(){ - var lex, sys; + var ASSIGNMENT, CALLABLE, CODE, COMMENT, COMMENT_CLEANER, HEREDOC, HEREDOC_INDENT, IDENTIFIER, JS, JS_CLEANER, KEYWORDS, LAST_DENT, LAST_DENTS, MULTILINER, MULTI_DENT, NOT_REGEX, NO_NEWLINE, NUMBER, OPERATOR, REGEX, STRING, STRING_NEWLINES, WHITESPACE, lex, sys; sys = require('sys'); // The lexer reads a stream of CoffeeScript and divvys it up into tagged // tokens. A minor bit of the ambiguity in the grammar has been avoided by // pushing some extra smarts into the Lexer. exports.Lexer = (lex = function lex() { }); + // Constants ============================================================ // The list of keywords passed verbatim to the parser. - lex.KEYWORDS = ["if", "else", "then", "unless", "true", "false", "yes", "no", "on", "off", "and", "or", "is", "isnt", "not", "new", "return", "arguments", "try", "catch", "finally", "throw", "break", "continue", "for", "in", "of", "by", "where", "while", "delete", "instanceof", "typeof", "switch", "when", "super", "extends"]; + KEYWORDS = ["if", "else", "then", "unless", "true", "false", "yes", "no", "on", "off", "and", "or", "is", "isnt", "not", "new", "return", "arguments", "try", "catch", "finally", "throw", "break", "continue", "for", "in", "of", "by", "where", "while", "delete", "instanceof", "typeof", "switch", "when", "super", "extends"]; // Token matching regexes. - lex.IDENTIFIER = /^([a-zA-Z$_](\w|\$)*)/; - lex.NUMBER = /^(\b((0(x|X)[0-9a-fA-F]+)|([0-9]+(\.[0-9]+)?(e[+\-]?[0-9]+)?)))\b/i; - lex.STRING = /^(""|''|"([\s\S]*?)([^\\]|\\\\)"|'([\s\S]*?)([^\\]|\\\\)')/; - lex.HEREDOC = /^("{6}|'{6}|"{3}\n?([\s\S]*?)\n?([ \t]*)"{3}|'{3}\n?([\s\S]*?)\n?([ \t]*)'{3})/; - lex.JS = /^(``|`([\s\S]*?)([^\\]|\\\\)`)/; - lex.OPERATOR = /^([+\*&|\/\-%=<>:!?]+)/; - lex.WHITESPACE = /^([ \t]+)/; - lex.COMMENT = /^(((\n?[ \t]*)?#.*$)+)/; - lex.CODE = /^((-|=)>)/; - lex.REGEX = /^(\/(.*?)([^\\]|\\\\)\/[imgy]{0,4})/; - lex.MULTI_DENT = /^((\n([ \t]*))+)(\.)?/; - lex.LAST_DENT = /\n([ \t]*)/; - lex.ASSIGNMENT = /^(:|=)$/; + IDENTIFIER = /^([a-zA-Z$_](\w|\$)*)/; + NUMBER = /^(\b((0(x|X)[0-9a-fA-F]+)|([0-9]+(\.[0-9]+)?(e[+\-]?[0-9]+)?)))\b/i; + STRING = /^(""|''|"([\s\S]*?)([^\\]|\\\\)"|'([\s\S]*?)([^\\]|\\\\)')/; + HEREDOC = /^("{6}|'{6}|"{3}\n?([\s\S]*?)\n?([ \t]*)"{3}|'{3}\n?([\s\S]*?)\n?([ \t]*)'{3})/; + JS = /^(``|`([\s\S]*?)([^\\]|\\\\)`)/; + OPERATOR = /^([+\*&|\/\-%=<>:!?]+)/; + WHITESPACE = /^([ \t]+)/; + COMMENT = /^(((\n?[ \t]*)?#.*$)+)/; + CODE = /^((-|=)>)/; + REGEX = /^(\/(.*?)([^\\]|\\\\)\/[imgy]{0,4})/; + MULTI_DENT = /^((\n([ \t]*))+)(\.)?/; + LAST_DENTS = /\n([ \t]*)/g; + LAST_DENT = /\n([ \t]*)/; + ASSIGNMENT = /^(:|=)$/; // Token cleaning regexes. - lex.JS_CLEANER = /(^`|`$)/g; - lex.MULTILINER = /\n/g; - lex.STRING_NEWLINES = /\n[ \t]*/g; - lex.COMMENT_CLEANER = /(^[ \t]*#|\n[ \t]*$)/mg; - lex.NO_NEWLINE = /^([+\*&|\/\-%=<>:!.\\][<>=&|]*|and|or|is|isnt|not|delete|typeof|instanceof)$/; - lex.HEREDOC_INDENT = /^[ \t]+/g; + JS_CLEANER = /(^`|`$)/g; + MULTILINER = /\n/g; + STRING_NEWLINES = /\n[ \t]*/g; + COMMENT_CLEANER = /(^[ \t]*#|\n[ \t]*$)/mg; + NO_NEWLINE = /^([+\*&|\/\-%=<>:!.\\][<>=&|]*|and|or|is|isnt|not|delete|typeof|instanceof)$/; + HEREDOC_INDENT = /^[ \t]+/g; // Tokens which a regular expression will never immediately follow, but which // a division operator might. // See: http://www.mozilla.org/js/language/js20-2002-04/rationale/syntax.html#regular-expressions - lex.NOT_REGEX = ['IDENTIFIER', 'NUMBER', 'REGEX', 'STRING', ')', '++', '--', ']', '}', 'FALSE', 'NULL', 'TRUE']; + NOT_REGEX = ['IDENTIFIER', 'NUMBER', 'REGEX', 'STRING', ')', '++', '--', ']', '}', 'FALSE', 'NULL', 'TRUE']; // Tokens which could legitimately be invoked or indexed. - lex.CALLABLE = ['IDENTIFIER', 'SUPER', ')', ']', '}', 'STRING']; + CALLABLE = ['IDENTIFIER', 'SUPER', ')', ']', '}', 'STRING']; // Scan by attempting to match tokens one character at a time. Slow and steady. lex.prototype.tokenize = function tokenize(code) { this.code = code; @@ -52,8 +54,8 @@ this.chunk = this.code.slice(this.i); this.extract_next_token(); } - // sys.puts "original stream: #{@tokens.inspect}" if process.ENV['VERBOSE'] - // this.close_indentation() + // sys.puts "original stream: " + this.tokens if process.ENV['VERBOSE'] + this.close_indentation(); // (new Rewriter()).rewrite(this.tokens) return this.tokens; }; @@ -78,7 +80,9 @@ if (this.regex_token()) { return null; } - // return if this.indent_token() + if (this.indent_token()) { + return null; + } if (this.comment_token()) { return null; } @@ -91,12 +95,12 @@ // Matches identifying literals: variables, keywords, method names, etc. lex.prototype.identifier_token = function identifier_token() { var id, tag; - if (!((id = this.match(lex.IDENTIFIER, 1)))) { + if (!((id = this.match(IDENTIFIER, 1)))) { return false; } // Keywords are special identifiers tagged with their own name, // 'if' will result in an ['IF', "if"] token. - tag = lex.KEYWORDS.indexOf(id) >= 0 ? id.toUpperCase() : 'IDENTIFIER'; + tag = KEYWORDS.indexOf(id) >= 0 ? id.toUpperCase() : 'IDENTIFIER'; if (tag === 'WHEN' && (this.tag() === 'OUTDENT' || this.tag() === 'INDENT')) { tag = 'LEADING_WHEN'; } @@ -117,7 +121,7 @@ // Matches numbers, including decimals, hex, and exponential notation. lex.prototype.number_token = function number_token() { var number; - if (!((number = this.match(lex.NUMBER, 1)))) { + if (!((number = this.match(NUMBER, 1)))) { return false; } this.token('NUMBER', number); @@ -126,7 +130,7 @@ // Matches strings, including multi-line strings. lex.prototype.string_token = function string_token() { var escaped, string; - if (!((string = this.match(lex.STRING, 1)))) { + if (!((string = this.match(STRING, 1)))) { return false; } escaped = string.replace(STRING_NEWLINES, " \\\n"); @@ -137,12 +141,12 @@ // Matches heredocs, adjusting indentation to the correct level. lex.prototype.heredoc_token = function heredoc_token() { var doc, indent, match; - if (!((match = this.chunk.match(lex.HEREDOC)))) { + if (!((match = this.chunk.match(HEREDOC)))) { return false; } doc = match[2] || match[4]; - indent = doc.match(lex.HEREDOC_INDENT).sort()[0]; - doc = doc.replace(new RegExp("^" + indent, 'g'), '').replace(lex.MULTILINER, "\\n").replace('"', '\\"'); + indent = doc.match(HEREDOC_INDENT).sort()[0]; + doc = doc.replace(new RegExp("^" + indent, 'g'), '').replace(MULTILINER, "\\n").replace('"', '\\"'); this.token('STRING', '"' + doc + '"'); this.line += this.count(match[1], "\n"); return this.i += match[1].length; @@ -150,19 +154,19 @@ // Matches interpolated JavaScript. lex.prototype.js_token = function js_token() { var script; - if (!((script = this.match(lex.JS, 1)))) { + if (!((script = this.match(JS, 1)))) { return false; } - this.token('JS', script.replace(lex.JS_CLEANER, '')); + this.token('JS', script.replace(JS_CLEANER, '')); return this.i += script.length; }; // Matches regular expression literals. lex.prototype.regex_token = function regex_token() { var regex; - if (!((regex = this.match(lex.REGEX, 1)))) { + if (!((regex = this.match(REGEX, 1)))) { return false; } - if (lex.NOT_REGEX.indexOf(this.tag()) >= 0) { + if (NOT_REGEX.indexOf(this.tag()) >= 0) { return false; } this.token('REGEX', regex); @@ -171,36 +175,88 @@ // Matches and conumes comments. lex.prototype.comment_token = function comment_token() { var comment; - if (!((comment = this.match(lex.COMMENT, 1)))) { + if (!((comment = this.match(COMMENT, 1)))) { return false; } - this.line += comment.match(lex.MULTILINER).length; - this.token('COMMENT', comment.replace(lex.COMMENT_CLEANER, '').split(lex.MULTILINER)); + this.line += comment.match(MULTILINER).length; + this.token('COMMENT', comment.replace(COMMENT_CLEANER, '').split(MULTILINER)); this.token("\n", "\n"); return this.i += comment.length; }; + // Record tokens for indentation differing from the previous line. + lex.prototype.indent_token = function indent_token() { + var diff, indent, next_character, no_newlines, size; + if (!((indent = this.match(MULTI_DENT, 1)))) { + return false; + } + this.line += indent.match(MULTILINER).length; + this.i += indent.length; + next_character = this.chunk.match(MULTI_DENT)[4]; + no_newlines = next_character === '.' || (this.value().match(NO_NEWLINE) && this.tokens[this.tokens.length - 2][0] !== '.' && !this.value().match(CODE)); + if (no_newlines) { + return this.suppress_newlines(indent); + } + size = indent.match(LAST_DENTS).reverse()[0].match(LAST_DENT)[1].length; + if (size === this.indent) { + return this.newline_token(indent); + } + if (size > this.indent) { + diff = size - this.indent; + this.token('INDENT', diff); + this.indents.push(diff); + } else { + this.outdent_token(this.indent - size); + } + return this.indent = size; + }; + // Record an oudent token or tokens, if we're moving back inwards past + // multiple recorded indents. + lex.prototype.outdent_token = function outdent_token(move_out) { + var last_indent; + while (move_out > 0 && this.indents.length) { + last_indent = this.indents.pop(); + this.token('OUTDENT', last_indent); + move_out -= last_indent; + } + return this.token("\n", "\n"); + }; // Matches and consumes non-meaningful whitespace. lex.prototype.whitespace_token = function whitespace_token() { var space; - if (!((space = this.match(lex.WHITESPACE, 1)))) { + if (!((space = this.match(WHITESPACE, 1)))) { return false; } this.value().spaced = true; return this.i += space.length; }; + // Multiple newlines get merged together. + // Use a trailing \ to escape newlines. + lex.prototype.newline_token = function newline_token(newlines) { + if (!(this.value() === "\n")) { + this.token("\n", "\n"); + } + return true; + }; + // Tokens to explicitly escape newlines are removed once their job is done. + lex.prototype.suppress_newlines = function suppress_newlines(newlines) { + if (this.value() === "\\") { + this.tokens.pop(); + } + return true; + }; // We treat all other single characters as a token. Eg.: ( ) , . ! // Multi-character operators are also literal tokens, so that Racc can assign // the proper order of operations. lex.prototype.literal_token = function literal_token() { var match, tag, value; - match = this.chunk.match(lex.OPERATOR); + match = this.chunk.match(OPERATOR); value = match && match[1]; - if (value && value.match(lex.CODE)) { - tag_parameters(); + if (value && value.match(CODE)) { + this.tag_parameters(); } value = value || this.chunk.substr(0, 1); - tag = value.match(lex.ASSIGNMENT) ? 'ASSIGN' : value; - if (this.value() && this.value().spaced && lex.CALLABLE.indexOf(this.tag() >= 0)) { + tag = value.match(ASSIGNMENT) ? 'ASSIGN' : value; + if (this.value() && this.value().spaced && CALLABLE.indexOf(this.tag() >= 0)) { if (value === '(') { tag = 'CALL_START'; } @@ -259,4 +315,36 @@ } return m ? m[index] : false; }; + // A source of ambiguity in our grammar was parameter lists in function + // definitions (as opposed to argument lists in function calls). Tag + // parameter identifiers in order to avoid this. Also, parameter lists can + // make use of splats. + lex.prototype.tag_parameters = function tag_parameters() { + var __a, i, tok; + if (this.tag() !== ')') { + return null; + } + i = 0; + __a = []; + while (true) { + i += 1; + tok = this.tokens[this.tokens.length - i]; + if (!tok) { + return null; + } + if (tok[0] === 'IDENTIFIER') { + tok[0] = 'PARAM'; + } else if (tok[0] === ')') { + tok[0] = 'PARAM_END'; + } else if (tok[0] === '(') { + return (tok[0] = 'PARAM_START'); + } + } + return __a; + }; + // Close up all remaining open blocks. IF the first token is an indent, + // axe it. + lex.prototype.close_indentation = function close_indentation() { + return this.outdent_token(this.indent); + }; })(); \ No newline at end of file diff --git a/lib/coffee_script/runner.js b/lib/coffee_script/runner.js index 10f6ac9b3c..cdda832754 100644 --- a/lib/coffee_script/runner.js +++ b/lib/coffee_script/runner.js @@ -2,7 +2,6 @@ var coffee, paths; // Quickie script to compile and run all the files given as arguments. coffee = require('./coffee-script'); - process.mixin(require('sys')); paths = process.ARGV; paths = paths.slice(2, paths.length); coffee.compile_files(paths, function(js) { diff --git a/src/coffee-script.coffee b/src/coffee-script.coffee index c164936499..0594c6c6c9 100644 --- a/src/coffee-script.coffee +++ b/src/coffee-script.coffee @@ -23,7 +23,11 @@ exports.compile_files: (paths, callback) -> coffee: process.createChildProcess compiler, ['--print'].concat(paths) coffee.addListener 'output', (results) -> js += results if results? + # NB: we have to add a mutex to make sure it doesn't get called twice. + exit_ran: false coffee.addListener 'exit', -> + return if exit_ran + exit_ran: true callback(js) diff --git a/src/lexer.coffee b/src/lexer.coffee index 096323a5cf..c40dec1413 100644 --- a/src/lexer.coffee +++ b/src/lexer.coffee @@ -5,8 +5,10 @@ sys: require 'sys' # pushing some extra smarts into the Lexer. exports.Lexer: lex: -> +# Constants ============================================================ + # The list of keywords passed verbatim to the parser. -lex.KEYWORDS: [ +KEYWORDS: [ "if", "else", "then", "unless", "true", "false", "yes", "no", "on", "off", "and", "or", "is", "isnt", "not", @@ -20,39 +22,40 @@ lex.KEYWORDS: [ ] # Token matching regexes. -lex.IDENTIFIER : /^([a-zA-Z$_](\w|\$)*)/ -lex.NUMBER : /^(\b((0(x|X)[0-9a-fA-F]+)|([0-9]+(\.[0-9]+)?(e[+\-]?[0-9]+)?)))\b/i -lex.STRING : /^(""|''|"([\s\S]*?)([^\\]|\\\\)"|'([\s\S]*?)([^\\]|\\\\)')/ -lex.HEREDOC : /^("{6}|'{6}|"{3}\n?([\s\S]*?)\n?([ \t]*)"{3}|'{3}\n?([\s\S]*?)\n?([ \t]*)'{3})/ -lex.JS : /^(``|`([\s\S]*?)([^\\]|\\\\)`)/ -lex.OPERATOR : /^([+\*&|\/\-%=<>:!?]+)/ -lex.WHITESPACE : /^([ \t]+)/ -lex.COMMENT : /^(((\n?[ \t]*)?#.*$)+)/ -lex.CODE : /^((-|=)>)/ -lex.REGEX : /^(\/(.*?)([^\\]|\\\\)\/[imgy]{0,4})/ -lex.MULTI_DENT : /^((\n([ \t]*))+)(\.)?/ -lex.LAST_DENT : /\n([ \t]*)/ -lex.ASSIGNMENT : /^(:|=)$/ +IDENTIFIER : /^([a-zA-Z$_](\w|\$)*)/ +NUMBER : /^(\b((0(x|X)[0-9a-fA-F]+)|([0-9]+(\.[0-9]+)?(e[+\-]?[0-9]+)?)))\b/i +STRING : /^(""|''|"([\s\S]*?)([^\\]|\\\\)"|'([\s\S]*?)([^\\]|\\\\)')/ +HEREDOC : /^("{6}|'{6}|"{3}\n?([\s\S]*?)\n?([ \t]*)"{3}|'{3}\n?([\s\S]*?)\n?([ \t]*)'{3})/ +JS : /^(``|`([\s\S]*?)([^\\]|\\\\)`)/ +OPERATOR : /^([+\*&|\/\-%=<>:!?]+)/ +WHITESPACE : /^([ \t]+)/ +COMMENT : /^(((\n?[ \t]*)?#.*$)+)/ +CODE : /^((-|=)>)/ +REGEX : /^(\/(.*?)([^\\]|\\\\)\/[imgy]{0,4})/ +MULTI_DENT : /^((\n([ \t]*))+)(\.)?/ +LAST_DENTS : /\n([ \t]*)/g +LAST_DENT : /\n([ \t]*)/ +ASSIGNMENT : /^(:|=)$/ # Token cleaning regexes. -lex.JS_CLEANER : /(^`|`$)/g -lex.MULTILINER : /\n/g -lex.STRING_NEWLINES : /\n[ \t]*/g -lex.COMMENT_CLEANER : /(^[ \t]*#|\n[ \t]*$)/mg -lex.NO_NEWLINE : /^([+\*&|\/\-%=<>:!.\\][<>=&|]*|and|or|is|isnt|not|delete|typeof|instanceof)$/ -lex.HEREDOC_INDENT : /^[ \t]+/g +JS_CLEANER : /(^`|`$)/g +MULTILINER : /\n/g +STRING_NEWLINES : /\n[ \t]*/g +COMMENT_CLEANER : /(^[ \t]*#|\n[ \t]*$)/mg +NO_NEWLINE : /^([+\*&|\/\-%=<>:!.\\][<>=&|]*|and|or|is|isnt|not|delete|typeof|instanceof)$/ +HEREDOC_INDENT : /^[ \t]+/g # Tokens which a regular expression will never immediately follow, but which # a division operator might. # See: http://www.mozilla.org/js/language/js20-2002-04/rationale/syntax.html#regular-expressions -lex.NOT_REGEX: [ +NOT_REGEX: [ 'IDENTIFIER', 'NUMBER', 'REGEX', 'STRING', ')', '++', '--', ']', '}', 'FALSE', 'NULL', 'TRUE' ] # Tokens which could legitimately be invoked or indexed. -lex.CALLABLE: ['IDENTIFIER', 'SUPER', ')', ']', '}', 'STRING'] +CALLABLE: ['IDENTIFIER', 'SUPER', ')', ']', '}', 'STRING'] # Scan by attempting to match tokens one character at a time. Slow and steady. lex::tokenize: (code) -> @@ -65,8 +68,8 @@ lex::tokenize: (code) -> while this.i < this.code.length this.chunk: this.code.slice(this.i) this.extract_next_token() - # sys.puts "original stream: #{@tokens.inspect}" if process.ENV['VERBOSE'] - # this.close_indentation() + # sys.puts "original stream: " + this.tokens if process.ENV['VERBOSE'] + this.close_indentation() # (new Rewriter()).rewrite(this.tokens) this.tokens @@ -79,7 +82,7 @@ lex::extract_next_token: -> return if this.string_token() return if this.js_token() return if this.regex_token() - # return if this.indent_token() + return if this.indent_token() return if this.comment_token() return if this.whitespace_token() return this.literal_token() @@ -88,10 +91,10 @@ lex::extract_next_token: -> # Matches identifying literals: variables, keywords, method names, etc. lex::identifier_token: -> - return false unless id: this.match lex.IDENTIFIER, 1 + return false unless id: this.match IDENTIFIER, 1 # Keywords are special identifiers tagged with their own name, # 'if' will result in an ['IF', "if"] token. - tag: if lex.KEYWORDS.indexOf(id) >= 0 then id.toUpperCase() else 'IDENTIFIER' + tag: if KEYWORDS.indexOf(id) >= 0 then id.toUpperCase() else 'IDENTIFIER' tag: 'LEADING_WHEN' if tag is 'WHEN' and (this.tag() is 'OUTDENT' or this.tag() is 'INDENT') this.tag(-1, 'PROTOTYPE_ACCESS') if tag is 'IDENTIFIER' and this.value() is '::' if tag is 'IDENTIFIER' and this.value() is '.' and !(this.value(-2) is '.') @@ -105,13 +108,13 @@ lex::identifier_token: -> # Matches numbers, including decimals, hex, and exponential notation. lex::number_token: -> - return false unless number: this.match lex.NUMBER, 1 + return false unless number: this.match NUMBER, 1 this.token 'NUMBER', number this.i += number.length # Matches strings, including multi-line strings. lex::string_token: -> - return false unless string: this.match lex.STRING, 1 + return false unless string: this.match STRING, 1 escaped: string.replace STRING_NEWLINES, " \\\n" this.token 'STRING', escaped this.line += this.count string, "\n" @@ -119,11 +122,11 @@ lex::string_token: -> # Matches heredocs, adjusting indentation to the correct level. lex::heredoc_token: -> - return false unless match = this.chunk.match(lex.HEREDOC) + return false unless match = this.chunk.match(HEREDOC) doc: match[2] or match[4] - indent: doc.match(lex.HEREDOC_INDENT).sort()[0] + indent: doc.match(HEREDOC_INDENT).sort()[0] doc: doc.replace(new RegExp("^" + indent, 'g'), '') - .replace(lex.MULTILINER, "\\n") + .replace(MULTILINER, "\\n") .replace('"', '\\"') this.token 'STRING', '"' + doc + '"' this.line += this.count match[1], "\n" @@ -131,45 +134,79 @@ lex::heredoc_token: -> # Matches interpolated JavaScript. lex::js_token: -> - return false unless script: this.match lex.JS, 1 - this.token 'JS', script.replace(lex.JS_CLEANER, '') + return false unless script: this.match JS, 1 + this.token 'JS', script.replace(JS_CLEANER, '') this.i += script.length # Matches regular expression literals. lex::regex_token: -> - return false unless regex: this.match lex.REGEX, 1 - return false if lex.NOT_REGEX.indexOf(this.tag()) >= 0 + return false unless regex: this.match REGEX, 1 + return false if NOT_REGEX.indexOf(this.tag()) >= 0 this.token 'REGEX', regex this.i += regex.length # Matches and conumes comments. lex::comment_token: -> - return false unless comment: this.match lex.COMMENT, 1 - this.line += comment.match(lex.MULTILINER).length - this.token 'COMMENT', comment.replace(lex.COMMENT_CLEANER, '').split(lex.MULTILINER) + return false unless comment: this.match COMMENT, 1 + this.line += comment.match(MULTILINER).length + this.token 'COMMENT', comment.replace(COMMENT_CLEANER, '').split(MULTILINER) this.token "\n", "\n" this.i += comment.length - - - +# Record tokens for indentation differing from the previous line. +lex::indent_token: -> + return false unless indent: this.match MULTI_DENT, 1 + this.line += indent.match(MULTILINER).length + this.i += indent.length + next_character: this.chunk.match(MULTI_DENT)[4] + no_newlines: next_character is '.' or (this.value().match(NO_NEWLINE) and this.tokens[this.tokens.length - 2][0] isnt '.' and not this.value().match(CODE)) + return this.suppress_newlines(indent) if no_newlines + size: indent.match(LAST_DENTS).reverse()[0].match(LAST_DENT)[1].length + return this.newline_token(indent) if size is this.indent + if size > this.indent + diff: size - this.indent + this.token 'INDENT', diff + this.indents.push diff + else + this.outdent_token this.indent - size + this.indent: size + +# Record an oudent token or tokens, if we're moving back inwards past +# multiple recorded indents. +lex::outdent_token: (move_out) -> + while move_out > 0 and this.indents.length + last_indent: this.indents.pop() + this.token 'OUTDENT', last_indent + move_out -= last_indent + this.token "\n", "\n" # Matches and consumes non-meaningful whitespace. lex::whitespace_token: -> - return false unless space: this.match lex.WHITESPACE, 1 + return false unless space: this.match WHITESPACE, 1 this.value().spaced: true this.i += space.length +# Multiple newlines get merged together. +# Use a trailing \ to escape newlines. +lex::newline_token: (newlines) -> + this.token "\n", "\n" unless this.value() is "\n" + true + +# Tokens to explicitly escape newlines are removed once their job is done. +lex::suppress_newlines: (newlines) -> + this.tokens.pop() if this.value() is "\\" + true + # We treat all other single characters as a token. Eg.: ( ) , . ! # Multi-character operators are also literal tokens, so that Racc can assign # the proper order of operations. lex::literal_token: -> - match: this.chunk.match(lex.OPERATOR) + match: this.chunk.match(OPERATOR) value: match and match[1] - tag_parameters() if value and value.match(lex.CODE) + this.tag_parameters() if value and value.match(CODE) value ||= this.chunk.substr(0, 1) - tag: if value.match(lex.ASSIGNMENT) then 'ASSIGN' else value - if this.value() and this.value().spaced and lex.CALLABLE.indexOf(this.tag() >= 0) + tag: if value.match(ASSIGNMENT) then 'ASSIGN' else value + if this.value() and this.value().spaced and CALLABLE.indexOf(this.tag() >= 0) tag: 'CALL_START' if value is '(' tag: 'INDEX_START' if value is '[' this.token tag, value @@ -209,30 +246,23 @@ lex::match: (regex, index) -> return false unless m: this.chunk.match(regex) if m then m[index] else false - - - - - - - - - - - - - - - - - - - - - - - - - - - +# A source of ambiguity in our grammar was parameter lists in function +# definitions (as opposed to argument lists in function calls). Tag +# parameter identifiers in order to avoid this. Also, parameter lists can +# make use of splats. +lex::tag_parameters: -> + return if this.tag() isnt ')' + i: 0 + while true + i += 1 + tok: this.tokens[this.tokens.length - i] + return if not tok + switch tok[0] + when 'IDENTIFIER' then tok[0]: 'PARAM' + when ')' then tok[0]: 'PARAM_END' + when '(' then return tok[0]: 'PARAM_START' + +# Close up all remaining open blocks. IF the first token is an indent, +# axe it. +lex::close_indentation: -> + this.outdent_token(this.indent) diff --git a/src/runner.coffee b/src/runner.coffee index aed683874d..7e7b7b6937 100644 --- a/src/runner.coffee +++ b/src/runner.coffee @@ -1,7 +1,6 @@ # Quickie script to compile and run all the files given as arguments. coffee: require './coffee-script' -process.mixin require 'sys' paths: process.ARGV paths: paths[2...paths.length] From e755188878ae9e9830e758d18b698bff43e67109 Mon Sep 17 00:00:00 2001 From: Jeremy Ashkenas Date: Sat, 30 Jan 2010 16:14:13 -0500 Subject: [PATCH 12/37] mixing in sys again, for the tests --- lib/coffee_script/runner.js | 1 + src/runner.coffee | 1 + 2 files changed, 2 insertions(+) diff --git a/lib/coffee_script/runner.js b/lib/coffee_script/runner.js index cdda832754..592b43de2d 100644 --- a/lib/coffee_script/runner.js +++ b/lib/coffee_script/runner.js @@ -1,6 +1,7 @@ (function(){ var coffee, paths; // Quickie script to compile and run all the files given as arguments. + process.mixin(require('sys')); coffee = require('./coffee-script'); paths = process.ARGV; paths = paths.slice(2, paths.length); diff --git a/src/runner.coffee b/src/runner.coffee index 7e7b7b6937..8ad7ffb5f5 100644 --- a/src/runner.coffee +++ b/src/runner.coffee @@ -1,5 +1,6 @@ # Quickie script to compile and run all the files given as arguments. +process.mixin require 'sys' coffee: require './coffee-script' paths: process.ARGV From 84feab3492514721aa67d3029f29f59bfeb24686 Mon Sep 17 00:00:00 2001 From: Jeremy Ashkenas Date: Sat, 30 Jan 2010 17:02:05 -0500 Subject: [PATCH 13/37] first little piece of the rewriter --- lib/coffee_script/coffee-script.js | 3 +- lib/coffee_script/lexer.js | 39 ++++++---- lib/coffee_script/rewriter.js | 104 +++++++++++++++++++++++++ src/coffee-script.coffee | 1 - src/lexer.coffee | 15 +++- src/rewriter.coffee | 120 +++++++++++++++++++++++++++++ 6 files changed, 263 insertions(+), 19 deletions(-) create mode 100644 lib/coffee_script/rewriter.js create mode 100644 src/rewriter.coffee diff --git a/lib/coffee_script/coffee-script.js b/lib/coffee_script/coffee-script.js index 7be281083c..58bbe31892 100644 --- a/lib/coffee_script/coffee-script.js +++ b/lib/coffee_script/coffee-script.js @@ -1,7 +1,6 @@ (function(){ - var compiler, path, sys; + var compiler, path; // Executes the `coffee` Ruby program to convert from CoffeeScript to JavaScript. - sys = require('sys'); path = require('path'); // The path to the CoffeeScript executable. compiler = path.normalize(path.dirname(__filename) + '/../../bin/coffee'); diff --git a/lib/coffee_script/lexer.js b/lib/coffee_script/lexer.js index bc9a74cb78..1028280baa 100644 --- a/lib/coffee_script/lexer.js +++ b/lib/coffee_script/lexer.js @@ -1,6 +1,7 @@ (function(){ - var ASSIGNMENT, CALLABLE, CODE, COMMENT, COMMENT_CLEANER, HEREDOC, HEREDOC_INDENT, IDENTIFIER, JS, JS_CLEANER, KEYWORDS, LAST_DENT, LAST_DENTS, MULTILINER, MULTI_DENT, NOT_REGEX, NO_NEWLINE, NUMBER, OPERATOR, REGEX, STRING, STRING_NEWLINES, WHITESPACE, lex, sys; + var ASSIGNMENT, CALLABLE, CODE, COMMENT, COMMENT_CLEANER, HEREDOC, HEREDOC_INDENT, IDENTIFIER, JS, JS_CLEANER, KEYWORDS, LAST_DENT, LAST_DENTS, MULTILINER, MULTI_DENT, NOT_REGEX, NO_NEWLINE, NUMBER, OPERATOR, REGEX, Rewriter, STRING, STRING_NEWLINES, WHITESPACE, lex, sys; sys = require('sys'); + Rewriter = require('./rewriter').Rewriter; // The lexer reads a stream of CoffeeScript and divvys it up into tagged // tokens. A minor bit of the ambiguity in the grammar has been avoided by // pushing some extra smarts into the Lexer. @@ -56,8 +57,7 @@ } // sys.puts "original stream: " + this.tokens if process.ENV['VERBOSE'] this.close_indentation(); - // (new Rewriter()).rewrite(this.tokens) - return this.tokens; + return (new Rewriter()).rewrite(this.tokens); }; // At every position, run through this list of attempted matches, // short-circuiting if any of them succeed. @@ -116,7 +116,8 @@ } } this.token(tag, id); - return this.i += id.length; + this.i += id.length; + return true; }; // Matches numbers, including decimals, hex, and exponential notation. lex.prototype.number_token = function number_token() { @@ -125,7 +126,8 @@ return false; } this.token('NUMBER', number); - return this.i += number.length; + this.i += number.length; + return true; }; // Matches strings, including multi-line strings. lex.prototype.string_token = function string_token() { @@ -136,7 +138,8 @@ escaped = string.replace(STRING_NEWLINES, " \\\n"); this.token('STRING', escaped); this.line += this.count(string, "\n"); - return this.i += string.length; + this.i += string.length; + return true; }; // Matches heredocs, adjusting indentation to the correct level. lex.prototype.heredoc_token = function heredoc_token() { @@ -149,7 +152,8 @@ doc = doc.replace(new RegExp("^" + indent, 'g'), '').replace(MULTILINER, "\\n").replace('"', '\\"'); this.token('STRING', '"' + doc + '"'); this.line += this.count(match[1], "\n"); - return this.i += match[1].length; + this.i += match[1].length; + return true; }; // Matches interpolated JavaScript. lex.prototype.js_token = function js_token() { @@ -158,7 +162,8 @@ return false; } this.token('JS', script.replace(JS_CLEANER, '')); - return this.i += script.length; + this.i += script.length; + return true; }; // Matches regular expression literals. lex.prototype.regex_token = function regex_token() { @@ -170,7 +175,8 @@ return false; } this.token('REGEX', regex); - return this.i += regex.length; + this.i += regex.length; + return true; }; // Matches and conumes comments. lex.prototype.comment_token = function comment_token() { @@ -181,7 +187,8 @@ this.line += comment.match(MULTILINER).length; this.token('COMMENT', comment.replace(COMMENT_CLEANER, '').split(MULTILINER)); this.token("\n", "\n"); - return this.i += comment.length; + this.i += comment.length; + return true; }; // Record tokens for indentation differing from the previous line. lex.prototype.indent_token = function indent_token() { @@ -207,7 +214,8 @@ } else { this.outdent_token(this.indent - size); } - return this.indent = size; + this.indent = size; + return true; }; // Record an oudent token or tokens, if we're moving back inwards past // multiple recorded indents. @@ -218,7 +226,8 @@ this.token('OUTDENT', last_indent); move_out -= last_indent; } - return this.token("\n", "\n"); + this.token("\n", "\n"); + return true; }; // Matches and consumes non-meaningful whitespace. lex.prototype.whitespace_token = function whitespace_token() { @@ -227,7 +236,8 @@ return false; } this.value().spaced = true; - return this.i += space.length; + this.i += space.length; + return true; }; // Multiple newlines get merged together. // Use a trailing \ to escape newlines. @@ -265,7 +275,8 @@ } } this.token(tag, value); - return this.i += value.length; + this.i += value.length; + return true; }; // Helpers ============================================================= // Add a token to the results, taking note of the line number. diff --git a/lib/coffee_script/rewriter.js b/lib/coffee_script/rewriter.js new file mode 100644 index 0000000000..ef2c92c13f --- /dev/null +++ b/lib/coffee_script/rewriter.js @@ -0,0 +1,104 @@ +(function(){ + var BALANCED_PAIRS, EXPRESSION_CLOSE, EXPRESSION_START, EXPRESSION_TAIL, IMPLICIT_CALL, IMPLICIT_END, IMPLICIT_FUNC, INVERSES, SINGLE_CLOSERS, SINGLE_LINERS, __a, __b, __c, __d, __e, __f, __g, __h, pair, re; + // In order to keep the grammar simple, the stream of tokens that the Lexer + // emits is rewritten by the Rewriter, smoothing out ambiguities, mis-nested + // indentation, and single-line flavors of expressions. + exports.Rewriter = (re = function re() { }); + // Tokens that must be balanced. + BALANCED_PAIRS = [['(', ')'], ['[', ']'], ['{', '}'], ['INDENT', 'OUTDENT'], ['PARAM_START', 'PARAM_END'], ['CALL_START', 'CALL_END'], ['INDEX_START', 'INDEX_END']]; + // Tokens that signal the start of a balanced pair. + EXPRESSION_START = (function() { + __a = []; __b = BALANCED_PAIRS; + for (__c = 0; __c < __b.length; __c++) { + pair = __b[__c]; + __a.push(pair[0]); + } + return __a; + }).call(this); + // Tokens that signal the end of a balanced pair. + EXPRESSION_TAIL = (function() { + __d = []; __e = BALANCED_PAIRS; + for (__f = 0; __f < __e.length; __f++) { + pair = __e[__f]; + __d.push(pair[1]); + } + return __d; + }).call(this); + // Tokens that indicate the close of a clause of an expression. + EXPRESSION_CLOSE = ['CATCH', 'WHEN', 'ELSE', 'FINALLY'].concat(EXPRESSION_TAIL); + // Tokens pairs that, in immediate succession, indicate an implicit call. + IMPLICIT_FUNC = ['IDENTIFIER', 'SUPER', ')', 'CALL_END', ']', 'INDEX_END']; + IMPLICIT_END = ['IF', 'UNLESS', 'FOR', 'WHILE', "\n", 'OUTDENT']; + IMPLICIT_CALL = ['IDENTIFIER', 'NUMBER', 'STRING', 'JS', 'REGEX', 'NEW', 'PARAM_START', 'TRY', 'DELETE', 'TYPEOF', 'SWITCH', 'ARGUMENTS', 'TRUE', 'FALSE', 'YES', 'NO', 'ON', 'OFF', '!', '!!', 'NOT', '->', '=>', '[', '(', '{']; + // The inverse mappings of token pairs we're trying to fix up. + INVERSES = { + }; + __g = BALANCED_PAIRS; + for (__h = 0; __h < __g.length; __h++) { + pair = __g[__h]; + INVERSES[pair[0]] = pair[1]; + INVERSES[pair[1]] = pair[0]; + } + // Single-line flavors of block expressions that have unclosed endings. + // The grammar can't disambiguate them, so we insert the implicit indentation. + SINGLE_LINERS = ['ELSE', "->", "=>", 'TRY', 'FINALLY', 'THEN']; + SINGLE_CLOSERS = ["\n", 'CATCH', 'FINALLY', 'ELSE', 'OUTDENT', 'LEADING_WHEN', 'PARAM_START']; + // Rewrite the token stream in multiple passes, one logical filter at + // a time. This could certainly be changed into a single pass through the + // stream, with a big ol' efficient switch, but it's much nicer like this. + re.prototype.rewrite = function rewrite(tokens) { + this.tokens = tokens; + this.adjust_comments(); + // this.remove_leading_newlines() + // this.remove_mid_expression_newlines() + // this.move_commas_outside_outdents() + // this.close_open_calls_and_indexes() + // this.add_implicit_parentheses() + // this.add_implicit_indentation() + // this.ensure_balance(BALANCED_PAIRS) + // this.rewrite_closing_parens() + return this.tokens; + }; + // Rewrite the token stream, looking one token ahead and behind. + // Allow the return value of the block to tell us how many tokens to move + // forwards (or backwards) in the stream, to make sure we don't miss anything + // as the stream changes length under our feet. + re.prototype.scan_tokens = function scan_tokens(yield) { + var i, move; + i = 0; + while (true) { + if (!(this.tokens[i])) { + break; + } + move = yield(this.tokens[i - 1], this.tokens[i], this.tokens[i + 1], i); + i += move; + } + return true; + }; + // Massage newlines and indentations so that comments don't have to be + // correctly indented, or appear on their own line. + re.prototype.adjust_comments = function adjust_comments() { + return this.scan_tokens(function(prev, token, post, i) { + var after, before; + if (!(token[0] === 'COMMENT')) { + return 1; + } + before = this.tokens[i - 2]; + after = this.tokens[i + 2]; + if (before && after && ((before[0] === 'INDENT' && after[0] === 'OUTDENT') || (before[0] === 'OUTDENT' && after[0] === 'INDENT')) && before[1] === after[1]) { + this.tokens.splice(i + 2, 1); + this.tokens.splice(i - 2, 1); + return 0; + } else if (prev[0] === "\n" && after[0] === 'INDENT') { + this.tokens.splice(i + 2, 1); + this.tokens[i - 1] = after; + return 1; + } else if (prev[0] !== "\n" && prev[0] !== 'INDENT' && prev[0] !== 'OUTDENT') { + this.tokens.splice(i, 0, ["\n", "\n"]); + return 2; + } else { + return 1; + } + }); + }; +})(); \ No newline at end of file diff --git a/src/coffee-script.coffee b/src/coffee-script.coffee index 0594c6c6c9..c2519717a4 100644 --- a/src/coffee-script.coffee +++ b/src/coffee-script.coffee @@ -1,6 +1,5 @@ # Executes the `coffee` Ruby program to convert from CoffeeScript to JavaScript. -sys: require('sys') path: require('path') # The path to the CoffeeScript executable. diff --git a/src/lexer.coffee b/src/lexer.coffee index c40dec1413..dbe1450463 100644 --- a/src/lexer.coffee +++ b/src/lexer.coffee @@ -1,4 +1,5 @@ sys: require 'sys' +Rewriter: require('./rewriter').Rewriter # The lexer reads a stream of CoffeeScript and divvys it up into tagged # tokens. A minor bit of the ambiguity in the grammar has been avoided by @@ -70,8 +71,7 @@ lex::tokenize: (code) -> this.extract_next_token() # sys.puts "original stream: " + this.tokens if process.ENV['VERBOSE'] this.close_indentation() - # (new Rewriter()).rewrite(this.tokens) - this.tokens + (new Rewriter()).rewrite this.tokens # At every position, run through this list of attempted matches, # short-circuiting if any of them succeed. @@ -105,12 +105,14 @@ lex::identifier_token: -> this.tag(-1, 'PROPERTY_ACCESS') this.token(tag, id) this.i += id.length + true # Matches numbers, including decimals, hex, and exponential notation. lex::number_token: -> return false unless number: this.match NUMBER, 1 this.token 'NUMBER', number this.i += number.length + true # Matches strings, including multi-line strings. lex::string_token: -> @@ -119,6 +121,7 @@ lex::string_token: -> this.token 'STRING', escaped this.line += this.count string, "\n" this.i += string.length + true # Matches heredocs, adjusting indentation to the correct level. lex::heredoc_token: -> @@ -131,12 +134,14 @@ lex::heredoc_token: -> this.token 'STRING', '"' + doc + '"' this.line += this.count match[1], "\n" this.i += match[1].length + true # Matches interpolated JavaScript. lex::js_token: -> return false unless script: this.match JS, 1 this.token 'JS', script.replace(JS_CLEANER, '') this.i += script.length + true # Matches regular expression literals. lex::regex_token: -> @@ -144,6 +149,7 @@ lex::regex_token: -> return false if NOT_REGEX.indexOf(this.tag()) >= 0 this.token 'REGEX', regex this.i += regex.length + true # Matches and conumes comments. lex::comment_token: -> @@ -152,6 +158,7 @@ lex::comment_token: -> this.token 'COMMENT', comment.replace(COMMENT_CLEANER, '').split(MULTILINER) this.token "\n", "\n" this.i += comment.length + true # Record tokens for indentation differing from the previous line. lex::indent_token: -> @@ -170,6 +177,7 @@ lex::indent_token: -> else this.outdent_token this.indent - size this.indent: size + true # Record an oudent token or tokens, if we're moving back inwards past # multiple recorded indents. @@ -179,12 +187,14 @@ lex::outdent_token: (move_out) -> this.token 'OUTDENT', last_indent move_out -= last_indent this.token "\n", "\n" + true # Matches and consumes non-meaningful whitespace. lex::whitespace_token: -> return false unless space: this.match WHITESPACE, 1 this.value().spaced: true this.i += space.length + true # Multiple newlines get merged together. # Use a trailing \ to escape newlines. @@ -211,6 +221,7 @@ lex::literal_token: -> tag: 'INDEX_START' if value is '[' this.token tag, value this.i += value.length + true # Helpers ============================================================= diff --git a/src/rewriter.coffee b/src/rewriter.coffee new file mode 100644 index 0000000000..21775b72a5 --- /dev/null +++ b/src/rewriter.coffee @@ -0,0 +1,120 @@ +# In order to keep the grammar simple, the stream of tokens that the Lexer +# emits is rewritten by the Rewriter, smoothing out ambiguities, mis-nested +# indentation, and single-line flavors of expressions. +exports.Rewriter: re: -> + +# Tokens that must be balanced. +BALANCED_PAIRS: [['(', ')'], ['[', ']'], ['{', '}'], ['INDENT', 'OUTDENT'], + ['PARAM_START', 'PARAM_END'], ['CALL_START', 'CALL_END'], ['INDEX_START', 'INDEX_END']] + +# Tokens that signal the start of a balanced pair. +EXPRESSION_START: pair[0] for pair in BALANCED_PAIRS + +# Tokens that signal the end of a balanced pair. +EXPRESSION_TAIL: pair[1] for pair in BALANCED_PAIRS + +# Tokens that indicate the close of a clause of an expression. +EXPRESSION_CLOSE: ['CATCH', 'WHEN', 'ELSE', 'FINALLY'].concat(EXPRESSION_TAIL) + +# Tokens pairs that, in immediate succession, indicate an implicit call. +IMPLICIT_FUNC: ['IDENTIFIER', 'SUPER', ')', 'CALL_END', ']', 'INDEX_END'] +IMPLICIT_END: ['IF', 'UNLESS', 'FOR', 'WHILE', "\n", 'OUTDENT'] +IMPLICIT_CALL: ['IDENTIFIER', 'NUMBER', 'STRING', 'JS', 'REGEX', 'NEW', 'PARAM_START', + 'TRY', 'DELETE', 'TYPEOF', 'SWITCH', 'ARGUMENTS', + 'TRUE', 'FALSE', 'YES', 'NO', 'ON', 'OFF', '!', '!!', 'NOT', + '->', '=>', '[', '(', '{'] + +# The inverse mappings of token pairs we're trying to fix up. +INVERSES: {} +for pair in BALANCED_PAIRS + INVERSES[pair[0]]: pair[1] + INVERSES[pair[1]]: pair[0] + +# Single-line flavors of block expressions that have unclosed endings. +# The grammar can't disambiguate them, so we insert the implicit indentation. +SINGLE_LINERS: ['ELSE', "->", "=>", 'TRY', 'FINALLY', 'THEN'] +SINGLE_CLOSERS: ["\n", 'CATCH', 'FINALLY', 'ELSE', 'OUTDENT', 'LEADING_WHEN', 'PARAM_START'] + +# Rewrite the token stream in multiple passes, one logical filter at +# a time. This could certainly be changed into a single pass through the +# stream, with a big ol' efficient switch, but it's much nicer like this. +re::rewrite: (tokens) -> + this.tokens: tokens + this.adjust_comments() + # this.remove_leading_newlines() + # this.remove_mid_expression_newlines() + # this.move_commas_outside_outdents() + # this.close_open_calls_and_indexes() + # this.add_implicit_parentheses() + # this.add_implicit_indentation() + # this.ensure_balance(BALANCED_PAIRS) + # this.rewrite_closing_parens() + this.tokens + +# Rewrite the token stream, looking one token ahead and behind. +# Allow the return value of the block to tell us how many tokens to move +# forwards (or backwards) in the stream, to make sure we don't miss anything +# as the stream changes length under our feet. +re::scan_tokens: (yield) -> + i = 0 + while true + break unless this.tokens[i] + move: yield(this.tokens[i - 1], this.tokens[i], this.tokens[i + 1], i) + i += move + true + +# Massage newlines and indentations so that comments don't have to be +# correctly indented, or appear on their own line. +re::adjust_comments: -> + this.scan_tokens (prev, token, post, i) -> + return 1 unless token[0] is 'COMMENT' + before: this.tokens[i - 2] + after: this.tokens[i + 2] + if before and after and + ((before[0] is 'INDENT' and after[0] is 'OUTDENT') or + (before[0] is 'OUTDENT' and after[0] is 'INDENT')) and + before[1] is after[1] + this.tokens.splice(i + 2, 1) + this.tokens.splice(i - 2, 1) + return 0 + else if prev[0] is "\n" and after[0] is 'INDENT' + this.tokens.splice(i + 2, 1) + this.tokens[i - 1]: after + return 1 + else if prev[0] isnt "\n" and prev[0] isnt 'INDENT' and prev[0] isnt 'OUTDENT' + this.tokens.splice(i, 0, ["\n", "\n"]) + return 2 + else + return 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 557cdbba71380c3e4f59f098e3a4523cc3f25094 Mon Sep 17 00:00:00 2001 From: Jeremy Ashkenas Date: Sat, 30 Jan 2010 17:24:48 -0500 Subject: [PATCH 14/37] rewriter is halfway done, and working --- lib/coffee_script/lexer.js | 2 +- lib/coffee_script/rewriter.js | 170 +++++++++++++++++++++++++++++----- lib/coffee_script/rewriter.rb | 48 +++++----- src/lexer.coffee | 2 +- src/rewriter.coffee | 94 +++++++++++++++++-- 5 files changed, 259 insertions(+), 57 deletions(-) diff --git a/lib/coffee_script/lexer.js b/lib/coffee_script/lexer.js index 1028280baa..f8b25f1c77 100644 --- a/lib/coffee_script/lexer.js +++ b/lib/coffee_script/lexer.js @@ -266,7 +266,7 @@ } value = value || this.chunk.substr(0, 1); tag = value.match(ASSIGNMENT) ? 'ASSIGN' : value; - if (this.value() && this.value().spaced && CALLABLE.indexOf(this.tag() >= 0)) { + if (this.value() && !this.value().spaced && CALLABLE.indexOf(this.tag() >= 0)) { if (value === '(') { tag = 'CALL_START'; } diff --git a/lib/coffee_script/rewriter.js b/lib/coffee_script/rewriter.js index ef2c92c13f..df98532165 100644 --- a/lib/coffee_script/rewriter.js +++ b/lib/coffee_script/rewriter.js @@ -49,12 +49,12 @@ re.prototype.rewrite = function rewrite(tokens) { this.tokens = tokens; this.adjust_comments(); - // this.remove_leading_newlines() - // this.remove_mid_expression_newlines() - // this.move_commas_outside_outdents() - // this.close_open_calls_and_indexes() + this.remove_leading_newlines(); + this.remove_mid_expression_newlines(); + this.move_commas_outside_outdents(); + this.close_open_calls_and_indexes(); // this.add_implicit_parentheses() - // this.add_implicit_indentation() + this.add_implicit_indentation(); // this.ensure_balance(BALANCED_PAIRS) // this.rewrite_closing_parens() return this.tokens; @@ -78,27 +78,149 @@ // Massage newlines and indentations so that comments don't have to be // correctly indented, or appear on their own line. re.prototype.adjust_comments = function adjust_comments() { - return this.scan_tokens(function(prev, token, post, i) { - var after, before; - if (!(token[0] === 'COMMENT')) { - return 1; - } - before = this.tokens[i - 2]; - after = this.tokens[i + 2]; - if (before && after && ((before[0] === 'INDENT' && after[0] === 'OUTDENT') || (before[0] === 'OUTDENT' && after[0] === 'INDENT')) && before[1] === after[1]) { - this.tokens.splice(i + 2, 1); - this.tokens.splice(i - 2, 1); + return this.scan_tokens((function(__this) { + var __func = function(prev, token, post, i) { + var after, before; + if (!(token[0] === 'COMMENT')) { + return 1; + } + before = this.tokens[i - 2]; + after = this.tokens[i + 2]; + if (before && after && ((before[0] === 'INDENT' && after[0] === 'OUTDENT') || (before[0] === 'OUTDENT' && after[0] === 'INDENT')) && before[1] === after[1]) { + this.tokens.splice(i + 2, 1); + this.tokens.splice(i - 2, 1); + return 0; + } else if (prev[0] === "\n" && after[0] === 'INDENT') { + this.tokens.splice(i + 2, 1); + this.tokens[i - 1] = after; + return 1; + } else if (prev[0] !== "\n" && prev[0] !== 'INDENT' && prev[0] !== 'OUTDENT') { + this.tokens.splice(i, 0, ["\n", "\n"]); + return 2; + } else { + return 1; + } + }; + return (function() { + return __func.apply(__this, arguments); + }); + })(this)); + }; + // Leading newlines would introduce an ambiguity in the grammar, so we + // dispatch them here. + re.prototype.remove_leading_newlines = function remove_leading_newlines() { + if (this.tokens[0][0] === "\n") { + return this.tokens.shift(); + } + }; + // Some blocks occur in the middle of expressions -- when we're expecting + // this, remove their trailing newlines. + re.prototype.remove_mid_expression_newlines = function remove_mid_expression_newlines() { + return this.scan_tokens((function(__this) { + var __func = function(prev, token, post, i) { + if (!(post && EXPRESSION_CLOSE.indexOf(post[0]) >= 0 && token[0] === "\n")) { + return 1; + } + this.tokens.splice(i, 1); return 0; - } else if (prev[0] === "\n" && after[0] === 'INDENT') { - this.tokens.splice(i + 2, 1); - this.tokens[i - 1] = after; + }; + return (function() { + return __func.apply(__this, arguments); + }); + })(this)); + }; + // Make sure that we don't accidentally break trailing commas, which need + // to go on the outside of expression closers. + re.prototype.move_commas_outside_outdents = function move_commas_outside_outdents() { + return this.scan_tokens((function(__this) { + var __func = function(prev, token, post, i) { + if (token[0] === 'OUTDENT' && prev[0] === ',') { + this.tokens.splice(i, 1, token); + } return 1; - } else if (prev[0] !== "\n" && prev[0] !== 'INDENT' && prev[0] !== 'OUTDENT') { - this.tokens.splice(i, 0, ["\n", "\n"]); - return 2; - } else { + }; + return (function() { + return __func.apply(__this, arguments); + }); + })(this)); + }; + // We've tagged the opening parenthesis of a method call, and the opening + // bracket of an indexing operation. Match them with their close. + re.prototype.close_open_calls_and_indexes = function close_open_calls_and_indexes() { + var brackets, parens; + parens = [0]; + brackets = [0]; + return this.scan_tokens((function(__this) { + var __func = function(prev, token, post, i) { + if (token[0] === 'CALL_START') { + parens.push(0); + } else if (token[0] === 'INDEX_START') { + brackets.push(0); + } else if (token[0] === '(') { + parens[-1] += 1; + } else if (token[0] === '[') { + brackets[-1] += 1; + } else if (token[0] === ')') { + if (parens[parens.length - 1] === 0) { + parens.pop; + token[0] = 'CALL_END'; + } else { + parens[parens.length - 1] -= 1; + } + } else if (token[0] === ']') { + if (brackets[brackets.length - 1] === 0) { + brackets.pop(); + token[0] = 'INDEX_END'; + } else { + brackets[brackets.length - 1] -= 1; + } + } return 1; - } - }); + }; + return (function() { + return __func.apply(__this, arguments); + }); + })(this)); + }; + // Because our grammar is LALR(1), it can't handle some single-line + // expressions that lack ending delimiters. Use the lexer to add the implicit + // blocks, so it doesn't need to. + // ')' can close a single-line block, but we need to make sure it's balanced. + re.prototype.add_implicit_indentation = function add_implicit_indentation() { + return this.scan_tokens((function(__this) { + var __func = function(prev, token, post, i) { + var idx, insertion, parens, starter, tok; + if (!(SINGLE_LINERS.indexOf(token[0]) >= 0 && post[0] !== 'INDENT' && !(token[0] === 'ELSE' && post[0] === 'IF'))) { + return 1; + } + starter = token[0]; + this.tokens.splice(i + 1, 0, ['INDENT', 2]); + idx = i + 1; + parens = 0; + while (true) { + idx += 1; + tok = this.tokens[idx]; + if ((!tok || SINGLE_CLOSERS.indexOf(tok[0]) >= 0 || (tok[0] === ')' && parens === 0)) && !(starter === 'ELSE' && tok[0] === 'ELSE')) { + insertion = this.tokens[idx - 1][0] === "," ? idx - 1 : idx; + this.tokens.splice(insertion, 0, ['OUTDENT', 2]); + break; + } + if (tok[0] === '(') { + parens += 1; + } + if (tok[0] === ')') { + parens -= 1; + } + } + if (!(token[0] === 'THEN')) { + return 1; + } + this.tokens.splice(i, 1); + return 0; + }; + return (function() { + return __func.apply(__this, arguments); + }); + })(this)); }; })(); \ No newline at end of file diff --git a/lib/coffee_script/rewriter.rb b/lib/coffee_script/rewriter.rb index 287d11c24a..4a3845fc84 100644 --- a/lib/coffee_script/rewriter.rb +++ b/lib/coffee_script/rewriter.rb @@ -151,6 +151,30 @@ def close_open_calls_and_indexes end end + # Methods may be optionally called without parentheses, for simple cases. + # Insert the implicit parentheses here, so that the parser doesn't have to + # deal with them. + def add_implicit_parentheses + stack = [0] + scan_tokens do |prev, token, post, i| + stack.push(0) if token[0] == :INDENT + if token[0] == :OUTDENT + last = stack.pop + stack[-1] += last + end + if stack.last > 0 && (IMPLICIT_END.include?(token[0]) || post.nil?) + idx = token[0] == :OUTDENT ? i + 1 : i + stack.last.times { @tokens.insert(idx, [:CALL_END, Value.new(')', token[1].line)]) } + size, stack[-1] = stack[-1] + 1, 0 + next size + end + next 1 unless IMPLICIT_FUNC.include?(prev[0]) && IMPLICIT_CALL.include?(token[0]) + @tokens.insert(i, [:CALL_START, Value.new('(', token[1].line)]) + stack[-1] += 1 + next 2 + end + end + # Because our grammar is LALR(1), it can't handle some single-line # expressions that lack ending delimiters. Use the lexer to add the implicit # blocks, so it doesn't need to. @@ -183,30 +207,6 @@ def add_implicit_indentation end end - # Methods may be optionally called without parentheses, for simple cases. - # Insert the implicit parentheses here, so that the parser doesn't have to - # deal with them. - def add_implicit_parentheses - stack = [0] - scan_tokens do |prev, token, post, i| - stack.push(0) if token[0] == :INDENT - if token[0] == :OUTDENT - last = stack.pop - stack[-1] += last - end - if stack.last > 0 && (IMPLICIT_END.include?(token[0]) || post.nil?) - idx = token[0] == :OUTDENT ? i + 1 : i - stack.last.times { @tokens.insert(idx, [:CALL_END, Value.new(')', token[1].line)]) } - size, stack[-1] = stack[-1] + 1, 0 - next size - end - next 1 unless IMPLICIT_FUNC.include?(prev[0]) && IMPLICIT_CALL.include?(token[0]) - @tokens.insert(i, [:CALL_START, Value.new('(', token[1].line)]) - stack[-1] += 1 - next 2 - end - end - # Ensure that all listed pairs of tokens are correctly balanced throughout # the course of the token stream. def ensure_balance(*pairs) diff --git a/src/lexer.coffee b/src/lexer.coffee index dbe1450463..500706a099 100644 --- a/src/lexer.coffee +++ b/src/lexer.coffee @@ -216,7 +216,7 @@ lex::literal_token: -> this.tag_parameters() if value and value.match(CODE) value ||= this.chunk.substr(0, 1) tag: if value.match(ASSIGNMENT) then 'ASSIGN' else value - if this.value() and this.value().spaced and CALLABLE.indexOf(this.tag() >= 0) + if this.value() and !this.value().spaced and CALLABLE.indexOf(this.tag() >= 0) tag: 'CALL_START' if value is '(' tag: 'INDEX_START' if value is '[' this.token tag, value diff --git a/src/rewriter.coffee b/src/rewriter.coffee index 21775b72a5..a2cb5d4e7b 100644 --- a/src/rewriter.coffee +++ b/src/rewriter.coffee @@ -41,12 +41,12 @@ SINGLE_CLOSERS: ["\n", 'CATCH', 'FINALLY', 'ELSE', 'OUTDENT', 'LEADING_WHEN', 'P re::rewrite: (tokens) -> this.tokens: tokens this.adjust_comments() - # this.remove_leading_newlines() - # this.remove_mid_expression_newlines() - # this.move_commas_outside_outdents() - # this.close_open_calls_and_indexes() + this.remove_leading_newlines() + this.remove_mid_expression_newlines() + this.move_commas_outside_outdents() + this.close_open_calls_and_indexes() # this.add_implicit_parentheses() - # this.add_implicit_indentation() + this.add_implicit_indentation() # this.ensure_balance(BALANCED_PAIRS) # this.rewrite_closing_parens() this.tokens @@ -56,7 +56,7 @@ re::rewrite: (tokens) -> # forwards (or backwards) in the stream, to make sure we don't miss anything # as the stream changes length under our feet. re::scan_tokens: (yield) -> - i = 0 + i: 0 while true break unless this.tokens[i] move: yield(this.tokens[i - 1], this.tokens[i], this.tokens[i + 1], i) @@ -66,7 +66,7 @@ re::scan_tokens: (yield) -> # Massage newlines and indentations so that comments don't have to be # correctly indented, or appear on their own line. re::adjust_comments: -> - this.scan_tokens (prev, token, post, i) -> + this.scan_tokens (prev, token, post, i) => return 1 unless token[0] is 'COMMENT' before: this.tokens[i - 2] after: this.tokens[i + 2] @@ -87,6 +87,86 @@ re::adjust_comments: -> else return 1 +# Leading newlines would introduce an ambiguity in the grammar, so we +# dispatch them here. +re::remove_leading_newlines: -> + this.tokens.shift() if this.tokens[0][0] is "\n" + +# Some blocks occur in the middle of expressions -- when we're expecting +# this, remove their trailing newlines. +re::remove_mid_expression_newlines: -> + this.scan_tokens (prev, token, post, i) => + return 1 unless post and EXPRESSION_CLOSE.indexOf(post[0]) >= 0 and token[0] is "\n" + this.tokens.splice(i, 1) + return 0 + +# Make sure that we don't accidentally break trailing commas, which need +# to go on the outside of expression closers. +re::move_commas_outside_outdents: -> + this.scan_tokens (prev, token, post, i) => + this.tokens.splice(i, 1, token) if token[0] is 'OUTDENT' and prev[0] is ',' + return 1 + +# We've tagged the opening parenthesis of a method call, and the opening +# bracket of an indexing operation. Match them with their close. +re::close_open_calls_and_indexes: -> + parens: [0] + brackets: [0] + this.scan_tokens (prev, token, post, i) => + switch token[0] + when 'CALL_START' then parens.push(0) + when 'INDEX_START' then brackets.push(0) + when '(' then parens[-1] += 1 + when '[' then brackets[-1] += 1 + when ')' + if parens[parens.length - 1] is 0 + parens.pop + token[0]: 'CALL_END' + else + parens[parens.length - 1] -= 1 + when ']' + if brackets[brackets.length - 1] == 0 + brackets.pop() + token[0]: 'INDEX_END' + else + brackets[brackets.length - 1] -= 1 + return 1 + +# Because our grammar is LALR(1), it can't handle some single-line +# expressions that lack ending delimiters. Use the lexer to add the implicit +# blocks, so it doesn't need to. +# ')' can close a single-line block, but we need to make sure it's balanced. +re::add_implicit_indentation: -> + this.scan_tokens (prev, token, post, i) => + return 1 unless SINGLE_LINERS.indexOf(token[0]) >= 0 and post[0] isnt 'INDENT' and + not (token[0] is 'ELSE' and post[0] is 'IF') + starter: token[0] + this.tokens.splice(i + 1, 0, ['INDENT', 2]) + idx: i + 1 + parens: 0 + while true + idx += 1 + tok: this.tokens[idx] + if (not tok or SINGLE_CLOSERS.indexOf(tok[0]) >= 0 or + (tok[0] is ')' && parens is 0)) and + not (starter is 'ELSE' and tok[0] is 'ELSE') + insertion: if this.tokens[idx - 1][0] is "," then idx - 1 else idx + this.tokens.splice(insertion, 0, ['OUTDENT', 2]) + break + parens += 1 if tok[0] is '(' + parens -= 1 if tok[0] is ')' + return 1 unless token[0] is 'THEN' + this.tokens.splice(i, 1) + return 0 + + + + + + + + + From c6457e010d7cc633452b9801e6c3673ec6149de5 Mon Sep 17 00:00:00 2001 From: Jeremy Ashkenas Date: Sat, 30 Jan 2010 17:47:19 -0500 Subject: [PATCH 15/37] getting there with the rewriter --- lib/coffee_script/rewriter.js | 40 ++++++++++++++++++++++++++++++++++- src/rewriter.coffee | 24 ++++++++++++++++++++- 2 files changed, 62 insertions(+), 2 deletions(-) diff --git a/lib/coffee_script/rewriter.js b/lib/coffee_script/rewriter.js index df98532165..8f9a372098 100644 --- a/lib/coffee_script/rewriter.js +++ b/lib/coffee_script/rewriter.js @@ -53,7 +53,7 @@ this.remove_mid_expression_newlines(); this.move_commas_outside_outdents(); this.close_open_calls_and_indexes(); - // this.add_implicit_parentheses() + this.add_implicit_parentheses(); this.add_implicit_indentation(); // this.ensure_balance(BALANCED_PAIRS) // this.rewrite_closing_parens() @@ -182,6 +182,44 @@ }); })(this)); }; + // Methods may be optionally called without parentheses, for simple cases. + // Insert the implicit parentheses here, so that the parser doesn't have to + // deal with them. + re.prototype.add_implicit_parentheses = function add_implicit_parentheses() { + var stack; + stack = [0]; + return this.scan_tokens((function(__this) { + var __func = function(prev, token, post, i) { + var __i, __j, __k, __l, idx, last, size, tmp; + if (token[0] === 'INDENT') { + stack.push(0); + } + if (token[0] === 'OUTDENT') { + last = stack.pop(); + stack[stack.length - 1] += last; + } + if (stack[stack.length - 1] > 0 && (IMPLICIT_END.indexOf(token[0]) >= 0 || !(typeof post !== "undefined" && post !== null))) { + idx = token[0] === 'OUTDENT' ? i + 1 : i; + __k = 0; __l = stack[stack.length - 1]; + for (__j=0, tmp=__k; (__k <= __l ? tmp < __l : tmp > __l); (__k <= __l ? tmp += 1 : tmp -= 1), __j++) { + this.tokens.splice(idx, 0, ['CALL_END', ')']); + } + size = stack[stack.length - 1] + 1; + stack[stack.length - 1] = 0; + return size; + } + if (!(prev && IMPLICIT_FUNC.indexOf(prev[0]) >= 0 && IMPLICIT_CALL.indexOf(token[0]) >= 0)) { + return 1; + } + this.tokens.splice(i, 0, ['CALL_START', '(']); + stack[stack.length - 1] += 1; + return 2; + }; + return (function() { + return __func.apply(__this, arguments); + }); + })(this)); + }; // Because our grammar is LALR(1), it can't handle some single-line // expressions that lack ending delimiters. Use the lexer to add the implicit // blocks, so it doesn't need to. diff --git a/src/rewriter.coffee b/src/rewriter.coffee index a2cb5d4e7b..1e0703404d 100644 --- a/src/rewriter.coffee +++ b/src/rewriter.coffee @@ -45,7 +45,7 @@ re::rewrite: (tokens) -> this.remove_mid_expression_newlines() this.move_commas_outside_outdents() this.close_open_calls_and_indexes() - # this.add_implicit_parentheses() + this.add_implicit_parentheses() this.add_implicit_indentation() # this.ensure_balance(BALANCED_PAIRS) # this.rewrite_closing_parens() @@ -132,6 +132,28 @@ re::close_open_calls_and_indexes: -> brackets[brackets.length - 1] -= 1 return 1 +# Methods may be optionally called without parentheses, for simple cases. +# Insert the implicit parentheses here, so that the parser doesn't have to +# deal with them. +re::add_implicit_parentheses: -> + stack: [0] + this.scan_tokens (prev, token, post, i) => + stack.push(0) if token[0] is 'INDENT' + if token[0] is 'OUTDENT' + last: stack.pop() + stack[stack.length - 1] += last + if stack[stack.length - 1] > 0 and (IMPLICIT_END.indexOf(token[0]) >= 0 or !post?) + idx: if token[0] is 'OUTDENT' then i + 1 else i + for tmp in [0...stack[stack.length - 1]] + this.tokens.splice(idx, 0, ['CALL_END', ')']) + size: stack[stack.length - 1] + 1 + stack[stack.length - 1]: 0 + return size + return 1 unless prev and IMPLICIT_FUNC.indexOf(prev[0]) >= 0 and IMPLICIT_CALL.indexOf(token[0]) >= 0 + this.tokens.splice(i, 0, ['CALL_START', '(']) + stack[stack.length - 1] += 1 + return 2 + # Because our grammar is LALR(1), it can't handle some single-line # expressions that lack ending delimiters. Use the lexer to add the implicit # blocks, so it doesn't need to. From bad50c9aee25c6b209664c2bb3a261bf64431ace Mon Sep 17 00:00:00 2001 From: Jeremy Ashkenas Date: Sat, 30 Jan 2010 18:29:53 -0500 Subject: [PATCH 16/37] the rewriter is done --- lib/coffee_script/lexer.js | 11 +-- lib/coffee_script/rewriter.js | 123 ++++++++++++++++++++++++++++++++-- src/lexer.coffee | 6 +- src/rewriter.coffee | 110 ++++++++++++++++++------------ 4 files changed, 194 insertions(+), 56 deletions(-) diff --git a/lib/coffee_script/lexer.js b/lib/coffee_script/lexer.js index f8b25f1c77..0b0ea18071 100644 --- a/lib/coffee_script/lexer.js +++ b/lib/coffee_script/lexer.js @@ -51,6 +51,8 @@ // The stack of all indent levels we are currently within. this.tokens = []; // Collection of all parsed tokens in the form [:TOKEN_TYPE, value] + this.spaced = null; + // The last token that has a space following it. while (this.i < this.code.length) { this.chunk = this.code.slice(this.i); this.extract_next_token(); @@ -235,7 +237,7 @@ if (!((space = this.match(WHITESPACE, 1)))) { return false; } - this.value().spaced = true; + this.spaced = this.value(); this.i += space.length; return true; }; @@ -266,7 +268,7 @@ } value = value || this.chunk.substr(0, 1); tag = value.match(ASSIGNMENT) ? 'ASSIGN' : value; - if (this.value() && !this.value().spaced && CALLABLE.indexOf(this.tag() >= 0)) { + if (this.value() !== this.spaced && CALLABLE.indexOf(this.tag()) >= 0) { if (value === '(') { tag = 'CALL_START'; } @@ -331,12 +333,11 @@ // parameter identifiers in order to avoid this. Also, parameter lists can // make use of splats. lex.prototype.tag_parameters = function tag_parameters() { - var __a, i, tok; + var i, tok; if (this.tag() !== ')') { return null; } i = 0; - __a = []; while (true) { i += 1; tok = this.tokens[this.tokens.length - i]; @@ -351,7 +352,7 @@ return (tok[0] = 'PARAM_START'); } } - return __a; + return true; }; // Close up all remaining open blocks. IF the first token is an indent, // axe it. diff --git a/lib/coffee_script/rewriter.js b/lib/coffee_script/rewriter.js index 8f9a372098..2e27448597 100644 --- a/lib/coffee_script/rewriter.js +++ b/lib/coffee_script/rewriter.js @@ -1,5 +1,6 @@ (function(){ var BALANCED_PAIRS, EXPRESSION_CLOSE, EXPRESSION_START, EXPRESSION_TAIL, IMPLICIT_CALL, IMPLICIT_END, IMPLICIT_FUNC, INVERSES, SINGLE_CLOSERS, SINGLE_LINERS, __a, __b, __c, __d, __e, __f, __g, __h, pair, re; + var __hasProp = Object.prototype.hasOwnProperty; // In order to keep the grammar simple, the stream of tokens that the Lexer // emits is rewritten by the Rewriter, smoothing out ambiguities, mis-nested // indentation, and single-line flavors of expressions. @@ -55,8 +56,8 @@ this.close_open_calls_and_indexes(); this.add_implicit_parentheses(); this.add_implicit_indentation(); - // this.ensure_balance(BALANCED_PAIRS) - // this.rewrite_closing_parens() + this.ensure_balance(BALANCED_PAIRS); + this.rewrite_closing_parens(); return this.tokens; }; // Rewrite the token stream, looking one token ahead and behind. @@ -157,12 +158,12 @@ } else if (token[0] === 'INDEX_START') { brackets.push(0); } else if (token[0] === '(') { - parens[-1] += 1; + parens[parens.length - 1] += 1; } else if (token[0] === '[') { - brackets[-1] += 1; + brackets[brackets.length - 1] += 1; } else if (token[0] === ')') { if (parens[parens.length - 1] === 0) { - parens.pop; + parens.pop(); token[0] = 'CALL_END'; } else { parens[parens.length - 1] -= 1; @@ -261,4 +262,116 @@ }); })(this)); }; + // Ensure that all listed pairs of tokens are correctly balanced throughout + // the course of the token stream. + re.prototype.ensure_balance = function ensure_balance(pairs) { + var __i, __j, key, levels, unclosed, value; + levels = { + }; + this.scan_tokens((function(__this) { + var __func = function(prev, token, post, i) { + var __i, __j, __k, close, open; + __i = pairs; + for (__j = 0; __j < __i.length; __j++) { + pair = __i[__j]; + __k = pair; + open = __k[0]; + close = __k[1]; + levels[open] = levels[open] || 0; + if (token[0] === open) { + levels[open] += 1; + } + if (token[0] === close) { + levels[open] -= 1; + } + if (levels[open] < 0) { + throw "too many " + token[1]; + } + } + return 1; + }; + return (function() { + return __func.apply(__this, arguments); + }); + })(this)); + unclosed = (function() { + __i = []; __j = levels; + for (key in __j) { + value = __j[key]; + if (__hasProp.call(__j, key)) { + if (value > 0) { + __i.push(key); + } + } + } + return __i; + }).call(this); + if (unclosed.length) { + throw "unclosed " + unclosed[0]; + } + }; + // We'd like to support syntax like this: + // el.click((event) -> + // el.hide()) + // In order to accomplish this, move outdents that follow closing parens + // inwards, safely. The steps to accomplish this are: + // + // 1. Check that all paired tokens are balanced and in order. + // 2. Rewrite the stream with a stack: if you see an '(' or INDENT, add it + // to the stack. If you see an ')' or OUTDENT, pop the stack and replace + // it with the inverse of what we've just popped. + // 3. Keep track of "debt" for tokens that we fake, to make sure we end + // up balanced in the end. + re.prototype.rewrite_closing_parens = function rewrite_closing_parens() { + var __i, debt, key, stack, val; + stack = []; + debt = { + }; + __i = INVERSES; + for (key in __i) { + val = __i[key]; + if (__hasProp.call(__i, key)) { + ((debt[key] = 0)); + } + } + return this.scan_tokens((function(__this) { + var __func = function(prev, token, post, i) { + var inv, match, mtag, tag; + tag = token[0]; + inv = INVERSES[token[0]]; + // Push openers onto the stack. + if (EXPRESSION_START.indexOf(tag) >= 0) { + stack.push(token); + return 1; + // The end of an expression, check stack and debt for a pair. + } else if (EXPRESSION_TAIL.indexOf(tag) >= 0) { + // If the tag is already in our debt, swallow it. + if (debt[inv] > 0) { + debt[inv] -= 1; + this.tokens.splice(i, 1); + return 0; + } else { + // Pop the stack of open delimiters. + match = stack.pop(); + mtag = match[0]; + // Continue onwards if it's the expected tag. + if (tag === INVERSES[mtag]) { + return 1; + } else { + // Unexpected close, insert correct close, adding to the debt. + debt[mtag] += 1; + val = mtag === 'INDENT' ? match[1] : INVERSES[mtag]; + this.tokens.splice(i, 0, [INVERSES[mtag], val]); + return 1; + } + } + } else { + return 1; + } + }; + return (function() { + return __func.apply(__this, arguments); + }); + })(this)); + }; })(); \ No newline at end of file diff --git a/src/lexer.coffee b/src/lexer.coffee index 500706a099..42021a3b51 100644 --- a/src/lexer.coffee +++ b/src/lexer.coffee @@ -66,6 +66,7 @@ lex::tokenize: (code) -> this.indent : 0 # The current indent level. this.indents : [] # The stack of all indent levels we are currently within. this.tokens : [] # Collection of all parsed tokens in the form [:TOKEN_TYPE, value] + this.spaced : null # The last token that has a space following it. while this.i < this.code.length this.chunk: this.code.slice(this.i) this.extract_next_token() @@ -192,7 +193,7 @@ lex::outdent_token: (move_out) -> # Matches and consumes non-meaningful whitespace. lex::whitespace_token: -> return false unless space: this.match WHITESPACE, 1 - this.value().spaced: true + this.spaced: this.value() this.i += space.length true @@ -216,7 +217,7 @@ lex::literal_token: -> this.tag_parameters() if value and value.match(CODE) value ||= this.chunk.substr(0, 1) tag: if value.match(ASSIGNMENT) then 'ASSIGN' else value - if this.value() and !this.value().spaced and CALLABLE.indexOf(this.tag() >= 0) + if this.value() isnt this.spaced and CALLABLE.indexOf(this.tag()) >= 0 tag: 'CALL_START' if value is '(' tag: 'INDEX_START' if value is '[' this.token tag, value @@ -272,6 +273,7 @@ lex::tag_parameters: -> when 'IDENTIFIER' then tok[0]: 'PARAM' when ')' then tok[0]: 'PARAM_END' when '(' then return tok[0]: 'PARAM_START' + true # Close up all remaining open blocks. IF the first token is an indent, # axe it. diff --git a/src/rewriter.coffee b/src/rewriter.coffee index 1e0703404d..79a74db8ac 100644 --- a/src/rewriter.coffee +++ b/src/rewriter.coffee @@ -47,8 +47,8 @@ re::rewrite: (tokens) -> this.close_open_calls_and_indexes() this.add_implicit_parentheses() this.add_implicit_indentation() - # this.ensure_balance(BALANCED_PAIRS) - # this.rewrite_closing_parens() + this.ensure_balance(BALANCED_PAIRS) + this.rewrite_closing_parens() this.tokens # Rewrite the token stream, looking one token ahead and behind. @@ -116,11 +116,11 @@ re::close_open_calls_and_indexes: -> switch token[0] when 'CALL_START' then parens.push(0) when 'INDEX_START' then brackets.push(0) - when '(' then parens[-1] += 1 - when '[' then brackets[-1] += 1 + when '(' then parens[parens.length - 1] += 1 + when '[' then brackets[brackets.length - 1] += 1 when ')' if parens[parens.length - 1] is 0 - parens.pop + parens.pop() token[0]: 'CALL_END' else parens[parens.length - 1] -= 1 @@ -181,42 +181,64 @@ re::add_implicit_indentation: -> this.tokens.splice(i, 1) return 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +# Ensure that all listed pairs of tokens are correctly balanced throughout +# the course of the token stream. +re::ensure_balance: (pairs) -> + levels: {} + this.scan_tokens (prev, token, post, i) => + for pair in pairs + [open, close]: pair + levels[open] ||= 0 + levels[open] += 1 if token[0] is open + levels[open] -= 1 if token[0] is close + throw "too many " + token[1] if levels[open] < 0 + return 1 + unclosed: key for key, value of levels when value > 0 + throw "unclosed " + unclosed[0] if unclosed.length + +# We'd like to support syntax like this: +# el.click((event) -> +# el.hide()) +# In order to accomplish this, move outdents that follow closing parens +# inwards, safely. The steps to accomplish this are: +# +# 1. Check that all paired tokens are balanced and in order. +# 2. Rewrite the stream with a stack: if you see an '(' or INDENT, add it +# to the stack. If you see an ')' or OUTDENT, pop the stack and replace +# it with the inverse of what we've just popped. +# 3. Keep track of "debt" for tokens that we fake, to make sure we end +# up balanced in the end. +# +re::rewrite_closing_parens: -> + stack: [] + debt: {} + (debt[key]: 0) for key, val of INVERSES + this.scan_tokens (prev, token, post, i) => + tag: token[0] + inv: INVERSES[token[0]] + # Push openers onto the stack. + if EXPRESSION_START.indexOf(tag) >= 0 + stack.push(token) + return 1 + # The end of an expression, check stack and debt for a pair. + else if EXPRESSION_TAIL.indexOf(tag) >= 0 + # If the tag is already in our debt, swallow it. + if debt[inv] > 0 + debt[inv] -= 1 + this.tokens.splice(i, 1) + return 0 + else + # Pop the stack of open delimiters. + match: stack.pop() + mtag: match[0] + # Continue onwards if it's the expected tag. + if tag is INVERSES[mtag] + return 1 + else + # Unexpected close, insert correct close, adding to the debt. + debt[mtag] += 1 + val: if mtag is 'INDENT' then match[1] else INVERSES[mtag] + this.tokens.splice(i, 0, [INVERSES[mtag], val]) + return 1 + else + return 1 From a0572f161dab5f899559171dcb57a28bb0ae77b1 Mon Sep 17 00:00:00 2001 From: Jeremy Ashkenas Date: Sat, 30 Jan 2010 23:17:36 -0500 Subject: [PATCH 17/37] the parser seems too big to compile --- lib/coffee_script/nodes.js | 34 +++ lib/coffee_script/parser.js | 564 ++++++++++++++++++++++++++++++++++++ src/grammar.peg | 0 src/nodes.coffee | 30 ++ src/parser.coffee | 448 ++++++++++++++++++++++++++++ 5 files changed, 1076 insertions(+) create mode 100644 lib/coffee_script/nodes.js create mode 100644 lib/coffee_script/parser.js create mode 100644 src/grammar.peg create mode 100644 src/nodes.coffee create mode 100644 src/parser.coffee diff --git a/lib/coffee_script/nodes.js b/lib/coffee_script/nodes.js new file mode 100644 index 0000000000..f059ce0668 --- /dev/null +++ b/lib/coffee_script/nodes.js @@ -0,0 +1,34 @@ +(function(){ + exports.Node = function Node() { + var __a; + var arguments = Array.prototype.slice.call(arguments, 0); + __a = this.values = arguments; + return Node === this.constructor ? this : __a; + }; + exports.Expressions = exports.Node; + exports.LiteralNode = exports.Node; + exports.ReturnNode = exports.Node; + exports.CommentNode = exports.Node; + exports.CallNode = exports.Node; + exports.ExtendsNode = exports.Node; + exports.ValueNode = exports.Node; + exports.AccessorNode = exports.Node; + exports.IndexNode = exports.Node; + exports.RangeNode = exports.Node; + exports.SliceNode = exports.Node; + exports.AssignNode = exports.Node; + exports.OpNode = exports.Node; + exports.CodeNode = exports.Node; + exports.SplatNode = exports.Node; + exports.ObjectNode = exports.Node; + exports.ArrayNode = exports.Node; + exports.PushNode = exports.Node; + exports.ClosureNode = exports.Node; + exports.WhileNode = exports.Node; + exports.ForNode = exports.Node; + exports.TryNode = exports.Node; + exports.ThrowNode = exports.Node; + exports.ExistenceNode = exports.Node; + exports.ParentheticalNode = exports.Node; + exports.IfNode = exports.Node; +})(); \ No newline at end of file diff --git a/lib/coffee_script/parser.js b/lib/coffee_script/parser.js new file mode 100644 index 0000000000..df64ad1142 --- /dev/null +++ b/lib/coffee_script/parser.js @@ -0,0 +1,564 @@ +(function(){ + var Parser, __a, __b, __c, __d, __e, __f, bnf, grammar, name, non_terminal, o, option, parser, part, tokens, unwrap; + var __hasProp = Object.prototype.hasOwnProperty; + Parser = require('jison').Parser; + // DSL =================================================================== + // Detect functions: [ + unwrap = /function\s*\(\)\s*\{\s*return\s*([\s\S]*);\s*\}/; + // Quickie DSL for Jison access. + o = function o(pattern_string, func) { + var match; + if (func) { + func = (match = (func + "").match(unwrap)) ? match[1] : '(' + func + '())'; + return [pattern_string, '$$ = ' + func + ';']; + } else { + return [pattern_string, '$$ = $1;']; + } + }; + // Grammar ============================================================== + grammar = { + // All parsing will end in this rule, being the trunk of the AST. + Root: [o("", function() { + return new Expressions(); + }), o("Terminator", function() { + return new Expressions(); + }), o("Expressions"), o("Block Terminator") + ], + // Any list of expressions or method body, seperated by line breaks or semis. + Expressions: [o("Expression", function() { + return Expressions.wrap([$1]); + }), o("Expressions Terminator Expression", function() { + return $1.push($3); + }), o("Expressions Terminator") + ], + // All types of expressions in our language. The basic unit of CoffeeScript + // is the expression. + Expression: [o("Value"), o("Call"), o("Code"), o("Operation"), o("Assign"), o("If"), o("Try"), o("Throw"), o("Return"), o("While"), o("For"), o("Switch"), o("Extends"), o("Splat"), o("Existence"), o("Comment")], + // A block of expressions. Note that the Rewriter will convert some postfix + // forms into blocks for us, by altering the token stream. + Block: [o("INDENT Expressions OUTDENT", function() { + return $2; + }), o("INDENT OUTDENT", function() { + return new Expressions(); + }) + ], + // Tokens that can terminate an expression. + Terminator: [o("\n"), o(";")], + // All hard-coded values. These can be printed straight to JavaScript. + Literal: [o("NUMBER", function() { + return new LiteralNode($1); + }), o("STRING", function() { + return new LiteralNode($1); + }), o("JS", function() { + return new LiteralNode($1); + }), o("REGEX", function() { + return new LiteralNode($1); + }), o("BREAK", function() { + return new LiteralNode($1); + }), o("CONTINUE", function() { + return new LiteralNode($1); + }), o("ARGUMENTS", function() { + return new LiteralNode($1); + }), o("TRUE", function() { + return new LiteralNode(true); + }), o("FALSE", function() { + return new LiteralNode(false); + }), o("YES", function() { + return new LiteralNode(true); + }), o("NO", function() { + return new LiteralNode(false); + }), o("ON", function() { + return new LiteralNode(true); + }), o("OFF", function() { + return new LiteralNode(false); + }) + ], + // Assignment to a variable (or index). + Assign: [o("Value ASSIGN Expression", function() { + return new AssignNode($1, $3); + }) + ], + // Assignment within an object literal (can be quoted). + AssignObj: [o("IDENTIFIER ASSIGN Expression", function() { + return new AssignNode(new ValueNode($1), $3, 'object'); + }), o("STRING ASSIGN Expression", function() { + return new AssignNode(new ValueNode(new LiteralNode($1)), $3, 'object'); + }), o("Comment") + ], + // A return statement. + Return: [o("RETURN Expression", function() { + return new ReturnNode($2); + }), o("RETURN", function() { + return new ReturnNode(new ValueNode(new LiteralNode('null'))); + }) + ], + // A comment. + Comment: [o("COMMENT", function() { + return new CommentNode($1); + }) + ], + // Arithmetic and logical operators + // For Ruby's Operator precedence, see: [ + // https://www.cs.auckland.ac.nz/references/ruby/ProgrammingRuby/language.html + Operation: [o("! Expression", function() { + return new OpNode($1, $2); + }), o("!! Expression", function() { + return new OpNode($1, $2); + }), o("- Expression", function() { + return new OpNode($1, $2); + }), o("+ Expression", function() { + return new OpNode($1, $2); + }), o("NOT Expression", function() { + return new OpNode($1, $2); + }), o("~ Expression", function() { + return new OpNode($1, $2); + }), o("-- Expression", function() { + return new OpNode($1, $2); + }), o("++ Expression", function() { + return new OpNode($1, $2); + }), o("DELETE Expression", function() { + return new OpNode($1, $2); + }), o("TYPEOF Expression", function() { + return new OpNode($1, $2); + }), o("Expression --", function() { + return new OpNode($2, $1, null, true); + }), o("Expression ++", function() { + return new OpNode($2, $1, null, true); + }), o("Expression * Expression", function() { + return new OpNode($2, $1, $3); + }), o("Expression / Expression", function() { + return new OpNode($2, $1, $3); + }), o("Expression % Expression", function() { + return new OpNode($2, $1, $3); + }), o("Expression + Expression", function() { + return new OpNode($2, $1, $3); + }), o("Expression - Expression", function() { + return new OpNode($2, $1, $3); + }), o("Expression << Expression", function() { + return new OpNode($2, $1, $3); + }), o("Expression >> Expression", function() { + return new OpNode($2, $1, $3); + }), o("Expression >>> Expression", function() { + return new OpNode($2, $1, $3); + }), o("Expression & Expression", function() { + return new OpNode($2, $1, $3); + }), o("Expression | Expression", function() { + return new OpNode($2, $1, $3); + }), o("Expression ^ Expression", function() { + return new OpNode($2, $1, $3); + }), o("Expression <= Expression", function() { + return new OpNode($2, $1, $3); + }), o("Expression < Expression", function() { + return new OpNode($2, $1, $3); + }), o("Expression > Expression", function() { + return new OpNode($2, $1, $3); + }), o("Expression >= Expression", function() { + return new OpNode($2, $1, $3); + }), o("Expression == Expression", function() { + return new OpNode($2, $1, $3); + }), o("Expression != Expression", function() { + return new OpNode($2, $1, $3); + }), o("Expression IS Expression", function() { + return new OpNode($2, $1, $3); + }), o("Expression ISNT Expression", function() { + return new OpNode($2, $1, $3); + }), o("Expression && Expression", function() { + return new OpNode($2, $1, $3); + }), o("Expression || Expression", function() { + return new OpNode($2, $1, $3); + }), o("Expression AND Expression", function() { + return new OpNode($2, $1, $3); + }), o("Expression OR Expression", function() { + return new OpNode($2, $1, $3); + }), o("Expression ? Expression", function() { + return new OpNode($2, $1, $3); + }), o("Expression -= Expression", function() { + return new OpNode($2, $1, $3); + }), o("Expression += Expression", function() { + return new OpNode($2, $1, $3); + }), o("Expression /= Expression", function() { + return new OpNode($2, $1, $3); + }), o("Expression *= Expression", function() { + return new OpNode($2, $1, $3); + }), o("Expression %= Expression", function() { + return new OpNode($2, $1, $3); + }), o("Expression ||= Expression", function() { + return new OpNode($2, $1, $3); + }), o("Expression &&= Expression", function() { + return new OpNode($2, $1, $3); + }), o("Expression ?= Expression", function() { + return new OpNode($2, $1, $3); + }), o("Expression INSTANCEOF Expression", function() { + return new OpNode($2, $1, $3); + }), o("Expression IN Expression", function() { + return new OpNode($2, $1, $3); + }) + ], + // The existence operator. + Existence: [o("Expression ?", function() { + return new ExistenceNode($1); + }) + ], + // Function definition. + Code: [o("PARAM_START ParamList PARAM_END FuncGlyph Block", function() { + return new CodeNode($2, $5, $4); + }), o("FuncGlyph Block", function() { + return new CodeNode([], $2, $1); + }) + ], + // The symbols to signify functions, and bound functions. + FuncGlyph: [o("->", function() { + return 'func'; + }), o("=>", function() { + return 'boundfunc'; + }) + ], + // The parameters to a function definition. + ParamList: [o("Param", function() { + return [$1]; + }), o("ParamList , Param", function() { + return $1.push($3); + }) + ], + // A Parameter (or ParamSplat) in a function definition. + Param: [o("PARAM"), o("PARAM . . .", function() { + return new SplatNode($1); + }) + ], + // A regular splat. + Splat: [o("Expression . . .", function() { + return new SplatNode($1); + }) + ], + // Expressions that can be treated as values. + Value: [o("IDENTIFIER", function() { + return new ValueNode($1); + }), o("Literal", function() { + return new ValueNode($1); + }), o("Array", function() { + return new ValueNode($1); + }), o("Object", function() { + return new ValueNode($1); + }), o("Parenthetical", function() { + return new ValueNode($1); + }), o("Range", function() { + return new ValueNode($1); + }), o("Value Accessor", function() { + return $1.push($2); + }), o("Invocation Accessor", function() { + return new ValueNode($1, [$2]); + }) + ], + // Accessing into an object or array, through dot or index notation. + Accessor: [o("PROPERTY_ACCESS IDENTIFIER", function() { + return new AccessorNode($2); + }), o("PROTOTYPE_ACCESS IDENTIFIER", function() { + return new AccessorNode($2, 'prototype'); + }), o("SOAK_ACCESS IDENTIFIER", function() { + return new AccessorNode($2, 'soak'); + }), o("Index"), o("Slice", function() { + return new SliceNode($1); + }) + ], + // Indexing into an object or array. + Index: [o("INDEX_START Expression INDEX_END", function() { + return new IndexNode($2); + }) + ], + // An object literal. + Object: [o("{ AssignList }", function() { + return new ObjectNode($2); + }) + ], + // Assignment within an object literal (comma or newline separated). + AssignList: [o("", function() { + return []; + }), o("AssignObj", function() { + return [$1]; + }), o("AssignList , AssignObj", function() { + return $1.push($3); + }), o("AssignList Terminator AssignObj", function() { + return $1.push($3); + }), o("AssignList , Terminator AssignObj", function() { + return $1.push($4); + }), o("INDENT AssignList OUTDENT", function() { + return $2; + }) + ], + // All flavors of function call (instantiation, super, and regular). + Call: [o("Invocation", function() { + return $1; + }), o("NEW Invocation", function() { + return $2.new_instance(); + }), o("Super", function() { + return $1; + }) + ], + // Extending an object's prototype. + Extends: [o("Value EXTENDS Value", function() { + return new ExtendsNode($1, $3); + }) + ], + // A generic function invocation. + Invocation: [o("Value Arguments", function() { + return new CallNode($1, $2); + }), o("Invocation Arguments", function() { + return new CallNode($1, $2); + }) + ], + // The list of arguments to a function invocation. + Arguments: [o("CALL_START ArgList CALL_END", function() { + return $2; + }) + ], + // Calling super. + Super: [o("SUPER CALL_START ArgList CALL_END", function() { + return new CallNode('super', $3); + }) + ], + // The range literal. + Range: [o("[ Expression . . Expression ]", function() { + return new RangeNode($2, $5); + }), o("[ Expression . . . Expression ]", function() { + return new RangeNode($2, $6, true); + }) + ], + // The slice literal. + Slice: [o("INDEX_START Expression . . Expression INDEX_END", function() { + return new RangeNode($2, $5); + }), o("INDEX_START Expression . . . Expression INDEX_END", function() { + return new RangeNode($2, $6, true); + }) + ], + // The array literal. + Array: [o("[ ArgList ]", function() { + return new ArrayNode($2); + }) + ], + // A list of arguments to a method call, or as the contents of an array. + ArgList: [o("", function() { + return []; + }), o("Expression", function() { + return val; + }), o("INDENT Expression", function() { + return [$2]; + }), o("ArgList , Expression", function() { + return $1.push($3); + }), o("ArgList Terminator Expression", function() { + return $1.push($3); + }), o("ArgList , Terminator Expression", function() { + return $1.push($4); + }), o("ArgList , INDENT Expression", function() { + return $1.push($4); + }), o("ArgList OUTDENT", function() { + return $1; + }) + ], + // Just simple, comma-separated, required arguments (no fancy syntax). + SimpleArgs: [o("Expression", function() { + return $1; + }), o("SimpleArgs , Expression", function() { + return ([$1].push($3)).reduce(function(a, b) { + return a.concat(b); + }); + }) + ], + // Try/catch/finally exception handling blocks. + Try: [o("TRY Block Catch", function() { + return new TryNode($2, $3[0], $3[1]); + }), o("TRY Block FINALLY Block", function() { + return new TryNode($2, nil, nil, $4); + }), o("TRY Block Catch FINALLY Block", function() { + return new TryNode($2, $3[0], $3[1], $5); + }) + ], + // A catch clause. + Catch: [o("CATCH IDENTIFIER Block", function() { + return [$2, $3]; + }) + ], + // Throw an exception. + Throw: [o("THROW Expression", function() { + return new ThrowNode($2); + }) + ], + // Parenthetical expressions. + Parenthetical: [o("( Expression )", function() { + return new ParentheticalNode($2); + }) + ], + // The while loop. (there is no do..while). + While: [o("WHILE Expression Block", function() { + return new WhileNode($2, $3); + }), o("WHILE Expression", function() { + return new WhileNode($2, nil); + }), o("Expression WHILE Expression", function() { + return new WhileNode($3, Expressions.wrap($1)); + }) + ], + // Array comprehensions, including guard and current index. + // Looks a little confusing, check nodes.rb for the arguments to ForNode. + For: [o("Expression FOR ForVariables ForSource", function() { + return new ForNode($1, $4, $3[0], $3[1]); + }), o("FOR ForVariables ForSource Block", function() { + return new ForNode($4, $3, $2[0], $2[1]); + }) + ], + // An array comprehension has variables for the current element and index. + ForVariables: [o("IDENTIFIER", function() { + return [$1]; + }), o("IDENTIFIER , IDENTIFIER", function() { + return [$1, $3]; + }) + ], + // The source of the array comprehension can optionally be filtered. + ForSource: [o("IN Expression", function() { + return { + source: $2 + }; + }), o("OF Expression", function() { + return { + source: $2, + object: true + }; + }), o("ForSource WHEN Expression", function() { + $1.filter = $3; + return $1; + }), o("ForSource BY Expression", function() { + $1.step = $3; + return $1; + }) + ], + // Switch/When blocks. + Switch: [o("SWITCH Expression INDENT Whens OUTDENT", function() { + return $4.rewrite_condition($2); + }), o("SWITCH Expression INDENT Whens ELSE Block OUTDENT", function() { + return $4.rewrite_condition($2).add_else($6); + }) + ], + // The inner list of whens. + Whens: [o("When", function() { + return $1; + }), o("Whens When", function() { + return $1.push($2); + }) + ], + // An individual when. + When: [o("LEADING_WHEN SimpleArgs Block", function() { + return new IfNode($2, $3, nil, { + statement: true + }); + }), o("LEADING_WHEN SimpleArgs Block Terminator", function() { + return new IfNode($2, $3, nil, { + statement: true + }); + }), o("Comment Terminator When", function() { + return $3.add_comment($1); + }) + ], + // The most basic form of "if". + IfBlock: [o("IF Expression Block", function() { + return new IfNode($2, $3); + }) + ], + // An elsif portion of an if-else block. + ElsIf: [o("ELSE IfBlock", function() { + return $2.force_statement(); + }) + ], + // Multiple elsifs can be chained together. + ElsIfs: [o("ElsIf", function() { + return $1; + }), o("ElsIfs ElsIf", function() { + return $1.add_else($2); + }) + ], + // Terminating else bodies are strictly optional. + ElseBody: [o("", function() { + return null; + }), o("ELSE Block", function() { + return $2; + }) + ], + // All the alternatives for ending an if-else block. + IfEnd: [o("ElseBody", function() { + return $1; + }), o("ElsIfs ElseBody", function() { + return $1.add_else($2); + }) + ], + // The full complement of if blocks, including postfix one-liner ifs and unlesses. + If: [o("IfBlock IfEnd", function() { + return $1.add_else($2); + }), o("Expression IF Expression", function() { + return new IfNode($3, Expressions.wrap($1), nil, { + statement: true + }); + }), o("Expression UNLESS Expression", function() { + return new IfNode($3, Expressions.wrap($1), nil, { + statement: true, + invert: true + }); + }) + ] + }; + // Helpers ============================================================== + // Make the Jison parser. + bnf = { + }; + tokens = []; + __a = grammar; + for (name in __a) { + non_terminal = __a[name]; + if (__hasProp.call(__a, name)) { + bnf[name] = (function() { + __b = []; __c = non_terminal; + for (__d = 0; __d < __c.length; __d++) { + option = __c[__d]; + __b.push((function() { + __e = option[0].split(" "); + for (__f = 0; __f < __e.length; __f++) { + part = __e[__f]; + !grammar[part] ? tokens.push(part) : null; + } + name === "Root" ? (option[1] = "return " + option[1]) : null; + return option; + }).call(this)); + } + return __b; + }).call(this); + } + } + tokens = tokens.join(" "); + parser = new Parser({ + tokens: tokens, + bnf: bnf + }, { + debug: false + }); + // Thin wrapper around the real lexer + parser.lexer = { + lex: function lex() { + var token; + token = this.tokens[this.pos] || [""]; + this.pos += 1; + // this.yylineno: token and token[1] and token[1][1] + this.yytext = token[1]; + return token[0]; + }, + setInput: function setInput(tokens) { + this.tokens = tokens; + return this.pos = 0; + }, + upcomingInput: function upcomingInput() { + return ""; + }, + showPosition: function showPosition() { + return this.pos; + } + }; + exports.Parser = function Parser() { }; + exports.Parser.prototype.parse = function parse(tokens) { + return parser.parse(tokens); + }; +})(); \ No newline at end of file diff --git a/src/grammar.peg b/src/grammar.peg new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/nodes.coffee b/src/nodes.coffee new file mode 100644 index 0000000000..793ed44d0c --- /dev/null +++ b/src/nodes.coffee @@ -0,0 +1,30 @@ +exports.Node: -> this.values: arguments + +exports.Expressions : exports.Node +exports.LiteralNode : exports.Node +exports.ReturnNode : exports.Node +exports.CommentNode : exports.Node +exports.CallNode : exports.Node +exports.ExtendsNode : exports.Node +exports.ValueNode : exports.Node +exports.AccessorNode : exports.Node +exports.IndexNode : exports.Node +exports.RangeNode : exports.Node +exports.SliceNode : exports.Node +exports.AssignNode : exports.Node +exports.OpNode : exports.Node +exports.CodeNode : exports.Node +exports.SplatNode : exports.Node +exports.ObjectNode : exports.Node +exports.ArrayNode : exports.Node +exports.PushNode : exports.Node +exports.ClosureNode : exports.Node +exports.WhileNode : exports.Node +exports.ForNode : exports.Node +exports.TryNode : exports.Node +exports.ThrowNode : exports.Node +exports.ExistenceNode : exports.Node +exports.ParentheticalNode : exports.Node +exports.IfNode : exports.Node + + diff --git a/src/parser.coffee b/src/parser.coffee new file mode 100644 index 0000000000..698d159e3d --- /dev/null +++ b/src/parser.coffee @@ -0,0 +1,448 @@ +Parser: require('jison').Parser + +# DSL =================================================================== + +# Detect functions: [ +unwrap: /function\s*\(\)\s*\{\s*return\s*([\s\S]*);\s*\}/ + +# Quickie DSL for Jison access. +o: (pattern_string, func) -> + if func + func: if match: (func + "").match(unwrap) then match[1] else '(' + func + '())' + [pattern_string, '$$ = ' + func + ';'] + else + [pattern_string, '$$ = $1;'] + +# Grammar ============================================================== + +grammar: { + + # All parsing will end in this rule, being the trunk of the AST. + Root: [ + o "", -> new Expressions() + o "Terminator", -> new Expressions() + o "Expressions" + o "Block Terminator" + ] + + # Any list of expressions or method body, seperated by line breaks or semis. + Expressions: [ + o "Expression", -> Expressions.wrap([$1]) + o "Expressions Terminator Expression", -> $1.push($3) + o "Expressions Terminator" + ] + + # All types of expressions in our language. The basic unit of CoffeeScript + # is the expression. + Expression: [ + o "Value" + o "Call" + o "Code" + o "Operation" + o "Assign" + o "If" + o "Try" + o "Throw" + o "Return" + o "While" + o "For" + o "Switch" + o "Extends" + o "Splat" + o "Existence" + o "Comment" + ] + + # A block of expressions. Note that the Rewriter will convert some postfix + # forms into blocks for us, by altering the token stream. + Block: [ + o "INDENT Expressions OUTDENT", -> $2 + o "INDENT OUTDENT", -> new Expressions() + ] + + # Tokens that can terminate an expression. + Terminator: [ + o "\n" + o ";" + ] + + # All hard-coded values. These can be printed straight to JavaScript. + Literal: [ + o "NUMBER", -> new LiteralNode($1) + o "STRING", -> new LiteralNode($1) + o "JS", -> new LiteralNode($1) + o "REGEX", -> new LiteralNode($1) + o "BREAK", -> new LiteralNode($1) + o "CONTINUE", -> new LiteralNode($1) + o "ARGUMENTS", -> new LiteralNode($1) + o "TRUE", -> new LiteralNode(true) + o "FALSE", -> new LiteralNode(false) + o "YES", -> new LiteralNode(true) + o "NO", -> new LiteralNode(false) + o "ON", -> new LiteralNode(true) + o "OFF", -> new LiteralNode(false) + ] + + # Assignment to a variable (or index). + Assign: [ + o "Value ASSIGN Expression", -> new AssignNode($1, $3) + ] + + # Assignment within an object literal (can be quoted). + AssignObj: [ + o "IDENTIFIER ASSIGN Expression", -> new AssignNode(new ValueNode($1), $3, 'object') + o "STRING ASSIGN Expression", -> new AssignNode(new ValueNode(new LiteralNode($1)), $3, 'object') + o "Comment" + ] + + # A return statement. + Return: [ + o "RETURN Expression", -> new ReturnNode($2) + o "RETURN", -> new ReturnNode(new ValueNode(new LiteralNode('null'))) + ] + + # A comment. + Comment: [ + o "COMMENT", -> new CommentNode($1) + ] + + # Arithmetic and logical operators + # For Ruby's Operator precedence, see: [ + # https://www.cs.auckland.ac.nz/references/ruby/ProgrammingRuby/language.html + Operation: [ + o "! Expression", -> new OpNode($1, $2) + o "!! Expression", -> new OpNode($1, $2) + o "- Expression", -> new OpNode($1, $2) + o "+ Expression", -> new OpNode($1, $2) + o "NOT Expression", -> new OpNode($1, $2) + o "~ Expression", -> new OpNode($1, $2) + o "-- Expression", -> new OpNode($1, $2) + o "++ Expression", -> new OpNode($1, $2) + o "DELETE Expression", -> new OpNode($1, $2) + o "TYPEOF Expression", -> new OpNode($1, $2) + o "Expression --", -> new OpNode($2, $1, null, true) + o "Expression ++", -> new OpNode($2, $1, null, true) + + o "Expression * Expression", -> new OpNode($2, $1, $3) + o "Expression / Expression", -> new OpNode($2, $1, $3) + o "Expression % Expression", -> new OpNode($2, $1, $3) + + o "Expression + Expression", -> new OpNode($2, $1, $3) + o "Expression - Expression", -> new OpNode($2, $1, $3) + + o "Expression << Expression", -> new OpNode($2, $1, $3) + o "Expression >> Expression", -> new OpNode($2, $1, $3) + o "Expression >>> Expression", -> new OpNode($2, $1, $3) + + o "Expression & Expression", -> new OpNode($2, $1, $3) + o "Expression | Expression", -> new OpNode($2, $1, $3) + o "Expression ^ Expression", -> new OpNode($2, $1, $3) + + o "Expression <= Expression", -> new OpNode($2, $1, $3) + o "Expression < Expression", -> new OpNode($2, $1, $3) + o "Expression > Expression", -> new OpNode($2, $1, $3) + o "Expression >= Expression", -> new OpNode($2, $1, $3) + + o "Expression == Expression", -> new OpNode($2, $1, $3) + o "Expression != Expression", -> new OpNode($2, $1, $3) + o "Expression IS Expression", -> new OpNode($2, $1, $3) + o "Expression ISNT Expression", -> new OpNode($2, $1, $3) + + o "Expression && Expression", -> new OpNode($2, $1, $3) + o "Expression || Expression", -> new OpNode($2, $1, $3) + o "Expression AND Expression", -> new OpNode($2, $1, $3) + o "Expression OR Expression", -> new OpNode($2, $1, $3) + o "Expression ? Expression", -> new OpNode($2, $1, $3) + + o "Expression -= Expression", -> new OpNode($2, $1, $3) + o "Expression += Expression", -> new OpNode($2, $1, $3) + o "Expression /= Expression", -> new OpNode($2, $1, $3) + o "Expression *= Expression", -> new OpNode($2, $1, $3) + o "Expression %= Expression", -> new OpNode($2, $1, $3) + o "Expression ||= Expression", -> new OpNode($2, $1, $3) + o "Expression &&= Expression", -> new OpNode($2, $1, $3) + o "Expression ?= Expression", -> new OpNode($2, $1, $3) + + o "Expression INSTANCEOF Expression", -> new OpNode($2, $1, $3) + o "Expression IN Expression", -> new OpNode($2, $1, $3) + ] + + # The existence operator. + Existence: [ + o "Expression ?", -> new ExistenceNode($1) + ] + + # Function definition. + Code: [ + o "PARAM_START ParamList PARAM_END FuncGlyph Block", -> new CodeNode($2, $5, $4) + o "FuncGlyph Block", -> new CodeNode([], $2, $1) + ] + + # The symbols to signify functions, and bound functions. + FuncGlyph: [ + o "->", -> 'func' + o "=>", -> 'boundfunc' + ] + + # The parameters to a function definition. + ParamList: [ + o "Param", -> [$1] + o "ParamList , Param", -> $1.push($3) + ] + + # A Parameter (or ParamSplat) in a function definition. + Param: [ + o "PARAM" + o "PARAM . . .", -> new SplatNode($1) + ] + + # A regular splat. + Splat: [ + o "Expression . . .", -> new SplatNode($1) + ] + + # Expressions that can be treated as values. + Value: [ + o "IDENTIFIER", -> new ValueNode($1) + o "Literal", -> new ValueNode($1) + o "Array", -> new ValueNode($1) + o "Object", -> new ValueNode($1) + o "Parenthetical", -> new ValueNode($1) + o "Range", -> new ValueNode($1) + o "Value Accessor", -> $1.push($2) + o "Invocation Accessor", -> new ValueNode($1, [$2]) + ] + + # Accessing into an object or array, through dot or index notation. + Accessor: [ + o "PROPERTY_ACCESS IDENTIFIER", -> new AccessorNode($2) + o "PROTOTYPE_ACCESS IDENTIFIER", -> new AccessorNode($2, 'prototype') + o "SOAK_ACCESS IDENTIFIER", -> new AccessorNode($2, 'soak') + o "Index" + o "Slice", -> new SliceNode($1) + ] + + # Indexing into an object or array. + Index: [ + o "INDEX_START Expression INDEX_END", -> new IndexNode($2) + ] + + # An object literal. + Object: [ + o "{ AssignList }", -> new ObjectNode($2) + ] + + # Assignment within an object literal (comma or newline separated). + AssignList: [ + o "", -> [] + o "AssignObj", -> [$1] + o "AssignList , AssignObj", -> $1.push $3 + o "AssignList Terminator AssignObj", -> $1.push $3 + o "AssignList , Terminator AssignObj", -> $1.push $4 + o "INDENT AssignList OUTDENT", -> $2 + ] + + # All flavors of function call (instantiation, super, and regular). + Call: [ + o "Invocation", -> $1 + o "NEW Invocation", -> $2.new_instance() + o "Super", -> $1 + ] + + # Extending an object's prototype. + Extends: [ + o "Value EXTENDS Value", -> new ExtendsNode($1, $3) + ] + + # A generic function invocation. + Invocation: [ + o "Value Arguments", -> new CallNode($1, $2) + o "Invocation Arguments", -> new CallNode($1, $2) + ] + + # The list of arguments to a function invocation. + Arguments: [ + o "CALL_START ArgList CALL_END", -> $2 + ] + + # Calling super. + Super: [ + o "SUPER CALL_START ArgList CALL_END", -> new CallNode('super', $3) + ] + + # The range literal. + Range: [ + o "[ Expression . . Expression ]", -> new RangeNode($2, $5) + o "[ Expression . . . Expression ]", -> new RangeNode($2, $6, true) + ] + + # The slice literal. + Slice: [ + o "INDEX_START Expression . . Expression INDEX_END", -> new RangeNode($2, $5) + o "INDEX_START Expression . . . Expression INDEX_END", -> new RangeNode($2, $6, true) + ] + + # The array literal. + Array: [ + o "[ ArgList ]", -> new ArrayNode($2) + ] + + # A list of arguments to a method call, or as the contents of an array. + ArgList: [ + o "", -> [] + o "Expression", -> val + o "INDENT Expression", -> [$2] + o "ArgList , Expression", -> $1.push $3 + o "ArgList Terminator Expression", -> $1.push $3 + o "ArgList , Terminator Expression", -> $1.push $4 + o "ArgList , INDENT Expression", -> $1.push $4 + o "ArgList OUTDENT", -> $1 + ] + + # Just simple, comma-separated, required arguments (no fancy syntax). + SimpleArgs: [ + o "Expression", -> $1 + o "SimpleArgs , Expression", -> + ([$1].push($3)).reduce (a, b) -> a.concat(b) + ] + + # Try/catch/finally exception handling blocks. + Try: [ + o "TRY Block Catch", -> new TryNode($2, $3[0], $3[1]) + o "TRY Block FINALLY Block", -> new TryNode($2, nil, nil, $4) + o "TRY Block Catch FINALLY Block", -> new TryNode($2, $3[0], $3[1], $5) + ] + + # A catch clause. + Catch: [ + o "CATCH IDENTIFIER Block", -> [$2, $3] + ] + + # Throw an exception. + Throw: [ + o "THROW Expression", -> new ThrowNode($2) + ] + + # Parenthetical expressions. + Parenthetical: [ + o "( Expression )", -> new ParentheticalNode($2) + ] + + # The while loop. (there is no do..while). + While: [ + o "WHILE Expression Block", -> new WhileNode($2, $3) + o "WHILE Expression", -> new WhileNode($2, nil) + o "Expression WHILE Expression", -> new WhileNode($3, Expressions.wrap($1)) + ] + + # Array comprehensions, including guard and current index. + # Looks a little confusing, check nodes.rb for the arguments to ForNode. + For: [ + o "Expression FOR ForVariables ForSource", -> new ForNode($1, $4, $3[0], $3[1]) + o "FOR ForVariables ForSource Block", -> new ForNode($4, $3, $2[0], $2[1]) + ] + + # An array comprehension has variables for the current element and index. + ForVariables: [ + o "IDENTIFIER", -> [$1] + o "IDENTIFIER , IDENTIFIER", -> [$1, $3] + ] + + # The source of the array comprehension can optionally be filtered. + ForSource: [ + o "IN Expression", -> {source: $2} + o "OF Expression", -> {source: $2, object: true} + o "ForSource WHEN Expression", -> $1.filter: $3; $1 + o "ForSource BY Expression", -> $1.step: $3; $1 + ] + + # Switch/When blocks. + Switch: [ + o "SWITCH Expression INDENT Whens OUTDENT", -> $4.rewrite_condition($2) + o "SWITCH Expression INDENT Whens ELSE Block OUTDENT", -> $4.rewrite_condition($2).add_else($6) + ] + + # The inner list of whens. + Whens: [ + o "When", -> $1 + o "Whens When", -> $1.push $2 + ] + + # An individual when. + When: [ + o "LEADING_WHEN SimpleArgs Block", -> new IfNode($2, $3, nil, {statement: true}) + o "LEADING_WHEN SimpleArgs Block Terminator", -> new IfNode($2, $3, nil, {statement: true}) + o "Comment Terminator When", -> $3.add_comment($1) + ] + + # The most basic form of "if". + IfBlock: [ + o "IF Expression Block", -> new IfNode($2, $3) + ] + + # An elsif portion of an if-else block. + ElsIf: [ + o "ELSE IfBlock", -> $2.force_statement() + ] + + # Multiple elsifs can be chained together. + ElsIfs: [ + o "ElsIf", -> $1 + o "ElsIfs ElsIf", -> $1.add_else($2) + ] + + # Terminating else bodies are strictly optional. + ElseBody: [ + o "", -> null + o "ELSE Block", -> $2 + ] + + # All the alternatives for ending an if-else block. + IfEnd: [ + o "ElseBody", -> $1 + o "ElsIfs ElseBody", -> $1.add_else($2) + ] + + # The full complement of if blocks, including postfix one-liner ifs and unlesses. + If: [ + o "IfBlock IfEnd", -> $1.add_else($2) + o "Expression IF Expression", -> new IfNode($3, Expressions.wrap($1), nil, {statement: true}) + o "Expression UNLESS Expression", -> new IfNode($3, Expressions.wrap($1), nil, {statement: true, invert: true}) + ] + +} + +# Helpers ============================================================== + +# Make the Jison parser. +bnf: {} +tokens: [] +for name, non_terminal of grammar + bnf[name]: for option in non_terminal + for part in option[0].split(" ") + if !grammar[part] + tokens.push(part) + if name == "Root" + option[1] = "return " + option[1] + option +tokens: tokens.join(" ") +parser: new Parser({tokens: tokens, bnf: bnf}, {debug: false}) + +# Thin wrapper around the real lexer +parser.lexer: { + lex: -> + token: this.tokens[this.pos] or [""] + this.pos += 1 + # this.yylineno: token and token[1] and token[1][1] + this.yytext: token[1] + token[0] + setInput: (tokens) -> + this.tokens = tokens + this.pos = 0 + upcomingInput: -> "" + showPosition: -> this.pos +} + +exports.Parser: -> + +exports.Parser::parse: (tokens) -> parser.parse(tokens) \ No newline at end of file From 3a748755df2fe6f98b9b45dd01a7081de7fedd58 Mon Sep 17 00:00:00 2001 From: Jeremy Ashkenas Date: Sun, 31 Jan 2010 01:25:07 -0500 Subject: [PATCH 18/37] removing the peg grammar --- src/grammar.peg | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/grammar.peg diff --git a/src/grammar.peg b/src/grammar.peg deleted file mode 100644 index e69de29bb2..0000000000 From db00cd6ed4273a90f200cff55e5b9a192c0a48bc Mon Sep 17 00:00:00 2001 From: Jeremy Ashkenas Date: Sun, 31 Jan 2010 12:55:00 -0500 Subject: [PATCH 19/37] adding precedence to the Jison parser --- lib/coffee_script/parser.js | 60 ++++++++++++++++++++++++++- src/parser.coffee | 82 ++++++++++++++++++++++++++++++++++++- 2 files changed, 139 insertions(+), 3 deletions(-) diff --git a/lib/coffee_script/parser.js b/lib/coffee_script/parser.js index df64ad1142..a03ee6963c 100644 --- a/lib/coffee_script/parser.js +++ b/lib/coffee_script/parser.js @@ -1,5 +1,5 @@ (function(){ - var Parser, __a, __b, __c, __d, __e, __f, bnf, grammar, name, non_terminal, o, option, parser, part, tokens, unwrap; + var Parser, __a, __b, __c, __d, __e, __f, bnf, grammar, name, non_terminal, o, operators, option, parser, part, tokens, unwrap; var __hasProp = Object.prototype.hasOwnProperty; Parser = require('jison').Parser; // DSL =================================================================== @@ -15,6 +15,8 @@ return [pattern_string, '$$ = $1;']; } }; + // Precedence =========================================================== + operators = [["left", '?'], ["right", 'NOT', '!', '!!', '~', '++', '--'], ["left", '*', '/', '%'], ["left", '+', '-'], ["left", '<<', '>>', '>>>'], ["left", '&', '|', '^'], ["left", '<=', '<', '>', '>='], ["right", '==', '!=', 'IS', 'ISNT'], ["left", '&&', '||', 'AND', 'OR'], ["right", '-=', '+=', '/=', '*=', '%='], ["right", 'DELETE', 'INSTANCEOF', 'TYPEOF'], ["left", '.'], ["right", 'INDENT'], ["left", 'OUTDENT'], ["right", 'WHEN', 'LEADING_WHEN', 'IN', 'OF', 'BY'], ["right", 'THROW', 'FOR', 'NEW', 'SUPER'], ["left", 'EXTENDS'], ["left", '||=', '&&=', '?='], ["right", 'ASSIGN', 'RETURN'], ["right", '->', '=>', 'UNLESS', 'IF', 'ELSE', 'WHILE']]; // Grammar ============================================================== grammar = { // All parsing will end in this rule, being the trunk of the AST. @@ -194,6 +196,59 @@ return new OpNode($2, $1, $3); }) ], + // Try abbreviated expressions to make the grammar build faster: + // UnaryOp: [ + // o "!" + // o "!!" + // o "NOT" + // o "~" + // o "--" + // o "++" + // o "DELETE" + // o "TYPEOF" + // ] + // + // BinaryOp: [ + // o "*" + // o "/" + // o "%" + // o "+" + // o "-" + // o "<<" + // o ">>" + // o ">>>" + // o "&" + // o "|" + // o "^" + // o "<=" + // o "<" + // o ">" + // o ">=" + // o "==" + // o "!=" + // o "IS" + // o "ISNT" + // o "&&" + // o "||" + // o "AND" + // o "OR" + // o "?" + // o "-=" + // o "+=" + // o "/=" + // o "*=" + // o "%=" + // o "||=" + // o "&&=" + // o "?=" + // o "INSTANCEOF" + // o "IN" + // ] + // + // Operation: [ + // o "Expression BinaryOp Expression", -> new OpNode($2, $1, $3) + // o "UnaryOp Expression", -> new OpNode($1, $2) + // ] // The existence operator. Existence: [o("Expression ?", function() { return new ExistenceNode($1); @@ -532,7 +587,8 @@ tokens = tokens.join(" "); parser = new Parser({ tokens: tokens, - bnf: bnf + bnf: bnf, + operators: operators }, { debug: false }); diff --git a/src/parser.coffee b/src/parser.coffee index 698d159e3d..4fde86631a 100644 --- a/src/parser.coffee +++ b/src/parser.coffee @@ -13,6 +13,31 @@ o: (pattern_string, func) -> else [pattern_string, '$$ = $1;'] +# Precedence =========================================================== + +operators: [ + ["left", '?'] + ["right", 'NOT', '!', '!!', '~', '++', '--'] + ["left", '*', '/', '%'] + ["left", '+', '-'] + ["left", '<<', '>>', '>>>'] + ["left", '&', '|', '^'] + ["left", '<=', '<', '>', '>='] + ["right", '==', '!=', 'IS', 'ISNT'] + ["left", '&&', '||', 'AND', 'OR'] + ["right", '-=', '+=', '/=', '*=', '%='] + ["right", 'DELETE', 'INSTANCEOF', 'TYPEOF'] + ["left", '.'] + ["right", 'INDENT'] + ["left", 'OUTDENT'] + ["right", 'WHEN', 'LEADING_WHEN', 'IN', 'OF', 'BY'] + ["right", 'THROW', 'FOR', 'NEW', 'SUPER'] + ["left", 'EXTENDS'] + ["left", '||=', '&&=', '?='] + ["right", 'ASSIGN', 'RETURN'] + ["right", '->', '=>', 'UNLESS', 'IF', 'ELSE', 'WHILE'] +] + # Grammar ============================================================== grammar: { @@ -167,6 +192,61 @@ grammar: { o "Expression IN Expression", -> new OpNode($2, $1, $3) ] + # Try abbreviated expressions to make the grammar build faster: + + # UnaryOp: [ + # o "!" + # o "!!" + # o "NOT" + # o "~" + # o "--" + # o "++" + # o "DELETE" + # o "TYPEOF" + # ] + # + # BinaryOp: [ + # o "*" + # o "/" + # o "%" + # o "+" + # o "-" + # o "<<" + # o ">>" + # o ">>>" + # o "&" + # o "|" + # o "^" + # o "<=" + # o "<" + # o ">" + # o ">=" + # o "==" + # o "!=" + # o "IS" + # o "ISNT" + # o "&&" + # o "||" + # o "AND" + # o "OR" + # o "?" + # o "-=" + # o "+=" + # o "/=" + # o "*=" + # o "%=" + # o "||=" + # o "&&=" + # o "?=" + # o "INSTANCEOF" + # o "IN" + # ] + # + # Operation: [ + # o "Expression BinaryOp Expression", -> new OpNode($2, $1, $3) + # o "UnaryOp Expression", -> new OpNode($1, $2) + # ] + # The existence operator. Existence: [ o "Expression ?", -> new ExistenceNode($1) @@ -426,7 +506,7 @@ for name, non_terminal of grammar option[1] = "return " + option[1] option tokens: tokens.join(" ") -parser: new Parser({tokens: tokens, bnf: bnf}, {debug: false}) +parser: new Parser({tokens: tokens, bnf: bnf, operators: operators}, {debug: false}) # Thin wrapper around the real lexer parser.lexer: { From 681d4f44f49b502a44724e96d65131f4185e5e9d Mon Sep 17 00:00:00 2001 From: Jeremy Ashkenas Date: Mon, 1 Feb 2010 18:31:23 -0500 Subject: [PATCH 20/37] simplifying order of operations a bit --- lib/coffee_script/grammar.y | 10 +- lib/coffee_script/parser.rb | 1907 ++++++++++++++++++----------------- 2 files changed, 958 insertions(+), 959 deletions(-) diff --git a/lib/coffee_script/grammar.y b/lib/coffee_script/grammar.y index 174a498dcc..0b3a48686f 100644 --- a/lib/coffee_script/grammar.y +++ b/lib/coffee_script/grammar.y @@ -21,24 +21,20 @@ token INDENT OUTDENT # Declare order of operations. prechigh - left '?' nonassoc UMINUS UPLUS NOT '!' '!!' '~' '++' '--' - left '*' '/' '%' + left '*' '/' '%' '?' '.' left '+' '-' - left '<<' '>>' '>>>' - left '&' '|' '^' + left '<<' '>>' '>>>' '&' '|' '^' left '<=' '<' '>' '>=' right '==' '!=' IS ISNT left '&&' '||' AND OR - right '-=' '+=' '/=' '*=' '%=' + right '-=' '+=' '/=' '*=' '%=' '||=' '&&=' '?=' right DELETE INSTANCEOF TYPEOF - left '.' right INDENT left OUTDENT right WHEN LEADING_WHEN IN OF BY right THROW FOR NEW SUPER left EXTENDS - left '||=' '&&=' '?=' right ASSIGN RETURN right '->' '=>' UNLESS IF ELSE WHILE preclow diff --git a/lib/coffee_script/parser.rb b/lib/coffee_script/parser.rb index 9b342e4b56..3a16f47754 100644 --- a/lib/coffee_script/parser.rb +++ b/lib/coffee_script/parser.rb @@ -10,7 +10,7 @@ module CoffeeScript class Parser < Racc::Parser -module_eval(<<'...end grammar.y/module_eval...', 'grammar.y', 459) +module_eval(<<'...end grammar.y/module_eval...', 'grammar.y', 455) # Lex and parse a CoffeeScript. def parse(code) # Uncomment the following line to enable grammar debugging, in combination @@ -34,318 +34,319 @@ def on_error(error_token_id, error_value, value_stack) ##### State transition tables begin ### clist = [ -'128,59,136,28,31,33,38,42,47,51,56,61,64,92,93,95,175,92,93,95,284,285', -'90,276,91,296,90,59,91,59,57,65,124,130,59,155,288,144,287,261,169,158', -'143,147,164,44,155,49,54,309,193,155,173,143,147,150,153,157,143,147', -'150,153,157,161,123,127,132,135,139,142,146,149,152,156,160,122,126', -'131,134,138,141,145,148,151,154,159,121,125,129,133,137,140,166,11,174', -'13,17,191,29,262,34,11,40,198,28,31,33,38,42,47,51,56,61,64,206,207', -'203,155,1,59,100,21,25,193,-183,-183,193,43,98,291,52,57,65,66,13,17', -'206,207,6,12,59,22,59,32,35,267,44,280,49,54,13,17,188,59,189,73,4,9', -'15,19,24,13,17,49,37,46,118,261,13,17,191,13,17,191,192,49,11,278,293', -'28,31,33,38,42,47,51,56,61,64,277,13,17,188,1,2,7,21,25,275,29,59,34', -'43,40,75,52,57,65,66,100,255,13,17,6,12,114,22,98,32,35,155,44,169,49', -'54,200,201,143,147,261,73,4,9,15,19,24,100,49,155,37,46,100,100,182', -'98,-183,-183,13,17,98,98,11,49,59,28,31,33,38,42,47,51,56,61,64,92,93', -'95,108,1,2,7,21,25,90,29,91,34,43,40,49,52,57,65,66,49,49,101,101,6', -'12,183,22,184,32,35,155,44,314,49,54,13,17,-183,-183,185,73,4,9,15,19', -'24,155,284,285,37,46,13,17,143,147,150,153,157,161,123,186,11,2,7,28', -'31,33,38,42,47,51,56,61,64,92,93,95,202,1,2,7,21,25,90,29,91,34,43,40', -'155,52,57,65,66,205,75,-183,-183,6,12,118,22,217,32,35,155,44,,49,54', -',,-183,-183,,73,4,9,15,19,24,155,,,37,46,,,143,147,150,153,157,161,123', -',11,,,28,31,33,38,42,47,51,56,61,64,92,93,95,,1,2,7,21,25,90,29,91,34', -'43,40,155,52,57,65,66,,,143,147,6,12,,22,,32,35,155,44,,49,54,,,-183', -'-183,,73,4,9,15,19,24,155,,,37,46,,,143,147,150,153,157,161,123,,11', -',,28,31,33,38,42,47,51,56,61,64,92,93,95,,1,2,7,21,25,90,29,91,34,43', -'40,155,52,57,65,66,,,-183,-183,6,12,,22,,32,35,155,44,,49,54,,,-183', -'-183,,73,4,9,15,19,24,155,,,37,46,,,143,147,150,153,157,,,,11,,,28,31', -'33,38,42,47,51,56,61,64,,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66,', -',,,6,12,,22,,32,35,,44,,49,54,,,,,,73,4,9,15,19,24,,,,37,46,,,,,,,,', -',,11,,,28,31,33,38,42,47,51,56,61,64,,,,,1,2,7,21,25,,29,,34,43,40,', -'52,57,65,66,,,,,6,12,,22,,32,35,,44,,49,54,,,,,,73,4,9,15,19,24,,,,37', -'46,,,,,,,,,,,11,,,28,31,33,38,42,47,51,56,61,64,,,,,1,2,7,21,25,,29', -',34,43,40,,52,57,65,66,,,,,6,12,,22,,32,35,,44,,49,54,,,,,,73,4,9,15', -'19,24,,,,37,46,,,,,,,,,,,11,,,28,31,33,38,42,47,51,56,61,64,,,,,1,2', -'7,21,25,,29,,34,43,40,,52,57,65,66,,,,,6,12,,22,,32,35,,44,,49,54,,', -',,,73,4,9,15,19,24,,,,37,46,,,,,,,,,,,11,,,28,31,33,38,42,47,51,56,61', -'64,,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66,,,,,6,12,,22,,32,35,,44', -',49,54,,,,,,73,4,9,15,19,24,,,,37,46,,,,,,,,,,,11,,,28,31,33,38,42,47', -'51,56,61,64,,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66,,,,,6,12,,22', -',32,35,,44,,49,54,,,,,,73,4,9,15,19,24,,,,37,46,,,,,,,,,,,11,,,28,31', -'33,38,42,47,51,56,61,64,,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66,', -',,,6,12,,22,,32,35,,44,,49,54,,,,,,73,4,9,15,19,24,,,,37,46,,,,,,,,', -',,11,,,28,31,33,38,42,47,51,56,61,64,,,,,1,2,7,21,25,,29,,34,43,40,', -'52,57,65,66,,,,,6,12,,22,,32,35,,44,,49,54,,,,,,73,4,9,15,19,24,,,,37', -'46,,,,,,,,,,,11,,,28,31,33,38,42,47,51,56,61,64,,,,,1,2,7,21,25,,29', -',34,43,40,,52,57,65,66,,,,,6,12,,22,,32,35,,44,,49,54,,,,,,73,4,9,15', -'19,24,,,,37,46,,,,,,,,,,,11,,,28,31,33,38,42,47,51,56,61,64,,,,,1,2', -'7,21,25,,29,,34,43,40,,52,57,65,66,,,,,6,12,,22,,32,35,,44,,49,54,106', -',,,,73,4,9,15,19,24,,,,37,46,,,,,,,,,,,11,,,28,31,33,38,42,47,51,56', -'61,64,,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66,,,,,6,12,,22,,32,35', -',44,,49,54,,,,,,73,4,9,15,19,24,,,,37,46,,,,,,,,,,,11,,,28,31,33,38', -'42,47,51,56,61,64,,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66,,,,,6,12', -',22,,32,35,,44,,49,54,,,,,,73,4,9,15,19,24,,,,37,46,,,,,,,,,,,11,,,28', -'31,33,38,42,47,51,56,61,64,,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66', -',,,,6,12,,22,,32,35,,44,,49,54,,,,,,73,4,9,15,19,24,,,,37,46,,,,,,,', -',,,11,,,28,31,33,38,42,47,51,56,61,64,,,,,1,2,7,21,25,,29,,34,43,40', -',52,57,65,66,,,,,6,12,,22,,32,35,,44,,49,54,,,,,,73,4,9,15,19,24,,,', -'37,46,,,,,,,,,,,11,,,28,31,33,38,42,47,51,56,61,64,,,,,1,2,7,21,25,', -'29,,34,43,40,,52,57,65,66,,,,,6,12,,22,,32,35,,44,,49,54,,,,,,73,4,9', -'15,19,24,,,,37,46,,,,,,,,,,,11,,,28,31,33,38,42,47,51,56,61,64,,,,,1', -'2,7,21,25,,29,,34,43,40,,52,57,65,66,,,,,6,12,,22,,32,35,,44,,49,54', -',,,,,73,4,9,15,19,24,,,,37,46,,,,,,,,,,,11,,,28,31,33,38,42,47,51,56', -'61,64,,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66,,,,,6,12,,22,,32,35', -',44,,49,54,,,,,,73,4,9,15,19,24,,,,37,46,,,,,,,,,,,11,,,28,31,33,38', -'42,47,51,56,61,64,310,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66,,,,', -'6,12,,22,,32,35,,44,,49,54,,116,,,,73,4,9,15,19,24,,,,37,46,,,,,,,,', -',,11,,,28,31,33,38,42,47,51,56,61,64,,,,,1,2,7,21,25,,29,,34,43,40,', -'52,57,65,66,,,,,6,12,,22,,32,35,,44,,49,54,,,,,,73,4,9,15,19,24,,,,37', -'46,,,,,,,,,,,11,,,28,31,33,38,42,47,51,56,61,64,,,,,1,2,7,21,25,,29', -',34,43,40,,52,57,65,66,,,,,6,12,,22,,32,35,,44,,49,54,,,,,,73,4,9,15', -'19,24,,,,37,46,,,,,,,,,,,11,,,28,31,33,38,42,47,51,56,61,64,,,,,1,2', -'7,21,25,,29,,34,43,40,,52,57,65,66,,,,,6,12,,22,,32,35,,44,,49,54,,', -',,,73,4,9,15,19,24,,,,37,46,,,,,,,,,,,11,,,28,31,33,38,42,47,51,56,61', -'64,300,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66,,,,,6,12,,22,,32,35', -',44,,49,54,,,,,,73,4,9,15,19,24,,,,37,46,,,,,,,,,,,11,,,28,31,33,38', -'42,47,51,56,61,64,,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66,,,,,6,12', -',22,,32,35,,44,,49,54,,,,,,73,4,9,15,19,24,,,,37,46,,,,,,,,,,,11,,,28', -'31,33,38,42,47,51,56,61,64,,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66', -',,,,6,12,,22,,32,35,,44,,49,54,,,,,,73,4,9,15,19,24,,,,37,46,,,,,,,', -',,,11,,,28,31,33,38,42,47,51,56,61,64,,,,,1,2,7,21,25,,29,,34,43,40', -',52,57,65,66,,,,,6,12,,22,,32,35,,44,,49,54,,,,,,73,4,9,15,19,24,,,', -'37,46,,,,,,,,,,,11,,,28,31,33,38,42,47,51,56,61,64,,,,,1,2,7,21,25,', -'29,,34,43,40,,52,57,65,66,,,,,6,12,,22,,32,35,,44,,49,54,,,,,,73,4,9', -'15,19,24,,,,37,46,,,,,,,,,,,11,,,28,31,33,38,42,47,51,56,61,64,,,,,1', -'2,7,21,25,,29,,34,43,40,,52,57,65,66,,,,,6,12,,22,,32,35,,44,,49,54', -',,,,,73,4,9,15,19,24,,,,37,46,,,,,,,,,,,11,,,28,31,33,38,42,47,51,56', -'61,64,,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66,,,,,6,12,,22,,32,35', -',44,,49,54,,,,,,73,4,9,15,19,24,,,,37,46,,,,,,,,,,,11,,,28,31,33,38', -'42,47,51,56,61,64,,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66,,,,,6,12', -',22,,32,35,,44,,49,54,272,,,,,73,4,9,15,19,24,155,,,37,46,,,143,147', -'150,153,157,161,123,127,132,135,139,142,146,149,152,156,160,122,126', -'131,134,,,,,,2,7,13,17,,29,,34,11,40,,28,31,33,38,42,47,51,56,61,64', -',,,,1,,,21,25,,,,,43,,,52,57,65,66,,,,,6,12,,22,,32,35,,44,,49,54,,', -',,,73,4,9,15,19,24,,,,37,46,,,,,,,,,,,11,,,28,31,33,38,42,47,51,56,61', -'64,,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66,,,,,6,12,,22,,32,35,,44', -',49,54,,,,,,73,4,9,15,19,24,,,,37,46,,,,,,,,,,,11,,,28,31,33,38,42,47', -'51,56,61,64,,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66,,,,,6,12,,22', -',32,35,,44,,49,54,,,,,,73,4,9,15,19,24,,,,37,46,,,,,,,,,,,11,,,28,31', -'33,38,42,47,51,56,61,64,,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66,', -',,,6,12,,22,,32,35,,44,,49,54,,,,,,73,4,9,15,19,24,,,,37,46,,,,,,,,', -',,11,,,28,31,33,38,42,47,51,56,61,64,,,,,1,2,7,21,25,,29,,34,43,40,', -'52,57,65,66,,,,,6,12,,22,,32,35,,44,,49,54,,,,,,73,4,9,15,19,24,,,,37', -'46,,,,,,,,,,,11,,,28,31,33,38,42,47,51,56,61,64,,,,,1,2,7,21,25,,29', -',34,43,40,,52,57,65,66,,,,,6,12,,22,,32,35,,44,,49,54,,,,,,73,4,9,15', -'19,24,,,,37,46,,,,,,,,,,,11,,,28,31,33,38,42,47,51,56,61,64,,,,,1,2', -'7,21,25,,29,,34,43,40,,52,57,65,66,,,,,6,12,,22,,32,35,,44,,49,54,,', -',,,73,4,9,15,19,24,,,,37,46,,,,,,,,,,,11,,,28,31,33,38,42,47,51,56,61', -'64,,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66,,,,,6,12,,22,,32,35,,44', -',49,54,,,,,,73,4,9,15,19,24,,,,37,46,,,,,,,,,,,11,,,28,31,33,38,42,47', -'51,56,61,64,,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66,,,,,6,12,,22', -',32,35,,44,,49,54,,,,,,73,4,9,15,19,24,,,,37,46,,,,,,,,,,,11,,,28,31', -'33,38,42,47,51,56,61,64,,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66,', -',,,6,12,,22,,32,35,,44,,49,54,,,,,,73,4,9,15,19,24,,,,37,46,,,,,,,,', -',,11,,,28,31,33,38,42,47,51,56,61,64,,,,,1,2,7,21,25,,29,,34,43,40,', -'52,57,65,66,,,,,6,12,,22,,32,35,,44,,49,54,,,,,,73,4,9,15,19,24,,,,37', -'46,,,,,,,,,,,11,,,28,31,33,38,42,47,51,56,61,64,,,,,1,2,7,21,25,,29', -',34,43,40,,52,57,65,66,,,,,6,12,,22,,32,35,,44,,49,54,106,,,,,73,4,9', -'15,19,24,,,,37,46,,,,,,,,,,,11,,,28,31,33,38,42,47,51,56,61,64,,,,,1', -'2,7,21,25,,29,,34,43,40,,52,57,65,66,,,,,6,12,,22,,32,35,,44,,49,54', -',,,,,73,4,9,15,19,24,,,,37,46,,,,,,,,,,,11,,,28,31,33,38,42,47,51,56', -'61,64,,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66,,,,,6,12,,22,,32,35', -',44,,49,54,,,,,,73,4,9,15,19,24,,,,37,46,,,,,,,,,,,11,,,28,31,33,38', -'42,47,51,56,61,64,,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66,,,,,6,12', -',22,,32,35,,44,,49,54,,,,,,73,4,9,15,19,24,,,,37,46,,,,,,,,,,,11,,,28', -'31,33,38,42,47,51,56,61,64,,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66', -',,,,6,12,,22,,32,35,,44,,49,54,,,,,,73,4,9,15,19,24,,,,37,46,,,,,,,', -',,,11,,,28,31,33,38,42,47,51,56,61,64,,,,,1,2,7,21,25,,29,,34,43,40', -',52,57,65,66,,,,,6,12,,22,,32,35,,44,,49,54,,,,,,73,4,9,15,19,24,,,', -'37,46,,,,,,,,,,,11,,,28,31,33,38,42,47,51,56,61,64,,,,,1,2,7,21,25,', -'29,,34,43,40,,52,57,65,66,,,,,6,12,,22,,32,35,,44,,49,54,,,,,,73,4,9', -'15,19,24,,,,37,46,,,,,,,,,,,11,,,28,31,33,38,42,47,51,56,61,64,,,,,1', -'2,7,21,25,,29,,34,43,40,,52,57,65,66,,,,,6,12,,22,,32,35,,44,,49,54', -',,,,,73,4,9,15,19,24,,,,37,46,,,,,,,,,,,11,,,28,31,33,38,42,47,51,56', -'61,64,,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66,,,,,6,12,,22,,32,35', -',44,,49,54,,,,,,73,4,9,15,19,24,,,,37,46,,,,,,,,,,,11,,,28,31,33,38', -'42,47,51,56,61,64,,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66,,,,,6,12', -',22,,32,35,,44,,49,54,,,,,,73,4,9,15,19,24,,,,37,46,,,,,,,,,,,11,,,28', -'31,33,38,42,47,51,56,61,64,,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66', -',,,,6,12,,22,,32,35,,44,,49,54,,,,,,73,4,9,15,19,24,,,,37,46,,,,,,,', -',,,11,,,28,31,33,38,42,47,51,56,61,64,,,,,1,2,7,21,25,,29,,34,43,40', -',52,57,65,66,,,,,6,12,,22,,32,35,,44,,49,54,,,,,,73,4,9,15,19,24,,,', -'37,46,,,,,,,,,,,11,,,28,31,33,38,42,47,51,56,61,64,,,,,1,2,7,21,25,', -'29,,34,43,40,,52,57,65,66,,,,,6,12,,22,,32,35,,44,,49,54,,,,,,73,4,9', -'15,19,24,,,,37,46,,,,,,,,,,,11,,,28,31,33,38,42,47,51,56,61,64,,,,,1', -'2,7,21,25,,29,,34,43,40,,52,57,65,66,,,,,6,12,,22,,32,35,,44,,49,54', -'106,,,,,73,4,9,15,19,24,,,,37,46,,,,,,,,,,,11,,,28,31,33,38,42,47,51', -'56,61,64,,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66,,,,,6,12,,22,,32', -'35,,44,,49,54,,,,,,73,4,9,15,19,24,,,,37,46,,,,,,,,,,,11,,,28,31,33', -'38,42,47,51,56,61,64,,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66,,,,', -'6,12,,22,,32,35,,44,,49,54,59,,,,,73,4,9,15,19,24,155,,,37,46,,,143', -'147,150,153,157,161,123,127,132,135,139,142,146,149,152,156,160,122', -'126,131,134,,,,,,2,7,13,17,,29,,34,11,40,,28,31,33,38,42,47,51,56,61', -'64,,,,,1,,,21,25,,,,,43,,,52,57,65,66,,,,,6,12,,22,,32,35,,44,,49,54', -',,,,,73,4,9,15,19,24,,,,37,46,,,,,,,,,,,11,,,28,31,33,38,42,47,51,56', -'61,64,,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66,,,,,6,12,,22,,32,35', -',44,,49,54,,,,,,73,4,9,15,19,24,,,,37,46,,,,,,,,,,,11,,,28,31,33,38', -'42,47,51,56,61,64,,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66,,,,,6,12', -',22,,32,35,,44,,49,54,,,,,,73,4,9,15,19,24,,,,37,46,,,,,,,,,,,11,,,28', -'31,33,38,42,47,51,56,61,64,,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66', -',,,,6,12,,22,,32,35,,44,,49,54,,,,,,73,4,9,15,19,24,,,,37,46,,,,,,,', -',,,11,,,28,31,33,38,42,47,51,56,61,64,,,,,1,2,7,21,25,,29,,34,43,40', -',52,57,65,66,,,,,6,12,,22,,32,35,,44,,49,54,,,,,,73,4,9,15,19,24,,,', -'37,46,,,,,,,,,,,11,,,28,31,33,38,42,47,51,56,61,64,,,,,1,2,7,21,25,', -'29,,34,43,40,,52,57,65,66,,,,,6,12,,22,,32,35,,44,,49,54,,,,,,73,4,9', -'15,19,24,,,,37,46,,,,,,,,,,,11,,,28,31,33,38,42,47,51,56,61,64,,,,,1', -'2,7,21,25,,29,,34,43,40,,52,57,65,66,,,,,6,12,,22,,32,35,,44,,49,54', -',,,,,73,4,9,15,19,24,,,,37,46,,,,,,,,,,,11,,,28,31,33,38,42,47,51,56', -'61,64,,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66,,,,,6,12,,22,,32,35', -',44,,49,54,,,,,,73,4,9,15,19,24,,,,37,46,,,,,,,,,,,11,,,28,31,33,38', -'42,47,51,56,61,64,,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66,,,,,6,12', -',22,,32,35,,44,,49,54,,,,,,73,4,9,15,19,24,,,,37,46,,,,,,,,,,,11,,,28', -'31,33,38,42,47,51,56,61,64,,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66', -',,,,6,12,,22,,32,35,,44,,49,54,,,,,,73,4,9,15,19,24,,,,37,46,,,,,,,', -',,,11,,,28,31,33,38,42,47,51,56,61,64,,,,,1,2,7,21,25,,29,,34,43,40', -',52,57,65,66,,,,,6,12,,22,,32,35,,44,,49,54,,,,,,73,4,9,15,19,24,,,', -'37,46,,,,,,,,,,,11,,,28,31,33,38,42,47,51,56,61,64,,,,,1,2,7,21,25,', -'29,,34,43,40,,52,57,65,66,,,,,6,12,,22,,32,35,,44,,49,54,,128,,136,', -'73,4,9,15,19,24,155,,,37,46,,,143,147,150,153,157,161,123,127,132,135', -'139,142,146,,,124,130,,,,144,,,,158,,2,7,,,,29,,34,155,40,,,,,,143,147', -'150,153,157,161,123,127,132,135,139,142,146,149,152,156,160,122,126', -'131,134,138,141,145,148,151,154,159,121,125,129,133,137,140,128,,136', -'155,,,,,,319,143,147,150,153,157,161,123,127,132,135,139,142,146,149', -'152,156,160,122,126,131,134,,124,130,,,,144,,,,158,,,,,,,,,,155,,,,', -',,143,147,150,153,157,161,123,127,132,135,139,142,146,149,152,156,160', -'122,126,131,134,138,141,145,148,151,154,159,121,125,129,133,137,140', -',,,,,,,,,313,28,31,33,38,42,47,51,56,61,64,,,,,1,,,21,25,,,,,43,,,52', -'57,65,,,,,,,12,,22,,32,35,,44,,49,54,,,,,,73,4,9,15,19,24,,,,37,46,', -',,,28,31,33,38,42,47,51,56,61,64,,,,,1,,,21,25,,,,,43,2,7,52,57,65,29', -',34,,40,,12,,22,,32,35,,44,,49,54,,,,,,73,4,9,15,19,24,155,,,37,46,', -',143,147,150,153,157,161,123,127,132,135,,28,31,33,38,42,47,51,56,61', -'64,,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66,,,,,,12,,22,,32,35,,44', -',49,54,,,,,,73,4,9,15,19,24,,,,37,46,,,,,28,31,33,38,42,47,51,56,61', -'64,,,,,1,,,21,25,,,,,43,2,7,52,57,65,29,,34,,40,,12,,22,,32,35,,44,', -'49,54,,,,,,73,4,9,15,,28,31,33,38,42,47,51,56,61,64,155,,,,,,,143,147', -'150,153,157,161,123,127,132,135,57,65,,,,,,2,7,,,,29,,34,44,40,155,54', -',128,,136,,143,147,150,153,157,161,123,127,132,135,139,142,146,149,152', -'156,160,122,126,131,134,,,,,,,,124,130,,,,144,,,,158,,,,,,,29,,34,155', -'40,,,,,,143,147,150,153,157,161,123,127,132,135,139,142,146,149,152', -'156,160,122,126,131,134,138,141,145,148,151,154,159,121,125,129,133', -'137,140,128,155,136,,,,,,143,147,150,153,157,161,123,127,132,135,139', -'142,146,149,152,156,160,122,126,131,134,,,,124,130,,,,144,,,,158,,,', -',,,,,,155,,,,,,,143,147,150,153,157,161,123,127,132,135,139,142,146', -'149,152,156,160,122,126,131,134,138,141,145,148,151,154,159,121,125', -'129,133,137,140,128,155,136,,,,,,143,147,150,153,157,161,123,127,132', -'135,139,142,146,,,,,318,,,,,,,124,130,,,,144,,,,158,,,,,,,,,,155,,,', -',,,143,147,150,153,157,161,123,127,132,135,139,142,146,149,152,156,160', -'122,126,131,134,138,141,145,148,151,154,159,121,125,129,133,137,140', -'128,155,136,,,,,,143,147,150,153,157,161,123,127,132,135,139,142,146', -'149,152,156,160,122,126,131,134,,,,124,130,,,,144,,,,158,,,,,,,,,,155', -',,,,,,143,147,150,153,157,161,123,127,132,135,139,142,146,149,152,156', -'160,122,126,131,134,138,141,145,148,151,154,159,121,125,129,133,137', -'140,128,155,136,,,,,,143,147,150,153,157,161,123,127,132,135,139,142', -'146,149,152,156,160,122,126,131,134,,,,124,130,,,,144,,,,158,,,,,,,', -'178,,155,,,,,,,143,147,150,153,157,161,123,127,132,135,139,142,146,149', -'152,156,160,122,126,131,134,138,141,145,148,151,154,159,121,125,129', -'133,137,140,128,155,136,,,,,,143,147,150,153,157,161,123,127,132,135', -'139,142,146,149,152,156,160,122,126,131,134,,,,124,130,,,,144,,,,158', -',,,,,,,,,155,,,,,,,143,147,150,153,157,161,123,127,132,135,139,142,146', -'149,152,156,160,122,126,131,134,138,141,145,148,151,154,159,121,125', -'129,133,137,140,128,155,136,,,,,,143,147,150,153,157,161,123,127,132', -'135,139,142,146,,,,,,,,,,,,124,130,,,,144,,,,158,,,,,,,,,,155,,,,,,', -'143,147,150,153,157,161,123,127,132,135,139,142,146,149,152,156,160', -'122,126,131,134,138,141,145,148,151,154,159,121,125,129,133,137,140', -'128,155,136,,,,,,143,147,150,153,157,161,123,127,132,135,139,142,146', -',,,,,,,,,,,124,130,,,,144,,,,158,,,,,,,,,,155,,,,,,,143,147,150,153', -'157,161,123,127,132,135,139,142,146,149,152,156,160,122,126,131,134', -'138,141,145,148,151,154,159,121,125,129,133,137,140,128,155,136,,,,', -',143,147,150,153,157,161,123,127,132,135,,,,,,,,,,,,,,,124,130,,,,144', -',,,158,,,,,,,,,,155,,,,,,,143,147,150,153,157,161,123,127,132,135,139', -'142,146,149,152,156,160,122,126,131,134,138,141,145,148,151,154,159', -'121,125,129,133,137,140,128,,136,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,124,130', -',,,144,,,,158,,,,,,,,,,155,,,,,,,143,147,150,153,157,161,123,127,132', -'135,139,142,146,149,152,156,160,122,126,131,134,138,141,145,148,151', -'154,159,121,125,196,133,137,140,128,,136,,,,,,,,,,,,,,,,,,,,,,,,,,,', -',,124,130,,,,144,,,,158,,,,,,,,,,155,,,,,,,143,147,150,153,157,161,123', -'127,132,135,139,142,146,149,152,156,160,122,126,131,134,138,141,145', -'148,151,154,159,121,125,129,133,137,140,128,,136,,,,,,,,,,,,,,,,,,,', -',,,,,,,,,,124,130,,,,144,,,,158,,,,,,,,,,155,,,,,,,143,147,150,153,157', -'161,123,127,132,135,139,142,146,149,152,156,160,122,126,131,134,138', -'141,145,148,151,154,159,121,125,129,133,137,140,128,,136,,,,,,,,,,,', -',,,,,,,,,,,320,,,,,,,124,130,,,,144,,,,158,,,,,,,,,,155,,,,,,,143,147', -'150,153,157,161,123,127,132,135,139,142,146,149,152,156,160,122,126', -'131,134,138,141,145,148,151,154,159,121,125,129,133,137,140,128,,136', -',,,,,,,,,,,,,,,,,,,,,,,,,,,,,124,130,,,,144,,,,158,,,,,,,,59,,155,,', -',,,,143,147,150,153,157,161,123,127,132,135,139,142,146,149,152,156', -'160,122,126,131,134,138,141,145,148,151,154,159,121,125,129,133,137', -'140,128,,136,,,,,,,,,,,,,,,,,,,,,,,264,,,,,,,124,130,,,,144,,,,158,', -',,,,,,,,155,,,,,,,143,147,150,153,157,161,123,127,132,135,139,142,146', -'149,152,156,160,122,126,131,134,138,141,145,148,151,154,159,121,125', -'263,133,137,140,128,,136,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,124,130,,,,144', -',,,158,,,,,,,,,,155,,,,,,,143,147,150,153,157,161,123,127,132,135,139', -'142,146,149,152,156,160,122,126,131,134,138,141,145,148,151,154,159', -'121,125,129,133,137,140,128,,136,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,124,130', -',,,144,,,,158,,,,,,,,,,155,,,,,,,143,147,150,153,157,161,123,127,132', -'135,139,142,146,149,152,156,160,122,126,131,134,138,141,145,148,151', -'154,159,121,125,129,133,137,140,128,,136,,,,,,,,,,,,,,,,,,,,,,,,,,,', -',,124,130,,,,144,,,,158,,,,,,,,,,155,,,,,,,143,147,150,153,157,161,123', -'127,132,135,139,142,146,149,152,156,160,122,126,131,134,138,141,145', -'148,151,154,159,121,125,129,133,137,140,128,,136,,,,,,,,,,,,,,,,,,,', -',,,,,,,,,,124,130,,,,144,,,,158,,,,,,,,,,155,,,,,,,143,147,150,153,157', -'161,123,127,132,135,139,142,146,149,152,156,160,122,126,131,134,138', -'141,145,148,151,154,159,121,125,129,133,137,140,128,,136,,,,,,,,,,,', -',,,,,,,,,,,,,,,,,,124,130,,,,144,,,,158,,,,,,,,,,155,,,,,,,143,147,150', -'153,157,161,123,127,132,135,139,142,146,149,152,156,160,122,126,131', -'134,138,141,145,148,151,154,159,121,125,129,133,137,140,128,,136,,,', -',,,,,,,,,,,,,,,,,,,,,,,,,,124,130,,,,144,,,,158,,,,,,,,59,,155,,,,,', -',143,147,150,153,157,161,123,127,132,135,139,142,146,149,152,156,160', -'122,126,131,134,138,141,145,148,151,154,159,121,125,129,133,137,140', -'128,,136,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,124,130,,,,144,,,,158,,,,,,,,', -',155,,,,,,,143,147,150,153,157,161,123,127,132,135,139,142,146,149,152', -'156,160,122,126,131,134,138,141,145,148,151,154,159,121,125,129,133', -'137,140,124,130,,,,,,,,158,,,,,,,,,,155,,,,,,,143,147,150,153,157,161', -'123,127,132,135,139,142,146,149,152,156,160,122,126,131,134,138,141', -'145,148,151,154,159,121,125,129,133,137,140,124,130,,,,,,,,158,,,,,', -',,,,155,,,,,,,143,147,150,153,157,161,123,127,132,135,139,142,146,149', -'152,156,160,122,126,131,134,138,141,145,148,151,154,159,121,125,129', -'133,137,140,124,130,,,,,,,,158,,,,,,,,,,155,,,,,,,143,147,150,153,157', -'161,123,127,132,135,139,142,146,149,152,156,160,122,126,131,134,138', -'141,145,148,151,154,159,121,125,129,124,130,,,,,,,,158,,,,,,,,,,155', -',,,,,,143,147,150,153,157,161,123,127,132,135,139,142,146,149,152,156', -'160,122,126,131,134,138,141,145,148,151,154,159,121,125,129,124,130', -',,,,,,,158,,,,,,,,,,155,,,,,,,143,147,150,153,157,161,123,127,132,135', -'139,142,146,149,152,156,160,122,126,131,134,138,141,145,148,151,154', -'159,121,125,129,124,130,,,,,,,,158,,,,,,,,,,155,,,,,,,143,147,150,153', -'157,161,123,127,132,135,139,142,146,149,152,156,160,122,126,131,134', -'138,141,145,148,151,154,159,121,125,129,130,,,,,,,,158,,,,,,,,,,155', -',,,,,,143,147,150,153,157,161,123,127,132,135,139,142,146,149,152,156', -'160,122,126,131,134,138,141,145,148,151,154,159,121,125,129,130,,,,', -',,,158,,,,,,,,,,155,,,,,,,143,147,150,153,157,161,123,127,132,135,139', -'142,146,149,152,156,160,122,126,131,134,138,141,145,148,151,154,159', -'121,125,129,130,,,,,,,,158,,,,,,,,,,155,,,,,,,143,147,150,153,157,161', -'123,127,132,135,139,142,146,149,152,156,160,122,126,131,134,138,141', -'145,148,151,154,159,121,125,129,130,,,,,,,,158,,,,,,,,,,155,,,,,,,143', -'147,150,153,157,161,123,127,132,135,139,142,146,149,152,156,160,122', -'126,131,134,138,141,145,148,151,154,159,121,125,129,130,,,,,,,,158,', -',,,,,,,,155,,,,,,,143,147,150,153,157,161,123,127,132,135,139,142,146', -'149,152,156,160,122,126,131,134,138,141,145,148,151,154,159,121,125', -'129,158,,,,,,,,,,155,,,,,,,143,147,150,153,157,161,123,127,132,135,139', -'142,146,149,152,156,160,122,126,131,134,138,141,145,148,151,154,159', -'121,125,158,,,,,,,,,,155,,,,,,,143,147,150,153,157,161,123,127,132,135', -'139,142,146,149,152,156,160,122,126,131,134,138,141,145,148,151,154', -'159,121,125,158,,,,,,,,,,155,,,,,,,143,147,150,153,157,161,123,127,132', -'135,139,142,146,149,152,156,160,122,126,131,134,138,141,145,148,151', -'154,159,121,125,155,,,,,,,143,147,150,153,157,161,123,127,132,135,139', -'142,146,149,152,156,160,122,126,131,134,138,141,145,148,151,154,159', -'121,125,155,,,,,,,143,147,150,153,157,161,123,127,132,135,139,142,146', -'149,152,156,160,122,126,131,134,138,141,145,148,151,154,159,121,125', -'155,,,,,,,143,147,150,153,157,161,123,127,132,135,139,142,146,149,152', -'156,160,122,126,131,134,138,141,145,148,151,154,159,121,125,155,,,,', -',,143,147,150,153,157,161,123,127,132,135,139,142,146,149,152,156,160', -'122,126,131,134,138,141,145,148,151,154,159,121,125,155,,,,,,,143,147', -'150,153,157,161,123,127,132,135,139,142,146,149,152,156,160,122,126', -'131,134,138,141,145,148,151,154,159,121,125' ] - racc_action_table = arr = Array.new(9160, nil) +'127,58,135,27,30,32,36,40,45,50,55,60,63,91,92,94,175,91,92,94,284,285', +'89,276,90,296,89,261,90,58,56,64,123,128,58,48,58,144,261,284,285,158', +'-183,-183,163,42,48,117,53,309,193,13,17,188,280,189,244,139,143,147', +'150,153,155,157,122,126,131,134,138,142,146,149,152,156,160,121,125', +'130,133,137,141,145,148,151,154,159,120,124,129,132,136,140,165,11,174', +'13,17,191,28,262,33,11,38,198,27,30,32,36,40,45,50,55,60,63,169,291', +'58,99,1,58,99,21,24,193,182,97,193,41,97,183,51,56,64,65,139,143,139', +'143,6,12,117,22,58,31,34,267,42,58,48,53,2,7,288,261,70,73,4,9,15,19', +'48,48,100,48,293,44,47,99,13,17,191,13,17,191,192,97,11,139,143,27,30', +'32,36,40,45,50,55,60,63,173,13,17,188,1,2,7,21,24,203,28,58,33,41,38', +'184,51,56,64,65,99,48,13,17,6,12,185,22,97,31,34,113,42,186,48,53,169', +'91,92,94,70,73,4,9,15,19,89,58,90,-183,-183,44,47,99,13,17,206,207,206', +'207,107,97,11,48,278,27,30,32,36,40,45,50,55,60,63,91,92,94,277,1,2', +'7,21,24,89,28,90,33,41,38,314,51,56,64,65,275,48,255,100,6,12,75,22', +'202,31,34,75,42,205,48,53,287,91,92,94,70,73,4,9,15,19,89,,90,-183,-183', +'44,47,139,143,147,150,153,155,157,122,126,11,13,17,27,30,32,36,40,45', +'50,55,60,63,91,92,94,,1,2,7,21,24,89,28,90,33,41,38,,51,56,64,65,-183', +'-183,200,201,6,12,,22,,31,34,,42,,48,53,-183,-183,139,143,70,73,4,9', +'15,19,13,17,13,17,,44,47,139,143,147,150,153,155,157,122,126,11,-183', +'-183,27,30,32,36,40,45,50,55,60,63,-183,-183,-183,-183,1,2,7,21,24,', +'28,,33,41,38,,51,56,64,65,13,17,,,6,12,,22,,31,34,,42,,48,53,,,,,70', +'73,4,9,15,19,,,,,,44,47,139,143,147,150,153,155,157,122,126,11,,,27', +'30,32,36,40,45,50,55,60,63,,,,,1,2,7,21,24,,28,,33,41,38,,51,56,64,65', +',,,,6,12,,22,,31,34,,42,,48,53,,,,,70,73,4,9,15,19,,,,,,44,47,139,143', +'147,150,153,155,157,122,126,11,,,27,30,32,36,40,45,50,55,60,63,,,,,1', +'2,7,21,24,,28,,33,41,38,,51,56,64,65,,,,,6,12,,22,,31,34,,42,,48,53', +',,,,70,73,4,9,15,19,,,,,,44,47,139,143,147,150,153,155,157,122,126,11', +',,27,30,32,36,40,45,50,55,60,63,,,,,1,2,7,21,24,,28,,33,41,38,,51,56', +'64,65,,,,,6,12,,22,,31,34,,42,,48,53,,,,,70,73,4,9,15,19,,,,,,44,47', +'139,143,147,150,153,155,157,122,126,11,,,27,30,32,36,40,45,50,55,60', +'63,,,,,1,2,7,21,24,,28,,33,41,38,,51,56,64,65,,,,,6,12,,22,,31,34,,42', +',48,53,,,,,70,73,4,9,15,19,,,,,,44,47,139,143,147,150,153,155,157,,', +'11,,,27,30,32,36,40,45,50,55,60,63,,,,,1,2,7,21,24,,28,,33,41,38,,51', +'56,64,65,,,,,6,12,,22,,31,34,,42,,48,53,,,,,70,73,4,9,15,19,,,,,,44', +'47,139,143,147,150,153,155,157,,,11,,,27,30,32,36,40,45,50,55,60,63', +',,,,1,2,7,21,24,,28,,33,41,38,,51,56,64,65,,,,,6,12,,22,,31,34,,42,', +'48,53,,,,,70,73,4,9,15,19,,,,,,44,47,,,,,,,,,,11,,,27,30,32,36,40,45', +'50,55,60,63,,,,,1,2,7,21,24,,28,,33,41,38,,51,56,64,65,,,,,6,12,,22', +',31,34,,42,,48,53,,,,,70,73,4,9,15,19,,,,,,44,47,,,,,,,,,,11,,,27,30', +'32,36,40,45,50,55,60,63,,,,,1,2,7,21,24,,28,,33,41,38,,51,56,64,65,', +',,,6,12,,22,,31,34,,42,,48,53,,,,,70,73,4,9,15,19,,,,,,44,47,,,,,,,', +',,11,,,27,30,32,36,40,45,50,55,60,63,,,,,1,2,7,21,24,,28,,33,41,38,', +'51,56,64,65,,,,,6,12,,22,,31,34,,42,,48,53,,,,,70,73,4,9,15,19,,,,,', +'44,47,,,,,,,,,,11,,,27,30,32,36,40,45,50,55,60,63,,,,,1,2,7,21,24,,28', +',33,41,38,,51,56,64,65,,,,,6,12,,22,,31,34,,42,,48,53,105,,,,70,73,4', +'9,15,19,,,,,,44,47,,,,,,,,,,11,,,27,30,32,36,40,45,50,55,60,63,,,,,1', +'2,7,21,24,,28,,33,41,38,,51,56,64,65,,,,,6,12,,22,,31,34,,42,,48,53', +',,,,70,73,4,9,15,19,,,,,,44,47,,,,,,,,,,11,,,27,30,32,36,40,45,50,55', +'60,63,,,,,1,2,7,21,24,,28,,33,41,38,,51,56,64,65,,,,,6,12,,22,,31,34', +',42,,48,53,,,,,70,73,4,9,15,19,,,,,,44,47,,,,,,,,,,11,,,27,30,32,36', +'40,45,50,55,60,63,,,,,1,2,7,21,24,,28,,33,41,38,,51,56,64,65,,,,,6,12', +',22,,31,34,,42,,48,53,,,,,70,73,4,9,15,19,,,,,,44,47,,,,,,,,,,11,,,27', +'30,32,36,40,45,50,55,60,63,,,,,1,2,7,21,24,,28,,33,41,38,,51,56,64,65', +',,,,6,12,,22,,31,34,,42,,48,53,,,,,70,73,4,9,15,19,,,,,,44,47,,,,,,', +',,,11,,,27,30,32,36,40,45,50,55,60,63,,,,,1,2,7,21,24,,28,,33,41,38', +',51,56,64,65,,,,,6,12,,22,,31,34,,42,,48,53,,,,,70,73,4,9,15,19,,,,', +',44,47,,,,,,,,,,11,,,27,30,32,36,40,45,50,55,60,63,,,,,1,2,7,21,24,', +'28,,33,41,38,,51,56,64,65,,,,,6,12,,22,,31,34,,42,,48,53,,,,,70,73,4', +'9,15,19,,,,,,44,47,,,,,,,,,,11,,,27,30,32,36,40,45,50,55,60,63,,,,,1', +'2,7,21,24,,28,,33,41,38,,51,56,64,65,,,,,6,12,,22,,31,34,,42,,48,53', +',,,,70,73,4,9,15,19,,,,,310,44,47,,,,,,,,,,11,,,27,30,32,36,40,45,50', +'55,60,63,,,,,1,2,7,21,24,,28,,33,41,38,,51,56,64,65,,,,,6,12,,22,,31', +'34,,42,,48,53,,115,,,70,73,4,9,15,19,,,,,,44,47,,,,,,,,,,11,,,27,30', +'32,36,40,45,50,55,60,63,,,,,1,2,7,21,24,,28,,33,41,38,,51,56,64,65,', +',,,6,12,,22,,31,34,,42,,48,53,,,,,70,73,4,9,15,19,,,,,,44,47,,,,,,,', +',,11,,,27,30,32,36,40,45,50,55,60,63,,,,,1,2,7,21,24,,28,,33,41,38,', +'51,56,64,65,,,,,6,12,,22,,31,34,,42,,48,53,,,,,70,73,4,9,15,19,,,,,', +'44,47,,,,,,,,,,11,,,27,30,32,36,40,45,50,55,60,63,,,,,1,2,7,21,24,,28', +',33,41,38,,51,56,64,65,,,,,6,12,,22,,31,34,,42,,48,53,,,,,70,73,4,9', +'15,19,,,,,300,44,47,,,,,,,,,,11,,,27,30,32,36,40,45,50,55,60,63,,,,', +'1,2,7,21,24,,28,,33,41,38,,51,56,64,65,,,,,6,12,,22,,31,34,,42,,48,53', +',,,,70,73,4,9,15,19,,,,,,44,47,,,,,,,,,,11,,,27,30,32,36,40,45,50,55', +'60,63,,,,,1,2,7,21,24,,28,,33,41,38,,51,56,64,65,,,,,6,12,,22,,31,34', +',42,,48,53,,,,,70,73,4,9,15,19,,,,,,44,47,,,,,,,,,,11,,,27,30,32,36', +'40,45,50,55,60,63,,,,,1,2,7,21,24,,28,,33,41,38,,51,56,64,65,,,,,6,12', +',22,,31,34,,42,,48,53,,,,,70,73,4,9,15,19,,,,,,44,47,,,,,,,,,,11,,,27', +'30,32,36,40,45,50,55,60,63,,,,,1,2,7,21,24,,28,,33,41,38,,51,56,64,65', +',,,,6,12,,22,,31,34,,42,,48,53,,,,,70,73,4,9,15,19,,,,,,44,47,,,,,,', +',,,11,,,27,30,32,36,40,45,50,55,60,63,,,,,1,2,7,21,24,,28,,33,41,38', +',51,56,64,65,,,,,6,12,,22,,31,34,,42,,48,53,,,,,70,73,4,9,15,19,,,,', +',44,47,,,,,,,,,,11,,,27,30,32,36,40,45,50,55,60,63,,,,,1,2,7,21,24,', +'28,,33,41,38,,51,56,64,65,,,,,6,12,,22,,31,34,,42,,48,53,,,,,70,73,4', +'9,15,19,,,,,,44,47,,,,,,,,,,11,,,27,30,32,36,40,45,50,55,60,63,,,,,1', +'2,7,21,24,,28,,33,41,38,,51,56,64,65,,,,,6,12,,22,,31,34,,42,,48,53', +',,,,70,73,4,9,15,19,,,,,,44,47,,,,,,,,,,11,,,27,30,32,36,40,45,50,55', +'60,63,,,,,1,2,7,21,24,,28,,33,41,38,,51,56,64,65,,,,,6,12,,22,,31,34', +',42,,48,53,,,,,70,73,4,9,15,19,,,,,,44,47,,,,,,,,,,11,,,27,30,32,36', +'40,45,50,55,60,63,,,,,1,2,7,21,24,,28,,33,41,38,,51,56,64,65,,,,,6,12', +',22,,31,34,,42,,48,53,272,,,,70,73,4,9,15,19,,,,,,44,47,139,143,147', +'150,153,155,157,122,126,131,134,138,142,146,149,152,156,160,121,125', +'130,133,137,,,,,2,7,13,17,,28,,33,11,38,,27,30,32,36,40,45,50,55,60', +'63,,,,,1,,,21,24,,,,,41,,,51,56,64,65,,,,,6,12,,22,,31,34,,42,,48,53', +',,,,70,73,4,9,15,19,,,,,,44,47,,,,,,,,,,11,,,27,30,32,36,40,45,50,55', +'60,63,,,,,1,2,7,21,24,,28,,33,41,38,,51,56,64,65,,,,,6,12,,22,,31,34', +',42,,48,53,,,,,70,73,4,9,15,19,,,,,,44,47,,,,,,,,,,11,,,27,30,32,36', +'40,45,50,55,60,63,,,,,1,2,7,21,24,,28,,33,41,38,,51,56,64,65,,,,,6,12', +',22,,31,34,,42,,48,53,,,,,70,73,4,9,15,19,,,,,,44,47,,,,,,,,,,11,,,27', +'30,32,36,40,45,50,55,60,63,,,,,1,2,7,21,24,,28,,33,41,38,,51,56,64,65', +',,,,6,12,,22,,31,34,,42,,48,53,,,,,70,73,4,9,15,19,,,,,,44,47,,,,,,', +',,,11,,,27,30,32,36,40,45,50,55,60,63,,,,,1,2,7,21,24,,28,,33,41,38', +',51,56,64,65,,,,,6,12,,22,,31,34,,42,,48,53,,,,,70,73,4,9,15,19,,,,', +',44,47,,,,,,,,,,11,,,27,30,32,36,40,45,50,55,60,63,,,,,1,2,7,21,24,', +'28,,33,41,38,,51,56,64,65,,,,,6,12,,22,,31,34,,42,,48,53,,,,,70,73,4', +'9,15,19,,,,,,44,47,,,,,,,,,,11,,,27,30,32,36,40,45,50,55,60,63,,,,,1', +'2,7,21,24,,28,,33,41,38,,51,56,64,65,,,,,6,12,,22,,31,34,,42,,48,53', +',,,,70,73,4,9,15,19,,,,,,44,47,,,,,,,,,,11,,,27,30,32,36,40,45,50,55', +'60,63,,,,,1,2,7,21,24,,28,,33,41,38,,51,56,64,65,,,,,6,12,,22,,31,34', +',42,,48,53,,,,,70,73,4,9,15,19,,,,,,44,47,,,,,,,,,,11,,,27,30,32,36', +'40,45,50,55,60,63,,,,,1,2,7,21,24,,28,,33,41,38,,51,56,64,65,,,,,6,12', +',22,,31,34,,42,,48,53,,,,,70,73,4,9,15,19,,,,,,44,47,,,,,,,,,,11,,,27', +'30,32,36,40,45,50,55,60,63,,,,,1,2,7,21,24,,28,,33,41,38,,51,56,64,65', +',,,,6,12,,22,,31,34,,42,,48,53,,,,,70,73,4,9,15,19,,,,,,44,47,,,,,,', +',,,11,,,27,30,32,36,40,45,50,55,60,63,,,,,1,2,7,21,24,,28,,33,41,38', +',51,56,64,65,,,,,6,12,,22,,31,34,,42,,48,53,105,,,,70,73,4,9,15,19,', +',,,,44,47,,,,,,,,,,11,,,27,30,32,36,40,45,50,55,60,63,,,,,1,2,7,21,24', +',28,,33,41,38,,51,56,64,65,,,,,6,12,,22,,31,34,,42,,48,53,,,,,70,73', +'4,9,15,19,,,,,,44,47,,,,,,,,,,11,,,27,30,32,36,40,45,50,55,60,63,,,', +',1,2,7,21,24,,28,,33,41,38,,51,56,64,65,,,,,6,12,,22,,31,34,,42,,48', +'53,,,,,70,73,4,9,15,19,,,,,,44,47,,,,,,,,,,11,,,27,30,32,36,40,45,50', +'55,60,63,,,,,1,2,7,21,24,,28,,33,41,38,,51,56,64,65,,,,,6,12,,22,,31', +'34,,42,,48,53,,,,,70,73,4,9,15,19,,,,,,44,47,,,,,,,,,,11,,,27,30,32', +'36,40,45,50,55,60,63,,,,,1,2,7,21,24,,28,,33,41,38,,51,56,64,65,,,,', +'6,12,,22,,31,34,,42,,48,53,,,,,70,73,4,9,15,19,,,,,,44,47,,,,,,,,,,11', +',,27,30,32,36,40,45,50,55,60,63,,,,,1,2,7,21,24,,28,,33,41,38,,51,56', +'64,65,,,,,6,12,,22,,31,34,,42,,48,53,,,,,70,73,4,9,15,19,,,,,,44,47', +',,,,,,,,,11,,,27,30,32,36,40,45,50,55,60,63,,,,,1,2,7,21,24,,28,,33', +'41,38,,51,56,64,65,,,,,6,12,,22,,31,34,,42,,48,53,,,,,70,73,4,9,15,19', +',,,,,44,47,,,,,,,,,,11,,,27,30,32,36,40,45,50,55,60,63,,,,,1,2,7,21', +'24,,28,,33,41,38,,51,56,64,65,,,,,6,12,,22,,31,34,,42,,48,53,,,,,70', +'73,4,9,15,19,,,,,,44,47,,,,,,,,,,11,,,27,30,32,36,40,45,50,55,60,63', +',,,,1,2,7,21,24,,28,,33,41,38,,51,56,64,65,,,,,6,12,,22,,31,34,,42,', +'48,53,,,,,70,73,4,9,15,19,,,,,,44,47,,,,,,,,,,11,,,27,30,32,36,40,45', +'50,55,60,63,,,,,1,2,7,21,24,,28,,33,41,38,,51,56,64,65,,,,,6,12,,22', +',31,34,,42,,48,53,,,,,70,73,4,9,15,19,,,,,,44,47,,,,,,,,,,11,,,27,30', +'32,36,40,45,50,55,60,63,,,,,1,2,7,21,24,,28,,33,41,38,,51,56,64,65,', +',,,6,12,,22,,31,34,,42,,48,53,,,,,70,73,4,9,15,19,,,,,,44,47,,,,,,,', +',,11,,,27,30,32,36,40,45,50,55,60,63,,,,,1,2,7,21,24,,28,,33,41,38,', +'51,56,64,65,,,,,6,12,,22,,31,34,,42,,48,53,,,,,70,73,4,9,15,19,,,,,', +'44,47,,,,,,,,,,11,,,27,30,32,36,40,45,50,55,60,63,,,,,1,2,7,21,24,,28', +',33,41,38,,51,56,64,65,,,,,6,12,,22,,31,34,,42,,48,53,,,,,70,73,4,9', +'15,19,,,,,,44,47,,,,,,,,,,11,,,27,30,32,36,40,45,50,55,60,63,,,,,1,2', +'7,21,24,,28,,33,41,38,,51,56,64,65,,,,,6,12,,22,,31,34,,42,,48,53,105', +',,,70,73,4,9,15,19,,,,,,44,47,,,,,,,,,,11,,,27,30,32,36,40,45,50,55', +'60,63,,,,,1,2,7,21,24,,28,,33,41,38,,51,56,64,65,,,,,6,12,,22,,31,34', +',42,,48,53,58,,,,70,73,4,9,15,19,,,,,,44,47,139,143,147,150,153,155', +'157,122,126,131,134,138,142,146,149,152,156,160,121,125,130,133,137', +',,,,2,7,13,17,,28,,33,11,38,,27,30,32,36,40,45,50,55,60,63,,,,,1,,,21', +'24,,,,,41,,,51,56,64,65,,,,,6,12,,22,,31,34,,42,,48,53,,,,,70,73,4,9', +'15,19,,,,,,44,47,,,,,,,,,,11,,,27,30,32,36,40,45,50,55,60,63,,,,,1,2', +'7,21,24,,28,,33,41,38,,51,56,64,65,,,,,6,12,,22,,31,34,,42,,48,53,,', +',,70,73,4,9,15,19,,,,,,44,47,,,,,,,,,,11,,,27,30,32,36,40,45,50,55,60', +'63,,,,,1,2,7,21,24,,28,,33,41,38,,51,56,64,65,,,,,6,12,,22,,31,34,,42', +',48,53,,,,,70,73,4,9,15,19,,,,,,44,47,,,,,,,,,,11,,,27,30,32,36,40,45', +'50,55,60,63,,,,,1,2,7,21,24,,28,,33,41,38,,51,56,64,65,,,,,6,12,,22', +',31,34,,42,,48,53,,,,,70,73,4,9,15,19,,,,,,44,47,,,,,,,,,,11,,,27,30', +'32,36,40,45,50,55,60,63,,,,,1,2,7,21,24,,28,,33,41,38,,51,56,64,65,', +',,,6,12,,22,,31,34,,42,,48,53,,,,,70,73,4,9,15,19,,,,,,44,47,,,,,,,', +',,11,,,27,30,32,36,40,45,50,55,60,63,,,,,1,2,7,21,24,,28,,33,41,38,', +'51,56,64,65,,,,,6,12,,22,,31,34,,42,,48,53,,,,,70,73,4,9,15,19,,,,,', +'44,47,,,,,,,,,,11,,,27,30,32,36,40,45,50,55,60,63,,,,,1,2,7,21,24,,28', +',33,41,38,,51,56,64,65,,,,,6,12,,22,,31,34,,42,,48,53,,,,,70,73,4,9', +'15,19,,,,,,44,47,,,,,,,,,,11,,,27,30,32,36,40,45,50,55,60,63,,,,,1,2', +'7,21,24,,28,,33,41,38,,51,56,64,65,,,,,6,12,,22,,31,34,,42,,48,53,,', +',,70,73,4,9,15,19,,,,,,44,47,,,,,,,,,,11,,,27,30,32,36,40,45,50,55,60', +'63,,,,,1,2,7,21,24,,28,,33,41,38,,51,56,64,65,,,,,6,12,,22,,31,34,,42', +',48,53,,,,,70,73,4,9,15,19,,,,,,44,47,,,,,,,,,,11,,,27,30,32,36,40,45', +'50,55,60,63,,,,,1,2,7,21,24,,28,,33,41,38,,51,56,64,65,,,,,6,12,,22', +',31,34,,42,,48,53,,,,,70,73,4,9,15,19,,,,,,44,47,,,,,,,,,,11,,,27,30', +'32,36,40,45,50,55,60,63,,,,,1,2,7,21,24,,28,,33,41,38,,51,56,64,65,', +',,,6,12,,22,,31,34,,42,,48,53,,,,,70,73,4,9,15,19,,,,,,44,47,,,,,,,', +',,11,,,27,30,32,36,40,45,50,55,60,63,,,,,1,2,7,21,24,,28,,33,41,38,', +'51,56,64,65,,,,,6,12,,22,,31,34,,42,,48,53,,,,,70,73,4,9,15,19,,,,,', +'44,47,,,,,,,,,,11,,,27,30,32,36,40,45,50,55,60,63,,,,,1,2,7,21,24,,28', +',33,41,38,,51,56,64,65,,,,,6,12,,22,,31,34,,42,,48,53,,,,,70,73,4,9', +'15,19,,,,,,44,47,,,,,,,,,,11,,,27,30,32,36,40,45,50,55,60,63,,,,,1,2', +'7,21,24,,28,,33,41,38,,51,56,64,65,,,,,6,12,,22,,31,34,,42,,48,53,127', +',135,,70,73,4,9,15,19,,,,,,44,47,139,143,147,150,153,155,157,122,126', +'131,134,138,142,146,149,123,128,,,,144,,,,158,,,2,7,,,,28,,33,,38,,', +',139,143,147,150,153,155,157,122,126,131,134,138,142,146,149,152,156', +'160,121,125,130,133,137,141,145,148,151,154,159,120,124,129,132,136', +'140,127,,135,,,,,,,319,139,143,147,150,153,155,157,122,126,131,134,138', +'142,146,149,,,,,,,,123,128,,,,144,,,,158,139,143,147,150,153,155,157', +'122,126,131,134,138,142,146,149,139,143,147,150,153,155,157,122,126', +'131,134,138,142,146,149,152,156,160,121,125,130,133,137,141,145,148', +'151,154,159,120,124,129,132,136,140,,,,,,,,,,313,27,30,32,36,40,45,50', +'55,60,63,,,,,1,,,21,24,,,,,41,,,51,56,64,,,,,,,12,,22,,31,34,,42,,48', +'53,,,,,70,73,4,9,15,19,,,,,,27,30,32,36,40,45,50,55,60,63,,,,,1,,,21', +'24,,,,,41,,,51,56,64,2,7,,,,28,12,33,22,38,31,34,,42,,48,53,,,,,70,73', +'4,9,15,19,27,30,32,36,40,45,50,55,60,63,139,143,147,150,153,155,157', +'122,126,131,134,138,142,146,149,,,56,64,,,,,,2,7,,,,28,,33,42,38,,53', +',,,,,,,,,,,,,,,27,30,32,36,40,45,50,55,60,63,,,,,1,,,21,24,,,,,41,,', +'51,56,64,65,,,,,28,12,33,22,38,31,34,,42,,48,53,,,,,70,73,4,9,15,19', +',,,,,44,47,,,,27,30,32,36,40,45,50,55,60,63,,,,,1,,,21,24,,,,,41,2,7', +'51,56,64,28,,33,,38,,12,,22,,31,34,,42,,48,53,127,,135,,70,73,4,9,15', +'19,,,,,,,,,,,,,,,,,,,,,,,123,128,,,,144,,,,158,,,2,7,,,,28,,33,,38,', +',,139,143,147,150,153,155,157,122,126,131,134,138,142,146,149,152,156', +'160,121,125,130,133,137,141,145,148,151,154,159,120,124,129,132,136', +'140,127,,135,,,,,,,,,,,,,,,,,,,,,,,320,,,,,,,123,128,,,,144,,,,158,', +',,,,,,,,,,,,,,139,143,147,150,153,155,157,122,126,131,134,138,142,146', +'149,152,156,160,121,125,130,133,137,141,145,148,151,154,159,120,124', +'129,132,136,140,127,,135,139,143,147,150,153,155,157,122,126,131,134', +'138,142,146,149,152,156,160,121,125,130,133,137,,,,,,,123,128,,,,144', +',,,158,,,,,,,,,,,,,,,,139,143,147,150,153,155,157,122,126,131,134,138', +'142,146,149,152,156,160,121,125,130,133,137,141,145,148,151,154,159', +'120,124,129,132,136,140,127,,135,139,143,147,150,153,155,157,122,126', +'131,134,138,142,146,149,152,156,160,121,125,130,133,137,,,,,,,123,128', +',,,144,,,,158,,,,,,,,58,,,,,,,,139,143,147,150,153,155,157,122,126,131', +'134,138,142,146,149,152,156,160,121,125,130,133,137,141,145,148,151', +'154,159,120,124,129,132,136,140,127,,135,,,,,,,,,,,,,,,,,,,,,,,318,', +',,,,,123,128,,,,144,,,,158,,,,,,,,,,,,,,,,139,143,147,150,153,155,157', +'122,126,131,134,138,142,146,149,152,156,160,121,125,130,133,137,141', +'145,148,151,154,159,120,124,129,132,136,140,127,,135,,,,,,,,,,,,,,,', +',,,,,,,263,,,,,,,123,128,,,,144,,,,158,,,,,,,,,,,,,,,,139,143,147,150', +'153,155,264,122,126,131,134,138,142,146,149,152,156,160,121,125,130', +'133,137,141,145,148,151,154,159,120,124,129,132,136,140,127,,135,139', +'143,147,150,153,155,157,122,126,131,134,138,142,146,149,152,156,160', +'121,125,130,133,137,,,,,,,123,128,,,,144,,,,158,,,,,,,,,,,,,,,,139,143', +'147,150,153,155,157,122,126,131,134,138,142,146,149,152,156,160,121', +'125,130,133,137,141,145,148,151,154,159,120,124,129,132,136,140,127', +',135,139,143,147,150,153,155,157,122,126,131,134,138,142,146,149,152', +'156,160,121,125,130,133,137,,,,,,,123,128,,,,144,,,,158,,,,,,,,,,,,', +',,,139,143,147,150,153,155,157,122,126,131,134,138,142,146,149,152,156', +'160,121,125,130,133,137,141,145,148,151,154,159,120,124,129,132,136', +'140,127,,135,139,143,147,150,153,155,157,122,126,131,134,138,142,146', +'149,152,156,160,121,125,130,133,137,,,,,,,123,128,,,,144,,,,158,,,,', +',,,,,,,,,,,139,143,147,150,153,155,157,122,126,131,134,138,142,146,149', +'152,156,160,121,125,130,133,137,141,145,148,151,154,159,120,124,129', +'132,136,140,127,,135,139,143,147,150,153,155,157,122,126,131,134,138', +'142,146,149,152,156,160,121,125,130,133,137,,,,,,,123,128,,,,144,,,', +'158,,,,,,,,,,,,,,,,139,143,147,150,153,155,196,122,126,131,134,138,142', +'146,149,152,156,160,121,125,130,133,137,141,145,148,151,154,159,120', +'124,129,132,136,140,127,,135,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,123,128,,', +',144,,,,158,,,,,,,,,,,,,,,,139,143,147,150,153,155,157,122,126,131,134', +'138,142,146,149,152,156,160,121,125,130,133,137,141,145,148,151,154', +'159,120,124,129,132,136,140,127,,135,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,123', +'128,,,,144,,,,158,,,,,,,,,,,,,,,,139,143,147,150,153,155,157,122,126', +'131,134,138,142,146,149,152,156,160,121,125,130,133,137,141,145,148', +'151,154,159,120,124,129,132,136,140,127,,135,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,123,128,,,,144,,,,158,,,,,,,,,,,,,,,,139,143,147,150,153,155,157', +'122,126,131,134,138,142,146,149,152,156,160,121,125,130,133,137,141', +'145,148,151,154,159,120,124,129,132,136,140,127,,135,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,123,128,,,,144,,,,158,,,,,,,,,,,,,,,,139,143,147,150,153', +'155,157,122,126,131,134,138,142,146,149,152,156,160,121,125,130,133', +'137,141,145,148,151,154,159,120,124,129,132,136,140,127,,135,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,123,128,,,,144,,,,158,,,,,,,,,,,,,,,,139,143,147', +'150,153,155,157,122,126,131,134,138,142,146,149,152,156,160,121,125', +'130,133,137,141,145,148,151,154,159,120,124,129,132,136,140,127,,135', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,123,128,,,,144,,,,158,,,,,,,,,,,,,,,,139', +'143,147,150,153,155,157,122,126,131,134,138,142,146,149,152,156,160', +'121,125,130,133,137,141,145,148,151,154,159,120,124,129,132,136,140', +'127,,135,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,123,128,,,,144,,,,158,,,,,,,,58', +',,,,,,,139,143,147,150,153,155,157,122,126,131,134,138,142,146,149,152', +'156,160,121,125,130,133,137,141,145,148,151,154,159,120,124,129,132', +'136,140,127,,135,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,123,128,,,,144,,,,158', +',,,,,,,178,,,,,,,,139,143,147,150,153,155,157,122,126,131,134,138,142', +'146,149,152,156,160,121,125,130,133,137,141,145,148,151,154,159,120', +'124,129,132,136,140,127,,135,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,123,128,,', +',144,,,,158,,,,,,,,,,,,,,,,139,143,147,150,153,155,157,122,126,131,134', +'138,142,146,149,152,156,160,121,125,130,133,137,141,145,148,151,154', +'159,120,124,129,132,136,140,127,,135,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,123', +'128,,,,144,,,,158,,,,,,,,,,,,,,,,139,143,147,150,153,155,157,122,126', +'131,134,138,142,146,149,152,156,160,121,125,130,133,137,141,145,148', +'151,154,159,120,124,129,132,136,140,127,,135,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,123,128,,,,144,,,,158,,,,,,,,,,,,,,,,139,143,147,150,153,155,157', +'122,126,131,134,138,142,146,149,152,156,160,121,125,130,133,137,141', +'145,148,151,154,159,120,124,129,132,136,140,127,,135,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,123,128,,,,144,,,,158,,,,,,,,,,,,,,,,139,143,147,150,153', +'155,157,122,126,131,134,138,142,146,149,152,156,160,121,125,130,133', +'137,141,145,148,151,154,159,120,124,129,132,136,140,123,128,,,,,,,,158', +',,,,,,,,,,,,,,,139,143,147,150,153,155,157,122,126,131,134,138,142,146', +'149,152,156,160,121,125,130,133,137,141,145,148,151,154,159,120,124', +'129,132,136,140,123,128,,,,,,,,158,,,,,,,,,,,,,,,,139,143,147,150,153', +'155,157,122,126,131,134,138,142,146,149,152,156,160,121,125,130,133', +'137,141,145,148,151,154,159,120,124,129,132,136,140,123,128,,,,,,,,158', +',,,,,,,,,,,,,,,139,143,147,150,153,155,157,122,126,131,134,138,142,146', +'149,152,156,160,121,125,130,133,137,141,145,148,151,154,159,120,124', +'129,132,136,140,128,,,,,,,,158,,,,,,,,,,,,,,,,139,143,147,150,153,155', +'157,122,126,131,134,138,142,146,149,152,156,160,121,125,130,133,137', +'141,145,148,151,154,159,120,124,129,132,136,140,128,,,,,,,,158,,,,,', +',,,,,,,,,,139,143,147,150,153,155,157,122,126,131,134,138,142,146,149', +'152,156,160,121,125,130,133,137,141,145,148,151,154,159,120,124,129', +'132,136,140,128,,,,,,,,158,,,,,,,,,,,,,,,,139,143,147,150,153,155,157', +'122,126,131,134,138,142,146,149,152,156,160,121,125,130,133,137,141', +'145,148,151,154,159,120,124,129,132,136,140,128,,,,,,,,158,,,,,,,,,', +',,,,,,139,143,147,150,153,155,157,122,126,131,134,138,142,146,149,152', +'156,160,121,125,130,133,137,141,145,148,151,154,159,120,124,129,132', +'136,140,128,,,,,,,,158,,,,,,,,,,,,,,,,139,143,147,150,153,155,157,122', +'126,131,134,138,142,146,149,152,156,160,121,125,130,133,137,141,145', +'148,151,154,159,120,124,129,132,136,140,158,,,,,,,,,,,,,,,,139,143,147', +'150,153,155,157,122,126,131,134,138,142,146,149,152,156,160,121,125', +'130,133,137,141,145,148,151,154,159,120,124,129,132,136,140,158,,,,', +',,,,,,,,,,,139,143,147,150,153,155,157,122,126,131,134,138,142,146,149', +'152,156,160,121,125,130,133,137,141,145,148,151,154,159,120,124,129', +'132,136,140,158,,,,,,,,,,,,,,,,139,143,147,150,153,155,157,122,126,131', +'134,138,142,146,149,152,156,160,121,125,130,133,137,141,145,148,151', +'154,159,120,124,129,132,136,140,139,143,147,150,153,155,157,122,126', +'131,134,138,142,146,149,152,156,160,121,125,130,133,137,141,145,148', +'151,154,159,120,124,129,132,136,140,139,143,147,150,153,155,157,122', +'126,131,134,138,142,146,149,152,156,160,121,125,130,133,137,141,145', +'148,151,154,159,120,124,129,132,136,140,139,143,147,150,153,155,157', +'122,126,131,134,138,142,146,149,152,156,160,121,125,130,133,137,141', +'145,148,151,154,159,120,124,129,132,136,140,139,143,147,150,153,155', +'157,122,126,131,134,138,142,146,149,152,156,160,121,125,130,133,137', +'141,145,148,151,154,159,120,124,129,132,136,140,139,143,147,150,153', +'155,157,122,126,131,134,138,142,146,149,152,156,160,121,125,130,133', +'137,141,145,148,151,154,159,120,124,129,132,136,140,139,143,147,150', +'153,155,157,122,126,131,134,138,142,146,149,152,156,160,121,125,130', +'133,137,141,145,148,151,154,159,120,124,129,132,136,140,139,143,147', +'150,153,155,157,122,126,131,134,138,142,146,149,152,156,160,121,125', +'130,133,137,141,145,148,151,154,159,120,124,129,132,136,140,139,143', +'147,150,153,155,157,122,126,131,134,138,142,146,149,152,156,160,121', +'125,130,133,137,141,145,148,151,154,159,120,124,129,132,136,140' ] + racc_action_table = arr = Array.new(9093, nil) idx = 0 clist.each do |str| str.split(',', -1).each do |i| @@ -355,351 +356,353 @@ def on_error(error_token_id, error_value, value_stack) end clist = [ -'110,294,110,21,21,21,21,21,21,21,21,21,21,70,70,70,76,248,248,248,208', -'208,70,197,70,263,248,257,248,69,21,21,110,110,208,239,255,110,217,290', -'71,110,239,239,70,21,211,290,21,294,197,110,75,211,211,211,211,211,110', -'110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110', -'110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,70,169', -'76,197,197,197,21,179,21,148,21,110,148,148,148,148,148,148,148,148', -'148,148,212,212,115,112,148,277,188,148,148,105,112,112,179,148,188', -'259,148,148,148,148,308,308,119,119,148,148,278,148,169,148,148,187', -'148,205,148,148,103,103,103,201,103,148,148,148,148,148,148,115,115', -'188,148,148,66,259,105,105,105,179,179,179,105,259,4,200,259,4,4,4,4', -'4,4,4,4,4,4,199,187,187,187,4,148,148,4,4,196,148,291,148,4,148,174', -'4,4,4,4,269,173,188,188,4,4,53,4,269,4,4,236,4,171,4,4,111,111,236,236', -'178,4,4,4,4,4,4,190,178,77,4,4,29,101,92,190,77,77,258,258,29,101,6', -'269,43,6,6,6,6,6,6,6,6,6,6,249,249,249,35,6,4,4,6,6,249,4,249,4,6,4', -'190,6,6,6,6,29,101,29,101,6,6,93,6,95,6,6,83,6,307,6,6,67,67,83,83,98', -'6,6,6,6,6,6,223,286,286,6,6,62,62,223,223,223,223,223,223,223,100,9', -'175,175,9,9,9,9,9,9,9,9,9,9,27,27,27,114,9,6,6,9,9,27,6,27,6,9,6,82', -'9,9,9,9,118,1,82,82,9,9,124,9,129,9,9,79,9,,9,9,,,79,79,,9,9,9,9,9,9', -'220,,,9,9,,,220,220,220,220,220,220,220,,11,,,11,11,11,11,11,11,11,11', -'11,11,84,84,84,,11,9,9,11,11,84,9,84,9,11,9,243,11,11,11,11,,,243,243', -'11,11,,11,,11,11,87,11,,11,11,,,87,87,,11,11,11,11,11,11,215,,,11,11', -',,215,215,215,215,215,215,215,,12,,,12,12,12,12,12,12,12,12,12,12,85', -'85,85,,12,11,11,12,12,85,11,85,11,12,11,109,12,12,12,12,,,109,109,12', -'12,,12,,12,12,172,12,,12,12,,,172,172,,12,12,12,12,12,12,247,,,12,12', -',,247,247,247,247,247,,,,15,,,15,15,15,15,15,15,15,15,15,15,,,,,15,12', -'12,15,15,,12,,12,15,12,,15,15,15,15,,,,,15,15,,15,,15,15,,15,,15,15', -',,,,,15,15,15,15,15,15,,,,15,15,,,,,,,,,,,19,,,19,19,19,19,19,19,19', -'19,19,19,,,,,19,15,15,19,19,,15,,15,19,15,,19,19,19,19,,,,,19,19,,19', -',19,19,,19,,19,19,,,,,,19,19,19,19,19,19,,,,19,19,,,,,,,,,,,130,,,130', -'130,130,130,130,130,130,130,130,130,,,,,130,19,19,130,130,,19,,19,130', -'19,,130,130,130,130,,,,,130,130,,130,,130,130,,130,,130,130,,,,,,130', -'130,130,130,130,130,,,,130,130,,,,,,,,,,,22,,,22,22,22,22,22,22,22,22', -'22,22,,,,,22,130,130,22,22,,130,,130,22,130,,22,22,22,22,,,,,22,22,', -'22,,22,22,,22,,22,22,,,,,,22,22,22,22,22,22,,,,22,22,,,,,,,,,,,24,,', -'24,24,24,24,24,24,24,24,24,24,,,,,24,22,22,24,24,,22,,22,24,22,,24,24', -'24,24,,,,,24,24,,24,,24,24,,24,,24,24,,,,,,24,24,24,24,24,24,,,,24,24', -',,,,,,,,,,133,,,133,133,133,133,133,133,133,133,133,133,,,,,133,24,24', -'133,133,,24,,24,133,24,,133,133,133,133,,,,,133,133,,133,,133,133,,133', -',133,133,,,,,,133,133,133,133,133,133,,,,133,133,,,,,,,,,,,128,,,128', -'128,128,128,128,128,128,128,128,128,,,,,128,133,133,128,128,,133,,133', -'128,133,,128,128,128,128,,,,,128,128,,128,,128,128,,128,,128,128,,,', -',,128,128,128,128,128,128,,,,128,128,,,,,,,,,,,309,,,309,309,309,309', -'309,309,309,309,309,309,,,,,309,128,128,309,309,,128,,128,309,128,,309', -'309,309,309,,,,,309,309,,309,,309,309,,309,,309,309,,,,,,309,309,309', -'309,309,309,,,,309,309,,,,,,,,,,,32,,,32,32,32,32,32,32,32,32,32,32', -',,,,32,309,309,32,32,,309,,309,32,309,,32,32,32,32,,,,,32,32,,32,,32', -'32,,32,,32,32,,,,,,32,32,32,32,32,32,,,,32,32,,,,,,,,,,,34,,,34,34,34', -'34,34,34,34,34,34,34,,,,,34,32,32,34,34,,32,,32,34,32,,34,34,34,34,', -',,,34,34,,34,,34,34,,34,,34,34,34,,,,,34,34,34,34,34,34,,,,34,34,,,', -',,,,,,,127,,,127,127,127,127,127,127,127,127,127,127,,,,,127,34,34,127', -'127,,34,,34,127,34,,127,127,127,127,,,,,127,127,,127,,127,127,,127,', -'127,127,,,,,,127,127,127,127,127,127,,,,127,127,,,,,,,,,,,37,,,37,37', -'37,37,37,37,37,37,37,37,,,,,37,127,127,37,37,,127,,127,37,127,,37,37', -'37,37,,,,,37,37,,37,,37,37,,37,,37,37,,,,,,37,37,37,37,37,37,,,,37,37', -',,,,,,,,,,40,,,40,40,40,40,40,40,40,40,40,40,,,,,40,37,37,40,40,,37', -',37,40,37,,40,40,40,40,,,,,40,40,,40,,40,40,,40,,40,40,,,,,,40,40,40', -'40,40,40,,,,40,40,,,,,,,,,,,126,,,126,126,126,126,126,126,126,126,126', -'126,,,,,126,40,40,126,126,,40,,40,126,40,,126,126,126,126,,,,,126,126', -',126,,126,126,,126,,126,126,,,,,,126,126,126,126,126,126,,,,126,126', -',,,,,,,,,,46,,,46,46,46,46,46,46,46,46,46,46,,,,,46,126,126,46,46,,126', -',126,46,126,,46,46,46,46,,,,,46,46,,46,,46,46,,46,,46,46,,,,,,46,46', -'46,46,46,46,,,,46,46,,,,,,,,,,,52,,,52,52,52,52,52,52,52,52,52,52,,', -',,52,46,46,52,52,,46,,46,52,46,,52,52,52,52,,,,,52,52,,52,,52,52,,52', -',52,52,,,,,,52,52,52,52,52,52,,,,52,52,,,,,,,,,,,296,,,296,296,296,296', -'296,296,296,296,296,296,,,,,296,52,52,296,296,,52,,52,296,52,,296,296', -'296,296,,,,,296,296,,296,,296,296,,296,,296,296,,,,,,296,296,296,296', -'296,296,,,,296,296,,,,,,,,,,,59,,,59,59,59,59,59,59,59,59,59,59,296', -',,,59,296,296,59,59,,296,,296,59,296,,59,59,59,59,,,,,59,59,,59,,59', -'59,,59,,59,59,,59,,,,59,59,59,59,59,59,,,,59,59,,,,,,,,,,,285,,,285', -'285,285,285,285,285,285,285,285,285,,,,,285,59,59,285,285,,59,,59,285', -'59,,285,285,285,285,,,,,285,285,,285,,285,285,,285,,285,285,,,,,,285', -'285,285,285,285,285,,,,285,285,,,,,,,,,,,284,,,284,284,284,284,284,284', -'284,284,284,284,,,,,284,285,285,284,284,,285,,285,284,285,,284,284,284', -'284,,,,,284,284,,284,,284,284,,284,,284,284,,,,,,284,284,284,284,284', -'284,,,,284,284,,,,,,,,,,,275,,,275,275,275,275,275,275,275,275,275,275', -',,,,275,284,284,275,275,,284,,284,275,284,,275,275,275,275,,,,,275,275', -',275,,275,275,,275,,275,275,,,,,,275,275,275,275,275,275,,,,275,275', -',,,,,,,,,,272,,,272,272,272,272,272,272,272,272,272,272,275,,,,272,275', -'275,272,272,,275,,275,272,275,,272,272,272,272,,,,,272,272,,272,,272', -'272,,272,,272,272,,,,,,272,272,272,272,272,272,,,,272,272,,,,,,,,,,', -'271,,,271,271,271,271,271,271,271,271,271,271,,,,,271,272,272,271,271', -',272,,272,271,272,,271,271,271,271,,,,,271,271,,271,,271,271,,271,,271', -'271,,,,,,271,271,271,271,271,271,,,,271,271,,,,,,,,,,,261,,,261,261', -'261,261,261,261,261,261,261,261,,,,,261,271,271,261,261,,271,,271,261', -'271,,261,261,261,261,,,,,261,261,,261,,261,261,,261,,261,261,,,,,,261', -'261,261,261,261,261,,,,261,261,,,,,,,,,,,207,,,207,207,207,207,207,207', -'207,207,207,207,,,,,207,261,261,207,207,,261,,261,207,261,,207,207,207', -'207,,,,,207,207,,207,,207,207,,207,,207,207,,,,,,207,207,207,207,207', -'207,,,,207,207,,,,,,,,,,,73,,,73,73,73,73,73,73,73,73,73,73,,,,,73,207', -'207,73,73,,207,,207,73,207,,73,73,73,73,,,,,73,73,,73,,73,73,,73,,73', -'73,,,,,,73,73,73,73,73,73,,,,73,73,,,,,,,,,,,206,,,206,206,206,206,206', -'206,206,206,206,206,,,,,206,73,73,206,206,,73,,73,206,73,,206,206,206', -'206,,,,,206,206,,206,,206,206,,206,,206,206,,,,,,206,206,206,206,206', -'206,,,,206,206,,,,,,,,,,,194,,,194,194,194,194,194,194,194,194,194,194', -',,,,194,206,206,194,194,,206,,206,194,206,,194,194,194,194,,,,,194,194', -',194,,194,194,,194,,194,194,,,,,,194,194,194,194,194,194,,,,194,194', -',,,,,,,,,,191,,,191,191,191,191,191,191,191,191,191,191,,,,,191,194', -'194,191,191,,194,,194,191,194,,191,191,191,191,,,,,191,191,,191,,191', -'191,,191,,191,191,191,,,,,191,191,191,191,191,191,232,,,191,191,,,232', -'232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232', -'232,232,232,,,,,,191,191,191,191,,191,,191,186,191,,186,186,186,186', -'186,186,186,186,186,186,,,,,186,,,186,186,,,,,186,,,186,186,186,186', -',,,,186,186,,186,,186,186,,186,,186,186,,,,,,186,186,186,186,186,186', -',,,186,186,,,,,,,,,,,185,,,185,185,185,185,185,185,185,185,185,185,', -',,,185,186,186,185,185,,186,,186,185,186,,185,185,185,185,,,,,185,185', -',185,,185,185,,185,,185,185,,,,,,185,185,185,185,185,185,,,,185,185', -',,,,,,,,,,166,,,166,166,166,166,166,166,166,166,166,166,,,,,166,185', -'185,166,166,,185,,185,166,185,,166,166,166,166,,,,,166,166,,166,,166', -'166,,166,,166,166,,,,,,166,166,166,166,166,166,,,,166,166,,,,,,,,,,', -'132,,,132,132,132,132,132,132,132,132,132,132,,,,,132,166,166,132,132', -',166,,166,132,166,,132,132,132,132,,,,,132,132,,132,,132,132,,132,,132', -'132,,,,,,132,132,132,132,132,132,,,,132,132,,,,,,,,,,,161,,,161,161', -'161,161,161,161,161,161,161,161,,,,,161,132,132,161,161,,132,,132,161', -'132,,161,161,161,161,,,,,161,161,,161,,161,161,,161,,161,161,,,,,,161', -'161,161,161,161,161,,,,161,161,,,,,,,,,,,160,,,160,160,160,160,160,160', -'160,160,160,160,,,,,160,161,161,160,160,,161,,161,160,161,,160,160,160', -'160,,,,,160,160,,160,,160,160,,160,,160,160,,,,,,160,160,160,160,160', -'160,,,,160,160,,,,,,,,,,,159,,,159,159,159,159,159,159,159,159,159,159', -',,,,159,160,160,159,159,,160,,160,159,160,,159,159,159,159,,,,,159,159', -',159,,159,159,,159,,159,159,,,,,,159,159,159,159,159,159,,,,159,159', -',,,,,,,,,,158,,,158,158,158,158,158,158,158,158,158,158,,,,,158,159', -'159,158,158,,159,,159,158,159,,158,158,158,158,,,,,158,158,,158,,158', -'158,,158,,158,158,,,,,,158,158,158,158,158,158,,,,158,158,,,,,,,,,,', -'157,,,157,157,157,157,157,157,157,157,157,157,,,,,157,158,158,157,157', -',158,,158,157,158,,157,157,157,157,,,,,157,157,,157,,157,157,,157,,157', -'157,,,,,,157,157,157,157,157,157,,,,157,157,,,,,,,,,,,156,,,156,156', -'156,156,156,156,156,156,156,156,,,,,156,157,157,156,156,,157,,157,156', -'157,,156,156,156,156,,,,,156,156,,156,,156,156,,156,,156,156,,,,,,156', -'156,156,156,156,156,,,,156,156,,,,,,,,,,,125,,,125,125,125,125,125,125', +'108,294,108,163,163,163,163,163,163,163,163,163,163,69,69,69,76,248', +'248,248,208,208,69,197,69,264,248,178,248,201,163,163,108,108,208,178', +'68,108,290,286,286,108,79,79,69,163,290,123,163,294,197,102,102,102', +'205,102,157,108,108,108,108,108,108,108,108,108,108,108,108,108,108', +'108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108', +'108,108,108,108,69,169,76,197,197,197,163,179,163,147,163,108,147,147', +'147,147,147,147,147,147,147,147,171,259,277,100,147,278,188,147,147', +'104,91,100,179,147,188,92,147,147,147,147,234,234,240,240,147,147,65', +'147,169,147,147,187,147,257,147,147,175,175,255,259,147,147,147,147', +'147,147,100,259,100,188,259,147,147,190,104,104,104,179,179,179,104', +'190,4,242,242,4,4,4,4,4,4,4,4,4,4,75,187,187,187,4,147,147,4,4,114,147', +'291,147,4,147,94,4,4,4,4,269,190,188,188,4,4,97,4,269,4,4,52,4,99,4', +'4,71,26,26,26,4,4,4,4,4,4,26,41,26,77,77,4,4,28,114,114,118,118,212', +'212,34,28,6,269,200,6,6,6,6,6,6,6,6,6,6,249,249,249,199,6,4,4,6,6,249', +'4,249,4,6,4,307,6,6,6,6,196,28,173,28,6,6,174,6,113,6,6,1,6,117,6,6', +'244,85,85,85,6,6,6,6,6,6,85,,85,111,111,6,6,233,233,233,233,233,233', +'233,233,233,9,308,308,9,9,9,9,9,9,9,9,9,9,84,84,84,,9,6,6,9,9,84,6,84', +'6,9,6,,9,9,9,9,110,110,109,109,9,9,,9,,9,9,,9,,9,9,172,172,237,237,9', +'9,9,9,9,9,61,61,258,258,,9,9,227,227,227,227,227,227,227,227,227,11', +'82,82,11,11,11,11,11,11,11,11,11,11,166,166,83,83,11,9,9,11,11,,9,,9', +'11,9,,11,11,11,11,66,66,,,11,11,,11,,11,11,,11,,11,11,,,,,11,11,11,11', +'11,11,,,,,,11,11,223,223,223,223,223,223,223,223,223,12,,,12,12,12,12', +'12,12,12,12,12,12,,,,,12,11,11,12,12,,11,,11,12,11,,12,12,12,12,,,,', +'12,12,,12,,12,12,,12,,12,12,,,,,12,12,12,12,12,12,,,,,,12,12,220,220', +'220,220,220,220,220,220,220,15,,,15,15,15,15,15,15,15,15,15,15,,,,,15', +'12,12,15,15,,12,,12,15,12,,15,15,15,15,,,,,15,15,,15,,15,15,,15,,15', +'15,,,,,15,15,15,15,15,15,,,,,,15,15,230,230,230,230,230,230,230,230', +'230,19,,,19,19,19,19,19,19,19,19,19,19,,,,,19,15,15,19,19,,15,,15,19', +'15,,19,19,19,19,,,,,19,19,,19,,19,19,,19,,19,19,,,,,19,19,19,19,19,19', +',,,,,19,19,236,236,236,236,236,236,236,236,236,132,,,132,132,132,132', +'132,132,132,132,132,132,,,,,132,19,19,132,132,,19,,19,132,19,,132,132', +'132,132,,,,,132,132,,132,,132,132,,132,,132,132,,,,,132,132,132,132', +'132,132,,,,,,132,132,215,215,215,215,215,215,215,,,22,,,22,22,22,22', +'22,22,22,22,22,22,,,,,22,132,132,22,22,,132,,132,22,132,,22,22,22,22', +',,,,22,22,,22,,22,22,,22,,22,22,,,,,22,22,22,22,22,22,,,,,,22,22,211', +'211,211,211,211,211,211,,,131,,,131,131,131,131,131,131,131,131,131', +'131,,,,,131,22,22,131,131,,22,,22,131,22,,131,131,131,131,,,,,131,131', +',131,,131,131,,131,,131,131,,,,,131,131,131,131,131,131,,,,,,131,131', +',,,,,,,,,130,,,130,130,130,130,130,130,130,130,130,130,,,,,130,131,131', +'130,130,,131,,131,130,131,,130,130,130,130,,,,,130,130,,130,,130,130', +',130,,130,130,,,,,130,130,130,130,130,130,,,,,,130,130,,,,,,,,,,309', +',,309,309,309,309,309,309,309,309,309,309,,,,,309,130,130,309,309,,130', +',130,309,130,,309,309,309,309,,,,,309,309,,309,,309,309,,309,,309,309', +',,,,309,309,309,309,309,309,,,,,,309,309,,,,,,,,,,31,,,31,31,31,31,31', +'31,31,31,31,31,,,,,31,309,309,31,31,,309,,309,31,309,,31,31,31,31,,', +',,31,31,,31,,31,31,,31,,31,31,,,,,31,31,31,31,31,31,,,,,,31,31,,,,,', +',,,,33,,,33,33,33,33,33,33,33,33,33,33,,,,,33,31,31,33,33,,31,,31,33', +'31,,33,33,33,33,,,,,33,33,,33,,33,33,,33,,33,33,33,,,,33,33,33,33,33', +'33,,,,,,33,33,,,,,,,,,,129,,,129,129,129,129,129,129,129,129,129,129', +',,,,129,33,33,129,129,,33,,33,129,33,,129,129,129,129,,,,,129,129,,129', +',129,129,,129,,129,129,,,,,129,129,129,129,129,129,,,,,,129,129,,,,', +',,,,,38,,,38,38,38,38,38,38,38,38,38,38,,,,,38,129,129,38,38,,129,,129', +'38,129,,38,38,38,38,,,,,38,38,,38,,38,38,,38,,38,38,,,,,38,38,38,38', +'38,38,,,,,,38,38,,,,,,,,,,128,,,128,128,128,128,128,128,128,128,128', +'128,,,,,128,38,38,128,128,,38,,38,128,38,,128,128,128,128,,,,,128,128', +',128,,128,128,,128,,128,128,,,,,128,128,128,128,128,128,,,,,,128,128', +',,,,,,,,,44,,,44,44,44,44,44,44,44,44,44,44,,,,,44,128,128,44,44,,128', +',128,44,128,,44,44,44,44,,,,,44,44,,44,,44,44,,44,,44,44,,,,,44,44,44', +'44,44,44,,,,,,44,44,,,,,,,,,,47,,,47,47,47,47,47,47,47,47,47,47,,,,', +'47,44,44,47,47,,44,,44,47,44,,47,47,47,47,,,,,47,47,,47,,47,47,,47,', +'47,47,,,,,47,47,47,47,47,47,,,,,,47,47,,,,,,,,,,51,,,51,51,51,51,51', +'51,51,51,51,51,,,,,51,47,47,51,51,,47,,47,51,47,,51,51,51,51,,,,,51', +'51,,51,,51,51,,51,,51,51,,,,,51,51,51,51,51,51,,,,,,51,51,,,,,,,,,,296', +',,296,296,296,296,296,296,296,296,296,296,,,,,296,51,51,296,296,,51', +',51,296,51,,296,296,296,296,,,,,296,296,,296,,296,296,,296,,296,296', +',,,,296,296,296,296,296,296,,,,,296,296,296,,,,,,,,,,58,,,58,58,58,58', +'58,58,58,58,58,58,,,,,58,296,296,58,58,,296,,296,58,296,,58,58,58,58', +',,,,58,58,,58,,58,58,,58,,58,58,,58,,,58,58,58,58,58,58,,,,,,58,58,', +',,,,,,,,285,,,285,285,285,285,285,285,285,285,285,285,,,,,285,58,58', +'285,285,,58,,58,285,58,,285,285,285,285,,,,,285,285,,285,,285,285,,285', +',285,285,,,,,285,285,285,285,285,285,,,,,,285,285,,,,,,,,,,284,,,284', +'284,284,284,284,284,284,284,284,284,,,,,284,285,285,284,284,,285,,285', +'284,285,,284,284,284,284,,,,,284,284,,284,,284,284,,284,,284,284,,,', +',284,284,284,284,284,284,,,,,,284,284,,,,,,,,,,275,,,275,275,275,275', +'275,275,275,275,275,275,,,,,275,284,284,275,275,,284,,284,275,284,,275', +'275,275,275,,,,,275,275,,275,,275,275,,275,,275,275,,,,,275,275,275', +'275,275,275,,,,,275,275,275,,,,,,,,,,272,,,272,272,272,272,272,272,272', +'272,272,272,,,,,272,275,275,272,272,,275,,275,272,275,,272,272,272,272', +',,,,272,272,,272,,272,272,,272,,272,272,,,,,272,272,272,272,272,272', +',,,,,272,272,,,,,,,,,,271,,,271,271,271,271,271,271,271,271,271,271', +',,,,271,272,272,271,271,,272,,272,271,272,,271,271,271,271,,,,,271,271', +',271,,271,271,,271,,271,271,,,,,271,271,271,271,271,271,,,,,,271,271', +',,,,,,,,,261,,,261,261,261,261,261,261,261,261,261,261,,,,,261,271,271', +'261,261,,271,,271,261,271,,261,261,261,261,,,,,261,261,,261,,261,261', +',261,,261,261,,,,,261,261,261,261,261,261,,,,,,261,261,,,,,,,,,,70,', +',70,70,70,70,70,70,70,70,70,70,,,,,70,261,261,70,70,,261,,261,70,261', +',70,70,70,70,,,,,70,70,,70,,70,70,,70,,70,70,,,,,70,70,70,70,70,70,', +',,,,70,70,,,,,,,,,,207,,,207,207,207,207,207,207,207,207,207,207,,,', +',207,70,70,207,207,,70,,70,207,70,,207,207,207,207,,,,,207,207,,207', +',207,207,,207,,207,207,,,,,207,207,207,207,207,207,,,,,,207,207,,,,', +',,,,,73,,,73,73,73,73,73,73,73,73,73,73,,,,,73,207,207,73,73,,207,,207', +'73,207,,73,73,73,73,,,,,73,73,,73,,73,73,,73,,73,73,,,,,73,73,73,73', +'73,73,,,,,,73,73,,,,,,,,,,206,,,206,206,206,206,206,206,206,206,206', +'206,,,,,206,73,73,206,206,,73,,73,206,73,,206,206,206,206,,,,,206,206', +',206,,206,206,,206,,206,206,,,,,206,206,206,206,206,206,,,,,,206,206', +',,,,,,,,,194,,,194,194,194,194,194,194,194,194,194,194,,,,,194,206,206', +'194,194,,206,,206,194,206,,194,194,194,194,,,,,194,194,,194,,194,194', +',194,,194,194,,,,,194,194,194,194,194,194,,,,,,194,194,,,,,,,,,,191', +',,191,191,191,191,191,191,191,191,191,191,,,,,191,194,194,191,191,,194', +',194,191,194,,191,191,191,191,,,,,191,191,,191,,191,191,,191,,191,191', +'191,,,,191,191,191,191,191,191,,,,,,191,191,235,235,235,235,235,235', +'235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235', +',,,,191,191,191,191,,191,,191,127,191,,127,127,127,127,127,127,127,127', +'127,127,,,,,127,,,127,127,,,,,127,,,127,127,127,127,,,,,127,127,,127', +',127,127,,127,,127,127,,,,,127,127,127,127,127,127,,,,,,127,127,,,,', +',,,,,186,,,186,186,186,186,186,186,186,186,186,186,,,,,186,127,127,186', +'186,,127,,127,186,127,,186,186,186,186,,,,,186,186,,186,,186,186,,186', +',186,186,,,,,186,186,186,186,186,186,,,,,,186,186,,,,,,,,,,185,,,185', +'185,185,185,185,185,185,185,185,185,,,,,185,186,186,185,185,,186,,186', +'185,186,,185,185,185,185,,,,,185,185,,185,,185,185,,185,,185,185,,,', +',185,185,185,185,185,185,,,,,,185,185,,,,,,,,,,165,,,165,165,165,165', +'165,165,165,165,165,165,,,,,165,185,185,165,165,,185,,185,165,185,,165', +'165,165,165,,,,,165,165,,165,,165,165,,165,,165,165,,,,,165,165,165', +'165,165,165,,,,,,165,165,,,,,,,,,,126,,,126,126,126,126,126,126,126', +'126,126,126,,,,,126,165,165,126,126,,165,,165,126,165,,126,126,126,126', +',,,,126,126,,126,,126,126,,126,,126,126,,,,,126,126,126,126,126,126', +',,,,,126,126,,,,,,,,,,160,,,160,160,160,160,160,160,160,160,160,160', +',,,,160,126,126,160,160,,126,,126,160,126,,160,160,160,160,,,,,160,160', +',160,,160,160,,160,,160,160,,,,,160,160,160,160,160,160,,,,,,160,160', +',,,,,,,,,159,,,159,159,159,159,159,159,159,159,159,159,,,,,159,160,160', +'159,159,,160,,160,159,160,,159,159,159,159,,,,,159,159,,159,,159,159', +',159,,159,159,,,,,159,159,159,159,159,159,,,,,,159,159,,,,,,,,,,158', +',,158,158,158,158,158,158,158,158,158,158,,,,,158,159,159,158,158,,159', +',159,158,159,,158,158,158,158,,,,,158,158,,158,,158,158,,158,,158,158', +',,,,158,158,158,158,158,158,,,,,,158,158,,,,,,,,,,156,,,156,156,156', +'156,156,156,156,156,156,156,,,,,156,158,158,156,156,,158,,158,156,158', +',156,156,156,156,,,,,156,156,,156,,156,156,,156,,156,156,,,,,156,156', +'156,156,156,156,,,,,,156,156,,,,,,,,,,125,,,125,125,125,125,125,125', '125,125,125,125,,,,,125,156,156,125,125,,156,,156,125,156,,125,125,125', -'125,,,,,125,125,,125,,125,125,,125,,125,125,,,,,,125,125,125,125,125', -'125,,,,125,125,,,,,,,,,,,90,,,90,90,90,90,90,90,90,90,90,90,,,,,90,125', -'125,90,90,,125,,125,90,125,,90,90,90,90,,,,,90,90,,90,,90,90,,90,,90', -'90,90,,,,,90,90,90,90,90,90,,,,90,90,,,,,,,,,,,91,,,91,91,91,91,91,91', -'91,91,91,91,,,,,91,90,90,91,91,,90,,90,91,90,,91,91,91,91,,,,,91,91', -',91,,91,91,,91,,91,91,,,,,,91,91,91,91,91,91,,,,91,91,,,,,,,,,,,154', -',,154,154,154,154,154,154,154,154,154,154,,,,,154,91,91,154,154,,91', -',91,154,91,,154,154,154,154,,,,,154,154,,154,,154,154,,154,,154,154', -',,,,,154,154,154,154,154,154,,,,154,154,,,,,,,,,,,153,,,153,153,153', -'153,153,153,153,153,153,153,,,,,153,154,154,153,153,,154,,154,153,154', -',153,153,153,153,,,,,153,153,,153,,153,153,,153,,153,153,,,,,,153,153', -'153,153,153,153,,,,153,153,,,,,,,,,,,152,,,152,152,152,152,152,152,152', -'152,152,152,,,,,152,153,153,152,152,,153,,153,152,153,,152,152,152,152', -',,,,152,152,,152,,152,152,,152,,152,152,,,,,,152,152,152,152,152,152', -',,,152,152,,,,,,,,,,,151,,,151,151,151,151,151,151,151,151,151,151,', -',,,151,152,152,151,151,,152,,152,151,152,,151,151,151,151,,,,,151,151', -',151,,151,151,,151,,151,151,,,,,,151,151,151,151,151,151,,,,151,151', -',,,,,,,,,,150,,,150,150,150,150,150,150,150,150,150,150,,,,,150,151', -'151,150,150,,151,,151,150,151,,150,150,150,150,,,,,150,150,,150,,150', -'150,,150,,150,150,,,,,,150,150,150,150,150,150,,,,150,150,,,,,,,,,,', -'149,,,149,149,149,149,149,149,149,149,149,149,,,,,149,150,150,149,149', -',150,,150,149,150,,149,149,149,149,,,,,149,149,,149,,149,149,,149,,149', -'149,,,,,,149,149,149,149,149,149,,,,149,149,,,,,,,,,,,131,,,131,131', -'131,131,131,131,131,131,131,131,,,,,131,149,149,131,131,,149,,149,131', -'149,,131,131,131,131,,,,,131,131,,131,,131,131,,131,,131,131,,,,,,131', -'131,131,131,131,131,,,,131,131,,,,,,,,,,,146,,,146,146,146,146,146,146', -'146,146,146,146,,,,,146,131,131,146,146,,131,,131,146,131,,146,146,146', -'146,,,,,146,146,,146,,146,146,,146,,146,146,,,,,,146,146,146,146,146', -'146,,,,146,146,,,,,,,,,,,145,,,145,145,145,145,145,145,145,145,145,145', -',,,,145,146,146,145,145,,146,,146,145,146,,145,145,145,145,,,,,145,145', -',145,,145,145,,145,,145,145,,,,,,145,145,145,145,145,145,,,,145,145', -',,,,,,,,,,106,,,106,106,106,106,106,106,106,106,106,106,,,,,106,145', -'145,106,106,,145,,145,106,145,,106,106,106,106,,,,,106,106,,106,,106', -'106,,106,,106,106,,,,,,106,106,106,106,106,106,,,,106,106,,,,,,,,,,', -'144,,,144,144,144,144,144,144,144,144,144,144,,,,,144,106,106,144,144', -',106,,106,144,106,,144,144,144,144,,,,,144,144,,144,,144,144,,144,,144', -'144,,,,,,144,144,144,144,144,144,,,,144,144,,,,,,,,,,,108,,,108,108', -'108,108,108,108,108,108,108,108,,,,,108,144,144,108,108,,144,,144,108', -'144,,108,108,108,108,,,,,108,108,,108,,108,108,,108,,108,108,108,,,', -',108,108,108,108,108,108,,,,108,108,,,,,,,,,,,134,,,134,134,134,134', -'134,134,134,134,134,134,,,,,134,108,108,134,134,,108,,108,134,108,,134', -'134,134,134,,,,,134,134,,134,,134,134,,134,,134,134,,,,,,134,134,134', -'134,134,134,,,,134,134,,,,,,,,,,,0,,,0,0,0,0,0,0,0,0,0,0,,,,,0,134,134', -'0,0,,134,,134,0,134,,0,0,0,0,,,,,0,0,,0,,0,0,,0,,0,0,0,,,,,0,0,0,0,0', -'0,219,,,0,0,,,219,219,219,219,219,219,219,219,219,219,219,219,219,219', -'219,219,219,219,219,219,219,,,,,,0,0,0,0,,0,,0,141,0,,141,141,141,141', -'141,141,141,141,141,141,,,,,141,,,141,141,,,,,141,,,141,141,141,141', -',,,,141,141,,141,,141,141,,141,,141,141,,,,,,141,141,141,141,141,141', -',,,141,141,,,,,,,,,,,140,,,140,140,140,140,140,140,140,140,140,140,', -',,,140,141,141,140,140,,141,,141,140,141,,140,140,140,140,,,,,140,140', -',140,,140,140,,140,,140,140,,,,,,140,140,140,140,140,140,,,,140,140', -',,,,,,,,,,139,,,139,139,139,139,139,139,139,139,139,139,,,,,139,140', -'140,139,139,,140,,140,139,140,,139,139,139,139,,,,,139,139,,139,,139', -'139,,139,,139,139,,,,,,139,139,139,139,139,139,,,,139,139,,,,,,,,,,', -'138,,,138,138,138,138,138,138,138,138,138,138,,,,,138,139,139,138,138', -',139,,139,138,139,,138,138,138,138,,,,,138,138,,138,,138,138,,138,,138', -'138,,,,,,138,138,138,138,138,138,,,,138,138,,,,,,,,,,,137,,,137,137', -'137,137,137,137,137,137,137,137,,,,,137,138,138,137,137,,138,,138,137', -'138,,137,137,137,137,,,,,137,137,,137,,137,137,,137,,137,137,,,,,,137', -'137,137,137,137,137,,,,137,137,,,,,,,,,,,117,,,117,117,117,117,117,117', -'117,117,117,117,,,,,117,137,137,117,117,,137,,137,117,137,,117,117,117', -'117,,,,,117,117,,117,,117,117,,117,,117,117,,,,,,117,117,117,117,117', -'117,,,,117,117,,,,,,,,,,,136,,,136,136,136,136,136,136,136,136,136,136', -',,,,136,117,117,136,136,,117,,117,136,117,,136,136,136,136,,,,,136,136', -',136,,136,136,,136,,136,136,,,,,,136,136,136,136,136,136,,,,136,136', -',,,,,,,,,,135,,,135,135,135,135,135,135,135,135,135,135,,,,,135,136', -'136,135,135,,136,,136,135,136,,135,135,135,135,,,,,135,135,,135,,135', -'135,,135,,135,135,,,,,,135,135,135,135,135,135,,,,135,135,,,,,,,,,,', -'121,,,121,121,121,121,121,121,121,121,121,121,,,,,121,135,135,121,121', -',135,,135,121,135,,121,121,121,121,,,,,121,121,,121,,121,121,,121,,121', -'121,,,,,,121,121,121,121,121,121,,,,121,121,,,,,,,,,,,122,,,122,122', -'122,122,122,122,122,122,122,122,,,,,122,121,121,122,122,,121,,121,122', -'121,,122,122,122,122,,,,,122,122,,122,,122,122,,122,,122,122,,,,,,122', -'122,122,122,122,122,,,,122,122,,,,,,,,,,,123,,,123,123,123,123,123,123', -'123,123,123,123,,,,,123,122,122,123,123,,122,,122,123,122,,123,123,123', -'123,,,,,123,123,,123,,123,123,,123,,123,123,,,,,,123,123,123,123,123', -'123,,,,123,123,,,,,,,,,,,142,,,142,142,142,142,142,142,142,142,142,142', -',,,,142,123,123,142,142,,123,,123,142,123,,142,142,142,142,,,,,142,142', -',142,,142,142,,142,,142,142,,312,,312,,142,142,142,142,142,142,235,', -',142,142,,,235,235,235,235,235,235,235,235,235,235,235,235,235,,,312', -'312,,,,312,,,,312,,142,142,,,,142,,142,312,142,,,,,,312,312,312,312', +'125,,,,,125,125,,125,,125,125,,125,,125,125,,,,,125,125,125,125,125', +'125,,,,,,125,125,,,,,,,,,,89,,,89,89,89,89,89,89,89,89,89,89,,,,,89', +'125,125,89,89,,125,,125,89,125,,89,89,89,89,,,,,89,89,,89,,89,89,,89', +',89,89,89,,,,89,89,89,89,89,89,,,,,,89,89,,,,,,,,,,90,,,90,90,90,90', +'90,90,90,90,90,90,,,,,90,89,89,90,90,,89,,89,90,89,,90,90,90,90,,,,', +'90,90,,90,,90,90,,90,,90,90,,,,,90,90,90,90,90,90,,,,,,90,90,,,,,,,', +',,154,,,154,154,154,154,154,154,154,154,154,154,,,,,154,90,90,154,154', +',90,,90,154,90,,154,154,154,154,,,,,154,154,,154,,154,154,,154,,154', +'154,,,,,154,154,154,154,154,154,,,,,,154,154,,,,,,,,,,153,,,153,153', +'153,153,153,153,153,153,153,153,,,,,153,154,154,153,153,,154,,154,153', +'154,,153,153,153,153,,,,,153,153,,153,,153,153,,153,,153,153,,,,,153', +'153,153,153,153,153,,,,,,153,153,,,,,,,,,,152,,,152,152,152,152,152', +'152,152,152,152,152,,,,,152,153,153,152,152,,153,,153,152,153,,152,152', +'152,152,,,,,152,152,,152,,152,152,,152,,152,152,,,,,152,152,152,152', +'152,152,,,,,,152,152,,,,,,,,,,151,,,151,151,151,151,151,151,151,151', +'151,151,,,,,151,152,152,151,151,,152,,152,151,152,,151,151,151,151,', +',,,151,151,,151,,151,151,,151,,151,151,,,,,151,151,151,151,151,151,', +',,,,151,151,,,,,,,,,,150,,,150,150,150,150,150,150,150,150,150,150,', +',,,150,151,151,150,150,,151,,151,150,151,,150,150,150,150,,,,,150,150', +',150,,150,150,,150,,150,150,,,,,150,150,150,150,150,150,,,,,,150,150', +',,,,,,,,,149,,,149,149,149,149,149,149,149,149,149,149,,,,,149,150,150', +'149,149,,150,,150,149,150,,149,149,149,149,,,,,149,149,,149,,149,149', +',149,,149,149,,,,,149,149,149,149,149,149,,,,,,149,149,,,,,,,,,,148', +',,148,148,148,148,148,148,148,148,148,148,,,,,148,149,149,148,148,,149', +',149,148,149,,148,148,148,148,,,,,148,148,,148,,148,148,,148,,148,148', +',,,,148,148,148,148,148,148,,,,,,148,148,,,,,,,,,,133,,,133,133,133', +'133,133,133,133,133,133,133,,,,,133,148,148,133,133,,148,,148,133,148', +',133,133,133,133,,,,,133,133,,133,,133,133,,133,,133,133,,,,,133,133', +'133,133,133,133,,,,,,133,133,,,,,,,,,,146,,,146,146,146,146,146,146', +'146,146,146,146,,,,,146,133,133,146,146,,133,,133,146,133,,146,146,146', +'146,,,,,146,146,,146,,146,146,,146,,146,146,,,,,146,146,146,146,146', +'146,,,,,,146,146,,,,,,,,,,105,,,105,105,105,105,105,105,105,105,105', +'105,,,,,105,146,146,105,105,,146,,146,105,146,,105,105,105,105,,,,,105', +'105,,105,,105,105,,105,,105,105,,,,,105,105,105,105,105,105,,,,,,105', +'105,,,,,,,,,,145,,,145,145,145,145,145,145,145,145,145,145,,,,,145,105', +'105,145,145,,105,,105,145,105,,145,145,145,145,,,,,145,145,,145,,145', +'145,,145,,145,145,,,,,145,145,145,145,145,145,,,,,,145,145,,,,,,,,,', +'107,,,107,107,107,107,107,107,107,107,107,107,,,,,107,145,145,107,107', +',145,,145,107,145,,107,107,107,107,,,,,107,107,,107,,107,107,,107,,107', +'107,107,,,,107,107,107,107,107,107,,,,,,107,107,,,,,,,,,,0,,,0,0,0,0', +'0,0,0,0,0,0,,,,,0,107,107,0,0,,107,,107,0,107,,0,0,0,0,,,,,0,0,,0,,0', +'0,,0,,0,0,0,,,,0,0,0,0,0,0,,,,,,0,0,238,238,238,238,238,238,238,238', +'238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,,,,,0,0', +'0,0,,0,,0,144,0,,144,144,144,144,144,144,144,144,144,144,,,,,144,,,144', +'144,,,,,144,,,144,144,144,144,,,,,144,144,,144,,144,144,,144,,144,144', +',,,,144,144,144,144,144,144,,,,,,144,144,,,,,,,,,,142,,,142,142,142', +'142,142,142,142,142,142,142,,,,,142,144,144,142,142,,144,,144,142,144', +',142,142,142,142,,,,,142,142,,142,,142,142,,142,,142,142,,,,,142,142', +'142,142,142,142,,,,,,142,142,,,,,,,,,,124,,,124,124,124,124,124,124', +'124,124,124,124,,,,,124,142,142,124,124,,142,,142,124,142,,124,124,124', +'124,,,,,124,124,,124,,124,124,,124,,124,124,,,,,124,124,124,124,124', +'124,,,,,,124,124,,,,,,,,,,140,,,140,140,140,140,140,140,140,140,140', +'140,,,,,140,124,124,140,140,,124,,124,140,124,,140,140,140,140,,,,,140', +'140,,140,,140,140,,140,,140,140,,,,,140,140,140,140,140,140,,,,,,140', +'140,,,,,,,,,,138,,,138,138,138,138,138,138,138,138,138,138,,,,,138,140', +'140,138,138,,140,,140,138,140,,138,138,138,138,,,,,138,138,,138,,138', +'138,,138,,138,138,,,,,138,138,138,138,138,138,,,,,,138,138,,,,,,,,,', +'137,,,137,137,137,137,137,137,137,137,137,137,,,,,137,138,138,137,137', +',138,,138,137,138,,137,137,137,137,,,,,137,137,,137,,137,137,,137,,137', +'137,,,,,137,137,137,137,137,137,,,,,,137,137,,,,,,,,,,116,,,116,116', +'116,116,116,116,116,116,116,116,,,,,116,137,137,116,116,,137,,137,116', +'137,,116,116,116,116,,,,,116,116,,116,,116,116,,116,,116,116,,,,,116', +'116,116,116,116,116,,,,,,116,116,,,,,,,,,,136,,,136,136,136,136,136', +'136,136,136,136,136,,,,,136,116,116,136,136,,116,,116,136,116,,136,136', +'136,136,,,,,136,136,,136,,136,136,,136,,136,136,,,,,136,136,136,136', +'136,136,,,,,,136,136,,,,,,,,,,135,,,135,135,135,135,135,135,135,135', +'135,135,,,,,135,136,136,135,135,,136,,136,135,136,,135,135,135,135,', +',,,135,135,,135,,135,135,,135,,135,135,,,,,135,135,135,135,135,135,', +',,,,135,135,,,,,,,,,,120,,,120,120,120,120,120,120,120,120,120,120,', +',,,120,135,135,120,120,,135,,135,120,135,,120,120,120,120,,,,,120,120', +',120,,120,120,,120,,120,120,,,,,120,120,120,120,120,120,,,,,,120,120', +',,,,,,,,,121,,,121,121,121,121,121,121,121,121,121,121,,,,,121,120,120', +'121,121,,120,,120,121,120,,121,121,121,121,,,,,121,121,,121,,121,121', +',121,,121,121,,,,,121,121,121,121,121,121,,,,,,121,121,,,,,,,,,,122', +',,122,122,122,122,122,122,122,122,122,122,,,,,122,121,121,122,122,,121', +',121,122,121,,122,122,122,122,,,,,122,122,,122,,122,122,,122,,122,122', +',,,,122,122,122,122,122,122,,,,,,122,122,,,,,,,,,,134,,,134,134,134', +'134,134,134,134,134,134,134,,,,,134,122,122,134,134,,122,,122,134,122', +',134,134,134,134,,,,,134,134,,134,,134,134,,134,,134,134,,,,,134,134', +'134,134,134,134,,,,,,134,134,,,,,,,,,,141,,,141,141,141,141,141,141', +'141,141,141,141,,,,,141,134,134,141,141,,134,,134,141,134,,141,141,141', +'141,,,,,141,141,,141,,141,141,,141,,141,141,312,,312,,141,141,141,141', +'141,141,,,,,,141,141,243,243,243,243,243,243,243,243,243,243,243,243', +'243,243,243,312,312,,,,312,,,,312,,,141,141,,,,141,,141,,141,,,,312', '312,312,312,312,312,312,312,312,312,312,312,312,312,312,312,312,312', -'312,312,312,312,312,312,312,312,312,312,312,312,312,301,,301,226,,,', -',,312,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226', -'226,226,226,226,226,,301,301,,,,301,,,,301,,,,,,,,,,301,,,,,,,301,301', +'312,312,312,312,312,312,312,312,312,312,312,312,312,312,312,312,312', +'301,,301,,,,,,,312,239,239,239,239,239,239,239,239,239,239,239,239,239', +'239,239,,,,,,,,301,301,,,,301,,,,301,247,247,247,247,247,247,247,247', +'247,247,247,247,247,247,247,301,301,301,301,301,301,301,301,301,301', '301,301,301,301,301,301,301,301,301,301,301,301,301,301,301,301,301', -'301,301,301,301,301,301,301,301,301,301,301,301,301,301,301,,,,,,,,', -',301,310,310,310,310,310,310,310,310,310,310,,,,,310,,,310,310,,,,,310', -',,310,310,310,,,,,,,310,,310,,310,310,,310,,310,310,,,,,,310,310,310', -'310,310,310,,,,310,310,,,,,300,300,300,300,300,300,300,300,300,300,', -',,,300,,,300,300,,,,,300,310,310,300,300,300,310,,310,,310,,300,,300', -',300,300,,300,,300,300,,,,,,300,300,300,300,300,300,233,,,300,300,,', -'233,233,233,233,233,233,233,233,233,233,,25,25,25,25,25,25,25,25,25', -'25,,,,,25,300,300,25,25,,300,,300,25,300,,25,25,25,25,,,,,,25,,25,,25', -'25,,25,,25,25,,,,,,25,25,25,25,25,25,,,,25,25,,,,,155,155,155,155,155', -'155,155,155,155,155,,,,,155,,,155,155,,,,,155,25,25,155,155,155,25,', -'25,,25,,155,,155,,155,155,,155,,155,155,,,,,,155,155,155,155,,164,164', -'164,164,164,164,164,164,164,164,227,,,,,,,227,227,227,227,227,227,227', -'227,227,227,164,164,,,,,,155,155,,,,155,,155,164,155,229,164,,204,,204', -',229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229', -'229,229,229,229,,,,,,,,204,204,,,,204,,,,204,,,,,,,164,,164,204,164', -',,,,,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204', -'204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204', -'204,68,234,68,,,,,,234,234,234,234,234,234,234,234,234,234,234,234,234', -'234,234,234,234,234,234,234,234,,,,68,68,,,,68,,,,68,,,,,,,,,,68,,,', -',,,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68', -'68,68,68,68,68,68,68,68,68,68,68,68,311,242,311,,,,,,242,242,242,242', -'242,242,242,242,242,242,242,242,242,,,,,311,,,,,,,311,311,,,,311,,,', -'311,,,,,,,,,,311,,,,,,,311,311,311,311,311,311,311,311,311,311,311,311', +'301,301,301,301,301,301,301,301,,,,,,,,,,301,155,155,155,155,155,155', +'155,155,155,155,,,,,155,,,155,155,,,,,155,,,155,155,155,,,,,,,155,,155', +',155,155,,155,,155,155,,,,,155,155,155,155,155,155,,,,,,300,300,300', +'300,300,300,300,300,300,300,,,,,300,,,300,300,,,,,300,,,300,300,300', +'155,155,,,,155,300,155,300,155,300,300,,300,,300,300,,,,,300,300,300', +'300,300,300,21,21,21,21,21,21,21,21,21,21,210,210,210,210,210,210,210', +'210,210,210,210,210,210,210,210,,,21,21,,,,,,300,300,,,,300,,300,21', +'300,,21,,,,,,,,,,,,,,,,24,24,24,24,24,24,24,24,24,24,,,,,24,,,24,24', +',,,,24,,,24,24,24,24,,,,,21,24,21,24,21,24,24,,24,,24,24,,,,,24,24,24', +'24,24,24,,,,,,24,24,,,,310,310,310,310,310,310,310,310,310,310,,,,,310', +',,310,310,,,,,310,24,24,310,310,310,24,,24,,24,,310,,310,,310,310,,310', +',310,310,67,,67,,310,310,310,310,310,310,,,,,,,,,,,,,,,,,,,,,,,67,67', +',,,67,,,,67,,,310,310,,,,310,,310,,310,,,,67,67,67,67,67,67,67,67,67', +'67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67', +'67,67,67,317,,317,,,,,,,,,,,,,,,,,,,,,,,317,,,,,,,317,317,,,,317,,,', +'317,,,,,,,,,,,,,,,,317,317,317,317,317,317,317,317,317,317,317,317,317', +'317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,317', +'317,317,317,317,317,316,,316,219,219,219,219,219,219,219,219,219,219', +'219,219,219,219,219,219,219,219,219,219,219,219,219,,,,,,,316,316,,', +',316,,,,316,,,,,,,,,,,,,,,,316,316,316,316,316,316,316,316,316,316,316', +'316,316,316,316,316,316,316,316,316,316,316,316,316,316,316,316,316', +'316,316,316,316,316,316,316,80,,80,226,226,226,226,226,226,226,226,226', +'226,226,226,226,226,226,226,226,226,226,226,226,226,226,,,,,,,80,80', +',,,80,,,,80,,,,,,,,80,,,,,,,,80,80,80,80,80,80,80,80,80,80,80,80,80', +'80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,311', +',311,,,,,,,,,,,,,,,,,,,,,,,311,,,,,,,311,311,,,,311,,,,311,,,,,,,,,', +',,,,,,311,311,311,311,311,311,311,311,311,311,311,311,311,311,311,311', '311,311,311,311,311,311,311,311,311,311,311,311,311,311,311,311,311', -'311,311,311,311,311,231,222,231,,,,,,222,222,222,222,222,222,222,222', -'222,222,222,222,222,222,222,222,222,222,222,222,222,,,,231,231,,,,231', -',,,231,,,,,,,,,,231,,,,,,,231,231,231,231,231,231,231,231,231,231,231', +'311,311,181,,181,,,,,,,,,,,,,,,,,,,,,,,181,,,,,,,181,181,,,,181,,,,181', +',,,,,,,,,,,,,,,181,181,181,181,181,181,181,181,181,181,181,181,181,181', +'181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181', +'181,181,181,181,216,,216,232,232,232,232,232,232,232,232,232,232,232', +'232,232,232,232,232,232,232,232,232,232,232,232,,,,,,,216,216,,,,216', +',,,216,,,,,,,,,,,,,,,,216,216,216,216,216,216,216,216,216,216,216,216', +'216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216', +'216,216,216,216,216,216,180,,180,229,229,229,229,229,229,229,229,229', +'229,229,229,229,229,229,229,229,229,229,229,229,229,229,,,,,,,180,180', +',,,180,,,,180,,,,,,,,,,,,,,,,180,180,180,180,180,180,180,180,180,180', +'180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180', +'180,180,180,180,180,180,180,180,195,,195,214,214,214,214,214,214,214', +'214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,,,,', +',,195,195,,,,195,,,,195,,,,,,,,,,,,,,,,195,195,195,195,195,195,195,195', +'195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195', +'195,195,195,195,195,195,195,195,195,195,106,,106,222,222,222,222,222', +'222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222', +'222,,,,,,,106,106,,,,106,,,,106,,,,,,,,,,,,,,,,106,106,106,106,106,106', +'106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106', +'106,106,106,106,106,106,106,106,106,106,106,106,231,,231,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,231,231,,,,231,,,,231,,,,,,,,,,,,,,,,231,231,231,231', '231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231', -'231,231,231,231,231,231,81,214,81,,,,,,214,214,214,214,214,214,214,214', -'214,214,214,214,214,214,214,214,214,214,214,214,214,,,,81,81,,,,81,', -',,81,,,,,,,,81,,81,,,,,,,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81', -'81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,224,210,224', -',,,,,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210', -'210,210,210,210,210,,,,224,224,,,,224,,,,224,,,,,,,,,,224,,,,,,,224', -'224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224', -'224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,273', -'246,273,,,,,,246,246,246,246,246,246,246,246,246,246,246,246,246,,,', -',,,,,,,,273,273,,,,273,,,,273,,,,,,,,,,273,,,,,,,273,273,273,273,273', +'231,231,231,231,231,231,231,231,231,231,231,231,231,231,273,,273,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,273,273,,,,273,,,,273,,,,,,,,,,,,,,,,273,273', '273,273,273,273,273,273,273,273,273,273,273,273,273,273,273,273,273', -'273,273,273,273,273,273,273,273,273,273,273,273,216,238,216,,,,,,238', -'238,238,238,238,238,238,238,238,238,238,238,238,,,,,,,,,,,,216,216,', -',,216,,,,216,,,,,,,,,,216,,,,,,,216,216,216,216,216,216,216,216,216', -'216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216', -'216,216,216,216,216,216,216,216,274,230,274,,,,,,230,230,230,230,230', -'230,230,230,230,230,,,,,,,,,,,,,,,274,274,,,,274,,,,274,,,,,,,,,,274', -',,,,,,274,274,274,274,274,274,274,274,274,274,274,274,274,274,274,274', +'273,273,273,273,273,273,273,273,273,273,273,273,273,273,273,273,274', +',274,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,274,274,,,,274,,,,274,,,,,,,,,,,,', +',,,274,274,274,274,274,274,274,274,274,274,274,274,274,274,274,274,274', '274,274,274,274,274,274,274,274,274,274,274,274,274,274,274,274,274', -'274,107,,107,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,107,107,,,,107,,,,107,,,,', -',,,,,107,,,,,,,107,107,107,107,107,107,107,107,107,107,107,107,107,107', -'107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107', -'107,107,107,316,,316,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,316,316,,,,316,,,', -'316,,,,,,,,,,316,,,,,,,316,316,316,316,316,316,316,316,316,316,316,316', -'316,316,316,316,316,316,316,316,316,316,316,316,316,316,316,316,316', -'316,316,316,316,316,195,,195,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,195,195,,', -',195,,,,195,,,,,,,,,,195,,,,,,,195,195,195,195,195,195,195,195,195,195', -'195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195', -'195,195,195,195,195,195,195,317,,317,,,,,,,,,,,,,,,,,,,,,,,317,,,,,', -',317,317,,,,317,,,,317,,,,,,,,,,317,,,,,,,317,317,317,317,317,317,317', -'317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,317', -'317,317,317,317,317,317,317,317,317,317,78,,78,,,,,,,,,,,,,,,,,,,,,', -',,,,,,,,78,78,,,,78,,,,78,,,,,,,,78,,78,,,,,,,78,78,78,78,78,78,78,78', -'78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78', -'78,78,78,181,,181,,,,,,,,,,,,,,,,,,,,,,,181,,,,,,,181,181,,,,181,,,', -'181,,,,,,,,,,181,,,,,,,181,181,181,181,181,181,181,181,181,181,181,181', -'181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181', -'181,181,181,181,181,180,,180,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,180,180,,', -',180,,,,180,,,,,,,,,,180,,,,,,,180,180,180,180,180,180,180,180,180,180', -'180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180', -'180,180,180,180,180,180,180,265,,265,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,265', -'265,,,,265,,,,265,,,,,,,,,,265,,,,,,,265,265,265,265,265,265,265,265', -'265,265,265,265,265,265,265,265,265,265,265,265,265,265,265,265,265', -'265,265,265,265,265,265,265,265,265,295,,295,,,,,,,,,,,,,,,,,,,,,,,', -',,,,,,295,295,,,,295,,,,295,,,,,,,,,,295,,,,,,,295,295,295,295,295,295', -'295,295,295,295,295,295,295,295,295,295,295,295,295,295,295,295,295', -'295,295,295,295,295,295,295,295,295,295,295,299,,299,,,,,,,,,,,,,,,', -',,,,,,,,,,,,,,299,299,,,,299,,,,299,,,,,,,,,,299,,,,,,,299,299,299,299', -'299,299,299,299,299,299,299,299,299,299,299,299,299,299,299,299,299', -'299,299,299,299,299,299,299,299,299,299,299,299,299,298,,298,,,,,,,', -',,,,,,,,,,,,,,,,,,,,,,298,298,,,,298,,,,298,,,,,,,,,,298,,,,,,,298,298', +'274,224,,224,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,224,224,,,,224,,,,224,,,,', +',,,,,,,,,,,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224', +'224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224', +'224,224,224,298,,298,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,298,298,,,,298,,,', +'298,,,,,,,,,,,,,,,,298,298,298,298,298,298,298,298,298,298,298,298,298', '298,298,298,298,298,298,298,298,298,298,298,298,298,298,298,298,298', -'298,298,298,298,298,298,298,298,298,298,298,298,298,298,298,80,,80,', -',,,,,,,,,,,,,,,,,,,,,,,,,,,,80,80,,,,80,,,,80,,,,,,,,80,,80,,,,,,,80', -'80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80', -'80,80,80,80,80,80,80,80,80,80,266,,266,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', -'266,266,,,,266,,,,266,,,,,,,,,,266,,,,,,,266,266,266,266,266,266,266', +'298,298,298,298,298,295,,295,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,295,295,,', +',295,,,,295,,,,,,,,,,,,,,,,295,295,295,295,295,295,295,295,295,295,295', +'295,295,295,295,295,295,295,295,295,295,295,295,295,295,295,295,295', +'295,295,295,295,295,295,295,78,,78,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,78,78', +',,,78,,,,78,,,,,,,,78,,,,,,,,78,78,78,78,78,78,78,78,78,78,78,78,78', +'78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,81', +',81,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,81,81,,,,81,,,,81,,,,,,,,81,,,,,,,', +'81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81', +'81,81,81,81,81,81,81,81,81,81,81,81,265,,265,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,265,265,,,,265,,,,265,,,,,,,,,,,,,,,,265,265,265,265,265,265,265', +'265,265,265,265,265,265,265,265,265,265,265,265,265,265,265,265,265', +'265,265,265,265,265,265,265,265,265,265,265,266,,266,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,266,266,,,,266,,,,266,,,,,,,,,,,,,,,,266,266,266,266,266', '266,266,266,266,266,266,266,266,266,266,266,266,266,266,266,266,266', -'266,266,266,266,266,266,266,266,266,266,88,88,,,,,,,,88,,,,,,,,,,88', -',,,,,,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88', -'88,88,88,88,88,88,88,88,88,88,88,88,88,250,250,,,,,,,,250,,,,,,,,,,250', -',,,,,,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250', +'266,266,266,266,266,266,266,266,266,266,266,266,266,204,,204,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,204,204,,,,204,,,,204,,,,,,,,,,,,,,,,204,204,204', +'204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204', +'204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,299,,299', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,299,299,,,,299,,,,299,,,,,,,,,,,,,,,,299', +'299,299,299,299,299,299,299,299,299,299,299,299,299,299,299,299,299', +'299,299,299,299,299,299,299,299,299,299,299,299,299,299,299,299,299', +'87,87,,,,,,,,87,,,,,,,,,,,,,,,,87,87,87,87,87,87,87,87,87,87,87,87,87', +'87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,250', +'250,,,,,,,,250,,,,,,,,,,,,,,,,250,250,250,250,250,250,250,250,250,250', '250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250', -'250,228,228,,,,,,,,228,,,,,,,,,,228,,,,,,,228,228,228,228,228,228,228', -'228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228', -'228,228,228,228,228,228,228,113,113,,,,,,,,113,,,,,,,,,,113,,,,,,,113', -'113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113', -'113,113,113,113,113,113,113,113,113,113,113,113,113,225,225,,,,,,,,225', -',,,,,,,,,225,,,,,,,225,225,225,225,225,225,225,225,225,225,225,225,225', -'225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225', -'225,221,221,,,,,,,,221,,,,,,,,,,221,,,,,,,221,221,221,221,221,221,221', -'221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221', -'221,221,221,221,221,221,221,305,,,,,,,,305,,,,,,,,,,305,,,,,,,305,305', +'250,250,250,250,250,250,250,250,112,112,,,,,,,,112,,,,,,,,,,,,,,,,112', +'112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112', +'112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112', +'305,,,,,,,,305,,,,,,,,,,,,,,,,305,305,305,305,305,305,305,305,305,305', '305,305,305,305,305,305,305,305,305,305,305,305,305,305,305,305,305', -'305,305,305,305,305,305,305,305,305,305,305,305,304,,,,,,,,304,,,,,', -',,,,304,,,,,,,304,304,304,304,304,304,304,304,304,304,304,304,304,304', -'304,304,304,304,304,304,304,304,304,304,304,304,304,304,304,304,304', -'218,,,,,,,,218,,,,,,,,,,218,,,,,,,218,218,218,218,218,218,218,218,218', -'218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218', -'218,218,218,218,218,282,,,,,,,,282,,,,,,,,,,282,,,,,,,282,282,282,282', +'305,305,305,305,305,305,305,305,217,,,,,,,,217,,,,,,,,,,,,,,,,217,217', +'217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217', +'217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,282', +',,,,,,,282,,,,,,,,,,,,,,,,282,282,282,282,282,282,282,282,282,282,282', '282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282', -'282,282,282,282,282,282,282,282,282,282,281,,,,,,,,281,,,,,,,,,,281', -',,,,,,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281', -'281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,244,,,,', -',,,,,244,,,,,,,244,244,244,244,244,244,244,244,244,244,244,244,244,244', -'244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,86,', -',,,,,,,,86,,,,,,,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86', -'86,86,86,86,86,86,86,86,86,86,86,86,86,104,,,,,,,,,,104,,,,,,,104,104', -'104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104', -'104,104,104,104,104,104,104,104,104,104,104,237,,,,,,,237,237,237,237', -'237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237', -'237,237,237,237,237,237,237,237,237,240,,,,,,,240,240,240,240,240,240', -'240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240', -'240,240,240,240,240,240,240,213,,,,,,,213,213,213,213,213,213,213,213', +'282,282,282,282,282,282,282,304,,,,,,,,304,,,,,,,,,,,,,,,,304,304,304', +'304,304,304,304,304,304,304,304,304,304,304,304,304,304,304,304,304', +'304,304,304,304,304,304,304,304,304,304,304,304,304,304,304,281,,,,', +',,,281,,,,,,,,,,,,,,,,281,281,281,281,281,281,281,281,281,281,281,281', +'281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281', +'281,281,281,281,281,281,245,,,,,,,,,,,,,,,,245,245,245,245,245,245,245', +'245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245', +'245,245,245,245,245,245,245,245,245,245,245,86,,,,,,,,,,,,,,,,86,86', +'86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86', +'86,86,86,86,86,86,86,86,86,86,103,,,,,,,,,,,,,,,,103,103,103,103,103', +'103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103', +'103,103,103,103,103,103,103,103,103,103,103,103,103,246,246,246,246', +'246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246,246', +'246,246,246,246,246,246,246,246,246,246,246,246,246,246,213,213,213', '213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213', -'213,213,213,213,213,209,,,,,,,209,209,209,209,209,209,209,209,209,209', +'213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,228,228', +'228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228', +'228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,218', +'218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218', +'218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218', +'241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241', +'241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241', +'241,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225', +'225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225', +'225,225,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209', '209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209', -'209,209,209,245,,,,,,,245,245,245,245,245,245,245,245,245,245,245,245', -'245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245', -'245' ] - racc_action_check = arr = Array.new(9160, nil) +'209,209,209,221,221,221,221,221,221,221,221,221,221,221,221,221,221', +'221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221', +'221,221,221,221' ] + racc_action_check = arr = Array.new(9093, nil) idx = 0 clist.each do |str| str.split(',', -1).each do |i| @@ -709,68 +712,68 @@ def on_error(error_token_id, error_value, value_stack) end racc_action_pointer = [ - 4700, 340, nil, nil, 174, nil, 249, nil, nil, 324, + 4550, 275, nil, nil, 174, nil, 249, nil, nil, 324, nil, 399, 474, nil, nil, 549, nil, nil, nil, 624, - nil, -2, 774, nil, 849, 6008, nil, 324, nil, 235, - nil, nil, 1149, nil, 1224, 243, nil, 1374, nil, nil, - 1449, nil, nil, 202, nil, nil, 1599, nil, nil, nil, - nil, nil, 1674, 215, nil, nil, nil, nil, nil, 1824, - nil, nil, 219, nil, nil, nil, 152, 203, 6272, -22, - -2, 37, nil, 2424, nil, -38, -5, 185, 7376, 317, - 8020, 6548, 301, 242, 399, 474, 8838, 392, 8172, nil, - 3575, 3650, 229, 276, nil, 278, nil, nil, 210, nil, - 231, 236, nil, 53, 8885, 71, 4400, 7008, 4550, 451, - -2, 196, 64, 8349, 342, 64, nil, 5176, 260, 101, - nil, 5401, 5476, 5551, 351, 3500, 1524, 1299, 999, 277, - 699, 4175, 2975, 924, 4625, 5326, 5251, 5101, 5026, 4951, - 4876, 4801, 5626, nil, 4475, 4325, 4250, nil, 99, 4100, - 4025, 3950, 3875, 3800, 3725, 6074, 3425, 3350, 3275, 3200, - 3125, 3050, nil, nil, 6130, nil, 2900, nil, nil, 91, - nil, 219, 467, 120, 184, 232, nil, nil, 188, 74, - 7560, 7468, nil, nil, nil, 2825, 2750, 93, 114, nil, - 230, 2649, nil, nil, 2574, 7192, 108, -2, nil, 159, - 163, 102, nil, nil, 6180, 133, 2499, 2349, -17, 9033, - 6590, -7, 79, 8996, 6498, 408, 6824, -52, 8631, 4709, - 333, 8463, 6406, 258, 6640, 8406, 5720, 6092, 8292, 6126, - 6866, 6456, 2658, 5942, 6222, 5635, 167, 8922, 6774, -18, - 8959, nil, 6314, 376, 8791, 9070, 6682, 483, 2, 249, - 8232, nil, nil, nil, nil, -54, nil, -24, 150, 126, - nil, 2274, nil, -65, nil, 7652, 8112, nil, nil, 203, - nil, 2199, 2124, 6732, 6916, 2049, nil, 68, 89, nil, - nil, 8743, 8687, nil, 1974, 1899, 275, nil, nil, nil, - -2, 149, nil, nil, -50, 7744, 1749, nil, 7928, 7836, - 5933, 5768, nil, nil, 8575, 8519, nil, 245, 37, 1074, - 5867, 6364, 5676, nil, nil, nil, 7100, 7284, nil, nil, + nil, 5983, 774, nil, 6044, nil, 211, nil, 236, nil, + nil, 1074, nil, 1149, 225, nil, nil, nil, 1299, nil, + nil, 185, nil, nil, 1449, nil, nil, 1524, nil, nil, + nil, 1599, 220, nil, nil, nil, nil, nil, 1749, nil, + nil, 288, nil, nil, nil, 126, 337, 6159, -15, -2, + 2274, 222, nil, 2424, nil, 124, -5, 179, 7631, -17, + 6435, 7723, 343, 357, 324, 286, 8668, 8151, nil, 3500, + 3575, 110, 115, nil, 190, nil, nil, 121, nil, 128, + 111, nil, -46, 8719, 71, 4325, 6987, 4475, -2, 332, + 300, 254, 8271, 292, 146, nil, 5101, 198, 210, nil, + 5326, 5401, 5476, 33, 4801, 3425, 3050, 2750, 1374, 1224, + 924, 849, 699, 4175, 5551, 5251, 5176, 5026, 4951, nil, + 4876, 5626, 4726, nil, 4651, 4400, 4250, 99, 4100, 4025, + 3950, 3875, 3800, 3725, 3650, 5866, 3350, -9, 3275, 3200, + 3125, nil, nil, -2, nil, 2975, 355, nil, nil, 91, + nil, 111, 316, 221, 270, 55, nil, nil, -14, 74, + 6803, 6619, nil, nil, nil, 2900, 2825, 93, 114, nil, + 161, 2649, nil, nil, 2574, 6895, 219, -2, nil, 237, + 239, -22, nil, nil, 7999, 40, 2499, 2349, -17, 8964, + 5939, 783, 212, 8789, 6841, 708, 6711, 8389, 8859, 6289, + 483, 8999, 6933, 408, 7355, 8929, 6381, 333, 8824, 6749, + 558, 7079, 6657, 258, 75, 2658, 633, 318, 4559, 5720, + 77, 8894, 118, 5635, 235, 8617, 8754, 5752, 2, 249, + 8211, nil, nil, nil, nil, 87, nil, 96, 290, 112, + nil, 2199, nil, nil, -40, 7815, 7907, nil, nil, 203, + nil, 2124, 2049, 7171, 7263, 1974, nil, 65, 68, nil, + nil, 8566, 8448, nil, 1899, 1824, 2, nil, nil, nil, + -3, 149, nil, nil, -50, 7539, 1674, nil, 7447, 8091, + 5927, 5767, nil, nil, 8507, 8330, nil, 227, 230, 999, + 6110, 6527, 5675, nil, nil, nil, 6343, 6251, nil, nil, nil ] racc_action_default = [ -1, -183, -97, -10, -183, -106, -183, -98, -11, -183, -107, -183, -183, -26, -12, -183, -108, -27, -13, -183, - -109, -183, -183, -14, -183, -46, -15, -125, -28, -119, - -16, -29, -183, -31, -138, -183, -17, -183, -35, -18, - -183, -127, -36, -183, -34, -19, -183, -37, -20, -47, - -21, -38, -183, -183, -30, -22, -39, -32, -2, -183, - -23, -40, -3, -105, -104, -33, -183, -183, -5, -183, - -8, -176, -9, -183, -99, -101, -183, -48, -155, -49, - -183, -183, -53, -55, -183, -126, -56, -54, -45, -130, - -138, -183, -183, -183, -111, -183, -115, -116, -183, -44, - -183, -119, -120, -183, -57, -183, -183, -139, -138, -51, - -183, -183, -50, -152, -183, -183, -25, -7, -159, -183, - -4, -183, -183, -183, -183, -183, -183, -183, -183, -183, + -109, -183, -183, -14, -46, -15, -125, -28, -119, -16, + -29, -183, -31, -138, -183, -17, -35, -18, -183, -127, + -36, -183, -34, -19, -183, -37, -20, -183, -47, -21, + -38, -183, -183, -30, -22, -39, -32, -2, -183, -23, + -40, -3, -105, -104, -33, -183, -183, -5, -183, -8, + -183, -176, -9, -183, -99, -101, -183, -49, -155, -53, + -183, -183, -55, -54, -183, -126, -56, -45, -130, -138, + -183, -183, -183, -111, -183, -115, -116, -183, -44, -183, + -119, -120, -183, -57, -183, -183, -139, -138, -183, -183, + -51, -50, -152, -183, -183, -25, -7, -159, -183, -4, -183, -183, -183, -183, -183, -183, -183, -183, -183, -183, - -183, -183, -183, -59, -183, -183, -183, -58, -183, -183, + -183, -183, -183, -183, -183, -183, -183, -183, -183, -59, + -183, -183, -183, -58, -183, -183, -183, -183, -183, -183, -183, -183, -183, -183, -183, -94, -183, -183, -183, -183, - -183, -183, -96, -129, -183, -110, -183, -178, -180, -183, - -174, -176, -52, -183, -183, -183, -154, -172, -183, -183, + -183, -96, -129, -183, -110, -183, -52, -178, -180, -183, + -174, -176, -48, -183, -183, -183, -154, -172, -183, -183, -139, -183, -112, -113, -114, -183, -183, -183, -183, -118, -183, -183, -137, -145, -183, -140, -183, -183, -153, -148, - -183, -183, 321, -24, -6, -183, -183, -183, -183, -87, - -75, -64, -183, -88, -76, -65, -181, -183, -93, -77, - -66, -89, -78, -67, -182, -90, -79, -68, -91, -80, - -69, -156, -81, -70, -82, -71, -60, -84, -72, -61, - -85, -83, -73, -62, -92, -86, -74, -63, -128, -183, + -183, -183, 321, -24, -6, -183, -183, -183, -183, -86, + -74, -63, -183, -87, -75, -64, -181, -93, -88, -76, + -65, -89, -77, -66, -182, -90, -78, -67, -91, -79, + -68, -156, -80, -69, -60, -81, -70, -61, -82, -71, + -62, -84, -83, -72, -183, -92, -85, -73, -128, -183, -41, -177, -173, -179, -175, -183, -100, -183, -183, -183, - -167, -183, -131, -183, -117, -42, -43, -124, -121, -183, + -167, -183, -131, -117, -183, -42, -43, -124, -121, -183, -122, -183, -183, -141, -142, -183, -132, -183, -183, -149, -160, -161, -162, -158, -183, -183, -157, -103, -102, -95, -183, -183, -168, -165, -183, -146, -183, -123, -143, -144, @@ -779,85 +782,85 @@ def on_error(error_token_id, error_value, value_stack) -136 ] racc_goto_table = [ - 58, 74, 260, 208, 67, 167, 165, 163, 77, 170, - 78, 62, 268, 79, 270, 80, 81, 99, 105, 82, - 165, 163, 119, 83, 84, 85, 86, 103, 87, 88, - 53, 294, 259, 199, 252, 257, 104, 171, 107, 76, - 168, 109, nil, nil, 110, nil, nil, 111, nil, nil, - 112, nil, nil, nil, nil, nil, 113, nil, nil, nil, - nil, nil, 117, nil, nil, nil, nil, 120, nil, nil, - 115, nil, nil, 162, 179, nil, nil, 172, nil, nil, - 212, nil, 176, 292, 177, nil, nil, nil, nil, 99, - nil, nil, 197, 297, 180, 181, 286, nil, nil, 187, - nil, nil, nil, 190, nil, 253, nil, nil, nil, 254, - 195, nil, 180, nil, 306, 117, nil, nil, nil, nil, - nil, 204, nil, nil, nil, 209, 210, 211, nil, 213, - 214, 215, 216, nil, 218, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, nil, 231, 232, - 233, nil, 234, 235, 236, 237, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 258, 248, 249, nil, - 250, nil, nil, 251, 256, nil, 99, nil, 99, nil, - nil, nil, nil, nil, 165, 163, nil, 190, 269, 265, + 57, 74, 164, 167, 66, 162, 260, 170, 77, 104, + 78, 208, 61, 79, 102, 80, 81, 164, 98, 82, + 162, 118, 52, 83, 84, 85, 86, 268, 87, 270, + 294, 259, 199, 252, 257, 103, 171, 106, 76, 168, + nil, nil, 108, nil, nil, 109, nil, nil, 110, nil, + nil, 111, nil, nil, nil, 112, nil, nil, nil, nil, + nil, 116, nil, nil, nil, 179, 119, nil, nil, nil, + 114, nil, 161, nil, 166, nil, nil, 172, nil, 212, + nil, nil, 176, 197, 177, nil, 187, 292, nil, nil, + 98, nil, nil, 180, 181, nil, nil, nil, nil, nil, + nil, nil, 190, 253, nil, 286, nil, 254, 297, 195, + nil, 180, nil, nil, 116, nil, nil, nil, 306, nil, + 204, nil, nil, nil, 209, 210, 211, nil, 213, 214, + 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, nil, 228, 229, 230, nil, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, nil, 245, 246, 247, nil, 248, 249, 258, 250, + nil, nil, nil, 251, 256, nil, nil, nil, 98, nil, + 98, 164, nil, nil, 162, nil, nil, 190, 269, 265, 266, 271, nil, nil, nil, 273, nil, nil, 274, nil, nil, nil, nil, nil, nil, 279, nil, nil, nil, nil, 281, 282, 283, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, - nil, nil, nil, nil, nil, nil, nil, 258, nil, nil, - nil, nil, nil, nil, nil, nil, nil, 99, 290, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 258, + nil, nil, nil, nil, nil, nil, nil, nil, 290, 98, nil, 289, nil, nil, nil, 295, nil, nil, nil, nil, - nil, nil, nil, nil, nil, 298, 299, nil, 258, 301, - nil, 302, 303, nil, nil, nil, nil, nil, 304, 305, + nil, nil, nil, nil, nil, 298, 299, nil, nil, 301, + 258, 302, 303, nil, nil, nil, nil, nil, 304, 305, nil, nil, nil, nil, nil, 307, nil, nil, 308, nil, 311, nil, nil, nil, 312, nil, nil, nil, 315, nil, nil, nil, nil, 316, 317 ] racc_goto_check = [ - 2, 26, 44, 42, 4, 48, 31, 37, 5, 46, - 5, 3, 23, 5, 23, 5, 5, 21, 38, 5, - 31, 37, 41, 5, 6, 32, 5, 35, 5, 5, - 1, 39, 43, 40, 45, 25, 5, 47, 5, 24, - 49, 5, nil, nil, 5, nil, nil, 4, nil, nil, - 5, nil, nil, nil, nil, nil, 5, nil, nil, nil, - nil, nil, 2, nil, nil, nil, nil, 2, nil, nil, - 3, nil, nil, 4, 38, nil, nil, 5, nil, nil, - 41, nil, 4, 44, 4, nil, nil, nil, nil, 21, - nil, nil, 38, 23, 5, 5, 42, nil, nil, 35, - nil, nil, nil, 2, nil, 48, nil, nil, nil, 46, - 5, nil, 5, nil, 44, 2, nil, nil, nil, nil, - nil, 5, nil, nil, nil, 5, 5, 5, nil, 5, - 5, 5, 5, nil, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, nil, 5, 5, - 5, nil, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 21, 6, 32, nil, - 5, nil, nil, 4, 26, nil, 21, nil, 21, nil, - nil, nil, nil, nil, 31, 37, nil, 2, 2, 5, + 2, 26, 31, 48, 4, 37, 44, 46, 5, 38, + 5, 42, 3, 5, 35, 5, 5, 31, 21, 5, + 37, 41, 1, 5, 6, 32, 5, 23, 5, 23, + 39, 43, 40, 45, 25, 5, 47, 5, 24, 49, + nil, nil, 5, nil, nil, 4, nil, nil, 5, nil, + nil, 5, nil, nil, nil, 5, nil, nil, nil, nil, + nil, 2, nil, nil, nil, 38, 2, nil, nil, nil, + 3, nil, 4, nil, 5, nil, nil, 5, nil, 41, + nil, nil, 4, 38, 4, nil, 35, 44, nil, nil, + 21, nil, nil, 5, 5, nil, nil, nil, nil, nil, + nil, nil, 2, 48, nil, 42, nil, 46, 23, 5, + nil, 5, nil, nil, 2, nil, nil, nil, 44, nil, + 5, nil, nil, nil, 5, 5, 5, nil, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, nil, 5, 5, 5, nil, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, nil, 5, 5, 5, nil, 6, 32, 21, 5, + nil, nil, nil, 4, 26, nil, nil, nil, 21, nil, + 21, 31, nil, nil, 37, nil, nil, 2, 2, 5, 5, 2, nil, nil, nil, 5, nil, nil, 5, nil, nil, nil, nil, nil, nil, 4, nil, nil, nil, nil, 5, 5, 4, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, - nil, nil, nil, nil, nil, nil, nil, 21, nil, nil, - nil, nil, nil, nil, nil, nil, nil, 21, 2, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 21, + nil, nil, nil, nil, nil, nil, nil, nil, 2, 21, nil, 4, nil, nil, nil, 5, nil, nil, nil, nil, - nil, nil, nil, nil, nil, 5, 5, nil, 21, 5, - nil, 4, 4, nil, nil, nil, nil, nil, 5, 5, + nil, nil, nil, nil, nil, 5, 5, nil, nil, 5, + 21, 4, 4, nil, nil, nil, nil, nil, 5, 5, nil, nil, nil, nil, nil, 4, nil, nil, 4, nil, 5, nil, nil, nil, 5, nil, nil, nil, 2, nil, nil, nil, nil, 5, 5 ] racc_goto_pointer = [ - nil, 30, 0, 11, 4, 4, 3, nil, nil, nil, + nil, 22, 0, 12, 4, 4, 3, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, - nil, -12, nil, -176, 38, -140, 0, nil, nil, nil, - nil, -64, 4, nil, nil, -2, nil, -63, -16, -230, - -78, -44, -116, -146, -176, -135, -62, -34, -66, -31 ] + nil, -10, nil, -161, 37, -141, 0, nil, nil, nil, + nil, -67, 4, nil, nil, -14, nil, -64, -24, -231, + -77, -44, -107, -147, -172, -136, -64, -35, -68, -32 ] racc_goto_default = [ - nil, nil, 194, nil, nil, 68, 70, 72, 3, 8, - 14, 18, 23, 26, 30, 36, 39, 45, 48, 50, - 55, 60, 63, 102, nil, 69, nil, 5, 10, 16, - 20, 94, 27, 96, 97, nil, 41, 89, nil, nil, + nil, nil, 194, nil, nil, 67, 69, 72, 3, 8, + 14, 18, 23, 25, 29, 35, 37, 43, 46, 49, + 54, 59, 62, 101, nil, 68, nil, 5, 10, 16, + 20, 93, 26, 95, 96, nil, 39, 88, nil, nil, nil, nil, nil, nil, nil, 71, nil, nil, nil, nil ] racc_reduce_table = [ @@ -1103,44 +1106,44 @@ def on_error(error_token_id, error_value, value_stack) :JS => 50, :INDENT => 51, :OUTDENT => 52, - "?" => 53, - :UMINUS => 54, - :UPLUS => 55, - :NOT => 56, - "!" => 57, - "!!" => 58, - "~" => 59, - "++" => 60, - "--" => 61, - "*" => 62, - "/" => 63, - "%" => 64, - "+" => 65, - "-" => 66, - "<<" => 67, - ">>" => 68, - ">>>" => 69, - "&" => 70, - "|" => 71, - "^" => 72, - "<=" => 73, - "<" => 74, - ">" => 75, - ">=" => 76, - "==" => 77, - "!=" => 78, - :IS => 79, - :ISNT => 80, - "&&" => 81, - "||" => 82, - :AND => 83, - :OR => 84, - "-=" => 85, - "+=" => 86, - "/=" => 87, - "*=" => 88, - "%=" => 89, - "." => 90, + :UMINUS => 53, + :UPLUS => 54, + :NOT => 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, + :IS => 80, + :ISNT => 81, + "&&" => 82, + "||" => 83, + :AND => 84, + :OR => 85, + "-=" => 86, + "+=" => 87, + "/=" => 88, + "*=" => 89, + "%=" => 90, "||=" => 91, "&&=" => 92, "?=" => 93, @@ -1231,7 +1234,6 @@ def on_error(error_token_id, error_value, value_stack) "JS", "INDENT", "OUTDENT", - "\"?\"", "UMINUS", "UPLUS", "NOT", @@ -1243,6 +1245,8 @@ def on_error(error_token_id, error_value, value_stack) "\"*\"", "\"/\"", "\"%\"", + "\"?\"", + "\".\"", "\"+\"", "\"-\"", "\"<<\"", @@ -1268,7 +1272,6 @@ def on_error(error_token_id, error_value, value_stack) "\"/=\"", "\"*=\"", "\"%=\"", - "\".\"", "\"||=\"", "\"&&=\"", "\"?=\"", @@ -1341,49 +1344,49 @@ def on_error(error_token_id, error_value, value_stack) # reduce 0 omitted -module_eval(<<'.,.,', 'grammar.y', 49) +module_eval(<<'.,.,', 'grammar.y', 45) def _reduce_1(val, _values, result) result = Expressions.new result end .,., -module_eval(<<'.,.,', 'grammar.y', 50) +module_eval(<<'.,.,', 'grammar.y', 46) def _reduce_2(val, _values, result) result = Expressions.new result end .,., -module_eval(<<'.,.,', 'grammar.y', 51) +module_eval(<<'.,.,', 'grammar.y', 47) def _reduce_3(val, _values, result) result = val[0] result end .,., -module_eval(<<'.,.,', 'grammar.y', 52) +module_eval(<<'.,.,', 'grammar.y', 48) def _reduce_4(val, _values, result) result = val[0] result end .,., -module_eval(<<'.,.,', 'grammar.y', 57) +module_eval(<<'.,.,', 'grammar.y', 53) def _reduce_5(val, _values, result) result = Expressions.wrap(val) result end .,., -module_eval(<<'.,.,', 'grammar.y', 58) +module_eval(<<'.,.,', 'grammar.y', 54) def _reduce_6(val, _values, result) result = val[0] << val[2] result end .,., -module_eval(<<'.,.,', 'grammar.y', 59) +module_eval(<<'.,.,', 'grammar.y', 55) def _reduce_7(val, _values, result) result = val[0] result @@ -1422,14 +1425,14 @@ def _reduce_7(val, _values, result) # reduce 23 omitted -module_eval(<<'.,.,', 'grammar.y', 86) +module_eval(<<'.,.,', 'grammar.y', 82) def _reduce_24(val, _values, result) result = val[1] result end .,., -module_eval(<<'.,.,', 'grammar.y', 87) +module_eval(<<'.,.,', 'grammar.y', 83) def _reduce_25(val, _values, result) result = Expressions.new result @@ -1440,511 +1443,511 @@ def _reduce_25(val, _values, result) # reduce 27 omitted -module_eval(<<'.,.,', 'grammar.y', 98) +module_eval(<<'.,.,', 'grammar.y', 94) def _reduce_28(val, _values, result) result = LiteralNode.new(val[0]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 99) +module_eval(<<'.,.,', 'grammar.y', 95) def _reduce_29(val, _values, result) result = LiteralNode.new(val[0]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 100) +module_eval(<<'.,.,', 'grammar.y', 96) def _reduce_30(val, _values, result) result = LiteralNode.new(val[0]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 101) +module_eval(<<'.,.,', 'grammar.y', 97) def _reduce_31(val, _values, result) result = LiteralNode.new(val[0]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 102) +module_eval(<<'.,.,', 'grammar.y', 98) def _reduce_32(val, _values, result) result = LiteralNode.new(val[0]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 103) +module_eval(<<'.,.,', 'grammar.y', 99) def _reduce_33(val, _values, result) result = LiteralNode.new(val[0]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 104) +module_eval(<<'.,.,', 'grammar.y', 100) def _reduce_34(val, _values, result) result = LiteralNode.new(val[0]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 105) +module_eval(<<'.,.,', 'grammar.y', 101) def _reduce_35(val, _values, result) result = LiteralNode.new(Value.new(true)) result end .,., -module_eval(<<'.,.,', 'grammar.y', 106) +module_eval(<<'.,.,', 'grammar.y', 102) def _reduce_36(val, _values, result) result = LiteralNode.new(Value.new(false)) result end .,., -module_eval(<<'.,.,', 'grammar.y', 107) +module_eval(<<'.,.,', 'grammar.y', 103) def _reduce_37(val, _values, result) result = LiteralNode.new(Value.new(true)) result end .,., -module_eval(<<'.,.,', 'grammar.y', 108) +module_eval(<<'.,.,', 'grammar.y', 104) def _reduce_38(val, _values, result) result = LiteralNode.new(Value.new(false)) result end .,., -module_eval(<<'.,.,', 'grammar.y', 109) +module_eval(<<'.,.,', 'grammar.y', 105) def _reduce_39(val, _values, result) result = LiteralNode.new(Value.new(true)) result end .,., -module_eval(<<'.,.,', 'grammar.y', 110) +module_eval(<<'.,.,', 'grammar.y', 106) def _reduce_40(val, _values, result) result = LiteralNode.new(Value.new(false)) result end .,., -module_eval(<<'.,.,', 'grammar.y', 115) +module_eval(<<'.,.,', 'grammar.y', 111) def _reduce_41(val, _values, result) result = AssignNode.new(val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 120) +module_eval(<<'.,.,', 'grammar.y', 116) def _reduce_42(val, _values, result) result = AssignNode.new(ValueNode.new(val[0]), val[2], :object) result end .,., -module_eval(<<'.,.,', 'grammar.y', 121) +module_eval(<<'.,.,', 'grammar.y', 117) def _reduce_43(val, _values, result) result = AssignNode.new(ValueNode.new(LiteralNode.new(val[0])), val[2], :object) result end .,., -module_eval(<<'.,.,', 'grammar.y', 122) +module_eval(<<'.,.,', 'grammar.y', 118) def _reduce_44(val, _values, result) result = val[0] result end .,., -module_eval(<<'.,.,', 'grammar.y', 127) +module_eval(<<'.,.,', 'grammar.y', 123) def _reduce_45(val, _values, result) result = ReturnNode.new(val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 128) +module_eval(<<'.,.,', 'grammar.y', 124) def _reduce_46(val, _values, result) result = ReturnNode.new(ValueNode.new(Value.new('null'))) result end .,., -module_eval(<<'.,.,', 'grammar.y', 133) +module_eval(<<'.,.,', 'grammar.y', 129) def _reduce_47(val, _values, result) result = CommentNode.new(val[0]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 140) +module_eval(<<'.,.,', 'grammar.y', 136) def _reduce_48(val, _values, result) result = OpNode.new(val[0], val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 141) +module_eval(<<'.,.,', 'grammar.y', 137) def _reduce_49(val, _values, result) result = OpNode.new(val[0], val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 142) +module_eval(<<'.,.,', 'grammar.y', 138) def _reduce_50(val, _values, result) result = OpNode.new(val[0], val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 143) +module_eval(<<'.,.,', 'grammar.y', 139) def _reduce_51(val, _values, result) result = OpNode.new(val[0], val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 144) +module_eval(<<'.,.,', 'grammar.y', 140) def _reduce_52(val, _values, result) result = OpNode.new(val[0], val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 145) +module_eval(<<'.,.,', 'grammar.y', 141) def _reduce_53(val, _values, result) result = OpNode.new(val[0], val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 146) +module_eval(<<'.,.,', 'grammar.y', 142) def _reduce_54(val, _values, result) result = OpNode.new(val[0], val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 147) +module_eval(<<'.,.,', 'grammar.y', 143) def _reduce_55(val, _values, result) result = OpNode.new(val[0], val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 148) +module_eval(<<'.,.,', 'grammar.y', 144) def _reduce_56(val, _values, result) result = OpNode.new(val[0], val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 149) +module_eval(<<'.,.,', 'grammar.y', 145) def _reduce_57(val, _values, result) result = OpNode.new(val[0], val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 150) +module_eval(<<'.,.,', 'grammar.y', 146) def _reduce_58(val, _values, result) result = OpNode.new(val[1], val[0], nil, true) result end .,., -module_eval(<<'.,.,', 'grammar.y', 151) +module_eval(<<'.,.,', 'grammar.y', 147) def _reduce_59(val, _values, result) result = OpNode.new(val[1], val[0], nil, true) result end .,., -module_eval(<<'.,.,', 'grammar.y', 153) +module_eval(<<'.,.,', 'grammar.y', 149) def _reduce_60(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 154) +module_eval(<<'.,.,', 'grammar.y', 150) def _reduce_61(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 155) +module_eval(<<'.,.,', 'grammar.y', 151) def _reduce_62(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 157) +module_eval(<<'.,.,', 'grammar.y', 153) def _reduce_63(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 158) +module_eval(<<'.,.,', 'grammar.y', 154) def _reduce_64(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 160) +module_eval(<<'.,.,', 'grammar.y', 156) def _reduce_65(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 161) +module_eval(<<'.,.,', 'grammar.y', 157) def _reduce_66(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 162) +module_eval(<<'.,.,', 'grammar.y', 158) def _reduce_67(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 164) +module_eval(<<'.,.,', 'grammar.y', 160) def _reduce_68(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 165) +module_eval(<<'.,.,', 'grammar.y', 161) def _reduce_69(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 166) +module_eval(<<'.,.,', 'grammar.y', 162) def _reduce_70(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 168) +module_eval(<<'.,.,', 'grammar.y', 164) def _reduce_71(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 169) +module_eval(<<'.,.,', 'grammar.y', 165) def _reduce_72(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 170) +module_eval(<<'.,.,', 'grammar.y', 166) def _reduce_73(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 171) +module_eval(<<'.,.,', 'grammar.y', 167) def _reduce_74(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 173) +module_eval(<<'.,.,', 'grammar.y', 169) def _reduce_75(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 174) +module_eval(<<'.,.,', 'grammar.y', 170) def _reduce_76(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 175) +module_eval(<<'.,.,', 'grammar.y', 171) def _reduce_77(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 176) +module_eval(<<'.,.,', 'grammar.y', 172) def _reduce_78(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 178) +module_eval(<<'.,.,', 'grammar.y', 174) def _reduce_79(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 179) +module_eval(<<'.,.,', 'grammar.y', 175) def _reduce_80(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 180) +module_eval(<<'.,.,', 'grammar.y', 176) def _reduce_81(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 181) +module_eval(<<'.,.,', 'grammar.y', 177) def _reduce_82(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 182) +module_eval(<<'.,.,', 'grammar.y', 178) def _reduce_83(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 184) +module_eval(<<'.,.,', 'grammar.y', 180) def _reduce_84(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 185) +module_eval(<<'.,.,', 'grammar.y', 181) def _reduce_85(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 186) +module_eval(<<'.,.,', 'grammar.y', 182) def _reduce_86(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 187) +module_eval(<<'.,.,', 'grammar.y', 183) def _reduce_87(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 188) +module_eval(<<'.,.,', 'grammar.y', 184) def _reduce_88(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 189) +module_eval(<<'.,.,', 'grammar.y', 185) def _reduce_89(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 190) +module_eval(<<'.,.,', 'grammar.y', 186) def _reduce_90(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 191) +module_eval(<<'.,.,', 'grammar.y', 187) def _reduce_91(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 193) +module_eval(<<'.,.,', 'grammar.y', 189) def _reduce_92(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 194) +module_eval(<<'.,.,', 'grammar.y', 190) def _reduce_93(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 199) +module_eval(<<'.,.,', 'grammar.y', 195) def _reduce_94(val, _values, result) result = ExistenceNode.new(val[0]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 205) +module_eval(<<'.,.,', 'grammar.y', 201) def _reduce_95(val, _values, result) result = CodeNode.new(val[1], val[4], val[3]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 206) +module_eval(<<'.,.,', 'grammar.y', 202) def _reduce_96(val, _values, result) result = CodeNode.new([], val[1], val[0]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 211) +module_eval(<<'.,.,', 'grammar.y', 207) def _reduce_97(val, _values, result) result = :func result end .,., -module_eval(<<'.,.,', 'grammar.y', 212) +module_eval(<<'.,.,', 'grammar.y', 208) def _reduce_98(val, _values, result) result = :boundfunc result end .,., -module_eval(<<'.,.,', 'grammar.y', 217) +module_eval(<<'.,.,', 'grammar.y', 213) def _reduce_99(val, _values, result) result = val result end .,., -module_eval(<<'.,.,', 'grammar.y', 218) +module_eval(<<'.,.,', 'grammar.y', 214) def _reduce_100(val, _values, result) result = val[0] << val[2] result @@ -1953,567 +1956,567 @@ def _reduce_100(val, _values, result) # reduce 101 omitted -module_eval(<<'.,.,', 'grammar.y', 224) +module_eval(<<'.,.,', 'grammar.y', 220) def _reduce_102(val, _values, result) result = SplatNode.new(val[0]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 229) +module_eval(<<'.,.,', 'grammar.y', 225) def _reduce_103(val, _values, result) result = SplatNode.new(val[0]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 234) +module_eval(<<'.,.,', 'grammar.y', 230) def _reduce_104(val, _values, result) result = ValueNode.new(val[0]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 235) +module_eval(<<'.,.,', 'grammar.y', 231) def _reduce_105(val, _values, result) result = ValueNode.new(val[0]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 236) +module_eval(<<'.,.,', 'grammar.y', 232) def _reduce_106(val, _values, result) result = ValueNode.new(val[0]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 237) +module_eval(<<'.,.,', 'grammar.y', 233) def _reduce_107(val, _values, result) result = ValueNode.new(val[0]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 238) +module_eval(<<'.,.,', 'grammar.y', 234) def _reduce_108(val, _values, result) result = ValueNode.new(val[0]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 239) +module_eval(<<'.,.,', 'grammar.y', 235) def _reduce_109(val, _values, result) result = ValueNode.new(val[0]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 240) +module_eval(<<'.,.,', 'grammar.y', 236) def _reduce_110(val, _values, result) result = val[0] << val[1] result end .,., -module_eval(<<'.,.,', 'grammar.y', 241) +module_eval(<<'.,.,', 'grammar.y', 237) def _reduce_111(val, _values, result) result = ValueNode.new(val[0], [val[1]]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 246) +module_eval(<<'.,.,', 'grammar.y', 242) def _reduce_112(val, _values, result) result = AccessorNode.new(val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 247) +module_eval(<<'.,.,', 'grammar.y', 243) def _reduce_113(val, _values, result) result = AccessorNode.new(val[1], :prototype) result end .,., -module_eval(<<'.,.,', 'grammar.y', 248) +module_eval(<<'.,.,', 'grammar.y', 244) def _reduce_114(val, _values, result) result = AccessorNode.new(val[1], :soak) result end .,., -module_eval(<<'.,.,', 'grammar.y', 249) +module_eval(<<'.,.,', 'grammar.y', 245) def _reduce_115(val, _values, result) result = val[0] result end .,., -module_eval(<<'.,.,', 'grammar.y', 250) +module_eval(<<'.,.,', 'grammar.y', 246) def _reduce_116(val, _values, result) result = SliceNode.new(val[0]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 255) +module_eval(<<'.,.,', 'grammar.y', 251) def _reduce_117(val, _values, result) result = IndexNode.new(val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 260) +module_eval(<<'.,.,', 'grammar.y', 256) def _reduce_118(val, _values, result) result = ObjectNode.new(val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 265) +module_eval(<<'.,.,', 'grammar.y', 261) def _reduce_119(val, _values, result) result = [] result end .,., -module_eval(<<'.,.,', 'grammar.y', 266) +module_eval(<<'.,.,', 'grammar.y', 262) def _reduce_120(val, _values, result) result = val result end .,., -module_eval(<<'.,.,', 'grammar.y', 267) +module_eval(<<'.,.,', 'grammar.y', 263) def _reduce_121(val, _values, result) result = val[0] << val[2] result end .,., -module_eval(<<'.,.,', 'grammar.y', 268) +module_eval(<<'.,.,', 'grammar.y', 264) def _reduce_122(val, _values, result) result = val[0] << val[2] result end .,., -module_eval(<<'.,.,', 'grammar.y', 270) +module_eval(<<'.,.,', 'grammar.y', 266) def _reduce_123(val, _values, result) result = val[0] << val[3] result end .,., -module_eval(<<'.,.,', 'grammar.y', 271) +module_eval(<<'.,.,', 'grammar.y', 267) def _reduce_124(val, _values, result) result = val[1] result end .,., -module_eval(<<'.,.,', 'grammar.y', 276) +module_eval(<<'.,.,', 'grammar.y', 272) def _reduce_125(val, _values, result) result = val[0] result end .,., -module_eval(<<'.,.,', 'grammar.y', 277) +module_eval(<<'.,.,', 'grammar.y', 273) def _reduce_126(val, _values, result) result = val[1].new_instance result end .,., -module_eval(<<'.,.,', 'grammar.y', 278) +module_eval(<<'.,.,', 'grammar.y', 274) def _reduce_127(val, _values, result) result = val[0] result end .,., -module_eval(<<'.,.,', 'grammar.y', 283) +module_eval(<<'.,.,', 'grammar.y', 279) def _reduce_128(val, _values, result) result = ExtendsNode.new(val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 288) +module_eval(<<'.,.,', 'grammar.y', 284) def _reduce_129(val, _values, result) result = CallNode.new(val[0], val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 289) +module_eval(<<'.,.,', 'grammar.y', 285) def _reduce_130(val, _values, result) result = CallNode.new(val[0], val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 294) +module_eval(<<'.,.,', 'grammar.y', 290) def _reduce_131(val, _values, result) result = val[1] result end .,., -module_eval(<<'.,.,', 'grammar.y', 299) +module_eval(<<'.,.,', 'grammar.y', 295) def _reduce_132(val, _values, result) result = CallNode.new(Value.new('super'), val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 305) +module_eval(<<'.,.,', 'grammar.y', 301) def _reduce_133(val, _values, result) result = RangeNode.new(val[1], val[4]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 307) +module_eval(<<'.,.,', 'grammar.y', 303) def _reduce_134(val, _values, result) result = RangeNode.new(val[1], val[5], true) result end .,., -module_eval(<<'.,.,', 'grammar.y', 313) +module_eval(<<'.,.,', 'grammar.y', 309) def _reduce_135(val, _values, result) result = RangeNode.new(val[1], val[4]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 315) +module_eval(<<'.,.,', 'grammar.y', 311) def _reduce_136(val, _values, result) result = RangeNode.new(val[1], val[5], true) result end .,., -module_eval(<<'.,.,', 'grammar.y', 320) +module_eval(<<'.,.,', 'grammar.y', 316) def _reduce_137(val, _values, result) result = ArrayNode.new(val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 325) +module_eval(<<'.,.,', 'grammar.y', 321) def _reduce_138(val, _values, result) result = [] result end .,., -module_eval(<<'.,.,', 'grammar.y', 326) +module_eval(<<'.,.,', 'grammar.y', 322) def _reduce_139(val, _values, result) result = val result end .,., -module_eval(<<'.,.,', 'grammar.y', 327) +module_eval(<<'.,.,', 'grammar.y', 323) def _reduce_140(val, _values, result) result = [val[1]] result end .,., -module_eval(<<'.,.,', 'grammar.y', 328) +module_eval(<<'.,.,', 'grammar.y', 324) def _reduce_141(val, _values, result) result = val[0] << val[2] result end .,., -module_eval(<<'.,.,', 'grammar.y', 329) +module_eval(<<'.,.,', 'grammar.y', 325) def _reduce_142(val, _values, result) result = val[0] << val[2] result end .,., -module_eval(<<'.,.,', 'grammar.y', 330) +module_eval(<<'.,.,', 'grammar.y', 326) def _reduce_143(val, _values, result) result = val[0] << val[3] result end .,., -module_eval(<<'.,.,', 'grammar.y', 331) +module_eval(<<'.,.,', 'grammar.y', 327) def _reduce_144(val, _values, result) result = val[0] << val[3] result end .,., -module_eval(<<'.,.,', 'grammar.y', 332) +module_eval(<<'.,.,', 'grammar.y', 328) def _reduce_145(val, _values, result) result = val[0] result end .,., -module_eval(<<'.,.,', 'grammar.y', 337) +module_eval(<<'.,.,', 'grammar.y', 333) def _reduce_146(val, _values, result) result = val[0] result end .,., -module_eval(<<'.,.,', 'grammar.y', 338) +module_eval(<<'.,.,', 'grammar.y', 334) def _reduce_147(val, _values, result) result = ([val[0]] << val[2]).flatten result end .,., -module_eval(<<'.,.,', 'grammar.y', 343) +module_eval(<<'.,.,', 'grammar.y', 339) def _reduce_148(val, _values, result) result = TryNode.new(val[1], val[2][0], val[2][1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 344) +module_eval(<<'.,.,', 'grammar.y', 340) def _reduce_149(val, _values, result) result = TryNode.new(val[1], nil, nil, val[3]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 346) +module_eval(<<'.,.,', 'grammar.y', 342) def _reduce_150(val, _values, result) result = TryNode.new(val[1], val[2][0], val[2][1], val[4]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 351) +module_eval(<<'.,.,', 'grammar.y', 347) def _reduce_151(val, _values, result) result = [val[1], val[2]] result end .,., -module_eval(<<'.,.,', 'grammar.y', 356) +module_eval(<<'.,.,', 'grammar.y', 352) def _reduce_152(val, _values, result) result = ThrowNode.new(val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 361) +module_eval(<<'.,.,', 'grammar.y', 357) def _reduce_153(val, _values, result) result = ParentheticalNode.new(val[1], val[0].line) result end .,., -module_eval(<<'.,.,', 'grammar.y', 366) +module_eval(<<'.,.,', 'grammar.y', 362) def _reduce_154(val, _values, result) result = WhileNode.new(val[1], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 367) +module_eval(<<'.,.,', 'grammar.y', 363) def _reduce_155(val, _values, result) result = WhileNode.new(val[1], nil) result end .,., -module_eval(<<'.,.,', 'grammar.y', 368) +module_eval(<<'.,.,', 'grammar.y', 364) def _reduce_156(val, _values, result) result = WhileNode.new(val[2], Expressions.wrap(val[0])) result end .,., -module_eval(<<'.,.,', 'grammar.y', 375) +module_eval(<<'.,.,', 'grammar.y', 371) def _reduce_157(val, _values, result) result = ForNode.new(val[0], val[3], val[2][0], val[2][1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 376) +module_eval(<<'.,.,', 'grammar.y', 372) def _reduce_158(val, _values, result) result = ForNode.new(val[3], val[2], val[1][0], val[1][1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 381) +module_eval(<<'.,.,', 'grammar.y', 377) def _reduce_159(val, _values, result) result = val result end .,., -module_eval(<<'.,.,', 'grammar.y', 382) +module_eval(<<'.,.,', 'grammar.y', 378) def _reduce_160(val, _values, result) result = [val[0], val[2]] result end .,., -module_eval(<<'.,.,', 'grammar.y', 387) +module_eval(<<'.,.,', 'grammar.y', 383) def _reduce_161(val, _values, result) result = {:source => val[1]} result end .,., -module_eval(<<'.,.,', 'grammar.y', 388) +module_eval(<<'.,.,', 'grammar.y', 384) def _reduce_162(val, _values, result) result = {:source => val[1], :object => true} result end .,., -module_eval(<<'.,.,', 'grammar.y', 390) +module_eval(<<'.,.,', 'grammar.y', 386) def _reduce_163(val, _values, result) result = val[0].merge(:filter => val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 392) +module_eval(<<'.,.,', 'grammar.y', 388) def _reduce_164(val, _values, result) result = val[0].merge(:step => val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 398) +module_eval(<<'.,.,', 'grammar.y', 394) def _reduce_165(val, _values, result) result = val[3].rewrite_condition(val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 400) +module_eval(<<'.,.,', 'grammar.y', 396) def _reduce_166(val, _values, result) result = val[3].rewrite_condition(val[1]).add_else(val[5]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 405) +module_eval(<<'.,.,', 'grammar.y', 401) def _reduce_167(val, _values, result) result = val[0] result end .,., -module_eval(<<'.,.,', 'grammar.y', 406) +module_eval(<<'.,.,', 'grammar.y', 402) def _reduce_168(val, _values, result) result = val[0] << val[1] result end .,., -module_eval(<<'.,.,', 'grammar.y', 411) +module_eval(<<'.,.,', 'grammar.y', 407) def _reduce_169(val, _values, result) result = IfNode.new(val[1], val[2], nil, {:statement => true}) result end .,., -module_eval(<<'.,.,', 'grammar.y', 413) +module_eval(<<'.,.,', 'grammar.y', 409) def _reduce_170(val, _values, result) result = IfNode.new(val[1], val[2], nil, {:statement => true}) result end .,., -module_eval(<<'.,.,', 'grammar.y', 414) +module_eval(<<'.,.,', 'grammar.y', 410) def _reduce_171(val, _values, result) result = val[2].add_comment(val[0]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 419) +module_eval(<<'.,.,', 'grammar.y', 415) def _reduce_172(val, _values, result) result = IfNode.new(val[1], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 424) +module_eval(<<'.,.,', 'grammar.y', 420) def _reduce_173(val, _values, result) result = val[1].force_statement result end .,., -module_eval(<<'.,.,', 'grammar.y', 429) +module_eval(<<'.,.,', 'grammar.y', 425) def _reduce_174(val, _values, result) result = val[0] result end .,., -module_eval(<<'.,.,', 'grammar.y', 430) +module_eval(<<'.,.,', 'grammar.y', 426) def _reduce_175(val, _values, result) result = val[0].add_else(val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 435) +module_eval(<<'.,.,', 'grammar.y', 431) def _reduce_176(val, _values, result) result = nil result end .,., -module_eval(<<'.,.,', 'grammar.y', 436) +module_eval(<<'.,.,', 'grammar.y', 432) def _reduce_177(val, _values, result) result = val[1] result end .,., -module_eval(<<'.,.,', 'grammar.y', 441) +module_eval(<<'.,.,', 'grammar.y', 437) def _reduce_178(val, _values, result) result = val[0] result end .,., -module_eval(<<'.,.,', 'grammar.y', 442) +module_eval(<<'.,.,', 'grammar.y', 438) def _reduce_179(val, _values, result) result = val[0].add_else(val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 447) +module_eval(<<'.,.,', 'grammar.y', 443) def _reduce_180(val, _values, result) result = val[0].add_else(val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 448) +module_eval(<<'.,.,', 'grammar.y', 444) def _reduce_181(val, _values, result) result = IfNode.new(val[2], Expressions.wrap(val[0]), nil, {:statement => true}) result end .,., -module_eval(<<'.,.,', 'grammar.y', 449) +module_eval(<<'.,.,', 'grammar.y', 445) def _reduce_182(val, _values, result) result = IfNode.new(val[2], Expressions.wrap(val[0]), nil, {:statement => true, :invert => true}) result From c8ac7f05339dda11813c13e02e62c2849a6b5939 Mon Sep 17 00:00:00 2001 From: Jeffery Olson Date: Mon, 1 Feb 2010 20:57:03 -0800 Subject: [PATCH 21/37] starting port of nodes.rb to coffee-script.. Node only, so far --- src/nodes.coffee | 102 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) diff --git a/src/nodes.coffee b/src/nodes.coffee index 793ed44d0c..b361762740 100644 --- a/src/nodes.coffee +++ b/src/nodes.coffee @@ -1,5 +1,107 @@ +# The abstract base class for all CoffeeScript nodes. +# All nodes are implement a "compile_node" method, which performs the +# code generation for that node. To compile a node, call the "compile" +# method, which wraps "compile_node" in some extra smarts, to know when the +# generated code should be wrapped up in a closure. An options hash is passed +# and cloned throughout, containing messages from higher in the AST, +# information about the current scope, and indentation level. exports.Node: -> this.values: arguments +exports.Node::TAB: ' ' + +# Tag this node as a statement, meaning that it can't be used directly as +# the result of an expression. +exports.Node::mark_as_statement: -> + this.is_statement: -> true + +# Tag this node as a statement that cannot be transformed into an expression. +# (break, continue, etc.) It doesn't make sense to try to transform it. +exports.Node::mark_as_statement_only: -> + this.mark_as_statement() + this.is_statement_only: -> true + +# This node needs to know if it's being compiled as a top-level statement, +# in order to compile without special expression conversion. +exports.Node::mark_as_top_sensitive: -> + this.is_top_sensitive: -> true + +flatten: (aggList, newList) -> + for item in newList + aggList.push(item) + aggList + +compact: (input) -> + compected: [] + for item in input + if item? + compacted.push(item) + +# Provide a quick implementation of a children method. +exports.Node::children: (attributes) -> + # TODO -- are these optimal impls of flatten and compact + # .. do better ones exist in a stdlib? + agg = [] + for item in attributes + agg: flatten agg, item + compacted: compact agg + this.children: -> + compacted + +exports.Node::write: (code) -> + # hm.. + # TODO -- should print to STDOUT in "VERBOSE" how to + # go about this.. ? jsonify 'this'? + code + +# This is extremely important -- we convert JS statements into expressions +# by wrapping them in a closure, only if it's possible, and we're not at +# the top level of a block (which would be unnecessary), and we haven't +# already been asked to return the result. +exports.Node::compile: (o) -> + # TODO -- need JS dup/clone + opts: if not o? then {} else o + this.options: opts + this.indent: opts.indent + top: this.options.top + if not this.is_top_sentitive() + this.options.top: undefined + closure: this.is_statement() and not this.is_statement_only() and not top and typeof(this) == "CommentNode" + closure &&= not this.do_i_contain (n) -> n.is_statement_only() + if closure then this.compile_closure(this.options) else compile_node(this.options) + +# Statements converted into expressions share scope with their parent +# closure, to preserve JavaScript-style lexical scope. +exports.Node::compile_closure: (o) -> + opts: if not o? then {} else o + this.indent: opts.indent + opts.shared_scope: o.scope + exports.ClosureNode.wrap(this).compile(opts) + +# Quick short method for the current indentation level, plus tabbing in. +exports.Node::idt: (tLvl) -> + tabs: if tLvl? then tLvl else 0 + tabAmt: '' + for x in [0...tabs] + tabAmt: tabAmt + this.TAB + this.indent + tabAmt + +exports.Node::is_a_node: -> + true + +#Does this node, or any of it's children, contain a node of a certain kind? +exports.Node::do_i_contain: (block) -> + for node in this.children + return true if block(node) + return true if node.is_a_node() and node.do_i_contain(block) + false + +# Default implementations of the common node methods. +exports.Node::unwrap: -> this +exports.Node::children: [] +exports.Node::is_a_statement: -> false +exports.Node::is_a_statement_only: -> false +exports.Node::is_top_sensitive: -> false + exports.Expressions : exports.Node exports.LiteralNode : exports.Node exports.ReturnNode : exports.Node From c5c841f2fc0f4d66f592b8a0a9389b3a44f16597 Mon Sep 17 00:00:00 2001 From: Jeremy Ashkenas Date: Tue, 2 Feb 2010 10:39:44 -0500 Subject: [PATCH 22/37] fixing bug with mixed dot and soak accessors --- lib/coffee_script/nodes.rb | 4 +++- test/fixtures/execution/test_existence.coffee | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/coffee_script/nodes.rb b/lib/coffee_script/nodes.rb index 3822e54388..7e759b7ce0 100644 --- a/lib/coffee_script/nodes.rb +++ b/lib/coffee_script/nodes.rb @@ -386,7 +386,9 @@ def compile_node(o) parts[-1] << "#{SOAK}#{baseline += prop.compile(o)}" end else - parts << prop.compile(o) + part = prop.compile(o) + baseline += part + parts << part end end @last = parts.last diff --git a/test/fixtures/execution/test_existence.coffee b/test/fixtures/execution/test_existence.coffee index 253a8bf288..2d4c559335 100644 --- a/test/fixtures/execution/test_existence.coffee +++ b/test/fixtures/execution/test_existence.coffee @@ -41,6 +41,8 @@ obj: { print obj?.prop is "hello" +print obj.prop?.length is 5 + print obj?.prop?.non?.existent?.property is undefined From df588bc9e8de0e8505df7c42bb1df517326d298b Mon Sep 17 00:00:00 2001 From: Jeremy Ashkenas Date: Tue, 2 Feb 2010 10:43:23 -0500 Subject: [PATCH 23/37] it's puts in node, not print --- test/fixtures/execution/test_existence.coffee | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/fixtures/execution/test_existence.coffee b/test/fixtures/execution/test_existence.coffee index 63f2a9fdb4..a87693af0e 100644 --- a/test/fixtures/execution/test_existence.coffee +++ b/test/fixtures/execution/test_existence.coffee @@ -41,9 +41,9 @@ obj: { puts obj?.prop is "hello" -print obj.prop?.length is 5 +puts obj.prop?.length is 5 -print obj?.prop?.non?.existent?.property is undefined +puts obj?.prop?.non?.existent?.property is undefined # Soaks and caches method calls as well. From cb7a1033fa9aa00779022ce3e6fb328be1d485f2 Mon Sep 17 00:00:00 2001 From: Jeremy Ashkenas Date: Tue, 2 Feb 2010 20:36:46 -0500 Subject: [PATCH 24/37] adding @property for this.property --- .../Syntaxes/CoffeeScript.tmLanguage | 6 + lib/coffee_script/grammar.y | 7 + lib/coffee_script/nodes.rb | 12 + lib/coffee_script/parser.rb | 2285 +++++++++-------- test/fixtures/execution/test_literals.coffee | 13 +- 5 files changed, 1226 insertions(+), 1097 deletions(-) diff --git a/extras/CoffeeScript.tmbundle/Syntaxes/CoffeeScript.tmLanguage b/extras/CoffeeScript.tmbundle/Syntaxes/CoffeeScript.tmLanguage index 49082c8a1b..1f8ab9520d 100644 --- a/extras/CoffeeScript.tmbundle/Syntaxes/CoffeeScript.tmLanguage +++ b/extras/CoffeeScript.tmbundle/Syntaxes/CoffeeScript.tmLanguage @@ -72,6 +72,12 @@ name constant.numeric.coffee + + match + (@)[a-zA-Z_$]\w* + name + variable.other.readwrite.instance.coffee + name string.quoted.heredoc.coffee diff --git a/lib/coffee_script/grammar.y b/lib/coffee_script/grammar.y index 174a498dcc..c9fb28022a 100644 --- a/lib/coffee_script/grammar.y +++ b/lib/coffee_script/grammar.y @@ -238,6 +238,7 @@ rule | Object { result = ValueNode.new(val[0]) } | Parenthetical { result = ValueNode.new(val[0]) } | Range { result = ValueNode.new(val[0]) } + | This { result = ValueNode.new(val[0]) } | Value Accessor { result = val[0] << val[1] } | Invocation Accessor { result = ValueNode.new(val[0], [val[1]]) } ; @@ -300,6 +301,12 @@ rule SUPER CALL_START ArgList CALL_END { result = CallNode.new(Value.new('super'), val[2]) } ; + # This references, either naked or to a property. + This: + '@' { result = ThisNode.new } + | '@' IDENTIFIER { result = ThisNode.new(val[1]) } + ; + # The range literal. Range: "[" Expression diff --git a/lib/coffee_script/nodes.rb b/lib/coffee_script/nodes.rb index 7e759b7ce0..1fa5680a8d 100644 --- a/lib/coffee_script/nodes.rb +++ b/lib/coffee_script/nodes.rb @@ -429,6 +429,18 @@ def compile_node(o) end end + # A this-reference, using '@'. + class ThisNode < Node + def initialize(property=nil) + @property = property + end + + def compile_node(o) + prop = @property ? ".#{@property}" : '' + write("this#{prop}") + end + end + # A range literal. Ranges can be used to extract portions (slices) of arrays, # or to specify a range for array comprehensions. class RangeNode < Node diff --git a/lib/coffee_script/parser.rb b/lib/coffee_script/parser.rb index 9b342e4b56..b87861d655 100644 --- a/lib/coffee_script/parser.rb +++ b/lib/coffee_script/parser.rb @@ -10,7 +10,7 @@ module CoffeeScript class Parser < Racc::Parser -module_eval(<<'...end grammar.y/module_eval...', 'grammar.y', 459) +module_eval(<<'...end grammar.y/module_eval...', 'grammar.y', 466) # Lex and parse a CoffeeScript. def parse(code) # Uncomment the following line to enable grammar debugging, in combination @@ -34,318 +34,349 @@ def on_error(error_token_id, error_value, value_stack) ##### State transition tables begin ### clist = [ -'128,59,136,28,31,33,38,42,47,51,56,61,64,92,93,95,175,92,93,95,284,285', -'90,276,91,296,90,59,91,59,57,65,124,130,59,155,288,144,287,261,169,158', -'143,147,164,44,155,49,54,309,193,155,173,143,147,150,153,157,143,147', -'150,153,157,161,123,127,132,135,139,142,146,149,152,156,160,122,126', -'131,134,138,141,145,148,151,154,159,121,125,129,133,137,140,166,11,174', -'13,17,191,29,262,34,11,40,198,28,31,33,38,42,47,51,56,61,64,206,207', -'203,155,1,59,100,21,25,193,-183,-183,193,43,98,291,52,57,65,66,13,17', -'206,207,6,12,59,22,59,32,35,267,44,280,49,54,13,17,188,59,189,73,4,9', -'15,19,24,13,17,49,37,46,118,261,13,17,191,13,17,191,192,49,11,278,293', -'28,31,33,38,42,47,51,56,61,64,277,13,17,188,1,2,7,21,25,275,29,59,34', -'43,40,75,52,57,65,66,100,255,13,17,6,12,114,22,98,32,35,155,44,169,49', -'54,200,201,143,147,261,73,4,9,15,19,24,100,49,155,37,46,100,100,182', -'98,-183,-183,13,17,98,98,11,49,59,28,31,33,38,42,47,51,56,61,64,92,93', -'95,108,1,2,7,21,25,90,29,91,34,43,40,49,52,57,65,66,49,49,101,101,6', -'12,183,22,184,32,35,155,44,314,49,54,13,17,-183,-183,185,73,4,9,15,19', -'24,155,284,285,37,46,13,17,143,147,150,153,157,161,123,186,11,2,7,28', -'31,33,38,42,47,51,56,61,64,92,93,95,202,1,2,7,21,25,90,29,91,34,43,40', -'155,52,57,65,66,205,75,-183,-183,6,12,118,22,217,32,35,155,44,,49,54', -',,-183,-183,,73,4,9,15,19,24,155,,,37,46,,,143,147,150,153,157,161,123', -',11,,,28,31,33,38,42,47,51,56,61,64,92,93,95,,1,2,7,21,25,90,29,91,34', -'43,40,155,52,57,65,66,,,143,147,6,12,,22,,32,35,155,44,,49,54,,,-183', -'-183,,73,4,9,15,19,24,155,,,37,46,,,143,147,150,153,157,161,123,,11', -',,28,31,33,38,42,47,51,56,61,64,92,93,95,,1,2,7,21,25,90,29,91,34,43', -'40,155,52,57,65,66,,,-183,-183,6,12,,22,,32,35,155,44,,49,54,,,-183', -'-183,,73,4,9,15,19,24,155,,,37,46,,,143,147,150,153,157,,,,11,,,28,31', -'33,38,42,47,51,56,61,64,,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66,', -',,,6,12,,22,,32,35,,44,,49,54,,,,,,73,4,9,15,19,24,,,,37,46,,,,,,,,', -',,11,,,28,31,33,38,42,47,51,56,61,64,,,,,1,2,7,21,25,,29,,34,43,40,', -'52,57,65,66,,,,,6,12,,22,,32,35,,44,,49,54,,,,,,73,4,9,15,19,24,,,,37', -'46,,,,,,,,,,,11,,,28,31,33,38,42,47,51,56,61,64,,,,,1,2,7,21,25,,29', -',34,43,40,,52,57,65,66,,,,,6,12,,22,,32,35,,44,,49,54,,,,,,73,4,9,15', -'19,24,,,,37,46,,,,,,,,,,,11,,,28,31,33,38,42,47,51,56,61,64,,,,,1,2', -'7,21,25,,29,,34,43,40,,52,57,65,66,,,,,6,12,,22,,32,35,,44,,49,54,,', -',,,73,4,9,15,19,24,,,,37,46,,,,,,,,,,,11,,,28,31,33,38,42,47,51,56,61', -'64,,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66,,,,,6,12,,22,,32,35,,44', -',49,54,,,,,,73,4,9,15,19,24,,,,37,46,,,,,,,,,,,11,,,28,31,33,38,42,47', -'51,56,61,64,,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66,,,,,6,12,,22', -',32,35,,44,,49,54,,,,,,73,4,9,15,19,24,,,,37,46,,,,,,,,,,,11,,,28,31', -'33,38,42,47,51,56,61,64,,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66,', -',,,6,12,,22,,32,35,,44,,49,54,,,,,,73,4,9,15,19,24,,,,37,46,,,,,,,,', -',,11,,,28,31,33,38,42,47,51,56,61,64,,,,,1,2,7,21,25,,29,,34,43,40,', -'52,57,65,66,,,,,6,12,,22,,32,35,,44,,49,54,,,,,,73,4,9,15,19,24,,,,37', -'46,,,,,,,,,,,11,,,28,31,33,38,42,47,51,56,61,64,,,,,1,2,7,21,25,,29', -',34,43,40,,52,57,65,66,,,,,6,12,,22,,32,35,,44,,49,54,,,,,,73,4,9,15', -'19,24,,,,37,46,,,,,,,,,,,11,,,28,31,33,38,42,47,51,56,61,64,,,,,1,2', -'7,21,25,,29,,34,43,40,,52,57,65,66,,,,,6,12,,22,,32,35,,44,,49,54,106', -',,,,73,4,9,15,19,24,,,,37,46,,,,,,,,,,,11,,,28,31,33,38,42,47,51,56', -'61,64,,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66,,,,,6,12,,22,,32,35', -',44,,49,54,,,,,,73,4,9,15,19,24,,,,37,46,,,,,,,,,,,11,,,28,31,33,38', -'42,47,51,56,61,64,,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66,,,,,6,12', -',22,,32,35,,44,,49,54,,,,,,73,4,9,15,19,24,,,,37,46,,,,,,,,,,,11,,,28', -'31,33,38,42,47,51,56,61,64,,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66', -',,,,6,12,,22,,32,35,,44,,49,54,,,,,,73,4,9,15,19,24,,,,37,46,,,,,,,', -',,,11,,,28,31,33,38,42,47,51,56,61,64,,,,,1,2,7,21,25,,29,,34,43,40', -',52,57,65,66,,,,,6,12,,22,,32,35,,44,,49,54,,,,,,73,4,9,15,19,24,,,', -'37,46,,,,,,,,,,,11,,,28,31,33,38,42,47,51,56,61,64,,,,,1,2,7,21,25,', -'29,,34,43,40,,52,57,65,66,,,,,6,12,,22,,32,35,,44,,49,54,,,,,,73,4,9', -'15,19,24,,,,37,46,,,,,,,,,,,11,,,28,31,33,38,42,47,51,56,61,64,,,,,1', -'2,7,21,25,,29,,34,43,40,,52,57,65,66,,,,,6,12,,22,,32,35,,44,,49,54', -',,,,,73,4,9,15,19,24,,,,37,46,,,,,,,,,,,11,,,28,31,33,38,42,47,51,56', -'61,64,,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66,,,,,6,12,,22,,32,35', -',44,,49,54,,,,,,73,4,9,15,19,24,,,,37,46,,,,,,,,,,,11,,,28,31,33,38', -'42,47,51,56,61,64,310,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66,,,,', -'6,12,,22,,32,35,,44,,49,54,,116,,,,73,4,9,15,19,24,,,,37,46,,,,,,,,', -',,11,,,28,31,33,38,42,47,51,56,61,64,,,,,1,2,7,21,25,,29,,34,43,40,', -'52,57,65,66,,,,,6,12,,22,,32,35,,44,,49,54,,,,,,73,4,9,15,19,24,,,,37', -'46,,,,,,,,,,,11,,,28,31,33,38,42,47,51,56,61,64,,,,,1,2,7,21,25,,29', -',34,43,40,,52,57,65,66,,,,,6,12,,22,,32,35,,44,,49,54,,,,,,73,4,9,15', -'19,24,,,,37,46,,,,,,,,,,,11,,,28,31,33,38,42,47,51,56,61,64,,,,,1,2', -'7,21,25,,29,,34,43,40,,52,57,65,66,,,,,6,12,,22,,32,35,,44,,49,54,,', -',,,73,4,9,15,19,24,,,,37,46,,,,,,,,,,,11,,,28,31,33,38,42,47,51,56,61', -'64,300,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66,,,,,6,12,,22,,32,35', -',44,,49,54,,,,,,73,4,9,15,19,24,,,,37,46,,,,,,,,,,,11,,,28,31,33,38', -'42,47,51,56,61,64,,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66,,,,,6,12', -',22,,32,35,,44,,49,54,,,,,,73,4,9,15,19,24,,,,37,46,,,,,,,,,,,11,,,28', -'31,33,38,42,47,51,56,61,64,,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66', -',,,,6,12,,22,,32,35,,44,,49,54,,,,,,73,4,9,15,19,24,,,,37,46,,,,,,,', -',,,11,,,28,31,33,38,42,47,51,56,61,64,,,,,1,2,7,21,25,,29,,34,43,40', -',52,57,65,66,,,,,6,12,,22,,32,35,,44,,49,54,,,,,,73,4,9,15,19,24,,,', -'37,46,,,,,,,,,,,11,,,28,31,33,38,42,47,51,56,61,64,,,,,1,2,7,21,25,', -'29,,34,43,40,,52,57,65,66,,,,,6,12,,22,,32,35,,44,,49,54,,,,,,73,4,9', -'15,19,24,,,,37,46,,,,,,,,,,,11,,,28,31,33,38,42,47,51,56,61,64,,,,,1', -'2,7,21,25,,29,,34,43,40,,52,57,65,66,,,,,6,12,,22,,32,35,,44,,49,54', -',,,,,73,4,9,15,19,24,,,,37,46,,,,,,,,,,,11,,,28,31,33,38,42,47,51,56', -'61,64,,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66,,,,,6,12,,22,,32,35', -',44,,49,54,,,,,,73,4,9,15,19,24,,,,37,46,,,,,,,,,,,11,,,28,31,33,38', -'42,47,51,56,61,64,,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66,,,,,6,12', -',22,,32,35,,44,,49,54,272,,,,,73,4,9,15,19,24,155,,,37,46,,,143,147', -'150,153,157,161,123,127,132,135,139,142,146,149,152,156,160,122,126', -'131,134,,,,,,2,7,13,17,,29,,34,11,40,,28,31,33,38,42,47,51,56,61,64', -',,,,1,,,21,25,,,,,43,,,52,57,65,66,,,,,6,12,,22,,32,35,,44,,49,54,,', -',,,73,4,9,15,19,24,,,,37,46,,,,,,,,,,,11,,,28,31,33,38,42,47,51,56,61', -'64,,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66,,,,,6,12,,22,,32,35,,44', -',49,54,,,,,,73,4,9,15,19,24,,,,37,46,,,,,,,,,,,11,,,28,31,33,38,42,47', -'51,56,61,64,,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66,,,,,6,12,,22', -',32,35,,44,,49,54,,,,,,73,4,9,15,19,24,,,,37,46,,,,,,,,,,,11,,,28,31', -'33,38,42,47,51,56,61,64,,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66,', -',,,6,12,,22,,32,35,,44,,49,54,,,,,,73,4,9,15,19,24,,,,37,46,,,,,,,,', -',,11,,,28,31,33,38,42,47,51,56,61,64,,,,,1,2,7,21,25,,29,,34,43,40,', -'52,57,65,66,,,,,6,12,,22,,32,35,,44,,49,54,,,,,,73,4,9,15,19,24,,,,37', -'46,,,,,,,,,,,11,,,28,31,33,38,42,47,51,56,61,64,,,,,1,2,7,21,25,,29', -',34,43,40,,52,57,65,66,,,,,6,12,,22,,32,35,,44,,49,54,,,,,,73,4,9,15', -'19,24,,,,37,46,,,,,,,,,,,11,,,28,31,33,38,42,47,51,56,61,64,,,,,1,2', -'7,21,25,,29,,34,43,40,,52,57,65,66,,,,,6,12,,22,,32,35,,44,,49,54,,', -',,,73,4,9,15,19,24,,,,37,46,,,,,,,,,,,11,,,28,31,33,38,42,47,51,56,61', -'64,,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66,,,,,6,12,,22,,32,35,,44', -',49,54,,,,,,73,4,9,15,19,24,,,,37,46,,,,,,,,,,,11,,,28,31,33,38,42,47', -'51,56,61,64,,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66,,,,,6,12,,22', -',32,35,,44,,49,54,,,,,,73,4,9,15,19,24,,,,37,46,,,,,,,,,,,11,,,28,31', -'33,38,42,47,51,56,61,64,,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66,', -',,,6,12,,22,,32,35,,44,,49,54,,,,,,73,4,9,15,19,24,,,,37,46,,,,,,,,', -',,11,,,28,31,33,38,42,47,51,56,61,64,,,,,1,2,7,21,25,,29,,34,43,40,', -'52,57,65,66,,,,,6,12,,22,,32,35,,44,,49,54,,,,,,73,4,9,15,19,24,,,,37', -'46,,,,,,,,,,,11,,,28,31,33,38,42,47,51,56,61,64,,,,,1,2,7,21,25,,29', -',34,43,40,,52,57,65,66,,,,,6,12,,22,,32,35,,44,,49,54,106,,,,,73,4,9', -'15,19,24,,,,37,46,,,,,,,,,,,11,,,28,31,33,38,42,47,51,56,61,64,,,,,1', -'2,7,21,25,,29,,34,43,40,,52,57,65,66,,,,,6,12,,22,,32,35,,44,,49,54', -',,,,,73,4,9,15,19,24,,,,37,46,,,,,,,,,,,11,,,28,31,33,38,42,47,51,56', -'61,64,,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66,,,,,6,12,,22,,32,35', -',44,,49,54,,,,,,73,4,9,15,19,24,,,,37,46,,,,,,,,,,,11,,,28,31,33,38', -'42,47,51,56,61,64,,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66,,,,,6,12', -',22,,32,35,,44,,49,54,,,,,,73,4,9,15,19,24,,,,37,46,,,,,,,,,,,11,,,28', -'31,33,38,42,47,51,56,61,64,,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66', -',,,,6,12,,22,,32,35,,44,,49,54,,,,,,73,4,9,15,19,24,,,,37,46,,,,,,,', -',,,11,,,28,31,33,38,42,47,51,56,61,64,,,,,1,2,7,21,25,,29,,34,43,40', -',52,57,65,66,,,,,6,12,,22,,32,35,,44,,49,54,,,,,,73,4,9,15,19,24,,,', -'37,46,,,,,,,,,,,11,,,28,31,33,38,42,47,51,56,61,64,,,,,1,2,7,21,25,', -'29,,34,43,40,,52,57,65,66,,,,,6,12,,22,,32,35,,44,,49,54,,,,,,73,4,9', -'15,19,24,,,,37,46,,,,,,,,,,,11,,,28,31,33,38,42,47,51,56,61,64,,,,,1', -'2,7,21,25,,29,,34,43,40,,52,57,65,66,,,,,6,12,,22,,32,35,,44,,49,54', -',,,,,73,4,9,15,19,24,,,,37,46,,,,,,,,,,,11,,,28,31,33,38,42,47,51,56', -'61,64,,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66,,,,,6,12,,22,,32,35', -',44,,49,54,,,,,,73,4,9,15,19,24,,,,37,46,,,,,,,,,,,11,,,28,31,33,38', -'42,47,51,56,61,64,,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66,,,,,6,12', -',22,,32,35,,44,,49,54,,,,,,73,4,9,15,19,24,,,,37,46,,,,,,,,,,,11,,,28', -'31,33,38,42,47,51,56,61,64,,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66', -',,,,6,12,,22,,32,35,,44,,49,54,,,,,,73,4,9,15,19,24,,,,37,46,,,,,,,', -',,,11,,,28,31,33,38,42,47,51,56,61,64,,,,,1,2,7,21,25,,29,,34,43,40', -',52,57,65,66,,,,,6,12,,22,,32,35,,44,,49,54,,,,,,73,4,9,15,19,24,,,', -'37,46,,,,,,,,,,,11,,,28,31,33,38,42,47,51,56,61,64,,,,,1,2,7,21,25,', -'29,,34,43,40,,52,57,65,66,,,,,6,12,,22,,32,35,,44,,49,54,,,,,,73,4,9', -'15,19,24,,,,37,46,,,,,,,,,,,11,,,28,31,33,38,42,47,51,56,61,64,,,,,1', -'2,7,21,25,,29,,34,43,40,,52,57,65,66,,,,,6,12,,22,,32,35,,44,,49,54', -'106,,,,,73,4,9,15,19,24,,,,37,46,,,,,,,,,,,11,,,28,31,33,38,42,47,51', -'56,61,64,,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66,,,,,6,12,,22,,32', -'35,,44,,49,54,,,,,,73,4,9,15,19,24,,,,37,46,,,,,,,,,,,11,,,28,31,33', -'38,42,47,51,56,61,64,,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66,,,,', -'6,12,,22,,32,35,,44,,49,54,59,,,,,73,4,9,15,19,24,155,,,37,46,,,143', -'147,150,153,157,161,123,127,132,135,139,142,146,149,152,156,160,122', -'126,131,134,,,,,,2,7,13,17,,29,,34,11,40,,28,31,33,38,42,47,51,56,61', -'64,,,,,1,,,21,25,,,,,43,,,52,57,65,66,,,,,6,12,,22,,32,35,,44,,49,54', -',,,,,73,4,9,15,19,24,,,,37,46,,,,,,,,,,,11,,,28,31,33,38,42,47,51,56', -'61,64,,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66,,,,,6,12,,22,,32,35', -',44,,49,54,,,,,,73,4,9,15,19,24,,,,37,46,,,,,,,,,,,11,,,28,31,33,38', -'42,47,51,56,61,64,,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66,,,,,6,12', -',22,,32,35,,44,,49,54,,,,,,73,4,9,15,19,24,,,,37,46,,,,,,,,,,,11,,,28', -'31,33,38,42,47,51,56,61,64,,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66', -',,,,6,12,,22,,32,35,,44,,49,54,,,,,,73,4,9,15,19,24,,,,37,46,,,,,,,', -',,,11,,,28,31,33,38,42,47,51,56,61,64,,,,,1,2,7,21,25,,29,,34,43,40', -',52,57,65,66,,,,,6,12,,22,,32,35,,44,,49,54,,,,,,73,4,9,15,19,24,,,', -'37,46,,,,,,,,,,,11,,,28,31,33,38,42,47,51,56,61,64,,,,,1,2,7,21,25,', -'29,,34,43,40,,52,57,65,66,,,,,6,12,,22,,32,35,,44,,49,54,,,,,,73,4,9', -'15,19,24,,,,37,46,,,,,,,,,,,11,,,28,31,33,38,42,47,51,56,61,64,,,,,1', -'2,7,21,25,,29,,34,43,40,,52,57,65,66,,,,,6,12,,22,,32,35,,44,,49,54', -',,,,,73,4,9,15,19,24,,,,37,46,,,,,,,,,,,11,,,28,31,33,38,42,47,51,56', -'61,64,,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66,,,,,6,12,,22,,32,35', -',44,,49,54,,,,,,73,4,9,15,19,24,,,,37,46,,,,,,,,,,,11,,,28,31,33,38', -'42,47,51,56,61,64,,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66,,,,,6,12', -',22,,32,35,,44,,49,54,,,,,,73,4,9,15,19,24,,,,37,46,,,,,,,,,,,11,,,28', -'31,33,38,42,47,51,56,61,64,,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66', -',,,,6,12,,22,,32,35,,44,,49,54,,,,,,73,4,9,15,19,24,,,,37,46,,,,,,,', -',,,11,,,28,31,33,38,42,47,51,56,61,64,,,,,1,2,7,21,25,,29,,34,43,40', -',52,57,65,66,,,,,6,12,,22,,32,35,,44,,49,54,,,,,,73,4,9,15,19,24,,,', -'37,46,,,,,,,,,,,11,,,28,31,33,38,42,47,51,56,61,64,,,,,1,2,7,21,25,', -'29,,34,43,40,,52,57,65,66,,,,,6,12,,22,,32,35,,44,,49,54,,128,,136,', -'73,4,9,15,19,24,155,,,37,46,,,143,147,150,153,157,161,123,127,132,135', -'139,142,146,,,124,130,,,,144,,,,158,,2,7,,,,29,,34,155,40,,,,,,143,147', -'150,153,157,161,123,127,132,135,139,142,146,149,152,156,160,122,126', -'131,134,138,141,145,148,151,154,159,121,125,129,133,137,140,128,,136', -'155,,,,,,319,143,147,150,153,157,161,123,127,132,135,139,142,146,149', -'152,156,160,122,126,131,134,,124,130,,,,144,,,,158,,,,,,,,,,155,,,,', -',,143,147,150,153,157,161,123,127,132,135,139,142,146,149,152,156,160', -'122,126,131,134,138,141,145,148,151,154,159,121,125,129,133,137,140', -',,,,,,,,,313,28,31,33,38,42,47,51,56,61,64,,,,,1,,,21,25,,,,,43,,,52', -'57,65,,,,,,,12,,22,,32,35,,44,,49,54,,,,,,73,4,9,15,19,24,,,,37,46,', -',,,28,31,33,38,42,47,51,56,61,64,,,,,1,,,21,25,,,,,43,2,7,52,57,65,29', -',34,,40,,12,,22,,32,35,,44,,49,54,,,,,,73,4,9,15,19,24,155,,,37,46,', -',143,147,150,153,157,161,123,127,132,135,,28,31,33,38,42,47,51,56,61', -'64,,,,,1,2,7,21,25,,29,,34,43,40,,52,57,65,66,,,,,,12,,22,,32,35,,44', -',49,54,,,,,,73,4,9,15,19,24,,,,37,46,,,,,28,31,33,38,42,47,51,56,61', -'64,,,,,1,,,21,25,,,,,43,2,7,52,57,65,29,,34,,40,,12,,22,,32,35,,44,', -'49,54,,,,,,73,4,9,15,,28,31,33,38,42,47,51,56,61,64,155,,,,,,,143,147', -'150,153,157,161,123,127,132,135,57,65,,,,,,2,7,,,,29,,34,44,40,155,54', -',128,,136,,143,147,150,153,157,161,123,127,132,135,139,142,146,149,152', -'156,160,122,126,131,134,,,,,,,,124,130,,,,144,,,,158,,,,,,,29,,34,155', -'40,,,,,,143,147,150,153,157,161,123,127,132,135,139,142,146,149,152', -'156,160,122,126,131,134,138,141,145,148,151,154,159,121,125,129,133', -'137,140,128,155,136,,,,,,143,147,150,153,157,161,123,127,132,135,139', -'142,146,149,152,156,160,122,126,131,134,,,,124,130,,,,144,,,,158,,,', -',,,,,,155,,,,,,,143,147,150,153,157,161,123,127,132,135,139,142,146', -'149,152,156,160,122,126,131,134,138,141,145,148,151,154,159,121,125', -'129,133,137,140,128,155,136,,,,,,143,147,150,153,157,161,123,127,132', -'135,139,142,146,,,,,318,,,,,,,124,130,,,,144,,,,158,,,,,,,,,,155,,,', -',,,143,147,150,153,157,161,123,127,132,135,139,142,146,149,152,156,160', -'122,126,131,134,138,141,145,148,151,154,159,121,125,129,133,137,140', -'128,155,136,,,,,,143,147,150,153,157,161,123,127,132,135,139,142,146', -'149,152,156,160,122,126,131,134,,,,124,130,,,,144,,,,158,,,,,,,,,,155', -',,,,,,143,147,150,153,157,161,123,127,132,135,139,142,146,149,152,156', -'160,122,126,131,134,138,141,145,148,151,154,159,121,125,129,133,137', -'140,128,155,136,,,,,,143,147,150,153,157,161,123,127,132,135,139,142', -'146,149,152,156,160,122,126,131,134,,,,124,130,,,,144,,,,158,,,,,,,', -'178,,155,,,,,,,143,147,150,153,157,161,123,127,132,135,139,142,146,149', -'152,156,160,122,126,131,134,138,141,145,148,151,154,159,121,125,129', -'133,137,140,128,155,136,,,,,,143,147,150,153,157,161,123,127,132,135', -'139,142,146,149,152,156,160,122,126,131,134,,,,124,130,,,,144,,,,158', -',,,,,,,,,155,,,,,,,143,147,150,153,157,161,123,127,132,135,139,142,146', -'149,152,156,160,122,126,131,134,138,141,145,148,151,154,159,121,125', -'129,133,137,140,128,155,136,,,,,,143,147,150,153,157,161,123,127,132', -'135,139,142,146,,,,,,,,,,,,124,130,,,,144,,,,158,,,,,,,,,,155,,,,,,', -'143,147,150,153,157,161,123,127,132,135,139,142,146,149,152,156,160', -'122,126,131,134,138,141,145,148,151,154,159,121,125,129,133,137,140', -'128,155,136,,,,,,143,147,150,153,157,161,123,127,132,135,139,142,146', -',,,,,,,,,,,124,130,,,,144,,,,158,,,,,,,,,,155,,,,,,,143,147,150,153', -'157,161,123,127,132,135,139,142,146,149,152,156,160,122,126,131,134', -'138,141,145,148,151,154,159,121,125,129,133,137,140,128,155,136,,,,', -',143,147,150,153,157,161,123,127,132,135,,,,,,,,,,,,,,,124,130,,,,144', -',,,158,,,,,,,,,,155,,,,,,,143,147,150,153,157,161,123,127,132,135,139', -'142,146,149,152,156,160,122,126,131,134,138,141,145,148,151,154,159', -'121,125,129,133,137,140,128,,136,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,124,130', -',,,144,,,,158,,,,,,,,,,155,,,,,,,143,147,150,153,157,161,123,127,132', -'135,139,142,146,149,152,156,160,122,126,131,134,138,141,145,148,151', -'154,159,121,125,196,133,137,140,128,,136,,,,,,,,,,,,,,,,,,,,,,,,,,,', -',,124,130,,,,144,,,,158,,,,,,,,,,155,,,,,,,143,147,150,153,157,161,123', -'127,132,135,139,142,146,149,152,156,160,122,126,131,134,138,141,145', -'148,151,154,159,121,125,129,133,137,140,128,,136,,,,,,,,,,,,,,,,,,,', -',,,,,,,,,,124,130,,,,144,,,,158,,,,,,,,,,155,,,,,,,143,147,150,153,157', -'161,123,127,132,135,139,142,146,149,152,156,160,122,126,131,134,138', -'141,145,148,151,154,159,121,125,129,133,137,140,128,,136,,,,,,,,,,,', -',,,,,,,,,,,320,,,,,,,124,130,,,,144,,,,158,,,,,,,,,,155,,,,,,,143,147', -'150,153,157,161,123,127,132,135,139,142,146,149,152,156,160,122,126', -'131,134,138,141,145,148,151,154,159,121,125,129,133,137,140,128,,136', -',,,,,,,,,,,,,,,,,,,,,,,,,,,,,124,130,,,,144,,,,158,,,,,,,,59,,155,,', -',,,,143,147,150,153,157,161,123,127,132,135,139,142,146,149,152,156', -'160,122,126,131,134,138,141,145,148,151,154,159,121,125,129,133,137', -'140,128,,136,,,,,,,,,,,,,,,,,,,,,,,264,,,,,,,124,130,,,,144,,,,158,', -',,,,,,,,155,,,,,,,143,147,150,153,157,161,123,127,132,135,139,142,146', -'149,152,156,160,122,126,131,134,138,141,145,148,151,154,159,121,125', -'263,133,137,140,128,,136,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,124,130,,,,144', -',,,158,,,,,,,,,,155,,,,,,,143,147,150,153,157,161,123,127,132,135,139', -'142,146,149,152,156,160,122,126,131,134,138,141,145,148,151,154,159', -'121,125,129,133,137,140,128,,136,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,124,130', -',,,144,,,,158,,,,,,,,,,155,,,,,,,143,147,150,153,157,161,123,127,132', -'135,139,142,146,149,152,156,160,122,126,131,134,138,141,145,148,151', -'154,159,121,125,129,133,137,140,128,,136,,,,,,,,,,,,,,,,,,,,,,,,,,,', -',,124,130,,,,144,,,,158,,,,,,,,,,155,,,,,,,143,147,150,153,157,161,123', -'127,132,135,139,142,146,149,152,156,160,122,126,131,134,138,141,145', -'148,151,154,159,121,125,129,133,137,140,128,,136,,,,,,,,,,,,,,,,,,,', -',,,,,,,,,,124,130,,,,144,,,,158,,,,,,,,,,155,,,,,,,143,147,150,153,157', -'161,123,127,132,135,139,142,146,149,152,156,160,122,126,131,134,138', -'141,145,148,151,154,159,121,125,129,133,137,140,128,,136,,,,,,,,,,,', -',,,,,,,,,,,,,,,,,,124,130,,,,144,,,,158,,,,,,,,,,155,,,,,,,143,147,150', -'153,157,161,123,127,132,135,139,142,146,149,152,156,160,122,126,131', -'134,138,141,145,148,151,154,159,121,125,129,133,137,140,128,,136,,,', -',,,,,,,,,,,,,,,,,,,,,,,,,,124,130,,,,144,,,,158,,,,,,,,59,,155,,,,,', -',143,147,150,153,157,161,123,127,132,135,139,142,146,149,152,156,160', -'122,126,131,134,138,141,145,148,151,154,159,121,125,129,133,137,140', -'128,,136,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,124,130,,,,144,,,,158,,,,,,,,', -',155,,,,,,,143,147,150,153,157,161,123,127,132,135,139,142,146,149,152', -'156,160,122,126,131,134,138,141,145,148,151,154,159,121,125,129,133', -'137,140,124,130,,,,,,,,158,,,,,,,,,,155,,,,,,,143,147,150,153,157,161', -'123,127,132,135,139,142,146,149,152,156,160,122,126,131,134,138,141', -'145,148,151,154,159,121,125,129,133,137,140,124,130,,,,,,,,158,,,,,', -',,,,155,,,,,,,143,147,150,153,157,161,123,127,132,135,139,142,146,149', -'152,156,160,122,126,131,134,138,141,145,148,151,154,159,121,125,129', -'133,137,140,124,130,,,,,,,,158,,,,,,,,,,155,,,,,,,143,147,150,153,157', -'161,123,127,132,135,139,142,146,149,152,156,160,122,126,131,134,138', -'141,145,148,151,154,159,121,125,129,124,130,,,,,,,,158,,,,,,,,,,155', -',,,,,,143,147,150,153,157,161,123,127,132,135,139,142,146,149,152,156', -'160,122,126,131,134,138,141,145,148,151,154,159,121,125,129,124,130', -',,,,,,,158,,,,,,,,,,155,,,,,,,143,147,150,153,157,161,123,127,132,135', -'139,142,146,149,152,156,160,122,126,131,134,138,141,145,148,151,154', -'159,121,125,129,124,130,,,,,,,,158,,,,,,,,,,155,,,,,,,143,147,150,153', -'157,161,123,127,132,135,139,142,146,149,152,156,160,122,126,131,134', -'138,141,145,148,151,154,159,121,125,129,130,,,,,,,,158,,,,,,,,,,155', -',,,,,,143,147,150,153,157,161,123,127,132,135,139,142,146,149,152,156', -'160,122,126,131,134,138,141,145,148,151,154,159,121,125,129,130,,,,', -',,,158,,,,,,,,,,155,,,,,,,143,147,150,153,157,161,123,127,132,135,139', -'142,146,149,152,156,160,122,126,131,134,138,141,145,148,151,154,159', -'121,125,129,130,,,,,,,,158,,,,,,,,,,155,,,,,,,143,147,150,153,157,161', -'123,127,132,135,139,142,146,149,152,156,160,122,126,131,134,138,141', -'145,148,151,154,159,121,125,129,130,,,,,,,,158,,,,,,,,,,155,,,,,,,143', -'147,150,153,157,161,123,127,132,135,139,142,146,149,152,156,160,122', -'126,131,134,138,141,145,148,151,154,159,121,125,129,130,,,,,,,,158,', -',,,,,,,,155,,,,,,,143,147,150,153,157,161,123,127,132,135,139,142,146', -'149,152,156,160,122,126,131,134,138,141,145,148,151,154,159,121,125', -'129,158,,,,,,,,,,155,,,,,,,143,147,150,153,157,161,123,127,132,135,139', -'142,146,149,152,156,160,122,126,131,134,138,141,145,148,151,154,159', -'121,125,158,,,,,,,,,,155,,,,,,,143,147,150,153,157,161,123,127,132,135', -'139,142,146,149,152,156,160,122,126,131,134,138,141,145,148,151,154', -'159,121,125,158,,,,,,,,,,155,,,,,,,143,147,150,153,157,161,123,127,132', -'135,139,142,146,149,152,156,160,122,126,131,134,138,141,145,148,151', -'154,159,121,125,155,,,,,,,143,147,150,153,157,161,123,127,132,135,139', -'142,146,149,152,156,160,122,126,131,134,138,141,145,148,151,154,159', -'121,125,155,,,,,,,143,147,150,153,157,161,123,127,132,135,139,142,146', -'149,152,156,160,122,126,131,134,138,141,145,148,151,154,159,121,125', -'155,,,,,,,143,147,150,153,157,161,123,127,132,135,139,142,146,149,152', -'156,160,122,126,131,134,138,141,145,148,151,154,159,121,125,155,,,,', -',,143,147,150,153,157,161,123,127,132,135,139,142,146,149,152,156,160', -'122,126,131,134,138,141,145,148,151,154,159,121,125,155,,,,,,,143,147', -'150,153,157,161,123,127,132,135,139,142,146,149,152,156,160,122,126', -'131,134,138,141,145,148,151,154,159,121,125' ] - racc_action_table = arr = Array.new(9160, nil) +'136,11,144,29,32,35,41,44,49,54,58,63,66,106,107,108,61,1,178,281,21', +'26,103,300,105,112,43,163,262,55,59,67,132,138,-186,-186,51,152,12,280', +'22,166,33,37,171,45,279,51,56,61,61,163,13,17,74,4,9,15,151,155,158', +'161,165,169,131,135,140,143,147,150,154,157,160,164,168,130,134,139', +'142,146,149,153,156,159,162,167,129,133,137,141,145,148,172,2,7,125', +'177,310,30,274,36,39,11,48,208,29,32,35,41,44,49,54,58,63,66,283,271', +'202,61,1,212,213,21,26,287,288,202,98,43,296,61,55,59,67,68,97,270,122', +'61,6,12,210,22,202,33,37,163,45,113,51,56,114,77,-186,-186,290,74,4', +'9,15,19,24,13,17,200,40,47,262,262,201,51,13,17,200,61,51,51,98,297', +'13,17,13,17,186,98,97,13,17,13,17,200,163,97,206,207,2,7,61,-186,-186', +'30,176,36,39,11,48,84,29,32,35,41,44,49,54,58,63,66,61,13,17,51,1,99', +'98,21,26,84,51,189,99,43,97,98,55,59,67,68,287,288,190,97,6,12,195,22', +'196,33,37,163,45,197,51,56,13,17,151,155,163,74,4,9,15,19,24,-186,-186', +'51,40,47,163,13,17,186,291,187,51,151,155,158,161,165,169,131,135,140', +'143,147,150,154,157,160,164,168,130,134,139,142,2,7,2,7,77,30,61,36', +'39,11,48,319,29,32,35,41,44,49,54,58,63,66,106,107,108,224,1,13,17,21', +'26,103,209,105,125,43,163,211,55,59,67,68,258,-186,-186,,6,12,,22,,33', +'37,163,45,,51,56,212,213,151,155,,74,4,9,15,19,24,163,,,40,47,,,151', +'155,158,161,165,169,131,135,140,143,147,150,154,157,160,164,168,130', +'134,139,142,313,163,,,,2,7,,-186,-186,30,,36,39,11,48,,29,32,35,41,44', +'49,54,58,63,66,106,107,108,,1,,,21,26,103,,105,,43,163,,55,59,67,68', +',151,155,,6,12,,22,,33,37,163,45,,51,56,,,-186,-186,,74,4,9,15,19,24', +'163,,,40,47,,,151,155,158,161,165,169,131,135,140,143,147,150,154,157', +'160,164,168,130,134,139,142,106,107,108,,,2,7,,,103,30,105,36,39,11', +'48,,29,32,35,41,44,49,54,58,63,66,106,107,108,,1,,,21,26,103,,105,,43', +'163,,55,59,67,68,,-186,-186,,6,12,,22,,33,37,,45,,51,56,,,,,,74,4,9', +'15,19,24,163,,,40,47,,,151,155,158,161,165,169,131,135,140,143,147,150', +'154,157,160,164,168,130,134,139,142,106,107,108,,,2,7,,,103,30,105,36', +'39,11,48,,29,32,35,41,44,49,54,58,63,66,,,,,1,,,21,26,,,,,43,,,55,59', +'67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,,,,74,4,9,15,19,24,163,,,40,47', +',,151,155,158,161,165,169,131,135,140,143,147,150,154,157,160,164,168', +'130,134,139,142,,,,,,2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49,54,58', +'63,66,,,,,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,,45,,51', +'56,,,,,,74,4,9,15,19,24,163,,,40,47,,,151,155,158,161,165,169,131,135', +'140,143,147,150,154,157,160,164,168,130,134,139,142,,,,,,2,7,,,,30,', +'36,39,11,48,,29,32,35,41,44,49,54,58,63,66,,,,,1,,,21,26,,,,,43,,,55', +'59,67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,,,,74,4,9,15,19,24,163,,,40', +'47,,,151,155,158,161,165,169,131,135,140,143,147,150,154,157,160,164', +'168,130,134,139,142,,,,,,2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49,54', +'58,63,66,,,,,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,,45', +',51,56,,,,,,74,4,9,15,19,24,163,,,40,47,,,151,155,158,161,165,169,131', +'135,140,143,147,150,154,157,160,164,168,130,134,139,142,,,,,,2,7,,,', +'30,,36,39,11,48,,29,32,35,41,44,49,54,58,63,66,,,,,1,,,21,26,,,,,43', +',,55,59,67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,,,,74,4,9,15,19,24,163', +',,40,47,,,151,155,158,161,165,169,131,135,140,143,147,150,154,163,,', +',,,,151,155,158,161,165,,2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49,54', +'58,63,66,,,,,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,,45', +',51,56,,,,,,74,4,9,15,19,24,163,,,40,47,,,151,155,158,161,165,169,131', +'135,140,143,147,150,154,163,,,,,,,151,155,158,161,165,,2,7,,,,30,,36', +'39,11,48,,29,32,35,41,44,49,54,58,63,66,,,,,1,,,21,26,,,,,43,,,55,59', +'67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,,,,74,4,9,15,19,24,163,,,40,47', +',,151,155,158,161,165,169,131,135,140,143,147,150,154,,,,,,,,,,,,,,2', +'7,,,,30,,36,39,11,48,,29,32,35,41,44,49,54,58,63,66,,,,,1,,,21,26,,', +',,43,,,55,59,67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,,,,74,4,9,15,19', +'24,163,,,40,47,,,151,155,158,161,165,169,131,135,140,143,147,150,154', +',,,,,,,,,,,,,2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49,54,58,63,66,', +',,,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,', +',,74,4,9,15,19,24,163,,,40,47,,,151,155,158,161,165,169,131,135,140', +'143,,,,,,,,,,,,303,,,,,2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49,54', +'58,63,66,,,,,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,,45', +',51,56,,,,,,74,4,9,15,19,24,163,,,40,47,,,151,155,158,161,165,169,131', +'135,140,143,163,,,,,,,151,155,158,161,165,169,131,,,2,7,,,,30,,36,39', +'11,48,,29,32,35,41,44,49,54,58,63,66,,,,,1,,,21,26,,,,,43,,,55,59,67', +'68,,,,,6,12,,22,,33,37,,45,,51,56,,,,,,74,4,9,15,19,24,163,,,40,47,', +',151,155,158,161,165,169,131,135,140,143,163,,,,,,,151,155,158,161,165', +'169,131,,,2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49,54,58,63,66,,,,', +'1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,,,,74', +'4,9,15,19,24,163,,,40,47,,,151,155,158,161,165,169,131,,,,,,,,,,,,,', +',,,,,,2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49,54,58,63,66,,,,,1,,', +'21,26,,,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,,,,74,4', +'9,15,19,24,,,,40,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,7,,,,30,,36,39,11', +'48,,29,32,35,41,44,49,54,58,63,66,,,,,1,,,21,26,,,,,43,,,55,59,67,68', +',,,,6,12,,22,,33,37,,45,,51,56,114,,,,,74,4,9,15,19,24,,,,40,47,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49,54', +'58,63,66,,,,,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,,45', +',51,56,,,,,,74,4,9,15,19,24,,,,40,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,7', +',,,30,,36,39,11,48,,29,32,35,41,44,49,54,58,63,66,,,,,1,,,21,26,,,,', +'43,,,55,59,67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,,,,74,4,9,15,19,24', +',,,40,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,7,,,,30,,36,39,11,48,,29,32,35', +'41,44,49,54,58,63,66,,,,,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12,,22', +',33,37,,45,,51,56,,,,,,74,4,9,15,19,24,,,,40,47,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49,54,58,63,66,,,,,1', +',,21,26,,,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,,,,74', +'4,9,15,19,24,,,,40,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,7,,,,30,,36,39,11', +'48,,29,32,35,41,44,49,54,58,63,66,,,,,1,,,21,26,,,,,43,,,55,59,67,68', +',,,,6,12,,22,,33,37,,45,,51,56,,,,,,74,4,9,15,19,24,,,,40,47,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49,54,58', +'63,66,,,,,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,,45,,51', +'56,,,,,,74,4,9,15,19,24,,,,40,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,7,,,', +'30,,36,39,11,48,,29,32,35,41,44,49,54,58,63,66,,,,,1,,,21,26,,,,,43', +',,55,59,67,68,,,,,6,12,,22,,33,37,,45,,51,56,,123,,,,74,4,9,15,19,24', +',,,40,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,7,,,,30,,36,39,11,48,,29,32,35', +'41,44,49,54,58,63,66,,,,,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12,,22', +',33,37,,45,,51,56,,,,,,74,4,9,15,19,24,,,,40,47,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49,54,58,63,66,,,,,1', +',,21,26,,,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,,45,,51,56,275,,,,', +'74,4,9,15,19,24,,,,40,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,7,13,17,,30,', +'36,39,11,48,,29,32,35,41,44,49,54,58,63,66,,,,,1,,,21,26,,,,,43,,,55', +'59,67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,,,,74,4,9,15,19,24,,,,40,47', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49', +'54,58,63,66,,,,,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,', +'45,,51,56,,,,,,74,4,9,15,19,24,,,,40,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +'2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49,54,58,63,66,,,,,1,,,21,26', +',,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,,,,74,4,9,15,19', +'24,,,,40,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,7,,,,30,,36,39,11,48,,29,32', +'35,41,44,49,54,58,63,66,,,,,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12', +',22,,33,37,,45,,51,56,,,,,,74,4,9,15,19,24,,,,40,47,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49,54,58,63,66,,', +',,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,,', +',74,4,9,15,19,24,,,,40,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,7,,,,30,,36', +'39,11,48,,29,32,35,41,44,49,54,58,63,66,,,,,1,,,21,26,,,,,43,,,55,59', +'67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,,,,74,4,9,15,19,24,,,,40,47,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49', +'54,58,63,66,,,,,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,', +'45,,51,56,,,,,,74,4,9,15,19,24,,,,40,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +'2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49,54,58,63,66,,,,,1,,,21,26', +',,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,,,,74,4,9,15,19', +'24,,,,40,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,7,,,,30,,36,39,11,48,,29,32', +'35,41,44,49,54,58,63,66,,,,,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12', +',22,,33,37,,45,,51,56,,,,,,74,4,9,15,19,24,,,,40,47,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49,54,58,63,66,,', +',,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,,', +',74,4,9,15,19,24,,,,40,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,7,,,,30,,36', +'39,11,48,,29,32,35,41,44,49,54,58,63,66,,,,,1,,,21,26,,,,,43,,,55,59', +'67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,,,,74,4,9,15,19,24,,,,40,47,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49', +'54,58,63,66,,,,,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,', +'45,,51,56,,,,,,74,4,9,15,19,24,,,,40,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +'2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49,54,58,63,66,,,,,1,,,21,26', +',,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,,,,74,4,9,15,19', +'24,,,,40,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,7,,,,30,,36,39,11,48,,29,32', +'35,41,44,49,54,58,63,66,,,,,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12', +',22,,33,37,,45,,51,56,,,,,,74,4,9,15,19,24,,,,40,47,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49,54,58,63,66,,', +',,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,,', +',74,4,9,15,19,24,,,,40,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,7,,,,30,,36', +'39,11,48,,29,32,35,41,44,49,54,58,63,66,,,,,1,,,21,26,,,,,43,,,55,59', +'67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,,,,74,4,9,15,19,24,,,,40,47,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49', +'54,58,63,66,,,,,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,', +'45,,51,56,,,,,,74,4,9,15,19,24,,,,40,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +'2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49,54,58,63,66,,,,,1,,,21,26', +',,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,,,,74,4,9,15,19', +'24,,,,40,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,7,,,,30,,36,39,11,48,,29,32', +'35,41,44,49,54,58,63,66,,,,,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12', +',22,,33,37,,45,,51,56,,,,,,74,4,9,15,19,24,,,,40,47,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49,54,58,63,66,,', +',,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,,', +',74,4,9,15,19,24,,,,40,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,7,,,,30,,36', +'39,11,48,,29,32,35,41,44,49,54,58,63,66,,,,,1,,,21,26,,,,,43,,,55,59', +'67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,,,,74,4,9,15,19,24,,,,40,47,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49', +'54,58,63,66,,,,,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,', +'45,,51,56,,,,,,74,4,9,15,19,24,,,,40,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +'2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49,54,58,63,66,,,,,1,,,21,26', +',,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,,,,74,4,9,15,19', +'24,,,,40,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,7,,,,30,,36,39,11,48,,29,32', +'35,41,44,49,54,58,63,66,,,,,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12', +',22,,33,37,,45,,51,56,,,,,,74,4,9,15,19,24,,,,40,47,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49,54,58,63,66,,', +',,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,,', +',74,4,9,15,19,24,,,,40,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,7,,,,30,,36', +'39,11,48,,29,32,35,41,44,49,54,58,63,66,,,,,1,,,21,26,,,,,43,,,55,59', +'67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,,,,74,4,9,15,19,24,,,,40,47,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49', +'54,58,63,66,,,,,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,', +'45,,51,56,,,,,,74,4,9,15,19,24,,,,40,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +'2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49,54,58,63,66,,,,,1,,,21,26', +',,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,,,,74,4,9,15,19', +'24,,,,40,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,7,,,,30,,36,39,11,48,,29,32', +'35,41,44,49,54,58,63,66,,,,,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12', +',22,,33,37,,45,,51,56,,,,,,74,4,9,15,19,24,,,,40,47,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49,54,58,63,66,,', +',,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,,', +',74,4,9,15,19,24,,,,40,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,7,,,,30,,36', +'39,11,48,,29,32,35,41,44,49,54,58,63,66,,,,,1,,,21,26,,,,,43,,,55,59', +'67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,,,,74,4,9,15,19,24,,,,40,47,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49', +'54,58,63,66,,,,,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,', +'45,,51,56,114,,,,,74,4,9,15,19,24,,,,40,47,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49,54,58,63,66,,,,,1,,,21', +'26,,,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,,,,74,4,9,15', +'19,24,,,,40,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,7,,,,30,,36,39,11,48,,29', +'32,35,41,44,49,54,58,63,66,,,,,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6', +'12,,22,,33,37,,45,,51,56,,,,,,74,4,9,15,19,24,,,,40,47,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49,54,58,63,66', +',,,,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,,45,,51,56,,', +',,,74,4,9,15,19,24,,,,40,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,7,,,,30,,36', +'39,11,48,,29,32,35,41,44,49,54,58,63,66,,,,,1,,,21,26,,,,,43,,,55,59', +'67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,,,,74,4,9,15,19,24,,,,40,47,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49', +'54,58,63,66,,,,,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,', +'45,,51,56,,,,,,74,4,9,15,19,24,,,,40,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +'2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49,54,58,63,66,,,,,1,,,21,26', +',,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,,,,74,4,9,15,19', +'24,,,,40,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,7,,,,30,,36,39,11,48,,29,32', +'35,41,44,49,54,58,63,66,,,,,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12', +',22,,33,37,,45,,51,56,61,,,,,74,4,9,15,19,24,,,,40,47,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,2,7,13,17,,30,,36,39,11,48,,29,32,35,41,44,49,54,58,63', +'66,,,,,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,,45,,51,56', +',,,,,74,4,9,15,19,24,,,,40,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,7,,,,30', +',36,39,11,48,,29,32,35,41,44,49,54,58,63,66,,,,,1,,,21,26,,,,,43,,,55', +'59,67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,,,,74,4,9,15,19,24,,,,40,47', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49', +'54,58,63,66,,,,,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,', +'45,,51,56,,,,,,74,4,9,15,19,24,,,,40,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +'2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49,54,58,63,66,,,,,1,,,21,26', +',,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,,,,74,4,9,15,19', +'24,,,,40,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,7,,,,30,,36,39,11,48,,29,32', +'35,41,44,49,54,58,63,66,,,,,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12', +',22,,33,37,,45,,51,56,,,,,,74,4,9,15,19,24,,,,40,47,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49,54,58,63,66,,', +',,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,,', +',74,4,9,15,19,24,,,,40,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,7,,,,30,,36', +'39,11,48,,29,32,35,41,44,49,54,58,63,66,,,,,1,,,21,26,,,,,43,,,55,59', +'67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,136,,144,74,4,9,15,19,24,,,,40', +'47,,,,,,,,,,,,,,,,,,,132,138,,,,152,,,,166,2,7,,,,30,,36,39,163,48,', +',,,,151,155,158,161,165,169,131,135,140,143,147,150,154,157,160,164', +'168,130,134,139,142,146,149,153,156,159,162,167,129,133,137,141,145', +'148,136,,144,,,,,,,,322,,,,,,,,,,,,,,,,,,,,,,132,138,,,,152,,,,166,', +',,,,,,,,163,,,,,,,151,155,158,161,165,169,131,135,140,143,147,150,154', +'157,160,164,168,130,134,139,142,146,149,153,156,159,162,167,129,133', +'137,141,145,148,29,32,35,41,44,49,54,58,63,66,316,,,,1,,,21,26,,,,,43', +',,55,59,67,,,,,,,12,,22,,33,37,,45,,51,56,,,,,,74,4,9,15,19,24,,,,40', +'47,,,,,29,32,35,41,44,49,54,58,63,66,,,,,1,,,21,26,,,,,43,2,7,55,59', +'67,30,,36,39,,48,12,,22,,33,37,,45,,51,56,,,,,,74,4,9,15,19,24,,,,40', +'47,,,,29,32,35,41,44,49,54,58,63,66,,,,,,,,,,,,,,,,2,7,59,67,,30,,36', +'39,,48,,,,,,,45,,,56,,,,,,,,,,,,,,,,,,,29,32,35,41,44,49,54,58,63,66', +',,,,1,,,21,26,,,,,43,,,55,59,67,68,,30,,36,39,12,48,22,,33,37,,45,,51', +'56,,,,,,74,4,9,15,19,24,,,,40,47,,,,29,32,35,41,44,49,54,58,63,66,,', +',,,,,,,,,,,,,2,7,59,67,,30,,36,39,,48,,,,,,,45,,,56,,,136,,144,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,132,138,,,,152,,,,166,,,,,,30,,36,39,163,48', +',,,,,151,155,158,161,165,169,131,135,140,143,147,150,154,157,160,164', +'168,130,134,139,142,146,149,153,156,159,162,167,129,133,137,141,145', +'148,136,,144,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,132,138,,,,152,,,,166,,,,', +',,,,,163,,,,,,,151,155,158,161,165,169,131,135,140,143,147,150,154,157', +'160,164,168,130,134,139,142,146,149,153,156,159,162,167,129,133,204', +'141,145,148,136,,144,,,,,,,,,,,,,,,,,,,,,,,321,,,,,,,132,138,,,,152', +',,,166,,,,,,,,,,163,,,,,,,151,155,158,161,165,169,131,135,140,143,147', +'150,154,157,160,164,168,130,134,139,142,146,149,153,156,159,162,167', +'129,133,137,141,145,148,136,,144,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,132,138', +',,,152,,,,166,,,,,,,,,,163,,,,,,,151,155,158,161,165,169,131,135,140', +'143,147,150,154,157,160,164,168,130,134,139,142,146,149,153,156,159', +'162,167,129,133,137,141,145,148,136,,144,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,132,138,,,,152,,,,166,,,,,,,,,,163,,,,,,,151,155,158,161,165,169,131', +'135,140,143,147,150,154,157,160,164,168,130,134,139,142,146,149,153', +'156,159,162,167,129,133,137,141,145,148,136,,144,,,,,,,,,,,,,,,,,,,', +',,,323,,,,,,,132,138,,,,152,,,,166,,,,,,,,,,163,,,,,,,151,155,158,161', +'165,169,131,135,140,143,147,150,154,157,160,164,168,130,134,139,142', +'146,149,153,156,159,162,167,129,133,137,141,145,148,136,,144,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,132,138,,,,152,,,,166,,,,,,,,,,163,,,,,,,151,155', +'158,161,165,169,131,135,140,143,147,150,154,157,160,164,168,130,134', +'139,142,146,149,153,156,159,162,167,129,133,137,141,145,148,136,,144', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,132,138,,,,152,,,,166,,,,,,,,,,163,,,,', +',,151,155,158,161,165,169,131,135,140,143,147,150,154,157,160,164,168', +'130,134,139,142,146,149,153,156,159,162,167,129,133,137,141,145,148', +'136,,144,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,132,138,,,,152,,,,166,,,,,,,,', +',163,,,,,,,151,155,158,161,165,169,131,135,140,143,147,150,154,157,160', +'164,168,130,134,139,142,146,149,153,156,159,162,167,129,133,137,141', +'145,148,136,,144,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,132,138,,,,152,,,,166', +',,,,,,,,,163,,,,,,,151,155,158,161,165,169,131,135,140,143,147,150,154', +'157,160,164,168,130,134,139,142,146,149,153,156,159,162,167,129,133', +'137,141,145,148,136,,144,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,132,138,,,,152', +',,,166,,,,,,,,,,163,,,,,,,151,155,158,161,165,169,131,135,140,143,147', +'150,154,157,160,164,168,130,134,139,142,146,149,153,156,159,162,167', +'129,133,137,141,145,148,136,,144,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,132,138', +',,,152,,,,166,,,,,,,,,,163,,,,,,,151,155,158,161,165,169,131,135,140', +'143,147,150,154,157,160,164,168,130,134,139,142,146,149,153,156,159', +'162,167,129,133,137,141,145,148,136,,144,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,132,138,,,,152,,,,166,,,,,,,,,,163,,,,,,,151,155,158,161,165,169,131', +'135,140,143,147,150,154,157,160,164,168,130,134,139,142,146,149,153', +'156,159,162,167,129,133,137,141,145,148,136,,144,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,132,138,,,,152,,,,166,,,,,,,,,,163,,,,,,,151,155,158,161,165', +'169,131,135,140,143,147,150,154,157,160,164,168,130,134,139,142,146', +'149,153,156,159,162,167,129,133,137,141,145,148,136,,144,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,132,138,,,,152,,,,166,,,,,,,,,,163,,,,,,,151,155,158', +'161,165,169,131,135,140,143,147,150,154,157,160,164,168,130,134,139', +'142,146,149,153,156,159,162,167,129,133,137,141,145,148,136,,144,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,132,138,,,,152,,,,166,,,,,,,,,,163,,,,,,,151', +'155,158,161,165,169,131,135,140,143,147,150,154,157,160,164,168,130', +'134,139,142,146,149,153,156,159,162,167,129,133,137,141,145,148,136', +',144,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,132,138,,,,152,,,,166,,,,,,,,,,163', +',,,,,,151,155,158,161,165,169,131,135,140,143,147,150,154,157,160,164', +'168,130,134,139,142,146,149,153,156,159,162,167,129,133,137,141,145', +'148,136,,144,,,,,,,,,,,,,,,,,,,,,,,273,,,,,,,132,138,,,,152,,,,166,', +',,,,,,,,163,,,,,,,151,155,158,161,165,169,131,135,140,143,147,150,154', +'157,160,164,168,130,134,139,142,146,149,153,156,159,162,167,129,133', +'272,141,145,148,136,,144,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,132,138,,,,152', +',,,166,,,,,,,,185,,163,,,,,,,151,155,158,161,165,169,131,135,140,143', +'147,150,154,157,160,164,168,130,134,139,142,146,149,153,156,159,162', +'167,129,133,137,141,145,148,136,,144,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,132', +'138,,,,152,,,,166,,,,,,,,61,,163,,,,,,,151,155,158,161,165,169,131,135', +'140,143,147,150,154,157,160,164,168,130,134,139,142,146,149,153,156', +'159,162,167,129,133,137,141,145,148,136,,144,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,132,138,,,,152,,,,166,,,,,,,,,,163,,,,,,,151,155,158,161,165,169', +'131,135,140,143,147,150,154,157,160,164,168,130,134,139,142,146,149', +'153,156,159,162,167,129,133,137,141,145,148,136,,144,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,132,138,,,,152,,,,166,,,,,,,,61,,163,,,,,,,151,155,158', +'161,165,169,131,135,140,143,147,150,154,157,160,164,168,130,134,139', +'142,146,149,153,156,159,162,167,129,133,137,141,145,148,132,138,,,,', +',,,166,,,,,,,,,,163,,,,,,,151,155,158,161,165,169,131,135,140,143,147', +'150,154,157,160,164,168,130,134,139,142,146,149,153,156,159,162,167', +'129,133,137,141,145,148,132,138,,,,,,,,166,,,,,,,,,,163,,,,,,,151,155', +'158,161,165,169,131,135,140,143,147,150,154,157,160,164,168,130,134', +'139,142,146,149,153,156,159,162,167,129,133,137,141,145,148,132,138', +',,,,,,,166,,,,,,,,,,163,,,,,,,151,155,158,161,165,169,131,135,140,143', +'147,150,154,157,160,164,168,130,134,139,142,146,149,153,156,159,162', +'167,129,133,137,132,138,,,,,,,,166,,,,,,,,,,163,,,,,,,151,155,158,161', +'165,169,131,135,140,143,147,150,154,157,160,164,168,130,134,139,142', +'146,149,153,156,159,162,167,129,133,137,132,138,,,,,,,,166,,,,,,,,,', +'163,,,,,,,151,155,158,161,165,169,131,135,140,143,147,150,154,157,160', +'164,168,130,134,139,142,146,149,153,156,159,162,167,129,133,137,132', +'138,,,,,,,,166,,,,,,,,,,163,,,,,,,151,155,158,161,165,169,131,135,140', +'143,147,150,154,157,160,164,168,130,134,139,142,146,149,153,156,159', +'162,167,129,133,137,138,,,,,,,,166,,,,,,,,,,163,,,,,,,151,155,158,161', +'165,169,131,135,140,143,147,150,154,157,160,164,168,130,134,139,142', +'146,149,153,156,159,162,167,129,133,137,138,,,,,,,,166,,,,,,,,,,163', +',,,,,,151,155,158,161,165,169,131,135,140,143,147,150,154,157,160,164', +'168,130,134,139,142,146,149,153,156,159,162,167,129,133,137,138,,,,', +',,,166,,,,,,,,,,163,,,,,,,151,155,158,161,165,169,131,135,140,143,147', +'150,154,157,160,164,168,130,134,139,142,146,149,153,156,159,162,167', +'129,133,137,138,,,,,,,,166,,,,,,,,,,163,,,,,,,151,155,158,161,165,169', +'131,135,140,143,147,150,154,157,160,164,168,130,134,139,142,146,149', +'153,156,159,162,167,129,133,137,138,,,,,,,,166,,,,,,,,,,163,,,,,,,151', +'155,158,161,165,169,131,135,140,143,147,150,154,157,160,164,168,130', +'134,139,142,146,149,153,156,159,162,167,129,133,137,166,,,,,,,,,,163', +',,,,,,151,155,158,161,165,169,131,135,140,143,147,150,154,157,160,164', +'168,130,134,139,142,146,149,153,156,159,162,167,129,133,166,,,,,,,,', +',163,,,,,,,151,155,158,161,165,169,131,135,140,143,147,150,154,157,160', +'164,168,130,134,139,142,146,149,153,156,159,162,167,129,133,166,,,,', +',,,,,163,,,,,,,151,155,158,161,165,169,131,135,140,143,147,150,154,157', +'160,164,168,130,134,139,142,146,149,153,156,159,162,167,129,133,163', +',,,,,,151,155,158,161,165,169,131,135,140,143,147,150,154,157,160,164', +'168,130,134,139,142,146,149,153,156,159,162,167,129,133,163,,,,,,,151', +'155,158,161,165,169,131,135,140,143,147,150,154,157,160,164,168,130', +'134,139,142,146,149,153,156,159,162,167,129,133,163,,,,,,,151,155,158', +'161,165,169,131,135,140,143,147,150,154,157,160,164,168,130,134,139', +'142,146,149,153,156,159,162,167,129,133,163,,,,,,,151,155,158,161,165', +'169,131,135,140,143,147,150,154,157,160,164,168,130,134,139,142,146', +'149,153,156,159,162,167,129,133,163,,,,,,,151,155,158,161,165,169,131', +'135,140,143,147,150,154,157,160,164,168,130,134,139,142,146,149,153', +'156,159,162,167,129,133' ] + racc_action_table = arr = Array.new(11069, nil) idx = 0 clist.each do |str| str.split(',', -1).each do |i| @@ -355,351 +386,384 @@ def on_error(error_token_id, error_value, value_stack) end clist = [ -'110,294,110,21,21,21,21,21,21,21,21,21,21,70,70,70,76,248,248,248,208', -'208,70,197,70,263,248,257,248,69,21,21,110,110,208,239,255,110,217,290', -'71,110,239,239,70,21,211,290,21,294,197,110,75,211,211,211,211,211,110', -'110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110', -'110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,70,169', -'76,197,197,197,21,179,21,148,21,110,148,148,148,148,148,148,148,148', -'148,148,212,212,115,112,148,277,188,148,148,105,112,112,179,148,188', -'259,148,148,148,148,308,308,119,119,148,148,278,148,169,148,148,187', -'148,205,148,148,103,103,103,201,103,148,148,148,148,148,148,115,115', -'188,148,148,66,259,105,105,105,179,179,179,105,259,4,200,259,4,4,4,4', -'4,4,4,4,4,4,199,187,187,187,4,148,148,4,4,196,148,291,148,4,148,174', -'4,4,4,4,269,173,188,188,4,4,53,4,269,4,4,236,4,171,4,4,111,111,236,236', -'178,4,4,4,4,4,4,190,178,77,4,4,29,101,92,190,77,77,258,258,29,101,6', -'269,43,6,6,6,6,6,6,6,6,6,6,249,249,249,35,6,4,4,6,6,249,4,249,4,6,4', -'190,6,6,6,6,29,101,29,101,6,6,93,6,95,6,6,83,6,307,6,6,67,67,83,83,98', -'6,6,6,6,6,6,223,286,286,6,6,62,62,223,223,223,223,223,223,223,100,9', -'175,175,9,9,9,9,9,9,9,9,9,9,27,27,27,114,9,6,6,9,9,27,6,27,6,9,6,82', -'9,9,9,9,118,1,82,82,9,9,124,9,129,9,9,79,9,,9,9,,,79,79,,9,9,9,9,9,9', -'220,,,9,9,,,220,220,220,220,220,220,220,,11,,,11,11,11,11,11,11,11,11', -'11,11,84,84,84,,11,9,9,11,11,84,9,84,9,11,9,243,11,11,11,11,,,243,243', -'11,11,,11,,11,11,87,11,,11,11,,,87,87,,11,11,11,11,11,11,215,,,11,11', -',,215,215,215,215,215,215,215,,12,,,12,12,12,12,12,12,12,12,12,12,85', -'85,85,,12,11,11,12,12,85,11,85,11,12,11,109,12,12,12,12,,,109,109,12', -'12,,12,,12,12,172,12,,12,12,,,172,172,,12,12,12,12,12,12,247,,,12,12', -',,247,247,247,247,247,,,,15,,,15,15,15,15,15,15,15,15,15,15,,,,,15,12', -'12,15,15,,12,,12,15,12,,15,15,15,15,,,,,15,15,,15,,15,15,,15,,15,15', -',,,,,15,15,15,15,15,15,,,,15,15,,,,,,,,,,,19,,,19,19,19,19,19,19,19', -'19,19,19,,,,,19,15,15,19,19,,15,,15,19,15,,19,19,19,19,,,,,19,19,,19', -',19,19,,19,,19,19,,,,,,19,19,19,19,19,19,,,,19,19,,,,,,,,,,,130,,,130', -'130,130,130,130,130,130,130,130,130,,,,,130,19,19,130,130,,19,,19,130', -'19,,130,130,130,130,,,,,130,130,,130,,130,130,,130,,130,130,,,,,,130', -'130,130,130,130,130,,,,130,130,,,,,,,,,,,22,,,22,22,22,22,22,22,22,22', -'22,22,,,,,22,130,130,22,22,,130,,130,22,130,,22,22,22,22,,,,,22,22,', -'22,,22,22,,22,,22,22,,,,,,22,22,22,22,22,22,,,,22,22,,,,,,,,,,,24,,', -'24,24,24,24,24,24,24,24,24,24,,,,,24,22,22,24,24,,22,,22,24,22,,24,24', -'24,24,,,,,24,24,,24,,24,24,,24,,24,24,,,,,,24,24,24,24,24,24,,,,24,24', -',,,,,,,,,,133,,,133,133,133,133,133,133,133,133,133,133,,,,,133,24,24', -'133,133,,24,,24,133,24,,133,133,133,133,,,,,133,133,,133,,133,133,,133', -',133,133,,,,,,133,133,133,133,133,133,,,,133,133,,,,,,,,,,,128,,,128', -'128,128,128,128,128,128,128,128,128,,,,,128,133,133,128,128,,133,,133', -'128,133,,128,128,128,128,,,,,128,128,,128,,128,128,,128,,128,128,,,', -',,128,128,128,128,128,128,,,,128,128,,,,,,,,,,,309,,,309,309,309,309', -'309,309,309,309,309,309,,,,,309,128,128,309,309,,128,,128,309,128,,309', -'309,309,309,,,,,309,309,,309,,309,309,,309,,309,309,,,,,,309,309,309', -'309,309,309,,,,309,309,,,,,,,,,,,32,,,32,32,32,32,32,32,32,32,32,32', -',,,,32,309,309,32,32,,309,,309,32,309,,32,32,32,32,,,,,32,32,,32,,32', -'32,,32,,32,32,,,,,,32,32,32,32,32,32,,,,32,32,,,,,,,,,,,34,,,34,34,34', -'34,34,34,34,34,34,34,,,,,34,32,32,34,34,,32,,32,34,32,,34,34,34,34,', -',,,34,34,,34,,34,34,,34,,34,34,34,,,,,34,34,34,34,34,34,,,,34,34,,,', -',,,,,,,127,,,127,127,127,127,127,127,127,127,127,127,,,,,127,34,34,127', -'127,,34,,34,127,34,,127,127,127,127,,,,,127,127,,127,,127,127,,127,', -'127,127,,,,,,127,127,127,127,127,127,,,,127,127,,,,,,,,,,,37,,,37,37', -'37,37,37,37,37,37,37,37,,,,,37,127,127,37,37,,127,,127,37,127,,37,37', -'37,37,,,,,37,37,,37,,37,37,,37,,37,37,,,,,,37,37,37,37,37,37,,,,37,37', -',,,,,,,,,,40,,,40,40,40,40,40,40,40,40,40,40,,,,,40,37,37,40,40,,37', -',37,40,37,,40,40,40,40,,,,,40,40,,40,,40,40,,40,,40,40,,,,,,40,40,40', -'40,40,40,,,,40,40,,,,,,,,,,,126,,,126,126,126,126,126,126,126,126,126', -'126,,,,,126,40,40,126,126,,40,,40,126,40,,126,126,126,126,,,,,126,126', -',126,,126,126,,126,,126,126,,,,,,126,126,126,126,126,126,,,,126,126', -',,,,,,,,,,46,,,46,46,46,46,46,46,46,46,46,46,,,,,46,126,126,46,46,,126', -',126,46,126,,46,46,46,46,,,,,46,46,,46,,46,46,,46,,46,46,,,,,,46,46', -'46,46,46,46,,,,46,46,,,,,,,,,,,52,,,52,52,52,52,52,52,52,52,52,52,,', -',,52,46,46,52,52,,46,,46,52,46,,52,52,52,52,,,,,52,52,,52,,52,52,,52', -',52,52,,,,,,52,52,52,52,52,52,,,,52,52,,,,,,,,,,,296,,,296,296,296,296', -'296,296,296,296,296,296,,,,,296,52,52,296,296,,52,,52,296,52,,296,296', -'296,296,,,,,296,296,,296,,296,296,,296,,296,296,,,,,,296,296,296,296', -'296,296,,,,296,296,,,,,,,,,,,59,,,59,59,59,59,59,59,59,59,59,59,296', -',,,59,296,296,59,59,,296,,296,59,296,,59,59,59,59,,,,,59,59,,59,,59', -'59,,59,,59,59,,59,,,,59,59,59,59,59,59,,,,59,59,,,,,,,,,,,285,,,285', -'285,285,285,285,285,285,285,285,285,,,,,285,59,59,285,285,,59,,59,285', -'59,,285,285,285,285,,,,,285,285,,285,,285,285,,285,,285,285,,,,,,285', -'285,285,285,285,285,,,,285,285,,,,,,,,,,,284,,,284,284,284,284,284,284', -'284,284,284,284,,,,,284,285,285,284,284,,285,,285,284,285,,284,284,284', -'284,,,,,284,284,,284,,284,284,,284,,284,284,,,,,,284,284,284,284,284', -'284,,,,284,284,,,,,,,,,,,275,,,275,275,275,275,275,275,275,275,275,275', -',,,,275,284,284,275,275,,284,,284,275,284,,275,275,275,275,,,,,275,275', -',275,,275,275,,275,,275,275,,,,,,275,275,275,275,275,275,,,,275,275', -',,,,,,,,,,272,,,272,272,272,272,272,272,272,272,272,272,275,,,,272,275', -'275,272,272,,275,,275,272,275,,272,272,272,272,,,,,272,272,,272,,272', -'272,,272,,272,272,,,,,,272,272,272,272,272,272,,,,272,272,,,,,,,,,,', -'271,,,271,271,271,271,271,271,271,271,271,271,,,,,271,272,272,271,271', -',272,,272,271,272,,271,271,271,271,,,,,271,271,,271,,271,271,,271,,271', -'271,,,,,,271,271,271,271,271,271,,,,271,271,,,,,,,,,,,261,,,261,261', -'261,261,261,261,261,261,261,261,,,,,261,271,271,261,261,,271,,271,261', -'271,,261,261,261,261,,,,,261,261,,261,,261,261,,261,,261,261,,,,,,261', -'261,261,261,261,261,,,,261,261,,,,,,,,,,,207,,,207,207,207,207,207,207', -'207,207,207,207,,,,,207,261,261,207,207,,261,,261,207,261,,207,207,207', -'207,,,,,207,207,,207,,207,207,,207,,207,207,,,,,,207,207,207,207,207', -'207,,,,207,207,,,,,,,,,,,73,,,73,73,73,73,73,73,73,73,73,73,,,,,73,207', -'207,73,73,,207,,207,73,207,,73,73,73,73,,,,,73,73,,73,,73,73,,73,,73', -'73,,,,,,73,73,73,73,73,73,,,,73,73,,,,,,,,,,,206,,,206,206,206,206,206', -'206,206,206,206,206,,,,,206,73,73,206,206,,73,,73,206,73,,206,206,206', -'206,,,,,206,206,,206,,206,206,,206,,206,206,,,,,,206,206,206,206,206', -'206,,,,206,206,,,,,,,,,,,194,,,194,194,194,194,194,194,194,194,194,194', -',,,,194,206,206,194,194,,206,,206,194,206,,194,194,194,194,,,,,194,194', -',194,,194,194,,194,,194,194,,,,,,194,194,194,194,194,194,,,,194,194', -',,,,,,,,,,191,,,191,191,191,191,191,191,191,191,191,191,,,,,191,194', -'194,191,191,,194,,194,191,194,,191,191,191,191,,,,,191,191,,191,,191', -'191,,191,,191,191,191,,,,,191,191,191,191,191,191,232,,,191,191,,,232', -'232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232', -'232,232,232,,,,,,191,191,191,191,,191,,191,186,191,,186,186,186,186', -'186,186,186,186,186,186,,,,,186,,,186,186,,,,,186,,,186,186,186,186', -',,,,186,186,,186,,186,186,,186,,186,186,,,,,,186,186,186,186,186,186', -',,,186,186,,,,,,,,,,,185,,,185,185,185,185,185,185,185,185,185,185,', -',,,185,186,186,185,185,,186,,186,185,186,,185,185,185,185,,,,,185,185', -',185,,185,185,,185,,185,185,,,,,,185,185,185,185,185,185,,,,185,185', -',,,,,,,,,,166,,,166,166,166,166,166,166,166,166,166,166,,,,,166,185', -'185,166,166,,185,,185,166,185,,166,166,166,166,,,,,166,166,,166,,166', -'166,,166,,166,166,,,,,,166,166,166,166,166,166,,,,166,166,,,,,,,,,,', -'132,,,132,132,132,132,132,132,132,132,132,132,,,,,132,166,166,132,132', -',166,,166,132,166,,132,132,132,132,,,,,132,132,,132,,132,132,,132,,132', -'132,,,,,,132,132,132,132,132,132,,,,132,132,,,,,,,,,,,161,,,161,161', -'161,161,161,161,161,161,161,161,,,,,161,132,132,161,161,,132,,132,161', -'132,,161,161,161,161,,,,,161,161,,161,,161,161,,161,,161,161,,,,,,161', -'161,161,161,161,161,,,,161,161,,,,,,,,,,,160,,,160,160,160,160,160,160', -'160,160,160,160,,,,,160,161,161,160,160,,161,,161,160,161,,160,160,160', +'120,84,120,163,163,163,163,163,163,163,163,163,163,73,73,73,207,163', +'78,206,163,163,73,272,73,36,163,119,293,163,163,163,120,120,119,119', +'293,120,163,205,163,120,163,163,73,163,204,163,163,294,84,120,261,261', +'163,163,163,163,120,120,120,120,120,120,120,120,120,120,120,120,120', +'120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120', +'120,120,120,120,73,163,163,68,78,294,163,198,163,163,103,163,120,103', +'103,103,103,103,103,103,103,103,103,211,192,115,280,103,219,219,103', +'103,214,214,198,186,103,263,281,103,103,103,103,186,191,60,214,103,103', +'124,103,192,103,103,117,103,37,103,103,103,177,117,117,224,103,103,103', +'103,103,103,115,115,115,103,103,263,185,115,186,198,198,198,260,263', +'185,30,263,311,311,191,191,191,99,30,124,124,192,192,192,174,99,118', +'118,103,103,75,174,174,103,77,103,103,4,103,81,4,4,4,4,4,4,4,4,4,4,296', +'186,186,30,4,30,188,4,4,5,99,97,99,4,188,266,4,4,4,4,289,289,98,266', +'4,4,106,4,107,4,4,243,4,108,4,4,70,70,243,243,94,4,4,4,4,4,4,94,94,188', +'4,4,226,96,96,96,258,96,266,226,226,226,226,226,226,226,226,226,226', +'226,226,226,226,226,226,226,226,226,226,226,4,4,178,178,1,4,43,4,4,300', +'4,312,300,300,300,300,300,300,300,300,300,300,91,91,91,137,300,71,71', +'300,300,91,122,91,132,300,90,125,300,300,300,300,176,90,90,,300,300', +',300,,300,300,246,300,,300,300,126,126,246,246,,300,300,300,300,300', +'300,236,,,300,300,,,236,236,236,236,236,236,236,236,236,236,236,236', +'236,236,236,236,236,236,236,236,236,300,86,,,,300,300,,86,86,300,,300', +'300,6,300,,6,6,6,6,6,6,6,6,6,6,34,34,34,,6,,,6,6,34,,34,,6,250,,6,6', +'6,6,,250,250,,6,6,,6,,6,6,79,6,,6,6,,,79,79,,6,6,6,6,6,6,229,,,6,6,', +',229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229', +'229,229,229,229,92,92,92,,,6,6,,,92,6,92,6,6,9,6,,9,9,9,9,9,9,9,9,9', +'9,255,255,255,,9,,,9,9,255,,255,,9,89,,9,9,9,9,,89,89,,9,9,,9,,9,9,', +'9,,9,9,,,,,,9,9,9,9,9,9,217,,,9,9,,,217,217,217,217,217,217,217,217', +'217,217,217,217,217,217,217,217,217,217,217,217,217,256,256,256,,,9', +'9,,,256,9,256,9,9,11,9,,11,11,11,11,11,11,11,11,11,11,,,,,11,,,11,11', +',,,,11,,,11,11,11,11,,,,,11,11,,11,,11,11,,11,,11,11,,,,,,11,11,11,11', +'11,11,241,,,11,11,,,241,241,241,241,241,241,241,241,241,241,241,241', +'241,241,241,241,241,241,241,241,241,,,,,,11,11,,,,11,,11,11,12,11,,12', +'12,12,12,12,12,12,12,12,12,,,,,12,,,12,12,,,,,12,,,12,12,12,12,,,,,12', +'12,,12,,12,12,,12,,12,12,,,,,,12,12,12,12,12,12,221,,,12,12,,,221,221', +'221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221', +'221,221,,,,,,12,12,,,,12,,12,12,15,12,,15,15,15,15,15,15,15,15,15,15', +',,,,15,,,15,15,,,,,15,,,15,15,15,15,,,,,15,15,,15,,15,15,,15,,15,15', +',,,,,15,15,15,15,15,15,233,,,15,15,,,233,233,233,233,233,233,233,233', +'233,233,233,233,233,233,233,233,233,233,233,233,233,,,,,,15,15,,,,15', +',15,15,19,15,,19,19,19,19,19,19,19,19,19,19,,,,,19,,,19,19,,,,,19,,', +'19,19,19,19,,,,,19,19,,19,,19,19,,19,,19,19,,,,,,19,19,19,19,19,19,239', +',,19,19,,,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239', +'239,239,239,239,239,239,,,,,,19,19,,,,19,,19,19,288,19,,288,288,288', +'288,288,288,288,288,288,288,,,,,288,,,288,288,,,,,288,,,288,288,288', +'288,,,,,288,288,,288,,288,288,,288,,288,288,,,,,,288,288,288,288,288', +'288,242,,,288,288,,,242,242,242,242,242,242,242,242,242,242,242,242', +'242,218,,,,,,,218,218,218,218,218,,288,288,,,,288,,288,288,22,288,,22', +'22,22,22,22,22,22,22,22,22,,,,,22,,,22,22,,,,,22,,,22,22,22,22,,,,,22', +'22,,22,,22,22,,22,,22,22,,,,,,22,22,22,22,22,22,249,,,22,22,,,249,249', +'249,249,249,249,249,249,249,249,249,249,249,254,,,,,,,254,254,254,254', +'254,,22,22,,,,22,,22,22,24,22,,24,24,24,24,24,24,24,24,24,24,,,,,24', +',,24,24,,,,,24,,,24,24,24,24,,,,,24,24,,24,,24,24,,24,,24,24,,,,,,24', +'24,24,24,24,24,245,,,24,24,,,245,245,245,245,245,245,245,245,245,245', +'245,245,245,,,,,,,,,,,,,,24,24,,,,24,,24,24,287,24,,287,287,287,287', +'287,287,287,287,287,287,,,,,287,,,287,287,,,,,287,,,287,287,287,287', +',,,,287,287,,287,,287,287,,287,,287,287,,,,,,287,287,287,287,287,287', +'253,,,287,287,,,253,253,253,253,253,253,253,253,253,253,253,253,253', +',,,,,,,,,,,,,287,287,,,,287,,287,287,279,287,,279,279,279,279,279,279', +'279,279,279,279,,,,,279,,,279,279,,,,,279,,,279,279,279,279,,,,,279', +'279,,279,,279,279,,279,,279,279,,,,,,279,279,279,279,279,279,237,,,279', +'279,,,237,237,237,237,237,237,237,237,237,237,,,,,,,,,,,,279,,,,,279', +'279,,,,279,,279,279,33,279,,33,33,33,33,33,33,33,33,33,33,,,,,33,,,33', +'33,,,,,33,,,33,33,33,33,,,,,33,33,,33,,33,33,,33,,33,33,,,,,,33,33,33', +'33,33,33,240,,,33,33,,,240,240,240,240,240,240,240,240,240,240,227,', +',,,,,227,227,227,227,227,227,227,,,33,33,,,,33,,33,33,276,33,,276,276', +'276,276,276,276,276,276,276,276,,,,,276,,,276,276,,,,,276,,,276,276', +'276,276,,,,,276,276,,276,,276,276,,276,,276,276,,,,,,276,276,276,276', +'276,276,234,,,276,276,,,234,234,234,234,234,234,234,234,234,234,222', +',,,,,,222,222,222,222,222,222,222,,,276,276,,,,276,,276,276,275,276', +',275,275,275,275,275,275,275,275,275,275,,,,,275,,,275,275,,,,,275,', +',275,275,275,275,,,,,275,275,,275,,275,275,,275,,275,275,,,,,,275,275', +'275,275,275,275,230,,,275,275,,,230,230,230,230,230,230,230,,,,,,,,', +',,,,,,,,,,,275,275,,,,275,,275,275,262,275,,262,262,262,262,262,262', +'262,262,262,262,,,,,262,,,262,262,,,,,262,,,262,262,262,262,,,,,262', +'262,,262,,262,262,,262,,262,262,,,,,,262,262,262,262,262,262,,,,262', +'262,,,,,,,,,,,,,,,,,,,,,,,,,,,,,262,262,,,,262,,262,262,39,262,,39,39', +'39,39,39,39,39,39,39,39,,,,,39,,,39,39,,,,,39,,,39,39,39,39,,,,,39,39', +',39,,39,39,,39,,39,39,39,,,,,39,39,39,39,39,39,,,,39,39,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,39,39,,,,39,,39,39,40,39,,40,40,40,40,40,40,40,40,40', +'40,,,,,40,,,40,40,,,,,40,,,40,40,40,40,,,,,40,40,,40,,40,40,,40,,40', +'40,,,,,,40,40,40,40,40,40,,,,40,40,,,,,,,,,,,,,,,,,,,,,,,,,,,,,40,40', +',,,40,,40,40,129,40,,129,129,129,129,129,129,129,129,129,129,,,,,129', +',,129,129,,,,,129,,,129,129,129,129,,,,,129,129,,129,,129,129,,129,', +'129,129,,,,,,129,129,129,129,129,129,,,,129,129,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,129,129,,,,129,,129,129,47,129,,47,47,47,47,47,47,47,47,47,47', +',,,,47,,,47,47,,,,,47,,,47,47,47,47,,,,,47,47,,47,,47,47,,47,,47,47', +',,,,,47,47,47,47,47,47,,,,47,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,,47,47,,', +',47,,47,47,48,47,,48,48,48,48,48,48,48,48,48,48,,,,,48,,,48,48,,,,,48', +',,48,48,48,48,,,,,48,48,,48,,48,48,,48,,48,48,,,,,,48,48,48,48,48,48', +',,,48,48,,,,,,,,,,,,,,,,,,,,,,,,,,,,,48,48,,,,48,,48,48,55,48,,55,55', +'55,55,55,55,55,55,55,55,,,,,55,,,55,55,,,,,55,,,55,55,55,55,,,,,55,55', +',55,,55,55,,55,,55,55,,,,,,55,55,55,55,55,55,,,,55,55,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,55,55,,,,55,,55,55,212,55,,212,212,212,212,212,212,212', +'212,212,212,,,,,212,,,212,212,,,,,212,,,212,212,212,212,,,,,212,212', +',212,,212,212,,212,,212,212,,,,,,212,212,212,212,212,212,,,,212,212', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,212,212,,,,212,,212,212,61,212,,61,61,61', +'61,61,61,61,61,61,61,,,,,61,,,61,61,,,,,61,,,61,61,61,61,,,,,61,61,', +'61,,61,61,,61,,61,61,,61,,,,61,61,61,61,61,61,,,,61,61,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,61,61,,,,61,,61,61,203,61,,203,203,203,203,203,203,203', +'203,203,203,,,,,203,,,203,203,,,,,203,,,203,203,203,203,,,,,203,203', +',203,,203,203,,203,,203,203,,,,,,203,203,203,203,203,203,,,,203,203', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,203,203,,,,203,,203,203,200,203,,200,200', +'200,200,200,200,200,200,200,200,,,,,200,,,200,200,,,,,200,,,200,200', +'200,200,,,,,200,200,,200,,200,200,,200,,200,200,200,,,,,200,200,200', +'200,200,200,,,,200,200,,,,,,,,,,,,,,,,,,,,,,,,,,,,,200,200,200,200,', +'200,,200,200,190,200,,190,190,190,190,190,190,190,190,190,190,,,,,190', +',,190,190,,,,,190,,,190,190,190,190,,,,,190,190,,190,,190,190,,190,', +'190,190,,,,,,190,190,190,190,190,190,,,,190,190,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,190,190,,,,190,,190,190,189,190,,189,189,189,189,189,189,189', +'189,189,189,,,,,189,,,189,189,,,,,189,,,189,189,189,189,,,,,189,189', +',189,,189,189,,189,,189,189,,,,,,189,189,189,189,189,189,,,,189,189', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,189,189,,,,189,,189,189,172,189,,172,172', +'172,172,172,172,172,172,172,172,,,,,172,,,172,172,,,,,172,,,172,172', +'172,172,,,,,172,172,,172,,172,172,,172,,172,172,,,,,,172,172,172,172', +'172,172,,,,172,172,,,,,,,,,,,,,,,,,,,,,,,,,,,,,172,172,,,,172,,172,172', +'74,172,,74,74,74,74,74,74,74,74,74,74,,,,,74,,,74,74,,,,,74,,,74,74', +'74,74,,,,,74,74,,74,,74,74,,74,,74,74,,,,,,74,74,74,74,74,74,,,,74,74', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,74,74,,,,74,,74,74,169,74,,169,169,169,169', +'169,169,169,169,169,169,,,,,169,,,169,169,,,,,169,,,169,169,169,169', +',,,,169,169,,169,,169,169,,169,,169,169,,,,,,169,169,169,169,169,169', +',,,169,169,,,,,,,,,,,,,,,,,,,,,,,,,,,,,169,169,,,,169,,169,169,168,169', +',168,168,168,168,168,168,168,168,168,168,,,,,168,,,168,168,,,,,168,', +',168,168,168,168,,,,,168,168,,168,,168,168,,168,,168,168,,,,,,168,168', +'168,168,168,168,,,,168,168,,,,,,,,,,,,,,,,,,,,,,,,,,,,,168,168,,,,168', +',168,168,167,168,,167,167,167,167,167,167,167,167,167,167,,,,,167,,', +'167,167,,,,,167,,,167,167,167,167,,,,,167,167,,167,,167,167,,167,,167', +'167,,,,,,167,167,167,167,167,167,,,,167,167,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,167,167,,,,167,,167,167,166,167,,166,166,166,166,166,166,166,166', +'166,166,,,,,166,,,166,166,,,,,166,,,166,166,166,166,,,,,166,166,,166', +',166,166,,166,,166,166,,,,,,166,166,166,166,166,166,,,,166,166,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,166,166,,,,166,,166,166,165,166,,165,165,165', +'165,165,165,165,165,165,165,,,,,165,,,165,165,,,,,165,,,165,165,165', +'165,,,,,165,165,,165,,165,165,,165,,165,165,,,,,,165,165,165,165,165', +'165,,,,165,165,,,,,,,,,,,,,,,,,,,,,,,,,,,,,165,165,,,,165,,165,165,164', +'165,,164,164,164,164,164,164,164,164,164,164,,,,,164,,,164,164,,,,,164', +',,164,164,164,164,,,,,164,164,,164,,164,164,,164,,164,164,,,,,,164,164', +'164,164,164,164,,,,164,164,,,,,,,,,,,,,,,,,,,,,,,,,,,,,164,164,,,,164', +',164,164,162,164,,162,162,162,162,162,162,162,162,162,162,,,,,162,,', +'162,162,,,,,162,,,162,162,162,162,,,,,162,162,,162,,162,162,,162,,162', +'162,,,,,,162,162,162,162,162,162,,,,162,162,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,162,162,,,,162,,162,162,161,162,,161,161,161,161,161,161,161,161', +'161,161,,,,,161,,,161,161,,,,,161,,,161,161,161,161,,,,,161,161,,161', +',161,161,,161,,161,161,,,,,,161,161,161,161,161,161,,,,161,161,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,161,161,,,,161,,161,161,160,161,,160,160,160', +'160,160,160,160,160,160,160,,,,,160,,,160,160,,,,,160,,,160,160,160', '160,,,,,160,160,,160,,160,160,,160,,160,160,,,,,,160,160,160,160,160', -'160,,,,160,160,,,,,,,,,,,159,,,159,159,159,159,159,159,159,159,159,159', -',,,,159,160,160,159,159,,160,,160,159,160,,159,159,159,159,,,,,159,159', -',159,,159,159,,159,,159,159,,,,,,159,159,159,159,159,159,,,,159,159', -',,,,,,,,,,158,,,158,158,158,158,158,158,158,158,158,158,,,,,158,159', -'159,158,158,,159,,159,158,159,,158,158,158,158,,,,,158,158,,158,,158', -'158,,158,,158,158,,,,,,158,158,158,158,158,158,,,,158,158,,,,,,,,,,', -'157,,,157,157,157,157,157,157,157,157,157,157,,,,,157,158,158,157,157', -',158,,158,157,158,,157,157,157,157,,,,,157,157,,157,,157,157,,157,,157', -'157,,,,,,157,157,157,157,157,157,,,,157,157,,,,,,,,,,,156,,,156,156', -'156,156,156,156,156,156,156,156,,,,,156,157,157,156,156,,157,,157,156', -'157,,156,156,156,156,,,,,156,156,,156,,156,156,,156,,156,156,,,,,,156', -'156,156,156,156,156,,,,156,156,,,,,,,,,,,125,,,125,125,125,125,125,125', -'125,125,125,125,,,,,125,156,156,125,125,,156,,156,125,156,,125,125,125', -'125,,,,,125,125,,125,,125,125,,125,,125,125,,,,,,125,125,125,125,125', -'125,,,,125,125,,,,,,,,,,,90,,,90,90,90,90,90,90,90,90,90,90,,,,,90,125', -'125,90,90,,125,,125,90,125,,90,90,90,90,,,,,90,90,,90,,90,90,,90,,90', -'90,90,,,,,90,90,90,90,90,90,,,,90,90,,,,,,,,,,,91,,,91,91,91,91,91,91', -'91,91,91,91,,,,,91,90,90,91,91,,90,,90,91,90,,91,91,91,91,,,,,91,91', -',91,,91,91,,91,,91,91,,,,,,91,91,91,91,91,91,,,,91,91,,,,,,,,,,,154', -',,154,154,154,154,154,154,154,154,154,154,,,,,154,91,91,154,154,,91', -',91,154,91,,154,154,154,154,,,,,154,154,,154,,154,154,,154,,154,154', -',,,,,154,154,154,154,154,154,,,,154,154,,,,,,,,,,,153,,,153,153,153', -'153,153,153,153,153,153,153,,,,,153,154,154,153,153,,154,,154,153,154', -',153,153,153,153,,,,,153,153,,153,,153,153,,153,,153,153,,,,,,153,153', -'153,153,153,153,,,,153,153,,,,,,,,,,,152,,,152,152,152,152,152,152,152', -'152,152,152,,,,,152,153,153,152,152,,153,,153,152,153,,152,152,152,152', -',,,,152,152,,152,,152,152,,152,,152,152,,,,,,152,152,152,152,152,152', -',,,152,152,,,,,,,,,,,151,,,151,151,151,151,151,151,151,151,151,151,', -',,,151,152,152,151,151,,152,,152,151,152,,151,151,151,151,,,,,151,151', -',151,,151,151,,151,,151,151,,,,,,151,151,151,151,151,151,,,,151,151', -',,,,,,,,,,150,,,150,150,150,150,150,150,150,150,150,150,,,,,150,151', -'151,150,150,,151,,151,150,151,,150,150,150,150,,,,,150,150,,150,,150', -'150,,150,,150,150,,,,,,150,150,150,150,150,150,,,,150,150,,,,,,,,,,', -'149,,,149,149,149,149,149,149,149,149,149,149,,,,,149,150,150,149,149', -',150,,150,149,150,,149,149,149,149,,,,,149,149,,149,,149,149,,149,,149', -'149,,,,,,149,149,149,149,149,149,,,,149,149,,,,,,,,,,,131,,,131,131', -'131,131,131,131,131,131,131,131,,,,,131,149,149,131,131,,149,,149,131', -'149,,131,131,131,131,,,,,131,131,,131,,131,131,,131,,131,131,,,,,,131', -'131,131,131,131,131,,,,131,131,,,,,,,,,,,146,,,146,146,146,146,146,146', -'146,146,146,146,,,,,146,131,131,146,146,,131,,131,146,131,,146,146,146', +'160,,,,160,160,,,,,,,,,,,,,,,,,,,,,,,,,,,,,160,160,,,,160,,160,160,159', +'160,,159,159,159,159,159,159,159,159,159,159,,,,,159,,,159,159,,,,,159', +',,159,159,159,159,,,,,159,159,,159,,159,159,,159,,159,159,,,,,,159,159', +'159,159,159,159,,,,159,159,,,,,,,,,,,,,,,,,,,,,,,,,,,,,159,159,,,,159', +',159,159,158,159,,158,158,158,158,158,158,158,158,158,158,,,,,158,,', +'158,158,,,,,158,,,158,158,158,158,,,,,158,158,,158,,158,158,,158,,158', +'158,,,,,,158,158,158,158,158,158,,,,158,158,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,158,158,,,,158,,158,158,157,158,,157,157,157,157,157,157,157,157', +'157,157,,,,,157,,,157,157,,,,,157,,,157,157,157,157,,,,,157,157,,157', +',157,157,,157,,157,157,,,,,,157,157,157,157,157,157,,,,157,157,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,157,157,,,,157,,157,157,156,157,,156,156,156', +'156,156,156,156,156,156,156,,,,,156,,,156,156,,,,,156,,,156,156,156', +'156,,,,,156,156,,156,,156,156,,156,,156,156,,,,,,156,156,156,156,156', +'156,,,,156,156,,,,,,,,,,,,,,,,,,,,,,,,,,,,,156,156,,,,156,,156,156,154', +'156,,154,154,154,154,154,154,154,154,154,154,,,,,154,,,154,154,,,,,154', +',,154,154,154,154,,,,,154,154,,154,,154,154,,154,,154,154,,,,,,154,154', +'154,154,154,154,,,,154,154,,,,,,,,,,,,,,,,,,,,,,,,,,,,,154,154,,,,154', +',154,154,153,154,,153,153,153,153,153,153,153,153,153,153,,,,,153,,', +'153,153,,,,,153,,,153,153,153,153,,,,,153,153,,153,,153,153,,153,,153', +'153,,,,,,153,153,153,153,153,153,,,,153,153,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,153,153,,,,153,,153,153,152,153,,152,152,152,152,152,152,152,152', +'152,152,,,,,152,,,152,152,,,,,152,,,152,152,152,152,,,,,152,152,,152', +',152,152,,152,,152,152,,,,,,152,152,152,152,152,152,,,,152,152,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,152,152,,,,152,,152,152,150,152,,150,150,150', +'150,150,150,150,150,150,150,,,,,150,,,150,150,,,,,150,,,150,150,150', +'150,,,,,150,150,,150,,150,150,,150,,150,150,,,,,,150,150,150,150,150', +'150,,,,150,150,,,,,,,,,,,,,,,,,,,,,,,,,,,,,150,150,,,,150,,150,150,149', +'150,,149,149,149,149,149,149,149,149,149,149,,,,,149,,,149,149,,,,,149', +',,149,149,149,149,,,,,149,149,,149,,149,149,,149,,149,149,,,,,,149,149', +'149,149,149,149,,,,149,149,,,,,,,,,,,,,,,,,,,,,,,,,,,,,149,149,,,,149', +',149,149,148,149,,148,148,148,148,148,148,148,148,148,148,,,,,148,,', +'148,148,,,,,148,,,148,148,148,148,,,,,148,148,,148,,148,148,,148,,148', +'148,,,,,,148,148,148,148,148,148,,,,148,148,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,148,148,,,,148,,148,148,147,148,,147,147,147,147,147,147,147,147', +'147,147,,,,,147,,,147,147,,,,,147,,,147,147,147,147,,,,,147,147,,147', +',147,147,,147,,147,147,,,,,,147,147,147,147,147,147,,,,147,147,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,147,147,,,,147,,147,147,146,147,,146,146,146', +'146,146,146,146,146,146,146,,,,,146,,,146,146,,,,,146,,,146,146,146', '146,,,,,146,146,,146,,146,146,,146,,146,146,,,,,,146,146,146,146,146', -'146,,,,146,146,,,,,,,,,,,145,,,145,145,145,145,145,145,145,145,145,145', -',,,,145,146,146,145,145,,146,,146,145,146,,145,145,145,145,,,,,145,145', -',145,,145,145,,145,,145,145,,,,,,145,145,145,145,145,145,,,,145,145', -',,,,,,,,,,106,,,106,106,106,106,106,106,106,106,106,106,,,,,106,145', -'145,106,106,,145,,145,106,145,,106,106,106,106,,,,,106,106,,106,,106', -'106,,106,,106,106,,,,,,106,106,106,106,106,106,,,,106,106,,,,,,,,,,', -'144,,,144,144,144,144,144,144,144,144,144,144,,,,,144,106,106,144,144', -',106,,106,144,106,,144,144,144,144,,,,,144,144,,144,,144,144,,144,,144', -'144,,,,,,144,144,144,144,144,144,,,,144,144,,,,,,,,,,,108,,,108,108', -'108,108,108,108,108,108,108,108,,,,,108,144,144,108,108,,144,,144,108', -'144,,108,108,108,108,,,,,108,108,,108,,108,108,,108,,108,108,108,,,', -',108,108,108,108,108,108,,,,108,108,,,,,,,,,,,134,,,134,134,134,134', -'134,134,134,134,134,134,,,,,134,108,108,134,134,,108,,108,134,108,,134', -'134,134,134,,,,,134,134,,134,,134,134,,134,,134,134,,,,,,134,134,134', -'134,134,134,,,,134,134,,,,,,,,,,,0,,,0,0,0,0,0,0,0,0,0,0,,,,,0,134,134', -'0,0,,134,,134,0,134,,0,0,0,0,,,,,0,0,,0,,0,0,,0,,0,0,0,,,,,0,0,0,0,0', -'0,219,,,0,0,,,219,219,219,219,219,219,219,219,219,219,219,219,219,219', -'219,219,219,219,219,219,219,,,,,,0,0,0,0,,0,,0,141,0,,141,141,141,141', -'141,141,141,141,141,141,,,,,141,,,141,141,,,,,141,,,141,141,141,141', -',,,,141,141,,141,,141,141,,141,,141,141,,,,,,141,141,141,141,141,141', -',,,141,141,,,,,,,,,,,140,,,140,140,140,140,140,140,140,140,140,140,', -',,,140,141,141,140,140,,141,,141,140,141,,140,140,140,140,,,,,140,140', -',140,,140,140,,140,,140,140,,,,,,140,140,140,140,140,140,,,,140,140', -',,,,,,,,,,139,,,139,139,139,139,139,139,139,139,139,139,,,,,139,140', -'140,139,139,,140,,140,139,140,,139,139,139,139,,,,,139,139,,139,,139', -'139,,139,,139,139,,,,,,139,139,139,139,139,139,,,,139,139,,,,,,,,,,', -'138,,,138,138,138,138,138,138,138,138,138,138,,,,,138,139,139,138,138', -',139,,139,138,139,,138,138,138,138,,,,,138,138,,138,,138,138,,138,,138', -'138,,,,,,138,138,138,138,138,138,,,,138,138,,,,,,,,,,,137,,,137,137', -'137,137,137,137,137,137,137,137,,,,,137,138,138,137,137,,138,,138,137', -'138,,137,137,137,137,,,,,137,137,,137,,137,137,,137,,137,137,,,,,,137', -'137,137,137,137,137,,,,137,137,,,,,,,,,,,117,,,117,117,117,117,117,117', -'117,117,117,117,,,,,117,137,137,117,117,,137,,137,117,137,,117,117,117', -'117,,,,,117,117,,117,,117,117,,117,,117,117,,,,,,117,117,117,117,117', -'117,,,,117,117,,,,,,,,,,,136,,,136,136,136,136,136,136,136,136,136,136', -',,,,136,117,117,136,136,,117,,117,136,117,,136,136,136,136,,,,,136,136', -',136,,136,136,,136,,136,136,,,,,,136,136,136,136,136,136,,,,136,136', -',,,,,,,,,,135,,,135,135,135,135,135,135,135,135,135,135,,,,,135,136', -'136,135,135,,136,,136,135,136,,135,135,135,135,,,,,135,135,,135,,135', -'135,,135,,135,135,,,,,,135,135,135,135,135,135,,,,135,135,,,,,,,,,,', -'121,,,121,121,121,121,121,121,121,121,121,121,,,,,121,135,135,121,121', -',135,,135,121,135,,121,121,121,121,,,,,121,121,,121,,121,121,,121,,121', -'121,,,,,,121,121,121,121,121,121,,,,121,121,,,,,,,,,,,122,,,122,122', -'122,122,122,122,122,122,122,122,,,,,122,121,121,122,122,,121,,121,122', -'121,,122,122,122,122,,,,,122,122,,122,,122,122,,122,,122,122,,,,,,122', -'122,122,122,122,122,,,,122,122,,,,,,,,,,,123,,,123,123,123,123,123,123', -'123,123,123,123,,,,,123,122,122,123,123,,122,,122,123,122,,123,123,123', -'123,,,,,123,123,,123,,123,123,,123,,123,123,,,,,,123,123,123,123,123', -'123,,,,123,123,,,,,,,,,,,142,,,142,142,142,142,142,142,142,142,142,142', -',,,,142,123,123,142,142,,123,,123,142,123,,142,142,142,142,,,,,142,142', -',142,,142,142,,142,,142,142,,312,,312,,142,142,142,142,142,142,235,', -',142,142,,,235,235,235,235,235,235,235,235,235,235,235,235,235,,,312', -'312,,,,312,,,,312,,142,142,,,,142,,142,312,142,,,,,,312,312,312,312', -'312,312,312,312,312,312,312,312,312,312,312,312,312,312,312,312,312', -'312,312,312,312,312,312,312,312,312,312,312,312,312,301,,301,226,,,', -',,312,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226', -'226,226,226,226,226,,301,301,,,,301,,,,301,,,,,,,,,,301,,,,,,,301,301', -'301,301,301,301,301,301,301,301,301,301,301,301,301,301,301,301,301', -'301,301,301,301,301,301,301,301,301,301,301,301,301,301,301,,,,,,,,', -',301,310,310,310,310,310,310,310,310,310,310,,,,,310,,,310,310,,,,,310', -',,310,310,310,,,,,,,310,,310,,310,310,,310,,310,310,,,,,,310,310,310', -'310,310,310,,,,310,310,,,,,300,300,300,300,300,300,300,300,300,300,', -',,,300,,,300,300,,,,,300,310,310,300,300,300,310,,310,,310,,300,,300', -',300,300,,300,,300,300,,,,,,300,300,300,300,300,300,233,,,300,300,,', -'233,233,233,233,233,233,233,233,233,233,,25,25,25,25,25,25,25,25,25', -'25,,,,,25,300,300,25,25,,300,,300,25,300,,25,25,25,25,,,,,,25,,25,,25', -'25,,25,,25,25,,,,,,25,25,25,25,25,25,,,,25,25,,,,,155,155,155,155,155', -'155,155,155,155,155,,,,,155,,,155,155,,,,,155,25,25,155,155,155,25,', -'25,,25,,155,,155,,155,155,,155,,155,155,,,,,,155,155,155,155,,164,164', -'164,164,164,164,164,164,164,164,227,,,,,,,227,227,227,227,227,227,227', -'227,227,227,164,164,,,,,,155,155,,,,155,,155,164,155,229,164,,204,,204', -',229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229', -'229,229,229,229,,,,,,,,204,204,,,,204,,,,204,,,,,,,164,,164,204,164', -',,,,,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204', -'204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204', -'204,68,234,68,,,,,,234,234,234,234,234,234,234,234,234,234,234,234,234', -'234,234,234,234,234,234,234,234,,,,68,68,,,,68,,,,68,,,,,,,,,,68,,,', -',,,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68', -'68,68,68,68,68,68,68,68,68,68,68,68,311,242,311,,,,,,242,242,242,242', -'242,242,242,242,242,242,242,242,242,,,,,311,,,,,,,311,311,,,,311,,,', -'311,,,,,,,,,,311,,,,,,,311,311,311,311,311,311,311,311,311,311,311,311', -'311,311,311,311,311,311,311,311,311,311,311,311,311,311,311,311,311', -'311,311,311,311,311,231,222,231,,,,,,222,222,222,222,222,222,222,222', -'222,222,222,222,222,222,222,222,222,222,222,222,222,,,,231,231,,,,231', -',,,231,,,,,,,,,,231,,,,,,,231,231,231,231,231,231,231,231,231,231,231', +'146,,,,146,146,,,,,,,,,,,,,,,,,,,,,,,,,,,,,146,146,,,,146,,146,146,145', +'146,,145,145,145,145,145,145,145,145,145,145,,,,,145,,,145,145,,,,,145', +',,145,145,145,145,,,,,145,145,,145,,145,145,,145,,145,145,,,,,,145,145', +'145,145,145,145,,,,145,145,,,,,,,,,,,,,,,,,,,,,,,,,,,,,145,145,,,,145', +',145,145,310,145,,310,310,310,310,310,310,310,310,310,310,,,,,310,,', +'310,310,,,,,310,,,310,310,310,310,,,,,310,310,,310,,310,310,,310,,310', +'310,,,,,,310,310,310,310,310,310,,,,310,310,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,310,310,,,,310,,310,310,105,310,,105,105,105,105,105,105,105,105', +'105,105,,,,,105,,,105,105,,,,,105,,,105,105,105,105,,,,,105,105,,105', +',105,105,,105,,105,105,,,,,,105,105,105,105,105,105,,,,105,105,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,105,105,,,,105,,105,105,144,105,,144,144,144', +'144,144,144,144,144,144,144,,,,,144,,,144,144,,,,,144,,,144,144,144', +'144,,,,,144,144,,144,,144,144,,144,,144,144,,,,,,144,144,144,144,144', +'144,,,,144,144,,,,,,,,,,,,,,,,,,,,,,,,,,,,,144,144,,,,144,,144,144,143', +'144,,143,143,143,143,143,143,143,143,143,143,,,,,143,,,143,143,,,,,143', +',,143,143,143,143,,,,,143,143,,143,,143,143,,143,,143,143,,,,,,143,143', +'143,143,143,143,,,,143,143,,,,,,,,,,,,,,,,,,,,,,,,,,,,,143,143,,,,143', +',143,143,142,143,,142,142,142,142,142,142,142,142,142,142,,,,,142,,', +'142,142,,,,,142,,,142,142,142,142,,,,,142,142,,142,,142,142,,142,,142', +'142,,,,,,142,142,142,142,142,142,,,,142,142,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,142,142,,,,142,,142,142,113,142,,113,113,113,113,113,113,113,113', +'113,113,,,,,113,,,113,113,,,,,113,,,113,113,113,113,,,,,113,113,,113', +',113,113,,113,,113,113,113,,,,,113,113,113,113,113,113,,,,113,113,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,113,113,,,,113,,113,113,114,113,,114,114,114', +'114,114,114,114,114,114,114,,,,,114,,,114,114,,,,,114,,,114,114,114', +'114,,,,,114,114,,114,,114,114,,114,,114,114,,,,,,114,114,114,114,114', +'114,,,,114,114,,,,,,,,,,,,,,,,,,,,,,,,,,,,,114,114,,,,114,,114,114,141', +'114,,141,141,141,141,141,141,141,141,141,141,,,,,141,,,141,141,,,,,141', +',,141,141,141,141,,,,,141,141,,141,,141,141,,141,,141,141,,,,,,141,141', +'141,141,141,141,,,,141,141,,,,,,,,,,,,,,,,,,,,,,,,,,,,,141,141,,,,141', +',141,141,140,141,,140,140,140,140,140,140,140,140,140,140,,,,,140,,', +'140,140,,,,,140,,,140,140,140,140,,,,,140,140,,140,,140,140,,140,,140', +'140,,,,,,140,140,140,140,140,140,,,,140,140,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,140,140,,,,140,,140,140,139,140,,139,139,139,139,139,139,139,139', +'139,139,,,,,139,,,139,139,,,,,139,,,139,139,139,139,,,,,139,139,,139', +',139,139,,139,,139,139,,,,,,139,139,139,139,139,139,,,,139,139,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,139,139,,,,139,,139,139,138,139,,138,138,138', +'138,138,138,138,138,138,138,,,,,138,,,138,138,,,,,138,,,138,138,138', +'138,,,,,138,138,,138,,138,138,,138,,138,138,,,,,,138,138,138,138,138', +'138,,,,138,138,,,,,,,,,,,,,,,,,,,,,,,,,,,,,138,138,,,,138,,138,138,136', +'138,,136,136,136,136,136,136,136,136,136,136,,,,,136,,,136,136,,,,,136', +',,136,136,136,136,,,,,136,136,,136,,136,136,,136,,136,136,,,,,,136,136', +'136,136,136,136,,,,136,136,,,,,,,,,,,,,,,,,,,,,,,,,,,,,136,136,,,,136', +',136,136,0,136,,0,0,0,0,0,0,0,0,0,0,,,,,0,,,0,0,,,,,0,,,0,0,0,0,,,,', +'0,0,,0,,0,0,,0,,0,0,0,,,,,0,0,0,0,0,0,,,,0,0,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,0,0,0,0,,0,,0,0,135,0,,135,135,135,135,135,135,135,135,135,135', +',,,,135,,,135,135,,,,,135,,,135,135,135,135,,,,,135,135,,135,,135,135', +',135,,135,135,,,,,,135,135,135,135,135,135,,,,135,135,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,135,135,,,,135,,135,135,134,135,,134,134,134,134,134,134', +'134,134,134,134,,,,,134,,,134,134,,,,,134,,,134,134,134,134,,,,,134', +'134,,134,,134,134,,134,,134,134,,,,,,134,134,134,134,134,134,,,,134', +'134,,,,,,,,,,,,,,,,,,,,,,,,,,,,,134,134,,,,134,,134,134,133,134,,133', +'133,133,133,133,133,133,133,133,133,,,,,133,,,133,133,,,,,133,,,133', +'133,133,133,,,,,133,133,,133,,133,133,,133,,133,133,,,,,,133,133,133', +'133,133,133,,,,133,133,,,,,,,,,,,,,,,,,,,,,,,,,,,,,133,133,,,,133,,133', +'133,131,133,,131,131,131,131,131,131,131,131,131,131,,,,,131,,,131,131', +',,,,131,,,131,131,131,131,,,,,131,131,,131,,131,131,,131,,131,131,,', +',,,131,131,131,131,131,131,,,,131,131,,,,,,,,,,,,,,,,,,,,,,,,,,,,,131', +'131,,,,131,,131,131,130,131,,130,130,130,130,130,130,130,130,130,130', +',,,,130,,,130,130,,,,,130,,,130,130,130,130,,,,,130,130,,130,,130,130', +',130,,130,130,,,,,,130,130,130,130,130,130,,,,130,130,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,130,130,,,,130,,130,130,127,130,,127,127,127,127,127,127', +'127,127,127,127,,,,,127,,,127,127,,,,,127,,,127,127,127,127,,,,,127', +'127,,127,,127,127,,127,,127,127,,,,,,127,127,127,127,127,127,,,,127', +'127,,,,,,,,,,,,,,,,,,,,,,,,,,,,,127,127,,,,127,,127,127,213,127,,213', +'213,213,213,213,213,213,213,213,213,,,,,213,,,213,213,,,,,213,,,213', +'213,213,213,,,,,213,213,,213,,213,213,,213,,213,213,,,315,,315,213,213', +'213,213,213,213,,,,213,213,,,,,,,,,,,,,,,,,,,315,315,,,,315,,,,315,213', +'213,,,,213,,213,213,315,213,,,,,,315,315,315,315,315,315,315,315,315', +'315,315,315,315,315,315,315,315,315,315,315,315,315,315,315,315,315', +'315,315,315,315,315,315,315,315,304,,304,,,,,,,,315,,,,,,,,,,,,,,,,', +',,,,,304,304,,,,304,,,,304,,,,,,,,,,304,,,,,,,304,304,304,304,304,304', +'304,304,304,304,304,304,304,304,304,304,304,304,304,304,304,304,304', +'304,304,304,304,304,304,304,304,304,304,304,303,303,303,303,303,303', +'303,303,303,303,304,,,,303,,,303,303,,,,,303,,,303,303,303,,,,,,,303', +',303,,303,303,,303,,303,303,,,,,,303,303,303,303,303,303,,,,303,303', +',,,,313,313,313,313,313,313,313,313,313,313,,,,,313,,,313,313,,,,,313', +'303,303,313,313,313,303,,303,303,,303,313,,313,,313,313,,313,,313,313', +',,,,,313,313,313,313,313,313,,,,313,313,,,,171,171,171,171,171,171,171', +'171,171,171,,,,,,,,,,,,,,,,313,313,171,171,,313,,313,313,,313,,,,,,', +'171,,,171,,,,,,,,,,,,,,,,,,,26,26,26,26,26,26,26,26,26,26,,,,,26,,,26', +'26,,,,,26,,,26,26,26,26,,171,,171,171,26,171,26,,26,26,,26,,26,26,,', +',,,26,26,26,26,26,26,,,,26,26,,,,21,21,21,21,21,21,21,21,21,21,,,,,', +',,,,,,,,,,26,26,21,21,,26,,26,26,,26,,,,,,,21,,,21,,,215,,215,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,215,215,,,,215,,,,215,,,,,,21,,21,21,215,21,', +',,,,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215', +'215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215', +'215,116,,116,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,116,116,,,,116,,,,116,,,,', +',,,,,116,,,,,,,116,116,116,116,116,116,116,116,116,116,116,116,116,116', +'116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116', +'116,116,116,314,,314,,,,,,,,,,,,,,,,,,,,,,,314,,,,,,,314,314,,,,314', +',,,314,,,,,,,,,,314,,,,,,,314,314,314,314,314,314,314,314,314,314,314', +'314,314,314,314,314,314,314,314,314,314,314,314,314,314,314,314,314', +'314,314,314,314,314,314,223,,223,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,223,223', +',,,223,,,,223,,,,,,,,,,223,,,,,,,223,223,223,223,223,223,223,223,223', +'223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223', +'223,223,223,223,223,223,223,223,238,,238,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,238,238,,,,238,,,,238,,,,,,,,,,238,,,,,,,238,238,238,238,238,238,238', +'238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238', +'238,238,238,238,238,238,238,238,238,238,320,,320,,,,,,,,,,,,,,,,,,,', +',,,320,,,,,,,320,320,,,,320,,,,320,,,,,,,,,,320,,,,,,,320,320,320,320', +'320,320,320,320,320,320,320,320,320,320,320,320,320,320,320,320,320', +'320,320,320,320,320,320,320,320,320,320,320,320,320,231,,231,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,231,231,,,,231,,,,231,,,,,,,,,,231,,,,,,,231,231', '231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231', -'231,231,231,231,231,231,81,214,81,,,,,,214,214,214,214,214,214,214,214', -'214,214,214,214,214,214,214,214,214,214,214,214,214,,,,81,81,,,,81,', -',,81,,,,,,,,81,,81,,,,,,,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81', -'81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,224,210,224', -',,,,,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210', -'210,210,210,210,210,,,,224,224,,,,224,,,,224,,,,,,,,,,224,,,,,,,224', -'224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224', -'224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,273', -'246,273,,,,,,246,246,246,246,246,246,246,246,246,246,246,246,246,,,', -',,,,,,,,273,273,,,,273,,,,273,,,,,,,,,,273,,,,,,,273,273,273,273,273', -'273,273,273,273,273,273,273,273,273,273,273,273,273,273,273,273,273', -'273,273,273,273,273,273,273,273,273,273,273,273,216,238,216,,,,,,238', -'238,238,238,238,238,238,238,238,238,238,238,238,,,,,,,,,,,,216,216,', -',,216,,,,216,,,,,,,,,,216,,,,,,,216,216,216,216,216,216,216,216,216', -'216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216', -'216,216,216,216,216,216,216,216,274,230,274,,,,,,230,230,230,230,230', -'230,230,230,230,230,,,,,,,,,,,,,,,274,274,,,,274,,,,274,,,,,,,,,,274', -',,,,,,274,274,274,274,274,274,274,274,274,274,274,274,274,274,274,274', -'274,274,274,274,274,274,274,274,274,274,274,274,274,274,274,274,274', -'274,107,,107,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,107,107,,,,107,,,,107,,,,', -',,,,,107,,,,,,,107,107,107,107,107,107,107,107,107,107,107,107,107,107', -'107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107', -'107,107,107,316,,316,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,316,316,,,,316,,,', -'316,,,,,,,,,,316,,,,,,,316,316,316,316,316,316,316,316,316,316,316,316', -'316,316,316,316,316,316,316,316,316,316,316,316,316,316,316,316,316', -'316,316,316,316,316,195,,195,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,195,195,,', -',195,,,,195,,,,,,,,,,195,,,,,,,195,195,195,195,195,195,195,195,195,195', -'195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195', -'195,195,195,195,195,195,195,317,,317,,,,,,,,,,,,,,,,,,,,,,,317,,,,,', -',317,317,,,,317,,,,317,,,,,,,,,,317,,,,,,,317,317,317,317,317,317,317', +'231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,72,,72,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,72,72,,,,72,,,,72,,,,,,,,,,72,,,,,,,72,72', +'72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72', +'72,72,72,72,72,72,72,72,72,302,,302,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,302', +'302,,,,302,,,,302,,,,,,,,,,302,,,,,,,302,302,302,302,302,302,302,302', +'302,302,302,302,302,302,302,302,302,302,302,302,302,302,302,302,302', +'302,302,302,302,302,302,302,302,302,301,,301,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,301,301,,,,301,,,,301,,,,,,,,,,301,,,,,,,301,301,301,301,301,301', +'301,301,301,301,301,301,301,301,301,301,301,301,301,301,301,301,301', +'301,301,301,301,301,301,301,301,301,301,301,268,,268,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,268,268,,,,268,,,,268,,,,,,,,,,268,,,,,,,268,268,268,268', +'268,268,268,268,268,268,268,268,268,268,268,268,268,268,268,268,268', +'268,268,268,268,268,268,268,268,268,268,268,268,268,317,,317,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,317,317,,,,317,,,,317,,,,,,,,,,317,,,,,,,317,317', '317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,317', -'317,317,317,317,317,317,317,317,317,317,78,,78,,,,,,,,,,,,,,,,,,,,,', -',,,,,,,,78,78,,,,78,,,,78,,,,,,,,78,,78,,,,,,,78,78,78,78,78,78,78,78', -'78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78', -'78,78,78,181,,181,,,,,,,,,,,,,,,,,,,,,,,181,,,,,,,181,181,,,,181,,,', -'181,,,,,,,,,,181,,,,,,,181,181,181,181,181,181,181,181,181,181,181,181', -'181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181', -'181,181,181,181,181,180,,180,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,180,180,,', -',180,,,,180,,,,,,,,,,180,,,,,,,180,180,180,180,180,180,180,180,180,180', -'180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180', -'180,180,180,180,180,180,180,265,,265,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,265', -'265,,,,265,,,,265,,,,,,,,,,265,,,,,,,265,265,265,265,265,265,265,265', -'265,265,265,265,265,265,265,265,265,265,265,265,265,265,265,265,265', -'265,265,265,265,265,265,265,265,265,295,,295,,,,,,,,,,,,,,,,,,,,,,,', -',,,,,,295,295,,,,295,,,,295,,,,,,,,,,295,,,,,,,295,295,295,295,295,295', +'317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,269,,269', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,269,269,,,,269,,,,269,,,,,,,,,,269,,,,', +',,269,269,269,269,269,269,269,269,269,269,269,269,269,269,269,269,269', +'269,269,269,269,269,269,269,269,269,269,269,269,269,269,269,269,269', +'277,,277,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,277,277,,,,277,,,,277,,,,,,,,', +',277,,,,,,,277,277,277,277,277,277,277,277,277,277,277,277,277,277,277', +'277,277,277,277,277,277,277,277,277,277,277,277,277,277,277,277,277', +'277,277,278,,278,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,278,278,,,,278,,,,278', +',,,,,,,,,278,,,,,,,278,278,278,278,278,278,278,278,278,278,278,278,278', +'278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278', +'278,278,278,278,199,,199,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,199,199,,,,199', +',,,199,,,,,,,,,,199,,,,,,,199,199,199,199,199,199,199,199,199,199,199', +'199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199', +'199,199,199,199,199,199,295,,295,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,295,295', +',,,295,,,,295,,,,,,,,,,295,,,,,,,295,295,295,295,295,295,295,295,295', '295,295,295,295,295,295,295,295,295,295,295,295,295,295,295,295,295', -'295,295,295,295,295,295,295,295,295,295,295,299,,299,,,,,,,,,,,,,,,', -',,,,,,,,,,,,,,299,299,,,,299,,,,299,,,,,,,,,,299,,,,,,,299,299,299,299', -'299,299,299,299,299,299,299,299,299,299,299,299,299,299,299,299,299', -'299,299,299,299,299,299,299,299,299,299,299,299,299,298,,298,,,,,,,', -',,,,,,,,,,,,,,,,,,,,,,298,298,,,,298,,,,298,,,,,,,,,,298,,,,,,,298,298', -'298,298,298,298,298,298,298,298,298,298,298,298,298,298,298,298,298', -'298,298,298,298,298,298,298,298,298,298,298,298,298,298,298,80,,80,', -',,,,,,,,,,,,,,,,,,,,,,,,,,,,80,80,,,,80,,,,80,,,,,,,,80,,80,,,,,,,80', -'80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80', -'80,80,80,80,80,80,80,80,80,80,266,,266,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', -'266,266,,,,266,,,,266,,,,,,,,,,266,,,,,,,266,266,266,266,266,266,266', -'266,266,266,266,266,266,266,266,266,266,266,266,266,266,266,266,266', -'266,266,266,266,266,266,266,266,266,266,88,88,,,,,,,,88,,,,,,,,,,88', -',,,,,,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88', -'88,88,88,88,88,88,88,88,88,88,88,88,88,250,250,,,,,,,,250,,,,,,,,,,250', -',,,,,,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250', -'250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250', -'250,228,228,,,,,,,,228,,,,,,,,,,228,,,,,,,228,228,228,228,228,228,228', +'295,295,295,295,295,295,295,295,194,,194,,,,,,,,,,,,,,,,,,,,,,,194,', +',,,,,194,194,,,,194,,,,194,,,,,,,,,,194,,,,,,,194,194,194,194,194,194', +'194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194', +'194,194,194,194,194,194,194,194,194,194,194,88,,88,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,88,88,,,,88,,,,88,,,,,,,,88,,88,,,,,,,88,88,88,88,88,88', +'88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88', +'88,88,88,88,88,87,,87,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,87,87,,,,87,,,,87', +',,,,,,,87,,87,,,,,,,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87', +'87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,193,,193,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,193,193,,,,193,,,,193,,,,,,,,,,193,,,,,,,193', +'193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193', +'193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,85,', +'85,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,85,85,,,,85,,,,85,,,,,,,,85,,85,,,,', +',,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85', +'85,85,85,85,85,85,85,85,85,85,85,85,257,257,,,,,,,,257,,,,,,,,,,257', +',,,,,,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257', +'257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257', +'257,95,95,,,,,,,,95,,,,,,,,,,95,,,,,,,95,95,95,95,95,95,95,95,95,95', +'95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95', +'95,235,235,,,,,,,,235,,,,,,,,,,235,,,,,,,235,235,235,235,235,235,235', +'235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235', +'235,235,235,235,235,235,235,121,121,,,,,,,,121,,,,,,,,,,121,,,,,,,121', +'121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121', +'121,121,121,121,121,121,121,121,121,121,121,121,121,232,232,,,,,,,,232', +',,,,,,,,,232,,,,,,,232,232,232,232,232,232,232,232,232,232,232,232,232', +'232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232', +'232,228,228,,,,,,,,228,,,,,,,,,,228,,,,,,,228,228,228,228,228,228,228', '228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228', -'228,228,228,228,228,228,228,113,113,,,,,,,,113,,,,,,,,,,113,,,,,,,113', -'113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113', -'113,113,113,113,113,113,113,113,113,113,113,113,113,225,225,,,,,,,,225', -',,,,,,,,,225,,,,,,,225,225,225,225,225,225,225,225,225,225,225,225,225', +'228,228,228,228,228,228,228,225,,,,,,,,225,,,,,,,,,,225,,,,,,,225,225', '225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225', -'225,221,221,,,,,,,,221,,,,,,,,,,221,,,,,,,221,221,221,221,221,221,221', -'221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221', -'221,221,221,221,221,221,221,305,,,,,,,,305,,,,,,,,,,305,,,,,,,305,305', -'305,305,305,305,305,305,305,305,305,305,305,305,305,305,305,305,305', -'305,305,305,305,305,305,305,305,305,305,305,305,304,,,,,,,,304,,,,,', -',,,,304,,,,,,,304,304,304,304,304,304,304,304,304,304,304,304,304,304', -'304,304,304,304,304,304,304,304,304,304,304,304,304,304,304,304,304', -'218,,,,,,,,218,,,,,,,,,,218,,,,,,,218,218,218,218,218,218,218,218,218', -'218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218', -'218,218,218,218,218,282,,,,,,,,282,,,,,,,,,,282,,,,,,,282,282,282,282', -'282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282', -'282,282,282,282,282,282,282,282,282,282,281,,,,,,,,281,,,,,,,,,,281', -',,,,,,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281', -'281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,244,,,,', -',,,,,244,,,,,,,244,244,244,244,244,244,244,244,244,244,244,244,244,244', -'244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,86,', -',,,,,,,,86,,,,,,,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86', -'86,86,86,86,86,86,86,86,86,86,86,86,86,104,,,,,,,,,,104,,,,,,,104,104', -'104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104', -'104,104,104,104,104,104,104,104,104,104,104,237,,,,,,,237,237,237,237', -'237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237', -'237,237,237,237,237,237,237,237,237,240,,,,,,,240,240,240,240,240,240', -'240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240', -'240,240,240,240,240,240,240,213,,,,,,,213,213,213,213,213,213,213,213', -'213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213', -'213,213,213,213,213,209,,,,,,,209,209,209,209,209,209,209,209,209,209', -'209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209', -'209,209,209,245,,,,,,,245,245,245,245,245,245,245,245,245,245,245,245', -'245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245', -'245' ] - racc_action_check = arr = Array.new(9160, nil) +'225,225,225,225,225,225,225,225,225,225,225,225,308,,,,,,,,308,,,,,', +',,,,308,,,,,,,308,308,308,308,308,308,308,308,308,308,308,308,308,308', +'308,308,308,308,308,308,308,308,308,308,308,308,308,308,308,308,308', +'285,,,,,,,,285,,,,,,,,,,285,,,,,,,285,285,285,285,285,285,285,285,285', +'285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285', +'285,285,285,285,285,284,,,,,,,,284,,,,,,,,,,284,,,,,,,284,284,284,284', +'284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284', +'284,284,284,284,284,284,284,284,284,284,307,,,,,,,,307,,,,,,,,,,307', +',,,,,,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307', +'307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,251,,,,', +',,,,,251,,,,,,,251,251,251,251,251,251,251,251,251,251,251,251,251,251', +'251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,93,', +',,,,,,,,93,,,,,,,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93', +'93,93,93,93,93,93,93,93,93,93,93,93,93,102,,,,,,,,,,102,,,,,,,102,102', +'102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102', +'102,102,102,102,102,102,102,102,102,102,102,216,,,,,,,216,216,216,216', +'216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216', +'216,216,216,216,216,216,216,216,216,244,,,,,,,244,244,244,244,244,244', +'244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244', +'244,244,244,244,244,244,244,220,,,,,,,220,220,220,220,220,220,220,220', +'220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220', +'220,220,220,220,220,252,,,,,,,252,252,252,252,252,252,252,252,252,252', +'252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252', +'252,252,252,247,,,,,,,247,247,247,247,247,247,247,247,247,247,247,247', +'247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247', +'247' ] + racc_action_check = arr = Array.new(11069, nil) idx = 0 clist.each do |str| str.split(',', -1).each do |i| @@ -709,345 +773,350 @@ def on_error(error_token_id, error_value, value_stack) end racc_action_pointer = [ - 4700, 340, nil, nil, 174, nil, 249, nil, nil, 324, - nil, 399, 474, nil, nil, 549, nil, nil, nil, 624, - nil, -2, 774, nil, 849, 6008, nil, 324, nil, 235, - nil, nil, 1149, nil, 1224, 243, nil, 1374, nil, nil, - 1449, nil, nil, 202, nil, nil, 1599, nil, nil, nil, - nil, nil, 1674, 215, nil, nil, nil, nil, nil, 1824, - nil, nil, 219, nil, nil, nil, 152, 203, 6272, -22, - -2, 37, nil, 2424, nil, -38, -5, 185, 7376, 317, - 8020, 6548, 301, 242, 399, 474, 8838, 392, 8172, nil, - 3575, 3650, 229, 276, nil, 278, nil, nil, 210, nil, - 231, 236, nil, 53, 8885, 71, 4400, 7008, 4550, 451, - -2, 196, 64, 8349, 342, 64, nil, 5176, 260, 101, - nil, 5401, 5476, 5551, 351, 3500, 1524, 1299, 999, 277, - 699, 4175, 2975, 924, 4625, 5326, 5251, 5101, 5026, 4951, - 4876, 4801, 5626, nil, 4475, 4325, 4250, nil, 99, 4100, - 4025, 3950, 3875, 3800, 3725, 6074, 3425, 3350, 3275, 3200, - 3125, 3050, nil, nil, 6130, nil, 2900, nil, nil, 91, - nil, 219, 467, 120, 184, 232, nil, nil, 188, 74, - 7560, 7468, nil, nil, nil, 2825, 2750, 93, 114, nil, - 230, 2649, nil, nil, 2574, 7192, 108, -2, nil, 159, - 163, 102, nil, nil, 6180, 133, 2499, 2349, -17, 9033, - 6590, -7, 79, 8996, 6498, 408, 6824, -52, 8631, 4709, - 333, 8463, 6406, 258, 6640, 8406, 5720, 6092, 8292, 6126, - 6866, 6456, 2658, 5942, 6222, 5635, 167, 8922, 6774, -18, - 8959, nil, 6314, 376, 8791, 9070, 6682, 483, 2, 249, - 8232, nil, nil, nil, nil, -54, nil, -24, 150, 126, - nil, 2274, nil, -65, nil, 7652, 8112, nil, nil, 203, - nil, 2199, 2124, 6732, 6916, 2049, nil, 68, 89, nil, - nil, 8743, 8687, nil, 1974, 1899, 275, nil, nil, nil, - -2, 149, nil, nil, -50, 7744, 1749, nil, 7928, 7836, - 5933, 5768, nil, nil, 8575, 8519, nil, 245, 37, 1074, - 5867, 6364, 5676, nil, nil, nil, 7100, 7284, nil, nil, - nil ] + 6832, 281, nil, nil, 202, 223, 406, nil, nil, 508, + nil, 610, 712, nil, nil, 814, nil, nil, nil, 916, + nil, 8038, 1120, nil, 1222, nil, 7973, nil, nil, nil, + 171, nil, nil, 1528, 406, nil, 11, 124, nil, 1936, + 2038, nil, nil, 252, nil, nil, nil, 2242, 2344, nil, + nil, nil, nil, nil, nil, 2446, nil, nil, nil, nil, + 137, 2650, nil, nil, nil, nil, nil, nil, 81, nil, + 156, 227, 8733, -2, 3262, 146, nil, 111, -3, 399, + nil, 203, nil, nil, -1, 10021, 342, 9837, 9745, 484, + 280, 304, 481, 10747, 204, 10141, 173, 134, 145, 178, + nil, nil, 10794, 100, nil, 5710, 229, 231, 236, nil, + nil, nil, nil, 6118, 6220, 65, 8181, 93, 164, -26, + -2, 10258, 329, nil, 89, 235, 320, 7444, nil, 2140, + 7342, 7240, 317, 7138, 7036, 6934, 6730, 232, 6628, 6526, + 6424, 6322, 6016, 5914, 5812, 5506, 5404, 5302, 5200, 5098, + 4996, nil, 4894, 4792, 4690, nil, 4588, 4486, 4384, 4282, + 4180, 4078, 3976, -2, 3874, 3772, 3670, 3568, 3466, 3364, + nil, 7909, 3160, nil, 138, nil, 249, 132, 204, nil, + nil, nil, nil, nil, nil, 127, 121, nil, 217, 3058, + 2956, 84, 91, 9929, 9653, nil, nil, nil, 74, 9469, + 2854, nil, nil, 2752, -44, 9, 5, -35, nil, nil, + nil, 101, 2548, 7546, 87, 8089, 10831, 517, 1047, 85, + 10905, 721, 1656, 8365, 65, 10428, 216, 1554, 10372, 415, + 1741, 8641, 10315, 823, 1639, 10201, 313, 1435, 8457, 925, + 1537, 619, 1027, 195, 10868, 1231, 297, 10979, nil, 1129, + 382, 10700, 10942, 1333, 1149, 508, 583, 10081, 183, nil, + 123, -45, 1834, 126, nil, nil, 226, nil, 9009, 9193, + nil, nil, -67, nil, nil, 1732, 1630, 9285, 9377, 1426, + 67, 79, nil, nil, 10596, 10540, nil, 1324, 1018, 200, + nil, nil, nil, -13, -2, 9561, 166, nil, nil, nil, + 304, 8917, 8825, 7778, 7689, nil, nil, 10652, 10484, nil, + 5608, 82, 256, 7844, 8273, 7597, nil, 9101, nil, nil, + 8549, nil, nil, nil ] racc_action_default = [ - -1, -183, -97, -10, -183, -106, -183, -98, -11, -183, - -107, -183, -183, -26, -12, -183, -108, -27, -13, -183, - -109, -183, -183, -14, -183, -46, -15, -125, -28, -119, - -16, -29, -183, -31, -138, -183, -17, -183, -35, -18, - -183, -127, -36, -183, -34, -19, -183, -37, -20, -47, - -21, -38, -183, -183, -30, -22, -39, -32, -2, -183, - -23, -40, -3, -105, -104, -33, -183, -183, -5, -183, - -8, -176, -9, -183, -99, -101, -183, -48, -155, -49, - -183, -183, -53, -55, -183, -126, -56, -54, -45, -130, - -138, -183, -183, -183, -111, -183, -115, -116, -183, -44, - -183, -119, -120, -183, -57, -183, -183, -139, -138, -51, - -183, -183, -50, -152, -183, -183, -25, -7, -159, -183, - -4, -183, -183, -183, -183, -183, -183, -183, -183, -183, - -183, -183, -183, -183, -183, -183, -183, -183, -183, -183, - -183, -183, -183, -59, -183, -183, -183, -58, -183, -183, - -183, -183, -183, -183, -183, -94, -183, -183, -183, -183, - -183, -183, -96, -129, -183, -110, -183, -178, -180, -183, - -174, -176, -52, -183, -183, -183, -154, -172, -183, -183, - -139, -183, -112, -113, -114, -183, -183, -183, -183, -118, - -183, -183, -137, -145, -183, -140, -183, -183, -153, -148, - -183, -183, 321, -24, -6, -183, -183, -183, -183, -87, - -75, -64, -183, -88, -76, -65, -181, -183, -93, -77, - -66, -89, -78, -67, -182, -90, -79, -68, -91, -80, - -69, -156, -81, -70, -82, -71, -60, -84, -72, -61, - -85, -83, -73, -62, -92, -86, -74, -63, -128, -183, - -41, -177, -173, -179, -175, -183, -100, -183, -183, -183, - -167, -183, -131, -183, -117, -42, -43, -124, -121, -183, - -122, -183, -183, -141, -142, -183, -132, -183, -183, -149, - -160, -161, -162, -158, -183, -183, -157, -103, -102, -95, - -183, -183, -168, -165, -183, -146, -183, -123, -143, -144, - -103, -183, -150, -151, -164, -163, -171, -183, -169, -183, - -103, -183, -183, -133, -166, -170, -147, -183, -135, -134, - -136 ] + -1, -186, -97, -9, -186, -179, -186, -98, -10, -186, + -106, -186, -186, -26, -11, -186, -107, -27, -12, -186, + -108, -186, -186, -13, -186, -109, -46, -14, -110, -28, + -120, -15, -29, -186, -126, -31, -134, -186, -16, -141, + -186, -35, -17, -186, -36, -34, -18, -186, -186, -37, + -19, -47, -20, -128, -38, -186, -30, -21, -39, -32, + -186, -186, -22, -40, -2, -23, -104, -33, -186, -105, + -3, -186, -5, -8, -186, -186, -99, -101, -186, -48, + -177, -179, -181, -183, -186, -158, -49, -186, -186, -53, + -55, -186, -127, -56, -54, -45, -186, -186, -186, -120, + -44, -121, -57, -141, -131, -186, -186, -186, -186, -112, + -116, -117, -135, -141, -186, -186, -142, -51, -186, -50, + -186, -155, -186, -25, -186, -162, -186, -7, -4, -186, + -186, -186, -186, -186, -186, -186, -186, -186, -186, -186, + -186, -186, -186, -186, -186, -186, -186, -186, -186, -186, + -186, -59, -186, -186, -186, -58, -186, -186, -186, -186, + -186, -186, -186, -94, -186, -186, -186, -186, -186, -186, + -130, -186, -186, -111, -52, -96, -186, -186, -186, -178, + -182, -180, -176, -157, -175, -186, -186, -119, -186, -186, + -186, -186, -186, -142, -186, -113, -114, -115, -186, -143, + -186, -140, -148, -186, -186, -151, -186, -186, -156, 324, + -24, -186, -186, -186, -186, -6, -87, -75, -64, -186, + -88, -76, -65, -184, -186, -93, -77, -66, -89, -78, + -67, -185, -90, -79, -68, -91, -80, -69, -159, -81, + -70, -82, -71, -60, -84, -72, -61, -85, -83, -73, + -62, -92, -86, -74, -63, -129, -186, -41, -186, -100, + -186, -186, -186, -186, -170, -122, -186, -123, -42, -43, + -125, -132, -186, -118, -133, -186, -186, -144, -145, -186, + -186, -186, -152, -163, -164, -165, -161, -186, -186, -160, + -103, -102, -95, -186, -186, -149, -186, -168, -171, -124, + -186, -147, -146, -103, -186, -153, -154, -167, -166, -174, + -186, -172, -186, -103, -186, -186, -136, -150, -173, -169, + -186, -138, -137, -139 ] racc_goto_table = [ - 58, 74, 260, 208, 67, 167, 165, 163, 77, 170, - 78, 62, 268, 79, 270, 80, 81, 99, 105, 82, - 165, 163, 119, 83, 84, 85, 86, 103, 87, 88, - 53, 294, 259, 199, 252, 257, 104, 171, 107, 76, - 168, 109, nil, nil, 110, nil, nil, 111, nil, nil, - 112, nil, nil, nil, nil, nil, 113, nil, nil, nil, - nil, nil, 117, nil, nil, nil, nil, 120, nil, nil, - 115, nil, nil, 162, 179, nil, nil, 172, nil, nil, - 212, nil, 176, 292, 177, nil, nil, nil, nil, 99, - nil, nil, 197, 297, 180, 181, 286, nil, nil, 187, - nil, nil, nil, 190, nil, 253, nil, nil, nil, 254, - 195, nil, 180, nil, 306, 117, nil, nil, nil, nil, - nil, 204, nil, nil, nil, 209, 210, 211, nil, 213, - 214, 215, 216, nil, 218, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, nil, 231, 232, - 233, nil, 234, 235, 236, 237, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 258, 248, 249, nil, - 250, nil, nil, 251, 256, nil, 99, nil, 99, nil, - nil, nil, nil, nil, 165, 163, nil, 190, 269, 265, - 266, 271, nil, nil, nil, 273, nil, nil, 274, nil, - nil, nil, nil, nil, nil, 279, nil, nil, nil, nil, - 281, 282, 283, nil, nil, nil, nil, nil, nil, nil, + 64, 173, 170, 71, 76, 264, 214, 79, 91, 85, + 80, 265, 86, 267, 87, 88, 126, 82, 89, 173, + 170, 115, 90, 100, 92, 93, 60, 94, 96, 95, + 294, 263, 205, 70, 182, 260, 102, 81, 78, 83, + nil, nil, 116, 117, nil, nil, 118, nil, nil, nil, + 119, 120, nil, nil, nil, nil, nil, nil, 121, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 127, 128, nil, nil, nil, nil, nil, 174, 175, nil, + 219, nil, nil, 298, nil, 192, 179, 181, 183, nil, + 184, 299, 100, 180, 124, 198, 188, 191, nil, 289, + nil, nil, nil, nil, nil, nil, 193, nil, 194, nil, + nil, nil, nil, 309, nil, nil, 193, 199, nil, nil, + nil, nil, nil, nil, 127, nil, nil, nil, nil, nil, + 215, nil, 216, 217, 218, nil, 220, 221, 222, 223, + nil, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, nil, 238, 239, 240, 255, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, nil, 256, 257, nil, nil, 261, 100, + 259, 100, nil, 173, 170, nil, 266, nil, nil, nil, + nil, 188, 268, 269, nil, nil, nil, nil, nil, nil, + 276, nil, nil, 277, nil, nil, 278, nil, nil, nil, + 282, nil, nil, nil, nil, 284, 285, 286, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, - nil, nil, nil, nil, nil, nil, nil, 258, nil, nil, - nil, nil, nil, nil, nil, nil, nil, 99, 290, nil, - nil, 289, nil, nil, nil, 295, nil, nil, nil, nil, - nil, nil, nil, nil, nil, 298, 299, nil, 258, 301, - nil, 302, 303, nil, nil, nil, nil, nil, 304, 305, - nil, nil, nil, nil, nil, 307, nil, nil, 308, nil, - 311, nil, nil, nil, 312, nil, nil, nil, 315, nil, - nil, nil, nil, 316, 317 ] + nil, nil, nil, nil, nil, nil, 261, nil, nil, 100, + nil, 293, nil, 292, nil, 295, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 301, 302, + nil, nil, 304, 305, 306, nil, 261, nil, nil, nil, + 307, 308, nil, nil, nil, nil, nil, 311, nil, 312, + nil, nil, nil, 314, nil, nil, 315, nil, nil, nil, + nil, 318, nil, 317, nil, nil, 320 ] racc_goto_check = [ - 2, 26, 44, 42, 4, 48, 31, 37, 5, 46, - 5, 3, 23, 5, 23, 5, 5, 21, 38, 5, - 31, 37, 41, 5, 6, 32, 5, 35, 5, 5, - 1, 39, 43, 40, 45, 25, 5, 47, 5, 24, - 49, 5, nil, nil, 5, nil, nil, 4, nil, nil, - 5, nil, nil, nil, nil, nil, 5, nil, nil, nil, - nil, nil, 2, nil, nil, nil, nil, 2, nil, nil, - 3, nil, nil, 4, 38, nil, nil, 5, nil, nil, - 41, nil, 4, 44, 4, nil, nil, nil, nil, 21, - nil, nil, 38, 23, 5, 5, 42, nil, nil, 35, - nil, nil, nil, 2, nil, 48, nil, nil, nil, 46, - 5, nil, 5, nil, 44, 2, nil, nil, nil, nil, - nil, 5, nil, nil, nil, 5, 5, 5, nil, 5, - 5, 5, 5, nil, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, nil, 5, 5, - 5, nil, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 21, 6, 32, nil, - 5, nil, nil, 4, 26, nil, 21, nil, 21, nil, - nil, nil, nil, nil, 31, 37, nil, 2, 2, 5, - 5, 2, nil, nil, nil, 5, nil, nil, 5, nil, - nil, nil, nil, nil, nil, 4, nil, nil, nil, nil, - 5, 5, 4, nil, nil, nil, nil, nil, nil, nil, + 2, 32, 38, 4, 26, 45, 43, 5, 6, 5, + 47, 23, 5, 23, 5, 5, 42, 49, 5, 32, + 38, 39, 5, 21, 33, 5, 1, 5, 36, 5, + 40, 44, 41, 3, 46, 25, 5, 48, 24, 50, + nil, nil, 5, 5, nil, nil, 4, nil, nil, nil, + 5, 5, nil, nil, nil, nil, nil, nil, 5, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 2, 2, nil, nil, nil, nil, nil, 5, 4, nil, + 42, nil, nil, 45, nil, 39, 47, 4, 4, nil, + 4, 23, 21, 49, 3, 39, 2, 36, nil, 43, + nil, nil, nil, nil, nil, nil, 5, nil, 5, nil, + nil, nil, nil, 45, nil, nil, 5, 5, nil, nil, + nil, nil, nil, nil, 2, nil, nil, nil, nil, nil, + 5, nil, 5, 5, 5, nil, 5, 5, 5, 5, + nil, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, nil, 5, 5, 5, 6, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, nil, 33, 5, nil, nil, 21, 21, + 26, 21, nil, 32, 38, nil, 2, nil, nil, nil, + nil, 2, 5, 5, nil, nil, nil, nil, nil, nil, + 2, nil, nil, 5, nil, nil, 5, nil, nil, nil, + 4, nil, nil, nil, nil, 5, 5, 4, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, - nil, nil, nil, nil, nil, nil, nil, 21, nil, nil, - nil, nil, nil, nil, nil, nil, nil, 21, 2, nil, - nil, 4, nil, nil, nil, 5, nil, nil, nil, nil, - nil, nil, nil, nil, nil, 5, 5, nil, 21, 5, - nil, 4, 4, nil, nil, nil, nil, nil, 5, 5, - nil, nil, nil, nil, nil, 4, nil, nil, 4, nil, - 5, nil, nil, nil, 5, nil, nil, nil, 2, nil, - nil, nil, nil, 5, 5 ] + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 21, nil, nil, 21, + nil, 2, nil, 4, nil, 5, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 5, 5, + nil, nil, 5, 4, 4, nil, 21, nil, nil, nil, + 5, 5, nil, nil, nil, nil, nil, 4, nil, 4, + nil, nil, nil, 5, nil, nil, 5, nil, nil, nil, + nil, 2, nil, 5, nil, nil, 5 ] racc_goto_pointer = [ - nil, 30, 0, 11, 4, 4, 3, nil, nil, nil, + nil, 26, 0, 33, 3, 3, -13, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, - nil, -12, nil, -176, 38, -140, 0, nil, nil, nil, - nil, -64, 4, nil, nil, -2, nil, -63, -16, -230, - -78, -44, -116, -146, -176, -135, -62, -34, -66, -31 ] + nil, -7, nil, -175, 37, -143, 3, nil, nil, nil, + nil, nil, -72, 3, nil, nil, -2, nil, -71, -18, + -232, -86, -52, -120, -154, -180, -50, 5, 32, 12, + 34 ] racc_goto_default = [ - nil, nil, 194, nil, nil, 68, 70, 72, 3, 8, - 14, 18, 23, 26, 30, 36, 39, 45, 48, 50, - 55, 60, 63, 102, nil, 69, nil, 5, 10, 16, - 20, 94, 27, 96, 97, nil, 41, 89, nil, nil, - nil, nil, nil, nil, nil, 71, nil, nil, nil, nil ] + nil, nil, 203, nil, nil, 72, 73, 3, 8, 14, + 18, 23, 27, 31, 38, 42, 46, 50, 52, 57, + 62, 65, 69, 101, nil, 75, nil, 10, 16, 20, + 25, 28, 109, 34, 110, 111, nil, 53, 104, nil, + nil, nil, nil, nil, nil, nil, 5, nil, nil, nil, + nil ] racc_reduce_table = [ 0, 0, :racc_error, - 0, 107, :_reduce_1, - 1, 107, :_reduce_2, - 1, 107, :_reduce_3, - 2, 107, :_reduce_4, - 1, 109, :_reduce_5, - 3, 109, :_reduce_6, - 2, 109, :_reduce_7, - 1, 111, :_reduce_none, - 1, 111, :_reduce_none, - 1, 111, :_reduce_none, - 1, 111, :_reduce_none, - 1, 111, :_reduce_none, - 1, 111, :_reduce_none, - 1, 111, :_reduce_none, - 1, 111, :_reduce_none, - 1, 111, :_reduce_none, - 1, 111, :_reduce_none, - 1, 111, :_reduce_none, - 1, 111, :_reduce_none, - 1, 111, :_reduce_none, - 1, 111, :_reduce_none, - 1, 111, :_reduce_none, - 1, 111, :_reduce_none, - 3, 110, :_reduce_24, - 2, 110, :_reduce_25, - 1, 108, :_reduce_none, - 1, 108, :_reduce_none, - 1, 128, :_reduce_28, - 1, 128, :_reduce_29, - 1, 128, :_reduce_30, - 1, 128, :_reduce_31, - 1, 128, :_reduce_32, - 1, 128, :_reduce_33, - 1, 128, :_reduce_34, - 1, 128, :_reduce_35, - 1, 128, :_reduce_36, - 1, 128, :_reduce_37, - 1, 128, :_reduce_38, - 1, 128, :_reduce_39, - 1, 128, :_reduce_40, - 3, 116, :_reduce_41, - 3, 129, :_reduce_42, - 3, 129, :_reduce_43, - 1, 129, :_reduce_44, - 2, 120, :_reduce_45, - 1, 120, :_reduce_46, - 1, 127, :_reduce_47, - 2, 115, :_reduce_48, - 2, 115, :_reduce_49, - 2, 115, :_reduce_50, - 2, 115, :_reduce_51, - 2, 115, :_reduce_52, - 2, 115, :_reduce_53, - 2, 115, :_reduce_54, - 2, 115, :_reduce_55, - 2, 115, :_reduce_56, - 2, 115, :_reduce_57, - 2, 115, :_reduce_58, - 2, 115, :_reduce_59, - 3, 115, :_reduce_60, - 3, 115, :_reduce_61, - 3, 115, :_reduce_62, - 3, 115, :_reduce_63, - 3, 115, :_reduce_64, - 3, 115, :_reduce_65, - 3, 115, :_reduce_66, - 3, 115, :_reduce_67, - 3, 115, :_reduce_68, - 3, 115, :_reduce_69, - 3, 115, :_reduce_70, - 3, 115, :_reduce_71, - 3, 115, :_reduce_72, - 3, 115, :_reduce_73, - 3, 115, :_reduce_74, - 3, 115, :_reduce_75, - 3, 115, :_reduce_76, - 3, 115, :_reduce_77, - 3, 115, :_reduce_78, - 3, 115, :_reduce_79, - 3, 115, :_reduce_80, - 3, 115, :_reduce_81, - 3, 115, :_reduce_82, - 3, 115, :_reduce_83, - 3, 115, :_reduce_84, - 3, 115, :_reduce_85, - 3, 115, :_reduce_86, - 3, 115, :_reduce_87, - 3, 115, :_reduce_88, - 3, 115, :_reduce_89, - 3, 115, :_reduce_90, - 3, 115, :_reduce_91, - 3, 115, :_reduce_92, - 3, 115, :_reduce_93, - 2, 126, :_reduce_94, - 5, 114, :_reduce_95, - 2, 114, :_reduce_96, - 1, 131, :_reduce_97, - 1, 131, :_reduce_98, - 1, 130, :_reduce_99, - 3, 130, :_reduce_100, - 1, 132, :_reduce_none, - 4, 132, :_reduce_102, - 4, 125, :_reduce_103, - 1, 112, :_reduce_104, - 1, 112, :_reduce_105, - 1, 112, :_reduce_106, - 1, 112, :_reduce_107, - 1, 112, :_reduce_108, - 1, 112, :_reduce_109, - 2, 112, :_reduce_110, - 2, 112, :_reduce_111, - 2, 137, :_reduce_112, - 2, 137, :_reduce_113, - 2, 137, :_reduce_114, - 1, 137, :_reduce_115, - 1, 137, :_reduce_116, - 3, 139, :_reduce_117, - 3, 134, :_reduce_118, - 0, 141, :_reduce_119, - 1, 141, :_reduce_120, - 3, 141, :_reduce_121, - 3, 141, :_reduce_122, - 4, 141, :_reduce_123, - 3, 141, :_reduce_124, - 1, 113, :_reduce_125, - 2, 113, :_reduce_126, - 1, 113, :_reduce_127, - 3, 124, :_reduce_128, - 2, 138, :_reduce_129, - 2, 138, :_reduce_130, - 3, 143, :_reduce_131, - 4, 142, :_reduce_132, - 6, 136, :_reduce_133, - 7, 136, :_reduce_134, - 6, 140, :_reduce_135, - 7, 140, :_reduce_136, - 3, 133, :_reduce_137, - 0, 144, :_reduce_138, - 1, 144, :_reduce_139, - 2, 144, :_reduce_140, - 3, 144, :_reduce_141, - 3, 144, :_reduce_142, - 4, 144, :_reduce_143, - 4, 144, :_reduce_144, - 2, 144, :_reduce_145, - 1, 145, :_reduce_146, - 3, 145, :_reduce_147, - 3, 118, :_reduce_148, - 4, 118, :_reduce_149, - 5, 118, :_reduce_150, - 3, 146, :_reduce_151, - 2, 119, :_reduce_152, - 3, 135, :_reduce_153, - 3, 121, :_reduce_154, - 2, 121, :_reduce_155, - 3, 121, :_reduce_156, - 4, 122, :_reduce_157, - 4, 122, :_reduce_158, - 1, 147, :_reduce_159, - 3, 147, :_reduce_160, - 2, 148, :_reduce_161, - 2, 148, :_reduce_162, - 3, 148, :_reduce_163, - 3, 148, :_reduce_164, - 5, 123, :_reduce_165, - 7, 123, :_reduce_166, - 1, 149, :_reduce_167, - 2, 149, :_reduce_168, - 3, 150, :_reduce_169, - 4, 150, :_reduce_170, - 3, 150, :_reduce_171, - 3, 151, :_reduce_172, - 2, 152, :_reduce_173, - 1, 153, :_reduce_174, - 2, 153, :_reduce_175, - 0, 154, :_reduce_176, - 2, 154, :_reduce_177, - 1, 155, :_reduce_178, - 2, 155, :_reduce_179, - 2, 117, :_reduce_180, - 3, 117, :_reduce_181, - 3, 117, :_reduce_182 ] - -racc_reduce_n = 183 - -racc_shift_n = 321 + 0, 108, :_reduce_1, + 1, 108, :_reduce_2, + 1, 108, :_reduce_3, + 2, 108, :_reduce_4, + 1, 110, :_reduce_5, + 3, 110, :_reduce_6, + 2, 110, :_reduce_7, + 1, 112, :_reduce_none, + 1, 112, :_reduce_none, + 1, 112, :_reduce_none, + 1, 112, :_reduce_none, + 1, 112, :_reduce_none, + 1, 112, :_reduce_none, + 1, 112, :_reduce_none, + 1, 112, :_reduce_none, + 1, 112, :_reduce_none, + 1, 112, :_reduce_none, + 1, 112, :_reduce_none, + 1, 112, :_reduce_none, + 1, 112, :_reduce_none, + 1, 112, :_reduce_none, + 1, 112, :_reduce_none, + 1, 112, :_reduce_none, + 3, 111, :_reduce_24, + 2, 111, :_reduce_25, + 1, 109, :_reduce_none, + 1, 109, :_reduce_none, + 1, 129, :_reduce_28, + 1, 129, :_reduce_29, + 1, 129, :_reduce_30, + 1, 129, :_reduce_31, + 1, 129, :_reduce_32, + 1, 129, :_reduce_33, + 1, 129, :_reduce_34, + 1, 129, :_reduce_35, + 1, 129, :_reduce_36, + 1, 129, :_reduce_37, + 1, 129, :_reduce_38, + 1, 129, :_reduce_39, + 1, 129, :_reduce_40, + 3, 117, :_reduce_41, + 3, 130, :_reduce_42, + 3, 130, :_reduce_43, + 1, 130, :_reduce_44, + 2, 121, :_reduce_45, + 1, 121, :_reduce_46, + 1, 128, :_reduce_47, + 2, 116, :_reduce_48, + 2, 116, :_reduce_49, + 2, 116, :_reduce_50, + 2, 116, :_reduce_51, + 2, 116, :_reduce_52, + 2, 116, :_reduce_53, + 2, 116, :_reduce_54, + 2, 116, :_reduce_55, + 2, 116, :_reduce_56, + 2, 116, :_reduce_57, + 2, 116, :_reduce_58, + 2, 116, :_reduce_59, + 3, 116, :_reduce_60, + 3, 116, :_reduce_61, + 3, 116, :_reduce_62, + 3, 116, :_reduce_63, + 3, 116, :_reduce_64, + 3, 116, :_reduce_65, + 3, 116, :_reduce_66, + 3, 116, :_reduce_67, + 3, 116, :_reduce_68, + 3, 116, :_reduce_69, + 3, 116, :_reduce_70, + 3, 116, :_reduce_71, + 3, 116, :_reduce_72, + 3, 116, :_reduce_73, + 3, 116, :_reduce_74, + 3, 116, :_reduce_75, + 3, 116, :_reduce_76, + 3, 116, :_reduce_77, + 3, 116, :_reduce_78, + 3, 116, :_reduce_79, + 3, 116, :_reduce_80, + 3, 116, :_reduce_81, + 3, 116, :_reduce_82, + 3, 116, :_reduce_83, + 3, 116, :_reduce_84, + 3, 116, :_reduce_85, + 3, 116, :_reduce_86, + 3, 116, :_reduce_87, + 3, 116, :_reduce_88, + 3, 116, :_reduce_89, + 3, 116, :_reduce_90, + 3, 116, :_reduce_91, + 3, 116, :_reduce_92, + 3, 116, :_reduce_93, + 2, 127, :_reduce_94, + 5, 115, :_reduce_95, + 2, 115, :_reduce_96, + 1, 132, :_reduce_97, + 1, 132, :_reduce_98, + 1, 131, :_reduce_99, + 3, 131, :_reduce_100, + 1, 133, :_reduce_none, + 4, 133, :_reduce_102, + 4, 126, :_reduce_103, + 1, 113, :_reduce_104, + 1, 113, :_reduce_105, + 1, 113, :_reduce_106, + 1, 113, :_reduce_107, + 1, 113, :_reduce_108, + 1, 113, :_reduce_109, + 1, 113, :_reduce_110, + 2, 113, :_reduce_111, + 2, 113, :_reduce_112, + 2, 139, :_reduce_113, + 2, 139, :_reduce_114, + 2, 139, :_reduce_115, + 1, 139, :_reduce_116, + 1, 139, :_reduce_117, + 3, 141, :_reduce_118, + 3, 135, :_reduce_119, + 0, 143, :_reduce_120, + 1, 143, :_reduce_121, + 3, 143, :_reduce_122, + 3, 143, :_reduce_123, + 4, 143, :_reduce_124, + 3, 143, :_reduce_125, + 1, 114, :_reduce_126, + 2, 114, :_reduce_127, + 1, 114, :_reduce_128, + 3, 125, :_reduce_129, + 2, 140, :_reduce_130, + 2, 140, :_reduce_131, + 3, 145, :_reduce_132, + 4, 144, :_reduce_133, + 1, 138, :_reduce_134, + 2, 138, :_reduce_135, + 6, 137, :_reduce_136, + 7, 137, :_reduce_137, + 6, 142, :_reduce_138, + 7, 142, :_reduce_139, + 3, 134, :_reduce_140, + 0, 146, :_reduce_141, + 1, 146, :_reduce_142, + 2, 146, :_reduce_143, + 3, 146, :_reduce_144, + 3, 146, :_reduce_145, + 4, 146, :_reduce_146, + 4, 146, :_reduce_147, + 2, 146, :_reduce_148, + 1, 147, :_reduce_149, + 3, 147, :_reduce_150, + 3, 119, :_reduce_151, + 4, 119, :_reduce_152, + 5, 119, :_reduce_153, + 3, 148, :_reduce_154, + 2, 120, :_reduce_155, + 3, 136, :_reduce_156, + 3, 122, :_reduce_157, + 2, 122, :_reduce_158, + 3, 122, :_reduce_159, + 4, 123, :_reduce_160, + 4, 123, :_reduce_161, + 1, 149, :_reduce_162, + 3, 149, :_reduce_163, + 2, 150, :_reduce_164, + 2, 150, :_reduce_165, + 3, 150, :_reduce_166, + 3, 150, :_reduce_167, + 5, 124, :_reduce_168, + 7, 124, :_reduce_169, + 1, 151, :_reduce_170, + 2, 151, :_reduce_171, + 3, 152, :_reduce_172, + 4, 152, :_reduce_173, + 3, 152, :_reduce_174, + 3, 153, :_reduce_175, + 2, 154, :_reduce_176, + 1, 155, :_reduce_177, + 2, 155, :_reduce_178, + 0, 156, :_reduce_179, + 2, 156, :_reduce_180, + 1, 157, :_reduce_181, + 2, 157, :_reduce_182, + 2, 118, :_reduce_183, + 3, 118, :_reduce_184, + 3, 118, :_reduce_185 ] + +racc_reduce_n = 186 + +racc_shift_n = 324 racc_token_table = { false => 0, @@ -1152,12 +1221,13 @@ def on_error(error_token_id, error_value, value_stack) "," => 99, "{" => 100, "}" => 101, - "[" => 102, - "]" => 103, - "(" => 104, - ")" => 105 } + "@" => 102, + "[" => 103, + "]" => 104, + "(" => 105, + ")" => 106 } -racc_nt_base = 106 +racc_nt_base = 107 racc_use_result_var = true @@ -1280,6 +1350,7 @@ def on_error(error_token_id, error_value, value_stack) "\",\"", "\"{\"", "\"}\"", + "\"@\"", "\"[\"", "\"]\"", "\"(\"", @@ -1315,6 +1386,7 @@ def on_error(error_token_id, error_value, value_stack) "Object", "Parenthetical", "Range", + "This", "Accessor", "Invocation", "Index", @@ -2011,84 +2083,84 @@ def _reduce_109(val, _values, result) module_eval(<<'.,.,', 'grammar.y', 240) def _reduce_110(val, _values, result) - result = val[0] << val[1] + result = ValueNode.new(val[0]) result end .,., module_eval(<<'.,.,', 'grammar.y', 241) def _reduce_111(val, _values, result) - result = ValueNode.new(val[0], [val[1]]) + result = val[0] << val[1] result end .,., -module_eval(<<'.,.,', 'grammar.y', 246) +module_eval(<<'.,.,', 'grammar.y', 242) def _reduce_112(val, _values, result) - result = AccessorNode.new(val[1]) + result = ValueNode.new(val[0], [val[1]]) result end .,., module_eval(<<'.,.,', 'grammar.y', 247) def _reduce_113(val, _values, result) - result = AccessorNode.new(val[1], :prototype) + result = AccessorNode.new(val[1]) result end .,., module_eval(<<'.,.,', 'grammar.y', 248) def _reduce_114(val, _values, result) - result = AccessorNode.new(val[1], :soak) + result = AccessorNode.new(val[1], :prototype) result end .,., module_eval(<<'.,.,', 'grammar.y', 249) def _reduce_115(val, _values, result) - result = val[0] + result = AccessorNode.new(val[1], :soak) result end .,., module_eval(<<'.,.,', 'grammar.y', 250) def _reduce_116(val, _values, result) - result = SliceNode.new(val[0]) + result = val[0] result end .,., -module_eval(<<'.,.,', 'grammar.y', 255) +module_eval(<<'.,.,', 'grammar.y', 251) def _reduce_117(val, _values, result) - result = IndexNode.new(val[1]) + result = SliceNode.new(val[0]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 260) +module_eval(<<'.,.,', 'grammar.y', 256) def _reduce_118(val, _values, result) - result = ObjectNode.new(val[1]) + result = IndexNode.new(val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 265) +module_eval(<<'.,.,', 'grammar.y', 261) def _reduce_119(val, _values, result) - result = [] + result = ObjectNode.new(val[1]) result end .,., module_eval(<<'.,.,', 'grammar.y', 266) def _reduce_120(val, _values, result) - result = val + result = [] result end .,., module_eval(<<'.,.,', 'grammar.y', 267) def _reduce_121(val, _values, result) - result = val[0] << val[2] + result = val result end .,., @@ -2100,51 +2172,51 @@ def _reduce_122(val, _values, result) end .,., -module_eval(<<'.,.,', 'grammar.y', 270) +module_eval(<<'.,.,', 'grammar.y', 269) def _reduce_123(val, _values, result) - result = val[0] << val[3] + result = val[0] << val[2] result end .,., module_eval(<<'.,.,', 'grammar.y', 271) def _reduce_124(val, _values, result) - result = val[1] + result = val[0] << val[3] result end .,., -module_eval(<<'.,.,', 'grammar.y', 276) +module_eval(<<'.,.,', 'grammar.y', 272) def _reduce_125(val, _values, result) - result = val[0] + result = val[1] result end .,., module_eval(<<'.,.,', 'grammar.y', 277) def _reduce_126(val, _values, result) - result = val[1].new_instance + result = val[0] result end .,., module_eval(<<'.,.,', 'grammar.y', 278) def _reduce_127(val, _values, result) - result = val[0] + result = val[1].new_instance result end .,., -module_eval(<<'.,.,', 'grammar.y', 283) +module_eval(<<'.,.,', 'grammar.y', 279) def _reduce_128(val, _values, result) - result = ExtendsNode.new(val[0], val[2]) + result = val[0] result end .,., -module_eval(<<'.,.,', 'grammar.y', 288) +module_eval(<<'.,.,', 'grammar.y', 284) def _reduce_129(val, _values, result) - result = CallNode.new(val[0], val[1]) + result = ExtendsNode.new(val[0], val[2]) result end .,., @@ -2156,365 +2228,386 @@ def _reduce_130(val, _values, result) end .,., -module_eval(<<'.,.,', 'grammar.y', 294) +module_eval(<<'.,.,', 'grammar.y', 290) def _reduce_131(val, _values, result) - result = val[1] + result = CallNode.new(val[0], val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 299) +module_eval(<<'.,.,', 'grammar.y', 295) def _reduce_132(val, _values, result) - result = CallNode.new(Value.new('super'), val[2]) + result = val[1] result end .,., -module_eval(<<'.,.,', 'grammar.y', 305) +module_eval(<<'.,.,', 'grammar.y', 300) def _reduce_133(val, _values, result) - result = RangeNode.new(val[1], val[4]) + result = CallNode.new(Value.new('super'), val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 307) +module_eval(<<'.,.,', 'grammar.y', 305) def _reduce_134(val, _values, result) - result = RangeNode.new(val[1], val[5], true) + result = ThisNode.new result end .,., -module_eval(<<'.,.,', 'grammar.y', 313) +module_eval(<<'.,.,', 'grammar.y', 306) def _reduce_135(val, _values, result) - result = RangeNode.new(val[1], val[4]) + result = ThisNode.new(val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 315) +module_eval(<<'.,.,', 'grammar.y', 312) def _reduce_136(val, _values, result) - result = RangeNode.new(val[1], val[5], true) + result = RangeNode.new(val[1], val[4]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 320) +module_eval(<<'.,.,', 'grammar.y', 314) def _reduce_137(val, _values, result) - result = ArrayNode.new(val[1]) + result = RangeNode.new(val[1], val[5], true) result end .,., -module_eval(<<'.,.,', 'grammar.y', 325) +module_eval(<<'.,.,', 'grammar.y', 320) def _reduce_138(val, _values, result) - result = [] + result = RangeNode.new(val[1], val[4]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 326) +module_eval(<<'.,.,', 'grammar.y', 322) def _reduce_139(val, _values, result) - result = val + result = RangeNode.new(val[1], val[5], true) result end .,., module_eval(<<'.,.,', 'grammar.y', 327) def _reduce_140(val, _values, result) - result = [val[1]] + result = ArrayNode.new(val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 328) +module_eval(<<'.,.,', 'grammar.y', 332) def _reduce_141(val, _values, result) - result = val[0] << val[2] + result = [] result end .,., -module_eval(<<'.,.,', 'grammar.y', 329) +module_eval(<<'.,.,', 'grammar.y', 333) def _reduce_142(val, _values, result) - result = val[0] << val[2] + result = val result end .,., -module_eval(<<'.,.,', 'grammar.y', 330) +module_eval(<<'.,.,', 'grammar.y', 334) def _reduce_143(val, _values, result) - result = val[0] << val[3] + result = [val[1]] result end .,., -module_eval(<<'.,.,', 'grammar.y', 331) +module_eval(<<'.,.,', 'grammar.y', 335) def _reduce_144(val, _values, result) - result = val[0] << val[3] + result = val[0] << val[2] result end .,., -module_eval(<<'.,.,', 'grammar.y', 332) +module_eval(<<'.,.,', 'grammar.y', 336) def _reduce_145(val, _values, result) - result = val[0] + result = val[0] << val[2] result end .,., module_eval(<<'.,.,', 'grammar.y', 337) def _reduce_146(val, _values, result) - result = val[0] + result = val[0] << val[3] result end .,., module_eval(<<'.,.,', 'grammar.y', 338) def _reduce_147(val, _values, result) - result = ([val[0]] << val[2]).flatten + result = val[0] << val[3] result end .,., -module_eval(<<'.,.,', 'grammar.y', 343) +module_eval(<<'.,.,', 'grammar.y', 339) def _reduce_148(val, _values, result) - result = TryNode.new(val[1], val[2][0], val[2][1]) + result = val[0] result end .,., module_eval(<<'.,.,', 'grammar.y', 344) def _reduce_149(val, _values, result) - result = TryNode.new(val[1], nil, nil, val[3]) + result = val[0] result end .,., -module_eval(<<'.,.,', 'grammar.y', 346) +module_eval(<<'.,.,', 'grammar.y', 345) def _reduce_150(val, _values, result) - result = TryNode.new(val[1], val[2][0], val[2][1], val[4]) + result = ([val[0]] << val[2]).flatten result end .,., -module_eval(<<'.,.,', 'grammar.y', 351) +module_eval(<<'.,.,', 'grammar.y', 350) def _reduce_151(val, _values, result) - result = [val[1], val[2]] + result = TryNode.new(val[1], val[2][0], val[2][1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 356) +module_eval(<<'.,.,', 'grammar.y', 351) def _reduce_152(val, _values, result) - result = ThrowNode.new(val[1]) + result = TryNode.new(val[1], nil, nil, val[3]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 361) +module_eval(<<'.,.,', 'grammar.y', 353) def _reduce_153(val, _values, result) - result = ParentheticalNode.new(val[1], val[0].line) + result = TryNode.new(val[1], val[2][0], val[2][1], val[4]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 366) +module_eval(<<'.,.,', 'grammar.y', 358) def _reduce_154(val, _values, result) - result = WhileNode.new(val[1], val[2]) + result = [val[1], val[2]] result end .,., -module_eval(<<'.,.,', 'grammar.y', 367) +module_eval(<<'.,.,', 'grammar.y', 363) def _reduce_155(val, _values, result) - result = WhileNode.new(val[1], nil) + result = ThrowNode.new(val[1]) result end .,., module_eval(<<'.,.,', 'grammar.y', 368) def _reduce_156(val, _values, result) - result = WhileNode.new(val[2], Expressions.wrap(val[0])) + result = ParentheticalNode.new(val[1], val[0].line) result end .,., -module_eval(<<'.,.,', 'grammar.y', 375) +module_eval(<<'.,.,', 'grammar.y', 373) def _reduce_157(val, _values, result) - result = ForNode.new(val[0], val[3], val[2][0], val[2][1]) + result = WhileNode.new(val[1], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 376) +module_eval(<<'.,.,', 'grammar.y', 374) def _reduce_158(val, _values, result) - result = ForNode.new(val[3], val[2], val[1][0], val[1][1]) + result = WhileNode.new(val[1], nil) result end .,., -module_eval(<<'.,.,', 'grammar.y', 381) +module_eval(<<'.,.,', 'grammar.y', 375) def _reduce_159(val, _values, result) - result = val + result = WhileNode.new(val[2], Expressions.wrap(val[0])) result end .,., module_eval(<<'.,.,', 'grammar.y', 382) def _reduce_160(val, _values, result) - result = [val[0], val[2]] + result = ForNode.new(val[0], val[3], val[2][0], val[2][1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 387) +module_eval(<<'.,.,', 'grammar.y', 383) def _reduce_161(val, _values, result) - result = {:source => val[1]} + result = ForNode.new(val[3], val[2], val[1][0], val[1][1]) result end .,., module_eval(<<'.,.,', 'grammar.y', 388) def _reduce_162(val, _values, result) - result = {:source => val[1], :object => true} + result = val result end .,., -module_eval(<<'.,.,', 'grammar.y', 390) +module_eval(<<'.,.,', 'grammar.y', 389) def _reduce_163(val, _values, result) - result = val[0].merge(:filter => val[2]) + result = [val[0], val[2]] result end .,., -module_eval(<<'.,.,', 'grammar.y', 392) +module_eval(<<'.,.,', 'grammar.y', 394) def _reduce_164(val, _values, result) - result = val[0].merge(:step => val[2]) + result = {:source => val[1]} result end .,., -module_eval(<<'.,.,', 'grammar.y', 398) +module_eval(<<'.,.,', 'grammar.y', 395) def _reduce_165(val, _values, result) - result = val[3].rewrite_condition(val[1]) + result = {:source => val[1], :object => true} result end .,., -module_eval(<<'.,.,', 'grammar.y', 400) +module_eval(<<'.,.,', 'grammar.y', 397) def _reduce_166(val, _values, result) - result = val[3].rewrite_condition(val[1]).add_else(val[5]) + result = val[0].merge(:filter => val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 405) +module_eval(<<'.,.,', 'grammar.y', 399) def _reduce_167(val, _values, result) - result = val[0] + result = val[0].merge(:step => val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 406) +module_eval(<<'.,.,', 'grammar.y', 405) def _reduce_168(val, _values, result) - result = val[0] << val[1] + result = val[3].rewrite_condition(val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 411) +module_eval(<<'.,.,', 'grammar.y', 407) def _reduce_169(val, _values, result) - result = IfNode.new(val[1], val[2], nil, {:statement => true}) + result = val[3].rewrite_condition(val[1]).add_else(val[5]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 413) +module_eval(<<'.,.,', 'grammar.y', 412) def _reduce_170(val, _values, result) - result = IfNode.new(val[1], val[2], nil, {:statement => true}) + result = val[0] result end .,., -module_eval(<<'.,.,', 'grammar.y', 414) +module_eval(<<'.,.,', 'grammar.y', 413) def _reduce_171(val, _values, result) - result = val[2].add_comment(val[0]) + result = val[0] << val[1] result end .,., -module_eval(<<'.,.,', 'grammar.y', 419) +module_eval(<<'.,.,', 'grammar.y', 418) def _reduce_172(val, _values, result) - result = IfNode.new(val[1], val[2]) + result = IfNode.new(val[1], val[2], nil, {:statement => true}) result end .,., -module_eval(<<'.,.,', 'grammar.y', 424) +module_eval(<<'.,.,', 'grammar.y', 420) def _reduce_173(val, _values, result) - result = val[1].force_statement + result = IfNode.new(val[1], val[2], nil, {:statement => true}) result end .,., -module_eval(<<'.,.,', 'grammar.y', 429) +module_eval(<<'.,.,', 'grammar.y', 421) def _reduce_174(val, _values, result) - result = val[0] + result = val[2].add_comment(val[0]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 430) +module_eval(<<'.,.,', 'grammar.y', 426) def _reduce_175(val, _values, result) - result = val[0].add_else(val[1]) + result = IfNode.new(val[1], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 435) +module_eval(<<'.,.,', 'grammar.y', 431) def _reduce_176(val, _values, result) - result = nil + result = val[1].force_statement result end .,., module_eval(<<'.,.,', 'grammar.y', 436) def _reduce_177(val, _values, result) - result = val[1] + result = val[0] result end .,., -module_eval(<<'.,.,', 'grammar.y', 441) +module_eval(<<'.,.,', 'grammar.y', 437) def _reduce_178(val, _values, result) - result = val[0] + result = val[0].add_else(val[1]) result end .,., module_eval(<<'.,.,', 'grammar.y', 442) def _reduce_179(val, _values, result) - result = val[0].add_else(val[1]) + result = nil result end .,., -module_eval(<<'.,.,', 'grammar.y', 447) +module_eval(<<'.,.,', 'grammar.y', 443) def _reduce_180(val, _values, result) - result = val[0].add_else(val[1]) + result = val[1] result end .,., module_eval(<<'.,.,', 'grammar.y', 448) def _reduce_181(val, _values, result) - result = IfNode.new(val[2], Expressions.wrap(val[0]), nil, {:statement => true}) + result = val[0] result end .,., module_eval(<<'.,.,', 'grammar.y', 449) def _reduce_182(val, _values, result) + result = val[0].add_else(val[1]) + result + end +.,., + +module_eval(<<'.,.,', 'grammar.y', 454) + def _reduce_183(val, _values, result) + result = val[0].add_else(val[1]) + result + end +.,., + +module_eval(<<'.,.,', 'grammar.y', 455) + def _reduce_184(val, _values, result) + result = IfNode.new(val[2], Expressions.wrap(val[0]), nil, {:statement => true}) + result + end +.,., + +module_eval(<<'.,.,', 'grammar.y', 456) + def _reduce_185(val, _values, result) result = IfNode.new(val[2], Expressions.wrap(val[0]), nil, {:statement => true, :invert => true}) result end diff --git a/test/fixtures/execution/test_literals.coffee b/test/fixtures/execution/test_literals.coffee index c462b565f1..fd772ff39c 100644 --- a/test/fixtures/execution/test_literals.coffee +++ b/test/fixtures/execution/test_literals.coffee @@ -34,4 +34,15 @@ print i is 0 money$: 'dollars' -print money$ is 'dollars' \ No newline at end of file +print money$ is 'dollars' + + +bob: { + name: 'Bob' + greet: (salutation) -> + salutation + " " + @name + hello: -> + @greet("Hello") +} + +print bob.hello() is "Hello Bob" From 158790136735577b2aa6584ed1b6657211b27351 Mon Sep 17 00:00:00 2001 From: Jeremy Ashkenas Date: Tue, 2 Feb 2010 20:44:10 -0500 Subject: [PATCH 25/37] remove parens --- test/fixtures/execution/test_literals.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/fixtures/execution/test_literals.coffee b/test/fixtures/execution/test_literals.coffee index c6edffb6d5..c38f63d89d 100644 --- a/test/fixtures/execution/test_literals.coffee +++ b/test/fixtures/execution/test_literals.coffee @@ -42,7 +42,7 @@ bob: { greet: (salutation) -> salutation + " " + @name hello: -> - @greet("Hello") + @greet "Hello" } puts bob.hello() is "Hello Bob" From 9b7cfe87b566bd0c6910d78d0a31086ad07642ad Mon Sep 17 00:00:00 2001 From: Jeremy Ashkenas Date: Tue, 2 Feb 2010 20:44:25 -0500 Subject: [PATCH 26/37] remove parens --- test/fixtures/execution/test_literals.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/fixtures/execution/test_literals.coffee b/test/fixtures/execution/test_literals.coffee index fd772ff39c..cc5393aeb1 100644 --- a/test/fixtures/execution/test_literals.coffee +++ b/test/fixtures/execution/test_literals.coffee @@ -42,7 +42,7 @@ bob: { greet: (salutation) -> salutation + " " + @name hello: -> - @greet("Hello") + @greet "Hello" } print bob.hello() is "Hello Bob" From dc7d0f1568ea51b063d8fa2043cb208fe62306a4 Mon Sep 17 00:00:00 2001 From: Jeremy Ashkenas Date: Wed, 3 Feb 2010 18:16:31 -0500 Subject: [PATCH 27/37] fixing assigning to @properties within an expression --- lib/coffee_script/nodes.rb | 2 +- test/fixtures/execution/test_calling_super.coffee | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/coffee_script/nodes.rb b/lib/coffee_script/nodes.rb index 1fa5680a8d..aaaec0a40f 100644 --- a/lib/coffee_script/nodes.rb +++ b/lib/coffee_script/nodes.rb @@ -346,7 +346,7 @@ def <<(other) end def properties? - return !@properties.empty? + return !@properties.empty? || @base.is_a?(ThisNode) end def array? diff --git a/test/fixtures/execution/test_calling_super.coffee b/test/fixtures/execution/test_calling_super.coffee index 546744b236..8a14350b8f 100644 --- a/test/fixtures/execution/test_calling_super.coffee +++ b/test/fixtures/execution/test_calling_super.coffee @@ -13,7 +13,7 @@ SecondChild::func: (string) -> super('two/') + string ThirdChild: -> - this.array: [1, 2, 3] + @array: [1, 2, 3] ThirdChild extends SecondChild ThirdChild::func: (string) -> super('three/') + string @@ -24,7 +24,7 @@ print result is 'zero/one/two/three/four' TopClass: (arg) -> - this.prop: 'top-' + arg + @prop: 'top-' + arg SuperClass: (arg) -> super 'super-' + arg From 74b9545dc863cb5724615b9e2dbdcb785323c34b Mon Sep 17 00:00:00 2001 From: Jeffery Olson Date: Thu, 4 Feb 2010 10:36:33 -0800 Subject: [PATCH 28/37] work on nodes.coffee and adding scope.coffee --- src/nodes.coffee | 144 +++++++++++++++++++++++++++++++++++++++++------ src/scope.coffee | 99 ++++++++++++++++++++++++++++++++ 2 files changed, 226 insertions(+), 17 deletions(-) create mode 100644 src/scope.coffee diff --git a/src/nodes.coffee b/src/nodes.coffee index b361762740..91f9793bea 100644 --- a/src/nodes.coffee +++ b/src/nodes.coffee @@ -1,3 +1,31 @@ +# Some helper functions + +# TODO -- shallow (1 deep) flatten.. +# need recursive version.. +flatten: (aggList, newList) -> + for item in newList + aggList.push(item) + aggList + +compact: (input) -> + compected: [] + for item in input + if item? + compacted.push(item) + +dup: (input) -> + output: null + if input instaceof Array + output: [] + for val in input + output.push(val) + else + output: {} + for key, val of input + output.key: val + output + output + # The abstract base class for all CoffeeScript nodes. # All nodes are implement a "compile_node" method, which performs the # code generation for that node. To compile a node, call the "compile" @@ -25,22 +53,11 @@ exports.Node::mark_as_statement_only: -> exports.Node::mark_as_top_sensitive: -> this.is_top_sensitive: -> true -flatten: (aggList, newList) -> - for item in newList - aggList.push(item) - aggList - -compact: (input) -> - compected: [] - for item in input - if item? - compacted.push(item) - # Provide a quick implementation of a children method. exports.Node::children: (attributes) -> # TODO -- are these optimal impls of flatten and compact # .. do better ones exist in a stdlib? - agg = [] + agg: [] for item in attributes agg: flatten agg, item compacted: compact agg @@ -51,6 +68,7 @@ exports.Node::write: (code) -> # hm.. # TODO -- should print to STDOUT in "VERBOSE" how to # go about this.. ? jsonify 'this'? + # use node's puts ?? code # This is extremely important -- we convert JS statements into expressions @@ -85,14 +103,11 @@ exports.Node::idt: (tLvl) -> tabAmt: tabAmt + this.TAB this.indent + tabAmt -exports.Node::is_a_node: -> - true - #Does this node, or any of it's children, contain a node of a certain kind? exports.Node::do_i_contain: (block) -> for node in this.children return true if block(node) - return true if node.is_a_node() and node.do_i_contain(block) + return true if node instanceof exports.Node and node.do_i_contain(block) false # Default implementations of the common node methods. @@ -102,7 +117,102 @@ exports.Node::is_a_statement: -> false exports.Node::is_a_statement_only: -> false exports.Node::is_top_sensitive: -> false -exports.Expressions : exports.Node +# A collection of nodes, each one representing an expression. +exports.Expressions: (nodes) -> + this.mark_as_statement() + this.expressions: [] + this.children([this.expressions]) + for n in nodes + this.expressions: flatten this.expressions, n +exports.Expressions extends exports.Node + +exports.Expressions::TRAILING_WHITESPACE: /\s+$/ + +# Wrap up a node as an Expressions, unless it already is. +exports.Expressions::wrap: (nodes) -> + return nodes[0] if nodes.length == 1 and nodes[0] instanceof exports.Expressions + new Expressions(nodes) + +# Tack an expression on to the end of this expression list. +exports.Expressions::push: (node) -> + this.expressions.push(node) + this + +# Tack an expression on to the beginning of this expression list. +exports.Expressions::unshift: (node) -> + this.expressions.unshift(node) + this + +# If this Expressions consists of a single node, pull it back out. +exports.Expressions::unwrap: -> + if this.expressions.length == 1 then this.expressions[0] else this + +# Is this an empty block of code? +exports.Expressions::is_empty: -> + this.expressions.length == 0 + +# Is the node last in this block of expressions. +exports.Expressions::is_last: (node) -> + arr_length: this.expressions.length + this.last_index ||= if this.expressions[arr_length - 1] instanceof exports.CommentNode then -2 else -1 + node == this.expressions[arr_length - this.last_index] + +exports.Expressions::compile: (o) -> + opts: if o? then o else {} + if opts.scope then super(dup(opts)) else this.compile_root(o) + +# Compile each expression in the Expressions body. +exports.Expressions::compile_node: (options) -> + opts: if options? then options else {} + compiled: [] + for e in this.expressions + compiled.push(this.compile_expression(e, dup(options))) + code: '' + for line in compiled + code: code + line + '\n' + +# If this is the top-level Expressions, wrap everything in a safety closure. +exports.Expressions::compile_root: (o) -> + opts: if o? then o else {} + indent: if opts.no_wrap then '' else this.TAB + this.indent: indent + opts.indent: indent + opts.scope: new Scope(null, this, null) + code: if opts.globals then compile_node(opts) else compile_with_declarations(opts) + code.replace(this.TRAILING_WHITESPACE, '') + this.write(if opts.no_wrap then code else "(function(){\n"+code+"\n})();") + +# Compile the expressions body, with declarations of all inner variables +# at the top. +exports.Expressions::compile_with_declaractions: (o) -> + opts: if o? : o else {} + code: this.compile_node(opts) + args: this.do_i_contain (n) -> n instanceof LiteralNode and n.arguments? + argv: if args and opts.scope.arguments then '' else 'var ' + code: this.idt() + argv+"arguments = Array.prototype.slice.call(arguments, 0);\n"+code if args + code: this.idt() + "var "+opts.scope.compiled_assignments+";\n"+code if o.scope.has_assignments(this) + this.write(code) + + # Compiles a single expression within the expression list. + def compile_expression(node, o) + @indent = o[:indent] + stmt = node.statement? + # We need to return the result if this is the last node in the expressions body. + returns = o.delete(:return) && last?(node) && !node.statement_only? + # Return the regular compile of the node, unless we need to return the result. + return "#{stmt ? '' : idt}#{node.compile(o.merge(:top => true))}#{stmt ? '' : ';'}" unless returns + # If it's a statement, the node knows how to return itself. + return node.compile(o.merge(:return => true)) if node.statement? + # If it's not part of a constructor, we can just return the value of the expression. + return "#{idt}return #{node.compile(o)};" unless o[:scope].function && o[:scope].function.constructor? + # It's the last line of a constructor, add a safety check. + temp = o[:scope].free_variable + "#{idt}#{temp} = #{node.compile(o)};\n#{idt}return #{o[:scope].function.name} === this.constructor ? this : #{temp};" + end + + end + + exports.LiteralNode : exports.Node exports.ReturnNode : exports.Node exports.CommentNode : exports.Node diff --git a/src/scope.coffee b/src/scope.coffee new file mode 100644 index 0000000000..7b56f7bdc3 --- /dev/null +++ b/src/scope.coffee @@ -0,0 +1,99 @@ +dup: (input) -> + output: null + if input instaceof Array + output: [] + for val in input + output.push(val) + else + output: {} + for key, val of input + output.key: val + output + output + +# scope objects form a tree corresponding to the shape of the function +# definitions present in the script. They provide lexical scope, to determine +# whether a variable has been seen before or if it needs to be declared. +exports.Scope: (parent, expressions, func) -> + # Initialize a scope with its parent, for lookups up the chain, + # as well as the Expressions body where it should declare its variables, + # and the function that it wraps. + this.parent: parent + this.expressions: expressions + this.function: func + this.variables: {} + this.temp_variable: if this.parent then dup(this.parent.temp_variable) : '__a' + +# Look up a variable in lexical scope, or declare it if not found. +exports.Scope::find: (name, rem) -> + remote: if rem? then rem else false + found: this.check(name) + return found if found || remote + this.variables[name]: 'var' + found + +# Define a local variable as originating from a parameter in current scope +# -- no var required. +exports.Scope::parameter: (name) -> + this.variables[name]: = 'param' + +# Just check to see if a variable has already been declared. +exports.Scope::check: (name) -> + return true if this.variables[name]? + # TODO: what does that ruby !! mean..? need to follow up + # .. this next line is prolly wrong .. + not not (this.parent and this.parent.check(name)) + +# You can reset a found variable on the immediate scope. +exports.Scope::reset: (name) -> + this.variables[name]: undefined + +exports.Scope::free_variable: -> + # need .succ! impl + + # Find an available, short, name for a compiler-generated variable. + def free_variable + @temp_variable.succ! while check(@temp_variable) + @variables[@temp_variable.to_sym] = :var + Value.new(@temp_variable.dup) + end + + # Ensure that an assignment is made at the top of scope (or top-level + # scope, if requested). + def assign(name, value, top=false) + return @parent.assign(name, value, top) if top && @parent + @variables[name.to_sym] = Value.new(value) + end + + def declarations?(body) + !declared_variables.empty? && body == @expressions + end + + def assignments?(body) + !assigned_variables.empty? && body == @expressions + end + + # Return the list of variables first declared in current scope. + def declared_variables + @variables.select {|k, v| v == :var }.map {|pair| pair[0].to_s }.sort + end + + # Return the list of variables that are supposed to be assigned at the top + # of scope. + def assigned_variables + @variables.select {|k, v| v.is_a?(Value) }.sort_by {|pair| pair[0].to_s } + end + + def compiled_declarations + declared_variables.join(', ') + end + + def compiled_assignments + assigned_variables.map {|name, val| "#{name} = #{val}"}.join(', ') + end + + def inspect + "" + end + + end From b795ae7fe1dd43885ef2323ffdbb310b9e6b4429 Mon Sep 17 00:00:00 2001 From: Jeremy Ashkenas Date: Fri, 5 Feb 2010 22:01:11 -0500 Subject: [PATCH 29/37] removing arguments as a keyword -- we can detect its use at code-generation time. --- lib/coffee_script/grammar.y | 2 - lib/coffee_script/lexer.rb | 3 +- lib/coffee_script/nodes.rb | 10 +- lib/coffee_script/parser.rb | 2679 ++++++++--------- lib/coffee_script/rewriter.rb | 4 +- test/fixtures/execution/test_arguments.coffee | 5 + 6 files changed, 1344 insertions(+), 1359 deletions(-) diff --git a/lib/coffee_script/grammar.y b/lib/coffee_script/grammar.y index c9fb28022a..df1c2a603b 100644 --- a/lib/coffee_script/grammar.y +++ b/lib/coffee_script/grammar.y @@ -13,7 +13,6 @@ token FOR IN OF BY WHEN WHILE token SWITCH LEADING_WHEN token DELETE INSTANCEOF TYPEOF token SUPER EXTENDS -token ARGUMENTS token NEWLINE token COMMENT token JS @@ -102,7 +101,6 @@ rule | REGEX { result = LiteralNode.new(val[0]) } | BREAK { result = LiteralNode.new(val[0]) } | CONTINUE { result = LiteralNode.new(val[0]) } - | ARGUMENTS { result = LiteralNode.new(val[0]) } | TRUE { result = LiteralNode.new(Value.new(true)) } | FALSE { result = LiteralNode.new(Value.new(false)) } | YES { result = LiteralNode.new(Value.new(true)) } diff --git a/lib/coffee_script/lexer.rb b/lib/coffee_script/lexer.rb index ecb56021ba..620d973320 100644 --- a/lib/coffee_script/lexer.rb +++ b/lib/coffee_script/lexer.rb @@ -15,8 +15,7 @@ class Lexer "for", "in", "of", "by", "where", "while", "delete", "instanceof", "typeof", "switch", "when", - "super", "extends", - "arguments"] + "super", "extends"] # Token matching regexes. IDENTIFIER = /\A([a-zA-Z$_](\w|\$)*)/ diff --git a/lib/coffee_script/nodes.rb b/lib/coffee_script/nodes.rb index aaaec0a40f..87648c243a 100644 --- a/lib/coffee_script/nodes.rb +++ b/lib/coffee_script/nodes.rb @@ -153,7 +153,7 @@ def compile_root(o={}) # at the top. def compile_with_declarations(o={}) code = compile_node(o) - args = self.contains? {|n| n.is_a?(LiteralNode) && n.arguments? } + args = self.contains? {|n| n.is_a?(ValueNode) && n.arguments? } argv = args && o[:scope].check('arguments') ? '' : 'var ' code = "#{idt}#{argv}arguments = Array.prototype.slice.call(arguments, 0);\n#{code}" if args code = "#{idt}var #{o[:scope].compiled_assignments};\n#{code}" if o[:scope].assignments?(self) @@ -203,10 +203,6 @@ def statement? end alias_method :statement_only?, :statement? - def arguments? - @value.to_s == 'arguments' - end - def compile_node(o) indent = statement? ? idt : '' ending = statement? ? ';' : '' @@ -361,6 +357,10 @@ def splice? properties? && @properties.last.is_a?(SliceNode) end + def arguments? + @base.to_s == 'arguments' + end + def unwrap @properties.empty? ? @base : self end diff --git a/lib/coffee_script/parser.rb b/lib/coffee_script/parser.rb index b87861d655..5aa620c649 100644 --- a/lib/coffee_script/parser.rb +++ b/lib/coffee_script/parser.rb @@ -10,7 +10,7 @@ module CoffeeScript class Parser < Racc::Parser -module_eval(<<'...end grammar.y/module_eval...', 'grammar.y', 466) +module_eval(<<'...end grammar.y/module_eval...', 'grammar.y', 464) # Lex and parse a CoffeeScript. def parse(code) # Uncomment the following line to enable grammar debugging, in combination @@ -34,349 +34,347 @@ def on_error(error_token_id, error_value, value_stack) ##### State transition tables begin ### clist = [ -'136,11,144,29,32,35,41,44,49,54,58,63,66,106,107,108,61,1,178,281,21', -'26,103,300,105,112,43,163,262,55,59,67,132,138,-186,-186,51,152,12,280', -'22,166,33,37,171,45,279,51,56,61,61,163,13,17,74,4,9,15,151,155,158', -'161,165,169,131,135,140,143,147,150,154,157,160,164,168,130,134,139', -'142,146,149,153,156,159,162,167,129,133,137,141,145,148,172,2,7,125', -'177,310,30,274,36,39,11,48,208,29,32,35,41,44,49,54,58,63,66,283,271', -'202,61,1,212,213,21,26,287,288,202,98,43,296,61,55,59,67,68,97,270,122', -'61,6,12,210,22,202,33,37,163,45,113,51,56,114,77,-186,-186,290,74,4', -'9,15,19,24,13,17,200,40,47,262,262,201,51,13,17,200,61,51,51,98,297', -'13,17,13,17,186,98,97,13,17,13,17,200,163,97,206,207,2,7,61,-186,-186', -'30,176,36,39,11,48,84,29,32,35,41,44,49,54,58,63,66,61,13,17,51,1,99', -'98,21,26,84,51,189,99,43,97,98,55,59,67,68,287,288,190,97,6,12,195,22', -'196,33,37,163,45,197,51,56,13,17,151,155,163,74,4,9,15,19,24,-186,-186', -'51,40,47,163,13,17,186,291,187,51,151,155,158,161,165,169,131,135,140', -'143,147,150,154,157,160,164,168,130,134,139,142,2,7,2,7,77,30,61,36', -'39,11,48,319,29,32,35,41,44,49,54,58,63,66,106,107,108,224,1,13,17,21', -'26,103,209,105,125,43,163,211,55,59,67,68,258,-186,-186,,6,12,,22,,33', -'37,163,45,,51,56,212,213,151,155,,74,4,9,15,19,24,163,,,40,47,,,151', -'155,158,161,165,169,131,135,140,143,147,150,154,157,160,164,168,130', -'134,139,142,313,163,,,,2,7,,-186,-186,30,,36,39,11,48,,29,32,35,41,44', -'49,54,58,63,66,106,107,108,,1,,,21,26,103,,105,,43,163,,55,59,67,68', -',151,155,,6,12,,22,,33,37,163,45,,51,56,,,-186,-186,,74,4,9,15,19,24', -'163,,,40,47,,,151,155,158,161,165,169,131,135,140,143,147,150,154,157', -'160,164,168,130,134,139,142,106,107,108,,,2,7,,,103,30,105,36,39,11', -'48,,29,32,35,41,44,49,54,58,63,66,106,107,108,,1,,,21,26,103,,105,,43', -'163,,55,59,67,68,,-186,-186,,6,12,,22,,33,37,,45,,51,56,,,,,,74,4,9', -'15,19,24,163,,,40,47,,,151,155,158,161,165,169,131,135,140,143,147,150', -'154,157,160,164,168,130,134,139,142,106,107,108,,,2,7,,,103,30,105,36', -'39,11,48,,29,32,35,41,44,49,54,58,63,66,,,,,1,,,21,26,,,,,43,,,55,59', -'67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,,,,74,4,9,15,19,24,163,,,40,47', -',,151,155,158,161,165,169,131,135,140,143,147,150,154,157,160,164,168', -'130,134,139,142,,,,,,2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49,54,58', -'63,66,,,,,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,,45,,51', -'56,,,,,,74,4,9,15,19,24,163,,,40,47,,,151,155,158,161,165,169,131,135', -'140,143,147,150,154,157,160,164,168,130,134,139,142,,,,,,2,7,,,,30,', -'36,39,11,48,,29,32,35,41,44,49,54,58,63,66,,,,,1,,,21,26,,,,,43,,,55', -'59,67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,,,,74,4,9,15,19,24,163,,,40', -'47,,,151,155,158,161,165,169,131,135,140,143,147,150,154,157,160,164', -'168,130,134,139,142,,,,,,2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49,54', -'58,63,66,,,,,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,,45', -',51,56,,,,,,74,4,9,15,19,24,163,,,40,47,,,151,155,158,161,165,169,131', -'135,140,143,147,150,154,157,160,164,168,130,134,139,142,,,,,,2,7,,,', -'30,,36,39,11,48,,29,32,35,41,44,49,54,58,63,66,,,,,1,,,21,26,,,,,43', -',,55,59,67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,,,,74,4,9,15,19,24,163', -',,40,47,,,151,155,158,161,165,169,131,135,140,143,147,150,154,163,,', -',,,,151,155,158,161,165,,2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49,54', -'58,63,66,,,,,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,,45', -',51,56,,,,,,74,4,9,15,19,24,163,,,40,47,,,151,155,158,161,165,169,131', -'135,140,143,147,150,154,163,,,,,,,151,155,158,161,165,,2,7,,,,30,,36', -'39,11,48,,29,32,35,41,44,49,54,58,63,66,,,,,1,,,21,26,,,,,43,,,55,59', -'67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,,,,74,4,9,15,19,24,163,,,40,47', -',,151,155,158,161,165,169,131,135,140,143,147,150,154,,,,,,,,,,,,,,2', -'7,,,,30,,36,39,11,48,,29,32,35,41,44,49,54,58,63,66,,,,,1,,,21,26,,', -',,43,,,55,59,67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,,,,74,4,9,15,19', -'24,163,,,40,47,,,151,155,158,161,165,169,131,135,140,143,147,150,154', -',,,,,,,,,,,,,2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49,54,58,63,66,', -',,,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,', -',,74,4,9,15,19,24,163,,,40,47,,,151,155,158,161,165,169,131,135,140', -'143,,,,,,,,,,,,303,,,,,2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49,54', -'58,63,66,,,,,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,,45', -',51,56,,,,,,74,4,9,15,19,24,163,,,40,47,,,151,155,158,161,165,169,131', -'135,140,143,163,,,,,,,151,155,158,161,165,169,131,,,2,7,,,,30,,36,39', -'11,48,,29,32,35,41,44,49,54,58,63,66,,,,,1,,,21,26,,,,,43,,,55,59,67', -'68,,,,,6,12,,22,,33,37,,45,,51,56,,,,,,74,4,9,15,19,24,163,,,40,47,', -',151,155,158,161,165,169,131,135,140,143,163,,,,,,,151,155,158,161,165', -'169,131,,,2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49,54,58,63,66,,,,', -'1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,,,,74', -'4,9,15,19,24,163,,,40,47,,,151,155,158,161,165,169,131,,,,,,,,,,,,,', -',,,,,,2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49,54,58,63,66,,,,,1,,', -'21,26,,,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,,,,74,4', -'9,15,19,24,,,,40,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,7,,,,30,,36,39,11', -'48,,29,32,35,41,44,49,54,58,63,66,,,,,1,,,21,26,,,,,43,,,55,59,67,68', -',,,,6,12,,22,,33,37,,45,,51,56,114,,,,,74,4,9,15,19,24,,,,40,47,,,,', -',,,,,,,,,,,,,,,,,,,,,,,,2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49,54', -'58,63,66,,,,,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,,45', -',51,56,,,,,,74,4,9,15,19,24,,,,40,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,7', -',,,30,,36,39,11,48,,29,32,35,41,44,49,54,58,63,66,,,,,1,,,21,26,,,,', -'43,,,55,59,67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,,,,74,4,9,15,19,24', -',,,40,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,7,,,,30,,36,39,11,48,,29,32,35', -'41,44,49,54,58,63,66,,,,,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12,,22', -',33,37,,45,,51,56,,,,,,74,4,9,15,19,24,,,,40,47,,,,,,,,,,,,,,,,,,,,', -',,,,,,,,2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49,54,58,63,66,,,,,1', -',,21,26,,,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,,,,74', -'4,9,15,19,24,,,,40,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,7,,,,30,,36,39,11', -'48,,29,32,35,41,44,49,54,58,63,66,,,,,1,,,21,26,,,,,43,,,55,59,67,68', -',,,,6,12,,22,,33,37,,45,,51,56,,,,,,74,4,9,15,19,24,,,,40,47,,,,,,,', -',,,,,,,,,,,,,,,,,,,,,2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49,54,58', -'63,66,,,,,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,,45,,51', -'56,,,,,,74,4,9,15,19,24,,,,40,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,7,,,', -'30,,36,39,11,48,,29,32,35,41,44,49,54,58,63,66,,,,,1,,,21,26,,,,,43', -',,55,59,67,68,,,,,6,12,,22,,33,37,,45,,51,56,,123,,,,74,4,9,15,19,24', -',,,40,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,7,,,,30,,36,39,11,48,,29,32,35', -'41,44,49,54,58,63,66,,,,,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12,,22', -',33,37,,45,,51,56,,,,,,74,4,9,15,19,24,,,,40,47,,,,,,,,,,,,,,,,,,,,', -',,,,,,,,2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49,54,58,63,66,,,,,1', -',,21,26,,,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,,45,,51,56,275,,,,', -'74,4,9,15,19,24,,,,40,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,7,13,17,,30,', -'36,39,11,48,,29,32,35,41,44,49,54,58,63,66,,,,,1,,,21,26,,,,,43,,,55', -'59,67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,,,,74,4,9,15,19,24,,,,40,47', -',,,,,,,,,,,,,,,,,,,,,,,,,,,,2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49', -'54,58,63,66,,,,,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,', -'45,,51,56,,,,,,74,4,9,15,19,24,,,,40,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,', -'2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49,54,58,63,66,,,,,1,,,21,26', -',,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,,,,74,4,9,15,19', -'24,,,,40,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,7,,,,30,,36,39,11,48,,29,32', -'35,41,44,49,54,58,63,66,,,,,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12', -',22,,33,37,,45,,51,56,,,,,,74,4,9,15,19,24,,,,40,47,,,,,,,,,,,,,,,,', -',,,,,,,,,,,,2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49,54,58,63,66,,', -',,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,,', -',74,4,9,15,19,24,,,,40,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,7,,,,30,,36', -'39,11,48,,29,32,35,41,44,49,54,58,63,66,,,,,1,,,21,26,,,,,43,,,55,59', -'67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,,,,74,4,9,15,19,24,,,,40,47,', -',,,,,,,,,,,,,,,,,,,,,,,,,,,2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49', -'54,58,63,66,,,,,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,', -'45,,51,56,,,,,,74,4,9,15,19,24,,,,40,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,', -'2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49,54,58,63,66,,,,,1,,,21,26', -',,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,,,,74,4,9,15,19', -'24,,,,40,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,7,,,,30,,36,39,11,48,,29,32', -'35,41,44,49,54,58,63,66,,,,,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12', -',22,,33,37,,45,,51,56,,,,,,74,4,9,15,19,24,,,,40,47,,,,,,,,,,,,,,,,', -',,,,,,,,,,,,2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49,54,58,63,66,,', -',,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,,', -',74,4,9,15,19,24,,,,40,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,7,,,,30,,36', -'39,11,48,,29,32,35,41,44,49,54,58,63,66,,,,,1,,,21,26,,,,,43,,,55,59', -'67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,,,,74,4,9,15,19,24,,,,40,47,', -',,,,,,,,,,,,,,,,,,,,,,,,,,,2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49', -'54,58,63,66,,,,,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,', -'45,,51,56,,,,,,74,4,9,15,19,24,,,,40,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,', -'2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49,54,58,63,66,,,,,1,,,21,26', -',,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,,,,74,4,9,15,19', -'24,,,,40,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,7,,,,30,,36,39,11,48,,29,32', -'35,41,44,49,54,58,63,66,,,,,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12', -',22,,33,37,,45,,51,56,,,,,,74,4,9,15,19,24,,,,40,47,,,,,,,,,,,,,,,,', -',,,,,,,,,,,,2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49,54,58,63,66,,', -',,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,,', -',74,4,9,15,19,24,,,,40,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,7,,,,30,,36', -'39,11,48,,29,32,35,41,44,49,54,58,63,66,,,,,1,,,21,26,,,,,43,,,55,59', -'67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,,,,74,4,9,15,19,24,,,,40,47,', -',,,,,,,,,,,,,,,,,,,,,,,,,,,2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49', -'54,58,63,66,,,,,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,', -'45,,51,56,,,,,,74,4,9,15,19,24,,,,40,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,', -'2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49,54,58,63,66,,,,,1,,,21,26', -',,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,,,,74,4,9,15,19', -'24,,,,40,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,7,,,,30,,36,39,11,48,,29,32', -'35,41,44,49,54,58,63,66,,,,,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12', -',22,,33,37,,45,,51,56,,,,,,74,4,9,15,19,24,,,,40,47,,,,,,,,,,,,,,,,', -',,,,,,,,,,,,2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49,54,58,63,66,,', -',,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,,', -',74,4,9,15,19,24,,,,40,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,7,,,,30,,36', -'39,11,48,,29,32,35,41,44,49,54,58,63,66,,,,,1,,,21,26,,,,,43,,,55,59', -'67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,,,,74,4,9,15,19,24,,,,40,47,', -',,,,,,,,,,,,,,,,,,,,,,,,,,,2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49', -'54,58,63,66,,,,,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,', -'45,,51,56,,,,,,74,4,9,15,19,24,,,,40,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,', -'2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49,54,58,63,66,,,,,1,,,21,26', -',,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,,,,74,4,9,15,19', -'24,,,,40,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,7,,,,30,,36,39,11,48,,29,32', -'35,41,44,49,54,58,63,66,,,,,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12', -',22,,33,37,,45,,51,56,,,,,,74,4,9,15,19,24,,,,40,47,,,,,,,,,,,,,,,,', -',,,,,,,,,,,,2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49,54,58,63,66,,', -',,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,,', -',74,4,9,15,19,24,,,,40,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,7,,,,30,,36', -'39,11,48,,29,32,35,41,44,49,54,58,63,66,,,,,1,,,21,26,,,,,43,,,55,59', -'67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,,,,74,4,9,15,19,24,,,,40,47,', -',,,,,,,,,,,,,,,,,,,,,,,,,,,2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49', -'54,58,63,66,,,,,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,', -'45,,51,56,,,,,,74,4,9,15,19,24,,,,40,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,', -'2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49,54,58,63,66,,,,,1,,,21,26', -',,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,,,,74,4,9,15,19', -'24,,,,40,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,7,,,,30,,36,39,11,48,,29,32', -'35,41,44,49,54,58,63,66,,,,,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12', -',22,,33,37,,45,,51,56,,,,,,74,4,9,15,19,24,,,,40,47,,,,,,,,,,,,,,,,', -',,,,,,,,,,,,2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49,54,58,63,66,,', -',,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,,', -',74,4,9,15,19,24,,,,40,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,7,,,,30,,36', -'39,11,48,,29,32,35,41,44,49,54,58,63,66,,,,,1,,,21,26,,,,,43,,,55,59', -'67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,,,,74,4,9,15,19,24,,,,40,47,', -',,,,,,,,,,,,,,,,,,,,,,,,,,,2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49', -'54,58,63,66,,,,,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,', -'45,,51,56,114,,,,,74,4,9,15,19,24,,,,40,47,,,,,,,,,,,,,,,,,,,,,,,,,', -',,,2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49,54,58,63,66,,,,,1,,,21', -'26,,,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,,,,74,4,9,15', -'19,24,,,,40,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,7,,,,30,,36,39,11,48,,29', -'32,35,41,44,49,54,58,63,66,,,,,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6', -'12,,22,,33,37,,45,,51,56,,,,,,74,4,9,15,19,24,,,,40,47,,,,,,,,,,,,,', -',,,,,,,,,,,,,,,2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49,54,58,63,66', -',,,,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,,45,,51,56,,', -',,,74,4,9,15,19,24,,,,40,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,7,,,,30,,36', -'39,11,48,,29,32,35,41,44,49,54,58,63,66,,,,,1,,,21,26,,,,,43,,,55,59', -'67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,,,,74,4,9,15,19,24,,,,40,47,', -',,,,,,,,,,,,,,,,,,,,,,,,,,,2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49', -'54,58,63,66,,,,,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,', -'45,,51,56,,,,,,74,4,9,15,19,24,,,,40,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,', -'2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49,54,58,63,66,,,,,1,,,21,26', -',,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,,,,74,4,9,15,19', -'24,,,,40,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,7,,,,30,,36,39,11,48,,29,32', -'35,41,44,49,54,58,63,66,,,,,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12', -',22,,33,37,,45,,51,56,61,,,,,74,4,9,15,19,24,,,,40,47,,,,,,,,,,,,,,', -',,,,,,,,,,,,,,2,7,13,17,,30,,36,39,11,48,,29,32,35,41,44,49,54,58,63', -'66,,,,,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,,45,,51,56', -',,,,,74,4,9,15,19,24,,,,40,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,7,,,,30', -',36,39,11,48,,29,32,35,41,44,49,54,58,63,66,,,,,1,,,21,26,,,,,43,,,55', -'59,67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,,,,74,4,9,15,19,24,,,,40,47', -',,,,,,,,,,,,,,,,,,,,,,,,,,,,2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49', -'54,58,63,66,,,,,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,', -'45,,51,56,,,,,,74,4,9,15,19,24,,,,40,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,', -'2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49,54,58,63,66,,,,,1,,,21,26', -',,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,,,,74,4,9,15,19', -'24,,,,40,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,7,,,,30,,36,39,11,48,,29,32', -'35,41,44,49,54,58,63,66,,,,,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12', -',22,,33,37,,45,,51,56,,,,,,74,4,9,15,19,24,,,,40,47,,,,,,,,,,,,,,,,', -',,,,,,,,,,,,2,7,,,,30,,36,39,11,48,,29,32,35,41,44,49,54,58,63,66,,', -',,1,,,21,26,,,,,43,,,55,59,67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,,', -',74,4,9,15,19,24,,,,40,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,7,,,,30,,36', -'39,11,48,,29,32,35,41,44,49,54,58,63,66,,,,,1,,,21,26,,,,,43,,,55,59', -'67,68,,,,,6,12,,22,,33,37,,45,,51,56,,,136,,144,74,4,9,15,19,24,,,,40', -'47,,,,,,,,,,,,,,,,,,,132,138,,,,152,,,,166,2,7,,,,30,,36,39,163,48,', -',,,,151,155,158,161,165,169,131,135,140,143,147,150,154,157,160,164', -'168,130,134,139,142,146,149,153,156,159,162,167,129,133,137,141,145', -'148,136,,144,,,,,,,,322,,,,,,,,,,,,,,,,,,,,,,132,138,,,,152,,,,166,', -',,,,,,,,163,,,,,,,151,155,158,161,165,169,131,135,140,143,147,150,154', -'157,160,164,168,130,134,139,142,146,149,153,156,159,162,167,129,133', -'137,141,145,148,29,32,35,41,44,49,54,58,63,66,316,,,,1,,,21,26,,,,,43', -',,55,59,67,,,,,,,12,,22,,33,37,,45,,51,56,,,,,,74,4,9,15,19,24,,,,40', -'47,,,,,29,32,35,41,44,49,54,58,63,66,,,,,1,,,21,26,,,,,43,2,7,55,59', -'67,30,,36,39,,48,12,,22,,33,37,,45,,51,56,,,,,,74,4,9,15,19,24,,,,40', -'47,,,,29,32,35,41,44,49,54,58,63,66,,,,,,,,,,,,,,,,2,7,59,67,,30,,36', -'39,,48,,,,,,,45,,,56,,,,,,,,,,,,,,,,,,,29,32,35,41,44,49,54,58,63,66', -',,,,1,,,21,26,,,,,43,,,55,59,67,68,,30,,36,39,12,48,22,,33,37,,45,,51', -'56,,,,,,74,4,9,15,19,24,,,,40,47,,,,29,32,35,41,44,49,54,58,63,66,,', -',,,,,,,,,,,,,2,7,59,67,,30,,36,39,,48,,,,,,,45,,,56,,,136,,144,,,,,', -',,,,,,,,,,,,,,,,,,,,,,,,132,138,,,,152,,,,166,,,,,,30,,36,39,163,48', -',,,,,151,155,158,161,165,169,131,135,140,143,147,150,154,157,160,164', -'168,130,134,139,142,146,149,153,156,159,162,167,129,133,137,141,145', -'148,136,,144,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,132,138,,,,152,,,,166,,,,', -',,,,,163,,,,,,,151,155,158,161,165,169,131,135,140,143,147,150,154,157', -'160,164,168,130,134,139,142,146,149,153,156,159,162,167,129,133,204', -'141,145,148,136,,144,,,,,,,,,,,,,,,,,,,,,,,321,,,,,,,132,138,,,,152', -',,,166,,,,,,,,,,163,,,,,,,151,155,158,161,165,169,131,135,140,143,147', -'150,154,157,160,164,168,130,134,139,142,146,149,153,156,159,162,167', -'129,133,137,141,145,148,136,,144,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,132,138', -',,,152,,,,166,,,,,,,,,,163,,,,,,,151,155,158,161,165,169,131,135,140', -'143,147,150,154,157,160,164,168,130,134,139,142,146,149,153,156,159', -'162,167,129,133,137,141,145,148,136,,144,,,,,,,,,,,,,,,,,,,,,,,,,,,', -',,132,138,,,,152,,,,166,,,,,,,,,,163,,,,,,,151,155,158,161,165,169,131', -'135,140,143,147,150,154,157,160,164,168,130,134,139,142,146,149,153', -'156,159,162,167,129,133,137,141,145,148,136,,144,,,,,,,,,,,,,,,,,,,', -',,,323,,,,,,,132,138,,,,152,,,,166,,,,,,,,,,163,,,,,,,151,155,158,161', -'165,169,131,135,140,143,147,150,154,157,160,164,168,130,134,139,142', -'146,149,153,156,159,162,167,129,133,137,141,145,148,136,,144,,,,,,,', -',,,,,,,,,,,,,,,,,,,,,,132,138,,,,152,,,,166,,,,,,,,,,163,,,,,,,151,155', -'158,161,165,169,131,135,140,143,147,150,154,157,160,164,168,130,134', -'139,142,146,149,153,156,159,162,167,129,133,137,141,145,148,136,,144', -',,,,,,,,,,,,,,,,,,,,,,,,,,,,,132,138,,,,152,,,,166,,,,,,,,,,163,,,,', -',,151,155,158,161,165,169,131,135,140,143,147,150,154,157,160,164,168', -'130,134,139,142,146,149,153,156,159,162,167,129,133,137,141,145,148', -'136,,144,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,132,138,,,,152,,,,166,,,,,,,,', -',163,,,,,,,151,155,158,161,165,169,131,135,140,143,147,150,154,157,160', -'164,168,130,134,139,142,146,149,153,156,159,162,167,129,133,137,141', -'145,148,136,,144,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,132,138,,,,152,,,,166', -',,,,,,,,,163,,,,,,,151,155,158,161,165,169,131,135,140,143,147,150,154', -'157,160,164,168,130,134,139,142,146,149,153,156,159,162,167,129,133', -'137,141,145,148,136,,144,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,132,138,,,,152', -',,,166,,,,,,,,,,163,,,,,,,151,155,158,161,165,169,131,135,140,143,147', -'150,154,157,160,164,168,130,134,139,142,146,149,153,156,159,162,167', -'129,133,137,141,145,148,136,,144,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,132,138', -',,,152,,,,166,,,,,,,,,,163,,,,,,,151,155,158,161,165,169,131,135,140', -'143,147,150,154,157,160,164,168,130,134,139,142,146,149,153,156,159', -'162,167,129,133,137,141,145,148,136,,144,,,,,,,,,,,,,,,,,,,,,,,,,,,', -',,132,138,,,,152,,,,166,,,,,,,,,,163,,,,,,,151,155,158,161,165,169,131', -'135,140,143,147,150,154,157,160,164,168,130,134,139,142,146,149,153', -'156,159,162,167,129,133,137,141,145,148,136,,144,,,,,,,,,,,,,,,,,,,', -',,,,,,,,,,132,138,,,,152,,,,166,,,,,,,,,,163,,,,,,,151,155,158,161,165', -'169,131,135,140,143,147,150,154,157,160,164,168,130,134,139,142,146', -'149,153,156,159,162,167,129,133,137,141,145,148,136,,144,,,,,,,,,,,', -',,,,,,,,,,,,,,,,,,132,138,,,,152,,,,166,,,,,,,,,,163,,,,,,,151,155,158', -'161,165,169,131,135,140,143,147,150,154,157,160,164,168,130,134,139', -'142,146,149,153,156,159,162,167,129,133,137,141,145,148,136,,144,,,', -',,,,,,,,,,,,,,,,,,,,,,,,,,132,138,,,,152,,,,166,,,,,,,,,,163,,,,,,,151', -'155,158,161,165,169,131,135,140,143,147,150,154,157,160,164,168,130', -'134,139,142,146,149,153,156,159,162,167,129,133,137,141,145,148,136', -',144,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,132,138,,,,152,,,,166,,,,,,,,,,163', -',,,,,,151,155,158,161,165,169,131,135,140,143,147,150,154,157,160,164', -'168,130,134,139,142,146,149,153,156,159,162,167,129,133,137,141,145', -'148,136,,144,,,,,,,,,,,,,,,,,,,,,,,273,,,,,,,132,138,,,,152,,,,166,', -',,,,,,,,163,,,,,,,151,155,158,161,165,169,131,135,140,143,147,150,154', -'157,160,164,168,130,134,139,142,146,149,153,156,159,162,167,129,133', -'272,141,145,148,136,,144,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,132,138,,,,152', -',,,166,,,,,,,,185,,163,,,,,,,151,155,158,161,165,169,131,135,140,143', -'147,150,154,157,160,164,168,130,134,139,142,146,149,153,156,159,162', -'167,129,133,137,141,145,148,136,,144,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,132', -'138,,,,152,,,,166,,,,,,,,61,,163,,,,,,,151,155,158,161,165,169,131,135', -'140,143,147,150,154,157,160,164,168,130,134,139,142,146,149,153,156', -'159,162,167,129,133,137,141,145,148,136,,144,,,,,,,,,,,,,,,,,,,,,,,', -',,,,,,132,138,,,,152,,,,166,,,,,,,,,,163,,,,,,,151,155,158,161,165,169', -'131,135,140,143,147,150,154,157,160,164,168,130,134,139,142,146,149', -'153,156,159,162,167,129,133,137,141,145,148,136,,144,,,,,,,,,,,,,,,', -',,,,,,,,,,,,,,132,138,,,,152,,,,166,,,,,,,,61,,163,,,,,,,151,155,158', -'161,165,169,131,135,140,143,147,150,154,157,160,164,168,130,134,139', -'142,146,149,153,156,159,162,167,129,133,137,141,145,148,132,138,,,,', -',,,166,,,,,,,,,,163,,,,,,,151,155,158,161,165,169,131,135,140,143,147', -'150,154,157,160,164,168,130,134,139,142,146,149,153,156,159,162,167', -'129,133,137,141,145,148,132,138,,,,,,,,166,,,,,,,,,,163,,,,,,,151,155', -'158,161,165,169,131,135,140,143,147,150,154,157,160,164,168,130,134', -'139,142,146,149,153,156,159,162,167,129,133,137,141,145,148,132,138', -',,,,,,,166,,,,,,,,,,163,,,,,,,151,155,158,161,165,169,131,135,140,143', -'147,150,154,157,160,164,168,130,134,139,142,146,149,153,156,159,162', -'167,129,133,137,132,138,,,,,,,,166,,,,,,,,,,163,,,,,,,151,155,158,161', -'165,169,131,135,140,143,147,150,154,157,160,164,168,130,134,139,142', -'146,149,153,156,159,162,167,129,133,137,132,138,,,,,,,,166,,,,,,,,,', -'163,,,,,,,151,155,158,161,165,169,131,135,140,143,147,150,154,157,160', -'164,168,130,134,139,142,146,149,153,156,159,162,167,129,133,137,132', -'138,,,,,,,,166,,,,,,,,,,163,,,,,,,151,155,158,161,165,169,131,135,140', -'143,147,150,154,157,160,164,168,130,134,139,142,146,149,153,156,159', -'162,167,129,133,137,138,,,,,,,,166,,,,,,,,,,163,,,,,,,151,155,158,161', -'165,169,131,135,140,143,147,150,154,157,160,164,168,130,134,139,142', -'146,149,153,156,159,162,167,129,133,137,138,,,,,,,,166,,,,,,,,,,163', -',,,,,,151,155,158,161,165,169,131,135,140,143,147,150,154,157,160,164', -'168,130,134,139,142,146,149,153,156,159,162,167,129,133,137,138,,,,', -',,,166,,,,,,,,,,163,,,,,,,151,155,158,161,165,169,131,135,140,143,147', -'150,154,157,160,164,168,130,134,139,142,146,149,153,156,159,162,167', -'129,133,137,138,,,,,,,,166,,,,,,,,,,163,,,,,,,151,155,158,161,165,169', -'131,135,140,143,147,150,154,157,160,164,168,130,134,139,142,146,149', -'153,156,159,162,167,129,133,137,138,,,,,,,,166,,,,,,,,,,163,,,,,,,151', -'155,158,161,165,169,131,135,140,143,147,150,154,157,160,164,168,130', -'134,139,142,146,149,153,156,159,162,167,129,133,137,166,,,,,,,,,,163', -',,,,,,151,155,158,161,165,169,131,135,140,143,147,150,154,157,160,164', -'168,130,134,139,142,146,149,153,156,159,162,167,129,133,166,,,,,,,,', -',163,,,,,,,151,155,158,161,165,169,131,135,140,143,147,150,154,157,160', -'164,168,130,134,139,142,146,149,153,156,159,162,167,129,133,166,,,,', -',,,,,163,,,,,,,151,155,158,161,165,169,131,135,140,143,147,150,154,157', -'160,164,168,130,134,139,142,146,149,153,156,159,162,167,129,133,163', -',,,,,,151,155,158,161,165,169,131,135,140,143,147,150,154,157,160,164', -'168,130,134,139,142,146,149,153,156,159,162,167,129,133,163,,,,,,,151', -'155,158,161,165,169,131,135,140,143,147,150,154,157,160,164,168,130', -'134,139,142,146,149,153,156,159,162,167,129,133,163,,,,,,,151,155,158', -'161,165,169,131,135,140,143,147,150,154,157,160,164,168,130,134,139', -'142,146,149,153,156,159,162,167,129,133,163,,,,,,,151,155,158,161,165', -'169,131,135,140,143,147,150,154,157,160,164,168,130,134,139,142,146', -'149,153,156,159,162,167,129,133,163,,,,,,,151,155,158,161,165,169,131', -'135,140,143,147,150,154,157,160,164,168,130,134,139,142,146,149,153', -'156,159,162,167,129,133' ] - racc_action_table = arr = Array.new(11069, nil) +'134,194,142,28,31,35,40,44,46,52,57,61,64,103,104,105,181,115,103,104', +'105,299,101,270,102,286,287,101,158,102,58,65,130,135,195,146,149,150', +'55,262,55,164,8,14,170,158,47,50,290,199,158,196,146,149,153,156,160', +'146,149,153,156,160,163,167,129,133,138,141,145,148,152,155,159,162', +'166,128,132,137,140,144,147,151,154,157,161,165,127,131,136,139,143', +'171,55,180,8,14,201,26,278,32,36,12,42,204,28,31,35,40,44,46,52,57,61', +'64,187,199,262,12,2,212,213,21,25,47,199,55,97,43,293,209,53,58,65,66', +'94,265,206,207,7,13,311,22,97,33,37,97,55,47,50,185,94,286,287,94,71', +'74,5,10,16,19,8,14,201,34,39,55,262,198,47,8,14,201,289,47,8,14,294', +'8,14,55,8,14,190,97,47,120,95,47,97,95,282,94,55,72,3,55,94,280,26,279', +'32,36,12,42,81,28,31,35,40,44,46,52,57,61,64,277,8,14,124,2,8,14,21', +'25,81,47,8,14,43,158,47,53,58,65,66,208,-185,-185,257,7,13,55,22,158', +'33,37,72,3,47,50,146,149,153,156,160,71,74,5,10,16,19,158,212,213,34', +'39,316,78,146,149,153,156,160,163,167,129,133,138,141,145,148,152,155', +'159,162,166,128,132,137,312,158,78,179,211,72,3,219,-185,-185,26,124', +'32,36,12,42,109,28,31,35,40,44,46,52,57,61,64,103,104,105,,2,,,21,25', +'101,,102,,43,158,,53,58,65,66,,146,149,,7,13,,22,158,33,37,158,,47,50', +'-185,-185,,-185,-185,71,74,5,10,16,19,158,,,34,39,,,146,149,153,156', +'160,163,167,129,133,138,141,145,148,152,155,159,162,166,128,132,137', +'103,104,105,,,72,3,,,101,26,102,32,36,12,42,,28,31,35,40,44,46,52,57', +'61,64,103,104,105,,2,,,21,25,101,,102,,43,158,,53,58,65,66,,146,149', +',7,13,,22,158,33,37,158,,47,50,-185,-185,,-185,-185,71,74,5,10,16,19', +'158,,,34,39,,,146,149,153,156,160,163,167,129,133,138,141,145,148,152', +'155,159,162,166,128,132,137,103,104,105,,,72,3,,,101,26,102,32,36,12', +'42,,28,31,35,40,44,46,52,57,61,64,,,158,,2,,,21,25,-185,-185,,,43,158', +',53,58,65,66,,-185,-185,,7,13,,22,,33,37,,,47,50,8,14,190,,188,71,74', +'5,10,16,19,158,,,34,39,,,146,149,153,156,160,163,167,129,133,138,141', +'145,148,152,155,159,162,166,128,132,137,,,,,,72,3,,,,26,,32,36,12,42', +',28,31,35,40,44,46,52,57,61,64,,,,,2,,,21,25,,,,,43,,,53,58,65,66,,', +',,7,13,,22,,33,37,,,47,50,,,,,,71,74,5,10,16,19,158,,,34,39,,,146,149', +'153,156,160,163,167,129,133,138,141,145,148,152,155,159,162,166,128', +'132,137,,,,,,72,3,,,,26,,32,36,12,42,,28,31,35,40,44,46,52,57,61,64', +',,,,2,,,21,25,,,,,43,,,53,58,65,66,,,,,7,13,,22,,33,37,,,47,50,,,,,', +'71,74,5,10,16,19,158,,,34,39,,,146,149,153,156,160,163,167,129,133,138', +'141,145,148,152,155,159,162,166,128,132,137,,,,,,72,3,,,,26,,32,36,12', +'42,,28,31,35,40,44,46,52,57,61,64,,,,,2,,,21,25,,,,,43,,,53,58,65,66', +',,,,7,13,,22,,33,37,,,47,50,,,,,,71,74,5,10,16,19,158,,,34,39,,,146', +'149,153,156,160,163,167,129,133,138,141,145,148,152,155,159,162,166', +'128,132,137,,,,,,72,3,,,,26,,32,36,12,42,,28,31,35,40,44,46,52,57,61', +'64,,,,,2,,,21,25,,,,,43,,,53,58,65,66,,,,,7,13,,22,,33,37,,,47,50,,', +',,,71,74,5,10,16,19,158,,,34,39,,,146,149,153,156,160,163,167,129,133', +'138,141,145,148,152,155,159,162,166,128,132,137,,,,,,72,3,,,,26,,32', +'36,12,42,,28,31,35,40,44,46,52,57,61,64,,,,,2,,,21,25,,,,,43,,,53,58', +'65,66,,,,,7,13,,22,,33,37,,,47,50,,,,,,71,74,5,10,16,19,158,,,34,39', +',,146,149,153,156,160,163,167,129,133,138,141,145,148,,,,,,,,,,,,,,72', +'3,,,,26,,32,36,12,42,,28,31,35,40,44,46,52,57,61,64,,,,,2,,,21,25,,', +',,43,,,53,58,65,66,,,,,7,13,,22,,33,37,,,47,50,,,,,,71,74,5,10,16,19', +'158,,,34,39,,,146,149,153,156,160,163,167,129,133,138,141,145,148,,', +',,,,,,,,,,,72,3,,,,26,,32,36,12,42,,28,31,35,40,44,46,52,57,61,64,,', +',,2,,,21,25,,,,,43,,,53,58,65,66,,,,,7,13,,22,,33,37,,,47,50,,,,,,71', +'74,5,10,16,19,158,,,34,39,,,146,149,153,156,160,163,167,129,133,138', +'141,145,148,,,,,,,,,,,,,,72,3,,,,26,,32,36,12,42,,28,31,35,40,44,46', +'52,57,61,64,,,,,2,,,21,25,,,,,43,,,53,58,65,66,,,,,7,13,,22,,33,37,', +',47,50,,,,,,71,74,5,10,16,19,158,,,34,39,,,146,149,153,156,160,163,167', +'129,133,138,141,145,148,,,,,,,,,302,,,,,72,3,,,,26,,32,36,12,42,,28', +'31,35,40,44,46,52,57,61,64,,,,,2,,,21,25,,,,,43,,,53,58,65,66,,,,,7', +'13,,22,,33,37,,,47,50,,,,,,71,74,5,10,16,19,158,,,34,39,,,146,149,153', +'156,160,163,167,129,133,138,158,,,,,,,146,149,153,156,160,163,167,,', +'72,3,,,,26,,32,36,12,42,,28,31,35,40,44,46,52,57,61,64,,,,,2,,,21,25', +',,,,43,,,53,58,65,66,,,,,7,13,,22,,33,37,,,47,50,,,,,,71,74,5,10,16', +'19,158,,,34,39,,,146,149,153,156,160,163,167,129,133,138,158,,,,,,,146', +'149,153,156,160,163,167,,,72,3,,,,26,,32,36,12,42,,28,31,35,40,44,46', +'52,57,61,64,,,,,2,,,21,25,,,,,43,,,53,58,65,66,,,,,7,13,,22,,33,37,', +',47,50,,,,,,71,74,5,10,16,19,158,,,34,39,,,146,149,153,156,160,163,167', +'129,133,138,158,,,,,,,146,149,153,156,160,163,167,,,72,3,,,,26,,32,36', +'12,42,,28,31,35,40,44,46,52,57,61,64,,,,,2,,,21,25,,,,,43,,,53,58,65', +'66,,,,,7,13,,22,,33,37,,,47,50,,,,,,71,74,5,10,16,19,,,,34,39,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,72,3,,,,26,,32,36,12,42,,28,31,35,40,44,46,52', +'57,61,64,,,,,2,,,21,25,,,,,43,,,53,58,65,66,,,,,7,13,,22,,33,37,,,47', +'50,112,,,,,71,74,5,10,16,19,,,,34,39,,,,,,,,,,,,,,,,,,,,,,,,,,,,,72', +'3,,,,26,,32,36,12,42,,28,31,35,40,44,46,52,57,61,64,,,,,2,,,21,25,,', +',,43,,,53,58,65,66,,,,,7,13,,22,,33,37,,,47,50,,,,,,71,74,5,10,16,19', +',,,34,39,,,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,26,,32,36,12,42,,28,31', +'35,40,44,46,52,57,61,64,,,,,2,,,21,25,,,,,43,,,53,58,65,66,,,,,7,13', +',22,,33,37,,,47,50,,,,,,71,74,5,10,16,19,,,,34,39,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,72,3,,,,26,,32,36,12,42,,28,31,35,40,44,46,52,57,61,64,,,', +',2,,,21,25,,,,,43,,,53,58,65,66,,,,,7,13,,22,,33,37,,,47,50,,,,,,71', +'74,5,10,16,19,,,,34,39,,,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,26,,32,36', +'12,42,,28,31,35,40,44,46,52,57,61,64,,,,,2,,,21,25,,,,,43,,,53,58,65', +'66,,,,,7,13,,22,,33,37,,,47,50,,,,,,71,74,5,10,16,19,,,,34,39,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,72,3,,,,26,,32,36,12,42,,28,31,35,40,44,46,52', +'57,61,64,,,,,2,,,21,25,,,,,43,,,53,58,65,66,,,,,7,13,,22,,33,37,,,47', +'50,,,,,,71,74,5,10,16,19,,,,34,39,,,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,', +',,26,,32,36,12,42,,28,31,35,40,44,46,52,57,61,64,,,,,2,,,21,25,,,,,43', +',,53,58,65,66,,,,,7,13,,22,,33,37,,,47,50,,,,,,71,74,5,10,16,19,,,,34', +'39,,,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,26,,32,36,12,42,,28,31,35,40', +'44,46,52,57,61,64,,,,,2,,,21,25,,,,,43,,,53,58,65,66,,,,,7,13,,22,,33', +'37,,,47,50,,121,,,,71,74,5,10,16,19,,,,34,39,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,72,3,,,,26,,32,36,12,42,,28,31,35,40,44,46,52,57,61,64,,,,,2,,', +'21,25,,,,,43,,,53,58,65,66,,,,,7,13,,22,,33,37,,,47,50,274,,,,,71,74', +'5,10,16,19,,,,34,39,,,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,8,14,,26,,32,36', +'12,42,,28,31,35,40,44,46,52,57,61,64,,,,,2,,,21,25,,,,,43,,,53,58,65', +'66,,,,,7,13,,22,,33,37,,,47,50,,,,,,71,74,5,10,16,19,,,,34,39,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,72,3,,,,26,,32,36,12,42,,28,31,35,40,44,46,52', +'57,61,64,,,,,2,,,21,25,,,,,43,,,53,58,65,66,,,,,7,13,,22,,33,37,,,47', +'50,,,,,,71,74,5,10,16,19,,,,34,39,,,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,', +',,26,,32,36,12,42,,28,31,35,40,44,46,52,57,61,64,,,,,2,,,21,25,,,,,43', +',,53,58,65,66,,,,,7,13,,22,,33,37,,,47,50,,,,,,71,74,5,10,16,19,,,,34', +'39,,,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,26,,32,36,12,42,,28,31,35,40', +'44,46,52,57,61,64,,,,,2,,,21,25,,,,,43,,,53,58,65,66,,,,,7,13,,22,,33', +'37,,,47,50,,,,,,71,74,5,10,16,19,,,,34,39,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,72,3,,,,26,,32,36,12,42,,28,31,35,40,44,46,52,57,61,64,,,,,2,,,21', +'25,,,,,43,,,53,58,65,66,,,,,7,13,,22,,33,37,,,47,50,,,,,,71,74,5,10', +'16,19,,,,34,39,,,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,26,,32,36,12,42,', +'28,31,35,40,44,46,52,57,61,64,,,,,2,,,21,25,,,,,43,,,53,58,65,66,,,', +',7,13,,22,,33,37,,,47,50,,,,,,71,74,5,10,16,19,,,,34,39,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,72,3,,,,26,,32,36,12,42,,28,31,35,40,44,46,52,57,61', +'64,,,,,2,,,21,25,,,,,43,,,53,58,65,66,,,,,7,13,,22,,33,37,,,47,50,,', +',,,71,74,5,10,16,19,,,,34,39,,,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,26', +',32,36,12,42,,28,31,35,40,44,46,52,57,61,64,,,,,2,,,21,25,,,,,43,,,53', +'58,65,66,,,,,7,13,,22,,33,37,,,47,50,,,,,,71,74,5,10,16,19,,,,34,39', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,26,,32,36,12,42,,28,31,35,40,44', +'46,52,57,61,64,,,,,2,,,21,25,,,,,43,,,53,58,65,66,,,,,7,13,,22,,33,37', +',,47,50,,,,,,71,74,5,10,16,19,,,,34,39,,,,,,,,,,,,,,,,,,,,,,,,,,,,,72', +'3,,,,26,,32,36,12,42,,28,31,35,40,44,46,52,57,61,64,,,,,2,,,21,25,,', +',,43,,,53,58,65,66,,,,,7,13,,22,,33,37,,,47,50,,,,,,71,74,5,10,16,19', +',,,34,39,,,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,26,,32,36,12,42,,28,31', +'35,40,44,46,52,57,61,64,,,,,2,,,21,25,,,,,43,,,53,58,65,66,,,,,7,13', +',22,,33,37,,,47,50,,,,,,71,74,5,10,16,19,,,,34,39,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,72,3,,,,26,,32,36,12,42,,28,31,35,40,44,46,52,57,61,64,,,', +',2,,,21,25,,,,,43,,,53,58,65,66,,,,,7,13,,22,,33,37,,,47,50,,,,,,71', +'74,5,10,16,19,,,,34,39,,,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,26,,32,36', +'12,42,,28,31,35,40,44,46,52,57,61,64,,,,,2,,,21,25,,,,,43,,,53,58,65', +'66,,,,,7,13,,22,,33,37,,,47,50,,,,,,71,74,5,10,16,19,,,,34,39,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,72,3,,,,26,,32,36,12,42,,28,31,35,40,44,46,52', +'57,61,64,,,,,2,,,21,25,,,,,43,,,53,58,65,66,,,,,7,13,,22,,33,37,,,47', +'50,,,,,,71,74,5,10,16,19,,,,34,39,,,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,', +',,26,,32,36,12,42,,28,31,35,40,44,46,52,57,61,64,,,,,2,,,21,25,,,,,43', +',,53,58,65,66,,,,,7,13,,22,,33,37,,,47,50,,,,,,71,74,5,10,16,19,,,,34', +'39,,,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,26,,32,36,12,42,,28,31,35,40', +'44,46,52,57,61,64,,,,,2,,,21,25,,,,,43,,,53,58,65,66,,,,,7,13,,22,,33', +'37,,,47,50,,,,,,71,74,5,10,16,19,,,,34,39,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,72,3,,,,26,,32,36,12,42,,28,31,35,40,44,46,52,57,61,64,,,,,2,,,21', +'25,,,,,43,,,53,58,65,66,,,,,7,13,,22,,33,37,,,47,50,,,,,,71,74,5,10', +'16,19,,,,34,39,,,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,26,,32,36,12,42,', +'28,31,35,40,44,46,52,57,61,64,,,,,2,,,21,25,,,,,43,,,53,58,65,66,,,', +',7,13,,22,,33,37,,,47,50,,,,,,71,74,5,10,16,19,,,,34,39,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,72,3,,,,26,,32,36,12,42,,28,31,35,40,44,46,52,57,61', +'64,,,,,2,,,21,25,,,,,43,,,53,58,65,66,,,,,7,13,,22,,33,37,,,47,50,,', +',,,71,74,5,10,16,19,,,,34,39,,,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,26', +',32,36,12,42,,28,31,35,40,44,46,52,57,61,64,,,,,2,,,21,25,,,,,43,,,53', +'58,65,66,,,,,7,13,,22,,33,37,,,47,50,,,,,,71,74,5,10,16,19,,,,34,39', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,26,,32,36,12,42,,28,31,35,40,44', +'46,52,57,61,64,,,,,2,,,21,25,,,,,43,,,53,58,65,66,,,,,7,13,,22,,33,37', +',,47,50,,,,,,71,74,5,10,16,19,,,,34,39,,,,,,,,,,,,,,,,,,,,,,,,,,,,,72', +'3,,,,26,,32,36,12,42,,28,31,35,40,44,46,52,57,61,64,,,,,2,,,21,25,,', +',,43,,,53,58,65,66,,,,,7,13,,22,,33,37,,,47,50,,,,,,71,74,5,10,16,19', +',,,34,39,,,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,26,,32,36,12,42,,28,31', +'35,40,44,46,52,57,61,64,,,,,2,,,21,25,,,,,43,,,53,58,65,66,,,,,7,13', +',22,,33,37,,,47,50,,,,,,71,74,5,10,16,19,,,,34,39,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,72,3,,,,26,,32,36,12,42,,28,31,35,40,44,46,52,57,61,64,,,', +',2,,,21,25,,,,,43,,,53,58,65,66,,,,,7,13,,22,,33,37,,,47,50,,,,,,71', +'74,5,10,16,19,,,,34,39,,,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,26,,32,36', +'12,42,,28,31,35,40,44,46,52,57,61,64,,,,,2,,,21,25,,,,,43,,,53,58,65', +'66,,,,,7,13,,22,,33,37,,,47,50,,,,,,71,74,5,10,16,19,,,,34,39,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,72,3,,,,26,,32,36,12,42,,28,31,35,40,44,46,52', +'57,61,64,,,,,2,,,21,25,,,,,43,,,53,58,65,66,,,,,7,13,,22,,33,37,,,47', +'50,,,,,,71,74,5,10,16,19,,,,34,39,,,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,', +',,26,,32,36,12,42,,28,31,35,40,44,46,52,57,61,64,,,,,2,,,21,25,,,,,43', +',,53,58,65,66,,,,,7,13,,22,,33,37,,,47,50,112,,,,,71,74,5,10,16,19,', +',,34,39,,,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,26,,32,36,12,42,,28,31,35', +'40,44,46,52,57,61,64,,,,,2,,,21,25,,,,,43,,,53,58,65,66,,,,,7,13,,22', +',33,37,,,47,50,,,,,,71,74,5,10,16,19,,,,34,39,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,72,3,,,,26,,32,36,12,42,,28,31,35,40,44,46,52,57,61,64,,,,,2,', +',21,25,,,,,43,,,53,58,65,66,,,,,7,13,,22,,33,37,,,47,50,,,,,,71,74,5', +'10,16,19,,,,34,39,,,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,26,,32,36,12,42', +',28,31,35,40,44,46,52,57,61,64,,,,,2,,,21,25,,,,,43,,,53,58,65,66,,', +',,7,13,,22,,33,37,,,47,50,,,,,,71,74,5,10,16,19,,,,34,39,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,72,3,,,,26,,32,36,12,42,,28,31,35,40,44,46,52,57,61', +'64,,,,,2,,,21,25,,,,,43,,,53,58,65,66,,,,,7,13,,22,,33,37,,,47,50,,', +',,,71,74,5,10,16,19,,,,34,39,,,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,26', +',32,36,12,42,,28,31,35,40,44,46,52,57,61,64,,,,,2,,,21,25,,,,,43,,,53', +'58,65,66,,,,,7,13,,22,,33,37,,,47,50,,,,,,71,74,5,10,16,19,,,,34,39', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,26,,32,36,12,42,,28,31,35,40,44', +'46,52,57,61,64,,,,,2,,,21,25,,,,,43,,,53,58,65,66,,,,,7,13,,22,,33,37', +',,47,50,,,,,,71,74,5,10,16,19,,,,34,39,,,,,,,,,,,,,,,,,,,,,,,,,,,,,72', +'3,,,,26,,32,36,12,42,,28,31,35,40,44,46,52,57,61,64,,,,,2,,,21,25,,', +',,43,,,53,58,65,66,,,,,7,13,,22,,33,37,,,47,50,,,,,,71,74,5,10,16,19', +',,,34,39,,,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,26,,32,36,12,42,,28,31', +'35,40,44,46,52,57,61,64,,,,,2,,,21,25,,,,,43,,,53,58,65,66,,,,,7,13', +',22,,33,37,,,47,50,,,,,,71,74,5,10,16,19,,,,34,39,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,72,3,,,,26,,32,36,12,42,,28,31,35,40,44,46,52,57,61,64,,,', +',2,,,21,25,,,,,43,,,53,58,65,66,,,,,7,13,,22,,33,37,,,47,50,,,,,,71', +'74,5,10,16,19,,,,34,39,,,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,26,,32,36', +'12,42,,28,31,35,40,44,46,52,57,61,64,,,,,2,,,21,25,,,,,43,,,53,58,65', +'66,,,,,7,13,,22,,33,37,,,47,50,112,,,,,71,74,5,10,16,19,,,,34,39,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,26,,32,36,12,42,,28,31,35,40,44,46', +'52,57,61,64,,,,,2,,,21,25,,,,,43,,,53,58,65,66,,,,,7,13,,22,,33,37,', +',47,50,,,,,,71,74,5,10,16,19,,,,34,39,,,,,,,,,,,,,,,,,,,,,,,,,,,,,72', +'3,,,,26,,32,36,12,42,,28,31,35,40,44,46,52,57,61,64,,,,,2,,,21,25,,', +',,43,,,53,58,65,66,,,,,7,13,,22,,33,37,,,47,50,55,,,,,71,74,5,10,16', +'19,,,,34,39,,,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,8,14,,26,,32,36,12,42,', +'28,31,35,40,44,46,52,57,61,64,,,,,2,,,21,25,,,,,43,,,53,58,65,66,,,', +',7,13,,22,,33,37,,,47,50,,,,,,71,74,5,10,16,19,,,,34,39,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,72,3,,,,26,,32,36,12,42,,28,31,35,40,44,46,52,57,61', +'64,,,,,2,,,21,25,,,,,43,,,53,58,65,66,,,,,7,13,,22,,33,37,,,47,50,,', +',,,71,74,5,10,16,19,,,,34,39,,,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,26', +',32,36,12,42,,28,31,35,40,44,46,52,57,61,64,,,,,2,,,21,25,,,,,43,,,53', +'58,65,66,,,,,7,13,,22,,33,37,,,47,50,,,,,,71,74,5,10,16,19,,,,34,39', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,26,,32,36,12,42,,28,31,35,40,44', +'46,52,57,61,64,,,,,2,,,21,25,,,,,43,,,53,58,65,66,,,,,7,13,,22,,33,37', +',,47,50,,,,,,71,74,5,10,16,19,,,,34,39,,,,,,,,,,,,,,,,,,,,,,,,,,,,,72', +'3,,,,26,,32,36,12,42,,28,31,35,40,44,46,52,57,61,64,,,,,2,,,21,25,,', +',,43,,,53,58,65,66,,,,,7,13,,22,,33,37,,,47,50,,,,,,71,74,5,10,16,19', +',,,34,39,,,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,26,,32,36,12,42,,28,31', +'35,40,44,46,52,57,61,64,,,,,2,,,21,25,,,,,43,,,53,58,65,66,,,,,7,13', +',22,,33,37,,,47,50,,,,,,71,74,5,10,16,19,,,,34,39,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,72,3,,,,26,,32,36,12,42,,28,31,35,40,44,46,52,57,61,64,,,', +',2,,,21,25,,,,,43,,,53,58,65,66,,,,,7,13,,22,,33,37,,,47,50,,,,,,71', +'74,5,10,16,19,,,,34,39,,,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,26,,32,36', +'12,42,,28,31,35,40,44,46,52,57,61,64,,,,,2,,,21,25,,,,,43,,,53,58,65', +'66,,,,,7,13,,22,,33,37,,,47,50,,,,,,71,74,5,10,16,19,,,,34,39,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,72,3,,,,26,,32,36,12,42,,28,31,35,40,44,46,52', +'57,61,64,,,,,2,,,21,25,,,,,43,,,53,58,65,66,,,,,7,13,,22,,33,37,,,47', +'50,134,,142,,,71,74,5,10,16,19,,,,34,39,,,,,,,,,,,,,,,,,130,135,,,,150', +',,,164,,,72,3,,,,26,158,32,36,,42,,,146,149,153,156,160,163,167,129', +'133,138,141,145,148,152,155,159,162,166,128,132,137,140,144,147,151', +'154,157,161,165,127,131,136,139,143,134,,142,,,,,,,,321,,,,,,,,,,,,', +',,,,,,,,,130,135,,,,150,,,,164,,,,,,,,,158,,,,,,,146,149,153,156,160', +'163,167,129,133,138,141,145,148,152,155,159,162,166,128,132,137,140', +'144,147,151,154,157,161,165,127,131,136,139,143,28,31,35,40,44,46,52', +'57,61,64,315,,,,2,,,21,25,,,,,43,,,53,58,65,,,,,,,13,,22,,33,37,,,47', +'50,,,,,,71,74,5,10,16,19,,,,34,39,,,,,28,31,35,40,44,46,52,57,61,64', +',,,,2,,,21,25,,,,,43,72,3,53,58,65,26,,32,36,,42,13,,22,,33,37,,,47', +'50,,,,,,71,74,5,10,28,31,35,40,44,46,52,57,61,64,,,,,,,,,,,,,,,,,,58', +'65,,,,,,,72,3,,,,26,,32,36,50,42,,,,,,,,,,,,,,,,,,28,31,35,40,44,46', +'52,57,61,64,,,,,2,,,21,25,,,,,43,,,53,58,65,66,,26,,32,36,13,42,22,', +'33,37,,,47,50,,,,,,71,74,5,10,16,19,,,,34,39,,,,,28,31,35,40,44,46,52', +'57,61,64,,,,,2,,,21,25,,,,,43,72,3,53,58,65,26,,32,36,,42,13,,22,,33', +'37,,,47,50,134,,142,,,71,74,5,10,16,19,,,,34,39,,,,,,,,,,,,,,,,,130', +'135,,,,150,,,,164,,,72,3,,,,26,158,32,36,,42,,,146,149,153,156,160,163', +'167,129,133,138,141,145,148,152,155,159,162,166,128,132,137,140,144', +'147,151,154,157,161,165,127,131,136,139,143,134,,142,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,130,135,,,,150,,,,164,,,,,,,,,158,,,,,,,146,149,153,156', +'160,163,167,129,133,138,141,145,148,152,155,159,162,166,128,132,137', +'140,144,147,151,154,157,161,165,127,131,136,139,143,134,,142,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,130,135,,,,150,,,,164,,,,,,,,,158,,,,,,,146,149', +'153,156,160,163,167,129,133,138,141,145,148,152,155,159,162,166,128', +'132,137,140,144,147,151,154,157,161,165,127,131,136,139,143,134,,142', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,130,135,,,,150,,,,164,,,,,,,,,158,,,,,', +',146,149,153,156,160,163,167,129,133,138,141,145,148,152,155,159,162', +'166,128,132,137,140,144,147,151,154,157,161,165,127,131,136,139,143', +'134,,142,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,130,135,,,,150,,,,164,,,,,,,,', +'158,,,,,,,146,149,153,156,160,163,167,129,133,138,141,145,148,152,155', +'159,162,166,128,132,137,140,144,147,151,154,157,161,165,127,131,136', +'139,143,134,,142,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,130,135,,,,150,,,,164', +',,,,,,,,158,,,,,,,146,149,153,156,160,163,167,129,133,138,141,145,148', +'152,155,159,162,166,128,132,137,140,144,147,151,154,157,161,165,127', +'131,136,139,143,134,,142,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,130,135,,,,150', +',,,164,,,,,,,,,158,,,,,,,146,149,153,156,160,163,167,129,133,138,141', +'145,148,152,155,159,162,166,128,132,137,140,144,147,151,154,157,161', +'165,127,202,136,139,143,134,,142,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,130,135', +',,,150,,,,164,,,,,,,,,158,,,,,,,146,149,153,156,160,163,167,129,133', +'138,141,145,148,152,155,159,162,166,128,132,137,140,144,147,151,154', +'157,161,165,127,131,136,139,143,134,,142,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,130,135,,,,150,,,,164,,,,,,,,,158,,,,,,,146,149,153,156,160,163,167', +'129,133,138,141,145,148,152,155,159,162,166,128,132,137,140,144,147', +'151,154,157,161,165,127,131,136,139,143,134,,142,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,130,135,,,,150,,,,164,,,,,,,,,158,,,,,,,146,149,153,156,160', +'163,167,129,133,138,141,145,148,152,155,159,162,166,128,132,137,140', +'144,147,151,154,157,161,165,127,131,136,139,143,134,,142,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,130,135,,,,150,,,,164,,,,,,,,,158,,,,,,,146,149,153', +'156,160,163,167,129,133,138,141,145,148,152,155,159,162,166,128,132', +'137,140,144,147,151,154,157,161,165,127,131,136,139,143,134,,142,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,130,135,,,,150,,,,164,,,,,,,,,158,,,,,,,146', +'149,153,156,160,163,167,129,133,138,141,145,148,152,155,159,162,166', +'128,132,137,140,144,147,151,154,157,161,165,127,131,136,139,143,134', +',142,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,130,135,,,,150,,,,164,,,,,,,,,158', +',,,,,,146,149,153,156,160,163,167,129,133,138,141,145,148,152,155,159', +'162,166,128,132,137,140,144,147,151,154,157,161,165,127,131,136,139', +'143,134,,142,,,,,,,,,,,,,,,,,,,,,,,272,,,,,,,130,135,,,,150,,,,164,', +',,,,,,,158,,,,,,,146,149,153,156,160,163,167,129,133,138,141,145,148', +'152,155,159,162,166,128,132,137,140,144,147,151,154,157,161,165,127', +'271,136,139,143,134,,142,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,130,135,,,,150', +',,,164,,,,,,,,,158,,,,,,,146,149,153,156,160,163,167,129,133,138,141', +'145,148,152,155,159,162,166,128,132,137,140,144,147,151,154,157,161', +'165,127,131,136,139,143,134,,142,,,,,,,,,,,,,,,,,,,,,,,320,,,,,,,130', +'135,,,,150,,,,164,,,,,,,,,158,,,,,,,146,149,153,156,160,163,167,129', +'133,138,141,145,148,152,155,159,162,166,128,132,137,140,144,147,151', +'154,157,161,165,127,131,136,139,143,134,,142,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,130,135,,,,150,,,,164,,,,,,,,,158,,,,,,,146,149,153,156,160,163', +'167,129,133,138,141,145,148,152,155,159,162,166,128,132,137,140,144', +'147,151,154,157,161,165,127,131,136,139,143,134,,142,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,130,135,,,,150,,,,164,,,,,,,184,,158,,,,,,,146,149,153', +'156,160,163,167,129,133,138,141,145,148,152,155,159,162,166,128,132', +'137,140,144,147,151,154,157,161,165,127,131,136,139,143,134,,142,,,', +',,,,,,,,,,,,,,,,,,,322,,,,,,,130,135,,,,150,,,,164,,,,,,,,,158,,,,,', +',146,149,153,156,160,163,167,129,133,138,141,145,148,152,155,159,162', +'166,128,132,137,140,144,147,151,154,157,161,165,127,131,136,139,143', +'134,,142,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,130,135,,,,150,,,,164,,,,,,,55', +',158,,,,,,,146,149,153,156,160,163,167,129,133,138,141,145,148,152,155', +'159,162,166,128,132,137,140,144,147,151,154,157,161,165,127,131,136', +'139,143,134,,142,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,130,135,,,,150,,,,164', +',,,,,,,,158,,,,,,,146,149,153,156,160,163,167,129,133,138,141,145,148', +'152,155,159,162,166,128,132,137,140,144,147,151,154,157,161,165,127', +'131,136,139,143,134,,142,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,130,135,,,,150', +',,,164,,,,,,,55,,158,,,,,,,146,149,153,156,160,163,167,129,133,138,141', +'145,148,152,155,159,162,166,128,132,137,140,144,147,151,154,157,161', +'165,127,131,136,139,143,130,135,,,,,,,,164,,,,,,,,,158,,,,,,,146,149', +'153,156,160,163,167,129,133,138,141,145,148,152,155,159,162,166,128', +'132,137,140,144,147,151,154,157,161,165,127,131,136,139,143,130,135', +',,,,,,,164,,,,,,,,,158,,,,,,,146,149,153,156,160,163,167,129,133,138', +'141,145,148,152,155,159,162,166,128,132,137,140,144,147,151,154,157', +'161,165,127,131,136,139,143,130,135,,,,,,,,164,,,,,,,,,158,,,,,,,146', +'149,153,156,160,163,167,129,133,138,141,145,148,152,155,159,162,166', +'128,132,137,140,144,147,151,154,157,161,165,127,131,130,135,,,,,,,,164', +',,,,,,,,158,,,,,,,146,149,153,156,160,163,167,129,133,138,141,145,148', +'152,155,159,162,166,128,132,137,140,144,147,151,154,157,161,165,127', +'131,130,135,,,,,,,,164,,,,,,,,,158,,,,,,,146,149,153,156,160,163,167', +'129,133,138,141,145,148,152,155,159,162,166,128,132,137,140,144,147', +'151,154,157,161,165,127,131,130,135,,,,,,,,164,,,,,,,,,158,,,,,,,146', +'149,153,156,160,163,167,129,133,138,141,145,148,152,155,159,162,166', +'128,132,137,140,144,147,151,154,157,161,165,127,131,135,,,,,,,,164,', +',,,,,,,158,,,,,,,146,149,153,156,160,163,167,129,133,138,141,145,148', +'152,155,159,162,166,128,132,137,140,144,147,151,154,157,161,165,127', +'131,135,,,,,,,,164,,,,,,,,,158,,,,,,,146,149,153,156,160,163,167,129', +'133,138,141,145,148,152,155,159,162,166,128,132,137,140,144,147,151', +'154,157,161,165,127,131,135,,,,,,,,164,,,,,,,,,158,,,,,,,146,149,153', +'156,160,163,167,129,133,138,141,145,148,152,155,159,162,166,128,132', +'137,140,144,147,151,154,157,161,165,127,131,135,,,,,,,,164,,,,,,,,,158', +',,,,,,146,149,153,156,160,163,167,129,133,138,141,145,148,152,155,159', +'162,166,128,132,137,140,144,147,151,154,157,161,165,127,131,135,,,,', +',,,164,,,,,,,,,158,,,,,,,146,149,153,156,160,163,167,129,133,138,141', +'145,148,152,155,159,162,166,128,132,137,140,144,147,151,154,157,161', +'165,127,131,164,,,,,,,,,158,,,,,,,146,149,153,156,160,163,167,129,133', +'138,141,145,148,152,155,159,162,166,128,132,137,140,144,147,151,154', +'157,161,165,127,164,,,,,,,,,158,,,,,,,146,149,153,156,160,163,167,129', +'133,138,141,145,148,152,155,159,162,166,128,132,137,140,144,147,151', +'154,157,161,165,127,164,,,,,,,,,158,,,,,,,146,149,153,156,160,163,167', +'129,133,138,141,145,148,152,155,159,162,166,128,132,137,140,144,147', +'151,154,157,161,165,127,158,,,,,,,146,149,153,156,160,163,167,129,133', +'138,141,145,148,152,155,159,162,166,128,132,137,140,144,147,151,154', +'157,161,165,127,158,,,,,,,146,149,153,156,160,163,167,129,133,138,141', +'145,148,152,155,159,162,166,128,132,137,140,144,147,151,154,157,161', +'165,127,158,,,,,,,146,149,153,156,160,163,167,129,133,138,141,145,148', +'152,155,159,162,166,128,132,137,140,144,147,151,154,157,161,165,127', +'158,,,,,,,146,149,153,156,160,163,167,129,133,138,141,145,148,152,155', +'159,162,166,128,132,137,140,144,147,151,154,157,161,165,127,158,,,,', +',,146,149,153,156,160,163,167,129,133,138,141,145,148,152,155,159,162', +'166,128,132,137,140,144,147,151,154,157,161,165,127' ] + racc_action_table = arr = Array.new(10938, nil) idx = 0 clist.each do |str| str.split(',', -1).each do |i| @@ -386,384 +384,379 @@ def on_error(error_token_id, error_value, value_stack) end clist = [ -'120,84,120,163,163,163,163,163,163,163,163,163,163,73,73,73,207,163', -'78,206,163,163,73,272,73,36,163,119,293,163,163,163,120,120,119,119', -'293,120,163,205,163,120,163,163,73,163,204,163,163,294,84,120,261,261', -'163,163,163,163,120,120,120,120,120,120,120,120,120,120,120,120,120', -'120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120', -'120,120,120,120,73,163,163,68,78,294,163,198,163,163,103,163,120,103', -'103,103,103,103,103,103,103,103,103,211,192,115,280,103,219,219,103', -'103,214,214,198,186,103,263,281,103,103,103,103,186,191,60,214,103,103', -'124,103,192,103,103,117,103,37,103,103,103,177,117,117,224,103,103,103', -'103,103,103,115,115,115,103,103,263,185,115,186,198,198,198,260,263', -'185,30,263,311,311,191,191,191,99,30,124,124,192,192,192,174,99,118', -'118,103,103,75,174,174,103,77,103,103,4,103,81,4,4,4,4,4,4,4,4,4,4,296', -'186,186,30,4,30,188,4,4,5,99,97,99,4,188,266,4,4,4,4,289,289,98,266', -'4,4,106,4,107,4,4,243,4,108,4,4,70,70,243,243,94,4,4,4,4,4,4,94,94,188', -'4,4,226,96,96,96,258,96,266,226,226,226,226,226,226,226,226,226,226', -'226,226,226,226,226,226,226,226,226,226,226,4,4,178,178,1,4,43,4,4,300', -'4,312,300,300,300,300,300,300,300,300,300,300,91,91,91,137,300,71,71', -'300,300,91,122,91,132,300,90,125,300,300,300,300,176,90,90,,300,300', -',300,,300,300,246,300,,300,300,126,126,246,246,,300,300,300,300,300', -'300,236,,,300,300,,,236,236,236,236,236,236,236,236,236,236,236,236', -'236,236,236,236,236,236,236,236,236,300,86,,,,300,300,,86,86,300,,300', -'300,6,300,,6,6,6,6,6,6,6,6,6,6,34,34,34,,6,,,6,6,34,,34,,6,250,,6,6', -'6,6,,250,250,,6,6,,6,,6,6,79,6,,6,6,,,79,79,,6,6,6,6,6,6,229,,,6,6,', -',229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229', -'229,229,229,229,92,92,92,,,6,6,,,92,6,92,6,6,9,6,,9,9,9,9,9,9,9,9,9', -'9,255,255,255,,9,,,9,9,255,,255,,9,89,,9,9,9,9,,89,89,,9,9,,9,,9,9,', -'9,,9,9,,,,,,9,9,9,9,9,9,217,,,9,9,,,217,217,217,217,217,217,217,217', -'217,217,217,217,217,217,217,217,217,217,217,217,217,256,256,256,,,9', -'9,,,256,9,256,9,9,11,9,,11,11,11,11,11,11,11,11,11,11,,,,,11,,,11,11', -',,,,11,,,11,11,11,11,,,,,11,11,,11,,11,11,,11,,11,11,,,,,,11,11,11,11', -'11,11,241,,,11,11,,,241,241,241,241,241,241,241,241,241,241,241,241', -'241,241,241,241,241,241,241,241,241,,,,,,11,11,,,,11,,11,11,12,11,,12', +'117,103,117,21,21,21,21,21,21,21,21,21,21,70,70,70,82,37,30,30,30,271', +'70,191,70,214,214,30,239,30,21,21,117,117,104,239,239,117,214,292,259', +'117,67,67,70,249,292,21,257,191,117,105,249,249,249,249,249,117,117', +'117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117', +'117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,70,296,82', +'191,191,191,21,203,21,21,144,21,117,144,144,144,144,144,144,144,144', +'144,144,97,113,184,78,144,218,218,144,144,184,203,279,190,144,261,122', +'144,144,144,144,190,186,118,118,144,144,296,144,26,144,144,95,280,144', +'144,94,26,288,288,95,144,144,144,144,144,144,113,113,113,144,144,78', +'261,113,190,203,203,203,219,261,122,122,261,62,62,43,186,186,186,189', +'26,54,26,95,269,95,211,189,207,144,144,293,269,206,144,205,144,144,299', +'144,2,299,299,299,299,299,299,299,299,299,299,202,190,190,66,299,260', +'260,299,299,180,189,310,310,299,89,269,299,299,299,299,120,89,89,179', +'299,299,69,299,253,299,299,181,181,299,299,253,253,253,253,253,299,299', +'299,299,299,299,216,125,125,299,299,309,75,216,216,216,216,216,216,216', +'216,216,216,216,216,216,216,216,216,216,216,216,216,216,299,83,1,81', +'124,299,299,131,83,83,299,130,299,299,5,299,32,5,5,5,5,5,5,5,5,5,5,254', +'254,254,,5,,,5,5,254,,254,,5,242,,5,5,5,5,,242,242,,5,5,,5,173,5,5,88', +',5,5,173,173,,88,88,5,5,5,5,5,5,228,,,5,5,,,228,228,228,228,228,228', +'228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,255,255', +'255,,,5,5,,,255,5,255,5,5,7,5,,7,7,7,7,7,7,7,7,7,7,91,91,91,,7,,,7,7', +'91,,91,,7,246,,7,7,7,7,,246,246,,7,7,,7,85,7,7,116,,7,7,85,85,,116,116', +'7,7,7,7,7,7,237,,,7,7,,,237,237,237,237,237,237,237,237,237,237,237', +'237,237,237,237,237,237,237,237,237,237,90,90,90,,,7,7,,,90,7,90,7,7', +'10,7,,10,10,10,10,10,10,10,10,10,10,,,174,,10,,,10,10,174,174,,,10,111', +',10,10,10,10,,111,111,,10,10,,10,,10,10,,,10,10,99,99,99,,99,10,10,10', +'10,10,10,252,,,10,10,,,252,252,252,252,252,252,252,252,252,252,252,252', +'252,252,252,252,252,252,252,252,252,,,,,,10,10,,,,10,,10,10,12,10,,12', '12,12,12,12,12,12,12,12,12,,,,,12,,,12,12,,,,,12,,,12,12,12,12,,,,,12', -'12,,12,,12,12,,12,,12,12,,,,,,12,12,12,12,12,12,221,,,12,12,,,221,221', -'221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221', -'221,221,,,,,,12,12,,,,12,,12,12,15,12,,15,15,15,15,15,15,15,15,15,15', -',,,,15,,,15,15,,,,,15,,,15,15,15,15,,,,,15,15,,15,,15,15,,15,,15,15', -',,,,,15,15,15,15,15,15,233,,,15,15,,,233,233,233,233,233,233,233,233', -'233,233,233,233,233,233,233,233,233,233,233,233,233,,,,,,15,15,,,,15', -',15,15,19,15,,19,19,19,19,19,19,19,19,19,19,,,,,19,,,19,19,,,,,19,,', -'19,19,19,19,,,,,19,19,,19,,19,19,,19,,19,19,,,,,,19,19,19,19,19,19,239', -',,19,19,,,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239', -'239,239,239,239,239,239,,,,,,19,19,,,,19,,19,19,288,19,,288,288,288', -'288,288,288,288,288,288,288,,,,,288,,,288,288,,,,,288,,,288,288,288', -'288,,,,,288,288,,288,,288,288,,288,,288,288,,,,,,288,288,288,288,288', -'288,242,,,288,288,,,242,242,242,242,242,242,242,242,242,242,242,242', -'242,218,,,,,,,218,218,218,218,218,,288,288,,,,288,,288,288,22,288,,22', -'22,22,22,22,22,22,22,22,22,,,,,22,,,22,22,,,,,22,,,22,22,22,22,,,,,22', -'22,,22,,22,22,,22,,22,22,,,,,,22,22,22,22,22,22,249,,,22,22,,,249,249', -'249,249,249,249,249,249,249,249,249,249,249,254,,,,,,,254,254,254,254', -'254,,22,22,,,,22,,22,22,24,22,,24,24,24,24,24,24,24,24,24,24,,,,,24', -',,24,24,,,,,24,,,24,24,24,24,,,,,24,24,,24,,24,24,,24,,24,24,,,,,,24', -'24,24,24,24,24,245,,,24,24,,,245,245,245,245,245,245,245,245,245,245', -'245,245,245,,,,,,,,,,,,,,24,24,,,,24,,24,24,287,24,,287,287,287,287', -'287,287,287,287,287,287,,,,,287,,,287,287,,,,,287,,,287,287,287,287', -',,,,287,287,,287,,287,287,,287,,287,287,,,,,,287,287,287,287,287,287', -'253,,,287,287,,,253,253,253,253,253,253,253,253,253,253,253,253,253', -',,,,,,,,,,,,,287,287,,,,287,,287,287,279,287,,279,279,279,279,279,279', -'279,279,279,279,,,,,279,,,279,279,,,,,279,,,279,279,279,279,,,,,279', -'279,,279,,279,279,,279,,279,279,,,,,,279,279,279,279,279,279,237,,,279', -'279,,,237,237,237,237,237,237,237,237,237,237,,,,,,,,,,,,279,,,,,279', -'279,,,,279,,279,279,33,279,,33,33,33,33,33,33,33,33,33,33,,,,,33,,,33', -'33,,,,,33,,,33,33,33,33,,,,,33,33,,33,,33,33,,33,,33,33,,,,,,33,33,33', -'33,33,33,240,,,33,33,,,240,240,240,240,240,240,240,240,240,240,227,', -',,,,,227,227,227,227,227,227,227,,,33,33,,,,33,,33,33,276,33,,276,276', -'276,276,276,276,276,276,276,276,,,,,276,,,276,276,,,,,276,,,276,276', -'276,276,,,,,276,276,,276,,276,276,,276,,276,276,,,,,,276,276,276,276', -'276,276,234,,,276,276,,,234,234,234,234,234,234,234,234,234,234,222', -',,,,,,222,222,222,222,222,222,222,,,276,276,,,,276,,276,276,275,276', +'12,,12,,12,12,,,12,12,,,,,,12,12,12,12,12,12,232,,,12,12,,,232,232,232', +'232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232', +'232,,,,,,12,12,,,,12,,12,12,13,12,,13,13,13,13,13,13,13,13,13,13,,,', +',13,,,13,13,,,,,13,,,13,13,13,13,,,,,13,13,,13,,13,13,,,13,13,,,,,,13', +'13,13,13,13,13,234,,,13,13,,,234,234,234,234,234,234,234,234,234,234', +'234,234,234,234,234,234,234,234,234,234,234,,,,,,13,13,,,,13,,13,13', +'16,13,,16,16,16,16,16,16,16,16,16,16,,,,,16,,,16,16,,,,,16,,,16,16,16', +'16,,,,,16,16,,16,,16,16,,,16,16,,,,,,16,16,16,16,16,16,220,,,16,16,', +',220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220', +'220,220,220,220,,,,,,16,16,,,,16,,16,16,19,16,,19,19,19,19,19,19,19', +'19,19,19,,,,,19,,,19,19,,,,,19,,,19,19,19,19,,,,,19,19,,19,,19,19,,', +'19,19,,,,,,19,19,19,19,19,19,225,,,19,19,,,225,225,225,225,225,225,225', +'225,225,225,225,225,225,225,225,225,225,225,225,225,225,,,,,,19,19,', +',,19,,19,19,287,19,,287,287,287,287,287,287,287,287,287,287,,,,,287', +',,287,287,,,,,287,,,287,287,287,287,,,,,287,287,,287,,287,287,,,287', +'287,,,,,,287,287,287,287,287,287,245,,,287,287,,,245,245,245,245,245', +'245,245,245,245,245,245,245,245,,,,,,,,,,,,,,287,287,,,,287,,287,287', +'22,287,,22,22,22,22,22,22,22,22,22,22,,,,,22,,,22,22,,,,,22,,,22,22', +'22,22,,,,,22,22,,22,,22,22,,,22,22,,,,,,22,22,22,22,22,22,238,,,22,22', +',,238,238,238,238,238,238,238,238,238,238,238,238,238,,,,,,,,,,,,,,22', +'22,,,,22,,22,22,286,22,,286,286,286,286,286,286,286,286,286,286,,,,', +'286,,,286,286,,,,,286,,,286,286,286,286,,,,,286,286,,286,,286,286,,', +'286,286,,,,,,286,286,286,286,286,286,248,,,286,286,,,248,248,248,248', +'248,248,248,248,248,248,248,248,248,,,,,,,,,,,,,,286,286,,,,286,,286', +'286,277,286,,277,277,277,277,277,277,277,277,277,277,,,,,277,,,277,277', +',,,,277,,,277,277,277,277,,,,,277,277,,277,,277,277,,,277,277,,,,,,277', +'277,277,277,277,277,241,,,277,277,,,241,241,241,241,241,241,241,241', +'241,241,241,241,241,,,,,,,,,277,,,,,277,277,,,,277,,277,277,275,277', ',275,275,275,275,275,275,275,275,275,275,,,,,275,,,275,275,,,,,275,', -',275,275,275,275,,,,,275,275,,275,,275,275,,275,,275,275,,,,,,275,275', -'275,275,275,275,230,,,275,275,,,230,230,230,230,230,230,230,,,,,,,,', -',,,,,,,,,,,275,275,,,,275,,275,275,262,275,,262,262,262,262,262,262', -'262,262,262,262,,,,,262,,,262,262,,,,,262,,,262,262,262,262,,,,,262', -'262,,262,,262,262,,262,,262,262,,,,,,262,262,262,262,262,262,,,,262', -'262,,,,,,,,,,,,,,,,,,,,,,,,,,,,,262,262,,,,262,,262,262,39,262,,39,39', -'39,39,39,39,39,39,39,39,,,,,39,,,39,39,,,,,39,,,39,39,39,39,,,,,39,39', -',39,,39,39,,39,,39,39,39,,,,,39,39,39,39,39,39,,,,39,39,,,,,,,,,,,,', -',,,,,,,,,,,,,,,,39,39,,,,39,,39,39,40,39,,40,40,40,40,40,40,40,40,40', -'40,,,,,40,,,40,40,,,,,40,,,40,40,40,40,,,,,40,40,,40,,40,40,,40,,40', -'40,,,,,,40,40,40,40,40,40,,,,40,40,,,,,,,,,,,,,,,,,,,,,,,,,,,,,40,40', -',,,40,,40,40,129,40,,129,129,129,129,129,129,129,129,129,129,,,,,129', -',,129,129,,,,,129,,,129,129,129,129,,,,,129,129,,129,,129,129,,129,', -'129,129,,,,,,129,129,129,129,129,129,,,,129,129,,,,,,,,,,,,,,,,,,,,', -',,,,,,,,129,129,,,,129,,129,129,47,129,,47,47,47,47,47,47,47,47,47,47', -',,,,47,,,47,47,,,,,47,,,47,47,47,47,,,,,47,47,,47,,47,47,,47,,47,47', -',,,,,47,47,47,47,47,47,,,,47,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,,47,47,,', -',47,,47,47,48,47,,48,48,48,48,48,48,48,48,48,48,,,,,48,,,48,48,,,,,48', -',,48,48,48,48,,,,,48,48,,48,,48,48,,48,,48,48,,,,,,48,48,48,48,48,48', -',,,48,48,,,,,,,,,,,,,,,,,,,,,,,,,,,,,48,48,,,,48,,48,48,55,48,,55,55', -'55,55,55,55,55,55,55,55,,,,,55,,,55,55,,,,,55,,,55,55,55,55,,,,,55,55', -',55,,55,55,,55,,55,55,,,,,,55,55,55,55,55,55,,,,55,55,,,,,,,,,,,,,,', -',,,,,,,,,,,,,,55,55,,,,55,,55,55,212,55,,212,212,212,212,212,212,212', -'212,212,212,,,,,212,,,212,212,,,,,212,,,212,212,212,212,,,,,212,212', -',212,,212,212,,212,,212,212,,,,,,212,212,212,212,212,212,,,,212,212', -',,,,,,,,,,,,,,,,,,,,,,,,,,,,212,212,,,,212,,212,212,61,212,,61,61,61', -'61,61,61,61,61,61,61,,,,,61,,,61,61,,,,,61,,,61,61,61,61,,,,,61,61,', -'61,,61,61,,61,,61,61,,61,,,,61,61,61,61,61,61,,,,61,61,,,,,,,,,,,,,', -',,,,,,,,,,,,,,,61,61,,,,61,,61,61,203,61,,203,203,203,203,203,203,203', -'203,203,203,,,,,203,,,203,203,,,,,203,,,203,203,203,203,,,,,203,203', -',203,,203,203,,203,,203,203,,,,,,203,203,203,203,203,203,,,,203,203', -',,,,,,,,,,,,,,,,,,,,,,,,,,,,203,203,,,,203,,203,203,200,203,,200,200', -'200,200,200,200,200,200,200,200,,,,,200,,,200,200,,,,,200,,,200,200', -'200,200,,,,,200,200,,200,,200,200,,200,,200,200,200,,,,,200,200,200', -'200,200,200,,,,200,200,,,,,,,,,,,,,,,,,,,,,,,,,,,,,200,200,200,200,', -'200,,200,200,190,200,,190,190,190,190,190,190,190,190,190,190,,,,,190', -',,190,190,,,,,190,,,190,190,190,190,,,,,190,190,,190,,190,190,,190,', -'190,190,,,,,,190,190,190,190,190,190,,,,190,190,,,,,,,,,,,,,,,,,,,,', -',,,,,,,,190,190,,,,190,,190,190,189,190,,189,189,189,189,189,189,189', -'189,189,189,,,,,189,,,189,189,,,,,189,,,189,189,189,189,,,,,189,189', -',189,,189,189,,189,,189,189,,,,,,189,189,189,189,189,189,,,,189,189', -',,,,,,,,,,,,,,,,,,,,,,,,,,,,189,189,,,,189,,189,189,172,189,,172,172', -'172,172,172,172,172,172,172,172,,,,,172,,,172,172,,,,,172,,,172,172', -'172,172,,,,,172,172,,172,,172,172,,172,,172,172,,,,,,172,172,172,172', -'172,172,,,,172,172,,,,,,,,,,,,,,,,,,,,,,,,,,,,,172,172,,,,172,,172,172', -'74,172,,74,74,74,74,74,74,74,74,74,74,,,,,74,,,74,74,,,,,74,,,74,74', -'74,74,,,,,74,74,,74,,74,74,,74,,74,74,,,,,,74,74,74,74,74,74,,,,74,74', -',,,,,,,,,,,,,,,,,,,,,,,,,,,,74,74,,,,74,,74,74,169,74,,169,169,169,169', -'169,169,169,169,169,169,,,,,169,,,169,169,,,,,169,,,169,169,169,169', -',,,,169,169,,169,,169,169,,169,,169,169,,,,,,169,169,169,169,169,169', -',,,169,169,,,,,,,,,,,,,,,,,,,,,,,,,,,,,169,169,,,,169,,169,169,168,169', -',168,168,168,168,168,168,168,168,168,168,,,,,168,,,168,168,,,,,168,', -',168,168,168,168,,,,,168,168,,168,,168,168,,168,,168,168,,,,,,168,168', -'168,168,168,168,,,,168,168,,,,,,,,,,,,,,,,,,,,,,,,,,,,,168,168,,,,168', -',168,168,167,168,,167,167,167,167,167,167,167,167,167,167,,,,,167,,', -'167,167,,,,,167,,,167,167,167,167,,,,,167,167,,167,,167,167,,167,,167', -'167,,,,,,167,167,167,167,167,167,,,,167,167,,,,,,,,,,,,,,,,,,,,,,,,', -',,,,167,167,,,,167,,167,167,166,167,,166,166,166,166,166,166,166,166', -'166,166,,,,,166,,,166,166,,,,,166,,,166,166,166,166,,,,,166,166,,166', -',166,166,,166,,166,166,,,,,,166,166,166,166,166,166,,,,166,166,,,,,', -',,,,,,,,,,,,,,,,,,,,,,,166,166,,,,166,,166,166,165,166,,165,165,165', +',275,275,275,275,,,,,275,275,,275,,275,275,,,275,275,,,,,,275,275,275', +'275,275,275,235,,,275,275,,,235,235,235,235,235,235,235,235,235,235', +'217,,,,,,,217,217,217,217,217,217,217,,,275,275,,,,275,,275,275,274', +'275,,274,274,274,274,274,274,274,274,274,274,,,,,274,,,274,274,,,,,274', +',,274,274,274,274,,,,,274,274,,274,,274,274,,,274,274,,,,,,274,274,274', +'274,274,274,229,,,274,274,,,229,229,229,229,229,229,229,229,229,229', +'226,,,,,,,226,226,226,226,226,226,226,,,274,274,,,,274,,274,274,33,274', +',33,33,33,33,33,33,33,33,33,33,,,,,33,,,33,33,,,,,33,,,33,33,33,33,', +',,,33,33,,33,,33,33,,,33,33,,,,,,33,33,33,33,33,33,233,,,33,33,,,233', +'233,233,233,233,233,233,233,233,233,221,,,,,,,221,221,221,221,221,221', +'221,,,33,33,,,,33,,33,33,34,33,,34,34,34,34,34,34,34,34,34,34,,,,,34', +',,34,34,,,,,34,,,34,34,34,34,,,,,34,34,,34,,34,34,,,34,34,,,,,,34,34', +'34,34,34,34,,,,34,34,,,,,,,,,,,,,,,,,,,,,,,,,,,,,34,34,,,,34,,34,34', +'36,34,,36,36,36,36,36,36,36,36,36,36,,,,,36,,,36,36,,,,,36,,,36,36,36', +'36,,,,,36,36,,36,,36,36,,,36,36,36,,,,,36,36,36,36,36,36,,,,36,36,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,36,36,,,,36,,36,36,262,36,,262,262,262,262', +'262,262,262,262,262,262,,,,,262,,,262,262,,,,,262,,,262,262,262,262', +',,,,262,262,,262,,262,262,,,262,262,,,,,,262,262,262,262,262,262,,,', +'262,262,,,,,,,,,,,,,,,,,,,,,,,,,,,,,262,262,,,,262,,262,262,39,262,', +'39,39,39,39,39,39,39,39,39,39,,,,,39,,,39,39,,,,,39,,,39,39,39,39,,', +',,39,39,,39,,39,39,,,39,39,,,,,,39,39,39,39,39,39,,,,39,39,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,39,39,,,,39,,39,39,42,39,,42,42,42,42,42,42,42,42', +'42,42,,,,,42,,,42,42,,,,,42,,,42,42,42,42,,,,,42,42,,42,,42,42,,,42', +'42,,,,,,42,42,42,42,42,42,,,,42,42,,,,,,,,,,,,,,,,,,,,,,,,,,,,,42,42', +',,,42,,42,42,213,42,,213,213,213,213,213,213,213,213,213,213,,,,,213', +',,213,213,,,,,213,,,213,213,213,213,,,,,213,213,,213,,213,213,,,213', +'213,,,,,,213,213,213,213,213,213,,,,213,213,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,213,213,,,,213,,213,213,53,213,,53,53,53,53,53,53,53,53,53,53,,', +',,53,,,53,53,,,,,53,,,53,53,53,53,,,,,53,53,,53,,53,53,,,53,53,,,,,', +'53,53,53,53,53,53,,,,53,53,,,,,,,,,,,,,,,,,,,,,,,,,,,,,53,53,,,,53,', +'53,53,128,53,,128,128,128,128,128,128,128,128,128,128,,,,,128,,,128', +'128,,,,,128,,,128,128,128,128,,,,,128,128,,128,,128,128,,,128,128,,', +',,,128,128,128,128,128,128,,,,128,128,,,,,,,,,,,,,,,,,,,,,,,,,,,,,128', +'128,,,,128,,128,128,55,128,,55,55,55,55,55,55,55,55,55,55,,,,,55,,,55', +'55,,,,,55,,,55,55,55,55,,,,,55,55,,55,,55,55,,,55,55,,55,,,,55,55,55', +'55,55,55,,,,55,55,,,,,,,,,,,,,,,,,,,,,,,,,,,,,55,55,,,,55,,55,55,201', +'55,,201,201,201,201,201,201,201,201,201,201,,,,,201,,,201,201,,,,,201', +',,201,201,201,201,,,,,201,201,,201,,201,201,,,201,201,201,,,,,201,201', +'201,201,201,201,,,,201,201,,,,,,,,,,,,,,,,,,,,,,,,,,,,,201,201,201,201', +',201,,201,201,200,201,,200,200,200,200,200,200,200,200,200,200,,,,,200', +',,200,200,,,,,200,,,200,200,200,200,,,,,200,200,,200,,200,200,,,200', +'200,,,,,,200,200,200,200,200,200,,,,200,200,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,200,200,,,,200,,200,200,187,200,,187,187,187,187,187,187,187,187', +'187,187,,,,,187,,,187,187,,,,,187,,,187,187,187,187,,,,,187,187,,187', +',187,187,,,187,187,,,,,,187,187,187,187,187,187,,,,187,187,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,187,187,,,,187,,187,187,185,187,,185,185,185,185', +'185,185,185,185,185,185,,,,,185,,,185,185,,,,,185,,,185,185,185,185', +',,,,185,185,,185,,185,185,,,185,185,,,,,,185,185,185,185,185,185,,,', +'185,185,,,,,,,,,,,,,,,,,,,,,,,,,,,,,185,185,,,,185,,185,185,171,185', +',171,171,171,171,171,171,171,171,171,171,,,,,171,,,171,171,,,,,171,', +',171,171,171,171,,,,,171,171,,171,,171,171,,,171,171,,,,,,171,171,171', +'171,171,171,,,,171,171,,,,,,,,,,,,,,,,,,,,,,,,,,,,,171,171,,,,171,,171', +'171,167,171,,167,167,167,167,167,167,167,167,167,167,,,,,167,,,167,167', +',,,,167,,,167,167,167,167,,,,,167,167,,167,,167,167,,,167,167,,,,,,167', +'167,167,167,167,167,,,,167,167,,,,,,,,,,,,,,,,,,,,,,,,,,,,,167,167,', +',,167,,167,167,71,167,,71,71,71,71,71,71,71,71,71,71,,,,,71,,,71,71', +',,,,71,,,71,71,71,71,,,,,71,71,,71,,71,71,,,71,71,,,,,,71,71,71,71,71', +'71,,,,71,71,,,,,,,,,,,,,,,,,,,,,,,,,,,,,71,71,,,,71,,71,71,74,71,,74', +'74,74,74,74,74,74,74,74,74,,,,,74,,,74,74,,,,,74,,,74,74,74,74,,,,,74', +'74,,74,,74,74,,,74,74,,,,,,74,74,74,74,74,74,,,,74,74,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,74,74,,,,74,,74,74,166,74,,166,166,166,166,166,166,166', +'166,166,166,,,,,166,,,166,166,,,,,166,,,166,166,166,166,,,,,166,166', +',166,,166,166,,,166,166,,,,,,166,166,166,166,166,166,,,,166,166,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,166,166,,,,166,,166,166,165,166,,165,165,165', '165,165,165,165,165,165,165,,,,,165,,,165,165,,,,,165,,,165,165,165', -'165,,,,,165,165,,165,,165,165,,165,,165,165,,,,,,165,165,165,165,165', -'165,,,,165,165,,,,,,,,,,,,,,,,,,,,,,,,,,,,,165,165,,,,165,,165,165,164', -'165,,164,164,164,164,164,164,164,164,164,164,,,,,164,,,164,164,,,,,164', -',,164,164,164,164,,,,,164,164,,164,,164,164,,164,,164,164,,,,,,164,164', -'164,164,164,164,,,,164,164,,,,,,,,,,,,,,,,,,,,,,,,,,,,,164,164,,,,164', -',164,164,162,164,,162,162,162,162,162,162,162,162,162,162,,,,,162,,', -'162,162,,,,,162,,,162,162,162,162,,,,,162,162,,162,,162,162,,162,,162', -'162,,,,,,162,162,162,162,162,162,,,,162,162,,,,,,,,,,,,,,,,,,,,,,,,', -',,,,162,162,,,,162,,162,162,161,162,,161,161,161,161,161,161,161,161', -'161,161,,,,,161,,,161,161,,,,,161,,,161,161,161,161,,,,,161,161,,161', -',161,161,,161,,161,161,,,,,,161,161,161,161,161,161,,,,161,161,,,,,', -',,,,,,,,,,,,,,,,,,,,,,,161,161,,,,161,,161,161,160,161,,160,160,160', +'165,,,,,165,165,,165,,165,165,,,165,165,,,,,,165,165,165,165,165,165', +',,,165,165,,,,,,,,,,,,,,,,,,,,,,,,,,,,,165,165,,,,165,,165,165,164,165', +',164,164,164,164,164,164,164,164,164,164,,,,,164,,,164,164,,,,,164,', +',164,164,164,164,,,,,164,164,,164,,164,164,,,164,164,,,,,,164,164,164', +'164,164,164,,,,164,164,,,,,,,,,,,,,,,,,,,,,,,,,,,,,164,164,,,,164,,164', +'164,163,164,,163,163,163,163,163,163,163,163,163,163,,,,,163,,,163,163', +',,,,163,,,163,163,163,163,,,,,163,163,,163,,163,163,,,163,163,,,,,,163', +'163,163,163,163,163,,,,163,163,,,,,,,,,,,,,,,,,,,,,,,,,,,,,163,163,', +',,163,,163,163,162,163,,162,162,162,162,162,162,162,162,162,162,,,,', +'162,,,162,162,,,,,162,,,162,162,162,162,,,,,162,162,,162,,162,162,,', +'162,162,,,,,,162,162,162,162,162,162,,,,162,162,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,162,162,,,,162,,162,162,161,162,,161,161,161,161,161,161,161', +'161,161,161,,,,,161,,,161,161,,,,,161,,,161,161,161,161,,,,,161,161', +',161,,161,161,,,161,161,,,,,,161,161,161,161,161,161,,,,161,161,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,161,161,,,,161,,161,161,160,161,,160,160,160', '160,160,160,160,160,160,160,,,,,160,,,160,160,,,,,160,,,160,160,160', -'160,,,,,160,160,,160,,160,160,,160,,160,160,,,,,,160,160,160,160,160', -'160,,,,160,160,,,,,,,,,,,,,,,,,,,,,,,,,,,,,160,160,,,,160,,160,160,159', -'160,,159,159,159,159,159,159,159,159,159,159,,,,,159,,,159,159,,,,,159', -',,159,159,159,159,,,,,159,159,,159,,159,159,,159,,159,159,,,,,,159,159', -'159,159,159,159,,,,159,159,,,,,,,,,,,,,,,,,,,,,,,,,,,,,159,159,,,,159', -',159,159,158,159,,158,158,158,158,158,158,158,158,158,158,,,,,158,,', -'158,158,,,,,158,,,158,158,158,158,,,,,158,158,,158,,158,158,,158,,158', -'158,,,,,,158,158,158,158,158,158,,,,158,158,,,,,,,,,,,,,,,,,,,,,,,,', -',,,,158,158,,,,158,,158,158,157,158,,157,157,157,157,157,157,157,157', -'157,157,,,,,157,,,157,157,,,,,157,,,157,157,157,157,,,,,157,157,,157', -',157,157,,157,,157,157,,,,,,157,157,157,157,157,157,,,,157,157,,,,,', -',,,,,,,,,,,,,,,,,,,,,,,157,157,,,,157,,157,157,156,157,,156,156,156', -'156,156,156,156,156,156,156,,,,,156,,,156,156,,,,,156,,,156,156,156', -'156,,,,,156,156,,156,,156,156,,156,,156,156,,,,,,156,156,156,156,156', -'156,,,,156,156,,,,,,,,,,,,,,,,,,,,,,,,,,,,,156,156,,,,156,,156,156,154', -'156,,154,154,154,154,154,154,154,154,154,154,,,,,154,,,154,154,,,,,154', -',,154,154,154,154,,,,,154,154,,154,,154,154,,154,,154,154,,,,,,154,154', -'154,154,154,154,,,,154,154,,,,,,,,,,,,,,,,,,,,,,,,,,,,,154,154,,,,154', -',154,154,153,154,,153,153,153,153,153,153,153,153,153,153,,,,,153,,', -'153,153,,,,,153,,,153,153,153,153,,,,,153,153,,153,,153,153,,153,,153', -'153,,,,,,153,153,153,153,153,153,,,,153,153,,,,,,,,,,,,,,,,,,,,,,,,', -',,,,153,153,,,,153,,153,153,152,153,,152,152,152,152,152,152,152,152', -'152,152,,,,,152,,,152,152,,,,,152,,,152,152,152,152,,,,,152,152,,152', -',152,152,,152,,152,152,,,,,,152,152,152,152,152,152,,,,152,152,,,,,', -',,,,,,,,,,,,,,,,,,,,,,,152,152,,,,152,,152,152,150,152,,150,150,150', -'150,150,150,150,150,150,150,,,,,150,,,150,150,,,,,150,,,150,150,150', -'150,,,,,150,150,,150,,150,150,,150,,150,150,,,,,,150,150,150,150,150', -'150,,,,150,150,,,,,,,,,,,,,,,,,,,,,,,,,,,,,150,150,,,,150,,150,150,149', -'150,,149,149,149,149,149,149,149,149,149,149,,,,,149,,,149,149,,,,,149', -',,149,149,149,149,,,,,149,149,,149,,149,149,,149,,149,149,,,,,,149,149', -'149,149,149,149,,,,149,149,,,,,,,,,,,,,,,,,,,,,,,,,,,,,149,149,,,,149', -',149,149,148,149,,148,148,148,148,148,148,148,148,148,148,,,,,148,,', -'148,148,,,,,148,,,148,148,148,148,,,,,148,148,,148,,148,148,,148,,148', -'148,,,,,,148,148,148,148,148,148,,,,148,148,,,,,,,,,,,,,,,,,,,,,,,,', -',,,,148,148,,,,148,,148,148,147,148,,147,147,147,147,147,147,147,147', -'147,147,,,,,147,,,147,147,,,,,147,,,147,147,147,147,,,,,147,147,,147', -',147,147,,147,,147,147,,,,,,147,147,147,147,147,147,,,,147,147,,,,,', -',,,,,,,,,,,,,,,,,,,,,,,147,147,,,,147,,147,147,146,147,,146,146,146', -'146,146,146,146,146,146,146,,,,,146,,,146,146,,,,,146,,,146,146,146', -'146,,,,,146,146,,146,,146,146,,146,,146,146,,,,,,146,146,146,146,146', -'146,,,,146,146,,,,,,,,,,,,,,,,,,,,,,,,,,,,,146,146,,,,146,,146,146,145', -'146,,145,145,145,145,145,145,145,145,145,145,,,,,145,,,145,145,,,,,145', -',,145,145,145,145,,,,,145,145,,145,,145,145,,145,,145,145,,,,,,145,145', -'145,145,145,145,,,,145,145,,,,,,,,,,,,,,,,,,,,,,,,,,,,,145,145,,,,145', -',145,145,310,145,,310,310,310,310,310,310,310,310,310,310,,,,,310,,', -'310,310,,,,,310,,,310,310,310,310,,,,,310,310,,310,,310,310,,310,,310', -'310,,,,,,310,310,310,310,310,310,,,,310,310,,,,,,,,,,,,,,,,,,,,,,,,', -',,,,310,310,,,,310,,310,310,105,310,,105,105,105,105,105,105,105,105', -'105,105,,,,,105,,,105,105,,,,,105,,,105,105,105,105,,,,,105,105,,105', -',105,105,,105,,105,105,,,,,,105,105,105,105,105,105,,,,105,105,,,,,', -',,,,,,,,,,,,,,,,,,,,,,,105,105,,,,105,,105,105,144,105,,144,144,144', -'144,144,144,144,144,144,144,,,,,144,,,144,144,,,,,144,,,144,144,144', -'144,,,,,144,144,,144,,144,144,,144,,144,144,,,,,,144,144,144,144,144', -'144,,,,144,144,,,,,,,,,,,,,,,,,,,,,,,,,,,,,144,144,,,,144,,144,144,143', -'144,,143,143,143,143,143,143,143,143,143,143,,,,,143,,,143,143,,,,,143', -',,143,143,143,143,,,,,143,143,,143,,143,143,,143,,143,143,,,,,,143,143', -'143,143,143,143,,,,143,143,,,,,,,,,,,,,,,,,,,,,,,,,,,,,143,143,,,,143', -',143,143,142,143,,142,142,142,142,142,142,142,142,142,142,,,,,142,,', -'142,142,,,,,142,,,142,142,142,142,,,,,142,142,,142,,142,142,,142,,142', -'142,,,,,,142,142,142,142,142,142,,,,142,142,,,,,,,,,,,,,,,,,,,,,,,,', -',,,,142,142,,,,142,,142,142,113,142,,113,113,113,113,113,113,113,113', -'113,113,,,,,113,,,113,113,,,,,113,,,113,113,113,113,,,,,113,113,,113', -',113,113,,113,,113,113,113,,,,,113,113,113,113,113,113,,,,113,113,,', -',,,,,,,,,,,,,,,,,,,,,,,,,,113,113,,,,113,,113,113,114,113,,114,114,114', -'114,114,114,114,114,114,114,,,,,114,,,114,114,,,,,114,,,114,114,114', -'114,,,,,114,114,,114,,114,114,,114,,114,114,,,,,,114,114,114,114,114', -'114,,,,114,114,,,,,,,,,,,,,,,,,,,,,,,,,,,,,114,114,,,,114,,114,114,141', -'114,,141,141,141,141,141,141,141,141,141,141,,,,,141,,,141,141,,,,,141', -',,141,141,141,141,,,,,141,141,,141,,141,141,,141,,141,141,,,,,,141,141', -'141,141,141,141,,,,141,141,,,,,,,,,,,,,,,,,,,,,,,,,,,,,141,141,,,,141', -',141,141,140,141,,140,140,140,140,140,140,140,140,140,140,,,,,140,,', -'140,140,,,,,140,,,140,140,140,140,,,,,140,140,,140,,140,140,,140,,140', -'140,,,,,,140,140,140,140,140,140,,,,140,140,,,,,,,,,,,,,,,,,,,,,,,,', -',,,,140,140,,,,140,,140,140,139,140,,139,139,139,139,139,139,139,139', -'139,139,,,,,139,,,139,139,,,,,139,,,139,139,139,139,,,,,139,139,,139', -',139,139,,139,,139,139,,,,,,139,139,139,139,139,139,,,,139,139,,,,,', -',,,,,,,,,,,,,,,,,,,,,,,139,139,,,,139,,139,139,138,139,,138,138,138', -'138,138,138,138,138,138,138,,,,,138,,,138,138,,,,,138,,,138,138,138', -'138,,,,,138,138,,138,,138,138,,138,,138,138,,,,,,138,138,138,138,138', -'138,,,,138,138,,,,,,,,,,,,,,,,,,,,,,,,,,,,,138,138,,,,138,,138,138,136', -'138,,136,136,136,136,136,136,136,136,136,136,,,,,136,,,136,136,,,,,136', -',,136,136,136,136,,,,,136,136,,136,,136,136,,136,,136,136,,,,,,136,136', -'136,136,136,136,,,,136,136,,,,,,,,,,,,,,,,,,,,,,,,,,,,,136,136,,,,136', -',136,136,0,136,,0,0,0,0,0,0,0,0,0,0,,,,,0,,,0,0,,,,,0,,,0,0,0,0,,,,', -'0,0,,0,,0,0,,0,,0,0,0,,,,,0,0,0,0,0,0,,,,0,0,,,,,,,,,,,,,,,,,,,,,,,', -',,,,,0,0,0,0,,0,,0,0,135,0,,135,135,135,135,135,135,135,135,135,135', -',,,,135,,,135,135,,,,,135,,,135,135,135,135,,,,,135,135,,135,,135,135', -',135,,135,135,,,,,,135,135,135,135,135,135,,,,135,135,,,,,,,,,,,,,,', -',,,,,,,,,,,,,,135,135,,,,135,,135,135,134,135,,134,134,134,134,134,134', -'134,134,134,134,,,,,134,,,134,134,,,,,134,,,134,134,134,134,,,,,134', -'134,,134,,134,134,,134,,134,134,,,,,,134,134,134,134,134,134,,,,134', -'134,,,,,,,,,,,,,,,,,,,,,,,,,,,,,134,134,,,,134,,134,134,133,134,,133', -'133,133,133,133,133,133,133,133,133,,,,,133,,,133,133,,,,,133,,,133', -'133,133,133,,,,,133,133,,133,,133,133,,133,,133,133,,,,,,133,133,133', -'133,133,133,,,,133,133,,,,,,,,,,,,,,,,,,,,,,,,,,,,,133,133,,,,133,,133', -'133,131,133,,131,131,131,131,131,131,131,131,131,131,,,,,131,,,131,131', -',,,,131,,,131,131,131,131,,,,,131,131,,131,,131,131,,131,,131,131,,', -',,,131,131,131,131,131,131,,,,131,131,,,,,,,,,,,,,,,,,,,,,,,,,,,,,131', -'131,,,,131,,131,131,130,131,,130,130,130,130,130,130,130,130,130,130', -',,,,130,,,130,130,,,,,130,,,130,130,130,130,,,,,130,130,,130,,130,130', -',130,,130,130,,,,,,130,130,130,130,130,130,,,,130,130,,,,,,,,,,,,,,', -',,,,,,,,,,,,,,130,130,,,,130,,130,130,127,130,,127,127,127,127,127,127', -'127,127,127,127,,,,,127,,,127,127,,,,,127,,,127,127,127,127,,,,,127', -'127,,127,,127,127,,127,,127,127,,,,,,127,127,127,127,127,127,,,,127', -'127,,,,,,,,,,,,,,,,,,,,,,,,,,,,,127,127,,,,127,,127,127,213,127,,213', -'213,213,213,213,213,213,213,213,213,,,,,213,,,213,213,,,,,213,,,213', -'213,213,213,,,,,213,213,,213,,213,213,,213,,213,213,,,315,,315,213,213', -'213,213,213,213,,,,213,213,,,,,,,,,,,,,,,,,,,315,315,,,,315,,,,315,213', -'213,,,,213,,213,213,315,213,,,,,,315,315,315,315,315,315,315,315,315', -'315,315,315,315,315,315,315,315,315,315,315,315,315,315,315,315,315', -'315,315,315,315,315,315,315,315,304,,304,,,,,,,,315,,,,,,,,,,,,,,,,', -',,,,,304,304,,,,304,,,,304,,,,,,,,,,304,,,,,,,304,304,304,304,304,304', -'304,304,304,304,304,304,304,304,304,304,304,304,304,304,304,304,304', -'304,304,304,304,304,304,304,304,304,304,304,303,303,303,303,303,303', -'303,303,303,303,304,,,,303,,,303,303,,,,,303,,,303,303,303,,,,,,,303', -',303,,303,303,,303,,303,303,,,,,,303,303,303,303,303,303,,,,303,303', -',,,,313,313,313,313,313,313,313,313,313,313,,,,,313,,,313,313,,,,,313', -'303,303,313,313,313,303,,303,303,,303,313,,313,,313,313,,313,,313,313', -',,,,,313,313,313,313,313,313,,,,313,313,,,,171,171,171,171,171,171,171', -'171,171,171,,,,,,,,,,,,,,,,313,313,171,171,,313,,313,313,,313,,,,,,', -'171,,,171,,,,,,,,,,,,,,,,,,,26,26,26,26,26,26,26,26,26,26,,,,,26,,,26', -'26,,,,,26,,,26,26,26,26,,171,,171,171,26,171,26,,26,26,,26,,26,26,,', -',,,26,26,26,26,26,26,,,,26,26,,,,21,21,21,21,21,21,21,21,21,21,,,,,', -',,,,,,,,,,26,26,21,21,,26,,26,26,,26,,,,,,,21,,,21,,,215,,215,,,,,,', -',,,,,,,,,,,,,,,,,,,,,,,215,215,,,,215,,,,215,,,,,,21,,21,21,215,21,', -',,,,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215', -'215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215', -'215,116,,116,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,116,116,,,,116,,,,116,,,,', -',,,,,116,,,,,,,116,116,116,116,116,116,116,116,116,116,116,116,116,116', -'116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116', -'116,116,116,314,,314,,,,,,,,,,,,,,,,,,,,,,,314,,,,,,,314,314,,,,314', -',,,314,,,,,,,,,,314,,,,,,,314,314,314,314,314,314,314,314,314,314,314', +'160,,,,,160,160,,160,,160,160,,,160,160,,,,,,160,160,160,160,160,160', +',,,160,160,,,,,,,,,,,,,,,,,,,,,,,,,,,,,160,160,,,,160,,160,160,159,160', +',159,159,159,159,159,159,159,159,159,159,,,,,159,,,159,159,,,,,159,', +',159,159,159,159,,,,,159,159,,159,,159,159,,,159,159,,,,,,159,159,159', +'159,159,159,,,,159,159,,,,,,,,,,,,,,,,,,,,,,,,,,,,,159,159,,,,159,,159', +'159,157,159,,157,157,157,157,157,157,157,157,157,157,,,,,157,,,157,157', +',,,,157,,,157,157,157,157,,,,,157,157,,157,,157,157,,,157,157,,,,,,157', +'157,157,157,157,157,,,,157,157,,,,,,,,,,,,,,,,,,,,,,,,,,,,,157,157,', +',,157,,157,157,156,157,,156,156,156,156,156,156,156,156,156,156,,,,', +'156,,,156,156,,,,,156,,,156,156,156,156,,,,,156,156,,156,,156,156,,', +'156,156,,,,,,156,156,156,156,156,156,,,,156,156,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,156,156,,,,156,,156,156,155,156,,155,155,155,155,155,155,155', +'155,155,155,,,,,155,,,155,155,,,,,155,,,155,155,155,155,,,,,155,155', +',155,,155,155,,,155,155,,,,,,155,155,155,155,155,155,,,,155,155,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,155,155,,,,155,,155,155,154,155,,154,154,154', +'154,154,154,154,154,154,154,,,,,154,,,154,154,,,,,154,,,154,154,154', +'154,,,,,154,154,,154,,154,154,,,154,154,,,,,,154,154,154,154,154,154', +',,,154,154,,,,,,,,,,,,,,,,,,,,,,,,,,,,,154,154,,,,154,,154,154,153,154', +',153,153,153,153,153,153,153,153,153,153,,,,,153,,,153,153,,,,,153,', +',153,153,153,153,,,,,153,153,,153,,153,153,,,153,153,,,,,,153,153,153', +'153,153,153,,,,153,153,,,,,,,,,,,,,,,,,,,,,,,,,,,,,153,153,,,,153,,153', +'153,152,153,,152,152,152,152,152,152,152,152,152,152,,,,,152,,,152,152', +',,,,152,,,152,152,152,152,,,,,152,152,,152,,152,152,,,152,152,,,,,,152', +'152,152,152,152,152,,,,152,152,,,,,,,,,,,,,,,,,,,,,,,,,,,,,152,152,', +',,152,,152,152,151,152,,151,151,151,151,151,151,151,151,151,151,,,,', +'151,,,151,151,,,,,151,,,151,151,151,151,,,,,151,151,,151,,151,151,,', +'151,151,,,,,,151,151,151,151,151,151,,,,151,151,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,151,151,,,,151,,151,151,150,151,,150,150,150,150,150,150,150', +'150,150,150,,,,,150,,,150,150,,,,,150,,,150,150,150,150,,,,,150,150', +',150,,150,150,,,150,150,,,,,,150,150,150,150,150,150,,,,150,150,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,150,150,,,,150,,150,150,148,150,,148,148,148', +'148,148,148,148,148,148,148,,,,,148,,,148,148,,,,,148,,,148,148,148', +'148,,,,,148,148,,148,,148,148,,,148,148,,,,,,148,148,148,148,148,148', +',,,148,148,,,,,,,,,,,,,,,,,,,,,,,,,,,,,148,148,,,,148,,148,148,147,148', +',147,147,147,147,147,147,147,147,147,147,,,,,147,,,147,147,,,,,147,', +',147,147,147,147,,,,,147,147,,147,,147,147,,,147,147,,,,,,147,147,147', +'147,147,147,,,,147,147,,,,,,,,,,,,,,,,,,,,,,,,,,,,,147,147,,,,147,,147', +'147,145,147,,145,145,145,145,145,145,145,145,145,145,,,,,145,,,145,145', +',,,,145,,,145,145,145,145,,,,,145,145,,145,,145,145,,,145,145,,,,,,145', +'145,145,145,145,145,,,,145,145,,,,,,,,,,,,,,,,,,,,,,,,,,,,,145,145,', +',,145,,145,145,101,145,,101,101,101,101,101,101,101,101,101,101,,,,', +'101,,,101,101,,,,,101,,,101,101,101,101,,,,,101,101,,101,,101,101,,', +'101,101,101,,,,,101,101,101,101,101,101,,,,101,101,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,101,101,,,,101,,101,101,102,101,,102,102,102,102,102,102', +'102,102,102,102,,,,,102,,,102,102,,,,,102,,,102,102,102,102,,,,,102', +'102,,102,,102,102,,,102,102,,,,,,102,102,102,102,102,102,,,,102,102', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,102,102,,,,102,,102,102,311,102,,311,311', +'311,311,311,311,311,311,311,311,,,,,311,,,311,311,,,,,311,,,311,311', +'311,311,,,,,311,311,,311,,311,311,,,311,311,,,,,,311,311,311,311,311', +'311,,,,311,311,,,,,,,,,,,,,,,,,,,,,,,,,,,,,311,311,,,,311,,311,311,143', +'311,,143,143,143,143,143,143,143,143,143,143,,,,,143,,,143,143,,,,,143', +',,143,143,143,143,,,,,143,143,,143,,143,143,,,143,143,,,,,,143,143,143', +'143,143,143,,,,143,143,,,,,,,,,,,,,,,,,,,,,,,,,,,,,143,143,,,,143,,143', +'143,142,143,,142,142,142,142,142,142,142,142,142,142,,,,,142,,,142,142', +',,,,142,,,142,142,142,142,,,,,142,142,,142,,142,142,,,142,142,,,,,,142', +'142,142,142,142,142,,,,142,142,,,,,,,,,,,,,,,,,,,,,,,,,,,,,142,142,', +',,142,,142,142,141,142,,141,141,141,141,141,141,141,141,141,141,,,,', +'141,,,141,141,,,,,141,,,141,141,141,141,,,,,141,141,,141,,141,141,,', +'141,141,,,,,,141,141,141,141,141,141,,,,141,141,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,141,141,,,,141,,141,141,140,141,,140,140,140,140,140,140,140', +'140,140,140,,,,,140,,,140,140,,,,,140,,,140,140,140,140,,,,,140,140', +',140,,140,140,,,140,140,,,,,,140,140,140,140,140,140,,,,140,140,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,140,140,,,,140,,140,140,112,140,,112,112,112', +'112,112,112,112,112,112,112,,,,,112,,,112,112,,,,,112,,,112,112,112', +'112,,,,,112,112,,112,,112,112,,,112,112,,,,,,112,112,112,112,112,112', +',,,112,112,,,,,,,,,,,,,,,,,,,,,,,,,,,,,112,112,,,,112,,112,112,139,112', +',139,139,139,139,139,139,139,139,139,139,,,,,139,,,139,139,,,,,139,', +',139,139,139,139,,,,,139,139,,139,,139,139,,,139,139,,,,,,139,139,139', +'139,139,139,,,,139,139,,,,,,,,,,,,,,,,,,,,,,,,,,,,,139,139,,,,139,,139', +'139,138,139,,138,138,138,138,138,138,138,138,138,138,,,,,138,,,138,138', +',,,,138,,,138,138,138,138,,,,,138,138,,138,,138,138,,,138,138,,,,,,138', +'138,138,138,138,138,,,,138,138,,,,,,,,,,,,,,,,,,,,,,,,,,,,,138,138,', +',,138,,138,138,115,138,,115,115,115,115,115,115,115,115,115,115,,,,', +'115,,,115,115,,,,,115,,,115,115,115,115,,,,,115,115,,115,,115,115,,', +'115,115,115,,,,,115,115,115,115,115,115,,,,115,115,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,115,115,,,,115,,115,115,137,115,,137,137,137,137,137,137', +'137,137,137,137,,,,,137,,,137,137,,,,,137,,,137,137,137,137,,,,,137', +'137,,137,,137,137,,,137,137,,,,,,137,137,137,137,137,137,,,,137,137', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,137,137,,,,137,,137,137,0,137,,0,0,0,0,0', +'0,0,0,0,0,,,,,0,,,0,0,,,,,0,,,0,0,0,0,,,,,0,0,,0,,0,0,,,0,0,0,,,,,0', +'0,0,0,0,0,,,,0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,0,0,0,,0,,0,0,136,0,', +'136,136,136,136,136,136,136,136,136,136,,,,,136,,,136,136,,,,,136,,', +'136,136,136,136,,,,,136,136,,136,,136,136,,,136,136,,,,,,136,136,136', +'136,136,136,,,,136,136,,,,,,,,,,,,,,,,,,,,,,,,,,,,,136,136,,,,136,,136', +'136,135,136,,135,135,135,135,135,135,135,135,135,135,,,,,135,,,135,135', +',,,,135,,,135,135,135,135,,,,,135,135,,135,,135,135,,,135,135,,,,,,135', +'135,135,135,135,135,,,,135,135,,,,,,,,,,,,,,,,,,,,,,,,,,,,,135,135,', +',,135,,135,135,134,135,,134,134,134,134,134,134,134,134,134,134,,,,', +'134,,,134,134,,,,,134,,,134,134,134,134,,,,,134,134,,134,,134,134,,', +'134,134,,,,,,134,134,134,134,134,134,,,,134,134,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,134,134,,,,134,,134,134,133,134,,133,133,133,133,133,133,133', +'133,133,133,,,,,133,,,133,133,,,,,133,,,133,133,133,133,,,,,133,133', +',133,,133,133,,,133,133,,,,,,133,133,133,133,133,133,,,,133,133,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,133,133,,,,133,,133,133,123,133,,123,123,123', +'123,123,123,123,123,123,123,,,,,123,,,123,123,,,,,123,,,123,123,123', +'123,,,,,123,123,,123,,123,123,,,123,123,,,,,,123,123,123,123,123,123', +',,,123,123,,,,,,,,,,,,,,,,,,,,,,,,,,,,,123,123,,,,123,,123,123,132,123', +',132,132,132,132,132,132,132,132,132,132,,,,,132,,,132,132,,,,,132,', +',132,132,132,132,,,,,132,132,,132,,132,132,,,132,132,,,,,,132,132,132', +'132,132,132,,,,132,132,,,,,,,,,,,,,,,,,,,,,,,,,,,,,132,132,,,,132,,132', +'132,129,132,,129,129,129,129,129,129,129,129,129,129,,,,,129,,,129,129', +',,,,129,,,129,129,129,129,,,,,129,129,,129,,129,129,,,129,129,,,,,,129', +'129,129,129,129,129,,,,129,129,,,,,,,,,,,,,,,,,,,,,,,,,,,,,129,129,', +',,129,,129,129,127,129,,127,127,127,127,127,127,127,127,127,127,,,,', +'127,,,127,127,,,,,127,,,127,127,127,127,,,,,127,127,,127,,127,127,,', +'127,127,,,,,,127,127,127,127,127,127,,,,127,127,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,127,127,,,,127,,127,127,212,127,,212,212,212,212,212,212,212', +'212,212,212,,,,,212,,,212,212,,,,,212,,,212,212,212,212,,,,,212,212', +',212,,212,212,,,212,212,314,,314,,,212,212,212,212,212,212,,,,212,212', +',,,,,,,,,,,,,,,,314,314,,,,314,,,,314,,,212,212,,,,212,314,212,212,', +'212,,,314,314,314,314,314,314,314,314,314,314,314,314,314,314,314,314', '314,314,314,314,314,314,314,314,314,314,314,314,314,314,314,314,314', -'314,314,314,314,314,314,223,,223,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,223,223', -',,,223,,,,223,,,,,,,,,,223,,,,,,,223,223,223,223,223,223,223,223,223', -'223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223', -'223,223,223,223,223,223,223,223,238,,238,,,,,,,,,,,,,,,,,,,,,,,,,,,', -',,238,238,,,,238,,,,238,,,,,,,,,,238,,,,,,,238,238,238,238,238,238,238', -'238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238', -'238,238,238,238,238,238,238,238,238,238,320,,320,,,,,,,,,,,,,,,,,,,', -',,,320,,,,,,,320,320,,,,320,,,,320,,,,,,,,,,320,,,,,,,320,320,320,320', -'320,320,320,320,320,320,320,320,320,320,320,320,320,320,320,320,320', -'320,320,320,320,320,320,320,320,320,320,320,320,320,231,,231,,,,,,,', -',,,,,,,,,,,,,,,,,,,,,,231,231,,,,231,,,,231,,,,,,,,,,231,,,,,,,231,231', -'231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231', -'231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,72,,72,', -',,,,,,,,,,,,,,,,,,,,,,,,,,,,72,72,,,,72,,,,72,,,,,,,,,,72,,,,,,,72,72', -'72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72', -'72,72,72,72,72,72,72,72,72,302,,302,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,302', -'302,,,,302,,,,302,,,,,,,,,,302,,,,,,,302,302,302,302,302,302,302,302', -'302,302,302,302,302,302,302,302,302,302,302,302,302,302,302,302,302', -'302,302,302,302,302,302,302,302,302,301,,301,,,,,,,,,,,,,,,,,,,,,,,', -',,,,,,301,301,,,,301,,,,301,,,,,,,,,,301,,,,,,,301,301,301,301,301,301', +'314,303,,303,,,,,,,,314,,,,,,,,,,,,,,,,,,,,,,303,303,,,,303,,,,303,', +',,,,,,,303,,,,,,,303,303,303,303,303,303,303,303,303,303,303,303,303', +'303,303,303,303,303,303,303,303,303,303,303,303,303,303,303,303,303', +'303,303,303,303,312,312,312,312,312,312,312,312,312,312,303,,,,312,', +',312,312,,,,,312,,,312,312,312,,,,,,,312,,312,,312,312,,,312,312,,,', +',,312,312,312,312,312,312,,,,312,312,,,,,158,158,158,158,158,158,158', +'158,158,158,,,,,158,,,158,158,,,,,158,312,312,158,158,158,312,,312,312', +',312,158,,158,,158,158,,,158,158,,,,,,158,158,158,158,170,170,170,170', +'170,170,170,170,170,170,,,,,,,,,,,,,,,,,,170,170,,,,,,,158,158,,,,158', +',158,158,170,158,,,,,,,,,,,,,,,,,,25,25,25,25,25,25,25,25,25,25,,,,', +'25,,,25,25,,,,,25,,,25,25,25,25,,170,,170,170,25,170,25,,25,25,,,25', +'25,,,,,,25,25,25,25,25,25,,,,25,25,,,,,302,302,302,302,302,302,302,302', +'302,302,,,,,302,,,302,302,,,,,302,25,25,302,302,302,25,,25,25,,25,302', +',302,,302,302,,,302,302,266,,266,,,302,302,302,302,302,302,,,,302,302', +',,,,,,,,,,,,,,,,266,266,,,,266,,,,266,,,302,302,,,,302,266,302,302,', +'302,,,266,266,266,266,266,266,266,266,266,266,266,266,266,266,266,266', +'266,266,266,266,266,266,266,266,266,266,266,266,266,266,266,266,266', +'266,297,,297,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,297,297,,,,297,,,,297,,,,', +',,,,297,,,,,,,297,297,297,297,297,297,297,297,297,297,297,297,297,297', +'297,297,297,297,297,297,297,297,297,297,297,297,297,297,297,297,297', +'297,297,297,300,,300,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,300,300,,,,300,,,', +'300,,,,,,,,,300,,,,,,,300,300,300,300,300,300,300,300,300,300,300,300', +'300,300,300,300,300,300,300,300,300,300,300,300,300,300,300,300,300', +'300,300,300,300,300,301,,301,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,301,301,,', +',301,,,,301,,,,,,,,,301,,,,,,,301,301,301,301,301,301,301,301,301,301', '301,301,301,301,301,301,301,301,301,301,301,301,301,301,301,301,301', -'301,301,301,301,301,301,301,301,301,301,301,268,,268,,,,,,,,,,,,,,,', -',,,,,,,,,,,,,,268,268,,,,268,,,,268,,,,,,,,,,268,,,,,,,268,268,268,268', -'268,268,268,268,268,268,268,268,268,268,268,268,268,268,268,268,268', -'268,268,268,268,268,268,268,268,268,268,268,268,268,317,,317,,,,,,,', -',,,,,,,,,,,,,,,,,,,,,,317,317,,,,317,,,,317,,,,,,,,,,317,,,,,,,317,317', -'317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,317', -'317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,269,,269', -',,,,,,,,,,,,,,,,,,,,,,,,,,,,,269,269,,,,269,,,,269,,,,,,,,,,269,,,,', -',,269,269,269,269,269,269,269,269,269,269,269,269,269,269,269,269,269', -'269,269,269,269,269,269,269,269,269,269,269,269,269,269,269,269,269', -'277,,277,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,277,277,,,,277,,,,277,,,,,,,,', -',277,,,,,,,277,277,277,277,277,277,277,277,277,277,277,277,277,277,277', -'277,277,277,277,277,277,277,277,277,277,277,277,277,277,277,277,277', -'277,277,278,,278,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,278,278,,,,278,,,,278', -',,,,,,,,,278,,,,,,,278,278,278,278,278,278,278,278,278,278,278,278,278', -'278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278', -'278,278,278,278,199,,199,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,199,199,,,,199', -',,,199,,,,,,,,,,199,,,,,,,199,199,199,199,199,199,199,199,199,199,199', -'199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199', -'199,199,199,199,199,199,295,,295,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,295,295', -',,,295,,,,295,,,,,,,,,,295,,,,,,,295,295,295,295,295,295,295,295,295', -'295,295,295,295,295,295,295,295,295,295,295,295,295,295,295,295,295', -'295,295,295,295,295,295,295,295,194,,194,,,,,,,,,,,,,,,,,,,,,,,194,', -',,,,,194,194,,,,194,,,,194,,,,,,,,,,194,,,,,,,194,194,194,194,194,194', -'194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194', -'194,194,194,194,194,194,194,194,194,194,194,88,,88,,,,,,,,,,,,,,,,,', -',,,,,,,,,,,,88,88,,,,88,,,,88,,,,,,,,88,,88,,,,,,,88,88,88,88,88,88', -'88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88', -'88,88,88,88,88,87,,87,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,87,87,,,,87,,,,87', -',,,,,,,87,,87,,,,,,,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87', -'87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,193,,193,,,,,', -',,,,,,,,,,,,,,,,,,,,,,,,193,193,,,,193,,,,193,,,,,,,,,,193,,,,,,,193', +'301,301,301,301,301,301,301,276,,276,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,276', +'276,,,,276,,,,276,,,,,,,,,276,,,,,,,276,276,276,276,276,276,276,276', +'276,276,276,276,276,276,276,276,276,276,276,276,276,276,276,276,276', +'276,276,276,276,276,276,276,276,276,273,,273,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,273,273,,,,273,,,,273,,,,,,,,,273,,,,,,,273,273,273,273,273,273', +'273,273,273,273,273,273,273,273,273,273,273,273,273,273,273,273,273', +'273,273,273,273,273,273,273,273,273,273,273,114,,114,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,114,114,,,,114,,,,114,,,,,,,,,114,,,,,,,114,114,114,114', +'114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114', +'114,114,114,114,114,114,114,114,114,114,114,114,114,264,,264,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,264,264,,,,264,,,,264,,,,,,,,,264,,,,,,,264,264', +'264,264,264,264,264,264,264,264,264,264,264,264,264,264,264,264,264', +'264,264,264,264,264,264,264,264,264,264,264,264,264,264,264,236,,236', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,236,236,,,,236,,,,236,,,,,,,,,236,,,,,', +',236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236', +'236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236', +'230,,230,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,230,230,,,,230,,,,230,,,,,,,,', +'230,,,,,,,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230', +'230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230', +'230,230,222,,222,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,222,222,,,,222,,,,222', +',,,,,,,,222,,,,,,,222,222,222,222,222,222,222,222,222,222,222,222,222', +'222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222', +'222,222,222,222,210,,210,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,210,210,,,,210', +',,,210,,,,,,,,,210,,,,,,,210,210,210,210,210,210,210,210,210,210,210', +'210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210', +'210,210,210,210,210,210,197,,197,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,197,197', +',,,197,,,,197,,,,,,,,,197,,,,,,,197,197,197,197,197,197,197,197,197', +'197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197', +'197,197,197,197,197,197,197,197,193,,193,,,,,,,,,,,,,,,,,,,,,,,193,', +',,,,,193,193,,,,193,,,,193,,,,,,,,,193,,,,,,,193,193,193,193,193,193', '193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193', -'193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,85,', -'85,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,85,85,,,,85,,,,85,,,,,,,,85,,85,,,,', -',,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85', -'85,85,85,85,85,85,85,85,85,85,85,85,257,257,,,,,,,,257,,,,,,,,,,257', -',,,,,,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257', -'257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257', -'257,95,95,,,,,,,,95,,,,,,,,,,95,,,,,,,95,95,95,95,95,95,95,95,95,95', -'95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95', -'95,235,235,,,,,,,,235,,,,,,,,,,235,,,,,,,235,235,235,235,235,235,235', -'235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235', -'235,235,235,235,235,235,235,121,121,,,,,,,,121,,,,,,,,,,121,,,,,,,121', -'121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121', -'121,121,121,121,121,121,121,121,121,121,121,121,121,232,232,,,,,,,,232', -',,,,,,,,,232,,,,,,,232,232,232,232,232,232,232,232,232,232,232,232,232', -'232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232', -'232,228,228,,,,,,,,228,,,,,,,,,,228,,,,,,,228,228,228,228,228,228,228', -'228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228', -'228,228,228,228,228,228,228,225,,,,,,,,225,,,,,,,,,,225,,,,,,,225,225', -'225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225', -'225,225,225,225,225,225,225,225,225,225,225,225,308,,,,,,,,308,,,,,', -',,,,308,,,,,,,308,308,308,308,308,308,308,308,308,308,308,308,308,308', -'308,308,308,308,308,308,308,308,308,308,308,308,308,308,308,308,308', -'285,,,,,,,,285,,,,,,,,,,285,,,,,,,285,285,285,285,285,285,285,285,285', -'285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285', -'285,285,285,285,285,284,,,,,,,,284,,,,,,,,,,284,,,,,,,284,284,284,284', -'284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284', -'284,284,284,284,284,284,284,284,284,284,307,,,,,,,,307,,,,,,,,,,307', -',,,,,,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307', -'307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,251,,,,', -',,,,,251,,,,,,,251,251,251,251,251,251,251,251,251,251,251,251,251,251', -'251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,93,', -',,,,,,,,93,,,,,,,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93', -'93,93,93,93,93,93,93,93,93,93,93,93,93,102,,,,,,,,,,102,,,,,,,102,102', -'102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102', -'102,102,102,102,102,102,102,102,102,102,102,216,,,,,,,216,216,216,216', -'216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216', -'216,216,216,216,216,216,216,216,216,244,,,,,,,244,244,244,244,244,244', -'244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244', -'244,244,244,244,244,244,244,220,,,,,,,220,220,220,220,220,220,220,220', -'220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220', -'220,220,220,220,220,252,,,,,,,252,252,252,252,252,252,252,252,252,252', -'252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252', -'252,252,252,247,,,,,,,247,247,247,247,247,247,247,247,247,247,247,247', +'193,193,193,193,193,193,193,193,193,193,193,192,,192,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,192,192,,,,192,,,,192,,,,,,,,,192,,,,,,,192,192,192,192', +'192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192', +'192,192,192,192,192,192,192,192,192,192,192,192,192,313,,313,,,,,,,', +',,,,,,,,,,,,,,,313,,,,,,,313,313,,,,313,,,,313,,,,,,,,,313,,,,,,,313', +'313,313,313,313,313,313,313,313,313,313,313,313,313,313,313,313,313', +'313,313,313,313,313,313,313,313,313,313,313,313,313,313,313,313,68,', +'68,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,68,68,,,,68,,,,68,,,,,,,,,68,,,,,,,68', +'68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68', +'68,68,68,68,68,68,68,68,68,68,87,,87,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,87', +'87,,,,87,,,,87,,,,,,,87,,87,,,,,,,87,87,87,87,87,87,87,87,87,87,87,87', +'87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,319', +',319,,,,,,,,,,,,,,,,,,,,,,,319,,,,,,,319,319,,,,319,,,,319,,,,,,,,,319', +',,,,,,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319', +'319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319', +'319,86,,86,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,86,86,,,,86,,,,86,,,,,,,86,', +'86,,,,,,,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86', +'86,86,86,86,86,86,86,86,86,86,86,86,86,86,318,,318,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,318,318,,,,318,,,,318,,,,,,,,,318,,,,,,,318,318,318,318', +'318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,318', +'318,318,318,318,318,318,318,318,318,318,318,318,318,84,,84,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,84,84,,,,84,,,,84,,,,,,,84,,84,,,,,,,84,84,84,84', +'84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84', +'84,84,84,84,84,84,84,93,93,,,,,,,,93,,,,,,,,,93,,,,,,,93,93,93,93,93', +'93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93', +'93,93,93,93,93,93,256,256,,,,,,,,256,,,,,,,,,256,,,,,,,256,256,256,256', +'256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256', +'256,256,256,256,256,256,256,256,256,256,256,256,256,227,227,,,,,,,,227', +',,,,,,,,227,,,,,,,227,227,227,227,227,227,227,227,227,227,227,227,227', +'227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227', +'227,231,231,,,,,,,,231,,,,,,,,,231,,,,,,,231,231,231,231,231,231,231', +'231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231', +'231,231,231,231,231,231,231,224,224,,,,,,,,224,,,,,,,,,224,,,,,,,224', +'224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224', +'224,224,224,224,224,224,224,224,224,224,224,224,224,119,119,,,,,,,,119', +',,,,,,,,119,,,,,,,119,119,119,119,119,119,119,119,119,119,119,119,119', +'119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119', +'119,306,,,,,,,,306,,,,,,,,,306,,,,,,,306,306,306,306,306,306,306,306', +'306,306,306,306,306,306,306,306,306,306,306,306,306,306,306,306,306', +'306,306,306,306,306,306,307,,,,,,,,307,,,,,,,,,307,,,,,,,307,307,307', +'307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307', +'307,307,307,307,307,307,307,307,307,307,307,284,,,,,,,,284,,,,,,,,,284', +',,,,,,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284', +'284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,223,,,,', +',,,223,,,,,,,,,223,,,,,,,223,223,223,223,223,223,223,223,223,223,223', +'223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223', +'223,223,223,283,,,,,,,,283,,,,,,,,,283,,,,,,,283,283,283,283,283,283', +'283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283', +'283,283,283,283,283,283,283,283,110,,,,,,,,,110,,,,,,,110,110,110,110', +'110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110', +'110,110,110,110,110,110,110,110,110,92,,,,,,,,,92,,,,,,,92,92,92,92', +'92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92', +'92,92,92,250,,,,,,,,,250,,,,,,,250,250,250,250,250,250,250,250,250,250', +'250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250', +'250,250,250,251,,,,,,,251,251,251,251,251,251,251,251,251,251,251,251', +'251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251', +'251,240,,,,,,,240,240,240,240,240,240,240,240,240,240,240,240,240,240', +'240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,243', +',,,,,,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243,243', +'243,243,243,243,243,243,243,243,243,243,243,243,243,243,215,,,,,,,215', +'215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215', +'215,215,215,215,215,215,215,215,215,215,215,215,247,,,,,,,247,247,247', '247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247', -'247' ] - racc_action_check = arr = Array.new(11069, nil) +'247,247,247,247,247,247,247,247,247,247' ] + racc_action_check = arr = Array.new(10938, nil) idx = 0 clist.each do |str| str.split(',', -1).each do |i| @@ -773,350 +766,349 @@ def on_error(error_token_id, error_value, value_stack) end racc_action_pointer = [ - 6832, 281, nil, nil, 202, 223, 406, nil, nil, 508, - nil, 610, 712, nil, nil, 814, nil, nil, nil, 916, - nil, 8038, 1120, nil, 1222, nil, 7973, nil, nil, nil, - 171, nil, nil, 1528, 406, nil, 11, 124, nil, 1936, - 2038, nil, nil, 252, nil, nil, nil, 2242, 2344, nil, - nil, nil, nil, nil, nil, 2446, nil, nil, nil, nil, - 137, 2650, nil, nil, nil, nil, nil, nil, 81, nil, - 156, 227, 8733, -2, 3262, 146, nil, 111, -3, 399, - nil, 203, nil, nil, -1, 10021, 342, 9837, 9745, 484, - 280, 304, 481, 10747, 204, 10141, 173, 134, 145, 178, - nil, nil, 10794, 100, nil, 5710, 229, 231, 236, nil, - nil, nil, nil, 6118, 6220, 65, 8181, 93, 164, -26, - -2, 10258, 329, nil, 89, 235, 320, 7444, nil, 2140, - 7342, 7240, 317, 7138, 7036, 6934, 6730, 232, 6628, 6526, - 6424, 6322, 6016, 5914, 5812, 5506, 5404, 5302, 5200, 5098, - 4996, nil, 4894, 4792, 4690, nil, 4588, 4486, 4384, 4282, - 4180, 4078, 3976, -2, 3874, 3772, 3670, 3568, 3466, 3364, - nil, 7909, 3160, nil, 138, nil, 249, 132, 204, nil, - nil, nil, nil, nil, nil, 127, 121, nil, 217, 3058, - 2956, 84, 91, 9929, 9653, nil, nil, nil, 74, 9469, - 2854, nil, nil, 2752, -44, 9, 5, -35, nil, nil, - nil, 101, 2548, 7546, 87, 8089, 10831, 517, 1047, 85, - 10905, 721, 1656, 8365, 65, 10428, 216, 1554, 10372, 415, - 1741, 8641, 10315, 823, 1639, 10201, 313, 1435, 8457, 925, - 1537, 619, 1027, 195, 10868, 1231, 297, 10979, nil, 1129, - 382, 10700, 10942, 1333, 1149, 508, 583, 10081, 183, nil, - 123, -45, 1834, 126, nil, nil, 226, nil, 9009, 9193, - nil, nil, -67, nil, nil, 1732, 1630, 9285, 9377, 1426, - 67, 79, nil, nil, 10596, 10540, nil, 1324, 1018, 200, - nil, nil, nil, -13, -2, 9561, 166, nil, nil, nil, - 304, 8917, 8825, 7778, 7689, nil, nil, 10652, 10484, nil, - 5608, 82, 256, 7844, 8273, 7597, nil, 9101, nil, nil, - 8549, nil, nil, nil ] + 6563, 288, 184, nil, nil, 301, nil, 402, nil, nil, + 503, nil, 604, 705, nil, nil, 806, nil, nil, 907, + nil, -2, 1109, nil, nil, 7881, 136, nil, nil, nil, + 3, nil, 291, 1614, 1715, nil, 1816, -7, nil, 2018, + nil, nil, 2119, 129, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 2321, 185, 2523, nil, nil, nil, nil, + nil, nil, 81, nil, nil, nil, 204, -54, 9450, 191, + -2, 3230, nil, nil, 3331, 264, nil, nil, 115, nil, + nil, 203, -5, 238, 9905, 393, 9723, 9541, 295, 177, + 476, 402, 10618, 9964, 56, 139, nil, 21, nil, 457, + nil, 5351, 5452, -13, 20, 37, nil, nil, nil, nil, + 10572, 480, 6058, 64, 8540, 6361, 396, -2, 107, 10250, + 235, nil, 78, 7068, 195, 227, nil, 7371, 2422, 7270, + 286, 207, 7169, 6967, 6866, 6765, 6664, 6462, 6260, 6159, + 5957, 5856, 5755, 5654, 99, 5250, nil, 5149, 5048, nil, + 4947, 4846, 4745, 4644, 4543, 4442, 4341, 4240, 7764, 4139, + 4038, 3937, 3836, 3735, 3634, 3533, 3432, 3129, nil, nil, + 7818, 3028, nil, 292, 468, nil, nil, nil, nil, 149, + 204, 152, nil, nil, 75, 2927, 84, 2826, nil, 177, + 120, -2, 9268, 9177, nil, nil, nil, 9086, nil, nil, + 2725, 2624, 126, 73, nil, 169, 183, 142, nil, nil, + 8995, 176, 7472, 2220, -12, 10812, 209, 1438, 84, 83, + 815, 1640, 8904, 10470, 10194, 916, 1539, 10082, 310, 1522, + 8813, 10138, 613, 1623, 714, 1421, 8722, 411, 1118, -24, + 10738, 1320, 278, 10775, nil, 1017, 379, 10849, 1219, -7, + 10664, 10701, 512, 191, 301, 375, 10023, -41, nil, -10, + 124, 125, 1917, nil, 8631, nil, 7994, nil, nil, 182, + nil, -68, nil, 8449, 1513, 1412, 8358, 1311, nil, 75, + 96, nil, nil, 10525, 10415, nil, 1210, 1008, 114, nil, + nil, nil, -2, 145, nil, nil, 42, 8085, nil, 200, + 8176, 8267, 7946, 7611, nil, nil, 10305, 10360, nil, 215, + 130, 5553, 7699, 9359, 7520, nil, nil, nil, 9814, 9632, + nil, nil, nil ] racc_action_default = [ - -1, -186, -97, -9, -186, -179, -186, -98, -10, -186, - -106, -186, -186, -26, -11, -186, -107, -27, -12, -186, - -108, -186, -186, -13, -186, -109, -46, -14, -110, -28, - -120, -15, -29, -186, -126, -31, -134, -186, -16, -141, - -186, -35, -17, -186, -36, -34, -18, -186, -186, -37, - -19, -47, -20, -128, -38, -186, -30, -21, -39, -32, - -186, -186, -22, -40, -2, -23, -104, -33, -186, -105, - -3, -186, -5, -8, -186, -186, -99, -101, -186, -48, - -177, -179, -181, -183, -186, -158, -49, -186, -186, -53, - -55, -186, -127, -56, -54, -45, -186, -186, -186, -120, - -44, -121, -57, -141, -131, -186, -186, -186, -186, -112, - -116, -117, -135, -141, -186, -186, -142, -51, -186, -50, - -186, -155, -186, -25, -186, -162, -186, -7, -4, -186, - -186, -186, -186, -186, -186, -186, -186, -186, -186, -186, - -186, -186, -186, -186, -186, -186, -186, -186, -186, -186, - -186, -59, -186, -186, -186, -58, -186, -186, -186, -186, - -186, -186, -186, -94, -186, -186, -186, -186, -186, -186, - -130, -186, -186, -111, -52, -96, -186, -186, -186, -178, - -182, -180, -176, -157, -175, -186, -186, -119, -186, -186, - -186, -186, -186, -142, -186, -113, -114, -115, -186, -143, - -186, -140, -148, -186, -186, -151, -186, -186, -156, 324, - -24, -186, -186, -186, -186, -6, -87, -75, -64, -186, - -88, -76, -65, -184, -186, -93, -77, -66, -89, -78, - -67, -185, -90, -79, -68, -91, -80, -69, -159, -81, - -70, -82, -71, -60, -84, -72, -61, -85, -83, -73, - -62, -92, -86, -74, -63, -129, -186, -41, -186, -100, - -186, -186, -186, -186, -170, -122, -186, -123, -42, -43, - -125, -132, -186, -118, -133, -186, -186, -144, -145, -186, - -186, -186, -152, -163, -164, -165, -161, -186, -186, -160, - -103, -102, -95, -186, -186, -149, -186, -168, -171, -124, - -186, -147, -146, -103, -186, -153, -154, -167, -166, -174, - -186, -172, -186, -103, -186, -186, -136, -150, -173, -169, - -186, -138, -137, -139 ] + -1, -178, -185, -97, -10, -185, -105, -185, -26, -11, + -185, -106, -185, -185, -27, -12, -185, -107, -13, -185, + -108, -185, -185, -14, -109, -45, -119, -15, -28, -16, + -125, -29, -133, -185, -185, -31, -140, -185, -17, -185, + -34, -18, -185, -185, -35, -19, -36, -46, -20, -127, + -30, -21, -37, -185, -185, -185, -22, -38, -32, -2, + -23, -39, -3, -104, -103, -33, -185, -185, -5, -185, + -8, -185, -96, -9, -185, -178, -180, -182, -185, -176, + -98, -100, -185, -48, -157, -52, -185, -185, -54, -53, + -185, -126, -55, -44, -185, -119, -43, -185, -120, -185, + -130, -140, -185, -185, -185, -185, -111, -115, -116, -134, + -56, -50, -185, -185, -141, -140, -49, -185, -185, -154, + -185, -25, -185, -7, -161, -185, -4, -185, -185, -185, + -185, -185, -185, -185, -185, -185, -185, -185, -185, -185, + -185, -185, -185, -185, -185, -185, -58, -185, -185, -57, + -185, -185, -185, -185, -185, -185, -185, -185, -93, -185, + -185, -185, -185, -185, -185, -185, -185, -185, -95, -129, + -185, -185, -110, -51, -47, -181, -177, -179, -175, -185, + -185, -185, -156, -174, -185, -185, -185, -185, -118, -185, + -185, -185, -141, -185, -112, -113, -114, -142, -139, -147, + -185, -185, -185, -185, -155, -150, -185, -185, 323, -24, + -6, -185, -185, -185, -185, -87, -75, -64, -185, -185, + -76, -65, -183, -92, -88, -77, -66, -89, -78, -67, + -184, -90, -79, -68, -80, -69, -158, -81, -70, -59, + -83, -71, -60, -84, -82, -72, -61, -85, -73, -62, + -91, -86, -74, -63, -128, -185, -40, -185, -99, -185, + -185, -185, -185, -169, -41, -124, -42, -122, -121, -185, + -131, -185, -117, -144, -185, -185, -143, -185, -132, -185, + -185, -151, -162, -163, -164, -160, -185, -185, -159, -102, + -101, -94, -185, -185, -167, -170, -185, -148, -123, -185, + -146, -145, -102, -185, -152, -153, -166, -165, -173, -185, + -171, -185, -102, -185, -185, -135, -168, -172, -149, -185, + -137, -136, -138 ] racc_goto_table = [ - 64, 173, 170, 71, 76, 264, 214, 79, 91, 85, - 80, 265, 86, 267, 87, 88, 126, 82, 89, 173, - 170, 115, 90, 100, 92, 93, 60, 94, 96, 95, - 294, 263, 205, 70, 182, 260, 102, 81, 78, 83, - nil, nil, 116, 117, nil, nil, 118, nil, nil, nil, - 119, 120, nil, nil, nil, nil, nil, nil, 121, nil, - nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, - 127, 128, nil, nil, nil, nil, nil, 174, 175, nil, - 219, nil, nil, 298, nil, 192, 179, 181, 183, nil, - 184, 299, 100, 180, 124, 198, 188, 191, nil, 289, - nil, nil, nil, nil, nil, nil, 193, nil, 194, nil, - nil, nil, nil, 309, nil, nil, 193, 199, nil, nil, - nil, nil, nil, nil, 127, nil, nil, nil, nil, nil, - 215, nil, 216, 217, 218, nil, 220, 221, 222, 223, - nil, 225, 226, 227, 228, 229, 230, 231, 232, 233, - 234, 235, 236, 237, nil, 238, 239, 240, 255, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, nil, 256, 257, nil, nil, 261, 100, - 259, 100, nil, 173, 170, nil, 266, nil, nil, nil, - nil, 188, 268, 269, nil, nil, nil, nil, nil, nil, - 276, nil, nil, 277, nil, nil, 278, nil, nil, nil, - 282, nil, nil, nil, nil, 284, 285, 286, nil, nil, + 59, 80, 67, 214, 263, 267, 268, 83, 172, 84, + 169, 125, 85, 113, 86, 87, 76, 79, 88, 62, + 96, 89, 90, 91, 92, 99, 54, 93, 172, 296, + 169, 261, 205, 178, 259, 110, 111, 75, 114, 82, + 77, 116, nil, nil, 117, 118, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 119, nil, nil, nil, nil, + nil, nil, 123, nil, nil, nil, nil, 126, nil, nil, + nil, 168, nil, 173, 122, 218, 174, nil, 191, nil, + 177, 295, nil, nil, nil, 298, 182, nil, 183, 96, + 175, 176, 203, nil, 186, nil, 288, nil, nil, 189, + nil, nil, nil, 192, 193, nil, nil, nil, nil, nil, + nil, nil, 308, nil, 197, nil, nil, 192, nil, nil, + nil, nil, 123, nil, nil, 210, nil, nil, nil, 215, + 216, 217, nil, nil, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, nil, 234, + 235, nil, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + nil, 254, 255, 256, nil, nil, nil, nil, 260, 258, + nil, nil, nil, 96, 96, nil, 189, 264, nil, 266, + 269, nil, 172, nil, 169, nil, nil, nil, nil, nil, + nil, 275, 273, 276, nil, nil, nil, nil, nil, 281, + nil, nil, nil, nil, 283, 284, 285, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, - nil, nil, nil, nil, nil, nil, 261, nil, nil, 100, - nil, 293, nil, 292, nil, 295, nil, nil, nil, nil, - nil, nil, nil, nil, nil, nil, nil, nil, 301, 302, - nil, nil, 304, 305, 306, nil, 261, nil, nil, nil, - 307, 308, nil, nil, nil, nil, nil, 311, nil, 312, - nil, nil, nil, 314, nil, nil, 315, nil, nil, nil, - nil, 318, nil, 317, nil, nil, 320 ] + nil, nil, nil, nil, nil, 260, nil, nil, nil, nil, + 292, 291, nil, 96, 297, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 300, 301, nil, 303, + nil, 304, 305, nil, nil, nil, 260, nil, 306, 307, + nil, nil, nil, nil, nil, 309, nil, nil, 310, nil, + nil, 313, nil, nil, 314, nil, nil, nil, nil, nil, + 317, nil, nil, 318, 319 ] racc_goto_check = [ - 2, 32, 38, 4, 26, 45, 43, 5, 6, 5, - 47, 23, 5, 23, 5, 5, 42, 49, 5, 32, - 38, 39, 5, 21, 33, 5, 1, 5, 36, 5, - 40, 44, 41, 3, 46, 25, 5, 48, 24, 50, - nil, nil, 5, 5, nil, nil, 4, nil, nil, nil, - 5, 5, nil, nil, nil, nil, nil, nil, 5, nil, - nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, - 2, 2, nil, nil, nil, nil, nil, 5, 4, nil, - 42, nil, nil, 45, nil, 39, 47, 4, 4, nil, - 4, 23, 21, 49, 3, 39, 2, 36, nil, 43, - nil, nil, nil, nil, nil, nil, 5, nil, 5, nil, - nil, nil, nil, 45, nil, nil, 5, 5, nil, nil, - nil, nil, nil, nil, 2, nil, nil, nil, nil, nil, - 5, nil, 5, 5, 5, nil, 5, 5, 5, 5, - nil, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, nil, 5, 5, 5, 6, 5, + 2, 26, 4, 43, 45, 23, 23, 5, 32, 5, + 38, 42, 5, 39, 5, 5, 49, 47, 5, 3, + 21, 5, 6, 33, 5, 36, 1, 5, 32, 40, + 38, 44, 41, 46, 25, 5, 5, 48, 5, 24, + 50, 5, nil, nil, 5, 4, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 5, nil, nil, nil, nil, + nil, nil, 2, nil, nil, nil, nil, 2, nil, nil, + nil, 4, nil, 5, 3, 42, 5, nil, 39, nil, + 4, 45, nil, nil, nil, 23, 4, nil, 4, 21, + 49, 47, 39, nil, 36, nil, 43, nil, nil, 2, + nil, nil, nil, 5, 5, nil, nil, nil, nil, nil, + nil, nil, 45, nil, 5, nil, nil, 5, nil, nil, + nil, nil, 2, nil, nil, 5, nil, nil, nil, 5, + 5, 5, nil, nil, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, nil, 5, + 5, nil, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, nil, 33, 5, nil, nil, 21, 21, - 26, 21, nil, 32, 38, nil, 2, nil, nil, nil, - nil, 2, 5, 5, nil, nil, nil, nil, nil, nil, - 2, nil, nil, 5, nil, nil, 5, nil, nil, nil, - 4, nil, nil, nil, nil, 5, 5, 4, nil, nil, + nil, 6, 33, 5, nil, nil, nil, nil, 21, 26, + nil, nil, nil, 21, 21, nil, 2, 5, nil, 5, + 2, nil, 32, nil, 38, nil, nil, nil, nil, nil, + nil, 2, 5, 5, nil, nil, nil, nil, nil, 4, + nil, nil, nil, nil, 5, 5, 4, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, - nil, nil, nil, nil, nil, nil, 21, nil, nil, 21, - nil, 2, nil, 4, nil, 5, nil, nil, nil, nil, - nil, nil, nil, nil, nil, nil, nil, nil, 5, 5, - nil, nil, 5, 4, 4, nil, 21, nil, nil, nil, - 5, 5, nil, nil, nil, nil, nil, 4, nil, 4, - nil, nil, nil, 5, nil, nil, 5, nil, nil, nil, - nil, 2, nil, 5, nil, nil, 5 ] + nil, nil, nil, nil, nil, 21, nil, nil, nil, nil, + 2, 4, nil, 21, 5, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 5, 5, nil, 5, + nil, 4, 4, nil, nil, nil, 21, nil, 5, 5, + nil, nil, nil, nil, nil, 4, nil, nil, 4, nil, + nil, 5, nil, nil, 5, nil, nil, nil, nil, nil, + 2, nil, nil, 5, 5 ] racc_goto_pointer = [ - nil, 26, 0, 33, 3, 3, -13, nil, nil, nil, + nil, 26, 0, 19, 2, 2, 1, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, - nil, -7, nil, -175, 37, -143, 3, nil, nil, nil, - nil, nil, -72, 3, nil, nil, -2, nil, -71, -18, - -232, -86, -52, -120, -154, -180, -50, 5, 32, 12, - 34 ] + nil, -6, nil, -184, 37, -147, -1, nil, nil, nil, + nil, nil, -62, 2, nil, nil, -1, nil, -60, -23, + -233, -86, -55, -122, -153, -180, -45, 16, 36, 15, + 39 ] racc_goto_default = [ - nil, nil, 203, nil, nil, 72, 73, 3, 8, 14, - 18, 23, 27, 31, 38, 42, 46, 50, 52, 57, - 62, 65, 69, 101, nil, 75, nil, 10, 16, 20, - 25, 28, 109, 34, 110, 111, nil, 53, 104, nil, - nil, nil, nil, nil, nil, nil, 5, nil, nil, nil, + nil, nil, 200, nil, nil, 68, 70, 73, 4, 9, + 15, 18, 23, 27, 29, 38, 41, 45, 48, 51, + 56, 60, 63, 98, nil, 69, nil, 6, 11, 17, + 20, 24, 106, 30, 107, 108, nil, 49, 100, nil, + nil, nil, nil, nil, nil, nil, 1, nil, nil, nil, nil ] racc_reduce_table = [ 0, 0, :racc_error, - 0, 108, :_reduce_1, - 1, 108, :_reduce_2, - 1, 108, :_reduce_3, - 2, 108, :_reduce_4, - 1, 110, :_reduce_5, - 3, 110, :_reduce_6, - 2, 110, :_reduce_7, - 1, 112, :_reduce_none, - 1, 112, :_reduce_none, - 1, 112, :_reduce_none, - 1, 112, :_reduce_none, - 1, 112, :_reduce_none, - 1, 112, :_reduce_none, - 1, 112, :_reduce_none, - 1, 112, :_reduce_none, - 1, 112, :_reduce_none, - 1, 112, :_reduce_none, - 1, 112, :_reduce_none, - 1, 112, :_reduce_none, - 1, 112, :_reduce_none, - 1, 112, :_reduce_none, - 1, 112, :_reduce_none, - 1, 112, :_reduce_none, - 3, 111, :_reduce_24, - 2, 111, :_reduce_25, - 1, 109, :_reduce_none, - 1, 109, :_reduce_none, - 1, 129, :_reduce_28, - 1, 129, :_reduce_29, - 1, 129, :_reduce_30, - 1, 129, :_reduce_31, - 1, 129, :_reduce_32, - 1, 129, :_reduce_33, - 1, 129, :_reduce_34, - 1, 129, :_reduce_35, - 1, 129, :_reduce_36, - 1, 129, :_reduce_37, - 1, 129, :_reduce_38, - 1, 129, :_reduce_39, - 1, 129, :_reduce_40, - 3, 117, :_reduce_41, - 3, 130, :_reduce_42, - 3, 130, :_reduce_43, - 1, 130, :_reduce_44, - 2, 121, :_reduce_45, - 1, 121, :_reduce_46, - 1, 128, :_reduce_47, - 2, 116, :_reduce_48, - 2, 116, :_reduce_49, - 2, 116, :_reduce_50, - 2, 116, :_reduce_51, - 2, 116, :_reduce_52, - 2, 116, :_reduce_53, - 2, 116, :_reduce_54, - 2, 116, :_reduce_55, - 2, 116, :_reduce_56, - 2, 116, :_reduce_57, - 2, 116, :_reduce_58, - 2, 116, :_reduce_59, - 3, 116, :_reduce_60, - 3, 116, :_reduce_61, - 3, 116, :_reduce_62, - 3, 116, :_reduce_63, - 3, 116, :_reduce_64, - 3, 116, :_reduce_65, - 3, 116, :_reduce_66, - 3, 116, :_reduce_67, - 3, 116, :_reduce_68, - 3, 116, :_reduce_69, - 3, 116, :_reduce_70, - 3, 116, :_reduce_71, - 3, 116, :_reduce_72, - 3, 116, :_reduce_73, - 3, 116, :_reduce_74, - 3, 116, :_reduce_75, - 3, 116, :_reduce_76, - 3, 116, :_reduce_77, - 3, 116, :_reduce_78, - 3, 116, :_reduce_79, - 3, 116, :_reduce_80, - 3, 116, :_reduce_81, - 3, 116, :_reduce_82, - 3, 116, :_reduce_83, - 3, 116, :_reduce_84, - 3, 116, :_reduce_85, - 3, 116, :_reduce_86, - 3, 116, :_reduce_87, - 3, 116, :_reduce_88, - 3, 116, :_reduce_89, - 3, 116, :_reduce_90, - 3, 116, :_reduce_91, - 3, 116, :_reduce_92, - 3, 116, :_reduce_93, - 2, 127, :_reduce_94, - 5, 115, :_reduce_95, - 2, 115, :_reduce_96, - 1, 132, :_reduce_97, - 1, 132, :_reduce_98, - 1, 131, :_reduce_99, - 3, 131, :_reduce_100, - 1, 133, :_reduce_none, - 4, 133, :_reduce_102, - 4, 126, :_reduce_103, - 1, 113, :_reduce_104, - 1, 113, :_reduce_105, - 1, 113, :_reduce_106, - 1, 113, :_reduce_107, - 1, 113, :_reduce_108, - 1, 113, :_reduce_109, - 1, 113, :_reduce_110, - 2, 113, :_reduce_111, - 2, 113, :_reduce_112, - 2, 139, :_reduce_113, - 2, 139, :_reduce_114, - 2, 139, :_reduce_115, - 1, 139, :_reduce_116, - 1, 139, :_reduce_117, - 3, 141, :_reduce_118, - 3, 135, :_reduce_119, - 0, 143, :_reduce_120, - 1, 143, :_reduce_121, - 3, 143, :_reduce_122, - 3, 143, :_reduce_123, - 4, 143, :_reduce_124, - 3, 143, :_reduce_125, - 1, 114, :_reduce_126, - 2, 114, :_reduce_127, - 1, 114, :_reduce_128, - 3, 125, :_reduce_129, - 2, 140, :_reduce_130, - 2, 140, :_reduce_131, - 3, 145, :_reduce_132, - 4, 144, :_reduce_133, - 1, 138, :_reduce_134, - 2, 138, :_reduce_135, - 6, 137, :_reduce_136, - 7, 137, :_reduce_137, - 6, 142, :_reduce_138, - 7, 142, :_reduce_139, - 3, 134, :_reduce_140, - 0, 146, :_reduce_141, - 1, 146, :_reduce_142, - 2, 146, :_reduce_143, - 3, 146, :_reduce_144, - 3, 146, :_reduce_145, - 4, 146, :_reduce_146, - 4, 146, :_reduce_147, - 2, 146, :_reduce_148, - 1, 147, :_reduce_149, - 3, 147, :_reduce_150, - 3, 119, :_reduce_151, - 4, 119, :_reduce_152, - 5, 119, :_reduce_153, - 3, 148, :_reduce_154, - 2, 120, :_reduce_155, - 3, 136, :_reduce_156, - 3, 122, :_reduce_157, - 2, 122, :_reduce_158, - 3, 122, :_reduce_159, - 4, 123, :_reduce_160, - 4, 123, :_reduce_161, - 1, 149, :_reduce_162, - 3, 149, :_reduce_163, - 2, 150, :_reduce_164, - 2, 150, :_reduce_165, - 3, 150, :_reduce_166, - 3, 150, :_reduce_167, - 5, 124, :_reduce_168, - 7, 124, :_reduce_169, - 1, 151, :_reduce_170, - 2, 151, :_reduce_171, - 3, 152, :_reduce_172, - 4, 152, :_reduce_173, + 0, 107, :_reduce_1, + 1, 107, :_reduce_2, + 1, 107, :_reduce_3, + 2, 107, :_reduce_4, + 1, 109, :_reduce_5, + 3, 109, :_reduce_6, + 2, 109, :_reduce_7, + 1, 111, :_reduce_none, + 1, 111, :_reduce_none, + 1, 111, :_reduce_none, + 1, 111, :_reduce_none, + 1, 111, :_reduce_none, + 1, 111, :_reduce_none, + 1, 111, :_reduce_none, + 1, 111, :_reduce_none, + 1, 111, :_reduce_none, + 1, 111, :_reduce_none, + 1, 111, :_reduce_none, + 1, 111, :_reduce_none, + 1, 111, :_reduce_none, + 1, 111, :_reduce_none, + 1, 111, :_reduce_none, + 1, 111, :_reduce_none, + 3, 110, :_reduce_24, + 2, 110, :_reduce_25, + 1, 108, :_reduce_none, + 1, 108, :_reduce_none, + 1, 128, :_reduce_28, + 1, 128, :_reduce_29, + 1, 128, :_reduce_30, + 1, 128, :_reduce_31, + 1, 128, :_reduce_32, + 1, 128, :_reduce_33, + 1, 128, :_reduce_34, + 1, 128, :_reduce_35, + 1, 128, :_reduce_36, + 1, 128, :_reduce_37, + 1, 128, :_reduce_38, + 1, 128, :_reduce_39, + 3, 116, :_reduce_40, + 3, 129, :_reduce_41, + 3, 129, :_reduce_42, + 1, 129, :_reduce_43, + 2, 120, :_reduce_44, + 1, 120, :_reduce_45, + 1, 127, :_reduce_46, + 2, 115, :_reduce_47, + 2, 115, :_reduce_48, + 2, 115, :_reduce_49, + 2, 115, :_reduce_50, + 2, 115, :_reduce_51, + 2, 115, :_reduce_52, + 2, 115, :_reduce_53, + 2, 115, :_reduce_54, + 2, 115, :_reduce_55, + 2, 115, :_reduce_56, + 2, 115, :_reduce_57, + 2, 115, :_reduce_58, + 3, 115, :_reduce_59, + 3, 115, :_reduce_60, + 3, 115, :_reduce_61, + 3, 115, :_reduce_62, + 3, 115, :_reduce_63, + 3, 115, :_reduce_64, + 3, 115, :_reduce_65, + 3, 115, :_reduce_66, + 3, 115, :_reduce_67, + 3, 115, :_reduce_68, + 3, 115, :_reduce_69, + 3, 115, :_reduce_70, + 3, 115, :_reduce_71, + 3, 115, :_reduce_72, + 3, 115, :_reduce_73, + 3, 115, :_reduce_74, + 3, 115, :_reduce_75, + 3, 115, :_reduce_76, + 3, 115, :_reduce_77, + 3, 115, :_reduce_78, + 3, 115, :_reduce_79, + 3, 115, :_reduce_80, + 3, 115, :_reduce_81, + 3, 115, :_reduce_82, + 3, 115, :_reduce_83, + 3, 115, :_reduce_84, + 3, 115, :_reduce_85, + 3, 115, :_reduce_86, + 3, 115, :_reduce_87, + 3, 115, :_reduce_88, + 3, 115, :_reduce_89, + 3, 115, :_reduce_90, + 3, 115, :_reduce_91, + 3, 115, :_reduce_92, + 2, 126, :_reduce_93, + 5, 114, :_reduce_94, + 2, 114, :_reduce_95, + 1, 131, :_reduce_96, + 1, 131, :_reduce_97, + 1, 130, :_reduce_98, + 3, 130, :_reduce_99, + 1, 132, :_reduce_none, + 4, 132, :_reduce_101, + 4, 125, :_reduce_102, + 1, 112, :_reduce_103, + 1, 112, :_reduce_104, + 1, 112, :_reduce_105, + 1, 112, :_reduce_106, + 1, 112, :_reduce_107, + 1, 112, :_reduce_108, + 1, 112, :_reduce_109, + 2, 112, :_reduce_110, + 2, 112, :_reduce_111, + 2, 138, :_reduce_112, + 2, 138, :_reduce_113, + 2, 138, :_reduce_114, + 1, 138, :_reduce_115, + 1, 138, :_reduce_116, + 3, 140, :_reduce_117, + 3, 134, :_reduce_118, + 0, 142, :_reduce_119, + 1, 142, :_reduce_120, + 3, 142, :_reduce_121, + 3, 142, :_reduce_122, + 4, 142, :_reduce_123, + 3, 142, :_reduce_124, + 1, 113, :_reduce_125, + 2, 113, :_reduce_126, + 1, 113, :_reduce_127, + 3, 124, :_reduce_128, + 2, 139, :_reduce_129, + 2, 139, :_reduce_130, + 3, 144, :_reduce_131, + 4, 143, :_reduce_132, + 1, 137, :_reduce_133, + 2, 137, :_reduce_134, + 6, 136, :_reduce_135, + 7, 136, :_reduce_136, + 6, 141, :_reduce_137, + 7, 141, :_reduce_138, + 3, 133, :_reduce_139, + 0, 145, :_reduce_140, + 1, 145, :_reduce_141, + 2, 145, :_reduce_142, + 3, 145, :_reduce_143, + 3, 145, :_reduce_144, + 4, 145, :_reduce_145, + 4, 145, :_reduce_146, + 2, 145, :_reduce_147, + 1, 146, :_reduce_148, + 3, 146, :_reduce_149, + 3, 118, :_reduce_150, + 4, 118, :_reduce_151, + 5, 118, :_reduce_152, + 3, 147, :_reduce_153, + 2, 119, :_reduce_154, + 3, 135, :_reduce_155, + 3, 121, :_reduce_156, + 2, 121, :_reduce_157, + 3, 121, :_reduce_158, + 4, 122, :_reduce_159, + 4, 122, :_reduce_160, + 1, 148, :_reduce_161, + 3, 148, :_reduce_162, + 2, 149, :_reduce_163, + 2, 149, :_reduce_164, + 3, 149, :_reduce_165, + 3, 149, :_reduce_166, + 5, 123, :_reduce_167, + 7, 123, :_reduce_168, + 1, 150, :_reduce_169, + 2, 150, :_reduce_170, + 3, 151, :_reduce_171, + 4, 151, :_reduce_172, + 3, 151, :_reduce_173, 3, 152, :_reduce_174, - 3, 153, :_reduce_175, - 2, 154, :_reduce_176, - 1, 155, :_reduce_177, - 2, 155, :_reduce_178, - 0, 156, :_reduce_179, - 2, 156, :_reduce_180, - 1, 157, :_reduce_181, - 2, 157, :_reduce_182, - 2, 118, :_reduce_183, - 3, 118, :_reduce_184, - 3, 118, :_reduce_185 ] - -racc_reduce_n = 186 - -racc_shift_n = 324 + 2, 153, :_reduce_175, + 1, 154, :_reduce_176, + 2, 154, :_reduce_177, + 0, 155, :_reduce_178, + 2, 155, :_reduce_179, + 1, 156, :_reduce_180, + 2, 156, :_reduce_181, + 2, 117, :_reduce_182, + 3, 117, :_reduce_183, + 3, 117, :_reduce_184 ] + +racc_reduce_n = 185 + +racc_shift_n = 323 racc_token_table = { false => 0, @@ -1166,68 +1158,67 @@ def on_error(error_token_id, error_value, value_stack) :TYPEOF => 44, :SUPER => 45, :EXTENDS => 46, - :ARGUMENTS => 47, - :NEWLINE => 48, - :COMMENT => 49, - :JS => 50, - :INDENT => 51, - :OUTDENT => 52, - "?" => 53, - :UMINUS => 54, - :UPLUS => 55, - :NOT => 56, - "!" => 57, - "!!" => 58, - "~" => 59, - "++" => 60, - "--" => 61, - "*" => 62, - "/" => 63, - "%" => 64, - "+" => 65, - "-" => 66, - "<<" => 67, - ">>" => 68, - ">>>" => 69, - "&" => 70, - "|" => 71, - "^" => 72, - "<=" => 73, - "<" => 74, - ">" => 75, - ">=" => 76, - "==" => 77, - "!=" => 78, - :IS => 79, - :ISNT => 80, - "&&" => 81, - "||" => 82, - :AND => 83, - :OR => 84, - "-=" => 85, - "+=" => 86, - "/=" => 87, - "*=" => 88, - "%=" => 89, - "." => 90, - "||=" => 91, - "&&=" => 92, - "?=" => 93, - :ASSIGN => 94, - "->" => 95, - "=>" => 96, - "\n" => 97, - ";" => 98, - "," => 99, - "{" => 100, - "}" => 101, - "@" => 102, - "[" => 103, - "]" => 104, - "(" => 105, - ")" => 106 } - -racc_nt_base = 107 + :NEWLINE => 47, + :COMMENT => 48, + :JS => 49, + :INDENT => 50, + :OUTDENT => 51, + "?" => 52, + :UMINUS => 53, + :UPLUS => 54, + :NOT => 55, + "!" => 56, + "!!" => 57, + "~" => 58, + "++" => 59, + "--" => 60, + "*" => 61, + "/" => 62, + "%" => 63, + "+" => 64, + "-" => 65, + "<<" => 66, + ">>" => 67, + ">>>" => 68, + "&" => 69, + "|" => 70, + "^" => 71, + "<=" => 72, + "<" => 73, + ">" => 74, + ">=" => 75, + "==" => 76, + "!=" => 77, + :IS => 78, + :ISNT => 79, + "&&" => 80, + "||" => 81, + :AND => 82, + :OR => 83, + "-=" => 84, + "+=" => 85, + "/=" => 86, + "*=" => 87, + "%=" => 88, + "." => 89, + "||=" => 90, + "&&=" => 91, + "?=" => 92, + :ASSIGN => 93, + "->" => 94, + "=>" => 95, + "\n" => 96, + ";" => 97, + "," => 98, + "{" => 99, + "}" => 100, + "@" => 101, + "[" => 102, + "]" => 103, + "(" => 104, + ")" => 105 } + +racc_nt_base = 106 racc_use_result_var = true @@ -1295,7 +1286,6 @@ def on_error(error_token_id, error_value, value_stack) "TYPEOF", "SUPER", "EXTENDS", - "ARGUMENTS", "NEWLINE", "COMMENT", "JS", @@ -1413,49 +1403,49 @@ def on_error(error_token_id, error_value, value_stack) # reduce 0 omitted -module_eval(<<'.,.,', 'grammar.y', 49) +module_eval(<<'.,.,', 'grammar.y', 48) def _reduce_1(val, _values, result) result = Expressions.new result end .,., -module_eval(<<'.,.,', 'grammar.y', 50) +module_eval(<<'.,.,', 'grammar.y', 49) def _reduce_2(val, _values, result) result = Expressions.new result end .,., -module_eval(<<'.,.,', 'grammar.y', 51) +module_eval(<<'.,.,', 'grammar.y', 50) def _reduce_3(val, _values, result) result = val[0] result end .,., -module_eval(<<'.,.,', 'grammar.y', 52) +module_eval(<<'.,.,', 'grammar.y', 51) def _reduce_4(val, _values, result) result = val[0] result end .,., -module_eval(<<'.,.,', 'grammar.y', 57) +module_eval(<<'.,.,', 'grammar.y', 56) def _reduce_5(val, _values, result) result = Expressions.wrap(val) result end .,., -module_eval(<<'.,.,', 'grammar.y', 58) +module_eval(<<'.,.,', 'grammar.y', 57) def _reduce_6(val, _values, result) result = val[0] << val[2] result end .,., -module_eval(<<'.,.,', 'grammar.y', 59) +module_eval(<<'.,.,', 'grammar.y', 58) def _reduce_7(val, _values, result) result = val[0] result @@ -1494,14 +1484,14 @@ def _reduce_7(val, _values, result) # reduce 23 omitted -module_eval(<<'.,.,', 'grammar.y', 86) +module_eval(<<'.,.,', 'grammar.y', 85) def _reduce_24(val, _values, result) result = val[1] result end .,., -module_eval(<<'.,.,', 'grammar.y', 87) +module_eval(<<'.,.,', 'grammar.y', 86) def _reduce_25(val, _values, result) result = Expressions.new result @@ -1512,217 +1502,217 @@ def _reduce_25(val, _values, result) # reduce 27 omitted -module_eval(<<'.,.,', 'grammar.y', 98) +module_eval(<<'.,.,', 'grammar.y', 97) def _reduce_28(val, _values, result) result = LiteralNode.new(val[0]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 99) +module_eval(<<'.,.,', 'grammar.y', 98) def _reduce_29(val, _values, result) result = LiteralNode.new(val[0]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 100) +module_eval(<<'.,.,', 'grammar.y', 99) def _reduce_30(val, _values, result) result = LiteralNode.new(val[0]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 101) +module_eval(<<'.,.,', 'grammar.y', 100) def _reduce_31(val, _values, result) result = LiteralNode.new(val[0]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 102) +module_eval(<<'.,.,', 'grammar.y', 101) def _reduce_32(val, _values, result) result = LiteralNode.new(val[0]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 103) +module_eval(<<'.,.,', 'grammar.y', 102) def _reduce_33(val, _values, result) result = LiteralNode.new(val[0]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 104) +module_eval(<<'.,.,', 'grammar.y', 103) def _reduce_34(val, _values, result) - result = LiteralNode.new(val[0]) + result = LiteralNode.new(Value.new(true)) result end .,., -module_eval(<<'.,.,', 'grammar.y', 105) +module_eval(<<'.,.,', 'grammar.y', 104) def _reduce_35(val, _values, result) - result = LiteralNode.new(Value.new(true)) + result = LiteralNode.new(Value.new(false)) result end .,., -module_eval(<<'.,.,', 'grammar.y', 106) +module_eval(<<'.,.,', 'grammar.y', 105) def _reduce_36(val, _values, result) - result = LiteralNode.new(Value.new(false)) + result = LiteralNode.new(Value.new(true)) result end .,., -module_eval(<<'.,.,', 'grammar.y', 107) +module_eval(<<'.,.,', 'grammar.y', 106) def _reduce_37(val, _values, result) - result = LiteralNode.new(Value.new(true)) + result = LiteralNode.new(Value.new(false)) result end .,., -module_eval(<<'.,.,', 'grammar.y', 108) +module_eval(<<'.,.,', 'grammar.y', 107) def _reduce_38(val, _values, result) - result = LiteralNode.new(Value.new(false)) + result = LiteralNode.new(Value.new(true)) result end .,., -module_eval(<<'.,.,', 'grammar.y', 109) +module_eval(<<'.,.,', 'grammar.y', 108) def _reduce_39(val, _values, result) - result = LiteralNode.new(Value.new(true)) + result = LiteralNode.new(Value.new(false)) result end .,., -module_eval(<<'.,.,', 'grammar.y', 110) +module_eval(<<'.,.,', 'grammar.y', 113) def _reduce_40(val, _values, result) - result = LiteralNode.new(Value.new(false)) + result = AssignNode.new(val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 115) +module_eval(<<'.,.,', 'grammar.y', 118) def _reduce_41(val, _values, result) - result = AssignNode.new(val[0], val[2]) + result = AssignNode.new(ValueNode.new(val[0]), val[2], :object) result end .,., -module_eval(<<'.,.,', 'grammar.y', 120) +module_eval(<<'.,.,', 'grammar.y', 119) def _reduce_42(val, _values, result) - result = AssignNode.new(ValueNode.new(val[0]), val[2], :object) + result = AssignNode.new(ValueNode.new(LiteralNode.new(val[0])), val[2], :object) result end .,., -module_eval(<<'.,.,', 'grammar.y', 121) +module_eval(<<'.,.,', 'grammar.y', 120) def _reduce_43(val, _values, result) - result = AssignNode.new(ValueNode.new(LiteralNode.new(val[0])), val[2], :object) + result = val[0] result end .,., -module_eval(<<'.,.,', 'grammar.y', 122) +module_eval(<<'.,.,', 'grammar.y', 125) def _reduce_44(val, _values, result) - result = val[0] + result = ReturnNode.new(val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 127) +module_eval(<<'.,.,', 'grammar.y', 126) def _reduce_45(val, _values, result) - result = ReturnNode.new(val[1]) + result = ReturnNode.new(ValueNode.new(Value.new('null'))) result end .,., -module_eval(<<'.,.,', 'grammar.y', 128) +module_eval(<<'.,.,', 'grammar.y', 131) def _reduce_46(val, _values, result) - result = ReturnNode.new(ValueNode.new(Value.new('null'))) + result = CommentNode.new(val[0]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 133) +module_eval(<<'.,.,', 'grammar.y', 138) def _reduce_47(val, _values, result) - result = CommentNode.new(val[0]) + result = OpNode.new(val[0], val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 140) +module_eval(<<'.,.,', 'grammar.y', 139) def _reduce_48(val, _values, result) result = OpNode.new(val[0], val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 141) +module_eval(<<'.,.,', 'grammar.y', 140) def _reduce_49(val, _values, result) result = OpNode.new(val[0], val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 142) +module_eval(<<'.,.,', 'grammar.y', 141) def _reduce_50(val, _values, result) result = OpNode.new(val[0], val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 143) +module_eval(<<'.,.,', 'grammar.y', 142) def _reduce_51(val, _values, result) result = OpNode.new(val[0], val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 144) +module_eval(<<'.,.,', 'grammar.y', 143) def _reduce_52(val, _values, result) result = OpNode.new(val[0], val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 145) +module_eval(<<'.,.,', 'grammar.y', 144) def _reduce_53(val, _values, result) result = OpNode.new(val[0], val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 146) +module_eval(<<'.,.,', 'grammar.y', 145) def _reduce_54(val, _values, result) result = OpNode.new(val[0], val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 147) +module_eval(<<'.,.,', 'grammar.y', 146) def _reduce_55(val, _values, result) result = OpNode.new(val[0], val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 148) +module_eval(<<'.,.,', 'grammar.y', 147) def _reduce_56(val, _values, result) result = OpNode.new(val[0], val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 149) +module_eval(<<'.,.,', 'grammar.y', 148) def _reduce_57(val, _values, result) - result = OpNode.new(val[0], val[1]) + result = OpNode.new(val[1], val[0], nil, true) result end .,., -module_eval(<<'.,.,', 'grammar.y', 150) +module_eval(<<'.,.,', 'grammar.y', 149) def _reduce_58(val, _values, result) result = OpNode.new(val[1], val[0], nil, true) result @@ -1731,19 +1721,19 @@ def _reduce_58(val, _values, result) module_eval(<<'.,.,', 'grammar.y', 151) def _reduce_59(val, _values, result) - result = OpNode.new(val[1], val[0], nil, true) + result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 153) +module_eval(<<'.,.,', 'grammar.y', 152) def _reduce_60(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 154) +module_eval(<<'.,.,', 'grammar.y', 153) def _reduce_61(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result @@ -1757,7 +1747,7 @@ def _reduce_62(val, _values, result) end .,., -module_eval(<<'.,.,', 'grammar.y', 157) +module_eval(<<'.,.,', 'grammar.y', 156) def _reduce_63(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result @@ -1771,14 +1761,14 @@ def _reduce_64(val, _values, result) end .,., -module_eval(<<'.,.,', 'grammar.y', 160) +module_eval(<<'.,.,', 'grammar.y', 159) def _reduce_65(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 161) +module_eval(<<'.,.,', 'grammar.y', 160) def _reduce_66(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result @@ -1792,14 +1782,14 @@ def _reduce_67(val, _values, result) end .,., -module_eval(<<'.,.,', 'grammar.y', 164) +module_eval(<<'.,.,', 'grammar.y', 163) def _reduce_68(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 165) +module_eval(<<'.,.,', 'grammar.y', 164) def _reduce_69(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result @@ -1813,21 +1803,21 @@ def _reduce_70(val, _values, result) end .,., -module_eval(<<'.,.,', 'grammar.y', 168) +module_eval(<<'.,.,', 'grammar.y', 167) def _reduce_71(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 169) +module_eval(<<'.,.,', 'grammar.y', 168) def _reduce_72(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 170) +module_eval(<<'.,.,', 'grammar.y', 169) def _reduce_73(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result @@ -1841,21 +1831,21 @@ def _reduce_74(val, _values, result) end .,., -module_eval(<<'.,.,', 'grammar.y', 173) +module_eval(<<'.,.,', 'grammar.y', 172) def _reduce_75(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 174) +module_eval(<<'.,.,', 'grammar.y', 173) def _reduce_76(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 175) +module_eval(<<'.,.,', 'grammar.y', 174) def _reduce_77(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result @@ -1869,28 +1859,28 @@ def _reduce_78(val, _values, result) end .,., -module_eval(<<'.,.,', 'grammar.y', 178) +module_eval(<<'.,.,', 'grammar.y', 177) def _reduce_79(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 179) +module_eval(<<'.,.,', 'grammar.y', 178) def _reduce_80(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 180) +module_eval(<<'.,.,', 'grammar.y', 179) def _reduce_81(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 181) +module_eval(<<'.,.,', 'grammar.y', 180) def _reduce_82(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result @@ -1904,49 +1894,49 @@ def _reduce_83(val, _values, result) end .,., -module_eval(<<'.,.,', 'grammar.y', 184) +module_eval(<<'.,.,', 'grammar.y', 183) def _reduce_84(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 185) +module_eval(<<'.,.,', 'grammar.y', 184) def _reduce_85(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 186) +module_eval(<<'.,.,', 'grammar.y', 185) def _reduce_86(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 187) +module_eval(<<'.,.,', 'grammar.y', 186) def _reduce_87(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 188) +module_eval(<<'.,.,', 'grammar.y', 187) def _reduce_88(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 189) +module_eval(<<'.,.,', 'grammar.y', 188) def _reduce_89(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 190) +module_eval(<<'.,.,', 'grammar.y', 189) def _reduce_90(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result @@ -1960,212 +1950,212 @@ def _reduce_91(val, _values, result) end .,., -module_eval(<<'.,.,', 'grammar.y', 193) +module_eval(<<'.,.,', 'grammar.y', 192) def _reduce_92(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 194) +module_eval(<<'.,.,', 'grammar.y', 197) def _reduce_93(val, _values, result) - result = OpNode.new(val[1], val[0], val[2]) + result = ExistenceNode.new(val[0]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 199) +module_eval(<<'.,.,', 'grammar.y', 203) def _reduce_94(val, _values, result) - result = ExistenceNode.new(val[0]) + result = CodeNode.new(val[1], val[4], val[3]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 205) +module_eval(<<'.,.,', 'grammar.y', 204) def _reduce_95(val, _values, result) - result = CodeNode.new(val[1], val[4], val[3]) + result = CodeNode.new([], val[1], val[0]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 206) +module_eval(<<'.,.,', 'grammar.y', 209) def _reduce_96(val, _values, result) - result = CodeNode.new([], val[1], val[0]) + result = :func result end .,., -module_eval(<<'.,.,', 'grammar.y', 211) +module_eval(<<'.,.,', 'grammar.y', 210) def _reduce_97(val, _values, result) - result = :func + result = :boundfunc result end .,., -module_eval(<<'.,.,', 'grammar.y', 212) +module_eval(<<'.,.,', 'grammar.y', 215) def _reduce_98(val, _values, result) - result = :boundfunc + result = val result end .,., -module_eval(<<'.,.,', 'grammar.y', 217) +module_eval(<<'.,.,', 'grammar.y', 216) def _reduce_99(val, _values, result) - result = val + result = val[0] << val[2] result end .,., -module_eval(<<'.,.,', 'grammar.y', 218) - def _reduce_100(val, _values, result) - result = val[0] << val[2] +# reduce 100 omitted + +module_eval(<<'.,.,', 'grammar.y', 222) + def _reduce_101(val, _values, result) + result = SplatNode.new(val[0]) result end .,., -# reduce 101 omitted - -module_eval(<<'.,.,', 'grammar.y', 224) +module_eval(<<'.,.,', 'grammar.y', 227) def _reduce_102(val, _values, result) result = SplatNode.new(val[0]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 229) +module_eval(<<'.,.,', 'grammar.y', 232) def _reduce_103(val, _values, result) - result = SplatNode.new(val[0]) + result = ValueNode.new(val[0]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 234) +module_eval(<<'.,.,', 'grammar.y', 233) def _reduce_104(val, _values, result) result = ValueNode.new(val[0]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 235) +module_eval(<<'.,.,', 'grammar.y', 234) def _reduce_105(val, _values, result) result = ValueNode.new(val[0]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 236) +module_eval(<<'.,.,', 'grammar.y', 235) def _reduce_106(val, _values, result) result = ValueNode.new(val[0]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 237) +module_eval(<<'.,.,', 'grammar.y', 236) def _reduce_107(val, _values, result) result = ValueNode.new(val[0]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 238) +module_eval(<<'.,.,', 'grammar.y', 237) def _reduce_108(val, _values, result) result = ValueNode.new(val[0]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 239) +module_eval(<<'.,.,', 'grammar.y', 238) def _reduce_109(val, _values, result) result = ValueNode.new(val[0]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 240) +module_eval(<<'.,.,', 'grammar.y', 239) def _reduce_110(val, _values, result) - result = ValueNode.new(val[0]) + result = val[0] << val[1] result end .,., -module_eval(<<'.,.,', 'grammar.y', 241) +module_eval(<<'.,.,', 'grammar.y', 240) def _reduce_111(val, _values, result) - result = val[0] << val[1] + result = ValueNode.new(val[0], [val[1]]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 242) +module_eval(<<'.,.,', 'grammar.y', 245) def _reduce_112(val, _values, result) - result = ValueNode.new(val[0], [val[1]]) + result = AccessorNode.new(val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 247) +module_eval(<<'.,.,', 'grammar.y', 246) def _reduce_113(val, _values, result) - result = AccessorNode.new(val[1]) + result = AccessorNode.new(val[1], :prototype) result end .,., -module_eval(<<'.,.,', 'grammar.y', 248) +module_eval(<<'.,.,', 'grammar.y', 247) def _reduce_114(val, _values, result) - result = AccessorNode.new(val[1], :prototype) + result = AccessorNode.new(val[1], :soak) result end .,., -module_eval(<<'.,.,', 'grammar.y', 249) +module_eval(<<'.,.,', 'grammar.y', 248) def _reduce_115(val, _values, result) - result = AccessorNode.new(val[1], :soak) + result = val[0] result end .,., -module_eval(<<'.,.,', 'grammar.y', 250) +module_eval(<<'.,.,', 'grammar.y', 249) def _reduce_116(val, _values, result) - result = val[0] + result = SliceNode.new(val[0]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 251) +module_eval(<<'.,.,', 'grammar.y', 254) def _reduce_117(val, _values, result) - result = SliceNode.new(val[0]) + result = IndexNode.new(val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 256) +module_eval(<<'.,.,', 'grammar.y', 259) def _reduce_118(val, _values, result) - result = IndexNode.new(val[1]) + result = ObjectNode.new(val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 261) +module_eval(<<'.,.,', 'grammar.y', 264) def _reduce_119(val, _values, result) - result = ObjectNode.new(val[1]) + result = [] result end .,., -module_eval(<<'.,.,', 'grammar.y', 266) +module_eval(<<'.,.,', 'grammar.y', 265) def _reduce_120(val, _values, result) - result = [] + result = val result end .,., -module_eval(<<'.,.,', 'grammar.y', 267) +module_eval(<<'.,.,', 'grammar.y', 266) def _reduce_121(val, _values, result) - result = val + result = val[0] << val[2] result end .,., -module_eval(<<'.,.,', 'grammar.y', 268) +module_eval(<<'.,.,', 'grammar.y', 267) def _reduce_122(val, _values, result) result = val[0] << val[2] result @@ -2174,343 +2164,343 @@ def _reduce_122(val, _values, result) module_eval(<<'.,.,', 'grammar.y', 269) def _reduce_123(val, _values, result) - result = val[0] << val[2] + result = val[0] << val[3] result end .,., -module_eval(<<'.,.,', 'grammar.y', 271) +module_eval(<<'.,.,', 'grammar.y', 270) def _reduce_124(val, _values, result) - result = val[0] << val[3] + result = val[1] result end .,., -module_eval(<<'.,.,', 'grammar.y', 272) +module_eval(<<'.,.,', 'grammar.y', 275) def _reduce_125(val, _values, result) - result = val[1] + result = val[0] result end .,., -module_eval(<<'.,.,', 'grammar.y', 277) +module_eval(<<'.,.,', 'grammar.y', 276) def _reduce_126(val, _values, result) - result = val[0] + result = val[1].new_instance result end .,., -module_eval(<<'.,.,', 'grammar.y', 278) +module_eval(<<'.,.,', 'grammar.y', 277) def _reduce_127(val, _values, result) - result = val[1].new_instance + result = val[0] result end .,., -module_eval(<<'.,.,', 'grammar.y', 279) +module_eval(<<'.,.,', 'grammar.y', 282) def _reduce_128(val, _values, result) - result = val[0] + result = ExtendsNode.new(val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 284) +module_eval(<<'.,.,', 'grammar.y', 287) def _reduce_129(val, _values, result) - result = ExtendsNode.new(val[0], val[2]) + result = CallNode.new(val[0], val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 289) +module_eval(<<'.,.,', 'grammar.y', 288) def _reduce_130(val, _values, result) result = CallNode.new(val[0], val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 290) +module_eval(<<'.,.,', 'grammar.y', 293) def _reduce_131(val, _values, result) - result = CallNode.new(val[0], val[1]) + result = val[1] result end .,., -module_eval(<<'.,.,', 'grammar.y', 295) +module_eval(<<'.,.,', 'grammar.y', 298) def _reduce_132(val, _values, result) - result = val[1] + result = CallNode.new(Value.new('super'), val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 300) +module_eval(<<'.,.,', 'grammar.y', 303) def _reduce_133(val, _values, result) - result = CallNode.new(Value.new('super'), val[2]) + result = ThisNode.new result end .,., -module_eval(<<'.,.,', 'grammar.y', 305) +module_eval(<<'.,.,', 'grammar.y', 304) def _reduce_134(val, _values, result) - result = ThisNode.new + result = ThisNode.new(val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 306) +module_eval(<<'.,.,', 'grammar.y', 310) def _reduce_135(val, _values, result) - result = ThisNode.new(val[1]) + result = RangeNode.new(val[1], val[4]) result end .,., module_eval(<<'.,.,', 'grammar.y', 312) def _reduce_136(val, _values, result) - result = RangeNode.new(val[1], val[4]) + result = RangeNode.new(val[1], val[5], true) result end .,., -module_eval(<<'.,.,', 'grammar.y', 314) +module_eval(<<'.,.,', 'grammar.y', 318) def _reduce_137(val, _values, result) - result = RangeNode.new(val[1], val[5], true) + result = RangeNode.new(val[1], val[4]) result end .,., module_eval(<<'.,.,', 'grammar.y', 320) def _reduce_138(val, _values, result) - result = RangeNode.new(val[1], val[4]) + result = RangeNode.new(val[1], val[5], true) result end .,., -module_eval(<<'.,.,', 'grammar.y', 322) +module_eval(<<'.,.,', 'grammar.y', 325) def _reduce_139(val, _values, result) - result = RangeNode.new(val[1], val[5], true) + result = ArrayNode.new(val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 327) +module_eval(<<'.,.,', 'grammar.y', 330) def _reduce_140(val, _values, result) - result = ArrayNode.new(val[1]) + result = [] result end .,., -module_eval(<<'.,.,', 'grammar.y', 332) +module_eval(<<'.,.,', 'grammar.y', 331) def _reduce_141(val, _values, result) - result = [] + result = val result end .,., -module_eval(<<'.,.,', 'grammar.y', 333) +module_eval(<<'.,.,', 'grammar.y', 332) def _reduce_142(val, _values, result) - result = val + result = [val[1]] result end .,., -module_eval(<<'.,.,', 'grammar.y', 334) +module_eval(<<'.,.,', 'grammar.y', 333) def _reduce_143(val, _values, result) - result = [val[1]] + result = val[0] << val[2] result end .,., -module_eval(<<'.,.,', 'grammar.y', 335) +module_eval(<<'.,.,', 'grammar.y', 334) def _reduce_144(val, _values, result) result = val[0] << val[2] result end .,., -module_eval(<<'.,.,', 'grammar.y', 336) +module_eval(<<'.,.,', 'grammar.y', 335) def _reduce_145(val, _values, result) - result = val[0] << val[2] + result = val[0] << val[3] result end .,., -module_eval(<<'.,.,', 'grammar.y', 337) +module_eval(<<'.,.,', 'grammar.y', 336) def _reduce_146(val, _values, result) result = val[0] << val[3] result end .,., -module_eval(<<'.,.,', 'grammar.y', 338) +module_eval(<<'.,.,', 'grammar.y', 337) def _reduce_147(val, _values, result) - result = val[0] << val[3] + result = val[0] result end .,., -module_eval(<<'.,.,', 'grammar.y', 339) +module_eval(<<'.,.,', 'grammar.y', 342) def _reduce_148(val, _values, result) result = val[0] result end .,., -module_eval(<<'.,.,', 'grammar.y', 344) +module_eval(<<'.,.,', 'grammar.y', 343) def _reduce_149(val, _values, result) - result = val[0] + result = ([val[0]] << val[2]).flatten result end .,., -module_eval(<<'.,.,', 'grammar.y', 345) +module_eval(<<'.,.,', 'grammar.y', 348) def _reduce_150(val, _values, result) - result = ([val[0]] << val[2]).flatten + result = TryNode.new(val[1], val[2][0], val[2][1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 350) +module_eval(<<'.,.,', 'grammar.y', 349) def _reduce_151(val, _values, result) - result = TryNode.new(val[1], val[2][0], val[2][1]) + result = TryNode.new(val[1], nil, nil, val[3]) result end .,., module_eval(<<'.,.,', 'grammar.y', 351) def _reduce_152(val, _values, result) - result = TryNode.new(val[1], nil, nil, val[3]) + result = TryNode.new(val[1], val[2][0], val[2][1], val[4]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 353) +module_eval(<<'.,.,', 'grammar.y', 356) def _reduce_153(val, _values, result) - result = TryNode.new(val[1], val[2][0], val[2][1], val[4]) + result = [val[1], val[2]] result end .,., -module_eval(<<'.,.,', 'grammar.y', 358) +module_eval(<<'.,.,', 'grammar.y', 361) def _reduce_154(val, _values, result) - result = [val[1], val[2]] + result = ThrowNode.new(val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 363) +module_eval(<<'.,.,', 'grammar.y', 366) def _reduce_155(val, _values, result) - result = ThrowNode.new(val[1]) + result = ParentheticalNode.new(val[1], val[0].line) result end .,., -module_eval(<<'.,.,', 'grammar.y', 368) +module_eval(<<'.,.,', 'grammar.y', 371) def _reduce_156(val, _values, result) - result = ParentheticalNode.new(val[1], val[0].line) + result = WhileNode.new(val[1], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 373) +module_eval(<<'.,.,', 'grammar.y', 372) def _reduce_157(val, _values, result) - result = WhileNode.new(val[1], val[2]) + result = WhileNode.new(val[1], nil) result end .,., -module_eval(<<'.,.,', 'grammar.y', 374) +module_eval(<<'.,.,', 'grammar.y', 373) def _reduce_158(val, _values, result) - result = WhileNode.new(val[1], nil) + result = WhileNode.new(val[2], Expressions.wrap(val[0])) result end .,., -module_eval(<<'.,.,', 'grammar.y', 375) +module_eval(<<'.,.,', 'grammar.y', 380) def _reduce_159(val, _values, result) - result = WhileNode.new(val[2], Expressions.wrap(val[0])) + result = ForNode.new(val[0], val[3], val[2][0], val[2][1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 382) +module_eval(<<'.,.,', 'grammar.y', 381) def _reduce_160(val, _values, result) - result = ForNode.new(val[0], val[3], val[2][0], val[2][1]) + result = ForNode.new(val[3], val[2], val[1][0], val[1][1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 383) +module_eval(<<'.,.,', 'grammar.y', 386) def _reduce_161(val, _values, result) - result = ForNode.new(val[3], val[2], val[1][0], val[1][1]) + result = val result end .,., -module_eval(<<'.,.,', 'grammar.y', 388) +module_eval(<<'.,.,', 'grammar.y', 387) def _reduce_162(val, _values, result) - result = val + result = [val[0], val[2]] result end .,., -module_eval(<<'.,.,', 'grammar.y', 389) +module_eval(<<'.,.,', 'grammar.y', 392) def _reduce_163(val, _values, result) - result = [val[0], val[2]] + result = {:source => val[1]} result end .,., -module_eval(<<'.,.,', 'grammar.y', 394) +module_eval(<<'.,.,', 'grammar.y', 393) def _reduce_164(val, _values, result) - result = {:source => val[1]} + result = {:source => val[1], :object => true} result end .,., module_eval(<<'.,.,', 'grammar.y', 395) def _reduce_165(val, _values, result) - result = {:source => val[1], :object => true} + result = val[0].merge(:filter => val[2]) result end .,., module_eval(<<'.,.,', 'grammar.y', 397) def _reduce_166(val, _values, result) - result = val[0].merge(:filter => val[2]) + result = val[0].merge(:step => val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 399) +module_eval(<<'.,.,', 'grammar.y', 403) def _reduce_167(val, _values, result) - result = val[0].merge(:step => val[2]) + result = val[3].rewrite_condition(val[1]) result end .,., module_eval(<<'.,.,', 'grammar.y', 405) def _reduce_168(val, _values, result) - result = val[3].rewrite_condition(val[1]) + result = val[3].rewrite_condition(val[1]).add_else(val[5]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 407) +module_eval(<<'.,.,', 'grammar.y', 410) def _reduce_169(val, _values, result) - result = val[3].rewrite_condition(val[1]).add_else(val[5]) + result = val[0] result end .,., -module_eval(<<'.,.,', 'grammar.y', 412) +module_eval(<<'.,.,', 'grammar.y', 411) def _reduce_170(val, _values, result) - result = val[0] + result = val[0] << val[1] result end .,., -module_eval(<<'.,.,', 'grammar.y', 413) +module_eval(<<'.,.,', 'grammar.y', 416) def _reduce_171(val, _values, result) - result = val[0] << val[1] + result = IfNode.new(val[1], val[2], nil, {:statement => true}) result end .,., @@ -2522,92 +2512,85 @@ def _reduce_172(val, _values, result) end .,., -module_eval(<<'.,.,', 'grammar.y', 420) +module_eval(<<'.,.,', 'grammar.y', 419) def _reduce_173(val, _values, result) - result = IfNode.new(val[1], val[2], nil, {:statement => true}) + result = val[2].add_comment(val[0]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 421) +module_eval(<<'.,.,', 'grammar.y', 424) def _reduce_174(val, _values, result) - result = val[2].add_comment(val[0]) + result = IfNode.new(val[1], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 426) +module_eval(<<'.,.,', 'grammar.y', 429) def _reduce_175(val, _values, result) - result = IfNode.new(val[1], val[2]) + result = val[1].force_statement result end .,., -module_eval(<<'.,.,', 'grammar.y', 431) +module_eval(<<'.,.,', 'grammar.y', 434) def _reduce_176(val, _values, result) - result = val[1].force_statement + result = val[0] result end .,., -module_eval(<<'.,.,', 'grammar.y', 436) +module_eval(<<'.,.,', 'grammar.y', 435) def _reduce_177(val, _values, result) - result = val[0] + result = val[0].add_else(val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 437) +module_eval(<<'.,.,', 'grammar.y', 440) def _reduce_178(val, _values, result) - result = val[0].add_else(val[1]) + result = nil result end .,., -module_eval(<<'.,.,', 'grammar.y', 442) +module_eval(<<'.,.,', 'grammar.y', 441) def _reduce_179(val, _values, result) - result = nil + result = val[1] result end .,., -module_eval(<<'.,.,', 'grammar.y', 443) +module_eval(<<'.,.,', 'grammar.y', 446) def _reduce_180(val, _values, result) - result = val[1] + result = val[0] result end .,., -module_eval(<<'.,.,', 'grammar.y', 448) +module_eval(<<'.,.,', 'grammar.y', 447) def _reduce_181(val, _values, result) - result = val[0] + result = val[0].add_else(val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 449) +module_eval(<<'.,.,', 'grammar.y', 452) def _reduce_182(val, _values, result) result = val[0].add_else(val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 454) +module_eval(<<'.,.,', 'grammar.y', 453) def _reduce_183(val, _values, result) - result = val[0].add_else(val[1]) - result - end -.,., - -module_eval(<<'.,.,', 'grammar.y', 455) - def _reduce_184(val, _values, result) result = IfNode.new(val[2], Expressions.wrap(val[0]), nil, {:statement => true}) result end .,., -module_eval(<<'.,.,', 'grammar.y', 456) - def _reduce_185(val, _values, result) +module_eval(<<'.,.,', 'grammar.y', 454) + def _reduce_184(val, _values, result) result = IfNode.new(val[2], Expressions.wrap(val[0]), nil, {:statement => true, :invert => true}) result end diff --git a/lib/coffee_script/rewriter.rb b/lib/coffee_script/rewriter.rb index 287d11c24a..d3e303477d 100644 --- a/lib/coffee_script/rewriter.rb +++ b/lib/coffee_script/rewriter.rb @@ -22,9 +22,9 @@ class Rewriter IMPLICIT_FUNC = [:IDENTIFIER, :SUPER, ')', :CALL_END, ']', :INDEX_END] IMPLICIT_END = [:IF, :UNLESS, :FOR, :WHILE, "\n", :OUTDENT] IMPLICIT_CALL = [:IDENTIFIER, :NUMBER, :STRING, :JS, :REGEX, :NEW, :PARAM_START, - :TRY, :DELETE, :TYPEOF, :SWITCH, :ARGUMENTS, + :TRY, :DELETE, :TYPEOF, :SWITCH, :TRUE, :FALSE, :YES, :NO, :ON, :OFF, '!', '!!', :NOT, - '->', '=>', '[', '(', '{'] + '@', '->', '=>', '[', '(', '{'] # The inverse mappings of token pairs we're trying to fix up. INVERSES = BALANCED_PAIRS.inject({}) do |memo, pair| diff --git a/test/fixtures/execution/test_arguments.coffee b/test/fixtures/execution/test_arguments.coffee index 71a6c9c763..de23c445af 100644 --- a/test/fixtures/execution/test_arguments.coffee +++ b/test/fixtures/execution/test_arguments.coffee @@ -30,3 +30,8 @@ func: -> arguments print func(100) is 25 + + +# Arguments can be accessed as a property. +this.arguments: 10 +print @arguments is 10 From 0a1873dc42e4e4def664a41d7db80371ccd40518 Mon Sep 17 00:00:00 2001 From: Jeremy Ashkenas Date: Fri, 5 Feb 2010 22:39:39 -0500 Subject: [PATCH 30/37] adding assign and return like they should have been --- lib/coffee_script/grammar.y | 1 + lib/coffee_script/parser.rb | 2074 ++++++++++++++++++----------------- 2 files changed, 1039 insertions(+), 1036 deletions(-) diff --git a/lib/coffee_script/grammar.y b/lib/coffee_script/grammar.y index 8808d9fc53..5f841374fb 100644 --- a/lib/coffee_script/grammar.y +++ b/lib/coffee_script/grammar.y @@ -13,6 +13,7 @@ token FOR IN OF BY WHEN WHILE token SWITCH LEADING_WHEN token DELETE INSTANCEOF TYPEOF token SUPER EXTENDS +token ASSIGN RETURN token NEWLINE token COMMENT token JS diff --git a/lib/coffee_script/parser.rb b/lib/coffee_script/parser.rb index f0ba032bd3..d66a470b6b 100644 --- a/lib/coffee_script/parser.rb +++ b/lib/coffee_script/parser.rb @@ -10,7 +10,7 @@ module CoffeeScript class Parser < Racc::Parser -module_eval(<<'...end grammar.y/module_eval...', 'grammar.y', 460) +module_eval(<<'...end grammar.y/module_eval...', 'grammar.y', 461) # Lex and parse a CoffeeScript. def parse(code) # Uncomment the following line to enable grammar debugging, in combination @@ -34,348 +34,350 @@ def on_error(error_token_id, error_value, value_stack) ##### State transition tables begin ### clist = [ -'134,54,143,27,30,33,38,42,45,51,56,60,63,102,103,104,181,247,102,103', -'104,262,100,270,101,286,287,100,46,101,57,64,130,135,102,103,104,151', -'54,262,299,164,123,100,170,101,46,49,280,199,8,14,190,123,188,185,142', -'147,150,154,157,159,161,167,129,133,138,141,146,149,153,156,160,163', -'166,128,132,137,140,145,148,152,155,158,162,165,127,131,136,139,144', -'171,12,180,8,14,201,25,278,31,34,12,40,204,27,30,33,38,42,45,51,56,60', -'63,199,54,8,14,2,54,96,20,24,54,199,54,96,41,93,293,52,57,64,65,93,265', -'187,96,7,13,54,21,209,32,35,93,282,46,49,142,147,72,3,67,71,74,5,10', -'16,8,14,201,46,311,37,44,198,262,46,8,14,201,142,147,46,119,96,294,54', -'46,8,14,190,96,93,-185,-185,8,14,-185,-185,93,290,72,3,212,213,54,25', -'54,31,34,12,40,194,27,30,33,38,42,45,51,56,60,63,195,8,14,46,2,94,113', -'20,24,196,46,279,94,41,8,14,52,57,64,65,-185,-185,-185,-185,7,13,108', -'21,277,32,35,142,147,46,49,78,102,103,104,67,71,74,5,10,16,100,257,101', -'206,207,37,44,142,147,150,154,157,159,161,167,129,133,138,141,146,149', -'153,156,160,163,166,128,132,137,140,212,213,-185,-185,72,3,-185,-185', -'316,25,179,31,34,12,40,208,27,30,33,38,42,45,51,56,60,63,102,103,104', -'81,2,286,287,20,24,100,211,101,78,41,8,14,52,57,64,65,142,147,-185,-185', -'7,13,81,21,289,32,35,-185,-185,46,49,,102,103,104,67,71,74,5,10,16,100', -',101,8,14,37,44,142,147,150,154,157,159,161,167,129,133,138,141,146', -'149,153,156,160,163,166,128,132,137,140,,,,,72,3,,,,25,,31,34,12,40', -',27,30,33,38,42,45,51,56,60,63,,,,,2,,,20,24,,,,,41,,,52,57,64,65,,', -',,7,13,,21,,32,35,,,46,49,,,,,67,71,74,5,10,16,,,,,,37,44,142,147,150', -'154,157,159,161,167,129,133,138,141,146,149,153,156,160,163,166,128', -'132,137,140,,,,,72,3,,,,25,,31,34,12,40,,27,30,33,38,42,45,51,56,60', -'63,,,,,2,,,20,24,,,,,41,,,52,57,64,65,,,,,7,13,,21,,32,35,,,46,49,,', -',,67,71,74,5,10,16,,,,,,37,44,142,147,150,154,157,159,161,167,129,133', -'138,141,146,149,153,156,160,163,166,128,132,137,140,,,,,72,3,,,,25,', -'31,34,12,40,,27,30,33,38,42,45,51,56,60,63,,,,,2,,,20,24,,,,,41,,,52', -'57,64,65,,,,,7,13,,21,,32,35,,,46,49,,,,,67,71,74,5,10,16,,,,,,37,44', -'142,147,150,154,157,159,161,167,129,133,138,141,146,149,153,156,160', -'163,166,128,132,137,140,,,,,72,3,,,,25,,31,34,12,40,,27,30,33,38,42', -'45,51,56,60,63,,,,,2,,,20,24,,,,,41,,,52,57,64,65,,,,,7,13,,21,,32,35', -',,46,49,,,,,67,71,74,5,10,16,,,,,,37,44,142,147,150,154,157,159,161', -'167,129,133,138,141,146,149,153,156,160,163,166,128,132,137,140,,,,', -'72,3,,,,25,,31,34,12,40,,27,30,33,38,42,45,51,56,60,63,,,,,2,,,20,24', -',,,,41,,,52,57,64,65,,,,,7,13,,21,,32,35,,,46,49,,,,,67,71,74,5,10,16', -',,,,,37,44,142,147,150,154,157,159,161,167,129,133,138,141,146,149,153', -'156,160,163,166,128,132,137,140,,,,,72,3,,,,25,,31,34,12,40,,27,30,33', -'38,42,45,51,56,60,63,,,,,2,,,20,24,,,,,41,,,52,57,64,65,,,,,7,13,,21', -',32,35,,,46,49,,,,,67,71,74,5,10,16,,,,,,37,44,142,147,150,154,157,159', -'161,167,129,133,138,141,146,149,153,156,160,163,166,128,132,137,140', -',,,,72,3,,,,25,,31,34,12,40,,27,30,33,38,42,45,51,56,60,63,,,,,2,,,20', -'24,,,,,41,,,52,57,64,65,,,,,7,13,,21,,32,35,,,46,49,,,,,67,71,74,5,10', -'16,,,,,,37,44,142,147,150,154,157,159,161,167,129,133,138,141,146,149', -'153,142,147,150,154,157,159,161,167,129,,,,72,3,,,,25,,31,34,12,40,', -'27,30,33,38,42,45,51,56,60,63,,,,,2,,,20,24,,,,,41,,,52,57,64,65,,,', -',7,13,,21,,32,35,,,46,49,,,,,67,71,74,5,10,16,,,,,,37,44,142,147,150', -'154,157,159,161,167,129,133,138,141,146,149,153,142,147,150,154,157', -'159,161,167,129,,,,72,3,,,,25,,31,34,12,40,,27,30,33,38,42,45,51,56', -'60,63,,,,,2,,,20,24,,,,,41,,,52,57,64,65,,,,,7,13,,21,,32,35,,,46,49', -',,,,67,71,74,5,10,16,,,,,,37,44,142,147,150,154,157,159,161,167,129', -'133,138,141,146,149,153,142,147,150,154,157,159,161,167,129,,,,72,3', -',,,25,,31,34,12,40,,27,30,33,38,42,45,51,56,60,63,,,,,2,,,20,24,,,,', -'41,,,52,57,64,65,,,,,7,13,,21,,32,35,,,46,49,,,,,67,71,74,5,10,16,,', -',,,37,44,142,147,150,154,157,159,161,167,129,133,138,141,146,149,153', -'142,147,150,154,157,159,161,167,129,,,,72,3,,,,25,,31,34,12,40,,27,30', -'33,38,42,45,51,56,60,63,,,,,2,,,20,24,,,,,41,,,52,57,64,65,,,,,7,13', -',21,,32,35,,,46,49,,,,,67,71,74,5,10,16,,,,,,37,44,142,147,150,154,157', -'159,161,167,129,142,147,150,154,157,159,161,167,129,142,147,150,154', -'157,159,161,,,72,3,,,,25,,31,34,12,40,,27,30,33,38,42,45,51,56,60,63', -',,,,2,,,20,24,,,,,41,,,52,57,64,65,,,,,7,13,,21,,32,35,,,46,49,,,,,67', -'71,74,5,10,16,,,,,,37,44,142,147,150,154,157,159,161,,,,,,,,,,,,,,,', -',,,,,72,3,,,,25,,31,34,12,40,,27,30,33,38,42,45,51,56,60,63,,,,,2,,', -'20,24,,,,,41,,,52,57,64,65,,,,,7,13,,21,,32,35,,,46,49,110,,,,67,71', -'74,5,10,16,,,,,,37,44,,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,25,,31,34,12', -'40,,27,30,33,38,42,45,51,56,60,63,,,,,2,,,20,24,,,,,41,,,52,57,64,65', -',,,,7,13,,21,,32,35,,,46,49,,,,,67,71,74,5,10,16,,,,,312,37,44,,,,,', -',,,,,,,,,,,,,,,,,,,,,,72,3,,,,25,,31,34,12,40,,27,30,33,38,42,45,51', -'56,60,63,,,,,2,,,20,24,,,,,41,,,52,57,64,65,,,,,7,13,,21,,32,35,,,46', -'49,,,,,67,71,74,5,10,16,,,,,,37,44,,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,', -',,25,,31,34,12,40,,27,30,33,38,42,45,51,56,60,63,,,,,2,,,20,24,,,,,41', -',,52,57,64,65,,,,,7,13,,21,,32,35,,,46,49,,,,,67,71,74,5,10,16,,,,,', -'37,44,,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,25,,31,34,12,40,,27,30,33,38', -'42,45,51,56,60,63,,,,,2,,,20,24,,,,,41,,,52,57,64,65,,,,,7,13,,21,,32', -'35,,,46,49,,,,,67,71,74,5,10,16,,,,,,37,44,,,,,,,,,,,,,,,,,,,,,,,,,', -',,72,3,,,,25,,31,34,12,40,,27,30,33,38,42,45,51,56,60,63,,,,,2,,,20', -'24,,,,,41,,,52,57,64,65,,,,,7,13,,21,,32,35,,,46,49,,,,,67,71,74,5,10', -'16,,,,,,37,44,,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,25,,31,34,12,40,,27', -'30,33,38,42,45,51,56,60,63,,,,,2,,,20,24,,,,,41,,,52,57,64,65,,,,,7', -'13,,21,,32,35,,,46,49,,,,,67,71,74,5,10,16,,,,,,37,44,,,,,,,,,,,,,,', -',,,,,,,,,,,,,72,3,,,,25,,31,34,12,40,,27,30,33,38,42,45,51,56,60,63', -',,,,2,,,20,24,,,,,41,,,52,57,64,65,,,,,7,13,,21,,32,35,,,46,49,,,,,67', -'71,74,5,10,16,,,,,,37,44,,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,25,,31,34', -'12,40,,27,30,33,38,42,45,51,56,60,63,,,,,2,,,20,24,,,,,41,,,52,57,64', -'65,,,,,7,13,,21,,32,35,,,46,49,,120,,,67,71,74,5,10,16,,,,,,37,44,,', -',,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,25,,31,34,12,40,,27,30,33,38,42,45', -'51,56,60,63,,,,,2,,,20,24,,,,,41,,,52,57,64,65,,,,,7,13,,21,,32,35,', -',46,49,,,,,67,71,74,5,10,16,,,,,302,37,44,,,,,,,,,,,,,,,,,,,,,,,,,,', -',72,3,,,,25,,31,34,12,40,,27,30,33,38,42,45,51,56,60,63,,,,,2,,,20,24', -',,,,41,,,52,57,64,65,,,,,7,13,,21,,32,35,,,46,49,,,,,67,71,74,5,10,16', -',,,,,37,44,,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,25,,31,34,12,40,,27,30', -'33,38,42,45,51,56,60,63,,,,,2,,,20,24,,,,,41,,,52,57,64,65,,,,,7,13', -',21,,32,35,,,46,49,,,,,67,71,74,5,10,16,,,,,,37,44,,,,,,,,,,,,,,,,,', -',,,,,,,,,,72,3,,,,25,,31,34,12,40,,27,30,33,38,42,45,51,56,60,63,,,', -',2,,,20,24,,,,,41,,,52,57,64,65,,,,,7,13,,21,,32,35,,,46,49,,,,,67,71', -'74,5,10,16,,,,,,37,44,,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,25,,31,34,12', -'40,,27,30,33,38,42,45,51,56,60,63,,,,,2,,,20,24,,,,,41,,,52,57,64,65', -',,,,7,13,,21,,32,35,,,46,49,,,,,67,71,74,5,10,16,,,,,,37,44,,,,,,,,', -',,,,,,,,,,,,,,,,,,,72,3,,,,25,,31,34,12,40,,27,30,33,38,42,45,51,56', -'60,63,,,,,2,,,20,24,,,,,41,,,52,57,64,65,,,,,7,13,,21,,32,35,,,46,49', -',,,,67,71,74,5,10,16,,,,,,37,44,,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,25', -',31,34,12,40,,27,30,33,38,42,45,51,56,60,63,,,,,2,,,20,24,,,,,41,,,52', -'57,64,65,,,,,7,13,,21,,32,35,,,46,49,,,,,67,71,74,5,10,16,,,,,,37,44', -',,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,25,,31,34,12,40,,27,30,33,38,42,45', -'51,56,60,63,,,,,2,,,20,24,,,,,41,,,52,57,64,65,,,,,7,13,,21,,32,35,', -',46,49,,,,,67,71,74,5,10,16,,,,,,37,44,,,,,,,,,,,,,,,,,,,,,,,,,,,,72', -'3,,,,25,,31,34,12,40,,27,30,33,38,42,45,51,56,60,63,,,,,2,,,20,24,,', -',,41,,,52,57,64,65,,,,,7,13,,21,,32,35,,,46,49,,,,,67,71,74,5,10,16', -',,,,,37,44,,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,25,,31,34,12,40,,27,30', -'33,38,42,45,51,56,60,63,,,,,2,,,20,24,,,,,41,,,52,57,64,65,,,,,7,13', -',21,,32,35,,,46,49,274,,,,67,71,74,5,10,16,,,,,,37,44,,,,,,,,,,,,,,', -',,,,,,,,,,,,,72,3,8,14,,25,,31,34,12,40,,27,30,33,38,42,45,51,56,60', -'63,,,,,2,,,20,24,,,,,41,,,52,57,64,65,,,,,7,13,,21,,32,35,,,46,49,,', -',,67,71,74,5,10,16,,,,,,37,44,,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,25', -',31,34,12,40,,27,30,33,38,42,45,51,56,60,63,,,,,2,,,20,24,,,,,41,,,52', -'57,64,65,,,,,7,13,,21,,32,35,,,46,49,,,,,67,71,74,5,10,16,,,,,,37,44', -',,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,25,,31,34,12,40,,27,30,33,38,42,45', -'51,56,60,63,,,,,2,,,20,24,,,,,41,,,52,57,64,65,,,,,7,13,,21,,32,35,', -',46,49,,,,,67,71,74,5,10,16,,,,,,37,44,,,,,,,,,,,,,,,,,,,,,,,,,,,,72', -'3,,,,25,,31,34,12,40,,27,30,33,38,42,45,51,56,60,63,,,,,2,,,20,24,,', -',,41,,,52,57,64,65,,,,,7,13,,21,,32,35,,,46,49,,,,,67,71,74,5,10,16', -',,,,,37,44,,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,25,,31,34,12,40,,27,30', -'33,38,42,45,51,56,60,63,,,,,2,,,20,24,,,,,41,,,52,57,64,65,,,,,7,13', -',21,,32,35,,,46,49,,,,,67,71,74,5,10,16,,,,,,37,44,,,,,,,,,,,,,,,,,', -',,,,,,,,,,72,3,,,,25,,31,34,12,40,,27,30,33,38,42,45,51,56,60,63,,,', -',2,,,20,24,,,,,41,,,52,57,64,65,,,,,7,13,,21,,32,35,,,46,49,,,,,67,71', -'74,5,10,16,,,,,,37,44,,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,25,,31,34,12', -'40,,27,30,33,38,42,45,51,56,60,63,,,,,2,,,20,24,,,,,41,,,52,57,64,65', -',,,,7,13,,21,,32,35,,,46,49,,,,,67,71,74,5,10,16,,,,,,37,44,,,,,,,,', -',,,,,,,,,,,,,,,,,,,72,3,,,,25,,31,34,12,40,,27,30,33,38,42,45,51,56', -'60,63,,,,,2,,,20,24,,,,,41,,,52,57,64,65,,,,,7,13,,21,,32,35,,,46,49', -',,,,67,71,74,5,10,16,,,,,,37,44,,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,25', -',31,34,12,40,,27,30,33,38,42,45,51,56,60,63,,,,,2,,,20,24,,,,,41,,,52', -'57,64,65,,,,,7,13,,21,,32,35,,,46,49,,,,,67,71,74,5,10,16,,,,,,37,44', -',,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,25,,31,34,12,40,,27,30,33,38,42,45', -'51,56,60,63,,,,,2,,,20,24,,,,,41,,,52,57,64,65,,,,,7,13,,21,,32,35,', -',46,49,,,,,67,71,74,5,10,16,,,,,,37,44,,,,,,,,,,,,,,,,,,,,,,,,,,,,72', -'3,,,,25,,31,34,12,40,,27,30,33,38,42,45,51,56,60,63,,,,,2,,,20,24,,', -',,41,,,52,57,64,65,,,,,7,13,,21,,32,35,,,46,49,,,,,67,71,74,5,10,16', -',,,,,37,44,,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,25,,31,34,12,40,,27,30', -'33,38,42,45,51,56,60,63,,,,,2,,,20,24,,,,,41,,,52,57,64,65,,,,,7,13', -',21,,32,35,,,46,49,,,,,67,71,74,5,10,16,,,,,,37,44,,,,,,,,,,,,,,,,,', -',,,,,,,,,,72,3,,,,25,,31,34,12,40,,27,30,33,38,42,45,51,56,60,63,,,', -',2,,,20,24,,,,,41,,,52,57,64,65,,,,,7,13,,21,,32,35,,,46,49,,,,,67,71', -'74,5,10,16,,,,,,37,44,,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,25,,31,34,12', -'40,,27,30,33,38,42,45,51,56,60,63,,,,,2,,,20,24,,,,,41,,,52,57,64,65', -',,,,7,13,,21,,32,35,,,46,49,,,,,67,71,74,5,10,16,,,,,,37,44,,,,,,,,', -',,,,,,,,,,,,,,,,,,,72,3,,,,25,,31,34,12,40,,27,30,33,38,42,45,51,56', -'60,63,,,,,2,,,20,24,,,,,41,,,52,57,64,65,,,,,7,13,,21,,32,35,,,46,49', -',,,,67,71,74,5,10,16,,,,,,37,44,,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,25', -',31,34,12,40,,27,30,33,38,42,45,51,56,60,63,,,,,2,,,20,24,,,,,41,,,52', -'57,64,65,,,,,7,13,,21,,32,35,,,46,49,,,,,67,71,74,5,10,16,,,,,,37,44', -',,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,25,,31,34,12,40,,27,30,33,38,42,45', -'51,56,60,63,,,,,2,,,20,24,,,,,41,,,52,57,64,65,,,,,7,13,,21,,32,35,', -',46,49,,,,,67,71,74,5,10,16,,,,,,37,44,,,,,,,,,,,,,,,,,,,,,,,,,,,,72', -'3,,,,25,,31,34,12,40,,27,30,33,38,42,45,51,56,60,63,,,,,2,,,20,24,,', -',,41,,,52,57,64,65,,,,,7,13,,21,,32,35,,,46,49,110,,,,67,71,74,5,10', -'16,,,,,,37,44,,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,25,,31,34,12,40,,27', -'30,33,38,42,45,51,56,60,63,,,,,2,,,20,24,,,,,41,,,52,57,64,65,,,,,7', -'13,,21,,32,35,,,46,49,,,,,67,71,74,5,10,16,,,,,,37,44,,,,,,,,,,,,,,', -',,,,,,,,,,,,,72,3,,,,25,,31,34,12,40,,27,30,33,38,42,45,51,56,60,63', -',,,,2,,,20,24,,,,,41,,,52,57,64,65,,,,,7,13,,21,,32,35,,,46,49,,,,,67', -'71,74,5,10,16,,,,,,37,44,,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,25,,31,34', -'12,40,,27,30,33,38,42,45,51,56,60,63,,,,,2,,,20,24,,,,,41,,,52,57,64', -'65,,,,,7,13,,21,,32,35,,,46,49,,,,,67,71,74,5,10,16,,,,,,37,44,,,,,', -',,,,,,,,,,,,,,,,,,,,,,72,3,,,,25,,31,34,12,40,,27,30,33,38,42,45,51', -'56,60,63,,,,,2,,,20,24,,,,,41,,,52,57,64,65,,,,,7,13,,21,,32,35,,,46', -'49,,,,,67,71,74,5,10,16,,,,,,37,44,,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,', -',,25,,31,34,12,40,,27,30,33,38,42,45,51,56,60,63,,,,,2,,,20,24,,,,,41', -',,52,57,64,65,,,,,7,13,,21,,32,35,,,46,49,,,,,67,71,74,5,10,16,,,,,', -'37,44,,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,25,,31,34,12,40,,27,30,33,38', -'42,45,51,56,60,63,,,,,2,,,20,24,,,,,41,,,52,57,64,65,,,,,7,13,,21,,32', -'35,,,46,49,,,,,67,71,74,5,10,16,,,,,,37,44,,,,,,,,,,,,,,,,,,,,,,,,,', -',,72,3,,,,25,,31,34,12,40,,27,30,33,38,42,45,51,56,60,63,,,,,2,,,20', -'24,,,,,41,,,52,57,64,65,,,,,7,13,,21,,32,35,,,46,49,,,,,67,71,74,5,10', -'16,,,,,,37,44,,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,25,,31,34,12,40,,27', -'30,33,38,42,45,51,56,60,63,,,,,2,,,20,24,,,,,41,,,52,57,64,65,,,,,7', -'13,,21,,32,35,,,46,49,,,,,67,71,74,5,10,16,,,,,,37,44,,,,,,,,,,,,,,', -',,,,,,,,,,,,,72,3,,,,25,,31,34,12,40,,27,30,33,38,42,45,51,56,60,63', -',,,,2,,,20,24,,,,,41,,,52,57,64,65,,,,,7,13,,21,,32,35,,,46,49,110,', -',,67,71,74,5,10,16,,,,,,37,44,,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,25', -',31,34,12,40,,27,30,33,38,42,45,51,56,60,63,,,,,2,,,20,24,,,,,41,,,52', -'57,64,65,,,,,7,13,,21,,32,35,,,46,49,,,,,67,71,74,5,10,16,,,,,,37,44', -',,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,25,,31,34,12,40,,27,30,33,38,42,45', -'51,56,60,63,,,,,2,,,20,24,,,,,41,,,52,57,64,65,,,,,7,13,,21,,32,35,', -',46,49,54,,,,67,71,74,5,10,16,,,,,,37,44,,,,,,,,,,,,,,,,,,,,,,,,,,,', -'72,3,8,14,,25,,31,34,12,40,,27,30,33,38,42,45,51,56,60,63,,,,,2,,,20', -'24,,,,,41,,,52,57,64,65,,,,,7,13,,21,,32,35,,,46,49,,,,,67,71,74,5,10', -'16,,,,,,37,44,,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,25,,31,34,12,40,,27', -'30,33,38,42,45,51,56,60,63,,,,,2,,,20,24,,,,,41,,,52,57,64,65,,,,,7', -'13,,21,,32,35,,,46,49,,,,,67,71,74,5,10,16,,,,,,37,44,,,,,,,,,,,,,,', -',,,,,,,,,,,,,72,3,,,,25,,31,34,12,40,,27,30,33,38,42,45,51,56,60,63', -',,,,2,,,20,24,,,,,41,,,52,57,64,65,,,,,7,13,,21,,32,35,,,46,49,,,,,67', -'71,74,5,10,16,,,,,,37,44,,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,25,,31,34', -'12,40,,27,30,33,38,42,45,51,56,60,63,,,,,2,,,20,24,,,,,41,,,52,57,64', -'65,,,,,7,13,,21,,32,35,,,46,49,,,,,67,71,74,5,10,16,,,,,,37,44,,,,,', -',,,,,,,,,,,,,,,,,,,,,,72,3,,,,25,,31,34,12,40,,27,30,33,38,42,45,51', -'56,60,63,,,,,2,,,20,24,,,,,41,,,52,57,64,65,,,,,7,13,,21,,32,35,,,46', -'49,,,,,67,71,74,5,10,16,,,,,,37,44,,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,', -',,25,,31,34,12,40,,27,30,33,38,42,45,51,56,60,63,,,,,2,,,20,24,,,,,41', -',,52,57,64,65,,,,,7,13,,21,,32,35,,,46,49,,,,,67,71,74,5,10,16,,,,,', -'37,44,,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,25,,31,34,12,40,,27,30,33,38', -'42,45,51,56,60,63,,,,,2,,,20,24,,,,,41,,,52,57,64,65,,,,,7,13,,21,,32', -'35,,,46,49,,,,,67,71,74,5,10,16,,,,,,37,44,,,,,,,,,,,,,,,,,,,,,,,,,', -',,72,3,,,,25,,31,34,12,40,,27,30,33,38,42,45,51,56,60,63,,,,,2,,,20', -'24,,,,,41,,,52,57,64,65,,,,,7,13,,21,,32,35,,,46,49,,,,,67,71,74,5,10', -'16,,,,,,37,44,,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,25,,31,34,12,40,,27', -'30,33,38,42,45,51,56,60,63,,,,,2,,,20,24,,,,,41,,,52,57,64,65,,,,,7', -'13,,21,,32,35,,,46,49,,,,,67,71,74,5,10,16,,,,,,37,44,,,,,,,,,,,,,,', -',,,,,,,,,,,,,72,3,,,,25,,31,34,12,40,,27,30,33,38,42,45,51,56,60,63', -',,,,2,,,20,24,,,,,41,,,52,57,64,65,,,,,7,13,,21,,32,35,,,46,49,,,,,67', -'71,74,5,10,16,,,,,,37,44,,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,25,,31,34', -'12,40,,27,30,33,38,42,45,51,56,60,63,,,,,2,,,20,24,,,,,41,,,52,57,64', -'65,,,,,7,13,,21,,32,35,,,46,49,134,,143,,67,71,74,5,10,16,,,,,,37,44', -',,,,,,,,,,,,,,,130,135,,,,151,,,,164,,,72,3,,,,25,,31,34,,40,,142,147', -'150,154,157,159,161,167,129,133,138,141,146,149,153,156,160,163,166', -'128,132,137,140,145,148,152,155,158,162,165,127,131,136,139,144,134', -',143,,,,,,,,321,,,,,,,,,,,,,,,,,,,,,,130,135,,,,151,,,,164,,,,,,,,,', -',,,,,142,147,150,154,157,159,161,167,129,133,138,141,146,149,153,156', -'160,163,166,128,132,137,140,145,148,152,155,158,162,165,127,131,136', -'139,144,27,30,33,38,42,45,51,56,60,63,315,,,,2,,,20,24,,,,,41,,,52,57', -'64,,,,,,,13,,21,,32,35,,,46,49,,,,,67,71,74,5,10,16,,,,,,,,,,,27,30', -'33,38,42,45,51,56,60,63,,,,,2,,,20,24,,,,,41,72,3,52,57,64,25,,31,34', -',40,13,,21,,32,35,,,46,49,,,,,67,71,74,5,10,16,,,,,,,,,,,27,30,33,38', -'42,45,51,56,60,63,,,,,2,,,20,24,,,,,41,72,3,52,57,64,25,,31,34,,40,13', -',21,,32,35,,,46,49,,,,,67,71,74,5,10,16,,27,30,33,38,42,45,51,56,60', -'63,,,,,,,,,,,,,,,,,,57,64,,,,,72,3,,,,25,,31,34,,40,49,,,,,,,,,,,,,', -',,,,,27,30,33,38,42,45,51,56,60,63,,,,,2,,,20,24,,,,,41,,,52,57,64,65', -',25,,31,34,13,40,21,,32,35,,,46,49,134,,143,,67,71,74,5,10,16,,,,,,37', -'44,,,,,,,,,,,,,,,,130,135,,,,151,,,,164,,,72,3,,,,25,,31,34,,40,,142', -'147,150,154,157,159,161,167,129,133,138,141,146,149,153,156,160,163', -'166,128,132,137,140,145,148,152,155,158,162,165,127,131,136,139,144', -'134,,143,,,,,,,,,,,,,,,,,,,,,,,322,,,,,,,130,135,,,,151,,,,164,,,,,', -',,,,,,,,,142,147,150,154,157,159,161,167,129,133,138,141,146,149,153', -'156,160,163,166,128,132,137,140,145,148,152,155,158,162,165,127,131', -'136,139,144,134,,143,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,130,135,,,,151,,,', -'164,,,,,,,,,,,,,,,142,147,150,154,157,159,161,167,129,133,138,141,146', -'149,153,156,160,163,166,128,132,137,140,145,148,152,155,158,162,165', -'127,131,136,139,144,134,,143,,,,,,,,,,,,,,,,,,,,,,,320,,,,,,,130,135', -',,,151,,,,164,,,,,,,,,,,,,,,142,147,150,154,157,159,161,167,129,133', -'138,141,146,149,153,156,160,163,166,128,132,137,140,145,148,152,155', -'158,162,165,127,131,136,139,144,134,,143,,,,,,,,,,,,,,,,,,,,,,,,,,,', -',,130,135,,,,151,,,,164,,,,,,,,,,,,,,,142,147,150,154,157,159,161,167', -'129,133,138,141,146,149,153,156,160,163,166,128,132,137,140,145,148', -'152,155,158,162,165,127,131,136,139,144,134,,143,,,,,,,,,,,,,,,,,,,', -',,,271,,,,,,,130,135,,,,151,,,,164,,,,,,,,,,,,,,,142,147,150,154,157', -'159,272,167,129,133,138,141,146,149,153,156,160,163,166,128,132,137', -'140,145,148,152,155,158,162,165,127,131,136,139,144,134,,143,,,,,,,', -',,,,,,,,,,,,,,,,,,,,,,130,135,,,,151,,,,164,,,,,,,,,,,,,,,142,147,150', -'154,157,159,161,167,129,133,138,141,146,149,153,156,160,163,166,128', -'132,137,140,145,148,152,155,158,162,165,127,131,136,139,144,134,,143', -',,,,,,,,,,,,,,,,,,,,,,,,,,,,,130,135,,,,151,,,,164,,,,,,,,,,,,,,,142', -'147,150,154,157,159,161,167,129,133,138,141,146,149,153,156,160,163', -'166,128,132,137,140,145,148,152,155,158,162,165,127,131,136,139,144', -'134,,143,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,130,135,,,,151,,,,164,,,,,,,,', -',,,,,,142,147,150,154,157,159,161,167,129,133,138,141,146,149,153,156', -'160,163,166,128,132,137,140,145,148,152,155,158,162,165,127,131,136', -'139,144,134,,143,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,130,135,,,,151,,,,164', -',,,,,,,,,,,,,,142,147,150,154,157,159,161,167,129,133,138,141,146,149', -'153,156,160,163,166,128,132,137,140,145,148,152,155,158,162,165,127', -'131,136,139,144,134,,143,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,130,135,,,,151', -',,,164,,,,,,,,,,,,,,,142,147,150,154,157,159,202,167,129,133,138,141', -'146,149,153,156,160,163,166,128,132,137,140,145,148,152,155,158,162', -'165,127,131,136,139,144,134,,143,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,130,135', -',,,151,,,,164,,,,,,,,,,,,,,,142,147,150,154,157,159,161,167,129,133', -'138,141,146,149,153,156,160,163,166,128,132,137,140,145,148,152,155', -'158,162,165,127,131,136,139,144,134,,143,,,,,,,,,,,,,,,,,,,,,,,,,,,', -',,130,135,,,,151,,,,164,,,,,,,,,,,,,,,142,147,150,154,157,159,161,167', -'129,133,138,141,146,149,153,156,160,163,166,128,132,137,140,145,148', -'152,155,158,162,165,127,131,136,139,144,134,,143,,,,,,,,,,,,,,,,,,,', -',,,,,,,,,,130,135,,,,151,,,,164,,,,,,,,,,,,,,,142,147,150,154,157,159', -'161,167,129,133,138,141,146,149,153,156,160,163,166,128,132,137,140', -'145,148,152,155,158,162,165,127,131,136,139,144,134,,143,,,,,,,,,,,', -',,,,,,,,,,,,,,,,,,130,135,,,,151,,,,164,,,,,,,,,,,,,,,142,147,150,154', -'157,159,161,167,129,133,138,141,146,149,153,156,160,163,166,128,132', -'137,140,145,148,152,155,158,162,165,127,131,136,139,144,134,,143,,,', -',,,,,,,,,,,,,,,,,,,,,,,,,,130,135,,,,151,,,,164,,,,,,,54,,,,,,,,142', -'147,150,154,157,159,161,167,129,133,138,141,146,149,153,156,160,163', -'166,128,132,137,140,145,148,152,155,158,162,165,127,131,136,139,144', -'134,,143,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,130,135,,,,151,,,,164,,,,,,,54', -',,,,,,,142,147,150,154,157,159,161,167,129,133,138,141,146,149,153,156', -'160,163,166,128,132,137,140,145,148,152,155,158,162,165,127,131,136', -'139,144,134,,143,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,130,135,,,,151,,,,164', -',,,,,,184,,,,,,,,142,147,150,154,157,159,161,167,129,133,138,141,146', -'149,153,156,160,163,166,128,132,137,140,145,148,152,155,158,162,165', -'127,131,136,139,144,134,,143,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,130,135,,', -',151,,,,164,,,,,,,,,,,,,,,142,147,150,154,157,159,161,167,129,133,138', -'141,146,149,153,156,160,163,166,128,132,137,140,145,148,152,155,158', -'162,165,127,131,136,139,144,134,,143,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,130', -'135,,,,151,,,,164,,,,,,,,,,,,,,,142,147,150,154,157,159,161,167,129', -'133,138,141,146,149,153,156,160,163,166,128,132,137,140,145,148,152', -'155,158,162,165,127,131,136,139,144,134,,143,,,,,,,,,,,,,,,,,,,,,,,', -',,,,,,130,135,,,,151,,,,164,,,,,,,,,,,,,,,142,147,150,154,157,159,161', -'167,129,133,138,141,146,149,153,156,160,163,166,128,132,137,140,145', -'148,152,155,158,162,165,127,131,136,139,144,134,,143,,,,,,,,,,,,,,,', -',,,,,,,,,,,,,,130,135,,,,151,,,,164,,,,,,,,,,,,,,,142,147,150,154,157', -'159,161,167,129,133,138,141,146,149,153,156,160,163,166,128,132,137', -'140,145,148,152,155,158,162,165,127,131,136,139,144,130,135,,,,,,,,164', -',,,,,,,,,,,,,,142,147,150,154,157,159,161,167,129,133,138,141,146,149', -'153,156,160,163,166,128,132,137,140,145,148,152,155,158,162,165,127', -'131,136,139,144,130,135,,,,,,,,164,,,,,,,,,,,,,,,142,147,150,154,157', -'159,161,167,129,133,138,141,146,149,153,156,160,163,166,128,132,137', -'140,145,148,152,155,158,162,165,127,131,136,139,144,130,135,,,,,,,,164', -',,,,,,,,,,,,,,142,147,150,154,157,159,161,167,129,133,138,141,146,149', -'153,156,160,163,166,128,132,137,140,145,148,152,155,158,162,165,127', -'131,136,139,144,135,,,,,,,,164,,,,,,,,,,,,,,,142,147,150,154,157,159', -'161,167,129,133,138,141,146,149,153,156,160,163,166,128,132,137,140', -'145,148,152,155,158,162,165,127,131,136,139,144,135,,,,,,,,164,,,,,', -',,,,,,,,,142,147,150,154,157,159,161,167,129,133,138,141,146,149,153', -'156,160,163,166,128,132,137,140,145,148,152,155,158,162,165,127,131', -'136,139,144,135,,,,,,,,164,,,,,,,,,,,,,,,142,147,150,154,157,159,161', -'167,129,133,138,141,146,149,153,156,160,163,166,128,132,137,140,145', -'148,152,155,158,162,165,127,131,136,139,144,135,,,,,,,,164,,,,,,,,,', -',,,,,142,147,150,154,157,159,161,167,129,133,138,141,146,149,153,156', -'160,163,166,128,132,137,140,145,148,152,155,158,162,165,127,131,136', -'139,144,135,,,,,,,,164,,,,,,,,,,,,,,,142,147,150,154,157,159,161,167', -'129,133,138,141,146,149,153,156,160,163,166,128,132,137,140,145,148', -'152,155,158,162,165,127,131,136,139,144,164,,,,,,,,,,,,,,,142,147,150', -'154,157,159,161,167,129,133,138,141,146,149,153,156,160,163,166,128', -'132,137,140,145,148,152,155,158,162,165,127,131,136,139,144,164,,,,', -',,,,,,,,,,142,147,150,154,157,159,161,167,129,133,138,141,146,149,153', -'156,160,163,166,128,132,137,140,145,148,152,155,158,162,165,127,131', -'136,139,144,164,,,,,,,,,,,,,,,142,147,150,154,157,159,161,167,129,133', -'138,141,146,149,153,156,160,163,166,128,132,137,140,145,148,152,155', -'158,162,165,127,131,136,139,144,142,147,150,154,157,159,161,167,129', -'133,138,141,146,149,153,156,160,163,166,128,132,137,140,145,148,152', -'155,158,162,165,127,131,136,139,144,142,147,150,154,157,159,161,167', -'129,133,138,141,146,149,153,156,160,163,166,128,132,137,140,145,148', -'152,155,158,162,165,127,131,136,139,144,142,147,150,154,157,159,161', -'167,129,133,138,141,146,149,153,156,160,163,166,128,132,137,140,145', -'148,152,155,158,162,165,127,131,136,139,144,142,147,150,154,157,159', -'161,167,129,133,138,141,146,149,153,156,160,163,166,128,132,137,140', -'145,148,152,155,158,162,165,127,131,136,139,144,142,147,150,154,157', -'159,161,167,129,133,138,141,146,149,153,156,160,163,166,128,132,137', -'140,145,148,152,155,158,162,165,127,131,136,139,144,142,147,150,154', -'157,159,161,167,129,133,138,141,146,149,153,156,160,163,166,128,132', -'137,140,145,148,152,155,158,162,165,127,131,136,139,144,142,147,150', -'154,157,159,161,167,129,133,138,141,146,149,153,156,160,163,166,128', -'132,137,140,145,148,152,155,158,162,165,127,131,136,139,144,142,147', -'150,154,157,159,161,167,129,133,138,141,146,149,153,156,160,163,166', -'128,132,137,140,145,148,152,155,158,162,165,127,131,136,139,144' ] - racc_action_table = arr = Array.new(10897, nil) +'134,198,142,28,31,34,38,42,45,51,56,61,64,96,114,181,59,103,104,105', +'299,94,270,290,286,287,101,262,102,109,57,65,130,135,262,49,289,151', +'59,146,150,165,49,146,150,8,14,200,54,198,185,59,197,212,213,179,49', +'146,150,154,157,160,162,164,129,133,138,141,145,149,153,156,159,163', +'167,128,132,137,140,144,148,152,155,158,161,166,127,131,136,139,143', +'147,180,8,14,200,12,26,311,32,35,12,40,204,28,31,34,38,42,45,51,56,61', +'64,293,278,59,209,2,286,287,21,25,146,150,59,96,41,266,186,52,57,65', +'66,94,-185,-185,59,7,13,120,22,198,33,36,59,146,150,49,54,206,207,262', +'194,71,74,5,10,16,19,49,8,14,295,282,44,47,-185,-185,49,8,14,8,14,190', +'96,8,14,190,250,188,96,96,94,-185,-185,8,14,200,94,94,8,14,72,3,-185', +'-185,59,26,59,32,35,12,40,195,28,31,34,38,42,45,51,56,61,64,81,8,14', +'49,2,97,196,21,25,49,49,97,280,41,-185,-185,52,57,65,66,-185,-185,8', +'14,7,13,279,22,277,33,36,-185,-185,78,49,54,124,103,104,105,71,74,5', +'10,16,19,101,316,102,59,312,44,47,146,150,154,157,160,162,164,129,133', +'138,141,145,149,153,156,170,171,8,14,103,104,105,72,3,-185,-185,72,3', +'101,78,102,26,208,32,35,12,40,257,28,31,34,38,42,45,51,56,61,64,103', +'104,105,211,2,212,213,21,25,101,124,102,81,41,,,52,57,65,66,,,,,7,13', +',22,,33,36,,,,49,54,,103,104,105,71,74,5,10,16,19,101,,102,,,44,47,146', +'150,154,157,160,162,164,129,133,138,141,145,149,153,156,159,163,167', +'128,132,137,140,144,,,,72,3,,,,26,,32,35,12,40,,28,31,34,38,42,45,51', +'56,61,64,103,104,105,,2,,,21,25,101,,102,,41,,,52,57,65,66,,,,,7,13', +',22,,33,36,,,,49,54,,,,,71,74,5,10,16,19,,,,,,44,47,146,150,154,157', +'160,162,164,129,133,138,141,145,149,153,156,159,163,167,128,132,137', +'140,144,,,,72,3,,,,26,,32,35,12,40,,28,31,34,38,42,45,51,56,61,64,,', +',,2,,,21,25,,,,,41,,,52,57,65,66,,,,,7,13,,22,,33,36,,,,49,54,,,,,71', +'74,5,10,16,19,,,,,,44,47,146,150,154,157,160,162,164,129,133,138,141', +'145,149,153,156,159,163,167,128,132,137,140,144,,,,72,3,,,,26,,32,35', +'12,40,,28,31,34,38,42,45,51,56,61,64,,,,,2,,,21,25,,,,,41,,,52,57,65', +'66,,,,,7,13,,22,,33,36,,,,49,54,,,,,71,74,5,10,16,19,,,,,,44,47,146', +'150,154,157,160,162,164,129,133,138,141,145,149,153,156,159,163,167', +'128,132,137,140,144,,,,72,3,,,,26,,32,35,12,40,,28,31,34,38,42,45,51', +'56,61,64,,,,,2,,,21,25,,,,,41,,,52,57,65,66,,,,,7,13,,22,,33,36,,,,49', +'54,,,,,71,74,5,10,16,19,,,,,,44,47,146,150,154,157,160,162,164,129,133', +'138,141,145,149,153,156,159,163,167,128,132,137,140,144,,,,72,3,,,,26', +',32,35,12,40,,28,31,34,38,42,45,51,56,61,64,,,,,2,,,21,25,,,,,41,,,52', +'57,65,66,,,,,7,13,,22,,33,36,,,,49,54,,,,,71,74,5,10,16,19,,,,,,44,47', +'146,150,154,157,160,162,164,129,133,138,141,145,149,153,156,159,163', +'167,128,132,137,140,144,,,,72,3,,,,26,,32,35,12,40,,28,31,34,38,42,45', +'51,56,61,64,,,,,2,,,21,25,,,,,41,,,52,57,65,66,,,,,7,13,,22,,33,36,', +',,49,54,,,,,71,74,5,10,16,19,,,,,,44,47,146,150,154,157,160,162,164', +'129,133,138,141,145,149,153,156,159,163,167,128,132,137,140,144,,,,72', +'3,,,,26,,32,35,12,40,,28,31,34,38,42,45,51,56,61,64,,,,,2,,,21,25,,', +',,41,,,52,57,65,66,,,,,7,13,,22,,33,36,,,,49,54,,,,,71,74,5,10,16,19', +',,,,,44,47,146,150,154,157,160,162,164,129,133,138,141,145,149,153,156', +'159,163,167,128,132,137,140,144,,,,72,3,,,,26,,32,35,12,40,,28,31,34', +'38,42,45,51,56,61,64,,,,,2,,,21,25,,,,,41,,,52,57,65,66,,,,,7,13,,22', +',33,36,,,,49,54,,,,,71,74,5,10,16,19,,,,,,44,47,146,150,154,157,160', +'162,164,129,133,138,141,145,149,153,156,146,150,154,157,160,162,164', +'129,133,,,72,3,,,,26,,32,35,12,40,,28,31,34,38,42,45,51,56,61,64,,,', +',2,,,21,25,,,,,41,,,52,57,65,66,,,,,7,13,,22,,33,36,,,,49,54,,,,,71', +'74,5,10,16,19,,,,,,44,47,146,150,154,157,160,162,164,129,133,138,141', +'145,149,153,156,146,150,154,157,160,162,164,129,133,,,72,3,,,,26,,32', +'35,12,40,,28,31,34,38,42,45,51,56,61,64,,,,,2,,,21,25,,,,,41,,,52,57', +'65,66,,,,,7,13,,22,,33,36,,,,49,54,,,,,71,74,5,10,16,19,,,,,302,44,47', +'146,150,154,157,160,162,164,129,133,138,141,145,149,153,156,146,150', +'154,157,160,162,164,129,133,,,72,3,,,,26,,32,35,12,40,,28,31,34,38,42', +'45,51,56,61,64,,,,,2,,,21,25,,,,,41,,,52,57,65,66,,,,,7,13,,22,,33,36', +',,,49,54,,,,,71,74,5,10,16,19,,,,,,44,47,146,150,154,157,160,162,164', +'129,133,146,150,154,157,160,162,164,129,133,146,150,154,157,160,162', +'164,,72,3,,,,26,,32,35,12,40,,28,31,34,38,42,45,51,56,61,64,,,,,2,,', +'21,25,,,,,41,,,52,57,65,66,,,,,7,13,,22,,33,36,,,,49,54,,,,,71,74,5', +'10,16,19,,,,,,44,47,146,150,154,157,160,162,164,129,133,146,150,154', +'157,160,162,164,,,,,,,,,,,72,3,,,,26,,32,35,12,40,,28,31,34,38,42,45', +'51,56,61,64,,,,,2,,,21,25,,,,,41,,,52,57,65,66,,,,,7,13,,22,,33,36,', +',,49,54,,,,,71,74,5,10,16,19,,,,,,44,47,,,,,,,,,,,,,,,,,,,,,,,,,,,72', +'3,,,,26,,32,35,12,40,,28,31,34,38,42,45,51,56,61,64,,,,,2,,,21,25,,', +',,41,,,52,57,65,66,,,,,7,13,,22,,33,36,,,,49,54,112,,,,71,74,5,10,16', +'19,,,,,,44,47,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,26,,32,35,12,40,,28', +'31,34,38,42,45,51,56,61,64,,,,,2,,,21,25,,,,,41,,,52,57,65,66,,,,,7', +'13,,22,,33,36,,,,49,54,,,,,71,74,5,10,16,19,,,,,,44,47,,,,,,,,,,,,,', +',,,,,,,,,,,,,72,3,,,,26,,32,35,12,40,,28,31,34,38,42,45,51,56,61,64', +',,,,2,,,21,25,,,,,41,,,52,57,65,66,,,,,7,13,,22,,33,36,,,,49,54,,,,', +'71,74,5,10,16,19,,,,,,44,47,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,26,,32', +'35,12,40,,28,31,34,38,42,45,51,56,61,64,,,,,2,,,21,25,,,,,41,,,52,57', +'65,66,,,,,7,13,,22,,33,36,,,,49,54,,,,,71,74,5,10,16,19,,,,,,44,47,', +',,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,26,,32,35,12,40,,28,31,34,38,42,45', +'51,56,61,64,,,,,2,,,21,25,,,,,41,,,52,57,65,66,,,,,7,13,,22,,33,36,', +',,49,54,,,,,71,74,5,10,16,19,,,,,,44,47,,,,,,,,,,,,,,,,,,,,,,,,,,,72', +'3,,,,26,,32,35,12,40,,28,31,34,38,42,45,51,56,61,64,,,,,2,,,21,25,,', +',,41,,,52,57,65,66,,,,,7,13,,22,,33,36,,,,49,54,,,,,71,74,5,10,16,19', +',,,,,44,47,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,26,,32,35,12,40,,28,31', +'34,38,42,45,51,56,61,64,,,,,2,,,21,25,,,,,41,,,52,57,65,66,,,,,7,13', +',22,,33,36,,,,49,54,,,,,71,74,5,10,16,19,,,,,,44,47,,,,,,,,,,,,,,,,', +',,,,,,,,,,72,3,,,,26,,32,35,12,40,,28,31,34,38,42,45,51,56,61,64,,,', +',2,,,21,25,,,,,41,,,52,57,65,66,,,,,7,13,,22,,33,36,,,,49,54,,,,,71', +'74,5,10,16,19,,,,,,44,47,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,26,,32,35', +'12,40,,28,31,34,38,42,45,51,56,61,64,,,,,2,,,21,25,,,,,41,,,52,57,65', +'66,,,,,7,13,,22,,33,36,,,,49,54,,122,,,71,74,5,10,16,19,,,,,,44,47,', +',,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,26,,32,35,12,40,,28,31,34,38,42,45', +'51,56,61,64,,,,,2,,,21,25,,,,,41,,,52,57,65,66,,,,,7,13,,22,,33,36,', +',,49,54,275,,,,71,74,5,10,16,19,,,,,,44,47,,,,,,,,,,,,,,,,,,,,,,,,,', +',72,3,8,14,,26,,32,35,12,40,,28,31,34,38,42,45,51,56,61,64,,,,,2,,,21', +'25,,,,,41,,,52,57,65,66,,,,,7,13,,22,,33,36,,,,49,54,,,,,71,74,5,10', +'16,19,,,,,,44,47,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,26,,32,35,12,40,', +'28,31,34,38,42,45,51,56,61,64,,,,,2,,,21,25,,,,,41,,,52,57,65,66,,,', +',7,13,,22,,33,36,,,,49,54,,,,,71,74,5,10,16,19,,,,,,44,47,,,,,,,,,,', +',,,,,,,,,,,,,,,,72,3,,,,26,,32,35,12,40,,28,31,34,38,42,45,51,56,61', +'64,,,,,2,,,21,25,,,,,41,,,52,57,65,66,,,,,7,13,,22,,33,36,,,,49,54,', +',,,71,74,5,10,16,19,,,,,,44,47,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,26', +',32,35,12,40,,28,31,34,38,42,45,51,56,61,64,,,,,2,,,21,25,,,,,41,,,52', +'57,65,66,,,,,7,13,,22,,33,36,,,,49,54,,,,,71,74,5,10,16,19,,,,,,44,47', +',,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,26,,32,35,12,40,,28,31,34,38,42,45', +'51,56,61,64,,,,,2,,,21,25,,,,,41,,,52,57,65,66,,,,,7,13,,22,,33,36,', +',,49,54,,,,,71,74,5,10,16,19,,,,,,44,47,,,,,,,,,,,,,,,,,,,,,,,,,,,72', +'3,,,,26,,32,35,12,40,,28,31,34,38,42,45,51,56,61,64,,,,,2,,,21,25,,', +',,41,,,52,57,65,66,,,,,7,13,,22,,33,36,,,,49,54,,,,,71,74,5,10,16,19', +',,,,,44,47,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,26,,32,35,12,40,,28,31', +'34,38,42,45,51,56,61,64,,,,,2,,,21,25,,,,,41,,,52,57,65,66,,,,,7,13', +',22,,33,36,,,,49,54,,,,,71,74,5,10,16,19,,,,,,44,47,,,,,,,,,,,,,,,,', +',,,,,,,,,,72,3,,,,26,,32,35,12,40,,28,31,34,38,42,45,51,56,61,64,,,', +',2,,,21,25,,,,,41,,,52,57,65,66,,,,,7,13,,22,,33,36,,,,49,54,,,,,71', +'74,5,10,16,19,,,,,,44,47,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,26,,32,35', +'12,40,,28,31,34,38,42,45,51,56,61,64,,,,,2,,,21,25,,,,,41,,,52,57,65', +'66,,,,,7,13,,22,,33,36,,,,49,54,,,,,71,74,5,10,16,19,,,,,,44,47,,,,', +',,,,,,,,,,,,,,,,,,,,,,72,3,,,,26,,32,35,12,40,,28,31,34,38,42,45,51', +'56,61,64,,,,,2,,,21,25,,,,,41,,,52,57,65,66,,,,,7,13,,22,,33,36,,,,49', +'54,,,,,71,74,5,10,16,19,,,,,,44,47,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,', +',26,,32,35,12,40,,28,31,34,38,42,45,51,56,61,64,,,,,2,,,21,25,,,,,41', +',,52,57,65,66,,,,,7,13,,22,,33,36,,,,49,54,,,,,71,74,5,10,16,19,,,,', +',44,47,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,26,,32,35,12,40,,28,31,34,38', +'42,45,51,56,61,64,,,,,2,,,21,25,,,,,41,,,52,57,65,66,,,,,7,13,,22,,33', +'36,,,,49,54,,,,,71,74,5,10,16,19,,,,,,44,47,,,,,,,,,,,,,,,,,,,,,,,,', +',,72,3,,,,26,,32,35,12,40,,28,31,34,38,42,45,51,56,61,64,,,,,2,,,21', +'25,,,,,41,,,52,57,65,66,,,,,7,13,,22,,33,36,,,,49,54,,,,,71,74,5,10', +'16,19,,,,,,44,47,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,26,,32,35,12,40,', +'28,31,34,38,42,45,51,56,61,64,,,,,2,,,21,25,,,,,41,,,52,57,65,66,,,', +',7,13,,22,,33,36,,,,49,54,,,,,71,74,5,10,16,19,,,,,,44,47,,,,,,,,,,', +',,,,,,,,,,,,,,,,72,3,,,,26,,32,35,12,40,,28,31,34,38,42,45,51,56,61', +'64,,,,,2,,,21,25,,,,,41,,,52,57,65,66,,,,,7,13,,22,,33,36,,,,49,54,', +',,,71,74,5,10,16,19,,,,,,44,47,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,26', +',32,35,12,40,,28,31,34,38,42,45,51,56,61,64,,,,,2,,,21,25,,,,,41,,,52', +'57,65,66,,,,,7,13,,22,,33,36,,,,49,54,,,,,71,74,5,10,16,19,,,,,,44,47', +',,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,26,,32,35,12,40,,28,31,34,38,42,45', +'51,56,61,64,,,,,2,,,21,25,,,,,41,,,52,57,65,66,,,,,7,13,,22,,33,36,', +',,49,54,,,,,71,74,5,10,16,19,,,,,,44,47,,,,,,,,,,,,,,,,,,,,,,,,,,,72', +'3,,,,26,,32,35,12,40,,28,31,34,38,42,45,51,56,61,64,,,,,2,,,21,25,,', +',,41,,,52,57,65,66,,,,,7,13,,22,,33,36,,,,49,54,,,,,71,74,5,10,16,19', +',,,,,44,47,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,26,,32,35,12,40,,28,31', +'34,38,42,45,51,56,61,64,,,,,2,,,21,25,,,,,41,,,52,57,65,66,,,,,7,13', +',22,,33,36,,,,49,54,,,,,71,74,5,10,16,19,,,,,,44,47,,,,,,,,,,,,,,,,', +',,,,,,,,,,72,3,,,,26,,32,35,12,40,,28,31,34,38,42,45,51,56,61,64,,,', +',2,,,21,25,,,,,41,,,52,57,65,66,,,,,7,13,,22,,33,36,,,,49,54,,,,,71', +'74,5,10,16,19,,,,,,44,47,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,26,,32,35', +'12,40,,28,31,34,38,42,45,51,56,61,64,,,,,2,,,21,25,,,,,41,,,52,57,65', +'66,,,,,7,13,,22,,33,36,,,,49,54,,,,,71,74,5,10,16,19,,,,,,44,47,,,,', +',,,,,,,,,,,,,,,,,,,,,,72,3,,,,26,,32,35,12,40,,28,31,34,38,42,45,51', +'56,61,64,,,,,2,,,21,25,,,,,41,,,52,57,65,66,,,,,7,13,,22,,33,36,,,,49', +'54,,,,,71,74,5,10,16,19,,,,,,44,47,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,', +',26,,32,35,12,40,,28,31,34,38,42,45,51,56,61,64,,,,,2,,,21,25,,,,,41', +',,52,57,65,66,,,,,7,13,,22,,33,36,,,,49,54,,,,,71,74,5,10,16,19,,,,', +',44,47,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,26,,32,35,12,40,,28,31,34,38', +'42,45,51,56,61,64,,,,,2,,,21,25,,,,,41,,,52,57,65,66,,,,,7,13,,22,,33', +'36,,,,49,54,,,,,71,74,5,10,16,19,,,,,,44,47,,,,,,,,,,,,,,,,,,,,,,,,', +',,72,3,,,,26,,32,35,12,40,,28,31,34,38,42,45,51,56,61,64,,,,,2,,,21', +'25,,,,,41,,,52,57,65,66,,,,,7,13,,22,,33,36,,,,49,54,,,,,71,74,5,10', +'16,19,,,,,,44,47,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,26,,32,35,12,40,', +'28,31,34,38,42,45,51,56,61,64,,,,,2,,,21,25,,,,,41,,,52,57,65,66,,,', +',7,13,,22,,33,36,,,,49,54,,,,,71,74,5,10,16,19,,,,,,44,47,,,,,,,,,,', +',,,,,,,,,,,,,,,,72,3,,,,26,,32,35,12,40,,28,31,34,38,42,45,51,56,61', +'64,,,,,2,,,21,25,,,,,41,,,52,57,65,66,,,,,7,13,,22,,33,36,,,,49,54,112', +',,,71,74,5,10,16,19,,,,,,44,47,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,26', +',32,35,12,40,,28,31,34,38,42,45,51,56,61,64,,,,,2,,,21,25,,,,,41,,,52', +'57,65,66,,,,,7,13,,22,,33,36,,,,49,54,,,,,71,74,5,10,16,19,,,,,,44,47', +',,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,26,,32,35,12,40,,28,31,34,38,42,45', +'51,56,61,64,,,,,2,,,21,25,,,,,41,,,52,57,65,66,,,,,7,13,,22,,33,36,', +',,49,54,,,,,71,74,5,10,16,19,,,,,,44,47,,,,,,,,,,,,,,,,,,,,,,,,,,,72', +'3,,,,26,,32,35,12,40,,28,31,34,38,42,45,51,56,61,64,,,,,2,,,21,25,,', +',,41,,,52,57,65,66,,,,,7,13,,22,,33,36,,,,49,54,,,,,71,74,5,10,16,19', +',,,,,44,47,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,26,,32,35,12,40,,28,31', +'34,38,42,45,51,56,61,64,,,,,2,,,21,25,,,,,41,,,52,57,65,66,,,,,7,13', +',22,,33,36,,,,49,54,,,,,71,74,5,10,16,19,,,,,,44,47,,,,,,,,,,,,,,,,', +',,,,,,,,,,72,3,,,,26,,32,35,12,40,,28,31,34,38,42,45,51,56,61,64,,,', +',2,,,21,25,,,,,41,,,52,57,65,66,,,,,7,13,,22,,33,36,,,,49,54,,,,,71', +'74,5,10,16,19,,,,,,44,47,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,26,,32,35', +'12,40,,28,31,34,38,42,45,51,56,61,64,,,,,2,,,21,25,,,,,41,,,52,57,65', +'66,,,,,7,13,,22,,33,36,,,,49,54,,,,,71,74,5,10,16,19,,,,,,44,47,,,,', +',,,,,,,,,,,,,,,,,,,,,,72,3,,,,26,,32,35,12,40,,28,31,34,38,42,45,51', +'56,61,64,,,,,2,,,21,25,,,,,41,,,52,57,65,66,,,,,7,13,,22,,33,36,,,,49', +'54,,,,,71,74,5,10,16,19,,,,,,44,47,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,', +',26,,32,35,12,40,,28,31,34,38,42,45,51,56,61,64,,,,,2,,,21,25,,,,,41', +',,52,57,65,66,,,,,7,13,,22,,33,36,,,,49,54,,,,,71,74,5,10,16,19,,,,', +',44,47,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,26,,32,35,12,40,,28,31,34,38', +'42,45,51,56,61,64,,,,,2,,,21,25,,,,,41,,,52,57,65,66,,,,,7,13,,22,,33', +'36,,,,49,54,112,,,,71,74,5,10,16,19,,,,,,44,47,,,,,,,,,,,,,,,,,,,,,', +',,,,,72,3,,,,26,,32,35,12,40,,28,31,34,38,42,45,51,56,61,64,,,,,2,,', +'21,25,,,,,41,,,52,57,65,66,,,,,7,13,,22,,33,36,,,,49,54,59,,,,71,74', +'5,10,16,19,,,,,,44,47,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,8,14,,26,,32,35', +'12,40,,28,31,34,38,42,45,51,56,61,64,,,,,2,,,21,25,,,,,41,,,52,57,65', +'66,,,,,7,13,,22,,33,36,,,,49,54,,,,,71,74,5,10,16,19,,,,,,44,47,,,,', +',,,,,,,,,,,,,,,,,,,,,,72,3,,,,26,,32,35,12,40,,28,31,34,38,42,45,51', +'56,61,64,,,,,2,,,21,25,,,,,41,,,52,57,65,66,,,,,7,13,,22,,33,36,,,,49', +'54,,,,,71,74,5,10,16,19,,,,,,44,47,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,', +',26,,32,35,12,40,,28,31,34,38,42,45,51,56,61,64,,,,,2,,,21,25,,,,,41', +',,52,57,65,66,,,,,7,13,,22,,33,36,,,,49,54,,,,,71,74,5,10,16,19,,,,', +',44,47,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,26,,32,35,12,40,,28,31,34,38', +'42,45,51,56,61,64,,,,,2,,,21,25,,,,,41,,,52,57,65,66,,,,,7,13,,22,,33', +'36,,,,49,54,,,,,71,74,5,10,16,19,,,,,,44,47,,,,,,,,,,,,,,,,,,,,,,,,', +',,72,3,,,,26,,32,35,12,40,,28,31,34,38,42,45,51,56,61,64,,,,,2,,,21', +'25,,,,,41,,,52,57,65,66,,,,,7,13,,22,,33,36,,,,49,54,,,,,71,74,5,10', +'16,19,,,,,,44,47,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,26,,32,35,12,40,', +'28,31,34,38,42,45,51,56,61,64,,,,,2,,,21,25,,,,,41,,,52,57,65,66,,,', +',7,13,,22,,33,36,,,,49,54,,,,,71,74,5,10,16,19,,,,,,44,47,,,,,,,,,,', +',,,,,,,,,,,,,,,,72,3,,,,26,,32,35,12,40,,28,31,34,38,42,45,51,56,61', +'64,,,,,2,,,21,25,,,,,41,,,52,57,65,66,,,,,7,13,,22,,33,36,,,,49,54,', +',,,71,74,5,10,16,19,,,,,,44,47,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,26', +',32,35,12,40,,28,31,34,38,42,45,51,56,61,64,,,,,2,,,21,25,,,,,41,,,52', +'57,65,66,,,,,7,13,,22,,33,36,,,,49,54,,,,,71,74,5,10,16,19,,,,,,44,47', +',,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,26,,32,35,12,40,,28,31,34,38,42,45', +'51,56,61,64,,,,,2,,,21,25,,,,,41,,,52,57,65,66,,,,,7,13,,22,,33,36,', +',,49,54,,,,,71,74,5,10,16,19,,,,,,44,47,,,,,,,,,,,,,,,,,,,,,,,,,,,72', +'3,,,,26,,32,35,12,40,,28,31,34,38,42,45,51,56,61,64,,,,,2,,,21,25,,', +',,41,,,52,57,65,66,,,,,7,13,,22,,33,36,,,,49,54,,,,,71,74,5,10,16,19', +',,,,,44,47,,,,,,,,,,,,,,,,,,,,,,,,,,,72,3,,,,26,,32,35,12,40,,28,31', +'34,38,42,45,51,56,61,64,,,,,2,,,21,25,,,,,41,,,52,57,65,66,,,,,7,13', +',22,,33,36,,,,49,54,134,,142,,71,74,5,10,16,19,,,,,,44,47,,,,,,,,,,', +',,,,,130,135,,,,151,,,,165,,72,3,,,,26,,32,35,,40,,,,146,150,154,157', +'160,162,164,129,133,138,141,145,149,153,156,159,163,167,128,132,137', +'140,144,148,152,155,158,161,166,127,131,136,139,143,147,134,,142,,,', +',,,321,,,,,,,,,,,,,,,,,,,,,,,130,135,,,,151,,,,165,,,,,,,,,,,,,,,,146', +'150,154,157,160,162,164,129,133,138,141,145,149,153,156,159,163,167', +'128,132,137,140,144,148,152,155,158,161,166,127,131,136,139,143,147', +',,,,,,,,,315,28,31,34,38,42,45,51,56,61,64,,,,,2,,,21,25,,,,,41,,,52', +'57,65,,,,,,,13,,22,,33,36,,,,49,54,,,,,71,74,5,10,16,19,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,72,3,,,,26,,32,35,,40,28,31,34,38,42,45,51,56,61', +'64,,,,,2,,,21,25,,,,,41,,,52,57,65,66,,,,,,13,,22,,33,36,,,,49,54,,', +',,71,74,5,10,16,19,,,,,,44,47,,28,31,34,38,42,45,51,56,61,64,,,,,,,', +',,,,,,,,72,3,57,65,,26,,32,35,,40,,,,,,,,,,54,,,,,,,,,,,,,,,,,,28,31', +'34,38,42,45,51,56,61,64,,,,,2,,,21,25,,,,,41,,,52,57,65,,,26,,32,35', +'13,40,22,,33,36,,,,49,54,,,,,71,74,5,10,16,19,,,,,,,,,,28,31,34,38,42', +'45,51,56,61,64,,,,,2,,,21,25,,,,,41,72,3,52,57,65,26,,32,35,,40,13,', +'22,,33,36,,,,49,54,134,,142,,71,74,5,10,16,19,,,,,,,,,,,,,,,,,,,,,,', +'130,135,,,,151,,,,165,,72,3,,,,26,,32,35,,40,,,,146,150,154,157,160', +'162,164,129,133,138,141,145,149,153,156,159,163,167,128,132,137,140', +'144,148,152,155,158,161,166,127,131,136,139,143,147,134,,142,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,130,135,,,,151,,,,165,,,,,,,,,,,,,,,,146,150,154', +'157,160,162,202,129,133,138,141,145,149,153,156,159,163,167,128,132', +'137,140,144,148,152,155,158,161,166,127,131,136,139,143,147,134,,142', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,130,135,,,,151,,,,165,,,,,,,,,,,,,,,,146', +'150,154,157,160,162,164,129,133,138,141,145,149,153,156,159,163,167', +'128,132,137,140,144,148,152,155,158,161,166,127,131,136,139,143,147', +'134,,142,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,130,135,,,,151,,,,165,,,,,,,,', +',,,,,,,146,150,154,157,160,162,164,129,133,138,141,145,149,153,156,159', +'163,167,128,132,137,140,144,148,152,155,158,161,166,127,131,136,139', +'143,147,134,,142,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,130,135,,,,151,,,,165', +',,,,,,,,,,,,,,,146,150,154,157,160,162,164,129,133,138,141,145,149,153', +'156,159,163,167,128,132,137,140,144,148,152,155,158,161,166,127,131', +'136,139,143,147,134,,142,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,130,135,,,,151', +',,,165,,,,,,,,,,,,,,,,146,150,154,157,160,162,164,129,133,138,141,145', +'149,153,156,159,163,167,128,132,137,140,144,148,152,155,158,161,166', +'127,131,136,139,143,147,134,,142,,,,,,,,,,,,,,,,,,,,,,,320,,,,,,,130', +'135,,,,151,,,,165,,,,,,,,,,,,,,,,146,150,154,157,160,162,164,129,133', +'138,141,145,149,153,156,159,163,167,128,132,137,140,144,148,152,155', +'158,161,166,127,131,136,139,143,147,134,,142,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,130,135,,,,151,,,,165,,,,,,,,,,,,,,,,146,150,154,157,160,162,164', +'129,133,138,141,145,149,153,156,159,163,167,128,132,137,140,144,148', +'152,155,158,161,166,127,131,136,139,143,147,134,,142,,,,,,,,,,,,,,,', +',,,,,,,271,,,,,,,130,135,,,,151,,,,165,,,,,,,,,,,,,,,,146,150,154,157', +'160,162,272,129,133,138,141,145,149,153,156,159,163,167,128,132,137', +'140,144,148,152,155,158,161,166,127,131,136,139,143,147,134,,142,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,130,135,,,,151,,,,165,,,,,,,,,,,,,,,,146,150', +'154,157,160,162,164,129,133,138,141,145,149,153,156,159,163,167,128', +'132,137,140,144,148,152,155,158,161,166,127,131,136,139,143,147,134', +',142,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,130,135,,,,151,,,,165,,,,,,,,,,,,', +',,,146,150,154,157,160,162,164,129,133,138,141,145,149,153,156,159,163', +'167,128,132,137,140,144,148,152,155,158,161,166,127,131,136,139,143', +'147,134,,142,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,130,135,,,,151,,,,165,,,,', +',,,,,,,,,,,146,150,154,157,160,162,164,129,133,138,141,145,149,153,156', +'159,163,167,128,132,137,140,144,148,152,155,158,161,166,127,131,136', +'139,143,147,134,,142,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,130,135,,,,151,,,', +'165,,,,,,,,,,,,,,,,146,150,154,157,160,162,164,129,133,138,141,145,149', +'153,156,159,163,167,128,132,137,140,144,148,152,155,158,161,166,127', +'131,136,139,143,147,134,,142,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,130,135,,', +',151,,,,165,,,,,,,,,,,,,,,,146,150,154,157,160,162,164,129,133,138,141', +'145,149,153,156,159,163,167,128,132,137,140,144,148,152,155,158,161', +'166,127,131,136,139,143,147,134,,142,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,130', +'135,,,,151,,,,165,,,,,,,,,,,,,,,,146,150,154,157,160,162,164,129,133', +'138,141,145,149,153,156,159,163,167,128,132,137,140,144,148,152,155', +'158,161,166,127,131,136,139,143,147,134,,142,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,130,135,,,,151,,,,165,,,,,,,,,,,,,,,,146,150,154,157,160,162,164', +'129,133,138,141,145,149,153,156,159,163,167,128,132,137,140,144,148', +'152,155,158,161,166,127,131,136,139,143,147,134,,142,,,,,,,,,,,,,,,', +',,,,,,,322,,,,,,,130,135,,,,151,,,,165,,,,,,,,,,,,,,,,146,150,154,157', +'160,162,164,129,133,138,141,145,149,153,156,159,163,167,128,132,137', +'140,144,148,152,155,158,161,166,127,131,136,139,143,147,134,,142,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,130,135,,,,151,,,,165,,,,,,,,59,,,,,,,,146', +'150,154,157,160,162,164,129,133,138,141,145,149,153,156,159,163,167', +'128,132,137,140,144,148,152,155,158,161,166,127,131,136,139,143,147', +'134,,142,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,130,135,,,,151,,,,165,,,,,,,,', +',,,,,,,146,150,154,157,160,162,164,129,133,138,141,145,149,153,156,159', +'163,167,128,132,137,140,144,148,152,155,158,161,166,127,131,136,139', +'143,147,134,,142,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,130,135,,,,151,,,,165', +',,,,,,,59,,,,,,,,146,150,154,157,160,162,164,129,133,138,141,145,149', +'153,156,159,163,167,128,132,137,140,144,148,152,155,158,161,166,127', +'131,136,139,143,147,134,,142,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,130,135,,', +',151,,,,165,,,,,,,,,,,,,,,,146,150,154,157,160,162,164,129,133,138,141', +'145,149,153,156,159,163,167,128,132,137,140,144,148,152,155,158,161', +'166,127,131,136,139,143,147,134,,142,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,130', +'135,,,,151,,,,165,,,,,,,,184,,,,,,,,146,150,154,157,160,162,164,129', +'133,138,141,145,149,153,156,159,163,167,128,132,137,140,144,148,152', +'155,158,161,166,127,131,136,139,143,147,130,135,,,,,,,,165,,,,,,,,,', +',,,,,,146,150,154,157,160,162,164,129,133,138,141,145,149,153,156,159', +'163,167,128,132,137,140,144,148,152,155,158,161,166,127,131,136,139', +'143,147,130,135,,,,,,,,165,,,,,,,,,,,,,,,,146,150,154,157,160,162,164', +'129,133,138,141,145,149,153,156,159,163,167,128,132,137,140,144,148', +'152,155,158,161,166,127,131,136,139,143,147,130,135,,,,,,,,165,,,,,', +',,,,,,,,,,146,150,154,157,160,162,164,129,133,138,141,145,149,153,156', +'159,163,167,128,132,137,140,144,148,152,155,158,161,166,127,131,136', +'139,143,147,135,,,,,,,,165,,,,,,,,,,,,,,,,146,150,154,157,160,162,164', +'129,133,138,141,145,149,153,156,159,163,167,128,132,137,140,144,148', +'152,155,158,161,166,127,131,136,139,143,147,135,,,,,,,,165,,,,,,,,,', +',,,,,,146,150,154,157,160,162,164,129,133,138,141,145,149,153,156,159', +'163,167,128,132,137,140,144,148,152,155,158,161,166,127,131,136,139', +'143,147,135,,,,,,,,165,,,,,,,,,,,,,,,,146,150,154,157,160,162,164,129', +'133,138,141,145,149,153,156,159,163,167,128,132,137,140,144,148,152', +'155,158,161,166,127,131,136,139,143,147,135,,,,,,,,165,,,,,,,,,,,,,', +',,146,150,154,157,160,162,164,129,133,138,141,145,149,153,156,159,163', +'167,128,132,137,140,144,148,152,155,158,161,166,127,131,136,139,143', +'147,135,,,,,,,,165,,,,,,,,,,,,,,,,146,150,154,157,160,162,164,129,133', +'138,141,145,149,153,156,159,163,167,128,132,137,140,144,148,152,155', +'158,161,166,127,131,136,139,143,147,165,,,,,,,,,,,,,,,,146,150,154,157', +'160,162,164,129,133,138,141,145,149,153,156,159,163,167,128,132,137', +'140,144,148,152,155,158,161,166,127,131,136,139,143,147,165,,,,,,,,', +',,,,,,,146,150,154,157,160,162,164,129,133,138,141,145,149,153,156,159', +'163,167,128,132,137,140,144,148,152,155,158,161,166,127,131,136,139', +'143,147,165,,,,,,,,,,,,,,,,146,150,154,157,160,162,164,129,133,138,141', +'145,149,153,156,159,163,167,128,132,137,140,144,148,152,155,158,161', +'166,127,131,136,139,143,147,146,150,154,157,160,162,164,129,133,138', +'141,145,149,153,156,159,163,167,128,132,137,140,144,148,152,155,158', +'161,166,127,131,136,139,143,147,146,150,154,157,160,162,164,129,133', +'138,141,145,149,153,156,159,163,167,128,132,137,140,144,148,152,155', +'158,161,166,127,131,136,139,143,147,146,150,154,157,160,162,164,129', +'133,138,141,145,149,153,156,159,163,167,128,132,137,140,144,148,152', +'155,158,161,166,127,131,136,139,143,147,146,150,154,157,160,162,164', +'129,133,138,141,145,149,153,156,159,163,167,128,132,137,140,144,148', +'152,155,158,161,166,127,131,136,139,143,147,146,150,154,157,160,162', +'164,129,133,138,141,145,149,153,156,159,163,167,128,132,137,140,144', +'148,152,155,158,161,166,127,131,136,139,143,147,146,150,154,157,160', +'162,164,129,133,138,141,145,149,153,156,159,163,167,128,132,137,140', +'144,148,152,155,158,161,166,127,131,136,139,143,147,146,150,154,157', +'160,162,164,129,133,138,141,145,149,153,156,159,163,167,128,132,137', +'140,144,148,152,155,158,161,166,127,131,136,139,143,147,146,150,154', +'157,160,162,164,129,133,138,141,145,149,153,156,159,163,167,128,132', +'137,140,144,148,152,155,158,161,166,127,131,136,139,143,147' ] + racc_action_table = arr = Array.new(10987, nil) idx = 0 clist.each do |str| str.split(',', -1).each do |i| @@ -385,382 +387,382 @@ def on_error(error_token_id, error_value, value_stack) end clist = [ -'115,207,115,170,170,170,170,170,170,170,170,170,170,70,70,70,82,161', -'255,255,255,184,70,191,70,214,214,255,184,255,170,170,115,115,29,29', -'29,115,214,292,272,115,130,29,70,29,292,170,206,191,98,98,98,65,98,93', +'115,111,115,170,170,170,170,170,170,170,170,170,170,269,36,82,259,254', +'254,254,272,269,191,257,214,214,254,184,254,32,170,170,115,115,292,184', +'250,115,214,246,246,115,292,243,243,111,111,111,170,191,94,296,111,218', +'218,81,269,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115', '115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115', -'115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115', -'115,70,78,82,191,191,191,170,203,170,170,154,170,115,154,154,154,154', -'154,154,154,154,154,154,111,296,260,260,154,259,189,154,154,279,203', -'280,190,154,189,261,154,154,154,154,190,186,96,269,154,154,78,154,121', -'154,154,269,211,154,154,243,243,181,181,154,154,154,154,154,154,111', -'111,111,189,296,154,154,111,261,190,203,203,203,245,245,261,53,25,261', -'41,269,186,186,186,94,25,83,83,121,121,126,126,94,257,154,154,124,124', -'69,154,293,154,154,136,154,102,136,136,136,136,136,136,136,136,136,136', -'103,190,190,25,136,25,35,136,136,104,94,205,94,136,310,310,136,136,136', -'136,117,117,174,174,136,136,31,136,202,136,136,236,236,136,136,75,90', -'90,90,136,136,136,136,136,136,90,179,90,116,116,136,136,225,225,225', -'225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225', -'225,225,225,218,218,114,114,136,136,173,173,309,136,81,136,136,5,136', -'119,5,5,5,5,5,5,5,5,5,5,254,254,254,2,5,288,288,5,5,254,123,254,1,5', -'66,66,5,5,5,5,240,240,85,85,5,5,180,5,247,5,5,88,88,5,5,,89,89,89,5', -'5,5,5,5,5,89,,89,61,61,5,5,241,241,241,241,241,241,241,241,241,241,241', -'241,241,241,241,241,241,241,241,241,241,241,241,,,,,5,5,,,,5,,5,5,7', -'5,,7,7,7,7,7,7,7,7,7,7,,,,,7,,,7,7,,,,,7,,,7,7,7,7,,,,,7,7,,7,,7,7,', -',7,7,,,,,7,7,7,7,7,7,,,,,,7,7,220,220,220,220,220,220,220,220,220,220', -'220,220,220,220,220,220,220,220,220,220,220,220,220,,,,,7,7,,,,7,,7', -'7,10,7,,10,10,10,10,10,10,10,10,10,10,,,,,10,,,10,10,,,,,10,,,10,10', -'10,10,,,,,10,10,,10,,10,10,,,10,10,,,,,10,10,10,10,10,10,,,,,,10,10', -'216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216,216', -'216,216,216,216,216,216,,,,,10,10,,,,10,,10,10,12,10,,12,12,12,12,12', -'12,12,12,12,12,,,,,12,,,12,12,,,,,12,,,12,12,12,12,,,,,12,12,,12,,12', -'12,,,12,12,,,,,12,12,12,12,12,12,,,,,,12,12,238,238,238,238,238,238', -'238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238', -',,,,12,12,,,,12,,12,12,13,12,,13,13,13,13,13,13,13,13,13,13,,,,,13,', -',13,13,,,,,13,,,13,13,13,13,,,,,13,13,,13,,13,13,,,13,13,,,,,13,13,13', -'13,13,13,,,,,,13,13,232,232,232,232,232,232,232,232,232,232,232,232', -'232,232,232,232,232,232,232,232,232,232,232,,,,,13,13,,,,13,,13,13,16', -'13,,16,16,16,16,16,16,16,16,16,16,,,,,16,,,16,16,,,,,16,,,16,16,16,16', -',,,,16,16,,16,,16,16,,,16,16,,,,,16,16,16,16,16,16,,,,,,16,16,234,234', -'234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234', -'234,234,234,234,,,,,16,16,,,,16,,16,16,135,16,,135,135,135,135,135,135', -'135,135,135,135,,,,,135,,,135,135,,,,,135,,,135,135,135,135,,,,,135', -'135,,135,,135,135,,,135,135,,,,,135,135,135,135,135,135,,,,,,135,135', -'228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228', -'228,228,228,228,228,228,,,,,135,135,,,,135,,135,135,21,135,,21,21,21', -'21,21,21,21,21,21,21,,,,,21,,,21,21,,,,,21,,,21,21,21,21,,,,,21,21,', -'21,,21,21,,,21,21,,,,,21,21,21,21,21,21,,,,,,21,21,249,249,249,249,249', -'249,249,249,249,249,249,249,249,249,249,221,221,221,221,221,221,221', -'221,221,,,,21,21,,,,21,,21,21,134,21,,134,134,134,134,134,134,134,134', -'134,134,,,,,134,,,134,134,,,,,134,,,134,134,134,134,,,,,134,134,,134', -',134,134,,,134,134,,,,,134,134,134,134,134,134,,,,,,134,134,252,252', -'252,252,252,252,252,252,252,252,252,252,252,252,252,229,229,229,229', -'229,229,229,229,229,,,,134,134,,,,134,,134,134,311,134,,311,311,311', -'311,311,311,311,311,311,311,,,,,311,,,311,311,,,,,311,,,311,311,311', -'311,,,,,311,311,,311,,311,311,,,311,311,,,,,311,311,311,311,311,311', -',,,,,311,311,246,246,246,246,246,246,246,246,246,246,246,246,246,246', -'246,233,233,233,233,233,233,233,233,233,,,,311,311,,,,311,,311,311,133', -'311,,133,133,133,133,133,133,133,133,133,133,,,,,133,,,133,133,,,,,133', -',,133,133,133,133,,,,,133,133,,133,,133,133,,,133,133,,,,,133,133,133', -'133,133,133,,,,,,133,133,242,242,242,242,242,242,242,242,242,242,242', -'242,242,242,242,239,239,239,239,239,239,239,239,239,,,,133,133,,,,133', -',133,133,132,133,,132,132,132,132,132,132,132,132,132,132,,,,,132,,', -'132,132,,,,,132,,,132,132,132,132,,,,,132,132,,132,,132,132,,,132,132', -',,,,132,132,132,132,132,132,,,,,,132,132,235,235,235,235,235,235,235', -'235,235,226,226,226,226,226,226,226,226,226,217,217,217,217,217,217', -'217,,,132,132,,,,132,,132,132,32,132,,32,32,32,32,32,32,32,32,32,32', -',,,,32,,,32,32,,,,,32,,,32,32,32,32,,,,,32,32,,32,,32,32,,,32,32,,,', -',32,32,32,32,32,32,,,,,,32,32,253,253,253,253,253,253,253,,,,,,,,,,', -',,,,,,,,,,32,32,,,,32,,32,32,34,32,,34,34,34,34,34,34,34,34,34,34,,', -',,34,,,34,34,,,,,34,,,34,34,34,34,,,,,34,34,,34,,34,34,,,34,34,34,,', -',34,34,34,34,34,34,,,,,,34,34,,,,,,,,,,,,,,,,,,,,,,,,,,,,34,34,,,,34', -',34,34,299,34,,299,299,299,299,299,299,299,299,299,299,,,,,299,,,299', -'299,,,,,299,,,299,299,299,299,,,,,299,299,,299,,299,299,,,299,299,,', -',,299,299,299,299,299,299,,,,,299,299,299,,,,,,,,,,,,,,,,,,,,,,,,,,', -',299,299,,,,299,,299,299,37,299,,37,37,37,37,37,37,37,37,37,37,,,,,37', -',,37,37,,,,,37,,,37,37,37,37,,,,,37,37,,37,,37,37,,,37,37,,,,,37,37', -'37,37,37,37,,,,,,37,37,,,,,,,,,,,,,,,,,,,,,,,,,,,,37,37,,,,37,,37,37', -'40,37,,40,40,40,40,40,40,40,40,40,40,,,,,40,,,40,40,,,,,40,,,40,40,40', -'40,,,,,40,40,,40,,40,40,,,40,40,,,,,40,40,40,40,40,40,,,,,,40,40,,,', -',,,,,,,,,,,,,,,,,,,,,,,,40,40,,,,40,,40,40,287,40,,287,287,287,287,287', -'287,287,287,287,287,,,,,287,,,287,287,,,,,287,,,287,287,287,287,,,,', -'287,287,,287,,287,287,,,287,287,,,,,287,287,287,287,287,287,,,,,,287', -'287,,,,,,,,,,,,,,,,,,,,,,,,,,,,287,287,,,,287,,287,287,44,287,,44,44', -'44,44,44,44,44,44,44,44,,,,,44,,,44,44,,,,,44,,,44,44,44,44,,,,,44,44', -',44,,44,44,,,44,44,,,,,44,44,44,44,44,44,,,,,,44,44,,,,,,,,,,,,,,,,', -',,,,,,,,,,,44,44,,,,44,,44,44,52,44,,52,52,52,52,52,52,52,52,52,52,', -',,,52,,,52,52,,,,,52,,,52,52,52,52,,,,,52,52,,52,,52,52,,,52,52,,,,', -'52,52,52,52,52,52,,,,,,52,52,,,,,,,,,,,,,,,,,,,,,,,,,,,,52,52,,,,52', -',52,52,286,52,,286,286,286,286,286,286,286,286,286,286,,,,,286,,,286', -'286,,,,,286,,,286,286,286,286,,,,,286,286,,286,,286,286,,,286,286,,', -',,286,286,286,286,286,286,,,,,,286,286,,,,,,,,,,,,,,,,,,,,,,,,,,,,286', -'286,,,,286,,286,286,54,286,,54,54,54,54,54,54,54,54,54,54,,,,,54,,,54', -'54,,,,,54,,,54,54,54,54,,,,,54,54,,54,,54,54,,,54,54,,54,,,54,54,54', -'54,54,54,,,,,,54,54,,,,,,,,,,,,,,,,,,,,,,,,,,,,54,54,,,,54,,54,54,277', -'54,,277,277,277,277,277,277,277,277,277,277,,,,,277,,,277,277,,,,,277', -',,277,277,277,277,,,,,277,277,,277,,277,277,,,277,277,,,,,277,277,277', -'277,277,277,,,,,277,277,277,,,,,,,,,,,,,,,,,,,,,,,,,,,,277,277,,,,277', -',277,277,275,277,,275,275,275,275,275,275,275,275,275,275,,,,,275,,', -'275,275,,,,,275,,,275,275,275,275,,,,,275,275,,275,,275,275,,,275,275', -',,,,275,275,275,275,275,275,,,,,,275,275,,,,,,,,,,,,,,,,,,,,,,,,,,,', -'275,275,,,,275,,275,275,274,275,,274,274,274,274,274,274,274,274,274', -'274,,,,,274,,,274,274,,,,,274,,,274,274,274,274,,,,,274,274,,274,,274', -'274,,,274,274,,,,,274,274,274,274,274,274,,,,,,274,274,,,,,,,,,,,,,', -',,,,,,,,,,,,,,274,274,,,,274,,274,274,67,274,,67,67,67,67,67,67,67,67', -'67,67,,,,,67,,,67,67,,,,,67,,,67,67,67,67,,,,,67,67,,67,,67,67,,,67', -'67,,,,,67,67,67,67,67,67,,,,,,67,67,,,,,,,,,,,,,,,,,,,,,,,,,,,,67,67', -',,,67,,67,67,262,67,,262,262,262,262,262,262,262,262,262,262,,,,,262', -',,262,262,,,,,262,,,262,262,262,262,,,,,262,262,,262,,262,262,,,262', -'262,,,,,262,262,262,262,262,262,,,,,,262,262,,,,,,,,,,,,,,,,,,,,,,,', -',,,,262,262,,,,262,,262,262,213,262,,213,213,213,213,213,213,213,213', -'213,213,,,,,213,,,213,213,,,,,213,,,213,213,213,213,,,,,213,213,,213', -',213,213,,,213,213,,,,,213,213,213,213,213,213,,,,,,213,213,,,,,,,,', -',,,,,,,,,,,,,,,,,,,213,213,,,,213,,213,213,212,213,,212,212,212,212', -'212,212,212,212,212,212,,,,,212,,,212,212,,,,,212,,,212,212,212,212', -',,,,212,212,,212,,212,212,,,212,212,,,,,212,212,212,212,212,212,,,,', -',212,212,,,,,,,,,,,,,,,,,,,,,,,,,,,,212,212,,,,212,,212,212,71,212,', -'71,71,71,71,71,71,71,71,71,71,,,,,71,,,71,71,,,,,71,,,71,71,71,71,,', -',,71,71,,71,,71,71,,,71,71,,,,,71,71,71,71,71,71,,,,,,71,71,,,,,,,,', -',,,,,,,,,,,,,,,,,,,71,71,,,,71,,71,71,74,71,,74,74,74,74,74,74,74,74', -'74,74,,,,,74,,,74,74,,,,,74,,,74,74,74,74,,,,,74,74,,74,,74,74,,,74', -'74,,,,,74,74,74,74,74,74,,,,,,74,74,,,,,,,,,,,,,,,,,,,,,,,,,,,,74,74', -',,,74,,74,74,201,74,,201,201,201,201,201,201,201,201,201,201,,,,,201', -',,201,201,,,,,201,,,201,201,201,201,,,,,201,201,,201,,201,201,,,201', -'201,201,,,,201,201,201,201,201,201,,,,,,201,201,,,,,,,,,,,,,,,,,,,,', -',,,,,,,201,201,201,201,,201,,201,201,200,201,,200,200,200,200,200,200', -'200,200,200,200,,,,,200,,,200,200,,,,,200,,,200,200,200,200,,,,,200', -'200,,200,,200,200,,,200,200,,,,,200,200,200,200,200,200,,,,,,200,200', -',,,,,,,,,,,,,,,,,,,,,,,,,,,200,200,,,,200,,200,200,131,200,,131,131', -'131,131,131,131,131,131,131,131,,,,,131,,,131,131,,,,,131,,,131,131', -'131,131,,,,,131,131,,131,,131,131,,,131,131,,,,,131,131,131,131,131', -'131,,,,,,131,131,,,,,,,,,,,,,,,,,,,,,,,,,,,,131,131,,,,131,,131,131', -'187,131,,187,187,187,187,187,187,187,187,187,187,,,,,187,,,187,187,', -',,,187,,,187,187,187,187,,,,,187,187,,187,,187,187,,,187,187,,,,,187', -'187,187,187,187,187,,,,,,187,187,,,,,,,,,,,,,,,,,,,,,,,,,,,,187,187', -',,,187,,187,187,185,187,,185,185,185,185,185,185,185,185,185,185,,,', -',185,,,185,185,,,,,185,,,185,185,185,185,,,,,185,185,,185,,185,185,', +'115,115,115,82,191,191,191,78,170,296,170,170,143,170,115,143,143,143', +'143,143,143,143,143,143,143,261,203,279,121,143,288,288,143,143,240', +'240,280,190,143,187,96,143,143,143,143,190,88,88,41,143,143,53,143,203', +'143,143,78,248,248,143,143,116,116,261,103,143,143,143,143,143,143,261', +'121,121,261,211,143,143,117,117,190,62,62,187,187,187,26,99,99,99,164', +'99,97,189,26,118,118,203,203,203,97,189,310,310,143,143,173,173,293', +'143,207,143,143,299,143,104,299,299,299,299,299,299,299,299,299,299', +'2,190,190,26,299,26,105,299,299,97,189,97,206,299,174,174,299,299,299', +'299,89,89,67,67,299,299,205,299,202,299,299,83,83,75,299,299,66,70,70', +'70,299,299,299,299,299,299,70,309,70,69,299,299,299,249,249,249,249', +'249,249,249,249,249,249,249,249,249,249,249,70,70,260,260,255,255,255', +'181,181,85,85,299,299,255,1,255,299,120,299,299,5,299,179,5,5,5,5,5', +'5,5,5,5,5,30,30,30,124,5,125,125,5,5,30,130,30,180,5,,,5,5,5,5,,,,,5', +'5,,5,,5,5,,,,5,5,,90,90,90,5,5,5,5,5,5,90,,90,,,5,5,244,244,244,244', +'244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244', +'244,244,,,,5,5,,,,5,,5,5,7,5,,7,7,7,7,7,7,7,7,7,7,91,91,91,,7,,,7,7', +'91,,91,,7,,,7,7,7,7,,,,,7,7,,7,,7,7,,,,7,7,,,,,7,7,7,7,7,7,,,,,,7,7', +'232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232', +'232,232,232,232,232,232,,,,7,7,,,,7,,7,7,10,7,,10,10,10,10,10,10,10', +'10,10,10,,,,,10,,,10,10,,,,,10,,,10,10,10,10,,,,,10,10,,10,,10,10,,', +',10,10,,,,,10,10,10,10,10,10,,,,,,10,10,228,228,228,228,228,228,228', +'228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,,,,10', +'10,,,,10,,10,10,12,10,,12,12,12,12,12,12,12,12,12,12,,,,,12,,,12,12', +',,,,12,,,12,12,12,12,,,,,12,12,,12,,12,12,,,,12,12,,,,,12,12,12,12,12', +'12,,,,,,12,12,225,225,225,225,225,225,225,225,225,225,225,225,225,225', +'225,225,225,225,225,225,225,225,225,,,,12,12,,,,12,,12,12,13,12,,13', +'13,13,13,13,13,13,13,13,13,,,,,13,,,13,13,,,,,13,,,13,13,13,13,,,,,13', +'13,,13,,13,13,,,,13,13,,,,,13,13,13,13,13,13,,,,,,13,13,241,241,241', +'241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241,241', +'241,241,241,,,,13,13,,,,13,,13,13,16,13,,16,16,16,16,16,16,16,16,16', +'16,,,,,16,,,16,16,,,,,16,,,16,16,16,16,,,,,16,16,,16,,16,16,,,,16,16', +',,,,16,16,16,16,16,16,,,,,,16,16,238,238,238,238,238,238,238,238,238', +'238,238,238,238,238,238,238,238,238,238,238,238,238,238,,,,16,16,,,', +'16,,16,16,19,16,,19,19,19,19,19,19,19,19,19,19,,,,,19,,,19,19,,,,,19', +',,19,19,19,19,,,,,19,19,,19,,19,19,,,,19,19,,,,,19,19,19,19,19,19,,', +',,,19,19,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235', +'235,235,235,235,235,235,235,235,,,,19,19,,,,19,,19,19,287,19,,287,287', +'287,287,287,287,287,287,287,287,,,,,287,,,287,287,,,,,287,,,287,287', +'287,287,,,,,287,287,,287,,287,287,,,,287,287,,,,,287,287,287,287,287', +'287,,,,,,287,287,220,220,220,220,220,220,220,220,220,220,220,220,220', +'220,220,220,220,220,220,220,220,220,220,,,,287,287,,,,287,,287,287,22', +'287,,22,22,22,22,22,22,22,22,22,22,,,,,22,,,22,22,,,,,22,,,22,22,22', +'22,,,,,22,22,,22,,22,22,,,,22,22,,,,,22,22,22,22,22,22,,,,,,22,22,245', +'245,245,245,245,245,245,245,245,245,245,245,245,245,245,226,226,226', +'226,226,226,226,226,226,,,22,22,,,,22,,22,22,286,22,,286,286,286,286', +'286,286,286,286,286,286,,,,,286,,,286,286,,,,,286,,,286,286,286,286', +',,,,286,286,,286,,286,286,,,,286,286,,,,,286,286,286,286,286,286,,,', +',,286,286,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253', +'229,229,229,229,229,229,229,229,229,,,286,286,,,,286,,286,286,277,286', +',277,277,277,277,277,277,277,277,277,277,,,,,277,,,277,277,,,,,277,', +',277,277,277,277,,,,,277,277,,277,,277,277,,,,277,277,,,,,277,277,277', +'277,277,277,,,,,277,277,277,216,216,216,216,216,216,216,216,216,216', +'216,216,216,216,216,233,233,233,233,233,233,233,233,233,,,277,277,,', +',277,,277,277,275,277,,275,275,275,275,275,275,275,275,275,275,,,,,275', +',,275,275,,,,,275,,,275,275,275,275,,,,,275,275,,275,,275,275,,,,275', +'275,,,,,275,275,275,275,275,275,,,,,,275,275,242,242,242,242,242,242', +'242,242,242,239,239,239,239,239,239,239,239,239,217,217,217,217,217', +'217,217,,275,275,,,,275,,275,275,274,275,,274,274,274,274,274,274,274', +'274,274,274,,,,,274,,,274,274,,,,,274,,,274,274,274,274,,,,,274,274', +',274,,274,274,,,,274,274,,,,,274,274,274,274,274,274,,,,,,274,274,236', +'236,236,236,236,236,236,236,236,221,221,221,221,221,221,221,,,,,,,,', +',,274,274,,,,274,,274,274,33,274,,33,33,33,33,33,33,33,33,33,33,,,,', +'33,,,33,33,,,,,33,,,33,33,33,33,,,,,33,33,,33,,33,33,,,,33,33,,,,,33', +'33,33,33,33,33,,,,,,33,33,,,,,,,,,,,,,,,,,,,,,,,,,,,33,33,,,,33,,33', +'33,35,33,,35,35,35,35,35,35,35,35,35,35,,,,,35,,,35,35,,,,,35,,,35,35', +'35,35,,,,,35,35,,35,,35,35,,,,35,35,35,,,,35,35,35,35,35,35,,,,,,35', +'35,,,,,,,,,,,,,,,,,,,,,,,,,,,35,35,,,,35,,35,35,262,35,,262,262,262', +'262,262,262,262,262,262,262,,,,,262,,,262,262,,,,,262,,,262,262,262', +'262,,,,,262,262,,262,,262,262,,,,262,262,,,,,262,262,262,262,262,262', +',,,,,262,262,,,,,,,,,,,,,,,,,,,,,,,,,,,262,262,,,,262,,262,262,40,262', +',40,40,40,40,40,40,40,40,40,40,,,,,40,,,40,40,,,,,40,,,40,40,40,40,', +',,,40,40,,40,,40,40,,,,40,40,,,,,40,40,40,40,40,40,,,,,,40,40,,,,,,', +',,,,,,,,,,,,,,,,,,,,40,40,,,,40,,40,40,213,40,,213,213,213,213,213,213', +'213,213,213,213,,,,,213,,,213,213,,,,,213,,,213,213,213,213,,,,,213', +'213,,213,,213,213,,,,213,213,,,,,213,213,213,213,213,213,,,,,,213,213', +',,,,,,,,,,,,,,,,,,,,,,,,,,213,213,,,,213,,213,213,44,213,,44,44,44,44', +'44,44,44,44,44,44,,,,,44,,,44,44,,,,,44,,,44,44,44,44,,,,,44,44,,44', +',44,44,,,,44,44,,,,,44,44,44,44,44,44,,,,,,44,44,,,,,,,,,,,,,,,,,,,', +',,,,,,,44,44,,,,44,,44,44,47,44,,47,47,47,47,47,47,47,47,47,47,,,,,47', +',,47,47,,,,,47,,,47,47,47,47,,,,,47,47,,47,,47,47,,,,47,47,,,,,47,47', +'47,47,47,47,,,,,,47,47,,,,,,,,,,,,,,,,,,,,,,,,,,,47,47,,,,47,,47,47', +'52,47,,52,52,52,52,52,52,52,52,52,52,,,,,52,,,52,52,,,,,52,,,52,52,52', +'52,,,,,52,52,,52,,52,52,,,,52,52,,,,,52,52,52,52,52,52,,,,,,52,52,,', +',,,,,,,,,,,,,,,,,,,,,,,,52,52,,,,52,,52,52,212,52,,212,212,212,212,212', +'212,212,212,212,212,,,,,212,,,212,212,,,,,212,,,212,212,212,212,,,,', +'212,212,,212,,212,212,,,,212,212,,,,,212,212,212,212,212,212,,,,,,212', +'212,,,,,,,,,,,,,,,,,,,,,,,,,,,212,212,,,,212,,212,212,59,212,,59,59', +'59,59,59,59,59,59,59,59,,,,,59,,,59,59,,,,,59,,,59,59,59,59,,,,,59,59', +',59,,59,59,,,,59,59,,59,,,59,59,59,59,59,59,,,,,,59,59,,,,,,,,,,,,,', +',,,,,,,,,,,,,59,59,,,,59,,59,59,200,59,,200,200,200,200,200,200,200', +'200,200,200,,,,,200,,,200,200,,,,,200,,,200,200,200,200,,,,,200,200', +',200,,200,200,,,,200,200,200,,,,200,200,200,200,200,200,,,,,,200,200', +',,,,,,,,,,,,,,,,,,,,,,,,,,200,200,200,200,,200,,200,200,199,200,,199', +'199,199,199,199,199,199,199,199,199,,,,,199,,,199,199,,,,,199,,,199', +'199,199,199,,,,,199,199,,199,,199,199,,,,199,199,,,,,199,199,199,199', +'199,199,,,,,,199,199,,,,,,,,,,,,,,,,,,,,,,,,,,,199,199,,,,199,,199,199', +'186,199,,186,186,186,186,186,186,186,186,186,186,,,,,186,,,186,186,', +',,,186,,,186,186,186,186,,,,,186,186,,186,,186,186,,,,186,186,,,,,186', +'186,186,186,186,186,,,,,,186,186,,,,,,,,,,,,,,,,,,,,,,,,,,,186,186,', +',,186,,186,186,185,186,,185,185,185,185,185,185,185,185,185,185,,,,', +'185,,,185,185,,,,,185,,,185,185,185,185,,,,,185,185,,185,,185,185,,', ',185,185,,,,,185,185,185,185,185,185,,,,,,185,185,,,,,,,,,,,,,,,,,,', -',,,,,,,,,185,185,,,,185,,185,185,171,185,,171,171,171,171,171,171,171', +',,,,,,,,185,185,,,,185,,185,185,171,185,,171,171,171,171,171,171,171', '171,171,171,,,,,171,,,171,171,,,,,171,,,171,171,171,171,,,,,171,171', -',171,,171,171,,,171,171,,,,,171,171,171,171,171,171,,,,,,171,171,,,', -',,,,,,,,,,,,,,,,,,,,,,,,171,171,,,,171,,171,171,138,171,,138,138,138', -'138,138,138,138,138,138,138,,,,,138,,,138,138,,,,,138,,,138,138,138', -'138,,,,,138,138,,138,,138,138,,,138,138,,,,,138,138,138,138,138,138', -',,,,,138,138,,,,,,,,,,,,,,,,,,,,,,,,,,,,138,138,,,,138,,138,138,167', -'138,,167,167,167,167,167,167,167,167,167,167,,,,,167,,,167,167,,,,,167', -',,167,167,167,167,,,,,167,167,,167,,167,167,,,167,167,,,,,167,167,167', -'167,167,167,,,,,,167,167,,,,,,,,,,,,,,,,,,,,,,,,,,,,167,167,,,,167,', -'167,167,128,167,,128,128,128,128,128,128,128,128,128,128,,,,,128,,,128', -'128,,,,,128,,,128,128,128,128,,,,,128,128,,128,,128,128,,,128,128,,', -',,128,128,128,128,128,128,,,,,,128,128,,,,,,,,,,,,,,,,,,,,,,,,,,,,128', -'128,,,,128,,128,128,165,128,,165,165,165,165,165,165,165,165,165,165', -',,,,165,,,165,165,,,,,165,,,165,165,165,165,,,,,165,165,,165,,165,165', -',,165,165,,,,,165,165,165,165,165,165,,,,,,165,165,,,,,,,,,,,,,,,,,', -',,,,,,,,,,165,165,,,,165,,165,165,164,165,,164,164,164,164,164,164,164', -'164,164,164,,,,,164,,,164,164,,,,,164,,,164,164,164,164,,,,,164,164', -',164,,164,164,,,164,164,,,,,164,164,164,164,164,164,,,,,,164,164,,,', -',,,,,,,,,,,,,,,,,,,,,,,,164,164,,,,164,,164,164,163,164,,163,163,163', -'163,163,163,163,163,163,163,,,,,163,,,163,163,,,,,163,,,163,163,163', -'163,,,,,163,163,,163,,163,163,,,163,163,,,,,163,163,163,163,163,163', -',,,,,163,163,,,,,,,,,,,,,,,,,,,,,,,,,,,,163,163,,,,163,,163,163,162', -'163,,162,162,162,162,162,162,162,162,162,162,,,,,162,,,162,162,,,,,162', -',,162,162,162,162,,,,,162,162,,162,,162,162,,,162,162,,,,,162,162,162', -'162,162,162,,,,,,162,162,,,,,,,,,,,,,,,,,,,,,,,,,,,,162,162,,,,162,', -'162,162,160,162,,160,160,160,160,160,160,160,160,160,160,,,,,160,,,160', -'160,,,,,160,,,160,160,160,160,,,,,160,160,,160,,160,160,,,160,160,,', -',,160,160,160,160,160,160,,,,,,160,160,,,,,,,,,,,,,,,,,,,,,,,,,,,,160', -'160,,,,160,,160,160,129,160,,129,129,129,129,129,129,129,129,129,129', -',,,,129,,,129,129,,,,,129,,,129,129,129,129,,,,,129,129,,129,,129,129', -',,129,129,,,,,129,129,129,129,129,129,,,,,,129,129,,,,,,,,,,,,,,,,,', -',,,,,,,,,,129,129,,,,129,,129,129,158,129,,158,158,158,158,158,158,158', +',171,,171,171,,,,171,171,,,,,171,171,171,171,171,171,,,,,,171,171,,', +',,,,,,,,,,,,,,,,,,,,,,,,171,171,,,,171,,171,171,167,171,,167,167,167', +'167,167,167,167,167,167,167,,,,,167,,,167,167,,,,,167,,,167,167,167', +'167,,,,,167,167,,167,,167,167,,,,167,167,,,,,167,167,167,167,167,167', +',,,,,167,167,,,,,,,,,,,,,,,,,,,,,,,,,,,167,167,,,,167,,167,167,71,167', +',71,71,71,71,71,71,71,71,71,71,,,,,71,,,71,71,,,,,71,,,71,71,71,71,', +',,,71,71,,71,,71,71,,,,71,71,,,,,71,71,71,71,71,71,,,,,,71,71,,,,,,', +',,,,,,,,,,,,,,,,,,,,71,71,,,,71,,71,71,74,71,,74,74,74,74,74,74,74,74', +'74,74,,,,,74,,,74,74,,,,,74,,,74,74,74,74,,,,,74,74,,74,,74,74,,,,74', +'74,,,,,74,74,74,74,74,74,,,,,,74,74,,,,,,,,,,,,,,,,,,,,,,,,,,,74,74', +',,,74,,74,74,166,74,,166,166,166,166,166,166,166,166,166,166,,,,,166', +',,166,166,,,,,166,,,166,166,166,166,,,,,166,166,,166,,166,166,,,,166', +'166,,,,,166,166,166,166,166,166,,,,,,166,166,,,,,,,,,,,,,,,,,,,,,,,', +',,,166,166,,,,166,,166,166,165,166,,165,165,165,165,165,165,165,165', +'165,165,,,,,165,,,165,165,,,,,165,,,165,165,165,165,,,,,165,165,,165', +',165,165,,,,165,165,,,,,165,165,165,165,165,165,,,,,,165,165,,,,,,,', +',,,,,,,,,,,,,,,,,,,165,165,,,,165,,165,165,163,165,,163,163,163,163', +'163,163,163,163,163,163,,,,,163,,,163,163,,,,,163,,,163,163,163,163', +',,,,163,163,,163,,163,163,,,,163,163,,,,,163,163,163,163,163,163,,,', +',,163,163,,,,,,,,,,,,,,,,,,,,,,,,,,,163,163,,,,163,,163,163,161,163', +',161,161,161,161,161,161,161,161,161,161,,,,,161,,,161,161,,,,,161,', +',161,161,161,161,,,,,161,161,,161,,161,161,,,,161,161,,,,,161,161,161', +'161,161,161,,,,,,161,161,,,,,,,,,,,,,,,,,,,,,,,,,,,161,161,,,,161,,161', +'161,160,161,,160,160,160,160,160,160,160,160,160,160,,,,,160,,,160,160', +',,,,160,,,160,160,160,160,,,,,160,160,,160,,160,160,,,,160,160,,,,,160', +'160,160,160,160,160,,,,,,160,160,,,,,,,,,,,,,,,,,,,,,,,,,,,160,160,', +',,160,,160,160,159,160,,159,159,159,159,159,159,159,159,159,159,,,,', +'159,,,159,159,,,,,159,,,159,159,159,159,,,,,159,159,,159,,159,159,,', +',159,159,,,,,159,159,159,159,159,159,,,,,,159,159,,,,,,,,,,,,,,,,,,', +',,,,,,,,159,159,,,,159,,159,159,158,159,,158,158,158,158,158,158,158', '158,158,158,,,,,158,,,158,158,,,,,158,,,158,158,158,158,,,,,158,158', -',158,,158,158,,,158,158,,,,,158,158,158,158,158,158,,,,,,158,158,,,', +',158,,158,158,,,,158,158,,,,,158,158,158,158,158,158,,,,,,158,158,,', ',,,,,,,,,,,,,,,,,,,,,,,,158,158,,,,158,,158,158,157,158,,157,157,157', '157,157,157,157,157,157,157,,,,,157,,,157,157,,,,,157,,,157,157,157', -'157,,,,,157,157,,157,,157,157,,,157,157,,,,,157,157,157,157,157,157', -',,,,,157,157,,,,,,,,,,,,,,,,,,,,,,,,,,,,157,157,,,,157,,157,157,156', -'157,,156,156,156,156,156,156,156,156,156,156,,,,,156,,,156,156,,,,,156', -',,156,156,156,156,,,,,156,156,,156,,156,156,,,156,156,,,,,156,156,156', -'156,156,156,,,,,,156,156,,,,,,,,,,,,,,,,,,,,,,,,,,,,156,156,,,,156,', -'156,156,100,156,,100,100,100,100,100,100,100,100,100,100,,,,,100,,,100', -'100,,,,,100,,,100,100,100,100,,,,,100,100,,100,,100,100,,,100,100,100', -',,,100,100,100,100,100,100,,,,,,100,100,,,,,,,,,,,,,,,,,,,,,,,,,,,,100', -'100,,,,100,,100,100,101,100,,101,101,101,101,101,101,101,101,101,101', -',,,,101,,,101,101,,,,,101,,,101,101,101,101,,,,,101,101,,101,,101,101', -',,101,101,,,,,101,101,101,101,101,101,,,,,,101,101,,,,,,,,,,,,,,,,,', -',,,,,,,,,,101,101,,,,101,,101,101,155,101,,155,155,155,155,155,155,155', -'155,155,155,,,,,155,,,155,155,,,,,155,,,155,155,155,155,,,,,155,155', -',155,,155,155,,,155,155,,,,,155,155,155,155,155,155,,,,,,155,155,,,', -',,,,,,,,,,,,,,,,,,,,,,,,155,155,,,,155,,155,155,137,155,,137,137,137', -'137,137,137,137,137,137,137,,,,,137,,,137,137,,,,,137,,,137,137,137', -'137,,,,,137,137,,137,,137,137,,,137,137,,,,,137,137,137,137,137,137', -',,,,,137,137,,,,,,,,,,,,,,,,,,,,,,,,,,,,137,137,,,,137,,137,137,153', -'137,,153,153,153,153,153,153,153,153,153,153,,,,,153,,,153,153,,,,,153', -',,153,153,153,153,,,,,153,153,,153,,153,153,,,153,153,,,,,153,153,153', -'153,153,153,,,,,,153,153,,,,,,,,,,,,,,,,,,,,,,,,,,,,153,153,,,,153,', -'153,153,152,153,,152,152,152,152,152,152,152,152,152,152,,,,,152,,,152', -'152,,,,,152,,,152,152,152,152,,,,,152,152,,152,,152,152,,,152,152,,', -',,152,152,152,152,152,152,,,,,,152,152,,,,,,,,,,,,,,,,,,,,,,,,,,,,152', -'152,,,,152,,152,152,110,152,,110,110,110,110,110,110,110,110,110,110', -',,,,110,,,110,110,,,,,110,,,110,110,110,110,,,,,110,110,,110,,110,110', -',,110,110,,,,,110,110,110,110,110,110,,,,,,110,110,,,,,,,,,,,,,,,,,', -',,,,,,,,,,110,110,,,,110,,110,110,151,110,,151,151,151,151,151,151,151', -'151,151,151,,,,,151,,,151,151,,,,,151,,,151,151,151,151,,,,,151,151', -',151,,151,151,,,151,151,,,,,151,151,151,151,151,151,,,,,,151,151,,,', -',,,,,,,,,,,,,,,,,,,,,,,,151,151,,,,151,,151,151,150,151,,150,150,150', -'150,150,150,150,150,150,150,,,,,150,,,150,150,,,,,150,,,150,150,150', -'150,,,,,150,150,,150,,150,150,,,150,150,,,,,150,150,150,150,150,150', -',,,,,150,150,,,,,,,,,,,,,,,,,,,,,,,,,,,,150,150,,,,150,,150,150,113', -'150,,113,113,113,113,113,113,113,113,113,113,,,,,113,,,113,113,,,,,113', -',,113,113,113,113,,,,,113,113,,113,,113,113,,,113,113,113,,,,113,113', -'113,113,113,113,,,,,,113,113,,,,,,,,,,,,,,,,,,,,,,,,,,,,113,113,,,,113', -',113,113,149,113,,149,149,149,149,149,149,149,149,149,149,,,,,149,,', -'149,149,,,,,149,,,149,149,149,149,,,,,149,149,,149,,149,149,,,149,149', -',,,,149,149,149,149,149,149,,,,,,149,149,,,,,,,,,,,,,,,,,,,,,,,,,,,', -'149,149,,,,149,,149,149,0,149,,0,0,0,0,0,0,0,0,0,0,,,,,0,,,0,0,,,,,0', -',,0,0,0,0,,,,,0,0,,0,,0,0,,,0,0,0,,,,0,0,0,0,0,0,,,,,,0,0,,,,,,,,,,', -',,,,,,,,,,,,,,,,,0,0,0,0,,0,,0,0,148,0,,148,148,148,148,148,148,148', -'148,148,148,,,,,148,,,148,148,,,,,148,,,148,148,148,148,,,,,148,148', -',148,,148,148,,,148,148,,,,,148,148,148,148,148,148,,,,,,148,148,,,', -',,,,,,,,,,,,,,,,,,,,,,,,148,148,,,,148,,148,148,146,148,,146,146,146', -'146,146,146,146,146,146,146,,,,,146,,,146,146,,,,,146,,,146,146,146', -'146,,,,,146,146,,146,,146,146,,,146,146,,,,,146,146,146,146,146,146', -',,,,,146,146,,,,,,,,,,,,,,,,,,,,,,,,,,,,146,146,,,,146,,146,146,145', -'146,,145,145,145,145,145,145,145,145,145,145,,,,,145,,,145,145,,,,,145', -',,145,145,145,145,,,,,145,145,,145,,145,145,,,145,145,,,,,145,145,145', -'145,145,145,,,,,,145,145,,,,,,,,,,,,,,,,,,,,,,,,,,,,145,145,,,,145,', -'145,145,144,145,,144,144,144,144,144,144,144,144,144,144,,,,,144,,,144', -'144,,,,,144,,,144,144,144,144,,,,,144,144,,144,,144,144,,,144,144,,', -',,144,144,144,144,144,144,,,,,,144,144,,,,,,,,,,,,,,,,,,,,,,,,,,,,144', -'144,,,,144,,144,144,143,144,,143,143,143,143,143,143,143,143,143,143', -',,,,143,,,143,143,,,,,143,,,143,143,143,143,,,,,143,143,,143,,143,143', -',,143,143,,,,,143,143,143,143,143,143,,,,,,143,143,,,,,,,,,,,,,,,,,', -',,,,,,,,,,143,143,,,,143,,143,143,122,143,,122,122,122,122,122,122,122', -'122,122,122,,,,,122,,,122,122,,,,,122,,,122,122,122,122,,,,,122,122', -',122,,122,122,,,122,122,,,,,122,122,122,122,122,122,,,,,,122,122,,,', -',,,,,,,,,,,,,,,,,,,,,,,,122,122,,,,122,,122,122,141,122,,141,141,141', -'141,141,141,141,141,141,141,,,,,141,,,141,141,,,,,141,,,141,141,141', -'141,,,,,141,141,,141,,141,141,,,141,141,,,,,141,141,141,141,141,141', -',,,,,141,141,,,,,,,,,,,,,,,,,,,,,,,,,,,,141,141,,,,141,,141,141,140', -'141,,140,140,140,140,140,140,140,140,140,140,,,,,140,,,140,140,,,,,140', -',,140,140,140,140,,,,,140,140,,140,,140,140,,,140,140,,,,,140,140,140', -'140,140,140,,,,,,140,140,,,,,,,,,,,,,,,,,,,,,,,,,,,,140,140,,,,140,', -'140,140,139,140,,139,139,139,139,139,139,139,139,139,139,,,,,139,,,139', -'139,,,,,139,,,139,139,139,139,,,,,139,139,,139,,139,139,,,139,139,,', -',,139,139,139,139,139,139,,,,,,139,139,,,,,,,,,,,,,,,,,,,,,,,,,,,,139', -'139,,,,139,,139,139,127,139,,127,127,127,127,127,127,127,127,127,127', -',,,,127,,,127,127,,,,,127,,,127,127,127,127,,,,,127,127,,127,,127,127', -',,127,127,,,,,127,127,127,127,127,127,,,,,,127,127,,,,,,,,,,,,,,,,,', -',,,,,,,,,,127,127,,,,127,,127,127,166,127,,166,166,166,166,166,166,166', -'166,166,166,,,,,166,,,166,166,,,,,166,,,166,166,166,166,,,,,166,166', -',166,,166,166,,,166,166,314,,314,,166,166,166,166,166,166,,,,,,166,166', -',,,,,,,,,,,,,,,314,314,,,,314,,,,314,,,166,166,,,,166,,166,166,,166', -',314,314,314,314,314,314,314,314,314,314,314,314,314,314,314,314,314', +'157,,,,,157,157,,157,,157,157,,,,157,157,,,,,157,157,157,157,157,157', +',,,,,157,157,,,,,,,,,,,,,,,,,,,,,,,,,,,157,157,,,,157,,157,157,156,157', +',156,156,156,156,156,156,156,156,156,156,,,,,156,,,156,156,,,,,156,', +',156,156,156,156,,,,,156,156,,156,,156,156,,,,156,156,,,,,156,156,156', +'156,156,156,,,,,,156,156,,,,,,,,,,,,,,,,,,,,,,,,,,,156,156,,,,156,,156', +'156,155,156,,155,155,155,155,155,155,155,155,155,155,,,,,155,,,155,155', +',,,,155,,,155,155,155,155,,,,,155,155,,155,,155,155,,,,155,155,,,,,155', +'155,155,155,155,155,,,,,,155,155,,,,,,,,,,,,,,,,,,,,,,,,,,,155,155,', +',,155,,155,155,154,155,,154,154,154,154,154,154,154,154,154,154,,,,', +'154,,,154,154,,,,,154,,,154,154,154,154,,,,,154,154,,154,,154,154,,', +',154,154,,,,,154,154,154,154,154,154,,,,,,154,154,,,,,,,,,,,,,,,,,,', +',,,,,,,,154,154,,,,154,,154,154,153,154,,153,153,153,153,153,153,153', +'153,153,153,,,,,153,,,153,153,,,,,153,,,153,153,153,153,,,,,153,153', +',153,,153,153,,,,153,153,,,,,153,153,153,153,153,153,,,,,,153,153,,', +',,,,,,,,,,,,,,,,,,,,,,,,153,153,,,,153,,153,153,152,153,,152,152,152', +'152,152,152,152,152,152,152,,,,,152,,,152,152,,,,,152,,,152,152,152', +'152,,,,,152,152,,152,,152,152,,,,152,152,,,,,152,152,152,152,152,152', +',,,,,152,152,,,,,,,,,,,,,,,,,,,,,,,,,,,152,152,,,,152,,152,152,151,152', +',151,151,151,151,151,151,151,151,151,151,,,,,151,,,151,151,,,,,151,', +',151,151,151,151,,,,,151,151,,151,,151,151,,,,151,151,,,,,151,151,151', +'151,151,151,,,,,,151,151,,,,,,,,,,,,,,,,,,,,,,,,,,,151,151,,,,151,,151', +'151,149,151,,149,149,149,149,149,149,149,149,149,149,,,,,149,,,149,149', +',,,,149,,,149,149,149,149,,,,,149,149,,149,,149,149,,,,149,149,,,,,149', +'149,149,149,149,149,,,,,,149,149,,,,,,,,,,,,,,,,,,,,,,,,,,,149,149,', +',,149,,149,149,148,149,,148,148,148,148,148,148,148,148,148,148,,,,', +'148,,,148,148,,,,,148,,,148,148,148,148,,,,,148,148,,148,,148,148,,', +',148,148,,,,,148,148,148,148,148,148,,,,,,148,148,,,,,,,,,,,,,,,,,,', +',,,,,,,,148,148,,,,148,,148,148,147,148,,147,147,147,147,147,147,147', +'147,147,147,,,,,147,,,147,147,,,,,147,,,147,147,147,147,,,,,147,147', +',147,,147,147,,,,147,147,,,,,147,147,147,147,147,147,,,,,,147,147,,', +',,,,,,,,,,,,,,,,,,,,,,,,147,147,,,,147,,147,147,145,147,,145,145,145', +'145,145,145,145,145,145,145,,,,,145,,,145,145,,,,,145,,,145,145,145', +'145,,,,,145,145,,145,,145,145,,,,145,145,,,,,145,145,145,145,145,145', +',,,,,145,145,,,,,,,,,,,,,,,,,,,,,,,,,,,145,145,,,,145,,145,145,144,145', +',144,144,144,144,144,144,144,144,144,144,,,,,144,,,144,144,,,,,144,', +',144,144,144,144,,,,,144,144,,144,,144,144,,,,144,144,,,,,144,144,144', +'144,144,144,,,,,,144,144,,,,,,,,,,,,,,,,,,,,,,,,,,,144,144,,,,144,,144', +'144,101,144,,101,101,101,101,101,101,101,101,101,101,,,,,101,,,101,101', +',,,,101,,,101,101,101,101,,,,,101,101,,101,,101,101,,,,101,101,101,', +',,101,101,101,101,101,101,,,,,,101,101,,,,,,,,,,,,,,,,,,,,,,,,,,,101', +'101,,,,101,,101,101,102,101,,102,102,102,102,102,102,102,102,102,102', +',,,,102,,,102,102,,,,,102,,,102,102,102,102,,,,,102,102,,102,,102,102', +',,,102,102,,,,,102,102,102,102,102,102,,,,,,102,102,,,,,,,,,,,,,,,,', +',,,,,,,,,,102,102,,,,102,,102,102,311,102,,311,311,311,311,311,311,311', +'311,311,311,,,,,311,,,311,311,,,,,311,,,311,311,311,311,,,,,311,311', +',311,,311,311,,,,311,311,,,,,311,311,311,311,311,311,,,,,,311,311,,', +',,,,,,,,,,,,,,,,,,,,,,,,311,311,,,,311,,311,311,142,311,,142,142,142', +'142,142,142,142,142,142,142,,,,,142,,,142,142,,,,,142,,,142,142,142', +'142,,,,,142,142,,142,,142,142,,,,142,142,,,,,142,142,142,142,142,142', +',,,,,142,142,,,,,,,,,,,,,,,,,,,,,,,,,,,142,142,,,,142,,142,142,141,142', +',141,141,141,141,141,141,141,141,141,141,,,,,141,,,141,141,,,,,141,', +',141,141,141,141,,,,,141,141,,141,,141,141,,,,141,141,,,,,141,141,141', +'141,141,141,,,,,,141,141,,,,,,,,,,,,,,,,,,,,,,,,,,,141,141,,,,141,,141', +'141,140,141,,140,140,140,140,140,140,140,140,140,140,,,,,140,,,140,140', +',,,,140,,,140,140,140,140,,,,,140,140,,140,,140,140,,,,140,140,,,,,140', +'140,140,140,140,140,,,,,,140,140,,,,,,,,,,,,,,,,,,,,,,,,,,,140,140,', +',,140,,140,140,139,140,,139,139,139,139,139,139,139,139,139,139,,,,', +'139,,,139,139,,,,,139,,,139,139,139,139,,,,,139,139,,139,,139,139,,', +',139,139,,,,,139,139,139,139,139,139,,,,,,139,139,,,,,,,,,,,,,,,,,,', +',,,,,,,,139,139,,,,139,,139,139,112,139,,112,112,112,112,112,112,112', +'112,112,112,,,,,112,,,112,112,,,,,112,,,112,112,112,112,,,,,112,112', +',112,,112,112,,,,112,112,,,,,112,112,112,112,112,112,,,,,,112,112,,', +',,,,,,,,,,,,,,,,,,,,,,,,112,112,,,,112,,112,112,138,112,,138,138,138', +'138,138,138,138,138,138,138,,,,,138,,,138,138,,,,,138,,,138,138,138', +'138,,,,,138,138,,138,,138,138,,,,138,138,,,,,138,138,138,138,138,138', +',,,,,138,138,,,,,,,,,,,,,,,,,,,,,,,,,,,138,138,,,,138,,138,138,114,138', +',114,114,114,114,114,114,114,114,114,114,,,,,114,,,114,114,,,,,114,', +',114,114,114,114,,,,,114,114,,114,,114,114,,,,114,114,114,,,,114,114', +'114,114,114,114,,,,,,114,114,,,,,,,,,,,,,,,,,,,,,,,,,,,114,114,,,,114', +',114,114,0,114,,0,0,0,0,0,0,0,0,0,0,,,,,0,,,0,0,,,,,0,,,0,0,0,0,,,,', +'0,0,,0,,0,0,,,,0,0,0,,,,0,0,0,0,0,0,,,,,,0,0,,,,,,,,,,,,,,,,,,,,,,,', +',,,0,0,0,0,,0,,0,0,137,0,,137,137,137,137,137,137,137,137,137,137,,', +',,137,,,137,137,,,,,137,,,137,137,137,137,,,,,137,137,,137,,137,137', +',,,137,137,,,,,137,137,137,137,137,137,,,,,,137,137,,,,,,,,,,,,,,,,', +',,,,,,,,,,137,137,,,,137,,137,137,136,137,,136,136,136,136,136,136,136', +'136,136,136,,,,,136,,,136,136,,,,,136,,,136,136,136,136,,,,,136,136', +',136,,136,136,,,,136,136,,,,,136,136,136,136,136,136,,,,,,136,136,,', +',,,,,,,,,,,,,,,,,,,,,,,,136,136,,,,136,,136,136,128,136,,128,128,128', +'128,128,128,128,128,128,128,,,,,128,,,128,128,,,,,128,,,128,128,128', +'128,,,,,128,128,,128,,128,128,,,,128,128,,,,,128,128,128,128,128,128', +',,,,,128,128,,,,,,,,,,,,,,,,,,,,,,,,,,,128,128,,,,128,,128,128,134,128', +',134,134,134,134,134,134,134,134,134,134,,,,,134,,,134,134,,,,,134,', +',134,134,134,134,,,,,134,134,,134,,134,134,,,,134,134,,,,,134,134,134', +'134,134,134,,,,,,134,134,,,,,,,,,,,,,,,,,,,,,,,,,,,134,134,,,,134,,134', +'134,133,134,,133,133,133,133,133,133,133,133,133,133,,,,,133,,,133,133', +',,,,133,,,133,133,133,133,,,,,133,133,,133,,133,133,,,,133,133,,,,,133', +'133,133,133,133,133,,,,,,133,133,,,,,,,,,,,,,,,,,,,,,,,,,,,133,133,', +',,133,,133,133,132,133,,132,132,132,132,132,132,132,132,132,132,,,,', +'132,,,132,132,,,,,132,,,132,132,132,132,,,,,132,132,,132,,132,132,,', +',132,132,,,,,132,132,132,132,132,132,,,,,,132,132,,,,,,,,,,,,,,,,,,', +',,,,,,,,132,132,,,,132,,132,132,123,132,,123,123,123,123,123,123,123', +'123,123,123,,,,,123,,,123,123,,,,,123,,,123,123,123,123,,,,,123,123', +',123,,123,123,,,,123,123,,,,,123,123,123,123,123,123,,,,,,123,123,,', +',,,,,,,,,,,,,,,,,,,,,,,,123,123,,,,123,,123,123,131,123,,131,131,131', +'131,131,131,131,131,131,131,,,,,131,,,131,131,,,,,131,,,131,131,131', +'131,,,,,131,131,,131,,131,131,,,,131,131,,,,,131,131,131,131,131,131', +',,,,,131,131,,,,,,,,,,,,,,,,,,,,,,,,,,,131,131,,,,131,,131,131,129,131', +',129,129,129,129,129,129,129,129,129,129,,,,,129,,,129,129,,,,,129,', +',129,129,129,129,,,,,129,129,,129,,129,129,,,,129,129,,,,,129,129,129', +'129,129,129,,,,,,129,129,,,,,,,,,,,,,,,,,,,,,,,,,,,129,129,,,,129,,129', +'129,127,129,,127,127,127,127,127,127,127,127,127,127,,,,,127,,,127,127', +',,,,127,,,127,127,127,127,,,,,127,127,,127,,127,127,,,,127,127,,,,,127', +'127,127,127,127,127,,,,,,127,127,,,,,,,,,,,,,,,,,,,,,,,,,,,127,127,', +',,127,,127,127,135,127,,135,135,135,135,135,135,135,135,135,135,,,,', +'135,,,135,135,,,,,135,,,135,135,135,135,,,,,135,135,,135,,135,135,,', +',135,135,314,,314,,135,135,135,135,135,135,,,,,,135,135,,,,,,,,,,,,', +',,,314,314,,,,314,,,,314,,135,135,,,,135,,135,135,,135,,,,314,314,314', '314,314,314,314,314,314,314,314,314,314,314,314,314,314,314,314,314', -'314,303,,303,,,,,,,,314,,,,,,,,,,,,,,,,,,,,,,303,303,,,,303,,,,303,', -',,,,,,,,,,,,,303,303,303,303,303,303,303,303,303,303,303,303,303,303', +'314,314,314,314,314,314,314,314,314,314,314,314,314,314,314,303,,303', +',,,,,,314,,,,,,,,,,,,,,,,,,,,,,,303,303,,,,303,,,,303,,,,,,,,,,,,,,', +',303,303,303,303,303,303,303,303,303,303,303,303,303,303,303,303,303', '303,303,303,303,303,303,303,303,303,303,303,303,303,303,303,303,303', -'303,303,303,303,159,159,159,159,159,159,159,159,159,159,303,,,,159,', -',159,159,,,,,159,,,159,159,159,,,,,,,159,,159,,159,159,,,159,159,,,', -',159,159,159,159,159,159,,,,,,,,,,,302,302,302,302,302,302,302,302,302', -'302,,,,,302,,,302,302,,,,,302,159,159,302,302,302,159,,159,159,,159', -'302,,302,,302,302,,,302,302,,,,,302,302,302,302,302,302,,,,,,,,,,,312', -'312,312,312,312,312,312,312,312,312,,,,,312,,,312,312,,,,,312,302,302', -'312,312,312,302,,302,302,,302,312,,312,,312,312,,,312,312,,,,,312,312', -'312,312,312,312,,20,20,20,20,20,20,20,20,20,20,,,,,,,,,,,,,,,,,,20,20', -',,,,312,312,,,,312,,312,312,,312,20,,,,,,,,,,,,,,,,,,,24,24,24,24,24', -'24,24,24,24,24,,,,,24,,,24,24,,,,,24,,,24,24,24,24,,20,,20,20,24,20', -'24,,24,24,,,24,24,273,,273,,24,24,24,24,24,24,,,,,,24,24,,,,,,,,,,,', -',,,,273,273,,,,273,,,,273,,,24,24,,,,24,,24,24,,24,,273,273,273,273', +'303,,,,,,,,,,303,162,162,162,162,162,162,162,162,162,162,,,,,162,,,162', +'162,,,,,162,,,162,162,162,,,,,,,162,,162,,162,162,,,,162,162,,,,,162', +'162,162,162,162,162,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,162,162,,,,162', +',162,162,,162,25,25,25,25,25,25,25,25,25,25,,,,,25,,,25,25,,,,,25,,', +'25,25,25,25,,,,,,25,,25,,25,25,,,,25,25,,,,,25,25,25,25,25,25,,,,,,25', +'25,,21,21,21,21,21,21,21,21,21,21,,,,,,,,,,,,,,,,25,25,21,21,,25,,25', +'25,,25,,,,,,,,,,21,,,,,,,,,,,,,,,,,,302,302,302,302,302,302,302,302', +'302,302,,,,,302,,,302,302,,,,,302,,,302,302,302,,,21,,21,21,302,21,302', +',302,302,,,,302,302,,,,,302,302,302,302,302,302,,,,,,,,,,312,312,312', +'312,312,312,312,312,312,312,,,,,312,,,312,312,,,,,312,302,302,312,312', +'312,302,,302,302,,302,312,,312,,312,312,,,,312,312,273,,273,,312,312', +'312,312,312,312,,,,,,,,,,,,,,,,,,,,,,,273,273,,,,273,,,,273,,312,312', +',,,312,,312,312,,312,,,,273,273,273,273,273,273,273,273,273,273,273', '273,273,273,273,273,273,273,273,273,273,273,273,273,273,273,273,273', -'273,273,273,273,273,273,273,273,273,273,273,273,273,273,319,,319,,,', -',,,,,,,,,,,,,,,,,,,319,,,,,,,319,319,,,,319,,,,319,,,,,,,,,,,,,,,319', -'319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319', -'319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319', -'318,,318,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,318,318,,,,318,,,,318,,,,,,,,', -',,,,,,318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,318', -'318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,318', -'318,318,313,,313,,,,,,,,,,,,,,,,,,,,,,,313,,,,,,,313,313,,,,313,,,,313', -',,,,,,,,,,,,,,313,313,313,313,313,313,313,313,313,313,313,313,313,313', -'313,313,313,313,313,313,313,313,313,313,313,313,313,313,313,313,313', -'313,313,313,313,197,,197,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,197,197,,,,197', -',,,197,,,,,,,,,,,,,,,197,197,197,197,197,197,197,197,197,197,197,197', -'197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197', -'197,197,197,197,197,197,193,,193,,,,,,,,,,,,,,,,,,,,,,,193,,,,,,,193', -'193,,,,193,,,,193,,,,,,,,,,,,,,,193,193,193,193,193,193,193,193,193', -'193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193', -'193,193,193,193,193,193,193,193,193,192,,192,,,,,,,,,,,,,,,,,,,,,,,', -',,,,,,192,192,,,,192,,,,192,,,,,,,,,,,,,,,192,192,192,192,192,192,192', -'192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192', -'192,192,192,192,192,192,192,192,192,192,192,237,,237,,,,,,,,,,,,,,,', -',,,,,,,,,,,,,,237,237,,,,237,,,,237,,,,,,,,,,,,,,,237,237,237,237,237', -'237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237', -'237,237,237,237,237,237,237,237,237,237,237,237,237,230,,230,,,,,,,', -',,,,,,,,,,,,,,,,,,,,,,230,230,,,,230,,,,230,,,,,,,,,,,,,,,230,230,230', -'230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230', -'230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,301,,301', -',,,,,,,,,,,,,,,,,,,,,,,,,,,,,301,301,,,,301,,,,301,,,,,,,,,,,,,,,301', -'301,301,301,301,301,301,301,301,301,301,301,301,301,301,301,301,301', +'273,273,273,273,273,273,273,113,,113,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,113', +'113,,,,113,,,,113,,,,,,,,,,,,,,,,113,113,113,113,113,113,113,113,113', +'113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113', +'113,113,113,113,113,113,113,113,113,301,,301,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,301,301,,,,301,,,,301,,,,,,,,,,,,,,,,301,301,301,301,301,301,301', '301,301,301,301,301,301,301,301,301,301,301,301,301,301,301,301,301', -'112,,112,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,112,112,,,,112,,,,112,,,,,,,,', -',,,,,,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112', -'112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112', -'112,112,210,,210,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,210,210,,,,210,,,,210', -',,,,,,,,,,,,,,210,210,210,210,210,210,210,210,210,210,210,210,210,210', -'210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210', -'210,210,210,210,222,,222,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,222,222,,,,222', -',,,222,,,,,,,,,,,,,,,222,222,222,222,222,222,222,222,222,222,222,222', -'222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222', -'222,222,222,222,222,222,300,,300,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,300,300', -',,,300,,,,300,,,,,,,,,,,,,,,300,300,300,300,300,300,300,300,300,300', +'301,301,301,301,301,301,301,301,301,301,301,300,,300,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,300,300,,,,300,,,,300,,,,,,,,,,,,,,,,300,300,300,300,300', '300,300,300,300,300,300,300,300,300,300,300,300,300,300,300,300,300', -'300,300,300,300,300,300,300,300,297,,297,,,,,,,,,,,,,,,,,,,,,,,,,,,', -',,297,297,,,,297,,,,297,,,,,,,,,,,,,,,297,297,297,297,297,297,297,297', +'300,300,300,300,300,300,300,300,300,300,300,300,300,297,,297,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,297,297,,,,297,,,,297,,,,,,,,,,,,,,,,297,297,297', '297,297,297,297,297,297,297,297,297,297,297,297,297,297,297,297,297', -'297,297,297,297,297,297,297,297,297,297,84,,84,,,,,,,,,,,,,,,,,,,,,', -',,,,,,,,84,84,,,,84,,,,84,,,,,,,84,,,,,,,,84,84,84,84,84,84,84,84,84', -'84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84', -'84,84,84,86,,86,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,86,86,,,,86,,,,86,,,,,', -',86,,,,,,,,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86', -'86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,87,,87,,,,,,,,,,,,,', -',,,,,,,,,,,,,,,,87,87,,,,87,,,,87,,,,,,,87,,,,,,,,87,87,87,87,87,87', -'87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87', -'87,87,87,87,87,87,68,,68,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,68,68,,,,68,,', -',68,,,,,,,,,,,,,,,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68', -'68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,276,,276,,,,,', -',,,,,,,,,,,,,,,,,,,,,,,,276,276,,,,276,,,,276,,,,,,,,,,,,,,,276,276', +'297,297,297,297,297,297,297,297,297,297,297,297,297,297,297,192,,192', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,192,192,,,,192,,,,192,,,,,,,,,,,,,,,,192', +'192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192', +'192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192', +'313,,313,,,,,,,,,,,,,,,,,,,,,,,313,,,,,,,313,313,,,,313,,,,313,,,,,', +',,,,,,,,,,313,313,313,313,313,313,313,313,313,313,313,313,313,313,313', +'313,313,313,313,313,313,313,313,313,313,313,313,313,313,313,313,313', +'313,313,313,318,,318,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,318,318,,,,318,,,', +'318,,,,,,,,,,,,,,,,318,318,318,318,318,318,318,318,318,318,318,318,318', +'318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,318', +'318,318,318,318,318,193,,193,,,,,,,,,,,,,,,,,,,,,,,193,,,,,,,193,193', +',,,193,,,,193,,,,,,,,,,,,,,,,193,193,193,193,193,193,193,193,193,193', +'193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193', +'193,193,193,193,193,193,193,193,276,,276,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,276,276,,,,276,,,,276,,,,,,,,,,,,,,,,276,276,276,276,276,276,276,276', '276,276,276,276,276,276,276,276,276,276,276,276,276,276,276,276,276', -'276,276,276,276,276,276,276,276,276,276,276,276,276,276,276,276,266', -',266,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,266,266,,,,266,,,,266,,,,,,,,,,,,', -',,266,266,266,266,266,266,266,266,266,266,266,266,266,266,266,266,266', -'266,266,266,266,266,266,266,266,266,266,266,266,266,266,266,266,266', -'266,264,,264,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,264,264,,,,264,,,,264,,,,', -',,,,,,,,,,264,264,264,264,264,264,264,264,264,264,264,264,264,264,264', +'276,276,276,276,276,276,276,276,276,276,201,,201,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,201,201,,,,201,,,,201,,,,,,,,,,,,,,,,201,201,201,201,201,201', +'201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201', +'201,201,201,201,201,201,201,201,201,201,201,201,210,,210,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,210,210,,,,210,,,,210,,,,,,,,,,,,,,,,210,210,210,210', +'210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210', +'210,210,210,210,210,210,210,210,210,210,210,210,210,210,265,,265,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,265,265,,,,265,,,,265,,,,,,,,,,,,,,,,265,265', +'265,265,265,265,265,265,265,265,265,265,265,265,265,265,265,265,265', +'265,265,265,265,265,265,265,265,265,265,265,265,265,265,265,265,264', +',264,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,264,264,,,,264,,,,264,,,,,,,,,,,,', +',,,264,264,264,264,264,264,264,264,264,264,264,264,264,264,264,264,264', '264,264,264,264,264,264,264,264,264,264,264,264,264,264,264,264,264', -'264,264,264,118,118,,,,,,,,118,,,,,,,,,,,,,,,118,118,118,118,118,118', -'118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118', -'118,118,118,118,118,118,118,118,118,118,118,118,92,92,,,,,,,,92,,,,', -',,,,,,,,,,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92', -'92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,256,256,,,,,,,,256,,,,', -',,,,,,,,,,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256', +'264,222,,222,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,222,222,,,,222,,,,222,,,,', +',,,,,,,,,,,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222', +'222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222', +'222,222,222,237,,237,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,237,237,,,,237,,,', +'237,,,,,,,,,,,,,,,,237,237,237,237,237,237,237,237,237,237,237,237,237', +'237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237', +'237,237,237,237,237,319,,319,,,,,,,,,,,,,,,,,,,,,,,319,,,,,,,319,319', +',,,319,,,,319,,,,,,,,,,,,,,,,319,319,319,319,319,319,319,319,319,319', +'319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319', +'319,319,319,319,319,319,319,319,86,,86,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +'86,86,,,,86,,,,86,,,,,,,,86,,,,,,,,86,86,86,86,86,86,86,86,86,86,86', +'86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86', +'86,230,,230,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,230,230,,,,230,,,,230,,,,,', +',,,,,,,,,,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230', +'230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230', +'230,230,230,84,,84,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,84,84,,,,84,,,,84,,', +',,,,,84,,,,,,,,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84', +'84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,68,,68,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,68,68,,,,68,,,,68,,,,,,,,,,,,,,,,68,68,68,68,68,68', +'68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68', +'68,68,68,68,68,68,87,,87,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,87,87,,,,87,,', +',87,,,,,,,,87,,,,,,,,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87', +'87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,256,256,,,', +',,,,256,,,,,,,,,,,,,,,,256,256,256,256,256,256,256,256,256,256,256,256', '256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256', -'256,256,256,307,,,,,,,,307,,,,,,,,,,,,,,,307,307,307,307,307,307,307', -'307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307', -'307,307,307,307,307,307,307,307,307,307,307,283,,,,,,,,283,,,,,,,,,', -',,,,,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283', +'256,256,256,256,256,256,93,93,,,,,,,,93,,,,,,,,,,,,,,,,93,93,93,93,93', +'93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93', +'93,93,93,93,93,93,93,119,119,,,,,,,,119,,,,,,,,,,,,,,,,119,119,119,119', +'119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119', +'119,119,119,119,119,119,119,119,119,119,119,119,119,119,283,,,,,,,,283', +',,,,,,,,,,,,,,,283,283,283,283,283,283,283,283,283,283,283,283,283,283', '283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283', -'283,283,284,,,,,,,,284,,,,,,,,,,,,,,,284,284,284,284,284,284,284,284', +'283,283,283,283,284,,,,,,,,284,,,,,,,,,,,,,,,,284,284,284,284,284,284', '284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284', -'284,284,284,284,284,284,284,284,284,284,223,,,,,,,,223,,,,,,,,,,,,,', -',223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223', -'223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223', -'223,306,,,,,,,,306,,,,,,,,,,,,,,,306,306,306,306,306,306,306,306,306', +'284,284,284,284,284,284,284,284,284,284,284,284,306,,,,,,,,306,,,,,', +',,,,,,,,,,306,306,306,306,306,306,306,306,306,306,306,306,306,306,306', '306,306,306,306,306,306,306,306,306,306,306,306,306,306,306,306,306', -'306,306,306,306,306,306,306,306,306,250,,,,,,,,,,,,,,,250,250,250,250', -'250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250', -'250,250,250,250,250,250,250,250,250,250,250,250,250,250,91,,,,,,,,,', -',,,,,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91', -'91,91,91,91,91,91,91,91,91,91,91,91,91,91,109,,,,,,,,,,,,,,,109,109', -'109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109', -'109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,251', -'251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251', +'306,306,306,307,,,,,,,,307,,,,,,,,,,,,,,,,307,307,307,307,307,307,307', +'307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307', +'307,307,307,307,307,307,307,307,307,307,307,223,,,,,,,,223,,,,,,,,,', +',,,,,,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223', +'223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223', +'223,223,110,,,,,,,,,,,,,,,,110,110,110,110,110,110,110,110,110,110,110', +'110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110', +'110,110,110,110,110,110,110,92,,,,,,,,,,,,,,,,92,92,92,92,92,92,92,92', +'92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92', +'92,92,92,92,251,,,,,,,,,,,,,,,,251,251,251,251,251,251,251,251,251,251', '251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251', -'219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219', -'219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219', -'219,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231', +'251,251,251,251,251,251,251,251,252,252,252,252,252,252,252,252,252', +'252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252', +'252,252,252,252,252,252,252,252,252,234,234,234,234,234,234,234,234', +'234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234', +'234,234,234,234,234,234,234,234,234,234,247,247,247,247,247,247,247', +'247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247', +'247,247,247,247,247,247,247,247,247,247,247,224,224,224,224,224,224', +'224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224', +'224,224,224,224,224,224,224,224,224,224,224,224,231,231,231,231,231', '231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231,231', -'231,231,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248', -'248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248', -'248,248,248,215,215,215,215,215,215,215,215,215,215,215,215,215,215', +'231,231,231,231,231,231,231,231,231,231,231,231,231,215,215,215,215', '215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215', -'215,215,215,215,224,224,224,224,224,224,224,224,224,224,224,224,224', -'224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224', -'224,224,224,224,224,227,227,227,227,227,227,227,227,227,227,227,227', +'215,215,215,215,215,215,215,215,215,215,215,215,215,215,219,219,219', +'219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219', +'219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,227,227', '227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227', -'227,227,227,227,227,227,244,244,244,244,244,244,244,244,244,244,244', -'244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244', -'244,244,244,244,244,244,244' ] - racc_action_check = arr = Array.new(10897, nil) +'227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227' ] + racc_action_check = arr = Array.new(10987, nil) idx = 0 clist.each do |str| str.split(',', -1).each do |i| @@ -770,156 +772,156 @@ def on_error(error_token_id, error_value, value_stack) end racc_action_pointer = [ - 6361, 325, 299, nil, nil, 301, nil, 402, nil, nil, - 503, nil, 604, 705, nil, nil, 806, nil, nil, nil, - 7885, 1008, nil, nil, 7948, 170, nil, nil, nil, 19, - nil, 227, 1513, nil, 1614, 197, nil, 1816, nil, nil, - 1917, 128, nil, nil, 2119, nil, nil, nil, nil, nil, - nil, nil, 2220, 175, 2422, nil, nil, nil, nil, nil, - nil, 268, nil, nil, nil, 39, 234, 2826, 9634, 147, - -2, 3230, nil, nil, 3331, 247, nil, nil, 90, nil, - nil, 236, -5, 127, 9361, 280, 9452, 9543, 289, 337, - 236, 10474, 10025, -38, 177, nil, 43, nil, -46, nil, - 5250, 5351, 190, 201, 210, nil, nil, nil, nil, 10524, - 5856, 63, 8906, 6159, 234, -2, 234, 177, 9966, 305, - nil, 91, 6967, 228, 160, nil, 131, 7371, 4240, 4846, - 28, 3634, 1412, 1311, 1109, 907, 200, 5553, 4038, 7270, - 7169, 7068, nil, 6866, 6765, 6664, 6563, nil, 6462, 6260, - 6058, 5957, 5755, 5654, 99, 5452, 5149, 5048, 4947, 7699, - 4745, -47, 4644, 4543, 4442, 4341, 7472, 4139, nil, nil, - -2, 3937, nil, 238, 179, nil, nil, nil, nil, 197, - 322, 57, nil, nil, -20, 3836, 84, 3735, nil, 114, - 120, -2, 8542, 8451, nil, nil, nil, 8360, nil, nil, - 3533, 3432, 179, 73, nil, 196, 34, -49, nil, nil, - 8997, 132, 3129, 3028, -12, 10699, 512, 1439, 255, 10594, - 411, 1032, 9088, 10316, 10734, 209, 1430, 10769, 916, 1133, - 8724, 10629, 714, 1234, 815, 1421, 188, 8633, 613, 1335, - 278, 310, 1320, 91, 10804, 114, 1219, 280, 10664, 1017, - 10424, 10559, 1118, 1522, 301, 3, 10084, 128, nil, 69, - 20, 126, 2927, nil, 9907, nil, 9816, nil, nil, 131, - nil, nil, -24, 7996, 2725, 2624, 9725, 2523, nil, 73, - 75, nil, nil, 10200, 10258, nil, 2321, 2018, 284, nil, - nil, nil, -2, 149, nil, nil, 65, 9270, nil, 1715, - 9179, 8815, 7764, 7611, nil, nil, 10374, 10142, nil, 247, - 133, 1210, 7829, 8269, 7520, nil, nil, nil, 8178, 8087, + 6361, 294, 195, nil, nil, 301, nil, 402, nil, nil, + 503, nil, 604, 705, nil, nil, 806, nil, nil, 907, + nil, 7876, 1109, nil, nil, 7812, 169, nil, nil, nil, + 301, nil, 15, 1614, nil, 1715, -10, nil, nil, nil, + 1917, 86, nil, nil, 2119, nil, nil, 2220, nil, nil, + nil, nil, 2321, 140, nil, nil, nil, nil, nil, 2523, + nil, nil, 74, nil, nil, nil, 237, 141, 9893, 213, + 237, 3230, nil, nil, 3331, 245, nil, nil, 94, nil, + nil, -10, -6, 187, 9801, 233, 9617, 9985, 76, 176, + 338, 402, 10562, 10105, 3, nil, 82, 175, nil, 80, + nil, 5351, 5452, 139, 190, 207, nil, nil, nil, nil, + 10511, -51, 6058, 8145, 6260, -2, 121, 108, 125, 10165, + 300, 65, nil, 7068, 221, 286, nil, 7371, 6664, 7270, + 312, 7169, 6967, 6866, 6765, 7472, 6563, 6462, 6159, 5957, + 5856, 5755, 5654, 99, 5250, 5149, nil, 5048, 4947, 4846, + nil, 4745, 4644, 4543, 4442, 4341, 4240, 4139, 4038, 3937, + 3836, 3735, 7712, 3634, 114, 3533, 3432, 3129, nil, nil, + -2, 3028, nil, 136, 170, nil, nil, nil, nil, 240, + 308, 196, nil, nil, -14, 2927, 2826, 76, nil, 176, + 120, -3, 8513, 8789, nil, nil, nil, nil, nil, 2725, + 2624, 8973, 178, 90, nil, 211, 213, 148, nil, nil, + 9065, 150, 2422, 2018, -13, 10823, 1320, 1439, 18, 10858, + 1017, 1531, 9341, 10460, 10753, 613, 1133, 10893, 512, 1234, + 9709, 10788, 411, 1335, 10683, 916, 1522, 9433, 815, 1430, + 64, 714, 1421, -16, 310, 1118, -20, 10718, 87, 209, + -29, 10613, 10648, 1219, 2, 272, 10045, -42, nil, -35, + 189, 111, 1816, nil, 9249, 9157, nil, nil, nil, 7, + nil, nil, -45, 8053, 1513, 1412, 8881, 1311, nil, 65, + 74, nil, nil, 10224, 10283, nil, 1210, 1008, 82, nil, + nil, nil, -7, 146, nil, nil, 0, 8421, nil, 200, + 8329, 8237, 7939, 7613, nil, nil, 10342, 10401, nil, 210, + 95, 5553, 8004, 8605, 7521, nil, nil, nil, 8697, 9525, nil, nil, nil ] racc_action_default = [ -1, -178, -185, -97, -10, -185, -105, -185, -26, -11, - -185, -106, -185, -185, -27, -12, -185, -107, -13, -108, - -185, -185, -14, -109, -45, -119, -15, -28, -16, -125, - -29, -133, -185, -31, -140, -185, -17, -185, -34, -18, - -185, -185, -35, -19, -185, -36, -46, -20, -127, -30, - -21, -37, -185, -185, -185, -22, -38, -32, -2, -23, - -39, -3, -104, -103, -33, -185, -185, -185, -5, -185, + -185, -106, -185, -185, -27, -12, -185, -107, -13, -185, + -108, -185, -185, -14, -109, -45, -119, -15, -28, -16, + -125, -29, -133, -185, -31, -140, -185, -17, -34, -18, + -185, -185, -35, -19, -185, -36, -20, -185, -127, -46, + -21, -37, -185, -185, -30, -22, -38, -32, -2, -185, + -23, -39, -3, -104, -103, -33, -185, -185, -5, -185, -8, -185, -96, -9, -185, -178, -180, -182, -185, -176, - -98, -100, -185, -52, -157, -54, -185, -185, -53, -185, - -126, -55, -44, -185, -119, -43, -185, -120, -185, -130, - -140, -185, -185, -185, -185, -111, -115, -116, -134, -56, - -185, -185, -141, -140, -50, -185, -185, -49, -154, -185, - -25, -185, -7, -161, -185, -4, -51, -185, -185, -185, + -98, -100, -185, -48, -157, -52, -185, -185, -54, -53, + -185, -126, -55, -44, -185, -43, -185, -119, -120, -185, + -130, -140, -185, -185, -185, -185, -111, -115, -116, -134, + -56, -185, -185, -141, -140, -185, -185, -50, -49, -154, + -185, -185, -25, -7, -161, -185, -4, -185, -185, -185, -185, -185, -185, -185, -185, -185, -185, -185, -185, -185, - -185, -185, -58, -185, -185, -185, -185, -57, -185, -185, - -185, -185, -185, -185, -185, -185, -185, -185, -185, -93, - -185, -185, -185, -185, -185, -185, -185, -185, -95, -129, - -185, -185, -110, -47, -48, -181, -177, -179, -175, -185, + -185, -185, -185, -185, -185, -185, -58, -185, -185, -185, + -57, -185, -185, -185, -185, -185, -185, -185, -185, -185, + -185, -185, -93, -185, -185, -185, -185, -185, -95, -129, + -185, -185, -110, -51, -47, -181, -177, -179, -175, -185, -185, -185, -156, -174, -185, -185, -185, -185, -118, -185, - -185, -185, -141, -185, -112, -113, -114, -142, -139, -147, - -185, -185, -185, -185, -155, -150, -185, -185, 323, -24, - -6, -185, -185, -185, -185, -86, -74, -63, -185, -87, - -75, -64, -183, -92, -88, -76, -65, -89, -77, -66, - -184, -90, -78, -67, -79, -68, -59, -158, -80, -69, - -60, -81, -70, -61, -83, -82, -71, -185, -84, -72, - -91, -85, -73, -62, -128, -185, -40, -185, -99, -185, - -185, -185, -185, -169, -41, -124, -42, -122, -121, -185, + -185, -185, -141, -185, -112, -113, -114, -139, -147, -185, + -185, -142, -185, -185, -155, -150, -185, -185, 323, -24, + -6, -185, -185, -185, -185, -85, -73, -62, -185, -86, + -74, -63, -183, -92, -87, -75, -64, -88, -76, -65, + -184, -89, -77, -66, -90, -78, -67, -158, -79, -68, + -59, -80, -69, -60, -81, -70, -61, -83, -82, -71, + -185, -91, -84, -72, -128, -185, -40, -185, -99, -185, + -185, -185, -185, -169, -41, -42, -124, -122, -121, -185, -131, -117, -185, -144, -185, -185, -143, -185, -132, -185, -185, -151, -162, -163, -164, -160, -185, -185, -159, -102, - -101, -94, -185, -185, -167, -170, -185, -148, -123, -185, - -146, -145, -102, -185, -152, -153, -166, -165, -173, -185, + -101, -94, -185, -185, -170, -167, -185, -148, -123, -185, + -145, -146, -102, -185, -152, -153, -166, -165, -173, -185, -171, -185, -102, -185, -185, -135, -168, -172, -149, -185, -137, -136, -138 ] racc_goto_table = [ - 58, 83, 80, 84, 172, 95, 85, 169, 86, 87, - 214, 263, 88, 267, 268, 89, 90, 91, 76, 124, - 92, 66, 98, 172, 61, 53, 169, 79, 109, 111, - 112, 296, 261, 114, 205, 178, 115, 259, 75, 82, - 117, 77, nil, nil, nil, nil, nil, nil, 118, nil, + 58, 172, 80, 67, 90, 263, 125, 169, 83, 95, + 84, 267, 268, 85, 214, 86, 87, 111, 76, 88, + 79, 172, 89, 53, 99, 92, 91, 169, 93, 62, + 296, 261, 205, 178, 259, 75, 110, 82, 113, 77, + nil, nil, nil, 115, 116, nil, nil, 117, nil, nil, + 118, nil, nil, nil, nil, 119, nil, nil, nil, nil, + nil, nil, 123, nil, nil, nil, nil, 126, nil, nil, + 218, nil, 168, nil, 173, nil, nil, 174, nil, nil, + 95, 177, 294, 191, nil, nil, nil, 182, 121, 183, + nil, 298, 175, nil, 176, 187, 203, nil, nil, 189, + nil, nil, nil, nil, 192, 193, nil, 288, nil, nil, + nil, nil, nil, 308, nil, 201, nil, 192, nil, nil, + nil, 123, nil, nil, nil, nil, 210, nil, nil, nil, + 215, 216, 217, nil, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, nil, + 234, 235, 236, 254, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 260, 251, 252, + 253, nil, 95, 95, 256, 255, nil, nil, nil, nil, + 258, nil, nil, nil, nil, 172, nil, 189, 264, 265, + 269, 169, nil, nil, nil, nil, nil, nil, nil, nil, + 274, nil, 273, 276, nil, nil, nil, nil, nil, nil, + 281, nil, nil, nil, nil, 283, 284, 285, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, - nil, 122, 116, 126, nil, nil, 125, 173, nil, nil, - 174, nil, nil, nil, 95, nil, nil, nil, 121, nil, - nil, nil, nil, nil, 218, nil, nil, nil, 295, nil, - 168, 186, 175, 298, nil, 191, 192, 193, 189, 177, - nil, 176, nil, nil, 288, 182, 197, 183, 203, 192, - nil, nil, nil, nil, nil, nil, nil, nil, 210, 308, - nil, 122, nil, 215, 216, 217, nil, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 228, 229, nil, 230, - 231, 232, 233, nil, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, nil, 248, 249, - 250, 251, 252, 253, 260, 254, 255, 256, nil, 95, - 95, nil, nil, nil, nil, nil, nil, nil, nil, nil, - 258, 264, nil, 266, nil, nil, 189, nil, 172, nil, - 269, 169, nil, nil, nil, nil, 273, 276, nil, nil, - nil, 275, nil, nil, nil, nil, nil, nil, 283, 284, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, - nil, nil, nil, nil, nil, nil, nil, nil, 281, nil, - nil, nil, nil, nil, nil, 285, nil, nil, nil, nil, - nil, 260, nil, nil, nil, nil, nil, nil, nil, 95, - nil, nil, nil, nil, nil, nil, nil, nil, 297, nil, - 292, nil, nil, nil, nil, nil, nil, nil, nil, nil, - 300, 301, 260, 303, nil, nil, nil, nil, nil, nil, - 291, nil, 306, 307, nil, nil, nil, nil, nil, nil, - nil, nil, nil, nil, nil, 313, nil, nil, 314, nil, - 304, 305, nil, nil, nil, nil, nil, 318, 319, nil, - 317, nil, nil, nil, 309, nil, nil, 310 ] + nil, nil, nil, nil, 260, nil, nil, nil, nil, nil, + nil, nil, 95, nil, nil, nil, nil, nil, nil, nil, + 292, nil, 291, nil, nil, 297, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 260, nil, 300, 301, nil, + 303, nil, 304, 305, nil, nil, nil, nil, nil, 306, + 307, nil, nil, nil, nil, nil, 309, nil, nil, 310, + nil, nil, 313, nil, nil, 314, nil, nil, nil, nil, + 317, nil, nil, nil, 318, 319 ] racc_goto_check = [ - 2, 5, 26, 5, 32, 21, 5, 38, 5, 5, - 43, 45, 5, 23, 23, 6, 33, 5, 49, 42, - 5, 4, 36, 32, 3, 1, 38, 47, 5, 39, - 5, 40, 44, 5, 41, 46, 5, 25, 48, 24, - 5, 50, nil, nil, nil, nil, nil, nil, 5, nil, - nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, - nil, 2, 4, 5, nil, nil, 2, 5, nil, nil, - 5, nil, nil, nil, 21, nil, nil, nil, 3, nil, - nil, nil, nil, nil, 42, nil, nil, nil, 45, nil, - 4, 36, 49, 23, nil, 39, 5, 5, 2, 4, - nil, 47, nil, nil, 43, 4, 5, 4, 39, 5, - nil, nil, nil, nil, nil, nil, nil, nil, 5, 45, - nil, 2, nil, 5, 5, 5, nil, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, nil, 5, + 2, 32, 26, 4, 6, 45, 42, 38, 5, 21, + 5, 23, 23, 5, 43, 5, 5, 39, 49, 5, + 47, 32, 5, 1, 36, 5, 33, 38, 5, 3, + 40, 44, 41, 46, 25, 48, 5, 24, 5, 50, + nil, nil, nil, 5, 4, nil, nil, 5, nil, nil, + 5, nil, nil, nil, nil, 5, nil, nil, nil, nil, + nil, nil, 2, nil, nil, nil, nil, 2, nil, nil, + 42, nil, 4, nil, 5, nil, nil, 5, nil, nil, + 21, 4, 45, 39, nil, nil, nil, 4, 3, 4, + nil, 23, 49, nil, 47, 36, 39, nil, nil, 2, + nil, nil, nil, nil, 5, 5, nil, 43, nil, nil, + nil, nil, nil, 45, nil, 5, nil, 5, nil, nil, + nil, 2, nil, nil, nil, nil, 5, nil, nil, nil, 5, 5, 5, nil, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, nil, 5, 5, - 5, 5, 5, 5, 21, 6, 33, 5, nil, 21, - 21, nil, nil, nil, nil, nil, nil, nil, nil, nil, - 26, 5, nil, 5, nil, nil, 2, nil, 32, nil, - 2, 38, nil, nil, nil, nil, 5, 5, nil, nil, - nil, 2, nil, nil, nil, nil, nil, nil, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, nil, + 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 21, 5, 5, + 5, nil, 21, 21, 5, 33, nil, nil, nil, nil, + 26, nil, nil, nil, nil, 32, nil, 2, 5, 5, + 2, 38, nil, nil, nil, nil, nil, nil, nil, nil, + 2, nil, 5, 5, nil, nil, nil, nil, nil, nil, + 4, nil, nil, nil, nil, 5, 5, 4, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, - nil, nil, nil, nil, nil, nil, nil, nil, 4, nil, - nil, nil, nil, nil, nil, 4, nil, nil, nil, nil, - nil, 21, nil, nil, nil, nil, nil, nil, nil, 21, - nil, nil, nil, nil, nil, nil, nil, nil, 5, nil, - 2, nil, nil, nil, nil, nil, nil, nil, nil, nil, - 5, 5, 21, 5, nil, nil, nil, nil, nil, nil, - 4, nil, 5, 5, nil, nil, nil, nil, nil, nil, - nil, nil, nil, nil, nil, 5, nil, nil, 5, nil, - 4, 4, nil, nil, nil, nil, nil, 5, 5, nil, - 2, nil, nil, nil, 4, nil, nil, 4 ] + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 21, nil, nil, nil, nil, nil, + nil, nil, 21, nil, nil, nil, nil, nil, nil, nil, + 2, nil, 4, nil, nil, 5, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 21, nil, 5, 5, nil, + 5, nil, 4, 4, nil, nil, nil, nil, nil, 5, + 5, nil, nil, nil, nil, nil, 4, nil, nil, 4, + nil, nil, 5, nil, nil, 5, nil, nil, nil, nil, + 2, nil, nil, nil, 5, 5 ] racc_goto_pointer = [ - nil, 25, 0, 24, 21, -4, -5, nil, nil, nil, + nil, 23, 0, 29, 3, 3, -17, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, - nil, -20, nil, -176, 37, -144, 0, nil, nil, nil, - nil, nil, -66, -4, nil, nil, -3, nil, -63, -5, - -231, -82, -46, -114, -152, -173, -43, 26, 37, 17, - 40 ] + nil, -17, nil, -178, 35, -147, 0, nil, nil, nil, + nil, nil, -69, 5, nil, nil, -2, nil, -63, -18, + -232, -84, -60, -111, -153, -179, -45, 19, 34, 17, + 38 ] racc_goto_default = [ - nil, nil, 200, nil, nil, 68, 70, 73, 4, 9, - 15, 18, 22, 26, 28, 36, 39, 43, 47, 50, - 55, 59, 62, 97, nil, 69, nil, 6, 11, 17, - 19, 23, 105, 29, 106, 107, nil, 48, 99, nil, + nil, nil, 199, nil, nil, 68, 70, 73, 4, 9, + 15, 18, 23, 27, 29, 37, 39, 43, 46, 50, + 55, 60, 63, 98, nil, 69, nil, 6, 11, 17, + 20, 24, 106, 30, 107, 108, nil, 48, 100, nil, nil, nil, nil, nil, nil, nil, 1, nil, nil, nil, nil ] @@ -1162,53 +1164,53 @@ def on_error(error_token_id, error_value, value_stack) :TYPEOF => 44, :SUPER => 45, :EXTENDS => 46, - :NEWLINE => 47, - :COMMENT => 48, - :JS => 49, - :INDENT => 50, - :OUTDENT => 51, - :UMINUS => 52, - :UPLUS => 53, - :NOT => 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, - :IS => 79, - :ISNT => 80, - "&&" => 81, - "||" => 82, - :AND => 83, - :OR => 84, - "-=" => 85, - "+=" => 86, - "/=" => 87, - "*=" => 88, - "%=" => 89, - "||=" => 90, - "&&=" => 91, - "?=" => 92, - :ASSIGN => 93, + :ASSIGN => 47, + :NEWLINE => 48, + :COMMENT => 49, + :JS => 50, + :INDENT => 51, + :OUTDENT => 52, + :UMINUS => 53, + :UPLUS => 54, + :NOT => 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, + :IS => 80, + :ISNT => 81, + "&&" => 82, + "||" => 83, + :AND => 84, + :OR => 85, + "-=" => 86, + "+=" => 87, + "/=" => 88, + "*=" => 89, + "%=" => 90, + "||=" => 91, + "&&=" => 92, + "?=" => 93, "->" => 94, "=>" => 95, "\n" => 96, @@ -1290,6 +1292,7 @@ def on_error(error_token_id, error_value, value_stack) "TYPEOF", "SUPER", "EXTENDS", + "ASSIGN", "NEWLINE", "COMMENT", "JS", @@ -1336,7 +1339,6 @@ def on_error(error_token_id, error_value, value_stack) "\"||=\"", "\"&&=\"", "\"?=\"", - "ASSIGN", "\"->\"", "\"=>\"", "\"\\n\"", @@ -1407,49 +1409,49 @@ def on_error(error_token_id, error_value, value_stack) # reduce 0 omitted -module_eval(<<'.,.,', 'grammar.y', 44) +module_eval(<<'.,.,', 'grammar.y', 45) def _reduce_1(val, _values, result) result = Expressions.new result end .,., -module_eval(<<'.,.,', 'grammar.y', 45) +module_eval(<<'.,.,', 'grammar.y', 46) def _reduce_2(val, _values, result) result = Expressions.new result end .,., -module_eval(<<'.,.,', 'grammar.y', 46) +module_eval(<<'.,.,', 'grammar.y', 47) def _reduce_3(val, _values, result) result = val[0] result end .,., -module_eval(<<'.,.,', 'grammar.y', 47) +module_eval(<<'.,.,', 'grammar.y', 48) def _reduce_4(val, _values, result) result = val[0] result end .,., -module_eval(<<'.,.,', 'grammar.y', 52) +module_eval(<<'.,.,', 'grammar.y', 53) def _reduce_5(val, _values, result) result = Expressions.wrap(val) result end .,., -module_eval(<<'.,.,', 'grammar.y', 53) +module_eval(<<'.,.,', 'grammar.y', 54) def _reduce_6(val, _values, result) result = val[0] << val[2] result end .,., -module_eval(<<'.,.,', 'grammar.y', 54) +module_eval(<<'.,.,', 'grammar.y', 55) def _reduce_7(val, _values, result) result = val[0] result @@ -1488,14 +1490,14 @@ def _reduce_7(val, _values, result) # reduce 23 omitted -module_eval(<<'.,.,', 'grammar.y', 81) +module_eval(<<'.,.,', 'grammar.y', 82) def _reduce_24(val, _values, result) result = val[1] result end .,., -module_eval(<<'.,.,', 'grammar.y', 82) +module_eval(<<'.,.,', 'grammar.y', 83) def _reduce_25(val, _values, result) result = Expressions.new result @@ -1506,504 +1508,504 @@ def _reduce_25(val, _values, result) # reduce 27 omitted -module_eval(<<'.,.,', 'grammar.y', 93) +module_eval(<<'.,.,', 'grammar.y', 94) def _reduce_28(val, _values, result) result = LiteralNode.new(val[0]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 94) +module_eval(<<'.,.,', 'grammar.y', 95) def _reduce_29(val, _values, result) result = LiteralNode.new(val[0]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 95) +module_eval(<<'.,.,', 'grammar.y', 96) def _reduce_30(val, _values, result) result = LiteralNode.new(val[0]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 96) +module_eval(<<'.,.,', 'grammar.y', 97) def _reduce_31(val, _values, result) result = LiteralNode.new(val[0]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 97) +module_eval(<<'.,.,', 'grammar.y', 98) def _reduce_32(val, _values, result) result = LiteralNode.new(val[0]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 98) +module_eval(<<'.,.,', 'grammar.y', 99) def _reduce_33(val, _values, result) result = LiteralNode.new(val[0]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 99) +module_eval(<<'.,.,', 'grammar.y', 100) def _reduce_34(val, _values, result) result = LiteralNode.new(Value.new(true)) result end .,., -module_eval(<<'.,.,', 'grammar.y', 100) +module_eval(<<'.,.,', 'grammar.y', 101) def _reduce_35(val, _values, result) result = LiteralNode.new(Value.new(false)) result end .,., -module_eval(<<'.,.,', 'grammar.y', 101) +module_eval(<<'.,.,', 'grammar.y', 102) def _reduce_36(val, _values, result) result = LiteralNode.new(Value.new(true)) result end .,., -module_eval(<<'.,.,', 'grammar.y', 102) +module_eval(<<'.,.,', 'grammar.y', 103) def _reduce_37(val, _values, result) result = LiteralNode.new(Value.new(false)) result end .,., -module_eval(<<'.,.,', 'grammar.y', 103) +module_eval(<<'.,.,', 'grammar.y', 104) def _reduce_38(val, _values, result) result = LiteralNode.new(Value.new(true)) result end .,., -module_eval(<<'.,.,', 'grammar.y', 104) +module_eval(<<'.,.,', 'grammar.y', 105) def _reduce_39(val, _values, result) result = LiteralNode.new(Value.new(false)) result end .,., -module_eval(<<'.,.,', 'grammar.y', 109) +module_eval(<<'.,.,', 'grammar.y', 110) def _reduce_40(val, _values, result) result = AssignNode.new(val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 114) +module_eval(<<'.,.,', 'grammar.y', 115) def _reduce_41(val, _values, result) result = AssignNode.new(ValueNode.new(val[0]), val[2], :object) result end .,., -module_eval(<<'.,.,', 'grammar.y', 115) +module_eval(<<'.,.,', 'grammar.y', 116) def _reduce_42(val, _values, result) result = AssignNode.new(ValueNode.new(LiteralNode.new(val[0])), val[2], :object) result end .,., -module_eval(<<'.,.,', 'grammar.y', 116) +module_eval(<<'.,.,', 'grammar.y', 117) def _reduce_43(val, _values, result) result = val[0] result end .,., -module_eval(<<'.,.,', 'grammar.y', 121) +module_eval(<<'.,.,', 'grammar.y', 122) def _reduce_44(val, _values, result) result = ReturnNode.new(val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 122) +module_eval(<<'.,.,', 'grammar.y', 123) def _reduce_45(val, _values, result) result = ReturnNode.new(ValueNode.new(Value.new('null'))) result end .,., -module_eval(<<'.,.,', 'grammar.y', 127) +module_eval(<<'.,.,', 'grammar.y', 128) def _reduce_46(val, _values, result) result = CommentNode.new(val[0]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 134) +module_eval(<<'.,.,', 'grammar.y', 135) def _reduce_47(val, _values, result) result = OpNode.new(val[0], val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 135) +module_eval(<<'.,.,', 'grammar.y', 136) def _reduce_48(val, _values, result) result = OpNode.new(val[0], val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 136) +module_eval(<<'.,.,', 'grammar.y', 137) def _reduce_49(val, _values, result) result = OpNode.new(val[0], val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 137) +module_eval(<<'.,.,', 'grammar.y', 138) def _reduce_50(val, _values, result) result = OpNode.new(val[0], val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 138) +module_eval(<<'.,.,', 'grammar.y', 139) def _reduce_51(val, _values, result) result = OpNode.new(val[0], val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 139) +module_eval(<<'.,.,', 'grammar.y', 140) def _reduce_52(val, _values, result) result = OpNode.new(val[0], val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 140) +module_eval(<<'.,.,', 'grammar.y', 141) def _reduce_53(val, _values, result) result = OpNode.new(val[0], val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 141) +module_eval(<<'.,.,', 'grammar.y', 142) def _reduce_54(val, _values, result) result = OpNode.new(val[0], val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 142) +module_eval(<<'.,.,', 'grammar.y', 143) def _reduce_55(val, _values, result) result = OpNode.new(val[0], val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 143) +module_eval(<<'.,.,', 'grammar.y', 144) def _reduce_56(val, _values, result) result = OpNode.new(val[0], val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 144) +module_eval(<<'.,.,', 'grammar.y', 145) def _reduce_57(val, _values, result) result = OpNode.new(val[1], val[0], nil, true) result end .,., -module_eval(<<'.,.,', 'grammar.y', 145) +module_eval(<<'.,.,', 'grammar.y', 146) def _reduce_58(val, _values, result) result = OpNode.new(val[1], val[0], nil, true) result end .,., -module_eval(<<'.,.,', 'grammar.y', 147) +module_eval(<<'.,.,', 'grammar.y', 148) def _reduce_59(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 148) +module_eval(<<'.,.,', 'grammar.y', 149) def _reduce_60(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 149) +module_eval(<<'.,.,', 'grammar.y', 150) def _reduce_61(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 151) +module_eval(<<'.,.,', 'grammar.y', 152) def _reduce_62(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 152) +module_eval(<<'.,.,', 'grammar.y', 153) def _reduce_63(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 154) +module_eval(<<'.,.,', 'grammar.y', 155) def _reduce_64(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 155) +module_eval(<<'.,.,', 'grammar.y', 156) def _reduce_65(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 156) +module_eval(<<'.,.,', 'grammar.y', 157) def _reduce_66(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 158) +module_eval(<<'.,.,', 'grammar.y', 159) def _reduce_67(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 159) +module_eval(<<'.,.,', 'grammar.y', 160) def _reduce_68(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 160) +module_eval(<<'.,.,', 'grammar.y', 161) def _reduce_69(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 162) +module_eval(<<'.,.,', 'grammar.y', 163) def _reduce_70(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 163) +module_eval(<<'.,.,', 'grammar.y', 164) def _reduce_71(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 164) +module_eval(<<'.,.,', 'grammar.y', 165) def _reduce_72(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 165) +module_eval(<<'.,.,', 'grammar.y', 166) def _reduce_73(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 167) +module_eval(<<'.,.,', 'grammar.y', 168) def _reduce_74(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 168) +module_eval(<<'.,.,', 'grammar.y', 169) def _reduce_75(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 169) +module_eval(<<'.,.,', 'grammar.y', 170) def _reduce_76(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 170) +module_eval(<<'.,.,', 'grammar.y', 171) def _reduce_77(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 172) +module_eval(<<'.,.,', 'grammar.y', 173) def _reduce_78(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 173) +module_eval(<<'.,.,', 'grammar.y', 174) def _reduce_79(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 174) +module_eval(<<'.,.,', 'grammar.y', 175) def _reduce_80(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 175) +module_eval(<<'.,.,', 'grammar.y', 176) def _reduce_81(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 176) +module_eval(<<'.,.,', 'grammar.y', 177) def _reduce_82(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 178) +module_eval(<<'.,.,', 'grammar.y', 179) def _reduce_83(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 179) +module_eval(<<'.,.,', 'grammar.y', 180) def _reduce_84(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 180) +module_eval(<<'.,.,', 'grammar.y', 181) def _reduce_85(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 181) +module_eval(<<'.,.,', 'grammar.y', 182) def _reduce_86(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 182) +module_eval(<<'.,.,', 'grammar.y', 183) def _reduce_87(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 183) +module_eval(<<'.,.,', 'grammar.y', 184) def _reduce_88(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 184) +module_eval(<<'.,.,', 'grammar.y', 185) def _reduce_89(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 185) +module_eval(<<'.,.,', 'grammar.y', 186) def _reduce_90(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 187) +module_eval(<<'.,.,', 'grammar.y', 188) def _reduce_91(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 188) +module_eval(<<'.,.,', 'grammar.y', 189) def _reduce_92(val, _values, result) result = OpNode.new(val[1], val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 193) +module_eval(<<'.,.,', 'grammar.y', 194) def _reduce_93(val, _values, result) result = ExistenceNode.new(val[0]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 199) +module_eval(<<'.,.,', 'grammar.y', 200) def _reduce_94(val, _values, result) result = CodeNode.new(val[1], val[4], val[3]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 200) +module_eval(<<'.,.,', 'grammar.y', 201) def _reduce_95(val, _values, result) result = CodeNode.new([], val[1], val[0]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 205) +module_eval(<<'.,.,', 'grammar.y', 206) def _reduce_96(val, _values, result) result = :func result end .,., -module_eval(<<'.,.,', 'grammar.y', 206) +module_eval(<<'.,.,', 'grammar.y', 207) def _reduce_97(val, _values, result) result = :boundfunc result end .,., -module_eval(<<'.,.,', 'grammar.y', 211) +module_eval(<<'.,.,', 'grammar.y', 212) def _reduce_98(val, _values, result) result = val result end .,., -module_eval(<<'.,.,', 'grammar.y', 212) +module_eval(<<'.,.,', 'grammar.y', 213) def _reduce_99(val, _values, result) result = val[0] << val[2] result @@ -2012,588 +2014,588 @@ def _reduce_99(val, _values, result) # reduce 100 omitted -module_eval(<<'.,.,', 'grammar.y', 218) +module_eval(<<'.,.,', 'grammar.y', 219) def _reduce_101(val, _values, result) result = SplatNode.new(val[0]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 223) +module_eval(<<'.,.,', 'grammar.y', 224) def _reduce_102(val, _values, result) result = SplatNode.new(val[0]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 228) +module_eval(<<'.,.,', 'grammar.y', 229) def _reduce_103(val, _values, result) result = ValueNode.new(val[0]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 229) +module_eval(<<'.,.,', 'grammar.y', 230) def _reduce_104(val, _values, result) result = ValueNode.new(val[0]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 230) +module_eval(<<'.,.,', 'grammar.y', 231) def _reduce_105(val, _values, result) result = ValueNode.new(val[0]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 231) +module_eval(<<'.,.,', 'grammar.y', 232) def _reduce_106(val, _values, result) result = ValueNode.new(val[0]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 232) +module_eval(<<'.,.,', 'grammar.y', 233) def _reduce_107(val, _values, result) result = ValueNode.new(val[0]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 233) +module_eval(<<'.,.,', 'grammar.y', 234) def _reduce_108(val, _values, result) result = ValueNode.new(val[0]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 234) +module_eval(<<'.,.,', 'grammar.y', 235) def _reduce_109(val, _values, result) result = ValueNode.new(val[0]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 235) +module_eval(<<'.,.,', 'grammar.y', 236) def _reduce_110(val, _values, result) result = val[0] << val[1] result end .,., -module_eval(<<'.,.,', 'grammar.y', 236) +module_eval(<<'.,.,', 'grammar.y', 237) def _reduce_111(val, _values, result) result = ValueNode.new(val[0], [val[1]]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 241) +module_eval(<<'.,.,', 'grammar.y', 242) def _reduce_112(val, _values, result) result = AccessorNode.new(val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 242) +module_eval(<<'.,.,', 'grammar.y', 243) def _reduce_113(val, _values, result) result = AccessorNode.new(val[1], :prototype) result end .,., -module_eval(<<'.,.,', 'grammar.y', 243) +module_eval(<<'.,.,', 'grammar.y', 244) def _reduce_114(val, _values, result) result = AccessorNode.new(val[1], :soak) result end .,., -module_eval(<<'.,.,', 'grammar.y', 244) +module_eval(<<'.,.,', 'grammar.y', 245) def _reduce_115(val, _values, result) result = val[0] result end .,., -module_eval(<<'.,.,', 'grammar.y', 245) +module_eval(<<'.,.,', 'grammar.y', 246) def _reduce_116(val, _values, result) result = SliceNode.new(val[0]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 250) +module_eval(<<'.,.,', 'grammar.y', 251) def _reduce_117(val, _values, result) result = IndexNode.new(val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 255) +module_eval(<<'.,.,', 'grammar.y', 256) def _reduce_118(val, _values, result) result = ObjectNode.new(val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 260) +module_eval(<<'.,.,', 'grammar.y', 261) def _reduce_119(val, _values, result) result = [] result end .,., -module_eval(<<'.,.,', 'grammar.y', 261) +module_eval(<<'.,.,', 'grammar.y', 262) def _reduce_120(val, _values, result) result = val result end .,., -module_eval(<<'.,.,', 'grammar.y', 262) +module_eval(<<'.,.,', 'grammar.y', 263) def _reduce_121(val, _values, result) result = val[0] << val[2] result end .,., -module_eval(<<'.,.,', 'grammar.y', 263) +module_eval(<<'.,.,', 'grammar.y', 264) def _reduce_122(val, _values, result) result = val[0] << val[2] result end .,., -module_eval(<<'.,.,', 'grammar.y', 265) +module_eval(<<'.,.,', 'grammar.y', 266) def _reduce_123(val, _values, result) result = val[0] << val[3] result end .,., -module_eval(<<'.,.,', 'grammar.y', 266) +module_eval(<<'.,.,', 'grammar.y', 267) def _reduce_124(val, _values, result) result = val[1] result end .,., -module_eval(<<'.,.,', 'grammar.y', 271) +module_eval(<<'.,.,', 'grammar.y', 272) def _reduce_125(val, _values, result) result = val[0] result end .,., -module_eval(<<'.,.,', 'grammar.y', 272) +module_eval(<<'.,.,', 'grammar.y', 273) def _reduce_126(val, _values, result) result = val[1].new_instance result end .,., -module_eval(<<'.,.,', 'grammar.y', 273) +module_eval(<<'.,.,', 'grammar.y', 274) def _reduce_127(val, _values, result) result = val[0] result end .,., -module_eval(<<'.,.,', 'grammar.y', 278) +module_eval(<<'.,.,', 'grammar.y', 279) def _reduce_128(val, _values, result) result = ExtendsNode.new(val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 283) +module_eval(<<'.,.,', 'grammar.y', 284) def _reduce_129(val, _values, result) result = CallNode.new(val[0], val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 284) +module_eval(<<'.,.,', 'grammar.y', 285) def _reduce_130(val, _values, result) result = CallNode.new(val[0], val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 289) +module_eval(<<'.,.,', 'grammar.y', 290) def _reduce_131(val, _values, result) result = val[1] result end .,., -module_eval(<<'.,.,', 'grammar.y', 294) +module_eval(<<'.,.,', 'grammar.y', 295) def _reduce_132(val, _values, result) result = CallNode.new(Value.new('super'), val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 299) +module_eval(<<'.,.,', 'grammar.y', 300) def _reduce_133(val, _values, result) result = ThisNode.new result end .,., -module_eval(<<'.,.,', 'grammar.y', 300) +module_eval(<<'.,.,', 'grammar.y', 301) def _reduce_134(val, _values, result) result = ThisNode.new(val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 306) +module_eval(<<'.,.,', 'grammar.y', 307) def _reduce_135(val, _values, result) result = RangeNode.new(val[1], val[4]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 308) +module_eval(<<'.,.,', 'grammar.y', 309) def _reduce_136(val, _values, result) result = RangeNode.new(val[1], val[5], true) result end .,., -module_eval(<<'.,.,', 'grammar.y', 314) +module_eval(<<'.,.,', 'grammar.y', 315) def _reduce_137(val, _values, result) result = RangeNode.new(val[1], val[4]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 316) +module_eval(<<'.,.,', 'grammar.y', 317) def _reduce_138(val, _values, result) result = RangeNode.new(val[1], val[5], true) result end .,., -module_eval(<<'.,.,', 'grammar.y', 321) +module_eval(<<'.,.,', 'grammar.y', 322) def _reduce_139(val, _values, result) result = ArrayNode.new(val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 326) +module_eval(<<'.,.,', 'grammar.y', 327) def _reduce_140(val, _values, result) result = [] result end .,., -module_eval(<<'.,.,', 'grammar.y', 327) +module_eval(<<'.,.,', 'grammar.y', 328) def _reduce_141(val, _values, result) result = val result end .,., -module_eval(<<'.,.,', 'grammar.y', 328) +module_eval(<<'.,.,', 'grammar.y', 329) def _reduce_142(val, _values, result) result = [val[1]] result end .,., -module_eval(<<'.,.,', 'grammar.y', 329) +module_eval(<<'.,.,', 'grammar.y', 330) def _reduce_143(val, _values, result) result = val[0] << val[2] result end .,., -module_eval(<<'.,.,', 'grammar.y', 330) +module_eval(<<'.,.,', 'grammar.y', 331) def _reduce_144(val, _values, result) result = val[0] << val[2] result end .,., -module_eval(<<'.,.,', 'grammar.y', 331) +module_eval(<<'.,.,', 'grammar.y', 332) def _reduce_145(val, _values, result) result = val[0] << val[3] result end .,., -module_eval(<<'.,.,', 'grammar.y', 332) +module_eval(<<'.,.,', 'grammar.y', 333) def _reduce_146(val, _values, result) result = val[0] << val[3] result end .,., -module_eval(<<'.,.,', 'grammar.y', 333) +module_eval(<<'.,.,', 'grammar.y', 334) def _reduce_147(val, _values, result) result = val[0] result end .,., -module_eval(<<'.,.,', 'grammar.y', 338) +module_eval(<<'.,.,', 'grammar.y', 339) def _reduce_148(val, _values, result) result = val[0] result end .,., -module_eval(<<'.,.,', 'grammar.y', 339) +module_eval(<<'.,.,', 'grammar.y', 340) def _reduce_149(val, _values, result) result = ([val[0]] << val[2]).flatten result end .,., -module_eval(<<'.,.,', 'grammar.y', 344) +module_eval(<<'.,.,', 'grammar.y', 345) def _reduce_150(val, _values, result) result = TryNode.new(val[1], val[2][0], val[2][1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 345) +module_eval(<<'.,.,', 'grammar.y', 346) def _reduce_151(val, _values, result) result = TryNode.new(val[1], nil, nil, val[3]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 347) +module_eval(<<'.,.,', 'grammar.y', 348) def _reduce_152(val, _values, result) result = TryNode.new(val[1], val[2][0], val[2][1], val[4]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 352) +module_eval(<<'.,.,', 'grammar.y', 353) def _reduce_153(val, _values, result) result = [val[1], val[2]] result end .,., -module_eval(<<'.,.,', 'grammar.y', 357) +module_eval(<<'.,.,', 'grammar.y', 358) def _reduce_154(val, _values, result) result = ThrowNode.new(val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 362) +module_eval(<<'.,.,', 'grammar.y', 363) def _reduce_155(val, _values, result) result = ParentheticalNode.new(val[1], val[0].line) result end .,., -module_eval(<<'.,.,', 'grammar.y', 367) +module_eval(<<'.,.,', 'grammar.y', 368) def _reduce_156(val, _values, result) result = WhileNode.new(val[1], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 368) +module_eval(<<'.,.,', 'grammar.y', 369) def _reduce_157(val, _values, result) result = WhileNode.new(val[1], nil) result end .,., -module_eval(<<'.,.,', 'grammar.y', 369) +module_eval(<<'.,.,', 'grammar.y', 370) def _reduce_158(val, _values, result) result = WhileNode.new(val[2], Expressions.wrap(val[0])) result end .,., -module_eval(<<'.,.,', 'grammar.y', 376) +module_eval(<<'.,.,', 'grammar.y', 377) def _reduce_159(val, _values, result) result = ForNode.new(val[0], val[3], val[2][0], val[2][1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 377) +module_eval(<<'.,.,', 'grammar.y', 378) def _reduce_160(val, _values, result) result = ForNode.new(val[3], val[2], val[1][0], val[1][1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 382) +module_eval(<<'.,.,', 'grammar.y', 383) def _reduce_161(val, _values, result) result = val result end .,., -module_eval(<<'.,.,', 'grammar.y', 383) +module_eval(<<'.,.,', 'grammar.y', 384) def _reduce_162(val, _values, result) result = [val[0], val[2]] result end .,., -module_eval(<<'.,.,', 'grammar.y', 388) +module_eval(<<'.,.,', 'grammar.y', 389) def _reduce_163(val, _values, result) result = {:source => val[1]} result end .,., -module_eval(<<'.,.,', 'grammar.y', 389) +module_eval(<<'.,.,', 'grammar.y', 390) def _reduce_164(val, _values, result) result = {:source => val[1], :object => true} result end .,., -module_eval(<<'.,.,', 'grammar.y', 391) +module_eval(<<'.,.,', 'grammar.y', 392) def _reduce_165(val, _values, result) result = val[0].merge(:filter => val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 393) +module_eval(<<'.,.,', 'grammar.y', 394) def _reduce_166(val, _values, result) result = val[0].merge(:step => val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 399) +module_eval(<<'.,.,', 'grammar.y', 400) def _reduce_167(val, _values, result) result = val[3].rewrite_condition(val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 401) +module_eval(<<'.,.,', 'grammar.y', 402) def _reduce_168(val, _values, result) result = val[3].rewrite_condition(val[1]).add_else(val[5]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 406) +module_eval(<<'.,.,', 'grammar.y', 407) def _reduce_169(val, _values, result) result = val[0] result end .,., -module_eval(<<'.,.,', 'grammar.y', 407) +module_eval(<<'.,.,', 'grammar.y', 408) def _reduce_170(val, _values, result) result = val[0] << val[1] result end .,., -module_eval(<<'.,.,', 'grammar.y', 412) +module_eval(<<'.,.,', 'grammar.y', 413) def _reduce_171(val, _values, result) result = IfNode.new(val[1], val[2], nil, {:statement => true}) result end .,., -module_eval(<<'.,.,', 'grammar.y', 414) +module_eval(<<'.,.,', 'grammar.y', 415) def _reduce_172(val, _values, result) result = IfNode.new(val[1], val[2], nil, {:statement => true}) result end .,., -module_eval(<<'.,.,', 'grammar.y', 415) +module_eval(<<'.,.,', 'grammar.y', 416) def _reduce_173(val, _values, result) result = val[2].add_comment(val[0]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 420) +module_eval(<<'.,.,', 'grammar.y', 421) def _reduce_174(val, _values, result) result = IfNode.new(val[1], val[2]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 425) +module_eval(<<'.,.,', 'grammar.y', 426) def _reduce_175(val, _values, result) result = val[1].force_statement result end .,., -module_eval(<<'.,.,', 'grammar.y', 430) +module_eval(<<'.,.,', 'grammar.y', 431) def _reduce_176(val, _values, result) result = val[0] result end .,., -module_eval(<<'.,.,', 'grammar.y', 431) +module_eval(<<'.,.,', 'grammar.y', 432) def _reduce_177(val, _values, result) result = val[0].add_else(val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 436) +module_eval(<<'.,.,', 'grammar.y', 437) def _reduce_178(val, _values, result) result = nil result end .,., -module_eval(<<'.,.,', 'grammar.y', 437) +module_eval(<<'.,.,', 'grammar.y', 438) def _reduce_179(val, _values, result) result = val[1] result end .,., -module_eval(<<'.,.,', 'grammar.y', 442) +module_eval(<<'.,.,', 'grammar.y', 443) def _reduce_180(val, _values, result) result = val[0] result end .,., -module_eval(<<'.,.,', 'grammar.y', 443) +module_eval(<<'.,.,', 'grammar.y', 444) def _reduce_181(val, _values, result) result = val[0].add_else(val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 448) +module_eval(<<'.,.,', 'grammar.y', 449) def _reduce_182(val, _values, result) result = val[0].add_else(val[1]) result end .,., -module_eval(<<'.,.,', 'grammar.y', 449) +module_eval(<<'.,.,', 'grammar.y', 450) def _reduce_183(val, _values, result) result = IfNode.new(val[2], Expressions.wrap(val[0]), nil, {:statement => true}) result end .,., -module_eval(<<'.,.,', 'grammar.y', 450) +module_eval(<<'.,.,', 'grammar.y', 451) def _reduce_184(val, _values, result) result = IfNode.new(val[2], Expressions.wrap(val[0]), nil, {:statement => true, :invert => true}) result From decaea0f5f0619ca3de31a3a04c05b0134842035 Mon Sep 17 00:00:00 2001 From: Jeremy Ashkenas Date: Sat, 6 Feb 2010 10:12:57 -0500 Subject: [PATCH 31/37] adding 'by' to array comprehensions --- lib/coffee_script/nodes.rb | 5 +++-- test/fixtures/execution/test_array_comprehension.coffee | 6 ++++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/lib/coffee_script/nodes.rb b/lib/coffee_script/nodes.rb index 87648c243a..6b0ce78d79 100644 --- a/lib/coffee_script/nodes.rb +++ b/lib/coffee_script/nodes.rb @@ -848,8 +848,9 @@ def compile_node(o) for_part = "#{index_var}=0, #{source.compile(o.merge(:index => ivar, :step => @step))}, #{index_var}++" else index_var = nil - source_part = "#{svar} = #{source.compile(o)};\n#{idt}" - for_part = @object ? "#{ivar} in #{svar}" : "#{ivar} = 0; #{ivar} < #{svar}.length; #{ivar}++" + source_part = "#{svar} = #{@source.compile(o)};\n#{idt}" + step_part = @step ? "#{ivar} += #{@step.compile(o)}" : "#{ivar}++" + for_part = @object ? "#{ivar} in #{svar}" : "#{ivar} = 0; #{ivar} < #{svar}.length; #{step_part}" var_part = "#{body_dent}#{@name} = #{svar}[#{ivar}];\n" if @name # body.unshift(AssignNode.new(@name, ValueNode.new(svar, [IndexNode.new(ivar)]))) if @name end diff --git a/test/fixtures/execution/test_array_comprehension.coffee b/test/fixtures/execution/test_array_comprehension.coffee index 03c1e1f76b..08350a9349 100644 --- a/test/fixtures/execution/test_array_comprehension.coffee +++ b/test/fixtures/execution/test_array_comprehension.coffee @@ -40,3 +40,9 @@ for method in methods print obj.one() is "I'm one" print obj.two() is "I'm two" print obj.three() is "I'm three" + + +# Steps should work for array comprehensions. + +array: [0..10] +print num % 2 is 0 for num in array by 2 From 47bc1d5fdaf27922be5d228cec7f2bc4f4757392 Mon Sep 17 00:00:00 2001 From: Jeremy Ashkenas Date: Sun, 7 Feb 2010 11:33:29 -0500 Subject: [PATCH 32/37] added a blocks example --- examples/blocks.coffee | 57 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 examples/blocks.coffee diff --git a/examples/blocks.coffee b/examples/blocks.coffee new file mode 100644 index 0000000000..b15e972cef --- /dev/null +++ b/examples/blocks.coffee @@ -0,0 +1,57 @@ +# After wycats' http://yehudakatz.com/2010/02/07/the-building-blocks-of-ruby/ + +# Sinatra. +get '/hello', -> + 'Hello World' + + +# Append. +append: (location, data) -> + path: new Pathname location + throw "Location does not exist" unless path.exists() + + File.open path, 'a', (file) -> + file.puts YAML.dump data + + data + + +# Rubinius' File.open implementation. +File.open: (path, mode, block) -> + io: new File path, mode + + return io unless block + + try + block io + finally + try + io.close() unless io.closed() + catch error + # nothing, just swallow them. + + +# Write. +write: (location, data) -> + path = new Pathname location + raise "Location does not exist" unless path.exists() + + File.open path, 'w', (file) -> + return false if Digest.MD5.hexdigest(file.read()) is data.hash() + file.puts YAML.dump data + true + + +# Rails' respond_to. +index: -> + people: Person.find 'all' + + respond_to (format) -> + format.html() + format.xml -> render { xml: people.xml() } + + +# Synchronization. +synchronize: (block) -> + lock() + try block() finally unlock() From 5ec096e40dca1897bd4d3c4638fb80c32aebf24e Mon Sep 17 00:00:00 2001 From: Jeremy Ashkenas Date: Sun, 7 Feb 2010 11:54:01 -0500 Subject: [PATCH 33/37] merging all narwhal integration into a single file, so we can merge the node branch without breaking narwhal compatibility --- Rakefile | 3 +- .../narwhal/coffee-script.coffee | 54 +++++++++++-------- .../narwhal/{lib => }/coffee-script.js | 24 +++++++-- .../narwhal/lib/coffee-script/loader.js | 21 -------- lib/coffee_script/narwhal/loader.coffee | 19 ------- package.json | 4 +- 6 files changed, 55 insertions(+), 70 deletions(-) rename lib/coffee_script/narwhal/{lib => }/coffee-script.js (78%) delete mode 100644 lib/coffee_script/narwhal/lib/coffee-script/loader.js delete mode 100644 lib/coffee_script/narwhal/loader.coffee diff --git a/Rakefile b/Rakefile index ce2a0b9783..5225d13724 100644 --- a/Rakefile +++ b/Rakefile @@ -19,8 +19,7 @@ namespace :build do desc "Compile the Narwhal interface for --interactive and --run" task :narwhal do - sh "bin/coffee lib/coffee_script/narwhal/*.coffee -o lib/coffee_script/narwhal/lib/coffee-script" - sh "mv lib/coffee_script/narwhal/lib/coffee-script/coffee-script.js lib/coffee_script/narwhal/lib/coffee-script.js" + sh "bin/coffee lib/coffee_script/narwhal/*.coffee -o lib/coffee_script/narwhal" end desc "Compile and install the Ultraviolet syntax highlighter" diff --git a/lib/coffee_script/narwhal/coffee-script.coffee b/lib/coffee_script/narwhal/coffee-script.coffee index e9f496493d..a6d7636ffa 100644 --- a/lib/coffee_script/narwhal/coffee-script.coffee +++ b/lib/coffee_script/narwhal/coffee-script.coffee @@ -1,62 +1,74 @@ -# This (javascript) file is generated from lib/coffee_script/narwhal/coffee-script.coffee - -# Executes the `coffee` Ruby program to convert from CoffeeScript -# to Javascript. Eventually this will hopefully happen entirely within JS. +# The Narwhal-compatibility wrapper for CoffeeScript. # Require external dependencies. -OS: require('os') -File: require('file') -Readline: require('readline') +OS: require 'os' +File: require 'file' +Readline: require 'readline' # The path to the CoffeeScript Compiler. -coffeePath: File.path(module.path).dirname().dirname().dirname().dirname().dirname().join('bin', 'coffee') +coffeePath: File.path(module.path).dirname().dirname().dirname().dirname().join('bin', 'coffee') # Our general-purpose error handler. checkForErrors: (coffeeProcess) -> return true if coffeeProcess.wait() is 0 - system.stderr.print(coffeeProcess.stderr.read()) - throw new Error("CoffeeScript compile error") + system.stderr.print coffeeProcess.stderr.read() + throw new Error "CoffeeScript compile error" # Run a simple REPL, round-tripping to the CoffeeScript compiler for every # command. exports.run: (args) -> if args.length for path, i in args - exports.evalCS(File.read(path)) + exports.evalCS File.read path delete args[i] return true while true try system.stdout.write('coffee> ').flush() - result: exports.evalCS(Readline.readline(), ['--globals']) - print(result) if result isnt undefined + result: exports.evalCS Readline.readline(), ['--globals'] + print result if result isnt undefined catch e - print(e) + print e # Compile a given CoffeeScript file into JavaScript. exports.compileFile: (path) -> - coffee: OS.popen([coffeePath, "--print", "--no-wrap", path]) - checkForErrors(coffee) + coffee: OS.popen [coffeePath, "--print", "--no-wrap", path] + checkForErrors coffee coffee.stdout.read() # Compile a string of CoffeeScript into JavaScript. exports.compile: (source, flags) -> - coffee: OS.popen([coffeePath, "--eval", "--no-wrap"].concat(flags or [])) + coffee: OS.popen [coffeePath, "--eval", "--no-wrap"].concat flags or [] coffee.stdin.write(source).flush().close() - checkForErrors(coffee) + checkForErrors coffee coffee.stdout.read() # Evaluating a string of CoffeeScript first compiles it externally. exports.evalCS: (source, flags) -> - eval(exports.compile(source, flags)) + eval exports.compile source, flags # Make a factory for the CoffeeScript environment. exports.makeNarwhalFactory: (path) -> - code: exports.compileFile(path) + code: exports.compileFile path factoryText: "function(require,exports,module,system,print){" + code + "/**/\n}" if system.engine is "rhino" Packages.org.mozilla.javascript.Context.getCurrentContext().compileFunction(global, factoryText, path, 0, null) else # eval requires parentheses, but parentheses break compileFunction. - eval("(" + factoryText + ")") + eval "(" + factoryText + ")" + +# The Narwhal loader for '.coffee' files. +factories: {} +loader: {} + +# Reload the coffee-script environment from source. +loader.reload: (topId, path) -> + factories[topId]: -> + exports.makeNarwhalFactory path + +# Ensure that the coffee-script environment is loaded. +loader.load: (topId, path) -> + factories[topId] ||= this.reload topId, path + +require.loader.loaders.unshift [".coffee", loader] diff --git a/lib/coffee_script/narwhal/lib/coffee-script.js b/lib/coffee_script/narwhal/coffee-script.js similarity index 78% rename from lib/coffee_script/narwhal/lib/coffee-script.js rename to lib/coffee_script/narwhal/coffee-script.js index b2283d0fa6..02c98cb3eb 100644 --- a/lib/coffee_script/narwhal/lib/coffee-script.js +++ b/lib/coffee_script/narwhal/coffee-script.js @@ -1,14 +1,12 @@ (function(){ - var File, OS, Readline, checkForErrors, coffeePath; - // This (javascript) file is generated from lib/coffee_script/narwhal/coffee-script.coffee - // Executes the `coffee` Ruby program to convert from CoffeeScript - // to Javascript. Eventually this will hopefully happen entirely within JS. + var File, OS, Readline, checkForErrors, coffeePath, factories, loader; + // The Narwhal-compatibility wrapper for CoffeeScript. // Require external dependencies. OS = require('os'); File = require('file'); Readline = require('readline'); // The path to the CoffeeScript Compiler. - coffeePath = File.path(module.path).dirname().dirname().dirname().dirname().dirname().join('bin', 'coffee'); + coffeePath = File.path(module.path).dirname().dirname().dirname().dirname().join('bin', 'coffee'); // Our general-purpose error handler. checkForErrors = function checkForErrors(coffeeProcess) { if (coffeeProcess.wait() === 0) { @@ -77,4 +75,20 @@ return eval("(" + factoryText + ")"); } }; + // The Narwhal loader for '.coffee' files. + factories = { + }; + loader = { + }; + // Reload the coffee-script environment from source. + loader.reload = function reload(topId, path) { + return factories[topId] = function() { + return exports.makeNarwhalFactory(path); + }; + }; + // Ensure that the coffee-script environment is loaded. + loader.load = function load(topId, path) { + return factories[topId] = factories[topId] || this.reload(topId, path); + }; + require.loader.loaders.unshift([".coffee", loader]); })(); \ No newline at end of file diff --git a/lib/coffee_script/narwhal/lib/coffee-script/loader.js b/lib/coffee_script/narwhal/lib/coffee-script/loader.js deleted file mode 100644 index 9fc8354bc9..0000000000 --- a/lib/coffee_script/narwhal/lib/coffee-script/loader.js +++ /dev/null @@ -1,21 +0,0 @@ -(function(){ - var coffeescript, factories, loader; - // This (javascript) file is generated from lib/coffee_script/narwhal/loader.coffee - coffeescript = null; - factories = { - }; - loader = { - // Reload the coffee-script environment from source. - reload: function reload(topId, path) { - coffeescript = coffeescript || require('coffee-script'); - return factories[topId] = function() { - return coffeescript.makeNarwhalFactory(path); - }; - }, - // Ensure that the coffee-script environment is loaded. - load: function load(topId, path) { - return factories[topId] = factories[topId] || this.reload(topId, path); - } - }; - require.loader.loaders.unshift([".coffee", loader]); -})(); \ No newline at end of file diff --git a/lib/coffee_script/narwhal/loader.coffee b/lib/coffee_script/narwhal/loader.coffee deleted file mode 100644 index 5b80e7330d..0000000000 --- a/lib/coffee_script/narwhal/loader.coffee +++ /dev/null @@ -1,19 +0,0 @@ -# This (javascript) file is generated from lib/coffee_script/narwhal/loader.coffee - -coffeescript: null -factories: {} - -loader: { - - # Reload the coffee-script environment from source. - reload: (topId, path) -> - coffeescript ||= require('coffee-script') - factories[topId]: -> coffeescript.makeNarwhalFactory(path) - - # Ensure that the coffee-script environment is loaded. - load: (topId, path) -> - factories[topId] ||= this.reload(topId, path) - -} - -require.loader.loaders.unshift([".coffee", loader]) diff --git a/package.json b/package.json index 7db27d07ef..aa678d875b 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "coffee-script", - "lib": "lib/coffee_script/narwhal/lib", - "preload": ["coffee-script/loader"], + "lib": "lib/coffee_script/narwhal", + "preload": ["narwhal"], "description": "Unfancy JavaScript", "keywords": ["javascript", "language"], "author": "Jeremy Ashkenas", From 293c2ffb5b61a401e9626a7479d10de121aab435 Mon Sep 17 00:00:00 2001 From: Jeremy Ashkenas Date: Sun, 7 Feb 2010 11:59:19 -0500 Subject: [PATCH 34/37] spacing --- lib/coffee_script/narwhal/coffee-script.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/coffee_script/narwhal/coffee-script.coffee b/lib/coffee_script/narwhal/coffee-script.coffee index a6d7636ffa..7107fe5184 100644 --- a/lib/coffee_script/narwhal/coffee-script.coffee +++ b/lib/coffee_script/narwhal/coffee-script.coffee @@ -60,7 +60,7 @@ exports.makeNarwhalFactory: (path) -> # The Narwhal loader for '.coffee' files. factories: {} -loader: {} +loader: {} # Reload the coffee-script environment from source. loader.reload: (topId, path) -> From 56499984caa113cd867f63bf0dcd14046bc11adc Mon Sep 17 00:00:00 2001 From: Jeremy Ashkenas Date: Sun, 7 Feb 2010 15:15:36 -0500 Subject: [PATCH 35/37] waypoint -- it's beginning to parser --- lib/coffee_script/lexer.js | 19 +- lib/coffee_script/nodes.js | 3 + lib/coffee_script/parser.js | 894 +++++++++++++++------------------- lib/coffee_script/rewriter.js | 18 +- src/lexer.coffee | 15 +- src/nodes.coffee | 3 +- src/parser.coffee | 813 +++++++++++++++---------------- src/rewriter.coffee | 18 +- 8 files changed, 848 insertions(+), 935 deletions(-) diff --git a/lib/coffee_script/lexer.js b/lib/coffee_script/lexer.js index 0b0ea18071..527bf5b631 100644 --- a/lib/coffee_script/lexer.js +++ b/lib/coffee_script/lexer.js @@ -1,6 +1,5 @@ (function(){ - var ASSIGNMENT, CALLABLE, CODE, COMMENT, COMMENT_CLEANER, HEREDOC, HEREDOC_INDENT, IDENTIFIER, JS, JS_CLEANER, KEYWORDS, LAST_DENT, LAST_DENTS, MULTILINER, MULTI_DENT, NOT_REGEX, NO_NEWLINE, NUMBER, OPERATOR, REGEX, Rewriter, STRING, STRING_NEWLINES, WHITESPACE, lex, sys; - sys = require('sys'); + var ASSIGNMENT, CALLABLE, CODE, COMMENT, COMMENT_CLEANER, HEREDOC, HEREDOC_INDENT, IDENTIFIER, JS, JS_CLEANER, KEYWORDS, LAST_DENT, LAST_DENTS, MULTILINER, MULTI_DENT, NOT_REGEX, NO_NEWLINE, NUMBER, OPERATOR, REGEX, Rewriter, STRING, STRING_NEWLINES, WHITESPACE, lex; Rewriter = require('./rewriter').Rewriter; // The lexer reads a stream of CoffeeScript and divvys it up into tagged // tokens. A minor bit of the ambiguity in the grammar has been avoided by @@ -57,7 +56,6 @@ this.chunk = this.code.slice(this.i); this.extract_next_token(); } - // sys.puts "original stream: " + this.tokens if process.ENV['VERBOSE'] this.close_indentation(); return (new Rewriter()).rewrite(this.tokens); }; @@ -188,7 +186,7 @@ } this.line += comment.match(MULTILINER).length; this.token('COMMENT', comment.replace(COMMENT_CLEANER, '').split(MULTILINER)); - this.token("\n", "\n"); + this.token('TERMINATOR', "\n"); this.i += comment.length; return true; }; @@ -228,7 +226,7 @@ this.token('OUTDENT', last_indent); move_out -= last_indent; } - this.token("\n", "\n"); + this.token('TERMINATOR', "\n"); return true; }; // Matches and consumes non-meaningful whitespace. @@ -245,7 +243,7 @@ // Use a trailing \ to escape newlines. lex.prototype.newline_token = function newline_token(newlines) { if (!(this.value() === "\n")) { - this.token("\n", "\n"); + this.token('TERMINATOR', "\n"); } return true; }; @@ -268,6 +266,9 @@ } value = value || this.chunk.substr(0, 1); tag = value.match(ASSIGNMENT) ? 'ASSIGN' : value; + if (value === ';') { + tag = 'TERMINATOR'; + } if (this.value() !== this.spaced && CALLABLE.indexOf(this.tag()) >= 0) { if (value === '(') { tag = 'CALL_START'; @@ -309,13 +310,13 @@ return tok[1]; }; // Count the occurences of a character in a string. - lex.prototype.count = function count(string, char) { + lex.prototype.count = function count(string, letter) { var num, pos; num = 0; - pos = string.indexOf(char); + pos = string.indexOf(letter); while (pos !== -1) { count += 1; - pos = string.indexOf(char, pos + 1); + pos = string.indexOf(letter, pos + 1); } return count; }; diff --git a/lib/coffee_script/nodes.js b/lib/coffee_script/nodes.js index f059ce0668..54e6956c78 100644 --- a/lib/coffee_script/nodes.js +++ b/lib/coffee_script/nodes.js @@ -5,6 +5,9 @@ __a = this.values = arguments; return Node === this.constructor ? this : __a; }; + exports.Node.wrap = function wrap(values) { + return this.values = values; + }; exports.Expressions = exports.Node; exports.LiteralNode = exports.Node; exports.ReturnNode = exports.Node; diff --git a/lib/coffee_script/parser.js b/lib/coffee_script/parser.js index a03ee6963c..7d431217e1 100644 --- a/lib/coffee_script/parser.js +++ b/lib/coffee_script/parser.js @@ -2,6 +2,7 @@ var Parser, __a, __b, __c, __d, __e, __f, bnf, grammar, name, non_terminal, o, operators, option, parser, part, tokens, unwrap; var __hasProp = Object.prototype.hasOwnProperty; Parser = require('jison').Parser; + process.mixin(require('./nodes')); // DSL =================================================================== // Detect functions: [ unwrap = /function\s*\(\)\s*\{\s*return\s*([\s\S]*);\s*\}/; @@ -22,33 +23,45 @@ // All parsing will end in this rule, being the trunk of the AST. Root: [o("", function() { return new Expressions(); - }), o("Terminator", function() { + }), o("TERMINATOR", function() { return new Expressions(); - }), o("Expressions"), o("Block Terminator") + }), o("Expressions"), o("Block TERMINATOR") ], // Any list of expressions or method body, seperated by line breaks or semis. Expressions: [o("Expression", function() { return Expressions.wrap([$1]); - }), o("Expressions Terminator Expression", function() { + }), o("Expressions TERMINATOR Expression", function() { return $1.push($3); - }), o("Expressions Terminator") + }), o("Expressions TERMINATOR") ], // All types of expressions in our language. The basic unit of CoffeeScript // is the expression. - Expression: [o("Value"), o("Call"), o("Code"), o("Operation"), o("Assign"), o("If"), o("Try"), o("Throw"), o("Return"), o("While"), o("For"), o("Switch"), o("Extends"), o("Splat"), o("Existence"), o("Comment")], - // A block of expressions. Note that the Rewriter will convert some postfix - // forms into blocks for us, by altering the token stream. - Block: [o("INDENT Expressions OUTDENT", function() { - return $2; - }), o("INDENT OUTDENT", function() { - return new Expressions(); - }) - ], - // Tokens that can terminate an expression. - Terminator: [o("\n"), o(";")], + Expression: [o("Value"), + // o "Call" + // o "Code" + // o "Operation" + // o "Assign" + // o "If" + // o "Try" + // o "Throw" + // o "Return" + // o "While" + // o "For" + // o "Switch" + // o "Extends" + // o "Splat" + // o "Existence" + // o "Comment" + ], + // # A block of expressions. Note that the Rewriter will convert some postfix + // # forms into blocks for us, by altering the token stream. + // Block: [ + // o "INDENT Expressions OUTDENT", -> $2 + // o "INDENT OUTDENT", -> new Expressions() + // ] // All hard-coded values. These can be printed straight to JavaScript. Literal: [o("NUMBER", function() { - return new LiteralNode($1); + return new LiteralNode(yytext); }), o("STRING", function() { return new LiteralNode($1); }), o("JS", function() { @@ -75,487 +88,387 @@ return new LiteralNode(false); }) ], - // Assignment to a variable (or index). - Assign: [o("Value ASSIGN Expression", function() { - return new AssignNode($1, $3); - }) - ], - // Assignment within an object literal (can be quoted). - AssignObj: [o("IDENTIFIER ASSIGN Expression", function() { - return new AssignNode(new ValueNode($1), $3, 'object'); - }), o("STRING ASSIGN Expression", function() { - return new AssignNode(new ValueNode(new LiteralNode($1)), $3, 'object'); - }), o("Comment") - ], - // A return statement. - Return: [o("RETURN Expression", function() { - return new ReturnNode($2); - }), o("RETURN", function() { - return new ReturnNode(new ValueNode(new LiteralNode('null'))); - }) - ], - // A comment. - Comment: [o("COMMENT", function() { - return new CommentNode($1); - }) - ], - // Arithmetic and logical operators - // For Ruby's Operator precedence, see: [ - // https://www.cs.auckland.ac.nz/references/ruby/ProgrammingRuby/language.html - Operation: [o("! Expression", function() { - return new OpNode($1, $2); - }), o("!! Expression", function() { - return new OpNode($1, $2); - }), o("- Expression", function() { - return new OpNode($1, $2); - }), o("+ Expression", function() { - return new OpNode($1, $2); - }), o("NOT Expression", function() { - return new OpNode($1, $2); - }), o("~ Expression", function() { - return new OpNode($1, $2); - }), o("-- Expression", function() { - return new OpNode($1, $2); - }), o("++ Expression", function() { - return new OpNode($1, $2); - }), o("DELETE Expression", function() { - return new OpNode($1, $2); - }), o("TYPEOF Expression", function() { - return new OpNode($1, $2); - }), o("Expression --", function() { - return new OpNode($2, $1, null, true); - }), o("Expression ++", function() { - return new OpNode($2, $1, null, true); - }), o("Expression * Expression", function() { - return new OpNode($2, $1, $3); - }), o("Expression / Expression", function() { - return new OpNode($2, $1, $3); - }), o("Expression % Expression", function() { - return new OpNode($2, $1, $3); - }), o("Expression + Expression", function() { - return new OpNode($2, $1, $3); - }), o("Expression - Expression", function() { - return new OpNode($2, $1, $3); - }), o("Expression << Expression", function() { - return new OpNode($2, $1, $3); - }), o("Expression >> Expression", function() { - return new OpNode($2, $1, $3); - }), o("Expression >>> Expression", function() { - return new OpNode($2, $1, $3); - }), o("Expression & Expression", function() { - return new OpNode($2, $1, $3); - }), o("Expression | Expression", function() { - return new OpNode($2, $1, $3); - }), o("Expression ^ Expression", function() { - return new OpNode($2, $1, $3); - }), o("Expression <= Expression", function() { - return new OpNode($2, $1, $3); - }), o("Expression < Expression", function() { - return new OpNode($2, $1, $3); - }), o("Expression > Expression", function() { - return new OpNode($2, $1, $3); - }), o("Expression >= Expression", function() { - return new OpNode($2, $1, $3); - }), o("Expression == Expression", function() { - return new OpNode($2, $1, $3); - }), o("Expression != Expression", function() { - return new OpNode($2, $1, $3); - }), o("Expression IS Expression", function() { - return new OpNode($2, $1, $3); - }), o("Expression ISNT Expression", function() { - return new OpNode($2, $1, $3); - }), o("Expression && Expression", function() { - return new OpNode($2, $1, $3); - }), o("Expression || Expression", function() { - return new OpNode($2, $1, $3); - }), o("Expression AND Expression", function() { - return new OpNode($2, $1, $3); - }), o("Expression OR Expression", function() { - return new OpNode($2, $1, $3); - }), o("Expression ? Expression", function() { - return new OpNode($2, $1, $3); - }), o("Expression -= Expression", function() { - return new OpNode($2, $1, $3); - }), o("Expression += Expression", function() { - return new OpNode($2, $1, $3); - }), o("Expression /= Expression", function() { - return new OpNode($2, $1, $3); - }), o("Expression *= Expression", function() { - return new OpNode($2, $1, $3); - }), o("Expression %= Expression", function() { - return new OpNode($2, $1, $3); - }), o("Expression ||= Expression", function() { - return new OpNode($2, $1, $3); - }), o("Expression &&= Expression", function() { - return new OpNode($2, $1, $3); - }), o("Expression ?= Expression", function() { - return new OpNode($2, $1, $3); - }), o("Expression INSTANCEOF Expression", function() { - return new OpNode($2, $1, $3); - }), o("Expression IN Expression", function() { - return new OpNode($2, $1, $3); - }) - ], - // Try abbreviated expressions to make the grammar build faster: - // UnaryOp: [ - // o "!" - // o "!!" - // o "NOT" - // o "~" - // o "--" - // o "++" - // o "DELETE" - // o "TYPEOF" - // ] - // - // BinaryOp: [ - // o "*" - // o "/" - // o "%" - // o "+" - // o "-" - // o "<<" - // o ">>" - // o ">>>" - // o "&" - // o "|" - // o "^" - // o "<=" - // o "<" - // o ">" - // o ">=" - // o "==" - // o "!=" - // o "IS" - // o "ISNT" - // o "&&" - // o "||" - // o "AND" - // o "OR" - // o "?" - // o "-=" - // o "+=" - // o "/=" - // o "*=" - // o "%=" - // o "||=" - // o "&&=" - // o "?=" - // o "INSTANCEOF" - // o "IN" + // # Assignment to a variable (or index). + // Assign: [ + // o "Value ASSIGN Expression", -> new AssignNode($1, $3) + // ] + // + // # Assignment within an object literal (can be quoted). + // AssignObj: [ + // o "IDENTIFIER ASSIGN Expression", -> new AssignNode(new ValueNode($1), $3, 'object') + // o "STRING ASSIGN Expression", -> new AssignNode(new ValueNode(new LiteralNode($1)), $3, 'object') + // o "Comment" + // ] + // + // # A return statement. + // Return: [ + // o "RETURN Expression", -> new ReturnNode($2) + // o "RETURN", -> new ReturnNode(new ValueNode(new LiteralNode('null'))) // ] // + // # A comment. + // Comment: [ + // o "COMMENT", -> new CommentNode($1) + // ] + // + // # Arithmetic and logical operators + // # For Ruby's Operator precedence, see: [ + // # https://www.cs.auckland.ac.nz/references/ruby/ProgrammingRuby/language.html // Operation: [ - // o "Expression BinaryOp Expression", -> new OpNode($2, $1, $3) - // o "UnaryOp Expression", -> new OpNode($1, $2) + // o "! Expression", -> new OpNode($1, $2) + // o "!! Expression", -> new OpNode($1, $2) + // o "- Expression", -> new OpNode($1, $2) + // o "+ Expression", -> new OpNode($1, $2) + // o "NOT Expression", -> new OpNode($1, $2) + // o "~ Expression", -> new OpNode($1, $2) + // o "-- Expression", -> new OpNode($1, $2) + // o "++ Expression", -> new OpNode($1, $2) + // o "DELETE Expression", -> new OpNode($1, $2) + // o "TYPEOF Expression", -> new OpNode($1, $2) + // o "Expression --", -> new OpNode($2, $1, null, true) + // o "Expression ++", -> new OpNode($2, $1, null, true) + // + // o "Expression * Expression", -> new OpNode($2, $1, $3) + // o "Expression / Expression", -> new OpNode($2, $1, $3) + // o "Expression % Expression", -> new OpNode($2, $1, $3) + // + // o "Expression + Expression", -> new OpNode($2, $1, $3) + // o "Expression - Expression", -> new OpNode($2, $1, $3) + // + // o "Expression << Expression", -> new OpNode($2, $1, $3) + // o "Expression >> Expression", -> new OpNode($2, $1, $3) + // o "Expression >>> Expression", -> new OpNode($2, $1, $3) + // + // o "Expression & Expression", -> new OpNode($2, $1, $3) + // o "Expression | Expression", -> new OpNode($2, $1, $3) + // o "Expression ^ Expression", -> new OpNode($2, $1, $3) + // + // o "Expression <= Expression", -> new OpNode($2, $1, $3) + // o "Expression < Expression", -> new OpNode($2, $1, $3) + // o "Expression > Expression", -> new OpNode($2, $1, $3) + // o "Expression >= Expression", -> new OpNode($2, $1, $3) + // + // o "Expression == Expression", -> new OpNode($2, $1, $3) + // o "Expression != Expression", -> new OpNode($2, $1, $3) + // o "Expression IS Expression", -> new OpNode($2, $1, $3) + // o "Expression ISNT Expression", -> new OpNode($2, $1, $3) + // + // o "Expression && Expression", -> new OpNode($2, $1, $3) + // o "Expression || Expression", -> new OpNode($2, $1, $3) + // o "Expression AND Expression", -> new OpNode($2, $1, $3) + // o "Expression OR Expression", -> new OpNode($2, $1, $3) + // o "Expression ? Expression", -> new OpNode($2, $1, $3) + // + // o "Expression -= Expression", -> new OpNode($2, $1, $3) + // o "Expression += Expression", -> new OpNode($2, $1, $3) + // o "Expression /= Expression", -> new OpNode($2, $1, $3) + // o "Expression *= Expression", -> new OpNode($2, $1, $3) + // o "Expression %= Expression", -> new OpNode($2, $1, $3) + // o "Expression ||= Expression", -> new OpNode($2, $1, $3) + // o "Expression &&= Expression", -> new OpNode($2, $1, $3) + // o "Expression ?= Expression", -> new OpNode($2, $1, $3) + // + // o "Expression INSTANCEOF Expression", -> new OpNode($2, $1, $3) + // o "Expression IN Expression", -> new OpNode($2, $1, $3) + // ] + // + // # Try abbreviated expressions to make the grammar build faster: + // + // # UnaryOp: [ + // # o "!" + // # o "!!" + // # o "NOT" + // # o "~" + // # o "--" + // # o "++" + // # o "DELETE" + // # o "TYPEOF" + // # ] + // # + // # BinaryOp: [ + // # o "*" + // # o "/" + // # o "%" + // # o "+" + // # o "-" + // # o "<<" + // # o ">>" + // # o ">>>" + // # o "&" + // # o "|" + // # o "^" + // # o "<=" + // # o "<" + // # o ">" + // # o ">=" + // # o "==" + // # o "!=" + // # o "IS" + // # o "ISNT" + // # o "&&" + // # o "||" + // # o "AND" + // # o "OR" + // # o "?" + // # o "-=" + // # o "+=" + // # o "/=" + // # o "*=" + // # o "%=" + // # o "||=" + // # o "&&=" + // # o "?=" + // # o "INSTANCEOF" + // # o "IN" + // # ] + // # + // # Operation: [ + // # o "Expression BinaryOp Expression", -> new OpNode($2, $1, $3) + // # o "UnaryOp Expression", -> new OpNode($1, $2) + // # ] + // + // # The existence operator. + // Existence: [ + // o "Expression ?", -> new ExistenceNode($1) + // ] + // + // # Function definition. + // Code: [ + // o "PARAM_START ParamList PARAM_END FuncGlyph Block", -> new CodeNode($2, $5, $4) + // o "FuncGlyph Block", -> new CodeNode([], $2, $1) + // ] + // + // # The symbols to signify functions, and bound functions. + // FuncGlyph: [ + // o "->", -> 'func' + // o "=>", -> 'boundfunc' + // ] + // + // # The parameters to a function definition. + // ParamList: [ + // o "Param", -> [$1] + // o "ParamList , Param", -> $1.push($3) + // ] + // + // # A Parameter (or ParamSplat) in a function definition. + // Param: [ + // o "PARAM" + // o "PARAM . . .", -> new SplatNode($1) + // ] + // + // # A regular splat. + // Splat: [ + // o "Expression . . .", -> new SplatNode($1) // ] - // The existence operator. - Existence: [o("Expression ?", function() { - return new ExistenceNode($1); - }) - ], - // Function definition. - Code: [o("PARAM_START ParamList PARAM_END FuncGlyph Block", function() { - return new CodeNode($2, $5, $4); - }), o("FuncGlyph Block", function() { - return new CodeNode([], $2, $1); - }) - ], - // The symbols to signify functions, and bound functions. - FuncGlyph: [o("->", function() { - return 'func'; - }), o("=>", function() { - return 'boundfunc'; - }) - ], - // The parameters to a function definition. - ParamList: [o("Param", function() { - return [$1]; - }), o("ParamList , Param", function() { - return $1.push($3); - }) - ], - // A Parameter (or ParamSplat) in a function definition. - Param: [o("PARAM"), o("PARAM . . .", function() { - return new SplatNode($1); - }) - ], - // A regular splat. - Splat: [o("Expression . . .", function() { - return new SplatNode($1); - }) - ], // Expressions that can be treated as values. Value: [o("IDENTIFIER", function() { - return new ValueNode($1); + return new ValueNode(yytext); }), o("Literal", function() { return new ValueNode($1); - }), o("Array", function() { - return new ValueNode($1); - }), o("Object", function() { - return new ValueNode($1); - }), o("Parenthetical", function() { - return new ValueNode($1); - }), o("Range", function() { - return new ValueNode($1); - }), o("Value Accessor", function() { - return $1.push($2); - }), o("Invocation Accessor", function() { - return new ValueNode($1, [$2]); - }) - ], - // Accessing into an object or array, through dot or index notation. - Accessor: [o("PROPERTY_ACCESS IDENTIFIER", function() { - return new AccessorNode($2); - }), o("PROTOTYPE_ACCESS IDENTIFIER", function() { - return new AccessorNode($2, 'prototype'); - }), o("SOAK_ACCESS IDENTIFIER", function() { - return new AccessorNode($2, 'soak'); - }), o("Index"), o("Slice", function() { - return new SliceNode($1); - }) - ], - // Indexing into an object or array. - Index: [o("INDEX_START Expression INDEX_END", function() { - return new IndexNode($2); - }) - ], - // An object literal. - Object: [o("{ AssignList }", function() { - return new ObjectNode($2); - }) - ], - // Assignment within an object literal (comma or newline separated). - AssignList: [o("", function() { - return []; - }), o("AssignObj", function() { - return [$1]; - }), o("AssignList , AssignObj", function() { - return $1.push($3); - }), o("AssignList Terminator AssignObj", function() { - return $1.push($3); - }), o("AssignList , Terminator AssignObj", function() { - return $1.push($4); - }), o("INDENT AssignList OUTDENT", function() { - return $2; - }) - ], - // All flavors of function call (instantiation, super, and regular). - Call: [o("Invocation", function() { - return $1; - }), o("NEW Invocation", function() { - return $2.new_instance(); - }), o("Super", function() { - return $1; - }) - ], - // Extending an object's prototype. - Extends: [o("Value EXTENDS Value", function() { - return new ExtendsNode($1, $3); - }) - ], - // A generic function invocation. - Invocation: [o("Value Arguments", function() { - return new CallNode($1, $2); - }), o("Invocation Arguments", function() { - return new CallNode($1, $2); - }) - ], - // The list of arguments to a function invocation. - Arguments: [o("CALL_START ArgList CALL_END", function() { - return $2; - }) - ], - // Calling super. - Super: [o("SUPER CALL_START ArgList CALL_END", function() { - return new CallNode('super', $3); - }) - ], - // The range literal. - Range: [o("[ Expression . . Expression ]", function() { - return new RangeNode($2, $5); - }), o("[ Expression . . . Expression ]", function() { - return new RangeNode($2, $6, true); - }) - ], - // The slice literal. - Slice: [o("INDEX_START Expression . . Expression INDEX_END", function() { - return new RangeNode($2, $5); - }), o("INDEX_START Expression . . . Expression INDEX_END", function() { - return new RangeNode($2, $6, true); - }) - ], - // The array literal. - Array: [o("[ ArgList ]", function() { - return new ArrayNode($2); - }) - ], - // A list of arguments to a method call, or as the contents of an array. - ArgList: [o("", function() { - return []; - }), o("Expression", function() { - return val; - }), o("INDENT Expression", function() { - return [$2]; - }), o("ArgList , Expression", function() { - return $1.push($3); - }), o("ArgList Terminator Expression", function() { - return $1.push($3); - }), o("ArgList , Terminator Expression", function() { - return $1.push($4); - }), o("ArgList , INDENT Expression", function() { - return $1.push($4); - }), o("ArgList OUTDENT", function() { - return $1; - }) - ], - // Just simple, comma-separated, required arguments (no fancy syntax). - SimpleArgs: [o("Expression", function() { - return $1; - }), o("SimpleArgs , Expression", function() { - return ([$1].push($3)).reduce(function(a, b) { - return a.concat(b); - }); - }) - ], - // Try/catch/finally exception handling blocks. - Try: [o("TRY Block Catch", function() { - return new TryNode($2, $3[0], $3[1]); - }), o("TRY Block FINALLY Block", function() { - return new TryNode($2, nil, nil, $4); - }), o("TRY Block Catch FINALLY Block", function() { - return new TryNode($2, $3[0], $3[1], $5); - }) - ], - // A catch clause. - Catch: [o("CATCH IDENTIFIER Block", function() { - return [$2, $3]; - }) - ], - // Throw an exception. - Throw: [o("THROW Expression", function() { - return new ThrowNode($2); - }) - ], - // Parenthetical expressions. - Parenthetical: [o("( Expression )", function() { - return new ParentheticalNode($2); - }) - ], - // The while loop. (there is no do..while). - While: [o("WHILE Expression Block", function() { - return new WhileNode($2, $3); - }), o("WHILE Expression", function() { - return new WhileNode($2, nil); - }), o("Expression WHILE Expression", function() { - return new WhileNode($3, Expressions.wrap($1)); - }) - ], - // Array comprehensions, including guard and current index. - // Looks a little confusing, check nodes.rb for the arguments to ForNode. - For: [o("Expression FOR ForVariables ForSource", function() { - return new ForNode($1, $4, $3[0], $3[1]); - }), o("FOR ForVariables ForSource Block", function() { - return new ForNode($4, $3, $2[0], $2[1]); - }) - ], - // An array comprehension has variables for the current element and index. - ForVariables: [o("IDENTIFIER", function() { - return [$1]; - }), o("IDENTIFIER , IDENTIFIER", function() { - return [$1, $3]; - }) - ], - // The source of the array comprehension can optionally be filtered. - ForSource: [o("IN Expression", function() { - return { - source: $2 - }; - }), o("OF Expression", function() { - return { - source: $2, - object: true - }; - }), o("ForSource WHEN Expression", function() { - $1.filter = $3; - return $1; - }), o("ForSource BY Expression", function() { - $1.step = $3; - return $1; - }) - ], - // Switch/When blocks. - Switch: [o("SWITCH Expression INDENT Whens OUTDENT", function() { - return $4.rewrite_condition($2); - }), o("SWITCH Expression INDENT Whens ELSE Block OUTDENT", function() { - return $4.rewrite_condition($2).add_else($6); - }) - ], - // The inner list of whens. - Whens: [o("When", function() { - return $1; - }), o("Whens When", function() { - return $1.push($2); - }) - ], - // An individual when. - When: [o("LEADING_WHEN SimpleArgs Block", function() { - return new IfNode($2, $3, nil, { - statement: true - }); - }), o("LEADING_WHEN SimpleArgs Block Terminator", function() { - return new IfNode($2, $3, nil, { - statement: true - }); - }), o("Comment Terminator When", function() { - return $3.add_comment($1); - }) - ], - // The most basic form of "if". - IfBlock: [o("IF Expression Block", function() { - return new IfNode($2, $3); - }) - ], - // An elsif portion of an if-else block. - ElsIf: [o("ELSE IfBlock", function() { - return $2.force_statement(); - }) - ], - // Multiple elsifs can be chained together. - ElsIfs: [o("ElsIf", function() { - return $1; - }), o("ElsIfs ElsIf", function() { - return $1.add_else($2); - }) - ], - // Terminating else bodies are strictly optional. - ElseBody: [o("", function() { - return null; - }), o("ELSE Block", function() { - return $2; - }) - ], - // All the alternatives for ending an if-else block. - IfEnd: [o("ElseBody", function() { - return $1; - }), o("ElsIfs ElseBody", function() { - return $1.add_else($2); - }) - ], - // The full complement of if blocks, including postfix one-liner ifs and unlesses. - If: [o("IfBlock IfEnd", function() { - return $1.add_else($2); - }), o("Expression IF Expression", function() { - return new IfNode($3, Expressions.wrap($1), nil, { - statement: true - }); - }), o("Expression UNLESS Expression", function() { - return new IfNode($3, Expressions.wrap($1), nil, { - statement: true, - invert: true - }); - }) + }), + // o "Array", -> new ValueNode($1) + // o "Object", -> new ValueNode($1) + // o "Parenthetical", -> new ValueNode($1) + // o "Range", -> new ValueNode($1) + // o "Value Accessor", -> $1.push($2) + // o "Invocation Accessor", -> new ValueNode($1, [$2]) ] + // # Accessing into an object or array, through dot or index notation. + // Accessor: [ + // o "PROPERTY_ACCESS IDENTIFIER", -> new AccessorNode($2) + // o "PROTOTYPE_ACCESS IDENTIFIER", -> new AccessorNode($2, 'prototype') + // o "SOAK_ACCESS IDENTIFIER", -> new AccessorNode($2, 'soak') + // o "Index" + // o "Slice", -> new SliceNode($1) + // ] + // + // # Indexing into an object or array. + // Index: [ + // o "INDEX_START Expression INDEX_END", -> new IndexNode($2) + // ] + // + // # An object literal. + // Object: [ + // o "{ AssignList }", -> new ObjectNode($2) + // ] + // + // # Assignment within an object literal (comma or newline separated). + // AssignList: [ + // o "", -> [] + // o "AssignObj", -> [$1] + // o "AssignList , AssignObj", -> $1.push $3 + // o "AssignList TERMINATOR AssignObj", -> $1.push $3 + // o "AssignList , TERMINATOR AssignObj", -> $1.push $4 + // o "INDENT AssignList OUTDENT", -> $2 + // ] + // + // # All flavors of function call (instantiation, super, and regular). + // Call: [ + // o "Invocation", -> $1 + // o "NEW Invocation", -> $2.new_instance() + // o "Super", -> $1 + // ] + // + // # Extending an object's prototype. + // Extends: [ + // o "Value EXTENDS Value", -> new ExtendsNode($1, $3) + // ] + // + // # A generic function invocation. + // Invocation: [ + // o "Value Arguments", -> new CallNode($1, $2) + // o "Invocation Arguments", -> new CallNode($1, $2) + // ] + // + // # The list of arguments to a function invocation. + // Arguments: [ + // o "CALL_START ArgList CALL_END", -> $2 + // ] + // + // # Calling super. + // Super: [ + // o "SUPER CALL_START ArgList CALL_END", -> new CallNode('super', $3) + // ] + // + // # The range literal. + // Range: [ + // o "[ Expression . . Expression ]", -> new RangeNode($2, $5) + // o "[ Expression . . . Expression ]", -> new RangeNode($2, $6, true) + // ] + // + // # The slice literal. + // Slice: [ + // o "INDEX_START Expression . . Expression INDEX_END", -> new RangeNode($2, $5) + // o "INDEX_START Expression . . . Expression INDEX_END", -> new RangeNode($2, $6, true) + // ] + // + // # The array literal. + // Array: [ + // o "[ ArgList ]", -> new ArrayNode($2) + // ] + // + // # A list of arguments to a method call, or as the contents of an array. + // ArgList: [ + // o "", -> [] + // o "Expression", -> val + // o "INDENT Expression", -> [$2] + // o "ArgList , Expression", -> $1.push $3 + // o "ArgList TERMINATOR Expression", -> $1.push $3 + // o "ArgList , TERMINATOR Expression", -> $1.push $4 + // o "ArgList , INDENT Expression", -> $1.push $4 + // o "ArgList OUTDENT", -> $1 + // ] + // + // # Just simple, comma-separated, required arguments (no fancy syntax). + // SimpleArgs: [ + // o "Expression", -> $1 + // o "SimpleArgs , Expression", -> + // ([$1].push($3)).reduce (a, b) -> a.concat(b) + // ] + // + // # Try/catch/finally exception handling blocks. + // Try: [ + // o "TRY Block Catch", -> new TryNode($2, $3[0], $3[1]) + // o "TRY Block FINALLY Block", -> new TryNode($2, nil, nil, $4) + // o "TRY Block Catch FINALLY Block", -> new TryNode($2, $3[0], $3[1], $5) + // ] + // + // # A catch clause. + // Catch: [ + // o "CATCH IDENTIFIER Block", -> [$2, $3] + // ] + // + // # Throw an exception. + // Throw: [ + // o "THROW Expression", -> new ThrowNode($2) + // ] + // + // # Parenthetical expressions. + // Parenthetical: [ + // o "( Expression )", -> new ParentheticalNode($2) + // ] + // + // # The while loop. (there is no do..while). + // While: [ + // o "WHILE Expression Block", -> new WhileNode($2, $3) + // o "WHILE Expression", -> new WhileNode($2, nil) + // o "Expression WHILE Expression", -> new WhileNode($3, Expressions.wrap($1)) + // ] + // + // # Array comprehensions, including guard and current index. + // # Looks a little confusing, check nodes.rb for the arguments to ForNode. + // For: [ + // o "Expression FOR ForVariables ForSource", -> new ForNode($1, $4, $3[0], $3[1]) + // o "FOR ForVariables ForSource Block", -> new ForNode($4, $3, $2[0], $2[1]) + // ] + // + // # An array comprehension has variables for the current element and index. + // ForVariables: [ + // o "IDENTIFIER", -> [$1] + // o "IDENTIFIER , IDENTIFIER", -> [$1, $3] + // ] + // + // # The source of the array comprehension can optionally be filtered. + // ForSource: [ + // o "IN Expression", -> {source: $2} + // o "OF Expression", -> {source: $2, object: true} + // o "ForSource WHEN Expression", -> $1.filter: $3; $1 + // o "ForSource BY Expression", -> $1.step: $3; $1 + // ] + // + // # Switch/When blocks. + // Switch: [ + // o "SWITCH Expression INDENT Whens OUTDENT", -> $4.rewrite_condition($2) + // o "SWITCH Expression INDENT Whens ELSE Block OUTDENT", -> $4.rewrite_condition($2).add_else($6) + // ] + // + // # The inner list of whens. + // Whens: [ + // o "When", -> $1 + // o "Whens When", -> $1.push $2 + // ] + // + // # An individual when. + // When: [ + // o "LEADING_WHEN SimpleArgs Block", -> new IfNode($2, $3, nil, {statement: true}) + // o "LEADING_WHEN SimpleArgs Block TERMINATOR", -> new IfNode($2, $3, nil, {statement: true}) + // o "Comment TERMINATOR When", -> $3.add_comment($1) + // ] + // + // # The most basic form of "if". + // IfBlock: [ + // o "IF Expression Block", -> new IfNode($2, $3) + // ] + // + // # An elsif portion of an if-else block. + // ElsIf: [ + // o "ELSE IfBlock", -> $2.force_statement() + // ] + // + // # Multiple elsifs can be chained together. + // ElsIfs: [ + // o "ElsIf", -> $1 + // o "ElsIfs ElsIf", -> $1.add_else($2) + // ] + // + // # Terminating else bodies are strictly optional. + // ElseBody: [ + // o "", -> null + // o "ELSE Block", -> $2 + // ] + // + // # All the alternatives for ending an if-else block. + // IfEnd: [ + // o "ElseBody", -> $1 + // o "ElsIfs ElseBody", -> $1.add_else($2) + // ] + // + // # The full complement of if blocks, including postfix one-liner ifs and unlesses. + // If: [ + // o "IfBlock IfEnd", -> $1.add_else($2) + // o "Expression IF Expression", -> new IfNode($3, Expressions.wrap($1), nil, {statement: true}) + // o "Expression UNLESS Expression", -> new IfNode($3, Expressions.wrap($1), nil, {statement: true, invert: true}) + // ] }; // Helpers ============================================================== // Make the Jison parser. @@ -588,7 +501,8 @@ parser = new Parser({ tokens: tokens, bnf: bnf, - operators: operators + operators: operators, + startSymbol: 'Root' }, { debug: false }); @@ -598,7 +512,7 @@ var token; token = this.tokens[this.pos] || [""]; this.pos += 1; - // this.yylineno: token and token[1] and token[1][1] + this.yylineno = token[2]; this.yytext = token[1]; return token[0]; }, diff --git a/lib/coffee_script/rewriter.js b/lib/coffee_script/rewriter.js index f20af78521..901c60398a 100644 --- a/lib/coffee_script/rewriter.js +++ b/lib/coffee_script/rewriter.js @@ -29,7 +29,7 @@ EXPRESSION_CLOSE = ['CATCH', 'WHEN', 'ELSE', 'FINALLY'].concat(EXPRESSION_TAIL); // Tokens pairs that, in immediate succession, indicate an implicit call. IMPLICIT_FUNC = ['IDENTIFIER', 'SUPER', ')', 'CALL_END', ']', 'INDEX_END']; - IMPLICIT_END = ['IF', 'UNLESS', 'FOR', 'WHILE', "\n", 'OUTDENT']; + IMPLICIT_END = ['IF', 'UNLESS', 'FOR', 'WHILE', 'TERMINATOR', 'OUTDENT']; IMPLICIT_CALL = ['IDENTIFIER', 'NUMBER', 'STRING', 'JS', 'REGEX', 'NEW', 'PARAM_START', 'TRY', 'DELETE', 'TYPEOF', 'SWITCH', 'ARGUMENTS', 'TRUE', 'FALSE', 'YES', 'NO', 'ON', 'OFF', '!', '!!', 'NOT', '->', '=>', '[', '(', '{']; // The inverse mappings of token pairs we're trying to fix up. INVERSES = { @@ -43,7 +43,7 @@ // Single-line flavors of block expressions that have unclosed endings. // The grammar can't disambiguate them, so we insert the implicit indentation. SINGLE_LINERS = ['ELSE', "->", "=>", 'TRY', 'FINALLY', 'THEN']; - SINGLE_CLOSERS = ["\n", 'CATCH', 'FINALLY', 'ELSE', 'OUTDENT', 'LEADING_WHEN', 'PARAM_START']; + SINGLE_CLOSERS = ['TERMINATOR', 'CATCH', 'FINALLY', 'ELSE', 'OUTDENT', 'LEADING_WHEN', 'PARAM_START']; // Rewrite the token stream in multiple passes, one logical filter at // a time. This could certainly be changed into a single pass through the // stream, with a big ol' efficient switch, but it's much nicer like this. @@ -64,14 +64,14 @@ // Allow the return value of the block to tell us how many tokens to move // forwards (or backwards) in the stream, to make sure we don't miss anything // as the stream changes length under our feet. - re.prototype.scan_tokens = function scan_tokens(yield) { + re.prototype.scan_tokens = function scan_tokens(block) { var i, move; i = 0; while (true) { if (!(this.tokens[i])) { break; } - move = yield(this.tokens[i - 1], this.tokens[i], this.tokens[i + 1], i); + move = block(this.tokens[i - 1], this.tokens[i], this.tokens[i + 1], i); i += move; } return true; @@ -91,12 +91,12 @@ this.tokens.splice(i + 2, 1); this.tokens.splice(i - 2, 1); return 0; - } else if (prev[0] === "\n" && after[0] === 'INDENT') { + } else if (prev[0] === 'TERMINATOR' && after[0] === 'INDENT') { this.tokens.splice(i + 2, 1); this.tokens[i - 1] = after; return 1; - } else if (prev[0] !== "\n" && prev[0] !== 'INDENT' && prev[0] !== 'OUTDENT') { - this.tokens.splice(i, 0, ["\n", "\n"]); + } else if (prev[0] !== 'TERMINATOR' && prev[0] !== 'INDENT' && prev[0] !== 'OUTDENT') { + this.tokens.splice(i, 0, ['TERMINATOR', "\n", prev[2]]); return 2; } else { return 1; @@ -110,7 +110,7 @@ // Leading newlines would introduce an ambiguity in the grammar, so we // dispatch them here. re.prototype.remove_leading_newlines = function remove_leading_newlines() { - if (this.tokens[0][0] === "\n") { + if (this.tokens[0][0] === 'TERMINATOR') { return this.tokens.shift(); } }; @@ -119,7 +119,7 @@ re.prototype.remove_mid_expression_newlines = function remove_mid_expression_newlines() { return this.scan_tokens((function(__this) { var __func = function(prev, token, post, i) { - if (!(post && EXPRESSION_CLOSE.indexOf(post[0]) >= 0 && token[0] === "\n")) { + if (!(post && EXPRESSION_CLOSE.indexOf(post[0]) >= 0 && token[0] === 'TERMINATOR')) { return 1; } this.tokens.splice(i, 1); diff --git a/src/lexer.coffee b/src/lexer.coffee index 42021a3b51..330e47baa1 100644 --- a/src/lexer.coffee +++ b/src/lexer.coffee @@ -1,4 +1,3 @@ -sys: require 'sys' Rewriter: require('./rewriter').Rewriter # The lexer reads a stream of CoffeeScript and divvys it up into tagged @@ -70,7 +69,6 @@ lex::tokenize: (code) -> while this.i < this.code.length this.chunk: this.code.slice(this.i) this.extract_next_token() - # sys.puts "original stream: " + this.tokens if process.ENV['VERBOSE'] this.close_indentation() (new Rewriter()).rewrite this.tokens @@ -157,7 +155,7 @@ lex::comment_token: -> return false unless comment: this.match COMMENT, 1 this.line += comment.match(MULTILINER).length this.token 'COMMENT', comment.replace(COMMENT_CLEANER, '').split(MULTILINER) - this.token "\n", "\n" + this.token 'TERMINATOR', "\n" this.i += comment.length true @@ -187,7 +185,7 @@ lex::outdent_token: (move_out) -> last_indent: this.indents.pop() this.token 'OUTDENT', last_indent move_out -= last_indent - this.token "\n", "\n" + this.token 'TERMINATOR', "\n" true # Matches and consumes non-meaningful whitespace. @@ -200,7 +198,7 @@ lex::whitespace_token: -> # Multiple newlines get merged together. # Use a trailing \ to escape newlines. lex::newline_token: (newlines) -> - this.token "\n", "\n" unless this.value() is "\n" + this.token 'TERMINATOR', "\n" unless this.value() is "\n" true # Tokens to explicitly escape newlines are removed once their job is done. @@ -217,6 +215,7 @@ lex::literal_token: -> this.tag_parameters() if value and value.match(CODE) value ||= this.chunk.substr(0, 1) tag: if value.match(ASSIGNMENT) then 'ASSIGN' else value + tag: 'TERMINATOR' if value == ';' if this.value() isnt this.spaced and CALLABLE.indexOf(this.tag()) >= 0 tag: 'CALL_START' if value is '(' tag: 'INDEX_START' if value is '[' @@ -244,12 +243,12 @@ lex::value: (index, val) -> tok[1] # Count the occurences of a character in a string. -lex::count: (string, char) -> +lex::count: (string, letter) -> num: 0 - pos: string.indexOf(char) + pos: string.indexOf(letter) while pos isnt -1 count += 1 - pos: string.indexOf(char, pos + 1) + pos: string.indexOf(letter, pos + 1) count # Attempt to match a string against the current chunk, returning the indexed diff --git a/src/nodes.coffee b/src/nodes.coffee index 793ed44d0c..c4cc7c1998 100644 --- a/src/nodes.coffee +++ b/src/nodes.coffee @@ -1,4 +1,5 @@ -exports.Node: -> this.values: arguments +exports.Node: -> @values: arguments +exports.Node.wrap: (values) -> @values: values exports.Expressions : exports.Node exports.LiteralNode : exports.Node diff --git a/src/parser.coffee b/src/parser.coffee index 4fde86631a..17477d3a0c 100644 --- a/src/parser.coffee +++ b/src/parser.coffee @@ -1,4 +1,5 @@ Parser: require('jison').Parser +process.mixin require './nodes' # DSL =================================================================== @@ -45,55 +46,49 @@ grammar: { # All parsing will end in this rule, being the trunk of the AST. Root: [ o "", -> new Expressions() - o "Terminator", -> new Expressions() + o "TERMINATOR", -> new Expressions() o "Expressions" - o "Block Terminator" + o "Block TERMINATOR" ] # Any list of expressions or method body, seperated by line breaks or semis. Expressions: [ o "Expression", -> Expressions.wrap([$1]) - o "Expressions Terminator Expression", -> $1.push($3) - o "Expressions Terminator" + o "Expressions TERMINATOR Expression", -> $1.push($3) + o "Expressions TERMINATOR" ] # All types of expressions in our language. The basic unit of CoffeeScript # is the expression. Expression: [ o "Value" - o "Call" - o "Code" - o "Operation" - o "Assign" - o "If" - o "Try" - o "Throw" - o "Return" - o "While" - o "For" - o "Switch" - o "Extends" - o "Splat" - o "Existence" - o "Comment" - ] - - # A block of expressions. Note that the Rewriter will convert some postfix - # forms into blocks for us, by altering the token stream. - Block: [ - o "INDENT Expressions OUTDENT", -> $2 - o "INDENT OUTDENT", -> new Expressions() - ] - - # Tokens that can terminate an expression. - Terminator: [ - o "\n" - o ";" - ] + # o "Call" + # o "Code" + # o "Operation" + # o "Assign" + # o "If" + # o "Try" + # o "Throw" + # o "Return" + # o "While" + # o "For" + # o "Switch" + # o "Extends" + # o "Splat" + # o "Existence" + # o "Comment" + ] + + # # A block of expressions. Note that the Rewriter will convert some postfix + # # forms into blocks for us, by altering the token stream. + # Block: [ + # o "INDENT Expressions OUTDENT", -> $2 + # o "INDENT OUTDENT", -> new Expressions() + # ] # All hard-coded values. These can be printed straight to JavaScript. Literal: [ - o "NUMBER", -> new LiteralNode($1) + o "NUMBER", -> new LiteralNode(yytext) o "STRING", -> new LiteralNode($1) o "JS", -> new LiteralNode($1) o "REGEX", -> new LiteralNode($1) @@ -108,387 +103,387 @@ grammar: { o "OFF", -> new LiteralNode(false) ] - # Assignment to a variable (or index). - Assign: [ - o "Value ASSIGN Expression", -> new AssignNode($1, $3) - ] - - # Assignment within an object literal (can be quoted). - AssignObj: [ - o "IDENTIFIER ASSIGN Expression", -> new AssignNode(new ValueNode($1), $3, 'object') - o "STRING ASSIGN Expression", -> new AssignNode(new ValueNode(new LiteralNode($1)), $3, 'object') - o "Comment" - ] - - # A return statement. - Return: [ - o "RETURN Expression", -> new ReturnNode($2) - o "RETURN", -> new ReturnNode(new ValueNode(new LiteralNode('null'))) - ] - - # A comment. - Comment: [ - o "COMMENT", -> new CommentNode($1) - ] - - # Arithmetic and logical operators - # For Ruby's Operator precedence, see: [ - # https://www.cs.auckland.ac.nz/references/ruby/ProgrammingRuby/language.html - Operation: [ - o "! Expression", -> new OpNode($1, $2) - o "!! Expression", -> new OpNode($1, $2) - o "- Expression", -> new OpNode($1, $2) - o "+ Expression", -> new OpNode($1, $2) - o "NOT Expression", -> new OpNode($1, $2) - o "~ Expression", -> new OpNode($1, $2) - o "-- Expression", -> new OpNode($1, $2) - o "++ Expression", -> new OpNode($1, $2) - o "DELETE Expression", -> new OpNode($1, $2) - o "TYPEOF Expression", -> new OpNode($1, $2) - o "Expression --", -> new OpNode($2, $1, null, true) - o "Expression ++", -> new OpNode($2, $1, null, true) - - o "Expression * Expression", -> new OpNode($2, $1, $3) - o "Expression / Expression", -> new OpNode($2, $1, $3) - o "Expression % Expression", -> new OpNode($2, $1, $3) - - o "Expression + Expression", -> new OpNode($2, $1, $3) - o "Expression - Expression", -> new OpNode($2, $1, $3) - - o "Expression << Expression", -> new OpNode($2, $1, $3) - o "Expression >> Expression", -> new OpNode($2, $1, $3) - o "Expression >>> Expression", -> new OpNode($2, $1, $3) - - o "Expression & Expression", -> new OpNode($2, $1, $3) - o "Expression | Expression", -> new OpNode($2, $1, $3) - o "Expression ^ Expression", -> new OpNode($2, $1, $3) - - o "Expression <= Expression", -> new OpNode($2, $1, $3) - o "Expression < Expression", -> new OpNode($2, $1, $3) - o "Expression > Expression", -> new OpNode($2, $1, $3) - o "Expression >= Expression", -> new OpNode($2, $1, $3) - - o "Expression == Expression", -> new OpNode($2, $1, $3) - o "Expression != Expression", -> new OpNode($2, $1, $3) - o "Expression IS Expression", -> new OpNode($2, $1, $3) - o "Expression ISNT Expression", -> new OpNode($2, $1, $3) - - o "Expression && Expression", -> new OpNode($2, $1, $3) - o "Expression || Expression", -> new OpNode($2, $1, $3) - o "Expression AND Expression", -> new OpNode($2, $1, $3) - o "Expression OR Expression", -> new OpNode($2, $1, $3) - o "Expression ? Expression", -> new OpNode($2, $1, $3) - - o "Expression -= Expression", -> new OpNode($2, $1, $3) - o "Expression += Expression", -> new OpNode($2, $1, $3) - o "Expression /= Expression", -> new OpNode($2, $1, $3) - o "Expression *= Expression", -> new OpNode($2, $1, $3) - o "Expression %= Expression", -> new OpNode($2, $1, $3) - o "Expression ||= Expression", -> new OpNode($2, $1, $3) - o "Expression &&= Expression", -> new OpNode($2, $1, $3) - o "Expression ?= Expression", -> new OpNode($2, $1, $3) - - o "Expression INSTANCEOF Expression", -> new OpNode($2, $1, $3) - o "Expression IN Expression", -> new OpNode($2, $1, $3) - ] - - # Try abbreviated expressions to make the grammar build faster: - - # UnaryOp: [ - # o "!" - # o "!!" - # o "NOT" - # o "~" - # o "--" - # o "++" - # o "DELETE" - # o "TYPEOF" - # ] - # - # BinaryOp: [ - # o "*" - # o "/" - # o "%" - # o "+" - # o "-" - # o "<<" - # o ">>" - # o ">>>" - # o "&" - # o "|" - # o "^" - # o "<=" - # o "<" - # o ">" - # o ">=" - # o "==" - # o "!=" - # o "IS" - # o "ISNT" - # o "&&" - # o "||" - # o "AND" - # o "OR" - # o "?" - # o "-=" - # o "+=" - # o "/=" - # o "*=" - # o "%=" - # o "||=" - # o "&&=" - # o "?=" - # o "INSTANCEOF" - # o "IN" + # # Assignment to a variable (or index). + # Assign: [ + # o "Value ASSIGN Expression", -> new AssignNode($1, $3) + # ] + # + # # Assignment within an object literal (can be quoted). + # AssignObj: [ + # o "IDENTIFIER ASSIGN Expression", -> new AssignNode(new ValueNode($1), $3, 'object') + # o "STRING ASSIGN Expression", -> new AssignNode(new ValueNode(new LiteralNode($1)), $3, 'object') + # o "Comment" + # ] + # + # # A return statement. + # Return: [ + # o "RETURN Expression", -> new ReturnNode($2) + # o "RETURN", -> new ReturnNode(new ValueNode(new LiteralNode('null'))) # ] # + # # A comment. + # Comment: [ + # o "COMMENT", -> new CommentNode($1) + # ] + # + # # Arithmetic and logical operators + # # For Ruby's Operator precedence, see: [ + # # https://www.cs.auckland.ac.nz/references/ruby/ProgrammingRuby/language.html # Operation: [ - # o "Expression BinaryOp Expression", -> new OpNode($2, $1, $3) - # o "UnaryOp Expression", -> new OpNode($1, $2) + # o "! Expression", -> new OpNode($1, $2) + # o "!! Expression", -> new OpNode($1, $2) + # o "- Expression", -> new OpNode($1, $2) + # o "+ Expression", -> new OpNode($1, $2) + # o "NOT Expression", -> new OpNode($1, $2) + # o "~ Expression", -> new OpNode($1, $2) + # o "-- Expression", -> new OpNode($1, $2) + # o "++ Expression", -> new OpNode($1, $2) + # o "DELETE Expression", -> new OpNode($1, $2) + # o "TYPEOF Expression", -> new OpNode($1, $2) + # o "Expression --", -> new OpNode($2, $1, null, true) + # o "Expression ++", -> new OpNode($2, $1, null, true) + # + # o "Expression * Expression", -> new OpNode($2, $1, $3) + # o "Expression / Expression", -> new OpNode($2, $1, $3) + # o "Expression % Expression", -> new OpNode($2, $1, $3) + # + # o "Expression + Expression", -> new OpNode($2, $1, $3) + # o "Expression - Expression", -> new OpNode($2, $1, $3) + # + # o "Expression << Expression", -> new OpNode($2, $1, $3) + # o "Expression >> Expression", -> new OpNode($2, $1, $3) + # o "Expression >>> Expression", -> new OpNode($2, $1, $3) + # + # o "Expression & Expression", -> new OpNode($2, $1, $3) + # o "Expression | Expression", -> new OpNode($2, $1, $3) + # o "Expression ^ Expression", -> new OpNode($2, $1, $3) + # + # o "Expression <= Expression", -> new OpNode($2, $1, $3) + # o "Expression < Expression", -> new OpNode($2, $1, $3) + # o "Expression > Expression", -> new OpNode($2, $1, $3) + # o "Expression >= Expression", -> new OpNode($2, $1, $3) + # + # o "Expression == Expression", -> new OpNode($2, $1, $3) + # o "Expression != Expression", -> new OpNode($2, $1, $3) + # o "Expression IS Expression", -> new OpNode($2, $1, $3) + # o "Expression ISNT Expression", -> new OpNode($2, $1, $3) + # + # o "Expression && Expression", -> new OpNode($2, $1, $3) + # o "Expression || Expression", -> new OpNode($2, $1, $3) + # o "Expression AND Expression", -> new OpNode($2, $1, $3) + # o "Expression OR Expression", -> new OpNode($2, $1, $3) + # o "Expression ? Expression", -> new OpNode($2, $1, $3) + # + # o "Expression -= Expression", -> new OpNode($2, $1, $3) + # o "Expression += Expression", -> new OpNode($2, $1, $3) + # o "Expression /= Expression", -> new OpNode($2, $1, $3) + # o "Expression *= Expression", -> new OpNode($2, $1, $3) + # o "Expression %= Expression", -> new OpNode($2, $1, $3) + # o "Expression ||= Expression", -> new OpNode($2, $1, $3) + # o "Expression &&= Expression", -> new OpNode($2, $1, $3) + # o "Expression ?= Expression", -> new OpNode($2, $1, $3) + # + # o "Expression INSTANCEOF Expression", -> new OpNode($2, $1, $3) + # o "Expression IN Expression", -> new OpNode($2, $1, $3) + # ] + # + # # Try abbreviated expressions to make the grammar build faster: + # + # # UnaryOp: [ + # # o "!" + # # o "!!" + # # o "NOT" + # # o "~" + # # o "--" + # # o "++" + # # o "DELETE" + # # o "TYPEOF" + # # ] + # # + # # BinaryOp: [ + # # o "*" + # # o "/" + # # o "%" + # # o "+" + # # o "-" + # # o "<<" + # # o ">>" + # # o ">>>" + # # o "&" + # # o "|" + # # o "^" + # # o "<=" + # # o "<" + # # o ">" + # # o ">=" + # # o "==" + # # o "!=" + # # o "IS" + # # o "ISNT" + # # o "&&" + # # o "||" + # # o "AND" + # # o "OR" + # # o "?" + # # o "-=" + # # o "+=" + # # o "/=" + # # o "*=" + # # o "%=" + # # o "||=" + # # o "&&=" + # # o "?=" + # # o "INSTANCEOF" + # # o "IN" + # # ] + # # + # # Operation: [ + # # o "Expression BinaryOp Expression", -> new OpNode($2, $1, $3) + # # o "UnaryOp Expression", -> new OpNode($1, $2) + # # ] + # + # # The existence operator. + # Existence: [ + # o "Expression ?", -> new ExistenceNode($1) + # ] + # + # # Function definition. + # Code: [ + # o "PARAM_START ParamList PARAM_END FuncGlyph Block", -> new CodeNode($2, $5, $4) + # o "FuncGlyph Block", -> new CodeNode([], $2, $1) + # ] + # + # # The symbols to signify functions, and bound functions. + # FuncGlyph: [ + # o "->", -> 'func' + # o "=>", -> 'boundfunc' + # ] + # + # # The parameters to a function definition. + # ParamList: [ + # o "Param", -> [$1] + # o "ParamList , Param", -> $1.push($3) + # ] + # + # # A Parameter (or ParamSplat) in a function definition. + # Param: [ + # o "PARAM" + # o "PARAM . . .", -> new SplatNode($1) + # ] + # + # # A regular splat. + # Splat: [ + # o "Expression . . .", -> new SplatNode($1) # ] - - # The existence operator. - Existence: [ - o "Expression ?", -> new ExistenceNode($1) - ] - - # Function definition. - Code: [ - o "PARAM_START ParamList PARAM_END FuncGlyph Block", -> new CodeNode($2, $5, $4) - o "FuncGlyph Block", -> new CodeNode([], $2, $1) - ] - - # The symbols to signify functions, and bound functions. - FuncGlyph: [ - o "->", -> 'func' - o "=>", -> 'boundfunc' - ] - - # The parameters to a function definition. - ParamList: [ - o "Param", -> [$1] - o "ParamList , Param", -> $1.push($3) - ] - - # A Parameter (or ParamSplat) in a function definition. - Param: [ - o "PARAM" - o "PARAM . . .", -> new SplatNode($1) - ] - - # A regular splat. - Splat: [ - o "Expression . . .", -> new SplatNode($1) - ] # Expressions that can be treated as values. Value: [ - o "IDENTIFIER", -> new ValueNode($1) + o "IDENTIFIER", -> new ValueNode(yytext) o "Literal", -> new ValueNode($1) - o "Array", -> new ValueNode($1) - o "Object", -> new ValueNode($1) - o "Parenthetical", -> new ValueNode($1) - o "Range", -> new ValueNode($1) - o "Value Accessor", -> $1.push($2) - o "Invocation Accessor", -> new ValueNode($1, [$2]) - ] - - # Accessing into an object or array, through dot or index notation. - Accessor: [ - o "PROPERTY_ACCESS IDENTIFIER", -> new AccessorNode($2) - o "PROTOTYPE_ACCESS IDENTIFIER", -> new AccessorNode($2, 'prototype') - o "SOAK_ACCESS IDENTIFIER", -> new AccessorNode($2, 'soak') - o "Index" - o "Slice", -> new SliceNode($1) - ] - - # Indexing into an object or array. - Index: [ - o "INDEX_START Expression INDEX_END", -> new IndexNode($2) - ] - - # An object literal. - Object: [ - o "{ AssignList }", -> new ObjectNode($2) - ] - - # Assignment within an object literal (comma or newline separated). - AssignList: [ - o "", -> [] - o "AssignObj", -> [$1] - o "AssignList , AssignObj", -> $1.push $3 - o "AssignList Terminator AssignObj", -> $1.push $3 - o "AssignList , Terminator AssignObj", -> $1.push $4 - o "INDENT AssignList OUTDENT", -> $2 - ] - - # All flavors of function call (instantiation, super, and regular). - Call: [ - o "Invocation", -> $1 - o "NEW Invocation", -> $2.new_instance() - o "Super", -> $1 - ] - - # Extending an object's prototype. - Extends: [ - o "Value EXTENDS Value", -> new ExtendsNode($1, $3) - ] - - # A generic function invocation. - Invocation: [ - o "Value Arguments", -> new CallNode($1, $2) - o "Invocation Arguments", -> new CallNode($1, $2) - ] - - # The list of arguments to a function invocation. - Arguments: [ - o "CALL_START ArgList CALL_END", -> $2 - ] - - # Calling super. - Super: [ - o "SUPER CALL_START ArgList CALL_END", -> new CallNode('super', $3) - ] - - # The range literal. - Range: [ - o "[ Expression . . Expression ]", -> new RangeNode($2, $5) - o "[ Expression . . . Expression ]", -> new RangeNode($2, $6, true) - ] - - # The slice literal. - Slice: [ - o "INDEX_START Expression . . Expression INDEX_END", -> new RangeNode($2, $5) - o "INDEX_START Expression . . . Expression INDEX_END", -> new RangeNode($2, $6, true) - ] - - # The array literal. - Array: [ - o "[ ArgList ]", -> new ArrayNode($2) - ] - - # A list of arguments to a method call, or as the contents of an array. - ArgList: [ - o "", -> [] - o "Expression", -> val - o "INDENT Expression", -> [$2] - o "ArgList , Expression", -> $1.push $3 - o "ArgList Terminator Expression", -> $1.push $3 - o "ArgList , Terminator Expression", -> $1.push $4 - o "ArgList , INDENT Expression", -> $1.push $4 - o "ArgList OUTDENT", -> $1 - ] - - # Just simple, comma-separated, required arguments (no fancy syntax). - SimpleArgs: [ - o "Expression", -> $1 - o "SimpleArgs , Expression", -> - ([$1].push($3)).reduce (a, b) -> a.concat(b) - ] - - # Try/catch/finally exception handling blocks. - Try: [ - o "TRY Block Catch", -> new TryNode($2, $3[0], $3[1]) - o "TRY Block FINALLY Block", -> new TryNode($2, nil, nil, $4) - o "TRY Block Catch FINALLY Block", -> new TryNode($2, $3[0], $3[1], $5) - ] - - # A catch clause. - Catch: [ - o "CATCH IDENTIFIER Block", -> [$2, $3] - ] - - # Throw an exception. - Throw: [ - o "THROW Expression", -> new ThrowNode($2) - ] - - # Parenthetical expressions. - Parenthetical: [ - o "( Expression )", -> new ParentheticalNode($2) - ] - - # The while loop. (there is no do..while). - While: [ - o "WHILE Expression Block", -> new WhileNode($2, $3) - o "WHILE Expression", -> new WhileNode($2, nil) - o "Expression WHILE Expression", -> new WhileNode($3, Expressions.wrap($1)) - ] - - # Array comprehensions, including guard and current index. - # Looks a little confusing, check nodes.rb for the arguments to ForNode. - For: [ - o "Expression FOR ForVariables ForSource", -> new ForNode($1, $4, $3[0], $3[1]) - o "FOR ForVariables ForSource Block", -> new ForNode($4, $3, $2[0], $2[1]) - ] - - # An array comprehension has variables for the current element and index. - ForVariables: [ - o "IDENTIFIER", -> [$1] - o "IDENTIFIER , IDENTIFIER", -> [$1, $3] - ] - - # The source of the array comprehension can optionally be filtered. - ForSource: [ - o "IN Expression", -> {source: $2} - o "OF Expression", -> {source: $2, object: true} - o "ForSource WHEN Expression", -> $1.filter: $3; $1 - o "ForSource BY Expression", -> $1.step: $3; $1 - ] - - # Switch/When blocks. - Switch: [ - o "SWITCH Expression INDENT Whens OUTDENT", -> $4.rewrite_condition($2) - o "SWITCH Expression INDENT Whens ELSE Block OUTDENT", -> $4.rewrite_condition($2).add_else($6) - ] - - # The inner list of whens. - Whens: [ - o "When", -> $1 - o "Whens When", -> $1.push $2 - ] - - # An individual when. - When: [ - o "LEADING_WHEN SimpleArgs Block", -> new IfNode($2, $3, nil, {statement: true}) - o "LEADING_WHEN SimpleArgs Block Terminator", -> new IfNode($2, $3, nil, {statement: true}) - o "Comment Terminator When", -> $3.add_comment($1) - ] - - # The most basic form of "if". - IfBlock: [ - o "IF Expression Block", -> new IfNode($2, $3) - ] - - # An elsif portion of an if-else block. - ElsIf: [ - o "ELSE IfBlock", -> $2.force_statement() - ] - - # Multiple elsifs can be chained together. - ElsIfs: [ - o "ElsIf", -> $1 - o "ElsIfs ElsIf", -> $1.add_else($2) - ] - - # Terminating else bodies are strictly optional. - ElseBody: [ - o "", -> null - o "ELSE Block", -> $2 - ] - - # All the alternatives for ending an if-else block. - IfEnd: [ - o "ElseBody", -> $1 - o "ElsIfs ElseBody", -> $1.add_else($2) - ] - - # The full complement of if blocks, including postfix one-liner ifs and unlesses. - If: [ - o "IfBlock IfEnd", -> $1.add_else($2) - o "Expression IF Expression", -> new IfNode($3, Expressions.wrap($1), nil, {statement: true}) - o "Expression UNLESS Expression", -> new IfNode($3, Expressions.wrap($1), nil, {statement: true, invert: true}) - ] + # o "Array", -> new ValueNode($1) + # o "Object", -> new ValueNode($1) + # o "Parenthetical", -> new ValueNode($1) + # o "Range", -> new ValueNode($1) + # o "Value Accessor", -> $1.push($2) + # o "Invocation Accessor", -> new ValueNode($1, [$2]) + ] + + # # Accessing into an object or array, through dot or index notation. + # Accessor: [ + # o "PROPERTY_ACCESS IDENTIFIER", -> new AccessorNode($2) + # o "PROTOTYPE_ACCESS IDENTIFIER", -> new AccessorNode($2, 'prototype') + # o "SOAK_ACCESS IDENTIFIER", -> new AccessorNode($2, 'soak') + # o "Index" + # o "Slice", -> new SliceNode($1) + # ] + # + # # Indexing into an object or array. + # Index: [ + # o "INDEX_START Expression INDEX_END", -> new IndexNode($2) + # ] + # + # # An object literal. + # Object: [ + # o "{ AssignList }", -> new ObjectNode($2) + # ] + # + # # Assignment within an object literal (comma or newline separated). + # AssignList: [ + # o "", -> [] + # o "AssignObj", -> [$1] + # o "AssignList , AssignObj", -> $1.push $3 + # o "AssignList TERMINATOR AssignObj", -> $1.push $3 + # o "AssignList , TERMINATOR AssignObj", -> $1.push $4 + # o "INDENT AssignList OUTDENT", -> $2 + # ] + # + # # All flavors of function call (instantiation, super, and regular). + # Call: [ + # o "Invocation", -> $1 + # o "NEW Invocation", -> $2.new_instance() + # o "Super", -> $1 + # ] + # + # # Extending an object's prototype. + # Extends: [ + # o "Value EXTENDS Value", -> new ExtendsNode($1, $3) + # ] + # + # # A generic function invocation. + # Invocation: [ + # o "Value Arguments", -> new CallNode($1, $2) + # o "Invocation Arguments", -> new CallNode($1, $2) + # ] + # + # # The list of arguments to a function invocation. + # Arguments: [ + # o "CALL_START ArgList CALL_END", -> $2 + # ] + # + # # Calling super. + # Super: [ + # o "SUPER CALL_START ArgList CALL_END", -> new CallNode('super', $3) + # ] + # + # # The range literal. + # Range: [ + # o "[ Expression . . Expression ]", -> new RangeNode($2, $5) + # o "[ Expression . . . Expression ]", -> new RangeNode($2, $6, true) + # ] + # + # # The slice literal. + # Slice: [ + # o "INDEX_START Expression . . Expression INDEX_END", -> new RangeNode($2, $5) + # o "INDEX_START Expression . . . Expression INDEX_END", -> new RangeNode($2, $6, true) + # ] + # + # # The array literal. + # Array: [ + # o "[ ArgList ]", -> new ArrayNode($2) + # ] + # + # # A list of arguments to a method call, or as the contents of an array. + # ArgList: [ + # o "", -> [] + # o "Expression", -> val + # o "INDENT Expression", -> [$2] + # o "ArgList , Expression", -> $1.push $3 + # o "ArgList TERMINATOR Expression", -> $1.push $3 + # o "ArgList , TERMINATOR Expression", -> $1.push $4 + # o "ArgList , INDENT Expression", -> $1.push $4 + # o "ArgList OUTDENT", -> $1 + # ] + # + # # Just simple, comma-separated, required arguments (no fancy syntax). + # SimpleArgs: [ + # o "Expression", -> $1 + # o "SimpleArgs , Expression", -> + # ([$1].push($3)).reduce (a, b) -> a.concat(b) + # ] + # + # # Try/catch/finally exception handling blocks. + # Try: [ + # o "TRY Block Catch", -> new TryNode($2, $3[0], $3[1]) + # o "TRY Block FINALLY Block", -> new TryNode($2, nil, nil, $4) + # o "TRY Block Catch FINALLY Block", -> new TryNode($2, $3[0], $3[1], $5) + # ] + # + # # A catch clause. + # Catch: [ + # o "CATCH IDENTIFIER Block", -> [$2, $3] + # ] + # + # # Throw an exception. + # Throw: [ + # o "THROW Expression", -> new ThrowNode($2) + # ] + # + # # Parenthetical expressions. + # Parenthetical: [ + # o "( Expression )", -> new ParentheticalNode($2) + # ] + # + # # The while loop. (there is no do..while). + # While: [ + # o "WHILE Expression Block", -> new WhileNode($2, $3) + # o "WHILE Expression", -> new WhileNode($2, nil) + # o "Expression WHILE Expression", -> new WhileNode($3, Expressions.wrap($1)) + # ] + # + # # Array comprehensions, including guard and current index. + # # Looks a little confusing, check nodes.rb for the arguments to ForNode. + # For: [ + # o "Expression FOR ForVariables ForSource", -> new ForNode($1, $4, $3[0], $3[1]) + # o "FOR ForVariables ForSource Block", -> new ForNode($4, $3, $2[0], $2[1]) + # ] + # + # # An array comprehension has variables for the current element and index. + # ForVariables: [ + # o "IDENTIFIER", -> [$1] + # o "IDENTIFIER , IDENTIFIER", -> [$1, $3] + # ] + # + # # The source of the array comprehension can optionally be filtered. + # ForSource: [ + # o "IN Expression", -> {source: $2} + # o "OF Expression", -> {source: $2, object: true} + # o "ForSource WHEN Expression", -> $1.filter: $3; $1 + # o "ForSource BY Expression", -> $1.step: $3; $1 + # ] + # + # # Switch/When blocks. + # Switch: [ + # o "SWITCH Expression INDENT Whens OUTDENT", -> $4.rewrite_condition($2) + # o "SWITCH Expression INDENT Whens ELSE Block OUTDENT", -> $4.rewrite_condition($2).add_else($6) + # ] + # + # # The inner list of whens. + # Whens: [ + # o "When", -> $1 + # o "Whens When", -> $1.push $2 + # ] + # + # # An individual when. + # When: [ + # o "LEADING_WHEN SimpleArgs Block", -> new IfNode($2, $3, nil, {statement: true}) + # o "LEADING_WHEN SimpleArgs Block TERMINATOR", -> new IfNode($2, $3, nil, {statement: true}) + # o "Comment TERMINATOR When", -> $3.add_comment($1) + # ] + # + # # The most basic form of "if". + # IfBlock: [ + # o "IF Expression Block", -> new IfNode($2, $3) + # ] + # + # # An elsif portion of an if-else block. + # ElsIf: [ + # o "ELSE IfBlock", -> $2.force_statement() + # ] + # + # # Multiple elsifs can be chained together. + # ElsIfs: [ + # o "ElsIf", -> $1 + # o "ElsIfs ElsIf", -> $1.add_else($2) + # ] + # + # # Terminating else bodies are strictly optional. + # ElseBody: [ + # o "", -> null + # o "ELSE Block", -> $2 + # ] + # + # # All the alternatives for ending an if-else block. + # IfEnd: [ + # o "ElseBody", -> $1 + # o "ElsIfs ElseBody", -> $1.add_else($2) + # ] + # + # # The full complement of if blocks, including postfix one-liner ifs and unlesses. + # If: [ + # o "IfBlock IfEnd", -> $1.add_else($2) + # o "Expression IF Expression", -> new IfNode($3, Expressions.wrap($1), nil, {statement: true}) + # o "Expression UNLESS Expression", -> new IfNode($3, Expressions.wrap($1), nil, {statement: true, invert: true}) + # ] } @@ -506,14 +501,14 @@ for name, non_terminal of grammar option[1] = "return " + option[1] option tokens: tokens.join(" ") -parser: new Parser({tokens: tokens, bnf: bnf, operators: operators}, {debug: false}) +parser: new Parser({tokens: tokens, bnf: bnf, operators: operators, startSymbol: 'Root'}, {debug: false}) # Thin wrapper around the real lexer parser.lexer: { lex: -> token: this.tokens[this.pos] or [""] this.pos += 1 - # this.yylineno: token and token[1] and token[1][1] + this.yylineno: token[2] this.yytext: token[1] token[0] setInput: (tokens) -> diff --git a/src/rewriter.coffee b/src/rewriter.coffee index 79a74db8ac..cb764731ad 100644 --- a/src/rewriter.coffee +++ b/src/rewriter.coffee @@ -18,7 +18,7 @@ EXPRESSION_CLOSE: ['CATCH', 'WHEN', 'ELSE', 'FINALLY'].concat(EXPRESSION_TAIL) # Tokens pairs that, in immediate succession, indicate an implicit call. IMPLICIT_FUNC: ['IDENTIFIER', 'SUPER', ')', 'CALL_END', ']', 'INDEX_END'] -IMPLICIT_END: ['IF', 'UNLESS', 'FOR', 'WHILE', "\n", 'OUTDENT'] +IMPLICIT_END: ['IF', 'UNLESS', 'FOR', 'WHILE', 'TERMINATOR', 'OUTDENT'] IMPLICIT_CALL: ['IDENTIFIER', 'NUMBER', 'STRING', 'JS', 'REGEX', 'NEW', 'PARAM_START', 'TRY', 'DELETE', 'TYPEOF', 'SWITCH', 'ARGUMENTS', 'TRUE', 'FALSE', 'YES', 'NO', 'ON', 'OFF', '!', '!!', 'NOT', @@ -33,7 +33,7 @@ for pair in BALANCED_PAIRS # Single-line flavors of block expressions that have unclosed endings. # The grammar can't disambiguate them, so we insert the implicit indentation. SINGLE_LINERS: ['ELSE', "->", "=>", 'TRY', 'FINALLY', 'THEN'] -SINGLE_CLOSERS: ["\n", 'CATCH', 'FINALLY', 'ELSE', 'OUTDENT', 'LEADING_WHEN', 'PARAM_START'] +SINGLE_CLOSERS: ['TERMINATOR', 'CATCH', 'FINALLY', 'ELSE', 'OUTDENT', 'LEADING_WHEN', 'PARAM_START'] # Rewrite the token stream in multiple passes, one logical filter at # a time. This could certainly be changed into a single pass through the @@ -55,11 +55,11 @@ re::rewrite: (tokens) -> # Allow the return value of the block to tell us how many tokens to move # forwards (or backwards) in the stream, to make sure we don't miss anything # as the stream changes length under our feet. -re::scan_tokens: (yield) -> +re::scan_tokens: (block) -> i: 0 while true break unless this.tokens[i] - move: yield(this.tokens[i - 1], this.tokens[i], this.tokens[i + 1], i) + move: block(this.tokens[i - 1], this.tokens[i], this.tokens[i + 1], i) i += move true @@ -77,12 +77,12 @@ re::adjust_comments: -> this.tokens.splice(i + 2, 1) this.tokens.splice(i - 2, 1) return 0 - else if prev[0] is "\n" and after[0] is 'INDENT' + else if prev[0] is 'TERMINATOR' and after[0] is 'INDENT' this.tokens.splice(i + 2, 1) this.tokens[i - 1]: after return 1 - else if prev[0] isnt "\n" and prev[0] isnt 'INDENT' and prev[0] isnt 'OUTDENT' - this.tokens.splice(i, 0, ["\n", "\n"]) + else if prev[0] isnt 'TERMINATOR' and prev[0] isnt 'INDENT' and prev[0] isnt 'OUTDENT' + this.tokens.splice(i, 0, ['TERMINATOR', "\n", prev[2]]) return 2 else return 1 @@ -90,13 +90,13 @@ re::adjust_comments: -> # Leading newlines would introduce an ambiguity in the grammar, so we # dispatch them here. re::remove_leading_newlines: -> - this.tokens.shift() if this.tokens[0][0] is "\n" + this.tokens.shift() if this.tokens[0][0] is 'TERMINATOR' # Some blocks occur in the middle of expressions -- when we're expecting # this, remove their trailing newlines. re::remove_mid_expression_newlines: -> this.scan_tokens (prev, token, post, i) => - return 1 unless post and EXPRESSION_CLOSE.indexOf(post[0]) >= 0 and token[0] is "\n" + return 1 unless post and EXPRESSION_CLOSE.indexOf(post[0]) >= 0 and token[0] is 'TERMINATOR' this.tokens.splice(i, 1) return 0 From a347183f3d87bc528a91b605e52834935fd5bc7d Mon Sep 17 00:00:00 2001 From: Jeremy Ashkenas Date: Sun, 7 Feb 2010 15:37:05 -0500 Subject: [PATCH 36/37] waypoint -- parser.coffee can parse basic functions --- lib/coffee_script/nodes.js | 213 +++++++++++++++++++++++++++++++----- lib/coffee_script/parser.js | 206 ++++++++++++---------------------- src/nodes.coffee | 57 +++++----- src/parser.coffee | 213 +++++++++++++----------------------- 4 files changed, 363 insertions(+), 326 deletions(-) diff --git a/lib/coffee_script/nodes.js b/lib/coffee_script/nodes.js index 54e6956c78..aef4cad134 100644 --- a/lib/coffee_script/nodes.js +++ b/lib/coffee_script/nodes.js @@ -2,36 +2,193 @@ exports.Node = function Node() { var __a; var arguments = Array.prototype.slice.call(arguments, 0); - __a = this.values = arguments; + this.values = arguments; + __a = this.name = this.constructor.name; return Node === this.constructor ? this : __a; }; - exports.Node.wrap = function wrap(values) { + exports.Expressions = function Expressions() { + var __a; + var arguments = Array.prototype.slice.call(arguments, 0); + this.name = this.constructor.name; + __a = this.values = arguments; + return Expressions === this.constructor ? this : __a; + }; + exports.LiteralNode = function LiteralNode() { + var __a; + var arguments = Array.prototype.slice.call(arguments, 0); + this.name = this.constructor.name; + __a = this.values = arguments; + return LiteralNode === this.constructor ? this : __a; + }; + exports.ReturnNode = function ReturnNode() { + var __a; + var arguments = Array.prototype.slice.call(arguments, 0); + this.name = this.constructor.name; + __a = this.values = arguments; + return ReturnNode === this.constructor ? this : __a; + }; + exports.CommentNode = function CommentNode() { + var __a; + var arguments = Array.prototype.slice.call(arguments, 0); + this.name = this.constructor.name; + __a = this.values = arguments; + return CommentNode === this.constructor ? this : __a; + }; + exports.CallNode = function CallNode() { + var __a; + var arguments = Array.prototype.slice.call(arguments, 0); + this.name = this.constructor.name; + __a = this.values = arguments; + return CallNode === this.constructor ? this : __a; + }; + exports.ExtendsNode = function ExtendsNode() { + var __a; + var arguments = Array.prototype.slice.call(arguments, 0); + this.name = this.constructor.name; + __a = this.values = arguments; + return ExtendsNode === this.constructor ? this : __a; + }; + exports.ValueNode = function ValueNode() { + var __a; + var arguments = Array.prototype.slice.call(arguments, 0); + this.name = this.constructor.name; + __a = this.values = arguments; + return ValueNode === this.constructor ? this : __a; + }; + exports.AccessorNode = function AccessorNode() { + var __a; + var arguments = Array.prototype.slice.call(arguments, 0); + this.name = this.constructor.name; + __a = this.values = arguments; + return AccessorNode === this.constructor ? this : __a; + }; + exports.IndexNode = function IndexNode() { + var __a; + var arguments = Array.prototype.slice.call(arguments, 0); + this.name = this.constructor.name; + __a = this.values = arguments; + return IndexNode === this.constructor ? this : __a; + }; + exports.RangeNode = function RangeNode() { + var __a; + var arguments = Array.prototype.slice.call(arguments, 0); + this.name = this.constructor.name; + __a = this.values = arguments; + return RangeNode === this.constructor ? this : __a; + }; + exports.SliceNode = function SliceNode() { + var __a; + var arguments = Array.prototype.slice.call(arguments, 0); + this.name = this.constructor.name; + __a = this.values = arguments; + return SliceNode === this.constructor ? this : __a; + }; + exports.AssignNode = function AssignNode() { + var __a; + var arguments = Array.prototype.slice.call(arguments, 0); + this.name = this.constructor.name; + __a = this.values = arguments; + return AssignNode === this.constructor ? this : __a; + }; + exports.OpNode = function OpNode() { + var __a; + var arguments = Array.prototype.slice.call(arguments, 0); + this.name = this.constructor.name; + __a = this.values = arguments; + return OpNode === this.constructor ? this : __a; + }; + exports.CodeNode = function CodeNode() { + var __a; + var arguments = Array.prototype.slice.call(arguments, 0); + this.name = this.constructor.name; + __a = this.values = arguments; + return CodeNode === this.constructor ? this : __a; + }; + exports.SplatNode = function SplatNode() { + var __a; + var arguments = Array.prototype.slice.call(arguments, 0); + this.name = this.constructor.name; + __a = this.values = arguments; + return SplatNode === this.constructor ? this : __a; + }; + exports.ObjectNode = function ObjectNode() { + var __a; + var arguments = Array.prototype.slice.call(arguments, 0); + this.name = this.constructor.name; + __a = this.values = arguments; + return ObjectNode === this.constructor ? this : __a; + }; + exports.ArrayNode = function ArrayNode() { + var __a; + var arguments = Array.prototype.slice.call(arguments, 0); + this.name = this.constructor.name; + __a = this.values = arguments; + return ArrayNode === this.constructor ? this : __a; + }; + exports.PushNode = function PushNode() { + var __a; + var arguments = Array.prototype.slice.call(arguments, 0); + this.name = this.constructor.name; + __a = this.values = arguments; + return PushNode === this.constructor ? this : __a; + }; + exports.ClosureNode = function ClosureNode() { + var __a; + var arguments = Array.prototype.slice.call(arguments, 0); + this.name = this.constructor.name; + __a = this.values = arguments; + return ClosureNode === this.constructor ? this : __a; + }; + exports.WhileNode = function WhileNode() { + var __a; + var arguments = Array.prototype.slice.call(arguments, 0); + this.name = this.constructor.name; + __a = this.values = arguments; + return WhileNode === this.constructor ? this : __a; + }; + exports.ForNode = function ForNode() { + var __a; + var arguments = Array.prototype.slice.call(arguments, 0); + this.name = this.constructor.name; + __a = this.values = arguments; + return ForNode === this.constructor ? this : __a; + }; + exports.TryNode = function TryNode() { + var __a; + var arguments = Array.prototype.slice.call(arguments, 0); + this.name = this.constructor.name; + __a = this.values = arguments; + return TryNode === this.constructor ? this : __a; + }; + exports.ThrowNode = function ThrowNode() { + var __a; + var arguments = Array.prototype.slice.call(arguments, 0); + this.name = this.constructor.name; + __a = this.values = arguments; + return ThrowNode === this.constructor ? this : __a; + }; + exports.ExistenceNode = function ExistenceNode() { + var __a; + var arguments = Array.prototype.slice.call(arguments, 0); + this.name = this.constructor.name; + __a = this.values = arguments; + return ExistenceNode === this.constructor ? this : __a; + }; + exports.ParentheticalNode = function ParentheticalNode() { + var __a; + var arguments = Array.prototype.slice.call(arguments, 0); + this.name = this.constructor.name; + __a = this.values = arguments; + return ParentheticalNode === this.constructor ? this : __a; + }; + exports.IfNode = function IfNode() { + var __a; + var arguments = Array.prototype.slice.call(arguments, 0); + this.name = this.constructor.name; + __a = this.values = arguments; + return IfNode === this.constructor ? this : __a; + }; + exports.Expressions.wrap = function wrap(values) { return this.values = values; }; - exports.Expressions = exports.Node; - exports.LiteralNode = exports.Node; - exports.ReturnNode = exports.Node; - exports.CommentNode = exports.Node; - exports.CallNode = exports.Node; - exports.ExtendsNode = exports.Node; - exports.ValueNode = exports.Node; - exports.AccessorNode = exports.Node; - exports.IndexNode = exports.Node; - exports.RangeNode = exports.Node; - exports.SliceNode = exports.Node; - exports.AssignNode = exports.Node; - exports.OpNode = exports.Node; - exports.CodeNode = exports.Node; - exports.SplatNode = exports.Node; - exports.ObjectNode = exports.Node; - exports.ArrayNode = exports.Node; - exports.PushNode = exports.Node; - exports.ClosureNode = exports.Node; - exports.WhileNode = exports.Node; - exports.ForNode = exports.Node; - exports.TryNode = exports.Node; - exports.ThrowNode = exports.Node; - exports.ExistenceNode = exports.Node; - exports.ParentheticalNode = exports.Node; - exports.IfNode = exports.Node; })(); \ No newline at end of file diff --git a/lib/coffee_script/parser.js b/lib/coffee_script/parser.js index 7d431217e1..2a9fe562ec 100644 --- a/lib/coffee_script/parser.js +++ b/lib/coffee_script/parser.js @@ -36,44 +36,30 @@ ], // All types of expressions in our language. The basic unit of CoffeeScript // is the expression. - Expression: [o("Value"), - // o "Call" - // o "Code" - // o "Operation" - // o "Assign" - // o "If" - // o "Try" - // o "Throw" - // o "Return" - // o "While" - // o "For" - // o "Switch" - // o "Extends" - // o "Splat" - // o "Existence" - // o "Comment" + Expression: [o("Value"), o("Call"), o("Code"), o("Operation"), o("Assign"), o("If"), o("Try"), o("Throw"), o("Return"), o("While"), o("For"), o("Switch"), o("Extends"), o("Splat"), o("Existence"), o("Comment")], + // A block of expressions. Note that the Rewriter will convert some postfix + // forms into blocks for us, by altering the token stream. + Block: [o("INDENT Expressions OUTDENT", function() { + return $2; + }), o("INDENT OUTDENT", function() { + return new Expressions(); + }) ], - // # A block of expressions. Note that the Rewriter will convert some postfix - // # forms into blocks for us, by altering the token stream. - // Block: [ - // o "INDENT Expressions OUTDENT", -> $2 - // o "INDENT OUTDENT", -> new Expressions() - // ] // All hard-coded values. These can be printed straight to JavaScript. Literal: [o("NUMBER", function() { return new LiteralNode(yytext); }), o("STRING", function() { - return new LiteralNode($1); + return new LiteralNode(yytext); }), o("JS", function() { - return new LiteralNode($1); + return new LiteralNode(yytext); }), o("REGEX", function() { - return new LiteralNode($1); + return new LiteralNode(yytext); }), o("BREAK", function() { - return new LiteralNode($1); + return new LiteralNode(yytext); }), o("CONTINUE", function() { - return new LiteralNode($1); + return new LiteralNode(yytext); }), o("ARGUMENTS", function() { - return new LiteralNode($1); + return new LiteralNode(yytext); }), o("TRUE", function() { return new LiteralNode(true); }), o("FALSE", function() { @@ -88,28 +74,30 @@ return new LiteralNode(false); }) ], - // # Assignment to a variable (or index). - // Assign: [ - // o "Value ASSIGN Expression", -> new AssignNode($1, $3) - // ] - // - // # Assignment within an object literal (can be quoted). - // AssignObj: [ - // o "IDENTIFIER ASSIGN Expression", -> new AssignNode(new ValueNode($1), $3, 'object') - // o "STRING ASSIGN Expression", -> new AssignNode(new ValueNode(new LiteralNode($1)), $3, 'object') - // o "Comment" - // ] - // - // # A return statement. - // Return: [ - // o "RETURN Expression", -> new ReturnNode($2) - // o "RETURN", -> new ReturnNode(new ValueNode(new LiteralNode('null'))) - // ] - // - // # A comment. - // Comment: [ - // o "COMMENT", -> new CommentNode($1) - // ] + // Assignment to a variable (or index). + Assign: [o("Value ASSIGN Expression", function() { + return new AssignNode($1, $3); + }) + ], + // Assignment within an object literal (can be quoted). + AssignObj: [o("IDENTIFIER ASSIGN Expression", function() { + return new AssignNode(new ValueNode(yytext), $3, 'object'); + }), o("STRING ASSIGN Expression", function() { + return new AssignNode(new ValueNode(new LiteralNode(yytext)), $3, 'object'); + }), o("Comment") + ], + // A return statement. + Return: [o("RETURN Expression", function() { + return new ReturnNode($2); + }), o("RETURN", function() { + return new ReturnNode(new ValueNode(new LiteralNode('null'))); + }) + ], + // A comment. + Comment: [o("COMMENT", function() { + return new CommentNode(yytext); + }) + ], // // # Arithmetic and logical operators // # For Ruby's Operator precedence, see: [ @@ -171,91 +159,39 @@ // o "Expression INSTANCEOF Expression", -> new OpNode($2, $1, $3) // o "Expression IN Expression", -> new OpNode($2, $1, $3) // ] - // - // # Try abbreviated expressions to make the grammar build faster: - // - // # UnaryOp: [ - // # o "!" - // # o "!!" - // # o "NOT" - // # o "~" - // # o "--" - // # o "++" - // # o "DELETE" - // # o "TYPEOF" - // # ] - // # - // # BinaryOp: [ - // # o "*" - // # o "/" - // # o "%" - // # o "+" - // # o "-" - // # o "<<" - // # o ">>" - // # o ">>>" - // # o "&" - // # o "|" - // # o "^" - // # o "<=" - // # o "<" - // # o ">" - // # o ">=" - // # o "==" - // # o "!=" - // # o "IS" - // # o "ISNT" - // # o "&&" - // # o "||" - // # o "AND" - // # o "OR" - // # o "?" - // # o "-=" - // # o "+=" - // # o "/=" - // # o "*=" - // # o "%=" - // # o "||=" - // # o "&&=" - // # o "?=" - // # o "INSTANCEOF" - // # o "IN" - // # ] - // # - // # Operation: [ - // # o "Expression BinaryOp Expression", -> new OpNode($2, $1, $3) - // # o "UnaryOp Expression", -> new OpNode($1, $2) - // # ] - // - // # The existence operator. - // Existence: [ - // o "Expression ?", -> new ExistenceNode($1) - // ] - // - // # Function definition. - // Code: [ - // o "PARAM_START ParamList PARAM_END FuncGlyph Block", -> new CodeNode($2, $5, $4) - // o "FuncGlyph Block", -> new CodeNode([], $2, $1) - // ] - // - // # The symbols to signify functions, and bound functions. - // FuncGlyph: [ - // o "->", -> 'func' - // o "=>", -> 'boundfunc' - // ] - // - // # The parameters to a function definition. - // ParamList: [ - // o "Param", -> [$1] - // o "ParamList , Param", -> $1.push($3) - // ] - // - // # A Parameter (or ParamSplat) in a function definition. - // Param: [ - // o "PARAM" - // o "PARAM . . .", -> new SplatNode($1) - // ] - // + // The existence operator. + Existence: [o("Expression ?", function() { + return new ExistenceNode($1); + }) + ], + // Function definition. + Code: [o("PARAM_START ParamList PARAM_END FuncGlyph Block", function() { + return new CodeNode($2, $5, $4); + }), o("FuncGlyph Block", function() { + return new CodeNode([], $2, $1); + }) + ], + // The symbols to signify functions, and bound functions. + FuncGlyph: [o("->", function() { + return 'func'; + }), o("=>", function() { + return 'boundfunc'; + }) + ], + // The parameters to a function definition. + ParamList: [o("Param", function() { + return [$1]; + }), o("ParamList , Param", function() { + return $1.push($3); + }) + ], + // A Parameter (or ParamSplat) in a function definition. + Param: [o("PARAM", function() { + return yytext; + }), o("PARAM . . .", function() { + return new SplatNode(yytext); + }) + ], // # A regular splat. // Splat: [ // o "Expression . . .", -> new SplatNode($1) diff --git a/src/nodes.coffee b/src/nodes.coffee index c4cc7c1998..82bf2456a2 100644 --- a/src/nodes.coffee +++ b/src/nodes.coffee @@ -1,31 +1,30 @@ -exports.Node: -> @values: arguments -exports.Node.wrap: (values) -> @values: values - -exports.Expressions : exports.Node -exports.LiteralNode : exports.Node -exports.ReturnNode : exports.Node -exports.CommentNode : exports.Node -exports.CallNode : exports.Node -exports.ExtendsNode : exports.Node -exports.ValueNode : exports.Node -exports.AccessorNode : exports.Node -exports.IndexNode : exports.Node -exports.RangeNode : exports.Node -exports.SliceNode : exports.Node -exports.AssignNode : exports.Node -exports.OpNode : exports.Node -exports.CodeNode : exports.Node -exports.SplatNode : exports.Node -exports.ObjectNode : exports.Node -exports.ArrayNode : exports.Node -exports.PushNode : exports.Node -exports.ClosureNode : exports.Node -exports.WhileNode : exports.Node -exports.ForNode : exports.Node -exports.TryNode : exports.Node -exports.ThrowNode : exports.Node -exports.ExistenceNode : exports.Node -exports.ParentheticalNode : exports.Node -exports.IfNode : exports.Node +exports.Node: -> @values: arguments; @name: this.constructor.name +exports.Expressions : -> @name: this.constructor.name; @values: arguments +exports.LiteralNode : -> @name: this.constructor.name; @values: arguments +exports.ReturnNode : -> @name: this.constructor.name; @values: arguments +exports.CommentNode : -> @name: this.constructor.name; @values: arguments +exports.CallNode : -> @name: this.constructor.name; @values: arguments +exports.ExtendsNode : -> @name: this.constructor.name; @values: arguments +exports.ValueNode : -> @name: this.constructor.name; @values: arguments +exports.AccessorNode : -> @name: this.constructor.name; @values: arguments +exports.IndexNode : -> @name: this.constructor.name; @values: arguments +exports.RangeNode : -> @name: this.constructor.name; @values: arguments +exports.SliceNode : -> @name: this.constructor.name; @values: arguments +exports.AssignNode : -> @name: this.constructor.name; @values: arguments +exports.OpNode : -> @name: this.constructor.name; @values: arguments +exports.CodeNode : -> @name: this.constructor.name; @values: arguments +exports.SplatNode : -> @name: this.constructor.name; @values: arguments +exports.ObjectNode : -> @name: this.constructor.name; @values: arguments +exports.ArrayNode : -> @name: this.constructor.name; @values: arguments +exports.PushNode : -> @name: this.constructor.name; @values: arguments +exports.ClosureNode : -> @name: this.constructor.name; @values: arguments +exports.WhileNode : -> @name: this.constructor.name; @values: arguments +exports.ForNode : -> @name: this.constructor.name; @values: arguments +exports.TryNode : -> @name: this.constructor.name; @values: arguments +exports.ThrowNode : -> @name: this.constructor.name; @values: arguments +exports.ExistenceNode : -> @name: this.constructor.name; @values: arguments +exports.ParentheticalNode : -> @name: this.constructor.name; @values: arguments +exports.IfNode : -> @name: this.constructor.name; @values: arguments +exports.Expressions.wrap : (values) -> @values: values diff --git a/src/parser.coffee b/src/parser.coffee index 17477d3a0c..83568539c9 100644 --- a/src/parser.coffee +++ b/src/parser.coffee @@ -62,39 +62,39 @@ grammar: { # is the expression. Expression: [ o "Value" - # o "Call" - # o "Code" - # o "Operation" - # o "Assign" - # o "If" - # o "Try" - # o "Throw" - # o "Return" - # o "While" - # o "For" - # o "Switch" - # o "Extends" - # o "Splat" - # o "Existence" - # o "Comment" + o "Call" + o "Code" + o "Operation" + o "Assign" + o "If" + o "Try" + o "Throw" + o "Return" + o "While" + o "For" + o "Switch" + o "Extends" + o "Splat" + o "Existence" + o "Comment" ] - # # A block of expressions. Note that the Rewriter will convert some postfix - # # forms into blocks for us, by altering the token stream. - # Block: [ - # o "INDENT Expressions OUTDENT", -> $2 - # o "INDENT OUTDENT", -> new Expressions() - # ] + # A block of expressions. Note that the Rewriter will convert some postfix + # forms into blocks for us, by altering the token stream. + Block: [ + o "INDENT Expressions OUTDENT", -> $2 + o "INDENT OUTDENT", -> new Expressions() + ] # All hard-coded values. These can be printed straight to JavaScript. Literal: [ o "NUMBER", -> new LiteralNode(yytext) - o "STRING", -> new LiteralNode($1) - o "JS", -> new LiteralNode($1) - o "REGEX", -> new LiteralNode($1) - o "BREAK", -> new LiteralNode($1) - o "CONTINUE", -> new LiteralNode($1) - o "ARGUMENTS", -> new LiteralNode($1) + o "STRING", -> new LiteralNode(yytext) + o "JS", -> new LiteralNode(yytext) + o "REGEX", -> new LiteralNode(yytext) + o "BREAK", -> new LiteralNode(yytext) + o "CONTINUE", -> new LiteralNode(yytext) + o "ARGUMENTS", -> new LiteralNode(yytext) o "TRUE", -> new LiteralNode(true) o "FALSE", -> new LiteralNode(false) o "YES", -> new LiteralNode(true) @@ -103,28 +103,28 @@ grammar: { o "OFF", -> new LiteralNode(false) ] - # # Assignment to a variable (or index). - # Assign: [ - # o "Value ASSIGN Expression", -> new AssignNode($1, $3) - # ] - # - # # Assignment within an object literal (can be quoted). - # AssignObj: [ - # o "IDENTIFIER ASSIGN Expression", -> new AssignNode(new ValueNode($1), $3, 'object') - # o "STRING ASSIGN Expression", -> new AssignNode(new ValueNode(new LiteralNode($1)), $3, 'object') - # o "Comment" - # ] - # - # # A return statement. - # Return: [ - # o "RETURN Expression", -> new ReturnNode($2) - # o "RETURN", -> new ReturnNode(new ValueNode(new LiteralNode('null'))) - # ] - # - # # A comment. - # Comment: [ - # o "COMMENT", -> new CommentNode($1) - # ] + # Assignment to a variable (or index). + Assign: [ + o "Value ASSIGN Expression", -> new AssignNode($1, $3) + ] + + # Assignment within an object literal (can be quoted). + AssignObj: [ + o "IDENTIFIER ASSIGN Expression", -> new AssignNode(new ValueNode(yytext), $3, 'object') + o "STRING ASSIGN Expression", -> new AssignNode(new ValueNode(new LiteralNode(yytext)), $3, 'object') + o "Comment" + ] + + # A return statement. + Return: [ + o "RETURN Expression", -> new ReturnNode($2) + o "RETURN", -> new ReturnNode(new ValueNode(new LiteralNode('null'))) + ] + + # A comment. + Comment: [ + o "COMMENT", -> new CommentNode(yytext) + ] # # # Arithmetic and logical operators # # For Ruby's Operator precedence, see: [ @@ -186,91 +186,36 @@ grammar: { # o "Expression INSTANCEOF Expression", -> new OpNode($2, $1, $3) # o "Expression IN Expression", -> new OpNode($2, $1, $3) # ] - # - # # Try abbreviated expressions to make the grammar build faster: - # - # # UnaryOp: [ - # # o "!" - # # o "!!" - # # o "NOT" - # # o "~" - # # o "--" - # # o "++" - # # o "DELETE" - # # o "TYPEOF" - # # ] - # # - # # BinaryOp: [ - # # o "*" - # # o "/" - # # o "%" - # # o "+" - # # o "-" - # # o "<<" - # # o ">>" - # # o ">>>" - # # o "&" - # # o "|" - # # o "^" - # # o "<=" - # # o "<" - # # o ">" - # # o ">=" - # # o "==" - # # o "!=" - # # o "IS" - # # o "ISNT" - # # o "&&" - # # o "||" - # # o "AND" - # # o "OR" - # # o "?" - # # o "-=" - # # o "+=" - # # o "/=" - # # o "*=" - # # o "%=" - # # o "||=" - # # o "&&=" - # # o "?=" - # # o "INSTANCEOF" - # # o "IN" - # # ] - # # - # # Operation: [ - # # o "Expression BinaryOp Expression", -> new OpNode($2, $1, $3) - # # o "UnaryOp Expression", -> new OpNode($1, $2) - # # ] - # - # # The existence operator. - # Existence: [ - # o "Expression ?", -> new ExistenceNode($1) - # ] - # - # # Function definition. - # Code: [ - # o "PARAM_START ParamList PARAM_END FuncGlyph Block", -> new CodeNode($2, $5, $4) - # o "FuncGlyph Block", -> new CodeNode([], $2, $1) - # ] - # - # # The symbols to signify functions, and bound functions. - # FuncGlyph: [ - # o "->", -> 'func' - # o "=>", -> 'boundfunc' - # ] - # - # # The parameters to a function definition. - # ParamList: [ - # o "Param", -> [$1] - # o "ParamList , Param", -> $1.push($3) - # ] - # - # # A Parameter (or ParamSplat) in a function definition. - # Param: [ - # o "PARAM" - # o "PARAM . . .", -> new SplatNode($1) - # ] - # + + # The existence operator. + Existence: [ + o "Expression ?", -> new ExistenceNode($1) + ] + + # Function definition. + Code: [ + o "PARAM_START ParamList PARAM_END FuncGlyph Block", -> new CodeNode($2, $5, $4) + o "FuncGlyph Block", -> new CodeNode([], $2, $1) + ] + + # The symbols to signify functions, and bound functions. + FuncGlyph: [ + o "->", -> 'func' + o "=>", -> 'boundfunc' + ] + + # The parameters to a function definition. + ParamList: [ + o "Param", -> [$1] + o "ParamList , Param", -> $1.push($3) + ] + + # A Parameter (or ParamSplat) in a function definition. + Param: [ + o "PARAM", -> yytext + o "PARAM . . .", -> new SplatNode(yytext) + ] + # # A regular splat. # Splat: [ # o "Expression . . .", -> new SplatNode($1) From e2d75e6771c3765c2623019e8123a48756e5f1e2 Mon Sep 17 00:00:00 2001 From: Jeremy Ashkenas Date: Mon, 8 Feb 2010 10:58:49 -0500 Subject: [PATCH 37/37] CoffeeScript 0.3.2, just in time for the Github feature --- coffee-script.gemspec | 4 +-- documentation/coffee/aliases.coffee | 2 ++ documentation/coffee/fat_arrow.coffee | 6 ++-- documentation/coffee/super.coffee | 6 ++-- documentation/index.html.erb | 24 +++++++++++---- documentation/js/aliases.js | 1 + documentation/js/existence.js | 2 +- index.html | 43 ++++++++++++++++++--------- lib/coffee-script.rb | 2 +- package.json | 2 +- 10 files changed, 61 insertions(+), 31 deletions(-) diff --git a/coffee-script.gemspec b/coffee-script.gemspec index 164844b22c..f9b279cb59 100644 --- a/coffee-script.gemspec +++ b/coffee-script.gemspec @@ -1,7 +1,7 @@ Gem::Specification.new do |s| s.name = 'coffee-script' - s.version = '0.3.1' # Keep version in sync with coffee-script.rb - s.date = '2010-1-27' + s.version = '0.3.2' # Keep version in sync with coffee-script.rb + s.date = '2010-2-8' s.homepage = "http://jashkenas.github.com/coffee-script/" s.summary = "The CoffeeScript Compiler" diff --git a/documentation/coffee/aliases.coffee b/documentation/coffee/aliases.coffee index 720c2081ec..e4a4399c0d 100644 --- a/documentation/coffee/aliases.coffee +++ b/documentation/coffee/aliases.coffee @@ -5,3 +5,5 @@ volume: 10 if band isnt spinal_tap let_the_wild_rumpus_begin() unless answer is no if car.speed < speed_limit then accelerate() + +print "My name is " + @name diff --git a/documentation/coffee/fat_arrow.coffee b/documentation/coffee/fat_arrow.coffee index 4b7759d37f..28bbf12ab7 100644 --- a/documentation/coffee/fat_arrow.coffee +++ b/documentation/coffee/fat_arrow.coffee @@ -1,6 +1,6 @@ Account: (customer, cart) -> - this.customer: customer - this.cart: cart + @customer: customer + @cart: cart $('.shopping_cart').bind 'click', (event) => - this.customer.purchase this.cart \ No newline at end of file + @customer.purchase @cart \ No newline at end of file diff --git a/documentation/coffee/super.coffee b/documentation/coffee/super.coffee index b45faff0ff..fa4b41babe 100644 --- a/documentation/coffee/super.coffee +++ b/documentation/coffee/super.coffee @@ -1,14 +1,14 @@ Animal: -> Animal::move: (meters) -> - alert this.name + " moved " + meters + "m." + alert @name + " moved " + meters + "m." -Snake: (name) -> this.name: name +Snake: (name) -> @name: name Snake extends Animal Snake::move: -> alert "Slithering..." super 5 -Horse: (name) -> this.name: name +Horse: (name) -> @name: name Horse extends Animal Horse::move: -> alert "Galloping..." diff --git a/documentation/index.html.erb b/documentation/index.html.erb index 4adcd47e3e..7207898106 100644 --- a/documentation/index.html.erb +++ b/documentation/index.html.erb @@ -51,7 +51,7 @@

    Latest Version: - 0.3.1 + 0.3.2

    Table of Contents

    @@ -118,7 +118,7 @@ gem install coffee-script Installing the gem provides the coffee command, which can be used to compile CoffeeScript .coffee files into JavaScript, as well as debug them. In conjunction with - Node.js, the coffee + Node.js (or Narwhal), the coffee command also provides direct evaluation and an interactive REPL. When compiling to JavaScript, coffee writes the output as .js files in the same directory by default, but output @@ -130,14 +130,16 @@ gem install coffee-script -i, --interactive Launch an interactive CoffeeScript session. - Requires Node.js. + Requires Node.js, + or Narwhal, with --narwhal. -r, --run Compile and execute scripts without saving the intermediate - JavaScript. Requires Node.js. + JavaScript. Requires Node.js, + or Narwhal, with --narwhal. @@ -367,6 +369,9 @@ coffee --print app/scripts/*.coffee > concatenation.js

    For single-line statements, unless can be used as the inverse of if.

    +

    + As a shortcut for this.property, you can use @property. +

    <%= code_for('aliases') %>

    @@ -624,10 +629,10 @@ coffee --print app/scripts/*.coffee > concatenation.js

    • Source Code
      - After checking out the source, make sure to run rake build:parser - to generate an up-to-date version of the Racc parser. Use bin/coffee to test your changes, rake test to run the test suite, + rake build:parser to regenerate the Racc parser if you're + working on the grammar, and rake gem:install to create and install a custom version of the gem.
    • @@ -663,6 +668,13 @@ coffee --print app/scripts/*.coffee > concatenation.js

    Change Log

    + +

    + 0.3.2 + @property is now a shorthand for this.property.
    + Switched the default JavaScript engine from Narwhal to Node.js. Pass + the --narwhal flag if you'd like to continue using it. +

    0.3.0 diff --git a/documentation/js/aliases.js b/documentation/js/aliases.js index c033ee2ef8..944c5856cc 100644 --- a/documentation/js/aliases.js +++ b/documentation/js/aliases.js @@ -10,4 +10,5 @@ let_the_wild_rumpus_begin(); } car.speed < speed_limit ? accelerate() : null; + print("My name is " + this.name); })(); \ No newline at end of file diff --git a/documentation/js/existence.js b/documentation/js/existence.js index 9ac6438fea..cfc27fd222 100644 --- a/documentation/js/existence.js +++ b/documentation/js/existence.js @@ -1,6 +1,6 @@ (function(){ var solipsism, speed; - if ((typeof mind !== "undefined" && mind !== null) && !(typeof world !== "undefined" && world !== null)) { + if ((typeof mind !== "undefined" && mind !== null) && (typeof !world !== "undefined" && !world !== null)) { solipsism = true; } speed = (typeof speed !== "undefined" && speed !== null) ? speed : 140; diff --git a/index.html b/index.html index 1e936013ba..cea3591c8a 100644 --- a/index.html +++ b/index.html @@ -37,7 +37,7 @@

    CoffeeScript

    Latest Version: - 0.3.1 + 0.3.2

    Table of Contents

    @@ -215,7 +215,7 @@

    Installation and Usage

    Installing the gem provides the coffee command, which can be used to compile CoffeeScript .coffee files into JavaScript, as well as debug them. In conjunction with - Node.js, the coffee + Node.js (or Narwhal), the coffee command also provides direct evaluation and an interactive REPL. When compiling to JavaScript, coffee writes the output as .js files in the same directory by default, but output @@ -227,14 +227,16 @@

    Installation and Usage

    -i, --interactive Launch an interactive CoffeeScript session. - Requires Node.js. + Requires Node.js, + or Narwhal, with --narwhal. -r, --run Compile and execute scripts without saving the intermediate - JavaScript. Requires Node.js. + JavaScript. Requires Node.js, + or Narwhal, with --narwhal. @@ -557,6 +559,9 @@

    Language Reference

    For single-line statements, unless can be used as the inverse of if.

    +

    + As a shortcut for this.property, you can use @property. +

    launch() if ignition is on
     
     volume: 10 if band isnt spinal_tap
    @@ -564,6 +569,8 @@ 

    Language Reference

    let_the_wild_rumpus_begin() unless answer is no if car.speed < speed_limit then accelerate() + +print "My name is " + @name
    var volume;
     if (ignition === true) {
       launch();
    @@ -575,6 +582,7 @@ 

    Language Reference

    let_the_wild_rumpus_begin(); } car.speed < speed_limit ? accelerate() : null; +print("My name is " + this.name);

    @@ -1050,12 +1058,12 @@

    Language Reference

    var solipsism, speed;
    -if ((typeof mind !== "undefined" && mind !== null) && !(typeof world !== "undefined" && world !== null)) {
    +if ((typeof mind !== "undefined" && mind !== null) && (typeof !world !== "undefined" && !world !== null)) {
       solipsism = true;
     }
     speed = (typeof speed !== "undefined" && speed !== null) ? speed : 140;