[Pkg-puppet-devel] [SCM] Puppet packaging for Debian branch, upstream, updated. 0.25.5-639-g8f94f35

test branch puppet-dev at googlegroups.com
Wed Jul 14 10:33:31 UTC 2010


The following commit has been merged in the upstream branch:
commit 2c153b12921d67354ea0968ad81590a124ac8b75
Author: Luke Kanies <luke at puppetlabs.com>
Date:   Mon May 10 23:50:05 2010 -0700

    Fixing #448 - relationships have their own syntax
    
    You can now specify relationships directly in the language:
    
      File[/foo] -> Service[bar]
    
    Specifies a normal dependency while:
    
      File[/foo] ~> Service[bar]
    
    Specifies a subscription.
    
    You can also do relationship chaining, specifying multiple
    relationships on a single line:
    
      File[/foo] -> Package[baz] -> Service[bar]
    
    Note that while it's confusing, you don't have to have all
    of the arrows be the same direction:
    
      File[/foo] -> Service[bar] <~ Package[baz]
    
    This can provide some succinctness at the cost of readability.
    
    You can also specify full resources, rather than just
    resource refs:
    
        file { "/foo": ensure => present } -> package { bar: ensure => installed }
    
    But wait! There's more!  You can also specify a subscription on either side
    of the relationship marker:
    
        yumrepo { foo: .... }
        package { bar: provider => yum, ... }
        Yumrepo <| |> -> Package <| provider == yum |>
    
    This, finally, provides easy many to many relationships in Puppet, but it also opens
    the door to massive dependency cycles.  This last feature is a very powerful stick,
    and you can considerably hurt yourself with it.
    
    Signed-off-by: Luke Kanies <luke at puppetlabs.com>

diff --git a/lib/puppet/parser/ast.rb b/lib/puppet/parser/ast.rb
index 6af7745..06adb8b 100644
--- a/lib/puppet/parser/ast.rb
+++ b/lib/puppet/parser/ast.rb
@@ -116,3 +116,4 @@ require 'puppet/parser/ast/resourceparam'
 require 'puppet/parser/ast/selector'
 require 'puppet/parser/ast/tag'
 require 'puppet/parser/ast/vardef'
+require 'puppet/parser/ast/relationship'
diff --git a/lib/puppet/parser/ast/relationship.rb b/lib/puppet/parser/ast/relationship.rb
new file mode 100644
index 0000000..9f9f6fc
--- /dev/null
+++ b/lib/puppet/parser/ast/relationship.rb
@@ -0,0 +1,60 @@
+require 'puppet/parser/ast'
+require 'puppet/parser/ast/branch'
+require 'puppet/parser/relationship'
+
+class Puppet::Parser::AST::Relationship < Puppet::Parser::AST::Branch
+    RELATIONSHIP_TYPES = %w{-> <- ~> <~}
+
+    attr_accessor :left, :right, :arrow, :type
+
+    def actual_left
+        chained? ? left.right : left
+    end
+
+    # Evaluate our object, but just return a simple array of the type
+    # and name.
+    def evaluate(scope)
+        if chained?
+            real_left = left.safeevaluate(scope)
+            left_dep = left_dep.shift if left_dep.is_a?(Array)
+        else
+            real_left = left.safeevaluate(scope)
+        end
+        real_right = right.safeevaluate(scope)
+
+        source, target = sides2edge(real_left, real_right)
+        result = Puppet::Parser::Relationship.new(source, target, type)
+        scope.compiler.add_relationship(result)
+        real_right
+    end
+
+    def initialize(left, right, arrow, args = {})
+        super(args)
+        unless RELATIONSHIP_TYPES.include?(arrow)
+            raise ArgumentError, "Invalid relationship type #{arrow.inspect}; valid types are #{RELATIONSHIP_TYPES.collect { |r| r.to_s }.join(", ")}"
+        end
+        @left, @right, @arrow = left, right, arrow
+    end
+
+    def type
+        subscription? ? :subscription : :relationship
+    end
+
+    def sides2edge(left, right)
+        out_edge? ? [left, right] : [right, left]
+    end
+
+    private
+
+    def chained?
+        left.is_a?(self.class)
+    end
+
+    def out_edge?
+        ["->", "~>"].include?(arrow)
+    end
+
+    def subscription?
+        ["~>", "<~"].include?(arrow)
+    end
+end
diff --git a/lib/puppet/parser/compiler.rb b/lib/puppet/parser/compiler.rb
index 8e84f5a..fd7d968 100644
--- a/lib/puppet/parser/compiler.rb
+++ b/lib/puppet/parser/compiler.rb
@@ -21,13 +21,17 @@ class Puppet::Parser::Compiler
         raise Puppet::Error, "#{detail} on node #{node.name}"
     end
 
-    attr_reader :node, :facts, :collections, :catalog, :node_scope, :resources
+    attr_reader :node, :facts, :collections, :catalog, :node_scope, :resources, :relationships
 
     # Add a collection to the global list.
     def add_collection(coll)
         @collections << coll
     end
 
+    def add_relationship(dep)
+        @relationships << dep
+    end
+
     # Store a resource override.
     def add_override(override)
         # If possible, merge the override in immediately.
@@ -144,6 +148,10 @@ class Puppet::Parser::Compiler
         found
     end
 
+    def evaluate_relationships
+        @relationships.each { |rel| rel.evaluate(catalog) }
+    end
+
     # Return a resource by either its ref or its type and title.
     def findresource(*args)
         @catalog.resource(*args)
@@ -337,6 +345,8 @@ class Puppet::Parser::Compiler
     # Make sure all of our resources and such have done any last work
     # necessary.
     def finish
+        evaluate_relationships()
+
         resources.each do |resource|
             # Add in any resource overrides.
             if overrides = resource_overrides(resource)
@@ -374,6 +384,9 @@ class Puppet::Parser::Compiler
         # but they each refer back to the scope that created them.
         @collections = []
 
+        # The list of relationships to evaluate.
+        @relationships = []
+
         # For maintaining the relationship between scopes and their resources.
         @catalog = Puppet::Resource::Catalog.new(@node.name)
         @catalog.version = known_resource_types.version
diff --git a/lib/puppet/parser/grammar.ra b/lib/puppet/parser/grammar.ra
index e125e32..c505556 100644
--- a/lib/puppet/parser/grammar.ra
+++ b/lib/puppet/parser/grammar.ra
@@ -11,7 +11,7 @@ token QMARK LPAREN RPAREN ISEQUAL GREATEREQUAL GREATERTHAN LESSTHAN
 token IF ELSE IMPORT DEFINE ELSIF VARIABLE CLASS INHERITS NODE BOOLEAN
 token NAME SEMIC CASE DEFAULT AT LCOLLECT RCOLLECT CLASSNAME CLASSREF
 token NOT OR AND UNDEF PARROW PLUS MINUS TIMES DIV LSHIFT RSHIFT UMINUS
-token MATCH NOMATCH REGEX
+token MATCH NOMATCH REGEX IN_EDGE OUT_EDGE IN_EDGE_SUB OUT_EDGE_SUB
 
 prechigh
     right NOT
@@ -74,6 +74,18 @@ statement:    resource
             | nodedef
             | resourceoverride
             | append
