Add support for bitwise operations in ESSL3

Add support for <<, >>, &, |, ^, and their compound assignment variants
<<=, >>=, &=, |=, ^=. Also add support for bitwise not (~).

BUG=angle:870

Change-Id: I5e6a835409589556d5d58d58078fdf505cfd8da5
Reviewed-on: https://chromium-review.googlesource.com/241850
Tested-by: Olli Etuaho <oetuaho@nvidia.com>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
diff --git a/src/compiler/translator/BaseTypes.h b/src/compiler/translator/BaseTypes.h
index 87bf4ab..0872df5 100644
--- a/src/compiler/translator/BaseTypes.h
+++ b/src/compiler/translator/BaseTypes.h
@@ -258,6 +258,11 @@
     return false;
 }
 
+inline bool IsInteger(TBasicType type)
+{
+    return type == EbtInt || type == EbtUInt;
+}
+
 inline bool SupportsPrecision(TBasicType type)
 {
     return type == EbtFloat || type == EbtInt || type == EbtUInt || IsSampler(type);
diff --git a/src/compiler/translator/ConstantUnion.h b/src/compiler/translator/ConstantUnion.h
index e7e0cf9..31ff2cc 100644
--- a/src/compiler/translator/ConstantUnion.h
+++ b/src/compiler/translator/ConstantUnion.h
@@ -254,7 +254,10 @@
     ConstantUnion operator<<(const ConstantUnion& constant) const
     { 
         ConstantUnion returnValue;
-        assert(type == constant.type);
+        // The signedness of the second parameter might be different, but we
+        // don't care, since the result is undefined if the second parameter is
+        // negative, and aliasing should not be a problem with unions.
+        assert(constant.type == EbtInt || constant.type == EbtUInt);
         switch (type) {
         case EbtInt: returnValue.setIConst(iConst << constant.iConst); break;
         case EbtUInt: returnValue.setUConst(uConst << constant.uConst); break;
@@ -267,7 +270,7 @@
     ConstantUnion operator&(const ConstantUnion& constant) const
     { 
         ConstantUnion returnValue;
-        assert(type == constant.type);
+        assert(constant.type == EbtInt || constant.type == EbtUInt);
         switch (type) {
         case EbtInt:  returnValue.setIConst(iConst & constant.iConst); break;
         case EbtUInt:  returnValue.setUConst(uConst & constant.uConst); break;
diff --git a/src/compiler/translator/IntermNode.cpp b/src/compiler/translator/IntermNode.cpp
index d4aab63..c64c155 100644
--- a/src/compiler/translator/IntermNode.cpp
+++ b/src/compiler/translator/IntermNode.cpp
@@ -265,6 +265,11 @@
       case EOpMatrixTimesMatrixAssign:
       case EOpDivAssign:
       case EOpModAssign:
+      case EOpBitShiftLeftAssign:
+      case EOpBitShiftRightAssign:
+      case EOpBitwiseAndAssign:
+      case EOpBitwiseXorAssign:
+      case EOpBitwiseOrAssign:
         return true;
       default:
         return false;
@@ -318,6 +323,10 @@
         if (mOperand->getBasicType() != EbtBool)
             return false;
         break;
+      // bit-wise not is already checked
+      case EOpBitwiseNot:
+        break;
+
       case EOpNegative:
       case EOpPositive:
       case EOpPostIncrement:
@@ -367,8 +376,42 @@
     }
 
     // GLSL ES 2.0 does not support implicit type casting.
-    // So the basic type should always match.
-    if (mLeft->getBasicType() != mRight->getBasicType())
+    // So the basic type should usually match.
+    bool basicTypesMustMatch = true;
+
+    // Check ops which require integer / ivec parameters
+    switch (mOp)
+    {
+      case EOpBitShiftLeft:
+      case EOpBitShiftRight:
+      case EOpBitShiftLeftAssign:
+      case EOpBitShiftRightAssign:
+        // Unsigned can be bit-shifted by signed and vice versa, but we need to
+        // check that the basic type is an integer type.
+        basicTypesMustMatch = false;
+        if (!IsInteger(mLeft->getBasicType()) || !IsInteger(mRight->getBasicType()))
+        {
+            return false;
+        }
+        break;
+      case EOpBitwiseAnd:
+      case EOpBitwiseXor:
+      case EOpBitwiseOr:
+      case EOpBitwiseAndAssign:
+      case EOpBitwiseXorAssign:
+      case EOpBitwiseOrAssign:
+        // It is enough to check the type of only one operand, since later it
+        // is checked that the operand types match.
+        if (!IsInteger(mLeft->getBasicType()))
+        {
+            return false;
+        }
+        break;
+      default:
+        break;
+    }
+
+    if (basicTypesMustMatch && mLeft->getBasicType() != mRight->getBasicType())
     {
         return false;
     }
@@ -563,10 +606,20 @@
       case EOpSub:
       case EOpDiv:
       case EOpMod:
+      case EOpBitShiftLeft:
+      case EOpBitShiftRight:
+      case EOpBitwiseAnd:
+      case EOpBitwiseXor:
+      case EOpBitwiseOr:
       case EOpAddAssign:
       case EOpSubAssign:
       case EOpDivAssign:
       case EOpModAssign:
+      case EOpBitShiftLeftAssign:
+      case EOpBitShiftRightAssign:
+      case EOpBitwiseAndAssign:
+      case EOpBitwiseXorAssign:
+      case EOpBitwiseOrAssign:
         if ((mLeft->isMatrix() && mRight->isVector()) ||
             (mLeft->isVector() && mRight->isMatrix()))
         {
@@ -582,13 +635,14 @@
             if (!mLeft->isScalar() && !mRight->isScalar())
                 return false;
 
-            // In the case of compound assignment, the right side needs to be a
-            // scalar. Otherwise a vector/matrix would be assigned to a scalar.
+            // In the case of compound assignment other than multiply-assign,
+            // the right side needs to be a scalar. Otherwise a vector/matrix
+            // would be assigned to a scalar. A scalar can't be shifted by a
+            // vector either.
             if (!mRight->isScalar() &&
-                (mOp == EOpAddAssign ||
-                mOp == EOpSubAssign ||
-                mOp == EOpDivAssign ||
-                mOp == EOpModAssign))
+                (isAssignment() ||
+                mOp == EOpBitShiftLeft ||
+                mOp == EOpBitShiftRight))
                 return false;
 
             // Operator cannot be of type pure assignment.
@@ -914,6 +968,32 @@
             }
             break;
 
+          case EOpBitwiseAnd:
+            tempConstArray = new ConstantUnion[objectSize];
+            for (size_t i = 0; i < objectSize; i++)
+                tempConstArray[i] = unionArray[i] & rightUnionArray[i];
+            break;
+          case EOpBitwiseXor:
+            tempConstArray = new ConstantUnion[objectSize];
+            for (size_t i = 0; i < objectSize; i++)
+                tempConstArray[i] = unionArray[i] ^ rightUnionArray[i];
+            break;
+          case EOpBitwiseOr:
+            tempConstArray = new ConstantUnion[objectSize];
+            for (size_t i = 0; i < objectSize; i++)
+                tempConstArray[i] = unionArray[i] | rightUnionArray[i];
+            break;
+          case EOpBitShiftLeft:
+            tempConstArray = new ConstantUnion[objectSize];
+            for (size_t i = 0; i < objectSize; i++)
+                tempConstArray[i] = unionArray[i] << rightUnionArray[i];
+            break;
+          case EOpBitShiftRight:
+            tempConstArray = new ConstantUnion[objectSize];
+            for (size_t i = 0; i < objectSize; i++)
+                tempConstArray[i] = unionArray[i] >> rightUnionArray[i];
+            break;
+
           case EOpLessThan:
             ASSERT(objectSize == 1);
             tempConstArray = new ConstantUnion[1];
@@ -1106,6 +1186,23 @@
                 }
                 break;
 
+              case EOpBitwiseNot:
+                switch (getType().getBasicType())
+                {
+                  case EbtInt:
+                    tempConstArray[i].setIConst(~unionArray[i].getIConst());
+                    break;
+                  case EbtUInt:
+                    tempConstArray[i].setUConst(~unionArray[i].getUConst());
+                    break;
+                  default:
+                    infoSink.info.message(
+                        EPrefixInternalError, getLine(),
+                        "Unary operation not folded into constant");
+                    return NULL;
+                }
+                break;
+
               default:
                 return NULL;
             }
diff --git a/src/compiler/translator/IntermNode.h b/src/compiler/translator/IntermNode.h
index 10f76e2..c0dd2e0 100644
--- a/src/compiler/translator/IntermNode.h
+++ b/src/compiler/translator/IntermNode.h
@@ -49,6 +49,7 @@
     EOpPositive,
     EOpLogicalNot,
     EOpVectorLogicalNot,
+    EOpBitwiseNot,
 
     EOpPostIncrement,
     EOpPostDecrement,
@@ -82,6 +83,13 @@
     EOpLogicalXor,
     EOpLogicalAnd,
 
+    EOpBitShiftLeft,
+    EOpBitShiftRight,
+
+    EOpBitwiseAnd,
+    EOpBitwiseXor,
+    EOpBitwiseOr,
+
     EOpIndexDirect,
     EOpIndexIndirect,
     EOpIndexDirectStruct,
@@ -213,7 +221,12 @@
     EOpMatrixTimesScalarAssign,
     EOpMatrixTimesMatrixAssign,
     EOpDivAssign,
-    EOpModAssign
+    EOpModAssign,
+    EOpBitShiftLeftAssign,
+    EOpBitShiftRightAssign,
+    EOpBitwiseAndAssign,
+    EOpBitwiseXorAssign,
+    EOpBitwiseOrAssign
 };
 
 class TIntermTraverser;
diff --git a/src/compiler/translator/Intermediate.cpp b/src/compiler/translator/Intermediate.cpp
index de72cfe..d33ef34 100644
--- a/src/compiler/translator/Intermediate.cpp
+++ b/src/compiler/translator/Intermediate.cpp
@@ -87,11 +87,14 @@
             return NULL;
         }
         break;
+      // Note that for bitwise ops, type checking is done in promote() to
+      // share code between ops and compound assignment
       default:
         break;
     }
 
-    if (left->getBasicType() != right->getBasicType())
+    // This check is duplicated between here and node->promote() as an optimization.
+    if (left->getBasicType() != right->getBasicType() && op != EOpBitShiftLeft && op != EOpBitShiftRight)
     {
         return NULL;
     }
@@ -193,23 +196,30 @@
     switch (op)
     {
       case EOpLogicalNot:
-        if (child->getType().getBasicType() != EbtBool ||
-            child->getType().isMatrix() ||
-            child->getType().isArray() ||
-            child->getType().isVector())
+        if (child->getBasicType() != EbtBool ||
+            child->isMatrix() ||
+            child->isArray() ||
+            child->isVector())
         {
             return NULL;
         }
         break;
-
+      case EOpBitwiseNot:
+        if ((child->getBasicType() != EbtInt && child->getBasicType() != EbtUInt) ||
+            child->isMatrix() ||
+            child->isArray())
+        {
+            return NULL;
+        }
+        break;
       case EOpPostIncrement:
       case EOpPreIncrement:
       case EOpPostDecrement:
       case EOpPreDecrement:
       case EOpNegative:
       case EOpPositive:
-        if (child->getType().getBasicType() == EbtStruct ||
-            child->getType().isArray())
+        if (child->getBasicType() == EbtStruct ||
+            child->isArray())
         {
             return NULL;
         }
diff --git a/src/compiler/translator/OutputGLSLBase.cpp b/src/compiler/translator/OutputGLSLBase.cpp
index e367a44..b98f5d5 100644
--- a/src/compiler/translator/OutputGLSLBase.cpp
+++ b/src/compiler/translator/OutputGLSLBase.cpp
@@ -234,6 +234,21 @@
       case EOpMatrixTimesMatrixAssign:
         writeTriplet(visit, "(", " *= ", ")");
         break;
+      case EOpBitShiftLeftAssign:
+        writeTriplet(visit, "(", " <<= ", ")");
+        break;
+      case EOpBitShiftRightAssign:
+        writeTriplet(visit, "(", " >>= ", ")");
+        break;
+      case EOpBitwiseAndAssign:
+        writeTriplet(visit, "(", " &= ", ")");
+        break;
+      case EOpBitwiseXorAssign:
+        writeTriplet(visit, "(", " ^= ", ")");
+        break;
+      case EOpBitwiseOrAssign:
+        writeTriplet(visit, "(", " |= ", ")");
+        break;
 
       case EOpIndexDirect:
         writeTriplet(visit, NULL, "[", "]");
@@ -346,6 +361,22 @@
       case EOpMod:
         writeTriplet(visit, "(", " % ", ")");
         break;
+      case EOpBitShiftLeft:
+        writeTriplet(visit, "(", " << ", ")");
+        break;
+      case EOpBitShiftRight:
+        writeTriplet(visit, "(", " >> ", ")");
+        break;
+      case EOpBitwiseAnd:
+        writeTriplet(visit, "(", " & ", ")");
+        break;
+      case EOpBitwiseXor:
+        writeTriplet(visit, "(", " ^ ", ")");
+        break;
+      case EOpBitwiseOr:
+        writeTriplet(visit, "(", " | ", ")");
+        break;
+
       case EOpEqual:
         writeTriplet(visit, "(", " == ", ")");
         break;
@@ -401,6 +432,7 @@
       case EOpPositive: preString = "(+"; break;
       case EOpVectorLogicalNot: preString = "not("; break;
       case EOpLogicalNot: preString = "(!"; break;
+      case EOpBitwiseNot: preString = "(~"; break;
 
       case EOpPostIncrement: preString = "("; postString = "++)"; break;
       case EOpPostDecrement: preString = "("; postString = "--)"; break;
diff --git a/src/compiler/translator/OutputHLSL.cpp b/src/compiler/translator/OutputHLSL.cpp
index 8ff8907..de1d4af 100644
--- a/src/compiler/translator/OutputHLSL.cpp
+++ b/src/compiler/translator/OutputHLSL.cpp
@@ -1396,6 +1396,11 @@
         break;
       case EOpDivAssign:               outputTriplet(visit, "(", " /= ", ")");          break;
       case EOpModAssign:               outputTriplet(visit, "(", " %= ", ")");          break;
+      case EOpBitShiftLeftAssign:      outputTriplet(visit, "(", " <<= ", ")");         break;
+      case EOpBitShiftRightAssign:     outputTriplet(visit, "(", " >>= ", ")");         break;
+      case EOpBitwiseAndAssign:        outputTriplet(visit, "(", " &= ", ")");          break;
+      case EOpBitwiseXorAssign:        outputTriplet(visit, "(", " ^= ", ")");          break;
+      case EOpBitwiseOrAssign:         outputTriplet(visit, "(", " |= ", ")");          break;
       case EOpIndexDirect:
         {
             const TType& leftType = node->getLeft()->getType();
@@ -1484,6 +1489,11 @@
       case EOpMul:               outputTriplet(visit, "(", " * ", ")"); break;
       case EOpDiv:               outputTriplet(visit, "(", " / ", ")"); break;
       case EOpMod:               outputTriplet(visit, "(", " % ", ")"); break;
+      case EOpBitShiftLeft:      outputTriplet(visit, "(", " << ", ")"); break;
+      case EOpBitShiftRight:     outputTriplet(visit, "(", " >> ", ")"); break;
+      case EOpBitwiseAnd:        outputTriplet(visit, "(", " & ", ")"); break;
+      case EOpBitwiseXor:        outputTriplet(visit, "(", " ^ ", ")"); break;
+      case EOpBitwiseOr:         outputTriplet(visit, "(", " | ", ")"); break;
       case EOpEqual:
       case EOpNotEqual:
         if (node->getLeft()->isScalar())
@@ -1593,6 +1603,7 @@
       case EOpPositive:         outputTriplet(visit, "(+", "", ")");         break;
       case EOpVectorLogicalNot: outputTriplet(visit, "(!", "", ")");         break;
       case EOpLogicalNot:       outputTriplet(visit, "(!", "", ")");         break;
+      case EOpBitwiseNot:       outputTriplet(visit, "(~", "", ")");         break;
       case EOpPostIncrement:    outputTriplet(visit, "(", "", "++)");        break;
       case EOpPostDecrement:    outputTriplet(visit, "(", "", "--)");        break;
       case EOpPreIncrement:     outputTriplet(visit, "(++", "", ")");        break;
diff --git a/src/compiler/translator/glslang.y b/src/compiler/translator/glslang.y
index c4b8f5f..26c9af2 100644
--- a/src/compiler/translator/glslang.y
+++ b/src/compiler/translator/glslang.y
@@ -515,10 +515,11 @@
             if ($$ == 0) {
                 const char* errorOp = "";
                 switch($1.op) {
-                case EOpNegative:   errorOp = "-"; break;
-                case EOpPositive:   errorOp = "+"; break;
-                case EOpLogicalNot: errorOp = "!"; break;
-                default: break;
+                  case EOpNegative:   errorOp = "-"; break;
+                  case EOpPositive:   errorOp = "+"; break;
+                  case EOpLogicalNot: errorOp = "!"; break;
+                  case EOpBitwiseNot: errorOp = "~"; break;
+                  default: break;
                 }
                 context->unaryOpError(@1, errorOp, $2->getCompleteString());
                 context->recover();
@@ -534,6 +535,10 @@
     : PLUS  { $$.op = EOpPositive; }
     | DASH  { $$.op = EOpNegative; }
     | BANG  { $$.op = EOpLogicalNot; }
+    | TILDE {
+        ES3_ONLY("~", @$, "bit-wise operator");
+        $$.op = EOpBitwiseNot;
+    }
     ;
 // Grammar Note:  No '*' or '&' unary ops.  Pointers are not supported.
 
@@ -588,6 +593,24 @@
 
 shift_expression
     : additive_expression { $$ = $1; }
+    | shift_expression LEFT_OP additive_expression {
+        ES3_ONLY("<<", @2, "bit-wise operator");
+        $$ = context->intermediate.addBinaryMath(EOpBitShiftLeft, $1, $3, @2);
+        if ($$ == 0) {
+            context->binaryOpError(@2, "<<", $1->getCompleteString(), $3->getCompleteString());
+            context->recover();
+            $$ = $1;
+        }
+    }
+    | shift_expression RIGHT_OP additive_expression {
+        ES3_ONLY(">>", @2, "bit-wise operator");
+        $$ = context->intermediate.addBinaryMath(EOpBitShiftRight, $1, $3, @2);
+        if ($$ == 0) {
+            context->binaryOpError(@2, ">>", $1->getCompleteString(), $3->getCompleteString());
+            context->recover();
+            $$ = $1;
+        }
+    }
     ;
 
 relational_expression
@@ -660,14 +683,41 @@
 
 and_expression
     : equality_expression { $$ = $1; }
+    | and_expression AMPERSAND equality_expression {
+        ES3_ONLY("&", @2, "bit-wise operator");
+        $$ = context->intermediate.addBinaryMath(EOpBitwiseAnd, $1, $3, @2);
+        if ($$ == 0) {
+            context->binaryOpError(@2, "&", $1->getCompleteString(), $3->getCompleteString());
+            context->recover();
+            $$ = $1;
+        }
+    }
     ;
 
 exclusive_or_expression
     : and_expression { $$ = $1; }
+    | exclusive_or_expression CARET and_expression {
+        ES3_ONLY("^", @2, "bit-wise operator");
+        $$ = context->intermediate.addBinaryMath(EOpBitwiseXor, $1, $3, @2);
+        if ($$ == 0) {
+            context->binaryOpError(@2, "^", $1->getCompleteString(), $3->getCompleteString());
+            context->recover();
+            $$ = $1;
+        }
+    }
     ;
 
 inclusive_or_expression
     : exclusive_or_expression { $$ = $1; }
+    | inclusive_or_expression VERTICAL_BAR exclusive_or_expression {
+        ES3_ONLY("|", @2, "bit-wise operator");
+        $$ = context->intermediate.addBinaryMath(EOpBitwiseOr, $1, $3, @2);
+        if ($$ == 0) {
+            context->binaryOpError(@2, "|", $1->getCompleteString(), $3->getCompleteString());
+            context->recover();
+            $$ = $1;
+        }
+    }
     ;
 
 logical_and_expression
@@ -754,6 +804,26 @@
     }
     | ADD_ASSIGN   { $$.op = EOpAddAssign; }
     | SUB_ASSIGN   { $$.op = EOpSubAssign; }
+    | LEFT_ASSIGN {
+        ES3_ONLY("<<=", @$, "bit-wise operator");
+        $$.op = EOpBitShiftLeftAssign;
+    }
+    | RIGHT_ASSIGN {
+        ES3_ONLY(">>=", @$, "bit-wise operator");
+        $$.op = EOpBitShiftRightAssign;
+    }
+    | AND_ASSIGN {
+        ES3_ONLY("&=", @$, "bit-wise operator");
+        $$.op = EOpBitwiseAndAssign;
+    }
+    | XOR_ASSIGN {
+        ES3_ONLY("^=", @$, "bit-wise operator");
+        $$.op = EOpBitwiseXorAssign;
+    }
+    | OR_ASSIGN {
+        ES3_ONLY("|=", @$, "bit-wise operator");
+        $$.op = EOpBitwiseOrAssign;
+    }
     ;
 
 expression
diff --git a/src/compiler/translator/glslang_tab.cpp b/src/compiler/translator/glslang_tab.cpp
index 891bbed..214cd09 100644
--- a/src/compiler/translator/glslang_tab.cpp
+++ b/src/compiler/translator/glslang_tab.cpp
@@ -619,16 +619,16 @@
 /* YYFINAL -- State number of the termination state.  */
 #define YYFINAL  114
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   2378
+#define YYLAST   2394
 
 /* YYNTOKENS -- Number of terminals.  */
 #define YYNTOKENS  128
 /* YYNNTS -- Number of nonterminals.  */
 #define YYNNTS  91
 /* YYNRULES -- Number of rules.  */
-#define YYNRULES  252
+#define YYNRULES  263
 /* YYNSTATES -- Number of states.  */
-#define YYNSTATES  376
+#define YYNSTATES  392
 
 /* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned
    by yylex, with out-of-bounds checking.  */
@@ -690,29 +690,30 @@
        0,   205,   205,   206,   209,   233,   236,   241,   246,   251,
      256,   262,   265,   268,   271,   274,   284,   297,   305,   422,
      425,   433,   436,   442,   446,   453,   459,   468,   476,   479,
-     489,   492,   502,   512,   534,   535,   536,   541,   542,   550,
-     558,   570,   571,   579,   590,   594,   595,   605,   615,   625,
-     638,   639,   649,   662,   666,   670,   674,   675,   688,   689,
-     702,   703,   716,   717,   734,   735,   748,   749,   750,   751,
-     755,   756,   760,   763,   774,   782,   790,   817,   823,   834,
-     838,   842,   846,   853,   909,   912,   919,   927,   948,   969,
-     979,  1007,  1012,  1022,  1027,  1037,  1040,  1043,  1046,  1052,
-    1059,  1062,  1066,  1070,  1074,  1081,  1085,  1089,  1096,  1100,
-    1104,  1111,  1120,  1126,  1129,  1135,  1141,  1148,  1157,  1166,
-    1174,  1177,  1184,  1188,  1195,  1198,  1202,  1206,  1215,  1224,
-    1232,  1242,  1254,  1257,  1260,  1266,  1273,  1276,  1282,  1285,
-    1288,  1294,  1297,  1312,  1316,  1320,  1324,  1328,  1332,  1337,
-    1342,  1347,  1352,  1357,  1362,  1367,  1372,  1377,  1382,  1387,
-    1392,  1397,  1402,  1407,  1412,  1417,  1422,  1427,  1432,  1437,
-    1441,  1445,  1449,  1453,  1457,  1461,  1465,  1469,  1473,  1477,
-    1481,  1485,  1489,  1493,  1497,  1505,  1513,  1517,  1530,  1530,
-    1533,  1533,  1539,  1542,  1558,  1561,  1570,  1574,  1580,  1587,
-    1602,  1606,  1610,  1611,  1617,  1618,  1619,  1620,  1621,  1625,
-    1626,  1626,  1626,  1636,  1637,  1641,  1641,  1642,  1642,  1647,
-    1650,  1660,  1663,  1669,  1670,  1674,  1682,  1686,  1696,  1701,
-    1718,  1718,  1723,  1723,  1730,  1730,  1738,  1741,  1747,  1750,
-    1756,  1760,  1767,  1774,  1781,  1788,  1799,  1808,  1812,  1819,
-    1822,  1828,  1828
+     489,   492,   502,   512,   535,   536,   537,   538,   546,   547,
+     555,   563,   575,   576,   584,   595,   596,   605,   617,   618,
+     628,   638,   648,   661,   662,   672,   685,   686,   698,   699,
+     711,   712,   724,   725,   738,   739,   752,   753,   766,   767,
+     784,   785,   798,   799,   800,   801,   805,   806,   807,   811,
+     815,   819,   823,   830,   833,   844,   852,   860,   887,   893,
+     904,   908,   912,   916,   923,   979,   982,   989,   997,  1018,
+    1039,  1049,  1077,  1082,  1092,  1097,  1107,  1110,  1113,  1116,
+    1122,  1129,  1132,  1136,  1140,  1144,  1151,  1155,  1159,  1166,
+    1170,  1174,  1181,  1190,  1196,  1199,  1205,  1211,  1218,  1227,
+    1236,  1244,  1247,  1254,  1258,  1265,  1268,  1272,  1276,  1285,
+    1294,  1302,  1312,  1324,  1327,  1330,  1336,  1343,  1346,  1352,
+    1355,  1358,  1364,  1367,  1382,  1386,  1390,  1394,  1398,  1402,
+    1407,  1412,  1417,  1422,  1427,  1432,  1437,  1442,  1447,  1452,
+    1457,  1462,  1467,  1472,  1477,  1482,  1487,  1492,  1497,  1502,
+    1507,  1511,  1515,  1519,  1523,  1527,  1531,  1535,  1539,  1543,
+    1547,  1551,  1555,  1559,  1563,  1567,  1575,  1583,  1587,  1600,
+    1600,  1603,  1603,  1609,  1612,  1628,  1631,  1640,  1644,  1650,
+    1657,  1672,  1676,  1680,  1681,  1687,  1688,  1689,  1690,  1691,
+    1695,  1696,  1696,  1696,  1706,  1707,  1711,  1711,  1712,  1712,
+    1717,  1720,  1730,  1733,  1739,  1740,  1744,  1752,  1756,  1766,
+    1771,  1788,  1788,  1793,  1793,  1800,  1800,  1808,  1811,  1817,
+    1820,  1826,  1830,  1837,  1844,  1851,  1858,  1869,  1878,  1882,
+    1889,  1892,  1898,  1898
 };
 #endif
 
@@ -800,12 +801,12 @@
 };
 # endif
 
