[Scummvm-git-logs] scummvm master -> 6a2697e2ded0183a37b54780b189f8de975a5a75

djsrv dservilla at gmail.com
Thu Jul 15 20:32:08 UTC 2021


This automated email contains information about 23 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
be5a5894d9 DIRECTOR: Keep all character mappings
bb60a9ea29 DIRECTOR: Move InfoEntry::readString definition out of header
ed64ec6699 DIRECTOR: Default movie/cast platform to Mac
545d34c022 DIRECTOR: LINGO: Eliminate when preprocessor
564c4945ca DIRECTOR: LINGO: Remove parseMenu
88ea6e1645 DIRECTOR: Re-encode loaded text to UTF-8
52af0ac82e DIRECTOR: Create DirectorEngine::getPlatformEncoding
19895f877d DIRECTOR: LINGO: Make text builtins handle Unicode
860a8d663a DIRECTOR: LINGO: Make chunk refs handle Unicode
c16189094d DIRECTOR: LINGO: Make _itemDelimiter a U32 char
d0df2bd014 DIRECTOR: LINGO: Use '\r' as line delimiter
5b3bed6e57 DIRECTOR: LINGO: Re-encode Lingo constants to UTF-8
30df98e61b DIRECTOR: Create Cast::decodeString
4450cd5ced DIRECTOR: LINGO: Decode constants using Cast::decodeString
ca0b1f5de1 DIRECTOR: LINGO: Normalize strings in equality tests
163424abbb DIRECTOR: Set lingotests platform to Macintosh
b2988ce682 COMMON: Add constructor to make U32String from a character
8fcc186b08 DIRECTOR: Add charToNum and numToChar helper functions
664d2f257d DIRECTOR: LINGO: Make compareTo handle Unicode
8354140227 DIRECTOR: LINGO: Fix getting the itemDelimiter
fc25ba3af5 DIRECTOR: Keep original line endings in STXT
04f16d2a17 DIRECTOR: LINGO: Move char normalizations to lingo-utils.cpp
6a2697e2de DIRECTOR: LINGO: Restore use of strchr in isspec


Commit: be5a5894d9779d1c2f212d4c5e5ef5c3635abb75
    https://github.com/scummvm/scummvm/commit/be5a5894d9779d1c2f212d4c5e5ef5c3635abb75
Author: djsrv (dservilla at gmail.com)
Date: 2021-07-15T16:31:47-04:00

Commit Message:
DIRECTOR: Keep all character mappings

Changed paths:
    engines/director/cast.h
    engines/director/fonts.cpp


diff --git a/engines/director/cast.h b/engines/director/cast.h
index f756ed08dd..5021733c7b 100644
--- a/engines/director/cast.h
+++ b/engines/director/cast.h
@@ -117,7 +117,8 @@ public:
 	Common::Platform _platform;
 	uint16 _castLibID;
 
-	CharMap _charMap;
+	CharMap _macCharsToWin;
+	CharMap _winCharsToMac;
 	FontXPlatformMap _fontXPlatformMap;
 	FontMap _fontMap;
 
diff --git a/engines/director/fonts.cpp b/engines/director/fonts.cpp
index 083cbc6e5d..f7eddf15f5 100644
--- a/engines/director/fonts.cpp
+++ b/engines/director/fonts.cpp
@@ -340,10 +340,11 @@ bool Cast::readFXmpLine(Common::SeekableReadStreamEndian &stream) {
 			}
 			byte toChar = atoi(tok.str.c_str());
 
-			// TODO: We should fill _charMap with mappings matching the current platform.
-			// We only have Mac fonts right now, though, so we'll always use the Win => Mac mappings.
-			if (fromPlatform == Common::kPlatformWindows) {
-				_charMap[fromChar] = toChar;
+			if (fromPlatform == Common::kPlatformMacintosh) {
+				_macCharsToWin[fromChar] = toChar;
+				debugC(3, kDebugLoading, "Cast::readFXmpLine: Mapping Mac char %d to Win char %d", fromChar, toChar);
+			} else {
+				_winCharsToMac[fromChar] = toChar;
 				debugC(3, kDebugLoading, "Cast::readFXmpLine: Mapping Win char %d to Mac char %d", fromChar, toChar);
 			}
 


Commit: bb60a9ea2956c8045dff602fee303fc95ea6eaf3
    https://github.com/scummvm/scummvm/commit/bb60a9ea2956c8045dff602fee303fc95ea6eaf3
Author: djsrv (dservilla at gmail.com)
Date: 2021-07-15T16:31:47-04:00

Commit Message:
DIRECTOR: Move InfoEntry::readString definition out of header

Changed paths:
    engines/director/movie.cpp
    engines/director/movie.h


diff --git a/engines/director/movie.cpp b/engines/director/movie.cpp
index 85b714a7a1..df425d34e3 100644
--- a/engines/director/movie.cpp
+++ b/engines/director/movie.cpp
@@ -381,4 +381,21 @@ Symbol Movie::getHandler(const Common::String &name) {
 	return Symbol();
 }
 
+Common::String InfoEntry::readString(bool pascal) {
+	Common::String res;
+
+	if (len == 0)
+		return res;
+
+	int start = pascal ? 1 : 0;
+
+	for (uint i = start; i < len; i++)
+		if (data[i] == '\r')
+			res += '\n';
+		else if (data[i] >= 0x20)
+			res += data[i];
+
+	return res;
+}
+
 } // End of namespace Director
diff --git a/engines/director/movie.h b/engines/director/movie.h
index eb08a177b3..317ed2a8b6 100644
--- a/engines/director/movie.h
+++ b/engines/director/movie.h
@@ -68,22 +68,7 @@ struct InfoEntry {
 		return *this;
 	}
 
-	Common::String readString(bool pascal = true) {
-		Common::String res;
-
-		if (len == 0)
-			return res;
-
-		int start = pascal ? 1 : 0;
-
-		for (uint i = start; i < len; i++)
-			if (data[i] == '\r')
-				res += '\n';
-			else if (data[i] >= 0x20)
-				res += data[i];
-
-		return res;
-	}
+	Common::String readString(bool pascal = true);
 };
 
 struct InfoEntries {


Commit: ed64ec669903e9292af79608bc7a905ddae7771b
    https://github.com/scummvm/scummvm/commit/ed64ec669903e9292af79608bc7a905ddae7771b
Author: djsrv (dservilla at gmail.com)
Date: 2021-07-15T16:31:47-04:00

Commit Message:
DIRECTOR: Default movie/cast platform to Mac

Changed paths:
    engines/director/cast.cpp
    engines/director/movie.cpp


diff --git a/engines/director/cast.cpp b/engines/director/cast.cpp
index 770f1e4eee..951bfb5ff8 100644
--- a/engines/director/cast.cpp
+++ b/engines/director/cast.cpp
@@ -77,7 +77,7 @@ Cast::Cast(Movie *movie, uint16 castLibID, bool isShared) {
 
 	_castArchive = nullptr;
 	_version = 0;
-	_platform = g_director->getPlatform();
+	_platform = Common::kPlatformMacintosh;
 
 	_stageColor = 0;
 
diff --git a/engines/director/movie.cpp b/engines/director/movie.cpp
index df425d34e3..e4864ee0ed 100644
--- a/engines/director/movie.cpp
+++ b/engines/director/movie.cpp
@@ -66,6 +66,7 @@ Movie::Movie(Window *window) {
 	_currentHandlingChannelId = 0;
 
 	_version = 0;
+	_platform = Common::kPlatformMacintosh;
 	_allowOutdatedLingo = false;
 
 	_movieArchive = nullptr;


Commit: 545d34c022bcdd5b3bee7e847abbc90277a4ea8d
    https://github.com/scummvm/scummvm/commit/545d34c022bcdd5b3bee7e847abbc90277a4ea8d
Author: djsrv (dservilla at gmail.com)
Date: 2021-07-15T16:31:47-04:00

Commit Message:
DIRECTOR: LINGO: Eliminate when preprocessor

Changed paths:
    engines/director/lingo/lingo-ast.h
    engines/director/lingo/lingo-codegen.cpp
    engines/director/lingo/lingo-gr.cpp
    engines/director/lingo/lingo-gr.h
    engines/director/lingo/lingo-gr.y
    engines/director/lingo/lingo-lex.cpp
    engines/director/lingo/lingo-lex.l
    engines/director/lingo/lingo-preprocessor.cpp


diff --git a/engines/director/lingo/lingo-ast.h b/engines/director/lingo/lingo-ast.h
index 696938c22c..0bcaf11f20 100644
--- a/engines/director/lingo/lingo-ast.h
+++ b/engines/director/lingo/lingo-ast.h
@@ -576,9 +576,9 @@ struct TellNode : StmtNode {
 
 struct WhenNode : StmtNode {
 	Common::String *event;
-	Node *code;
+	Common::String *code;
 
-	WhenNode(Common::String *eventIn, Node *codeIn)
+	WhenNode(Common::String *eventIn, Common::String *codeIn)
 		: StmtNode(kWhenNode), event(eventIn), code(codeIn) {}
 	virtual ~WhenNode() {
 		delete event;
diff --git a/engines/director/lingo/lingo-codegen.cpp b/engines/director/lingo/lingo-codegen.cpp
index 85f310c2ea..33e0778ced 100644
--- a/engines/director/lingo/lingo-codegen.cpp
+++ b/engines/director/lingo/lingo-codegen.cpp
@@ -1006,7 +1006,8 @@ bool LingoCompiler::visitTellNode(TellNode *node) {
 /* WhenNode */
 
 bool LingoCompiler::visitWhenNode(WhenNode *node) {
-	COMPILE(node->code);
+	code1(LC::c_stringpush);
+	codeString(node->code->c_str());
 	code1(LC::c_whencode);
 	codeString(node->event->c_str());
 	return true;
diff --git a/engines/director/lingo/lingo-gr.cpp b/engines/director/lingo/lingo-gr.cpp
index 20deafc912..58e7e23a06 100644
--- a/engines/director/lingo/lingo-gr.cpp
+++ b/engines/director/lingo/lingo-gr.cpp
@@ -643,18 +643,18 @@ union yyalloc
 #endif /* !YYCOPY_NEEDED */
 
 /* YYFINAL -- State number of the termination state.  */
-#define YYFINAL  189
+#define YYFINAL  187
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   4539
+#define YYLAST   4569
 
 /* YYNTOKENS -- Number of terminals.  */
 #define YYNTOKENS  106
 /* YYNNTS -- Number of nonterminals.  */
 #define YYNNTS  65
 /* YYNRULES -- Number of rules.  */
-#define YYNRULES  325
+#define YYNRULES  324
 /* YYNSTATES -- Number of states.  */
-#define YYNSTATES  607
+#define YYNSTATES  603
 
 /* YYMAXUTOK -- Last valid token kind.  */
 #define YYMAXUTOK   345
@@ -712,39 +712,39 @@ static const yytype_int8 yytranslate[] =
   /* YYRLINE[YYN] -- Source line where rule number YYN was defined.  */
 static const yytype_int16 yyrline[] =
 {
-       0,   196,   196,   198,   204,   211,   212,   213,   214,   215,
-     244,   248,   250,   252,   253,   256,   262,   269,   270,   275,
-     279,   283,   284,   285,   292,   293,   294,   295,   296,   297,
-     298,   299,   300,   301,   302,   303,   304,   305,   306,   307,
-     308,   309,   310,   311,   312,   313,   314,   315,   316,   317,
-     318,   319,   320,   321,   322,   323,   324,   325,   326,   327,
-     328,   329,   330,   331,   332,   333,   334,   335,   336,   337,
-     338,   339,   340,   341,   342,   343,   344,   347,   348,   349,
-     350,   351,   352,   353,   354,   355,   356,   357,   358,   359,
-     360,   361,   362,   363,   364,   365,   366,   369,   370,   371,
-     374,   378,   388,   389,   392,   393,   394,   395,   396,   397,
-     400,   401,   402,   405,   406,   407,   408,   409,   410,   411,
-     412,   417,   418,   419,   420,   421,   422,   425,   428,   433,
-     437,   443,   448,   451,   456,   462,   462,   468,   473,   479,
-     485,   491,   499,   500,   501,   502,   505,   505,   507,   508,
-     509,   512,   516,   520,   526,   530,   534,   538,   539,   541,
-     543,   545,   547,   551,   555,   559,   561,   562,   566,   572,
-     579,   580,   583,   584,   588,   594,   601,   602,   608,   609,
-     610,   611,   612,   613,   614,   615,   616,   617,   618,   619,
-     620,   623,   625,   626,   629,   630,   633,   634,   635,   637,
-     639,   641,   643,   645,   647,   649,   651,   654,   655,   656,
-     657,   660,   661,   664,   669,   672,   677,   683,   684,   685,
-     686,   687,   690,   691,   692,   693,   694,   697,   699,   700,
-     701,   702,   703,   704,   705,   706,   707,   708,   712,   713,
-     714,   715,   716,   719,   719,   721,   722,   725,   726,   727,
-     728,   729,   732,   733,   734,   737,   741,   746,   747,   748,
-     751,   752,   755,   756,   760,   761,   762,   763,   764,   765,
-     766,   767,   768,   769,   770,   771,   772,   773,   774,   775,
-     776,   777,   778,   785,   786,   787,   788,   789,   790,   791,
-     792,   793,   794,   795,   796,   797,   798,   799,   800,   801,
-     802,   803,   806,   807,   808,   809,   810,   811,   812,   813,
-     814,   815,   816,   817,   818,   819,   820,   821,   822,   823,
-     826,   827,   830,   831,   834,   838
+       0,   202,   202,   204,   210,   217,   218,   219,   220,   221,
+     250,   254,   256,   258,   259,   262,   268,   275,   276,   281,
+     285,   289,   290,   291,   298,   299,   300,   301,   302,   303,
+     304,   305,   306,   307,   308,   309,   310,   311,   312,   313,
+     314,   315,   316,   317,   318,   319,   320,   321,   322,   323,
+     324,   325,   326,   327,   328,   329,   330,   331,   332,   333,
+     334,   335,   336,   337,   338,   339,   340,   341,   342,   343,
+     344,   345,   346,   347,   348,   349,   350,   353,   354,   355,
+     356,   357,   358,   359,   360,   361,   362,   363,   364,   365,
+     366,   367,   368,   369,   370,   371,   374,   375,   376,   379,
+     383,   393,   394,   397,   398,   399,   400,   401,   402,   405,
+     406,   407,   410,   411,   412,   413,   414,   415,   416,   417,
+     422,   423,   424,   425,   426,   427,   430,   433,   438,   442,
+     448,   453,   456,   461,   467,   467,   473,   478,   484,   490,
+     496,   504,   505,   506,   507,   510,   510,   512,   513,   514,
+     517,   521,   525,   531,   535,   539,   543,   544,   546,   548,
+     550,   552,   556,   560,   564,   566,   567,   571,   577,   584,
+     585,   588,   589,   593,   599,   606,   607,   613,   614,   615,
+     616,   617,   618,   619,   620,   621,   622,   623,   624,   625,
+     628,   630,   631,   634,   635,   638,   639,   640,   642,   644,
+     646,   648,   650,   652,   654,   656,   659,   660,   661,   662,
+     665,   666,   669,   674,   677,   682,   688,   689,   690,   691,
+     692,   695,   696,   697,   698,   699,   702,   704,   705,   706,
+     707,   708,   709,   710,   711,   712,   713,   717,   718,   719,
+     720,   721,   724,   724,   726,   727,   730,   731,   732,   733,
+     734,   737,   738,   739,   742,   746,   751,   752,   753,   756,
+     757,   760,   761,   765,   766,   767,   768,   769,   770,   771,
+     772,   773,   774,   775,   776,   777,   778,   779,   780,   781,
+     782,   783,   790,   791,   792,   793,   794,   795,   796,   797,
+     798,   799,   800,   801,   802,   803,   804,   805,   806,   807,
+     808,   811,   812,   813,   814,   815,   816,   817,   818,   819,
+     820,   821,   822,   823,   824,   825,   826,   827,   828,   831,
+     832,   835,   836,   839,   843
 };
 #endif
 
@@ -813,7 +813,7 @@ static const yytype_int16 yytoknum[] =
 };
 #endif
 
-#define YYPACT_NINF (-518)
+#define YYPACT_NINF (-524)
 
 #define yypact_value_is_default(Yyn) \
   ((Yyn) == YYPACT_NINF)
@@ -827,67 +827,67 @@ static const yytype_int16 yytoknum[] =
      STATE-NUM.  */
 static const yytype_int16 yypact[] =
 {
-    2949,  -518,  -518,  -518,  -518,  -518,    26,  -518,   -17,  -518,
-    3528,  1866,    26,  1965,  -518,  -518,  3528,  -518,     7,  -518,
-    -518,  2064,    41,  3609,  -518,  3528,  -518,  -518,  3528,  2064,
-    1866,  3528,  -518,  -518,  -518,  -518,  -518,  -518,  -518,  -518,
-    -518,  -518,  -518,  -518,  -518,  -518,  -518,  -518,  -518,  -518,
-    -518,  -518,  -518,  -518,  -518,  -518,  -518,  -518,  -518,  -518,
-    -518,  -518,  -518,  -518,  -518,  1965,  3528,  3528,   -50,  3851,
-    -518,    51,  2949,  -518,  -518,  -518,  -518,  2064,  -518,  -518,
-    -518,  -518,  -518,  -518,  -518,  -518,  -518,  -518,  -518,  2163,
-    2163,  1965,  1965,  1965,  1965,    -7,   -37,   -31,  -518,  -518,
-    -518,  -518,  -518,  -518,  -518,  -518,  -518,  -518,  -518,  -518,
-    -518,  -518,  -518,  -518,  -518,  -518,  -518,  -518,  -518,  -518,
-    -518,  -518,  -518,  -518,  -518,    23,    -1,  -518,  -518,  -518,
-    -518,  2163,  2163,  2163,  2163,  1965,  1965,  2262,  1965,  1965,
-    1965,  1965,  3690,  1965,  2262,  2262,  1371,   775,     3,    25,
-      34,  -518,  -518,  -518,  -518,  -518,  -518,  -518,  -518,  -518,
-    -518,   876,  -518,    52,  1965,  4078,  3528,    75,    77,   975,
-    3528,  1965,  3528,  -518,  -518,    -4,  -518,    61,    78,    82,
-    1074,    90,    92,   101,  4045,   108,  3528,  -518,  -518,  -518,
-    -518,   109,  1173,  1470,  -518,  -518,  -518,   434,   555,   681,
-    3904,   160,  -518,  -518,  -518,  3528,  -518,  -518,  1272,  4388,
-    -518,   -32,   -11,    -5,    17,    20,   160,    95,   180,  4359,
-    -518,  -518,  -518,   612,    85,   111,   118,    58,   -10,  -518,
-    4388,   121,   126,  1569,  -518,  -518,   204,  1965,  1965,  1965,
-    1965,  2658,  2658,  2856,  1965,  2757,  2757,  1965,  1965,  1965,
-    1965,  1965,  1965,  1965,  1965,  -518,  -518,  4160,  -518,  -518,
-    4132,  3030,  1965,  1965,  1965,  1965,  1965,   131,  -518,  -518,
-    3771,  3771,  3771,     4,  4191,   206,  -518,  -518,  1965,  1965,
-     -42,  -518,  1965,  -518,  -518,  -518,  3851,  3111,  -518,   138,
-    -518,  -518,  4101,  2262,  1965,  2262,  1965,  2262,  1965,  2262,
-    1965,  -518,  -518,  -518,  -518,    18,  -518,   214,  4413,  -518,
-    -518,  -518,  -518,  -518,  -518,  -518,  -518,  -518,  -518,  2361,
-    2460,  2262,  2262,  1668,  -518,  1965,  1965,  -518,  1965,  3447,
-    -518,  -518,  1965,  -518,   143,  1965,    72,    72,    72,    72,
-      91,    91,  -518,    35,    72,    72,    72,    72,    35,   -33,
-     -33,  -518,  -518,   143,  1965,  1965,  1965,  1965,  1965,  1965,
-    1965,  1965,  1965,  1965,  1965,  1965,  1965,  1965,  1965,  1965,
-    1965,  1965,  -518,  3354,   228,  3111,    -7,  -518,   147,  -518,
-     148,   149,  1965,  1965,  3111,  2559,  4217,  4388,  3528,  -518,
-    -518,  -518,   -42,  -518,  4247,  -518,  -518,  -518,   161,  3111,
-    -518,  3111,  1767,  -518,  3917,  -518,  3937,  -518,  3991,  -518,
-    4011,  -518,  -518,  2262,  1965,    18,    18,    18,    18,  2262,
-    2262,    18,  2262,  2262,  -518,  -518,  -518,  -518,  -518,  -518,
-    -518,   143,  4388,  4388,  4388,    85,   111,   150,  -518,  4388,
-    1965,   152,  4388,  -518,    72,    72,    72,    72,    91,    91,
-    -518,    35,    72,    72,    72,    72,    35,   -33,   -33,  -518,
-    -518,   143,  -518,  -518,    -6,  3354,  -518,  3192,  -518,  -518,
-    -518,  -518,  4273,   358,   169,  1965,  1965,  1965,  1965,  -518,
-    -518,  -518,  3528,  -518,  -518,   159,  -518,   249,  -518,   143,
-    2262,  2262,  2262,  2262,  -518,  4388,  2262,  2262,  2262,  2262,
-    -518,   235,   197,  -518,  -518,   171,  -518,  -518,  3273,   172,
-    -518,  -518,  3354,  -518,  3111,   238,  1965,   183,  -518,  4442,
-    -518,  4024,  4442,  4442,   185,  -518,  3528,   181,  -518,  -518,
-    -518,  -518,  -518,  -518,  -518,  -518,   212,  2262,  -518,  -518,
-    3354,  -518,  -518,   203,   201,  1965,  4303,  -518,  1965,  1965,
-    1965,  1965,  1965,  1965,  1965,  1965,  1965,  1965,  1965,  1965,
-    1965,  1965,  1965,  1965,   220,  3111,     2,  -518,  -518,  2262,
-     203,  -518,   195,  4329,  3111,    99,    99,    99,   184,   184,
-    -518,    76,    99,    99,    99,    99,    76,   -26,   -26,  -518,
-    -518,  1965,  -518,  -518,  3528,  -518,  -518,  -518,  3111,   207,
-    4442,  -518,   208,   198,   199,  -518,  -518
+    2942,  -524,  -524,  -524,  -524,  -524,     7,  -524,   -19,  -524,
+    3521,  1859,     7,  1958,  -524,  -524,  3521,  -524,     3,  -524,
+    -524,  2057,    83,  3602,  -524,  -524,  -524,  -524,  3521,  2057,
+    1859,  3521,  -524,  -524,  -524,  -524,  -524,  -524,  -524,  -524,
+    -524,  -524,  -524,  -524,  -524,  -524,  -524,  -524,  -524,  -524,
+    -524,  -524,  -524,  -524,  -524,  -524,  -524,  -524,  -524,  -524,
+    -524,  -524,  -524,  -524,  -524,  1958,  3521,  3521,   -73,  3844,
+    -524,    46,  2942,  -524,  -524,  -524,  -524,  2057,  -524,  -524,
+    -524,  -524,  -524,  -524,  -524,  -524,  -524,  -524,  -524,  2156,
+    2156,  1958,  1958,  1958,  1958,     4,   -28,   -17,  -524,  -524,
+    -524,  -524,  -524,  -524,  -524,  -524,  -524,  -524,  -524,  -524,
+    -524,  -524,  -524,  -524,  -524,  -524,  -524,  -524,  -524,  -524,
+    -524,  -524,  -524,  -524,    25,   -49,  -524,  -524,  -524,  -524,
+    2156,  2156,  2156,  2156,  1958,  1958,  2255,  1958,  1958,  1958,
+    1958,  3683,  1958,  2255,  2255,  1364,   768,   -36,    27,    30,
+    -524,  -524,  -524,  -524,  -524,  -524,  -524,  -524,  -524,  -524,
+     869,  -524,    33,  1958,   355,  3521,    50,    53,   968,  3521,
+    1958,  3521,  -524,  -524,   -14,  -524,    66,    80,  1067,    81,
+      93,    94,  4081,    99,  3521,  -524,  -524,  -524,  -524,   104,
+    1166,  1463,  -524,  -524,  -524,   606,   674,  3897,  3919,   101,
+    -524,  -524,  -524,  3521,  -524,  -524,  1265,  4446,  -524,   -21,
+      -4,    24,    26,    52,   101,    48,    55,  4392,  -524,  -524,
+    -524,  4113,    -9,   103,    47,   -76,   -48,  -524,  4446,   102,
+     109,  1562,  -524,  -524,   182,  1958,  1958,  1958,  1958,  2651,
+    2651,  2849,  1958,  2750,  2750,  1958,  1958,  1958,  1958,  1958,
+    1958,  1958,  1958,  -524,  -524,  4209,  -524,  -524,  4196,  3023,
+    1958,  1958,  1958,  1958,  1958,   113,  -524,  -524,  3764,  3764,
+    3764,    -1,  4222,   184,  -524,  -524,  1958,   -59,  -524,  1958,
+    -524,  -524,  -524,  3844,  3104,  -524,   114,  -524,  -524,  4137,
+    2255,  1958,  2255,  1958,  2255,  1958,  2255,  1958,  -524,  -524,
+    -524,  -524,    17,  -524,   187,  4459,  -524,  -524,  -524,  -524,
+    -524,  -524,  -524,  -524,  -524,  -524,  2354,  2453,  2255,  2255,
+    1661,  -524,  1958,  1958,  -524,  1958,  3440,  -524,  -524,  1958,
+    -524,   116,  1958,    74,    74,    74,    74,    90,    90,  -524,
+     -34,    74,    74,    74,    74,   -34,   -42,   -42,  -524,  -524,
+     116,  1958,  1958,  1958,  1958,  1958,  1958,  1958,  1958,  1958,
+    1958,  1958,  1958,  1958,  1958,  1958,  1958,  1958,  1958,  -524,
+    3347,   203,  3104,     4,  -524,   122,  -524,   123,   124,  1958,
+    1958,  3104,  2552,  4278,  3521,  -524,  -524,  -524,   -59,  -524,
+    4291,  -524,  -524,  -524,   135,  3104,  -524,  3104,  1760,  -524,
+    3951,  -524,  3973,  -524,  4005,  -524,  4027,  -524,  -524,  2255,
+    1958,    17,    17,    17,    17,  2255,  2255,    17,  2255,  2255,
+    -524,  -524,  -524,  -524,  -524,  -524,  -524,   116,  4446,  4446,
+    4446,    -9,   103,   126,  -524,  4446,  1958,   133,  4446,  -524,
+      74,    74,    74,    74,    90,    90,  -524,   -34,    74,    74,
+      74,    74,   -34,   -42,   -42,  -524,  -524,   116,  -524,  -524,
+      -6,  3347,  -524,  3185,  -524,  -524,  -524,  -524,  4304,   429,
+     152,  1958,  1958,  1958,  1958,  -524,  -524,  -524,  3521,  -524,
+    -524,   143,  -524,   233,  -524,   116,  2255,  2255,  2255,  2255,
+    -524,  4446,  2255,  2255,  2255,  2255,  -524,   215,   178,  -524,
+    -524,   153,  -524,  -524,  3266,   157,  -524,  -524,  3347,  -524,
+    3104,   222,  1958,   164,  -524,  4472,  -524,  4059,  4472,  4472,
+     166,  -524,  3521,   165,  -524,  -524,  -524,  -524,  -524,  -524,
+    -524,  -524,   195,  2255,  -524,  -524,  3347,  -524,  -524,   185,
+     193,  1958,  4360,  -524,  1958,  1958,  1958,  1958,  1958,  1958,
+    1958,  1958,  1958,  1958,  1958,  1958,  1958,  1958,  1958,  1958,
+     200,  3104,    43,  -524,  -524,  2255,   185,  -524,   186,  4373,
+    3104,   198,   198,   198,   183,   183,  -524,    -7,   198,   198,
+     198,   198,    -7,    -3,    -3,  -524,  -524,  1958,  -524,  -524,
+    3521,  -524,  -524,  -524,  3104,   202,  4472,  -524,   208,   188,
+     216,  -524,  -524
 };
 
   /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
@@ -896,90 +896,90 @@ static const yytype_int16 yypact[] =
 static const yytype_int16 yydefact[] =
 {
        0,    24,    31,    38,    62,    72,    36,    37,     0,    39,
-      97,   127,    40,     0,    41,    43,     0,    54,    55,    58,
-      60,   127,    61,     0,    70,     0,    73,    71,     0,   127,
-     127,    97,    29,    59,    56,    53,    28,    30,    34,    67,
+      96,   126,    40,     0,    41,    43,     0,    54,    55,    58,
+      60,   126,    61,     0,    70,   164,    73,    71,     0,   126,
+     126,    96,    29,    59,    56,    53,    28,    30,    34,    67,
       32,    33,    44,    45,    47,    48,    75,    76,    25,    26,
       27,    49,    64,    35,    46,    50,    51,    52,    57,    68,
-      69,    65,    66,    42,    74,     0,    97,     0,     0,    63,
-       5,     0,     2,     3,     6,     7,     8,   127,     9,   102,
-     104,   110,   111,   112,   105,   106,   107,   108,   109,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   123,    79,
+      69,    65,    66,    42,    74,     0,    96,     0,     0,    63,
+       5,     0,     2,     3,     6,     7,     8,   126,     9,   101,
+     103,   109,   110,   111,   104,   105,   106,   107,   108,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   122,    79,
       36,    78,    80,    82,    83,    40,    84,    86,    55,    92,
-      61,    93,    95,    96,    81,    89,    90,    85,    94,    91,
-      88,    87,    63,    77,   100,     0,    98,   178,   179,   181,
-     180,    31,    38,    62,    72,    39,    54,    56,    32,    44,
-      47,    75,    68,    66,     0,     0,     0,   322,   191,     0,
-       0,   262,   186,   187,   188,   189,   220,   221,   190,   263,
-     264,   135,   265,     0,     0,     0,    97,     0,     0,   135,
-       0,     0,    68,   191,   194,     0,   195,     0,     0,     0,
-     135,     0,     0,     0,     0,     0,    97,   103,   126,     1,
-       4,     0,   135,     0,   197,   213,   196,     0,     0,     0,
-       0,     0,   124,   122,   148,    99,   211,   212,   137,   138,
-     182,    25,    26,    27,    49,    64,    46,    57,   217,     0,
-     260,   261,   132,     0,   181,   180,     0,   191,     0,   255,
-     324,     0,   323,     0,   115,   116,    58,     0,     0,     0,
-       0,    29,    59,    53,     0,    34,    67,     0,     0,     0,
-       0,     0,     0,     0,   136,   128,   283,   135,   284,   125,
-       0,     0,     0,     0,     0,     0,     0,     0,   121,   114,
-      43,    28,    30,     0,     0,   245,   146,   147,     0,     0,
-      13,   119,    73,   117,   118,   150,     0,   166,   149,     0,
-     113,   214,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   207,   209,   210,   208,     0,   101,    58,   141,   228,
-     229,   230,   231,   232,   233,   234,   235,   236,   237,     0,
-       0,     0,     0,     0,   185,     0,     0,   253,     0,     0,
-     254,   252,     0,   183,   135,     0,   275,   276,   273,   274,
-     277,   278,   270,   280,   281,   282,   272,   271,   279,   266,
-     267,   268,   269,   135,     0,     0,     0,     0,     0,     0,
+      61,    93,    95,    81,    89,    90,    85,    94,    91,    88,
+      87,    63,    77,    99,     0,    97,   177,   178,   180,   179,
+      31,    38,    62,    72,    39,    54,    56,    32,    44,    47,
+      75,    68,    66,     0,     0,     0,   321,   190,     0,     0,
+     261,   185,   186,   187,   188,   219,   220,   189,   262,   263,
+     134,   264,     0,     0,     0,    96,     0,     0,   134,     0,
+       0,    68,   190,   193,     0,   194,     0,     0,   134,     0,
+       0,     0,     0,     0,    96,   102,   125,     1,     4,     0,
+     134,     0,   196,   212,   195,     0,     0,     0,     0,     0,
+     123,   121,   147,    98,   210,   211,   136,   137,   181,    25,
+      26,    27,    49,    64,    46,    57,   216,     0,   259,   260,
+     131,     0,   180,   179,     0,   190,     0,   254,   323,     0,
+     322,     0,   114,   115,    58,     0,     0,     0,     0,    29,
+      59,    53,     0,    34,    67,     0,     0,     0,     0,     0,
+       0,     0,   135,   127,   282,   134,   283,   124,     0,     0,
+       0,     0,     0,     0,     0,     0,   120,   113,    43,    28,
+      30,     0,     0,   244,   145,   146,     0,    13,   118,    73,
+     116,   117,   149,     0,   165,   148,     0,   112,   213,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   206,   208,
+     209,   207,     0,   100,    58,   140,   227,   228,   229,   230,
+     231,   232,   233,   234,   235,   236,     0,     0,     0,     0,
+       0,   184,     0,     0,   252,     0,     0,   253,   251,     0,
+     182,   134,     0,   274,   275,   272,   273,   276,   277,   269,
+     279,   280,   281,   271,   270,   278,   265,   266,   267,   268,
+     134,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   135,   129,
+     171,   150,   165,    68,   191,     0,   192,     0,     0,     0,
+       0,   165,     0,     0,     0,    17,    18,    11,    14,    15,
+       0,   162,   169,   170,     0,   166,   167,   165,     0,   197,
+       0,   201,     0,   203,     0,   199,     0,   242,   243,     0,
+       0,    33,    45,    48,    76,    50,    51,    52,    65,    66,
+     218,   222,   221,   217,   319,   320,   132,   134,   258,   256,
+     257,     0,     0,     0,   255,   324,   135,     0,   139,   128,
+     293,   294,   291,   292,   295,   296,   288,   298,   299,   300,
+     290,   289,   297,   284,   285,   286,   287,   134,   175,   176,
+     156,   172,   173,     0,    10,   141,   142,   143,     0,     0,
+       0,    50,    51,    65,    66,   245,   246,   144,    96,    16,
+     119,     0,   168,    20,   214,   134,     0,     0,     0,     0,
+     205,   138,     0,     0,     0,     0,   226,     0,     0,   224,
+     225,     0,   183,   130,     0,     0,   151,   174,   171,   152,
+     165,     0,     0,     0,   301,   247,   302,     0,   249,   250,
+       0,   163,    21,     0,   198,   202,   204,   200,   237,   239,
+     240,   238,     0,     0,   241,   133,   171,   154,   157,   156,
+       0,     0,     0,   158,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   136,   130,   172,   151,   166,    68,   192,     0,   193,
-       0,     0,     0,     0,   166,     0,     0,   165,     0,    17,
-      18,    11,    14,    15,     0,   163,   170,   171,     0,   167,
-     168,   166,     0,   198,     0,   202,     0,   204,     0,   200,
-       0,   243,   244,     0,     0,    33,    45,    48,    76,    50,
-      51,    52,    65,    66,   219,   223,   222,   218,   320,   321,
-     133,   135,   259,   257,   258,     0,     0,     0,   256,   325,
-     136,     0,   140,   129,   294,   295,   292,   293,   296,   297,
-     289,   299,   300,   301,   291,   290,   298,   285,   286,   287,
-     288,   135,   176,   177,   157,   173,   174,     0,    10,   142,
-     143,   144,     0,     0,     0,    50,    51,    65,    66,   246,
-     247,   145,    97,    16,   120,     0,   169,    20,   215,   135,
-       0,     0,     0,     0,   206,   139,     0,     0,     0,     0,
-     227,     0,     0,   225,   226,     0,   184,   131,     0,     0,
-     152,   175,   172,   153,   166,     0,     0,     0,   302,   248,
-     303,     0,   250,   251,     0,   164,    21,     0,   199,   203,
-     205,   201,   238,   240,   241,   239,     0,     0,   242,   134,
-     172,   155,   158,   157,     0,     0,     0,   159,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   166,     0,    22,   216,     0,
-     157,   154,     0,     0,   166,   312,   313,   311,   314,   315,
-     308,   317,   318,   319,   310,   309,   316,   304,   305,   306,
-     307,     0,    12,    19,     0,   224,   156,   162,   166,     0,
-     249,    23,     0,     0,     0,   160,   161
+       0,   165,     0,    22,   215,     0,   156,   153,     0,     0,
+     165,   311,   312,   310,   313,   314,   307,   316,   317,   318,
+     309,   308,   315,   303,   304,   305,   306,     0,    12,    19,
+       0,   223,   155,   161,   165,     0,   248,    23,     0,     0,
+       0,   159,   160
 };
 
   /* YYPGOTO[NTERM-NUM].  */
 static const yytype_int16 yypgoto[] =
 {
-    -518,  -518,  -518,   227,  -518,  -518,  -518,  -518,  -518,   -75,
-    -518,  -518,     0,    -8,   -25,  -518,     5,  -360,   -62,  -518,
-      -2,  -256,   288,  -518,  -518,  -518,  -518,  -518,  -517,  -518,
-    -518,  -518,  -354,  -518,   -80,  -488,  -518,  -145,  -147,   -19,
-    -128,  -518,    -3,  -518,  -518,   -78,  -518,    10,  -180,  -518,
-    -518,  -203,  -518,  -518,  -518,  -518,     8,  -518,   202,    63,
-     115,  -442,    80,  -518,  -223
+    -524,  -524,  -524,   214,  -524,  -524,  -524,  -524,  -524,   -74,
+    -524,  -524,     0,    -8,   -25,  -524,     5,  -358,   -65,  -524,
+       9,  -252,   286,  -524,  -524,  -524,  -524,  -524,  -523,  -524,
+    -524,  -524,  -344,  -524,   -78,  -487,  -524,  -142,    51,   -22,
+    -169,  -524,     1,  -524,  -524,    41,  -524,    10,  -178,  -524,
+    -524,  -223,  -524,  -524,  -524,  -524,    -5,  -524,   199,    62,
+     127,  -439,    76,  -524,  -221
 };
 
   /* YYDEFGOTO[NTERM-NUM].  */
 static const yytype_int16 yydefgoto[] =
 {
-       0,    71,    72,    73,    74,    75,   390,   391,   392,   393,
-      76,   566,   123,   148,   125,   126,   397,    79,    80,    81,
-     149,   255,   150,    82,   278,    83,    84,    85,   510,    86,
-      87,    88,   398,   399,   400,   464,   465,   466,   151,   152,
-     378,   175,   153,   305,   154,   194,   155,   424,   425,   156,
-     157,   413,   176,   479,   158,   228,   229,   159,   160,   230,
-     257,   519,   162,   231,   232
+       0,    71,    72,    73,    74,    75,   386,   387,   388,   389,
+      76,   562,   122,   147,   124,   125,   393,    79,    80,    81,
+     148,   253,   149,    82,   276,    83,    84,    85,   506,    86,
+      87,    88,   394,   395,   396,   460,   461,   462,   150,   151,
+     375,   174,   152,   302,   153,   192,   154,   420,   421,   155,
+     156,   409,   175,   475,   157,   226,   227,   158,   159,   228,
+     255,   515,   161,   229,   230
 };
 
   /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM.  If
@@ -987,336 +987,311 @@ static const yytype_int16 yydefgoto[] =
      number is the opposite.  If YYTABLE_NINF, syntax error.  */
 static const yytype_int16 yytable[] =
 {
-      77,   372,   124,    96,   174,    78,   183,   188,   166,   163,
-     334,   508,   196,   463,   256,   173,    97,   177,   264,   168,
-     178,   468,   256,   124,   543,   553,   571,   179,   181,   382,
-     474,   353,   276,   256,   521,   522,   523,    89,    90,   309,
-     167,   185,   277,   411,   388,   256,   310,   487,   412,   187,
-     383,   189,   570,   596,   196,   206,   207,   389,   124,   186,
-     311,   256,   202,   252,   253,   201,   313,   312,   203,    77,
-     562,   563,    77,   314,   161,   191,   165,    78,   441,   170,
-     171,   509,    98,    91,   169,    92,   264,    93,   315,    94,
-     329,   317,   180,   161,   330,   316,   279,   443,   318,   205,
-     431,   593,   594,    95,   233,   463,   575,   576,   577,   578,
-     579,   580,   581,   582,   583,   584,   585,   586,   587,   588,
-     589,   590,   204,   264,   234,   319,   244,   553,   184,   250,
-     251,   252,   253,   235,   218,   237,   238,   239,   240,   227,
-     192,   267,   264,   380,   381,   244,   265,   266,   461,   600,
-     553,   259,   463,   554,   197,   198,   199,   200,   124,   233,
-     544,   289,   273,   328,   275,   249,   250,   251,   252,   253,
-     560,   561,   562,   563,   268,   505,   269,   280,   124,   489,
-     463,   281,   247,   248,   249,   250,   251,   252,   253,   283,
-     325,   284,   559,   560,   561,   562,   563,   306,   208,   209,
-     285,   197,   198,   199,   200,   507,   219,   288,   290,   223,
-     320,   592,   496,   497,   498,   499,   326,   301,   502,   302,
-     599,   303,   327,   304,   395,   331,   332,   260,   548,   549,
-     375,   550,   335,   527,   274,   553,   385,   401,   554,   555,
-     556,   258,   414,   440,   602,   467,   469,   470,   471,   258,
-     485,   377,   377,   377,   506,   328,   292,   517,   525,   526,
-     258,    77,   173,   173,   173,   536,   374,   379,   379,   379,
-     537,   542,   258,   539,   545,   557,   558,   559,   560,   561,
-     562,   563,   547,   568,   565,   569,    77,    77,   258,   572,
-     509,   195,   195,   591,   597,   603,   604,   605,   606,   190,
+      77,   173,   123,   369,   186,    78,   181,    96,   165,   262,
+     331,   504,   459,   162,    97,   172,   567,   262,    89,    90,
+     176,   539,   274,   123,   379,   231,   185,   384,   464,   325,
+     167,   350,   275,   517,   518,   519,   166,   470,   177,   179,
+     385,   183,   407,   592,   549,   380,   187,   408,   549,   566,
+     306,   203,   326,   483,   250,   251,   327,   307,   123,   184,
+     248,   249,   250,   251,    91,   231,    92,   308,    93,    77,
+      94,   200,    77,   160,   309,   164,   199,    78,   316,   437,
+      98,   505,   201,   168,    95,   317,   189,   556,   557,   558,
+     559,   178,   160,   558,   559,   310,   322,   312,   439,   427,
+     377,   378,   311,   459,   313,   571,   572,   573,   574,   575,
+     576,   577,   578,   579,   580,   581,   582,   583,   584,   585,
+     586,   169,   170,   314,   202,   262,   232,   182,   242,   233,
+     315,   194,   257,   216,   235,   236,   237,   238,   225,   190,
+     265,   262,   589,   590,   242,   263,   264,   457,   596,   266,
+     459,   324,   267,   195,   196,   197,   198,   123,   298,   286,
+     299,   271,   300,   273,   301,   277,   540,   247,   248,   249,
+     250,   251,   194,   204,   205,   501,   123,   485,   459,   278,
+     280,   245,   246,   247,   248,   249,   250,   251,   492,   493,
+     494,   495,   281,   282,   498,   303,   206,   207,   285,   195,
+     196,   197,   198,   287,   217,   503,   328,   221,   323,   329,
+     332,   254,   372,   397,   382,   410,   436,   588,   391,   254,
+     463,   465,   466,   467,   481,   258,   595,   544,   545,   254,
+     546,   325,   272,   523,   549,   502,   256,   550,   551,   552,
+     513,   254,   521,   522,   256,   532,   374,   374,   374,   549,
+     598,   533,   550,   289,   256,   535,   538,   254,   541,    77,
+     172,   172,   172,   543,   371,   561,   256,   564,   565,   376,
+     376,   376,   505,   587,   553,   554,   555,   556,   557,   558,
+     559,   568,   256,    77,    77,   593,   188,   601,   193,   193,
+     599,   555,   556,   557,   558,   559,   600,   333,   334,   335,
      336,   337,   338,   339,   340,   341,   342,   343,   344,   345,
-     346,   347,   348,   349,   350,   351,   352,   483,   182,   486,
-     511,   437,   538,   308,     0,   340,   341,   342,   344,   345,
-     427,     0,     0,   195,   195,   195,   195,   438,     0,   210,
-       0,   386,   387,     0,     0,   394,   220,   221,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   404,     0,   406,
-       0,   408,     0,   410,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,    77,   515,    77,     0,     0,     0,     0,
-     482,     0,     0,     0,    77,     0,     0,     0,   432,   433,
-       0,   434,     0,     0,   516,   439,     0,     0,   442,    77,
-       0,    77,   237,   238,   239,   240,   262,   263,     0,   264,
-       0,     0,   244,   265,   266,     0,     0,   444,   445,   446,
+     346,   347,   348,   349,   479,   602,   180,   482,   433,   507,
+     534,   434,   337,   338,   339,   341,   342,   423,     0,   193,
+     193,   193,   193,   305,     0,   208,     0,     0,   383,     0,
+       0,   390,   218,   219,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   400,     0,   402,     0,   404,     0,   406,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+      77,     0,    77,     0,     0,     0,   478,     0,     0,     0,
+       0,    77,     0,     0,   428,   429,     0,   430,     0,     0,
+     259,   435,     0,     0,   438,    77,     0,    77,     0,   235,
+     236,   237,   238,   260,   261,     0,   262,     0,     0,   242,
+     263,   264,     0,   440,   441,   442,   443,   444,   445,   446,
      447,   448,   449,   450,   451,   452,   453,   454,   455,   456,
-     457,   458,   459,   460,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   472,   473,     0,     0,   247,
-     248,   249,   250,   251,   252,   253,     0,   524,     0,     0,
-       0,     0,     0,     0,   293,    77,     0,    77,     0,     0,
-     294,     0,   513,     0,   124,     0,     0,   495,   237,   238,
-     239,   240,   262,   263,     0,   264,     0,     0,   244,   265,
-     266,     0,     0,     0,     0,   403,     0,   405,     0,   407,
-       0,   409,     0,   439,     0,     0,     0,     0,    77,     0,
-       0,     0,    77,   541,    77,     0,     0,     0,   567,     0,
-       0,   426,   426,   428,   429,   247,   248,   249,   250,   251,
-     252,   253,     0,     0,     0,     0,     0,     0,     0,     0,
-      77,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   520,   520,   520,   520,     0,
-       0,     0,     0,     0,     0,    77,     0,     0,     0,     0,
-       0,     0,     0,     0,    77,     0,     0,     0,     0,   546,
-       0,     0,     0,     0,     0,   295,   601,   480,     0,     0,
-       0,   296,     0,     0,     0,     0,     0,     0,    77,   237,
-     238,   239,   240,   262,   263,     0,   264,     0,   573,   244,
-     265,   266,     0,     0,     0,   494,     0,     0,     0,     0,
-       0,   500,   501,     0,   503,   504,     0,     0,   520,   520,
-     520,   520,   520,   520,   520,   520,   520,   520,   520,   520,
-     520,   520,   520,   520,     0,     0,   247,   248,   249,   250,
-     251,   252,   253,     0,     0,     0,   237,   238,   239,   240,
-     262,   263,     0,   264,     0,     0,   244,   265,   266,     0,
-       0,   520,     0,     0,     0,     0,     0,   518,   518,   518,
-     518,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   528,   529,   530,   531,     0,     0,   532,   533,
-     534,   535,     0,   247,   248,   249,   250,   251,   252,   253,
-       0,   297,   323,     0,   324,     0,     0,   298,     0,     0,
-       0,     0,     0,     0,     0,   237,   238,   239,   240,   262,
-     263,     0,   264,     0,     0,   244,   265,   266,     0,   500,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     518,   518,   518,   518,   518,   518,   518,   518,   518,   518,
-     518,   518,   518,   518,   518,   518,     0,     0,     0,     0,
-       0,   595,   247,   248,   249,   250,   251,   252,   253,     0,
-     127,   128,     1,   224,   225,    99,   131,   132,   133,   134,
-     100,     7,   101,   518,   102,     9,   103,   104,   105,   106,
-      14,    15,   107,    17,   108,    19,    20,   109,   110,   111,
-     112,    24,   113,    26,    27,   114,   115,   116,   117,     0,
-       0,     0,     0,    32,    33,   137,    35,    36,    37,     0,
-      38,    39,   138,    41,   139,    43,   140,    45,   141,    47,
-      48,    49,    50,    51,    52,     0,    53,    54,    55,    56,
-      57,    58,   142,    60,    61,   143,    63,    64,   118,   119,
-     120,   121,     0,     0,     0,   122,     0,     0,     0,   144,
-     145,     0,     0,     0,     0,     0,   164,     0,   147,     0,
-     226,   127,   128,     1,   129,   130,    99,   131,   132,   133,
-     134,   100,     7,   101,     0,   102,     9,   103,   104,   105,
-     106,    14,    15,   107,    17,   108,   236,    20,   109,   110,
-     111,   112,    24,   113,    26,    27,   114,   115,   116,   117,
-     237,   238,   239,   240,   241,   242,   137,   243,    36,    37,
-     244,   245,   246,   138,    41,   139,    43,   140,    45,   141,
+       0,   468,   469,     0,     0,   511,   245,   246,   247,   248,
+     249,   250,   251,   520,     0,     0,     0,     0,     0,     0,
+       0,    77,     0,    77,     0,   512,     0,     0,   509,     0,
+     123,     0,   491,   235,   236,   237,   238,   260,   261,     0,
+     262,     0,     0,   242,   263,   264,     0,     0,     0,   399,
+       0,   401,     0,   403,     0,   405,     0,     0,   435,     0,
+       0,     0,     0,     0,    77,     0,     0,     0,    77,   537,
+      77,     0,     0,     0,   563,   422,   422,   424,   425,     0,
+     245,   246,   247,   248,   249,   250,   251,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,    77,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   516,   516,   516,
+     516,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,    77,     0,     0,     0,     0,     0,     0,     0,     0,
+      77,     0,     0,     0,   542,     0,     0,     0,     0,     0,
+       0,   476,   597,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,    77,     0,     0,     0,     0,     0,
+       0,     0,     0,   569,     0,     0,     0,     0,   490,     0,
+       0,     0,     0,     0,   496,   497,     0,   499,   500,     0,
+     516,   516,   516,   516,   516,   516,   516,   516,   516,   516,
+     516,   516,   516,   516,   516,   516,   290,     0,     0,     0,
+       0,     0,   291,     0,     0,     0,     0,     0,     0,     0,
+     235,   236,   237,   238,   260,   261,     0,   262,     0,     0,
+     242,   263,   264,   516,     0,     0,     0,     0,     0,     0,
+     514,   514,   514,   514,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   524,   525,   526,   527,     0,
+       0,   528,   529,   530,   531,     0,     0,   245,   246,   247,
+     248,   249,   250,   251,   292,     0,     0,     0,     0,     0,
+     293,     0,     0,     0,     0,     0,     0,     0,   235,   236,
+     237,   238,   260,   261,     0,   262,     0,     0,   242,   263,
+     264,     0,   496,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   514,   514,   514,   514,   514,   514,   514,
+     514,   514,   514,   514,   514,   514,   514,   514,   514,     0,
+       0,     0,     0,     0,   591,   245,   246,   247,   248,   249,
+     250,   251,     0,   126,   127,     1,   222,   223,    99,   130,
+     131,   132,   133,   100,     7,   101,   514,   102,     9,   103,
+     104,   105,   106,    14,    15,   107,    17,   108,    19,    20,
+     109,   110,   111,   112,    24,     0,    26,    27,   113,   114,
+     115,   116,     0,     0,     0,     0,    32,    33,   136,    35,
+      36,    37,     0,    38,    39,   137,    41,   138,    43,   139,
+      45,   140,    47,    48,    49,    50,    51,    52,     0,    53,
+      54,    55,    56,    57,    58,   141,    60,    61,   142,    63,
+      64,   117,   118,   119,   120,     0,     0,     0,   121,     0,
+       0,     0,   143,   144,     0,     0,     0,     0,     0,   163,
+       0,   146,     0,   224,   126,   127,     1,   128,   129,    99,
+     130,   131,   132,   133,   100,     7,   101,     0,   102,     9,
+     103,   104,   105,   106,    14,    15,   107,    17,   108,   234,
+      20,   109,   110,   111,   112,    24,     0,    26,    27,   113,
+     114,   115,   116,   235,   236,   237,   238,   239,   240,   136,
+     241,    36,    37,   242,   243,   244,   137,    41,   138,    43,
+     139,    45,   140,    47,    48,    49,    50,    51,    52,     0,
+      53,    54,    55,    56,    57,    58,   141,    60,    61,   142,
+      63,    64,   117,   118,   119,   120,     0,     0,     0,   121,
+     245,   246,   247,   248,   249,   250,   251,     0,     0,   252,
+     163,     0,   146,   126,   127,     1,   128,   129,    99,   130,
+     131,   132,   133,   100,     7,   101,     0,   102,     9,   103,
+     104,   105,   106,    14,   268,   107,    17,   108,    19,    20,
+     109,   110,   111,   112,    24,     0,    26,    27,   113,   114,
+     115,   116,   235,   236,   237,   238,   239,   240,   136,   241,
+     269,   270,   242,   243,   244,   137,    41,   138,    43,   139,
+      45,   140,    47,    48,    49,    50,    51,    52,     0,    53,
+      54,    55,    56,    57,    58,   141,    60,    61,   142,    63,
+      64,   117,   118,   119,   120,     0,     0,     0,   121,   245,
+     246,   247,   248,   249,   250,   251,     0,     0,   252,   163,
+       0,   146,   126,   127,     1,   128,   129,    99,   130,   131,
+     132,   133,   100,     7,   101,     0,   102,     9,   103,   104,
+     105,   106,    14,    15,   107,    17,   108,    19,    20,   109,
+     110,   111,   112,    24,     0,   279,    27,   113,   114,   115,
+     116,   235,   236,   237,   238,   239,   240,   136,   241,    36,
+      37,   242,   243,   244,   137,    41,   138,    43,   139,    45,
+     140,    47,    48,    49,    50,    51,    52,     0,    53,    54,
+      55,    56,    57,    58,   141,    60,    61,   142,    63,    64,
+     117,   118,   119,   120,     0,     0,     0,   121,   245,   246,
+     247,   248,   249,   250,   251,     0,     0,   252,   163,     0,
+     146,   126,   127,     1,   128,   129,    99,   130,   131,   132,
+     133,   100,     7,   101,     0,   102,     9,   103,   104,   105,
+     106,    14,    15,   107,    17,   108,    19,    20,   109,   110,
+     111,   112,    24,     0,    26,    27,   113,   114,   115,   116,
+     235,   236,   237,   238,   239,   240,   136,   241,    36,    37,
+     242,   243,   244,   137,    41,   138,    43,   139,    45,   140,
       47,    48,    49,    50,    51,    52,     0,    53,    54,    55,
-      56,    57,    58,   142,    60,    61,   143,    63,    64,   118,
-     119,   120,   121,     0,     0,     0,   122,   247,   248,   249,
-     250,   251,   252,   253,     0,     0,   254,   164,     0,   147,
-     127,   128,     1,   129,   130,    99,   131,   132,   133,   134,
+      56,    57,    58,   141,    60,    61,   142,    63,    64,   117,
+     118,   119,   120,     0,     0,     0,   121,   245,   246,   247,
+     248,   249,   250,   251,     0,     0,   252,   163,     0,   146,
+     126,   127,     1,   128,   129,    99,   130,   131,   132,   133,
      100,     7,   101,     0,   102,     9,   103,   104,   105,   106,
-      14,   270,   107,    17,   108,    19,    20,   109,   110,   111,
-     112,    24,   113,    26,    27,   114,   115,   116,   117,   237,
-     238,   239,   240,   241,   242,   137,   243,   271,   272,   244,
-     245,   246,   138,    41,   139,    43,   140,    45,   141,    47,
+      14,    15,   107,    17,   108,   304,    20,   109,   110,   111,
+     112,    24,     0,    26,    27,   113,   114,   115,   116,   235,
+     236,   237,   238,   239,   240,   136,   241,    36,    37,   242,
+     243,   244,   137,    41,   138,    43,   139,    45,   140,    47,
       48,    49,    50,    51,    52,     0,    53,    54,    55,    56,
-      57,    58,   142,    60,    61,   143,    63,    64,   118,   119,
-     120,   121,     0,     0,     0,   122,   247,   248,   249,   250,
-     251,   252,   253,     0,     0,   254,   164,     0,   147,   127,
-     128,     1,   129,   130,    99,   131,   132,   133,   134,   100,
+      57,    58,   141,    60,    61,   142,    63,    64,   117,   118,
+     119,   120,     0,     0,     0,   121,   245,   246,   247,   248,
+     249,   250,   251,     0,     0,     0,   163,     0,   146,   126,
+     127,     1,   128,   129,    99,   130,   131,   132,   133,   100,
        7,   101,     0,   102,     9,   103,   104,   105,   106,    14,
       15,   107,    17,   108,    19,    20,   109,   110,   111,   112,
-      24,   113,   282,    27,   114,   115,   116,   117,   237,   238,
-     239,   240,   241,   242,   137,   243,    36,    37,   244,   245,
-     246,   138,    41,   139,    43,   140,    45,   141,    47,    48,
+      24,     0,    26,    27,   113,   114,   115,   116,     0,     0,
+       0,     0,    32,    33,   136,    35,    36,    37,     0,    38,
+      39,   137,    41,   138,    43,   139,    45,   140,    47,    48,
       49,    50,    51,    52,     0,    53,    54,    55,    56,    57,
-      58,   142,    60,    61,   143,    63,    64,   118,   119,   120,
-     121,     0,     0,     0,   122,   247,   248,   249,   250,   251,
-     252,   253,     0,     0,   254,   164,     0,   147,   127,   128,
-       1,   129,   130,    99,   131,   132,   133,   134,   100,     7,
+      58,   141,    60,    61,   142,    63,    64,   117,   118,   119,
+     120,     0,     0,     0,   121,     0,     0,     0,   143,   144,
+       0,     0,     0,     0,     0,   163,   220,   146,   126,   127,
+       1,   128,   129,    99,   130,   131,   132,   133,   100,     7,
      101,     0,   102,     9,   103,   104,   105,   106,    14,    15,
      107,    17,   108,    19,    20,   109,   110,   111,   112,    24,
-     113,    26,    27,   114,   115,   116,   117,   237,   238,   239,
-     240,   241,   242,   137,   243,    36,    37,   244,   245,   246,
-     138,    41,   139,    43,   140,    45,   141,    47,    48,    49,
+       0,    26,    27,   113,   114,   115,   116,     0,     0,     0,
+       0,    32,    33,   136,    35,    36,    37,     0,    38,    39,
+     137,    41,   138,    43,   139,    45,   140,    47,    48,    49,
       50,    51,    52,     0,    53,    54,    55,    56,    57,    58,
-     142,    60,    61,   143,    63,    64,   118,   119,   120,   121,
-       0,     0,     0,   122,   247,   248,   249,   250,   251,   252,
-     253,     0,     0,   254,   164,     0,   147,   127,   128,     1,
-     129,   130,    99,   131,   132,   133,   134,   100,     7,   101,
+     141,    60,    61,   142,    63,    64,   117,   118,   119,   120,
+       0,     0,     0,   121,     0,     0,     0,   143,   144,     0,
+       0,     0,     0,     0,   163,   288,   146,   126,   127,     1,
+     128,   129,    99,   130,   131,   132,   133,   100,     7,   101,
        0,   102,     9,   103,   104,   105,   106,    14,    15,   107,
-      17,   108,   307,    20,   109,   110,   111,   112,    24,   113,
-      26,    27,   114,   115,   116,   117,   237,   238,   239,   240,
-     241,   242,   137,   243,    36,    37,   244,   245,   246,   138,
-      41,   139,    43,   140,    45,   141,    47,    48,    49,    50,
-      51,    52,     0,    53,    54,    55,    56,    57,    58,   142,
-      60,    61,   143,    63,    64,   118,   119,   120,   121,     0,
-       0,     0,   122,   247,   248,   249,   250,   251,   252,   253,
-       0,     0,     0,   164,     0,   147,   127,   128,     1,   129,
-     130,    99,   131,   132,   133,   134,   100,     7,   101,     0,
+      17,   108,    19,    20,   109,   110,   111,   112,    24,     0,
+      26,    27,   113,   114,   115,   116,     0,     0,     0,     0,
+      32,    33,   136,    35,    36,    37,     0,    38,    39,   137,
+      41,   138,    43,   139,    45,   140,    47,    48,    49,    50,
+      51,    52,     0,    53,    54,    55,    56,    57,    58,   141,
+      60,    61,   142,    63,    64,   117,   118,   119,   120,     0,
+       0,     0,   121,     0,     0,     0,   143,   144,     0,     0,
+       0,     0,     0,   163,   330,   146,   126,   127,     1,   128,
+     129,    99,   130,   131,   132,   133,   100,     7,   101,     0,
      102,     9,   103,   104,   105,   106,    14,    15,   107,    17,
-     108,    19,    20,   109,   110,   111,   112,    24,   113,    26,
-      27,   114,   115,   116,   117,     0,     0,     0,     0,    32,
-      33,   137,    35,    36,    37,     0,    38,    39,   138,    41,
-     139,    43,   140,    45,   141,    47,    48,    49,    50,    51,
-      52,     0,    53,    54,    55,    56,    57,    58,   142,    60,
-      61,   143,    63,    64,   118,   119,   120,   121,     0,     0,
-       0,   122,     0,     0,     0,   144,   145,     0,     0,     0,
-       0,     0,   164,   222,   147,   127,   128,     1,   129,   130,
-      99,   131,   132,   133,   134,   100,     7,   101,     0,   102,
+     108,    19,    20,   109,   110,   111,   112,    24,     0,    26,
+      27,   113,   114,   115,   116,     0,     0,     0,     0,    32,
+      33,   136,    35,    36,    37,     0,    38,    39,   137,    41,
+     138,    43,   139,    45,   140,    47,    48,    49,    50,    51,
+      52,     0,    53,    54,    55,    56,    57,    58,   141,    60,
+      61,   142,    63,    64,   117,   118,   119,   120,     0,     0,
+       0,   121,     0,     0,     0,   143,   144,     0,     0,     0,
+       0,     0,   163,   426,   146,   126,   127,     1,   128,   129,
+      99,   130,   131,   132,   133,   100,     7,   101,     0,   102,
        9,   103,   104,   105,   106,    14,    15,   107,    17,   108,
-      19,    20,   109,   110,   111,   112,    24,   113,    26,    27,
-     114,   115,   116,   117,     0,     0,     0,     0,    32,    33,
-     137,    35,    36,    37,     0,    38,    39,   138,    41,   139,
-      43,   140,    45,   141,    47,    48,    49,    50,    51,    52,
-       0,    53,    54,    55,    56,    57,    58,   142,    60,    61,
-     143,    63,    64,   118,   119,   120,   121,     0,     0,     0,
-     122,     0,     0,     0,   144,   145,     0,     0,     0,     0,
-       0,   164,   291,   147,   127,   128,     1,   129,   130,    99,
-     131,   132,   133,   134,   100,     7,   101,     0,   102,     9,
-     103,   104,   105,   106,    14,    15,   107,    17,   108,    19,
-      20,   109,   110,   111,   112,    24,   113,    26,    27,   114,
-     115,   116,   117,     0,     0,     0,     0,    32,    33,   137,
-      35,    36,    37,     0,    38,    39,   138,    41,   139,    43,
-     140,    45,   141,    47,    48,    49,    50,    51,    52,     0,
-      53,    54,    55,    56,    57,    58,   142,    60,    61,   143,
-      63,    64,   118,   119,   120,   121,     0,     0,     0,   122,
-       0,     0,     0,   144,   145,     0,     0,     0,     0,     0,
-     164,   333,   147,   127,   128,     1,   129,   130,    99,   131,
-     132,   133,   134,   100,     7,   101,     0,   102,     9,   103,
+      19,    20,   109,   110,   111,   112,    24,     0,    26,    27,
+     113,   114,   115,   116,     0,     0,     0,     0,    32,    33,
+     136,    35,    36,    37,     0,    38,    39,   137,    41,   138,
+      43,   139,    45,   140,    47,    48,    49,    50,    51,    52,
+       0,    53,    54,    55,    56,    57,    58,   141,    60,    61,
+     142,    63,    64,   117,   118,   119,   120,     0,     0,     0,
+     121,     0,     0,     0,   143,   144,     0,     0,     0,     0,
+       0,   163,   484,   146,   126,   127,     1,   128,   129,    99,
+     130,   131,   132,   133,   100,     7,   101,     0,   102,   134,
+     103,   104,   105,   106,    14,    15,   107,   135,   108,    19,
+      20,   109,   110,   111,   112,    24,     0,    26,    27,   113,
+     114,   115,   116,     0,     0,     0,     0,    32,    33,   136,
+      35,    36,    37,     0,    38,    39,   137,    41,   138,    43,
+     139,    45,   140,    47,    48,    49,    50,    51,    52,     0,
+      53,    54,    55,    56,    57,    58,   141,    60,    61,   142,
+      63,    64,   117,   118,   119,   120,     0,     0,     0,   121,
+       0,     0,     0,   143,   144,     0,     0,     0,     0,     0,
+     145,     0,   146,   126,   127,     1,   128,   129,    99,   130,
+     131,   132,   133,   100,     7,   101,     0,   102,     9,   103,
      104,   105,   106,    14,    15,   107,    17,   108,    19,    20,
-     109,   110,   111,   112,    24,   113,    26,    27,   114,   115,
-     116,   117,     0,     0,     0,     0,    32,    33,   137,    35,
-      36,    37,     0,    38,    39,   138,    41,   139,    43,   140,
-      45,   141,    47,    48,    49,    50,    51,    52,     0,    53,
-      54,    55,    56,    57,    58,   142,    60,    61,   143,    63,
-      64,   118,   119,   120,   121,     0,     0,     0,   122,     0,
-       0,     0,   144,   145,     0,     0,     0,     0,     0,   164,
-     430,   147,   127,   128,     1,   129,   130,    99,   131,   132,
-     133,   134,   100,     7,   101,     0,   102,     9,   103,   104,
+     109,   110,   111,   112,    24,     0,    26,    27,   113,   114,
+     115,   116,     0,     0,     0,     0,    32,    33,   136,    35,
+      36,    37,     0,    38,    39,   137,    41,   138,    43,   139,
+      45,   140,    47,    48,    49,    50,    51,    52,     0,    53,
+      54,    55,    56,    57,    58,   141,    60,    61,   142,    63,
+      64,   117,   118,   119,   120,     0,     0,     0,   121,     0,
+       0,     0,   143,   144,     0,     0,     0,     0,     0,   163,
+       0,   146,   126,   127,     1,   128,   129,    99,   130,   131,
+     132,   133,   100,     7,   101,     0,   102,     9,   103,   104,
      105,   106,    14,    15,   107,    17,   108,    19,    20,   109,
-     110,   111,   112,    24,   113,    26,    27,   114,   115,   116,
-     117,     0,     0,     0,     0,    32,    33,   137,    35,    36,
-      37,     0,    38,    39,   138,    41,   139,    43,   140,    45,
-     141,    47,    48,    49,    50,    51,    52,     0,    53,    54,
-      55,    56,    57,    58,   142,    60,    61,   143,    63,    64,
-     118,   119,   120,   121,     0,     0,     0,   122,     0,     0,
-       0,   144,   145,     0,     0,     0,     0,     0,   164,   488,
-     147,   127,   128,     1,   129,   130,    99,   131,   132,   133,
-     134,   100,     7,   101,     0,   102,   135,   103,   104,   105,
-     106,    14,    15,   107,   136,   108,    19,    20,   109,   110,
-     111,   112,    24,   113,    26,    27,   114,   115,   116,   117,
-       0,     0,     0,     0,    32,    33,   137,    35,    36,    37,
-       0,    38,    39,   138,    41,   139,    43,   140,    45,   141,
+     110,   111,   112,    24,     0,    26,    27,   113,   114,   115,
+     116,     0,     0,     0,     0,    32,    33,   136,    35,    36,
+      37,     0,    38,    39,   137,    41,   138,    43,   139,    45,
+     140,    47,    48,    49,    50,    51,    52,     0,    53,    54,
+      55,    56,    57,    58,   141,    60,    61,   142,    63,    64,
+     117,   118,   119,   120,     0,     0,     0,   121,     0,     0,
+       0,   143,   144,     0,     0,     0,     0,     0,   145,     0,
+     146,   126,   127,     1,   128,   129,    99,   130,   131,   132,
+     133,   100,     7,   101,     0,   102,     9,   103,   104,   105,
+     106,    14,    15,   107,    17,   108,    19,    20,   109,   110,
+     111,   112,    24,     0,    26,    27,   113,   114,   115,   116,
+       0,     0,     0,     0,    32,    33,   136,    35,    36,    37,
+       0,    38,    39,   137,    41,   138,    43,   139,    45,   140,
       47,    48,    49,    50,    51,    52,     0,    53,    54,    55,
-      56,    57,    58,   142,    60,    61,   143,    63,    64,   118,
-     119,   120,   121,     0,     0,     0,   122,     0,     0,     0,
-     144,   145,     0,     0,     0,     0,     0,   146,     0,   147,
-     127,   128,     1,   129,   130,    99,   131,   132,   133,   134,
+      56,    57,    58,   141,    60,    61,    62,    63,    64,   117,
+     118,   119,   120,     0,     0,     0,   121,     0,     0,     0,
+     143,   144,     0,     0,     0,     0,     0,   191,     0,   146,
+     126,   127,     1,   128,   129,    99,   130,   131,   132,   133,
      100,     7,   101,     0,   102,     9,   103,   104,   105,   106,
       14,    15,   107,    17,   108,    19,    20,   109,   110,   111,
-     112,    24,   113,    26,    27,   114,   115,   116,   117,     0,
-       0,     0,     0,    32,    33,   137,    35,    36,    37,     0,
-      38,    39,   138,    41,   139,    43,   140,    45,   141,    47,
+     112,    24,     0,    26,    27,   113,   114,   115,   116,     0,
+       0,     0,     0,    32,    33,   136,    35,    36,    37,     0,
+      38,    39,   137,    41,   138,    43,   139,    45,   140,    47,
       48,    49,    50,    51,    52,     0,    53,    54,    55,    56,
-      57,    58,   142,    60,    61,   143,    63,    64,   118,   119,
-     120,   121,     0,     0,     0,   122,     0,     0,     0,   144,
-     145,     0,     0,     0,     0,     0,   164,     0,   147,   127,
-     128,     1,   129,   130,    99,   131,   132,   133,   134,   100,
+      57,    58,   141,    60,    61,    62,    63,    64,   117,   118,
+     119,   120,     0,     0,     0,   121,     0,     0,     0,   143,
+     144,     0,     0,     0,     0,     0,   163,     0,   146,   126,
+     127,     1,   128,   129,    99,   130,   131,   132,   133,   100,
        7,   101,     0,   102,     9,   103,   104,   105,   106,    14,
       15,   107,    17,   108,    19,    20,   109,   110,   111,   112,
-      24,   113,    26,    27,   114,   115,   116,   117,     0,     0,
-       0,     0,    32,    33,   137,    35,    36,    37,     0,    38,
-      39,   138,    41,   139,    43,   140,    45,   141,    47,    48,
-      49,    50,    51,    52,     0,    53,    54,    55,    56,    57,
-      58,   142,    60,    61,   143,    63,    64,   118,   119,   120,
-     121,     0,     0,     0,   122,     0,     0,     0,   144,   145,
-       0,     0,     0,     0,     0,   146,     0,   147,   127,   128,
-       1,   129,   130,    99,   131,   132,   133,   134,   100,     7,
+      24,     0,    26,    27,   113,   114,   115,   116,     0,     0,
+       0,     0,    32,    33,   136,    35,    36,    37,     0,    38,
+      39,   137,   411,   138,   412,   139,   413,   140,   414,    48,
+      49,    50,    51,    52,     0,    53,    54,   415,   416,   417,
+      58,   141,    60,   418,   419,    63,    64,   117,   118,   119,
+     120,     0,     0,     0,   121,     0,     0,     0,   143,   144,
+       0,     0,     0,     0,     0,   163,     0,   146,   126,   127,
+       1,   128,   129,    99,   130,   131,   132,   133,   100,     7,
      101,     0,   102,     9,   103,   104,   105,   106,    14,    15,
      107,    17,   108,    19,    20,   109,   110,   111,   112,    24,
-     113,    26,    27,   114,   115,   116,   117,     0,     0,     0,
-       0,    32,    33,   137,    35,    36,    37,     0,    38,    39,
-     138,    41,   139,    43,   140,    45,   141,    47,    48,    49,
-      50,    51,    52,     0,    53,    54,    55,    56,    57,    58,
-     142,    60,    61,    62,    63,    64,   118,   119,   120,   121,
-       0,     0,     0,   122,     0,     0,     0,   144,   145,     0,
-       0,     0,     0,     0,   193,     0,   147,   127,   128,     1,
-     129,   130,    99,   131,   132,   133,   134,   100,     7,   101,
+       0,    26,    27,   113,   114,   115,   116,     0,     0,     0,
+       0,    32,    33,   136,    35,    36,    37,     0,    38,    39,
+     137,    41,   138,    43,   139,    45,   140,    47,    48,    49,
+      50,    51,    52,     0,    53,    54,   415,   416,    57,    58,
+     141,    60,   418,   419,    63,    64,   117,   118,   119,   120,
+       0,     0,     0,   121,     0,     0,     0,   143,   144,     0,
+       0,     0,     0,     0,   163,     0,   146,   126,   127,     1,
+     128,   129,    99,   130,   131,   132,   133,   100,     7,   101,
        0,   102,     9,   103,   104,   105,   106,    14,    15,   107,
-      17,   108,    19,    20,   109,   110,   111,   112,    24,   113,
-      26,    27,   114,   115,   116,   117,     0,     0,     0,     0,
-      32,    33,   137,    35,    36,    37,     0,    38,    39,   138,
-      41,   139,    43,   140,    45,   141,    47,    48,    49,    50,
-      51,    52,     0,    53,    54,    55,    56,    57,    58,   142,
-      60,    61,    62,    63,    64,   118,   119,   120,   121,     0,
-       0,     0,   122,     0,     0,     0,   144,   145,     0,     0,
-       0,     0,     0,   164,     0,   147,   127,   128,     1,   129,
-     130,    99,   131,   132,   133,   134,   100,     7,   101,     0,
+      17,   108,    19,    20,   109,   110,   111,   112,    24,     0,
+      26,    27,   113,   114,   115,   116,     0,     0,     0,     0,
+      32,    33,   136,    35,    36,    37,     0,    38,    39,   137,
+      41,   138,    43,   139,    45,   140,    47,    48,    49,    50,
+      51,    52,     0,    53,    54,   471,   472,    57,    58,   141,
+      60,   473,   474,    63,    64,   117,   118,   119,   120,     0,
+       0,     0,   121,     0,     0,     0,   143,   144,     0,     0,
+       0,     0,     0,   163,     0,   146,   126,   127,     1,   128,
+     129,    99,   130,   131,   132,   133,   100,     7,   101,     0,
      102,     9,   103,   104,   105,   106,    14,    15,   107,    17,
-     108,    19,    20,   109,   110,   111,   112,    24,   113,    26,
-      27,   114,   115,   116,   117,     0,     0,     0,     0,    32,
-      33,   137,    35,    36,    37,     0,    38,    39,   138,   415,
-     139,   416,   140,   417,   141,   418,    48,    49,    50,    51,
-      52,     0,    53,    54,   419,   420,   421,    58,   142,    60,
-     422,   423,    63,    64,   118,   119,   120,   121,     0,     0,
-       0,   122,     0,     0,     0,   144,   145,     0,     0,     0,
-       0,     0,   164,     0,   147,   127,   128,     1,   129,   130,
-      99,   131,   132,   133,   134,   100,     7,   101,     0,   102,
+     108,    19,    20,   109,   110,   111,   112,    24,     0,    26,
+      27,   113,   114,   115,   116,     0,     0,     0,     0,     0,
+       0,   136,    35,    36,    37,     0,    38,    39,   137,    41,
+     138,    43,   139,    45,   140,    47,    48,    49,    50,    51,
+      52,     0,    53,    54,    55,    56,    57,    58,   141,    60,
+      61,   142,    63,    64,   117,   118,   119,   120,     0,     0,
+       0,   121,     0,     0,     0,   143,   144,     0,     0,     0,
+       0,     0,   163,     0,   146,   126,   127,     1,   128,   129,
+      99,   130,   131,   132,   133,   100,     7,   101,     0,   102,
        9,   103,   104,   105,   106,    14,    15,   107,    17,   108,
-      19,    20,   109,   110,   111,   112,    24,   113,    26,    27,
-     114,   115,   116,   117,     0,     0,     0,     0,    32,    33,
-     137,    35,    36,    37,     0,    38,    39,   138,    41,   139,
-      43,   140,    45,   141,    47,    48,    49,    50,    51,    52,
-       0,    53,    54,   419,   420,    57,    58,   142,    60,   422,
-     423,    63,    64,   118,   119,   120,   121,     0,     0,     0,
-     122,     0,     0,     0,   144,   145,     0,     0,     0,     0,
-       0,   164,     0,   147,   127,   128,     1,   129,   130,    99,
-     131,   132,   133,   134,   100,     7,   101,     0,   102,     9,
+      19,    20,   109,   110,   111,   112,    24,     0,    26,    27,
+     113,   114,   115,   116,     0,     0,     0,     0,     0,     0,
+     136,    35,    36,    37,     0,     0,     0,   137,    41,   138,
+      43,   139,    45,   140,    47,    48,    49,    50,    51,    52,
+       0,    53,    54,    55,    56,    57,    58,   141,    60,    61,
+     142,    63,    64,   117,   118,   119,   120,     0,     0,     0,
+     121,     0,     0,     0,   143,   144,     0,     0,     0,     0,
+       0,   163,     0,   146,   126,   127,     1,   128,   129,    99,
+     130,   131,   132,   133,   100,     7,   101,     0,   102,     9,
      103,   104,   105,   106,    14,    15,   107,    17,   108,    19,
-      20,   109,   110,   111,   112,    24,   113,    26,    27,   114,
-     115,   116,   117,     0,     0,     0,     0,    32,    33,   137,
-      35,    36,    37,     0,    38,    39,   138,    41,   139,    43,
-     140,    45,   141,    47,    48,    49,    50,    51,    52,     0,
-      53,    54,   475,   476,    57,    58,   142,    60,   477,   478,
-      63,    64,   118,   119,   120,   121,     0,     0,     0,   122,
-       0,     0,     0,   144,   145,     0,     0,     0,     0,     0,
-     164,     0,   147,   127,   128,     1,   129,   130,    99,   131,
-     132,   133,   134,   100,     7,   101,     0,   102,     9,   103,
-     104,   105,   106,    14,    15,   107,    17,   108,    19,    20,
-     109,   110,   111,   112,    24,   113,    26,    27,   114,   115,
-     116,   117,     0,     0,     0,     0,     0,     0,   137,    35,
-      36,    37,     0,    38,    39,   138,    41,   139,    43,   140,
-      45,   141,    47,    48,    49,    50,    51,    52,     0,    53,
-      54,    55,    56,    57,    58,   142,    60,    61,   143,    63,
-      64,   118,   119,   120,   121,     0,     0,     0,   122,     0,
-       0,     0,   144,   145,     0,     0,     0,     0,     0,   164,
-       0,   147,   127,   128,     1,   129,   130,    99,   131,   132,
-     133,   134,   100,     7,   101,     0,   102,     9,   103,   104,
-     105,   106,    14,    15,   107,    17,   108,    19,    20,   109,
-     110,   111,   112,    24,   113,    26,    27,   114,   115,   116,
-     117,     0,     0,     0,     0,     0,     0,   137,    35,    36,
-      37,     0,     0,     0,   138,    41,   139,    43,   140,    45,
-     141,    47,    48,    49,    50,    51,    52,     0,    53,    54,
-      55,    56,    57,    58,   142,    60,    61,   143,    63,    64,
-     118,   119,   120,   121,     0,     0,     0,   122,     0,     0,
-       0,   144,   145,     0,     0,     0,     0,     0,   164,     0,
-     147,   127,   128,     1,   129,   130,    99,   131,   132,   133,
-     134,   100,     7,   101,     0,   102,     9,   103,   104,   105,
-     106,    14,    15,   107,    17,   108,    19,    20,   109,   110,
-     111,   112,    24,   113,    26,    27,   114,   115,   116,   117,
-       0,     0,     0,     0,     0,     0,   137,     0,    36,    37,
-       0,     0,     0,   138,    41,   139,    43,   140,    45,   141,
-      47,    48,    49,    50,    51,    52,     0,    53,    54,    55,
-      56,    57,    58,   142,    60,    61,   143,    63,    64,   118,
-     119,   120,   121,     0,     0,     0,   122,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     1,   164,     0,   147,
-       2,     3,     4,     5,     6,     7,     0,     0,     8,     9,
-      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
-      20,    21,    22,    23,     0,    24,    25,    26,    27,    28,
-      29,    30,    31,     0,     0,     0,     0,    32,    33,    34,
-      35,    36,    37,     0,    38,    39,    40,    41,    42,    43,
-      44,    45,    46,    47,    48,    49,    50,    51,    52,     0,
-      53,    54,    55,    56,    57,    58,    59,    60,    61,    62,
-      63,    64,    65,    66,    67,     0,    68,     1,     0,    69,
-       0,     2,     3,     4,     5,     6,     7,     0,    70,     8,
-       9,    10,    11,    12,    13,    14,    15,     0,    17,    18,
-      19,    20,    21,    22,    23,     0,    24,    25,    26,    27,
-       0,    29,    30,    31,     0,     0,     0,     0,    32,    33,
-      34,    35,    36,    37,     0,    38,    39,    40,    41,    42,
-      43,    44,    45,    46,    47,    48,    49,    50,    51,    52,
-       0,    53,    54,    55,    56,    57,    58,    59,    60,    61,
-      62,    63,    64,    65,    66,     0,     0,    68,     1,     0,
-      69,     0,     2,     3,     4,     5,     6,     7,     0,   373,
-       8,     9,    10,    11,    12,    13,    14,    15,     0,    17,
-      18,    19,    20,    21,    22,    23,     0,    24,    25,    26,
-      27,     0,    29,    30,    31,     0,     0,     0,     0,    32,
-      33,    34,    35,    36,    37,     0,    38,    39,    40,    41,
-      42,    43,    44,    45,    46,    47,    48,    49,    50,    51,
-      52,     0,    53,    54,    55,    56,    57,    58,    59,    60,
-      61,    62,    63,    64,    65,    66,     0,     0,    68,     1,
-       0,    69,     0,     2,     3,     4,     5,     6,     7,     0,
-     396,     8,     9,    10,    11,    12,    13,    14,    15,     0,
+      20,   109,   110,   111,   112,    24,     0,    26,    27,   113,
+     114,   115,   116,     0,     0,     0,     0,     0,     0,   136,
+       0,    36,    37,     0,     0,     0,   137,    41,   138,    43,
+     139,    45,   140,    47,    48,    49,    50,    51,    52,     0,
+      53,    54,    55,    56,    57,    58,   141,    60,    61,   142,
+      63,    64,   117,   118,   119,   120,     0,     0,     0,   121,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     1,
+     163,     0,   146,     2,     3,     4,     5,     6,     7,     0,
+       0,     8,     9,    10,    11,    12,    13,    14,    15,    16,
       17,    18,    19,    20,    21,    22,    23,     0,    24,    25,
-      26,    27,     0,    29,    30,    31,     0,     0,     0,     0,
+      26,    27,    28,    29,    30,    31,     0,     0,     0,     0,
       32,    33,    34,    35,    36,    37,     0,    38,    39,    40,
       41,    42,    43,    44,    45,    46,    47,    48,    49,    50,
       51,    52,     0,    53,    54,    55,    56,    57,    58,    59,
-      60,    61,    62,    63,    64,    65,    66,     0,     0,    68,
+      60,    61,    62,    63,    64,    65,    66,    67,     0,    68,
        1,     0,    69,     0,     2,     3,     4,     5,     6,     7,
-       0,   512,     8,     9,    10,    11,    12,    13,    14,    15,
+       0,    70,     8,     9,    10,    11,    12,    13,    14,    15,
        0,    17,    18,    19,    20,    21,    22,    23,     0,    24,
       25,    26,    27,     0,    29,    30,    31,     0,     0,     0,
        0,    32,    33,    34,    35,    36,    37,     0,    38,    39,
@@ -1324,219 +1299,276 @@ static const yytype_int16 yytable[] =
       50,    51,    52,     0,    53,    54,    55,    56,    57,    58,
       59,    60,    61,    62,    63,    64,    65,    66,     0,     0,
       68,     1,     0,    69,     0,     2,     3,     4,     5,     6,
-       7,     0,   540,     8,     9,    10,    11,    12,    13,    14,
+       7,     0,   370,     8,     9,    10,    11,    12,    13,    14,
       15,     0,    17,    18,    19,    20,    21,    22,    23,     0,
       24,    25,    26,    27,     0,    29,    30,    31,     0,     0,
        0,     0,    32,    33,    34,    35,    36,    37,     0,    38,
       39,    40,    41,    42,    43,    44,    45,    46,    47,    48,
       49,    50,    51,    52,     0,    53,    54,    55,    56,    57,
       58,    59,    60,    61,    62,    63,    64,    65,    66,     0,
-       0,     0,     0,     0,    69,     0,     0,     0,     0,     0,
-       0,     0,     0,   462,     1,   435,   436,    99,     2,     3,
-       4,     5,   100,     7,   101,     0,   102,     9,   103,   104,
-     105,   106,    14,    15,   107,    17,   108,    19,    20,   109,
-     110,   111,   112,    24,   113,    26,    27,   114,   115,   116,
-     117,     0,     0,     0,     0,    32,    33,    34,    35,    36,
+       0,    68,     1,     0,    69,     0,     2,     3,     4,     5,
+       6,     7,     0,   392,     8,     9,    10,    11,    12,    13,
+      14,    15,     0,    17,    18,    19,    20,    21,    22,    23,
+       0,    24,    25,    26,    27,     0,    29,    30,    31,     0,
+       0,     0,     0,    32,    33,    34,    35,    36,    37,     0,
+      38,    39,    40,    41,    42,    43,    44,    45,    46,    47,
+      48,    49,    50,    51,    52,     0,    53,    54,    55,    56,
+      57,    58,    59,    60,    61,    62,    63,    64,    65,    66,
+       0,     0,    68,     1,     0,    69,     0,     2,     3,     4,
+       5,     6,     7,     0,   508,     8,     9,    10,    11,    12,
+      13,    14,    15,     0,    17,    18,    19,    20,    21,    22,
+      23,     0,    24,    25,    26,    27,     0,    29,    30,    31,
+       0,     0,     0,     0,    32,    33,    34,    35,    36,    37,
+       0,    38,    39,    40,    41,    42,    43,    44,    45,    46,
+      47,    48,    49,    50,    51,    52,     0,    53,    54,    55,
+      56,    57,    58,    59,    60,    61,    62,    63,    64,    65,
+      66,     0,     0,    68,     1,     0,    69,     0,     2,     3,
+       4,     5,     6,     7,     0,   536,     8,     9,    10,    11,
+      12,    13,    14,    15,     0,    17,    18,    19,    20,    21,
+      22,    23,     0,    24,    25,    26,    27,     0,    29,    30,
+      31,     0,     0,     0,     0,    32,    33,    34,    35,    36,
       37,     0,    38,    39,    40,    41,    42,    43,    44,    45,
       46,    47,    48,    49,    50,    51,    52,     0,    53,    54,
       55,    56,    57,    58,    59,    60,    61,    62,    63,    64,
-     118,   119,   120,   121,     0,     1,     0,   122,    99,     2,
-       3,     4,     5,   100,     7,   101,     0,   102,     9,   103,
-     104,   105,   106,    14,    15,   107,    17,   108,    19,    20,
-     109,   110,   111,   112,    24,   113,    26,    27,   114,   115,
-     116,   117,     0,     0,     0,     0,    32,    33,    34,    35,
-      36,    37,     0,    38,    39,    40,    41,    42,    43,    44,
-      45,    46,    47,    48,    49,    50,    51,    52,     0,    53,
-      54,    55,    56,    57,    58,    59,    60,    61,    62,    63,
-      64,   118,   119,   120,   121,     0,     1,     0,   122,    99,
-       2,     3,     4,     5,   100,     7,   101,     0,   102,     9,
-     103,   104,   105,   106,    14,    15,   107,    17,   108,    19,
-      20,   109,   110,   111,   112,    24,   113,    26,    27,   114,
-     115,   116,   117,     0,     0,     0,     0,    32,    33,    34,
-      35,    36,    37,     0,    38,    39,    40,    41,    42,    43,
-      44,    45,    46,    47,    48,    49,    50,    51,    52,     0,
-      53,    54,    55,    56,    57,    58,   172,    60,    61,    62,
-      63,    64,   118,   119,   120,   121,     0,     1,     0,   122,
+      65,    66,     0,     0,     0,     0,     0,    69,     0,     0,
+       0,     0,     0,     0,     0,     0,   458,     1,   431,   432,
       99,     2,     3,     4,     5,   100,     7,   101,     0,   102,
        9,   103,   104,   105,   106,    14,    15,   107,    17,   108,
-      19,    20,   109,   110,   111,   112,    24,   113,    26,    27,
-     114,   115,   116,   117,     0,     0,     0,     0,    32,    33,
+      19,    20,   109,   110,   111,   112,    24,     0,    26,    27,
+     113,   114,   115,   116,     0,     0,     0,     0,    32,    33,
       34,    35,    36,    37,     0,    38,    39,    40,    41,    42,
-      43,    44,    45,    46,    47,   211,   212,   213,   214,   215,
-       0,    53,   216,    55,    56,    57,   217,    59,    60,    61,
-      62,    63,    64,   118,   119,   120,   121,     0,     1,     0,
-     122,    99,   131,   132,     4,     5,   100,     7,   101,     0,
+      43,    44,    45,    46,    47,    48,    49,    50,    51,    52,
+       0,    53,    54,    55,    56,    57,    58,    59,    60,    61,
+      62,    63,    64,   117,   118,   119,   120,     0,     1,     0,
+     121,    99,     2,     3,     4,     5,   100,     7,   101,     0,
      102,     9,   103,   104,   105,   106,    14,    15,   107,    17,
-     108,    19,    20,   109,   110,   111,   112,    24,   113,    26,
-      27,   114,   115,   116,   117,     0,     0,     0,     0,    32,
-      33,    34,    35,    36,    37,     0,    38,    39,   138,    41,
-     139,    43,   140,    45,   141,    47,    48,    49,    50,    51,
-      52,     0,    53,    54,    55,    56,    57,    58,   376,    60,
-      61,    62,    63,    64,   118,   119,   120,   121,     1,     0,
-       0,   122,     2,     3,     4,     5,     6,     7,     0,     0,
-       8,     9,    10,    11,    12,     0,    14,    15,     0,    17,
-      18,    19,    20,    21,   110,    23,     0,    24,     0,    26,
-      27,     0,    29,    30,    31,     0,     0,     0,     0,    32,
+     108,    19,    20,   109,   110,   111,   112,    24,     0,    26,
+      27,   113,   114,   115,   116,     0,     0,     0,     0,    32,
       33,    34,    35,    36,    37,     0,    38,    39,    40,    41,
       42,    43,    44,    45,    46,    47,    48,    49,    50,    51,
       52,     0,    53,    54,    55,    56,    57,    58,    59,    60,
-      61,    62,    63,    64,   299,    66,     0,     0,     0,     0,
-     300,    69,     0,     0,     0,     0,     0,   490,   237,   238,
-     239,   240,   262,   263,     0,   264,     0,     0,   244,   265,
-     266,   237,   238,   239,   240,   262,   263,   491,   264,     0,
-       0,   244,   265,   266,     0,     0,     0,     0,     0,     0,
-       0,   237,   238,   239,   240,   262,   263,     0,   264,     0,
-       0,   244,   265,   266,     0,   247,   248,   249,   250,   251,
-     252,   253,     0,     0,     0,     0,     0,     0,   247,   248,
-     249,   250,   251,   252,   253,     0,     0,     0,     0,     0,
-       0,   492,     0,     0,     0,     0,     0,     0,   247,   248,
-     249,   250,   251,   252,   253,   237,   238,   239,   240,   262,
-     263,   493,   264,     0,     0,   244,   265,   266,     0,     0,
-       0,     0,     0,     0,   564,   237,   238,   239,   240,   262,
-     263,     0,   264,     0,     0,   244,   265,   266,   548,   549,
-       0,   550,   551,   552,     0,   553,     0,     0,   554,   555,
-     556,   286,   247,   248,   249,   250,   251,   252,   253,   237,
-     238,   239,   240,   262,   263,     0,   264,     0,     0,   244,
-     265,   266,   247,   248,   249,   250,   251,   252,   253,     0,
-       0,     0,     0,   261,     0,   557,   558,   559,   560,   561,
-     562,   563,   237,   238,   239,   240,   262,   263,     0,   264,
-       0,     0,   244,   265,   266,     0,   247,   248,   249,   250,
-     251,   252,   253,     0,   287,   237,   238,   239,   240,   262,
-     263,     0,   264,     0,     0,   244,   265,   266,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   247,
-     248,   249,   250,   251,   252,   253,   237,   238,   239,   240,
-     262,   263,     0,   264,     0,     0,   244,   265,   266,     0,
-       0,     0,   247,   248,   249,   250,   251,   252,   253,     0,
-       0,   402,     0,   324,   354,   355,   356,   357,   358,   359,
-       0,   360,     0,     0,   361,   362,   363,     0,     0,     0,
-       0,     0,     0,   247,   248,   249,   250,   251,   252,   253,
-       0,     0,     0,     0,   324,   237,   238,   239,   240,   262,
-     263,     0,   264,     0,     0,   244,   265,   266,     0,     0,
-       0,   364,   365,   366,   367,   368,   369,   370,     0,     0,
-     371,   237,   238,   239,   240,   262,   263,     0,   264,     0,
-       0,   244,   265,   266,     0,     0,     0,     0,     0,     0,
-       0,     0,   247,   248,   249,   250,   251,   252,   253,     0,
-     384,   237,   238,   239,   240,   262,   263,     0,   264,     0,
-       0,   244,   265,   266,     0,     0,     0,     0,   247,   248,
-     249,   250,   251,   252,   253,     0,   481,   237,   238,   239,
-     240,   262,   263,     0,   264,     0,     0,   244,   265,   266,
-       0,     0,     0,     0,     0,     0,     0,     0,   247,   248,
-     249,   250,   251,   252,   253,     0,   484,   237,   238,   239,
-     240,   262,   263,     0,   264,     0,     0,   244,   265,   266,
-       0,     0,     0,     0,   247,   248,   249,   250,   251,   252,
-     253,     0,   514,   237,   238,   239,   240,   262,   263,     0,
-     264,     0,     0,   244,   265,   266,     0,     0,     0,     0,
-       0,     0,     0,     0,   247,   248,   249,   250,   251,   252,
-     253,     0,   574,   237,   238,   239,   240,   262,   263,     0,
-     264,     0,     0,   244,   265,   266,     0,     0,     0,     0,
-     247,   248,   249,   250,   251,   252,   253,     0,   598,     0,
-       0,     0,   237,   238,   239,   240,   262,   263,     0,   264,
-     321,   322,   244,   265,   266,     0,     0,     0,     0,     0,
-     247,   248,   249,   250,   251,   252,   253,   354,   355,   356,
-     357,   358,   359,     0,   360,     0,     0,   361,   362,   363,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   247,
-     248,   249,   250,   251,   252,   253,   548,   549,     0,   550,
-     551,   552,     0,   553,     0,     0,   554,   555,   556,     0,
-       0,     0,     0,     0,   364,   365,   366,   367,   368,   369,
-     370,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+      61,    62,    63,    64,   117,   118,   119,   120,     0,     1,
+       0,   121,    99,     2,     3,     4,     5,   100,     7,   101,
+       0,   102,     9,   103,   104,   105,   106,    14,    15,   107,
+      17,   108,    19,    20,   109,   110,   111,   112,    24,     0,
+      26,    27,   113,   114,   115,   116,     0,     0,     0,     0,
+      32,    33,    34,    35,    36,    37,     0,    38,    39,    40,
+      41,    42,    43,    44,    45,    46,    47,    48,    49,    50,
+      51,    52,     0,    53,    54,    55,    56,    57,    58,   171,
+      60,    61,    62,    63,    64,   117,   118,   119,   120,     0,
+       1,     0,   121,    99,     2,     3,     4,     5,   100,     7,
+     101,     0,   102,     9,   103,   104,   105,   106,    14,    15,
+     107,    17,   108,    19,    20,   109,   110,   111,   112,    24,
+       0,    26,    27,   113,   114,   115,   116,     0,     0,     0,
+       0,    32,    33,    34,    35,    36,    37,     0,    38,    39,
+      40,    41,    42,    43,    44,    45,    46,    47,   209,   210,
+     211,   212,   213,     0,    53,   214,    55,    56,    57,   215,
+      59,    60,    61,    62,    63,    64,   117,   118,   119,   120,
+       0,     1,     0,   121,    99,   130,   131,     4,     5,   100,
+       7,   101,     0,   102,     9,   103,   104,   105,   106,    14,
+      15,   107,    17,   108,    19,    20,   109,   110,   111,   112,
+      24,     0,    26,    27,   113,   114,   115,   116,     0,     0,
+       0,     0,    32,    33,    34,    35,    36,    37,     0,    38,
+      39,   137,    41,   138,    43,   139,    45,   140,    47,    48,
+      49,    50,    51,    52,     0,    53,    54,    55,    56,    57,
+      58,   373,    60,    61,    62,    63,    64,   117,   118,   119,
+     120,     1,     0,     0,   121,     2,     3,     4,     5,     6,
+       7,     0,     0,     8,     9,    10,    11,    12,     0,    14,
+      15,     0,    17,    18,    19,    20,    21,   110,    23,     0,
+      24,     0,    26,    27,     0,    29,    30,    31,     0,     0,
+       0,     0,    32,    33,    34,    35,    36,    37,     0,    38,
+      39,    40,    41,    42,    43,    44,    45,    46,    47,    48,
+      49,    50,    51,    52,     0,    53,    54,    55,    56,    57,
+      58,    59,    60,    61,    62,    63,    64,   294,    66,     0,
+       0,     0,     0,   295,    69,     0,     0,     0,     0,     0,
+       0,   235,   236,   237,   238,   260,   261,     0,   262,   296,
+       0,   242,   263,   264,     0,   297,     0,     0,     0,     0,
+       0,     0,     0,   235,   236,   237,   238,   260,   261,     0,
+     262,     0,     0,   242,   263,   264,     0,     0,     0,     0,
+       0,   486,     0,     0,     0,     0,     0,     0,   245,   246,
+     247,   248,   249,   250,   251,   235,   236,   237,   238,   260,
+     261,     0,   262,   487,     0,   242,   263,   264,     0,     0,
+     245,   246,   247,   248,   249,   250,   251,   235,   236,   237,
+     238,   260,   261,     0,   262,     0,     0,   242,   263,   264,
+       0,     0,     0,     0,     0,   488,     0,     0,     0,     0,
+       0,     0,   245,   246,   247,   248,   249,   250,   251,   235,
+     236,   237,   238,   260,   261,     0,   262,   489,     0,   242,
+     263,   264,     0,     0,   245,   246,   247,   248,   249,   250,
+     251,   235,   236,   237,   238,   260,   261,     0,   262,     0,
+       0,   242,   263,   264,     0,     0,     0,     0,     0,   560,
+       0,     0,     0,     0,     0,     0,   245,   246,   247,   248,
+     249,   250,   251,   544,   545,     0,   546,   547,   548,     0,
+     549,     0,     0,   550,   551,   552,     0,   283,   245,   246,
+     247,   248,   249,   250,   251,   235,   236,   237,   238,   260,
+     261,     0,   262,     0,     0,   242,   263,   264,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   557,   558,   559,   560,   561,   562,   563
+     553,   554,   555,   556,   557,   558,   559,   235,   236,   237,
+     238,   260,   261,     0,   262,     0,     0,   242,   263,   264,
+       0,     0,   245,   246,   247,   248,   249,   250,   251,     0,
+     284,   235,   236,   237,   238,   260,   261,     0,   262,     0,
+       0,   242,   263,   264,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   245,   246,   247,   248,   249,   250,
+     251,     0,     0,   320,     0,   321,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   245,   246,
+     247,   248,   249,   250,   251,     0,     0,   398,     0,   321,
+     235,   236,   237,   238,   260,   261,     0,   262,     0,     0,
+     242,   263,   264,   351,   352,   353,   354,   355,   356,     0,
+     357,     0,     0,   358,   359,   360,   235,   236,   237,   238,
+     260,   261,     0,   262,     0,     0,   242,   263,   264,     0,
+       0,     0,     0,     0,     0,     0,     0,   245,   246,   247,
+     248,   249,   250,   251,     0,     0,     0,     0,   321,     0,
+     361,   362,   363,   364,   365,   366,   367,     0,     0,   368,
+       0,     0,     0,   245,   246,   247,   248,   249,   250,   251,
+       0,   381,   235,   236,   237,   238,   260,   261,     0,   262,
+       0,     0,   242,   263,   264,   235,   236,   237,   238,   260,
+     261,     0,   262,     0,     0,   242,   263,   264,   235,   236,
+     237,   238,   260,   261,     0,   262,     0,     0,   242,   263,
+     264,     0,     0,     0,     0,     0,     0,     0,     0,   245,
+     246,   247,   248,   249,   250,   251,     0,   477,     0,     0,
+       0,     0,   245,   246,   247,   248,   249,   250,   251,     0,
+     480,     0,     0,     0,     0,   245,   246,   247,   248,   249,
+     250,   251,     0,   510,   235,   236,   237,   238,   260,   261,
+       0,   262,     0,     0,   242,   263,   264,   235,   236,   237,
+     238,   260,   261,     0,   262,     0,     0,   242,   263,   264,
+       0,     0,     0,     0,     0,     0,   235,   236,   237,   238,
+     260,   261,     0,   262,     0,     0,   242,   263,   264,     0,
+       0,   245,   246,   247,   248,   249,   250,   251,     0,   570,
+       0,     0,     0,     0,   245,   246,   247,   248,   249,   250,
+     251,     0,   594,   318,   319,     0,     0,     0,     0,     0,
+       0,     0,     0,   245,   246,   247,   248,   249,   250,   251,
+     235,   236,   237,   238,   260,   261,     0,   262,     0,     0,
+     242,   263,   264,   351,   352,   353,   354,   355,   356,     0,
+     357,     0,     0,   358,   359,   360,   544,   545,     0,   546,
+     547,   548,     0,   549,     0,     0,   550,   551,   552,     0,
+       0,     0,     0,     0,     0,     0,     0,   245,   246,   247,
+     248,   249,   250,   251,     0,     0,     0,     0,     0,     0,
+     361,   362,   363,   364,   365,   366,   367,     0,     0,     0,
+       0,     0,     0,   553,   554,   555,   556,   557,   558,   559
 };
 
 static const yytype_int16 yycheck[] =
 {
-       0,   257,    10,     6,    23,     0,    31,    69,    16,    12,
-     233,    17,    90,   373,   161,    23,    33,    25,    51,    21,
-      28,   375,   169,    31,   512,    51,   543,    29,    30,    25,
-     384,   254,    36,   180,   476,   477,   478,    11,    12,    71,
-      33,    66,    46,    25,    86,   192,    78,   401,    30,    99,
-      46,     0,   540,   570,   132,   133,   134,    99,    66,    67,
-      71,   208,    99,    96,    97,    72,    71,    78,    99,    69,
-      96,    97,    72,    78,    11,    77,    13,    72,   334,    38,
-      39,    87,    99,    57,    21,    59,    51,    61,    71,    63,
-     100,    71,    29,    30,   104,    78,    35,   353,    78,   100,
-     323,    99,   100,    77,   101,   465,   548,   549,   550,   551,
-     552,   553,   554,   555,   556,   557,   558,   559,   560,   561,
-     562,   563,    99,    51,    99,    30,    54,    51,    65,    94,
-      95,    96,    97,    99,   142,    44,    45,    46,    47,   147,
-      77,   166,    51,   271,   272,    54,    55,    56,   371,   591,
-      51,    99,   512,    54,    91,    92,    93,    94,   166,   101,
-     514,   186,   170,   105,   172,    93,    94,    95,    96,    97,
-      94,    95,    96,    97,    99,   431,    99,    99,   186,   402,
-     540,    99,    91,    92,    93,    94,    95,    96,    97,    99,
-     105,    99,    93,    94,    95,    96,    97,   205,   135,   136,
-      99,   138,   139,   140,   141,   461,   143,    99,    99,   146,
-      30,   565,   415,   416,   417,   418,   105,    57,   421,    59,
-     574,    61,   104,    63,   286,   104,   100,   164,    44,    45,
-      99,    47,    28,   489,   171,    51,    30,    99,    54,    55,
-      56,   161,    28,   100,   598,    17,    99,    99,    99,   169,
-      89,   270,   271,   272,   102,   105,   193,    88,    99,    10,
-     180,   261,   270,   271,   272,    30,   261,   270,   271,   272,
-      73,    99,   192,   102,    36,    91,    92,    93,    94,    95,
-      96,    97,    99,   102,    99,    73,   286,   287,   208,    88,
-      87,    89,    90,    73,    99,    88,    88,    99,    99,    72,
-     237,   238,   239,   240,   241,   242,   243,   244,   245,   246,
-     247,   248,   249,   250,   251,   252,   253,   392,    30,   399,
-     465,   329,   502,   208,    -1,   262,   263,   264,   265,   266,
-     320,    -1,    -1,   131,   132,   133,   134,   329,    -1,   137,
-      -1,   278,   279,    -1,    -1,   282,   144,   145,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   294,    -1,   296,
-      -1,   298,    -1,   300,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   373,    16,   375,    -1,    -1,    -1,    -1,
-     388,    -1,    -1,    -1,   384,    -1,    -1,    -1,   325,   326,
-      -1,   328,    -1,    -1,    36,   332,    -1,    -1,   335,   399,
-      -1,   401,    44,    45,    46,    47,    48,    49,    -1,    51,
-      -1,    -1,    54,    55,    56,    -1,    -1,   354,   355,   356,
-     357,   358,   359,   360,   361,   362,   363,   364,   365,   366,
-     367,   368,   369,   370,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   382,   383,    -1,    -1,    91,
-      92,    93,    94,    95,    96,    97,    -1,   482,    -1,    -1,
-      -1,    -1,    -1,    -1,    30,   465,    -1,   467,    -1,    -1,
-      36,    -1,   467,    -1,   482,    -1,    -1,   414,    44,    45,
-      46,    47,    48,    49,    -1,    51,    -1,    -1,    54,    55,
-      56,    -1,    -1,    -1,    -1,   293,    -1,   295,    -1,   297,
-      -1,   299,    -1,   440,    -1,    -1,    -1,    -1,   508,    -1,
-      -1,    -1,   512,   508,   514,    -1,    -1,    -1,   526,    -1,
-      -1,   319,   320,   321,   322,    91,    92,    93,    94,    95,
-      96,    97,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     540,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   475,   476,   477,   478,    -1,
-      -1,    -1,    -1,    -1,    -1,   565,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   574,    -1,    -1,    -1,    -1,   516,
-      -1,    -1,    -1,    -1,    -1,    30,   594,   385,    -1,    -1,
-      -1,    36,    -1,    -1,    -1,    -1,    -1,    -1,   598,    44,
-      45,    46,    47,    48,    49,    -1,    51,    -1,   545,    54,
-      55,    56,    -1,    -1,    -1,   413,    -1,    -1,    -1,    -1,
-      -1,   419,   420,    -1,   422,   423,    -1,    -1,   548,   549,
-     550,   551,   552,   553,   554,   555,   556,   557,   558,   559,
-     560,   561,   562,   563,    -1,    -1,    91,    92,    93,    94,
-      95,    96,    97,    -1,    -1,    -1,    44,    45,    46,    47,
-      48,    49,    -1,    51,    -1,    -1,    54,    55,    56,    -1,
-      -1,   591,    -1,    -1,    -1,    -1,    -1,   475,   476,   477,
-     478,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   490,   491,   492,   493,    -1,    -1,   496,   497,
-     498,   499,    -1,    91,    92,    93,    94,    95,    96,    97,
-      -1,    30,   100,    -1,   102,    -1,    -1,    36,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    44,    45,    46,    47,    48,
-      49,    -1,    51,    -1,    -1,    54,    55,    56,    -1,   537,
+       0,    23,    10,   255,    69,     0,    31,     6,    16,    51,
+     231,    17,   370,    12,    33,    23,   539,    51,    11,    12,
+      28,   508,    36,    31,    25,   101,    99,    86,   372,   105,
+      21,   252,    46,   472,   473,   474,    33,   381,    29,    30,
+      99,    66,    25,   566,    51,    46,     0,    30,    51,   536,
+      71,   100,   100,   397,    96,    97,   104,    78,    66,    67,
+      94,    95,    96,    97,    57,   101,    59,    71,    61,    69,
+      63,    99,    72,    11,    78,    13,    72,    72,    30,   331,
+      99,    87,    99,    21,    77,    30,    77,    94,    95,    96,
+      97,    29,    30,    96,    97,    71,   105,    71,   350,   320,
+     269,   270,    78,   461,    78,   544,   545,   546,   547,   548,
+     549,   550,   551,   552,   553,   554,   555,   556,   557,   558,
+     559,    38,    39,    71,    99,    51,    99,    65,    54,    99,
+      78,    90,    99,   141,    44,    45,    46,    47,   146,    77,
+     165,    51,    99,   100,    54,    55,    56,   368,   587,    99,
+     508,   104,    99,    91,    92,    93,    94,   165,    57,   184,
+      59,   169,    61,   171,    63,    99,   510,    93,    94,    95,
+      96,    97,   131,   132,   133,   427,   184,   398,   536,    99,
+      99,    91,    92,    93,    94,    95,    96,    97,   411,   412,
+     413,   414,    99,    99,   417,   203,   134,   135,    99,   137,
+     138,   139,   140,    99,   142,   457,   104,   145,   105,   100,
+      28,   160,    99,    99,    30,    28,   100,   561,   283,   168,
+      17,    99,    99,    99,    89,   163,   570,    44,    45,   178,
+      47,   105,   170,   485,    51,   102,   160,    54,    55,    56,
+      88,   190,    99,    10,   168,    30,   268,   269,   270,    51,
+     594,    73,    54,   191,   178,   102,    99,   206,    36,   259,
+     268,   269,   270,    99,   259,    99,   190,   102,    73,   268,
+     269,   270,    87,    73,    91,    92,    93,    94,    95,    96,
+      97,    88,   206,   283,   284,    99,    72,    99,    89,    90,
+      88,    93,    94,    95,    96,    97,    88,   235,   236,   237,
+     238,   239,   240,   241,   242,   243,   244,   245,   246,   247,
+     248,   249,   250,   251,   388,    99,    30,   395,   326,   461,
+     498,   326,   260,   261,   262,   263,   264,   317,    -1,   130,
+     131,   132,   133,   206,    -1,   136,    -1,    -1,   276,    -1,
+      -1,   279,   143,   144,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   291,    -1,   293,    -1,   295,    -1,   297,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     548,   549,   550,   551,   552,   553,   554,   555,   556,   557,
-     558,   559,   560,   561,   562,   563,    -1,    -1,    -1,    -1,
-      -1,   569,    91,    92,    93,    94,    95,    96,    97,    -1,
-       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
-      15,    16,    17,   591,    19,    20,    21,    22,    23,    24,
-      25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
-      35,    36,    37,    38,    39,    40,    41,    42,    43,    -1,
-      -1,    -1,    -1,    48,    49,    50,    51,    52,    53,    -1,
-      55,    56,    57,    58,    59,    60,    61,    62,    63,    64,
-      65,    66,    67,    68,    69,    -1,    71,    72,    73,    74,
-      75,    76,    77,    78,    79,    80,    81,    82,    83,    84,
-      85,    86,    -1,    -1,    -1,    90,    -1,    -1,    -1,    94,
-      95,    -1,    -1,    -1,    -1,    -1,   101,    -1,   103,    -1,
-     105,     5,     6,     7,     8,     9,    10,    11,    12,    13,
+     370,    -1,   372,    -1,    -1,    -1,   384,    -1,    -1,    -1,
+      -1,   381,    -1,    -1,   322,   323,    -1,   325,    -1,    -1,
+      35,   329,    -1,    -1,   332,   395,    -1,   397,    -1,    44,
+      45,    46,    47,    48,    49,    -1,    51,    -1,    -1,    54,
+      55,    56,    -1,   351,   352,   353,   354,   355,   356,   357,
+     358,   359,   360,   361,   362,   363,   364,   365,   366,   367,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   379,   380,    -1,    -1,    16,    91,    92,    93,    94,
+      95,    96,    97,   478,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   461,    -1,   463,    -1,    36,    -1,    -1,   463,    -1,
+     478,    -1,   410,    44,    45,    46,    47,    48,    49,    -1,
+      51,    -1,    -1,    54,    55,    56,    -1,    -1,    -1,   290,
+      -1,   292,    -1,   294,    -1,   296,    -1,    -1,   436,    -1,
+      -1,    -1,    -1,    -1,   504,    -1,    -1,    -1,   508,   504,
+     510,    -1,    -1,    -1,   522,   316,   317,   318,   319,    -1,
+      91,    92,    93,    94,    95,    96,    97,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   536,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   471,   472,   473,
+     474,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   561,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     570,    -1,    -1,    -1,   512,    -1,    -1,    -1,    -1,    -1,
+      -1,   382,   590,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   594,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   541,    -1,    -1,    -1,    -1,   409,    -1,
+      -1,    -1,    -1,    -1,   415,   416,    -1,   418,   419,    -1,
+     544,   545,   546,   547,   548,   549,   550,   551,   552,   553,
+     554,   555,   556,   557,   558,   559,    30,    -1,    -1,    -1,
+      -1,    -1,    36,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      44,    45,    46,    47,    48,    49,    -1,    51,    -1,    -1,
+      54,    55,    56,   587,    -1,    -1,    -1,    -1,    -1,    -1,
+     471,   472,   473,   474,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   486,   487,   488,   489,    -1,
+      -1,   492,   493,   494,   495,    -1,    -1,    91,    92,    93,
+      94,    95,    96,    97,    30,    -1,    -1,    -1,    -1,    -1,
+      36,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    44,    45,
+      46,    47,    48,    49,    -1,    51,    -1,    -1,    54,    55,
+      56,    -1,   533,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   544,   545,   546,   547,   548,   549,   550,
+     551,   552,   553,   554,   555,   556,   557,   558,   559,    -1,
+      -1,    -1,    -1,    -1,   565,    91,    92,    93,    94,    95,
+      96,    97,    -1,     5,     6,     7,     8,     9,    10,    11,
+      12,    13,    14,    15,    16,    17,   587,    19,    20,    21,
+      22,    23,    24,    25,    26,    27,    28,    29,    30,    31,
+      32,    33,    34,    35,    36,    -1,    38,    39,    40,    41,
+      42,    43,    -1,    -1,    -1,    -1,    48,    49,    50,    51,
+      52,    53,    -1,    55,    56,    57,    58,    59,    60,    61,
+      62,    63,    64,    65,    66,    67,    68,    69,    -1,    71,
+      72,    73,    74,    75,    76,    77,    78,    79,    80,    81,
+      82,    83,    84,    85,    86,    -1,    -1,    -1,    90,    -1,
+      -1,    -1,    94,    95,    -1,    -1,    -1,    -1,    -1,   101,
+      -1,   103,    -1,   105,     5,     6,     7,     8,     9,    10,
+      11,    12,    13,    14,    15,    16,    17,    -1,    19,    20,
+      21,    22,    23,    24,    25,    26,    27,    28,    29,    30,
+      31,    32,    33,    34,    35,    36,    -1,    38,    39,    40,
+      41,    42,    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,    -1,
+      71,    72,    73,    74,    75,    76,    77,    78,    79,    80,
+      81,    82,    83,    84,    85,    86,    -1,    -1,    -1,    90,
+      91,    92,    93,    94,    95,    96,    97,    -1,    -1,   100,
+     101,    -1,   103,     5,     6,     7,     8,     9,    10,    11,
+      12,    13,    14,    15,    16,    17,    -1,    19,    20,    21,
+      22,    23,    24,    25,    26,    27,    28,    29,    30,    31,
+      32,    33,    34,    35,    36,    -1,    38,    39,    40,    41,
+      42,    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,    -1,    71,
+      72,    73,    74,    75,    76,    77,    78,    79,    80,    81,
+      82,    83,    84,    85,    86,    -1,    -1,    -1,    90,    91,
+      92,    93,    94,    95,    96,    97,    -1,    -1,   100,   101,
+      -1,   103,     5,     6,     7,     8,     9,    10,    11,    12,
+      13,    14,    15,    16,    17,    -1,    19,    20,    21,    22,
+      23,    24,    25,    26,    27,    28,    29,    30,    31,    32,
+      33,    34,    35,    36,    -1,    38,    39,    40,    41,    42,
+      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,    -1,    71,    72,
+      73,    74,    75,    76,    77,    78,    79,    80,    81,    82,
+      83,    84,    85,    86,    -1,    -1,    -1,    90,    91,    92,
+      93,    94,    95,    96,    97,    -1,    -1,   100,   101,    -1,
+     103,     5,     6,     7,     8,     9,    10,    11,    12,    13,
       14,    15,    16,    17,    -1,    19,    20,    21,    22,    23,
       24,    25,    26,    27,    28,    29,    30,    31,    32,    33,
-      34,    35,    36,    37,    38,    39,    40,    41,    42,    43,
+      34,    35,    36,    -1,    38,    39,    40,    41,    42,    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,    -1,    71,    72,    73,
@@ -1546,46 +1578,46 @@ static const yytype_int16 yycheck[] =
        5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
       15,    16,    17,    -1,    19,    20,    21,    22,    23,    24,
       25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
-      35,    36,    37,    38,    39,    40,    41,    42,    43,    44,
+      35,    36,    -1,    38,    39,    40,    41,    42,    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,    -1,    71,    72,    73,    74,
       75,    76,    77,    78,    79,    80,    81,    82,    83,    84,
       85,    86,    -1,    -1,    -1,    90,    91,    92,    93,    94,
-      95,    96,    97,    -1,    -1,   100,   101,    -1,   103,     5,
+      95,    96,    97,    -1,    -1,    -1,   101,    -1,   103,     5,
        6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
       16,    17,    -1,    19,    20,    21,    22,    23,    24,    25,
       26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
-      36,    37,    38,    39,    40,    41,    42,    43,    44,    45,
-      46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
+      36,    -1,    38,    39,    40,    41,    42,    43,    -1,    -1,
+      -1,    -1,    48,    49,    50,    51,    52,    53,    -1,    55,
       56,    57,    58,    59,    60,    61,    62,    63,    64,    65,
       66,    67,    68,    69,    -1,    71,    72,    73,    74,    75,
       76,    77,    78,    79,    80,    81,    82,    83,    84,    85,
-      86,    -1,    -1,    -1,    90,    91,    92,    93,    94,    95,
-      96,    97,    -1,    -1,   100,   101,    -1,   103,     5,     6,
+      86,    -1,    -1,    -1,    90,    -1,    -1,    -1,    94,    95,
+      -1,    -1,    -1,    -1,    -1,   101,   102,   103,     5,     6,
        7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
       17,    -1,    19,    20,    21,    22,    23,    24,    25,    26,
       27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
-      37,    38,    39,    40,    41,    42,    43,    44,    45,    46,
-      47,    48,    49,    50,    51,    52,    53,    54,    55,    56,
+      -1,    38,    39,    40,    41,    42,    43,    -1,    -1,    -1,
+      -1,    48,    49,    50,    51,    52,    53,    -1,    55,    56,
       57,    58,    59,    60,    61,    62,    63,    64,    65,    66,
       67,    68,    69,    -1,    71,    72,    73,    74,    75,    76,
       77,    78,    79,    80,    81,    82,    83,    84,    85,    86,
-      -1,    -1,    -1,    90,    91,    92,    93,    94,    95,    96,
-      97,    -1,    -1,   100,   101,    -1,   103,     5,     6,     7,
+      -1,    -1,    -1,    90,    -1,    -1,    -1,    94,    95,    -1,
+      -1,    -1,    -1,    -1,   101,   102,   103,     5,     6,     7,
        8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
       -1,    19,    20,    21,    22,    23,    24,    25,    26,    27,
-      28,    29,    30,    31,    32,    33,    34,    35,    36,    37,
-      38,    39,    40,    41,    42,    43,    44,    45,    46,    47,
-      48,    49,    50,    51,    52,    53,    54,    55,    56,    57,
+      28,    29,    30,    31,    32,    33,    34,    35,    36,    -1,
+      38,    39,    40,    41,    42,    43,    -1,    -1,    -1,    -1,
+      48,    49,    50,    51,    52,    53,    -1,    55,    56,    57,
       58,    59,    60,    61,    62,    63,    64,    65,    66,    67,
       68,    69,    -1,    71,    72,    73,    74,    75,    76,    77,
       78,    79,    80,    81,    82,    83,    84,    85,    86,    -1,
-      -1,    -1,    90,    91,    92,    93,    94,    95,    96,    97,
-      -1,    -1,    -1,   101,    -1,   103,     5,     6,     7,     8,
+      -1,    -1,    90,    -1,    -1,    -1,    94,    95,    -1,    -1,
+      -1,    -1,    -1,   101,   102,   103,     5,     6,     7,     8,
        9,    10,    11,    12,    13,    14,    15,    16,    17,    -1,
       19,    20,    21,    22,    23,    24,    25,    26,    27,    28,
-      29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
+      29,    30,    31,    32,    33,    34,    35,    36,    -1,    38,
       39,    40,    41,    42,    43,    -1,    -1,    -1,    -1,    48,
       49,    50,    51,    52,    53,    -1,    55,    56,    57,    58,
       59,    60,    61,    62,    63,    64,    65,    66,    67,    68,
@@ -1595,7 +1627,7 @@ static const yytype_int16 yycheck[] =
       -1,    -1,   101,   102,   103,     5,     6,     7,     8,     9,
       10,    11,    12,    13,    14,    15,    16,    17,    -1,    19,
       20,    21,    22,    23,    24,    25,    26,    27,    28,    29,
-      30,    31,    32,    33,    34,    35,    36,    37,    38,    39,
+      30,    31,    32,    33,    34,    35,    36,    -1,    38,    39,
       40,    41,    42,    43,    -1,    -1,    -1,    -1,    48,    49,
       50,    51,    52,    53,    -1,    55,    56,    57,    58,    59,
       60,    61,    62,    63,    64,    65,    66,    67,    68,    69,
@@ -1605,37 +1637,37 @@ static const yytype_int16 yycheck[] =
       -1,   101,   102,   103,     5,     6,     7,     8,     9,    10,
       11,    12,    13,    14,    15,    16,    17,    -1,    19,    20,
       21,    22,    23,    24,    25,    26,    27,    28,    29,    30,
-      31,    32,    33,    34,    35,    36,    37,    38,    39,    40,
+      31,    32,    33,    34,    35,    36,    -1,    38,    39,    40,
       41,    42,    43,    -1,    -1,    -1,    -1,    48,    49,    50,
       51,    52,    53,    -1,    55,    56,    57,    58,    59,    60,
       61,    62,    63,    64,    65,    66,    67,    68,    69,    -1,
       71,    72,    73,    74,    75,    76,    77,    78,    79,    80,
       81,    82,    83,    84,    85,    86,    -1,    -1,    -1,    90,
       -1,    -1,    -1,    94,    95,    -1,    -1,    -1,    -1,    -1,
-     101,   102,   103,     5,     6,     7,     8,     9,    10,    11,
+     101,    -1,   103,     5,     6,     7,     8,     9,    10,    11,
       12,    13,    14,    15,    16,    17,    -1,    19,    20,    21,
       22,    23,    24,    25,    26,    27,    28,    29,    30,    31,
-      32,    33,    34,    35,    36,    37,    38,    39,    40,    41,
+      32,    33,    34,    35,    36,    -1,    38,    39,    40,    41,
       42,    43,    -1,    -1,    -1,    -1,    48,    49,    50,    51,
       52,    53,    -1,    55,    56,    57,    58,    59,    60,    61,
       62,    63,    64,    65,    66,    67,    68,    69,    -1,    71,
       72,    73,    74,    75,    76,    77,    78,    79,    80,    81,
       82,    83,    84,    85,    86,    -1,    -1,    -1,    90,    -1,
       -1,    -1,    94,    95,    -1,    -1,    -1,    -1,    -1,   101,
-     102,   103,     5,     6,     7,     8,     9,    10,    11,    12,
+      -1,   103,     5,     6,     7,     8,     9,    10,    11,    12,
       13,    14,    15,    16,    17,    -1,    19,    20,    21,    22,
       23,    24,    25,    26,    27,    28,    29,    30,    31,    32,
-      33,    34,    35,    36,    37,    38,    39,    40,    41,    42,
+      33,    34,    35,    36,    -1,    38,    39,    40,    41,    42,
       43,    -1,    -1,    -1,    -1,    48,    49,    50,    51,    52,
       53,    -1,    55,    56,    57,    58,    59,    60,    61,    62,
       63,    64,    65,    66,    67,    68,    69,    -1,    71,    72,
       73,    74,    75,    76,    77,    78,    79,    80,    81,    82,
       83,    84,    85,    86,    -1,    -1,    -1,    90,    -1,    -1,
-      -1,    94,    95,    -1,    -1,    -1,    -1,    -1,   101,   102,
+      -1,    94,    95,    -1,    -1,    -1,    -1,    -1,   101,    -1,
      103,     5,     6,     7,     8,     9,    10,    11,    12,    13,
       14,    15,    16,    17,    -1,    19,    20,    21,    22,    23,
       24,    25,    26,    27,    28,    29,    30,    31,    32,    33,
-      34,    35,    36,    37,    38,    39,    40,    41,    42,    43,
+      34,    35,    36,    -1,    38,    39,    40,    41,    42,    43,
       -1,    -1,    -1,    -1,    48,    49,    50,    51,    52,    53,
       -1,    55,    56,    57,    58,    59,    60,    61,    62,    63,
       64,    65,    66,    67,    68,    69,    -1,    71,    72,    73,
@@ -1645,7 +1677,7 @@ static const yytype_int16 yycheck[] =
        5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
       15,    16,    17,    -1,    19,    20,    21,    22,    23,    24,
       25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
-      35,    36,    37,    38,    39,    40,    41,    42,    43,    -1,
+      35,    36,    -1,    38,    39,    40,    41,    42,    43,    -1,
       -1,    -1,    -1,    48,    49,    50,    51,    52,    53,    -1,
       55,    56,    57,    58,    59,    60,    61,    62,    63,    64,
       65,    66,    67,    68,    69,    -1,    71,    72,    73,    74,
@@ -1655,7 +1687,7 @@ static const yytype_int16 yycheck[] =
        6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
       16,    17,    -1,    19,    20,    21,    22,    23,    24,    25,
       26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
-      36,    37,    38,    39,    40,    41,    42,    43,    -1,    -1,
+      36,    -1,    38,    39,    40,    41,    42,    43,    -1,    -1,
       -1,    -1,    48,    49,    50,    51,    52,    53,    -1,    55,
       56,    57,    58,    59,    60,    61,    62,    63,    64,    65,
       66,    67,    68,    69,    -1,    71,    72,    73,    74,    75,
@@ -1665,7 +1697,7 @@ static const yytype_int16 yycheck[] =
        7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
       17,    -1,    19,    20,    21,    22,    23,    24,    25,    26,
       27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
-      37,    38,    39,    40,    41,    42,    43,    -1,    -1,    -1,
+      -1,    38,    39,    40,    41,    42,    43,    -1,    -1,    -1,
       -1,    48,    49,    50,    51,    52,    53,    -1,    55,    56,
       57,    58,    59,    60,    61,    62,    63,    64,    65,    66,
       67,    68,    69,    -1,    71,    72,    73,    74,    75,    76,
@@ -1674,7 +1706,7 @@ static const yytype_int16 yycheck[] =
       -1,    -1,    -1,    -1,   101,    -1,   103,     5,     6,     7,
        8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
       -1,    19,    20,    21,    22,    23,    24,    25,    26,    27,
-      28,    29,    30,    31,    32,    33,    34,    35,    36,    37,
+      28,    29,    30,    31,    32,    33,    34,    35,    36,    -1,
       38,    39,    40,    41,    42,    43,    -1,    -1,    -1,    -1,
       48,    49,    50,    51,    52,    53,    -1,    55,    56,    57,
       58,    59,    60,    61,    62,    63,    64,    65,    66,    67,
@@ -1684,9 +1716,9 @@ static const yytype_int16 yycheck[] =
       -1,    -1,    -1,   101,    -1,   103,     5,     6,     7,     8,
        9,    10,    11,    12,    13,    14,    15,    16,    17,    -1,
       19,    20,    21,    22,    23,    24,    25,    26,    27,    28,
-      29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
-      39,    40,    41,    42,    43,    -1,    -1,    -1,    -1,    48,
-      49,    50,    51,    52,    53,    -1,    55,    56,    57,    58,
+      29,    30,    31,    32,    33,    34,    35,    36,    -1,    38,
+      39,    40,    41,    42,    43,    -1,    -1,    -1,    -1,    -1,
+      -1,    50,    51,    52,    53,    -1,    55,    56,    57,    58,
       59,    60,    61,    62,    63,    64,    65,    66,    67,    68,
       69,    -1,    71,    72,    73,    74,    75,    76,    77,    78,
       79,    80,    81,    82,    83,    84,    85,    86,    -1,    -1,
@@ -1694,9 +1726,9 @@ static const yytype_int16 yycheck[] =
       -1,    -1,   101,    -1,   103,     5,     6,     7,     8,     9,
       10,    11,    12,    13,    14,    15,    16,    17,    -1,    19,
       20,    21,    22,    23,    24,    25,    26,    27,    28,    29,
-      30,    31,    32,    33,    34,    35,    36,    37,    38,    39,
-      40,    41,    42,    43,    -1,    -1,    -1,    -1,    48,    49,
-      50,    51,    52,    53,    -1,    55,    56,    57,    58,    59,
+      30,    31,    32,    33,    34,    35,    36,    -1,    38,    39,
+      40,    41,    42,    43,    -1,    -1,    -1,    -1,    -1,    -1,
+      50,    51,    52,    53,    -1,    -1,    -1,    57,    58,    59,
       60,    61,    62,    63,    64,    65,    66,    67,    68,    69,
       -1,    71,    72,    73,    74,    75,    76,    77,    78,    79,
       80,    81,    82,    83,    84,    85,    86,    -1,    -1,    -1,
@@ -1704,75 +1736,21 @@ static const yytype_int16 yycheck[] =
       -1,   101,    -1,   103,     5,     6,     7,     8,     9,    10,
       11,    12,    13,    14,    15,    16,    17,    -1,    19,    20,
       21,    22,    23,    24,    25,    26,    27,    28,    29,    30,
-      31,    32,    33,    34,    35,    36,    37,    38,    39,    40,
-      41,    42,    43,    -1,    -1,    -1,    -1,    48,    49,    50,
-      51,    52,    53,    -1,    55,    56,    57,    58,    59,    60,
+      31,    32,    33,    34,    35,    36,    -1,    38,    39,    40,
+      41,    42,    43,    -1,    -1,    -1,    -1,    -1,    -1,    50,
+      -1,    52,    53,    -1,    -1,    -1,    57,    58,    59,    60,
       61,    62,    63,    64,    65,    66,    67,    68,    69,    -1,
       71,    72,    73,    74,    75,    76,    77,    78,    79,    80,
       81,    82,    83,    84,    85,    86,    -1,    -1,    -1,    90,
-      -1,    -1,    -1,    94,    95,    -1,    -1,    -1,    -1,    -1,
-     101,    -1,   103,     5,     6,     7,     8,     9,    10,    11,
-      12,    13,    14,    15,    16,    17,    -1,    19,    20,    21,
-      22,    23,    24,    25,    26,    27,    28,    29,    30,    31,
-      32,    33,    34,    35,    36,    37,    38,    39,    40,    41,
-      42,    43,    -1,    -1,    -1,    -1,    -1,    -1,    50,    51,
-      52,    53,    -1,    55,    56,    57,    58,    59,    60,    61,
-      62,    63,    64,    65,    66,    67,    68,    69,    -1,    71,
-      72,    73,    74,    75,    76,    77,    78,    79,    80,    81,
-      82,    83,    84,    85,    86,    -1,    -1,    -1,    90,    -1,
-      -1,    -1,    94,    95,    -1,    -1,    -1,    -1,    -1,   101,
-      -1,   103,     5,     6,     7,     8,     9,    10,    11,    12,
-      13,    14,    15,    16,    17,    -1,    19,    20,    21,    22,
-      23,    24,    25,    26,    27,    28,    29,    30,    31,    32,
-      33,    34,    35,    36,    37,    38,    39,    40,    41,    42,
-      43,    -1,    -1,    -1,    -1,    -1,    -1,    50,    51,    52,
-      53,    -1,    -1,    -1,    57,    58,    59,    60,    61,    62,
-      63,    64,    65,    66,    67,    68,    69,    -1,    71,    72,
-      73,    74,    75,    76,    77,    78,    79,    80,    81,    82,
-      83,    84,    85,    86,    -1,    -1,    -1,    90,    -1,    -1,
-      -1,    94,    95,    -1,    -1,    -1,    -1,    -1,   101,    -1,
-     103,     5,     6,     7,     8,     9,    10,    11,    12,    13,
-      14,    15,    16,    17,    -1,    19,    20,    21,    22,    23,
-      24,    25,    26,    27,    28,    29,    30,    31,    32,    33,
-      34,    35,    36,    37,    38,    39,    40,    41,    42,    43,
-      -1,    -1,    -1,    -1,    -1,    -1,    50,    -1,    52,    53,
-      -1,    -1,    -1,    57,    58,    59,    60,    61,    62,    63,
-      64,    65,    66,    67,    68,    69,    -1,    71,    72,    73,
-      74,    75,    76,    77,    78,    79,    80,    81,    82,    83,
-      84,    85,    86,    -1,    -1,    -1,    90,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,     7,   101,    -1,   103,
-      11,    12,    13,    14,    15,    16,    -1,    -1,    19,    20,
-      21,    22,    23,    24,    25,    26,    27,    28,    29,    30,
-      31,    32,    33,    34,    -1,    36,    37,    38,    39,    40,
-      41,    42,    43,    -1,    -1,    -1,    -1,    48,    49,    50,
-      51,    52,    53,    -1,    55,    56,    57,    58,    59,    60,
-      61,    62,    63,    64,    65,    66,    67,    68,    69,    -1,
-      71,    72,    73,    74,    75,    76,    77,    78,    79,    80,
-      81,    82,    83,    84,    85,    -1,    87,     7,    -1,    90,
-      -1,    11,    12,    13,    14,    15,    16,    -1,    99,    19,
-      20,    21,    22,    23,    24,    25,    26,    -1,    28,    29,
-      30,    31,    32,    33,    34,    -1,    36,    37,    38,    39,
-      -1,    41,    42,    43,    -1,    -1,    -1,    -1,    48,    49,
-      50,    51,    52,    53,    -1,    55,    56,    57,    58,    59,
-      60,    61,    62,    63,    64,    65,    66,    67,    68,    69,
-      -1,    71,    72,    73,    74,    75,    76,    77,    78,    79,
-      80,    81,    82,    83,    84,    -1,    -1,    87,     7,    -1,
-      90,    -1,    11,    12,    13,    14,    15,    16,    -1,    99,
-      19,    20,    21,    22,    23,    24,    25,    26,    -1,    28,
-      29,    30,    31,    32,    33,    34,    -1,    36,    37,    38,
-      39,    -1,    41,    42,    43,    -1,    -1,    -1,    -1,    48,
-      49,    50,    51,    52,    53,    -1,    55,    56,    57,    58,
-      59,    60,    61,    62,    63,    64,    65,    66,    67,    68,
-      69,    -1,    71,    72,    73,    74,    75,    76,    77,    78,
-      79,    80,    81,    82,    83,    84,    -1,    -1,    87,     7,
-      -1,    90,    -1,    11,    12,    13,    14,    15,    16,    -1,
-      99,    19,    20,    21,    22,    23,    24,    25,    26,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,     7,
+     101,    -1,   103,    11,    12,    13,    14,    15,    16,    -1,
+      -1,    19,    20,    21,    22,    23,    24,    25,    26,    27,
       28,    29,    30,    31,    32,    33,    34,    -1,    36,    37,
-      38,    39,    -1,    41,    42,    43,    -1,    -1,    -1,    -1,
+      38,    39,    40,    41,    42,    43,    -1,    -1,    -1,    -1,
       48,    49,    50,    51,    52,    53,    -1,    55,    56,    57,
       58,    59,    60,    61,    62,    63,    64,    65,    66,    67,
       68,    69,    -1,    71,    72,    73,    74,    75,    76,    77,
-      78,    79,    80,    81,    82,    83,    84,    -1,    -1,    87,
+      78,    79,    80,    81,    82,    83,    84,    85,    -1,    87,
        7,    -1,    90,    -1,    11,    12,    13,    14,    15,    16,
       -1,    99,    19,    20,    21,    22,    23,    24,    25,    26,
       -1,    28,    29,    30,    31,    32,    33,    34,    -1,    36,
@@ -1789,35 +1767,35 @@ static const yytype_int16 yycheck[] =
       56,    57,    58,    59,    60,    61,    62,    63,    64,    65,
       66,    67,    68,    69,    -1,    71,    72,    73,    74,    75,
       76,    77,    78,    79,    80,    81,    82,    83,    84,    -1,
-      -1,    -1,    -1,    -1,    90,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    99,     7,     8,     9,    10,    11,    12,
-      13,    14,    15,    16,    17,    -1,    19,    20,    21,    22,
-      23,    24,    25,    26,    27,    28,    29,    30,    31,    32,
-      33,    34,    35,    36,    37,    38,    39,    40,    41,    42,
+      -1,    87,     7,    -1,    90,    -1,    11,    12,    13,    14,
+      15,    16,    -1,    99,    19,    20,    21,    22,    23,    24,
+      25,    26,    -1,    28,    29,    30,    31,    32,    33,    34,
+      -1,    36,    37,    38,    39,    -1,    41,    42,    43,    -1,
+      -1,    -1,    -1,    48,    49,    50,    51,    52,    53,    -1,
+      55,    56,    57,    58,    59,    60,    61,    62,    63,    64,
+      65,    66,    67,    68,    69,    -1,    71,    72,    73,    74,
+      75,    76,    77,    78,    79,    80,    81,    82,    83,    84,
+      -1,    -1,    87,     7,    -1,    90,    -1,    11,    12,    13,
+      14,    15,    16,    -1,    99,    19,    20,    21,    22,    23,
+      24,    25,    26,    -1,    28,    29,    30,    31,    32,    33,
+      34,    -1,    36,    37,    38,    39,    -1,    41,    42,    43,
+      -1,    -1,    -1,    -1,    48,    49,    50,    51,    52,    53,
+      -1,    55,    56,    57,    58,    59,    60,    61,    62,    63,
+      64,    65,    66,    67,    68,    69,    -1,    71,    72,    73,
+      74,    75,    76,    77,    78,    79,    80,    81,    82,    83,
+      84,    -1,    -1,    87,     7,    -1,    90,    -1,    11,    12,
+      13,    14,    15,    16,    -1,    99,    19,    20,    21,    22,
+      23,    24,    25,    26,    -1,    28,    29,    30,    31,    32,
+      33,    34,    -1,    36,    37,    38,    39,    -1,    41,    42,
       43,    -1,    -1,    -1,    -1,    48,    49,    50,    51,    52,
       53,    -1,    55,    56,    57,    58,    59,    60,    61,    62,
       63,    64,    65,    66,    67,    68,    69,    -1,    71,    72,
       73,    74,    75,    76,    77,    78,    79,    80,    81,    82,
-      83,    84,    85,    86,    -1,     7,    -1,    90,    10,    11,
-      12,    13,    14,    15,    16,    17,    -1,    19,    20,    21,
-      22,    23,    24,    25,    26,    27,    28,    29,    30,    31,
-      32,    33,    34,    35,    36,    37,    38,    39,    40,    41,
-      42,    43,    -1,    -1,    -1,    -1,    48,    49,    50,    51,
-      52,    53,    -1,    55,    56,    57,    58,    59,    60,    61,
-      62,    63,    64,    65,    66,    67,    68,    69,    -1,    71,
-      72,    73,    74,    75,    76,    77,    78,    79,    80,    81,
-      82,    83,    84,    85,    86,    -1,     7,    -1,    90,    10,
-      11,    12,    13,    14,    15,    16,    17,    -1,    19,    20,
-      21,    22,    23,    24,    25,    26,    27,    28,    29,    30,
-      31,    32,    33,    34,    35,    36,    37,    38,    39,    40,
-      41,    42,    43,    -1,    -1,    -1,    -1,    48,    49,    50,
-      51,    52,    53,    -1,    55,    56,    57,    58,    59,    60,
-      61,    62,    63,    64,    65,    66,    67,    68,    69,    -1,
-      71,    72,    73,    74,    75,    76,    77,    78,    79,    80,
-      81,    82,    83,    84,    85,    86,    -1,     7,    -1,    90,
+      83,    84,    -1,    -1,    -1,    -1,    -1,    90,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    99,     7,     8,     9,
       10,    11,    12,    13,    14,    15,    16,    17,    -1,    19,
       20,    21,    22,    23,    24,    25,    26,    27,    28,    29,
-      30,    31,    32,    33,    34,    35,    36,    37,    38,    39,
+      30,    31,    32,    33,    34,    35,    36,    -1,    38,    39,
       40,    41,    42,    43,    -1,    -1,    -1,    -1,    48,    49,
       50,    51,    52,    53,    -1,    55,    56,    57,    58,    59,
       60,    61,    62,    63,    64,    65,    66,    67,    68,    69,
@@ -1825,79 +1803,107 @@ static const yytype_int16 yycheck[] =
       80,    81,    82,    83,    84,    85,    86,    -1,     7,    -1,
       90,    10,    11,    12,    13,    14,    15,    16,    17,    -1,
       19,    20,    21,    22,    23,    24,    25,    26,    27,    28,
-      29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
+      29,    30,    31,    32,    33,    34,    35,    36,    -1,    38,
       39,    40,    41,    42,    43,    -1,    -1,    -1,    -1,    48,
       49,    50,    51,    52,    53,    -1,    55,    56,    57,    58,
       59,    60,    61,    62,    63,    64,    65,    66,    67,    68,
       69,    -1,    71,    72,    73,    74,    75,    76,    77,    78,
-      79,    80,    81,    82,    83,    84,    85,    86,     7,    -1,
-      -1,    90,    11,    12,    13,    14,    15,    16,    -1,    -1,
-      19,    20,    21,    22,    23,    -1,    25,    26,    -1,    28,
-      29,    30,    31,    32,    33,    34,    -1,    36,    -1,    38,
-      39,    -1,    41,    42,    43,    -1,    -1,    -1,    -1,    48,
-      49,    50,    51,    52,    53,    -1,    55,    56,    57,    58,
-      59,    60,    61,    62,    63,    64,    65,    66,    67,    68,
-      69,    -1,    71,    72,    73,    74,    75,    76,    77,    78,
-      79,    80,    81,    82,    30,    84,    -1,    -1,    -1,    -1,
-      36,    90,    -1,    -1,    -1,    -1,    -1,    30,    44,    45,
-      46,    47,    48,    49,    -1,    51,    -1,    -1,    54,    55,
-      56,    44,    45,    46,    47,    48,    49,    30,    51,    -1,
-      -1,    54,    55,    56,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    44,    45,    46,    47,    48,    49,    -1,    51,    -1,
-      -1,    54,    55,    56,    -1,    91,    92,    93,    94,    95,
-      96,    97,    -1,    -1,    -1,    -1,    -1,    -1,    91,    92,
-      93,    94,    95,    96,    97,    -1,    -1,    -1,    -1,    -1,
+      79,    80,    81,    82,    83,    84,    85,    86,    -1,     7,
+      -1,    90,    10,    11,    12,    13,    14,    15,    16,    17,
+      -1,    19,    20,    21,    22,    23,    24,    25,    26,    27,
+      28,    29,    30,    31,    32,    33,    34,    35,    36,    -1,
+      38,    39,    40,    41,    42,    43,    -1,    -1,    -1,    -1,
+      48,    49,    50,    51,    52,    53,    -1,    55,    56,    57,
+      58,    59,    60,    61,    62,    63,    64,    65,    66,    67,
+      68,    69,    -1,    71,    72,    73,    74,    75,    76,    77,
+      78,    79,    80,    81,    82,    83,    84,    85,    86,    -1,
+       7,    -1,    90,    10,    11,    12,    13,    14,    15,    16,
+      17,    -1,    19,    20,    21,    22,    23,    24,    25,    26,
+      27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
+      -1,    38,    39,    40,    41,    42,    43,    -1,    -1,    -1,
+      -1,    48,    49,    50,    51,    52,    53,    -1,    55,    56,
+      57,    58,    59,    60,    61,    62,    63,    64,    65,    66,
+      67,    68,    69,    -1,    71,    72,    73,    74,    75,    76,
+      77,    78,    79,    80,    81,    82,    83,    84,    85,    86,
+      -1,     7,    -1,    90,    10,    11,    12,    13,    14,    15,
+      16,    17,    -1,    19,    20,    21,    22,    23,    24,    25,
+      26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
+      36,    -1,    38,    39,    40,    41,    42,    43,    -1,    -1,
+      -1,    -1,    48,    49,    50,    51,    52,    53,    -1,    55,
+      56,    57,    58,    59,    60,    61,    62,    63,    64,    65,
+      66,    67,    68,    69,    -1,    71,    72,    73,    74,    75,
+      76,    77,    78,    79,    80,    81,    82,    83,    84,    85,
+      86,     7,    -1,    -1,    90,    11,    12,    13,    14,    15,
+      16,    -1,    -1,    19,    20,    21,    22,    23,    -1,    25,
+      26,    -1,    28,    29,    30,    31,    32,    33,    34,    -1,
+      36,    -1,    38,    39,    -1,    41,    42,    43,    -1,    -1,
+      -1,    -1,    48,    49,    50,    51,    52,    53,    -1,    55,
+      56,    57,    58,    59,    60,    61,    62,    63,    64,    65,
+      66,    67,    68,    69,    -1,    71,    72,    73,    74,    75,
+      76,    77,    78,    79,    80,    81,    82,    30,    84,    -1,
+      -1,    -1,    -1,    36,    90,    -1,    -1,    -1,    -1,    -1,
+      -1,    44,    45,    46,    47,    48,    49,    -1,    51,    30,
+      -1,    54,    55,    56,    -1,    36,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    44,    45,    46,    47,    48,    49,    -1,
+      51,    -1,    -1,    54,    55,    56,    -1,    -1,    -1,    -1,
       -1,    30,    -1,    -1,    -1,    -1,    -1,    -1,    91,    92,
       93,    94,    95,    96,    97,    44,    45,    46,    47,    48,
-      49,    30,    51,    -1,    -1,    54,    55,    56,    -1,    -1,
-      -1,    -1,    -1,    -1,    30,    44,    45,    46,    47,    48,
-      49,    -1,    51,    -1,    -1,    54,    55,    56,    44,    45,
-      -1,    47,    48,    49,    -1,    51,    -1,    -1,    54,    55,
-      56,    36,    91,    92,    93,    94,    95,    96,    97,    44,
-      45,    46,    47,    48,    49,    -1,    51,    -1,    -1,    54,
-      55,    56,    91,    92,    93,    94,    95,    96,    97,    -1,
-      -1,    -1,    -1,    35,    -1,    91,    92,    93,    94,    95,
-      96,    97,    44,    45,    46,    47,    48,    49,    -1,    51,
-      -1,    -1,    54,    55,    56,    -1,    91,    92,    93,    94,
-      95,    96,    97,    -1,    99,    44,    45,    46,    47,    48,
-      49,    -1,    51,    -1,    -1,    54,    55,    56,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    91,
-      92,    93,    94,    95,    96,    97,    44,    45,    46,    47,
-      48,    49,    -1,    51,    -1,    -1,    54,    55,    56,    -1,
-      -1,    -1,    91,    92,    93,    94,    95,    96,    97,    -1,
-      -1,   100,    -1,   102,    44,    45,    46,    47,    48,    49,
-      -1,    51,    -1,    -1,    54,    55,    56,    -1,    -1,    -1,
-      -1,    -1,    -1,    91,    92,    93,    94,    95,    96,    97,
-      -1,    -1,    -1,    -1,   102,    44,    45,    46,    47,    48,
+      49,    -1,    51,    30,    -1,    54,    55,    56,    -1,    -1,
+      91,    92,    93,    94,    95,    96,    97,    44,    45,    46,
+      47,    48,    49,    -1,    51,    -1,    -1,    54,    55,    56,
+      -1,    -1,    -1,    -1,    -1,    30,    -1,    -1,    -1,    -1,
+      -1,    -1,    91,    92,    93,    94,    95,    96,    97,    44,
+      45,    46,    47,    48,    49,    -1,    51,    30,    -1,    54,
+      55,    56,    -1,    -1,    91,    92,    93,    94,    95,    96,
+      97,    44,    45,    46,    47,    48,    49,    -1,    51,    -1,
+      -1,    54,    55,    56,    -1,    -1,    -1,    -1,    -1,    30,
+      -1,    -1,    -1,    -1,    -1,    -1,    91,    92,    93,    94,
+      95,    96,    97,    44,    45,    -1,    47,    48,    49,    -1,
+      51,    -1,    -1,    54,    55,    56,    -1,    36,    91,    92,
+      93,    94,    95,    96,    97,    44,    45,    46,    47,    48,
       49,    -1,    51,    -1,    -1,    54,    55,    56,    -1,    -1,
-      -1,    91,    92,    93,    94,    95,    96,    97,    -1,    -1,
-     100,    44,    45,    46,    47,    48,    49,    -1,    51,    -1,
-      -1,    54,    55,    56,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      91,    92,    93,    94,    95,    96,    97,    44,    45,    46,
+      47,    48,    49,    -1,    51,    -1,    -1,    54,    55,    56,
       -1,    -1,    91,    92,    93,    94,    95,    96,    97,    -1,
       99,    44,    45,    46,    47,    48,    49,    -1,    51,    -1,
-      -1,    54,    55,    56,    -1,    -1,    -1,    -1,    91,    92,
-      93,    94,    95,    96,    97,    -1,    99,    44,    45,    46,
-      47,    48,    49,    -1,    51,    -1,    -1,    54,    55,    56,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    91,    92,
-      93,    94,    95,    96,    97,    -1,    99,    44,    45,    46,
-      47,    48,    49,    -1,    51,    -1,    -1,    54,    55,    56,
-      -1,    -1,    -1,    -1,    91,    92,    93,    94,    95,    96,
-      97,    -1,    99,    44,    45,    46,    47,    48,    49,    -1,
-      51,    -1,    -1,    54,    55,    56,    -1,    -1,    -1,    -1,
+      -1,    54,    55,    56,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    91,    92,    93,    94,    95,    96,
-      97,    -1,    99,    44,    45,    46,    47,    48,    49,    -1,
-      51,    -1,    -1,    54,    55,    56,    -1,    -1,    -1,    -1,
-      91,    92,    93,    94,    95,    96,    97,    -1,    99,    -1,
-      -1,    -1,    44,    45,    46,    47,    48,    49,    -1,    51,
-      81,    82,    54,    55,    56,    -1,    -1,    -1,    -1,    -1,
-      91,    92,    93,    94,    95,    96,    97,    44,    45,    46,
+      97,    -1,    -1,   100,    -1,   102,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    91,    92,
+      93,    94,    95,    96,    97,    -1,    -1,   100,    -1,   102,
+      44,    45,    46,    47,    48,    49,    -1,    51,    -1,    -1,
+      54,    55,    56,    44,    45,    46,    47,    48,    49,    -1,
+      51,    -1,    -1,    54,    55,    56,    44,    45,    46,    47,
+      48,    49,    -1,    51,    -1,    -1,    54,    55,    56,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    91,    92,    93,
+      94,    95,    96,    97,    -1,    -1,    -1,    -1,   102,    -1,
+      91,    92,    93,    94,    95,    96,    97,    -1,    -1,   100,
+      -1,    -1,    -1,    91,    92,    93,    94,    95,    96,    97,
+      -1,    99,    44,    45,    46,    47,    48,    49,    -1,    51,
+      -1,    -1,    54,    55,    56,    44,    45,    46,    47,    48,
+      49,    -1,    51,    -1,    -1,    54,    55,    56,    44,    45,
+      46,    47,    48,    49,    -1,    51,    -1,    -1,    54,    55,
+      56,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    91,
+      92,    93,    94,    95,    96,    97,    -1,    99,    -1,    -1,
+      -1,    -1,    91,    92,    93,    94,    95,    96,    97,    -1,
+      99,    -1,    -1,    -1,    -1,    91,    92,    93,    94,    95,
+      96,    97,    -1,    99,    44,    45,    46,    47,    48,    49,
+      -1,    51,    -1,    -1,    54,    55,    56,    44,    45,    46,
       47,    48,    49,    -1,    51,    -1,    -1,    54,    55,    56,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    91,
-      92,    93,    94,    95,    96,    97,    44,    45,    -1,    47,
+      -1,    -1,    -1,    -1,    -1,    -1,    44,    45,    46,    47,
       48,    49,    -1,    51,    -1,    -1,    54,    55,    56,    -1,
+      -1,    91,    92,    93,    94,    95,    96,    97,    -1,    99,
       -1,    -1,    -1,    -1,    91,    92,    93,    94,    95,    96,
-      97,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      97,    -1,    99,    81,    82,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    91,    92,    93,    94,    95,    96,    97,
+      44,    45,    46,    47,    48,    49,    -1,    51,    -1,    -1,
+      54,    55,    56,    44,    45,    46,    47,    48,    49,    -1,
+      51,    -1,    -1,    54,    55,    56,    44,    45,    -1,    47,
+      48,    49,    -1,    51,    -1,    -1,    54,    55,    56,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    91,    92,    93,
+      94,    95,    96,    97,    -1,    -1,    -1,    -1,    -1,    -1,
+      91,    92,    93,    94,    95,    96,    97,    -1,    -1,    -1,
       -1,    -1,    -1,    91,    92,    93,    94,    95,    96,    97
 };
 
@@ -1916,56 +1922,56 @@ static const yytype_uint8 yystos[] =
      124,   125,   129,   131,   132,   133,   135,   136,   137,    11,
       12,    57,    59,    61,    63,    77,   148,    33,    99,    10,
       15,    17,    19,    21,    22,    23,    24,    27,    29,    32,
-      33,    34,    35,    37,    40,    41,    42,    43,    83,    84,
-      85,    86,    90,   118,   119,   120,   121,     5,     6,     8,
-       9,    11,    12,    13,    14,    20,    28,    50,    57,    59,
-      61,    63,    77,    80,    94,    95,   101,   103,   119,   126,
-     128,   144,   145,   148,   150,   152,   155,   156,   160,   163,
-     164,   165,   168,   148,   101,   165,   119,    33,   126,   165,
-      38,    39,    77,   119,   145,   147,   158,   119,   119,   126,
-     165,   126,   128,   120,   165,   120,   119,    99,   124,     0,
-     109,   126,   165,   101,   151,   164,   151,   165,   165,   165,
-     165,    72,    99,    99,    99,   100,   151,   151,   165,   165,
-     164,    65,    66,    67,    68,    69,    72,    76,   119,   165,
-     164,   164,   102,   165,     8,     9,   105,   119,   161,   162,
-     165,   169,   170,   101,    99,    99,    30,    44,    45,    46,
-      47,    48,    49,    51,    54,    55,    56,    91,    92,    93,
-      94,    95,    96,    97,   100,   127,   144,   166,   168,    99,
-     165,    35,    48,    49,    51,    55,    56,   120,    99,    99,
-      26,    52,    53,   119,   165,   119,    36,    46,   130,    35,
-      99,    99,    38,    99,    99,    99,    36,    99,    99,   120,
-      99,   102,   165,    30,    36,    30,    36,    30,    36,    30,
-      36,    57,    59,    61,    63,   149,   119,    30,   166,    71,
-      78,    71,    78,    71,    78,    71,    78,    71,    78,    30,
-      30,    81,    82,   100,   102,   105,   105,   104,   105,   100,
-     104,   104,   100,   102,   170,    28,   165,   165,   165,   165,
+      33,    34,    35,    40,    41,    42,    43,    83,    84,    85,
+      86,    90,   118,   119,   120,   121,     5,     6,     8,     9,
+      11,    12,    13,    14,    20,    28,    50,    57,    59,    61,
+      63,    77,    80,    94,    95,   101,   103,   119,   126,   128,
+     144,   145,   148,   150,   152,   155,   156,   160,   163,   164,
+     165,   168,   148,   101,   165,   119,    33,   126,   165,    38,
+      39,    77,   119,   145,   147,   158,   119,   126,   165,   126,
+     128,   120,   165,   120,   119,    99,   124,     0,   109,   126,
+     165,   101,   151,   164,   151,   165,   165,   165,   165,    72,
+      99,    99,    99,   100,   151,   151,   165,   165,   164,    65,
+      66,    67,    68,    69,    72,    76,   119,   165,   164,   164,
+     102,   165,     8,     9,   105,   119,   161,   162,   165,   169,
+     170,   101,    99,    99,    30,    44,    45,    46,    47,    48,
+      49,    51,    54,    55,    56,    91,    92,    93,    94,    95,
+      96,    97,   100,   127,   144,   166,   168,    99,   165,    35,
+      48,    49,    51,    55,    56,   120,    99,    99,    26,    52,
+      53,   119,   165,   119,    36,    46,   130,    99,    99,    38,
+      99,    99,    99,    36,    99,    99,   120,    99,   102,   165,
+      30,    36,    30,    36,    30,    36,    30,    36,    57,    59,
+      61,    63,   149,   119,    30,   166,    71,    78,    71,    78,
+      71,    78,    71,    78,    71,    78,    30,    30,    81,    82,
+     100,   102,   105,   105,   104,   105,   100,   104,   104,   100,
+     102,   170,    28,   165,   165,   165,   165,   165,   165,   165,
      165,   165,   165,   165,   165,   165,   165,   165,   165,   165,
-     165,   165,   165,   170,    44,    45,    46,    47,    48,    49,
-      51,    54,    55,    56,    91,    92,    93,    94,    95,    96,
-      97,   100,   127,    99,   122,    99,    77,   145,   146,   148,
-     146,   146,    25,    46,    99,    30,   165,   165,    86,    99,
-     112,   113,   114,   115,   165,   124,    99,   122,   138,   139,
-     140,    99,   100,   164,   165,   164,   165,   164,   165,   164,
-     165,    25,    30,   157,    28,    58,    60,    62,    64,    73,
-      74,    75,    79,    80,   153,   154,   164,   153,   164,   164,
-     102,   170,   165,   165,   165,     8,     9,   119,   162,   165,
-     100,   127,   165,   127,   165,   165,   165,   165,   165,   165,
+     170,    44,    45,    46,    47,    48,    49,    51,    54,    55,
+      56,    91,    92,    93,    94,    95,    96,    97,   100,   127,
+      99,   122,    99,    77,   145,   146,   148,   146,   146,    25,
+      46,    99,    30,   165,    86,    99,   112,   113,   114,   115,
+     165,   124,    99,   122,   138,   139,   140,    99,   100,   164,
+     165,   164,   165,   164,   165,   164,   165,    25,    30,   157,
+      28,    58,    60,    62,    64,    73,    74,    75,    79,    80,
+     153,   154,   164,   153,   164,   164,   102,   170,   165,   165,
+     165,     8,     9,   119,   162,   165,   100,   127,   165,   127,
      165,   165,   165,   165,   165,   165,   165,   165,   165,   165,
-     165,   170,    99,   123,   141,   142,   143,    17,   138,    99,
-      99,    99,   165,   165,   138,    73,    74,    79,    80,   159,
-     164,    99,   119,   115,    99,    89,   140,   138,   102,   170,
-      30,    30,    30,    30,   164,   165,   157,   157,   157,   157,
-     164,   164,   157,   164,   164,   127,   102,   127,    17,    87,
-     134,   143,    99,   122,    99,    16,    36,    88,   164,   167,
-     168,   167,   167,   167,   120,    99,    10,   127,   164,   164,
-     164,   164,   164,   164,   164,   164,    30,    73,   154,   102,
-      99,   122,    99,   141,   138,    36,   165,    99,    44,    45,
-      47,    48,    49,    51,    54,    55,    56,    91,    92,    93,
-      94,    95,    96,    97,    30,    99,   117,   119,   102,    73,
-     141,   134,    88,   165,    99,   167,   167,   167,   167,   167,
-     167,   167,   167,   167,   167,   167,   167,   167,   167,   167,
-     167,    73,   138,    99,   100,   164,   134,    99,    99,   138,
-     167,   119,   138,    88,    88,    99,    99
+     165,   165,   165,   165,   165,   165,   165,   170,    99,   123,
+     141,   142,   143,    17,   138,    99,    99,    99,   165,   165,
+     138,    73,    74,    79,    80,   159,   164,    99,   119,   115,
+      99,    89,   140,   138,   102,   170,    30,    30,    30,    30,
+     164,   165,   157,   157,   157,   157,   164,   164,   157,   164,
+     164,   127,   102,   127,    17,    87,   134,   143,    99,   122,
+      99,    16,    36,    88,   164,   167,   168,   167,   167,   167,
+     120,    99,    10,   127,   164,   164,   164,   164,   164,   164,
+     164,   164,    30,    73,   154,   102,    99,   122,    99,   141,
+     138,    36,   165,    99,    44,    45,    47,    48,    49,    51,
+      54,    55,    56,    91,    92,    93,    94,    95,    96,    97,
+      30,    99,   117,   119,   102,    73,   141,   134,    88,   165,
+      99,   167,   167,   167,   167,   167,   167,   167,   167,   167,
+     167,   167,   167,   167,   167,   167,   167,    73,   138,    99,
+     100,   164,   134,    99,    99,   138,   167,   119,   138,    88,
+      88,    99,    99
 };
 
   /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
@@ -1980,30 +1986,30 @@ static const yytype_uint8 yyr1[] =
      118,   118,   118,   118,   118,   118,   118,   118,   118,   118,
      118,   118,   118,   118,   118,   118,   118,   119,   119,   119,
      119,   119,   119,   119,   119,   119,   119,   119,   119,   119,
-     119,   119,   119,   119,   119,   119,   119,   120,   120,   120,
-     121,   121,   122,   122,   123,   123,   123,   123,   123,   123,
-     124,   124,   124,   125,   125,   125,   125,   125,   125,   125,
-     125,   125,   125,   125,   125,   125,   125,   126,   126,   126,
-     126,   126,   126,   126,   126,   127,   127,   128,   128,   128,
-     128,   128,   129,   129,   129,   129,   130,   130,   131,   131,
-     131,   132,   132,   133,   133,   133,   133,   134,   134,   135,
-     135,   135,   135,   136,   136,   137,   138,   138,   139,   139,
-     140,   140,   141,   141,   142,   142,   143,   143,   144,   144,
+     119,   119,   119,   119,   119,   119,   120,   120,   120,   121,
+     121,   122,   122,   123,   123,   123,   123,   123,   123,   124,
+     124,   124,   125,   125,   125,   125,   125,   125,   125,   125,
+     125,   125,   125,   125,   125,   125,   126,   126,   126,   126,
+     126,   126,   126,   126,   127,   127,   128,   128,   128,   128,
+     128,   129,   129,   129,   129,   130,   130,   131,   131,   131,
+     132,   132,   133,   133,   133,   133,   134,   134,   135,   135,
+     135,   135,   136,   136,   137,   138,   138,   139,   139,   140,
+     140,   141,   141,   142,   142,   143,   143,   144,   144,   144,
      144,   144,   144,   144,   144,   144,   144,   144,   144,   144,
-     144,   145,   146,   146,   147,   147,   148,   148,   148,   148,
-     148,   148,   148,   148,   148,   148,   148,   149,   149,   149,
-     149,   150,   150,   151,   151,   151,   151,   152,   152,   152,
-     152,   152,   153,   153,   153,   153,   153,   154,   155,   155,
-     155,   155,   155,   155,   155,   155,   155,   155,   156,   156,
-     156,   156,   156,   157,   157,   158,   158,   159,   159,   159,
-     159,   159,   160,   160,   160,   161,   161,   162,   162,   162,
-     163,   163,   164,   164,   165,   165,   165,   165,   165,   165,
+     145,   146,   146,   147,   147,   148,   148,   148,   148,   148,
+     148,   148,   148,   148,   148,   148,   149,   149,   149,   149,
+     150,   150,   151,   151,   151,   151,   152,   152,   152,   152,
+     152,   153,   153,   153,   153,   153,   154,   155,   155,   155,
+     155,   155,   155,   155,   155,   155,   155,   156,   156,   156,
+     156,   156,   157,   157,   158,   158,   159,   159,   159,   159,
+     159,   160,   160,   160,   161,   161,   162,   162,   162,   163,
+     163,   164,   164,   165,   165,   165,   165,   165,   165,   165,
      165,   165,   165,   165,   165,   165,   165,   165,   165,   165,
-     165,   165,   165,   166,   166,   166,   166,   166,   166,   166,
+     165,   165,   166,   166,   166,   166,   166,   166,   166,   166,
      166,   166,   166,   166,   166,   166,   166,   166,   166,   166,
-     166,   166,   167,   167,   167,   167,   167,   167,   167,   167,
-     167,   167,   167,   167,   167,   167,   167,   167,   167,   167,
-     168,   168,   169,   169,   170,   170
+     166,   167,   167,   167,   167,   167,   167,   167,   167,   167,
+     167,   167,   167,   167,   167,   167,   167,   167,   167,   168,
+     168,   169,   169,   170,   170
 };
 
   /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN.  */
@@ -2018,30 +2024,30 @@ static const yytype_int8 yyr2[] =
        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
-       1,     1,     1,     1,     1,     1,     1,     0,     1,     2,
-       1,     3,     1,     2,     1,     1,     1,     1,     1,     1,
-       1,     1,     1,     3,     3,     3,     3,     3,     3,     3,
-       5,     3,     3,     2,     3,     3,     2,     0,     2,     4,
-       3,     5,     2,     4,     6,     0,     1,     2,     2,     5,
-       4,     3,     5,     5,     5,     5,     1,     1,     3,     3,
-       3,     4,     6,     6,     8,     7,     9,     0,     2,     7,
-      11,    12,     9,     4,     6,     4,     0,     1,     1,     2,
-       1,     1,     0,     1,     1,     2,     1,     1,     1,     1,
-       1,     1,     2,     3,     5,     3,     1,     1,     1,     1,
-       1,     1,     1,     1,     1,     1,     2,     2,     4,     6,
-       4,     6,     4,     6,     4,     6,     5,     1,     1,     1,
-       1,     2,     2,     1,     2,     4,     6,     2,     4,     4,
-       1,     1,     1,     1,     5,     2,     2,     2,     3,     3,
-       3,     3,     3,     3,     3,     3,     3,     3,     6,     6,
-       6,     6,     6,     1,     1,     2,     4,     1,     2,     5,
-       2,     2,     3,     3,     3,     1,     3,     3,     3,     3,
-       2,     2,     1,     1,     1,     1,     3,     3,     3,     3,
-       3,     3,     3,     3,     3,     3,     3,     3,     3,     3,
-       3,     3,     3,     1,     1,     3,     3,     3,     3,     3,
+       1,     1,     1,     1,     1,     1,     0,     1,     2,     1,
+       3,     1,     2,     1,     1,     1,     1,     1,     1,     1,
+       1,     1,     3,     3,     3,     3,     3,     3,     3,     5,
+       3,     3,     2,     3,     3,     2,     0,     2,     4,     3,
+       5,     2,     4,     6,     0,     1,     2,     2,     5,     4,
+       3,     5,     5,     5,     5,     1,     1,     3,     3,     3,
+       4,     6,     6,     8,     7,     9,     0,     2,     7,    11,
+      12,     9,     4,     6,     1,     0,     1,     1,     2,     1,
+       1,     0,     1,     1,     2,     1,     1,     1,     1,     1,
+       1,     2,     3,     5,     3,     1,     1,     1,     1,     1,
+       1,     1,     1,     1,     1,     2,     2,     4,     6,     4,
+       6,     4,     6,     4,     6,     5,     1,     1,     1,     1,
+       2,     2,     1,     2,     4,     6,     2,     4,     4,     1,
+       1,     1,     1,     5,     2,     2,     2,     3,     3,     3,
+       3,     3,     3,     3,     3,     3,     3,     6,     6,     6,
+       6,     6,     1,     1,     2,     4,     1,     2,     5,     2,
+       2,     3,     3,     3,     1,     3,     3,     3,     3,     2,
+       2,     1,     1,     1,     1,     3,     3,     3,     3,     3,
        3,     3,     3,     3,     3,     3,     3,     3,     3,     3,
        3,     3,     1,     1,     3,     3,     3,     3,     3,     3,
        3,     3,     3,     3,     3,     3,     3,     3,     3,     3,
-       4,     4,     0,     1,     1,     3
+       3,     1,     1,     3,     3,     3,     3,     3,     3,     3,
+       3,     3,     3,     3,     3,     3,     3,     3,     3,     4,
+       4,     0,     1,     1,     3
 };
 
 
@@ -2313,39 +2319,39 @@ yydestruct (const char *yymsg,
   switch (yykind)
     {
     case YYSYMBOL_tVARID: /* tVARID  */
-#line 190 "engines/director/lingo/lingo-gr.y"
+#line 196 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 2319 "engines/director/lingo/lingo-gr.cpp"
+#line 2325 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case YYSYMBOL_tSTRING: /* tSTRING  */
-#line 190 "engines/director/lingo/lingo-gr.y"
+#line 196 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 2325 "engines/director/lingo/lingo-gr.cpp"
+#line 2331 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case YYSYMBOL_tSYMBOL: /* tSYMBOL  */
-#line 190 "engines/director/lingo/lingo-gr.y"
+#line 196 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 2331 "engines/director/lingo/lingo-gr.cpp"
+#line 2337 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case YYSYMBOL_tENDCLAUSE: /* tENDCLAUSE  */
-#line 190 "engines/director/lingo/lingo-gr.y"
+#line 196 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 2337 "engines/director/lingo/lingo-gr.cpp"
+#line 2343 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case YYSYMBOL_CMDID: /* CMDID  */
-#line 190 "engines/director/lingo/lingo-gr.y"
+#line 196 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 2343 "engines/director/lingo/lingo-gr.cpp"
+#line 2349 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case YYSYMBOL_ID: /* ID  */
-#line 190 "engines/director/lingo/lingo-gr.y"
+#line 196 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 2349 "engines/director/lingo/lingo-gr.cpp"
+#line 2355 "engines/director/lingo/lingo-gr.cpp"
         break;
 
       default:
@@ -2611,551 +2617,545 @@ yyreduce:
   switch (yyn)
     {
   case 2: /* script: scriptpartlist  */
-#line 196 "engines/director/lingo/lingo-gr.y"
+#line 202 "engines/director/lingo/lingo-gr.y"
                                                         { g_lingo->_compiler->_assemblyAST = new ScriptNode((yyvsp[0].nodelist)); }
-#line 2617 "engines/director/lingo/lingo-gr.cpp"
+#line 2623 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 3: /* scriptpartlist: scriptpart  */
-#line 198 "engines/director/lingo/lingo-gr.y"
+#line 204 "engines/director/lingo/lingo-gr.y"
                                                                 {
 		NodeList *list = new NodeList;
 		if ((yyvsp[0].node)) {
 			list->push_back((yyvsp[0].node));
 		}
 		(yyval.nodelist) = list; }
-#line 2628 "engines/director/lingo/lingo-gr.cpp"
+#line 2634 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 4: /* scriptpartlist: scriptpartlist scriptpart  */
-#line 204 "engines/director/lingo/lingo-gr.y"
+#line 210 "engines/director/lingo/lingo-gr.y"
                                                         {
 		if ((yyvsp[0].node)) {
 			(yyvsp[-1].nodelist)->push_back((yyvsp[0].node));
 		}
 		(yyval.nodelist) = (yyvsp[-1].nodelist); }
-#line 2638 "engines/director/lingo/lingo-gr.cpp"
+#line 2644 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 5: /* scriptpart: '\n'  */
-#line 211 "engines/director/lingo/lingo-gr.y"
+#line 217 "engines/director/lingo/lingo-gr.y"
                                                                 { (yyval.node) = nullptr; }
-#line 2644 "engines/director/lingo/lingo-gr.cpp"
+#line 2650 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 10: /* macro: tMACRO ID idlist '\n' stmtlist  */
-#line 244 "engines/director/lingo/lingo-gr.y"
+#line 250 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.node) = new HandlerNode((yyvsp[-3].s), (yyvsp[-2].idlist), (yyvsp[0].nodelist)); }
-#line 2650 "engines/director/lingo/lingo-gr.cpp"
+#line 2656 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 11: /* factory: tFACTORY ID '\n' methodlist  */
-#line 248 "engines/director/lingo/lingo-gr.y"
+#line 254 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.node) = new FactoryNode((yyvsp[-2].s), (yyvsp[0].nodelist)); }
-#line 2656 "engines/director/lingo/lingo-gr.cpp"
+#line 2662 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 12: /* method: tMETHOD ID idlist '\n' stmtlist  */
-#line 250 "engines/director/lingo/lingo-gr.y"
+#line 256 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.node) = new HandlerNode((yyvsp[-3].s), (yyvsp[-2].idlist), (yyvsp[0].nodelist)); }
-#line 2662 "engines/director/lingo/lingo-gr.cpp"
+#line 2668 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 13: /* methodlist: %empty  */
-#line 252 "engines/director/lingo/lingo-gr.y"
+#line 258 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.nodelist) = new NodeList; }
-#line 2668 "engines/director/lingo/lingo-gr.cpp"
+#line 2674 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 15: /* nonemptymethodlist: methodlistline  */
-#line 256 "engines/director/lingo/lingo-gr.y"
+#line 262 "engines/director/lingo/lingo-gr.y"
                                                                 {
 		NodeList *list = new NodeList;
 		if ((yyvsp[0].node)) {
 			list->push_back((yyvsp[0].node));
 		}
 		(yyval.nodelist) = list; }
-#line 2679 "engines/director/lingo/lingo-gr.cpp"
+#line 2685 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 16: /* nonemptymethodlist: nonemptymethodlist methodlistline  */
-#line 262 "engines/director/lingo/lingo-gr.y"
+#line 268 "engines/director/lingo/lingo-gr.y"
                                                         {
 		if ((yyvsp[0].node)) {
 			(yyvsp[-1].nodelist)->push_back((yyvsp[0].node));
 		}
 		(yyval.nodelist) = (yyvsp[-1].nodelist); }
-#line 2689 "engines/director/lingo/lingo-gr.cpp"
+#line 2695 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 17: /* methodlistline: '\n'  */
-#line 269 "engines/director/lingo/lingo-gr.y"
+#line 275 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.node) = nullptr; }
-#line 2695 "engines/director/lingo/lingo-gr.cpp"
+#line 2701 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 19: /* handler: tON ID idlist '\n' stmtlist tENDCLAUSE endargdef '\n'  */
-#line 275 "engines/director/lingo/lingo-gr.y"
+#line 281 "engines/director/lingo/lingo-gr.y"
                                                                {	// D3
 		(yyval.node) = new HandlerNode((yyvsp[-6].s), (yyvsp[-5].idlist), (yyvsp[-3].nodelist));
 		checkEnd((yyvsp[-2].s), (yyvsp[-6].s), false);
 		delete (yyvsp[-2].s); }
-#line 2704 "engines/director/lingo/lingo-gr.cpp"
+#line 2710 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 20: /* handler: tON ID idlist '\n' stmtlist  */
-#line 279 "engines/director/lingo/lingo-gr.y"
+#line 285 "engines/director/lingo/lingo-gr.y"
                                       {	// D4. No 'end' clause
 		(yyval.node) = new HandlerNode((yyvsp[-3].s), (yyvsp[-2].idlist), (yyvsp[0].nodelist)); }
-#line 2711 "engines/director/lingo/lingo-gr.cpp"
+#line 2717 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 22: /* endargdef: ID  */
-#line 284 "engines/director/lingo/lingo-gr.y"
+#line 290 "engines/director/lingo/lingo-gr.y"
                                                         { delete (yyvsp[0].s); }
-#line 2717 "engines/director/lingo/lingo-gr.cpp"
+#line 2723 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 23: /* endargdef: endargdef ',' ID  */
-#line 285 "engines/director/lingo/lingo-gr.y"
+#line 291 "engines/director/lingo/lingo-gr.y"
                                                 { delete (yyvsp[0].s); }
-#line 2723 "engines/director/lingo/lingo-gr.cpp"
+#line 2729 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 25: /* CMDID: tABBREVIATED  */
-#line 293 "engines/director/lingo/lingo-gr.y"
+#line 299 "engines/director/lingo/lingo-gr.y"
                         { (yyval.s) = new Common::String("abbreviated"); }
-#line 2729 "engines/director/lingo/lingo-gr.cpp"
+#line 2735 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 26: /* CMDID: tABBREV  */
-#line 294 "engines/director/lingo/lingo-gr.y"
+#line 300 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("abbrev"); }
-#line 2735 "engines/director/lingo/lingo-gr.cpp"
+#line 2741 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 27: /* CMDID: tABBR  */
-#line 295 "engines/director/lingo/lingo-gr.y"
+#line 301 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("abbr"); }
-#line 2741 "engines/director/lingo/lingo-gr.cpp"
+#line 2747 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 28: /* CMDID: tAFTER  */
-#line 296 "engines/director/lingo/lingo-gr.y"
+#line 302 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("after"); }
-#line 2747 "engines/director/lingo/lingo-gr.cpp"
+#line 2753 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 29: /* CMDID: tAND  */
-#line 297 "engines/director/lingo/lingo-gr.y"
+#line 303 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("and"); }
-#line 2753 "engines/director/lingo/lingo-gr.cpp"
+#line 2759 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 30: /* CMDID: tBEFORE  */
-#line 298 "engines/director/lingo/lingo-gr.y"
+#line 304 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("before"); }
-#line 2759 "engines/director/lingo/lingo-gr.cpp"
+#line 2765 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 31: /* CMDID: tCAST  */
-#line 299 "engines/director/lingo/lingo-gr.y"
+#line 305 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("cast"); }
-#line 2765 "engines/director/lingo/lingo-gr.cpp"
+#line 2771 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 32: /* CMDID: tCHAR  */
-#line 300 "engines/director/lingo/lingo-gr.y"
+#line 306 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("char"); }
-#line 2771 "engines/director/lingo/lingo-gr.cpp"
+#line 2777 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 33: /* CMDID: tCHARS  */
-#line 301 "engines/director/lingo/lingo-gr.y"
+#line 307 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("chars"); }
-#line 2777 "engines/director/lingo/lingo-gr.cpp"
+#line 2783 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 34: /* CMDID: tCONTAINS  */
-#line 302 "engines/director/lingo/lingo-gr.y"
+#line 308 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("contains"); }
-#line 2783 "engines/director/lingo/lingo-gr.cpp"
+#line 2789 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 35: /* CMDID: tDATE  */
-#line 303 "engines/director/lingo/lingo-gr.y"
+#line 309 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("date"); }
-#line 2789 "engines/director/lingo/lingo-gr.cpp"
+#line 2795 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 36: /* CMDID: tDELETE  */
-#line 304 "engines/director/lingo/lingo-gr.y"
+#line 310 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("delete"); }
-#line 2795 "engines/director/lingo/lingo-gr.cpp"
+#line 2801 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 37: /* CMDID: tDOWN  */
-#line 305 "engines/director/lingo/lingo-gr.y"
+#line 311 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("down"); }
-#line 2801 "engines/director/lingo/lingo-gr.cpp"
+#line 2807 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 38: /* CMDID: tFIELD  */
-#line 306 "engines/director/lingo/lingo-gr.y"
+#line 312 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("field"); }
-#line 2807 "engines/director/lingo/lingo-gr.cpp"
+#line 2813 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 39: /* CMDID: tFRAME  */
-#line 307 "engines/director/lingo/lingo-gr.y"
+#line 313 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("frame"); }
-#line 2813 "engines/director/lingo/lingo-gr.cpp"
+#line 2819 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 40: /* CMDID: tHILITE  */
-#line 308 "engines/director/lingo/lingo-gr.y"
+#line 314 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("hilite"); }
-#line 2819 "engines/director/lingo/lingo-gr.cpp"
+#line 2825 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 41: /* CMDID: tIN  */
-#line 309 "engines/director/lingo/lingo-gr.y"
+#line 315 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("in"); }
-#line 2825 "engines/director/lingo/lingo-gr.cpp"
+#line 2831 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 42: /* CMDID: tINTERSECTS  */
-#line 310 "engines/director/lingo/lingo-gr.y"
+#line 316 "engines/director/lingo/lingo-gr.y"
                         { (yyval.s) = new Common::String("intersects"); }
-#line 2831 "engines/director/lingo/lingo-gr.cpp"
+#line 2837 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 43: /* CMDID: tINTO  */
-#line 311 "engines/director/lingo/lingo-gr.y"
+#line 317 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("into"); }
-#line 2837 "engines/director/lingo/lingo-gr.cpp"
+#line 2843 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 44: /* CMDID: tITEM  */
-#line 312 "engines/director/lingo/lingo-gr.y"
+#line 318 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("item"); }
-#line 2843 "engines/director/lingo/lingo-gr.cpp"
+#line 2849 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 45: /* CMDID: tITEMS  */
-#line 313 "engines/director/lingo/lingo-gr.y"
+#line 319 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("items"); }
-#line 2849 "engines/director/lingo/lingo-gr.cpp"
+#line 2855 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 46: /* CMDID: tLAST  */
-#line 314 "engines/director/lingo/lingo-gr.y"
+#line 320 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("last"); }
-#line 2855 "engines/director/lingo/lingo-gr.cpp"
+#line 2861 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 47: /* CMDID: tLINE  */
-#line 315 "engines/director/lingo/lingo-gr.y"
+#line 321 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("line"); }
-#line 2861 "engines/director/lingo/lingo-gr.cpp"
+#line 2867 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 48: /* CMDID: tLINES  */
-#line 316 "engines/director/lingo/lingo-gr.y"
+#line 322 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("lines"); }
-#line 2867 "engines/director/lingo/lingo-gr.cpp"
+#line 2873 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 49: /* CMDID: tLONG  */
-#line 317 "engines/director/lingo/lingo-gr.y"
+#line 323 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("long"); }
-#line 2873 "engines/director/lingo/lingo-gr.cpp"
+#line 2879 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 50: /* CMDID: tMENU  */
-#line 318 "engines/director/lingo/lingo-gr.y"
+#line 324 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("menu"); }
-#line 2879 "engines/director/lingo/lingo-gr.cpp"
+#line 2885 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 51: /* CMDID: tMENUITEM  */
-#line 319 "engines/director/lingo/lingo-gr.y"
+#line 325 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("menuItem"); }
-#line 2885 "engines/director/lingo/lingo-gr.cpp"
+#line 2891 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 52: /* CMDID: tMENUITEMS  */
-#line 320 "engines/director/lingo/lingo-gr.y"
+#line 326 "engines/director/lingo/lingo-gr.y"
                         { (yyval.s) = new Common::String("menuItems"); }
-#line 2891 "engines/director/lingo/lingo-gr.cpp"
+#line 2897 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 53: /* CMDID: tMOD  */
-#line 321 "engines/director/lingo/lingo-gr.y"
+#line 327 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("mod"); }
-#line 2897 "engines/director/lingo/lingo-gr.cpp"
+#line 2903 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 54: /* CMDID: tMOVIE  */
-#line 322 "engines/director/lingo/lingo-gr.y"
+#line 328 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("movie"); }
-#line 2903 "engines/director/lingo/lingo-gr.cpp"
+#line 2909 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 55: /* CMDID: tNEXT  */
-#line 323 "engines/director/lingo/lingo-gr.y"
+#line 329 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("next"); }
-#line 2909 "engines/director/lingo/lingo-gr.cpp"
+#line 2915 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 56: /* CMDID: tNOT  */
-#line 324 "engines/director/lingo/lingo-gr.y"
+#line 330 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("not"); }
-#line 2915 "engines/director/lingo/lingo-gr.cpp"
+#line 2921 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 57: /* CMDID: tNUMBER  */
-#line 325 "engines/director/lingo/lingo-gr.y"
+#line 331 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("number"); }
-#line 2921 "engines/director/lingo/lingo-gr.cpp"
+#line 2927 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 58: /* CMDID: tOF  */
-#line 326 "engines/director/lingo/lingo-gr.y"
+#line 332 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("of"); }
-#line 2927 "engines/director/lingo/lingo-gr.cpp"
+#line 2933 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 59: /* CMDID: tOR  */
-#line 327 "engines/director/lingo/lingo-gr.y"
+#line 333 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("or"); }
-#line 2933 "engines/director/lingo/lingo-gr.cpp"
+#line 2939 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 60: /* CMDID: tPREVIOUS  */
-#line 328 "engines/director/lingo/lingo-gr.y"
+#line 334 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("previous"); }
-#line 2939 "engines/director/lingo/lingo-gr.cpp"
+#line 2945 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 61: /* CMDID: tREPEAT  */
-#line 329 "engines/director/lingo/lingo-gr.y"
+#line 335 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("repeat"); }
-#line 2945 "engines/director/lingo/lingo-gr.cpp"
+#line 2951 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 62: /* CMDID: tSCRIPT  */
-#line 330 "engines/director/lingo/lingo-gr.y"
+#line 336 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("script"); }
-#line 2951 "engines/director/lingo/lingo-gr.cpp"
+#line 2957 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 63: /* CMDID: tASSERTERROR  */
-#line 331 "engines/director/lingo/lingo-gr.y"
+#line 337 "engines/director/lingo/lingo-gr.y"
                         { (yyval.s) = new Common::String("scummvmAssertError"); }
-#line 2957 "engines/director/lingo/lingo-gr.cpp"
+#line 2963 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 64: /* CMDID: tSHORT  */
-#line 332 "engines/director/lingo/lingo-gr.y"
+#line 338 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("short"); }
-#line 2963 "engines/director/lingo/lingo-gr.cpp"
+#line 2969 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 65: /* CMDID: tSOUND  */
-#line 333 "engines/director/lingo/lingo-gr.y"
+#line 339 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("sound"); }
-#line 2969 "engines/director/lingo/lingo-gr.cpp"
+#line 2975 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 66: /* CMDID: tSPRITE  */
-#line 334 "engines/director/lingo/lingo-gr.y"
+#line 340 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("sprite"); }
-#line 2975 "engines/director/lingo/lingo-gr.cpp"
+#line 2981 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 67: /* CMDID: tSTARTS  */
-#line 335 "engines/director/lingo/lingo-gr.y"
+#line 341 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("starts"); }
-#line 2981 "engines/director/lingo/lingo-gr.cpp"
+#line 2987 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 68: /* CMDID: tTHE  */
-#line 336 "engines/director/lingo/lingo-gr.y"
+#line 342 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("the"); }
-#line 2987 "engines/director/lingo/lingo-gr.cpp"
+#line 2993 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 69: /* CMDID: tTIME  */
-#line 337 "engines/director/lingo/lingo-gr.y"
+#line 343 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("time"); }
-#line 2993 "engines/director/lingo/lingo-gr.cpp"
+#line 2999 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 70: /* CMDID: tTO  */
-#line 338 "engines/director/lingo/lingo-gr.y"
+#line 344 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("to"); }
-#line 2999 "engines/director/lingo/lingo-gr.cpp"
+#line 3005 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 71: /* CMDID: tWHILE  */
-#line 339 "engines/director/lingo/lingo-gr.y"
+#line 345 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("while"); }
-#line 3005 "engines/director/lingo/lingo-gr.cpp"
+#line 3011 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 72: /* CMDID: tWINDOW  */
-#line 340 "engines/director/lingo/lingo-gr.y"
+#line 346 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("window"); }
-#line 3011 "engines/director/lingo/lingo-gr.cpp"
+#line 3017 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 73: /* CMDID: tWITH  */
-#line 341 "engines/director/lingo/lingo-gr.y"
+#line 347 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("with"); }
-#line 3017 "engines/director/lingo/lingo-gr.cpp"
+#line 3023 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 74: /* CMDID: tWITHIN  */
-#line 342 "engines/director/lingo/lingo-gr.y"
+#line 348 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("within"); }
-#line 3023 "engines/director/lingo/lingo-gr.cpp"
+#line 3029 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 75: /* CMDID: tWORD  */
-#line 343 "engines/director/lingo/lingo-gr.y"
+#line 349 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("word"); }
-#line 3029 "engines/director/lingo/lingo-gr.cpp"
+#line 3035 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 76: /* CMDID: tWORDS  */
-#line 344 "engines/director/lingo/lingo-gr.y"
+#line 350 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("words"); }
-#line 3035 "engines/director/lingo/lingo-gr.cpp"
+#line 3041 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 78: /* ID: tELSE  */
-#line 348 "engines/director/lingo/lingo-gr.y"
+#line 354 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("else"); }
-#line 3041 "engines/director/lingo/lingo-gr.cpp"
+#line 3047 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 79: /* ID: tENDCLAUSE  */
-#line 349 "engines/director/lingo/lingo-gr.y"
+#line 355 "engines/director/lingo/lingo-gr.y"
                         { (yyval.s) = new Common::String("end"); }
-#line 3047 "engines/director/lingo/lingo-gr.cpp"
+#line 3053 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 80: /* ID: tEXIT  */
-#line 350 "engines/director/lingo/lingo-gr.y"
+#line 356 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("exit"); }
-#line 3053 "engines/director/lingo/lingo-gr.cpp"
+#line 3059 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 81: /* ID: tFACTORY  */
-#line 351 "engines/director/lingo/lingo-gr.y"
+#line 357 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("factory"); }
-#line 3059 "engines/director/lingo/lingo-gr.cpp"
+#line 3065 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 82: /* ID: tGLOBAL  */
-#line 352 "engines/director/lingo/lingo-gr.y"
+#line 358 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("global"); }
-#line 3065 "engines/director/lingo/lingo-gr.cpp"
+#line 3071 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 83: /* ID: tGO  */
-#line 353 "engines/director/lingo/lingo-gr.y"
+#line 359 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("go"); }
-#line 3071 "engines/director/lingo/lingo-gr.cpp"
+#line 3077 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 84: /* ID: tIF  */
-#line 354 "engines/director/lingo/lingo-gr.y"
+#line 360 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("if"); }
-#line 3077 "engines/director/lingo/lingo-gr.cpp"
+#line 3083 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 85: /* ID: tINSTANCE  */
-#line 355 "engines/director/lingo/lingo-gr.y"
+#line 361 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("instance"); }
-#line 3083 "engines/director/lingo/lingo-gr.cpp"
+#line 3089 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 86: /* ID: tMACRO  */
-#line 356 "engines/director/lingo/lingo-gr.y"
+#line 362 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("macro"); }
-#line 3089 "engines/director/lingo/lingo-gr.cpp"
+#line 3095 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 87: /* ID: tMETHOD  */
-#line 357 "engines/director/lingo/lingo-gr.y"
+#line 363 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("method"); }
-#line 3095 "engines/director/lingo/lingo-gr.cpp"
+#line 3101 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 88: /* ID: tON  */
-#line 358 "engines/director/lingo/lingo-gr.y"
+#line 364 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("on"); }
-#line 3101 "engines/director/lingo/lingo-gr.cpp"
+#line 3107 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 89: /* ID: tOPEN  */
-#line 359 "engines/director/lingo/lingo-gr.y"
+#line 365 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("open"); }
-#line 3107 "engines/director/lingo/lingo-gr.cpp"
+#line 3113 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 90: /* ID: tPLAY  */
-#line 360 "engines/director/lingo/lingo-gr.y"
+#line 366 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("play"); }
-#line 3113 "engines/director/lingo/lingo-gr.cpp"
+#line 3119 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 91: /* ID: tPROPERTY  */
-#line 361 "engines/director/lingo/lingo-gr.y"
+#line 367 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("property"); }
-#line 3119 "engines/director/lingo/lingo-gr.cpp"
+#line 3125 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 92: /* ID: tPUT  */
-#line 362 "engines/director/lingo/lingo-gr.y"
+#line 368 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("put"); }
-#line 3125 "engines/director/lingo/lingo-gr.cpp"
+#line 3131 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 93: /* ID: tSET  */
-#line 363 "engines/director/lingo/lingo-gr.y"
+#line 369 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("set"); }
-#line 3131 "engines/director/lingo/lingo-gr.cpp"
+#line 3137 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 94: /* ID: tTELL  */
-#line 364 "engines/director/lingo/lingo-gr.y"
+#line 370 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("tell"); }
-#line 3137 "engines/director/lingo/lingo-gr.cpp"
+#line 3143 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 95: /* ID: tTHEN  */
-#line 365 "engines/director/lingo/lingo-gr.y"
+#line 371 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("then"); }
-#line 3143 "engines/director/lingo/lingo-gr.cpp"
-    break;
-
-  case 96: /* ID: tWHEN  */
-#line 366 "engines/director/lingo/lingo-gr.y"
-                                { (yyval.s) = new Common::String("when"); }
 #line 3149 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 97: /* idlist: %empty  */
-#line 369 "engines/director/lingo/lingo-gr.y"
+  case 96: /* idlist: %empty  */
+#line 374 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.idlist) = new IDList; }
 #line 3155 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 100: /* nonemptyidlist: ID  */
-#line 374 "engines/director/lingo/lingo-gr.y"
+  case 99: /* nonemptyidlist: ID  */
+#line 379 "engines/director/lingo/lingo-gr.y"
                                                                 {
 		Common::Array<Common::String *> *list = new IDList;
 		list->push_back((yyvsp[0].s));
@@ -3163,64 +3163,64 @@ yyreduce:
 #line 3164 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 101: /* nonemptyidlist: nonemptyidlist ',' ID  */
-#line 378 "engines/director/lingo/lingo-gr.y"
+  case 100: /* nonemptyidlist: nonemptyidlist ',' ID  */
+#line 383 "engines/director/lingo/lingo-gr.y"
                                                         {
 		(yyvsp[-2].idlist)->push_back((yyvsp[0].s));
 		(yyval.idlist) = (yyvsp[-2].idlist); }
 #line 3172 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 103: /* stmt: tENDIF '\n'  */
-#line 389 "engines/director/lingo/lingo-gr.y"
+  case 102: /* stmt: tENDIF '\n'  */
+#line 394 "engines/director/lingo/lingo-gr.y"
                                                                 { (yyval.node) = nullptr; }
 #line 3178 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 113: /* proc: CMDID cmdargs '\n'  */
-#line 405 "engines/director/lingo/lingo-gr.y"
+  case 112: /* proc: CMDID cmdargs '\n'  */
+#line 410 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new CmdNode((yyvsp[-2].s), (yyvsp[-1].nodelist), g_lingo->_compiler->_linenumber - 1); }
 #line 3184 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 114: /* proc: tPUT cmdargs '\n'  */
-#line 406 "engines/director/lingo/lingo-gr.y"
+  case 113: /* proc: tPUT cmdargs '\n'  */
+#line 411 "engines/director/lingo/lingo-gr.y"
                                                                 { (yyval.node) = new CmdNode(new Common::String("put"), (yyvsp[-1].nodelist), g_lingo->_compiler->_linenumber - 1); }
 #line 3190 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 115: /* proc: tGO cmdargs '\n'  */
-#line 407 "engines/director/lingo/lingo-gr.y"
+  case 114: /* proc: tGO cmdargs '\n'  */
+#line 412 "engines/director/lingo/lingo-gr.y"
                                                                 { (yyval.node) = new CmdNode(new Common::String("go"), (yyvsp[-1].nodelist), g_lingo->_compiler->_linenumber - 1); }
 #line 3196 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 116: /* proc: tGO frameargs '\n'  */
-#line 408 "engines/director/lingo/lingo-gr.y"
+  case 115: /* proc: tGO frameargs '\n'  */
+#line 413 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new CmdNode(new Common::String("go"), (yyvsp[-1].nodelist), g_lingo->_compiler->_linenumber - 1); }
 #line 3202 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 117: /* proc: tPLAY cmdargs '\n'  */
-#line 409 "engines/director/lingo/lingo-gr.y"
+  case 116: /* proc: tPLAY cmdargs '\n'  */
+#line 414 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new CmdNode(new Common::String("play"), (yyvsp[-1].nodelist), g_lingo->_compiler->_linenumber - 1); }
 #line 3208 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 118: /* proc: tPLAY frameargs '\n'  */
-#line 410 "engines/director/lingo/lingo-gr.y"
+  case 117: /* proc: tPLAY frameargs '\n'  */
+#line 415 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new CmdNode(new Common::String("play"), (yyvsp[-1].nodelist), g_lingo->_compiler->_linenumber - 1); }
 #line 3214 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 119: /* proc: tOPEN cmdargs '\n'  */
-#line 411 "engines/director/lingo/lingo-gr.y"
+  case 118: /* proc: tOPEN cmdargs '\n'  */
+#line 416 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new CmdNode(new Common::String("open"), (yyvsp[-1].nodelist), g_lingo->_compiler->_linenumber - 1); }
 #line 3220 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 120: /* proc: tOPEN expr tWITH expr '\n'  */
-#line 412 "engines/director/lingo/lingo-gr.y"
+  case 119: /* proc: tOPEN expr tWITH expr '\n'  */
+#line 417 "engines/director/lingo/lingo-gr.y"
                                                  {
 		NodeList *args = new NodeList;
 		args->push_back((yyvsp[-3].node));
@@ -3229,52 +3229,52 @@ yyreduce:
 #line 3230 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 121: /* proc: tNEXT tREPEAT '\n'  */
-#line 417 "engines/director/lingo/lingo-gr.y"
+  case 120: /* proc: tNEXT tREPEAT '\n'  */
+#line 422 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new NextRepeatNode(); }
 #line 3236 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 122: /* proc: tEXIT tREPEAT '\n'  */
-#line 418 "engines/director/lingo/lingo-gr.y"
+  case 121: /* proc: tEXIT tREPEAT '\n'  */
+#line 423 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new ExitRepeatNode(); }
 #line 3242 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 123: /* proc: tEXIT '\n'  */
-#line 419 "engines/director/lingo/lingo-gr.y"
+  case 122: /* proc: tEXIT '\n'  */
+#line 424 "engines/director/lingo/lingo-gr.y"
                                                                 { (yyval.node) = new ExitNode(); }
 #line 3248 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 124: /* proc: tDELETE chunk '\n'  */
-#line 420 "engines/director/lingo/lingo-gr.y"
+  case 123: /* proc: tDELETE chunk '\n'  */
+#line 425 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new DeleteNode((yyvsp[-1].node)); }
 #line 3254 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 125: /* proc: tHILITE chunk '\n'  */
-#line 421 "engines/director/lingo/lingo-gr.y"
+  case 124: /* proc: tHILITE chunk '\n'  */
+#line 426 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new HiliteNode((yyvsp[-1].node)); }
 #line 3260 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 126: /* proc: tASSERTERROR stmtoneliner  */
-#line 422 "engines/director/lingo/lingo-gr.y"
+  case 125: /* proc: tASSERTERROR stmtoneliner  */
+#line 427 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new AssertErrorNode((yyvsp[0].node)); }
 #line 3266 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 127: /* cmdargs: %empty  */
-#line 425 "engines/director/lingo/lingo-gr.y"
+  case 126: /* cmdargs: %empty  */
+#line 430 "engines/director/lingo/lingo-gr.y"
                                                                                         {
 		// This matches `cmd`
 		(yyval.nodelist) = new NodeList; }
 #line 3274 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 128: /* cmdargs: expr trailingcomma  */
-#line 428 "engines/director/lingo/lingo-gr.y"
+  case 127: /* cmdargs: expr trailingcomma  */
+#line 433 "engines/director/lingo/lingo-gr.y"
                                                                                         {
 		// This matches `cmd arg` and `cmd(arg)`
 		NodeList *args = new NodeList;
@@ -3283,8 +3283,8 @@ yyreduce:
 #line 3284 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 129: /* cmdargs: expr ',' nonemptyexprlist trailingcomma  */
-#line 433 "engines/director/lingo/lingo-gr.y"
+  case 128: /* cmdargs: expr ',' nonemptyexprlist trailingcomma  */
+#line 438 "engines/director/lingo/lingo-gr.y"
                                                                 {
 		// This matches `cmd args, ...)
 		(yyvsp[-1].nodelist)->insert_at(0, (yyvsp[-3].node));
@@ -3292,8 +3292,8 @@ yyreduce:
 #line 3293 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 130: /* cmdargs: expr expr_nounarymath trailingcomma  */
-#line 437 "engines/director/lingo/lingo-gr.y"
+  case 129: /* cmdargs: expr expr_nounarymath trailingcomma  */
+#line 442 "engines/director/lingo/lingo-gr.y"
                                                                         {
 		// This matches `cmd arg arg`
 		NodeList *args = new NodeList;
@@ -3303,8 +3303,8 @@ yyreduce:
 #line 3304 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 131: /* cmdargs: expr expr_nounarymath ',' nonemptyexprlist trailingcomma  */
-#line 443 "engines/director/lingo/lingo-gr.y"
+  case 130: /* cmdargs: expr expr_nounarymath ',' nonemptyexprlist trailingcomma  */
+#line 448 "engines/director/lingo/lingo-gr.y"
                                                                                 {
 		// This matches `cmd arg arg, ...`
 		(yyvsp[-1].nodelist)->insert_at(0, (yyvsp[-3].node));
@@ -3313,16 +3313,16 @@ yyreduce:
 #line 3314 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 132: /* cmdargs: '(' ')'  */
-#line 448 "engines/director/lingo/lingo-gr.y"
+  case 131: /* cmdargs: '(' ')'  */
+#line 453 "engines/director/lingo/lingo-gr.y"
                                                                         {
 		// This matches `cmd()`
 		(yyval.nodelist) = new NodeList; }
 #line 3322 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 133: /* cmdargs: '(' expr ',' ')'  */
-#line 451 "engines/director/lingo/lingo-gr.y"
+  case 132: /* cmdargs: '(' expr ',' ')'  */
+#line 456 "engines/director/lingo/lingo-gr.y"
                            {
 		// This matches `cmd(args,)`
 		NodeList *args = new NodeList;
@@ -3331,8 +3331,8 @@ yyreduce:
 #line 3332 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 134: /* cmdargs: '(' expr ',' nonemptyexprlist trailingcomma ')'  */
-#line 456 "engines/director/lingo/lingo-gr.y"
+  case 133: /* cmdargs: '(' expr ',' nonemptyexprlist trailingcomma ')'  */
+#line 461 "engines/director/lingo/lingo-gr.y"
                                                                 {
 		// This matches `cmd(args, ...)`
 		(yyvsp[-2].nodelist)->insert_at(0, (yyvsp[-4].node));
@@ -3340,8 +3340,8 @@ yyreduce:
 #line 3341 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 137: /* frameargs: tFRAME expr  */
-#line 468 "engines/director/lingo/lingo-gr.y"
+  case 136: /* frameargs: tFRAME expr  */
+#line 473 "engines/director/lingo/lingo-gr.y"
                                                                         {
 		// This matches `play frame arg`
 		NodeList *args = new NodeList;
@@ -3350,8 +3350,8 @@ yyreduce:
 #line 3351 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 138: /* frameargs: tMOVIE expr  */
-#line 473 "engines/director/lingo/lingo-gr.y"
+  case 137: /* frameargs: tMOVIE expr  */
+#line 478 "engines/director/lingo/lingo-gr.y"
                                                                                 {
 		// This matches `play movie arg`
 		NodeList *args = new NodeList;
@@ -3361,8 +3361,8 @@ yyreduce:
 #line 3362 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 139: /* frameargs: tFRAME expr tOF tMOVIE expr  */
-#line 479 "engines/director/lingo/lingo-gr.y"
+  case 138: /* frameargs: tFRAME expr tOF tMOVIE expr  */
+#line 484 "engines/director/lingo/lingo-gr.y"
                                                                 {
 		// This matches `play frame arg of movie arg`
 		NodeList *args = new NodeList;
@@ -3372,8 +3372,8 @@ yyreduce:
 #line 3373 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 140: /* frameargs: expr tOF tMOVIE expr  */
-#line 485 "engines/director/lingo/lingo-gr.y"
+  case 139: /* frameargs: expr tOF tMOVIE expr  */
+#line 490 "engines/director/lingo/lingo-gr.y"
                                                                 {
 		// This matches `play arg of movie arg` (weird but valid)
 		NodeList *args = new NodeList;
@@ -3383,8 +3383,8 @@ yyreduce:
 #line 3384 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 141: /* frameargs: tFRAME expr expr_nounarymath  */
-#line 491 "engines/director/lingo/lingo-gr.y"
+  case 140: /* frameargs: tFRAME expr expr_nounarymath  */
+#line 496 "engines/director/lingo/lingo-gr.y"
                                                         {
 		// This matches `play frame arg arg` (also weird but valid)
 		NodeList *args = new NodeList;
@@ -3394,50 +3394,50 @@ yyreduce:
 #line 3395 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 142: /* asgn: tPUT expr tINTO varorchunk '\n'  */
-#line 499 "engines/director/lingo/lingo-gr.y"
+  case 141: /* asgn: tPUT expr tINTO varorchunk '\n'  */
+#line 504 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.node) = new PutIntoNode((yyvsp[-3].node), (yyvsp[-1].node)); }
 #line 3401 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 143: /* asgn: tPUT expr tAFTER varorchunk '\n'  */
-#line 500 "engines/director/lingo/lingo-gr.y"
+  case 142: /* asgn: tPUT expr tAFTER varorchunk '\n'  */
+#line 505 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.node) = new PutAfterNode((yyvsp[-3].node), (yyvsp[-1].node)); }
 #line 3407 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 144: /* asgn: tPUT expr tBEFORE varorchunk '\n'  */
-#line 501 "engines/director/lingo/lingo-gr.y"
+  case 143: /* asgn: tPUT expr tBEFORE varorchunk '\n'  */
+#line 506 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.node) = new PutBeforeNode((yyvsp[-3].node), (yyvsp[-1].node)); }
 #line 3413 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 145: /* asgn: tSET varorthe to expr '\n'  */
-#line 502 "engines/director/lingo/lingo-gr.y"
+  case 144: /* asgn: tSET varorthe to expr '\n'  */
+#line 507 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.node) = new SetNode((yyvsp[-3].node), (yyvsp[-1].node)); }
 #line 3419 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 148: /* definevars: tGLOBAL idlist '\n'  */
-#line 507 "engines/director/lingo/lingo-gr.y"
+  case 147: /* definevars: tGLOBAL idlist '\n'  */
+#line 512 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.node) = new GlobalNode((yyvsp[-1].idlist)); }
 #line 3425 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 149: /* definevars: tPROPERTY idlist '\n'  */
-#line 508 "engines/director/lingo/lingo-gr.y"
+  case 148: /* definevars: tPROPERTY idlist '\n'  */
+#line 513 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new PropertyNode((yyvsp[-1].idlist)); }
 #line 3431 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 150: /* definevars: tINSTANCE idlist '\n'  */
-#line 509 "engines/director/lingo/lingo-gr.y"
+  case 149: /* definevars: tINSTANCE idlist '\n'  */
+#line 514 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new InstanceNode((yyvsp[-1].idlist)); }
 #line 3437 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 151: /* ifstmt: tIF expr tTHEN stmt  */
-#line 512 "engines/director/lingo/lingo-gr.y"
+  case 150: /* ifstmt: tIF expr tTHEN stmt  */
+#line 517 "engines/director/lingo/lingo-gr.y"
                             {
 		NodeList *stmtlist = new NodeList;
 		stmtlist->push_back((yyvsp[0].node));
@@ -3445,15 +3445,15 @@ yyreduce:
 #line 3446 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 152: /* ifstmt: tIF expr tTHEN '\n' stmtlist_insideif endif  */
-#line 516 "engines/director/lingo/lingo-gr.y"
+  case 151: /* ifstmt: tIF expr tTHEN '\n' stmtlist_insideif endif  */
+#line 521 "engines/director/lingo/lingo-gr.y"
                                                       {
 		(yyval.node) = new IfStmtNode((yyvsp[-4].node), (yyvsp[-1].nodelist)); }
 #line 3453 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 153: /* ifelsestmt: tIF expr tTHEN stmt tELSE stmt  */
-#line 520 "engines/director/lingo/lingo-gr.y"
+  case 152: /* ifelsestmt: tIF expr tTHEN stmt tELSE stmt  */
+#line 525 "engines/director/lingo/lingo-gr.y"
                                                          {
 		NodeList *stmtlist1 = new NodeList;
 		stmtlist1->push_back((yyvsp[-2].node));
@@ -3463,8 +3463,8 @@ yyreduce:
 #line 3464 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 154: /* ifelsestmt: tIF expr tTHEN stmt tELSE '\n' stmtlist_insideif endif  */
-#line 526 "engines/director/lingo/lingo-gr.y"
+  case 153: /* ifelsestmt: tIF expr tTHEN stmt tELSE '\n' stmtlist_insideif endif  */
+#line 531 "engines/director/lingo/lingo-gr.y"
                                                                                    {
 		NodeList *stmtlist1 = new NodeList;
 		stmtlist1->push_back((yyvsp[-4].node));
@@ -3472,8 +3472,8 @@ yyreduce:
 #line 3473 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 155: /* ifelsestmt: tIF expr tTHEN '\n' stmtlist_insideif tELSE stmt  */
-#line 530 "engines/director/lingo/lingo-gr.y"
+  case 154: /* ifelsestmt: tIF expr tTHEN '\n' stmtlist_insideif tELSE stmt  */
+#line 535 "engines/director/lingo/lingo-gr.y"
                                                                              {
 		NodeList *stmtlist2 = new NodeList;
 		stmtlist2->push_back((yyvsp[0].node));
@@ -3481,49 +3481,49 @@ yyreduce:
 #line 3482 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 156: /* ifelsestmt: tIF expr tTHEN '\n' stmtlist_insideif tELSE '\n' stmtlist_insideif endif  */
-#line 534 "engines/director/lingo/lingo-gr.y"
+  case 155: /* ifelsestmt: tIF expr tTHEN '\n' stmtlist_insideif tELSE '\n' stmtlist_insideif endif  */
+#line 539 "engines/director/lingo/lingo-gr.y"
                                                                                                          {
 		(yyval.node) = new IfElseStmtNode((yyvsp[-7].node), (yyvsp[-4].nodelist), (yyvsp[-1].nodelist)); }
 #line 3489 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 157: /* endif: %empty  */
-#line 538 "engines/director/lingo/lingo-gr.y"
+  case 156: /* endif: %empty  */
+#line 543 "engines/director/lingo/lingo-gr.y"
                         { warning("LingoCompiler::parse: no end if"); }
 #line 3495 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 159: /* loop: tREPEAT tWHILE expr '\n' stmtlist tENDREPEAT '\n'  */
-#line 541 "engines/director/lingo/lingo-gr.y"
+  case 158: /* loop: tREPEAT tWHILE expr '\n' stmtlist tENDREPEAT '\n'  */
+#line 546 "engines/director/lingo/lingo-gr.y"
                                                         {
 		(yyval.node) = new RepeatWhileNode((yyvsp[-4].node), (yyvsp[-2].nodelist)); }
 #line 3502 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 160: /* loop: tREPEAT tWITH ID tEQ expr tTO expr '\n' stmtlist tENDREPEAT '\n'  */
-#line 543 "engines/director/lingo/lingo-gr.y"
+  case 159: /* loop: tREPEAT tWITH ID tEQ expr tTO expr '\n' stmtlist tENDREPEAT '\n'  */
+#line 548 "engines/director/lingo/lingo-gr.y"
                                                                                        {
 		(yyval.node) = new RepeatWithToNode((yyvsp[-8].s), (yyvsp[-6].node), false, (yyvsp[-4].node), (yyvsp[-2].nodelist)); }
 #line 3509 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 161: /* loop: tREPEAT tWITH ID tEQ expr tDOWN tTO expr '\n' stmtlist tENDREPEAT '\n'  */
-#line 545 "engines/director/lingo/lingo-gr.y"
+  case 160: /* loop: tREPEAT tWITH ID tEQ expr tDOWN tTO expr '\n' stmtlist tENDREPEAT '\n'  */
+#line 550 "engines/director/lingo/lingo-gr.y"
                                                                                              {
 		(yyval.node) = new RepeatWithToNode((yyvsp[-9].s), (yyvsp[-7].node), true, (yyvsp[-4].node), (yyvsp[-2].nodelist)); }
 #line 3516 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 162: /* loop: tREPEAT tWITH ID tIN expr '\n' stmtlist tENDREPEAT '\n'  */
-#line 547 "engines/director/lingo/lingo-gr.y"
+  case 161: /* loop: tREPEAT tWITH ID tIN expr '\n' stmtlist tENDREPEAT '\n'  */
+#line 552 "engines/director/lingo/lingo-gr.y"
                                                                   {
 		(yyval.node) = new RepeatWithInNode((yyvsp[-6].s), (yyvsp[-4].node), (yyvsp[-2].nodelist)); }
 #line 3523 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 163: /* tell: tTELL expr tTO stmtoneliner  */
-#line 551 "engines/director/lingo/lingo-gr.y"
+  case 162: /* tell: tTELL expr tTO stmtoneliner  */
+#line 556 "engines/director/lingo/lingo-gr.y"
                                                                 {
 		NodeList *stmtlist = new NodeList;
 		stmtlist->push_back((yyvsp[0].node));
@@ -3531,27 +3531,27 @@ yyreduce:
 #line 3532 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 164: /* tell: tTELL expr '\n' stmtlist tENDTELL '\n'  */
-#line 555 "engines/director/lingo/lingo-gr.y"
+  case 163: /* tell: tTELL expr '\n' stmtlist tENDTELL '\n'  */
+#line 560 "engines/director/lingo/lingo-gr.y"
                                                         {
 		(yyval.node) = new TellNode((yyvsp[-4].node), (yyvsp[-2].nodelist)); }
 #line 3539 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 165: /* when: tWHEN ID tTHEN expr  */
-#line 559 "engines/director/lingo/lingo-gr.y"
-                                                { (yyval.node) = new WhenNode((yyvsp[-2].s), (yyvsp[0].node)); }
+  case 164: /* when: tWHEN  */
+#line 564 "engines/director/lingo/lingo-gr.y"
+                                                                { (yyval.node) = new WhenNode((yyvsp[0].w).eventName, (yyvsp[0].w).stmt); }
 #line 3545 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 166: /* stmtlist: %empty  */
-#line 561 "engines/director/lingo/lingo-gr.y"
+  case 165: /* stmtlist: %empty  */
+#line 566 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.nodelist) = new NodeList; }
 #line 3551 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 168: /* nonemptystmtlist: stmtlistline  */
-#line 566 "engines/director/lingo/lingo-gr.y"
+  case 167: /* nonemptystmtlist: stmtlistline  */
+#line 571 "engines/director/lingo/lingo-gr.y"
                                                                 {
 		NodeList *list = new NodeList;
 		if ((yyvsp[0].node)) {
@@ -3561,8 +3561,8 @@ yyreduce:
 #line 3562 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 169: /* nonemptystmtlist: nonemptystmtlist stmtlistline  */
-#line 572 "engines/director/lingo/lingo-gr.y"
+  case 168: /* nonemptystmtlist: nonemptystmtlist stmtlistline  */
+#line 577 "engines/director/lingo/lingo-gr.y"
                                                         {
 		if ((yyvsp[0].node)) {
 			(yyvsp[-1].nodelist)->push_back((yyvsp[0].node));
@@ -3571,20 +3571,20 @@ yyreduce:
 #line 3572 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 170: /* stmtlistline: '\n'  */
-#line 579 "engines/director/lingo/lingo-gr.y"
+  case 169: /* stmtlistline: '\n'  */
+#line 584 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = nullptr; }
 #line 3578 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 172: /* stmtlist_insideif: %empty  */
-#line 583 "engines/director/lingo/lingo-gr.y"
+  case 171: /* stmtlist_insideif: %empty  */
+#line 588 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.nodelist) = new NodeList; }
 #line 3584 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 174: /* nonemptystmtlist_insideif: stmtlistline_insideif  */
-#line 588 "engines/director/lingo/lingo-gr.y"
+  case 173: /* nonemptystmtlist_insideif: stmtlistline_insideif  */
+#line 593 "engines/director/lingo/lingo-gr.y"
                                                 {
 		NodeList *list = new NodeList;
 		if ((yyvsp[0].node)) {
@@ -3594,8 +3594,8 @@ yyreduce:
 #line 3595 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 175: /* nonemptystmtlist_insideif: nonemptystmtlist_insideif stmtlistline_insideif  */
-#line 594 "engines/director/lingo/lingo-gr.y"
+  case 174: /* nonemptystmtlist_insideif: nonemptystmtlist_insideif stmtlistline_insideif  */
+#line 599 "engines/director/lingo/lingo-gr.y"
                                                                         {
 		if ((yyvsp[0].node)) {
 			(yyvsp[-1].nodelist)->push_back((yyvsp[0].node));
@@ -3604,178 +3604,178 @@ yyreduce:
 #line 3605 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 176: /* stmtlistline_insideif: '\n'  */
-#line 601 "engines/director/lingo/lingo-gr.y"
+  case 175: /* stmtlistline_insideif: '\n'  */
+#line 606 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.node) = nullptr; }
 #line 3611 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 178: /* simpleexpr_nounarymath: tINT  */
-#line 608 "engines/director/lingo/lingo-gr.y"
+  case 177: /* simpleexpr_nounarymath: tINT  */
+#line 613 "engines/director/lingo/lingo-gr.y"
                                                                 { (yyval.node) = new IntNode((yyvsp[0].i)); }
 #line 3617 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 179: /* simpleexpr_nounarymath: tFLOAT  */
-#line 609 "engines/director/lingo/lingo-gr.y"
+  case 178: /* simpleexpr_nounarymath: tFLOAT  */
+#line 614 "engines/director/lingo/lingo-gr.y"
                                                                 { (yyval.node) = new FloatNode((yyvsp[0].f)); }
 #line 3623 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 180: /* simpleexpr_nounarymath: tSYMBOL  */
-#line 610 "engines/director/lingo/lingo-gr.y"
+  case 179: /* simpleexpr_nounarymath: tSYMBOL  */
+#line 615 "engines/director/lingo/lingo-gr.y"
                                                                 { (yyval.node) = new SymbolNode((yyvsp[0].s)); }
 #line 3629 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 181: /* simpleexpr_nounarymath: tSTRING  */
-#line 611 "engines/director/lingo/lingo-gr.y"
+  case 180: /* simpleexpr_nounarymath: tSTRING  */
+#line 616 "engines/director/lingo/lingo-gr.y"
                                                                 { (yyval.node) = new StringNode((yyvsp[0].s)); }
 #line 3635 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 182: /* simpleexpr_nounarymath: tNOT simpleexpr  */
-#line 612 "engines/director/lingo/lingo-gr.y"
+  case 181: /* simpleexpr_nounarymath: tNOT simpleexpr  */
+#line 617 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.node) = new UnaryOpNode(LC::c_not, (yyvsp[0].node)); }
 #line 3641 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 183: /* simpleexpr_nounarymath: ID '(' ')'  */
-#line 613 "engines/director/lingo/lingo-gr.y"
+  case 182: /* simpleexpr_nounarymath: ID '(' ')'  */
+#line 618 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new FuncNode((yyvsp[-2].s), new NodeList); }
 #line 3647 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 184: /* simpleexpr_nounarymath: ID '(' nonemptyexprlist trailingcomma ')'  */
-#line 614 "engines/director/lingo/lingo-gr.y"
+  case 183: /* simpleexpr_nounarymath: ID '(' nonemptyexprlist trailingcomma ')'  */
+#line 619 "engines/director/lingo/lingo-gr.y"
                                                                 { (yyval.node) = new FuncNode((yyvsp[-4].s), (yyvsp[-2].nodelist)); }
 #line 3653 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 185: /* simpleexpr_nounarymath: '(' expr ')'  */
-#line 615 "engines/director/lingo/lingo-gr.y"
+  case 184: /* simpleexpr_nounarymath: '(' expr ')'  */
+#line 620 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = (yyvsp[-1].node); }
 #line 3659 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 191: /* var: ID  */
-#line 623 "engines/director/lingo/lingo-gr.y"
+  case 190: /* var: ID  */
+#line 628 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new VarNode((yyvsp[0].s)); }
 #line 3665 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 196: /* chunk: tFIELD refargs  */
-#line 633 "engines/director/lingo/lingo-gr.y"
+  case 195: /* chunk: tFIELD refargs  */
+#line 638 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.node) = new FuncNode(new Common::String("field"), (yyvsp[0].nodelist)); }
 #line 3671 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 197: /* chunk: tCAST refargs  */
-#line 634 "engines/director/lingo/lingo-gr.y"
+  case 196: /* chunk: tCAST refargs  */
+#line 639 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.node) = new FuncNode(new Common::String("cast"), (yyvsp[0].nodelist)); }
 #line 3677 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 198: /* chunk: tCHAR expr tOF simpleexpr  */
-#line 635 "engines/director/lingo/lingo-gr.y"
+  case 197: /* chunk: tCHAR expr tOF simpleexpr  */
+#line 640 "engines/director/lingo/lingo-gr.y"
                                                 {
 		(yyval.node) = new ChunkExprNode(kChunkChar, (yyvsp[-2].node), nullptr, (yyvsp[0].node)); }
 #line 3684 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 199: /* chunk: tCHAR expr tTO expr tOF simpleexpr  */
-#line 637 "engines/director/lingo/lingo-gr.y"
+  case 198: /* chunk: tCHAR expr tTO expr tOF simpleexpr  */
+#line 642 "engines/director/lingo/lingo-gr.y"
                                                                 {
 		(yyval.node) = new ChunkExprNode(kChunkChar, (yyvsp[-4].node), (yyvsp[-2].node), (yyvsp[0].node)); }
 #line 3691 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 200: /* chunk: tWORD expr tOF simpleexpr  */
-#line 639 "engines/director/lingo/lingo-gr.y"
+  case 199: /* chunk: tWORD expr tOF simpleexpr  */
+#line 644 "engines/director/lingo/lingo-gr.y"
                                                 {
 		(yyval.node) = new ChunkExprNode(kChunkWord, (yyvsp[-2].node), nullptr, (yyvsp[0].node)); }
 #line 3698 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 201: /* chunk: tWORD expr tTO expr tOF simpleexpr  */
-#line 641 "engines/director/lingo/lingo-gr.y"
+  case 200: /* chunk: tWORD expr tTO expr tOF simpleexpr  */
+#line 646 "engines/director/lingo/lingo-gr.y"
                                                                 {
 		(yyval.node) = new ChunkExprNode(kChunkWord, (yyvsp[-4].node), (yyvsp[-2].node), (yyvsp[0].node)); }
 #line 3705 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 202: /* chunk: tITEM expr tOF simpleexpr  */
-#line 643 "engines/director/lingo/lingo-gr.y"
+  case 201: /* chunk: tITEM expr tOF simpleexpr  */
+#line 648 "engines/director/lingo/lingo-gr.y"
                                                 {
 		(yyval.node) = new ChunkExprNode(kChunkItem, (yyvsp[-2].node), nullptr, (yyvsp[0].node)); }
 #line 3712 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 203: /* chunk: tITEM expr tTO expr tOF simpleexpr  */
-#line 645 "engines/director/lingo/lingo-gr.y"
+  case 202: /* chunk: tITEM expr tTO expr tOF simpleexpr  */
+#line 650 "engines/director/lingo/lingo-gr.y"
                                                                 {
 		(yyval.node) = new ChunkExprNode(kChunkItem, (yyvsp[-4].node), (yyvsp[-2].node), (yyvsp[0].node)); }
 #line 3719 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 204: /* chunk: tLINE expr tOF simpleexpr  */
-#line 647 "engines/director/lingo/lingo-gr.y"
+  case 203: /* chunk: tLINE expr tOF simpleexpr  */
+#line 652 "engines/director/lingo/lingo-gr.y"
                                                 {
 		(yyval.node) = new ChunkExprNode(kChunkLine, (yyvsp[-2].node), nullptr, (yyvsp[0].node)); }
 #line 3726 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 205: /* chunk: tLINE expr tTO expr tOF simpleexpr  */
-#line 649 "engines/director/lingo/lingo-gr.y"
+  case 204: /* chunk: tLINE expr tTO expr tOF simpleexpr  */
+#line 654 "engines/director/lingo/lingo-gr.y"
                                                                 {
 		(yyval.node) = new ChunkExprNode(kChunkLine, (yyvsp[-4].node), (yyvsp[-2].node), (yyvsp[0].node)); }
 #line 3733 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 206: /* chunk: tTHE tLAST chunktype inof simpleexpr  */
-#line 651 "engines/director/lingo/lingo-gr.y"
+  case 205: /* chunk: tTHE tLAST chunktype inof simpleexpr  */
+#line 656 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.node) = new TheLastNode((yyvsp[-2].chunktype), (yyvsp[0].node)); }
 #line 3739 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 207: /* chunktype: tCHAR  */
-#line 654 "engines/director/lingo/lingo-gr.y"
+  case 206: /* chunktype: tCHAR  */
+#line 659 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.chunktype) = kChunkChar; }
 #line 3745 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 208: /* chunktype: tWORD  */
-#line 655 "engines/director/lingo/lingo-gr.y"
+  case 207: /* chunktype: tWORD  */
+#line 660 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.chunktype) = kChunkWord; }
 #line 3751 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 209: /* chunktype: tITEM  */
-#line 656 "engines/director/lingo/lingo-gr.y"
+  case 208: /* chunktype: tITEM  */
+#line 661 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.chunktype) = kChunkItem; }
 #line 3757 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 210: /* chunktype: tLINE  */
-#line 657 "engines/director/lingo/lingo-gr.y"
+  case 209: /* chunktype: tLINE  */
+#line 662 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.chunktype) = kChunkLine; }
 #line 3763 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 211: /* object: tSCRIPT refargs  */
-#line 660 "engines/director/lingo/lingo-gr.y"
+  case 210: /* object: tSCRIPT refargs  */
+#line 665 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.node) = new FuncNode(new Common::String("script"), (yyvsp[0].nodelist)); }
 #line 3769 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 212: /* object: tWINDOW refargs  */
-#line 661 "engines/director/lingo/lingo-gr.y"
+  case 211: /* object: tWINDOW refargs  */
+#line 666 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.node) = new FuncNode(new Common::String("window"), (yyvsp[0].nodelist)); }
 #line 3775 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 213: /* refargs: simpleexpr  */
-#line 664 "engines/director/lingo/lingo-gr.y"
+  case 212: /* refargs: simpleexpr  */
+#line 669 "engines/director/lingo/lingo-gr.y"
                                                                                 {
 		// This matches `ref arg` and `ref(arg)`
 		NodeList *args = new NodeList;
@@ -3784,16 +3784,16 @@ yyreduce:
 #line 3785 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 214: /* refargs: '(' ')'  */
-#line 669 "engines/director/lingo/lingo-gr.y"
+  case 213: /* refargs: '(' ')'  */
+#line 674 "engines/director/lingo/lingo-gr.y"
                                                                                         {
 		// This matches `ref()`
 		(yyval.nodelist) = new NodeList; }
 #line 3793 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 215: /* refargs: '(' expr ',' ')'  */
-#line 672 "engines/director/lingo/lingo-gr.y"
+  case 214: /* refargs: '(' expr ',' ')'  */
+#line 677 "engines/director/lingo/lingo-gr.y"
                            {
 		// This matches `ref(args,)`
 		NodeList *args = new NodeList;
@@ -3802,8 +3802,8 @@ yyreduce:
 #line 3803 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 216: /* refargs: '(' expr ',' nonemptyexprlist trailingcomma ')'  */
-#line 677 "engines/director/lingo/lingo-gr.y"
+  case 215: /* refargs: '(' expr ',' nonemptyexprlist trailingcomma ')'  */
+#line 682 "engines/director/lingo/lingo-gr.y"
                                                                 {
 		// This matches `ref(args, ...)`
 		(yyvsp[-2].nodelist)->insert_at(0, (yyvsp[-4].node));
@@ -3811,194 +3811,194 @@ yyreduce:
 #line 3812 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 217: /* the: tTHE ID  */
-#line 683 "engines/director/lingo/lingo-gr.y"
+  case 216: /* the: tTHE ID  */
+#line 688 "engines/director/lingo/lingo-gr.y"
                                                                 { (yyval.node) = new TheNode((yyvsp[0].s)); }
 #line 3818 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 218: /* the: tTHE ID tOF theobj  */
-#line 684 "engines/director/lingo/lingo-gr.y"
+  case 217: /* the: tTHE ID tOF theobj  */
+#line 689 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new TheOfNode((yyvsp[-2].s), (yyvsp[0].node)); }
 #line 3824 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 219: /* the: tTHE tNUMBER tOF theobj  */
-#line 685 "engines/director/lingo/lingo-gr.y"
+  case 218: /* the: tTHE tNUMBER tOF theobj  */
+#line 690 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new TheOfNode(new Common::String("number"), (yyvsp[0].node)); }
 #line 3830 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 224: /* theobj: tMENUITEM simpleexpr tOF tMENU simpleexpr  */
-#line 692 "engines/director/lingo/lingo-gr.y"
+  case 223: /* theobj: tMENUITEM simpleexpr tOF tMENU simpleexpr  */
+#line 697 "engines/director/lingo/lingo-gr.y"
                                                                 { (yyval.node) = new MenuItemNode((yyvsp[-3].node), (yyvsp[0].node)); }
 #line 3836 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 225: /* theobj: tSOUND simpleexpr  */
-#line 693 "engines/director/lingo/lingo-gr.y"
+  case 224: /* theobj: tSOUND simpleexpr  */
+#line 698 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new SoundNode((yyvsp[0].node)); }
 #line 3842 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 226: /* theobj: tSPRITE simpleexpr  */
-#line 694 "engines/director/lingo/lingo-gr.y"
+  case 225: /* theobj: tSPRITE simpleexpr  */
+#line 699 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new SpriteNode((yyvsp[0].node)); }
 #line 3848 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 227: /* menu: tMENU simpleexpr  */
-#line 697 "engines/director/lingo/lingo-gr.y"
+  case 226: /* menu: tMENU simpleexpr  */
+#line 702 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new MenuNode((yyvsp[0].node)); }
 #line 3854 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 228: /* thedatetime: tTHE tABBREVIATED tDATE  */
-#line 699 "engines/director/lingo/lingo-gr.y"
+  case 227: /* thedatetime: tTHE tABBREVIATED tDATE  */
+#line 704 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.node) = new TheDateTimeNode(kTheAbbr, kTheDate); }
 #line 3860 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 229: /* thedatetime: tTHE tABBREVIATED tTIME  */
-#line 700 "engines/director/lingo/lingo-gr.y"
+  case 228: /* thedatetime: tTHE tABBREVIATED tTIME  */
+#line 705 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new TheDateTimeNode(kTheAbbr, kTheTime); }
 #line 3866 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 230: /* thedatetime: tTHE tABBREV tDATE  */
-#line 701 "engines/director/lingo/lingo-gr.y"
+  case 229: /* thedatetime: tTHE tABBREV tDATE  */
+#line 706 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new TheDateTimeNode(kTheAbbr, kTheDate); }
 #line 3872 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 231: /* thedatetime: tTHE tABBREV tTIME  */
-#line 702 "engines/director/lingo/lingo-gr.y"
+  case 230: /* thedatetime: tTHE tABBREV tTIME  */
+#line 707 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new TheDateTimeNode(kTheAbbr, kTheTime); }
 #line 3878 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 232: /* thedatetime: tTHE tABBR tDATE  */
-#line 703 "engines/director/lingo/lingo-gr.y"
+  case 231: /* thedatetime: tTHE tABBR tDATE  */
+#line 708 "engines/director/lingo/lingo-gr.y"
                                                                 { (yyval.node) = new TheDateTimeNode(kTheAbbr, kTheDate); }
 #line 3884 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 233: /* thedatetime: tTHE tABBR tTIME  */
-#line 704 "engines/director/lingo/lingo-gr.y"
+  case 232: /* thedatetime: tTHE tABBR tTIME  */
+#line 709 "engines/director/lingo/lingo-gr.y"
                                                                 { (yyval.node) = new TheDateTimeNode(kTheAbbr, kTheTime); }
 #line 3890 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 234: /* thedatetime: tTHE tLONG tDATE  */
-#line 705 "engines/director/lingo/lingo-gr.y"
+  case 233: /* thedatetime: tTHE tLONG tDATE  */
+#line 710 "engines/director/lingo/lingo-gr.y"
                                                                 { (yyval.node) = new TheDateTimeNode(kTheLong, kTheDate); }
 #line 3896 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 235: /* thedatetime: tTHE tLONG tTIME  */
-#line 706 "engines/director/lingo/lingo-gr.y"
+  case 234: /* thedatetime: tTHE tLONG tTIME  */
+#line 711 "engines/director/lingo/lingo-gr.y"
                                                                 { (yyval.node) = new TheDateTimeNode(kTheLong, kTheTime); }
 #line 3902 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 236: /* thedatetime: tTHE tSHORT tDATE  */
-#line 707 "engines/director/lingo/lingo-gr.y"
+  case 235: /* thedatetime: tTHE tSHORT tDATE  */
+#line 712 "engines/director/lingo/lingo-gr.y"
                                                                 { (yyval.node) = new TheDateTimeNode(kTheShort, kTheDate); }
 #line 3908 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 237: /* thedatetime: tTHE tSHORT tTIME  */
-#line 708 "engines/director/lingo/lingo-gr.y"
+  case 236: /* thedatetime: tTHE tSHORT tTIME  */
+#line 713 "engines/director/lingo/lingo-gr.y"
                                                                 { (yyval.node) = new TheDateTimeNode(kTheShort, kTheTime); }
 #line 3914 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 238: /* thenumberof: tTHE tNUMBER tOF tCHARS inof simpleexpr  */
-#line 712 "engines/director/lingo/lingo-gr.y"
+  case 237: /* thenumberof: tTHE tNUMBER tOF tCHARS inof simpleexpr  */
+#line 717 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new TheNumberOfNode(kNumberOfChars, (yyvsp[0].node)); }
 #line 3920 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 239: /* thenumberof: tTHE tNUMBER tOF tWORDS inof simpleexpr  */
-#line 713 "engines/director/lingo/lingo-gr.y"
+  case 238: /* thenumberof: tTHE tNUMBER tOF tWORDS inof simpleexpr  */
+#line 718 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new TheNumberOfNode(kNumberOfWords, (yyvsp[0].node)); }
 #line 3926 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 240: /* thenumberof: tTHE tNUMBER tOF tITEMS inof simpleexpr  */
-#line 714 "engines/director/lingo/lingo-gr.y"
+  case 239: /* thenumberof: tTHE tNUMBER tOF tITEMS inof simpleexpr  */
+#line 719 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new TheNumberOfNode(kNumberOfItems, (yyvsp[0].node)); }
 #line 3932 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 241: /* thenumberof: tTHE tNUMBER tOF tLINES inof simpleexpr  */
-#line 715 "engines/director/lingo/lingo-gr.y"
+  case 240: /* thenumberof: tTHE tNUMBER tOF tLINES inof simpleexpr  */
+#line 720 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new TheNumberOfNode(kNumberOfLines, (yyvsp[0].node)); }
 #line 3938 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 242: /* thenumberof: tTHE tNUMBER tOF tMENUITEMS inof menu  */
-#line 716 "engines/director/lingo/lingo-gr.y"
+  case 241: /* thenumberof: tTHE tNUMBER tOF tMENUITEMS inof menu  */
+#line 721 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new TheNumberOfNode(kNumberOfMenuItems, (yyvsp[0].node)); }
 #line 3944 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 245: /* writablethe: tTHE ID  */
-#line 721 "engines/director/lingo/lingo-gr.y"
+  case 244: /* writablethe: tTHE ID  */
+#line 726 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new TheNode((yyvsp[0].s)); }
 #line 3950 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 246: /* writablethe: tTHE ID tOF writabletheobj  */
-#line 722 "engines/director/lingo/lingo-gr.y"
+  case 245: /* writablethe: tTHE ID tOF writabletheobj  */
+#line 727 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.node) = new TheOfNode((yyvsp[-2].s), (yyvsp[0].node)); }
 #line 3956 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 248: /* writabletheobj: tMENU expr_noeq  */
-#line 726 "engines/director/lingo/lingo-gr.y"
+  case 247: /* writabletheobj: tMENU expr_noeq  */
+#line 731 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new MenuNode((yyvsp[0].node)); }
 #line 3962 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 249: /* writabletheobj: tMENUITEM expr_noeq tOF tMENU expr_noeq  */
-#line 727 "engines/director/lingo/lingo-gr.y"
+  case 248: /* writabletheobj: tMENUITEM expr_noeq tOF tMENU expr_noeq  */
+#line 732 "engines/director/lingo/lingo-gr.y"
                                                                 { (yyval.node) = new MenuItemNode((yyvsp[-3].node), (yyvsp[0].node)); }
 #line 3968 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 250: /* writabletheobj: tSOUND expr_noeq  */
-#line 728 "engines/director/lingo/lingo-gr.y"
+  case 249: /* writabletheobj: tSOUND expr_noeq  */
+#line 733 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new SoundNode((yyvsp[0].node)); }
 #line 3974 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 251: /* writabletheobj: tSPRITE expr_noeq  */
-#line 729 "engines/director/lingo/lingo-gr.y"
+  case 250: /* writabletheobj: tSPRITE expr_noeq  */
+#line 734 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new SpriteNode((yyvsp[0].node)); }
 #line 3980 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 252: /* list: '[' exprlist ']'  */
-#line 732 "engines/director/lingo/lingo-gr.y"
+  case 251: /* list: '[' exprlist ']'  */
+#line 737 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.node) = new ListNode((yyvsp[-1].nodelist)); }
 #line 3986 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 253: /* list: '[' ':' ']'  */
-#line 733 "engines/director/lingo/lingo-gr.y"
+  case 252: /* list: '[' ':' ']'  */
+#line 738 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.node) = new PropListNode(new NodeList); }
 #line 3992 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 254: /* list: '[' proplist ']'  */
-#line 734 "engines/director/lingo/lingo-gr.y"
+  case 253: /* list: '[' proplist ']'  */
+#line 739 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.node) = new PropListNode((yyvsp[-1].nodelist)); }
 #line 3998 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 255: /* proplist: proppair  */
-#line 737 "engines/director/lingo/lingo-gr.y"
+  case 254: /* proplist: proppair  */
+#line 742 "engines/director/lingo/lingo-gr.y"
                                                         {
 		NodeList *list = new NodeList; 
 		list->push_back((yyvsp[0].node));
@@ -4006,364 +4006,364 @@ yyreduce:
 #line 4007 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 256: /* proplist: proplist ',' proppair  */
-#line 741 "engines/director/lingo/lingo-gr.y"
+  case 255: /* proplist: proplist ',' proppair  */
+#line 746 "engines/director/lingo/lingo-gr.y"
                                                 {
 		(yyvsp[-2].nodelist)->push_back((yyvsp[0].node));
 		(yyval.nodelist) = (yyvsp[-2].nodelist); }
 #line 4015 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 257: /* proppair: tSYMBOL ':' expr  */
-#line 746 "engines/director/lingo/lingo-gr.y"
+  case 256: /* proppair: tSYMBOL ':' expr  */
+#line 751 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.node) = new PropPairNode(new SymbolNode((yyvsp[-2].s)), (yyvsp[0].node)); }
 #line 4021 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 258: /* proppair: ID ':' expr  */
-#line 747 "engines/director/lingo/lingo-gr.y"
+  case 257: /* proppair: ID ':' expr  */
+#line 752 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.node) = new PropPairNode(new SymbolNode((yyvsp[-2].s)), (yyvsp[0].node)); }
 #line 4027 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 259: /* proppair: tSTRING ':' expr  */
-#line 748 "engines/director/lingo/lingo-gr.y"
+  case 258: /* proppair: tSTRING ':' expr  */
+#line 753 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.node) = new PropPairNode(new StringNode((yyvsp[-2].s)), (yyvsp[0].node)); }
 #line 4033 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 260: /* unarymath: '+' simpleexpr  */
-#line 751 "engines/director/lingo/lingo-gr.y"
+  case 259: /* unarymath: '+' simpleexpr  */
+#line 756 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.node) = (yyvsp[0].node); }
 #line 4039 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 261: /* unarymath: '-' simpleexpr  */
-#line 752 "engines/director/lingo/lingo-gr.y"
+  case 260: /* unarymath: '-' simpleexpr  */
+#line 757 "engines/director/lingo/lingo-gr.y"
                                                                 { (yyval.node) = new UnaryOpNode(LC::c_negate, (yyvsp[0].node)); }
 #line 4045 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 266: /* expr: expr '+' expr  */
-#line 762 "engines/director/lingo/lingo-gr.y"
+  case 265: /* expr: expr '+' expr  */
+#line 767 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.node) = new BinaryOpNode(LC::c_add, (yyvsp[-2].node), (yyvsp[0].node)); }
 #line 4051 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 267: /* expr: expr '-' expr  */
-#line 763 "engines/director/lingo/lingo-gr.y"
+  case 266: /* expr: expr '-' expr  */
+#line 768 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.node) = new BinaryOpNode(LC::c_sub, (yyvsp[-2].node), (yyvsp[0].node)); }
 #line 4057 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 268: /* expr: expr '*' expr  */
-#line 764 "engines/director/lingo/lingo-gr.y"
+  case 267: /* expr: expr '*' expr  */
+#line 769 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.node) = new BinaryOpNode(LC::c_mul, (yyvsp[-2].node), (yyvsp[0].node)); }
 #line 4063 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 269: /* expr: expr '/' expr  */
-#line 765 "engines/director/lingo/lingo-gr.y"
+  case 268: /* expr: expr '/' expr  */
+#line 770 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.node) = new BinaryOpNode(LC::c_div, (yyvsp[-2].node), (yyvsp[0].node)); }
 #line 4069 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 270: /* expr: expr tMOD expr  */
-#line 766 "engines/director/lingo/lingo-gr.y"
+  case 269: /* expr: expr tMOD expr  */
+#line 771 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.node) = new BinaryOpNode(LC::c_mod, (yyvsp[-2].node), (yyvsp[0].node)); }
 #line 4075 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 271: /* expr: expr '>' expr  */
-#line 767 "engines/director/lingo/lingo-gr.y"
+  case 270: /* expr: expr '>' expr  */
+#line 772 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.node) = new BinaryOpNode(LC::c_gt, (yyvsp[-2].node), (yyvsp[0].node)); }
 #line 4081 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 272: /* expr: expr '<' expr  */
-#line 768 "engines/director/lingo/lingo-gr.y"
+  case 271: /* expr: expr '<' expr  */
+#line 773 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.node) = new BinaryOpNode(LC::c_lt, (yyvsp[-2].node), (yyvsp[0].node)); }
 #line 4087 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 273: /* expr: expr tEQ expr  */
-#line 769 "engines/director/lingo/lingo-gr.y"
+  case 272: /* expr: expr tEQ expr  */
+#line 774 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.node) = new BinaryOpNode(LC::c_eq, (yyvsp[-2].node), (yyvsp[0].node)); }
 #line 4093 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 274: /* expr: expr tNEQ expr  */
-#line 770 "engines/director/lingo/lingo-gr.y"
+  case 273: /* expr: expr tNEQ expr  */
+#line 775 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.node) = new BinaryOpNode(LC::c_neq, (yyvsp[-2].node), (yyvsp[0].node)); }
 #line 4099 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 275: /* expr: expr tGE expr  */
-#line 771 "engines/director/lingo/lingo-gr.y"
+  case 274: /* expr: expr tGE expr  */
+#line 776 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.node) = new BinaryOpNode(LC::c_ge, (yyvsp[-2].node), (yyvsp[0].node)); }
 #line 4105 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 276: /* expr: expr tLE expr  */
-#line 772 "engines/director/lingo/lingo-gr.y"
+  case 275: /* expr: expr tLE expr  */
+#line 777 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.node) = new BinaryOpNode(LC::c_le, (yyvsp[-2].node), (yyvsp[0].node)); }
 #line 4111 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 277: /* expr: expr tAND expr  */
-#line 773 "engines/director/lingo/lingo-gr.y"
+  case 276: /* expr: expr tAND expr  */
+#line 778 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.node) = new BinaryOpNode(LC::c_and, (yyvsp[-2].node), (yyvsp[0].node)); }
 #line 4117 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 278: /* expr: expr tOR expr  */
-#line 774 "engines/director/lingo/lingo-gr.y"
+  case 277: /* expr: expr tOR expr  */
+#line 779 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.node) = new BinaryOpNode(LC::c_or, (yyvsp[-2].node), (yyvsp[0].node)); }
 #line 4123 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 279: /* expr: expr '&' expr  */
-#line 775 "engines/director/lingo/lingo-gr.y"
+  case 278: /* expr: expr '&' expr  */
+#line 780 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.node) = new BinaryOpNode(LC::c_ampersand, (yyvsp[-2].node), (yyvsp[0].node)); }
 #line 4129 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 280: /* expr: expr tCONCAT expr  */
-#line 776 "engines/director/lingo/lingo-gr.y"
+  case 279: /* expr: expr tCONCAT expr  */
+#line 781 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.node) = new BinaryOpNode(LC::c_concat, (yyvsp[-2].node), (yyvsp[0].node)); }
 #line 4135 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 281: /* expr: expr tCONTAINS expr  */
-#line 777 "engines/director/lingo/lingo-gr.y"
+  case 280: /* expr: expr tCONTAINS expr  */
+#line 782 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.node) = new BinaryOpNode(LC::c_contains, (yyvsp[-2].node), (yyvsp[0].node)); }
 #line 4141 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 282: /* expr: expr tSTARTS expr  */
-#line 778 "engines/director/lingo/lingo-gr.y"
+  case 281: /* expr: expr tSTARTS expr  */
+#line 783 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.node) = new BinaryOpNode(LC::c_starts, (yyvsp[-2].node), (yyvsp[0].node)); }
 #line 4147 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 285: /* expr_nounarymath: expr_nounarymath '+' expr  */
-#line 787 "engines/director/lingo/lingo-gr.y"
+  case 284: /* expr_nounarymath: expr_nounarymath '+' expr  */
+#line 792 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new BinaryOpNode(LC::c_add, (yyvsp[-2].node), (yyvsp[0].node)); }
 #line 4153 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 286: /* expr_nounarymath: expr_nounarymath '-' expr  */
-#line 788 "engines/director/lingo/lingo-gr.y"
+  case 285: /* expr_nounarymath: expr_nounarymath '-' expr  */
+#line 793 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new BinaryOpNode(LC::c_sub, (yyvsp[-2].node), (yyvsp[0].node)); }
 #line 4159 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 287: /* expr_nounarymath: expr_nounarymath '*' expr  */
-#line 789 "engines/director/lingo/lingo-gr.y"
+  case 286: /* expr_nounarymath: expr_nounarymath '*' expr  */
+#line 794 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new BinaryOpNode(LC::c_mul, (yyvsp[-2].node), (yyvsp[0].node)); }
 #line 4165 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 288: /* expr_nounarymath: expr_nounarymath '/' expr  */
-#line 790 "engines/director/lingo/lingo-gr.y"
+  case 287: /* expr_nounarymath: expr_nounarymath '/' expr  */
+#line 795 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new BinaryOpNode(LC::c_div, (yyvsp[-2].node), (yyvsp[0].node)); }
 #line 4171 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 289: /* expr_nounarymath: expr_nounarymath tMOD expr  */
-#line 791 "engines/director/lingo/lingo-gr.y"
+  case 288: /* expr_nounarymath: expr_nounarymath tMOD expr  */
+#line 796 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new BinaryOpNode(LC::c_mod, (yyvsp[-2].node), (yyvsp[0].node)); }
 #line 4177 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 290: /* expr_nounarymath: expr_nounarymath '>' expr  */
-#line 792 "engines/director/lingo/lingo-gr.y"
+  case 289: /* expr_nounarymath: expr_nounarymath '>' expr  */
+#line 797 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new BinaryOpNode(LC::c_gt, (yyvsp[-2].node), (yyvsp[0].node)); }
 #line 4183 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 291: /* expr_nounarymath: expr_nounarymath '<' expr  */
-#line 793 "engines/director/lingo/lingo-gr.y"
+  case 290: /* expr_nounarymath: expr_nounarymath '<' expr  */
+#line 798 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new BinaryOpNode(LC::c_lt, (yyvsp[-2].node), (yyvsp[0].node)); }
 #line 4189 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 292: /* expr_nounarymath: expr_nounarymath tEQ expr  */
-#line 794 "engines/director/lingo/lingo-gr.y"
+  case 291: /* expr_nounarymath: expr_nounarymath tEQ expr  */
+#line 799 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new BinaryOpNode(LC::c_eq, (yyvsp[-2].node), (yyvsp[0].node)); }
 #line 4195 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 293: /* expr_nounarymath: expr_nounarymath tNEQ expr  */
-#line 795 "engines/director/lingo/lingo-gr.y"
+  case 292: /* expr_nounarymath: expr_nounarymath tNEQ expr  */
+#line 800 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new BinaryOpNode(LC::c_neq, (yyvsp[-2].node), (yyvsp[0].node)); }
 #line 4201 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 294: /* expr_nounarymath: expr_nounarymath tGE expr  */
-#line 796 "engines/director/lingo/lingo-gr.y"
+  case 293: /* expr_nounarymath: expr_nounarymath tGE expr  */
+#line 801 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new BinaryOpNode(LC::c_ge, (yyvsp[-2].node), (yyvsp[0].node)); }
 #line 4207 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 295: /* expr_nounarymath: expr_nounarymath tLE expr  */
-#line 797 "engines/director/lingo/lingo-gr.y"
+  case 294: /* expr_nounarymath: expr_nounarymath tLE expr  */
+#line 802 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new BinaryOpNode(LC::c_le, (yyvsp[-2].node), (yyvsp[0].node)); }
 #line 4213 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 296: /* expr_nounarymath: expr_nounarymath tAND expr  */
-#line 798 "engines/director/lingo/lingo-gr.y"
+  case 295: /* expr_nounarymath: expr_nounarymath tAND expr  */
+#line 803 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new BinaryOpNode(LC::c_and, (yyvsp[-2].node), (yyvsp[0].node)); }
 #line 4219 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 297: /* expr_nounarymath: expr_nounarymath tOR expr  */
-#line 799 "engines/director/lingo/lingo-gr.y"
+  case 296: /* expr_nounarymath: expr_nounarymath tOR expr  */
+#line 804 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new BinaryOpNode(LC::c_or, (yyvsp[-2].node), (yyvsp[0].node)); }
 #line 4225 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 298: /* expr_nounarymath: expr_nounarymath '&' expr  */
-#line 800 "engines/director/lingo/lingo-gr.y"
+  case 297: /* expr_nounarymath: expr_nounarymath '&' expr  */
+#line 805 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new BinaryOpNode(LC::c_ampersand, (yyvsp[-2].node), (yyvsp[0].node)); }
 #line 4231 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 299: /* expr_nounarymath: expr_nounarymath tCONCAT expr  */
-#line 801 "engines/director/lingo/lingo-gr.y"
+  case 298: /* expr_nounarymath: expr_nounarymath tCONCAT expr  */
+#line 806 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.node) = new BinaryOpNode(LC::c_concat, (yyvsp[-2].node), (yyvsp[0].node)); }
 #line 4237 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 300: /* expr_nounarymath: expr_nounarymath tCONTAINS expr  */
-#line 802 "engines/director/lingo/lingo-gr.y"
+  case 299: /* expr_nounarymath: expr_nounarymath tCONTAINS expr  */
+#line 807 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.node) = new BinaryOpNode(LC::c_contains, (yyvsp[-2].node), (yyvsp[0].node)); }
 #line 4243 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 301: /* expr_nounarymath: expr_nounarymath tSTARTS expr  */
-#line 803 "engines/director/lingo/lingo-gr.y"
+  case 300: /* expr_nounarymath: expr_nounarymath tSTARTS expr  */
+#line 808 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.node) = new BinaryOpNode(LC::c_starts, (yyvsp[-2].node), (yyvsp[0].node)); }
 #line 4249 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 304: /* expr_noeq: expr_noeq '+' expr_noeq  */
-#line 808 "engines/director/lingo/lingo-gr.y"
+  case 303: /* expr_noeq: expr_noeq '+' expr_noeq  */
+#line 813 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new BinaryOpNode(LC::c_add, (yyvsp[-2].node), (yyvsp[0].node)); }
 #line 4255 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 305: /* expr_noeq: expr_noeq '-' expr_noeq  */
-#line 809 "engines/director/lingo/lingo-gr.y"
+  case 304: /* expr_noeq: expr_noeq '-' expr_noeq  */
+#line 814 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new BinaryOpNode(LC::c_sub, (yyvsp[-2].node), (yyvsp[0].node)); }
 #line 4261 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 306: /* expr_noeq: expr_noeq '*' expr_noeq  */
-#line 810 "engines/director/lingo/lingo-gr.y"
+  case 305: /* expr_noeq: expr_noeq '*' expr_noeq  */
+#line 815 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new BinaryOpNode(LC::c_mul, (yyvsp[-2].node), (yyvsp[0].node)); }
 #line 4267 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 307: /* expr_noeq: expr_noeq '/' expr_noeq  */
-#line 811 "engines/director/lingo/lingo-gr.y"
+  case 306: /* expr_noeq: expr_noeq '/' expr_noeq  */
+#line 816 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new BinaryOpNode(LC::c_div, (yyvsp[-2].node), (yyvsp[0].node)); }
 #line 4273 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 308: /* expr_noeq: expr_noeq tMOD expr_noeq  */
-#line 812 "engines/director/lingo/lingo-gr.y"
+  case 307: /* expr_noeq: expr_noeq tMOD expr_noeq  */
+#line 817 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new BinaryOpNode(LC::c_mod, (yyvsp[-2].node), (yyvsp[0].node)); }
 #line 4279 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 309: /* expr_noeq: expr_noeq '>' expr_noeq  */
-#line 813 "engines/director/lingo/lingo-gr.y"
+  case 308: /* expr_noeq: expr_noeq '>' expr_noeq  */
+#line 818 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new BinaryOpNode(LC::c_gt, (yyvsp[-2].node), (yyvsp[0].node)); }
 #line 4285 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 310: /* expr_noeq: expr_noeq '<' expr_noeq  */
-#line 814 "engines/director/lingo/lingo-gr.y"
+  case 309: /* expr_noeq: expr_noeq '<' expr_noeq  */
+#line 819 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new BinaryOpNode(LC::c_lt, (yyvsp[-2].node), (yyvsp[0].node)); }
 #line 4291 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 311: /* expr_noeq: expr_noeq tNEQ expr_noeq  */
-#line 815 "engines/director/lingo/lingo-gr.y"
+  case 310: /* expr_noeq: expr_noeq tNEQ expr_noeq  */
+#line 820 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new BinaryOpNode(LC::c_neq, (yyvsp[-2].node), (yyvsp[0].node)); }
 #line 4297 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 312: /* expr_noeq: expr_noeq tGE expr_noeq  */
-#line 816 "engines/director/lingo/lingo-gr.y"
+  case 311: /* expr_noeq: expr_noeq tGE expr_noeq  */
+#line 821 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new BinaryOpNode(LC::c_ge, (yyvsp[-2].node), (yyvsp[0].node)); }
 #line 4303 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 313: /* expr_noeq: expr_noeq tLE expr_noeq  */
-#line 817 "engines/director/lingo/lingo-gr.y"
+  case 312: /* expr_noeq: expr_noeq tLE expr_noeq  */
+#line 822 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new BinaryOpNode(LC::c_le, (yyvsp[-2].node), (yyvsp[0].node)); }
 #line 4309 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 314: /* expr_noeq: expr_noeq tAND expr_noeq  */
-#line 818 "engines/director/lingo/lingo-gr.y"
+  case 313: /* expr_noeq: expr_noeq tAND expr_noeq  */
+#line 823 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new BinaryOpNode(LC::c_and, (yyvsp[-2].node), (yyvsp[0].node)); }
 #line 4315 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 315: /* expr_noeq: expr_noeq tOR expr_noeq  */
-#line 819 "engines/director/lingo/lingo-gr.y"
+  case 314: /* expr_noeq: expr_noeq tOR expr_noeq  */
+#line 824 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new BinaryOpNode(LC::c_or, (yyvsp[-2].node), (yyvsp[0].node)); }
 #line 4321 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 316: /* expr_noeq: expr_noeq '&' expr_noeq  */
-#line 820 "engines/director/lingo/lingo-gr.y"
+  case 315: /* expr_noeq: expr_noeq '&' expr_noeq  */
+#line 825 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new BinaryOpNode(LC::c_ampersand, (yyvsp[-2].node), (yyvsp[0].node)); }
 #line 4327 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 317: /* expr_noeq: expr_noeq tCONCAT expr_noeq  */
-#line 821 "engines/director/lingo/lingo-gr.y"
+  case 316: /* expr_noeq: expr_noeq tCONCAT expr_noeq  */
+#line 826 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new BinaryOpNode(LC::c_concat, (yyvsp[-2].node), (yyvsp[0].node)); }
 #line 4333 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 318: /* expr_noeq: expr_noeq tCONTAINS expr_noeq  */
-#line 822 "engines/director/lingo/lingo-gr.y"
+  case 317: /* expr_noeq: expr_noeq tCONTAINS expr_noeq  */
+#line 827 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.node) = new BinaryOpNode(LC::c_contains, (yyvsp[-2].node), (yyvsp[0].node)); }
 #line 4339 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 319: /* expr_noeq: expr_noeq tSTARTS expr_noeq  */
-#line 823 "engines/director/lingo/lingo-gr.y"
+  case 318: /* expr_noeq: expr_noeq tSTARTS expr_noeq  */
+#line 828 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new BinaryOpNode(LC::c_starts, (yyvsp[-2].node), (yyvsp[0].node)); }
 #line 4345 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 320: /* sprite: tSPRITE expr tINTERSECTS simpleexpr  */
-#line 826 "engines/director/lingo/lingo-gr.y"
+  case 319: /* sprite: tSPRITE expr tINTERSECTS simpleexpr  */
+#line 831 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.node) = new IntersectsNode((yyvsp[-2].node), (yyvsp[0].node)); }
 #line 4351 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 321: /* sprite: tSPRITE expr tWITHIN simpleexpr  */
-#line 827 "engines/director/lingo/lingo-gr.y"
+  case 320: /* sprite: tSPRITE expr tWITHIN simpleexpr  */
+#line 832 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new WithinNode((yyvsp[-2].node), (yyvsp[0].node)); }
 #line 4357 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 322: /* exprlist: %empty  */
-#line 830 "engines/director/lingo/lingo-gr.y"
+  case 321: /* exprlist: %empty  */
+#line 835 "engines/director/lingo/lingo-gr.y"
                                                                 { (yyval.nodelist) = new NodeList; }
 #line 4363 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 324: /* nonemptyexprlist: expr  */
-#line 834 "engines/director/lingo/lingo-gr.y"
+  case 323: /* nonemptyexprlist: expr  */
+#line 839 "engines/director/lingo/lingo-gr.y"
                                                         {
 		NodeList *list = new NodeList; 
 		list->push_back((yyvsp[0].node));
@@ -4371,8 +4371,8 @@ yyreduce:
 #line 4372 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 325: /* nonemptyexprlist: nonemptyexprlist ',' expr  */
-#line 838 "engines/director/lingo/lingo-gr.y"
+  case 324: /* nonemptyexprlist: nonemptyexprlist ',' expr  */
+#line 843 "engines/director/lingo/lingo-gr.y"
                                                 {
 		(yyvsp[-2].nodelist)->push_back((yyvsp[0].node));
 		(yyval.nodelist) = (yyvsp[-2].nodelist); }
@@ -4579,7 +4579,7 @@ yyreturn:
   return yyresult;
 }
 
-#line 843 "engines/director/lingo/lingo-gr.y"
+#line 848 "engines/director/lingo/lingo-gr.y"
 
 
 int yyreport_syntax_error(const yypcontext_t *ctx) {
diff --git a/engines/director/lingo/lingo-gr.h b/engines/director/lingo/lingo-gr.h
index 993220fe4c..d979a04db3 100644
--- a/engines/director/lingo/lingo-gr.h
+++ b/engines/director/lingo/lingo-gr.h
@@ -156,12 +156,16 @@ union YYSTYPE
 	int i;
 	double f;
 	Director::ChunkType chunktype;
+	struct {
+		Common::String *eventName;
+		Common::String *stmt;
+	} w;
 
 	Director::IDList *idlist;
 	Director::Node *node;
 	Director::NodeList *nodelist;
 
-#line 165 "engines/director/lingo/lingo-gr.h"
+#line 169 "engines/director/lingo/lingo-gr.h"
 
 };
 typedef union YYSTYPE YYSTYPE;
diff --git a/engines/director/lingo/lingo-gr.y b/engines/director/lingo/lingo-gr.y
index 0b367ea532..e3e5998f8b 100644
--- a/engines/director/lingo/lingo-gr.y
+++ b/engines/director/lingo/lingo-gr.y
@@ -114,6 +114,10 @@ static void checkEnd(Common::String *token, Common::String *expect, bool require
 	int i;
 	double f;
 	Director::ChunkType chunktype;
+	struct {
+		Common::String *eventName;
+		Common::String *stmt;
+	} w;
 
 	Director::IDList *idlist;
 	Director::Node *node;
@@ -140,6 +144,8 @@ static void checkEnd(Common::String *token, Common::String *expect, bool require
 %token tON tMETHOD tENDIF tENDREPEAT tENDTELL
 %token tASSERTERROR
 
+%type<w> tWHEN
+
 // TOP-LEVEL STUFF
 %type<node> script scriptpart
 %type<nodelist> scriptpartlist
@@ -363,7 +369,6 @@ ID: CMDID
 	| tSET			{ $$ = new Common::String("set"); }
 	| tTELL			{ $$ = new Common::String("tell"); }
 	| tTHEN			{ $$ = new Common::String("then"); }
-	| tWHEN			{ $$ = new Common::String("when"); }
 	;
 
 idlist: /* empty */					{ $$ = new IDList; }
@@ -556,7 +561,7 @@ tell: tTELL expr tTO stmtoneliner				{
 		$$ = new TellNode($expr, $stmtlist); }
 	;
 
-when: tWHEN ID tTHEN expr			{ $$ = new WhenNode($ID, $expr); } ;
+when: tWHEN							{ $$ = new WhenNode($tWHEN.eventName, $tWHEN.stmt); } ;
 
 stmtlist: /* empty */				{ $$ = new NodeList; }
 	| nonemptystmtlist
diff --git a/engines/director/lingo/lingo-lex.cpp b/engines/director/lingo/lingo-lex.cpp
index 4124bcd1b2..720ab736bd 100644
--- a/engines/director/lingo/lingo-lex.cpp
+++ b/engines/director/lingo/lingo-lex.cpp
@@ -364,7 +364,7 @@ struct yy_trans_info
 	flex_int32_t yy_verify;
 	flex_int32_t yy_nxt;
 	};
-static const flex_int16_t yy_accept[306] =
+static const flex_int16_t yy_accept[342] =
     {   0,
         0,    0,   87,   85,    1,   83,   83,   85,   85,   82,
        82,   81,   82,   78,   82,   79,   79,   79,   79,   79,
@@ -388,18 +388,22 @@ static const flex_int16_t yy_accept[306] =
        32,   33,   35,   79,   37,   79,   79,   43,   79,   48,
        50,   79,   79,   79,   79,   79,   79,   79,   79,   79,
 
-       62,   64,   65,   67,   79,   79,   70,   72,    0,   79,
+       62,   64,   65,   79,   79,   79,   70,   72,    0,   79,
        79,    6,   79,   11,   79,   79,   17,   20,   21,   79,
        23,   79,   79,   79,   31,   34,   36,   79,   79,   42,
        79,   79,   79,   79,   79,   79,   58,   59,   79,   79,
-       68,   79,   79,   73,    0,   79,    4,    8,   79,   14,
-       17,   22,   24,   79,   79,   79,   40,   45,   79,   79,
-       54,   55,   79,   60,   61,   69,   71,    0,   79,   79,
-       79,   79,   79,   79,   79,   79,   79,    0,   19,   79,
-       12,   26,   79,   38,   51,   52,   79,   19,   79,   79,
-       39,   79,   79,   27,   79,    3,   79,   79,   79,   79,
-
-       79,   79,   79,   56,    0
+        0,   68,   79,   79,   73,    0,   79,    4,    8,   79,
+       14,   17,   22,   24,   79,   79,   79,   40,   45,   79,
+       79,   54,   55,   79,   60,   61,    0,    0,    0,   69,
+       71,    0,   79,   79,   79,   79,   79,   79,   79,   79,
+       79,    0,    0,    0,    0,   19,   79,   12,   26,   79,
+       38,   51,   52,   79,    0,    0,    0,   19,   79,   79,
+
+       39,   79,    0,    0,    0,    0,   79,   27,   79,    0,
+        0,    0,    0,    3,   79,    0,    0,    0,    0,    0,
+       79,    0,    0,    0,    0,    0,   79,    0,    0,   79,
+        0,    0,   79,    0,   79,   67,   79,   67,   67,   56,
+        0
     } ;
 
 static const YY_CHAR yy_ec[256] =
@@ -411,13 +415,13 @@ static const YY_CHAR yy_ec[256] =
         7,    7,    7,    7,    7,    9,    7,   10,   10,   10,
        10,   10,   10,   10,   10,   10,   10,    7,    1,   11,
        12,   13,    1,    1,   14,   15,   16,   17,   18,   19,
-       20,   21,   22,   23,   23,   24,   25,   26,   27,   28,
-       23,   29,   30,   31,   32,   33,   34,   35,   36,   23,
-        7,    1,    7,    7,   23,    1,   37,   38,   39,   40,
+       20,   21,   22,   23,   24,   25,   26,   27,   28,   29,
+       23,   30,   31,   32,   33,   34,   35,   36,   37,   23,
+        7,    1,    7,    7,   23,    1,   38,   39,   40,   41,
 
-       41,   42,   43,   44,   45,   23,   23,   46,   47,   48,
-       49,   50,   23,   51,   52,   53,   54,   55,   56,   57,
-       58,   23,    1,    1,    1,    1,    1,    1,    1,    1,
+       42,   43,   44,   45,   46,   23,   47,   48,   49,   50,
+       51,   52,   23,   53,   54,   55,   56,   57,   58,   59,
+       60,   23,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
@@ -434,250 +438,274 @@ static const YY_CHAR yy_ec[256] =
         1,    1,    1,    1,    1
     } ;
 
-static const YY_CHAR yy_meta[59] =
+static const YY_CHAR yy_meta[61] =
     {   0,
         1,    2,    3,    3,    1,    1,    1,    1,    1,    4,
         1,    1,    1,    5,    5,    5,    5,    5,    5,    5,
         5,    5,    5,    5,    5,    5,    5,    5,    5,    5,
         5,    5,    5,    5,    5,    5,    5,    5,    5,    5,
         5,    5,    5,    5,    5,    5,    5,    5,    5,    5,
-        5,    5,    5,    5,    5,    5,    5,    5
+        5,    5,    5,    5,    5,    5,    5,    5,    5,    5
     } ;
 
-static const flex_int16_t yy_base[312] =
+static const flex_int16_t yy_base[349] =
     {   0,
-        0,   57,  166,  630,   58,  630,  630,  156,    0,  630,
-      147,   54,   53,  630,  140,   52,   50,   58,   55,   62,
-       58,   74,   48,   86,    0,   99,  100,   97,  114,  121,
-       65,  160,  162,  171,  128,  157,  155,  630,  130,  630,
-        0,  630,  115,   65,  630,  630,  630,    0,  139,   58,
-      156,  155,  130,  181,  137,  137,  176,  171,  182,  197,
-      195,  201,  207,  196,  120,  200,    0,  195,  210,  200,
-      205,  206,  217,  210,  222,  200,  207,  218,    0,    0,
-      231,    0,  236,  241,  230,  236,  237,  236,  243,  239,
-      245,  261,  254,  258,  254,    0,  262,  271,  258,  302,
-
-      271,  278,    0,  106,  281,  277,    0,  284,  281,  284,
-      283,  297,  298,  294,  304,   82,  294,  302,  302,  308,
-      326,  307,  300,  323,  312,  309,  325,  331,  325,  323,
-      337,    0,  338,  325,    0,  346,  337,  329,  334,  340,
-        0,  351,  348,  348,    0,  346,  354,  349,  353,  362,
-      362,  373,  370,  374,  382,  379,  384,  387,  374,  388,
-      380,  382,    0,  382,  393,    0,  382,    0,    0,   79,
-        0,  398,  398,  403,  392,  390,  411,  399,    0,  402,
-        0,  406,    0,  410,  420,  417,  427,    0,  428,    0,
-        0,  425,  431,  437,  425,  430,  425,  440,  429,  430,
-
-        0,    0,    0,    0,  444,  437,  445,  441,  442,  449,
-      446,    0,  463,    0,  462,  469,    0,    0,    0,  465,
-      630,  473,  468,  466,    0,    0,    0,  466,  475,    0,
-      470,  473,  473,  472,  474,  473,    0,    0,  490,  482,
-        0,  479,  491,    0,  493,  494,  487,    0,  500,    0,
-        0,    0,    0,  513,  512,  515,    0,    0,  504,  506,
-        0,    0,  513,    0,    0,    0,    0,  511,  505,  529,
-      516,  526,  531,  524,  520,  515,  540,  521,    0,  530,
-        0,    0,  533,  535,    0,    0,  539,  630,  537,  544,
-        0,  545,  559,    0,  562,    0,  553,  553,  567,  559,
-
-      560,  563,  563,    0,  630,  614,   72,  616,  618,  622,
-      624
+        0,   59,  388,  707,   60,  707,  707,  335,    0,  707,
+      316,   56,   55,  707,  280,   54,   52,   58,   57,   62,
+       54,   63,   55,   86,    0,  102,  105,  104,  115,  124,
+       64,  165,  157,  167,  219,  197,  123,  707,  280,  707,
+        0,  707,  242,  129,  707,  707,  707,    0,  113,   60,
+      118,  131,  130,  149,  142,  141,  166,  166,  175,  149,
+      154,  186,  195,  197,  196,  201,    0,  199,  197,  201,
+      207,  209,  221,  213,  224,  208,  214,  221,    0,    0,
+      224,    0,  237,  246,  224,  231,  243,  239,  244,  244,
+      248,  266,  257,  266,  260,    0,  269,  266,  259,  315,
+
+      276,  286,    0,  172,  276,  285,    0,  279,  278,  283,
+      288,  304,  305,  298,  310,  169,  299,  307,  311,  320,
+      336,  317,  309,  333,  316,  312,  327,  329,  323,  323,
+      329,    0,  335,  330,    0,  351,  343,  334,  338,  348,
+        0,  360,  358,  356,    0,  353,  359,  365,  359,  367,
+      369,  379,  372,  376,  386,  386,  391,  394,  381,  396,
+      386,  387,    0,  387,  406,    0,  391,    0,    0,  168,
+        0,  408,  408,  414,  402,  401,  421,  407,    0,  411,
+        0,  412,    0,  417,  425,  423,  430,    0,  436,    0,
+        0,  433,  439,  444,  432,  436,  431,  447,  435,  437,
+
+        0,    0,    0,  162,  452,  445,  453,  446,  448,  455,
+      453,    0,  471,    0,  469,  475,    0,    0,    0,  470,
+      707,  479,  474,  471,    0,    0,    0,  472,  481,    0,
+      475,  479,  478,  477,  479,  478,    0,    0,  496,  485,
+      517,    0,  488,  502,    0,  505,  506,  498,    0,  510,
+        0,    0,    0,    0,  510,  527,  529,    0,    0,  507,
+      510,    0,    0,  525,    0,    0,  535,  527,  535,    0,
+        0,  531,  525,  544,  536,  550,  554,  547,  544,  539,
+      565,  546,  553,  561,  551,    0,  557,    0,    0,  559,
+      562,    0,    0,  564,  580,  569,  562,  707,  583,  574,
+
+        0,  576,  580,  586,  584,  589,  602,    0,  602,  587,
+      160,  615,  591,    0,  597,  602,  631,  606,  606,  605,
+      607,  149,  620,  611,  129,  118,  624,  631,  624,  623,
+      627,  115,  625,   88,  631,   81,  631,    0,   78,    0,
+      707,  686,   69,  688,  690,  694,  696,  701
     } ;
 
-static const flex_int16_t yy_def[312] =
+static const flex_int16_t yy_def[349] =
     {   0,
-      305,    1,  305,  305,  305,  305,  305,  306,  307,  305,
-      305,  305,  305,  305,  305,  308,  308,  308,  308,  308,
-      308,  308,  308,  308,  308,  308,  308,  308,  308,  308,
-      308,  308,  308,  308,  305,  308,  305,  305,  306,  305,
-      309,  305,  305,  305,  305,  305,  305,  308,  308,  308,
-      308,  308,  308,  308,  308,  308,  308,  308,  308,  308,
-      308,  308,  308,  308,  308,  308,  308,  308,  308,  308,
-      308,  308,  308,  308,  308,  308,  308,  308,  308,  308,
-      308,  308,  308,  308,  308,  308,  308,  308,  308,  308,
-      308,  308,  308,  308,  308,  308,  308,  308,  308,  305,
-
-      305,  308,  309,  305,  308,  308,  308,  308,  308,  308,
-      308,  308,  308,  308,  308,  308,  308,  308,  308,  308,
-      305,  308,  308,  308,  308,  308,  308,  308,  308,  308,
-      308,  308,  308,  308,  308,  308,  308,  308,  308,  308,
-      308,  308,  308,  308,  308,  308,  308,  308,  308,  308,
-      308,  308,  308,  308,  308,  308,  308,  305,  308,  308,
-      308,  308,  308,  308,  308,  308,  308,  308,  308,  310,
-      308,  308,  308,  308,  305,  308,  308,  308,  308,  308,
-      308,  308,  308,  308,  308,  308,  308,  308,  308,  308,
-      308,  308,  308,  308,  308,  308,  308,  308,  308,  308,
-
-      308,  308,  308,  308,  308,  308,  308,  308,  305,  308,
-      308,  308,  308,  308,  308,  308,  311,  308,  308,  308,
-      305,  308,  308,  308,  308,  308,  308,  308,  308,  308,
-      308,  308,  308,  308,  308,  308,  308,  308,  308,  308,
-      308,  308,  308,  308,  305,  308,  308,  308,  308,  308,
-      311,  308,  308,  308,  308,  308,  308,  308,  308,  308,
-      308,  308,  308,  308,  308,  308,  308,  305,  308,  308,
-      308,  308,  308,  308,  308,  308,  308,  305,  308,  308,
-      308,  308,  308,  308,  308,  308,  308,  305,  308,  308,
-      308,  308,  308,  308,  308,  308,  308,  308,  308,  308,
-
-      308,  308,  308,  308,    0,  305,  305,  305,  305,  305,
-      305
+      341,    1,  341,  341,  341,  341,  341,  342,  343,  341,
+      341,  341,  341,  341,  341,  344,  344,  344,  344,  344,
+      344,  344,  344,  344,  344,  344,  344,  344,  344,  344,
+      344,  344,  344,  344,  341,  344,  341,  341,  342,  341,
+      345,  341,  341,  341,  341,  341,  341,  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,  344,  344,
+      344,  344,  344,  344,  344,  344,  344,  344,  344,  344,
+      344,  344,  344,  344,  344,  344,  344,  344,  344,  341,
+
+      341,  344,  345,  341,  344,  344,  344,  344,  344,  344,
+      344,  344,  344,  344,  344,  344,  344,  344,  344,  344,
+      341,  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,  344,  344,  344,  344,  344,  341,  344,  344,
+      344,  344,  344,  344,  344,  344,  344,  344,  344,  346,
+      344,  344,  344,  344,  341,  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,  344,  344,  341,  344,
+      344,  344,  344,  344,  344,  344,  347,  344,  344,  344,
+      341,  344,  344,  344,  344,  344,  344,  344,  344,  344,
+      344,  344,  344,  344,  344,  344,  344,  344,  344,  344,
+      341,  344,  344,  344,  344,  341,  344,  344,  344,  344,
+      344,  347,  344,  344,  344,  344,  344,  344,  344,  344,
+      344,  344,  344,  344,  344,  344,  341,  341,  341,  344,
+      344,  341,  344,  344,  344,  344,  344,  344,  344,  344,
+      344,  341,  341,  341,  341,  344,  344,  344,  344,  344,
+      344,  344,  344,  344,  341,  341,  341,  341,  344,  344,
+
+      344,  344,  341,  341,  341,  341,  344,  344,  344,  341,
+      341,  341,  341,  344,  344,  341,  341,  341,  341,  341,
+      344,  341,  341,  341,  341,  341,  344,  341,  341,  344,
+      341,  341,  344,  341,  344,  348,  344,  348,  348,  344,
+        0,  341,  341,  341,  341,  341,  341,  341
     } ;
 
-static const flex_int16_t yy_nxt[689] =
+static const flex_int16_t yy_nxt[768] =
     {   0,
         4,    5,    6,    7,    8,    9,   10,   11,    4,   12,
        13,   14,   15,   16,   17,   18,   19,   20,   21,   22,
-       23,   24,   25,   26,   27,   28,   29,   30,   31,   32,
-       33,   25,   25,   34,   25,   25,   16,   17,   18,   19,
-       20,   21,   22,   23,   24,   26,   27,   28,   29,   30,
-       31,   32,   33,   25,   25,   34,   25,   25,   35,   37,
-       38,   38,   43,   44,   45,   46,   49,   52,   56,   66,
-       50,   53,   57,   43,   44,   36,   41,   51,   54,   62,
-      170,   58,   86,  170,   55,   59,   63,   60,  106,   49,
-       52,   56,   66,   50,   53,   57,   61,   64,   36,   51,
-
-       65,   54,   62,   58,   67,   86,   55,   59,   63,   60,
-      106,   68,   70,   73,   76,  104,   69,   74,   61,   64,
-       71,  121,   65,   77,  104,   72,   75,   67,   78,  100,
-       38,   38,   79,   68,   40,   70,   73,   76,   69,   80,
-       74,   81,   82,   71,   83,   77,  101,   72,   75,   84,
-       78,   47,   85,  105,   42,   79,   37,   38,   38,  109,
-       40,   80,  111,   81,   82,  305,   83,  112,  305,  101,
-      102,   84,  107,  108,   85,   87,  105,   88,   62,   93,
-       89,  109,   94,   95,  111,   63,   90,   91,   96,  112,
-       92,   97,   98,  102,  110,  107,  108,   99,   87,  113,
-
-       88,   62,   93,   89,  114,   94,   95,   63,   90,   91,
-       96,  115,   92,  116,   97,   98,  117,  110,  118,   99,
-      119,  113,  120,  122,  123,  124,  114,  125,  305,  126,
-      127,  128,  129,  115,  134,  130,  116,  135,  132,  117,
-      131,  118,  136,  119,  120,  122,  123,  124,  137,  138,
-      125,  126,  127,  128,  133,  129,  134,  130,  139,  135,
-      141,  132,  131,  142,  136,  143,  145,  140,  144,  146,
-      147,  137,  138,  148,  149,  151,  133,  150,  152,  153,
-      305,  139,  141,  154,  158,  142,  157,  143,  145,  140,
-      144,  146,  147,  159,  161,  148,  155,  149,  151,  150,
-
-      152,  156,  153,  100,   38,   38,  154,  158,  157,  160,
-      162,  163,  164,  165,  166,  167,  159,  161,  155,  168,
-      101,  169,  174,  156,  171,  172,  173,  121,  176,  305,
-      177,  160,  162,  163,  164,  165,  180,  166,  167,  181,
-      178,  168,  182,  101,  169,  174,  171,  172,  173,  179,
-      183,  176,  177,  184,  185,  188,  175,  186,  180,  187,
-      189,  181,  190,  178,  191,  182,  192,  193,  194,  195,
-      199,  179,  196,  183,  197,  184,  185,  188,  175,  198,
-      186,  200,  187,  189,  190,  201,  191,  202,  192,  193,
-      203,  194,  195,  199,  196,  204,  197,  205,  206,  207,
-
-      208,  198,  209,  200,  210,  211,  215,  201,  212,  202,
-      213,  214,  216,  203,  218,  219,  220,  204,  221,  205,
-      222,  206,  207,  208,  223,  209,  210,  224,  211,  215,
-      212,  225,  213,  214,  216,  226,  227,  218,  219,  220,
-      221,  228,  222,  229,  230,  231,  232,  223,  233,  224,
-      234,  305,  235,  225,  236,  237,  238,  226,  227,  239,
-      240,  241,  305,  242,  228,  229,  243,  230,  231,  232,
-      244,  233,  245,  234,  235,  246,  236,  237,  247,  238,
-      248,  239,  240,  249,  241,  242,  250,  305,  252,  243,
-      253,  257,  244,  254,  245,  255,  256,  246,  258,  259,
-
-      247,  260,  261,  248,  262,  263,  249,  264,  270,  250,
-      252,  265,  266,  253,  257,  254,  267,  255,  256,  268,
-      258,  259,  269,  260,  261,  271,  262,  263,  272,  273,
-      264,  270,  274,  265,  266,  275,  276,  277,  267,  278,
-      279,  268,  280,  282,  269,  281,  283,  271,  284,  285,
-      286,  272,  273,  287,  293,  274,  288,  275,  276,  277,
-      289,  278,  279,  290,  291,  280,  282,  281,  292,  283,
-      284,  285,  286,  294,  295,  296,  287,  293,  288,  297,
-      305,  298,  289,  299,  300,  290,  291,  301,  302,  303,
-      292,  304,  305,  305,  305,  294,  295,  305,  296,  305,
-
-      305,  305,  297,  298,  305,  299,  305,  300,  305,  301,
-      302,  303,  305,  304,   39,   39,  305,   39,   39,   48,
-       48,  103,  103,  217,  305,  305,  217,  251,  251,    3,
-      305,  305,  305,  305,  305,  305,  305,  305,  305,  305,
-      305,  305,  305,  305,  305,  305,  305,  305,  305,  305,
-      305,  305,  305,  305,  305,  305,  305,  305,  305,  305,
-      305,  305,  305,  305,  305,  305,  305,  305,  305,  305,
-      305,  305,  305,  305,  305,  305,  305,  305,  305,  305,
-      305,  305,  305,  305,  305,  305,  305,  305
+       23,   24,   25,   25,   26,   27,   28,   29,   30,   31,
+       32,   33,   25,   25,   34,   25,   25,   16,   17,   18,
+       19,   20,   21,   22,   23,   24,   25,   26,   27,   28,
+       29,   30,   31,   32,   33,   25,   25,   34,   25,   25,
+       35,   37,   38,   38,   43,   44,   45,   46,   49,   52,
+       56,   53,   50,   41,   57,   62,   66,   36,   54,  339,
+       51,   86,  339,   63,   58,   55,   59,   64,   60,  336,
+       65,  106,   49,   52,   56,   53,   50,   61,   57,   62,
+
+       66,   36,   54,   51,   67,   86,   63,   58,   55,   59,
+       64,   60,   68,   65,  106,   70,  317,   69,   73,  317,
+       61,   76,   74,   71,   37,   38,   38,  105,   67,   72,
+      317,   77,   75,   79,  107,   68,   78,   43,   44,   70,
+       69,   80,   73,   81,   82,   76,   74,   71,   83,  108,
+      317,  105,   72,   84,   77,   75,   85,   79,  107,   78,
+      109,  317,  110,  241,   80,  116,   81,   82,  111,  170,
+      170,   83,  112,  108,   93,  117,   84,   94,   95,   85,
+       87,  104,   88,  109,   96,   89,  110,   97,   98,  116,
+      113,  111,   90,   91,   99,  112,   92,  121,   93,  117,
+
+      114,   94,   95,  118,   87,  115,   88,   96,  119,   89,
+      102,   97,   98,  113,  125,   90,   91,   99,   62,   92,
+      100,   38,   38,  114,  120,  122,   63,  118,  115,  123,
+      124,  126,  119,  127,  102,  128,  129,  101,  125,  130,
+      132,  137,   62,  134,  131,  135,  136,  120,  122,   63,
+      138,  104,  123,  124,  126,  141,  127,  133,  128,  142,
+      129,  101,  130,  139,  132,  137,  134,  131,  135,  136,
+      145,  146,  143,  140,  138,  144,  147,  148,  141,  149,
+      133,  150,  142,  151,   40,  152,  153,  139,  157,  158,
+      154,   47,  155,  145,  146,  143,  140,  156,  144,  147,
+
+      148,  159,  161,  149,  150,  160,  162,  151,  152,  163,
+      153,  157,  164,  158,  154,  155,  100,   38,   38,  165,
+      156,  166,  167,   42,  168,  159,  161,  169,  160,  162,
+      171,  172,  163,  101,  174,  164,  173,  121,  176,   40,
+      177,  180,  165,  181,  182,  166,  167,  168,  183,  186,
+      178,  169,  184,  171,  172,  185,  187,  101,  174,  173,
+      179,  188,  176,  177,  180,  189,  181,  175,  182,  190,
+      191,  192,  183,  186,  178,  184,  193,  194,  185,  195,
+      187,  196,  197,  179,  188,  198,  199,  341,  200,  189,
+      175,  201,  190,  191,  192,  202,  203,  341,  204,  193,
+
+      205,  194,  206,  195,  196,  197,  207,  208,  198,  209,
+      199,  200,  210,  211,  201,  212,  213,  214,  202,  215,
+      203,  204,  216,  205,  218,  219,  206,  220,  341,  221,
+      207,  208,  222,  209,  223,  210,  224,  211,  212,  213,
+      214,  225,  226,  215,  227,  216,  228,  230,  218,  219,
+      229,  220,  221,  231,  232,  222,  233,  234,  223,  224,
+      235,  236,  237,  238,  225,  226,  239,  227,  240,  242,
+      228,  230,  243,  229,  244,  341,  245,  231,  232,  246,
+      233,  234,  247,  235,  236,  237,  248,  238,  249,  239,
+      250,  240,  251,  242,  253,  243,  254,  258,  244,  245,
+
+      255,  256,  246,  257,  259,  247,  260,  261,  262,  248,
+      263,  264,  249,  265,  250,  266,  251,  253,  241,  274,
+      254,  258,  270,  255,  256,  276,  257,  259,  271,  260,
+      261,  262,  272,  263,  264,  273,  275,  265,  266,  279,
+      267,  280,  268,  274,  277,  270,  278,  341,  269,  276,
+      281,  271,  282,  341,  283,  272,  284,  287,  273,  275,
+      285,  286,  279,  267,  280,  268,  288,  289,  277,  290,
+      278,  269,  291,  281,  292,  293,  282,  283,  294,  306,
+      284,  287,  295,  285,  286,  296,  297,  298,  299,  288,
+      300,  289,  301,  290,  302,  291,  303,  292,  293,  305,
+
+      307,  312,  294,  306,  308,  295,  309,  310,  296,  297,
+      298,  299,  304,  300,  311,  301,  313,  302,  314,  315,
+      303,  316,  305,  320,  307,  312,  321,  308,  322,  309,
+      310,  318,  317,  324,  325,  304,  326,  311,  327,  313,
+      328,  330,  314,  315,  316,  329,  320,  319,  331,  321,
+      332,  322,  333,  334,  335,  318,  324,  325,  337,  326,
+      340,  327,  323,  341,  328,  330,  341,  341,  329,  341,
+      319,  341,  331,  332,  341,  333,  334,  335,  341,  341,
+      341,  337,  341,  340,  341,  323,   39,   39,  341,   39,
+       39,   48,   48,  103,  103,  217,  341,  341,  217,  252,
+
+      252,  338,  338,  341,  338,  338,    3,  341,  341,  341,
+      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
+      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
+      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
+      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
+      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
+      341,  341,  341,  341,  341,  341,  341
     } ;
 
-static const flex_int16_t yy_chk[689] =
+static const flex_int16_t yy_chk[768] =
     {   0,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    2,    5,
-        5,    5,   12,   12,   13,   13,   16,   17,   19,   23,
-       16,   18,   19,   44,   44,    2,  307,   16,   18,   21,
-      170,   19,   31,  116,   18,   20,   21,   20,   50,   16,
-       17,   19,   23,   16,   18,   19,   20,   22,    2,   16,
-
-       22,   18,   21,   19,   24,   31,   18,   20,   21,   20,
-       50,   24,   26,   27,   28,  104,   24,   27,   20,   22,
-       26,   65,   22,   28,   43,   26,   27,   24,   28,   35,
-       35,   35,   29,   24,   39,   26,   27,   28,   24,   29,
-       27,   29,   29,   26,   30,   28,   35,   26,   27,   30,
-       28,   15,   30,   49,   11,   29,   37,   37,   37,   53,
-        8,   29,   55,   29,   29,    3,   30,   56,    0,   35,
-       36,   30,   51,   52,   30,   32,   49,   32,   36,   33,
-       32,   53,   33,   33,   55,   36,   32,   32,   33,   56,
-       32,   34,   34,   36,   54,   51,   52,   34,   32,   57,
-
-       32,   36,   33,   32,   58,   33,   33,   36,   32,   32,
-       33,   59,   32,   60,   34,   34,   61,   54,   62,   34,
-       63,   57,   64,   66,   68,   68,   58,   69,    0,   70,
-       71,   72,   73,   59,   76,   74,   60,   77,   75,   61,
-       74,   62,   78,   63,   64,   66,   68,   68,   81,   83,
-       69,   70,   71,   72,   75,   73,   76,   74,   84,   77,
-       85,   75,   74,   86,   78,   87,   88,   84,   87,   89,
-       90,   81,   83,   91,   92,   94,   75,   93,   95,   97,
-        0,   84,   85,   97,  101,   86,   99,   87,   88,   84,
-       87,   89,   90,  102,  106,   91,   98,   92,   94,   93,
-
-       95,   98,   97,  100,  100,  100,   97,  101,   99,  105,
-      108,  109,  110,  111,  112,  113,  102,  106,   98,  114,
-      100,  115,  120,   98,  117,  118,  119,  121,  122,    0,
-      123,  105,  108,  109,  110,  111,  125,  112,  113,  126,
-      124,  114,  127,  100,  115,  120,  117,  118,  119,  124,
-      128,  122,  123,  129,  130,  134,  121,  131,  125,  133,
-      136,  126,  137,  124,  138,  127,  139,  140,  142,  143,
-      148,  124,  144,  128,  146,  129,  130,  134,  121,  147,
-      131,  149,  133,  136,  137,  150,  138,  151,  139,  140,
-      152,  142,  143,  148,  144,  153,  146,  154,  155,  156,
-
-      157,  147,  158,  149,  159,  160,  165,  150,  161,  151,
-      162,  164,  167,  152,  172,  173,  174,  153,  175,  154,
-      176,  155,  156,  157,  177,  158,  159,  178,  160,  165,
-      161,  180,  162,  164,  167,  182,  184,  172,  173,  174,
-      175,  185,  176,  186,  187,  189,  192,  177,  193,  178,
-      194,    0,  195,  180,  196,  197,  198,  182,  184,  199,
-      200,  205,    0,  206,  185,  186,  207,  187,  189,  192,
-      208,  193,  209,  194,  195,  210,  196,  197,  211,  198,
-      213,  199,  200,  215,  205,  206,  216,    0,  220,  207,
-      222,  229,  208,  223,  209,  224,  228,  210,  231,  232,
-
-      211,  233,  234,  213,  235,  236,  215,  239,  247,  216,
-      220,  240,  242,  222,  229,  223,  243,  224,  228,  245,
-      231,  232,  246,  233,  234,  249,  235,  236,  254,  255,
-      239,  247,  256,  240,  242,  259,  260,  263,  243,  268,
-      269,  245,  270,  272,  246,  271,  273,  249,  274,  275,
-      276,  254,  255,  277,  289,  256,  278,  259,  260,  263,
-      280,  268,  269,  283,  284,  270,  272,  271,  287,  273,
-      274,  275,  276,  290,  292,  293,  277,  289,  278,  295,
-        0,  297,  280,  298,  299,  283,  284,  300,  301,  302,
-      287,  303,    0,    0,    0,  290,  292,    0,  293,    0,
-
-        0,    0,  295,  297,    0,  298,    0,  299,    0,  300,
-      301,  302,    0,  303,  306,  306,    0,  306,  306,  308,
-      308,  309,  309,  310,    0,    0,  310,  311,  311,  305,
-      305,  305,  305,  305,  305,  305,  305,  305,  305,  305,
-      305,  305,  305,  305,  305,  305,  305,  305,  305,  305,
-      305,  305,  305,  305,  305,  305,  305,  305,  305,  305,
-      305,  305,  305,  305,  305,  305,  305,  305,  305,  305,
-      305,  305,  305,  305,  305,  305,  305,  305,  305,  305,
-      305,  305,  305,  305,  305,  305,  305,  305
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        2,    5,    5,    5,   12,   12,   13,   13,   16,   17,
+       19,   18,   16,  343,   19,   21,   23,    2,   18,  339,
+       16,   31,  336,   21,   19,   18,   20,   22,   20,  334,
+       22,   50,   16,   17,   19,   18,   16,   20,   19,   21,
+
+       23,    2,   18,   16,   24,   31,   21,   19,   18,   20,
+       22,   20,   24,   22,   50,   26,  332,   24,   27,  326,
+       20,   28,   27,   26,   37,   37,   37,   49,   24,   26,
+      325,   28,   27,   29,   51,   24,   28,   44,   44,   26,
+       24,   29,   27,   29,   29,   28,   27,   26,   30,   52,
+      322,   49,   26,   30,   28,   27,   30,   29,   51,   28,
+       53,  311,   54,  204,   29,   60,   29,   29,   55,  170,
+      116,   30,   56,   52,   33,   61,   30,   33,   33,   30,
+       32,  104,   32,   53,   33,   32,   54,   34,   34,   60,
+       57,   55,   32,   32,   34,   56,   32,   65,   33,   61,
+
+       58,   33,   33,   62,   32,   59,   32,   33,   63,   32,
+       36,   34,   34,   57,   69,   32,   32,   34,   36,   32,
+       35,   35,   35,   58,   64,   66,   36,   62,   59,   68,
+       68,   70,   63,   71,   36,   72,   73,   35,   69,   74,
+       75,   81,   36,   76,   74,   77,   78,   64,   66,   36,
+       83,   43,   68,   68,   70,   85,   71,   75,   72,   86,
+       73,   35,   74,   84,   75,   81,   76,   74,   77,   78,
+       88,   89,   87,   84,   83,   87,   90,   91,   85,   92,
+       75,   93,   86,   94,   39,   95,   97,   84,   99,  101,
+       97,   15,   98,   88,   89,   87,   84,   98,   87,   90,
+
+       91,  102,  106,   92,   93,  105,  108,   94,   95,  109,
+       97,   99,  110,  101,   97,   98,  100,  100,  100,  111,
+       98,  112,  113,   11,  114,  102,  106,  115,  105,  108,
+      117,  118,  109,  100,  120,  110,  119,  121,  122,    8,
+      123,  125,  111,  126,  127,  112,  113,  114,  128,  131,
+      124,  115,  129,  117,  118,  130,  133,  100,  120,  119,
+      124,  134,  122,  123,  125,  136,  126,  121,  127,  137,
+      138,  139,  128,  131,  124,  129,  140,  142,  130,  143,
+      133,  144,  146,  124,  134,  147,  148,    3,  149,  136,
+      121,  150,  137,  138,  139,  151,  152,    0,  153,  140,
+
+      154,  142,  155,  143,  144,  146,  156,  157,  147,  158,
+      148,  149,  159,  160,  150,  161,  162,  164,  151,  165,
+      152,  153,  167,  154,  172,  173,  155,  174,    0,  175,
+      156,  157,  176,  158,  177,  159,  178,  160,  161,  162,
+      164,  180,  182,  165,  184,  167,  185,  187,  172,  173,
+      186,  174,  175,  189,  192,  176,  193,  194,  177,  178,
+      195,  196,  197,  198,  180,  182,  199,  184,  200,  205,
+      185,  187,  206,  186,  207,    0,  208,  189,  192,  209,
+      193,  194,  210,  195,  196,  197,  211,  198,  213,  199,
+      215,  200,  216,  205,  220,  206,  222,  229,  207,  208,
+
+      223,  224,  209,  228,  231,  210,  232,  233,  234,  211,
+      235,  236,  213,  239,  215,  240,  216,  220,  241,  248,
+      222,  229,  243,  223,  224,  255,  228,  231,  244,  232,
+      233,  234,  246,  235,  236,  247,  250,  239,  240,  260,
+      241,  261,  241,  248,  256,  243,  257,    0,  241,  255,
+      264,  244,  267,    0,  268,  246,  269,  274,  247,  250,
+      272,  273,  260,  241,  261,  241,  275,  276,  256,  277,
+      257,  241,  278,  264,  279,  280,  267,  268,  281,  297,
+      269,  274,  282,  272,  273,  283,  284,  285,  287,  275,
+      290,  276,  291,  277,  294,  278,  295,  279,  280,  296,
+
+      299,  305,  281,  297,  300,  282,  302,  303,  283,  284,
+      285,  287,  295,  290,  304,  291,  306,  294,  307,  309,
+      295,  310,  296,  313,  299,  305,  315,  300,  316,  302,
+      303,  312,  317,  318,  319,  295,  320,  304,  321,  306,
+      323,  327,  307,  309,  310,  324,  313,  312,  328,  315,
+      329,  316,  330,  331,  333,  312,  318,  319,  335,  320,
+      337,  321,  317,    0,  323,  327,    0,    0,  324,    0,
+      312,    0,  328,  329,    0,  330,  331,  333,    0,    0,
+        0,  335,    0,  337,    0,  317,  342,  342,    0,  342,
+      342,  344,  344,  345,  345,  346,    0,    0,  346,  347,
+
+      347,  348,  348,    0,  348,  348,  341,  341,  341,  341,
+      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
+      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
+      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
+      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
+      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
+      341,  341,  341,  341,  341,  341,  341
     } ;
 
 static yy_state_type yy_last_accepting_state;
@@ -788,8 +816,8 @@ static Common::String *cleanupString(const char *s) {
 	return res;
 }
 
-#line 791 "engines/director/lingo/lingo-lex.cpp"
-#line 792 "engines/director/lingo/lingo-lex.cpp"
+#line 819 "engines/director/lingo/lingo-lex.cpp"
+#line 820 "engines/director/lingo/lingo-lex.cpp"
 
 #define INITIAL 0
 
@@ -1007,10 +1035,10 @@ YY_DECL
 		}
 
 	{
-#line 112 "engines/director/lingo/lingo-lex.l"
+#line 114 "engines/director/lingo/lingo-lex.l"
 
 
-#line 1013 "engines/director/lingo/lingo-lex.cpp"
+#line 1041 "engines/director/lingo/lingo-lex.cpp"
 
 	while ( /*CONSTCOND*/1 )		/* loops until end-of-file is reached */
 		{
@@ -1038,13 +1066,13 @@ yy_match:
 			while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
 				{
 				yy_current_state = (int) yy_def[yy_current_state];
-				if ( yy_current_state >= 306 )
+				if ( yy_current_state >= 342 )
 					yy_c = yy_meta[yy_c];
 				}
 			yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
 			++yy_cp;
 			}
-		while ( yy_current_state != 305 );
+		while ( yy_current_state != 341 );
 		yy_cp = (yy_last_accepting_cpos);
 		yy_current_state = (yy_last_accepting_state);
 
@@ -1066,87 +1094,87 @@ do_action:	/* This label is used only to access EOF actions. */
 
 case 1:
 YY_RULE_SETUP
-#line 114 "engines/director/lingo/lingo-lex.l"
+#line 116 "engines/director/lingo/lingo-lex.l"
 { count(); }
 	YY_BREAK
 case 2:
 YY_RULE_SETUP
-#line 116 "engines/director/lingo/lingo-lex.l"
+#line 118 "engines/director/lingo/lingo-lex.l"
 { count(); yylval.s = new Common::String(yytext + 1); return tSYMBOL; }	// D3, skip '#'
 	YY_BREAK
 case 3:
 YY_RULE_SETUP
-#line 118 "engines/director/lingo/lingo-lex.l"
+#line 120 "engines/director/lingo/lingo-lex.l"
 { count(); return tABBREVIATED; }
 	YY_BREAK
 case 4:
 YY_RULE_SETUP
-#line 119 "engines/director/lingo/lingo-lex.l"
+#line 121 "engines/director/lingo/lingo-lex.l"
 { count(); return tABBREV; }
 	YY_BREAK
 case 5:
 YY_RULE_SETUP
-#line 120 "engines/director/lingo/lingo-lex.l"
+#line 122 "engines/director/lingo/lingo-lex.l"
 { count(); return tABBR; }
 	YY_BREAK
 case 6:
 YY_RULE_SETUP
-#line 121 "engines/director/lingo/lingo-lex.l"
+#line 123 "engines/director/lingo/lingo-lex.l"
 { count(); return tAFTER; }		// D3
 	YY_BREAK
 case 7:
 YY_RULE_SETUP
-#line 122 "engines/director/lingo/lingo-lex.l"
+#line 124 "engines/director/lingo/lingo-lex.l"
 { count(); return tAND; }
 	YY_BREAK
 case 8:
 YY_RULE_SETUP
-#line 123 "engines/director/lingo/lingo-lex.l"
+#line 125 "engines/director/lingo/lingo-lex.l"
 { count(); return tBEFORE; }	// D3
 	YY_BREAK
 case 9:
 YY_RULE_SETUP
-#line 124 "engines/director/lingo/lingo-lex.l"
+#line 126 "engines/director/lingo/lingo-lex.l"
 { count(); return tCAST; }
 	YY_BREAK
 case 10:
 YY_RULE_SETUP
-#line 125 "engines/director/lingo/lingo-lex.l"
+#line 127 "engines/director/lingo/lingo-lex.l"
 { count(); return tCHAR; }		// D3
 	YY_BREAK
 case 11:
 YY_RULE_SETUP
-#line 126 "engines/director/lingo/lingo-lex.l"
+#line 128 "engines/director/lingo/lingo-lex.l"
 { count(); return tCHARS; }
 	YY_BREAK
 case 12:
 YY_RULE_SETUP
-#line 127 "engines/director/lingo/lingo-lex.l"
+#line 129 "engines/director/lingo/lingo-lex.l"
 { count(); return tCONTAINS; }
 	YY_BREAK
 case 13:
 YY_RULE_SETUP
-#line 128 "engines/director/lingo/lingo-lex.l"
+#line 130 "engines/director/lingo/lingo-lex.l"
 { count(); return tDATE; }
 	YY_BREAK
 case 14:
 YY_RULE_SETUP
-#line 129 "engines/director/lingo/lingo-lex.l"
+#line 131 "engines/director/lingo/lingo-lex.l"
 { count(); return tDELETE; }
 	YY_BREAK
 case 15:
 YY_RULE_SETUP
-#line 130 "engines/director/lingo/lingo-lex.l"
+#line 132 "engines/director/lingo/lingo-lex.l"
 { count(); return tDOWN; }
 	YY_BREAK
 case 16:
 YY_RULE_SETUP
-#line 131 "engines/director/lingo/lingo-lex.l"
+#line 133 "engines/director/lingo/lingo-lex.l"
 { count(); return tELSE; }
 	YY_BREAK
 case 17:
 YY_RULE_SETUP
-#line 132 "engines/director/lingo/lingo-lex.l"
+#line 134 "engines/director/lingo/lingo-lex.l"
 {
 		count();
 
@@ -1168,312 +1196,333 @@ YY_RULE_SETUP
 	YY_BREAK
 case 18:
 YY_RULE_SETUP
-#line 150 "engines/director/lingo/lingo-lex.l"
+#line 152 "engines/director/lingo/lingo-lex.l"
 { count(); return tEXIT; }
 	YY_BREAK
 case 19:
 YY_RULE_SETUP
-#line 151 "engines/director/lingo/lingo-lex.l"
+#line 153 "engines/director/lingo/lingo-lex.l"
 { count(); return tFACTORY; }
 	YY_BREAK
 case 20:
 YY_RULE_SETUP
-#line 152 "engines/director/lingo/lingo-lex.l"
+#line 154 "engines/director/lingo/lingo-lex.l"
 { count(); return tFIELD; }
 	YY_BREAK
 case 21:
 YY_RULE_SETUP
-#line 153 "engines/director/lingo/lingo-lex.l"
+#line 155 "engines/director/lingo/lingo-lex.l"
 { count(); return tFRAME; }
 	YY_BREAK
 case 22:
 YY_RULE_SETUP
-#line 154 "engines/director/lingo/lingo-lex.l"
+#line 156 "engines/director/lingo/lingo-lex.l"
 { count(); return tGLOBAL; }
 	YY_BREAK
 case 23:
 YY_RULE_SETUP
-#line 155 "engines/director/lingo/lingo-lex.l"
+#line 157 "engines/director/lingo/lingo-lex.l"
 { count(); return tGO; }
 	YY_BREAK
 case 24:
 YY_RULE_SETUP
-#line 156 "engines/director/lingo/lingo-lex.l"
+#line 158 "engines/director/lingo/lingo-lex.l"
 { count(); return tHILITE; }
 	YY_BREAK
 case 25:
 YY_RULE_SETUP
-#line 157 "engines/director/lingo/lingo-lex.l"
+#line 159 "engines/director/lingo/lingo-lex.l"
 { count(); return tIF; }
 	YY_BREAK
 case 26:
 YY_RULE_SETUP
-#line 158 "engines/director/lingo/lingo-lex.l"
+#line 160 "engines/director/lingo/lingo-lex.l"
 { count(); return tINSTANCE; }
 	YY_BREAK
 case 27:
 YY_RULE_SETUP
-#line 159 "engines/director/lingo/lingo-lex.l"
+#line 161 "engines/director/lingo/lingo-lex.l"
 { count(); return tINTERSECTS;}
 	YY_BREAK
 case 28:
 YY_RULE_SETUP
-#line 160 "engines/director/lingo/lingo-lex.l"
+#line 162 "engines/director/lingo/lingo-lex.l"
 { count(); return tINTO; }
 	YY_BREAK
 case 29:
 YY_RULE_SETUP
-#line 161 "engines/director/lingo/lingo-lex.l"
+#line 163 "engines/director/lingo/lingo-lex.l"
 { count(); return tIN; }
 	YY_BREAK
 case 30:
 YY_RULE_SETUP
-#line 162 "engines/director/lingo/lingo-lex.l"
+#line 164 "engines/director/lingo/lingo-lex.l"
 { count(); return tITEM; }
 	YY_BREAK
 case 31:
 YY_RULE_SETUP
-#line 163 "engines/director/lingo/lingo-lex.l"
+#line 165 "engines/director/lingo/lingo-lex.l"
 { count(); return tITEMS; }
 	YY_BREAK
 case 32:
 YY_RULE_SETUP
-#line 164 "engines/director/lingo/lingo-lex.l"
+#line 166 "engines/director/lingo/lingo-lex.l"
 { count(); return tLAST; }
 	YY_BREAK
 case 33:
 YY_RULE_SETUP
-#line 165 "engines/director/lingo/lingo-lex.l"
+#line 167 "engines/director/lingo/lingo-lex.l"
 { count(); return tLINE; }
 	YY_BREAK
 case 34:
 YY_RULE_SETUP
-#line 166 "engines/director/lingo/lingo-lex.l"
+#line 168 "engines/director/lingo/lingo-lex.l"
 { count(); return tLINES; }
 	YY_BREAK
 case 35:
 YY_RULE_SETUP
-#line 167 "engines/director/lingo/lingo-lex.l"
+#line 169 "engines/director/lingo/lingo-lex.l"
 { count(); return tLONG; }
 	YY_BREAK
 case 36:
 YY_RULE_SETUP
-#line 168 "engines/director/lingo/lingo-lex.l"
+#line 170 "engines/director/lingo/lingo-lex.l"
 { count(); return tMACRO; }
 	YY_BREAK
 case 37:
 YY_RULE_SETUP
-#line 169 "engines/director/lingo/lingo-lex.l"
+#line 171 "engines/director/lingo/lingo-lex.l"
 { count(); return tMENU; }
 	YY_BREAK
 case 38:
 YY_RULE_SETUP
-#line 170 "engines/director/lingo/lingo-lex.l"
+#line 172 "engines/director/lingo/lingo-lex.l"
 { count(); return tMENUITEM;}
 	YY_BREAK
 case 39:
 YY_RULE_SETUP
-#line 171 "engines/director/lingo/lingo-lex.l"
+#line 173 "engines/director/lingo/lingo-lex.l"
 { count(); return tMENUITEMS; }
 	YY_BREAK
 case 40:
 YY_RULE_SETUP
-#line 172 "engines/director/lingo/lingo-lex.l"
+#line 174 "engines/director/lingo/lingo-lex.l"
 { count(); return tMETHOD; }
 	YY_BREAK
 case 41:
 YY_RULE_SETUP
-#line 173 "engines/director/lingo/lingo-lex.l"
+#line 175 "engines/director/lingo/lingo-lex.l"
 { count(); return tMOD;}
 	YY_BREAK
 case 42:
 YY_RULE_SETUP
-#line 174 "engines/director/lingo/lingo-lex.l"
+#line 176 "engines/director/lingo/lingo-lex.l"
 { count(); return tMOVIE; }
 	YY_BREAK
 case 43:
 YY_RULE_SETUP
-#line 175 "engines/director/lingo/lingo-lex.l"
+#line 177 "engines/director/lingo/lingo-lex.l"
 { count(); return tNEXT; }
 	YY_BREAK
 case 44:
 YY_RULE_SETUP
-#line 176 "engines/director/lingo/lingo-lex.l"
+#line 178 "engines/director/lingo/lingo-lex.l"
 { count(); return tNOT; }
 	YY_BREAK
 case 45:
 YY_RULE_SETUP
-#line 177 "engines/director/lingo/lingo-lex.l"
+#line 179 "engines/director/lingo/lingo-lex.l"
 { count(); return tNUMBER; }
 	YY_BREAK
 case 46:
 YY_RULE_SETUP
-#line 178 "engines/director/lingo/lingo-lex.l"
+#line 180 "engines/director/lingo/lingo-lex.l"
 { count(); return tOF; }
 	YY_BREAK
 case 47:
 YY_RULE_SETUP
-#line 179 "engines/director/lingo/lingo-lex.l"
+#line 181 "engines/director/lingo/lingo-lex.l"
 { count(); return tON; }		// D3
 	YY_BREAK
 case 48:
 YY_RULE_SETUP
-#line 180 "engines/director/lingo/lingo-lex.l"
+#line 182 "engines/director/lingo/lingo-lex.l"
 { count(); return tOPEN; }
 	YY_BREAK
 case 49:
 YY_RULE_SETUP
-#line 181 "engines/director/lingo/lingo-lex.l"
+#line 183 "engines/director/lingo/lingo-lex.l"
 { count(); return tOR; }
 	YY_BREAK
 case 50:
 YY_RULE_SETUP
-#line 182 "engines/director/lingo/lingo-lex.l"
+#line 184 "engines/director/lingo/lingo-lex.l"
 { count(); return tPLAY; }
 	YY_BREAK
 case 51:
 YY_RULE_SETUP
-#line 183 "engines/director/lingo/lingo-lex.l"
+#line 185 "engines/director/lingo/lingo-lex.l"
 { count(); return tPREVIOUS; }
 	YY_BREAK
 case 52:
 YY_RULE_SETUP
-#line 184 "engines/director/lingo/lingo-lex.l"
+#line 186 "engines/director/lingo/lingo-lex.l"
 { count(); return tPROPERTY; }	// D4
 	YY_BREAK
 case 53:
 YY_RULE_SETUP
-#line 185 "engines/director/lingo/lingo-lex.l"
+#line 187 "engines/director/lingo/lingo-lex.l"
 { count(); return tPUT; }
 	YY_BREAK
 case 54:
 YY_RULE_SETUP
-#line 186 "engines/director/lingo/lingo-lex.l"
+#line 188 "engines/director/lingo/lingo-lex.l"
 { count(); return tREPEAT; }
 	YY_BREAK
 case 55:
 YY_RULE_SETUP
-#line 187 "engines/director/lingo/lingo-lex.l"
+#line 189 "engines/director/lingo/lingo-lex.l"
 { count(); return tSCRIPT; }
 	YY_BREAK
 case 56:
 YY_RULE_SETUP
-#line 188 "engines/director/lingo/lingo-lex.l"
+#line 190 "engines/director/lingo/lingo-lex.l"
 { count(); return tASSERTERROR; }
 	YY_BREAK
 case 57:
 YY_RULE_SETUP
-#line 189 "engines/director/lingo/lingo-lex.l"
+#line 191 "engines/director/lingo/lingo-lex.l"
 { count(); return tSET; }
 	YY_BREAK
 case 58:
 YY_RULE_SETUP
-#line 190 "engines/director/lingo/lingo-lex.l"
+#line 192 "engines/director/lingo/lingo-lex.l"
 { count(); return tSHORT; }
 	YY_BREAK
 case 59:
 YY_RULE_SETUP
-#line 191 "engines/director/lingo/lingo-lex.l"
+#line 193 "engines/director/lingo/lingo-lex.l"
 { count(); return tSOUND; }
 	YY_BREAK
 case 60:
 YY_RULE_SETUP
-#line 192 "engines/director/lingo/lingo-lex.l"
+#line 194 "engines/director/lingo/lingo-lex.l"
 { count(); return tSPRITE; }
 	YY_BREAK
 case 61:
 YY_RULE_SETUP
-#line 193 "engines/director/lingo/lingo-lex.l"
+#line 195 "engines/director/lingo/lingo-lex.l"
 { count(); return tSTARTS; }
 	YY_BREAK
 case 62:
 YY_RULE_SETUP
-#line 194 "engines/director/lingo/lingo-lex.l"
+#line 196 "engines/director/lingo/lingo-lex.l"
 { count(); return tTELL; }
 	YY_BREAK
 case 63:
 YY_RULE_SETUP
-#line 195 "engines/director/lingo/lingo-lex.l"
+#line 197 "engines/director/lingo/lingo-lex.l"
 { count(); return tTHE; }
 	YY_BREAK
 case 64:
 YY_RULE_SETUP
-#line 196 "engines/director/lingo/lingo-lex.l"
+#line 198 "engines/director/lingo/lingo-lex.l"
 { count(); return tTHEN; }
 	YY_BREAK
 case 65:
 YY_RULE_SETUP
-#line 197 "engines/director/lingo/lingo-lex.l"
+#line 199 "engines/director/lingo/lingo-lex.l"
 { count(); return tTIME; }
 	YY_BREAK
 case 66:
 YY_RULE_SETUP
-#line 198 "engines/director/lingo/lingo-lex.l"
+#line 200 "engines/director/lingo/lingo-lex.l"
 { count(); return tTO; }
 	YY_BREAK
 case 67:
 YY_RULE_SETUP
-#line 199 "engines/director/lingo/lingo-lex.l"
-{ count(); return tWHEN; }
+#line 201 "engines/director/lingo/lingo-lex.l"
+{
+		count();
+
+		const char *ptr =  &yytext[5]; // Skip 'when '
+		while (*ptr == ' ' || *ptr == '\t' || *ptr == '\xC2') ptr++;
+
+		Common::String eventName;
+		while (*ptr != ' ' && *ptr != '\t' && *ptr != '\xC2')
+			eventName += *ptr++;
+
+		while (*ptr == ' ' || *ptr == '\t' || *ptr == '\xC2') ptr++;
+		ptr += 5; // Skip 'then '
+		while (*ptr == ' ' || *ptr == '\t' || *ptr == '\xC2') ptr++;
+
+		Common::String stmt;
+		while (*ptr)
+			stmt += *ptr++;
+
+		yylval.w.eventName = new Common::String(eventName);
+		yylval.w.stmt = new Common::String(stmt);
+		return tWHEN;
+	}
 	YY_BREAK
 case 68:
 YY_RULE_SETUP
-#line 200 "engines/director/lingo/lingo-lex.l"
+#line 223 "engines/director/lingo/lingo-lex.l"
 { count(); return tWHILE; }
 	YY_BREAK
 case 69:
 YY_RULE_SETUP
-#line 201 "engines/director/lingo/lingo-lex.l"
+#line 224 "engines/director/lingo/lingo-lex.l"
 { count(); return tWINDOW; }
 	YY_BREAK
 case 70:
 YY_RULE_SETUP
-#line 202 "engines/director/lingo/lingo-lex.l"
+#line 225 "engines/director/lingo/lingo-lex.l"
 { count(); return tWITH; }
 	YY_BREAK
 case 71:
 YY_RULE_SETUP
-#line 203 "engines/director/lingo/lingo-lex.l"
+#line 226 "engines/director/lingo/lingo-lex.l"
 { count(); return tWITHIN; }
 	YY_BREAK
 case 72:
 YY_RULE_SETUP
-#line 204 "engines/director/lingo/lingo-lex.l"
+#line 227 "engines/director/lingo/lingo-lex.l"
 { count(); return tWORD; }
 	YY_BREAK
 case 73:
 YY_RULE_SETUP
-#line 205 "engines/director/lingo/lingo-lex.l"
+#line 228 "engines/director/lingo/lingo-lex.l"
 { count(); return tWORDS; }
 	YY_BREAK
 case 74:
 YY_RULE_SETUP
-#line 207 "engines/director/lingo/lingo-lex.l"
+#line 230 "engines/director/lingo/lingo-lex.l"
 { count(); return tNEQ; }
 	YY_BREAK
 case 75:
 YY_RULE_SETUP
-#line 208 "engines/director/lingo/lingo-lex.l"
+#line 231 "engines/director/lingo/lingo-lex.l"
 { count(); return tGE; }
 	YY_BREAK
 case 76:
 YY_RULE_SETUP
-#line 209 "engines/director/lingo/lingo-lex.l"
+#line 232 "engines/director/lingo/lingo-lex.l"
 { count(); return tLE; }
 	YY_BREAK
 case 77:
 YY_RULE_SETUP
-#line 210 "engines/director/lingo/lingo-lex.l"
+#line 233 "engines/director/lingo/lingo-lex.l"
 { count(); return tCONCAT; }
 	YY_BREAK
 case 78:
 YY_RULE_SETUP
-#line 211 "engines/director/lingo/lingo-lex.l"
+#line 234 "engines/director/lingo/lingo-lex.l"
 { count(); return tEQ; }
 	YY_BREAK
 case 79:
 YY_RULE_SETUP
-#line 213 "engines/director/lingo/lingo-lex.l"
+#line 236 "engines/director/lingo/lingo-lex.l"
 {
 		count();
 		yylval.s = new Common::String(yytext);
@@ -1483,41 +1532,41 @@ YY_RULE_SETUP
 	YY_BREAK
 case 80:
 YY_RULE_SETUP
-#line 219 "engines/director/lingo/lingo-lex.l"
+#line 242 "engines/director/lingo/lingo-lex.l"
 { count(); yylval.f = atof(yytext); return tFLOAT; }
 	YY_BREAK
 case 81:
 YY_RULE_SETUP
-#line 220 "engines/director/lingo/lingo-lex.l"
+#line 243 "engines/director/lingo/lingo-lex.l"
 { count(); yylval.i = strtol(yytext, NULL, 10); return tINT; }
 	YY_BREAK
 case 82:
 YY_RULE_SETUP
-#line 221 "engines/director/lingo/lingo-lex.l"
+#line 244 "engines/director/lingo/lingo-lex.l"
 { count(); return *yytext; }
 	YY_BREAK
 case 83:
 /* rule 83 can match eol */
 YY_RULE_SETUP
-#line 222 "engines/director/lingo/lingo-lex.l"
+#line 245 "engines/director/lingo/lingo-lex.l"
 { count(); return '\n'; }
 	YY_BREAK
 case 84:
 YY_RULE_SETUP
-#line 223 "engines/director/lingo/lingo-lex.l"
+#line 246 "engines/director/lingo/lingo-lex.l"
 { count(); yylval.s = cleanupString(&yytext[1]); yylval.s->deleteLastChar(); return tSTRING; }
 	YY_BREAK
 case 85:
 YY_RULE_SETUP
-#line 224 "engines/director/lingo/lingo-lex.l"
+#line 247 "engines/director/lingo/lingo-lex.l"
 { count(); }
 	YY_BREAK
 case 86:
 YY_RULE_SETUP
-#line 226 "engines/director/lingo/lingo-lex.l"
+#line 249 "engines/director/lingo/lingo-lex.l"
 ECHO;
 	YY_BREAK
-#line 1520 "engines/director/lingo/lingo-lex.cpp"
+#line 1569 "engines/director/lingo/lingo-lex.cpp"
 case YY_STATE_EOF(INITIAL):
 	yyterminate();
 
@@ -1816,7 +1865,7 @@ static int yy_get_next_buffer (void)
 		while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
 			{
 			yy_current_state = (int) yy_def[yy_current_state];
-			if ( yy_current_state >= 306 )
+			if ( yy_current_state >= 342 )
 				yy_c = yy_meta[yy_c];
 			}
 		yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
@@ -1844,11 +1893,11 @@ static int yy_get_next_buffer (void)
 	while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
 		{
 		yy_current_state = (int) yy_def[yy_current_state];
-		if ( yy_current_state >= 306 )
+		if ( yy_current_state >= 342 )
 			yy_c = yy_meta[yy_c];
 		}
 	yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
-	yy_is_jam = (yy_current_state == 305);
+	yy_is_jam = (yy_current_state == 341);
 
 		return yy_is_jam ? 0 : yy_current_state;
 }
@@ -2489,7 +2538,7 @@ void yyfree (void * ptr )
 
 #define YYTABLES_NAME "yytables"
 
-#line 226 "engines/director/lingo/lingo-lex.l"
+#line 249 "engines/director/lingo/lingo-lex.l"
 
 
 extern int yydebug;
diff --git a/engines/director/lingo/lingo-lex.l b/engines/director/lingo/lingo-lex.l
index d6803765c8..b0cb1edeed 100644
--- a/engines/director/lingo/lingo-lex.l
+++ b/engines/director/lingo/lingo-lex.l
@@ -108,6 +108,8 @@ conststring \"[^\"\r\n]*\"
 operator [-+*/%^:,()><&\[\]]
 newline [ \t\xC2]*[\n\r]
 spc [ \t\xC2]
+eventname (keyDown|keyUp|mouseDown|mouseUp|timeOut)
+unparsedstmt [^\r\n]*
 
 %%
 
@@ -196,7 +198,28 @@ the			{ count(); return tTHE; }
 then		{ count(); return tTHEN; }
 time		{ count(); return tTIME; }
 to			{ count(); return tTO; }
-when		{ count(); return tWHEN; }
+when{spc}+{eventname}{spc}+then{spc}+{unparsedstmt}	{
+		count();
+
+		const char *ptr =  &yytext[5]; // Skip 'when '
+		while (*ptr == ' ' || *ptr == '\t' || *ptr == '\xC2') ptr++;
+
+		Common::String eventName;
+		while (*ptr != ' ' && *ptr != '\t' && *ptr != '\xC2')
+			eventName += *ptr++;
+
+		while (*ptr == ' ' || *ptr == '\t' || *ptr == '\xC2') ptr++;
+		ptr += 5; // Skip 'then '
+		while (*ptr == ' ' || *ptr == '\t' || *ptr == '\xC2') ptr++;
+
+		Common::String stmt;
+		while (*ptr)
+			stmt += *ptr++;
+
+		yylval.w.eventName = new Common::String(eventName);
+		yylval.w.stmt = new Common::String(stmt);
+		return tWHEN;
+	}
 while		{ count(); return tWHILE; }
 window		{ count(); return tWINDOW; }
 with		{ count(); return tWITH; }
diff --git a/engines/director/lingo/lingo-preprocessor.cpp b/engines/director/lingo/lingo-preprocessor.cpp
index bdba2df9d5..60f34df296 100644
--- a/engines/director/lingo/lingo-preprocessor.cpp
+++ b/engines/director/lingo/lingo-preprocessor.cpp
@@ -26,8 +26,6 @@
 
 namespace Director {
 
-Common::String preprocessWhen(Common::String in, bool *changed);
-
 bool isspec(char c) {
 	return strchr("-+*/%%^:,()><&[]=", c) != NULL;
 }
@@ -62,34 +60,6 @@ static Common::String nexttok(const char *s, const char **newP = nullptr) {
 	return res;
 }
 
-static const char *findtokstart(const char *start, const char *token) {
-	// First, determine, if we sit inside of a string
-	//
-	// Since we do not have escaping characters, simple count is enough
-	int numquotes = 0;
-	const char *ptr = start;
-
-	while (*ptr && ptr <= token) {
-		if (*ptr == '"')
-			numquotes++;
-		ptr++;
-	}
-
-	// We're inside of quote. Scan backwards
-	if (numquotes % 2) {
-		while (*ptr != '"')
-			ptr--;
-
-		return ptr;
-	}
-
-	// If we're in the middle of a word
-	while (ptr > start && Common::isAlnum(*(ptr - 1)))
-		ptr--;
-
-	return ptr;
-}
-
 Common::String LingoCompiler::codePreprocessor(const char *s, LingoArchive *archive, ScriptType type, CastMemberID id, bool simple) {
 	Common::String res;
 
@@ -202,9 +172,6 @@ Common::String LingoCompiler::codePreprocessor(const char *s, LingoArchive *arch
 
 		res1 = patchLingoCode(res1, archive, type, id, linenumber);
 
-		bool changed = false;
-		res1 = preprocessWhen(res1, &changed);
-
 		res += res1;
 
 		linenumber++;	// We do it here because of 'continue' statements
@@ -221,74 +188,4 @@ Common::String LingoCompiler::codePreprocessor(const char *s, LingoArchive *arch
 	return res;
 }
 
-// when ID then statement -> when ID then "statement"
-Common::String preprocessWhen(Common::String in, bool *changed) {
-	Common::String res, next;
-	const char *ptr = in.c_str();
-	const char *beg = ptr;
-	const char *nextPtr;
-
-	while ((ptr = scumm_strcasestr(beg, "when")) != NULL) {
-		if (ptr != findtokstart(in.c_str(), ptr)) { // If we're in the middle of a word
-			res += *beg++;
-			continue;
-		}
-
-		ptr += 4; // end of 'play'
-		res += Common::String(beg, ptr);
-
-		if (!*ptr)	// If it is end of the line
-			break;
-
-		if (Common::isAlnum(*ptr)) { // If it is in the middle of the word
-			beg = ptr;
-			continue;
-		}
-
-		*changed = true;
-
-		res += ' ';
-		next = nexttok(ptr, &nextPtr);	// ID
-		res += next;
-
-		res += ' ';
-		next = nexttok(nextPtr, &nextPtr);	// then
-		res += next;
-
-		res += ' ';
-		res += '"';
-
-		// now we need to preprocess quotes
-		bool skipQuote = false;
-		while (*nextPtr) {
-			if (*nextPtr == '"') {
-				res += "\" & QUOTE ";
-
-				if (*(nextPtr + 1))
-					res += "& \"";
-				else
-					skipQuote = true;	// we do not want the last quote
-			} else {
-				res += *nextPtr;
-			}
-
-			nextPtr++;
-		}
-
-		if (!skipQuote)
-			res += '"';
-
-		beg = nextPtr;
-
-		break;
-	}
-
-	res += Common::String(beg);
-
-	if (in.size() != res.size())
-		debugC(2, kDebugParse | kDebugPreprocess, "WHEN: in: %s\nout: %s", in.c_str(), res.c_str());
-
-	return res;
-}
-
 } // End of namespace Director


Commit: 564c4945ca00c2796c91a72fbddb015999760c87
    https://github.com/scummvm/scummvm/commit/564c4945ca00c2796c91a72fbddb015999760c87
Author: djsrv (dservilla at gmail.com)
Date: 2021-07-15T16:31:47-04:00

Commit Message:
DIRECTOR: LINGO: Remove parseMenu

We parse menus in b_installMenu.

Changed paths:
    engines/director/lingo/lingo-codegen.cpp
    engines/director/lingo/lingo-codegen.h


diff --git a/engines/director/lingo/lingo-codegen.cpp b/engines/director/lingo/lingo-codegen.cpp
index 33e0778ced..a680c0f3be 100644
--- a/engines/director/lingo/lingo-codegen.cpp
+++ b/engines/director/lingo/lingo-codegen.cpp
@@ -110,13 +110,6 @@ ScriptContext *LingoCompiler::compileLingo(const char *code, LingoArchive *archi
 	_linenumber = _colnumber = 1;
 	_hadError = false;
 
-	if (!strncmp(code, "menu:", 5) || scumm_strcasestr(code, "\nmenu:")) {
-		debugC(1, kDebugCompile, "Parsing menu");
-		parseMenu(code);
-
-		return nullptr;
-	}
-
 	// Preprocess the code for ease of the parser
 	Common::String codeNorm = codePreprocessor(code, archive, type, id);
 	code = codeNorm.c_str();
@@ -383,10 +376,6 @@ void LingoCompiler::updateLoopJumps(uint nextTargetPos, uint exitTargetPos) {
 	}
 }
 
-void LingoCompiler::parseMenu(const char *code) {
-	warning("STUB: parseMenu");
-}
-
 /* ScriptNode */
 
 bool LingoCompiler::visitScriptNode(ScriptNode *node) {
diff --git a/engines/director/lingo/lingo-codegen.h b/engines/director/lingo/lingo-codegen.h
index 251e08951f..e63be4a538 100644
--- a/engines/director/lingo/lingo-codegen.h
+++ b/engines/director/lingo/lingo-codegen.h
@@ -126,7 +126,6 @@ public:
 
 private:
 	int parse(const char *code);
-	void parseMenu(const char *code);
 
 public:
 	// lingo-preprocessor.cpp


Commit: 88ea6e164599d873180524848c461564bf9efea8
    https://github.com/scummvm/scummvm/commit/88ea6e164599d873180524848c461564bf9efea8
Author: djsrv (dservilla at gmail.com)
Date: 2021-07-15T16:31:47-04:00

Commit Message:
DIRECTOR: Re-encode loaded text to UTF-8

Changed paths:
    engines/director/cast.cpp
    engines/director/lingo/lingo-builtins.cpp
    engines/director/lingo/lingo-codegen.cpp
    engines/director/lingo/lingo-codegen.h
    engines/director/lingo/lingo-events.cpp
    engines/director/lingo/lingo-lex.cpp
    engines/director/lingo/lingo-lex.l
    engines/director/lingo/lingo-object.cpp
    engines/director/lingo/lingo-patcher.cpp
    engines/director/lingo/lingo-preprocessor.cpp
    engines/director/lingo/lingo.cpp
    engines/director/lingo/lingo.h
    engines/director/movie.cpp
    engines/director/resource.cpp
    engines/director/score.cpp
    engines/director/types.h


diff --git a/engines/director/cast.cpp b/engines/director/cast.cpp
index 951bfb5ff8..e032e7afe2 100644
--- a/engines/director/cast.cpp
+++ b/engines/director/cast.cpp
@@ -1065,17 +1065,7 @@ void Cast::loadScriptText(Common::SeekableReadStreamEndian &stream, uint16 id) {
 	/*uint32 unk1 = */ stream.readUint32();
 	uint32 strLen = stream.readUint32();
 	/*uin32 dataLen = */ stream.readUint32();
-	Common::String script;
-
-	for (uint32 i = 0; i < strLen; i++) {
-		byte ch = stream.readByte();
-
-		// Convert Mac line endings
-		if (ch == 0x0d)
-			ch = '\n';
-
-		script += ch;
-	}
+	Common::String script = stream.readString(0, strLen);
 
 	// Check if this is a script. It must start with a comment.
 	// See D2 Interactivity Manual pp.46-47 (Ch.2.11. Using a macro)
@@ -1088,7 +1078,7 @@ void Cast::loadScriptText(Common::SeekableReadStreamEndian &stream, uint16 id) {
 	if (script.contains("\nmenu:") || script.hasPrefix("menu:"))
 		return;
 
-	_lingoArchive->addCode(script.c_str(), kMovieScript, id);
+	_lingoArchive->addCode(script.decode(Common::kMacRoman), kMovieScript, id);
 }
 
 void Cast::dumpScript(const char *script, ScriptType type, uint16 id) {
@@ -1191,7 +1181,7 @@ void Cast::loadCastInfo(Common::SeekableReadStreamEndian &stream, uint16 id) {
 			if (ConfMan.getBool("dump_scripts"))
 				dumpScript(ci->script.c_str(), scriptType, id);
 
-			_lingoArchive->addCode(ci->script.c_str(), scriptType, id, ci->name.c_str());
+			_lingoArchive->addCode(ci->script, scriptType, id, ci->name.c_str());
 		}
 	}
 
diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index b1170e78a8..bb02682b5f 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -535,7 +535,7 @@ void LB::b_value(int nargs) {
 	}
 	Common::String code = "scummvm_returnNumber " + expr;
 	// Compile the code to an anonymous function and call it
-	ScriptContext *sc = g_lingo->_compiler->compileAnonymous(code.c_str());
+	ScriptContext *sc = g_lingo->_compiler->compileAnonymous(code);
 	Symbol sym = sc->_eventHandlers[kEventGeneric];
 	LC::call(sym, 0, true);
 }
@@ -1658,7 +1658,8 @@ void LB::b_installMenu(int nargs) {
 	}
 	TextCastMember *field = static_cast<TextCastMember *>(member);
 
-	Common::String menuStxt = g_lingo->_compiler->codePreprocessor(field->getText().encode(Common::kMacRoman).c_str(), field->getCast()->_lingoArchive, kNoneScript, memberID, true); // FIXME: Properly handle encoding
+	// TODO: We should process the U32String instead of encoding it to Mac Roman first
+	Common::String menuStxt = g_lingo->_compiler->codePreprocessor(field->getText(), field->getCast()->_lingoArchive, kNoneScript, memberID, true).encode(Common::kMacRoman);
 	Common::String line;
 	int linenum = -1; // We increment it before processing
 
@@ -1738,7 +1739,7 @@ void LB::b_installMenu(int nargs) {
 				while (mainArchive->getScriptContext(kEventScript, commandId)) {
 					commandId++;
 				}
-				mainArchive->addCode(command.c_str(), kEventScript, commandId);
+				mainArchive->addCode(command.decode(Common::kMacRoman), kEventScript, commandId);
 				submenuText += Common::String::format("[%d];", commandId);
 			} else {
 				submenuText += ';';
diff --git a/engines/director/lingo/lingo-codegen.cpp b/engines/director/lingo/lingo-codegen.cpp
index a680c0f3be..d6cf341f35 100644
--- a/engines/director/lingo/lingo-codegen.cpp
+++ b/engines/director/lingo/lingo-codegen.cpp
@@ -93,14 +93,14 @@ LingoCompiler::LingoCompiler() {
 	_hadError = false;
 }
 
-ScriptContext *LingoCompiler::compileAnonymous(const char *code) {
+ScriptContext *LingoCompiler::compileAnonymous(const Common::U32String &code) {
 	debugC(1, kDebugCompile, "Compiling anonymous lingo\n"
-			"***********\n%s\n\n***********", code);
+			"***********\n%s\n\n***********", code.encode().c_str());
 
 	return compileLingo(code, nullptr, kNoneScript, CastMemberID(0, 0), "[anonymous]", true);
 }
 
-ScriptContext *LingoCompiler::compileLingo(const char *code, LingoArchive *archive, ScriptType type, CastMemberID id, const Common::String &scriptName, bool anonymous) {
+ScriptContext *LingoCompiler::compileLingo(const Common::U32String &code, LingoArchive *archive, ScriptType type, CastMemberID id, const Common::String &scriptName, bool anonymous) {
 	_assemblyArchive = archive;
 	_assemblyAST = nullptr;
 	ScriptContext *mainContext = _assemblyContext = new ScriptContext(scriptName, archive, type, id.member);
@@ -111,11 +111,11 @@ ScriptContext *LingoCompiler::compileLingo(const char *code, LingoArchive *archi
 	_hadError = false;
 
 	// Preprocess the code for ease of the parser
-	Common::String codeNorm = codePreprocessor(code, archive, type, id);
-	code = codeNorm.c_str();
+	Common::String codeNorm = codePreprocessor(code, archive, type, id).encode(Common::kUtf8);
+	const char *utf8Code = codeNorm.c_str();
 
 	// Parse the Lingo and build an AST
-	parse(code);
+	parse(utf8Code);
 	if (!_assemblyAST) {
 		delete _assemblyContext;
 		delete _currentAssembly;
diff --git a/engines/director/lingo/lingo-codegen.h b/engines/director/lingo/lingo-codegen.h
index e63be4a538..cb76dcf22b 100644
--- a/engines/director/lingo/lingo-codegen.h
+++ b/engines/director/lingo/lingo-codegen.h
@@ -34,8 +34,8 @@ public:
 	LingoCompiler();
 	virtual ~LingoCompiler() {}
 
-	ScriptContext *compileAnonymous(const char *code);
-	ScriptContext *compileLingo(const char *code, LingoArchive *archive, ScriptType type, CastMemberID id, const Common::String &scriptName, bool anonyomous = false);
+	ScriptContext *compileAnonymous(const Common::U32String &code);
+	ScriptContext *compileLingo(const Common::U32String &code, LingoArchive *archive, ScriptType type, CastMemberID id, const Common::String &scriptName, bool anonyomous = false);
 	ScriptContext *compileLingoV4(Common::SeekableReadStreamEndian &stream, LingoArchive *archive, const Common::String &archName, uint16 version);
 
 	int code1(inst code) { _currentAssembly->push_back(code); return _currentAssembly->size() - 1; }
@@ -129,10 +129,10 @@ private:
 
 public:
 	// lingo-preprocessor.cpp
-	Common::String codePreprocessor(const char *s, LingoArchive *archive, ScriptType type, CastMemberID id, bool simple = false);
+	Common::U32String codePreprocessor(const Common::U32String &code, LingoArchive *archive, ScriptType type, CastMemberID id, bool simple = false);
 
 	// lingo-patcher.cpp
-	Common::String patchLingoCode(Common::String &line, LingoArchive *archive, ScriptType type, CastMemberID id, int linenumber);
+	Common::U32String patchLingoCode(const Common::U32String &line, LingoArchive *archive, ScriptType type, CastMemberID id, int linenumber);
 };
 
 } // End of namespace Director
diff --git a/engines/director/lingo/lingo-events.cpp b/engines/director/lingo/lingo-events.cpp
index b2088a3a22..9c95044703 100644
--- a/engines/director/lingo/lingo-events.cpp
+++ b/engines/director/lingo/lingo-events.cpp
@@ -109,7 +109,7 @@ void Movie::setPrimaryEventHandler(LEvent event, const Common::String &code) {
 	debugC(3, kDebugLingoExec, "setting primary event handler (%s)", _lingo->_eventHandlerTypes[event]);
 	LingoArchive *mainArchive = getMainLingoArch();
 	mainArchive->primaryEventHandlers[event] = code;
-	mainArchive->addCode(code.c_str(), kEventScript, event);
+	mainArchive->addCode(code, kEventScript, event);
 }
 
 void Movie::queueSpriteEvent(LEvent event, int eventId, int spriteId) {
diff --git a/engines/director/lingo/lingo-lex.cpp b/engines/director/lingo/lingo-lex.cpp
index 720ab736bd..5fbccfd404 100644
--- a/engines/director/lingo/lingo-lex.cpp
+++ b/engines/director/lingo/lingo-lex.cpp
@@ -364,45 +364,46 @@ struct yy_trans_info
 	flex_int32_t yy_verify;
 	flex_int32_t yy_nxt;
 	};
-static const flex_int16_t yy_accept[342] =
+static const flex_int16_t yy_accept[352] =
     {   0,
         0,    0,   87,   85,    1,   83,   83,   85,   85,   82,
        82,   81,   82,   78,   82,   79,   79,   79,   79,   79,
        79,   79,   79,   79,   79,   79,   79,   79,   79,   79,
-       79,   79,   79,   79,    1,   79,    1,   83,    0,   84,
-        2,   77,   80,   81,   76,   74,   75,   79,   79,   79,
+       79,   79,   79,   79,   85,    1,   79,   85,    1,   83,
+        0,    0,   84,    2,   77,   80,   81,   76,   74,   75,
        79,   79,   79,   79,   79,   79,   79,   79,   79,   79,
-       79,   79,   79,   79,   79,   79,   25,   29,   79,   79,
-       79,   79,   79,   79,   79,   79,   79,   79,   46,   47,
-       79,   49,   79,   79,   79,   79,   79,   79,   79,   79,
-       79,   79,   79,   79,   79,   66,   79,   79,   79,    1,
-
-        0,   79,    2,   80,   79,   79,    7,   79,   79,   79,
-       79,   79,   79,   79,   79,   17,   79,   79,   79,   79,
-       23,   79,   79,   79,   79,   79,   79,   79,   79,   79,
-       79,   41,   79,   79,   44,   79,   79,   79,   79,   79,
-       53,   79,   79,   79,   57,   79,   79,   79,   79,   79,
-       63,   79,   79,   79,   79,   79,   79,    0,   79,    5,
-       79,   79,    9,   10,   79,   13,   79,   15,   16,    0,
-       18,   79,   79,   79,    0,   79,   79,   79,   28,   30,
-       32,   33,   35,   79,   37,   79,   79,   43,   79,   48,
-       50,   79,   79,   79,   79,   79,   79,   79,   79,   79,
-
-       62,   64,   65,   79,   79,   79,   70,   72,    0,   79,
-       79,    6,   79,   11,   79,   79,   17,   20,   21,   79,
-       23,   79,   79,   79,   31,   34,   36,   79,   79,   42,
-       79,   79,   79,   79,   79,   79,   58,   59,   79,   79,
-        0,   68,   79,   79,   73,    0,   79,    4,    8,   79,
-       14,   17,   22,   24,   79,   79,   79,   40,   45,   79,
-       79,   54,   55,   79,   60,   61,    0,    0,    0,   69,
-       71,    0,   79,   79,   79,   79,   79,   79,   79,   79,
-       79,    0,    0,    0,    0,   19,   79,   12,   26,   79,
-       38,   51,   52,   79,    0,    0,    0,   19,   79,   79,
-
-       39,   79,    0,    0,    0,    0,   79,   27,   79,    0,
-        0,    0,    0,    3,   79,    0,    0,    0,    0,    0,
-       79,    0,    0,    0,    0,    0,   79,    0,    0,   79,
-        0,    0,   79,    0,   79,   67,   79,   67,   67,   56,
+       79,   79,   79,   79,   79,   79,   79,   79,   79,   25,
+       29,   79,   79,   79,   79,   79,   79,   79,   79,   79,
+       79,   46,   47,   79,   49,   79,   79,   79,   79,   79,
+       79,   79,   79,   79,   79,   79,   79,   79,   66,   79,
+
+       79,   79,    1,    0,    0,   79,    2,   80,   79,   79,
+        7,   79,   79,   79,   79,   79,   79,   79,   79,   17,
+       79,   79,   79,   79,   23,    0,   79,   79,   79,   79,
+       79,   79,   79,   79,   79,   79,   41,   79,   79,   44,
+       79,   79,   79,   79,   79,   53,   79,   79,   79,   57,
+       79,   79,   79,   79,   79,   63,   79,   79,   79,   79,
+       79,   79,    0,   79,    5,   79,   79,    9,   10,   79,
+       13,   79,   15,   16,    0,    0,   18,   79,   79,   79,
+        0,   79,   79,   79,   28,   30,   32,   33,   35,   79,
+       37,   79,   79,   43,   79,   48,   50,   79,   79,   79,
+
+       79,   79,   79,   79,   79,   79,   62,   64,   65,   79,
+       79,   79,   70,   72,    0,   79,   79,    6,   79,   11,
+       79,   79,   17,   20,   21,   79,   23,   79,   79,   79,
+       31,   34,   36,   79,   79,   42,   79,   79,   79,   79,
+       79,   79,   58,   59,   79,   79,    0,    0,   68,   79,
+       79,   73,    0,   79,    4,    8,   79,   14,   17,   22,
+       24,   79,   79,   79,   40,   45,   79,   79,   54,   55,
+       79,   60,   61,    0,    0,    0,   69,   71,    0,   79,
+       79,   79,   79,   79,   79,   79,   79,   79,    0,    0,
+        0,    0,   19,   79,   12,   26,   79,   38,   51,   52,
+
+       79,    0,    0,    0,   19,   79,   79,   39,   79,    0,
+        0,    0,    0,   79,   27,   79,    0,    0,    0,    0,
+        3,   79,    0,    0,    0,    0,    0,    0,   79,    0,
+        0,    0,    0,    0,   79,    0,    0,   79,    0,    0,
+       79,    0,   79,   67,    0,   79,   67,   67,   67,   56,
         0
     } ;
 
@@ -411,24 +412,24 @@ static const YY_CHAR yy_ec[256] =
         1,    1,    1,    1,    1,    1,    1,    1,    2,    3,
         1,    1,    4,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    2,    1,    5,    6,    1,    7,    8,    1,    7,
-        7,    7,    7,    7,    7,    9,    7,   10,   10,   10,
-       10,   10,   10,   10,   10,   10,   10,    7,    1,   11,
-       12,   13,    1,    1,   14,   15,   16,   17,   18,   19,
-       20,   21,   22,   23,   24,   25,   26,   27,   28,   29,
-       23,   30,   31,   32,   33,   34,   35,   36,   37,   23,
-        7,    1,    7,    7,   23,    1,   38,   39,   40,   41,
-
-       42,   43,   44,   45,   46,   23,   47,   48,   49,   50,
-       51,   52,   23,   53,   54,   55,   56,   57,   58,   59,
-       60,   23,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    5,    1,    6,    7,    1,    8,    9,    1,    8,
+        8,    8,    8,    8,    8,   10,    8,   11,   11,   11,
+       11,   11,   11,   11,   11,   11,   11,    8,    1,   12,
+       13,   14,    1,    1,   15,   16,   17,   18,   19,   20,
+       21,   22,   23,   24,   25,   26,   27,   28,   29,   30,
+       24,   31,   32,   33,   34,   35,   36,   37,   38,   24,
+        8,    1,    8,    8,   24,    1,   39,   40,   41,   42,
+
+       43,   44,   45,   46,   47,   24,   48,   49,   50,   51,
+       52,   53,   24,   54,   55,   56,   57,   58,   59,   60,
+       61,   24,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,   62,    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,    2,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,   63,    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,
@@ -438,189 +439,202 @@ static const YY_CHAR yy_ec[256] =
         1,    1,    1,    1,    1
     } ;
 
-static const YY_CHAR yy_meta[61] =
+static const YY_CHAR yy_meta[64] =
     {   0,
-        1,    2,    3,    3,    1,    1,    1,    1,    1,    4,
-        1,    1,    1,    5,    5,    5,    5,    5,    5,    5,
+        1,    2,    3,    3,    2,    1,    1,    1,    1,    1,
+        4,    1,    1,    1,    5,    5,    5,    5,    5,    5,
+        5,    5,    5,    5,    5,    5,    5,    5,    5,    5,
         5,    5,    5,    5,    5,    5,    5,    5,    5,    5,
         5,    5,    5,    5,    5,    5,    5,    5,    5,    5,
         5,    5,    5,    5,    5,    5,    5,    5,    5,    5,
-        5,    5,    5,    5,    5,    5,    5,    5,    5,    5
+        5,    1,    2
     } ;
 
-static const flex_int16_t yy_base[349] =
+static const flex_int16_t yy_base[359] =
     {   0,
-        0,   59,  388,  707,   60,  707,  707,  335,    0,  707,
-      316,   56,   55,  707,  280,   54,   52,   58,   57,   62,
-       54,   63,   55,   86,    0,  102,  105,  104,  115,  124,
-       64,  165,  157,  167,  219,  197,  123,  707,  280,  707,
-        0,  707,  242,  129,  707,  707,  707,    0,  113,   60,
-      118,  131,  130,  149,  142,  141,  166,  166,  175,  149,
-      154,  186,  195,  197,  196,  201,    0,  199,  197,  201,
-      207,  209,  221,  213,  224,  208,  214,  221,    0,    0,
-      224,    0,  237,  246,  224,  231,  243,  239,  244,  244,
-      248,  266,  257,  266,  260,    0,  269,  266,  259,  315,
-
-      276,  286,    0,  172,  276,  285,    0,  279,  278,  283,
-      288,  304,  305,  298,  310,  169,  299,  307,  311,  320,
-      336,  317,  309,  333,  316,  312,  327,  329,  323,  323,
-      329,    0,  335,  330,    0,  351,  343,  334,  338,  348,
-        0,  360,  358,  356,    0,  353,  359,  365,  359,  367,
-      369,  379,  372,  376,  386,  386,  391,  394,  381,  396,
-      386,  387,    0,  387,  406,    0,  391,    0,    0,  168,
-        0,  408,  408,  414,  402,  401,  421,  407,    0,  411,
-        0,  412,    0,  417,  425,  423,  430,    0,  436,    0,
-        0,  433,  439,  444,  432,  436,  431,  447,  435,  437,
-
-        0,    0,    0,  162,  452,  445,  453,  446,  448,  455,
-      453,    0,  471,    0,  469,  475,    0,    0,    0,  470,
-      707,  479,  474,  471,    0,    0,    0,  472,  481,    0,
-      475,  479,  478,  477,  479,  478,    0,    0,  496,  485,
-      517,    0,  488,  502,    0,  505,  506,  498,    0,  510,
-        0,    0,    0,    0,  510,  527,  529,    0,    0,  507,
-      510,    0,    0,  525,    0,    0,  535,  527,  535,    0,
-        0,  531,  525,  544,  536,  550,  554,  547,  544,  539,
-      565,  546,  553,  561,  551,    0,  557,    0,    0,  559,
-      562,    0,    0,  564,  580,  569,  562,  707,  583,  574,
-
-        0,  576,  580,  586,  584,  589,  602,    0,  602,  587,
-      160,  615,  591,    0,  597,  602,  631,  606,  606,  605,
-      607,  149,  620,  611,  129,  118,  624,  631,  624,  623,
-      627,  115,  625,   88,  631,   81,  631,    0,   78,    0,
-      707,  686,   69,  688,  690,  694,  696,  701
+        0,   62,  665,  796,   66,  796,  796,  572,    0,  796,
+      563,   55,   59,  796,  544,   58,   56,   61,   62,   59,
+       57,   63,   56,   98,    0,  101,  108,  109,  137,  138,
+       74,  179,  181,  133,  452,  130,  182,  362,  212,  796,
+      349,  357,  796,    0,  796,  294,   84,  796,  796,  796,
+        0,   81,   89,  102,  119,  104,  131,  143,  143,  157,
+      148,  179,  140,  155,  199,  204,  194,  184,  200,    0,
+      205,  211,  207,  212,  213,  227,  220,  232,  218,  223,
+      230,    0,    0,  226,    0,  243,  254,  232,  236,  250,
+      237,  243,  243,  254,  271,  265,  268,  265,    0,  275,
+
+      268,  271,  324,  284,  241,  292,    0,  248,  281,  294,
+        0,  287,  284,  289,  297,  302,  312,  306,  313,  336,
+      303,  316,  319,  331,  346,  190,  326,  319,  331,  327,
+      325,  342,  341,  335,  333,  342,    0,  347,  339,    0,
+      360,  350,  342,  347,  354,    0,  372,  369,  369,    0,
+      366,  370,  370,  373,  380,  380,  391,  384,  387,  396,
+      396,  404,  406,  392,  407,  397,  399,    0,  400,  418,
+        0,  404,    0,    0,  438,  189,    0,  421,  422,  429,
+      420,  419,  430,  423,    0,  424,    0,  426,    0,  430,
+      438,  435,  443,    0,  447,    0,    0,  444,  451,  456,
+
+      443,  447,  443,  460,  447,  450,    0,    0,    0,  487,
+      465,  459,  470,  466,  467,  475,  470,    0,  488,    0,
+      486,  491,    0,    0,    0,  486,  796,  494,  487,  484,
+        0,    0,    0,  485,  501,    0,  491,  495,  494,  493,
+      496,  495,    0,    0,  501,  500,  549,  115,    0,  500,
+      512,    0,  513,  515,  533,    0,  530,    0,    0,    0,
+        0,  543,  542,  543,    0,    0,  530,  533,    0,    0,
+      540,    0,    0,  549,  541,  548,    0,    0,  542,  537,
+      562,  547,  564,  574,  561,  562,  562,  588,  568,  574,
+      582,  572,    0,  580,    0,    0,  581,  584,    0,    0,
+
+      586,  586,  587,  602,  796,  603,  592,    0,  593,  597,
+      600,  615,  609,  617,    0,  621,  608,  649,  632,  618,
+        0,  624,  628,  655,  113,  633,  633,  635,  636,  668,
+      649,  640,  675,  679,  653,  663,  659,  659,  665,  692,
+      667,  698,  672,  700,  111,  673,    0,  712,   79,    0,
+      796,  775,   79,  777,  779,  783,  785,  790
     } ;
 
-static const flex_int16_t yy_def[349] =
+static const flex_int16_t yy_def[359] =
     {   0,
-      341,    1,  341,  341,  341,  341,  341,  342,  343,  341,
-      341,  341,  341,  341,  341,  344,  344,  344,  344,  344,
-      344,  344,  344,  344,  344,  344,  344,  344,  344,  344,
-      344,  344,  344,  344,  341,  344,  341,  341,  342,  341,
-      345,  341,  341,  341,  341,  341,  341,  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,  344,  344,
-      344,  344,  344,  344,  344,  344,  344,  344,  344,  344,
-      344,  344,  344,  344,  344,  344,  344,  344,  344,  341,
-
-      341,  344,  345,  341,  344,  344,  344,  344,  344,  344,
-      344,  344,  344,  344,  344,  344,  344,  344,  344,  344,
-      341,  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,  344,  344,  344,  344,  344,  341,  344,  344,
-      344,  344,  344,  344,  344,  344,  344,  344,  344,  346,
-      344,  344,  344,  344,  341,  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,  344,  344,  341,  344,
-      344,  344,  344,  344,  344,  344,  347,  344,  344,  344,
-      341,  344,  344,  344,  344,  344,  344,  344,  344,  344,
-      344,  344,  344,  344,  344,  344,  344,  344,  344,  344,
-      341,  344,  344,  344,  344,  341,  344,  344,  344,  344,
-      344,  347,  344,  344,  344,  344,  344,  344,  344,  344,
-      344,  344,  344,  344,  344,  344,  341,  341,  341,  344,
-      344,  341,  344,  344,  344,  344,  344,  344,  344,  344,
-      344,  341,  341,  341,  341,  344,  344,  344,  344,  344,
-      344,  344,  344,  344,  341,  341,  341,  341,  344,  344,
-
-      344,  344,  341,  341,  341,  341,  344,  344,  344,  341,
-      341,  341,  341,  344,  344,  341,  341,  341,  341,  341,
-      344,  341,  341,  341,  341,  341,  344,  341,  341,  344,
-      341,  341,  344,  341,  344,  348,  344,  348,  348,  344,
-        0,  341,  341,  341,  341,  341,  341,  341
+      351,    1,  351,  351,  351,  351,  351,  352,  353,  351,
+      351,  351,  351,  351,  351,  354,  354,  354,  354,  354,
+      354,  354,  354,  354,  354,  354,  354,  354,  354,  354,
+      354,  354,  354,  354,  351,  351,  354,  351,  351,  351,
+      351,  352,  351,  355,  351,  351,  351,  351,  351,  351,
+      354,  354,  354,  354,  354,  354,  354,  354,  354,  354,
+      354,  354,  354,  354,  354,  354,  354,  354,  354,  354,
+      354,  354,  354,  354,  354,  354,  354,  354,  354,  354,
+      354,  354,  354,  354,  354,  354,  354,  354,  354,  354,
+      354,  354,  354,  354,  354,  354,  354,  354,  354,  354,
+
+      354,  354,  351,  351,  351,  354,  355,  351,  354,  354,
+      354,  354,  354,  354,  354,  354,  354,  354,  354,  354,
+      354,  354,  354,  354,  351,  351,  354,  354,  354,  354,
+      354,  354,  354,  354,  354,  354,  354,  354,  354,  354,
+      354,  354,  354,  354,  354,  354,  354,  354,  354,  354,
+      354,  354,  354,  354,  354,  354,  354,  354,  354,  354,
+      354,  354,  351,  354,  354,  354,  354,  354,  354,  354,
+      354,  354,  354,  354,  356,  351,  354,  354,  354,  354,
+      351,  354,  354,  354,  354,  354,  354,  354,  354,  354,
+      354,  354,  354,  354,  354,  354,  354,  354,  354,  354,
+
+      354,  354,  354,  354,  354,  354,  354,  354,  354,  354,
+      354,  354,  354,  354,  351,  354,  354,  354,  354,  354,
+      354,  354,  357,  354,  354,  354,  351,  354,  354,  354,
+      354,  354,  354,  354,  354,  354,  354,  354,  354,  354,
+      354,  354,  354,  354,  354,  354,  351,  351,  354,  354,
+      354,  354,  351,  354,  354,  354,  354,  354,  357,  354,
+      354,  354,  354,  354,  354,  354,  354,  354,  354,  354,
+      354,  354,  354,  351,  351,  351,  354,  354,  351,  354,
+      354,  354,  354,  354,  354,  354,  354,  354,  351,  351,
+      351,  351,  354,  354,  354,  354,  354,  354,  354,  354,
+
+      354,  351,  351,  351,  351,  354,  354,  354,  354,  351,
+      351,  351,  351,  354,  354,  354,  351,  351,  351,  351,
+      354,  354,  351,  351,  351,  351,  351,  351,  354,  351,
+      351,  351,  351,  351,  354,  351,  351,  354,  351,  351,
+      354,  351,  354,  358,  351,  354,  358,  358,  358,  354,
+        0,  351,  351,  351,  351,  351,  351,  351
     } ;
 
-static const flex_int16_t yy_nxt[768] =
+static const flex_int16_t yy_nxt[860] =
     {   0,
-        4,    5,    6,    7,    8,    9,   10,   11,    4,   12,
-       13,   14,   15,   16,   17,   18,   19,   20,   21,   22,
-       23,   24,   25,   25,   26,   27,   28,   29,   30,   31,
-       32,   33,   25,   25,   34,   25,   25,   16,   17,   18,
-       19,   20,   21,   22,   23,   24,   25,   26,   27,   28,
-       29,   30,   31,   32,   33,   25,   25,   34,   25,   25,
-       35,   37,   38,   38,   43,   44,   45,   46,   49,   52,
-       56,   53,   50,   41,   57,   62,   66,   36,   54,  339,
-       51,   86,  339,   63,   58,   55,   59,   64,   60,  336,
-       65,  106,   49,   52,   56,   53,   50,   61,   57,   62,
-
-       66,   36,   54,   51,   67,   86,   63,   58,   55,   59,
-       64,   60,   68,   65,  106,   70,  317,   69,   73,  317,
-       61,   76,   74,   71,   37,   38,   38,  105,   67,   72,
-      317,   77,   75,   79,  107,   68,   78,   43,   44,   70,
-       69,   80,   73,   81,   82,   76,   74,   71,   83,  108,
-      317,  105,   72,   84,   77,   75,   85,   79,  107,   78,
-      109,  317,  110,  241,   80,  116,   81,   82,  111,  170,
-      170,   83,  112,  108,   93,  117,   84,   94,   95,   85,
-       87,  104,   88,  109,   96,   89,  110,   97,   98,  116,
-      113,  111,   90,   91,   99,  112,   92,  121,   93,  117,
-
-      114,   94,   95,  118,   87,  115,   88,   96,  119,   89,
-      102,   97,   98,  113,  125,   90,   91,   99,   62,   92,
-      100,   38,   38,  114,  120,  122,   63,  118,  115,  123,
-      124,  126,  119,  127,  102,  128,  129,  101,  125,  130,
-      132,  137,   62,  134,  131,  135,  136,  120,  122,   63,
-      138,  104,  123,  124,  126,  141,  127,  133,  128,  142,
-      129,  101,  130,  139,  132,  137,  134,  131,  135,  136,
-      145,  146,  143,  140,  138,  144,  147,  148,  141,  149,
-      133,  150,  142,  151,   40,  152,  153,  139,  157,  158,
-      154,   47,  155,  145,  146,  143,  140,  156,  144,  147,
-
-      148,  159,  161,  149,  150,  160,  162,  151,  152,  163,
-      153,  157,  164,  158,  154,  155,  100,   38,   38,  165,
-      156,  166,  167,   42,  168,  159,  161,  169,  160,  162,
-      171,  172,  163,  101,  174,  164,  173,  121,  176,   40,
-      177,  180,  165,  181,  182,  166,  167,  168,  183,  186,
-      178,  169,  184,  171,  172,  185,  187,  101,  174,  173,
-      179,  188,  176,  177,  180,  189,  181,  175,  182,  190,
-      191,  192,  183,  186,  178,  184,  193,  194,  185,  195,
-      187,  196,  197,  179,  188,  198,  199,  341,  200,  189,
-      175,  201,  190,  191,  192,  202,  203,  341,  204,  193,
-
-      205,  194,  206,  195,  196,  197,  207,  208,  198,  209,
-      199,  200,  210,  211,  201,  212,  213,  214,  202,  215,
-      203,  204,  216,  205,  218,  219,  206,  220,  341,  221,
-      207,  208,  222,  209,  223,  210,  224,  211,  212,  213,
-      214,  225,  226,  215,  227,  216,  228,  230,  218,  219,
-      229,  220,  221,  231,  232,  222,  233,  234,  223,  224,
-      235,  236,  237,  238,  225,  226,  239,  227,  240,  242,
-      228,  230,  243,  229,  244,  341,  245,  231,  232,  246,
-      233,  234,  247,  235,  236,  237,  248,  238,  249,  239,
-      250,  240,  251,  242,  253,  243,  254,  258,  244,  245,
-
-      255,  256,  246,  257,  259,  247,  260,  261,  262,  248,
-      263,  264,  249,  265,  250,  266,  251,  253,  241,  274,
-      254,  258,  270,  255,  256,  276,  257,  259,  271,  260,
-      261,  262,  272,  263,  264,  273,  275,  265,  266,  279,
-      267,  280,  268,  274,  277,  270,  278,  341,  269,  276,
-      281,  271,  282,  341,  283,  272,  284,  287,  273,  275,
-      285,  286,  279,  267,  280,  268,  288,  289,  277,  290,
-      278,  269,  291,  281,  292,  293,  282,  283,  294,  306,
-      284,  287,  295,  285,  286,  296,  297,  298,  299,  288,
-      300,  289,  301,  290,  302,  291,  303,  292,  293,  305,
-
-      307,  312,  294,  306,  308,  295,  309,  310,  296,  297,
-      298,  299,  304,  300,  311,  301,  313,  302,  314,  315,
-      303,  316,  305,  320,  307,  312,  321,  308,  322,  309,
-      310,  318,  317,  324,  325,  304,  326,  311,  327,  313,
-      328,  330,  314,  315,  316,  329,  320,  319,  331,  321,
-      332,  322,  333,  334,  335,  318,  324,  325,  337,  326,
-      340,  327,  323,  341,  328,  330,  341,  341,  329,  341,
-      319,  341,  331,  332,  341,  333,  334,  335,  341,  341,
-      341,  337,  341,  340,  341,  323,   39,   39,  341,   39,
-       39,   48,   48,  103,  103,  217,  341,  341,  217,  252,
-
-      252,  338,  338,  341,  338,  338,    3,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341
+        4,    5,    6,    7,    5,    8,    9,   10,   11,    4,
+       12,   13,   14,   15,   16,   17,   18,   19,   20,   21,
+       22,   23,   24,   25,   25,   26,   27,   28,   29,   30,
+       31,   32,   33,   25,   25,   34,   25,   25,   16,   17,
+       18,   19,   20,   21,   22,   23,   24,   25,   26,   27,
+       28,   29,   30,   31,   32,   33,   25,   25,   34,   25,
+       25,    4,   35,   36,   46,   47,   36,   39,   40,   40,
+       39,   48,   49,   52,   55,   56,   59,   53,   69,   65,
+       60,   37,   57,   44,   62,   54,   63,   66,   67,   58,
+       61,   68,   89,   46,   47,   64,  109,   52,   55,   56,
+
+       59,   53,   69,   65,   60,   37,   57,   62,   54,   63,
+       66,   67,   58,   61,   68,   73,   89,   70,   64,  111,
+      109,  110,   76,   74,   38,   71,   77,   79,   41,   75,
+       72,  103,   40,   40,  103,  113,   78,   80,  112,   73,
+      348,   70,   81,  111,  110,  114,   76,   74,   71,  104,
+       77,   79,   75,   72,  100,  101,   82,  120,  113,   78,
+       80,  102,  112,   86,   83,   81,   84,   85,   87,  114,
+      115,   88,  344,  104,  324,  116,  247,  121,  100,  101,
+       82,  120,  117,  118,  102,  125,   86,   83,  125,   84,
+       85,   87,  105,  115,   88,   90,  106,   91,  116,   96,
+
+       92,  121,   97,   98,   65,  117,  118,   93,   94,   99,
+      119,   95,   66,   39,   40,   40,   39,  122,  123,   90,
+      106,   91,  124,   96,   92,  127,   97,   98,   65,  130,
+       93,   94,   99,  119,   95,   66,  128,  129,  131,  132,
+      133,  122,  123,  134,  142,  124,  126,  135,  127,  137,
+      175,  125,  136,  130,  139,  140,  141,  143,  108,  128,
+      129,  131,  132,  133,  146,  147,  138,  134,  142,  150,
+      135,  151,  144,  137,   41,  136,  152,  139,  140,  141,
+      148,  143,  145,  149,  153,  154,  156,  146,  147,  138,
+      155,  157,  150,  158,  151,  160,  144,  159,  163,  152,
+
+      161,  162,  103,  148,  108,  145,  149,  153,  164,  154,
+      156,  165,  166,  155,  157,  167,  168,  158,  160,  169,
+      171,  159,  163,  161,  162,  103,   40,   40,  103,  170,
+      172,  174,  164,  173,  165,  177,  166,  175,  167,  168,
+      175,  178,  169,  104,  171,  179,  180,  125,  182,  184,
+      125,  183,  170,  186,  172,  174,  173,  187,  177,  185,
+      188,  189,   43,  192,  178,  190,  191,  104,  179,  193,
+      180,  194,  182,  184,  183,  195,  186,  196,  181,  197,
+      187,  198,  185,  199,  188,  189,  105,  192,  190,  191,
+      200,  201,  205,  193,  194,  202,  203,  204,  176,  195,
+
+      196,  181,  197,  206,  198,  207,  199,  208,  126,  209,
+       39,  210,  211,  212,  200,  201,  205,  213,  202,  203,
+      204,  214,  215,  103,  216,  217,  206,  218,  207,  219,
+      208,  220,  221,  209,  210,  211,  222,  212,  224,  175,
+      225,  213,  175,  226,  229,  214,  215,  216,  227,  217,
+      218,  228,  219,  230,  220,  231,  221,  232,  233,  222,
+      234,  236,  224,  235,  225,  237,  238,  226,  229,  239,
+      240,  227,  241,  242,  228,  243,  230,  244,  231,  245,
+      232,  233,  246,  249,  234,  236,  235,  250,  247,  237,
+      238,  247,  251,  239,  240,  241,  242,  252,  243,  253,
+
+      176,  244,  245,  254,  255,  246,  256,  249,  257,  258,
+      250,  260,  261,   39,  262,  263,  251,  264,  265,  272,
+      252,  266,  253,  267,  268,  269,  254,  255,  270,  271,
+      256,  273,  257,  258,  260,  277,  261,  262,  263,  278,
+      264,  279,  265,  272,  266,  280,  267,  268,  269,  248,
+      247,  270,  271,  247,  273,  281,   50,  282,  277,  283,
+      284,  285,  278,  286,  279,  287,  288,  289,  280,  290,
+      291,   45,  292,  274,  293,  275,  294,   43,  295,  281,
+      282,  276,  296,  283,  284,  285,  286,  298,  287,  288,
+      297,  289,  290,  299,  291,  292,  274,  293,  275,  300,
+
+      294,  295,  301,  310,  276,  302,  296,  303,  304,  305,
+      298,  248,  306,  307,  297,  308,  299,  309,  312,  311,
+      313,  314,  300,  315,  316,  317,  301,  310,  302,  318,
+      303,  304,  305,  319,  321,  306,  307,  320,  308,  322,
+      309,  312,  311,  323,  313,  314,  315,  316,  317,  326,
+      324,  328,  318,  324,  329,  330,  324,  319,  321,  324,
+      320,  332,  333,  322,  351,  327,  323,  334,  335,  324,
+      336,  338,  324,  326,  328,  337,  324,  329,  330,  324,
+      324,  339,  351,  324,  332,  333,  340,  331,  327,  341,
+      334,  335,  342,  324,  336,  338,  324,  343,  337,  344,
+
+      346,  348,  344,  350,  348,  339,  351,  351,  351,  340,
+      331,  325,  341,  348,  351,  342,  348,  325,  351,  351,
+      343,  351,  351,  346,  351,  351,  350,  351,  351,  351,
+      325,  351,  351,  351,  351,  351,  351,  325,  351,  351,
+      351,  325,  351,  351,  351,  351,  351,  351,  351,  351,
+      351,  351,  351,  351,  325,  351,  351,  351,  351,  351,
+      345,  351,  349,  351,  351,  351,  351,  351,  351,  351,
+      351,  351,  351,  351,  349,   42,   42,  351,   42,   42,
+       51,   51,  107,  107,  223,  351,  351,  223,  259,  259,
+      347,  347,  351,  347,  347,    3,  351,  351,  351,  351,
+
+      351,  351,  351,  351,  351,  351,  351,  351,  351,  351,
+      351,  351,  351,  351,  351,  351,  351,  351,  351,  351,
+      351,  351,  351,  351,  351,  351,  351,  351,  351,  351,
+      351,  351,  351,  351,  351,  351,  351,  351,  351,  351,
+      351,  351,  351,  351,  351,  351,  351,  351,  351,  351,
+      351,  351,  351,  351,  351,  351,  351,  351,  351
     } ;
 
-static const flex_int16_t yy_chk[768] =
+static const flex_int16_t yy_chk[860] =
     {   0,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
@@ -628,84 +642,94 @@ static const flex_int16_t yy_chk[768] =
         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,
-        2,    5,    5,    5,   12,   12,   13,   13,   16,   17,
-       19,   18,   16,  343,   19,   21,   23,    2,   18,  339,
-       16,   31,  336,   21,   19,   18,   20,   22,   20,  334,
-       22,   50,   16,   17,   19,   18,   16,   20,   19,   21,
-
-       23,    2,   18,   16,   24,   31,   21,   19,   18,   20,
-       22,   20,   24,   22,   50,   26,  332,   24,   27,  326,
-       20,   28,   27,   26,   37,   37,   37,   49,   24,   26,
-      325,   28,   27,   29,   51,   24,   28,   44,   44,   26,
-       24,   29,   27,   29,   29,   28,   27,   26,   30,   52,
-      322,   49,   26,   30,   28,   27,   30,   29,   51,   28,
-       53,  311,   54,  204,   29,   60,   29,   29,   55,  170,
-      116,   30,   56,   52,   33,   61,   30,   33,   33,   30,
-       32,  104,   32,   53,   33,   32,   54,   34,   34,   60,
-       57,   55,   32,   32,   34,   56,   32,   65,   33,   61,
-
-       58,   33,   33,   62,   32,   59,   32,   33,   63,   32,
-       36,   34,   34,   57,   69,   32,   32,   34,   36,   32,
-       35,   35,   35,   58,   64,   66,   36,   62,   59,   68,
-       68,   70,   63,   71,   36,   72,   73,   35,   69,   74,
-       75,   81,   36,   76,   74,   77,   78,   64,   66,   36,
-       83,   43,   68,   68,   70,   85,   71,   75,   72,   86,
-       73,   35,   74,   84,   75,   81,   76,   74,   77,   78,
-       88,   89,   87,   84,   83,   87,   90,   91,   85,   92,
-       75,   93,   86,   94,   39,   95,   97,   84,   99,  101,
-       97,   15,   98,   88,   89,   87,   84,   98,   87,   90,
-
-       91,  102,  106,   92,   93,  105,  108,   94,   95,  109,
-       97,   99,  110,  101,   97,   98,  100,  100,  100,  111,
-       98,  112,  113,   11,  114,  102,  106,  115,  105,  108,
-      117,  118,  109,  100,  120,  110,  119,  121,  122,    8,
-      123,  125,  111,  126,  127,  112,  113,  114,  128,  131,
-      124,  115,  129,  117,  118,  130,  133,  100,  120,  119,
-      124,  134,  122,  123,  125,  136,  126,  121,  127,  137,
-      138,  139,  128,  131,  124,  129,  140,  142,  130,  143,
-      133,  144,  146,  124,  134,  147,  148,    3,  149,  136,
-      121,  150,  137,  138,  139,  151,  152,    0,  153,  140,
-
-      154,  142,  155,  143,  144,  146,  156,  157,  147,  158,
-      148,  149,  159,  160,  150,  161,  162,  164,  151,  165,
-      152,  153,  167,  154,  172,  173,  155,  174,    0,  175,
-      156,  157,  176,  158,  177,  159,  178,  160,  161,  162,
-      164,  180,  182,  165,  184,  167,  185,  187,  172,  173,
-      186,  174,  175,  189,  192,  176,  193,  194,  177,  178,
-      195,  196,  197,  198,  180,  182,  199,  184,  200,  205,
-      185,  187,  206,  186,  207,    0,  208,  189,  192,  209,
-      193,  194,  210,  195,  196,  197,  211,  198,  213,  199,
-      215,  200,  216,  205,  220,  206,  222,  229,  207,  208,
-
-      223,  224,  209,  228,  231,  210,  232,  233,  234,  211,
-      235,  236,  213,  239,  215,  240,  216,  220,  241,  248,
-      222,  229,  243,  223,  224,  255,  228,  231,  244,  232,
-      233,  234,  246,  235,  236,  247,  250,  239,  240,  260,
-      241,  261,  241,  248,  256,  243,  257,    0,  241,  255,
-      264,  244,  267,    0,  268,  246,  269,  274,  247,  250,
-      272,  273,  260,  241,  261,  241,  275,  276,  256,  277,
-      257,  241,  278,  264,  279,  280,  267,  268,  281,  297,
-      269,  274,  282,  272,  273,  283,  284,  285,  287,  275,
-      290,  276,  291,  277,  294,  278,  295,  279,  280,  296,
-
-      299,  305,  281,  297,  300,  282,  302,  303,  283,  284,
-      285,  287,  295,  290,  304,  291,  306,  294,  307,  309,
-      295,  310,  296,  313,  299,  305,  315,  300,  316,  302,
-      303,  312,  317,  318,  319,  295,  320,  304,  321,  306,
-      323,  327,  307,  309,  310,  324,  313,  312,  328,  315,
-      329,  316,  330,  331,  333,  312,  318,  319,  335,  320,
-      337,  321,  317,    0,  323,  327,    0,    0,  324,    0,
-      312,    0,  328,  329,    0,  330,  331,  333,    0,    0,
-        0,  335,    0,  337,    0,  317,  342,  342,    0,  342,
-      342,  344,  344,  345,  345,  346,    0,    0,  346,  347,
-
-      347,  348,  348,    0,  348,  348,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341
+        1,    1,    1,    2,   12,   12,    2,    5,    5,    5,
+        5,   13,   13,   16,   17,   18,   19,   16,   23,   21,
+       19,    2,   18,  353,   20,   16,   20,   21,   22,   18,
+       19,   22,   31,   47,   47,   20,   52,   16,   17,   18,
+
+       19,   16,   23,   21,   19,    2,   18,   20,   16,   20,
+       21,   22,   18,   19,   22,   26,   31,   24,   20,   54,
+       52,   53,   27,   26,    2,   24,   27,   28,    5,   26,
+       24,   36,   36,   36,   36,   56,   27,   28,   55,   26,
+      349,   24,   28,   54,   53,   57,   27,   26,   24,   36,
+       27,   28,   26,   24,   34,   34,   29,   63,   56,   27,
+       28,   34,   55,   30,   29,   28,   29,   29,   30,   57,
+       58,   30,  345,   36,  325,   59,  248,   64,   34,   34,
+       29,   63,   60,   61,   34,   68,   30,   29,   68,   29,
+       29,   30,   36,   58,   30,   32,   37,   32,   59,   33,
+
+       32,   64,   33,   33,   37,   60,   61,   32,   32,   33,
+       62,   32,   37,   39,   39,   39,   39,   65,   66,   32,
+       37,   32,   67,   33,   32,   69,   33,   33,   37,   72,
+       32,   32,   33,   62,   32,   37,   71,   71,   73,   74,
+       75,   65,   66,   76,   84,   67,   68,   77,   69,   78,
+      176,  126,   77,   72,   79,   80,   81,   86,  108,   71,
+       71,   73,   74,   75,   88,   89,   78,   76,   84,   91,
+       77,   92,   87,   78,   39,   77,   93,   79,   80,   81,
+       90,   86,   87,   90,   94,   95,   97,   88,   89,   78,
+       96,   98,   91,  100,   92,  101,   87,  100,  104,   93,
+
+      101,  102,  105,   90,   46,   87,   90,   94,  106,   95,
+       97,  109,  110,   96,   98,  112,  113,  100,  101,  114,
+      116,  100,  104,  101,  102,  103,  103,  103,  103,  115,
+      117,  119,  106,  118,  109,  121,  110,  120,  112,  113,
+      120,  122,  114,  103,  116,  123,  124,  125,  127,  129,
+      125,  128,  115,  130,  117,  119,  118,  131,  121,  129,
+      132,  133,   42,  136,  122,  134,  135,  103,  123,  138,
+      124,  139,  127,  129,  128,  141,  130,  142,  125,  143,
+      131,  144,  129,  145,  132,  133,  103,  136,  134,  135,
+      147,  148,  153,  138,  139,  149,  151,  152,  120,  141,
+
+      142,  125,  143,  154,  144,  155,  145,  156,  125,  157,
+       41,  158,  159,  160,  147,  148,  153,  161,  149,  151,
+      152,  162,  163,   38,  164,  165,  154,  166,  155,  167,
+      156,  169,  170,  157,  158,  159,  172,  160,  178,  175,
+      179,  161,  175,  180,  183,  162,  163,  164,  181,  165,
+      166,  182,  167,  184,  169,  186,  170,  188,  190,  172,
+      191,  193,  178,  192,  179,  195,  198,  180,  183,  199,
+      200,  181,  201,  202,  182,  203,  184,  204,  186,  205,
+      188,  190,  206,  211,  191,  193,  192,  212,  210,  195,
+      198,  210,  213,  199,  200,  201,  202,  214,  203,  215,
+
+      175,  204,  205,  216,  217,  206,  219,  211,  221,  222,
+      212,  226,  228,   35,  229,  230,  213,  234,  235,  245,
+      214,  237,  215,  238,  239,  240,  216,  217,  241,  242,
+      219,  246,  221,  222,  226,  250,  228,  229,  230,  251,
+      234,  253,  235,  245,  237,  254,  238,  239,  240,  210,
+      247,  241,  242,  247,  246,  255,   15,  257,  250,  262,
+      263,  264,  251,  267,  253,  268,  271,  274,  254,  275,
+      276,   11,  279,  247,  280,  247,  281,    8,  282,  255,
+      257,  247,  283,  262,  263,  264,  267,  285,  268,  271,
+      284,  274,  275,  286,  276,  279,  247,  280,  247,  287,
+
+      281,  282,  288,  302,  247,  289,  283,  290,  291,  292,
+      285,  247,  294,  297,  284,  298,  286,  301,  303,  302,
+      304,  306,  287,  307,  309,  310,  288,  302,  289,  311,
+      290,  291,  292,  312,  314,  294,  297,  313,  298,  316,
+      301,  303,  302,  317,  304,  306,  307,  309,  310,  319,
+      318,  320,  311,  318,  322,  323,  324,  312,  314,  324,
+      313,  326,  327,  316,    3,  319,  317,  328,  329,  330,
+      331,  335,  330,  319,  320,  332,  333,  322,  323,  333,
+      334,  336,    0,  334,  326,  327,  337,  324,  319,  338,
+      328,  329,  339,  340,  331,  335,  340,  341,  332,  342,
+
+      343,  344,  342,  346,  344,  336,    0,    0,    0,  337,
+      324,  318,  338,  348,    0,  339,  348,  324,    0,    0,
+      341,    0,    0,  343,    0,    0,  346,    0,    0,    0,
+      330,    0,    0,    0,    0,    0,    0,  333,    0,    0,
+        0,  334,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,  340,    0,    0,    0,    0,    0,
+      342,    0,  344,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,  348,  352,  352,    0,  352,  352,
+      354,  354,  355,  355,  356,    0,    0,  356,  357,  357,
+      358,  358,    0,  358,  358,  351,  351,  351,  351,  351,
+
+      351,  351,  351,  351,  351,  351,  351,  351,  351,  351,
+      351,  351,  351,  351,  351,  351,  351,  351,  351,  351,
+      351,  351,  351,  351,  351,  351,  351,  351,  351,  351,
+      351,  351,  351,  351,  351,  351,  351,  351,  351,  351,
+      351,  351,  351,  351,  351,  351,  351,  351,  351,  351,
+      351,  351,  351,  351,  351,  351,  351,  351,  351
     } ;
 
 static yy_state_type yy_last_accepting_state;
@@ -786,12 +810,13 @@ static void count() {
 	char *p = yytext;
 
 	while (*p) {
-		if (*p == '\n' || *p == '\xC2') {
+		if (*p == '\n') {
+			compiler->_linenumber++;
+			compiler->_colnumber = 0;
+			pushLine(compiler->_bytenumber + 1);
+		} else if (*p == '\xC2' && *(p + 1) == '\xAC') { // continuation
 			compiler->_linenumber++;
 			compiler->_colnumber = 0;
-
-			if (*p == '\n')
-				pushLine(compiler->_bytenumber + 1);
 		} else {
 			compiler->_colnumber++;
 		}
@@ -804,8 +829,8 @@ static Common::String *cleanupString(const char *s) {
 	Common::String *res = new Common::String;
 
 	while (*s) {
-		if (*s == '\xC2') {
-			s++;
+		if (*s == '\xC2' && *(s + 1) == '\xAC') { // continuation
+			s += 2;
 			*res += ' ';
 			continue;
 		}
@@ -816,8 +841,53 @@ static Common::String *cleanupString(const char *s) {
 	return res;
 }
 
-#line 819 "engines/director/lingo/lingo-lex.cpp"
-#line 820 "engines/director/lingo/lingo-lex.cpp"
+static void skipWhitespace(const char **ptr) {
+	while (true) {
+		if (**ptr == ' ' || **ptr == '\t') {
+			*ptr += 1;
+		} else if (**ptr == '\xC2' && *(*ptr + 1) == '\xAC') { // continuation
+			*ptr += 2;
+		} else {
+			break;
+		}
+	}
+}
+
+static Common::String *readUntilWhitespace(const char **ptr) {
+	Common::String *res = new Common::String;
+
+	while (true) {
+		if (**ptr == ' ' || **ptr == '\t') {
+			break;
+		}
+		if (**ptr == '\xC2' && *(*ptr + 1) == '\xAC') { // continuation
+			break;
+		}
+		*res += **ptr;
+		*ptr += 1;
+	}
+
+	return res;
+}
+
+static Common::String *readUntilNull(const char **ptr) {
+	Common::String *res = new Common::String;
+
+	while (**ptr) {
+		if (**ptr == '\xC2' && *(*ptr + 1) == '\xAC') { // continuation
+			*ptr += 2;
+			*res += " "; // replace with space
+			continue;
+		}
+		*res += **ptr;
+		*ptr += 1;
+	}
+
+	return res;
+}
+
+#line 889 "engines/director/lingo/lingo-lex.cpp"
+#line 890 "engines/director/lingo/lingo-lex.cpp"
 
 #define INITIAL 0
 
@@ -1035,10 +1105,10 @@ YY_DECL
 		}
 
 	{
-#line 114 "engines/director/lingo/lingo-lex.l"
+#line 160 "engines/director/lingo/lingo-lex.l"
 
 
-#line 1041 "engines/director/lingo/lingo-lex.cpp"
+#line 1111 "engines/director/lingo/lingo-lex.cpp"
 
 	while ( /*CONSTCOND*/1 )		/* loops until end-of-file is reached */
 		{
@@ -1066,13 +1136,13 @@ yy_match:
 			while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
 				{
 				yy_current_state = (int) yy_def[yy_current_state];
-				if ( yy_current_state >= 342 )
+				if ( yy_current_state >= 352 )
 					yy_c = yy_meta[yy_c];
 				}
 			yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
 			++yy_cp;
 			}
-		while ( yy_current_state != 341 );
+		while ( yy_current_state != 351 );
 		yy_cp = (yy_last_accepting_cpos);
 		yy_current_state = (yy_last_accepting_state);
 
@@ -1094,93 +1164,92 @@ do_action:	/* This label is used only to access EOF actions. */
 
 case 1:
 YY_RULE_SETUP
-#line 116 "engines/director/lingo/lingo-lex.l"
+#line 162 "engines/director/lingo/lingo-lex.l"
 { count(); }
 	YY_BREAK
 case 2:
 YY_RULE_SETUP
-#line 118 "engines/director/lingo/lingo-lex.l"
+#line 164 "engines/director/lingo/lingo-lex.l"
 { count(); yylval.s = new Common::String(yytext + 1); return tSYMBOL; }	// D3, skip '#'
 	YY_BREAK
 case 3:
 YY_RULE_SETUP
-#line 120 "engines/director/lingo/lingo-lex.l"
+#line 166 "engines/director/lingo/lingo-lex.l"
 { count(); return tABBREVIATED; }
 	YY_BREAK
 case 4:
 YY_RULE_SETUP
-#line 121 "engines/director/lingo/lingo-lex.l"
+#line 167 "engines/director/lingo/lingo-lex.l"
 { count(); return tABBREV; }
 	YY_BREAK
 case 5:
 YY_RULE_SETUP
-#line 122 "engines/director/lingo/lingo-lex.l"
+#line 168 "engines/director/lingo/lingo-lex.l"
 { count(); return tABBR; }
 	YY_BREAK
 case 6:
 YY_RULE_SETUP
-#line 123 "engines/director/lingo/lingo-lex.l"
+#line 169 "engines/director/lingo/lingo-lex.l"
 { count(); return tAFTER; }		// D3
 	YY_BREAK
 case 7:
 YY_RULE_SETUP
-#line 124 "engines/director/lingo/lingo-lex.l"
+#line 170 "engines/director/lingo/lingo-lex.l"
 { count(); return tAND; }
 	YY_BREAK
 case 8:
 YY_RULE_SETUP
-#line 125 "engines/director/lingo/lingo-lex.l"
+#line 171 "engines/director/lingo/lingo-lex.l"
 { count(); return tBEFORE; }	// D3
 	YY_BREAK
 case 9:
 YY_RULE_SETUP
-#line 126 "engines/director/lingo/lingo-lex.l"
+#line 172 "engines/director/lingo/lingo-lex.l"
 { count(); return tCAST; }
 	YY_BREAK
 case 10:
 YY_RULE_SETUP
-#line 127 "engines/director/lingo/lingo-lex.l"
+#line 173 "engines/director/lingo/lingo-lex.l"
 { count(); return tCHAR; }		// D3
 	YY_BREAK
 case 11:
 YY_RULE_SETUP
-#line 128 "engines/director/lingo/lingo-lex.l"
+#line 174 "engines/director/lingo/lingo-lex.l"
 { count(); return tCHARS; }
 	YY_BREAK
 case 12:
 YY_RULE_SETUP
-#line 129 "engines/director/lingo/lingo-lex.l"
+#line 175 "engines/director/lingo/lingo-lex.l"
 { count(); return tCONTAINS; }
 	YY_BREAK
 case 13:
 YY_RULE_SETUP
-#line 130 "engines/director/lingo/lingo-lex.l"
+#line 176 "engines/director/lingo/lingo-lex.l"
 { count(); return tDATE; }
 	YY_BREAK
 case 14:
 YY_RULE_SETUP
-#line 131 "engines/director/lingo/lingo-lex.l"
+#line 177 "engines/director/lingo/lingo-lex.l"
 { count(); return tDELETE; }
 	YY_BREAK
 case 15:
 YY_RULE_SETUP
-#line 132 "engines/director/lingo/lingo-lex.l"
+#line 178 "engines/director/lingo/lingo-lex.l"
 { count(); return tDOWN; }
 	YY_BREAK
 case 16:
 YY_RULE_SETUP
-#line 133 "engines/director/lingo/lingo-lex.l"
+#line 179 "engines/director/lingo/lingo-lex.l"
 { count(); return tELSE; }
 	YY_BREAK
 case 17:
 YY_RULE_SETUP
-#line 134 "engines/director/lingo/lingo-lex.l"
+#line 180 "engines/director/lingo/lingo-lex.l"
 {
 		count();
 
 		const char *ptr = &yytext[3]; // Skip 'end '
-		while (*ptr == ' ' || *ptr == '\t' || *ptr == '\xC2')
-			ptr++;
+		skipWhitespace(&ptr);
 
 		if (!scumm_stricmp(ptr, "if"))
 			return tENDIF;
@@ -1196,333 +1265,329 @@ YY_RULE_SETUP
 	YY_BREAK
 case 18:
 YY_RULE_SETUP
-#line 152 "engines/director/lingo/lingo-lex.l"
+#line 197 "engines/director/lingo/lingo-lex.l"
 { count(); return tEXIT; }
 	YY_BREAK
 case 19:
 YY_RULE_SETUP
-#line 153 "engines/director/lingo/lingo-lex.l"
+#line 198 "engines/director/lingo/lingo-lex.l"
 { count(); return tFACTORY; }
 	YY_BREAK
 case 20:
 YY_RULE_SETUP
-#line 154 "engines/director/lingo/lingo-lex.l"
+#line 199 "engines/director/lingo/lingo-lex.l"
 { count(); return tFIELD; }
 	YY_BREAK
 case 21:
 YY_RULE_SETUP
-#line 155 "engines/director/lingo/lingo-lex.l"
+#line 200 "engines/director/lingo/lingo-lex.l"
 { count(); return tFRAME; }
 	YY_BREAK
 case 22:
 YY_RULE_SETUP
-#line 156 "engines/director/lingo/lingo-lex.l"
+#line 201 "engines/director/lingo/lingo-lex.l"
 { count(); return tGLOBAL; }
 	YY_BREAK
 case 23:
 YY_RULE_SETUP
-#line 157 "engines/director/lingo/lingo-lex.l"
+#line 202 "engines/director/lingo/lingo-lex.l"
 { count(); return tGO; }
 	YY_BREAK
 case 24:
 YY_RULE_SETUP
-#line 158 "engines/director/lingo/lingo-lex.l"
+#line 203 "engines/director/lingo/lingo-lex.l"
 { count(); return tHILITE; }
 	YY_BREAK
 case 25:
 YY_RULE_SETUP
-#line 159 "engines/director/lingo/lingo-lex.l"
+#line 204 "engines/director/lingo/lingo-lex.l"
 { count(); return tIF; }
 	YY_BREAK
 case 26:
 YY_RULE_SETUP
-#line 160 "engines/director/lingo/lingo-lex.l"
+#line 205 "engines/director/lingo/lingo-lex.l"
 { count(); return tINSTANCE; }
 	YY_BREAK
 case 27:
 YY_RULE_SETUP
-#line 161 "engines/director/lingo/lingo-lex.l"
+#line 206 "engines/director/lingo/lingo-lex.l"
 { count(); return tINTERSECTS;}
 	YY_BREAK
 case 28:
 YY_RULE_SETUP
-#line 162 "engines/director/lingo/lingo-lex.l"
+#line 207 "engines/director/lingo/lingo-lex.l"
 { count(); return tINTO; }
 	YY_BREAK
 case 29:
 YY_RULE_SETUP
-#line 163 "engines/director/lingo/lingo-lex.l"
+#line 208 "engines/director/lingo/lingo-lex.l"
 { count(); return tIN; }
 	YY_BREAK
 case 30:
 YY_RULE_SETUP
-#line 164 "engines/director/lingo/lingo-lex.l"
+#line 209 "engines/director/lingo/lingo-lex.l"
 { count(); return tITEM; }
 	YY_BREAK
 case 31:
 YY_RULE_SETUP
-#line 165 "engines/director/lingo/lingo-lex.l"
+#line 210 "engines/director/lingo/lingo-lex.l"
 { count(); return tITEMS; }
 	YY_BREAK
 case 32:
 YY_RULE_SETUP
-#line 166 "engines/director/lingo/lingo-lex.l"
+#line 211 "engines/director/lingo/lingo-lex.l"
 { count(); return tLAST; }
 	YY_BREAK
 case 33:
 YY_RULE_SETUP
-#line 167 "engines/director/lingo/lingo-lex.l"
+#line 212 "engines/director/lingo/lingo-lex.l"
 { count(); return tLINE; }
 	YY_BREAK
 case 34:
 YY_RULE_SETUP
-#line 168 "engines/director/lingo/lingo-lex.l"
+#line 213 "engines/director/lingo/lingo-lex.l"
 { count(); return tLINES; }
 	YY_BREAK
 case 35:
 YY_RULE_SETUP
-#line 169 "engines/director/lingo/lingo-lex.l"
+#line 214 "engines/director/lingo/lingo-lex.l"
 { count(); return tLONG; }
 	YY_BREAK
 case 36:
 YY_RULE_SETUP
-#line 170 "engines/director/lingo/lingo-lex.l"
+#line 215 "engines/director/lingo/lingo-lex.l"
 { count(); return tMACRO; }
 	YY_BREAK
 case 37:
 YY_RULE_SETUP
-#line 171 "engines/director/lingo/lingo-lex.l"
+#line 216 "engines/director/lingo/lingo-lex.l"
 { count(); return tMENU; }
 	YY_BREAK
 case 38:
 YY_RULE_SETUP
-#line 172 "engines/director/lingo/lingo-lex.l"
+#line 217 "engines/director/lingo/lingo-lex.l"
 { count(); return tMENUITEM;}
 	YY_BREAK
 case 39:
 YY_RULE_SETUP
-#line 173 "engines/director/lingo/lingo-lex.l"
+#line 218 "engines/director/lingo/lingo-lex.l"
 { count(); return tMENUITEMS; }
 	YY_BREAK
 case 40:
 YY_RULE_SETUP
-#line 174 "engines/director/lingo/lingo-lex.l"
+#line 219 "engines/director/lingo/lingo-lex.l"
 { count(); return tMETHOD; }
 	YY_BREAK
 case 41:
 YY_RULE_SETUP
-#line 175 "engines/director/lingo/lingo-lex.l"
+#line 220 "engines/director/lingo/lingo-lex.l"
 { count(); return tMOD;}
 	YY_BREAK
 case 42:
 YY_RULE_SETUP
-#line 176 "engines/director/lingo/lingo-lex.l"
+#line 221 "engines/director/lingo/lingo-lex.l"
 { count(); return tMOVIE; }
 	YY_BREAK
 case 43:
 YY_RULE_SETUP
-#line 177 "engines/director/lingo/lingo-lex.l"
+#line 222 "engines/director/lingo/lingo-lex.l"
 { count(); return tNEXT; }
 	YY_BREAK
 case 44:
 YY_RULE_SETUP
-#line 178 "engines/director/lingo/lingo-lex.l"
+#line 223 "engines/director/lingo/lingo-lex.l"
 { count(); return tNOT; }
 	YY_BREAK
 case 45:
 YY_RULE_SETUP
-#line 179 "engines/director/lingo/lingo-lex.l"
+#line 224 "engines/director/lingo/lingo-lex.l"
 { count(); return tNUMBER; }
 	YY_BREAK
 case 46:
 YY_RULE_SETUP
-#line 180 "engines/director/lingo/lingo-lex.l"
+#line 225 "engines/director/lingo/lingo-lex.l"
 { count(); return tOF; }
 	YY_BREAK
 case 47:
 YY_RULE_SETUP
-#line 181 "engines/director/lingo/lingo-lex.l"
+#line 226 "engines/director/lingo/lingo-lex.l"
 { count(); return tON; }		// D3
 	YY_BREAK
 case 48:
 YY_RULE_SETUP
-#line 182 "engines/director/lingo/lingo-lex.l"
+#line 227 "engines/director/lingo/lingo-lex.l"
 { count(); return tOPEN; }
 	YY_BREAK
 case 49:
 YY_RULE_SETUP
-#line 183 "engines/director/lingo/lingo-lex.l"
+#line 228 "engines/director/lingo/lingo-lex.l"
 { count(); return tOR; }
 	YY_BREAK
 case 50:
 YY_RULE_SETUP
-#line 184 "engines/director/lingo/lingo-lex.l"
+#line 229 "engines/director/lingo/lingo-lex.l"
 { count(); return tPLAY; }
 	YY_BREAK
 case 51:
 YY_RULE_SETUP
-#line 185 "engines/director/lingo/lingo-lex.l"
+#line 230 "engines/director/lingo/lingo-lex.l"
 { count(); return tPREVIOUS; }
 	YY_BREAK
 case 52:
 YY_RULE_SETUP
-#line 186 "engines/director/lingo/lingo-lex.l"
+#line 231 "engines/director/lingo/lingo-lex.l"
 { count(); return tPROPERTY; }	// D4
 	YY_BREAK
 case 53:
 YY_RULE_SETUP
-#line 187 "engines/director/lingo/lingo-lex.l"
+#line 232 "engines/director/lingo/lingo-lex.l"
 { count(); return tPUT; }
 	YY_BREAK
 case 54:
 YY_RULE_SETUP
-#line 188 "engines/director/lingo/lingo-lex.l"
+#line 233 "engines/director/lingo/lingo-lex.l"
 { count(); return tREPEAT; }
 	YY_BREAK
 case 55:
 YY_RULE_SETUP
-#line 189 "engines/director/lingo/lingo-lex.l"
+#line 234 "engines/director/lingo/lingo-lex.l"
 { count(); return tSCRIPT; }
 	YY_BREAK
 case 56:
 YY_RULE_SETUP
-#line 190 "engines/director/lingo/lingo-lex.l"
+#line 235 "engines/director/lingo/lingo-lex.l"
 { count(); return tASSERTERROR; }
 	YY_BREAK
 case 57:
 YY_RULE_SETUP
-#line 191 "engines/director/lingo/lingo-lex.l"
+#line 236 "engines/director/lingo/lingo-lex.l"
 { count(); return tSET; }
 	YY_BREAK
 case 58:
 YY_RULE_SETUP
-#line 192 "engines/director/lingo/lingo-lex.l"
+#line 237 "engines/director/lingo/lingo-lex.l"
 { count(); return tSHORT; }
 	YY_BREAK
 case 59:
 YY_RULE_SETUP
-#line 193 "engines/director/lingo/lingo-lex.l"
+#line 238 "engines/director/lingo/lingo-lex.l"
 { count(); return tSOUND; }
 	YY_BREAK
 case 60:
 YY_RULE_SETUP
-#line 194 "engines/director/lingo/lingo-lex.l"
+#line 239 "engines/director/lingo/lingo-lex.l"
 { count(); return tSPRITE; }
 	YY_BREAK
 case 61:
 YY_RULE_SETUP
-#line 195 "engines/director/lingo/lingo-lex.l"
+#line 240 "engines/director/lingo/lingo-lex.l"
 { count(); return tSTARTS; }
 	YY_BREAK
 case 62:
 YY_RULE_SETUP
-#line 196 "engines/director/lingo/lingo-lex.l"
+#line 241 "engines/director/lingo/lingo-lex.l"
 { count(); return tTELL; }
 	YY_BREAK
 case 63:
 YY_RULE_SETUP
-#line 197 "engines/director/lingo/lingo-lex.l"
+#line 242 "engines/director/lingo/lingo-lex.l"
 { count(); return tTHE; }
 	YY_BREAK
 case 64:
 YY_RULE_SETUP
-#line 198 "engines/director/lingo/lingo-lex.l"
+#line 243 "engines/director/lingo/lingo-lex.l"
 { count(); return tTHEN; }
 	YY_BREAK
 case 65:
 YY_RULE_SETUP
-#line 199 "engines/director/lingo/lingo-lex.l"
+#line 244 "engines/director/lingo/lingo-lex.l"
 { count(); return tTIME; }
 	YY_BREAK
 case 66:
 YY_RULE_SETUP
-#line 200 "engines/director/lingo/lingo-lex.l"
+#line 245 "engines/director/lingo/lingo-lex.l"
 { count(); return tTO; }
 	YY_BREAK
 case 67:
 YY_RULE_SETUP
-#line 201 "engines/director/lingo/lingo-lex.l"
+#line 246 "engines/director/lingo/lingo-lex.l"
 {
 		count();
 
 		const char *ptr =  &yytext[5]; // Skip 'when '
-		while (*ptr == ' ' || *ptr == '\t' || *ptr == '\xC2') ptr++;
+		skipWhitespace(&ptr);
 
-		Common::String eventName;
-		while (*ptr != ' ' && *ptr != '\t' && *ptr != '\xC2')
-			eventName += *ptr++;
+		Common::String *eventName = readUntilWhitespace(&ptr);
 
-		while (*ptr == ' ' || *ptr == '\t' || *ptr == '\xC2') ptr++;
+		skipWhitespace(&ptr);
 		ptr += 5; // Skip 'then '
-		while (*ptr == ' ' || *ptr == '\t' || *ptr == '\xC2') ptr++;
+		skipWhitespace(&ptr);
 
-		Common::String stmt;
-		while (*ptr)
-			stmt += *ptr++;
+		Common::String *stmt = readUntilNull(&ptr);
 
-		yylval.w.eventName = new Common::String(eventName);
-		yylval.w.stmt = new Common::String(stmt);
+		yylval.w.eventName = eventName;
+		yylval.w.stmt = stmt;
 		return tWHEN;
 	}
 	YY_BREAK
 case 68:
 YY_RULE_SETUP
-#line 223 "engines/director/lingo/lingo-lex.l"
+#line 264 "engines/director/lingo/lingo-lex.l"
 { count(); return tWHILE; }
 	YY_BREAK
 case 69:
 YY_RULE_SETUP
-#line 224 "engines/director/lingo/lingo-lex.l"
+#line 265 "engines/director/lingo/lingo-lex.l"
 { count(); return tWINDOW; }
 	YY_BREAK
 case 70:
 YY_RULE_SETUP
-#line 225 "engines/director/lingo/lingo-lex.l"
+#line 266 "engines/director/lingo/lingo-lex.l"
 { count(); return tWITH; }
 	YY_BREAK
 case 71:
 YY_RULE_SETUP
-#line 226 "engines/director/lingo/lingo-lex.l"
+#line 267 "engines/director/lingo/lingo-lex.l"
 { count(); return tWITHIN; }
 	YY_BREAK
 case 72:
 YY_RULE_SETUP
-#line 227 "engines/director/lingo/lingo-lex.l"
+#line 268 "engines/director/lingo/lingo-lex.l"
 { count(); return tWORD; }
 	YY_BREAK
 case 73:
 YY_RULE_SETUP
-#line 228 "engines/director/lingo/lingo-lex.l"
+#line 269 "engines/director/lingo/lingo-lex.l"
 { count(); return tWORDS; }
 	YY_BREAK
 case 74:
 YY_RULE_SETUP
-#line 230 "engines/director/lingo/lingo-lex.l"
+#line 271 "engines/director/lingo/lingo-lex.l"
 { count(); return tNEQ; }
 	YY_BREAK
 case 75:
 YY_RULE_SETUP
-#line 231 "engines/director/lingo/lingo-lex.l"
+#line 272 "engines/director/lingo/lingo-lex.l"
 { count(); return tGE; }
 	YY_BREAK
 case 76:
 YY_RULE_SETUP
-#line 232 "engines/director/lingo/lingo-lex.l"
+#line 273 "engines/director/lingo/lingo-lex.l"
 { count(); return tLE; }
 	YY_BREAK
 case 77:
 YY_RULE_SETUP
-#line 233 "engines/director/lingo/lingo-lex.l"
+#line 274 "engines/director/lingo/lingo-lex.l"
 { count(); return tCONCAT; }
 	YY_BREAK
 case 78:
 YY_RULE_SETUP
-#line 234 "engines/director/lingo/lingo-lex.l"
+#line 275 "engines/director/lingo/lingo-lex.l"
 { count(); return tEQ; }
 	YY_BREAK
 case 79:
 YY_RULE_SETUP
-#line 236 "engines/director/lingo/lingo-lex.l"
+#line 277 "engines/director/lingo/lingo-lex.l"
 {
 		count();
 		yylval.s = new Common::String(yytext);
@@ -1532,41 +1597,41 @@ YY_RULE_SETUP
 	YY_BREAK
 case 80:
 YY_RULE_SETUP
-#line 242 "engines/director/lingo/lingo-lex.l"
+#line 283 "engines/director/lingo/lingo-lex.l"
 { count(); yylval.f = atof(yytext); return tFLOAT; }
 	YY_BREAK
 case 81:
 YY_RULE_SETUP
-#line 243 "engines/director/lingo/lingo-lex.l"
+#line 284 "engines/director/lingo/lingo-lex.l"
 { count(); yylval.i = strtol(yytext, NULL, 10); return tINT; }
 	YY_BREAK
 case 82:
 YY_RULE_SETUP
-#line 244 "engines/director/lingo/lingo-lex.l"
+#line 285 "engines/director/lingo/lingo-lex.l"
 { count(); return *yytext; }
 	YY_BREAK
 case 83:
 /* rule 83 can match eol */
 YY_RULE_SETUP
-#line 245 "engines/director/lingo/lingo-lex.l"
+#line 286 "engines/director/lingo/lingo-lex.l"
 { count(); return '\n'; }
 	YY_BREAK
 case 84:
 YY_RULE_SETUP
-#line 246 "engines/director/lingo/lingo-lex.l"
+#line 287 "engines/director/lingo/lingo-lex.l"
 { count(); yylval.s = cleanupString(&yytext[1]); yylval.s->deleteLastChar(); return tSTRING; }
 	YY_BREAK
 case 85:
 YY_RULE_SETUP
-#line 247 "engines/director/lingo/lingo-lex.l"
+#line 288 "engines/director/lingo/lingo-lex.l"
 { count(); }
 	YY_BREAK
 case 86:
 YY_RULE_SETUP
-#line 249 "engines/director/lingo/lingo-lex.l"
+#line 290 "engines/director/lingo/lingo-lex.l"
 ECHO;
 	YY_BREAK
-#line 1569 "engines/director/lingo/lingo-lex.cpp"
+#line 1634 "engines/director/lingo/lingo-lex.cpp"
 case YY_STATE_EOF(INITIAL):
 	yyterminate();
 
@@ -1865,7 +1930,7 @@ static int yy_get_next_buffer (void)
 		while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
 			{
 			yy_current_state = (int) yy_def[yy_current_state];
-			if ( yy_current_state >= 342 )
+			if ( yy_current_state >= 352 )
 				yy_c = yy_meta[yy_c];
 			}
 		yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
@@ -1893,11 +1958,11 @@ static int yy_get_next_buffer (void)
 	while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
 		{
 		yy_current_state = (int) yy_def[yy_current_state];
-		if ( yy_current_state >= 342 )
+		if ( yy_current_state >= 352 )
 			yy_c = yy_meta[yy_c];
 		}
 	yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
-	yy_is_jam = (yy_current_state == 341);
+	yy_is_jam = (yy_current_state == 351);
 
 		return yy_is_jam ? 0 : yy_current_state;
 }
@@ -2538,7 +2603,7 @@ void yyfree (void * ptr )
 
 #define YYTABLES_NAME "yytables"
 
-#line 249 "engines/director/lingo/lingo-lex.l"
+#line 290 "engines/director/lingo/lingo-lex.l"
 
 
 extern int yydebug;
diff --git a/engines/director/lingo/lingo-lex.l b/engines/director/lingo/lingo-lex.l
index b0cb1edeed..7511fe322b 100644
--- a/engines/director/lingo/lingo-lex.l
+++ b/engines/director/lingo/lingo-lex.l
@@ -69,12 +69,13 @@ static void count() {
 	char *p = yytext;
 
 	while (*p) {
-		if (*p == '\n' || *p == '\xC2') {
+		if (*p == '\n') {
+			compiler->_linenumber++;
+			compiler->_colnumber = 0;
+			pushLine(compiler->_bytenumber + 1);
+		} else if (*p == '\xC2' && *(p + 1) == '\xAC') { // continuation
 			compiler->_linenumber++;
 			compiler->_colnumber = 0;
-
-			if (*p == '\n')
-				pushLine(compiler->_bytenumber + 1);
 		} else {
 			compiler->_colnumber++;
 		}
@@ -87,9 +88,9 @@ static Common::String *cleanupString(const char *s) {
 	Common::String *res = new Common::String;
 
 	while (*s) {
-		if (*s == '\xC2') {
-			s++;
-			*res += ' ';
+		if (*s == '\xC2' && *(s + 1) == '\xAC') { // continuation
+			s += 2;
+			*res += ' '; // replace with space
 			continue;
 		}
 		*res += *s;
@@ -99,6 +100,51 @@ static Common::String *cleanupString(const char *s) {
 	return res;
 }
 
+static void skipWhitespace(const char **ptr) {
+	while (true) {
+		if (**ptr == ' ' || **ptr == '\t') {
+			*ptr += 1;
+		} else if (**ptr == '\xC2' && *(*ptr + 1) == '\xAC') { // continuation
+			*ptr += 2;
+		} else {
+			break;
+		}
+	}
+}
+
+static Common::String *readUntilWhitespace(const char **ptr) {
+	Common::String *res = new Common::String;
+
+	while (true) {
+		if (**ptr == ' ' || **ptr == '\t') {
+			break;
+		}
+		if (**ptr == '\xC2' && *(*ptr + 1) == '\xAC') { // continuation
+			break;
+		}
+		*res += **ptr;
+		*ptr += 1;
+	}
+
+	return res;
+}
+
+static Common::String *readUntilNull(const char **ptr) {
+	Common::String *res = new Common::String;
+
+	while (**ptr) {
+		if (**ptr == '\xC2' && *(*ptr + 1) == '\xAC') { // continuation
+			*ptr += 2;
+			*res += ' '; // replace with space
+			continue;
+		}
+		*res += **ptr;
+		*ptr += 1;
+	}
+
+	return res;
+}
+
 %}
 
 identifier [_[:alpha:]][_[:alnum:]]*
@@ -106,8 +152,8 @@ constfloat [[:digit:]]+\.[[:digit:]]*
 constinteger [[:digit:]]+
 conststring \"[^\"\r\n]*\"
 operator [-+*/%^:,()><&\[\]]
-newline [ \t\xC2]*[\n\r]
-spc [ \t\xC2]
+newline (" "|\t|\xC2\xAC)*[\n\r]
+spc (" "|\t|\xC2\xAC)
 eventname (keyDown|keyUp|mouseDown|mouseUp|timeOut)
 unparsedstmt [^\r\n]*
 
@@ -135,8 +181,7 @@ end({spc}+{identifier})?	{
 		count();
 
 		const char *ptr = &yytext[3]; // Skip 'end '
-		while (*ptr == ' ' || *ptr == '\t' || *ptr == '\xC2')
-			ptr++;
+		skipWhitespace(&ptr);
 
 		if (!scumm_stricmp(ptr, "if"))
 			return tENDIF;
@@ -202,22 +247,18 @@ when{spc}+{eventname}{spc}+then{spc}+{unparsedstmt}	{
 		count();
 
 		const char *ptr =  &yytext[5]; // Skip 'when '
-		while (*ptr == ' ' || *ptr == '\t' || *ptr == '\xC2') ptr++;
+		skipWhitespace(&ptr);
 
-		Common::String eventName;
-		while (*ptr != ' ' && *ptr != '\t' && *ptr != '\xC2')
-			eventName += *ptr++;
+		Common::String *eventName = readUntilWhitespace(&ptr);
 
-		while (*ptr == ' ' || *ptr == '\t' || *ptr == '\xC2') ptr++;
+		skipWhitespace(&ptr);
 		ptr += 5; // Skip 'then '
-		while (*ptr == ' ' || *ptr == '\t' || *ptr == '\xC2') ptr++;
+		skipWhitespace(&ptr);
 
-		Common::String stmt;
-		while (*ptr)
-			stmt += *ptr++;
+		Common::String *stmt = readUntilNull(&ptr);
 
-		yylval.w.eventName = new Common::String(eventName);
-		yylval.w.stmt = new Common::String(stmt);
+		yylval.w.eventName = eventName;
+		yylval.w.stmt = stmt;
 		return tWHEN;
 	}
 while		{ count(); return tWHILE; }
diff --git a/engines/director/lingo/lingo-object.cpp b/engines/director/lingo/lingo-object.cpp
index 99e7d57961..342c519940 100644
--- a/engines/director/lingo/lingo-object.cpp
+++ b/engines/director/lingo/lingo-object.cpp
@@ -676,7 +676,7 @@ bool CastMember::setField(int field, const Datum &d) {
 			warning("CastMember::setField(): CastMember info for %d not found", _castId);
 			return false;
 		}
-		_cast->_lingoArchive->addCode(d.u.s->c_str(), kCastScript, _castId);
+		_cast->_lingoArchive->addCode(*d.u.s, kCastScript, _castId);
 		castInfo->script = d.asString();
 		return true;
 	case kTheWidth:
@@ -883,7 +883,7 @@ Datum TextCastMember::getField(int field) {
 		d = _hilite;
 		break;
 	case kTheText:
-		d = getText().encode(Common::kMacRoman); // FIXME: Properly handle encoding
+		d = getText().encode(Common::kUtf8);
 		break;
 	case kTheTextAlign:
 		d.type = STRING;
@@ -944,7 +944,7 @@ bool TextCastMember::setField(int field, const Datum &d) {
 		}
 		break;
 	case kTheText:
-		setText(Common::U32String(d.asString(), Common::kMacRoman)); // FIXME: Properly handle encoding
+		setText(d.asString());
 		return true;
 	case kTheTextAlign:
 		{
diff --git a/engines/director/lingo/lingo-patcher.cpp b/engines/director/lingo/lingo-patcher.cpp
index 21ab06333a..67b118a0ff 100644
--- a/engines/director/lingo/lingo-patcher.cpp
+++ b/engines/director/lingo/lingo-patcher.cpp
@@ -147,7 +147,7 @@ struct ScriptPatch {
 	{nullptr, nullptr, kPlatformUnknown, nullptr, kNoneScript, 0, 0, 0, nullptr, nullptr}
 };
 
-Common::String LingoCompiler::patchLingoCode(Common::String &line, LingoArchive *archive, ScriptType type, CastMemberID id, int linenum) {
+Common::U32String LingoCompiler::patchLingoCode(const Common::U32String &line, LingoArchive *archive, ScriptType type, CastMemberID id, int linenum) {
 	if (!archive)
 		return line;
 
@@ -171,10 +171,10 @@ Common::String LingoCompiler::patchLingoCode(Common::String &line, LingoArchive
 		}
 
 		// Now do a safeguard
-		if (!line.contains(patch->orig)) {
+		if (!line.contains(Common::U32String(patch->orig))) {
 			warning("Lingo::patchLingoCode(): Unmatched patch for '%s', '%s' %s:%s @ %d. Expecting '%s' but got '%s'",
 					patch->gameId, patch->movie, scriptType2str(type), id.asString().c_str(), linenum,
-					patch->orig, line.c_str());
+					patch->orig, line.encode().c_str());
 			return line;
 		}
 
@@ -182,7 +182,7 @@ Common::String LingoCompiler::patchLingoCode(Common::String &line, LingoArchive
 		warning("Lingo::patchLingoCode(): Applied a patch for '%s', '%s' %s:%s @ %d. \"%s\" -> \"%s\"",
 				patch->gameId, patch->movie, scriptType2str(type), id.asString().c_str(), linenum,
 				patch->orig, patch->replace);
-		return patch->replace;
+		return Common::U32String(patch->replace);
 	}
 
 	return line;
diff --git a/engines/director/lingo/lingo-preprocessor.cpp b/engines/director/lingo/lingo-preprocessor.cpp
index 60f34df296..9c6a172815 100644
--- a/engines/director/lingo/lingo-preprocessor.cpp
+++ b/engines/director/lingo/lingo-preprocessor.cpp
@@ -26,15 +26,36 @@
 
 namespace Director {
 
-bool isspec(char c) {
-	return strchr("-+*/%%^:,()><&[]=", c) != NULL;
+bool isspec(Common::u32char_type_t c) {
+	switch (c) {
+	case '-':
+	case '+':
+	case '*':
+	case '/':
+	case '%':
+	case '^':
+	case ':':
+	case ',':
+	case '(':
+	case ')':
+	case '>':
+	case '<':
+	case '&':
+	case '[':
+	case ']':
+	case '=':
+		return true;
+	default:
+		break;
+	}
+	return false;
 }
 
-static Common::String nexttok(const char *s, const char **newP = nullptr) {
-	Common::String res;
+static Common::U32String nexttok(const Common::u32char_type_t *s, const Common::u32char_type_t **newP = nullptr) {
+	Common::U32String res;
 
 	// Scan first non-whitespace
-	while (*s && (*s == ' ' || *s == '\t' || *s == '\xC2')) // If we see a whitespace
+	while (*s && (*s == ' ' || *s == '\t' || *s == CONTINUATION)) // If we see a whitespace
 		s++;
 
 	if (*s == '"') { // If it is a string then scan till end quote
@@ -60,15 +81,17 @@ static Common::String nexttok(const char *s, const char **newP = nullptr) {
 	return res;
 }
 
-Common::String LingoCompiler::codePreprocessor(const char *s, LingoArchive *archive, ScriptType type, CastMemberID id, bool simple) {
-	Common::String res;
+Common::U32String LingoCompiler::codePreprocessor(const Common::U32String &code, LingoArchive *archive, ScriptType type, CastMemberID id, bool simple) {
+	const Common::u32char_type_t *s = code.c_str();
+	Common::U32String res;
 
-	// We start from processing the continuation synbols
-	// \xC2\n  ->  \xC2
+	// We start from processing the continuation symbols
+	// (The continuation symbol is \xC2 in Mac Roman, \xAC in Unicode.)
+	// \xAC\n  ->  \xAC
 	// This will greatly simplify newline processing, still leaving
 	// the line number tracking intact
 	while (*s) {
-		if (*s == '\xC2') {
+		if (*s == CONTINUATION) {
 			res += *s++;
 			if (!*s)	// Who knows, maybe it is the last symbol in the script
 				break;
@@ -78,7 +101,7 @@ Common::String LingoCompiler::codePreprocessor(const char *s, LingoArchive *arch
 		res += *s++;
 	}
 
-	Common::String tmp(res);
+	Common::U32String tmp(res);
 	res.clear();
 	s = tmp.c_str();
 
@@ -89,7 +112,7 @@ Common::String LingoCompiler::codePreprocessor(const char *s, LingoArchive *arch
 			inString = !inString;
 
 		if (!inString && *s == '-' && *(s + 1) == '-') { // At the end of the line we will have \0
-			while (*s && *s != '\n')
+			while (*s && *s != '\r' && *s != '\n')
 				s++;
 		}
 
@@ -108,10 +131,10 @@ Common::String LingoCompiler::codePreprocessor(const char *s, LingoArchive *arch
 	// Strip trailing whitespaces
 	s = tmp.c_str();
 	while (*s) {
-		if (*s == ' ' || *s == '\t' || *s == '\xC2') { // If we see a whitespace
-			const char *ps = s; // Remember where we saw it
+		if (*s == ' ' || *s == '\t' || *s == CONTINUATION) { // If we see a whitespace
+			const Common::u32char_type_t *ps = s; // Remember where we saw it
 
-			while (*ps == ' ' || *ps == '\t' || *ps == '\xC2') // Scan until end of whitespaces
+			while (*ps == ' ' || *ps == '\t' || *ps == CONTINUATION) // Scan until end of whitespaces
 				ps++;
 
 			if (*ps) {	// Not end of the string
@@ -139,10 +162,12 @@ Common::String LingoCompiler::codePreprocessor(const char *s, LingoArchive *arch
 	s = tmp.c_str();
 	res.clear();
 
-	Common::String line, tok, res1;
+	Common::U32String line, tok, res1;
 	int linenumber = 1;
 	bool defFound = false;
 
+	const Common::U32String macro("macro"), factory("factory"), on("on");
+
 	while (*s) {
 		line.clear();
 		res1.clear();
@@ -152,14 +177,14 @@ Common::String LingoCompiler::codePreprocessor(const char *s, LingoArchive *arch
 			res1 += *s;
 			line += tolower(*s++);
 
-			if (*s == '\xc2')
+			if (*s == CONTINUATION)
 				linenumber++;
 		}
-		debugC(2, kDebugParse | kDebugPreprocess, "line: '%s'", line.c_str());
+		debugC(2, kDebugParse | kDebugPreprocess, "line: '%s'", line.encode().c_str());
 
 		if (!defFound && (type == kMovieScript || type == kCastScript) && (g_director->getVersion() < 400 || g_director->getCurrentMovie()->_allowOutdatedLingo)) {
 			tok = nexttok(line.c_str());
-			if (tok.equals("macro") || tok.equals("factory") || tok.equals("on")) {
+			if (tok.equals(macro) || tok.equals(factory) || tok.equals(on)) {
 				defFound = true;
 			} else {
 				debugC(2, kDebugParse | kDebugPreprocess, "skipping line before first definition");
@@ -183,7 +208,7 @@ Common::String LingoCompiler::codePreprocessor(const char *s, LingoArchive *arch
 	// Make the parser happier when there is no newline at the end
 	res += '\n';
 
-	debugC(2, kDebugParse | kDebugPreprocess, "#############\n%s\n#############", res.c_str());
+	debugC(2, kDebugParse | kDebugPreprocess, "#############\n%s\n#############", res.encode().c_str());
 
 	return res;
 }
diff --git a/engines/director/lingo/lingo.cpp b/engines/director/lingo/lingo.cpp
index 9385c7b84c..443d00171e 100644
--- a/engines/director/lingo/lingo.cpp
+++ b/engines/director/lingo/lingo.cpp
@@ -246,9 +246,9 @@ Symbol Lingo::getHandler(const Common::String &name) {
 	return Symbol();
 }
 
-void LingoArchive::addCode(const char *code, ScriptType type, uint16 id, const char *scriptName) {
+void LingoArchive::addCode(const Common::U32String &code, ScriptType type, uint16 id, const char *scriptName) {
 	debugC(1, kDebugCompile, "Add code for type %s(%d) with id %d in '%s%s'\n"
-			"***********\n%s\n\n***********", scriptType2str(type), type, id, g_director->getCurrentPath().c_str(), cast->getMacName().c_str(), code);
+			"***********\n%s\n\n***********", scriptType2str(type), type, id, g_director->getCurrentPath().c_str(), cast->getMacName().c_str(), code.encode().c_str());
 
 	if (getScriptContext(type, id)) {
 		// We can't undefine context data because it could be used in e.g. symbols.
@@ -1022,7 +1022,7 @@ void Lingo::runTests() {
 
 			debug(">> Compiling file %s of size %d, id: %d", fileList[i].c_str(), size, counter);
 
-			mainArchive->addCode(script, kTestScript, counter);
+			mainArchive->addCode(Common::U32String(script, Common::kMacRoman), kTestScript, counter);
 
 			if (!debugChannelSet(-1, kDebugCompileOnly)) {
 				if (!_compiler->_hadError)
@@ -1166,7 +1166,7 @@ void Lingo::varAssign(const Datum &var, const Datum &value) {
 			}
 			switch (member->_type) {
 			case kCastText:
-				((TextCastMember *)member)->setText(Common::U32String(value.asString(), Common::kMacRoman)); // FIXME: Properly handle encoding
+				((TextCastMember *)member)->setText(value.asString());
 				break;
 			default:
 				warning("varAssign: Unhandled cast type %d", member->_type);
@@ -1287,7 +1287,7 @@ Datum Lingo::varFetch(const Datum &var, bool silent) {
 			switch (member->_type) {
 			case kCastText:
 				result.type = STRING;
-				result.u.s = new Common::String(((TextCastMember *)member)->getText().encode(Common::kMacRoman)); // FIXME: Properly handle encoding
+				result.u.s = new Common::String(((TextCastMember *)member)->getText().encode(Common::kUtf8));
 				break;
 			default:
 				warning("varFetch: Unhandled cast type %d", member->_type);
diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h
index 61194f7d63..7e1a3a6b37 100644
--- a/engines/director/lingo/lingo.h
+++ b/engines/director/lingo/lingo.h
@@ -238,7 +238,7 @@ struct LingoArchive {
 	ScriptContext *getScriptContext(ScriptType type, uint16 id);
 	Common::String getName(uint16 id);
 
-	void addCode(const char *code, ScriptType type, uint16 id, const char *scriptName = nullptr);
+	void addCode(const Common::U32String &code, ScriptType type, uint16 id, const char *scriptName = nullptr);
 	void addCodeV4(Common::SeekableReadStreamEndian &stream, uint16 lctxIndex, const Common::String &archName, uint16 version);
 	void addNamesV4(Common::SeekableReadStreamEndian &stream);
 };
diff --git a/engines/director/movie.cpp b/engines/director/movie.cpp
index e4864ee0ed..3dbf962f89 100644
--- a/engines/director/movie.cpp
+++ b/engines/director/movie.cpp
@@ -236,7 +236,7 @@ void Movie::loadFileInfo(Common::SeekableReadStreamEndian &stream) {
 		_cast->dumpScript(_script.c_str(), kMovieScript, 0);
 
 	if (!_script.empty())
-		_cast->_lingoArchive->addCode(_script.c_str(), kMovieScript, 0);
+		_cast->_lingoArchive->addCode(_script, kMovieScript, 0);
 
 	_changedBy = fileInfo.strings[1].readString();
 	_createdBy = fileInfo.strings[2].readString();
@@ -388,13 +388,45 @@ Common::String InfoEntry::readString(bool pascal) {
 	if (len == 0)
 		return res;
 
-	int start = pascal ? 1 : 0;
+	uint start = pascal ? 1 : 0; // skip length for Pascal string
 
-	for (uint i = start; i < len; i++)
-		if (data[i] == '\r')
-			res += '\n';
-		else if (data[i] >= 0x20)
-			res += data[i];
+	Common::String encodedStr;
+	if (g_director->getLanguage() == Common::JA_JPN) {
+		for (uint i = start; i < len; i++) {
+			if (!Common::isCntrl(data[i]) || Common::isSpace(data[i]))
+				encodedStr += data[i];
+		}
+		res = encodedStr.decode(Common::kWindows932).encode(Common::kUtf8);
+	} else {
+		// FIXME: Get the platform and FXmp from the cast which contains this, not the current movie.
+		if (g_director->getCurrentMovie()->_platform == Common::kPlatformWindows) {
+			/**
+			 * Director for Windows stores these strings in a screwed up version of Mac Roman
+			 * We need to map this screwed up Mac Roman back to Windows-1252 before using it.
+			 * Comment from FXmp:
+			 *   Note: Some characters are not available in both character sets.
+			 *   However, the bi-directional mapping table below preserves these
+			 *   characters even if they are mapped to a different platform and
+			 *   later re-mapped back to the original platform.
+			 */
+			CharMap &charMap = g_director->getCurrentMovie()->getCast()->_macCharsToWin;
+			for (uint i = start; i < len; i++) {
+				if (!Common::isCntrl(data[i]) || Common::isSpace(data[i])) {
+					if (charMap.contains(data[i]))
+						encodedStr += charMap[data[i]];
+					else
+						encodedStr += data[i];
+				}
+			}
+			res = encodedStr.decode(Common::kWindows1252).encode(Common::kUtf8);
+		} else {
+			for (uint i = start; i < len; i++) {
+				if (!Common::isCntrl(data[i]) || Common::isSpace(data[i]))
+					encodedStr += data[i];
+			}
+			res = encodedStr.decode(Common::kMacRoman).encode(Common::kUtf8);
+		}
+	}
 
 	return res;
 }
diff --git a/engines/director/resource.cpp b/engines/director/resource.cpp
index 02396c2094..635b8882e0 100644
--- a/engines/director/resource.cpp
+++ b/engines/director/resource.cpp
@@ -175,7 +175,7 @@ void Window::loadEXE(const Common::String movie) {
 		iniStream->read(script, iniStream->size());
 
 		_currentMovie = new Movie(this);
-		_currentMovie->getMainLingoArch()->addCode(script, kMovieScript, 0);
+		_currentMovie->getMainLingoArch()->addCode(Common::U32String(script, Common::kWindows1252), kMovieScript, 0);
 		_currentMovie->processEvent(kEventStartUp);
 		delete _currentMovie;
 		_currentMovie = nullptr;
diff --git a/engines/director/score.cpp b/engines/director/score.cpp
index 89b914e79d..09f409b87f 100644
--- a/engines/director/score.cpp
+++ b/engines/director/score.cpp
@@ -936,15 +936,8 @@ void Score::loadActions(Common::SeekableReadStreamEndian &stream) {
 
 		stream.seek(stringPos);
 
-		Common::String script;
-		for (uint16 j = stringPos; j < nextStringPos; j++) {
-			byte ch = stream.readByte();
-			if (ch == 0x0d) {
-				ch = '\n';
-			}
-			script += ch;
-		}
-		_actions[i] = script;
+		Common::String script = stream.readString(0, nextStringPos - stringPos);
+		_actions[i] = script.decode(Common::kMacRoman).encode(Common::kUtf8);
 
 		debugC(3, kDebugLoading, "Action index: %d id: %d nextId: %d subId: %d, code: %s", i, id, nextId, subId, _actions[i].c_str());
 
@@ -983,8 +976,9 @@ void Score::loadActions(Common::SeekableReadStreamEndian &stream) {
 		if (!scriptRefs[j->_key]) {
 			// Check if it is empty
 			bool empty = true;
-			for (const char *ptr = j->_value.c_str(); *ptr; ptr++)
-				if (!(*ptr == ' ' || *ptr == '-' || *ptr == '\n' || *ptr == '\r' || *ptr == '\t' || *ptr == '\xc2')) {
+			Common::U32String u32Script(j->_value);
+			for (const Common::u32char_type_t *ptr = u32Script.c_str(); *ptr; ptr++)
+				if (!(*ptr == ' ' || *ptr == '-' || *ptr == '\n' || *ptr == '\r' || *ptr == '\t' || *ptr == CONTINUATION)) {
 					empty = false;
 					break;
 				}
@@ -995,7 +989,7 @@ void Score::loadActions(Common::SeekableReadStreamEndian &stream) {
 			continue;
 		}
 		if (!j->_value.empty()) {
-			_movie->getMainLingoArch()->addCode(j->_value.c_str(), kScoreScript, j->_key);
+			_movie->getMainLingoArch()->addCode(j->_value, kScoreScript, j->_key);
 
 			processImmediateFrameScript(j->_value, j->_key);
 		}
diff --git a/engines/director/types.h b/engines/director/types.h
index 78c9e702d7..4cfb475051 100644
--- a/engines/director/types.h
+++ b/engines/director/types.h
@@ -25,6 +25,8 @@
 
 namespace Director {
 
+#define CONTINUATION (0xAC)
+
 enum MovieFlag {
 	kMovieFlagAllowOutdatedLingo	= (1 << 8)
 };


Commit: 52af0ac82e3f1dfd4a2eb9420a14c35634681c2c
    https://github.com/scummvm/scummvm/commit/52af0ac82e3f1dfd4a2eb9420a14c35634681c2c
Author: djsrv (dservilla at gmail.com)
Date: 2021-07-15T16:31:47-04:00

Commit Message:
DIRECTOR: Create DirectorEngine::getPlatformEncoding

Changed paths:
    engines/director/director.h
    engines/director/stxt.cpp
    engines/director/util.cpp
    engines/director/util.h


diff --git a/engines/director/director.h b/engines/director/director.h
index 3a807599e6..542439ffd8 100644
--- a/engines/director/director.h
+++ b/engines/director/director.h
@@ -226,6 +226,7 @@ public:
 	Graphics::MacDrawPixPtr getInkDrawPixel();
 
 	void loadKeyCodes();
+	Common::CodePage getPlatformEncoding();
 
 	Archive *createArchive();
 
diff --git a/engines/director/stxt.cpp b/engines/director/stxt.cpp
index 0daef8f36e..ba4a824297 100644
--- a/engines/director/stxt.cpp
+++ b/engines/director/stxt.cpp
@@ -84,7 +84,7 @@ Stxt::Stxt(Cast *cast, Common::SeekableReadStreamEndian &textStream) : _cast(cas
 
 			prevPos++;
 		}
-		Common::CodePage encoding = detectEncoding(cast->_platform, currentFont);
+		Common::CodePage encoding = detectFontEncoding(cast->_platform, currentFont);
 		Common::U32String u32TextPart(textPart, encoding);
 		_ptext += u32TextPart;
 		_ftext += u32TextPart;
@@ -97,7 +97,7 @@ Stxt::Stxt(Cast *cast, Common::SeekableReadStreamEndian &textStream) : _cast(cas
 		formattingCount--;
 	}
 
-	Common::CodePage encoding = detectEncoding(cast->_platform, _style.fontId);
+	Common::CodePage encoding = detectFontEncoding(cast->_platform, _style.fontId);
 	Common::U32String u32Text(text, encoding);
 	_ptext += u32Text;
 	_ftext += u32Text;
diff --git a/engines/director/util.cpp b/engines/director/util.cpp
index c722163fd5..133809832b 100644
--- a/engines/director/util.cpp
+++ b/engines/director/util.cpp
@@ -768,9 +768,8 @@ Common::Platform platformFromID(uint16 id) {
 	return Common::kPlatformUnknown;
 }
 
-Common::CodePage detectEncoding(Common::Platform platform, uint16 fontId) {
-	Common::Language lang = g_director->_wm->_fontMan->getFontLanguage(fontId);
-	switch (lang) {
+Common::CodePage getEncoding(Common::Platform platform, Common::Language language) {
+	switch (language) {
 	case Common::JA_JPN:
 		return Common::kWindows932; // Shift JIS
 	default:
@@ -781,4 +780,12 @@ Common::CodePage detectEncoding(Common::Platform platform, uint16 fontId) {
 				: Common::kMacRoman;
 }
 
+Common::CodePage detectFontEncoding(Common::Platform platform, uint16 fontId) {
+	return getEncoding(platform, g_director->_wm->_fontMan->getFontLanguage(fontId));
+}
+
+Common::CodePage DirectorEngine::getPlatformEncoding() {
+	return getEncoding(getPlatform(), getLanguage());
+}
+
 } // End of namespace Director
diff --git a/engines/director/util.h b/engines/director/util.h
index 509de8a3bc..fe71aeb863 100644
--- a/engines/director/util.h
+++ b/engines/director/util.h
@@ -84,7 +84,8 @@ uint16 humanVersion(uint16 ver);
 
 Common::Platform platformFromID(uint16 id);
 
-Common::CodePage detectEncoding(Common::Platform platform, uint16 fontId);
+Common::CodePage getEncoding(Common::Platform platform, Common::Language language);
+Common::CodePage detectFontEncoding(Common::Platform platform, uint16 fontId);
 
 } // End of namespace Director
 


Commit: 19895f877df2bf2e165a3031dda0f636796d3ef6
    https://github.com/scummvm/scummvm/commit/19895f877df2bf2e165a3031dda0f636796d3ef6
Author: djsrv (dservilla at gmail.com)
Date: 2021-07-15T16:31:47-04:00

Commit Message:
DIRECTOR: LINGO: Make text builtins handle Unicode

Changed paths:
    engines/director/lingo/lingo-builtins.cpp


diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index bb02682b5f..24ffc39b3c 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -459,20 +459,19 @@ void LB::b_chars(int nargs) {
 	int to = d3.asInt();
 	int from = d2.asInt();
 
-	Common::String src = s.asString();
+	Common::U32String src = s.asString().decode(Common::kUtf8);
 
-	int len = strlen(src.c_str());
+	int len = src.size();
 	int f = MAX(0, MIN(len, from - 1));
 	int t = MAX(0, MIN(len, to));
 
-	Common::String result;
+	Common::String res;
 	if (f > t) {
-		result = Common::String("");
+		res = Common::String("");
 	} else {
-		result = Common::String(&(src.c_str()[f]), &(src.c_str()[t]));
+		res = src.substr(f, t - f).encode(Common::kUtf8);
 	}
 
-	Datum res(result);
 	g_lingo->push(res);
 }
 
@@ -481,9 +480,19 @@ void LB::b_charToNum(int nargs) {
 
 	TYPECHECK(d, STRING);
 
-	int chr = (uint8)d.u.s->c_str()[0];
+	Common::U32String src = d.asString().decode(Common::kUtf8);
+	if (src.size() == 0) {
+		g_lingo->push(0);
+		return;
+	}
 
-	Datum res(chr);
+	Common::U32String ch = src.substr(0, 1);
+	Common::String encodedCh = ch.encode(g_director->getPlatformEncoding());
+	int res = 0;
+	while (encodedCh.size()) {
+		res = (res << 8) | (byte)encodedCh.firstChar();
+		encodedCh.deleteChar(0);
+	}
 	g_lingo->push(res);
 }
 
@@ -491,20 +500,28 @@ void LB::b_length(int nargs) {
 	Datum d = g_lingo->pop();
 	TYPECHECK(d, STRING);
 
-	int len = strlen(d.asString().c_str());
-
-	Datum res(len);
+	Common::U32String src = d.asString().decode(Common::kUtf8);
+	int res = src.size();
 	g_lingo->push(res);
 }
 
 void LB::b_numToChar(int nargs) {
-	Datum d = g_lingo->pop();
+	int num = g_lingo->pop().asInt();
+	if (num == 0) {
+		g_lingo->push(Common::String());
+		return;
+	}
 
-	char result[2];
-	result[0] = (char)d.asInt();
-	result[1] = 0;
+	Common::String encodedCh;
+	while (num) {
+		encodedCh.insertChar((char)(num & 0xFF), 0);
+		num >>= 8;
+	}
+	Common::U32String ch = encodedCh.decode(g_director->getPlatformEncoding());
+	while (ch.size() > 1) // we only want one character
+		ch.deleteChar(0);
 
-	g_lingo->push(Datum(Common::String(result)));
+	g_lingo->push(ch.encode(Common::kUtf8));
 }
 
 void LB::b_offset(int nargs) {


Commit: 860a8d663a35ae9e6ac7efb097ef3a68f1010c33
    https://github.com/scummvm/scummvm/commit/860a8d663a35ae9e6ac7efb097ef3a68f1010c33
Author: djsrv (dservilla at gmail.com)
Date: 2021-07-15T16:31:47-04:00

Commit Message:
DIRECTOR: LINGO: Make chunk refs handle Unicode

Changed paths:
    engines/director/lingo/lingo-code.cpp
    engines/director/lingo/lingo.cpp
    engines/director/lingo/lingo.h


diff --git a/engines/director/lingo/lingo-code.cpp b/engines/director/lingo/lingo-code.cpp
index 6ae505bfb8..21a7509745 100644
--- a/engines/director/lingo/lingo-code.cpp
+++ b/engines/director/lingo/lingo-code.cpp
@@ -884,7 +884,7 @@ Datum LC::chunkRef(ChunkType type, int startChunk, int endChunk, const Datum &sr
 	if (endChunk < 1 || startChunk == -30000)
 		endChunk = startChunk;
 
-	Common::String str = src.eval().asString();
+	Common::U32String str = g_lingo->evalChunkRef(src);
 
 	// these hold the bounds of the last chunk in the expression
 	int chunkNum = 0;
@@ -944,7 +944,7 @@ Datum LC::chunkRef(ChunkType type, int startChunk, int endChunk, const Datum &sr
 	case kChunkItem:
 	case kChunkLine:
 		{
-			char delimiter = (type == kChunkItem) ? g_lingo->_itemDelimiter : '\n';
+			Common::u32char_type_t delimiter = (type == kChunkItem) ? g_lingo->_itemDelimiter : '\n';
 
 			int idx = 0;
 			while (true) {
@@ -1605,7 +1605,7 @@ void LC::c_delete() {
 	if (start < 0)
 		return;
 
-	Common::String text = g_lingo->varFetch(field).asString();
+	Common::U32String text = g_lingo->evalChunkRef(field);
 	if (d.type == CHUNKREF) {
 		switch (d.u.cref->type) {
 		case kChunkChar:
@@ -1623,12 +1623,12 @@ void LC::c_delete() {
 		}
 	}
 
-	Common::String res = text.substr(0, start);
+	Common::U32String res = text.substr(0, start);
 	if (end >= 0) {
 		res += text.substr(end);
 	}
 	Datum s;
-	s.u.s = new Common::String(res);
+	s.u.s = new Common::String(res, Common::kUtf8);
 	s.type = STRING;
 	g_lingo->varAssign(field, s);
 }
diff --git a/engines/director/lingo/lingo.cpp b/engines/director/lingo/lingo.cpp
index 443d00171e..398f805275 100644
--- a/engines/director/lingo/lingo.cpp
+++ b/engines/director/lingo/lingo.cpp
@@ -1176,10 +1176,10 @@ void Lingo::varAssign(const Datum &var, const Datum &value) {
 		break;
 	case CHUNKREF:
 		{
-			Common::String src = var.u.cref->source.eval().asString();
-			Common::String res;
+			Common::U32String src = evalChunkRef(var.u.cref->source);
+			Common::U32String res;
 			if (var.u.cref->start >= 0) {
-				res = src.substr(0, var.u.cref->start) + value.asString() + src.substr(var.u.cref->end);
+				res = src.substr(0, var.u.cref->start) + value.asString().decode(Common::kUtf8) + src.substr(var.u.cref->end);
 			} else {
 				// non-existent chunk - insert more chars, items, or lines
 				res = src;
@@ -1208,7 +1208,7 @@ void Lingo::varAssign(const Datum &var, const Datum &value) {
 				}
 				res += value.asString();
 			}
-			varAssign(var.u.cref->source, res);
+			varAssign(var.u.cref->source, res.encode(Common::kUtf8));
 		}
 		break;
 	default:
@@ -1272,42 +1272,64 @@ Datum Lingo::varFetch(const Datum &var, bool silent) {
 		}
 		break;
 	case FIELDREF:
+	case CASTREF:
+	case CHUNKREF:
+		{
+			result.type = STRING;
+			result.u.s = new Common::String(evalChunkRef(var), Common::kUtf8);
+		}
+		break;
+	default:
+		warning("varFetch: fetch from non-variable");
+		break;
+	}
+
+	return result;
+}
+
+Common::U32String Lingo::evalChunkRef(const Datum &var) {
+	Common::U32String result;
+
+	switch (var.type) {
+	case VARREF:
+	case GLOBALREF:
+	case LOCALREF:
+	case PROPREF:
+		result = varFetch(var).asString().decode(Common::kUtf8);
+		break;
+	case FIELDREF:
 	case CASTREF:
 		{
 			Movie *movie = g_director->getCurrentMovie();
 			if (!movie) {
-				warning("varFetch: Assigning to a reference to an empty movie");
+				warning("evalChunkRef: Assigning to a reference to an empty movie");
 				return result;
 			}
 			CastMember *member = movie->getCastMember(*var.u.cast);
 			if (!member) {
-				warning("varFetch: Unknown %s", var.u.cast->asString().c_str());
+				warning("evalChunkRef: Unknown %s", var.u.cast->asString().c_str());
 				return result;
 			}
 			switch (member->_type) {
 			case kCastText:
-				result.type = STRING;
-				result.u.s = new Common::String(((TextCastMember *)member)->getText().encode(Common::kUtf8));
+				result = ((TextCastMember *)member)->getText();
 				break;
 			default:
-				warning("varFetch: Unhandled cast type %d", member->_type);
+				warning("evalChunkRef: Unhandled cast type %d", member->_type);
 				break;
 			}
 		}
 		break;
 	case CHUNKREF:
 		{
-			Common::String src = var.u.cref->source.eval().asString();
-			result.type = STRING;
-			if (var.u.cref->start < 0) {
-				result.u.s = new Common::String("");
-			} else {
-				result.u.s = new Common::String(src.substr(var.u.cref->start, var.u.cref->end - var.u.cref->start));
+			Common::U32String src = evalChunkRef(var.u.cref->source);
+			if (var.u.cref->start >= 0) {
+				result = src.substr(var.u.cref->start, var.u.cref->end - var.u.cref->start);
 			}
 		}
 		break;
 	default:
-		warning("varFetch: fetch from non-variable");
+		result = var.asString().decode(Common::kUtf8);
 		break;
 	}
 
diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h
index 7e1a3a6b37..a5cffe641f 100644
--- a/engines/director/lingo/lingo.h
+++ b/engines/director/lingo/lingo.h
@@ -290,6 +290,7 @@ public:
 	void cleanLocalVars();
 	void varAssign(const Datum &var, const Datum &value);
 	Datum varFetch(const Datum &var, bool silent = false);
+	Common::U32String evalChunkRef(const Datum &var);
 	Datum findVarV4(int varType, const Datum &id);
 	CastMemberID resolveCastMember(const Datum &memberID, const Datum &castLib);
 


Commit: c16189094df1844e3416bb44db08d123b71e96d7
    https://github.com/scummvm/scummvm/commit/c16189094df1844e3416bb44db08d123b71e96d7
Author: djsrv (dservilla at gmail.com)
Date: 2021-07-15T16:31:47-04:00

Commit Message:
DIRECTOR: LINGO: Make _itemDelimiter a U32 char

Changed paths:
    engines/director/lingo/lingo-the.cpp
    engines/director/lingo/lingo.h


diff --git a/engines/director/lingo/lingo-the.cpp b/engines/director/lingo/lingo-the.cpp
index 11f62f4c12..23a0e2a7f0 100644
--- a/engines/director/lingo/lingo-the.cpp
+++ b/engines/director/lingo/lingo-the.cpp
@@ -482,8 +482,12 @@ Datum Lingo::getTheEntity(int entity, Datum &id, int field) {
 		d.u.i = 1;					// We always allow it in ScummVM
 		break;
 	case kTheItemDelimiter:
-		d.type = STRING;
-		d.u.s = new Common::String(g_lingo->_itemDelimiter);
+		{
+			Common::U32String ch;
+			ch.setChar(0, g_lingo->_itemDelimiter);
+			d.type = STRING;
+			d.u.s = new Common::String(ch, Common::kUtf8);
+		}
 		break;
 	case kTheKey:
 		d.type = STRING;
@@ -942,9 +946,9 @@ void Lingo::setTheEntity(int entity, Datum &id, int field, Datum &d) {
 		break;
 	case kTheItemDelimiter:
 		if (d.asString().size() == 0)
-			g_lingo->_itemDelimiter = *"";
+			g_lingo->_itemDelimiter = 0;
 		else
-			g_lingo->_itemDelimiter = d.asString()[0];
+			g_lingo->_itemDelimiter = d.asString().decode(Common::kUtf8)[0];
 		break;
 	case kTheKeyDownScript:
 		movie->setPrimaryEventHandler(kEventKeyDown, d.asString());
diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h
index a5cffe641f..5a4e3531df 100644
--- a/engines/director/lingo/lingo.h
+++ b/engines/director/lingo/lingo.h
@@ -338,7 +338,7 @@ public:
 	const char *field2str(int id);
 
 	// global kTheEntity
-	char _itemDelimiter;
+	Common::u32char_type_t _itemDelimiter;
 
 	Datum getTheEntity(int entity, Datum &id, int field);
 	void setTheEntity(int entity, Datum &id, int field, Datum &d);


Commit: d0df2bd01437becfdd8ecf4e3c177cdff920e18f
    https://github.com/scummvm/scummvm/commit/d0df2bd01437becfdd8ecf4e3c177cdff920e18f
Author: djsrv (dservilla at gmail.com)
Date: 2021-07-15T16:31:47-04:00

Commit Message:
DIRECTOR: LINGO: Use '\r' as line delimiter

Changed paths:
    engines/director/lingo/lingo-code.cpp
    engines/director/lingo/lingo.cpp


diff --git a/engines/director/lingo/lingo-code.cpp b/engines/director/lingo/lingo-code.cpp
index 21a7509745..883b36becc 100644
--- a/engines/director/lingo/lingo-code.cpp
+++ b/engines/director/lingo/lingo-code.cpp
@@ -944,7 +944,7 @@ Datum LC::chunkRef(ChunkType type, int startChunk, int endChunk, const Datum &sr
 	case kChunkItem:
 	case kChunkLine:
 		{
-			Common::u32char_type_t delimiter = (type == kChunkItem) ? g_lingo->_itemDelimiter : '\n';
+			Common::u32char_type_t delimiter = (type == kChunkItem) ? g_lingo->_itemDelimiter : '\r';
 
 			int idx = 0;
 			while (true) {
diff --git a/engines/director/lingo/lingo.cpp b/engines/director/lingo/lingo.cpp
index 398f805275..9562c2f6f6 100644
--- a/engines/director/lingo/lingo.cpp
+++ b/engines/director/lingo/lingo.cpp
@@ -1201,7 +1201,7 @@ void Lingo::varAssign(const Datum &var, const Datum &value) {
 					break;
 				case kChunkLine:
 					while (numberOfChunks < var.u.cref->startChunk ) {
-						res += '\n';
+						res += '\r';
 						numberOfChunks++;
 					}
 					break;


Commit: 5b3bed6e57560311b7f1acb029d1a09bae5d1c2a
    https://github.com/scummvm/scummvm/commit/5b3bed6e57560311b7f1acb029d1a09bae5d1c2a
Author: djsrv (dservilla at gmail.com)
Date: 2021-07-15T16:31:47-04:00

Commit Message:
DIRECTOR: LINGO: Re-encode Lingo constants to UTF-8

Changed paths:
    engines/director/lingo/lingo-bytecode.cpp


diff --git a/engines/director/lingo/lingo-bytecode.cpp b/engines/director/lingo/lingo-bytecode.cpp
index b58278c0a2..97a5126373 100644
--- a/engines/director/lingo/lingo-bytecode.cpp
+++ b/engines/director/lingo/lingo-bytecode.cpp
@@ -1079,8 +1079,7 @@ ScriptContext *LingoCompiler::compileLingoV4(Common::SeekableReadStreamEndian &s
 		switch (constType) {
 		case 1: // String type
 			{
-				constant.type = STRING;
-				constant.u.s = new Common::String();
+				Common::String str;
 				uint32 pointer = value;
 				if (pointer + 4 > constsStoreSize) {
 					error("Constant string is too small");
@@ -1094,12 +1093,10 @@ ScriptContext *LingoCompiler::compileLingoV4(Common::SeekableReadStreamEndian &s
 					break;
 				}
 				while (pointer < end) {
-					if (constsStore[pointer] == '\r') {
-						*constant.u.s += '\n';
-					} else if (constsStore[pointer] == '\0') {
+					if (constsStore[pointer] == '\0') {
 						break;
 					} else {
-						*constant.u.s += constsStore[pointer];
+						str += constsStore[pointer];
 					}
 					pointer += 1;
 				}
@@ -1107,6 +1104,9 @@ ScriptContext *LingoCompiler::compileLingoV4(Common::SeekableReadStreamEndian &s
 					warning("Constant string has no null terminator");
 					break;
 				}
+				Common::CodePage encoding = g_director->getPlatformEncoding();
+				constant.type = STRING;
+				constant.u.s = new Common::String(str.decode(encoding), Common::kUtf8);
 			}
 			break;
 		case 4: // Integer type


Commit: 30df98e61b3edbbe41cfc0a5d86600882fcfc381
    https://github.com/scummvm/scummvm/commit/30df98e61b3edbbe41cfc0a5d86600882fcfc381
Author: djsrv (dservilla at gmail.com)
Date: 2021-07-15T16:31:47-04:00

Commit Message:
DIRECTOR: Create Cast::decodeString

Changed paths:
    engines/director/cast.cpp
    engines/director/cast.h
    engines/director/director.cpp
    engines/director/movie.cpp
    engines/director/util.cpp


diff --git a/engines/director/cast.cpp b/engines/director/cast.cpp
index e032e7afe2..0e1b4fc167 100644
--- a/engines/director/cast.cpp
+++ b/engines/director/cast.cpp
@@ -1198,4 +1198,37 @@ void Cast::loadCastInfo(Common::SeekableReadStreamEndian &stream, uint16 id) {
 	_castsInfo[id] = ci;
 }
 
+Common::CodePage Cast::getPlatformEncoding() {
+	return getEncoding(_platform, _vm->getLanguage());
+}
+
+Common::U32String Cast::decodeString(const Common::String &str) {
+	Common::CodePage encoding = getPlatformEncoding();
+
+	Common::String fixedStr;
+	if (encoding == Common::kWindows1252) {
+		/**
+		 * Director for Windows stores strings in a screwed up version of Mac Roman
+		 * where characters map directly to Windows-1252 characters.
+		 * We need to map this screwed up Mac Roman back to Windows-1252 before using it.
+		 * Comment from FXmp:
+		 *   Note: Some characters are not available in both character sets.
+		 *   However, the bi-directional mapping table below preserves these
+		 *   characters even if they are mapped to a different platform and
+		 *   later re-mapped back to the original platform.
+		 */
+
+		for (uint i = 0; i < str.size(); i++) {
+			if (_macCharsToWin.contains(str[i]))
+				fixedStr += _macCharsToWin[str[i]];
+			else
+				fixedStr += str[i];
+		}
+	} else {
+		fixedStr = str;
+	}
+
+	return fixedStr.decode(encoding);
+}
+
 } // End of namespace Director
diff --git a/engines/director/cast.h b/engines/director/cast.h
index 5021733c7b..8b55496342 100644
--- a/engines/director/cast.h
+++ b/engines/director/cast.h
@@ -50,7 +50,7 @@ typedef Common::HashMap<byte, byte> CharMap;
 typedef Common::HashMap<uint16, uint16> FontSizeMap;
 struct FontXPlatformInfo {
 	Common::String toFont;
-	bool remapChars;
+		bool remapChars;
 	FontSizeMap sizeMap;
 
 	FontXPlatformInfo() : remapChars(false) {}
@@ -104,6 +104,9 @@ public:
 	void dumpScript(const char *script, ScriptType type, uint16 id);
 	PaletteV4 loadPalette(Common::SeekableReadStreamEndian &stream);
 
+	Common::CodePage getPlatformEncoding();
+	Common::U32String decodeString(const Common::String &str);
+
 private:
 	void loadScriptText(Common::SeekableReadStreamEndian &stream, uint16 id);
 	void loadFontMap(Common::SeekableReadStreamEndian &stream);
diff --git a/engines/director/director.cpp b/engines/director/director.cpp
index 829378415d..08d8fe1226 100644
--- a/engines/director/director.cpp
+++ b/engines/director/director.cpp
@@ -231,4 +231,8 @@ Common::Error DirectorEngine::run() {
 	return Common::kNoError;
 }
 
+Common::CodePage DirectorEngine::getPlatformEncoding() {
+	return getEncoding(getPlatform(), getLanguage());
+}
+
 } // End of namespace Director
diff --git a/engines/director/movie.cpp b/engines/director/movie.cpp
index 3dbf962f89..8a83bc55ab 100644
--- a/engines/director/movie.cpp
+++ b/engines/director/movie.cpp
@@ -391,44 +391,13 @@ Common::String InfoEntry::readString(bool pascal) {
 	uint start = pascal ? 1 : 0; // skip length for Pascal string
 
 	Common::String encodedStr;
-	if (g_director->getLanguage() == Common::JA_JPN) {
-		for (uint i = start; i < len; i++) {
-			if (!Common::isCntrl(data[i]) || Common::isSpace(data[i]))
-				encodedStr += data[i];
-		}
-		res = encodedStr.decode(Common::kWindows932).encode(Common::kUtf8);
-	} else {
-		// FIXME: Get the platform and FXmp from the cast which contains this, not the current movie.
-		if (g_director->getCurrentMovie()->_platform == Common::kPlatformWindows) {
-			/**
-			 * Director for Windows stores these strings in a screwed up version of Mac Roman
-			 * We need to map this screwed up Mac Roman back to Windows-1252 before using it.
-			 * Comment from FXmp:
-			 *   Note: Some characters are not available in both character sets.
-			 *   However, the bi-directional mapping table below preserves these
-			 *   characters even if they are mapped to a different platform and
-			 *   later re-mapped back to the original platform.
-			 */
-			CharMap &charMap = g_director->getCurrentMovie()->getCast()->_macCharsToWin;
-			for (uint i = start; i < len; i++) {
-				if (!Common::isCntrl(data[i]) || Common::isSpace(data[i])) {
-					if (charMap.contains(data[i]))
-						encodedStr += charMap[data[i]];
-					else
-						encodedStr += data[i];
-				}
-			}
-			res = encodedStr.decode(Common::kWindows1252).encode(Common::kUtf8);
-		} else {
-			for (uint i = start; i < len; i++) {
-				if (!Common::isCntrl(data[i]) || Common::isSpace(data[i]))
-					encodedStr += data[i];
-			}
-			res = encodedStr.decode(Common::kMacRoman).encode(Common::kUtf8);
-		}
+	for (uint i = start; i < len; i++) {
+		if (!Common::isCntrl(data[i]) || Common::isSpace(data[i]))
+			encodedStr += data[i];
 	}
 
-	return res;
+	// FIXME: Use the case which contains this string, not the main cast.
+	return g_director->getCurrentMovie()->getCast()->decodeString(encodedStr).encode(Common::kUtf8);
 }
 
 } // End of namespace Director
diff --git a/engines/director/util.cpp b/engines/director/util.cpp
index 133809832b..22dc93314c 100644
--- a/engines/director/util.cpp
+++ b/engines/director/util.cpp
@@ -784,8 +784,4 @@ Common::CodePage detectFontEncoding(Common::Platform platform, uint16 fontId) {
 	return getEncoding(platform, g_director->_wm->_fontMan->getFontLanguage(fontId));
 }
 
-Common::CodePage DirectorEngine::getPlatformEncoding() {
-	return getEncoding(getPlatform(), getLanguage());
-}
-
 } // End of namespace Director


Commit: 4450cd5ced115d2bd472c7794250e589cd12d798
    https://github.com/scummvm/scummvm/commit/4450cd5ced115d2bd472c7794250e589cd12d798
Author: djsrv (dservilla at gmail.com)
Date: 2021-07-15T16:31:47-04:00

Commit Message:
DIRECTOR: LINGO: Decode constants using Cast::decodeString

Changed paths:
    engines/director/lingo/lingo-bytecode.cpp


diff --git a/engines/director/lingo/lingo-bytecode.cpp b/engines/director/lingo/lingo-bytecode.cpp
index 97a5126373..293489f2f8 100644
--- a/engines/director/lingo/lingo-bytecode.cpp
+++ b/engines/director/lingo/lingo-bytecode.cpp
@@ -1104,9 +1104,8 @@ ScriptContext *LingoCompiler::compileLingoV4(Common::SeekableReadStreamEndian &s
 					warning("Constant string has no null terminator");
 					break;
 				}
-				Common::CodePage encoding = g_director->getPlatformEncoding();
 				constant.type = STRING;
-				constant.u.s = new Common::String(str.decode(encoding), Common::kUtf8);
+				constant.u.s = new Common::String(archive->cast->decodeString(str), Common::kUtf8);
 			}
 			break;
 		case 4: // Integer type


Commit: ca0b1f5de1f8d9176c12fe39eac247255705186c
    https://github.com/scummvm/scummvm/commit/ca0b1f5de1f8d9176c12fe39eac247255705186c
Author: djsrv (dservilla at gmail.com)
Date: 2021-07-15T16:31:47-04:00

Commit Message:
DIRECTOR: LINGO: Normalize strings in equality tests

Changed paths:
    engines/director/lingo/lingo-code.cpp
    engines/director/lingo/lingo.cpp
    engines/director/lingo/lingo.h
    engines/director/util.cpp
    engines/director/util.h


diff --git a/engines/director/lingo/lingo-code.cpp b/engines/director/lingo/lingo-code.cpp
index 883b36becc..82c0af95a1 100644
--- a/engines/director/lingo/lingo-code.cpp
+++ b/engines/director/lingo/lingo-code.cpp
@@ -807,8 +807,8 @@ void LC::c_contains() {
 	Datum d2 = g_lingo->pop();
 	Datum d1 = g_lingo->pop();
 
-	Common::String s1 = toLowercaseMac(d1.asString());
-	Common::String s2 = toLowercaseMac(d2.asString());
+	Common::String s1 = g_lingo->normalizeString(d1.asString());
+	Common::String s2 = g_lingo->normalizeString(d2.asString());
 
 	int res = s1.contains(s2) ? 1 : 0;
 
@@ -819,8 +819,8 @@ void LC::c_starts() {
 	Datum d2 = g_lingo->pop();
 	Datum d1 = g_lingo->pop();
 
-	Common::String s1 = toLowercaseMac(d1.asString());
-	Common::String s2 = toLowercaseMac(d2.asString());
+	Common::String s1 = g_lingo->normalizeString(d1.asString());
+	Common::String s2 = g_lingo->normalizeString(d2.asString());
 
 	int res = s1.hasPrefix(s2) ? 1 : 0;
 
diff --git a/engines/director/lingo/lingo.cpp b/engines/director/lingo/lingo.cpp
index 9562c2f6f6..e14356ff21 100644
--- a/engines/director/lingo/lingo.cpp
+++ b/engines/director/lingo/lingo.cpp
@@ -46,6 +46,93 @@ namespace Director {
 
 Lingo *g_lingo;
 
+static struct CharNormProto {
+	Common::u32char_type_t from;
+	const char *to;
+} charNormProtos[] = {
+	{ 0x00C0, "a" },		// À - \xCB in Mac Roman, \xC0 in Windows-1252
+	{ 0x00C1, "a" },		// Á - \xE7 in Mac Roman, \xC1 in Windows-1252
+	{ 0x00C2, "a" },		// Â - \xE5 in Mac Roman, \xC2 in Windows-1252
+	{ 0x00C3, "a" },		// Ã - \xCC in Mac Roman, \xC3 in Windows-1252
+	{ 0x00C4, "a" },		// Ä - \x80 in Mac Roman, \xC4 in Windows-1252
+	{ 0x00C5, "a" },		// Ã… - \x81 in Mac Roman, \xC5 in Windows-1252
+	{ 0x00C6, "ae" },		// Æ - \xAE in Mac Roman, \xC6 in Windows-1252
+	{ 0x00C7, "c" },		// Ç - \x82 in Mac Roman, \xC7 in Windows-1252
+	{ 0x00C8, "e" },		// È - \xE9 in Mac Roman, \xC8 in Windows-1252
+	{ 0x00C9, "e" },		// É - \x83 in Mac Roman, \xC9 in Windows-1252
+	{ 0x00CA, "e" },		// Ê - \xE6 in Mac Roman, \xCA in Windows-1252
+	{ 0x00CB, "e" },		// Ë - \xE8 in Mac Roman, \xCB in Windows-1252
+	{ 0x00CC, "i" },		// Ì - \xED in Mac Roman, \xCC in Windows-1252
+	{ 0x00CD, "i" },		// Í - \xEA in Mac Roman, \xCD in Windows-1252
+	{ 0x00CE, "i" },		// ÃŽ - \xEB in Mac Roman, \xCE in Windows-1252
+	{ 0x00CF, "i" },		// Ï - \xEC in Mac Roman, \xCF in Windows-1252
+	{ 0x00D0, "d" },		// Ð - \xD0 in Windows-1252
+	{ 0x00D1, "n" },		// Ñ - \x84 in Mac Roman, \xD1 in Windows-1252
+	{ 0x00D2, "o" },		// Ã’ - \xF1 in Mac Roman, \xD2 in Windows-1252
+	{ 0x00D3, "o" },		// Ó - \xEE in Mac Roman, \xD3 in Windows-1252
+	{ 0x00D4, "o" },		// Ô - \xEF in Mac Roman, \xD4 in Windows-1252
+	{ 0x00D5, "o" },		// Õ - \xCD in Mac Roman, \xD5 in Windows-1252
+	{ 0x00D6, "o" },		// Ö - \x85 in Mac Roman, \xD6 in Windows-1252
+	{ 0x00D8, "o" },		// Ø - \xAF in Mac Roman, \xD8 in Windows-1252
+	{ 0x00D9, "u" },		// Ù - \xF4 in Mac Roman, \xD9 in Windows-1252
+	{ 0x00DA, "u" },		// Ú - \xF2 in Mac Roman, \xDA in Windows-1252
+	{ 0x00DB, "u" },		// Û - \xF3 in Mac Roman, \xDB in Windows-1252
+	{ 0x00DC, "u" },		// Ü - \x86 in Mac Roman, \xDC in Windows-1252
+	{ 0x00DD, "y" },		// Ý - \xDD in Windows-1252
+	{ 0x00DE, "\xC3\xBE" },	// Þ - \xDE in Windows-1252
+	{ 0x00DF, "s" },		// ß - \xDF in Windows-1252
+	{ 0x00E0, "a" },		// à - \x88 in Mac Roman, \xE0 in Windows-1252
+	{ 0x00E1, "a" },		// á - \x87 in Mac Roman, \xE1 in Windows-1252
+	{ 0x00E2, "a" },		// â - \x89 in Mac Roman, \xE2 in Windows-1252
+	{ 0x00E3, "a" },		// ã - \x8B in Mac Roman, \xE3 in Windows-1252
+	{ 0x00E4, "a" },		// ä - \x8A in Mac Roman, \xE4 in Windows-1252
+	{ 0x00E5, "a" },		// å - \x8C in Mac Roman, \xE5 in Windows-1252
+	{ 0x00E6, "ae" },		// æ - \xBE in Mac Roman, \xE6 in Windows-1252
+	{ 0x00E7, "c" },		// ç - \x8D in Mac Roman, \xE7 in Windows-1252
+	{ 0x00E8, "e" },		// è - \x8F in Mac Roman, \xE8 in Windows-1252
+	{ 0x00E9, "e" },		// é - \x8E in Mac Roman, \xE9 in Windows-1252
+	{ 0x00EA, "e" },		// ê - \x90 in Mac Roman, \xEA in Windows-1252
+	{ 0x00EB, "e" },		// ë - \x91 in Mac Roman, \xEB in Windows-1252
+	{ 0x00EC, "i" },		// ì - \x93 in Mac Roman, \xEC in Windows-1252
+	{ 0x00ED, "i" },		// í - \x92 in Mac Roman, \xED in Windows-1252
+	{ 0x00EE, "i" },		// î - \x94 in Mac Roman, \xEE in Windows-1252
+	{ 0x00EF, "i" },		// ï - \x95 in Mac Roman, \xEF in Windows-1252
+	{ 0x00F0, "d" },		// ð - \xF0 in Windows-1252
+	{ 0x00F1, "n" },		// ñ - \x96 in Mac Roman, \xF1 in Windows-1252
+	{ 0x00F2, "o" },		// ò - \x98 in Mac Roman, \xF2 in Windows-1252
+	{ 0x00F3, "o" },		// ó - \x97 in Mac Roman, \xF3 in Windows-1252
+	{ 0x00F4, "o" },		// ô - \x99 in Mac Roman, \xF4 in Windows-1252
+	{ 0x00F5, "o" },		// õ - \x9B in Mac Roman, \xF5 in Windows-1252
+	{ 0x00F6, "o" },		// ö - \x9A in Mac Roman, \xF6 in Windows-1252
+	{ 0x00F8, "o" },		// ø - \xBF in Mac Roman, \xF8 in Windows-1252
+	{ 0x00F9, "u" },		// ù - \x9D in Mac Roman, \xF9 in Windows-1252
+	{ 0x00FA, "u" },		// ú - \x9C in Mac Roman, \xFA in Windows-1252
+	{ 0x00FB, "u" },		// û - \x9E in Mac Roman, \xFB in Windows-1252
+	{ 0x00FC, "u" },		// ü - \x9F in Mac Roman, \xFC in Windows-1252
+	{ 0x00FD, "y" },		// ý - \xFD in Windows-1252
+	{ 0x00FF, "y" },		// ÿ - \xD8 in Mac Roman
+	{ 0x0131, "i" },		// ı - \xF5 in Mac Roman
+	{ 0x0152, "oe" },		// Å’ - \xCE in Mac Roman, \x8C in Windows-1252
+	{ 0x0153, "oe" },		// Å“ - \xCF in Mac Roman, \x9C in Windows-1252
+	{ 0x0160, "s" },		// Å  - \x8A in Windows-1252
+	{ 0x0161, "s" },		// Å¡ - \x9A in Windows-1252
+	{ 0x0178, "y" },		// Ÿ - \xD9 in Mac Roman, \x9F in Windows-1252
+	{ 0x017D, "z" },		// Ž - \x8E in Windows-1252
+	{ 0x017E, "z" },		// ž - \x9E in Windows-1252
+	{ 0xFB01, "fi" },		// fi - \xDE in Mac Roman
+	{ 0xFB02, "fl" },		// fl - \xDF in Mac Roman
+	{ 0, NULL }
+};
+
+void Lingo::initCharNormalizations() {
+	for (char ch = 'A'; ch <= 'Z'; ch++) {
+		_charNormalizations[ch] = Common::U32String(Common::String(tolower(ch)), Common::kUtf8);
+	}
+	for (CharNormProto *norm = charNormProtos; norm->to; norm++) {
+		_charNormalizations[norm->from] = Common::U32String(norm->to, Common::kUtf8);
+	}
+}
+
 int calcStringAlignment(const char *s) {
 	return calcCodeAlignment(strlen(s) + 1);
 }
@@ -178,6 +265,7 @@ Lingo::Lingo(DirectorEngine *vm) : _vm(vm) {
 	_compiler = new LingoCompiler;
 
 	initEventHandlerTypes();
+	initCharNormalizations();
 
 	initBuiltIns();
 	initFuncs();
@@ -942,7 +1030,7 @@ int Datum::equalTo(Datum &d, bool ignoreCase) const {
 	case STRING:
 	case SYMBOL:
 		if (ignoreCase) {
-			return toLowercaseMac(asString()).equals(toLowercaseMac(d.asString()));
+			return g_lingo->normalizeString(asString()).equals(g_lingo->normalizeString(d.asString()));
 		} else {
 			return asString().equals(d.asString());
 		}
@@ -956,7 +1044,7 @@ int Datum::equalTo(Datum &d, bool ignoreCase) const {
 	return 0;
 }
 
-int Datum::compareTo(Datum &d, bool ignoreCase) const {
+int Datum::compareTo(Datum &d) const {
 	int alignType = g_lingo->getAlignedType(*this, d, false);
 
 	if (alignType == FLOAT) {
@@ -980,11 +1068,7 @@ int Datum::compareTo(Datum &d, bool ignoreCase) const {
 			return 1;
 		}
 	} else if (alignType == STRING) {
-		if (ignoreCase) {
-			return toLowercaseMac(asString()).compareTo(toLowercaseMac(d.asString()));
-		} else {
-			return asString().compareTo(d.asString());
-		}
+		return asString().compareTo(d.asString());
 	} else {
 		warning("Invalid comparison between types %s and %s", type2str(), d.type2str());
 		return 0;
@@ -1368,4 +1452,16 @@ CastMemberID Lingo::resolveCastMember(const Datum &memberID, const Datum &castLi
 	return CastMemberID(-1, castLib.asInt());
 }
 
+Common::String Lingo::normalizeString(const Common::String &str) {
+	Common::U32String u32Str = str.decode(Common::kUtf8);
+	Common::U32String res;
+	for (const Common::u32char_type_t *ch = u32Str.c_str(); *ch; ch++) {
+		if (_charNormalizations.contains(*ch))
+			res += _charNormalizations[*ch];
+		else
+			res += *ch;
+	}
+	return res.encode(Common::kUtf8);
+}
+
 } // End of namespace Director
diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h
index 5a4e3531df..d017358212 100644
--- a/engines/director/lingo/lingo.h
+++ b/engines/director/lingo/lingo.h
@@ -152,7 +152,7 @@ struct Datum {	/* interpreter stack type */
 	const char *type2str(bool isk = false) const;
 
 	int equalTo(Datum &d, bool ignoreCase = false) const;
-	int compareTo(Datum &d, bool ignoreCase = false) const;
+	int compareTo(Datum &d) const;
 };
 
 struct ChunkReference {
@@ -294,6 +294,8 @@ public:
 	Datum findVarV4(int varType, const Datum &id);
 	CastMemberID resolveCastMember(const Datum &memberID, const Datum &castLib);
 
+	Common::String normalizeString(const Common::String &str);
+
 	int getAlignedType(const Datum &d1, const Datum &d2, bool numsOnly);
 
 	void printAllVars();
@@ -426,6 +428,10 @@ public:
 public:
 	void executeImmediateScripts(Frame *frame);
 	void executePerFrameHook(int frame, int subframe);
+
+private:
+	Common::HashMap<uint32, Common::U32String> _charNormalizations;
+	void initCharNormalizations();
 };
 
 extern Lingo *g_lingo;
diff --git a/engines/director/util.cpp b/engines/director/util.cpp
index 22dc93314c..152a8c3054 100644
--- a/engines/director/util.cpp
+++ b/engines/director/util.cpp
@@ -216,48 +216,6 @@ Common::String CastMemberID::asString() const {
 	return res;
 }
 
-// This is table for built-in Macintosh font lowercasing.
-// '.' means that the symbol should be not changed, rest
-// of the symbols are stripping the diacritics
-// The table starts from 0x80
-//
-// TODO: Check it for correctness.
-static char lowerCaseConvert[] =
-"aacenoua" // 80
-"aaaaacee" // 88
-"eeiiiino" // 90
-"oooouuuu" // 98
-"........" // a0
-".......o" // a8
-"........" // b0
-".......o" // b8
-"........" // c0
-".. aao.." // c8
-"--.....y";// d0-d8
-
-Common::String toLowercaseMac(const Common::String &s) {
-	Common::String res;
-	const unsigned char *p = (const unsigned char *)s.c_str();
-
-	while (*p) {
-		if (*p >= 0x80 && *p <= 0xd8) {
-			if (lowerCaseConvert[*p - 0x80] != '.')
-				res += lowerCaseConvert[*p - 0x80];
-			else
-				res += *p;
-		} else if (*p < 0x80) {
-			res += tolower(*p);
-		} else {
-			warning("Unacceptable symbol in toLowercaseMac: %c", *p);
-
-			res += *p;
-		}
-		p++;
-	}
-
-	return res;
-}
-
 Common::String convertPath(Common::String &path) {
 	if (path.empty())
 		return path;
diff --git a/engines/director/util.h b/engines/director/util.h
index fe71aeb863..0e0b12e735 100644
--- a/engines/director/util.h
+++ b/engines/director/util.h
@@ -32,8 +32,6 @@ namespace Director {
 int castNumToNum(const char *str);
 char *numToCastNum(int num);
 
-Common::String toLowercaseMac(const Common::String &s);
-
 Common::String convertPath(Common::String &path);
 
 Common::String unixToMacPath(const Common::String &path);


Commit: 163424abbbe0ddd5ebecd62d36858c4669701562
    https://github.com/scummvm/scummvm/commit/163424abbbe0ddd5ebecd62d36858c4669701562
Author: djsrv (dservilla at gmail.com)
Date: 2021-07-15T16:31:47-04:00

Commit Message:
DIRECTOR: Set lingotests platform to Macintosh

We use Mac Roman encoding for these tests, so it makes sense to keep
this consistent.

Changed paths:
    engines/director/detection_tables.h


diff --git a/engines/director/detection_tables.h b/engines/director/detection_tables.h
index be792bc8ac..e1488d3995 100644
--- a/engines/director/detection_tables.h
+++ b/engines/director/detection_tables.h
@@ -982,7 +982,7 @@ static const DirectorGameDescription gameDescriptions[] = {
 			"",
 			AD_ENTRY1("lingotests", 0),
 			Common::EN_ANY,
-			Common::kPlatformWindows,
+			Common::kPlatformMacintosh,
 			ADGF_NO_FLAGS,
 			GUIO1(GUIO_NOASPECT)
 		},


Commit: b2988ce682ccfdda9c890feeb1a6021d296e5b8c
    https://github.com/scummvm/scummvm/commit/b2988ce682ccfdda9c890feeb1a6021d296e5b8c
Author: djsrv (dservilla at gmail.com)
Date: 2021-07-15T16:31:47-04:00

Commit Message:
COMMON: Add constructor to make U32String from a character

Changed paths:
    common/ustr.cpp
    common/ustr.h


diff --git a/common/ustr.cpp b/common/ustr.cpp
index 15368c565f..19471cd2b5 100644
--- a/common/ustr.cpp
+++ b/common/ustr.cpp
@@ -49,6 +49,13 @@ U32String::U32String(const String &str, Common::CodePage page) : BaseString<u32c
 	decodeInternal(str.c_str(), str.size(), page);
 }
 
+U32String::U32String(u32char_type_t c) : BaseString<u32char_type_t>() {
+	_storage[0] = c;
+	_storage[1] = 0;
+
+	_size = (c == 0) ? 0 : 1;
+}
+
 U32String &U32String::operator=(const U32String &str) {
 	assign(str);
 	return *this;
diff --git a/common/ustr.h b/common/ustr.h
index ad7745f6cb..50a8073516 100644
--- a/common/ustr.h
+++ b/common/ustr.h
@@ -95,6 +95,9 @@ public:
 	/** Construct a copy of the given string. */
 	U32String(const String &str, CodePage page = kUtf8);
 
+	/** Construct a string consisting of the given character. */
+	explicit U32String(value_type c);
+
 	/** Assign a given string to this string. */
 	U32String &operator=(const U32String &str);
 


Commit: 8fcc186b089c6624c4a2fb3d9cc21dbc9d39cdee
    https://github.com/scummvm/scummvm/commit/8fcc186b089c6624c4a2fb3d9cc21dbc9d39cdee
Author: djsrv (dservilla at gmail.com)
Date: 2021-07-15T16:31:47-04:00

Commit Message:
DIRECTOR: Add charToNum and numToChar helper functions

Changed paths:
    engines/director/lingo/lingo-builtins.cpp
    engines/director/util.cpp
    engines/director/util.h


diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index 24ffc39b3c..dae8f301a3 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -480,20 +480,13 @@ void LB::b_charToNum(int nargs) {
 
 	TYPECHECK(d, STRING);
 
-	Common::U32String src = d.asString().decode(Common::kUtf8);
-	if (src.size() == 0) {
+	Common::U32String str = d.asString().decode(Common::kUtf8);
+	if (str.size() == 0) {
 		g_lingo->push(0);
 		return;
 	}
 
-	Common::U32String ch = src.substr(0, 1);
-	Common::String encodedCh = ch.encode(g_director->getPlatformEncoding());
-	int res = 0;
-	while (encodedCh.size()) {
-		res = (res << 8) | (byte)encodedCh.firstChar();
-		encodedCh.deleteChar(0);
-	}
-	g_lingo->push(res);
+	g_lingo->push(charToNum(str[0]));
 }
 
 void LB::b_length(int nargs) {
@@ -507,21 +500,7 @@ void LB::b_length(int nargs) {
 
 void LB::b_numToChar(int nargs) {
 	int num = g_lingo->pop().asInt();
-	if (num == 0) {
-		g_lingo->push(Common::String());
-		return;
-	}
-
-	Common::String encodedCh;
-	while (num) {
-		encodedCh.insertChar((char)(num & 0xFF), 0);
-		num >>= 8;
-	}
-	Common::U32String ch = encodedCh.decode(g_director->getPlatformEncoding());
-	while (ch.size() > 1) // we only want one character
-		ch.deleteChar(0);
-
-	g_lingo->push(ch.encode(Common::kUtf8));
+	g_lingo->push(Common::U32String(numToChar(num)).encode(Common::kUtf8));
 }
 
 void LB::b_offset(int nargs) {
diff --git a/engines/director/util.cpp b/engines/director/util.cpp
index 152a8c3054..f8c45c9adb 100644
--- a/engines/director/util.cpp
+++ b/engines/director/util.cpp
@@ -742,4 +742,24 @@ Common::CodePage detectFontEncoding(Common::Platform platform, uint16 fontId) {
 	return getEncoding(platform, g_director->_wm->_fontMan->getFontLanguage(fontId));
 }
 
+int charToNum(Common::u32char_type_t ch) {
+	Common::String encodedCh = Common::U32String(ch).encode(g_director->getPlatformEncoding());
+	int res = 0;
+	while (encodedCh.size()) {
+		res = (res << 8) | (byte)encodedCh.firstChar();
+		encodedCh.deleteChar(0);
+	}
+	return res;
+}
+
+Common::u32char_type_t numToChar(int num) {
+	Common::String encodedCh;
+	while (num) {
+		encodedCh.insertChar((char)(num & 0xFF), 0);
+		num >>= 8;
+	}
+	Common::U32String str = encodedCh.decode(g_director->getPlatformEncoding());
+	return str.lastChar();
+}
+
 } // End of namespace Director
diff --git a/engines/director/util.h b/engines/director/util.h
index 0e0b12e735..84b59a339e 100644
--- a/engines/director/util.h
+++ b/engines/director/util.h
@@ -85,6 +85,9 @@ Common::Platform platformFromID(uint16 id);
 Common::CodePage getEncoding(Common::Platform platform, Common::Language language);
 Common::CodePage detectFontEncoding(Common::Platform platform, uint16 fontId);
 
+int charToNum(Common::u32char_type_t ch);
+Common::u32char_type_t numToChar(int num);
+
 } // End of namespace Director
 
 #endif


Commit: 664d2f257d7edc647a5803be2ca74df8eb2b95c2
    https://github.com/scummvm/scummvm/commit/664d2f257d7edc647a5803be2ca74df8eb2b95c2
Author: djsrv (dservilla at gmail.com)
Date: 2021-07-15T16:31:47-04:00

Commit Message:
DIRECTOR: LINGO: Make compareTo handle Unicode

Changed paths:
    engines/director/lingo/lingo.cpp
    engines/director/util.cpp
    engines/director/util.h


diff --git a/engines/director/lingo/lingo.cpp b/engines/director/lingo/lingo.cpp
index e14356ff21..69a02c8cbd 100644
--- a/engines/director/lingo/lingo.cpp
+++ b/engines/director/lingo/lingo.cpp
@@ -1068,7 +1068,7 @@ int Datum::compareTo(Datum &d) const {
 			return 1;
 		}
 	} else if (alignType == STRING) {
-		return asString().compareTo(d.asString());
+		return compareStrings(asString(), d.asString());
 	} else {
 		warning("Invalid comparison between types %s and %s", type2str(), d.type2str());
 		return 0;
diff --git a/engines/director/util.cpp b/engines/director/util.cpp
index f8c45c9adb..a09f8a0250 100644
--- a/engines/director/util.cpp
+++ b/engines/director/util.cpp
@@ -762,4 +762,17 @@ Common::u32char_type_t numToChar(int num) {
 	return str.lastChar();
 }
 
+int compareStrings(const Common::String &s1, const Common::String &s2) {
+	Common::U32String u32S1 = s1.decode(Common::kUtf8);
+	Common::U32String u32S2 = s2.decode(Common::kUtf8);
+	const Common::u32char_type_t *p1 = u32S1.c_str();
+	const Common::u32char_type_t *p2 = u32S2.c_str();
+	uint32 c1, c2;
+	while ((c1 = charToNum(*p1)) && (c2 = charToNum(*p2)) && c1 == c2) {
+		p1++;
+		p2++;
+	}
+	return c1 - c2;
+}
+
 } // End of namespace Director
diff --git a/engines/director/util.h b/engines/director/util.h
index 84b59a339e..41055d2f98 100644
--- a/engines/director/util.h
+++ b/engines/director/util.h
@@ -87,6 +87,7 @@ Common::CodePage detectFontEncoding(Common::Platform platform, uint16 fontId);
 
 int charToNum(Common::u32char_type_t ch);
 Common::u32char_type_t numToChar(int num);
+int compareStrings(const Common::String &s1, const Common::String &s2);
 
 } // End of namespace Director
 


Commit: 835414022766e1ddc3d5ebe3103d95e12a2ff24a
    https://github.com/scummvm/scummvm/commit/835414022766e1ddc3d5ebe3103d95e12a2ff24a
Author: djsrv (dservilla at gmail.com)
Date: 2021-07-15T16:31:47-04:00

Commit Message:
DIRECTOR: LINGO: Fix getting the itemDelimiter

Changed paths:
    engines/director/lingo/lingo-the.cpp


diff --git a/engines/director/lingo/lingo-the.cpp b/engines/director/lingo/lingo-the.cpp
index 23a0e2a7f0..6a15b2b8ee 100644
--- a/engines/director/lingo/lingo-the.cpp
+++ b/engines/director/lingo/lingo-the.cpp
@@ -483,8 +483,7 @@ Datum Lingo::getTheEntity(int entity, Datum &id, int field) {
 		break;
 	case kTheItemDelimiter:
 		{
-			Common::U32String ch;
-			ch.setChar(0, g_lingo->_itemDelimiter);
+			Common::U32String ch(g_lingo->_itemDelimiter);
 			d.type = STRING;
 			d.u.s = new Common::String(ch, Common::kUtf8);
 		}


Commit: fc25ba3af5a272b841c95ecb3ea166a56c9985ae
    https://github.com/scummvm/scummvm/commit/fc25ba3af5a272b841c95ecb3ea166a56c9985ae
Author: djsrv (dservilla at gmail.com)
Date: 2021-07-15T16:31:47-04:00

Commit Message:
DIRECTOR: Keep original line endings in STXT

Changed paths:
    engines/director/stxt.cpp


diff --git a/engines/director/stxt.cpp b/engines/director/stxt.cpp
index ba4a824297..1d39cfaa69 100644
--- a/engines/director/stxt.cpp
+++ b/engines/director/stxt.cpp
@@ -49,15 +49,7 @@ Stxt::Stxt(Cast *cast, Common::SeekableReadStreamEndian &textStream) : _cast(cas
 	}
 	uint32 strLen = textStream.readUint32();
 	uint32 dataLen = textStream.readUint32();
-	Common::String text;
-
-	for (uint32 i = 0; i < strLen; i++) {
-		byte ch = textStream.readByte();
-		if (ch == 0x0d) {
-			ch = '\n';
-		}
-		text += ch;
-	}
+	Common::String text = textStream.readString(0, strLen);
 	debugC(3, kDebugText, "Stxt init: offset: %d strLen: %d dataLen: %d textlen: %u", offset, strLen, dataLen, text.size());
 
 	uint16 formattingCount = textStream.readUint16();


Commit: 04f16d2a1757471672d9eb1e490c8edef6cb7a26
    https://github.com/scummvm/scummvm/commit/04f16d2a1757471672d9eb1e490c8edef6cb7a26
Author: djsrv (dservilla at gmail.com)
Date: 2021-07-15T16:31:47-04:00

Commit Message:
DIRECTOR: LINGO: Move char normalizations to lingo-utils.cpp

Changed paths:
  A engines/director/lingo/lingo-utils.cpp
    engines/director/lingo/lingo.cpp
    engines/director/lingo/lingo.h
    engines/director/module.mk


diff --git a/engines/director/lingo/lingo-utils.cpp b/engines/director/lingo/lingo-utils.cpp
new file mode 100644
index 0000000000..0b06cd2ba6
--- /dev/null
+++ b/engines/director/lingo/lingo-utils.cpp
@@ -0,0 +1,126 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "director/lingo/lingo.h"
+
+namespace Director {
+
+static struct CharNormProto {
+	Common::u32char_type_t from;
+	const char *to;
+} charNormProtos[] = {
+	{ 0x00C0, "a" },		// À - \xCB in Mac Roman, \xC0 in Windows-1252
+	{ 0x00C1, "a" },		// Á - \xE7 in Mac Roman, \xC1 in Windows-1252
+	{ 0x00C2, "a" },		// Â - \xE5 in Mac Roman, \xC2 in Windows-1252
+	{ 0x00C3, "a" },		// Ã - \xCC in Mac Roman, \xC3 in Windows-1252
+	{ 0x00C4, "a" },		// Ä - \x80 in Mac Roman, \xC4 in Windows-1252
+	{ 0x00C5, "a" },		// Ã… - \x81 in Mac Roman, \xC5 in Windows-1252
+	{ 0x00C6, "ae" },		// Æ - \xAE in Mac Roman, \xC6 in Windows-1252
+	{ 0x00C7, "c" },		// Ç - \x82 in Mac Roman, \xC7 in Windows-1252
+	{ 0x00C8, "e" },		// È - \xE9 in Mac Roman, \xC8 in Windows-1252
+	{ 0x00C9, "e" },		// É - \x83 in Mac Roman, \xC9 in Windows-1252
+	{ 0x00CA, "e" },		// Ê - \xE6 in Mac Roman, \xCA in Windows-1252
+	{ 0x00CB, "e" },		// Ë - \xE8 in Mac Roman, \xCB in Windows-1252
+	{ 0x00CC, "i" },		// Ì - \xED in Mac Roman, \xCC in Windows-1252
+	{ 0x00CD, "i" },		// Í - \xEA in Mac Roman, \xCD in Windows-1252
+	{ 0x00CE, "i" },		// ÃŽ - \xEB in Mac Roman, \xCE in Windows-1252
+	{ 0x00CF, "i" },		// Ï - \xEC in Mac Roman, \xCF in Windows-1252
+	{ 0x00D0, "d" },		// Ð - \xD0 in Windows-1252
+	{ 0x00D1, "n" },		// Ñ - \x84 in Mac Roman, \xD1 in Windows-1252
+	{ 0x00D2, "o" },		// Ã’ - \xF1 in Mac Roman, \xD2 in Windows-1252
+	{ 0x00D3, "o" },		// Ó - \xEE in Mac Roman, \xD3 in Windows-1252
+	{ 0x00D4, "o" },		// Ô - \xEF in Mac Roman, \xD4 in Windows-1252
+	{ 0x00D5, "o" },		// Õ - \xCD in Mac Roman, \xD5 in Windows-1252
+	{ 0x00D6, "o" },		// Ö - \x85 in Mac Roman, \xD6 in Windows-1252
+	{ 0x00D8, "o" },		// Ø - \xAF in Mac Roman, \xD8 in Windows-1252
+	{ 0x00D9, "u" },		// Ù - \xF4 in Mac Roman, \xD9 in Windows-1252
+	{ 0x00DA, "u" },		// Ú - \xF2 in Mac Roman, \xDA in Windows-1252
+	{ 0x00DB, "u" },		// Û - \xF3 in Mac Roman, \xDB in Windows-1252
+	{ 0x00DC, "u" },		// Ü - \x86 in Mac Roman, \xDC in Windows-1252
+	{ 0x00DD, "y" },		// Ý - \xDD in Windows-1252
+	{ 0x00DE, "\xC3\xBE" },	// Þ - \xDE in Windows-1252
+	{ 0x00DF, "s" },		// ß - \xDF in Windows-1252
+	{ 0x00E0, "a" },		// à - \x88 in Mac Roman, \xE0 in Windows-1252
+	{ 0x00E1, "a" },		// á - \x87 in Mac Roman, \xE1 in Windows-1252
+	{ 0x00E2, "a" },		// â - \x89 in Mac Roman, \xE2 in Windows-1252
+	{ 0x00E3, "a" },		// ã - \x8B in Mac Roman, \xE3 in Windows-1252
+	{ 0x00E4, "a" },		// ä - \x8A in Mac Roman, \xE4 in Windows-1252
+	{ 0x00E5, "a" },		// å - \x8C in Mac Roman, \xE5 in Windows-1252
+	{ 0x00E6, "ae" },		// æ - \xBE in Mac Roman, \xE6 in Windows-1252
+	{ 0x00E7, "c" },		// ç - \x8D in Mac Roman, \xE7 in Windows-1252
+	{ 0x00E8, "e" },		// è - \x8F in Mac Roman, \xE8 in Windows-1252
+	{ 0x00E9, "e" },		// é - \x8E in Mac Roman, \xE9 in Windows-1252
+	{ 0x00EA, "e" },		// ê - \x90 in Mac Roman, \xEA in Windows-1252
+	{ 0x00EB, "e" },		// ë - \x91 in Mac Roman, \xEB in Windows-1252
+	{ 0x00EC, "i" },		// ì - \x93 in Mac Roman, \xEC in Windows-1252
+	{ 0x00ED, "i" },		// í - \x92 in Mac Roman, \xED in Windows-1252
+	{ 0x00EE, "i" },		// î - \x94 in Mac Roman, \xEE in Windows-1252
+	{ 0x00EF, "i" },		// ï - \x95 in Mac Roman, \xEF in Windows-1252
+	{ 0x00F0, "d" },		// ð - \xF0 in Windows-1252
+	{ 0x00F1, "n" },		// ñ - \x96 in Mac Roman, \xF1 in Windows-1252
+	{ 0x00F2, "o" },		// ò - \x98 in Mac Roman, \xF2 in Windows-1252
+	{ 0x00F3, "o" },		// ó - \x97 in Mac Roman, \xF3 in Windows-1252
+	{ 0x00F4, "o" },		// ô - \x99 in Mac Roman, \xF4 in Windows-1252
+	{ 0x00F5, "o" },		// õ - \x9B in Mac Roman, \xF5 in Windows-1252
+	{ 0x00F6, "o" },		// ö - \x9A in Mac Roman, \xF6 in Windows-1252
+	{ 0x00F8, "o" },		// ø - \xBF in Mac Roman, \xF8 in Windows-1252
+	{ 0x00F9, "u" },		// ù - \x9D in Mac Roman, \xF9 in Windows-1252
+	{ 0x00FA, "u" },		// ú - \x9C in Mac Roman, \xFA in Windows-1252
+	{ 0x00FB, "u" },		// û - \x9E in Mac Roman, \xFB in Windows-1252
+	{ 0x00FC, "u" },		// ü - \x9F in Mac Roman, \xFC in Windows-1252
+	{ 0x00FD, "y" },		// ý - \xFD in Windows-1252
+	{ 0x00FF, "y" },		// ÿ - \xD8 in Mac Roman
+	{ 0x0131, "i" },		// ı - \xF5 in Mac Roman
+	{ 0x0152, "oe" },		// Å’ - \xCE in Mac Roman, \x8C in Windows-1252
+	{ 0x0153, "oe" },		// Å“ - \xCF in Mac Roman, \x9C in Windows-1252
+	{ 0x0160, "s" },		// Å  - \x8A in Windows-1252
+	{ 0x0161, "s" },		// Å¡ - \x9A in Windows-1252
+	{ 0x0178, "y" },		// Ÿ - \xD9 in Mac Roman, \x9F in Windows-1252
+	{ 0x017D, "z" },		// Ž - \x8E in Windows-1252
+	{ 0x017E, "z" },		// ž - \x9E in Windows-1252
+	{ 0xFB01, "fi" },		// fi - \xDE in Mac Roman
+	{ 0xFB02, "fl" },		// fl - \xDF in Mac Roman
+	{ 0, NULL }
+};
+
+void Lingo::initCharNormalizations() {
+	for (char ch = 'A'; ch <= 'Z'; ch++) {
+		_charNormalizations[ch] = Common::U32String(Common::String(tolower(ch)), Common::kUtf8);
+	}
+	for (CharNormProto *norm = charNormProtos; norm->to; norm++) {
+		_charNormalizations[norm->from] = Common::U32String(norm->to, Common::kUtf8);
+	}
+}
+
+Common::String Lingo::normalizeString(const Common::String &str) {
+	Common::U32String u32Str = str.decode(Common::kUtf8);
+	Common::U32String res;
+	for (const Common::u32char_type_t *ch = u32Str.c_str(); *ch; ch++) {
+		if (_charNormalizations.contains(*ch))
+			res += _charNormalizations[*ch];
+		else
+			res += *ch;
+	}
+	return res.encode(Common::kUtf8);
+}
+
+} // End of namespace Director
diff --git a/engines/director/lingo/lingo.cpp b/engines/director/lingo/lingo.cpp
index 69a02c8cbd..91328bdc26 100644
--- a/engines/director/lingo/lingo.cpp
+++ b/engines/director/lingo/lingo.cpp
@@ -46,93 +46,6 @@ namespace Director {
 
 Lingo *g_lingo;
 
-static struct CharNormProto {
-	Common::u32char_type_t from;
-	const char *to;
-} charNormProtos[] = {
-	{ 0x00C0, "a" },		// À - \xCB in Mac Roman, \xC0 in Windows-1252
-	{ 0x00C1, "a" },		// Á - \xE7 in Mac Roman, \xC1 in Windows-1252
-	{ 0x00C2, "a" },		// Â - \xE5 in Mac Roman, \xC2 in Windows-1252
-	{ 0x00C3, "a" },		// Ã - \xCC in Mac Roman, \xC3 in Windows-1252
-	{ 0x00C4, "a" },		// Ä - \x80 in Mac Roman, \xC4 in Windows-1252
-	{ 0x00C5, "a" },		// Ã… - \x81 in Mac Roman, \xC5 in Windows-1252
-	{ 0x00C6, "ae" },		// Æ - \xAE in Mac Roman, \xC6 in Windows-1252
-	{ 0x00C7, "c" },		// Ç - \x82 in Mac Roman, \xC7 in Windows-1252
-	{ 0x00C8, "e" },		// È - \xE9 in Mac Roman, \xC8 in Windows-1252
-	{ 0x00C9, "e" },		// É - \x83 in Mac Roman, \xC9 in Windows-1252
-	{ 0x00CA, "e" },		// Ê - \xE6 in Mac Roman, \xCA in Windows-1252
-	{ 0x00CB, "e" },		// Ë - \xE8 in Mac Roman, \xCB in Windows-1252
-	{ 0x00CC, "i" },		// Ì - \xED in Mac Roman, \xCC in Windows-1252
-	{ 0x00CD, "i" },		// Í - \xEA in Mac Roman, \xCD in Windows-1252
-	{ 0x00CE, "i" },		// ÃŽ - \xEB in Mac Roman, \xCE in Windows-1252
-	{ 0x00CF, "i" },		// Ï - \xEC in Mac Roman, \xCF in Windows-1252
-	{ 0x00D0, "d" },		// Ð - \xD0 in Windows-1252
-	{ 0x00D1, "n" },		// Ñ - \x84 in Mac Roman, \xD1 in Windows-1252
-	{ 0x00D2, "o" },		// Ã’ - \xF1 in Mac Roman, \xD2 in Windows-1252
-	{ 0x00D3, "o" },		// Ó - \xEE in Mac Roman, \xD3 in Windows-1252
-	{ 0x00D4, "o" },		// Ô - \xEF in Mac Roman, \xD4 in Windows-1252
-	{ 0x00D5, "o" },		// Õ - \xCD in Mac Roman, \xD5 in Windows-1252
-	{ 0x00D6, "o" },		// Ö - \x85 in Mac Roman, \xD6 in Windows-1252
-	{ 0x00D8, "o" },		// Ø - \xAF in Mac Roman, \xD8 in Windows-1252
-	{ 0x00D9, "u" },		// Ù - \xF4 in Mac Roman, \xD9 in Windows-1252
-	{ 0x00DA, "u" },		// Ú - \xF2 in Mac Roman, \xDA in Windows-1252
-	{ 0x00DB, "u" },		// Û - \xF3 in Mac Roman, \xDB in Windows-1252
-	{ 0x00DC, "u" },		// Ü - \x86 in Mac Roman, \xDC in Windows-1252
-	{ 0x00DD, "y" },		// Ý - \xDD in Windows-1252
-	{ 0x00DE, "\xC3\xBE" },	// Þ - \xDE in Windows-1252
-	{ 0x00DF, "s" },		// ß - \xDF in Windows-1252
-	{ 0x00E0, "a" },		// à - \x88 in Mac Roman, \xE0 in Windows-1252
-	{ 0x00E1, "a" },		// á - \x87 in Mac Roman, \xE1 in Windows-1252
-	{ 0x00E2, "a" },		// â - \x89 in Mac Roman, \xE2 in Windows-1252
-	{ 0x00E3, "a" },		// ã - \x8B in Mac Roman, \xE3 in Windows-1252
-	{ 0x00E4, "a" },		// ä - \x8A in Mac Roman, \xE4 in Windows-1252
-	{ 0x00E5, "a" },		// å - \x8C in Mac Roman, \xE5 in Windows-1252
-	{ 0x00E6, "ae" },		// æ - \xBE in Mac Roman, \xE6 in Windows-1252
-	{ 0x00E7, "c" },		// ç - \x8D in Mac Roman, \xE7 in Windows-1252
-	{ 0x00E8, "e" },		// è - \x8F in Mac Roman, \xE8 in Windows-1252
-	{ 0x00E9, "e" },		// é - \x8E in Mac Roman, \xE9 in Windows-1252
-	{ 0x00EA, "e" },		// ê - \x90 in Mac Roman, \xEA in Windows-1252
-	{ 0x00EB, "e" },		// ë - \x91 in Mac Roman, \xEB in Windows-1252
-	{ 0x00EC, "i" },		// ì - \x93 in Mac Roman, \xEC in Windows-1252
-	{ 0x00ED, "i" },		// í - \x92 in Mac Roman, \xED in Windows-1252
-	{ 0x00EE, "i" },		// î - \x94 in Mac Roman, \xEE in Windows-1252
-	{ 0x00EF, "i" },		// ï - \x95 in Mac Roman, \xEF in Windows-1252
-	{ 0x00F0, "d" },		// ð - \xF0 in Windows-1252
-	{ 0x00F1, "n" },		// ñ - \x96 in Mac Roman, \xF1 in Windows-1252
-	{ 0x00F2, "o" },		// ò - \x98 in Mac Roman, \xF2 in Windows-1252
-	{ 0x00F3, "o" },		// ó - \x97 in Mac Roman, \xF3 in Windows-1252
-	{ 0x00F4, "o" },		// ô - \x99 in Mac Roman, \xF4 in Windows-1252
-	{ 0x00F5, "o" },		// õ - \x9B in Mac Roman, \xF5 in Windows-1252
-	{ 0x00F6, "o" },		// ö - \x9A in Mac Roman, \xF6 in Windows-1252
-	{ 0x00F8, "o" },		// ø - \xBF in Mac Roman, \xF8 in Windows-1252
-	{ 0x00F9, "u" },		// ù - \x9D in Mac Roman, \xF9 in Windows-1252
-	{ 0x00FA, "u" },		// ú - \x9C in Mac Roman, \xFA in Windows-1252
-	{ 0x00FB, "u" },		// û - \x9E in Mac Roman, \xFB in Windows-1252
-	{ 0x00FC, "u" },		// ü - \x9F in Mac Roman, \xFC in Windows-1252
-	{ 0x00FD, "y" },		// ý - \xFD in Windows-1252
-	{ 0x00FF, "y" },		// ÿ - \xD8 in Mac Roman
-	{ 0x0131, "i" },		// ı - \xF5 in Mac Roman
-	{ 0x0152, "oe" },		// Å’ - \xCE in Mac Roman, \x8C in Windows-1252
-	{ 0x0153, "oe" },		// Å“ - \xCF in Mac Roman, \x9C in Windows-1252
-	{ 0x0160, "s" },		// Å  - \x8A in Windows-1252
-	{ 0x0161, "s" },		// Å¡ - \x9A in Windows-1252
-	{ 0x0178, "y" },		// Ÿ - \xD9 in Mac Roman, \x9F in Windows-1252
-	{ 0x017D, "z" },		// Ž - \x8E in Windows-1252
-	{ 0x017E, "z" },		// ž - \x9E in Windows-1252
-	{ 0xFB01, "fi" },		// fi - \xDE in Mac Roman
-	{ 0xFB02, "fl" },		// fl - \xDF in Mac Roman
-	{ 0, NULL }
-};
-
-void Lingo::initCharNormalizations() {
-	for (char ch = 'A'; ch <= 'Z'; ch++) {
-		_charNormalizations[ch] = Common::U32String(Common::String(tolower(ch)), Common::kUtf8);
-	}
-	for (CharNormProto *norm = charNormProtos; norm->to; norm++) {
-		_charNormalizations[norm->from] = Common::U32String(norm->to, Common::kUtf8);
-	}
-}
-
 int calcStringAlignment(const char *s) {
 	return calcCodeAlignment(strlen(s) + 1);
 }
@@ -1452,16 +1365,4 @@ CastMemberID Lingo::resolveCastMember(const Datum &memberID, const Datum &castLi
 	return CastMemberID(-1, castLib.asInt());
 }
 
-Common::String Lingo::normalizeString(const Common::String &str) {
-	Common::U32String u32Str = str.decode(Common::kUtf8);
-	Common::U32String res;
-	for (const Common::u32char_type_t *ch = u32Str.c_str(); *ch; ch++) {
-		if (_charNormalizations.contains(*ch))
-			res += _charNormalizations[*ch];
-		else
-			res += *ch;
-	}
-	return res.encode(Common::kUtf8);
-}
-
 } // End of namespace Director
diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h
index d017358212..7779bed1f4 100644
--- a/engines/director/lingo/lingo.h
+++ b/engines/director/lingo/lingo.h
@@ -294,8 +294,6 @@ public:
 	Datum findVarV4(int varType, const Datum &id);
 	CastMemberID resolveCastMember(const Datum &memberID, const Datum &castLib);
 
-	Common::String normalizeString(const Common::String &str);
-
 	int getAlignedType(const Datum &d1, const Datum &d2, bool numsOnly);
 
 	void printAllVars();
@@ -429,9 +427,13 @@ public:
 	void executeImmediateScripts(Frame *frame);
 	void executePerFrameHook(int frame, int subframe);
 
+	// lingo-utils.cpp
 private:
 	Common::HashMap<uint32, Common::U32String> _charNormalizations;
 	void initCharNormalizations();
+
+public:
+	Common::String normalizeString(const Common::String &str);
 };
 
 extern Lingo *g_lingo;
diff --git a/engines/director/module.mk b/engines/director/module.mk
index e220ea98c3..c15ae002b7 100644
--- a/engines/director/module.mk
+++ b/engines/director/module.mk
@@ -36,6 +36,7 @@ MODULE_OBJS = \
 	lingo/lingo-patcher.o \
 	lingo/lingo-preprocessor.o \
 	lingo/lingo-the.o \
+	lingo/lingo-utils.o \
 	lingo/xlibs/fileio.o \
 	lingo/xlibs/flushxobj.o \
 	lingo/xlibs/fplayxobj.o \


Commit: 6a2697e2ded0183a37b54780b189f8de975a5a75
    https://github.com/scummvm/scummvm/commit/6a2697e2ded0183a37b54780b189f8de975a5a75
Author: djsrv (dservilla at gmail.com)
Date: 2021-07-15T16:31:47-04:00

Commit Message:
DIRECTOR: LINGO: Restore use of strchr in isspec

Changed paths:
    engines/director/lingo/lingo-preprocessor.cpp


diff --git a/engines/director/lingo/lingo-preprocessor.cpp b/engines/director/lingo/lingo-preprocessor.cpp
index 9c6a172815..f485e9b741 100644
--- a/engines/director/lingo/lingo-preprocessor.cpp
+++ b/engines/director/lingo/lingo-preprocessor.cpp
@@ -27,28 +27,10 @@
 namespace Director {
 
 bool isspec(Common::u32char_type_t c) {
-	switch (c) {
-	case '-':
-	case '+':
-	case '*':
-	case '/':
-	case '%':
-	case '^':
-	case ':':
-	case ',':
-	case '(':
-	case ')':
-	case '>':
-	case '<':
-	case '&':
-	case '[':
-	case ']':
-	case '=':
-		return true;
-	default:
-		break;
-	}
-	return false;
+	if (c > 127)
+		return false;
+
+	return strchr("-+*/%^:,()><&[]=", (char)c) != NULL;
 }
 
 static Common::U32String nexttok(const Common::u32char_type_t *s, const Common::u32char_type_t **newP = nullptr) {




More information about the Scummvm-git-logs mailing list