+            | relationship
+
+relationship: relationship_side edge relationship_side {
+    result = AST::Relationship.new(val[0], val[2], val[1][:value], ast_context)
+}
+            | relationship edge relationship_side {
+    result = AST::Relationship.new(val[0], val[2], val[1][:value], ast_context)
+}
+
+relationship_side: resource | resourceref | collection
+
+edge: IN_EDGE | OUT_EDGE | IN_EDGE_SUB | OUT_EDGE_SUB
 
 fstatement:   NAME LPAREN funcvalues RPAREN {
     args = aryfy(val[2])
diff --git a/lib/puppet/parser/lexer.rb b/lib/puppet/parser/lexer.rb
index f13a85f..def4621 100644
--- a/lib/puppet/parser/lexer.rb
+++ b/lib/puppet/parser/lexer.rb
@@ -129,6 +129,10 @@ class Puppet::Parser::Lexer
         ':' => :COLON,
         '@' => :AT,
         '<<|' => :LLCOLLECT,
+        '->' => :IN_EDGE,
+        '<-' => :OUT_EDGE,
+        '~>' => :IN_EDGE_SUB,
+        '<~' => :OUT_EDGE_SUB,
         '|>>' => :RRCOLLECT,
         '<|' => :LCOLLECT,
         '|>' => :RCOLLECT,
diff --git a/lib/puppet/parser/parser.rb b/lib/puppet/parser/parser.rb
index 8937fe1..1ada48f 100644
--- a/lib/puppet/parser/parser.rb
+++ b/lib/puppet/parser/parser.rb
@@ -1,10 +1,11 @@
 #
 # DO NOT MODIFY!!!!
-# This file is automatically generated by Racc 1.4.6
-# from Racc grammer file "".
+# This file is automatically generated by racc 1.4.5
+# from racc grammer file "grammar.ra".
 #
 
-require 'racc/parser.rb'
+require 'racc/parser'
+
 
 require 'puppet'
 require 'puppet/util/loadedfile'
@@ -17,11 +18,14 @@ module Puppet
     class AlreadyImportedError < ImportError; end
 end
 
+
 module Puppet
+
   module Parser
+
     class Parser < Racc::Parser
 
-module_eval(<<'...end grammar.ra/module_eval...', 'grammar.ra', 850)
+module_eval <<'..end grammar.ra modeval..id2f1634261a', 'grammar.ra', 862
 
 # It got too annoying having code in a file that needs to be compiled.
 require 'puppet/parser/parser_support'
@@ -32,1081 +36,1104 @@ require 'puppet/parser/parser_support'
 # End:
 
 # $Id$
-...end grammar.ra/module_eval...
-##### State transition tables begin ###
+
+..end grammar.ra modeval..id2f1634261a
+
+##### racc 1.4.5 generates ###
+
+racc_reduce_table = [
+ 0, 0, :racc_error,
+ 1, 69, :_reduce_1,
+ 1, 69, :_reduce_none,
+ 1, 70, :_reduce_none,
+ 2, 70, :_reduce_4,
+ 1, 72, :_reduce_none,
+ 1, 72, :_reduce_none,
+ 1, 72, :_reduce_none,
+ 1, 72, :_reduce_none,
+ 1, 72, :_reduce_none,
+ 1, 72, :_reduce_none,
+ 1, 72, :_reduce_none,
+ 1, 72, :_reduce_none,
+ 1, 72, :_reduce_none,
+ 1, 72, :_reduce_none,
+ 1, 72, :_reduce_none,
+ 1, 72, :_reduce_none,
+ 1, 72, :_reduce_none,
+ 1, 72, :_reduce_none,
+ 3, 86, :_reduce_19,
+ 3, 86, :_reduce_20,
+ 1, 87, :_reduce_none,
+ 1, 87, :_reduce_none,
+ 1, 87, :_reduce_none,
+ 1, 88, :_reduce_none,
+ 1, 88, :_reduce_none,
+ 1, 88, :_reduce_none,
+ 1, 88, :_reduce_none,
+ 4, 80, :_reduce_28,
+ 5, 80, :_reduce_29,
+ 3, 80, :_reduce_30,
+ 2, 80, :_reduce_31,
+ 1, 90, :_reduce_none,
+ 1, 90, :_reduce_none,
+ 3, 90, :_reduce_34,
+ 3, 90, :_reduce_35,
+ 1, 91, :_reduce_none,
+ 1, 91, :_reduce_none,
+ 1, 91, :_reduce_none,
+ 1, 91, :_reduce_none,
+ 1, 91, :_reduce_none,
+ 1, 91, :_reduce_none,
+ 1, 91, :_reduce_none,
+ 1, 91, :_reduce_none,
+ 1, 91, :_reduce_44,
+ 5, 73, :_reduce_45,
+ 5, 73, :_reduce_46,
+ 5, 73, :_reduce_47,
+ 5, 84, :_reduce_48,
+ 2, 74, :_reduce_49,
+ 1, 107, :_reduce_50,
+ 2, 107, :_reduce_51,
+ 6, 75, :_reduce_52,
+ 2, 75, :_reduce_53,
+ 3, 108, :_reduce_54,
+ 3, 108, :_reduce_55,
+ 1, 109, :_reduce_none,
+ 1, 109, :_reduce_none,
+ 3, 109, :_reduce_58,
+ 1, 110, :_reduce_none,
+ 3, 110, :_reduce_60,
+ 1, 111, :_reduce_61,
+ 1, 111, :_reduce_62,
+ 3, 112, :_reduce_63,
+ 3, 112, :_reduce_64,
+ 1, 113, :_reduce_none,
+ 1, 113, :_reduce_none,
+ 4, 115, :_reduce_67,
+ 1, 101, :_reduce_none,
+ 3, 101, :_reduce_69,
+ 0, 102, :_reduce_none,
+ 1, 102, :_reduce_none,
+ 1, 117, :_reduce_72,
+ 1, 92, :_reduce_73,
+ 1, 94, :_reduce_74,
+ 1, 116, :_reduce_none,
+ 1, 116, :_reduce_none,
+ 1, 116, :_reduce_none,
+ 1, 116, :_reduce_none,
+ 1, 116, :_reduce_none,
+ 1, 116, :_reduce_none,
+ 1, 116, :_reduce_none,
+ 3, 76, :_reduce_82,
+ 3, 76, :_reduce_83,
+ 3, 85, :_reduce_84,
+ 0, 103, :_reduce_85,
+ 1, 103, :_reduce_86,
+ 3, 103, :_reduce_87,
+ 3, 121, :_reduce_88,
+ 3, 123, :_reduce_89,
+ 1, 124, :_reduce_none,
+ 1, 124, :_reduce_none,
+ 0, 106, :_reduce_92,
+ 1, 106, :_reduce_93,
+ 3, 106, :_reduce_94,
+ 1, 125, :_reduce_none,
+ 3, 125, :_reduce_96,
+ 1, 114, :_reduce_none,
+ 1, 114, :_reduce_none,
+ 1, 114, :_reduce_none,
+ 1, 114, :_reduce_none,
+ 1, 114, :_reduce_none,
+ 1, 114, :_reduce_none,
+ 1, 122, :_reduce_none,
+ 1, 122, :_reduce_none,
+ 1, 122, :_reduce_none,
+ 1, 122, :_reduce_none,
+ 1, 122, :_reduce_none,
+ 1, 122, :_reduce_none,
+ 1, 122, :_reduce_none,
+ 1, 122, :_reduce_none,
+ 1, 122, :_reduce_none,
+ 1, 122, :_reduce_none,
+ 1, 122, :_reduce_none,
+ 1, 122, :_reduce_none,
+ 4, 96, :_reduce_115,
+ 3, 96, :_reduce_116,
+ 1, 98, :_reduce_117,
+ 2, 98, :_reduce_118,
+ 2, 128, :_reduce_119,
+ 1, 129, :_reduce_120,
+ 2, 129, :_reduce_121,
+ 1, 95, :_reduce_122,
+ 4, 89, :_reduce_123,
+ 4, 89, :_reduce_124,
+ 6, 78, :_reduce_125,
+ 5, 78, :_reduce_126,
+ 0, 130, :_reduce_none,
+ 4, 130, :_reduce_128,
+ 3, 130, :_reduce_129,
+ 1, 119, :_reduce_none,
+ 3, 119, :_reduce_131,
+ 3, 119, :_reduce_132,
+ 3, 119, :_reduce_133,
+ 3, 119, :_reduce_134,
+ 3, 119, :_reduce_135,
+ 3, 119, :_reduce_136,
+ 3, 119, :_reduce_137,
+ 3, 119, :_reduce_138,
+ 2, 119, :_reduce_139,
+ 3, 119, :_reduce_140,
+ 3, 119, :_reduce_141,
+ 3, 119, :_reduce_142,
+ 3, 119, :_reduce_143,
+ 3, 119, :_reduce_144,
+ 3, 119, :_reduce_145,
+ 2, 119, :_reduce_146,
+ 3, 119, :_reduce_147,
+ 3, 119, :_reduce_148,
+ 3, 119, :_reduce_149,
+ 5, 77, :_reduce_150,
+ 1, 132, :_reduce_none,
+ 2, 132, :_reduce_152,
+ 5, 133, :_reduce_153,
+ 4, 133, :_reduce_154,
+ 1, 134, :_reduce_none,
+ 3, 134, :_reduce_156,
+ 3, 97, :_reduce_157,
+ 1, 136, :_reduce_none,
+ 4, 136, :_reduce_159,
+ 1, 138, :_reduce_none,
+ 3, 138, :_reduce_161,
+ 3, 137, :_reduce_162,
+ 1, 135, :_reduce_none,
+ 1, 135, :_reduce_none,
+ 1, 135, :_reduce_none,
+ 1, 135, :_reduce_none,
+ 1, 135, :_reduce_none,
+ 1, 135, :_reduce_none,
+ 1, 135, :_reduce_none,
+ 1, 135, :_reduce_170,
+ 1, 135, :_reduce_none,
+ 1, 139, :_reduce_172,
+ 1, 140, :_reduce_none,
+ 3, 140, :_reduce_174,
+ 2, 79, :_reduce_175,
+ 6, 81, :_reduce_176,
+ 5, 81, :_reduce_177,
+ 7, 82, :_reduce_178,
+ 6, 82, :_reduce_179,
+ 6, 83, :_reduce_180,
+ 5, 83, :_reduce_181,
+ 1, 105, :_reduce_182,
+ 1, 100, :_reduce_183,
+ 1, 100, :_reduce_184,
+ 1, 100, :_reduce_185,
+ 1, 143, :_reduce_none,
+ 3, 143, :_reduce_187,
+ 1, 145, :_reduce_188,
+ 1, 146, :_reduce_189,
+ 1, 146, :_reduce_190,
+ 1, 146, :_reduce_191,
+ 1, 146, :_reduce_none,
+ 0, 71, :_reduce_193,
+ 0, 147, :_reduce_194,
+ 1, 141, :_reduce_none,
+ 3, 141, :_reduce_196,
+ 3, 141, :_reduce_197,
+ 1, 148, :_reduce_none,
+ 3, 148, :_reduce_199,
+ 3, 149, :_reduce_200,
+ 1, 149, :_reduce_201,
+ 3, 149, :_reduce_202,
+ 1, 149, :_reduce_203,
+ 1, 144, :_reduce_none,
+ 2, 144, :_reduce_205,
+ 1, 142, :_reduce_none,
+ 2, 142, :_reduce_207,
+ 1, 150, :_reduce_none,
+ 1, 150, :_reduce_none,
+ 1, 93, :_reduce_210,
+ 3, 118, :_reduce_211,
+ 4, 118, :_reduce_212,
+ 2, 118, :_reduce_213,
+ 1, 126, :_reduce_none,
+ 1, 126, :_reduce_none,
+ 0, 104, :_reduce_none,
+ 1, 104, :_reduce_217,
+ 1, 131, :_reduce_218,
+ 3, 127, :_reduce_219,
+ 4, 127, :_reduce_220,
+ 2, 127, :_reduce_221,
+ 1, 151, :_reduce_none,
+ 3, 151, :_reduce_223,
+ 3, 152, :_reduce_224,
+ 1, 153, :_reduce_225,
+ 1, 153, :_reduce_226,
+ 4, 120, :_reduce_227,
+ 1, 99, :_reduce_none,
+ 4, 99, :_reduce_229 ]
+
+racc_reduce_n = 230
+
+racc_shift_n = 379
 
 racc_action_table = [
-    60,    65,    60,    65,    95,   121,    95,   216,    97,   187,
-    71,   113,   108,   187,   109,    46,   285,   217,   281,    46,
-   186,    60,    65,   216,   186,   191,   280,   110,   154,   191,
-   122,    46,   144,    59,   325,    59,   154,    72,   133,    72,
-    75,    80,   326,    80,   278,   279,   131,   170,    68,   222,
-    77,   106,    77,    50,    59,   161,    53,    50,    72,    75,
-    53,    52,    80,    52,    60,    65,    66,    68,   150,    50,
-   239,    77,    53,   327,    60,    65,    52,   167,   171,   286,
-    52,   315,    52,   173,   157,   158,   159,   160,   162,   287,
-   167,   171,    52,    60,    65,    60,    65,   186,   278,   279,
-   223,    72,   237,   231,   348,    80,   187,   186,   289,    43,
-   131,    72,   237,   224,    77,    80,   244,   186,    41,    42,
-   131,   290,   191,   288,    77,    52,    59,   105,   186,   170,
-    72,    75,    72,   237,    80,    52,    80,   161,    66,    68,
-    34,   131,   187,    77,    36,    77,    60,    65,    60,    65,
-    95,    11,    97,   186,    52,   182,    52,   201,   191,  -157,
-    60,    65,   202,   293,    71,   173,   157,   158,   159,   160,
-   162,   283,   167,   171,    34,   231,   232,   268,    36,    59,
-   267,   296,    62,    72,    75,    11,   181,    80,    60,    65,
-   167,   171,    68,    59,  -155,   321,    77,    72,    75,   233,
-  -158,    80,   299,   231,   232,    66,    68,    52,    60,    65,
-    77,    34,    95,    34,    97,    36,  -159,    36,  -154,   197,
-   201,    52,    11,    16,    11,   202,   181,    60,    65,   303,
-    88,    95,   276,    97,    60,    65,   278,   279,    95,   197,
-    97,    59,   158,   159,   144,    72,    75,   167,   171,    80,
-   306,   108,  -156,   309,    68,    93,    88,  -153,    77,   269,
-    59,    83,   312,   154,    72,    75,   153,    59,    80,    52,
-  -153,    72,    75,    68,   266,    80,    52,    77,   231,   265,
-    68,    93,  -156,  -154,    77,    60,    65,    83,    52,    95,
-   183,    97,   158,   159,    52,    52,   184,   167,   171,   150,
-  -172,  -155,   147,    43,    60,    65,  -157,    88,    95,   195,
-    97,    60,    65,  -158,   318,    95,   197,    97,    59,   319,
-   200,   144,    72,    75,   206,   207,    80,   210,   213,    60,
-    65,    68,    93,   216,   109,    77,   220,    59,    83,   338,
-   113,    72,    75,   111,    59,    80,    52,  -155,    72,    75,
-    68,   105,    80,    55,    77,    54,   217,    68,    45,   215,
-   318,    77,   186,   352,  -153,    52,    72,   237,   354,  -158,
-    80,  -155,    52,  -153,  -156,   131,    60,    65,  -154,    77,
-    95,   355,    97,   217,   173,   157,   158,   159,  -207,  -156,
-    52,   167,   171,   358,   220,    60,    65,    37,    88,    95,
-   219,    97,    60,    65,  -154,   nil,    95,   nil,    97,    59,
-   nil,   nil,   nil,    72,    75,   nil,   nil,    80,   nil,   nil,
-    60,    65,    68,    93,    88,   nil,    77,   nil,    59,    83,
-   nil,   nil,    72,    75,   nil,    59,    80,    52,   nil,    72,
-    75,    68,   nil,    80,   nil,    77,   nil,   nil,    68,    93,
-   nil,   nil,    77,   186,   nil,    83,    52,    72,   237,   nil,
-   nil,    80,   nil,    52,   nil,   nil,   131,    60,    65,   nil,
-    77,    95,   nil,    97,   nil,   173,   157,   158,   159,   160,
-   162,    52,   167,   171,   nil,    60,    65,   nil,   nil,    88,
-   nil,   nil,   324,   nil,   173,   157,   158,   159,   nil,   nil,
-    59,   167,   171,   nil,    72,    75,   nil,   nil,    80,   nil,
-   nil,   nil,   nil,    68,    93,    60,    65,    77,   186,    95,
-    83,    97,    72,   237,   nil,   nil,    80,   nil,    52,   nil,
-   nil,   131,   nil,   nil,   nil,    77,   nil,    88,   nil,   nil,
-   nil,    60,    65,   nil,   nil,    95,    52,    97,    59,   nil,
-   nil,   nil,    72,    75,   nil,   nil,    80,   nil,   nil,   nil,
-   nil,    68,    93,    60,    65,    77,   nil,    95,    83,    97,
-   nil,   nil,   nil,   nil,    59,   nil,    52,   nil,    72,    75,
-   nil,   nil,    80,   nil,   nil,    88,   nil,    68,   nil,    60,
-    65,    77,   nil,    95,   nil,    97,    59,   nil,   nil,   nil,
-    72,    75,    52,   nil,    80,   nil,   nil,   nil,   nil,    68,
-    93,    88,   nil,    77,   nil,   nil,    83,   nil,   nil,    60,
-    65,   nil,    59,    95,    52,    97,    72,    75,   nil,   nil,
-    80,   nil,   nil,   nil,   nil,    68,    93,   nil,   nil,    77,
-   nil,    88,    83,   nil,    60,    65,   nil,   nil,   nil,   nil,
-    52,   nil,    59,   nil,   nil,   nil,    72,    75,   nil,   nil,
-    80,   nil,   nil,   nil,   nil,    68,    93,   145,   nil,    77,
-    60,    65,    83,   nil,    95,   nil,    97,    59,   nil,   nil,
-    52,    72,    75,   nil,   nil,    80,   nil,   nil,   nil,    66,
-    68,   nil,    88,   nil,    77,   nil,    60,    65,   nil,   nil,
-    95,   nil,    97,    59,   nil,    52,   nil,    72,    75,   nil,
-   nil,    80,   nil,   nil,   nil,   nil,    68,    93,    88,   nil,
-    77,    60,    65,    83,   nil,    95,   nil,    97,   nil,    59,
-   nil,    52,   nil,    72,    75,   nil,   nil,    80,   nil,   nil,
-   nil,   nil,    68,    93,   nil,   nil,    77,    60,    65,    83,
-   nil,    95,   nil,    97,    59,   nil,   nil,    52,    72,    75,
-   nil,   nil,    80,   nil,   nil,   nil,   nil,    68,   nil,    88,
-   nil,    77,   nil,    60,    65,   nil,   nil,    95,   nil,    97,
-    59,   nil,    52,   nil,    72,    75,   nil,   nil,    80,   nil,
-   nil,    60,    65,    68,    93,    88,   nil,    77,    60,    65,
-    83,   nil,    95,   nil,    97,   nil,    59,   nil,    52,   nil,
-    72,    75,    60,    65,    80,   nil,    95,   nil,    97,    68,
-    93,   nil,   nil,    77,   186,   nil,    83,   nil,    72,   237,
-   nil,    59,    80,   nil,    52,    72,    75,   131,   nil,    80,
-   nil,    77,    60,    65,    68,    59,   nil,   nil,    77,    72,
-    75,   nil,    52,    80,   nil,   nil,   nil,   nil,    68,    52,
-    60,    65,    77,   nil,    95,   308,    97,   nil,   nil,   nil,
-   nil,   nil,   nil,    52,   nil,    59,   nil,   nil,   nil,    72,
-    75,   nil,    88,    80,   nil,    60,    65,    66,    68,    95,
-   nil,    97,    77,    59,   nil,   nil,   nil,    72,    75,   nil,
-   nil,    80,   nil,    52,   nil,   nil,    68,    93,   nil,   nil,
-    77,    60,    65,    83,   nil,    95,   nil,    97,    59,   nil,
-   nil,    52,    72,    75,   nil,   nil,    80,   nil,   nil,   nil,
-   nil,    68,    60,    65,   nil,    77,    95,   nil,    97,   nil,
-   nil,   nil,   nil,   nil,    59,   nil,    52,   nil,    72,    75,
-   nil,   nil,    80,   nil,    88,   nil,   nil,    68,    60,    65,
-   nil,    77,    95,   nil,   nil,    59,   nil,   nil,   nil,    72,
-    75,   nil,    52,    80,   nil,   nil,   nil,   nil,    68,    93,
-    60,    65,    77,   nil,    95,    83,    97,   nil,   nil,   nil,
-   nil,    59,   nil,    52,   nil,    72,   237,   nil,   nil,    80,
-   nil,   nil,    88,   nil,   131,   nil,    60,    65,    77,   nil,
-    95,   nil,    97,    59,   nil,   nil,   nil,    72,    75,    52,
-   nil,    80,   nil,   nil,   nil,   nil,    68,    93,    88,   nil,
-    77,   nil,   nil,    83,   nil,   nil,    60,    65,   nil,    59,
-    95,    52,    97,    72,    75,   nil,   nil,    80,   nil,   nil,
-   nil,   nil,    68,    93,   nil,   nil,    77,   nil,    88,    83,
-   nil,   nil,    60,    65,   nil,   nil,    95,    52,    97,    59,
-   nil,   nil,   nil,    72,    75,   nil,   nil,    80,   nil,   nil,
-    60,    65,    68,    93,    88,   nil,    77,   nil,   nil,    83,
-   nil,   nil,   nil,   nil,   nil,    59,   nil,    52,   nil,    72,
-    75,   nil,   nil,    80,   nil,   nil,   nil,   nil,    68,    93,
-    60,    65,    77,   186,    95,    83,    97,    72,   237,   172,
-   nil,    80,   nil,    52,   nil,   nil,   131,   nil,   165,   170,
-    77,   nil,    88,   nil,   nil,   nil,   nil,   161,   163,   166,
-   169,    52,   nil,    59,   nil,   nil,   nil,    72,    75,    60,
-    65,    80,   nil,    95,   175,    97,    68,    93,   nil,   nil,
-    77,   164,   168,    83,   nil,   173,   157,   158,   159,   160,
-   162,    52,   167,   171,    60,    65,   nil,   nil,    95,   nil,
-    97,   nil,    59,   nil,   nil,   nil,    72,    75,   nil,   nil,
-    80,   nil,   nil,   nil,   nil,    68,    88,   nil,   nil,    77,
-    60,    65,   nil,   nil,    95,   nil,    97,    59,   nil,   nil,
-    52,    72,    75,   nil,   nil,    80,   nil,   nil,   nil,   nil,
-    68,    93,    88,   nil,    77,   nil,   nil,    83,   nil,   nil,
-   nil,   nil,   nil,    59,   nil,    52,   nil,    72,    75,   nil,
-   nil,    80,   227,   228,   nil,   nil,    68,    93,   nil,   nil,
-    77,   nil,   nil,    83,   nil,   165,   170,   nil,   nil,   nil,
-   nil,    52,   nil,   nil,   161,   163,   166,   169,   165,   170,
-   nil,   nil,   nil,   nil,   nil,   nil,   246,   161,   163,   166,
-   169,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   164,   168,
-   nil,   nil,   173,   157,   158,   159,   160,   162,   nil,   167,
-   171,   164,   168,   nil,   nil,   173,   157,   158,   159,   160,
-   162,   nil,   167,   171,   165,   170,   nil,   nil,   nil,   nil,
-   nil,   nil,   nil,   161,   163,   166,   169,   165,   170,   nil,
-   nil,   nil,   nil,   nil,   nil,   nil,   161,   163,   166,   169,
-   nil,   nil,   nil,   nil,   nil,   nil,   nil,   164,   168,   nil,
-   nil,   173,   157,   158,   159,   160,   162,   nil,   167,   171,
-   164,   168,   nil,   nil,   173,   157,   158,   159,   160,   162,
-   nil,   167,   171,   165,   170,   nil,   nil,   nil,   nil,   nil,
-   nil,   nil,   161,   163,   166,   169,   165,   170,   nil,   nil,
-   nil,   nil,   nil,   nil,   nil,   161,   163,   166,   169,   nil,
-   nil,   173,   157,   158,   159,   160,   162,   168,   167,   171,
-   173,   157,   158,   159,   160,   162,   nil,   167,   171,   nil,
-   nil,   nil,   nil,   173,   157,   158,   159,   160,   162,   nil,
-   167,   171,   165,   170,   nil,   nil,   nil,   nil,   nil,   nil,
-   nil,   161,   163,   166,   169,   170,   nil,   nil,   nil,   nil,
-   nil,   nil,   nil,   161,   170,   nil,   nil,   nil,   nil,   nil,
-   nil,   nil,   161,   nil,   nil,   164,   168,   nil,   nil,   173,
-   157,   158,   159,   160,   162,   nil,   167,   171,   263,   nil,
-   nil,   173,   157,   158,   159,   160,   162,   nil,   167,   171,
-   173,   157,   158,   159,   160,   162,   nil,   167,   171,    26,
-   342,    30,     1,   nil,     8,    12,   nil,    19,   nil,    24,
-   nil,    28,   nil,     2,   nil,   nil,    11,    16,   nil,   316,
-   nil,    26,   nil,    30,     1,   nil,     8,    12,   nil,    19,
-   nil,    24,   nil,    28,   nil,     2,   nil,   nil,    11,    16,
-    26,   344,    30,     1,   nil,     8,    12,   nil,    19,   nil,
-    24,   nil,    28,   nil,     2,   nil,   nil,    11,    16,   nil,
-   345,   nil,    26,   nil,    30,     1,   nil,     8,    12,   nil,
-    19,   nil,    24,   nil,    28,   nil,     2,   nil,   nil,    11,
-    16,    26,   298,    30,     1,   nil,     8,    12,   nil,    19,
-   nil,    24,   nil,    28,   nil,     2,   nil,   nil,    11,    16,
-   nil,   356,   nil,    26,   nil,    30,     1,   nil,     8,    12,
-   nil,    19,   nil,    24,   nil,    28,   nil,     2,   nil,   nil,
-    11,    16,    26,   360,    30,     1,   nil,     8,    12,   nil,
-    19,   nil,    24,   nil,    28,   nil,     2,   nil,   nil,    11,
-    16,   nil,   362,   nil,    26,   nil,    30,     1,   nil,     8,
-    12,   nil,    19,   nil,    24,   nil,    28,   nil,     2,   nil,
-   nil,    11,    16,    26,   292,    30,     1,   nil,     8,    12,
-   nil,    19,   nil,    24,   nil,    28,   nil,     2,   nil,   nil,
-    11,    16,   nil,   363,   nil,    26,   nil,    30,     1,   nil,
-     8,    12,   nil,    19,   nil,    24,   nil,    28,   nil,     2,
-   nil,   nil,    11,    16,    26,   364,    30,     1,   nil,     8,
-    12,   nil,    19,   nil,    24,   nil,    28,   nil,     2,   nil,
-   nil,    11,    16,   nil,   nil,   nil,    26,   nil,    30,     1,
-   nil,     8,    12,   nil,    19,   nil,    24,   nil,    28,   nil,
-     2,   nil,   nil,    11,    16,    26,   nil,    30,     1,   nil,
-     8,    12,   nil,    19,   nil,    24,   nil,    28,   nil,     2,
-   nil,   nil,    11,    16,    26,   nil,    30,     1,   nil,     8,
-    12,   nil,    19,   nil,    24,   nil,    28,   nil,     2,   nil,
-   nil,    11,    16 ]
+    64,    68,    49,    57,    96,    58,   101,    49,    75,   226,
+   322,   253,   155,   118,   149,    75,   155,    49,    60,    64,
+    68,   302,    92,   154,   254,   115,   176,   154,   161,    64,
+    68,   226,   161,    63,   303,   242,   243,    76,    79,   151,
+    52,    86,    56,    55,   176,    52,    71,    94,    55,  -167,
+    81,   227,    63,    88,   250,    52,    76,    79,    55,   300,
+    86,    53,   154,    53,    69,    71,    76,   261,    53,    81,
+    86,    64,    68,    64,    68,   127,   169,   262,    53,    81,
+    53,   155,   242,   243,   244,   363,    44,    64,    68,   340,
+    53,    96,   154,   101,    37,    42,    43,   161,    38,   301,
+    64,    68,   155,   177,   154,     9,   154,   186,    76,   261,
+    76,   261,    86,   154,    86,    64,    68,   127,   161,   127,
+    63,    81,   344,    81,    76,    79,   215,   304,    86,    64,
+    68,   219,    53,    71,    53,    64,    68,    81,   183,    96,
+    37,   101,   351,    37,    38,  -164,   275,   208,    53,   274,
+   352,     9,   269,   183,     9,    13,   239,    92,   215,   199,
+   203,   307,    63,   219,   238,    57,    76,    79,    63,   166,
+    86,   310,    76,    79,    69,    71,    86,    64,    68,    81,
+   166,    71,    94,    64,    68,    81,  -166,    75,    88,  -163,
+    53,    37,   142,    64,    68,    38,    53,    96,   315,   101,
+    37,    53,     9,    13,   208,    66,   199,   203,   319,   202,
+   154,     9,    13,  -182,    76,   261,    63,   193,    86,  -165,
+    76,    79,   172,   127,    86,   169,    63,    81,    69,    71,
+    76,    79,  -163,    81,    86,    44,    64,    68,    53,    71,
+    96,   333,   101,    81,    53,   205,   189,   190,   191,   192,
+   194,   228,   199,   203,    53,    64,    68,  -166,    92,    96,
+    37,   101,    64,    68,    38,   336,    96,   318,   101,    63,
+   176,     9,   167,    76,    79,   190,   191,    86,   166,    53,
+   199,   203,    71,    94,    92,   341,    81,   342,    63,    88,
+  -164,  -169,    76,    79,  -168,    63,    86,    53,  -167,    76,
+    79,    71,  -165,    86,    58,    81,    64,    68,    71,    94,
+    96,   206,    81,    64,    68,    88,    53,    96,   212,   101,
+    64,    68,   276,    53,    96,   148,   101,    64,    68,   205,
+   189,   190,   191,   120,   350,   142,   199,   203,   120,    63,
+   220,   222,  -168,    76,   134,   347,    63,    86,  -163,   115,
+    76,    79,   127,    63,    86,   223,    81,    76,    79,    71,
+   154,    86,   142,    81,    76,   261,    71,    53,    86,   226,
+    81,   241,   223,   127,    53,   242,   243,    81,    64,    68,
+  -166,    53,    96,   223,   101,   235,  -164,  -163,    53,    25,
+  -166,    32,     1,  -164,     7,    10,  -168,    16,  -165,    22,
+    92,    29,   361,     2,    64,    68,     9,    13,    96,    46,
+   101,    63,   190,   191,   231,    76,    79,   199,   203,    86,
+   113,   114,   110,   112,    71,    94,    92,   347,    81,   367,
+   230,    88,   369,   225,    64,    68,  -217,    63,    96,    53,
+   101,    76,    79,   267,    41,    86,   372,   244,   245,    40,
+    71,    94,    39,   228,    81,  -165,    92,    88,   273,   nil,
+    64,    68,   244,   272,    96,    53,   101,    63,   nil,   247,
+   nil,    76,    79,   244,   245,    86,   113,   114,   110,   112,
+    71,    94,    92,   nil,    81,   nil,   nil,    88,   nil,   nil,
+    64,    68,   nil,    63,    96,    53,   101,    76,    79,   nil,
+   nil,    86,   -23,   -23,   -23,   -23,    71,    94,   nil,   nil,
+    81,   nil,    92,    88,   nil,   nil,    64,    68,   nil,   nil,
+    96,    53,   101,    63,   nil,   nil,   nil,    76,    79,   nil,
+   nil,    86,   -21,   -21,   -21,   -21,    71,    94,    92,   nil,
+    81,    64,    68,    88,   nil,    96,   nil,   101,   nil,    63,
+   nil,    53,   nil,    76,    79,   nil,   nil,    86,   nil,   nil,
+   nil,   nil,    71,    94,   nil,   nil,    81,    64,    68,    88,
+   nil,    96,   nil,   101,    63,   nil,   nil,    53,    76,    79,
+   nil,   nil,    86,   nil,   nil,   nil,   nil,    71,   nil,    92,
+   nil,    81,   nil,    64,    68,   nil,   nil,    96,   nil,   101,
+    63,   nil,    53,   nil,    76,    79,   nil,   nil,    86,   nil,
+   nil,   nil,   nil,    71,    94,    92,   nil,    81,   nil,   nil,
+    88,   nil,   nil,    64,    68,   nil,    63,    96,    53,   101,
+    76,    79,   nil,   nil,    86,   nil,   nil,   nil,   nil,    71,
+    94,   nil,   nil,    81,   nil,    92,    88,   nil,   nil,    64,
+    68,   nil,   nil,    96,    53,   101,    63,   nil,   nil,   nil,
+    76,    79,   nil,   nil,    86,   nil,   nil,   nil,   nil,    71,
+    94,    64,    68,    81,   nil,    96,    88,   101,   nil,   nil,
+   nil,   nil,    63,   nil,    53,   nil,    76,    79,   nil,   nil,
+    86,   nil,    64,    68,   nil,    71,    96,   nil,   101,    81,
+   nil,   nil,   nil,   nil,    63,   nil,   nil,   nil,    76,    79,
+    53,   nil,    86,   nil,    92,   nil,   nil,    71,    64,    68,
+   nil,    81,   nil,   nil,   nil,    63,   nil,   nil,   nil,    76,
+    79,   nil,    53,    86,   nil,   nil,    64,    68,    71,    94,
+   nil,   335,    81,    64,    68,    88,   nil,    96,   nil,   101,
+   nil,    63,   nil,    53,   nil,    76,    79,   nil,   nil,    86,
+   nil,   nil,   nil,    69,    71,    64,    68,   nil,    81,   154,
+   nil,   nil,   nil,    76,   261,   nil,    63,    86,   nil,    53,
+    76,    79,   127,   nil,    86,   nil,    81,   nil,   171,    71,
+    64,    68,   nil,    81,   nil,   nil,   nil,    53,    63,   nil,
+   nil,   nil,    76,    79,    53,   nil,    86,   nil,    64,    68,
+    69,    71,    96,   nil,   101,    81,   nil,   205,   189,   190,
+   191,   192,   194,   154,   199,   203,    53,    76,   261,   nil,
+    92,    86,   nil,   nil,   nil,   nil,   127,   nil,    64,    68,
+    81,    63,    96,   nil,   101,    76,    79,   nil,   nil,    86,
+   nil,    53,   nil,   nil,    71,    94,   nil,   nil,    81,   nil,
+    92,    88,   nil,   nil,    64,    68,   nil,   nil,    96,    53,
+   101,    63,   nil,   nil,   nil,    76,    79,   nil,   nil,    86,
+   nil,   nil,   nil,   nil,    71,    94,    64,    68,    81,   nil,
+    96,    88,   101,   nil,   nil,   nil,   nil,    63,   nil,    53,
+   nil,    76,    79,   nil,   nil,    86,   nil,    64,    68,   nil,
+    71,    96,   nil,   nil,    81,   nil,   nil,   nil,   nil,    63,
+   nil,   nil,   nil,    76,    79,    53,   nil,    86,   nil,    64,
+    68,   nil,    71,    96,   nil,   101,    81,   nil,   nil,   nil,
+    63,   nil,   nil,   nil,    76,   261,   nil,    53,    86,   nil,
+    64,    68,   nil,   127,    96,   nil,   101,    81,   nil,   nil,
+   nil,   nil,    63,   nil,   nil,   nil,    76,    79,    53,   nil,
+    86,   nil,    92,   nil,   nil,    71,    64,    68,   nil,    81,
+    96,   nil,   101,    63,   nil,   nil,   nil,    76,    79,   nil,
+    53,    86,   nil,   nil,    64,    68,    71,    94,    92,   nil,
+    81,   nil,   nil,    88,   nil,   nil,   nil,   nil,   nil,    63,
+   nil,    53,   nil,    76,    79,   nil,   nil,    86,   nil,   nil,
+   nil,   nil,    71,    94,    64,    68,    81,   154,    96,    88,
+   101,    76,   261,   204,   nil,    86,   nil,    53,   nil,   nil,
+   127,   nil,   197,   202,    81,   nil,    92,   nil,   nil,   nil,
+   nil,   193,   195,   198,   201,    53,   nil,    63,   nil,   nil,
+   nil,    76,    79,    64,    68,    86,   nil,    96,   182,   101,
+    71,    94,   nil,   nil,    81,   196,   200,    88,   nil,   205,
+   189,   190,   191,   192,   194,    53,   199,   203,    64,    68,
+   nil,   nil,    96,   nil,   101,   nil,    63,   nil,   nil,   nil,
+    76,    79,   nil,   nil,    86,   nil,   nil,   nil,   nil,    71,
+    92,   nil,   nil,    81,    64,    68,   nil,   nil,    96,   nil,
+   101,    63,   nil,   nil,    53,    76,    79,   nil,   nil,    86,
+   nil,   nil,   nil,   nil,    71,    94,    92,   nil,    81,   nil,
+   nil,    88,   nil,   nil,    64,    68,   nil,    63,    96,    53,
+   101,    76,    79,   nil,   nil,    86,   nil,   nil,   nil,   nil,
+    71,    94,   nil,   nil,    81,   nil,    92,    88,   nil,   nil,
+    64,    68,   nil,   nil,    96,    53,   101,    63,   nil,   nil,
+   nil,    76,    79,   nil,   nil,    86,   nil,   nil,   nil,   nil,
+    71,    94,    92,   nil,    81,   nil,   nil,    88,   nil,   nil,
+   nil,   nil,   nil,    63,   nil,    53,   nil,    76,    79,   nil,
+   nil,    86,   264,   265,   nil,   nil,    71,    94,   nil,   nil,
+    81,   nil,   nil,    88,   nil,   197,   202,   nil,   nil,   nil,
+   nil,    53,   nil,   nil,   193,   195,   198,   201,   197,   202,
+   nil,   nil,   nil,   nil,   nil,   nil,   271,   193,   195,   198,
+   201,   nil,   nil,   205,   189,   190,   191,   nil,   196,   200,
+   199,   203,   205,   189,   190,   191,   192,   194,   nil,   199,
+   203,   196,   200,   nil,   nil,   205,   189,   190,   191,   192,
+   194,   nil,   199,   203,   197,   202,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,   193,   195,   198,   201,   197,   202,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   193,   195,   198,   201,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   196,   200,   nil,
+   nil,   205,   189,   190,   191,   192,   194,   nil,   199,   203,
+   196,   200,   nil,   nil,   205,   189,   190,   191,   192,   194,
+   nil,   199,   203,   197,   202,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,   193,   195,   198,   201,   197,   202,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   193,   195,   198,   201,   nil,
+   nil,   205,   189,   190,   191,   192,   194,   200,   199,   203,
+   205,   189,   190,   191,   192,   194,   nil,   199,   203,   nil,
+   nil,   nil,   nil,   205,   189,   190,   191,   192,   194,   nil,
+   199,   203,   197,   202,   nil,   nil,   nil,   nil,   nil,   nil,
+   nil,   193,   195,   198,   201,   202,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,   193,   202,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,   193,   nil,   nil,   196,   200,   202,   nil,   205,
+   189,   190,   191,   192,   194,   193,   199,   203,   nil,   nil,
+   nil,   205,   189,   190,   191,   192,   194,   nil,   199,   203,
+   205,   189,   190,   191,   192,   194,   359,   199,   203,   nil,
+   nil,   nil,   nil,   205,   189,   190,   191,   192,   194,   nil,
+   199,   203,   nil,   nil,   nil,   306,   nil,    25,   nil,    32,
+     1,   nil,     7,    10,   nil,    16,   nil,    22,   nil,    29,
+   nil,     2,   nil,   nil,     9,    13,    25,   321,    32,     1,
+   nil,     7,    10,   nil,    16,   nil,    22,   nil,    29,   nil,
+     2,   nil,   nil,     9,    13,   nil,   346,   nil,    25,   nil,
+    32,     1,   nil,     7,    10,   nil,    16,   nil,    22,   nil,
+    29,   nil,     2,   nil,   nil,     9,    13,    25,   360,    32,
+     1,   nil,     7,    10,   nil,    16,   nil,    22,   nil,    29,
+   nil,     2,   nil,   nil,     9,    13,   nil,   370,   nil,    25,
+   nil,    32,     1,   nil,     7,    10,   nil,    16,   nil,    22,
+   nil,    29,   nil,     2,   nil,   nil,     9,    13,    25,   374,
+    32,     1,   nil,     7,    10,   nil,    16,   nil,    22,   nil,
+    29,   nil,     2,   nil,   nil,     9,    13,   nil,   376,   nil,
+    25,   nil,    32,     1,   nil,     7,    10,   nil,    16,   nil,
+    22,   nil,    29,   nil,     2,   nil,   nil,     9,    13,    25,
+   377,    32,     1,   nil,     7,    10,   nil,    16,   nil,    22,
+   nil,    29,   nil,     2,   nil,   nil,     9,    13,   nil,   293,
+   nil,    25,   nil,    32,     1,   nil,     7,    10,   nil,    16,
+   nil,    22,   nil,    29,   nil,     2,   nil,   nil,     9,    13,
+    25,   356,    32,     1,   nil,     7,    10,   nil,    16,   nil,
+    22,   nil,    29,   nil,     2,   nil,   nil,     9,    13,   nil,
+   378,   nil,    25,   nil,    32,     1,   nil,     7,    10,   nil,
+    16,   nil,    22,   nil,    29,   nil,     2,   nil,   nil,     9,
+    13,    25,   nil,    32,     1,   nil,     7,    10,   nil,    16,
+   nil,    22,   nil,    29,   nil,     2,   nil,   nil,     9,    13,
+    25,   nil,    32,     1,   nil,     7,    10,   nil,    16,   nil,
+    22,   nil,    29,   nil,     2,   nil,   nil,     9,    13 ]
 
 racc_action_check = [
-    54,    54,   147,   147,    54,    48,   147,   144,   147,   110,
-    75,    44,    31,   106,    31,    19,   199,   198,   192,   122,
-   110,   150,   150,   133,   106,   110,   192,    31,    75,   106,
-    48,   121,   195,    54,   272,   147,   133,    54,    54,   147,
-   147,    54,   272,   147,   199,   199,    54,   256,   147,   144,
-    54,    31,   147,    19,   150,   256,    19,   122,   150,   150,
-   122,    54,   150,   147,   153,   153,   150,   150,   245,   121,
-   153,   150,   121,   275,   349,   349,    19,   249,   249,   201,
-   122,   245,   150,   256,   256,   256,   256,   256,   256,   202,
-   256,   256,   121,   154,   154,   325,   325,   153,   275,   275,
-   146,   153,   153,   314,   314,   153,   187,   349,   204,     8,
-   153,   349,   349,   146,   153,   349,   154,   187,     8,     8,
-   349,   204,   187,   203,   349,   153,   154,   184,   325,   259,
-   154,   154,   325,   325,   154,   349,   325,   259,   154,   154,
-    12,   325,   277,   154,    12,   325,   312,   312,    97,    97,
-   312,    12,   312,   277,   154,    97,   325,   113,   277,    86,
-    24,    24,   113,   209,    24,   259,   259,   259,   259,   259,
-   259,   196,   259,   259,   210,   196,   196,   177,   210,   312,
-   177,   210,    24,   312,   312,   210,    97,   312,   267,   267,
-   248,   248,   312,    24,    91,   267,   312,    24,    24,   152,
-    85,    24,   214,   152,   152,    24,    24,   312,    26,    26,
-    24,     5,    26,     1,    26,     5,    84,     1,    82,   217,
-   289,    24,     5,     5,     1,   289,   267,    28,    28,   218,
-    26,    28,   188,    28,   157,   157,   188,   188,   157,   219,
-   157,    26,   247,   247,   220,    26,    26,   247,   247,    26,
-   221,    81,    79,   225,    26,    26,   157,    78,    26,   180,
-    28,    26,   236,   237,    28,    28,    74,   157,    28,    26,
-    98,   157,   157,    28,   176,   157,   171,    28,   176,   176,
-   157,   157,    99,   101,   157,   158,   158,   157,    28,   158,
-   102,   158,   264,   264,   167,   157,   104,   264,   264,    70,
-    68,    67,    63,    59,   287,   287,    58,   158,   287,   107,
-   287,   286,   286,    57,   263,   286,   109,   286,   158,   265,
-   111,    55,   158,   158,   114,   117,   158,   118,   123,   281,
-   281,   158,   158,   197,    40,   158,   282,   287,   158,   284,
-    35,   287,   287,    33,   286,   287,   158,   128,   286,   286,
-   287,    30,   286,    23,   287,    20,   304,   286,    13,   132,
-   316,   286,   281,   318,   134,   287,   281,   281,   326,   329,
-   281,   331,   286,   332,   334,   281,    41,    41,   335,   281,
-    41,   337,    41,   135,   252,   252,   252,   252,   348,   136,
-   281,   252,   252,   350,   140,    43,    43,     2,    41,    43,
-   139,    43,    42,    42,   138,   nil,    42,   nil,    42,    41,
-   nil,   nil,   nil,    41,    41,   nil,   nil,    41,   nil,   nil,
-   280,   280,    41,    41,    42,   nil,    41,   nil,    43,    41,
-   nil,   nil,    43,    43,   nil,    42,    43,    41,   nil,    42,
-    42,    43,   nil,    42,   nil,    43,   nil,   nil,    42,    42,
-   nil,   nil,    42,   280,   nil,    42,    43,   280,   280,   nil,
-   nil,   280,   nil,    42,   nil,   nil,   280,    45,    45,   nil,
-   280,    45,   nil,    45,   nil,   251,   251,   251,   251,   251,
-   251,   280,   251,   251,   nil,   270,   270,   nil,   nil,    45,
-   nil,   nil,   270,   nil,   250,   250,   250,   250,   nil,   nil,
-    45,   250,   250,   nil,    45,    45,   nil,   nil,    45,   nil,
-   nil,   nil,   nil,    45,    45,   159,   159,    45,   270,   159,
-    45,   159,   270,   270,   nil,   nil,   270,   nil,    45,   nil,
-   nil,   270,   nil,   nil,   nil,   270,   nil,   159,   nil,   nil,
-   nil,   269,   269,   nil,   nil,   269,   270,   269,   159,   nil,
-   nil,   nil,   159,   159,   nil,   nil,   159,   nil,   nil,   nil,
-   nil,   159,   159,   160,   160,   159,   nil,   160,   159,   160,
-   nil,   nil,   nil,   nil,   269,   nil,   159,   nil,   269,   269,
-   nil,   nil,   269,   nil,   nil,   160,   nil,   269,   nil,   161,
-   161,   269,   nil,   161,   nil,   161,   160,   nil,   nil,   nil,
-   160,   160,   269,   nil,   160,   nil,   nil,   nil,   nil,   160,
-   160,   161,   nil,   160,   nil,   nil,   160,   nil,   nil,   162,
-   162,   nil,   161,   162,   160,   162,   161,   161,   nil,   nil,
-   161,   nil,   nil,   nil,   nil,   161,   161,   nil,   nil,   161,
-   nil,   162,   161,   nil,    62,    62,   nil,   nil,   nil,   nil,
-   161,   nil,   162,   nil,   nil,   nil,   162,   162,   nil,   nil,
-   162,   nil,   nil,   nil,   nil,   162,   162,    62,   nil,   162,
-   163,   163,   162,   nil,   163,   nil,   163,    62,   nil,   nil,
-   162,    62,    62,   nil,   nil,    62,   nil,   nil,   nil,    62,
-    62,   nil,   163,   nil,    62,   nil,    65,    65,   nil,   nil,
-    65,   nil,    65,   163,   nil,    62,   nil,   163,   163,   nil,
-   nil,   163,   nil,   nil,   nil,   nil,   163,   163,    65,   nil,
-   163,   108,   108,   163,   nil,   108,   nil,   108,   nil,    65,
-   nil,   163,   nil,    65,    65,   nil,   nil,    65,   nil,   nil,
-   nil,   nil,    65,    65,   nil,   nil,    65,   164,   164,    65,
-   nil,   164,   nil,   164,   108,   nil,   nil,    65,   108,   108,
-   nil,   nil,   108,   nil,   nil,   nil,   nil,   108,   nil,   164,
-   nil,   108,   nil,   170,   170,   nil,   nil,   170,   nil,   170,
-   164,   nil,   108,   nil,   164,   164,   nil,   nil,   164,   nil,
-   nil,   239,   239,   164,   164,   170,   nil,   164,    71,    71,
-   164,   nil,    71,   nil,    71,   nil,   170,   nil,   164,   nil,
-   170,   170,   234,   234,   170,   nil,   234,   nil,   234,   170,
-   170,   nil,   nil,   170,   239,   nil,   170,   nil,   239,   239,
-   nil,    71,   239,   nil,   170,    71,    71,   239,   nil,    71,
-   nil,   239,   223,   223,    71,   234,   nil,   nil,    71,   234,
-   234,   nil,   239,   234,   nil,   nil,   nil,   nil,   234,    71,
-   227,   227,   234,   nil,   227,   223,   227,   nil,   nil,   nil,
-   nil,   nil,   nil,   234,   nil,   223,   nil,   nil,   nil,   223,
-   223,   nil,   227,   223,   nil,   222,   222,   223,   223,   222,
-   nil,   222,   223,   227,   nil,   nil,   nil,   227,   227,   nil,
-   nil,   227,   nil,   223,   nil,   nil,   227,   227,   nil,   nil,
-   227,   216,   216,   227,   nil,   216,   nil,   216,   222,   nil,
-   nil,   227,   222,   222,   nil,   nil,   222,   nil,   nil,   nil,
-   nil,   222,    83,    83,   nil,   222,    83,   nil,    83,   nil,
-   nil,   nil,   nil,   nil,   216,   nil,   222,   nil,   216,   216,
-   nil,   nil,   216,   nil,    83,   nil,   nil,   216,   215,   215,
-   nil,   216,   215,   nil,   nil,    83,   nil,   nil,   nil,    83,
-    83,   nil,   216,    83,   nil,   nil,   nil,   nil,    83,    83,
-   166,   166,    83,   nil,   166,    83,   166,   nil,   nil,   nil,
-   nil,   215,   nil,    83,   nil,   215,   215,   nil,   nil,   215,
-   nil,   nil,   166,   nil,   215,   nil,   168,   168,   215,   nil,
-   168,   nil,   168,   166,   nil,   nil,   nil,   166,   166,   215,
-   nil,   166,   nil,   nil,   nil,   nil,   166,   166,   168,   nil,
-   166,   nil,   nil,   166,   nil,   nil,    88,    88,   nil,   168,
-    88,   166,    88,   168,   168,   nil,   nil,   168,   nil,   nil,
-   nil,   nil,   168,   168,   nil,   nil,   168,   nil,    88,   168,
-   nil,   nil,   169,   169,   nil,   nil,   169,   168,   169,    88,
-   nil,   nil,   nil,    88,    88,   nil,   nil,    88,   nil,   nil,
-   183,   183,    88,    88,   169,   nil,    88,   nil,   nil,    88,
-   nil,   nil,   nil,   nil,   nil,   169,   nil,    88,   nil,   169,
-   169,   nil,   nil,   169,   nil,   nil,   nil,   nil,   169,   169,
-    93,    93,   169,   183,    93,   169,    93,   183,   183,    89,
-   nil,   183,   nil,   169,   nil,   nil,   183,   nil,    89,    89,
-   183,   nil,    93,   nil,   nil,   nil,   nil,    89,    89,    89,
-    89,   183,   nil,    93,   nil,   nil,   nil,    93,    93,    95,
-    95,    93,   nil,    95,    95,    95,    93,    93,   nil,   nil,
-    93,    89,    89,    93,   nil,    89,    89,    89,    89,    89,
-    89,    93,    89,    89,   173,   173,   nil,   nil,   173,   nil,
-   173,   nil,    95,   nil,   nil,   nil,    95,    95,   nil,   nil,
-    95,   nil,   nil,   nil,   nil,    95,   173,   nil,   nil,    95,
-   165,   165,   nil,   nil,   165,   nil,   165,   173,   nil,   nil,
-    95,   173,   173,   nil,   nil,   173,   nil,   nil,   nil,   nil,
-   173,   173,   165,   nil,   173,   nil,   nil,   173,   nil,   nil,
-   nil,   nil,   nil,   165,   nil,   173,   nil,   165,   165,   nil,
-   nil,   165,   149,   149,   nil,   nil,   165,   165,   nil,   nil,
-   165,   nil,   nil,   165,   nil,   149,   149,   nil,   nil,   nil,
-   nil,   165,   nil,   nil,   149,   149,   149,   149,   156,   156,
-   nil,   nil,   nil,   nil,   nil,   nil,   156,   156,   156,   156,
-   156,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   149,   149,
-   nil,   nil,   149,   149,   149,   149,   149,   149,   nil,   149,
-   149,   156,   156,   nil,   nil,   156,   156,   156,   156,   156,
-   156,   nil,   156,   156,   115,   115,   nil,   nil,   nil,   nil,
-   nil,   nil,   nil,   115,   115,   115,   115,   119,   119,   nil,
-   nil,   nil,   nil,   nil,   nil,   nil,   119,   119,   119,   119,
-   nil,   nil,   nil,   nil,   nil,   nil,   nil,   115,   115,   nil,
-   nil,   115,   115,   115,   115,   115,   115,   nil,   115,   115,
-   119,   119,   nil,   nil,   119,   119,   119,   119,   119,   119,
-   nil,   119,   119,   254,   254,   nil,   nil,   nil,   nil,   nil,
-   nil,   nil,   254,   254,   254,   254,   258,   258,   nil,   nil,
-   nil,   nil,   nil,   nil,   nil,   258,   258,   258,   258,   nil,
-   nil,   260,   260,   260,   260,   260,   260,   254,   260,   260,
-   254,   254,   254,   254,   254,   254,   nil,   254,   254,   nil,
-   nil,   nil,   nil,   258,   258,   258,   258,   258,   258,   nil,
-   258,   258,   116,   116,   nil,   nil,   nil,   nil,   nil,   nil,
-   nil,   116,   116,   116,   116,   255,   nil,   nil,   nil,   nil,
-   nil,   nil,   nil,   255,   253,   nil,   nil,   nil,   nil,   nil,
-   nil,   nil,   253,   nil,   nil,   116,   116,   nil,   nil,   116,
-   116,   116,   116,   116,   116,   nil,   116,   116,   172,   nil,
-   nil,   255,   255,   255,   255,   255,   255,   nil,   255,   255,
-   253,   253,   253,   253,   253,   253,   nil,   253,   253,   172,
-   291,   172,   172,   nil,   172,   172,   nil,   172,   nil,   172,
-   nil,   172,   nil,   172,   nil,   nil,   172,   172,   nil,   262,
-   nil,   291,   nil,   291,   291,   nil,   291,   291,   nil,   291,
-   nil,   291,   nil,   291,   nil,   291,   nil,   nil,   291,   291,
-   262,   293,   262,   262,   nil,   262,   262,   nil,   262,   nil,
-   262,   nil,   262,   nil,   262,   nil,   nil,   262,   262,   nil,
-   297,   nil,   293,   nil,   293,   293,   nil,   293,   293,   nil,
-   293,   nil,   293,   nil,   293,   nil,   293,   nil,   nil,   293,
-   293,   297,   213,   297,   297,   nil,   297,   297,   nil,   297,
-   nil,   297,   nil,   297,   nil,   297,   nil,   nil,   297,   297,
-   nil,   343,   nil,   213,   nil,   213,   213,   nil,   213,   213,
-   nil,   213,   nil,   213,   nil,   213,   nil,   213,   nil,   nil,
-   213,   213,   343,   352,   343,   343,   nil,   343,   343,   nil,
-   343,   nil,   343,   nil,   343,   nil,   343,   nil,   nil,   343,
-   343,   nil,   354,   nil,   352,   nil,   352,   352,   nil,   352,
-   352,   nil,   352,   nil,   352,   nil,   352,   nil,   352,   nil,
-   nil,   352,   352,   354,   206,   354,   354,   nil,   354,   354,
-   nil,   354,   nil,   354,   nil,   354,   nil,   354,   nil,   nil,
-   354,   354,   nil,   359,   nil,   206,   nil,   206,   206,   nil,
-   206,   206,   nil,   206,   nil,   206,   nil,   206,   nil,   206,
-   nil,   nil,   206,   206,   359,   361,   359,   359,   nil,   359,
-   359,   nil,   359,   nil,   359,   nil,   359,   nil,   359,   nil,
-   nil,   359,   359,   nil,   nil,   nil,   361,   nil,   361,   361,
-   nil,   361,   361,   nil,   361,   nil,   361,   nil,   361,   nil,
-   361,   nil,   nil,   361,   361,     4,   nil,     4,     4,   nil,
-     4,     4,   nil,     4,   nil,     4,   nil,     4,   nil,     4,
-   nil,   nil,     4,     4,     0,   nil,     0,     0,   nil,     0,
-     0,   nil,     0,   nil,     0,   nil,     0,   nil,     0,   nil,
-   nil,     0,     0 ]
+   197,   197,   149,    19,   197,    19,   197,   151,    79,   142,
+   237,   170,    56,    33,    48,   208,   155,    16,    19,   169,
+   169,   217,   197,    56,   170,   212,    79,   155,    56,   364,
+   364,   134,   155,   197,   217,   237,   237,   197,   197,    48,
+   149,   197,    19,   149,   134,   151,   197,   197,   151,    82,
+   197,   142,   169,   197,   168,    16,   169,   169,    16,   215,
+   169,   197,   364,   149,   169,   169,   364,   364,   151,   169,
+   364,   172,   172,   351,   351,   364,   268,   172,    16,   364,
+   169,    60,   168,   168,   338,   338,     7,   336,   336,   268,
+   364,   336,    60,   336,     1,     7,     7,    60,     1,   216,
+   101,   101,   240,    84,   172,     1,   351,   101,   172,   172,
+   351,   351,   172,   240,   351,   274,   274,   172,   240,   351,
+   336,   172,   274,   351,   336,   336,   302,   219,   336,   176,
+   176,   302,   172,   336,   351,    94,    94,   336,   101,    94,
+    10,    94,   297,   111,    10,    77,   184,   111,   336,   184,
+   297,    10,   176,   274,   111,   111,   157,    94,   120,   278,
+   278,   221,   176,   120,   157,    74,   176,   176,    94,   223,
+   176,   224,    94,    94,   176,   176,    94,   262,   262,   176,
+   225,    94,    94,    22,    22,    94,    73,    22,    94,    72,
+   176,    26,   228,   177,   177,    26,    94,   177,   229,   177,
+   119,   203,    26,    26,   119,    22,   279,   279,   233,   283,
+   262,   119,   119,    71,   262,   262,    22,   283,   262,    87,
+    22,    22,    67,   262,    22,    65,   177,   262,    22,    22,
+   177,   177,    93,    22,   177,    63,    25,    25,   262,   177,
+    25,   248,    25,   177,    22,   283,   283,   283,   283,   283,
+   283,   249,   283,   283,   177,    29,    29,    95,    25,    29,
+   231,    29,   118,   118,   231,   255,   118,   231,   118,    25,
+   261,   231,    59,    25,    25,   294,   294,    25,    58,   199,
+   294,   294,    25,    25,   118,   270,    25,   272,    29,    25,
+    98,    99,    29,    29,   100,   118,    29,    25,   102,   118,
+   118,    29,   106,   118,   107,    29,    40,    40,   118,   118,
+    40,   109,   118,   304,   304,   118,    29,   304,   117,   304,
+   300,   300,   188,   118,   300,    46,   300,   295,   295,   280,
+   280,   280,   280,    45,   295,    41,   280,   280,    36,    40,
+   122,   125,    80,    40,    40,   293,   304,    40,   126,    32,
+   304,   304,    40,   300,   304,   128,    40,   300,   300,   304,
+   295,   300,   167,   304,   295,   295,   300,    40,   295,   166,
+   300,   162,   165,   295,   304,   162,   162,   295,   189,   189,
+   129,   300,   189,   311,   189,   150,   131,   323,   295,     0,
+   325,     0,     0,   326,     0,     0,   327,     0,   329,     0,
+   189,     0,   334,     0,   190,   190,     0,     0,   190,    12,
+   190,   189,   277,   277,   147,   189,   189,   277,   277,   189,
+    34,    34,    34,    34,   189,   189,   190,   346,   189,   347,
+   146,   189,   352,   132,   191,   191,   363,   190,   191,   189,
+   191,   190,   190,   175,     5,   190,   365,   175,   175,     4,
+   190,   190,     2,   143,   190,   138,   191,   190,   181,   nil,
+   192,   192,   181,   181,   192,   190,   192,   191,   nil,   164,
+   nil,   191,   191,   164,   164,   191,    30,    30,    30,    30,
+   191,   191,   192,   nil,   191,   nil,   nil,   191,   nil,   nil,
+    42,    42,   nil,   192,    42,   191,    42,   192,   192,   nil,
+   nil,   192,    31,    31,    31,    31,   192,   192,   nil,   nil,
+   192,   nil,    42,   192,   nil,   nil,    43,    43,   nil,   nil,
+    43,   192,    43,    42,   nil,   nil,   nil,    42,    42,   nil,
+   nil,    42,    24,    24,    24,    24,    42,    42,    43,   nil,
+    42,    44,    44,    42,   nil,    44,   nil,    44,   nil,    43,
+   nil,    42,   nil,    43,    43,   nil,   nil,    43,   nil,   nil,
+   nil,   nil,    43,    43,   nil,   nil,    43,   193,   193,    43,
+   nil,   193,   nil,   193,    44,   nil,   nil,    43,    44,    44,
+   nil,   nil,    44,   nil,   nil,   nil,   nil,    44,   nil,   193,
+   nil,    44,   nil,   201,   201,   nil,   nil,   201,   nil,   201,
+   193,   nil,    44,   nil,   193,   193,   nil,   nil,   193,   nil,
+   nil,   nil,   nil,   193,   193,   201,   nil,   193,   nil,   nil,
+   193,   nil,   nil,   194,   194,   nil,   201,   194,   193,   194,
+   201,   201,   nil,   nil,   201,   nil,   nil,   nil,   nil,   201,
+   201,   nil,   nil,   201,   nil,   194,   201,   nil,   nil,   276,
+   276,   nil,   nil,   276,   201,   276,   194,   nil,   nil,   nil,
+   194,   194,   nil,   nil,   194,   nil,   nil,   nil,   nil,   194,
+   194,    57,    57,   194,   nil,    57,   194,    57,   nil,   nil,
+   nil,   nil,   276,   nil,   194,   nil,   276,   276,   nil,   nil,
+   276,   nil,   264,   264,   nil,   276,   264,   nil,   264,   276,
+   nil,   nil,   nil,   nil,    57,   nil,   nil,   nil,    57,    57,
+   276,   nil,    57,   nil,   264,   nil,   nil,    57,   253,   253,
+   nil,    57,   nil,   nil,   nil,   264,   nil,   nil,   nil,   264,
+   264,   nil,    57,   264,   nil,   nil,   239,   239,   264,   264,
+   nil,   253,   264,   246,   246,   264,   nil,   246,   nil,   246,
+   nil,   253,   nil,   264,   nil,   253,   253,   nil,   nil,   253,
+   nil,   nil,   nil,   253,   253,    66,    66,   nil,   253,   239,
+   nil,   nil,   nil,   239,   239,   nil,   246,   239,   nil,   253,
+   246,   246,   239,   nil,   246,   nil,   239,   nil,    66,   246,
+   238,   238,   nil,   246,   nil,   nil,   nil,   239,    66,   nil,
+   nil,   nil,    66,    66,   246,   nil,    66,   nil,    68,    68,
+    66,    66,    68,   nil,    68,    66,   nil,   281,   281,   281,
+   281,   281,   281,   238,   281,   281,    66,   238,   238,   nil,
+    68,   238,   nil,   nil,   nil,   nil,   238,   nil,   195,   195,
+   238,    68,   195,   nil,   195,    68,    68,   nil,   nil,    68,
+   nil,   238,   nil,   nil,    68,    68,   nil,   nil,    68,   nil,
+   195,    68,   nil,   nil,   227,   227,   nil,   nil,   227,    68,
+   227,   195,   nil,   nil,   nil,   195,   195,   nil,   nil,   195,
+   nil,   nil,   nil,   nil,   195,   195,   226,   226,   195,   nil,
+   226,   195,   226,   nil,   nil,   nil,   nil,   227,   nil,   195,
+   nil,   227,   227,   nil,   nil,   227,   nil,   222,   222,   nil,
+   227,   222,   nil,   nil,   227,   nil,   nil,   nil,   nil,   226,
+   nil,   nil,   nil,   226,   226,   227,   nil,   226,   nil,    75,
+    75,   nil,   226,    75,   nil,    75,   226,   nil,   nil,   nil,
+   222,   nil,   nil,   nil,   222,   222,   nil,   226,   222,   nil,
+   196,   196,   nil,   222,   196,   nil,   196,   222,   nil,   nil,
+   nil,   nil,    75,   nil,   nil,   nil,    75,    75,   222,   nil,
+    75,   nil,   196,   nil,   nil,    75,   198,   198,   nil,    75,
+   198,   nil,   198,   196,   nil,   nil,   nil,   196,   196,   nil,
+    75,   196,   nil,   nil,   206,   206,   196,   196,   198,   nil,
+   196,   nil,   nil,   196,   nil,   nil,   nil,   nil,   nil,   198,
+   nil,   196,   nil,   198,   198,   nil,   nil,   198,   nil,   nil,
+   nil,   nil,   198,   198,   205,   205,   198,   206,   205,   198,
+   205,   206,   206,   104,   nil,   206,   nil,   198,   nil,   nil,
+   206,   nil,   104,   104,   206,   nil,   205,   nil,   nil,   nil,
+   nil,   104,   104,   104,   104,   206,   nil,   205,   nil,   nil,
+   nil,   205,   205,    96,    96,   205,   nil,    96,    96,    96,
+   205,   205,   nil,   nil,   205,   104,   104,   205,   nil,   104,
+   104,   104,   104,   104,   104,   205,   104,   104,   202,   202,
+   nil,   nil,   202,   nil,   202,   nil,    96,   nil,   nil,   nil,
+    96,    96,   nil,   nil,    96,   nil,   nil,   nil,   nil,    96,
+   202,   nil,   nil,    96,    88,    88,   nil,   nil,    88,   nil,
+    88,   202,   nil,   nil,    96,   202,   202,   nil,   nil,   202,
+   nil,   nil,   nil,   nil,   202,   202,    88,   nil,   202,   nil,
+   nil,   202,   nil,   nil,    92,    92,   nil,    88,    92,   202,
+    92,    88,    88,   nil,   nil,    88,   nil,   nil,   nil,   nil,
+    88,    88,   nil,   nil,    88,   nil,    92,    88,   nil,   nil,
+   200,   200,   nil,   nil,   200,    88,   200,    92,   nil,   nil,
+   nil,    92,    92,   nil,   nil,    92,   nil,   nil,   nil,   nil,
+    92,    92,   200,   nil,    92,   nil,   nil,    92,   nil,   nil,
+   nil,   nil,   nil,   200,   nil,    92,   nil,   200,   200,   nil,
+   nil,   200,   174,   174,   nil,   nil,   200,   200,   nil,   nil,
+   200,   nil,   nil,   200,   nil,   174,   174,   nil,   nil,   nil,
+   nil,   200,   nil,   nil,   174,   174,   174,   174,   179,   179,
+   nil,   nil,   nil,   nil,   nil,   nil,   179,   179,   179,   179,
+   179,   nil,   nil,   282,   282,   282,   282,   nil,   174,   174,
+   282,   282,   174,   174,   174,   174,   174,   174,   nil,   174,
+   174,   179,   179,   nil,   nil,   179,   179,   179,   179,   179,
+   179,   nil,   179,   179,   213,   213,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,   213,   213,   213,   213,   145,   145,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   145,   145,   145,   145,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   213,   213,   nil,
+   nil,   213,   213,   213,   213,   213,   213,   nil,   213,   213,
+   145,   145,   nil,   nil,   145,   145,   145,   145,   145,   145,
+   nil,   145,   145,   284,   284,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,   284,   284,   284,   284,   288,   288,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   288,   288,   288,   288,   nil,
+   nil,   290,   290,   290,   290,   290,   290,   284,   290,   290,
+   284,   284,   284,   284,   284,   284,   nil,   284,   284,   nil,
+   nil,   nil,   nil,   288,   288,   288,   288,   288,   288,   nil,
+   288,   288,   144,   144,   nil,   nil,   nil,   nil,   nil,   nil,
+   nil,   144,   144,   144,   144,   285,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,   285,   289,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,   289,   nil,   nil,   144,   144,   286,   nil,   144,
+   144,   144,   144,   144,   144,   286,   144,   144,   nil,   nil,
+   nil,   285,   285,   285,   285,   285,   285,   nil,   285,   285,
+   289,   289,   289,   289,   289,   289,   319,   289,   289,   nil,
+   nil,   nil,   nil,   286,   286,   286,   286,   286,   286,   nil,
+   286,   286,   nil,   nil,   nil,   220,   nil,   319,   nil,   319,
+   319,   nil,   319,   319,   nil,   319,   nil,   319,   nil,   319,
+   nil,   319,   nil,   nil,   319,   319,   220,   235,   220,   220,
+   nil,   220,   220,   nil,   220,   nil,   220,   nil,   220,   nil,
+   220,   nil,   nil,   220,   220,   nil,   292,   nil,   235,   nil,
+   235,   235,   nil,   235,   235,   nil,   235,   nil,   235,   nil,
+   235,   nil,   235,   nil,   nil,   235,   235,   292,   320,   292,
+   292,   nil,   292,   292,   nil,   292,   nil,   292,   nil,   292,
+   nil,   292,   nil,   nil,   292,   292,   nil,   358,   nil,   320,
+   nil,   320,   320,   nil,   320,   320,   nil,   320,   nil,   320,
+   nil,   320,   nil,   320,   nil,   nil,   320,   320,   358,   367,
+   358,   358,   nil,   358,   358,   nil,   358,   nil,   358,   nil,
+   358,   nil,   358,   nil,   nil,   358,   358,   nil,   369,   nil,
+   367,   nil,   367,   367,   nil,   367,   367,   nil,   367,   nil,
+   367,   nil,   367,   nil,   367,   nil,   nil,   367,   367,   369,
+   373,   369,   369,   nil,   369,   369,   nil,   369,   nil,   369,
+   nil,   369,   nil,   369,   nil,   nil,   369,   369,   nil,   204,
+   nil,   373,   nil,   373,   373,   nil,   373,   373,   nil,   373,
+   nil,   373,   nil,   373,   nil,   373,   nil,   nil,   373,   373,
+   204,   305,   204,   204,   nil,   204,   204,   nil,   204,   nil,
+   204,   nil,   204,   nil,   204,   nil,   nil,   204,   204,   nil,
+   375,   nil,   305,   nil,   305,   305,   nil,   305,   305,   nil,
+   305,   nil,   305,   nil,   305,   nil,   305,   nil,   nil,   305,
+   305,   375,   nil,   375,   375,   nil,   375,   375,   nil,   375,
+   nil,   375,   nil,   375,   nil,   375,   nil,   nil,   375,   375,
+    15,   nil,    15,    15,   nil,    15,    15,   nil,    15,   nil,
+    15,   nil,    15,   nil,    15,   nil,   nil,    15,    15 ]
 
 racc_action_pointer = [
-  1734,   177,   353,   nil,  1715,   175,   nil,   nil,   103,   nil,
-   nil,   nil,   104,   343,   nil,   nil,   nil,   nil,   nil,    13,
-   347,   nil,   nil,   345,   158,   nil,   206,   nil,   225,   nil,
-   349,     6,   nil,   343,   nil,   316,   nil,   nil,   nil,   nil,
-   326,   374,   400,   393,   -13,   465,   nil,   nil,    -7,   nil,
-   nil,   nil,   nil,   nil,    -2,   281,   nil,   290,   283,   297,
-   nil,   nil,   642,   296,   nil,   694,   nil,   278,   294,   nil,
-   287,   796,   nil,   nil,   243,     4,   nil,   nil,   234,   229,
-   nil,   245,   195,   930,   193,   177,   136,   nil,  1034,  1111,
-   nil,   171,   nil,  1108,   nil,  1147,   nil,   146,   247,   259,
-   nil,   260,   282,   nil,   284,   nil,   -11,   301,   719,   276,
-   -15,   320,   nil,   122,   316,  1297,  1415,   318,   290,  1310,
-   nil,    29,    17,   320,   nil,   nil,   nil,   nil,   324,   nil,
-   nil,   nil,   318,    12,   341,   371,   366,   nil,   381,   380,
-   382,   nil,   nil,   nil,    -4,   nil,    88,     0,   nil,  1238,
-    19,   nil,   192,    62,    91,   nil,  1251,   232,   283,   513,
-   561,   587,   617,   668,   745,  1198,   978,   231,  1004,  1060,
-   771,   213,  1469,  1172,   nil,   nil,   267,   168,   nil,   nil,
-   248,   nil,   nil,  1078,   125,   nil,   nil,    82,   186,   nil,
-   nil,   nil,     0,   nil,   nil,    -8,   164,   322,     5,    -6,
-   nil,    64,    74,    98,    96,   nil,  1655,   nil,   nil,   155,
-   138,   nil,   nil,  1573,   193,   956,   909,   179,   220,   199,
-   204,   241,   883,   840,   nil,   246,   nil,   858,   nil,   nil,
-   nil,   nil,   nil,   nil,   810,   nil,   251,   239,   nil,   789,
-   nil,   nil,   nil,   nil,   nil,    56,   nil,   186,   129,    16,
-   440,   421,   330,  1436,  1356,  1427,    29,   nil,  1369,   111,
-  1347,   nil,  1510,   283,   236,   312,   nil,   186,   nil,   539,
-   483,   nil,    22,   nil,   nil,    48,   nil,   118,   nil,   nil,
-   418,   327,   324,   nil,   330,   nil,   309,   302,   nil,   185,
-   nil,  1491,   nil,  1532,   nil,   nil,   nil,  1551,   nil,   nil,
-   nil,   nil,   nil,   nil,   344,   nil,   nil,   nil,   nil,   nil,
-   nil,   nil,   144,   nil,    92,   nil,   329,   nil,   355,   nil,
-   nil,   nil,   nil,   nil,   nil,    93,   360,   nil,   nil,   346,
-   nil,   348,   350,   nil,   351,   355,   nil,   372,   nil,   nil,
-   nil,   nil,   nil,  1592,   nil,   nil,   nil,   nil,   379,    72,
-   384,   nil,  1614,   nil,  1633,   nil,   nil,   nil,   nil,  1674,
-   nil,  1696,   nil,   nil,   nil ]
+   359,    58,   408,   nil,   441,   436,   nil,    80,   nil,   nil,
+   104,   nil,   409,   nil,   nil,  1700,    15,   nil,   nil,    -3,
+   nil,   nil,   181,   nil,   468,   234,   155,   nil,   nil,   253,
+   412,   438,   347,    -2,   356,   nil,   314,   nil,   nil,   nil,
+   304,   295,   488,   514,   539,   309,   325,   nil,     2,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   -12,   669,   238,   264,
+    57,   nil,   nil,   229,   nil,   213,   763,   199,   806,   nil,
+   nil,   207,   166,   163,   159,   927,   nil,   122,   nil,     2,
+   319,   nil,    26,   nil,    97,   nil,   nil,   196,  1112,   nil,
+   nil,   nil,  1142,   209,   133,   234,  1061,   nil,   267,   268,
+   271,    98,   275,   nil,  1025,   nil,   279,   296,   nil,   303,
+   nil,   107,   nil,   nil,   nil,   nil,   nil,   306,   260,   164,
+   123,   nil,   332,   nil,   nil,   300,   325,   nil,   343,   357,
+   nil,   363,   413,   nil,    20,   nil,   nil,   nil,   432,   nil,
+   nil,   nil,    -2,   441,  1385,  1280,   423,   377,   nil,     0,
+   377,     5,   nil,   nil,   nil,    -8,   nil,   138,   nil,   nil,
+   nil,   nil,   325,   nil,   462,   360,   358,   322,    32,    17,
+    -1,   nil,    69,   nil,  1208,   436,   127,   191,   nil,  1221,
+   nil,   451,   nil,   nil,   137,   nil,   nil,   nil,   311,   376,
+   402,   432,   458,   565,   621,   836,   948,    -2,   974,   216,
+  1168,   591,  1086,   138,  1640,  1022,   992,   nil,     9,   nil,
+   nil,   nil,    23,  1267,   nil,    44,    74,     9,   nil,   112,
+  1476,   152,   905,   129,   162,   140,   884,   862,   152,   189,
+   nil,   224,   nil,   200,   nil,  1498,   nil,   -15,   788,   734,
+    78,   nil,   nil,   nil,   nil,   nil,   741,   nil,   232,   239,
+   nil,   nil,   nil,   716,   nil,   254,   nil,   nil,   nil,   nil,
+   nil,   246,   175,   nil,   690,   nil,   nil,   nil,    64,   nil,
+   278,   nil,   280,   nil,   113,   nil,   647,   356,    98,   145,
+   275,   763,  1199,   191,  1326,  1397,  1419,   nil,  1339,  1406,
+  1317,   nil,  1517,   314,   219,   325,   nil,   130,   nil,   nil,
+   318,   nil,    91,   nil,   311,  1662,   nil,   nil,   nil,   nil,
+   nil,   371,   nil,   nil,   nil,   nil,   nil,   nil,   nil,  1457,
+  1539,   nil,   nil,   364,   nil,   367,   370,   373,   nil,   375,
+   nil,   nil,   nil,   nil,   393,   nil,    85,   nil,    73,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   396,   421,   nil,   nil,
+   nil,    71,   424,   nil,   nil,   nil,   nil,   nil,  1558,   nil,
+   nil,   nil,   nil,   427,    27,   437,   nil,  1580,   nil,  1599,
+   nil,   nil,   nil,  1621,   nil,  1681,   nil,   nil,   nil ]
 
 racc_action_default = [
-  -183,  -220,   -40,   -13,    -1,  -220,   -14,    -2,  -220,   -15,
-    -3,  -174,  -175,  -220,   -16,    -5,  -172,   -17,    -6,  -220,
-  -220,    -7,    -8,  -220,  -173,    -9,  -220,   -10,  -220,   -11,
-  -220,  -220,   -12,  -220,  -175,  -183,  -173,   -41,    -4,   -39,
-  -220,  -220,  -220,  -220,  -183,  -220,  -180,  -182,  -183,  -176,
-  -179,  -178,  -208,  -181,   -75,   -82,  -159,   -29,   -30,  -200,
-  -107,   -31,  -220,  -218,  -161,  -220,   -34,   -32,   -64,   -33,
-   -21,  -220,  -112,   -22,  -220,   -63,   -23,   -62,   -26,   -27,
-  -160,  -220,   -28,  -220,  -104,   -96,  -103,   -99,  -220,  -220,
-   -97,   -93,  -101,  -220,  -120,  -220,  -102,  -220,   -94,   -98,
-  -100,   -95,  -220,  -163,  -165,  -162,  -183,   -43,  -220,   -75,
-  -183,  -220,  -185,  -184,  -220,   -72,   -74,  -220,  -183,   -73,
-  -194,  -220,  -220,  -220,  -158,  -157,   -70,   -68,   -65,   -76,
-   -71,   -64,   -60,   -63,   -66,  -206,   -69,   -58,   -67,  -220,
-  -206,   -80,   -81,   -83,  -220,   -20,  -220,  -220,  -108,  -220,
-  -220,   -85,  -220,  -220,  -220,  -129,  -220,  -220,  -220,  -220,
-  -220,  -220,  -220,  -220,  -220,  -220,  -220,  -220,  -220,  -220,
-  -220,  -220,  -220,  -220,  -136,  -203,  -220,  -220,  -212,  -216,
-  -220,  -215,  -211,  -220,  -220,   -46,  -200,  -183,  -220,   -47,
-   -49,   -63,  -220,   -56,   -55,   -82,  -220,  -220,  -206,  -220,
-   365,  -193,  -191,  -220,  -220,  -188,  -220,  -217,  -196,  -220,
-  -220,  -177,  -195,  -220,  -220,   -61,  -220,  -207,  -220,   -75,
-  -207,  -220,  -220,  -220,   -18,  -220,  -109,  -220,  -110,   -24,
-   -25,  -204,  -205,  -113,  -220,  -155,  -220,   -63,  -153,  -220,
-  -147,  -156,  -148,  -154,  -106,  -220,  -139,  -124,  -126,  -125,
-  -127,  -131,  -128,  -133,  -138,  -135,  -132,  -121,  -137,  -134,
-  -130,  -122,  -220,  -117,  -123,  -205,  -201,  -220,  -209,  -220,
-  -220,  -141,  -220,  -145,  -164,  -220,   -44,  -220,   -52,   -51,
-  -220,  -220,  -206,  -114,  -220,   -45,  -220,  -220,  -186,  -220,
-  -187,  -220,  -167,  -220,  -197,  -198,  -199,  -220,  -171,   -35,
-   -59,   -78,   -77,   -36,  -206,   -84,   -38,   -79,   -19,  -219,
-  -111,   -86,  -220,  -150,  -206,  -105,  -117,  -116,  -220,  -202,
-  -213,  -210,  -214,  -142,  -140,  -220,  -220,   -50,   -48,   -90,
-   -91,   -87,   -88,   -53,   -92,   -89,   -54,  -220,   -37,  -192,
-  -190,  -189,  -166,  -220,  -169,  -170,   -57,  -152,  -205,  -220,
-  -220,  -115,  -220,  -146,  -220,   -42,  -168,  -151,  -149,  -220,
-  -119,  -220,  -144,  -118,  -143 ]
+  -193,  -230,   -50,    -9,  -230,   -22,   -10,  -230,   -11,  -184,
+  -185,   -12,  -230,  -182,   -13,    -1,  -230,   -14,    -2,  -230,
+   -15,    -3,  -183,   -16,    -5,  -230,  -230,   -17,    -6,  -230,
+   -18,    -7,  -230,  -230,  -230,    -8,  -193,  -185,  -183,   -51,
+   -85,   -92,  -230,  -230,  -230,  -193,  -230,    -4,  -193,  -190,
+  -186,  -188,  -189,  -218,  -192,  -191,  -193,  -230,   -85,   -53,
+  -193,   -43,   -33,  -210,  -117,   -31,  -230,  -230,  -230,   -44,
+   -32,   -74,   -36,   -37,  -230,  -230,  -122,   -38,  -169,   -73,
+   -39,   -72,   -40,   -41,  -228,  -171,  -170,   -42,  -230,  -111,
+  -130,  -112,  -230,  -104,  -230,  -108,  -230,  -110,  -105,  -114,
+  -106,  -230,  -113,  -109,  -230,  -107,  -103,  -230,   -49,  -230,
+   -26,  -230,   -27,   -24,   -25,  -172,  -173,  -175,  -230,  -230,
+  -194,  -195,  -230,   -86,   -81,   -70,   -76,   -74,  -216,   -79,
+   -68,   -77,  -230,  -168,   -73,  -167,   -80,   -78,   -75,   -90,
+   -91,   -93,  -230,  -216,   -82,   -84,  -230,  -193,   379,  -230,
+  -230,  -230,  -204,   -57,  -210,  -193,   -59,  -230,   -66,   -65,
+   -56,   -73,  -230,   -95,  -230,  -216,  -230,   -92,  -230,  -230,
+  -230,   -30,  -230,  -118,  -230,  -230,  -230,  -230,  -139,  -230,
+  -146,  -230,  -213,  -225,  -230,  -222,  -221,  -226,  -230,  -230,
+  -230,  -230,  -230,  -230,  -230,  -230,  -230,  -230,  -230,  -230,
+  -230,  -230,  -230,  -230,  -230,  -230,  -230,   -22,  -183,   -21,
+   -23,   -20,  -230,   -83,   -19,  -203,  -230,  -230,  -198,  -201,
+  -230,  -230,   -71,  -217,  -230,   -85,  -230,  -230,  -217,  -230,
+  -227,  -230,  -206,  -230,  -187,  -230,  -205,  -230,  -230,  -230,
+  -230,   -54,   -62,   -61,  -214,  -215,  -230,  -124,  -230,  -216,
+   -55,   -35,   -34,  -230,   -28,  -230,  -163,  -157,  -166,  -158,
+  -164,   -73,  -230,  -165,  -230,  -120,  -119,  -123,  -230,  -116,
+  -230,  -149,  -215,  -211,  -230,  -219,  -230,  -134,  -136,  -135,
+  -137,  -141,  -138,  -143,  -148,  -145,  -142,  -131,  -147,  -144,
+  -140,  -132,  -230,  -127,  -133,  -230,  -151,  -230,  -155,  -174,
+  -230,  -196,  -230,  -197,  -230,  -230,  -177,   -45,   -69,   -87,
+   -46,  -216,   -88,   -89,   -94,   -48,  -208,  -207,  -209,  -230,
+  -230,  -181,   -60,   -98,   -63,  -102,   -99,  -100,  -101,   -97,
+   -64,   -58,   -96,   -47,  -230,   -29,  -230,  -160,  -216,  -121,
+  -115,  -229,  -212,  -223,  -220,  -224,  -127,  -230,  -126,  -152,
+  -150,  -230,  -230,  -202,  -199,  -200,  -176,   -67,  -230,  -179,
+  -180,   -52,  -162,  -215,  -230,  -230,  -125,  -230,  -156,  -230,
+  -178,  -161,  -159,  -230,  -129,  -230,  -154,  -128,  -153 ]
 
 racc_goto_table = [
-    31,    69,   205,    13,    31,    40,   178,    13,    35,   242,
-   218,   148,    67,    23,    38,   221,     4,    23,   236,    44,
-   126,    61,   135,   137,    58,   140,   103,    49,    70,   141,
-     7,   130,   271,   229,    47,   317,   188,    76,   114,    69,
-   199,   270,   128,   152,   333,   336,   226,   118,   273,   349,
-    67,   127,   305,   240,   125,    39,   314,   132,   104,    61,
-   214,   209,    58,    48,   123,   112,   146,   176,   328,   212,
-   203,   204,    56,   284,   112,    76,   107,   198,   120,   294,
-   196,   177,    33,   nil,   nil,   179,   nil,   nil,   351,   nil,
-   nil,   nil,   nil,   nil,   nil,   313,   nil,   nil,   nil,   nil,
-   nil,   nil,    56,   nil,   236,   nil,   229,   nil,   nil,   nil,
-    56,   nil,   nil,   nil,   nil,   nil,   nil,   275,   nil,   323,
-   nil,   nil,   nil,   nil,   nil,   nil,   nil,    69,   nil,   211,
-   nil,    69,   nil,   nil,   nil,   273,    47,    47,    67,   nil,
-   nil,   235,    67,   nil,   nil,   nil,   nil,    61,   208,   nil,
-    58,    61,   nil,   125,    58,   nil,   nil,   337,   245,   nil,
-   nil,   nil,   nil,   230,   nil,   282,   nil,    76,   nil,   141,
-   nil,   235,    31,   310,   nil,    13,   320,   nil,   341,   346,
-   274,   126,   257,   125,   300,    23,   261,   304,   262,   350,
-   353,   302,   130,   nil,   141,   nil,   nil,   nil,    56,   nil,
-    69,    56,    56,   128,   nil,   357,    31,   nil,   nil,    13,
-   nil,    67,   127,    31,   236,   125,    13,   295,   nil,    23,
-    61,   nil,   291,    58,   nil,   nil,    23,   235,   nil,   297,
-   nil,    56,   nil,   nil,   nil,   nil,   230,   nil,   nil,   125,
+    33,    87,   173,     5,    47,   259,   218,    36,   185,   139,
+    15,    65,    54,    18,   109,    33,    45,    50,     5,   138,
+   128,    61,    19,   255,   108,    62,   143,   162,   130,   146,
+   296,   168,   252,   164,   136,   348,   111,    19,   165,   124,
+   119,   122,   163,   295,   116,    87,    83,   364,   107,   121,
+   147,   175,   324,   330,   210,   170,   224,   298,   121,    82,
+   163,   152,   210,   266,   137,    61,   211,   257,   314,    62,
+   338,   229,   181,   125,   214,   117,   221,   135,   233,    48,
+   187,   163,   150,    59,   236,   216,    72,   217,   366,   331,
+    83,   317,   184,   248,    12,   337,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,    82,   126,   nil,   nil,   nil,   nil,   209,
+   nil,   nil,   nil,   255,   207,   nil,   252,   209,   nil,   349,
+   158,   nil,   207,   nil,   158,   nil,   237,   nil,   nil,   nil,
+    72,   nil,   nil,    19,   nil,   139,   nil,   nil,   nil,   nil,
+   nil,    19,   nil,   nil,   nil,    54,   298,    54,    87,   nil,
+   234,   263,   249,   nil,   nil,    87,   nil,   nil,   nil,   nil,
+   232,   nil,   270,   nil,   nil,   268,   nil,   nil,    61,   nil,
+   nil,   nil,   251,   nil,   nil,    61,   nil,   334,   nil,    62,
+   nil,   343,   nil,   nil,   nil,   263,   nil,   nil,   354,   nil,
+    78,   309,   nil,    83,   nil,   287,   139,   371,   339,   291,
+    83,   138,   368,   nil,    33,   311,    82,     5,    78,   135,
+   308,   312,   313,    82,   292,   255,   136,   329,   329,   158,
+    33,   124,   nil,     5,   299,   nil,    19,   nil,   nil,   nil,
+   305,   332,    87,    72,    78,    33,   256,   316,     5,   357,
+    72,   263,    19,   135,   nil,   320,   137,   nil,   nil,    77,
+   nil,   nil,    61,   187,   nil,   nil,   251,    19,   nil,   135,
+   nil,   345,   328,   328,   nil,   nil,   365,   131,   nil,    80,
+   256,   nil,   nil,   nil,   263,   135,   135,    83,   nil,   nil,
+   nil,    47,   nil,   nil,   nil,   353,   126,   133,   nil,   355,
+    82,   nil,    33,    77,    47,     5,   nil,   nil,   nil,   135,
+   nil,   nil,   323,   323,   158,    33,   nil,   nil,     5,    47,
+   nil,   nil,   nil,    80,    19,   nil,   nil,    72,   nil,    33,
+    33,   362,     5,     5,   nil,   nil,   256,    19,   nil,   358,
+   263,   nil,   135,   nil,   nil,   nil,   nil,    78,   nil,   nil,
+    78,    19,    19,   263,    78,   nil,   nil,    47,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,    33,   256,
+   nil,     5,    47,   nil,    47,   nil,    73,    33,   nil,    33,
+     5,   nil,     5,    33,    78,    33,     5,   373,     5,   375,
+    19,   nil,   nil,   nil,   129,   nil,   nil,   nil,   135,    19,
+    78,    19,   nil,   nil,   nil,    19,    77,    19,   nil,   260,
+   159,   135,   nil,    77,   159,   nil,    78,    78,   nil,   nil,
+    73,   nil,   nil,   nil,   nil,   256,    80,   nil,   nil,   133,
+   nil,    78,   nil,    80,   nil,   nil,   nil,   nil,   256,   nil,
+    78,   nil,   nil,   260,   nil,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   131,
+   nil,   nil,   nil,   133,   104,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,    78,   nil,   326,   326,   nil,   nil,   133,
+   nil,   144,   145,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
+    77,   nil,   nil,   nil,   nil,   327,   327,   nil,   nil,   260,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   159,
+    80,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   133,
+   nil,   nil,   nil,    73,   nil,   nil,   258,   178,   nil,    78,
+    73,   179,   260,   180,   nil,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,    78,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,   133,   nil,   nil,   nil,   nil,   213,   nil,   nil,
+   258,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   129,   nil,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   260,   nil,
+   nil,   nil,   325,   325,   159,   nil,   nil,   nil,   nil,   nil,
+   nil,   260,   nil,   nil,   nil,   nil,   nil,    73,   133,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   258,   nil,   nil,   nil,
+   nil,   133,   nil,   nil,   nil,   nil,   nil,   nil,   277,   278,
+   279,   280,   281,   282,   283,   284,   285,   286,   nil,   288,
+   289,   290,   nil,   nil,   294,   nil,   nil,   nil,   nil,   258,
    nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
-   nil,   nil,    78,   nil,    79,   179,   nil,   nil,   235,   nil,
-   nil,   nil,    31,    56,   nil,    13,   nil,   nil,   331,   331,
-   125,    56,    38,    57,   nil,    23,   nil,   330,   330,   nil,
-   125,   125,   134,   nil,   136,   nil,   nil,    56,   nil,   nil,
-    78,    31,    79,    31,    13,   nil,    13,    31,   nil,   nil,
-    13,    38,   nil,   124,    23,   nil,    23,    38,   102,   343,
-    23,    57,   nil,   235,   nil,   nil,   nil,   nil,    56,   nil,
-   nil,   nil,   nil,   117,   nil,   125,   nil,   nil,    56,    56,
-   nil,   nil,   nil,   nil,   193,   nil,   194,   235,   193,   nil,
-   194,   nil,   nil,    31,   nil,   nil,    13,    82,   nil,   125,
-   nil,   151,    31,    38,    31,    13,    23,    13,   nil,    31,
-   nil,    31,    13,   nil,    13,    23,   nil,    23,   359,    38,
-   361,    38,    23,    56,    23,   151,   nil,   138,    78,   nil,
-    79,   238,    78,   241,    79,    82,   nil,   nil,   151,   nil,
-   nil,   nil,   nil,   nil,   nil,   nil,   nil,    56,   nil,    57,
-   nil,   nil,   124,    57,   nil,   nil,   nil,   nil,   nil,   nil,
-   nil,   238,   nil,   241,   nil,   193,   nil,   194,   nil,   nil,
-   nil,   nil,   nil,   nil,   nil,   nil,   nil,   225,   nil,   nil,
-   nil,   nil,   124,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
-   nil,   nil,   nil,   134,   nil,   136,   nil,   nil,   nil,   nil,
-   nil,    78,   nil,    79,   nil,   nil,   nil,   nil,   nil,   nil,
-   nil,   nil,   nil,   nil,   124,   nil,   nil,   238,   nil,   241,
-   nil,   nil,    57,    82,    89,   nil,   243,    82,   nil,   nil,
-   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   124,   115,
-   116,   nil,   nil,   119,   nil,   nil,   301,   nil,   238,   nil,
-   241,   nil,   307,   nil,   nil,   193,   243,   194,   332,   332,
-   334,   334,   nil,   nil,   311,   nil,   nil,   nil,   nil,   124,
-   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   329,
-   329,   155,   nil,   nil,   nil,   nil,   156,   nil,   138,   nil,
-   nil,   174,   nil,   nil,   nil,   nil,    82,   nil,   nil,   322,
-   nil,   nil,   nil,   238,   nil,   241,   nil,   nil,   nil,   nil,
-   nil,   nil,   243,   nil,   nil,   nil,   339,   340,   nil,   nil,
-   nil,   nil,   nil,   nil,   124,   nil,   nil,   238,   nil,   241,
    nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
-   nil,   nil,   347,   243,   nil,   nil,   nil,   nil,   124,   nil,
-   nil,   nil,   nil,   335,   335,   247,   248,   249,   250,   251,
-   252,   253,   254,   255,   256,   nil,   258,   259,   260,   nil,
-   nil,   264,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
    nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
-   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   243,   nil,
    nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
    nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
-   nil,   nil,   243 ]
+   nil,   nil,   nil,   nil,   nil,   258,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   258 ]
 
 racc_goto_check = [
-    34,    28,    78,    49,    34,    34,    81,    49,    29,    66,
-    33,    57,    27,    20,     4,    33,     2,    20,    64,    29,
-    47,    26,    32,    44,    25,    35,    68,    74,    18,    50,
-     3,    28,    62,    19,    60,    59,    38,    20,    70,    28,
-    38,    61,    27,    54,    43,    43,    58,    70,    64,    55,
-    27,    26,    53,    65,    25,     5,    67,    30,    69,    26,
-    31,    71,    25,    72,    73,     3,    18,    54,    39,    75,
-    76,    77,    46,    33,     3,    20,    37,    32,     3,    79,
-    54,    80,     1,   nil,   nil,    27,   nil,   nil,    59,   nil,
-   nil,   nil,   nil,   nil,   nil,    66,   nil,   nil,   nil,   nil,
-   nil,   nil,    46,   nil,    64,   nil,    19,   nil,   nil,   nil,
-    46,   nil,   nil,   nil,   nil,   nil,   nil,    38,   nil,    62,
-   nil,   nil,   nil,   nil,   nil,   nil,   nil,    28,   nil,    74,
-   nil,    28,   nil,   nil,   nil,    64,    60,    60,    27,   nil,
-   nil,    27,    27,   nil,   nil,   nil,   nil,    26,     3,   nil,
-    25,    26,   nil,    25,    25,   nil,   nil,    33,    18,   nil,
-   nil,   nil,   nil,    20,   nil,    35,   nil,    20,   nil,    50,
-   nil,    27,    34,    57,   nil,    49,    81,   nil,    78,    33,
-    68,    47,    60,    25,    44,    20,    60,    32,     2,    33,
-    64,    50,    28,   nil,    50,   nil,   nil,   nil,    46,   nil,
-    28,    46,    46,    27,   nil,    66,    34,   nil,   nil,    49,
-   nil,    27,    26,    34,    64,    25,    49,    29,   nil,    20,
-    26,   nil,     2,    25,   nil,   nil,    20,    27,   nil,     2,
-   nil,    46,   nil,   nil,   nil,   nil,    20,   nil,   nil,    25,
+    52,    30,    60,    21,     4,    69,    81,    32,    84,    53,
+     2,    22,    63,     3,    54,    52,    32,    77,    21,    30,
+    35,    31,    37,    67,     5,    21,    38,    41,    47,    54,
+    65,    41,    23,    57,    50,    62,    20,    37,    35,    31,
+    20,    73,    54,    64,    71,    30,    29,    58,    37,     3,
+    73,    57,    46,    46,     7,    22,    36,    67,     3,    28,
+    54,     3,     7,    61,    29,    31,    19,    68,    56,    21,
+    70,    36,    57,    33,    19,    72,    34,    28,    74,    75,
+    30,    54,    76,    40,    78,    79,    24,    80,    62,    42,
+    29,    82,    83,    36,     1,    69,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,    28,    24,   nil,   nil,   nil,   nil,     5,
+   nil,   nil,   nil,    67,    21,   nil,    23,     5,   nil,    65,
+    24,   nil,    21,   nil,    24,   nil,    41,   nil,   nil,   nil,
+    24,   nil,   nil,    37,   nil,    53,   nil,   nil,   nil,   nil,
+   nil,    37,   nil,   nil,   nil,    63,    67,    63,    30,   nil,
+    77,    30,    38,   nil,   nil,    30,   nil,   nil,   nil,   nil,
+     3,   nil,    54,   nil,   nil,    22,   nil,   nil,    31,   nil,
+   nil,   nil,    21,   nil,   nil,    31,   nil,    36,   nil,    21,
+   nil,    84,   nil,   nil,   nil,    30,   nil,   nil,    81,   nil,
+    49,    53,   nil,    29,   nil,    63,    53,    69,    60,    63,
+    29,    30,    67,   nil,    52,    35,    28,    21,    49,    28,
+    47,    54,    54,    28,     2,    67,    50,    30,    30,    24,
+    52,    31,   nil,    21,    71,   nil,    37,   nil,   nil,   nil,
+     2,    54,    30,    24,    49,    52,    24,    32,    21,    36,
+    24,    30,    37,    28,   nil,     2,    29,   nil,   nil,    26,
+   nil,   nil,    31,    30,   nil,   nil,    21,    37,   nil,    28,
+   nil,    54,    29,    29,   nil,   nil,    36,    26,   nil,    27,
+    24,   nil,   nil,   nil,    30,    28,    28,    29,   nil,   nil,
+   nil,     4,   nil,   nil,   nil,    54,    24,    27,   nil,    54,
+    28,   nil,    52,    26,     4,    21,   nil,   nil,   nil,    28,
+   nil,   nil,    24,    24,    24,    52,   nil,   nil,    21,     4,
+   nil,   nil,   nil,    27,    37,   nil,   nil,    24,   nil,    52,
+    52,    54,    21,    21,   nil,   nil,    24,    37,   nil,     2,
+    30,   nil,    28,   nil,   nil,   nil,   nil,    49,   nil,   nil,
+    49,    37,    37,    30,    49,   nil,   nil,     4,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,    52,    24,
+   nil,    21,     4,   nil,     4,   nil,    25,    52,   nil,    52,
+    21,   nil,    21,    52,    49,    52,    21,     2,    21,     2,
+    37,   nil,   nil,   nil,    25,   nil,   nil,   nil,    28,    37,
+    49,    37,   nil,   nil,   nil,    37,    26,    37,   nil,    26,
+    25,    28,   nil,    26,    25,   nil,    49,    49,   nil,   nil,
+    25,   nil,   nil,   nil,   nil,    24,    27,   nil,   nil,    27,
+   nil,    49,   nil,    27,   nil,   nil,   nil,   nil,    24,   nil,
+    49,   nil,   nil,    26,   nil,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,    26,
+   nil,   nil,   nil,    27,    51,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,    49,   nil,    26,    26,   nil,   nil,    27,
+   nil,    51,    51,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
+    26,   nil,   nil,   nil,   nil,    27,    27,   nil,   nil,    26,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,    25,
+    27,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,    27,
+   nil,   nil,   nil,    25,   nil,   nil,    25,    51,   nil,    49,
+    25,    51,    26,    51,   nil,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,    49,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,    27,   nil,   nil,   nil,   nil,    51,   nil,   nil,
+    25,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,    25,   nil,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,    26,   nil,
+   nil,   nil,    25,    25,    25,   nil,   nil,   nil,   nil,   nil,
+   nil,    26,   nil,   nil,   nil,   nil,   nil,    25,    27,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,    25,   nil,   nil,   nil,
+   nil,    27,   nil,   nil,   nil,   nil,   nil,   nil,    51,    51,
+    51,    51,    51,    51,    51,    51,    51,    51,   nil,    51,
+    51,    51,   nil,   nil,    51,   nil,   nil,   nil,   nil,    25,
    nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
-   nil,   nil,    21,   nil,    22,    27,   nil,   nil,    27,   nil,
-   nil,   nil,    34,    46,   nil,    49,   nil,   nil,    27,    27,
-    25,    46,     4,    24,   nil,    20,   nil,    26,    26,   nil,
-    25,    25,    21,   nil,    22,   nil,   nil,    46,   nil,   nil,
-    21,    34,    22,    34,    49,   nil,    49,    34,   nil,   nil,
-    49,     4,   nil,    24,    20,   nil,    20,     4,    51,     2,
-    20,    24,   nil,    27,   nil,   nil,   nil,   nil,    46,   nil,
-   nil,   nil,   nil,    51,   nil,    25,   nil,   nil,    46,    46,
-   nil,   nil,   nil,   nil,    21,   nil,    22,    27,    21,   nil,
-    22,   nil,   nil,    34,   nil,   nil,    49,    23,   nil,    25,
-   nil,    51,    34,     4,    34,    49,    20,    49,   nil,    34,
-   nil,    34,    49,   nil,    49,    20,   nil,    20,     2,     4,
-     2,     4,    20,    46,    20,    51,   nil,    23,    21,   nil,
-    22,    21,    21,    22,    22,    23,   nil,   nil,    51,   nil,
-   nil,   nil,   nil,   nil,   nil,   nil,   nil,    46,   nil,    24,
-   nil,   nil,    24,    24,   nil,   nil,   nil,   nil,   nil,   nil,
-   nil,    21,   nil,    22,   nil,    21,   nil,    22,   nil,   nil,
-   nil,   nil,   nil,   nil,   nil,   nil,   nil,    51,   nil,   nil,
-   nil,   nil,    24,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
-   nil,   nil,   nil,    21,   nil,    22,   nil,   nil,   nil,   nil,
-   nil,    21,   nil,    22,   nil,   nil,   nil,   nil,   nil,   nil,
-   nil,   nil,   nil,   nil,    24,   nil,   nil,    21,   nil,    22,
-   nil,   nil,    24,    23,    48,   nil,    23,    23,   nil,   nil,
-   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,    24,    48,
-    48,   nil,   nil,    48,   nil,   nil,    51,   nil,    21,   nil,
-    22,   nil,    51,   nil,   nil,    21,    23,    22,    21,    21,
-    22,    22,   nil,   nil,    51,   nil,   nil,   nil,   nil,    24,
-   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,    24,
-    24,    48,   nil,   nil,   nil,   nil,    48,   nil,    23,   nil,
-   nil,    48,   nil,   nil,   nil,   nil,    23,   nil,   nil,    51,
-   nil,   nil,   nil,    21,   nil,    22,   nil,   nil,   nil,   nil,
-   nil,   nil,    23,   nil,   nil,   nil,    51,    51,   nil,   nil,
-   nil,   nil,   nil,   nil,    24,   nil,   nil,    21,   nil,    22,
    nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
-   nil,   nil,    51,    23,   nil,   nil,   nil,   nil,    24,   nil,
-   nil,   nil,   nil,    23,    23,    48,    48,    48,    48,    48,
-    48,    48,    48,    48,    48,   nil,    48,    48,    48,   nil,
-   nil,    48,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
    nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
-   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,    23,   nil,
    nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
    nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
-   nil,   nil,    23 ]
+   nil,   nil,   nil,   nil,   nil,    25,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,    25 ]
 
 racc_goto_pointer = [
-   nil,    82,    16,    30,    10,    50,   nil,   nil,   nil,   nil,
-   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,     4,  -117,
-    13,   228,   230,   323,   249,     0,    -3,   -12,   -23,     7,
-     3,   -72,   -32,  -125,     0,   -30,   nil,    45,   -70,  -209,
-   nil,   nil,   nil,  -236,   -31,   nil,    48,   -34,   448,     3,
-   -26,   280,   nil,  -168,   -28,  -265,   nil,   -54,  -103,  -228,
-    15,  -142,  -151,   nil,  -135,  -100,  -144,  -183,    -4,    28,
-     3,   -57,    44,    16,     8,   -53,   -43,   -42,  -111,  -131,
-   -16,   -91,   nil ]
+   nil,    94,    10,    13,   -11,    -2,   nil,   -57,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   -45,
+     6,     3,   -11,  -137,    64,   344,   227,   247,    37,    24,
+   -21,    -1,     6,    33,   -49,   -20,   -72,    22,   -15,   nil,
+    64,   -29,  -151,   nil,   nil,   nil,  -186,   -12,   nil,   168,
+    -6,   429,     0,   -32,   -15,   nil,  -160,   -24,  -291,   nil,
+   -66,  -111,  -258,    -4,  -163,  -176,   nil,  -149,  -105,  -167,
+  -192,    12,    43,     5,   -69,    63,    34,     1,   -67,   -35,
+   -33,  -114,  -140,    -9,   -93,   nil ]
 
 racc_goto_default = [
-   nil,   nil,   nil,   185,    10,    15,    18,    21,    22,    25,
-    27,    29,    32,     3,     6,     9,    14,    17,   nil,    73,
-    96,    98,    99,   101,    85,    86,    90,    91,    92,    20,
-   nil,   nil,   nil,   nil,    81,   nil,     5,   nil,   nil,   189,
-   277,   190,   192,   nil,   nil,   139,    84,    87,   149,    63,
-   129,    94,   142,   143,   nil,   234,   100,   nil,   nil,   nil,
-    64,   nil,   nil,   272,    74,   nil,   nil,   nil,   nil,   nil,
-   nil,   nil,   nil,   nil,   nil,    51,   nil,   nil,   nil,   nil,
-   nil,   nil,   180 ]
-
-racc_reduce_table = [
-  0, 0, :racc_error,
-  1, 65, :_reduce_1,
-  1, 65, :_reduce_none,
-  1, 66, :_reduce_none,
-  2, 66, :_reduce_4,
-  1, 68, :_reduce_none,
-  1, 68, :_reduce_none,
-  1, 68, :_reduce_none,
-  1, 68, :_reduce_none,
-  1, 68, :_reduce_none,
-  1, 68, :_reduce_none,
-  1, 68, :_reduce_none,
-  1, 68, :_reduce_none,
-  1, 68, :_reduce_none,
-  1, 68, :_reduce_none,
-  1, 68, :_reduce_none,
-  1, 68, :_reduce_none,
-  1, 68, :_reduce_none,
-  4, 76, :_reduce_18,
-  5, 76, :_reduce_19,
-  3, 76, :_reduce_20,
-  2, 76, :_reduce_21,
-  1, 82, :_reduce_none,
-  1, 82, :_reduce_none,
-  3, 82, :_reduce_24,
-  3, 82, :_reduce_25,
-  1, 83, :_reduce_none,
-  1, 83, :_reduce_none,
-  1, 83, :_reduce_none,
-  1, 83, :_reduce_none,
-  1, 83, :_reduce_none,
-  1, 83, :_reduce_none,
-  1, 83, :_reduce_none,
-  1, 83, :_reduce_none,
-  1, 83, :_reduce_34,
-  5, 69, :_reduce_35,
-  5, 69, :_reduce_36,
-  5, 69, :_reduce_37,
-  5, 80, :_reduce_38,
-  2, 70, :_reduce_39,
-  1, 100, :_reduce_40,
-  2, 100, :_reduce_41,
-  6, 71, :_reduce_42,
-  2, 71, :_reduce_43,
-  3, 101, :_reduce_44,
-  3, 101, :_reduce_45,
-  1, 102, :_reduce_none,
-  1, 102, :_reduce_none,
-  3, 102, :_reduce_48,
-  1, 103, :_reduce_none,
-  3, 103, :_reduce_50,
-  1, 104, :_reduce_51,
-  1, 104, :_reduce_52,
-  3, 105, :_reduce_53,
-  3, 105, :_reduce_54,
-  1, 106, :_reduce_none,
-  1, 106, :_reduce_none,
-  4, 108, :_reduce_57,
-  1, 94, :_reduce_none,
-  3, 94, :_reduce_59,
-  0, 95, :_reduce_none,
-  1, 95, :_reduce_none,
-  1, 110, :_reduce_62,
-  1, 85, :_reduce_63,
-  1, 87, :_reduce_64,
-  1, 109, :_reduce_none,
-  1, 109, :_reduce_none,
-  1, 109, :_reduce_none,
-  1, 109, :_reduce_none,
-  1, 109, :_reduce_none,
-  1, 109, :_reduce_none,
-  1, 109, :_reduce_none,
-  3, 72, :_reduce_72,
-  3, 72, :_reduce_73,
-  3, 81, :_reduce_74,
-  0, 96, :_reduce_75,
-  1, 96, :_reduce_76,
-  3, 96, :_reduce_77,
-  3, 114, :_reduce_78,
-  3, 116, :_reduce_79,
-  1, 117, :_reduce_none,
-  1, 117, :_reduce_none,
-  0, 99, :_reduce_82,
-  1, 99, :_reduce_83,
-  3, 99, :_reduce_84,
-  1, 118, :_reduce_none,
-  3, 118, :_reduce_86,
-  1, 107, :_reduce_none,
-  1, 107, :_reduce_none,
-  1, 107, :_reduce_none,
-  1, 107, :_reduce_none,
-  1, 107, :_reduce_none,
-  1, 107, :_reduce_none,
-  1, 115, :_reduce_none,
-  1, 115, :_reduce_none,
-  1, 115, :_reduce_none,
-  1, 115, :_reduce_none,
-  1, 115, :_reduce_none,
-  1, 115, :_reduce_none,
-  1, 115, :_reduce_none,
-  1, 115, :_reduce_none,
-  1, 115, :_reduce_none,
-  1, 115, :_reduce_none,
-  1, 115, :_reduce_none,
-  1, 115, :_reduce_none,
-  4, 89, :_reduce_105,
-  3, 89, :_reduce_106,
-  1, 91, :_reduce_107,
-  2, 91, :_reduce_108,
-  2, 121, :_reduce_109,
-  1, 122, :_reduce_110,
-  2, 122, :_reduce_111,
-  1, 88, :_reduce_112,
-  4, 84, :_reduce_113,
-  4, 84, :_reduce_114,
-  6, 74, :_reduce_115,
-  5, 74, :_reduce_116,
-  0, 123, :_reduce_none,
-  4, 123, :_reduce_118,
-  3, 123, :_reduce_119,
-  1, 112, :_reduce_none,
-  3, 112, :_reduce_121,
-  3, 112, :_reduce_122,
-  3, 112, :_reduce_123,
-  3, 112, :_reduce_124,
-  3, 112, :_reduce_125,
-  3, 112, :_reduce_126,
-  3, 112, :_reduce_127,
-  3, 112, :_reduce_128,
-  2, 112, :_reduce_129,
-  3, 112, :_reduce_130,
-  3, 112, :_reduce_131,
-  3, 112, :_reduce_132,
-  3, 112, :_reduce_133,
-  3, 112, :_reduce_134,
-  3, 112, :_reduce_135,
-  2, 112, :_reduce_136,
-  3, 112, :_reduce_137,
-  3, 112, :_reduce_138,
-  3, 112, :_reduce_139,
-  5, 73, :_reduce_140,
-  1, 125, :_reduce_none,
-  2, 125, :_reduce_142,
-  5, 126, :_reduce_143,
-  4, 126, :_reduce_144,
-  1, 127, :_reduce_none,
-  3, 127, :_reduce_146,
-  3, 90, :_reduce_147,
-  1, 129, :_reduce_none,
-  4, 129, :_reduce_149,
-  1, 131, :_reduce_none,
-  3, 131, :_reduce_151,
-  3, 130, :_reduce_152,
-  1, 128, :_reduce_none,
-  1, 128, :_reduce_none,
-  1, 128, :_reduce_none,
-  1, 128, :_reduce_none,
-  1, 128, :_reduce_none,
-  1, 128, :_reduce_none,
-  1, 128, :_reduce_none,
-  1, 128, :_reduce_160,
-  1, 128, :_reduce_none,
-  1, 132, :_reduce_162,
-  1, 133, :_reduce_none,
-  3, 133, :_reduce_164,
-  2, 75, :_reduce_165,
-  6, 77, :_reduce_166,
-  5, 77, :_reduce_167,
-  7, 78, :_reduce_168,
-  6, 78, :_reduce_169,
-  6, 79, :_reduce_170,
-  5, 79, :_reduce_171,
-  1, 98, :_reduce_172,
-  1, 93, :_reduce_173,
-  1, 93, :_reduce_174,
-  1, 93, :_reduce_175,
-  1, 136, :_reduce_none,
-  3, 136, :_reduce_177,
-  1, 138, :_reduce_178,
-  1, 139, :_reduce_179,
-  1, 139, :_reduce_180,
-  1, 139, :_reduce_181,
-  1, 139, :_reduce_none,
-  0, 67, :_reduce_183,
-  0, 140, :_reduce_184,
-  1, 134, :_reduce_none,
-  3, 134, :_reduce_186,
-  3, 134, :_reduce_187,
-  1, 141, :_reduce_none,
-  3, 141, :_reduce_189,
-  3, 142, :_reduce_190,
-  1, 142, :_reduce_191,
-  3, 142, :_reduce_192,
-  1, 142, :_reduce_193,
-  1, 137, :_reduce_none,
-  2, 137, :_reduce_195,
-  1, 135, :_reduce_none,
-  2, 135, :_reduce_197,
-  1, 143, :_reduce_none,
-  1, 143, :_reduce_none,
-  1, 86, :_reduce_200,
-  3, 111, :_reduce_201,
-  4, 111, :_reduce_202,
-  2, 111, :_reduce_203,
-  1, 119, :_reduce_none,
-  1, 119, :_reduce_none,
-  0, 97, :_reduce_none,
-  1, 97, :_reduce_207,
-  1, 124, :_reduce_208,
-  3, 120, :_reduce_209,
-  4, 120, :_reduce_210,
-  2, 120, :_reduce_211,
-  1, 144, :_reduce_none,
-  3, 144, :_reduce_213,
-  3, 145, :_reduce_214,
-  1, 146, :_reduce_215,
-  1, 146, :_reduce_216,
-  4, 113, :_reduce_217,
-  1, 92, :_reduce_none,
-  4, 92, :_reduce_219 ]
-
-racc_reduce_n = 220
-
-racc_shift_n = 365
+   nil,   nil,   nil,   160,    21,    24,    28,    31,    35,     3,
+     6,     8,    11,    14,    17,    20,    23,    27,    30,    34,
+   nil,    91,   nil,    70,    93,    95,    98,   100,   102,   105,
+   106,    89,     4,   nil,   nil,   nil,   nil,    74,   nil,    26,
+   nil,   nil,   153,   240,   156,   157,   nil,   nil,   132,    99,
+   103,   174,    84,   123,    90,   140,   141,   nil,   246,    97,
+   nil,   nil,   nil,    85,   nil,   nil,   297,    67,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,    51,   nil,
+   nil,   nil,   nil,   nil,   nil,   188 ]
 
 racc_token_table = {
-  false => 0,
-  :error => 1,
-  :STRING => 2,
-  :DQPRE => 3,
-  :DQMID => 4,
-  :DQPOST => 5,
-  :LBRACK => 6,
-  :RBRACK => 7,
-  :LBRACE => 8,
-  :RBRACE => 9,
-  :SYMBOL => 10,
-  :FARROW => 11,
-  :COMMA => 12,
-  :TRUE => 13,
-  :FALSE => 14,
-  :EQUALS => 15,
-  :APPENDS => 16,
-  :LESSEQUAL => 17,
-  :NOTEQUAL => 18,
-  :DOT => 19,
-  :COLON => 20,
-  :LLCOLLECT => 21,
-  :RRCOLLECT => 22,
-  :QMARK => 23,
-  :LPAREN => 24,
-  :RPAREN => 25,
-  :ISEQUAL => 26,
-  :GREATEREQUAL => 27,
-  :GREATERTHAN => 28,
-  :LESSTHAN => 29,
-  :IF => 30,
-  :ELSE => 31,
-  :IMPORT => 32,
-  :DEFINE => 33,
-  :ELSIF => 34,
-  :VARIABLE => 35,
-  :CLASS => 36,
-  :INHERITS => 37,
-  :NODE => 38,
-  :BOOLEAN => 39,
-  :NAME => 40,
-  :SEMIC => 41,
-  :CASE => 42,
-  :DEFAULT => 43,
-  :AT => 44,
-  :LCOLLECT => 45,
-  :RCOLLECT => 46,
-  :CLASSNAME => 47,
-  :CLASSREF => 48,
-  :NOT => 49,
-  :OR => 50,
-  :AND => 51,
-  :UNDEF => 52,
-  :PARROW => 53,
-  :PLUS => 54,
-  :MINUS => 55,
-  :TIMES => 56,
-  :DIV => 57,
-  :LSHIFT => 58,
-  :RSHIFT => 59,
-  :UMINUS => 60,
-  :MATCH => 61,
-  :NOMATCH => 62,
-  :REGEX => 63 }
-
-racc_nt_base = 64
+ false => 0,
+ Object.new => 1,
+ :STRING => 2,
+ :DQPRE => 3,
+ :DQMID => 4,
+ :DQPOST => 5,
+ :LBRACK => 6,
+ :RBRACK => 7,
+ :LBRACE => 8,
+ :RBRACE => 9,
+ :SYMBOL => 10,
+ :FARROW => 11,
+ :COMMA => 12,
+ :TRUE => 13,
+ :FALSE => 14,
+ :EQUALS => 15,
+ :APPENDS => 16,
+ :LESSEQUAL => 17,
+ :NOTEQUAL => 18,
+ :DOT => 19,
+ :COLON => 20,
+ :LLCOLLECT => 21,
+ :RRCOLLECT => 22,
+ :QMARK => 23,
+ :LPAREN => 24,
+ :RPAREN => 25,
+ :ISEQUAL => 26,
+ :GREATEREQUAL => 27,
+ :GREATERTHAN => 28,
+ :LESSTHAN => 29,
+ :IF => 30,
+ :ELSE => 31,
+ :IMPORT => 32,
+ :DEFINE => 33,
+ :ELSIF => 34,
+ :VARIABLE => 35,
+ :CLASS => 36,
+ :INHERITS => 37,
+ :NODE => 38,
+ :BOOLEAN => 39,
+ :NAME => 40,
+ :SEMIC => 41,
+ :CASE => 42,
+ :DEFAULT => 43,
+ :AT => 44,
+ :LCOLLECT => 45,
+ :RCOLLECT => 46,
+ :CLASSNAME => 47,
+ :CLASSREF => 48,
+ :NOT => 49,
+ :OR => 50,
+ :AND => 51,
+ :UNDEF => 52,
+ :PARROW => 53,
+ :PLUS => 54,
+ :MINUS => 55,
+ :TIMES => 56,
+ :DIV => 57,
+ :LSHIFT => 58,
+ :RSHIFT => 59,
+ :UMINUS => 60,
+ :MATCH => 61,
+ :NOMATCH => 62,
+ :REGEX => 63,
+ :IN_EDGE => 64,
+ :OUT_EDGE => 65,
+ :IN_EDGE_SUB => 66,
+ :OUT_EDGE_SUB => 67 }
 
 racc_use_result_var = true
 