-#define YYPACT_NINF -315
+#define YYPACT_NINF -341
 
 #define yypact_value_is_default(Yystate) \
-  (!!((Yystate) == (-315)))
+  (!!((Yystate) == (-341)))
 
-#define YYTABLE_NINF -216
+#define YYTABLE_NINF -227
 
 #define yytable_value_is_error(Yytable_value) \
   0
@@ -814,118 +815,122 @@
      STATE-NUM.  */
 static const yytype_int16 yypact[] =
 {
-    2016,     4,  -315,  -315,  -315,   121,  -315,  -315,  -315,  -315,
-    -315,  -315,  -315,  -315,  -315,  -315,  -315,  -315,  -315,  -315,
-    -315,  -315,  -315,  -315,  -315,  -315,  -315,  -315,  -315,  -315,
-    -315,  -315,  -315,  -315,  -315,  -315,  -315,     1,  -315,  -315,
-     -55,  -315,  -315,  -315,  -315,  -315,  -315,  -315,  -315,  -315,
-    -315,  -315,  -315,  -315,  -315,  -315,  -315,  -315,  -315,   -43,
-    -315,  -315,   -46,   -33,   -30,     5,   -29,  -315,    96,    16,
-    1133,  -315,  -315,  2301,    16,  -315,    10,  -315,  1941,  -315,
-    -315,  -315,  -315,  2301,  -315,  -315,  -315,  -315,  -315,    43,
-      56,  -315,    48,  -315,    24,  -315,  -315,  -315,  -315,  -315,
-    2165,   103,    99,  -315,    58,   -83,  -315,    71,  -315,  2091,
-    -315,  -315,  -315,  1494,  -315,  -315,    -6,  2091,  -315,    51,
-     -79,  -315,   361,  -315,  -315,  -315,  -315,    99,  2165,   -69,
-    -315,  1203,  1494,  -315,   144,  2165,    99,  1686,  -315,    86,
-    -315,  -315,  -315,  -315,  1494,  1494,  1494,  -315,  -315,  -315,
-    -315,  -315,     8,  -315,  -315,  -315,    91,   -13,  1589,    93,
-    -315,  1494,    50,     3,  -315,   -48,    92,  -315,  -315,  -315,
-     107,   106,   -73,  -315,    95,  -315,  -315,  1771,  2091,   105,
-    -315,    56,    94,    97,  -315,   101,   102,   104,  1301,   109,
-     100,  -315,  -315,    45,  -315,  -315,     9,  -315,   -46,    32,
-    -315,  -315,  -315,  -315,   477,  -315,  -315,  -315,  -315,   110,
-    -315,  -315,  1396,  1494,  -315,   108,  -315,  -315,    99,   111,
-      20,  -315,   -56,  -315,  -315,  -315,    -9,  -315,  -315,  1494,
-    2233,  -315,  -315,  1494,   115,  -315,  -315,  -315,  1494,  1494,
-    1494,  1494,  1494,  1494,  1494,  1494,  1494,  1494,  1494,  1494,
-    1494,  1494,  1494,  -315,  -315,  1856,  -315,  -315,  -315,  -315,
-    -315,   112,  -315,  1494,  -315,  -315,    41,  -315,  -315,   593,
-    -315,  -315,  -315,  -315,  -315,  -315,  1494,  1494,  -315,  -315,
-    -315,  1494,  -315,   118,  -315,  -315,    46,  1494,    99,  -315,
-     -19,  -315,  -315,   119,    89,    86,   124,  -315,  -315,  -315,
-    -315,  -315,  -315,    50,    50,  -315,  -315,  -315,  -315,   -48,
-     -48,  -315,   107,   106,    75,  -315,   154,    48,   825,   941,
-      -8,  -315,  1038,   593,  -315,  -315,   122,  -315,  -315,   123,
-    -315,  1494,  -315,  -315,  1494,   127,  -315,  -315,  -315,  -315,
-    1038,   112,    89,    99,  2165,   117,   125,  -315,  -315,   126,
-    -315,  1494,  -315,   140,   130,   215,  -315,   143,   709,  -315,
-     145,    -4,  1494,   709,   112,  1494,  -315,  -315,  -315,  -315,
-     146,    89,  -315,  -315,  -315,  -315
+    2032,   -25,  -341,  -341,  -341,   147,  -341,  -341,  -341,  -341,
+    -341,  -341,  -341,  -341,  -341,  -341,  -341,  -341,  -341,  -341,
+    -341,  -341,  -341,  -341,  -341,  -341,  -341,  -341,  -341,  -341,
+    -341,  -341,  -341,  -341,  -341,  -341,  -341,    98,  -341,  -341,
+     -42,  -341,  -341,  -341,  -341,  -341,  -341,  -341,  -341,  -341,
+    -341,  -341,  -341,  -341,  -341,  -341,  -341,  -341,  -341,   -57,
+    -341,  -341,   -55,   -28,   -30,     2,   -66,  -341,    99,    14,
+    1149,  -341,  -341,  2317,    14,  -341,   -19,  -341,  1957,  -341,
+    -341,  -341,  -341,  2317,  -341,  -341,  -341,  -341,  -341,    21,
+      37,  -341,    26,  -341,    55,  -341,  -341,  -341,  -341,  -341,
+    2181,   114,   104,  -341,    53,   -82,  -341,    58,  -341,  2107,
+    -341,  -341,  -341,  1510,  -341,  -341,    56,  2107,  -341,    48,
+     -83,  -341,   377,  -341,  -341,  -341,  -341,   104,  2181,   -38,
+    -341,  1219,  1510,  -341,   129,  2181,   104,  1702,  -341,    73,
+    -341,  -341,  -341,  -341,  1510,  1510,  1510,  -341,  -341,  -341,
+    -341,  -341,  -341,   -60,  -341,  -341,  -341,    77,   -13,  1605,
+      93,  -341,  1510,    44,    15,   100,   -51,    97,    76,    83,
+      85,   119,   118,   -65,  -341,   105,  -341,  -341,  1787,  2107,
+     109,  -341,    37,   101,   103,  -341,   110,   116,   108,  1317,
+     120,   117,  -341,  -341,    47,  -341,  -341,   -10,  -341,   -55,
+      65,  -341,  -341,  -341,  -341,   493,  -341,  -341,  -341,  -341,
+     107,  -341,  -341,  1412,  1510,  -341,   111,  -341,  -341,   104,
+     121,    -8,  -341,   -56,  -341,  -341,  -341,    -3,  -341,  -341,
+    1510,  2249,  -341,  -341,  1510,   124,  -341,  -341,  -341,  1510,
+    1510,  1510,  1510,  1510,  1510,  1510,  1510,  1510,  1510,  1510,
+    1510,  1510,  1510,  1510,  1510,  1510,  1510,  1510,  1510,  -341,
+    -341,  1872,  -341,  -341,  -341,  -341,  -341,   123,  -341,  1510,
+    -341,  -341,     5,  -341,  -341,   609,  -341,  -341,  -341,  -341,
+    -341,  -341,  -341,  -341,  -341,  -341,  -341,  1510,  1510,  -341,
+    -341,  -341,  1510,  -341,   122,  -341,  -341,    16,  1510,   104,
+    -341,   -24,  -341,  -341,   125,   126,    73,   130,  -341,  -341,
+    -341,  -341,  -341,  -341,    44,    44,    15,    15,   100,   100,
+     100,   100,   -51,   -51,    97,    76,    83,    85,   119,   118,
+      79,  -341,   169,    26,   841,   957,     7,  -341,  1054,   609,
+    -341,  -341,   128,  -341,  -341,   131,  -341,  1510,  -341,  -341,
+    1510,   132,  -341,  -341,  -341,  -341,  1054,   123,   126,   104,
+    2181,   135,   133,  -341,  -341,   136,  -341,  1510,  -341,   134,
+     139,   216,  -341,   137,   725,  -341,   140,     9,  1510,   725,
+     123,  1510,  -341,  -341,  -341,  -341,   141,   126,  -341,  -341,
+    -341,  -341
 };
 
   /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
      Performed when YYTABLE does not specify something else to do.  Zero
      means the default is an error.  */
-static const yytype_uint8 yydefact[] =
+static const yytype_uint16 yydefact[] =
 {
-       0,     0,   132,   133,   134,     0,   116,   124,   147,   144,
-     145,   146,   151,   152,   153,   154,   155,   156,   148,   149,
-     150,   157,   158,   159,   160,   161,   162,   125,   126,   129,
-     117,   163,   164,   165,   166,   167,   168,     0,   114,   113,
-       0,   143,   169,   171,   184,   185,   172,   173,   174,   175,
-     176,   177,   178,   179,   180,   170,   181,   182,   183,     0,
-     187,   250,   251,     0,    85,    95,     0,   100,   105,   121,
-       0,   119,   111,     0,   122,   130,   141,   186,     0,   247,
-     249,   118,   110,     0,   127,   128,     2,     3,   190,     0,
-       0,    76,     0,    83,    95,   115,    96,    97,    98,    86,
-       0,    95,     0,    77,     2,   106,   120,     0,    82,     0,
-     112,   131,   123,     0,     1,   248,     0,     0,   188,   138,
-       0,   136,     0,   252,    87,    92,    94,    99,     0,   101,
-      88,     0,     0,    75,     0,     0,     0,     0,   192,     4,
-       8,     6,     7,     9,     0,     0,     0,    36,    35,    34,
-       5,    11,    30,    13,    18,    19,     0,     0,    24,     0,
-      37,     0,    41,    44,    45,    50,    53,    54,    55,    56,
-      58,    60,    62,    74,     0,    28,    78,     0,     0,     0,
-     135,     0,     0,     0,   232,     0,     0,     0,     0,     0,
-     210,   219,   223,    37,    64,    72,     0,   201,     0,   141,
-     204,   221,   203,   202,     0,   205,   206,   207,   208,    89,
-      91,    93,     0,     0,   107,     0,   200,   109,     0,   198,
-       0,   196,     0,   193,    31,    32,     0,    15,    16,     0,
-       0,    22,    21,     0,    23,    25,    27,    33,     0,     0,
+       0,     0,   143,   144,   145,     0,   127,   135,   158,   155,
+     156,   157,   162,   163,   164,   165,   166,   167,   159,   160,
+     161,   168,   169,   170,   171,   172,   173,   136,   137,   140,
+     128,   174,   175,   176,   177,   178,   179,     0,   125,   124,
+       0,   154,   180,   182,   195,   196,   183,   184,   185,   186,
+     187,   188,   189,   190,   191,   181,   192,   193,   194,     0,
+     198,   261,   262,     0,    96,   106,     0,   111,   116,   132,
+       0,   130,   122,     0,   133,   141,   152,   197,     0,   258,
+     260,   129,   121,     0,   138,   139,     2,     3,   201,     0,
+       0,    87,     0,    94,   106,   126,   107,   108,   109,    97,
+       0,   106,     0,    88,     2,   117,   131,     0,    93,     0,
+     123,   142,   134,     0,     1,   259,     0,     0,   199,   149,
+       0,   147,     0,   263,    98,   103,   105,   110,     0,   112,
+      99,     0,     0,    86,     0,     0,     0,     0,   203,     4,
+       8,     6,     7,     9,     0,     0,     0,    36,    35,    37,
+      34,     5,    11,    30,    13,    18,    19,     0,     0,    24,
+       0,    38,     0,    42,    45,    48,    53,    56,    58,    60,
+      62,    64,    66,    68,    85,     0,    28,    89,     0,     0,
+       0,   146,     0,     0,     0,   243,     0,     0,     0,     0,
+       0,   221,   230,   234,    38,    70,    83,     0,   212,     0,
+     152,   215,   232,   214,   213,     0,   216,   217,   218,   219,
+     100,   102,   104,     0,     0,   118,     0,   211,   120,     0,
+     209,     0,   207,     0,   204,    31,    32,     0,    15,    16,
+       0,     0,    22,    21,     0,    23,    25,    27,    33,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   142,   191,     0,   139,   140,   137,   243,
-     242,   217,   234,     0,   246,   244,     0,   230,   209,     0,
-      67,    68,    70,    69,    71,    66,     0,     0,   224,   220,
-     222,     0,   102,     0,   104,   108,     0,     0,     0,   194,
-       0,    79,    10,     0,    17,     2,     3,    14,    20,    26,
-      38,    39,    40,    43,    42,    48,    49,    46,    47,    51,
-      52,    57,    59,    61,     0,   189,     0,     0,     0,     0,
-       0,   245,     0,   211,    65,    73,     0,   103,   195,     0,
-     197,     0,    80,    12,     0,     0,   216,   218,   237,   236,
-     239,   217,   228,     0,     0,     0,     0,    90,   199,     0,
-      63,     0,   238,     0,     0,   227,   225,     0,     0,   212,
-       0,     0,   240,     0,   217,     0,   214,   231,   213,    81,
-       0,   241,   235,   226,   229,   233
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   153,
+     202,     0,   150,   151,   148,   254,   253,   228,   245,     0,
+     257,   255,     0,   241,   220,     0,    73,    74,    76,    75,
+      78,    79,    80,    81,    82,    77,    72,     0,     0,   235,
+     231,   233,     0,   113,     0,   115,   119,     0,     0,     0,
+     205,     0,    90,    10,     0,    17,     2,     3,    14,    20,
+      26,    39,    40,    41,    44,    43,    46,    47,    51,    52,
+      49,    50,    54,    55,    57,    59,    61,    63,    65,    67,
+       0,   200,     0,     0,     0,     0,     0,   256,     0,   222,
+      71,    84,     0,   114,   206,     0,   208,     0,    91,    12,
+       0,     0,   227,   229,   248,   247,   250,   228,   239,     0,
+       0,     0,     0,   101,   210,     0,    69,     0,   249,     0,
+       0,   238,   236,     0,     0,   223,     0,     0,   251,     0,
+     228,     0,   225,   242,   224,    92,     0,   252,   246,   237,
+     240,   244
 };
 
   /* YYPGOTO[NTERM-NUM].  */
 static const yytype_int16 yypgoto[] =
 {
-    -315,   -39,  -315,  -315,  -315,  -315,  -315,  -315,     6,  -315,
-    -315,  -315,  -315,     2,  -315,   -49,  -315,   -78,   -53,  -315,
-    -315,  -315,   -12,     7,    12,  -315,  -107,  -127,  -315,  -139,
-    -128,  -315,    11,    13,  -315,  -315,  -315,   133,   164,   161,
-     136,  -315,  -315,  -305,  -315,  -315,  -101,    30,   -66,   260,
-    -315,  -315,    85,   -45,     0,  -315,  -315,  -315,   -99,  -125,
-      49,   -20,  -204,   -47,  -194,  -303,  -315,  -315,  -315,   -93,
-    -314,  -315,  -315,   -90,    15,   -44,  -315,  -315,   -67,  -315,
-    -315,  -315,  -315,  -315,  -315,  -315,  -315,  -315,   193,  -315,
-    -315
+    -341,   -39,  -341,  -341,  -341,  -341,  -341,  -341,    20,  -341,
+    -341,  -341,  -341,    54,  -341,   -47,   -41,  -123,   -44,    -6,
+       3,    -7,    -2,     4,     6,  -341,   -98,  -129,  -341,  -137,
+    -124,  -341,     8,    13,  -341,  -341,  -341,   138,   164,   158,
+     142,  -341,  -341,  -317,  -341,  -341,   -99,    25,   -68,   257,
+    -341,  -341,    82,     1,     0,  -341,  -341,  -341,  -103,  -125,
+      46,   -31,  -209,   -64,  -199,  -318,  -341,  -341,  -341,  -110,
+    -340,  -341,  -341,   -88,    -1,   -63,  -341,  -341,   -80,  -341,
+    -341,  -341,  -341,  -341,  -341,  -341,  -341,  -341,   195,  -341,
+    -341
 };
 
   /* YYDEFGOTO[NTERM-NUM].  */
 static const yytype_int16 yydefgoto[] =
 {
-      -1,   219,   150,   151,   152,   293,   153,   154,   155,   156,
-     157,   158,   159,   193,   161,   162,   163,   164,   165,   166,
-     167,   168,   169,   170,   171,   172,   194,   195,   276,   196,
-     174,   109,   197,   198,    63,    64,    65,   125,    99,   100,
+      -1,   220,   151,   152,   153,   304,   154,   155,   156,   157,
+     158,   159,   160,   194,   162,   163,   164,   165,   166,   167,
+     168,   169,   170,   171,   172,   173,   195,   196,   287,   197,
+     175,   109,   198,   199,    63,    64,    65,   125,    99,   100,
      126,    66,    67,    68,    69,   101,    70,    71,    72,    73,
-      74,   120,   121,    75,   175,    77,   178,   117,   137,   138,
-     220,   221,   217,   200,   201,   202,   203,   269,   346,   367,
-     316,   317,   318,   368,   204,   205,   206,   356,   345,   207,
-     322,   261,   319,   340,   353,   354,   208,    78,    79,    80,
+      74,   120,   121,    75,   176,    77,   179,   117,   137,   138,
+     221,   222,   218,   201,   202,   203,   204,   275,   362,   383,
+     332,   333,   334,   384,   205,   206,   207,   372,   361,   208,
+     338,   267,   335,   356,   369,   370,   209,    78,    79,    80,
       92
 };
 
