[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:30:19 UTC 2010


The following commit has been merged in the upstream branch:
commit 75c32f910ea124a938a7035b3352c11a11b57d0c
Author: Brice Figureau <brice-puppet at daysofwonder.com>
Date:   Tue Nov 10 16:43:37 2009 +0100

    Fix #2389 - Enhance Puppet DSL with Hashes
    
    This bring a new container syntax to the Puppet DSL: hashes.
    
    Hashes are defined like Ruby Hash:
    { key1 => val1, ... }
    
    Hash keys are strings, but hash values can be any possible right
    values admitted in Puppet DSL (ie function call, variables access...)
    
    Currently it is possible:
    
    1) to assign hashes to variable
    $myhash = { key1 => "myval", key2 => $b }
    
    2) to access hash members (recursively) from a variable containing
    a hash (works for array too):
    
    $myhash = { key => { subkey => "b" }}
    notice($myhash[key][subjey]]
    
    3) to use hash member access as resource title
    
    4) to use hash in default definition parameter or resource parameter if
    the type supports it (known for the moment).
    
    It is not possible to string interpolate an hash access. If it proves
    to be an issue it can be added or work-arounded with a string concatenation
    operator easily.
    
    It is not possible to use an hash as a resource title. This might be
    possible once we support compound resource title.
    
    Unlike the proposed syntax in the ticket it is not possible to assign
    individual hash member (mostly to respect write once nature of variable
    in puppet).
    
    Signed-off-by: Brice Figureau <brice-puppet at daysofwonder.com>

diff --git a/lib/puppet/parser/ast.rb b/lib/puppet/parser/ast.rb
index feceb60..6af7745 100644
--- a/lib/puppet/parser/ast.rb
+++ b/lib/puppet/parser/ast.rb
@@ -92,6 +92,7 @@ end
 # And include all of the AST subclasses.
 require 'puppet/parser/ast/arithmetic_operator'
 require 'puppet/parser/ast/astarray'
+require 'puppet/parser/ast/asthash'
 require 'puppet/parser/ast/branch'
 require 'puppet/parser/ast/boolean_operator'
 require 'puppet/parser/ast/caseopt'
diff --git a/lib/puppet/parser/ast/asthash.rb b/lib/puppet/parser/ast/asthash.rb
new file mode 100644
index 0000000..2860657
--- /dev/null
+++ b/lib/puppet/parser/ast/asthash.rb
@@ -0,0 +1,34 @@
+require 'puppet/parser/ast/leaf'
+
+class Puppet::Parser::AST
+    class ASTHash < Leaf
+        include Enumerable
+
+        def [](index)
+        end
+
+        # Evaluate our children.
+        def evaluate(scope)
+            items = {}
+
+            @value.each_pair do |k,v|
+                items.merge!({ k => v.safeevaluate(scope) })
+            end
+
+            return items
+        end
+
+        def merge(hash)
+            case hash
+            when ASTHash
+                @value = @value.merge(hash.value)
+            when Hash
+                @value = @value.merge(hash)
+            end
+        end
+
+        def to_s
+            "{" + @value.collect { |v| v.collect { |a| a.to_s }.join(' => ') }.join(', ') + "}"
+        end
+    end
+end
diff --git a/lib/puppet/parser/ast/leaf.rb b/lib/puppet/parser/ast/leaf.rb
index b583149..206ea5c 100644
--- a/lib/puppet/parser/ast/leaf.rb
+++ b/lib/puppet/parser/ast/leaf.rb
@@ -139,6 +139,27 @@ class Puppet::Parser::AST
         end
     end
 
+    class HashOrArrayAccess < AST::Leaf
+        attr_accessor :variable, :key
+
+        def evaluate(scope)
+            container = variable.respond_to?(:evaluate) ? variable.safeevaluate(scope) : variable
+            object = (container.is_a?(Hash) or container.is_a?(Array)) ? container : scope.lookupvar(container)
+
+            accesskey = key.respond_to?(:evaluate) ? key.safeevaluate(scope) : key
+
+            unless object.is_a?(Hash) or object.is_a?(Array)
+                raise Puppet::ParseError, "#{variable} is not an hash or array when accessing it with #{accesskey}"
+            end
+
+            return object[accesskey]
+        end
+
+        def to_s
+            "\$#{variable.to_s}[#{key.to_s}]"
+        end
+    end
+
     class Regex < AST::Leaf
         def initialize(hash)
             super
diff --git a/lib/puppet/parser/grammar.ra b/lib/puppet/parser/grammar.ra
index 4c74211..6b7b31b 100644
--- a/lib/puppet/parser/grammar.ra
+++ b/lib/puppet/parser/grammar.ra
@@ -131,6 +131,7 @@ namestring:       name
                 | funcrvalue
                 | selector
                 | quotedtext
+                | hasharrayaccesses
                 | CLASSNAME {
                     result = ast AST::Name, :value => val[0][:value]
                 }
@@ -325,6 +326,7 @@ resourcename:   quotedtext
             | selector
             | variable
             | array
