Texture Rectangle implementation

This adds support for GL_ARB_texture_rectangle, as it is used in Chromium.
This is required in order to use EGL/GLES on MacOS using IOSurface,
in order to be able to run Chromium on top of SwiftShader on MacOS.

Change-Id: I3c0b6a137892583bbfbc68149874d5bec3026b4a
Reviewed-on: https://swiftshader-review.googlesource.com/16368
Tested-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/OpenGL/compiler/BaseTypes.h b/src/OpenGL/compiler/BaseTypes.h
index 01f9948..67b465d 100644
--- a/src/OpenGL/compiler/BaseTypes.h
+++ b/src/OpenGL/compiler/BaseTypes.h
@@ -64,6 +64,7 @@
 	EbtSampler3D,
 	EbtSamplerCube,
 	EbtSampler2DArray,
+	EbtSampler2DRect,       // Only valid if ARB_texture_rectangle exists.
 	EbtSamplerExternalOES,  // Only valid if OES_EGL_image_external exists.
 	EbtISampler2D,
 	EbtISampler3D,
@@ -113,6 +114,7 @@
 	case EbtBool:               return "bool";
 	case EbtSampler2D:          return "sampler2D";
 	case EbtSamplerCube:        return "samplerCube";
+	case EbtSampler2DRect:      return "sampler2DRect";
 	case EbtSamplerExternalOES: return "samplerExternalOES";
 	case EbtSampler3D:			return "sampler3D";
 	case EbtStruct:             return "structure";
@@ -164,6 +166,7 @@
 	case EbtSampler2D:
 	case EbtSampler3D:
 	case EbtSamplerCube:
+	case EbtSampler2DRect:
 	case EbtSamplerExternalOES:
 	case EbtSampler2DArray:
 	case EbtSampler2DShadow:
@@ -187,6 +190,7 @@
 	case EbtSampler2DArray:
 	case EbtISampler2DArray:
 	case EbtUSampler2DArray:
+	case EbtSampler2DRect:
 	case EbtSamplerExternalOES:
 	case EbtSampler2DShadow:
 	case EbtSampler2DArrayShadow:
@@ -217,6 +221,7 @@
 		return true;
 	case EbtSampler2D:
 	case EbtSampler3D:
+	case EbtSampler2DRect:
 	case EbtSamplerExternalOES:
 	case EbtSampler2DArray:
 	case EbtISampler2D:
@@ -245,6 +250,7 @@
 		return true;
 	case EbtSampler2D:
 	case EbtSamplerCube:
+	case EbtSampler2DRect:
 	case EbtSamplerExternalOES:
 	case EbtSampler2DArray:
 	case EbtISampler2D:
@@ -276,6 +282,7 @@
 	case EbtSampler2D:
 	case EbtISampler2D:
 	case EbtUSampler2D:
+	case EbtSampler2DRect:
 	case EbtSamplerExternalOES:
 	case EbtSampler3D:
 	case EbtISampler3D:
@@ -312,6 +319,7 @@
 	case EbtSampler2D:
 	case EbtSampler3D:
 	case EbtSamplerCube:
+	case EbtSampler2DRect:
 	case EbtSamplerExternalOES:
 	case EbtSampler2DArray:
 		return false;
diff --git a/src/OpenGL/compiler/Compiler.h b/src/OpenGL/compiler/Compiler.h
index 8cdc755..ae04071 100644
--- a/src/OpenGL/compiler/Compiler.h
+++ b/src/OpenGL/compiler/Compiler.h
@@ -58,6 +58,7 @@
 	int OES_fragment_precision_high;
 	int OES_EGL_image_external;
 	int EXT_draw_buffers;
+	int ARB_texture_rectangle;
 
 	unsigned int MaxCallStackDepth;
 };
@@ -66,6 +67,24 @@
 #define GL_FRAGMENT_SHADER                0x8B30
 #define GL_VERTEX_SHADER                  0x8B31
 
+// Note: GL_ARB_texture_rectangle is part of gl2extchromium.h in the Chromium repo
+// GL_ARB_texture_rectangle
+#ifndef GL_ARB_texture_rectangle
+#define GL_ARB_texture_rectangle 1
+
+#ifndef GL_SAMPLER_2D_RECT_ARB
+#define GL_SAMPLER_2D_RECT_ARB 0x8B63
+#endif
+
+#ifndef GL_TEXTURE_BINDING_RECTANGLE_ARB
+#define GL_TEXTURE_BINDING_RECTANGLE_ARB 0x84F6
+#endif
+
+#ifndef GL_TEXTURE_RECTANGLE_ARB
+#define GL_TEXTURE_RECTANGLE_ARB 0x84F5
+#endif
+#endif  // GL_ARB_texture_rectangle
+
 //
 // The base class for the machine dependent compiler to derive from
 // for managing object code from the compile.
diff --git a/src/OpenGL/compiler/Initialize.cpp b/src/OpenGL/compiler/Initialize.cpp
index 87ea6ef..57ba870 100644
--- a/src/OpenGL/compiler/Initialize.cpp
+++ b/src/OpenGL/compiler/Initialize.cpp
@@ -243,6 +243,15 @@
 	symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "textureCube", samplerCube, float3);
 	symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture3D", sampler3D, float3);
 
+	if(resources.ARB_texture_rectangle)
+	{
+		TType *sampler2DRect = new TType(EbtSampler2DRect);
+
+		symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2DRect", sampler2DRect, float2);
+		symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2DRectProj", sampler2DRect, float3);
+		symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2DRectProj", sampler2DRect, float4);
+	}
+
 	if(resources.OES_EGL_image_external)
 	{
 		TType *samplerExternalOES = new TType(EbtSamplerExternalOES);
@@ -503,4 +512,6 @@
 		extBehavior["GL_OES_EGL_image_external"] = EBhUndefined;
 	if(resources.EXT_draw_buffers)
 		extBehavior["GL_EXT_draw_buffers"] = EBhUndefined;
+	if(resources.ARB_texture_rectangle)
+		extBehavior["GL_ARB_texture_rectangle"] = EBhUndefined;
 }
diff --git a/src/OpenGL/compiler/OutputASM.cpp b/src/OpenGL/compiler/OutputASM.cpp
index fbdc113..76a177a 100644
--- a/src/OpenGL/compiler/OutputASM.cpp
+++ b/src/OpenGL/compiler/OutputASM.cpp
@@ -139,6 +139,8 @@
 			return GL_UNSIGNED_INT_SAMPLER_2D;
 		case EbtSamplerCube:
 			return GL_SAMPLER_CUBE;
+		case EbtSampler2DRect:
+			return GL_SAMPLER_2D_RECT_ARB;
 		case EbtISamplerCube:
 			return GL_INT_SAMPLER_CUBE;
 		case EbtUSamplerCube:
@@ -497,6 +499,15 @@
 			proj = true;
 			offset = true;
 		}
+		else if(name == "texture2DRect")
+		{
+			method = RECT;
+		}
+		else if(name == "texture2DRectProj")
+		{
+			method = RECT;
+			proj = true;
+		}
 		else UNREACHABLE(0);
 	}
 
@@ -1464,6 +1475,9 @@
 						}
 						else UNREACHABLE(argumentCount);
 						break;
+					case TextureFunction::RECT:
+						emit(sw::Shader::OPCODE_TEXRECT, result, &coord, s);
+						break;
 					case TextureFunction::SIZE:
 						emit(sw::Shader::OPCODE_TEXSIZE, result, arg[1], s);
 						break;
diff --git a/src/OpenGL/compiler/OutputASM.h b/src/OpenGL/compiler/OutputASM.h
index c315ef1..f6fd184 100644
--- a/src/OpenGL/compiler/OutputASM.h
+++ b/src/OpenGL/compiler/OutputASM.h
@@ -246,7 +246,8 @@
 				LOD,
 				SIZE,   // textureSize()
 				FETCH,
-				GRAD
+				GRAD,
+				RECT,
 			};
 
 			Method method;
diff --git a/src/OpenGL/compiler/SymbolTable.cpp b/src/OpenGL/compiler/SymbolTable.cpp
index 22bf292..5d7ad33 100644
--- a/src/OpenGL/compiler/SymbolTable.cpp
+++ b/src/OpenGL/compiler/SymbolTable.cpp
@@ -64,6 +64,7 @@
 	case EbtSampler3D:          mangledName += "s3";     break;
 	case EbtSamplerCube:        mangledName += "sC";     break;
 	case EbtSampler2DArray:		mangledName += "s2a";    break;
+	case EbtSampler2DRect:      mangledName += "s2r";    break;
 	case EbtSamplerExternalOES: mangledName += "sext";   break;
 	case EbtISampler2D:  		mangledName += "is2";    break;
 	case EbtISampler3D: 		mangledName += "is3";    break;
diff --git a/src/OpenGL/compiler/glslang.l b/src/OpenGL/compiler/glslang.l
index 663db3b..cc40dc2 100644
--- a/src/OpenGL/compiler/glslang.l
+++ b/src/OpenGL/compiler/glslang.l
@@ -171,6 +171,7 @@
 
 "sampler2D"          { context->lexAfterType = true; return SAMPLER2D; }
 "samplerCube"        { context->lexAfterType = true; return SAMPLERCUBE; }
+"sampler2DRect"      { context->lexAfterType = true; return SAMPLER2DRECT; }
 "samplerExternalOES" { context->lexAfterType = true; return SAMPLER_EXTERNAL_OES; }
 "sampler3D"          { context->lexAfterType = true; return SAMPLER3D; }
 "sampler3DRect"      { return ES2_reserved_ES3_keyword(context, SAMPLER3DRECT); }
@@ -312,7 +313,6 @@
 
 "sampler1D"    |
 "sampler1DShadow" |
-"sampler2DRect" |
 "sampler2DRectShadow" |
 
 "sizeof"       |
diff --git a/src/OpenGL/compiler/glslang.y b/src/OpenGL/compiler/glslang.y
index 083745e..cd0daff 100644
--- a/src/OpenGL/compiler/glslang.y
+++ b/src/OpenGL/compiler/glslang.y
@@ -1222,7 +1222,7 @@
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
         $$.setBasic(EbtSamplerCube, qual, @1);
     }
