From c50cf23b7b27d7d9732fa53bc4dcbd633ca7cdce Mon Sep 17 00:00:00 2001 From: Jeremy Ashkenas Date: Tue, 21 Sep 2010 23:58:05 -0400 Subject: [PATCH] CoffeeScript 0.9.4 --- Rakefile | 2 +- documentation/coffee/block_comment.coffee | 2 +- documentation/docs/browser.html | 44 ++- documentation/docs/cake.html | 2 +- documentation/docs/coffee-script.html | 36 +- documentation/docs/grammar.html | 2 + documentation/docs/helpers.html | 19 +- documentation/docs/lexer.html | 100 +++-- documentation/docs/nodes.html | 317 ++++++++-------- documentation/docs/optparse.html | 2 +- documentation/docs/repl.html | 2 +- documentation/docs/rewriter.html | 52 ++- documentation/docs/scope.html | 47 ++- documentation/index.html.erb | 18 +- documentation/js/array_comprehensions.js | 24 +- documentation/js/block_comment.js | 3 +- documentation/js/classes.js | 4 +- documentation/js/expressions_comprehension.js | 14 +- documentation/js/multiple_return_values.js | 10 +- documentation/js/object_comprehensions.js | 14 +- documentation/js/object_extraction.js | 14 +- documentation/js/overview.js | 12 +- documentation/js/parallel_assignment.js | 8 +- documentation/js/patterns_and_splats.js | 10 +- documentation/js/range_comprehensions.js | 18 +- documentation/js/soaks.js | 4 +- documentation/js/switch.js | 42 +-- documentation/js/while.js | 8 +- extras/coffee-script.js | 288 +++++++------- index.html | 353 +++++++++--------- lib/coffee-script.js | 2 +- lib/lexer.js | 18 +- lib/nodes.js | 6 +- package.json | 2 +- src/coffee-script.coffee | 2 +- src/nodes.coffee | 6 +- 36 files changed, 771 insertions(+), 736 deletions(-) diff --git a/Rakefile b/Rakefile index 63f43677..0db46cd5 100644 --- a/Rakefile +++ b/Rakefile @@ -6,7 +6,7 @@ require 'closure-compiler' HEADER = <<-EOS /** - * CoffeeScript Compiler v0.9.3 + * CoffeeScript Compiler v0.9.4 * http://coffeescript.org * * Copyright 2010, Jeremy Ashkenas diff --git a/documentation/coffee/block_comment.coffee b/documentation/coffee/block_comment.coffee index 264c4bd3..3cfd9e95 100644 --- a/documentation/coffee/block_comment.coffee +++ b/documentation/coffee/block_comment.coffee @@ -1,4 +1,4 @@ ### -CoffeeScript Compiler v0.9.3 +CoffeeScript Compiler v0.9.4 Released under the MIT License ### \ No newline at end of file diff --git a/documentation/docs/browser.html b/documentation/docs/browser.html index 76332996..54d4861f 100644 --- a/documentation/docs/browser.html +++ b/documentation/docs/browser.html @@ -1,26 +1,24 @@ - browser.coffee
puts''forallname,taskoftasksspaces = 20-name.length - spaces = ifspaces>0then(' 'foriin[0..spaces]).join('')else'' + spaces = ifspaces>0thenArray(spaces+1).join(' ')else''desc = iftask.descriptionthen"# #{task.description}"else''puts"cake #{name}#{spaces} #{desc}"putsoparse.help()ifswitches.length

browser.coffee

#

Activate CoffeeScript in the browser by having it compile and evaluate + browser.coffee

browser.coffee

#

Override exported methods for non-Node.js engines.

CoffeeScript = require './coffee-script'
#

Use standard JavaScript eval to eval code.

CoffeeScript.eval = (code, options) ->
+  eval CoffeeScript.compile code, options
#

Running code does not provide access to this scope.

CoffeeScript.run = (code, options) ->
+  (Function CoffeeScript.compile code, options)()
#

If we're not in a browser environment, we're finished with the public API.

return unless window?
#

Load a remote script from the current domain via XHR.

CoffeeScript.load = (url, options) ->
+  xhr = new (window.ActiveXObject or XMLHttpRequest)('Microsoft.XMLHTTP')
+  xhr.open 'GET', url, true
+  xhr.overrideMimeType 'text/plain' if 'overrideMimeType' of xhr
+  xhr.onreadystatechange = ->
+    CoffeeScript.run xhr.responseText, options if xhr.readyState is 4
+  xhr.send null
#

Activate CoffeeScript in the browser by having it compile and evaluate all script tags with a content-type of text/coffeescript. -This happens on page load.

if document?.getElementsByTagName
-  grind = (coffee) ->
-    setTimeout exports.compile coffee
-  grindRemote = (url) ->
-    xhr = new (window.ActiveXObject or XMLHttpRequest)('Microsoft.XMLHTTP')
-    xhr.open 'GET', url, true
-    xhr.overrideMimeType 'text/plain' if 'overrideMimeType' of xhr
-    xhr.onreadystatechange = ->
-      grind xhr.responseText if xhr.readyState is 4
-    xhr.send null
-  processScripts = ->
-    for script in document.getElementsByTagName 'script'
-      if script.type is 'text/coffeescript'
-        if script.src
-          grindRemote script.src
-        else
-          grind script.innerHTML
-    null
-  if window.addEventListener
-    addEventListener 'DOMContentLoaded', processScripts, false
-  else
-    attachEvent 'onload', processScripts
+This happens on page load.

processScripts = ->
+  for script in document.getElementsByTagName 'script'
+    if script.type is 'text/coffeescript'
+      if script.src
+        CoffeeScript.load script.src
+      else
+        setTimeout -> CoffeeScript.run script.innerHTML
+  null
+if window.addEventListener
+  addEventListener 'DOMContentLoaded', processScripts, false
+else
+  attachEvent 'onload', processScripts
 
 
\ No newline at end of file diff --git a/documentation/docs/cake.html b/documentation/docs/cake.html index 111a2e78..7189e515 100644 --- a/documentation/docs/cake.html +++ b/documentation/docs/cake.html @@ -33,7 +33,7 @@ If no tasks are passed, print the help screen.

#

Print an error and exit when attempting to all an undefined task.

missingTask = (task) ->
diff --git a/documentation/docs/coffee-script.html b/documentation/docs/coffee-script.html
index d6b45674..36b38493 100644
--- a/documentation/docs/coffee-script.html
+++ b/documentation/docs/coffee-script.html
@@ -4,19 +4,16 @@ contains the main entry functions for tokenzing, parsing, and compiling source
 CoffeeScript into JavaScript.

If included on a webpage, it will automatically sniff out, compile, and -execute all scripts present in text/coffeescript tags.

#

Set up dependencies correctly for both the server and the browser.

if process?
-  path    = require 'path'
-  Lexer   = require('./lexer').Lexer
-  parser  = require('./parser').parser
-  helpers = require('./helpers').helpers
-  helpers.extend global, require './nodes'
-  if require.registerExtension
-    require.registerExtension '.coffee', (content) -> compile content
-else
-  this.exports = this.CoffeeScript = {}
-  Lexer        = this.Lexer
-  parser       = this.parser
-  helpers      = this.helpers
#

The current CoffeeScript version number.

exports.VERSION = '0.9.3'
#

Compile a string of CoffeeScript code to JavaScript, using the Coffee/Jison +execute all scripts present in text/coffeescript tags.

path      = require 'path'
+{Lexer}   = require './lexer'
+{parser}  = require './parser'
#

TODO: Remove registerExtension when fully deprecated

if require.extensions
+  fs = require 'fs'
+  require.extensions['.coffee'] = (module, filename) ->
+    content = compile fs.readFileSync filename, 'utf8'
+    module.filename = "#{filename} (compiled)"
+    module._compile content, module.filename
+else if require.registerExtension
+  require.registerExtension '.coffee', (content) -> compile content
#

The current CoffeeScript version number.

exports.VERSION = '0.9.4'
#

Compile a string of CoffeeScript code to JavaScript, using the Coffee/Jison compiler.

exports.compile = compile = (code, options) ->
   options or= {}
   try
@@ -28,10 +25,13 @@ compiler.

.compile() on the root, or traverse it by using .traverse() with a callback.

exports.nodes = (code) ->
   parser.parse lexer.tokenize code
#

Compile and execute a string of CoffeeScript (on the server), correctly -setting __filename, __dirname, and relative require().

exports.run = (code, options) ->
-  module.filename = __filename = options.fileName
-  __dirname = path.dirname __filename
-  eval exports.compile code, options
#

Instantiate a Lexer for our use here.

lexer = new Lexer
#

The real Lexer produces a generic stream of tokens. This object provides a +setting __filename, __dirname, and relative require().

exports.run = (code, options) ->
#

We want the root module.

  root = module
+  while root.parent
+    root = root.parent
#

Set the filename

  root.filename = __filename = "#{options.fileName} (compiled)"
#

Clear the module cache

  root.moduleCache = {} if root.moduleCache
#

Compile

  root._compile exports.compile(code, options), root.filename
#

Compile and evaluate a string of CoffeeScript (in a Node.js-like environment). +The CoffeeScript REPL uses this to run the input.

exports.eval = (code, options) ->
+  __filename = options.fileName
+  __dirname  = path.dirname __filename
+  eval exports.compile(code, options)
#

Instantiate a Lexer for our use here.

lexer = new Lexer
#

The real Lexer produces a generic stream of tokens. This object provides a thin wrapper around it, compatible with the Jison API. We can then pass it directly as a "Jison lexer".

parser.lexer =
   lex: ->
@@ -45,4 +45,6 @@ directly as a "Jison lexer".

@pos = 0 upcomingInput: -> "" +parser.yy = require './nodes' +
\ No newline at end of file diff --git a/documentation/docs/grammar.html b/documentation/docs/grammar.html index 04b9f1c0..01540974 100644 --- a/documentation/docs/grammar.html +++ b/documentation/docs/grammar.html @@ -21,6 +21,7 @@ optionally. If no action is specified, we simply pass the value of the previous nonterminal.

o = (patternString, action, options) ->
   return [patternString, '$$ = $1;', options] unless action
   action = if match = (action + '').match(unwrap) then match[1] else "(#{action}())"
+  action = action.replace /\b(?:[A-Z][a-z]+Node|Expressions)\b/g, 'yy.$&'
   [patternString, "$$ = #{action};", options]
#

Grammatical Rules

#

In all of the rules that follow, you'll see the name of the nonterminal as the key to a list of alternative matches. With each match's action, the dollar-sign variables are provided by Jison as references to the value of @@ -182,6 +183,7 @@ and optional references to the superclass.

]
#

Assignments that can happen directly inside a class declaration.

  ClassAssign: [
     o "AssignObj",                              -> $1
     o "ThisProperty : Expression",              -> new AssignNode new ValueNode($1), $3, 'this'
+    o "ThisProperty : INDENT Expression OUTDENT", -> new AssignNode new ValueNode($1), $4, 'this'
   ]
#

A list of assignments to a class.

  ClassBody: [
     o "",                                       -> []
     o "ClassAssign",                            -> [$1]
diff --git a/documentation/docs/helpers.html b/documentation/docs/helpers.html
index 63ba5a5a..d3bc7add 100644
--- a/documentation/docs/helpers.html
+++ b/documentation/docs/helpers.html
@@ -1,35 +1,34 @@
       helpers.coffee           
tag = 'UNARY'ifidis'!'@tokentag,id@token']',']'ifclose_index - true@interpolateStringquote+doc+quote,heredoc:yes@line+=countmatch[1],"\n"@i+=match[1].length - trueelse@token'REGEX',regex@i+=regex.length - trueattempt = ifmatch[2]?thenmatch[2]elsematch[3]indent = attemptifnotindent?orattempt.length<indent.lengthindentor='' - doc = doc.replace(newRegExp("^"+indent,'gm'),'').replace(/^\n/,'') + doc = doc.replace(newRegExp("^"+indent,'gm'),'')returndocifoptions.herecomment + doc = doc.replace(/^\n/,'')doc.replace(MULTILINER,"\\n") - .replace(newRegExp(options.quote,'g'),"\\#{options.quote}") < iflevels.lengthreturnfalseifslashthrownewError"SyntaxError: Unterminated #{levels.pop()[0]} starting on line #{@line + 1}" - ifnotithenfalseelsestr.substring(0,i)"delete","instanceof","typeof","switch","super","extends","class","this","null","debugger" -]

helpers.coffee

#

This file contains the common helper functions that we'd like to share among the Lexer, Rewriter, and the Nodes. Merge objects, flatten -arrays, count characters, that sort of thing.

#

Set up exported variables for both Node.js and the browser.

this.exports = this unless process?
-helpers = exports.helpers = {}
#

Cross-browser indexOf, so that IE can join the party.

helpers.indexOf = indexOf = (array, item, from) ->
+arrays, count characters, that sort of thing.

helpers = exports.helpers = {}
#

Cross-browser indexOf, so that IE can join the party.

helpers.indexOf = indexOf = (array, item, from) ->
   return array.indexOf item, from if array.indexOf
   for other, index in array
     if other is item and (not from or (from <= index))
       return index
-  -1
#

Does a list include a value?

helpers.include = include = (list, value) ->
-  indexOf(list, value) >= 0
#

Peek at the beginning of a given string to see if it matches a sequence.

helpers.starts = starts = (string, literal, start) ->
-  string.substring(start, (start or 0) + literal.length) is literal
#

Peek at the end of a given string to see if it matches a sequence.

helpers.ends = ends = (string, literal, back) ->
+  -1
#

Does a list include a value?

helpers.include = include = (list, value) ->
+  indexOf(list, value) >= 0
#

Peek at the beginning of a given string to see if it matches a sequence.

helpers.starts = starts = (string, literal, start) ->
+  string.substring(start, (start or 0) + literal.length) is literal
#

Peek at the end of a given string to see if it matches a sequence.

helpers.ends = ends = (string, literal, back) ->
   start = string.length - literal.length - (back ? 0)
-  string.substring(start, start + literal.length) is literal
#

Trim out all falsy values from an array.

helpers.compact = compact = (array) -> item for item in array when item
#

Count the number of occurences of a character in a string.

helpers.count = count = (string, letter) ->
+  string.substring(start, start + literal.length) is literal
#

Trim out all falsy values from an array.

helpers.compact = compact = (array) -> item for item in array when item
#

Count the number of occurences of a character in a string.

helpers.count = count = (string, letter) ->
   num = 0
   pos = indexOf string, letter
   while pos isnt -1
     num += 1
     pos = indexOf string, letter, pos + 1
-  num
#

Merge objects, returning a fresh copy with attributes from both sides. + num

#

Merge objects, returning a fresh copy with attributes from both sides. Used every time BaseNode#compile is called, to allow properties in the options hash to propagate down the tree without polluting other branches.

helpers.merge = merge = (options, overrides) ->
   fresh = {}
   (fresh[key] = val) for all key, val of options
   (fresh[key] = val) for all key, val of overrides if overrides
-  fresh
#

Extend a source object with the properties of another object (shallow copy). + fresh

#

Extend a source object with the properties of another object (shallow copy). We use this to simulate Node's deprecated process.mixin

helpers.extend = extend = (object, properties) ->
-  (object[key] = val) for all key, val of properties
#

Return a completely flattened version of an array. Handy for getting a + (object[key] = val) for all key, val of properties

#

Return a completely flattened version of an array. Handy for getting a list of children from the nodes.

helpers.flatten = flatten = (array) ->
   memo = []
   for item in array
     if item instanceof Array then memo = memo.concat(item) else memo.push(item)
-  memo
#

Delete a key from an object, returning the value. Useful when a node is + memo

#

Delete a key from an object, returning the value. Useful when a node is looking for a particular method in an options hash.

helpers.del = del = (obj, key) ->
   val = obj[key]
   delete obj[key]
diff --git a/documentation/docs/lexer.html b/documentation/docs/lexer.html
index 0db93604..fc3d1f54 100644
--- a/documentation/docs/lexer.html
+++ b/documentation/docs/lexer.html
@@ -6,15 +6,9 @@ form:

[tag, value, lineNumber]
 
-

Which is a format that can be fed directly into Jison.

#

Set up the Lexer for both Node.js and the browser, depending on where we are.

if process?
-  {Rewriter} = require './rewriter'
-  {helpers}  = require './helpers'
-else
-  this.exports = this
-  Rewriter     = this.Rewriter
-  helpers      = this.helpers
#

Import the helpers we need.

{include, count, starts, compact} = helpers
#

The Lexer Class

#

The Lexer class reads a stream of CoffeeScript and divvys it up into tagged +

Which is a format that can be fed directly into Jison.

{Rewriter} = require './rewriter'
#

Import the helpers we need.

{include, count, starts, compact} = require('./helpers').helpers
#

The Lexer Class

#

The Lexer class reads a stream of CoffeeScript and divvys it up into tagged tokens. Some potential ambiguity in the grammar has been avoided by -pushing some extra smarts into the Lexer.

exports.Lexer = class Lexer
#

tokenize is the Lexer's main method. Scan by attempting to match tokens +pushing some extra smarts into the Lexer.

exports.Lexer = class Lexer
#

tokenize is the Lexer's main method. Scan by attempting to match tokens one at a time, using a regular expression anchored at the start of the remaining code, or a custom recursive token-matching method (for interpolations). When the next token has been recorded, we move forward @@ -41,7 +35,7 @@ unless explicitly asked not to.

@extractNextToken() @closeIndentation() return @tokens if o.rewrite is off - (new Rewriter).rewrite @tokens
#

At every position, run through this list of attempted matches, + (new Rewriter).rewrite @tokens

#

At every position, run through this list of attempted matches, short-circuiting if any of them succeed. Their order determines precedence: @literalToken is the fallback catch-all.

  extractNextToken: ->
     return if @identifierToken()
@@ -53,7 +47,7 @@ short-circuiting if any of them succeed. Their order determines precedence:
     return if @numberToken()
     return if @regexToken()
     return if @jsToken()
-    return    @literalToken()
#

Tokenizers

#

Matches identifying literals: variables, keywords, method names, etc. + return @literalToken()

#

Tokenizers

#

Matches identifying literals: variables, keywords, method names, etc. Check to ensure that JavaScript reserved words aren't being used as identifiers. Because CoffeeScript reserves a handful of keywords that are allowed in JavaScript, we're careful not to tag them as keywords when @@ -83,13 +77,13 @@ though is means === otherwise.

#

Matches numbers, including decimals, hex, and exponential notation. + true

#

Matches numbers, including decimals, hex, and exponential notation. Be careful not to interfere with ranges-in-progress.

  numberToken: ->
     return false unless number = @match NUMBER, 1
     return false if @tag() is '.' and starts number, '.'
     @i += number.length
     @token 'NUMBER', number
-    true
#

Matches strings, including multi-line strings. Ensures that quotation marks + true

#

Matches strings, including multi-line strings. Ensures that quotation marks are balanced within the string's contents, and within nested interpolations.

  stringToken: ->
     return false unless starts(@chunk, '"') or starts(@chunk, "'")
     return false unless string =
@@ -98,7 +92,7 @@ are balanced within the string's contents, and within nested interpolations.

@interpolateString string.replace /\n/g, '\\\n' @line += count string, "\n" @i += string.length - true
#

Matches heredocs, adjusting indentation to the correct level, as heredocs + true

#

Matches heredocs, adjusting indentation to the correct level, as heredocs preserve whitespace, but ignore indentation to the left.

  heredocToken: ->
     return false unless match = @chunk.match HEREDOC
     quote = match[1].substr 0, 1
@@ -106,19 +100,20 @@ preserve whitespace, but ignore indentation to the left.

#

Matches and consumes comments.

  commentToken: ->
+    true
#

Matches and consumes comments.

  commentToken: ->
     return false unless match = @chunk.match(COMMENT)
     @line += count match[1], "\n"
     @i += match[1].length
-    if match[4]
-      @token 'HERECOMMENT', @sanitizeHeredoc match[4], herecomment: true, indent: match[3]
+    if match[2]
+      @token 'HERECOMMENT', @sanitizeHeredoc match[2],
+        herecomment: true, indent: Array(@indent + 1).join(' ')
       @token 'TERMINATOR', '\n'
-    true
#

Matches JavaScript interpolated directly into the source via backticks.

  jsToken: ->
+    true
#

Matches JavaScript interpolated directly into the source via backticks.

  jsToken: ->
     return false unless starts @chunk, '`'
     return false unless script = @balancedToken ['`', '`']
     @token 'JS', script.replace JS_CLEANER, ''
     @i += script.length
-    true
#

Matches regular expression literals. Lexing regular expressions is difficult + true

#

Matches regular expression literals. Lexing regular expressions is difficult to distinguish from division, so we borrow some basic heuristics from JavaScript and Ruby, borrow slash balancing from @balancedToken, and borrow interpolation from @interpolateString.

  regexToken: ->
@@ -138,9 +133,9 @@ borrow interpolation from @interpolateString.

#

Matches a token in which which the passed delimiter pairs must be correctly + true

#

Matches a token in which which the passed delimiter pairs must be correctly balanced (ie. strings, JS literals).

  balancedToken: (delimited...) ->
-    @balancedString @chunk, delimited
#

Matches newlines, indents, and outdents, and determines which is which. + @balancedString @chunk, delimited

#

Matches newlines, indents, and outdents, and determines which is which. If we can detect that the current line is continued onto the the next line, then the newline is suppressed:

@@ -173,7 +168,7 @@ can close multiple indents, so we need to know how far in we happen to be.

@indebt = 0 @outdentToken @indent - size, noNewlines @indent = size - true
#

Record an outdent token or multiple tokens, if we happen to be moving back + true

#

Record an outdent token or multiple tokens, if we happen to be moving back inwards past several recorded indents.

  outdentToken: (moveOut, noNewlines, close) ->
     while moveOut > 0
       len = @indents.length - 1
@@ -193,18 +188,18 @@ inwards past several recorded indents.

@token 'OUTDENT', dent @outdebt -= moveOut if dent @token 'TERMINATOR', "\n" unless @tag() is 'TERMINATOR' or noNewlines - true
#

Matches and consumes non-meaningful whitespace. Tag the previous token + true

#

Matches and consumes non-meaningful whitespace. Tag the previous token as being "spaced", because there are some cases where it makes a difference.

  whitespaceToken: ->
     return false unless space = @match WHITESPACE, 1
     prev = @prev()
     prev.spaced = true if prev
     @i += space.length
-    true
#

Generate a newline token. Consecutive newlines get merged together.

  newlineToken: (newlines) ->
+    true
#

Generate a newline token. Consecutive newlines get merged together.

  newlineToken: (newlines) ->
     @token 'TERMINATOR', "\n" unless @tag() is 'TERMINATOR'
-    true
#

Use a \ at a line-ending to suppress the newline. + true

#

Use a \ at a line-ending to suppress the newline. The slash is removed here once its job is done.

  suppressNewlines: ->
     @tokens.pop() if @value() is "\\"
-    true
#

We treat all other single characters as a token. Eg.: ( ) , . ! + true

#

We treat all other single characters as a token. Eg.: ( ) , . ! Multi-character operators are also literal tokens, so that Jison can assign the proper order of operations. There are some symbols that we tag specially here. ; and newlines are both treated as a TERMINATOR, we distinguish @@ -238,7 +233,7 @@ parentheses that indicate a method call from regular parentheses, and so on.

@tag 1, 'INDEX_SOAK' if @tag() is '?' @tag 1, 'INDEX_PROTO' if @tag() is '::' @token tag, value - true
#

Token Manipulators

#

As we consume a new IDENTIFIER, look at the previous token to determine + true

#

Token Manipulators

#

As we consume a new IDENTIFIER, look at the previous token to determine if it's a special kind of accessor. Return true if any type of accessor is the previous token.

  tagAccessor: ->
     return false if (not prev = @prev()) or (prev and prev.spaced)
@@ -252,7 +247,7 @@ is the previous token.

@tag 1, 'PROPERTY_ACCESS' else prev[0] is '@' - if accessor then 'accessor' else false
#

Sanitize a heredoc or herecomment by escaping internal double quotes and + if accessor then 'accessor' else false

#

Sanitize a heredoc or herecomment by escaping internal double quotes and erasing all external indentation on the left-hand side.

  sanitizeHeredoc: (doc, options) ->
     indent = options.indent
     return doc if options.herecomment and not include doc, '\n'
@@ -261,10 +256,11 @@ erasing all external indentation on the left-hand side.

#

A source of ambiguity in our grammar used to be parameter lists in function + .replace(new RegExp(options.quote, 'g'), "\\#{options.quote}")

#

A source of ambiguity in our grammar used to be parameter lists in function definitions versus argument lists in function calls. Walk backwards, tagging parameters specially in order to make things easier for the parser.

  tagParameters: ->
     return if @tag() isnt ')'
@@ -277,12 +273,12 @@ parameters specially in order to make things easier for the parser.

when 'IDENTIFIER' then tok[0] = 'PARAM' when ')' then tok[0] = 'PARAM_END' when '(', 'CALL_START' then return tok[0] = 'PARAM_START' - true
#

Close up all remaining open blocks at the end of the file.

  closeIndentation: ->
-    @outdentToken @indent
#

The error for when you try to use a forbidden word in JavaScript as + true

#

Close up all remaining open blocks at the end of the file.

  closeIndentation: ->
+    @outdentToken @indent
#

The error for when you try to use a forbidden word in JavaScript as an identifier.

  identifierError: (word) ->
-    throw new Error "SyntaxError: Reserved word \"#{word}\" on line #{@line + 1}"
#

The error for when you try to assign to a reserved word in JavaScript, + throw new Error "SyntaxError: Reserved word \"#{word}\" on line #{@line + 1}"

#

The error for when you try to assign to a reserved word in JavaScript, like "function" or "default".

  assignmentError: ->
-    throw new Error "SyntaxError: Reserved word \"#{@value()}\" on line #{@line + 1} can't be assigned"
#

Matches a balanced group such as a single or double-quoted string. Pass in + throw new Error "SyntaxError: Reserved word \"#{@value()}\" on line #{@line + 1} can't be assigned"

#

Matches a balanced group such as a single or double-quoted string. Pass in a series of delimiters, all of which must be nested correctly within the contents of the string. This method allows us to have strings within interpolations within strings, ad infinitum.

  balancedString: (str, delimited, options) ->
@@ -310,7 +306,7 @@ interpolations within strings, ad infinitum.

#

Expand variables and expressions inside double-quoted strings using + if not i then false else str.substring(0, i)

#

Expand variables and expressions inside double-quoted strings using ECMA Harmony's interpolation syntax for substitution of bare variables as well as arbitrary expressions.

@@ -360,22 +356,22 @@ token stream.

@token tag, value @token '+', '+' if i < tokens.length - 1 @token ')', ')' if interpolated - tokens
#

Helpers

#

Add a token to the results, taking note of the line number.

  token: (tag, value) ->
-    @tokens.push [tag, value, @line]
#

Peek at a tag in the current token stream.

  tag: (index, newTag) ->
+      tokens
#

Helpers

#

Add a token to the results, taking note of the line number.

  token: (tag, value) ->
+    @tokens.push [tag, value, @line]
#

Peek at a tag in the current token stream.

  tag: (index, newTag) ->
     return unless tok = @prev index
     return tok[0] = newTag if newTag?
-    tok[0]
#

Peek at a value in the current token stream.

  value: (index, val) ->
+    tok[0]
#

Peek at a value in the current token stream.

  value: (index, val) ->
     return unless tok = @prev index
     return tok[1] = val if val?
-    tok[1]
#

Peek at a previous token, entire.

  prev: (index) ->
-    @tokens[@tokens.length - (index or 1)]
#

Attempt to match a string against the current chunk, returning the indexed + tok[1]

#

Peek at a previous token, entire.

  prev: (index) ->
+    @tokens[@tokens.length - (index or 1)]
#

Attempt to match a string against the current chunk, returning the indexed match if successful, and false otherwise.

  match: (regex, index) ->
     return false unless m = @chunk.match regex
-    if m then m[index] else false
#

Are we in the midst of an unfinished expression?

  unfinished: ->
+    if m then m[index] else false
#

Are we in the midst of an unfinished expression?

  unfinished: ->
     prev = @prev(2)
     @value() and @value().match and @value().match(NO_NEWLINE) and
       prev and (prev[0] isnt '.') and not @value().match(CODE) and
-      not @chunk.match ASSIGNED
#

Constants

#

Keywords that CoffeeScript shares in common with JavaScript.

JS_KEYWORDS = [
+      not @chunk.match ASSIGNED
#

Constants

#

Keywords that CoffeeScript shares in common with JavaScript.

JS_KEYWORDS = [
   "if", "else",
   "true", "false",
   "new", "return",
@@ -385,46 +381,46 @@ match if successful, and false otherwise.

#

CoffeeScript-only keywords, which we're more relaxed about allowing. They can't +]

#

CoffeeScript-only keywords, which we're more relaxed about allowing. They can't be used standalone, but you can reference them as an attached property.

COFFEE_ALIASES =  ["and", "or", "is", "isnt", "not"]
 COFFEE_KEYWORDS = COFFEE_ALIASES.concat [
   "then", "unless", "until", "loop",
   "yes", "no", "on", "off",
   "of", "by", "where", "when"
-]
#

The list of keywords that are reserved by JavaScript, but not used, or are +]

#

The list of keywords that are reserved by JavaScript, but not used, or are used by CoffeeScript internally. We throw an error when these are encountered, to avoid having a JavaScript error at runtime.

RESERVED = [
   "case", "default", "do", "function", "var", "void", "with",
   "const", "let", "enum", "export", "import", "native",
   "__hasProp", "__extends", "__slice"
-]
#

The superset of both JavaScript keywords and reserved words, none of which may -be used as identifiers or properties.

JS_FORBIDDEN = JS_KEYWORDS.concat RESERVED
#

Token matching regexes.

IDENTIFIER    = /^([a-zA-Z\$_](\w|\$)*)/
+]
#

The superset of both JavaScript keywords and reserved words, none of which may +be used as identifiers or properties.

JS_FORBIDDEN = JS_KEYWORDS.concat RESERVED
#

Token matching regexes.

IDENTIFIER    = /^([a-zA-Z\$_](\w|\$)*)/
 NUMBER        = /^(((\b0(x|X)[0-9a-fA-F]+)|((\b[0-9]+(\.[0-9]+)?|\.[0-9]+)(e[+\-]?[0-9]+)?)))\b/i
 HEREDOC       = /^("{6}|'{6}|"{3}([\s\S]*?)\n?([ \t]*)"{3}|'{3}([\s\S]*?)\n?([ \t]*)'{3})/
 OPERATOR      = /^(-[\-=>]?|\+[+=]?|[*&|\/%=<>^:!?]+)([ \t]*)/
 WHITESPACE    = /^([ \t]+)/
-COMMENT       = /^(([ \t]*\n)*([ \t]*)###([^#][\s\S]*?)(###[ \t]*\n|(###)?$)|(\s*#(?!##[^#])[^\n]*)+)/
+COMMENT       = /^(###([^#][\s\S]*?)(###[ \t]*\n|(###)?$)|(\s*#(?!##[^#])[^\n]*)+)/
 CODE          = /^((-|=)>)/
 MULTI_DENT    = /^((\n([ \t]*))+)(\.)?/
 LAST_DENTS    = /\n([ \t]*)/g
-LAST_DENT     = /\n([ \t]*)/
#

Regex-matching-regexes.

REGEX_START         = /^\/([^\/])/
+LAST_DENT     = /\n([ \t]*)/
#

Regex-matching-regexes.

REGEX_START         = /^\/([^\/])/
 REGEX_INTERPOLATION = /([^\\]#\{.*[^\\]\})/
 REGEX_END           = /^(([imgy]{1,4})\b|\W|$)/
-REGEX_ESCAPE        = /\\[^\$]/g
#

Token cleaning regexes.

JS_CLEANER      = /(^`|`$)/g
+REGEX_ESCAPE        = /\\[^\$]/g
#

Token cleaning regexes.

JS_CLEANER      = /(^`|`$)/g
 MULTILINER      = /\n/g
 NO_NEWLINE      = /^([+\*&|\/\-%=<>!.\\][<>=&|]*|and|or|is|isnt|not|delete|typeof|instanceof)$/
 HEREDOC_INDENT  = /(\n+([ \t]*)|^([ \t]+))/g
 ASSIGNED        = /^\s*(([a-zA-Z\$_@]\w*|["'][^\r\n]+?["']|\d+)[ \t]*?[:=][^:=])/
-NEXT_CHARACTER  = /^\s*(\S)/
#

Compound assignment tokens.

COMPOUND_ASSIGN = ['-=', '+=', '/=', '*=', '%=', '||=', '&&=', '?=', '<<=', '>>=', '>>>=', '&=', '^=', '|=']
#

Unary tokens.

UNARY   = ['UMINUS', 'UPLUS', '!', '!!', '~', 'TYPEOF', 'DELETE']
#

Logical tokens.

LOGIC   = ['&', '|', '^', '&&', '||']
#

Bit-shifting tokens.

SHIFT   = ['<<', '>>', '>>>']
#

Comparison tokens.

COMPARE = ['<=', '<', '>', '>=']
#

Mathmatical tokens.

MATH    = ['*', '/', '%']
#

Tokens which a regular expression will never immediately follow, but which +NEXT_CHARACTER = /^\s*(\S)/

#

Compound assignment tokens.

COMPOUND_ASSIGN = ['-=', '+=', '/=', '*=', '%=', '||=', '&&=', '?=', '<<=', '>>=', '>>>=', '&=', '^=', '|=']
#

Unary tokens.

UNARY   = ['UMINUS', 'UPLUS', '!', '!!', '~', 'TYPEOF', 'DELETE']
#

Logical tokens.

LOGIC   = ['&', '|', '^', '&&', '||']
#

Bit-shifting tokens.

SHIFT   = ['<<', '>>', '>>>']
#

Comparison tokens.

COMPARE = ['<=', '<', '>', '>=']
#

Mathmatical tokens.

MATH    = ['*', '/', '%']
#

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

-

Our list is shorter, due to sans-parentheses method calls.

NOT_REGEX = ['NUMBER', 'REGEX', '++', '--', 'FALSE', 'NULL', 'TRUE', ']']
#

Tokens which could legitimately be invoked or indexed. A opening +

Our list is shorter, due to sans-parentheses method calls.

NOT_REGEX = ['NUMBER', 'REGEX', '++', '--', 'FALSE', 'NULL', 'TRUE', ']']
#

Tokens which could legitimately be invoked or indexed. A opening parentheses or bracket following these tokens will be recorded as the start -of a function invocation or indexing operation.

CALLABLE = ['IDENTIFIER', 'SUPER', ')', ']', '}', 'STRING', '@', 'THIS', '?', '::']
#

Tokens that, when immediately preceding a WHEN, indicate that the WHEN +of a function invocation or indexing operation.

CALLABLE = ['IDENTIFIER', 'SUPER', ')', ']', '}', 'STRING', '@', 'THIS', '?', '::']
#

Tokens that, when immediately preceding a WHEN, indicate that the WHEN occurs at the start of a line. We disambiguate these from trailing whens to -avoid an ambiguity in the grammar.

LINE_BREAK = ['INDENT', 'OUTDENT', 'TERMINATOR']
#

Conversions from CoffeeScript operators into JavaScript ones.

CONVERSIONS =
+avoid an ambiguity in the grammar.

LINE_BREAK = ['INDENT', 'OUTDENT', 'TERMINATOR']
#

Conversions from CoffeeScript operators into JavaScript ones.

CONVERSIONS =
   'and':  '&&'
   'or':   '||'
   'is':   '=='
diff --git a/documentation/docs/nodes.html b/documentation/docs/nodes.html
index c3c420b9..181e0355 100644
--- a/documentation/docs/nodes.html
+++ b/documentation/docs/nodes.html
@@ -1,14 +1,7 @@
       nodes.coffee           
closure = @isStatement(o)andnot@isPureStatement()andnottopandnot@options.asStatementandthisnotinstanceofCommentNodeandnot@containsPureStatement() - ifclosurethen@compileClosure(@options)else@compileNode(@options)traverseChildren:(crossScope,func)->@eachChild(child)->func.apply(this,arguments) - child.traverseChildren(crossScope,func)ifchildinstanceofBaseNode@source = baselineifprop.soakNodeif@base.containsType(CallNode)andiis0 - temp = o.scope.freeVariable() + temp = o.scope.freeVariable'ref'complete = "(#{ baseline = temp } = (#{complete}))"complete = ifiis0"(typeof #{complete} === \"undefined\" || #{baseline} === null) ? undefined : " @@ -268,7 +264,7 @@ evaluate a anything twice when building the soak chain.

complete+=part@last = part - ifopand@wrappedthen"(#{complete})"elsecomplete@argsor=[]@first = @last = ''@compileSplatArguments = (o)-> - SplatNode.compileSplattedArray.call(this,@args,o)@compileSuper(args.join(', '),o)else"#{@first}#{@prefix()}#{@meth}(#{ args.join(', ') })#{@last}" - ifopand@variableand@variable.wrappedthen"(#{code})"elsecodeforargin@argsarg.contains(n)->mentionsArgsor=ninstanceofLiteralNodeand(n.valueis'arguments')utility'extends' - a = o.scope.freeVariable() - b = o.scope.freeVariable() - c = o.scope.freeVariable() + a = o.scope.freeVariable'ctor' + b = o.scope.freeVariable'ref' + c = o.scope.freeVariable'result'"""#DIVIDER """else - "#{@first}#{@prefix()}#{meth}.apply(#{obj}, #{ @compileSplatArguments(o) })#{@last}"parts = [] parts.push @from if @from isnt @fromVar parts.push @to if @to isnt @toVar - if parts.length then "#{parts.join('; ')}; " else '' super()isStatement:-> - @isValue()and(@variable.isArray()or@variable.isObject())o.scope.findnameunless@isValue()and(@variable.hasProperties()or@variable.namespaced)val = "#{name} = #{val}"return"#{@tab}#{val};"ifstmt - iftopor@parentheticalthenvalelse"(#{val})"elseifparam.attach{value}=param - [param,param.splat]=[literal(o.scope.freeVariable()),param.splat] + [param,param.splat]=[literal(o.scope.freeVariable'arg'),param.splat]@body.unshiftnewAssignNodenewValueNode(literal('this'),[newAccessorNodevalue]),paramifparam.splatsplat = newSplatNodeparam.value @@ -707,7 +710,7 @@ has no children -- they're within the inner scope.

iftopthen"(#{func})"elsefunctopSensitive:-> - trueelsecode = "[#{code}]"args.push(ifiis0thencodeelse".concat(#{code})") - args.join('')cond = @condition.compile(o)set = ''unlesstop - rvar = o.scope.freeVariable() + rvar = o.scope.freeVariable'result'set = "#{@tab}#{rvar} = [];\n"@body = PushNode.wrap(rvar,@body)if@bodypre = "#{set}#{@tab}while (#{cond})" @@ -823,15 +826,15 @@ flexibility or more speed than a comprehension can provide.

post = '\n'+newReturnNode(literal(rvar)).compile(merge(o,indent:@idt()))elsepost = '' - "#{pre} {\n#{ @body.compile(o) }\n#{@tab}}#{post}"return@compileExistence(o)if@operatoris'?'@first = newParentheticalNode(@first)if@firstinstanceofOpNodeand@first.isMutator()@second = newParentheticalNode(@second)if@secondinstanceofOpNodeand@second.isMutator() - [@first.compile(o),@operator,@second.compile(o)].join' 'compileLoopTest:(o)->[@arr1,@arr2]=@array.compileReferenceo,precompile:yes - [i,l]=[o.scope.freeVariable(),o.scope.freeVariable()] + [i,l]=[o.scope.freeVariable('i'),o.scope.freeVariable('len')]prefix = if@obj1isnt@obj2then@obj1+'; 'else'' - "(function(){ #{prefix}for (var #{i}=0, #{l}=#{@arr1}.length; #{i}<#{l}; #{i}++) { if (#{@arr2}[#{i}] === #{@obj2}) return true; } return false; }).call(this)"makeReturn:->@attempt = @attempt.makeReturn()if@attempt@recovery = @recovery.makeReturn()if@recovery - thisreturn code if top and @expression.isPureStatement o if @parenthetical or @isStatement o return if top then @tab + code + ';' else code - "(#{code})" ' else '+@elseBodyNode().compile(merge(o,{indent:@idt(),chainChild:true}))else" else {\n#{ @elseBody.compile(o) }\n#{@tab}}" - "#{ifPart}#{elsePart}"

nodes.coffee

#

nodes.coffee contains all of the node classes for the syntax tree. Most nodes are created as the result of actions in the grammar, but some are created by other nodes as a method of code generation. To convert -the syntax tree into a string of JavaScript code, call compile() on the root.

#

Set up for both Node.js and the browser, by -including the Scope class and the helper functions.

if process?
-  Scope =   require('./scope').Scope
-  helpers = require('./helpers').helpers
-else
-  this.exports = this
-  helpers =      this.helpers
-  Scope =        this.Scope
#

Import the helpers we plan to use.

{compact, flatten, merge, del, include, indexOf, starts, ends} = helpers
#

BaseNode

#

The BaseNode is the abstract base class for all nodes in the syntax tree. +the syntax tree into a string of JavaScript code, call compile() on the root.

{Scope} = require './scope'
#

Import the helpers we plan to use.

{compact, flatten, merge, del, include, indexOf, starts, ends} = require('./helpers').helpers
#

BaseNode

#

The BaseNode is the abstract base class for all nodes in the syntax tree. Each subclass implements the compileNode method, which performs the code generation for that node. To compile a node to JavaScript, call compile on it, which wraps compileNode in some generic extra smarts, @@ -19,7 +12,7 @@ being requested by the surrounding function), information about the current scope, and indentation level.

exports.BaseNode = class BaseNode
 
   constructor: ->
-    @tags = {}
#

Common logic for determining whether to wrap this node in a closure before + @tags = {}

#

Common logic for determining whether to wrap this node in a closure before compiling it, or to compile directly. We need to wrap if this node is a statement, and it's not a pureStatement, and we're not at the top level of a block (which would be unnecessary), and we haven't @@ -36,11 +29,14 @@ top-level statement within the function body.

#

Statements converted into expressions via closure-wrapping share a scope + o.scope.startLevel() if not o.keepLevel + code = if closure then @compileClosure(@options) else @compileNode(@options) + o.scope.endLevel() if not o.keepLevel + code

#

Statements converted into expressions via closure-wrapping share a scope object with their parent closure, to preserve the expected lexical scope.

  compileClosure: (o) ->
     @tab = o.indent
     o.sharedScope = o.scope
-    ClosureNode.wrap(this).compile o
#

If the code generation wishes to use the result of a complex expression + ClosureNode.wrap(this).compile o

#

If the code generation wishes to use the result of a complex expression in multiple places, ensure that the expression is only ever evaluated once, by assigning it to a temporary variable.

  compileReference: (o, options) ->
     options or= {}
@@ -50,18 +46,18 @@ by assigning it to a temporary variable.

else if this instanceof ValueNode and options.assignment this.cacheIndexes(o) else - reference = literal o.scope.freeVariable() + reference = literal o.scope.freeVariable 'ref' compiled = new AssignNode reference, this [compiled, reference] return [pair[0].compile(o), pair[1].compile(o)] if options.precompile - pair
#

Convenience method to grab the current indentation level, plus tabbing in.

  idt: (tabs) ->
+    pair
#

Convenience method to grab the current indentation level, plus tabbing in.

  idt: (tabs) ->
     idt = @tab or ''
     num = (tabs or 0) + 1
     idt += TAB while num -= 1
-    idt
#

Construct a node that returns the current node's result. + idt

#

Construct a node that returns the current node's result. Note that this is overridden for smarter behavior for many statement nodes (eg IfNode, ForNode)...

  makeReturn: ->
-    new ReturnNode this
#

Does this node, or any of its children, contain a node of a certain kind? + new ReturnNode this

#

Does this node, or any of its children, contain a node of a certain kind? Recursively traverses down the children of the nodes, yielding to a block and returning true when the block finds a match. contains does not cross scope boundaries.

  contains: (block) ->
@@ -70,10 +66,10 @@ scope boundaries.

if block(node) contains = true return false - contains
#

Is this node of a certain type, or does it contain the type?

  containsType: (type) ->
-    this instanceof type or @contains (n) -> n instanceof type
#

Convenience for the most common use of contains. Does the node contain + contains

#

Is this node of a certain type, or does it contain the type?

  containsType: (type) ->
+    this instanceof type or @contains (n) -> n instanceof type
#

Convenience for the most common use of contains. Does the node contain a pure statement?

  containsPureStatement: ->
-    @isPureStatement() or @contains (n) -> n.isPureStatement and n.isPureStatement()
#

Perform an in-order traversal of the AST. Crosses scope boundaries.

  traverse: (block) -> @traverseChildren true, block
#

toString representation of the node, for inspecting the parse tree. + @isPureStatement() or @contains (n) -> n.isPureStatement and n.isPureStatement()

#

Perform an in-order traversal of the AST. Crosses scope boundaries.

  traverse: (block) -> @traverseChildren true, block
#

toString representation of the node, for inspecting the parse tree. This is what coffee --nodes prints out.

  toString: (idt, override) ->
     idt or= ''
     children = (child.toString idt + TAB for child in @collectChildren()).join('')
@@ -93,14 +89,14 @@ This is what coffee --nodes prints out.

#

Default implementations of the common node properties and methods. Nodes + child.traverseChildren(crossScope, func) if child instanceof BaseNode

#

Default implementations of the common node properties and methods. Nodes will override these with custom logic, if needed.

  class:    'BaseNode'
   children: []
 
   unwrap          : -> this
   isStatement     : -> no
   isPureStatement : -> no
-  topSensitive    : -> no
#

Expressions

#

The expressions body is the list of expressions that forms the body of an + topSensitive : -> no

#

Expressions

#

The expressions body is the list of expressions that forms the body of an indented block of code -- the implementation of a function, a clause in an if, switch, or try, and so on...

exports.Expressions = class Expressions extends BaseNode
 
@@ -110,26 +106,26 @@ indented block of code -- the implementation of a function, a clause in an
 
   constructor: (nodes) ->
     super()
-    @expressions = compact flatten nodes or []
#

Tack an expression on to the end of this expression list.

  push: (node) ->
+    @expressions = compact flatten nodes or []
#

Tack an expression on to the end of this expression list.

  push: (node) ->
     @expressions.push(node)
-    this
#

Add an expression at the beginning of this expression list.

  unshift: (node) ->
+    this
#

Add an expression at the beginning of this expression list.

  unshift: (node) ->
     @expressions.unshift(node)
-    this
#

If this Expressions consists of just a single node, unwrap it by pulling + this

#

If this Expressions consists of just a single node, unwrap it by pulling it back out.

  unwrap: ->
-    if @expressions.length is 1 then @expressions[0] else this
#

Is this an empty block of code?

  empty: ->
-    @expressions.length is 0
#

An Expressions node does not return its entire body, rather it + if @expressions.length is 1 then @expressions[0] else this

#

Is this an empty block of code?

  empty: ->
+    @expressions.length is 0
#

An Expressions node does not return its entire body, rather it ensures that the final expression is returned.

  makeReturn: ->
     idx  = @expressions.length - 1
     last = @expressions[idx]
     last = @expressions[idx -= 1] if last instanceof CommentNode
     return this if not last or last instanceof ReturnNode
     @expressions[idx] = last.makeReturn()
-    this
#

An Expressions is the only node that can serve as the root.

  compile: (o) ->
+    this
#

An Expressions is the only node that can serve as the root.

  compile: (o) ->
     o or= {}
     if o.scope then super(o) else @compileRoot(o)
 
   compileNode: (o) ->
-    (@compileExpression(node, merge(o)) for node in @expressions).join("\n")
#

If we happen to be the top-level Expressions, wrap everything in + (@compileExpression(node, merge(o)) for node in @expressions).join("\n")

#

If we happen to be the top-level Expressions, wrap everything in a safety closure, unless requested not to. It would be better not to generate them in the first place, but for now, clean up obvious double-parentheses.

  compileRoot: (o) ->
@@ -137,20 +133,20 @@ clean up obvious double-parentheses.

o.scope = new Scope(null, this, null) code = @compileWithDeclarations(o) code = code.replace(TRAILING_WHITESPACE, '') - if o.noWrap then code else "(function() {\n#{code}\n})();\n"
#

Compile the expressions body for the contents of a function, with + if o.noWrap then code else "(function() {\n#{code}\n}).call(this);\n"

#

Compile the expressions body for the contents of a function, with declarations of all inner variables pushed up to the top.

  compileWithDeclarations: (o) ->
     code = @compileNode(o)
     code = "#{@tab}var #{o.scope.compiledAssignments()};\n#{code}"  if o.scope.hasAssignments(this)
     code = "#{@tab}var #{o.scope.compiledDeclarations()};\n#{code}" if not o.globals and o.scope.hasDeclarations(this)
-    code
#

Compiles a single expression within the expressions body. If we need to + code

#

Compiles a single expression within the expressions body. If we need to return the result, and it's an expression, simply return it. If it's a statement, ask the statement to do so.

  compileExpression: (node, o) ->
     @tab = o.indent
     compiledNode = node.compile merge o, top: true
-    if node.isStatement(o) then compiledNode else "#{@idt()}#{compiledNode};"
#

Wrap up the given nodes as an Expressions, unless it already happens + if node.isStatement(o) then compiledNode else "#{@idt()}#{compiledNode};"

#

Wrap up the given nodes as an Expressions, unless it already happens to be one.

Expressions.wrap = (nodes) ->
   return nodes[0] if nodes.length is 1 and nodes[0] instanceof Expressions
-  new Expressions(nodes)
#

LiteralNode

#

Literals are static values that can be passed through directly into + new Expressions(nodes)

#

LiteralNode

#

Literals are static values that can be passed through directly into JavaScript without translation, such as: strings, numbers, true, false, null...

exports.LiteralNode = class LiteralNode extends BaseNode
 
@@ -160,7 +156,7 @@ JavaScript without translation, such as: strings, numbers,
     super()
 
   makeReturn: ->
-    if @isStatement() then this else super()
#

Break and continue must be treated as pure statements -- they lose their + if @isStatement() then this else super()

#

Break and continue must be treated as pure statements -- they lose their meaning when wrapped in a closure.

  isStatement: ->
     @value is 'break' or @value is 'continue' or @value is 'debugger'
   isPureStatement: LiteralNode::isStatement
@@ -171,7 +167,7 @@ meaning when wrapped in a closure.

idt + @value + end toString: (idt) -> - '"' + @value + '"'
#

ReturnNode

#

A return is a pureStatement -- wrapping it in a closure wouldn't + '"' + @value + '"'

#

ReturnNode

#

A return is a pureStatement -- wrapping it in a closure wouldn't make sense.

exports.ReturnNode = class ReturnNode extends BaseNode
 
   class:            'ReturnNode'
@@ -192,18 +188,18 @@ make sense.

compileNode: (o) -> o.asStatement = true if @expression.isStatement(o) - "#{@tab}return #{@expression.compile(o)};"
#

ValueNode

#

A value, variable or literal or parenthesized, indexed or dotted into, + "#{@tab}return #{@expression.compile(o)};"

#

ValueNode

#

A value, variable or literal or parenthesized, indexed or dotted into, or vanilla.

exports.ValueNode = class ValueNode extends BaseNode
 
   class:     'ValueNode'
-  children: ['base', 'properties']
#

A ValueNode has a base and a list of property accesses.

  constructor: (@base, @properties) ->
+  children: ['base', 'properties']
#

A ValueNode has a base and a list of property accesses.

  constructor: (@base, @properties) ->
     super()
-    @properties or= []
#

Add a property access to the list.

  push: (prop) ->
+    @properties or= []
#

Add a property access to the list.

  push: (prop) ->
     @properties.push(prop)
     this
 
   hasProperties: ->
-    !!@properties.length
#

Some boolean checks for the benefit of other nodes.

  isArray: ->
+    !!@properties.length
#

Some boolean checks for the benefit of other nodes.

  isArray: ->
     @base instanceof ArrayNode and not @hasProperties()
 
   isObject: ->
@@ -213,13 +209,13 @@ or vanilla.

@hasProperties() and @properties[@properties.length - 1] instanceof SliceNode makeReturn: -> - if @hasProperties() then super() else @base.makeReturn()
#

The value can be unwrapped as its inner node, if there are no attached + if @hasProperties() then super() else @base.makeReturn()

#

The value can be unwrapped as its inner node, if there are no attached properties.

  unwrap: ->
-    if @properties.length then this else @base
#

Values are considered to be statements if their base is a statement.

  isStatement: (o) ->
+    if @properties.length then this else @base
#

Values are considered to be statements if their base is a statement.

  isStatement: (o) ->
     @base.isStatement and @base.isStatement(o) and not @hasProperties()
 
   isNumber: ->
-    @base instanceof LiteralNode and @base.value.match NUMBER
#

If the value node has indexes containing function calls, and the value node + @base instanceof LiteralNode and @base.value.match NUMBER

#

If the value node has indexes containing function calls, and the value node needs to be used twice, in compound assignment ... then we need to cache the value of the indexes.

  cacheIndexes: (o) ->
     copy = new ValueNode @base, @properties[0..]
@@ -230,8 +226,8 @@ the value of the indexes.

[index, indexVar] = prop.index.compileReference o this.properties[i] = new IndexNode index copy.properties[i] = new IndexNode indexVar - [this, copy]
#

Override compile to unwrap the value when possible.

  compile: (o) ->
-    if not o.top or @properties.length then super(o) else @base.compile(o)
#

We compile a value to JavaScript by compiling and joining each property. + [this, copy]

#

Override compile to unwrap the value when possible.

  compile: (o) ->
+    if not o.top or @properties.length then super(o) else @base.compile(o)
#

We compile a value to JavaScript by compiling and joining each property. Things get much more insteresting if the chain of properties has soak operators ?. interspersed. Then we have to take care not to accidentally evaluate a anything twice when building the soak chain.

  compileNode: (o) ->
@@ -252,7 +248,7 @@ evaluate a anything twice when building the soak chain.

#

CommentNode

#

CoffeeScript passes through block comments as JavaScript block comments + if op and @wrapped then "(#{complete})" else complete

#

CommentNode

#

CoffeeScript passes through block comments as JavaScript block comments at the same position.

exports.CommentNode = class CommentNode extends BaseNode
 
   class: 'CommentNode'
@@ -281,7 +277,7 @@ at the same position.

this compileNode: (o) -> - @tab + '/*' + @comment.replace(/\r?\n/g, '\n' + @tab) + '*/'
#

