Implement support for the binary operator '%' in the translator.

BUG=angle:854

Change-Id: If116de132dc83d93255749b54c1919a75abcb65c
Reviewed-on: https://chromium-review.googlesource.com/236330
Tested-by: Gregoire Payen de La Garanderie <Gregory.Payen@imgtec.com>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
diff --git a/src/compiler/translator/IntermNode.cpp b/src/compiler/translator/IntermNode.cpp
index 980a24b..3040470 100644
--- a/src/compiler/translator/IntermNode.cpp
+++ b/src/compiler/translator/IntermNode.cpp
@@ -264,6 +264,7 @@
       case EOpMatrixTimesScalarAssign:
       case EOpMatrixTimesMatrixAssign:
       case EOpDivAssign:
+      case EOpModAssign:
         return true;
       default:
         return false;
@@ -556,9 +557,11 @@
       case EOpAdd:
       case EOpSub:
       case EOpDiv:
+      case EOpMod:
       case EOpAddAssign:
       case EOpSubAssign:
       case EOpDivAssign:
+      case EOpModAssign:
         if ((mLeft->isMatrix() && mRight->isVector()) ||
             (mLeft->isVector() && mRight->isMatrix()))
         {
@@ -729,6 +732,7 @@
             break;
 
           case EOpDiv:
+          case EOpMod:
             {
                 tempConstArray = new ConstantUnion[objectSize];
                 for (size_t i = 0; i < objectSize; i++)
diff --git a/src/compiler/translator/IntermNode.h b/src/compiler/translator/IntermNode.h
index 9b3e489..9b85aa2 100644
--- a/src/compiler/translator/IntermNode.h
+++ b/src/compiler/translator/IntermNode.h
@@ -188,7 +188,8 @@
     EOpVectorTimesScalarAssign,
     EOpMatrixTimesScalarAssign,
     EOpMatrixTimesMatrixAssign,
-    EOpDivAssign
+    EOpDivAssign,
+    EOpModAssign
 };
 
 class TIntermTraverser;
diff --git a/src/compiler/translator/Intermediate.cpp b/src/compiler/translator/Intermediate.cpp
index 47b3b05..243a9ca 100644
--- a/src/compiler/translator/Intermediate.cpp
+++ b/src/compiler/translator/Intermediate.cpp
@@ -76,7 +76,16 @@
       case EOpDiv:
       case EOpMul:
         if (left->getBasicType() == EbtStruct || left->getBasicType() == EbtBool)
+        {
             return NULL;
+        }
+        break;
+      case EOpMod:
+        if (left->getBasicType() == EbtStruct || left->getBasicType() == EbtBool || left->getBasicType() == EbtFloat)
+        {
+            return NULL;
+        }
+        break;
       default:
         break;
     }
diff --git a/src/compiler/translator/OutputGLSLBase.cpp b/src/compiler/translator/OutputGLSLBase.cpp
index 35de15c..6b01e49 100644
--- a/src/compiler/translator/OutputGLSLBase.cpp
+++ b/src/compiler/translator/OutputGLSLBase.cpp
@@ -223,6 +223,9 @@
       case EOpDivAssign:
         writeTriplet(visit, "(", " /= ", ")");
         break;
+      case EOpModAssign:
+        writeTriplet(visit, "(", " %= ", ")");
+        break;
       // Notice the fall-through.
       case EOpMulAssign:
       case EOpVectorTimesMatrixAssign:
@@ -341,7 +344,7 @@
         writeTriplet(visit, "(", " / ", ")");
         break;
       case EOpMod:
-        UNIMPLEMENTED();
+        writeTriplet(visit, "(", " % ", ")");
         break;
       case EOpEqual:
         writeTriplet(visit, "(", " == ", ")");
diff --git a/src/compiler/translator/OutputHLSL.cpp b/src/compiler/translator/OutputHLSL.cpp
index 30bbbff..488f2e3 100644
--- a/src/compiler/translator/OutputHLSL.cpp
+++ b/src/compiler/translator/OutputHLSL.cpp
@@ -1564,6 +1564,7 @@
         }
         break;
       case EOpDivAssign:               outputTriplet(visit, "(", " /= ", ")");          break;
+      case EOpModAssign:               outputTriplet(visit, "(", " %= ", ")");          break;
       case EOpIndexDirect:
         {
             const TType& leftType = node->getLeft()->getType();
@@ -1651,6 +1652,7 @@
       case EOpSub:               outputTriplet(visit, "(", " - ", ")"); break;
       case EOpMul:               outputTriplet(visit, "(", " * ", ")"); break;
       case EOpDiv:               outputTriplet(visit, "(", " / ", ")"); break;
+      case EOpMod:               outputTriplet(visit, "(", " % ", ")"); break;
       case EOpEqual:
       case EOpNotEqual:
         if (node->getLeft()->isScalar())
diff --git a/src/compiler/translator/ValidateLimitations.cpp b/src/compiler/translator/ValidateLimitations.cpp
index 896e1cd..c4dad54 100644
--- a/src/compiler/translator/ValidateLimitations.cpp
+++ b/src/compiler/translator/ValidateLimitations.cpp
@@ -56,6 +56,7 @@
       case EOpAddAssign: return "+=";
       case EOpSubAssign: return "-=";
       case EOpDivAssign: return "/=";
+      case EOpModAssign: return "%=";
 
       // Fall-through.
       case EOpMulAssign:
@@ -75,7 +76,7 @@
       case EOpSub: return "-";
       case EOpMul: return "*";
       case EOpDiv: return "/";
-      case EOpMod: UNIMPLEMENTED(); break;
+      case EOpMod: return "%";
       case EOpEqual: return "==";
       case EOpNotEqual: return "!=";
       case EOpLessThan: return "<";
diff --git a/src/compiler/translator/glslang.y b/src/compiler/translator/glslang.y
index ce87639..63c9b94 100644
--- a/src/compiler/translator/glslang.y
+++ b/src/compiler/translator/glslang.y
@@ -555,6 +555,14 @@
             $$ = $1;
         }
     }
+    | multiplicative_expression PERCENT unary_expression {
+        $$ = context->intermediate.addBinaryMath(EOpMod, $1, $3, @2);
+        if ($$ == 0) {
+            context->binaryOpError(@2, "%", $1->getCompleteString(), $3->getCompleteString());
+            context->recover();
+            $$ = $1;
+        }
+    }
     ;
 
 additive_expression
@@ -739,6 +747,7 @@
     : EQUAL        { $$.op = EOpAssign; }
     | MUL_ASSIGN   { $$.op = EOpMulAssign; }
     | DIV_ASSIGN   { $$.op = EOpDivAssign; }
+    | MOD_ASSIGN   { $$.op = EOpModAssign; }
     | ADD_ASSIGN   { $$.op = EOpAddAssign; }
     | SUB_ASSIGN   { $$.op = EOpSubAssign; }
     ;
diff --git a/src/compiler/translator/glslang_tab.cpp b/src/compiler/translator/glslang_tab.cpp
index da9277b..62f4c05 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   2375
+#define YYLAST   2378
 
 /* YYNTOKENS -- Number of terminals.  */
 #define YYNTOKENS  128
 /* YYNNTS -- Number of nonterminals.  */
 #define YYNNTS  91
 /* YYNRULES -- Number of rules.  */
-#define YYNRULES  250
+#define YYNRULES  252
 /* YYNSTATES -- Number of states.  */
-#define YYNSTATES  373
+#define YYNSTATES  376
 
 /* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned
    by yylex, with out-of-bounds checking.  */
@@ -691,28 +691,28 @@
      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,