@@ -934,299 +939,291 @@
      number is the opposite.  If YYTABLE_NINF, syntax error.  */
 static const yytype_int16 yytable[] =
 {
-      76,    89,   123,   215,   110,   216,   173,   226,   135,   284,
-     280,    61,   223,    62,    95,   337,   135,   343,   177,   251,
-     290,    86,    87,   131,   173,     7,   180,   355,   111,   105,
-     132,   235,   181,    95,   127,   343,   135,   212,   116,   243,
-     244,    84,    85,   136,   213,    96,    97,    98,    81,   266,
-     373,   136,   223,    88,   252,   366,    27,    28,   291,    29,
-     366,    90,   127,   129,    96,    97,    98,    37,    91,   218,
-      76,   136,    93,    76,   245,   246,   135,   135,    76,   255,
-      82,    94,   102,    76,   283,   103,   216,   331,   209,    61,
-     294,    62,   232,   227,   228,   332,   292,   341,   233,   106,
-      76,   370,   277,   277,   112,   173,   299,   277,   176,    76,
-     -84,   136,   136,   314,   229,   160,   113,    76,   230,   241,
-     277,   242,   199,   278,   320,     2,     3,     4,    76,   280,
-     223,   288,   119,   160,   289,    76,   -28,    76,   113,   270,
-     271,   272,   273,    96,    97,    98,   224,   225,   274,   324,
-     325,   118,   277,   326,   135,   321,   122,   288,   275,   329,
-     328,   374,   130,   237,   179,   305,   306,   307,   308,   238,
-     239,   240,   104,    87,   173,    86,    87,    76,    76,   133,
-     173,   247,   248,   342,   256,   257,   277,   334,    81,   136,
-     -29,   297,   303,   304,   309,   310,   231,   236,   249,   250,
-     277,   342,   253,   349,   199,   262,   263,   350,   259,   268,
-     335,   260,   361,   267,   160,   285,   281,   287,   264,  -143,
-    -215,   344,   358,   371,   173,   327,   333,   336,  -187,   347,
-     348,   351,   364,   360,   359,   363,   298,   311,   216,   344,
-     300,   301,   302,   160,   160,   160,   160,   160,   160,   160,
-     160,   160,   160,   160,   362,    76,   365,   312,   124,   369,
-     375,   210,   128,   313,   211,    83,   258,   286,   330,   199,
-     372,   115,   338,   352,     0,   339,     0,     0,   110,     0,
-       0,     0,     0,   160,   323,     0,     0,     0,     0,   160,
+      76,    89,   110,   217,   123,   295,   291,   216,    61,   227,
+     135,    95,   224,    62,   178,   174,   353,   371,   135,    81,
+     301,   359,   181,     7,   131,   228,   229,   257,   182,   105,
+     236,   132,   127,   174,    86,    87,   246,   247,   135,   359,
+     389,   136,    96,    97,    98,   102,   230,    90,   103,   136,
+     231,    82,   272,   224,    27,    28,   382,    29,   302,    91,
+     127,   382,   258,   129,    95,    37,    88,   219,   213,   136,
+      76,   248,   249,    76,   111,   214,   261,    93,    76,   135,
+     135,    94,   347,    76,   116,   217,    61,   113,   210,   294,
+     348,    62,   233,   305,   106,    96,    97,    98,   234,   112,
+      76,   288,   303,   299,   289,   310,   300,   -95,   288,    76,
+     136,   136,   357,   119,   386,   174,   288,    76,   288,   337,
+     288,   330,   200,   318,   319,   320,   321,   299,    76,   118,
+     344,   242,   336,   243,   122,    76,   224,    76,    84,    85,
+     291,   276,   277,   278,   279,   280,   281,   282,   283,   284,
+     285,     2,     3,     4,    96,    97,    98,   130,   340,   341,
+     286,   180,   135,   239,   240,   241,   133,   161,   342,   -28,
+     177,   113,   390,    81,   345,   104,    87,   -29,    76,    76,
+      86,    87,   232,   244,   245,   161,   250,   251,   262,   263,
+     288,   350,   308,   136,   174,   314,   315,   237,   225,   226,
+     174,   358,   252,   316,   317,   200,   322,   323,   253,   254,
+     255,   256,   259,   292,   268,   265,   238,   266,   296,   358,
+     269,   366,   270,   365,   273,   351,   274,   298,  -154,   343,
+     377,  -226,   349,   380,  -198,   363,   367,   288,   364,   360,
+     374,   387,   375,   376,   379,   352,   324,   326,   378,   174,
+     381,   309,   217,   327,   385,   391,   325,   360,   124,   128,
+     328,    76,    83,   329,   264,   297,   211,   161,   346,   388,
+     212,   354,   355,   115,   339,   200,   368,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   357,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   199,   199,
-       0,     0,   199,   199,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   160,     0,     0,     0,     0,     0,     0,
-     199,     0,     0,     0,    76,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   199,     0,
-       0,     0,     0,   199,     1,     2,     3,     4,     5,     6,
-       7,     8,     9,    10,    11,   182,   183,   184,     0,   185,
-     186,   187,   188,     0,     0,     0,    12,    13,    14,    15,
-      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
-      26,    27,    28,     0,    29,    30,    31,    32,    33,    34,
-      35,    36,    37,    38,    39,    40,    41,   189,    42,    43,
-      44,    45,    46,    47,    48,    49,    50,    51,    52,    53,
-      54,    55,     0,    56,    57,    58,    59,   139,    60,   140,
-     141,   142,   143,     0,     0,     0,   144,   145,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   146,     0,     0,     0,   190,
-     191,     0,     0,     0,     0,   192,   147,   148,     0,   149,
+       0,     0,   110,   311,   312,   313,   161,   161,   161,   161,
+     161,   161,   161,   161,   161,   161,   161,   161,   161,   161,
+     161,   161,     0,     0,     0,     0,     0,     0,     0,     0,
+     373,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   200,   200,     0,     0,   200,   200,
+       0,     0,     0,     0,     0,     0,   161,     0,     0,     0,
+       0,     0,   161,     0,     0,     0,   200,     0,     0,     0,
+      76,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   200,     0,     0,     0,     0,   200,
        1,     2,     3,     4,     5,     6,     7,     8,     9,    10,
-      11,   182,   183,   184,     0,   185,   186,   187,   188,     0,
-       0,     0,    12,    13,    14,    15,    16,    17,    18,    19,
+      11,   183,   184,   185,     0,   186,   187,   188,   189,     0,
+       0,   161,    12,    13,    14,    15,    16,    17,    18,    19,
       20,    21,    22,    23,    24,    25,    26,    27,    28,     0,
       29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
-      39,    40,    41,   189,    42,    43,    44,    45,    46,    47,
+      39,    40,    41,   190,    42,    43,    44,    45,    46,    47,
       48,    49,    50,    51,    52,    53,    54,    55,     0,    56,
       57,    58,    59,   139,    60,   140,   141,   142,   143,     0,
        0,     0,   144,   145,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   146,     0,     0,     0,   190,   279,     0,     0,     0,
-       0,   192,   147,   148,     0,   149,     1,     2,     3,     4,
-       5,     6,     7,     8,     9,    10,    11,   182,   183,   184,
-       0,   185,   186,   187,   188,     0,     0,     0,    12,    13,
+       0,   146,     0,     0,     0,   191,   192,     0,     0,     0,
+       0,   193,   147,   148,   149,   150,     1,     2,     3,     4,
+       5,     6,     7,     8,     9,    10,    11,   183,   184,   185,
+       0,   186,   187,   188,   189,     0,     0,     0,    12,    13,
       14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
       24,    25,    26,    27,    28,     0,    29,    30,    31,    32,
-      33,    34,    35,    36,    37,    38,    39,    40,    41,   189,
+      33,    34,    35,    36,    37,    38,    39,    40,    41,   190,
       42,    43,    44,    45,    46,    47,    48,    49,    50,    51,
       52,    53,    54,    55,     0,    56,    57,    58,    59,   139,
       60,   140,   141,   142,   143,     0,     0,     0,   144,   145,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,   146,     0,     0,
-       0,   190,     0,     0,     0,     0,     0,   192,   147,   148,
-       0,   149,     1,     2,     3,     4,     5,     6,     7,     8,
-       9,    10,    11,   182,   183,   184,     0,   185,   186,   187,
-     188,     0,     0,     0,    12,    13,    14,    15,    16,    17,
+       0,   191,   290,     0,     0,     0,     0,   193,   147,   148,
+     149,   150,     1,     2,     3,     4,     5,     6,     7,     8,
+       9,    10,    11,   183,   184,   185,     0,   186,   187,   188,
+     189,     0,     0,     0,    12,    13,    14,    15,    16,    17,
       18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
       28,     0,    29,    30,    31,    32,    33,    34,    35,    36,
-      37,    38,    39,    40,    41,   189,    42,    43,    44,    45,
+      37,    38,    39,    40,    41,   190,    42,    43,    44,    45,
       46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
        0,    56,    57,    58,    59,   139,    60,   140,   141,   142,
      143,     0,     0,     0,   144,   145,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   146,     0,     0,     0,   122,     0,     0,
-       0,     0,     0,   192,   147,   148,     0,   149,     1,     2,
-       3,     4,     5,     6,     7,     8,     9,    10,    11,   182,
-     183,   184,     0,   185,   186,   187,   188,     0,     0,     0,
+       0,     0,     0,   146,     0,     0,     0,   191,     0,     0,
+       0,     0,     0,   193,   147,   148,   149,   150,     1,     2,
+       3,     4,     5,     6,     7,     8,     9,    10,    11,   183,
+     184,   185,     0,   186,   187,   188,   189,     0,     0,     0,
       12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
       22,    23,    24,    25,    26,    27,    28,     0,    29,    30,
       31,    32,    33,    34,    35,    36,    37,    38,    39,    40,
-      41,   189,    42,    43,    44,    45,    46,    47,    48,    49,
+      41,   190,    42,    43,    44,    45,    46,    47,    48,    49,
       50,    51,    52,    53,    54,    55,     0,    56,    57,    58,
       59,   139,    60,   140,   141,   142,   143,     0,     0,     0,
      144,   145,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,   146,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   192,
-     147,   148,     0,   149,     1,     2,     3,     4,     5,     6,
-       7,     8,     9,    10,    11,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,    12,    13,    14,    15,
+       0,     0,     0,   122,     0,     0,     0,     0,     0,   193,
+     147,   148,   149,   150,     1,     2,     3,     4,     5,     6,
+       7,     8,     9,    10,    11,   183,   184,   185,     0,   186,
+     187,   188,   189,     0,     0,     0,    12,    13,    14,    15,
       16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
       26,    27,    28,     0,    29,    30,    31,    32,    33,    34,
-      35,    36,    37,    38,    39,    40,    41,     0,    42,    43,
+      35,    36,    37,    38,    39,    40,    41,   190,    42,    43,
       44,    45,    46,    47,    48,    49,    50,    51,    52,    53,
       54,    55,     0,    56,    57,    58,    59,   139,    60,   140,
      141,   142,   143,     0,     0,     0,   144,   145,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   134,     2,     3,     4,   146,     6,     7,     8,     9,
-      10,    11,     0,     0,     0,   192,   147,   148,     0,   149,
-       0,     0,     0,    12,    13,    14,    15,    16,    17,    18,
-      19,    20,    21,    22,    23,    24,    25,    26,    27,    28,
-       0,    29,    30,    31,    32,    33,    34,    35,    36,    37,
-      38,    39,    40,    41,     0,    42,    43,    44,    45,    46,
-      47,    48,    49,    50,    51,    52,    53,    54,    55,     0,
-      56,    57,    58,    59,   139,    60,   140,   141,   142,   143,
-       0,     0,     0,   144,   145,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     2,     3,     4,
-       0,     0,   146,     8,     9,    10,    11,     0,     0,     0,
-       0,     0,     0,   147,   148,     0,   149,     0,    12,    13,
-      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
-      24,    25,    26,     0,     0,     0,     0,     0,    31,    32,
-      33,    34,    35,    36,     0,     0,     0,    40,    41,     0,
-      42,    43,    44,    45,    46,    47,    48,    49,    50,    51,
-      52,    53,    54,    55,     0,    56,    57,    58,     0,   107,
-      60,     0,     0,     8,     9,    10,    11,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,    12,    13,
-      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
-      24,    25,    26,     0,     0,     0,     0,   108,    31,    32,
-      33,    34,    35,    36,     0,     0,     0,    40,    41,     0,
-      42,    43,    44,    45,    46,    47,    48,    49,    50,    51,
-      52,    53,    54,    55,     0,    56,    57,    58,     0,   139,
-      60,   140,   141,   142,   143,     0,     0,     0,   144,   145,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   146,     0,     0,
-     214,     8,     9,    10,    11,     0,     0,     0,   147,   148,
-       0,   149,     0,     0,     0,     0,    12,    13,    14,    15,
-      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
-      26,     0,     0,     0,     0,     0,    31,    32,    33,    34,
-      35,    36,     0,     0,     0,    40,    41,     0,    42,    43,
-      44,    45,    46,    47,    48,    49,    50,    51,    52,    53,
-      54,    55,     0,    56,    57,    58,     0,   139,    60,   140,
-     141,   142,   143,     0,     0,     0,   144,   145,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   146,     8,     9,    10,    11,
-       0,     0,     0,     0,     0,   265,   147,   148,     0,   149,
-       0,    12,    13,    14,    15,    16,    17,    18,    19,    20,
-      21,    22,    23,    24,    25,    26,     0,     0,     0,     0,
-       0,    31,    32,    33,    34,    35,    36,     0,     0,     0,
-      40,    41,     0,    42,    43,    44,    45,    46,    47,    48,
-      49,    50,    51,    52,    53,    54,    55,     0,    56,    57,
-      58,     0,   139,    60,   140,   141,   142,   143,     0,     0,
-       0,   144,   145,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     146,     0,     0,   282,     8,     9,    10,    11,     0,     0,
-       0,   147,   148,     0,   149,     0,     0,     0,     0,    12,
+       0,     0,     0,     0,     0,   146,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   193,   147,   148,   149,   150,
+       1,     2,     3,     4,     5,     6,     7,     8,     9,    10,
+      11,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,    12,    13,    14,    15,    16,    17,    18,    19,
+      20,    21,    22,    23,    24,    25,    26,    27,    28,     0,
+      29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
+      39,    40,    41,     0,    42,    43,    44,    45,    46,    47,
+      48,    49,    50,    51,    52,    53,    54,    55,     0,    56,
+      57,    58,    59,   139,    60,   140,   141,   142,   143,     0,
+       0,     0,   144,   145,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   134,     2,     3,
+       4,   146,     6,     7,     8,     9,    10,    11,     0,     0,
+       0,   193,   147,   148,   149,   150,     0,     0,     0,    12,
       13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-      23,    24,    25,    26,     0,     0,     0,     0,     0,    31,
-      32,    33,    34,    35,    36,     0,     0,     0,    40,    41,
+      23,    24,    25,    26,    27,    28,     0,    29,    30,    31,
+      32,    33,    34,    35,    36,    37,    38,    39,    40,    41,
        0,    42,    43,    44,    45,    46,    47,    48,    49,    50,
-      51,    52,    53,    54,    55,     0,    56,    57,    58,     0,
+      51,    52,    53,    54,    55,     0,    56,    57,    58,    59,
      139,    60,   140,   141,   142,   143,     0,     0,     0,   144,
      145,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   146,     8,
+       0,     0,     0,     2,     3,     4,     0,     0,   146,     8,
        9,    10,    11,     0,     0,     0,     0,     0,     0,   147,
-     148,     0,   149,     0,    12,    13,    14,    15,    16,    17,
+     148,   149,   150,     0,    12,    13,    14,    15,    16,    17,
       18,    19,    20,    21,    22,    23,    24,    25,    26,     0,
        0,     0,     0,     0,    31,    32,    33,    34,    35,    36,
-       0,     0,     0,    40,   234,     0,    42,    43,    44,    45,
+       0,     0,     0,    40,    41,     0,    42,    43,    44,    45,
+      46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
+       0,    56,    57,    58,     0,   107,    60,     0,     0,     8,
+       9,    10,    11,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,    26,     0,
+       0,     0,     0,   108,    31,    32,    33,    34,    35,    36,
+       0,     0,     0,    40,    41,     0,    42,    43,    44,    45,
       46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
        0,    56,    57,    58,     0,   139,    60,   140,   141,   142,
      143,     0,     0,     0,   144,   145,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   134,
-       2,     3,     4,   146,     6,     7,     8,     9,    10,    11,
-       0,     0,     0,     0,   147,   148,     0,   149,     0,     0,
-       0,    12,    13,    14,    15,    16,    17,    18,    19,    20,
-      21,    22,    23,    24,    25,    26,    27,    28,     0,    29,
-      30,    31,    32,    33,    34,    35,    36,    37,    38,    39,
-      40,    41,     0,    42,    43,    44,    45,    46,    47,    48,
-      49,    50,    51,    52,    53,    54,    55,     0,    56,    57,
-      58,    59,     0,    60,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   134,     2,     3,     4,     0,     6,
-       7,     8,     9,    10,    11,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   222,    12,    13,    14,    15,
-      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
-      26,    27,    28,     0,    29,    30,    31,    32,    33,    34,
-      35,    36,    37,    38,    39,    40,    41,     0,    42,    43,
-      44,    45,    46,    47,    48,    49,    50,    51,    52,    53,
-      54,    55,     0,    56,    57,    58,    59,     0,    60,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   134,
-       2,     3,     4,     0,     6,     7,     8,     9,    10,    11,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     254,    12,    13,    14,    15,    16,    17,    18,    19,    20,
-      21,    22,    23,    24,    25,    26,    27,    28,     0,    29,
-      30,    31,    32,    33,    34,    35,    36,    37,    38,    39,
-      40,    41,     0,    42,    43,    44,    45,    46,    47,    48,
-      49,    50,    51,    52,    53,    54,    55,     0,    56,    57,
-      58,    59,     0,    60,     0,     0,     0,     0,     0,     0,
-       0,   114,     0,     0,     1,     2,     3,     4,     5,     6,
-       7,     8,     9,    10,    11,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   315,    12,    13,    14,    15,
-      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
-      26,    27,    28,     0,    29,    30,    31,    32,    33,    34,
-      35,    36,    37,    38,    39,    40,    41,     0,    42,    43,
-      44,    45,    46,    47,    48,    49,    50,    51,    52,    53,
-      54,    55,     0,    56,    57,    58,    59,     0,    60,     1,
-       2,     3,     4,     5,     6,     7,     8,     9,    10,    11,
+       0,     0,     0,   146,     0,     0,   215,     8,     9,    10,
+      11,     0,     0,     0,   147,   148,   149,   150,     0,     0,
+       0,     0,    12,    13,    14,    15,    16,    17,    18,    19,
+      20,    21,    22,    23,    24,    25,    26,     0,     0,     0,
+       0,     0,    31,    32,    33,    34,    35,    36,     0,     0,
+       0,    40,    41,     0,    42,    43,    44,    45,    46,    47,
+      48,    49,    50,    51,    52,    53,    54,    55,     0,    56,
+      57,    58,     0,   139,    60,   140,   141,   142,   143,     0,
+       0,     0,   144,   145,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,    12,    13,    14,    15,    16,    17,    18,    19,    20,
-      21,    22,    23,    24,    25,    26,    27,    28,     0,    29,
-      30,    31,    32,    33,    34,    35,    36,    37,    38,    39,
-      40,    41,     0,    42,    43,    44,    45,    46,    47,    48,
-      49,    50,    51,    52,    53,    54,    55,     0,    56,    57,
-      58,    59,     0,    60,   134,     2,     3,     4,     0,     6,
-       7,     8,     9,    10,    11,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,    12,    13,    14,    15,
-      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
-      26,    27,    28,     0,    29,    30,    31,    32,    33,    34,
-      35,    36,    37,    38,    39,    40,    41,     0,    42,    43,
-      44,    45,    46,    47,    48,    49,    50,    51,    52,    53,
-      54,    55,     0,    56,    57,    58,    59,     0,    60,     2,
-       3,     4,     0,     0,     0,     8,     9,    10,    11,     0,
+       0,   146,     8,     9,    10,    11,     0,     0,     0,     0,
+       0,   271,   147,   148,   149,   150,     0,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,    26,     0,     0,     0,     0,     0,    31,    32,    33,
+      34,    35,    36,     0,     0,     0,    40,    41,     0,    42,
+      43,    44,    45,    46,    47,    48,    49,    50,    51,    52,
+      53,    54,    55,     0,    56,    57,    58,     0,   139,    60,
+     140,   141,   142,   143,     0,     0,     0,   144,   145,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   146,     0,     0,   293,
+       8,     9,    10,    11,     0,     0,     0,   147,   148,   149,
+     150,     0,     0,     0,     0,    12,    13,    14,    15,    16,
+      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
+       0,     0,     0,     0,     0,    31,    32,    33,    34,    35,
+      36,     0,     0,     0,    40,    41,     0,    42,    43,    44,
+      45,    46,    47,    48,    49,    50,    51,    52,    53,    54,
+      55,     0,    56,    57,    58,     0,   139,    60,   140,   141,
+     142,   143,     0,     0,     0,   144,   145,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   146,     8,     9,    10,    11,     0,
+       0,     0,     0,     0,     0,   147,   148,   149,   150,     0,
       12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
       22,    23,    24,    25,    26,     0,     0,     0,     0,     0,
       31,    32,    33,    34,    35,    36,     0,     0,     0,    40,
-      41,     0,    42,    43,    44,    45,    46,    47,    48,    49,
+     235,     0,    42,    43,    44,    45,    46,    47,    48,    49,
       50,    51,    52,    53,    54,    55,     0,    56,    57,    58,
-       0,     0,    60,     8,     9,    10,    11,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,    12,    13,
-      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
-      24,    25,    26,     0,     0,     0,     0,     0,    31,    32,
-      33,    34,    35,    36,     0,     0,     0,    40,    41,     0,
-      42,    43,    44,    45,    46,    47,    48,    49,    50,    51,
-      52,    53,    54,    55,     0,    56,    57,    58,     0,   295,
-     296,     8,     9,    10,    11,     0,     0,     0,     0,     0,
+       0,   139,    60,   140,   141,   142,   143,     0,     0,     0,
+     144,   145,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   134,     2,     3,     4,   146,
+       6,     7,     8,     9,    10,    11,     0,     0,     0,     0,
+     147,   148,   149,   150,     0,     0,     0,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,    26,    27,    28,     0,    29,    30,    31,    32,    33,
+      34,    35,    36,    37,    38,    39,    40,    41,     0,    42,
+      43,    44,    45,    46,    47,    48,    49,    50,    51,    52,
+      53,    54,    55,     0,    56,    57,    58,    59,     0,    60,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     134,     2,     3,     4,     0,     6,     7,     8,     9,    10,
+      11,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   223,    12,    13,    14,    15,    16,    17,    18,    19,
+      20,    21,    22,    23,    24,    25,    26,    27,    28,     0,
+      29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
+      39,    40,    41,     0,    42,    43,    44,    45,    46,    47,
+      48,    49,    50,    51,    52,    53,    54,    55,     0,    56,
+      57,    58,    59,     0,    60,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   134,     2,     3,     4,     0,
+       6,     7,     8,     9,    10,    11,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   260,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,    26,    27,    28,     0,    29,    30,    31,    32,    33,
+      34,    35,    36,    37,    38,    39,    40,    41,     0,    42,
+      43,    44,    45,    46,    47,    48,    49,    50,    51,    52,
+      53,    54,    55,     0,    56,    57,    58,    59,     0,    60,
+       0,     0,     0,     0,     0,     0,     0,   114,     0,     0,
+       1,     2,     3,     4,     5,     6,     7,     8,     9,    10,
+      11,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   331,    12,    13,    14,    15,    16,    17,    18,    19,
+      20,    21,    22,    23,    24,    25,    26,    27,    28,     0,
+      29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
+      39,    40,    41,     0,    42,    43,    44,    45,    46,    47,
+      48,    49,    50,    51,    52,    53,    54,    55,     0,    56,
+      57,    58,    59,     0,    60,     1,     2,     3,     4,     5,
+       6,     7,     8,     9,    10,    11,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,    26,    27,    28,     0,    29,    30,    31,    32,    33,
+      34,    35,    36,    37,    38,    39,    40,    41,     0,    42,
+      43,    44,    45,    46,    47,    48,    49,    50,    51,    52,
+      53,    54,    55,     0,    56,    57,    58,    59,     0,    60,
+     134,     2,     3,     4,     0,     6,     7,     8,     9,    10,
+      11,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,    12,    13,    14,    15,    16,    17,    18,    19,
+      20,    21,    22,    23,    24,    25,    26,    27,    28,     0,
+      29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
+      39,    40,    41,     0,    42,    43,    44,    45,    46,    47,
+      48,    49,    50,    51,    52,    53,    54,    55,     0,    56,
+      57,    58,    59,     0,    60,     2,     3,     4,     0,     0,
+       0,     8,     9,    10,    11,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,    12,    13,    14,    15,
       16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
       26,     0,     0,     0,     0,     0,    31,    32,    33,    34,
       35,    36,     0,     0,     0,    40,    41,     0,    42,    43,
       44,    45,    46,    47,    48,    49,    50,    51,    52,    53,
-      54,    55,     0,    56,    57,    58,     0,     0,    60
+      54,    55,     0,    56,    57,    58,     0,     0,    60,     8,
+       9,    10,    11,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,    26,     0,
+       0,     0,     0,     0,    31,    32,    33,    34,    35,    36,
+       0,     0,     0,    40,    41,     0,    42,    43,    44,    45,
+      46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
+       0,    56,    57,    58,     0,   306,   307,     8,     9,    10,
+      11,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,    12,    13,    14,    15,    16,    17,    18,    19,
+      20,    21,    22,    23,    24,    25,    26,     0,     0,     0,
+       0,     0,    31,    32,    33,    34,    35,    36,     0,     0,
+       0,    40,    41,     0,    42,    43,    44,    45,    46,    47,
+      48,    49,    50,    51,    52,    53,    54,    55,     0,    56,
+      57,    58,     0,     0,    60
 };
 
 static const yytype_int16 yycheck[] =
 {
-       0,    40,    92,   131,    70,   132,   113,   146,   109,   213,
-     204,     0,   137,     0,     9,   318,   117,   322,   117,    92,
-      76,    76,    77,   106,   131,     9,   105,   341,    73,    68,
-     113,   158,   111,     9,   100,   340,   137,   106,    83,    87,
-      88,    40,    41,   109,   113,    40,    41,    42,    44,   188,
-     364,   117,   177,   108,   127,   358,    40,    41,   114,    43,
-     363,   104,   128,   102,    40,    41,    42,    51,   114,   135,
-      70,   137,   105,    73,   122,   123,   177,   178,    78,   178,
-      76,   111,   111,    83,   212,   114,   213,   106,   127,    78,
-     229,    78,   105,    85,    86,   114,   105,   105,   111,    69,
-     100,   105,   111,   111,    74,   212,   233,   111,   114,   109,
-     105,   177,   178,   252,   106,   113,   106,   117,   110,   116,
-     111,   118,   122,   114,   263,     4,     5,     6,   128,   323,
-     255,   111,    76,   131,   114,   135,   104,   137,   106,    94,
-      95,    96,    97,    40,    41,    42,   144,   145,   103,   276,
-     277,   108,   111,   281,   255,   114,   108,   111,   113,   287,
-     114,   365,   104,   161,   113,   243,   244,   245,   246,   119,
-     120,   121,    76,    77,   281,    76,    77,   177,   178,   108,
-     287,    89,    90,   322,    79,    80,   111,   112,    44,   255,
-     104,   230,   241,   242,   247,   248,   105,   104,    91,    93,
-     111,   340,   107,   331,   204,   104,   104,   334,   114,   109,
-      56,   114,   351,   104,   212,   107,   106,   106,   114,   104,
-     108,   322,   105,   362,   331,   107,   107,   317,   104,   107,
-     107,   104,    17,   107,   109,   105,   230,   249,   365,   340,
-     238,   239,   240,   241,   242,   243,   244,   245,   246,   247,
-     248,   249,   250,   251,   114,   255,   113,   250,    94,   114,
-     114,   128,   101,   251,   128,     5,   181,   218,   288,   269,
-     363,    78,   319,   340,    -1,   319,    -1,    -1,   344,    -1,
-      -1,    -1,    -1,   281,   269,    -1,    -1,    -1,    -1,   287,
+       0,    40,    70,   132,    92,   214,   205,   131,     0,   146,
+     109,     9,   137,     0,   117,   113,   334,   357,   117,    44,
+      76,   338,   105,     9,   106,    85,    86,    92,   111,    68,
+     159,   113,   100,   131,    76,    77,    87,    88,   137,   356,
+     380,   109,    40,    41,    42,   111,   106,   104,   114,   117,
+     110,    76,   189,   178,    40,    41,   374,    43,   114,   114,
+     128,   379,   127,   102,     9,    51,   108,   135,   106,   137,
+      70,   122,   123,    73,    73,   113,   179,   105,    78,   178,
+     179,   111,   106,    83,    83,   214,    78,   106,   127,   213,
+     114,    78,   105,   230,    69,    40,    41,    42,   111,    74,
+     100,   111,   105,   111,   114,   234,   114,   105,   111,   109,
+     178,   179,   105,    76,   105,   213,   111,   117,   111,   114,
+     111,   258,   122,   246,   247,   248,   249,   111,   128,   108,
+     114,   116,   269,   118,   108,   135,   261,   137,    40,    41,
+     339,    94,    95,    96,    97,    98,    99,   100,   101,   102,
+     103,     4,     5,     6,    40,    41,    42,   104,   287,   288,
+     113,   113,   261,   119,   120,   121,   108,   113,   292,   104,
+     114,   106,   381,    44,   298,    76,    77,   104,   178,   179,
+      76,    77,   105,    83,    84,   131,    89,    90,    79,    80,
+     111,   112,   231,   261,   292,   242,   243,   104,   144,   145,
+     298,   338,   126,   244,   245,   205,   250,   251,   125,   124,
+      91,    93,   107,   106,   104,   114,   162,   114,   107,   356,
+     104,   350,   114,   347,   104,    56,   109,   106,   104,   107,
+     367,   108,   107,    17,   104,   107,   104,   111,   107,   338,
+     105,   378,   109,   107,   105,   333,   252,   254,   114,   347,
+     113,   231,   381,   255,   114,   114,   253,   356,    94,   101,
+     256,   261,     5,   257,   182,   219,   128,   213,   299,   379,
+     128,   335,   335,    78,   275,   275,   356,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   343,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   318,   319,
-      -1,    -1,   322,   323,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   331,    -1,    -1,    -1,    -1,    -1,    -1,
-     340,    -1,    -1,    -1,   344,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   358,    -1,
-      -1,    -1,    -1,   363,     3,     4,     5,     6,     7,     8,
-       9,    10,    11,    12,    13,    14,    15,    16,    -1,    18,
-      19,    20,    21,    -1,    -1,    -1,    25,    26,    27,    28,
-      29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
-      39,    40,    41,    -1,    43,    44,    45,    46,    47,    48,
-      49,    50,    51,    52,    53,    54,    55,    56,    57,    58,
-      59,    60,    61,    62,    63,    64,    65,    66,    67,    68,
-      69,    70,    -1,    72,    73,    74,    75,    76,    77,    78,
-      79,    80,    81,    -1,    -1,    -1,    85,    86,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   104,    -1,    -1,    -1,   108,
-     109,    -1,    -1,    -1,    -1,   114,   115,   116,    -1,   118,
+      -1,    -1,   360,   239,   240,   241,   242,   243,   244,   245,
+     246,   247,   248,   249,   250,   251,   252,   253,   254,   255,
+     256,   257,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     359,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   334,   335,    -1,    -1,   338,   339,
+      -1,    -1,    -1,    -1,    -1,    -1,   292,    -1,    -1,    -1,
+      -1,    -1,   298,    -1,    -1,    -1,   356,    -1,    -1,    -1,
+     360,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   374,    -1,    -1,    -1,    -1,   379,
        3,     4,     5,     6,     7,     8,     9,    10,    11,    12,
       13,    14,    15,    16,    -1,    18,    19,    20,    21,    -1,
-      -1,    -1,    25,    26,    27,    28,    29,    30,    31,    32,
+      -1,   347,    25,    26,    27,    28,    29,    30,    31,    32,
       33,    34,    35,    36,    37,    38,    39,    40,    41,    -1,
       43,    44,    45,    46,    47,    48,    49,    50,    51,    52,
       53,    54,    55,    56,    57,    58,    59,    60,    61,    62,
@@ -1235,7 +1232,7 @@
       -1,    -1,    85,    86,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,   104,    -1,    -1,    -1,   108,   109,    -1,    -1,    -1,
-      -1,   114,   115,   116,    -1,   118,     3,     4,     5,     6,
+      -1,   114,   115,   116,   117,   118,     3,     4,     5,     6,
        7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
       -1,    18,    19,    20,    21,    -1,    -1,    -1,    25,    26,
       27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
@@ -1246,8 +1243,8 @@
       77,    78,    79,    80,    81,    -1,    -1,    -1,    85,    86,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,   104,    -1,    -1,
-      -1,   108,    -1,    -1,    -1,    -1,    -1,   114,   115,   116,
-      -1,   118,     3,     4,     5,     6,     7,     8,     9,    10,
+      -1,   108,   109,    -1,    -1,    -1,    -1,   114,   115,   116,
+     117,   118,     3,     4,     5,     6,     7,     8,     9,    10,
       11,    12,    13,    14,    15,    16,    -1,    18,    19,    20,
       21,    -1,    -1,    -1,    25,    26,    27,    28,    29,    30,
       31,    32,    33,    34,    35,    36,    37,    38,    39,    40,
@@ -1258,7 +1255,7 @@
       81,    -1,    -1,    -1,    85,    86,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,   104,    -1,    -1,    -1,   108,    -1,    -1,
-      -1,    -1,    -1,   114,   115,   116,    -1,   118,     3,     4,
+      -1,    -1,    -1,   114,   115,   116,   117,   118,     3,     4,
        5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
       15,    16,    -1,    18,    19,    20,    21,    -1,    -1,    -1,
       25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
@@ -1269,151 +1266,163 @@
       75,    76,    77,    78,    79,    80,    81,    -1,    -1,    -1,
       85,    86,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   104,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   114,
-     115,   116,    -1,   118,     3,     4,     5,     6,     7,     8,
-       9,    10,    11,    12,    13,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    25,    26,    27,    28,
+      -1,    -1,    -1,   108,    -1,    -1,    -1,    -1,    -1,   114,
+     115,   116,   117,   118,     3,     4,     5,     6,     7,     8,
+       9,    10,    11,    12,    13,    14,    15,    16,    -1,    18,
+      19,    20,    21,    -1,    -1,    -1,    25,    26,    27,    28,
       29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
       39,    40,    41,    -1,    43,    44,    45,    46,    47,    48,
-      49,    50,    51,    52,    53,    54,    55,    -1,    57,    58,
+      49,    50,    51,    52,    53,    54,    55,    56,    57,    58,
       59,    60,    61,    62,    63,    64,    65,    66,    67,    68,
       69,    70,    -1,    72,    73,    74,    75,    76,    77,    78,
       79,    80,    81,    -1,    -1,    -1,    85,    86,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,     3,     4,     5,     6,   104,     8,     9,    10,    11,
-      12,    13,    -1,    -1,    -1,   114,   115,   116,    -1,   118,
-      -1,    -1,    -1,    25,    26,    27,    28,    29,    30,    31,
-      32,    33,    34,    35,    36,    37,    38,    39,    40,    41,
-      -1,    43,    44,    45,    46,    47,    48,    49,    50,    51,
-      52,    53,    54,    55,    -1,    57,    58,    59,    60,    61,
-      62,    63,    64,    65,    66,    67,    68,    69,    70,    -1,
-      72,    73,    74,    75,    76,    77,    78,    79,    80,    81,
-      -1,    -1,    -1,    85,    86,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,     4,     5,     6,
-      -1,    -1,   104,    10,    11,    12,    13,    -1,    -1,    -1,
-      -1,    -1,    -1,   115,   116,    -1,   118,    -1,    25,    26,
-      27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
-      37,    38,    39,    -1,    -1,    -1,    -1,    -1,    45,    46,
-      47,    48,    49,    50,    -1,    -1,    -1,    54,    55,    -1,
-      57,    58,    59,    60,    61,    62,    63,    64,    65,    66,
-      67,    68,    69,    70,    -1,    72,    73,    74,    -1,    76,
-      77,    -1,    -1,    10,    11,    12,    13,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    25,    26,
-      27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
-      37,    38,    39,    -1,    -1,    -1,    -1,   114,    45,    46,
-      47,    48,    49,    50,    -1,    -1,    -1,    54,    55,    -1,
-      57,    58,    59,    60,    61,    62,    63,    64,    65,    66,
-      67,    68,    69,    70,    -1,    72,    73,    74,    -1,    76,
-      77,    78,    79,    80,    81,    -1,    -1,    -1,    85,    86,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   104,    -1,    -1,
-     107,    10,    11,    12,    13,    -1,    -1,    -1,   115,   116,
-      -1,   118,    -1,    -1,    -1,    -1,    25,    26,    27,    28,
-      29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
-      39,    -1,    -1,    -1,    -1,    -1,    45,    46,    47,    48,
-      49,    50,    -1,    -1,    -1,    54,    55,    -1,    57,    58,
-      59,    60,    61,    62,    63,    64,    65,    66,    67,    68,
-      69,    70,    -1,    72,    73,    74,    -1,    76,    77,    78,
-      79,    80,    81,    -1,    -1,    -1,    85,    86,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   104,    10,    11,    12,    13,
-      -1,    -1,    -1,    -1,    -1,   114,   115,   116,    -1,   118,
-      -1,    25,    26,    27,    28,    29,    30,    31,    32,    33,
-      34,    35,    36,    37,    38,    39,    -1,    -1,    -1,    -1,
-      -1,    45,    46,    47,    48,    49,    50,    -1,    -1,    -1,
-      54,    55,    -1,    57,    58,    59,    60,    61,    62,    63,
-      64,    65,    66,    67,    68,    69,    70,    -1,    72,    73,
-      74,    -1,    76,    77,    78,    79,    80,    81,    -1,    -1,
-      -1,    85,    86,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     104,    -1,    -1,   107,    10,    11,    12,    13,    -1,    -1,
-      -1,   115,   116,    -1,   118,    -1,    -1,    -1,    -1,    25,
+      -1,    -1,    -1,    -1,    -1,   104,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   114,   115,   116,   117,   118,
+       3,     4,     5,     6,     7,     8,     9,    10,    11,    12,
+      13,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    25,    26,    27,    28,    29,    30,    31,    32,
+      33,    34,    35,    36,    37,    38,    39,    40,    41,    -1,
+      43,    44,    45,    46,    47,    48,    49,    50,    51,    52,
+      53,    54,    55,    -1,    57,    58,    59,    60,    61,    62,
+      63,    64,    65,    66,    67,    68,    69,    70,    -1,    72,
+      73,    74,    75,    76,    77,    78,    79,    80,    81,    -1,
+      -1,    -1,    85,    86,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,     3,     4,     5,
+       6,   104,     8,     9,    10,    11,    12,    13,    -1,    -1,
+      -1,   114,   115,   116,   117,   118,    -1,    -1,    -1,    25,
       26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
-      36,    37,    38,    39,    -1,    -1,    -1,    -1,    -1,    45,
-      46,    47,    48,    49,    50,    -1,    -1,    -1,    54,    55,
+      36,    37,    38,    39,    40,    41,    -1,    43,    44,    45,
+      46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
       -1,    57,    58,    59,    60,    61,    62,    63,    64,    65,
-      66,    67,    68,    69,    70,    -1,    72,    73,    74,    -1,
+      66,    67,    68,    69,    70,    -1,    72,    73,    74,    75,
       76,    77,    78,    79,    80,    81,    -1,    -1,    -1,    85,
       86,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   104,    10,
+      -1,    -1,    -1,     4,     5,     6,    -1,    -1,   104,    10,
       11,    12,    13,    -1,    -1,    -1,    -1,    -1,    -1,   115,
-     116,    -1,   118,    -1,    25,    26,    27,    28,    29,    30,
+     116,   117,   118,    -1,    25,    26,    27,    28,    29,    30,
       31,    32,    33,    34,    35,    36,    37,    38,    39,    -1,
       -1,    -1,    -1,    -1,    45,    46,    47,    48,    49,    50,
       -1,    -1,    -1,    54,    55,    -1,    57,    58,    59,    60,
       61,    62,    63,    64,    65,    66,    67,    68,    69,    70,
+      -1,    72,    73,    74,    -1,    76,    77,    -1,    -1,    10,
+      11,    12,    13,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    25,    26,    27,    28,    29,    30,
+      31,    32,    33,    34,    35,    36,    37,    38,    39,    -1,
+      -1,    -1,    -1,   114,    45,    46,    47,    48,    49,    50,
+      -1,    -1,    -1,    54,    55,    -1,    57,    58,    59,    60,
+      61,    62,    63,    64,    65,    66,    67,    68,    69,    70,
       -1,    72,    73,    74,    -1,    76,    77,    78,    79,    80,
       81,    -1,    -1,    -1,    85,    86,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,     3,
-       4,     5,     6,   104,     8,     9,    10,    11,    12,    13,
-      -1,    -1,    -1,    -1,   115,   116,    -1,   118,    -1,    -1,
-      -1,    25,    26,    27,    28,    29,    30,    31,    32,    33,
-      34,    35,    36,    37,    38,    39,    40,    41,    -1,    43,
-      44,    45,    46,    47,    48,    49,    50,    51,    52,    53,
-      54,    55,    -1,    57,    58,    59,    60,    61,    62,    63,
-      64,    65,    66,    67,    68,    69,    70,    -1,    72,    73,
-      74,    75,    -1,    77,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,     3,     4,     5,     6,    -1,     8,
-       9,    10,    11,    12,    13,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   109,    25,    26,    27,    28,
-      29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
-      39,    40,    41,    -1,    43,    44,    45,    46,    47,    48,
-      49,    50,    51,    52,    53,    54,    55,    -1,    57,    58,
-      59,    60,    61,    62,    63,    64,    65,    66,    67,    68,
-      69,    70,    -1,    72,    73,    74,    75,    -1,    77,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,     3,
-       4,     5,     6,    -1,     8,     9,    10,    11,    12,    13,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     109,    25,    26,    27,    28,    29,    30,    31,    32,    33,
-      34,    35,    36,    37,    38,    39,    40,    41,    -1,    43,
-      44,    45,    46,    47,    48,    49,    50,    51,    52,    53,
-      54,    55,    -1,    57,    58,    59,    60,    61,    62,    63,
-      64,    65,    66,    67,    68,    69,    70,    -1,    72,    73,
-      74,    75,    -1,    77,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,     0,    -1,    -1,     3,     4,     5,     6,     7,     8,
-       9,    10,    11,    12,    13,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   109,    25,    26,    27,    28,
-      29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
-      39,    40,    41,    -1,    43,    44,    45,    46,    47,    48,
-      49,    50,    51,    52,    53,    54,    55,    -1,    57,    58,
-      59,    60,    61,    62,    63,    64,    65,    66,    67,    68,
-      69,    70,    -1,    72,    73,    74,    75,    -1,    77,     3,
-       4,     5,     6,     7,     8,     9,    10,    11,    12,    13,
+      -1,    -1,    -1,   104,    -1,    -1,   107,    10,    11,    12,
+      13,    -1,    -1,    -1,   115,   116,   117,   118,    -1,    -1,
+      -1,    -1,    25,    26,    27,    28,    29,    30,    31,    32,
+      33,    34,    35,    36,    37,    38,    39,    -1,    -1,    -1,
+      -1,    -1,    45,    46,    47,    48,    49,    50,    -1,    -1,
+      -1,    54,    55,    -1,    57,    58,    59,    60,    61,    62,
+      63,    64,    65,    66,    67,    68,    69,    70,    -1,    72,
+      73,    74,    -1,    76,    77,    78,    79,    80,    81,    -1,
+      -1,    -1,    85,    86,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    25,    26,    27,    28,    29,    30,    31,    32,    33,
-      34,    35,    36,    37,    38,    39,    40,    41,    -1,    43,
-      44,    45,    46,    47,    48,    49,    50,    51,    52,    53,
-      54,    55,    -1,    57,    58,    59,    60,    61,    62,    63,
-      64,    65,    66,    67,    68,    69,    70,    -1,    72,    73,
-      74,    75,    -1,    77,     3,     4,     5,     6,    -1,     8,
-       9,    10,    11,    12,    13,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    25,    26,    27,    28,
-      29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
-      39,    40,    41,    -1,    43,    44,    45,    46,    47,    48,
-      49,    50,    51,    52,    53,    54,    55,    -1,    57,    58,
-      59,    60,    61,    62,    63,    64,    65,    66,    67,    68,
-      69,    70,    -1,    72,    73,    74,    75,    -1,    77,     4,
-       5,     6,    -1,    -1,    -1,    10,    11,    12,    13,    -1,
+      -1,   104,    10,    11,    12,    13,    -1,    -1,    -1,    -1,
+      -1,   114,   115,   116,   117,   118,    -1,    25,    26,    27,
+      28,    29,    30,    31,    32,    33,    34,    35,    36,    37,
+      38,    39,    -1,    -1,    -1,    -1,    -1,    45,    46,    47,
+      48,    49,    50,    -1,    -1,    -1,    54,    55,    -1,    57,
+      58,    59,    60,    61,    62,    63,    64,    65,    66,    67,
+      68,    69,    70,    -1,    72,    73,    74,    -1,    76,    77,
+      78,    79,    80,    81,    -1,    -1,    -1,    85,    86,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   104,    -1,    -1,   107,
+      10,    11,    12,    13,    -1,    -1,    -1,   115,   116,   117,
+     118,    -1,    -1,    -1,    -1,    25,    26,    27,    28,    29,
+      30,    31,    32,    33,    34,    35,    36,    37,    38,    39,
+      -1,    -1,    -1,    -1,    -1,    45,    46,    47,    48,    49,
+      50,    -1,    -1,    -1,    54,    55,    -1,    57,    58,    59,
+      60,    61,    62,    63,    64,    65,    66,    67,    68,    69,
+      70,    -1,    72,    73,    74,    -1,    76,    77,    78,    79,
+      80,    81,    -1,    -1,    -1,    85,    86,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   104,    10,    11,    12,    13,    -1,
+      -1,    -1,    -1,    -1,    -1,   115,   116,   117,   118,    -1,
       25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
       35,    36,    37,    38,    39,    -1,    -1,    -1,    -1,    -1,
       45,    46,    47,    48,    49,    50,    -1,    -1,    -1,    54,
       55,    -1,    57,    58,    59,    60,    61,    62,    63,    64,
       65,    66,    67,    68,    69,    70,    -1,    72,    73,    74,
-      -1,    -1,    77,    10,    11,    12,    13,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    25,    26,
-      27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
-      37,    38,    39,    -1,    -1,    -1,    -1,    -1,    45,    46,
-      47,    48,    49,    50,    -1,    -1,    -1,    54,    55,    -1,
-      57,    58,    59,    60,    61,    62,    63,    64,    65,    66,
-      67,    68,    69,    70,    -1,    72,    73,    74,    -1,    76,
-      77,    10,    11,    12,    13,    -1,    -1,    -1,    -1,    -1,
+      -1,    76,    77,    78,    79,    80,    81,    -1,    -1,    -1,
+      85,    86,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,     3,     4,     5,     6,   104,
+       8,     9,    10,    11,    12,    13,    -1,    -1,    -1,    -1,
+     115,   116,   117,   118,    -1,    -1,    -1,    25,    26,    27,
+      28,    29,    30,    31,    32,    33,    34,    35,    36,    37,
+      38,    39,    40,    41,    -1,    43,    44,    45,    46,    47,
+      48,    49,    50,    51,    52,    53,    54,    55,    -1,    57,
+      58,    59,    60,    61,    62,    63,    64,    65,    66,    67,
+      68,    69,    70,    -1,    72,    73,    74,    75,    -1,    77,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       3,     4,     5,     6,    -1,     8,     9,    10,    11,    12,
+      13,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   109,    25,    26,    27,    28,    29,    30,    31,    32,
+      33,    34,    35,    36,    37,    38,    39,    40,    41,    -1,
+      43,    44,    45,    46,    47,    48,    49,    50,    51,    52,
+      53,    54,    55,    -1,    57,    58,    59,    60,    61,    62,
+      63,    64,    65,    66,    67,    68,    69,    70,    -1,    72,
+      73,    74,    75,    -1,    77,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,     3,     4,     5,     6,    -1,
+       8,     9,    10,    11,    12,    13,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   109,    25,    26,    27,
+      28,    29,    30,    31,    32,    33,    34,    35,    36,    37,
+      38,    39,    40,    41,    -1,    43,    44,    45,    46,    47,
+      48,    49,    50,    51,    52,    53,    54,    55,    -1,    57,
+      58,    59,    60,    61,    62,    63,    64,    65,    66,    67,
+      68,    69,    70,    -1,    72,    73,    74,    75,    -1,    77,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,     0,    -1,    -1,
+       3,     4,     5,     6,     7,     8,     9,    10,    11,    12,
+      13,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   109,    25,    26,    27,    28,    29,    30,    31,    32,
+      33,    34,    35,    36,    37,    38,    39,    40,    41,    -1,
+      43,    44,    45,    46,    47,    48,    49,    50,    51,    52,
+      53,    54,    55,    -1,    57,    58,    59,    60,    61,    62,
+      63,    64,    65,    66,    67,    68,    69,    70,    -1,    72,
+      73,    74,    75,    -1,    77,     3,     4,     5,     6,     7,
+       8,     9,    10,    11,    12,    13,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    25,    26,    27,
+      28,    29,    30,    31,    32,    33,    34,    35,    36,    37,
+      38,    39,    40,    41,    -1,    43,    44,    45,    46,    47,
+      48,    49,    50,    51,    52,    53,    54,    55,    -1,    57,
+      58,    59,    60,    61,    62,    63,    64,    65,    66,    67,
+      68,    69,    70,    -1,    72,    73,    74,    75,    -1,    77,
+       3,     4,     5,     6,    -1,     8,     9,    10,    11,    12,
+      13,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    25,    26,    27,    28,    29,    30,    31,    32,
+      33,    34,    35,    36,    37,    38,    39,    40,    41,    -1,
+      43,    44,    45,    46,    47,    48,    49,    50,    51,    52,
+      53,    54,    55,    -1,    57,    58,    59,    60,    61,    62,
+      63,    64,    65,    66,    67,    68,    69,    70,    -1,    72,
+      73,    74,    75,    -1,    77,     4,     5,     6,    -1,    -1,
+      -1,    10,    11,    12,    13,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    25,    26,    27,    28,
       29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
       39,    -1,    -1,    -1,    -1,    -1,    45,    46,    47,    48,
       49,    50,    -1,    -1,    -1,    54,    55,    -1,    57,    58,
       59,    60,    61,    62,    63,    64,    65,    66,    67,    68,
-      69,    70,    -1,    72,    73,    74,    -1,    -1,    77
+      69,    70,    -1,    72,    73,    74,    -1,    -1,    77,    10,
+      11,    12,    13,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    25,    26,    27,    28,    29,    30,
+      31,    32,    33,    34,    35,    36,    37,    38,    39,    -1,
+      -1,    -1,    -1,    -1,    45,    46,    47,    48,    49,    50,
+      -1,    -1,    -1,    54,    55,    -1,    57,    58,    59,    60,
+      61,    62,    63,    64,    65,    66,    67,    68,    69,    70,
+      -1,    72,    73,    74,    -1,    76,    77,    10,    11,    12,
+      13,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    25,    26,    27,    28,    29,    30,    31,    32,
+      33,    34,    35,    36,    37,    38,    39,    -1,    -1,    -1,
+      -1,    -1,    45,    46,    47,    48,    49,    50,    -1,    -1,
+      -1,    54,    55,    -1,    57,    58,    59,    60,    61,    62,
+      63,    64,    65,    66,    67,    68,    69,    70,    -1,    72,
+      73,    74,    -1,    -1,    77
 };
 
   /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