+racc_nt_base = 68
+
 Racc_arg = [
-  racc_action_table,
-  racc_action_check,
-  racc_action_default,
-  racc_action_pointer,
-  racc_goto_table,
-  racc_goto_check,
-  racc_goto_default,
-  racc_goto_pointer,
-  racc_nt_base,
-  racc_reduce_table,
-  racc_token_table,
-  racc_shift_n,
-  racc_reduce_n,
-  racc_use_result_var ]
+ racc_action_table,
+ racc_action_check,
+ racc_action_default,
+ racc_action_pointer,
+ racc_goto_table,
+ racc_goto_check,
+ racc_goto_default,
+ racc_goto_pointer,
+ racc_nt_base,
+ racc_reduce_table,
+ racc_token_table,
+ racc_shift_n,
+ racc_reduce_n,
+ racc_use_result_var ]
 
 Racc_token_to_s_table = [
-  "$end",
-  "error",
-  "STRING",
-  "DQPRE",
-  "DQMID",
-  "DQPOST",
-  "LBRACK",
-  "RBRACK",
-  "LBRACE",
-  "RBRACE",
-  "SYMBOL",
-  "FARROW",
-  "COMMA",
-  "TRUE",
-  "FALSE",
-  "EQUALS",
-  "APPENDS",
-  "LESSEQUAL",
-  "NOTEQUAL",
-  "DOT",
-  "COLON",
-  "LLCOLLECT",
-  "RRCOLLECT",
-  "QMARK",
-  "LPAREN",
-  "RPAREN",
-  "ISEQUAL",
-  "GREATEREQUAL",
-  "GREATERTHAN",
-  "LESSTHAN",
-  "IF",
-  "ELSE",
-  "IMPORT",
-  "DEFINE",
-  "ELSIF",
-  "VARIABLE",
-  "CLASS",
-  "INHERITS",
-  "NODE",
-  "BOOLEAN",
-  "NAME",
-  "SEMIC",
-  "CASE",
-  "DEFAULT",
-  "AT",
-  "LCOLLECT",
-  "RCOLLECT",
-  "CLASSNAME",
-  "CLASSREF",
-  "NOT",
-  "OR",
-  "AND",
-  "UNDEF",
-  "PARROW",
-  "PLUS",
-  "MINUS",
-  "TIMES",
-  "DIV",
-  "LSHIFT",
-  "RSHIFT",
-  "UMINUS",
-  "MATCH",
-  "NOMATCH",
-  "REGEX",
-  "$start",
-  "program",
-  "statements",
-  "nil",
-  "statement",
-  "resource",
-  "virtualresource",
-  "collection",
-  "assignment",
-  "casestatement",
-  "ifstatement",
-  "import",
-  "fstatement",
-  "definition",
-  "hostclass",
-  "nodedef",
-  "resourceoverride",
-  "append",
-  "funcvalues",
-  "namestring",
-  "resourceref",
-  "name",
-  "variable",
-  "type",
-  "boolean",
-  "funcrvalue",
-  "selector",
-  "quotedtext",
-  "hasharrayaccesses",
-  "classname",
-  "resourceinstances",
-  "endsemi",
-  "params",
-  "endcomma",
-  "classref",
-  "anyparams",
-  "at",
-  "collectrhand",
-  "collstatements",
-  "collstatement",
-  "colljoin",
-  "collexpr",
-  "colllval",
-  "simplervalue",
-  "resourceinst",
-  "resourcename",
-  "undef",
-  "array",
-  "expression",
-  "hasharrayaccess",
-  "param",
-  "rvalue",
-  "addparam",
-  "anyparam",
-  "rvalues",
-  "comma",
-  "hash",
-  "dqrval",
-  "dqtail",
-  "else",
-  "regex",
-  "caseopts",
-  "caseopt",
-  "casevalues",
-  "selectlhand",
-  "svalues",
-  "selectval",
-  "sintvalues",
-  "string",
-  "strings",
-  "argumentlist",
-  "classparent",
-  "hostnames",
-  "nodeparent",
-  "nodename",
-  "hostname",
-  "nothing",
-  "arguments",
-  "argument",
-  "classnameordefault",
-  "hashpairs",
-  "hashpair",
-  "key" ]
+'$end',
+'error',
+'STRING',
+'DQPRE',
+'DQMID',
+'DQPOST',
+'LBRACK',
+'RBRACK',
+'LBRACE',
+'RBRACE',
+'SYMBOL',
+'FARROW',
+'COMMA',
+'TRUE',
+'FALSE',
+'EQUALS',
+'APPENDS',
+'LESSEQUAL',
+'NOTEQUAL',
+'DOT',
+'COLON',
+'LLCOLLECT',
+'RRCOLLECT',
+'QMARK',
+'LPAREN',
+'RPAREN',
+'ISEQUAL',
+'GREATEREQUAL',
+'GREATERTHAN',
+'LESSTHAN',
+'IF',
+'ELSE',
+'IMPORT',
+'DEFINE',
+'ELSIF',
+'VARIABLE',
+'CLASS',
+'INHERITS',
+'NODE',
+'BOOLEAN',
+'NAME',
+'SEMIC',
+'CASE',
+'DEFAULT',
+'AT',
+'LCOLLECT',
+'RCOLLECT',
+'CLASSNAME',
+'CLASSREF',
+'NOT',
+'OR',
+'AND',
+'UNDEF',
+'PARROW',
+'PLUS',
+'MINUS',
+'TIMES',
+'DIV',
+'LSHIFT',
+'RSHIFT',
+'UMINUS',
+'MATCH',
+'NOMATCH',
+'REGEX',
+'IN_EDGE',
+'OUT_EDGE',
+'IN_EDGE_SUB',
+'OUT_EDGE_SUB',
+'$start',
+'program',
+'statements',
+'nil',
+'statement',
+'resource',
+'virtualresource',
+'collection',
+'assignment',
+'casestatement',
+'ifstatement',
+'import',
+'fstatement',
+'definition',
+'hostclass',
+'nodedef',
+'resourceoverride',
+'append',
+'relationship',
+'relationship_side',
+'edge',
+'resourceref',
+'funcvalues',
+'namestring',
+'name',
+'variable',
+'type',
+'boolean',
+'funcrvalue',
+'selector',
+'quotedtext',
+'hasharrayaccesses',
+'classname',
+'resourceinstances',
+'endsemi',
+'params',
+'endcomma',
+'classref',
+'anyparams',
+'at',
+'collectrhand',
+'collstatements',
+'collstatement',
+'colljoin',
+'collexpr',
+'colllval',
+'simplervalue',
+'resourceinst',
+'resourcename',
+'undef',
+'array',
+'expression',
+'hasharrayaccess',
+'param',
+'rvalue',
+'addparam',
+'anyparam',
+'rvalues',
+'comma',
+'hash',
+'dqrval',
+'dqtail',
+'else',
+'regex',
+'caseopts',
+'caseopt',
+'casevalues',
+'selectlhand',
+'svalues',
+'selectval',
+'sintvalues',
+'string',
+'strings',
+'argumentlist',
+'classparent',
+'hostnames',
+'nodeparent',
+'nodename',
+'hostname',
+'nothing',
+'arguments',
+'argument',
+'classnameordefault',
+'hashpairs',
+'hashpair',
+'key']
 
 Racc_debug_parser = false
 