+            | hasharrayaccesses
 
 assignment:     VARIABLE EQUALS expression {
     if val[0][:value] =~ /::/
@@ -403,6 +405,8 @@ rvalue:       quotedtext
             | selector
             | variable
             | array
+            | hash
+            | hasharrayaccesses
             | resourceref
             | funcrvalue
             | undef
@@ -781,6 +785,50 @@ regex:        REGEX {
     result = ast AST::Regex, :value => val[0][:value]
 }
 
+hash:        LBRACE hashpairs RBRACE {
+    if val[1].instance_of?(AST::ASTHash)
+        result = val[1]
+    else
+        result = ast AST::ASTHash, { :value => val[1] }
+    end
+}
+            | LBRACE hashpairs COMMA RBRACE {
+    if val[1].instance_of?(AST::ASTHash)
+        result = val[1]
+    else
+        result = ast AST::ASTHash, { :value => val[1] }
+    end
+}           | LBRACE RBRACE {
+    result = ast AST::ASTHash
+}
+
+hashpairs:  hashpair
+            | hashpairs COMMA hashpair {
+    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
+}
+
+hashpair:   key FARROW rvalue {
+    result = ast AST::ASTHash, { :value => { val[0] => val[2] } }
+}
+
+key: NAME { result = val[0][:value] }
+        | SQTEXT { result = val[0][:value] }
+        | DQTEXT { result = val[0][:value] }
+
+hasharrayaccess: VARIABLE LBRACK rvalue RBRACK {
+    result = ast AST::HashOrArrayAccess, :variable => val[0][:value], :key => val[2] 
+}
+
+hasharrayaccesses:    hasharrayaccess
+                    | hasharrayaccess LBRACK rvalue RBRACK {
+    result = ast AST::HashOrArrayAccess, :variable => val[0], :key => val[2] 
+}
+
 end
 ---- header ----
 require 'puppet'
diff --git a/lib/puppet/parser/parser.rb b/lib/puppet/parser/parser.rb
index 376b818..5c05e55 100644
--- a/lib/puppet/parser/parser.rb
+++ b/lib/puppet/parser/parser.rb
@@ -29,7 +29,7 @@ module Puppet
 
     class Parser < Racc::Parser
 
-module_eval <<'..end grammar.ra modeval..ide7bdbd4a34', 'grammar.ra', 802
+module_eval <<'..end grammar.ra modeval..id6e4c43cdab', 'grammar.ra', 850
 
 # It got too annoying having code in a file that needs to be compiled.
 require 'puppet/parser/parser_support'
@@ -41,7 +41,7 @@ require 'puppet/parser/parser_support'
 
 # $Id$
 
-..end grammar.ra modeval..ide7bdbd4a34
+..end grammar.ra modeval..id6e4c43cdab
 
 ##### racc 1.4.5 generates ###
 
@@ -79,691 +79,757 @@ racc_reduce_table = [
  1, 81, :_reduce_none,
  1, 81, :_reduce_none,
  1, 81, :_reduce_none,
- 1, 81, :_reduce_33,
- 5, 67, :_reduce_34,
+ 1, 81, :_reduce_none,
+ 1, 81, :_reduce_34,
  5, 67, :_reduce_35,
  5, 67, :_reduce_36,
- 5, 78, :_reduce_37,
- 2, 68, :_reduce_38,
- 1, 97, :_reduce_39,
- 2, 97, :_reduce_40,
- 6, 69, :_reduce_41,
- 2, 69, :_reduce_42,
- 3, 98, :_reduce_43,
- 3, 98, :_reduce_44,
- 1, 99, :_reduce_none,
- 1, 99, :_reduce_none,
- 3, 99, :_reduce_47,
+ 5, 67, :_reduce_37,
+ 5, 78, :_reduce_38,
+ 2, 68, :_reduce_39,
+ 1, 98, :_reduce_40,
+ 2, 98, :_reduce_41,
+ 6, 69, :_reduce_42,
+ 2, 69, :_reduce_43,
+ 3, 99, :_reduce_44,
+ 3, 99, :_reduce_45,
  1, 100, :_reduce_none,
- 3, 100, :_reduce_49,
- 1, 101, :_reduce_50,
- 1, 101, :_reduce_51,
- 3, 102, :_reduce_52,
- 3, 102, :_reduce_53,
- 1, 103, :_reduce_none,
- 1, 103, :_reduce_none,
- 4, 105, :_reduce_56,
- 1, 91, :_reduce_none,
- 3, 91, :_reduce_58,
- 0, 92, :_reduce_none,
- 1, 92, :_reduce_none,
- 1, 107, :_reduce_61,
- 1, 83, :_reduce_62,
- 1, 85, :_reduce_63,
- 1, 106, :_reduce_none,
- 1, 106, :_reduce_none,
- 1, 106, :_reduce_none,
- 1, 106, :_reduce_none,
- 1, 106, :_reduce_none,
- 1, 106, :_reduce_none,
- 3, 70, :_reduce_70,
- 3, 79, :_reduce_71,
- 0, 93, :_reduce_72,
- 1, 93, :_reduce_73,
- 3, 93, :_reduce_74,
- 3, 110, :_reduce_75,
- 3, 112, :_reduce_76,
- 1, 113, :_reduce_none,
- 1, 113, :_reduce_none,
- 0, 96, :_reduce_79,
- 1, 96, :_reduce_80,
- 3, 96, :_reduce_81,
- 1, 114, :_reduce_none,
- 3, 114, :_reduce_83,
- 1, 104, :_reduce_none,
- 1, 104, :_reduce_none,
- 1, 104, :_reduce_none,
- 1, 104, :_reduce_none,
+ 1, 100, :_reduce_none,
+ 3, 100, :_reduce_48,
+ 1, 101, :_reduce_none,
+ 3, 101, :_reduce_50,
+ 1, 102, :_reduce_51,
+ 1, 102, :_reduce_52,
+ 3, 103, :_reduce_53,
+ 3, 103, :_reduce_54,
  1, 104, :_reduce_none,
  1, 104, :_reduce_none,
- 1, 111, :_reduce_none,
- 1, 111, :_reduce_none,
- 1, 111, :_reduce_none,
- 1, 111, :_reduce_none,
- 1, 111, :_reduce_none,
- 1, 111, :_reduce_none,
- 1, 111, :_reduce_none,
- 1, 111, :_reduce_none,
- 1, 111, :_reduce_none,
- 1, 111, :_reduce_none,
- 4, 87, :_reduce_100,
- 3, 87, :_reduce_101,
- 1, 89, :_reduce_102,
- 1, 89, :_reduce_103,
- 1, 86, :_reduce_104,
- 4, 82, :_reduce_105,
- 4, 82, :_reduce_106,
- 6, 72, :_reduce_107,
- 5, 72, :_reduce_108,
- 0, 116, :_reduce_none,
- 4, 116, :_reduce_110,
- 3, 116, :_reduce_111,
- 1, 109, :_reduce_none,
- 3, 109, :_reduce_113,
- 3, 109, :_reduce_114,
- 3, 109, :_reduce_115,
- 3, 109, :_reduce_116,
- 3, 109, :_reduce_117,
- 3, 109, :_reduce_118,
- 3, 109, :_reduce_119,
- 3, 109, :_reduce_120,
- 2, 109, :_reduce_121,
- 3, 109, :_reduce_122,
- 3, 109, :_reduce_123,
- 3, 109, :_reduce_124,
- 3, 109, :_reduce_125,
- 3, 109, :_reduce_126,
- 3, 109, :_reduce_127,
- 2, 109, :_reduce_128,
- 3, 109, :_reduce_129,
- 3, 109, :_reduce_130,
- 3, 109, :_reduce_131,
- 5, 71, :_reduce_132,
- 1, 118, :_reduce_none,
- 2, 118, :_reduce_134,
- 5, 119, :_reduce_135,
- 4, 119, :_reduce_136,
+ 4, 106, :_reduce_57,
+ 1, 92, :_reduce_none,
+ 3, 92, :_reduce_59,
+ 0, 93, :_reduce_none,
+ 1, 93, :_reduce_none,
+ 1, 108, :_reduce_62,
+ 1, 83, :_reduce_63,
+ 1, 85, :_reduce_64,
+ 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, 107, :_reduce_none,
+ 3, 70, :_reduce_72,
+ 3, 79, :_reduce_73,
+ 0, 94, :_reduce_74,
+ 1, 94, :_reduce_75,
+ 3, 94, :_reduce_76,
+ 3, 111, :_reduce_77,
+ 3, 113, :_reduce_78,
+ 1, 114, :_reduce_none,
+ 1, 114, :_reduce_none,
+ 0, 97, :_reduce_81,
+ 1, 97, :_reduce_82,
+ 3, 97, :_reduce_83,
+ 1, 115, :_reduce_none,
+ 3, 115, :_reduce_85,
+ 1, 105, :_reduce_none,
+ 1, 105, :_reduce_none,
+ 1, 105, :_reduce_none,
+ 1, 105, :_reduce_none,
+ 1, 105, :_reduce_none,
+ 1, 105, :_reduce_none,
+ 1, 112, :_reduce_none,
+ 1, 112, :_reduce_none,
+ 1, 112, :_reduce_none,
+ 1, 112, :_reduce_none,
+ 1, 112, :_reduce_none,
+ 1, 112, :_reduce_none,
+ 1, 112, :_reduce_none,
+ 1, 112, :_reduce_none,
+ 1, 112, :_reduce_none,
+ 1, 112, :_reduce_none,
+ 1, 112, :_reduce_none,
+ 1, 112, :_reduce_none,
+ 4, 87, :_reduce_104,
+ 3, 87, :_reduce_105,
+ 1, 89, :_reduce_106,
+ 1, 89, :_reduce_107,
+ 1, 86, :_reduce_108,
+ 4, 82, :_reduce_109,
+ 4, 82, :_reduce_110,
+ 6, 72, :_reduce_111,
+ 5, 72, :_reduce_112,
+ 0, 118, :_reduce_none,
+ 4, 118, :_reduce_114,
+ 3, 118, :_reduce_115,
+ 1, 110, :_reduce_none,
+ 3, 110, :_reduce_117,
+ 3, 110, :_reduce_118,
+ 3, 110, :_reduce_119,
+ 3, 110, :_reduce_120,
+ 3, 110, :_reduce_121,
+ 3, 110, :_reduce_122,
+ 3, 110, :_reduce_123,
+ 3, 110, :_reduce_124,
+ 2, 110, :_reduce_125,
+ 3, 110, :_reduce_126,
+ 3, 110, :_reduce_127,
+ 3, 110, :_reduce_128,
+ 3, 110, :_reduce_129,
+ 3, 110, :_reduce_130,
+ 3, 110, :_reduce_131,
+ 2, 110, :_reduce_132,
+ 3, 110, :_reduce_133,
+ 3, 110, :_reduce_134,
+ 3, 110, :_reduce_135,
+ 5, 71, :_reduce_136,
  1, 120, :_reduce_none,
- 3, 120, :_reduce_138,
- 3, 88, :_reduce_139,
+ 2, 120, :_reduce_138,
+ 5, 121, :_reduce_139,
+ 4, 121, :_reduce_140,
  1, 122, :_reduce_none,
- 4, 122, :_reduce_141,
+ 3, 122, :_reduce_142,
+ 3, 88, :_reduce_143,
  1, 124, :_reduce_none,
- 3, 124, :_reduce_143,
- 3, 123, :_reduce_144,
- 1, 121, :_reduce_none,
- 1, 121, :_reduce_none,
- 1, 121, :_reduce_none,
- 1, 121, :_reduce_none,
- 1, 121, :_reduce_none,
- 1, 121, :_reduce_none,
- 1, 121, :_reduce_none,
- 1, 121, :_reduce_152,
- 1, 121, :_reduce_none,
- 1, 125, :_reduce_154,
- 3, 125, :_reduce_155,
- 2, 73, :_reduce_156,
- 6, 75, :_reduce_157,
- 5, 75, :_reduce_158,
- 6, 76, :_reduce_159,
- 5, 76, :_reduce_160,
- 6, 77, :_reduce_161,
- 5, 77, :_reduce_162,
- 1, 95, :_reduce_163,
- 1, 90, :_reduce_164,
- 1, 90, :_reduce_165,
- 1, 128, :_reduce_none,
- 3, 128, :_reduce_167,
- 1, 130, :_reduce_168,
- 1, 131, :_reduce_169,
- 1, 131, :_reduce_170,
- 1, 131, :_reduce_171,
- 1, 131, :_reduce_172,
- 1, 131, :_reduce_none,
- 0, 65, :_reduce_174,
- 0, 132, :_reduce_175,
+ 4, 124, :_reduce_145,
  1, 126, :_reduce_none,
- 3, 126, :_reduce_177,
- 3, 126, :_reduce_178,
+ 3, 126, :_reduce_147,
+ 3, 125, :_reduce_148,
+ 1, 123, :_reduce_none,
+ 1, 123, :_reduce_none,
+ 1, 123, :_reduce_none,
+ 1, 123, :_reduce_none,
+ 1, 123, :_reduce_none,
+ 1, 123, :_reduce_none,
+ 1, 123, :_reduce_none,
+ 1, 123, :_reduce_156,
+ 1, 123, :_reduce_none,
+ 1, 127, :_reduce_158,
+ 3, 127, :_reduce_159,
+ 2, 73, :_reduce_160,
+ 6, 75, :_reduce_161,
+ 5, 75, :_reduce_162,
+ 6, 76, :_reduce_163,
+ 5, 76, :_reduce_164,
+ 6, 77, :_reduce_165,
+ 5, 77, :_reduce_166,
+ 1, 96, :_reduce_167,
+ 1, 91, :_reduce_168,
+ 1, 91, :_reduce_169,
+ 1, 130, :_reduce_none,
+ 3, 130, :_reduce_171,
+ 1, 132, :_reduce_172,
+ 1, 133, :_reduce_173,
+ 1, 133, :_reduce_174,
+ 1, 133, :_reduce_175,
+ 1, 133, :_reduce_176,
  1, 133, :_reduce_none,
- 3, 133, :_reduce_180,
- 3, 134, :_reduce_181,
- 1, 134, :_reduce_182,
- 3, 134, :_reduce_183,
- 1, 134, :_reduce_184,
- 1, 129, :_reduce_none,
- 2, 129, :_reduce_186,
- 1, 127, :_reduce_none,
- 2, 127, :_reduce_188,
- 1, 135, :_reduce_none,
+ 0, 65, :_reduce_178,
+ 0, 134, :_reduce_179,
+ 1, 128, :_reduce_none,
+ 3, 128, :_reduce_181,
+ 3, 128, :_reduce_182,
  1, 135, :_reduce_none,
- 1, 84, :_reduce_191,
- 3, 108, :_reduce_192,
- 4, 108, :_reduce_193,
- 2, 108, :_reduce_194,
- 1, 115, :_reduce_none,
- 1, 115, :_reduce_none,
- 0, 94, :_reduce_none,
- 1, 94, :_reduce_198,
- 1, 117, :_reduce_199 ]
-
-racc_reduce_n = 200
-
-racc_shift_n = 329
+ 3, 135, :_reduce_184,
+ 3, 136, :_reduce_185,
+ 1, 136, :_reduce_186,
+ 3, 136, :_reduce_187,
+ 1, 136, :_reduce_188,
+ 1, 131, :_reduce_none,
+ 2, 131, :_reduce_190,
+ 1, 129, :_reduce_none,
+ 2, 129, :_reduce_192,
+ 1, 137, :_reduce_none,
+ 1, 137, :_reduce_none,
+ 1, 84, :_reduce_195,
+ 3, 109, :_reduce_196,
+ 4, 109, :_reduce_197,
+ 2, 109, :_reduce_198,
+ 1, 116, :_reduce_none,
+ 1, 116, :_reduce_none,
+ 0, 95, :_reduce_none,
+ 1, 95, :_reduce_202,
+ 1, 119, :_reduce_203,
+ 3, 117, :_reduce_204,
+ 4, 117, :_reduce_205,
+ 2, 117, :_reduce_206,
+ 1, 138, :_reduce_none,
+ 3, 138, :_reduce_208,
+ 3, 139, :_reduce_209,
+ 1, 140, :_reduce_210,
+ 1, 140, :_reduce_211,
+ 1, 140, :_reduce_212,
+ 4, 141, :_reduce_213,
+ 1, 90, :_reduce_none,
+ 4, 90, :_reduce_215 ]
+
+racc_reduce_n = 216
+
+racc_shift_n = 355
 
 racc_action_table = [
-    77,    56,    59,    56,    59,    54,   285,   187,   165,   126,
-   158,   159,   160,   144,   284,    56,    59,   152,   156,    48,
-    73,    77,    56,    59,   170,   138,    90,    77,    56,    59,
-    91,    48,   249,    48,   123,    58,    61,    58,   201,    68,
-   248,    68,   312,    92,    55,    78,   111,    73,    63,   194,
-    63,    84,    48,    77,    56,    59,    58,    61,    48,    41,
-    68,    41,    58,    61,   187,    55,    68,    93,   261,    63,
-   247,    55,    78,    38,    39,    63,  -146,   138,    84,  -151,
-    41,   287,    38,    39,    48,   253,    41,   301,    58,   201,
-   257,   264,    68,    77,    56,    59,   137,   111,   245,   246,
-   300,    63,   165,    77,    56,    59,   245,   246,    40,   277,
-   253,    44,    41,    48,    36,   257,   163,    40,   170,   165,
-    44,     4,     8,    73,    48,    54,    56,    59,    58,    61,
-    48,    41,    68,   165,    48,   170,    36,    55,    58,    61,
-    41,    63,    68,     4,    48,    51,    36,    55,    78,   170,
-   207,    63,    41,     4,    84,   163,    48,    77,    56,    59,
-    58,    61,    41,   206,    68,    38,    39,    36,    52,    55,
-   183,   208,  -148,    63,     4,   210,   211,    73,    77,    56,
-    59,   160,   144,  -145,    41,   270,   152,   156,    48,   160,
-   144,   130,    58,    61,   152,   156,    68,    77,    56,    59,
-    40,    55,    78,    44,   272,    63,   250,   138,    84,    48,
-   245,   246,  -147,    58,    61,  -149,    41,    68,    77,    56,
-    59,  -150,    55,    41,   161,   217,    63,   278,    48,   210,
-   218,   258,    58,    61,   163,   241,    68,    41,    73,   210,
-   211,    55,    33,    34,    41,    63,    56,    59,   175,    48,
-    77,    56,    59,    58,    61,  -146,    41,    68,   210,   311,
-   152,   156,    55,    78,   152,   156,    63,  -148,    90,    84,
-  -145,    77,    56,    59,   176,   137,   177,    41,   280,  -163,
-    41,    48,   178,  -149,  -147,    58,    61,    91,   286,    68,
-   184,  -147,   132,   130,    55,   196,   298,   299,    63,   186,
-   302,   189,    48,    77,    56,    59,    58,    61,   105,    41,
-    68,   189,  -145,  -148,   189,    55,  -150,   280,   314,    63,
-    99,  -147,  -145,    73,    77,    56,    59,  -148,  -146,  -150,
-    41,   316,   190,  -146,    48,    97,   130,    47,    58,    61,
-   322,  -198,    68,    37,   196,   187,   192,    55,    78,   nil,
-   nil,    63,   nil,   nil,    84,    48,    77,    56,    59,    58,
-    61,   nil,    41,    68,   nil,   nil,   nil,   nil,    55,   nil,
-   nil,   nil,    63,   nil,   nil,   nil,    73,    77,    56,    59,
-   nil,   nil,   nil,    41,   nil,   nil,   nil,    48,   nil,   nil,
-   nil,    58,    61,   nil,   nil,    68,   nil,    73,   nil,   nil,
-    55,    78,   nil,   nil,    63,   nil,   nil,    84,    48,    77,
-    56,    59,    58,    61,   nil,    41,    68,   nil,   nil,   nil,
-   nil,    55,    78,   nil,   nil,    63,   nil,   nil,    84,    73,
-    77,    56,    59,   nil,   nil,   nil,    41,   nil,   nil,   nil,
-    48,   nil,   nil,   nil,    58,    61,   nil,   nil,    68,   nil,
-    73,   nil,   nil,    55,    78,   nil,   nil,    63,   nil,   nil,
-    84,    48,    77,    56,    59,    58,    61,   nil,    41,    68,
-   nil,   nil,   nil,   nil,    55,    78,   nil,   nil,    63,   nil,
-   nil,    84,   nil,    77,    56,    59,   nil,   nil,   nil,    41,
-   nil,   nil,   nil,    48,   nil,   nil,   nil,    58,   113,   nil,
-   nil,    68,   nil,    73,   nil,   nil,   111,   nil,   nil,   nil,
-    63,   nil,   155,   nil,    48,   nil,   nil,   nil,    58,    61,
-   146,    41,    68,    77,    56,    59,   141,    55,    78,   nil,
-   nil,    63,   nil,   nil,    84,   nil,   nil,    77,    56,    59,
-   nil,   nil,    41,   nil,    77,    56,    59,   nil,   158,   159,
-   160,   144,   145,   147,    48,   152,   156,   nil,    58,    61,
-   nil,   nil,    68,   nil,    73,   nil,   nil,    55,    48,   155,
-   nil,    63,    58,    61,   nil,    48,    68,   146,   nil,    58,
-    61,    55,    41,    68,   nil,    63,   nil,   nil,    55,    78,
-   nil,   nil,    63,   nil,   nil,    84,    41,    77,    56,    59,
-    56,    59,   nil,    41,   nil,   158,   159,   160,   144,   145,
-   147,   nil,   152,   156,   nil,   nil,   nil,    73,    77,    56,
-    59,   nil,   nil,   nil,    77,    56,    59,   nil,    48,   nil,
-    48,   nil,    58,    61,    58,   201,    68,   nil,    68,   nil,
-   nil,    55,    78,   111,    73,    63,   nil,    63,    84,    48,
-    77,    56,    59,    58,    61,    48,    41,    68,    41,    58,
-    61,   nil,    55,    68,   nil,   nil,    63,   nil,    55,    78,
-    73,   nil,    63,   nil,   nil,    84,   nil,    41,   nil,   155,
-   nil,    48,   nil,    41,   nil,    58,    61,   146,   nil,    68,
-    77,    56,    59,   nil,    55,    78,   nil,   nil,    63,   nil,
-   nil,    84,   nil,   nil,   nil,   nil,   nil,   nil,   nil,    41,
-    73,    77,    56,    59,   nil,   158,   159,   160,   144,   145,
-   147,    48,   152,   156,   nil,    58,    61,   nil,   nil,    68,
-   nil,    73,   nil,   nil,    55,    78,   nil,   nil,    63,   nil,
-   nil,    84,    48,    77,    56,    59,    58,    61,   nil,    41,
-    68,   nil,   nil,   nil,   nil,    55,    78,   nil,   nil,    63,
-   nil,   nil,    84,    73,    77,    56,    59,   nil,   nil,   nil,
-    41,   nil,   nil,   nil,    48,   nil,   nil,   nil,    58,    61,
-   nil,   nil,    68,   nil,    73,   nil,   nil,    55,    78,   nil,
-   nil,    63,   nil,   nil,    84,    48,    77,    56,    59,    58,
-    61,   nil,    41,    68,   nil,   nil,   nil,   nil,    55,    78,
-   nil,   nil,    63,   nil,   nil,    84,    73,   nil,    56,    59,
-   nil,   nil,   nil,    41,    56,    59,   nil,    48,   nil,   nil,
-   nil,    58,    61,   nil,   nil,    68,   nil,   nil,   133,   nil,
-    55,    78,   nil,   nil,    63,   nil,   nil,    84,    48,    56,
-    59,   nil,    58,    61,    48,    41,    68,   nil,    58,   201,
-    52,    55,    68,    56,    59,    63,   nil,   111,   nil,   275,
-   nil,    63,   nil,   nil,   nil,   nil,    41,   nil,   nil,    48,
-   nil,   nil,    41,    58,    61,    56,    59,    68,   nil,   nil,
-   nil,    52,    55,    48,   nil,   nil,    63,    58,   201,    56,
-    59,    68,   nil,   nil,   nil,   214,   111,    41,   nil,   nil,
-    63,   nil,   nil,   nil,   nil,    48,   nil,    56,    59,    58,
-    61,    41,   nil,    68,   nil,   nil,   nil,    52,    55,    48,
-   nil,   nil,    63,    58,   201,    56,    59,    68,   203,   nil,
-   nil,   nil,   111,    41,   nil,   nil,    63,    48,   nil,    56,
-    59,    58,    61,   nil,   nil,    68,   nil,    41,   nil,    52,
-    55,   nil,   nil,   nil,    63,    48,   nil,    56,    59,    58,
-   201,   282,   nil,    68,   nil,    41,   nil,   nil,   111,    48,
-   nil,   nil,    63,    58,   201,   nil,   nil,    68,   nil,   nil,
-   nil,   nil,   111,    41,   nil,   nil,    63,    48,   nil,   157,
-   nil,    58,   201,   nil,   nil,    68,   nil,    41,   150,   155,
-   111,   nil,   nil,   nil,    63,   nil,   nil,   146,   148,   151,
-   154,   150,   155,   nil,   nil,    41,   nil,   nil,   nil,   nil,
-   146,   148,   151,   154,   nil,   nil,   158,   159,   160,   144,
-   nil,   149,   153,   152,   156,   158,   159,   160,   144,   145,
-   147,   nil,   152,   156,   nil,   nil,   nil,   nil,   158,   159,
-   160,   144,   145,   147,   nil,   152,   156,   150,   155,   nil,
-   nil,   nil,   nil,   nil,   nil,   nil,   146,   148,   151,   154,
-   150,   155,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   146,
-   148,   151,   154,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
-   149,   153,   nil,   nil,   158,   159,   160,   144,   145,   147,
-   nil,   152,   156,   149,   153,   nil,   nil,   158,   159,   160,
-   144,   145,   147,   nil,   152,   156,   150,   155,   nil,   nil,
-   nil,   nil,   nil,   nil,   216,   146,   148,   151,   154,   150,
-   155,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   146,   148,
-   151,   154,   nil,   155,   nil,   nil,   nil,   nil,   nil,   149,
-   153,   146,   nil,   158,   159,   160,   144,   145,   147,   nil,
-   152,   156,   nil,   153,   nil,   nil,   158,   159,   160,   144,
-   145,   147,   281,   152,   156,   nil,   nil,   nil,   nil,   158,
-   159,   160,   144,   145,   147,   nil,   152,   156,   nil,   nil,
-   nil,   303,   nil,    18,   nil,    23,    26,   nil,     1,     5,
-   nil,    12,   nil,    16,   nil,    20,   nil,    27,   nil,   nil,
-     4,     8,    18,   305,    23,    26,   nil,     1,     5,   nil,
-    12,   nil,    16,   nil,    20,   nil,    27,   nil,   nil,     4,
-     8,   nil,   307,   nil,    18,   nil,    23,    26,   nil,     1,
-     5,   nil,    12,   nil,    16,   nil,    20,   nil,    27,   nil,
-   nil,     4,     8,    18,   320,    23,    26,   nil,     1,     5,
-   nil,    12,   nil,    16,   nil,    20,   nil,    27,   nil,   nil,
-     4,     8,   nil,   259,   nil,    18,   nil,    23,    26,   nil,
-     1,     5,   nil,    12,   nil,    16,   nil,    20,   nil,    27,
-   nil,   nil,     4,     8,    18,   232,    23,    26,   nil,     1,
-     5,   nil,    12,   nil,    16,   nil,    20,   nil,    27,   nil,
-   nil,     4,     8,   nil,   323,   nil,    18,   nil,    23,    26,
-   nil,     1,     5,   nil,    12,   nil,    16,   nil,    20,   nil,
-    27,   nil,   nil,     4,     8,    18,   325,    23,    26,   nil,
-     1,     5,   nil,    12,   nil,    16,   nil,    20,   nil,    27,
-   nil,   nil,     4,     8,   nil,   327,   nil,    18,   nil,    23,
-    26,   nil,     1,     5,   nil,    12,   nil,    16,   nil,    20,
-   nil,    27,   nil,   nil,     4,     8,    18,   267,    23,    26,
-   nil,     1,     5,   nil,    12,   nil,    16,   nil,    20,   nil,
-    27,   nil,   nil,     4,     8,   nil,   328,   nil,    18,   nil,
-    23,    26,   nil,     1,     5,   nil,    12,   nil,    16,   nil,
-    20,   nil,    27,   nil,   nil,     4,     8,    18,   nil,    23,
-    26,   nil,     1,     5,   nil,    12,   nil,    16,   nil,    20,
-   nil,    27,   nil,   nil,     4,     8,    18,   nil,    23,    26,
-   nil,     1,     5,   nil,    12,   nil,    16,   nil,    20,   nil,
-    27,   nil,   nil,     4,     8,    18,   nil,    23,    26,   nil,
-     1,     5,   nil,    12,   nil,    16,   nil,    20,   nil,    27,
-   nil,   nil,     4,     8,   158,   159,   160,   144,   145,   147,
-   nil,   152,   156,   158,   159,   160,   144,   145,   147,   nil,
-   152,   156 ]
+    79,    57,    60,    57,    60,   270,    79,    57,    60,   144,
+    84,    39,    40,   327,   206,   115,    79,    57,    60,   309,
+    84,    98,   299,    39,    40,    99,   326,   308,   168,   169,
+   215,    48,   306,   268,   269,    59,   123,    48,   100,    67,
+   113,    59,    62,   214,   121,    67,    41,    48,    64,    43,
+    55,    59,    62,    54,    64,    67,   210,   314,    41,    42,
+    55,    43,   101,   170,    64,    42,    79,    57,    60,    42,
+    84,   274,   272,   145,   183,    42,   278,  -150,    39,    40,
+   271,    42,   268,   269,   183,   182,    75,    79,    57,    60,
+   187,    84,   168,   169,   178,   182,   173,    48,   274,   206,
+   187,    59,    62,   278,   183,    67,    79,    57,    60,   177,
+    55,    82,   145,    41,    64,   182,    43,    89,    48,   284,
+   187,   255,    59,    62,   256,    42,    67,   170,    79,    57,
+    60,    55,    84,   183,   176,    64,    42,    48,    54,    57,
+    60,    59,   220,  -153,   182,    67,    42,   225,    36,   187,
+   121,   227,   228,    36,    64,     4,     8,   287,    50,    48,
+     4,   180,   159,    59,    62,    42,   180,    67,    36,    48,
+   150,   199,    55,    59,    62,     4,    64,    67,    36,   253,
+  -154,    51,    55,   227,   254,     4,    64,    42,    79,    57,
+    60,   273,    84,   156,   160,   268,   269,    42,   162,   163,
+   164,   148,   149,   151,   291,   156,   160,   136,    75,    79,
+    57,    60,   293,    84,  -155,   164,   148,    57,    60,    48,
+   156,   160,   159,    59,    62,   156,   160,    67,    33,    34,
+   150,   295,    55,    82,   227,   337,    64,   164,   148,    89,
+    48,   145,   156,   160,    59,    62,  -150,    42,    67,  -152,
+    79,    57,    60,    55,    84,    99,   300,    64,   162,   163,
+   164,   148,   149,   151,   194,   156,   160,   200,    42,   180,
+    75,    79,    57,    60,   203,    84,   162,   163,   164,   148,
+  -149,    48,  -151,   156,   160,    59,    62,  -153,   264,    67,
+  -154,    75,   227,   228,    55,    82,   146,  -150,    64,  -151,
+   301,    89,    48,    98,    42,   205,    59,    62,   193,    42,
+    67,   304,   159,  -152,  -149,    55,    82,  -149,   144,    64,
+   150,   212,    89,    79,    57,    60,   313,    84,  -167,   208,
+    42,   141,  -151,    79,    57,    60,   324,    84,   325,    79,
+    57,    60,  -152,    84,   328,   138,   136,   110,   162,   163,
+   164,   148,   149,   151,    48,   156,   160,   208,    59,    62,
+   279,   208,    67,   338,    48,   301,   340,    55,    59,    62,
+    48,    64,    67,   104,    59,    62,   342,    55,    67,  -151,
+  -149,    64,    42,    55,    79,    57,    60,    64,    84,  -152,
+  -150,  -154,    42,   162,   163,   164,   148,   209,    42,   206,
+   156,   160,   102,   136,    75,    79,    57,    60,    47,    84,
+   348,  -202,    46,   212,   257,    48,    42,   nil,   159,    59,
+    62,   nil,   nil,    67,   nil,   nil,   150,   nil,    55,    82,
+   nil,   nil,    64,   nil,   nil,    89,    48,   nil,   nil,   nil,
+    59,    62,   nil,    42,    67,   nil,    79,    57,    60,    55,
+    84,   nil,   nil,    64,   162,   163,   164,   148,   149,   151,
+   nil,   156,   160,   nil,    42,   nil,    75,    79,    57,    60,
+   nil,    84,   nil,   nil,   nil,   nil,   nil,    48,   nil,   nil,
+   nil,    59,    62,   nil,   nil,    67,   nil,    75,   nil,   nil,
+    55,    82,   nil,   nil,    64,   nil,   nil,    89,    48,   nil,
+   nil,   nil,    59,    62,   nil,    42,    67,   nil,   nil,   nil,
+   nil,    55,    82,   nil,   nil,    64,   nil,   nil,    89,    79,
+    57,    60,   nil,    84,   nil,   nil,    42,   162,   163,   164,
+   148,   149,   151,   nil,   156,   160,   nil,   nil,   nil,    75,
+    79,    57,    60,   nil,    84,   nil,   nil,   nil,   nil,   nil,
+    48,   nil,   nil,   nil,    59,    62,   nil,   nil,    67,   nil,
+    75,   nil,   nil,    55,    82,   nil,   nil,    64,   nil,   nil,
+    89,    48,   nil,   nil,   nil,    59,    62,   nil,    42,    67,
+   nil,   nil,   nil,   nil,    55,    82,   nil,   nil,    64,   nil,
+   nil,    89,    79,    57,    60,   nil,    84,   nil,   nil,    42,
+   162,   163,   164,   148,   149,   151,   nil,   156,   160,   nil,
+   nil,   nil,    75,    79,    57,    60,   nil,    84,   nil,   nil,
+   nil,   nil,   nil,    48,   nil,   nil,   nil,    59,    62,   nil,
+   nil,    67,   nil,    75,   nil,   nil,    55,    82,   nil,   nil,
+    64,   nil,   nil,    89,    48,   nil,   nil,   nil,    59,    62,
+   nil,    42,    67,   nil,   nil,   nil,   nil,    55,    82,   nil,
+   nil,    64,   nil,   nil,    89,    79,    57,    60,   nil,    84,
+   nil,   nil,    42,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,    75,    79,    57,    60,   165,
+    84,   nil,   nil,   nil,   nil,   nil,    48,   nil,   nil,   nil,
+    59,    62,   nil,   nil,    67,   nil,   nil,   nil,   nil,    55,
+    82,   nil,   nil,    64,   nil,   nil,    89,    48,   nil,   nil,
+   nil,    59,    62,   nil,    42,    67,   nil,    79,    57,    60,
+    55,    84,   nil,   nil,    64,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,    42,   nil,    75,    79,    57,
+    60,   nil,    84,   nil,   nil,   nil,   nil,   nil,    48,   nil,
+   nil,   nil,    59,    62,   nil,   nil,    67,   nil,   nil,   nil,
+   nil,    55,    82,   nil,   nil,    64,   nil,   nil,    89,    48,
+   nil,   nil,   nil,    59,    62,   nil,    42,    67,   nil,    79,
+    57,    60,    55,    84,   nil,   nil,    64,   nil,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,    42,   nil,    75,
+    79,    57,    60,   nil,    84,   nil,   nil,   nil,   nil,   nil,
+    48,   nil,   nil,   nil,    59,    62,   nil,   nil,    67,   nil,
+    75,   nil,   nil,    55,    82,   nil,   nil,    64,   nil,   nil,
+    89,    48,   nil,   nil,   nil,    59,    62,   nil,    42,    67,
+   nil,   nil,   nil,   nil,    55,    82,   nil,   nil,    64,   nil,
+   nil,    89,    79,    57,    60,   nil,    84,   nil,   nil,    42,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,    75,    79,    57,    60,   nil,    84,   nil,   nil,
+   nil,   nil,   nil,    48,   nil,   nil,   nil,    59,    62,   nil,
+   nil,    67,   nil,   nil,   nil,   nil,    55,    82,   nil,   nil,
+    64,   nil,   nil,    89,    48,   nil,   nil,   nil,    59,    62,
+   nil,    42,    67,   nil,    79,    57,    60,    55,    84,   nil,
+   nil,    64,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,    42,   nil,    75,    79,    57,    60,   nil,    84,
+   nil,   nil,   nil,   nil,   nil,    48,   nil,   nil,   nil,    59,
+    62,   nil,   nil,    67,   nil,    75,   nil,   nil,    55,    82,
+   nil,   nil,    64,   nil,   nil,    89,    48,   nil,   nil,   nil,
+    59,    62,   nil,    42,    67,   nil,   nil,   nil,   nil,    55,
+    82,   nil,   nil,    64,   nil,   nil,    89,    79,    57,    60,
+   nil,    84,   nil,   nil,    42,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,    75,    79,    57,
+    60,   nil,    84,   nil,   nil,   nil,   nil,   nil,    48,   nil,
+   nil,   nil,    59,    62,   nil,   nil,    67,   nil,    75,   nil,
+   nil,    55,    82,   nil,   nil,    64,    57,    60,    89,    48,
+   311,   nil,   nil,    59,    62,   nil,    42,    67,   nil,   nil,
+   nil,   nil,    55,    82,   nil,   nil,    64,   nil,   nil,    89,
+    79,    57,    60,   nil,    84,   nil,   182,    42,    57,    60,
+    59,   220,   nil,   nil,    67,   nil,   nil,   nil,   nil,   121,
+   nil,   nil,   nil,    64,   nil,   nil,    57,    60,   231,   nil,
+   nil,    48,   nil,   nil,    42,    59,    62,   nil,    48,    67,
+   nil,   nil,    59,    62,    55,   nil,    67,   nil,    64,   nil,
+    51,    55,    57,    60,   nil,    64,   182,   nil,   nil,    42,
+    59,   220,    57,    60,    67,   nil,    42,   nil,   nil,   121,
+   nil,   nil,   139,    64,   nil,   nil,   nil,   nil,    57,    60,
+   nil,   nil,    48,   nil,    42,   nil,    59,    62,    57,    60,
+    67,   nil,   182,   nil,    51,    55,    59,   220,   nil,    64,
+    67,   nil,   nil,   nil,   nil,   121,   nil,   nil,   182,    64,
+    42,   nil,    59,   220,    57,    60,    67,   nil,   182,   nil,
+    42,   121,    59,   220,   nil,    64,    67,   nil,   nil,   nil,
+   nil,   121,   nil,    57,    60,    64,    42,   nil,   nil,    57,
+    60,   nil,   222,   nil,   182,   nil,    42,   nil,    59,   220,
+   nil,   nil,    67,   294,   nil,    57,    60,   121,   nil,   nil,
+   nil,    64,   nil,    48,   nil,    57,    60,    59,    62,   182,
+   nil,    67,    42,    59,   220,    51,    55,    67,   nil,   nil,
+    64,   nil,   121,   nil,   nil,   182,    64,   nil,   nil,    59,
+   220,    42,   nil,    67,   nil,    48,   161,    42,   121,    59,
+    62,   nil,    64,    67,   nil,   154,   159,    51,    55,   nil,
+   nil,   nil,    64,    42,   150,   152,   155,   158,   154,   159,
+   nil,   nil,   nil,    42,   nil,   nil,   nil,   150,   152,   155,
+   158,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   153,   157,
+   nil,   nil,   162,   163,   164,   148,   149,   151,   nil,   156,
+   160,   153,   157,   nil,   nil,   162,   163,   164,   148,   149,
+   151,   nil,   156,   160,   154,   159,   nil,   nil,   nil,   nil,
+   nil,   nil,   234,   150,   152,   155,   158,   154,   159,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   150,   152,   155,   158,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   153,   157,   nil,
+   nil,   162,   163,   164,   148,   149,   151,   nil,   156,   160,
+   153,   157,   nil,   nil,   162,   163,   164,   148,   149,   151,
+   nil,   156,   160,   154,   159,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,   150,   152,   155,   158,   154,   159,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   150,   152,   155,   158,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
+   162,   163,   164,   148,   149,   151,   349,   156,   160,   nil,
+   157,   nil,   nil,   162,   163,   164,   148,   149,   151,   nil,
+   156,   160,   nil,   nil,   nil,   353,   nil,    18,   nil,    22,
+    26,   nil,     1,     5,   nil,    11,   nil,    16,   nil,    20,
+   nil,    27,   nil,   nil,     4,     8,    18,   303,    22,    26,
+   nil,     1,     5,   nil,    11,   nil,    16,   nil,    20,   nil,
+    27,   nil,   nil,     4,     8,   nil,   248,   nil,    18,   nil,
+    22,    26,   nil,     1,     5,   nil,    11,   nil,    16,   nil,
+    20,   nil,    27,   nil,   nil,     4,     8,    18,   280,    22,
+    26,   nil,     1,     5,   nil,    11,   nil,    16,   nil,    20,
+   nil,    27,   nil,   nil,     4,     8,   nil,   351,   nil,    18,
+   nil,    22,    26,   nil,     1,     5,   nil,    11,   nil,    16,
+   nil,    20,   nil,    27,   nil,   nil,     4,     8,    18,   329,
+    22,    26,   nil,     1,     5,   nil,    11,   nil,    16,   nil,
+    20,   nil,    27,   nil,   nil,     4,     8,   nil,   331,   nil,
+    18,   nil,    22,    26,   nil,     1,     5,   nil,    11,   nil,
+    16,   nil,    20,   nil,    27,   nil,   nil,     4,     8,    18,
+   346,    22,    26,   nil,     1,     5,   nil,    11,   nil,    16,
+   nil,    20,   nil,    27,   nil,   nil,     4,     8,   nil,   332,
+   nil,    18,   nil,    22,    26,   nil,     1,     5,   nil,    11,
+   nil,    16,   nil,    20,   nil,    27,   nil,   nil,     4,     8,
+    18,   282,    22,    26,   nil,     1,     5,   nil,    11,   nil,
+    16,   nil,    20,   nil,    27,   nil,   nil,     4,     8,   nil,
+   354,   nil,    18,   nil,    22,    26,   nil,     1,     5,   nil,
+    11,   nil,    16,   nil,    20,   nil,    27,   nil,   nil,     4,
+     8,    18,   nil,    22,    26,   nil,     1,     5,   nil,    11,
+   nil,    16,   nil,    20,   nil,    27,   nil,   nil,     4,     8,
+    18,   nil,    22,    26,   nil,     1,     5,   nil,    11,   nil,
+    16,   nil,    20,   nil,    27,   nil,   nil,     4,     8,    18,
+   nil,    22,    26,   nil,     1,     5,   nil,    11,   nil,    16,
+   nil,    20,   nil,    27,   nil,   nil,     4,     8 ]
 
 racc_action_check = [
-   155,   155,   155,   248,   248,    61,   240,   130,    93,    43,
-   222,   222,   222,   222,   240,   176,   176,   222,   222,    93,
-   155,    90,    90,    90,    93,    61,    21,    84,    84,    84,
-    21,   155,   169,   248,    43,   155,   155,   248,   248,   155,
-   169,   248,   280,    21,   155,   155,   248,    84,   155,   130,
-   248,   155,    90,   186,   186,   186,    90,    90,    84,   155,
-    90,   248,    84,    84,   113,    90,    84,    21,   185,    90,
-   166,    84,    84,    12,    12,    84,    83,   113,    84,    82,
-    90,   243,   123,   123,   186,   178,    84,   255,   186,   186,
-   178,   188,   186,   187,   187,   187,   215,   186,   166,   166,
-   255,   186,    92,   159,   159,   159,   243,   243,    12,   215,
-   301,    12,   186,    92,    28,   301,   189,   123,    92,   244,
-   123,    28,    28,   159,   187,    16,    16,    16,   187,   187,
-   244,    12,   187,   165,   159,   244,     5,   187,   159,   159,
-   123,   187,   159,     5,   165,    16,    26,   159,   159,   165,
-   134,   159,   187,    26,   159,   190,    16,    18,    18,    18,
-    16,    16,   159,   134,    16,   126,   126,   105,    16,    16,
-   105,   136,    81,    16,   105,   136,   136,    18,    20,    20,
-    20,   234,   234,    80,    16,   195,   234,   234,    18,   235,
-   235,   196,    18,    18,   235,   235,    18,   194,   194,   194,
-   126,    18,    18,   126,   197,    18,   174,   201,    18,    20,
-   174,   174,    76,    20,    20,    72,    18,    20,   144,   144,
-   144,    71,    20,   126,    89,   140,    20,   218,   194,   140,
-   140,   179,   194,   194,    91,   162,   194,    20,   144,   162,
-   162,   194,     1,     1,   156,   194,    23,    23,    94,   144,
-   302,   302,   302,   144,   144,    70,   194,   144,   274,   274,
-   236,   236,   144,   144,   219,   219,   144,    67,    66,   144,
-    64,   298,   298,   298,    96,    57,    97,   144,   232,    55,
-   152,   302,    98,    88,    53,   302,   302,   101,   242,   302,
-   106,   110,    49,    47,   302,   251,   253,   254,   302,   112,
-   257,   114,   298,    78,    78,    78,   298,   298,    35,   302,
-   298,   266,   115,   117,   164,   298,    86,   281,   284,   298,
-    27,   290,   292,    78,   272,   272,   272,   293,   294,   295,
-   298,   297,   118,   119,    78,    25,   175,    15,    78,    78,
-   310,   311,    78,     9,   131,   163,   124,    78,    78,   nil,
-   nil,    78,   nil,   nil,    78,   272,   145,   145,   145,   272,
-   272,   nil,    78,   272,   nil,   nil,   nil,   nil,   272,   nil,
-   nil,   nil,   272,   nil,   nil,   nil,   145,    33,    33,    33,
-   nil,   nil,   nil,   272,   nil,   nil,   nil,   145,   nil,   nil,
-   nil,   145,   145,   nil,   nil,   145,   nil,    33,   nil,   nil,
-   145,   145,   nil,   nil,   145,   nil,   nil,   145,    33,    34,
-    34,    34,    33,    33,   nil,   145,    33,   nil,   nil,   nil,
-   nil,    33,    33,   nil,   nil,    33,   nil,   nil,    33,    34,
-   146,   146,   146,   nil,   nil,   nil,    33,   nil,   nil,   nil,
-    34,   nil,   nil,   nil,    34,    34,   nil,   nil,    34,   nil,
-   146,   nil,   nil,    34,    34,   nil,   nil,    34,   nil,   nil,
-    34,   146,    37,    37,    37,   146,   146,   nil,    34,   146,
-   nil,   nil,   nil,   nil,   146,   146,   nil,   nil,   146,   nil,
-   nil,   146,   nil,   147,   147,   147,   nil,   nil,   nil,   146,
-   nil,   nil,   nil,    37,   nil,   nil,   nil,    37,    37,   nil,
-   nil,    37,   nil,   147,   nil,   nil,    37,   nil,   nil,   nil,
-    37,   nil,   223,   nil,   147,   nil,   nil,   nil,   147,   147,
-   223,    37,   147,    77,    77,    77,    77,   147,   147,   nil,
-   nil,   147,   nil,   nil,   147,   nil,   nil,   209,   209,   209,
-   nil,   nil,   147,   nil,    73,    73,    73,   nil,   223,   223,
-   223,   223,   223,   223,    77,   223,   223,   nil,    77,    77,
-   nil,   nil,    77,   nil,    73,   nil,   nil,    77,   209,   226,
-   nil,    77,   209,   209,   nil,    73,   209,   226,   nil,    73,
-    73,   209,    77,    73,   nil,   209,   nil,   nil,    73,    73,
-   nil,   nil,    73,   nil,   nil,    73,   209,   158,   158,   158,
-   203,   203,   nil,    73,   nil,   226,   226,   226,   226,   226,
-   226,   nil,   226,   226,   nil,   nil,   nil,   158,    54,    54,
-    54,   nil,   nil,   nil,   148,   148,   148,   nil,   158,   nil,
-   203,   nil,   158,   158,   203,   203,   158,   nil,   203,   nil,
-   nil,   158,   158,   203,   148,   158,   nil,   203,   158,    54,
-   149,   149,   149,    54,    54,   148,   158,    54,   203,   148,
-   148,   nil,    54,   148,   nil,   nil,    54,   nil,   148,   148,
-   149,   nil,   148,   nil,   nil,   148,   nil,    54,   nil,   229,
-   nil,   149,   nil,   148,   nil,   149,   149,   229,   nil,   149,
-   150,   150,   150,   nil,   149,   149,   nil,   nil,   149,   nil,
-   nil,   149,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   149,
-   150,   151,   151,   151,   nil,   229,   229,   229,   229,   229,
-   229,   150,   229,   229,   nil,   150,   150,   nil,   nil,   150,
-   nil,   151,   nil,   nil,   150,   150,   nil,   nil,   150,   nil,
-   nil,   150,   151,   153,   153,   153,   151,   151,   nil,   150,
-   151,   nil,   nil,   nil,   nil,   151,   151,   nil,   nil,   151,
-   nil,   nil,   151,   153,   154,   154,   154,   nil,   nil,   nil,
-   151,   nil,   nil,   nil,   153,   nil,   nil,   nil,   153,   153,
-   nil,   nil,   153,   nil,   154,   nil,   nil,   153,   153,   nil,
-   nil,   153,   nil,   nil,   153,   154,   160,   160,   160,   154,
-   154,   nil,   153,   154,   nil,   nil,   nil,   nil,   154,   154,
-   nil,   nil,   154,   nil,   nil,   154,   160,   nil,    51,    51,
-   nil,   nil,   nil,   154,   249,   249,   nil,   160,   nil,   nil,
-   nil,   160,   160,   nil,   nil,   160,   nil,   nil,    51,   nil,
-   160,   160,   nil,   nil,   160,   nil,   nil,   160,    51,   207,
-   207,   nil,    51,    51,   249,   160,    51,   nil,   249,   249,
-    51,    51,   249,   285,   285,    51,   nil,   249,   nil,   207,
-   nil,   249,   nil,   nil,   nil,   nil,    51,   nil,   nil,   207,
-   nil,   nil,   249,   207,   207,   138,   138,   207,   nil,   nil,
-   nil,   207,   207,   285,   nil,   nil,   207,   285,   285,   309,
-   309,   285,   nil,   nil,   nil,   138,   285,   207,   nil,   nil,
-   285,   nil,   nil,   nil,   nil,   138,   nil,   137,   137,   138,
-   138,   285,   nil,   138,   nil,   nil,   nil,   138,   138,   309,
-   nil,   nil,   138,   309,   309,   132,   132,   309,   132,   nil,
-   nil,   nil,   309,   138,   nil,   nil,   309,   137,   nil,   161,
-   161,   137,   137,   nil,   nil,   137,   nil,   309,   nil,   137,
-   137,   nil,   nil,   nil,   137,   132,   nil,   238,   238,   132,
-   132,   238,   nil,   132,   nil,   137,   nil,   nil,   132,   161,
-   nil,   nil,   132,   161,   161,   nil,   nil,   161,   nil,   nil,
-   nil,   nil,   161,   132,   nil,   nil,   161,   238,   nil,    87,
-   nil,   238,   238,   nil,   nil,   238,   nil,   161,    87,    87,
-   238,   nil,   nil,   nil,   238,   nil,   nil,    87,    87,    87,
-    87,   228,   228,   nil,   nil,   238,   nil,   nil,   nil,   nil,
-   228,   228,   228,   228,   nil,   nil,   220,   220,   220,   220,
-   nil,    87,    87,   220,   220,    87,    87,    87,    87,    87,
-    87,   nil,    87,    87,   nil,   nil,   nil,   nil,   228,   228,
-   228,   228,   228,   228,   nil,   228,   228,   103,   103,   nil,
-   nil,   nil,   nil,   nil,   nil,   nil,   103,   103,   103,   103,
-   104,   104,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   104,
-   104,   104,   104,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
-   103,   103,   nil,   nil,   103,   103,   103,   103,   103,   103,
-   nil,   103,   103,   104,   104,   nil,   nil,   104,   104,   104,
-   104,   104,   104,   nil,   104,   104,   139,   139,   nil,   nil,
-   nil,   nil,   nil,   nil,   139,   139,   139,   139,   139,   224,
-   224,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   224,   224,
-   224,   224,   nil,   225,   nil,   nil,   nil,   nil,   nil,   139,
-   139,   225,   nil,   139,   139,   139,   139,   139,   139,   nil,
-   139,   139,   nil,   224,   nil,   nil,   224,   224,   224,   224,
-   224,   224,   233,   224,   224,   nil,   nil,   nil,   nil,   225,
-   225,   225,   225,   225,   225,   nil,   225,   225,   nil,   nil,
-   nil,   258,   nil,   233,   nil,   233,   233,   nil,   233,   233,
-   nil,   233,   nil,   233,   nil,   233,   nil,   233,   nil,   nil,
-   233,   233,   258,   260,   258,   258,   nil,   258,   258,   nil,
-   258,   nil,   258,   nil,   258,   nil,   258,   nil,   nil,   258,
-   258,   nil,   268,   nil,   260,   nil,   260,   260,   nil,   260,
-   260,   nil,   260,   nil,   260,   nil,   260,   nil,   260,   nil,
-   nil,   260,   260,   268,   304,   268,   268,   nil,   268,   268,
-   nil,   268,   nil,   268,   nil,   268,   nil,   268,   nil,   nil,
-   268,   268,   nil,   184,   nil,   304,   nil,   304,   304,   nil,
-   304,   304,   nil,   304,   nil,   304,   nil,   304,   nil,   304,
-   nil,   nil,   304,   304,   184,   157,   184,   184,   nil,   184,
-   184,   nil,   184,   nil,   184,   nil,   184,   nil,   184,   nil,
-   nil,   184,   184,   nil,   312,   nil,   157,   nil,   157,   157,
-   nil,   157,   157,   nil,   157,   nil,   157,   nil,   157,   nil,
-   157,   nil,   nil,   157,   157,   312,   314,   312,   312,   nil,
-   312,   312,   nil,   312,   nil,   312,   nil,   312,   nil,   312,
-   nil,   nil,   312,   312,   nil,   324,   nil,   314,   nil,   314,
-   314,   nil,   314,   314,   nil,   314,   nil,   314,   nil,   314,
-   nil,   314,   nil,   nil,   314,   314,   324,   192,   324,   324,
-   nil,   324,   324,   nil,   324,   nil,   324,   nil,   324,   nil,
-   324,   nil,   nil,   324,   324,   nil,   326,   nil,   192,   nil,
-   192,   192,   nil,   192,   192,   nil,   192,   nil,   192,   nil,
-   192,   nil,   192,   nil,   nil,   192,   192,   326,   nil,   326,
-   326,   nil,   326,   326,   nil,   326,   nil,   326,   nil,   326,
-   nil,   326,   nil,   nil,   326,   326,     0,   nil,     0,     0,
-   nil,     0,     0,   nil,     0,   nil,     0,   nil,     0,   nil,
-     0,   nil,   nil,     0,     0,    30,   nil,    30,    30,   nil,
-    30,    30,   nil,    30,   nil,    30,   nil,    30,   nil,    30,
-   nil,   nil,    30,    30,   230,   230,   230,   230,   230,   230,
-   nil,   230,   230,   221,   221,   221,   221,   221,   221,   nil,
-   221,   221 ]
+    46,    46,    46,    22,    22,   184,   146,   146,   146,   232,
+   146,   113,   113,   276,   136,    45,   210,   210,   210,   259,
+   210,    23,   232,   115,   115,    23,   276,   259,   256,   256,
+   140,    46,   256,   184,   184,    46,    46,   146,    23,    46,
+    45,   146,   146,   140,    46,   146,   113,   210,    46,   113,
+   146,   210,   210,    62,   146,   210,   136,   266,   115,    46,
+   210,   115,    23,   256,   210,   146,    89,    89,    89,   113,
+    89,   327,   188,    62,   100,   210,   327,   128,    11,    11,
+   188,   115,   266,   266,   267,   100,    89,   138,   138,   138,
+   100,   138,    84,    84,    97,   267,    84,    89,   194,   123,
+   267,    89,    89,   194,   101,    89,   205,   205,   205,    96,
+    89,    89,   123,    11,    89,   101,    11,    89,   138,   204,
+   101,   171,   138,   138,   171,    89,   138,    84,   226,   226,
+   226,   138,   226,   183,    94,   138,    11,   205,    16,    16,
+    16,   205,   205,    92,   183,   205,   138,   143,    30,   183,
+   205,   143,   143,     5,   205,    30,    30,   207,    16,   226,
+     5,   208,   245,   226,   226,   205,   209,   226,   110,    16,
+   245,   110,   226,    16,    16,   110,   226,    16,    26,   166,
+    91,    16,    16,   166,   166,    26,    16,   226,    18,    18,
+    18,   192,    18,   252,   252,   192,   192,    16,   245,   245,
+   245,   245,   245,   245,   211,   245,   245,   212,    18,    20,
+    20,    20,   213,    20,    90,   251,   251,   177,   177,    18,
+   251,   251,   241,    18,    18,   235,   235,    18,     1,     1,
+   241,   217,    18,    18,   297,   297,    18,   250,   250,    18,
+    20,   220,   250,   250,    20,    20,    88,    18,    20,    87,
+   148,   148,   148,    20,   148,   107,   233,    20,   241,   241,
+   241,   241,   241,   241,   103,   241,   241,   111,    20,    99,
+   148,   149,   149,   149,   116,   149,   238,   238,   238,   238,
+    85,   148,    78,   238,   238,   148,   148,    74,   179,   148,
+    73,   149,   179,   179,   148,   148,    70,    69,   148,   119,
+   248,   148,   149,    68,   156,   122,   149,   149,   102,   148,
+   149,   254,   239,    66,    65,   149,   149,   124,    58,   149,
+   239,   263,   149,   328,   328,   328,   265,   328,    55,   125,
+   149,    53,    52,   324,   324,   324,   274,   324,   275,    98,
+    98,    98,   126,    98,   278,    48,    47,    35,   239,   239,
+   239,   239,   239,   239,   328,   239,   239,   289,   328,   328,
+   195,   181,   328,   301,   324,   303,   308,   328,   324,   324,
+    98,   328,   324,    27,    98,    98,   312,   324,    98,   317,
+   318,   324,   328,    98,   150,   150,   150,    98,   150,   320,
+   321,   322,   324,   236,   236,   236,   236,   129,    98,   180,
+   236,   236,    25,   178,   150,   295,   295,   295,    15,   295,
+   336,   337,    12,   137,   174,   150,   160,   nil,   242,   150,
+   150,   nil,   nil,   150,   nil,   nil,   242,   nil,   150,   150,
+   nil,   nil,   150,   nil,   nil,   150,   295,   nil,   nil,   nil,
+   295,   295,   nil,   150,   295,   nil,    33,    33,    33,   295,
+    33,   nil,   nil,   295,   242,   242,   242,   242,   242,   242,
+   nil,   242,   242,   nil,   295,   nil,    33,    34,    34,    34,
+   nil,    34,   nil,   nil,   nil,   nil,   nil,    33,   nil,   nil,
+   nil,    33,    33,   nil,   nil,    33,   nil,    34,   nil,   nil,
+    33,    33,   nil,   nil,    33,   nil,   nil,    33,    34,   nil,
+   nil,   nil,    34,    34,   nil,    33,    34,   nil,   nil,   nil,
+   nil,    34,    34,   nil,   nil,    34,   nil,   nil,    34,   151,
+   151,   151,   nil,   151,   nil,   nil,    34,   246,   246,   246,
+   246,   246,   246,   nil,   246,   246,   nil,   nil,   nil,   151,
+   152,   152,   152,   nil,   152,   nil,   nil,   nil,   nil,   nil,
+   151,   nil,   nil,   nil,   151,   151,   nil,   nil,   151,   nil,
+   152,   nil,   nil,   151,   151,   nil,   nil,   151,   nil,   nil,
+   151,   152,   nil,   nil,   nil,   152,   152,   nil,   151,   152,
+   nil,   nil,   nil,   nil,   152,   152,   nil,   nil,   152,   nil,
+   nil,   152,   153,   153,   153,   nil,   153,   nil,   nil,   152,
+   237,   237,   237,   237,   237,   237,   nil,   237,   237,   nil,
+   nil,   nil,   153,   154,   154,   154,   nil,   154,   nil,   nil,
+   nil,   nil,   nil,   153,   nil,   nil,   nil,   153,   153,   nil,
+   nil,   153,   nil,   154,   nil,   nil,   153,   153,   nil,   nil,
+   153,   nil,   nil,   153,   154,   nil,   nil,   nil,   154,   154,
+   nil,   153,   154,   nil,   nil,   nil,   nil,   154,   154,   nil,
+   nil,   154,   nil,   nil,   154,    82,    82,    82,   nil,    82,
+   nil,   nil,   154,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,    82,    79,    79,    79,    79,
+    79,   nil,   nil,   nil,   nil,   nil,    82,   nil,   nil,   nil,
+    82,    82,   nil,   nil,    82,   nil,   nil,   nil,   nil,    82,
+    82,   nil,   nil,    82,   nil,   nil,    82,    79,   nil,   nil,
+   nil,    79,    79,   nil,    82,    79,   nil,   162,   162,   162,
+    79,   162,   nil,   nil,    79,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,    79,   nil,   162,    54,    54,
+    54,   nil,    54,   nil,   nil,   nil,   nil,   nil,   162,   nil,
+   nil,   nil,   162,   162,   nil,   nil,   162,   nil,   nil,   nil,
+   nil,   162,   162,   nil,   nil,   162,   nil,   nil,   162,    54,
+   nil,   nil,   nil,    54,    54,   nil,   162,    54,   nil,   155,
+   155,   155,    54,   155,   nil,   nil,    54,   nil,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,    54,   nil,   155,
+   164,   164,   164,   nil,   164,   nil,   nil,   nil,   nil,   nil,
+   155,   nil,   nil,   nil,   155,   155,   nil,   nil,   155,   nil,
+   164,   nil,   nil,   155,   155,   nil,   nil,   155,   nil,   nil,
+   155,   164,   nil,   nil,   nil,   164,   164,   nil,   155,   164,
+   nil,   nil,   nil,   nil,   164,   164,   nil,   nil,   164,   nil,
+   nil,   164,   157,   157,   157,   nil,   157,   nil,   nil,   164,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,   157,   257,   257,   257,   nil,   257,   nil,   nil,
+   nil,   nil,   nil,   157,   nil,   nil,   nil,   157,   157,   nil,
+   nil,   157,   nil,   nil,   nil,   nil,   157,   157,   nil,   nil,
+   157,   nil,   nil,   157,   257,   nil,   nil,   nil,   257,   257,
+   nil,   157,   257,   nil,   158,   158,   158,   257,   158,   nil,
+   nil,   257,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,   257,   nil,   158,   163,   163,   163,   nil,   163,
+   nil,   nil,   nil,   nil,   nil,   158,   nil,   nil,   nil,   158,
+   158,   nil,   nil,   158,   nil,   163,   nil,   nil,   158,   158,
+   nil,   nil,   158,   nil,   nil,   158,   163,   nil,   nil,   nil,
+   163,   163,   nil,   158,   163,   nil,   nil,   nil,   nil,   163,
+   163,   nil,   nil,   163,   nil,   nil,   163,    75,    75,    75,
+   nil,    75,   nil,   nil,   163,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,    75,   159,   159,
+   159,   nil,   159,   nil,   nil,   nil,   nil,   nil,    75,   nil,
+   nil,   nil,    75,    75,   nil,   nil,    75,   nil,   159,   nil,
+   nil,    75,    75,   nil,   nil,    75,   261,   261,    75,   159,
+   261,   nil,   nil,   159,   159,   nil,    75,   159,   nil,   nil,
+   nil,   nil,   159,   159,   nil,   nil,   159,   nil,   nil,   159,
+   206,   206,   206,   nil,   206,   nil,   261,   159,   145,   145,
+   261,   261,   nil,   nil,   261,   nil,   nil,   nil,   nil,   261,
+   nil,   nil,   nil,   261,   nil,   nil,   272,   272,   145,   nil,
+   nil,   206,   nil,   nil,   261,   206,   206,   nil,   145,   206,
+   nil,   nil,   145,   145,   206,   nil,   145,   nil,   206,   nil,
+   145,   145,    50,    50,   nil,   145,   272,   nil,   nil,   206,
+   272,   272,   176,   176,   272,   nil,   145,   nil,   nil,   272,
+   nil,   nil,    50,   272,   nil,   nil,   nil,   nil,   309,   309,
+   nil,   nil,    50,   nil,   272,   nil,    50,    50,   335,   335,
+    50,   nil,   176,   nil,    50,    50,   176,   176,   nil,    50,
+   176,   nil,   nil,   nil,   nil,   176,   nil,   nil,   309,   176,
+    50,   nil,   309,   309,   222,   222,   309,   nil,   335,   nil,
+   176,   309,   335,   335,   nil,   309,   335,   nil,   nil,   nil,
+   nil,   335,   nil,   215,   215,   335,   309,   nil,   nil,   141,
+   141,   nil,   141,   nil,   222,   nil,   335,   nil,   222,   222,
+   nil,   nil,   222,   215,   nil,   271,   271,   222,   nil,   nil,
+   nil,   222,   nil,   215,   nil,   144,   144,   215,   215,   141,
+   nil,   215,   222,   141,   141,   215,   215,   141,   nil,   nil,
+   215,   nil,   141,   nil,   nil,   271,   141,   nil,   nil,   271,
+   271,   215,   nil,   271,   nil,   144,    76,   141,   271,   144,
+   144,   nil,   271,   144,   nil,    76,    76,   144,   144,   nil,
+   nil,   nil,   144,   271,    76,    76,    76,    76,   109,   109,
+   nil,   nil,   nil,   144,   nil,   nil,   nil,   109,   109,   109,
+   109,   nil,   nil,   nil,   nil,   nil,   nil,   nil,    76,    76,
+   nil,   nil,    76,    76,    76,    76,    76,    76,   nil,    76,
+    76,   109,   109,   nil,   nil,   109,   109,   109,   109,   109,
+   109,   nil,   109,   109,   147,   147,   nil,   nil,   nil,   nil,
+   nil,   nil,   147,   147,   147,   147,   147,   108,   108,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   108,   108,   108,   108,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   147,   147,   nil,
+   nil,   147,   147,   147,   147,   147,   147,   nil,   147,   147,
+   108,   108,   nil,   nil,   108,   108,   108,   108,   108,   108,
+   nil,   108,   108,   244,   244,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,   244,   244,   244,   244,   240,   240,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   240,   240,   240,   240,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
+   244,   244,   244,   244,   244,   244,   338,   244,   244,   nil,
+   240,   nil,   nil,   240,   240,   240,   240,   240,   240,   nil,
+   240,   240,   nil,   nil,   nil,   350,   nil,   338,   nil,   338,
+   338,   nil,   338,   338,   nil,   338,   nil,   338,   nil,   338,
+   nil,   338,   nil,   nil,   338,   338,   350,   249,   350,   350,
+   nil,   350,   350,   nil,   350,   nil,   350,   nil,   350,   nil,
+   350,   nil,   nil,   350,   350,   nil,   161,   nil,   249,   nil,
+   249,   249,   nil,   249,   249,   nil,   249,   nil,   249,   nil,
+   249,   nil,   249,   nil,   nil,   249,   249,   161,   200,   161,
+   161,   nil,   161,   161,   nil,   161,   nil,   161,   nil,   161,
+   nil,   161,   nil,   nil,   161,   161,   nil,   340,   nil,   200,
+   nil,   200,   200,   nil,   200,   200,   nil,   200,   nil,   200,
+   nil,   200,   nil,   200,   nil,   nil,   200,   200,   340,   279,
+   340,   340,   nil,   340,   340,   nil,   340,   nil,   340,   nil,
+   340,   nil,   340,   nil,   nil,   340,   340,   nil,   281,   nil,
+   279,   nil,   279,   279,   nil,   279,   279,   nil,   279,   nil,
+   279,   nil,   279,   nil,   279,   nil,   nil,   279,   279,   281,
+   330,   281,   281,   nil,   281,   281,   nil,   281,   nil,   281,
+   nil,   281,   nil,   281,   nil,   nil,   281,   281,   nil,   283,
+   nil,   330,   nil,   330,   330,   nil,   330,   330,   nil,   330,
+   nil,   330,   nil,   330,   nil,   330,   nil,   nil,   330,   330,
+   283,   203,   283,   283,   nil,   283,   283,   nil,   283,   nil,
+   283,   nil,   283,   nil,   283,   nil,   nil,   283,   283,   nil,
+   352,   nil,   203,   nil,   203,   203,   nil,   203,   203,   nil,
+   203,   nil,   203,   nil,   203,   nil,   203,   nil,   nil,   203,
+   203,   352,   nil,   352,   352,   nil,   352,   352,   nil,   352,
+   nil,   352,   nil,   352,   nil,   352,   nil,   nil,   352,   352,
+    29,   nil,    29,    29,   nil,    29,    29,   nil,    29,   nil,
+    29,   nil,    29,   nil,    29,   nil,   nil,    29,    29,     0,
+   nil,     0,     0,   nil,     0,     0,   nil,     0,   nil,     0,
+   nil,     0,   nil,     0,   nil,   nil,     0,     0 ]
 
 racc_action_pointer = [
-  1418,   229,   nil,   nil,   nil,    98,   nil,   nil,   nil,   337,
-   nil,   nil,    70,   nil,   nil,   331,   123,   nil,   155,   nil,
-   176,    24,   nil,   243,   nil,   335,   108,   278,    76,   nil,
-  1437,   nil,   nil,   375,   407,   273,   nil,   460,   nil,   nil,
-   nil,   nil,   nil,    -1,   nil,   nil,   nil,   255,   nil,   271,
-   nil,   815,   nil,   263,   616,   277,   nil,   265,   nil,   nil,
-   nil,     3,   nil,   nil,   249,   nil,   266,   246,   nil,   nil,
-   234,   200,   194,   542,   nil,   nil,   191,   521,   301,   nil,
-   162,   151,    58,    55,    25,   nil,   295,   993,   262,   218,
-    19,   196,    80,   -14,   242,   nil,   264,   276,   260,   nil,
-   nil,   281,   nil,  1052,  1065,   129,   284,   nil,   nil,   nil,
-   270,   nil,   260,    55,   291,   291,   nil,   292,   314,   312,
-   nil,   nil,   nil,    79,   340,   nil,   162,   nil,   nil,   nil,
-    -2,   334,   932,   nil,   140,   nil,   166,   914,   882,  1111,
-   220,   nil,   nil,   nil,   216,   354,   428,   481,   622,   648,
-   688,   709,   219,   741,   762,    -2,   183,  1298,   595,   101,
-   794,   946,   230,   336,   304,   111,    50,   nil,   nil,    16,
-   nil,   nil,   nil,   nil,   162,   298,    12,   nil,    52,   225,
-   nil,   nil,   nil,   nil,  1276,    61,    51,    91,    84,    78,
-   117,   nil,  1380,   nil,   195,   178,   153,   195,   nil,   nil,
-   nil,   185,   nil,   597,   nil,   nil,   nil,   846,   nil,   535,
-   nil,   nil,   nil,   nil,   nil,    86,   nil,   nil,   222,   205,
-   984,  1441,   -42,   496,  1124,  1137,   553,   nil,  1006,   663,
-  1432,   nil,   249,  1175,   127,   135,   201,   nil,   964,   nil,
-    -4,   nil,   281,    58,    97,   nil,   nil,   nil,     0,   821,
-   nil,   285,   nil,   283,   274,    77,   nil,   287,  1194,   nil,
-  1216,   nil,   nil,   nil,   nil,   nil,   301,   nil,  1235,   nil,
-   nil,   nil,   322,   nil,   249,   nil,   nil,   nil,   nil,   nil,
-    36,   288,   nil,   nil,   312,   860,   nil,   nil,   nil,   nil,
-   300,   nil,   301,   306,   307,   308,   nil,   324,   269,   nil,
-   nil,    77,   248,   nil,  1257,   nil,   nil,   nil,   nil,   896,
-   333,   334,  1317,   nil,  1339,   nil,   nil,   nil,   nil,   nil,
-   nil,   nil,   nil,   nil,  1358,   nil,  1399,   nil,   nil ]
+  1691,   215,   nil,   nil,   nil,   115,   nil,   nil,   nil,   nil,
+   nil,    75,   406,   nil,   nil,   402,   136,   nil,   186,   nil,
+   207,   nil,     0,    19,   nil,   402,   140,   331,   nil,  1672,
+   110,   nil,   nil,   444,   465,   312,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,     5,    -2,   308,   343,   nil,
+  1119,   nil,   311,   310,   746,   326,   nil,   nil,   308,   nil,
+   nil,   nil,    51,   nil,   nil,   293,   292,   nil,   301,   276,
+   294,   nil,   nil,   269,   266,   995,  1260,   nil,   261,   684,
+   nil,   nil,   663,   nil,    89,   259,   nil,   228,   225,    64,
+   193,   159,   122,   nil,   128,   nil,    99,    88,   337,   231,
+    52,    82,   308,   242,   nil,   nil,   nil,   249,  1332,  1273,
+   130,   261,   nil,     8,   nil,    20,   268,   nil,   nil,   278,
+   nil,   nil,   266,    90,   296,   319,   321,   nil,    56,   379,
+   nil,   nil,   nil,   nil,   nil,   nil,     5,   403,    85,   nil,
+    20,  1206,   nil,   142,  1232,  1075,     4,  1319,   248,   269,
+   382,   517,   538,   590,   611,   787,   243,   860,   922,  1016,
+   355,  1489,   725,   943,   808,   nil,   174,   nil,   nil,   nil,
+   nil,   114,   nil,   nil,   405,   nil,  1129,   214,   365,   283,
+   390,   351,   nil,   111,   -15,   nil,   nil,   nil,    56,   nil,
+   nil,   nil,   147,   nil,    65,   354,   nil,   nil,   nil,   nil,
+  1511,   nil,   nil,  1634,   112,   104,  1068,   150,   123,   128,
+    14,   197,   169,   207,   nil,  1200,   nil,   222,   nil,   nil,
+   219,   nil,  1181,   nil,   nil,   nil,   126,   nil,   nil,   nil,
+   nil,   nil,    -1,   251,   nil,   166,   341,   548,   224,   296,
+  1391,   206,   402,   nil,  1378,   146,   475,   nil,   271,  1470,
+   183,   161,   134,   nil,   306,   nil,    25,   881,   nil,     9,
+   nil,  1043,   nil,   311,   nil,   319,    34,    62,   nil,   nil,
+   nil,  1222,  1093,   nil,   323,   315,     3,   nil,   331,  1552,
+   nil,  1571,   nil,  1612,   nil,   nil,   nil,   nil,   nil,   347,
+   nil,   nil,   nil,   nil,   nil,   403,   nil,   225,   nil,   nil,
+   nil,   357,   nil,   336,   nil,   nil,   nil,   nil,   360,  1145,
+   nil,   nil,   369,   nil,   nil,   nil,   nil,   358,   359,   nil,
+   368,   369,   370,   nil,   331,   nil,   nil,    38,   321,   nil,
+  1593,   nil,   nil,   nil,   nil,  1155,   403,   404,  1429,   nil,
+  1530,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
+  1448,   nil,  1653,   nil,   nil ]
 
 racc_action_default = [
-  -174,  -200,   -15,    -3,  -165,  -200,   -16,    -5,  -163,  -200,
-   -17,    -6,  -200,    -7,    -8,  -200,  -164,    -9,  -200,   -10,
-  -200,  -200,   -11,  -200,   -12,  -200,  -200,   -39,  -200,   -13,
-    -1,   -14,    -2,  -200,  -200,  -174,  -164,   -72,  -171,  -170,
-  -169,  -199,  -173,  -174,  -172,  -166,  -168,   -79,  -191,  -200,
-   -31,  -200,   -33,   -32,  -200,   -63,  -102,   -21,  -104,  -103,
-   -22,   -62,   -23,   -61,   -26,  -153,  -200,   -27,  -152,  -151,
-   -28,   -29,   -30,  -200,   -94,  -112,   -90,  -200,  -200,   -97,
-   -91,   -95,   -99,   -92,  -200,   -96,   -93,  -200,   -98,  -200,
-  -200,   -72,  -174,  -174,   -42,  -154,  -156,  -200,  -174,   -40,
-   -38,  -200,    -4,   -70,   -71,  -200,  -200,  -187,   -73,   -67,
-   -64,   -63,   -59,   -62,  -197,   -65,   -57,   -68,  -200,   -66,
-  -150,   -69,  -149,  -200,  -200,  -185,  -200,   -77,   -78,   -80,
-  -200,  -197,  -200,   -20,  -200,   -82,  -200,  -200,  -200,  -200,
-  -200,  -194,  -128,  -121,  -200,  -200,  -200,  -200,  -200,  -200,
-  -200,  -200,  -200,  -200,  -200,  -200,  -200,  -200,  -200,  -200,
-  -200,  -200,  -200,  -200,  -197,  -174,  -200,   -46,   -48,  -200,
-   -62,   -55,   -54,   -45,  -200,   -79,  -200,   329,  -175,  -200,
-  -176,  -189,  -188,  -190,  -200,  -200,   -60,  -200,  -200,  -198,
-   -72,  -186,  -200,  -167,  -200,  -200,  -198,  -200,  -147,  -139,
-  -140,   -62,  -145,  -200,  -148,  -146,   -18,  -200,  -105,  -200,
-  -195,  -196,   -24,   -25,  -101,  -200,  -131,  -192,  -196,  -117,
-  -119,  -123,  -120,  -125,  -130,  -127,  -124,  -113,  -129,  -126,
-  -122,  -114,  -109,  -200,  -115,  -116,  -118,  -137,  -200,  -133,
-  -200,  -106,  -200,  -200,  -200,   -51,   -50,   -44,  -200,  -200,
-   -43,  -197,  -155,  -184,  -200,  -200,  -179,  -182,  -200,  -160,
-  -200,   -34,   -58,   -75,   -35,   -74,  -197,  -162,  -200,   -76,
-   -37,   -81,  -200,  -142,  -197,   -19,   -83,  -100,  -193,  -108,
-  -200,  -109,  -132,  -134,  -200,  -200,   -36,   -49,   -47,   -88,
-   -84,   -52,   -85,   -89,   -86,   -87,   -53,  -200,  -200,  -177,
-  -178,  -200,  -200,  -158,  -200,  -159,   -56,  -161,  -144,  -200,
-  -200,  -196,  -200,  -107,  -200,  -138,   -41,  -183,  -180,  -181,
-  -157,  -143,  -141,  -111,  -200,  -136,  -200,  -110,  -135 ]
+  -178,  -216,   -15,    -3,  -169,  -216,   -16,    -5,  -167,   -17,
+    -6,  -216,  -216,    -7,    -8,  -216,  -168,    -9,  -216,   -10,
+  -216,   -11,  -216,  -216,   -12,  -216,  -216,   -40,   -13,    -1,
+  -216,   -14,    -2,  -216,  -216,  -178,  -168,  -170,  -172,  -175,
+  -174,  -173,  -203,  -176,  -177,  -178,   -74,   -81,  -195,   -31,
+  -216,   -34,   -32,  -216,  -216,   -64,   -33,  -106,   -21,  -108,
+  -107,   -22,   -63,   -23,   -62,   -26,   -27,  -156,  -216,   -28,
+  -214,  -157,  -155,   -29,   -30,  -216,  -216,   -96,   -92,  -216,
+  -116,  -100,  -216,  -101,  -216,   -93,   -99,   -97,   -94,  -216,
+  -103,   -95,  -102,   -98,  -216,  -158,  -160,   -43,  -216,   -74,
+  -178,  -178,  -216,  -178,   -41,    -4,   -39,  -216,   -72,   -73,
+  -216,  -216,  -191,  -216,  -189,  -216,  -216,   -68,   -75,   -65,
+   -71,   -64,   -60,   -63,   -66,  -201,   -69,   -58,   -67,  -216,
+  -154,  -153,   -70,   -79,   -80,   -82,  -216,  -201,  -216,   -20,
+  -216,  -216,   -84,  -216,  -216,  -216,  -216,  -216,  -216,  -216,
+  -216,  -216,  -216,  -216,  -216,  -216,  -216,  -216,  -216,  -216,
+  -216,  -216,  -216,  -216,  -216,  -198,  -216,  -132,  -212,  -211,
+  -210,  -216,  -207,  -206,  -216,  -125,  -216,  -216,   -81,  -216,
+  -216,  -201,  -195,  -178,  -216,   -47,   -49,   -63,  -216,   -56,
+   -55,   -46,  -216,   355,  -179,  -216,  -180,  -193,  -192,  -194,
+  -216,  -190,  -171,  -216,  -216,   -61,  -216,  -216,  -202,   -74,
+  -216,  -216,  -202,  -216,   -18,  -216,  -151,  -216,  -143,  -144,
+   -63,  -149,  -216,  -152,  -150,  -109,  -216,  -199,  -200,   -24,
+   -25,  -105,  -216,  -216,  -135,  -121,  -123,  -127,  -124,  -129,
+  -134,  -131,  -128,  -117,  -133,  -130,  -126,  -118,  -113,  -216,
+  -119,  -120,  -122,  -196,  -200,  -204,  -216,  -216,  -137,  -216,
+  -141,  -216,  -159,  -201,  -110,  -216,  -216,  -216,   -52,   -51,
+   -45,  -216,  -216,   -44,  -188,  -216,  -216,  -183,  -186,  -216,
+  -164,  -216,  -166,  -216,   -35,   -59,   -77,   -36,   -76,  -201,
+   -78,   -38,   -83,  -213,   -19,  -216,  -146,  -201,   -85,  -104,
+  -215,  -216,  -112,  -113,  -197,  -208,  -205,  -209,  -216,  -216,
+  -138,  -136,  -216,   -37,   -50,   -48,   -90,   -86,   -87,   -53,
+   -91,   -88,   -89,   -54,  -216,  -181,  -182,  -216,  -216,  -162,
+  -216,  -163,  -165,   -57,  -148,  -216,  -216,  -200,  -216,  -111,
+  -216,  -142,   -42,  -187,  -184,  -185,  -161,  -147,  -145,  -115,
+  -216,  -140,  -216,  -114,  -139 ]
 
 racc_goto_table = [
-    15,    21,   102,   197,    30,   116,   200,   114,    42,   256,
-   188,   131,    50,    57,   121,    45,    62,    35,   239,   212,
-    32,   166,   174,   279,    69,    25,   136,   195,   271,   101,
-    15,    21,   237,   109,   291,   296,   309,   127,    98,   238,
-   288,    94,   199,   185,   274,    69,    96,    50,   134,   140,
-    67,    62,    72,   179,   106,   107,    43,   124,   112,    69,
-   242,   164,   162,   125,   191,   254,   255,   100,   182,   nil,
-   nil,   117,   313,   122,   197,   nil,   nil,   273,   nil,   nil,
-   nil,   nil,   nil,   nil,   nil,    67,   nil,    72,   nil,   212,
-   nil,   nil,   nil,   nil,   243,   283,   nil,   nil,   nil,   nil,
-   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   237,
-   nil,   nil,   nil,   nil,   nil,   nil,   nil,   181,   180,    42,
-   nil,    89,    42,   nil,   nil,   nil,   172,   172,   nil,   193,
-   nil,   nil,   318,    50,    50,   215,   nil,   213,    62,   251,
-    69,   nil,   nil,   nil,   nil,    69,    69,   297,   227,   nil,
-   nil,   nil,   231,   nil,   262,   135,   315,    15,    21,   nil,
-   266,   233,   306,   121,   nil,   127,   204,   nil,   122,    69,
-   310,    67,    67,    72,    72,   nil,   nil,   nil,   135,   265,
-   197,   nil,   109,   321,    15,    21,   127,   nil,   260,   nil,
-   nil,   135,    15,    21,    69,   204,   268,   122,   nil,   172,
-   nil,   nil,   nil,    50,   nil,   102,   nil,   213,   nil,   nil,
-   nil,    69,   nil,   nil,    53,    69,   nil,    71,   nil,   nil,
-   117,    95,   122,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
-    64,   nil,   102,    15,    21,   110,   nil,   204,   120,   122,
-   102,    67,   nil,    72,   289,   289,    69,   nil,   nil,    53,
-   nil,   115,    71,   nil,   nil,   nil,    69,    69,    15,    21,
-    15,    21,   304,   nil,   nil,    64,   nil,   nil,    15,    21,
-   nil,   nil,   204,    70,   122,   nil,   102,   nil,   172,   nil,
-   nil,   nil,   293,   293,   122,   122,   nil,   nil,   263,   nil,
-   nil,   nil,   nil,    69,   119,   269,   102,   nil,   102,   nil,
-   nil,   nil,   nil,   nil,    15,    21,   171,   171,    70,   nil,
-   276,   nil,    15,    21,    15,    21,   324,    69,   326,   204,
-   nil,   122,   nil,   nil,    15,    21,    15,    21,   nil,   nil,
-   198,   nil,   nil,   120,   nil,    53,    53,   nil,    71,    71,
-   nil,   nil,   nil,   204,   nil,   122,   202,   nil,   nil,   nil,
-   nil,    64,    64,   nil,   nil,   nil,   nil,   nil,   nil,   198,
-   nil,   nil,   120,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
-   nil,   nil,   nil,   308,   252,   202,   nil,   nil,   nil,   171,
-   nil,   nil,   nil,   nil,   110,   nil,   nil,   120,   nil,   205,
-   nil,   nil,   nil,   nil,    70,    70,   nil,   nil,   nil,   317,
-   115,   198,   nil,   319,   120,    53,   nil,   nil,    71,   nil,
-   nil,   nil,   nil,   nil,   nil,   nil,   nil,   202,   205,    87,
-   nil,    64,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
-   nil,   nil,   nil,   nil,   103,   104,   198,   nil,   nil,   120,
-   nil,   nil,   nil,   119,   nil,   nil,   290,   290,   nil,   295,
-   295,   nil,   202,   nil,   nil,   nil,   nil,   nil,   171,   nil,
-   205,   nil,   292,   292,    70,   nil,   nil,   nil,   nil,   nil,
-   nil,   nil,   nil,   nil,   139,   nil,   nil,   nil,   nil,   142,
-   nil,   nil,   nil,   198,   nil,   143,   120,   nil,   nil,   nil,
-   nil,   nil,   nil,   nil,   nil,   205,   nil,   nil,   nil,   202,
-   nil,   nil,   nil,   nil,   nil,   294,   294,   198,   nil,   nil,
-   120,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
-   nil,   nil,   nil,   202,   nil,   nil,   nil,   nil,   nil,   nil,
+    23,    29,   172,   105,   219,    15,   125,   277,    65,    37,
+    58,   127,   137,    72,   258,   217,    35,   132,   229,   184,
+   192,    63,   302,    32,   319,   323,    56,   207,   133,    23,
+   107,   204,   143,   335,    15,    49,   261,   103,   124,   211,
+   292,   106,    65,    72,   140,   218,   315,    72,   297,    96,
+   260,   195,   111,    45,   116,    63,   120,   166,   112,   181,
+    56,    97,   201,   275,   276,   117,   122,    52,   114,    49,
+   198,   171,    25,    95,   nil,   nil,   179,   339,   nil,   nil,
+   nil,   nil,   nil,   265,    44,   296,   nil,   nil,   nil,   229,
+   nil,   nil,   189,   189,   nil,   nil,   217,   119,   nil,   310,
+   nil,    52,   266,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,    94,   202,    74,   nil,   nil,   nil,   nil,   nil,
+   nil,   197,    69,   nil,   nil,   nil,   196,   nil,   nil,   nil,
+   nil,   nil,   nil,   221,   nil,   260,    65,    65,    72,   232,
+   344,    72,    72,   263,   131,   nil,   142,    66,    74,   230,
+    63,   nil,   128,   nil,    56,    56,    69,   nil,   nil,   133,
+   nil,    23,   249,    49,    49,   312,    15,   nil,   221,   289,
+   285,   142,   nil,    72,   305,   189,   132,   126,   nil,   nil,
+   nil,    66,   nil,   341,   nil,   nil,    44,   nil,    44,   288,
+   142,   333,   216,   133,   nil,    52,    52,   124,   347,   336,
+    23,   281,    72,    23,   283,    15,   nil,    65,    15,   217,
+   nil,   nil,    72,   nil,   221,   120,   nil,   nil,   nil,    72,
+   230,   nil,   nil,   105,   117,    56,   nil,   216,   262,   243,
+   213,   190,   190,   247,    49,   nil,   nil,    73,   233,   131,
+   nil,   nil,    74,    74,   nil,   nil,   nil,   224,   nil,    23,
+    69,    69,   nil,   221,    15,   105,   119,   105,    72,   189,
+   nil,   nil,   nil,   318,   318,   nil,    52,   130,    72,    72,
+   nil,    73,   223,   216,   131,    66,    66,   nil,   nil,    23,
+   330,    23,   224,    23,    15,   nil,    15,   nil,    15,   nil,
+   316,   316,   nil,   nil,   nil,   nil,   nil,   nil,   286,   nil,
+   nil,   221,   290,   131,   105,   nil,    72,   223,   nil,   nil,
+   nil,   128,   216,    74,   190,   nil,   nil,   nil,   298,   nil,
+   131,    69,   317,   317,   105,   nil,   105,   221,   224,   nil,
+    23,   nil,    72,   nil,   nil,    15,   126,   nil,    23,   350,
+    23,   352,   nil,    15,   nil,    15,    66,   nil,   nil,   307,
+    23,   nil,    23,   223,   nil,    15,   nil,    15,   nil,   131,
+   216,   nil,   130,   nil,    76,    73,    73,   224,   nil,   131,
+   131,   nil,   nil,   nil,   nil,   nil,   nil,   321,   321,   108,
+   109,   nil,   nil,   nil,   nil,   nil,   216,   334,   nil,   nil,
+   nil,   nil,   223,   nil,   nil,   nil,   nil,   130,   190,   nil,
+   nil,   nil,   320,   320,   nil,   nil,   nil,   131,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   224,   343,   nil,   nil,   nil,
+   345,   147,   nil,   nil,   nil,   nil,   130,   nil,   167,   nil,
+   nil,   nil,   nil,   131,   nil,   175,    73,   nil,   nil,   nil,
+   223,   224,   nil,   130,   nil,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   223,   nil,   nil,   nil,
    nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
-   nil,   nil,   205,   nil,   nil,   219,   220,   221,   222,   223,
-   224,   225,   226,   nil,   228,   229,   230,   nil,   nil,   234,
-   235,   236,   nil,   nil,   nil,   nil,   205 ]
+   nil,   nil,   130,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,   322,   322,   235,   236,   237,   238,   239,   240,
+   241,   242,   nil,   244,   245,   246,   nil,   nil,   250,   251,
+   252,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
+   130,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   130 ]
 
 racc_goto_check = [
-    20,    33,     4,    59,     2,    43,    61,    31,    55,    72,
-    32,    34,    26,    18,    46,    68,    20,    28,    57,    19,
-     3,    37,    37,    54,    45,     1,    52,    32,    51,    33,
-    20,    33,    59,    26,    42,    42,    53,    48,    28,    56,
-    38,    36,    60,    30,    62,    45,    63,    26,    18,    52,
-    22,    20,    25,    64,    65,     3,    66,    67,    29,    45,
-    32,    31,    52,     3,    69,    70,    71,     5,    73,   nil,
-   nil,    22,    54,    25,    59,   nil,   nil,    61,   nil,   nil,
-   nil,   nil,   nil,   nil,   nil,    22,   nil,    25,   nil,    19,
-   nil,   nil,   nil,   nil,    37,    57,   nil,   nil,   nil,   nil,
-   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,    59,
-   nil,   nil,   nil,   nil,   nil,   nil,   nil,    28,     3,    55,
-   nil,    49,    55,   nil,   nil,   nil,    22,    22,   nil,    68,
-   nil,   nil,    72,    26,    26,    18,   nil,    20,    20,    34,
-    45,   nil,   nil,   nil,   nil,    45,    45,    32,    55,   nil,
-   nil,   nil,    55,   nil,    43,    49,    59,    20,    33,   nil,
-    31,     2,    32,    46,   nil,    48,    22,   nil,    25,    45,
-    32,    22,    22,    25,    25,   nil,   nil,   nil,    49,    48,
-    59,   nil,    26,    61,    20,    33,    48,   nil,     2,   nil,
-   nil,    49,    20,    33,    45,    22,     2,    25,   nil,    22,
-   nil,   nil,   nil,    26,   nil,     4,   nil,    20,   nil,   nil,
-   nil,    45,   nil,   nil,    27,    45,   nil,    24,   nil,   nil,
-    22,    27,    25,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
-    21,   nil,     4,    20,    33,    27,   nil,    22,    24,    25,
-     4,    22,   nil,    25,    26,    26,    45,   nil,   nil,    27,
-   nil,    21,    24,   nil,   nil,   nil,    45,    45,    20,    33,
-    20,    33,     2,   nil,   nil,    21,   nil,   nil,    20,    33,
-   nil,   nil,    22,    23,    25,   nil,     4,   nil,    22,   nil,
-   nil,   nil,    22,    22,    25,    25,   nil,   nil,    49,   nil,
-   nil,   nil,   nil,    45,    23,    49,     4,   nil,     4,   nil,
-   nil,   nil,   nil,   nil,    20,    33,    21,    21,    23,   nil,
-    49,   nil,    20,    33,    20,    33,     2,    45,     2,    22,
-   nil,    25,   nil,   nil,    20,    33,    20,    33,   nil,   nil,
-    27,   nil,   nil,    24,   nil,    27,    27,   nil,    24,    24,
-   nil,   nil,   nil,    22,   nil,    25,    21,   nil,   nil,   nil,
-   nil,    21,    21,   nil,   nil,   nil,   nil,   nil,   nil,    27,
+    34,     2,    77,     4,    63,    20,    32,    74,    21,    70,
+    18,    44,    35,    46,    59,    61,    29,    47,    19,    38,
+    38,    20,    56,     3,    43,    43,    28,    33,    49,    34,
+    34,    31,    53,    54,    20,    26,    58,    29,    21,    33,
+    52,     5,    21,    46,    18,    62,    39,    46,    64,    65,
+    61,    66,    67,    68,    69,    20,    28,    53,     3,    32,
+    28,    37,    71,    72,    73,    26,    30,    27,     3,    26,
+    75,    76,     1,    27,   nil,   nil,    53,    56,   nil,   nil,
+   nil,   nil,   nil,    33,    57,    63,   nil,   nil,   nil,    19,
+   nil,   nil,    21,    21,   nil,   nil,    61,    27,   nil,    59,
+   nil,    27,    38,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,    50,    70,    25,   nil,   nil,   nil,   nil,   nil,
+   nil,    29,    23,   nil,   nil,   nil,     3,   nil,   nil,   nil,
+   nil,   nil,   nil,    21,   nil,    61,    21,    21,    46,    18,
+    74,    46,    46,    35,    25,   nil,    50,    22,    25,    20,
+    20,   nil,    23,   nil,    28,    28,    23,   nil,   nil,    49,
+   nil,    34,     2,    26,    26,    33,    20,   nil,    21,    32,
+    44,    50,   nil,    46,    77,    21,    47,    22,   nil,   nil,
+   nil,    22,   nil,    61,   nil,   nil,    57,   nil,    57,    49,
+    50,    33,    27,    49,   nil,    27,    27,    21,    63,    33,
+    34,     2,    46,    34,     2,    20,   nil,    21,    20,    61,
+   nil,   nil,    46,   nil,    21,    28,   nil,   nil,   nil,    46,
+    20,   nil,   nil,     4,    26,    28,   nil,    27,    27,    57,
+    50,    22,    22,    57,    26,   nil,   nil,    24,    50,    25,
+   nil,   nil,    25,    25,   nil,   nil,   nil,    23,   nil,    34,
+    23,    23,   nil,    21,    20,     4,    27,     4,    46,    21,
+   nil,   nil,   nil,    21,    21,   nil,    27,    24,    46,    46,
+   nil,    24,    22,    27,    25,    22,    22,   nil,   nil,    34,
+     2,    34,    23,    34,    20,   nil,    20,   nil,    20,   nil,
+    26,    26,   nil,   nil,   nil,   nil,   nil,   nil,    50,   nil,
+   nil,    21,    50,    25,     4,   nil,    46,    22,   nil,   nil,
+   nil,    23,    27,    25,    22,   nil,   nil,   nil,    50,   nil,
+    25,    23,    27,    27,     4,   nil,     4,    21,    23,   nil,
+    34,   nil,    46,   nil,   nil,    20,    22,   nil,    34,     2,
+    34,     2,   nil,    20,   nil,    20,    22,   nil,   nil,    50,
+    34,   nil,    34,    22,   nil,    20,   nil,    20,   nil,    25,
+    27,   nil,    24,   nil,    48,    24,    24,    23,   nil,    25,
+    25,   nil,   nil,   nil,   nil,   nil,   nil,    23,    23,    48,
+    48,   nil,   nil,   nil,   nil,   nil,    27,    50,   nil,   nil,
+   nil,   nil,    22,   nil,   nil,   nil,   nil,    24,    22,   nil,
+   nil,   nil,    22,    22,   nil,   nil,   nil,    25,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,    23,    50,   nil,   nil,   nil,
+    50,    48,   nil,   nil,   nil,   nil,    24,   nil,    48,   nil,
+   nil,   nil,   nil,    25,   nil,    48,    24,   nil,   nil,   nil,
+    22,    23,   nil,    24,   nil,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,    22,   nil,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
    nil,   nil,    24,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
-   nil,   nil,   nil,    49,    27,    21,   nil,   nil,   nil,    21,
-   nil,   nil,   nil,   nil,    27,   nil,   nil,    24,   nil,    23,
-   nil,   nil,   nil,   nil,    23,    23,   nil,   nil,   nil,    49,
-    21,    27,   nil,    49,    24,    27,   nil,   nil,    24,   nil,
-   nil,   nil,   nil,   nil,   nil,   nil,   nil,    21,    23,    47,
-   nil,    21,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
-   nil,   nil,   nil,   nil,    47,    47,    27,   nil,   nil,    24,
-   nil,   nil,   nil,    23,   nil,   nil,    27,    27,   nil,    24,
-    24,   nil,    21,   nil,   nil,   nil,   nil,   nil,    21,   nil,
-    23,   nil,    21,    21,    23,   nil,   nil,   nil,   nil,   nil,
-   nil,   nil,   nil,   nil,    47,   nil,   nil,   nil,   nil,    47,
-   nil,   nil,   nil,    27,   nil,    47,    24,   nil,   nil,   nil,
-   nil,   nil,   nil,   nil,   nil,    23,   nil,   nil,   nil,    21,
-   nil,   nil,   nil,   nil,   nil,    23,    23,    27,   nil,   nil,
+   nil,   nil,    24,    24,    48,    48,    48,    48,    48,    48,
+    48,    48,   nil,    48,    48,    48,   nil,   nil,    48,    48,
+    48,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
     24,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
-   nil,   nil,   nil,    21,   nil,   nil,   nil,   nil,   nil,   nil,
    nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
-   nil,   nil,    23,   nil,   nil,    47,    47,    47,    47,    47,
-    47,    47,    47,   nil,    47,    47,    47,   nil,   nil,    47,
-    47,    47,   nil,   nil,   nil,   nil,    23 ]
+   nil,   nil,   nil,   nil,   nil,   nil,    24 ]
 
 racc_goto_pointer = [
-   nil,    25,     4,    20,   -28,    39,   nil,   nil,   nil,   nil,
-   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,    -3,  -118,
-     0,   214,    34,   257,   201,    36,    -4,   198,    12,    21,
-   -69,   -30,  -104,     1,   -36,   nil,    20,   -71,  -204,   nil,
-   nil,   nil,  -214,   -32,   nil,     8,   -23,   401,   -10,   101,
-   nil,  -168,   -28,  -238,  -209,    -4,  -122,  -143,   nil,  -129,
-   -90,  -126,  -159,    23,   -45,    19,    44,    14,     3,   -59,
-  -113,  -112,  -169,   -37 ]
+   nil,    72,     1,    23,   -26,    11,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,    -6,  -126,
+     5,    -8,   131,   106,   221,    98,    19,    51,    10,    11,
+    20,   -91,   -40,   -98,     0,   -35,   nil,    38,   -81,  -221,
+   nil,   nil,   nil,  -247,   -35,   nil,    -3,   -29,   346,   -19,
+    92,   nil,  -172,   -22,  -264,   nil,  -226,    73,  -140,  -162,
+   nil,  -126,   -96,  -137,  -174,    27,   -52,    17,    42,     9,
+    -2,   -51,  -131,  -130,  -187,   -40,   -13,   -82,   nil,   nil ]
 
 racc_goto_default = [
-   nil,   nil,   nil,   173,     3,     7,    11,    13,    14,    17,
-    19,    22,    24,    29,    31,     2,     6,    10,   nil,    60,
-    79,    80,    81,    83,    86,    88,    74,    76,     9,   nil,
-   nil,   nil,   nil,    66,   nil,    28,   nil,   nil,   167,   244,
-   168,   169,   nil,   nil,   118,    82,    85,   nil,   108,    75,
-   128,   129,   nil,   209,   nil,    65,   nil,   nil,   240,    49,
-   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,    46,
-   nil,   nil,   nil,   nil ]
+   nil,   nil,   nil,   191,     3,     7,    10,    13,    14,    17,
+    19,    21,    24,    28,    31,     2,     6,     9,   nil,    61,
+    83,    85,    87,    88,    91,    92,    77,    78,    81,    12,
+   nil,   nil,   nil,   nil,    68,   nil,    30,   nil,   nil,   185,
+   267,   186,   188,   nil,   nil,   129,    90,    93,   nil,   118,
+    80,   134,   135,   nil,   226,    86,   nil,    71,   nil,   nil,
+   259,    53,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
+   nil,    38,   nil,   nil,   nil,   nil,   nil,   nil,   174,    70 ]
 
 racc_token_table = {
  false => 0,
@@ -940,6 +1006,7 @@ Racc_token_to_s_table = [
 'funcrvalue',
 'selector',
 'quotedtext',
+'hasharrayaccesses',
 'classname',
 'resourceinstances',
 'endsemi',
@@ -966,6 +1033,7 @@ Racc_token_to_s_table = [
 'anyparam',
 'rvalues',
 'comma',
+'hash',
 'else',
 'regex',
 'caseopts',
@@ -985,7 +1053,11 @@ Racc_token_to_s_table = [
 'nothing',
 'arguments',
 'argument',
-'classnameordefault']
+'classnameordefault',
+'hashpairs',
+'hashpair',
+'key',
+'hasharrayaccess']
 
 Racc_debug_parser = false
 
@@ -1147,15 +1219,17 @@ module_eval <<'.,.,', 'grammar.ra', 123
 
  # reduce 32 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 136
-  def _reduce_33( val, _values, result )
+ # reduce 33 omitted
+
+module_eval <<'.,.,', 'grammar.ra', 137
+  def _reduce_34( val, _values, result )
                     result = ast AST::Name, :value => val[0][:value]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 158
-  def _reduce_34( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 159
+  def _reduce_35( val, _values, result )
     @lexer.commentpop
     array = val[2]
     if array.instance_of?(AST::ResourceInstance)
@@ -1179,32 +1253,32 @@ module_eval <<'.,.,', 'grammar.ra', 158
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 161
-  def _reduce_35( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 162
+  def _reduce_36( val, _values, result )
     # This is a deprecated syntax.
     error "All resource specifications require names"
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 164
-  def _reduce_36( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 165
+  def _reduce_37( val, _values, result )
     # a defaults setting for a type
     result = ast(AST::ResourceDefaults, :type => val[0], :params => val[2])
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 170
-  def _reduce_37( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 171
+  def _reduce_38( val, _values, result )
     @lexer.commentpop
     result = ast AST::ResourceOverride, :object => val[0], :params => val[2]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 197
-  def _reduce_38( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 198
+  def _reduce_39( val, _values, result )
     type = val[0]
 
     if (type == :exported and ! Puppet[:storeconfigs]) and ! Puppet[:parseonly]
@@ -1231,22 +1305,22 @@ module_eval <<'.,.,', 'grammar.ra', 197
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 198
-  def _reduce_39( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 199
+  def _reduce_40( val, _values, result )
  result = :virtual
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 199
-  def _reduce_40( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 200
+  def _reduce_41( val, _values, result )
  result = :exported
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 223
-  def _reduce_41( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 224
+  def _reduce_42( val, _values, result )
     if val[0] =~ /^[a-z]/
         Puppet.warning addcontext("Collection names must now be capitalized")
     end
@@ -1269,8 +1343,8 @@ module_eval <<'.,.,', 'grammar.ra', 223
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 242
-  def _reduce_42( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 243
+  def _reduce_43( val, _values, result )
     if val[0] =~ /^[a-z]/
         Puppet.warning addcontext("Collection names must now be capitalized")
     end
@@ -1292,8 +1366,8 @@ module_eval <<'.,.,', 'grammar.ra', 242
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 252
-  def _reduce_43( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 253
+  def _reduce_44( val, _values, result )
     if val[1]
         result = val[1]
         result.form = :virtual
@@ -1304,8 +1378,8 @@ module_eval <<'.,.,', 'grammar.ra', 252
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 260
-  def _reduce_44( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 261
+  def _reduce_45( val, _values, result )
     if val[1]
         result = val[1]
         result.form = :exported
@@ -1316,43 +1390,43 @@ module_eval <<'.,.,', 'grammar.ra', 260
   end
 .,.,
 
- # reduce 45 omitted
-
  # reduce 46 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 268
-  def _reduce_47( val, _values, result )
+ # reduce 47 omitted
+
+module_eval <<'.,.,', 'grammar.ra', 269
+  def _reduce_48( val, _values, result )
     result = ast AST::CollExpr, :test1 => val[0], :oper => val[1], :test2 => val[2]
    result
   end
 .,.,
 
- # reduce 48 omitted
+ # reduce 49 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 274
-  def _reduce_49( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 275
+  def _reduce_50( val, _values, result )
     result = val[1]
     result.parens = true
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 275
-  def _reduce_50( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 276
+  def _reduce_51( val, _values, result )
  result=val[0][:value]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 276
-  def _reduce_51( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 277
+  def _reduce_52( val, _values, result )
  result=val[0][:value]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 283
-  def _reduce_52( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 284
+  def _reduce_53( val, _values, result )
     result = ast AST::CollExpr, :test1 => val[0], :oper => val[1][:value], :test2 => val[2]
     #result = ast AST::CollExpr
     #result.push *val
@@ -1360,8 +1434,8 @@ module_eval <<'.,.,', 'grammar.ra', 283
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 288
-  def _reduce_53( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 289
+  def _reduce_54( val, _values, result )
     result = ast AST::CollExpr, :test1 => val[0], :oper => val[1][:value], :test2 => val[2]
     #result = ast AST::CollExpr
     #result.push *val
@@ -1369,21 +1443,21 @@ module_eval <<'.,.,', 'grammar.ra', 288
   end
 .,.,
 
- # reduce 54 omitted
-
  # reduce 55 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 295
-  def _reduce_56( val, _values, result )
+ # reduce 56 omitted
+
+module_eval <<'.,.,', 'grammar.ra', 296
+  def _reduce_57( val, _values, result )
     result = ast AST::ResourceInstance, :children => [val[0],val[2]]
    result
   end
 .,.,
 
- # reduce 57 omitted
+ # reduce 58 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 305
-  def _reduce_58( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 306
+  def _reduce_59( val, _values, result )
     if val[0].instance_of?(AST::ResourceInstance)
         result = ast AST::ASTArray, :children => [val[0],val[2]]
     else
@@ -1394,33 +1468,31 @@ module_eval <<'.,.,', 'grammar.ra', 305
   end
 .,.,
 
- # reduce 59 omitted
-
  # reduce 60 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 312
-  def _reduce_61( val, _values, result )
+ # reduce 61 omitted
+
+module_eval <<'.,.,', 'grammar.ra', 313
+  def _reduce_62( val, _values, result )
     result = ast AST::Undef, :value => :undef
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 316
-  def _reduce_62( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 317
+  def _reduce_63( val, _values, result )
     result = ast AST::Name, :value => val[0][:value], :line => val[0][:line]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 320
-  def _reduce_63( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 321
+  def _reduce_64( val, _values, result )
     result = ast AST::Type, :value => val[0][:value], :line => val[0][:line]
    result
   end
 .,.,
 
- # reduce 64 omitted
-
  # reduce 65 omitted
 
  # reduce 66 omitted
@@ -1431,8 +1503,12 @@ module_eval <<'.,.,', 'grammar.ra', 320
 
  # reduce 69 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 336
-  def _reduce_70( val, _values, result )
+ # reduce 70 omitted
+
+ # reduce 71 omitted
+
+module_eval <<'.,.,', 'grammar.ra', 338
+  def _reduce_72( val, _values, result )
     if val[0][:value] =~ /::/
         raise Puppet::ParseError, "Cannot assign to variables in other namespaces"
     end
@@ -1443,30 +1519,30 @@ module_eval <<'.,.,', 'grammar.ra', 336
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 341
-  def _reduce_71( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 343
+  def _reduce_73( 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
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 346
-  def _reduce_72( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 348
+  def _reduce_74( val, _values, result )
     result = ast AST::ASTArray
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 346
-  def _reduce_73( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 348
+  def _reduce_75( val, _values, result )
  result = val[0]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 355
-  def _reduce_74( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 357
+  def _reduce_76( val, _values, result )
     if val[0].instance_of?(AST::ASTArray)
         val[0].push(val[2])
         result = val[0]
@@ -1477,41 +1553,41 @@ module_eval <<'.,.,', 'grammar.ra', 355
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 359
-  def _reduce_75( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 361
+  def _reduce_77( val, _values, result )
     result = ast AST::ResourceParam, :param => val[0][:value], :line => val[0][:line], :value => val[2]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 364
-  def _reduce_76( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 366
+  def _reduce_78( val, _values, result )
     result = ast AST::ResourceParam, :param => val[0][:value], :line => val[0][:line], :value => val[2],
                                      :add => true
    result
   end
 .,.,
 
- # reduce 77 omitted
+ # reduce 79 omitted
 
- # reduce 78 omitted
+ # reduce 80 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 372
-  def _reduce_79( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 374
+  def _reduce_81( val, _values, result )
     result = ast AST::ASTArray
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 372
-  def _reduce_80( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 374
+  def _reduce_82( val, _values, result )
  result = val[0]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 381
-  def _reduce_81( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 383
+  def _reduce_83( val, _values, result )
     if val[0].instance_of?(AST::ASTArray)
         val[0].push(val[2])
         result = val[0]
@@ -1522,10 +1598,10 @@ module_eval <<'.,.,', 'grammar.ra', 381
   end
 .,.,
 
- # reduce 82 omitted
+ # reduce 84 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 390
-  def _reduce_83( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 392
+  def _reduce_85( val, _values, result )
     if val[0].instance_of?(AST::ASTArray)
         result = val[0].push(val[2])
     else
@@ -1535,10 +1611,6 @@ module_eval <<'.,.,', 'grammar.ra', 390
   end
 .,.,
 
- # reduce 84 omitted
-
- # reduce 85 omitted
-
  # reduce 86 omitted
 
  # reduce 87 omitted
@@ -1567,8 +1639,16 @@ module_eval <<'.,.,', 'grammar.ra', 390
 
  # reduce 99 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 417
-  def _reduce_100( val, _values, result )
+ # reduce 100 omitted
+
+ # reduce 101 omitted
+
+ # reduce 102 omitted
+
+ # reduce 103 omitted
+
+module_eval <<'.,.,', 'grammar.ra', 421
+  def _reduce_104( val, _values, result )
     args = aryfy(val[2])
     result = ast AST::Function,
         :name => val[0][:value], :line => val[0][:line],
@@ -1578,8 +1658,8 @@ module_eval <<'.,.,', 'grammar.ra', 417
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 422
-  def _reduce_101( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 426
+  def _reduce_105( val, _values, result )
     result = ast AST::Function,
         :name => val[0][:value], :line => val[0][:line],
         :arguments => AST::ASTArray.new({}),
@@ -1588,44 +1668,44 @@ module_eval <<'.,.,', 'grammar.ra', 422
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 426
-  def _reduce_102( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 430
+  def _reduce_106( val, _values, result )
     result = ast AST::String, :value => val[0][:value], :line => val[0][:line]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 428
-  def _reduce_103( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 432
+  def _reduce_107( val, _values, result )
     result = ast AST::FlatString, :value => val[0][:value], :line => val[0][:line]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 432
-  def _reduce_104( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 436
+  def _reduce_108( val, _values, result )
     result = ast AST::Boolean, :value => val[0][:value], :line => val[0][:line]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 437
-  def _reduce_105( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 441
+  def _reduce_109( 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
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 439
-  def _reduce_106( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 443
+  def _reduce_110( val, _values, result )
     result = ast AST::ResourceReference, :type => val[0], :title => val[2]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 453
-  def _reduce_107( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 457
+  def _reduce_111( val, _values, result )
     @lexer.commentpop
     args = {
         :test => val[1],
@@ -1641,8 +1721,8 @@ module_eval <<'.,.,', 'grammar.ra', 453
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 466
-  def _reduce_108( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 470
+  def _reduce_112( val, _values, result )
     @lexer.commentpop
     args = {
         :test => val[1],
@@ -1658,161 +1738,161 @@ module_eval <<'.,.,', 'grammar.ra', 466
   end
 .,.,
 
- # reduce 109 omitted
+ # reduce 113 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 472
-  def _reduce_110( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 476
+  def _reduce_114( val, _values, result )
     @lexer.commentpop
     result = ast AST::Else, :statements => val[2]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 476
-  def _reduce_111( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 480
+  def _reduce_115( val, _values, result )
     @lexer.commentpop
     result = ast AST::Else, :statements => ast(AST::Nop)
    result
   end
 .,.,
 
- # reduce 112 omitted
+ # reduce 116 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 493
-  def _reduce_113( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 497
+  def _reduce_117( val, _values, result )
     result = ast AST::MatchOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 496
-  def _reduce_114( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 500
+  def _reduce_118( val, _values, result )
     result = ast AST::MatchOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 499
-  def _reduce_115( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 503
+  def _reduce_119( val, _values, result )
     result = ast AST::ArithmeticOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 502
-  def _reduce_116( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 506
+  def _reduce_120( val, _values, result )
     result = ast AST::ArithmeticOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 505
-  def _reduce_117( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 509
+  def _reduce_121( val, _values, result )
     result = ast AST::ArithmeticOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 508
-  def _reduce_118( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 512
+  def _reduce_122( val, _values, result )
     result = ast AST::ArithmeticOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 511
-  def _reduce_119( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 515
+  def _reduce_123( val, _values, result )
     result = ast AST::ArithmeticOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 514
-  def _reduce_120( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 518
+  def _reduce_124( val, _values, result )
     result = ast AST::ArithmeticOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 517
-  def _reduce_121( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 521
+  def _reduce_125( val, _values, result )
     result = ast AST::Minus, :value => val[1]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 520
-  def _reduce_122( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 524
+  def _reduce_126( val, _values, result )
     result = ast AST::ComparisonOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 523
-  def _reduce_123( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 527
+  def _reduce_127( val, _values, result )
     result = ast AST::ComparisonOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 526
-  def _reduce_124( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 530
+  def _reduce_128( val, _values, result )
     result = ast AST::ComparisonOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 529
-  def _reduce_125( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 533
+  def _reduce_129( val, _values, result )
     result = ast AST::ComparisonOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 532
-  def _reduce_126( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 536
+  def _reduce_130( val, _values, result )
     result = ast AST::ComparisonOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 535
-  def _reduce_127( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 539
+  def _reduce_131( val, _values, result )
     result = ast AST::ComparisonOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 538
-  def _reduce_128( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 542
+  def _reduce_132( val, _values, result )
     result = ast AST::Not, :value => val[1]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 541
-  def _reduce_129( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 545
+  def _reduce_133( val, _values, result )
     result = ast AST::BooleanOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 544
-  def _reduce_130( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 548
+  def _reduce_134( val, _values, result )
     result = ast AST::BooleanOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 547
-  def _reduce_131( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 551
+  def _reduce_135( val, _values, result )
     result = val[1]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 556
-  def _reduce_132( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 560
+  def _reduce_136( val, _values, result )
     @lexer.commentpop
     options = val[3]
     unless options.instance_of?(AST::ASTArray)
@@ -1823,10 +1903,10 @@ module_eval <<'.,.,', 'grammar.ra', 556
   end
 .,.,
 
- # reduce 133 omitted
+ # reduce 137 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 566
-  def _reduce_134( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 570
+  def _reduce_138( val, _values, result )
     if val[0].instance_of?(AST::ASTArray)
         val[0].push val[1]
         result = val[0]
@@ -1837,16 +1917,16 @@ module_eval <<'.,.,', 'grammar.ra', 566
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 571
-  def _reduce_135( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 575
+  def _reduce_139( val, _values, result )
     @lexer.commentpop
     result = ast AST::CaseOpt, :value => val[0], :statements => val[3]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 577
-  def _reduce_136( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 581
+  def _reduce_140( val, _values, result )
     @lexer.commentpop
     result = ast(AST::CaseOpt,
         :value => val[0],
@@ -1856,10 +1936,10 @@ module_eval <<'.,.,', 'grammar.ra', 577
   end
 .,.,
 
- # reduce 137 omitted
+ # reduce 141 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 587
-  def _reduce_138( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 591
+  def _reduce_142( val, _values, result )
     if val[0].instance_of?(AST::ASTArray)
         val[0].push(val[2])
         result = val[0]
@@ -1870,27 +1950,27 @@ module_eval <<'.,.,', 'grammar.ra', 587
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 591
-  def _reduce_139( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 595
+  def _reduce_143( val, _values, result )
     result = ast AST::Selector, :param => val[0], :values => val[2]
    result
   end
 .,.,
 
- # reduce 140 omitted
+ # reduce 144 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 597
-  def _reduce_141( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 601
+  def _reduce_145( val, _values, result )
     @lexer.commentpop
     result = val[1]
    result
   end
 .,.,
 
- # reduce 142 omitted
+ # reduce 146 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 607
-  def _reduce_143( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 611
+  def _reduce_147( val, _values, result )
     if val[0].instance_of?(AST::ASTArray)
         val[0].push(val[2])
         result = val[0]
@@ -1901,52 +1981,52 @@ module_eval <<'.,.,', 'grammar.ra', 607
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 611
-  def _reduce_144( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 615
+  def _reduce_148( val, _values, result )
     result = ast AST::ResourceParam, :param => val[0], :value => val[2]
    result
   end
 .,.,
 
- # reduce 145 omitted
+ # reduce 149 omitted
 
- # reduce 146 omitted
+ # reduce 150 omitted
 
- # reduce 147 omitted
+ # reduce 151 omitted
 
- # reduce 148 omitted
+ # reduce 152 omitted
 
- # reduce 149 omitted
+ # reduce 153 omitted
 
- # reduce 150 omitted
+ # reduce 154 omitted
 
- # reduce 151 omitted
+ # reduce 155 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 622
-  def _reduce_152( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 626
+  def _reduce_156( val, _values, result )
     result = ast AST::Default, :value => val[0][:value], :line => val[0][:line]
    result
   end
 .,.,
 
- # reduce 153 omitted
+ # reduce 157 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 625
-  def _reduce_154( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 629
+  def _reduce_158( val, _values, result )
  result = [val[0].value]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 629
-  def _reduce_155( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 633
+  def _reduce_159( val, _values, result )
     results = val[0] << val[2].value
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 637
-  def _reduce_156( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 641
+  def _reduce_160( val, _values, result )
     val[1].each do |file|
         import(file)
     end
@@ -1956,8 +2036,8 @@ module_eval <<'.,.,', 'grammar.ra', 637
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 648
-  def _reduce_157( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 652
+  def _reduce_161( val, _values, result )
     @lexer.commentpop
     newdefine classname(val[1]), :arguments => val[2], :code => val[4], :line => val[0][:line]
     @lexer.indefine = false
@@ -1968,8 +2048,8 @@ module_eval <<'.,.,', 'grammar.ra', 648
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 653
-  def _reduce_158( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 657
+  def _reduce_162( val, _values, result )
     @lexer.commentpop
     newdefine classname(val[1]), :arguments => val[2], :line => val[0][:line]
     @lexer.indefine = false
@@ -1978,8 +2058,8 @@ module_eval <<'.,.,', 'grammar.ra', 653
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 662
-  def _reduce_159( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 666
+  def _reduce_163( val, _values, result )
     @lexer.commentpop
     # Our class gets defined in the parent namespace, not our own.
     @lexer.namepop
@@ -1989,8 +2069,8 @@ module_eval <<'.,.,', 'grammar.ra', 662
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 668
-  def _reduce_160( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 672
+  def _reduce_164( val, _values, result )
     @lexer.commentpop
     # Our class gets defined in the parent namespace, not our own.
     @lexer.namepop
@@ -2000,8 +2080,8 @@ module_eval <<'.,.,', 'grammar.ra', 668
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 674
-  def _reduce_161( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 678
+  def _reduce_165( val, _values, result )
     @lexer.commentpop
     newnode val[1], :parent => val[2], :code => val[4], :line => val[0][:line]
     result = nil
@@ -2009,8 +2089,8 @@ module_eval <<'.,.,', 'grammar.ra', 674
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 678
-  def _reduce_162( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 682
+  def _reduce_166( val, _values, result )
     @lexer.commentpop
     newnode val[1], :parent => val[2], :line => val[0][:line]
     result = nil
@@ -2018,31 +2098,31 @@ module_eval <<'.,.,', 'grammar.ra', 678
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 679
-  def _reduce_163( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 683
+  def _reduce_167( val, _values, result )
  result = val[0][:value]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 681
-  def _reduce_164( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 685
+  def _reduce_168( val, _values, result )
  result = val[0][:value]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 682
-  def _reduce_165( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 686
+  def _reduce_169( val, _values, result )
  result = val[0][:value]
    result
   end
 .,.,
 
- # reduce 166 omitted
+ # reduce 170 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 692
-  def _reduce_167( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 696
+  def _reduce_171( val, _values, result )
     result = val[0]
     result = [result] unless result.is_a?(Array)
     result << val[2]
@@ -2050,78 +2130,78 @@ module_eval <<'.,.,', 'grammar.ra', 692
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 696
-  def _reduce_168( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 700
+  def _reduce_172( val, _values, result )
     result = ast AST::HostName, :value => val[0]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 697
-  def _reduce_169( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 701
+  def _reduce_173( val, _values, result )
  result = val[0][:value]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 698
-  def _reduce_170( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 702
+  def _reduce_174( val, _values, result )
  result = val[0][:value]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 699
-  def _reduce_171( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 703
+  def _reduce_175( val, _values, result )
  result = val[0][:value]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 700
-  def _reduce_172( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 704
+  def _reduce_176( val, _values, result )
  result = val[0][:value]
    result
   end
 .,.,
 
- # reduce 173 omitted
+ # reduce 177 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 706
-  def _reduce_174( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 710
+  def _reduce_178( val, _values, result )
     result = nil
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 710
-  def _reduce_175( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 714
+  def _reduce_179( val, _values, result )
     result = ast AST::ASTArray, :children => []
    result
   end
 .,.,
 
- # reduce 176 omitted
+ # reduce 180 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 715
-  def _reduce_177( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 719
+  def _reduce_181( val, _values, result )
     result = nil
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 719
-  def _reduce_178( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 723
+  def _reduce_182( val, _values, result )
     result = val[1]
     result = [result] unless result[0].is_a?(Array)
    result
   end
 .,.,
 
- # reduce 179 omitted
+ # reduce 183 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 726
-  def _reduce_180( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 730
+  def _reduce_184( val, _values, result )
     result = val[0]
     result = [result] unless result[0].is_a?(Array)
     result << val[2]
@@ -2129,67 +2209,67 @@ module_eval <<'.,.,', 'grammar.ra', 726
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 731
-  def _reduce_181( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 735
+  def _reduce_185( val, _values, result )
     Puppet.warning addcontext("Deprecation notice: must now include '$' in prototype")
     result = [val[0][:value], val[2]]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 735
-  def _reduce_182( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 739
+  def _reduce_186( val, _values, result )
     Puppet.warning addcontext("Deprecation notice: must now include '$' in prototype")
     result = [val[0][:value]]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 737
-  def _reduce_183( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 741
+  def _reduce_187( val, _values, result )
     result = [val[0][:value], val[2]]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 739
-  def _reduce_184( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 743
+  def _reduce_188( val, _values, result )
     result = [val[0][:value]]
    result
   end
 .,.,
 
- # reduce 185 omitted
+ # reduce 189 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 744
-  def _reduce_186( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 748
+  def _reduce_190( val, _values, result )
     result = val[1]
    result
   end
 .,.,
 
- # reduce 187 omitted
+ # reduce 191 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 749
-  def _reduce_188( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 753
+  def _reduce_192( val, _values, result )
     result = val[1]
    result
   end
 .,.,
 
- # reduce 189 omitted
+ # reduce 193 omitted
 
- # reduce 190 omitted
+ # reduce 194 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 755
-  def _reduce_191( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 759
+  def _reduce_195( val, _values, result )
     result = ast AST::Variable, :value => val[0][:value], :line => val[0][:line]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 763
-  def _reduce_192( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 767
+  def _reduce_196( val, _values, result )
     if val[1].instance_of?(AST::ASTArray)
         result = val[1]
     else
@@ -2199,8 +2279,8 @@ module_eval <<'.,.,', 'grammar.ra', 763
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 770
-  def _reduce_193( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 774
+  def _reduce_197( val, _values, result )
     if val[1].instance_of?(AST::ASTArray)
         result = val[1]
     else
@@ -2210,33 +2290,120 @@ module_eval <<'.,.,', 'grammar.ra', 770
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 772
-  def _reduce_194( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 776
+  def _reduce_198( val, _values, result )
     result = ast AST::ASTArray
    result
   end
 .,.,
 
- # reduce 195 omitted
+ # reduce 199 omitted
 
- # reduce 196 omitted
+ # reduce 200 omitted
 
- # reduce 197 omitted
+ # reduce 201 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 777
-  def _reduce_198( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 781
+  def _reduce_202( val, _values, result )
  result = nil
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 782
-  def _reduce_199( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 786
+  def _reduce_203( val, _values, result )
     result = ast AST::Regex, :value => val[0][:value]
    result
   end
 .,.,
 
+module_eval <<'.,.,', 'grammar.ra', 794
+  def _reduce_204( val, _values, result )
+    if val[1].instance_of?(AST::ASTHash)
+        result = val[1]
+    else
+        result = ast AST::ASTHash, { :value => val[1] }
+    end
+   result
+  end
+.,.,
+
+module_eval <<'.,.,', 'grammar.ra', 801
+  def _reduce_205( val, _values, result )
+    if val[1].instance_of?(AST::ASTHash)
+        result = val[1]
+    else
+        result = ast AST::ASTHash, { :value => val[1] }
+    end
+   result
+  end
+.,.,
+
+module_eval <<'.,.,', 'grammar.ra', 803
+  def _reduce_206( val, _values, result )
+    result = ast AST::ASTHash
+   result
+  end
+.,.,
+
+ # reduce 207 omitted
+
+module_eval <<'.,.,', 'grammar.ra', 813
+  def _reduce_208( 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
+  end
+.,.,
+
+module_eval <<'.,.,', 'grammar.ra', 817
+  def _reduce_209( val, _values, result )
+    result = ast AST::ASTHash, { :value => { val[0] => val[2] } }
+   result
+  end
+.,.,
+
+module_eval <<'.,.,', 'grammar.ra', 818
+  def _reduce_210( val, _values, result )
+ result = val[0][:value]
+   result
+  end
+.,.,
+
+module_eval <<'.,.,', 'grammar.ra', 819
+  def _reduce_211( val, _values, result )
+ result = val[0][:value]
+   result
+  end
+.,.,
+
+module_eval <<'.,.,', 'grammar.ra', 820
+  def _reduce_212( val, _values, result )
+ result = val[0][:value]
+   result
+  end
+.,.,
+
+module_eval <<'.,.,', 'grammar.ra', 825
+  def _reduce_213( val, _values, result )
+    result = ast AST::HashOrArrayAccess, :variable => val[0][:value], :key => val[2]
+   result
+  end
+.,.,
+
+ # reduce 214 omitted
+
+module_eval <<'.,.,', 'grammar.ra', 830
+  def _reduce_215( val, _values, result )
+    result = ast AST::HashOrArrayAccess, :variable => val[0], :key => val[2]
+   result
+  end
+.,.,
+
  def _reduce_none( val, _values, result )
   result
  end
diff --git a/lib/puppet/parser/scope.rb b/lib/puppet/parser/scope.rb
index eda53a8..12c645a 100644
--- a/lib/puppet/parser/scope.rb
+++ b/lib/puppet/parser/scope.rb
@@ -336,8 +336,11 @@ class Puppet::Parser::Scope
             # lookup the value in the scope if it exists and insert the var
             table[name] = lookupvar(name)
             # concatenate if string, append if array, nothing for other types
-            if value.is_a?(Array)
+            case value
+            when Array
                 table[name] += value
+            when Hash
+                table[name].merge!(value)
             else
                 table[name] << value
             end
diff --git a/spec/unit/parser/ast/asthash.rb b/spec/unit/parser/ast/asthash.rb
new file mode 100644
index 0000000..4c700fe
--- /dev/null
+++ b/spec/unit/parser/ast/asthash.rb
@@ -0,0 +1,64 @@
+#!/usr/bin/env ruby
+
+require File.dirname(__FILE__) + '/../../../spec_helper'
+
+describe Puppet::Parser::AST::ASTHash do
+    before :each do
+        @scope = Puppet::Parser::Scope.new()
+    end
+
+    it "should have a [] accessor" do
+        hash = Puppet::Parser::AST::ASTHash.new(:value => {})
+        hash.should respond_to(:[])
+    end
+
+    it "should have a merge functionality" do
+        hash = Puppet::Parser::AST::ASTHash.new(:value => {})
+        hash.should respond_to(:merge)
+    end
+
+    it "should be able to merge 2 AST hashes" do
+        hash = Puppet::Parser::AST::ASTHash.new(:value => { "a" => "b" })
+
+        hash.merge(Puppet::Parser::AST::ASTHash.new(:value => {"c" => "d"}))
+
+        hash.value.should == { "a" => "b", "c" => "d" }
+    end
+
+    it "should be able to merge with a ruby Hash" do
+        hash = Puppet::Parser::AST::ASTHash.new(:value => { "a" => "b" })
+
+        hash.merge({"c" => "d"})
+
+        hash.value.should == { "a" => "b", "c" => "d" }
+    end
+
+    it "should evaluate each hash value" do
+        key1 = stub "key1"
+        value1 = stub "value1"
+        key2 = stub "key2"
+        value2 = stub "value2"
+
+        value1.expects(:safeevaluate).with(@scope).returns("b")
+        value2.expects(:safeevaluate).with(@scope).returns("d")
+
+        operator = Puppet::Parser::AST::ASTHash.new(:value => { key1 => value1, key2 => value2})
+        operator.evaluate(@scope)
+    end
+
+    it "should return an evaluated hash" do
+        key1 = stub "key1"
+        value1 = stub "value1", :safeevaluate => "b"
+        key2 = stub "key2"
+        value2 = stub "value2", :safeevaluate => "d"
+
+        operator = Puppet::Parser::AST::ASTHash.new(:value => { key1 => value1, key2 => value2})
+        operator.evaluate(@scope).should == { key1 => "b", key2 => "d" }
+    end
+
+    it "should return a valid string with to_s" do
+        hash = Puppet::Parser::AST::ASTHash.new(:value => { "a" => "b", "c" => "d" })
+
+        hash.to_s.should == '{a => b, c => d}'
+    end
+end
diff --git a/spec/unit/parser/ast/leaf.rb b/spec/unit/parser/ast/leaf.rb
index 640c252..12ec271 100755
--- a/spec/unit/parser/ast/leaf.rb
+++ b/spec/unit/parser/ast/leaf.rb
@@ -94,6 +94,89 @@ describe Puppet::Parser::AST::Undef do
     end
 end
 
+describe Puppet::Parser::AST::HashOrArrayAccess do
+    before :each do
+        @scope = stub 'scope'
+    end
+
+    it "should evaluate the variable part if necessary" do
+        @scope.stubs(:lookupvar).with("a").returns(["b"])
+
+        variable = stub 'variable', :evaluate => "a"
+        access = Puppet::Parser::AST::HashOrArrayAccess.new(:variable => variable, :key => 0 )
+
+        variable.expects(:safeevaluate).with(@scope).returns("a")
+
+        access.evaluate(@scope).should == "b"
+    end
+
+    it "should evaluate the access key part if necessary" do
+        @scope.stubs(:lookupvar).with("a").returns(["b"])
+
+        index = stub 'index', :evaluate => 0
+        access = Puppet::Parser::AST::HashOrArrayAccess.new(:variable => "a", :key => index )
+
+        index.expects(:safeevaluate).with(@scope).returns(0)
+
+        access.evaluate(@scope).should == "b"
+    end
+
+    it "should be able to return an array member" do
+        @scope.stubs(:lookupvar).with("a").returns(["val1", "val2", "val3"])
+
+        access = Puppet::Parser::AST::HashOrArrayAccess.new(:variable => "a", :key => 1 )
+
+        access.evaluate(@scope).should == "val2"
+    end
+
+    it "should be able to return an hash value" do
+        @scope.stubs(:lookupvar).with("a").returns({ "key1" => "val1", "key2" => "val2", "key3" => "val3" })
+
+        access = Puppet::Parser::AST::HashOrArrayAccess.new(:variable => "a", :key => "key2" )
+
+        access.evaluate(@scope).should == "val2"
+    end
+
+    it "should raise an error if the variable lookup didn't return an hash or an array" do
+        @scope.stubs(:lookupvar).with("a").returns("I'm a string")
+
+        access = Puppet::Parser::AST::HashOrArrayAccess.new(:variable => "a", :key => "key2" )
+
+        lambda { access.evaluate(@scope) }.should raise_error
+    end
+
+    it "should raise an error if the variable wasn't in the scope" do
+        @scope.stubs(:lookupvar).with("a").returns(nil)
+
+        access = Puppet::Parser::AST::HashOrArrayAccess.new(:variable => "a", :key => "key2" )
+
+        lambda { access.evaluate(@scope) }.should raise_error
+    end
+
+    it "should return a correct string representation" do
+        access = Puppet::Parser::AST::HashOrArrayAccess.new(:variable => "a", :key => "key2" )
+        access.to_s.should == '$a[key2]'
+    end
+
+    it "should work with recursive hash access" do
+        @scope.stubs(:lookupvar).with("a").returns({ "key" => { "subkey" => "b" }})
+
+        access1 = Puppet::Parser::AST::HashOrArrayAccess.new(:variable => "a", :key => "key")
+        access2 = Puppet::Parser::AST::HashOrArrayAccess.new(:variable => access1, :key => "subkey")
+
+        access2.evaluate(@scope).should == 'b'
+    end
+
+    it "should work with interleaved array and hash access" do
+        @scope.stubs(:lookupvar).with("a").returns({ "key" => [ "a" , "b" ]})
+
+        access1 = Puppet::Parser::AST::HashOrArrayAccess.new(:variable => "a", :key => "key")
+        access2 = Puppet::Parser::AST::HashOrArrayAccess.new(:variable => access1, :key => 1)
+
+        access2.evaluate(@scope).should == 'b'
+    end
+end
+
 describe Puppet::Parser::AST::Regex do
     before :each do
         @scope = stub 'scope'
diff --git a/spec/unit/parser/scope.rb b/spec/unit/parser/scope.rb
index 04ae304..2f553e4 100755
--- a/spec/unit/parser/scope.rb
+++ b/spec/unit/parser/scope.rb
@@ -64,6 +64,11 @@ describe Puppet::Parser::Scope do
             @scope.lookupvar("var").should == "yep"
         end
 
+        it "should be able to look up hashes" do
+            @scope.setvar("var", {"a" => "b"})
+            @scope.lookupvar("var").should == {"a" => "b"}
+        end
+
         it "should be able to look up variables in parent scopes" do
             @topscope.setvar("var", "parentval")
             @scope.lookupvar("var").should == "parentval"
@@ -167,6 +172,11 @@ describe Puppet::Parser::Scope do
             @scope.lookupvar("var").should == [4,2]
         end
 
+        it "it should store the merged hash {a => b, c => d}" do
+            @topscope.setvar("var",{"a" => "b"}, :append => false)
+            @scope.setvar("var",{"c" => "d"}, :append => true)
+            @scope.lookupvar("var").should == {"a" => "b", "c" => "d"}
+        end
     end
 
     describe "when calling number?" do
diff --git a/test/data/snippets/hash.pp b/test/data/snippets/hash.pp
new file mode 100644
index 0000000..d332498
--- /dev/null
+++ b/test/data/snippets/hash.pp
@@ -0,0 +1,33 @@
+
+$hash = { "file" => "/tmp/myhashfile1" }
+
+file {
+    $hash["file"]:
+        ensure => file, content => "content";
+}
+
+$hash2 = { "a" => { key => "/tmp/myhashfile2" }}
+
+file {
+    $hash2["a"][key]:
+        ensure => file, content => "content";
+}
+
+define test($a = { "b" => "c" }) {
+    file {
+        $a["b"]:
+            ensure => file, content => "content"
+    }
+}
+
+test {
+    "test":
+        a => { "b" => "/tmp/myhashfile3" }
+}
+
+$hash3 = { mykey => "/tmp/myhashfile4" }
+$key = "mykey"
+
+file {
+    $hash3[$key]: ensure => file, content => "content"
+}
diff --git a/test/language/snippets.rb b/test/language/snippets.rb
index 5c7805c..bfd0e53 100755
--- a/test/language/snippets.rb
+++ b/test/language/snippets.rb
@@ -486,6 +486,13 @@ class TestSnippets < Test::Unit::TestCase
         assert_file("/tmp/testiftest","if test");
     end
 
+    def snippet_hash
+        assert_file("/tmp/myhashfile1","hash test 1");
+        assert_file("/tmp/myhashfile2","hash test 2");
+        assert_file("/tmp/myhashfile3","hash test 3");
+        assert_file("/tmp/myhashfile4","hash test 4");
+    end
+
     # Iterate across each of the snippets and create a test.
     Dir.entries(snippetdir).sort.each { |file|
         next if file =~ /^\./

-- 
Puppet packaging for Debian



More information about the Pkg-puppet-devel mailing list