@@ -1434,30 +1443,32 @@
      176,   181,   175,   106,     0,   216,   181,   185,   108,    76,
      179,   180,   108,   201,   166,   165,   168,   176,   167,   129,
      104,   106,   113,   108,     3,   174,   176,   186,   187,    76,
-      78,    79,    80,    81,    85,    86,   104,   115,   116,   118,
-     130,   131,   132,   134,   135,   136,   137,   138,   139,   140,
-     141,   142,   143,   144,   145,   146,   147,   148,   149,   150,
-     151,   152,   153,   154,   158,   182,   114,   186,   184,   113,
-     105,   111,    14,    15,    16,    18,    19,    20,    21,    56,
-     108,   109,   114,   141,   154,   155,   157,   160,   161,   182,
-     191,   192,   193,   194,   202,   203,   204,   207,   214,   129,
-     165,   168,   106,   113,   107,   158,   155,   190,   176,   129,
-     188,   189,   109,   187,   141,   141,   157,    85,    86,   106,
-     110,   105,   105,   111,    55,   155,   104,   141,   119,   120,
-     121,   116,   118,    87,    88,   122,   123,    89,    90,    91,
-      93,    92,   127,   107,   109,   186,    79,    80,   180,   114,
-     114,   209,   104,   104,   114,   114,   157,   104,   109,   195,
-      94,    95,    96,    97,   103,   113,   156,   111,   114,   109,
-     192,   106,   107,   158,   190,   107,   188,   106,   111,   114,
-      76,   114,   105,   133,   157,    76,    77,   129,   136,   155,
-     141,   141,   141,   143,   143,   145,   145,   145,   145,   146,
-     146,   150,   151,   152,   157,   109,   198,   199,   200,   210,
-     157,   114,   208,   202,   155,   155,   158,   107,   114,   158,
-     189,   106,   114,   107,   112,    56,   201,   193,   191,   203,
-     211,   105,   157,   171,   174,   206,   196,   107,   107,   158,
-     155,   104,   206,   212,   213,   198,   205,   129,   105,   109,
-     107,   157,   114,   105,    17,   113,   193,   197,   201,   114,
-     105,   157,   197,   198,   190,   114
+      78,    79,    80,    81,    85,    86,   104,   115,   116,   117,
+     118,   130,   131,   132,   134,   135,   136,   137,   138,   139,
+     140,   141,   142,   143,   144,   145,   146,   147,   148,   149,
+     150,   151,   152,   153,   154,   158,   182,   114,   186,   184,
+     113,   105,   111,    14,    15,    16,    18,    19,    20,    21,
+      56,   108,   109,   114,   141,   154,   155,   157,   160,   161,
+     182,   191,   192,   193,   194,   202,   203,   204,   207,   214,
+     129,   165,   168,   106,   113,   107,   158,   155,   190,   176,
+     129,   188,   189,   109,   187,   141,   141,   157,    85,    86,
+     106,   110,   105,   105,   111,    55,   155,   104,   141,   119,
+     120,   121,   116,   118,    83,    84,    87,    88,   122,   123,
+      89,    90,   126,   125,   124,    91,    93,    92,   127,   107,
+     109,   186,    79,    80,   180,   114,   114,   209,   104,   104,
+     114,   114,   157,   104,   109,   195,    94,    95,    96,    97,
+      98,    99,   100,   101,   102,   103,   113,   156,   111,   114,
+     109,   192,   106,   107,   158,   190,   107,   188,   106,   111,
+     114,    76,   114,   105,   133,   157,    76,    77,   129,   136,
+     155,   141,   141,   141,   143,   143,   144,   144,   145,   145,
+     145,   145,   146,   146,   147,   148,   149,   150,   151,   152,
+     157,   109,   198,   199,   200,   210,   157,   114,   208,   202,
+     155,   155,   158,   107,   114,   158,   189,   106,   114,   107,
+     112,    56,   201,   193,   191,   203,   211,   105,   157,   171,
+     174,   206,   196,   107,   107,   158,   155,   104,   206,   212,
+     213,   198,   205,   129,   105,   109,   107,   157,   114,   105,
+      17,   113,   193,   197,   201,   114,   105,   157,   197,   198,
+     190,   114
 };
 
   /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