-##### State transition tables end #####
+##### racc system variables end #####
 
-# reduce 0 omitted
+ # reduce 0 omitted
 
-module_eval(<<'.,.,', 'grammar.ra', 30)
-  def _reduce_1(val, _values, result)
-        if val[0]
+module_eval <<'.,.,', 'grammar.ra', 45
+  def _reduce_1( val, _values, result )
+    if val[0]
         # Make sure we always return an array.
         if val[0].is_a?(AST::ASTArray)
             if val[0].children.empty?
@@ -1120,18 +1147,17 @@ module_eval(<<'.,.,', 'grammar.ra', 30)
     else
         result = nil
     end
-
-    result
+   result
   end
 .,.,
 
-# reduce 2 omitted
+ # reduce 2 omitted
 
-# reduce 3 omitted
+ # reduce 3 omitted
 
-module_eval(<<'.,.,', 'grammar.ra', 49)
-  def _reduce_4(val, _values, result)
-        if val[0] and val[1]
+module_eval <<'.,.,', 'grammar.ra', 61
+  def _reduce_4( val, _values, result )
+    if val[0] and val[1]
         if val[0].instance_of?(AST::ASTArray)
             val[0].push(val[1])
             result = val[0]
@@ -1142,143 +1168,165 @@ module_eval(<<'.,.,', 'grammar.ra', 49)
         result = obj
     else result = nil
     end