-     561,   562,   570,   581,   585,   586,   596,   606,   616,   629,
-     630,   640,   653,   657,   661,   665,   666,   679,   680,   693,
-     694,   707,   708,   725,   726,   739,   740,   741,   742,   743,
-     747,   750,   761,   769,   777,   804,   810,   821,   825,   829,
-     833,   840,   896,   899,   906,   914,   935,   956,   966,   994,
-     999,  1009,  1014,  1024,  1027,  1030,  1033,  1039,  1046,  1049,
-    1053,  1057,  1061,  1068,  1072,  1076,  1083,  1087,  1091,  1098,
-    1107,  1113,  1116,  1122,  1128,  1135,  1144,  1153,  1161,  1164,
-    1171,  1175,  1182,  1185,  1189,  1193,  1202,  1211,  1219,  1229,
-    1241,  1244,  1247,  1253,  1260,  1263,  1269,  1272,  1275,  1281,
-    1284,  1299,  1303,  1307,  1311,  1315,  1319,  1324,  1329,  1334,
-    1339,  1344,  1349,  1354,  1359,  1364,  1369,  1374,  1379,  1384,
-    1389,  1394,  1399,  1404,  1409,  1414,  1419,  1424,  1428,  1432,
-    1436,  1440,  1444,  1448,  1452,  1456,  1460,  1464,  1468,  1472,
-    1476,  1480,  1484,  1492,  1500,  1504,  1517,  1517,  1520,  1520,
-    1526,  1529,  1545,  1548,  1557,  1561,  1567,  1574,  1589,  1593,
-    1597,  1598,  1604,  1605,  1606,  1607,  1608,  1612,  1613,  1613,
-    1613,  1623,  1624,  1628,  1628,  1629,  1629,  1634,  1637,  1647,
-    1650,  1656,  1657,  1661,  1669,  1673,  1683,  1688,  1705,  1705,
-    1710,  1710,  1717,  1717,  1725,  1728,  1734,  1737,  1743,  1747,
-    1754,  1761,  1768,  1775,  1786,  1795,  1799,  1806,  1809,  1815,
-    1815
+     558,   569,   570,   578,   589,   593,   594,   604,   614,   624,
+     637,   638,   648,   661,   665,   669,   673,   674,   687,   688,
+     701,   702,   715,   716,   733,   734,   747,   748,   749,   750,
+     751,   752,   756,   759,   770,   778,   786,   813,   819,   830,
+     834,   838,   842,   849,   905,   908,   915,   923,   944,   965,
+     975,  1003,  1008,  1018,  1023,  1033,  1036,  1039,  1042,  1048,
+    1055,  1058,  1062,  1066,  1070,  1077,  1081,  1085,  1092,  1096,
+    1100,  1107,  1116,  1122,  1125,  1131,  1137,  1144,  1153,  1162,
+    1170,  1173,  1180,  1184,  1191,  1194,  1198,  1202,  1211,  1220,
+    1228,  1238,  1250,  1253,  1256,  1262,  1269,  1272,  1278,  1281,
+    1284,  1290,  1293,  1308,  1312,  1316,  1320,  1324,  1328,  1333,
+    1338,  1343,  1348,  1353,  1358,  1363,  1368,  1373,  1378,  1383,
+    1388,  1393,  1398,  1403,  1408,  1413,  1418,  1423,  1428,  1433,
+    1437,  1441,  1445,  1449,  1453,  1457,  1461,  1465,  1469,  1473,
+    1477,  1481,  1485,  1489,  1493,  1501,  1509,  1513,  1526,  1526,
+    1529,  1529,  1535,  1538,  1554,  1557,  1566,  1570,  1576,  1583,
+    1598,  1602,  1606,  1607,  1613,  1614,  1615,  1616,  1617,  1621,
+    1622,  1622,  1622,  1632,  1633,  1637,  1637,  1638,  1638,  1643,
+    1646,  1656,  1659,  1665,  1666,  1670,  1678,  1682,  1692,  1697,
+    1714,  1714,  1719,  1719,  1726,  1726,  1734,  1737,  1743,  1746,
+    1752,  1756,  1763,  1770,  1777,  1784,  1795,  1804,  1808,  1815,
+    1818,  1824,  1824
 };
 #endif
 
@@ -800,12 +800,12 @@
 };
 # endif
 
-#define YYPACT_NINF -309
+#define YYPACT_NINF -315
 
 #define yypact_value_is_default(Yystate) \
-  (!!((Yystate) == (-309)))
+  (!!((Yystate) == (-315)))
 
-#define YYTABLE_NINF -214
+#define YYTABLE_NINF -216
 
 #define yytable_value_is_error(Yytable_value) \
   0
@@ -814,44 +814,44 @@
      STATE-NUM.  */
 static const yytype_int16 yypact[] =
 {
-    2013,   -27,  -309,  -309,  -309,   154,  -309,  -309,  -309,  -309,
-    -309,  -309,  -309,  -309,  -309,  -309,  -309,  -309,  -309,  -309,
-    -309,  -309,  -309,  -309,  -309,  -309,  -309,  -309,  -309,  -309,
-    -309,  -309,  -309,  -309,  -309,  -309,  -309,    98,  -309,  -309,
-     -40,  -309,  -309,  -309,  -309,  -309,  -309,  -309,  -309,  -309,
-    -309,  -309,  -309,  -309,  -309,  -309,  -309,  -309,  -309,   -46,
-    -309,  -309,   -42,   -23,     8,     5,   -87,  -309,    91,    14,
-    1130,  -309,  -309,  2298,    14,  -309,    -1,  -309,  1938,  -309,
-    -309,  -309,  -309,  2298,  -309,  -309,  -309,  -309,  -309,    13,
-      47,  -309,    43,  -309,    39,  -309,  -309,  -309,  -309,  -309,
-    2162,   124,    94,  -309,    51,   -14,  -309,    66,  -309,  2088,
-    -309,  -309,  -309,  1491,  -309,  -309,    62,  2088,  -309,    48,
-     -83,  -309,   358,  -309,  -309,  -309,  -309,    94,  2162,    -9,
-    -309,  1200,  1491,  -309,   148,  2162,    94,  1683,  -309,    89,
-    -309,  -309,  -309,  -309,  1491,  1491,  1491,  -309,  -309,  -309,
-    -309,  -309,    10,  -309,  -309,  -309,    92,    20,  1586,    96,
-    -309,  1491,    53,   -76,  -309,   -62,    90,  -309,  -309,  -309,
-     104,   101,   -61,  -309,    95,  -309,  -309,  1768,  2088,   103,
-    -309,    47,    82,    84,  -309,    97,    99,    93,  1298,   105,
-     102,  -309,  -309,   -10,  -309,  -309,   -13,  -309,   -42,     2,
-    -309,  -309,  -309,  -309,   474,  -309,  -309,  -309,  -309,   106,
-    -309,  -309,  1393,  1491,  -309,   107,  -309,  -309,    94,   109,
-       4,  -309,   -58,  -309,  -309,  -309,    22,  -309,  -309,  1491,
-    2230,  -309,  -309,  1491,   112,  -309,  -309,  -309,  1491,  1491,
-    1491,  1491,  1491,  1491,  1491,  1491,  1491,  1491,  1491,  1491,
-    1491,  1491,  -309,  -309,  1853,  -309,  -309,  -309,  -309,  -309,
-     100,  -309,  1491,  -309,  -309,    36,  -309,  -309,   590,  -309,
-    -309,  -309,  -309,  -309,  1491,  1491,  -309,  -309,  -309,  1491,
-    -309,   113,  -309,  -309,    42,  1491,    94,  -309,   -73,  -309,
-    -309,   115,   108,    89,   119,  -309,  -309,  -309,  -309,  -309,
-      53,    53,  -309,  -309,  -309,  -309,   -62,   -62,  -309,   104,
-     101,    73,  -309,   169,    43,   822,   938,    25,  -309,  1035,
-     590,  -309,  -309,   120,  -309,  -309,   121,  -309,  1491,  -309,
-    -309,  1491,   122,  -309,  -309,  -309,  -309,  1035,   100,   108,
-      94,  2162,   125,   123,  -309,  -309,   126,  -309,  1491,  -309,
-     117,   129,   212,  -309,   139,   706,  -309,   141,    29,  1491,
-     706,   100,  1491,  -309,  -309,  -309,  -309,   142,   108,  -309,
-    -309,  -309,  -309
+    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
 };
 
   /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