@@ -1466,29 +1477,30 @@
        0,   128,   129,   129,   130,   131,   131,   131,   131,   131,
      131,   132,   132,   132,   132,   132,   132,   133,   134,   135,
      135,   136,   136,   137,   137,   138,   138,   139,   140,   140,
-     141,   141,   141,   141,   142,   142,   142,   143,   143,   143,
-     143,   144,   144,   144,   145,   146,   146,   146,   146,   146,
-     147,   147,   147,   148,   149,   150,   151,   151,   152,   152,
-     153,   153,   154,   154,   155,   155,   156,   156,   156,   156,
-     156,   156,   157,   157,   158,   159,   160,   160,   160,   160,
-     160,   160,   160,   161,   162,   162,   163,   163,   164,   165,
-     165,   166,   166,   166,   166,   167,   167,   167,   167,   168,
-     169,   169,   169,   169,   169,   170,   170,   170,   170,   170,
-     170,   171,   171,   172,   172,   173,   174,   174,   174,   174,
-     174,   174,   174,   174,   175,   175,   175,   175,   175,   175,
-     176,   176,   177,   177,   177,   178,   179,   179,   180,   180,
-     180,   181,   181,   182,   182,   182,   182,   182,   182,   182,
+     141,   141,   141,   141,   142,   142,   142,   142,   143,   143,
+     143,   143,   144,   144,   144,   145,   145,   145,   146,   146,
+     146,   146,   146,   147,   147,   147,   148,   148,   149,   149,
+     150,   150,   151,   151,   152,   152,   153,   153,   154,   154,
+     155,   155,   156,   156,   156,   156,   156,   156,   156,   156,
+     156,   156,   156,   157,   157,   158,   159,   160,   160,   160,
+     160,   160,   160,   160,   161,   162,   162,   163,   163,   164,
+     165,   165,   166,   166,   166,   166,   167,   167,   167,   167,
+     168,   169,   169,   169,   169,   169,   170,   170,   170,   170,
+     170,   170,   171,   171,   172,   172,   173,   174,   174,   174,
+     174,   174,   174,   174,   174,   175,   175,   175,   175,   175,
+     175,   176,   176,   177,   177,   177,   178,   179,   179,   180,
+     180,   180,   181,   181,   182,   182,   182,   182,   182,   182,
      182,   182,   182,   182,   182,   182,   182,   182,   182,   182,
      182,   182,   182,   182,   182,   182,   182,   182,   182,   182,
      182,   182,   182,   182,   182,   182,   182,   182,   182,   182,