-
-    result
+   result
   end
 .,.,
 
-# reduce 5 omitted
+ # reduce 5 omitted
+
+ # reduce 6 omitted
+
+ # reduce 7 omitted
+
+ # reduce 8 omitted
+
+ # reduce 9 omitted
+
+ # reduce 10 omitted
+
+ # reduce 11 omitted
+
+ # reduce 12 omitted
+
+ # reduce 13 omitted
 
-# reduce 6 omitted
+ # reduce 14 omitted
 
-# reduce 7 omitted
+ # reduce 15 omitted
 
-# reduce 8 omitted
+ # reduce 16 omitted
 
-# reduce 9 omitted
+ # reduce 17 omitted
 
-# reduce 10 omitted
+ # reduce 18 omitted
 
-# reduce 11 omitted
+module_eval <<'.,.,', 'grammar.ra', 81
+  def _reduce_19( val, _values, result )
+    result = AST::Relationship.new(val[0], val[2], val[1][:value], ast_context)
+   result
+  end
+.,.,
+
+module_eval <<'.,.,', 'grammar.ra', 84
+  def _reduce_20( val, _values, result )
+    result = AST::Relationship.new(val[0], val[2], val[1][:value], ast_context)
+   result
+  end
+.,.,
+
+ # reduce 21 omitted
 