-	| SAMPLER_EXTERNAL_OES {
+    | SAMPLER_EXTERNAL_OES {
         if (!context->supportsExtension("GL_OES_EGL_image_external")) {
             context->error(@1, "unsupported type", "samplerExternalOES", "");
             context->recover();
@@ -1231,6 +1231,15 @@
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
         $$.setBasic(EbtSamplerExternalOES, qual, @1);
     }
+    | SAMPLER2DRECT {
+        if (!context->supportsExtension("GL_ARB_texture_rectangle")) {
+            context->error(@1, "unsupported type", "sampler2DRect", "");
+            context->recover();
+        }
+        FRAG_VERT_ONLY("sampler2DRect", @1);
+        TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
+        $$.setBasic(EbtSampler2DRect, qual, @1);
+    }
     | SAMPLER3D {
         FRAG_VERT_ONLY("sampler3D", @1);
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
diff --git a/src/OpenGL/compiler/glslang_lex.cpp b/src/OpenGL/compiler/glslang_lex.cpp
index f9785cc..55b6ffb 100644
--- a/src/OpenGL/compiler/glslang_lex.cpp
+++ b/src/OpenGL/compiler/glslang_lex.cpp
@@ -545,7 +545,7 @@
       177,  177,  177,  177,  177,  177,  177,  177,  177,  177,
       177,  177,  177,  177,  177,  177,  177,  177,  177,  177,
       177,  177,  199,  203,  235,    0,  189,  185,    0,  188,
-      182,    0,  184,  178,  195,  196,  177,  135,  177,  177,
+      182,    0,  184,  178,  195,  196,  177,  136,  177,  177,
       177,  177,  177,  177,  177,  177,  177,  177,  177,  177,
       177,  177,  177,  177,  177,  177,  177,  177,  177,  177,
       177,   13,  177,  177,  177,  177,  177,  177,  177,  177,
@@ -557,67 +557,67 @@
       177,  177,  177,  177,  177,  177,  177,  177,  177,    0,
       186,    0,  185,  187,  181,  177,  177,  177,   30,  177,
       177,   18,  174,  177,  177,  177,  177,  177,  177,  177,
-      177,  177,  177,   16,  138,  177,  177,  177,  177,   21,
-      177,  177,  142,  154,  177,  177,  177,  177,  177,  177,
-      177,  177,  177,  177,  177,  177,  151,    4,   35,   36,
+      177,  177,  177,   16,  139,  177,  177,  177,  177,   21,
+      177,  177,  143,  155,  177,  177,  177,  177,  177,  177,
+      177,  177,  177,  177,  177,  177,  152,    4,   35,   36,
 
        37,  177,  177,  177,  177,  177,  177,  177,  177,  177,
       177,  177,  177,  177,  177,  177,  177,  177,  177,  177,
-      177,  177,  177,  177,  177,  141,   31,  177,  177,   28,
+      177,  177,  177,  177,  177,  142,   31,  177,  177,   28,
       177,  177,  177,  177,  177,  177,  177,   47,   48,   49,
        29,  177,  177,  177,  177,  177,  177,   10,   56,   57,
-       58,  177,  136,  177,  177,    7,  177,  177,  177,  177,
-      163,  164,  165,  177,   32,  177,  155,   26,  166,  167,
-      168,    2,  160,  161,  162,  177,  177,  177,   25,  158,
+       58,  177,  137,  177,  177,    7,  177,  177,  177,  177,
+      164,  165,  166,  177,   32,  177,  156,   26,  167,  168,
+      169,    2,  161,  162,  163,  177,  177,  177,   25,  159,
       177,  177,  177,   50,   51,   52,  177,  177,  177,  177,
-      177,  177,  177,  177,  177,  177,  177,   85,  177,  177,
+      177,  177,  177,  177,  177,  177,  177,   86,  177,  177,
 
-      177,  177,  177,  177,  177,  152,  177,  177,  177,  177,
-      177,  177,  177,  177,  177,  177,  177,  137,  177,  177,
-      176,   53,   54,   55,  177,  177,   14,  177,   90,  177,
-      177,  177,  177,   88,  177,  177,  177,  153,  148,   91,
-      177,  177,  177,  177,  177,  177,  143,  177,  177,  177,
-       77,   38,   41,   43,   42,   39,   45,   44,   46,   40,
-      177,  177,  177,  177,  159,  134,  177,  177,  146,  177,
-      177,  177,   34,   86,  173,   22,  147,   76,  177,  157,
+      177,  177,  177,  177,  177,  153,  177,  177,  177,  177,
+      177,  177,  177,  177,  177,  177,  177,  138,  177,  177,
+      176,   53,   54,   55,  177,  177,   14,  177,   91,  177,
+      177,  177,  177,   89,  177,  177,  177,  154,  149,   92,
+      177,  177,  177,  177,  177,  177,  144,  177,  177,  177,
+       78,   38,   41,   43,   42,   39,   45,   44,   46,   40,
+      177,  177,  177,  177,  160,  135,  177,  177,  147,  177,
+      177,  177,   34,   87,  173,   22,  148,   77,  177,  158,
        17,  177,  177,  177,  177,  177,  177,  177,  177,  177,
       177,  177,  177,  177,  177,   19,   33,  177,  177,  177,
 
-      177,  177,  177,   92,   93,   94,  177,  177,  177,  177,
+      177,  177,  177,   93,   94,   95,  177,  177,  177,  177,
       177,    3,  177,  177,  177,  177,  177,  177,  177,  177,
-      177,  177,  177,  139,  177,  177,  177,  177,  177,    8,
-      177,  177,    9,  177,  177,  177,  177,   20,   78,   11,
-      149,   96,   97,   98,  177,  177,  177,  177,  177,  177,
-      177,  177,  177,  177,  177,  177,  144,  177,  177,  177,
-       80,   82,   79,  177,  177,  177,  177,  177,  177,  177,
-      140,  100,  101,  102,  177,  177,  156,  177,  145,  177,
+      177,  177,  177,  140,  177,  177,  177,  177,  177,    8,
+      177,  177,    9,  177,  177,  177,  177,   20,   79,   11,
+      150,   97,   98,   99,  177,  177,  177,  177,  177,  177,
+      177,  177,  177,  177,  177,  177,  145,  177,  177,  177,
+       81,   83,   80,  177,  177,  177,  177,  177,  177,  177,
+      141,  101,  102,  103,  177,  177,  157,  177,  146,  177,
       177,    6,  177,  177,  177,  177,  177,  177,  177,  177,
-      177,   95,  150,    1,  177,  177,  177,  177,  177,  175,
+      177,   96,  151,    1,  177,  177,  177,  177,  177,  175,
 
-      177,   89,    5,  169,   59,   62,  177,  177,  177,  177,
-      177,  177,  177,  177,  177,  177,  177,  177,  177,   81,
-      177,  177,  177,  177,   99,  177,  177,  177,  177,  177,
-      119,   65,   66,  177,  177,  177,  177,  177,  177,  177,
-      177,  177,  177,  177,  177,  177,   87,  177,  177,  177,
-      103,  121,   69,   70,  177,  177,   83,  177,  177,  177,
-      177,  177,  177,  177,  114,  177,  177,  177,  177,  177,
-      177,  177,  177,  177,  177,  128,  177,  177,  177,  177,
+      177,   90,    5,  170,   59,   63,  177,  177,  177,  177,
+      177,  177,  177,  177,  177,  177,  177,  177,  177,   82,
+      177,  177,  177,  177,  100,  177,  177,  177,  177,  177,
+      120,   66,   67,  177,  177,  177,  177,  177,  177,  177,
+      177,  177,  177,  177,  177,  177,   88,  177,  177,  177,
+      104,  122,   70,   71,  177,  177,   84,  177,  177,  177,
+      177,  177,  177,  177,  115,  177,  177,  177,  177,  177,
+      177,  177,  177,  177,  177,  129,  177,  177,  177,  177,
        60,  177,  177,  177,  177,  177,  177,  177,  177,  177,
-      177,  177,  177,  115,  104,  177,  105,  177,  177,  177,
+      177,  177,  177,  116,  105,  177,  106,  177,  177,  177,
 
-      129,  177,  177,   67,  177,  177,  177,  177,  177,  177,
-      177,  177,  177,  177,  177,  177,  177,  116,  177,  177,
-      130,  177,  177,   71,  106,  107,  177,  110,  177,  111,
-      177,  177,  177,  177,  177,   84,  177,  177,  177,  177,
-      171,  177,   63,  125,  177,  177,  108,  109,  177,  177,
-      177,  177,  177,  177,  177,  177,  177,  177,  123,  126,
-      117,  177,   64,  177,  177,  177,  177,  177,  177,  177,
-      177,  124,  127,  177,  177,  120,   68,  177,  177,  170,
-      177,  177,  177,   73,  177,  177,  122,   72,  177,  177,
-      177,  177,  177,  177,  131,  177,  177,  177,  177,  177,
+      130,  177,  177,   68,  177,  177,  177,  177,  177,  177,
+      177,  177,  177,  177,  177,  177,  177,  117,  177,  177,
+      131,  177,  177,   72,  107,  108,  177,  111,  177,  112,
+      177,  177,  177,  177,  177,   85,  177,  177,  177,  177,
+       61,  177,   64,  126,  177,  177,  109,  110,  177,  177,
+      177,  177,  177,  177,  177,  177,  177,  177,  124,  127,
+      118,  177,   65,  177,  177,  177,  177,  177,  177,  177,
+      177,  125,  128,  177,  177,  121,   69,  177,  177,  171,
+      177,  177,  177,   74,  177,  177,  123,   73,  177,  177,
+      177,  177,  177,  177,  132,  177,  177,  177,  177,  177,
 
-      177,  132,  177,  177,  177,   74,  177,  133,  112,  113,
-      177,  177,  177,   61,  177,  177,  172,  118,   75,    0
+      177,  133,  177,  177,  177,   75,  177,  134,  113,  114,
+      177,  177,  177,   62,  177,  177,  172,  119,   76,    0
     } ;
 
 static const YY_CHAR yy_ec[256] =
@@ -1891,74 +1891,77 @@
 	YY_BREAK
 case 61:
 YY_RULE_SETUP
-{ context->lexAfterType = true; return SAMPLER_EXTERNAL_OES; }
+{ context->lexAfterType = true; return SAMPLER2DRECT; }
 	YY_BREAK
 case 62:
 YY_RULE_SETUP
-{ context->lexAfterType = true; return SAMPLER3D; }
+{ context->lexAfterType = true; return SAMPLER_EXTERNAL_OES; }
 	YY_BREAK
 case 63:
 YY_RULE_SETUP
-{ return ES2_reserved_ES3_keyword(context, SAMPLER3DRECT); }
+{ context->lexAfterType = true; return SAMPLER3D; }
 	YY_BREAK
 case 64:
 YY_RULE_SETUP
-{ return  ES2_identifier_ES3_keyword(context, SAMPLER2DARRAY); }
+{ return ES2_reserved_ES3_keyword(context, SAMPLER3DRECT); }
 	YY_BREAK
 case 65:
 YY_RULE_SETUP
-{ return  ES2_identifier_ES3_keyword(context, ISAMPLER2D); }
+{ return  ES2_identifier_ES3_keyword(context, SAMPLER2DARRAY); }
 	YY_BREAK
 case 66:
 YY_RULE_SETUP
-{ return  ES2_identifier_ES3_keyword(context, ISAMPLER3D); }
+{ return  ES2_identifier_ES3_keyword(context, ISAMPLER2D); }
 	YY_BREAK
 case 67:
 YY_RULE_SETUP
-{ return  ES2_identifier_ES3_keyword(context, ISAMPLERCUBE); }
+{ return  ES2_identifier_ES3_keyword(context, ISAMPLER3D); }
 	YY_BREAK
 case 68:
 YY_RULE_SETUP
-{ return  ES2_identifier_ES3_keyword(context, ISAMPLER2DARRAY); }
+{ return  ES2_identifier_ES3_keyword(context, ISAMPLERCUBE); }
 	YY_BREAK
 case 69:
 YY_RULE_SETUP
-{ return  ES2_identifier_ES3_keyword(context, USAMPLER2D); }
+{ return  ES2_identifier_ES3_keyword(context, ISAMPLER2DARRAY); }
 	YY_BREAK
 case 70:
 YY_RULE_SETUP
-{ return  ES2_identifier_ES3_keyword(context, USAMPLER3D); }
+{ return  ES2_identifier_ES3_keyword(context, USAMPLER2D); }
 	YY_BREAK
 case 71:
 YY_RULE_SETUP
-{ return  ES2_identifier_ES3_keyword(context, USAMPLERCUBE); }
+{ return  ES2_identifier_ES3_keyword(context, USAMPLER3D); }
 	YY_BREAK
 case 72:
 YY_RULE_SETUP
-{ return  ES2_identifier_ES3_keyword(context, USAMPLER2DARRAY); }
+{ return  ES2_identifier_ES3_keyword(context, USAMPLERCUBE); }
 	YY_BREAK
 case 73:
 YY_RULE_SETUP
-{ return ES2_reserved_ES3_keyword(context, SAMPLER2DSHADOW); }
+{ return  ES2_identifier_ES3_keyword(context, USAMPLER2DARRAY); }
 	YY_BREAK
 case 74:
 YY_RULE_SETUP
-{ return  ES2_identifier_ES3_keyword(context, SAMPLERCUBESHADOW); }
+{ return ES2_reserved_ES3_keyword(context, SAMPLER2DSHADOW); }
 	YY_BREAK
 case 75:
 YY_RULE_SETUP
-{ return  ES2_identifier_ES3_keyword(context, SAMPLER2DARRAYSHADOW); }
+{ return  ES2_identifier_ES3_keyword(context, SAMPLERCUBESHADOW); }
 	YY_BREAK
 case 76:
 YY_RULE_SETUP
-{ context->lexAfterType = true; return(STRUCT); }
+{ return  ES2_identifier_ES3_keyword(context, SAMPLER2DARRAYSHADOW); }
 	YY_BREAK
 case 77:
 YY_RULE_SETUP
+{ context->lexAfterType = true; return(STRUCT); }
+	YY_BREAK
+case 78:
+YY_RULE_SETUP
 { return ES2_identifier_ES3_keyword(context, LAYOUT); }
 	YY_BREAK
 /* Reserved keywords for GLSL ES 3.00 that are not reserved for GLSL ES 1.00 */
-case 78:
 case 79:
 case 80:
 case 81:
@@ -2014,6 +2017,7 @@
 case 131:
 case 132:
 case 133:
+case 134:
 YY_RULE_SETUP
 { 
     if (context->getShaderVersion() < 300) {
@@ -2024,7 +2028,7 @@
 }
 	YY_BREAK
 /* Reserved keywords in GLSL ES 1.00 that are not reserved in GLSL ES 3.00 */
-case 134:
+case 135:
 YY_RULE_SETUP
 {
     if (context->getShaderVersion() >= 300)
@@ -2037,7 +2041,6 @@
 }
 	YY_BREAK
 /* Reserved keywords */
-case 135:
 case 136:
 case 137:
 case 138:
diff --git a/src/OpenGL/compiler/glslang_tab.cpp b/src/OpenGL/compiler/glslang_tab.cpp
index 17f40e8..811da14 100644
--- a/src/OpenGL/compiler/glslang_tab.cpp
+++ b/src/OpenGL/compiler/glslang_tab.cpp
@@ -634,18 +634,18 @@
 #endif /* !YYCOPY_NEEDED */
 
 /* YYFINAL -- State number of the termination state.  */
-#define YYFINAL  112
+#define YYFINAL  113
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   2525
+#define YYLAST   2530
 
 /* YYNTOKENS -- Number of terminals.  */
 #define YYNTOKENS  128
 /* YYNNTS -- Number of nonterminals.  */
 #define YYNNTS  93
 /* YYNRULES -- Number of rules.  */
-#define YYNRULES  272
+#define YYNRULES  273
 /* YYNSTATES -- Number of states.  */
-#define YYNSTATES  413
+#define YYNSTATES  414
 
 /* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned
    by yylex, with out-of-bounds checking.  */
@@ -722,16 +722,16 @@
     1037,  1040,  1046,  1049,  1052,  1058,  1061,  1066,  1081,  1085,
     1089,  1093,  1097,  1101,  1106,  1111,  1116,  1121,  1126,  1131,
     1136,  1141,  1146,  1151,  1156,  1161,  1167,  1173,  1179,  1185,
-    1191,  1197,  1203,  1209,  1215,  1220,  1225,  1234,  1239,  1244,
-    1249,  1254,  1259,  1264,  1269,  1274,  1279,  1284,  1289,  1294,
-    1299,  1304,  1317,  1317,  1320,  1320,  1326,  1329,  1345,  1348,
-    1357,  1361,  1367,  1374,  1389,  1393,  1397,  1398,  1404,  1405,
-    1406,  1407,  1408,  1409,  1410,  1414,  1415,  1415,  1415,  1425,
-    1426,  1430,  1430,  1431,  1431,  1436,  1439,  1449,  1452,  1458,
-    1459,  1463,  1471,  1475,  1482,  1482,  1489,  1492,  1499,  1504,
-    1519,  1519,  1524,  1524,  1531,  1531,  1539,  1542,  1548,  1551,
-    1557,  1561,  1568,  1571,  1574,  1577,  1580,  1589,  1593,  1600,
-    1603,  1609,  1609
+    1191,  1197,  1203,  1209,  1215,  1220,  1225,  1234,  1243,  1248,
+    1253,  1258,  1263,  1268,  1273,  1278,  1283,  1288,  1293,  1298,
+    1303,  1308,  1313,  1326,  1326,  1329,  1329,  1335,  1338,  1354,
+    1357,  1366,  1370,  1376,  1383,  1398,  1402,  1406,  1407,  1413,
+    1414,  1415,  1416,  1417,  1418,  1419,  1423,  1424,  1424,  1424,
+    1434,  1435,  1439,  1439,  1440,  1440,  1445,  1448,  1458,  1461,
+    1467,  1468,  1472,  1480,  1484,  1491,  1491,  1498,  1501,  1508,
+    1513,  1528,  1528,  1533,  1533,  1540,  1540,  1548,  1551,  1557,
+    1560,  1566,  1570,  1577,  1580,  1583,  1586,  1589,  1598,  1602,
+    1609,  1612,  1618,  1618
 };
 #endif
 
@@ -820,12 +820,12 @@
 };
 # endif
 
-#define YYPACT_NINF -334
+#define YYPACT_NINF -344
 
 #define yypact_value_is_default(Yystate) \
-  (!!((Yystate) == (-334)))
+  (!!((Yystate) == (-344)))
 
-#define YYTABLE_NINF -232
+#define YYTABLE_NINF -233
 
 #define yytable_value_is_error(Yytable_value) \
   0
@@ -834,48 +834,48 @@
      STATE-NUM.  */
 static const yytype_int16 yypact[] =
 {
-    2163,    10,  -334,  -334,  -334,   169,  -334,  -334,  -334,  -334,
-    -334,  -334,  -334,  -334,  -334,  -334,  -334,  -334,  -334,  -334,
-    -334,  -334,  -334,  -334,  -334,  -334,  -334,  -334,  -334,  -334,
-    -334,  -334,  -334,  -334,  -334,  -334,  -334,    69,  -334,  -334,
-     -48,  -334,  -334,  -334,  -334,  -334,  -334,  -334,  -334,  -334,
-    -334,  -334,  -334,  -334,  -334,  -334,  -334,  -334,   -82,  -334,
-    -334,   -78,   -73,   -71,     1,   -59,  -334,   -32,   113,  1182,
-    -334,  -334,  2448,   113,  -334,   -23,  -334,  2088,  -334,  -334,
-    -334,  -334,   113,  -334,  2448,  -334,  -334,    11,  -334,     9,
-    -334,    20,  -334,   121,  -334,  -334,  -334,  -334,  -334,  2312,
-     150,    22,  -334,   -79,  -334,    37,  -334,  2238,  -334,  -334,
-    -334,  1252,  -334,  -334,  -334,    62,  -334,  2238,    44,   -41,
-    -334,   410,  -334,  -334,  -334,  -334,   105,  2312,   -76,  -334,
-    1350,  1641,  -334,   107,  2312,   117,  1833,  -334,    91,  -334,
-    -334,  -334,  -334,  -334,  1641,  1641,  1641,  -334,  -334,  -334,
-    -334,  -334,  -334,  -334,    19,  -334,  -334,  -334,   103,   -24,
-    1736,   120,  -334,  1641,    80,   -42,   -36,    15,    43,    99,
-     108,   104,   141,   142,   -69,  -334,   127,  -334,  -334,  2238,
-    1918,    87,  -334,     9,   122,   124,  -334,   135,   136,   129,
-    1448,   140,  1641,   133,   143,   137,  -334,  -334,   118,  -334,
-    -334,    12,  -334,   -78,   145,  -334,  -334,  -334,  -334,   526,
-    -334,  -334,  -334,  -334,  -334,  -334,   144,  -334,  -334,  1543,
-    1641,   138,   148,  -334,  -334,   117,   146,    28,  -334,   -58,
-    -334,  -334,  -334,   -15,  -334,  -334,  1641,  2380,  -334,  -334,
-    1641,   154,  -334,  -334,  -334,  1641,  1641,  1641,  1641,  1641,
-    1641,  1641,  1641,  1641,  1641,  1641,  1641,  1641,  1641,  1641,
-    1641,  1641,  1641,  1641,  1641,  -334,  2003,  -334,  -334,  -334,
-    -334,  -334,  -334,   152,  -334,  1641,  -334,  -334,    41,  1641,
-     149,  -334,  -334,  -334,   642,  -334,  -334,  -334,  -334,  -334,
-    -334,  -334,  -334,  -334,  -334,  -334,  1641,  1641,  -334,  -334,
-    -334,  1641,   151,   155,  -334,  1641,   157,    57,  1641,   117,
-    -334,   -85,  -334,  -334,   156,   160,  -334,   161,  -334,  -334,
-    -334,  -334,  -334,    80,    80,   -42,   -42,   -36,   -36,   -36,
-     -36,    15,    15,    43,    99,   108,   104,   141,   142,    72,
-    -334,   211,    20,   874,   990,   -10,  -334,     3,  -334,  1087,
-     642,  -334,  -334,   165,  1641,   163,  -334,  1641,  -334,   166,
-    -334,  1641,  -334,  -334,  1641,   164,  -334,  -334,  -334,  -334,
-    1087,   152,  -334,   160,   198,  2312,   172,   170,  -334,  -334,
-    1641,  -334,  -334,   171,  -334,  1641,  -334,   167,   175,   265,
-    -334,   178,   174,   758,  -334,  -334,   176,    13,  1641,   758,
-     152,  -334,  1641,  -334,  -334,  -334,  -334,   177,   160,  -334,
-    -334,  -334,  -334
+    2168,   120,  -344,  -344,  -344,   146,  -344,  -344,  -344,  -344,
+    -344,  -344,  -344,  -344,  -344,  -344,  -344,  -344,  -344,  -344,
+    -344,  -344,  -344,  -344,  -344,  -344,  -344,  -344,  -344,  -344,
+    -344,  -344,  -344,  -344,  -344,  -344,  -344,   127,  -344,  -344,
+     -41,  -344,  -344,  -344,  -344,  -344,  -344,  -344,  -344,  -344,
+    -344,  -344,  -344,  -344,  -344,  -344,  -344,  -344,  -344,   -84,
+    -344,  -344,   -68,   -57,   -39,     1,   -89,  -344,    41,    14,
+    1187,  -344,  -344,  2453,    14,  -344,    15,  -344,  2093,  -344,
+    -344,  -344,  -344,    14,  -344,  2453,  -344,  -344,    18,  -344,
+      47,  -344,    26,  -344,    10,  -344,  -344,  -344,  -344,  -344,
+    2317,   113,    60,  -344,   -66,  -344,    31,  -344,  2243,  -344,
+    -344,  -344,  1257,  -344,  -344,  -344,   -45,  -344,  2243,    46,
+     -21,  -344,   415,  -344,  -344,  -344,  -344,    68,  2317,   -42,
+    -344,  1355,  1646,  -344,   188,  2317,    89,  1838,  -344,    85,
+    -344,  -344,  -344,  -344,  -344,  1646,  1646,  1646,  -344,  -344,
+    -344,  -344,  -344,  -344,  -344,    39,  -344,  -344,  -344,    74,
+     -17,  1741,    96,  -344,  1646,    37,   -37,    91,   -61,    87,
+      65,    81,    71,   116,   115,   -64,  -344,   102,  -344,  -344,
+    2243,  1923,   105,  -344,    47,    97,    99,  -344,   110,   131,
+     124,  1453,   138,  1646,   132,   142,   140,  -344,  -344,   123,
+    -344,  -344,   -77,  -344,   -68,   143,  -344,  -344,  -344,  -344,
+     531,  -344,  -344,  -344,  -344,  -344,  -344,   144,  -344,  -344,
+    1548,  1646,   141,   148,  -344,  -344,    89,   145,    -9,  -344,
+     -58,  -344,  -344,  -344,   -13,  -344,  -344,  1646,  2385,  -344,
+    -344,  1646,   152,  -344,  -344,  -344,  1646,  1646,  1646,  1646,
+    1646,  1646,  1646,  1646,  1646,  1646,  1646,  1646,  1646,  1646,
+    1646,  1646,  1646,  1646,  1646,  1646,  -344,  2008,  -344,  -344,
+    -344,  -344,  -344,  -344,   150,  -344,  1646,  -344,  -344,    -7,
+    1646,   147,  -344,  -344,  -344,   647,  -344,  -344,  -344,  -344,
+    -344,  -344,  -344,  -344,  -344,  -344,  -344,  1646,  1646,  -344,
+    -344,  -344,  1646,   149,   153,  -344,  1646,   151,     5,  1646,
+      89,  -344,   -70,  -344,  -344,   158,   157,  -344,   165,  -344,
+    -344,  -344,  -344,  -344,    37,    37,   -37,   -37,    91,    91,
+      91,    91,   -61,   -61,    87,    65,    81,    71,   116,   115,
+      75,  -344,   214,    26,   879,   995,    -8,  -344,     4,  -344,
+    1092,   647,  -344,  -344,   164,  1646,   159,  -344,  1646,  -344,
+     166,  -344,  1646,  -344,  -344,  1646,   170,  -344,  -344,  -344,
+    -344,  1092,   150,  -344,   157,   200,  2317,   172,   169,  -344,
+    -344,  1646,  -344,  -344,   173,  -344,  1646,  -344,   167,   174,
+     265,  -344,   175,   171,   763,  -344,  -344,   177,     9,  1646,
+     763,   150,  -344,  1646,  -344,  -344,  -344,  -344,   178,   157,
+    -344,  -344,  -344,  -344
 };
 
   /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
@@ -887,74 +887,74 @@
      160,   161,   166,   167,   168,   169,   170,   171,   163,   164,
      165,   172,   173,   174,   175,   176,   177,   139,   140,   143,
      129,   178,   179,   180,   181,   182,   183,     0,   126,   125,
-       0,   158,   184,   185,   186,   188,   189,   190,   191,   192,
-     193,   194,   195,   196,   187,   197,   198,   199,     0,   201,
-     270,   271,     0,    95,   105,     0,   110,   116,   133,     0,
-     131,   123,     0,   134,   144,   155,   200,     0,   267,   269,
-     130,   122,     0,   136,     0,   141,   142,     0,   204,     0,
-      86,     0,    93,   105,   127,   106,   107,   108,    96,     0,
-     105,     0,    87,   117,   132,     0,    92,     0,   124,   145,
-     135,     0,     1,   268,   137,     0,   202,     0,   152,     0,
-     150,     0,   272,    97,   102,   104,   109,     0,   111,    98,
-       0,     0,    85,     0,     0,     0,     0,   206,     2,     6,
-       4,     5,     7,    28,     0,     0,     0,   156,    35,    34,
-      36,    33,     3,     9,    29,    11,    16,    17,     0,     0,
-      22,     0,    37,     0,    41,    44,    47,    52,    55,    57,
-      59,    61,    63,    65,    67,    84,     0,    26,    88,     0,
-       0,     0,   149,     0,     0,     0,   252,     0,     0,     0,
-       0,     0,     0,     0,     0,   226,   235,   239,    37,    69,
-      82,     0,   215,     0,   144,   218,   237,   217,   216,     0,
-     219,   220,   221,   222,   223,   224,    99,   101,   103,     0,
-       0,     0,     0,   214,   121,     0,   212,     0,   210,     0,
-     207,    30,    31,     0,    13,    14,     0,     0,    20,    19,
-       0,   158,    23,    25,    32,     0,     0,     0,     0,     0,
+       0,   158,   184,   185,   186,   187,   189,   190,   191,   192,
+     193,   194,   195,   196,   197,   188,   198,   199,   200,     0,
+     202,   271,   272,     0,    95,   105,     0,   110,   116,   133,
+       0,   131,   123,     0,   134,   144,   155,   201,     0,   268,
+     270,   130,   122,     0,   136,     0,   141,   142,     0,   205,
+       0,    86,     0,    93,   105,   127,   106,   107,   108,    96,
+       0,   105,     0,    87,   117,   132,     0,    92,     0,   124,
+     145,   135,     0,     1,   269,   137,     0,   203,     0,   152,
+       0,   150,     0,   273,    97,   102,   104,   109,     0,   111,
+      98,     0,     0,    85,     0,     0,     0,     0,   207,     2,
+       6,     4,     5,     7,    28,     0,     0,     0,   156,    35,
+      34,    36,    33,     3,     9,    29,    11,    16,    17,     0,
+       0,    22,     0,    37,     0,    41,    44,    47,    52,    55,
+      57,    59,    61,    63,    65,    67,    84,     0,    26,    88,
+       0,     0,     0,   149,     0,     0,     0,   253,     0,     0,
+       0,     0,     0,     0,     0,     0,   227,   236,   240,    37,
+      69,    82,     0,   216,     0,   144,   219,   238,   218,   217,
+       0,   220,   221,   222,   223,   224,   225,    99,   101,   103,
+       0,     0,     0,     0,   215,   121,     0,   213,     0,   211,
+       0,   208,    30,    31,     0,    13,    14,     0,     0,    20,
+      19,     0,   158,    23,    25,    32,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   157,     0,   205,   153,   154,
-     151,   263,   262,   233,   254,     0,   266,   264,     0,     0,
-       0,   247,   250,   225,     0,    72,    73,    75,    74,    77,
-      78,    79,    80,    81,    76,    71,     0,     0,   240,   236,
-     238,     0,     0,     0,   115,     0,   118,     0,     0,     0,
-     208,     0,    89,     8,     0,    15,    27,    12,    18,    24,
-      38,    39,    40,    43,    42,    45,    46,    50,    51,    48,
-      49,    53,    54,    56,    58,    60,    62,    64,    66,     0,
-     203,     0,     0,     0,     0,     0,   265,     0,   246,     0,
-     227,    70,    83,     0,     0,   112,   119,     0,   209,     0,
-     211,     0,    90,    10,     0,     0,   232,   234,   257,   256,
-     259,   233,   244,   248,     0,     0,     0,     0,   100,   113,
-       0,   120,   213,     0,    68,     0,   258,     0,     0,   243,
-     241,     0,     0,     0,   228,   114,     0,     0,   260,     0,
-     233,   245,     0,   230,   251,   229,    91,     0,   261,   255,
-     242,   249,   253
+       0,     0,     0,     0,     0,     0,   157,     0,   206,   153,
+     154,   151,   264,   263,   234,   255,     0,   267,   265,     0,
+       0,     0,   248,   251,   226,     0,    72,    73,    75,    74,
+      77,    78,    79,    80,    81,    76,    71,     0,     0,   241,
+     237,   239,     0,     0,     0,   115,     0,   118,     0,     0,
+       0,   209,     0,    89,     8,     0,    15,    27,    12,    18,
+      24,    38,    39,    40,    43,    42,    45,    46,    50,    51,
+      48,    49,    53,    54,    56,    58,    60,    62,    64,    66,
+       0,   204,     0,     0,     0,     0,     0,   266,     0,   247,
+       0,   228,    70,    83,     0,     0,   112,   119,     0,   210,
+       0,   212,     0,    90,    10,     0,     0,   233,   235,   258,
+     257,   260,   234,   245,   249,     0,     0,     0,     0,   100,
+     113,     0,   120,   214,     0,    68,     0,   259,     0,     0,
+     244,   242,     0,     0,     0,   229,   114,     0,     0,   261,
+       0,   234,   246,     0,   231,   252,   230,    91,     0,   262,
+     256,   243,   250,   254
 };
 
   /* YYPGOTO[NTERM-NUM].  */
 static const yytype_int16 yypgoto[] =
 {
-    -334,  -334,  -334,  -334,  -334,  -334,  -334,    46,  -334,  -334,
-    -334,  -334,    66,  -334,   -46,   -44,   -67,   -34,    30,    33,
-      29,    32,    34,    31,  -334,  -104,  -127,  -334,  -144,  -119,
-    -334,    14,    17,  -334,  -334,  -334,   168,   204,   199,   173,
-    -334,  -334,  -325,     8,  -334,  -101,     7,   -68,   293,  -334,
-    -334,   119,     0,  -334,  -334,  -334,  -334,   -97,  -123,    76,
-      -6,  -208,   -40,  -206,  -328,   -83,  -334,  -334,   -94,  -333,
-    -334,  -334,   -86,    25,   -38,  -334,  -334,  -334,  -334,  -334,
-     -60,  -334,  -334,  -334,  -334,  -334,  -334,  -334,  -334,  -334,
-     253,  -334,  -334
+    -344,  -344,  -344,  -344,  -344,  -344,  -344,    48,  -344,  -344,
+    -344,  -344,    70,  -344,   -56,   -49,  -123,   -53,    28,    29,
+      27,    32,    30,    33,  -344,  -110,  -128,  -344,  -138,  -119,
+    -344,    11,    17,  -344,  -344,  -344,   168,   201,   197,   176,
+    -344,  -344,  -326,     7,  -344,  -105,    13,   -69,   294,  -344,
+    -344,   117,     0,  -344,  -344,  -344,  -344,  -103,  -121,    76,
+     -10,  -215,   -40,  -203,  -314,   -86,  -344,  -344,   -97,  -343,
+    -344,  -344,   -87,    23,   -36,  -344,  -344,  -344,  -344,  -344,
+     -60,  -344,  -344,  -344,  -344,  -344,  -344,  -344,  -344,  -344,
+     232,  -344,  -344
 };
 
   /* YYDEFGOTO[NTERM-NUM].  */
 static const yytype_int16 yydefgoto[] =
 {
-      -1,   152,   153,   154,   314,   155,   156,   157,   158,   159,
-     160,   161,   198,   163,   164,   165,   166,   167,   168,   169,
-     170,   171,   172,   173,   174,   199,   200,   296,   201,   176,
-     107,   202,   203,    62,    63,    64,   124,    98,    99,   125,
-      65,    66,    67,    68,   100,    69,    70,    71,    72,    73,
-     119,   120,   177,    75,    76,   179,   117,   136,   137,   227,
-     228,   224,   205,   206,   207,   208,   284,   377,   404,   341,
-     342,   343,   405,   209,   210,   211,   390,   212,   391,   213,
-     376,   214,   349,   273,   344,   370,   387,   388,   215,    77,
-      78,    79,    91
+      -1,   153,   154,   155,   315,   156,   157,   158,   159,   160,
+     161,   162,   199,   164,   165,   166,   167,   168,   169,   170,
+     171,   172,   173,   174,   175,   200,   201,   297,   202,   177,
+     108,   203,   204,    63,    64,    65,   125,    99,   100,   126,
+      66,    67,    68,    69,   101,    70,    71,    72,    73,    74,
+     120,   121,   178,    76,    77,   180,   118,   137,   138,   228,
+     229,   225,   206,   207,   208,   209,   285,   378,   405,   342,
+     343,   344,   406,   210,   211,   212,   391,   213,   392,   214,
+     377,   215,   350,   274,   345,   371,   388,   389,   216,    78,
+      79,    80,    92
 };
 
   /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM.  If