-     182,   182,   182,   182,   182,   182,   182,   182,   184,   183,
-     185,   183,   186,   186,   187,   187,   188,   188,   189,   189,
-     190,   191,   192,   192,   193,   193,   193,   193,   193,   194,
-     195,   196,   194,   197,   197,   199,   198,   200,   198,   201,
-     201,   202,   202,   203,   203,   204,   205,   205,   206,   206,
-     208,   207,   209,   207,   210,   207,   211,   211,   212,   212,
-     213,   213,   214,   214,   214,   214,   214,   215,   215,   216,
-     216,   218,   217
+     182,   182,   182,   182,   182,   182,   182,   182,   182,   184,
+     183,   185,   183,   186,   186,   187,   187,   188,   188,   189,
+     189,   190,   191,   192,   192,   193,   193,   193,   193,   193,
+     194,   195,   196,   194,   197,   197,   199,   198,   200,   198,
+     201,   201,   202,   202,   203,   203,   204,   205,   205,   206,
+     206,   208,   207,   209,   207,   210,   207,   211,   211,   212,
+     212,   213,   213,   214,   214,   214,   214,   214,   215,   215,
+     216,   216,   218,   217
 };
 
   /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN.  */
@@ -1497,29 +1509,30 @@
        0,     2,     1,     1,     1,     1,     1,     1,     1,     1,
        3,     1,     4,     1,     3,     2,     2,     1,     1,     1,
        3,     2,     2,     2,     1,     2,     3,     2,     1,     1,
-       1,     2,     2,     2,     1,     1,     1,     1,     3,     3,
-       3,     1,     3,     3,     1,     1,     3,     3,     3,     3,
-       1,     3,     3,     1,     1,     1,     1,     3,     1,     3,
-       1,     3,     1,     5,     1,     3,     1,     1,     1,     1,
-       1,     1,     1,     3,     1,     2,     2,     2,     4,     5,
-       6,     9,     2,     2,     1,     1,     2,     3,     3,     2,
-       5,     3,     2,     3,     2,     0,     1,     1,     1,     1,
-       1,     3,     5,     6,     5,     1,     2,     4,     5,     4,
-       2,     1,     2,     1,     1,     1,     1,     1,     2,     1,
-       2,     1,     1,     2,     1,     1,     1,     2,     2,     1,
-       1,     2,     1,     1,     1,     4,     1,     3,     1,     3,
-       3,     1,     4,     1,     1,     1,     1,     1,     1,     1,
+       1,     2,     2,     2,     1,     1,     1,     1,     1,     3,
+       3,     3,     1,     3,     3,     1,     3,     3,     1,     3,
+       3,     3,     3,     1,     3,     3,     1,     3,     1,     3,
+       1,     3,     1,     3,     1,     3,     1,     3,     1,     5,
+       1,     3,     1,     1,     1,     1,     1,     1,     1,     1,
+       1,     1,     1,     1,     3,     1,     2,     2,     2,     4,
+       5,     6,     9,     2,     2,     1,     1,     2,     3,     3,
+       2,     5,     3,     2,     3,     2,     0,     1,     1,     1,
+       1,     1,     3,     5,     6,     5,     1,     2,     4,     5,
+       4,     2,     1,     2,     1,     1,     1,     1,     1,     2,
+       1,     2,     1,     1,     2,     1,     1,     1,     2,     2,
+       1,     1,     2,     1,     1,     1,     4,     1,     3,     1,
+       3,     3,     1,     4,     1,     1,     1,     1,     1,     1,
        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
-       1,     1,     1,     1,     1,     1,     1,     1,     0,     6,
-       0,     5,     1,     2,     3,     4,     1,     3,     1,     4,
-       1,     1,     1,     1,     1,     1,     1,     1,     1,     2,
-       0,     0,     5,     1,     1,     0,     2,     0,     2,     2,
-       3,     1,     2,     1,     2,     5,     3,     1,     1,     4,
-       0,     6,     0,     8,     0,     7,     1,     1,     1,     0,
-       2,     3,     2,     2,     2,     3,     2,     1,     2,     1,
-       1,     0,     3
+       1,     1,     1,     1,     1,     1,     1,     1,     1,     0,
+       6,     0,     5,     1,     2,     3,     4,     1,     3,     1,
+       4,     1,     1,     1,     1,     1,     1,     1,     1,     1,
+       2,     0,     0,     5,     1,     1,     0,     2,     0,     2,
+       2,     3,     1,     2,     1,     2,     5,     3,     1,     1,
+       4,     0,     6,     0,     8,     0,     7,     1,     1,     1,
+       0,     2,     3,     2,     2,     2,     3,     2,     1,     2,
+       1,     1,     0,     3
 };
 
 