-# reduce 12 omitted
+ # reduce 22 omitted
 
-# reduce 13 omitted
+ # reduce 23 omitted
 
-# reduce 14 omitted
+ # reduce 24 omitted
 
-# reduce 15 omitted
+ # reduce 25 omitted
 
-# reduce 16 omitted
+ # reduce 26 omitted
 
-# reduce 17 omitted
+ # reduce 27 omitted
 
-module_eval(<<'.,.,', 'grammar.ra', 78)
-  def _reduce_18(val, _values, result)
-        args = aryfy(val[2])
+module_eval <<'.,.,', 'grammar.ra', 97
+  def _reduce_28( val, _values, result )
+    args = aryfy(val[2])
     result = ast AST::Function,
         :name => val[0][:value],
         :line => val[0][:line],
         :arguments => args,
         :ftype => :statement
-
-    result
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 86)
-  def _reduce_19(val, _values, result)
-        args = aryfy(val[2])
+module_eval <<'.,.,', 'grammar.ra', 105
+  def _reduce_29( val, _values, result )
+    args = aryfy(val[2])
     result = ast AST::Function,
         :name => val[0][:value],
         :line => val[0][:line],
         :arguments => args,
         :ftype => :statement
-
-    result
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 93)
-  def _reduce_20(val, _values, result)
-        result = ast AST::Function,
+module_eval <<'.,.,', 'grammar.ra', 111
+  def _reduce_30( val, _values, result )
+    result = ast AST::Function,
         :name => val[0][:value],
         :line => val[0][:line],
         :arguments => AST::ASTArray.new({}),
         :ftype => :statement
-
-    result
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 100)
-  def _reduce_21(val, _values, result)
-        args = aryfy(val[1])
+module_eval <<'.,.,', 'grammar.ra', 119
+  def _reduce_31( val, _values, result )
+    args = aryfy(val[1])
     result = ast AST::Function,
         :name => val[0][:value],
         :line => val[0][:line],
         :arguments => args,
         :ftype => :statement
-
-    result
+   result
   end
 .,.,
 
-# reduce 22 omitted
+ # reduce 32 omitted
 
-# reduce 23 omitted
+ # reduce 33 omitted
 
-module_eval(<<'.,.,', 'grammar.ra', 111)
-  def _reduce_24(val, _values, result)
-        result = aryfy(val[0], val[2])
+module_eval <<'.,.,', 'grammar.ra', 127
+  def _reduce_34( val, _values, result )
+    result = aryfy(val[0], val[2])
     result.line = @lexer.line
     result.file = @lexer.file
-
-    result
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 116)
-  def _reduce_25(val, _values, result)
-        unless val[0].is_a?(AST::ASTArray)
+module_eval <<'.,.,', 'grammar.ra', 136
+  def _reduce_35( val, _values, result )
+    unless val[0].is_a?(AST::ASTArray)
         val[0] = aryfy(val[0])
     end
 
     val[0].push(val[2])
 
     result = val[0]
-
-    result
+   result
   end
 .,.,
 
-# reduce 26 omitted
+ # reduce 36 omitted
 
-# reduce 27 omitted
+ # reduce 37 omitted
 
-# reduce 28 omitted
+ # reduce 38 omitted
 
-# reduce 29 omitted
+ # reduce 39 omitted
 
-# reduce 30 omitted
+ # reduce 40 omitted
 
-# reduce 31 omitted
+ # reduce 41 omitted
 
-# reduce 32 omitted
+ # reduce 42 omitted
 
-# reduce 33 omitted
+ # reduce 43 omitted
 
-module_eval(<<'.,.,', 'grammar.ra', 136)
-  def _reduce_34(val, _values, result)
-                        result = ast AST::Name, :value => val[0][:value]
-                
-    result
+module_eval <<'.,.,', 'grammar.ra', 150
+  def _reduce_44( val, _values, result )
+                    result = ast AST::Name, :value => val[0][:value]
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 140)
-  def _reduce_35(val, _values, result)
-        @lexer.commentpop
+module_eval <<'.,.,', 'grammar.ra', 172
+  def _reduce_45( val, _values, result )
+    @lexer.commentpop
     array = val[2]
     if array.instance_of?(AST::ResourceInstance)
         array = [array]
@@ -1297,41 +1345,37 @@ module_eval(<<'.,.,', 'grammar.ra', 140)
             :title => instance[0],
             :parameters => instance[1])
     }
-
-    result
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 160)
-  def _reduce_36(val, _values, result)
-        # This is a deprecated syntax.
+module_eval <<'.,.,', 'grammar.ra', 175
+  def _reduce_46( val, _values, result )
+    # This is a deprecated syntax.
     error "All resource specifications require names"
-
-    result
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 163)
-  def _reduce_37(val, _values, result)
-        # a defaults setting for a type
+module_eval <<'.,.,', 'grammar.ra', 178
+  def _reduce_47( val, _values, result )
+    # a defaults setting for a type
     result = ast(AST::ResourceDefaults, :type => val[0], :parameters => val[2])
-
-    result
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 169)
-  def _reduce_38(val, _values, result)
-        @lexer.commentpop
+module_eval <<'.,.,', 'grammar.ra', 184
+  def _reduce_48( val, _values, result )
+    @lexer.commentpop
     result = ast AST::ResourceOverride, :object => val[0], :parameters => val[2]
-
-    result
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 176)
-  def _reduce_39(val, _values, result)
-        type = val[0]
+module_eval <<'.,.,', 'grammar.ra', 211
+  def _reduce_49( val, _values, result )
+    type = val[0]
 
     if (type == :exported and ! Puppet[:storeconfigs]) and ! Puppet[:parseonly]
         Puppet.warning addcontext("You cannot collect without storeconfigs being set")
@@ -1353,28 +1397,27 @@ module_eval(<<'.,.,', 'grammar.ra', 176)
     end
 
     result = val[1]
-
-    result
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 200)
-  def _reduce_40(val, _values, result)
-     result = :virtual 
-    result
+module_eval <<'.,.,', 'grammar.ra', 212
+  def _reduce_50( val, _values, result )
+ result = :virtual
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 201)
-  def _reduce_41(val, _values, result)
-     result = :exported 
-    result
+module_eval <<'.,.,', 'grammar.ra', 213
+  def _reduce_51( val, _values, result )
+ result = :exported
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 206)
-  def _reduce_42(val, _values, result)
-        if val[0] =~ /^[a-z]/
+module_eval <<'.,.,', 'grammar.ra', 237
+  def _reduce_52( val, _values, result )
+    if val[0] =~ /^[a-z]/
         Puppet.warning addcontext("Collection names must now be capitalized")
     end
     type = val[0].downcase
@@ -1392,14 +1435,13 @@ module_eval(<<'.,.,', 'grammar.ra', 206)
     end
     args[:override] = val[3]
     result = ast AST::Collection, args
-
-    result
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 226)
-  def _reduce_43(val, _values, result)
-        if val[0] =~ /^[a-z]/
+module_eval <<'.,.,', 'grammar.ra', 256
+  def _reduce_53( val, _values, result )
+    if val[0] =~ /^[a-z]/
         Puppet.warning addcontext("Collection names must now be capitalized")
     end
     type = val[0].downcase
@@ -1416,406 +1458,379 @@ module_eval(<<'.,.,', 'grammar.ra', 226)
         Puppet.warning addcontext("You cannot collect exported resources without storeconfigs being set; the collection will be ignored")
     end
     result = ast AST::Collection, args
-
-    result
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 247)
-  def _reduce_44(val, _values, result)
-        if val[1]
+module_eval <<'.,.,', 'grammar.ra', 266
+  def _reduce_54( val, _values, result )
+    if val[1]
         result = val[1]
         result.form = :virtual
     else
         result = :virtual
     end
-
-    result
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 255)
-  def _reduce_45(val, _values, result)
-        if val[1]
+module_eval <<'.,.,', 'grammar.ra', 274
+  def _reduce_55( val, _values, result )
+    if val[1]
         result = val[1]
         result.form = :exported
     else
         result = :exported
     end
-
-    result
+   result
   end
 .,.,
 
-# reduce 46 omitted
-
-# reduce 47 omitted
+ # reduce 56 omitted
 
-module_eval(<<'.,.,', 'grammar.ra', 268)
-  def _reduce_48(val, _values, result)
-        result = ast AST::CollExpr, :test1 => val[0], :oper => val[1], :test2 => val[2]
+ # reduce 57 omitted
 
-    result
+module_eval <<'.,.,', 'grammar.ra', 282
+  def _reduce_58( val, _values, result )
+    result = ast AST::CollExpr, :test1 => val[0], :oper => val[1], :test2 => val[2]
+   result
   end
 .,.,
 
-# reduce 49 omitted
+ # reduce 59 omitted
 
-module_eval(<<'.,.,', 'grammar.ra', 273)
-  def _reduce_50(val, _values, result)
-        result = val[1]
+module_eval <<'.,.,', 'grammar.ra', 288
+  def _reduce_60( val, _values, result )
+    result = val[1]
     result.parens = true
-
-    result
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 277)
-  def _reduce_51(val, _values, result)
-     result=val[0][:value] 
-    result
+module_eval <<'.,.,', 'grammar.ra', 289
+  def _reduce_61( val, _values, result )
+ result=val[0][:value]
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 278)
-  def _reduce_52(val, _values, result)
-     result=val[0][:value] 
-    result
+module_eval <<'.,.,', 'grammar.ra', 290
+  def _reduce_62( val, _values, result )
+ result=val[0][:value]
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 281)
-  def _reduce_53(val, _values, result)
-        result = ast AST::CollExpr, :test1 => val[0], :oper => val[1][:value], :test2 => val[2]
+module_eval <<'.,.,', 'grammar.ra', 297
+  def _reduce_63( val, _values, result )
+    result = ast AST::CollExpr, :test1 => val[0], :oper => val[1][:value], :test2 => val[2]
     #result = ast AST::CollExpr
     #result.push *val
-
-    result
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 286)
-  def _reduce_54(val, _values, result)
-        result = ast AST::CollExpr, :test1 => val[0], :oper => val[1][:value], :test2 => val[2]
+module_eval <<'.,.,', 'grammar.ra', 302
+  def _reduce_64( val, _values, result )
+    result = ast AST::CollExpr, :test1 => val[0], :oper => val[1][:value], :test2 => val[2]
     #result = ast AST::CollExpr
     #result.push *val
-
-    result
+   result
   end
 .,.,
 
-# reduce 55 omitted
-
-# reduce 56 omitted
+ # reduce 65 omitted
 
-module_eval(<<'.,.,', 'grammar.ra', 295)
-  def _reduce_57(val, _values, result)
-        result = ast AST::ResourceInstance, :children => [val[0],val[2]]
+ # reduce 66 omitted
 
-    result
+module_eval <<'.,.,', 'grammar.ra', 309
+  def _reduce_67( val, _values, result )
+    result = ast AST::ResourceInstance, :children => [val[0],val[2]]
+   result
   end
 .,.,
 
-# reduce 58 omitted
+ # reduce 68 omitted
 
-module_eval(<<'.,.,', 'grammar.ra', 300)
-  def _reduce_59(val, _values, result)
-        if val[0].instance_of?(AST::ResourceInstance)
+module_eval <<'.,.,', 'grammar.ra', 319
+  def _reduce_69( val, _values, result )
+    if val[0].instance_of?(AST::ResourceInstance)
         result = ast AST::ASTArray, :children => [val[0],val[2]]
     else
         val[0].push val[2]
         result = val[0]
     end
-
-    result
+   result
   end
 .,.,
 
-# reduce 60 omitted
+ # reduce 70 omitted
 
-# reduce 61 omitted
+ # reduce 71 omitted
 