@@ -962,461 +962,454 @@
      number is the opposite.  If YYTABLE_NINF, syntax error.  */
 static const yytype_int16 yytable[] =
 {
-      74,   108,   233,   300,   223,   122,   134,   175,    83,    82,
-      94,   222,   304,   230,    60,   367,   134,    61,   311,     7,
-     180,   361,    89,   263,   374,   129,   175,   130,    87,   362,
-     219,   126,    92,   242,   131,   134,    90,   220,   389,   135,
-      93,    95,    96,    97,   103,   374,   278,   250,   251,   135,
-      27,    28,   101,    29,    80,   102,   312,   230,   264,   126,
-      88,    37,    38,    39,   182,   403,   225,   410,   135,    74,
-     183,   403,   109,   280,   248,   104,   249,    74,   134,   134,
-     110,   239,   266,   111,   115,   118,    81,   240,   175,   114,
-     313,    60,   315,   223,    61,   371,   297,   356,   128,    74,
-     303,   297,   252,   253,   234,   235,   -94,    74,   372,    85,
-      86,   135,   135,   319,   297,   175,     7,    74,   407,   116,
-     339,   204,     7,   297,   297,   236,   298,    74,   121,   237,
-      94,   345,   256,   257,    74,   347,    74,   254,   255,   309,
-      83,    82,   310,   230,   300,   132,   379,    27,    28,   381,
-      29,    80,   297,    27,    28,   346,    29,   181,    37,    38,
-      39,    95,    96,    97,    37,   134,   268,   269,   309,   351,
-     352,   358,   395,     2,     3,     4,   178,   162,   223,    74,
-      74,   216,   353,   297,   364,   327,   328,   329,   330,   359,
-      95,    96,    97,   226,   411,   -27,   162,   175,   135,   245,
-     246,   247,   323,   324,   175,   373,   325,   326,   238,   204,
-     231,   232,   285,   286,   287,   288,   289,   290,   291,   292,
-     293,   294,   331,   332,   243,   258,   373,   223,   260,   244,
-     223,   295,   261,   259,   265,   262,   271,   384,   272,   274,
-     275,   397,   383,   276,   279,   281,   283,   282,   375,   -26,
-     301,   305,   308,   223,   408,   306,   366,   175,   162,   -21,
-    -231,   348,   355,   363,   354,   -28,    74,   365,   385,   375,
-     357,   297,   378,   382,   392,   223,   380,   393,   396,   394,
-     399,   398,   400,   318,   204,   162,   195,   402,   333,   335,
-     406,   412,   334,   336,   338,   217,   337,   123,    84,   127,
-     218,   307,   270,   360,   368,   409,   369,   108,   401,   350,
-     386,   320,   321,   322,   162,   162,   162,   162,   162,   162,
-     162,   162,   162,   162,   162,   162,   162,   162,   162,   162,
-     113,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   204,   204,     0,     0,     0,     0,   204,
-     204,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   162,     0,     0,
-     204,     0,     0,     0,   162,    74,     0,     0,     0,     0,
+      75,   109,   176,   135,   224,   123,   305,   301,    83,   234,
+      95,    61,   223,   135,    84,   181,   231,    62,   312,    95,
+      90,   176,   102,     7,   375,   103,   253,   254,   264,   390,
+     368,   127,   135,   243,   298,    88,   362,   299,   130,   136,
+     131,    96,    97,    98,   363,   375,    91,   132,    93,   136,
+      96,    97,    98,   279,    27,    28,   313,    29,   411,   127,
+     231,   255,   256,   265,   220,    37,   226,    89,   136,   179,
+      75,   221,    94,   110,   281,   135,   135,   267,    75,   249,
+     404,   250,   105,   176,   183,   116,   404,   111,   240,    61,
+     184,   357,   314,   224,   241,    62,   115,   372,   298,   316,
+      75,   304,   310,   298,   298,   311,   -94,   347,    75,   373,
+     176,   136,   136,   320,   408,   298,   310,   104,    75,   359,
+     298,   112,   205,   119,   235,   236,   117,   340,    75,     7,
+     328,   329,   330,   331,   122,    75,   129,    75,   346,   133,
+     380,    83,   348,   382,   217,   237,   231,    84,   301,   238,
+       2,     3,     4,    96,    97,    98,   246,   247,   248,   182,
+      27,    28,   135,    29,    81,   227,   396,    86,    87,   352,
+     353,    37,    38,    39,   251,   252,   257,   258,   224,   239,
+      75,    75,   163,   354,   269,   270,   298,   365,   412,   -27,
+     360,   259,   176,   324,   325,   261,    82,     7,   136,   176,
+     244,   163,   326,   327,   332,   333,   260,   262,   263,   266,
+     205,   272,   374,   273,   275,   232,   233,   286,   287,   288,
+     289,   290,   291,   292,   293,   294,   295,   224,    27,    28,
+     224,    29,    81,   374,   245,   276,   296,   385,   277,    37,
+      38,    39,   280,   384,   282,   376,   283,   -26,   398,   284,
+     302,   309,   176,   224,   306,   307,   367,   -21,  -232,   349,
+     356,   409,   355,   163,   358,   364,   376,    75,   298,   -28,
+     366,   379,   381,   383,   386,   224,   393,   394,   395,   400,
+     397,   399,   401,   196,   403,   205,   319,   334,   336,   335,
+     163,   407,   413,   338,   337,   124,   218,   339,   128,    85,
+     361,   271,   308,   410,   219,   369,   402,   109,   351,   370,
+     114,   387,     0,     0,     0,     0,   321,   322,   323,   163,
+     163,   163,   163,   163,   163,   163,   163,   163,   163,   163,
+     163,   163,   163,   163,   163,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   205,   205,     0,     0,     0,     0,
+     205,   205,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   204,     0,     0,     0,     0,     0,   204,
+       0,   205,   163,     0,     0,     0,    75,     0,     0,   163,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     1,     2,     3,     4,     5,     6,     7,
-       8,     9,    10,    11,   184,   185,   186,   162,   187,   188,
-     189,   190,   191,   192,   193,    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,   194,    42,    43,    44,
-       0,    45,    46,    47,    48,    49,    50,    51,    52,    53,
-      54,     0,    55,    56,    57,    58,   138,    59,   139,   140,
-     141,   142,   143,     0,     0,   144,   145,     0,     0,     0,
+       0,     0,     0,     0,   205,     0,     0,     0,     0,     0,
+     205,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     1,     2,
+       3,     4,     5,     6,     7,     8,     9,    10,    11,   185,
+     186,   187,   163,   188,   189,   190,   191,   192,   193,   194,
+      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,   195,    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,   144,     0,     0,
+     145,   146,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   147,
+       0,     0,     0,   196,   197,     0,     0,     0,     0,   198,
+     149,   150,   151,   152,     1,     2,     3,     4,     5,     6,
+       7,     8,     9,    10,    11,   185,   186,   187,     0,   188,
+     189,   190,   191,   192,   193,   194,    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,   195,    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,   144,     0,     0,   145,   146,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   146,     0,     0,     0,   195,   196,
-       0,     0,     0,     0,   197,   148,   149,   150,   151,     1,
-       2,     3,     4,     5,     6,     7,     8,     9,    10,    11,
-     184,   185,   186,     0,   187,   188,   189,   190,   191,   192,
-     193,    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,   194,    42,    43,    44,     0,    45,    46,    47,
-      48,    49,    50,    51,    52,    53,    54,     0,    55,    56,
-      57,    58,   138,    59,   139,   140,   141,   142,   143,     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,   195,   299,     0,     0,     0,     0,
-     197,   148,   149,   150,   151,     1,     2,     3,     4,     5,
-       6,     7,     8,     9,    10,    11,   184,   185,   186,     0,
-     187,   188,   189,   190,   191,   192,   193,    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,   194,    42,
-      43,    44,     0,    45,    46,    47,    48,    49,    50,    51,
-      52,    53,    54,     0,    55,    56,    57,    58,   138,    59,
-     139,   140,   141,   142,   143,     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,
-     195,     0,     0,     0,     0,     0,   197,   148,   149,   150,
-     151,     1,     2,     3,     4,     5,     6,     7,     8,     9,
-      10,    11,   184,   185,   186,     0,   187,   188,   189,   190,
-     191,   192,   193,    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,   194,    42,    43,    44,     0,    45,
-      46,    47,    48,    49,    50,    51,    52,    53,    54,     0,
-      55,    56,    57,    58,   138,    59,   139,   140,   141,   142,
-     143,     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,   121,     0,     0,     0,
-       0,     0,   197,   148,   149,   150,   151,     1,     2,     3,
-       4,     5,     6,     7,     8,     9,    10,    11,   184,   185,
-     186,     0,   187,   188,   189,   190,   191,   192,   193,    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,
-     194,    42,    43,    44,     0,    45,    46,    47,    48,    49,
-      50,    51,    52,    53,    54,     0,    55,    56,    57,    58,
-     138,    59,   139,   140,   141,   142,   143,     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,   197,   148,
-     149,   150,   151,     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,
-       0,    45,    46,    47,    48,    49,    50,    51,    52,    53,
-      54,     0,    55,    56,    57,    58,   138,    59,   139,   140,
-     141,   142,   143,     0,     0,   144,   145,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     133,     2,     3,     4,   146,     6,     7,     8,     9,    10,
-      11,     0,     0,     0,   197,   148,   149,   150,   151,     0,
-       0,     0,    12,    13,    14,    15,    16,    17,    18,    19,
+       0,     0,     0,     0,     0,   147,     0,     0,     0,   196,
+     300,     0,     0,     0,     0,   198,   149,   150,   151,   152,
+       1,     2,     3,     4,     5,     6,     7,     8,     9,    10,
+      11,   185,   186,   187,     0,   188,   189,   190,   191,   192,
+     193,   194,    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,     0,    45,    46,
-      47,    48,    49,    50,    51,    52,    53,    54,     0,    55,
-      56,    57,    58,   138,    59,   139,   140,   141,   142,   143,
-       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,   148,   149,   150,   151,     0,    12,    13,    14,
+      39,    40,    41,   195,    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,   144,
+       0,     0,   145,   146,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   147,     0,     0,     0,   196,     0,     0,     0,     0,
+       0,   198,   149,   150,   151,   152,     1,     2,     3,     4,
+       5,     6,     7,     8,     9,    10,    11,   185,   186,   187,
+       0,   188,   189,   190,   191,   192,   193,   194,    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,   195,
+      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,   144,     0,     0,   145,   146,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   147,     0,     0,
+       0,   122,     0,     0,     0,     0,     0,   198,   149,   150,
+     151,   152,     1,     2,     3,     4,     5,     6,     7,     8,
+       9,    10,    11,   185,   186,   187,     0,   188,   189,   190,
+     191,   192,   193,   194,    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,   195,    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,   144,     0,     0,   145,   146,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   147,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   198,   149,   150,   151,   152,     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,   144,     0,     0,
+     145,   146,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   134,     2,     3,     4,   147,
+       6,     7,     8,     9,    10,    11,     0,     0,     0,   198,
+     149,   150,   151,   152,     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,     0,    45,    46,    47,    48,    49,    50,    51,
-      52,    53,    54,     0,    55,    56,    57,     0,   105,    59,
-       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,   106,    31,    32,    33,
-      34,    35,    36,     0,     0,     0,    40,    41,     0,    42,
-      43,    44,     0,    45,    46,    47,    48,    49,    50,    51,
-      52,    53,    54,     0,    55,    56,    57,     0,   138,    59,
-     139,   140,   141,   142,   143,     0,     0,   144,   145,     0,
+      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,   144,     0,     0,   145,   146,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   146,     0,     0,   147,
-       8,     9,    10,    11,     0,     0,     0,   148,   149,   150,
-     151,     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,
-       0,    45,    46,    47,    48,    49,    50,    51,    52,    53,
-      54,     0,    55,    56,    57,     0,   138,    59,   139,   140,
-     141,   142,   143,     0,     0,   144,   145,     0,     0,     0,
+       0,     2,     3,     4,     0,     0,   147,     8,     9,    10,
+      11,     0,     0,     0,     0,     0,     0,   149,   150,   151,
+     152,     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,   106,    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,   107,    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,   144,
+       0,     0,   145,   146,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   146,     0,     0,   221,     8,     9,
-      10,    11,     0,     0,     0,   148,   149,   150,   151,     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,     0,    45,
-      46,    47,    48,    49,    50,    51,    52,    53,    54,     0,
-      55,    56,    57,     0,   138,    59,   139,   140,   141,   142,
-     143,     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,   277,   148,   149,   150,   151,     0,    12,    13,
+       0,   147,     0,     0,   148,     8,     9,    10,    11,     0,
+       0,     0,   149,   150,   151,   152,     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,   144,     0,     0,
+     145,   146,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   147,
+       0,     0,   222,     8,     9,    10,    11,     0,     0,     0,
+     149,   150,   151,   152,     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,     0,    45,    46,    47,    48,    49,    50,
-      51,    52,    53,    54,     0,    55,    56,    57,     0,   138,
-      59,   139,   140,   141,   142,   143,     0,     0,   144,   145,
+      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,   144,     0,     0,   145,   146,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   146,     0,     0,
-     302,     8,     9,    10,    11,     0,     0,     0,   148,   149,
-     150,   151,     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,     0,    45,    46,    47,    48,    49,    50,    51,    52,
-      53,    54,     0,    55,    56,    57,     0,   138,    59,   139,
-     140,   141,   142,   143,     0,     0,   144,   145,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   147,     8,     9,
+      10,    11,     0,     0,     0,     0,     0,   278,   149,   150,
+     151,   152,     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,
+     144,     0,     0,   145,   146,     0,     0,     0,     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,   148,   149,   150,   151,
+       0,     0,   147,     0,     0,   303,     8,     9,    10,    11,
+       0,     0,     0,   149,   150,   151,   152,     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,   241,     0,    42,    43,    44,     0,    45,    46,    47,
-      48,    49,    50,    51,    52,    53,    54,     0,    55,    56,
-      57,     0,   138,    59,   139,   140,   141,   142,   143,     0,
-       0,   144,   145,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   133,     2,     3,     4,
-     146,     6,     7,     8,     9,    10,    11,     0,     0,     0,
-       0,   148,   149,   150,   151,     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,     0,    45,    46,    47,    48,    49,    50,
-      51,    52,    53,    54,     0,    55,    56,    57,    58,     0,
-      59,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   133,     2,     3,     4,     0,     6,     7,     8,     9,
-      10,    11,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   229,    12,    13,    14,    15,    16,    17,    18,
+      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,   144,     0,
+       0,   145,   146,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     147,     8,     9,    10,    11,     0,     0,     0,     0,     0,
+       0,   149,   150,   151,   152,     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,   242,     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,   144,     0,     0,   145,   146,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   134,     2,     3,     4,   147,     6,     7,     8,     9,
+      10,    11,     0,     0,     0,     0,   149,   150,   151,   152,
+       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,     0,    45,
-      46,    47,    48,    49,    50,    51,    52,    53,    54,     0,
-      55,    56,    57,    58,     0,    59,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   133,     2,     3,     4,
+      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,   267,    12,    13,
+       0,     0,     0,     0,     0,     0,     0,   230,    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,     0,    45,    46,    47,    48,    49,    50,
-      51,    52,    53,    54,     0,    55,    56,    57,    58,     0,
-      59,     0,     0,     0,     0,     0,     0,     0,   112,     0,
-       0,     1,     2,     3,     4,     5,     6,     7,     8,     9,
+      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,   340,    12,    13,    14,    15,    16,    17,    18,
+       0,     0,   268,    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,     0,    45,
-      46,    47,    48,    49,    50,    51,    52,    53,    54,     0,
-      55,    56,    57,    58,     0,    59,     1,     2,     3,     4,
+      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,   113,     0,     0,     1,     2,     3,     4,
        5,     6,     7,     8,     9,    10,    11,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   341,    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,     0,    45,    46,    47,    48,    49,    50,
-      51,    52,    53,    54,     0,    55,    56,    57,    58,     0,
-      59,   133,     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,     0,    45,
-      46,    47,    48,    49,    50,    51,    52,    53,    54,     0,
-      55,    56,    57,    58,     0,    59,     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,     0,    45,    46,    47,    48,    49,    50,    51,
-      52,    53,    54,     0,    55,    56,    57,     0,     0,    59,
-       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,
-       0,    45,    46,    47,    48,    49,    50,    51,    52,    53,
-      54,     0,    55,    56,    57,     0,   316,    59,     8,     9,
-      10,    11,   317,     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,     0,    45,
-      46,    47,    48,    49,    50,    51,    52,    53,    54,     0,
-      55,    56,    57,     0,     0,    59
+      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,   317,    60,     8,     9,    10,    11,   318,     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,    69,   146,   209,   131,    91,   107,   111,     1,     1,
-       9,   130,   220,   136,     0,   343,   117,     0,    76,     9,
-     117,   106,   104,    92,   349,   104,   130,   106,    76,   114,
-     106,    99,   105,   160,   113,   136,   114,   113,   371,   107,
-     111,    40,    41,    42,    76,   370,   190,    83,    84,   117,
-      40,    41,   111,    43,    44,   114,   114,   180,   127,   127,
-     108,    51,    52,    53,   105,   393,   134,   400,   136,    69,
-     111,   399,    72,   192,   116,    68,   118,    77,   179,   180,
-      73,   105,   179,   106,    84,    76,    76,   111,   192,    82,
-     105,    77,   236,   220,    77,   105,   111,   305,    76,    99,
-     219,   111,    87,    88,    85,    86,   105,   107,   105,    40,
-      41,   179,   180,   240,   111,   219,     9,   117,   105,   108,
-     264,   121,     9,   111,   111,   106,   114,   127,   108,   110,
-       9,   275,    89,    90,   134,   279,   136,   122,   123,   111,
-     133,   133,   114,   266,   350,   108,   354,    40,    41,   357,
-      43,    44,   111,    40,    41,   114,    43,   113,    51,    52,
-      53,    40,    41,    42,    51,   266,    79,    80,   111,   296,
-     297,   114,   380,     4,     5,     6,   114,   111,   305,   179,
-     180,    76,   301,   111,   112,   252,   253,   254,   255,   308,
-      40,    41,    42,    76,   402,   104,   130,   301,   266,   119,
-     120,   121,   248,   249,   308,   349,   250,   251,   105,   209,
-     144,   145,    94,    95,    96,    97,    98,    99,   100,   101,
-     102,   103,   256,   257,   104,   126,   370,   354,   124,   163,
-     357,   113,    91,   125,   107,    93,   114,   364,   114,   104,
-     104,   385,   361,   114,   104,   112,   109,   104,   349,   104,
-     106,   113,   106,   380,   398,   107,   342,   361,   192,   105,
-     108,   112,   107,   107,   113,   104,   266,    56,   104,   370,
-     113,   111,   107,   107,    76,   402,   113,   105,   107,   109,
-     105,   114,    17,   237,   284,   219,   108,   113,   258,   260,
-     114,   114,   259,   261,   263,   127,   262,    93,     5,   100,
-     127,   225,   183,   309,   344,   399,   344,   375,   391,   284,
-     370,   245,   246,   247,   248,   249,   250,   251,   252,   253,
-     254,   255,   256,   257,   258,   259,   260,   261,   262,   263,
-      77,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   343,   344,    -1,    -1,    -1,    -1,   349,
-     350,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   301,    -1,    -1,
-     370,    -1,    -1,    -1,   308,   375,    -1,    -1,    -1,    -1,
+       0,    70,   112,   108,   132,    92,   221,   210,     1,   147,
+       9,     0,   131,   118,     1,   118,   137,     0,    76,     9,
+     104,   131,   111,     9,   350,   114,    87,    88,    92,   372,
+     344,   100,   137,   161,   111,    76,   106,   114,   104,   108,
+     106,    40,    41,    42,   114,   371,   114,   113,   105,   118,
+      40,    41,    42,   191,    40,    41,   114,    43,   401,   128,
+     181,   122,   123,   127,   106,    51,   135,   108,   137,   114,
+      70,   113,   111,    73,   193,   180,   181,   180,    78,   116,
+     394,   118,    69,   193,   105,    85,   400,    74,   105,    78,
+     111,   306,   105,   221,   111,    78,    83,   105,   111,   237,
+     100,   220,   111,   111,   111,   114,   105,   114,   108,   105,
+     220,   180,   181,   241,   105,   111,   111,    76,   118,   114,
+     111,   106,   122,    76,    85,    86,   108,   265,   128,     9,
+     253,   254,   255,   256,   108,   135,    76,   137,   276,   108,
+     355,   134,   280,   358,    76,   106,   267,   134,   351,   110,
+       4,     5,     6,    40,    41,    42,   119,   120,   121,   113,
+      40,    41,   267,    43,    44,    76,   381,    40,    41,   297,
+     298,    51,    52,    53,    83,    84,    89,    90,   306,   105,
+     180,   181,   112,   302,    79,    80,   111,   112,   403,   104,
+     309,   126,   302,   249,   250,   124,    76,     9,   267,   309,
+     104,   131,   251,   252,   257,   258,   125,    91,    93,   107,
+     210,   114,   350,   114,   104,   145,   146,    94,    95,    96,
+      97,    98,    99,   100,   101,   102,   103,   355,    40,    41,
+     358,    43,    44,   371,   164,   104,   113,   365,   114,    51,
+      52,    53,   104,   362,   112,   350,   104,   104,   386,   109,
+     106,   106,   362,   381,   113,   107,   343,   105,   108,   112,
+     107,   399,   113,   193,   113,   107,   371,   267,   111,   104,
+      56,   107,   113,   107,   104,   403,    76,   105,   109,   105,
+     107,   114,    17,   108,   113,   285,   238,   259,   261,   260,
+     220,   114,   114,   263,   262,    94,   128,   264,   101,     5,
+     310,   184,   226,   400,   128,   345,   392,   376,   285,   345,
+      78,   371,    -1,    -1,    -1,    -1,   246,   247,   248,   249,
+     250,   251,   252,   253,   254,   255,   256,   257,   258,   259,
+     260,   261,   262,   263,   264,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   344,   345,    -1,    -1,    -1,    -1,
+     350,   351,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   393,    -1,    -1,    -1,    -1,    -1,   399,
+      -1,   371,   302,    -1,    -1,    -1,   376,    -1,    -1,   309,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,     3,     4,     5,     6,     7,     8,     9,
-      10,    11,    12,    13,    14,    15,    16,   361,    18,    19,
-      20,    21,    22,    23,    24,    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,
-      -1,    61,    62,    63,    64,    65,    66,    67,    68,    69,
-      70,    -1,    72,    73,    74,    75,    76,    77,    78,    79,
-      80,    81,    82,    -1,    -1,    85,    86,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   394,    -1,    -1,    -1,    -1,    -1,
+     400,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,     3,     4,
+       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
+      15,    16,   362,    18,    19,    20,    21,    22,    23,    24,
+      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,    82,    -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,   117,   118,     3,     4,     5,     6,     7,     8,
+       9,    10,    11,    12,    13,    14,    15,    16,    -1,    18,
+      19,    20,    21,    22,    23,    24,    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,    82,    -1,    -1,    85,    86,    -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,   117,   118,     3,
-       4,     5,     6,     7,     8,     9,    10,    11,    12,    13,
-      14,    15,    16,    -1,    18,    19,    20,    21,    22,    23,
-      24,    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,    -1,    61,    62,    63,
-      64,    65,    66,    67,    68,    69,    70,    -1,    72,    73,
-      74,    75,    76,    77,    78,    79,    80,    81,    82,    -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,   117,   118,     3,     4,     5,     6,     7,
-       8,     9,    10,    11,    12,    13,    14,    15,    16,    -1,
-      18,    19,    20,    21,    22,    23,    24,    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,    -1,    61,    62,    63,    64,    65,    66,    67,
-      68,    69,    70,    -1,    72,    73,    74,    75,    76,    77,
-      78,    79,    80,    81,    82,    -1,    -1,    85,    86,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   104,    -1,    -1,    -1,
-     108,    -1,    -1,    -1,    -1,    -1,   114,   115,   116,   117,
-     118,     3,     4,     5,     6,     7,     8,     9,    10,    11,
-      12,    13,    14,    15,    16,    -1,    18,    19,    20,    21,
-      22,    23,    24,    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,    -1,    61,
-      62,    63,    64,    65,    66,    67,    68,    69,    70,    -1,
-      72,    73,    74,    75,    76,    77,    78,    79,    80,    81,
-      82,    -1,    -1,    85,    86,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   104,    -1,    -1,    -1,   108,    -1,    -1,    -1,
-      -1,    -1,   114,   115,   116,   117,   118,     3,     4,     5,
-       6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
-      16,    -1,    18,    19,    20,    21,    22,    23,    24,    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,    -1,    61,    62,    63,    64,    65,
-      66,    67,    68,    69,    70,    -1,    72,    73,    74,    75,
-      76,    77,    78,    79,    80,    81,    82,    -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,   117,   118,     3,     4,     5,     6,     7,     8,     9,
-      10,    11,    12,    13,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    25,    26,    27,    28,    29,
-      30,    31,    32,    33,    34,    35,    36,    37,    38,    39,
-      40,    41,    -1,    43,    44,    45,    46,    47,    48,    49,
-      50,    51,    52,    53,    54,    55,    -1,    57,    58,    59,
-      -1,    61,    62,    63,    64,    65,    66,    67,    68,    69,
-      70,    -1,    72,    73,    74,    75,    76,    77,    78,    79,
-      80,    81,    82,    -1,    -1,    85,    86,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-       3,     4,     5,     6,   104,     8,     9,    10,    11,    12,
-      13,    -1,    -1,    -1,   114,   115,   116,   117,   118,    -1,
-      -1,    -1,    25,    26,    27,    28,    29,    30,    31,    32,
+      -1,    -1,    -1,    -1,    -1,   104,    -1,    -1,    -1,   108,
+     109,    -1,    -1,    -1,    -1,   114,   115,   116,   117,   118,
+       3,     4,     5,     6,     7,     8,     9,    10,    11,    12,
+      13,    14,    15,    16,    -1,    18,    19,    20,    21,    22,
+      23,    24,    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,    -1,    61,    62,
+      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,    82,
       -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,   117,   118,    -1,    25,    26,    27,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   104,    -1,    -1,    -1,   108,    -1,    -1,    -1,    -1,
+      -1,   114,   115,   116,   117,   118,     3,     4,     5,     6,
+       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
+      -1,    18,    19,    20,    21,    22,    23,    24,    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,    82,    -1,    -1,    85,    86,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   104,    -1,    -1,
+      -1,   108,    -1,    -1,    -1,    -1,    -1,   114,   115,   116,
+     117,   118,     3,     4,     5,     6,     7,     8,     9,    10,
+      11,    12,    13,    14,    15,    16,    -1,    18,    19,    20,
+      21,    22,    23,    24,    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,    82,    -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,   117,   118,     3,     4,
+       5,     6,     7,     8,     9,    10,    11,    12,    13,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
+      35,    36,    37,    38,    39,    40,    41,    -1,    43,    44,
+      45,    46,    47,    48,    49,    50,    51,    52,    53,    54,
+      55,    -1,    57,    58,    59,    60,    61,    62,    63,    64,
+      65,    66,    67,    68,    69,    70,    -1,    72,    73,    74,
+      75,    76,    77,    78,    79,    80,    81,    82,    -1,    -1,
+      85,    86,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,     3,     4,     5,     6,   104,
+       8,     9,    10,    11,    12,    13,    -1,    -1,    -1,   114,
+     115,   116,   117,   118,    -1,    -1,    -1,    25,    26,    27,
       28,    29,    30,    31,    32,    33,    34,    35,    36,    37,
-      38,    39,    -1,    -1,    -1,    -1,    -1,    45,    46,    47,
-      48,    49,    50,    -1,    -1,    -1,    54,    55,    -1,    57,
-      58,    59,    -1,    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,    -1,    61,    62,    63,    64,    65,    66,    67,
-      68,    69,    70,    -1,    72,    73,    74,    -1,    76,    77,
+      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,    82,    -1,    -1,    85,    86,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   104,    -1,    -1,   107,
-      10,    11,    12,    13,    -1,    -1,    -1,   115,   116,   117,
-     118,    -1,    -1,    -1,    -1,    25,    26,    27,    28,    29,
-      30,    31,    32,    33,    34,    35,    36,    37,    38,    39,
-      -1,    -1,    -1,    -1,    -1,    45,    46,    47,    48,    49,
-      50,    -1,    -1,    -1,    54,    55,    -1,    57,    58,    59,
-      -1,    61,    62,    63,    64,    65,    66,    67,    68,    69,
-      70,    -1,    72,    73,    74,    -1,    76,    77,    78,    79,
-      80,    81,    82,    -1,    -1,    85,    86,    -1,    -1,    -1,
+      -1,     4,     5,     6,    -1,    -1,   104,    10,    11,    12,
+      13,    -1,    -1,    -1,    -1,    -1,    -1,   115,   116,   117,
+     118,    -1,    25,    26,    27,    28,    29,    30,    31,    32,
+      33,    34,    35,    36,    37,    38,    39,    -1,    -1,    -1,
+      -1,    -1,    45,    46,    47,    48,    49,    50,    -1,    -1,
+      -1,    54,    55,    -1,    57,    58,    59,    60,    61,    62,
+      63,    64,    65,    66,    67,    68,    69,    70,    -1,    72,
+      73,    74,    -1,    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,    82,
+      -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,   107,    10,    11,
-      12,    13,    -1,    -1,    -1,   115,   116,   117,   118,    -1,
-      -1,    -1,    -1,    25,    26,    27,    28,    29,    30,    31,
+      -1,   104,    -1,    -1,   107,    10,    11,    12,    13,    -1,
+      -1,    -1,   115,   116,   117,   118,    -1,    -1,    -1,    -1,
+      25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
+      35,    36,    37,    38,    39,    -1,    -1,    -1,    -1,    -1,
+      45,    46,    47,    48,    49,    50,    -1,    -1,    -1,    54,
+      55,    -1,    57,    58,    59,    60,    61,    62,    63,    64,
+      65,    66,    67,    68,    69,    70,    -1,    72,    73,    74,
+      -1,    76,    77,    78,    79,    80,    81,    82,    -1,    -1,
+      85,    86,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   104,
+      -1,    -1,   107,    10,    11,    12,    13,    -1,    -1,    -1,
+     115,   116,   117,   118,    -1,    -1,    -1,    -1,    25,    26,
+      27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
+      37,    38,    39,    -1,    -1,    -1,    -1,    -1,    45,    46,
+      47,    48,    49,    50,    -1,    -1,    -1,    54,    55,    -1,
+      57,    58,    59,    60,    61,    62,    63,    64,    65,    66,
+      67,    68,    69,    70,    -1,    72,    73,    74,    -1,    76,
+      77,    78,    79,    80,    81,    82,    -1,    -1,    85,    86,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   104,    10,    11,
+      12,    13,    -1,    -1,    -1,    -1,    -1,   114,   115,   116,
+     117,   118,    -1,    25,    26,    27,    28,    29,    30,    31,
       32,    33,    34,    35,    36,    37,    38,    39,    -1,    -1,
       -1,    -1,    -1,    45,    46,    47,    48,    49,    50,    -1,
-      -1,    -1,    54,    55,    -1,    57,    58,    59,    -1,    61,
+      -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,
       82,    -1,    -1,    85,    86,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   104,    10,    11,    12,    13,    -1,    -1,    -1,
-      -1,    -1,   114,   115,   116,   117,   118,    -1,    25,    26,
-      27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
-      37,    38,    39,    -1,    -1,    -1,    -1,    -1,    45,    46,
-      47,    48,    49,    50,    -1,    -1,    -1,    54,    55,    -1,
-      57,    58,    59,    -1,    61,    62,    63,    64,    65,    66,
-      67,    68,    69,    70,    -1,    72,    73,    74,    -1,    76,
-      77,    78,    79,    80,    81,    82,    -1,    -1,    85,    86,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   104,    -1,    -1,
-     107,    10,    11,    12,    13,    -1,    -1,    -1,   115,   116,
-     117,   118,    -1,    -1,    -1,    -1,    25,    26,    27,    28,
-      29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
-      39,    -1,    -1,    -1,    -1,    -1,    45,    46,    47,    48,
-      49,    50,    -1,    -1,    -1,    54,    55,    -1,    57,    58,
-      59,    -1,    61,    62,    63,    64,    65,    66,    67,    68,
-      69,    70,    -1,    72,    73,    74,    -1,    76,    77,    78,
-      79,    80,    81,    82,    -1,    -1,    85,    86,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   104,    10,    11,    12,    13,
-      -1,    -1,    -1,    -1,    -1,    -1,   115,   116,   117,   118,
+      -1,    -1,   104,    -1,    -1,   107,    10,    11,    12,    13,
+      -1,    -1,    -1,   115,   116,   117,   118,    -1,    -1,    -1,
       -1,    25,    26,    27,    28,    29,    30,    31,    32,    33,
       34,    35,    36,    37,    38,    39,    -1,    -1,    -1,    -1,
       -1,    45,    46,    47,    48,    49,    50,    -1,    -1,    -1,
-      54,    55,    -1,    57,    58,    59,    -1,    61,    62,    63,
+      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,    82,    -1,
       -1,    85,    86,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,     3,     4,     5,     6,
-     104,     8,     9,    10,    11,    12,    13,    -1,    -1,    -1,
-      -1,   115,   116,   117,   118,    -1,    -1,    -1,    25,    26,
-      27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
-      37,    38,    39,    40,    41,    -1,    43,    44,    45,    46,
-      47,    48,    49,    50,    51,    52,    53,    54,    55,    -1,
-      57,    58,    59,    -1,    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,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     104,    10,    11,    12,    13,    -1,    -1,    -1,    -1,    -1,
+      -1,   115,   116,   117,   118,    -1,    25,    26,    27,    28,
+      29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
+      39,    -1,    -1,    -1,    -1,    -1,    45,    46,    47,    48,
+      49,    50,    -1,    -1,    -1,    54,    55,    -1,    57,    58,
+      59,    60,    61,    62,    63,    64,    65,    66,    67,    68,
+      69,    70,    -1,    72,    73,    74,    -1,    76,    77,    78,
+      79,    80,    81,    82,    -1,    -1,    85,    86,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,     3,     4,     5,     6,   104,     8,     9,    10,    11,
+      12,    13,    -1,    -1,    -1,    -1,   115,   116,   117,   118,
+      -1,    -1,    -1,    25,    26,    27,    28,    29,    30,    31,
       32,    33,    34,    35,    36,    37,    38,    39,    40,    41,
       -1,    43,    44,    45,    46,    47,    48,    49,    50,    51,
-      52,    53,    54,    55,    -1,    57,    58,    59,    -1,    61,
+      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,
@@ -1425,53 +1418,62 @@
       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,    -1,    61,    62,    63,    64,    65,    66,
+      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,
+      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,    -1,    61,
+      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,
+      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,    -1,    25,    26,
+      -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,    -1,    61,    62,    63,    64,    65,    66,
+      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,
+      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,    -1,    61,
+      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,    -1,    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,
-      -1,    61,    62,    63,    64,    65,    66,    67,    68,    69,
-      70,    -1,    72,    73,    74,    -1,    76,    77,    10,    11,
-      12,    13,    82,    -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,    -1,    61,
-      62,    63,    64,    65,    66,    67,    68,    69,    70,    -1,
-      72,    73,    74,    -1,    -1,    77
+      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,    82,    -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
@@ -1482,44 +1484,44 @@
       12,    13,    25,    26,    27,    28,    29,    30,    31,    32,
       33,    34,    35,    36,    37,    38,    39,    40,    41,    43,
       44,    45,    46,    47,    48,    49,    50,    51,    52,    53,
-      54,    55,    57,    58,    59,    61,    62,    63,    64,    65,
-      66,    67,    68,    69,    70,    72,    73,    74,    75,    77,
-     159,   160,   161,   162,   163,   168,   169,   170,   171,   173,
-     174,   175,   176,   177,   180,   181,   182,   217,   218,   219,
-      44,    76,   171,   174,   176,    40,    41,    76,   108,   104,
-     114,   220,   105,   111,     9,    40,    41,    42,   165,   166,
-     172,   111,   114,    76,   174,    76,   114,   158,   175,   180,
-     174,   106,     0,   218,   174,   180,   108,   184,    76,   178,
-     179,   108,   200,   165,   164,   167,   175,   166,    76,   104,
-     106,   113,   108,     3,   173,   175,   185,   186,    76,    78,
-      79,    80,    81,    82,    85,    86,   104,   107,   115,   116,
-     117,   118,   129,   130,   131,   133,   134,   135,   136,   137,
-     138,   139,   140,   141,   142,   143,   144,   145,   146,   147,
-     148,   149,   150,   151,   152,   153,   157,   180,   114,   183,
-     185,   113,   105,   111,    14,    15,    16,    18,    19,    20,
-      21,    22,    23,    24,    56,   108,   109,   114,   140,   153,
-     154,   156,   159,   160,   180,   190,   191,   192,   193,   201,
-     202,   203,   205,   207,   209,   216,    76,   164,   167,   106,
-     113,   107,   157,   154,   189,   175,    76,   187,   188,   109,
-     186,   140,   140,   156,    85,    86,   106,   110,   105,   105,
-     111,    55,   154,   104,   140,   119,   120,   121,   116,   118,
-      83,    84,    87,    88,   122,   123,    89,    90,   126,   125,
-     124,    91,    93,    92,   127,   107,   185,   109,    79,    80,
-     179,   114,   114,   211,   104,   104,   114,   114,   156,   104,
-     157,   112,   104,   109,   194,    94,    95,    96,    97,    98,
-      99,   100,   101,   102,   103,   113,   155,   111,   114,   109,
-     191,   106,   107,   157,   189,   113,   107,   187,   106,   111,
-     114,    76,   114,   105,   132,   156,    76,    82,   135,   154,
-     140,   140,   140,   142,   142,   143,   143,   144,   144,   144,
-     144,   145,   145,   146,   147,   148,   149,   150,   151,   156,
-     109,   197,   198,   199,   212,   156,   114,   156,   112,   210,
-     201,   154,   154,   157,   113,   107,   189,   113,   114,   157,
-     188,   106,   114,   107,   112,    56,   200,   192,   190,   202,
-     213,   105,   105,   156,   170,   173,   208,   195,   107,   189,
-     113,   189,   107,   157,   154,   104,   208,   214,   215,   197,
-     204,   206,    76,   105,   109,   189,   107,   156,   114,   105,
-      17,   193,   113,   192,   196,   200,   114,   105,   156,   196,
-     197,   189,   114
+      54,    55,    57,    58,    59,    60,    61,    62,    63,    64,
+      65,    66,    67,    68,    69,    70,    72,    73,    74,    75,
+      77,   159,   160,   161,   162,   163,   168,   169,   170,   171,
+     173,   174,   175,   176,   177,   180,   181,   182,   217,   218,
+     219,    44,    76,   171,   174,   176,    40,    41,    76,   108,
+     104,   114,   220,   105,   111,     9,    40,    41,    42,   165,
+     166,   172,   111,   114,    76,   174,    76,   114,   158,   175,
+     180,   174,   106,     0,   218,   174,   180,   108,   184,    76,
+     178,   179,   108,   200,   165,   164,   167,   175,   166,    76,
+     104,   106,   113,   108,     3,   173,   175,   185,   186,    76,
+      78,    79,    80,    81,    82,    85,    86,   104,   107,   115,
+     116,   117,   118,   129,   130,   131,   133,   134,   135,   136,
+     137,   138,   139,   140,   141,   142,   143,   144,   145,   146,
+     147,   148,   149,   150,   151,   152,   153,   157,   180,   114,
+     183,   185,   113,   105,   111,    14,    15,    16,    18,    19,
+      20,    21,    22,    23,    24,    56,   108,   109,   114,   140,
+     153,   154,   156,   159,   160,   180,   190,   191,   192,   193,
+     201,   202,   203,   205,   207,   209,   216,    76,   164,   167,
+     106,   113,   107,   157,   154,   189,   175,    76,   187,   188,
+     109,   186,   140,   140,   156,    85,    86,   106,   110,   105,
+     105,   111,    55,   154,   104,   140,   119,   120,   121,   116,
+     118,    83,    84,    87,    88,   122,   123,    89,    90,   126,
+     125,   124,    91,    93,    92,   127,   107,   185,   109,    79,
+      80,   179,   114,   114,   211,   104,   104,   114,   114,   156,
+     104,   157,   112,   104,   109,   194,    94,    95,    96,    97,
+      98,    99,   100,   101,   102,   103,   113,   155,   111,   114,
+     109,   191,   106,   107,   157,   189,   113,   107,   187,   106,
+     111,   114,    76,   114,   105,   132,   156,    76,    82,   135,
+     154,   140,   140,   140,   142,   142,   143,   143,   144,   144,
+     144,   144,   145,   145,   146,   147,   148,   149,   150,   151,
+     156,   109,   197,   198,   199,   212,   156,   114,   156,   112,
+     210,   201,   154,   154,   157,   113,   107,   189,   113,   114,
+     157,   188,   106,   114,   107,   112,    56,   200,   192,   190,
+     202,   213,   105,   105,   156,   170,   173,   208,   195,   107,
+     189,   113,   189,   107,   157,   154,   104,   208,   214,   215,
+     197,   204,   206,    76,   105,   109,   189,   107,   156,   114,
+     105,    17,   193,   113,   192,   196,   200,   114,   105,   156,
+     196,   197,   189,   114
 };
 
   /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