@@ -2719,10 +2732,11 @@
             if ((yyval.interm.intermTypedNode) == 0) {
                 const char* errorOp = "";
                 switch((yyvsp[-1].interm).op) {
-                case EOpNegative:   errorOp = "-"; break;
-                case EOpPositive:   errorOp = "+"; break;
-                case EOpLogicalNot: errorOp = "!"; break;
-                default: break;
+                  case EOpNegative:   errorOp = "-"; break;
+                  case EOpPositive:   errorOp = "+"; break;
+                  case EOpLogicalNot: errorOp = "!"; break;
+                  case EOpBitwiseNot: errorOp = "~"; break;
+                  default: break;
                 }
                 context->unaryOpError((yylsp[-1]), errorOp, (yyvsp[0].interm.intermTypedNode)->getCompleteString());
                 context->recover();
@@ -2754,12 +2768,21 @@
 
   case 37:
 
-    { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
+    {
+        ES3_ONLY("~", (yyloc), "bit-wise operator");
+        (yyval.interm).op = EOpBitwiseNot;
+    }
 
     break;
 
   case 38:
 
+    { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
+
+    break;
+
+  case 39:
+
     {
         (yyval.interm.intermTypedNode) = context->intermediate.addBinaryMath(EOpMul, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
         if ((yyval.interm.intermTypedNode) == 0) {
@@ -2771,7 +2794,7 @@
 
     break;
 
-  case 39:
+  case 40:
 
     {
         (yyval.interm.intermTypedNode) = context->intermediate.addBinaryMath(EOpDiv, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
@@ -2784,7 +2807,7 @@
 
     break;
 
-  case 40:
+  case 41:
 
     {
         ES3_ONLY("%", (yylsp[-1]), "integer modulus operator");
@@ -2798,13 +2821,13 @@
 
     break;
 
-  case 41:
+  case 42:
 
     { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
 
     break;
 
-  case 42:
+  case 43:
 
     {
         (yyval.interm.intermTypedNode) = context->intermediate.addBinaryMath(EOpAdd, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
@@ -2817,7 +2840,7 @@
 
     break;
 
-  case 43:
+  case 44:
 
     {
         (yyval.interm.intermTypedNode) = context->intermediate.addBinaryMath(EOpSub, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
@@ -2830,12 +2853,6 @@
 
     break;
 
-  case 44:
-
-    { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
-
-    break;
-
   case 45:
 
     { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
@@ -2845,6 +2862,40 @@
   case 46:
 
     {
+        ES3_ONLY("<<", (yylsp[-1]), "bit-wise operator");
+        (yyval.interm.intermTypedNode) = context->intermediate.addBinaryMath(EOpBitShiftLeft, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
+        if ((yyval.interm.intermTypedNode) == 0) {
+            context->binaryOpError((yylsp[-1]), "<<", (yyvsp[-2].interm.intermTypedNode)->getCompleteString(), (yyvsp[0].interm.intermTypedNode)->getCompleteString());
+            context->recover();
+            (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);
+        }
+    }
+
+    break;
+
+  case 47:
+
+    {
+        ES3_ONLY(">>", (yylsp[-1]), "bit-wise operator");
+        (yyval.interm.intermTypedNode) = context->intermediate.addBinaryMath(EOpBitShiftRight, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
+        if ((yyval.interm.intermTypedNode) == 0) {
+            context->binaryOpError((yylsp[-1]), ">>", (yyvsp[-2].interm.intermTypedNode)->getCompleteString(), (yyvsp[0].interm.intermTypedNode)->getCompleteString());
+            context->recover();
+            (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);
+        }
+    }
+
+    break;
+
+  case 48:
+
+    { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
+
+    break;
+
+  case 49:
+
+    {
         (yyval.interm.intermTypedNode) = context->intermediate.addBinaryMath(EOpLessThan, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
         if ((yyval.interm.intermTypedNode) == 0) {
             context->binaryOpError((yylsp[-1]), "<", (yyvsp[-2].interm.intermTypedNode)->getCompleteString(), (yyvsp[0].interm.intermTypedNode)->getCompleteString());
@@ -2857,7 +2908,7 @@
 
     break;
 
-  case 47:
+  case 50:
 
     {
         (yyval.interm.intermTypedNode) = context->intermediate.addBinaryMath(EOpGreaterThan, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
@@ -2872,7 +2923,7 @@
 
     break;
 
-  case 48:
+  case 51:
 
     {
         (yyval.interm.intermTypedNode) = context->intermediate.addBinaryMath(EOpLessThanEqual, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
@@ -2887,7 +2938,7 @@
 
     break;
 
-  case 49:
+  case 52:
 
     {
         (yyval.interm.intermTypedNode) = context->intermediate.addBinaryMath(EOpGreaterThanEqual, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
@@ -2902,42 +2953,6 @@
 
     break;
 
-  case 50:
-
-    { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
-
-    break;
-
-  case 51:
-
-    {
-        (yyval.interm.intermTypedNode) = context->intermediate.addBinaryMath(EOpEqual, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
-        if ((yyval.interm.intermTypedNode) == 0) {
-            context->binaryOpError((yylsp[-1]), "==", (yyvsp[-2].interm.intermTypedNode)->getCompleteString(), (yyvsp[0].interm.intermTypedNode)->getCompleteString());
-            context->recover();
-            ConstantUnion *unionArray = new ConstantUnion[1];
-            unionArray->setBConst(false);
-            (yyval.interm.intermTypedNode) = context->intermediate.addConstantUnion(unionArray, TType(EbtBool, EbpUndefined, EvqConst), (yylsp[-1]));
-        }
-    }
-
-    break;
-
-  case 52:
-
-    {
-        (yyval.interm.intermTypedNode) = context->intermediate.addBinaryMath(EOpNotEqual, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
-        if ((yyval.interm.intermTypedNode) == 0) {
-            context->binaryOpError((yylsp[-1]), "!=", (yyvsp[-2].interm.intermTypedNode)->getCompleteString(), (yyvsp[0].interm.intermTypedNode)->getCompleteString());
-            context->recover();
-            ConstantUnion *unionArray = new ConstantUnion[1];
-            unionArray->setBConst(false);
-            (yyval.interm.intermTypedNode) = context->intermediate.addConstantUnion(unionArray, TType(EbtBool, EbpUndefined, EvqConst), (yylsp[-1]));
-        }
-    }
-
-    break;
-
   case 53:
 
     { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
@@ -2946,13 +2961,31 @@
 
   case 54:
 
-    { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
+    {
+        (yyval.interm.intermTypedNode) = context->intermediate.addBinaryMath(EOpEqual, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
+        if ((yyval.interm.intermTypedNode) == 0) {
+            context->binaryOpError((yylsp[-1]), "==", (yyvsp[-2].interm.intermTypedNode)->getCompleteString(), (yyvsp[0].interm.intermTypedNode)->getCompleteString());
+            context->recover();
+            ConstantUnion *unionArray = new ConstantUnion[1];
+            unionArray->setBConst(false);
+            (yyval.interm.intermTypedNode) = context->intermediate.addConstantUnion(unionArray, TType(EbtBool, EbpUndefined, EvqConst), (yylsp[-1]));
+        }
+    }
 
     break;
 
   case 55:
 
-    { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
+    {
+        (yyval.interm.intermTypedNode) = context->intermediate.addBinaryMath(EOpNotEqual, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
+        if ((yyval.interm.intermTypedNode) == 0) {
+            context->binaryOpError((yylsp[-1]), "!=", (yyvsp[-2].interm.intermTypedNode)->getCompleteString(), (yyvsp[0].interm.intermTypedNode)->getCompleteString());
+            context->recover();
+            ConstantUnion *unionArray = new ConstantUnion[1];
+            unionArray->setBConst(false);
+            (yyval.interm.intermTypedNode) = context->intermediate.addConstantUnion(unionArray, TType(EbtBool, EbpUndefined, EvqConst), (yylsp[-1]));
+        }
+    }
 
     break;
 
@@ -2965,13 +2998,12 @@
   case 57:
 
     {
-        (yyval.interm.intermTypedNode) = context->intermediate.addBinaryMath(EOpLogicalAnd, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
+        ES3_ONLY("&", (yylsp[-1]), "bit-wise operator");
+        (yyval.interm.intermTypedNode) = context->intermediate.addBinaryMath(EOpBitwiseAnd, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
         if ((yyval.interm.intermTypedNode) == 0) {
-            context->binaryOpError((yylsp[-1]), "&&", (yyvsp[-2].interm.intermTypedNode)->getCompleteString(), (yyvsp[0].interm.intermTypedNode)->getCompleteString());
+            context->binaryOpError((yylsp[-1]), "&", (yyvsp[-2].interm.intermTypedNode)->getCompleteString(), (yyvsp[0].interm.intermTypedNode)->getCompleteString());
             context->recover();
-            ConstantUnion *unionArray = new ConstantUnion[1];
-            unionArray->setBConst(false);
-            (yyval.interm.intermTypedNode) = context->intermediate.addConstantUnion(unionArray, TType(EbtBool, EbpUndefined, EvqConst), (yylsp[-1]));
+            (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);
         }
     }
 
@@ -2986,13 +3018,12 @@
   case 59:
 
     {
-        (yyval.interm.intermTypedNode) = context->intermediate.addBinaryMath(EOpLogicalXor, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
+        ES3_ONLY("^", (yylsp[-1]), "bit-wise operator");
+        (yyval.interm.intermTypedNode) = context->intermediate.addBinaryMath(EOpBitwiseXor, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
         if ((yyval.interm.intermTypedNode) == 0) {
-            context->binaryOpError((yylsp[-1]), "^^", (yyvsp[-2].interm.intermTypedNode)->getCompleteString(), (yyvsp[0].interm.intermTypedNode)->getCompleteString());
+            context->binaryOpError((yylsp[-1]), "^", (yyvsp[-2].interm.intermTypedNode)->getCompleteString(), (yyvsp[0].interm.intermTypedNode)->getCompleteString());
             context->recover();
-            ConstantUnion *unionArray = new ConstantUnion[1];
-            unionArray->setBConst(false);
-            (yyval.interm.intermTypedNode) = context->intermediate.addConstantUnion(unionArray, TType(EbtBool, EbpUndefined, EvqConst), (yylsp[-1]));
+            (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);
         }
     }
 
@@ -3007,13 +3038,12 @@
   case 61:
 
     {
-        (yyval.interm.intermTypedNode) = context->intermediate.addBinaryMath(EOpLogicalOr, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
+        ES3_ONLY("|", (yylsp[-1]), "bit-wise operator");
+        (yyval.interm.intermTypedNode) = context->intermediate.addBinaryMath(EOpBitwiseOr, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
         if ((yyval.interm.intermTypedNode) == 0) {
-            context->binaryOpError((yylsp[-1]), "||", (yyvsp[-2].interm.intermTypedNode)->getCompleteString(), (yyvsp[0].interm.intermTypedNode)->getCompleteString());
+            context->binaryOpError((yylsp[-1]), "|", (yyvsp[-2].interm.intermTypedNode)->getCompleteString(), (yyvsp[0].interm.intermTypedNode)->getCompleteString());
             context->recover();
-            ConstantUnion *unionArray = new ConstantUnion[1];
-            unionArray->setBConst(false);
-            (yyval.interm.intermTypedNode) = context->intermediate.addConstantUnion(unionArray, TType(EbtBool, EbpUndefined, EvqConst), (yylsp[-1]));
+            (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);
         }
     }
 
@@ -3028,6 +3058,69 @@
   case 63:
 
     {
+        (yyval.interm.intermTypedNode) = context->intermediate.addBinaryMath(EOpLogicalAnd, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
+        if ((yyval.interm.intermTypedNode) == 0) {
+            context->binaryOpError((yylsp[-1]), "&&", (yyvsp[-2].interm.intermTypedNode)->getCompleteString(), (yyvsp[0].interm.intermTypedNode)->getCompleteString());
+            context->recover();
+            ConstantUnion *unionArray = new ConstantUnion[1];
+            unionArray->setBConst(false);
+            (yyval.interm.intermTypedNode) = context->intermediate.addConstantUnion(unionArray, TType(EbtBool, EbpUndefined, EvqConst), (yylsp[-1]));
+        }
+    }
+
+    break;
+
+  case 64:
+
+    { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
+
+    break;
+
+  case 65:
+
+    {
+        (yyval.interm.intermTypedNode) = context->intermediate.addBinaryMath(EOpLogicalXor, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
+        if ((yyval.interm.intermTypedNode) == 0) {
+            context->binaryOpError((yylsp[-1]), "^^", (yyvsp[-2].interm.intermTypedNode)->getCompleteString(), (yyvsp[0].interm.intermTypedNode)->getCompleteString());
+            context->recover();
+            ConstantUnion *unionArray = new ConstantUnion[1];
+            unionArray->setBConst(false);
+            (yyval.interm.intermTypedNode) = context->intermediate.addConstantUnion(unionArray, TType(EbtBool, EbpUndefined, EvqConst), (yylsp[-1]));
+        }
+    }
+
+    break;
+
+  case 66:
+
+    { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
+
+    break;
+
+  case 67:
+
+    {
+        (yyval.interm.intermTypedNode) = context->intermediate.addBinaryMath(EOpLogicalOr, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
+        if ((yyval.interm.intermTypedNode) == 0) {
+            context->binaryOpError((yylsp[-1]), "||", (yyvsp[-2].interm.intermTypedNode)->getCompleteString(), (yyvsp[0].interm.intermTypedNode)->getCompleteString());
+            context->recover();
+            ConstantUnion *unionArray = new ConstantUnion[1];
+            unionArray->setBConst(false);
+            (yyval.interm.intermTypedNode) = context->intermediate.addConstantUnion(unionArray, TType(EbtBool, EbpUndefined, EvqConst), (yylsp[-1]));
+        }
+    }
+
+    break;
+
+  case 68:
+
+    { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
+
+    break;
+
+  case 69:
+
+    {
        if (context->boolErrorCheck((yylsp[-3]), (yyvsp[-4].interm.intermTypedNode)))
             context->recover();
 
@@ -3044,13 +3137,13 @@
 
     break;
 
-  case 64:
+  case 70:
 
     { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
 
     break;
 
-  case 65:
+  case 71:
 
     {
         if (context->lValueErrorCheck((yylsp[-1]), "assign", (yyvsp[-2].interm.intermTypedNode)))
@@ -3065,25 +3158,25 @@
 
     break;
 
-  case 66:
+  case 72:
 
     { (yyval.interm).op = EOpAssign; }
 
     break;
 
-  case 67:
+  case 73:
 
     { (yyval.interm).op = EOpMulAssign; }
 
     break;
 
-  case 68:
+  case 74:
 
     { (yyval.interm).op = EOpDivAssign; }
 
     break;
 
-  case 69:
+  case 75:
 
     {
         ES3_ONLY("%=", (yyloc), "integer modulus operator");
@@ -3092,19 +3185,64 @@
 
     break;
 
-  case 70:
+  case 76:
 
     { (yyval.interm).op = EOpAddAssign; }
 
     break;
 
-  case 71:
+  case 77:
 
     { (yyval.interm).op = EOpSubAssign; }
 
     break;
 
-  case 72:
+  case 78:
+
+    {
+        ES3_ONLY("<<=", (yyloc), "bit-wise operator");
+        (yyval.interm).op = EOpBitShiftLeftAssign;
+    }
+
+    break;
+
+  case 79:
+
+    {
+        ES3_ONLY(">>=", (yyloc), "bit-wise operator");
+        (yyval.interm).op = EOpBitShiftRightAssign;
+    }
+
+    break;
+
+  case 80:
+
+    {
+        ES3_ONLY("&=", (yyloc), "bit-wise operator");
+        (yyval.interm).op = EOpBitwiseAndAssign;
+    }
+
+    break;
+
+  case 81:
+
+    {
+        ES3_ONLY("^=", (yyloc), "bit-wise operator");
+        (yyval.interm).op = EOpBitwiseXorAssign;
+    }
+
+    break;
+
+  case 82:
+
+    {
+        ES3_ONLY("|=", (yyloc), "bit-wise operator");
+        (yyval.interm).op = EOpBitwiseOrAssign;
+    }
+
+    break;
+
+  case 83:
 
     {
         (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
@@ -3112,7 +3250,7 @@
 
     break;
 
-  case 73:
+  case 84:
 
     {
         (yyval.interm.intermTypedNode) = context->intermediate.addComma((yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
@@ -3125,7 +3263,7 @@
 
     break;
 
-  case 74:
+  case 85:
 
     {
         if (context->constErrorCheck((yyvsp[0].interm.intermTypedNode)))
@@ -3135,7 +3273,7 @@
 
     break;
 
-  case 75:
+  case 86:
 
     {
         if (context->enterStructDeclaration((yylsp[-1]), *(yyvsp[-1].lex).string))
@@ -3145,7 +3283,7 @@
 
     break;
 
-  case 76:
+  case 87:
 
     {
         TFunction &function = *((yyvsp[-1].interm).function);
@@ -3177,7 +3315,7 @@
 
     break;
 
-  case 77:
+  case 88:
 
     {
         TIntermAggregate *aggNode = (yyvsp[-1].interm).intermAggregate;
@@ -3188,7 +3326,7 @@
 
     break;
 
-  case 78:
+  case 89:
 
     {
         if (((yyvsp[-2].interm.precision) == EbpHigh) && (context->shaderType == GL_FRAGMENT_SHADER) && !context->fragmentPrecisionHigh) {
@@ -3204,7 +3342,7 @@
 
     break;
 
-  case 79:
+  case 90:
 
     {
         ES3_ONLY(getQualifierString((yyvsp[-4].interm.type).qualifier), (yylsp[-4]), "interface blocks");
@@ -3213,7 +3351,7 @@
 
     break;
 
-  case 80:
+  case 91:
 
     {
         ES3_ONLY(getQualifierString((yyvsp[-5].interm.type).qualifier), (yylsp[-5]), "interface blocks");
@@ -3222,7 +3360,7 @@
 
     break;
 
-  case 81:
+  case 92:
 
     {
         ES3_ONLY(getQualifierString((yyvsp[-8].interm.type).qualifier), (yylsp[-8]), "interface blocks");
@@ -3231,7 +3369,7 @@
 
     break;
 
-  case 82:
+  case 93:
 
     {
         context->parseGlobalLayoutQualifier((yyvsp[-1].interm.type));
@@ -3240,7 +3378,7 @@
 
     break;
 
-  case 83:
+  case 94:
 
     {
         //
@@ -3298,7 +3436,7 @@
 
     break;
 
-  case 84:
+  case 95:
 
     {
         (yyval.interm.function) = (yyvsp[0].interm.function);
@@ -3306,7 +3444,7 @@
 
     break;
 
-  case 85:
+  case 96:
 
     {
         (yyval.interm.function) = (yyvsp[0].interm.function);
@@ -3314,7 +3452,7 @@
 
     break;
 
-  case 86:
+  case 97:
 
     {
         // Add the parameter
@@ -3327,7 +3465,7 @@
 
     break;
 
-  case 87:
+  case 98:
 
     {
         //
@@ -3350,7 +3488,7 @@
 
     break;
 
-  case 88:
+  case 99:
 
     {
         if ((yyvsp[-2].interm.type).qualifier != EvqGlobal && (yyvsp[-2].interm.type).qualifier != EvqTemporary) {
@@ -3372,7 +3510,7 @@
 
     break;
 
-  case 89:
+  case 100:
 
     {
         if ((yyvsp[-1].interm.type).type == EbtVoid) {
@@ -3387,7 +3525,7 @@
 
     break;
 
-  case 90:
+  case 101:
 
     {
         // Check that we can make an array out of this type
@@ -3409,7 +3547,7 @@
 
     break;
 
-  case 91:
+  case 102:
 
     {
         (yyval.interm) = (yyvsp[0].interm);
@@ -3419,7 +3557,7 @@
 
     break;
 
-  case 92:
+  case 103:
 
     {
         (yyval.interm) = (yyvsp[0].interm);
@@ -3431,7 +3569,7 @@
 
     break;
 
-  case 93:
+  case 104:
 
     {
         (yyval.interm) = (yyvsp[0].interm);
@@ -3441,7 +3579,7 @@
 
     break;
 
-  case 94:
+  case 105:
 
     {
         (yyval.interm) = (yyvsp[0].interm);
@@ -3453,7 +3591,7 @@
 
     break;
 
-  case 95:
+  case 106:
 
     {
         (yyval.interm.qualifier) = EvqIn;
@@ -3461,7 +3599,7 @@
 
     break;
 
-  case 96:
+  case 107:
 
     {
         (yyval.interm.qualifier) = EvqIn;
@@ -3469,7 +3607,7 @@
 
     break;
 
-  case 97:
+  case 108:
 
     {
         (yyval.interm.qualifier) = EvqOut;
@@ -3477,7 +3615,7 @@
 
     break;
 
-  case 98:
+  case 109:
 
     {
         (yyval.interm.qualifier) = EvqInOut;
@@ -3485,7 +3623,7 @@
 
     break;
 
-  case 99:
+  case 110:
 
     {
         TParameter param = { 0, new TType((yyvsp[0].interm.type)) };
@@ -3494,7 +3632,7 @@
 
     break;
 
-  case 100:
+  case 111:
 
     {
         (yyval.interm) = (yyvsp[0].interm);
@@ -3502,7 +3640,7 @@
 
     break;
 
-  case 101:
+  case 112:
 
     {
         (yyval.interm) = (yyvsp[-2].interm);
@@ -3511,7 +3649,7 @@
 
     break;
 
-  case 102:
+  case 113:
 
     {
         (yyval.interm) = (yyvsp[-4].interm);
@@ -3520,7 +3658,7 @@
 
     break;
 
-  case 103:
+  case 114:
 
     {
         (yyval.interm) = (yyvsp[-5].interm);
@@ -3529,7 +3667,7 @@
 
     break;
 
-  case 104:
+  case 115:
 
     {
         (yyval.interm) = (yyvsp[-4].interm);
@@ -3538,7 +3676,7 @@
 
     break;
 
-  case 105:
+  case 116:
 
     {
         (yyval.interm).type = (yyvsp[0].interm.type);
@@ -3547,7 +3685,7 @@
 
     break;
 
-  case 106:
+  case 117:
 
     {
         (yyval.interm).type = (yyvsp[-1].interm.type);
@@ -3556,7 +3694,7 @@
 
     break;
 
-  case 107:
+  case 118:
 
     {
         context->error((yylsp[-2]), "unsized array declarations not supported", (yyvsp[-2].lex).string->c_str());
@@ -3568,7 +3706,7 @@
 
     break;
 
-  case 108:
+  case 119:
 
     {
         (yyval.interm).type = (yyvsp[-4].interm.type);
@@ -3577,7 +3715,7 @@
 
     break;
 
-  case 109:
+  case 120:
 
     {
         (yyval.interm).type = (yyvsp[-3].interm.type);
@@ -3586,7 +3724,7 @@
 
     break;
 
-  case 110:
+  case 121:
 
     {
         // $$.type is not used in invariant declarations.
@@ -3595,7 +3733,7 @@
 
     break;
 
-  case 111:
+  case 122:
 
     {
         (yyval.interm.type) = (yyvsp[0].interm.type);
@@ -3609,7 +3747,7 @@
 
     break;
 
-  case 112:
+  case 123:
 
     {
         (yyval.interm.type) = context->addFullySpecifiedType((yyvsp[-1].interm.type).qualifier, (yyvsp[-1].interm.type).layoutQualifier, (yyvsp[0].interm.type));
@@ -3617,7 +3755,7 @@
 
     break;
 
-  case 113:
+  case 124:
 
     {
         (yyval.interm.type).qualifier = EvqSmooth;
@@ -3625,7 +3763,7 @@
 
     break;
 
-  case 114:
+  case 125:
 
     {
         (yyval.interm.type).qualifier = EvqFlat;
@@ -3633,7 +3771,7 @@
 
     break;
 
-  case 115:
+  case 126:
 
     {
         (yyval.interm.qualifier) = EvqConst;
@@ -3641,7 +3779,7 @@
 
     break;
 
-  case 116:
+  case 127:
 
     {
         VERTEX_ONLY("attribute", (yylsp[0]));
@@ -3653,7 +3791,7 @@
 
     break;
 
-  case 117:
+  case 128:
 
     {
         ES2_ONLY("varying", (yylsp[0]));
@@ -3667,7 +3805,7 @@
 
     break;
 
-  case 118:
+  case 129:
 
     {
         ES2_ONLY("varying", (yylsp[-1]));
@@ -3681,7 +3819,7 @@
 
     break;
 
-  case 119:
+  case 130:
 
     {
         if ((yyvsp[0].interm.type).qualifier != EvqConst && !context->symbolTable.atGlobalLevel()) {
@@ -3694,7 +3832,7 @@
 
     break;
 
-  case 120:
+  case 131:
 
     {
         (yyval.interm.type) = context->joinInterpolationQualifiers((yylsp[-1]), (yyvsp[-1].interm.type).qualifier, (yylsp[0]), (yyvsp[0].interm.type).qualifier);
@@ -3702,7 +3840,7 @@
 
     break;
 
-  case 121:
+  case 132:
 
     {
         context->error((yylsp[0]), "interpolation qualifier requires a fragment 'in' or vertex 'out' storage qualifier", getInterpolationString((yyvsp[0].interm.type).qualifier));
@@ -3714,7 +3852,7 @@
 
     break;
 
-  case 122:
+  case 133:
 
     {
         (yyval.interm.type).qualifier = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
@@ -3723,7 +3861,7 @@
 
     break;
 
-  case 123:
+  case 134:
 
     {
         (yyval.interm.type).setBasic(EbtVoid, (yyvsp[0].interm.type).qualifier, (yylsp[0]));
@@ -3732,7 +3870,7 @@
 
     break;
 
-  case 124:
+  case 135:
 
     {
         (yyval.interm.type).qualifier = EvqConst;
@@ -3740,7 +3878,7 @@
 
     break;
 
-  case 125:
+  case 136:
 
     {
         ES3_ONLY("in", (yylsp[0]), "storage qualifier");
@@ -3749,7 +3887,7 @@
 
     break;
 
-  case 126:
+  case 137:
 
     {
         ES3_ONLY("out", (yylsp[0]), "storage qualifier");
@@ -3758,7 +3896,7 @@
 
     break;
 
-  case 127:
+  case 138:
 
     {
         ES3_ONLY("centroid in", (yylsp[-1]), "storage qualifier");
@@ -3772,7 +3910,7 @@
 
     break;
 
-  case 128:
+  case 139:
 
     {
         ES3_ONLY("centroid out", (yylsp[-1]), "storage qualifier");
@@ -3786,7 +3924,7 @@
 
     break;
 
-  case 129:
+  case 140:
 
     {
         if (context->globalErrorCheck((yylsp[0]), context->symbolTable.atGlobalLevel(), "uniform"))
@@ -3796,7 +3934,7 @@
 
     break;
 
-  case 130:
+  case 141:
 
     {
         (yyval.interm.type) = (yyvsp[0].interm.type);
@@ -3811,7 +3949,7 @@
 
     break;
 
-  case 131:
+  case 142:
 
     {
         (yyval.interm.type) = (yyvsp[0].interm.type);
@@ -3825,7 +3963,7 @@
 
     break;
 
-  case 132:
+  case 143:
 
     {
         (yyval.interm.precision) = EbpHigh;
@@ -3833,7 +3971,7 @@
 
     break;
 
-  case 133:
+  case 144:
 
     {
         (yyval.interm.precision) = EbpMedium;
@@ -3841,7 +3979,7 @@
 
     break;
 
-  case 134:
+  case 145:
 
     {
         (yyval.interm.precision) = EbpLow;
@@ -3849,7 +3987,7 @@
 
     break;
 
-  case 135:
+  case 146:
 
     {
         ES3_ONLY("layout", (yylsp[-3]), "qualifier");
@@ -3858,7 +3996,7 @@
 
     break;
 
-  case 136:
+  case 147:
 
     {
         (yyval.interm.layoutQualifier) = (yyvsp[0].interm.layoutQualifier);
@@ -3866,7 +4004,7 @@
 
     break;
 
-  case 137:
+  case 148:
 
     {
         (yyval.interm.layoutQualifier) = context->joinLayoutQualifiers((yyvsp[-2].interm.layoutQualifier), (yyvsp[0].interm.layoutQualifier));
@@ -3874,7 +4012,7 @@
 
     break;
 
-  case 138:
+  case 149:
 
     {
         (yyval.interm.layoutQualifier) = context->parseLayoutQualifier(*(yyvsp[0].lex).string, (yylsp[0]));
@@ -3882,7 +4020,7 @@
 
     break;
 
-  case 139:
+  case 150:
 
     {
         (yyval.interm.layoutQualifier) = context->parseLayoutQualifier(*(yyvsp[-2].lex).string, (yylsp[-2]), *(yyvsp[0].lex).string, (yyvsp[0].lex).i, (yylsp[0]));
@@ -3890,7 +4028,7 @@
 
     break;
 
-  case 140:
+  case 151:
 
     {
         (yyval.interm.layoutQualifier) = context->parseLayoutQualifier(*(yyvsp[-2].lex).string, (yylsp[-2]), *(yyvsp[0].lex).string, (yyvsp[0].lex).i, (yylsp[0]));
@@ -3898,7 +4036,7 @@
 
     break;
 
-  case 141:
+  case 152:
 
     {
         (yyval.interm.type) = (yyvsp[0].interm.type);
@@ -3906,7 +4044,7 @@
 
     break;
 
-  case 142:
+  case 153:
 
     {
         (yyval.interm.type) = (yyvsp[-3].interm.type);
@@ -3923,7 +4061,7 @@
 
     break;
 
-  case 143:
+  case 154:
 
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
@@ -3932,118 +4070,11 @@
 
     break;
 
-  case 144:
-
-    {
-        TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
-        (yyval.interm.type).setBasic(EbtFloat, qual, (yylsp[0]));
-    }
-
-    break;
-
-  case 145:
-
-    {
-        TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
-        (yyval.interm.type).setBasic(EbtInt, qual, (yylsp[0]));
-    }
-
-    break;
-
-  case 146:
-
-    {
-        TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
-        (yyval.interm.type).setBasic(EbtUInt, qual, (yylsp[0]));
-    }
-
-    break;
-
-  case 147:
-
-    {
-        TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
-        (yyval.interm.type).setBasic(EbtBool, qual, (yylsp[0]));
-    }
-
-    break;
-
-  case 148:
-
-    {
-        TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
-        (yyval.interm.type).setBasic(EbtFloat, qual, (yylsp[0]));
-        (yyval.interm.type).setAggregate(2);
-    }
-
-    break;
-
-  case 149:
-
-    {
-        TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
-        (yyval.interm.type).setBasic(EbtFloat, qual, (yylsp[0]));
-        (yyval.interm.type).setAggregate(3);
-    }
-
-    break;
-
-  case 150:
-
-    {
-        TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
-        (yyval.interm.type).setBasic(EbtFloat, qual, (yylsp[0]));
-        (yyval.interm.type).setAggregate(4);
-    }
-
-    break;
-
-  case 151:
-
-    {
-        TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
-        (yyval.interm.type).setBasic(EbtBool, qual, (yylsp[0]));
-        (yyval.interm.type).setAggregate(2);
-    }
-
-    break;
-
-  case 152:
-
-    {
-        TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
-        (yyval.interm.type).setBasic(EbtBool, qual, (yylsp[0]));
-        (yyval.interm.type).setAggregate(3);
-    }
-
-    break;
-
-  case 153:
-
-    {
-        TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
-        (yyval.interm.type).setBasic(EbtBool, qual, (yylsp[0]));
-        (yyval.interm.type).setAggregate(4);
-    }
-
-    break;
-
-  case 154:
-
-    {
-        TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
-        (yyval.interm.type).setBasic(EbtInt, qual, (yylsp[0]));
-        (yyval.interm.type).setAggregate(2);
-    }
-
-    break;
-
   case 155:
 
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
-        (yyval.interm.type).setBasic(EbtInt, qual, (yylsp[0]));
-        (yyval.interm.type).setAggregate(3);
+        (yyval.interm.type).setBasic(EbtFloat, qual, (yylsp[0]));
     }
 
     break;
@@ -4053,7 +4084,6 @@
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
         (yyval.interm.type).setBasic(EbtInt, qual, (yylsp[0]));
-        (yyval.interm.type).setAggregate(4);
     }
 
     break;
@@ -4063,7 +4093,6 @@
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
         (yyval.interm.type).setBasic(EbtUInt, qual, (yylsp[0]));
-        (yyval.interm.type).setAggregate(2);
     }
 
     break;
@@ -4072,8 +4101,7 @@
 
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
-        (yyval.interm.type).setBasic(EbtUInt, qual, (yylsp[0]));
-        (yyval.interm.type).setAggregate(3);
+        (yyval.interm.type).setBasic(EbtBool, qual, (yylsp[0]));
     }
 
     break;
@@ -4082,8 +4110,8 @@
 
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
-        (yyval.interm.type).setBasic(EbtUInt, qual, (yylsp[0]));
-        (yyval.interm.type).setAggregate(4);
+        (yyval.interm.type).setBasic(EbtFloat, qual, (yylsp[0]));
+        (yyval.interm.type).setAggregate(2);
     }
 
     break;
@@ -4093,7 +4121,7 @@
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
         (yyval.interm.type).setBasic(EbtFloat, qual, (yylsp[0]));
-        (yyval.interm.type).setMatrix(2, 2);
+        (yyval.interm.type).setAggregate(3);
     }
 
     break;
@@ -4103,7 +4131,7 @@
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
         (yyval.interm.type).setBasic(EbtFloat, qual, (yylsp[0]));
-        (yyval.interm.type).setMatrix(3, 3);
+        (yyval.interm.type).setAggregate(4);
     }
 
     break;
@@ -4112,13 +4140,123 @@
 
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
+        (yyval.interm.type).setBasic(EbtBool, qual, (yylsp[0]));
+        (yyval.interm.type).setAggregate(2);
+    }
+
+    break;
+
+  case 163:
+
+    {
+        TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
+        (yyval.interm.type).setBasic(EbtBool, qual, (yylsp[0]));
+        (yyval.interm.type).setAggregate(3);
+    }
+
+    break;
+
+  case 164:
+
+    {
+        TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
+        (yyval.interm.type).setBasic(EbtBool, qual, (yylsp[0]));
+        (yyval.interm.type).setAggregate(4);
+    }
+
+    break;
+
+  case 165:
+
+    {
+        TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
+        (yyval.interm.type).setBasic(EbtInt, qual, (yylsp[0]));
+        (yyval.interm.type).setAggregate(2);
+    }
+
+    break;
+
+  case 166:
+
+    {
+        TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
+        (yyval.interm.type).setBasic(EbtInt, qual, (yylsp[0]));
+        (yyval.interm.type).setAggregate(3);
+    }
+
+    break;
+
+  case 167:
+
+    {
+        TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
+        (yyval.interm.type).setBasic(EbtInt, qual, (yylsp[0]));
+        (yyval.interm.type).setAggregate(4);
+    }
+
+    break;
+
+  case 168:
+
+    {
+        TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
+        (yyval.interm.type).setBasic(EbtUInt, qual, (yylsp[0]));
+        (yyval.interm.type).setAggregate(2);
+    }
+
+    break;
+
+  case 169:
+
+    {
+        TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
+        (yyval.interm.type).setBasic(EbtUInt, qual, (yylsp[0]));
+        (yyval.interm.type).setAggregate(3);
+    }
+
+    break;
+
+  case 170:
+
+    {
+        TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
+        (yyval.interm.type).setBasic(EbtUInt, qual, (yylsp[0]));
+        (yyval.interm.type).setAggregate(4);
+    }
+
+    break;
+
+  case 171:
+
+    {
+        TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
+        (yyval.interm.type).setBasic(EbtFloat, qual, (yylsp[0]));
+        (yyval.interm.type).setMatrix(2, 2);
+    }
+
+    break;
+
+  case 172:
+
+    {
+        TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
+        (yyval.interm.type).setBasic(EbtFloat, qual, (yylsp[0]));
+        (yyval.interm.type).setMatrix(3, 3);
+    }
+
+    break;
+
+  case 173:
+
+    {
+        TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
         (yyval.interm.type).setBasic(EbtFloat, qual, (yylsp[0]));
         (yyval.interm.type).setMatrix(4, 4);
     }
 
     break;
 
-  case 163:
+  case 174:
 
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
@@ -4128,7 +4266,7 @@
 
     break;
 
-  case 164:
+  case 175:
 
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
@@ -4138,7 +4276,7 @@
 
     break;
 
-  case 165:
+  case 176:
 
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
@@ -4148,7 +4286,7 @@
 
     break;
 
-  case 166:
+  case 177:
 
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
@@ -4158,7 +4296,7 @@
 
     break;
 
-  case 167:
+  case 178:
 
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
@@ -4168,7 +4306,7 @@
 
     break;
 
-  case 168:
+  case 179:
 
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
@@ -4178,7 +4316,7 @@
 
     break;
 
-  case 169:
+  case 180:
 
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
@@ -4187,7 +4325,7 @@
 
     break;
 
-  case 170:
+  case 181:
 
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
@@ -4196,7 +4334,7 @@
 
     break;
 
-  case 171:
+  case 182:
 
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
@@ -4205,7 +4343,7 @@
 
     break;
 
-  case 172:
+  case 183:
 
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
@@ -4214,7 +4352,7 @@
 
     break;
 
-  case 173:
+  case 184:
 
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
@@ -4223,7 +4361,7 @@
 
     break;
 
-  case 174:
+  case 185:
 
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
@@ -4232,7 +4370,7 @@
 
     break;
 
-  case 175:
+  case 186:
 
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
@@ -4241,7 +4379,7 @@
 
     break;
 
-  case 176:
+  case 187:
 
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
@@ -4250,7 +4388,7 @@
 
     break;
 
-  case 177:
+  case 188:
 
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
@@ -4259,7 +4397,7 @@
 
     break;
 
-  case 178:
+  case 189:
 
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
@@ -4268,7 +4406,7 @@
 
     break;
 
-  case 179:
+  case 190:
 
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
@@ -4277,7 +4415,7 @@
 
     break;
 
-  case 180:
+  case 191:
 
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
@@ -4286,7 +4424,7 @@
 
     break;
 
-  case 181:
+  case 192:
 
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
@@ -4295,7 +4433,7 @@
 
     break;
 
-  case 182:
+  case 193:
 
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
@@ -4304,7 +4442,7 @@
 
     break;
 
-  case 183:
+  case 194:
 
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
@@ -4313,7 +4451,7 @@
 
     break;
 
-  case 184:
+  case 195:
 
     {
         if (!context->supportsExtension("GL_OES_EGL_image_external")) {
@@ -4326,7 +4464,7 @@
 
     break;
 
-  case 185:
+  case 196:
 
     {
         if (!context->supportsExtension("GL_ARB_texture_rectangle")) {
@@ -4339,7 +4477,7 @@
 
     break;
 
-  case 186:
+  case 197:
 
     {
         (yyval.interm.type) = (yyvsp[0].interm.type);
@@ -4348,7 +4486,7 @@
 
     break;
 
-  case 187:
+  case 198:
 
     {
         //
@@ -4363,13 +4501,13 @@
 
     break;
 
-  case 188:
+  case 199:
 
     { if (context->enterStructDeclaration((yylsp[-1]), *(yyvsp[-1].lex).string)) context->recover(); }
 
     break;
 
-  case 189:
+  case 200:
 
     {
         (yyval.interm.type) = context->addStructure((yylsp[-5]), (yylsp[-4]), (yyvsp[-4].lex).string, (yyvsp[-1].interm.fieldList));
@@ -4377,13 +4515,13 @@
 
     break;
 
-  case 190:
+  case 201:
 
     { if (context->enterStructDeclaration((yylsp[0]), *(yyvsp[0].lex).string)) context->recover(); }
 
     break;
 
-  case 191:
+  case 202:
 
     {
         (yyval.interm.type) = context->addStructure((yylsp[-4]), (yyloc), NewPoolTString(""), (yyvsp[-1].interm.fieldList));
@@ -4391,7 +4529,7 @@
 
     break;
 
-  case 192:
+  case 203:
 
     {
         (yyval.interm.fieldList) = (yyvsp[0].interm.fieldList);
@@ -4399,7 +4537,7 @@
 
     break;
 
-  case 193:
+  case 204:
 
     {
         (yyval.interm.fieldList) = (yyvsp[-1].interm.fieldList);
@@ -4417,7 +4555,7 @@
 
     break;
 
-  case 194:
+  case 205:
 
     {
         (yyval.interm.fieldList) = context->addStructDeclaratorList((yyvsp[-2].interm.type), (yyvsp[-1].interm.fieldList));
@@ -4425,7 +4563,7 @@
 
     break;
 
-  case 195:
+  case 206:
 
     {
         // ES3 Only, but errors should be handled elsewhere
@@ -4436,7 +4574,7 @@
 
     break;
 
-  case 196:
+  case 207:
 
     {
         (yyval.interm.fieldList) = NewPoolTFieldList();
@@ -4445,7 +4583,7 @@
 
     break;
 
-  case 197:
+  case 208:
 
     {
         (yyval.interm.fieldList)->push_back((yyvsp[0].interm.field));
@@ -4453,7 +4591,7 @@
 
     break;
 
-  case 198:
+  case 209:
 
     {
         if (context->reservedErrorCheck((yylsp[0]), *(yyvsp[0].lex).string))
@@ -4465,7 +4603,7 @@
 
     break;
 
-  case 199:
+  case 210:
 
     {
         if (context->reservedErrorCheck((yylsp[-3]), *(yyvsp[-3].lex).string))
@@ -4482,93 +4620,21 @@
 
     break;
 
-  case 200:
+  case 211:
 
     { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
 
     break;
 
-  case 201:
-
-    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-
-    break;
-
-  case 202:
-
-    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermAggregate); }
-
-    break;
-
-  case 203:
-
-    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-
-    break;
-
-  case 204:
-
-    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-
-    break;
-
-  case 205:
-
-    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-
-    break;
-
-  case 206:
-
-    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-
-    break;
-
-  case 207:
-
-    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-
-    break;
-
-  case 208:
-
-    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-
-    break;
-
-  case 209:
-
-    { (yyval.interm.intermAggregate) = 0; }
-
-    break;
-
-  case 210:
-
-    { context->symbolTable.push(); }
-
-    break;
-
-  case 211:
-
-    { context->symbolTable.pop(); }
-
-    break;
-
   case 212:
 
-    {
-        if ((yyvsp[-2].interm.intermAggregate) != 0) {
-            (yyvsp[-2].interm.intermAggregate)->setOp(EOpSequence);
-            (yyvsp[-2].interm.intermAggregate)->setLine((yyloc));
-        }
-        (yyval.interm.intermAggregate) = (yyvsp[-2].interm.intermAggregate);
-    }
+    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
 
     break;
 
   case 213:
 
-    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
+    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermAggregate); }
 
     break;
 
@@ -4580,37 +4646,109 @@
 
   case 215:
 
-    { context->symbolTable.push(); }
+    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
 
     break;
 
   case 216:
 
-    { context->symbolTable.pop(); (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
+    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
 
     break;
 
   case 217:
 
-    { context->symbolTable.push(); }
+    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
 
     break;
 
   case 218:
 
-    { context->symbolTable.pop(); (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
+    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
 
     break;
 
   case 219:
 
+    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
+
+    break;
+
+  case 220:
+
+    { (yyval.interm.intermAggregate) = 0; }
+
+    break;
+
+  case 221:
+
+    { context->symbolTable.push(); }
+
+    break;
+
+  case 222:
+
+    { context->symbolTable.pop(); }
+
+    break;
+
+  case 223:
+
+    {
+        if ((yyvsp[-2].interm.intermAggregate) != 0) {
+            (yyvsp[-2].interm.intermAggregate)->setOp(EOpSequence);
+            (yyvsp[-2].interm.intermAggregate)->setLine((yyloc));
+        }
+        (yyval.interm.intermAggregate) = (yyvsp[-2].interm.intermAggregate);
+    }
+
+    break;
+
+  case 224:
+
+    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
+
+    break;
+
+  case 225:
+
+    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
+
+    break;
+
+  case 226:
+
+    { context->symbolTable.push(); }
+
+    break;
+
+  case 227:
+
+    { context->symbolTable.pop(); (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
+
+    break;
+
+  case 228:
+
+    { context->symbolTable.push(); }
+
+    break;
+
+  case 229:
+
+    { context->symbolTable.pop(); (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
+
+    break;
+
+  case 230:
+
     {
         (yyval.interm.intermNode) = 0;
     }
 
     break;
 
-  case 220:
+  case 231:
 
     {
         if ((yyvsp[-1].interm.intermAggregate)) {
@@ -4622,7 +4760,7 @@
 
     break;
 
-  case 221:
+  case 232:
 
     {
         (yyval.interm.intermAggregate) = context->intermediate.makeAggregate((yyvsp[0].interm.intermNode), (yyloc));
@@ -4630,7 +4768,7 @@
 
     break;
 
-  case 222:
+  case 233:
 
     {
         (yyval.interm.intermAggregate) = context->intermediate.growAggregate((yyvsp[-1].interm.intermAggregate), (yyvsp[0].interm.intermNode), (yyloc));
@@ -4638,19 +4776,19 @@
 
     break;
 
-  case 223:
+  case 234:
 
     { (yyval.interm.intermNode) = 0; }
 
     break;
 
-  case 224:
+  case 235:
 
     { (yyval.interm.intermNode) = static_cast<TIntermNode*>((yyvsp[-1].interm.intermTypedNode)); }
 
     break;
 
-  case 225:
+  case 236:
 
     {
         if (context->boolErrorCheck((yylsp[-4]), (yyvsp[-2].interm.intermTypedNode)))
@@ -4660,7 +4798,7 @@
 
     break;
 
-  case 226:
+  case 237:
 
     {
         (yyval.interm.nodePair).node1 = (yyvsp[-2].interm.intermNode);
@@ -4669,7 +4807,7 @@
 
     break;
 
-  case 227:
+  case 238:
 
     {
         (yyval.interm.nodePair).node1 = (yyvsp[0].interm.intermNode);
@@ -4678,7 +4816,7 @@
 
     break;
 
-  case 228:
+  case 239:
 
     {
         (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
@@ -4688,7 +4826,7 @@
 
     break;
 
-  case 229:
+  case 240:
 
     {
         TIntermNode* intermNode;
@@ -4707,13 +4845,13 @@
 
     break;
 
-  case 230:
+  case 241:
 
     { context->symbolTable.push(); ++context->loopNestingLevel; }
 
     break;
 
-  case 231:
+  case 242:
 
     {
         context->symbolTable.pop();
@@ -4723,13 +4861,13 @@
 
     break;
 
-  case 232:
+  case 243:
 
     { ++context->loopNestingLevel; }
 
     break;
 
-  case 233:
+  case 244:
 
     {
         if (context->boolErrorCheck((yylsp[0]), (yyvsp[-2].interm.intermTypedNode)))
@@ -4741,13 +4879,13 @@
 
     break;
 
-  case 234:
+  case 245:
 
     { context->symbolTable.push(); ++context->loopNestingLevel; }
 
     break;
 
-  case 235:
+  case 246:
 
     {
         context->symbolTable.pop();
@@ -4757,7 +4895,7 @@
 
     break;
 
-  case 236:
+  case 247:
 
     {
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
@@ -4765,7 +4903,7 @@
 
     break;
 
-  case 237:
+  case 248:
 
     {
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
@@ -4773,7 +4911,7 @@
 
     break;
 
-  case 238:
+  case 249:
 
     {
         (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
@@ -4781,7 +4919,7 @@
 
     break;
 
-  case 239:
+  case 250:
 
     {
         (yyval.interm.intermTypedNode) = 0;
@@ -4789,7 +4927,7 @@
 
     break;
 
-  case 240:
+  case 251:
 
     {
         (yyval.interm.nodePair).node1 = (yyvsp[-1].interm.intermTypedNode);
@@ -4798,7 +4936,7 @@
 
     break;
 
-  case 241:
+  case 252:
 
     {
         (yyval.interm.nodePair).node1 = (yyvsp[-2].interm.intermTypedNode);
@@ -4807,7 +4945,7 @@
 
     break;
 
-  case 242:
+  case 253:
 
     {
         if (context->loopNestingLevel <= 0) {
@@ -4819,7 +4957,7 @@
 
     break;
 
-  case 243:
+  case 254:
 
     {
         if (context->loopNestingLevel <= 0) {
@@ -4831,7 +4969,7 @@
 
     break;
 
-  case 244:
+  case 255:
 
     {
         (yyval.interm.intermNode) = context->intermediate.addBranch(EOpReturn, (yylsp[-1]));
@@ -4843,7 +4981,7 @@
 
     break;
 
-  case 245:
+  case 256:
 
     {
         (yyval.interm.intermNode) = context->intermediate.addBranch(EOpReturn, (yyvsp[-1].interm.intermTypedNode), (yylsp[-2]));
@@ -4859,7 +4997,7 @@
 
     break;
 
-  case 246:
+  case 257:
 
     {
         FRAG_ONLY("discard", (yylsp[-1]));
@@ -4868,7 +5006,7 @@
 
     break;
 
-  case 247:
+  case 258:
 
     {
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
@@ -4877,7 +5015,7 @@
 
     break;
 
-  case 248:
+  case 259:
 
     {
         (yyval.interm.intermNode) = context->intermediate.growAggregate((yyvsp[-1].interm.intermNode), (yyvsp[0].interm.intermNode), (yyloc));
@@ -4886,7 +5024,7 @@
 
     break;
 
-  case 249:
+  case 260:
 
     {
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
@@ -4894,7 +5032,7 @@
 
     break;
 
-  case 250:
+  case 261:
 
     {
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
@@ -4902,7 +5040,7 @@
 
     break;
 
-  case 251:
+  case 262:
 
     {
         TFunction* function = (yyvsp[0].interm).function;
@@ -4992,7 +5130,7 @@
 
     break;
 
-  case 252:
+  case 263:
 
     {
         //?? Check that all paths return a value if return type != void ?
diff --git a/src/compiler/translator/intermOut.cpp b/src/compiler/translator/intermOut.cpp
index 0197e23..65d8d51 100644
--- a/src/compiler/translator/intermOut.cpp
+++ b/src/compiler/translator/intermOut.cpp
@@ -134,6 +134,22 @@
       case EOpModAssign:
         out << "modulo second child into first child";
         break;
+      case EOpBitShiftLeftAssign:
+        out << "bit-wise shift first child left by second child";
+        break;
+      case EOpBitShiftRightAssign:
+        out << "bit-wise shift first child right by second child";
+        break;
+      case EOpBitwiseAndAssign:
+        out << "bit-wise and second child into first child";
+        break;
+      case EOpBitwiseXorAssign:
+        out << "bit-wise xor second child into first child";
+        break;
+      case EOpBitwiseOrAssign:
+        out << "bit-wise or second child into first child";
+        break;
+
       case EOpIndexDirect:
         out << "direct index";
         break;
@@ -165,6 +181,22 @@
       case EOpMod:
         out << "modulo";
         break;
+      case EOpBitShiftLeft:
+        out << "bit-wise shift left";
+        break;
+      case EOpBitShiftRight:
+        out << "bit-wise shift right";
+        break;
+      case EOpBitwiseAnd:
+        out << "bit-wise and";
+        break;
+      case EOpBitwiseXor:
+        out << "bit-wise xor";
+        break;
+      case EOpBitwiseOr:
+        out << "bit-wise or";
+        break;
+
       case EOpEqual:
         out << "Compare Equal";
         break;
@@ -262,6 +294,7 @@
       case EOpPositive:       out << "Positive sign";        break;
       case EOpVectorLogicalNot:
       case EOpLogicalNot:     out << "Negate conditional";   break;
+      case EOpBitwiseNot:     out << "bit-wise not";         break;
 
       case EOpPostIncrement:  out << "Post-Increment";       break;
       case EOpPostDecrement:  out << "Post-Decrement";       break;