-module_eval(<<'.,.,', 'grammar.ra', 312)
-  def _reduce_62(val, _values, result)
-        result = ast AST::Undef, :value => :undef
-
-    result
+module_eval <<'.,.,', 'grammar.ra', 326
+  def _reduce_72( val, _values, result )
+    result = ast AST::Undef, :value => :undef
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 316)
-  def _reduce_63(val, _values, result)
-        result = ast AST::Name, :value => val[0][:value], :line => val[0][:line]
-
-    result
+module_eval <<'.,.,', 'grammar.ra', 330
+  def _reduce_73( val, _values, result )
+    result = ast AST::Name, :value => val[0][:value], :line => val[0][:line]
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 320)
-  def _reduce_64(val, _values, result)
-        result = ast AST::Type, :value => val[0][:value], :line => val[0][:line]
-
-    result
+module_eval <<'.,.,', 'grammar.ra', 334
+  def _reduce_74( val, _values, result )
+    result = ast AST::Type, :value => val[0][:value], :line => val[0][:line]
+   result
   end
 .,.,
 
-# reduce 65 omitted
+ # reduce 75 omitted
 
-# reduce 66 omitted
+ # reduce 76 omitted
 
-# reduce 67 omitted
+ # reduce 77 omitted
 
-# reduce 68 omitted
+ # reduce 78 omitted
 
-# reduce 69 omitted
+ # reduce 79 omitted
 
-# reduce 70 omitted
+ # reduce 80 omitted
 
-# reduce 71 omitted
+ # reduce 81 omitted
 
-module_eval(<<'.,.,', 'grammar.ra', 332)
-  def _reduce_72(val, _values, result)
-        if val[0][:value] =~ /::/
+module_eval <<'.,.,', 'grammar.ra', 351
+  def _reduce_82( val, _values, result )
+    if val[0][:value] =~ /::/
         raise Puppet::ParseError, "Cannot assign to variables in other namespaces"
     end
     # this is distinct from referencing a variable
     variable = ast AST::Name, :value => val[0][:value], :line => val[0][:line]
     result = ast AST::VarDef, :name => variable, :value => val[2], :line => val[0][:line]
-
-    result
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 340)
-  def _reduce_73(val, _values, result)
-        result = ast AST::VarDef, :name => val[0], :value => val[2]
-
-    result
+module_eval <<'.,.,', 'grammar.ra', 354
+  def _reduce_83( val, _values, result )
+    result = ast AST::VarDef, :name => val[0], :value => val[2]
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 344)
-  def _reduce_74(val, _values, result)
-        variable = ast AST::Name, :value => val[0][:value], :line => val[0][:line]
+module_eval <<'.,.,', 'grammar.ra', 359
+  def _reduce_84( val, _values, result )
+    variable = ast AST::Name, :value => val[0][:value], :line => val[0][:line]
     result = ast AST::VarDef, :name => variable, :value => val[2], :append => true, :line => val[0][:line]
-
-    result
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 350)
-  def _reduce_75(val, _values, result)
-        result = ast AST::ASTArray
-
-    result
+module_eval <<'.,.,', 'grammar.ra', 364
+  def _reduce_85( val, _values, result )
+    result = ast AST::ASTArray
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 352)
-  def _reduce_76(val, _values, result)
-     result = val[0] 
-    result
+module_eval <<'.,.,', 'grammar.ra', 364
+  def _reduce_86( val, _values, result )
+ result = val[0]
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 354)
-  def _reduce_77(val, _values, result)
-        if val[0].instance_of?(AST::ASTArray)
+module_eval <<'.,.,', 'grammar.ra', 373
+  def _reduce_87( val, _values, result )
+    if val[0].instance_of?(AST::ASTArray)
         val[0].push(val[2])
         result = val[0]
     else
         result = ast AST::ASTArray, :children => [val[0],val[2]]
     end
-
-    result
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 363)
-  def _reduce_78(val, _values, result)
-        result = ast AST::ResourceParam, :param => val[0][:value], :line => val[0][:line], :value => val[2]
-
-    result
+module_eval <<'.,.,', 'grammar.ra', 377
+  def _reduce_88( val, _values, result )
+    result = ast AST::ResourceParam, :param => val[0][:value], :line => val[0][:line], :value => val[2]
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 367)
-  def _reduce_79(val, _values, result)
-        result = ast AST::ResourceParam, :param => val[0][:value], :line => val[0][:line], :value => val[2],
+module_eval <<'.,.,', 'grammar.ra', 382
+  def _reduce_89( val, _values, result )
+    result = ast AST::ResourceParam, :param => val[0][:value], :line => val[0][:line], :value => val[2],
                                      :add => true
-
-    result
+   result
   end
 .,.,
 
-# reduce 80 omitted
-
-# reduce 81 omitted
+ # reduce 90 omitted
 
-module_eval(<<'.,.,', 'grammar.ra', 376)
-  def _reduce_82(val, _values, result)
-        result = ast AST::ASTArray
+ # reduce 91 omitted
 
-    result
+module_eval <<'.,.,', 'grammar.ra', 390
+  def _reduce_92( val, _values, result )
+    result = ast AST::ASTArray
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 378)
-  def _reduce_83(val, _values, result)
-     result = val[0] 
-    result
+module_eval <<'.,.,', 'grammar.ra', 390
+  def _reduce_93( val, _values, result )
+ result = val[0]
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 380)
-  def _reduce_84(val, _values, result)
-        if val[0].instance_of?(AST::ASTArray)
+module_eval <<'.,.,', 'grammar.ra', 399
+  def _reduce_94( val, _values, result )
+    if val[0].instance_of?(AST::ASTArray)
         val[0].push(val[2])
         result = val[0]
     else
         result = ast AST::ASTArray, :children => [val[0],val[2]]
     end
-
-    result
+   result
   end
 .,.,
 
-# reduce 85 omitted
+ # reduce 95 omitted
 
-module_eval(<<'.,.,', 'grammar.ra', 390)
-  def _reduce_86(val, _values, result)
-        if val[0].instance_of?(AST::ASTArray)
+module_eval <<'.,.,', 'grammar.ra', 408
+  def _reduce_96( val, _values, result )
+    if val[0].instance_of?(AST::ASTArray)
         result = val[0].push(val[2])
     else
         result = ast AST::ASTArray, :children => [val[0],val[2]]
     end
-
-    result
+   result
   end
 .,.,
 
-# reduce 87 omitted
+ # reduce 97 omitted
 
-# reduce 88 omitted
+ # reduce 98 omitted
 
-# reduce 89 omitted
+ # reduce 99 omitted
 
-# reduce 90 omitted
+ # reduce 100 omitted
 
-# reduce 91 omitted
+ # reduce 101 omitted
 
-# reduce 92 omitted
+ # reduce 102 omitted
 
-# reduce 93 omitted
+ # reduce 103 omitted
 
-# reduce 94 omitted
+ # reduce 104 omitted
 
-# reduce 95 omitted
+ # reduce 105 omitted
 
-# reduce 96 omitted
+ # reduce 106 omitted
 
-# reduce 97 omitted
+ # reduce 107 omitted
 
-# reduce 98 omitted
+ # reduce 108 omitted
 
-# reduce 99 omitted
+ # reduce 109 omitted
 
-# reduce 100 omitted
+ # reduce 110 omitted
 
-# reduce 101 omitted
+ # reduce 111 omitted
 
-# reduce 102 omitted
+ # reduce 112 omitted
 
-# reduce 103 omitted
+ # reduce 113 omitted
 
-# reduce 104 omitted
+ # reduce 114 omitted
 
-module_eval(<<'.,.,', 'grammar.ra', 419)
-  def _reduce_105(val, _values, result)
-        args = aryfy(val[2])
+module_eval <<'.,.,', 'grammar.ra', 437
+  def _reduce_115( val, _values, result )
+    args = aryfy(val[2])
     result = ast AST::Function,
         :name => val[0][:value], :line => val[0][:line],
         :arguments => args,
         :ftype => :rvalue
-
-    result
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 425)
-  def _reduce_106(val, _values, result)
-        result = ast AST::Function,
+module_eval <<'.,.,', 'grammar.ra', 442
+  def _reduce_116( val, _values, result )
+    result = ast AST::Function,
         :name => val[0][:value], :line => val[0][:line],
         :arguments => AST::ASTArray.new({}),
         :ftype => :rvalue
-
-    result
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 431)
-  def _reduce_107(val, _values, result)
-     result = ast AST::String, :value => val[0][:value],                  :line => val[0][:line] 
-    result
+module_eval <<'.,.,', 'grammar.ra', 443
+  def _reduce_117( val, _values, result )
+ result = ast AST::String, :value => val[0][:value],                  :line => val[0][:line]
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 432)
-  def _reduce_108(val, _values, result)
-     result = ast AST::Concat, :value => [ast(AST::String,val[0])]+val[1], :line => val[0][:line] 
-    result
+module_eval <<'.,.,', 'grammar.ra', 444
+  def _reduce_118( val, _values, result )
+ result = ast AST::Concat, :value => [ast(AST::String,val[0])]+val[1], :line => val[0][:line]
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 434)
-  def _reduce_109(val, _values, result)
-     result = [val[0]] + val[1] 
-    result
+module_eval <<'.,.,', 'grammar.ra', 446
+  def _reduce_119( val, _values, result )
+ result = [val[0]] + val[1]
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 436)
-  def _reduce_110(val, _values, result)
-     result = [ast(AST::String,val[0])]          
-    result
+module_eval <<'.,.,', 'grammar.ra', 448
+  def _reduce_120( val, _values, result )
+ result = [ast(AST::String,val[0])]
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 437)
-  def _reduce_111(val, _values, result)
-     result = [ast(AST::String,val[0])] + val[1] 
-    result
+module_eval <<'.,.,', 'grammar.ra', 449
+  def _reduce_121( val, _values, result )
+ result = [ast(AST::String,val[0])] + val[1]
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 440)
-  def _reduce_112(val, _values, result)
-        result = ast AST::Boolean, :value => val[0][:value], :line => val[0][:line]
-
-    result
+module_eval <<'.,.,', 'grammar.ra', 454
+  def _reduce_122( val, _values, result )
+    result = ast AST::Boolean, :value => val[0][:value], :line => val[0][:line]
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 444)
-  def _reduce_113(val, _values, result)
-        Puppet.warning addcontext("Deprecation notice:  Resource references should now be capitalized")
+module_eval <<'.,.,', 'grammar.ra', 459
+  def _reduce_123( val, _values, result )
+    Puppet.warning addcontext("Deprecation notice:  Resource references should now be capitalized")
     result = ast AST::ResourceReference, :type => val[0][:value], :line => val[0][:line], :title => val[2]
-
-    result
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 447)
-  def _reduce_114(val, _values, result)
-        result = ast AST::ResourceReference, :type => val[0], :title => val[2]
-
-    result
+module_eval <<'.,.,', 'grammar.ra', 461
+  def _reduce_124( val, _values, result )
+    result = ast AST::ResourceReference, :type => val[0], :title => val[2]
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 451)
-  def _reduce_115(val, _values, result)
-        @lexer.commentpop
+module_eval <<'.,.,', 'grammar.ra', 475
+  def _reduce_125( val, _values, result )
+    @lexer.commentpop
     args = {
         :test => val[1],
         :statements => val[3]
@@ -1826,14 +1841,13 @@ module_eval(<<'.,.,', 'grammar.ra', 451)
     end
 
     result = ast AST::IfStatement, args
-
-    result
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 464)
-  def _reduce_116(val, _values, result)
-        @lexer.commentpop
+module_eval <<'.,.,', 'grammar.ra', 488
+  def _reduce_126( val, _values, result )
+    @lexer.commentpop
     args = {
         :test => val[1],
         :statements => ast(AST::Nop)
@@ -1844,739 +1858,677 @@ module_eval(<<'.,.,', 'grammar.ra', 464)
     end
 
     result = ast AST::IfStatement, args
-
-    result
+   result
   end
 .,.,
 
-# reduce 117 omitted
+ # reduce 127 omitted
 
-module_eval(<<'.,.,', 'grammar.ra', 479)
-  def _reduce_118(val, _values, result)
-        @lexer.commentpop
+module_eval <<'.,.,', 'grammar.ra', 494
+  def _reduce_128( val, _values, result )
+    @lexer.commentpop
     result = ast AST::Else, :statements => val[2]
-
-    result
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 483)
-  def _reduce_119(val, _values, result)
-        @lexer.commentpop
+module_eval <<'.,.,', 'grammar.ra', 498
+  def _reduce_129( val, _values, result )
+    @lexer.commentpop
     result = ast AST::Else, :statements => ast(AST::Nop)
-
-    result
+   result
   end
 .,.,
 
-# reduce 120 omitted
-
-module_eval(<<'.,.,', 'grammar.ra', 501)
-  def _reduce_121(val, _values, result)
-        result = ast AST::MatchOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
+ # reduce 130 omitted
 
-    result
+module_eval <<'.,.,', 'grammar.ra', 515
+  def _reduce_131( val, _values, result )
+    result = ast AST::MatchOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 504)
-  def _reduce_122(val, _values, result)
-        result = ast AST::MatchOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
-
-    result
+module_eval <<'.,.,', 'grammar.ra', 518
+  def _reduce_132( val, _values, result )
+    result = ast AST::MatchOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 507)
-  def _reduce_123(val, _values, result)
-        result = ast AST::ArithmeticOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
-
-    result
+module_eval <<'.,.,', 'grammar.ra', 521
+  def _reduce_133( val, _values, result )
+    result = ast AST::ArithmeticOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 510)
-  def _reduce_124(val, _values, result)
-        result = ast AST::ArithmeticOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
-
-    result
+module_eval <<'.,.,', 'grammar.ra', 524
+  def _reduce_134( val, _values, result )
+    result = ast AST::ArithmeticOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 513)
-  def _reduce_125(val, _values, result)
-        result = ast AST::ArithmeticOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
-
-    result
+module_eval <<'.,.,', 'grammar.ra', 527
+  def _reduce_135( val, _values, result )
+    result = ast AST::ArithmeticOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 516)
-  def _reduce_126(val, _values, result)
-        result = ast AST::ArithmeticOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
-
-    result
+module_eval <<'.,.,', 'grammar.ra', 530
+  def _reduce_136( val, _values, result )
+    result = ast AST::ArithmeticOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 519)
-  def _reduce_127(val, _values, result)
-        result = ast AST::ArithmeticOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
-
-    result
+module_eval <<'.,.,', 'grammar.ra', 533
+  def _reduce_137( val, _values, result )
+    result = ast AST::ArithmeticOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 522)
-  def _reduce_128(val, _values, result)
-        result = ast AST::ArithmeticOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
-
-    result
+module_eval <<'.,.,', 'grammar.ra', 536
+  def _reduce_138( val, _values, result )
+    result = ast AST::ArithmeticOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 525)
-  def _reduce_129(val, _values, result)
-        result = ast AST::Minus, :value => val[1]
-
-    result
+module_eval <<'.,.,', 'grammar.ra', 539
+  def _reduce_139( val, _values, result )
+    result = ast AST::Minus, :value => val[1]
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 528)
-  def _reduce_130(val, _values, result)
-        result = ast AST::ComparisonOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
-
-    result
+module_eval <<'.,.,', 'grammar.ra', 542
+  def _reduce_140( val, _values, result )
+    result = ast AST::ComparisonOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 531)
-  def _reduce_131(val, _values, result)
-        result = ast AST::ComparisonOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
-
-    result
+module_eval <<'.,.,', 'grammar.ra', 545
+  def _reduce_141( val, _values, result )
+    result = ast AST::ComparisonOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 534)
-  def _reduce_132(val, _values, result)
-        result = ast AST::ComparisonOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
-
-    result
+module_eval <<'.,.,', 'grammar.ra', 548
+  def _reduce_142( val, _values, result )
+    result = ast AST::ComparisonOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 537)
-  def _reduce_133(val, _values, result)
-        result = ast AST::ComparisonOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
-
-    result
+module_eval <<'.,.,', 'grammar.ra', 551
+  def _reduce_143( val, _values, result )
+    result = ast AST::ComparisonOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 540)
-  def _reduce_134(val, _values, result)
-        result = ast AST::ComparisonOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
-
-    result
+module_eval <<'.,.,', 'grammar.ra', 554
+  def _reduce_144( val, _values, result )
+    result = ast AST::ComparisonOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 543)
-  def _reduce_135(val, _values, result)
-        result = ast AST::ComparisonOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
-
-    result
+module_eval <<'.,.,', 'grammar.ra', 557
+  def _reduce_145( val, _values, result )
+    result = ast AST::ComparisonOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 546)
-  def _reduce_136(val, _values, result)
-        result = ast AST::Not, :value => val[1]
-
-    result
+module_eval <<'.,.,', 'grammar.ra', 560
+  def _reduce_146( val, _values, result )
+    result = ast AST::Not, :value => val[1]
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 549)
-  def _reduce_137(val, _values, result)
-        result = ast AST::BooleanOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
-
-    result
+module_eval <<'.,.,', 'grammar.ra', 563
+  def _reduce_147( val, _values, result )
+    result = ast AST::BooleanOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 552)
-  def _reduce_138(val, _values, result)
-        result = ast AST::BooleanOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
-
-    result
+module_eval <<'.,.,', 'grammar.ra', 566
+  def _reduce_148( val, _values, result )
+    result = ast AST::BooleanOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 555)
-  def _reduce_139(val, _values, result)
-        result = val[1]
-
-    result
+module_eval <<'.,.,', 'grammar.ra', 569
+  def _reduce_149( val, _values, result )
+    result = val[1]
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 559)
-  def _reduce_140(val, _values, result)
-        @lexer.commentpop
+module_eval <<'.,.,', 'grammar.ra', 578
+  def _reduce_150( val, _values, result )
+    @lexer.commentpop
     options = val[3]
     unless options.instance_of?(AST::ASTArray)
         options = ast AST::ASTArray, :children => [val[3]]
     end
     result = ast AST::CaseStatement, :test => val[1], :options => options
-
-    result
+   result
   end
 .,.,
 
-# reduce 141 omitted
+ # reduce 151 omitted
 
-module_eval(<<'.,.,', 'grammar.ra', 569)
-  def _reduce_142(val, _values, result)
-        if val[0].instance_of?(AST::ASTArray)
+module_eval <<'.,.,', 'grammar.ra', 588
+  def _reduce_152( val, _values, result )
+    if val[0].instance_of?(AST::ASTArray)
         val[0].push val[1]
         result = val[0]
     else
         result = ast AST::ASTArray, :children => [val[0], val[1]]
     end
-
-    result
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 578)
-  def _reduce_143(val, _values, result)
-        @lexer.commentpop
+module_eval <<'.,.,', 'grammar.ra', 593
+  def _reduce_153( val, _values, result )
+    @lexer.commentpop
     result = ast AST::CaseOpt, :value => val[0], :statements => val[3]
-
-    result
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 581)
-  def _reduce_144(val, _values, result)
-        @lexer.commentpop
+module_eval <<'.,.,', 'grammar.ra', 599
+  def _reduce_154( val, _values, result )
+    @lexer.commentpop
     result = ast(AST::CaseOpt,
         :value => val[0],
         :statements => ast(AST::ASTArray)
     )
-
-    result
+   result
   end
 .,.,
 
-# reduce 145 omitted
+ # reduce 155 omitted
 
-module_eval(<<'.,.,', 'grammar.ra', 590)
-  def _reduce_146(val, _values, result)
-        if val[0].instance_of?(AST::ASTArray)
+module_eval <<'.,.,', 'grammar.ra', 609
+  def _reduce_156( val, _values, result )
+    if val[0].instance_of?(AST::ASTArray)
         val[0].push(val[2])
         result = val[0]
     else
         result = ast AST::ASTArray, :children => [val[0],val[2]]
     end
-
-    result
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 599)
-  def _reduce_147(val, _values, result)
-        result = ast AST::Selector, :param => val[0], :values => val[2]
-
-    result
+module_eval <<'.,.,', 'grammar.ra', 613
+  def _reduce_157( val, _values, result )
+    result = ast AST::Selector, :param => val[0], :values => val[2]
+   result
   end
 .,.,
 
-# reduce 148 omitted
+ # reduce 158 omitted
 
-module_eval(<<'.,.,', 'grammar.ra', 604)
-  def _reduce_149(val, _values, result)
-        @lexer.commentpop
+module_eval <<'.,.,', 'grammar.ra', 619
+  def _reduce_159( val, _values, result )
+    @lexer.commentpop
     result = val[1]
-
-    result
+   result
   end
 .,.,
 
-# reduce 150 omitted
+ # reduce 160 omitted
 
-module_eval(<<'.,.,', 'grammar.ra', 610)
-  def _reduce_151(val, _values, result)
-        if val[0].instance_of?(AST::ASTArray)
+module_eval <<'.,.,', 'grammar.ra', 629
+  def _reduce_161( val, _values, result )
+    if val[0].instance_of?(AST::ASTArray)
         val[0].push(val[2])
         result = val[0]
     else
         result = ast AST::ASTArray, :children => [val[0],val[2]]
     end
-
-    result
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 619)
-  def _reduce_152(val, _values, result)
-        result = ast AST::ResourceParam, :param => val[0], :value => val[2]
-
-    result
+module_eval <<'.,.,', 'grammar.ra', 633
+  def _reduce_162( val, _values, result )
+    result = ast AST::ResourceParam, :param => val[0], :value => val[2]
+   result
   end
 .,.,
 
-# reduce 153 omitted
-
-# reduce 154 omitted
+ # reduce 163 omitted
 
-# reduce 155 omitted
+ # reduce 164 omitted
 
-# reduce 156 omitted
+ # reduce 165 omitted
 
-# reduce 157 omitted
+ # reduce 166 omitted
 
-# reduce 158 omitted
+ # reduce 167 omitted
 
-# reduce 159 omitted
+ # reduce 168 omitted
 
-module_eval(<<'.,.,', 'grammar.ra', 630)
-  def _reduce_160(val, _values, result)
-        result = ast AST::Default, :value => val[0][:value], :line => val[0][:line]
+ # reduce 169 omitted
 
-    result
+module_eval <<'.,.,', 'grammar.ra', 644
+  def _reduce_170( val, _values, result )
+    result = ast AST::Default, :value => val[0][:value], :line => val[0][:line]
+   result
   end
 .,.,
 
-# reduce 161 omitted
+ # reduce 171 omitted
 
-module_eval(<<'.,.,', 'grammar.ra', 635)
-  def _reduce_162(val, _values, result)
-     result = [val[0][:value]] 
-    result
+module_eval <<'.,.,', 'grammar.ra', 647
+  def _reduce_172( val, _values, result )
+ result = [val[0][:value]]
+   result
   end
 .,.,
 
-# reduce 163 omitted
+ # reduce 173 omitted
 
-module_eval(<<'.,.,', 'grammar.ra', 637)
-  def _reduce_164(val, _values, result)
-     result = val[0] += val[2] 
-    result
+module_eval <<'.,.,', 'grammar.ra', 649
+  def _reduce_174( val, _values, result )
+ result = val[0] += val[2]
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 640)
-  def _reduce_165(val, _values, result)
-        val[1].each do |file|
+module_eval <<'.,.,', 'grammar.ra', 658
+  def _reduce_175( val, _values, result )
+    val[1].each do |file|
         import(file)
     end
 
     result = AST::ASTArray.new(:children => [])
-
-    result
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 650)
-  def _reduce_166(val, _values, result)
-        @lexer.commentpop
+module_eval <<'.,.,', 'grammar.ra', 669
+  def _reduce_176( val, _values, result )
+    @lexer.commentpop
     newdefine classname(val[1]), :arguments => val[2], :code => val[4], :line => val[0][:line]
     @lexer.indefine = false
     result = nil
 
 #}           | DEFINE NAME argumentlist parent LBRACE RBRACE {
-
-    result
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 657)
-  def _reduce_167(val, _values, result)
-        @lexer.commentpop
+module_eval <<'.,.,', 'grammar.ra', 674
+  def _reduce_177( val, _values, result )
+    @lexer.commentpop
     newdefine classname(val[1]), :arguments => val[2], :line => val[0][:line]
     @lexer.indefine = false
     result = nil
-
-    result
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 665)
-  def _reduce_168(val, _values, result)
-        @lexer.commentpop
+module_eval <<'.,.,', 'grammar.ra', 683
+  def _reduce_178( val, _values, result )
+    @lexer.commentpop
     # Our class gets defined in the parent namespace, not our own.
     @lexer.namepop
     newclass classname(val[1]), :arguments => val[2], :parent => val[3], :code => val[5], :line => val[0][:line]
     result = nil
-
-    result
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 671)
-  def _reduce_169(val, _values, result)
-        @lexer.commentpop
+module_eval <<'.,.,', 'grammar.ra', 689
+  def _reduce_179( val, _values, result )
+    @lexer.commentpop
     # Our class gets defined in the parent namespace, not our own.
     @lexer.namepop
     newclass classname(val[1]), :arguments => val[2], :parent => val[3], :line => val[0][:line]
     result = nil
-
-    result
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 679)
-  def _reduce_170(val, _values, result)
-        @lexer.commentpop
+module_eval <<'.,.,', 'grammar.ra', 695
+  def _reduce_180( val, _values, result )
+    @lexer.commentpop
     newnode val[1], :parent => val[2], :code => val[4], :line => val[0][:line]
     result = nil