@@ -1545,14 +1547,14 @@
      181,   181,   181,   181,   181,   181,   181,   181,   181,   181,
      181,   181,   181,   181,   181,   181,   181,   181,   181,   181,
      181,   181,   181,   181,   181,   181,   181,   181,   181,   181,
-     181,   181,   183,   182,   184,   182,   185,   185,   186,   186,
-     187,   187,   188,   188,   189,   190,   191,   191,   192,   192,
-     192,   192,   192,   192,   192,   193,   194,   195,   193,   196,
-     196,   198,   197,   199,   197,   200,   200,   201,   201,   202,
-     202,   203,   204,   204,   206,   205,   207,   207,   208,   208,
-     210,   209,   211,   209,   212,   209,   213,   213,   214,   214,
-     215,   215,   216,   216,   216,   216,   216,   217,   217,   218,
-     218,   220,   219
+     181,   181,   181,   183,   182,   184,   182,   185,   185,   186,
+     186,   187,   187,   188,   188,   189,   190,   191,   191,   192,
+     192,   192,   192,   192,   192,   192,   193,   194,   195,   193,
+     196,   196,   198,   197,   199,   197,   200,   200,   201,   201,
+     202,   202,   203,   204,   204,   206,   205,   207,   207,   208,
+     208,   210,   209,   211,   209,   212,   209,   213,   213,   214,
+     214,   215,   215,   216,   216,   216,   216,   216,   217,   217,
+     218,   218,   220,   219
 };
 
   /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN.  */