CallNode

#

Node for a function invocation. Takes care of converting super() calls into + @tab + '/*' + @comment.replace(/\r?\n/g, '\n' + @tab) + '*/'

#

CallNode

#

Node for a function invocation. Takes care of converting super() calls into calls against the prototype's function of the same name.

exports.CallNode = class CallNode extends BaseNode
 
   class:     'CallNode'
@@ -295,26 +291,33 @@ calls against the prototype's function of the same name.

#

Tag this invocation as creating a new instance.

  newInstance: ->
+      SplatNode.compileSplattedArray.call(this, @args, o)
#

Tag this invocation as creating a new instance.

  newInstance: ->
     @isNew = true
     this
 
   prefix: ->
-    if @isNew then 'new ' else ''
#

Grab the reference to the superclass' implementation of the current method.

  superReference: (o) ->
+    if @isNew then 'new ' else ''
#

Grab the reference to the superclass' implementation of the current method.

  superReference: (o) ->
     throw new Error "cannot call super outside of a function" unless o.scope.method
     methname = o.scope.method.name
     meth = if o.scope.method.proto
       "#{o.scope.method.proto}.__super__.#{methname}"
     else if methname
       "#{methname}.__super__.constructor"
-    else throw new Error "cannot call super on an anonymous function."
#

Compile a vanilla function call.

  compileNode: (o) ->
+    else throw new Error "cannot call super on an anonymous function."
#

Compile a vanilla function call.

  compileNode: (o) ->
     o.chainRoot = this unless o.chainRoot
     op = @tags.operation
     if @exist
-      [@first, @meth] = @variable.compileReference o, precompile: yes
+      if @variable instanceof ValueNode and @variable.properties[@variable.properties.length - 1] instanceof AccessorNode
+        methodAccessor = @variable.properties.pop()
+        [first, meth] = @variable.compileReference o
+        @first = new ValueNode(first, [methodAccessor]).compile o
+        @meth = new ValueNode(meth, [methodAccessor]).compile o
+      else
+        [@first, @meth] = @variable.compileReference o, precompile: yes
       @first = "(typeof #{@first} === \"function\" ? "
       @last  = " : undefined)"
-    else if @variable then @meth = @variable.compile o
+    else if @variable
+      @meth = @variable.compile o
     for arg in @args when arg instanceof SplatNode
       code = @compileSplat(o)
     if not code
@@ -325,16 +328,16 @@ calls against the prototype's function of the same name.

#

super() is converted into a call against the superclass's implementation + if op and @variable and @variable.wrapped then "(#{code})" else code

#

super() is converted into a call against the superclass's implementation of the current function.

  compileSuper: (args, o) ->
-    "#{@superReference(o)}.call(this#{ if args.length then ', ' else '' }#{args})"
#

If you call a function with a splat, it's converted into a JavaScript + "#{@superReference(o)}.call(this#{ if args.length then ', ' else '' }#{args})"

#