@@ -859,73 +859,73 @@
      means the default is an error.  */
 static const yytype_uint8 yydefact[] =
 {
-       0,     0,   130,   131,   132,     0,   114,   122,   145,   142,
-     143,   144,   149,   150,   151,   152,   153,   154,   146,   147,
-     148,   155,   156,   157,   158,   159,   160,   123,   124,   127,
-     115,   161,   162,   163,   164,   165,   166,     0,   112,   111,
-       0,   141,   167,   169,   182,   183,   170,   171,   172,   173,
-     174,   175,   176,   177,   178,   168,   179,   180,   181,     0,
-     185,   248,   249,     0,    83,    93,     0,    98,   103,   119,
-       0,   117,   109,     0,   120,   128,   139,   184,     0,   245,
-     247,   116,   108,     0,   125,   126,     2,     3,   188,     0,
-       0,    74,     0,    81,    93,   113,    94,    95,    96,    84,
-       0,    93,     0,    75,     2,   104,   118,     0,    80,     0,
-     110,   129,   121,     0,     1,   246,     0,     0,   186,   136,
-       0,   134,     0,   250,    85,    90,    92,    97,     0,    99,
-      86,     0,     0,    73,     0,     0,     0,     0,   190,     4,
+       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,    40,    43,    44,    49,    52,    53,    54,    55,
-      57,    59,    61,    72,     0,    28,    76,     0,     0,     0,
-     133,     0,     0,     0,   230,     0,     0,     0,     0,     0,
-     208,   217,   221,    37,    63,    70,     0,   199,     0,   139,
-     202,   219,   201,   200,     0,   203,   204,   205,   206,    87,
-      89,    91,     0,     0,   105,     0,   198,   107,     0,   196,
-       0,   194,     0,   191,    31,    32,     0,    15,    16,     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,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   140,   189,     0,   137,   138,   135,   241,   240,
-     215,   232,     0,   244,   242,     0,   228,   207,     0,    66,
-      67,    68,    69,    65,     0,     0,   222,   218,   220,     0,
-     100,     0,   102,   106,     0,     0,     0,   192,     0,    77,
-      10,     0,    17,     2,     3,    14,    20,    26,    38,    39,
-      42,    41,    47,    48,    45,    46,    50,    51,    56,    58,
-      60,     0,   187,     0,     0,     0,     0,     0,   243,     0,
-     209,    64,    71,     0,   101,   193,     0,   195,     0,    78,
-      12,     0,     0,   214,   216,   235,   234,   237,   215,   226,
-       0,     0,     0,     0,    88,   197,     0,    62,     0,   236,
-       0,     0,   225,   223,     0,     0,   210,     0,     0,   238,
-       0,   215,     0,   212,   229,   211,    79,     0,   239,   233,
-     224,   227,   231
+       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
 };
 
   /* YYPGOTO[NTERM-NUM].  */
 static const yytype_int16 yypgoto[] =
 {
-    -309,   -39,  -309,  -309,  -309,  -309,  -309,  -309,     7,  -309,
-    -309,  -309,  -309,     1,  -309,   -54,  -309,  -101,   -57,  -309,
-    -309,  -309,     9,   -11,     3,  -309,  -110,  -126,  -309,  -138,
-    -122,  -309,    11,    16,  -309,  -309,  -309,   130,   165,   159,
-     133,  -309,  -309,  -299,  -309,  -309,  -102,   -30,   -66,   257,
-    -309,  -309,    83,    -6,     0,  -309,  -309,  -309,  -104,  -125,
-      45,   -21,  -208,   -50,  -194,  -296,  -309,  -309,  -309,   -93,
-    -308,  -309,  -309,   -90,     6,   -47,  -309,  -309,   -67,  -309,
-    -309,  -309,  -309,  -309,  -309,  -309,  -309,  -309,   193,  -309,
-    -309
+    -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
 };
 
   /* YYDEFGOTO[NTERM-NUM].  */
 static const yytype_int16 yydefgoto[] =
 {
-      -1,   219,   150,   151,   152,   291,   153,   154,   155,   156,
+      -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,   274,   196,
+     167,   168,   169,   170,   171,   172,   194,   195,   276,   196,
      174,   109,   197,   198,    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,   268,   343,   364,
-     313,   314,   315,   365,   204,   205,   206,   353,   342,   207,
-     319,   260,   316,   337,   350,   351,   208,    78,    79,    80,
+     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,
       92
 };
 
@@ -934,102 +934,112 @@
      number is the opposite.  If YYTABLE_NINF, syntax error.  */
 static const yytype_int16 yytable[] =
 {
-      76,    89,   123,   173,   110,   282,   216,   135,   226,   215,
-     278,    61,   223,   177,    95,   135,    62,    81,   288,   334,
-     340,   173,   180,     7,   102,   242,   243,   103,   181,   105,
-     352,   250,   235,   328,   127,   135,    86,    87,   340,   106,
-     240,   329,   241,   136,   112,    96,    97,    98,    95,    82,
-     265,   136,   223,   370,    27,    28,   289,    29,    90,   363,
-     244,   245,   127,   129,   363,    37,   251,   111,    88,   218,
-      76,   136,    91,    76,   254,   135,   135,   116,    76,    96,
-      97,    98,    93,    76,   269,   270,   271,   216,   209,    61,
-     281,   292,   131,   272,    62,   227,   228,   212,   275,   132,
-      76,   276,   173,   273,   213,   113,   -28,   297,   113,    76,
-     -82,   136,   136,   311,   160,   286,   229,    76,   287,    94,
-     230,   118,   199,   119,   317,   232,   278,   290,    76,   223,
-     338,   233,   160,   275,   367,    76,   275,    76,    84,    85,
-     275,   302,   303,   304,   305,   224,   225,   275,   321,   322,
-     318,   122,   135,   286,   371,   130,   325,   323,     2,     3,
-       4,   179,   237,   326,    96,    97,    98,   104,    87,   173,
-      86,    87,   238,   239,   133,   173,   176,    76,    76,   246,
-     247,   339,   255,   256,   275,   331,   300,   301,   136,   306,
-     307,   295,    81,   -29,   249,   248,   258,   231,   259,   339,
-     236,   261,   252,   262,   199,   347,   346,   263,  -213,   266,
-     358,   267,   279,   160,   283,   285,  -141,   341,   173,   275,
-     324,   368,   330,  -185,   333,   332,   348,   344,   345,   361,
-     355,   359,   356,   357,   360,   341,   216,   296,   309,   298,
-     299,   160,   160,   160,   160,   160,   160,   160,   160,   160,
-     160,   160,   362,   310,    76,   366,   372,   308,   210,   124,
-     128,   211,    83,   284,   257,   327,   335,   369,   199,   336,
-     349,   115,     0,     0,   320,   110,     0,     0,     0,     0,
-     160,     0,     0,     0,     0,     0,   160,     0,     0,     0,
+      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,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   354,     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,   160,
-       0,     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,   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,   146,     0,     0,     0,   190,   191,     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,    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,   277,     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,    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,   146,     0,     0,     0,   190,
+     191,     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,    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,     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,    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,   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,
+      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,
-     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,    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,   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,
+      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,     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,   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,
+      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,     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,
+      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,   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,
@@ -1037,54 +1047,25 @@
       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,     0,     0,     0,     0,     0,     2,     3,     4,
        0,     0,   146,     8,     9,    10,    11,     0,     0,     0,
-       0,     0,   264,   147,   148,     0,   149,     0,    12,    13,
+       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,
-     280,     8,     9,    10,    11,     0,     0,     0,   147,   148,
+     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,
@@ -1094,184 +1075,213 @@
      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,     0,   149,
+       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,   234,     0,    42,    43,    44,    45,    46,    47,    48,
+      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,   253,    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,   312,    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,     0,     0,
+     146,     0,     0,   282,     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,     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,   234,     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,     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,     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,
+      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,    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,
-       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,   293,   294,     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
+      52,    53,    54,    55,     0,    56,    57,    58,     0,   295,
+     296,     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,   113,    70,   213,   132,   109,   146,   131,
-     204,     0,   137,   117,     9,   117,     0,    44,    76,   315,
-     319,   131,   105,     9,   111,    87,    88,   114,   111,    68,
-     338,    92,   158,   106,   100,   137,    76,    77,   337,    69,
-     116,   114,   118,   109,    74,    40,    41,    42,     9,    76,
-     188,   117,   177,   361,    40,    41,   114,    43,   104,   355,
-     122,   123,   128,   102,   360,    51,   127,    73,   108,   135,
-      70,   137,   114,    73,   178,   177,   178,    83,    78,    40,
-      41,    42,   105,    83,    94,    95,    96,   213,   127,    78,
-     212,   229,   106,   103,    78,    85,    86,   106,   111,   113,
-     100,   114,   212,   113,   113,   106,   104,   233,   106,   109,
-     105,   177,   178,   251,   113,   111,   106,   117,   114,   111,
-     110,   108,   122,    76,   262,   105,   320,   105,   128,   254,
-     105,   111,   131,   111,   105,   135,   111,   137,    40,    41,
-     111,   242,   243,   244,   245,   144,   145,   111,   274,   275,
-     114,   108,   254,   111,   362,   104,   114,   279,     4,     5,
-       6,   113,   161,   285,    40,    41,    42,    76,    77,   279,
-      76,    77,   119,   120,   108,   285,   114,   177,   178,    89,
-      90,   319,    79,    80,   111,   112,   240,   241,   254,   246,
-     247,   230,    44,   104,    93,    91,   114,   105,   114,   337,
-     104,   104,   107,   104,   204,   331,   328,   114,   108,   104,
-     348,   109,   106,   212,   107,   106,   104,   319,   328,   111,
-     107,   359,   107,   104,   314,    56,   104,   107,   107,    17,
-     105,   114,   109,   107,   105,   337,   362,   230,   249,   238,
-     239,   240,   241,   242,   243,   244,   245,   246,   247,   248,
-     249,   250,   113,   250,   254,   114,   114,   248,   128,    94,
-     101,   128,     5,   218,   181,   286,   316,   360,   268,   316,
-     337,    78,    -1,    -1,   268,   341,    -1,    -1,    -1,    -1,
-     279,    -1,    -1,    -1,    -1,    -1,   285,    -1,    -1,    -1,
+       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,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   340,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   315,   316,    -1,    -1,   319,
-     320,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   328,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   337,    -1,    -1,
-      -1,   341,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   355,    -1,    -1,    -1,    -1,
-     360,     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,   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,   104,    -1,    -1,    -1,   108,   109,    -1,    -1,
-      -1,    -1,   114,   115,   116,    -1,   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,
-      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,     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,   104,    -1,    -1,    -1,   108,
+     109,    -1,    -1,    -1,    -1,   114,   115,   116,    -1,   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,    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,    -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,    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,   104,    -1,    -1,    -1,   108,   109,    -1,    -1,    -1,
+      -1,   114,   115,   116,    -1,   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,    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,
-     104,    -1,    -1,    -1,   108,    -1,    -1,    -1,    -1,    -1,
-     114,   115,   116,    -1,   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,    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,   104,    -1,    -1,
+      -1,   108,    -1,    -1,    -1,    -1,    -1,   114,   115,   116,
+      -1,   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,    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,    -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,   104,    -1,    -1,    -1,   108,    -1,    -1,
+      -1,    -1,    -1,   114,   115,   116,    -1,   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,    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,    -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,
+      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,    -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,
@@ -1279,50 +1289,21 @@
       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,    -1,    -1,    -1,    -1,    -1,     4,     5,     6,
       -1,    -1,   104,    10,    11,    12,    13,    -1,    -1,    -1,
-      -1,    -1,   114,   115,   116,    -1,   118,    -1,    25,    26,
+      -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,
@@ -1336,7 +1317,7 @@
       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,    -1,   118,
+      -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,
@@ -1344,76 +1325,95 @@
       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,
+      -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,    -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,    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,    -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,    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,
+      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,    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,
-      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
+      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
@@ -1444,20 +1444,20 @@
      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,
-     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,   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,
-     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
+     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
 };
 
   /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