-
-    result
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 683)
-  def _reduce_171(val, _values, result)
-        @lexer.commentpop
+module_eval <<'.,.,', 'grammar.ra', 699
+  def _reduce_181( val, _values, result )
+    @lexer.commentpop
     newnode val[1], :parent => val[2], :line => val[0][:line]
     result = nil
-
-    result
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 688)
-  def _reduce_172(val, _values, result)
-     result = val[0][:value] 
-    result
+module_eval <<'.,.,', 'grammar.ra', 700
+  def _reduce_182( val, _values, result )
+ result = val[0][:value]
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 690)
-  def _reduce_173(val, _values, result)
-     result = val[0][:value] 
-    result
+module_eval <<'.,.,', 'grammar.ra', 702
+  def _reduce_183( val, _values, result )
+ result = val[0][:value]
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 691)
-  def _reduce_174(val, _values, result)
-     result = val[0][:value] 
-    result
+module_eval <<'.,.,', 'grammar.ra', 703
+  def _reduce_184( val, _values, result )
+ result = val[0][:value]
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 692)
-  def _reduce_175(val, _values, result)
-     result = "class" 
-    result
+module_eval <<'.,.,', 'grammar.ra', 704
+  def _reduce_185( val, _values, result )
+ result = "class"
+   result
   end
 .,.,
 
-# reduce 176 omitted
+ # reduce 186 omitted
 
-module_eval(<<'.,.,', 'grammar.ra', 698)
-  def _reduce_177(val, _values, result)
-        result = val[0]
+module_eval <<'.,.,', 'grammar.ra', 714
+  def _reduce_187( val, _values, result )
+    result = val[0]
     result = [result] unless result.is_a?(Array)
     result << val[2]
-
-    result
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 704)
-  def _reduce_178(val, _values, result)
-        result = ast AST::HostName, :value => val[0]
-
-    result
+module_eval <<'.,.,', 'grammar.ra', 718
+  def _reduce_188( val, _values, result )
+    result = ast AST::HostName, :value => val[0]
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 707)
-  def _reduce_179(val, _values, result)
-     result = val[0][:value] 
-    result
+module_eval <<'.,.,', 'grammar.ra', 719
+  def _reduce_189( val, _values, result )
+ result = val[0][:value]
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 708)
-  def _reduce_180(val, _values, result)
-     result = val[0][:value] 
-    result
+module_eval <<'.,.,', 'grammar.ra', 720
+  def _reduce_190( val, _values, result )
+ result = val[0][:value]
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 709)
-  def _reduce_181(val, _values, result)
-     result = val[0][:value] 
-    result
+module_eval <<'.,.,', 'grammar.ra', 721
+  def _reduce_191( val, _values, result )
+ result = val[0][:value]
+   result
   end
 .,.,
 
-# reduce 182 omitted
-
-module_eval(<<'.,.,', 'grammar.ra', 713)
-  def _reduce_183(val, _values, result)
-        result = nil
+ # reduce 192 omitted
 
-    result
+module_eval <<'.,.,', 'grammar.ra', 727
+  def _reduce_193( val, _values, result )
+    result = nil
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 717)
-  def _reduce_184(val, _values, result)
-        result = ast AST::ASTArray, :children => []
-
-    result
+module_eval <<'.,.,', 'grammar.ra', 731
+  def _reduce_194( val, _values, result )
+    result = ast AST::ASTArray, :children => []
+   result
   end
 .,.,
 
-# reduce 185 omitted
+ # reduce 195 omitted
 
-module_eval(<<'.,.,', 'grammar.ra', 722)
-  def _reduce_186(val, _values, result)
-        result = nil
-
-    result
+module_eval <<'.,.,', 'grammar.ra', 736
+  def _reduce_196( val, _values, result )
+    result = nil
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 725)
-  def _reduce_187(val, _values, result)
-        result = val[1]
+module_eval <<'.,.,', 'grammar.ra', 740
+  def _reduce_197( val, _values, result )
+    result = val[1]
     result = [result] unless result[0].is_a?(Array)
-
-    result
+   result
   end
 .,.,
 
-# reduce 188 omitted
+ # reduce 198 omitted
 
-module_eval(<<'.,.,', 'grammar.ra', 731)
-  def _reduce_189(val, _values, result)
-        result = val[0]
+module_eval <<'.,.,', 'grammar.ra', 747
+  def _reduce_199( val, _values, result )
+    result = val[0]
     result = [result] unless result[0].is_a?(Array)
     result << val[2]
-
-    result
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 737)
-  def _reduce_190(val, _values, result)
-        Puppet.warning addcontext("Deprecation notice: must now include '$' in prototype")
+module_eval <<'.,.,', 'grammar.ra', 752
+  def _reduce_200( val, _values, result )
+    Puppet.warning addcontext("Deprecation notice: must now include '$' in prototype")
     result = [val[0][:value], val[2]]
-
-    result
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 741)
-  def _reduce_191(val, _values, result)
-        Puppet.warning addcontext("Deprecation notice: must now include '$' in prototype")
+module_eval <<'.,.,', 'grammar.ra', 756
+  def _reduce_201( val, _values, result )
+    Puppet.warning addcontext("Deprecation notice: must now include '$' in prototype")
     result = [val[0][:value]]
-
-    result
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 744)
-  def _reduce_192(val, _values, result)
-        result = [val[0][:value], val[2]]
-
-    result
+module_eval <<'.,.,', 'grammar.ra', 758
+  def _reduce_202( val, _values, result )
+    result = [val[0][:value], val[2]]
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 746)
-  def _reduce_193(val, _values, result)
-        result = [val[0][:value]]
-
-    result
+module_eval <<'.,.,', 'grammar.ra', 760
+  def _reduce_203( val, _values, result )
+    result = [val[0][:value]]
+   result
   end
 .,.,
 
-# reduce 194 omitted
+ # reduce 204 omitted
 
-module_eval(<<'.,.,', 'grammar.ra', 751)
-  def _reduce_195(val, _values, result)
-        result = val[1]
-
-    result
+module_eval <<'.,.,', 'grammar.ra', 765
+  def _reduce_205( val, _values, result )
+    result = val[1]
+   result
   end
 .,.,
 
-# reduce 196 omitted
+ # reduce 206 omitted
 
-module_eval(<<'.,.,', 'grammar.ra', 756)
-  def _reduce_197(val, _values, result)
-        result = val[1]
-
-    result
+module_eval <<'.,.,', 'grammar.ra', 770
+  def _reduce_207( val, _values, result )
+    result = val[1]
+   result
   end
 .,.,
 
-# reduce 198 omitted
+ # reduce 208 omitted
 
-# reduce 199 omitted
+ # reduce 209 omitted
 
-module_eval(<<'.,.,', 'grammar.ra', 762)
-  def _reduce_200(val, _values, result)
-        result = ast AST::Variable, :value => val[0][:value], :line => val[0][:line]
-
-    result
+module_eval <<'.,.,', 'grammar.ra', 776
+  def _reduce_210( val, _values, result )
+    result = ast AST::Variable, :value => val[0][:value], :line => val[0][:line]
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 766)
-  def _reduce_201(val, _values, result)
-        if val[1].instance_of?(AST::ASTArray)
+module_eval <<'.,.,', 'grammar.ra', 784
+  def _reduce_211( val, _values, result )
+    if val[1].instance_of?(AST::ASTArray)
         result = val[1]
     else
         result = ast AST::ASTArray, :children => [val[1]]
     end
-
-    result
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 773)
-  def _reduce_202(val, _values, result)
-        if val[1].instance_of?(AST::ASTArray)
+module_eval <<'.,.,', 'grammar.ra', 791
+  def _reduce_212( val, _values, result )
+    if val[1].instance_of?(AST::ASTArray)
         result = val[1]
     else
         result = ast AST::ASTArray, :children => [val[1]]
     end
-
-    result
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 779)
-  def _reduce_203(val, _values, result)
-        result = ast AST::ASTArray
-
-    result
+module_eval <<'.,.,', 'grammar.ra', 793
+  def _reduce_213( val, _values, result )
+    result = ast AST::ASTArray
+   result
   end
 .,.,
 
-# reduce 204 omitted
+ # reduce 214 omitted
 
-# reduce 205 omitted
+ # reduce 215 omitted
 
-# reduce 206 omitted
+ # reduce 216 omitted
 
-module_eval(<<'.,.,', 'grammar.ra', 786)
-  def _reduce_207(val, _values, result)
-     result = nil 
-    result
+module_eval <<'.,.,', 'grammar.ra', 798
+  def _reduce_217( val, _values, result )
+ result = nil
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 789)
-  def _reduce_208(val, _values, result)
-        result = ast AST::Regex, :value => val[0][:value]
-
-    result
+module_eval <<'.,.,', 'grammar.ra', 803
+  def _reduce_218( val, _values, result )
+    result = ast AST::Regex, :value => val[0][:value]
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 793)
-  def _reduce_209(val, _values, result)
-        if val[1].instance_of?(AST::ASTHash)
+module_eval <<'.,.,', 'grammar.ra', 811
+  def _reduce_219( val, _values, result )
+    if val[1].instance_of?(AST::ASTHash)
         result = val[1]
     else
         result = ast AST::ASTHash, { :value => val[1] }
     end
-
-    result
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 800)
-  def _reduce_210(val, _values, result)
-        if val[1].instance_of?(AST::ASTHash)
+module_eval <<'.,.,', 'grammar.ra', 818
+  def _reduce_220( val, _values, result )
+    if val[1].instance_of?(AST::ASTHash)
         result = val[1]
     else
         result = ast AST::ASTHash, { :value => val[1] }
     end
-
-    result
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 806)
-  def _reduce_211(val, _values, result)
-        result = ast AST::ASTHash
-
-    result
+module_eval <<'.,.,', 'grammar.ra', 820
+  def _reduce_221( val, _values, result )
+    result = ast AST::ASTHash
+   result
   end
 .,.,
 
-# reduce 212 omitted
+ # reduce 222 omitted
 
-module_eval(<<'.,.,', 'grammar.ra', 811)
-  def _reduce_213(val, _values, result)
-        if val[0].instance_of?(AST::ASTHash)
+module_eval <<'.,.,', 'grammar.ra', 830
+  def _reduce_223( val, _values, result )
+    if val[0].instance_of?(AST::ASTHash)
         result = val[0].merge(val[2])
     else
         result = ast AST::ASTHash, :value => val[0]
         result.merge(val[2])
     end
-
-    result
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 820)
-  def _reduce_214(val, _values, result)
-        result = ast AST::ASTHash, { :value => { val[0] => val[2] } }
-
-    result
+module_eval <<'.,.,', 'grammar.ra', 834
+  def _reduce_224( val, _values, result )
+    result = ast AST::ASTHash, { :value => { val[0] => val[2] } }
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 823)
-  def _reduce_215(val, _values, result)
-     result = val[0][:value] 
-    result
+module_eval <<'.,.,', 'grammar.ra', 835
+  def _reduce_225( val, _values, result )
+ result = val[0][:value]
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 824)
-  def _reduce_216(val, _values, result)
-     result = val[0] 
-    result
+module_eval <<'.,.,', 'grammar.ra', 836
+  def _reduce_226( val, _values, result )
+ result = val[0]
+   result
   end
 .,.,
 
-module_eval(<<'.,.,', 'grammar.ra', 827)
-  def _reduce_217(val, _values, result)
-        result = ast AST::HashOrArrayAccess, :variable => val[0][:value], :key => val[2] 
-
-    result
+module_eval <<'.,.,', 'grammar.ra', 841
+  def _reduce_227( val, _values, result )
+    result = ast AST::HashOrArrayAccess, :variable => val[0][:value], :key => val[2]
+   result
   end
 .,.,
 
-# reduce 218 omitted
-
-module_eval(<<'.,.,', 'grammar.ra', 832)
-  def _reduce_219(val, _values, result)
-        result = ast AST::HashOrArrayAccess, :variable => val[0], :key => val[2] 
+ # reduce 228 omitted
 
-    result
+module_eval <<'.,.,', 'grammar.ra', 846
+  def _reduce_229( val, _values, result )
+    result = ast AST::HashOrArrayAccess, :variable => val[0], :key => val[2]
+   result
   end
 .,.,
 
-def _reduce_none(val, _values, result)
-  val[0]
-end
+ def _reduce_none( val, _values, result )
+  result
+ end
 
     end   # class Parser
-    end   # module Parser
-  end   # module Puppet
+
+  end   # module Parser
+
+end   # module Puppet
diff --git a/lib/puppet/parser/relationship.rb b/lib/puppet/parser/relationship.rb
new file mode 100644
index 0000000..1d1bad7
--- /dev/null
+++ b/lib/puppet/parser/relationship.rb
@@ -0,0 +1,43 @@
+class Puppet::Parser::Relationship
+    attr_accessor :source, :target, :type
+
+    PARAM_MAP = {:relationship => :before, :subscription => :notify}
+
+    def evaluate(catalog)
+        if source.is_a?(Puppet::Parser::Collector)
+            sources = source.collected.values
+        else
+            sources = [source]
+        end
+        if target.is_a?(Puppet::Parser::Collector)
+            targets = target.collected.values
+        else
+            targets = [target]
+        end
+        sources.each do |s|
+            targets.each do |t|
+                mk_relationship(s, t, catalog)
+            end
+        end
+    end
+
+    def initialize(source, target, type)
+        @source, @target, @type = source, target, type
+    end
+
+    def param_name
+        PARAM_MAP[type] || raise(ArgumentError, "Invalid relationship type #{type}")
+    end
+
+    def mk_relationship(source, target, catalog)
+        unless source_resource = catalog.resource(source.to_s)
+            raise ArgumentError, "Could not find resource '#{source}' for relationship on '#{target}'"
+        end
+        unless target_resource = catalog.resource(target.to_s)
+            raise ArgumentError, "Could not find resource '#{target}' for relationship from '#{source}'"
+        end
+        Puppet.debug "Adding relationship from #{source.to_s} to #{target.to_s} with '#{param_name}'"
+        source_resource[param_name] ||= []
+        source_resource[param_name] << target.to_s
+    end
+end
diff --git a/spec/integration/parser/parser.rb b/spec/integration/parser/parser.rb
index 5a30f06..ee476c0 100755
--- a/spec/integration/parser/parser.rb
+++ b/spec/integration/parser/parser.rb
@@ -3,6 +3,76 @@
 require File.dirname(__FILE__) + '/../../spec_helper'
 
 describe Puppet::Parser::Parser do
+    module ParseMatcher
+        class ParseAs
+            def initialize(klass)
+                @parser = Puppet::Parser::Parser.new "development"
+                @class = klass
+            end
+
+            def result_instance
+                @result.hostclass("").code[0]
+            end
+
+            def matches?(string)
+                @string = string
+                @result = @parser.parse(string)
+                return result_instance.instance_of?(@class)
+            end
+
+            def description
+                "parse as a #{@class}"
+            end
+
+            def failure_message
+                " expected #{@string} to parse as #{@class} but was #{result_instance.class}"
+            end
+
+            def negative_failure_message
+                " expected #{@string} not to parse as #{@class}"
+            end
+        end
+
+        def parse_as(klass)
+            ParseAs.new(klass)
+        end
+
+        class ParseWith
+            def initialize(block)
+                @parser = Puppet::Parser::Parser.new "development"
+                @block = block
+            end
+
+            def result_instance
+                @result.hostclass("").code[0]
+            end
+
+            def matches?(string)
+                @string = string
+                @result = @parser.parse(string)
+                return @block.call(result_instance)
+            end
+
+            def description
+                "parse with the block evaluating to true"
+            end
+
+            def failure_message
+                " expected #{@string} to parse with a true result in the block"
+            end
+
+            def negative_failure_message
+                " expected #{@string} not to parse with a true result in the block"
+            end
+        end
+
+        def parse_with(&block)
+            ParseWith.new(block)
+        end
+    end
+
+    include ParseMatcher
+
     before :each do
         @resource_type_collection = Puppet::Resource::TypeCollection.new("env")
         @parser = Puppet::Parser::Parser.new "development"
@@ -18,4 +88,26 @@ describe Puppet::Parser::Parser do
             ast.hostclass("test").doc.should == "comment\n"
         end
     end
+
+    describe "when parsing" do
+        it "should be able to parse normal left to right relationships" do
+            "Notify[foo] -> Notify[bar]".should parse_as(Puppet::Parser::AST::Relationship)
+        end
+
+        it "should be able to parse right to left relationships" do
+            "Notify[foo] <- Notify[bar]".should parse_as(Puppet::Parser::AST::Relationship)
+        end
+
+        it "should be able to parse normal left to right subscriptions" do
+            "Notify[foo] ~> Notify[bar]".should parse_as(Puppet::Parser::AST::Relationship)
+        end
+
+        it "should be able to parse right to left subscriptions" do
+            "Notify[foo] <~ Notify[bar]".should parse_as(Puppet::Parser::AST::Relationship)
+        end
+
+        it "should correctly set the arrow type of a relationship" do
+            "Notify[foo] <~ Notify[bar]".should parse_with { |rel| rel.arrow == "<~" }
+        end
+    end
 end
diff --git a/spec/unit/parser/ast/relationship.rb b/spec/unit/parser/ast/relationship.rb
new file mode 100644
index 0000000..acb46e4
--- /dev/null
+++ b/spec/unit/parser/ast/relationship.rb
@@ -0,0 +1,88 @@
+#!/usr/bin/env ruby
+
+require File.dirname(__FILE__) + '/../../../spec_helper'
+
+describe Puppet::Parser::AST::Relationship do
+    before do
+        @class = Puppet::Parser::AST::Relationship
+    end
+
+    it "should set its 'left' and 'right' arguments accordingly" do
+        dep = @class.new(:left, :right, '->')
+        dep.left.should == :left
+        dep.right.should == :right
+    end
+
+    it "should set its arrow to whatever arrow is passed" do
+        @class.new(:left, :right, '->').arrow.should == '->'
+    end
+
+    it "should set its type to :relationship if the relationship type is '<-'" do
+        @class.new(:left, :right, '<-').type.should == :relationship
+    end
+
+    it "should set its type to :relationship if the relationship type is '->'" do
+        @class.new(:left, :right, '->').type.should == :relationship
+    end
+
+    it "should set its type to :subscription if the relationship type is '~>'" do
+        @class.new(:left, :right, '~>').type.should == :subscription
+    end
+
+    it "should set its type to :subscription if the relationship type is '<~'" do
+        @class.new(:left, :right, '<~').type.should == :subscription
+    end
+
+    it "should set its line and file if provided" do
+        dep = @class.new(:left, :right, '->', :line => 50, :file => "/foo")
+        dep.line.should == 50
+        dep.file.should == "/foo"
+    end
+
+    describe "when evaluating" do
+        before do
+            @compiler = Puppet::Parser::Compiler.new(Puppet::Node.new("foo"))
+            @scope = Puppet::Parser::Scope.new(:compiler => @compiler)
+        end
+
+        it "should create a relationship with the evaluated source and target and add it to the scope" do
+            source = stub 'source', :safeevaluate => :left
+            target = stub 'target', :safeevaluate => :right
+            @class.new(source, target, '->').evaluate(@scope)
+            @compiler.relationships[0].source.should == :left
+            @compiler.relationships[0].target.should == :right
+        end
+
+        describe "a chained relationship" do
+            before do
+                @left = stub 'left', :safeevaluate => :left
+                @middle = stub 'middle', :safeevaluate => :middle
+                @right = stub 'right', :safeevaluate => :right
+                @first = @class.new(@left, @middle, '->')
+                @second = @class.new(@first, @right, '->')
+            end
+
+            it "should evaluate the relationship to the left" do
+                @first.expects(:evaluate).with(@scope).returns Puppet::Parser::Relationship.new(:left, :right, :relationship)
+
+                @second.evaluate(@scope)
+            end
+
+            it "should use the right side of the left relationship as its source" do
+                @second.evaluate(@scope)
+
+                @compiler.relationships[0].source.should == :left
+                @compiler.relationships[0].target.should == :middle
+                @compiler.relationships[1].source.should == :middle
+                @compiler.relationships[1].target.should == :right
+            end
+
+            it "should only evaluate a given AST node once" do
+                @left.expects(:safeevaluate).once.returns :left
+                @middle.expects(:safeevaluate).once.returns :middle
+                @right.expects(:safeevaluate).once.returns :right
+                @second.evaluate(@scope)
+            end
+        end
+    end
+end
diff --git a/spec/unit/parser/compiler.rb b/spec/unit/parser/compiler.rb
index 6fd4d1f..c36113f 100755
--- a/spec/unit/parser/compiler.rb
+++ b/spec/unit/parser/compiler.rb
@@ -134,7 +134,7 @@ describe Puppet::Parser::Compiler do
 
         def compile_methods
             [:set_node_parameters, :evaluate_main, :evaluate_ast_node, :evaluate_node_classes, :evaluate_generators, :fail_on_unevaluated,
-                :finish, :store, :extract]
+                :finish, :store, :extract, :evaluate_relationships]
         end
 
         # Stub all of the main compile methods except the ones we're specifically interested in.
@@ -394,6 +394,15 @@ describe Puppet::Parser::Compiler do
         end
     end
 
+    describe "when evaluating relationships" do
+        it "should evaluate each relationship with its catalog" do
+            dep = stub 'dep'
+            dep.expects(:evaluate).with(@compiler.catalog)
+            @compiler.add_relationship dep
+            @compiler.evaluate_relationships
+        end
+    end
+
     describe "when told to evaluate missing classes" do
 
         it "should fail if there's no source listed for the scope" do
diff --git a/spec/unit/parser/lexer.rb b/spec/unit/parser/lexer.rb
index 2e58ef4..b1524f1 100755
--- a/spec/unit/parser/lexer.rb
+++ b/spec/unit/parser/lexer.rb
@@ -174,6 +174,10 @@ describe Puppet::Parser::Lexer::TOKENS do
         :RSHIFT => '>>',
         :MATCH => '=~',
         :NOMATCH => '!~',
+        :IN_EDGE => '->',
+        :OUT_EDGE => '<-',
+        :IN_EDGE_SUB => '~>',
+        :OUT_EDGE_SUB => '<~',
     }.each do |name, string|
         it "should have a token named #{name.to_s}" do
             Puppet::Parser::Lexer::TOKENS[name].should_not be_nil
diff --git a/spec/unit/parser/relationship.rb b/spec/unit/parser/relationship.rb
new file mode 100644
index 0000000..bd4ff56
--- /dev/null
+++ b/spec/unit/parser/relationship.rb
@@ -0,0 +1,70 @@
+#!/usr/bin/env ruby
+
+require File.dirname(__FILE__) + '/../../spec_helper'
+
+require 'puppet/parser/relationship'
+
+describe Puppet::Parser::Relationship do
+    before do
+        @source = Puppet::Resource.new(:mytype, "source")
+        @target = Puppet::Resource.new(:mytype, "target")
+        @dep = Puppet::Parser::Relationship.new(@source, @target, :relationship)
+    end
+
+    describe "when evaluating" do
+        before do
+            @catalog = Puppet::Resource::Catalog.new
+            @catalog.add_resource(@source)
+            @catalog.add_resource(@target)
+        end
+
+        it "should fail if the source resource cannot be found" do
+            @catalog = Puppet::Resource::Catalog.new
+            @catalog.add_resource @target
+            lambda { @dep.evaluate(@catalog) }.should raise_error(ArgumentError)
+        end
+
+        it "should fail if the target resource cannot be found" do
+            @catalog = Puppet::Resource::Catalog.new
+            @catalog.add_resource @source
+            lambda { @dep.evaluate(@catalog) }.should raise_error(ArgumentError)
+        end
+
+        it "should add the target as a 'before' value if the type is 'relationship'" do
+            @dep.type = :relationship
+            @dep.evaluate(@catalog)
+            @source[:before].should be_include("Mytype[target]")
+        end
+
+        it "should add the target as a 'notify' value if the type is 'subscription'" do
+            @dep.type = :subscription
+            @dep.evaluate(@catalog)
+            @source[:notify].should be_include("Mytype[target]")
+        end
+
+        it "should supplement rather than clobber existing relationship values" do
+            @source[:before] = "File[/bar]"
+            @dep.evaluate(@catalog)
+            @source[:before].should be_include("Mytype[target]")
+            @source[:before].should be_include("File[/bar]")
+        end
+
+        it "should use the collected retargets if the target is a Collector" do
+            orig_target = @target
+            @target = Puppet::Parser::Collector.new(stub("scope"), :file, "equery", "vquery", :virtual)
+            @target.collected[:foo] = @target
+            @dep.evaluate(@catalog)
+
+            @source[:before].should be_include("Mytype[target]")
+        end
+
+        it "should use the collected resources if the source is a Collector" do
+            orig_source = @source
+            @source = Puppet::Parser::Collector.new(stub("scope"), :file, "equery", "vquery", :virtual)
+            @source.collected[:foo] = @source
+            @dep.evaluate(@catalog)
+
+            orig_source[:before].should be_include("Mytype[target]")
+        end
+    end
+end

-- 
Puppet packaging for Debian



More information about the Pkg-puppet-devel mailing list