If you call a function with a splat, it's converted into a JavaScript .apply() call to allow an array of arguments to be passed. If it's a constructor, then things get real tricky. We have to inject an inner constructor in order to be able to pass the varargs.

  compileSplat: (o) ->
     meth = @meth or @superReference(o)
     obj  = @variable and @variable.source or 'this'
     if obj.match(/\(/)
-      temp = o.scope.freeVariable()
+      temp = o.scope.freeVariable 'ref'
       obj  = temp
       meth = "(#{temp} = #{ @variable.source })#{ @variable.last }"
     if @isNew
@@ -342,29 +345,29 @@ inner constructor in order to be able to pass the varargs.

#

{@first}(function() { + "#{@first}#{@prefix()}#{meth}.apply(#{obj}, #{ @compileSplatArguments(o) })#{@last}"

#

{@first}(function() { {@idt(1)}var ctor = function(){}; {@idt(1)}__extends(ctor, #{a} = #{meth}); -{@idt(1)}return typeof (#{b} = #{a}.apply(#{c} = new ctor, #{ @compileSplatArguments(o) })) === "object" ? #{b} : #{c}; -{@tab}}).#{ if mentionsArgs then 'apply(this, arguments)' else 'call(this)'}#{@last}

#

ExtendsNode

exports.ExtendsNode = class ExtendsNode extends BaseNode
+{@idt(1)}return typeof (#{c} = #{a}.apply(#{b} = new ctor, #{ @compileSplatArguments(o) })) === "object" ? #{c} : #{b};
+{@tab}}).#{ if mentionsArgs then 'apply(this, arguments)' else 'call(this)'}#{@last}

#

ExtendsNode

exports.ExtendsNode = class ExtendsNode extends BaseNode
 
   class:     'ExtendsNode'
   children: ['child', 'parent']
 
   constructor: (@child, @parent) ->
-    super()
#

Node to extend an object's prototype with an ancestor object. + super()

#

Node to extend an object's prototype with an ancestor object. After goog.inherits from the Closure Library.

  compileNode: (o) ->
     ref =  new ValueNode literal utility 'extends'
-    (new CallNode ref, [@child, @parent]).compile o
#

Hooks one constructor into another's prototype chain.

#

AccessorNode

exports.AccessorNode = class AccessorNode extends BaseNode
+    (new CallNode ref, [@child, @parent]).compile o
#

Hooks one constructor into another's prototype chain.

#

AccessorNode

exports.AccessorNode = class AccessorNode extends BaseNode
 
   class:     'AccessorNode'
   children: ['name']
@@ -378,8 +381,8 @@ After goog.inherits from the
     name = @name.compile o
     o.chainRoot.wrapped or= @soakNode
     namePart = if name.match(IS_STRING) then "[#{name}]" else ".#{name}"
-    @prototype + namePart
#

A . accessor into a property of a value, or the :: shorthand for -an accessor into the object's prototype.

#

IndexNode

exports.IndexNode = class IndexNode extends BaseNode
+    @prototype + namePart
#

A . accessor into a property of a value, or the :: shorthand for +an accessor into the object's prototype.

#

IndexNode

exports.IndexNode = class IndexNode extends BaseNode
 
   class:     'IndexNode'
   children: ['index']
@@ -391,7 +394,7 @@ an accessor into the object's prototype.

o.chainRoot.wrapped or= @soakNode idx = @index.compile o prefix = if @proto then '.prototype' else '' - "#{prefix}[#{idx}]"
#

A [ ... ] indexed accessor into an array or object.

#

RangeNode

exports.RangeNode = class RangeNode extends BaseNode
+    "#{prefix}[#{idx}]"
#

A [ ... ] indexed accessor into an array or object.

#

RangeNode

exports.RangeNode = class RangeNode extends BaseNode
 
   class:     'RangeNode'
   children: ['from', 'to']
@@ -399,7 +402,7 @@ an accessor into the object's prototype.

constructor: (@from, @to, tag) -> super() @exclusive = tag is 'exclusive' - @equals = if @exclusive then '' else '='
#

A range literal. Ranges can be used to extract portions (slices) of arrays, + @equals = if @exclusive then '' else '='

#

A range literal. Ranges can be used to extract portions (slices) of arrays, to specify a range for comprehensions, or as a value, to be expanded into the corresponding array of integers at runtime.

  compileVariables: (o) ->
     o = merge(o, top: true)
@@ -409,7 +412,7 @@ corresponding array of integers at runtime.

#

Compiles the range's source variables -- where it starts and where it ends. + if parts.length then "#{parts.join('; ')}; " else ''

#

Compiles the range's source variables -- where it starts and where it ends. But only if they need to be cached to avoid double evaluation.

  compileNode: (o) ->
     return    @compileArray(o)  unless o.index
     return    @compileSimple(o) if @fromNum and @toNum
@@ -420,7 +423,7 @@ But only if they need to be cached to avoid double evaluation.

< compare = "#{intro} <#{@equals} #{@toVar} : #{idx} >#{@equals} #{@toVar})" stepPart = if step then step.compile(o) else '1' incr = if step then "#{idx} += #{stepPart}" else "#{intro} += #{stepPart} : #{idx} -= #{stepPart})" - "#{vars}; #{compare}; #{incr}"
#

When compiled normally, the range returns the contents of the for loop + "#{vars}; #{compare}; #{incr}"

#

When compiled normally, the range returns the contents of the for loop needed to iterate over the values in the range. Used by comprehensions.

  compileSimple: (o) ->
     [from, to] = [parseInt(@fromNum, 10), parseInt(@toNum, 10)]
     idx        = del o, 'index'
@@ -429,15 +432,15 @@ needed to iterate over the values in the range. Used by comprehensions.

if from <= to "#{idx} = #{from}; #{idx} <#{@equals} #{to}; #{step or "#{idx}++"}" else - "#{idx} = #{from}; #{idx} >#{@equals} #{to}; #{step or "#{idx}--"}"
#

Compile a simple range comprehension, with integers.

  compileArray: (o) ->
+      "#{idx} = #{from}; #{idx} >#{@equals} #{to}; #{step or "#{idx}--"}"
#

Compile a simple range comprehension, with integers.

  compileArray: (o) ->
     idt    = @idt 1
     vars   = @compileVariables merge o, indent: idt
     if @fromNum and @toNum and Math.abs(+@fromNum - +@toNum) <= 20
       range = [+@fromNum..+@toNum]
       range.pop() if @exclusive
       return "[#{ range.join(', ') }]"
-    i = o.scope.freeVariable()
-    result = o.scope.freeVariable()
+    i = o.scope.freeVariable 'i'
+    result = o.scope.freeVariable 'result'
     pre    = "\n#{idt}#{result} = []; #{vars}"
     if @fromNum and @toNum
       o.index = i
@@ -446,7 +449,7 @@ needed to iterate over the values in the range. Used by comprehensions.

clause = "#{@fromVar} <= #{@toVar} ?" body = "var #{i} = #{@fromVar}; #{clause} #{i} <#{@equals} #{@toVar} : #{i} >#{@equals} #{@toVar}; #{clause} #{i} += 1 : #{i} -= 1" post = "{ #{result}.push(#{i}); }\n#{idt}return #{result};\n#{o.indent}" - "(function() {#{pre}\n#{idt}for (#{body})#{post}}).call(this)"
#

When used as a value, expand the range into the equivalent array.

#

SliceNode

exports.SliceNode = class SliceNode extends BaseNode
+    "(function() {#{pre}\n#{idt}for (#{body})#{post}}).call(this)"
#

When used as a value, expand the range into the equivalent array.

#

SliceNode

exports.SliceNode = class SliceNode extends BaseNode
 
   class:     'SliceNode'
   children: ['range']
@@ -459,9 +462,9 @@ needed to iterate over the values in the range. Used by comprehensions.

to = if @range.to then @range.to.compile(o) else '' to += if not to or @range.exclusive then '' else ' + 1' to = ', ' + to if to - ".slice(#{from}#{to})"
#

An array slice literal. Unlike JavaScript's Array#slice, the second parameter + ".slice(#{from}#{to})"

#

An array slice literal. Unlike JavaScript's Array#slice, the second parameter specifies the index of the end of the slice, just as the first parameter -is the index of the beginning.

#

ObjectNode

exports.ObjectNode = class ObjectNode extends BaseNode
+is the index of the beginning.

#

ObjectNode

exports.ObjectNode = class ObjectNode extends BaseNode
 
   class:     'ObjectNode'
   children: ['properties']
@@ -486,7 +489,7 @@ is the index of the beginning.

indent + prop.compile(o) + join props = props.join('') obj = '{' + (if props then '\n' + props + '\n' + @idt() else '') + '}' - if top then "(#{obj})" else obj
#

An object literal, nothing fancy.

#

ArrayNode

exports.ArrayNode = class ArrayNode extends BaseNode
+    if top then "(#{obj})" else obj
#

An object literal, nothing fancy.

#

ArrayNode

exports.ArrayNode = class ArrayNode extends BaseNode
 
   class:     'ArrayNode'
   children: ['objects']
@@ -514,20 +517,20 @@ is the index of the beginning.

if indexOf(objects, '\n') >= 0 "[\n#{@idt(1)}#{objects}\n#{@tab}]" else - "[#{objects}]"
#

An array literal.

#

ClassNode

exports.ClassNode = class ClassNode extends BaseNode
+      "[#{objects}]"
#

An array literal.

#

ClassNode

exports.ClassNode = class ClassNode extends BaseNode
 
   class:        'ClassNode'
   children:     ['variable', 'parent', 'properties']
-  isStatement:  -> yes
#

The CoffeeScript class definition.

  constructor: (@variable, @parent, @properties) ->
+  isStatement:  -> yes
#

The CoffeeScript class definition.

  constructor: (@variable, @parent, @properties) ->
     super()
     @properties or= []
     @returns    = false
 
   makeReturn: ->
     @returns = true
-    this
#

Initialize a ClassNode with its name, an optional superclass, and a + this

#

Initialize a ClassNode with its name, an optional superclass, and a list of prototype property assignments.

  compileNode: (o) ->
-    @variable  = literal o.scope.freeVariable() if @variable is '__temp__'
+    @variable  = literal o.scope.freeVariable 'ctor' if @variable is '__temp__'
     extension  = @parent and new ExtendsNode(@variable, @parent)
     props      = new Expressions
     o.top      = true
@@ -559,7 +562,7 @@ list of prototype property assignments.

else func.bound = false constScope or= new Scope(o.scope, constructor.body, constructor) - me or= constScope.freeVariable() + me or= constScope.freeVariable 'this' pname = pvar.compile(o) constructor.body.push new ReturnNode literal 'this' if constructor.body.empty() constructor.body.unshift literal "this.#{pname} = function(){ return #{className}.prototype.#{pname}.apply(#{me}, arguments); }" @@ -574,9 +577,9 @@ list of prototype property assignments.

props = if !props.empty() then '\n' + props.compile(o) else '' extension = if extension then '\n' + @idt() + extension.compile(o) + ';' else '' returns = if @returns then '\n' + new ReturnNode(@variable).compile(o) else '' - construct + extension + props + returns
#

Instead of generating the JavaScript string directly, we build up the + construct + extension + props + returns

#

Instead of generating the JavaScript string directly, we build up the equivalent syntax tree and compile that, in pieces. You can see the -constructor, property assignments, and inheritance getting built out below.

#

AssignNode

exports.AssignNode = class AssignNode extends BaseNode
#

The AssignNode is used to assign a local variable to value, or to set the +constructor, property assignments, and inheritance getting built out below.

#

AssignNode

exports.AssignNode = class AssignNode extends BaseNode
#

The AssignNode is used to assign a local variable to value, or to set the property of an object -- including within object literals.

  PROTO_ASSIGN: /^(\S+)\.prototype/
   LEADING_DOT:  /^\.(prototype\.)?/
 
@@ -599,7 +602,7 @@ property of an object -- including within object literals.

#

Matchers for detecting prototype assignments.

  compileNode: (o) ->
+    @isValue() and (@variable.isArray() or @variable.isObject())
#

Matchers for detecting prototype assignments.

  compileNode: (o) ->
     top    = del o, 'top'
     return   @compilePatternMatch(o) if @isStatement(o)
     return   @compileSplice(o) if @isValue() and @variable.isSplice()
@@ -616,23 +619,23 @@ property of an object -- including within object literals.

#

Compile an assignment, delegating to compilePatternMatch or + if top or @parenthetical then val else "(#{val})"

#

Compile an assignment, delegating to compilePatternMatch or compileSplice if appropriate. Keep track of the name of the base object we've been assigned to, for correct internal references. If the variable has not been seen yet within the current scope, declare it.

  compilePatternMatch: (o) ->
-    valVar        = o.scope.freeVariable()
+    valVar        = o.scope.freeVariable 'ref'
     value         = if @value.isStatement(o) then ClosureNode.wrap(@value) else @value
     assigns       = ["#{@tab}#{valVar} = #{ value.compile(o) };"]
     o.top         = true
     o.asStatement = true
     splat         = false
-    for obj, i in @variable.base.objects
#

Brief implementation of recursive pattern matching, when assigning array or + for obj, i in @variable.base.objects

#

Brief implementation of recursive pattern matching, when assigning array or object literals to a value. Peeks at their properties to assign inner names. See the ECMAScript Harmony Wiki for details.

      idx = i
       if @variable.isObject()
-        if obj instanceof AssignNode
#

A regular array pattern-match.

          [obj, idx] = [obj.value, obj.variable.base]
-        else
#

A regular object pattern-match.

          idx = obj
+        if obj instanceof AssignNode
#

A regular array pattern-match.

          [obj, idx] = [obj.value, obj.variable.base]
+        else
#

A regular object pattern-match.

          idx = obj
       if not (obj instanceof ValueNode or obj instanceof SplatNode)
         throw new Error 'pattern matching must use only identifiers on the left-hand side.'
       isString = idx.value and idx.value.match IS_STRING
@@ -647,7 +650,7 @@ for details.

< val = new ValueNode(literal(valVar), [new accessClass(idx)]) assigns.push(new AssignNode(obj, val).compile(o)) code = assigns.join("\n") - code
#

A shorthand {a, b, c} = val pattern-match.

  compileSplice: (o) ->
+    code
#

A shorthand {a, b, c} = val pattern-match.

  compileSplice: (o) ->
     name  = @variable.compile merge o, onlyFirst: true
     l     = @variable.properties.length
     range = @variable.properties[l - 1].range
@@ -655,8 +658,8 @@ for details.

< from = if range.from then range.from.compile(o) else '0' to = if range.to then range.to.compile(o) + ' - ' + from + plus else "#{name}.length" val = @value.compile(o) - "#{name}.splice.apply(#{name}, [#{from}, #{to}].concat(#{val}))"
#

Compile the assignment from an array splice literal, using JavaScript's -Array#splice method.

#

CodeNode

exports.CodeNode = class CodeNode extends BaseNode
+    "#{name}.splice.apply(#{name}, [#{from}, #{to}].concat(#{val}))"
#

Compile the assignment from an array splice literal, using JavaScript's +Array#splice method.

#

CodeNode

exports.CodeNode = class CodeNode extends BaseNode
 
   class:     'CodeNode'
   children: ['params', 'body']
@@ -666,7 +669,7 @@ for details.

< @params or= [] @body or= new Expressions @bound = tag is 'boundfunc' - @context = 'this' if @bound
#

A function definition. This is the only node that creates a new Scope. + @context = 'this' if @bound

#

A function definition. This is the only node that creates a new Scope. When for the purposes of walking the contents of a function body, the CodeNode has no children -- they're within the inner scope.

  compileNode: (o) ->
     sharedScope = del o, 'sharedScope'
@@ -688,7 +691,7 @@ has no children -- they're within the inner scope.

#

Compilation creates a new scope unless explicitly asked to share with the + true

#

Compilation creates a new scope unless explicitly asked to share with the outer scope. Handles splat parameters in the parameter list by peeking at the JavaScript arguments objects. If the function is bound with the => arrow, generates a wrapper that saves the current value of this through @@ -716,8 +719,8 @@ a closure.

toString: (idt) -> idt or= '' children = (child.toString(idt + TAB) for child in @collectChildren()).join('') - '\n' + idt + children
#

Short-circuit traverseChildren method to prevent it from crossing scope boundaries -unless crossScope is true

#

ParamNode

exports.ParamNode = class ParamNode extends BaseNode
+    '\n' + idt + children
#

Short-circuit traverseChildren method to prevent it from crossing scope boundaries +unless crossScope is true

#

ParamNode

exports.ParamNode = class ParamNode extends BaseNode
 
   class:    'ParamNode'
   children: ['name']
@@ -730,9 +733,9 @@ unless crossScope is true

@value.compile o toString: (idt) -> - if @attach then (literal '@' + @name).toString idt else @value.toString idt
#

A parameter in a function definition. Beyond a typical Javascript parameter, + if @attach then (literal '@' + @name).toString idt else @value.toString idt

#

A parameter in a function definition. Beyond a typical Javascript parameter, these parameters can also attach themselves to the context of the function, -as well as be a splat, gathering up a group of parameters into an array.

#

SplatNode

exports.SplatNode = class SplatNode extends BaseNode
+as well as be a splat, gathering up a group of parameters into an array.

#

SplatNode

exports.SplatNode = class SplatNode extends BaseNode
 
   class:     'SplatNode'
   children: ['name']
@@ -743,28 +746,28 @@ as well as be a splat, gathering up a group of parameters into an array.

@name = name compileNode: (o) -> - if @index? then @compileParam(o) else @name.compile(o)
#

A splat, either as a parameter to a function, an argument to a call, + if @index? then @compileParam(o) else @name.compile(o)

#

A splat, either as a parameter to a function, an argument to a call, or as part of a destructuring assignment.

  compileParam: (o) ->
     name = @name.compile(o)
     o.scope.find name
     end = ''
     if @trailings.length
-      len = o.scope.freeVariable()
+      len = o.scope.freeVariable 'len'
       o.scope.assign len, "arguments.length"
-      variadic = o.scope.freeVariable()
+      variadic = o.scope.freeVariable 'result'
       o.scope.assign variadic, len + ' >= ' + @arglength
       end = if @trailings.length then ", #{len} - #{@trailings.length}"
       for trailing, idx in @trailings
         if trailing.attach
           assign        = trailing.assign
-          trailing      = literal o.scope.freeVariable()
+          trailing      = literal o.scope.freeVariable 'arg'
           assign.value  = trailing
         pos = @trailings.length - idx
         o.scope.assign(trailing.compile(o), "arguments[#{variadic} ? #{len} - #{pos} : #{@index + idx}]")
-    "#{name} = #{utility('slice')}.call(arguments, #{@index}#{end})"
#

Compiling a parameter splat means recovering the parameters that succeed + "#{name} = #{utility('slice')}.call(arguments, #{@index}#{end})"

#

Compiling a parameter splat means recovering the parameters that succeed the splat in the parameter list, by slicing the arguments object.

  compileValue: (o, name, index, trailings) ->
     trail = if trailings then ", #{name}.length - #{trailings}" else ''
-    "#{utility 'slice'}.call(#{name}, #{index}#{trail})"
#

A compiling a splat as a destructuring assignment means slicing arguments + "#{utility 'slice'}.call(#{name}, #{index}#{trail})"

#

A compiling a splat as a destructuring assignment means slicing arguments from the right-hand-side's corresponding array.

  @compileSplattedArray: (list, o) ->
     args = []
     for arg, i in list
@@ -780,8 +783,8 @@ from the right-hand-side's corresponding array.

#

Utility function that converts arbitrary number of elements, mixed with -splats, to a proper array

#

WhileNode

exports.WhileNode = class WhileNode extends BaseNode
+    args.join('')
#

Utility function that converts arbitrary number of elements, mixed with +splats, to a proper array

#

WhileNode

exports.WhileNode = class WhileNode extends BaseNode
 
   class:         'WhileNode'
   children:     ['condition', 'guard', 'body']
@@ -804,7 +807,7 @@ splats, to a proper array

this topSensitive: -> - true
#

A while loop, the only sort of low-level loop exposed by CoffeeScript. From + true

#

A while loop, the only sort of low-level loop exposed by CoffeeScript. From it, all other loops can be manufactured. Useful in cases where you need more flexibility or more speed than a comprehension can provide.

  compileNode: (o) ->
     top      =  del(o, 'top') and not @returns
@@ -814,7 +817,7 @@ flexibility or more speed than a comprehension can provide.

#

The main difference from a JavaScript while is that the CoffeeScript + "#{pre} {\n#{ @body.compile(o) }\n#{@tab}}#{post}"

#

The main difference from a JavaScript while is that the CoffeeScript while can be used as a part of a larger expression -- while loops may -return an array containing the computed result of each iteration.

#

OpNode

exports.OpNode = class OpNode extends BaseNode
#

Simple Arithmetic and logical operations. Performs some conversion from +return an array containing the computed result of each iteration.

#

OpNode

exports.OpNode = class OpNode extends BaseNode
#

Simple Arithmetic and logical operations. Performs some conversion from CoffeeScript operations into their JavaScript equivalents.

  CONVERSIONS:
     '==': '==='
-    '!=': '!=='
#

The map of conversions from CoffeeScript to JavaScript symbols.

  INVERSIONS:
+    '!=': '!=='
#

The map of conversions from CoffeeScript to JavaScript symbols.

  INVERSIONS:
     '!==': '==='
-    '===': '!=='
#

The map of invertible operators.

  CHAINABLE:        ['<', '>', '>=', '<=', '===', '!==']
#

The list of operators for which we perform -Python-style comparison chaining.

  ASSIGNMENT:       ['||=', '&&=', '?=']
#

Our assignment operators that have no JavaScript equivalent.

  PREFIX_OPERATORS: ['typeof', 'delete']
+    '===': '!=='
#

The map of invertible operators.

  CHAINABLE:        ['<', '>', '>=', '<=', '===', '!==']
#

The list of operators for which we perform +Python-style comparison chaining.

  ASSIGNMENT:       ['||=', '&&=', '?=']
#

Our assignment operators that have no JavaScript equivalent.

  PREFIX_OPERATORS: ['typeof', 'delete']
 
   class:     'OpNode'
   children: ['first', 'second']
@@ -872,11 +875,11 @@ CoffeeScript operations into their JavaScript equivalents.

#

Operators must come before their operands with a space.

  compileChain: (o) ->
+    [@first.compile(o), @operator, @second.compile(o)].join ' '
#

Operators must come before their operands with a space.

  compileChain: (o) ->
     shared = @first.unwrap().second
     [@first.second, shared] = shared.compileReference(o) if shared.containsType CallNode
     [first, second, shared] = [@first.compile(o), @second.compile(o), shared.compile(o)]
-    "(#{first}) && (#{shared} #{@operator} #{second})"
#

Mimic Python's chained comparisons when multiple comparison operators are + "(#{first}) && (#{shared} #{@operator} #{second})"

#

Mimic Python's chained comparisons when multiple comparison operators are used sequentially. For example:

bin/coffee -e "puts 50 < 65 > 10"
@@ -887,16 +890,16 @@ true
     second = "(#{second})" if @second instanceof OpNode
     o.scope.find(first) if first.match(IDENTIFIER)
     return "#{first} = #{ ExistenceNode.compileTest(o, literal(firstVar))[0] } ? #{firstVar} : #{second}" if @operator is '?='
-    "#{first} #{ @operator.substr(0, 2) } (#{firstVar} = #{second})"
#

When compiling a conditional assignment, take care to ensure that the + "#{first} #{ @operator.substr(0, 2) } (#{firstVar} = #{second})"

#

When compiling a conditional assignment, take care to ensure that the operands are only evaluated once, even though we have to reference them more than once.

  compileExistence: (o) ->
     [test, ref] = ExistenceNode.compileTest(o, @first)
-    "#{test} ? #{ref} : #{ @second.compile(o) }"
#

If this is an existence operator, we delegate to ExistenceNode.compileTest + "#{test} ? #{ref} : #{ @second.compile(o) }"

#

If this is an existence operator, we delegate to ExistenceNode.compileTest to give us the safe references for the variables.

  compileUnary: (o) ->
     space = if indexOf(@PREFIX_OPERATORS, @operator) >= 0 then ' ' else ''
     parts = [@operator, space, @first.compile(o)]
     parts = parts.reverse() if @flip
-    parts.join('')
#

Compile a unary OpNode.

exports.InNode = class InNode extends BaseNode
+    parts.join('')
#

Compile a unary OpNode.

exports.InNode = class InNode extends BaseNode
 
   class:    'InNode'
   children: ['object', 'array']
@@ -918,9 +921,9 @@ to give us the safe references for the variables.

#

InNode

#

TryNode

exports.TryNode = class TryNode extends BaseNode
+    "(function(){ #{prefix}for (var #{i}=0, #{l}=#{@arr1}.length; #{i}<#{l}; #{i}++) { if (#{@arr2}[#{i}] === #{@obj2}) return true; } return false; }).call(this)"
#

InNode

#

TryNode

exports.TryNode = class TryNode extends BaseNode
 
   class:        'TryNode'
   children:     ['attempt', 'recovery', 'ensure']
@@ -932,26 +935,26 @@ to give us the safe references for the variables.

#

A classic try/catch/finally block.

  compileNode: (o) ->
+    this
#

A classic try/catch/finally block.

  compileNode: (o) ->
     o.indent    = @idt 1
     o.top       = true
     attemptPart = @attempt.compile(o)
     errorPart   = if @error then " (#{ @error.compile(o) }) " else ' '
     catchPart   = if @recovery then " catch#{errorPart}{\n#{ @recovery.compile(o) }\n#{@tab}}" else ''
     finallyPart = (@ensure or '') and ' finally {\n' + @ensure.compile(merge(o)) + "\n#{@tab}}"
-    "#{@tab}try {\n#{attemptPart}\n#{@tab}}#{catchPart}#{finallyPart}"
#

Compilation is more or less as you would expect -- the finally clause -is optional, the catch is not.

#

ThrowNode

exports.ThrowNode = class ThrowNode extends BaseNode
+    "#{@tab}try {\n#{attemptPart}\n#{@tab}}#{catchPart}#{finallyPart}"
#

Compilation is more or less as you would expect -- the finally clause +is optional, the catch is not.

#

ThrowNode

exports.ThrowNode = class ThrowNode extends BaseNode
 
   class:         'ThrowNode'
   children:     ['expression']
   isStatement: -> yes
 
   constructor: (@expression) ->
-    super()
#

Simple node to throw an exception.

  makeReturn: ->
+    super()
#

Simple node to throw an exception.

  makeReturn: ->
     return this
 
   compileNode: (o) ->
-    "#{@tab}throw #{@expression.compile(o)};"
#

A ThrowNode is already a return, of sorts...

#

ExistenceNode

exports.ExistenceNode = class ExistenceNode extends BaseNode
+    "#{@tab}throw #{@expression.compile(o)};"
#

A ThrowNode is already a return, of sorts...

#

ExistenceNode

exports.ExistenceNode = class ExistenceNode extends BaseNode
 
   class:     'ExistenceNode'
   children: ['expression']
@@ -961,13 +964,13 @@ is optional, the catch is not.

compileNode: (o) -> test = ExistenceNode.compileTest(o, @expression)[0] - if @parenthetical then test.substring(1, test.length - 1) else test
#

Checks a variable for existence -- not null and not undefined. This is + if @parenthetical then test.substring(1, test.length - 1) else test

#

Checks a variable for existence -- not null and not undefined. This is similar to .nil? in Ruby, and avoids having to consult a JavaScript truth table.

  @compileTest: (o, variable) ->
     [first, second] = variable.compileReference o, precompile: yes
-    ["(typeof #{first} !== \"undefined\" && #{second} !== null)", second]
#

The meat of the ExistenceNode is in this static compileTest method + ["(typeof #{first} !== \"undefined\" && #{second} !== null)", second]

#

The meat of the ExistenceNode is in this static compileTest method because other nodes like to check the existence of their variables as well. -Be careful not to double-evaluate anything.

#

ParentheticalNode

exports.ParentheticalNode = class ParentheticalNode extends BaseNode
+Be careful not to double-evaluate anything.

#

ParentheticalNode

exports.ParentheticalNode = class ParentheticalNode extends BaseNode
 
   class:     'ParentheticalNode'
   children: ['expression']
@@ -991,11 +994,11 @@ Be careful not to double-evaluate anything.

#

An extra set of parentheses, specified explicitly in the source. At one time + "(#{code})"

#

An extra set of parentheses, specified explicitly in the source. At one time we tried to clean up the results by detecting and removing redundant parentheses, but no longer -- you can put in as many as you please.

-

Parentheses are a good way to force any statement to become an expression.

#

ForNode

exports.ForNode = class ForNode extends BaseNode
+

Parentheses are a good way to force any statement to become an expression.

#

ForNode

exports.ForNode = class ForNode extends BaseNode
 
   class:         'ForNode'
   children:     ['body', 'source', 'guard']
@@ -1024,7 +1027,7 @@ parentheses, but no longer -- you can put in as many as you please.

compileReturnValue: (val, o) -> return '\n' + new ReturnNode(literal(val)).compile(o) if @returns return '\n' + val if val - ''
#

CoffeeScript's replacement for the for loop is our array and object + ''

#

CoffeeScript's replacement for the for loop is our array and object comprehensions, that compile into for loops here. They also act as an expression, able to return the result of each filtered iteration.

@@ -1036,12 +1039,12 @@ you can map and filter in a single pass.

source = if range then @source.base else @source codeInBody = @body.contains (n) -> n instanceof CodeNode scope = o.scope - name = (@name and @name.compile(o)) or scope.freeVariable() + name = (@name and @name.compile(o)) or scope.freeVariable 'i' index = @index and @index.compile o scope.find(name, immediate: yes) if name and not @pattern and (range or not codeInBody) scope.find(index, immediate: yes) if index - rvar = scope.freeVariable() unless topLevel - ivar = if codeInBody then scope.freeVariable() else if range then name else index or scope.freeVariable() + rvar = scope.freeVariable 'result' unless topLevel + ivar = if codeInBody then scope.freeVariable 'i' else if range then name else index or scope.freeVariable 'i' varPart = '' guardPart = '' body = Expressions.wrap([@body]) @@ -1049,14 +1052,14 @@ you can map and filter in a single pass.

sourcePart = source.compileVariables(o) forPart = source.compile merge o, index: ivar, step: @step else - svar = scope.freeVariable() + svar = scope.freeVariable 'ref' sourcePart = "#{svar} = #{ @source.compile(o) };" if @pattern - namePart = new AssignNode(@name, literal("#{svar}[#{ivar}]")).compile(merge o, {indent: @idt(1), top: true}) + '\n' + namePart = new AssignNode(@name, literal("#{svar}[#{ivar}]")).compile(merge o, {indent: @idt(1), top: true, keepLevel: yes}) + '\n' else namePart = "#{name} = #{svar}[#{ivar}]" if name unless @object - lvar = scope.freeVariable() + lvar = scope.freeVariable 'len' stepPart = if @step then "#{ivar} += #{ @step.compile(o) }" else "#{ivar}++" forPart = "#{ivar} = 0, #{lvar} = #{svar}.length; #{ivar} < #{lvar}; #{stepPart}" sourcePart = (if rvar then "#{rvar} = []; " else '') + sourcePart @@ -1078,10 +1081,10 @@ you can map and filter in a single pass.

guardPart = "\n#{@idt(1)}if (!#{utility('hasProp')}.call(#{svar}, #{ivar})) continue;" unless @raw body = body.compile(merge(o, {indent: @idt(1), top: true})) vars = if range then name else "#{name}, #{ivar}" - "#{sourcePart}for (#{forPart}) {#{guardPart}\n#{varPart}#{body}\n#{@tab}}#{returnResult}"
#

Welcome to the hairiest method in all of CoffeeScript. Handles the inner + "#{sourcePart}for (#{forPart}) {#{guardPart}\n#{varPart}#{body}\n#{@tab}}#{returnResult}"

#

Welcome to the hairiest method in all of CoffeeScript. Handles the inner loop, filtering, stepping, and result saving for array, object, and range comprehensions. Some of the generated code can be shared in common, and -some cannot.

#

SwitchNode

exports.SwitchNode = class SwitchNode extends BaseNode
+some cannot.

#

SwitchNode

exports.SwitchNode = class SwitchNode extends BaseNode
 
   class:     'SwitchNode'
   children: ['subject', 'cases', 'otherwise']
@@ -1099,7 +1102,7 @@ some cannot.

< this compileNode: (o) -> - idt = o.indent = @idt 1 + idt = o.indent = @idt 2 o.top = yes code = "#{ @tab }switch (#{ @subject.compile o }) {" for pair in @cases @@ -1107,13 +1110,13 @@ some cannot.

< exprs = block.expressions for condition in flatten [conditions] condition = new OpNode '!!', new ParentheticalNode condition if @tags.subjectless - code += "\n#{ @tab }case #{ condition.compile o }:" + code += "\n#{ @idt(1) }case #{ condition.compile o }:" code += "\n#{ block.compile o }" code += "\n#{ idt }break;" unless exprs[exprs.length - 1] instanceof ReturnNode if @otherwise - code += "\n#{ @tab }default:\n#{ @otherwise.compile o }" + code += "\n#{ @idt(1) }default:\n#{ @otherwise.compile o }" code += "\n#{ @tab }}" - code
#

A JavaScript switch statement. Converts into a returnable expression on-demand.

#

IfNode

exports.IfNode = class IfNode extends BaseNode
+    code
#

A JavaScript switch statement. Converts into a returnable expression on-demand.

#

IfNode

exports.IfNode = class IfNode extends BaseNode
 
   class:     'IfNode'
   children: ['condition', 'body', 'elseBody', 'assigner']
@@ -1135,7 +1138,7 @@ some cannot.

< forceStatement: -> @tags.statement = true - this
#

If/else statements. Acts as an expression by pushing down requested returns + this

#

If/else statements. Acts as an expression by pushing down requested returns to the last line of each clause.

Single-expression IfNodes are compiled into ternary operators if possible, @@ -1145,7 +1148,7 @@ because ternaries are already proper expressions, and don't need conversion.

else @isChain = elseBody instanceof IfNode @elseBody = @ensureExpressions elseBody - this
#

Rewrite a chain of IfNodes to add a default case as the final else.

  isStatement: (o) ->
+    this
#

Rewrite a chain of IfNodes to add a default case as the final else.

  isStatement: (o) ->
     @statement or= !!((o and o.top) or @tags.statement or @bodyNode().isStatement(o) or (@elseBody and @elseBodyNode().isStatement(o)))
 
   compileCondition: (o) ->
@@ -1165,7 +1168,7 @@ because ternaries are already proper expressions, and don't need conversion.

new ReturnNode this ensureExpressions: (node) -> - if node instanceof Expressions then node else new Expressions [node]
#

The IfNode only compiles into a statement if either of its bodies needs + if node instanceof Expressions then node else new Expressions [node]

#

The IfNode only compiles into a statement if either of its bodies needs to be a statement. Otherwise a ternary is safe.

  compileStatement: (o) ->
     top      = del o, 'top'
     child    = del o, 'chainChild'
@@ -1181,23 +1184,23 @@ to be a statement. Otherwise a ternary is safe.

#

Compile the IfNode as a regular if-else statement. Flattened chains + "#{ifPart}#{elsePart}"

#

Compile the IfNode as a regular if-else statement. Flattened chains force inner else bodies into statement form.

  compileTernary: (o) ->
     @bodyNode().tags.operation = @condition.tags.operation = yes
     @elseBodyNode().tags.operation = yes if @elseBody
     ifPart      = @condition.compile(o) + ' ? ' + @bodyNode().compile(o)
     elsePart    = if @elseBody then @elseBodyNode().compile(o) else 'null'
     code        = "#{ifPart} : #{elsePart}"
-    if @tags.operation then "(#{code})" else code
#

Compile the IfNode as a ternary operator.

#

Faux-Nodes

#

PushNode

PushNode = exports.PushNode =
+    if @tags.operation then "(#{code})" else code
#

Compile the IfNode as a ternary operator.

#

Faux-Nodes

#

PushNode

PushNode = exports.PushNode =
   wrap: (array, expressions) ->
     expr = expressions.unwrap()
     return expressions if expr.isPureStatement() or expr.containsPureStatement()
     Expressions.wrap([new CallNode(
       new ValueNode(literal(array), [new AccessorNode(literal('push'))]), [expr]
-    )])
#

Faux-nodes are never created by the grammar, but are used during code + )])

#

Faux-nodes are never created by the grammar, but are used during code generation to generate other combinations of nodes. The PushNode creates the tree for array.push(value), which is helpful for recording the result -arrays from comprehensions.

#

ClosureNode

ClosureNode = exports.ClosureNode =
#

A faux-node used to wrap an expressions body in a closure.

  wrap: (expressions, statement) ->
+arrays from comprehensions.

#

ClosureNode

ClosureNode = exports.ClosureNode =
#

A faux-node used to wrap an expressions body in a closure.

  wrap: (expressions, statement) ->
     return expressions if expressions.containsPureStatement()
     func = new ParentheticalNode(new CodeNode([], Expressions.wrap([expressions])))
     args = []
@@ -1212,9 +1215,9 @@ arrays from comprehensions.

args.push literal 'arguments' if mentionsArgs func = new ValueNode func, [new AccessorNode(meth)] call = new CallNode(func, args) - if statement then Expressions.wrap([call]) else call
#

Wrap the expressions body, unless it contains a pure statement, + if statement then Expressions.wrap([call]) else call

#

Wrap the expressions body, unless it contains a pure statement, in which case, no dice. If the body mentions this or arguments, -then make sure that the closure wrapper preserves the original values.

UTILITIES =
#

Utility Functions

  extends:  """
+then make sure that the closure wrapper preserves the original values.

UTILITIES =
#

Utility Functions

  extends:  """
             function(child, parent) {
                 var ctor = function(){};
                 ctor.prototype = parent.prototype;
@@ -1223,20 +1226,20 @@ then make sure that the closure wrapper preserves the original values.

if (typeof parent.extended === "function") parent.extended(child); child.__super__ = parent.prototype; } - """
#

Correctly set up a prototype chain for inheritance, including a reference + """

#

Correctly set up a prototype chain for inheritance, including a reference to the superclass for super() calls. See: goog.inherits.

  bind: """
         function(func, context) {
             return function(){ return func.apply(context, arguments); };
           }
-        """
#

Create a function bound to the current value of "this".

  hasProp: 'Object.prototype.hasOwnProperty'
-  slice:   'Array.prototype.slice'
#

Shortcuts to speed up the lookup time for native functions.

#

Constants

TAB = '  '
#

Tabs are two spaces for pretty printing.

TRAILING_WHITESPACE = /[ \t]+$/gm
#

Trim out all trailing whitespace, so that the generated code plays nice + """

#

Create a function bound to the current value of "this".

  hasProp: 'Object.prototype.hasOwnProperty'
+  slice:   'Array.prototype.slice'
#

Shortcuts to speed up the lookup time for native functions.

#

Constants

TAB = '  '
#

Tabs are two spaces for pretty printing.

TRAILING_WHITESPACE = /[ \t]+$/gm
#

Trim out all trailing whitespace, so that the generated code plays nice with Git.

IDENTIFIER = /^[a-zA-Z\$_](\w|\$)*$/
 NUMBER     = /^(((\b0(x|X)[0-9a-fA-F]+)|((\b[0-9]+(\.[0-9]+)?|\.[0-9]+)(e[+\-]?[0-9]+)?)))\b$/i
-SIMPLENUM  = /^-?\d+$/
#

Keep these identifier regexes in sync with the Lexer.

IS_STRING = /^['"]/
#

Is a literal value a string?

#

Utility Functions

literal = (name) ->
-  new LiteralNode(name)
#

Handy helper for a generating LiteralNode.

utility = (name) ->
+SIMPLENUM  = /^-?\d+$/
#

Keep these identifier regexes in sync with the Lexer.

IS_STRING = /^['"]/
#

Is a literal value a string?

#

Utility Functions

literal = (name) ->
+  new LiteralNode(name)
#

Handy helper for a generating LiteralNode.

utility = (name) ->
   ref = "__#{name}"
   Scope.root.assign ref, UTILITIES[name]
   ref
 
-
#

Helper for ensuring that utility functions are assigned at the top level.

undefined
\ No newline at end of file +
#

Helper for ensuring that utility functions are assigned at the top level.

undefined
\ No newline at end of file diff --git a/documentation/docs/optparse.html b/documentation/docs/optparse.html index b4c5a52a..8b59e3ce 100644 --- a/documentation/docs/optparse.html +++ b/documentation/docs/optparse.html @@ -39,7 +39,7 @@ of the valid options, for --help and such.

lines.unshift "#{@banner}\n" if @banner for rule in @rules spaces = 15 - rule.longFlag.length - spaces = if spaces > 0 then (' ' for i in [0..spaces]).join('') else '' + spaces = if spaces > 0 then Array(spaces + 1).join(' ') else '' letPart = if rule.shortFlag then rule.shortFlag + ', ' else ' ' lines.push ' ' + letPart + rule.longFlag + spaces + rule.description "\n#{ lines.join('\n') }\n"
#

Helpers

#

Regex matchers for option flags.

LONG_FLAG  = /^(--\w[\w\-]+)/
diff --git a/documentation/docs/repl.html b/documentation/docs/repl.html
index 514fb601..3b641308 100644
--- a/documentation/docs/repl.html
+++ b/documentation/docs/repl.html
@@ -9,7 +9,7 @@ Using it looks like this:

Attempt to evaluate the command. If there's an exception, print it out instead of exiting.

run = (buffer) ->
   try
-    val = CoffeeScript.run buffer.toString(), noWrap: true, globals: true, fileName: 'repl'
+    val = CoffeeScript.eval buffer.toString(), noWrap: true, globals: true, fileName: 'repl'
     puts inspect val if val isnt undefined
   catch err
     puts err.stack or err.toString()
diff --git a/documentation/docs/rewriter.html b/documentation/docs/rewriter.html
index ee75263f..40a93949 100644
--- a/documentation/docs/rewriter.html
+++ b/documentation/docs/rewriter.html
@@ -3,13 +3,9 @@ and shorthand syntax. This can greatly complicate a grammar and bloat
 the resulting parse table. Instead of making the parser handle it all, we take
 a series of passes over the token stream, using this Rewriter to convert
 shorthand into the unambiguous long form, add implicit indentation and
-parentheses, balance incorrect nestings, and generally clean things up.

#

Set up exported variables for both Node.js and the browser.

if process?
-  {helpers} = require('./helpers')
-else
-  this.exports = this
-  helpers      = this.helpers
#

Import the helpers we need.

{include} = helpers
#

The Rewriter class is used by the Lexer, directly against -its internal array of tokens.

exports.Rewriter = class Rewriter
#

Helpful snippet for debugging: - puts (t[0] + '/' + t[1] for t in @tokens).join ' '

#

Rewrite the token stream in multiple passes, one logical filter at +parentheses, balance incorrect nestings, and generally clean things up.

#

Import the helpers we need.

{include} = require('./helpers').helpers
#

The Rewriter class is used by the Lexer, directly against +its internal array of tokens.

exports.Rewriter = class Rewriter
#

Helpful snippet for debugging: + puts (t[0] + '/' + t[1] for t in @tokens).join ' '

#

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 to work with like this. The order of these passes matters -- indentation must be @@ -26,7 +22,7 @@ corrected before implicit parentheses can be wrapped around blocks of code.

@addImplicitParentheses() @ensureBalance BALANCED_PAIRS @rewriteClosingParens() - @tokens
#

Rewrite the token stream, looking one token ahead and behind. + @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 tokens are inserted and removed, and the stream changes length under @@ -47,7 +43,7 @@ our feet.

levels += 1 if include EXPRESSION_START, token[0] levels -= 1 if include EXPRESSION_END, token[0] i += 1 - i - 1
#

Massage newlines and indentations so that comments don't have to be + i - 1

#

Massage newlines and indentations so that comments don't have to be correctly indented, or appear on a line of their own.

  adjustComments: ->
     @scanTokens (token, i) ->
       return 1 unless token[0] is 'HERECOMMENT'
@@ -66,14 +62,14 @@ correctly indented, or appear on a line of their own.

else @tokens.splice i, 0, ['TERMINATOR', "\n", prev[2]] return 2 - return 1
#

Leading newlines would introduce an ambiguity in the grammar, so we + return 1

#

Leading newlines would introduce an ambiguity in the grammar, so we dispatch them here.

  removeLeadingNewlines: ->
-    @tokens.shift() while @tokens[0] and @tokens[0][0] is 'TERMINATOR'
#

Some blocks occur in the middle of expressions -- when we're expecting + @tokens.shift() while @tokens[0] and @tokens[0][0] is 'TERMINATOR'

#

Some blocks occur in the middle of expressions -- when we're expecting this, remove their trailing newlines.

  removeMidExpressionNewlines: ->
     @scanTokens (token, i) ->
       return 1 unless include(EXPRESSION_CLOSE, @tag(i + 1)) and token[0] is 'TERMINATOR'
       @tokens.splice i, 1
-      return 0
#

The lexer has tagged the opening parenthesis of a method call. Match it with + return 0

#

The lexer has tagged the opening parenthesis of a method call. Match it with its paired close. We have the mis-nested outdent case included here for calls that close on the same line, just before their outdent.

  closeOpenCalls: ->
     @scanTokens (token, i) ->
@@ -84,14 +80,14 @@ calls that close on the same line, just before their outdent.

idx = if token[0] is 'OUTDENT' then i - 1 else i @tokens[idx][0] = 'CALL_END' @detectEnd i + 1, condition, action - return 1
#

The lexer has tagged the opening parenthesis of an indexing operation call. + return 1

#

The lexer has tagged the opening parenthesis of an indexing operation call. Match it with its paired close.

  closeOpenIndexes: ->
     @scanTokens (token, i) ->
       if token[0] is 'INDEX_START'
         condition = (token, i) -> token[0] in [']', 'INDEX_END']
         action    = (token, i) -> token[0] = 'INDEX_END'
         @detectEnd i + 1, condition, action
-      return 1
#

Object literals may be written with implicit braces, for simple cases. + return 1

#

Object literals may be written with implicit braces, for simple cases. Insert the missing braces here, so that the parser doesn't have to.

  addImplicitBraces: ->
     stack = []
     @scanTokens (token, i) ->
@@ -103,6 +99,7 @@ Insert the missing braces here, so that the parser doesn't have to.

if token[0] is ':' and (not last or last[0] isnt '{') stack.push '{' idx = if @tag(i - 2) is '@' then i - 2 else i - 1 + idx -= 2 if @tag(idx - 2) is 'HERECOMMENT' tok = ['{', '{', token[2]] tok.generated = yes @tokens.splice idx, 0, tok @@ -115,7 +112,7 @@ Insert the missing braces here, so that the parser doesn't have to.

@tokens.splice i, 0, ['}', '}', token[2]] @detectEnd i + 2, condition, action return 2 - return 1
#

Methods may be optionally called without parentheses, for simple cases. + 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.

  addImplicitParentheses: ->
     classLine    = no
@@ -135,8 +132,9 @@ deal with them.

condition = (token, i) -> return yes if not seenSingle and token.fromThen seenSingle = yes if token[0] in ['IF', 'ELSE', 'UNLESS', '->', '=>'] + post = @tokens[i + 1] (not token.generated and @tokens[i - 1][0] isnt ',' and include(IMPLICIT_END, token[0]) and - not (token[0] is 'INDENT' and (include(IMPLICIT_BLOCK, @tag(i - 1)) or @tag(i - 2) is 'CLASS' or @tag(i + 1) is '{'))) or + not (token[0] is 'INDENT' and (include(IMPLICIT_BLOCK, @tag(i - 1)) or @tag(i - 2) is 'CLASS' or (post and post.generated and post[0] is '{')))) or token[0] is 'PROPERTY_ACCESS' and @tag(i - 1) is 'OUTDENT' action = (token, i) -> idx = if token[0] is 'OUTDENT' then i + 1 else i @@ -144,7 +142,7 @@ deal with them.

@detectEnd i + idx, condition, action prev[0] = 'FUNC_EXIST' if prev[0] is '?' return 2 - return 1
#

Because our grammar is LALR(1), it can't handle some single-line + return 1

#

Because our grammar is LALR(1), it can't handle some single-line expressions that lack ending delimiters. The Rewriter adds the implicit blocks, so it doesn't need to. ')' can close a single-line block, but we need to make sure it's balanced.

  addImplicitIndentation: ->
@@ -172,7 +170,7 @@ but we need to make sure it's balanced.

@detectEnd i + 2, condition, action @tokens.splice i, 1 if token[0] is 'THEN' return 2 - return 1
#

Tag postfix conditionals as such, so that we can parse them with a + return 1

#

Tag postfix conditionals as such, so that we can parse them with a different precedence.

  tagPostfixConditionals: ->
     @scanTokens (token, i) ->
       if token[0] in ['IF', 'UNLESS']
@@ -183,7 +181,7 @@ different precedence.

original[0] = 'POST_' + original[0] if token[0] isnt 'INDENT' @detectEnd i + 1, condition, action return 1 - return 1
#

Ensure that all listed pairs of tokens are correctly balanced throughout + return 1

#

Ensure that all listed pairs of tokens are correctly balanced throughout the course of the token stream.

  ensureBalance: (pairs) ->
     levels   = {}
     openLine = {}
@@ -201,7 +199,7 @@ the course of the token stream.

if unclosed.length open = unclosed[0] line = openLine[open] + 1 - throw new Error "unclosed #{open} on line #{line}"
#

We'd like to support syntax like this:

+ throw new Error "unclosed #{open} on line #{line}"
#

We'd like to support syntax like this:

el.click((event) ->
   el.hide())
@@ -248,20 +246,20 @@ rewriting.
             @tokens.splice i, 0, val
           return 1
       else
-        return 1
#

Generate the indentation tokens, based on another token on the same line.

  indentation: (token) ->
-    [['INDENT', 2, token[2]], ['OUTDENT', 2, token[2]]]
#

Look up a tag by token index.

  tag: (i) ->
-    @tokens[i] and @tokens[i][0]
#

Constants

#

List of the token pairs that must be balanced.

BALANCED_PAIRS = [['(', ')'], ['[', ']'], ['{', '}'], ['INDENT', 'OUTDENT'],
-  ['PARAM_START', 'PARAM_END'], ['CALL_START', 'CALL_END'], ['INDEX_START', 'INDEX_END']]
#

The inverse mappings of BALANCED_PAIRS we're trying to fix up, so we can + return 1

#

Generate the indentation tokens, based on another token on the same line.

  indentation: (token) ->
+    [['INDENT', 2, token[2]], ['OUTDENT', 2, token[2]]]
#

Look up a tag by token index.

  tag: (i) ->
+    @tokens[i] and @tokens[i][0]
#

Constants

#

List of the token pairs that must be balanced.

BALANCED_PAIRS = [['(', ')'], ['[', ']'], ['{', '}'], ['INDENT', 'OUTDENT'],
+  ['PARAM_START', 'PARAM_END'], ['CALL_START', 'CALL_END'], ['INDEX_START', 'INDEX_END']]
#

The inverse mappings of BALANCED_PAIRS we're trying to fix up, so we can look things up from either end.

INVERSES = {}
 for pair in BALANCED_PAIRS
   INVERSES[pair[0]] = pair[1]
-  INVERSES[pair[1]] = pair[0]
#

The tokens that signal the start of a balanced pair.

EXPRESSION_START = pair[0] for pair in BALANCED_PAIRS
#

The tokens that signal the end of a balanced pair.

EXPRESSION_END   = 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_END
#

Tokens that, if followed by an IMPLICIT_CALL, indicate a function invocation.

IMPLICIT_FUNC    = ['IDENTIFIER', 'SUPER', ')', 'CALL_END', ']', 'INDEX_END', '@', 'THIS']
#

If preceded by an IMPLICIT_FUNC, indicates a function invocation.

IMPLICIT_CALL    = [
+  INVERSES[pair[1]] = pair[0]
#

The tokens that signal the start of a balanced pair.

EXPRESSION_START = pair[0] for pair in BALANCED_PAIRS
#

The tokens that signal the end of a balanced pair.

EXPRESSION_END   = 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_END
#

Tokens that, if followed by an IMPLICIT_CALL, indicate a function invocation.

IMPLICIT_FUNC    = ['IDENTIFIER', 'SUPER', ')', 'CALL_END', ']', 'INDEX_END', '@', 'THIS']
#

If preceded by an IMPLICIT_FUNC, indicates a function invocation.

IMPLICIT_CALL    = [
   'IDENTIFIER', 'NUMBER', 'STRING', 'JS', 'REGEX', 'NEW', 'PARAM_START', 'CLASS',
   'IF', 'UNLESS', 'TRY', 'SWITCH', 'THIS', 'NULL', 'UNARY'
   'TRUE', 'FALSE', 'YES', 'NO', 'ON', 'OFF',
   '@', '->', '=>', '[', '(', '{'
-]
#

Tokens indicating that the implicit call must enclose a block of expressions.

IMPLICIT_BLOCK   = ['->', '=>', '{', '[', ',']
#

Tokens that always mark the end of an implicit call for single-liners.

IMPLICIT_END     = ['POST_IF', 'POST_UNLESS', 'FOR', 'WHILE', 'UNTIL', 'LOOP', 'TERMINATOR', 'INDENT']
#

Single-line flavors of block expressions that have unclosed endings. +]

#

Tokens indicating that the implicit call must enclose a block of expressions.

IMPLICIT_BLOCK   = ['->', '=>', '{', '[', ',']
#

Tokens that always mark the end of an implicit call for single-liners.

IMPLICIT_END     = ['POST_IF', 'POST_UNLESS', 'FOR', 'WHILE', 'UNTIL', 'LOOP', 'TERMINATOR', 'INDENT']
#

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   = ['TERMINATOR', 'CATCH', 'FINALLY', 'ELSE', 'OUTDENT', 'LEADING_WHEN']
#

Tokens that end a line.

LINEBREAKS       = ['TERMINATOR', 'INDENT', 'OUTDENT']
+SINGLE_CLOSERS   = ['TERMINATOR', 'CATCH', 'FINALLY', 'ELSE', 'OUTDENT', 'LEADING_WHEN']
#

Tokens that end a line.

LINEBREAKS       = ['TERMINATOR', 'INDENT', 'OUTDENT']
 
 
\ No newline at end of file diff --git a/documentation/docs/scope.html b/documentation/docs/scope.html index 97c05177..661d5b34 100644 --- a/documentation/docs/scope.html +++ b/documentation/docs/scope.html @@ -3,7 +3,7 @@ generate code, you create a tree of scopes in the same shape as the nested function bodies. Each scope knows about the variables declared within it, and has a reference to its parent enclosing scope. In this way, we know which variables are new and need to be declared with var, and which are shared -with the outside.

#

Set up exported variables for both Node.js and the browser.

this.exports = this unless process?
+with the outside.

#

Import the helpers we plan to use.

{extend} = require('./helpers').helpers
 
 exports.Scope = class Scope
#

The top-level Scope object.

  @root: null
#

Initialize a scope with its parent, for lookups up the chain, as well as a reference to the Expressions node is belongs to, which is @@ -12,39 +12,46 @@ it wraps.

[@parent, @expressions, @method] = [parent, expressions, method] @variables = {} if @parent - @tempVar = @parent.tempVar + @garbage = @parent.garbage else - Scope.root = this - @tempVar = '_a'
#

Look up a variable name in lexical scope, and declare it if it does not + @garbage = [] + Scope.root = this

#

Create a new garbage level

  startLevel: ->
+    @garbage.push []
#

Return to the previous garbage level and erase referenced temporary +variables in current level from scope.

  endLevel: ->
+    (@variables[name] = 'reuse') for name in @garbage.pop() when @variables[name] is 'var'
#

Look up a variable name in lexical scope, and declare it if it does not already exist.

  find: (name, options) ->
     return true if @check name, options
     @variables[name] = 'var'
-    false
#

Test variables and return true the first time fn(v, k) returns true

  any: (fn) ->
+    false
#

Test variables and return true the first time fn(v, k) returns true

  any: (fn) ->
     for v, k of @variables when fn(v, k)
       return true
-    return false
#

Reserve a variable name as originating from a function parameter for this + return false

#

Reserve a variable name as originating from a function parameter for this scope. No var required for internal references.

  parameter: (name) ->
-    @variables[name] = 'param'
#

Just check to see if a variable has already been declared, without reserving, + @variables[name] = 'param'

#

Just check to see if a variable has already been declared, without reserving, walks up to the root scope.

  check: (name, options) ->
     immediate = Object::hasOwnProperty.call @variables, name
     return immediate if immediate or (options and options.immediate)
-    !!(@parent and @parent.check(name))
#

If we need to store an intermediate result, find an available name for a -compiler-generated variable. _a, _b, and so on...

  freeVariable: ->
-    while @check @tempVar
-      ordinal = 1 + parseInt @tempVar.substr(1), 36
-      @tempVar = '_' + ordinal.toString(36).replace(/\d/g, 'a')
-    @variables[@tempVar] = 'var'
-    @tempVar
#

Ensure that an assignment is made at the top of this scope + !!(@parent and @parent.check(name))

#

Generate a temporary variable name at the given index.

  temporary: (type, index) ->
+    if type.length > 1
+      '_' + type + if index > 1 then index else ''
+    else
+      '_' + (index + parseInt type, 36).toString(36).replace /\d/g, 'a'
#

If we need to store an intermediate result, find an available name for a +compiler-generated variable. _var, _var2, and so on...

  freeVariable: (type) ->
+    index = 0
+    index++ while @check(temp = @temporary type, index) and @variables[temp] isnt 'reuse'
+    @variables[temp] = 'var'
+    @garbage[@garbage.length - 1].push temp if @garbage.length
+    temp
#

Ensure that an assignment is made at the top of this scope (or at the top-level scope, if requested).

  assign: (name, value) ->
-    @variables[name] = value: value, assigned: true
#

Does this scope reference any variables that need to be declared in the + @variables[name] = value: value, assigned: true

#

Does this scope reference any variables that need to be declared in the given function body?

  hasDeclarations: (body) ->
-    body is @expressions and @any (k, val) -> val is 'var'
#

Does this scope reference any assignments that need to be declared at the + body is @expressions and @any (k, val) -> val is 'var' or val is 'reuse'

#

Does this scope reference any assignments that need to be declared at the top of the given function body?

  hasAssignments: (body) ->
-    body is @expressions and @any (k, val) -> val.assigned
#

Return the list of variables first declared in this scope.

  declaredVariables: ->
-    (key for key, val of @variables when val is 'var').sort()
#

Return the list of assignments that are supposed to be made at the top + body is @expressions and @any (k, val) -> val.assigned

#

Return the list of variables first declared in this scope.

  declaredVariables: ->
+    (key for key, val of @variables when val is 'var' or val is 'reuse').sort()
#

Return the list of assignments that are supposed to be made at the top of this scope.

  assignedVariables: ->
-    "#{key} = #{val.value}" for key, val of @variables when val.assigned
#

Compile the JavaScript for all of the variable declarations in this scope.

  compiledDeclarations: ->
-    @declaredVariables().join ', '
#

Compile the JavaScript for all of the variable assignments in this scope.

  compiledAssignments: ->
+    "#{key} = #{val.value}" for key, val of @variables when val.assigned
#

Compile the JavaScript for all of the variable declarations in this scope.

  compiledDeclarations: ->
+    @declaredVariables().join ', '
#

Compile the JavaScript forall of the variable assignments in this scope.

  compiledAssignments: ->
     @assignedVariables().join ', '
 
 
\ No newline at end of file diff --git a/documentation/index.html.erb b/documentation/index.html.erb index 01f30f7d..67d45de6 100644 --- a/documentation/index.html.erb +++ b/documentation/index.html.erb @@ -124,7 +124,7 @@

Latest Version: - 0.9.3 + 0.9.4

@@ -169,7 +169,7 @@ Then clone the CoffeeScript source repository from GitHub, or download the latest - release: 0.9.3. + release: 0.9.4. To install the CoffeeScript compiler system-wide under /usr/local, open the directory and run:

@@ -925,6 +925,11 @@ coffee --print app/scripts/*.coffee > concatenation.js — a CoffeeScript compiler plug-in that allows you to include external source files. +
  • + mauricemach's CoffeeKup + — Markup as CoffeeScript. After _why's + Markaby. +
  • jashkenas's Docco — a quick-and-dirty literate-programming-style documentation generator @@ -952,6 +957,15 @@ coffee --print app/scripts/*.coffee > concatenation.js Change Log
  • +

    + 0.9.4 + CoffeeScript now uses appropriately-named temporary variables, and recycles + their references after use. Added require.extensions support for + Node.js 0.3. Loading CoffeeScript in the browser now adds just a + single CoffeeScript object to global scope. + Fixes for implicit object and block comment edge cases. +

    +

    0.9.3 CoffeeScript switch statements now compile into JS switch diff --git a/documentation/js/array_comprehensions.js b/documentation/js/array_comprehensions.js index 29b68327..f9cf4d20 100644 --- a/documentation/js/array_comprehensions.js +++ b/documentation/js/array_comprehensions.js @@ -1,18 +1,18 @@ -var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, food, lunch, roid, roid2; +var _i, _j, _len, _len2, _ref, _ref2, _result, food, lunch, roid, roid2; lunch = (function() { - _a = []; _c = ['toast', 'cheese', 'wine']; - for (_b = 0, _d = _c.length; _b < _d; _b++) { - food = _c[_b]; - _a.push(eat(food)); + _result = []; _ref = ['toast', 'cheese', 'wine']; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + food = _ref[_i]; + _result.push(eat(food)); } - return _a; + return _result; })(); -_f = asteroids; -for (_e = 0, _g = _f.length; _e < _g; _e++) { - roid = _f[_e]; - _i = asteroids; - for (_h = 0, _j = _i.length; _h < _j; _h++) { - roid2 = _i[_h]; +_ref = asteroids; +for (_i = 0, _len = _ref.length; _i < _len; _i++) { + roid = _ref[_i]; + _ref2 = asteroids; + for (_j = 0, _len2 = _ref2.length; _j < _len2; _j++) { + roid2 = _ref2[_j]; if (roid !== roid2) { if (roid.overlaps(roid2)) { roid.explode(); diff --git a/documentation/js/block_comment.js b/documentation/js/block_comment.js index 8fd59001..ae602e60 100644 --- a/documentation/js/block_comment.js +++ b/documentation/js/block_comment.js @@ -1,3 +1,4 @@ -/*CoffeeScript Compiler v0.9.3 +/* +CoffeeScript Compiler v0.9.4 Released under the MIT License */ \ No newline at end of file diff --git a/documentation/js/classes.js b/documentation/js/classes.js index 380b74f3..18d14f5d 100644 --- a/documentation/js/classes.js +++ b/documentation/js/classes.js @@ -7,8 +7,8 @@ var __extends = function(child, parent) { if (typeof parent.extended === "function") parent.extended(child); child.__super__ = parent.prototype; }; -Animal = function(_a) { - this.name = _a; +Animal = function(_arg) { + this.name = _arg; return this; }; Animal.prototype.move = function(meters) { diff --git a/documentation/js/expressions_comprehension.js b/documentation/js/expressions_comprehension.js index 39d2e660..fa850ce4 100644 --- a/documentation/js/expressions_comprehension.js +++ b/documentation/js/expressions_comprehension.js @@ -1,11 +1,11 @@ -var _a, _b, _c, globals, name; +var _i, _ref, _result, globals, name; var __hasProp = Object.prototype.hasOwnProperty; globals = (function() { - _b = []; _c = window; - for (name in _c) { - if (!__hasProp.call(_c, name)) continue; - _a = _c[name]; - _b.push(name); + _result = []; _ref = window; + for (name in _ref) { + if (!__hasProp.call(_ref, name)) continue; + _i = _ref[name]; + _result.push(name); } - return _b; + return _result; })().slice(0, 10); \ No newline at end of file diff --git a/documentation/js/multiple_return_values.js b/documentation/js/multiple_return_values.js index f46b21dc..9a9f8d80 100644 --- a/documentation/js/multiple_return_values.js +++ b/documentation/js/multiple_return_values.js @@ -1,8 +1,8 @@ -var _a, city, forecast, temp, weatherReport; +var _ref, city, forecast, temp, weatherReport; weatherReport = function(location) { return [location, 72, "Mostly Sunny"]; }; -_a = weatherReport("Berkeley, CA"); -city = _a[0]; -temp = _a[1]; -forecast = _a[2]; \ No newline at end of file +_ref = weatherReport("Berkeley, CA"); +city = _ref[0]; +temp = _ref[1]; +forecast = _ref[2]; \ No newline at end of file diff --git a/documentation/js/object_comprehensions.js b/documentation/js/object_comprehensions.js index b5505f3e..bc05d294 100644 --- a/documentation/js/object_comprehensions.js +++ b/documentation/js/object_comprehensions.js @@ -1,4 +1,4 @@ -var _a, _b, age, ages, child, yearsOld; +var _ref, _result, age, ages, child, yearsOld; var __hasProp = Object.prototype.hasOwnProperty; yearsOld = { max: 10, @@ -6,11 +6,11 @@ yearsOld = { tim: 11 }; ages = (function() { - _a = []; _b = yearsOld; - for (child in _b) { - if (!__hasProp.call(_b, child)) continue; - age = _b[child]; - _a.push(child + " is " + age); + _result = []; _ref = yearsOld; + for (child in _ref) { + if (!__hasProp.call(_ref, child)) continue; + age = _ref[child]; + _result.push(child + " is " + age); } - return _a; + return _result; })(); \ No newline at end of file diff --git a/documentation/js/object_extraction.js b/documentation/js/object_extraction.js index b935daa4..f50374ce 100644 --- a/documentation/js/object_extraction.js +++ b/documentation/js/object_extraction.js @@ -1,4 +1,4 @@ -var _a, _b, _c, city, futurists, name, street; +var _ref, _ref2, _ref3, city, futurists, name, street; futurists = { sculptor: "Umberto Boccioni", painter: "Vladimir Burliuk", @@ -7,9 +7,9 @@ futurists = { address: ["Via Roma 42R", "Bellagio, Italy 22021"] } }; -_a = futurists; -_b = _a.poet; -name = _b.name; -_c = _b.address; -street = _c[0]; -city = _c[1]; \ No newline at end of file +_ref = futurists; +_ref2 = _ref.poet; +name = _ref2.name; +_ref3 = _ref2.address; +street = _ref3[0]; +city = _ref3[1]; \ No newline at end of file diff --git a/documentation/js/overview.js b/documentation/js/overview.js index cfb3aba7..4ae3d185 100644 --- a/documentation/js/overview.js +++ b/documentation/js/overview.js @@ -1,4 +1,4 @@ -var _a, _b, _c, _d, cubes, list, math, num, number, opposite, race, square; +var _i, _len, _ref, _result, cubes, list, math, num, number, opposite, race, square; var __slice = Array.prototype.slice; number = 42; opposite = true; @@ -25,10 +25,10 @@ if (typeof elvis !== "undefined" && elvis !== null) { alert("I knew it!"); } cubes = (function() { - _a = []; _c = list; - for (_b = 0, _d = _c.length; _b < _d; _b++) { - num = _c[_b]; - _a.push(math.cube(num)); + _result = []; _ref = list; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + num = _ref[_i]; + _result.push(math.cube(num)); } - return _a; + return _result; })(); \ No newline at end of file diff --git a/documentation/js/parallel_assignment.js b/documentation/js/parallel_assignment.js index f1f7b923..e6ddcce0 100644 --- a/documentation/js/parallel_assignment.js +++ b/documentation/js/parallel_assignment.js @@ -1,6 +1,6 @@ -var _a, theBait, theSwitch; +var _ref, theBait, theSwitch; theBait = 1000; theSwitch = 0; -_a = [theSwitch, theBait]; -theBait = _a[0]; -theSwitch = _a[1]; \ No newline at end of file +_ref = [theSwitch, theBait]; +theBait = _ref[0]; +theSwitch = _ref[1]; \ No newline at end of file diff --git a/documentation/js/patterns_and_splats.js b/documentation/js/patterns_and_splats.js index dfe1081f..562040b9 100644 --- a/documentation/js/patterns_and_splats.js +++ b/documentation/js/patterns_and_splats.js @@ -1,7 +1,7 @@ -var _a, close, contents, open, tag; +var _ref, close, contents, open, tag; var __slice = Array.prototype.slice; tag = ""; -_a = tag.split(""); -open = _a[0]; -contents = __slice.call(_a, 1, _a.length - 1); -close = _a[_a.length - 1]; \ No newline at end of file +_ref = tag.split(""); +open = _ref[0]; +contents = __slice.call(_ref, 1, _ref.length - 1); +close = _ref[_ref.length - 1]; \ No newline at end of file diff --git a/documentation/js/range_comprehensions.js b/documentation/js/range_comprehensions.js index fa3f1f1d..220d6896 100644 --- a/documentation/js/range_comprehensions.js +++ b/documentation/js/range_comprehensions.js @@ -1,19 +1,19 @@ -var _a, countdown, deliverEggs, num; +var _result, countdown, deliverEggs, num; countdown = (function() { - _a = []; + _result = []; for (num = 10; num >= 1; num--) { - _a.push(num); + _result.push(num); } - return _a; + return _result; })(); deliverEggs = function() { - var _b, _c, dozen, i; - _b = []; _c = eggs.length; - for (i = 0; (0 <= _c ? i < _c : i > _c); i += 12) { - _b.push((function() { + var _ref, _result2, dozen, i; + _result2 = []; _ref = eggs.length; + for (i = 0; (0 <= _ref ? i < _ref : i > _ref); i += 12) { + _result2.push((function() { dozen = eggs.slice(i, i + 12); return deliver(new eggCarton(dozen)); })()); } - return _b; + return _result2; }; \ No newline at end of file diff --git a/documentation/js/soaks.js b/documentation/js/soaks.js index f8c2a789..fa814b50 100644 --- a/documentation/js/soaks.js +++ b/documentation/js/soaks.js @@ -1,2 +1,2 @@ -var _a, _b; -(typeof (_b = ((_a = lottery.drawWinner()))) === "undefined" || _b === null) ? undefined : _b.address == null ? undefined : _b.address.zipcode; \ No newline at end of file +var _ref, _ref2; +(typeof (_ref2 = ((_ref = lottery.drawWinner()))) === "undefined" || _ref2 === null) ? undefined : _ref2.address == null ? undefined : _ref2.address.zipcode; \ No newline at end of file diff --git a/documentation/js/switch.js b/documentation/js/switch.js index 05b4675c..2449cb9e 100644 --- a/documentation/js/switch.js +++ b/documentation/js/switch.js @@ -1,23 +1,23 @@ switch (day) { -case "Mon": - go(work); - break; -case "Tue": - go(relax); - break; -case "Thu": - go(iceFishing); - break; -case "Fri": -case "Sat": - if (day === bingoDay) { - go(bingo); - go(dancing); - } - break; -case "Sun": - go(church); - break; -default: - go(work); + case "Mon": + go(work); + break; + case "Tue": + go(relax); + break; + case "Thu": + go(iceFishing); + break; + case "Fri": + case "Sat": + if (day === bingoDay) { + go(bingo); + go(dancing); + } + break; + case "Sun": + go(church); + break; + default: + go(work); } \ No newline at end of file diff --git a/documentation/js/while.js b/documentation/js/while.js index e2b31702..b88294fa 100644 --- a/documentation/js/while.js +++ b/documentation/js/while.js @@ -1,4 +1,4 @@ -var _a, lyrics, num; +var _result, lyrics, num; if (this.studyingEconomics) { while (supply > demand) { buy(); @@ -9,10 +9,10 @@ if (this.studyingEconomics) { } num = 6; lyrics = (function() { - _a = []; + _result = []; while (num -= 1) { - _a.push(num + " little monkeys, jumping on the bed.\ + _result.push(num + " little monkeys, jumping on the bed.\ One fell out and bumped his head."); } - return _a; + return _result; })(); \ No newline at end of file diff --git a/extras/coffee-script.js b/extras/coffee-script.js index 13d21f47..5b97760a 100644 --- a/extras/coffee-script.js +++ b/extras/coffee-script.js @@ -1,5 +1,5 @@ /** - * CoffeeScript Compiler v0.9.3 + * CoffeeScript Compiler v0.9.4 * http://coffeescript.org * * Copyright 2010, Jeremy Ashkenas @@ -12,11 +12,11 @@ this.addImplicitBraces();this.addImplicitParentheses();this.ensureBalance(x);thi m){var v,u,I,M,y;if(t[0]!=="HERECOMMENT")return 1;v=[this.tokens[m-2],this.tokens[m-1],this.tokens[m+1],this.tokens[m+2]];I=v[0];y=v[1];M=v[2];if((u=v[3])&&u[0]==="INDENT"){this.tokens.splice(m+2,1);I&&I[0]==="OUTDENT"&&M&&y[0]===M[0]&&M[0]==="TERMINATOR"?this.tokens.splice(m-2,1):this.tokens.splice(m,0,u)}else if(y&&!("TERMINATOR"===(v=y[0])||"INDENT"===v||"OUTDENT"===v)){if(M&&M[0]==="TERMINATOR"&&u&&u[0]==="OUTDENT"){this.tokens.splice.apply(this.tokens,[m+2,0].concat(this.tokens.splice(m,2))); this.tokens[m+2][0]!=="TERMINATOR"&&this.tokens.splice(m+2,0,["TERMINATOR","\n",y[2]])}else this.tokens.splice(m,0,["TERMINATOR","\n",y[2]]);return 2}return 1})};C.prototype.removeLeadingNewlines=function(){var t;for(t=[];this.tokens[0]&&this.tokens[0][0]==="TERMINATOR";)t.push(this.tokens.shift());return t};C.prototype.removeMidExpressionNewlines=function(){return this.scanTokens(function(t,m){if(!(D(c,this.tag(m+1))&&t[0]==="TERMINATOR"))return 1;this.tokens.splice(m,1);return 0})};C.prototype.closeOpenCalls= function(){return this.scanTokens(function(t,m){if(t[0]==="CALL_START")this.detectEnd(m+1,function(v,u){var I;return")"===(I=v[0])||"CALL_END"===I||v[0]==="OUTDENT"&&this.tokens[u-1][0]===")"},function(v,u){return this.tokens[v[0]==="OUTDENT"?u-1:u][0]="CALL_END"});return 1})};C.prototype.closeOpenIndexes=function(){return this.scanTokens(function(t,m){if(t[0]==="INDEX_START")this.detectEnd(m+1,function(v){var u;return"]"===(u=v[0])||"INDEX_END"===u},function(v){return v[0]="INDEX_END"});return 1})}; -C.prototype.addImplicitBraces=function(){var t;t=[];return this.scanTokens(function(m,v){var u,I;if(D(h,m[0]))t.push(m[0]==="INDENT"&&this.tag(v-1)==="{"?"{":m[0]);D(j,m[0])&&t.pop();u=t[t.length-1];if(m[0]===":"&&(!u||u[0]!=="{")){t.push("{");u=this.tag(v-2)==="@"?v-2:v-1;I=["{","{",m[2]];I.generated=true;this.tokens.splice(u,0,I);this.detectEnd(v+2,function(M,y){var Q,U,S,F;Q=this.tokens.slice(y+1,y+4);U=Q[0];F=Q[1];S=Q[2];if(this.tag(y+1)==="HERECOMMENT"||this.tag(y-1)==="HERECOMMENT")return false; -return("TERMINATOR"===(Q=M[0])||"OUTDENT"===Q)&&!(F&&F[0]===":"||U&&U[0]==="@"&&S&&S[0]===":")||M[0]===","&&U&&!("IDENTIFIER"===(Q=U[0])||"STRING"===Q||"@"===Q||"TERMINATOR"===Q||"OUTDENT"===Q)},function(M,y){return this.tokens.splice(y,0,["}","}",M[2]])});return 2}return 1})};C.prototype.addImplicitParentheses=function(){var t;t=false;return this.scanTokens(function(m,v){var u,I,M,y,Q;if(m[0]==="CLASS")t=true;y=this.tokens[v-1];I=this.tokens[v+1];M=1;if(I=!t&&m[0]==="INDENT"&&I&&I.generated&&I[0]=== -"{"&&y&&D(A,y[0]))M=2;Q=false;if(D(P,m[0]))t=false;if(y&&!y.spaced&&m[0]==="?")m.call=true;if(y&&y.spaced&&(D(A,y[0])||y.call)&&D(r,m[0])&&!(m[0]==="UNARY"&&("IN"===(u=this.tag(v+1))||"OF"===u||"INSTANCEOF"===u))||I){this.tokens.splice(v,0,["CALL_START","(",m[2]]);this.detectEnd(v+M,function(U,S){var F;if(!Q&&U.fromThen)return true;if("IF"===(F=U[0])||"ELSE"===F||"UNLESS"===F||"->"===F||"=>"===F)Q=true;F=this.tokens[S+1];return!U.generated&&this.tokens[S-1][0]!==","&&D(d,U[0])&&!(U[0]==="INDENT"&& -(D(e,this.tag(S-1))||this.tag(S-2)==="CLASS"||F&&F.generated&&F[0]==="{"))||U[0]==="PROPERTY_ACCESS"&&this.tag(S-1)==="OUTDENT"},function(U,S){M=U[0]==="OUTDENT"?S+1:S;return this.tokens.splice(M,0,["CALL_END",")",U[2]])});if(y[0]==="?")y[0]="FUNC_EXIST";return 2}return 1})};C.prototype.addImplicitIndentation=function(){return this.scanTokens(function(t,m){var v,u,I,M;if(t[0]==="ELSE"&&this.tag(m-1)!=="OUTDENT"){this.tokens.splice.apply(this.tokens,[m,0].concat(this.indentation(t)));return 2}if(t[0]=== -"CATCH"&&(this.tag(m+2)==="TERMINATOR"||this.tag(m+2)==="FINALLY")){this.tokens.splice.apply(this.tokens,[m+2,0].concat(this.indentation(t)));return 4}if(D($,t[0])&&this.tag(m+1)!=="INDENT"&&!(t[0]==="ELSE"&&this.tag(m+1)==="IF")){M=t[0];v=this.indentation(t);u=v[0];I=v[1];if(M==="THEN")u.fromThen=true;u.generated=I.generated=true;this.tokens.splice(m+1,0,u);this.detectEnd(m+2,function(y){return D(ca,y[0])&&y[1]!==";"&&!(y[0]==="ELSE"&&!("IF"===M||"THEN"===M))},function(y,Q){return this.tokens.splice(this.tokens[Q- +C.prototype.addImplicitBraces=function(){var t;t=[];return this.scanTokens(function(m,v){var u,I;if(D(h,m[0]))t.push(m[0]==="INDENT"&&this.tag(v-1)==="{"?"{":m[0]);D(j,m[0])&&t.pop();u=t[t.length-1];if(m[0]===":"&&(!u||u[0]!=="{")){t.push("{");u=this.tag(v-2)==="@"?v-2:v-1;if(this.tag(u-2)==="HERECOMMENT")u-=2;I=["{","{",m[2]];I.generated=true;this.tokens.splice(u,0,I);this.detectEnd(v+2,function(M,y){var Q,U,S,F;Q=this.tokens.slice(y+1,y+4);U=Q[0];F=Q[1];S=Q[2];if(this.tag(y+1)==="HERECOMMENT"|| +this.tag(y-1)==="HERECOMMENT")return false;return("TERMINATOR"===(Q=M[0])||"OUTDENT"===Q)&&!(F&&F[0]===":"||U&&U[0]==="@"&&S&&S[0]===":")||M[0]===","&&U&&!("IDENTIFIER"===(Q=U[0])||"STRING"===Q||"@"===Q||"TERMINATOR"===Q||"OUTDENT"===Q)},function(M,y){return this.tokens.splice(y,0,["}","}",M[2]])});return 2}return 1})};C.prototype.addImplicitParentheses=function(){var t;t=false;return this.scanTokens(function(m,v){var u,I,M,y,Q;if(m[0]==="CLASS")t=true;y=this.tokens[v-1];I=this.tokens[v+1];M=1;if(I= +!t&&m[0]==="INDENT"&&I&&I.generated&&I[0]==="{"&&y&&D(A,y[0]))M=2;Q=false;if(D(P,m[0]))t=false;if(y&&!y.spaced&&m[0]==="?")m.call=true;if(y&&y.spaced&&(D(A,y[0])||y.call)&&D(r,m[0])&&!(m[0]==="UNARY"&&("IN"===(u=this.tag(v+1))||"OF"===u||"INSTANCEOF"===u))||I){this.tokens.splice(v,0,["CALL_START","(",m[2]]);this.detectEnd(v+M,function(U,S){var F;if(!Q&&U.fromThen)return true;if("IF"===(F=U[0])||"ELSE"===F||"UNLESS"===F||"->"===F||"=>"===F)Q=true;F=this.tokens[S+1];return!U.generated&&this.tokens[S- +1][0]!==","&&D(d,U[0])&&!(U[0]==="INDENT"&&(D(e,this.tag(S-1))||this.tag(S-2)==="CLASS"||F&&F.generated&&F[0]==="{"))||U[0]==="PROPERTY_ACCESS"&&this.tag(S-1)==="OUTDENT"},function(U,S){M=U[0]==="OUTDENT"?S+1:S;return this.tokens.splice(M,0,["CALL_END",")",U[2]])});if(y[0]==="?")y[0]="FUNC_EXIST";return 2}return 1})};C.prototype.addImplicitIndentation=function(){return this.scanTokens(function(t,m){var v,u,I,M;if(t[0]==="ELSE"&&this.tag(m-1)!=="OUTDENT"){this.tokens.splice.apply(this.tokens,[m,0].concat(this.indentation(t))); +return 2}if(t[0]==="CATCH"&&(this.tag(m+2)==="TERMINATOR"||this.tag(m+2)==="FINALLY")){this.tokens.splice.apply(this.tokens,[m+2,0].concat(this.indentation(t)));return 4}if(D($,t[0])&&this.tag(m+1)!=="INDENT"&&!(t[0]==="ELSE"&&this.tag(m+1)==="IF")){M=t[0];v=this.indentation(t);u=v[0];I=v[1];if(M==="THEN")u.fromThen=true;u.generated=I.generated=true;this.tokens.splice(m+1,0,u);this.detectEnd(m+2,function(y){return D(ca,y[0])&&y[1]!==";"&&!(y[0]==="ELSE"&&!("IF"===M||"THEN"===M))},function(y,Q){return this.tokens.splice(this.tokens[Q- 1][0]===","?Q-1:Q,0,I)});t[0]==="THEN"&&this.tokens.splice(m,1);return 2}return 1})};C.prototype.tagPostfixConditionals=function(){return this.scanTokens(function(t,m){var v;if("IF"===(v=t[0])||"UNLESS"===v){this.detectEnd(m+1,function(u){var I;return"TERMINATOR"===(I=u[0])||"INDENT"===I},function(u){if(u[0]!=="INDENT")return t[0]="POST_"+t[0]});return 1}return 1})};C.prototype.ensureBalance=function(t){var m,v,u,I,M;u={};I={};this.scanTokens(function(y){var Q,U,S,F;Q=0;for(U=t.length;Q0&&m.push(v)}if(m.length){v=m[0];m=I[v]+1;throw new Error("unclosed "+v+" on line "+m);}};C.prototype.rewriteClosingParens=function(){var t,m,v,u,I;u=[];m={};t=K;for(v in t)if(N.call(t,v)){I=t[v];m[v]=0}return this.scanTokens(function(M,y){var Q,U,S,F;F=M[0];Q=K[M[0]];if(D(h,F)){u.push(M); return 1}else if(D(j,F))if(m[Q]>0){m[Q]-=1;this.tokens.splice(y,1);return 0}else{Q=u.pop();U=Q[0];S=K[U];if(F===S)return 1;m[U]+=1;I=[S,U==="INDENT"?Q[1]:S];if((this.tokens[y+2]==null?undefined:this.tokens[y+2][0])===U){this.tokens.splice(y+3,0,I);u.push(Q)}else this.tokens.splice(y,0,I);return 1}else return 1})};C.prototype.indentation=function(t){return[["INDENT",2,t[2]],["OUTDENT",2,t[2]]]};C.prototype.tag=function(t){return this.tokens[t]&&this.tokens[t][0]};return C}();x=[["(",")"],["[","]"], @@ -26,142 +26,142 @@ la,na,ja,ha,oa,G,da,W,ga,Z=Array.prototype.slice;G=T("./rewriter");na=G.Rewriter return(new na).rewrite(this.tokens)};N.prototype.extractNextToken=function(){if(this.identifierToken())return null;if(this.commentToken())return null;if(this.whitespaceToken())return null;if(this.lineToken())return null;if(this.heredocToken())return null;if(this.stringToken())return null;if(this.numberToken())return null;if(this.regexToken())return null;if(this.jsToken())return null;return this.literalToken()};N.prototype.identifierToken=function(){var l,s,o,B;if(!(o=this.match(ca,1)))return false; this.i+=o.length;s=this.tagAccessor()||this.match(x,1);B="IDENTIFIER";if(W(aa,o)||!s&&W(e,o))B=o.toUpperCase();if(B==="WHEN"&&W(D,this.tag()))B="LEADING_WHEN";if(o==="all"&&this.tag()==="FOR")B="ALL";if(W(ha,B))B="UNARY";if(W(Y,o))if(s){B="STRING";o='"'+o+'"';if(s==="accessor"){l=true;this.tag()!=="@"&&this.tokens.pop();this.token("INDEX_START","[")}}else W(la,o)&&this.identifierError(o);if(!s){if(W(h,o))B=o=K[o];if(W(L,o))B="LOGIC";if(o==="!")B="UNARY"}this.token(B,o);l&&this.token("]","]");return true}; N.prototype.numberToken=function(){var l;if(!(l=this.match(y,1)))return false;if(this.tag()==="."&&ga(l,"."))return false;this.i+=l.length;this.token("NUMBER",l);return true};N.prototype.stringToken=function(){var l;if(!(ga(this.chunk,'"')||ga(this.chunk,"'")))return false;if(!(l=this.balancedToken(['"','"'],["#{","}"])||this.balancedToken(["'","'"])))return false;this.interpolateString(l.replace(/\n/g,"\\\n"));this.line+=da(l,"\n");this.i+=l.length;return true};N.prototype.heredocToken=function(){var l, -s,o;if(!(s=this.chunk.match(P)))return false;o=s[1].substr(0,1);l=this.sanitizeHeredoc(s[2]||s[4]||"",{quote:o});this.interpolateString(o+l+o,{heredoc:true});this.line+=da(s[1],"\n");this.i+=s[1].length;return true};N.prototype.commentToken=function(){var l;if(!(l=this.chunk.match(r)))return false;this.line+=da(l[1],"\n");this.i+=l[1].length;if(l[4]){this.token("HERECOMMENT",this.sanitizeHeredoc(l[4],{herecomment:true,indent:l[3]}));this.token("TERMINATOR","\n")}return true};N.prototype.jsToken=function(){var l; -if(!ga(this.chunk,"`"))return false;if(!(l=this.balancedToken(["`","`"])))return false;this.token("JS",l.replace($,""));this.i+=l.length;return true};N.prototype.regexToken=function(){var l,s,o;if(!(s=this.chunk.match(ia)))return false;if(s[1]===" "&&!("CALL_START"===(l=this.tag())||"="===l))return false;if(W(I,this.tag()))return false;if(!(l=this.balancedToken(["/","/"])))return false;if(!(s=this.chunk.substr(l.length).match(U)))return false;if(s[2])l+=o=s[2];if(l.match(F)){s=l.substring(1).split("/")[0]; -s=s.replace(S,function(B){return"\\"+B});this.tokens=this.tokens.concat([["(","("],["NEW","new"],["IDENTIFIER","RegExp"],["CALL_START","("]]);this.interpolateString('"'+s+'"',{escapeQuotes:true});o&&this.tokens.splice(this.tokens.length,0,[",",","],["STRING",'"'+o+'"']);this.tokens.splice(this.tokens.length,0,[")",")"],[")",")"])}else this.token("REGEX",l);this.i+=l.length;return true};N.prototype.balancedToken=function(){return this.balancedString(this.chunk,Z.call(arguments,0))};N.prototype.lineToken= -function(){var l,s,o;if(!(l=this.match(v,1)))return false;this.line+=da(l,"\n");this.i+=l.length;this.prev(2);o=l.match(X).reverse()[0].match(E)[1].length;s=this.match(u,1);s=s==="."||s===","||this.unfinished();if(o-this.indebt===this.indent){if(s)return this.suppressNewlines();return this.newlineToken(l)}else if(o>this.indent){if(s){this.indebt=o-this.indent;return this.suppressNewlines()}l=o-this.indent+this.outdebt;this.token("INDENT",l);this.indents.push(l);this.outdebt=this.indebt=0}else{this.indebt= -0;this.outdentToken(this.indent-o,s)}this.indent=o;return true};N.prototype.outdentToken=function(l,s){for(var o,B;l>0;){B=this.indents.length-1;if(this.indents[B]===undefined)l=0;else if(this.indents[B]===this.outdebt){l-=this.outdebt;this.outdebt=0}else if(this.indents[B]1)&&this.token("(","(");B=f;V=0;for(o=B.length;Vthis.indent){if(s){this.indebt=o-this.indent;return this.suppressNewlines()}l=o-this.indent+this.outdebt;this.token("INDENT",l);this.indents.push(l); +this.outdebt=this.indebt=0}else{this.indebt=0;this.outdentToken(this.indent-o,s)}this.indent=o;return true};N.prototype.outdentToken=function(l,s){for(var o,B;l>0;){B=this.indents.length-1;if(this.indents[B]===undefined)l=0;else if(this.indents[B]===this.outdebt){l-=this.outdebt;this.outdebt=0}else if(this.indents[B]1)&&this.token("(","(");B=f;V=0;for(o=B.length;V]?|\+[+=]?|[*&|\/%=<>^:!?]+)([ \t]*)/;oa=/^([ \t]+)/;r=/^(([ \t]*\n)*([ \t]*)###([^#][\s\S]*?)(###[ \t]*\n|(###)?$)|(\s*#(?!##[^#])[^\n]*)+)/;j=/^((-|=)>)/;v=/^((\n([ \t]*))+)(\.)?/;X=/\n([ \t]*)/g;E=/\n([ \t]*)/;ia=/^\/([^\/])/;F=/([^\\]#\{.*[^\\]\})/;U=/^(([imgy]{1,4})\b|\W|$)/;S=/\\[^\$]/g;$=/(^`|`$)/g;m=/\n/g;M=/^([+\*&|\/\-%=<>!.\\][<>=&|]*|and|or|is|isnt|not|delete|typeof|instanceof)$/;C=/(\n+([ \t]*)|^([ \t]+))/g;x=/^\s*(([a-zA-Z\$_@]\w*|["'][^\r\n]+?["']|\d+)[ \t]*?[:=][^:=])/; -u=/^\s*(\S)/;A=["-=","+=","/=","*=","%=","||=","&&=","?=","<<=",">>=",">>>=","&=","^=","|="];ha=["UMINUS","UPLUS","!","!!","~","TYPEOF","DELETE"];L=["&","|","^","&&","||"];ja=["<<",">>",">>>"];d=["<=","<",">",">="];t=["*","/","%"];I=["NUMBER","REGEX","++","--","FALSE","NULL","TRUE","]"];c=["IDENTIFIER","SUPER",")","]","}","STRING","@","THIS","?","::"];D=["INDENT","OUTDENT","TERMINATOR"];K={and:"&&",or:"||",is:"==",isnt:"!=",not:"!","===":"=="}}).call(this)});T["./parser"]=new (function(){var z=this, -x=function(){return{trace:function(){},yy:{},symbols_:{error:2,Root:3,TERMINATOR:4,Body:5,Block:6,Line:7,Expression:8,Statement:9,Return:10,Throw:11,BREAK:12,CONTINUE:13,DEBUGGER:14,Value:15,Call:16,Code:17,Operation:18,Assign:19,If:20,Try:21,While:22,For:23,Switch:24,Extends:25,Class:26,Existence:27,Comment:28,INDENT:29,OUTDENT:30,Identifier:31,IDENTIFIER:32,AlphaNumeric:33,NUMBER:34,STRING:35,Literal:36,JS:37,REGEX:38,TRUE:39,FALSE:40,YES:41,NO:42,ON:43,OFF:44,Assignable:45,"=":46,AssignObj:47, -":":48,RETURN:49,HERECOMMENT:50,"?":51,PARAM_START:52,ParamList:53,PARAM_END:54,FuncGlyph:55,"->":56,"=>":57,OptComma:58,",":59,Param:60,PARAM:61,"@":62,".":63,Splat:64,SimpleAssignable:65,Accessor:66,Invocation:67,ThisProperty:68,Array:69,Object:70,Parenthetical:71,Range:72,This:73,NULL:74,PROPERTY_ACCESS:75,PROTOTYPE_ACCESS:76,"::":77,SOAK_ACCESS:78,Index:79,Slice:80,INDEX_START:81,INDEX_END:82,INDEX_SOAK:83,INDEX_PROTO:84,"{":85,AssignList:86,"}":87,CLASS:88,EXTENDS:89,ClassBody:90,ClassAssign:91, -NEW:92,OptFuncExist:93,Arguments:94,SUPER:95,FUNC_EXIST:96,CALL_START:97,CALL_END:98,ArgList:99,THIS:100,RangeDots:101,"[":102,"]":103,Arg:104,SimpleArgs:105,TRY:106,Catch:107,FINALLY:108,CATCH:109,THROW:110,"(":111,")":112,WhileSource:113,WHILE:114,WHEN:115,UNTIL:116,Loop:117,LOOP:118,ForBody:119,FOR:120,ForStart:121,ForSource:122,ForVariables:123,ALL:124,ForValue:125,IN:126,OF:127,BY:128,SWITCH:129,Whens:130,ELSE:131,When:132,LEADING_WHEN:133,IfBlock:134,IF:135,UNLESS:136,POST_IF:137,POST_UNLESS:138, -UNARY:139,"-":140,"+":141,"--":142,"++":143,"==":144,"!=":145,MATH:146,SHIFT:147,COMPARE:148,LOGIC:149,COMPOUND_ASSIGN:150,INSTANCEOF:151,$accept:0,$end:1},terminals_:{"2":"error","4":"TERMINATOR","12":"BREAK","13":"CONTINUE","14":"DEBUGGER","29":"INDENT","30":"OUTDENT","32":"IDENTIFIER","34":"NUMBER","35":"STRING","37":"JS","38":"REGEX","39":"TRUE","40":"FALSE","41":"YES","42":"NO","43":"ON","44":"OFF","46":"=","48":":","49":"RETURN","50":"HERECOMMENT","51":"?","52":"PARAM_START","54":"PARAM_END", -"56":"->","57":"=>","59":",","61":"PARAM","62":"@","63":".","74":"NULL","75":"PROPERTY_ACCESS","76":"PROTOTYPE_ACCESS","77":"::","78":"SOAK_ACCESS","81":"INDEX_START","82":"INDEX_END","83":"INDEX_SOAK","84":"INDEX_PROTO","85":"{","87":"}","88":"CLASS","89":"EXTENDS","92":"NEW","95":"SUPER","96":"FUNC_EXIST","97":"CALL_START","98":"CALL_END","100":"THIS","102":"[","103":"]","106":"TRY","108":"FINALLY","109":"CATCH","110":"THROW","111":"(","112":")","114":"WHILE","115":"WHEN","116":"UNTIL","118":"LOOP", -"120":"FOR","124":"ALL","126":"IN","127":"OF","128":"BY","129":"SWITCH","131":"ELSE","133":"LEADING_WHEN","135":"IF","136":"UNLESS","137":"POST_IF","138":"POST_UNLESS","139":"UNARY","140":"-","141":"+","142":"--","143":"++","144":"==","145":"!=","146":"MATH","147":"SHIFT","148":"COMPARE","149":"LOGIC","150":"COMPOUND_ASSIGN","151":"INSTANCEOF"},productions_:[0,[3,0],[3,1],[3,1],[3,2],[5,1],[5,3],[5,2],[7,1],[7,1],[9,1],[9,1],[9,1],[9,1],[9,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1], -[8,1],[8,1],[8,1],[8,1],[8,1],[6,3],[6,2],[6,2],[31,1],[33,1],[33,1],[36,1],[36,1],[36,1],[36,1],[36,1],[36,1],[36,1],[36,1],[36,1],[19,3],[19,5],[47,1],[47,1],[47,3],[47,3],[47,5],[47,5],[47,1],[10,2],[10,1],[28,1],[27,2],[17,5],[17,2],[55,1],[55,1],[58,0],[58,1],[53,0],[53,1],[53,3],[60,1],[60,2],[60,4],[60,5],[64,4],[65,1],[65,2],[65,2],[65,1],[45,1],[45,1],[45,1],[15,1],[15,1],[15,1],[15,1],[15,1],[15,1],[66,2],[66,2],[66,1],[66,2],[66,1],[66,1],[79,3],[79,2],[79,2],[70,4],[86,0],[86,1],[86,3], -[86,4],[86,6],[26,2],[26,4],[26,5],[26,7],[26,4],[91,1],[91,3],[91,5],[90,0],[90,1],[90,3],[90,3],[16,1],[16,2],[16,2],[25,3],[67,3],[67,3],[67,1],[67,2],[93,0],[93,1],[94,2],[94,4],[73,1],[73,1],[101,2],[101,3],[68,2],[72,5],[80,5],[80,4],[80,4],[69,2],[69,4],[99,1],[99,3],[99,4],[99,4],[99,6],[104,1],[104,1],[105,1],[105,3],[21,3],[21,4],[21,5],[107,3],[11,2],[71,3],[71,2],[113,2],[113,4],[113,2],[113,4],[22,2],[22,2],[22,2],[22,1],[117,2],[117,2],[23,2],[23,2],[23,2],[119,2],[119,2],[121,2],[121, -3],[125,1],[125,1],[125,1],[123,1],[123,3],[122,2],[122,2],[122,4],[122,4],[122,4],[122,6],[122,6],[24,5],[24,7],[24,4],[24,6],[130,1],[130,2],[132,3],[132,4],[134,3],[134,3],[134,5],[134,3],[20,1],[20,3],[20,3],[20,3],[20,3],[18,2],[18,2],[18,2],[18,2],[18,2],[18,2],[18,2],[18,3],[18,3],[18,3],[18,3],[18,3],[18,3],[18,3],[18,3],[18,3],[18,3],[18,5],[18,3],[18,3],[18,3],[18,4],[18,4],[18,4]],performAction:function(c,j,h,e,r,d){c=d.length;switch(r){case 1:return this.$=new e.Expressions;case 2:return this.$= -new e.Expressions;case 3:return this.$=d[c-1+1-1];case 4:return this.$=d[c-2+1-1];case 5:this.$=e.Expressions.wrap([d[c-1+1-1]]);break;case 6:this.$=d[c-3+1-1].push(d[c-3+3-1]);break;case 7:this.$=d[c-2+1-1];break;case 8:this.$=d[c-1+1-1];break;case 9:this.$=d[c-1+1-1];break;case 10:this.$=d[c-1+1-1];break;case 11:this.$=d[c-1+1-1];break;case 12:this.$=new e.LiteralNode(d[c-1+1-1]);break;case 13:this.$=new e.LiteralNode(d[c-1+1-1]);break;case 14:this.$=new e.LiteralNode(d[c-1+1-1]);break;case 15:this.$= -d[c-1+1-1];break;case 16:this.$=d[c-1+1-1];break;case 17:this.$=d[c-1+1-1];break;case 18:this.$=d[c-1+1-1];break;case 19:this.$=d[c-1+1-1];break;case 20:this.$=d[c-1+1-1];break;case 21:this.$=d[c-1+1-1];break;case 22:this.$=d[c-1+1-1];break;case 23:this.$=d[c-1+1-1];break;case 24:this.$=d[c-1+1-1];break;case 25:this.$=d[c-1+1-1];break;case 26:this.$=d[c-1+1-1];break;case 27:this.$=d[c-1+1-1];break;case 28:this.$=d[c-1+1-1];break;case 29:this.$=d[c-3+2-1];break;case 30:this.$=new e.Expressions;break; -case 31:this.$=e.Expressions.wrap([d[c-2+2-1]]);break;case 32:this.$=new e.LiteralNode(d[c-1+1-1]);break;case 33:this.$=new e.LiteralNode(d[c-1+1-1]);break;case 34:this.$=new e.LiteralNode(d[c-1+1-1]);break;case 35:this.$=d[c-1+1-1];break;case 36:this.$=new e.LiteralNode(d[c-1+1-1]);break;case 37:this.$=new e.LiteralNode(d[c-1+1-1]);break;case 38:this.$=new e.LiteralNode(true);break;case 39:this.$=new e.LiteralNode(false);break;case 40:this.$=new e.LiteralNode(true);break;case 41:this.$=new e.LiteralNode(false); -break;case 42:this.$=new e.LiteralNode(true);break;case 43:this.$=new e.LiteralNode(false);break;case 44:this.$=new e.AssignNode(d[c-3+1-1],d[c-3+3-1]);break;case 45:this.$=new e.AssignNode(d[c-5+1-1],d[c-5+4-1]);break;case 46:this.$=new e.ValueNode(d[c-1+1-1]);break;case 47:this.$=d[c-1+1-1];break;case 48:this.$=new e.AssignNode(new e.ValueNode(d[c-3+1-1]),d[c-3+3-1],"object");break;case 49:this.$=new e.AssignNode(new e.ValueNode(d[c-3+1-1]),d[c-3+3-1],"object");break;case 50:this.$=new e.AssignNode(new e.ValueNode(d[c- -5+1-1]),d[c-5+4-1],"object");break;case 51:this.$=new e.AssignNode(new e.ValueNode(d[c-5+1-1]),d[c-5+4-1],"object");break;case 52:this.$=d[c-1+1-1];break;case 53:this.$=new e.ReturnNode(d[c-2+2-1]);break;case 54:this.$=new e.ReturnNode(new e.ValueNode(new e.LiteralNode("null")));break;case 55:this.$=new e.CommentNode(d[c-1+1-1]);break;case 56:this.$=new e.ExistenceNode(d[c-2+1-1]);break;case 57:this.$=new e.CodeNode(d[c-5+2-1],d[c-5+5-1],d[c-5+4-1]);break;case 58:this.$=new e.CodeNode([],d[c-2+2- -1],d[c-2+1-1]);break;case 59:this.$="func";break;case 60:this.$="boundfunc";break;case 61:this.$=d[c-1+1-1];break;case 62:this.$=d[c-1+1-1];break;case 63:this.$=[];break;case 64:this.$=[d[c-1+1-1]];break;case 65:this.$=d[c-3+1-1].concat([d[c-3+3-1]]);break;case 66:this.$=new e.LiteralNode(d[c-1+1-1]);break;case 67:this.$=new e.ParamNode(d[c-2+2-1],true);break;case 68:this.$=new e.ParamNode(d[c-4+1-1],false,true);break;case 69:this.$=new e.ParamNode(d[c-5+2-1],true,true);break;case 70:this.$=new e.SplatNode(d[c- -4+1-1]);break;case 71:this.$=new e.ValueNode(d[c-1+1-1]);break;case 72:this.$=d[c-2+1-1].push(d[c-2+2-1]);break;case 73:this.$=new e.ValueNode(d[c-2+1-1],[d[c-2+2-1]]);break;case 74:this.$=d[c-1+1-1];break;case 75:this.$=d[c-1+1-1];break;case 76:this.$=new e.ValueNode(d[c-1+1-1]);break;case 77:this.$=new e.ValueNode(d[c-1+1-1]);break;case 78:this.$=d[c-1+1-1];break;case 79:this.$=new e.ValueNode(d[c-1+1-1]);break;case 80:this.$=new e.ValueNode(d[c-1+1-1]);break;case 81:this.$=new e.ValueNode(d[c- -1+1-1]);break;case 82:this.$=d[c-1+1-1];break;case 83:this.$=new e.ValueNode(new e.LiteralNode("null"));break;case 84:this.$=new e.AccessorNode(d[c-2+2-1]);break;case 85:this.$=new e.AccessorNode(d[c-2+2-1],"prototype");break;case 86:this.$=new e.AccessorNode(new e.LiteralNode("prototype"));break;case 87:this.$=new e.AccessorNode(d[c-2+2-1],"soak");break;case 88:this.$=d[c-1+1-1];break;case 89:this.$=new e.SliceNode(d[c-1+1-1]);break;case 90:this.$=new e.IndexNode(d[c-3+2-1]);break;case 91:d[c-2+ -2-1].soakNode=true;this.$=d[c-2+2-1];break;case 92:d[c-2+2-1].proto=true;this.$=d[c-2+2-1];break;case 93:this.$=new e.ObjectNode(d[c-4+2-1]);break;case 94:this.$=[];break;case 95:this.$=[d[c-1+1-1]];break;case 96:this.$=d[c-3+1-1].concat([d[c-3+3-1]]);break;case 97:this.$=d[c-4+1-1].concat([d[c-4+4-1]]);break;case 98:this.$=d[c-6+1-1].concat(d[c-6+4-1]);break;case 99:this.$=new e.ClassNode(d[c-2+2-1]);break;case 100:this.$=new e.ClassNode(d[c-4+2-1],d[c-4+4-1]);break;case 101:this.$=new e.ClassNode(d[c- -5+2-1],null,d[c-5+4-1]);break;case 102:this.$=new e.ClassNode(d[c-7+2-1],d[c-7+4-1],d[c-7+6-1]);break;case 103:this.$=new e.ClassNode("__temp__",null,d[c-4+3-1]);break;case 104:this.$=d[c-1+1-1];break;case 105:this.$=new e.AssignNode(new e.ValueNode(d[c-3+1-1]),d[c-3+3-1],"this");break;case 106:this.$=new e.AssignNode(new e.ValueNode(d[c-5+1-1]),d[c-5+4-1],"this");break;case 107:this.$=[];break;case 108:this.$=[d[c-1+1-1]];break;case 109:this.$=d[c-3+1-1].concat(d[c-3+3-1]);break;case 110:this.$= -d[c-3+2-1];break;case 111:this.$=d[c-1+1-1];break;case 112:this.$=d[c-2+2-1].newInstance();break;case 113:this.$=(new e.CallNode(d[c-2+2-1],[])).newInstance();break;case 114:this.$=new e.ExtendsNode(d[c-3+1-1],d[c-3+3-1]);break;case 115:this.$=new e.CallNode(d[c-3+1-1],d[c-3+3-1],d[c-3+2-1]);break;case 116:this.$=new e.CallNode(d[c-3+1-1],d[c-3+3-1],d[c-3+2-1]);break;case 117:this.$=new e.CallNode("super",[new e.SplatNode(new e.LiteralNode("arguments"))]);break;case 118:this.$=new e.CallNode("super", -d[c-2+2-1]);break;case 119:this.$=false;break;case 120:this.$=true;break;case 121:this.$=[];break;case 122:this.$=d[c-4+2-1];break;case 123:this.$=new e.ValueNode(new e.LiteralNode("this"));break;case 124:this.$=new e.ValueNode(new e.LiteralNode("this"));break;case 125:this.$="inclusive";break;case 126:this.$="exclusive";break;case 127:this.$=new e.ValueNode(new e.LiteralNode("this"),[new e.AccessorNode(d[c-2+2-1])]);break;case 128:this.$=new e.RangeNode(d[c-5+2-1],d[c-5+4-1],d[c-5+3-1]);break;case 129:this.$= -new e.RangeNode(d[c-5+2-1],d[c-5+4-1],d[c-5+3-1]);break;case 130:this.$=new e.RangeNode(d[c-4+2-1],null,d[c-4+3-1]);break;case 131:this.$=new e.RangeNode(null,d[c-4+3-1],d[c-4+2-1]);break;case 132:this.$=new e.ArrayNode([]);break;case 133:this.$=new e.ArrayNode(d[c-4+2-1]);break;case 134:this.$=[d[c-1+1-1]];break;case 135:this.$=d[c-3+1-1].concat([d[c-3+3-1]]);break;case 136:this.$=d[c-4+1-1].concat([d[c-4+4-1]]);break;case 137:this.$=d[c-4+2-1];break;case 138:this.$=d[c-6+1-1].concat(d[c-6+4-1]); -break;case 139:this.$=d[c-1+1-1];break;case 140:this.$=d[c-1+1-1];break;case 141:this.$=d[c-1+1-1];break;case 142:this.$=d[c-3+1-1]instanceof Array?d[c-3+1-1].concat([d[c-3+3-1]]):[d[c-3+1-1]].concat([d[c-3+3-1]]);break;case 143:this.$=new e.TryNode(d[c-3+2-1],d[c-3+3-1][0],d[c-3+3-1][1]);break;case 144:this.$=new e.TryNode(d[c-4+2-1],null,null,d[c-4+4-1]);break;case 145:this.$=new e.TryNode(d[c-5+2-1],d[c-5+3-1][0],d[c-5+3-1][1],d[c-5+5-1]);break;case 146:this.$=[d[c-3+2-1],d[c-3+3-1]];break;case 147:this.$= -new e.ThrowNode(d[c-2+2-1]);break;case 148:this.$=new e.ParentheticalNode(d[c-3+2-1]);break;case 149:this.$=new e.ParentheticalNode(new e.LiteralNode(""));break;case 150:this.$=new e.WhileNode(d[c-2+2-1]);break;case 151:this.$=new e.WhileNode(d[c-4+2-1],{guard:d[c-4+4-1]});break;case 152:this.$=new e.WhileNode(d[c-2+2-1],{invert:true});break;case 153:this.$=new e.WhileNode(d[c-4+2-1],{invert:true,guard:d[c-4+4-1]});break;case 154:this.$=d[c-2+1-1].addBody(d[c-2+2-1]);break;case 155:this.$=d[c-2+2- -1].addBody(e.Expressions.wrap([d[c-2+1-1]]));break;case 156:this.$=d[c-2+2-1].addBody(e.Expressions.wrap([d[c-2+1-1]]));break;case 157:this.$=d[c-1+1-1];break;case 158:this.$=(new e.WhileNode(new e.LiteralNode("true"))).addBody(d[c-2+2-1]);break;case 159:this.$=(new e.WhileNode(new e.LiteralNode("true"))).addBody(e.Expressions.wrap([d[c-2+2-1]]));break;case 160:this.$=new e.ForNode(d[c-2+1-1],d[c-2+2-1],d[c-2+2-1].vars[0],d[c-2+2-1].vars[1]);break;case 161:this.$=new e.ForNode(d[c-2+1-1],d[c-2+2- -1],d[c-2+2-1].vars[0],d[c-2+2-1].vars[1]);break;case 162:this.$=new e.ForNode(d[c-2+2-1],d[c-2+1-1],d[c-2+1-1].vars[0],d[c-2+1-1].vars[1]);break;case 163:this.$={source:new e.ValueNode(d[c-2+2-1]),vars:[]};break;case 164:d[c-2+2-1].raw=d[c-2+1-1].raw;d[c-2+2-1].vars=d[c-2+1-1];this.$=d[c-2+2-1];break;case 165:this.$=d[c-2+2-1];break;case 166:d[c-3+3-1].raw=true;this.$=d[c-3+3-1];break;case 167:this.$=d[c-1+1-1];break;case 168:this.$=new e.ValueNode(d[c-1+1-1]);break;case 169:this.$=new e.ValueNode(d[c- -1+1-1]);break;case 170:this.$=[d[c-1+1-1]];break;case 171:this.$=[d[c-3+1-1],d[c-3+3-1]];break;case 172:this.$={source:d[c-2+2-1]};break;case 173:this.$={source:d[c-2+2-1],object:true};break;case 174:this.$={source:d[c-4+2-1],guard:d[c-4+4-1]};break;case 175:this.$={source:d[c-4+2-1],guard:d[c-4+4-1],object:true};break;case 176:this.$={source:d[c-4+2-1],step:d[c-4+4-1]};break;case 177:this.$={source:d[c-6+2-1],guard:d[c-6+4-1],step:d[c-6+6-1]};break;case 178:this.$={source:d[c-6+2-1],step:d[c-6+4- -1],guard:d[c-6+6-1]};break;case 179:this.$=new e.SwitchNode(d[c-5+2-1],d[c-5+4-1]);break;case 180:this.$=new e.SwitchNode(d[c-7+2-1],d[c-7+4-1],d[c-7+6-1]);break;case 181:this.$=new e.SwitchNode(null,d[c-4+3-1]);break;case 182:this.$=new e.SwitchNode(null,d[c-6+3-1],d[c-6+5-1]);break;case 183:this.$=d[c-1+1-1];break;case 184:this.$=d[c-2+1-1].concat(d[c-2+2-1]);break;case 185:this.$=[[d[c-3+2-1],d[c-3+3-1]]];break;case 186:this.$=[[d[c-4+2-1],d[c-4+3-1]]];break;case 187:this.$=new e.IfNode(d[c-3+ -2-1],d[c-3+3-1]);break;case 188:this.$=new e.IfNode(d[c-3+2-1],d[c-3+3-1],{invert:true});break;case 189:this.$=d[c-5+1-1].addElse((new e.IfNode(d[c-5+4-1],d[c-5+5-1])).forceStatement());break;case 190:this.$=d[c-3+1-1].addElse(d[c-3+3-1]);break;case 191:this.$=d[c-1+1-1];break;case 192:this.$=new e.IfNode(d[c-3+3-1],e.Expressions.wrap([d[c-3+1-1]]),{statement:true});break;case 193:this.$=new e.IfNode(d[c-3+3-1],e.Expressions.wrap([d[c-3+1-1]]),{statement:true});break;case 194:this.$=new e.IfNode(d[c- -3+3-1],e.Expressions.wrap([d[c-3+1-1]]),{statement:true,invert:true});break;case 195:this.$=new e.IfNode(d[c-3+3-1],e.Expressions.wrap([d[c-3+1-1]]),{statement:true,invert:true});break;case 196:this.$=new e.OpNode(d[c-2+1-1],d[c-2+2-1]);break;case 197:this.$=new e.OpNode("-",d[c-2+2-1]);break;case 198:this.$=new e.OpNode("+",d[c-2+2-1]);break;case 199:this.$=new e.OpNode("--",d[c-2+2-1]);break;case 200:this.$=new e.OpNode("++",d[c-2+2-1]);break;case 201:this.$=new e.OpNode("--",d[c-2+1-1],null,true); -break;case 202:this.$=new e.OpNode("++",d[c-2+1-1],null,true);break;case 203:this.$=new e.OpNode("?",d[c-3+1-1],d[c-3+3-1]);break;case 204:this.$=new e.OpNode("+",d[c-3+1-1],d[c-3+3-1]);break;case 205:this.$=new e.OpNode("-",d[c-3+1-1],d[c-3+3-1]);break;case 206:this.$=new e.OpNode("==",d[c-3+1-1],d[c-3+3-1]);break;case 207:this.$=new e.OpNode("!=",d[c-3+1-1],d[c-3+3-1]);break;case 208:this.$=new e.OpNode(d[c-3+2-1],d[c-3+1-1],d[c-3+3-1]);break;case 209:this.$=new e.OpNode(d[c-3+2-1],d[c-3+1-1],d[c- -3+3-1]);break;case 210:this.$=new e.OpNode(d[c-3+2-1],d[c-3+1-1],d[c-3+3-1]);break;case 211:this.$=new e.OpNode(d[c-3+2-1],d[c-3+1-1],d[c-3+3-1]);break;case 212:this.$=new e.OpNode(d[c-3+2-1],d[c-3+1-1],d[c-3+3-1]);break;case 213:this.$=new e.OpNode(d[c-5+2-1],d[c-5+1-1],d[c-5+4-1]);break;case 214:this.$=new e.InNode(d[c-3+1-1],d[c-3+3-1]);break;case 215:this.$=new e.OpNode("in",d[c-3+1-1],d[c-3+3-1]);break;case 216:this.$=new e.OpNode("instanceof",d[c-3+1-1],d[c-3+3-1]);break;case 217:this.$=new e.OpNode(d[c- -4+2-1],new e.InNode(d[c-4+1-1],d[c-4+4-1]));break;case 218:this.$=new e.OpNode(d[c-4+2-1],new e.ParentheticalNode(new e.OpNode("in",d[c-4+1-1],d[c-4+4-1])));break;case 219:this.$=new e.OpNode(d[c-4+2-1],new e.ParentheticalNode(new e.OpNode("instanceof",d[c-4+1-1],d[c-4+4-1])));break}},table:[{"1":[2,1],"3":1,"4":[1,2],"5":3,"6":4,"7":5,"8":7,"9":8,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21, -"28":22,"29":[1,6],"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1,35],"95":[1,69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1, -76],"119":47,"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]},{"1":[3]},{"1":[2,2],"28":85,"50":[1,51]},{"1":[2,3],"4":[1,86]},{"4":[1,87]},{"1":[2,5],"4":[2,5],"30":[2,5]},{"5":88,"7":5,"8":7,"9":8,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"30":[1,89],"31":79,"32":[1,84],"33":56,"34":[1,82], -"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1,35],"95":[1,69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47,"120":[1,77],"121":78,"129":[1,48],"134":43, -"135":[1,72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]},{"1":[2,8],"4":[2,8],"30":[2,8],"51":[1,92],"112":[2,8],"113":107,"114":[1,74],"116":[1,75],"119":108,"120":[1,77],"121":78,"126":[1,101],"127":[1,102],"137":[1,105],"138":[1,106],"139":[1,104],"140":[1,94],"141":[1,93],"142":[1,90],"143":[1,91],"144":[1,95],"145":[1,96],"146":[1,97],"147":[1,98],"148":[1,99],"149":[1,100],"151":[1,103]},{"1":[2,9],"4":[2,9],"30":[2,9],"112":[2,9],"113":111,"114":[1,74],"116":[1, -75],"119":112,"120":[1,77],"121":78,"137":[1,109],"138":[1,110]},{"1":[2,15],"4":[2,15],"29":[2,15],"30":[2,15],"51":[2,15],"59":[2,15],"63":[2,15],"66":115,"75":[1,117],"76":[1,118],"77":[1,119],"78":[1,120],"79":121,"80":122,"81":[1,123],"82":[2,15],"83":[1,124],"84":[1,125],"87":[2,15],"93":114,"96":[1,116],"97":[2,119],"98":[2,15],"103":[2,15],"112":[2,15],"114":[2,15],"115":[2,15],"116":[2,15],"120":[2,15],"126":[2,15],"127":[2,15],"128":[2,15],"137":[2,15],"138":[2,15],"139":[2,15],"140":[2, -15],"141":[2,15],"142":[2,15],"143":[2,15],"144":[2,15],"145":[2,15],"146":[2,15],"147":[2,15],"148":[2,15],"149":[2,15],"150":[1,113],"151":[2,15]},{"1":[2,16],"4":[2,16],"29":[2,16],"30":[2,16],"51":[2,16],"59":[2,16],"63":[2,16],"82":[2,16],"87":[2,16],"98":[2,16],"103":[2,16],"112":[2,16],"114":[2,16],"115":[2,16],"116":[2,16],"120":[2,16],"126":[2,16],"127":[2,16],"128":[2,16],"137":[2,16],"138":[2,16],"139":[2,16],"140":[2,16],"141":[2,16],"142":[2,16],"143":[2,16],"144":[2,16],"145":[2,16], -"146":[2,16],"147":[2,16],"148":[2,16],"149":[2,16],"151":[2,16]},{"1":[2,17],"4":[2,17],"29":[2,17],"30":[2,17],"51":[2,17],"59":[2,17],"63":[2,17],"82":[2,17],"87":[2,17],"98":[2,17],"103":[2,17],"112":[2,17],"114":[2,17],"115":[2,17],"116":[2,17],"120":[2,17],"126":[2,17],"127":[2,17],"128":[2,17],"137":[2,17],"138":[2,17],"139":[2,17],"140":[2,17],"141":[2,17],"142":[2,17],"143":[2,17],"144":[2,17],"145":[2,17],"146":[2,17],"147":[2,17],"148":[2,17],"149":[2,17],"151":[2,17]},{"1":[2,18],"4":[2, -18],"29":[2,18],"30":[2,18],"51":[2,18],"59":[2,18],"63":[2,18],"82":[2,18],"87":[2,18],"98":[2,18],"103":[2,18],"112":[2,18],"114":[2,18],"115":[2,18],"116":[2,18],"120":[2,18],"126":[2,18],"127":[2,18],"128":[2,18],"137":[2,18],"138":[2,18],"139":[2,18],"140":[2,18],"141":[2,18],"142":[2,18],"143":[2,18],"144":[2,18],"145":[2,18],"146":[2,18],"147":[2,18],"148":[2,18],"149":[2,18],"151":[2,18]},{"1":[2,19],"4":[2,19],"29":[2,19],"30":[2,19],"51":[2,19],"59":[2,19],"63":[2,19],"82":[2,19],"87":[2, -19],"98":[2,19],"103":[2,19],"112":[2,19],"114":[2,19],"115":[2,19],"116":[2,19],"120":[2,19],"126":[2,19],"127":[2,19],"128":[2,19],"137":[2,19],"138":[2,19],"139":[2,19],"140":[2,19],"141":[2,19],"142":[2,19],"143":[2,19],"144":[2,19],"145":[2,19],"146":[2,19],"147":[2,19],"148":[2,19],"149":[2,19],"151":[2,19]},{"1":[2,20],"4":[2,20],"29":[2,20],"30":[2,20],"51":[2,20],"59":[2,20],"63":[2,20],"82":[2,20],"87":[2,20],"98":[2,20],"103":[2,20],"112":[2,20],"114":[2,20],"115":[2,20],"116":[2,20],"120":[2, -20],"126":[2,20],"127":[2,20],"128":[2,20],"137":[2,20],"138":[2,20],"139":[2,20],"140":[2,20],"141":[2,20],"142":[2,20],"143":[2,20],"144":[2,20],"145":[2,20],"146":[2,20],"147":[2,20],"148":[2,20],"149":[2,20],"151":[2,20]},{"1":[2,21],"4":[2,21],"29":[2,21],"30":[2,21],"51":[2,21],"59":[2,21],"63":[2,21],"82":[2,21],"87":[2,21],"98":[2,21],"103":[2,21],"112":[2,21],"114":[2,21],"115":[2,21],"116":[2,21],"120":[2,21],"126":[2,21],"127":[2,21],"128":[2,21],"137":[2,21],"138":[2,21],"139":[2,21], -"140":[2,21],"141":[2,21],"142":[2,21],"143":[2,21],"144":[2,21],"145":[2,21],"146":[2,21],"147":[2,21],"148":[2,21],"149":[2,21],"151":[2,21]},{"1":[2,22],"4":[2,22],"29":[2,22],"30":[2,22],"51":[2,22],"59":[2,22],"63":[2,22],"82":[2,22],"87":[2,22],"98":[2,22],"103":[2,22],"112":[2,22],"114":[2,22],"115":[2,22],"116":[2,22],"120":[2,22],"126":[2,22],"127":[2,22],"128":[2,22],"137":[2,22],"138":[2,22],"139":[2,22],"140":[2,22],"141":[2,22],"142":[2,22],"143":[2,22],"144":[2,22],"145":[2,22],"146":[2, -22],"147":[2,22],"148":[2,22],"149":[2,22],"151":[2,22]},{"1":[2,23],"4":[2,23],"29":[2,23],"30":[2,23],"51":[2,23],"59":[2,23],"63":[2,23],"82":[2,23],"87":[2,23],"98":[2,23],"103":[2,23],"112":[2,23],"114":[2,23],"115":[2,23],"116":[2,23],"120":[2,23],"126":[2,23],"127":[2,23],"128":[2,23],"137":[2,23],"138":[2,23],"139":[2,23],"140":[2,23],"141":[2,23],"142":[2,23],"143":[2,23],"144":[2,23],"145":[2,23],"146":[2,23],"147":[2,23],"148":[2,23],"149":[2,23],"151":[2,23]},{"1":[2,24],"4":[2,24],"29":[2, -24],"30":[2,24],"51":[2,24],"59":[2,24],"63":[2,24],"82":[2,24],"87":[2,24],"98":[2,24],"103":[2,24],"112":[2,24],"114":[2,24],"115":[2,24],"116":[2,24],"120":[2,24],"126":[2,24],"127":[2,24],"128":[2,24],"137":[2,24],"138":[2,24],"139":[2,24],"140":[2,24],"141":[2,24],"142":[2,24],"143":[2,24],"144":[2,24],"145":[2,24],"146":[2,24],"147":[2,24],"148":[2,24],"149":[2,24],"151":[2,24]},{"1":[2,25],"4":[2,25],"29":[2,25],"30":[2,25],"51":[2,25],"59":[2,25],"63":[2,25],"82":[2,25],"87":[2,25],"98":[2, -25],"103":[2,25],"112":[2,25],"114":[2,25],"115":[2,25],"116":[2,25],"120":[2,25],"126":[2,25],"127":[2,25],"128":[2,25],"137":[2,25],"138":[2,25],"139":[2,25],"140":[2,25],"141":[2,25],"142":[2,25],"143":[2,25],"144":[2,25],"145":[2,25],"146":[2,25],"147":[2,25],"148":[2,25],"149":[2,25],"151":[2,25]},{"1":[2,26],"4":[2,26],"29":[2,26],"30":[2,26],"51":[2,26],"59":[2,26],"63":[2,26],"82":[2,26],"87":[2,26],"98":[2,26],"103":[2,26],"112":[2,26],"114":[2,26],"115":[2,26],"116":[2,26],"120":[2,26], -"126":[2,26],"127":[2,26],"128":[2,26],"137":[2,26],"138":[2,26],"139":[2,26],"140":[2,26],"141":[2,26],"142":[2,26],"143":[2,26],"144":[2,26],"145":[2,26],"146":[2,26],"147":[2,26],"148":[2,26],"149":[2,26],"151":[2,26]},{"1":[2,27],"4":[2,27],"29":[2,27],"30":[2,27],"51":[2,27],"59":[2,27],"63":[2,27],"82":[2,27],"87":[2,27],"98":[2,27],"103":[2,27],"112":[2,27],"114":[2,27],"115":[2,27],"116":[2,27],"120":[2,27],"126":[2,27],"127":[2,27],"128":[2,27],"137":[2,27],"138":[2,27],"139":[2,27],"140":[2, -27],"141":[2,27],"142":[2,27],"143":[2,27],"144":[2,27],"145":[2,27],"146":[2,27],"147":[2,27],"148":[2,27],"149":[2,27],"151":[2,27]},{"1":[2,28],"4":[2,28],"29":[2,28],"30":[2,28],"51":[2,28],"59":[2,28],"63":[2,28],"82":[2,28],"87":[2,28],"98":[2,28],"103":[2,28],"112":[2,28],"114":[2,28],"115":[2,28],"116":[2,28],"120":[2,28],"126":[2,28],"127":[2,28],"128":[2,28],"137":[2,28],"138":[2,28],"139":[2,28],"140":[2,28],"141":[2,28],"142":[2,28],"143":[2,28],"144":[2,28],"145":[2,28],"146":[2,28], -"147":[2,28],"148":[2,28],"149":[2,28],"151":[2,28]},{"1":[2,10],"4":[2,10],"30":[2,10],"112":[2,10],"114":[2,10],"116":[2,10],"120":[2,10],"137":[2,10],"138":[2,10]},{"1":[2,11],"4":[2,11],"30":[2,11],"112":[2,11],"114":[2,11],"116":[2,11],"120":[2,11],"137":[2,11],"138":[2,11]},{"1":[2,12],"4":[2,12],"30":[2,12],"112":[2,12],"114":[2,12],"116":[2,12],"120":[2,12],"137":[2,12],"138":[2,12]},{"1":[2,13],"4":[2,13],"30":[2,13],"112":[2,13],"114":[2,13],"116":[2,13],"120":[2,13],"137":[2,13],"138":[2, -13]},{"1":[2,14],"4":[2,14],"30":[2,14],"112":[2,14],"114":[2,14],"116":[2,14],"120":[2,14],"137":[2,14],"138":[2,14]},{"1":[2,78],"4":[2,78],"29":[2,78],"30":[2,78],"46":[1,126],"51":[2,78],"59":[2,78],"63":[2,78],"75":[2,78],"76":[2,78],"77":[2,78],"78":[2,78],"81":[2,78],"82":[2,78],"83":[2,78],"84":[2,78],"87":[2,78],"96":[2,78],"97":[2,78],"98":[2,78],"103":[2,78],"112":[2,78],"114":[2,78],"115":[2,78],"116":[2,78],"120":[2,78],"126":[2,78],"127":[2,78],"128":[2,78],"137":[2,78],"138":[2,78], -"139":[2,78],"140":[2,78],"141":[2,78],"142":[2,78],"143":[2,78],"144":[2,78],"145":[2,78],"146":[2,78],"147":[2,78],"148":[2,78],"149":[2,78],"150":[2,78],"151":[2,78]},{"1":[2,79],"4":[2,79],"29":[2,79],"30":[2,79],"51":[2,79],"59":[2,79],"63":[2,79],"75":[2,79],"76":[2,79],"77":[2,79],"78":[2,79],"81":[2,79],"82":[2,79],"83":[2,79],"84":[2,79],"87":[2,79],"96":[2,79],"97":[2,79],"98":[2,79],"103":[2,79],"112":[2,79],"114":[2,79],"115":[2,79],"116":[2,79],"120":[2,79],"126":[2,79],"127":[2,79], -"128":[2,79],"137":[2,79],"138":[2,79],"139":[2,79],"140":[2,79],"141":[2,79],"142":[2,79],"143":[2,79],"144":[2,79],"145":[2,79],"146":[2,79],"147":[2,79],"148":[2,79],"149":[2,79],"150":[2,79],"151":[2,79]},{"1":[2,80],"4":[2,80],"29":[2,80],"30":[2,80],"51":[2,80],"59":[2,80],"63":[2,80],"75":[2,80],"76":[2,80],"77":[2,80],"78":[2,80],"81":[2,80],"82":[2,80],"83":[2,80],"84":[2,80],"87":[2,80],"96":[2,80],"97":[2,80],"98":[2,80],"103":[2,80],"112":[2,80],"114":[2,80],"115":[2,80],"116":[2,80], -"120":[2,80],"126":[2,80],"127":[2,80],"128":[2,80],"137":[2,80],"138":[2,80],"139":[2,80],"140":[2,80],"141":[2,80],"142":[2,80],"143":[2,80],"144":[2,80],"145":[2,80],"146":[2,80],"147":[2,80],"148":[2,80],"149":[2,80],"150":[2,80],"151":[2,80]},{"1":[2,81],"4":[2,81],"29":[2,81],"30":[2,81],"51":[2,81],"59":[2,81],"63":[2,81],"75":[2,81],"76":[2,81],"77":[2,81],"78":[2,81],"81":[2,81],"82":[2,81],"83":[2,81],"84":[2,81],"87":[2,81],"96":[2,81],"97":[2,81],"98":[2,81],"103":[2,81],"112":[2,81], -"114":[2,81],"115":[2,81],"116":[2,81],"120":[2,81],"126":[2,81],"127":[2,81],"128":[2,81],"137":[2,81],"138":[2,81],"139":[2,81],"140":[2,81],"141":[2,81],"142":[2,81],"143":[2,81],"144":[2,81],"145":[2,81],"146":[2,81],"147":[2,81],"148":[2,81],"149":[2,81],"150":[2,81],"151":[2,81]},{"1":[2,82],"4":[2,82],"29":[2,82],"30":[2,82],"51":[2,82],"59":[2,82],"63":[2,82],"75":[2,82],"76":[2,82],"77":[2,82],"78":[2,82],"81":[2,82],"82":[2,82],"83":[2,82],"84":[2,82],"87":[2,82],"96":[2,82],"97":[2,82], -"98":[2,82],"103":[2,82],"112":[2,82],"114":[2,82],"115":[2,82],"116":[2,82],"120":[2,82],"126":[2,82],"127":[2,82],"128":[2,82],"137":[2,82],"138":[2,82],"139":[2,82],"140":[2,82],"141":[2,82],"142":[2,82],"143":[2,82],"144":[2,82],"145":[2,82],"146":[2,82],"147":[2,82],"148":[2,82],"149":[2,82],"150":[2,82],"151":[2,82]},{"1":[2,83],"4":[2,83],"29":[2,83],"30":[2,83],"51":[2,83],"59":[2,83],"63":[2,83],"75":[2,83],"76":[2,83],"77":[2,83],"78":[2,83],"81":[2,83],"82":[2,83],"83":[2,83],"84":[2,83], -"87":[2,83],"96":[2,83],"97":[2,83],"98":[2,83],"103":[2,83],"112":[2,83],"114":[2,83],"115":[2,83],"116":[2,83],"120":[2,83],"126":[2,83],"127":[2,83],"128":[2,83],"137":[2,83],"138":[2,83],"139":[2,83],"140":[2,83],"141":[2,83],"142":[2,83],"143":[2,83],"144":[2,83],"145":[2,83],"146":[2,83],"147":[2,83],"148":[2,83],"149":[2,83],"150":[2,83],"151":[2,83]},{"1":[2,111],"4":[2,111],"29":[2,111],"30":[2,111],"51":[2,111],"59":[2,111],"63":[2,111],"66":128,"75":[1,117],"76":[1,118],"77":[1,119],"78":[1, -120],"79":121,"80":122,"81":[1,123],"82":[2,111],"83":[1,124],"84":[1,125],"87":[2,111],"93":127,"96":[1,116],"97":[2,119],"98":[2,111],"103":[2,111],"112":[2,111],"114":[2,111],"115":[2,111],"116":[2,111],"120":[2,111],"126":[2,111],"127":[2,111],"128":[2,111],"137":[2,111],"138":[2,111],"139":[2,111],"140":[2,111],"141":[2,111],"142":[2,111],"143":[2,111],"144":[2,111],"145":[2,111],"146":[2,111],"147":[2,111],"148":[2,111],"149":[2,111],"151":[2,111]},{"15":130,"31":79,"32":[1,84],"33":56,"34":[1, -82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":131,"62":[1,68],"65":132,"67":129,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"95":[1,69],"100":[1,67],"102":[1,66],"111":[1,65]},{"53":133,"54":[2,63],"59":[2,63],"60":134,"61":[1,135],"62":[1,136]},{"4":[1,138],"6":137,"29":[1,6]},{"8":139,"9":140,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14, -"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1,35],"95":[1,69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"113":45, -"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47,"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]},{"8":141,"9":140,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1, -62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1,35],"95":[1,69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47,"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1, -42]},{"8":142,"9":140,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1, -33],"85":[1,81],"88":[1,50],"92":[1,35],"95":[1,69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47,"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]},{"8":143,"9":140,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":79, -"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1,35],"95":[1,69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47,"120":[1,77], -"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]},{"8":144,"9":140,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36], -"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1,35],"95":[1,69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47,"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]},{"1":[2,191],"4":[2,191],"29":[2,191],"30":[2,191],"51":[2,191],"59":[2, -191],"63":[2,191],"82":[2,191],"87":[2,191],"98":[2,191],"103":[2,191],"112":[2,191],"114":[2,191],"115":[2,191],"116":[2,191],"120":[2,191],"126":[2,191],"127":[2,191],"128":[2,191],"131":[1,145],"137":[2,191],"138":[2,191],"139":[2,191],"140":[2,191],"141":[2,191],"142":[2,191],"143":[2,191],"144":[2,191],"145":[2,191],"146":[2,191],"147":[2,191],"148":[2,191],"149":[2,191],"151":[2,191]},{"4":[1,138],"6":146,"29":[1,6]},{"4":[1,138],"6":147,"29":[1,6]},{"1":[2,157],"4":[2,157],"29":[2,157],"30":[2, -157],"51":[2,157],"59":[2,157],"63":[2,157],"82":[2,157],"87":[2,157],"98":[2,157],"103":[2,157],"112":[2,157],"114":[2,157],"115":[2,157],"116":[2,157],"120":[2,157],"126":[2,157],"127":[2,157],"128":[2,157],"137":[2,157],"138":[2,157],"139":[2,157],"140":[2,157],"141":[2,157],"142":[2,157],"143":[2,157],"144":[2,157],"145":[2,157],"146":[2,157],"147":[2,157],"148":[2,157],"149":[2,157],"151":[2,157]},{"4":[1,138],"6":148,"29":[1,6]},{"8":149,"9":140,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1, -27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"29":[1,150],"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1,35],"95":[1,69],"100":[1, -67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47,"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]},{"1":[2,75],"4":[2,75],"29":[2,75],"30":[2,75],"46":[2,75],"51":[2,75],"59":[2,75],"63":[2,75],"75":[2,75],"76":[2,75],"77":[2,75],"78":[2,75],"81":[2,75],"82":[2,75],"83":[2,75],"84":[2,75],"87":[2,75],"89":[1,151],"96":[2,75],"97":[2,75],"98":[2, -75],"103":[2,75],"112":[2,75],"114":[2,75],"115":[2,75],"116":[2,75],"120":[2,75],"126":[2,75],"127":[2,75],"128":[2,75],"137":[2,75],"138":[2,75],"139":[2,75],"140":[2,75],"141":[2,75],"142":[2,75],"143":[2,75],"144":[2,75],"145":[2,75],"146":[2,75],"147":[2,75],"148":[2,75],"149":[2,75],"150":[2,75],"151":[2,75]},{"15":154,"29":[1,153],"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":131, -"62":[1,68],"65":152,"67":155,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"95":[1,69],"100":[1,67],"102":[1,66],"111":[1,65]},{"1":[2,55],"4":[2,55],"29":[2,55],"30":[2,55],"51":[2,55],"59":[2,55],"63":[2,55],"82":[2,55],"87":[2,55],"98":[2,55],"103":[2,55],"108":[2,55],"109":[2,55],"112":[2,55],"114":[2,55],"115":[2,55],"116":[2,55],"120":[2,55],"126":[2,55],"127":[2,55],"128":[2,55],"131":[2,55],"133":[2,55],"137":[2,55],"138":[2,55],"139":[2,55],"140":[2,55],"141":[2, -55],"142":[2,55],"143":[2,55],"144":[2,55],"145":[2,55],"146":[2,55],"147":[2,55],"148":[2,55],"149":[2,55],"151":[2,55]},{"1":[2,54],"4":[2,54],"8":156,"9":140,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"30":[2,54],"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1, -52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1,35],"95":[1,69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"112":[2,54],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47,"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"137":[2,54],"138":[2,54],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]}, -{"8":157,"9":140,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1, -81],"88":[1,50],"92":[1,35],"95":[1,69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47,"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]},{"1":[2,76],"4":[2,76],"29":[2,76],"30":[2,76],"46":[2,76],"51":[2,76],"59":[2,76],"63":[2,76],"75":[2,76],"76":[2,76],"77":[2,76],"78":[2,76],"81":[2,76],"82":[2,76],"83":[2,76],"84":[2,76],"87":[2, -76],"96":[2,76],"97":[2,76],"98":[2,76],"103":[2,76],"112":[2,76],"114":[2,76],"115":[2,76],"116":[2,76],"120":[2,76],"126":[2,76],"127":[2,76],"128":[2,76],"137":[2,76],"138":[2,76],"139":[2,76],"140":[2,76],"141":[2,76],"142":[2,76],"143":[2,76],"144":[2,76],"145":[2,76],"146":[2,76],"147":[2,76],"148":[2,76],"149":[2,76],"150":[2,76],"151":[2,76]},{"1":[2,77],"4":[2,77],"29":[2,77],"30":[2,77],"46":[2,77],"51":[2,77],"59":[2,77],"63":[2,77],"75":[2,77],"76":[2,77],"77":[2,77],"78":[2,77],"81":[2, -77],"82":[2,77],"83":[2,77],"84":[2,77],"87":[2,77],"96":[2,77],"97":[2,77],"98":[2,77],"103":[2,77],"112":[2,77],"114":[2,77],"115":[2,77],"116":[2,77],"120":[2,77],"126":[2,77],"127":[2,77],"128":[2,77],"137":[2,77],"138":[2,77],"139":[2,77],"140":[2,77],"141":[2,77],"142":[2,77],"143":[2,77],"144":[2,77],"145":[2,77],"146":[2,77],"147":[2,77],"148":[2,77],"149":[2,77],"150":[2,77],"151":[2,77]},{"1":[2,35],"4":[2,35],"29":[2,35],"30":[2,35],"51":[2,35],"59":[2,35],"63":[2,35],"75":[2,35],"76":[2, -35],"77":[2,35],"78":[2,35],"81":[2,35],"82":[2,35],"83":[2,35],"84":[2,35],"87":[2,35],"96":[2,35],"97":[2,35],"98":[2,35],"103":[2,35],"112":[2,35],"114":[2,35],"115":[2,35],"116":[2,35],"120":[2,35],"126":[2,35],"127":[2,35],"128":[2,35],"137":[2,35],"138":[2,35],"139":[2,35],"140":[2,35],"141":[2,35],"142":[2,35],"143":[2,35],"144":[2,35],"145":[2,35],"146":[2,35],"147":[2,35],"148":[2,35],"149":[2,35],"150":[2,35],"151":[2,35]},{"1":[2,36],"4":[2,36],"29":[2,36],"30":[2,36],"51":[2,36],"59":[2, -36],"63":[2,36],"75":[2,36],"76":[2,36],"77":[2,36],"78":[2,36],"81":[2,36],"82":[2,36],"83":[2,36],"84":[2,36],"87":[2,36],"96":[2,36],"97":[2,36],"98":[2,36],"103":[2,36],"112":[2,36],"114":[2,36],"115":[2,36],"116":[2,36],"120":[2,36],"126":[2,36],"127":[2,36],"128":[2,36],"137":[2,36],"138":[2,36],"139":[2,36],"140":[2,36],"141":[2,36],"142":[2,36],"143":[2,36],"144":[2,36],"145":[2,36],"146":[2,36],"147":[2,36],"148":[2,36],"149":[2,36],"150":[2,36],"151":[2,36]},{"1":[2,37],"4":[2,37],"29":[2, -37],"30":[2,37],"51":[2,37],"59":[2,37],"63":[2,37],"75":[2,37],"76":[2,37],"77":[2,37],"78":[2,37],"81":[2,37],"82":[2,37],"83":[2,37],"84":[2,37],"87":[2,37],"96":[2,37],"97":[2,37],"98":[2,37],"103":[2,37],"112":[2,37],"114":[2,37],"115":[2,37],"116":[2,37],"120":[2,37],"126":[2,37],"127":[2,37],"128":[2,37],"137":[2,37],"138":[2,37],"139":[2,37],"140":[2,37],"141":[2,37],"142":[2,37],"143":[2,37],"144":[2,37],"145":[2,37],"146":[2,37],"147":[2,37],"148":[2,37],"149":[2,37],"150":[2,37],"151":[2, -37]},{"1":[2,38],"4":[2,38],"29":[2,38],"30":[2,38],"51":[2,38],"59":[2,38],"63":[2,38],"75":[2,38],"76":[2,38],"77":[2,38],"78":[2,38],"81":[2,38],"82":[2,38],"83":[2,38],"84":[2,38],"87":[2,38],"96":[2,38],"97":[2,38],"98":[2,38],"103":[2,38],"112":[2,38],"114":[2,38],"115":[2,38],"116":[2,38],"120":[2,38],"126":[2,38],"127":[2,38],"128":[2,38],"137":[2,38],"138":[2,38],"139":[2,38],"140":[2,38],"141":[2,38],"142":[2,38],"143":[2,38],"144":[2,38],"145":[2,38],"146":[2,38],"147":[2,38],"148":[2, -38],"149":[2,38],"150":[2,38],"151":[2,38]},{"1":[2,39],"4":[2,39],"29":[2,39],"30":[2,39],"51":[2,39],"59":[2,39],"63":[2,39],"75":[2,39],"76":[2,39],"77":[2,39],"78":[2,39],"81":[2,39],"82":[2,39],"83":[2,39],"84":[2,39],"87":[2,39],"96":[2,39],"97":[2,39],"98":[2,39],"103":[2,39],"112":[2,39],"114":[2,39],"115":[2,39],"116":[2,39],"120":[2,39],"126":[2,39],"127":[2,39],"128":[2,39],"137":[2,39],"138":[2,39],"139":[2,39],"140":[2,39],"141":[2,39],"142":[2,39],"143":[2,39],"144":[2,39],"145":[2, -39],"146":[2,39],"147":[2,39],"148":[2,39],"149":[2,39],"150":[2,39],"151":[2,39]},{"1":[2,40],"4":[2,40],"29":[2,40],"30":[2,40],"51":[2,40],"59":[2,40],"63":[2,40],"75":[2,40],"76":[2,40],"77":[2,40],"78":[2,40],"81":[2,40],"82":[2,40],"83":[2,40],"84":[2,40],"87":[2,40],"96":[2,40],"97":[2,40],"98":[2,40],"103":[2,40],"112":[2,40],"114":[2,40],"115":[2,40],"116":[2,40],"120":[2,40],"126":[2,40],"127":[2,40],"128":[2,40],"137":[2,40],"138":[2,40],"139":[2,40],"140":[2,40],"141":[2,40],"142":[2, -40],"143":[2,40],"144":[2,40],"145":[2,40],"146":[2,40],"147":[2,40],"148":[2,40],"149":[2,40],"150":[2,40],"151":[2,40]},{"1":[2,41],"4":[2,41],"29":[2,41],"30":[2,41],"51":[2,41],"59":[2,41],"63":[2,41],"75":[2,41],"76":[2,41],"77":[2,41],"78":[2,41],"81":[2,41],"82":[2,41],"83":[2,41],"84":[2,41],"87":[2,41],"96":[2,41],"97":[2,41],"98":[2,41],"103":[2,41],"112":[2,41],"114":[2,41],"115":[2,41],"116":[2,41],"120":[2,41],"126":[2,41],"127":[2,41],"128":[2,41],"137":[2,41],"138":[2,41],"139":[2, -41],"140":[2,41],"141":[2,41],"142":[2,41],"143":[2,41],"144":[2,41],"145":[2,41],"146":[2,41],"147":[2,41],"148":[2,41],"149":[2,41],"150":[2,41],"151":[2,41]},{"1":[2,42],"4":[2,42],"29":[2,42],"30":[2,42],"51":[2,42],"59":[2,42],"63":[2,42],"75":[2,42],"76":[2,42],"77":[2,42],"78":[2,42],"81":[2,42],"82":[2,42],"83":[2,42],"84":[2,42],"87":[2,42],"96":[2,42],"97":[2,42],"98":[2,42],"103":[2,42],"112":[2,42],"114":[2,42],"115":[2,42],"116":[2,42],"120":[2,42],"126":[2,42],"127":[2,42],"128":[2, -42],"137":[2,42],"138":[2,42],"139":[2,42],"140":[2,42],"141":[2,42],"142":[2,42],"143":[2,42],"144":[2,42],"145":[2,42],"146":[2,42],"147":[2,42],"148":[2,42],"149":[2,42],"150":[2,42],"151":[2,42]},{"1":[2,43],"4":[2,43],"29":[2,43],"30":[2,43],"51":[2,43],"59":[2,43],"63":[2,43],"75":[2,43],"76":[2,43],"77":[2,43],"78":[2,43],"81":[2,43],"82":[2,43],"83":[2,43],"84":[2,43],"87":[2,43],"96":[2,43],"97":[2,43],"98":[2,43],"103":[2,43],"112":[2,43],"114":[2,43],"115":[2,43],"116":[2,43],"120":[2, -43],"126":[2,43],"127":[2,43],"128":[2,43],"137":[2,43],"138":[2,43],"139":[2,43],"140":[2,43],"141":[2,43],"142":[2,43],"143":[2,43],"144":[2,43],"145":[2,43],"146":[2,43],"147":[2,43],"148":[2,43],"149":[2,43],"150":[2,43],"151":[2,43]},{"7":158,"8":7,"9":8,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1, -58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1,35],"95":[1,69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"112":[1,159],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47,"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73], -"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]},{"8":160,"9":140,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"29":[1,164],"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68], -"64":165,"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1,35],"95":[1,69],"99":162,"100":[1,67],"102":[1,66],"103":[1,161],"104":163,"106":[1,44],"110":[1,53],"111":[1,65],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47,"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]},{"1":[2,123],"4":[2,123],"29":[2,123],"30":[2,123],"51":[2,123],"59":[2, -123],"63":[2,123],"75":[2,123],"76":[2,123],"77":[2,123],"78":[2,123],"81":[2,123],"82":[2,123],"83":[2,123],"84":[2,123],"87":[2,123],"96":[2,123],"97":[2,123],"98":[2,123],"103":[2,123],"112":[2,123],"114":[2,123],"115":[2,123],"116":[2,123],"120":[2,123],"126":[2,123],"127":[2,123],"128":[2,123],"137":[2,123],"138":[2,123],"139":[2,123],"140":[2,123],"141":[2,123],"142":[2,123],"143":[2,123],"144":[2,123],"145":[2,123],"146":[2,123],"147":[2,123],"148":[2,123],"149":[2,123],"150":[2,123],"151":[2, -123]},{"1":[2,124],"4":[2,124],"29":[2,124],"30":[2,124],"31":166,"32":[1,84],"51":[2,124],"59":[2,124],"63":[2,124],"75":[2,124],"76":[2,124],"77":[2,124],"78":[2,124],"81":[2,124],"82":[2,124],"83":[2,124],"84":[2,124],"87":[2,124],"96":[2,124],"97":[2,124],"98":[2,124],"103":[2,124],"112":[2,124],"114":[2,124],"115":[2,124],"116":[2,124],"120":[2,124],"126":[2,124],"127":[2,124],"128":[2,124],"137":[2,124],"138":[2,124],"139":[2,124],"140":[2,124],"141":[2,124],"142":[2,124],"143":[2,124],"144":[2, -124],"145":[2,124],"146":[2,124],"147":[2,124],"148":[2,124],"149":[2,124],"150":[2,124],"151":[2,124]},{"1":[2,117],"4":[2,117],"29":[2,117],"30":[2,117],"51":[2,117],"59":[2,117],"63":[2,117],"75":[2,117],"76":[2,117],"77":[2,117],"78":[2,117],"81":[2,117],"82":[2,117],"83":[2,117],"84":[2,117],"87":[2,117],"94":167,"96":[2,117],"97":[1,168],"98":[2,117],"103":[2,117],"112":[2,117],"114":[2,117],"115":[2,117],"116":[2,117],"120":[2,117],"126":[2,117],"127":[2,117],"128":[2,117],"137":[2,117],"138":[2, -117],"139":[2,117],"140":[2,117],"141":[2,117],"142":[2,117],"143":[2,117],"144":[2,117],"145":[2,117],"146":[2,117],"147":[2,117],"148":[2,117],"149":[2,117],"151":[2,117]},{"4":[2,59],"29":[2,59]},{"4":[2,60],"29":[2,60]},{"8":169,"9":140,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1, -60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1,35],"95":[1,69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47,"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40], -"142":[1,41],"143":[1,42]},{"8":170,"9":140,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31, -"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1,35],"95":[1,69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47,"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]},{"8":171,"9":140,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21, -"28":22,"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1,35],"95":[1,69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47, -"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]},{"8":172,"9":140,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51], -"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1,35],"95":[1,69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47,"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]},{"4":[1,138],"6":173,"8":174,"9":140,"10":23,"11":24,"12":[1, -25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"29":[1,6],"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1, -35],"95":[1,69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47,"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]},{"31":179,"32":[1,84],"69":180,"70":181,"72":175,"85":[1,81],"102":[1,66],"123":176,"124":[1,177],"125":178},{"122":182,"126":[1,183],"127":[1,184]},{"1":[2,71],"4":[2,71],"29":[2,71],"30":[2,71],"46":[2,71],"51":[2,71], -"59":[2,71],"63":[2,71],"75":[2,71],"76":[2,71],"77":[2,71],"78":[2,71],"81":[2,71],"82":[2,71],"83":[2,71],"84":[2,71],"87":[2,71],"89":[2,71],"96":[2,71],"97":[2,71],"98":[2,71],"103":[2,71],"112":[2,71],"114":[2,71],"115":[2,71],"116":[2,71],"120":[2,71],"126":[2,71],"127":[2,71],"128":[2,71],"137":[2,71],"138":[2,71],"139":[2,71],"140":[2,71],"141":[2,71],"142":[2,71],"143":[2,71],"144":[2,71],"145":[2,71],"146":[2,71],"147":[2,71],"148":[2,71],"149":[2,71],"150":[2,71],"151":[2,71]},{"1":[2, -74],"4":[2,74],"29":[2,74],"30":[2,74],"46":[2,74],"51":[2,74],"59":[2,74],"63":[2,74],"75":[2,74],"76":[2,74],"77":[2,74],"78":[2,74],"81":[2,74],"82":[2,74],"83":[2,74],"84":[2,74],"87":[2,74],"89":[2,74],"96":[2,74],"97":[2,74],"98":[2,74],"103":[2,74],"112":[2,74],"114":[2,74],"115":[2,74],"116":[2,74],"120":[2,74],"126":[2,74],"127":[2,74],"128":[2,74],"137":[2,74],"138":[2,74],"139":[2,74],"140":[2,74],"141":[2,74],"142":[2,74],"143":[2,74],"144":[2,74],"145":[2,74],"146":[2,74],"147":[2,74], -"148":[2,74],"149":[2,74],"150":[2,74],"151":[2,74]},{"4":[2,94],"28":189,"29":[2,94],"31":187,"32":[1,84],"33":188,"34":[1,82],"35":[1,83],"47":186,"50":[1,51],"59":[2,94],"86":185,"87":[2,94]},{"1":[2,33],"4":[2,33],"29":[2,33],"30":[2,33],"48":[2,33],"51":[2,33],"59":[2,33],"63":[2,33],"75":[2,33],"76":[2,33],"77":[2,33],"78":[2,33],"81":[2,33],"82":[2,33],"83":[2,33],"84":[2,33],"87":[2,33],"96":[2,33],"97":[2,33],"98":[2,33],"103":[2,33],"112":[2,33],"114":[2,33],"115":[2,33],"116":[2,33],"120":[2, -33],"126":[2,33],"127":[2,33],"128":[2,33],"137":[2,33],"138":[2,33],"139":[2,33],"140":[2,33],"141":[2,33],"142":[2,33],"143":[2,33],"144":[2,33],"145":[2,33],"146":[2,33],"147":[2,33],"148":[2,33],"149":[2,33],"150":[2,33],"151":[2,33]},{"1":[2,34],"4":[2,34],"29":[2,34],"30":[2,34],"48":[2,34],"51":[2,34],"59":[2,34],"63":[2,34],"75":[2,34],"76":[2,34],"77":[2,34],"78":[2,34],"81":[2,34],"82":[2,34],"83":[2,34],"84":[2,34],"87":[2,34],"96":[2,34],"97":[2,34],"98":[2,34],"103":[2,34],"112":[2,34], -"114":[2,34],"115":[2,34],"116":[2,34],"120":[2,34],"126":[2,34],"127":[2,34],"128":[2,34],"137":[2,34],"138":[2,34],"139":[2,34],"140":[2,34],"141":[2,34],"142":[2,34],"143":[2,34],"144":[2,34],"145":[2,34],"146":[2,34],"147":[2,34],"148":[2,34],"149":[2,34],"150":[2,34],"151":[2,34]},{"1":[2,32],"4":[2,32],"29":[2,32],"30":[2,32],"46":[2,32],"48":[2,32],"51":[2,32],"59":[2,32],"63":[2,32],"75":[2,32],"76":[2,32],"77":[2,32],"78":[2,32],"81":[2,32],"82":[2,32],"83":[2,32],"84":[2,32],"87":[2,32], -"89":[2,32],"96":[2,32],"97":[2,32],"98":[2,32],"103":[2,32],"112":[2,32],"114":[2,32],"115":[2,32],"116":[2,32],"120":[2,32],"126":[2,32],"127":[2,32],"128":[2,32],"137":[2,32],"138":[2,32],"139":[2,32],"140":[2,32],"141":[2,32],"142":[2,32],"143":[2,32],"144":[2,32],"145":[2,32],"146":[2,32],"147":[2,32],"148":[2,32],"149":[2,32],"150":[2,32],"151":[2,32]},{"1":[2,31],"4":[2,31],"29":[2,31],"30":[2,31],"51":[2,31],"59":[2,31],"63":[2,31],"82":[2,31],"87":[2,31],"98":[2,31],"103":[2,31],"108":[2, -31],"109":[2,31],"112":[2,31],"114":[2,31],"115":[2,31],"116":[2,31],"120":[2,31],"126":[2,31],"127":[2,31],"128":[2,31],"131":[2,31],"133":[2,31],"137":[2,31],"138":[2,31],"139":[2,31],"140":[2,31],"141":[2,31],"142":[2,31],"143":[2,31],"144":[2,31],"145":[2,31],"146":[2,31],"147":[2,31],"148":[2,31],"149":[2,31],"151":[2,31]},{"1":[2,7],"4":[2,7],"7":190,"8":7,"9":8,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18, -"25":19,"26":20,"27":21,"28":22,"30":[2,7],"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1,35],"95":[1,69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"113":45,"114":[1,74],"116":[1, -75],"117":46,"118":[1,76],"119":47,"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]},{"1":[2,4]},{"4":[1,86],"30":[1,191]},{"1":[2,30],"4":[2,30],"29":[2,30],"30":[2,30],"51":[2,30],"59":[2,30],"63":[2,30],"82":[2,30],"87":[2,30],"98":[2,30],"103":[2,30],"108":[2,30],"109":[2,30],"112":[2,30],"114":[2,30],"115":[2,30],"116":[2,30],"120":[2,30],"126":[2,30],"127":[2,30],"128":[2,30],"131":[2,30],"133":[2,30],"137":[2, -30],"138":[2,30],"139":[2,30],"140":[2,30],"141":[2,30],"142":[2,30],"143":[2,30],"144":[2,30],"145":[2,30],"146":[2,30],"147":[2,30],"148":[2,30],"149":[2,30],"151":[2,30]},{"1":[2,201],"4":[2,201],"29":[2,201],"30":[2,201],"51":[2,201],"59":[2,201],"63":[2,201],"82":[2,201],"87":[2,201],"98":[2,201],"103":[2,201],"112":[2,201],"114":[2,201],"115":[2,201],"116":[2,201],"120":[2,201],"126":[2,201],"127":[2,201],"128":[2,201],"137":[2,201],"138":[2,201],"139":[2,201],"140":[2,201],"141":[2,201],"142":[2, -201],"143":[2,201],"144":[2,201],"145":[2,201],"146":[2,201],"147":[2,201],"148":[2,201],"149":[2,201],"151":[2,201]},{"1":[2,202],"4":[2,202],"29":[2,202],"30":[2,202],"51":[2,202],"59":[2,202],"63":[2,202],"82":[2,202],"87":[2,202],"98":[2,202],"103":[2,202],"112":[2,202],"114":[2,202],"115":[2,202],"116":[2,202],"120":[2,202],"126":[2,202],"127":[2,202],"128":[2,202],"137":[2,202],"138":[2,202],"139":[2,202],"140":[2,202],"141":[2,202],"142":[2,202],"143":[2,202],"144":[2,202],"145":[2,202],"146":[2, -202],"147":[2,202],"148":[2,202],"149":[2,202],"151":[2,202]},{"1":[2,56],"4":[2,56],"8":192,"9":140,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"29":[2,56],"30":[2,56],"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"51":[2,56],"52":[1,36],"55":37, -"56":[1,70],"57":[1,71],"59":[2,56],"62":[1,68],"63":[2,56],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"82":[2,56],"85":[1,81],"87":[2,56],"88":[1,50],"92":[1,35],"95":[1,69],"98":[2,56],"100":[1,67],"102":[1,66],"103":[2,56],"106":[1,44],"110":[1,53],"111":[1,65],"112":[2,56],"113":45,"114":[2,56],"115":[2,56],"116":[2,56],"117":46,"118":[1,76],"119":47,"120":[2,56],"121":78,"126":[2,56],"127":[2,56],"128":[2,56],"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"137":[2, -56],"138":[2,56],"139":[2,56],"140":[2,56],"141":[2,56],"142":[2,56],"143":[2,56],"144":[2,56],"145":[2,56],"146":[2,56],"147":[2,56],"148":[2,56],"149":[2,56],"151":[2,56]},{"8":193,"9":140,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1, +Q=/^(-[\-=>]?|\+[+=]?|[*&|\/%=<>^:!?]+)([ \t]*)/;oa=/^([ \t]+)/;r=/^(###([^#][\s\S]*?)(###[ \t]*\n|(###)?$)|(\s*#(?!##[^#])[^\n]*)+)/;j=/^((-|=)>)/;v=/^((\n([ \t]*))+)(\.)?/;X=/\n([ \t]*)/g;E=/\n([ \t]*)/;ia=/^\/([^\/])/;F=/([^\\]#\{.*[^\\]\})/;U=/^(([imgy]{1,4})\b|\W|$)/;S=/\\[^\$]/g;$=/(^`|`$)/g;m=/\n/g;M=/^([+\*&|\/\-%=<>!.\\][<>=&|]*|and|or|is|isnt|not|delete|typeof|instanceof)$/;C=/(\n+([ \t]*)|^([ \t]+))/g;x=/^\s*(([a-zA-Z\$_@]\w*|["'][^\r\n]+?["']|\d+)[ \t]*?[:=][^:=])/;u=/^\s*(\S)/;A=["-=", +"+=","/=","*=","%=","||=","&&=","?=","<<=",">>=",">>>=","&=","^=","|="];ha=["UMINUS","UPLUS","!","!!","~","TYPEOF","DELETE"];L=["&","|","^","&&","||"];ja=["<<",">>",">>>"];d=["<=","<",">",">="];t=["*","/","%"];I=["NUMBER","REGEX","++","--","FALSE","NULL","TRUE","]"];c=["IDENTIFIER","SUPER",")","]","}","STRING","@","THIS","?","::"];D=["INDENT","OUTDENT","TERMINATOR"];K={and:"&&",or:"||",is:"==",isnt:"!=",not:"!","===":"=="}}).call(this)});T["./parser"]=new (function(){var z=this,x=function(){return{trace:function(){}, +yy:{},symbols_:{error:2,Root:3,TERMINATOR:4,Body:5,Block:6,Line:7,Expression:8,Statement:9,Return:10,Throw:11,BREAK:12,CONTINUE:13,DEBUGGER:14,Value:15,Call:16,Code:17,Operation:18,Assign:19,If:20,Try:21,While:22,For:23,Switch:24,Extends:25,Class:26,Existence:27,Comment:28,INDENT:29,OUTDENT:30,Identifier:31,IDENTIFIER:32,AlphaNumeric:33,NUMBER:34,STRING:35,Literal:36,JS:37,REGEX:38,TRUE:39,FALSE:40,YES:41,NO:42,ON:43,OFF:44,Assignable:45,"=":46,AssignObj:47,":":48,RETURN:49,HERECOMMENT:50,"?":51, +PARAM_START:52,ParamList:53,PARAM_END:54,FuncGlyph:55,"->":56,"=>":57,OptComma:58,",":59,Param:60,PARAM:61,"@":62,".":63,Splat:64,SimpleAssignable:65,Accessor:66,Invocation:67,ThisProperty:68,Array:69,Object:70,Parenthetical:71,Range:72,This:73,NULL:74,PROPERTY_ACCESS:75,PROTOTYPE_ACCESS:76,"::":77,SOAK_ACCESS:78,Index:79,Slice:80,INDEX_START:81,INDEX_END:82,INDEX_SOAK:83,INDEX_PROTO:84,"{":85,AssignList:86,"}":87,CLASS:88,EXTENDS:89,ClassBody:90,ClassAssign:91,NEW:92,OptFuncExist:93,Arguments:94, +SUPER:95,FUNC_EXIST:96,CALL_START:97,CALL_END:98,ArgList:99,THIS:100,RangeDots:101,"[":102,"]":103,Arg:104,SimpleArgs:105,TRY:106,Catch:107,FINALLY:108,CATCH:109,THROW:110,"(":111,")":112,WhileSource:113,WHILE:114,WHEN:115,UNTIL:116,Loop:117,LOOP:118,ForBody:119,FOR:120,ForStart:121,ForSource:122,ForVariables:123,ALL:124,ForValue:125,IN:126,OF:127,BY:128,SWITCH:129,Whens:130,ELSE:131,When:132,LEADING_WHEN:133,IfBlock:134,IF:135,UNLESS:136,POST_IF:137,POST_UNLESS:138,UNARY:139,"-":140,"+":141,"--":142, +"++":143,"==":144,"!=":145,MATH:146,SHIFT:147,COMPARE:148,LOGIC:149,COMPOUND_ASSIGN:150,INSTANCEOF:151,$accept:0,$end:1},terminals_:{"2":"error","4":"TERMINATOR","12":"BREAK","13":"CONTINUE","14":"DEBUGGER","29":"INDENT","30":"OUTDENT","32":"IDENTIFIER","34":"NUMBER","35":"STRING","37":"JS","38":"REGEX","39":"TRUE","40":"FALSE","41":"YES","42":"NO","43":"ON","44":"OFF","46":"=","48":":","49":"RETURN","50":"HERECOMMENT","51":"?","52":"PARAM_START","54":"PARAM_END","56":"->","57":"=>","59":",","61":"PARAM", +"62":"@","63":".","74":"NULL","75":"PROPERTY_ACCESS","76":"PROTOTYPE_ACCESS","77":"::","78":"SOAK_ACCESS","81":"INDEX_START","82":"INDEX_END","83":"INDEX_SOAK","84":"INDEX_PROTO","85":"{","87":"}","88":"CLASS","89":"EXTENDS","92":"NEW","95":"SUPER","96":"FUNC_EXIST","97":"CALL_START","98":"CALL_END","100":"THIS","102":"[","103":"]","106":"TRY","108":"FINALLY","109":"CATCH","110":"THROW","111":"(","112":")","114":"WHILE","115":"WHEN","116":"UNTIL","118":"LOOP","120":"FOR","124":"ALL","126":"IN","127":"OF", +"128":"BY","129":"SWITCH","131":"ELSE","133":"LEADING_WHEN","135":"IF","136":"UNLESS","137":"POST_IF","138":"POST_UNLESS","139":"UNARY","140":"-","141":"+","142":"--","143":"++","144":"==","145":"!=","146":"MATH","147":"SHIFT","148":"COMPARE","149":"LOGIC","150":"COMPOUND_ASSIGN","151":"INSTANCEOF"},productions_:[0,[3,0],[3,1],[3,1],[3,2],[5,1],[5,3],[5,2],[7,1],[7,1],[9,1],[9,1],[9,1],[9,1],[9,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[6,3],[6,2],[6,2], +[31,1],[33,1],[33,1],[36,1],[36,1],[36,1],[36,1],[36,1],[36,1],[36,1],[36,1],[36,1],[19,3],[19,5],[47,1],[47,1],[47,3],[47,3],[47,5],[47,5],[47,1],[10,2],[10,1],[28,1],[27,2],[17,5],[17,2],[55,1],[55,1],[58,0],[58,1],[53,0],[53,1],[53,3],[60,1],[60,2],[60,4],[60,5],[64,4],[65,1],[65,2],[65,2],[65,1],[45,1],[45,1],[45,1],[15,1],[15,1],[15,1],[15,1],[15,1],[15,1],[66,2],[66,2],[66,1],[66,2],[66,1],[66,1],[79,3],[79,2],[79,2],[70,4],[86,0],[86,1],[86,3],[86,4],[86,6],[26,2],[26,4],[26,5],[26,7],[26, +4],[91,1],[91,3],[91,5],[90,0],[90,1],[90,3],[90,3],[16,1],[16,2],[16,2],[25,3],[67,3],[67,3],[67,1],[67,2],[93,0],[93,1],[94,2],[94,4],[73,1],[73,1],[101,2],[101,3],[68,2],[72,5],[80,5],[80,4],[80,4],[69,2],[69,4],[99,1],[99,3],[99,4],[99,4],[99,6],[104,1],[104,1],[105,1],[105,3],[21,3],[21,4],[21,5],[107,3],[11,2],[71,3],[71,2],[113,2],[113,4],[113,2],[113,4],[22,2],[22,2],[22,2],[22,1],[117,2],[117,2],[23,2],[23,2],[23,2],[119,2],[119,2],[121,2],[121,3],[125,1],[125,1],[125,1],[123,1],[123,3], +[122,2],[122,2],[122,4],[122,4],[122,4],[122,6],[122,6],[24,5],[24,7],[24,4],[24,6],[130,1],[130,2],[132,3],[132,4],[134,3],[134,3],[134,5],[134,3],[20,1],[20,3],[20,3],[20,3],[20,3],[18,2],[18,2],[18,2],[18,2],[18,2],[18,2],[18,2],[18,3],[18,3],[18,3],[18,3],[18,3],[18,3],[18,3],[18,3],[18,3],[18,3],[18,5],[18,3],[18,3],[18,3],[18,4],[18,4],[18,4]],performAction:function(c,j,h,e,r,d){c=d.length;switch(r){case 1:return this.$=new e.Expressions;case 2:return this.$=new e.Expressions;case 3:return this.$= +d[c-1+1-1];case 4:return this.$=d[c-2+1-1];case 5:this.$=e.Expressions.wrap([d[c-1+1-1]]);break;case 6:this.$=d[c-3+1-1].push(d[c-3+3-1]);break;case 7:this.$=d[c-2+1-1];break;case 8:this.$=d[c-1+1-1];break;case 9:this.$=d[c-1+1-1];break;case 10:this.$=d[c-1+1-1];break;case 11:this.$=d[c-1+1-1];break;case 12:this.$=new e.LiteralNode(d[c-1+1-1]);break;case 13:this.$=new e.LiteralNode(d[c-1+1-1]);break;case 14:this.$=new e.LiteralNode(d[c-1+1-1]);break;case 15:this.$=d[c-1+1-1];break;case 16:this.$= +d[c-1+1-1];break;case 17:this.$=d[c-1+1-1];break;case 18:this.$=d[c-1+1-1];break;case 19:this.$=d[c-1+1-1];break;case 20:this.$=d[c-1+1-1];break;case 21:this.$=d[c-1+1-1];break;case 22:this.$=d[c-1+1-1];break;case 23:this.$=d[c-1+1-1];break;case 24:this.$=d[c-1+1-1];break;case 25:this.$=d[c-1+1-1];break;case 26:this.$=d[c-1+1-1];break;case 27:this.$=d[c-1+1-1];break;case 28:this.$=d[c-1+1-1];break;case 29:this.$=d[c-3+2-1];break;case 30:this.$=new e.Expressions;break;case 31:this.$=e.Expressions.wrap([d[c- +2+2-1]]);break;case 32:this.$=new e.LiteralNode(d[c-1+1-1]);break;case 33:this.$=new e.LiteralNode(d[c-1+1-1]);break;case 34:this.$=new e.LiteralNode(d[c-1+1-1]);break;case 35:this.$=d[c-1+1-1];break;case 36:this.$=new e.LiteralNode(d[c-1+1-1]);break;case 37:this.$=new e.LiteralNode(d[c-1+1-1]);break;case 38:this.$=new e.LiteralNode(true);break;case 39:this.$=new e.LiteralNode(false);break;case 40:this.$=new e.LiteralNode(true);break;case 41:this.$=new e.LiteralNode(false);break;case 42:this.$=new e.LiteralNode(true); +break;case 43:this.$=new e.LiteralNode(false);break;case 44:this.$=new e.AssignNode(d[c-3+1-1],d[c-3+3-1]);break;case 45:this.$=new e.AssignNode(d[c-5+1-1],d[c-5+4-1]);break;case 46:this.$=new e.ValueNode(d[c-1+1-1]);break;case 47:this.$=d[c-1+1-1];break;case 48:this.$=new e.AssignNode(new e.ValueNode(d[c-3+1-1]),d[c-3+3-1],"object");break;case 49:this.$=new e.AssignNode(new e.ValueNode(d[c-3+1-1]),d[c-3+3-1],"object");break;case 50:this.$=new e.AssignNode(new e.ValueNode(d[c-5+1-1]),d[c-5+4-1],"object"); +break;case 51:this.$=new e.AssignNode(new e.ValueNode(d[c-5+1-1]),d[c-5+4-1],"object");break;case 52:this.$=d[c-1+1-1];break;case 53:this.$=new e.ReturnNode(d[c-2+2-1]);break;case 54:this.$=new e.ReturnNode(new e.ValueNode(new e.LiteralNode("null")));break;case 55:this.$=new e.CommentNode(d[c-1+1-1]);break;case 56:this.$=new e.ExistenceNode(d[c-2+1-1]);break;case 57:this.$=new e.CodeNode(d[c-5+2-1],d[c-5+5-1],d[c-5+4-1]);break;case 58:this.$=new e.CodeNode([],d[c-2+2-1],d[c-2+1-1]);break;case 59:this.$= +"func";break;case 60:this.$="boundfunc";break;case 61:this.$=d[c-1+1-1];break;case 62:this.$=d[c-1+1-1];break;case 63:this.$=[];break;case 64:this.$=[d[c-1+1-1]];break;case 65:this.$=d[c-3+1-1].concat([d[c-3+3-1]]);break;case 66:this.$=new e.LiteralNode(d[c-1+1-1]);break;case 67:this.$=new e.ParamNode(d[c-2+2-1],true);break;case 68:this.$=new e.ParamNode(d[c-4+1-1],false,true);break;case 69:this.$=new e.ParamNode(d[c-5+2-1],true,true);break;case 70:this.$=new e.SplatNode(d[c-4+1-1]);break;case 71:this.$= +new e.ValueNode(d[c-1+1-1]);break;case 72:this.$=d[c-2+1-1].push(d[c-2+2-1]);break;case 73:this.$=new e.ValueNode(d[c-2+1-1],[d[c-2+2-1]]);break;case 74:this.$=d[c-1+1-1];break;case 75:this.$=d[c-1+1-1];break;case 76:this.$=new e.ValueNode(d[c-1+1-1]);break;case 77:this.$=new e.ValueNode(d[c-1+1-1]);break;case 78:this.$=d[c-1+1-1];break;case 79:this.$=new e.ValueNode(d[c-1+1-1]);break;case 80:this.$=new e.ValueNode(d[c-1+1-1]);break;case 81:this.$=new e.ValueNode(d[c-1+1-1]);break;case 82:this.$= +d[c-1+1-1];break;case 83:this.$=new e.ValueNode(new e.LiteralNode("null"));break;case 84:this.$=new e.AccessorNode(d[c-2+2-1]);break;case 85:this.$=new e.AccessorNode(d[c-2+2-1],"prototype");break;case 86:this.$=new e.AccessorNode(new e.LiteralNode("prototype"));break;case 87:this.$=new e.AccessorNode(d[c-2+2-1],"soak");break;case 88:this.$=d[c-1+1-1];break;case 89:this.$=new e.SliceNode(d[c-1+1-1]);break;case 90:this.$=new e.IndexNode(d[c-3+2-1]);break;case 91:d[c-2+2-1].soakNode=true;this.$=d[c- +2+2-1];break;case 92:d[c-2+2-1].proto=true;this.$=d[c-2+2-1];break;case 93:this.$=new e.ObjectNode(d[c-4+2-1]);break;case 94:this.$=[];break;case 95:this.$=[d[c-1+1-1]];break;case 96:this.$=d[c-3+1-1].concat([d[c-3+3-1]]);break;case 97:this.$=d[c-4+1-1].concat([d[c-4+4-1]]);break;case 98:this.$=d[c-6+1-1].concat(d[c-6+4-1]);break;case 99:this.$=new e.ClassNode(d[c-2+2-1]);break;case 100:this.$=new e.ClassNode(d[c-4+2-1],d[c-4+4-1]);break;case 101:this.$=new e.ClassNode(d[c-5+2-1],null,d[c-5+4-1]); +break;case 102:this.$=new e.ClassNode(d[c-7+2-1],d[c-7+4-1],d[c-7+6-1]);break;case 103:this.$=new e.ClassNode("__temp__",null,d[c-4+3-1]);break;case 104:this.$=d[c-1+1-1];break;case 105:this.$=new e.AssignNode(new e.ValueNode(d[c-3+1-1]),d[c-3+3-1],"this");break;case 106:this.$=new e.AssignNode(new e.ValueNode(d[c-5+1-1]),d[c-5+4-1],"this");break;case 107:this.$=[];break;case 108:this.$=[d[c-1+1-1]];break;case 109:this.$=d[c-3+1-1].concat(d[c-3+3-1]);break;case 110:this.$=d[c-3+2-1];break;case 111:this.$= +d[c-1+1-1];break;case 112:this.$=d[c-2+2-1].newInstance();break;case 113:this.$=(new e.CallNode(d[c-2+2-1],[])).newInstance();break;case 114:this.$=new e.ExtendsNode(d[c-3+1-1],d[c-3+3-1]);break;case 115:this.$=new e.CallNode(d[c-3+1-1],d[c-3+3-1],d[c-3+2-1]);break;case 116:this.$=new e.CallNode(d[c-3+1-1],d[c-3+3-1],d[c-3+2-1]);break;case 117:this.$=new e.CallNode("super",[new e.SplatNode(new e.LiteralNode("arguments"))]);break;case 118:this.$=new e.CallNode("super",d[c-2+2-1]);break;case 119:this.$= +false;break;case 120:this.$=true;break;case 121:this.$=[];break;case 122:this.$=d[c-4+2-1];break;case 123:this.$=new e.ValueNode(new e.LiteralNode("this"));break;case 124:this.$=new e.ValueNode(new e.LiteralNode("this"));break;case 125:this.$="inclusive";break;case 126:this.$="exclusive";break;case 127:this.$=new e.ValueNode(new e.LiteralNode("this"),[new e.AccessorNode(d[c-2+2-1])]);break;case 128:this.$=new e.RangeNode(d[c-5+2-1],d[c-5+4-1],d[c-5+3-1]);break;case 129:this.$=new e.RangeNode(d[c- +5+2-1],d[c-5+4-1],d[c-5+3-1]);break;case 130:this.$=new e.RangeNode(d[c-4+2-1],null,d[c-4+3-1]);break;case 131:this.$=new e.RangeNode(null,d[c-4+3-1],d[c-4+2-1]);break;case 132:this.$=new e.ArrayNode([]);break;case 133:this.$=new e.ArrayNode(d[c-4+2-1]);break;case 134:this.$=[d[c-1+1-1]];break;case 135:this.$=d[c-3+1-1].concat([d[c-3+3-1]]);break;case 136:this.$=d[c-4+1-1].concat([d[c-4+4-1]]);break;case 137:this.$=d[c-4+2-1];break;case 138:this.$=d[c-6+1-1].concat(d[c-6+4-1]);break;case 139:this.$= +d[c-1+1-1];break;case 140:this.$=d[c-1+1-1];break;case 141:this.$=d[c-1+1-1];break;case 142:this.$=d[c-3+1-1]instanceof Array?d[c-3+1-1].concat([d[c-3+3-1]]):[d[c-3+1-1]].concat([d[c-3+3-1]]);break;case 143:this.$=new e.TryNode(d[c-3+2-1],d[c-3+3-1][0],d[c-3+3-1][1]);break;case 144:this.$=new e.TryNode(d[c-4+2-1],null,null,d[c-4+4-1]);break;case 145:this.$=new e.TryNode(d[c-5+2-1],d[c-5+3-1][0],d[c-5+3-1][1],d[c-5+5-1]);break;case 146:this.$=[d[c-3+2-1],d[c-3+3-1]];break;case 147:this.$=new e.ThrowNode(d[c- +2+2-1]);break;case 148:this.$=new e.ParentheticalNode(d[c-3+2-1]);break;case 149:this.$=new e.ParentheticalNode(new e.LiteralNode(""));break;case 150:this.$=new e.WhileNode(d[c-2+2-1]);break;case 151:this.$=new e.WhileNode(d[c-4+2-1],{guard:d[c-4+4-1]});break;case 152:this.$=new e.WhileNode(d[c-2+2-1],{invert:true});break;case 153:this.$=new e.WhileNode(d[c-4+2-1],{invert:true,guard:d[c-4+4-1]});break;case 154:this.$=d[c-2+1-1].addBody(d[c-2+2-1]);break;case 155:this.$=d[c-2+2-1].addBody(e.Expressions.wrap([d[c- +2+1-1]]));break;case 156:this.$=d[c-2+2-1].addBody(e.Expressions.wrap([d[c-2+1-1]]));break;case 157:this.$=d[c-1+1-1];break;case 158:this.$=(new e.WhileNode(new e.LiteralNode("true"))).addBody(d[c-2+2-1]);break;case 159:this.$=(new e.WhileNode(new e.LiteralNode("true"))).addBody(e.Expressions.wrap([d[c-2+2-1]]));break;case 160:this.$=new e.ForNode(d[c-2+1-1],d[c-2+2-1],d[c-2+2-1].vars[0],d[c-2+2-1].vars[1]);break;case 161:this.$=new e.ForNode(d[c-2+1-1],d[c-2+2-1],d[c-2+2-1].vars[0],d[c-2+2-1].vars[1]); +break;case 162:this.$=new e.ForNode(d[c-2+2-1],d[c-2+1-1],d[c-2+1-1].vars[0],d[c-2+1-1].vars[1]);break;case 163:this.$={source:new e.ValueNode(d[c-2+2-1]),vars:[]};break;case 164:d[c-2+2-1].raw=d[c-2+1-1].raw;d[c-2+2-1].vars=d[c-2+1-1];this.$=d[c-2+2-1];break;case 165:this.$=d[c-2+2-1];break;case 166:d[c-3+3-1].raw=true;this.$=d[c-3+3-1];break;case 167:this.$=d[c-1+1-1];break;case 168:this.$=new e.ValueNode(d[c-1+1-1]);break;case 169:this.$=new e.ValueNode(d[c-1+1-1]);break;case 170:this.$=[d[c-1+ +1-1]];break;case 171:this.$=[d[c-3+1-1],d[c-3+3-1]];break;case 172:this.$={source:d[c-2+2-1]};break;case 173:this.$={source:d[c-2+2-1],object:true};break;case 174:this.$={source:d[c-4+2-1],guard:d[c-4+4-1]};break;case 175:this.$={source:d[c-4+2-1],guard:d[c-4+4-1],object:true};break;case 176:this.$={source:d[c-4+2-1],step:d[c-4+4-1]};break;case 177:this.$={source:d[c-6+2-1],guard:d[c-6+4-1],step:d[c-6+6-1]};break;case 178:this.$={source:d[c-6+2-1],step:d[c-6+4-1],guard:d[c-6+6-1]};break;case 179:this.$= +new e.SwitchNode(d[c-5+2-1],d[c-5+4-1]);break;case 180:this.$=new e.SwitchNode(d[c-7+2-1],d[c-7+4-1],d[c-7+6-1]);break;case 181:this.$=new e.SwitchNode(null,d[c-4+3-1]);break;case 182:this.$=new e.SwitchNode(null,d[c-6+3-1],d[c-6+5-1]);break;case 183:this.$=d[c-1+1-1];break;case 184:this.$=d[c-2+1-1].concat(d[c-2+2-1]);break;case 185:this.$=[[d[c-3+2-1],d[c-3+3-1]]];break;case 186:this.$=[[d[c-4+2-1],d[c-4+3-1]]];break;case 187:this.$=new e.IfNode(d[c-3+2-1],d[c-3+3-1]);break;case 188:this.$=new e.IfNode(d[c- +3+2-1],d[c-3+3-1],{invert:true});break;case 189:this.$=d[c-5+1-1].addElse((new e.IfNode(d[c-5+4-1],d[c-5+5-1])).forceStatement());break;case 190:this.$=d[c-3+1-1].addElse(d[c-3+3-1]);break;case 191:this.$=d[c-1+1-1];break;case 192:this.$=new e.IfNode(d[c-3+3-1],e.Expressions.wrap([d[c-3+1-1]]),{statement:true});break;case 193:this.$=new e.IfNode(d[c-3+3-1],e.Expressions.wrap([d[c-3+1-1]]),{statement:true});break;case 194:this.$=new e.IfNode(d[c-3+3-1],e.Expressions.wrap([d[c-3+1-1]]),{statement:true, +invert:true});break;case 195:this.$=new e.IfNode(d[c-3+3-1],e.Expressions.wrap([d[c-3+1-1]]),{statement:true,invert:true});break;case 196:this.$=new e.OpNode(d[c-2+1-1],d[c-2+2-1]);break;case 197:this.$=new e.OpNode("-",d[c-2+2-1]);break;case 198:this.$=new e.OpNode("+",d[c-2+2-1]);break;case 199:this.$=new e.OpNode("--",d[c-2+2-1]);break;case 200:this.$=new e.OpNode("++",d[c-2+2-1]);break;case 201:this.$=new e.OpNode("--",d[c-2+1-1],null,true);break;case 202:this.$=new e.OpNode("++",d[c-2+1-1],null, +true);break;case 203:this.$=new e.OpNode("?",d[c-3+1-1],d[c-3+3-1]);break;case 204:this.$=new e.OpNode("+",d[c-3+1-1],d[c-3+3-1]);break;case 205:this.$=new e.OpNode("-",d[c-3+1-1],d[c-3+3-1]);break;case 206:this.$=new e.OpNode("==",d[c-3+1-1],d[c-3+3-1]);break;case 207:this.$=new e.OpNode("!=",d[c-3+1-1],d[c-3+3-1]);break;case 208:this.$=new e.OpNode(d[c-3+2-1],d[c-3+1-1],d[c-3+3-1]);break;case 209:this.$=new e.OpNode(d[c-3+2-1],d[c-3+1-1],d[c-3+3-1]);break;case 210:this.$=new e.OpNode(d[c-3+2-1], +d[c-3+1-1],d[c-3+3-1]);break;case 211:this.$=new e.OpNode(d[c-3+2-1],d[c-3+1-1],d[c-3+3-1]);break;case 212:this.$=new e.OpNode(d[c-3+2-1],d[c-3+1-1],d[c-3+3-1]);break;case 213:this.$=new e.OpNode(d[c-5+2-1],d[c-5+1-1],d[c-5+4-1]);break;case 214:this.$=new e.InNode(d[c-3+1-1],d[c-3+3-1]);break;case 215:this.$=new e.OpNode("in",d[c-3+1-1],d[c-3+3-1]);break;case 216:this.$=new e.OpNode("instanceof",d[c-3+1-1],d[c-3+3-1]);break;case 217:this.$=new e.OpNode(d[c-4+2-1],new e.InNode(d[c-4+1-1],d[c-4+4-1])); +break;case 218:this.$=new e.OpNode(d[c-4+2-1],new e.ParentheticalNode(new e.OpNode("in",d[c-4+1-1],d[c-4+4-1])));break;case 219:this.$=new e.OpNode(d[c-4+2-1],new e.ParentheticalNode(new e.OpNode("instanceof",d[c-4+1-1],d[c-4+4-1])));break}},table:[{"1":[2,1],"3":1,"4":[1,2],"5":3,"6":4,"7":5,"8":7,"9":8,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"29":[1,6],"31":79,"32":[1,84],"33":56, +"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1,35],"95":[1,69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47,"120":[1,77],"121":78,"129":[1, +48],"134":43,"135":[1,72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]},{"1":[3]},{"1":[2,2],"28":85,"50":[1,51]},{"1":[2,3],"4":[1,86]},{"4":[1,87]},{"1":[2,5],"4":[2,5],"30":[2,5]},{"5":88,"7":5,"8":7,"9":8,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"30":[1,89],"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58], +"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1,35],"95":[1,69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47,"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"139":[1,38],"140":[1, +39],"141":[1,40],"142":[1,41],"143":[1,42]},{"1":[2,8],"4":[2,8],"30":[2,8],"51":[1,92],"112":[2,8],"113":107,"114":[1,74],"116":[1,75],"119":108,"120":[1,77],"121":78,"126":[1,101],"127":[1,102],"137":[1,105],"138":[1,106],"139":[1,104],"140":[1,94],"141":[1,93],"142":[1,90],"143":[1,91],"144":[1,95],"145":[1,96],"146":[1,97],"147":[1,98],"148":[1,99],"149":[1,100],"151":[1,103]},{"1":[2,9],"4":[2,9],"30":[2,9],"112":[2,9],"113":111,"114":[1,74],"116":[1,75],"119":112,"120":[1,77],"121":78,"137":[1, +109],"138":[1,110]},{"1":[2,15],"4":[2,15],"29":[2,15],"30":[2,15],"51":[2,15],"59":[2,15],"63":[2,15],"66":115,"75":[1,117],"76":[1,118],"77":[1,119],"78":[1,120],"79":121,"80":122,"81":[1,123],"82":[2,15],"83":[1,124],"84":[1,125],"87":[2,15],"93":114,"96":[1,116],"97":[2,119],"98":[2,15],"103":[2,15],"112":[2,15],"114":[2,15],"115":[2,15],"116":[2,15],"120":[2,15],"126":[2,15],"127":[2,15],"128":[2,15],"137":[2,15],"138":[2,15],"139":[2,15],"140":[2,15],"141":[2,15],"142":[2,15],"143":[2,15],"144":[2, +15],"145":[2,15],"146":[2,15],"147":[2,15],"148":[2,15],"149":[2,15],"150":[1,113],"151":[2,15]},{"1":[2,16],"4":[2,16],"29":[2,16],"30":[2,16],"51":[2,16],"59":[2,16],"63":[2,16],"82":[2,16],"87":[2,16],"98":[2,16],"103":[2,16],"112":[2,16],"114":[2,16],"115":[2,16],"116":[2,16],"120":[2,16],"126":[2,16],"127":[2,16],"128":[2,16],"137":[2,16],"138":[2,16],"139":[2,16],"140":[2,16],"141":[2,16],"142":[2,16],"143":[2,16],"144":[2,16],"145":[2,16],"146":[2,16],"147":[2,16],"148":[2,16],"149":[2,16], +"151":[2,16]},{"1":[2,17],"4":[2,17],"29":[2,17],"30":[2,17],"51":[2,17],"59":[2,17],"63":[2,17],"82":[2,17],"87":[2,17],"98":[2,17],"103":[2,17],"112":[2,17],"114":[2,17],"115":[2,17],"116":[2,17],"120":[2,17],"126":[2,17],"127":[2,17],"128":[2,17],"137":[2,17],"138":[2,17],"139":[2,17],"140":[2,17],"141":[2,17],"142":[2,17],"143":[2,17],"144":[2,17],"145":[2,17],"146":[2,17],"147":[2,17],"148":[2,17],"149":[2,17],"151":[2,17]},{"1":[2,18],"4":[2,18],"29":[2,18],"30":[2,18],"51":[2,18],"59":[2,18], +"63":[2,18],"82":[2,18],"87":[2,18],"98":[2,18],"103":[2,18],"112":[2,18],"114":[2,18],"115":[2,18],"116":[2,18],"120":[2,18],"126":[2,18],"127":[2,18],"128":[2,18],"137":[2,18],"138":[2,18],"139":[2,18],"140":[2,18],"141":[2,18],"142":[2,18],"143":[2,18],"144":[2,18],"145":[2,18],"146":[2,18],"147":[2,18],"148":[2,18],"149":[2,18],"151":[2,18]},{"1":[2,19],"4":[2,19],"29":[2,19],"30":[2,19],"51":[2,19],"59":[2,19],"63":[2,19],"82":[2,19],"87":[2,19],"98":[2,19],"103":[2,19],"112":[2,19],"114":[2, +19],"115":[2,19],"116":[2,19],"120":[2,19],"126":[2,19],"127":[2,19],"128":[2,19],"137":[2,19],"138":[2,19],"139":[2,19],"140":[2,19],"141":[2,19],"142":[2,19],"143":[2,19],"144":[2,19],"145":[2,19],"146":[2,19],"147":[2,19],"148":[2,19],"149":[2,19],"151":[2,19]},{"1":[2,20],"4":[2,20],"29":[2,20],"30":[2,20],"51":[2,20],"59":[2,20],"63":[2,20],"82":[2,20],"87":[2,20],"98":[2,20],"103":[2,20],"112":[2,20],"114":[2,20],"115":[2,20],"116":[2,20],"120":[2,20],"126":[2,20],"127":[2,20],"128":[2,20], +"137":[2,20],"138":[2,20],"139":[2,20],"140":[2,20],"141":[2,20],"142":[2,20],"143":[2,20],"144":[2,20],"145":[2,20],"146":[2,20],"147":[2,20],"148":[2,20],"149":[2,20],"151":[2,20]},{"1":[2,21],"4":[2,21],"29":[2,21],"30":[2,21],"51":[2,21],"59":[2,21],"63":[2,21],"82":[2,21],"87":[2,21],"98":[2,21],"103":[2,21],"112":[2,21],"114":[2,21],"115":[2,21],"116":[2,21],"120":[2,21],"126":[2,21],"127":[2,21],"128":[2,21],"137":[2,21],"138":[2,21],"139":[2,21],"140":[2,21],"141":[2,21],"142":[2,21],"143":[2, +21],"144":[2,21],"145":[2,21],"146":[2,21],"147":[2,21],"148":[2,21],"149":[2,21],"151":[2,21]},{"1":[2,22],"4":[2,22],"29":[2,22],"30":[2,22],"51":[2,22],"59":[2,22],"63":[2,22],"82":[2,22],"87":[2,22],"98":[2,22],"103":[2,22],"112":[2,22],"114":[2,22],"115":[2,22],"116":[2,22],"120":[2,22],"126":[2,22],"127":[2,22],"128":[2,22],"137":[2,22],"138":[2,22],"139":[2,22],"140":[2,22],"141":[2,22],"142":[2,22],"143":[2,22],"144":[2,22],"145":[2,22],"146":[2,22],"147":[2,22],"148":[2,22],"149":[2,22], +"151":[2,22]},{"1":[2,23],"4":[2,23],"29":[2,23],"30":[2,23],"51":[2,23],"59":[2,23],"63":[2,23],"82":[2,23],"87":[2,23],"98":[2,23],"103":[2,23],"112":[2,23],"114":[2,23],"115":[2,23],"116":[2,23],"120":[2,23],"126":[2,23],"127":[2,23],"128":[2,23],"137":[2,23],"138":[2,23],"139":[2,23],"140":[2,23],"141":[2,23],"142":[2,23],"143":[2,23],"144":[2,23],"145":[2,23],"146":[2,23],"147":[2,23],"148":[2,23],"149":[2,23],"151":[2,23]},{"1":[2,24],"4":[2,24],"29":[2,24],"30":[2,24],"51":[2,24],"59":[2,24], +"63":[2,24],"82":[2,24],"87":[2,24],"98":[2,24],"103":[2,24],"112":[2,24],"114":[2,24],"115":[2,24],"116":[2,24],"120":[2,24],"126":[2,24],"127":[2,24],"128":[2,24],"137":[2,24],"138":[2,24],"139":[2,24],"140":[2,24],"141":[2,24],"142":[2,24],"143":[2,24],"144":[2,24],"145":[2,24],"146":[2,24],"147":[2,24],"148":[2,24],"149":[2,24],"151":[2,24]},{"1":[2,25],"4":[2,25],"29":[2,25],"30":[2,25],"51":[2,25],"59":[2,25],"63":[2,25],"82":[2,25],"87":[2,25],"98":[2,25],"103":[2,25],"112":[2,25],"114":[2, +25],"115":[2,25],"116":[2,25],"120":[2,25],"126":[2,25],"127":[2,25],"128":[2,25],"137":[2,25],"138":[2,25],"139":[2,25],"140":[2,25],"141":[2,25],"142":[2,25],"143":[2,25],"144":[2,25],"145":[2,25],"146":[2,25],"147":[2,25],"148":[2,25],"149":[2,25],"151":[2,25]},{"1":[2,26],"4":[2,26],"29":[2,26],"30":[2,26],"51":[2,26],"59":[2,26],"63":[2,26],"82":[2,26],"87":[2,26],"98":[2,26],"103":[2,26],"112":[2,26],"114":[2,26],"115":[2,26],"116":[2,26],"120":[2,26],"126":[2,26],"127":[2,26],"128":[2,26], +"137":[2,26],"138":[2,26],"139":[2,26],"140":[2,26],"141":[2,26],"142":[2,26],"143":[2,26],"144":[2,26],"145":[2,26],"146":[2,26],"147":[2,26],"148":[2,26],"149":[2,26],"151":[2,26]},{"1":[2,27],"4":[2,27],"29":[2,27],"30":[2,27],"51":[2,27],"59":[2,27],"63":[2,27],"82":[2,27],"87":[2,27],"98":[2,27],"103":[2,27],"112":[2,27],"114":[2,27],"115":[2,27],"116":[2,27],"120":[2,27],"126":[2,27],"127":[2,27],"128":[2,27],"137":[2,27],"138":[2,27],"139":[2,27],"140":[2,27],"141":[2,27],"142":[2,27],"143":[2, +27],"144":[2,27],"145":[2,27],"146":[2,27],"147":[2,27],"148":[2,27],"149":[2,27],"151":[2,27]},{"1":[2,28],"4":[2,28],"29":[2,28],"30":[2,28],"51":[2,28],"59":[2,28],"63":[2,28],"82":[2,28],"87":[2,28],"98":[2,28],"103":[2,28],"112":[2,28],"114":[2,28],"115":[2,28],"116":[2,28],"120":[2,28],"126":[2,28],"127":[2,28],"128":[2,28],"137":[2,28],"138":[2,28],"139":[2,28],"140":[2,28],"141":[2,28],"142":[2,28],"143":[2,28],"144":[2,28],"145":[2,28],"146":[2,28],"147":[2,28],"148":[2,28],"149":[2,28], +"151":[2,28]},{"1":[2,10],"4":[2,10],"30":[2,10],"112":[2,10],"114":[2,10],"116":[2,10],"120":[2,10],"137":[2,10],"138":[2,10]},{"1":[2,11],"4":[2,11],"30":[2,11],"112":[2,11],"114":[2,11],"116":[2,11],"120":[2,11],"137":[2,11],"138":[2,11]},{"1":[2,12],"4":[2,12],"30":[2,12],"112":[2,12],"114":[2,12],"116":[2,12],"120":[2,12],"137":[2,12],"138":[2,12]},{"1":[2,13],"4":[2,13],"30":[2,13],"112":[2,13],"114":[2,13],"116":[2,13],"120":[2,13],"137":[2,13],"138":[2,13]},{"1":[2,14],"4":[2,14],"30":[2, +14],"112":[2,14],"114":[2,14],"116":[2,14],"120":[2,14],"137":[2,14],"138":[2,14]},{"1":[2,78],"4":[2,78],"29":[2,78],"30":[2,78],"46":[1,126],"51":[2,78],"59":[2,78],"63":[2,78],"75":[2,78],"76":[2,78],"77":[2,78],"78":[2,78],"81":[2,78],"82":[2,78],"83":[2,78],"84":[2,78],"87":[2,78],"96":[2,78],"97":[2,78],"98":[2,78],"103":[2,78],"112":[2,78],"114":[2,78],"115":[2,78],"116":[2,78],"120":[2,78],"126":[2,78],"127":[2,78],"128":[2,78],"137":[2,78],"138":[2,78],"139":[2,78],"140":[2,78],"141":[2, +78],"142":[2,78],"143":[2,78],"144":[2,78],"145":[2,78],"146":[2,78],"147":[2,78],"148":[2,78],"149":[2,78],"150":[2,78],"151":[2,78]},{"1":[2,79],"4":[2,79],"29":[2,79],"30":[2,79],"51":[2,79],"59":[2,79],"63":[2,79],"75":[2,79],"76":[2,79],"77":[2,79],"78":[2,79],"81":[2,79],"82":[2,79],"83":[2,79],"84":[2,79],"87":[2,79],"96":[2,79],"97":[2,79],"98":[2,79],"103":[2,79],"112":[2,79],"114":[2,79],"115":[2,79],"116":[2,79],"120":[2,79],"126":[2,79],"127":[2,79],"128":[2,79],"137":[2,79],"138":[2, +79],"139":[2,79],"140":[2,79],"141":[2,79],"142":[2,79],"143":[2,79],"144":[2,79],"145":[2,79],"146":[2,79],"147":[2,79],"148":[2,79],"149":[2,79],"150":[2,79],"151":[2,79]},{"1":[2,80],"4":[2,80],"29":[2,80],"30":[2,80],"51":[2,80],"59":[2,80],"63":[2,80],"75":[2,80],"76":[2,80],"77":[2,80],"78":[2,80],"81":[2,80],"82":[2,80],"83":[2,80],"84":[2,80],"87":[2,80],"96":[2,80],"97":[2,80],"98":[2,80],"103":[2,80],"112":[2,80],"114":[2,80],"115":[2,80],"116":[2,80],"120":[2,80],"126":[2,80],"127":[2, +80],"128":[2,80],"137":[2,80],"138":[2,80],"139":[2,80],"140":[2,80],"141":[2,80],"142":[2,80],"143":[2,80],"144":[2,80],"145":[2,80],"146":[2,80],"147":[2,80],"148":[2,80],"149":[2,80],"150":[2,80],"151":[2,80]},{"1":[2,81],"4":[2,81],"29":[2,81],"30":[2,81],"51":[2,81],"59":[2,81],"63":[2,81],"75":[2,81],"76":[2,81],"77":[2,81],"78":[2,81],"81":[2,81],"82":[2,81],"83":[2,81],"84":[2,81],"87":[2,81],"96":[2,81],"97":[2,81],"98":[2,81],"103":[2,81],"112":[2,81],"114":[2,81],"115":[2,81],"116":[2, +81],"120":[2,81],"126":[2,81],"127":[2,81],"128":[2,81],"137":[2,81],"138":[2,81],"139":[2,81],"140":[2,81],"141":[2,81],"142":[2,81],"143":[2,81],"144":[2,81],"145":[2,81],"146":[2,81],"147":[2,81],"148":[2,81],"149":[2,81],"150":[2,81],"151":[2,81]},{"1":[2,82],"4":[2,82],"29":[2,82],"30":[2,82],"51":[2,82],"59":[2,82],"63":[2,82],"75":[2,82],"76":[2,82],"77":[2,82],"78":[2,82],"81":[2,82],"82":[2,82],"83":[2,82],"84":[2,82],"87":[2,82],"96":[2,82],"97":[2,82],"98":[2,82],"103":[2,82],"112":[2, +82],"114":[2,82],"115":[2,82],"116":[2,82],"120":[2,82],"126":[2,82],"127":[2,82],"128":[2,82],"137":[2,82],"138":[2,82],"139":[2,82],"140":[2,82],"141":[2,82],"142":[2,82],"143":[2,82],"144":[2,82],"145":[2,82],"146":[2,82],"147":[2,82],"148":[2,82],"149":[2,82],"150":[2,82],"151":[2,82]},{"1":[2,83],"4":[2,83],"29":[2,83],"30":[2,83],"51":[2,83],"59":[2,83],"63":[2,83],"75":[2,83],"76":[2,83],"77":[2,83],"78":[2,83],"81":[2,83],"82":[2,83],"83":[2,83],"84":[2,83],"87":[2,83],"96":[2,83],"97":[2, +83],"98":[2,83],"103":[2,83],"112":[2,83],"114":[2,83],"115":[2,83],"116":[2,83],"120":[2,83],"126":[2,83],"127":[2,83],"128":[2,83],"137":[2,83],"138":[2,83],"139":[2,83],"140":[2,83],"141":[2,83],"142":[2,83],"143":[2,83],"144":[2,83],"145":[2,83],"146":[2,83],"147":[2,83],"148":[2,83],"149":[2,83],"150":[2,83],"151":[2,83]},{"1":[2,111],"4":[2,111],"29":[2,111],"30":[2,111],"51":[2,111],"59":[2,111],"63":[2,111],"66":128,"75":[1,117],"76":[1,118],"77":[1,119],"78":[1,120],"79":121,"80":122,"81":[1, +123],"82":[2,111],"83":[1,124],"84":[1,125],"87":[2,111],"93":127,"96":[1,116],"97":[2,119],"98":[2,111],"103":[2,111],"112":[2,111],"114":[2,111],"115":[2,111],"116":[2,111],"120":[2,111],"126":[2,111],"127":[2,111],"128":[2,111],"137":[2,111],"138":[2,111],"139":[2,111],"140":[2,111],"141":[2,111],"142":[2,111],"143":[2,111],"144":[2,111],"145":[2,111],"146":[2,111],"147":[2,111],"148":[2,111],"149":[2,111],"151":[2,111]},{"15":130,"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1, +57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":131,"62":[1,68],"65":132,"67":129,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"95":[1,69],"100":[1,67],"102":[1,66],"111":[1,65]},{"53":133,"54":[2,63],"59":[2,63],"60":134,"61":[1,135],"62":[1,136]},{"4":[1,138],"6":137,"29":[1,6]},{"8":139,"9":140,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18, +"25":19,"26":20,"27":21,"28":22,"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1,35],"95":[1,69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"113":45,"114":[1,74],"116":[1,75],"117":46, +"118":[1,76],"119":47,"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]},{"8":141,"9":140,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28, +"49":[1,52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1,35],"95":[1,69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47,"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]},{"8":142,"9":140,"10":23,"11":24, +"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1,35], +"95":[1,69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47,"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]},{"8":143,"9":140,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1, +83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1,35],"95":[1,69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47,"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1, +72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]},{"8":144,"9":140,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1, +68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1,35],"95":[1,69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47,"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]},{"1":[2,191],"4":[2,191],"29":[2,191],"30":[2,191],"51":[2,191],"59":[2,191],"63":[2,191],"82":[2,191],"87":[2, +191],"98":[2,191],"103":[2,191],"112":[2,191],"114":[2,191],"115":[2,191],"116":[2,191],"120":[2,191],"126":[2,191],"127":[2,191],"128":[2,191],"131":[1,145],"137":[2,191],"138":[2,191],"139":[2,191],"140":[2,191],"141":[2,191],"142":[2,191],"143":[2,191],"144":[2,191],"145":[2,191],"146":[2,191],"147":[2,191],"148":[2,191],"149":[2,191],"151":[2,191]},{"4":[1,138],"6":146,"29":[1,6]},{"4":[1,138],"6":147,"29":[1,6]},{"1":[2,157],"4":[2,157],"29":[2,157],"30":[2,157],"51":[2,157],"59":[2,157],"63":[2, +157],"82":[2,157],"87":[2,157],"98":[2,157],"103":[2,157],"112":[2,157],"114":[2,157],"115":[2,157],"116":[2,157],"120":[2,157],"126":[2,157],"127":[2,157],"128":[2,157],"137":[2,157],"138":[2,157],"139":[2,157],"140":[2,157],"141":[2,157],"142":[2,157],"143":[2,157],"144":[2,157],"145":[2,157],"146":[2,157],"147":[2,157],"148":[2,157],"149":[2,157],"151":[2,157]},{"4":[1,138],"6":148,"29":[1,6]},{"8":149,"9":140,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13, +"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"29":[1,150],"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1,35],"95":[1,69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1, +53],"111":[1,65],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47,"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]},{"1":[2,75],"4":[2,75],"29":[2,75],"30":[2,75],"46":[2,75],"51":[2,75],"59":[2,75],"63":[2,75],"75":[2,75],"76":[2,75],"77":[2,75],"78":[2,75],"81":[2,75],"82":[2,75],"83":[2,75],"84":[2,75],"87":[2,75],"89":[1,151],"96":[2,75],"97":[2,75],"98":[2,75],"103":[2,75],"112":[2,75],"114":[2, +75],"115":[2,75],"116":[2,75],"120":[2,75],"126":[2,75],"127":[2,75],"128":[2,75],"137":[2,75],"138":[2,75],"139":[2,75],"140":[2,75],"141":[2,75],"142":[2,75],"143":[2,75],"144":[2,75],"145":[2,75],"146":[2,75],"147":[2,75],"148":[2,75],"149":[2,75],"150":[2,75],"151":[2,75]},{"15":154,"29":[1,153],"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":131,"62":[1,68],"65":152,"67":155,"68":80, +"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"95":[1,69],"100":[1,67],"102":[1,66],"111":[1,65]},{"1":[2,55],"4":[2,55],"29":[2,55],"30":[2,55],"51":[2,55],"59":[2,55],"63":[2,55],"82":[2,55],"87":[2,55],"98":[2,55],"103":[2,55],"108":[2,55],"109":[2,55],"112":[2,55],"114":[2,55],"115":[2,55],"116":[2,55],"120":[2,55],"126":[2,55],"127":[2,55],"128":[2,55],"131":[2,55],"133":[2,55],"137":[2,55],"138":[2,55],"139":[2,55],"140":[2,55],"141":[2,55],"142":[2,55],"143":[2,55],"144":[2, +55],"145":[2,55],"146":[2,55],"147":[2,55],"148":[2,55],"149":[2,55],"151":[2,55]},{"1":[2,54],"4":[2,54],"8":156,"9":140,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"30":[2,54],"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37, +"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1,35],"95":[1,69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"112":[2,54],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47,"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"137":[2,54],"138":[2,54],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]},{"8":157,"9":140,"10":23,"11":24,"12":[1, +25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1,35],"95":[1, +69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47,"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]},{"1":[2,76],"4":[2,76],"29":[2,76],"30":[2,76],"46":[2,76],"51":[2,76],"59":[2,76],"63":[2,76],"75":[2,76],"76":[2,76],"77":[2,76],"78":[2,76],"81":[2,76],"82":[2,76],"83":[2,76],"84":[2,76],"87":[2,76],"96":[2,76],"97":[2,76],"98":[2, +76],"103":[2,76],"112":[2,76],"114":[2,76],"115":[2,76],"116":[2,76],"120":[2,76],"126":[2,76],"127":[2,76],"128":[2,76],"137":[2,76],"138":[2,76],"139":[2,76],"140":[2,76],"141":[2,76],"142":[2,76],"143":[2,76],"144":[2,76],"145":[2,76],"146":[2,76],"147":[2,76],"148":[2,76],"149":[2,76],"150":[2,76],"151":[2,76]},{"1":[2,77],"4":[2,77],"29":[2,77],"30":[2,77],"46":[2,77],"51":[2,77],"59":[2,77],"63":[2,77],"75":[2,77],"76":[2,77],"77":[2,77],"78":[2,77],"81":[2,77],"82":[2,77],"83":[2,77],"84":[2, +77],"87":[2,77],"96":[2,77],"97":[2,77],"98":[2,77],"103":[2,77],"112":[2,77],"114":[2,77],"115":[2,77],"116":[2,77],"120":[2,77],"126":[2,77],"127":[2,77],"128":[2,77],"137":[2,77],"138":[2,77],"139":[2,77],"140":[2,77],"141":[2,77],"142":[2,77],"143":[2,77],"144":[2,77],"145":[2,77],"146":[2,77],"147":[2,77],"148":[2,77],"149":[2,77],"150":[2,77],"151":[2,77]},{"1":[2,35],"4":[2,35],"29":[2,35],"30":[2,35],"51":[2,35],"59":[2,35],"63":[2,35],"75":[2,35],"76":[2,35],"77":[2,35],"78":[2,35],"81":[2, +35],"82":[2,35],"83":[2,35],"84":[2,35],"87":[2,35],"96":[2,35],"97":[2,35],"98":[2,35],"103":[2,35],"112":[2,35],"114":[2,35],"115":[2,35],"116":[2,35],"120":[2,35],"126":[2,35],"127":[2,35],"128":[2,35],"137":[2,35],"138":[2,35],"139":[2,35],"140":[2,35],"141":[2,35],"142":[2,35],"143":[2,35],"144":[2,35],"145":[2,35],"146":[2,35],"147":[2,35],"148":[2,35],"149":[2,35],"150":[2,35],"151":[2,35]},{"1":[2,36],"4":[2,36],"29":[2,36],"30":[2,36],"51":[2,36],"59":[2,36],"63":[2,36],"75":[2,36],"76":[2, +36],"77":[2,36],"78":[2,36],"81":[2,36],"82":[2,36],"83":[2,36],"84":[2,36],"87":[2,36],"96":[2,36],"97":[2,36],"98":[2,36],"103":[2,36],"112":[2,36],"114":[2,36],"115":[2,36],"116":[2,36],"120":[2,36],"126":[2,36],"127":[2,36],"128":[2,36],"137":[2,36],"138":[2,36],"139":[2,36],"140":[2,36],"141":[2,36],"142":[2,36],"143":[2,36],"144":[2,36],"145":[2,36],"146":[2,36],"147":[2,36],"148":[2,36],"149":[2,36],"150":[2,36],"151":[2,36]},{"1":[2,37],"4":[2,37],"29":[2,37],"30":[2,37],"51":[2,37],"59":[2, +37],"63":[2,37],"75":[2,37],"76":[2,37],"77":[2,37],"78":[2,37],"81":[2,37],"82":[2,37],"83":[2,37],"84":[2,37],"87":[2,37],"96":[2,37],"97":[2,37],"98":[2,37],"103":[2,37],"112":[2,37],"114":[2,37],"115":[2,37],"116":[2,37],"120":[2,37],"126":[2,37],"127":[2,37],"128":[2,37],"137":[2,37],"138":[2,37],"139":[2,37],"140":[2,37],"141":[2,37],"142":[2,37],"143":[2,37],"144":[2,37],"145":[2,37],"146":[2,37],"147":[2,37],"148":[2,37],"149":[2,37],"150":[2,37],"151":[2,37]},{"1":[2,38],"4":[2,38],"29":[2, +38],"30":[2,38],"51":[2,38],"59":[2,38],"63":[2,38],"75":[2,38],"76":[2,38],"77":[2,38],"78":[2,38],"81":[2,38],"82":[2,38],"83":[2,38],"84":[2,38],"87":[2,38],"96":[2,38],"97":[2,38],"98":[2,38],"103":[2,38],"112":[2,38],"114":[2,38],"115":[2,38],"116":[2,38],"120":[2,38],"126":[2,38],"127":[2,38],"128":[2,38],"137":[2,38],"138":[2,38],"139":[2,38],"140":[2,38],"141":[2,38],"142":[2,38],"143":[2,38],"144":[2,38],"145":[2,38],"146":[2,38],"147":[2,38],"148":[2,38],"149":[2,38],"150":[2,38],"151":[2, +38]},{"1":[2,39],"4":[2,39],"29":[2,39],"30":[2,39],"51":[2,39],"59":[2,39],"63":[2,39],"75":[2,39],"76":[2,39],"77":[2,39],"78":[2,39],"81":[2,39],"82":[2,39],"83":[2,39],"84":[2,39],"87":[2,39],"96":[2,39],"97":[2,39],"98":[2,39],"103":[2,39],"112":[2,39],"114":[2,39],"115":[2,39],"116":[2,39],"120":[2,39],"126":[2,39],"127":[2,39],"128":[2,39],"137":[2,39],"138":[2,39],"139":[2,39],"140":[2,39],"141":[2,39],"142":[2,39],"143":[2,39],"144":[2,39],"145":[2,39],"146":[2,39],"147":[2,39],"148":[2, +39],"149":[2,39],"150":[2,39],"151":[2,39]},{"1":[2,40],"4":[2,40],"29":[2,40],"30":[2,40],"51":[2,40],"59":[2,40],"63":[2,40],"75":[2,40],"76":[2,40],"77":[2,40],"78":[2,40],"81":[2,40],"82":[2,40],"83":[2,40],"84":[2,40],"87":[2,40],"96":[2,40],"97":[2,40],"98":[2,40],"103":[2,40],"112":[2,40],"114":[2,40],"115":[2,40],"116":[2,40],"120":[2,40],"126":[2,40],"127":[2,40],"128":[2,40],"137":[2,40],"138":[2,40],"139":[2,40],"140":[2,40],"141":[2,40],"142":[2,40],"143":[2,40],"144":[2,40],"145":[2, +40],"146":[2,40],"147":[2,40],"148":[2,40],"149":[2,40],"150":[2,40],"151":[2,40]},{"1":[2,41],"4":[2,41],"29":[2,41],"30":[2,41],"51":[2,41],"59":[2,41],"63":[2,41],"75":[2,41],"76":[2,41],"77":[2,41],"78":[2,41],"81":[2,41],"82":[2,41],"83":[2,41],"84":[2,41],"87":[2,41],"96":[2,41],"97":[2,41],"98":[2,41],"103":[2,41],"112":[2,41],"114":[2,41],"115":[2,41],"116":[2,41],"120":[2,41],"126":[2,41],"127":[2,41],"128":[2,41],"137":[2,41],"138":[2,41],"139":[2,41],"140":[2,41],"141":[2,41],"142":[2, +41],"143":[2,41],"144":[2,41],"145":[2,41],"146":[2,41],"147":[2,41],"148":[2,41],"149":[2,41],"150":[2,41],"151":[2,41]},{"1":[2,42],"4":[2,42],"29":[2,42],"30":[2,42],"51":[2,42],"59":[2,42],"63":[2,42],"75":[2,42],"76":[2,42],"77":[2,42],"78":[2,42],"81":[2,42],"82":[2,42],"83":[2,42],"84":[2,42],"87":[2,42],"96":[2,42],"97":[2,42],"98":[2,42],"103":[2,42],"112":[2,42],"114":[2,42],"115":[2,42],"116":[2,42],"120":[2,42],"126":[2,42],"127":[2,42],"128":[2,42],"137":[2,42],"138":[2,42],"139":[2, +42],"140":[2,42],"141":[2,42],"142":[2,42],"143":[2,42],"144":[2,42],"145":[2,42],"146":[2,42],"147":[2,42],"148":[2,42],"149":[2,42],"150":[2,42],"151":[2,42]},{"1":[2,43],"4":[2,43],"29":[2,43],"30":[2,43],"51":[2,43],"59":[2,43],"63":[2,43],"75":[2,43],"76":[2,43],"77":[2,43],"78":[2,43],"81":[2,43],"82":[2,43],"83":[2,43],"84":[2,43],"87":[2,43],"96":[2,43],"97":[2,43],"98":[2,43],"103":[2,43],"112":[2,43],"114":[2,43],"115":[2,43],"116":[2,43],"120":[2,43],"126":[2,43],"127":[2,43],"128":[2, +43],"137":[2,43],"138":[2,43],"139":[2,43],"140":[2,43],"141":[2,43],"142":[2,43],"143":[2,43],"144":[2,43],"145":[2,43],"146":[2,43],"147":[2,43],"148":[2,43],"149":[2,43],"150":[2,43],"151":[2,43]},{"7":158,"8":7,"9":8,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61], +"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1,35],"95":[1,69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"112":[1,159],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47,"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40], +"142":[1,41],"143":[1,42]},{"8":160,"9":140,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"29":[1,164],"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"64":165,"65":49,"67":34,"68":80,"69":54, +"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1,35],"95":[1,69],"99":162,"100":[1,67],"102":[1,66],"103":[1,161],"104":163,"106":[1,44],"110":[1,53],"111":[1,65],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47,"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]},{"1":[2,123],"4":[2,123],"29":[2,123],"30":[2,123],"51":[2,123],"59":[2,123],"63":[2,123],"75":[2,123],"76":[2, +123],"77":[2,123],"78":[2,123],"81":[2,123],"82":[2,123],"83":[2,123],"84":[2,123],"87":[2,123],"96":[2,123],"97":[2,123],"98":[2,123],"103":[2,123],"112":[2,123],"114":[2,123],"115":[2,123],"116":[2,123],"120":[2,123],"126":[2,123],"127":[2,123],"128":[2,123],"137":[2,123],"138":[2,123],"139":[2,123],"140":[2,123],"141":[2,123],"142":[2,123],"143":[2,123],"144":[2,123],"145":[2,123],"146":[2,123],"147":[2,123],"148":[2,123],"149":[2,123],"150":[2,123],"151":[2,123]},{"1":[2,124],"4":[2,124],"29":[2, +124],"30":[2,124],"31":166,"32":[1,84],"51":[2,124],"59":[2,124],"63":[2,124],"75":[2,124],"76":[2,124],"77":[2,124],"78":[2,124],"81":[2,124],"82":[2,124],"83":[2,124],"84":[2,124],"87":[2,124],"96":[2,124],"97":[2,124],"98":[2,124],"103":[2,124],"112":[2,124],"114":[2,124],"115":[2,124],"116":[2,124],"120":[2,124],"126":[2,124],"127":[2,124],"128":[2,124],"137":[2,124],"138":[2,124],"139":[2,124],"140":[2,124],"141":[2,124],"142":[2,124],"143":[2,124],"144":[2,124],"145":[2,124],"146":[2,124],"147":[2, +124],"148":[2,124],"149":[2,124],"150":[2,124],"151":[2,124]},{"1":[2,117],"4":[2,117],"29":[2,117],"30":[2,117],"51":[2,117],"59":[2,117],"63":[2,117],"75":[2,117],"76":[2,117],"77":[2,117],"78":[2,117],"81":[2,117],"82":[2,117],"83":[2,117],"84":[2,117],"87":[2,117],"94":167,"96":[2,117],"97":[1,168],"98":[2,117],"103":[2,117],"112":[2,117],"114":[2,117],"115":[2,117],"116":[2,117],"120":[2,117],"126":[2,117],"127":[2,117],"128":[2,117],"137":[2,117],"138":[2,117],"139":[2,117],"140":[2,117],"141":[2, +117],"142":[2,117],"143":[2,117],"144":[2,117],"145":[2,117],"146":[2,117],"147":[2,117],"148":[2,117],"149":[2,117],"151":[2,117]},{"4":[2,59],"29":[2,59]},{"4":[2,60],"29":[2,60]},{"8":169,"9":140,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1, +63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1,35],"95":[1,69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47,"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]},{"8":170, +"9":140,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81], +"88":[1,50],"92":[1,35],"95":[1,69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47,"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]},{"8":171,"9":140,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":79,"32":[1,84], +"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1,35],"95":[1,69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47,"120":[1,77],"121":78, +"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]},{"8":172,"9":140,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37, +"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1,35],"95":[1,69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47,"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]},{"4":[1,138],"6":173,"8":174,"9":140,"10":23,"11":24,"12":[1,25],"13":[1,26], +"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"29":[1,6],"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1,35],"95":[1,69], +"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47,"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]},{"31":179,"32":[1,84],"69":180,"70":181,"72":175,"85":[1,81],"102":[1,66],"123":176,"124":[1,177],"125":178},{"122":182,"126":[1,183],"127":[1,184]},{"1":[2,71],"4":[2,71],"29":[2,71],"30":[2,71],"46":[2,71],"51":[2,71],"59":[2,71],"63":[2, +71],"75":[2,71],"76":[2,71],"77":[2,71],"78":[2,71],"81":[2,71],"82":[2,71],"83":[2,71],"84":[2,71],"87":[2,71],"89":[2,71],"96":[2,71],"97":[2,71],"98":[2,71],"103":[2,71],"112":[2,71],"114":[2,71],"115":[2,71],"116":[2,71],"120":[2,71],"126":[2,71],"127":[2,71],"128":[2,71],"137":[2,71],"138":[2,71],"139":[2,71],"140":[2,71],"141":[2,71],"142":[2,71],"143":[2,71],"144":[2,71],"145":[2,71],"146":[2,71],"147":[2,71],"148":[2,71],"149":[2,71],"150":[2,71],"151":[2,71]},{"1":[2,74],"4":[2,74],"29":[2, +74],"30":[2,74],"46":[2,74],"51":[2,74],"59":[2,74],"63":[2,74],"75":[2,74],"76":[2,74],"77":[2,74],"78":[2,74],"81":[2,74],"82":[2,74],"83":[2,74],"84":[2,74],"87":[2,74],"89":[2,74],"96":[2,74],"97":[2,74],"98":[2,74],"103":[2,74],"112":[2,74],"114":[2,74],"115":[2,74],"116":[2,74],"120":[2,74],"126":[2,74],"127":[2,74],"128":[2,74],"137":[2,74],"138":[2,74],"139":[2,74],"140":[2,74],"141":[2,74],"142":[2,74],"143":[2,74],"144":[2,74],"145":[2,74],"146":[2,74],"147":[2,74],"148":[2,74],"149":[2, +74],"150":[2,74],"151":[2,74]},{"4":[2,94],"28":189,"29":[2,94],"31":187,"32":[1,84],"33":188,"34":[1,82],"35":[1,83],"47":186,"50":[1,51],"59":[2,94],"86":185,"87":[2,94]},{"1":[2,33],"4":[2,33],"29":[2,33],"30":[2,33],"48":[2,33],"51":[2,33],"59":[2,33],"63":[2,33],"75":[2,33],"76":[2,33],"77":[2,33],"78":[2,33],"81":[2,33],"82":[2,33],"83":[2,33],"84":[2,33],"87":[2,33],"96":[2,33],"97":[2,33],"98":[2,33],"103":[2,33],"112":[2,33],"114":[2,33],"115":[2,33],"116":[2,33],"120":[2,33],"126":[2,33], +"127":[2,33],"128":[2,33],"137":[2,33],"138":[2,33],"139":[2,33],"140":[2,33],"141":[2,33],"142":[2,33],"143":[2,33],"144":[2,33],"145":[2,33],"146":[2,33],"147":[2,33],"148":[2,33],"149":[2,33],"150":[2,33],"151":[2,33]},{"1":[2,34],"4":[2,34],"29":[2,34],"30":[2,34],"48":[2,34],"51":[2,34],"59":[2,34],"63":[2,34],"75":[2,34],"76":[2,34],"77":[2,34],"78":[2,34],"81":[2,34],"82":[2,34],"83":[2,34],"84":[2,34],"87":[2,34],"96":[2,34],"97":[2,34],"98":[2,34],"103":[2,34],"112":[2,34],"114":[2,34],"115":[2, +34],"116":[2,34],"120":[2,34],"126":[2,34],"127":[2,34],"128":[2,34],"137":[2,34],"138":[2,34],"139":[2,34],"140":[2,34],"141":[2,34],"142":[2,34],"143":[2,34],"144":[2,34],"145":[2,34],"146":[2,34],"147":[2,34],"148":[2,34],"149":[2,34],"150":[2,34],"151":[2,34]},{"1":[2,32],"4":[2,32],"29":[2,32],"30":[2,32],"46":[2,32],"48":[2,32],"51":[2,32],"59":[2,32],"63":[2,32],"75":[2,32],"76":[2,32],"77":[2,32],"78":[2,32],"81":[2,32],"82":[2,32],"83":[2,32],"84":[2,32],"87":[2,32],"89":[2,32],"96":[2,32], +"97":[2,32],"98":[2,32],"103":[2,32],"112":[2,32],"114":[2,32],"115":[2,32],"116":[2,32],"120":[2,32],"126":[2,32],"127":[2,32],"128":[2,32],"137":[2,32],"138":[2,32],"139":[2,32],"140":[2,32],"141":[2,32],"142":[2,32],"143":[2,32],"144":[2,32],"145":[2,32],"146":[2,32],"147":[2,32],"148":[2,32],"149":[2,32],"150":[2,32],"151":[2,32]},{"1":[2,31],"4":[2,31],"29":[2,31],"30":[2,31],"51":[2,31],"59":[2,31],"63":[2,31],"82":[2,31],"87":[2,31],"98":[2,31],"103":[2,31],"108":[2,31],"109":[2,31],"112":[2, +31],"114":[2,31],"115":[2,31],"116":[2,31],"120":[2,31],"126":[2,31],"127":[2,31],"128":[2,31],"131":[2,31],"133":[2,31],"137":[2,31],"138":[2,31],"139":[2,31],"140":[2,31],"141":[2,31],"142":[2,31],"143":[2,31],"144":[2,31],"145":[2,31],"146":[2,31],"147":[2,31],"148":[2,31],"149":[2,31],"151":[2,31]},{"1":[2,7],"4":[2,7],"7":190,"8":7,"9":8,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22, +"30":[2,7],"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1,35],"95":[1,69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76], +"119":47,"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]},{"1":[2,4]},{"4":[1,86],"30":[1,191]},{"1":[2,30],"4":[2,30],"29":[2,30],"30":[2,30],"51":[2,30],"59":[2,30],"63":[2,30],"82":[2,30],"87":[2,30],"98":[2,30],"103":[2,30],"108":[2,30],"109":[2,30],"112":[2,30],"114":[2,30],"115":[2,30],"116":[2,30],"120":[2,30],"126":[2,30],"127":[2,30],"128":[2,30],"131":[2,30],"133":[2,30],"137":[2,30],"138":[2,30],"139":[2, +30],"140":[2,30],"141":[2,30],"142":[2,30],"143":[2,30],"144":[2,30],"145":[2,30],"146":[2,30],"147":[2,30],"148":[2,30],"149":[2,30],"151":[2,30]},{"1":[2,201],"4":[2,201],"29":[2,201],"30":[2,201],"51":[2,201],"59":[2,201],"63":[2,201],"82":[2,201],"87":[2,201],"98":[2,201],"103":[2,201],"112":[2,201],"114":[2,201],"115":[2,201],"116":[2,201],"120":[2,201],"126":[2,201],"127":[2,201],"128":[2,201],"137":[2,201],"138":[2,201],"139":[2,201],"140":[2,201],"141":[2,201],"142":[2,201],"143":[2,201], +"144":[2,201],"145":[2,201],"146":[2,201],"147":[2,201],"148":[2,201],"149":[2,201],"151":[2,201]},{"1":[2,202],"4":[2,202],"29":[2,202],"30":[2,202],"51":[2,202],"59":[2,202],"63":[2,202],"82":[2,202],"87":[2,202],"98":[2,202],"103":[2,202],"112":[2,202],"114":[2,202],"115":[2,202],"116":[2,202],"120":[2,202],"126":[2,202],"127":[2,202],"128":[2,202],"137":[2,202],"138":[2,202],"139":[2,202],"140":[2,202],"141":[2,202],"142":[2,202],"143":[2,202],"144":[2,202],"145":[2,202],"146":[2,202],"147":[2, +202],"148":[2,202],"149":[2,202],"151":[2,202]},{"1":[2,56],"4":[2,56],"8":192,"9":140,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"29":[2,56],"30":[2,56],"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"51":[2,56],"52":[1,36],"55":37,"56":[1, +70],"57":[1,71],"59":[2,56],"62":[1,68],"63":[2,56],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"82":[2,56],"85":[1,81],"87":[2,56],"88":[1,50],"92":[1,35],"95":[1,69],"98":[2,56],"100":[1,67],"102":[1,66],"103":[2,56],"106":[1,44],"110":[1,53],"111":[1,65],"112":[2,56],"113":45,"114":[2,56],"115":[2,56],"116":[2,56],"117":46,"118":[1,76],"119":47,"120":[2,56],"121":78,"126":[2,56],"127":[2,56],"128":[2,56],"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"137":[2,56], +"138":[2,56],"139":[2,56],"140":[2,56],"141":[2,56],"142":[2,56],"143":[2,56],"144":[2,56],"145":[2,56],"146":[2,56],"147":[2,56],"148":[2,56],"149":[2,56],"151":[2,56]},{"8":193,"9":140,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1, 64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1,35],"95":[1,69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47,"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]},{"8":194,"9":140,"10":23, "11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1, 35],"95":[1,69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47,"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]},{"8":195,"9":140,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":79,"32":[1,84],"33":56,"34":[1,82], @@ -454,16 +454,16 @@ function(){return true};$.prototype.makeReturn=function(){this.returns=true;retu J=a.scope;p=this.name&&this.name.compile(a)||J.freeVariable("i");n=this.index&&this.index.compile(a);if(p&&!this.pattern&&(H||!f))J.find(p,{immediate:true});n&&J.find(n,{immediate:true});pa||(ba=J.freeVariable("result"));k=f?J.freeVariable("i"):H?p:n||J.freeVariable("i");i=qa="";b=C.wrap([this.body]);if(H){fa=ka.compileVariables(a);g=ka.compile(R(a,{index:k,step:this.step}))}else{ma=J.freeVariable("ref");fa=""+ma+" = "+this.source.compile(a)+";";if(this.pattern)w=(new j(this.name,q(""+ma+"["+k+"]"))).compile(R(a, {indent:this.idt(1),top:true,keepLevel:true}))+"\n";else if(p)w=""+p+" = "+ma+"["+k+"]";if(!this.object){g=J.freeVariable("len");J=this.step?""+k+" += "+this.step.compile(a):""+k+"++";g=""+k+" = 0, "+g+" = "+ma+".length; "+k+" < "+g+"; "+J}}fa=(fa=(ba?""+ba+" = []; ":"")+fa)?""+this.tab+fa+"\n"+this.tab:this.tab;J=this.compileReturnValue(ba,a);pa||(b=I.wrap(ba,b));if(this.guard)b=C.wrap([new E(this.guard,b)]);if(f){H&&b.unshift(q("var "+p+" = "+k));w&&b.unshift(q("var "+w));n&&b.unshift(q("var "+ n+" = "+k));b=d.wrap(b,true)}else qa=(w||"")&&(this.pattern?w:""+this.idt(1)+w+";\n");if(this.object){g=""+k+" in "+ma;this.raw||(i="\n"+this.idt(1)+"if (!"+ea("hasProp")+".call("+ma+", "+k+")) continue;")}b=b.compile(R(a,{indent:this.idt(1),top:true}));return""+fa+"for ("+g+") {"+i+"\n"+qa+b+"\n"+this.tab+"}"+J};return $}();z.SwitchNode=function(){ia=function(a,b,f){this.otherwise=f;this.cases=b;this.subject=a;ia.__super__.constructor.call(this);this.tags.subjectless=!this.subject;this.subject|| -(this.subject=q("true"));return this};O(ia,h);ia.prototype["class"]="SwitchNode";ia.prototype.children=["subject","cases","otherwise"];ia.prototype.isStatement=function(){return true};ia.prototype.makeReturn=function(){var a,b,f,g;f=this.cases;a=0;for(b=f.length;a Latest Version: - 0.9.3 + 0.9.4

    @@ -136,8 +136,8 @@ list = [1, # Objects: math = - root: Math.sqrt - square: square + root: Math.sqrt + square: square cube: (x) -> x * square x # Splats: @@ -149,7 +149,7 @@ alert "I knew it!# Array comprehensions: cubes = math.cube num for num in list -
    var _a, _b, _c, _d, cubes, list, math, num, number, opposite, race, square;
    +
    var _i, _len, _ref, _result, cubes, list, math, num, number, opposite, race, square;
     var __slice = Array.prototype.slice;
     number = 42;
     opposite = true;
    @@ -176,14 +176,14 @@ math = {
       alert("I knew it!");
     }
     cubes = (function() {
    -  _a = []; _c = list;
    -  for (_b = 0, _d = _c.length; _b < _d; _b++) {
    -    num = _c[_b];
    -    _a.push(math.cube(num));
    +  _result = []; _ref = list;
    +  for (_i = 0, _len = _ref.length; _i < _len; _i++) {
    +    num = _ref[_i];
    +    _result.push(math.cube(num));
       }
    -  return _a;
    +  return _result;
     })();
    -

    @@ -251,7 +251,7 @@ cubes = (function() { Then clone the CoffeeScript source repository from GitHub, or download the latest - release: 0.9.3. + release: 0.9.4. To install the CoffeeScript compiler system-wide under /usr/local, open the directory and run:

    @@ -467,7 +467,7 @@ cube = function(x) {

    song = ["do", "re", "mi", "fa", "so"]
     
    -singers = {Jagger: "Rock", Elvis: "Roll"}
    +singers = {Jagger: "Rock", Elvis: "Roll"}
     
     matrix = [
       1, 0, 1
    @@ -476,12 +476,12 @@ matrix = [
     ]
     
     kids =
    -  brother:
    -    name: "Max"
    -    age:  11
    -  sister:
    -    name: "Ida"
    -    age:  9
    +  brother:
    +    name: "Max"
    +    age:  11
    +  sister:
    +    name: "Ida"
    +    age:  9
     
    var kids, matrix, singers, song;
     song = ["do", "re", "mi", "fa", "so"];
     singers = {
    @@ -521,7 +521,7 @@ kids = {
           of an object, without quoting them as strings. CoffeeScript notices and quotes
           them for you, so you don't have to worry about it (say, when using jQuery).
         

    -
    $('.account').css class: 'active'
    +    
    $('.account').css class: 'active'
     
    $('.account').css({
       "class": 'active'
     });
    @@ -609,7 +609,7 @@ inner = changeNumbers();;alert(inner);'>run: inner
    < date = if friday then sue else jill -options or= defaults +options or= defaults
    var date, mood, options;
     if (singing) {
       mood = greatlyImproved;
    @@ -772,7 +772,7 @@ num = 6
     lyrics = while num -= 1
       num + " little monkeys, jumping on the bed.
         One fell out and bumped his head."
    -
    var _a, lyrics, num;
    +
    var _result, lyrics, num;
     if (this.studyingEconomics) {
       while (supply > demand) {
         buy();
    @@ -783,14 +783,14 @@ lyrics = while num = 6;
     lyrics = (function() {
    -  _a = [];
    +  _result = [];
       while (num -= 1) {
    -    _a.push(num + " little monkeys, jumping on the bed.\
    +    _result.push(num + " little monkeys, jumping on the bed.\
         One fell out and bumped his head.");
       }
    -  return _a;
    +  return _result;
     })();
    -

    For readability, the until keyword is equivalent to while not, @@ -834,21 +834,21 @@ lunch = eat food for f for roid in asteroids for roid2 in asteroids when roid isnt roid2 roid.explode() if roid.overlaps roid2 -

    var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, food, lunch, roid, roid2;
    +
    var _i, _j, _len, _len2, _ref, _ref2, _result, food, lunch, roid, roid2;
     lunch = (function() {
    -  _a = []; _c = ['toast', 'cheese', 'wine'];
    -  for (_b = 0, _d = _c.length; _b < _d; _b++) {
    -    food = _c[_b];
    -    _a.push(eat(food));
    +  _result = []; _ref = ['toast', 'cheese', 'wine'];
    +  for (_i = 0, _len = _ref.length; _i < _len; _i++) {
    +    food = _ref[_i];
    +    _result.push(eat(food));
       }
    -  return _a;
    +  return _result;
     })();
    -_f = asteroids;
    -for (_e = 0, _g = _f.length; _e < _g; _e++) {
    -  roid = _f[_e];
    -  _i = asteroids;
    -  for (_h = 0, _j = _i.length; _h < _j; _h++) {
    -    roid2 = _i[_h];
    +_ref = asteroids;
    +for (_i = 0, _len = _ref.length; _i < _len; _i++) {
    +  roid = _ref[_i];
    +  _ref2 = asteroids;
    +  for (_j = 0, _len2 = _ref2.length; _j < _len2; _j++) {
    +    roid2 = _ref2[_j];
         if (roid !== roid2) {
           if (roid.overlaps(roid2)) {
             roid.explode();
    @@ -868,54 +868,54 @@ _f = asteroids;
       for i in [0...eggs.length] by 12
         dozen = eggs[i...i+12]
         deliver new eggCarton dozen
    -
    var _a, countdown, deliverEggs, num;
    +
    var _result, countdown, deliverEggs, num;
     countdown = (function() {
    -  _a = [];
    +  _result = [];
       for (num = 10; num >= 1; num--) {
    -    _a.push(num);
    +    _result.push(num);
       }
    -  return _a;
    +  return _result;
     })();
     deliverEggs = function() {
    -  var _b, _c, dozen, i;
    -  _b = []; _c = eggs.length;
    -  for (i = 0; (0 <= _c ? i < _c : i > _c); i += 12) {
    -    _b.push((function() {
    +  var _ref, _result2, dozen, i;
    +  _result2 = []; _ref = eggs.length;
    +  for (i = 0; (0 <= _ref ? i < _ref : i > _ref); i += 12) {
    +    _result2.push((function() {
           dozen = eggs.slice(i, i + 12);
           return deliver(new eggCarton(dozen));
         })());
       }
    -  return _b;
    +  return _result2;
     };
    -

    Comprehensions can also be used to iterate over the keys and values in an object. Use of to signal comprehension over the properties of an object instead of the values in an array.

    -
    yearsOld = max: 10, ida: 9, tim: 11
    +    
    yearsOld = max: 10, ida: 9, tim: 11
     
     ages = for child, age of yearsOld
       child + " is " + age
    -
    var _a, _b, age, ages, child, yearsOld;
    +
    var _ref, _result, age, ages, child, yearsOld;
     var __hasProp = Object.prototype.hasOwnProperty;
     yearsOld = {
       max: 10,
    @@ -923,15 +923,15 @@ yearsOld = {
       tim: 11
     };
     ages = (function() {
    -  _a = []; _b = yearsOld;
    -  for (child in _b) {
    -    if (!__hasProp.call(_b, child)) continue;
    -    age = _b[child];
    -    _a.push(child + " is " + age);
    +  _result = []; _ref = yearsOld;
    +  for (child in _ref) {
    +    if (!__hasProp.call(_ref, child)) continue;
    +    age = _ref[child];
    +    _result.push(child + " is " + age);
       }
    -  return _a;
    +  return _result;
     })();
    -

    By default, object comprehensions are safe, and use a hasOwnProperty @@ -1059,27 +1059,27 @@ six = (one = 1) + (two = 2) + (three = 3);;alert(six);'>run: six

    # The first ten global properties.
     
     globals = (name for name of window)[0...10]
    -
    var _a, _b, _c, globals, name;
    +
    var _i, _ref, _result, globals, name;
     var __hasProp = Object.prototype.hasOwnProperty;
     globals = (function() {
    -  _b = []; _c = window;
    -  for (name in _c) {
    -    if (!__hasProp.call(_c, name)) continue;
    -    _a = _c[name];
    -    _b.push(name);
    +  _result = []; _ref = window;
    +  for (name in _ref) {
    +    if (!__hasProp.call(_ref, name)) continue;
    +    _i = _ref[name];
    +    _result.push(name);
       }
    -  return _b;
    +  return _result;
     })().slice(0, 10);
    -

    As well as silly things, like passing a try/catch statement directly @@ -1152,8 +1152,8 @@ speed = (typeof speed !== "undefined" && speed !== null) ? speed : 140;;alert(sp the TypeError that would be raised otherwise.

    lottery.drawWinner()?.address?.zipcode
    -
    var _a, _b;
    -(typeof (_b = ((_a = lottery.drawWinner()))) === "undefined" || _b === null) ? undefined : _b.address == null ? undefined : _b.address.zipcode;
    +
    var _ref, _ref2;
    +(typeof (_ref2 = ((_ref = lottery.drawWinner()))) === "undefined" || _ref2 === null) ? undefined : _ref2.address == null ? undefined : _ref2.address.zipcode;
     

    Soaking up nulls is similar to Ruby's @@ -1217,8 +1217,8 @@ tom.move() if (typeof parent.extended === "function") parent.extended(child); child.__super__ = parent.prototype; }; -Animal = function(_a) { - this.name = _a; +Animal = function(_arg) { + this.name = _arg; return this; }; Animal.prototype.move = function(meters) { @@ -1253,8 +1253,8 @@ var __extends = function(child, parent) { if (typeof parent.extended === "function") parent.extended(child); child.__super__ = parent.prototype; }; -Animal = function(_a) { - this.name = _a; +Animal = function(_arg) { + this.name = _arg; return this; }; Animal.prototype.move = function(meters) { @@ -1315,18 +1315,18 @@ tom.move();;'>run

    theSwitch = 0 [theBait, theSwitch] = [theSwitch, theBait] -
    var _a, theBait, theSwitch;
    +
    var _ref, theBait, theSwitch;
     theBait = 1000;
     theSwitch = 0;
    -_a = [theSwitch, theBait];
    -theBait = _a[0];
    -theSwitch = _a[1];
    -

    +_ref = [theSwitch, theBait]; +theBait = _ref[0]; +theSwitch = _ref[1];;alert(theBait);'>run: theBait

    But it's also helpful for dealing with functions that return multiple values. @@ -1336,38 +1336,38 @@ theSwitch = _a[1];;alert(theBait);'>run: theBait
    72, "Mostly Sunny"] [city, temp, forecast] = weatherReport "Berkeley, CA" -

    var _a, city, forecast, temp, weatherReport;
    +
    var _ref, city, forecast, temp, weatherReport;
     weatherReport = function(location) {
       return [location, 72, "Mostly Sunny"];
     };
    -_a = weatherReport("Berkeley, CA");
    -city = _a[0];
    -temp = _a[1];
    -forecast = _a[2];
    -

    +_ref = weatherReport("Berkeley, CA"); +city = _ref[0]; +temp = _ref[1]; +forecast = _ref[2];;alert(forecast);'>run: forecast

    Pattern matching can be used with any depth of array and object nesting, to help pull out deeply nested properties.

    futurists =
    -  sculptor: "Umberto Boccioni"
    -  painter:  "Vladimir Burliuk"
    -  poet:
    -    name:   "F.T. Marinetti"
    -    address: [
    +  sculptor: "Umberto Boccioni"
    +  painter:  "Vladimir Burliuk"
    +  poet:
    +    name:   "F.T. Marinetti"
    +    address: [
           "Via Roma 42R"
           "Bellagio, Italy 22021"
         ]
     
    -{poet: {name, address: [street, city]}} = futurists
    -
    var _a, _b, _c, city, futurists, name, street;
    +{poet: {name, address: [street, city]}} = futurists
    +
    var _ref, _ref2, _ref3, city, futurists, name, street;
     futurists = {
       sculptor: "Umberto Boccioni",
       painter: "Vladimir Burliuk",
    @@ -1376,13 +1376,13 @@ futurists = {
         address: ["Via Roma 42R", "Bellagio, Italy 22021"]
       }
     };
    -_a = futurists;
    -_b = _a.poet;
    -name = _b.name;
    -_c = _b.address;
    -street = _c[0];
    -city = _c[1];
    -

    +_ref = futurists; +_ref2 = _ref.poet; +name = _ref2.name; +_ref3 = _ref2.address; +street = _ref3[0]; +city = _ref3[1];;alert(name + " — " + street);'>run: name + " — " + street

    Pattern matching can even be combined with splats.

    @@ -1407,20 +1407,20 @@ city = _c[1];;alert(name + " — " + street);'>run: name + " — " + street
    var _a, close, contents, open, tag;
    +
    var _ref, close, contents, open, tag;
     var __slice = Array.prototype.slice;
     tag = "<impossible>";
    -_a = tag.split("");
    -open = _a[0];
    -contents = __slice.call(_a, 1, _a.length - 1);
    -close = _a[_a.length - 1];
    -

    +_ref = tag.split(""); +open = _ref[0]; +contents = __slice.call(_ref, 1, _ref.length - 1); +close = _ref[_ref.length - 1];;alert(contents.join(""));'>run: contents.join("")

    @@ -1511,27 +1511,27 @@ hi = function() { when "Sun" then go church else go work

    switch (day) {
    -case "Mon":
    -  go(work);
    -  break;
    -case "Tue":
    -  go(relax);
    -  break;
    -case "Thu":
    -  go(iceFishing);
    -  break;
    -case "Fri":
    -case "Sat":
    -  if (day === bingoDay) {
    -    go(bingo);
    -    go(dancing);
    -  }
    -  break;
    -case "Sun":
    -  go(church);
    -  break;
    -default:
    -  go(work);
    +  case "Mon":
    +    go(work);
    +    break;
    +  case "Tue":
    +    go(relax);
    +    break;
    +  case "Thu":
    +    go(iceFishing);
    +    break;
    +  case "Fri":
    +  case "Sat":
    +    if (day === bingoDay) {
    +      go(bingo);
    +      go(dancing);
    +    }
    +    break;
    +  case "Sun":
    +    go(church);
    +    break;
    +  default:
    +    go(work);
     }
     

    @@ -1662,10 +1662,11 @@ html = '< are preserved in the generated code.

    ###
    -CoffeeScript Compiler v0.9.3
    +CoffeeScript Compiler v0.9.4
     Released under the MIT License
     ###
    -
    /*CoffeeScript Compiler v0.9.3
    +
    /*
    +CoffeeScript Compiler v0.9.4
     Released under the MIT License
     */
     

    @@ -1832,6 +1833,11 @@ task('build:parserCoffeeKup + — Markup as CoffeeScript. After _why's + Markaby. +
  • jashkenas's Docco — a quick-and-dirty literate-programming-style documentation generator @@ -1859,6 +1865,15 @@ task('build:parser0.9.4 + CoffeeScript now uses appropriately-named temporary variables, and recycles + their references after use. Added require.extensions support for + Node.js 0.3. Loading CoffeeScript in the browser now adds just a + single CoffeeScript object to global scope. + Fixes for implicit object and block comment edge cases. +

    +

    0.9.3 CoffeeScript switch statements now compile into JS switch diff --git a/lib/coffee-script.js b/lib/coffee-script.js index aa0635c0..66a00703 100755 --- a/lib/coffee-script.js +++ b/lib/coffee-script.js @@ -18,7 +18,7 @@ return compile(content); }); } - exports.VERSION = '0.9.3'; + exports.VERSION = '0.9.4'; exports.compile = (compile = function(code, options) { options || (options = {}); try { diff --git a/lib/lexer.js b/lib/lexer.js index 73e9774a..58d14678 100644 --- a/lib/lexer.js +++ b/lib/lexer.js @@ -421,15 +421,15 @@ return null; } switch (tok[0]) { - case 'IDENTIFIER': - tok[0] = 'PARAM'; - break; - case ')': - tok[0] = 'PARAM_END'; - break; - case '(': - case 'CALL_START': - return (tok[0] = 'PARAM_START'); + case 'IDENTIFIER': + tok[0] = 'PARAM'; + break; + case ')': + tok[0] = 'PARAM_END'; + break; + case '(': + case 'CALL_START': + return (tok[0] = 'PARAM_START'); } } return true; diff --git a/lib/nodes.js b/lib/nodes.js index d5069d21..eb649c83 100644 --- a/lib/nodes.js +++ b/lib/nodes.js @@ -1769,7 +1769,7 @@ }; SwitchNode.prototype.compileNode = function(o) { var _i, _j, _len, _len2, _ref2, _ref3, block, code, condition, conditions, exprs, idt, pair; - idt = (o.indent = this.idt(1)); + idt = (o.indent = this.idt(2)); o.top = true; code = ("" + (this.tab) + "switch (" + (this.subject.compile(o)) + ") {"); _ref2 = this.cases; @@ -1785,7 +1785,7 @@ if (this.tags.subjectless) { condition = new OpNode('!!', new ParentheticalNode(condition)); } - code += ("\n" + (this.tab) + "case " + (condition.compile(o)) + ":"); + code += ("\n" + (this.idt(1)) + "case " + (condition.compile(o)) + ":"); } code += ("\n" + (block.compile(o))); if (!(exprs[exprs.length - 1] instanceof ReturnNode)) { @@ -1793,7 +1793,7 @@ } } if (this.otherwise) { - code += ("\n" + (this.tab) + "default:\n" + (this.otherwise.compile(o))); + code += ("\n" + (this.idt(1)) + "default:\n" + (this.otherwise.compile(o))); } code += ("\n" + (this.tab) + "}"); return code; diff --git a/package.json b/package.json index 9bd5e51e..89f73406 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "description": "Unfancy JavaScript", "keywords": ["javascript", "language", "coffeescript", "compiler"], "author": "Jeremy Ashkenas", - "version": "0.9.3", + "version": "0.9.4", "licenses": [{ "type": "MIT", "url": "http://github.com/jashkenas/coffee-script/raw/master/LICENSE" diff --git a/src/coffee-script.coffee b/src/coffee-script.coffee index 461c1eda..8d7d91a1 100755 --- a/src/coffee-script.coffee +++ b/src/coffee-script.coffee @@ -21,7 +21,7 @@ else if require.registerExtension require.registerExtension '.coffee', (content) -> compile content # The current CoffeeScript version number. -exports.VERSION = '0.9.3' +exports.VERSION = '0.9.4' # Compile a string of CoffeeScript code to JavaScript, using the Coffee/Jison # compiler. diff --git a/src/nodes.coffee b/src/nodes.coffee index 04d867ee..69bcd5f0 100644 --- a/src/nodes.coffee +++ b/src/nodes.coffee @@ -1445,7 +1445,7 @@ exports.SwitchNode = class SwitchNode extends BaseNode this compileNode: (o) -> - idt = o.indent = @idt 1 + idt = o.indent = @idt 2 o.top = yes code = "#{ @tab }switch (#{ @subject.compile o }) {" for pair in @cases @@ -1453,11 +1453,11 @@ exports.SwitchNode = class SwitchNode extends BaseNode exprs = block.expressions for condition in flatten [conditions] condition = new OpNode '!!', new ParentheticalNode condition if @tags.subjectless - code += "\n#{ @tab }case #{ condition.compile o }:" + code += "\n#{ @idt(1) }case #{ condition.compile o }:" code += "\n#{ block.compile o }" code += "\n#{ idt }break;" unless exprs[exprs.length - 1] instanceof ReturnNode if @otherwise - code += "\n#{ @tab }default:\n#{ @otherwise.compile o }" + code += "\n#{ @idt(1) }default:\n#{ @otherwise.compile o }" code += "\n#{ @tab }}" code