@@ -1467,28 +1467,28 @@
      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,
-     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,
-     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,
+     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,
      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,   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.  */
@@ -1498,28 +1498,28 @@
        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,
-       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,     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,
+       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,     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,     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
 };
 
 
@@ -2786,12 +2786,25 @@
 
   case 40:
 
-    { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
+    {
+        (yyval.interm.intermTypedNode) = context->intermediate.addBinaryMath(EOpMod, (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 41:
 
+    { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
+
+    break;
+
+  case 42:
+
     {
         (yyval.interm.intermTypedNode) = context->intermediate.addBinaryMath(EOpAdd, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
         if ((yyval.interm.intermTypedNode) == 0) {
@@ -2803,7 +2816,7 @@
 
     break;
 
-  case 42:
+  case 43:
 
     {
         (yyval.interm.intermTypedNode) = context->intermediate.addBinaryMath(EOpSub, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
@@ -2816,12 +2829,6 @@
 
     break;
 
-  case 43:
-
-    { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
-
-    break;
-
   case 44:
 
     { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
@@ -2830,6 +2837,12 @@
 
   case 45:
 
+    { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
+
+    break;
+
+  case 46:
+
     {
         (yyval.interm.intermTypedNode) = context->intermediate.addBinaryMath(EOpLessThan, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
         if ((yyval.interm.intermTypedNode) == 0) {
@@ -2843,7 +2856,7 @@
 
     break;
 
-  case 46:
+  case 47:
 
     {
         (yyval.interm.intermTypedNode) = context->intermediate.addBinaryMath(EOpGreaterThan, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
@@ -2858,7 +2871,7 @@
 
     break;
 
-  case 47:
+  case 48:
 
     {
         (yyval.interm.intermTypedNode) = context->intermediate.addBinaryMath(EOpLessThanEqual, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
@@ -2873,7 +2886,7 @@
 
     break;
 
-  case 48:
+  case 49:
 
     {
         (yyval.interm.intermTypedNode) = context->intermediate.addBinaryMath(EOpGreaterThanEqual, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
@@ -2888,13 +2901,13 @@
 
     break;
 
-  case 49:
+  case 50:
 
     { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
 
     break;
 
-  case 50:
+  case 51:
 
     {
         (yyval.interm.intermTypedNode) = context->intermediate.addBinaryMath(EOpEqual, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
@@ -2909,7 +2922,7 @@
 
     break;
 
-  case 51:
+  case 52:
 
     {
         (yyval.interm.intermTypedNode) = context->intermediate.addBinaryMath(EOpNotEqual, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
@@ -2924,12 +2937,6 @@
 
     break;
 
-  case 52:
-
-    { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
-
-    break;
-
   case 53:
 
     { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
@@ -2950,6 +2957,12 @@
 
   case 56:
 
+    { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
+
+    break;
+
+  case 57:
+
     {
         (yyval.interm.intermTypedNode) = context->intermediate.addBinaryMath(EOpLogicalAnd, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
         if ((yyval.interm.intermTypedNode) == 0) {
@@ -2963,13 +2976,13 @@
 
     break;
 
-  case 57:
+  case 58:
 
     { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
 
     break;
 
-  case 58:
+  case 59:
 
     {
         (yyval.interm.intermTypedNode) = context->intermediate.addBinaryMath(EOpLogicalXor, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
@@ -2984,13 +2997,13 @@
 
     break;
 
-  case 59:
+  case 60:
 
     { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
 
     break;
 
-  case 60:
+  case 61:
 
     {
         (yyval.interm.intermTypedNode) = context->intermediate.addBinaryMath(EOpLogicalOr, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
@@ -3005,13 +3018,13 @@
 
     break;
 
-  case 61:
+  case 62:
 
     { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
 
     break;
 
-  case 62:
+  case 63:
 
     {
        if (context->boolErrorCheck((yylsp[-3]), (yyvsp[-4].interm.intermTypedNode)))
@@ -3030,13 +3043,13 @@
 
     break;
 
-  case 63:
+  case 64:
 
     { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
 
     break;
 
-  case 64:
+  case 65:
 
     {
         if (context->lValueErrorCheck((yylsp[-1]), "assign", (yyvsp[-2].interm.intermTypedNode)))
@@ -3051,37 +3064,43 @@
 
     break;
 
-  case 65:
+  case 66:
 
     { (yyval.interm).op = EOpAssign; }
 
     break;
 
-  case 66:
+  case 67:
 
     { (yyval.interm).op = EOpMulAssign; }
 
     break;
 
-  case 67:
+  case 68:
 
     { (yyval.interm).op = EOpDivAssign; }
 
     break;
 
-  case 68:
+  case 69:
+
+    { (yyval.interm).op = EOpModAssign; }
+
+    break;
+
+  case 70:
 
     { (yyval.interm).op = EOpAddAssign; }
 
     break;
 
-  case 69:
+  case 71:
 
     { (yyval.interm).op = EOpSubAssign; }
 
     break;
 
-  case 70:
+  case 72:
 
     {
         (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
@@ -3089,7 +3108,7 @@
 
     break;
 
-  case 71:
+  case 73:
 
     {
         (yyval.interm.intermTypedNode) = context->intermediate.addComma((yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
@@ -3102,7 +3121,7 @@
 
     break;
 
-  case 72:
+  case 74:
 
     {
         if (context->constErrorCheck((yyvsp[0].interm.intermTypedNode)))
@@ -3112,7 +3131,7 @@
 
     break;
 
-  case 73:
+  case 75:
 
     {
         if (context->enterStructDeclaration((yylsp[-1]), *(yyvsp[-1].lex).string))
@@ -3122,7 +3141,7 @@
 
     break;
 
-  case 74:
+  case 76:
 
     {
         TFunction &function = *((yyvsp[-1].interm).function);
@@ -3154,7 +3173,7 @@
 
     break;
 
-  case 75:
+  case 77:
 
     {
         TIntermAggregate *aggNode = (yyvsp[-1].interm).intermAggregate;
@@ -3165,7 +3184,7 @@
 
     break;
 
-  case 76:
+  case 78:
 
     {
         if (((yyvsp[-2].interm.precision) == EbpHigh) && (context->shaderType == GL_FRAGMENT_SHADER) && !context->fragmentPrecisionHigh) {
@@ -3181,7 +3200,7 @@
 
     break;
 
-  case 77:
+  case 79:
 
     {
         ES3_ONLY(getQualifierString((yyvsp[-4].interm.type).qualifier), (yylsp[-4]), "interface blocks");
@@ -3190,7 +3209,7 @@
 
     break;
 
-  case 78:
+  case 80:
 
     {
         ES3_ONLY(getQualifierString((yyvsp[-5].interm.type).qualifier), (yylsp[-5]), "interface blocks");
@@ -3199,7 +3218,7 @@
 
     break;
 
-  case 79:
+  case 81:
 
     {
         ES3_ONLY(getQualifierString((yyvsp[-8].interm.type).qualifier), (yylsp[-8]), "interface blocks");
@@ -3208,7 +3227,7 @@
 
     break;
 
-  case 80:
+  case 82:
 
     {
         context->parseGlobalLayoutQualifier((yyvsp[-1].interm.type));
@@ -3217,7 +3236,7 @@
 
     break;
 
-  case 81:
+  case 83:
 
     {
         //
@@ -3275,25 +3294,25 @@
 
     break;
 
-  case 82:
-
-    {
-        (yyval.interm.function) = (yyvsp[0].interm.function);
-    }
-
-    break;
-
-  case 83:
-
-    {
-        (yyval.interm.function) = (yyvsp[0].interm.function);
-    }
-
-    break;
-
   case 84:
 
     {
+        (yyval.interm.function) = (yyvsp[0].interm.function);
+    }
+
+    break;
+
+  case 85:
+
+    {
+        (yyval.interm.function) = (yyvsp[0].interm.function);
+    }
+
+    break;
+
+  case 86:
+
+    {
         // Add the parameter
         (yyval.interm.function) = (yyvsp[-1].interm.function);
         if ((yyvsp[0].interm).param.type->getBasicType() != EbtVoid)
@@ -3304,7 +3323,7 @@
 
     break;
 
-  case 85:
+  case 87:
 
     {
         //
@@ -3327,7 +3346,7 @@
 
     break;
 
-  case 86:
+  case 88:
 
     {
         if ((yyvsp[-2].interm.type).qualifier != EvqGlobal && (yyvsp[-2].interm.type).qualifier != EvqTemporary) {
@@ -3349,7 +3368,7 @@
 
     break;
 
-  case 87:
+  case 89:
 
     {
         if ((yyvsp[-1].interm.type).type == EbtVoid) {
@@ -3364,7 +3383,7 @@
 
     break;
 
-  case 88:
+  case 90:
 
     {
         // Check that we can make an array out of this type
@@ -3386,28 +3405,6 @@
 
     break;
 
-  case 89:
-
-    {
-        (yyval.interm) = (yyvsp[0].interm);
-        if (context->paramErrorCheck((yylsp[0]), (yyvsp[-2].interm.qualifier), (yyvsp[-1].interm.qualifier), (yyval.interm).param.type))
-            context->recover();
-    }
-
-    break;
-
-  case 90:
-
-    {
-        (yyval.interm) = (yyvsp[0].interm);
-        if (context->parameterSamplerErrorCheck((yylsp[0]), (yyvsp[-1].interm.qualifier), *(yyvsp[0].interm).param.type))
-            context->recover();
-        if (context->paramErrorCheck((yylsp[0]), EvqTemporary, (yyvsp[-1].interm.qualifier), (yyval.interm).param.type))
-            context->recover();
-    }
-
-    break;
-
   case 91:
 
     {
@@ -3433,7 +3430,9 @@
   case 93:
 
     {
-        (yyval.interm.qualifier) = EvqIn;
+        (yyval.interm) = (yyvsp[0].interm);
+        if (context->paramErrorCheck((yylsp[0]), (yyvsp[-2].interm.qualifier), (yyvsp[-1].interm.qualifier), (yyval.interm).param.type))
+            context->recover();
     }
 
     break;
@@ -3441,7 +3440,11 @@
   case 94:
 
     {
-        (yyval.interm.qualifier) = EvqIn;
+        (yyval.interm) = (yyvsp[0].interm);
+        if (context->parameterSamplerErrorCheck((yylsp[0]), (yyvsp[-1].interm.qualifier), *(yyvsp[0].interm).param.type))
+            context->recover();
+        if (context->paramErrorCheck((yylsp[0]), EvqTemporary, (yyvsp[-1].interm.qualifier), (yyval.interm).param.type))
+            context->recover();
     }
 
     break;
@@ -3449,7 +3452,7 @@
   case 95:
 
     {
-        (yyval.interm.qualifier) = EvqOut;
+        (yyval.interm.qualifier) = EvqIn;
     }
 
     break;
@@ -3457,7 +3460,7 @@
   case 96:
 
     {
-        (yyval.interm.qualifier) = EvqInOut;
+        (yyval.interm.qualifier) = EvqIn;
     }
 
     break;
@@ -3465,13 +3468,29 @@
   case 97:
 
     {
+        (yyval.interm.qualifier) = EvqOut;
+    }
+
+    break;
+
+  case 98:
+
+    {
+        (yyval.interm.qualifier) = EvqInOut;
+    }
+
+    break;
+
+  case 99:
+
+    {
         TParameter param = { 0, new TType((yyvsp[0].interm.type)) };
         (yyval.interm).param = param;
     }
 
     break;
 
-  case 98:
+  case 100:
 
     {
         (yyval.interm) = (yyvsp[0].interm);
@@ -3479,7 +3498,7 @@
 
     break;
 
-  case 99:
+  case 101:
 
     {
         (yyval.interm) = (yyvsp[-2].interm);
@@ -3488,7 +3507,7 @@
 
     break;
 
-  case 100:
+  case 102:
 
     {
         (yyval.interm) = (yyvsp[-4].interm);
@@ -3497,7 +3516,7 @@
 
     break;
 
-  case 101:
+  case 103:
 
     {
         (yyval.interm) = (yyvsp[-5].interm);
@@ -3506,7 +3525,7 @@
 
     break;
 
-  case 102:
+  case 104:
 
     {
         (yyval.interm) = (yyvsp[-4].interm);
@@ -3515,7 +3534,7 @@
 
     break;
 
-  case 103:
+  case 105:
 
     {
         (yyval.interm).type = (yyvsp[0].interm.type);
@@ -3524,7 +3543,7 @@
 
     break;
 
-  case 104:
+  case 106:
 
     {
         (yyval.interm).type = (yyvsp[-1].interm.type);
@@ -3533,7 +3552,7 @@
 
     break;
 
-  case 105:
+  case 107:
 
     {
         context->error((yylsp[-2]), "unsized array declarations not supported", (yyvsp[-2].lex).string->c_str());
@@ -3545,7 +3564,7 @@
 
     break;
 
-  case 106:
+  case 108:
 
     {
         (yyval.interm).type = (yyvsp[-4].interm.type);
@@ -3554,7 +3573,7 @@
 
     break;
 
-  case 107:
+  case 109:
 
     {
         (yyval.interm).type = (yyvsp[-3].interm.type);
@@ -3563,7 +3582,7 @@
 
     break;
 
-  case 108:
+  case 110:
 
     {
         // $$.type is not used in invariant declarations.
@@ -3572,7 +3591,7 @@
 
     break;
 
-  case 109:
+  case 111:
 
     {
         (yyval.interm.type) = (yyvsp[0].interm.type);
@@ -3586,7 +3605,7 @@
 
     break;
 
-  case 110:
+  case 112:
 
     {
         (yyval.interm.type) = context->addFullySpecifiedType((yyvsp[-1].interm.type).qualifier, (yyvsp[-1].interm.type).layoutQualifier, (yyvsp[0].interm.type));
@@ -3594,7 +3613,7 @@
 
     break;
 
-  case 111:
+  case 113:
 
     {
         (yyval.interm.type).qualifier = EvqSmooth;
@@ -3602,7 +3621,7 @@
 
     break;
 
-  case 112:
+  case 114:
 
     {
         (yyval.interm.type).qualifier = EvqFlat;
@@ -3610,7 +3629,7 @@
 
     break;
 
-  case 113:
+  case 115:
 
     {
         (yyval.interm.qualifier) = EvqConst;
@@ -3618,7 +3637,7 @@
 
     break;
 
-  case 114:
+  case 116:
 
     {
         VERTEX_ONLY("attribute", (yylsp[0]));
@@ -3630,7 +3649,7 @@
 
     break;
 
-  case 115:
+  case 117:
 
     {
         ES2_ONLY("varying", (yylsp[0]));
@@ -3644,7 +3663,7 @@
 
     break;
 
-  case 116:
+  case 118:
 
     {
         ES2_ONLY("varying", (yylsp[-1]));
@@ -3658,7 +3677,7 @@
 
     break;
 
-  case 117:
+  case 119:
 
     {
         if ((yyvsp[0].interm.type).qualifier != EvqConst && !context->symbolTable.atGlobalLevel()) {
@@ -3671,7 +3690,7 @@
 
     break;
 
-  case 118:
+  case 120:
 
     {
         (yyval.interm.type) = context->joinInterpolationQualifiers((yylsp[-1]), (yyvsp[-1].interm.type).qualifier, (yylsp[0]), (yyvsp[0].interm.type).qualifier);
@@ -3679,7 +3698,7 @@
 
     break;
 
-  case 119:
+  case 121:
 
     {
         context->error((yylsp[0]), "interpolation qualifier requires a fragment 'in' or vertex 'out' storage qualifier", getInterpolationString((yyvsp[0].interm.type).qualifier));
@@ -3691,7 +3710,7 @@
 
     break;
 
-  case 120:
+  case 122:
 
     {
         (yyval.interm.type).qualifier = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
@@ -3700,7 +3719,7 @@
 
     break;
 
-  case 121:
+  case 123:
 
     {
         (yyval.interm.type).setBasic(EbtVoid, (yyvsp[0].interm.type).qualifier, (yylsp[0]));
@@ -3709,7 +3728,7 @@
 
     break;
 
-  case 122:
+  case 124:
 
     {
         (yyval.interm.type).qualifier = EvqConst;
@@ -3717,7 +3736,7 @@
 
     break;
 
-  case 123:
+  case 125:
 
     {
         ES3_ONLY("in", (yylsp[0]), "storage qualifier");
@@ -3726,7 +3745,7 @@
 
     break;
 
-  case 124:
+  case 126:
 
     {
         ES3_ONLY("out", (yylsp[0]), "storage qualifier");
@@ -3735,7 +3754,7 @@
 
     break;
 
-  case 125:
+  case 127:
 
     {
         ES3_ONLY("centroid in", (yylsp[-1]), "storage qualifier");
@@ -3749,7 +3768,7 @@
 
     break;
 
-  case 126:
+  case 128:
 
     {
         ES3_ONLY("centroid out", (yylsp[-1]), "storage qualifier");
@@ -3763,7 +3782,7 @@
 
     break;
 
-  case 127:
+  case 129:
 
     {
         if (context->globalErrorCheck((yylsp[0]), context->symbolTable.atGlobalLevel(), "uniform"))
@@ -3773,7 +3792,7 @@
 
     break;
 
-  case 128:
+  case 130:
 
     {
         (yyval.interm.type) = (yyvsp[0].interm.type);
@@ -3788,7 +3807,7 @@
 
     break;
 
-  case 129:
+  case 131:
 
     {
         (yyval.interm.type) = (yyvsp[0].interm.type);
@@ -3802,7 +3821,7 @@
 
     break;
 
-  case 130:
+  case 132:
 
     {
         (yyval.interm.precision) = EbpHigh;
@@ -3810,7 +3829,7 @@
 
     break;
 
-  case 131:
+  case 133:
 
     {
         (yyval.interm.precision) = EbpMedium;
@@ -3818,7 +3837,7 @@
 
     break;
 
-  case 132:
+  case 134:
 
     {
         (yyval.interm.precision) = EbpLow;
@@ -3826,7 +3845,7 @@
 
     break;
 
-  case 133:
+  case 135:
 
     {
         ES3_ONLY("layout", (yylsp[-3]), "qualifier");
@@ -3835,7 +3854,7 @@
 
     break;
 
-  case 134:
+  case 136:
 
     {
         (yyval.interm.layoutQualifier) = (yyvsp[0].interm.layoutQualifier);
@@ -3843,7 +3862,7 @@
 
     break;
 
-  case 135:
+  case 137:
 
     {
         (yyval.interm.layoutQualifier) = context->joinLayoutQualifiers((yyvsp[-2].interm.layoutQualifier), (yyvsp[0].interm.layoutQualifier));
@@ -3851,7 +3870,7 @@
 
     break;
 
-  case 136:
+  case 138:
 
     {
         (yyval.interm.layoutQualifier) = context->parseLayoutQualifier(*(yyvsp[0].lex).string, (yylsp[0]));
@@ -3859,31 +3878,31 @@
 
     break;
 
-  case 137:
-
-    {
-        (yyval.interm.layoutQualifier) = context->parseLayoutQualifier(*(yyvsp[-2].lex).string, (yylsp[-2]), *(yyvsp[0].lex).string, (yyvsp[0].lex).i, (yylsp[0]));
-    }
-
-    break;
-
-  case 138:
-
-    {
-        (yyval.interm.layoutQualifier) = context->parseLayoutQualifier(*(yyvsp[-2].lex).string, (yylsp[-2]), *(yyvsp[0].lex).string, (yyvsp[0].lex).i, (yylsp[0]));
-    }
-
-    break;
-
   case 139:
 
     {
+        (yyval.interm.layoutQualifier) = context->parseLayoutQualifier(*(yyvsp[-2].lex).string, (yylsp[-2]), *(yyvsp[0].lex).string, (yyvsp[0].lex).i, (yylsp[0]));
+    }
+
+    break;
+
+  case 140:
+
+    {
+        (yyval.interm.layoutQualifier) = context->parseLayoutQualifier(*(yyvsp[-2].lex).string, (yylsp[-2]), *(yyvsp[0].lex).string, (yyvsp[0].lex).i, (yylsp[0]));
+    }
+
+    break;
+
+  case 141:
+
+    {
         (yyval.interm.type) = (yyvsp[0].interm.type);
     }
 
     break;
 
-  case 140:
+  case 142:
 
     {
         (yyval.interm.type) = (yyvsp[-3].interm.type);
@@ -3900,7 +3919,7 @@
 
     break;
 
-  case 141:
+  case 143:
 
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
@@ -3909,29 +3928,11 @@
 
     break;
 
-  case 142:
-
-    {
-        TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
-        (yyval.interm.type).setBasic(EbtFloat, qual, (yylsp[0]));
-    }
-
-    break;
-
-  case 143:
-
-    {
-        TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
-        (yyval.interm.type).setBasic(EbtInt, qual, (yylsp[0]));
-    }
-
-    break;
-
   case 144:
 
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
-        (yyval.interm.type).setBasic(EbtUInt, qual, (yylsp[0]));
+        (yyval.interm.type).setBasic(EbtFloat, qual, (yylsp[0]));
     }
 
     break;
@@ -3940,7 +3941,7 @@
 
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
-        (yyval.interm.type).setBasic(EbtBool, qual, (yylsp[0]));
+        (yyval.interm.type).setBasic(EbtInt, qual, (yylsp[0]));
     }
 
     break;
@@ -3949,8 +3950,7 @@
 
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
-        (yyval.interm.type).setBasic(EbtFloat, qual, (yylsp[0]));
-        (yyval.interm.type).setAggregate(2);
+        (yyval.interm.type).setBasic(EbtUInt, qual, (yylsp[0]));
     }
 
     break;
@@ -3959,8 +3959,7 @@
 
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
-        (yyval.interm.type).setBasic(EbtFloat, qual, (yylsp[0]));
-        (yyval.interm.type).setAggregate(3);
+        (yyval.interm.type).setBasic(EbtBool, qual, (yylsp[0]));
     }
 
     break;
@@ -3970,7 +3969,7 @@
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
         (yyval.interm.type).setBasic(EbtFloat, qual, (yylsp[0]));
-        (yyval.interm.type).setAggregate(4);
+        (yyval.interm.type).setAggregate(2);
     }
 
     break;
@@ -3979,8 +3978,8 @@
 
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
-        (yyval.interm.type).setBasic(EbtBool, qual, (yylsp[0]));
-        (yyval.interm.type).setAggregate(2);
+        (yyval.interm.type).setBasic(EbtFloat, qual, (yylsp[0]));
+        (yyval.interm.type).setAggregate(3);
     }
 
     break;
@@ -3989,8 +3988,8 @@
 
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
-        (yyval.interm.type).setBasic(EbtBool, qual, (yylsp[0]));
-        (yyval.interm.type).setAggregate(3);
+        (yyval.interm.type).setBasic(EbtFloat, qual, (yylsp[0]));
+        (yyval.interm.type).setAggregate(4);
     }
 
     break;
@@ -4000,7 +3999,7 @@
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
         (yyval.interm.type).setBasic(EbtBool, qual, (yylsp[0]));
-        (yyval.interm.type).setAggregate(4);
+        (yyval.interm.type).setAggregate(2);
     }
 
     break;
@@ -4009,8 +4008,8 @@
 
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
-        (yyval.interm.type).setBasic(EbtInt, qual, (yylsp[0]));
-        (yyval.interm.type).setAggregate(2);
+        (yyval.interm.type).setBasic(EbtBool, qual, (yylsp[0]));
+        (yyval.interm.type).setAggregate(3);
     }
 
     break;
@@ -4019,8 +4018,8 @@
 
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
-        (yyval.interm.type).setBasic(EbtInt, qual, (yylsp[0]));
-        (yyval.interm.type).setAggregate(3);
+        (yyval.interm.type).setBasic(EbtBool, qual, (yylsp[0]));
+        (yyval.interm.type).setAggregate(4);
     }
 
     break;
@@ -4030,7 +4029,7 @@
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
         (yyval.interm.type).setBasic(EbtInt, qual, (yylsp[0]));
-        (yyval.interm.type).setAggregate(4);
+        (yyval.interm.type).setAggregate(2);
     }
 
     break;
@@ -4039,8 +4038,8 @@
 
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
-        (yyval.interm.type).setBasic(EbtUInt, qual, (yylsp[0]));
-        (yyval.interm.type).setAggregate(2);
+        (yyval.interm.type).setBasic(EbtInt, qual, (yylsp[0]));
+        (yyval.interm.type).setAggregate(3);
     }
 
     break;
@@ -4049,8 +4048,8 @@
 
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
-        (yyval.interm.type).setBasic(EbtUInt, qual, (yylsp[0]));
-        (yyval.interm.type).setAggregate(3);
+        (yyval.interm.type).setBasic(EbtInt, qual, (yylsp[0]));
+        (yyval.interm.type).setAggregate(4);
     }
 
     break;
@@ -4060,7 +4059,7 @@
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
         (yyval.interm.type).setBasic(EbtUInt, qual, (yylsp[0]));
-        (yyval.interm.type).setAggregate(4);
+        (yyval.interm.type).setAggregate(2);
     }
 
     break;
@@ -4069,8 +4068,8 @@
 
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
-        (yyval.interm.type).setBasic(EbtFloat, qual, (yylsp[0]));
-        (yyval.interm.type).setMatrix(2, 2);
+        (yyval.interm.type).setBasic(EbtUInt, qual, (yylsp[0]));
+        (yyval.interm.type).setAggregate(3);
     }
 
     break;
@@ -4079,8 +4078,8 @@
 
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
-        (yyval.interm.type).setBasic(EbtFloat, qual, (yylsp[0]));
-        (yyval.interm.type).setMatrix(3, 3);
+        (yyval.interm.type).setBasic(EbtUInt, qual, (yylsp[0]));
+        (yyval.interm.type).setAggregate(4);
     }
 
     break;
@@ -4090,7 +4089,7 @@
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
         (yyval.interm.type).setBasic(EbtFloat, qual, (yylsp[0]));
-        (yyval.interm.type).setMatrix(4, 4);
+        (yyval.interm.type).setMatrix(2, 2);
     }
 
     break;
@@ -4100,7 +4099,7 @@
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
         (yyval.interm.type).setBasic(EbtFloat, qual, (yylsp[0]));
-        (yyval.interm.type).setMatrix(2, 3);
+        (yyval.interm.type).setMatrix(3, 3);
     }
 
     break;
@@ -4110,7 +4109,7 @@
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
         (yyval.interm.type).setBasic(EbtFloat, qual, (yylsp[0]));
-        (yyval.interm.type).setMatrix(3, 2);
+        (yyval.interm.type).setMatrix(4, 4);
     }
 
     break;
@@ -4120,7 +4119,7 @@
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
         (yyval.interm.type).setBasic(EbtFloat, qual, (yylsp[0]));
-        (yyval.interm.type).setMatrix(2, 4);
+        (yyval.interm.type).setMatrix(2, 3);
     }
 
     break;
@@ -4130,7 +4129,7 @@
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
         (yyval.interm.type).setBasic(EbtFloat, qual, (yylsp[0]));
-        (yyval.interm.type).setMatrix(4, 2);
+        (yyval.interm.type).setMatrix(3, 2);
     }
 
     break;
@@ -4140,7 +4139,7 @@
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
         (yyval.interm.type).setBasic(EbtFloat, qual, (yylsp[0]));
-        (yyval.interm.type).setMatrix(3, 4);
+        (yyval.interm.type).setMatrix(2, 4);
     }
 
     break;
@@ -4150,7 +4149,7 @@
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
         (yyval.interm.type).setBasic(EbtFloat, qual, (yylsp[0]));
-        (yyval.interm.type).setMatrix(4, 3);
+        (yyval.interm.type).setMatrix(4, 2);
     }
 
     break;
@@ -4159,7 +4158,8 @@
 
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
-        (yyval.interm.type).setBasic(EbtSampler2D, qual, (yylsp[0]));
+        (yyval.interm.type).setBasic(EbtFloat, qual, (yylsp[0]));
+        (yyval.interm.type).setMatrix(3, 4);
     }
 
     break;
@@ -4168,7 +4168,8 @@
 
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
-        (yyval.interm.type).setBasic(EbtSampler3D, qual, (yylsp[0]));
+        (yyval.interm.type).setBasic(EbtFloat, qual, (yylsp[0]));
+        (yyval.interm.type).setMatrix(4, 3);
     }
 
     break;
@@ -4177,7 +4178,7 @@
 
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
-        (yyval.interm.type).setBasic(EbtSamplerCube, qual, (yylsp[0]));
+        (yyval.interm.type).setBasic(EbtSampler2D, qual, (yylsp[0]));
     }
 
     break;
@@ -4186,7 +4187,7 @@
 
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
-        (yyval.interm.type).setBasic(EbtSampler2DArray, qual, (yylsp[0]));
+        (yyval.interm.type).setBasic(EbtSampler3D, qual, (yylsp[0]));
     }
 
     break;
@@ -4195,7 +4196,7 @@
 
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
-        (yyval.interm.type).setBasic(EbtISampler2D, qual, (yylsp[0]));
+        (yyval.interm.type).setBasic(EbtSamplerCube, qual, (yylsp[0]));
     }
 
     break;
@@ -4204,7 +4205,7 @@
 
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
-        (yyval.interm.type).setBasic(EbtISampler3D, qual, (yylsp[0]));
+        (yyval.interm.type).setBasic(EbtSampler2DArray, qual, (yylsp[0]));
     }
 
     break;
@@ -4213,7 +4214,7 @@
 
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
-        (yyval.interm.type).setBasic(EbtISamplerCube, qual, (yylsp[0]));
+        (yyval.interm.type).setBasic(EbtISampler2D, qual, (yylsp[0]));
     }
 
     break;
@@ -4222,7 +4223,7 @@
 
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
-        (yyval.interm.type).setBasic(EbtISampler2DArray, qual, (yylsp[0]));
+        (yyval.interm.type).setBasic(EbtISampler3D, qual, (yylsp[0]));
     }
 
     break;
@@ -4231,7 +4232,7 @@
 
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
-        (yyval.interm.type).setBasic(EbtUSampler2D, qual, (yylsp[0]));
+        (yyval.interm.type).setBasic(EbtISamplerCube, qual, (yylsp[0]));
     }
 
     break;
@@ -4240,7 +4241,7 @@
 
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
-        (yyval.interm.type).setBasic(EbtUSampler3D, qual, (yylsp[0]));
+        (yyval.interm.type).setBasic(EbtISampler2DArray, qual, (yylsp[0]));
     }
 
     break;
@@ -4249,7 +4250,7 @@
 
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
-        (yyval.interm.type).setBasic(EbtUSamplerCube, qual, (yylsp[0]));
+        (yyval.interm.type).setBasic(EbtUSampler2D, qual, (yylsp[0]));
     }
 
     break;
@@ -4258,7 +4259,7 @@
 
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
-        (yyval.interm.type).setBasic(EbtUSampler2DArray, qual, (yylsp[0]));
+        (yyval.interm.type).setBasic(EbtUSampler3D, qual, (yylsp[0]));
     }
 
     break;
@@ -4267,7 +4268,7 @@
 
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
-        (yyval.interm.type).setBasic(EbtSampler2DShadow, qual, (yylsp[0]));
+        (yyval.interm.type).setBasic(EbtUSamplerCube, qual, (yylsp[0]));
     }
 
     break;
@@ -4276,7 +4277,7 @@
 
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
-        (yyval.interm.type).setBasic(EbtSamplerCubeShadow, qual, (yylsp[0]));
+        (yyval.interm.type).setBasic(EbtUSampler2DArray, qual, (yylsp[0]));
     }
 
     break;
@@ -4285,7 +4286,7 @@
 
     {
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
-        (yyval.interm.type).setBasic(EbtSampler2DArrayShadow, qual, (yylsp[0]));
+        (yyval.interm.type).setBasic(EbtSampler2DShadow, qual, (yylsp[0]));
     }
 
     break;
@@ -4293,6 +4294,24 @@
   case 182:
 
     {
+        TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
+        (yyval.interm.type).setBasic(EbtSamplerCubeShadow, qual, (yylsp[0]));
+    }
+
+    break;
+
+  case 183:
+
+    {
+        TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
+        (yyval.interm.type).setBasic(EbtSampler2DArrayShadow, qual, (yylsp[0]));
+    }
+
+    break;
+
+  case 184:
+
+    {
         if (!context->supportsExtension("GL_OES_EGL_image_external")) {
             context->error((yylsp[0]), "unsupported type", "samplerExternalOES");
             context->recover();
@@ -4303,7 +4322,7 @@
 
     break;
 
-  case 183:
+  case 185:
 
     {
         if (!context->supportsExtension("GL_ARB_texture_rectangle")) {
@@ -4316,7 +4335,7 @@
 
     break;
 
-  case 184:
+  case 186:
 
     {
         (yyval.interm.type) = (yyvsp[0].interm.type);
@@ -4325,7 +4344,7 @@
 
     break;
 
-  case 185:
+  case 187:
 
     {
         //
@@ -4340,13 +4359,13 @@
 
     break;
 
-  case 186:
+  case 188:
 
     { if (context->enterStructDeclaration((yylsp[-1]), *(yyvsp[-1].lex).string)) context->recover(); }
 
     break;
 
-  case 187:
+  case 189:
 
     {
         (yyval.interm.type) = context->addStructure((yylsp[-5]), (yylsp[-4]), (yyvsp[-4].lex).string, (yyvsp[-1].interm.fieldList));
@@ -4354,13 +4373,13 @@
 
     break;
 
-  case 188:
+  case 190:
 
     { if (context->enterStructDeclaration((yylsp[0]), *(yyvsp[0].lex).string)) context->recover(); }
 
     break;
 
-  case 189:
+  case 191:
 
     {
         (yyval.interm.type) = context->addStructure((yylsp[-4]), (yyloc), NewPoolTString(""), (yyvsp[-1].interm.fieldList));
@@ -4368,7 +4387,7 @@
 
     break;
 
-  case 190:
+  case 192:
 
     {
         (yyval.interm.fieldList) = (yyvsp[0].interm.fieldList);
@@ -4376,7 +4395,7 @@
 
     break;
 
-  case 191:
+  case 193:
 
     {
         (yyval.interm.fieldList) = (yyvsp[-1].interm.fieldList);
@@ -4394,7 +4413,7 @@
 
     break;
 
-  case 192:
+  case 194:
 
     {
         (yyval.interm.fieldList) = context->addStructDeclaratorList((yyvsp[-2].interm.type), (yyvsp[-1].interm.fieldList));
@@ -4402,7 +4421,7 @@
 
     break;
 
-  case 193:
+  case 195:
 
     {
         // ES3 Only, but errors should be handled elsewhere
@@ -4413,7 +4432,7 @@
 
     break;
 
-  case 194:
+  case 196:
 
     {
         (yyval.interm.fieldList) = NewPoolTFieldList();
@@ -4422,7 +4441,7 @@
 
     break;
 
-  case 195:
+  case 197:
 
     {
         (yyval.interm.fieldList)->push_back((yyvsp[0].interm.field));
@@ -4430,7 +4449,7 @@
 
     break;
 
-  case 196:
+  case 198:
 
     {
         if (context->reservedErrorCheck((yylsp[0]), *(yyvsp[0].lex).string))
@@ -4442,7 +4461,7 @@
 
     break;
 
-  case 197:
+  case 199:
 
     {
         if (context->reservedErrorCheck((yylsp[-3]), *(yyvsp[-3].lex).string))
@@ -4459,21 +4478,9 @@
 
     break;
 
-  case 198:
-
-    { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
-
-    break;
-
-  case 199:
-
-    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-
-    break;
-
   case 200:
 
-    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermAggregate); }
+    { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
 
     break;
 
@@ -4485,7 +4492,7 @@
 
   case 202:
 
-    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
+    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermAggregate); }
 
     break;
 
@@ -4515,24 +4522,36 @@
 
   case 207:
 
-    { (yyval.interm.intermAggregate) = 0; }
+    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
 
     break;
 
   case 208:
 
-    { context->symbolTable.push(); }
+    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
 
     break;
 
   case 209:
 
-    { context->symbolTable.pop(); }
+    { (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);
@@ -4543,27 +4562,15 @@
 
     break;
 
-  case 211:
-
-    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-
-    break;
-
-  case 212:
-
-    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-
-    break;
-
   case 213:
 
-    { context->symbolTable.push(); }
+    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
 
     break;
 
   case 214:
 
-    { context->symbolTable.pop(); (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
+    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
 
     break;
 
@@ -4581,13 +4588,25 @@
 
   case 217:
 
+    { context->symbolTable.push(); }
+
+    break;
+
+  case 218:
+
+    { context->symbolTable.pop(); (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
+
+    break;
+
+  case 219:
+
     {
         (yyval.interm.intermNode) = 0;
     }
 
     break;
 
-  case 218:
+  case 220:
 
     {
         if ((yyvsp[-1].interm.intermAggregate)) {
@@ -4599,7 +4618,7 @@
 
     break;
 
-  case 219:
+  case 221:
 
     {
         (yyval.interm.intermAggregate) = context->intermediate.makeAggregate((yyvsp[0].interm.intermNode), (yyloc));
@@ -4607,7 +4626,7 @@
 
     break;
 
-  case 220:
+  case 222:
 
     {
         (yyval.interm.intermAggregate) = context->intermediate.growAggregate((yyvsp[-1].interm.intermAggregate), (yyvsp[0].interm.intermNode), (yyloc));
@@ -4615,19 +4634,19 @@
 
     break;
 
-  case 221:
+  case 223:
 
     { (yyval.interm.intermNode) = 0; }
 
     break;
 
-  case 222:
+  case 224:
 
     { (yyval.interm.intermNode) = static_cast<TIntermNode*>((yyvsp[-1].interm.intermTypedNode)); }
 
     break;
 
-  case 223:
+  case 225:
 
     {
         if (context->boolErrorCheck((yylsp[-4]), (yyvsp[-2].interm.intermTypedNode)))
@@ -4637,7 +4656,7 @@
 
     break;
 
-  case 224:
+  case 226:
 
     {
         (yyval.interm.nodePair).node1 = (yyvsp[-2].interm.intermNode);
@@ -4646,7 +4665,7 @@
 
     break;
 
-  case 225:
+  case 227:
 
     {
         (yyval.interm.nodePair).node1 = (yyvsp[0].interm.intermNode);
@@ -4655,7 +4674,7 @@
 
     break;
 
-  case 226:
+  case 228:
 
     {
         (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
@@ -4665,7 +4684,7 @@
 
     break;
 
-  case 227:
+  case 229:
 
     {
         TIntermNode* intermNode;
@@ -4684,13 +4703,13 @@
 
     break;
 
-  case 228:
+  case 230:
 
     { context->symbolTable.push(); ++context->loopNestingLevel; }
 
     break;
 
-  case 229:
+  case 231:
 
     {
         context->symbolTable.pop();
@@ -4700,13 +4719,13 @@
 
     break;
 
-  case 230:
+  case 232:
 
     { ++context->loopNestingLevel; }
 
     break;
 
-  case 231:
+  case 233:
 
     {
         if (context->boolErrorCheck((yylsp[0]), (yyvsp[-2].interm.intermTypedNode)))
@@ -4718,13 +4737,13 @@
 
     break;
 
-  case 232:
+  case 234:
 
     { context->symbolTable.push(); ++context->loopNestingLevel; }
 
     break;
 
-  case 233:
+  case 235:
 
     {
         context->symbolTable.pop();
@@ -4734,26 +4753,10 @@
 
     break;
 
-  case 234:
-
-    {
-        (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
-    }
-
-    break;
-
-  case 235:
-
-    {
-        (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
-    }
-
-    break;
-
   case 236:
 
     {
-        (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
+        (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
     }
 
     break;
@@ -4761,7 +4764,7 @@
   case 237:
 
     {
-        (yyval.interm.intermTypedNode) = 0;
+        (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
     }
 
     break;
@@ -4769,13 +4772,29 @@
   case 238:
 
     {
+        (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
+    }
+
+    break;
+
+  case 239:
+
+    {
+        (yyval.interm.intermTypedNode) = 0;
+    }
+
+    break;
+
+  case 240:
+
+    {
         (yyval.interm.nodePair).node1 = (yyvsp[-1].interm.intermTypedNode);
         (yyval.interm.nodePair).node2 = 0;
     }
 
     break;
 
-  case 239:
+  case 241:
 
     {
         (yyval.interm.nodePair).node1 = (yyvsp[-2].interm.intermTypedNode);
@@ -4784,7 +4803,7 @@
 
     break;
 
-  case 240:
+  case 242:
 
     {
         if (context->loopNestingLevel <= 0) {
@@ -4796,7 +4815,7 @@
 
     break;
 
-  case 241:
+  case 243:
 
     {
         if (context->loopNestingLevel <= 0) {
@@ -4808,7 +4827,7 @@
 
     break;
 
-  case 242:
+  case 244:
 
     {
         (yyval.interm.intermNode) = context->intermediate.addBranch(EOpReturn, (yylsp[-1]));
@@ -4820,7 +4839,7 @@
 
     break;
 
-  case 243:
+  case 245:
 
     {
         (yyval.interm.intermNode) = context->intermediate.addBranch(EOpReturn, (yyvsp[-1].interm.intermTypedNode), (yylsp[-2]));
@@ -4836,7 +4855,7 @@
 
     break;
 
-  case 244:
+  case 246:
 
     {
         FRAG_ONLY("discard", (yylsp[-1]));
@@ -4845,7 +4864,7 @@
 
     break;
 
-  case 245:
+  case 247:
 
     {
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
@@ -4854,7 +4873,7 @@
 
     break;
 
-  case 246:
+  case 248:
 
     {
         (yyval.interm.intermNode) = context->intermediate.growAggregate((yyvsp[-1].interm.intermNode), (yyvsp[0].interm.intermNode), (yyloc));
@@ -4863,25 +4882,25 @@
 
     break;
 
-  case 247:
-
-    {
-        (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
-    }
-
-    break;
-
-  case 248:
-
-    {
-        (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
-    }
-
-    break;
-
   case 249:
 
     {
+        (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
+    }
+
+    break;
+
+  case 250:
+
+    {
+        (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
+    }
+
+    break;
+
+  case 251:
+
+    {
         TFunction* function = (yyvsp[0].interm).function;
         
         const TSymbol *builtIn = context->symbolTable.findBuiltIn(function->getMangledName(), context->shaderVersion);
@@ -4969,7 +4988,7 @@
 
     break;
 
-  case 250:
+  case 252:
 
     {
         //?? 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 ba885d5..41c11cf 100644
--- a/src/compiler/translator/intermOut.cpp
+++ b/src/compiler/translator/intermOut.cpp
@@ -131,6 +131,9 @@
       case EOpDivAssign:
         out << "divide second child into first child";
         break;
+      case EOpModAssign:
+        out << "modulo second child into first child";
+        break;
       case EOpIndexDirect:
         out << "direct index";
         break;
@@ -159,6 +162,9 @@
       case EOpDiv:
         out << "divide";
         break;
+      case EOpMod:
+        out << "modulo";
+        break;
       case EOpEqual:
         out << "Compare Equal";
         break;