@@ -1578,14 +1580,14 @@
        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,     1,     1,     2,     0,     0,     5,     1,
-       1,     0,     2,     0,     2,     2,     3,     1,     2,     1,
-       2,     5,     3,     1,     0,     6,     3,     2,     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,     0,     6,     0,     5,     1,     2,     3,
+       4,     1,     3,     1,     4,     1,     1,     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,     0,     6,     3,     2,     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
 };
 
 
@@ -4124,6 +4126,20 @@
   case 187:
 
     {
+        if (!context->supportsExtension("GL_ARB_texture_rectangle")) {
+            context->error((yylsp[0]), "unsupported type", "sampler2DRect", "");
+            context->recover();
+        }
+        FRAG_VERT_ONLY("sampler2DRect", (yylsp[0]));
+        TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
+        (yyval.interm.type).setBasic(EbtSampler2DRect, qual, (yylsp[0]));
+    }
+
+    break;
+
+  case 188:
+
+    {
         FRAG_VERT_ONLY("sampler3D", (yylsp[0]));
         TQualifier qual = context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
         (yyval.interm.type).setBasic(EbtSampler3D, qual, (yylsp[0]));
@@ -4131,7 +4147,7 @@
 
     break;
 
-  case 188:
+  case 189:
 
     {
         FRAG_VERT_ONLY("sampler2DArray", (yylsp[0]));
@@ -4141,7 +4157,7 @@
 
     break;
 
-  case 189:
+  case 190:
 
     {
         FRAG_VERT_ONLY("isampler2D", (yylsp[0]));
@@ -4151,7 +4167,7 @@
 
     break;
 
-  case 190:
+  case 191:
 
     {
         FRAG_VERT_ONLY("isampler3D", (yylsp[0]));
@@ -4161,7 +4177,7 @@
 
     break;
 
-  case 191:
+  case 192:
 
     {
         FRAG_VERT_ONLY("isamplerCube", (yylsp[0]));
@@ -4171,7 +4187,7 @@
 
     break;
 
-  case 192:
+  case 193:
 
     {
         FRAG_VERT_ONLY("isampler2DArray", (yylsp[0]));
@@ -4181,7 +4197,7 @@
 
     break;
 
-  case 193:
+  case 194:
 
     {
         FRAG_VERT_ONLY("usampler2D", (yylsp[0]));
@@ -4191,7 +4207,7 @@
 
     break;
 
-  case 194:
+  case 195:
 
     {
         FRAG_VERT_ONLY("usampler3D", (yylsp[0]));
@@ -4201,7 +4217,7 @@
 
     break;
 
-  case 195:
+  case 196:
 
     {
         FRAG_VERT_ONLY("usamplerCube", (yylsp[0]));
@@ -4211,7 +4227,7 @@
 
     break;
 
-  case 196:
+  case 197:
 
     {
         FRAG_VERT_ONLY("usampler2DArray", (yylsp[0]));
@@ -4221,7 +4237,7 @@
 
     break;
 
-  case 197:
+  case 198:
 
     {
         FRAG_VERT_ONLY("sampler2DShadow", (yylsp[0]));
@@ -4231,7 +4247,7 @@
 
     break;
 
-  case 198:
+  case 199:
 
     {
         FRAG_VERT_ONLY("samplerCubeShadow", (yylsp[0]));
@@ -4241,7 +4257,7 @@
 
     break;
 
-  case 199:
+  case 200:
 
     {
         FRAG_VERT_ONLY("sampler2DArrayShadow", (yylsp[0]));
@@ -4251,7 +4267,7 @@
 
     break;
 
-  case 200:
+  case 201:
 
     {
         FRAG_VERT_ONLY("struct", (yylsp[0]));
@@ -4261,7 +4277,7 @@
 
     break;
 
-  case 201:
+  case 202:
 
     {
         //
@@ -4276,13 +4292,13 @@
 
     break;
 
-  case 202:
+  case 203:
 
     { if (context->enterStructDeclaration((yylsp[-1]), *(yyvsp[-1].lex).string)) context->recover(); }
 
     break;
 
-  case 203:
+  case 204:
 
     {
         (yyval.interm.type) = context->addStructure((yylsp[-5]), (yylsp[-4]), (yyvsp[-4].lex).string, (yyvsp[-1].interm.fieldList));
@@ -4290,13 +4306,13 @@
 
     break;
 
-  case 204:
+  case 205:
 
     { if (context->enterStructDeclaration((yylsp[0]), *(yyvsp[0].lex).string)) context->recover(); }
 
     break;
 
-  case 205:
+  case 206:
 
     {
         (yyval.interm.type) = context->addStructure((yylsp[-4]), (yylsp[-4]), NewPoolTString(""), (yyvsp[-1].interm.fieldList));
@@ -4304,7 +4320,7 @@
 
     break;
 
-  case 206:
+  case 207:
 
     {
         (yyval.interm.fieldList) = (yyvsp[0].interm.fieldList);
@@ -4312,7 +4328,7 @@
 
     break;
 
-  case 207:
+  case 208:
 
     {
         (yyval.interm.fieldList) = (yyvsp[-1].interm.fieldList);
@@ -4330,7 +4346,7 @@
 
     break;
 
-  case 208:
+  case 209:
 
     {
         (yyval.interm.fieldList) = context->addStructDeclaratorList((yyvsp[-2].interm.type), (yyvsp[-1].interm.fieldList));
@@ -4338,7 +4354,7 @@
 
     break;
 
-  case 209:
+  case 210:
 
     {
         // ES3 Only, but errors should be handled elsewhere
@@ -4349,7 +4365,7 @@
 
     break;
 
-  case 210:
+  case 211:
 
     {
         (yyval.interm.fieldList) = NewPoolTFieldList();
@@ -4358,7 +4374,7 @@
 
     break;
 
-  case 211:
+  case 212:
 
     {
         (yyval.interm.fieldList)->push_back((yyvsp[0].interm.field));
@@ -4366,7 +4382,7 @@
 
     break;
 
-  case 212:
+  case 213:
 
     {
         if (context->reservedErrorCheck((yylsp[0]), *(yyvsp[0].lex).string))
@@ -4378,7 +4394,7 @@
 
     break;
 
-  case 213:
+  case 214:
 
     {
         if (context->reservedErrorCheck((yylsp[-3]), *(yyvsp[-3].lex).string))
@@ -4395,27 +4411,21 @@
 
     break;
 
-  case 214:
+  case 215:
 
     { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
 
     break;
 
-  case 215:
-
-    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-
-    break;
-
   case 216:
 
-    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermAggregate); }
+    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
 
     break;
 
   case 217:
 
-    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
+    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermAggregate); }
 
     break;
 
@@ -4439,19 +4449,19 @@
 
   case 221:
 
-    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermSwitch); }
+    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
 
     break;
 
   case 222:
 
-    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermCase); }
+    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermSwitch); }
 
     break;
 
   case 223:
 
-    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
+    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermCase); }
 
     break;
 
@@ -4463,24 +4473,30 @@
 
   case 225:
 
-    { (yyval.interm.intermAggregate) = 0; }
+    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
 
     break;
 
   case 226:
 
-    { context->symbolTable.push(); }
+    { (yyval.interm.intermAggregate) = 0; }
 
     break;
 
   case 227:
 
-    { context->symbolTable.pop(); }
+    { context->symbolTable.push(); }
 
     break;
 
   case 228:
 
+    { context->symbolTable.pop(); }
+
+    break;
+
+  case 229:
+
     {
         if ((yyvsp[-2].interm.intermAggregate) != 0) {
             (yyvsp[-2].interm.intermAggregate)->setOp(EOpSequence);
@@ -4491,51 +4507,51 @@
 
     break;
 
-  case 229:
+  case 230:
 
     { (yyval.interm.intermNode) = (yyvsp[0].interm.intermAggregate); }
 
     break;
 
-  case 230:
+  case 231:
 
     { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
 
     break;
 
-  case 231:
-
-    { context->symbolTable.push(); }
-
-    break;
-
   case 232:
 
-    { context->symbolTable.pop(); (yyval.interm.intermNode) = (yyvsp[0].interm.intermAggregate); }
+    { context->symbolTable.push(); }
 
     break;
 
   case 233:
 
-    { context->symbolTable.push(); }
+    { context->symbolTable.pop(); (yyval.interm.intermNode) = (yyvsp[0].interm.intermAggregate); }
 
     break;
 
   case 234:
 
-    { context->symbolTable.pop(); (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
+    { context->symbolTable.push(); }
 
     break;
 
   case 235:
 
+    { context->symbolTable.pop(); (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
+
+    break;
+
+  case 236:
+
     {
         (yyval.interm.intermAggregate) = 0;
     }
 
     break;
 
-  case 236:
+  case 237:
 
     {
         if ((yyvsp[-1].interm.intermAggregate)) {
@@ -4547,7 +4563,7 @@
 
     break;
 
-  case 237:
+  case 238:
 
     {
         (yyval.interm.intermAggregate) = context->intermediate.makeAggregate((yyvsp[0].interm.intermNode), (yyloc));
@@ -4555,7 +4571,7 @@
 
     break;
 
-  case 238:
+  case 239:
 
     {
         (yyval.interm.intermAggregate) = context->intermediate.growAggregate((yyvsp[-1].interm.intermAggregate), (yyvsp[0].interm.intermNode), (yyloc));
@@ -4563,19 +4579,19 @@
 
     break;
 
-  case 239:
+  case 240:
 
     { (yyval.interm.intermNode) = 0; }
 
     break;
 
-  case 240:
+  case 241:
 
     { (yyval.interm.intermNode) = static_cast<TIntermNode*>((yyvsp[-1].interm.intermTypedNode)); }
 
     break;
 
-  case 241:
+  case 242:
 
     {
         if (context->boolErrorCheck((yylsp[-4]), (yyvsp[-2].interm.intermTypedNode)))
@@ -4585,7 +4601,7 @@
 
     break;
 
-  case 242:
+  case 243:
 
     {
         (yyval.interm.nodePair).node1 = (yyvsp[-2].interm.intermNode);
@@ -4594,7 +4610,7 @@
 
     break;
 
-  case 243:
+  case 244:
 
     {
         (yyval.interm.nodePair).node1 = (yyvsp[0].interm.intermNode);
@@ -4603,13 +4619,13 @@
 
     break;
 
-  case 244:
+  case 245:
 
     { context->incrSwitchNestingLevel(); }
 
     break;
 
-  case 245:
+  case 246:
 
     {
         (yyval.interm.intermSwitch) = context->addSwitch((yyvsp[-3].interm.intermTypedNode), (yyvsp[0].interm.intermAggregate), (yylsp[-5]));
@@ -4618,7 +4634,7 @@
 
     break;
 
-  case 246:
+  case 247:
 
     {
         (yyval.interm.intermCase) = context->addCase((yyvsp[-1].interm.intermTypedNode), (yylsp[-2]));
@@ -4626,7 +4642,7 @@
 
     break;
 
-  case 247:
+  case 248:
 
     {
         (yyval.interm.intermCase) = context->addDefault((yylsp[-1]));
@@ -4634,7 +4650,7 @@
 
     break;
 
-  case 248:
+  case 249:
 
     {
         (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
@@ -4644,7 +4660,7 @@
 
     break;
 
-  case 249:
+  case 250:
 
     {
         TIntermNode *intermNode;
@@ -4661,13 +4677,13 @@
 
     break;
 
-  case 250:
+  case 251:
 
     { context->symbolTable.push(); context->incrLoopNestingLevel(); }
 
     break;
 
-  case 251:
+  case 252:
 
     {
         context->symbolTable.pop();
@@ -4677,13 +4693,13 @@
 
     break;
 
-  case 252:
+  case 253:
 
     { context->incrLoopNestingLevel(); }
 
     break;
 
-  case 253:
+  case 254:
 
     {
         if (context->boolErrorCheck((yylsp[0]), (yyvsp[-2].interm.intermTypedNode)))
@@ -4695,26 +4711,18 @@
 
     break;
 
-  case 254:
-
-    { context->symbolTable.push(); context->incrLoopNestingLevel(); }
-
-    break;
-
   case 255:
 
-    {
-        context->symbolTable.pop();
-        (yyval.interm.intermNode) = context->intermediate.addLoop(ELoopFor, (yyvsp[-3].interm.intermNode), reinterpret_cast<TIntermTyped*>((yyvsp[-2].interm.nodePair).node1), reinterpret_cast<TIntermTyped*>((yyvsp[-2].interm.nodePair).node2), (yyvsp[0].interm.intermNode), (yylsp[-6]));
-        context->decrLoopNestingLevel();
-    }
+    { context->symbolTable.push(); context->incrLoopNestingLevel(); }
 
     break;
 
   case 256:
 
     {
-        (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
+        context->symbolTable.pop();
+        (yyval.interm.intermNode) = context->intermediate.addLoop(ELoopFor, (yyvsp[-3].interm.intermNode), reinterpret_cast<TIntermTyped*>((yyvsp[-2].interm.nodePair).node1), reinterpret_cast<TIntermTyped*>((yyvsp[-2].interm.nodePair).node2), (yyvsp[0].interm.intermNode), (yylsp[-6]));
+        context->decrLoopNestingLevel();
     }
 
     break;
@@ -4730,7 +4738,7 @@
   case 258:
 
     {
-        (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
+        (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
     }
 
     break;
@@ -4738,7 +4746,7 @@
   case 259:
 
     {
-        (yyval.interm.intermTypedNode) = 0;
+        (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
     }
 
     break;
@@ -4746,13 +4754,21 @@
   case 260:
 
     {
+        (yyval.interm.intermTypedNode) = 0;
+    }
+
+    break;
+
+  case 261:
+
+    {
         (yyval.interm.nodePair).node1 = (yyvsp[-1].interm.intermTypedNode);
         (yyval.interm.nodePair).node2 = 0;
     }
 
     break;
 
-  case 261:
+  case 262:
 
     {
         (yyval.interm.nodePair).node1 = (yyvsp[-2].interm.intermTypedNode);
@@ -4761,7 +4777,7 @@
 
     break;
 
-  case 262:
+  case 263:
 
     {
         (yyval.interm.intermNode) = context->addBranch(EOpContinue, (yylsp[-1]));
@@ -4769,7 +4785,7 @@
 
     break;
 
-  case 263:
+  case 264:
 
     {
         (yyval.interm.intermNode) = context->addBranch(EOpBreak, (yylsp[-1]));
@@ -4777,7 +4793,7 @@
 
     break;
 
-  case 264:
+  case 265:
 
     {
         (yyval.interm.intermNode) = context->addBranch(EOpReturn, (yylsp[-1]));
@@ -4785,7 +4801,7 @@
 
     break;
 
-  case 265:
+  case 266:
 
     {
         (yyval.interm.intermNode) = context->addBranch(EOpReturn, (yyvsp[-1].interm.intermTypedNode), (yylsp[-2]));
@@ -4793,7 +4809,7 @@
 
     break;
 
-  case 266:
+  case 267:
 
     {
         FRAG_ONLY("discard", (yylsp[-1]));
@@ -4802,19 +4818,10 @@
 
     break;
 
-  case 267:
-
-    {
-        (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
-        context->setTreeRoot((yyval.interm.intermNode));
-    }
-
-    break;
-
   case 268:
 
     {
-        (yyval.interm.intermNode) = context->intermediate.growAggregate((yyvsp[-1].interm.intermNode), (yyvsp[0].interm.intermNode), (yyloc));
+        (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
         context->setTreeRoot((yyval.interm.intermNode));
     }
 
@@ -4823,7 +4830,8 @@
   case 269:
 
     {
-        (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
+        (yyval.interm.intermNode) = context->intermediate.growAggregate((yyvsp[-1].interm.intermNode), (yyvsp[0].interm.intermNode), (yyloc));
+        context->setTreeRoot((yyval.interm.intermNode));
     }
 
     break;
@@ -4839,7 +4847,7 @@
   case 271:
 
     {
-        context->parseFunctionPrototype((yylsp[0]), (yyvsp[0].interm).function, &(yyvsp[0].interm).intermAggregate);
+        (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
     }
 
     break;
@@ -4847,6 +4855,14 @@
   case 272:
 
     {
+        context->parseFunctionPrototype((yylsp[0]), (yyvsp[0].interm).function, &(yyvsp[0].interm).intermAggregate);
+    }
+
+    break;
+
+  case 273:
+
+    {
         (yyval.interm.intermNode) = context->addFunctionDefinition(*((yyvsp[-2].interm).function), (yyvsp[-2].interm).intermAggregate, (yyvsp[0].interm.intermAggregate), (yylsp[-2]));
     }
 
diff --git a/src/OpenGL/libGLESv2/Context.cpp b/src/OpenGL/libGLESv2/Context.cpp
index 82d9bcf..5759467 100644
--- a/src/OpenGL/libGLESv2/Context.cpp
+++ b/src/OpenGL/libGLESv2/Context.cpp
@@ -142,6 +142,7 @@
 	mTexture3DZero = new Texture3D(0);
 	mTexture2DArrayZero = new Texture2DArray(0);
 	mTextureCubeMapZero = new TextureCubeMap(0);
+	mTexture2DRectZero = new Texture2DRect(0);
 	mTextureExternalZero = new TextureExternal(0);
 
 	mState.activeSampler = 0;
@@ -262,6 +263,7 @@
 	mTexture3DZero = nullptr;
 	mTexture2DArrayZero = nullptr;
 	mTextureCubeMapZero = nullptr;
+	mTexture2DRectZero = nullptr;
 	mTextureExternalZero = nullptr;
 
 	delete mVertexDataManager;
@@ -1209,6 +1211,13 @@
 	mState.samplerTexture[TEXTURE_2D_ARRAY][mState.activeSampler] = getTexture(texture);
 }
 
+void Context::bindTexture2DRect(GLuint texture)
+{
+	mResourceManager->checkTextureAllocation(texture, TEXTURE_2D_RECT);
+
+	mState.samplerTexture[TEXTURE_2D_RECT][mState.activeSampler] = getTexture(texture);
+}
+
 void Context::bindReadFramebuffer(GLuint framebuffer)
 {
 	if(!getFramebuffer(framebuffer))
@@ -1681,6 +1690,19 @@
 	return static_cast<Texture2D*>(getSamplerTexture(mState.activeSampler, TEXTURE_2D));
 }
 
+Texture2D *Context::getTexture2D(GLenum target) const
+{
+	switch(target)
+	{
+	case GL_TEXTURE_2D:            return getTexture2D();
+	case GL_TEXTURE_RECTANGLE_ARB: return getTexture2DRect();
+	case GL_TEXTURE_EXTERNAL_OES:  return getTextureExternal();
+	default:                       UNREACHABLE(target);
+	}
+
+	return nullptr;
+}
+
 Texture3D *Context::getTexture3D() const
 {
 	return static_cast<Texture3D*>(getSamplerTexture(mState.activeSampler, TEXTURE_3D));
@@ -1696,6 +1718,11 @@
 	return static_cast<TextureCubeMap*>(getSamplerTexture(mState.activeSampler, TEXTURE_CUBE));
 }
 
+Texture2DRect *Context::getTexture2DRect() const
+{
+	return static_cast<Texture2DRect*>(getSamplerTexture(mState.activeSampler, TEXTURE_2D_RECT));
+}
+
 TextureExternal *Context::getTextureExternal() const
 {
 	return static_cast<TextureExternal*>(getSamplerTexture(mState.activeSampler, TEXTURE_EXTERNAL));
@@ -1713,6 +1740,7 @@
 		case TEXTURE_3D: return mTexture3DZero;
 		case TEXTURE_2D_ARRAY: return mTexture2DArrayZero;
 		case TEXTURE_CUBE: return mTextureCubeMapZero;
+		case TEXTURE_2D_RECT: return mTexture2DRectZero;
 		case TEXTURE_EXTERNAL: return mTextureExternalZero;
 		default: UNREACHABLE(type);
 		}
@@ -2113,6 +2141,15 @@
 
 		*params = mState.samplerTexture[TEXTURE_CUBE][mState.activeSampler].name();
 		return true;
+	case GL_TEXTURE_BINDING_RECTANGLE_ARB:
+		if(mState.activeSampler > MAX_COMBINED_TEXTURE_IMAGE_UNITS - 1)
+		{
+			error(GL_INVALID_OPERATION);
+			return false;
+		}
+
+		*params = mState.samplerTexture[TEXTURE_2D_RECT][mState.activeSampler].name();
+		return true;
 	case GL_TEXTURE_BINDING_EXTERNAL_OES:
 		if(mState.activeSampler > MAX_COMBINED_TEXTURE_IMAGE_UNITS - 1)
 		{
@@ -2541,6 +2578,7 @@
 	case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
 	case GL_TEXTURE_BINDING_2D:
 	case GL_TEXTURE_BINDING_CUBE_MAP:
+	case GL_TEXTURE_BINDING_RECTANGLE_ARB:
 	case GL_TEXTURE_BINDING_EXTERNAL_OES:
 	case GL_TEXTURE_BINDING_3D_OES:
 	case GL_COPY_READ_BUFFER_BINDING:
@@ -3186,7 +3224,11 @@
 		int baseLevel = baseTexture->getBaseLevel();
 		int maxLevel = std::min(baseTexture->getTopLevel(), baseTexture->getMaxLevel());
 
-		if(baseTexture->getTarget() == GL_TEXTURE_2D || baseTexture->getTarget() == GL_TEXTURE_EXTERNAL_OES)
+		switch(baseTexture->getTarget())
+		{
+		case GL_TEXTURE_2D:
+		case GL_TEXTURE_EXTERNAL_OES:
+		case GL_TEXTURE_RECTANGLE_ARB:
 		{
 			Texture2D *texture = static_cast<Texture2D*>(baseTexture);
 
@@ -3203,7 +3245,8 @@
 				device->setTextureLevel(sampler, 0, mipmapLevel, surface, sw::TEXTURE_2D);
 			}
 		}
-		else if(baseTexture->getTarget() == GL_TEXTURE_3D)
+		break;
+		case GL_TEXTURE_3D:
 		{
 			Texture3D *texture = static_cast<Texture3D*>(baseTexture);
 
@@ -3220,7 +3263,8 @@
 				device->setTextureLevel(sampler, 0, mipmapLevel, surface, sw::TEXTURE_3D);
 			}
 		}
-		else if(baseTexture->getTarget() == GL_TEXTURE_2D_ARRAY)
+		break;
+		case GL_TEXTURE_2D_ARRAY:
 		{
 			Texture2DArray *texture = static_cast<Texture2DArray*>(baseTexture);
 
@@ -3237,7 +3281,8 @@
 				device->setTextureLevel(sampler, 0, mipmapLevel, surface, sw::TEXTURE_2D_ARRAY);
 			}
 		}
-		else if(baseTexture->getTarget() == GL_TEXTURE_CUBE_MAP)
+		break;
+		case GL_TEXTURE_CUBE_MAP:
 		{
 			TextureCubeMap *cubeTexture = static_cast<TextureCubeMap*>(baseTexture);
 
@@ -3259,7 +3304,11 @@
 				}
 			}
 		}
-		else UNIMPLEMENTED();
+		break;
+		default:
+			UNIMPLEMENTED();
+			break;
+		}
 	}
 	else
 	{
@@ -4397,6 +4446,7 @@
 		"GL_KHR_texture_compression_astc_hdr",
 		"GL_KHR_texture_compression_astc_ldr",
 #endif
+		"GL_ARB_texture_rectangle",
 		"GL_ANGLE_framebuffer_blit",
 		"GL_ANGLE_framebuffer_multisample",
 		"GL_ANGLE_instanced_arrays",
diff --git a/src/OpenGL/libGLESv2/Context.h b/src/OpenGL/libGLESv2/Context.h
index e2b517d..c42a12a 100644
--- a/src/OpenGL/libGLESv2/Context.h
+++ b/src/OpenGL/libGLESv2/Context.h
@@ -53,6 +53,7 @@
 class Texture3D;
 class Texture2DArray;
 class TextureCubeMap;
+class Texture2DRect;
 class TextureExternal;
 class Framebuffer;
 class Renderbuffer;
@@ -598,6 +599,7 @@
 	void bindTextureExternal(GLuint texture);
 	void bindTexture3D(GLuint texture);
 	void bindTexture2DArray(GLuint texture);
+	void bindTexture2DRect(GLuint texture);
 	void bindReadFramebuffer(GLuint framebuffer);
 	void bindDrawFramebuffer(GLuint framebuffer);
 	void bindRenderbuffer(GLuint renderbuffer);
@@ -651,9 +653,11 @@
 	bool getBuffer(GLenum target, es2::Buffer **buffer) const;
 	Program *getCurrentProgram() const;
 	Texture2D *getTexture2D() const;
+	Texture2D *getTexture2D(GLenum target) const;
 	Texture3D *getTexture3D() const;
 	Texture2DArray *getTexture2DArray() const;
 	TextureCubeMap *getTextureCubeMap() const;
+	Texture2DRect *getTexture2DRect() const;
 	TextureExternal *getTextureExternal() const;
 	Texture *getSamplerTexture(unsigned int sampler, TextureType type) const;
 	Framebuffer *getReadFramebuffer() const;
@@ -743,6 +747,7 @@
 	gl::BindingPointer<Texture3D> mTexture3DZero;
 	gl::BindingPointer<Texture2DArray> mTexture2DArrayZero;
 	gl::BindingPointer<TextureCubeMap> mTextureCubeMapZero;
+	gl::BindingPointer<Texture2DRect> mTexture2DRectZero;
 	gl::BindingPointer<TextureExternal> mTextureExternalZero;
 
 	gl::NameSpace<Framebuffer> mFramebufferNameSpace;
diff --git a/src/OpenGL/libGLESv2/Program.cpp b/src/OpenGL/libGLESv2/Program.cpp
index b93bd2a..d2cff33 100644
--- a/src/OpenGL/libGLESv2/Program.cpp
+++ b/src/OpenGL/libGLESv2/Program.cpp
@@ -1153,6 +1153,7 @@
 				case GL_FLOAT_MAT4:   applyUniformMatrix4fv(device, location, size, f);   break;
 				case GL_SAMPLER_2D:
 				case GL_SAMPLER_CUBE:
+				case GL_SAMPLER_2D_RECT_ARB:
 				case GL_SAMPLER_EXTERNAL_OES:
 				case GL_SAMPLER_3D_OES:
 				case GL_SAMPLER_2D_ARRAY:
@@ -1761,6 +1762,7 @@
 						case GL_INT_SAMPLER_3D:
 						case GL_UNSIGNED_INT_SAMPLER_3D:
 						case GL_SAMPLER_3D_OES:       samplersVS[index].textureType = TEXTURE_3D;       break;
+						case GL_SAMPLER_2D_RECT_ARB:  samplersVS[index].textureType = TEXTURE_2D_RECT;  break;
 						case GL_SAMPLER_EXTERNAL_OES: samplersVS[index].textureType = TEXTURE_EXTERNAL; break;
 						case GL_INT_SAMPLER_2D_ARRAY:
 						case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
@@ -1796,6 +1798,7 @@
 						case GL_INT_SAMPLER_3D:
 						case GL_UNSIGNED_INT_SAMPLER_3D:
 						case GL_SAMPLER_3D_OES:       samplersPS[index].textureType = TEXTURE_3D;       break;
+						case GL_SAMPLER_2D_RECT_ARB:  samplersPS[index].textureType = TEXTURE_2D_RECT;  break;
 						case GL_SAMPLER_EXTERNAL_OES: samplersPS[index].textureType = TEXTURE_EXTERNAL; break;
 						case GL_INT_SAMPLER_2D_ARRAY:
 						case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
diff --git a/src/OpenGL/libGLESv2/ResourceManager.cpp b/src/OpenGL/libGLESv2/ResourceManager.cpp
index 04e1f0d..51a7bc1 100644
--- a/src/OpenGL/libGLESv2/ResourceManager.cpp
+++ b/src/OpenGL/libGLESv2/ResourceManager.cpp
@@ -308,6 +308,10 @@
 		{
 			textureObject = new Texture2DArray(texture);
 		}
+		else if(type == TEXTURE_2D_RECT)
+		{
+			textureObject = new Texture2DRect(texture);
+		}
 		else
 		{
 			UNREACHABLE(type);
diff --git a/src/OpenGL/libGLESv2/ResourceManager.h b/src/OpenGL/libGLESv2/ResourceManager.h
index efd0e20..c076653 100644
--- a/src/OpenGL/libGLESv2/ResourceManager.h
+++ b/src/OpenGL/libGLESv2/ResourceManager.h
@@ -40,6 +40,7 @@
 	TEXTURE_3D,
 	TEXTURE_2D_ARRAY,
 	TEXTURE_CUBE,
+	TEXTURE_2D_RECT,
 	TEXTURE_EXTERNAL,
 
 	TEXTURE_TYPE_COUNT,
diff --git a/src/OpenGL/libGLESv2/Shader.cpp b/src/OpenGL/libGLESv2/Shader.cpp
index fe1b830..9cb6bd5 100644
--- a/src/OpenGL/libGLESv2/Shader.cpp
+++ b/src/OpenGL/libGLESv2/Shader.cpp
@@ -181,6 +181,7 @@
 	resources.OES_fragment_precision_high = 1;
 	resources.OES_EGL_image_external = 1;
 	resources.EXT_draw_buffers = 1;
+	resources.ARB_texture_rectangle = 1;
 	resources.MaxCallStackDepth = 64;
 	assembler->Init(resources);
 
diff --git a/src/OpenGL/libGLESv2/Texture.cpp b/src/OpenGL/libGLESv2/Texture.cpp
index c2665e7..9b3a5f0 100644
--- a/src/OpenGL/libGLESv2/Texture.cpp
+++ b/src/OpenGL/libGLESv2/Texture.cpp
@@ -22,6 +22,7 @@
 #include "mathutil.h"
 #include "Framebuffer.h"
 #include "Device.hpp"
+#include "Shader.h"
 #include "libEGL/Display.h"
 #include "common/Surface.hpp"
 #include "common/debug.h"
@@ -577,25 +578,25 @@
 
 GLsizei Texture2D::getWidth(GLenum target, GLint level) const
 {
-	ASSERT(target == GL_TEXTURE_2D);
+	ASSERT(target == getTarget());
 	return image[level] ? image[level]->getWidth() : 0;
 }
 
 GLsizei Texture2D::getHeight(GLenum target, GLint level) const
 {
-	ASSERT(target == GL_TEXTURE_2D);
+	ASSERT(target == getTarget());
 	return image[level] ? image[level]->getHeight() : 0;
 }
 
 GLenum Texture2D::getFormat(GLenum target, GLint level) const
 {
-	ASSERT(target == GL_TEXTURE_2D);
+	ASSERT(target == getTarget());
 	return image[level] ? image[level]->getFormat() : GL_NONE;
 }
 
 GLenum Texture2D::getType(GLenum target, GLint level) const
 {
-	ASSERT(target == GL_TEXTURE_2D);
+	ASSERT(target == getTarget());
 	return image[level] ? image[level]->getType() : GL_NONE;
 }
 
@@ -913,7 +914,7 @@
 
 Renderbuffer *Texture2D::getRenderbuffer(GLenum target, GLint level)
 {
-	if(target != GL_TEXTURE_2D)
+	if(target != getTarget())
 	{
 		return error(GL_INVALID_OPERATION, (Renderbuffer*)nullptr);
 	}
@@ -932,7 +933,7 @@
 
 egl::Image *Texture2D::getRenderTarget(GLenum target, unsigned int level)
 {
-	ASSERT(target == GL_TEXTURE_2D);
+	ASSERT(target == getTarget());
 	ASSERT(level < IMPLEMENTATION_MAX_TEXTURE_LEVELS);
 
 	if(image[level])
@@ -945,7 +946,7 @@
 
 bool Texture2D::isShared(GLenum target, unsigned int level) const
 {
-	ASSERT(target == GL_TEXTURE_2D);
+	ASSERT(target == getTarget());
 	ASSERT(level < IMPLEMENTATION_MAX_TEXTURE_LEVELS);
 
 	if(mSurface)   // Bound to an EGLSurface
@@ -961,6 +962,15 @@
 	return image[level]->isShared();
 }
 
+Texture2DRect::Texture2DRect(GLuint name) : Texture2D(name)
+{
+}
+
+GLenum Texture2DRect::getTarget() const
+{
+	return GL_TEXTURE_RECTANGLE_ARB;
+}
+
 TextureCubeMap::TextureCubeMap(GLuint name) : Texture(name)
 {
 	for(int f = 0; f < 6; f++)
diff --git a/src/OpenGL/libGLESv2/Texture.h b/src/OpenGL/libGLESv2/Texture.h
index 53b4bfb..026c75a 100644
--- a/src/OpenGL/libGLESv2/Texture.h
+++ b/src/OpenGL/libGLESv2/Texture.h
@@ -203,6 +203,14 @@
 	unsigned int mProxyRefs;
 };
 
+class Texture2DRect : public Texture2D
+{
+public:
+	explicit Texture2DRect(GLuint name);
+
+	GLenum getTarget() const override;
+};
+
 class TextureCubeMap : public Texture
 {
 public:
diff --git a/src/OpenGL/libGLESv2/libGLESv2.cpp b/src/OpenGL/libGLESv2/libGLESv2.cpp
index 6db0a79..aa743e7 100644
--- a/src/OpenGL/libGLESv2/libGLESv2.cpp
+++ b/src/OpenGL/libGLESv2/libGLESv2.cpp
@@ -389,6 +389,9 @@
 		case GL_TEXTURE_3D:
 			context->bindTexture3D(texture);
 			break;
+		case GL_TEXTURE_RECTANGLE_ARB:
+			context->bindTexture2DRect(texture);
+			break;
 		default:
 			return error(GL_INVALID_ENUM);
 		}
@@ -836,6 +839,7 @@
 		switch(target)
 		{
 		case GL_TEXTURE_2D:
+		case GL_TEXTURE_RECTANGLE_ARB:
 			if(width > (es2::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level) ||
 			   height > (es2::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level))
 			{
@@ -868,9 +872,9 @@
 			return error(GL_INVALID_VALUE);
 		}
 
-		if(target == GL_TEXTURE_2D)
+		if(target == GL_TEXTURE_2D || target == GL_TEXTURE_RECTANGLE_ARB)
 		{
-			es2::Texture2D *texture = context->getTexture2D();
+			es2::Texture2D *texture = context->getTexture2D(target);
 
 			if(!texture)
 			{
@@ -958,9 +962,9 @@
 
 		GLenum sizedInternalFormat = GetSizedInternalFormat(format, GL_NONE);
 
-		if(target == GL_TEXTURE_2D)
+		if(target == GL_TEXTURE_2D || target == GL_TEXTURE_RECTANGLE_ARB)
 		{
-			es2::Texture2D *texture = context->getTexture2D();
+			es2::Texture2D *texture = context->getTexture2D(target);
 
 			GLenum validationError = ValidateSubImageParams(true, false, target, level, xoffset, yoffset, width, height, format, GL_NONE, texture, context->getClientVersion());
 			if(validationError != GL_NONE)
@@ -1021,6 +1025,7 @@
 		switch(target)
 		{
 		case GL_TEXTURE_2D:
+		case GL_TEXTURE_RECTANGLE_ARB:
 			if(width > (es2::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level) ||
 			   height > (es2::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level))
 			{
@@ -1069,9 +1074,9 @@
 			return;
 		}
 
-		if(target == GL_TEXTURE_2D)
+		if(target == GL_TEXTURE_2D || target == GL_TEXTURE_RECTANGLE_ARB)
 		{
-			es2::Texture2D *texture = context->getTexture2D();
+			es2::Texture2D *texture = context->getTexture2D(target);
 
 			if(!texture)
 			{
@@ -1141,9 +1146,9 @@
 
 		es2::Texture *texture = nullptr;
 
-		if(target == GL_TEXTURE_2D)
+		if(target == GL_TEXTURE_2D || target == GL_TEXTURE_RECTANGLE_ARB)
 		{
-			texture = context->getTexture2D();
+			texture = context->getTexture2D(target);
 		}
 		else if(es2::IsCubemapTextureTarget(target))
 		{
@@ -2097,6 +2102,12 @@
 					return error(GL_INVALID_OPERATION);
 				}
 				break;
+			case GL_TEXTURE_RECTANGLE_ARB:
+				if(tex->getTarget() != GL_TEXTURE_RECTANGLE_ARB)
+				{
+					return error(GL_INVALID_OPERATION);
+				}
+				break;
 			case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
 			case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
 			case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
@@ -2285,6 +2296,9 @@
 		case GL_TEXTURE_3D:
 			texture = context->getTexture3D();
 			break;
+		case GL_TEXTURE_RECTANGLE_ARB:
+			texture = context->getTexture2DRect();
+			break;
 		default:
 			return error(GL_INVALID_ENUM);
 		}
@@ -3588,6 +3602,9 @@
 		case GL_TEXTURE_3D:
 			texture = context->getTexture3D();
 			break;
+		case GL_TEXTURE_RECTANGLE_ARB:
+			texture = context->getTexture2DRect();
+			break;
 		default:
 			return error(GL_INVALID_ENUM);
 		}
@@ -3741,6 +3758,9 @@
 		case GL_TEXTURE_3D:
 			texture = context->getTexture3D();
 			break;
+		case GL_TEXTURE_RECTANGLE_ARB:
+			texture = context->getTexture2DRect();
+			break;
 		default:
 			return error(GL_INVALID_ENUM);
 		}
@@ -5042,6 +5062,7 @@
 		switch(target)
 		{
 		case GL_TEXTURE_2D:
+		case GL_TEXTURE_RECTANGLE_ARB:
 			if(width > (es2::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level) ||
 			   height > (es2::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level))
 			{
@@ -5077,9 +5098,9 @@
 			return error(validationError);
 		}
 
-		if(target == GL_TEXTURE_2D)
+		if(target == GL_TEXTURE_2D || target == GL_TEXTURE_RECTANGLE_ARB)
 		{
-			es2::Texture2D *texture = context->getTexture2D();
+			es2::Texture2D *texture = context->getTexture2D(target);
 
 			if(!texture)
 			{
@@ -5138,6 +5159,9 @@
 		case GL_TEXTURE_EXTERNAL_OES:
 			texture = context->getTextureExternal();
 			break;
+		case GL_TEXTURE_RECTANGLE_ARB:
+			texture = context->getTexture2DRect();
+			break;
 		default:
 			return error(GL_INVALID_ENUM);
 		}
@@ -5287,6 +5311,9 @@
 		case GL_TEXTURE_EXTERNAL_OES:
 			texture = context->getTextureExternal();
 			break;
+		case GL_TEXTURE_RECTANGLE_ARB:
+			texture = context->getTexture2DRect();
+			break;
 		default:
 			return error(GL_INVALID_ENUM);
 		}
@@ -5432,9 +5459,9 @@
 
 	if(context)
 	{
-		if(target == GL_TEXTURE_2D)
+		if(target == GL_TEXTURE_2D || target == GL_TEXTURE_RECTANGLE_ARB)
 		{
-			es2::Texture2D *texture = context->getTexture2D();
+			es2::Texture2D *texture = context->getTexture2D(target);
 
 			GLenum validationError = ValidateSubImageParams(false, false, target, level, xoffset, yoffset, width, height, format, type, texture, context->getClientVersion());
 			if(validationError != GL_NONE)
@@ -6676,6 +6703,7 @@
 	switch(target)
 	{
 	case GL_TEXTURE_2D:
+	case GL_TEXTURE_RECTANGLE_ARB:
 	case GL_TEXTURE_EXTERNAL_OES:
 		break;
 	default:
@@ -6686,14 +6714,7 @@
 
 	if(context)
 	{
-		es2::Texture2D *texture = nullptr;
-
-		switch(target)
-		{
-		case GL_TEXTURE_2D:           texture = context->getTexture2D();       break;
-		case GL_TEXTURE_EXTERNAL_OES: texture = context->getTextureExternal(); break;
-		default:                      UNREACHABLE(target);
-		}
+		es2::Texture2D *texture = context->getTexture2D(target);
 
 		if(!texture)
 		{
diff --git a/src/OpenGL/libGLESv2/libGLESv3.cpp b/src/OpenGL/libGLESv2/libGLESv3.cpp
index 056ef53..0a880ad 100644
--- a/src/OpenGL/libGLESv2/libGLESv3.cpp
+++ b/src/OpenGL/libGLESv2/libGLESv3.cpp
@@ -3937,41 +3937,42 @@
 		switch(target)
 		{
 		case GL_TEXTURE_2D:
+		case GL_TEXTURE_RECTANGLE_ARB:
+		{
+			es2::Texture2D *texture = context->getTexture2D(target);
+			if(!texture || texture->name == 0 || texture->getImmutableFormat() == GL_TRUE)
 			{
-				es2::Texture2D *texture = context->getTexture2D();
-				if(!texture || texture->name == 0 || texture->getImmutableFormat() == GL_TRUE)
-				{
-					return error(GL_INVALID_OPERATION);
-				}
+				return error(GL_INVALID_OPERATION);
+			}
 
 				for(int level = 0; level < levels; level++)
-				{
+			{
 					texture->setImage(context, level, width, height, sizedInternalFormat, sizedInternalFormat, type, context->getUnpackInfo(), nullptr);
-					width = std::max(1, (width / 2));
-					height = std::max(1, (height / 2));
-				}
-				texture->makeImmutable(levels);
+				width = std::max(1, (width / 2));
+				height = std::max(1, (height / 2));
 			}
+			texture->makeImmutable(levels);
+		}
 			break;
 		case GL_TEXTURE_CUBE_MAP:
+		{
+			es2::TextureCubeMap *texture = context->getTextureCubeMap();
+			if(!texture || texture->name == 0 || texture->getImmutableFormat())
 			{
-				es2::TextureCubeMap *texture = context->getTextureCubeMap();
-				if(!texture || texture->name == 0 || texture->getImmutableFormat())
-				{
-					return error(GL_INVALID_OPERATION);
-				}
+				return error(GL_INVALID_OPERATION);
+			}
 
 				for(int level = 0; level < levels; level++)
-				{
+			{
 					for(int face = GL_TEXTURE_CUBE_MAP_POSITIVE_X; face <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z; face++)
-					{
+				{
 						texture->setImage(context, face, level, width, height, sizedInternalFormat, sizedInternalFormat, type, context->getUnpackInfo(), nullptr);
-					}
-					width = std::max(1, (width / 2));
-					height = std::max(1, (height / 2));
 				}
-				texture->makeImmutable(levels);
+				width = std::max(1, (width / 2));
+				height = std::max(1, (height / 2));
 			}
+			texture->makeImmutable(levels);
+		}
 			break;
 		default:
 			return error(GL_INVALID_ENUM);
@@ -4003,52 +4004,52 @@
 		switch(target)
 		{
 		case GL_TEXTURE_3D:
+		{
+			if(levels > es2::IMPLEMENTATION_MAX_TEXTURE_LEVELS || levels > (log2(std::max(std::max(width, height), depth)) + 1))
 			{
-				if(levels > es2::IMPLEMENTATION_MAX_TEXTURE_LEVELS || levels > (log2(std::max(std::max(width, height), depth)) + 1))
-				{
-					return error(GL_INVALID_OPERATION);
-				}
+				return error(GL_INVALID_OPERATION);
+			}
 
-				es2::Texture3D *texture = context->getTexture3D();
-				if(!texture || texture->name == 0 || texture->getImmutableFormat() == GL_TRUE)
-				{
-					return error(GL_INVALID_OPERATION);
-				}
+			es2::Texture3D *texture = context->getTexture3D();
+			if(!texture || texture->name == 0 || texture->getImmutableFormat() == GL_TRUE)
+			{
+				return error(GL_INVALID_OPERATION);
+			}
 
 				for(int level = 0; level < levels; level++)
-				{
+			{
 					texture->setImage(context, level, width, height, depth, sizedInternalFormat, sizedInternalFormat, type, context->getUnpackInfo(), nullptr);
-					width = std::max(1, (width / 2));
-					height = std::max(1, (height / 2));
-					depth = std::max(1, (depth / 2));
-				}
-				texture->makeImmutable(levels);
+				width = std::max(1, (width / 2));
+				height = std::max(1, (height / 2));
+				depth = std::max(1, (depth / 2));
 			}
+			texture->makeImmutable(levels);
+		}
 			break;
 		case GL_TEXTURE_2D_ARRAY:
+		{
+			if(levels > es2::IMPLEMENTATION_MAX_TEXTURE_LEVELS || levels > (log2(std::max(width, height)) + 1))
 			{
-				if(levels > es2::IMPLEMENTATION_MAX_TEXTURE_LEVELS || levels > (log2(std::max(width, height)) + 1))
-				{
-					return error(GL_INVALID_OPERATION);
-				}
+				return error(GL_INVALID_OPERATION);
+			}
 
-				es2::Texture3D *texture = context->getTexture2DArray();
-				if(!texture || texture->name == 0 || texture->getImmutableFormat())
-				{
-					return error(GL_INVALID_OPERATION);
-				}
+			es2::Texture3D *texture = context->getTexture2DArray();
+			if(!texture || texture->name == 0 || texture->getImmutableFormat())
+			{
+				return error(GL_INVALID_OPERATION);
+			}
 
 				for(int level = 0; level < levels; level++)
-				{
+			{
 					for(int face = GL_TEXTURE_CUBE_MAP_POSITIVE_X; face <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z; face++)
-					{
+				{
 						texture->setImage(context, level, width, height, depth, sizedInternalFormat, sizedInternalFormat, type, context->getUnpackInfo(), nullptr);
-					}
-					width = std::max(1, (width / 2));
-					height = std::max(1, (height / 2));
 				}
-				texture->makeImmutable(levels);
+				width = std::max(1, (width / 2));
+				height = std::max(1, (height / 2));
 			}
+			texture->makeImmutable(levels);
+		}
 			break;
 		default:
 			return error(GL_INVALID_ENUM);
diff --git a/src/OpenGL/libGLESv2/utilities.cpp b/src/OpenGL/libGLESv2/utilities.cpp
index 2318057..96c83d4 100644
--- a/src/OpenGL/libGLESv2/utilities.cpp
+++ b/src/OpenGL/libGLESv2/utilities.cpp
@@ -20,6 +20,7 @@
 #include "main.h"
 #include "mathutil.h"
 #include "Context.h"
+#include "Shader.h"
 #include "common/debug.h"
 
 #include <limits>
@@ -183,6 +184,7 @@
 		case GL_UNSIGNED_INT:
 		case GL_SAMPLER_2D:
 		case GL_SAMPLER_CUBE:
+		case GL_SAMPLER_2D_RECT_ARB:
 		case GL_SAMPLER_EXTERNAL_OES:
 		case GL_SAMPLER_3D_OES:
 		case GL_SAMPLER_2D_ARRAY:
@@ -260,6 +262,7 @@
 		case GL_INT:
 		case GL_SAMPLER_2D:
 		case GL_SAMPLER_CUBE:
+		case GL_SAMPLER_2D_RECT_ARB:
 		case GL_SAMPLER_EXTERNAL_OES:
 		case GL_SAMPLER_3D_OES:
 		case GL_SAMPLER_2D_ARRAY:
@@ -309,6 +312,7 @@
 		{
 		case GL_SAMPLER_2D:
 		case GL_SAMPLER_CUBE:
+		case GL_SAMPLER_2D_RECT_ARB:
 		case GL_SAMPLER_EXTERNAL_OES:
 		case GL_SAMPLER_3D_OES:
 		case GL_SAMPLER_2D_ARRAY:
@@ -353,6 +357,7 @@
 		case GL_UNSIGNED_INT_VEC4:
 		case GL_SAMPLER_2D:
 		case GL_SAMPLER_CUBE:
+		case GL_SAMPLER_2D_RECT_ARB:
 		case GL_SAMPLER_EXTERNAL_OES:
 		case GL_SAMPLER_3D_OES:
 		case GL_SAMPLER_2D_ARRAY:
@@ -771,7 +776,7 @@
 
 	bool IsTextureTarget(GLenum target)
 	{
-		return target == GL_TEXTURE_2D || IsCubemapTextureTarget(target) || target == GL_TEXTURE_3D || target == GL_TEXTURE_2D_ARRAY;
+		return target == GL_TEXTURE_2D || IsCubemapTextureTarget(target) || target == GL_TEXTURE_3D || target == GL_TEXTURE_2D_ARRAY || target == GL_TEXTURE_RECTANGLE_ARB;
 	}
 
 	GLenum ValidateTextureFormatType(GLenum format, GLenum type, GLint internalformat, GLint clientVersion)
diff --git a/src/Shader/PixelProgram.cpp b/src/Shader/PixelProgram.cpp
index 0f0f6bd..59a6982 100644
--- a/src/Shader/PixelProgram.cpp
+++ b/src/Shader/PixelProgram.cpp
@@ -297,6 +297,7 @@
 			case Shader::OPCODE_TEXGRADOFFSET: TEXGRADOFFSET(d, s0, src1, s2, s3, s4);     break;
 			case Shader::OPCODE_TEXBIAS:    TEXBIAS(d, s0, src1, s2.x);                    break;
 			case Shader::OPCODE_TEXOFFSETBIAS: TEXOFFSETBIAS(d, s0, src1, s2, s3.x);       break;
+			case Shader::OPCODE_TEXRECT:    TEXRECT(d, s0, src1);                          break;
 			case Shader::OPCODE_DISCARD:    DISCARD(cMask, instruction);                   break;
 			case Shader::OPCODE_DFDX:       DFDX(d, s0);                                   break;
 			case Shader::OPCODE_DFDY:       DFDY(d, s0);                                   break;
@@ -1178,6 +1179,11 @@
 		dst = sampleTexture(src1, src0, lod, (src0), (src0), (src0), Lod);
 	}
 
+	void PixelProgram::TEXRECT(Vector4f &dst, Vector4f &src0, const Src &src1)
+	{
+		dst = sampleTexture(src1, src0, (src0.x), (src0), (src0), (src0), Rectangle);
+	}
+
 	void PixelProgram::TEXSIZE(Vector4f &dst, Float4 &lod, const Src &src1)
 	{
 		Pointer<Byte> texture = data + OFFSET(DrawData, mipmap) + src1.index * sizeof(Texture);
diff --git a/src/Shader/PixelProgram.hpp b/src/Shader/PixelProgram.hpp
index 951e147..d7b7767 100644
--- a/src/Shader/PixelProgram.hpp
+++ b/src/Shader/PixelProgram.hpp
@@ -118,6 +118,7 @@
 		void TEXELFETCHOFFSET(Vector4f &dst, Vector4f &src, const Src &, Vector4f &offset, Float4 &lod);
 		void TEXGRAD(Vector4f &dst, Vector4f &src0, const Src &src1, Vector4f &dsx, Vector4f &dsy);
 		void TEXGRADOFFSET(Vector4f &dst, Vector4f &src, const Src &, Vector4f &dsx, Vector4f &dsy, Vector4f &offset);
+		void TEXRECT(Vector4f &dst, Vector4f &src0, const Src &src1);
 		void DISCARD(Int cMask[4], const Shader::Instruction *instruction);
 		void DFDX(Vector4f &dst, Vector4f &src);
 		void DFDY(Vector4f &dst, Vector4f &src);
diff --git a/src/Shader/PixelShader.cpp b/src/Shader/PixelShader.cpp
index 9e281d9..6813b3f 100644
--- a/src/Shader/PixelShader.cpp
+++ b/src/Shader/PixelShader.cpp
@@ -323,6 +323,7 @@
 						case Shader::OPCODE_TEXELFETCHOFFSET:
 						case Shader::OPCODE_TEXGRAD:
 						case Shader::OPCODE_TEXGRADOFFSET:
+						case Shader::OPCODE_TEXRECT:
 							{
 								int sampler = inst->src[1].index;
 
diff --git a/src/Shader/SamplerCore.cpp b/src/Shader/SamplerCore.cpp
index cae1ecd..dbb4417 100644
--- a/src/Shader/SamplerCore.cpp
+++ b/src/Shader/SamplerCore.cpp
@@ -297,7 +297,8 @@
 			// FIXME: YUV is not supported by the floating point path
 			bool forceFloatFiltering = state.highPrecisionFiltering && !hasYuvFormat() && (state.textureFilter != FILTER_POINT);
 			bool seamlessCube = (state.addressingModeU == ADDRESSING_SEAMLESS);
-			if(hasFloatTexture() || hasUnnormalizedIntegerTexture() || forceFloatFiltering || seamlessCube)   // FIXME: Mostly identical to integer sampling
+			bool rectangleTexture = (function == Rectangle);
+			if(hasFloatTexture() || hasUnnormalizedIntegerTexture() || forceFloatFiltering || seamlessCube || rectangleTexture)   // FIXME: Mostly identical to integer sampling
 			{
 				Float4 uuuu = u;
 				Float4 vvvv = v;
@@ -2365,20 +2366,26 @@
 
 			Float4 coord = uvw;
 
-			switch(addressingMode)
+			if(function == Rectangle)
 			{
-			case ADDRESSING_CLAMP:
-			case ADDRESSING_BORDER:
-			case ADDRESSING_SEAMLESS:
-				// Linear filtering of cube doesn't require clamping because the coordinates
-				// are already in [0, 1] range and numerical imprecision is tolerated.
-				if(addressingMode != ADDRESSING_SEAMLESS || pointFilter)
+				coord = Min(Max(coord, Float4(0.0f)), Float4(dim - Int4(1)));
+			}
+			else
+			{
+				switch(addressingMode)
 				{
-					Float4 one = As<Float4>(Int4(oneBits));
-					coord = Min(Max(coord, Float4(0.0f)), one);
-				}
-				break;
-			case ADDRESSING_MIRROR:
+				case ADDRESSING_CLAMP:
+				case ADDRESSING_BORDER:
+				case ADDRESSING_SEAMLESS:
+					// Linear filtering of cube doesn't require clamping because the coordinates
+					// are already in [0, 1] range and numerical imprecision is tolerated.
+					if(addressingMode != ADDRESSING_SEAMLESS || pointFilter)
+					{
+						Float4 one = As<Float4>(Int4(oneBits));
+						coord = Min(Max(coord, Float4(0.0f)), one);
+					}
+					break;
+				case ADDRESSING_MIRROR:
 				{
 					Float4 half = As<Float4>(Int4(halfBits));
 					Float4 one = As<Float4>(Int4(oneBits));
@@ -2386,7 +2393,7 @@
 					coord = one - Abs(two * Frac(coord * half) - one);
 				}
 				break;
-			case ADDRESSING_MIRRORONCE:
+				case ADDRESSING_MIRRORONCE:
 				{
 					Float4 half = As<Float4>(Int4(halfBits));
 					Float4 one = As<Float4>(Int4(oneBits));
@@ -2394,22 +2401,23 @@
 					coord = one - Abs(two * Frac(Min(Max(coord, -one), two) * half) - one);
 				}
 				break;
-			default:   // Wrap
-				coord = Frac(coord);
-				break;
+				default:   // Wrap
+					coord = Frac(coord);
+					break;
+				}
+
+				coord = coord * Float4(dim);
 			}
 
-			coord = coord * Float4(dim);
-
 			if(state.textureFilter == FILTER_POINT ||
-               state.textureFilter == FILTER_GATHER)
- 			{
+			   state.textureFilter == FILTER_GATHER)
+			{
 				xyz0 = Int4(coord);
 			}
 			else
 			{
 				if(state.textureFilter == FILTER_MIN_POINT_MAG_LINEAR ||
-            	   state.textureFilter == FILTER_MIN_LINEAR_MAG_POINT)
+				   state.textureFilter == FILTER_MIN_LINEAR_MAG_POINT)
 				{
 					coord -= As<Float4>(As<Int4>(Float4(0.5f)) & filter);
 				}
diff --git a/src/Shader/SamplerCore.hpp b/src/Shader/SamplerCore.hpp
index 684c1a7..a72bbdc 100644
--- a/src/Shader/SamplerCore.hpp
+++ b/src/Shader/SamplerCore.hpp
@@ -27,6 +27,7 @@
 		Lod,       // Use provided LOD.
 		Grad,      // Use provided gradients.
 		Fetch,     // Use provided integer coordinates.
+		Rectangle, // Use non normalized texture coordinates.
 		Base       // Sample base level.
 	};
 
diff --git a/src/Shader/Shader.cpp b/src/Shader/Shader.cpp
index 025b5d5..c5ce0b9 100644
--- a/src/Shader/Shader.cpp
+++ b/src/Shader/Shader.cpp
@@ -904,6 +904,7 @@
 		case OPCODE_TEXELFETCHOFFSET: return "texelfetchoffset";
 		case OPCODE_TEXGRAD:         return "texgrad";
 		case OPCODE_TEXGRADOFFSET:   return "texgradoffset";
+		case OPCODE_TEXRECT:         return "texrect";
 		case OPCODE_BREAKP:          return "breakp";
 		case OPCODE_TEXSIZE:         return "texsize";
 		case OPCODE_PHASE:           return "phase";
@@ -1850,6 +1851,7 @@
 			case OPCODE_TEXELFETCHOFFSET:
 			case OPCODE_TEXGRAD:
 			case OPCODE_TEXGRADOFFSET:
+			case OPCODE_TEXRECT:
 				{
 					Parameter &dst = inst->dst;
 					Parameter &src1 = inst->src[1];
diff --git a/src/Shader/Shader.hpp b/src/Shader/Shader.hpp
index 6755cd4..2556cdd 100644
--- a/src/Shader/Shader.hpp
+++ b/src/Shader/Shader.hpp
@@ -214,6 +214,7 @@
 			OPCODE_TEXBIAS,
 			OPCODE_TEXLOD,
 			OPCODE_TEXOFFSETBIAS,
+			OPCODE_TEXRECT,
 			OPCODE_TEXSIZE,
 			OPCODE_FLOATBITSTOINT,
 			OPCODE_FLOATBITSTOUINT,
diff --git a/src/Shader/VertexProgram.cpp b/src/Shader/VertexProgram.cpp
index 4f8ba1a..71a38d3 100644
--- a/src/Shader/VertexProgram.cpp
+++ b/src/Shader/VertexProgram.cpp
@@ -336,6 +336,7 @@
 			case Shader::OPCODE_TEXELFETCHOFFSET: TEXELFETCHOFFSET(d, s0, src1, s2, s3.x); break;
 			case Shader::OPCODE_TEXGRAD:    TEXGRAD(d, s0, src1, s2, s3);   break;
 			case Shader::OPCODE_TEXGRADOFFSET: TEXGRADOFFSET(d, s0, src1, s2, s3, s4); break;
+			case Shader::OPCODE_TEXRECT:    TEXRECT(d, s0, src1);           break;
 			case Shader::OPCODE_TEXSIZE:    TEXSIZE(d, s0.x, src1);         break;
 			case Shader::OPCODE_END:                                        break;
 			default:
@@ -1552,6 +1553,11 @@
 		dst = sampleTexture(src1, src0, (src0.x), dsx, dsy, offset, {Grad, Offset});
 	}
 
+	void VertexProgram::TEXRECT(Vector4f &dst, Vector4f &src0, const Src &src1)
+	{
+		dst = sampleTexture(src1, src0, (src0.x), (src0), (src0), (src0), Rectangle);
+	}
+
 	void VertexProgram::TEXSIZE(Vector4f &dst, Float4 &lod, const Src &src1)
 	{
 		Pointer<Byte> texture = data + OFFSET(DrawData, mipmap[TEXTURE_IMAGE_UNITS]) + src1.index * sizeof(Texture);
diff --git a/src/Shader/VertexProgram.hpp b/src/Shader/VertexProgram.hpp
index c42ab71..0462ab7 100644
--- a/src/Shader/VertexProgram.hpp
+++ b/src/Shader/VertexProgram.hpp
@@ -115,6 +115,7 @@
 		void TEXELFETCHOFFSET(Vector4f &dst, Vector4f &src, const Src&, Vector4f &offset, Float4 &lod);
 		void TEXGRAD(Vector4f &dst, Vector4f &src, const Src&, Vector4f &dsx, Vector4f &dsy);
 		void TEXGRADOFFSET(Vector4f &dst, Vector4f &src, const Src&, Vector4f &dsx, Vector4f &dsy, Vector4f &offset);
+		void TEXRECT(Vector4f &dst, Vector4f &src0, const Src &src1);
 		void TEXSIZE(Vector4f &dst, Float4 &lod, const Src&);
 
 		Vector4f sampleTexture(const Src &s, Vector4f &uvwq, Float4 &lod, Vector4f &dsx, Vector4f &dsy, Vector4f &offset, SamplerFunction function);