diff --git a/genparser.sh b/genparser.sh
old mode 100644
new mode 100755
diff --git a/src/main/antlr4/GobraLexer.g4 b/src/main/antlr4/GobraLexer.g4
index 7db1c0e1f..db44fc749 100644
--- a/src/main/antlr4/GobraLexer.g4
+++ b/src/main/antlr4/GobraLexer.g4
@@ -85,3 +85,4 @@ IMPORT_PRE : 'importRequires';
PROOF : 'proof';
GHOST_EQUALS : '===';
GHOST_NOT_EQUALS : '!==';
+WITH : 'with';
diff --git a/src/main/antlr4/GobraParser.g4 b/src/main/antlr4/GobraParser.g4
index 632f06bdd..5b1a4fe8d 100644
--- a/src/main/antlr4/GobraParser.g4
+++ b/src/main/antlr4/GobraParser.g4
@@ -434,3 +434,10 @@ assign_op: ass_op=(
| AMPERSAND
| BIT_CLEAR
)? ASSIGN;
+
+// Add permission argument to range
+
+rangeClause: (
+ expressionList ASSIGN
+ | maybeAddressableIdentifierList DECLARE_ASSIGN
+ )? RANGE expression (WITH IDENTIFIER?)?;
diff --git a/src/main/java/viper/gobra/frontend/GobraLexer.java b/src/main/java/viper/gobra/frontend/GobraLexer.java
index 9eee0a38d..9f1810987 100644
--- a/src/main/java/viper/gobra/frontend/GobraLexer.java
+++ b/src/main/java/viper/gobra/frontend/GobraLexer.java
@@ -1,4 +1,4 @@
-// Generated from /Users/joao/Code/gobraHome/gobra/src/main/antlr4/GobraLexer.g4 by ANTLR 4.9.2
+// Generated from /main/antlr4/GobraLexer.g4 by ANTLR 4.9.1
package viper.gobra.frontend;
import org.antlr.v4.runtime.Lexer;
import org.antlr.v4.runtime.CharStream;
@@ -11,7 +11,7 @@
@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"})
public class GobraLexer extends Lexer {
- static { RuntimeMetaData.checkVersion("4.9.2", RuntimeMetaData.VERSION); }
+ static { RuntimeMetaData.checkVersion("4.9.1", RuntimeMetaData.VERSION); }
protected static final DFA[] _decisionToDFA;
protected static final PredictionContextCache _sharedContextCache =
@@ -27,21 +27,21 @@ public class GobraLexer extends Lexer {
PRED=53, TYPE_OF=54, IS_COMPARABLE=55, SHARE=56, ADDR_MOD=57, DOT_DOT=58,
SHARED=59, EXCLUSIVE=60, PREDICATE=61, WRITEPERM=62, NOPERM=63, TRUSTED=64,
OUTLINE=65, INIT_POST=66, IMPORT_PRE=67, PROOF=68, GHOST_EQUALS=69, GHOST_NOT_EQUALS=70,
- BREAK=71, DEFAULT=72, FUNC=73, INTERFACE=74, SELECT=75, CASE=76, DEFER=77,
- GO=78, MAP=79, STRUCT=80, CHAN=81, ELSE=82, GOTO=83, PACKAGE=84, SWITCH=85,
- CONST=86, FALLTHROUGH=87, IF=88, RANGE=89, TYPE=90, CONTINUE=91, FOR=92,
- IMPORT=93, RETURN=94, VAR=95, NIL_LIT=96, IDENTIFIER=97, L_PAREN=98, R_PAREN=99,
- L_CURLY=100, R_CURLY=101, L_BRACKET=102, R_BRACKET=103, ASSIGN=104, COMMA=105,
- SEMI=106, COLON=107, DOT=108, PLUS_PLUS=109, MINUS_MINUS=110, DECLARE_ASSIGN=111,
- ELLIPSIS=112, LOGICAL_OR=113, LOGICAL_AND=114, EQUALS=115, NOT_EQUALS=116,
- LESS=117, LESS_OR_EQUALS=118, GREATER=119, GREATER_OR_EQUALS=120, OR=121,
- DIV=122, MOD=123, LSHIFT=124, RSHIFT=125, BIT_CLEAR=126, EXCLAMATION=127,
- PLUS=128, MINUS=129, CARET=130, STAR=131, AMPERSAND=132, RECEIVE=133,
- DECIMAL_LIT=134, BINARY_LIT=135, OCTAL_LIT=136, HEX_LIT=137, HEX_FLOAT_LIT=138,
- IMAGINARY_LIT=139, RUNE_LIT=140, BYTE_VALUE=141, OCTAL_BYTE_VALUE=142,
- HEX_BYTE_VALUE=143, LITTLE_U_VALUE=144, BIG_U_VALUE=145, RAW_STRING_LIT=146,
- INTERPRETED_STRING_LIT=147, WS=148, COMMENT=149, TERMINATOR=150, LINE_COMMENT=151,
- WS_NLSEMI=152, COMMENT_NLSEMI=153, LINE_COMMENT_NLSEMI=154, EOS=155, OTHER=156;
+ WITH=71, BREAK=72, DEFAULT=73, FUNC=74, INTERFACE=75, SELECT=76, CASE=77,
+ DEFER=78, GO=79, MAP=80, STRUCT=81, CHAN=82, ELSE=83, GOTO=84, PACKAGE=85,
+ SWITCH=86, CONST=87, FALLTHROUGH=88, IF=89, RANGE=90, TYPE=91, CONTINUE=92,
+ FOR=93, IMPORT=94, RETURN=95, VAR=96, NIL_LIT=97, IDENTIFIER=98, L_PAREN=99,
+ R_PAREN=100, L_CURLY=101, R_CURLY=102, L_BRACKET=103, R_BRACKET=104, ASSIGN=105,
+ COMMA=106, SEMI=107, COLON=108, DOT=109, PLUS_PLUS=110, MINUS_MINUS=111,
+ DECLARE_ASSIGN=112, ELLIPSIS=113, LOGICAL_OR=114, LOGICAL_AND=115, EQUALS=116,
+ NOT_EQUALS=117, LESS=118, LESS_OR_EQUALS=119, GREATER=120, GREATER_OR_EQUALS=121,
+ OR=122, DIV=123, MOD=124, LSHIFT=125, RSHIFT=126, BIT_CLEAR=127, EXCLAMATION=128,
+ PLUS=129, MINUS=130, CARET=131, STAR=132, AMPERSAND=133, RECEIVE=134,
+ DECIMAL_LIT=135, BINARY_LIT=136, OCTAL_LIT=137, HEX_LIT=138, HEX_FLOAT_LIT=139,
+ IMAGINARY_LIT=140, RUNE_LIT=141, BYTE_VALUE=142, OCTAL_BYTE_VALUE=143,
+ HEX_BYTE_VALUE=144, LITTLE_U_VALUE=145, BIG_U_VALUE=146, RAW_STRING_LIT=147,
+ INTERPRETED_STRING_LIT=148, WS=149, COMMENT=150, TERMINATOR=151, LINE_COMMENT=152,
+ WS_NLSEMI=153, COMMENT_NLSEMI=154, LINE_COMMENT_NLSEMI=155, EOS=156, OTHER=157;
public static final int
NLSEMI=1;
public static String[] channelNames = {
@@ -63,9 +63,9 @@ private static String[] makeRuleNames() {
"GET", "DOM", "AXIOM", "NONE", "PRED", "TYPE_OF", "IS_COMPARABLE", "SHARE",
"ADDR_MOD", "DOT_DOT", "SHARED", "EXCLUSIVE", "PREDICATE", "WRITEPERM",
"NOPERM", "TRUSTED", "OUTLINE", "INIT_POST", "IMPORT_PRE", "PROOF", "GHOST_EQUALS",
- "GHOST_NOT_EQUALS", "BREAK", "DEFAULT", "FUNC", "INTERFACE", "SELECT",
- "CASE", "DEFER", "GO", "MAP", "STRUCT", "CHAN", "ELSE", "GOTO", "PACKAGE",
- "SWITCH", "CONST", "FALLTHROUGH", "IF", "RANGE", "TYPE", "CONTINUE",
+ "GHOST_NOT_EQUALS", "WITH", "BREAK", "DEFAULT", "FUNC", "INTERFACE",
+ "SELECT", "CASE", "DEFER", "GO", "MAP", "STRUCT", "CHAN", "ELSE", "GOTO",
+ "PACKAGE", "SWITCH", "CONST", "FALLTHROUGH", "IF", "RANGE", "TYPE", "CONTINUE",
"FOR", "IMPORT", "RETURN", "VAR", "NIL_LIT", "IDENTIFIER", "L_PAREN",
"R_PAREN", "L_CURLY", "R_CURLY", "L_BRACKET", "R_BRACKET", "ASSIGN",
"COMMA", "SEMI", "COLON", "DOT", "PLUS_PLUS", "MINUS_MINUS", "DECLARE_ASSIGN",
@@ -96,15 +96,15 @@ private static String[] makeLiteralNames() {
"'some'", "'get'", "'domain'", "'axiom'", "'none'", "'pred'", "'typeOf'",
"'isComparable'", "'share'", "'@'", "'..'", "'shared'", "'exclusive'",
"'predicate'", "'writePerm'", "'noPerm'", "'trusted'", "'outline'", "'initEnsures'",
- "'importRequires'", "'proof'", "'==='", "'!=='", "'break'", "'default'",
- "'func'", "'interface'", "'select'", "'case'", "'defer'", "'go'", "'map'",
- "'struct'", "'chan'", "'else'", "'goto'", "'package'", "'switch'", "'const'",
- "'fallthrough'", "'if'", "'range'", "'type'", "'continue'", "'for'",
- "'import'", "'return'", "'var'", "'nil'", null, "'('", "')'", "'{'",
- "'}'", "'['", "']'", "'='", "','", "';'", "':'", "'.'", "'++'", "'--'",
- "':='", "'...'", "'||'", "'&&'", "'=='", "'!='", "'<'", "'<='", "'>'",
- "'>='", "'|'", "'/'", "'%'", "'<<'", "'>>'", "'&^'", "'!'", "'+'", "'-'",
- "'^'", "'*'", "'&'", "'<-'"
+ "'importRequires'", "'proof'", "'==='", "'!=='", "'with'", "'break'",
+ "'default'", "'func'", "'interface'", "'select'", "'case'", "'defer'",
+ "'go'", "'map'", "'struct'", "'chan'", "'else'", "'goto'", "'package'",
+ "'switch'", "'const'", "'fallthrough'", "'if'", "'range'", "'type'",
+ "'continue'", "'for'", "'import'", "'return'", "'var'", "'nil'", null,
+ "'('", "')'", "'{'", "'}'", "'['", "']'", "'='", "','", "';'", "':'",
+ "'.'", "'++'", "'--'", "':='", "'...'", "'||'", "'&&'", "'=='", "'!='",
+ "'<'", "'<='", "'>'", "'>='", "'|'", "'/'", "'%'", "'<<'", "'>>'", "'&^'",
+ "'!'", "'+'", "'-'", "'^'", "'*'", "'&'", "'<-'"
};
}
private static final String[] _LITERAL_NAMES = makeLiteralNames();
@@ -119,9 +119,9 @@ private static String[] makeSymbolicNames() {
"GET", "DOM", "AXIOM", "NONE", "PRED", "TYPE_OF", "IS_COMPARABLE", "SHARE",
"ADDR_MOD", "DOT_DOT", "SHARED", "EXCLUSIVE", "PREDICATE", "WRITEPERM",
"NOPERM", "TRUSTED", "OUTLINE", "INIT_POST", "IMPORT_PRE", "PROOF", "GHOST_EQUALS",
- "GHOST_NOT_EQUALS", "BREAK", "DEFAULT", "FUNC", "INTERFACE", "SELECT",
- "CASE", "DEFER", "GO", "MAP", "STRUCT", "CHAN", "ELSE", "GOTO", "PACKAGE",
- "SWITCH", "CONST", "FALLTHROUGH", "IF", "RANGE", "TYPE", "CONTINUE",
+ "GHOST_NOT_EQUALS", "WITH", "BREAK", "DEFAULT", "FUNC", "INTERFACE",
+ "SELECT", "CASE", "DEFER", "GO", "MAP", "STRUCT", "CHAN", "ELSE", "GOTO",
+ "PACKAGE", "SWITCH", "CONST", "FALLTHROUGH", "IF", "RANGE", "TYPE", "CONTINUE",
"FOR", "IMPORT", "RETURN", "VAR", "NIL_LIT", "IDENTIFIER", "L_PAREN",
"R_PAREN", "L_CURLY", "R_CURLY", "L_BRACKET", "R_BRACKET", "ASSIGN",
"COMMA", "SEMI", "COLON", "DOT", "PLUS_PLUS", "MINUS_MINUS", "DECLARE_ASSIGN",
@@ -213,7 +213,7 @@ private boolean DECIMAL_FLOAT_LIT_sempred(RuleContext _localctx, int predIndex)
}
public static final String _serializedATN =
- "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\u009e\u05bc\b\1\b"+
+ "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\u009f\u05c3\b\1\b"+
"\1\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n"+
"\t\n\4\13\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21"+
"\4\22\t\22\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30"+
@@ -236,665 +236,668 @@ private boolean DECIMAL_FLOAT_LIT_sempred(RuleContext _localctx, int predIndex)
"\t\u009b\4\u009c\t\u009c\4\u009d\t\u009d\4\u009e\t\u009e\4\u009f\t\u009f"+
"\4\u00a0\t\u00a0\4\u00a1\t\u00a1\4\u00a2\t\u00a2\4\u00a3\t\u00a3\4\u00a4"+
"\t\u00a4\4\u00a5\t\u00a5\4\u00a6\t\u00a6\4\u00a7\t\u00a7\4\u00a8\t\u00a8"+
- "\4\u00a9\t\u00a9\4\u00aa\t\u00aa\3\2\3\2\5\2\u0159\n\2\3\2\3\2\3\3\3\3"+
- "\3\3\3\3\5\3\u0161\n\3\3\3\5\3\u0164\n\3\3\3\5\3\u0167\n\3\3\3\3\3\3\3"+
- "\3\3\5\3\u016d\n\3\5\3\u016f\n\3\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\5\3\5\3"+
- "\5\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\7\3\7\3\7\3\7\3\7"+
- "\3\7\3\7\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\n\3"+
- "\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13"+
- "\3\13\3\13\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3\r\3\r\3\r"+
- "\3\r\3\r\3\r\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3"+
- "\16\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\20\3\20\3\20\3\20\3\20\3\20\3"+
- "\20\3\20\3\20\3\20\3\20\3\21\3\21\3\21\3\22\3\22\3\22\3\22\3\22\3\22\3"+
- "\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\24\3\24\3\24\3\24\3\24\3"+
- "\25\3\25\3\25\3\25\3\25\3\25\3\25\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3"+
- "\27\3\27\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3\31\3\31\3\31\3"+
- "\31\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3"+
- "\33\3\33\3\33\3\33\3\33\3\33\3\34\3\34\3\34\3\35\3\35\3\36\3\36\3\36\3"+
- "\36\3\36\3\36\3\36\3\37\3\37\3\37\3\37\3\37\3\37\3 \3 \3 \3 \3 \3 \3 "+
- "\3 \3 \3 \3 \3 \3 \3!\3!\3!\3!\3!\3!\3!\3!\3!\3\"\3\"\3\"\3\"\3#\3#\3"+
- "#\3#\3$\3$\3$\3$\3$\3$\3%\3%\3&\3&\3&\3\'\3\'\3\'\3\'\3\'\3(\3(\3(\3("+
- "\3(\3(\3)\3)\3)\3)\3)\3)\3*\3*\3*\3*\3*\3*\3*\3+\3+\3+\3+\3+\3+\3+\3,"+
- "\3,\3,\3,\3,\3,\3,\3,\3,\3-\3-\3-\3-\3-\3-\3.\3.\3.\3.\3.\3.\3/\3/\3/"+
- "\3/\3/\3/\3/\3\60\3\60\3\60\3\60\3\60\3\60\3\61\3\61\3\61\3\61\3\61\3"+
- "\61\3\61\3\62\3\62\3\62\3\62\3\62\3\62\3\63\3\63\3\63\3\63\3\63\3\63\3"+
- "\63\3\63\3\63\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\65\3\65\3\65\3"+
- "\65\3\65\3\65\3\65\3\66\3\66\3\66\3\66\3\66\3\67\3\67\3\67\3\67\3\67\3"+
- "\67\3\67\3\67\3\67\38\38\38\38\38\38\38\38\38\38\38\38\38\38\38\39\39"+
- "\39\39\39\39\3:\3:\3:\3:\3;\3;\3;\3<\3<\3<\3<\3<\3<\3<\3=\3=\3=\3=\3="+
- "\3=\3=\3=\3=\3=\3>\3>\3>\3>\3>\3>\3>\3>\3>\3>\3?\3?\3?\3?\3?\3?\3?\3?"+
- "\3?\3?\3?\3?\3@\3@\3@\3@\3@\3@\3@\3@\3@\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A"+
- "\3B\3B\3B\3B\3B\3B\3B\3B\3C\3C\3C\3C\3C\3C\3C\3C\3C\3C\3C\3C\3D\3D\3D"+
- "\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3E\3E\3E\3E\3E\3E\3F\3F\3F\3F\3G"+
- "\3G\3G\3G\3H\3H\3H\3H\3H\3H\3H\3H\3I\3I\3I\3I\3I\3I\3I\3I\3J\3J\3J\3J"+
- "\3J\3K\3K\3K\3K\3K\3K\3K\3K\3K\3K\3L\3L\3L\3L\3L\3L\3L\3M\3M\3M\3M\3M"+
- "\3N\3N\3N\3N\3N\3N\3O\3O\3O\3P\3P\3P\3P\3Q\3Q\3Q\3Q\3Q\3Q\3Q\3R\3R\3R"+
- "\3R\3R\3S\3S\3S\3S\3S\3T\3T\3T\3T\3T\3U\3U\3U\3U\3U\3U\3U\3U\3V\3V\3V"+
- "\3V\3V\3V\3V\3W\3W\3W\3W\3W\3W\3X\3X\3X\3X\3X\3X\3X\3X\3X\3X\3X\3X\3X"+
- "\3X\3Y\3Y\3Y\3Z\3Z\3Z\3Z\3Z\3Z\3[\3[\3[\3[\3[\3\\\3\\\3\\\3\\\3\\\3\\"+
- "\3\\\3\\\3\\\3\\\3\\\3]\3]\3]\3]\3^\3^\3^\3^\3^\3^\3^\3_\3_\3_\3_\3_\3"+
- "_\3_\3_\3_\3`\3`\3`\3`\3a\3a\3a\3a\3a\3a\3b\3b\3b\7b\u0407\nb\fb\16b\u040a"+
- "\13b\3b\3b\3c\3c\3d\3d\3d\3d\3e\3e\3f\3f\3f\3f\3g\3g\3h\3h\3h\3h\3i\3"+
- "i\3j\3j\3k\3k\3l\3l\3m\3m\3n\3n\3n\3n\3n\3o\3o\3o\3o\3o\3p\3p\3p\3q\3"+
- "q\3q\3q\3r\3r\3r\3s\3s\3s\3t\3t\3t\3u\3u\3u\3v\3v\3w\3w\3w\3x\3x\3y\3"+
- "y\3y\3z\3z\3{\3{\3|\3|\3}\3}\3}\3~\3~\3~\3\177\3\177\3\177\3\u0080\3\u0080"+
- "\3\u0081\3\u0081\3\u0082\3\u0082\3\u0083\3\u0083\3\u0084\3\u0084\3\u0085"+
- "\3\u0085\3\u0086\3\u0086\3\u0086\3\u0087\3\u0087\3\u0087\5\u0087\u0472"+
- "\n\u0087\3\u0087\7\u0087\u0475\n\u0087\f\u0087\16\u0087\u0478\13\u0087"+
- "\5\u0087\u047a\n\u0087\3\u0087\3\u0087\3\u0088\3\u0088\3\u0088\5\u0088"+
- "\u0481\n\u0088\3\u0088\6\u0088\u0484\n\u0088\r\u0088\16\u0088\u0485\3"+
- "\u0088\3\u0088\3\u0089\3\u0089\5\u0089\u048c\n\u0089\3\u0089\5\u0089\u048f"+
- "\n\u0089\3\u0089\6\u0089\u0492\n\u0089\r\u0089\16\u0089\u0493\3\u0089"+
- "\3\u0089\3\u008a\3\u008a\3\u008a\5\u008a\u049b\n\u008a\3\u008a\6\u008a"+
- "\u049e\n\u008a\r\u008a\16\u008a\u049f\3\u008a\3\u008a\3\u008b\3\u008b"+
- "\3\u008b\3\u008b\3\u008b\3\u008c\5\u008c\u04aa\n\u008c\3\u008c\6\u008c"+
- "\u04ad\n\u008c\r\u008c\16\u008c\u04ae\3\u008c\3\u008c\5\u008c\u04b3\n"+
- "\u008c\3\u008c\7\u008c\u04b6\n\u008c\f\u008c\16\u008c\u04b9\13\u008c\5"+
- "\u008c\u04bb\n\u008c\3\u008c\3\u008c\3\u008c\5\u008c\u04c0\n\u008c\3\u008c"+
- "\7\u008c\u04c3\n\u008c\f\u008c\16\u008c\u04c6\13\u008c\5\u008c\u04c8\n"+
- "\u008c\3\u008d\3\u008d\3\u008d\3\u008d\3\u008e\3\u008e\3\u008e\3\u008e"+
- "\3\u008e\5\u008e\u04d3\n\u008e\3\u008e\3\u008e\3\u008e\3\u008e\3\u008f"+
- "\3\u008f\3\u008f\5\u008f\u04dc\n\u008f\3\u008f\3\u008f\3\u0090\3\u0090"+
- "\3\u0090\3\u0090\3\u0091\3\u0091\5\u0091\u04e6\n\u0091\3\u0092\3\u0092"+
- "\3\u0092\3\u0092\3\u0092\3\u0093\3\u0093\3\u0093\3\u0093\3\u0093\3\u0094"+
- "\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0095\3\u0095\3\u0095"+
- "\3\u0095\3\u0095\3\u0095\3\u0095\3\u0095\3\u0095\3\u0095\3\u0095\3\u0096"+
- "\3\u0096\7\u0096\u0506\n\u0096\f\u0096\16\u0096\u0509\13\u0096\3\u0096"+
- "\3\u0096\3\u0096\3\u0096\3\u0097\3\u0097\3\u0097\7\u0097\u0512\n\u0097"+
- "\f\u0097\16\u0097\u0515\13\u0097\3\u0097\3\u0097\3\u0097\3\u0097\3\u0098"+
- "\6\u0098\u051c\n\u0098\r\u0098\16\u0098\u051d\3\u0098\3\u0098\3\u0099"+
- "\3\u0099\3\u0099\3\u0099\7\u0099\u0526\n\u0099\f\u0099\16\u0099\u0529"+
- "\13\u0099\3\u0099\3\u0099\3\u0099\3\u0099\3\u0099\3\u009a\6\u009a\u0531"+
- "\n\u009a\r\u009a\16\u009a\u0532\3\u009a\3\u009a\3\u009b\3\u009b\3\u009b"+
- "\3\u009b\7\u009b\u053b\n\u009b\f\u009b\16\u009b\u053e\13\u009b\3\u009b"+
- "\3\u009b\3\u009c\3\u009c\3\u009c\3\u009c\5\u009c\u0546\n\u009c\3\u009d"+
- "\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d"+
- "\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d"+
- "\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\5\u009d\u0562"+
- "\n\u009d\3\u009e\3\u009e\5\u009e\u0566\n\u009e\3\u009e\7\u009e\u0569\n"+
- "\u009e\f\u009e\16\u009e\u056c\13\u009e\3\u009f\3\u009f\3\u00a0\3\u00a0"+
- "\3\u00a1\3\u00a1\3\u00a2\3\u00a2\5\u00a2\u0576\n\u00a2\3\u00a2\3\u00a2"+
- "\3\u00a3\3\u00a3\5\u00a3\u057c\n\u00a3\3\u00a4\3\u00a4\3\u00a5\3\u00a5"+
- "\3\u00a6\6\u00a6\u0583\n\u00a6\r\u00a6\16\u00a6\u0584\3\u00a6\3\u00a6"+
- "\3\u00a7\3\u00a7\3\u00a7\3\u00a7\7\u00a7\u058d\n\u00a7\f\u00a7\16\u00a7"+
- "\u0590\13\u00a7\3\u00a7\3\u00a7\3\u00a7\3\u00a7\3\u00a7\3\u00a8\3\u00a8"+
- "\3\u00a8\3\u00a8\7\u00a8\u059b\n\u00a8\f\u00a8\16\u00a8\u059e\13\u00a8"+
- "\3\u00a8\3\u00a8\3\u00a9\6\u00a9\u05a3\n\u00a9\r\u00a9\16\u00a9\u05a4"+
- "\3\u00a9\3\u00a9\3\u00a9\3\u00a9\3\u00a9\7\u00a9\u05ac\n\u00a9\f\u00a9"+
- "\16\u00a9\u05af\13\u00a9\3\u00a9\3\u00a9\3\u00a9\5\u00a9\u05b4\n\u00a9"+
- "\3\u00a9\3\u00a9\3\u00aa\3\u00aa\3\u00aa\3\u00aa\3\u00aa\5\u0527\u058e"+
- "\u05ad\2\u00ab\4\3\6\4\b\5\n\6\f\7\16\b\20\t\22\n\24\13\26\f\30\r\32\16"+
- "\34\17\36\20 \21\"\22$\23&\24(\25*\26,\27.\30\60\31\62\32\64\33\66\34"+
- "8\35:\36<\37> @!B\"D#F$H%J&L\'N(P)R*T+V,X-Z.\\/^\60`\61b\62d\63f\64h\65"+
- "j\66l\67n8p9r:t;v|?~@\u0080A\u0082B\u0084C\u0086D\u0088E\u008aF\u008c"+
- "G\u008eH\u0090I\u0092J\u0094K\u0096L\u0098M\u009aN\u009cO\u009eP\u00a0"+
- "Q\u00a2R\u00a4S\u00a6T\u00a8U\u00aaV\u00acW\u00aeX\u00b0Y\u00b2Z\u00b4"+
- "[\u00b6\\\u00b8]\u00ba^\u00bc_\u00be`\u00c0a\u00c2b\u00c4c\u00c6d\u00c8"+
- "e\u00caf\u00ccg\u00ceh\u00d0i\u00d2j\u00d4k\u00d6l\u00d8m\u00dan\u00dc"+
- "o\u00dep\u00e0q\u00e2r\u00e4s\u00e6t\u00e8u\u00eav\u00ecw\u00eex\u00f0"+
- "y\u00f2z\u00f4{\u00f6|\u00f8}\u00fa~\u00fc\177\u00fe\u0080\u0100\u0081"+
- "\u0102\u0082\u0104\u0083\u0106\u0084\u0108\u0085\u010a\u0086\u010c\u0087"+
- "\u010e\u0088\u0110\u0089\u0112\u008a\u0114\u008b\u0116\u008c\u0118\2\u011a"+
- "\2\u011c\u008d\u011e\2\u0120\u008e\u0122\u008f\u0124\u0090\u0126\u0091"+
- "\u0128\u0092\u012a\u0093\u012c\u0094\u012e\u0095\u0130\u0096\u0132\u0097"+
- "\u0134\u0098\u0136\u0099\u0138\2\u013a\2\u013c\2\u013e\2\u0140\2\u0142"+
- "\2\u0144\2\u0146\2\u0148\2\u014a\2\u014c\u009a\u014e\u009b\u0150\u009c"+
- "\u0152\u009d\u0154\u009e\4\2\3\23\3\2\63;\3\2\62;\4\2DDdd\4\2QQqq\4\2"+
- "ZZzz\4\2RRrr\4\2--//\3\2bb\4\2$$^^\4\2\13\13\"\"\4\2\f\f\17\17\5\2\f\f"+
- "\17\17))\13\2$$))^^cdhhppttvvxx\3\2\629\5\2\62;CHch\3\2\62\63\4\2GGgg"+
- "\49\2\62\2;\2\u0662\2\u066b\2\u06f2\2\u06fb\2\u07c2\2\u07cb\2\u0968\2"+
- "\u0971\2\u09e8\2\u09f1\2\u0a68\2\u0a71\2\u0ae8\2\u0af1\2\u0b68\2\u0b71"+
- "\2\u0be8\2\u0bf1\2\u0c68\2\u0c71\2\u0ce8\2\u0cf1\2\u0d68\2\u0d71\2\u0de8"+
- "\2\u0df1\2\u0e52\2\u0e5b\2\u0ed2\2\u0edb\2\u0f22\2\u0f2b\2\u1042\2\u104b"+
- "\2\u1092\2\u109b\2\u17e2\2\u17eb\2\u1812\2\u181b\2\u1948\2\u1951\2\u19d2"+
- "\2\u19db\2\u1a82\2\u1a8b\2\u1a92\2\u1a9b\2\u1b52\2\u1b5b\2\u1bb2\2\u1bbb"+
- "\2\u1c42\2\u1c4b\2\u1c52\2\u1c5b\2\ua622\2\ua62b\2\ua8d2\2\ua8db\2\ua902"+
- "\2\ua90b\2\ua9d2\2\ua9db\2\ua9f2\2\ua9fb\2\uaa52\2\uaa5b\2\uabf2\2\uabfb"+
- "\2\uff12\2\uff1b\2\u04a2\3\u04ab\3\u1068\3\u1071\3\u10f2\3\u10fb\3\u1138"+
- "\3\u1141\3\u11d2\3\u11db\3\u12f2\3\u12fb\3\u1452\3\u145b\3\u14d2\3\u14db"+
- "\3\u1652\3\u165b\3\u16c2\3\u16cb\3\u1732\3\u173b\3\u18e2\3\u18eb\3\u1c52"+
- "\3\u1c5b\3\u1d52\3\u1d5b\3\u6a62\3\u6a6b\3\u6b52\3\u6b5b\3\ud7d0\3\ud801"+
- "\3\ue952\3\ue95b\3\u024b\2C\2\\\2c\2|\2\u00ac\2\u00ac\2\u00b7\2\u00b7"+
- "\2\u00bc\2\u00bc\2\u00c2\2\u00d8\2\u00da\2\u00f8\2\u00fa\2\u02c3\2\u02c8"+
- "\2\u02d3\2\u02e2\2\u02e6\2\u02ee\2\u02ee\2\u02f0\2\u02f0\2\u0372\2\u0376"+
- "\2\u0378\2\u0379\2\u037c\2\u037f\2\u0381\2\u0381\2\u0388\2\u0388\2\u038a"+
- "\2\u038c\2\u038e\2\u038e\2\u0390\2\u03a3\2\u03a5\2\u03f7\2\u03f9\2\u0483"+
- "\2\u048c\2\u0531\2\u0533\2\u0558\2\u055b\2\u055b\2\u0563\2\u0589\2\u05d2"+
- "\2\u05ec\2\u05f2\2\u05f4\2\u0622\2\u064c\2\u0670\2\u0671\2\u0673\2\u06d5"+
- "\2\u06d7\2\u06d7\2\u06e7\2\u06e8\2\u06f0\2\u06f1\2\u06fc\2\u06fe\2\u0701"+
- "\2\u0701\2\u0712\2\u0712\2\u0714\2\u0731\2\u074f\2\u07a7\2\u07b3\2\u07b3"+
- "\2\u07cc\2\u07ec\2\u07f6\2\u07f7\2\u07fc\2\u07fc\2\u0802\2\u0817\2\u081c"+
- "\2\u081c\2\u0826\2\u0826\2\u082a\2\u082a\2\u0842\2\u085a\2\u0862\2\u086c"+
- "\2\u08a2\2\u08b6\2\u08b8\2\u08bf\2\u0906\2\u093b\2\u093f\2\u093f\2\u0952"+
- "\2\u0952\2\u095a\2\u0963\2\u0973\2\u0982\2\u0987\2\u098e\2\u0991\2\u0992"+
- "\2\u0995\2\u09aa\2\u09ac\2\u09b2\2\u09b4\2\u09b4\2\u09b8\2\u09bb\2\u09bf"+
- "\2\u09bf\2\u09d0\2\u09d0\2\u09de\2\u09df\2\u09e1\2\u09e3\2\u09f2\2\u09f3"+
- "\2\u09fe\2\u09fe\2\u0a07\2\u0a0c\2\u0a11\2\u0a12\2\u0a15\2\u0a2a\2\u0a2c"+
- "\2\u0a32\2\u0a34\2\u0a35\2\u0a37\2\u0a38\2\u0a3a\2\u0a3b\2\u0a5b\2\u0a5e"+
- "\2\u0a60\2\u0a60\2\u0a74\2\u0a76\2\u0a87\2\u0a8f\2\u0a91\2\u0a93\2\u0a95"+
- "\2\u0aaa\2\u0aac\2\u0ab2\2\u0ab4\2\u0ab5\2\u0ab7\2\u0abb\2\u0abf\2\u0abf"+
- "\2\u0ad2\2\u0ad2\2\u0ae2\2\u0ae3\2\u0afb\2\u0afb\2\u0b07\2\u0b0e\2\u0b11"+
- "\2\u0b12\2\u0b15\2\u0b2a\2\u0b2c\2\u0b32\2\u0b34\2\u0b35\2\u0b37\2\u0b3b"+
- "\2\u0b3f\2\u0b3f\2\u0b5e\2\u0b5f\2\u0b61\2\u0b63\2\u0b73\2\u0b73\2\u0b85"+
- "\2\u0b85\2\u0b87\2\u0b8c\2\u0b90\2\u0b92\2\u0b94\2\u0b97\2\u0b9b\2\u0b9c"+
- "\2\u0b9e\2\u0b9e\2\u0ba0\2\u0ba1\2\u0ba5\2\u0ba6\2\u0baa\2\u0bac\2\u0bb0"+
- "\2\u0bbb\2\u0bd2\2\u0bd2\2\u0c07\2\u0c0e\2\u0c10\2\u0c12\2\u0c14\2\u0c2a"+
- "\2\u0c2c\2\u0c3b\2\u0c3f\2\u0c3f\2\u0c5a\2\u0c5c\2\u0c62\2\u0c63\2\u0c82"+
- "\2\u0c82\2\u0c87\2\u0c8e\2\u0c90\2\u0c92\2\u0c94\2\u0caa\2\u0cac\2\u0cb5"+
- "\2\u0cb7\2\u0cbb\2\u0cbf\2\u0cbf\2\u0ce0\2\u0ce0\2\u0ce2\2\u0ce3\2\u0cf3"+
- "\2\u0cf4\2\u0d07\2\u0d0e\2\u0d10\2\u0d12\2\u0d14\2\u0d3c\2\u0d3f\2\u0d3f"+
- "\2\u0d50\2\u0d50\2\u0d56\2\u0d58\2\u0d61\2\u0d63\2\u0d7c\2\u0d81\2\u0d87"+
- "\2\u0d98\2\u0d9c\2\u0db3\2\u0db5\2\u0dbd\2\u0dbf\2\u0dbf\2\u0dc2\2\u0dc8"+
- "\2\u0e03\2\u0e32\2\u0e34\2\u0e35\2\u0e42\2\u0e48\2\u0e83\2\u0e84\2\u0e86"+
- "\2\u0e86\2\u0e89\2\u0e8a\2\u0e8c\2\u0e8c\2\u0e8f\2\u0e8f\2\u0e96\2\u0e99"+
- "\2\u0e9b\2\u0ea1\2\u0ea3\2\u0ea5\2\u0ea7\2\u0ea7\2\u0ea9\2\u0ea9\2\u0eac"+
- "\2\u0ead\2\u0eaf\2\u0eb2\2\u0eb4\2\u0eb5\2\u0ebf\2\u0ebf\2\u0ec2\2\u0ec6"+
- "\2\u0ec8\2\u0ec8\2\u0ede\2\u0ee1\2\u0f02\2\u0f02\2\u0f42\2\u0f49\2\u0f4b"+
- "\2\u0f6e\2\u0f8a\2\u0f8e\2\u1002\2\u102c\2\u1041\2\u1041\2\u1052\2\u1057"+
- "\2\u105c\2\u105f\2\u1063\2\u1063\2\u1067\2\u1068\2\u1070\2\u1072\2\u1077"+
- "\2\u1083\2\u1090\2\u1090\2\u10a2\2\u10c7\2\u10c9\2\u10c9\2\u10cf\2\u10cf"+
- "\2\u10d2\2\u10fc\2\u10fe\2\u124a\2\u124c\2\u124f\2\u1252\2\u1258\2\u125a"+
- "\2\u125a\2\u125c\2\u125f\2\u1262\2\u128a\2\u128c\2\u128f\2\u1292\2\u12b2"+
- "\2\u12b4\2\u12b7\2\u12ba\2\u12c0\2\u12c2\2\u12c2\2\u12c4\2\u12c7\2\u12ca"+
- "\2\u12d8\2\u12da\2\u1312\2\u1314\2\u1317\2\u131a\2\u135c\2\u1382\2\u1391"+
- "\2\u13a2\2\u13f7\2\u13fa\2\u13ff\2\u1403\2\u166e\2\u1671\2\u1681\2\u1683"+
- "\2\u169c\2\u16a2\2\u16ec\2\u16f3\2\u16fa\2\u1702\2\u170e\2\u1710\2\u1713"+
- "\2\u1722\2\u1733\2\u1742\2\u1753\2\u1762\2\u176e\2\u1770\2\u1772\2\u1782"+
- "\2\u17b5\2\u17d9\2\u17d9\2\u17de\2\u17de\2\u1822\2\u1879\2\u1882\2\u1886"+
- "\2\u1889\2\u18aa\2\u18ac\2\u18ac\2\u18b2\2\u18f7\2\u1902\2\u1920\2\u1952"+
- "\2\u196f\2\u1972\2\u1976\2\u1982\2\u19ad\2\u19b2\2\u19cb\2\u1a02\2\u1a18"+
- "\2\u1a22\2\u1a56\2\u1aa9\2\u1aa9\2\u1b07\2\u1b35\2\u1b47\2\u1b4d\2\u1b85"+
- "\2\u1ba2\2\u1bb0\2\u1bb1\2\u1bbc\2\u1be7\2\u1c02\2\u1c25\2\u1c4f\2\u1c51"+
- "\2\u1c5c\2\u1c7f\2\u1c82\2\u1c8a\2\u1ceb\2\u1cee\2\u1cf0\2\u1cf3\2\u1cf7"+
- "\2\u1cf8\2\u1d02\2\u1dc1\2\u1e02\2\u1f17\2\u1f1a\2\u1f1f\2\u1f22\2\u1f47"+
- "\2\u1f4a\2\u1f4f\2\u1f52\2\u1f59\2\u1f5b\2\u1f5b\2\u1f5d\2\u1f5d\2\u1f5f"+
- "\2\u1f5f\2\u1f61\2\u1f7f\2\u1f82\2\u1fb6\2\u1fb8\2\u1fbe\2\u1fc0\2\u1fc0"+
- "\2\u1fc4\2\u1fc6\2\u1fc8\2\u1fce\2\u1fd2\2\u1fd5\2\u1fd8\2\u1fdd\2\u1fe2"+
- "\2\u1fee\2\u1ff4\2\u1ff6\2\u1ff8\2\u1ffe\2\u2073\2\u2073\2\u2081\2\u2081"+
- "\2\u2092\2\u209e\2\u2104\2\u2104\2\u2109\2\u2109\2\u210c\2\u2115\2\u2117"+
- "\2\u2117\2\u211b\2\u211f\2\u2126\2\u2126\2\u2128\2\u2128\2\u212a\2\u212a"+
- "\2\u212c\2\u212f\2\u2131\2\u213b\2\u213e\2\u2141\2\u2147\2\u214b\2\u2150"+
- "\2\u2150\2\u2185\2\u2186\2\u2c02\2\u2c30\2\u2c32\2\u2c60\2\u2c62\2\u2ce6"+
- "\2\u2ced\2\u2cf0\2\u2cf4\2\u2cf5\2\u2d02\2\u2d27\2\u2d29\2\u2d29\2\u2d2f"+
- "\2\u2d2f\2\u2d32\2\u2d69\2\u2d71\2\u2d71\2\u2d82\2\u2d98\2\u2da2\2\u2da8"+
- "\2\u2daa\2\u2db0\2\u2db2\2\u2db8\2\u2dba\2\u2dc0\2\u2dc2\2\u2dc8\2\u2dca"+
- "\2\u2dd0\2\u2dd2\2\u2dd8\2\u2dda\2\u2de0\2\u2e31\2\u2e31\2\u3007\2\u3008"+
- "\2\u3033\2\u3037\2\u303d\2\u303e\2\u3043\2\u3098\2\u309f\2\u30a1\2\u30a3"+
- "\2\u30fc\2\u30fe\2\u3101\2\u3107\2\u3130\2\u3133\2\u3190\2\u31a2\2\u31bc"+
- "\2\u31f2\2\u3201\2\u3402\2\u4db7\2\u4e02\2\u9fec\2\ua002\2\ua48e\2\ua4d2"+
- "\2\ua4ff\2\ua502\2\ua60e\2\ua612\2\ua621\2\ua62c\2\ua62d\2\ua642\2\ua670"+
- "\2\ua681\2\ua69f\2\ua6a2\2\ua6e7\2\ua719\2\ua721\2\ua724\2\ua78a\2\ua78d"+
- "\2\ua7b0\2\ua7b2\2\ua7b9\2\ua7f9\2\ua803\2\ua805\2\ua807\2\ua809\2\ua80c"+
- "\2\ua80e\2\ua824\2\ua842\2\ua875\2\ua884\2\ua8b5\2\ua8f4\2\ua8f9\2\ua8fd"+
- "\2\ua8fd\2\ua8ff\2\ua8ff\2\ua90c\2\ua927\2\ua932\2\ua948\2\ua962\2\ua97e"+
- "\2\ua986\2\ua9b4\2\ua9d1\2\ua9d1\2\ua9e2\2\ua9e6\2\ua9e8\2\ua9f1\2\ua9fc"+
- "\2\uaa00\2\uaa02\2\uaa2a\2\uaa42\2\uaa44\2\uaa46\2\uaa4d\2\uaa62\2\uaa78"+
- "\2\uaa7c\2\uaa7c\2\uaa80\2\uaab1\2\uaab3\2\uaab3\2\uaab7\2\uaab8\2\uaabb"+
- "\2\uaabf\2\uaac2\2\uaac2\2\uaac4\2\uaac4\2\uaadd\2\uaadf\2\uaae2\2\uaaec"+
- "\2\uaaf4\2\uaaf6\2\uab03\2\uab08\2\uab0b\2\uab10\2\uab13\2\uab18\2\uab22"+
- "\2\uab28\2\uab2a\2\uab30\2\uab32\2\uab5c\2\uab5e\2\uab67\2\uab72\2\uabe4"+
- "\2\uac02\2\ud7a5\2\ud7b2\2\ud7c8\2\ud7cd\2\ud7fd\2\uf902\2\ufa6f\2\ufa72"+
- "\2\ufadb\2\ufb02\2\ufb08\2\ufb15\2\ufb19\2\ufb1f\2\ufb1f\2\ufb21\2\ufb2a"+
- "\2\ufb2c\2\ufb38\2\ufb3a\2\ufb3e\2\ufb40\2\ufb40\2\ufb42\2\ufb43\2\ufb45"+
- "\2\ufb46\2\ufb48\2\ufbb3\2\ufbd5\2\ufd3f\2\ufd52\2\ufd91\2\ufd94\2\ufdc9"+
- "\2\ufdf2\2\ufdfd\2\ufe72\2\ufe76\2\ufe78\2\ufefe\2\uff23\2\uff3c\2\uff43"+
- "\2\uff5c\2\uff68\2\uffc0\2\uffc4\2\uffc9\2\uffcc\2\uffd1\2\uffd4\2\uffd9"+
- "\2\uffdc\2\uffde\2\2\3\r\3\17\3(\3*\3<\3>\3?\3A\3O\3R\3_\3\u0082\3\u00fc"+
- "\3\u0282\3\u029e\3\u02a2\3\u02d2\3\u0302\3\u0321\3\u032f\3\u0342\3\u0344"+
- "\3\u034b\3\u0352\3\u0377\3\u0382\3\u039f\3\u03a2\3\u03c5\3\u03ca\3\u03d1"+
- "\3\u0402\3\u049f\3\u04b2\3\u04d5\3\u04da\3\u04fd\3\u0502\3\u0529\3\u0532"+
- "\3\u0565\3\u0602\3\u0738\3\u0742\3\u0757\3\u0762\3\u0769\3\u0802\3\u0807"+
- "\3\u080a\3\u080a\3\u080c\3\u0837\3\u0839\3\u083a\3\u083e\3\u083e\3\u0841"+
- "\3\u0857\3\u0862\3\u0878\3\u0882\3\u08a0\3\u08e2\3\u08f4\3\u08f6\3\u08f7"+
- "\3\u0902\3\u0917\3\u0922\3\u093b\3\u0982\3\u09b9\3\u09c0\3\u09c1\3\u0a02"+
- "\3\u0a02\3\u0a12\3\u0a15\3\u0a17\3\u0a19\3\u0a1b\3\u0a35\3\u0a62\3\u0a7e"+
- "\3\u0a82\3\u0a9e\3\u0ac2\3\u0ac9\3\u0acb\3\u0ae6\3\u0b02\3\u0b37\3\u0b42"+
- "\3\u0b57\3\u0b62\3\u0b74\3\u0b82\3\u0b93\3\u0c02\3\u0c4a\3\u0c82\3\u0cb4"+
- "\3\u0cc2\3\u0cf4\3\u1005\3\u1039\3\u1085\3\u10b1\3\u10d2\3\u10ea\3\u1105"+
- "\3\u1128\3\u1152\3\u1174\3\u1178\3\u1178\3\u1185\3\u11b4\3\u11c3\3\u11c6"+
- "\3\u11dc\3\u11dc\3\u11de\3\u11de\3\u1202\3\u1213\3\u1215\3\u122d\3\u1282"+
- "\3\u1288\3\u128a\3\u128a\3\u128c\3\u128f\3\u1291\3\u129f\3\u12a1\3\u12aa"+
- "\3\u12b2\3\u12e0\3\u1307\3\u130e\3\u1311\3\u1312\3\u1315\3\u132a\3\u132c"+
- "\3\u1332\3\u1334\3\u1335\3\u1337\3\u133b\3\u133f\3\u133f\3\u1352\3\u1352"+
- "\3\u135f\3\u1363\3\u1402\3\u1436\3\u1449\3\u144c\3\u1482\3\u14b1\3\u14c6"+
- "\3\u14c7\3\u14c9\3\u14c9\3\u1582\3\u15b0\3\u15da\3\u15dd\3\u1602\3\u1631"+
- "\3\u1646\3\u1646\3\u1682\3\u16ac\3\u1702\3\u171b\3\u18a2\3\u18e1\3\u1901"+
- "\3\u1901\3\u1a02\3\u1a02\3\u1a0d\3\u1a34\3\u1a3c\3\u1a3c\3\u1a52\3\u1a52"+
- "\3\u1a5e\3\u1a85\3\u1a88\3\u1a8b\3\u1ac2\3\u1afa\3\u1c02\3\u1c0a\3\u1c0c"+
- "\3\u1c30\3\u1c42\3\u1c42\3\u1c74\3\u1c91\3\u1d02\3\u1d08\3\u1d0a\3\u1d0b"+
- "\3\u1d0d\3\u1d32\3\u1d48\3\u1d48\3\u2002\3\u239b\3\u2482\3\u2545\3\u3002"+
- "\3\u3430\3\u4402\3\u4648\3\u6802\3\u6a3a\3\u6a42\3\u6a60\3\u6ad2\3\u6aef"+
- "\3\u6b02\3\u6b31\3\u6b42\3\u6b45\3\u6b65\3\u6b79\3\u6b7f\3\u6b91\3\u6f02"+
- "\3\u6f46\3\u6f52\3\u6f52\3\u6f95\3\u6fa1\3\u6fe2\3\u6fe3\3\u7002\3\u87ee"+
- "\3\u8802\3\u8af4\3\ub002\3\ub120\3\ub172\3\ub2fd\3\ubc02\3\ubc6c\3\ubc72"+
- "\3\ubc7e\3\ubc82\3\ubc8a\3\ubc92\3\ubc9b\3\ud402\3\ud456\3\ud458\3\ud49e"+
- "\3\ud4a0\3\ud4a1\3\ud4a4\3\ud4a4\3\ud4a7\3\ud4a8\3\ud4ab\3\ud4ae\3\ud4b0"+
- "\3\ud4bb\3\ud4bd\3\ud4bd\3\ud4bf\3\ud4c5\3\ud4c7\3\ud507\3\ud509\3\ud50c"+
- "\3\ud50f\3\ud516\3\ud518\3\ud51e\3\ud520\3\ud53b\3\ud53d\3\ud540\3\ud542"+
- "\3\ud546\3\ud548\3\ud548\3\ud54c\3\ud552\3\ud554\3\ud6a7\3\ud6aa\3\ud6c2"+
- "\3\ud6c4\3\ud6dc\3\ud6de\3\ud6fc\3\ud6fe\3\ud716\3\ud718\3\ud736\3\ud738"+
- "\3\ud750\3\ud752\3\ud770\3\ud772\3\ud78a\3\ud78c\3\ud7aa\3\ud7ac\3\ud7c4"+
- "\3\ud7c6\3\ud7cd\3\ue802\3\ue8c6\3\ue902\3\ue945\3\uee02\3\uee05\3\uee07"+
- "\3\uee21\3\uee23\3\uee24\3\uee26\3\uee26\3\uee29\3\uee29\3\uee2b\3\uee34"+
- "\3\uee36\3\uee39\3\uee3b\3\uee3b\3\uee3d\3\uee3d\3\uee44\3\uee44\3\uee49"+
- "\3\uee49\3\uee4b\3\uee4b\3\uee4d\3\uee4d\3\uee4f\3\uee51\3\uee53\3\uee54"+
- "\3\uee56\3\uee56\3\uee59\3\uee59\3\uee5b\3\uee5b\3\uee5d\3\uee5d\3\uee5f"+
- "\3\uee5f\3\uee61\3\uee61\3\uee63\3\uee64\3\uee66\3\uee66\3\uee69\3\uee6c"+
- "\3\uee6e\3\uee74\3\uee76\3\uee79\3\uee7b\3\uee7e\3\uee80\3\uee80\3\uee82"+
- "\3\uee8b\3\uee8d\3\uee9d\3\ueea3\3\ueea5\3\ueea7\3\ueeab\3\ueead\3\ueebd"+
- "\3\2\4\ua6d8\4\ua702\4\ub736\4\ub742\4\ub81f\4\ub822\4\ucea3\4\uceb2\4"+
- "\uebe2\4\uf802\4\ufa1f\4\u05e7\2\4\3\2\2\2\2\6\3\2\2\2\2\b\3\2\2\2\2\n"+
- "\3\2\2\2\2\f\3\2\2\2\2\16\3\2\2\2\2\20\3\2\2\2\2\22\3\2\2\2\2\24\3\2\2"+
- "\2\2\26\3\2\2\2\2\30\3\2\2\2\2\32\3\2\2\2\2\34\3\2\2\2\2\36\3\2\2\2\2"+
- " \3\2\2\2\2\"\3\2\2\2\2$\3\2\2\2\2&\3\2\2\2\2(\3\2\2\2\2*\3\2\2\2\2,\3"+
- "\2\2\2\2.\3\2\2\2\2\60\3\2\2\2\2\62\3\2\2\2\2\64\3\2\2\2\2\66\3\2\2\2"+
- "\28\3\2\2\2\2:\3\2\2\2\2<\3\2\2\2\2>\3\2\2\2\2@\3\2\2\2\2B\3\2\2\2\2D"+
- "\3\2\2\2\2F\3\2\2\2\2H\3\2\2\2\2J\3\2\2\2\2L\3\2\2\2\2N\3\2\2\2\2P\3\2"+
- "\2\2\2R\3\2\2\2\2T\3\2\2\2\2V\3\2\2\2\2X\3\2\2\2\2Z\3\2\2\2\2\\\3\2\2"+
- "\2\2^\3\2\2\2\2`\3\2\2\2\2b\3\2\2\2\2d\3\2\2\2\2f\3\2\2\2\2h\3\2\2\2\2"+
- "j\3\2\2\2\2l\3\2\2\2\2n\3\2\2\2\2p\3\2\2\2\2r\3\2\2\2\2t\3\2\2\2\2v\3"+
- "\2\2\2\2x\3\2\2\2\2z\3\2\2\2\2|\3\2\2\2\2~\3\2\2\2\2\u0080\3\2\2\2\2\u0082"+
- "\3\2\2\2\2\u0084\3\2\2\2\2\u0086\3\2\2\2\2\u0088\3\2\2\2\2\u008a\3\2\2"+
- "\2\2\u008c\3\2\2\2\2\u008e\3\2\2\2\2\u0090\3\2\2\2\2\u0092\3\2\2\2\2\u0094"+
- "\3\2\2\2\2\u0096\3\2\2\2\2\u0098\3\2\2\2\2\u009a\3\2\2\2\2\u009c\3\2\2"+
- "\2\2\u009e\3\2\2\2\2\u00a0\3\2\2\2\2\u00a2\3\2\2\2\2\u00a4\3\2\2\2\2\u00a6"+
- "\3\2\2\2\2\u00a8\3\2\2\2\2\u00aa\3\2\2\2\2\u00ac\3\2\2\2\2\u00ae\3\2\2"+
- "\2\2\u00b0\3\2\2\2\2\u00b2\3\2\2\2\2\u00b4\3\2\2\2\2\u00b6\3\2\2\2\2\u00b8"+
- "\3\2\2\2\2\u00ba\3\2\2\2\2\u00bc\3\2\2\2\2\u00be\3\2\2\2\2\u00c0\3\2\2"+
- "\2\2\u00c2\3\2\2\2\2\u00c4\3\2\2\2\2\u00c6\3\2\2\2\2\u00c8\3\2\2\2\2\u00ca"+
- "\3\2\2\2\2\u00cc\3\2\2\2\2\u00ce\3\2\2\2\2\u00d0\3\2\2\2\2\u00d2\3\2\2"+
- "\2\2\u00d4\3\2\2\2\2\u00d6\3\2\2\2\2\u00d8\3\2\2\2\2\u00da\3\2\2\2\2\u00dc"+
- "\3\2\2\2\2\u00de\3\2\2\2\2\u00e0\3\2\2\2\2\u00e2\3\2\2\2\2\u00e4\3\2\2"+
- "\2\2\u00e6\3\2\2\2\2\u00e8\3\2\2\2\2\u00ea\3\2\2\2\2\u00ec\3\2\2\2\2\u00ee"+
- "\3\2\2\2\2\u00f0\3\2\2\2\2\u00f2\3\2\2\2\2\u00f4\3\2\2\2\2\u00f6\3\2\2"+
- "\2\2\u00f8\3\2\2\2\2\u00fa\3\2\2\2\2\u00fc\3\2\2\2\2\u00fe\3\2\2\2\2\u0100"+
- "\3\2\2\2\2\u0102\3\2\2\2\2\u0104\3\2\2\2\2\u0106\3\2\2\2\2\u0108\3\2\2"+
- "\2\2\u010a\3\2\2\2\2\u010c\3\2\2\2\2\u010e\3\2\2\2\2\u0110\3\2\2\2\2\u0112"+
- "\3\2\2\2\2\u0114\3\2\2\2\2\u0116\3\2\2\2\2\u011c\3\2\2\2\2\u0120\3\2\2"+
- "\2\2\u0122\3\2\2\2\2\u0124\3\2\2\2\2\u0126\3\2\2\2\2\u0128\3\2\2\2\2\u012a"+
- "\3\2\2\2\2\u012c\3\2\2\2\2\u012e\3\2\2\2\2\u0130\3\2\2\2\2\u0132\3\2\2"+
- "\2\2\u0134\3\2\2\2\2\u0136\3\2\2\2\3\u014c\3\2\2\2\3\u014e\3\2\2\2\3\u0150"+
- "\3\2\2\2\3\u0152\3\2\2\2\3\u0154\3\2\2\2\4\u0158\3\2\2\2\6\u016e\3\2\2"+
- "\2\b\u0170\3\2\2\2\n\u0177\3\2\2\2\f\u017f\3\2\2\2\16\u0186\3\2\2\2\20"+
- "\u018d\3\2\2\2\22\u0194\3\2\2\2\24\u019b\3\2\2\2\26\u01a4\3\2\2\2\30\u01ae"+
- "\3\2\2\2\32\u01b6\3\2\2\2\34\u01c0\3\2\2\2\36\u01cc\3\2\2\2 \u01d3\3\2"+
- "\2\2\"\u01de\3\2\2\2$\u01e1\3\2\2\2&\u01e7\3\2\2\2(\u01f0\3\2\2\2*\u01f5"+
- "\3\2\2\2,\u01fc\3\2\2\2.\u0203\3\2\2\2\60\u0209\3\2\2\2\62\u020e\3\2\2"+
- "\2\64\u0215\3\2\2\2\66\u021f\3\2\2\28\u0225\3\2\2\2:\u0228\3\2\2\2<\u022a"+
- "\3\2\2\2>\u0231\3\2\2\2@\u0237\3\2\2\2B\u0244\3\2\2\2D\u024d\3\2\2\2F"+
- "\u0251\3\2\2\2H\u0255\3\2\2\2J\u025b\3\2\2\2L\u025d\3\2\2\2N\u0260\3\2"+
- "\2\2P\u0265\3\2\2\2R\u026b\3\2\2\2T\u0271\3\2\2\2V\u0278\3\2\2\2X\u027f"+
- "\3\2\2\2Z\u0288\3\2\2\2\\\u028e\3\2\2\2^\u0294\3\2\2\2`\u029b\3\2\2\2"+
- "b\u02a1\3\2\2\2d\u02a8\3\2\2\2f\u02ae\3\2\2\2h\u02b7\3\2\2\2j\u02bf\3"+
- "\2\2\2l\u02c6\3\2\2\2n\u02cb\3\2\2\2p\u02d4\3\2\2\2r\u02e3\3\2\2\2t\u02e9"+
- "\3\2\2\2v\u02ed\3\2\2\2x\u02f0\3\2\2\2z\u02f7\3\2\2\2|\u0301\3\2\2\2~"+
- "\u030b\3\2\2\2\u0080\u0317\3\2\2\2\u0082\u0320\3\2\2\2\u0084\u032a\3\2"+
- "\2\2\u0086\u0332\3\2\2\2\u0088\u033e\3\2\2\2\u008a\u034d\3\2\2\2\u008c"+
- "\u0353\3\2\2\2\u008e\u0357\3\2\2\2\u0090\u035b\3\2\2\2\u0092\u0363\3\2"+
- "\2\2\u0094\u036b\3\2\2\2\u0096\u0370\3\2\2\2\u0098\u037a\3\2\2\2\u009a"+
- "\u0381\3\2\2\2\u009c\u0386\3\2\2\2\u009e\u038c\3\2\2\2\u00a0\u038f\3\2"+
- "\2\2\u00a2\u0393\3\2\2\2\u00a4\u039a\3\2\2\2\u00a6\u039f\3\2\2\2\u00a8"+
- "\u03a4\3\2\2\2\u00aa\u03a9\3\2\2\2\u00ac\u03b1\3\2\2\2\u00ae\u03b8\3\2"+
- "\2\2\u00b0\u03be\3\2\2\2\u00b2\u03cc\3\2\2\2\u00b4\u03cf\3\2\2\2\u00b6"+
- "\u03d5\3\2\2\2\u00b8\u03da\3\2\2\2\u00ba\u03e5\3\2\2\2\u00bc\u03e9\3\2"+
- "\2\2\u00be\u03f0\3\2\2\2\u00c0\u03f9\3\2\2\2\u00c2\u03fd\3\2\2\2\u00c4"+
- "\u0403\3\2\2\2\u00c6\u040d\3\2\2\2\u00c8\u040f\3\2\2\2\u00ca\u0413\3\2"+
- "\2\2\u00cc\u0415\3\2\2\2\u00ce\u0419\3\2\2\2\u00d0\u041b\3\2\2\2\u00d2"+
- "\u041f\3\2\2\2\u00d4\u0421\3\2\2\2\u00d6\u0423\3\2\2\2\u00d8\u0425\3\2"+
- "\2\2\u00da\u0427\3\2\2\2\u00dc\u0429\3\2\2\2\u00de\u042e\3\2\2\2\u00e0"+
- "\u0433\3\2\2\2\u00e2\u0436\3\2\2\2\u00e4\u043a\3\2\2\2\u00e6\u043d\3\2"+
- "\2\2\u00e8\u0440\3\2\2\2\u00ea\u0443\3\2\2\2\u00ec\u0446\3\2\2\2\u00ee"+
- "\u0448\3\2\2\2\u00f0\u044b\3\2\2\2\u00f2\u044d\3\2\2\2\u00f4\u0450\3\2"+
- "\2\2\u00f6\u0452\3\2\2\2\u00f8\u0454\3\2\2\2\u00fa\u0456\3\2\2\2\u00fc"+
- "\u0459\3\2\2\2\u00fe\u045c\3\2\2\2\u0100\u045f\3\2\2\2\u0102\u0461\3\2"+
- "\2\2\u0104\u0463\3\2\2\2\u0106\u0465\3\2\2\2\u0108\u0467\3\2\2\2\u010a"+
- "\u0469\3\2\2\2\u010c\u046b\3\2\2\2\u010e\u0479\3\2\2\2\u0110\u047d\3\2"+
- "\2\2\u0112\u0489\3\2\2\2\u0114\u0497\3\2\2\2\u0116\u04a3\3\2\2\2\u0118"+
- "\u04c7\3\2\2\2\u011a\u04c9\3\2\2\2\u011c\u04d2\3\2\2\2\u011e\u04d8\3\2"+
- "\2\2\u0120\u04df\3\2\2\2\u0122\u04e5\3\2\2\2\u0124\u04e7\3\2\2\2\u0126"+
- "\u04ec\3\2\2\2\u0128\u04f1\3\2\2\2\u012a\u04f8\3\2\2\2\u012c\u0503\3\2"+
- "\2\2\u012e\u050e\3\2\2\2\u0130\u051b\3\2\2\2\u0132\u0521\3\2\2\2\u0134"+
- "\u0530\3\2\2\2\u0136\u0536\3\2\2\2\u0138\u0545\3\2\2\2\u013a\u0547\3\2"+
- "\2\2\u013c\u0563\3\2\2\2\u013e\u056d\3\2\2\2\u0140\u056f\3\2\2\2\u0142"+
- "\u0571\3\2\2\2\u0144\u0573\3\2\2\2\u0146\u057b\3\2\2\2\u0148\u057d\3\2"+
- "\2\2\u014a\u057f\3\2\2\2\u014c\u0582\3\2\2\2\u014e\u0588\3\2\2\2\u0150"+
- "\u0596\3\2\2\2\u0152\u05b3\3\2\2\2\u0154\u05b7\3\2\2\2\u0156\u0159\5\6"+
- "\3\2\u0157\u0159\5\u0116\u008b\2\u0158\u0156\3\2\2\2\u0158\u0157\3\2\2"+
- "\2\u0159\u015a\3\2\2\2\u015a\u015b\b\2\2\2\u015b\5\3\2\2\2\u015c\u0166"+
- "\5\u013c\u009e\2\u015d\u015e\7\60\2\2\u015e\u0160\6\3\2\2\u015f\u0161"+
- "\5\u013c\u009e\2\u0160\u015f\3\2\2\2\u0160\u0161\3\2\2\2\u0161\u0163\3"+
- "\2\2\2\u0162\u0164\5\u0144\u00a2\2\u0163\u0162\3\2\2\2\u0163\u0164\3\2"+
- "\2\2\u0164\u0167\3\2\2\2\u0165\u0167\5\u0144\u00a2\2\u0166\u015d\3\2\2"+
- "\2\u0166\u0165\3\2\2\2\u0167\u016f\3\2\2\2\u0168\u0169\7\60\2\2\u0169"+
- "\u016a\6\3\3\2\u016a\u016c\5\u013c\u009e\2\u016b\u016d\5\u0144\u00a2\2"+
- "\u016c\u016b\3\2\2\2\u016c\u016d\3\2\2\2\u016d\u016f\3\2\2\2\u016e\u015c"+
- "\3\2\2\2\u016e\u0168\3\2\2\2\u016f\7\3\2\2\2\u0170\u0171\7v\2\2\u0171"+
- "\u0172\7t\2\2\u0172\u0173\7w\2\2\u0173\u0174\7g\2\2\u0174\u0175\3\2\2"+
- "\2\u0175\u0176\b\4\2\2\u0176\t\3\2\2\2\u0177\u0178\7h\2\2\u0178\u0179"+
- "\7c\2\2\u0179\u017a\7n\2\2\u017a\u017b\7u\2\2\u017b\u017c\7g\2\2\u017c"+
- "\u017d\3\2\2\2\u017d\u017e\b\5\2\2\u017e\13\3\2\2\2\u017f\u0180\7c\2\2"+
- "\u0180\u0181\7u\2\2\u0181\u0182\7u\2\2\u0182\u0183\7g\2\2\u0183\u0184"+
- "\7t\2\2\u0184\u0185\7v\2\2\u0185\r\3\2\2\2\u0186\u0187\7c\2\2\u0187\u0188"+
- "\7u\2\2\u0188\u0189\7u\2\2\u0189\u018a\7w\2\2\u018a\u018b\7o\2\2\u018b"+
- "\u018c\7g\2\2\u018c\17\3\2\2\2\u018d\u018e\7k\2\2\u018e\u018f\7p\2\2\u018f"+
- "\u0190\7j\2\2\u0190\u0191\7c\2\2\u0191\u0192\7n\2\2\u0192\u0193\7g\2\2"+
- "\u0193\21\3\2\2\2\u0194\u0195\7g\2\2\u0195\u0196\7z\2\2\u0196\u0197\7"+
- "j\2\2\u0197\u0198\7c\2\2\u0198\u0199\7n\2\2\u0199\u019a\7g\2\2\u019a\23"+
- "\3\2\2\2\u019b\u019c\7t\2\2\u019c\u019d\7g\2\2\u019d\u019e\7s\2\2\u019e"+
- "\u019f\7w\2\2\u019f\u01a0\7k\2\2\u01a0\u01a1\7t\2\2\u01a1\u01a2\7g\2\2"+
- "\u01a2\u01a3\7u\2\2\u01a3\25\3\2\2\2\u01a4\u01a5\7r\2\2\u01a5\u01a6\7"+
- "t\2\2\u01a6\u01a7\7g\2\2\u01a7\u01a8\7u\2\2\u01a8\u01a9\7g\2\2\u01a9\u01aa"+
- "\7t\2\2\u01aa\u01ab\7x\2\2\u01ab\u01ac\7g\2\2\u01ac\u01ad\7u\2\2\u01ad"+
- "\27\3\2\2\2\u01ae\u01af\7g\2\2\u01af\u01b0\7p\2\2\u01b0\u01b1\7u\2\2\u01b1"+
- "\u01b2\7w\2\2\u01b2\u01b3\7t\2\2\u01b3\u01b4\7g\2\2\u01b4\u01b5\7u\2\2"+
- "\u01b5\31\3\2\2\2\u01b6\u01b7\7k\2\2\u01b7\u01b8\7p\2\2\u01b8\u01b9\7"+
- "x\2\2\u01b9\u01ba\7c\2\2\u01ba\u01bb\7t\2\2\u01bb\u01bc\7k\2\2\u01bc\u01bd"+
- "\7c\2\2\u01bd\u01be\7p\2\2\u01be\u01bf\7v\2\2\u01bf\33\3\2\2\2\u01c0\u01c1"+
- "\7f\2\2\u01c1\u01c2\7g\2\2\u01c2\u01c3\7e\2\2\u01c3\u01c4\7t\2\2\u01c4"+
- "\u01c5\7g\2\2\u01c5\u01c6\7c\2\2\u01c6\u01c7\7u\2\2\u01c7\u01c8\7g\2\2"+
- "\u01c8\u01c9\7u\2\2\u01c9\u01ca\3\2\2\2\u01ca\u01cb\b\16\2\2\u01cb\35"+
- "\3\2\2\2\u01cc\u01cd\7r\2\2\u01cd\u01ce\7w\2\2\u01ce\u01cf\7t\2\2\u01cf"+
- "\u01d0\7g\2\2\u01d0\u01d1\3\2\2\2\u01d1\u01d2\b\17\2\2\u01d2\37\3\2\2"+
- "\2\u01d3\u01d4\7k\2\2\u01d4\u01d5\7o\2\2\u01d5\u01d6\7r\2\2\u01d6\u01d7"+
- "\7n\2\2\u01d7\u01d8\7g\2\2\u01d8\u01d9\7o\2\2\u01d9\u01da\7g\2\2\u01da"+
- "\u01db\7p\2\2\u01db\u01dc\7v\2\2\u01dc\u01dd\7u\2\2\u01dd!\3\2\2\2\u01de"+
- "\u01df\7c\2\2\u01df\u01e0\7u\2\2\u01e0#\3\2\2\2\u01e1\u01e2\7q\2\2\u01e2"+
- "\u01e3\7n\2\2\u01e3\u01e4\7f\2\2\u01e4\u01e5\3\2\2\2\u01e5\u01e6\b\22"+
- "\2\2\u01e6%\3\2\2\2\u01e7\u01e8\7d\2\2\u01e8\u01e9\7g\2\2\u01e9\u01ea"+
- "\7h\2\2\u01ea\u01eb\7q\2\2\u01eb\u01ec\7t\2\2\u01ec\u01ed\7g\2\2\u01ed"+
- "\u01ee\3\2\2\2\u01ee\u01ef\b\23\2\2\u01ef\'\3\2\2\2\u01f0\u01f1\7%\2\2"+
- "\u01f1\u01f2\7n\2\2\u01f2\u01f3\7j\2\2\u01f3\u01f4\7u\2\2\u01f4)\3\2\2"+
- "\2\u01f5\u01f6\7h\2\2\u01f6\u01f7\7q\2\2\u01f7\u01f8\7t\2\2\u01f8\u01f9"+
- "\7c\2\2\u01f9\u01fa\7n\2\2\u01fa\u01fb\7n\2\2\u01fb+\3\2\2\2\u01fc\u01fd"+
- "\7g\2\2\u01fd\u01fe\7z\2\2\u01fe\u01ff\7k\2\2\u01ff\u0200\7u\2\2\u0200"+
- "\u0201\7v\2\2\u0201\u0202\7u\2\2\u0202-\3\2\2\2\u0203\u0204\7c\2\2\u0204"+
- "\u0205\7e\2\2\u0205\u0206\7e\2\2\u0206\u0207\3\2\2\2\u0207\u0208\b\27"+
- "\2\2\u0208/\3\2\2\2\u0209\u020a\7h\2\2\u020a\u020b\7q\2\2\u020b\u020c"+
- "\7n\2\2\u020c\u020d\7f\2\2\u020d\61\3\2\2\2\u020e\u020f\7w\2\2\u020f\u0210"+
- "\7p\2\2\u0210\u0211\7h\2\2\u0211\u0212\7q\2\2\u0212\u0213\7n\2\2\u0213"+
- "\u0214\7f\2\2\u0214\63\3\2\2\2\u0215\u0216\7w\2\2\u0216\u0217\7p\2\2\u0217"+
- "\u0218\7h\2\2\u0218\u0219\7q\2\2\u0219\u021a\7n\2\2\u021a\u021b\7f\2\2"+
- "\u021b\u021c\7k\2\2\u021c\u021d\7p\2\2\u021d\u021e\7i\2\2\u021e\65\3\2"+
- "\2\2\u021f\u0220\7i\2\2\u0220\u0221\7j\2\2\u0221\u0222\7q\2\2\u0222\u0223"+
- "\7u\2\2\u0223\u0224\7v\2\2\u0224\67\3\2\2\2\u0225\u0226\7k\2\2\u0226\u0227"+
- "\7p\2\2\u02279\3\2\2\2\u0228\u0229\7%\2\2\u0229;\3\2\2\2\u022a\u022b\7"+
- "u\2\2\u022b\u022c\7w\2\2\u022c\u022d\7d\2\2\u022d\u022e\7u\2\2\u022e\u022f"+
- "\7g\2\2\u022f\u0230\7v\2\2\u0230=\3\2\2\2\u0231\u0232\7w\2\2\u0232\u0233"+
- "\7p\2\2\u0233\u0234\7k\2\2\u0234\u0235\7q\2\2\u0235\u0236\7p\2\2\u0236"+
- "?\3\2\2\2\u0237\u0238\7k\2\2\u0238\u0239\7p\2\2\u0239\u023a\7v\2\2\u023a"+
- "\u023b\7g\2\2\u023b\u023c\7t\2\2\u023c\u023d\7u\2\2\u023d\u023e\7g\2\2"+
- "\u023e\u023f\7e\2\2\u023f\u0240\7v\2\2\u0240\u0241\7k\2\2\u0241\u0242"+
- "\7q\2\2\u0242\u0243\7p\2\2\u0243A\3\2\2\2\u0244\u0245\7u\2\2\u0245\u0246"+
- "\7g\2\2\u0246\u0247\7v\2\2\u0247\u0248\7o\2\2\u0248\u0249\7k\2\2\u0249"+
- "\u024a\7p\2\2\u024a\u024b\7w\2\2\u024b\u024c\7u\2\2\u024cC\3\2\2\2\u024d"+
- "\u024e\7?\2\2\u024e\u024f\7?\2\2\u024f\u0250\7@\2\2\u0250E\3\2\2\2\u0251"+
- "\u0252\7/\2\2\u0252\u0253\7/\2\2\u0253\u0254\7,\2\2\u0254G\3\2\2\2\u0255"+
- "\u0256\7c\2\2\u0256\u0257\7r\2\2\u0257\u0258\7r\2\2\u0258\u0259\7n\2\2"+
- "\u0259\u025a\7{\2\2\u025aI\3\2\2\2\u025b\u025c\7A\2\2\u025cK\3\2\2\2\u025d"+
- "\u025e\7#\2\2\u025e\u025f\7>\2\2\u025fM\3\2\2\2\u0260\u0261\7#\2\2\u0261"+
- "\u0262\7@\2\2\u0262\u0263\3\2\2\2\u0263\u0264\b\'\2\2\u0264O\3\2\2\2\u0265"+
- "\u0266\7u\2\2\u0266\u0267\7g\2\2\u0267\u0268\7s\2\2\u0268\u0269\3\2\2"+
- "\2\u0269\u026a\b(\2\2\u026aQ\3\2\2\2\u026b\u026c\7u\2\2\u026c\u026d\7"+
- "g\2\2\u026d\u026e\7v\2\2\u026e\u026f\3\2\2\2\u026f\u0270\b)\2\2\u0270"+
- "S\3\2\2\2\u0271\u0272\7o\2\2\u0272\u0273\7u\2\2\u0273\u0274\7g\2\2\u0274"+
- "\u0275\7v\2\2\u0275\u0276\3\2\2\2\u0276\u0277\b*\2\2\u0277U\3\2\2\2\u0278"+
- "\u0279\7f\2\2\u0279\u027a\7k\2\2\u027a\u027b\7e\2\2\u027b\u027c\7v\2\2"+
- "\u027c\u027d\3\2\2\2\u027d\u027e\b+\2\2\u027eW\3\2\2\2\u027f\u0280\7q"+
- "\2\2\u0280\u0281\7r\2\2\u0281\u0282\7v\2\2\u0282\u0283\7k\2\2\u0283\u0284"+
- "\7q\2\2\u0284\u0285\7p\2\2\u0285\u0286\3\2\2\2\u0286\u0287\b,\2\2\u0287"+
- "Y\3\2\2\2\u0288\u0289\7n\2\2\u0289\u028a\7g\2\2\u028a\u028b\7p\2\2\u028b"+
- "\u028c\3\2\2\2\u028c\u028d\b-\2\2\u028d[\3\2\2\2\u028e\u028f\7p\2\2\u028f"+
- "\u0290\7g\2\2\u0290\u0291\7y\2\2\u0291\u0292\3\2\2\2\u0292\u0293\b.\2"+
- "\2\u0293]\3\2\2\2\u0294\u0295\7o\2\2\u0295\u0296\7c\2\2\u0296\u0297\7"+
- "m\2\2\u0297\u0298\7g\2\2\u0298\u0299\3\2\2\2\u0299\u029a\b/\2\2\u029a"+
- "_\3\2\2\2\u029b\u029c\7e\2\2\u029c\u029d\7c\2\2\u029d\u029e\7r\2\2\u029e"+
- "\u029f\3\2\2\2\u029f\u02a0\b\60\2\2\u02a0a\3\2\2\2\u02a1\u02a2\7u\2\2"+
- "\u02a2\u02a3\7q\2\2\u02a3\u02a4\7o\2\2\u02a4\u02a5\7g\2\2\u02a5\u02a6"+
- "\3\2\2\2\u02a6\u02a7\b\61\2\2\u02a7c\3\2\2\2\u02a8\u02a9\7i\2\2\u02a9"+
- "\u02aa\7g\2\2\u02aa\u02ab\7v\2\2\u02ab\u02ac\3\2\2\2\u02ac\u02ad\b\62"+
- "\2\2\u02ade\3\2\2\2\u02ae\u02af\7f\2\2\u02af\u02b0\7q\2\2\u02b0\u02b1"+
- "\7o\2\2\u02b1\u02b2\7c\2\2\u02b2\u02b3\7k\2\2\u02b3\u02b4\7p\2\2\u02b4"+
- "\u02b5\3\2\2\2\u02b5\u02b6\b\63\2\2\u02b6g\3\2\2\2\u02b7\u02b8\7c\2\2"+
- "\u02b8\u02b9\7z\2\2\u02b9\u02ba\7k\2\2\u02ba\u02bb\7q\2\2\u02bb\u02bc"+
- "\7o\2\2\u02bc\u02bd\3\2\2\2\u02bd\u02be\b\64\2\2\u02bei\3\2\2\2\u02bf"+
- "\u02c0\7p\2\2\u02c0\u02c1\7q\2\2\u02c1\u02c2\7p\2\2\u02c2\u02c3\7g\2\2"+
- "\u02c3\u02c4\3\2\2\2\u02c4\u02c5\b\65\2\2\u02c5k\3\2\2\2\u02c6\u02c7\7"+
- "r\2\2\u02c7\u02c8\7t\2\2\u02c8\u02c9\7g\2\2\u02c9\u02ca\7f\2\2\u02cam"+
- "\3\2\2\2\u02cb\u02cc\7v\2\2\u02cc\u02cd\7{\2\2\u02cd\u02ce\7r\2\2\u02ce"+
- "\u02cf\7g\2\2\u02cf\u02d0\7Q\2\2\u02d0\u02d1\7h\2\2\u02d1\u02d2\3\2\2"+
- "\2\u02d2\u02d3\b\67\2\2\u02d3o\3\2\2\2\u02d4\u02d5\7k\2\2\u02d5\u02d6"+
- "\7u\2\2\u02d6\u02d7\7E\2\2\u02d7\u02d8\7q\2\2\u02d8\u02d9\7o\2\2\u02d9"+
- "\u02da\7r\2\2\u02da\u02db\7c\2\2\u02db\u02dc\7t\2\2\u02dc\u02dd\7c\2\2"+
- "\u02dd\u02de\7d\2\2\u02de\u02df\7n\2\2\u02df\u02e0\7g\2\2\u02e0\u02e1"+
- "\3\2\2\2\u02e1\u02e2\b8\2\2\u02e2q\3\2\2\2\u02e3\u02e4\7u\2\2\u02e4\u02e5"+
- "\7j\2\2\u02e5\u02e6\7c\2\2\u02e6\u02e7\7t\2\2\u02e7\u02e8\7g\2\2\u02e8"+
- "s\3\2\2\2\u02e9\u02ea\7B\2\2\u02ea\u02eb\3\2\2\2\u02eb\u02ec\b:\2\2\u02ec"+
- "u\3\2\2\2\u02ed\u02ee\7\60\2\2\u02ee\u02ef\7\60\2\2\u02efw\3\2\2\2\u02f0"+
- "\u02f1\7u\2\2\u02f1\u02f2\7j\2\2\u02f2\u02f3\7c\2\2\u02f3\u02f4\7t\2\2"+
- "\u02f4\u02f5\7g\2\2\u02f5\u02f6\7f\2\2\u02f6y\3\2\2\2\u02f7\u02f8\7g\2"+
- "\2\u02f8\u02f9\7z\2\2\u02f9\u02fa\7e\2\2\u02fa\u02fb\7n\2\2\u02fb\u02fc"+
- "\7w\2\2\u02fc\u02fd\7u\2\2\u02fd\u02fe\7k\2\2\u02fe\u02ff\7x\2\2\u02ff"+
- "\u0300\7g\2\2\u0300{\3\2\2\2\u0301\u0302\7r\2\2\u0302\u0303\7t\2\2\u0303"+
- "\u0304\7g\2\2\u0304\u0305\7f\2\2\u0305\u0306\7k\2\2\u0306\u0307\7e\2\2"+
- "\u0307\u0308\7c\2\2\u0308\u0309\7v\2\2\u0309\u030a\7g\2\2\u030a}\3\2\2"+
- "\2\u030b\u030c\7y\2\2\u030c\u030d\7t\2\2\u030d\u030e\7k\2\2\u030e\u030f"+
- "\7v\2\2\u030f\u0310\7g\2\2\u0310\u0311\7R\2\2\u0311\u0312\7g\2\2\u0312"+
- "\u0313\7t\2\2\u0313\u0314\7o\2\2\u0314\u0315\3\2\2\2\u0315\u0316\b?\2"+
- "\2\u0316\177\3\2\2\2\u0317\u0318\7p\2\2\u0318\u0319\7q\2\2\u0319\u031a"+
- "\7R\2\2\u031a\u031b\7g\2\2\u031b\u031c\7t\2\2\u031c\u031d\7o\2\2\u031d"+
- "\u031e\3\2\2\2\u031e\u031f\b@\2\2\u031f\u0081\3\2\2\2\u0320\u0321\7v\2"+
- "\2\u0321\u0322\7t\2\2\u0322\u0323\7w\2\2\u0323\u0324\7u\2\2\u0324\u0325"+
- "\7v\2\2\u0325\u0326\7g\2\2\u0326\u0327\7f\2\2\u0327\u0328\3\2\2\2\u0328"+
- "\u0329\bA\2\2\u0329\u0083\3\2\2\2\u032a\u032b\7q\2\2\u032b\u032c\7w\2"+
- "\2\u032c\u032d\7v\2\2\u032d\u032e\7n\2\2\u032e\u032f\7k\2\2\u032f\u0330"+
- "\7p\2\2\u0330\u0331\7g\2\2\u0331\u0085\3\2\2\2\u0332\u0333\7k\2\2\u0333"+
- "\u0334\7p\2\2\u0334\u0335\7k\2\2\u0335\u0336\7v\2\2\u0336\u0337\7G\2\2"+
- "\u0337\u0338\7p\2\2\u0338\u0339\7u\2\2\u0339\u033a\7w\2\2\u033a\u033b"+
- "\7t\2\2\u033b\u033c\7g\2\2\u033c\u033d\7u\2\2\u033d\u0087\3\2\2\2\u033e"+
- "\u033f\7k\2\2\u033f\u0340\7o\2\2\u0340\u0341\7r\2\2\u0341\u0342\7q\2\2"+
- "\u0342\u0343\7t\2\2\u0343\u0344\7v\2\2\u0344\u0345\7T\2\2\u0345\u0346"+
- "\7g\2\2\u0346\u0347\7s\2\2\u0347\u0348\7w\2\2\u0348\u0349\7k\2\2\u0349"+
- "\u034a\7t\2\2\u034a\u034b\7g\2\2\u034b\u034c\7u\2\2\u034c\u0089\3\2\2"+
- "\2\u034d\u034e\7r\2\2\u034e\u034f\7t\2\2\u034f\u0350\7q\2\2\u0350\u0351"+
- "\7q\2\2\u0351\u0352\7h\2\2\u0352\u008b\3\2\2\2\u0353\u0354\7?\2\2\u0354"+
- "\u0355\7?\2\2\u0355\u0356\7?\2\2\u0356\u008d\3\2\2\2\u0357\u0358\7#\2"+
- "\2\u0358\u0359\7?\2\2\u0359\u035a\7?\2\2\u035a\u008f\3\2\2\2\u035b\u035c"+
- "\7d\2\2\u035c\u035d\7t\2\2\u035d\u035e\7g\2\2\u035e\u035f\7c\2\2\u035f"+
- "\u0360\7m\2\2\u0360\u0361\3\2\2\2\u0361\u0362\bH\2\2\u0362\u0091\3\2\2"+
- "\2\u0363\u0364\7f\2\2\u0364\u0365\7g\2\2\u0365\u0366\7h\2\2\u0366\u0367"+
- "\7c\2\2\u0367\u0368\7w\2\2\u0368\u0369\7n\2\2\u0369\u036a\7v\2\2\u036a"+
- "\u0093\3\2\2\2\u036b\u036c\7h\2\2\u036c\u036d\7w\2\2\u036d\u036e\7p\2"+
- "\2\u036e\u036f\7e\2\2\u036f\u0095\3\2\2\2\u0370\u0371\7k\2\2\u0371\u0372"+
- "\7p\2\2\u0372\u0373\7v\2\2\u0373\u0374\7g\2\2\u0374\u0375\7t\2\2\u0375"+
- "\u0376\7h\2\2\u0376\u0377\7c\2\2\u0377\u0378\7e\2\2\u0378\u0379\7g\2\2"+
- "\u0379\u0097\3\2\2\2\u037a\u037b\7u\2\2\u037b\u037c\7g\2\2\u037c\u037d"+
- "\7n\2\2\u037d\u037e\7g\2\2\u037e\u037f\7e\2\2\u037f\u0380\7v\2\2\u0380"+
- "\u0099\3\2\2\2\u0381\u0382\7e\2\2\u0382\u0383\7c\2\2\u0383\u0384\7u\2"+
- "\2\u0384\u0385\7g\2\2\u0385\u009b\3\2\2\2\u0386\u0387\7f\2\2\u0387\u0388"+
- "\7g\2\2\u0388\u0389\7h\2\2\u0389\u038a\7g\2\2\u038a\u038b\7t\2\2\u038b"+
- "\u009d\3\2\2\2\u038c\u038d\7i\2\2\u038d\u038e\7q\2\2\u038e\u009f\3\2\2"+
- "\2\u038f\u0390\7o\2\2\u0390\u0391\7c\2\2\u0391\u0392\7r\2\2\u0392\u00a1"+
- "\3\2\2\2\u0393\u0394\7u\2\2\u0394\u0395\7v\2\2\u0395\u0396\7t\2\2\u0396"+
- "\u0397\7w\2\2\u0397\u0398\7e\2\2\u0398\u0399\7v\2\2\u0399\u00a3\3\2\2"+
- "\2\u039a\u039b\7e\2\2\u039b\u039c\7j\2\2\u039c\u039d\7c\2\2\u039d\u039e"+
- "\7p\2\2\u039e\u00a5\3\2\2\2\u039f\u03a0\7g\2\2\u03a0\u03a1\7n\2\2\u03a1"+
- "\u03a2\7u\2\2\u03a2\u03a3\7g\2\2\u03a3\u00a7\3\2\2\2\u03a4\u03a5\7i\2"+
- "\2\u03a5\u03a6\7q\2\2\u03a6\u03a7\7v\2\2\u03a7\u03a8\7q\2\2\u03a8\u00a9"+
- "\3\2\2\2\u03a9\u03aa\7r\2\2\u03aa\u03ab\7c\2\2\u03ab\u03ac\7e\2\2\u03ac"+
- "\u03ad\7m\2\2\u03ad\u03ae\7c\2\2\u03ae\u03af\7i\2\2\u03af\u03b0\7g\2\2"+
- "\u03b0\u00ab\3\2\2\2\u03b1\u03b2\7u\2\2\u03b2\u03b3\7y\2\2\u03b3\u03b4"+
- "\7k\2\2\u03b4\u03b5\7v\2\2\u03b5\u03b6\7e\2\2\u03b6\u03b7\7j\2\2\u03b7"+
- "\u00ad\3\2\2\2\u03b8\u03b9\7e\2\2\u03b9\u03ba\7q\2\2\u03ba\u03bb\7p\2"+
- "\2\u03bb\u03bc\7u\2\2\u03bc\u03bd\7v\2\2\u03bd\u00af\3\2\2\2\u03be\u03bf"+
- "\7h\2\2\u03bf\u03c0\7c\2\2\u03c0\u03c1\7n\2\2\u03c1\u03c2\7n\2\2\u03c2"+
- "\u03c3\7v\2\2\u03c3\u03c4\7j\2\2\u03c4\u03c5\7t\2\2\u03c5\u03c6\7q\2\2"+
- "\u03c6\u03c7\7w\2\2\u03c7\u03c8\7i\2\2\u03c8\u03c9\7j\2\2\u03c9\u03ca"+
- "\3\2\2\2\u03ca\u03cb\bX\2\2\u03cb\u00b1\3\2\2\2\u03cc\u03cd\7k\2\2\u03cd"+
- "\u03ce\7h\2\2\u03ce\u00b3\3\2\2\2\u03cf\u03d0\7t\2\2\u03d0\u03d1\7c\2"+
- "\2\u03d1\u03d2\7p\2\2\u03d2\u03d3\7i\2\2\u03d3\u03d4\7g\2\2\u03d4\u00b5"+
- "\3\2\2\2\u03d5\u03d6\7v\2\2\u03d6\u03d7\7{\2\2\u03d7\u03d8\7r\2\2\u03d8"+
- "\u03d9\7g\2\2\u03d9\u00b7\3\2\2\2\u03da\u03db\7e\2\2\u03db\u03dc\7q\2"+
- "\2\u03dc\u03dd\7p\2\2\u03dd\u03de\7v\2\2\u03de\u03df\7k\2\2\u03df\u03e0"+
- "\7p\2\2\u03e0\u03e1\7w\2\2\u03e1\u03e2\7g\2\2\u03e2\u03e3\3\2\2\2\u03e3"+
- "\u03e4\b\\\2\2\u03e4\u00b9\3\2\2\2\u03e5\u03e6\7h\2\2\u03e6\u03e7\7q\2"+
- "\2\u03e7\u03e8\7t\2\2\u03e8\u00bb\3\2\2\2\u03e9\u03ea\7k\2\2\u03ea\u03eb"+
- "\7o\2\2\u03eb\u03ec\7r\2\2\u03ec\u03ed\7q\2\2\u03ed\u03ee\7t\2\2\u03ee"+
- "\u03ef\7v\2\2\u03ef\u00bd\3\2\2\2\u03f0\u03f1\7t\2\2\u03f1\u03f2\7g\2"+
- "\2\u03f2\u03f3\7v\2\2\u03f3\u03f4\7w\2\2\u03f4\u03f5\7t\2\2\u03f5\u03f6"+
- "\7p\2\2\u03f6\u03f7\3\2\2\2\u03f7\u03f8\b_\2\2\u03f8\u00bf\3\2\2\2\u03f9"+
- "\u03fa\7x\2\2\u03fa\u03fb\7c\2\2\u03fb\u03fc\7t\2\2\u03fc\u00c1\3\2\2"+
- "\2\u03fd\u03fe\7p\2\2\u03fe\u03ff\7k\2\2\u03ff\u0400\7n\2\2\u0400\u0401"+
- "\3\2\2\2\u0401\u0402\ba\2\2\u0402\u00c3\3\2\2\2\u0403\u0408\5\u0146\u00a3"+
- "\2\u0404\u0407\5\u0146\u00a3\2\u0405\u0407\5\u0148\u00a4\2\u0406\u0404"+
- "\3\2\2\2\u0406\u0405\3\2\2\2\u0407\u040a\3\2\2\2\u0408\u0406\3\2\2\2\u0408"+
- "\u0409\3\2\2\2\u0409\u040b\3\2\2\2\u040a\u0408\3\2\2\2\u040b\u040c\bb"+
- "\2\2\u040c\u00c5\3\2\2\2\u040d\u040e\7*\2\2\u040e\u00c7\3\2\2\2\u040f"+
- "\u0410\7+\2\2\u0410\u0411\3\2\2\2\u0411\u0412\bd\2\2\u0412\u00c9\3\2\2"+
- "\2\u0413\u0414\7}\2\2\u0414\u00cb\3\2\2\2\u0415\u0416\7\177\2\2\u0416"+
- "\u0417\3\2\2\2\u0417\u0418\bf\2\2\u0418\u00cd\3\2\2\2\u0419\u041a\7]\2"+
- "\2\u041a\u00cf\3\2\2\2\u041b\u041c\7_\2\2\u041c\u041d\3\2\2\2\u041d\u041e"+
- "\bh\2\2\u041e\u00d1\3\2\2\2\u041f\u0420\7?\2\2\u0420\u00d3\3\2\2\2\u0421"+
- "\u0422\7.\2\2\u0422\u00d5\3\2\2\2\u0423\u0424\7=\2\2\u0424\u00d7\3\2\2"+
- "\2\u0425\u0426\7<\2\2\u0426\u00d9\3\2\2\2\u0427\u0428\7\60\2\2\u0428\u00db"+
- "\3\2\2\2\u0429\u042a\7-\2\2\u042a\u042b\7-\2\2\u042b\u042c\3\2\2\2\u042c"+
- "\u042d\bn\2\2\u042d\u00dd\3\2\2\2\u042e\u042f\7/\2\2\u042f\u0430\7/\2"+
- "\2\u0430\u0431\3\2\2\2\u0431\u0432\bo\2\2\u0432\u00df\3\2\2\2\u0433\u0434"+
- "\7<\2\2\u0434\u0435\7?\2\2\u0435\u00e1\3\2\2\2\u0436\u0437\7\60\2\2\u0437"+
- "\u0438\7\60\2\2\u0438\u0439\7\60\2\2\u0439\u00e3\3\2\2\2\u043a\u043b\7"+
- "~\2\2\u043b\u043c\7~\2\2\u043c\u00e5\3\2\2\2\u043d\u043e\7(\2\2\u043e"+
- "\u043f\7(\2\2\u043f\u00e7\3\2\2\2\u0440\u0441\7?\2\2\u0441\u0442\7?\2"+
- "\2\u0442\u00e9\3\2\2\2\u0443\u0444\7#\2\2\u0444\u0445\7?\2\2\u0445\u00eb"+
- "\3\2\2\2\u0446\u0447\7>\2\2\u0447\u00ed\3\2\2\2\u0448\u0449\7>\2\2\u0449"+
- "\u044a\7?\2\2\u044a\u00ef\3\2\2\2\u044b\u044c\7@\2\2\u044c\u00f1\3\2\2"+
- "\2\u044d\u044e\7@\2\2\u044e\u044f\7?\2\2\u044f\u00f3\3\2\2\2\u0450\u0451"+
- "\7~\2\2\u0451\u00f5\3\2\2\2\u0452\u0453\7\61\2\2\u0453\u00f7\3\2\2\2\u0454"+
- "\u0455\7\'\2\2\u0455\u00f9\3\2\2\2\u0456\u0457\7>\2\2\u0457\u0458\7>\2"+
- "\2\u0458\u00fb\3\2\2\2\u0459\u045a\7@\2\2\u045a\u045b\7@\2\2\u045b\u00fd"+
- "\3\2\2\2\u045c\u045d\7(\2\2\u045d\u045e\7`\2\2\u045e\u00ff\3\2\2\2\u045f"+
- "\u0460\7#\2\2\u0460\u0101\3\2\2\2\u0461\u0462\7-\2\2\u0462\u0103\3\2\2"+
- "\2\u0463\u0464\7/\2\2\u0464\u0105\3\2\2\2\u0465\u0466\7`\2\2\u0466\u0107"+
- "\3\2\2\2\u0467\u0468\7,\2\2\u0468\u0109\3\2\2\2\u0469\u046a\7(\2\2\u046a"+
- "\u010b\3\2\2\2\u046b\u046c\7>\2\2\u046c\u046d\7/\2\2\u046d\u010d\3\2\2"+
- "\2\u046e\u047a\7\62\2\2\u046f\u0476\t\2\2\2\u0470\u0472\7a\2\2\u0471\u0470"+
- "\3\2\2\2\u0471\u0472\3\2\2\2\u0472\u0473\3\2\2\2\u0473\u0475\t\3\2\2\u0474"+
- "\u0471\3\2\2\2\u0475\u0478\3\2\2\2\u0476\u0474\3\2\2\2\u0476\u0477\3\2"+
- "\2\2\u0477\u047a\3\2\2\2\u0478\u0476\3\2\2\2\u0479\u046e\3\2\2\2\u0479"+
- "\u046f\3\2\2\2\u047a\u047b\3\2\2\2\u047b\u047c\b\u0087\2\2\u047c\u010f"+
- "\3\2\2\2\u047d\u047e\7\62\2\2\u047e\u0483\t\4\2\2\u047f\u0481\7a\2\2\u0480"+
- "\u047f\3\2\2\2\u0480\u0481\3\2\2\2\u0481\u0482\3\2\2\2\u0482\u0484\5\u0142"+
- "\u00a1\2\u0483\u0480\3\2\2\2\u0484\u0485\3\2\2\2\u0485\u0483\3\2\2\2\u0485"+
- "\u0486\3\2\2\2\u0486\u0487\3\2\2\2\u0487\u0488\b\u0088\2\2\u0488\u0111"+
- "\3\2\2\2\u0489\u048b\7\62\2\2\u048a\u048c\t\5\2\2\u048b\u048a\3\2\2\2"+
- "\u048b\u048c\3\2\2\2\u048c\u0491\3\2\2\2\u048d\u048f\7a\2\2\u048e\u048d"+
- "\3\2\2\2\u048e\u048f\3\2\2\2\u048f\u0490\3\2\2\2\u0490\u0492\5\u013e\u009f"+
- "\2\u0491\u048e\3\2\2\2\u0492\u0493\3\2\2\2\u0493\u0491\3\2\2\2\u0493\u0494"+
- "\3\2\2\2\u0494\u0495\3\2\2\2\u0495\u0496\b\u0089\2\2\u0496\u0113\3\2\2"+
- "\2\u0497\u0498\7\62\2\2\u0498\u049d\t\6\2\2\u0499\u049b\7a\2\2\u049a\u0499"+
- "\3\2\2\2\u049a\u049b\3\2\2\2\u049b\u049c\3\2\2\2\u049c\u049e\5\u0140\u00a0"+
- "\2\u049d\u049a\3\2\2\2\u049e\u049f\3\2\2\2\u049f\u049d\3\2\2\2\u049f\u04a0"+
- "\3\2\2\2\u04a0\u04a1\3\2\2\2\u04a1\u04a2\b\u008a\2\2\u04a2\u0115\3\2\2"+
- "\2\u04a3\u04a4\7\62\2\2\u04a4\u04a5\t\6\2\2\u04a5\u04a6\5\u0118\u008c"+
- "\2\u04a6\u04a7\5\u011a\u008d\2\u04a7\u0117\3\2\2\2\u04a8\u04aa\7a\2\2"+
- "\u04a9\u04a8\3\2\2\2\u04a9\u04aa\3\2\2\2\u04aa\u04ab\3\2\2\2\u04ab\u04ad"+
- "\5\u0140\u00a0\2\u04ac\u04a9\3\2\2\2\u04ad\u04ae\3\2\2\2\u04ae\u04ac\3"+
- "\2\2\2\u04ae\u04af\3\2\2\2\u04af\u04ba\3\2\2\2\u04b0\u04b7\7\60\2\2\u04b1"+
- "\u04b3\7a\2\2\u04b2\u04b1\3\2\2\2\u04b2\u04b3\3\2\2\2\u04b3\u04b4\3\2"+
- "\2\2\u04b4\u04b6\5\u0140\u00a0\2\u04b5\u04b2\3\2\2\2\u04b6\u04b9\3\2\2"+
- "\2\u04b7\u04b5\3\2\2\2\u04b7\u04b8\3\2\2\2\u04b8\u04bb\3\2\2\2\u04b9\u04b7"+
- "\3\2\2\2\u04ba\u04b0\3\2\2\2\u04ba\u04bb\3\2\2\2\u04bb\u04c8\3\2\2\2\u04bc"+
- "\u04bd\7\60\2\2\u04bd\u04c4\5\u0140\u00a0\2\u04be\u04c0\7a\2\2\u04bf\u04be"+
- "\3\2\2\2\u04bf\u04c0\3\2\2\2\u04c0\u04c1\3\2\2\2\u04c1\u04c3\5\u0140\u00a0"+
- "\2\u04c2\u04bf\3\2\2\2\u04c3\u04c6\3\2\2\2\u04c4\u04c2\3\2\2\2\u04c4\u04c5"+
- "\3\2\2\2\u04c5\u04c8\3\2\2\2\u04c6\u04c4\3\2\2\2\u04c7\u04ac\3\2\2\2\u04c7"+
- "\u04bc\3\2\2\2\u04c8\u0119\3\2\2\2\u04c9\u04ca\t\7\2\2\u04ca\u04cb\t\b"+
- "\2\2\u04cb\u04cc\5\u013c\u009e\2\u04cc\u011b\3\2\2\2\u04cd\u04d3\5\u010e"+
- "\u0087\2\u04ce\u04d3\5\u0110\u0088\2\u04cf\u04d3\5\u0112\u0089\2\u04d0"+
- "\u04d3\5\u0114\u008a\2\u04d1\u04d3\5\4\2\2\u04d2\u04cd\3\2\2\2\u04d2\u04ce"+
- "\3\2\2\2\u04d2\u04cf\3\2\2\2\u04d2\u04d0\3\2\2\2\u04d2\u04d1\3\2\2\2\u04d3"+
- "\u04d4\3\2\2\2\u04d4\u04d5\7k\2\2\u04d5\u04d6\3\2\2\2\u04d6\u04d7\b\u008e"+
- "\2\2\u04d7\u011d\3\2\2\2\u04d8\u04db\7)\2\2\u04d9\u04dc\5\u0138\u009c"+
- "\2\u04da\u04dc\5\u0122\u0091\2\u04db\u04d9\3\2\2\2\u04db\u04da\3\2\2\2"+
- "\u04dc\u04dd\3\2\2\2\u04dd\u04de\7)\2\2\u04de\u011f\3\2\2\2\u04df\u04e0"+
- "\5\u011e\u008f\2\u04e0\u04e1\3\2\2\2\u04e1\u04e2\b\u0090\2\2\u04e2\u0121"+
- "\3\2\2\2\u04e3\u04e6\5\u0124\u0092\2\u04e4\u04e6\5\u0126\u0093\2\u04e5"+
- "\u04e3\3\2\2\2\u04e5\u04e4\3\2\2\2\u04e6\u0123\3\2\2\2\u04e7\u04e8\7^"+
- "\2\2\u04e8\u04e9\5\u013e\u009f\2\u04e9\u04ea\5\u013e\u009f\2\u04ea\u04eb"+
- "\5\u013e\u009f\2\u04eb\u0125\3\2\2\2\u04ec\u04ed\7^\2\2\u04ed\u04ee\7"+
- "z\2\2\u04ee\u04ef\5\u0140\u00a0\2\u04ef\u04f0\5\u0140\u00a0\2\u04f0\u0127"+
- "\3\2\2\2\u04f1\u04f2\7^\2\2\u04f2\u04f3\7w\2\2\u04f3\u04f4\5\u0140\u00a0"+
- "\2\u04f4\u04f5\5\u0140\u00a0\2\u04f5\u04f6\5\u0140\u00a0\2\u04f6\u04f7"+
- "\5\u0140\u00a0\2\u04f7\u0129\3\2\2\2\u04f8\u04f9\7^\2\2\u04f9\u04fa\7"+
- "W\2\2\u04fa\u04fb\5\u0140\u00a0\2\u04fb\u04fc\5\u0140\u00a0\2\u04fc\u04fd"+
- "\5\u0140\u00a0\2\u04fd\u04fe\5\u0140\u00a0\2\u04fe\u04ff\5\u0140\u00a0"+
- "\2\u04ff\u0500\5\u0140\u00a0\2\u0500\u0501\5\u0140\u00a0\2\u0501\u0502"+
- "\5\u0140\u00a0\2\u0502\u012b\3\2\2\2\u0503\u0507\7b\2\2\u0504\u0506\n"+
- "\t\2\2\u0505\u0504\3\2\2\2\u0506\u0509\3\2\2\2\u0507\u0505\3\2\2\2\u0507"+
- "\u0508\3\2\2\2\u0508\u050a\3\2\2\2\u0509\u0507\3\2\2\2\u050a\u050b\7b"+
- "\2\2\u050b\u050c\3\2\2\2\u050c\u050d\b\u0096\2\2\u050d\u012d\3\2\2\2\u050e"+
- "\u0513\7$\2\2\u050f\u0512\n\n\2\2\u0510\u0512\5\u013a\u009d\2\u0511\u050f"+
- "\3\2\2\2\u0511\u0510\3\2\2\2\u0512\u0515\3\2\2\2\u0513\u0511\3\2\2\2\u0513"+
- "\u0514\3\2\2\2\u0514\u0516\3\2\2\2\u0515\u0513\3\2\2\2\u0516\u0517\7$"+
- "\2\2\u0517\u0518\3\2\2\2\u0518\u0519\b\u0097\2\2\u0519\u012f\3\2\2\2\u051a"+
- "\u051c\t\13\2\2\u051b\u051a\3\2\2\2\u051c\u051d\3\2\2\2\u051d\u051b\3"+
- "\2\2\2\u051d\u051e\3\2\2\2\u051e\u051f\3\2\2\2\u051f\u0520\b\u0098\3\2"+
- "\u0520\u0131\3\2\2\2\u0521\u0522\7\61\2\2\u0522\u0523\7,\2\2\u0523\u0527"+
- "\3\2\2\2\u0524\u0526\13\2\2\2\u0525\u0524\3\2\2\2\u0526\u0529\3\2\2\2"+
- "\u0527\u0528\3\2\2\2\u0527\u0525\3\2\2\2\u0528\u052a\3\2\2\2\u0529\u0527"+
- "\3\2\2\2\u052a\u052b\7,\2\2\u052b\u052c\7\61\2\2\u052c\u052d\3\2\2\2\u052d"+
- "\u052e\b\u0099\3\2\u052e\u0133\3\2\2\2\u052f\u0531\t\f\2\2\u0530\u052f"+
- "\3\2\2\2\u0531\u0532\3\2\2\2\u0532\u0530\3\2\2\2\u0532\u0533\3\2\2\2\u0533"+
- "\u0534\3\2\2\2\u0534\u0535\b\u009a\3\2\u0535\u0135\3\2\2\2\u0536\u0537"+
- "\7\61\2\2\u0537\u0538\7\61\2\2\u0538\u053c\3\2\2\2\u0539\u053b\n\f\2\2"+
- "\u053a\u0539\3\2\2\2\u053b\u053e\3\2\2\2\u053c\u053a\3\2\2\2\u053c\u053d"+
- "\3\2\2\2\u053d\u053f\3\2\2\2\u053e\u053c\3\2\2\2\u053f\u0540\b\u009b\3"+
- "\2\u0540\u0137\3\2\2\2\u0541\u0546\n\r\2\2\u0542\u0546\5\u0128\u0094\2"+
- "\u0543\u0546\5\u012a\u0095\2\u0544\u0546\5\u013a\u009d\2\u0545\u0541\3"+
- "\2\2\2\u0545\u0542\3\2\2\2\u0545\u0543\3\2\2\2\u0545\u0544\3\2\2\2\u0546"+
- "\u0139\3\2\2\2\u0547\u0561\7^\2\2\u0548\u0549\7w\2\2\u0549\u054a\5\u0140"+
- "\u00a0\2\u054a\u054b\5\u0140\u00a0\2\u054b\u054c\5\u0140\u00a0\2\u054c"+
- "\u054d\5\u0140\u00a0\2\u054d\u0562\3\2\2\2\u054e\u054f\7W\2\2\u054f\u0550"+
- "\5\u0140\u00a0\2\u0550\u0551\5\u0140\u00a0\2\u0551\u0552\5\u0140\u00a0"+
- "\2\u0552\u0553\5\u0140\u00a0\2\u0553\u0554\5\u0140\u00a0\2\u0554\u0555"+
- "\5\u0140\u00a0\2\u0555\u0556\5\u0140\u00a0\2\u0556\u0557\5\u0140\u00a0"+
- "\2\u0557\u0562\3\2\2\2\u0558\u0562\t\16\2\2\u0559\u055a\5\u013e\u009f"+
- "\2\u055a\u055b\5\u013e\u009f\2\u055b\u055c\5\u013e\u009f\2\u055c\u0562"+
- "\3\2\2\2\u055d\u055e\7z\2\2\u055e\u055f\5\u0140\u00a0\2\u055f\u0560\5"+
- "\u0140\u00a0\2\u0560\u0562\3\2\2\2\u0561\u0548\3\2\2\2\u0561\u054e\3\2"+
- "\2\2\u0561\u0558\3\2\2\2\u0561\u0559\3\2\2\2\u0561\u055d\3\2\2\2\u0562"+
- "\u013b\3\2\2\2\u0563\u056a\t\3\2\2\u0564\u0566\7a\2\2\u0565\u0564\3\2"+
- "\2\2\u0565\u0566\3\2\2\2\u0566\u0567\3\2\2\2\u0567\u0569\t\3\2\2\u0568"+
- "\u0565\3\2\2\2\u0569\u056c\3\2\2\2\u056a\u0568\3\2\2\2\u056a\u056b\3\2"+
- "\2\2\u056b\u013d\3\2\2\2\u056c\u056a\3\2\2\2\u056d\u056e\t\17\2\2\u056e"+
- "\u013f\3\2\2\2\u056f\u0570\t\20\2\2\u0570\u0141\3\2\2\2\u0571\u0572\t"+
- "\21\2\2\u0572\u0143\3\2\2\2\u0573\u0575\t\22\2\2\u0574\u0576\t\b\2\2\u0575"+
- "\u0574\3\2\2\2\u0575\u0576\3\2\2\2\u0576\u0577\3\2\2\2\u0577\u0578\5\u013c"+
- "\u009e\2\u0578\u0145\3\2\2\2\u0579\u057c\5\u014a\u00a5\2\u057a\u057c\7"+
- "a\2\2\u057b\u0579\3\2\2\2\u057b\u057a\3\2\2\2\u057c\u0147\3\2\2\2\u057d"+
- "\u057e\t\23\2\2\u057e\u0149\3\2\2\2\u057f\u0580\t\24\2\2\u0580\u014b\3"+
- "\2\2\2\u0581\u0583\t\13\2\2\u0582\u0581\3\2\2\2\u0583\u0584\3\2\2\2\u0584"+
- "\u0582\3\2\2\2\u0584\u0585\3\2\2\2\u0585\u0586\3\2\2\2\u0586\u0587\b\u00a6"+
- "\3\2\u0587\u014d\3\2\2\2\u0588\u0589\7\61\2\2\u0589\u058a\7,\2\2\u058a"+
- "\u058e\3\2\2\2\u058b\u058d\n\f\2\2\u058c\u058b\3\2\2\2\u058d\u0590\3\2"+
- "\2\2\u058e\u058f\3\2\2\2\u058e\u058c\3\2\2\2\u058f\u0591\3\2\2\2\u0590"+
- "\u058e\3\2\2\2\u0591\u0592\7,\2\2\u0592\u0593\7\61\2\2\u0593\u0594\3\2"+
- "\2\2\u0594\u0595\b\u00a7\3\2\u0595\u014f\3\2\2\2\u0596\u0597\7\61\2\2"+
- "\u0597\u0598\7\61\2\2\u0598\u059c\3\2\2\2\u0599\u059b\n\f\2\2\u059a\u0599"+
- "\3\2\2\2\u059b\u059e\3\2\2\2\u059c\u059a\3\2\2\2\u059c\u059d\3\2\2\2\u059d"+
- "\u059f\3\2\2\2\u059e\u059c\3\2\2\2\u059f\u05a0\b\u00a8\3\2\u05a0\u0151"+
- "\3\2\2\2\u05a1\u05a3\t\f\2\2\u05a2\u05a1\3\2\2\2\u05a3\u05a4\3\2\2\2\u05a4"+
- "\u05a2\3\2\2\2\u05a4\u05a5\3\2\2\2\u05a5\u05b4\3\2\2\2\u05a6\u05b4\7="+
- "\2\2\u05a7\u05a8\7\61\2\2\u05a8\u05a9\7,\2\2\u05a9\u05ad\3\2\2\2\u05aa"+
- "\u05ac\13\2\2\2\u05ab\u05aa\3\2\2\2\u05ac\u05af\3\2\2\2\u05ad\u05ae\3"+
- "\2\2\2\u05ad\u05ab\3\2\2\2\u05ae\u05b0\3\2\2\2\u05af\u05ad\3\2\2\2\u05b0"+
- "\u05b1\7,\2\2\u05b1\u05b4\7\61\2\2\u05b2\u05b4\7\2\2\3\u05b3\u05a2\3\2"+
- "\2\2\u05b3\u05a6\3\2\2\2\u05b3\u05a7\3\2\2\2\u05b3\u05b2\3\2\2\2\u05b4"+
- "\u05b5\3\2\2\2\u05b5\u05b6\b\u00a9\4\2\u05b6\u0153\3\2\2\2\u05b7\u05b8"+
- "\3\2\2\2\u05b8\u05b9\3\2\2\2\u05b9\u05ba\b\u00aa\4\2\u05ba\u05bb\b\u00aa"+
- "\3\2\u05bb\u0155\3\2\2\2\64\2\3\u0158\u0160\u0163\u0166\u016c\u016e\u0406"+
- "\u0408\u0471\u0476\u0479\u0480\u0485\u048b\u048e\u0493\u049a\u049f\u04a9"+
- "\u04ae\u04b2\u04b7\u04ba\u04bf\u04c4\u04c7\u04d2\u04db\u04e5\u0507\u0511"+
- "\u0513\u051d\u0527\u0532\u053c\u0545\u0561\u0565\u056a\u0575\u057b\u0584"+
- "\u058e\u059c\u05a4\u05ad\u05b3\5\4\3\2\2\3\2\4\2\2";
+ "\4\u00a9\t\u00a9\4\u00aa\t\u00aa\4\u00ab\t\u00ab\3\2\3\2\5\2\u015b\n\2"+
+ "\3\2\3\2\3\3\3\3\3\3\3\3\5\3\u0163\n\3\3\3\5\3\u0166\n\3\3\3\5\3\u0169"+
+ "\n\3\3\3\3\3\3\3\3\3\5\3\u016f\n\3\5\3\u0171\n\3\3\4\3\4\3\4\3\4\3\4\3"+
+ "\4\3\4\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\7"+
+ "\3\7\3\7\3\7\3\7\3\7\3\7\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\t\3\t\3\t\3\t\3"+
+ "\t\3\t\3\t\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\13\3\13\3\13\3\13\3\13"+
+ "\3\13\3\13\3\13\3\13\3\13\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\r\3\r\3\r"+
+ "\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3"+
+ "\16\3\16\3\16\3\16\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\20\3\20\3\20\3"+
+ "\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\21\3\21\3\21\3\22\3\22\3\22\3"+
+ "\22\3\22\3\22\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\24\3\24\3"+
+ "\24\3\24\3\24\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\26\3\26\3\26\3\26\3"+
+ "\26\3\26\3\26\3\27\3\27\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3"+
+ "\31\3\31\3\31\3\31\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3"+
+ "\32\3\32\3\32\3\33\3\33\3\33\3\33\3\33\3\33\3\34\3\34\3\34\3\35\3\35\3"+
+ "\36\3\36\3\36\3\36\3\36\3\36\3\36\3\37\3\37\3\37\3\37\3\37\3\37\3 \3 "+
+ "\3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3!\3!\3!\3!\3!\3!\3!\3!\3!\3\"\3\"\3"+
+ "\"\3\"\3#\3#\3#\3#\3$\3$\3$\3$\3$\3$\3%\3%\3&\3&\3&\3\'\3\'\3\'\3\'\3"+
+ "\'\3(\3(\3(\3(\3(\3(\3)\3)\3)\3)\3)\3)\3*\3*\3*\3*\3*\3*\3*\3+\3+\3+\3"+
+ "+\3+\3+\3+\3,\3,\3,\3,\3,\3,\3,\3,\3,\3-\3-\3-\3-\3-\3-\3.\3.\3.\3.\3"+
+ ".\3.\3/\3/\3/\3/\3/\3/\3/\3\60\3\60\3\60\3\60\3\60\3\60\3\61\3\61\3\61"+
+ "\3\61\3\61\3\61\3\61\3\62\3\62\3\62\3\62\3\62\3\62\3\63\3\63\3\63\3\63"+
+ "\3\63\3\63\3\63\3\63\3\63\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\65"+
+ "\3\65\3\65\3\65\3\65\3\65\3\65\3\66\3\66\3\66\3\66\3\66\3\67\3\67\3\67"+
+ "\3\67\3\67\3\67\3\67\3\67\3\67\38\38\38\38\38\38\38\38\38\38\38\38\38"+
+ "\38\38\39\39\39\39\39\39\3:\3:\3:\3:\3;\3;\3;\3<\3<\3<\3<\3<\3<\3<\3="+
+ "\3=\3=\3=\3=\3=\3=\3=\3=\3=\3>\3>\3>\3>\3>\3>\3>\3>\3>\3>\3?\3?\3?\3?"+
+ "\3?\3?\3?\3?\3?\3?\3?\3?\3@\3@\3@\3@\3@\3@\3@\3@\3@\3A\3A\3A\3A\3A\3A"+
+ "\3A\3A\3A\3A\3B\3B\3B\3B\3B\3B\3B\3B\3C\3C\3C\3C\3C\3C\3C\3C\3C\3C\3C"+
+ "\3C\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3E\3E\3E\3E\3E\3E\3F"+
+ "\3F\3F\3F\3G\3G\3G\3G\3H\3H\3H\3H\3H\3I\3I\3I\3I\3I\3I\3I\3I\3J\3J\3J"+
+ "\3J\3J\3J\3J\3J\3K\3K\3K\3K\3K\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\3M\3M\3M"+
+ "\3M\3M\3M\3M\3N\3N\3N\3N\3N\3O\3O\3O\3O\3O\3O\3P\3P\3P\3Q\3Q\3Q\3Q\3R"+
+ "\3R\3R\3R\3R\3R\3R\3S\3S\3S\3S\3S\3T\3T\3T\3T\3T\3U\3U\3U\3U\3U\3V\3V"+
+ "\3V\3V\3V\3V\3V\3V\3W\3W\3W\3W\3W\3W\3W\3X\3X\3X\3X\3X\3X\3Y\3Y\3Y\3Y"+
+ "\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Z\3Z\3Z\3[\3[\3[\3[\3[\3[\3\\\3\\\3\\"+
+ "\3\\\3\\\3]\3]\3]\3]\3]\3]\3]\3]\3]\3]\3]\3^\3^\3^\3^\3_\3_\3_\3_\3_\3"+
+ "_\3_\3`\3`\3`\3`\3`\3`\3`\3`\3`\3a\3a\3a\3a\3b\3b\3b\3b\3b\3b\3c\3c\3"+
+ "c\7c\u040e\nc\fc\16c\u0411\13c\3c\3c\3d\3d\3e\3e\3e\3e\3f\3f\3g\3g\3g"+
+ "\3g\3h\3h\3i\3i\3i\3i\3j\3j\3k\3k\3l\3l\3m\3m\3n\3n\3o\3o\3o\3o\3o\3p"+
+ "\3p\3p\3p\3p\3q\3q\3q\3r\3r\3r\3r\3s\3s\3s\3t\3t\3t\3u\3u\3u\3v\3v\3v"+
+ "\3w\3w\3x\3x\3x\3y\3y\3z\3z\3z\3{\3{\3|\3|\3}\3}\3~\3~\3~\3\177\3\177"+
+ "\3\177\3\u0080\3\u0080\3\u0080\3\u0081\3\u0081\3\u0082\3\u0082\3\u0083"+
+ "\3\u0083\3\u0084\3\u0084\3\u0085\3\u0085\3\u0086\3\u0086\3\u0087\3\u0087"+
+ "\3\u0087\3\u0088\3\u0088\3\u0088\5\u0088\u0479\n\u0088\3\u0088\7\u0088"+
+ "\u047c\n\u0088\f\u0088\16\u0088\u047f\13\u0088\5\u0088\u0481\n\u0088\3"+
+ "\u0088\3\u0088\3\u0089\3\u0089\3\u0089\5\u0089\u0488\n\u0089\3\u0089\6"+
+ "\u0089\u048b\n\u0089\r\u0089\16\u0089\u048c\3\u0089\3\u0089\3\u008a\3"+
+ "\u008a\5\u008a\u0493\n\u008a\3\u008a\5\u008a\u0496\n\u008a\3\u008a\6\u008a"+
+ "\u0499\n\u008a\r\u008a\16\u008a\u049a\3\u008a\3\u008a\3\u008b\3\u008b"+
+ "\3\u008b\5\u008b\u04a2\n\u008b\3\u008b\6\u008b\u04a5\n\u008b\r\u008b\16"+
+ "\u008b\u04a6\3\u008b\3\u008b\3\u008c\3\u008c\3\u008c\3\u008c\3\u008c\3"+
+ "\u008d\5\u008d\u04b1\n\u008d\3\u008d\6\u008d\u04b4\n\u008d\r\u008d\16"+
+ "\u008d\u04b5\3\u008d\3\u008d\5\u008d\u04ba\n\u008d\3\u008d\7\u008d\u04bd"+
+ "\n\u008d\f\u008d\16\u008d\u04c0\13\u008d\5\u008d\u04c2\n\u008d\3\u008d"+
+ "\3\u008d\3\u008d\5\u008d\u04c7\n\u008d\3\u008d\7\u008d\u04ca\n\u008d\f"+
+ "\u008d\16\u008d\u04cd\13\u008d\5\u008d\u04cf\n\u008d\3\u008e\3\u008e\3"+
+ "\u008e\3\u008e\3\u008f\3\u008f\3\u008f\3\u008f\3\u008f\5\u008f\u04da\n"+
+ "\u008f\3\u008f\3\u008f\3\u008f\3\u008f\3\u0090\3\u0090\3\u0090\5\u0090"+
+ "\u04e3\n\u0090\3\u0090\3\u0090\3\u0091\3\u0091\3\u0091\3\u0091\3\u0092"+
+ "\3\u0092\5\u0092\u04ed\n\u0092\3\u0093\3\u0093\3\u0093\3\u0093\3\u0093"+
+ "\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0095\3\u0095\3\u0095\3\u0095"+
+ "\3\u0095\3\u0095\3\u0095\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096"+
+ "\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0097\3\u0097\7\u0097\u050d"+
+ "\n\u0097\f\u0097\16\u0097\u0510\13\u0097\3\u0097\3\u0097\3\u0097\3\u0097"+
+ "\3\u0098\3\u0098\3\u0098\7\u0098\u0519\n\u0098\f\u0098\16\u0098\u051c"+
+ "\13\u0098\3\u0098\3\u0098\3\u0098\3\u0098\3\u0099\6\u0099\u0523\n\u0099"+
+ "\r\u0099\16\u0099\u0524\3\u0099\3\u0099\3\u009a\3\u009a\3\u009a\3\u009a"+
+ "\7\u009a\u052d\n\u009a\f\u009a\16\u009a\u0530\13\u009a\3\u009a\3\u009a"+
+ "\3\u009a\3\u009a\3\u009a\3\u009b\6\u009b\u0538\n\u009b\r\u009b\16\u009b"+
+ "\u0539\3\u009b\3\u009b\3\u009c\3\u009c\3\u009c\3\u009c\7\u009c\u0542\n"+
+ "\u009c\f\u009c\16\u009c\u0545\13\u009c\3\u009c\3\u009c\3\u009d\3\u009d"+
+ "\3\u009d\3\u009d\5\u009d\u054d\n\u009d\3\u009e\3\u009e\3\u009e\3\u009e"+
+ "\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e"+
+ "\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e"+
+ "\3\u009e\3\u009e\3\u009e\3\u009e\5\u009e\u0569\n\u009e\3\u009f\3\u009f"+
+ "\5\u009f\u056d\n\u009f\3\u009f\7\u009f\u0570\n\u009f\f\u009f\16\u009f"+
+ "\u0573\13\u009f\3\u00a0\3\u00a0\3\u00a1\3\u00a1\3\u00a2\3\u00a2\3\u00a3"+
+ "\3\u00a3\5\u00a3\u057d\n\u00a3\3\u00a3\3\u00a3\3\u00a4\3\u00a4\5\u00a4"+
+ "\u0583\n\u00a4\3\u00a5\3\u00a5\3\u00a6\3\u00a6\3\u00a7\6\u00a7\u058a\n"+
+ "\u00a7\r\u00a7\16\u00a7\u058b\3\u00a7\3\u00a7\3\u00a8\3\u00a8\3\u00a8"+
+ "\3\u00a8\7\u00a8\u0594\n\u00a8\f\u00a8\16\u00a8\u0597\13\u00a8\3\u00a8"+
+ "\3\u00a8\3\u00a8\3\u00a8\3\u00a8\3\u00a9\3\u00a9\3\u00a9\3\u00a9\7\u00a9"+
+ "\u05a2\n\u00a9\f\u00a9\16\u00a9\u05a5\13\u00a9\3\u00a9\3\u00a9\3\u00aa"+
+ "\6\u00aa\u05aa\n\u00aa\r\u00aa\16\u00aa\u05ab\3\u00aa\3\u00aa\3\u00aa"+
+ "\3\u00aa\3\u00aa\7\u00aa\u05b3\n\u00aa\f\u00aa\16\u00aa\u05b6\13\u00aa"+
+ "\3\u00aa\3\u00aa\3\u00aa\5\u00aa\u05bb\n\u00aa\3\u00aa\3\u00aa\3\u00ab"+
+ "\3\u00ab\3\u00ab\3\u00ab\3\u00ab\5\u052e\u0595\u05b4\2\u00ac\4\3\6\4\b"+
+ "\5\n\6\f\7\16\b\20\t\22\n\24\13\26\f\30\r\32\16\34\17\36\20 \21\"\22$"+
+ "\23&\24(\25*\26,\27.\30\60\31\62\32\64\33\66\348\35:\36<\37> @!B\"D#F"+
+ "$H%J&L\'N(P)R*T+V,X-Z.\\/^\60`\61b\62d\63f\64h\65j\66l\67n8p9r:t;v|?~@\u0080A\u0082B\u0084C\u0086D\u0088E\u008aF\u008cG\u008eH\u0090I"+
+ "\u0092J\u0094K\u0096L\u0098M\u009aN\u009cO\u009eP\u00a0Q\u00a2R\u00a4"+
+ "S\u00a6T\u00a8U\u00aaV\u00acW\u00aeX\u00b0Y\u00b2Z\u00b4[\u00b6\\\u00b8"+
+ "]\u00ba^\u00bc_\u00be`\u00c0a\u00c2b\u00c4c\u00c6d\u00c8e\u00caf\u00cc"+
+ "g\u00ceh\u00d0i\u00d2j\u00d4k\u00d6l\u00d8m\u00dan\u00dco\u00dep\u00e0"+
+ "q\u00e2r\u00e4s\u00e6t\u00e8u\u00eav\u00ecw\u00eex\u00f0y\u00f2z\u00f4"+
+ "{\u00f6|\u00f8}\u00fa~\u00fc\177\u00fe\u0080\u0100\u0081\u0102\u0082\u0104"+
+ "\u0083\u0106\u0084\u0108\u0085\u010a\u0086\u010c\u0087\u010e\u0088\u0110"+
+ "\u0089\u0112\u008a\u0114\u008b\u0116\u008c\u0118\u008d\u011a\2\u011c\2"+
+ "\u011e\u008e\u0120\2\u0122\u008f\u0124\u0090\u0126\u0091\u0128\u0092\u012a"+
+ "\u0093\u012c\u0094\u012e\u0095\u0130\u0096\u0132\u0097\u0134\u0098\u0136"+
+ "\u0099\u0138\u009a\u013a\2\u013c\2\u013e\2\u0140\2\u0142\2\u0144\2\u0146"+
+ "\2\u0148\2\u014a\2\u014c\2\u014e\u009b\u0150\u009c\u0152\u009d\u0154\u009e"+
+ "\u0156\u009f\4\2\3\23\3\2\63;\3\2\62;\4\2DDdd\4\2QQqq\4\2ZZzz\4\2RRrr"+
+ "\4\2--//\3\2bb\4\2$$^^\4\2\13\13\"\"\4\2\f\f\17\17\5\2\f\f\17\17))\13"+
+ "\2$$))^^cdhhppttvvxx\3\2\629\5\2\62;CHch\3\2\62\63\4\2GGgg\49\2\62\2;"+
+ "\2\u0662\2\u066b\2\u06f2\2\u06fb\2\u07c2\2\u07cb\2\u0968\2\u0971\2\u09e8"+
+ "\2\u09f1\2\u0a68\2\u0a71\2\u0ae8\2\u0af1\2\u0b68\2\u0b71\2\u0be8\2\u0bf1"+
+ "\2\u0c68\2\u0c71\2\u0ce8\2\u0cf1\2\u0d68\2\u0d71\2\u0de8\2\u0df1\2\u0e52"+
+ "\2\u0e5b\2\u0ed2\2\u0edb\2\u0f22\2\u0f2b\2\u1042\2\u104b\2\u1092\2\u109b"+
+ "\2\u17e2\2\u17eb\2\u1812\2\u181b\2\u1948\2\u1951\2\u19d2\2\u19db\2\u1a82"+
+ "\2\u1a8b\2\u1a92\2\u1a9b\2\u1b52\2\u1b5b\2\u1bb2\2\u1bbb\2\u1c42\2\u1c4b"+
+ "\2\u1c52\2\u1c5b\2\ua622\2\ua62b\2\ua8d2\2\ua8db\2\ua902\2\ua90b\2\ua9d2"+
+ "\2\ua9db\2\ua9f2\2\ua9fb\2\uaa52\2\uaa5b\2\uabf2\2\uabfb\2\uff12\2\uff1b"+
+ "\2\u04a2\3\u04ab\3\u1068\3\u1071\3\u10f2\3\u10fb\3\u1138\3\u1141\3\u11d2"+
+ "\3\u11db\3\u12f2\3\u12fb\3\u1452\3\u145b\3\u14d2\3\u14db\3\u1652\3\u165b"+
+ "\3\u16c2\3\u16cb\3\u1732\3\u173b\3\u18e2\3\u18eb\3\u1c52\3\u1c5b\3\u1d52"+
+ "\3\u1d5b\3\u6a62\3\u6a6b\3\u6b52\3\u6b5b\3\ud7d0\3\ud801\3\ue952\3\ue95b"+
+ "\3\u024b\2C\2\\\2c\2|\2\u00ac\2\u00ac\2\u00b7\2\u00b7\2\u00bc\2\u00bc"+
+ "\2\u00c2\2\u00d8\2\u00da\2\u00f8\2\u00fa\2\u02c3\2\u02c8\2\u02d3\2\u02e2"+
+ "\2\u02e6\2\u02ee\2\u02ee\2\u02f0\2\u02f0\2\u0372\2\u0376\2\u0378\2\u0379"+
+ "\2\u037c\2\u037f\2\u0381\2\u0381\2\u0388\2\u0388\2\u038a\2\u038c\2\u038e"+
+ "\2\u038e\2\u0390\2\u03a3\2\u03a5\2\u03f7\2\u03f9\2\u0483\2\u048c\2\u0531"+
+ "\2\u0533\2\u0558\2\u055b\2\u055b\2\u0563\2\u0589\2\u05d2\2\u05ec\2\u05f2"+
+ "\2\u05f4\2\u0622\2\u064c\2\u0670\2\u0671\2\u0673\2\u06d5\2\u06d7\2\u06d7"+
+ "\2\u06e7\2\u06e8\2\u06f0\2\u06f1\2\u06fc\2\u06fe\2\u0701\2\u0701\2\u0712"+
+ "\2\u0712\2\u0714\2\u0731\2\u074f\2\u07a7\2\u07b3\2\u07b3\2\u07cc\2\u07ec"+
+ "\2\u07f6\2\u07f7\2\u07fc\2\u07fc\2\u0802\2\u0817\2\u081c\2\u081c\2\u0826"+
+ "\2\u0826\2\u082a\2\u082a\2\u0842\2\u085a\2\u0862\2\u086c\2\u08a2\2\u08b6"+
+ "\2\u08b8\2\u08bf\2\u0906\2\u093b\2\u093f\2\u093f\2\u0952\2\u0952\2\u095a"+
+ "\2\u0963\2\u0973\2\u0982\2\u0987\2\u098e\2\u0991\2\u0992\2\u0995\2\u09aa"+
+ "\2\u09ac\2\u09b2\2\u09b4\2\u09b4\2\u09b8\2\u09bb\2\u09bf\2\u09bf\2\u09d0"+
+ "\2\u09d0\2\u09de\2\u09df\2\u09e1\2\u09e3\2\u09f2\2\u09f3\2\u09fe\2\u09fe"+
+ "\2\u0a07\2\u0a0c\2\u0a11\2\u0a12\2\u0a15\2\u0a2a\2\u0a2c\2\u0a32\2\u0a34"+
+ "\2\u0a35\2\u0a37\2\u0a38\2\u0a3a\2\u0a3b\2\u0a5b\2\u0a5e\2\u0a60\2\u0a60"+
+ "\2\u0a74\2\u0a76\2\u0a87\2\u0a8f\2\u0a91\2\u0a93\2\u0a95\2\u0aaa\2\u0aac"+
+ "\2\u0ab2\2\u0ab4\2\u0ab5\2\u0ab7\2\u0abb\2\u0abf\2\u0abf\2\u0ad2\2\u0ad2"+
+ "\2\u0ae2\2\u0ae3\2\u0afb\2\u0afb\2\u0b07\2\u0b0e\2\u0b11\2\u0b12\2\u0b15"+
+ "\2\u0b2a\2\u0b2c\2\u0b32\2\u0b34\2\u0b35\2\u0b37\2\u0b3b\2\u0b3f\2\u0b3f"+
+ "\2\u0b5e\2\u0b5f\2\u0b61\2\u0b63\2\u0b73\2\u0b73\2\u0b85\2\u0b85\2\u0b87"+
+ "\2\u0b8c\2\u0b90\2\u0b92\2\u0b94\2\u0b97\2\u0b9b\2\u0b9c\2\u0b9e\2\u0b9e"+
+ "\2\u0ba0\2\u0ba1\2\u0ba5\2\u0ba6\2\u0baa\2\u0bac\2\u0bb0\2\u0bbb\2\u0bd2"+
+ "\2\u0bd2\2\u0c07\2\u0c0e\2\u0c10\2\u0c12\2\u0c14\2\u0c2a\2\u0c2c\2\u0c3b"+
+ "\2\u0c3f\2\u0c3f\2\u0c5a\2\u0c5c\2\u0c62\2\u0c63\2\u0c82\2\u0c82\2\u0c87"+
+ "\2\u0c8e\2\u0c90\2\u0c92\2\u0c94\2\u0caa\2\u0cac\2\u0cb5\2\u0cb7\2\u0cbb"+
+ "\2\u0cbf\2\u0cbf\2\u0ce0\2\u0ce0\2\u0ce2\2\u0ce3\2\u0cf3\2\u0cf4\2\u0d07"+
+ "\2\u0d0e\2\u0d10\2\u0d12\2\u0d14\2\u0d3c\2\u0d3f\2\u0d3f\2\u0d50\2\u0d50"+
+ "\2\u0d56\2\u0d58\2\u0d61\2\u0d63\2\u0d7c\2\u0d81\2\u0d87\2\u0d98\2\u0d9c"+
+ "\2\u0db3\2\u0db5\2\u0dbd\2\u0dbf\2\u0dbf\2\u0dc2\2\u0dc8\2\u0e03\2\u0e32"+
+ "\2\u0e34\2\u0e35\2\u0e42\2\u0e48\2\u0e83\2\u0e84\2\u0e86\2\u0e86\2\u0e89"+
+ "\2\u0e8a\2\u0e8c\2\u0e8c\2\u0e8f\2\u0e8f\2\u0e96\2\u0e99\2\u0e9b\2\u0ea1"+
+ "\2\u0ea3\2\u0ea5\2\u0ea7\2\u0ea7\2\u0ea9\2\u0ea9\2\u0eac\2\u0ead\2\u0eaf"+
+ "\2\u0eb2\2\u0eb4\2\u0eb5\2\u0ebf\2\u0ebf\2\u0ec2\2\u0ec6\2\u0ec8\2\u0ec8"+
+ "\2\u0ede\2\u0ee1\2\u0f02\2\u0f02\2\u0f42\2\u0f49\2\u0f4b\2\u0f6e\2\u0f8a"+
+ "\2\u0f8e\2\u1002\2\u102c\2\u1041\2\u1041\2\u1052\2\u1057\2\u105c\2\u105f"+
+ "\2\u1063\2\u1063\2\u1067\2\u1068\2\u1070\2\u1072\2\u1077\2\u1083\2\u1090"+
+ "\2\u1090\2\u10a2\2\u10c7\2\u10c9\2\u10c9\2\u10cf\2\u10cf\2\u10d2\2\u10fc"+
+ "\2\u10fe\2\u124a\2\u124c\2\u124f\2\u1252\2\u1258\2\u125a\2\u125a\2\u125c"+
+ "\2\u125f\2\u1262\2\u128a\2\u128c\2\u128f\2\u1292\2\u12b2\2\u12b4\2\u12b7"+
+ "\2\u12ba\2\u12c0\2\u12c2\2\u12c2\2\u12c4\2\u12c7\2\u12ca\2\u12d8\2\u12da"+
+ "\2\u1312\2\u1314\2\u1317\2\u131a\2\u135c\2\u1382\2\u1391\2\u13a2\2\u13f7"+
+ "\2\u13fa\2\u13ff\2\u1403\2\u166e\2\u1671\2\u1681\2\u1683\2\u169c\2\u16a2"+
+ "\2\u16ec\2\u16f3\2\u16fa\2\u1702\2\u170e\2\u1710\2\u1713\2\u1722\2\u1733"+
+ "\2\u1742\2\u1753\2\u1762\2\u176e\2\u1770\2\u1772\2\u1782\2\u17b5\2\u17d9"+
+ "\2\u17d9\2\u17de\2\u17de\2\u1822\2\u1879\2\u1882\2\u1886\2\u1889\2\u18aa"+
+ "\2\u18ac\2\u18ac\2\u18b2\2\u18f7\2\u1902\2\u1920\2\u1952\2\u196f\2\u1972"+
+ "\2\u1976\2\u1982\2\u19ad\2\u19b2\2\u19cb\2\u1a02\2\u1a18\2\u1a22\2\u1a56"+
+ "\2\u1aa9\2\u1aa9\2\u1b07\2\u1b35\2\u1b47\2\u1b4d\2\u1b85\2\u1ba2\2\u1bb0"+
+ "\2\u1bb1\2\u1bbc\2\u1be7\2\u1c02\2\u1c25\2\u1c4f\2\u1c51\2\u1c5c\2\u1c7f"+
+ "\2\u1c82\2\u1c8a\2\u1ceb\2\u1cee\2\u1cf0\2\u1cf3\2\u1cf7\2\u1cf8\2\u1d02"+
+ "\2\u1dc1\2\u1e02\2\u1f17\2\u1f1a\2\u1f1f\2\u1f22\2\u1f47\2\u1f4a\2\u1f4f"+
+ "\2\u1f52\2\u1f59\2\u1f5b\2\u1f5b\2\u1f5d\2\u1f5d\2\u1f5f\2\u1f5f\2\u1f61"+
+ "\2\u1f7f\2\u1f82\2\u1fb6\2\u1fb8\2\u1fbe\2\u1fc0\2\u1fc0\2\u1fc4\2\u1fc6"+
+ "\2\u1fc8\2\u1fce\2\u1fd2\2\u1fd5\2\u1fd8\2\u1fdd\2\u1fe2\2\u1fee\2\u1ff4"+
+ "\2\u1ff6\2\u1ff8\2\u1ffe\2\u2073\2\u2073\2\u2081\2\u2081\2\u2092\2\u209e"+
+ "\2\u2104\2\u2104\2\u2109\2\u2109\2\u210c\2\u2115\2\u2117\2\u2117\2\u211b"+
+ "\2\u211f\2\u2126\2\u2126\2\u2128\2\u2128\2\u212a\2\u212a\2\u212c\2\u212f"+
+ "\2\u2131\2\u213b\2\u213e\2\u2141\2\u2147\2\u214b\2\u2150\2\u2150\2\u2185"+
+ "\2\u2186\2\u2c02\2\u2c30\2\u2c32\2\u2c60\2\u2c62\2\u2ce6\2\u2ced\2\u2cf0"+
+ "\2\u2cf4\2\u2cf5\2\u2d02\2\u2d27\2\u2d29\2\u2d29\2\u2d2f\2\u2d2f\2\u2d32"+
+ "\2\u2d69\2\u2d71\2\u2d71\2\u2d82\2\u2d98\2\u2da2\2\u2da8\2\u2daa\2\u2db0"+
+ "\2\u2db2\2\u2db8\2\u2dba\2\u2dc0\2\u2dc2\2\u2dc8\2\u2dca\2\u2dd0\2\u2dd2"+
+ "\2\u2dd8\2\u2dda\2\u2de0\2\u2e31\2\u2e31\2\u3007\2\u3008\2\u3033\2\u3037"+
+ "\2\u303d\2\u303e\2\u3043\2\u3098\2\u309f\2\u30a1\2\u30a3\2\u30fc\2\u30fe"+
+ "\2\u3101\2\u3107\2\u3130\2\u3133\2\u3190\2\u31a2\2\u31bc\2\u31f2\2\u3201"+
+ "\2\u3402\2\u4db7\2\u4e02\2\u9fec\2\ua002\2\ua48e\2\ua4d2\2\ua4ff\2\ua502"+
+ "\2\ua60e\2\ua612\2\ua621\2\ua62c\2\ua62d\2\ua642\2\ua670\2\ua681\2\ua69f"+
+ "\2\ua6a2\2\ua6e7\2\ua719\2\ua721\2\ua724\2\ua78a\2\ua78d\2\ua7b0\2\ua7b2"+
+ "\2\ua7b9\2\ua7f9\2\ua803\2\ua805\2\ua807\2\ua809\2\ua80c\2\ua80e\2\ua824"+
+ "\2\ua842\2\ua875\2\ua884\2\ua8b5\2\ua8f4\2\ua8f9\2\ua8fd\2\ua8fd\2\ua8ff"+
+ "\2\ua8ff\2\ua90c\2\ua927\2\ua932\2\ua948\2\ua962\2\ua97e\2\ua986\2\ua9b4"+
+ "\2\ua9d1\2\ua9d1\2\ua9e2\2\ua9e6\2\ua9e8\2\ua9f1\2\ua9fc\2\uaa00\2\uaa02"+
+ "\2\uaa2a\2\uaa42\2\uaa44\2\uaa46\2\uaa4d\2\uaa62\2\uaa78\2\uaa7c\2\uaa7c"+
+ "\2\uaa80\2\uaab1\2\uaab3\2\uaab3\2\uaab7\2\uaab8\2\uaabb\2\uaabf\2\uaac2"+
+ "\2\uaac2\2\uaac4\2\uaac4\2\uaadd\2\uaadf\2\uaae2\2\uaaec\2\uaaf4\2\uaaf6"+
+ "\2\uab03\2\uab08\2\uab0b\2\uab10\2\uab13\2\uab18\2\uab22\2\uab28\2\uab2a"+
+ "\2\uab30\2\uab32\2\uab5c\2\uab5e\2\uab67\2\uab72\2\uabe4\2\uac02\2\ud7a5"+
+ "\2\ud7b2\2\ud7c8\2\ud7cd\2\ud7fd\2\uf902\2\ufa6f\2\ufa72\2\ufadb\2\ufb02"+
+ "\2\ufb08\2\ufb15\2\ufb19\2\ufb1f\2\ufb1f\2\ufb21\2\ufb2a\2\ufb2c\2\ufb38"+
+ "\2\ufb3a\2\ufb3e\2\ufb40\2\ufb40\2\ufb42\2\ufb43\2\ufb45\2\ufb46\2\ufb48"+
+ "\2\ufbb3\2\ufbd5\2\ufd3f\2\ufd52\2\ufd91\2\ufd94\2\ufdc9\2\ufdf2\2\ufdfd"+
+ "\2\ufe72\2\ufe76\2\ufe78\2\ufefe\2\uff23\2\uff3c\2\uff43\2\uff5c\2\uff68"+
+ "\2\uffc0\2\uffc4\2\uffc9\2\uffcc\2\uffd1\2\uffd4\2\uffd9\2\uffdc\2\uffde"+
+ "\2\2\3\r\3\17\3(\3*\3<\3>\3?\3A\3O\3R\3_\3\u0082\3\u00fc\3\u0282\3\u029e"+
+ "\3\u02a2\3\u02d2\3\u0302\3\u0321\3\u032f\3\u0342\3\u0344\3\u034b\3\u0352"+
+ "\3\u0377\3\u0382\3\u039f\3\u03a2\3\u03c5\3\u03ca\3\u03d1\3\u0402\3\u049f"+
+ "\3\u04b2\3\u04d5\3\u04da\3\u04fd\3\u0502\3\u0529\3\u0532\3\u0565\3\u0602"+
+ "\3\u0738\3\u0742\3\u0757\3\u0762\3\u0769\3\u0802\3\u0807\3\u080a\3\u080a"+
+ "\3\u080c\3\u0837\3\u0839\3\u083a\3\u083e\3\u083e\3\u0841\3\u0857\3\u0862"+
+ "\3\u0878\3\u0882\3\u08a0\3\u08e2\3\u08f4\3\u08f6\3\u08f7\3\u0902\3\u0917"+
+ "\3\u0922\3\u093b\3\u0982\3\u09b9\3\u09c0\3\u09c1\3\u0a02\3\u0a02\3\u0a12"+
+ "\3\u0a15\3\u0a17\3\u0a19\3\u0a1b\3\u0a35\3\u0a62\3\u0a7e\3\u0a82\3\u0a9e"+
+ "\3\u0ac2\3\u0ac9\3\u0acb\3\u0ae6\3\u0b02\3\u0b37\3\u0b42\3\u0b57\3\u0b62"+
+ "\3\u0b74\3\u0b82\3\u0b93\3\u0c02\3\u0c4a\3\u0c82\3\u0cb4\3\u0cc2\3\u0cf4"+
+ "\3\u1005\3\u1039\3\u1085\3\u10b1\3\u10d2\3\u10ea\3\u1105\3\u1128\3\u1152"+
+ "\3\u1174\3\u1178\3\u1178\3\u1185\3\u11b4\3\u11c3\3\u11c6\3\u11dc\3\u11dc"+
+ "\3\u11de\3\u11de\3\u1202\3\u1213\3\u1215\3\u122d\3\u1282\3\u1288\3\u128a"+
+ "\3\u128a\3\u128c\3\u128f\3\u1291\3\u129f\3\u12a1\3\u12aa\3\u12b2\3\u12e0"+
+ "\3\u1307\3\u130e\3\u1311\3\u1312\3\u1315\3\u132a\3\u132c\3\u1332\3\u1334"+
+ "\3\u1335\3\u1337\3\u133b\3\u133f\3\u133f\3\u1352\3\u1352\3\u135f\3\u1363"+
+ "\3\u1402\3\u1436\3\u1449\3\u144c\3\u1482\3\u14b1\3\u14c6\3\u14c7\3\u14c9"+
+ "\3\u14c9\3\u1582\3\u15b0\3\u15da\3\u15dd\3\u1602\3\u1631\3\u1646\3\u1646"+
+ "\3\u1682\3\u16ac\3\u1702\3\u171b\3\u18a2\3\u18e1\3\u1901\3\u1901\3\u1a02"+
+ "\3\u1a02\3\u1a0d\3\u1a34\3\u1a3c\3\u1a3c\3\u1a52\3\u1a52\3\u1a5e\3\u1a85"+
+ "\3\u1a88\3\u1a8b\3\u1ac2\3\u1afa\3\u1c02\3\u1c0a\3\u1c0c\3\u1c30\3\u1c42"+
+ "\3\u1c42\3\u1c74\3\u1c91\3\u1d02\3\u1d08\3\u1d0a\3\u1d0b\3\u1d0d\3\u1d32"+
+ "\3\u1d48\3\u1d48\3\u2002\3\u239b\3\u2482\3\u2545\3\u3002\3\u3430\3\u4402"+
+ "\3\u4648\3\u6802\3\u6a3a\3\u6a42\3\u6a60\3\u6ad2\3\u6aef\3\u6b02\3\u6b31"+
+ "\3\u6b42\3\u6b45\3\u6b65\3\u6b79\3\u6b7f\3\u6b91\3\u6f02\3\u6f46\3\u6f52"+
+ "\3\u6f52\3\u6f95\3\u6fa1\3\u6fe2\3\u6fe3\3\u7002\3\u87ee\3\u8802\3\u8af4"+
+ "\3\ub002\3\ub120\3\ub172\3\ub2fd\3\ubc02\3\ubc6c\3\ubc72\3\ubc7e\3\ubc82"+
+ "\3\ubc8a\3\ubc92\3\ubc9b\3\ud402\3\ud456\3\ud458\3\ud49e\3\ud4a0\3\ud4a1"+
+ "\3\ud4a4\3\ud4a4\3\ud4a7\3\ud4a8\3\ud4ab\3\ud4ae\3\ud4b0\3\ud4bb\3\ud4bd"+
+ "\3\ud4bd\3\ud4bf\3\ud4c5\3\ud4c7\3\ud507\3\ud509\3\ud50c\3\ud50f\3\ud516"+
+ "\3\ud518\3\ud51e\3\ud520\3\ud53b\3\ud53d\3\ud540\3\ud542\3\ud546\3\ud548"+
+ "\3\ud548\3\ud54c\3\ud552\3\ud554\3\ud6a7\3\ud6aa\3\ud6c2\3\ud6c4\3\ud6dc"+
+ "\3\ud6de\3\ud6fc\3\ud6fe\3\ud716\3\ud718\3\ud736\3\ud738\3\ud750\3\ud752"+
+ "\3\ud770\3\ud772\3\ud78a\3\ud78c\3\ud7aa\3\ud7ac\3\ud7c4\3\ud7c6\3\ud7cd"+
+ "\3\ue802\3\ue8c6\3\ue902\3\ue945\3\uee02\3\uee05\3\uee07\3\uee21\3\uee23"+
+ "\3\uee24\3\uee26\3\uee26\3\uee29\3\uee29\3\uee2b\3\uee34\3\uee36\3\uee39"+
+ "\3\uee3b\3\uee3b\3\uee3d\3\uee3d\3\uee44\3\uee44\3\uee49\3\uee49\3\uee4b"+
+ "\3\uee4b\3\uee4d\3\uee4d\3\uee4f\3\uee51\3\uee53\3\uee54\3\uee56\3\uee56"+
+ "\3\uee59\3\uee59\3\uee5b\3\uee5b\3\uee5d\3\uee5d\3\uee5f\3\uee5f\3\uee61"+
+ "\3\uee61\3\uee63\3\uee64\3\uee66\3\uee66\3\uee69\3\uee6c\3\uee6e\3\uee74"+
+ "\3\uee76\3\uee79\3\uee7b\3\uee7e\3\uee80\3\uee80\3\uee82\3\uee8b\3\uee8d"+
+ "\3\uee9d\3\ueea3\3\ueea5\3\ueea7\3\ueeab\3\ueead\3\ueebd\3\2\4\ua6d8\4"+
+ "\ua702\4\ub736\4\ub742\4\ub81f\4\ub822\4\ucea3\4\uceb2\4\uebe2\4\uf802"+
+ "\4\ufa1f\4\u05ee\2\4\3\2\2\2\2\6\3\2\2\2\2\b\3\2\2\2\2\n\3\2\2\2\2\f\3"+
+ "\2\2\2\2\16\3\2\2\2\2\20\3\2\2\2\2\22\3\2\2\2\2\24\3\2\2\2\2\26\3\2\2"+
+ "\2\2\30\3\2\2\2\2\32\3\2\2\2\2\34\3\2\2\2\2\36\3\2\2\2\2 \3\2\2\2\2\""+
+ "\3\2\2\2\2$\3\2\2\2\2&\3\2\2\2\2(\3\2\2\2\2*\3\2\2\2\2,\3\2\2\2\2.\3\2"+
+ "\2\2\2\60\3\2\2\2\2\62\3\2\2\2\2\64\3\2\2\2\2\66\3\2\2\2\28\3\2\2\2\2"+
+ ":\3\2\2\2\2<\3\2\2\2\2>\3\2\2\2\2@\3\2\2\2\2B\3\2\2\2\2D\3\2\2\2\2F\3"+
+ "\2\2\2\2H\3\2\2\2\2J\3\2\2\2\2L\3\2\2\2\2N\3\2\2\2\2P\3\2\2\2\2R\3\2\2"+
+ "\2\2T\3\2\2\2\2V\3\2\2\2\2X\3\2\2\2\2Z\3\2\2\2\2\\\3\2\2\2\2^\3\2\2\2"+
+ "\2`\3\2\2\2\2b\3\2\2\2\2d\3\2\2\2\2f\3\2\2\2\2h\3\2\2\2\2j\3\2\2\2\2l"+
+ "\3\2\2\2\2n\3\2\2\2\2p\3\2\2\2\2r\3\2\2\2\2t\3\2\2\2\2v\3\2\2\2\2x\3\2"+
+ "\2\2\2z\3\2\2\2\2|\3\2\2\2\2~\3\2\2\2\2\u0080\3\2\2\2\2\u0082\3\2\2\2"+
+ "\2\u0084\3\2\2\2\2\u0086\3\2\2\2\2\u0088\3\2\2\2\2\u008a\3\2\2\2\2\u008c"+
+ "\3\2\2\2\2\u008e\3\2\2\2\2\u0090\3\2\2\2\2\u0092\3\2\2\2\2\u0094\3\2\2"+
+ "\2\2\u0096\3\2\2\2\2\u0098\3\2\2\2\2\u009a\3\2\2\2\2\u009c\3\2\2\2\2\u009e"+
+ "\3\2\2\2\2\u00a0\3\2\2\2\2\u00a2\3\2\2\2\2\u00a4\3\2\2\2\2\u00a6\3\2\2"+
+ "\2\2\u00a8\3\2\2\2\2\u00aa\3\2\2\2\2\u00ac\3\2\2\2\2\u00ae\3\2\2\2\2\u00b0"+
+ "\3\2\2\2\2\u00b2\3\2\2\2\2\u00b4\3\2\2\2\2\u00b6\3\2\2\2\2\u00b8\3\2\2"+
+ "\2\2\u00ba\3\2\2\2\2\u00bc\3\2\2\2\2\u00be\3\2\2\2\2\u00c0\3\2\2\2\2\u00c2"+
+ "\3\2\2\2\2\u00c4\3\2\2\2\2\u00c6\3\2\2\2\2\u00c8\3\2\2\2\2\u00ca\3\2\2"+
+ "\2\2\u00cc\3\2\2\2\2\u00ce\3\2\2\2\2\u00d0\3\2\2\2\2\u00d2\3\2\2\2\2\u00d4"+
+ "\3\2\2\2\2\u00d6\3\2\2\2\2\u00d8\3\2\2\2\2\u00da\3\2\2\2\2\u00dc\3\2\2"+
+ "\2\2\u00de\3\2\2\2\2\u00e0\3\2\2\2\2\u00e2\3\2\2\2\2\u00e4\3\2\2\2\2\u00e6"+
+ "\3\2\2\2\2\u00e8\3\2\2\2\2\u00ea\3\2\2\2\2\u00ec\3\2\2\2\2\u00ee\3\2\2"+
+ "\2\2\u00f0\3\2\2\2\2\u00f2\3\2\2\2\2\u00f4\3\2\2\2\2\u00f6\3\2\2\2\2\u00f8"+
+ "\3\2\2\2\2\u00fa\3\2\2\2\2\u00fc\3\2\2\2\2\u00fe\3\2\2\2\2\u0100\3\2\2"+
+ "\2\2\u0102\3\2\2\2\2\u0104\3\2\2\2\2\u0106\3\2\2\2\2\u0108\3\2\2\2\2\u010a"+
+ "\3\2\2\2\2\u010c\3\2\2\2\2\u010e\3\2\2\2\2\u0110\3\2\2\2\2\u0112\3\2\2"+
+ "\2\2\u0114\3\2\2\2\2\u0116\3\2\2\2\2\u0118\3\2\2\2\2\u011e\3\2\2\2\2\u0122"+
+ "\3\2\2\2\2\u0124\3\2\2\2\2\u0126\3\2\2\2\2\u0128\3\2\2\2\2\u012a\3\2\2"+
+ "\2\2\u012c\3\2\2\2\2\u012e\3\2\2\2\2\u0130\3\2\2\2\2\u0132\3\2\2\2\2\u0134"+
+ "\3\2\2\2\2\u0136\3\2\2\2\2\u0138\3\2\2\2\3\u014e\3\2\2\2\3\u0150\3\2\2"+
+ "\2\3\u0152\3\2\2\2\3\u0154\3\2\2\2\3\u0156\3\2\2\2\4\u015a\3\2\2\2\6\u0170"+
+ "\3\2\2\2\b\u0172\3\2\2\2\n\u0179\3\2\2\2\f\u0181\3\2\2\2\16\u0188\3\2"+
+ "\2\2\20\u018f\3\2\2\2\22\u0196\3\2\2\2\24\u019d\3\2\2\2\26\u01a6\3\2\2"+
+ "\2\30\u01b0\3\2\2\2\32\u01b8\3\2\2\2\34\u01c2\3\2\2\2\36\u01ce\3\2\2\2"+
+ " \u01d5\3\2\2\2\"\u01e0\3\2\2\2$\u01e3\3\2\2\2&\u01e9\3\2\2\2(\u01f2\3"+
+ "\2\2\2*\u01f7\3\2\2\2,\u01fe\3\2\2\2.\u0205\3\2\2\2\60\u020b\3\2\2\2\62"+
+ "\u0210\3\2\2\2\64\u0217\3\2\2\2\66\u0221\3\2\2\28\u0227\3\2\2\2:\u022a"+
+ "\3\2\2\2<\u022c\3\2\2\2>\u0233\3\2\2\2@\u0239\3\2\2\2B\u0246\3\2\2\2D"+
+ "\u024f\3\2\2\2F\u0253\3\2\2\2H\u0257\3\2\2\2J\u025d\3\2\2\2L\u025f\3\2"+
+ "\2\2N\u0262\3\2\2\2P\u0267\3\2\2\2R\u026d\3\2\2\2T\u0273\3\2\2\2V\u027a"+
+ "\3\2\2\2X\u0281\3\2\2\2Z\u028a\3\2\2\2\\\u0290\3\2\2\2^\u0296\3\2\2\2"+
+ "`\u029d\3\2\2\2b\u02a3\3\2\2\2d\u02aa\3\2\2\2f\u02b0\3\2\2\2h\u02b9\3"+
+ "\2\2\2j\u02c1\3\2\2\2l\u02c8\3\2\2\2n\u02cd\3\2\2\2p\u02d6\3\2\2\2r\u02e5"+
+ "\3\2\2\2t\u02eb\3\2\2\2v\u02ef\3\2\2\2x\u02f2\3\2\2\2z\u02f9\3\2\2\2|"+
+ "\u0303\3\2\2\2~\u030d\3\2\2\2\u0080\u0319\3\2\2\2\u0082\u0322\3\2\2\2"+
+ "\u0084\u032c\3\2\2\2\u0086\u0334\3\2\2\2\u0088\u0340\3\2\2\2\u008a\u034f"+
+ "\3\2\2\2\u008c\u0355\3\2\2\2\u008e\u0359\3\2\2\2\u0090\u035d\3\2\2\2\u0092"+
+ "\u0362\3\2\2\2\u0094\u036a\3\2\2\2\u0096\u0372\3\2\2\2\u0098\u0377\3\2"+
+ "\2\2\u009a\u0381\3\2\2\2\u009c\u0388\3\2\2\2\u009e\u038d\3\2\2\2\u00a0"+
+ "\u0393\3\2\2\2\u00a2\u0396\3\2\2\2\u00a4\u039a\3\2\2\2\u00a6\u03a1\3\2"+
+ "\2\2\u00a8\u03a6\3\2\2\2\u00aa\u03ab\3\2\2\2\u00ac\u03b0\3\2\2\2\u00ae"+
+ "\u03b8\3\2\2\2\u00b0\u03bf\3\2\2\2\u00b2\u03c5\3\2\2\2\u00b4\u03d3\3\2"+
+ "\2\2\u00b6\u03d6\3\2\2\2\u00b8\u03dc\3\2\2\2\u00ba\u03e1\3\2\2\2\u00bc"+
+ "\u03ec\3\2\2\2\u00be\u03f0\3\2\2\2\u00c0\u03f7\3\2\2\2\u00c2\u0400\3\2"+
+ "\2\2\u00c4\u0404\3\2\2\2\u00c6\u040a\3\2\2\2\u00c8\u0414\3\2\2\2\u00ca"+
+ "\u0416\3\2\2\2\u00cc\u041a\3\2\2\2\u00ce\u041c\3\2\2\2\u00d0\u0420\3\2"+
+ "\2\2\u00d2\u0422\3\2\2\2\u00d4\u0426\3\2\2\2\u00d6\u0428\3\2\2\2\u00d8"+
+ "\u042a\3\2\2\2\u00da\u042c\3\2\2\2\u00dc\u042e\3\2\2\2\u00de\u0430\3\2"+
+ "\2\2\u00e0\u0435\3\2\2\2\u00e2\u043a\3\2\2\2\u00e4\u043d\3\2\2\2\u00e6"+
+ "\u0441\3\2\2\2\u00e8\u0444\3\2\2\2\u00ea\u0447\3\2\2\2\u00ec\u044a\3\2"+
+ "\2\2\u00ee\u044d\3\2\2\2\u00f0\u044f\3\2\2\2\u00f2\u0452\3\2\2\2\u00f4"+
+ "\u0454\3\2\2\2\u00f6\u0457\3\2\2\2\u00f8\u0459\3\2\2\2\u00fa\u045b\3\2"+
+ "\2\2\u00fc\u045d\3\2\2\2\u00fe\u0460\3\2\2\2\u0100\u0463\3\2\2\2\u0102"+
+ "\u0466\3\2\2\2\u0104\u0468\3\2\2\2\u0106\u046a\3\2\2\2\u0108\u046c\3\2"+
+ "\2\2\u010a\u046e\3\2\2\2\u010c\u0470\3\2\2\2\u010e\u0472\3\2\2\2\u0110"+
+ "\u0480\3\2\2\2\u0112\u0484\3\2\2\2\u0114\u0490\3\2\2\2\u0116\u049e\3\2"+
+ "\2\2\u0118\u04aa\3\2\2\2\u011a\u04ce\3\2\2\2\u011c\u04d0\3\2\2\2\u011e"+
+ "\u04d9\3\2\2\2\u0120\u04df\3\2\2\2\u0122\u04e6\3\2\2\2\u0124\u04ec\3\2"+
+ "\2\2\u0126\u04ee\3\2\2\2\u0128\u04f3\3\2\2\2\u012a\u04f8\3\2\2\2\u012c"+
+ "\u04ff\3\2\2\2\u012e\u050a\3\2\2\2\u0130\u0515\3\2\2\2\u0132\u0522\3\2"+
+ "\2\2\u0134\u0528\3\2\2\2\u0136\u0537\3\2\2\2\u0138\u053d\3\2\2\2\u013a"+
+ "\u054c\3\2\2\2\u013c\u054e\3\2\2\2\u013e\u056a\3\2\2\2\u0140\u0574\3\2"+
+ "\2\2\u0142\u0576\3\2\2\2\u0144\u0578\3\2\2\2\u0146\u057a\3\2\2\2\u0148"+
+ "\u0582\3\2\2\2\u014a\u0584\3\2\2\2\u014c\u0586\3\2\2\2\u014e\u0589\3\2"+
+ "\2\2\u0150\u058f\3\2\2\2\u0152\u059d\3\2\2\2\u0154\u05ba\3\2\2\2\u0156"+
+ "\u05be\3\2\2\2\u0158\u015b\5\6\3\2\u0159\u015b\5\u0118\u008c\2\u015a\u0158"+
+ "\3\2\2\2\u015a\u0159\3\2\2\2\u015b\u015c\3\2\2\2\u015c\u015d\b\2\2\2\u015d"+
+ "\5\3\2\2\2\u015e\u0168\5\u013e\u009f\2\u015f\u0160\7\60\2\2\u0160\u0162"+
+ "\6\3\2\2\u0161\u0163\5\u013e\u009f\2\u0162\u0161\3\2\2\2\u0162\u0163\3"+
+ "\2\2\2\u0163\u0165\3\2\2\2\u0164\u0166\5\u0146\u00a3\2\u0165\u0164\3\2"+
+ "\2\2\u0165\u0166\3\2\2\2\u0166\u0169\3\2\2\2\u0167\u0169\5\u0146\u00a3"+
+ "\2\u0168\u015f\3\2\2\2\u0168\u0167\3\2\2\2\u0169\u0171\3\2\2\2\u016a\u016b"+
+ "\7\60\2\2\u016b\u016c\6\3\3\2\u016c\u016e\5\u013e\u009f\2\u016d\u016f"+
+ "\5\u0146\u00a3\2\u016e\u016d\3\2\2\2\u016e\u016f\3\2\2\2\u016f\u0171\3"+
+ "\2\2\2\u0170\u015e\3\2\2\2\u0170\u016a\3\2\2\2\u0171\7\3\2\2\2\u0172\u0173"+
+ "\7v\2\2\u0173\u0174\7t\2\2\u0174\u0175\7w\2\2\u0175\u0176\7g\2\2\u0176"+
+ "\u0177\3\2\2\2\u0177\u0178\b\4\2\2\u0178\t\3\2\2\2\u0179\u017a\7h\2\2"+
+ "\u017a\u017b\7c\2\2\u017b\u017c\7n\2\2\u017c\u017d\7u\2\2\u017d\u017e"+
+ "\7g\2\2\u017e\u017f\3\2\2\2\u017f\u0180\b\5\2\2\u0180\13\3\2\2\2\u0181"+
+ "\u0182\7c\2\2\u0182\u0183\7u\2\2\u0183\u0184\7u\2\2\u0184\u0185\7g\2\2"+
+ "\u0185\u0186\7t\2\2\u0186\u0187\7v\2\2\u0187\r\3\2\2\2\u0188\u0189\7c"+
+ "\2\2\u0189\u018a\7u\2\2\u018a\u018b\7u\2\2\u018b\u018c\7w\2\2\u018c\u018d"+
+ "\7o\2\2\u018d\u018e\7g\2\2\u018e\17\3\2\2\2\u018f\u0190\7k\2\2\u0190\u0191"+
+ "\7p\2\2\u0191\u0192\7j\2\2\u0192\u0193\7c\2\2\u0193\u0194\7n\2\2\u0194"+
+ "\u0195\7g\2\2\u0195\21\3\2\2\2\u0196\u0197\7g\2\2\u0197\u0198\7z\2\2\u0198"+
+ "\u0199\7j\2\2\u0199\u019a\7c\2\2\u019a\u019b\7n\2\2\u019b\u019c\7g\2\2"+
+ "\u019c\23\3\2\2\2\u019d\u019e\7t\2\2\u019e\u019f\7g\2\2\u019f\u01a0\7"+
+ "s\2\2\u01a0\u01a1\7w\2\2\u01a1\u01a2\7k\2\2\u01a2\u01a3\7t\2\2\u01a3\u01a4"+
+ "\7g\2\2\u01a4\u01a5\7u\2\2\u01a5\25\3\2\2\2\u01a6\u01a7\7r\2\2\u01a7\u01a8"+
+ "\7t\2\2\u01a8\u01a9\7g\2\2\u01a9\u01aa\7u\2\2\u01aa\u01ab\7g\2\2\u01ab"+
+ "\u01ac\7t\2\2\u01ac\u01ad\7x\2\2\u01ad\u01ae\7g\2\2\u01ae\u01af\7u\2\2"+
+ "\u01af\27\3\2\2\2\u01b0\u01b1\7g\2\2\u01b1\u01b2\7p\2\2\u01b2\u01b3\7"+
+ "u\2\2\u01b3\u01b4\7w\2\2\u01b4\u01b5\7t\2\2\u01b5\u01b6\7g\2\2\u01b6\u01b7"+
+ "\7u\2\2\u01b7\31\3\2\2\2\u01b8\u01b9\7k\2\2\u01b9\u01ba\7p\2\2\u01ba\u01bb"+
+ "\7x\2\2\u01bb\u01bc\7c\2\2\u01bc\u01bd\7t\2\2\u01bd\u01be\7k\2\2\u01be"+
+ "\u01bf\7c\2\2\u01bf\u01c0\7p\2\2\u01c0\u01c1\7v\2\2\u01c1\33\3\2\2\2\u01c2"+
+ "\u01c3\7f\2\2\u01c3\u01c4\7g\2\2\u01c4\u01c5\7e\2\2\u01c5\u01c6\7t\2\2"+
+ "\u01c6\u01c7\7g\2\2\u01c7\u01c8\7c\2\2\u01c8\u01c9\7u\2\2\u01c9\u01ca"+
+ "\7g\2\2\u01ca\u01cb\7u\2\2\u01cb\u01cc\3\2\2\2\u01cc\u01cd\b\16\2\2\u01cd"+
+ "\35\3\2\2\2\u01ce\u01cf\7r\2\2\u01cf\u01d0\7w\2\2\u01d0\u01d1\7t\2\2\u01d1"+
+ "\u01d2\7g\2\2\u01d2\u01d3\3\2\2\2\u01d3\u01d4\b\17\2\2\u01d4\37\3\2\2"+
+ "\2\u01d5\u01d6\7k\2\2\u01d6\u01d7\7o\2\2\u01d7\u01d8\7r\2\2\u01d8\u01d9"+
+ "\7n\2\2\u01d9\u01da\7g\2\2\u01da\u01db\7o\2\2\u01db\u01dc\7g\2\2\u01dc"+
+ "\u01dd\7p\2\2\u01dd\u01de\7v\2\2\u01de\u01df\7u\2\2\u01df!\3\2\2\2\u01e0"+
+ "\u01e1\7c\2\2\u01e1\u01e2\7u\2\2\u01e2#\3\2\2\2\u01e3\u01e4\7q\2\2\u01e4"+
+ "\u01e5\7n\2\2\u01e5\u01e6\7f\2\2\u01e6\u01e7\3\2\2\2\u01e7\u01e8\b\22"+
+ "\2\2\u01e8%\3\2\2\2\u01e9\u01ea\7d\2\2\u01ea\u01eb\7g\2\2\u01eb\u01ec"+
+ "\7h\2\2\u01ec\u01ed\7q\2\2\u01ed\u01ee\7t\2\2\u01ee\u01ef\7g\2\2\u01ef"+
+ "\u01f0\3\2\2\2\u01f0\u01f1\b\23\2\2\u01f1\'\3\2\2\2\u01f2\u01f3\7%\2\2"+
+ "\u01f3\u01f4\7n\2\2\u01f4\u01f5\7j\2\2\u01f5\u01f6\7u\2\2\u01f6)\3\2\2"+
+ "\2\u01f7\u01f8\7h\2\2\u01f8\u01f9\7q\2\2\u01f9\u01fa\7t\2\2\u01fa\u01fb"+
+ "\7c\2\2\u01fb\u01fc\7n\2\2\u01fc\u01fd\7n\2\2\u01fd+\3\2\2\2\u01fe\u01ff"+
+ "\7g\2\2\u01ff\u0200\7z\2\2\u0200\u0201\7k\2\2\u0201\u0202\7u\2\2\u0202"+
+ "\u0203\7v\2\2\u0203\u0204\7u\2\2\u0204-\3\2\2\2\u0205\u0206\7c\2\2\u0206"+
+ "\u0207\7e\2\2\u0207\u0208\7e\2\2\u0208\u0209\3\2\2\2\u0209\u020a\b\27"+
+ "\2\2\u020a/\3\2\2\2\u020b\u020c\7h\2\2\u020c\u020d\7q\2\2\u020d\u020e"+
+ "\7n\2\2\u020e\u020f\7f\2\2\u020f\61\3\2\2\2\u0210\u0211\7w\2\2\u0211\u0212"+
+ "\7p\2\2\u0212\u0213\7h\2\2\u0213\u0214\7q\2\2\u0214\u0215\7n\2\2\u0215"+
+ "\u0216\7f\2\2\u0216\63\3\2\2\2\u0217\u0218\7w\2\2\u0218\u0219\7p\2\2\u0219"+
+ "\u021a\7h\2\2\u021a\u021b\7q\2\2\u021b\u021c\7n\2\2\u021c\u021d\7f\2\2"+
+ "\u021d\u021e\7k\2\2\u021e\u021f\7p\2\2\u021f\u0220\7i\2\2\u0220\65\3\2"+
+ "\2\2\u0221\u0222\7i\2\2\u0222\u0223\7j\2\2\u0223\u0224\7q\2\2\u0224\u0225"+
+ "\7u\2\2\u0225\u0226\7v\2\2\u0226\67\3\2\2\2\u0227\u0228\7k\2\2\u0228\u0229"+
+ "\7p\2\2\u02299\3\2\2\2\u022a\u022b\7%\2\2\u022b;\3\2\2\2\u022c\u022d\7"+
+ "u\2\2\u022d\u022e\7w\2\2\u022e\u022f\7d\2\2\u022f\u0230\7u\2\2\u0230\u0231"+
+ "\7g\2\2\u0231\u0232\7v\2\2\u0232=\3\2\2\2\u0233\u0234\7w\2\2\u0234\u0235"+
+ "\7p\2\2\u0235\u0236\7k\2\2\u0236\u0237\7q\2\2\u0237\u0238\7p\2\2\u0238"+
+ "?\3\2\2\2\u0239\u023a\7k\2\2\u023a\u023b\7p\2\2\u023b\u023c\7v\2\2\u023c"+
+ "\u023d\7g\2\2\u023d\u023e\7t\2\2\u023e\u023f\7u\2\2\u023f\u0240\7g\2\2"+
+ "\u0240\u0241\7e\2\2\u0241\u0242\7v\2\2\u0242\u0243\7k\2\2\u0243\u0244"+
+ "\7q\2\2\u0244\u0245\7p\2\2\u0245A\3\2\2\2\u0246\u0247\7u\2\2\u0247\u0248"+
+ "\7g\2\2\u0248\u0249\7v\2\2\u0249\u024a\7o\2\2\u024a\u024b\7k\2\2\u024b"+
+ "\u024c\7p\2\2\u024c\u024d\7w\2\2\u024d\u024e\7u\2\2\u024eC\3\2\2\2\u024f"+
+ "\u0250\7?\2\2\u0250\u0251\7?\2\2\u0251\u0252\7@\2\2\u0252E\3\2\2\2\u0253"+
+ "\u0254\7/\2\2\u0254\u0255\7/\2\2\u0255\u0256\7,\2\2\u0256G\3\2\2\2\u0257"+
+ "\u0258\7c\2\2\u0258\u0259\7r\2\2\u0259\u025a\7r\2\2\u025a\u025b\7n\2\2"+
+ "\u025b\u025c\7{\2\2\u025cI\3\2\2\2\u025d\u025e\7A\2\2\u025eK\3\2\2\2\u025f"+
+ "\u0260\7#\2\2\u0260\u0261\7>\2\2\u0261M\3\2\2\2\u0262\u0263\7#\2\2\u0263"+
+ "\u0264\7@\2\2\u0264\u0265\3\2\2\2\u0265\u0266\b\'\2\2\u0266O\3\2\2\2\u0267"+
+ "\u0268\7u\2\2\u0268\u0269\7g\2\2\u0269\u026a\7s\2\2\u026a\u026b\3\2\2"+
+ "\2\u026b\u026c\b(\2\2\u026cQ\3\2\2\2\u026d\u026e\7u\2\2\u026e\u026f\7"+
+ "g\2\2\u026f\u0270\7v\2\2\u0270\u0271\3\2\2\2\u0271\u0272\b)\2\2\u0272"+
+ "S\3\2\2\2\u0273\u0274\7o\2\2\u0274\u0275\7u\2\2\u0275\u0276\7g\2\2\u0276"+
+ "\u0277\7v\2\2\u0277\u0278\3\2\2\2\u0278\u0279\b*\2\2\u0279U\3\2\2\2\u027a"+
+ "\u027b\7f\2\2\u027b\u027c\7k\2\2\u027c\u027d\7e\2\2\u027d\u027e\7v\2\2"+
+ "\u027e\u027f\3\2\2\2\u027f\u0280\b+\2\2\u0280W\3\2\2\2\u0281\u0282\7q"+
+ "\2\2\u0282\u0283\7r\2\2\u0283\u0284\7v\2\2\u0284\u0285\7k\2\2\u0285\u0286"+
+ "\7q\2\2\u0286\u0287\7p\2\2\u0287\u0288\3\2\2\2\u0288\u0289\b,\2\2\u0289"+
+ "Y\3\2\2\2\u028a\u028b\7n\2\2\u028b\u028c\7g\2\2\u028c\u028d\7p\2\2\u028d"+
+ "\u028e\3\2\2\2\u028e\u028f\b-\2\2\u028f[\3\2\2\2\u0290\u0291\7p\2\2\u0291"+
+ "\u0292\7g\2\2\u0292\u0293\7y\2\2\u0293\u0294\3\2\2\2\u0294\u0295\b.\2"+
+ "\2\u0295]\3\2\2\2\u0296\u0297\7o\2\2\u0297\u0298\7c\2\2\u0298\u0299\7"+
+ "m\2\2\u0299\u029a\7g\2\2\u029a\u029b\3\2\2\2\u029b\u029c\b/\2\2\u029c"+
+ "_\3\2\2\2\u029d\u029e\7e\2\2\u029e\u029f\7c\2\2\u029f\u02a0\7r\2\2\u02a0"+
+ "\u02a1\3\2\2\2\u02a1\u02a2\b\60\2\2\u02a2a\3\2\2\2\u02a3\u02a4\7u\2\2"+
+ "\u02a4\u02a5\7q\2\2\u02a5\u02a6\7o\2\2\u02a6\u02a7\7g\2\2\u02a7\u02a8"+
+ "\3\2\2\2\u02a8\u02a9\b\61\2\2\u02a9c\3\2\2\2\u02aa\u02ab\7i\2\2\u02ab"+
+ "\u02ac\7g\2\2\u02ac\u02ad\7v\2\2\u02ad\u02ae\3\2\2\2\u02ae\u02af\b\62"+
+ "\2\2\u02afe\3\2\2\2\u02b0\u02b1\7f\2\2\u02b1\u02b2\7q\2\2\u02b2\u02b3"+
+ "\7o\2\2\u02b3\u02b4\7c\2\2\u02b4\u02b5\7k\2\2\u02b5\u02b6\7p\2\2\u02b6"+
+ "\u02b7\3\2\2\2\u02b7\u02b8\b\63\2\2\u02b8g\3\2\2\2\u02b9\u02ba\7c\2\2"+
+ "\u02ba\u02bb\7z\2\2\u02bb\u02bc\7k\2\2\u02bc\u02bd\7q\2\2\u02bd\u02be"+
+ "\7o\2\2\u02be\u02bf\3\2\2\2\u02bf\u02c0\b\64\2\2\u02c0i\3\2\2\2\u02c1"+
+ "\u02c2\7p\2\2\u02c2\u02c3\7q\2\2\u02c3\u02c4\7p\2\2\u02c4\u02c5\7g\2\2"+
+ "\u02c5\u02c6\3\2\2\2\u02c6\u02c7\b\65\2\2\u02c7k\3\2\2\2\u02c8\u02c9\7"+
+ "r\2\2\u02c9\u02ca\7t\2\2\u02ca\u02cb\7g\2\2\u02cb\u02cc\7f\2\2\u02ccm"+
+ "\3\2\2\2\u02cd\u02ce\7v\2\2\u02ce\u02cf\7{\2\2\u02cf\u02d0\7r\2\2\u02d0"+
+ "\u02d1\7g\2\2\u02d1\u02d2\7Q\2\2\u02d2\u02d3\7h\2\2\u02d3\u02d4\3\2\2"+
+ "\2\u02d4\u02d5\b\67\2\2\u02d5o\3\2\2\2\u02d6\u02d7\7k\2\2\u02d7\u02d8"+
+ "\7u\2\2\u02d8\u02d9\7E\2\2\u02d9\u02da\7q\2\2\u02da\u02db\7o\2\2\u02db"+
+ "\u02dc\7r\2\2\u02dc\u02dd\7c\2\2\u02dd\u02de\7t\2\2\u02de\u02df\7c\2\2"+
+ "\u02df\u02e0\7d\2\2\u02e0\u02e1\7n\2\2\u02e1\u02e2\7g\2\2\u02e2\u02e3"+
+ "\3\2\2\2\u02e3\u02e4\b8\2\2\u02e4q\3\2\2\2\u02e5\u02e6\7u\2\2\u02e6\u02e7"+
+ "\7j\2\2\u02e7\u02e8\7c\2\2\u02e8\u02e9\7t\2\2\u02e9\u02ea\7g\2\2\u02ea"+
+ "s\3\2\2\2\u02eb\u02ec\7B\2\2\u02ec\u02ed\3\2\2\2\u02ed\u02ee\b:\2\2\u02ee"+
+ "u\3\2\2\2\u02ef\u02f0\7\60\2\2\u02f0\u02f1\7\60\2\2\u02f1w\3\2\2\2\u02f2"+
+ "\u02f3\7u\2\2\u02f3\u02f4\7j\2\2\u02f4\u02f5\7c\2\2\u02f5\u02f6\7t\2\2"+
+ "\u02f6\u02f7\7g\2\2\u02f7\u02f8\7f\2\2\u02f8y\3\2\2\2\u02f9\u02fa\7g\2"+
+ "\2\u02fa\u02fb\7z\2\2\u02fb\u02fc\7e\2\2\u02fc\u02fd\7n\2\2\u02fd\u02fe"+
+ "\7w\2\2\u02fe\u02ff\7u\2\2\u02ff\u0300\7k\2\2\u0300\u0301\7x\2\2\u0301"+
+ "\u0302\7g\2\2\u0302{\3\2\2\2\u0303\u0304\7r\2\2\u0304\u0305\7t\2\2\u0305"+
+ "\u0306\7g\2\2\u0306\u0307\7f\2\2\u0307\u0308\7k\2\2\u0308\u0309\7e\2\2"+
+ "\u0309\u030a\7c\2\2\u030a\u030b\7v\2\2\u030b\u030c\7g\2\2\u030c}\3\2\2"+
+ "\2\u030d\u030e\7y\2\2\u030e\u030f\7t\2\2\u030f\u0310\7k\2\2\u0310\u0311"+
+ "\7v\2\2\u0311\u0312\7g\2\2\u0312\u0313\7R\2\2\u0313\u0314\7g\2\2\u0314"+
+ "\u0315\7t\2\2\u0315\u0316\7o\2\2\u0316\u0317\3\2\2\2\u0317\u0318\b?\2"+
+ "\2\u0318\177\3\2\2\2\u0319\u031a\7p\2\2\u031a\u031b\7q\2\2\u031b\u031c"+
+ "\7R\2\2\u031c\u031d\7g\2\2\u031d\u031e\7t\2\2\u031e\u031f\7o\2\2\u031f"+
+ "\u0320\3\2\2\2\u0320\u0321\b@\2\2\u0321\u0081\3\2\2\2\u0322\u0323\7v\2"+
+ "\2\u0323\u0324\7t\2\2\u0324\u0325\7w\2\2\u0325\u0326\7u\2\2\u0326\u0327"+
+ "\7v\2\2\u0327\u0328\7g\2\2\u0328\u0329\7f\2\2\u0329\u032a\3\2\2\2\u032a"+
+ "\u032b\bA\2\2\u032b\u0083\3\2\2\2\u032c\u032d\7q\2\2\u032d\u032e\7w\2"+
+ "\2\u032e\u032f\7v\2\2\u032f\u0330\7n\2\2\u0330\u0331\7k\2\2\u0331\u0332"+
+ "\7p\2\2\u0332\u0333\7g\2\2\u0333\u0085\3\2\2\2\u0334\u0335\7k\2\2\u0335"+
+ "\u0336\7p\2\2\u0336\u0337\7k\2\2\u0337\u0338\7v\2\2\u0338\u0339\7G\2\2"+
+ "\u0339\u033a\7p\2\2\u033a\u033b\7u\2\2\u033b\u033c\7w\2\2\u033c\u033d"+
+ "\7t\2\2\u033d\u033e\7g\2\2\u033e\u033f\7u\2\2\u033f\u0087\3\2\2\2\u0340"+
+ "\u0341\7k\2\2\u0341\u0342\7o\2\2\u0342\u0343\7r\2\2\u0343\u0344\7q\2\2"+
+ "\u0344\u0345\7t\2\2\u0345\u0346\7v\2\2\u0346\u0347\7T\2\2\u0347\u0348"+
+ "\7g\2\2\u0348\u0349\7s\2\2\u0349\u034a\7w\2\2\u034a\u034b\7k\2\2\u034b"+
+ "\u034c\7t\2\2\u034c\u034d\7g\2\2\u034d\u034e\7u\2\2\u034e\u0089\3\2\2"+
+ "\2\u034f\u0350\7r\2\2\u0350\u0351\7t\2\2\u0351\u0352\7q\2\2\u0352\u0353"+
+ "\7q\2\2\u0353\u0354\7h\2\2\u0354\u008b\3\2\2\2\u0355\u0356\7?\2\2\u0356"+
+ "\u0357\7?\2\2\u0357\u0358\7?\2\2\u0358\u008d\3\2\2\2\u0359\u035a\7#\2"+
+ "\2\u035a\u035b\7?\2\2\u035b\u035c\7?\2\2\u035c\u008f\3\2\2\2\u035d\u035e"+
+ "\7y\2\2\u035e\u035f\7k\2\2\u035f\u0360\7v\2\2\u0360\u0361\7j\2\2\u0361"+
+ "\u0091\3\2\2\2\u0362\u0363\7d\2\2\u0363\u0364\7t\2\2\u0364\u0365\7g\2"+
+ "\2\u0365\u0366\7c\2\2\u0366\u0367\7m\2\2\u0367\u0368\3\2\2\2\u0368\u0369"+
+ "\bI\2\2\u0369\u0093\3\2\2\2\u036a\u036b\7f\2\2\u036b\u036c\7g\2\2\u036c"+
+ "\u036d\7h\2\2\u036d\u036e\7c\2\2\u036e\u036f\7w\2\2\u036f\u0370\7n\2\2"+
+ "\u0370\u0371\7v\2\2\u0371\u0095\3\2\2\2\u0372\u0373\7h\2\2\u0373\u0374"+
+ "\7w\2\2\u0374\u0375\7p\2\2\u0375\u0376\7e\2\2\u0376\u0097\3\2\2\2\u0377"+
+ "\u0378\7k\2\2\u0378\u0379\7p\2\2\u0379\u037a\7v\2\2\u037a\u037b\7g\2\2"+
+ "\u037b\u037c\7t\2\2\u037c\u037d\7h\2\2\u037d\u037e\7c\2\2\u037e\u037f"+
+ "\7e\2\2\u037f\u0380\7g\2\2\u0380\u0099\3\2\2\2\u0381\u0382\7u\2\2\u0382"+
+ "\u0383\7g\2\2\u0383\u0384\7n\2\2\u0384\u0385\7g\2\2\u0385\u0386\7e\2\2"+
+ "\u0386\u0387\7v\2\2\u0387\u009b\3\2\2\2\u0388\u0389\7e\2\2\u0389\u038a"+
+ "\7c\2\2\u038a\u038b\7u\2\2\u038b\u038c\7g\2\2\u038c\u009d\3\2\2\2\u038d"+
+ "\u038e\7f\2\2\u038e\u038f\7g\2\2\u038f\u0390\7h\2\2\u0390\u0391\7g\2\2"+
+ "\u0391\u0392\7t\2\2\u0392\u009f\3\2\2\2\u0393\u0394\7i\2\2\u0394\u0395"+
+ "\7q\2\2\u0395\u00a1\3\2\2\2\u0396\u0397\7o\2\2\u0397\u0398\7c\2\2\u0398"+
+ "\u0399\7r\2\2\u0399\u00a3\3\2\2\2\u039a\u039b\7u\2\2\u039b\u039c\7v\2"+
+ "\2\u039c\u039d\7t\2\2\u039d\u039e\7w\2\2\u039e\u039f\7e\2\2\u039f\u03a0"+
+ "\7v\2\2\u03a0\u00a5\3\2\2\2\u03a1\u03a2\7e\2\2\u03a2\u03a3\7j\2\2\u03a3"+
+ "\u03a4\7c\2\2\u03a4\u03a5\7p\2\2\u03a5\u00a7\3\2\2\2\u03a6\u03a7\7g\2"+
+ "\2\u03a7\u03a8\7n\2\2\u03a8\u03a9\7u\2\2\u03a9\u03aa\7g\2\2\u03aa\u00a9"+
+ "\3\2\2\2\u03ab\u03ac\7i\2\2\u03ac\u03ad\7q\2\2\u03ad\u03ae\7v\2\2\u03ae"+
+ "\u03af\7q\2\2\u03af\u00ab\3\2\2\2\u03b0\u03b1\7r\2\2\u03b1\u03b2\7c\2"+
+ "\2\u03b2\u03b3\7e\2\2\u03b3\u03b4\7m\2\2\u03b4\u03b5\7c\2\2\u03b5\u03b6"+
+ "\7i\2\2\u03b6\u03b7\7g\2\2\u03b7\u00ad\3\2\2\2\u03b8\u03b9\7u\2\2\u03b9"+
+ "\u03ba\7y\2\2\u03ba\u03bb\7k\2\2\u03bb\u03bc\7v\2\2\u03bc\u03bd\7e\2\2"+
+ "\u03bd\u03be\7j\2\2\u03be\u00af\3\2\2\2\u03bf\u03c0\7e\2\2\u03c0\u03c1"+
+ "\7q\2\2\u03c1\u03c2\7p\2\2\u03c2\u03c3\7u\2\2\u03c3\u03c4\7v\2\2\u03c4"+
+ "\u00b1\3\2\2\2\u03c5\u03c6\7h\2\2\u03c6\u03c7\7c\2\2\u03c7\u03c8\7n\2"+
+ "\2\u03c8\u03c9\7n\2\2\u03c9\u03ca\7v\2\2\u03ca\u03cb\7j\2\2\u03cb\u03cc"+
+ "\7t\2\2\u03cc\u03cd\7q\2\2\u03cd\u03ce\7w\2\2\u03ce\u03cf\7i\2\2\u03cf"+
+ "\u03d0\7j\2\2\u03d0\u03d1\3\2\2\2\u03d1\u03d2\bY\2\2\u03d2\u00b3\3\2\2"+
+ "\2\u03d3\u03d4\7k\2\2\u03d4\u03d5\7h\2\2\u03d5\u00b5\3\2\2\2\u03d6\u03d7"+
+ "\7t\2\2\u03d7\u03d8\7c\2\2\u03d8\u03d9\7p\2\2\u03d9\u03da\7i\2\2\u03da"+
+ "\u03db\7g\2\2\u03db\u00b7\3\2\2\2\u03dc\u03dd\7v\2\2\u03dd\u03de\7{\2"+
+ "\2\u03de\u03df\7r\2\2\u03df\u03e0\7g\2\2\u03e0\u00b9\3\2\2\2\u03e1\u03e2"+
+ "\7e\2\2\u03e2\u03e3\7q\2\2\u03e3\u03e4\7p\2\2\u03e4\u03e5\7v\2\2\u03e5"+
+ "\u03e6\7k\2\2\u03e6\u03e7\7p\2\2\u03e7\u03e8\7w\2\2\u03e8\u03e9\7g\2\2"+
+ "\u03e9\u03ea\3\2\2\2\u03ea\u03eb\b]\2\2\u03eb\u00bb\3\2\2\2\u03ec\u03ed"+
+ "\7h\2\2\u03ed\u03ee\7q\2\2\u03ee\u03ef\7t\2\2\u03ef\u00bd\3\2\2\2\u03f0"+
+ "\u03f1\7k\2\2\u03f1\u03f2\7o\2\2\u03f2\u03f3\7r\2\2\u03f3\u03f4\7q\2\2"+
+ "\u03f4\u03f5\7t\2\2\u03f5\u03f6\7v\2\2\u03f6\u00bf\3\2\2\2\u03f7\u03f8"+
+ "\7t\2\2\u03f8\u03f9\7g\2\2\u03f9\u03fa\7v\2\2\u03fa\u03fb\7w\2\2\u03fb"+
+ "\u03fc\7t\2\2\u03fc\u03fd\7p\2\2\u03fd\u03fe\3\2\2\2\u03fe\u03ff\b`\2"+
+ "\2\u03ff\u00c1\3\2\2\2\u0400\u0401\7x\2\2\u0401\u0402\7c\2\2\u0402\u0403"+
+ "\7t\2\2\u0403\u00c3\3\2\2\2\u0404\u0405\7p\2\2\u0405\u0406\7k\2\2\u0406"+
+ "\u0407\7n\2\2\u0407\u0408\3\2\2\2\u0408\u0409\bb\2\2\u0409\u00c5\3\2\2"+
+ "\2\u040a\u040f\5\u0148\u00a4\2\u040b\u040e\5\u0148\u00a4\2\u040c\u040e"+
+ "\5\u014a\u00a5\2\u040d\u040b\3\2\2\2\u040d\u040c\3\2\2\2\u040e\u0411\3"+
+ "\2\2\2\u040f\u040d\3\2\2\2\u040f\u0410\3\2\2\2\u0410\u0412\3\2\2\2\u0411"+
+ "\u040f\3\2\2\2\u0412\u0413\bc\2\2\u0413\u00c7\3\2\2\2\u0414\u0415\7*\2"+
+ "\2\u0415\u00c9\3\2\2\2\u0416\u0417\7+\2\2\u0417\u0418\3\2\2\2\u0418\u0419"+
+ "\be\2\2\u0419\u00cb\3\2\2\2\u041a\u041b\7}\2\2\u041b\u00cd\3\2\2\2\u041c"+
+ "\u041d\7\177\2\2\u041d\u041e\3\2\2\2\u041e\u041f\bg\2\2\u041f\u00cf\3"+
+ "\2\2\2\u0420\u0421\7]\2\2\u0421\u00d1\3\2\2\2\u0422\u0423\7_\2\2\u0423"+
+ "\u0424\3\2\2\2\u0424\u0425\bi\2\2\u0425\u00d3\3\2\2\2\u0426\u0427\7?\2"+
+ "\2\u0427\u00d5\3\2\2\2\u0428\u0429\7.\2\2\u0429\u00d7\3\2\2\2\u042a\u042b"+
+ "\7=\2\2\u042b\u00d9\3\2\2\2\u042c\u042d\7<\2\2\u042d\u00db\3\2\2\2\u042e"+
+ "\u042f\7\60\2\2\u042f\u00dd\3\2\2\2\u0430\u0431\7-\2\2\u0431\u0432\7-"+
+ "\2\2\u0432\u0433\3\2\2\2\u0433\u0434\bo\2\2\u0434\u00df\3\2\2\2\u0435"+
+ "\u0436\7/\2\2\u0436\u0437\7/\2\2\u0437\u0438\3\2\2\2\u0438\u0439\bp\2"+
+ "\2\u0439\u00e1\3\2\2\2\u043a\u043b\7<\2\2\u043b\u043c\7?\2\2\u043c\u00e3"+
+ "\3\2\2\2\u043d\u043e\7\60\2\2\u043e\u043f\7\60\2\2\u043f\u0440\7\60\2"+
+ "\2\u0440\u00e5\3\2\2\2\u0441\u0442\7~\2\2\u0442\u0443\7~\2\2\u0443\u00e7"+
+ "\3\2\2\2\u0444\u0445\7(\2\2\u0445\u0446\7(\2\2\u0446\u00e9\3\2\2\2\u0447"+
+ "\u0448\7?\2\2\u0448\u0449\7?\2\2\u0449\u00eb\3\2\2\2\u044a\u044b\7#\2"+
+ "\2\u044b\u044c\7?\2\2\u044c\u00ed\3\2\2\2\u044d\u044e\7>\2\2\u044e\u00ef"+
+ "\3\2\2\2\u044f\u0450\7>\2\2\u0450\u0451\7?\2\2\u0451\u00f1\3\2\2\2\u0452"+
+ "\u0453\7@\2\2\u0453\u00f3\3\2\2\2\u0454\u0455\7@\2\2\u0455\u0456\7?\2"+
+ "\2\u0456\u00f5\3\2\2\2\u0457\u0458\7~\2\2\u0458\u00f7\3\2\2\2\u0459\u045a"+
+ "\7\61\2\2\u045a\u00f9\3\2\2\2\u045b\u045c\7\'\2\2\u045c\u00fb\3\2\2\2"+
+ "\u045d\u045e\7>\2\2\u045e\u045f\7>\2\2\u045f\u00fd\3\2\2\2\u0460\u0461"+
+ "\7@\2\2\u0461\u0462\7@\2\2\u0462\u00ff\3\2\2\2\u0463\u0464\7(\2\2\u0464"+
+ "\u0465\7`\2\2\u0465\u0101\3\2\2\2\u0466\u0467\7#\2\2\u0467\u0103\3\2\2"+
+ "\2\u0468\u0469\7-\2\2\u0469\u0105\3\2\2\2\u046a\u046b\7/\2\2\u046b\u0107"+
+ "\3\2\2\2\u046c\u046d\7`\2\2\u046d\u0109\3\2\2\2\u046e\u046f\7,\2\2\u046f"+
+ "\u010b\3\2\2\2\u0470\u0471\7(\2\2\u0471\u010d\3\2\2\2\u0472\u0473\7>\2"+
+ "\2\u0473\u0474\7/\2\2\u0474\u010f\3\2\2\2\u0475\u0481\7\62\2\2\u0476\u047d"+
+ "\t\2\2\2\u0477\u0479\7a\2\2\u0478\u0477\3\2\2\2\u0478\u0479\3\2\2\2\u0479"+
+ "\u047a\3\2\2\2\u047a\u047c\t\3\2\2\u047b\u0478\3\2\2\2\u047c\u047f\3\2"+
+ "\2\2\u047d\u047b\3\2\2\2\u047d\u047e\3\2\2\2\u047e\u0481\3\2\2\2\u047f"+
+ "\u047d\3\2\2\2\u0480\u0475\3\2\2\2\u0480\u0476\3\2\2\2\u0481\u0482\3\2"+
+ "\2\2\u0482\u0483\b\u0088\2\2\u0483\u0111\3\2\2\2\u0484\u0485\7\62\2\2"+
+ "\u0485\u048a\t\4\2\2\u0486\u0488\7a\2\2\u0487\u0486\3\2\2\2\u0487\u0488"+
+ "\3\2\2\2\u0488\u0489\3\2\2\2\u0489\u048b\5\u0144\u00a2\2\u048a\u0487\3"+
+ "\2\2\2\u048b\u048c\3\2\2\2\u048c\u048a\3\2\2\2\u048c\u048d\3\2\2\2\u048d"+
+ "\u048e\3\2\2\2\u048e\u048f\b\u0089\2\2\u048f\u0113\3\2\2\2\u0490\u0492"+
+ "\7\62\2\2\u0491\u0493\t\5\2\2\u0492\u0491\3\2\2\2\u0492\u0493\3\2\2\2"+
+ "\u0493\u0498\3\2\2\2\u0494\u0496\7a\2\2\u0495\u0494\3\2\2\2\u0495\u0496"+
+ "\3\2\2\2\u0496\u0497\3\2\2\2\u0497\u0499\5\u0140\u00a0\2\u0498\u0495\3"+
+ "\2\2\2\u0499\u049a\3\2\2\2\u049a\u0498\3\2\2\2\u049a\u049b\3\2\2\2\u049b"+
+ "\u049c\3\2\2\2\u049c\u049d\b\u008a\2\2\u049d\u0115\3\2\2\2\u049e\u049f"+
+ "\7\62\2\2\u049f\u04a4\t\6\2\2\u04a0\u04a2\7a\2\2\u04a1\u04a0\3\2\2\2\u04a1"+
+ "\u04a2\3\2\2\2\u04a2\u04a3\3\2\2\2\u04a3\u04a5\5\u0142\u00a1\2\u04a4\u04a1"+
+ "\3\2\2\2\u04a5\u04a6\3\2\2\2\u04a6\u04a4\3\2\2\2\u04a6\u04a7\3\2\2\2\u04a7"+
+ "\u04a8\3\2\2\2\u04a8\u04a9\b\u008b\2\2\u04a9\u0117\3\2\2\2\u04aa\u04ab"+
+ "\7\62\2\2\u04ab\u04ac\t\6\2\2\u04ac\u04ad\5\u011a\u008d\2\u04ad\u04ae"+
+ "\5\u011c\u008e\2\u04ae\u0119\3\2\2\2\u04af\u04b1\7a\2\2\u04b0\u04af\3"+
+ "\2\2\2\u04b0\u04b1\3\2\2\2\u04b1\u04b2\3\2\2\2\u04b2\u04b4\5\u0142\u00a1"+
+ "\2\u04b3\u04b0\3\2\2\2\u04b4\u04b5\3\2\2\2\u04b5\u04b3\3\2\2\2\u04b5\u04b6"+
+ "\3\2\2\2\u04b6\u04c1\3\2\2\2\u04b7\u04be\7\60\2\2\u04b8\u04ba\7a\2\2\u04b9"+
+ "\u04b8\3\2\2\2\u04b9\u04ba\3\2\2\2\u04ba\u04bb\3\2\2\2\u04bb\u04bd\5\u0142"+
+ "\u00a1\2\u04bc\u04b9\3\2\2\2\u04bd\u04c0\3\2\2\2\u04be\u04bc\3\2\2\2\u04be"+
+ "\u04bf\3\2\2\2\u04bf\u04c2\3\2\2\2\u04c0\u04be\3\2\2\2\u04c1\u04b7\3\2"+
+ "\2\2\u04c1\u04c2\3\2\2\2\u04c2\u04cf\3\2\2\2\u04c3\u04c4\7\60\2\2\u04c4"+
+ "\u04cb\5\u0142\u00a1\2\u04c5\u04c7\7a\2\2\u04c6\u04c5\3\2\2\2\u04c6\u04c7"+
+ "\3\2\2\2\u04c7\u04c8\3\2\2\2\u04c8\u04ca\5\u0142\u00a1\2\u04c9\u04c6\3"+
+ "\2\2\2\u04ca\u04cd\3\2\2\2\u04cb\u04c9\3\2\2\2\u04cb\u04cc\3\2\2\2\u04cc"+
+ "\u04cf\3\2\2\2\u04cd\u04cb\3\2\2\2\u04ce\u04b3\3\2\2\2\u04ce\u04c3\3\2"+
+ "\2\2\u04cf\u011b\3\2\2\2\u04d0\u04d1\t\7\2\2\u04d1\u04d2\t\b\2\2\u04d2"+
+ "\u04d3\5\u013e\u009f\2\u04d3\u011d\3\2\2\2\u04d4\u04da\5\u0110\u0088\2"+
+ "\u04d5\u04da\5\u0112\u0089\2\u04d6\u04da\5\u0114\u008a\2\u04d7\u04da\5"+
+ "\u0116\u008b\2\u04d8\u04da\5\4\2\2\u04d9\u04d4\3\2\2\2\u04d9\u04d5\3\2"+
+ "\2\2\u04d9\u04d6\3\2\2\2\u04d9\u04d7\3\2\2\2\u04d9\u04d8\3\2\2\2\u04da"+
+ "\u04db\3\2\2\2\u04db\u04dc\7k\2\2\u04dc\u04dd\3\2\2\2\u04dd\u04de\b\u008f"+
+ "\2\2\u04de\u011f\3\2\2\2\u04df\u04e2\7)\2\2\u04e0\u04e3\5\u013a\u009d"+
+ "\2\u04e1\u04e3\5\u0124\u0092\2\u04e2\u04e0\3\2\2\2\u04e2\u04e1\3\2\2\2"+
+ "\u04e3\u04e4\3\2\2\2\u04e4\u04e5\7)\2\2\u04e5\u0121\3\2\2\2\u04e6\u04e7"+
+ "\5\u0120\u0090\2\u04e7\u04e8\3\2\2\2\u04e8\u04e9\b\u0091\2\2\u04e9\u0123"+
+ "\3\2\2\2\u04ea\u04ed\5\u0126\u0093\2\u04eb\u04ed\5\u0128\u0094\2\u04ec"+
+ "\u04ea\3\2\2\2\u04ec\u04eb\3\2\2\2\u04ed\u0125\3\2\2\2\u04ee\u04ef\7^"+
+ "\2\2\u04ef\u04f0\5\u0140\u00a0\2\u04f0\u04f1\5\u0140\u00a0\2\u04f1\u04f2"+
+ "\5\u0140\u00a0\2\u04f2\u0127\3\2\2\2\u04f3\u04f4\7^\2\2\u04f4\u04f5\7"+
+ "z\2\2\u04f5\u04f6\5\u0142\u00a1\2\u04f6\u04f7\5\u0142\u00a1\2\u04f7\u0129"+
+ "\3\2\2\2\u04f8\u04f9\7^\2\2\u04f9\u04fa\7w\2\2\u04fa\u04fb\5\u0142\u00a1"+
+ "\2\u04fb\u04fc\5\u0142\u00a1\2\u04fc\u04fd\5\u0142\u00a1\2\u04fd\u04fe"+
+ "\5\u0142\u00a1\2\u04fe\u012b\3\2\2\2\u04ff\u0500\7^\2\2\u0500\u0501\7"+
+ "W\2\2\u0501\u0502\5\u0142\u00a1\2\u0502\u0503\5\u0142\u00a1\2\u0503\u0504"+
+ "\5\u0142\u00a1\2\u0504\u0505\5\u0142\u00a1\2\u0505\u0506\5\u0142\u00a1"+
+ "\2\u0506\u0507\5\u0142\u00a1\2\u0507\u0508\5\u0142\u00a1\2\u0508\u0509"+
+ "\5\u0142\u00a1\2\u0509\u012d\3\2\2\2\u050a\u050e\7b\2\2\u050b\u050d\n"+
+ "\t\2\2\u050c\u050b\3\2\2\2\u050d\u0510\3\2\2\2\u050e\u050c\3\2\2\2\u050e"+
+ "\u050f\3\2\2\2\u050f\u0511\3\2\2\2\u0510\u050e\3\2\2\2\u0511\u0512\7b"+
+ "\2\2\u0512\u0513\3\2\2\2\u0513\u0514\b\u0097\2\2\u0514\u012f\3\2\2\2\u0515"+
+ "\u051a\7$\2\2\u0516\u0519\n\n\2\2\u0517\u0519\5\u013c\u009e\2\u0518\u0516"+
+ "\3\2\2\2\u0518\u0517\3\2\2\2\u0519\u051c\3\2\2\2\u051a\u0518\3\2\2\2\u051a"+
+ "\u051b\3\2\2\2\u051b\u051d\3\2\2\2\u051c\u051a\3\2\2\2\u051d\u051e\7$"+
+ "\2\2\u051e\u051f\3\2\2\2\u051f\u0520\b\u0098\2\2\u0520\u0131\3\2\2\2\u0521"+
+ "\u0523\t\13\2\2\u0522\u0521\3\2\2\2\u0523\u0524\3\2\2\2\u0524\u0522\3"+
+ "\2\2\2\u0524\u0525\3\2\2\2\u0525\u0526\3\2\2\2\u0526\u0527\b\u0099\3\2"+
+ "\u0527\u0133\3\2\2\2\u0528\u0529\7\61\2\2\u0529\u052a\7,\2\2\u052a\u052e"+
+ "\3\2\2\2\u052b\u052d\13\2\2\2\u052c\u052b\3\2\2\2\u052d\u0530\3\2\2\2"+
+ "\u052e\u052f\3\2\2\2\u052e\u052c\3\2\2\2\u052f\u0531\3\2\2\2\u0530\u052e"+
+ "\3\2\2\2\u0531\u0532\7,\2\2\u0532\u0533\7\61\2\2\u0533\u0534\3\2\2\2\u0534"+
+ "\u0535\b\u009a\3\2\u0535\u0135\3\2\2\2\u0536\u0538\t\f\2\2\u0537\u0536"+
+ "\3\2\2\2\u0538\u0539\3\2\2\2\u0539\u0537\3\2\2\2\u0539\u053a\3\2\2\2\u053a"+
+ "\u053b\3\2\2\2\u053b\u053c\b\u009b\3\2\u053c\u0137\3\2\2\2\u053d\u053e"+
+ "\7\61\2\2\u053e\u053f\7\61\2\2\u053f\u0543\3\2\2\2\u0540\u0542\n\f\2\2"+
+ "\u0541\u0540\3\2\2\2\u0542\u0545\3\2\2\2\u0543\u0541\3\2\2\2\u0543\u0544"+
+ "\3\2\2\2\u0544\u0546\3\2\2\2\u0545\u0543\3\2\2\2\u0546\u0547\b\u009c\3"+
+ "\2\u0547\u0139\3\2\2\2\u0548\u054d\n\r\2\2\u0549\u054d\5\u012a\u0095\2"+
+ "\u054a\u054d\5\u012c\u0096\2\u054b\u054d\5\u013c\u009e\2\u054c\u0548\3"+
+ "\2\2\2\u054c\u0549\3\2\2\2\u054c\u054a\3\2\2\2\u054c\u054b\3\2\2\2\u054d"+
+ "\u013b\3\2\2\2\u054e\u0568\7^\2\2\u054f\u0550\7w\2\2\u0550\u0551\5\u0142"+
+ "\u00a1\2\u0551\u0552\5\u0142\u00a1\2\u0552\u0553\5\u0142\u00a1\2\u0553"+
+ "\u0554\5\u0142\u00a1\2\u0554\u0569\3\2\2\2\u0555\u0556\7W\2\2\u0556\u0557"+
+ "\5\u0142\u00a1\2\u0557\u0558\5\u0142\u00a1\2\u0558\u0559\5\u0142\u00a1"+
+ "\2\u0559\u055a\5\u0142\u00a1\2\u055a\u055b\5\u0142\u00a1\2\u055b\u055c"+
+ "\5\u0142\u00a1\2\u055c\u055d\5\u0142\u00a1\2\u055d\u055e\5\u0142\u00a1"+
+ "\2\u055e\u0569\3\2\2\2\u055f\u0569\t\16\2\2\u0560\u0561\5\u0140\u00a0"+
+ "\2\u0561\u0562\5\u0140\u00a0\2\u0562\u0563\5\u0140\u00a0\2\u0563\u0569"+
+ "\3\2\2\2\u0564\u0565\7z\2\2\u0565\u0566\5\u0142\u00a1\2\u0566\u0567\5"+
+ "\u0142\u00a1\2\u0567\u0569\3\2\2\2\u0568\u054f\3\2\2\2\u0568\u0555\3\2"+
+ "\2\2\u0568\u055f\3\2\2\2\u0568\u0560\3\2\2\2\u0568\u0564\3\2\2\2\u0569"+
+ "\u013d\3\2\2\2\u056a\u0571\t\3\2\2\u056b\u056d\7a\2\2\u056c\u056b\3\2"+
+ "\2\2\u056c\u056d\3\2\2\2\u056d\u056e\3\2\2\2\u056e\u0570\t\3\2\2\u056f"+
+ "\u056c\3\2\2\2\u0570\u0573\3\2\2\2\u0571\u056f\3\2\2\2\u0571\u0572\3\2"+
+ "\2\2\u0572\u013f\3\2\2\2\u0573\u0571\3\2\2\2\u0574\u0575\t\17\2\2\u0575"+
+ "\u0141\3\2\2\2\u0576\u0577\t\20\2\2\u0577\u0143\3\2\2\2\u0578\u0579\t"+
+ "\21\2\2\u0579\u0145\3\2\2\2\u057a\u057c\t\22\2\2\u057b\u057d\t\b\2\2\u057c"+
+ "\u057b\3\2\2\2\u057c\u057d\3\2\2\2\u057d\u057e\3\2\2\2\u057e\u057f\5\u013e"+
+ "\u009f\2\u057f\u0147\3\2\2\2\u0580\u0583\5\u014c\u00a6\2\u0581\u0583\7"+
+ "a\2\2\u0582\u0580\3\2\2\2\u0582\u0581\3\2\2\2\u0583\u0149\3\2\2\2\u0584"+
+ "\u0585\t\23\2\2\u0585\u014b\3\2\2\2\u0586\u0587\t\24\2\2\u0587\u014d\3"+
+ "\2\2\2\u0588\u058a\t\13\2\2\u0589\u0588\3\2\2\2\u058a\u058b\3\2\2\2\u058b"+
+ "\u0589\3\2\2\2\u058b\u058c\3\2\2\2\u058c\u058d\3\2\2\2\u058d\u058e\b\u00a7"+
+ "\3\2\u058e\u014f\3\2\2\2\u058f\u0590\7\61\2\2\u0590\u0591\7,\2\2\u0591"+
+ "\u0595\3\2\2\2\u0592\u0594\n\f\2\2\u0593\u0592\3\2\2\2\u0594\u0597\3\2"+
+ "\2\2\u0595\u0596\3\2\2\2\u0595\u0593\3\2\2\2\u0596\u0598\3\2\2\2\u0597"+
+ "\u0595\3\2\2\2\u0598\u0599\7,\2\2\u0599\u059a\7\61\2\2\u059a\u059b\3\2"+
+ "\2\2\u059b\u059c\b\u00a8\3\2\u059c\u0151\3\2\2\2\u059d\u059e\7\61\2\2"+
+ "\u059e\u059f\7\61\2\2\u059f\u05a3\3\2\2\2\u05a0\u05a2\n\f\2\2\u05a1\u05a0"+
+ "\3\2\2\2\u05a2\u05a5\3\2\2\2\u05a3\u05a1\3\2\2\2\u05a3\u05a4\3\2\2\2\u05a4"+
+ "\u05a6\3\2\2\2\u05a5\u05a3\3\2\2\2\u05a6\u05a7\b\u00a9\3\2\u05a7\u0153"+
+ "\3\2\2\2\u05a8\u05aa\t\f\2\2\u05a9\u05a8\3\2\2\2\u05aa\u05ab\3\2\2\2\u05ab"+
+ "\u05a9\3\2\2\2\u05ab\u05ac\3\2\2\2\u05ac\u05bb\3\2\2\2\u05ad\u05bb\7="+
+ "\2\2\u05ae\u05af\7\61\2\2\u05af\u05b0\7,\2\2\u05b0\u05b4\3\2\2\2\u05b1"+
+ "\u05b3\13\2\2\2\u05b2\u05b1\3\2\2\2\u05b3\u05b6\3\2\2\2\u05b4\u05b5\3"+
+ "\2\2\2\u05b4\u05b2\3\2\2\2\u05b5\u05b7\3\2\2\2\u05b6\u05b4\3\2\2\2\u05b7"+
+ "\u05b8\7,\2\2\u05b8\u05bb\7\61\2\2\u05b9\u05bb\7\2\2\3\u05ba\u05a9\3\2"+
+ "\2\2\u05ba\u05ad\3\2\2\2\u05ba\u05ae\3\2\2\2\u05ba\u05b9\3\2\2\2\u05bb"+
+ "\u05bc\3\2\2\2\u05bc\u05bd\b\u00aa\4\2\u05bd\u0155\3\2\2\2\u05be\u05bf"+
+ "\3\2\2\2\u05bf\u05c0\3\2\2\2\u05c0\u05c1\b\u00ab\4\2\u05c1\u05c2\b\u00ab"+
+ "\3\2\u05c2\u0157\3\2\2\2\64\2\3\u015a\u0162\u0165\u0168\u016e\u0170\u040d"+
+ "\u040f\u0478\u047d\u0480\u0487\u048c\u0492\u0495\u049a\u04a1\u04a6\u04b0"+
+ "\u04b5\u04b9\u04be\u04c1\u04c6\u04cb\u04ce\u04d9\u04e2\u04ec\u050e\u0518"+
+ "\u051a\u0524\u052e\u0539\u0543\u054c\u0568\u056c\u0571\u057c\u0582\u058b"+
+ "\u0595\u05a3\u05ab\u05b4\u05ba\5\4\3\2\2\3\2\4\2\2";
public static final ATN _ATN =
new ATNDeserializer().deserialize(_serializedATN.toCharArray());
static {
diff --git a/src/main/java/viper/gobra/frontend/GobraParser.java b/src/main/java/viper/gobra/frontend/GobraParser.java
index 3031c6145..045338bf7 100644
--- a/src/main/java/viper/gobra/frontend/GobraParser.java
+++ b/src/main/java/viper/gobra/frontend/GobraParser.java
@@ -1,4 +1,4 @@
-// Generated from /Users/joao/Code/gobraHome/gobra/src/main/antlr4/GobraParser.g4 by ANTLR 4.9.2
+// Generated from /main/antlr4/GobraParser.g4 by ANTLR 4.9.1
package viper.gobra.frontend;
import org.antlr.v4.runtime.atn.*;
import org.antlr.v4.runtime.dfa.DFA;
@@ -11,7 +11,7 @@
@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"})
public class GobraParser extends GobraParserBase {
- static { RuntimeMetaData.checkVersion("4.9.2", RuntimeMetaData.VERSION); }
+ static { RuntimeMetaData.checkVersion("4.9.1", RuntimeMetaData.VERSION); }
protected static final DFA[] _decisionToDFA;
protected static final PredictionContextCache _sharedContextCache =
@@ -27,21 +27,21 @@ public class GobraParser extends GobraParserBase {
PRED=53, TYPE_OF=54, IS_COMPARABLE=55, SHARE=56, ADDR_MOD=57, DOT_DOT=58,
SHARED=59, EXCLUSIVE=60, PREDICATE=61, WRITEPERM=62, NOPERM=63, TRUSTED=64,
OUTLINE=65, INIT_POST=66, IMPORT_PRE=67, PROOF=68, GHOST_EQUALS=69, GHOST_NOT_EQUALS=70,
- BREAK=71, DEFAULT=72, FUNC=73, INTERFACE=74, SELECT=75, CASE=76, DEFER=77,
- GO=78, MAP=79, STRUCT=80, CHAN=81, ELSE=82, GOTO=83, PACKAGE=84, SWITCH=85,
- CONST=86, FALLTHROUGH=87, IF=88, RANGE=89, TYPE=90, CONTINUE=91, FOR=92,
- IMPORT=93, RETURN=94, VAR=95, NIL_LIT=96, IDENTIFIER=97, L_PAREN=98, R_PAREN=99,
- L_CURLY=100, R_CURLY=101, L_BRACKET=102, R_BRACKET=103, ASSIGN=104, COMMA=105,
- SEMI=106, COLON=107, DOT=108, PLUS_PLUS=109, MINUS_MINUS=110, DECLARE_ASSIGN=111,
- ELLIPSIS=112, LOGICAL_OR=113, LOGICAL_AND=114, EQUALS=115, NOT_EQUALS=116,
- LESS=117, LESS_OR_EQUALS=118, GREATER=119, GREATER_OR_EQUALS=120, OR=121,
- DIV=122, MOD=123, LSHIFT=124, RSHIFT=125, BIT_CLEAR=126, EXCLAMATION=127,
- PLUS=128, MINUS=129, CARET=130, STAR=131, AMPERSAND=132, RECEIVE=133,
- DECIMAL_LIT=134, BINARY_LIT=135, OCTAL_LIT=136, HEX_LIT=137, HEX_FLOAT_LIT=138,
- IMAGINARY_LIT=139, RUNE_LIT=140, BYTE_VALUE=141, OCTAL_BYTE_VALUE=142,
- HEX_BYTE_VALUE=143, LITTLE_U_VALUE=144, BIG_U_VALUE=145, RAW_STRING_LIT=146,
- INTERPRETED_STRING_LIT=147, WS=148, COMMENT=149, TERMINATOR=150, LINE_COMMENT=151,
- WS_NLSEMI=152, COMMENT_NLSEMI=153, LINE_COMMENT_NLSEMI=154, EOS=155, OTHER=156;
+ WITH=71, BREAK=72, DEFAULT=73, FUNC=74, INTERFACE=75, SELECT=76, CASE=77,
+ DEFER=78, GO=79, MAP=80, STRUCT=81, CHAN=82, ELSE=83, GOTO=84, PACKAGE=85,
+ SWITCH=86, CONST=87, FALLTHROUGH=88, IF=89, RANGE=90, TYPE=91, CONTINUE=92,
+ FOR=93, IMPORT=94, RETURN=95, VAR=96, NIL_LIT=97, IDENTIFIER=98, L_PAREN=99,
+ R_PAREN=100, L_CURLY=101, R_CURLY=102, L_BRACKET=103, R_BRACKET=104, ASSIGN=105,
+ COMMA=106, SEMI=107, COLON=108, DOT=109, PLUS_PLUS=110, MINUS_MINUS=111,
+ DECLARE_ASSIGN=112, ELLIPSIS=113, LOGICAL_OR=114, LOGICAL_AND=115, EQUALS=116,
+ NOT_EQUALS=117, LESS=118, LESS_OR_EQUALS=119, GREATER=120, GREATER_OR_EQUALS=121,
+ OR=122, DIV=123, MOD=124, LSHIFT=125, RSHIFT=126, BIT_CLEAR=127, EXCLAMATION=128,
+ PLUS=129, MINUS=130, CARET=131, STAR=132, AMPERSAND=133, RECEIVE=134,
+ DECIMAL_LIT=135, BINARY_LIT=136, OCTAL_LIT=137, HEX_LIT=138, HEX_FLOAT_LIT=139,
+ IMAGINARY_LIT=140, RUNE_LIT=141, BYTE_VALUE=142, OCTAL_BYTE_VALUE=143,
+ HEX_BYTE_VALUE=144, LITTLE_U_VALUE=145, BIG_U_VALUE=146, RAW_STRING_LIT=147,
+ INTERPRETED_STRING_LIT=148, WS=149, COMMENT=150, TERMINATOR=151, LINE_COMMENT=152,
+ WS_NLSEMI=153, COMMENT_NLSEMI=154, LINE_COMMENT_NLSEMI=155, EOS=156, OTHER=157;
public static final int
RULE_exprOnly = 0, RULE_stmtOnly = 1, RULE_typeOnly = 2, RULE_maybeAddressableIdentifierList = 3,
RULE_maybeAddressableIdentifier = 4, RULE_sourceFile = 5, RULE_initPost = 6,
@@ -70,29 +70,29 @@ public class GobraParser extends GobraParserBase {
RULE_interfaceType = 84, RULE_predicateSpec = 85, RULE_methodSpec = 86,
RULE_type_ = 87, RULE_typeLit = 88, RULE_predType = 89, RULE_predTypeParams = 90,
RULE_literalType = 91, RULE_implicitArray = 92, RULE_slice_ = 93, RULE_low = 94,
- RULE_high = 95, RULE_cap = 96, RULE_assign_op = 97, RULE_packageClause = 98,
- RULE_importPath = 99, RULE_declaration = 100, RULE_constDecl = 101, RULE_constSpec = 102,
- RULE_identifierList = 103, RULE_expressionList = 104, RULE_typeDecl = 105,
- RULE_typeSpec = 106, RULE_varDecl = 107, RULE_block = 108, RULE_statementList = 109,
- RULE_simpleStmt = 110, RULE_expressionStmt = 111, RULE_sendStmt = 112,
- RULE_incDecStmt = 113, RULE_assignment = 114, RULE_emptyStmt = 115, RULE_labeledStmt = 116,
- RULE_returnStmt = 117, RULE_breakStmt = 118, RULE_continueStmt = 119,
- RULE_gotoStmt = 120, RULE_fallthroughStmt = 121, RULE_ifStmt = 122, RULE_switchStmt = 123,
- RULE_exprSwitchStmt = 124, RULE_exprCaseClause = 125, RULE_exprSwitchCase = 126,
- RULE_typeSwitchStmt = 127, RULE_typeSwitchGuard = 128, RULE_typeCaseClause = 129,
- RULE_typeSwitchCase = 130, RULE_typeList = 131, RULE_selectStmt = 132,
- RULE_commClause = 133, RULE_commCase = 134, RULE_recvStmt = 135, RULE_forStmt = 136,
- RULE_forClause = 137, RULE_rangeClause = 138, RULE_goStmt = 139, RULE_typeName = 140,
- RULE_arrayType = 141, RULE_arrayLength = 142, RULE_elementType = 143,
- RULE_pointerType = 144, RULE_sliceType = 145, RULE_mapType = 146, RULE_channelType = 147,
- RULE_functionType = 148, RULE_signature = 149, RULE_result = 150, RULE_parameters = 151,
- RULE_conversion = 152, RULE_nonNamedType = 153, RULE_operand = 154, RULE_literal = 155,
- RULE_integer = 156, RULE_operandName = 157, RULE_qualifiedIdent = 158,
- RULE_compositeLit = 159, RULE_literalValue = 160, RULE_elementList = 161,
- RULE_keyedElement = 162, RULE_key = 163, RULE_element = 164, RULE_structType = 165,
- RULE_fieldDecl = 166, RULE_string_ = 167, RULE_embeddedField = 168, RULE_index = 169,
- RULE_typeAssertion = 170, RULE_arguments = 171, RULE_methodExpr = 172,
- RULE_receiverType = 173, RULE_eos = 174;
+ RULE_high = 95, RULE_cap = 96, RULE_assign_op = 97, RULE_rangeClause = 98,
+ RULE_packageClause = 99, RULE_importPath = 100, RULE_declaration = 101,
+ RULE_constDecl = 102, RULE_constSpec = 103, RULE_identifierList = 104,
+ RULE_expressionList = 105, RULE_typeDecl = 106, RULE_typeSpec = 107, RULE_varDecl = 108,
+ RULE_block = 109, RULE_statementList = 110, RULE_simpleStmt = 111, RULE_expressionStmt = 112,
+ RULE_sendStmt = 113, RULE_incDecStmt = 114, RULE_assignment = 115, RULE_emptyStmt = 116,
+ RULE_labeledStmt = 117, RULE_returnStmt = 118, RULE_breakStmt = 119, RULE_continueStmt = 120,
+ RULE_gotoStmt = 121, RULE_fallthroughStmt = 122, RULE_ifStmt = 123, RULE_switchStmt = 124,
+ RULE_exprSwitchStmt = 125, RULE_exprCaseClause = 126, RULE_exprSwitchCase = 127,
+ RULE_typeSwitchStmt = 128, RULE_typeSwitchGuard = 129, RULE_typeCaseClause = 130,
+ RULE_typeSwitchCase = 131, RULE_typeList = 132, RULE_selectStmt = 133,
+ RULE_commClause = 134, RULE_commCase = 135, RULE_recvStmt = 136, RULE_forStmt = 137,
+ RULE_forClause = 138, RULE_goStmt = 139, RULE_typeName = 140, RULE_arrayType = 141,
+ RULE_arrayLength = 142, RULE_elementType = 143, RULE_pointerType = 144,
+ RULE_sliceType = 145, RULE_mapType = 146, RULE_channelType = 147, RULE_functionType = 148,
+ RULE_signature = 149, RULE_result = 150, RULE_parameters = 151, RULE_conversion = 152,
+ RULE_nonNamedType = 153, RULE_operand = 154, RULE_literal = 155, RULE_integer = 156,
+ RULE_operandName = 157, RULE_qualifiedIdent = 158, RULE_compositeLit = 159,
+ RULE_literalValue = 160, RULE_elementList = 161, RULE_keyedElement = 162,
+ RULE_key = 163, RULE_element = 164, RULE_structType = 165, RULE_fieldDecl = 166,
+ RULE_string_ = 167, RULE_embeddedField = 168, RULE_index = 169, RULE_typeAssertion = 170,
+ RULE_arguments = 171, RULE_methodExpr = 172, RULE_receiverType = 173,
+ RULE_eos = 174;
private static String[] makeRuleNames() {
return new String[] {
"exprOnly", "stmtOnly", "typeOnly", "maybeAddressableIdentifierList",
@@ -114,15 +114,15 @@ private static String[] makeRuleNames() {
"specForStmt", "loopSpec", "deferStmt", "basicLit", "primaryExpr", "functionLit",
"closureDecl", "predConstructArgs", "interfaceType", "predicateSpec",
"methodSpec", "type_", "typeLit", "predType", "predTypeParams", "literalType",
- "implicitArray", "slice_", "low", "high", "cap", "assign_op", "packageClause",
- "importPath", "declaration", "constDecl", "constSpec", "identifierList",
- "expressionList", "typeDecl", "typeSpec", "varDecl", "block", "statementList",
- "simpleStmt", "expressionStmt", "sendStmt", "incDecStmt", "assignment",
- "emptyStmt", "labeledStmt", "returnStmt", "breakStmt", "continueStmt",
- "gotoStmt", "fallthroughStmt", "ifStmt", "switchStmt", "exprSwitchStmt",
- "exprCaseClause", "exprSwitchCase", "typeSwitchStmt", "typeSwitchGuard",
- "typeCaseClause", "typeSwitchCase", "typeList", "selectStmt", "commClause",
- "commCase", "recvStmt", "forStmt", "forClause", "rangeClause", "goStmt",
+ "implicitArray", "slice_", "low", "high", "cap", "assign_op", "rangeClause",
+ "packageClause", "importPath", "declaration", "constDecl", "constSpec",
+ "identifierList", "expressionList", "typeDecl", "typeSpec", "varDecl",
+ "block", "statementList", "simpleStmt", "expressionStmt", "sendStmt",
+ "incDecStmt", "assignment", "emptyStmt", "labeledStmt", "returnStmt",
+ "breakStmt", "continueStmt", "gotoStmt", "fallthroughStmt", "ifStmt",
+ "switchStmt", "exprSwitchStmt", "exprCaseClause", "exprSwitchCase", "typeSwitchStmt",
+ "typeSwitchGuard", "typeCaseClause", "typeSwitchCase", "typeList", "selectStmt",
+ "commClause", "commCase", "recvStmt", "forStmt", "forClause", "goStmt",
"typeName", "arrayType", "arrayLength", "elementType", "pointerType",
"sliceType", "mapType", "channelType", "functionType", "signature", "result",
"parameters", "conversion", "nonNamedType", "operand", "literal", "integer",
@@ -146,15 +146,15 @@ private static String[] makeLiteralNames() {
"'some'", "'get'", "'domain'", "'axiom'", "'none'", "'pred'", "'typeOf'",
"'isComparable'", "'share'", "'@'", "'..'", "'shared'", "'exclusive'",
"'predicate'", "'writePerm'", "'noPerm'", "'trusted'", "'outline'", "'initEnsures'",
- "'importRequires'", "'proof'", "'==='", "'!=='", "'break'", "'default'",
- "'func'", "'interface'", "'select'", "'case'", "'defer'", "'go'", "'map'",
- "'struct'", "'chan'", "'else'", "'goto'", "'package'", "'switch'", "'const'",
- "'fallthrough'", "'if'", "'range'", "'type'", "'continue'", "'for'",
- "'import'", "'return'", "'var'", "'nil'", null, "'('", "')'", "'{'",
- "'}'", "'['", "']'", "'='", "','", "';'", "':'", "'.'", "'++'", "'--'",
- "':='", "'...'", "'||'", "'&&'", "'=='", "'!='", "'<'", "'<='", "'>'",
- "'>='", "'|'", "'/'", "'%'", "'<<'", "'>>'", "'&^'", "'!'", "'+'", "'-'",
- "'^'", "'*'", "'&'", "'<-'"
+ "'importRequires'", "'proof'", "'==='", "'!=='", "'with'", "'break'",
+ "'default'", "'func'", "'interface'", "'select'", "'case'", "'defer'",
+ "'go'", "'map'", "'struct'", "'chan'", "'else'", "'goto'", "'package'",
+ "'switch'", "'const'", "'fallthrough'", "'if'", "'range'", "'type'",
+ "'continue'", "'for'", "'import'", "'return'", "'var'", "'nil'", null,
+ "'('", "')'", "'{'", "'}'", "'['", "']'", "'='", "','", "';'", "':'",
+ "'.'", "'++'", "'--'", "':='", "'...'", "'||'", "'&&'", "'=='", "'!='",
+ "'<'", "'<='", "'>'", "'>='", "'|'", "'/'", "'%'", "'<<'", "'>>'", "'&^'",
+ "'!'", "'+'", "'-'", "'^'", "'*'", "'&'", "'<-'"
};
}
private static final String[] _LITERAL_NAMES = makeLiteralNames();
@@ -169,9 +169,9 @@ private static String[] makeSymbolicNames() {
"GET", "DOM", "AXIOM", "NONE", "PRED", "TYPE_OF", "IS_COMPARABLE", "SHARE",
"ADDR_MOD", "DOT_DOT", "SHARED", "EXCLUSIVE", "PREDICATE", "WRITEPERM",
"NOPERM", "TRUSTED", "OUTLINE", "INIT_POST", "IMPORT_PRE", "PROOF", "GHOST_EQUALS",
- "GHOST_NOT_EQUALS", "BREAK", "DEFAULT", "FUNC", "INTERFACE", "SELECT",
- "CASE", "DEFER", "GO", "MAP", "STRUCT", "CHAN", "ELSE", "GOTO", "PACKAGE",
- "SWITCH", "CONST", "FALLTHROUGH", "IF", "RANGE", "TYPE", "CONTINUE",
+ "GHOST_NOT_EQUALS", "WITH", "BREAK", "DEFAULT", "FUNC", "INTERFACE",
+ "SELECT", "CASE", "DEFER", "GO", "MAP", "STRUCT", "CHAN", "ELSE", "GOTO",
+ "PACKAGE", "SWITCH", "CONST", "FALLTHROUGH", "IF", "RANGE", "TYPE", "CONTINUE",
"FOR", "IMPORT", "RETURN", "VAR", "NIL_LIT", "IDENTIFIER", "L_PAREN",
"R_PAREN", "L_CURLY", "R_CURLY", "L_BRACKET", "R_BRACKET", "ASSIGN",
"COMMA", "SEMI", "COLON", "DOT", "PLUS_PLUS", "MINUS_MINUS", "DECLARE_ASSIGN",
@@ -559,7 +559,7 @@ public final SourceFileContext sourceFile() throws RecognitionException {
setState(398);
_errHandler.sync(this);
_la = _input.LA(1);
- while (((((_la - 9)) & ~0x3f) == 0 && ((1L << (_la - 9)) & ((1L << (PRE - 9)) | (1L << (PRESERVES - 9)) | (1L << (POST - 9)) | (1L << (DEC - 9)) | (1L << (PURE - 9)) | (1L << (GHOST - 9)) | (1L << (SEQ - 9)) | (1L << (SET - 9)) | (1L << (MSET - 9)) | (1L << (DICT - 9)) | (1L << (OPT - 9)) | (1L << (DOM - 9)) | (1L << (PRED - 9)) | (1L << (TRUSTED - 9)))) != 0) || ((((_la - 73)) & ~0x3f) == 0 && ((1L << (_la - 73)) & ((1L << (FUNC - 73)) | (1L << (INTERFACE - 73)) | (1L << (MAP - 73)) | (1L << (STRUCT - 73)) | (1L << (CHAN - 73)) | (1L << (CONST - 73)) | (1L << (TYPE - 73)) | (1L << (VAR - 73)) | (1L << (IDENTIFIER - 73)) | (1L << (L_PAREN - 73)) | (1L << (L_BRACKET - 73)) | (1L << (STAR - 73)) | (1L << (RECEIVE - 73)))) != 0)) {
+ while (((((_la - 9)) & ~0x3f) == 0 && ((1L << (_la - 9)) & ((1L << (PRE - 9)) | (1L << (PRESERVES - 9)) | (1L << (POST - 9)) | (1L << (DEC - 9)) | (1L << (PURE - 9)) | (1L << (GHOST - 9)) | (1L << (SEQ - 9)) | (1L << (SET - 9)) | (1L << (MSET - 9)) | (1L << (DICT - 9)) | (1L << (OPT - 9)) | (1L << (DOM - 9)) | (1L << (PRED - 9)) | (1L << (TRUSTED - 9)))) != 0) || ((((_la - 74)) & ~0x3f) == 0 && ((1L << (_la - 74)) & ((1L << (FUNC - 74)) | (1L << (INTERFACE - 74)) | (1L << (MAP - 74)) | (1L << (STRUCT - 74)) | (1L << (CHAN - 74)) | (1L << (CONST - 74)) | (1L << (TYPE - 74)) | (1L << (VAR - 74)) | (1L << (IDENTIFIER - 74)) | (1L << (L_PAREN - 74)) | (1L << (L_BRACKET - 74)) | (1L << (STAR - 74)) | (1L << (RECEIVE - 74)))) != 0)) {
{
{
setState(392);
@@ -3240,7 +3240,7 @@ public final ClosureSpecInstanceContext closureSpecInstance() throws Recognition
setState(720);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)) | (1L << (EXCLAMATION - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (EXCLAMATION - 128)) | (1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) {
{
setState(716);
closureSpecParams();
@@ -5016,7 +5016,7 @@ private ExpressionContext expression(int _p) throws RecognitionException {
setState(901);
((UnaryExprContext)_localctx).unary_op = _input.LT(1);
_la = _input.LA(1);
- if ( !(((((_la - 127)) & ~0x3f) == 0 && ((1L << (_la - 127)) & ((1L << (EXCLAMATION - 127)) | (1L << (PLUS - 127)) | (1L << (MINUS - 127)) | (1L << (CARET - 127)) | (1L << (STAR - 127)) | (1L << (AMPERSAND - 127)) | (1L << (RECEIVE - 127)))) != 0)) ) {
+ if ( !(((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (EXCLAMATION - 128)) | (1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)))) != 0)) ) {
((UnaryExprContext)_localctx).unary_op = (Token)_errHandler.recoverInline(this);
}
else {
@@ -5101,7 +5101,7 @@ private ExpressionContext expression(int _p) throws RecognitionException {
setState(919);
((MulExprContext)_localctx).mul_op = _input.LT(1);
_la = _input.LA(1);
- if ( !(((((_la - 122)) & ~0x3f) == 0 && ((1L << (_la - 122)) & ((1L << (DIV - 122)) | (1L << (MOD - 122)) | (1L << (LSHIFT - 122)) | (1L << (RSHIFT - 122)) | (1L << (BIT_CLEAR - 122)) | (1L << (STAR - 122)) | (1L << (AMPERSAND - 122)))) != 0)) ) {
+ if ( !(((((_la - 123)) & ~0x3f) == 0 && ((1L << (_la - 123)) & ((1L << (DIV - 123)) | (1L << (MOD - 123)) | (1L << (LSHIFT - 123)) | (1L << (RSHIFT - 123)) | (1L << (BIT_CLEAR - 123)) | (1L << (STAR - 123)) | (1L << (AMPERSAND - 123)))) != 0)) ) {
((MulExprContext)_localctx).mul_op = (Token)_errHandler.recoverInline(this);
}
else {
@@ -5122,7 +5122,7 @@ private ExpressionContext expression(int _p) throws RecognitionException {
setState(922);
((AddExprContext)_localctx).add_op = _input.LT(1);
_la = _input.LA(1);
- if ( !(_la==WAND || ((((_la - 109)) & ~0x3f) == 0 && ((1L << (_la - 109)) & ((1L << (PLUS_PLUS - 109)) | (1L << (OR - 109)) | (1L << (PLUS - 109)) | (1L << (MINUS - 109)) | (1L << (CARET - 109)))) != 0)) ) {
+ if ( !(_la==WAND || ((((_la - 110)) & ~0x3f) == 0 && ((1L << (_la - 110)) & ((1L << (PLUS_PLUS - 110)) | (1L << (OR - 110)) | (1L << (PLUS - 110)) | (1L << (MINUS - 110)) | (1L << (CARET - 110)))) != 0)) ) {
((AddExprContext)_localctx).add_op = (Token)_errHandler.recoverInline(this);
}
else {
@@ -6472,7 +6472,7 @@ public final PredConstructArgsContext predConstructArgs() throws RecognitionExce
setState(1073);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)) | (1L << (EXCLAMATION - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (EXCLAMATION - 128)) | (1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) {
{
setState(1072);
expressionList();
@@ -7027,7 +7027,7 @@ public final PredTypeParamsContext predTypeParams() throws RecognitionException
setState(1152);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << DOM) | (1L << PRED))) != 0) || ((((_la - 73)) & ~0x3f) == 0 && ((1L << (_la - 73)) & ((1L << (FUNC - 73)) | (1L << (INTERFACE - 73)) | (1L << (MAP - 73)) | (1L << (STRUCT - 73)) | (1L << (CHAN - 73)) | (1L << (IDENTIFIER - 73)) | (1L << (L_PAREN - 73)) | (1L << (L_BRACKET - 73)) | (1L << (STAR - 73)) | (1L << (RECEIVE - 73)))) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << DOM) | (1L << PRED))) != 0) || ((((_la - 74)) & ~0x3f) == 0 && ((1L << (_la - 74)) & ((1L << (FUNC - 74)) | (1L << (INTERFACE - 74)) | (1L << (MAP - 74)) | (1L << (STRUCT - 74)) | (1L << (CHAN - 74)) | (1L << (IDENTIFIER - 74)) | (1L << (L_PAREN - 74)) | (1L << (L_BRACKET - 74)) | (1L << (STAR - 74)) | (1L << (RECEIVE - 74)))) != 0)) {
{
setState(1141);
type_();
@@ -7268,7 +7268,7 @@ public final Slice_Context slice_() throws RecognitionException {
setState(1172);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)) | (1L << (EXCLAMATION - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (EXCLAMATION - 128)) | (1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) {
{
setState(1171);
low();
@@ -7280,7 +7280,7 @@ public final Slice_Context slice_() throws RecognitionException {
setState(1176);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)) | (1L << (EXCLAMATION - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (EXCLAMATION - 128)) | (1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) {
{
setState(1175);
high();
@@ -7294,7 +7294,7 @@ public final Slice_Context slice_() throws RecognitionException {
setState(1179);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)) | (1L << (EXCLAMATION - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (EXCLAMATION - 128)) | (1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) {
{
setState(1178);
low();
@@ -7470,12 +7470,12 @@ public final Assign_opContext assign_op() throws RecognitionException {
setState(1197);
_errHandler.sync(this);
_la = _input.LA(1);
- if (((((_la - 121)) & ~0x3f) == 0 && ((1L << (_la - 121)) & ((1L << (OR - 121)) | (1L << (DIV - 121)) | (1L << (MOD - 121)) | (1L << (LSHIFT - 121)) | (1L << (RSHIFT - 121)) | (1L << (BIT_CLEAR - 121)) | (1L << (PLUS - 121)) | (1L << (MINUS - 121)) | (1L << (CARET - 121)) | (1L << (STAR - 121)) | (1L << (AMPERSAND - 121)))) != 0)) {
+ if (((((_la - 122)) & ~0x3f) == 0 && ((1L << (_la - 122)) & ((1L << (OR - 122)) | (1L << (DIV - 122)) | (1L << (MOD - 122)) | (1L << (LSHIFT - 122)) | (1L << (RSHIFT - 122)) | (1L << (BIT_CLEAR - 122)) | (1L << (PLUS - 122)) | (1L << (MINUS - 122)) | (1L << (CARET - 122)) | (1L << (STAR - 122)) | (1L << (AMPERSAND - 122)))) != 0)) {
{
setState(1196);
((Assign_opContext)_localctx).ass_op = _input.LT(1);
_la = _input.LA(1);
- if ( !(((((_la - 121)) & ~0x3f) == 0 && ((1L << (_la - 121)) & ((1L << (OR - 121)) | (1L << (DIV - 121)) | (1L << (MOD - 121)) | (1L << (LSHIFT - 121)) | (1L << (RSHIFT - 121)) | (1L << (BIT_CLEAR - 121)) | (1L << (PLUS - 121)) | (1L << (MINUS - 121)) | (1L << (CARET - 121)) | (1L << (STAR - 121)) | (1L << (AMPERSAND - 121)))) != 0)) ) {
+ if ( !(((((_la - 122)) & ~0x3f) == 0 && ((1L << (_la - 122)) & ((1L << (OR - 122)) | (1L << (DIV - 122)) | (1L << (MOD - 122)) | (1L << (LSHIFT - 122)) | (1L << (RSHIFT - 122)) | (1L << (BIT_CLEAR - 122)) | (1L << (PLUS - 122)) | (1L << (MINUS - 122)) | (1L << (CARET - 122)) | (1L << (STAR - 122)) | (1L << (AMPERSAND - 122)))) != 0)) ) {
((Assign_opContext)_localctx).ass_op = (Token)_errHandler.recoverInline(this);
}
else {
@@ -7501,6 +7501,96 @@ public final Assign_opContext assign_op() throws RecognitionException {
return _localctx;
}
+ public static class RangeClauseContext extends ParserRuleContext {
+ public TerminalNode RANGE() { return getToken(GobraParser.RANGE, 0); }
+ public ExpressionContext expression() {
+ return getRuleContext(ExpressionContext.class,0);
+ }
+ public ExpressionListContext expressionList() {
+ return getRuleContext(ExpressionListContext.class,0);
+ }
+ public TerminalNode ASSIGN() { return getToken(GobraParser.ASSIGN, 0); }
+ public MaybeAddressableIdentifierListContext maybeAddressableIdentifierList() {
+ return getRuleContext(MaybeAddressableIdentifierListContext.class,0);
+ }
+ public TerminalNode DECLARE_ASSIGN() { return getToken(GobraParser.DECLARE_ASSIGN, 0); }
+ public TerminalNode WITH() { return getToken(GobraParser.WITH, 0); }
+ public TerminalNode IDENTIFIER() { return getToken(GobraParser.IDENTIFIER, 0); }
+ public RangeClauseContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_rangeClause; }
+ @Override
+ public T accept(ParseTreeVisitor extends T> visitor) {
+ if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor extends T>)visitor).visitRangeClause(this);
+ else return visitor.visitChildren(this);
+ }
+ }
+
+ public final RangeClauseContext rangeClause() throws RecognitionException {
+ RangeClauseContext _localctx = new RangeClauseContext(_ctx, getState());
+ enterRule(_localctx, 196, RULE_rangeClause);
+ int _la;
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(1207);
+ _errHandler.sync(this);
+ switch ( getInterpreter().adaptivePredict(_input,99,_ctx) ) {
+ case 1:
+ {
+ setState(1201);
+ expressionList();
+ setState(1202);
+ match(ASSIGN);
+ }
+ break;
+ case 2:
+ {
+ setState(1204);
+ maybeAddressableIdentifierList();
+ setState(1205);
+ match(DECLARE_ASSIGN);
+ }
+ break;
+ }
+ setState(1209);
+ match(RANGE);
+ setState(1210);
+ expression(0);
+ setState(1215);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ if (_la==WITH) {
+ {
+ setState(1211);
+ match(WITH);
+ setState(1213);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ if (_la==IDENTIFIER) {
+ {
+ setState(1212);
+ match(IDENTIFIER);
+ }
+ }
+
+ }
+ }
+
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
public static class PackageClauseContext extends ParserRuleContext {
public Token packageName;
public TerminalNode PACKAGE() { return getToken(GobraParser.PACKAGE, 0); }
@@ -7518,13 +7608,13 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final PackageClauseContext packageClause() throws RecognitionException {
PackageClauseContext _localctx = new PackageClauseContext(_ctx, getState());
- enterRule(_localctx, 196, RULE_packageClause);
+ enterRule(_localctx, 198, RULE_packageClause);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1201);
+ setState(1217);
match(PACKAGE);
- setState(1202);
+ setState(1218);
((PackageClauseContext)_localctx).packageName = match(IDENTIFIER);
}
}
@@ -7556,11 +7646,11 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ImportPathContext importPath() throws RecognitionException {
ImportPathContext _localctx = new ImportPathContext(_ctx, getState());
- enterRule(_localctx, 198, RULE_importPath);
+ enterRule(_localctx, 200, RULE_importPath);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1204);
+ setState(1220);
string_();
}
}
@@ -7598,29 +7688,29 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final DeclarationContext declaration() throws RecognitionException {
DeclarationContext _localctx = new DeclarationContext(_ctx, getState());
- enterRule(_localctx, 200, RULE_declaration);
+ enterRule(_localctx, 202, RULE_declaration);
try {
- setState(1209);
+ setState(1225);
_errHandler.sync(this);
switch (_input.LA(1)) {
case CONST:
enterOuterAlt(_localctx, 1);
{
- setState(1206);
+ setState(1222);
constDecl();
}
break;
case TYPE:
enterOuterAlt(_localctx, 2);
{
- setState(1207);
+ setState(1223);
typeDecl();
}
break;
case VAR:
enterOuterAlt(_localctx, 3);
{
- setState(1208);
+ setState(1224);
varDecl();
}
break;
@@ -7668,43 +7758,43 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ConstDeclContext constDecl() throws RecognitionException {
ConstDeclContext _localctx = new ConstDeclContext(_ctx, getState());
- enterRule(_localctx, 202, RULE_constDecl);
+ enterRule(_localctx, 204, RULE_constDecl);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1211);
+ setState(1227);
match(CONST);
- setState(1223);
+ setState(1239);
_errHandler.sync(this);
switch (_input.LA(1)) {
case IDENTIFIER:
{
- setState(1212);
+ setState(1228);
constSpec();
}
break;
case L_PAREN:
{
- setState(1213);
+ setState(1229);
match(L_PAREN);
- setState(1219);
+ setState(1235);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==IDENTIFIER) {
{
{
- setState(1214);
+ setState(1230);
constSpec();
- setState(1215);
+ setState(1231);
eos();
}
}
- setState(1221);
+ setState(1237);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(1222);
+ setState(1238);
match(R_PAREN);
}
break;
@@ -7748,31 +7838,31 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ConstSpecContext constSpec() throws RecognitionException {
ConstSpecContext _localctx = new ConstSpecContext(_ctx, getState());
- enterRule(_localctx, 204, RULE_constSpec);
+ enterRule(_localctx, 206, RULE_constSpec);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1225);
+ setState(1241);
identifierList();
- setState(1231);
+ setState(1247);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,103,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,106,_ctx) ) {
case 1:
{
- setState(1227);
+ setState(1243);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << DOM) | (1L << PRED))) != 0) || ((((_la - 73)) & ~0x3f) == 0 && ((1L << (_la - 73)) & ((1L << (FUNC - 73)) | (1L << (INTERFACE - 73)) | (1L << (MAP - 73)) | (1L << (STRUCT - 73)) | (1L << (CHAN - 73)) | (1L << (IDENTIFIER - 73)) | (1L << (L_PAREN - 73)) | (1L << (L_BRACKET - 73)) | (1L << (STAR - 73)) | (1L << (RECEIVE - 73)))) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << DOM) | (1L << PRED))) != 0) || ((((_la - 74)) & ~0x3f) == 0 && ((1L << (_la - 74)) & ((1L << (FUNC - 74)) | (1L << (INTERFACE - 74)) | (1L << (MAP - 74)) | (1L << (STRUCT - 74)) | (1L << (CHAN - 74)) | (1L << (IDENTIFIER - 74)) | (1L << (L_PAREN - 74)) | (1L << (L_BRACKET - 74)) | (1L << (STAR - 74)) | (1L << (RECEIVE - 74)))) != 0)) {
{
- setState(1226);
+ setState(1242);
type_();
}
}
- setState(1229);
+ setState(1245);
match(ASSIGN);
- setState(1230);
+ setState(1246);
expressionList();
}
break;
@@ -7812,30 +7902,30 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final IdentifierListContext identifierList() throws RecognitionException {
IdentifierListContext _localctx = new IdentifierListContext(_ctx, getState());
- enterRule(_localctx, 206, RULE_identifierList);
+ enterRule(_localctx, 208, RULE_identifierList);
try {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(1233);
+ setState(1249);
match(IDENTIFIER);
- setState(1238);
+ setState(1254);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,104,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,107,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- setState(1234);
+ setState(1250);
match(COMMA);
- setState(1235);
+ setState(1251);
match(IDENTIFIER);
}
}
}
- setState(1240);
+ setState(1256);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,104,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,107,_ctx);
}
}
}
@@ -7874,30 +7964,30 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ExpressionListContext expressionList() throws RecognitionException {
ExpressionListContext _localctx = new ExpressionListContext(_ctx, getState());
- enterRule(_localctx, 208, RULE_expressionList);
+ enterRule(_localctx, 210, RULE_expressionList);
try {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(1241);
+ setState(1257);
expression(0);
- setState(1246);
+ setState(1262);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,105,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,108,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- setState(1242);
+ setState(1258);
match(COMMA);
- setState(1243);
+ setState(1259);
expression(0);
}
}
}
- setState(1248);
+ setState(1264);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,105,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,108,_ctx);
}
}
}
@@ -7941,43 +8031,43 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final TypeDeclContext typeDecl() throws RecognitionException {
TypeDeclContext _localctx = new TypeDeclContext(_ctx, getState());
- enterRule(_localctx, 210, RULE_typeDecl);
+ enterRule(_localctx, 212, RULE_typeDecl);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1249);
+ setState(1265);
match(TYPE);
- setState(1261);
+ setState(1277);
_errHandler.sync(this);
switch (_input.LA(1)) {
case IDENTIFIER:
{
- setState(1250);
+ setState(1266);
typeSpec();
}
break;
case L_PAREN:
{
- setState(1251);
+ setState(1267);
match(L_PAREN);
- setState(1257);
+ setState(1273);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==IDENTIFIER) {
{
{
- setState(1252);
+ setState(1268);
typeSpec();
- setState(1253);
+ setState(1269);
eos();
}
}
- setState(1259);
+ setState(1275);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(1260);
+ setState(1276);
match(R_PAREN);
}
break;
@@ -8016,24 +8106,24 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final TypeSpecContext typeSpec() throws RecognitionException {
TypeSpecContext _localctx = new TypeSpecContext(_ctx, getState());
- enterRule(_localctx, 212, RULE_typeSpec);
+ enterRule(_localctx, 214, RULE_typeSpec);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1263);
+ setState(1279);
match(IDENTIFIER);
- setState(1265);
+ setState(1281);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==ASSIGN) {
{
- setState(1264);
+ setState(1280);
match(ASSIGN);
}
}
- setState(1267);
+ setState(1283);
type_();
}
}
@@ -8077,43 +8167,43 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final VarDeclContext varDecl() throws RecognitionException {
VarDeclContext _localctx = new VarDeclContext(_ctx, getState());
- enterRule(_localctx, 214, RULE_varDecl);
+ enterRule(_localctx, 216, RULE_varDecl);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1269);
+ setState(1285);
match(VAR);
- setState(1281);
+ setState(1297);
_errHandler.sync(this);
switch (_input.LA(1)) {
case IDENTIFIER:
{
- setState(1270);
+ setState(1286);
varSpec();
}
break;
case L_PAREN:
{
- setState(1271);
+ setState(1287);
match(L_PAREN);
- setState(1277);
+ setState(1293);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==IDENTIFIER) {
{
{
- setState(1272);
+ setState(1288);
varSpec();
- setState(1273);
+ setState(1289);
eos();
}
}
- setState(1279);
+ setState(1295);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(1280);
+ setState(1296);
match(R_PAREN);
}
break;
@@ -8152,23 +8242,23 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final BlockContext block() throws RecognitionException {
BlockContext _localctx = new BlockContext(_ctx, getState());
- enterRule(_localctx, 216, RULE_block);
+ enterRule(_localctx, 218, RULE_block);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1283);
+ setState(1299);
match(L_CURLY);
- setState(1285);
+ setState(1301);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,111,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,114,_ctx) ) {
case 1:
{
- setState(1284);
+ setState(1300);
statementList();
}
break;
}
- setState(1287);
+ setState(1303);
match(R_CURLY);
}
}
@@ -8209,12 +8299,12 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final StatementListContext statementList() throws RecognitionException {
StatementListContext _localctx = new StatementListContext(_ctx, getState());
- enterRule(_localctx, 218, RULE_statementList);
+ enterRule(_localctx, 220, RULE_statementList);
try {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(1295);
+ setState(1311);
_errHandler.sync(this);
_alt = 1;
do {
@@ -8222,19 +8312,19 @@ public final StatementListContext statementList() throws RecognitionException {
case 1:
{
{
- setState(1290);
+ setState(1306);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,112,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,115,_ctx) ) {
case 1:
{
- setState(1289);
+ setState(1305);
eos();
}
break;
}
- setState(1292);
+ setState(1308);
statement();
- setState(1293);
+ setState(1309);
eos();
}
}
@@ -8242,9 +8332,9 @@ public final StatementListContext statementList() throws RecognitionException {
default:
throw new NoViableAltException(this);
}
- setState(1297);
+ setState(1313);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,113,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,116,_ctx);
} while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER );
}
}
@@ -8288,43 +8378,43 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final SimpleStmtContext simpleStmt() throws RecognitionException {
SimpleStmtContext _localctx = new SimpleStmtContext(_ctx, getState());
- enterRule(_localctx, 220, RULE_simpleStmt);
+ enterRule(_localctx, 222, RULE_simpleStmt);
try {
- setState(1304);
+ setState(1320);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,114,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,117,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(1299);
+ setState(1315);
sendStmt();
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(1300);
+ setState(1316);
incDecStmt();
}
break;
case 3:
enterOuterAlt(_localctx, 3);
{
- setState(1301);
+ setState(1317);
assignment();
}
break;
case 4:
enterOuterAlt(_localctx, 4);
{
- setState(1302);
+ setState(1318);
expressionStmt();
}
break;
case 5:
enterOuterAlt(_localctx, 5);
{
- setState(1303);
+ setState(1319);
shortVarDecl();
}
break;
@@ -8358,11 +8448,11 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ExpressionStmtContext expressionStmt() throws RecognitionException {
ExpressionStmtContext _localctx = new ExpressionStmtContext(_ctx, getState());
- enterRule(_localctx, 222, RULE_expressionStmt);
+ enterRule(_localctx, 224, RULE_expressionStmt);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1306);
+ setState(1322);
expression(0);
}
}
@@ -8399,15 +8489,15 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final SendStmtContext sendStmt() throws RecognitionException {
SendStmtContext _localctx = new SendStmtContext(_ctx, getState());
- enterRule(_localctx, 224, RULE_sendStmt);
+ enterRule(_localctx, 226, RULE_sendStmt);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1308);
+ setState(1324);
((SendStmtContext)_localctx).channel = expression(0);
- setState(1309);
+ setState(1325);
match(RECEIVE);
- setState(1310);
+ setState(1326);
expression(0);
}
}
@@ -8441,14 +8531,14 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final IncDecStmtContext incDecStmt() throws RecognitionException {
IncDecStmtContext _localctx = new IncDecStmtContext(_ctx, getState());
- enterRule(_localctx, 226, RULE_incDecStmt);
+ enterRule(_localctx, 228, RULE_incDecStmt);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1312);
+ setState(1328);
expression(0);
- setState(1313);
+ setState(1329);
_la = _input.LA(1);
if ( !(_la==PLUS_PLUS || _la==MINUS_MINUS) ) {
_errHandler.recoverInline(this);
@@ -8494,15 +8584,15 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final AssignmentContext assignment() throws RecognitionException {
AssignmentContext _localctx = new AssignmentContext(_ctx, getState());
- enterRule(_localctx, 228, RULE_assignment);
+ enterRule(_localctx, 230, RULE_assignment);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1315);
+ setState(1331);
expressionList();
- setState(1316);
+ setState(1332);
assign_op();
- setState(1317);
+ setState(1333);
expressionList();
}
}
@@ -8533,12 +8623,12 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final EmptyStmtContext emptyStmt() throws RecognitionException {
EmptyStmtContext _localctx = new EmptyStmtContext(_ctx, getState());
- enterRule(_localctx, 230, RULE_emptyStmt);
+ enterRule(_localctx, 232, RULE_emptyStmt);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1319);
+ setState(1335);
_la = _input.LA(1);
if ( !(_la==SEMI || _la==EOS) ) {
_errHandler.recoverInline(this);
@@ -8580,20 +8670,20 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final LabeledStmtContext labeledStmt() throws RecognitionException {
LabeledStmtContext _localctx = new LabeledStmtContext(_ctx, getState());
- enterRule(_localctx, 232, RULE_labeledStmt);
+ enterRule(_localctx, 234, RULE_labeledStmt);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1321);
+ setState(1337);
match(IDENTIFIER);
- setState(1322);
+ setState(1338);
match(COLON);
- setState(1324);
+ setState(1340);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,115,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,118,_ctx) ) {
case 1:
{
- setState(1323);
+ setState(1339);
statement();
}
break;
@@ -8629,18 +8719,18 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ReturnStmtContext returnStmt() throws RecognitionException {
ReturnStmtContext _localctx = new ReturnStmtContext(_ctx, getState());
- enterRule(_localctx, 234, RULE_returnStmt);
+ enterRule(_localctx, 236, RULE_returnStmt);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1326);
+ setState(1342);
match(RETURN);
- setState(1328);
+ setState(1344);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,116,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,119,_ctx) ) {
case 1:
{
- setState(1327);
+ setState(1343);
expressionList();
}
break;
@@ -8674,18 +8764,18 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final BreakStmtContext breakStmt() throws RecognitionException {
BreakStmtContext _localctx = new BreakStmtContext(_ctx, getState());
- enterRule(_localctx, 236, RULE_breakStmt);
+ enterRule(_localctx, 238, RULE_breakStmt);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1330);
+ setState(1346);
match(BREAK);
- setState(1332);
+ setState(1348);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,117,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,120,_ctx) ) {
case 1:
{
- setState(1331);
+ setState(1347);
match(IDENTIFIER);
}
break;
@@ -8719,18 +8809,18 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ContinueStmtContext continueStmt() throws RecognitionException {
ContinueStmtContext _localctx = new ContinueStmtContext(_ctx, getState());
- enterRule(_localctx, 238, RULE_continueStmt);
+ enterRule(_localctx, 240, RULE_continueStmt);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1334);
+ setState(1350);
match(CONTINUE);
- setState(1336);
+ setState(1352);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,118,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,121,_ctx) ) {
case 1:
{
- setState(1335);
+ setState(1351);
match(IDENTIFIER);
}
break;
@@ -8764,13 +8854,13 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final GotoStmtContext gotoStmt() throws RecognitionException {
GotoStmtContext _localctx = new GotoStmtContext(_ctx, getState());
- enterRule(_localctx, 240, RULE_gotoStmt);
+ enterRule(_localctx, 242, RULE_gotoStmt);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1338);
+ setState(1354);
match(GOTO);
- setState(1339);
+ setState(1355);
match(IDENTIFIER);
}
}
@@ -8800,11 +8890,11 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final FallthroughStmtContext fallthroughStmt() throws RecognitionException {
FallthroughStmtContext _localctx = new FallthroughStmtContext(_ctx, getState());
- enterRule(_localctx, 242, RULE_fallthroughStmt);
+ enterRule(_localctx, 244, RULE_fallthroughStmt);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1341);
+ setState(1357);
match(FALLTHROUGH);
}
}
@@ -8853,61 +8943,61 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final IfStmtContext ifStmt() throws RecognitionException {
IfStmtContext _localctx = new IfStmtContext(_ctx, getState());
- enterRule(_localctx, 244, RULE_ifStmt);
+ enterRule(_localctx, 246, RULE_ifStmt);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1343);
+ setState(1359);
match(IF);
- setState(1352);
+ setState(1368);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,119,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,122,_ctx) ) {
case 1:
{
- setState(1344);
+ setState(1360);
expression(0);
}
break;
case 2:
{
- setState(1345);
+ setState(1361);
eos();
- setState(1346);
+ setState(1362);
expression(0);
}
break;
case 3:
{
- setState(1348);
+ setState(1364);
simpleStmt();
- setState(1349);
+ setState(1365);
eos();
- setState(1350);
+ setState(1366);
expression(0);
}
break;
}
- setState(1354);
+ setState(1370);
block();
- setState(1360);
+ setState(1376);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,121,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,124,_ctx) ) {
case 1:
{
- setState(1355);
+ setState(1371);
match(ELSE);
- setState(1358);
+ setState(1374);
_errHandler.sync(this);
switch (_input.LA(1)) {
case IF:
{
- setState(1356);
+ setState(1372);
ifStmt();
}
break;
case L_CURLY:
{
- setState(1357);
+ setState(1373);
block();
}
break;
@@ -8950,22 +9040,22 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final SwitchStmtContext switchStmt() throws RecognitionException {
SwitchStmtContext _localctx = new SwitchStmtContext(_ctx, getState());
- enterRule(_localctx, 246, RULE_switchStmt);
+ enterRule(_localctx, 248, RULE_switchStmt);
try {
- setState(1364);
+ setState(1380);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,122,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,125,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(1362);
+ setState(1378);
exprSwitchStmt();
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(1363);
+ setState(1379);
typeSwitchStmt();
}
break;
@@ -9014,24 +9104,24 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException {
ExprSwitchStmtContext _localctx = new ExprSwitchStmtContext(_ctx, getState());
- enterRule(_localctx, 248, RULE_exprSwitchStmt);
+ enterRule(_localctx, 250, RULE_exprSwitchStmt);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1366);
+ setState(1382);
match(SWITCH);
- setState(1377);
+ setState(1393);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,126,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,129,_ctx) ) {
case 1:
{
- setState(1368);
+ setState(1384);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)) | (1L << (EXCLAMATION - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (EXCLAMATION - 128)) | (1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) {
{
- setState(1367);
+ setState(1383);
expression(0);
}
}
@@ -9040,24 +9130,24 @@ public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException
break;
case 2:
{
- setState(1371);
+ setState(1387);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,124,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,127,_ctx) ) {
case 1:
{
- setState(1370);
+ setState(1386);
simpleStmt();
}
break;
}
- setState(1373);
+ setState(1389);
eos();
- setState(1375);
+ setState(1391);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)) | (1L << (EXCLAMATION - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (EXCLAMATION - 128)) | (1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) {
{
- setState(1374);
+ setState(1390);
expression(0);
}
}
@@ -9065,23 +9155,23 @@ public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException
}
break;
}
- setState(1379);
+ setState(1395);
match(L_CURLY);
- setState(1383);
+ setState(1399);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==DEFAULT || _la==CASE) {
{
{
- setState(1380);
+ setState(1396);
exprCaseClause();
}
}
- setState(1385);
+ setState(1401);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(1386);
+ setState(1402);
match(R_CURLY);
}
}
@@ -9117,20 +9207,20 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ExprCaseClauseContext exprCaseClause() throws RecognitionException {
ExprCaseClauseContext _localctx = new ExprCaseClauseContext(_ctx, getState());
- enterRule(_localctx, 250, RULE_exprCaseClause);
+ enterRule(_localctx, 252, RULE_exprCaseClause);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1388);
+ setState(1404);
exprSwitchCase();
- setState(1389);
+ setState(1405);
match(COLON);
- setState(1391);
+ setState(1407);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,128,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,131,_ctx) ) {
case 1:
{
- setState(1390);
+ setState(1406);
statementList();
}
break;
@@ -9167,24 +9257,24 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ExprSwitchCaseContext exprSwitchCase() throws RecognitionException {
ExprSwitchCaseContext _localctx = new ExprSwitchCaseContext(_ctx, getState());
- enterRule(_localctx, 252, RULE_exprSwitchCase);
+ enterRule(_localctx, 254, RULE_exprSwitchCase);
try {
- setState(1396);
+ setState(1412);
_errHandler.sync(this);
switch (_input.LA(1)) {
case CASE:
enterOuterAlt(_localctx, 1);
{
- setState(1393);
+ setState(1409);
match(CASE);
- setState(1394);
+ setState(1410);
expressionList();
}
break;
case DEFAULT:
enterOuterAlt(_localctx, 2);
{
- setState(1395);
+ setState(1411);
match(DEFAULT);
}
break;
@@ -9235,58 +9325,58 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final TypeSwitchStmtContext typeSwitchStmt() throws RecognitionException {
TypeSwitchStmtContext _localctx = new TypeSwitchStmtContext(_ctx, getState());
- enterRule(_localctx, 254, RULE_typeSwitchStmt);
+ enterRule(_localctx, 256, RULE_typeSwitchStmt);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1398);
+ setState(1414);
match(SWITCH);
- setState(1407);
+ setState(1423);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,130,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,133,_ctx) ) {
case 1:
{
- setState(1399);
+ setState(1415);
typeSwitchGuard();
}
break;
case 2:
{
- setState(1400);
+ setState(1416);
eos();
- setState(1401);
+ setState(1417);
typeSwitchGuard();
}
break;
case 3:
{
- setState(1403);
+ setState(1419);
simpleStmt();
- setState(1404);
+ setState(1420);
eos();
- setState(1405);
+ setState(1421);
typeSwitchGuard();
}
break;
}
- setState(1409);
+ setState(1425);
match(L_CURLY);
- setState(1413);
+ setState(1429);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==DEFAULT || _la==CASE) {
{
{
- setState(1410);
+ setState(1426);
typeCaseClause();
}
}
- setState(1415);
+ setState(1431);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(1416);
+ setState(1432);
match(R_CURLY);
}
}
@@ -9324,31 +9414,31 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final TypeSwitchGuardContext typeSwitchGuard() throws RecognitionException {
TypeSwitchGuardContext _localctx = new TypeSwitchGuardContext(_ctx, getState());
- enterRule(_localctx, 256, RULE_typeSwitchGuard);
+ enterRule(_localctx, 258, RULE_typeSwitchGuard);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1420);
+ setState(1436);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,132,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,135,_ctx) ) {
case 1:
{
- setState(1418);
+ setState(1434);
match(IDENTIFIER);
- setState(1419);
+ setState(1435);
match(DECLARE_ASSIGN);
}
break;
}
- setState(1422);
+ setState(1438);
primaryExpr(0);
- setState(1423);
+ setState(1439);
match(DOT);
- setState(1424);
+ setState(1440);
match(L_PAREN);
- setState(1425);
+ setState(1441);
match(TYPE);
- setState(1426);
+ setState(1442);
match(R_PAREN);
}
}
@@ -9384,20 +9474,20 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final TypeCaseClauseContext typeCaseClause() throws RecognitionException {
TypeCaseClauseContext _localctx = new TypeCaseClauseContext(_ctx, getState());
- enterRule(_localctx, 258, RULE_typeCaseClause);
+ enterRule(_localctx, 260, RULE_typeCaseClause);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1428);
+ setState(1444);
typeSwitchCase();
- setState(1429);
+ setState(1445);
match(COLON);
- setState(1431);
+ setState(1447);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,133,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,136,_ctx) ) {
case 1:
{
- setState(1430);
+ setState(1446);
statementList();
}
break;
@@ -9434,24 +9524,24 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final TypeSwitchCaseContext typeSwitchCase() throws RecognitionException {
TypeSwitchCaseContext _localctx = new TypeSwitchCaseContext(_ctx, getState());
- enterRule(_localctx, 260, RULE_typeSwitchCase);
+ enterRule(_localctx, 262, RULE_typeSwitchCase);
try {
- setState(1436);
+ setState(1452);
_errHandler.sync(this);
switch (_input.LA(1)) {
case CASE:
enterOuterAlt(_localctx, 1);
{
- setState(1433);
+ setState(1449);
match(CASE);
- setState(1434);
+ setState(1450);
typeList();
}
break;
case DEFAULT:
enterOuterAlt(_localctx, 2);
{
- setState(1435);
+ setState(1451);
match(DEFAULT);
}
break;
@@ -9498,12 +9588,12 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final TypeListContext typeList() throws RecognitionException {
TypeListContext _localctx = new TypeListContext(_ctx, getState());
- enterRule(_localctx, 262, RULE_typeList);
+ enterRule(_localctx, 264, RULE_typeList);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1440);
+ setState(1456);
_errHandler.sync(this);
switch (_input.LA(1)) {
case GHOST:
@@ -9525,28 +9615,28 @@ public final TypeListContext typeList() throws RecognitionException {
case STAR:
case RECEIVE:
{
- setState(1438);
+ setState(1454);
type_();
}
break;
case NIL_LIT:
{
- setState(1439);
+ setState(1455);
match(NIL_LIT);
}
break;
default:
throw new NoViableAltException(this);
}
- setState(1449);
+ setState(1465);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==COMMA) {
{
{
- setState(1442);
+ setState(1458);
match(COMMA);
- setState(1445);
+ setState(1461);
_errHandler.sync(this);
switch (_input.LA(1)) {
case GHOST:
@@ -9568,13 +9658,13 @@ public final TypeListContext typeList() throws RecognitionException {
case STAR:
case RECEIVE:
{
- setState(1443);
+ setState(1459);
type_();
}
break;
case NIL_LIT:
{
- setState(1444);
+ setState(1460);
match(NIL_LIT);
}
break;
@@ -9583,7 +9673,7 @@ public final TypeListContext typeList() throws RecognitionException {
}
}
}
- setState(1451);
+ setState(1467);
_errHandler.sync(this);
_la = _input.LA(1);
}
@@ -9623,30 +9713,30 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final SelectStmtContext selectStmt() throws RecognitionException {
SelectStmtContext _localctx = new SelectStmtContext(_ctx, getState());
- enterRule(_localctx, 264, RULE_selectStmt);
+ enterRule(_localctx, 266, RULE_selectStmt);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1452);
+ setState(1468);
match(SELECT);
- setState(1453);
+ setState(1469);
match(L_CURLY);
- setState(1457);
+ setState(1473);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==DEFAULT || _la==CASE) {
{
{
- setState(1454);
+ setState(1470);
commClause();
}
}
- setState(1459);
+ setState(1475);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(1460);
+ setState(1476);
match(R_CURLY);
}
}
@@ -9682,20 +9772,20 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final CommClauseContext commClause() throws RecognitionException {
CommClauseContext _localctx = new CommClauseContext(_ctx, getState());
- enterRule(_localctx, 266, RULE_commClause);
+ enterRule(_localctx, 268, RULE_commClause);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1462);
+ setState(1478);
commCase();
- setState(1463);
+ setState(1479);
match(COLON);
- setState(1465);
+ setState(1481);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,139,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,142,_ctx) ) {
case 1:
{
- setState(1464);
+ setState(1480);
statementList();
}
break;
@@ -9735,28 +9825,28 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final CommCaseContext commCase() throws RecognitionException {
CommCaseContext _localctx = new CommCaseContext(_ctx, getState());
- enterRule(_localctx, 268, RULE_commCase);
+ enterRule(_localctx, 270, RULE_commCase);
try {
- setState(1473);
+ setState(1489);
_errHandler.sync(this);
switch (_input.LA(1)) {
case CASE:
enterOuterAlt(_localctx, 1);
{
- setState(1467);
+ setState(1483);
match(CASE);
- setState(1470);
+ setState(1486);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,140,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,143,_ctx) ) {
case 1:
{
- setState(1468);
+ setState(1484);
sendStmt();
}
break;
case 2:
{
- setState(1469);
+ setState(1485);
recvStmt();
}
break;
@@ -9766,7 +9856,7 @@ public final CommCaseContext commCase() throws RecognitionException {
case DEFAULT:
enterOuterAlt(_localctx, 2);
{
- setState(1472);
+ setState(1488);
match(DEFAULT);
}
break;
@@ -9811,31 +9901,31 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final RecvStmtContext recvStmt() throws RecognitionException {
RecvStmtContext _localctx = new RecvStmtContext(_ctx, getState());
- enterRule(_localctx, 270, RULE_recvStmt);
+ enterRule(_localctx, 272, RULE_recvStmt);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1481);
+ setState(1497);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,142,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,145,_ctx) ) {
case 1:
{
- setState(1475);
+ setState(1491);
expressionList();
- setState(1476);
+ setState(1492);
match(ASSIGN);
}
break;
case 2:
{
- setState(1478);
+ setState(1494);
identifierList();
- setState(1479);
+ setState(1495);
match(DECLARE_ASSIGN);
}
break;
}
- setState(1483);
+ setState(1499);
((RecvStmtContext)_localctx).recvExpr = expression(0);
}
}
@@ -9877,35 +9967,35 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ForStmtContext forStmt() throws RecognitionException {
ForStmtContext _localctx = new ForStmtContext(_ctx, getState());
- enterRule(_localctx, 272, RULE_forStmt);
+ enterRule(_localctx, 274, RULE_forStmt);
try {
enterOuterAlt(_localctx, 1);
{
- setState(1485);
+ setState(1501);
match(FOR);
- setState(1489);
+ setState(1505);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,143,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,146,_ctx) ) {
case 1:
{
- setState(1486);
+ setState(1502);
expression(0);
}
break;
case 2:
{
- setState(1487);
+ setState(1503);
forClause();
}
break;
case 3:
{
- setState(1488);
+ setState(1504);
rangeClause();
}
break;
}
- setState(1491);
+ setState(1507);
block();
}
}
@@ -9951,41 +10041,41 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ForClauseContext forClause() throws RecognitionException {
ForClauseContext _localctx = new ForClauseContext(_ctx, getState());
- enterRule(_localctx, 274, RULE_forClause);
+ enterRule(_localctx, 276, RULE_forClause);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(1494);
+ setState(1510);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,144,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,147,_ctx) ) {
case 1:
{
- setState(1493);
+ setState(1509);
((ForClauseContext)_localctx).initStmt = simpleStmt();
}
break;
}
- setState(1496);
+ setState(1512);
eos();
- setState(1498);
+ setState(1514);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,145,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,148,_ctx) ) {
case 1:
{
- setState(1497);
+ setState(1513);
expression(0);
}
break;
}
- setState(1500);
+ setState(1516);
eos();
- setState(1502);
+ setState(1518);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)) | (1L << (EXCLAMATION - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (EXCLAMATION - 128)) | (1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) {
{
- setState(1501);
+ setState(1517);
((ForClauseContext)_localctx).postStmt = simpleStmt();
}
}
@@ -10003,73 +10093,6 @@ public final ForClauseContext forClause() throws RecognitionException {
return _localctx;
}
- public static class RangeClauseContext extends ParserRuleContext {
- public TerminalNode RANGE() { return getToken(GobraParser.RANGE, 0); }
- public ExpressionContext expression() {
- return getRuleContext(ExpressionContext.class,0);
- }
- public ExpressionListContext expressionList() {
- return getRuleContext(ExpressionListContext.class,0);
- }
- public TerminalNode ASSIGN() { return getToken(GobraParser.ASSIGN, 0); }
- public IdentifierListContext identifierList() {
- return getRuleContext(IdentifierListContext.class,0);
- }
- public TerminalNode DECLARE_ASSIGN() { return getToken(GobraParser.DECLARE_ASSIGN, 0); }
- public RangeClauseContext(ParserRuleContext parent, int invokingState) {
- super(parent, invokingState);
- }
- @Override public int getRuleIndex() { return RULE_rangeClause; }
- @Override
- public T accept(ParseTreeVisitor extends T> visitor) {
- if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor extends T>)visitor).visitRangeClause(this);
- else return visitor.visitChildren(this);
- }
- }
-
- public final RangeClauseContext rangeClause() throws RecognitionException {
- RangeClauseContext _localctx = new RangeClauseContext(_ctx, getState());
- enterRule(_localctx, 276, RULE_rangeClause);
- try {
- enterOuterAlt(_localctx, 1);
- {
- setState(1510);
- _errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,147,_ctx) ) {
- case 1:
- {
- setState(1504);
- expressionList();
- setState(1505);
- match(ASSIGN);
- }
- break;
- case 2:
- {
- setState(1507);
- identifierList();
- setState(1508);
- match(DECLARE_ASSIGN);
- }
- break;
- }
- setState(1512);
- match(RANGE);
- setState(1513);
- expression(0);
- }
- }
- catch (RecognitionException re) {
- _localctx.exception = re;
- _errHandler.reportError(this, re);
- _errHandler.recover(this, re);
- }
- finally {
- exitRule();
- }
- return _localctx;
- }
-
public static class GoStmtContext extends ParserRuleContext {
public TerminalNode GO() { return getToken(GobraParser.GO, 0); }
public ExpressionContext expression() {
@@ -10092,9 +10115,9 @@ public final GoStmtContext goStmt() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1515);
+ setState(1520);
match(GO);
- setState(1516);
+ setState(1521);
expression(0);
}
}
@@ -10129,20 +10152,20 @@ public final TypeNameContext typeName() throws RecognitionException {
TypeNameContext _localctx = new TypeNameContext(_ctx, getState());
enterRule(_localctx, 280, RULE_typeName);
try {
- setState(1520);
+ setState(1525);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,148,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,150,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(1518);
+ setState(1523);
qualifiedIdent();
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(1519);
+ setState(1524);
match(IDENTIFIER);
}
break;
@@ -10185,13 +10208,13 @@ public final ArrayTypeContext arrayType() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1522);
+ setState(1527);
match(L_BRACKET);
- setState(1523);
+ setState(1528);
arrayLength();
- setState(1524);
+ setState(1529);
match(R_BRACKET);
- setState(1525);
+ setState(1530);
elementType();
}
}
@@ -10227,7 +10250,7 @@ public final ArrayLengthContext arrayLength() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1527);
+ setState(1532);
expression(0);
}
}
@@ -10263,7 +10286,7 @@ public final ElementTypeContext elementType() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1529);
+ setState(1534);
type_();
}
}
@@ -10300,9 +10323,9 @@ public final PointerTypeContext pointerType() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1531);
+ setState(1536);
match(STAR);
- setState(1532);
+ setState(1537);
type_();
}
}
@@ -10340,11 +10363,11 @@ public final SliceTypeContext sliceType() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1534);
+ setState(1539);
match(L_BRACKET);
- setState(1535);
+ setState(1540);
match(R_BRACKET);
- setState(1536);
+ setState(1541);
elementType();
}
}
@@ -10386,15 +10409,15 @@ public final MapTypeContext mapType() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1538);
+ setState(1543);
match(MAP);
- setState(1539);
+ setState(1544);
match(L_BRACKET);
- setState(1540);
+ setState(1545);
type_();
- setState(1541);
+ setState(1546);
match(R_BRACKET);
- setState(1542);
+ setState(1547);
elementType();
}
}
@@ -10432,33 +10455,33 @@ public final ChannelTypeContext channelType() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1549);
+ setState(1554);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,149,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,151,_ctx) ) {
case 1:
{
- setState(1544);
+ setState(1549);
match(CHAN);
}
break;
case 2:
{
- setState(1545);
+ setState(1550);
match(CHAN);
- setState(1546);
+ setState(1551);
match(RECEIVE);
}
break;
case 3:
{
- setState(1547);
+ setState(1552);
match(RECEIVE);
- setState(1548);
+ setState(1553);
match(CHAN);
}
break;
}
- setState(1551);
+ setState(1556);
elementType();
}
}
@@ -10495,9 +10518,9 @@ public final FunctionTypeContext functionType() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1553);
+ setState(1558);
match(FUNC);
- setState(1554);
+ setState(1559);
signature();
}
}
@@ -10534,22 +10557,22 @@ public final SignatureContext signature() throws RecognitionException {
SignatureContext _localctx = new SignatureContext(_ctx, getState());
enterRule(_localctx, 298, RULE_signature);
try {
- setState(1560);
+ setState(1565);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,150,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,152,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(1556);
+ setState(1561);
parameters();
- setState(1557);
+ setState(1562);
result();
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(1559);
+ setState(1564);
parameters();
}
break;
@@ -10588,20 +10611,20 @@ public final ResultContext result() throws RecognitionException {
ResultContext _localctx = new ResultContext(_ctx, getState());
enterRule(_localctx, 300, RULE_result);
try {
- setState(1564);
+ setState(1569);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,151,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,153,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(1562);
+ setState(1567);
parameters();
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(1563);
+ setState(1568);
type_();
}
break;
@@ -10650,39 +10673,39 @@ public final ParametersContext parameters() throws RecognitionException {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(1566);
+ setState(1571);
match(L_PAREN);
- setState(1578);
+ setState(1583);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << DOM) | (1L << PRED))) != 0) || ((((_la - 73)) & ~0x3f) == 0 && ((1L << (_la - 73)) & ((1L << (FUNC - 73)) | (1L << (INTERFACE - 73)) | (1L << (MAP - 73)) | (1L << (STRUCT - 73)) | (1L << (CHAN - 73)) | (1L << (IDENTIFIER - 73)) | (1L << (L_PAREN - 73)) | (1L << (L_BRACKET - 73)) | (1L << (ELLIPSIS - 73)) | (1L << (STAR - 73)) | (1L << (RECEIVE - 73)))) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << DOM) | (1L << PRED))) != 0) || ((((_la - 74)) & ~0x3f) == 0 && ((1L << (_la - 74)) & ((1L << (FUNC - 74)) | (1L << (INTERFACE - 74)) | (1L << (MAP - 74)) | (1L << (STRUCT - 74)) | (1L << (CHAN - 74)) | (1L << (IDENTIFIER - 74)) | (1L << (L_PAREN - 74)) | (1L << (L_BRACKET - 74)) | (1L << (ELLIPSIS - 74)) | (1L << (STAR - 74)) | (1L << (RECEIVE - 74)))) != 0)) {
{
- setState(1567);
- parameterDecl();
setState(1572);
+ parameterDecl();
+ setState(1577);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,152,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,154,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- setState(1568);
+ setState(1573);
match(COMMA);
- setState(1569);
+ setState(1574);
parameterDecl();
}
}
}
- setState(1574);
+ setState(1579);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,152,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,154,_ctx);
}
- setState(1576);
+ setState(1581);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==COMMA) {
{
- setState(1575);
+ setState(1580);
match(COMMA);
}
}
@@ -10690,7 +10713,7 @@ public final ParametersContext parameters() throws RecognitionException {
}
}
- setState(1580);
+ setState(1585);
match(R_PAREN);
}
}
@@ -10733,23 +10756,23 @@ public final ConversionContext conversion() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1582);
+ setState(1587);
nonNamedType();
- setState(1583);
+ setState(1588);
match(L_PAREN);
- setState(1584);
+ setState(1589);
expression(0);
- setState(1586);
+ setState(1591);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==COMMA) {
{
- setState(1585);
+ setState(1590);
match(COMMA);
}
}
- setState(1588);
+ setState(1593);
match(R_PAREN);
}
}
@@ -10788,7 +10811,7 @@ public final NonNamedTypeContext nonNamedType() throws RecognitionException {
NonNamedTypeContext _localctx = new NonNamedTypeContext(_ctx, getState());
enterRule(_localctx, 306, RULE_nonNamedType);
try {
- setState(1595);
+ setState(1600);
_errHandler.sync(this);
switch (_input.LA(1)) {
case PRED:
@@ -10802,18 +10825,18 @@ public final NonNamedTypeContext nonNamedType() throws RecognitionException {
case RECEIVE:
enterOuterAlt(_localctx, 1);
{
- setState(1590);
+ setState(1595);
typeLit();
}
break;
case L_PAREN:
enterOuterAlt(_localctx, 2);
{
- setState(1591);
+ setState(1596);
match(L_PAREN);
- setState(1592);
+ setState(1597);
nonNamedType();
- setState(1593);
+ setState(1598);
match(R_PAREN);
}
break;
@@ -10859,31 +10882,31 @@ public final OperandContext operand() throws RecognitionException {
OperandContext _localctx = new OperandContext(_ctx, getState());
enterRule(_localctx, 308, RULE_operand);
try {
- setState(1603);
+ setState(1608);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,157,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,159,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(1597);
+ setState(1602);
literal();
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(1598);
+ setState(1603);
operandName();
}
break;
case 3:
enterOuterAlt(_localctx, 3);
{
- setState(1599);
+ setState(1604);
match(L_PAREN);
- setState(1600);
+ setState(1605);
expression(0);
- setState(1601);
+ setState(1606);
match(R_PAREN);
}
break;
@@ -10925,7 +10948,7 @@ public final LiteralContext literal() throws RecognitionException {
LiteralContext _localctx = new LiteralContext(_ctx, getState());
enterRule(_localctx, 310, RULE_literal);
try {
- setState(1608);
+ setState(1613);
_errHandler.sync(this);
switch (_input.LA(1)) {
case FLOAT_LIT:
@@ -10942,7 +10965,7 @@ public final LiteralContext literal() throws RecognitionException {
case INTERPRETED_STRING_LIT:
enterOuterAlt(_localctx, 1);
{
- setState(1605);
+ setState(1610);
basicLit();
}
break;
@@ -10959,7 +10982,7 @@ public final LiteralContext literal() throws RecognitionException {
case L_BRACKET:
enterOuterAlt(_localctx, 2);
{
- setState(1606);
+ setState(1611);
compositeLit();
}
break;
@@ -10972,7 +10995,7 @@ public final LiteralContext literal() throws RecognitionException {
case FUNC:
enterOuterAlt(_localctx, 3);
{
- setState(1607);
+ setState(1612);
functionLit();
}
break;
@@ -11016,9 +11039,9 @@ public final IntegerContext integer() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1610);
+ setState(1615);
_la = _input.LA(1);
- if ( !(((((_la - 134)) & ~0x3f) == 0 && ((1L << (_la - 134)) & ((1L << (DECIMAL_LIT - 134)) | (1L << (BINARY_LIT - 134)) | (1L << (OCTAL_LIT - 134)) | (1L << (HEX_LIT - 134)) | (1L << (IMAGINARY_LIT - 134)) | (1L << (RUNE_LIT - 134)))) != 0)) ) {
+ if ( !(((((_la - 135)) & ~0x3f) == 0 && ((1L << (_la - 135)) & ((1L << (DECIMAL_LIT - 135)) | (1L << (BINARY_LIT - 135)) | (1L << (OCTAL_LIT - 135)) | (1L << (HEX_LIT - 135)) | (1L << (IMAGINARY_LIT - 135)) | (1L << (RUNE_LIT - 135)))) != 0)) ) {
_errHandler.recoverInline(this);
}
else {
@@ -11058,7 +11081,7 @@ public final OperandNameContext operandName() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1612);
+ setState(1617);
match(IDENTIFIER);
}
}
@@ -11096,11 +11119,11 @@ public final QualifiedIdentContext qualifiedIdent() throws RecognitionException
try {
enterOuterAlt(_localctx, 1);
{
- setState(1614);
+ setState(1619);
match(IDENTIFIER);
- setState(1615);
+ setState(1620);
match(DOT);
- setState(1616);
+ setState(1621);
match(IDENTIFIER);
}
}
@@ -11139,9 +11162,9 @@ public final CompositeLitContext compositeLit() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1618);
+ setState(1623);
literalType();
- setState(1619);
+ setState(1624);
literalValue();
}
}
@@ -11181,21 +11204,21 @@ public final LiteralValueContext literalValue() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1621);
- match(L_CURLY);
setState(1626);
+ match(L_CURLY);
+ setState(1631);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_CURLY - 64)) | (1L << (L_BRACKET - 64)) | (1L << (EXCLAMATION - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_CURLY - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (EXCLAMATION - 128)) | (1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) {
{
- setState(1622);
+ setState(1627);
elementList();
- setState(1624);
+ setState(1629);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==COMMA) {
{
- setState(1623);
+ setState(1628);
match(COMMA);
}
}
@@ -11203,7 +11226,7 @@ public final LiteralValueContext literalValue() throws RecognitionException {
}
}
- setState(1628);
+ setState(1633);
match(R_CURLY);
}
}
@@ -11247,25 +11270,25 @@ public final ElementListContext elementList() throws RecognitionException {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(1630);
- keyedElement();
setState(1635);
+ keyedElement();
+ setState(1640);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,161,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,163,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- setState(1631);
+ setState(1636);
match(COMMA);
- setState(1632);
+ setState(1637);
keyedElement();
}
}
}
- setState(1637);
+ setState(1642);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,161,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,163,_ctx);
}
}
}
@@ -11305,19 +11328,19 @@ public final KeyedElementContext keyedElement() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1641);
+ setState(1646);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,162,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,164,_ctx) ) {
case 1:
{
- setState(1638);
+ setState(1643);
key();
- setState(1639);
+ setState(1644);
match(COLON);
}
break;
}
- setState(1643);
+ setState(1648);
element();
}
}
@@ -11354,7 +11377,7 @@ public final KeyContext key() throws RecognitionException {
KeyContext _localctx = new KeyContext(_ctx, getState());
enterRule(_localctx, 326, RULE_key);
try {
- setState(1647);
+ setState(1652);
_errHandler.sync(this);
switch (_input.LA(1)) {
case FLOAT_LIT:
@@ -11419,14 +11442,14 @@ public final KeyContext key() throws RecognitionException {
case INTERPRETED_STRING_LIT:
enterOuterAlt(_localctx, 1);
{
- setState(1645);
+ setState(1650);
expression(0);
}
break;
case L_CURLY:
enterOuterAlt(_localctx, 2);
{
- setState(1646);
+ setState(1651);
literalValue();
}
break;
@@ -11467,7 +11490,7 @@ public final ElementContext element() throws RecognitionException {
ElementContext _localctx = new ElementContext(_ctx, getState());
enterRule(_localctx, 328, RULE_element);
try {
- setState(1651);
+ setState(1656);
_errHandler.sync(this);
switch (_input.LA(1)) {
case FLOAT_LIT:
@@ -11532,14 +11555,14 @@ public final ElementContext element() throws RecognitionException {
case INTERPRETED_STRING_LIT:
enterOuterAlt(_localctx, 1);
{
- setState(1649);
+ setState(1654);
expression(0);
}
break;
case L_CURLY:
enterOuterAlt(_localctx, 2);
{
- setState(1650);
+ setState(1655);
literalValue();
}
break;
@@ -11592,27 +11615,27 @@ public final StructTypeContext structType() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1653);
+ setState(1658);
match(STRUCT);
- setState(1654);
+ setState(1659);
match(L_CURLY);
- setState(1660);
+ setState(1665);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==IDENTIFIER || _la==STAR) {
{
{
- setState(1655);
+ setState(1660);
fieldDecl();
- setState(1656);
+ setState(1661);
eos();
}
}
- setState(1662);
+ setState(1667);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(1663);
+ setState(1668);
match(R_CURLY);
}
}
@@ -11658,30 +11681,30 @@ public final FieldDeclContext fieldDecl() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1669);
+ setState(1674);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,166,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,168,_ctx) ) {
case 1:
{
- setState(1665);
+ setState(1670);
identifierList();
- setState(1666);
+ setState(1671);
type_();
}
break;
case 2:
{
- setState(1668);
+ setState(1673);
embeddedField();
}
break;
}
- setState(1672);
+ setState(1677);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,167,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,169,_ctx) ) {
case 1:
{
- setState(1671);
+ setState(1676);
((FieldDeclContext)_localctx).tag = string_();
}
break;
@@ -11720,7 +11743,7 @@ public final String_Context string_() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1674);
+ setState(1679);
_la = _input.LA(1);
if ( !(_la==RAW_STRING_LIT || _la==INTERPRETED_STRING_LIT) ) {
_errHandler.recoverInline(this);
@@ -11766,17 +11789,17 @@ public final EmbeddedFieldContext embeddedField() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1677);
+ setState(1682);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==STAR) {
{
- setState(1676);
+ setState(1681);
match(STAR);
}
}
- setState(1679);
+ setState(1684);
typeName();
}
}
@@ -11814,11 +11837,11 @@ public final IndexContext index() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1681);
+ setState(1686);
match(L_BRACKET);
- setState(1682);
+ setState(1687);
expression(0);
- setState(1683);
+ setState(1688);
match(R_BRACKET);
}
}
@@ -11857,13 +11880,13 @@ public final TypeAssertionContext typeAssertion() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1685);
+ setState(1690);
match(DOT);
- setState(1686);
+ setState(1691);
match(L_PAREN);
- setState(1687);
+ setState(1692);
type_();
- setState(1688);
+ setState(1693);
match(R_PAREN);
}
}
@@ -11910,34 +11933,34 @@ public final ArgumentsContext arguments() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1690);
+ setState(1695);
match(L_PAREN);
- setState(1705);
+ setState(1710);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)) | (1L << (EXCLAMATION - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (EXCLAMATION - 128)) | (1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) {
{
- setState(1697);
+ setState(1702);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,170,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,172,_ctx) ) {
case 1:
{
- setState(1691);
+ setState(1696);
expressionList();
}
break;
case 2:
{
- setState(1692);
+ setState(1697);
nonNamedType();
- setState(1695);
+ setState(1700);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,169,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,171,_ctx) ) {
case 1:
{
- setState(1693);
+ setState(1698);
match(COMMA);
- setState(1694);
+ setState(1699);
expressionList();
}
break;
@@ -11945,22 +11968,22 @@ public final ArgumentsContext arguments() throws RecognitionException {
}
break;
}
- setState(1700);
+ setState(1705);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==ELLIPSIS) {
{
- setState(1699);
+ setState(1704);
match(ELLIPSIS);
}
}
- setState(1703);
+ setState(1708);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==COMMA) {
{
- setState(1702);
+ setState(1707);
match(COMMA);
}
}
@@ -11968,7 +11991,7 @@ public final ArgumentsContext arguments() throws RecognitionException {
}
}
- setState(1707);
+ setState(1712);
match(R_PAREN);
}
}
@@ -12006,11 +12029,11 @@ public final MethodExprContext methodExpr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1709);
+ setState(1714);
nonNamedType();
- setState(1710);
+ setState(1715);
match(DOT);
- setState(1711);
+ setState(1716);
match(IDENTIFIER);
}
}
@@ -12046,7 +12069,7 @@ public final ReceiverTypeContext receiverType() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1713);
+ setState(1718);
type_();
}
}
@@ -12080,34 +12103,34 @@ public final EosContext eos() throws RecognitionException {
EosContext _localctx = new EosContext(_ctx, getState());
enterRule(_localctx, 348, RULE_eos);
try {
- setState(1719);
+ setState(1724);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,174,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,176,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(1715);
+ setState(1720);
match(SEMI);
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(1716);
+ setState(1721);
match(EOF);
}
break;
case 3:
enterOuterAlt(_localctx, 3);
{
- setState(1717);
+ setState(1722);
match(EOS);
}
break;
case 4:
enterOuterAlt(_localctx, 4);
{
- setState(1718);
+ setState(1723);
if (!(closingBracket())) throw new FailedPredicateException(this, "closingBracket()");
}
break;
@@ -12190,7 +12213,7 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) {
}
public static final String _serializedATN =
- "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\u009e\u06bc\4\2\t"+
+ "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\u009f\u06c1\4\2\t"+
"\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13"+
"\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+
"\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+
@@ -12270,613 +12293,615 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) {
"\u047e\13\\\3\\\5\\\u0481\n\\\5\\\u0483\n\\\3\\\3\\\3]\3]\3]\3]\3]\3]"+
"\3]\5]\u048e\n]\3^\3^\3^\3^\3^\3_\3_\5_\u0497\n_\3_\3_\5_\u049b\n_\3_"+
"\5_\u049e\n_\3_\3_\3_\3_\3_\5_\u04a5\n_\3_\3_\3`\3`\3a\3a\3b\3b\3c\5c"+
- "\u04b0\nc\3c\3c\3d\3d\3d\3e\3e\3f\3f\3f\5f\u04bc\nf\3g\3g\3g\3g\3g\3g"+
- "\7g\u04c4\ng\fg\16g\u04c7\13g\3g\5g\u04ca\ng\3h\3h\5h\u04ce\nh\3h\3h\5"+
- "h\u04d2\nh\3i\3i\3i\7i\u04d7\ni\fi\16i\u04da\13i\3j\3j\3j\7j\u04df\nj"+
- "\fj\16j\u04e2\13j\3k\3k\3k\3k\3k\3k\7k\u04ea\nk\fk\16k\u04ed\13k\3k\5"+
- "k\u04f0\nk\3l\3l\5l\u04f4\nl\3l\3l\3m\3m\3m\3m\3m\3m\7m\u04fe\nm\fm\16"+
- "m\u0501\13m\3m\5m\u0504\nm\3n\3n\5n\u0508\nn\3n\3n\3o\5o\u050d\no\3o\3"+
- "o\3o\6o\u0512\no\ro\16o\u0513\3p\3p\3p\3p\3p\5p\u051b\np\3q\3q\3r\3r\3"+
- "r\3r\3s\3s\3s\3t\3t\3t\3t\3u\3u\3v\3v\3v\5v\u052f\nv\3w\3w\5w\u0533\n"+
- "w\3x\3x\5x\u0537\nx\3y\3y\5y\u053b\ny\3z\3z\3z\3{\3{\3|\3|\3|\3|\3|\3"+
- "|\3|\3|\3|\5|\u054b\n|\3|\3|\3|\3|\5|\u0551\n|\5|\u0553\n|\3}\3}\5}\u0557"+
- "\n}\3~\3~\5~\u055b\n~\3~\5~\u055e\n~\3~\3~\5~\u0562\n~\5~\u0564\n~\3~"+
- "\3~\7~\u0568\n~\f~\16~\u056b\13~\3~\3~\3\177\3\177\3\177\5\177\u0572\n"+
- "\177\3\u0080\3\u0080\3\u0080\5\u0080\u0577\n\u0080\3\u0081\3\u0081\3\u0081"+
- "\3\u0081\3\u0081\3\u0081\3\u0081\3\u0081\3\u0081\5\u0081\u0582\n\u0081"+
- "\3\u0081\3\u0081\7\u0081\u0586\n\u0081\f\u0081\16\u0081\u0589\13\u0081"+
- "\3\u0081\3\u0081\3\u0082\3\u0082\5\u0082\u058f\n\u0082\3\u0082\3\u0082"+
- "\3\u0082\3\u0082\3\u0082\3\u0082\3\u0083\3\u0083\3\u0083\5\u0083\u059a"+
- "\n\u0083\3\u0084\3\u0084\3\u0084\5\u0084\u059f\n\u0084\3\u0085\3\u0085"+
- "\5\u0085\u05a3\n\u0085\3\u0085\3\u0085\3\u0085\5\u0085\u05a8\n\u0085\7"+
- "\u0085\u05aa\n\u0085\f\u0085\16\u0085\u05ad\13\u0085\3\u0086\3\u0086\3"+
- "\u0086\7\u0086\u05b2\n\u0086\f\u0086\16\u0086\u05b5\13\u0086\3\u0086\3"+
- "\u0086\3\u0087\3\u0087\3\u0087\5\u0087\u05bc\n\u0087\3\u0088\3\u0088\3"+
- "\u0088\5\u0088\u05c1\n\u0088\3\u0088\5\u0088\u05c4\n\u0088\3\u0089\3\u0089"+
- "\3\u0089\3\u0089\3\u0089\3\u0089\5\u0089\u05cc\n\u0089\3\u0089\3\u0089"+
- "\3\u008a\3\u008a\3\u008a\3\u008a\5\u008a\u05d4\n\u008a\3\u008a\3\u008a"+
- "\3\u008b\5\u008b\u05d9\n\u008b\3\u008b\3\u008b\5\u008b\u05dd\n\u008b\3"+
- "\u008b\3\u008b\5\u008b\u05e1\n\u008b\3\u008c\3\u008c\3\u008c\3\u008c\3"+
- "\u008c\3\u008c\5\u008c\u05e9\n\u008c\3\u008c\3\u008c\3\u008c\3\u008d\3"+
- "\u008d\3\u008d\3\u008e\3\u008e\5\u008e\u05f3\n\u008e\3\u008f\3\u008f\3"+
- "\u008f\3\u008f\3\u008f\3\u0090\3\u0090\3\u0091\3\u0091\3\u0092\3\u0092"+
- "\3\u0092\3\u0093\3\u0093\3\u0093\3\u0093\3\u0094\3\u0094\3\u0094\3\u0094"+
- "\3\u0094\3\u0094\3\u0095\3\u0095\3\u0095\3\u0095\3\u0095\5\u0095\u0610"+
- "\n\u0095\3\u0095\3\u0095\3\u0096\3\u0096\3\u0096\3\u0097\3\u0097\3\u0097"+
- "\3\u0097\5\u0097\u061b\n\u0097\3\u0098\3\u0098\5\u0098\u061f\n\u0098\3"+
- "\u0099\3\u0099\3\u0099\3\u0099\7\u0099\u0625\n\u0099\f\u0099\16\u0099"+
- "\u0628\13\u0099\3\u0099\5\u0099\u062b\n\u0099\5\u0099\u062d\n\u0099\3"+
- "\u0099\3\u0099\3\u009a\3\u009a\3\u009a\3\u009a\5\u009a\u0635\n\u009a\3"+
- "\u009a\3\u009a\3\u009b\3\u009b\3\u009b\3\u009b\3\u009b\5\u009b\u063e\n"+
- "\u009b\3\u009c\3\u009c\3\u009c\3\u009c\3\u009c\3\u009c\5\u009c\u0646\n"+
- "\u009c\3\u009d\3\u009d\3\u009d\5\u009d\u064b\n\u009d\3\u009e\3\u009e\3"+
- "\u009f\3\u009f\3\u00a0\3\u00a0\3\u00a0\3\u00a0\3\u00a1\3\u00a1\3\u00a1"+
- "\3\u00a2\3\u00a2\3\u00a2\5\u00a2\u065b\n\u00a2\5\u00a2\u065d\n\u00a2\3"+
- "\u00a2\3\u00a2\3\u00a3\3\u00a3\3\u00a3\7\u00a3\u0664\n\u00a3\f\u00a3\16"+
- "\u00a3\u0667\13\u00a3\3\u00a4\3\u00a4\3\u00a4\5\u00a4\u066c\n\u00a4\3"+
- "\u00a4\3\u00a4\3\u00a5\3\u00a5\5\u00a5\u0672\n\u00a5\3\u00a6\3\u00a6\5"+
- "\u00a6\u0676\n\u00a6\3\u00a7\3\u00a7\3\u00a7\3\u00a7\3\u00a7\7\u00a7\u067d"+
- "\n\u00a7\f\u00a7\16\u00a7\u0680\13\u00a7\3\u00a7\3\u00a7\3\u00a8\3\u00a8"+
- "\3\u00a8\3\u00a8\5\u00a8\u0688\n\u00a8\3\u00a8\5\u00a8\u068b\n\u00a8\3"+
- "\u00a9\3\u00a9\3\u00aa\5\u00aa\u0690\n\u00aa\3\u00aa\3\u00aa\3\u00ab\3"+
- "\u00ab\3\u00ab\3\u00ab\3\u00ac\3\u00ac\3\u00ac\3\u00ac\3\u00ac\3\u00ad"+
- "\3\u00ad\3\u00ad\3\u00ad\3\u00ad\5\u00ad\u06a2\n\u00ad\5\u00ad\u06a4\n"+
- "\u00ad\3\u00ad\5\u00ad\u06a7\n\u00ad\3\u00ad\5\u00ad\u06aa\n\u00ad\5\u00ad"+
- "\u06ac\n\u00ad\3\u00ad\3\u00ad\3\u00ae\3\u00ae\3\u00ae\3\u00ae\3\u00af"+
- "\3\u00af\3\u00b0\3\u00b0\3\u00b0\3\u00b0\5\u00b0\u06ba\n\u00b0\3\u00b0"+
- "\3\u02a1\4\u0092\u00a2\u00b1\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \""+
- "$&(*,.\60\62\64\668:<>@BDFHJLNPRTVXZ\\^`bdfhjlnprtvxz|~\u0080\u0082\u0084"+
- "\u0086\u0088\u008a\u008c\u008e\u0090\u0092\u0094\u0096\u0098\u009a\u009c"+
- "\u009e\u00a0\u00a2\u00a4\u00a6\u00a8\u00aa\u00ac\u00ae\u00b0\u00b2\u00b4"+
- "\u00b6\u00b8\u00ba\u00bc\u00be\u00c0\u00c2\u00c4\u00c6\u00c8\u00ca\u00cc"+
- "\u00ce\u00d0\u00d2\u00d4\u00d6\u00d8\u00da\u00dc\u00de\u00e0\u00e2\u00e4"+
- "\u00e6\u00e8\u00ea\u00ec\u00ee\u00f0\u00f2\u00f4\u00f6\u00f8\u00fa\u00fc"+
- "\u00fe\u0100\u0102\u0104\u0106\u0108\u010a\u010c\u010e\u0110\u0112\u0114"+
- "\u0116\u0118\u011a\u011c\u011e\u0120\u0122\u0124\u0126\u0128\u012a\u012c"+
- "\u012e\u0130\u0132\u0134\u0136\u0138\u013a\u013c\u013e\u0140\u0142\u0144"+
- "\u0146\u0148\u014a\u014c\u014e\u0150\u0152\u0154\u0156\u0158\u015a\u015c"+
- "\u015e\2\25\4\2ccnn\3\2\31\32\3\2\7\n\3\2@A\3\2)+\4\2)+--\3\2\u0081\u0087"+
- "\3\2\26\27\4\2|\u0080\u0085\u0086\6\2$$oo{{\u0082\u0084\3\2 \"\3\2\35"+
- "\37\4\2GHuz\6\2..\61\61\64\64[[\4\2{\u0080\u0082\u0086\3\2op\4\2ll\u009d"+
- "\u009d\4\2\u0088\u008b\u008d\u008e\3\2\u0094\u0095\2\u0718\2\u0160\3\2"+
- "\2\2\4\u0163\3\2\2\2\6\u0166\3\2\2\2\b\u0169\3\2\2\2\n\u0171\3\2\2\2\f"+
- "\u017a\3\2\2\2\16\u0195\3\2\2\2\20\u0198\3\2\2\2\22\u01a0\3\2\2\2\24\u01ad"+
- "\3\2\2\2\26\u01c3\3\2\2\2\30\u01cb\3\2\2\2\32\u01cd\3\2\2\2\34\u01cf\3"+
- "\2\2\2\36\u01d2\3\2\2\2 \u01e5\3\2\2\2\"\u01e7\3\2\2\2$\u01e9\3\2\2\2"+
- "&\u01ee\3\2\2\2(\u01f9\3\2\2\2*\u0206\3\2\2\2,\u0209\3\2\2\2.\u0214\3"+
- "\2\2\2\60\u0216\3\2\2\2\62\u021b\3\2\2\2\64\u0220\3\2\2\2\66\u0225\3\2"+
- "\2\28\u022a\3\2\2\2:\u0237\3\2\2\2<\u0239\3\2\2\2>\u023b\3\2\2\2@\u0240"+
- "\3\2\2\2B\u0245\3\2\2\2D\u024a\3\2\2\2F\u0253\3\2\2\2H\u025a\3\2\2\2J"+
- "\u0265\3\2\2\2L\u026c\3\2\2\2N\u026e\3\2\2\2P\u0283\3\2\2\2R\u0285\3\2"+
- "\2\2T\u0295\3\2\2\2V\u02a1\3\2\2\2X\u02b0\3\2\2\2Z\u02b3\3\2\2\2\\\u02bb"+
- "\3\2\2\2^\u02bd\3\2\2\2`\u02cb\3\2\2\2b\u02d7\3\2\2\2d\u02e1\3\2\2\2f"+
- "\u02e5\3\2\2\2h\u02eb\3\2\2\2j\u0303\3\2\2\2l\u030b\3\2\2\2n\u031a\3\2"+
- "\2\2p\u031c\3\2\2\2r\u0323\3\2\2\2t\u032c\3\2\2\2v\u0331\3\2\2\2x\u0336"+
- "\3\2\2\2z\u033c\3\2\2\2|\u0343\3\2\2\2~\u0348\3\2\2\2\u0080\u034e\3\2"+
- "\2\2\u0082\u0353\3\2\2\2\u0084\u035a\3\2\2\2\u0086\u0364\3\2\2\2\u0088"+
- "\u0368\3\2\2\2\u008a\u0374\3\2\2\2\u008c\u0377\3\2\2\2\u008e\u037b\3\2"+
- "\2\2\u0090\u0382\3\2\2\2\u0092\u0396\3\2\2\2\u0094\u03d2\3\2\2\2\u0096"+
- "\u03d4\3\2\2\2\u0098\u03d7\3\2\2\2\u009a\u03dc\3\2\2\2\u009c\u03e5\3\2"+
- "\2\2\u009e\u03f3\3\2\2\2\u00a0\u03fd\3\2\2\2\u00a2\u040b\3\2\2\2\u00a4"+
- "\u0426\3\2\2\2\u00a6\u0429\3\2\2\2\u00a8\u0431\3\2\2\2\u00aa\u043a\3\2"+
- "\2\2\u00ac\u044a\3\2\2\2\u00ae\u045d\3\2\2\2\u00b0\u0466\3\2\2\2\u00b2"+
- "\u0471\3\2\2\2\u00b4\u0473\3\2\2\2\u00b6\u0476\3\2\2\2\u00b8\u048d\3\2"+
- "\2\2\u00ba\u048f\3\2\2\2\u00bc\u0494\3\2\2\2\u00be\u04a8\3\2\2\2\u00c0"+
- "\u04aa\3\2\2\2\u00c2\u04ac\3\2\2\2\u00c4\u04af\3\2\2\2\u00c6\u04b3\3\2"+
- "\2\2\u00c8\u04b6\3\2\2\2\u00ca\u04bb\3\2\2\2\u00cc\u04bd\3\2\2\2\u00ce"+
- "\u04cb\3\2\2\2\u00d0\u04d3\3\2\2\2\u00d2\u04db\3\2\2\2\u00d4\u04e3\3\2"+
- "\2\2\u00d6\u04f1\3\2\2\2\u00d8\u04f7\3\2\2\2\u00da\u0505\3\2\2\2\u00dc"+
- "\u0511\3\2\2\2\u00de\u051a\3\2\2\2\u00e0\u051c\3\2\2\2\u00e2\u051e\3\2"+
- "\2\2\u00e4\u0522\3\2\2\2\u00e6\u0525\3\2\2\2\u00e8\u0529\3\2\2\2\u00ea"+
- "\u052b\3\2\2\2\u00ec\u0530\3\2\2\2\u00ee\u0534\3\2\2\2\u00f0\u0538\3\2"+
- "\2\2\u00f2\u053c\3\2\2\2\u00f4\u053f\3\2\2\2\u00f6\u0541\3\2\2\2\u00f8"+
- "\u0556\3\2\2\2\u00fa\u0558\3\2\2\2\u00fc\u056e\3\2\2\2\u00fe\u0576\3\2"+
- "\2\2\u0100\u0578\3\2\2\2\u0102\u058e\3\2\2\2\u0104\u0596\3\2\2\2\u0106"+
- "\u059e\3\2\2\2\u0108\u05a2\3\2\2\2\u010a\u05ae\3\2\2\2\u010c\u05b8\3\2"+
- "\2\2\u010e\u05c3\3\2\2\2\u0110\u05cb\3\2\2\2\u0112\u05cf\3\2\2\2\u0114"+
- "\u05d8\3\2\2\2\u0116\u05e8\3\2\2\2\u0118\u05ed\3\2\2\2\u011a\u05f2\3\2"+
- "\2\2\u011c\u05f4\3\2\2\2\u011e\u05f9\3\2\2\2\u0120\u05fb\3\2\2\2\u0122"+
- "\u05fd\3\2\2\2\u0124\u0600\3\2\2\2\u0126\u0604\3\2\2\2\u0128\u060f\3\2"+
- "\2\2\u012a\u0613\3\2\2\2\u012c\u061a\3\2\2\2\u012e\u061e\3\2\2\2\u0130"+
- "\u0620\3\2\2\2\u0132\u0630\3\2\2\2\u0134\u063d\3\2\2\2\u0136\u0645\3\2"+
- "\2\2\u0138\u064a\3\2\2\2\u013a\u064c\3\2\2\2\u013c\u064e\3\2\2\2\u013e"+
- "\u0650\3\2\2\2\u0140\u0654\3\2\2\2\u0142\u0657\3\2\2\2\u0144\u0660\3\2"+
- "\2\2\u0146\u066b\3\2\2\2\u0148\u0671\3\2\2\2\u014a\u0675\3\2\2\2\u014c"+
- "\u0677\3\2\2\2\u014e\u0687\3\2\2\2\u0150\u068c\3\2\2\2\u0152\u068f\3\2"+
- "\2\2\u0154\u0693\3\2\2\2\u0156\u0697\3\2\2\2\u0158\u069c\3\2\2\2\u015a"+
- "\u06af\3\2\2\2\u015c\u06b3\3\2\2\2\u015e\u06b9\3\2\2\2\u0160\u0161\5\u0092"+
- "J\2\u0161\u0162\7\2\2\3\u0162\3\3\2\2\2\u0163\u0164\5\u0094K\2\u0164\u0165"+
- "\7\2\2\3\u0165\5\3\2\2\2\u0166\u0167\5\u00b0Y\2\u0167\u0168\7\2\2\3\u0168"+
- "\7\3\2\2\2\u0169\u016e\5\n\6\2\u016a\u016b\7k\2\2\u016b\u016d\5\n\6\2"+
- "\u016c\u016a\3\2\2\2\u016d\u0170\3\2\2\2\u016e\u016c\3\2\2\2\u016e\u016f"+
- "\3\2\2\2\u016f\t\3\2\2\2\u0170\u016e\3\2\2\2\u0171\u0173\7c\2\2\u0172"+
- "\u0174\7;\2\2\u0173\u0172\3\2\2\2\u0173\u0174\3\2\2\2\u0174\13\3\2\2\2"+
- "\u0175\u0176\5\16\b\2\u0176\u0177\5\u015e\u00b0\2\u0177\u0179\3\2\2\2"+
- "\u0178\u0175\3\2\2\2\u0179\u017c\3\2\2\2\u017a\u0178\3\2\2\2\u017a\u017b"+
- "\3\2\2\2\u017b\u017d\3\2\2\2\u017c\u017a\3\2\2\2\u017d\u017e\5\u00c6d"+
- "\2\u017e\u0184\5\u015e\u00b0\2\u017f\u0180\5\24\13\2\u0180\u0181\5\u015e"+
- "\u00b0\2\u0181\u0183\3\2\2\2\u0182\u017f\3\2\2\2\u0183\u0186\3\2\2\2\u0184"+
- "\u0182\3\2\2\2\u0184\u0185\3\2\2\2\u0185\u0190\3\2\2\2\u0186\u0184\3\2"+
- "\2\2\u0187\u018b\5v<\2\u0188\u018b\5\u00caf\2\u0189\u018b\5\26\f\2\u018a"+
- "\u0187\3\2\2\2\u018a\u0188\3\2\2\2\u018a\u0189\3\2\2\2\u018b\u018c\3\2"+
- "\2\2\u018c\u018d\5\u015e\u00b0\2\u018d\u018f\3\2\2\2\u018e\u018a\3\2\2"+
- "\2\u018f\u0192\3\2\2\2\u0190\u018e\3\2\2\2\u0190\u0191\3\2\2\2\u0191\u0193"+
- "\3\2\2\2\u0192\u0190\3\2\2\2\u0193\u0194\7\2\2\3\u0194\r\3\2\2\2\u0195"+
- "\u0196\7D\2\2\u0196\u0197\5\u0092J\2\u0197\17\3\2\2\2\u0198\u0199\7E\2"+
- "\2\u0199\u019a\5\u0092J\2\u019a\21\3\2\2\2\u019b\u019c\5\20\t\2\u019c"+
- "\u019d\5\u015e\u00b0\2\u019d\u019f\3\2\2\2\u019e\u019b\3\2\2\2\u019f\u01a2"+
- "\3\2\2\2\u01a0\u019e\3\2\2\2\u01a0\u01a1\3\2\2\2\u01a1\u01a4\3\2\2\2\u01a2"+
- "\u01a0\3\2\2\2\u01a3\u01a5\t\2\2\2\u01a4\u01a3\3\2\2\2\u01a4\u01a5\3\2"+
- "\2\2\u01a5\u01a6\3\2\2\2\u01a6\u01a7\5\u00c8e\2\u01a7\23\3\2\2\2\u01a8"+
- "\u01a9\5\20\t\2\u01a9\u01aa\5\u015e\u00b0\2\u01aa\u01ac\3\2\2\2\u01ab"+
- "\u01a8\3\2\2\2\u01ac\u01af\3\2\2\2\u01ad\u01ab\3\2\2\2\u01ad\u01ae\3\2"+
- "\2\2\u01ae\u01bd\3\2\2\2\u01af\u01ad\3\2\2\2\u01b0\u01b1\7_\2\2\u01b1"+
- "\u01be\5\22\n\2\u01b2\u01b3\7_\2\2\u01b3\u01b9\7d\2\2\u01b4\u01b5\5\22"+
- "\n\2\u01b5\u01b6\5\u015e\u00b0\2\u01b6\u01b8\3\2\2\2\u01b7\u01b4\3\2\2"+
- "\2\u01b8\u01bb\3\2\2\2\u01b9\u01b7\3\2\2\2\u01b9\u01ba\3\2\2\2\u01ba\u01bc"+
- "\3\2\2\2\u01bb\u01b9\3\2\2\2\u01bc\u01be\7e\2\2\u01bd\u01b0\3\2\2\2\u01bd"+
- "\u01b2\3\2\2\2\u01be\25\3\2\2\2\u01bf\u01c4\5h\65\2\u01c0\u01c4\5~@\2"+
- "\u01c1\u01c4\5\u0082B\2\u01c2\u01c4\5|?\2\u01c3\u01bf\3\2\2\2\u01c3\u01c0"+
- "\3\2\2\2\u01c3\u01c1\3\2\2\2\u01c3\u01c2\3\2\2\2\u01c4\27\3\2\2\2\u01c5"+
- "\u01c6\7\34\2\2\u01c6\u01cc\5\u0094K\2\u01c7\u01c8\t\3\2\2\u01c8\u01cc"+
- "\5.\30\2\u01c9\u01ca\t\4\2\2\u01ca\u01cc\5\u0092J\2\u01cb\u01c5\3\2\2"+
- "\2\u01cb\u01c7\3\2\2\2\u01cb\u01c9\3\2\2\2\u01cc\31\3\2\2\2\u01cd\u01ce"+
- "\5\34\17\2\u01ce\33\3\2\2\2\u01cf\u01d0\5V,\2\u01d0\u01d1\5\36\20\2\u01d1"+
- "\35\3\2\2\2\u01d2\u01d3\7C\2\2\u01d3\u01d5\7d\2\2\u01d4\u01d6\5\u00dc"+
- "o\2\u01d5\u01d4\3\2\2\2\u01d5\u01d6\3\2\2\2\u01d6\u01d7\3\2\2\2\u01d7"+
- "\u01d8\7e\2\2\u01d8\37\3\2\2\2\u01d9\u01e6\5F$\2\u01da\u01e6\5D#\2\u01db"+
- "\u01e6\5B\"\2\u01dc\u01e6\5$\23\2\u01dd\u01e6\5@!\2\u01de\u01e6\58\35"+
- "\2\u01df\u01e6\5> \2\u01e0\u01e6\5\66\34\2\u01e1\u01e6\5\62\32\2\u01e2"+
- "\u01e6\5\60\31\2\u01e3\u01e6\5\64\33\2\u01e4\u01e6\5\"\22\2\u01e5\u01d9"+
- "\3\2\2\2\u01e5\u01da\3\2\2\2\u01e5\u01db\3\2\2\2\u01e5\u01dc\3\2\2\2\u01e5"+
- "\u01dd\3\2\2\2\u01e5\u01de\3\2\2\2\u01e5\u01df\3\2\2\2\u01e5\u01e0\3\2"+
- "\2\2\u01e5\u01e1\3\2\2\2\u01e5\u01e2\3\2\2\2\u01e5\u01e3\3\2\2\2\u01e5"+
- "\u01e4\3\2\2\2\u01e6!\3\2\2\2\u01e7\u01e8\t\5\2\2\u01e8#\3\2\2\2\u01e9"+
- "\u01ea\7\\\2\2\u01ea\u01eb\7h\2\2\u01eb\u01ec\5\u00b0Y\2\u01ec\u01ed\7"+
- "i\2\2\u01ed%\3\2\2\2\u01ee\u01f3\5(\25\2\u01ef\u01f0\7k\2\2\u01f0\u01f2"+
- "\5(\25\2\u01f1\u01ef\3\2\2\2\u01f2\u01f5\3\2\2\2\u01f3\u01f1\3\2\2\2\u01f3"+
- "\u01f4\3\2\2\2\u01f4\u01f7\3\2\2\2\u01f5\u01f3\3\2\2\2\u01f6\u01f8\7k"+
- "\2\2\u01f7\u01f6\3\2\2\2\u01f7\u01f8\3\2\2\2\u01f8\'\3\2\2\2\u01f9\u01fe"+
- "\7c\2\2\u01fa\u01fb\7k\2\2\u01fb\u01fd\7c\2\2\u01fc\u01fa\3\2\2\2\u01fd"+
- "\u0200\3\2\2\2\u01fe\u01fc\3\2\2\2\u01fe\u01ff\3\2\2\2\u01ff\u0201\3\2"+
- "\2\2\u0200\u01fe\3\2\2\2\u0201\u0202\5\u0120\u0091\2\u0202)\3\2\2\2\u0203"+
- "\u0205\5,\27\2\u0204\u0203\3\2\2\2\u0205\u0208\3\2\2\2\u0206\u0204\3\2"+
- "\2\2\u0206\u0207\3\2\2\2\u0207+\3\2\2\2\u0208\u0206\3\2\2\2\u0209\u020a"+
- "\7f\2\2\u020a\u020f\5\u0092J\2\u020b\u020c\7k\2\2\u020c\u020e\5\u0092"+
- "J\2\u020d\u020b\3\2\2\2\u020e\u0211\3\2\2\2\u020f\u020d\3\2\2\2\u020f"+
- "\u0210\3\2\2\2\u0210\u0212\3\2\2\2\u0211\u020f\3\2\2\2\u0212\u0213\7g"+
- "\2\2\u0213-\3\2\2\2\u0214\u0215\5\u00a2R\2\u0215/\3\2\2\2\u0216\u0217"+
- "\7\62\2\2\u0217\u0218\7d\2\2\u0218\u0219\5\u0092J\2\u0219\u021a\7e\2\2"+
- "\u021a\61\3\2\2\2\u021b\u021c\7\66\2\2\u021c\u021d\7h\2\2\u021d\u021e"+
- "\5\u00b0Y\2\u021e\u021f\7i\2\2\u021f\63\3\2\2\2\u0220\u0221\7\63\2\2\u0221"+
- "\u0222\7d\2\2\u0222\u0223\5\u0092J\2\u0223\u0224\7e\2\2\u0224\65\3\2\2"+
- "\2\u0225\u0226\t\6\2\2\u0226\u0227\7d\2\2\u0227\u0228\5\u0092J\2\u0228"+
- "\u0229\7e\2\2\u0229\67\3\2\2\2\u022a\u022f\7\23\2\2\u022b\u022c\7h\2\2"+
- "\u022c\u022d\5:\36\2\u022d\u022e\7i\2\2\u022e\u0230\3\2\2\2\u022f\u022b"+
- "\3\2\2\2\u022f\u0230\3\2\2\2\u0230\u0231\3\2\2\2\u0231\u0232\7d\2\2\u0232"+
- "\u0233\5\u0092J\2\u0233\u0234\7e\2\2\u02349\3\2\2\2\u0235\u0238\5<\37"+
- "\2\u0236\u0238\7\25\2\2\u0237\u0235\3\2\2\2\u0237\u0236\3\2\2\2\u0238"+
- ";\3\2\2\2\u0239\u023a\7c\2\2\u023a=\3\2\2\2\u023b\u023c\7\24\2\2\u023c"+
- "\u023d\7d\2\2\u023d\u023e\5\u0092J\2\u023e\u023f\7e\2\2\u023f?\3\2\2\2"+
- "\u0240\u0241\79\2\2\u0241\u0242\7d\2\2\u0242\u0243\5\u0092J\2\u0243\u0244"+
- "\7e\2\2\u0244A\3\2\2\2\u0245\u0246\78\2\2\u0246\u0247\7d\2\2\u0247\u0248"+
- "\5\u0092J\2\u0248\u0249\7e\2\2\u0249C\3\2\2\2\u024a\u024b\7\30\2\2\u024b"+
- "\u024c\7d\2\2\u024c\u024f\5\u0092J\2\u024d\u024e\7k\2\2\u024e\u0250\5"+
- "\u0092J\2\u024f\u024d\3\2\2\2\u024f\u0250\3\2\2\2\u0250\u0251\3\2\2\2"+
- "\u0251\u0252\7e\2\2\u0252E\3\2\2\2\u0253\u0254\t\6\2\2\u0254\u0255\7h"+
- "\2\2\u0255\u0256\5\u0092J\2\u0256\u0257\7<\2\2\u0257\u0258\5\u0092J\2"+
- "\u0258\u0259\7i\2\2\u0259G\3\2\2\2\u025a\u025b\7h\2\2\u025b\u0260\5J&"+
- "\2\u025c\u025d\7k\2\2\u025d\u025f\5J&\2\u025e\u025c\3\2\2\2\u025f\u0262"+
- "\3\2\2\2\u0260\u025e\3\2\2\2\u0260\u0261\3\2\2\2\u0261\u0263\3\2\2\2\u0262"+
- "\u0260\3\2\2\2\u0263\u0264\7i\2\2\u0264I\3\2\2\2\u0265\u0266\5\u0092J"+
- "\2\u0266\u0267\7j\2\2\u0267\u0268\5\u0092J\2\u0268K\3\2\2\2\u0269\u026d"+
- "\5T+\2\u026a\u026d\5R*\2\u026b\u026d\5N(\2\u026c\u0269\3\2\2\2\u026c\u026a"+
- "\3\2\2\2\u026c\u026b\3\2\2\2\u026dM\3\2\2\2\u026e\u026f\7\64\2\2\u026f"+
- "\u0275\7f\2\2\u0270\u0271\5P)\2\u0271\u0272\5\u015e\u00b0\2\u0272\u0274"+
- "\3\2\2\2\u0273\u0270\3\2\2\2\u0274\u0277\3\2\2\2\u0275\u0273\3\2\2\2\u0275"+
- "\u0276\3\2\2\2\u0276\u0278\3\2\2\2\u0277\u0275\3\2\2\2\u0278\u0279\7g"+
- "\2\2\u0279O\3\2\2\2\u027a\u027b\7K\2\2\u027b\u027c\7c\2\2\u027c\u0284"+
- "\5\u012c\u0097\2\u027d\u027e\7\65\2\2\u027e\u027f\7f\2\2\u027f\u0280\5"+
- "\u0092J\2\u0280\u0281\5\u015e\u00b0\2\u0281\u0282\7g\2\2\u0282\u0284\3"+
- "\2\2\2\u0283\u027a\3\2\2\2\u0283\u027d\3\2\2\2\u0284Q\3\2\2\2\u0285\u0286"+
- "\7\34\2\2\u0286\u0287\7h\2\2\u0287\u0288\7i\2\2\u0288\u0289\5\u0120\u0091"+
- "\2\u0289S\3\2\2\2\u028a\u028b\t\7\2\2\u028b\u028c\7h\2\2\u028c\u028d\5"+
- "\u00b0Y\2\u028d\u028e\7i\2\2\u028e\u0296\3\2\2\2\u028f\u0290\7,\2\2\u0290"+
- "\u0291\7h\2\2\u0291\u0292\5\u00b0Y\2\u0292\u0293\7i\2\2\u0293\u0294\5"+
- "\u00b0Y\2\u0294\u0296\3\2\2\2\u0295\u028a\3\2\2\2\u0295\u028f\3\2\2\2"+
- "\u0296U\3\2\2\2\u0297\u029d\5X-\2\u0298\u0299\7\20\2\2\u0299\u029d\b,"+
- "\1\2\u029a\u029b\7B\2\2\u029b\u029d\b,\1\2\u029c\u0297\3\2\2\2\u029c\u0298"+
- "\3\2\2\2\u029c\u029a\3\2\2\2\u029d\u029e\3\2\2\2\u029e\u02a0\5\u015e\u00b0"+
- "\2\u029f\u029c\3\2\2\2\u02a0\u02a3\3\2\2\2\u02a1\u02a2\3\2\2\2\u02a1\u029f"+
- "\3\2\2\2\u02a2\u02a6\3\2\2\2\u02a3\u02a1\3\2\2\2\u02a4\u02a5\7\20\2\2"+
- "\u02a5\u02a7\b,\1\2\u02a6\u02a4\3\2\2\2\u02a6\u02a7\3\2\2\2\u02a7W\3\2"+
- "\2\2\u02a8\u02a9\7\13\2\2\u02a9\u02b1\5\\/\2\u02aa\u02ab\7\f\2\2\u02ab"+
- "\u02b1\5\\/\2\u02ac\u02ad\7\r\2\2\u02ad\u02b1\5\\/\2\u02ae\u02af\7\17"+
- "\2\2\u02af\u02b1\5Z.\2\u02b0\u02a8\3\2\2\2\u02b0\u02aa\3\2\2\2\u02b0\u02ac"+
- "\3\2\2\2\u02b0\u02ae\3\2\2\2\u02b1Y\3\2\2\2\u02b2\u02b4\5\u00d2j\2\u02b3"+
- "\u02b2\3\2\2\2\u02b3\u02b4\3\2\2\2\u02b4\u02b7\3\2\2\2\u02b5\u02b6\7Z"+
- "\2\2\u02b6\u02b8\5\u0092J\2\u02b7\u02b5\3\2\2\2\u02b7\u02b8\3\2\2\2\u02b8"+
- "[\3\2\2\2\u02b9\u02bc\3\2\2\2\u02ba\u02bc\5\u0092J\2\u02bb\u02b9\3\2\2"+
- "\2\u02bb\u02ba\3\2\2\2\u02bc]\3\2\2\2\u02bd\u02c2\7f\2\2\u02be\u02bf\7"+
- ":\2\2\u02bf\u02c0\5\u00d0i\2\u02c0\u02c1\5\u015e\u00b0\2\u02c1\u02c3\3"+
- "\2\2\2\u02c2\u02be\3\2\2\2\u02c2\u02c3\3\2\2\2\u02c3\u02c5\3\2\2\2\u02c4"+
- "\u02c6\5\u00dco\2\u02c5\u02c4\3\2\2\2\u02c5\u02c6\3\2\2\2\u02c6\u02c7"+
- "\3\2\2\2\u02c7\u02c8\7g\2\2\u02c8_\3\2\2\2\u02c9\u02cc\5\u013e\u00a0\2"+
- "\u02ca\u02cc\7c\2\2\u02cb\u02c9\3\2\2\2\u02cb\u02ca\3\2\2\2\u02cc\u02d5"+
- "\3\2\2\2\u02cd\u02d2\7f\2\2\u02ce\u02d0\5b\62\2\u02cf\u02d1\7k\2\2\u02d0"+
- "\u02cf\3\2\2\2\u02d0\u02d1\3\2\2\2\u02d1\u02d3\3\2\2\2\u02d2\u02ce\3\2"+
- "\2\2\u02d2\u02d3\3\2\2\2\u02d3\u02d4\3\2\2\2\u02d4\u02d6\7g\2\2\u02d5"+
- "\u02cd\3\2\2\2\u02d5\u02d6\3\2\2\2\u02d6a\3\2\2\2\u02d7\u02dc\5d\63\2"+
- "\u02d8\u02d9\7k\2\2\u02d9\u02db\5d\63\2\u02da\u02d8\3\2\2\2\u02db\u02de"+
- "\3\2\2\2\u02dc\u02da\3\2\2\2\u02dc\u02dd\3\2\2\2\u02ddc\3\2\2\2\u02de"+
- "\u02dc\3\2\2\2\u02df\u02e0\7c\2\2\u02e0\u02e2\7m\2\2\u02e1\u02df\3\2\2"+
- "\2\u02e1\u02e2\3\2\2\2\u02e2\u02e3\3\2\2\2\u02e3\u02e4\5\u0092J\2\u02e4"+
- "e\3\2\2\2\u02e5\u02e6\7F\2\2\u02e6\u02e7\5\u0092J\2\u02e7\u02e8\7\21\2"+
- "\2\u02e8\u02e9\5`\61\2\u02e9\u02ea\5\u00dan\2\u02eag\3\2\2\2\u02eb\u02ec"+
- "\5\u00b0Y\2\u02ec\u02ed\7\21\2\2\u02ed\u0300\5\u00b0Y\2\u02ee\u02f4\7"+
- "f\2\2\u02ef\u02f0\5p9\2\u02f0\u02f1\5\u015e\u00b0\2\u02f1\u02f3\3\2\2"+
- "\2\u02f2\u02ef\3\2\2\2\u02f3\u02f6\3\2\2\2\u02f4\u02f2\3\2\2\2\u02f4\u02f5"+
- "\3\2\2\2\u02f5\u02fc\3\2\2\2\u02f6\u02f4\3\2\2\2\u02f7\u02f8\5j\66\2\u02f8"+
- "\u02f9\5\u015e\u00b0\2\u02f9\u02fb\3\2\2\2\u02fa\u02f7\3\2\2\2\u02fb\u02fe"+
- "\3\2\2\2\u02fc\u02fa\3\2\2\2\u02fc\u02fd\3\2\2\2\u02fd\u02ff\3\2\2\2\u02fe"+
- "\u02fc\3\2\2\2\u02ff\u0301\7g\2\2\u0300\u02ee\3\2\2\2\u0300\u0301\3\2"+
- "\2\2\u0301i\3\2\2\2\u0302\u0304\7\20\2\2\u0303\u0302\3\2\2\2\u0303\u0304"+
- "\3\2\2\2\u0304\u0305\3\2\2\2\u0305\u0306\5l\67\2\u0306\u0307\7c\2\2\u0307"+
- "\u0309\5\u012c\u0097\2\u0308\u030a\5\u00dan\2\u0309\u0308\3\2\2\2\u0309"+
- "\u030a\3\2\2\2\u030ak\3\2\2\2\u030b\u030d\7d\2\2\u030c\u030e\7c\2\2\u030d"+
- "\u030c\3\2\2\2\u030d\u030e\3\2\2\2\u030e\u0310\3\2\2\2\u030f\u0311\7\u0085"+
- "\2\2\u0310\u030f\3\2\2\2\u0310\u0311\3\2\2\2\u0311\u0312\3\2\2\2\u0312"+
- "\u0313\5\u011a\u008e\2\u0313\u0314\7e\2\2\u0314m\3\2\2\2\u0315\u031b\5"+
- "\u00a2R\2\u0316\u0317\5\u00b0Y\2\u0317\u0318\7n\2\2\u0318\u0319\7c\2\2"+
- "\u0319\u031b\3\2\2\2\u031a\u0315\3\2\2\2\u031a\u0316\3\2\2\2\u031bo\3"+
- "\2\2\2\u031c\u031d\7\67\2\2\u031d\u031e\7c\2\2\u031e\u0321\7q\2\2\u031f"+
- "\u0322\5n8\2\u0320\u0322\5\u013c\u009f\2\u0321\u031f\3\2\2\2\u0321\u0320"+
- "\3\2\2\2\u0322q\3\2\2\2\u0323\u0324\7\60\2\2\u0324\u0325\7d\2\2\u0325"+
- "\u0328\5\u00b0Y\2\u0326\u0327\7k\2\2\u0327\u0329\5\u00d2j\2\u0328\u0326"+
- "\3\2\2\2\u0328\u0329\3\2\2\2\u0329\u032a\3\2\2\2\u032a\u032b\7e\2\2\u032b"+
- "s\3\2\2\2\u032c\u032d\7/\2\2\u032d\u032e\7d\2\2\u032e\u032f\5\u00b0Y\2"+
- "\u032f\u0330\7e\2\2\u0330u\3\2\2\2\u0331\u0334\5V,\2\u0332\u0335\5x=\2"+
- "\u0333\u0335\5z>\2\u0334\u0332\3\2\2\2\u0334\u0333\3\2\2\2\u0335w\3\2"+
- "\2\2\u0336\u0337\7K\2\2\u0337\u0338\7c\2\2\u0338\u033a\5\u012c\u0097\2"+
- "\u0339\u033b\5^\60\2\u033a\u0339\3\2\2\2\u033a\u033b\3\2\2\2\u033by\3"+
- "\2\2\2\u033c\u033d\7K\2\2\u033d\u033e\5\u0088E\2\u033e\u033f\7c\2\2\u033f"+
- "\u0341\5\u012c\u0097\2\u0340\u0342\5^\60\2\u0341\u0340\3\2\2\2\u0341\u0342"+
- "\3\2\2\2\u0342{\3\2\2\2\u0343\u0346\7\34\2\2\u0344\u0347\5v<\2\u0345\u0347"+
- "\5\u00caf\2\u0346\u0344\3\2\2\2\u0346\u0345\3\2\2\2\u0347}\3\2\2\2\u0348"+
- "\u0349\7\67\2\2\u0349\u034a\7c\2\2\u034a\u034c\5\u0130\u0099\2\u034b\u034d"+
- "\5\u0080A\2\u034c\u034b\3\2\2\2\u034c\u034d\3\2\2\2\u034d\177\3\2\2\2"+
- "\u034e\u034f\7f\2\2\u034f\u0350\5\u0092J\2\u0350\u0351\5\u015e\u00b0\2"+
- "\u0351\u0352\7g\2\2\u0352\u0081\3\2\2\2\u0353\u0354\7\67\2\2\u0354\u0355"+
- "\5\u0088E\2\u0355\u0356\7c\2\2\u0356\u0358\5\u0130\u0099\2\u0357\u0359"+
- "\5\u0080A\2\u0358\u0357\3\2\2\2\u0358\u0359\3\2\2\2\u0359\u0083\3\2\2"+
- "\2\u035a\u0362\5\b\5\2\u035b\u035e\5\u00b0Y\2\u035c\u035d\7j\2\2\u035d"+
- "\u035f\5\u00d2j\2\u035e\u035c\3\2\2\2\u035e\u035f\3\2\2\2\u035f\u0363"+
- "\3\2\2\2\u0360\u0361\7j\2\2\u0361\u0363\5\u00d2j\2\u0362\u035b\3\2\2\2"+
- "\u0362\u0360\3\2\2\2\u0363\u0085\3\2\2\2\u0364\u0365\5\b\5\2\u0365\u0366"+
- "\7q\2\2\u0366\u0367\5\u00d2j\2\u0367\u0087\3\2\2\2\u0368\u036a\7d\2\2"+
- "\u0369\u036b\5\n\6\2\u036a\u0369\3\2\2\2\u036a\u036b\3\2\2\2\u036b\u036c"+
- "\3\2\2\2\u036c\u036e\5\u00b0Y\2\u036d\u036f\7k\2\2\u036e\u036d\3\2\2\2"+
- "\u036e\u036f\3\2\2\2\u036f\u0370\3\2\2\2\u0370\u0371\7e\2\2\u0371\u0089"+
- "\3\2\2\2\u0372\u0375\5\u008cG\2\u0373\u0375\5\u008eH\2\u0374\u0372\3\2"+
- "\2\2\u0374\u0373\3\2\2\2\u0375\u008b\3\2\2\2\u0376\u0378\5\u00d0i\2\u0377"+
- "\u0376\3\2\2\2\u0377\u0378\3\2\2\2\u0378\u0379\3\2\2\2\u0379\u037a\5\u0090"+
- "I\2\u037a\u008d\3\2\2\2\u037b\u037d\7\34\2\2\u037c\u037e\5\u00d0i\2\u037d"+
- "\u037c\3\2\2\2\u037d\u037e\3\2\2\2\u037e\u037f\3\2\2\2\u037f\u0380\5\u0090"+
- "I\2\u0380\u008f\3\2\2\2\u0381\u0383\7r\2\2\u0382\u0381\3\2\2\2\u0382\u0383"+
- "\3\2\2\2\u0383\u0384\3\2\2\2\u0384\u0385\5\u00b0Y\2\u0385\u0091\3\2\2"+
- "\2\u0386\u0387\bJ\1\2\u0387\u0388\t\b\2\2\u0388\u0397\5\u0092J\20\u0389"+
- "\u0397\5\u00a2R\2\u038a\u038b\7\33\2\2\u038b\u038c\5.\30\2\u038c\u038d"+
- "\7\35\2\2\u038d\u038e\5\u0092J\4\u038e\u0397\3\2\2\2\u038f\u0390\t\t\2"+
- "\2\u0390\u0391\5&\24\2\u0391\u0392\7m\2\2\u0392\u0393\7m\2\2\u0393\u0394"+
- "\5*\26\2\u0394\u0395\5\u0092J\3\u0395\u0397\3\2\2\2\u0396\u0386\3\2\2"+
- "\2\u0396\u0389\3\2\2\2\u0396\u038a\3\2\2\2\u0396\u038f\3\2\2\2\u0397\u03bb"+
- "\3\2\2\2\u0398\u0399\f\16\2\2\u0399\u039a\t\n\2\2\u039a\u03ba\5\u0092"+
- "J\17\u039b\u039c\f\r\2\2\u039c\u039d\t\13\2\2\u039d\u03ba\5\u0092J\16"+
- "\u039e\u039f\f\f\2\2\u039f\u03a0\t\f\2\2\u03a0\u03ba\5\u0092J\r\u03a1"+
- "\u03a2\f\13\2\2\u03a2\u03a3\t\r\2\2\u03a3\u03ba\5\u0092J\f\u03a4\u03a5"+
- "\f\n\2\2\u03a5\u03a6\t\16\2\2\u03a6\u03ba\5\u0092J\13\u03a7\u03a8\f\b"+
- "\2\2\u03a8\u03a9\7t\2\2\u03a9\u03ba\5\u0092J\t\u03aa\u03ab\f\7\2\2\u03ab"+
- "\u03ac\7s\2\2\u03ac\u03ba\5\u0092J\b\u03ad\u03ae\f\6\2\2\u03ae\u03af\7"+
- "#\2\2\u03af\u03ba\5\u0092J\6\u03b0\u03b1\f\5\2\2\u03b1\u03b2\7&\2\2\u03b2"+
- "\u03b3\5\u0092J\2\u03b3\u03b4\7m\2\2\u03b4\u03b5\5\u0092J\5\u03b5\u03ba"+
- "\3\2\2\2\u03b6\u03b7\f\t\2\2\u03b7\u03b8\7\21\2\2\u03b8\u03ba\5`\61\2"+
- "\u03b9\u0398\3\2\2\2\u03b9\u039b\3\2\2\2\u03b9\u039e\3\2\2\2\u03b9\u03a1"+
- "\3\2\2\2\u03b9\u03a4\3\2\2\2\u03b9\u03a7\3\2\2\2\u03b9\u03aa\3\2\2\2\u03b9"+
- "\u03ad\3\2\2\2\u03b9\u03b0\3\2\2\2\u03b9\u03b6\3\2\2\2\u03ba\u03bd\3\2"+
- "\2\2\u03bb\u03b9\3\2\2\2\u03bb\u03bc\3\2\2\2\u03bc\u0093\3\2\2\2\u03bd"+
- "\u03bb\3\2\2\2\u03be\u03d3\5\30\r\2\u03bf\u03d3\5\32\16\2\u03c0\u03d3"+
- "\5\u0098M\2\u03c1\u03d3\5\u0096L\2\u03c2\u03d3\5\u00caf\2\u03c3\u03d3"+
- "\5\u00eav\2\u03c4\u03d3\5\u00dep\2\u03c5\u03d3\5\u0118\u008d\2\u03c6\u03d3"+
- "\5\u00ecw\2\u03c7\u03d3\5\u00eex\2\u03c8\u03d3\5\u00f0y\2\u03c9\u03d3"+
- "\5\u00f2z\2\u03ca\u03d3\5\u00f4{\2\u03cb\u03d3\5\u00dan\2\u03cc\u03d3"+
- "\5\u00f6|\2\u03cd\u03d3\5\u00f8}\2\u03ce\u03d3\5\u010a\u0086\2\u03cf\u03d3"+
- "\5\u009aN\2\u03d0\u03d3\5\u009eP\2\u03d1\u03d3\5f\64\2\u03d2\u03be\3\2"+
- "\2\2\u03d2\u03bf\3\2\2\2\u03d2\u03c0\3\2\2\2\u03d2\u03c1\3\2\2\2\u03d2"+
- "\u03c2\3\2\2\2\u03d2\u03c3\3\2\2\2\u03d2\u03c4\3\2\2\2\u03d2\u03c5\3\2"+
- "\2\2\u03d2\u03c6\3\2\2\2\u03d2\u03c7\3\2\2\2\u03d2\u03c8\3\2\2\2\u03d2"+
- "\u03c9\3\2\2\2\u03d2\u03ca\3\2\2\2\u03d2\u03cb\3\2\2\2\u03d2\u03cc\3\2"+
- "\2\2\u03d2\u03cd\3\2\2\2\u03d2\u03ce\3\2\2\2\u03d2\u03cf\3\2\2\2\u03d2"+
- "\u03d0\3\2\2\2\u03d2\u03d1\3\2\2\2\u03d3\u0095\3\2\2\2\u03d4\u03d5\7%"+
- "\2\2\u03d5\u03d6\5\u0092J\2\u03d6\u0097\3\2\2\2\u03d7\u03d8\7V\2\2\u03d8"+
- "\u03da\5\u0092J\2\u03d9\u03db\5\u00dan\2\u03da\u03d9\3\2\2\2\u03da\u03db"+
- "\3\2\2\2\u03db\u0099\3\2\2\2\u03dc\u03dd\5\u009cO\2\u03dd\u03de\5\u0112"+
- "\u008a\2\u03de\u009b\3\2\2\2\u03df\u03e0\7\16\2\2\u03e0\u03e1\5\u0092"+
- "J\2\u03e1\u03e2\5\u015e\u00b0\2\u03e2\u03e4\3\2\2\2\u03e3\u03df\3\2\2"+
- "\2\u03e4\u03e7\3\2\2\2\u03e5\u03e3\3\2\2\2\u03e5\u03e6\3\2\2\2\u03e6\u03ec"+
- "\3\2\2\2\u03e7\u03e5\3\2\2\2\u03e8\u03e9\7\17\2\2\u03e9\u03ea\5Z.\2\u03ea"+
- "\u03eb\5\u015e\u00b0\2\u03eb\u03ed\3\2\2\2\u03ec\u03e8\3\2\2\2\u03ec\u03ed"+
- "\3\2\2\2\u03ed\u009d\3\2\2\2\u03ee\u03ef\7O\2\2\u03ef\u03f4\5\u0092J\2"+
- "\u03f0\u03f1\7O\2\2\u03f1\u03f2\t\3\2\2\u03f2\u03f4\5.\30\2\u03f3\u03ee"+
- "\3\2\2\2\u03f3\u03f0\3\2\2\2\u03f4\u009f\3\2\2\2\u03f5\u03fe\7\5\2\2\u03f6"+
- "\u03fe\7\6\2\2\u03f7\u03fe\7b\2\2\u03f8\u03fe\5\u013a\u009e\2\u03f9\u03fe"+
- "\5\u0150\u00a9\2\u03fa\u03fe\7\3\2\2\u03fb\u03fe\7\u008d\2\2\u03fc\u03fe"+
- "\7\u008e\2\2\u03fd\u03f5\3\2\2\2\u03fd\u03f6\3\2\2\2\u03fd\u03f7\3\2\2"+
- "\2\u03fd\u03f8\3\2\2\2\u03fd\u03f9\3\2\2\2\u03fd\u03fa\3\2\2\2\u03fd\u03fb"+
- "\3\2\2\2\u03fd\u03fc\3\2\2\2\u03fe\u00a1\3\2\2\2\u03ff\u0400\bR\1\2\u0400"+
- "\u040c\5\u0136\u009c\2\u0401\u040c\5\u0132\u009a\2\u0402\u040c\5\u015a"+
- "\u00ae\2\u0403\u040c\5 \21\2\u0404\u040c\5t;\2\u0405\u040c\5r:\2\u0406"+
- "\u0407\t\17\2\2\u0407\u0408\7d\2\2\u0408\u0409\5\u0092J\2\u0409\u040a"+
- "\7e\2\2\u040a\u040c\3\2\2\2\u040b\u03ff\3\2\2\2\u040b\u0401\3\2\2\2\u040b"+
- "\u0402\3\2\2\2\u040b\u0403\3\2\2\2\u040b\u0404\3\2\2\2\u040b\u0405\3\2"+
- "\2\2\u040b\u0406\3\2\2\2\u040c\u0423\3\2\2\2\u040d\u040e\f\13\2\2\u040e"+
- "\u040f\7n\2\2\u040f\u0422\7c\2\2\u0410\u0411\f\n\2\2\u0411\u0422\5\u0154"+
- "\u00ab\2\u0412\u0413\f\t\2\2\u0413\u0422\5\u00bc_\2\u0414\u0415\f\b\2"+
- "\2\u0415\u0422\5H%\2\u0416\u0417\f\7\2\2\u0417\u0422\5\u0156\u00ac\2\u0418"+
- "\u0419\f\6\2\2\u0419\u0422\5\u0158\u00ad\2\u041a\u041b\f\5\2\2\u041b\u041c"+
- "\5\u0158\u00ad\2\u041c\u041d\7\22\2\2\u041d\u041e\5`\61\2\u041e\u0422"+
- "\3\2\2\2\u041f\u0420\f\4\2\2\u0420\u0422\5\u00a8U\2\u0421\u040d\3\2\2"+
- "\2\u0421\u0410\3\2\2\2\u0421\u0412\3\2\2\2\u0421\u0414\3\2\2\2\u0421\u0416"+
- "\3\2\2\2\u0421\u0418\3\2\2\2\u0421\u041a\3\2\2\2\u0421\u041f\3\2\2\2\u0422"+
- "\u0425\3\2\2\2\u0423\u0421\3\2\2\2\u0423\u0424\3\2\2\2\u0424\u00a3\3\2"+
- "\2\2\u0425\u0423\3\2\2\2\u0426\u0427\5V,\2\u0427\u0428\5\u00a6T\2\u0428"+
- "\u00a5\3\2\2\2\u0429\u042b\7K\2\2\u042a\u042c\7c\2\2\u042b\u042a\3\2\2"+
- "\2\u042b\u042c\3\2\2\2\u042c\u042d\3\2\2\2\u042d\u042f\5\u012c\u0097\2"+
- "\u042e\u0430\5^\60\2\u042f\u042e\3\2\2\2\u042f\u0430\3\2\2\2\u0430\u00a7"+
- "\3\2\2\2\u0431\u0433\7\'\2\2\u0432\u0434\5\u00d2j\2\u0433\u0432\3\2\2"+
- "\2\u0433\u0434\3\2\2\2\u0434\u0436\3\2\2\2\u0435\u0437\7k\2\2\u0436\u0435"+
- "\3\2\2\2\u0436\u0437\3\2\2\2\u0437\u0438\3\2\2\2\u0438\u0439\7(\2\2\u0439"+
- "\u00a9\3\2\2\2\u043a\u043b\7L\2\2\u043b\u0445\7f\2\2\u043c\u0440\5\u00ae"+
- "X\2\u043d\u0440\5\u011a\u008e\2\u043e\u0440\5\u00acW\2\u043f\u043c\3\2"+
- "\2\2\u043f\u043d\3\2\2\2\u043f\u043e\3\2\2\2\u0440\u0441\3\2\2\2\u0441"+
- "\u0442\5\u015e\u00b0\2\u0442\u0444\3\2\2\2\u0443\u043f\3\2\2\2\u0444\u0447"+
- "\3\2\2\2\u0445\u0443\3\2\2\2\u0445\u0446\3\2\2\2\u0446\u0448\3\2\2\2\u0447"+
- "\u0445\3\2\2\2\u0448\u0449\7g\2\2\u0449\u00ab\3\2\2\2\u044a\u044b\7\67"+
- "\2\2\u044b\u044c\7c\2\2\u044c\u044d\5\u0130\u0099\2\u044d\u00ad\3\2\2"+
- "\2\u044e\u0450\7\34\2\2\u044f\u044e\3\2\2\2\u044f\u0450\3\2\2\2\u0450"+
- "\u0451\3\2\2\2\u0451\u0452\5V,\2\u0452\u0453\7c\2\2\u0453\u0454\5\u0130"+
- "\u0099\2\u0454\u0455\5\u012e\u0098\2\u0455\u045e\3\2\2\2\u0456\u0458\7"+
- "\34\2\2\u0457\u0456\3\2\2\2\u0457\u0458\3\2\2\2\u0458\u0459\3\2\2\2\u0459"+
- "\u045a\5V,\2\u045a\u045b\7c\2\2\u045b\u045c\5\u0130\u0099\2\u045c\u045e"+
- "\3\2\2\2\u045d\u044f\3\2\2\2\u045d\u0457\3\2\2\2\u045e\u00af\3\2\2\2\u045f"+
- "\u0467\5\u011a\u008e\2\u0460\u0467\5\u00b2Z\2\u0461\u0467\5L\'\2\u0462"+
- "\u0463\7d\2\2\u0463\u0464\5\u00b0Y\2\u0464\u0465\7e\2\2\u0465\u0467\3"+
- "\2\2\2\u0466\u045f\3\2\2\2\u0466\u0460\3\2\2\2\u0466\u0461\3\2\2\2\u0466"+
- "\u0462\3\2\2\2\u0467\u00b1\3\2\2\2\u0468\u0472\5\u011c\u008f\2\u0469\u0472"+
- "\5\u014c\u00a7\2\u046a\u0472\5\u0122\u0092\2\u046b\u0472\5\u012a\u0096"+
- "\2\u046c\u0472\5\u00aaV\2\u046d\u0472\5\u0124\u0093\2\u046e\u0472\5\u0126"+
- "\u0094\2\u046f\u0472\5\u0128\u0095\2\u0470\u0472\5\u00b4[\2\u0471\u0468"+
- "\3\2\2\2\u0471\u0469\3\2\2\2\u0471\u046a\3\2\2\2\u0471\u046b\3\2\2\2\u0471"+
- "\u046c\3\2\2\2\u0471\u046d\3\2\2\2\u0471\u046e\3\2\2\2\u0471\u046f\3\2"+
- "\2\2\u0471\u0470\3\2\2\2\u0472\u00b3\3\2\2\2\u0473\u0474\7\67\2\2\u0474"+
- "\u0475\5\u00b6\\\2\u0475\u00b5\3\2\2\2\u0476\u0482\7d\2\2\u0477\u047c"+
- "\5\u00b0Y\2\u0478\u0479\7k\2\2\u0479\u047b\5\u00b0Y\2\u047a\u0478\3\2"+
- "\2\2\u047b\u047e\3\2\2\2\u047c\u047a\3\2\2\2\u047c\u047d\3\2\2\2\u047d"+
- "\u0480\3\2\2\2\u047e\u047c\3\2\2\2\u047f\u0481\7k\2\2\u0480\u047f\3\2"+
- "\2\2\u0480\u0481\3\2\2\2\u0481\u0483\3\2\2\2\u0482\u0477\3\2\2\2\u0482"+
- "\u0483\3\2\2\2\u0483\u0484\3\2\2\2\u0484\u0485\7e\2\2\u0485\u00b7\3\2"+
- "\2\2\u0486\u048e\5\u014c\u00a7\2\u0487\u048e\5\u011c\u008f\2\u0488\u048e"+
- "\5\u00ba^\2\u0489\u048e\5\u0124\u0093\2\u048a\u048e\5\u0126\u0094\2\u048b"+
- "\u048e\5L\'\2\u048c\u048e\5\u011a\u008e\2\u048d\u0486\3\2\2\2\u048d\u0487"+
- "\3\2\2\2\u048d\u0488\3\2\2\2\u048d\u0489\3\2\2\2\u048d\u048a\3\2\2\2\u048d"+
- "\u048b\3\2\2\2\u048d\u048c\3\2\2\2\u048e\u00b9\3\2\2\2\u048f\u0490\7h"+
- "\2\2\u0490\u0491\7r\2\2\u0491\u0492\7i\2\2\u0492\u0493\5\u0120\u0091\2"+
- "\u0493\u00bb\3\2\2\2\u0494\u04a4\7h\2\2\u0495\u0497\5\u00be`\2\u0496\u0495"+
- "\3\2\2\2\u0496\u0497\3\2\2\2\u0497\u0498\3\2\2\2\u0498\u049a\7m\2\2\u0499"+
+ "\u04b0\nc\3c\3c\3d\3d\3d\3d\3d\3d\5d\u04ba\nd\3d\3d\3d\3d\5d\u04c0\nd"+
+ "\5d\u04c2\nd\3e\3e\3e\3f\3f\3g\3g\3g\5g\u04cc\ng\3h\3h\3h\3h\3h\3h\7h"+
+ "\u04d4\nh\fh\16h\u04d7\13h\3h\5h\u04da\nh\3i\3i\5i\u04de\ni\3i\3i\5i\u04e2"+
+ "\ni\3j\3j\3j\7j\u04e7\nj\fj\16j\u04ea\13j\3k\3k\3k\7k\u04ef\nk\fk\16k"+
+ "\u04f2\13k\3l\3l\3l\3l\3l\3l\7l\u04fa\nl\fl\16l\u04fd\13l\3l\5l\u0500"+
+ "\nl\3m\3m\5m\u0504\nm\3m\3m\3n\3n\3n\3n\3n\3n\7n\u050e\nn\fn\16n\u0511"+
+ "\13n\3n\5n\u0514\nn\3o\3o\5o\u0518\no\3o\3o\3p\5p\u051d\np\3p\3p\3p\6"+
+ "p\u0522\np\rp\16p\u0523\3q\3q\3q\3q\3q\5q\u052b\nq\3r\3r\3s\3s\3s\3s\3"+
+ "t\3t\3t\3u\3u\3u\3u\3v\3v\3w\3w\3w\5w\u053f\nw\3x\3x\5x\u0543\nx\3y\3"+
+ "y\5y\u0547\ny\3z\3z\5z\u054b\nz\3{\3{\3{\3|\3|\3}\3}\3}\3}\3}\3}\3}\3"+
+ "}\3}\5}\u055b\n}\3}\3}\3}\3}\5}\u0561\n}\5}\u0563\n}\3~\3~\5~\u0567\n"+
+ "~\3\177\3\177\5\177\u056b\n\177\3\177\5\177\u056e\n\177\3\177\3\177\5"+
+ "\177\u0572\n\177\5\177\u0574\n\177\3\177\3\177\7\177\u0578\n\177\f\177"+
+ "\16\177\u057b\13\177\3\177\3\177\3\u0080\3\u0080\3\u0080\5\u0080\u0582"+
+ "\n\u0080\3\u0081\3\u0081\3\u0081\5\u0081\u0587\n\u0081\3\u0082\3\u0082"+
+ "\3\u0082\3\u0082\3\u0082\3\u0082\3\u0082\3\u0082\3\u0082\5\u0082\u0592"+
+ "\n\u0082\3\u0082\3\u0082\7\u0082\u0596\n\u0082\f\u0082\16\u0082\u0599"+
+ "\13\u0082\3\u0082\3\u0082\3\u0083\3\u0083\5\u0083\u059f\n\u0083\3\u0083"+
+ "\3\u0083\3\u0083\3\u0083\3\u0083\3\u0083\3\u0084\3\u0084\3\u0084\5\u0084"+
+ "\u05aa\n\u0084\3\u0085\3\u0085\3\u0085\5\u0085\u05af\n\u0085\3\u0086\3"+
+ "\u0086\5\u0086\u05b3\n\u0086\3\u0086\3\u0086\3\u0086\5\u0086\u05b8\n\u0086"+
+ "\7\u0086\u05ba\n\u0086\f\u0086\16\u0086\u05bd\13\u0086\3\u0087\3\u0087"+
+ "\3\u0087\7\u0087\u05c2\n\u0087\f\u0087\16\u0087\u05c5\13\u0087\3\u0087"+
+ "\3\u0087\3\u0088\3\u0088\3\u0088\5\u0088\u05cc\n\u0088\3\u0089\3\u0089"+
+ "\3\u0089\5\u0089\u05d1\n\u0089\3\u0089\5\u0089\u05d4\n\u0089\3\u008a\3"+
+ "\u008a\3\u008a\3\u008a\3\u008a\3\u008a\5\u008a\u05dc\n\u008a\3\u008a\3"+
+ "\u008a\3\u008b\3\u008b\3\u008b\3\u008b\5\u008b\u05e4\n\u008b\3\u008b\3"+
+ "\u008b\3\u008c\5\u008c\u05e9\n\u008c\3\u008c\3\u008c\5\u008c\u05ed\n\u008c"+
+ "\3\u008c\3\u008c\5\u008c\u05f1\n\u008c\3\u008d\3\u008d\3\u008d\3\u008e"+
+ "\3\u008e\5\u008e\u05f8\n\u008e\3\u008f\3\u008f\3\u008f\3\u008f\3\u008f"+
+ "\3\u0090\3\u0090\3\u0091\3\u0091\3\u0092\3\u0092\3\u0092\3\u0093\3\u0093"+
+ "\3\u0093\3\u0093\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0095"+
+ "\3\u0095\3\u0095\3\u0095\3\u0095\5\u0095\u0615\n\u0095\3\u0095\3\u0095"+
+ "\3\u0096\3\u0096\3\u0096\3\u0097\3\u0097\3\u0097\3\u0097\5\u0097\u0620"+
+ "\n\u0097\3\u0098\3\u0098\5\u0098\u0624\n\u0098\3\u0099\3\u0099\3\u0099"+
+ "\3\u0099\7\u0099\u062a\n\u0099\f\u0099\16\u0099\u062d\13\u0099\3\u0099"+
+ "\5\u0099\u0630\n\u0099\5\u0099\u0632\n\u0099\3\u0099\3\u0099\3\u009a\3"+
+ "\u009a\3\u009a\3\u009a\5\u009a\u063a\n\u009a\3\u009a\3\u009a\3\u009b\3"+
+ "\u009b\3\u009b\3\u009b\3\u009b\5\u009b\u0643\n\u009b\3\u009c\3\u009c\3"+
+ "\u009c\3\u009c\3\u009c\3\u009c\5\u009c\u064b\n\u009c\3\u009d\3\u009d\3"+
+ "\u009d\5\u009d\u0650\n\u009d\3\u009e\3\u009e\3\u009f\3\u009f\3\u00a0\3"+
+ "\u00a0\3\u00a0\3\u00a0\3\u00a1\3\u00a1\3\u00a1\3\u00a2\3\u00a2\3\u00a2"+
+ "\5\u00a2\u0660\n\u00a2\5\u00a2\u0662\n\u00a2\3\u00a2\3\u00a2\3\u00a3\3"+
+ "\u00a3\3\u00a3\7\u00a3\u0669\n\u00a3\f\u00a3\16\u00a3\u066c\13\u00a3\3"+
+ "\u00a4\3\u00a4\3\u00a4\5\u00a4\u0671\n\u00a4\3\u00a4\3\u00a4\3\u00a5\3"+
+ "\u00a5\5\u00a5\u0677\n\u00a5\3\u00a6\3\u00a6\5\u00a6\u067b\n\u00a6\3\u00a7"+
+ "\3\u00a7\3\u00a7\3\u00a7\3\u00a7\7\u00a7\u0682\n\u00a7\f\u00a7\16\u00a7"+
+ "\u0685\13\u00a7\3\u00a7\3\u00a7\3\u00a8\3\u00a8\3\u00a8\3\u00a8\5\u00a8"+
+ "\u068d\n\u00a8\3\u00a8\5\u00a8\u0690\n\u00a8\3\u00a9\3\u00a9\3\u00aa\5"+
+ "\u00aa\u0695\n\u00aa\3\u00aa\3\u00aa\3\u00ab\3\u00ab\3\u00ab\3\u00ab\3"+
+ "\u00ac\3\u00ac\3\u00ac\3\u00ac\3\u00ac\3\u00ad\3\u00ad\3\u00ad\3\u00ad"+
+ "\3\u00ad\5\u00ad\u06a7\n\u00ad\5\u00ad\u06a9\n\u00ad\3\u00ad\5\u00ad\u06ac"+
+ "\n\u00ad\3\u00ad\5\u00ad\u06af\n\u00ad\5\u00ad\u06b1\n\u00ad\3\u00ad\3"+
+ "\u00ad\3\u00ae\3\u00ae\3\u00ae\3\u00ae\3\u00af\3\u00af\3\u00b0\3\u00b0"+
+ "\3\u00b0\3\u00b0\5\u00b0\u06bf\n\u00b0\3\u00b0\3\u02a1\4\u0092\u00a2\u00b1"+
+ "\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \"$&(*,.\60\62\64\668:<>@BDFH"+
+ "JLNPRTVXZ\\^`bdfhjlnprtvxz|~\u0080\u0082\u0084\u0086\u0088\u008a\u008c"+
+ "\u008e\u0090\u0092\u0094\u0096\u0098\u009a\u009c\u009e\u00a0\u00a2\u00a4"+
+ "\u00a6\u00a8\u00aa\u00ac\u00ae\u00b0\u00b2\u00b4\u00b6\u00b8\u00ba\u00bc"+
+ "\u00be\u00c0\u00c2\u00c4\u00c6\u00c8\u00ca\u00cc\u00ce\u00d0\u00d2\u00d4"+
+ "\u00d6\u00d8\u00da\u00dc\u00de\u00e0\u00e2\u00e4\u00e6\u00e8\u00ea\u00ec"+
+ "\u00ee\u00f0\u00f2\u00f4\u00f6\u00f8\u00fa\u00fc\u00fe\u0100\u0102\u0104"+
+ "\u0106\u0108\u010a\u010c\u010e\u0110\u0112\u0114\u0116\u0118\u011a\u011c"+
+ "\u011e\u0120\u0122\u0124\u0126\u0128\u012a\u012c\u012e\u0130\u0132\u0134"+
+ "\u0136\u0138\u013a\u013c\u013e\u0140\u0142\u0144\u0146\u0148\u014a\u014c"+
+ "\u014e\u0150\u0152\u0154\u0156\u0158\u015a\u015c\u015e\2\25\4\2ddoo\3"+
+ "\2\31\32\3\2\7\n\3\2@A\3\2)+\4\2)+--\3\2\u0082\u0088\3\2\26\27\4\2}\u0081"+
+ "\u0086\u0087\6\2$$pp||\u0083\u0085\3\2 \"\3\2\35\37\4\2GHv{\6\2..\61\61"+
+ "\64\64\\\\\4\2|\u0081\u0083\u0087\3\2pq\4\2mm\u009e\u009e\4\2\u0089\u008c"+
+ "\u008e\u008f\3\2\u0095\u0096\2\u071f\2\u0160\3\2\2\2\4\u0163\3\2\2\2\6"+
+ "\u0166\3\2\2\2\b\u0169\3\2\2\2\n\u0171\3\2\2\2\f\u017a\3\2\2\2\16\u0195"+
+ "\3\2\2\2\20\u0198\3\2\2\2\22\u01a0\3\2\2\2\24\u01ad\3\2\2\2\26\u01c3\3"+
+ "\2\2\2\30\u01cb\3\2\2\2\32\u01cd\3\2\2\2\34\u01cf\3\2\2\2\36\u01d2\3\2"+
+ "\2\2 \u01e5\3\2\2\2\"\u01e7\3\2\2\2$\u01e9\3\2\2\2&\u01ee\3\2\2\2(\u01f9"+
+ "\3\2\2\2*\u0206\3\2\2\2,\u0209\3\2\2\2.\u0214\3\2\2\2\60\u0216\3\2\2\2"+
+ "\62\u021b\3\2\2\2\64\u0220\3\2\2\2\66\u0225\3\2\2\28\u022a\3\2\2\2:\u0237"+
+ "\3\2\2\2<\u0239\3\2\2\2>\u023b\3\2\2\2@\u0240\3\2\2\2B\u0245\3\2\2\2D"+
+ "\u024a\3\2\2\2F\u0253\3\2\2\2H\u025a\3\2\2\2J\u0265\3\2\2\2L\u026c\3\2"+
+ "\2\2N\u026e\3\2\2\2P\u0283\3\2\2\2R\u0285\3\2\2\2T\u0295\3\2\2\2V\u02a1"+
+ "\3\2\2\2X\u02b0\3\2\2\2Z\u02b3\3\2\2\2\\\u02bb\3\2\2\2^\u02bd\3\2\2\2"+
+ "`\u02cb\3\2\2\2b\u02d7\3\2\2\2d\u02e1\3\2\2\2f\u02e5\3\2\2\2h\u02eb\3"+
+ "\2\2\2j\u0303\3\2\2\2l\u030b\3\2\2\2n\u031a\3\2\2\2p\u031c\3\2\2\2r\u0323"+
+ "\3\2\2\2t\u032c\3\2\2\2v\u0331\3\2\2\2x\u0336\3\2\2\2z\u033c\3\2\2\2|"+
+ "\u0343\3\2\2\2~\u0348\3\2\2\2\u0080\u034e\3\2\2\2\u0082\u0353\3\2\2\2"+
+ "\u0084\u035a\3\2\2\2\u0086\u0364\3\2\2\2\u0088\u0368\3\2\2\2\u008a\u0374"+
+ "\3\2\2\2\u008c\u0377\3\2\2\2\u008e\u037b\3\2\2\2\u0090\u0382\3\2\2\2\u0092"+
+ "\u0396\3\2\2\2\u0094\u03d2\3\2\2\2\u0096\u03d4\3\2\2\2\u0098\u03d7\3\2"+
+ "\2\2\u009a\u03dc\3\2\2\2\u009c\u03e5\3\2\2\2\u009e\u03f3\3\2\2\2\u00a0"+
+ "\u03fd\3\2\2\2\u00a2\u040b\3\2\2\2\u00a4\u0426\3\2\2\2\u00a6\u0429\3\2"+
+ "\2\2\u00a8\u0431\3\2\2\2\u00aa\u043a\3\2\2\2\u00ac\u044a\3\2\2\2\u00ae"+
+ "\u045d\3\2\2\2\u00b0\u0466\3\2\2\2\u00b2\u0471\3\2\2\2\u00b4\u0473\3\2"+
+ "\2\2\u00b6\u0476\3\2\2\2\u00b8\u048d\3\2\2\2\u00ba\u048f\3\2\2\2\u00bc"+
+ "\u0494\3\2\2\2\u00be\u04a8\3\2\2\2\u00c0\u04aa\3\2\2\2\u00c2\u04ac\3\2"+
+ "\2\2\u00c4\u04af\3\2\2\2\u00c6\u04b9\3\2\2\2\u00c8\u04c3\3\2\2\2\u00ca"+
+ "\u04c6\3\2\2\2\u00cc\u04cb\3\2\2\2\u00ce\u04cd\3\2\2\2\u00d0\u04db\3\2"+
+ "\2\2\u00d2\u04e3\3\2\2\2\u00d4\u04eb\3\2\2\2\u00d6\u04f3\3\2\2\2\u00d8"+
+ "\u0501\3\2\2\2\u00da\u0507\3\2\2\2\u00dc\u0515\3\2\2\2\u00de\u0521\3\2"+
+ "\2\2\u00e0\u052a\3\2\2\2\u00e2\u052c\3\2\2\2\u00e4\u052e\3\2\2\2\u00e6"+
+ "\u0532\3\2\2\2\u00e8\u0535\3\2\2\2\u00ea\u0539\3\2\2\2\u00ec\u053b\3\2"+
+ "\2\2\u00ee\u0540\3\2\2\2\u00f0\u0544\3\2\2\2\u00f2\u0548\3\2\2\2\u00f4"+
+ "\u054c\3\2\2\2\u00f6\u054f\3\2\2\2\u00f8\u0551\3\2\2\2\u00fa\u0566\3\2"+
+ "\2\2\u00fc\u0568\3\2\2\2\u00fe\u057e\3\2\2\2\u0100\u0586\3\2\2\2\u0102"+
+ "\u0588\3\2\2\2\u0104\u059e\3\2\2\2\u0106\u05a6\3\2\2\2\u0108\u05ae\3\2"+
+ "\2\2\u010a\u05b2\3\2\2\2\u010c\u05be\3\2\2\2\u010e\u05c8\3\2\2\2\u0110"+
+ "\u05d3\3\2\2\2\u0112\u05db\3\2\2\2\u0114\u05df\3\2\2\2\u0116\u05e8\3\2"+
+ "\2\2\u0118\u05f2\3\2\2\2\u011a\u05f7\3\2\2\2\u011c\u05f9\3\2\2\2\u011e"+
+ "\u05fe\3\2\2\2\u0120\u0600\3\2\2\2\u0122\u0602\3\2\2\2\u0124\u0605\3\2"+
+ "\2\2\u0126\u0609\3\2\2\2\u0128\u0614\3\2\2\2\u012a\u0618\3\2\2\2\u012c"+
+ "\u061f\3\2\2\2\u012e\u0623\3\2\2\2\u0130\u0625\3\2\2\2\u0132\u0635\3\2"+
+ "\2\2\u0134\u0642\3\2\2\2\u0136\u064a\3\2\2\2\u0138\u064f\3\2\2\2\u013a"+
+ "\u0651\3\2\2\2\u013c\u0653\3\2\2\2\u013e\u0655\3\2\2\2\u0140\u0659\3\2"+
+ "\2\2\u0142\u065c\3\2\2\2\u0144\u0665\3\2\2\2\u0146\u0670\3\2\2\2\u0148"+
+ "\u0676\3\2\2\2\u014a\u067a\3\2\2\2\u014c\u067c\3\2\2\2\u014e\u068c\3\2"+
+ "\2\2\u0150\u0691\3\2\2\2\u0152\u0694\3\2\2\2\u0154\u0698\3\2\2\2\u0156"+
+ "\u069c\3\2\2\2\u0158\u06a1\3\2\2\2\u015a\u06b4\3\2\2\2\u015c\u06b8\3\2"+
+ "\2\2\u015e\u06be\3\2\2\2\u0160\u0161\5\u0092J\2\u0161\u0162\7\2\2\3\u0162"+
+ "\3\3\2\2\2\u0163\u0164\5\u0094K\2\u0164\u0165\7\2\2\3\u0165\5\3\2\2\2"+
+ "\u0166\u0167\5\u00b0Y\2\u0167\u0168\7\2\2\3\u0168\7\3\2\2\2\u0169\u016e"+
+ "\5\n\6\2\u016a\u016b\7l\2\2\u016b\u016d\5\n\6\2\u016c\u016a\3\2\2\2\u016d"+
+ "\u0170\3\2\2\2\u016e\u016c\3\2\2\2\u016e\u016f\3\2\2\2\u016f\t\3\2\2\2"+
+ "\u0170\u016e\3\2\2\2\u0171\u0173\7d\2\2\u0172\u0174\7;\2\2\u0173\u0172"+
+ "\3\2\2\2\u0173\u0174\3\2\2\2\u0174\13\3\2\2\2\u0175\u0176\5\16\b\2\u0176"+
+ "\u0177\5\u015e\u00b0\2\u0177\u0179\3\2\2\2\u0178\u0175\3\2\2\2\u0179\u017c"+
+ "\3\2\2\2\u017a\u0178\3\2\2\2\u017a\u017b\3\2\2\2\u017b\u017d\3\2\2\2\u017c"+
+ "\u017a\3\2\2\2\u017d\u017e\5\u00c8e\2\u017e\u0184\5\u015e\u00b0\2\u017f"+
+ "\u0180\5\24\13\2\u0180\u0181\5\u015e\u00b0\2\u0181\u0183\3\2\2\2\u0182"+
+ "\u017f\3\2\2\2\u0183\u0186\3\2\2\2\u0184\u0182\3\2\2\2\u0184\u0185\3\2"+
+ "\2\2\u0185\u0190\3\2\2\2\u0186\u0184\3\2\2\2\u0187\u018b\5v<\2\u0188\u018b"+
+ "\5\u00ccg\2\u0189\u018b\5\26\f\2\u018a\u0187\3\2\2\2\u018a\u0188\3\2\2"+
+ "\2\u018a\u0189\3\2\2\2\u018b\u018c\3\2\2\2\u018c\u018d\5\u015e\u00b0\2"+
+ "\u018d\u018f\3\2\2\2\u018e\u018a\3\2\2\2\u018f\u0192\3\2\2\2\u0190\u018e"+
+ "\3\2\2\2\u0190\u0191\3\2\2\2\u0191\u0193\3\2\2\2\u0192\u0190\3\2\2\2\u0193"+
+ "\u0194\7\2\2\3\u0194\r\3\2\2\2\u0195\u0196\7D\2\2\u0196\u0197\5\u0092"+
+ "J\2\u0197\17\3\2\2\2\u0198\u0199\7E\2\2\u0199\u019a\5\u0092J\2\u019a\21"+
+ "\3\2\2\2\u019b\u019c\5\20\t\2\u019c\u019d\5\u015e\u00b0\2\u019d\u019f"+
+ "\3\2\2\2\u019e\u019b\3\2\2\2\u019f\u01a2\3\2\2\2\u01a0\u019e\3\2\2\2\u01a0"+
+ "\u01a1\3\2\2\2\u01a1\u01a4\3\2\2\2\u01a2\u01a0\3\2\2\2\u01a3\u01a5\t\2"+
+ "\2\2\u01a4\u01a3\3\2\2\2\u01a4\u01a5\3\2\2\2\u01a5\u01a6\3\2\2\2\u01a6"+
+ "\u01a7\5\u00caf\2\u01a7\23\3\2\2\2\u01a8\u01a9\5\20\t\2\u01a9\u01aa\5"+
+ "\u015e\u00b0\2\u01aa\u01ac\3\2\2\2\u01ab\u01a8\3\2\2\2\u01ac\u01af\3\2"+
+ "\2\2\u01ad\u01ab\3\2\2\2\u01ad\u01ae\3\2\2\2\u01ae\u01bd\3\2\2\2\u01af"+
+ "\u01ad\3\2\2\2\u01b0\u01b1\7`\2\2\u01b1\u01be\5\22\n\2\u01b2\u01b3\7`"+
+ "\2\2\u01b3\u01b9\7e\2\2\u01b4\u01b5\5\22\n\2\u01b5\u01b6\5\u015e\u00b0"+
+ "\2\u01b6\u01b8\3\2\2\2\u01b7\u01b4\3\2\2\2\u01b8\u01bb\3\2\2\2\u01b9\u01b7"+
+ "\3\2\2\2\u01b9\u01ba\3\2\2\2\u01ba\u01bc\3\2\2\2\u01bb\u01b9\3\2\2\2\u01bc"+
+ "\u01be\7f\2\2\u01bd\u01b0\3\2\2\2\u01bd\u01b2\3\2\2\2\u01be\25\3\2\2\2"+
+ "\u01bf\u01c4\5h\65\2\u01c0\u01c4\5~@\2\u01c1\u01c4\5\u0082B\2\u01c2\u01c4"+
+ "\5|?\2\u01c3\u01bf\3\2\2\2\u01c3\u01c0\3\2\2\2\u01c3\u01c1\3\2\2\2\u01c3"+
+ "\u01c2\3\2\2\2\u01c4\27\3\2\2\2\u01c5\u01c6\7\34\2\2\u01c6\u01cc\5\u0094"+
+ "K\2\u01c7\u01c8\t\3\2\2\u01c8\u01cc\5.\30\2\u01c9\u01ca\t\4\2\2\u01ca"+
+ "\u01cc\5\u0092J\2\u01cb\u01c5\3\2\2\2\u01cb\u01c7\3\2\2\2\u01cb\u01c9"+
+ "\3\2\2\2\u01cc\31\3\2\2\2\u01cd\u01ce\5\34\17\2\u01ce\33\3\2\2\2\u01cf"+
+ "\u01d0\5V,\2\u01d0\u01d1\5\36\20\2\u01d1\35\3\2\2\2\u01d2\u01d3\7C\2\2"+
+ "\u01d3\u01d5\7e\2\2\u01d4\u01d6\5\u00dep\2\u01d5\u01d4\3\2\2\2\u01d5\u01d6"+
+ "\3\2\2\2\u01d6\u01d7\3\2\2\2\u01d7\u01d8\7f\2\2\u01d8\37\3\2\2\2\u01d9"+
+ "\u01e6\5F$\2\u01da\u01e6\5D#\2\u01db\u01e6\5B\"\2\u01dc\u01e6\5$\23\2"+
+ "\u01dd\u01e6\5@!\2\u01de\u01e6\58\35\2\u01df\u01e6\5> \2\u01e0\u01e6\5"+
+ "\66\34\2\u01e1\u01e6\5\62\32\2\u01e2\u01e6\5\60\31\2\u01e3\u01e6\5\64"+
+ "\33\2\u01e4\u01e6\5\"\22\2\u01e5\u01d9\3\2\2\2\u01e5\u01da\3\2\2\2\u01e5"+
+ "\u01db\3\2\2\2\u01e5\u01dc\3\2\2\2\u01e5\u01dd\3\2\2\2\u01e5\u01de\3\2"+
+ "\2\2\u01e5\u01df\3\2\2\2\u01e5\u01e0\3\2\2\2\u01e5\u01e1\3\2\2\2\u01e5"+
+ "\u01e2\3\2\2\2\u01e5\u01e3\3\2\2\2\u01e5\u01e4\3\2\2\2\u01e6!\3\2\2\2"+
+ "\u01e7\u01e8\t\5\2\2\u01e8#\3\2\2\2\u01e9\u01ea\7]\2\2\u01ea\u01eb\7i"+
+ "\2\2\u01eb\u01ec\5\u00b0Y\2\u01ec\u01ed\7j\2\2\u01ed%\3\2\2\2\u01ee\u01f3"+
+ "\5(\25\2\u01ef\u01f0\7l\2\2\u01f0\u01f2\5(\25\2\u01f1\u01ef\3\2\2\2\u01f2"+
+ "\u01f5\3\2\2\2\u01f3\u01f1\3\2\2\2\u01f3\u01f4\3\2\2\2\u01f4\u01f7\3\2"+
+ "\2\2\u01f5\u01f3\3\2\2\2\u01f6\u01f8\7l\2\2\u01f7\u01f6\3\2\2\2\u01f7"+
+ "\u01f8\3\2\2\2\u01f8\'\3\2\2\2\u01f9\u01fe\7d\2\2\u01fa\u01fb\7l\2\2\u01fb"+
+ "\u01fd\7d\2\2\u01fc\u01fa\3\2\2\2\u01fd\u0200\3\2\2\2\u01fe\u01fc\3\2"+
+ "\2\2\u01fe\u01ff\3\2\2\2\u01ff\u0201\3\2\2\2\u0200\u01fe\3\2\2\2\u0201"+
+ "\u0202\5\u0120\u0091\2\u0202)\3\2\2\2\u0203\u0205\5,\27\2\u0204\u0203"+
+ "\3\2\2\2\u0205\u0208\3\2\2\2\u0206\u0204\3\2\2\2\u0206\u0207\3\2\2\2\u0207"+
+ "+\3\2\2\2\u0208\u0206\3\2\2\2\u0209\u020a\7g\2\2\u020a\u020f\5\u0092J"+
+ "\2\u020b\u020c\7l\2\2\u020c\u020e\5\u0092J\2\u020d\u020b\3\2\2\2\u020e"+
+ "\u0211\3\2\2\2\u020f\u020d\3\2\2\2\u020f\u0210\3\2\2\2\u0210\u0212\3\2"+
+ "\2\2\u0211\u020f\3\2\2\2\u0212\u0213\7h\2\2\u0213-\3\2\2\2\u0214\u0215"+
+ "\5\u00a2R\2\u0215/\3\2\2\2\u0216\u0217\7\62\2\2\u0217\u0218\7e\2\2\u0218"+
+ "\u0219\5\u0092J\2\u0219\u021a\7f\2\2\u021a\61\3\2\2\2\u021b\u021c\7\66"+
+ "\2\2\u021c\u021d\7i\2\2\u021d\u021e\5\u00b0Y\2\u021e\u021f\7j\2\2\u021f"+
+ "\63\3\2\2\2\u0220\u0221\7\63\2\2\u0221\u0222\7e\2\2\u0222\u0223\5\u0092"+
+ "J\2\u0223\u0224\7f\2\2\u0224\65\3\2\2\2\u0225\u0226\t\6\2\2\u0226\u0227"+
+ "\7e\2\2\u0227\u0228\5\u0092J\2\u0228\u0229\7f\2\2\u0229\67\3\2\2\2\u022a"+
+ "\u022f\7\23\2\2\u022b\u022c\7i\2\2\u022c\u022d\5:\36\2\u022d\u022e\7j"+
+ "\2\2\u022e\u0230\3\2\2\2\u022f\u022b\3\2\2\2\u022f\u0230\3\2\2\2\u0230"+
+ "\u0231\3\2\2\2\u0231\u0232\7e\2\2\u0232\u0233\5\u0092J\2\u0233\u0234\7"+
+ "f\2\2\u02349\3\2\2\2\u0235\u0238\5<\37\2\u0236\u0238\7\25\2\2\u0237\u0235"+
+ "\3\2\2\2\u0237\u0236\3\2\2\2\u0238;\3\2\2\2\u0239\u023a\7d\2\2\u023a="+
+ "\3\2\2\2\u023b\u023c\7\24\2\2\u023c\u023d\7e\2\2\u023d\u023e\5\u0092J"+
+ "\2\u023e\u023f\7f\2\2\u023f?\3\2\2\2\u0240\u0241\79\2\2\u0241\u0242\7"+
+ "e\2\2\u0242\u0243\5\u0092J\2\u0243\u0244\7f\2\2\u0244A\3\2\2\2\u0245\u0246"+
+ "\78\2\2\u0246\u0247\7e\2\2\u0247\u0248\5\u0092J\2\u0248\u0249\7f\2\2\u0249"+
+ "C\3\2\2\2\u024a\u024b\7\30\2\2\u024b\u024c\7e\2\2\u024c\u024f\5\u0092"+
+ "J\2\u024d\u024e\7l\2\2\u024e\u0250\5\u0092J\2\u024f\u024d\3\2\2\2\u024f"+
+ "\u0250\3\2\2\2\u0250\u0251\3\2\2\2\u0251\u0252\7f\2\2\u0252E\3\2\2\2\u0253"+
+ "\u0254\t\6\2\2\u0254\u0255\7i\2\2\u0255\u0256\5\u0092J\2\u0256\u0257\7"+
+ "<\2\2\u0257\u0258\5\u0092J\2\u0258\u0259\7j\2\2\u0259G\3\2\2\2\u025a\u025b"+
+ "\7i\2\2\u025b\u0260\5J&\2\u025c\u025d\7l\2\2\u025d\u025f\5J&\2\u025e\u025c"+
+ "\3\2\2\2\u025f\u0262\3\2\2\2\u0260\u025e\3\2\2\2\u0260\u0261\3\2\2\2\u0261"+
+ "\u0263\3\2\2\2\u0262\u0260\3\2\2\2\u0263\u0264\7j\2\2\u0264I\3\2\2\2\u0265"+
+ "\u0266\5\u0092J\2\u0266\u0267\7k\2\2\u0267\u0268\5\u0092J\2\u0268K\3\2"+
+ "\2\2\u0269\u026d\5T+\2\u026a\u026d\5R*\2\u026b\u026d\5N(\2\u026c\u0269"+
+ "\3\2\2\2\u026c\u026a\3\2\2\2\u026c\u026b\3\2\2\2\u026dM\3\2\2\2\u026e"+
+ "\u026f\7\64\2\2\u026f\u0275\7g\2\2\u0270\u0271\5P)\2\u0271\u0272\5\u015e"+
+ "\u00b0\2\u0272\u0274\3\2\2\2\u0273\u0270\3\2\2\2\u0274\u0277\3\2\2\2\u0275"+
+ "\u0273\3\2\2\2\u0275\u0276\3\2\2\2\u0276\u0278\3\2\2\2\u0277\u0275\3\2"+
+ "\2\2\u0278\u0279\7h\2\2\u0279O\3\2\2\2\u027a\u027b\7L\2\2\u027b\u027c"+
+ "\7d\2\2\u027c\u0284\5\u012c\u0097\2\u027d\u027e\7\65\2\2\u027e\u027f\7"+
+ "g\2\2\u027f\u0280\5\u0092J\2\u0280\u0281\5\u015e\u00b0\2\u0281\u0282\7"+
+ "h\2\2\u0282\u0284\3\2\2\2\u0283\u027a\3\2\2\2\u0283\u027d\3\2\2\2\u0284"+
+ "Q\3\2\2\2\u0285\u0286\7\34\2\2\u0286\u0287\7i\2\2\u0287\u0288\7j\2\2\u0288"+
+ "\u0289\5\u0120\u0091\2\u0289S\3\2\2\2\u028a\u028b\t\7\2\2\u028b\u028c"+
+ "\7i\2\2\u028c\u028d\5\u00b0Y\2\u028d\u028e\7j\2\2\u028e\u0296\3\2\2\2"+
+ "\u028f\u0290\7,\2\2\u0290\u0291\7i\2\2\u0291\u0292\5\u00b0Y\2\u0292\u0293"+
+ "\7j\2\2\u0293\u0294\5\u00b0Y\2\u0294\u0296\3\2\2\2\u0295\u028a\3\2\2\2"+
+ "\u0295\u028f\3\2\2\2\u0296U\3\2\2\2\u0297\u029d\5X-\2\u0298\u0299\7\20"+
+ "\2\2\u0299\u029d\b,\1\2\u029a\u029b\7B\2\2\u029b\u029d\b,\1\2\u029c\u0297"+
+ "\3\2\2\2\u029c\u0298\3\2\2\2\u029c\u029a\3\2\2\2\u029d\u029e\3\2\2\2\u029e"+
+ "\u02a0\5\u015e\u00b0\2\u029f\u029c\3\2\2\2\u02a0\u02a3\3\2\2\2\u02a1\u02a2"+
+ "\3\2\2\2\u02a1\u029f\3\2\2\2\u02a2\u02a6\3\2\2\2\u02a3\u02a1\3\2\2\2\u02a4"+
+ "\u02a5\7\20\2\2\u02a5\u02a7\b,\1\2\u02a6\u02a4\3\2\2\2\u02a6\u02a7\3\2"+
+ "\2\2\u02a7W\3\2\2\2\u02a8\u02a9\7\13\2\2\u02a9\u02b1\5\\/\2\u02aa\u02ab"+
+ "\7\f\2\2\u02ab\u02b1\5\\/\2\u02ac\u02ad\7\r\2\2\u02ad\u02b1\5\\/\2\u02ae"+
+ "\u02af\7\17\2\2\u02af\u02b1\5Z.\2\u02b0\u02a8\3\2\2\2\u02b0\u02aa\3\2"+
+ "\2\2\u02b0\u02ac\3\2\2\2\u02b0\u02ae\3\2\2\2\u02b1Y\3\2\2\2\u02b2\u02b4"+
+ "\5\u00d4k\2\u02b3\u02b2\3\2\2\2\u02b3\u02b4\3\2\2\2\u02b4\u02b7\3\2\2"+
+ "\2\u02b5\u02b6\7[\2\2\u02b6\u02b8\5\u0092J\2\u02b7\u02b5\3\2\2\2\u02b7"+
+ "\u02b8\3\2\2\2\u02b8[\3\2\2\2\u02b9\u02bc\3\2\2\2\u02ba\u02bc\5\u0092"+
+ "J\2\u02bb\u02b9\3\2\2\2\u02bb\u02ba\3\2\2\2\u02bc]\3\2\2\2\u02bd\u02c2"+
+ "\7g\2\2\u02be\u02bf\7:\2\2\u02bf\u02c0\5\u00d2j\2\u02c0\u02c1\5\u015e"+
+ "\u00b0\2\u02c1\u02c3\3\2\2\2\u02c2\u02be\3\2\2\2\u02c2\u02c3\3\2\2\2\u02c3"+
+ "\u02c5\3\2\2\2\u02c4\u02c6\5\u00dep\2\u02c5\u02c4\3\2\2\2\u02c5\u02c6"+
+ "\3\2\2\2\u02c6\u02c7\3\2\2\2\u02c7\u02c8\7h\2\2\u02c8_\3\2\2\2\u02c9\u02cc"+
+ "\5\u013e\u00a0\2\u02ca\u02cc\7d\2\2\u02cb\u02c9\3\2\2\2\u02cb\u02ca\3"+
+ "\2\2\2\u02cc\u02d5\3\2\2\2\u02cd\u02d2\7g\2\2\u02ce\u02d0\5b\62\2\u02cf"+
+ "\u02d1\7l\2\2\u02d0\u02cf\3\2\2\2\u02d0\u02d1\3\2\2\2\u02d1\u02d3\3\2"+
+ "\2\2\u02d2\u02ce\3\2\2\2\u02d2\u02d3\3\2\2\2\u02d3\u02d4\3\2\2\2\u02d4"+
+ "\u02d6\7h\2\2\u02d5\u02cd\3\2\2\2\u02d5\u02d6\3\2\2\2\u02d6a\3\2\2\2\u02d7"+
+ "\u02dc\5d\63\2\u02d8\u02d9\7l\2\2\u02d9\u02db\5d\63\2\u02da\u02d8\3\2"+
+ "\2\2\u02db\u02de\3\2\2\2\u02dc\u02da\3\2\2\2\u02dc\u02dd\3\2\2\2\u02dd"+
+ "c\3\2\2\2\u02de\u02dc\3\2\2\2\u02df\u02e0\7d\2\2\u02e0\u02e2\7n\2\2\u02e1"+
+ "\u02df\3\2\2\2\u02e1\u02e2\3\2\2\2\u02e2\u02e3\3\2\2\2\u02e3\u02e4\5\u0092"+
+ "J\2\u02e4e\3\2\2\2\u02e5\u02e6\7F\2\2\u02e6\u02e7\5\u0092J\2\u02e7\u02e8"+
+ "\7\21\2\2\u02e8\u02e9\5`\61\2\u02e9\u02ea\5\u00dco\2\u02eag\3\2\2\2\u02eb"+
+ "\u02ec\5\u00b0Y\2\u02ec\u02ed\7\21\2\2\u02ed\u0300\5\u00b0Y\2\u02ee\u02f4"+
+ "\7g\2\2\u02ef\u02f0\5p9\2\u02f0\u02f1\5\u015e\u00b0\2\u02f1\u02f3\3\2"+
+ "\2\2\u02f2\u02ef\3\2\2\2\u02f3\u02f6\3\2\2\2\u02f4\u02f2\3\2\2\2\u02f4"+
+ "\u02f5\3\2\2\2\u02f5\u02fc\3\2\2\2\u02f6\u02f4\3\2\2\2\u02f7\u02f8\5j"+
+ "\66\2\u02f8\u02f9\5\u015e\u00b0\2\u02f9\u02fb\3\2\2\2\u02fa\u02f7\3\2"+
+ "\2\2\u02fb\u02fe\3\2\2\2\u02fc\u02fa\3\2\2\2\u02fc\u02fd\3\2\2\2\u02fd"+
+ "\u02ff\3\2\2\2\u02fe\u02fc\3\2\2\2\u02ff\u0301\7h\2\2\u0300\u02ee\3\2"+
+ "\2\2\u0300\u0301\3\2\2\2\u0301i\3\2\2\2\u0302\u0304\7\20\2\2\u0303\u0302"+
+ "\3\2\2\2\u0303\u0304\3\2\2\2\u0304\u0305\3\2\2\2\u0305\u0306\5l\67\2\u0306"+
+ "\u0307\7d\2\2\u0307\u0309\5\u012c\u0097\2\u0308\u030a\5\u00dco\2\u0309"+
+ "\u0308\3\2\2\2\u0309\u030a\3\2\2\2\u030ak\3\2\2\2\u030b\u030d\7e\2\2\u030c"+
+ "\u030e\7d\2\2\u030d\u030c\3\2\2\2\u030d\u030e\3\2\2\2\u030e\u0310\3\2"+
+ "\2\2\u030f\u0311\7\u0086\2\2\u0310\u030f\3\2\2\2\u0310\u0311\3\2\2\2\u0311"+
+ "\u0312\3\2\2\2\u0312\u0313\5\u011a\u008e\2\u0313\u0314\7f\2\2\u0314m\3"+
+ "\2\2\2\u0315\u031b\5\u00a2R\2\u0316\u0317\5\u00b0Y\2\u0317\u0318\7o\2"+
+ "\2\u0318\u0319\7d\2\2\u0319\u031b\3\2\2\2\u031a\u0315\3\2\2\2\u031a\u0316"+
+ "\3\2\2\2\u031bo\3\2\2\2\u031c\u031d\7\67\2\2\u031d\u031e\7d\2\2\u031e"+
+ "\u0321\7r\2\2\u031f\u0322\5n8\2\u0320\u0322\5\u013c\u009f\2\u0321\u031f"+
+ "\3\2\2\2\u0321\u0320\3\2\2\2\u0322q\3\2\2\2\u0323\u0324\7\60\2\2\u0324"+
+ "\u0325\7e\2\2\u0325\u0328\5\u00b0Y\2\u0326\u0327\7l\2\2\u0327\u0329\5"+
+ "\u00d4k\2\u0328\u0326\3\2\2\2\u0328\u0329\3\2\2\2\u0329\u032a\3\2\2\2"+
+ "\u032a\u032b\7f\2\2\u032bs\3\2\2\2\u032c\u032d\7/\2\2\u032d\u032e\7e\2"+
+ "\2\u032e\u032f\5\u00b0Y\2\u032f\u0330\7f\2\2\u0330u\3\2\2\2\u0331\u0334"+
+ "\5V,\2\u0332\u0335\5x=\2\u0333\u0335\5z>\2\u0334\u0332\3\2\2\2\u0334\u0333"+
+ "\3\2\2\2\u0335w\3\2\2\2\u0336\u0337\7L\2\2\u0337\u0338\7d\2\2\u0338\u033a"+
+ "\5\u012c\u0097\2\u0339\u033b\5^\60\2\u033a\u0339\3\2\2\2\u033a\u033b\3"+
+ "\2\2\2\u033by\3\2\2\2\u033c\u033d\7L\2\2\u033d\u033e\5\u0088E\2\u033e"+
+ "\u033f\7d\2\2\u033f\u0341\5\u012c\u0097\2\u0340\u0342\5^\60\2\u0341\u0340"+
+ "\3\2\2\2\u0341\u0342\3\2\2\2\u0342{\3\2\2\2\u0343\u0346\7\34\2\2\u0344"+
+ "\u0347\5v<\2\u0345\u0347\5\u00ccg\2\u0346\u0344\3\2\2\2\u0346\u0345\3"+
+ "\2\2\2\u0347}\3\2\2\2\u0348\u0349\7\67\2\2\u0349\u034a\7d\2\2\u034a\u034c"+
+ "\5\u0130\u0099\2\u034b\u034d\5\u0080A\2\u034c\u034b\3\2\2\2\u034c\u034d"+
+ "\3\2\2\2\u034d\177\3\2\2\2\u034e\u034f\7g\2\2\u034f\u0350\5\u0092J\2\u0350"+
+ "\u0351\5\u015e\u00b0\2\u0351\u0352\7h\2\2\u0352\u0081\3\2\2\2\u0353\u0354"+
+ "\7\67\2\2\u0354\u0355\5\u0088E\2\u0355\u0356\7d\2\2\u0356\u0358\5\u0130"+
+ "\u0099\2\u0357\u0359\5\u0080A\2\u0358\u0357\3\2\2\2\u0358\u0359\3\2\2"+
+ "\2\u0359\u0083\3\2\2\2\u035a\u0362\5\b\5\2\u035b\u035e\5\u00b0Y\2\u035c"+
+ "\u035d\7k\2\2\u035d\u035f\5\u00d4k\2\u035e\u035c\3\2\2\2\u035e\u035f\3"+
+ "\2\2\2\u035f\u0363\3\2\2\2\u0360\u0361\7k\2\2\u0361\u0363\5\u00d4k\2\u0362"+
+ "\u035b\3\2\2\2\u0362\u0360\3\2\2\2\u0363\u0085\3\2\2\2\u0364\u0365\5\b"+
+ "\5\2\u0365\u0366\7r\2\2\u0366\u0367\5\u00d4k\2\u0367\u0087\3\2\2\2\u0368"+
+ "\u036a\7e\2\2\u0369\u036b\5\n\6\2\u036a\u0369\3\2\2\2\u036a\u036b\3\2"+
+ "\2\2\u036b\u036c\3\2\2\2\u036c\u036e\5\u00b0Y\2\u036d\u036f\7l\2\2\u036e"+
+ "\u036d\3\2\2\2\u036e\u036f\3\2\2\2\u036f\u0370\3\2\2\2\u0370\u0371\7f"+
+ "\2\2\u0371\u0089\3\2\2\2\u0372\u0375\5\u008cG\2\u0373\u0375\5\u008eH\2"+
+ "\u0374\u0372\3\2\2\2\u0374\u0373\3\2\2\2\u0375\u008b\3\2\2\2\u0376\u0378"+
+ "\5\u00d2j\2\u0377\u0376\3\2\2\2\u0377\u0378\3\2\2\2\u0378\u0379\3\2\2"+
+ "\2\u0379\u037a\5\u0090I\2\u037a\u008d\3\2\2\2\u037b\u037d\7\34\2\2\u037c"+
+ "\u037e\5\u00d2j\2\u037d\u037c\3\2\2\2\u037d\u037e\3\2\2\2\u037e\u037f"+
+ "\3\2\2\2\u037f\u0380\5\u0090I\2\u0380\u008f\3\2\2\2\u0381\u0383\7s\2\2"+
+ "\u0382\u0381\3\2\2\2\u0382\u0383\3\2\2\2\u0383\u0384\3\2\2\2\u0384\u0385"+
+ "\5\u00b0Y\2\u0385\u0091\3\2\2\2\u0386\u0387\bJ\1\2\u0387\u0388\t\b\2\2"+
+ "\u0388\u0397\5\u0092J\20\u0389\u0397\5\u00a2R\2\u038a\u038b\7\33\2\2\u038b"+
+ "\u038c\5.\30\2\u038c\u038d\7\35\2\2\u038d\u038e\5\u0092J\4\u038e\u0397"+
+ "\3\2\2\2\u038f\u0390\t\t\2\2\u0390\u0391\5&\24\2\u0391\u0392\7n\2\2\u0392"+
+ "\u0393\7n\2\2\u0393\u0394\5*\26\2\u0394\u0395\5\u0092J\3\u0395\u0397\3"+
+ "\2\2\2\u0396\u0386\3\2\2\2\u0396\u0389\3\2\2\2\u0396\u038a\3\2\2\2\u0396"+
+ "\u038f\3\2\2\2\u0397\u03bb\3\2\2\2\u0398\u0399\f\16\2\2\u0399\u039a\t"+
+ "\n\2\2\u039a\u03ba\5\u0092J\17\u039b\u039c\f\r\2\2\u039c\u039d\t\13\2"+
+ "\2\u039d\u03ba\5\u0092J\16\u039e\u039f\f\f\2\2\u039f\u03a0\t\f\2\2\u03a0"+
+ "\u03ba\5\u0092J\r\u03a1\u03a2\f\13\2\2\u03a2\u03a3\t\r\2\2\u03a3\u03ba"+
+ "\5\u0092J\f\u03a4\u03a5\f\n\2\2\u03a5\u03a6\t\16\2\2\u03a6\u03ba\5\u0092"+
+ "J\13\u03a7\u03a8\f\b\2\2\u03a8\u03a9\7u\2\2\u03a9\u03ba\5\u0092J\t\u03aa"+
+ "\u03ab\f\7\2\2\u03ab\u03ac\7t\2\2\u03ac\u03ba\5\u0092J\b\u03ad\u03ae\f"+
+ "\6\2\2\u03ae\u03af\7#\2\2\u03af\u03ba\5\u0092J\6\u03b0\u03b1\f\5\2\2\u03b1"+
+ "\u03b2\7&\2\2\u03b2\u03b3\5\u0092J\2\u03b3\u03b4\7n\2\2\u03b4\u03b5\5"+
+ "\u0092J\5\u03b5\u03ba\3\2\2\2\u03b6\u03b7\f\t\2\2\u03b7\u03b8\7\21\2\2"+
+ "\u03b8\u03ba\5`\61\2\u03b9\u0398\3\2\2\2\u03b9\u039b\3\2\2\2\u03b9\u039e"+
+ "\3\2\2\2\u03b9\u03a1\3\2\2\2\u03b9\u03a4\3\2\2\2\u03b9\u03a7\3\2\2\2\u03b9"+
+ "\u03aa\3\2\2\2\u03b9\u03ad\3\2\2\2\u03b9\u03b0\3\2\2\2\u03b9\u03b6\3\2"+
+ "\2\2\u03ba\u03bd\3\2\2\2\u03bb\u03b9\3\2\2\2\u03bb\u03bc\3\2\2\2\u03bc"+
+ "\u0093\3\2\2\2\u03bd\u03bb\3\2\2\2\u03be\u03d3\5\30\r\2\u03bf\u03d3\5"+
+ "\32\16\2\u03c0\u03d3\5\u0098M\2\u03c1\u03d3\5\u0096L\2\u03c2\u03d3\5\u00cc"+
+ "g\2\u03c3\u03d3\5\u00ecw\2\u03c4\u03d3\5\u00e0q\2\u03c5\u03d3\5\u0118"+
+ "\u008d\2\u03c6\u03d3\5\u00eex\2\u03c7\u03d3\5\u00f0y\2\u03c8\u03d3\5\u00f2"+
+ "z\2\u03c9\u03d3\5\u00f4{\2\u03ca\u03d3\5\u00f6|\2\u03cb\u03d3\5\u00dc"+
+ "o\2\u03cc\u03d3\5\u00f8}\2\u03cd\u03d3\5\u00fa~\2\u03ce\u03d3\5\u010c"+
+ "\u0087\2\u03cf\u03d3\5\u009aN\2\u03d0\u03d3\5\u009eP\2\u03d1\u03d3\5f"+
+ "\64\2\u03d2\u03be\3\2\2\2\u03d2\u03bf\3\2\2\2\u03d2\u03c0\3\2\2\2\u03d2"+
+ "\u03c1\3\2\2\2\u03d2\u03c2\3\2\2\2\u03d2\u03c3\3\2\2\2\u03d2\u03c4\3\2"+
+ "\2\2\u03d2\u03c5\3\2\2\2\u03d2\u03c6\3\2\2\2\u03d2\u03c7\3\2\2\2\u03d2"+
+ "\u03c8\3\2\2\2\u03d2\u03c9\3\2\2\2\u03d2\u03ca\3\2\2\2\u03d2\u03cb\3\2"+
+ "\2\2\u03d2\u03cc\3\2\2\2\u03d2\u03cd\3\2\2\2\u03d2\u03ce\3\2\2\2\u03d2"+
+ "\u03cf\3\2\2\2\u03d2\u03d0\3\2\2\2\u03d2\u03d1\3\2\2\2\u03d3\u0095\3\2"+
+ "\2\2\u03d4\u03d5\7%\2\2\u03d5\u03d6\5\u0092J\2\u03d6\u0097\3\2\2\2\u03d7"+
+ "\u03d8\7W\2\2\u03d8\u03da\5\u0092J\2\u03d9\u03db\5\u00dco\2\u03da\u03d9"+
+ "\3\2\2\2\u03da\u03db\3\2\2\2\u03db\u0099\3\2\2\2\u03dc\u03dd\5\u009cO"+
+ "\2\u03dd\u03de\5\u0114\u008b\2\u03de\u009b\3\2\2\2\u03df\u03e0\7\16\2"+
+ "\2\u03e0\u03e1\5\u0092J\2\u03e1\u03e2\5\u015e\u00b0\2\u03e2\u03e4\3\2"+
+ "\2\2\u03e3\u03df\3\2\2\2\u03e4\u03e7\3\2\2\2\u03e5\u03e3\3\2\2\2\u03e5"+
+ "\u03e6\3\2\2\2\u03e6\u03ec\3\2\2\2\u03e7\u03e5\3\2\2\2\u03e8\u03e9\7\17"+
+ "\2\2\u03e9\u03ea\5Z.\2\u03ea\u03eb\5\u015e\u00b0\2\u03eb\u03ed\3\2\2\2"+
+ "\u03ec\u03e8\3\2\2\2\u03ec\u03ed\3\2\2\2\u03ed\u009d\3\2\2\2\u03ee\u03ef"+
+ "\7P\2\2\u03ef\u03f4\5\u0092J\2\u03f0\u03f1\7P\2\2\u03f1\u03f2\t\3\2\2"+
+ "\u03f2\u03f4\5.\30\2\u03f3\u03ee\3\2\2\2\u03f3\u03f0\3\2\2\2\u03f4\u009f"+
+ "\3\2\2\2\u03f5\u03fe\7\5\2\2\u03f6\u03fe\7\6\2\2\u03f7\u03fe\7c\2\2\u03f8"+
+ "\u03fe\5\u013a\u009e\2\u03f9\u03fe\5\u0150\u00a9\2\u03fa\u03fe\7\3\2\2"+
+ "\u03fb\u03fe\7\u008e\2\2\u03fc\u03fe\7\u008f\2\2\u03fd\u03f5\3\2\2\2\u03fd"+
+ "\u03f6\3\2\2\2\u03fd\u03f7\3\2\2\2\u03fd\u03f8\3\2\2\2\u03fd\u03f9\3\2"+
+ "\2\2\u03fd\u03fa\3\2\2\2\u03fd\u03fb\3\2\2\2\u03fd\u03fc\3\2\2\2\u03fe"+
+ "\u00a1\3\2\2\2\u03ff\u0400\bR\1\2\u0400\u040c\5\u0136\u009c\2\u0401\u040c"+
+ "\5\u0132\u009a\2\u0402\u040c\5\u015a\u00ae\2\u0403\u040c\5 \21\2\u0404"+
+ "\u040c\5t;\2\u0405\u040c\5r:\2\u0406\u0407\t\17\2\2\u0407\u0408\7e\2\2"+
+ "\u0408\u0409\5\u0092J\2\u0409\u040a\7f\2\2\u040a\u040c\3\2\2\2\u040b\u03ff"+
+ "\3\2\2\2\u040b\u0401\3\2\2\2\u040b\u0402\3\2\2\2\u040b\u0403\3\2\2\2\u040b"+
+ "\u0404\3\2\2\2\u040b\u0405\3\2\2\2\u040b\u0406\3\2\2\2\u040c\u0423\3\2"+
+ "\2\2\u040d\u040e\f\13\2\2\u040e\u040f\7o\2\2\u040f\u0422\7d\2\2\u0410"+
+ "\u0411\f\n\2\2\u0411\u0422\5\u0154\u00ab\2\u0412\u0413\f\t\2\2\u0413\u0422"+
+ "\5\u00bc_\2\u0414\u0415\f\b\2\2\u0415\u0422\5H%\2\u0416\u0417\f\7\2\2"+
+ "\u0417\u0422\5\u0156\u00ac\2\u0418\u0419\f\6\2\2\u0419\u0422\5\u0158\u00ad"+
+ "\2\u041a\u041b\f\5\2\2\u041b\u041c\5\u0158\u00ad\2\u041c\u041d\7\22\2"+
+ "\2\u041d\u041e\5`\61\2\u041e\u0422\3\2\2\2\u041f\u0420\f\4\2\2\u0420\u0422"+
+ "\5\u00a8U\2\u0421\u040d\3\2\2\2\u0421\u0410\3\2\2\2\u0421\u0412\3\2\2"+
+ "\2\u0421\u0414\3\2\2\2\u0421\u0416\3\2\2\2\u0421\u0418\3\2\2\2\u0421\u041a"+
+ "\3\2\2\2\u0421\u041f\3\2\2\2\u0422\u0425\3\2\2\2\u0423\u0421\3\2\2\2\u0423"+
+ "\u0424\3\2\2\2\u0424\u00a3\3\2\2\2\u0425\u0423\3\2\2\2\u0426\u0427\5V"+
+ ",\2\u0427\u0428\5\u00a6T\2\u0428\u00a5\3\2\2\2\u0429\u042b\7L\2\2\u042a"+
+ "\u042c\7d\2\2\u042b\u042a\3\2\2\2\u042b\u042c\3\2\2\2\u042c\u042d\3\2"+
+ "\2\2\u042d\u042f\5\u012c\u0097\2\u042e\u0430\5^\60\2\u042f\u042e\3\2\2"+
+ "\2\u042f\u0430\3\2\2\2\u0430\u00a7\3\2\2\2\u0431\u0433\7\'\2\2\u0432\u0434"+
+ "\5\u00d4k\2\u0433\u0432\3\2\2\2\u0433\u0434\3\2\2\2\u0434\u0436\3\2\2"+
+ "\2\u0435\u0437\7l\2\2\u0436\u0435\3\2\2\2\u0436\u0437\3\2\2\2\u0437\u0438"+
+ "\3\2\2\2\u0438\u0439\7(\2\2\u0439\u00a9\3\2\2\2\u043a\u043b\7M\2\2\u043b"+
+ "\u0445\7g\2\2\u043c\u0440\5\u00aeX\2\u043d\u0440\5\u011a\u008e\2\u043e"+
+ "\u0440\5\u00acW\2\u043f\u043c\3\2\2\2\u043f\u043d\3\2\2\2\u043f\u043e"+
+ "\3\2\2\2\u0440\u0441\3\2\2\2\u0441\u0442\5\u015e\u00b0\2\u0442\u0444\3"+
+ "\2\2\2\u0443\u043f\3\2\2\2\u0444\u0447\3\2\2\2\u0445\u0443\3\2\2\2\u0445"+
+ "\u0446\3\2\2\2\u0446\u0448\3\2\2\2\u0447\u0445\3\2\2\2\u0448\u0449\7h"+
+ "\2\2\u0449\u00ab\3\2\2\2\u044a\u044b\7\67\2\2\u044b\u044c\7d\2\2\u044c"+
+ "\u044d\5\u0130\u0099\2\u044d\u00ad\3\2\2\2\u044e\u0450\7\34\2\2\u044f"+
+ "\u044e\3\2\2\2\u044f\u0450\3\2\2\2\u0450\u0451\3\2\2\2\u0451\u0452\5V"+
+ ",\2\u0452\u0453\7d\2\2\u0453\u0454\5\u0130\u0099\2\u0454\u0455\5\u012e"+
+ "\u0098\2\u0455\u045e\3\2\2\2\u0456\u0458\7\34\2\2\u0457\u0456\3\2\2\2"+
+ "\u0457\u0458\3\2\2\2\u0458\u0459\3\2\2\2\u0459\u045a\5V,\2\u045a\u045b"+
+ "\7d\2\2\u045b\u045c\5\u0130\u0099\2\u045c\u045e\3\2\2\2\u045d\u044f\3"+
+ "\2\2\2\u045d\u0457\3\2\2\2\u045e\u00af\3\2\2\2\u045f\u0467\5\u011a\u008e"+
+ "\2\u0460\u0467\5\u00b2Z\2\u0461\u0467\5L\'\2\u0462\u0463\7e\2\2\u0463"+
+ "\u0464\5\u00b0Y\2\u0464\u0465\7f\2\2\u0465\u0467\3\2\2\2\u0466\u045f\3"+
+ "\2\2\2\u0466\u0460\3\2\2\2\u0466\u0461\3\2\2\2\u0466\u0462\3\2\2\2\u0467"+
+ "\u00b1\3\2\2\2\u0468\u0472\5\u011c\u008f\2\u0469\u0472\5\u014c\u00a7\2"+
+ "\u046a\u0472\5\u0122\u0092\2\u046b\u0472\5\u012a\u0096\2\u046c\u0472\5"+
+ "\u00aaV\2\u046d\u0472\5\u0124\u0093\2\u046e\u0472\5\u0126\u0094\2\u046f"+
+ "\u0472\5\u0128\u0095\2\u0470\u0472\5\u00b4[\2\u0471\u0468\3\2\2\2\u0471"+
+ "\u0469\3\2\2\2\u0471\u046a\3\2\2\2\u0471\u046b\3\2\2\2\u0471\u046c\3\2"+
+ "\2\2\u0471\u046d\3\2\2\2\u0471\u046e\3\2\2\2\u0471\u046f\3\2\2\2\u0471"+
+ "\u0470\3\2\2\2\u0472\u00b3\3\2\2\2\u0473\u0474\7\67\2\2\u0474\u0475\5"+
+ "\u00b6\\\2\u0475\u00b5\3\2\2\2\u0476\u0482\7e\2\2\u0477\u047c\5\u00b0"+
+ "Y\2\u0478\u0479\7l\2\2\u0479\u047b\5\u00b0Y\2\u047a\u0478\3\2\2\2\u047b"+
+ "\u047e\3\2\2\2\u047c\u047a\3\2\2\2\u047c\u047d\3\2\2\2\u047d\u0480\3\2"+
+ "\2\2\u047e\u047c\3\2\2\2\u047f\u0481\7l\2\2\u0480\u047f\3\2\2\2\u0480"+
+ "\u0481\3\2\2\2\u0481\u0483\3\2\2\2\u0482\u0477\3\2\2\2\u0482\u0483\3\2"+
+ "\2\2\u0483\u0484\3\2\2\2\u0484\u0485\7f\2\2\u0485\u00b7\3\2\2\2\u0486"+
+ "\u048e\5\u014c\u00a7\2\u0487\u048e\5\u011c\u008f\2\u0488\u048e\5\u00ba"+
+ "^\2\u0489\u048e\5\u0124\u0093\2\u048a\u048e\5\u0126\u0094\2\u048b\u048e"+
+ "\5L\'\2\u048c\u048e\5\u011a\u008e\2\u048d\u0486\3\2\2\2\u048d\u0487\3"+
+ "\2\2\2\u048d\u0488\3\2\2\2\u048d\u0489\3\2\2\2\u048d\u048a\3\2\2\2\u048d"+
+ "\u048b\3\2\2\2\u048d\u048c\3\2\2\2\u048e\u00b9\3\2\2\2\u048f\u0490\7i"+
+ "\2\2\u0490\u0491\7s\2\2\u0491\u0492\7j\2\2\u0492\u0493\5\u0120\u0091\2"+
+ "\u0493\u00bb\3\2\2\2\u0494\u04a4\7i\2\2\u0495\u0497\5\u00be`\2\u0496\u0495"+
+ "\3\2\2\2\u0496\u0497\3\2\2\2\u0497\u0498\3\2\2\2\u0498\u049a\7n\2\2\u0499"+
"\u049b\5\u00c0a\2\u049a\u0499\3\2\2\2\u049a\u049b\3\2\2\2\u049b\u04a5"+
"\3\2\2\2\u049c\u049e\5\u00be`\2\u049d\u049c\3\2\2\2\u049d\u049e\3\2\2"+
- "\2\u049e\u049f\3\2\2\2\u049f\u04a0\7m\2\2\u04a0\u04a1\5\u00c0a\2\u04a1"+
- "\u04a2\7m\2\2\u04a2\u04a3\5\u00c2b\2\u04a3\u04a5\3\2\2\2\u04a4\u0496\3"+
- "\2\2\2\u04a4\u049d\3\2\2\2\u04a5\u04a6\3\2\2\2\u04a6\u04a7\7i\2\2\u04a7"+
+ "\2\u049e\u049f\3\2\2\2\u049f\u04a0\7n\2\2\u04a0\u04a1\5\u00c0a\2\u04a1"+
+ "\u04a2\7n\2\2\u04a2\u04a3\5\u00c2b\2\u04a3\u04a5\3\2\2\2\u04a4\u0496\3"+
+ "\2\2\2\u04a4\u049d\3\2\2\2\u04a5\u04a6\3\2\2\2\u04a6\u04a7\7j\2\2\u04a7"+
"\u00bd\3\2\2\2\u04a8\u04a9\5\u0092J\2\u04a9\u00bf\3\2\2\2\u04aa\u04ab"+
"\5\u0092J\2\u04ab\u00c1\3\2\2\2\u04ac\u04ad\5\u0092J\2\u04ad\u00c3\3\2"+
"\2\2\u04ae\u04b0\t\20\2\2\u04af\u04ae\3\2\2\2\u04af\u04b0\3\2\2\2\u04b0"+
- "\u04b1\3\2\2\2\u04b1\u04b2\7j\2\2\u04b2\u00c5\3\2\2\2\u04b3\u04b4\7V\2"+
- "\2\u04b4\u04b5\7c\2\2\u04b5\u00c7\3\2\2\2\u04b6\u04b7\5\u0150\u00a9\2"+
- "\u04b7\u00c9\3\2\2\2\u04b8\u04bc\5\u00ccg\2\u04b9\u04bc\5\u00d4k\2\u04ba"+
- "\u04bc\5\u00d8m\2\u04bb\u04b8\3\2\2\2\u04bb\u04b9\3\2\2\2\u04bb\u04ba"+
- "\3\2\2\2\u04bc\u00cb\3\2\2\2\u04bd\u04c9\7X\2\2\u04be\u04ca\5\u00ceh\2"+
- "\u04bf\u04c5\7d\2\2\u04c0\u04c1\5\u00ceh\2\u04c1\u04c2\5\u015e\u00b0\2"+
- "\u04c2\u04c4\3\2\2\2\u04c3\u04c0\3\2\2\2\u04c4\u04c7\3\2\2\2\u04c5\u04c3"+
- "\3\2\2\2\u04c5\u04c6\3\2\2\2\u04c6\u04c8\3\2\2\2\u04c7\u04c5\3\2\2\2\u04c8"+
- "\u04ca\7e\2\2\u04c9\u04be\3\2\2\2\u04c9\u04bf\3\2\2\2\u04ca\u00cd\3\2"+
- "\2\2\u04cb\u04d1\5\u00d0i\2\u04cc\u04ce\5\u00b0Y\2\u04cd\u04cc\3\2\2\2"+
- "\u04cd\u04ce\3\2\2\2\u04ce\u04cf\3\2\2\2\u04cf\u04d0\7j\2\2\u04d0\u04d2"+
- "\5\u00d2j\2\u04d1\u04cd\3\2\2\2\u04d1\u04d2\3\2\2\2\u04d2\u00cf\3\2\2"+
- "\2\u04d3\u04d8\7c\2\2\u04d4\u04d5\7k\2\2\u04d5\u04d7\7c\2\2\u04d6\u04d4"+
- "\3\2\2\2\u04d7\u04da\3\2\2\2\u04d8\u04d6\3\2\2\2\u04d8\u04d9\3\2\2\2\u04d9"+
- "\u00d1\3\2\2\2\u04da\u04d8\3\2\2\2\u04db\u04e0\5\u0092J\2\u04dc\u04dd"+
- "\7k\2\2\u04dd\u04df\5\u0092J\2\u04de\u04dc\3\2\2\2\u04df\u04e2\3\2\2\2"+
- "\u04e0\u04de\3\2\2\2\u04e0\u04e1\3\2\2\2\u04e1\u00d3\3\2\2\2\u04e2\u04e0"+
- "\3\2\2\2\u04e3\u04ef\7\\\2\2\u04e4\u04f0\5\u00d6l\2\u04e5\u04eb\7d\2\2"+
- "\u04e6\u04e7\5\u00d6l\2\u04e7\u04e8\5\u015e\u00b0\2\u04e8\u04ea\3\2\2"+
- "\2\u04e9\u04e6\3\2\2\2\u04ea\u04ed\3\2\2\2\u04eb\u04e9\3\2\2\2\u04eb\u04ec"+
- "\3\2\2\2\u04ec\u04ee\3\2\2\2\u04ed\u04eb\3\2\2\2\u04ee\u04f0\7e\2\2\u04ef"+
- "\u04e4\3\2\2\2\u04ef\u04e5\3\2\2\2\u04f0\u00d5\3\2\2\2\u04f1\u04f3\7c"+
- "\2\2\u04f2\u04f4\7j\2\2\u04f3\u04f2\3\2\2\2\u04f3\u04f4\3\2\2\2\u04f4"+
- "\u04f5\3\2\2\2\u04f5\u04f6\5\u00b0Y\2\u04f6\u00d7\3\2\2\2\u04f7\u0503"+
- "\7a\2\2\u04f8\u0504\5\u0084C\2\u04f9\u04ff\7d\2\2\u04fa\u04fb\5\u0084"+
- "C\2\u04fb\u04fc\5\u015e\u00b0\2\u04fc\u04fe\3\2\2\2\u04fd\u04fa\3\2\2"+
- "\2\u04fe\u0501\3\2\2\2\u04ff\u04fd\3\2\2\2\u04ff\u0500\3\2\2\2\u0500\u0502"+
- "\3\2\2\2\u0501\u04ff\3\2\2\2\u0502\u0504\7e\2\2\u0503\u04f8\3\2\2\2\u0503"+
- "\u04f9\3\2\2\2\u0504\u00d9\3\2\2\2\u0505\u0507\7f\2\2\u0506\u0508\5\u00dc"+
- "o\2\u0507\u0506\3\2\2\2\u0507\u0508\3\2\2\2\u0508\u0509\3\2\2\2\u0509"+
- "\u050a\7g\2\2\u050a\u00db\3\2\2\2\u050b\u050d\5\u015e\u00b0\2\u050c\u050b"+
- "\3\2\2\2\u050c\u050d\3\2\2\2\u050d\u050e\3\2\2\2\u050e\u050f\5\u0094K"+
- "\2\u050f\u0510\5\u015e\u00b0\2\u0510\u0512\3\2\2\2\u0511\u050c\3\2\2\2"+
- "\u0512\u0513\3\2\2\2\u0513\u0511\3\2\2\2\u0513\u0514\3\2\2\2\u0514\u00dd"+
- "\3\2\2\2\u0515\u051b\5\u00e2r\2\u0516\u051b\5\u00e4s\2\u0517\u051b\5\u00e6"+
- "t\2\u0518\u051b\5\u00e0q\2\u0519\u051b\5\u0086D\2\u051a\u0515\3\2\2\2"+
- "\u051a\u0516\3\2\2\2\u051a\u0517\3\2\2\2\u051a\u0518\3\2\2\2\u051a\u0519"+
- "\3\2\2\2\u051b\u00df\3\2\2\2\u051c\u051d\5\u0092J\2\u051d\u00e1\3\2\2"+
- "\2\u051e\u051f\5\u0092J\2\u051f\u0520\7\u0087\2\2\u0520\u0521\5\u0092"+
- "J\2\u0521\u00e3\3\2\2\2\u0522\u0523\5\u0092J\2\u0523\u0524\t\21\2\2\u0524"+
- "\u00e5\3\2\2\2\u0525\u0526\5\u00d2j\2\u0526\u0527\5\u00c4c\2\u0527\u0528"+
- "\5\u00d2j\2\u0528\u00e7\3\2\2\2\u0529\u052a\t\22\2\2\u052a\u00e9\3\2\2"+
- "\2\u052b\u052c\7c\2\2\u052c\u052e\7m\2\2\u052d\u052f\5\u0094K\2\u052e"+
- "\u052d\3\2\2\2\u052e\u052f\3\2\2\2\u052f\u00eb\3\2\2\2\u0530\u0532\7`"+
- "\2\2\u0531\u0533\5\u00d2j\2\u0532\u0531\3\2\2\2\u0532\u0533\3\2\2\2\u0533"+
- "\u00ed\3\2\2\2\u0534\u0536\7I\2\2\u0535\u0537\7c\2\2\u0536\u0535\3\2\2"+
- "\2\u0536\u0537\3\2\2\2\u0537\u00ef\3\2\2\2\u0538\u053a\7]\2\2\u0539\u053b"+
- "\7c\2\2\u053a\u0539\3\2\2\2\u053a\u053b\3\2\2\2\u053b\u00f1\3\2\2\2\u053c"+
- "\u053d\7U\2\2\u053d\u053e\7c\2\2\u053e\u00f3\3\2\2\2\u053f\u0540\7Y\2"+
- "\2\u0540\u00f5\3\2\2\2\u0541\u054a\7Z\2\2\u0542\u054b\5\u0092J\2\u0543"+
- "\u0544\5\u015e\u00b0\2\u0544\u0545\5\u0092J\2\u0545\u054b\3\2\2\2\u0546"+
- "\u0547\5\u00dep\2\u0547\u0548\5\u015e\u00b0\2\u0548\u0549\5\u0092J\2\u0549"+
- "\u054b\3\2\2\2\u054a\u0542\3\2\2\2\u054a\u0543\3\2\2\2\u054a\u0546\3\2"+
- "\2\2\u054b\u054c\3\2\2\2\u054c\u0552\5\u00dan\2\u054d\u0550\7T\2\2\u054e"+
- "\u0551\5\u00f6|\2\u054f\u0551\5\u00dan\2\u0550\u054e\3\2\2\2\u0550\u054f"+
- "\3\2\2\2\u0551\u0553\3\2\2\2\u0552\u054d\3\2\2\2\u0552\u0553\3\2\2\2\u0553"+
- "\u00f7\3\2\2\2\u0554\u0557\5\u00fa~\2\u0555\u0557\5\u0100\u0081\2\u0556"+
- "\u0554\3\2\2\2\u0556\u0555\3\2\2\2\u0557\u00f9\3\2\2\2\u0558\u0563\7W"+
- "\2\2\u0559\u055b\5\u0092J\2\u055a\u0559\3\2\2\2\u055a\u055b\3\2\2\2\u055b"+
- "\u0564\3\2\2\2\u055c\u055e\5\u00dep\2\u055d\u055c\3\2\2\2\u055d\u055e"+
- "\3\2\2\2\u055e\u055f\3\2\2\2\u055f\u0561\5\u015e\u00b0\2\u0560\u0562\5"+
- "\u0092J\2\u0561\u0560\3\2\2\2\u0561\u0562\3\2\2\2\u0562\u0564\3\2\2\2"+
- "\u0563\u055a\3\2\2\2\u0563\u055d\3\2\2\2\u0564\u0565\3\2\2\2\u0565\u0569"+
- "\7f\2\2\u0566\u0568\5\u00fc\177\2\u0567\u0566\3\2\2\2\u0568\u056b\3\2"+
- "\2\2\u0569\u0567\3\2\2\2\u0569\u056a\3\2\2\2\u056a\u056c\3\2\2\2\u056b"+
- "\u0569\3\2\2\2\u056c\u056d\7g\2\2\u056d\u00fb\3\2\2\2\u056e\u056f\5\u00fe"+
- "\u0080\2\u056f\u0571\7m\2\2\u0570\u0572\5\u00dco\2\u0571\u0570\3\2\2\2"+
- "\u0571\u0572\3\2\2\2\u0572\u00fd\3\2\2\2\u0573\u0574\7N\2\2\u0574\u0577"+
- "\5\u00d2j\2\u0575\u0577\7J\2\2\u0576\u0573\3\2\2\2\u0576\u0575\3\2\2\2"+
- "\u0577\u00ff\3\2\2\2\u0578\u0581\7W\2\2\u0579\u0582\5\u0102\u0082\2\u057a"+
- "\u057b\5\u015e\u00b0\2\u057b\u057c\5\u0102\u0082\2\u057c\u0582\3\2\2\2"+
- "\u057d\u057e\5\u00dep\2\u057e\u057f\5\u015e\u00b0\2\u057f\u0580\5\u0102"+
- "\u0082\2\u0580\u0582\3\2\2\2\u0581\u0579\3\2\2\2\u0581\u057a\3\2\2\2\u0581"+
- "\u057d\3\2\2\2\u0582\u0583\3\2\2\2\u0583\u0587\7f\2\2\u0584\u0586\5\u0104"+
- "\u0083\2\u0585\u0584\3\2\2\2\u0586\u0589\3\2\2\2\u0587\u0585\3\2\2\2\u0587"+
- "\u0588\3\2\2\2\u0588\u058a\3\2\2\2\u0589\u0587\3\2\2\2\u058a\u058b\7g"+
- "\2\2\u058b\u0101\3\2\2\2\u058c\u058d\7c\2\2\u058d\u058f\7q\2\2\u058e\u058c"+
- "\3\2\2\2\u058e\u058f\3\2\2\2\u058f\u0590\3\2\2\2\u0590\u0591\5\u00a2R"+
- "\2\u0591\u0592\7n\2\2\u0592\u0593\7d\2\2\u0593\u0594\7\\\2\2\u0594\u0595"+
- "\7e\2\2\u0595\u0103\3\2\2\2\u0596\u0597\5\u0106\u0084\2\u0597\u0599\7"+
- "m\2\2\u0598\u059a\5\u00dco\2\u0599\u0598\3\2\2\2\u0599\u059a\3\2\2\2\u059a"+
- "\u0105\3\2\2\2\u059b\u059c\7N\2\2\u059c\u059f\5\u0108\u0085\2\u059d\u059f"+
- "\7J\2\2\u059e\u059b\3\2\2\2\u059e\u059d\3\2\2\2\u059f\u0107\3\2\2\2\u05a0"+
- "\u05a3\5\u00b0Y\2\u05a1\u05a3\7b\2\2\u05a2\u05a0\3\2\2\2\u05a2\u05a1\3"+
- "\2\2\2\u05a3\u05ab\3\2\2\2\u05a4\u05a7\7k\2\2\u05a5\u05a8\5\u00b0Y\2\u05a6"+
- "\u05a8\7b\2\2\u05a7\u05a5\3\2\2\2\u05a7\u05a6\3\2\2\2\u05a8\u05aa\3\2"+
- "\2\2\u05a9\u05a4\3\2\2\2\u05aa\u05ad\3\2\2\2\u05ab\u05a9\3\2\2\2\u05ab"+
- "\u05ac\3\2\2\2\u05ac\u0109\3\2\2\2\u05ad\u05ab\3\2\2\2\u05ae\u05af\7M"+
- "\2\2\u05af\u05b3\7f\2\2\u05b0\u05b2\5\u010c\u0087\2\u05b1\u05b0\3\2\2"+
- "\2\u05b2\u05b5\3\2\2\2\u05b3\u05b1\3\2\2\2\u05b3\u05b4\3\2\2\2\u05b4\u05b6"+
- "\3\2\2\2\u05b5\u05b3\3\2\2\2\u05b6\u05b7\7g\2\2\u05b7\u010b\3\2\2\2\u05b8"+
- "\u05b9\5\u010e\u0088\2\u05b9\u05bb\7m\2\2\u05ba\u05bc\5\u00dco\2\u05bb"+
- "\u05ba\3\2\2\2\u05bb\u05bc\3\2\2\2\u05bc\u010d\3\2\2\2\u05bd\u05c0\7N"+
- "\2\2\u05be\u05c1\5\u00e2r\2\u05bf\u05c1\5\u0110\u0089\2\u05c0\u05be\3"+
- "\2\2\2\u05c0\u05bf\3\2\2\2\u05c1\u05c4\3\2\2\2\u05c2\u05c4\7J\2\2\u05c3"+
- "\u05bd\3\2\2\2\u05c3\u05c2\3\2\2\2\u05c4\u010f\3\2\2\2\u05c5\u05c6\5\u00d2"+
- "j\2\u05c6\u05c7\7j\2\2\u05c7\u05cc\3\2\2\2\u05c8\u05c9\5\u00d0i\2\u05c9"+
- "\u05ca\7q\2\2\u05ca\u05cc\3\2\2\2\u05cb\u05c5\3\2\2\2\u05cb\u05c8\3\2"+
- "\2\2\u05cb\u05cc\3\2\2\2\u05cc\u05cd\3\2\2\2\u05cd\u05ce\5\u0092J\2\u05ce"+
- "\u0111\3\2\2\2\u05cf\u05d3\7^\2\2\u05d0\u05d4\5\u0092J\2\u05d1\u05d4\5"+
- "\u0114\u008b\2\u05d2\u05d4\5\u0116\u008c\2\u05d3\u05d0\3\2\2\2\u05d3\u05d1"+
- "\3\2\2\2\u05d3\u05d2\3\2\2\2\u05d3\u05d4\3\2\2\2\u05d4\u05d5\3\2\2\2\u05d5"+
- "\u05d6\5\u00dan\2\u05d6\u0113\3\2\2\2\u05d7\u05d9\5\u00dep\2\u05d8\u05d7"+
- "\3\2\2\2\u05d8\u05d9\3\2\2\2\u05d9\u05da\3\2\2\2\u05da\u05dc\5\u015e\u00b0"+
- "\2\u05db\u05dd\5\u0092J\2\u05dc\u05db\3\2\2\2\u05dc\u05dd\3\2\2\2\u05dd"+
- "\u05de\3\2\2\2\u05de\u05e0\5\u015e\u00b0\2\u05df\u05e1\5\u00dep\2\u05e0"+
- "\u05df\3\2\2\2\u05e0\u05e1\3\2\2\2\u05e1\u0115\3\2\2\2\u05e2\u05e3\5\u00d2"+
- "j\2\u05e3\u05e4\7j\2\2\u05e4\u05e9\3\2\2\2\u05e5\u05e6\5\u00d0i\2\u05e6"+
- "\u05e7\7q\2\2\u05e7\u05e9\3\2\2\2\u05e8\u05e2\3\2\2\2\u05e8\u05e5\3\2"+
- "\2\2\u05e8\u05e9\3\2\2\2\u05e9\u05ea\3\2\2\2\u05ea\u05eb\7[\2\2\u05eb"+
- "\u05ec\5\u0092J\2\u05ec\u0117\3\2\2\2\u05ed\u05ee\7P\2\2\u05ee\u05ef\5"+
- "\u0092J\2\u05ef\u0119\3\2\2\2\u05f0\u05f3\5\u013e\u00a0\2\u05f1\u05f3"+
- "\7c\2\2\u05f2\u05f0\3\2\2\2\u05f2\u05f1\3\2\2\2\u05f3\u011b\3\2\2\2\u05f4"+
- "\u05f5\7h\2\2\u05f5\u05f6\5\u011e\u0090\2\u05f6\u05f7\7i\2\2\u05f7\u05f8"+
- "\5\u0120\u0091\2\u05f8\u011d\3\2\2\2\u05f9\u05fa\5\u0092J\2\u05fa\u011f"+
- "\3\2\2\2\u05fb\u05fc\5\u00b0Y\2\u05fc\u0121\3\2\2\2\u05fd\u05fe\7\u0085"+
- "\2\2\u05fe\u05ff\5\u00b0Y\2\u05ff\u0123\3\2\2\2\u0600\u0601\7h\2\2\u0601"+
- "\u0602\7i\2\2\u0602\u0603\5\u0120\u0091\2\u0603\u0125\3\2\2\2\u0604\u0605"+
- "\7Q\2\2\u0605\u0606\7h\2\2\u0606\u0607\5\u00b0Y\2\u0607\u0608\7i\2\2\u0608"+
- "\u0609\5\u0120\u0091\2\u0609\u0127\3\2\2\2\u060a\u0610\7S\2\2\u060b\u060c"+
- "\7S\2\2\u060c\u0610\7\u0087\2\2\u060d\u060e\7\u0087\2\2\u060e\u0610\7"+
- "S\2\2\u060f\u060a\3\2\2\2\u060f\u060b\3\2\2\2\u060f\u060d\3\2\2\2\u0610"+
- "\u0611\3\2\2\2\u0611\u0612\5\u0120\u0091\2\u0612\u0129\3\2\2\2\u0613\u0614"+
- "\7K\2\2\u0614\u0615\5\u012c\u0097\2\u0615\u012b\3\2\2\2\u0616\u0617\5"+
- "\u0130\u0099\2\u0617\u0618\5\u012e\u0098\2\u0618\u061b\3\2\2\2\u0619\u061b"+
- "\5\u0130\u0099\2\u061a\u0616\3\2\2\2\u061a\u0619\3\2\2\2\u061b\u012d\3"+
- "\2\2\2\u061c\u061f\5\u0130\u0099\2\u061d\u061f\5\u00b0Y\2\u061e\u061c"+
- "\3\2\2\2\u061e\u061d\3\2\2\2\u061f\u012f\3\2\2\2\u0620\u062c\7d\2\2\u0621"+
- "\u0626\5\u008aF\2\u0622\u0623\7k\2\2\u0623\u0625\5\u008aF\2\u0624\u0622"+
- "\3\2\2\2\u0625\u0628\3\2\2\2\u0626\u0624\3\2\2\2\u0626\u0627\3\2\2\2\u0627"+
- "\u062a\3\2\2\2\u0628\u0626\3\2\2\2\u0629\u062b\7k\2\2\u062a\u0629\3\2"+
- "\2\2\u062a\u062b\3\2\2\2\u062b\u062d\3\2\2\2\u062c\u0621\3\2\2\2\u062c"+
- "\u062d\3\2\2\2\u062d\u062e\3\2\2\2\u062e\u062f\7e\2\2\u062f\u0131\3\2"+
- "\2\2\u0630\u0631\5\u0134\u009b\2\u0631\u0632\7d\2\2\u0632\u0634\5\u0092"+
- "J\2\u0633\u0635\7k\2\2\u0634\u0633\3\2\2\2\u0634\u0635\3\2\2\2\u0635\u0636"+
- "\3\2\2\2\u0636\u0637\7e\2\2\u0637\u0133\3\2\2\2\u0638\u063e\5\u00b2Z\2"+
- "\u0639\u063a\7d\2\2\u063a\u063b\5\u0134\u009b\2\u063b\u063c\7e\2\2\u063c"+
- "\u063e\3\2\2\2\u063d\u0638\3\2\2\2\u063d\u0639\3\2\2\2\u063e\u0135\3\2"+
- "\2\2\u063f\u0646\5\u0138\u009d\2\u0640\u0646\5\u013c\u009f\2\u0641\u0642"+
- "\7d\2\2\u0642\u0643\5\u0092J\2\u0643\u0644\7e\2\2\u0644\u0646\3\2\2\2"+
- "\u0645\u063f\3\2\2\2\u0645\u0640\3\2\2\2\u0645\u0641\3\2\2\2\u0646\u0137"+
- "\3\2\2\2\u0647\u064b\5\u00a0Q\2\u0648\u064b\5\u0140\u00a1\2\u0649\u064b"+
- "\5\u00a4S\2\u064a\u0647\3\2\2\2\u064a\u0648\3\2\2\2\u064a\u0649\3\2\2"+
- "\2\u064b\u0139\3\2\2\2\u064c\u064d\t\23\2\2\u064d\u013b\3\2\2\2\u064e"+
- "\u064f\7c\2\2\u064f\u013d\3\2\2\2\u0650\u0651\7c\2\2\u0651\u0652\7n\2"+
- "\2\u0652\u0653\7c\2\2\u0653\u013f\3\2\2\2\u0654\u0655\5\u00b8]\2\u0655"+
- "\u0656\5\u0142\u00a2\2\u0656\u0141\3\2\2\2\u0657\u065c\7f\2\2\u0658\u065a"+
- "\5\u0144\u00a3\2\u0659\u065b\7k\2\2\u065a\u0659\3\2\2\2\u065a\u065b\3"+
- "\2\2\2\u065b\u065d\3\2\2\2\u065c\u0658\3\2\2\2\u065c\u065d\3\2\2\2\u065d"+
- "\u065e\3\2\2\2\u065e\u065f\7g\2\2\u065f\u0143\3\2\2\2\u0660\u0665\5\u0146"+
- "\u00a4\2\u0661\u0662\7k\2\2\u0662\u0664\5\u0146\u00a4\2\u0663\u0661\3"+
- "\2\2\2\u0664\u0667\3\2\2\2\u0665\u0663\3\2\2\2\u0665\u0666\3\2\2\2\u0666"+
- "\u0145\3\2\2\2\u0667\u0665\3\2\2\2\u0668\u0669\5\u0148\u00a5\2\u0669\u066a"+
- "\7m\2\2\u066a\u066c\3\2\2\2\u066b\u0668\3\2\2\2\u066b\u066c\3\2\2\2\u066c"+
- "\u066d\3\2\2\2\u066d\u066e\5\u014a\u00a6\2\u066e\u0147\3\2\2\2\u066f\u0672"+
- "\5\u0092J\2\u0670\u0672\5\u0142\u00a2\2\u0671\u066f\3\2\2\2\u0671\u0670"+
- "\3\2\2\2\u0672\u0149\3\2\2\2\u0673\u0676\5\u0092J\2\u0674\u0676\5\u0142"+
- "\u00a2\2\u0675\u0673\3\2\2\2\u0675\u0674\3\2\2\2\u0676\u014b\3\2\2\2\u0677"+
- "\u0678\7R\2\2\u0678\u067e\7f\2\2\u0679\u067a\5\u014e\u00a8\2\u067a\u067b"+
- "\5\u015e\u00b0\2\u067b\u067d\3\2\2\2\u067c\u0679\3\2\2\2\u067d\u0680\3"+
- "\2\2\2\u067e\u067c\3\2\2\2\u067e\u067f\3\2\2\2\u067f\u0681\3\2\2\2\u0680"+
- "\u067e\3\2\2\2\u0681\u0682\7g\2\2\u0682\u014d\3\2\2\2\u0683\u0684\5\u00d0"+
- "i\2\u0684\u0685\5\u00b0Y\2\u0685\u0688\3\2\2\2\u0686\u0688\5\u0152\u00aa"+
- "\2\u0687\u0683\3\2\2\2\u0687\u0686\3\2\2\2\u0688\u068a\3\2\2\2\u0689\u068b"+
- "\5\u0150\u00a9\2\u068a\u0689\3\2\2\2\u068a\u068b\3\2\2\2\u068b\u014f\3"+
- "\2\2\2\u068c\u068d\t\24\2\2\u068d\u0151\3\2\2\2\u068e\u0690\7\u0085\2"+
- "\2\u068f\u068e\3\2\2\2\u068f\u0690\3\2\2\2\u0690\u0691\3\2\2\2\u0691\u0692"+
- "\5\u011a\u008e\2\u0692\u0153\3\2\2\2\u0693\u0694\7h\2\2\u0694\u0695\5"+
- "\u0092J\2\u0695\u0696\7i\2\2\u0696\u0155\3\2\2\2\u0697\u0698\7n\2\2\u0698"+
- "\u0699\7d\2\2\u0699\u069a\5\u00b0Y\2\u069a\u069b\7e\2\2\u069b\u0157\3"+
- "\2\2\2\u069c\u06ab\7d\2\2\u069d\u06a4\5\u00d2j\2\u069e\u06a1\5\u0134\u009b"+
- "\2\u069f\u06a0\7k\2\2\u06a0\u06a2\5\u00d2j\2\u06a1\u069f\3\2\2\2\u06a1"+
- "\u06a2\3\2\2\2\u06a2\u06a4\3\2\2\2\u06a3\u069d\3\2\2\2\u06a3\u069e\3\2"+
- "\2\2\u06a4\u06a6\3\2\2\2\u06a5\u06a7\7r\2\2\u06a6\u06a5\3\2\2\2\u06a6"+
- "\u06a7\3\2\2\2\u06a7\u06a9\3\2\2\2\u06a8\u06aa\7k\2\2\u06a9\u06a8\3\2"+
- "\2\2\u06a9\u06aa\3\2\2\2\u06aa\u06ac\3\2\2\2\u06ab\u06a3\3\2\2\2\u06ab"+
- "\u06ac\3\2\2\2\u06ac\u06ad\3\2\2\2\u06ad\u06ae\7e\2\2\u06ae\u0159\3\2"+
- "\2\2\u06af\u06b0\5\u0134\u009b\2\u06b0\u06b1\7n\2\2\u06b1\u06b2\7c\2\2"+
- "\u06b2\u015b\3\2\2\2\u06b3\u06b4\5\u00b0Y\2\u06b4\u015d\3\2\2\2\u06b5"+
- "\u06ba\7l\2\2\u06b6\u06ba\7\2\2\3\u06b7\u06ba\7\u009d\2\2\u06b8\u06ba"+
- "\6\u00b0\24\2\u06b9\u06b5\3\2\2\2\u06b9\u06b6\3\2\2\2\u06b9\u06b7\3\2"+
- "\2\2\u06b9\u06b8\3\2\2\2\u06ba\u015f\3\2\2\2\u00b1\u016e\u0173\u017a\u0184"+
- "\u018a\u0190\u01a0\u01a4\u01ad\u01b9\u01bd\u01c3\u01cb\u01d5\u01e5\u01f3"+
- "\u01f7\u01fe\u0206\u020f\u022f\u0237\u024f\u0260\u026c\u0275\u0283\u0295"+
- "\u029c\u02a1\u02a6\u02b0\u02b3\u02b7\u02bb\u02c2\u02c5\u02cb\u02d0\u02d2"+
- "\u02d5\u02dc\u02e1\u02f4\u02fc\u0300\u0303\u0309\u030d\u0310\u031a\u0321"+
- "\u0328\u0334\u033a\u0341\u0346\u034c\u0358\u035e\u0362\u036a\u036e\u0374"+
- "\u0377\u037d\u0382\u0396\u03b9\u03bb\u03d2\u03da\u03e5\u03ec\u03f3\u03fd"+
- "\u040b\u0421\u0423\u042b\u042f\u0433\u0436\u043f\u0445\u044f\u0457\u045d"+
- "\u0466\u0471\u047c\u0480\u0482\u048d\u0496\u049a\u049d\u04a4\u04af\u04bb"+
- "\u04c5\u04c9\u04cd\u04d1\u04d8\u04e0\u04eb\u04ef\u04f3\u04ff\u0503\u0507"+
- "\u050c\u0513\u051a\u052e\u0532\u0536\u053a\u054a\u0550\u0552\u0556\u055a"+
- "\u055d\u0561\u0563\u0569\u0571\u0576\u0581\u0587\u058e\u0599\u059e\u05a2"+
- "\u05a7\u05ab\u05b3\u05bb\u05c0\u05c3\u05cb\u05d3\u05d8\u05dc\u05e0\u05e8"+
- "\u05f2\u060f\u061a\u061e\u0626\u062a\u062c\u0634\u063d\u0645\u064a\u065a"+
- "\u065c\u0665\u066b\u0671\u0675\u067e\u0687\u068a\u068f\u06a1\u06a3\u06a6"+
- "\u06a9\u06ab\u06b9";
+ "\u04b1\3\2\2\2\u04b1\u04b2\7k\2\2\u04b2\u00c5\3\2\2\2\u04b3\u04b4\5\u00d4"+
+ "k\2\u04b4\u04b5\7k\2\2\u04b5\u04ba\3\2\2\2\u04b6\u04b7\5\b\5\2\u04b7\u04b8"+
+ "\7r\2\2\u04b8\u04ba\3\2\2\2\u04b9\u04b3\3\2\2\2\u04b9\u04b6\3\2\2\2\u04b9"+
+ "\u04ba\3\2\2\2\u04ba\u04bb\3\2\2\2\u04bb\u04bc\7\\\2\2\u04bc\u04c1\5\u0092"+
+ "J\2\u04bd\u04bf\7I\2\2\u04be\u04c0\7d\2\2\u04bf\u04be\3\2\2\2\u04bf\u04c0"+
+ "\3\2\2\2\u04c0\u04c2\3\2\2\2\u04c1\u04bd\3\2\2\2\u04c1\u04c2\3\2\2\2\u04c2"+
+ "\u00c7\3\2\2\2\u04c3\u04c4\7W\2\2\u04c4\u04c5\7d\2\2\u04c5\u00c9\3\2\2"+
+ "\2\u04c6\u04c7\5\u0150\u00a9\2\u04c7\u00cb\3\2\2\2\u04c8\u04cc\5\u00ce"+
+ "h\2\u04c9\u04cc\5\u00d6l\2\u04ca\u04cc\5\u00dan\2\u04cb\u04c8\3\2\2\2"+
+ "\u04cb\u04c9\3\2\2\2\u04cb\u04ca\3\2\2\2\u04cc\u00cd\3\2\2\2\u04cd\u04d9"+
+ "\7Y\2\2\u04ce\u04da\5\u00d0i\2\u04cf\u04d5\7e\2\2\u04d0\u04d1\5\u00d0"+
+ "i\2\u04d1\u04d2\5\u015e\u00b0\2\u04d2\u04d4\3\2\2\2\u04d3\u04d0\3\2\2"+
+ "\2\u04d4\u04d7\3\2\2\2\u04d5\u04d3\3\2\2\2\u04d5\u04d6\3\2\2\2\u04d6\u04d8"+
+ "\3\2\2\2\u04d7\u04d5\3\2\2\2\u04d8\u04da\7f\2\2\u04d9\u04ce\3\2\2\2\u04d9"+
+ "\u04cf\3\2\2\2\u04da\u00cf\3\2\2\2\u04db\u04e1\5\u00d2j\2\u04dc\u04de"+
+ "\5\u00b0Y\2\u04dd\u04dc\3\2\2\2\u04dd\u04de\3\2\2\2\u04de\u04df\3\2\2"+
+ "\2\u04df\u04e0\7k\2\2\u04e0\u04e2\5\u00d4k\2\u04e1\u04dd\3\2\2\2\u04e1"+
+ "\u04e2\3\2\2\2\u04e2\u00d1\3\2\2\2\u04e3\u04e8\7d\2\2\u04e4\u04e5\7l\2"+
+ "\2\u04e5\u04e7\7d\2\2\u04e6\u04e4\3\2\2\2\u04e7\u04ea\3\2\2\2\u04e8\u04e6"+
+ "\3\2\2\2\u04e8\u04e9\3\2\2\2\u04e9\u00d3\3\2\2\2\u04ea\u04e8\3\2\2\2\u04eb"+
+ "\u04f0\5\u0092J\2\u04ec\u04ed\7l\2\2\u04ed\u04ef\5\u0092J\2\u04ee\u04ec"+
+ "\3\2\2\2\u04ef\u04f2\3\2\2\2\u04f0\u04ee\3\2\2\2\u04f0\u04f1\3\2\2\2\u04f1"+
+ "\u00d5\3\2\2\2\u04f2\u04f0\3\2\2\2\u04f3\u04ff\7]\2\2\u04f4\u0500\5\u00d8"+
+ "m\2\u04f5\u04fb\7e\2\2\u04f6\u04f7\5\u00d8m\2\u04f7\u04f8\5\u015e\u00b0"+
+ "\2\u04f8\u04fa\3\2\2\2\u04f9\u04f6\3\2\2\2\u04fa\u04fd\3\2\2\2\u04fb\u04f9"+
+ "\3\2\2\2\u04fb\u04fc\3\2\2\2\u04fc\u04fe\3\2\2\2\u04fd\u04fb\3\2\2\2\u04fe"+
+ "\u0500\7f\2\2\u04ff\u04f4\3\2\2\2\u04ff\u04f5\3\2\2\2\u0500\u00d7\3\2"+
+ "\2\2\u0501\u0503\7d\2\2\u0502\u0504\7k\2\2\u0503\u0502\3\2\2\2\u0503\u0504"+
+ "\3\2\2\2\u0504\u0505\3\2\2\2\u0505\u0506\5\u00b0Y\2\u0506\u00d9\3\2\2"+
+ "\2\u0507\u0513\7b\2\2\u0508\u0514\5\u0084C\2\u0509\u050f\7e\2\2\u050a"+
+ "\u050b\5\u0084C\2\u050b\u050c\5\u015e\u00b0\2\u050c\u050e\3\2\2\2\u050d"+
+ "\u050a\3\2\2\2\u050e\u0511\3\2\2\2\u050f\u050d\3\2\2\2\u050f\u0510\3\2"+
+ "\2\2\u0510\u0512\3\2\2\2\u0511\u050f\3\2\2\2\u0512\u0514\7f\2\2\u0513"+
+ "\u0508\3\2\2\2\u0513\u0509\3\2\2\2\u0514\u00db\3\2\2\2\u0515\u0517\7g"+
+ "\2\2\u0516\u0518\5\u00dep\2\u0517\u0516\3\2\2\2\u0517\u0518\3\2\2\2\u0518"+
+ "\u0519\3\2\2\2\u0519\u051a\7h\2\2\u051a\u00dd\3\2\2\2\u051b\u051d\5\u015e"+
+ "\u00b0\2\u051c\u051b\3\2\2\2\u051c\u051d\3\2\2\2\u051d\u051e\3\2\2\2\u051e"+
+ "\u051f\5\u0094K\2\u051f\u0520\5\u015e\u00b0\2\u0520\u0522\3\2\2\2\u0521"+
+ "\u051c\3\2\2\2\u0522\u0523\3\2\2\2\u0523\u0521\3\2\2\2\u0523\u0524\3\2"+
+ "\2\2\u0524\u00df\3\2\2\2\u0525\u052b\5\u00e4s\2\u0526\u052b\5\u00e6t\2"+
+ "\u0527\u052b\5\u00e8u\2\u0528\u052b\5\u00e2r\2\u0529\u052b\5\u0086D\2"+
+ "\u052a\u0525\3\2\2\2\u052a\u0526\3\2\2\2\u052a\u0527\3\2\2\2\u052a\u0528"+
+ "\3\2\2\2\u052a\u0529\3\2\2\2\u052b\u00e1\3\2\2\2\u052c\u052d\5\u0092J"+
+ "\2\u052d\u00e3\3\2\2\2\u052e\u052f\5\u0092J\2\u052f\u0530\7\u0088\2\2"+
+ "\u0530\u0531\5\u0092J\2\u0531\u00e5\3\2\2\2\u0532\u0533\5\u0092J\2\u0533"+
+ "\u0534\t\21\2\2\u0534\u00e7\3\2\2\2\u0535\u0536\5\u00d4k\2\u0536\u0537"+
+ "\5\u00c4c\2\u0537\u0538\5\u00d4k\2\u0538\u00e9\3\2\2\2\u0539\u053a\t\22"+
+ "\2\2\u053a\u00eb\3\2\2\2\u053b\u053c\7d\2\2\u053c\u053e\7n\2\2\u053d\u053f"+
+ "\5\u0094K\2\u053e\u053d\3\2\2\2\u053e\u053f\3\2\2\2\u053f\u00ed\3\2\2"+
+ "\2\u0540\u0542\7a\2\2\u0541\u0543\5\u00d4k\2\u0542\u0541\3\2\2\2\u0542"+
+ "\u0543\3\2\2\2\u0543\u00ef\3\2\2\2\u0544\u0546\7J\2\2\u0545\u0547\7d\2"+
+ "\2\u0546\u0545\3\2\2\2\u0546\u0547\3\2\2\2\u0547\u00f1\3\2\2\2\u0548\u054a"+
+ "\7^\2\2\u0549\u054b\7d\2\2\u054a\u0549\3\2\2\2\u054a\u054b\3\2\2\2\u054b"+
+ "\u00f3\3\2\2\2\u054c\u054d\7V\2\2\u054d\u054e\7d\2\2\u054e\u00f5\3\2\2"+
+ "\2\u054f\u0550\7Z\2\2\u0550\u00f7\3\2\2\2\u0551\u055a\7[\2\2\u0552\u055b"+
+ "\5\u0092J\2\u0553\u0554\5\u015e\u00b0\2\u0554\u0555\5\u0092J\2\u0555\u055b"+
+ "\3\2\2\2\u0556\u0557\5\u00e0q\2\u0557\u0558\5\u015e\u00b0\2\u0558\u0559"+
+ "\5\u0092J\2\u0559\u055b\3\2\2\2\u055a\u0552\3\2\2\2\u055a\u0553\3\2\2"+
+ "\2\u055a\u0556\3\2\2\2\u055b\u055c\3\2\2\2\u055c\u0562\5\u00dco\2\u055d"+
+ "\u0560\7U\2\2\u055e\u0561\5\u00f8}\2\u055f\u0561\5\u00dco\2\u0560\u055e"+
+ "\3\2\2\2\u0560\u055f\3\2\2\2\u0561\u0563\3\2\2\2\u0562\u055d\3\2\2\2\u0562"+
+ "\u0563\3\2\2\2\u0563\u00f9\3\2\2\2\u0564\u0567\5\u00fc\177\2\u0565\u0567"+
+ "\5\u0102\u0082\2\u0566\u0564\3\2\2\2\u0566\u0565\3\2\2\2\u0567\u00fb\3"+
+ "\2\2\2\u0568\u0573\7X\2\2\u0569\u056b\5\u0092J\2\u056a\u0569\3\2\2\2\u056a"+
+ "\u056b\3\2\2\2\u056b\u0574\3\2\2\2\u056c\u056e\5\u00e0q\2\u056d\u056c"+
+ "\3\2\2\2\u056d\u056e\3\2\2\2\u056e\u056f\3\2\2\2\u056f\u0571\5\u015e\u00b0"+
+ "\2\u0570\u0572\5\u0092J\2\u0571\u0570\3\2\2\2\u0571\u0572\3\2\2\2\u0572"+
+ "\u0574\3\2\2\2\u0573\u056a\3\2\2\2\u0573\u056d\3\2\2\2\u0574\u0575\3\2"+
+ "\2\2\u0575\u0579\7g\2\2\u0576\u0578\5\u00fe\u0080\2\u0577\u0576\3\2\2"+
+ "\2\u0578\u057b\3\2\2\2\u0579\u0577\3\2\2\2\u0579\u057a\3\2\2\2\u057a\u057c"+
+ "\3\2\2\2\u057b\u0579\3\2\2\2\u057c\u057d\7h\2\2\u057d\u00fd\3\2\2\2\u057e"+
+ "\u057f\5\u0100\u0081\2\u057f\u0581\7n\2\2\u0580\u0582\5\u00dep\2\u0581"+
+ "\u0580\3\2\2\2\u0581\u0582\3\2\2\2\u0582\u00ff\3\2\2\2\u0583\u0584\7O"+
+ "\2\2\u0584\u0587\5\u00d4k\2\u0585\u0587\7K\2\2\u0586\u0583\3\2\2\2\u0586"+
+ "\u0585\3\2\2\2\u0587\u0101\3\2\2\2\u0588\u0591\7X\2\2\u0589\u0592\5\u0104"+
+ "\u0083\2\u058a\u058b\5\u015e\u00b0\2\u058b\u058c\5\u0104\u0083\2\u058c"+
+ "\u0592\3\2\2\2\u058d\u058e\5\u00e0q\2\u058e\u058f\5\u015e\u00b0\2\u058f"+
+ "\u0590\5\u0104\u0083\2\u0590\u0592\3\2\2\2\u0591\u0589\3\2\2\2\u0591\u058a"+
+ "\3\2\2\2\u0591\u058d\3\2\2\2\u0592\u0593\3\2\2\2\u0593\u0597\7g\2\2\u0594"+
+ "\u0596\5\u0106\u0084\2\u0595\u0594\3\2\2\2\u0596\u0599\3\2\2\2\u0597\u0595"+
+ "\3\2\2\2\u0597\u0598\3\2\2\2\u0598\u059a\3\2\2\2\u0599\u0597\3\2\2\2\u059a"+
+ "\u059b\7h\2\2\u059b\u0103\3\2\2\2\u059c\u059d\7d\2\2\u059d\u059f\7r\2"+
+ "\2\u059e\u059c\3\2\2\2\u059e\u059f\3\2\2\2\u059f\u05a0\3\2\2\2\u05a0\u05a1"+
+ "\5\u00a2R\2\u05a1\u05a2\7o\2\2\u05a2\u05a3\7e\2\2\u05a3\u05a4\7]\2\2\u05a4"+
+ "\u05a5\7f\2\2\u05a5\u0105\3\2\2\2\u05a6\u05a7\5\u0108\u0085\2\u05a7\u05a9"+
+ "\7n\2\2\u05a8\u05aa\5\u00dep\2\u05a9\u05a8\3\2\2\2\u05a9\u05aa\3\2\2\2"+
+ "\u05aa\u0107\3\2\2\2\u05ab\u05ac\7O\2\2\u05ac\u05af\5\u010a\u0086\2\u05ad"+
+ "\u05af\7K\2\2\u05ae\u05ab\3\2\2\2\u05ae\u05ad\3\2\2\2\u05af\u0109\3\2"+
+ "\2\2\u05b0\u05b3\5\u00b0Y\2\u05b1\u05b3\7c\2\2\u05b2\u05b0\3\2\2\2\u05b2"+
+ "\u05b1\3\2\2\2\u05b3\u05bb\3\2\2\2\u05b4\u05b7\7l\2\2\u05b5\u05b8\5\u00b0"+
+ "Y\2\u05b6\u05b8\7c\2\2\u05b7\u05b5\3\2\2\2\u05b7\u05b6\3\2\2\2\u05b8\u05ba"+
+ "\3\2\2\2\u05b9\u05b4\3\2\2\2\u05ba\u05bd\3\2\2\2\u05bb\u05b9\3\2\2\2\u05bb"+
+ "\u05bc\3\2\2\2\u05bc\u010b\3\2\2\2\u05bd\u05bb\3\2\2\2\u05be\u05bf\7N"+
+ "\2\2\u05bf\u05c3\7g\2\2\u05c0\u05c2\5\u010e\u0088\2\u05c1\u05c0\3\2\2"+
+ "\2\u05c2\u05c5\3\2\2\2\u05c3\u05c1\3\2\2\2\u05c3\u05c4\3\2\2\2\u05c4\u05c6"+
+ "\3\2\2\2\u05c5\u05c3\3\2\2\2\u05c6\u05c7\7h\2\2\u05c7\u010d\3\2\2\2\u05c8"+
+ "\u05c9\5\u0110\u0089\2\u05c9\u05cb\7n\2\2\u05ca\u05cc\5\u00dep\2\u05cb"+
+ "\u05ca\3\2\2\2\u05cb\u05cc\3\2\2\2\u05cc\u010f\3\2\2\2\u05cd\u05d0\7O"+
+ "\2\2\u05ce\u05d1\5\u00e4s\2\u05cf\u05d1\5\u0112\u008a\2\u05d0\u05ce\3"+
+ "\2\2\2\u05d0\u05cf\3\2\2\2\u05d1\u05d4\3\2\2\2\u05d2\u05d4\7K\2\2\u05d3"+
+ "\u05cd\3\2\2\2\u05d3\u05d2\3\2\2\2\u05d4\u0111\3\2\2\2\u05d5\u05d6\5\u00d4"+
+ "k\2\u05d6\u05d7\7k\2\2\u05d7\u05dc\3\2\2\2\u05d8\u05d9\5\u00d2j\2\u05d9"+
+ "\u05da\7r\2\2\u05da\u05dc\3\2\2\2\u05db\u05d5\3\2\2\2\u05db\u05d8\3\2"+
+ "\2\2\u05db\u05dc\3\2\2\2\u05dc\u05dd\3\2\2\2\u05dd\u05de\5\u0092J\2\u05de"+
+ "\u0113\3\2\2\2\u05df\u05e3\7_\2\2\u05e0\u05e4\5\u0092J\2\u05e1\u05e4\5"+
+ "\u0116\u008c\2\u05e2\u05e4\5\u00c6d\2\u05e3\u05e0\3\2\2\2\u05e3\u05e1"+
+ "\3\2\2\2\u05e3\u05e2\3\2\2\2\u05e3\u05e4\3\2\2\2\u05e4\u05e5\3\2\2\2\u05e5"+
+ "\u05e6\5\u00dco\2\u05e6\u0115\3\2\2\2\u05e7\u05e9\5\u00e0q\2\u05e8\u05e7"+
+ "\3\2\2\2\u05e8\u05e9\3\2\2\2\u05e9\u05ea\3\2\2\2\u05ea\u05ec\5\u015e\u00b0"+
+ "\2\u05eb\u05ed\5\u0092J\2\u05ec\u05eb\3\2\2\2\u05ec\u05ed\3\2\2\2\u05ed"+
+ "\u05ee\3\2\2\2\u05ee\u05f0\5\u015e\u00b0\2\u05ef\u05f1\5\u00e0q\2\u05f0"+
+ "\u05ef\3\2\2\2\u05f0\u05f1\3\2\2\2\u05f1\u0117\3\2\2\2\u05f2\u05f3\7Q"+
+ "\2\2\u05f3\u05f4\5\u0092J\2\u05f4\u0119\3\2\2\2\u05f5\u05f8\5\u013e\u00a0"+
+ "\2\u05f6\u05f8\7d\2\2\u05f7\u05f5\3\2\2\2\u05f7\u05f6\3\2\2\2\u05f8\u011b"+
+ "\3\2\2\2\u05f9\u05fa\7i\2\2\u05fa\u05fb\5\u011e\u0090\2\u05fb\u05fc\7"+
+ "j\2\2\u05fc\u05fd\5\u0120\u0091\2\u05fd\u011d\3\2\2\2\u05fe\u05ff\5\u0092"+
+ "J\2\u05ff\u011f\3\2\2\2\u0600\u0601\5\u00b0Y\2\u0601\u0121\3\2\2\2\u0602"+
+ "\u0603\7\u0086\2\2\u0603\u0604\5\u00b0Y\2\u0604\u0123\3\2\2\2\u0605\u0606"+
+ "\7i\2\2\u0606\u0607\7j\2\2\u0607\u0608\5\u0120\u0091\2\u0608\u0125\3\2"+
+ "\2\2\u0609\u060a\7R\2\2\u060a\u060b\7i\2\2\u060b\u060c\5\u00b0Y\2\u060c"+
+ "\u060d\7j\2\2\u060d\u060e\5\u0120\u0091\2\u060e\u0127\3\2\2\2\u060f\u0615"+
+ "\7T\2\2\u0610\u0611\7T\2\2\u0611\u0615\7\u0088\2\2\u0612\u0613\7\u0088"+
+ "\2\2\u0613\u0615\7T\2\2\u0614\u060f\3\2\2\2\u0614\u0610\3\2\2\2\u0614"+
+ "\u0612\3\2\2\2\u0615\u0616\3\2\2\2\u0616\u0617\5\u0120\u0091\2\u0617\u0129"+
+ "\3\2\2\2\u0618\u0619\7L\2\2\u0619\u061a\5\u012c\u0097\2\u061a\u012b\3"+
+ "\2\2\2\u061b\u061c\5\u0130\u0099\2\u061c\u061d\5\u012e\u0098\2\u061d\u0620"+
+ "\3\2\2\2\u061e\u0620\5\u0130\u0099\2\u061f\u061b\3\2\2\2\u061f\u061e\3"+
+ "\2\2\2\u0620\u012d\3\2\2\2\u0621\u0624\5\u0130\u0099\2\u0622\u0624\5\u00b0"+
+ "Y\2\u0623\u0621\3\2\2\2\u0623\u0622\3\2\2\2\u0624\u012f\3\2\2\2\u0625"+
+ "\u0631\7e\2\2\u0626\u062b\5\u008aF\2\u0627\u0628\7l\2\2\u0628\u062a\5"+
+ "\u008aF\2\u0629\u0627\3\2\2\2\u062a\u062d\3\2\2\2\u062b\u0629\3\2\2\2"+
+ "\u062b\u062c\3\2\2\2\u062c\u062f\3\2\2\2\u062d\u062b\3\2\2\2\u062e\u0630"+
+ "\7l\2\2\u062f\u062e\3\2\2\2\u062f\u0630\3\2\2\2\u0630\u0632\3\2\2\2\u0631"+
+ "\u0626\3\2\2\2\u0631\u0632\3\2\2\2\u0632\u0633\3\2\2\2\u0633\u0634\7f"+
+ "\2\2\u0634\u0131\3\2\2\2\u0635\u0636\5\u0134\u009b\2\u0636\u0637\7e\2"+
+ "\2\u0637\u0639\5\u0092J\2\u0638\u063a\7l\2\2\u0639\u0638\3\2\2\2\u0639"+
+ "\u063a\3\2\2\2\u063a\u063b\3\2\2\2\u063b\u063c\7f\2\2\u063c\u0133\3\2"+
+ "\2\2\u063d\u0643\5\u00b2Z\2\u063e\u063f\7e\2\2\u063f\u0640\5\u0134\u009b"+
+ "\2\u0640\u0641\7f\2\2\u0641\u0643\3\2\2\2\u0642\u063d\3\2\2\2\u0642\u063e"+
+ "\3\2\2\2\u0643\u0135\3\2\2\2\u0644\u064b\5\u0138\u009d\2\u0645\u064b\5"+
+ "\u013c\u009f\2\u0646\u0647\7e\2\2\u0647\u0648\5\u0092J\2\u0648\u0649\7"+
+ "f\2\2\u0649\u064b\3\2\2\2\u064a\u0644\3\2\2\2\u064a\u0645\3\2\2\2\u064a"+
+ "\u0646\3\2\2\2\u064b\u0137\3\2\2\2\u064c\u0650\5\u00a0Q\2\u064d\u0650"+
+ "\5\u0140\u00a1\2\u064e\u0650\5\u00a4S\2\u064f\u064c\3\2\2\2\u064f\u064d"+
+ "\3\2\2\2\u064f\u064e\3\2\2\2\u0650\u0139\3\2\2\2\u0651\u0652\t\23\2\2"+
+ "\u0652\u013b\3\2\2\2\u0653\u0654\7d\2\2\u0654\u013d\3\2\2\2\u0655\u0656"+
+ "\7d\2\2\u0656\u0657\7o\2\2\u0657\u0658\7d\2\2\u0658\u013f\3\2\2\2\u0659"+
+ "\u065a\5\u00b8]\2\u065a\u065b\5\u0142\u00a2\2\u065b\u0141\3\2\2\2\u065c"+
+ "\u0661\7g\2\2\u065d\u065f\5\u0144\u00a3\2\u065e\u0660\7l\2\2\u065f\u065e"+
+ "\3\2\2\2\u065f\u0660\3\2\2\2\u0660\u0662\3\2\2\2\u0661\u065d\3\2\2\2\u0661"+
+ "\u0662\3\2\2\2\u0662\u0663\3\2\2\2\u0663\u0664\7h\2\2\u0664\u0143\3\2"+
+ "\2\2\u0665\u066a\5\u0146\u00a4\2\u0666\u0667\7l\2\2\u0667\u0669\5\u0146"+
+ "\u00a4\2\u0668\u0666\3\2\2\2\u0669\u066c\3\2\2\2\u066a\u0668\3\2\2\2\u066a"+
+ "\u066b\3\2\2\2\u066b\u0145\3\2\2\2\u066c\u066a\3\2\2\2\u066d\u066e\5\u0148"+
+ "\u00a5\2\u066e\u066f\7n\2\2\u066f\u0671\3\2\2\2\u0670\u066d\3\2\2\2\u0670"+
+ "\u0671\3\2\2\2\u0671\u0672\3\2\2\2\u0672\u0673\5\u014a\u00a6\2\u0673\u0147"+
+ "\3\2\2\2\u0674\u0677\5\u0092J\2\u0675\u0677\5\u0142\u00a2\2\u0676\u0674"+
+ "\3\2\2\2\u0676\u0675\3\2\2\2\u0677\u0149\3\2\2\2\u0678\u067b\5\u0092J"+
+ "\2\u0679\u067b\5\u0142\u00a2\2\u067a\u0678\3\2\2\2\u067a\u0679\3\2\2\2"+
+ "\u067b\u014b\3\2\2\2\u067c\u067d\7S\2\2\u067d\u0683\7g\2\2\u067e\u067f"+
+ "\5\u014e\u00a8\2\u067f\u0680\5\u015e\u00b0\2\u0680\u0682\3\2\2\2\u0681"+
+ "\u067e\3\2\2\2\u0682\u0685\3\2\2\2\u0683\u0681\3\2\2\2\u0683\u0684\3\2"+
+ "\2\2\u0684\u0686\3\2\2\2\u0685\u0683\3\2\2\2\u0686\u0687\7h\2\2\u0687"+
+ "\u014d\3\2\2\2\u0688\u0689\5\u00d2j\2\u0689\u068a\5\u00b0Y\2\u068a\u068d"+
+ "\3\2\2\2\u068b\u068d\5\u0152\u00aa\2\u068c\u0688\3\2\2\2\u068c\u068b\3"+
+ "\2\2\2\u068d\u068f\3\2\2\2\u068e\u0690\5\u0150\u00a9\2\u068f\u068e\3\2"+
+ "\2\2\u068f\u0690\3\2\2\2\u0690\u014f\3\2\2\2\u0691\u0692\t\24\2\2\u0692"+
+ "\u0151\3\2\2\2\u0693\u0695\7\u0086\2\2\u0694\u0693\3\2\2\2\u0694\u0695"+
+ "\3\2\2\2\u0695\u0696\3\2\2\2\u0696\u0697\5\u011a\u008e\2\u0697\u0153\3"+
+ "\2\2\2\u0698\u0699\7i\2\2\u0699\u069a\5\u0092J\2\u069a\u069b\7j\2\2\u069b"+
+ "\u0155\3\2\2\2\u069c\u069d\7o\2\2\u069d\u069e\7e\2\2\u069e\u069f\5\u00b0"+
+ "Y\2\u069f\u06a0\7f\2\2\u06a0\u0157\3\2\2\2\u06a1\u06b0\7e\2\2\u06a2\u06a9"+
+ "\5\u00d4k\2\u06a3\u06a6\5\u0134\u009b\2\u06a4\u06a5\7l\2\2\u06a5\u06a7"+
+ "\5\u00d4k\2\u06a6\u06a4\3\2\2\2\u06a6\u06a7\3\2\2\2\u06a7\u06a9\3\2\2"+
+ "\2\u06a8\u06a2\3\2\2\2\u06a8\u06a3\3\2\2\2\u06a9\u06ab\3\2\2\2\u06aa\u06ac"+
+ "\7s\2\2\u06ab\u06aa\3\2\2\2\u06ab\u06ac\3\2\2\2\u06ac\u06ae\3\2\2\2\u06ad"+
+ "\u06af\7l\2\2\u06ae\u06ad\3\2\2\2\u06ae\u06af\3\2\2\2\u06af\u06b1\3\2"+
+ "\2\2\u06b0\u06a8\3\2\2\2\u06b0\u06b1\3\2\2\2\u06b1\u06b2\3\2\2\2\u06b2"+
+ "\u06b3\7f\2\2\u06b3\u0159\3\2\2\2\u06b4\u06b5\5\u0134\u009b\2\u06b5\u06b6"+
+ "\7o\2\2\u06b6\u06b7\7d\2\2\u06b7\u015b\3\2\2\2\u06b8\u06b9\5\u00b0Y\2"+
+ "\u06b9\u015d\3\2\2\2\u06ba\u06bf\7m\2\2\u06bb\u06bf\7\2\2\3\u06bc\u06bf"+
+ "\7\u009e\2\2\u06bd\u06bf\6\u00b0\24\2\u06be\u06ba\3\2\2\2\u06be\u06bb"+
+ "\3\2\2\2\u06be\u06bc\3\2\2\2\u06be\u06bd\3\2\2\2\u06bf\u015f\3\2\2\2\u00b3"+
+ "\u016e\u0173\u017a\u0184\u018a\u0190\u01a0\u01a4\u01ad\u01b9\u01bd\u01c3"+
+ "\u01cb\u01d5\u01e5\u01f3\u01f7\u01fe\u0206\u020f\u022f\u0237\u024f\u0260"+
+ "\u026c\u0275\u0283\u0295\u029c\u02a1\u02a6\u02b0\u02b3\u02b7\u02bb\u02c2"+
+ "\u02c5\u02cb\u02d0\u02d2\u02d5\u02dc\u02e1\u02f4\u02fc\u0300\u0303\u0309"+
+ "\u030d\u0310\u031a\u0321\u0328\u0334\u033a\u0341\u0346\u034c\u0358\u035e"+
+ "\u0362\u036a\u036e\u0374\u0377\u037d\u0382\u0396\u03b9\u03bb\u03d2\u03da"+
+ "\u03e5\u03ec\u03f3\u03fd\u040b\u0421\u0423\u042b\u042f\u0433\u0436\u043f"+
+ "\u0445\u044f\u0457\u045d\u0466\u0471\u047c\u0480\u0482\u048d\u0496\u049a"+
+ "\u049d\u04a4\u04af\u04b9\u04bf\u04c1\u04cb\u04d5\u04d9\u04dd\u04e1\u04e8"+
+ "\u04f0\u04fb\u04ff\u0503\u050f\u0513\u0517\u051c\u0523\u052a\u053e\u0542"+
+ "\u0546\u054a\u055a\u0560\u0562\u0566\u056a\u056d\u0571\u0573\u0579\u0581"+
+ "\u0586\u0591\u0597\u059e\u05a9\u05ae\u05b2\u05b7\u05bb\u05c3\u05cb\u05d0"+
+ "\u05d3\u05db\u05e3\u05e8\u05ec\u05f0\u05f7\u0614\u061f\u0623\u062b\u062f"+
+ "\u0631\u0639\u0642\u064a\u064f\u065f\u0661\u066a\u0670\u0676\u067a\u0683"+
+ "\u068c\u068f\u0694\u06a6\u06a8\u06ab\u06ae\u06b0\u06be";
public static final ATN _ATN =
new ATNDeserializer().deserialize(_serializedATN.toCharArray());
static {
@@ -12885,4 +12910,4 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) {
_decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i);
}
}
-}
\ No newline at end of file
+}
diff --git a/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java b/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java
index 212418151..17069a23c 100644
--- a/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java
+++ b/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java
@@ -1,4 +1,4 @@
-// Generated from /Users/joao/Code/gobraHome/gobra/src/main/antlr4/GobraParser.g4 by ANTLR 4.9.2
+// Generated from /main/antlr4/GobraParser.g4 by ANTLR 4.9.1
package viper.gobra.frontend;
import org.antlr.v4.runtime.tree.AbstractParseTreeVisitor;
@@ -900,6 +900,13 @@ public class GobraParserBaseVisitor extends AbstractParseTreeVisitor imple
* {@link #visitChildren} on {@code ctx}.
*/
@Override public T visitAssign_op(GobraParser.Assign_opContext ctx) { return visitChildren(ctx); }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation returns the result of calling
+ * {@link #visitChildren} on {@code ctx}.
+ */
+ @Override public T visitRangeClause(GobraParser.RangeClauseContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
@@ -1180,13 +1187,6 @@ public class GobraParserBaseVisitor extends AbstractParseTreeVisitor imple
* {@link #visitChildren} on {@code ctx}.
*/
@Override public T visitForClause(GobraParser.ForClauseContext ctx) { return visitChildren(ctx); }
- /**
- * {@inheritDoc}
- *
- * The default implementation returns the result of calling
- * {@link #visitChildren} on {@code ctx}.
- */
- @Override public T visitRangeClause(GobraParser.RangeClauseContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
@@ -1439,4 +1439,4 @@ public class GobraParserBaseVisitor extends AbstractParseTreeVisitor imple
* {@link #visitChildren} on {@code ctx}.
*/
@Override public T visitEos(GobraParser.EosContext ctx) { return visitChildren(ctx); }
-}
\ No newline at end of file
+}
diff --git a/src/main/java/viper/gobra/frontend/GobraParserVisitor.java b/src/main/java/viper/gobra/frontend/GobraParserVisitor.java
index 7d77b604a..20b91c3b6 100644
--- a/src/main/java/viper/gobra/frontend/GobraParserVisitor.java
+++ b/src/main/java/viper/gobra/frontend/GobraParserVisitor.java
@@ -1,4 +1,4 @@
-// Generated from /Users/joao/Code/gobraHome/gobra/src/main/antlr4/GobraParser.g4 by ANTLR 4.9.2
+// Generated from /main/antlr4/GobraParser.g4 by ANTLR 4.9.1
package viper.gobra.frontend;
import org.antlr.v4.runtime.tree.ParseTreeVisitor;
@@ -804,6 +804,12 @@ public interface GobraParserVisitor extends ParseTreeVisitor {
* @return the visitor result
*/
T visitAssign_op(GobraParser.Assign_opContext ctx);
+ /**
+ * Visit a parse tree produced by {@link GobraParser#rangeClause}.
+ * @param ctx the parse tree
+ * @return the visitor result
+ */
+ T visitRangeClause(GobraParser.RangeClauseContext ctx);
/**
* Visit a parse tree produced by {@link GobraParser#packageClause}.
* @param ctx the parse tree
@@ -1044,12 +1050,6 @@ public interface GobraParserVisitor extends ParseTreeVisitor {
* @return the visitor result
*/
T visitForClause(GobraParser.ForClauseContext ctx);
- /**
- * Visit a parse tree produced by {@link GobraParser#rangeClause}.
- * @param ctx the parse tree
- * @return the visitor result
- */
- T visitRangeClause(GobraParser.RangeClauseContext ctx);
/**
* Visit a parse tree produced by {@link GobraParser#goStmt}.
* @param ctx the parse tree
@@ -1266,4 +1266,4 @@ public interface GobraParserVisitor extends ParseTreeVisitor {
* @return the visitor result
*/
T visitEos(GobraParser.EosContext ctx);
-}
\ No newline at end of file
+}
diff --git a/src/main/scala/viper/gobra/ast/frontend/Ast.scala b/src/main/scala/viper/gobra/ast/frontend/Ast.scala
index ff4571cf5..bfa306d11 100644
--- a/src/main/scala/viper/gobra/ast/frontend/Ast.scala
+++ b/src/main/scala/viper/gobra/ast/frontend/Ast.scala
@@ -269,7 +269,7 @@ case class PForStmt(pre: Option[PSimpleStmt], cond: PExpression, post: Option[PS
case class PAssForRange(range: PRange, ass: Vector[PAssignee], spec: PLoopSpec, body: PBlock) extends PGeneralForStmt with PScope with PGhostifiableStatement
-case class PShortForRange(range: PRange, shorts: Vector[PIdnUnk], spec: PLoopSpec, body: PBlock) extends PGeneralForStmt with PScope with PGhostifiableStatement
+case class PShortForRange(range: PRange, shorts: Vector[PUnkLikeId], addressable: Vector[Boolean], spec: PLoopSpec, body: PBlock) extends PGeneralForStmt with PScope with PGhostifiableStatement
case class PGoStmt(exp: PExpression) extends PActualStatement
@@ -797,7 +797,7 @@ sealed trait PMisc extends PNode
sealed trait PActualMisc extends PMisc
-case class PRange(exp: PExpression) extends PActualMisc
+case class PRange(exp: PExpression, enumerated: PUnkLikeId) extends PActualMisc
sealed trait PParameter extends PMisc {
def typ: PType
diff --git a/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala b/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala
index d6e5074be..a87260f33 100644
--- a/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala
+++ b/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala
@@ -245,8 +245,8 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter
})
case PAssForRange(range, ass, spec, body) =>
showSpec(spec) <> "for" <+> showExprList(ass) <+> "=" <+> showRange(range) <+> block(showStmt(body))
- case PShortForRange(range, shorts, spec, body) =>
- showSpec(spec) <> "for" <+> showIdList(shorts) <+> ":=" <+> showRange(range) <+> block(showStmt(body))
+ case PShortForRange(range, shorts, addressable, spec, body) =>
+ showSpec(spec) <> "for" <+> showList(shorts zip addressable){ case (l, a) => showAddressable(a, l) } <+> ":=" <+> showRange(range) <+> block(showStmt(body))
case PGoStmt(exp) => "go" <+> showExpr(exp)
case PSelectStmt(send, rec, aRec, sRec, dflt) =>
"select" <+> block(
@@ -324,7 +324,10 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter
"case" <+> showIdList(shorts) <+> "=" <+> showExpr(recv) <> ":" <> showNestedStmtList(body.stmts)
}
- def showRange(n: PRange): Doc = "range" <+> showExpr(n.exp)
+ def showRange(n: PRange): Doc = n.enumerated match {
+ case _: PWildcard => "range" <+> showExpr(n.exp)
+ case _ => "range" <+> showExpr(n.exp) <+> "with" <+> showId(n.enumerated)
+ }
// expressions
diff --git a/src/main/scala/viper/gobra/frontend/Desugar.scala b/src/main/scala/viper/gobra/frontend/Desugar.scala
index a2ba1633d..ad56eae21 100644
--- a/src/main/scala/viper/gobra/frontend/Desugar.scala
+++ b/src/main/scala/viper/gobra/frontend/Desugar.scala
@@ -172,6 +172,8 @@ object Desugar {
private val nm = new NameManager
+ private val MapExhalePermDenom = 1000000
+
type Identity = (Meta, TypeInfo)
private def abstraction(id: PIdnNode, info: TypeInfo): Identity = {
@@ -970,6 +972,514 @@ object Desugar {
}
}
+ def leftOfAssignmentNoInit(idn: PIdnNode, info: TypeInfo)(t: in.Type): in.LocalVar = {
+ idn match {
+ case _: PWildcard => in.LocalVar(nm.fresh(idn, info), t)(meta(idn, info))
+
+ case _ =>
+ assignableVarD(ctx, info)(idn) match {
+ case Left(v) => v.asInstanceOf[in.LocalVar]
+ case Right(v) => violation(s"Expected an assignable variable, but got $v instead")
+ }
+ }
+ }
+
+ /**
+ * This case handles for loops with a range clause of the form:
+ *
+ *
+ * // i0 here is an int variable starting from 0 and used at the
+ * // encoded loop condition
+ * for i, j := range x with i0 {
+ * body
+ * }
+ *
+ * In the case where x is a slice or array the following code is produced. Note
+ * that everything is in a new block so it can shadow variables with the same
+ * name declared outside. This is also the go behaviour.
+ *
+ * c := x // save the value of the slice/array since changing it doesn't change the iteration
+ * length := len(x)
+ *
+ * if (length == 0) {
+ * havoc i
+ * assume i0 == i
+ * havoc j // [v]
+ * assert
+ * } else {
+ * var i int = 0
+ * var i0 int = 0 // since 'i' can change in the iteration we store the true index in i0
+ * var j T = c[0] // [v]
+ * invariant 0 <= i0 && i0 <= len(c)
+ * invariant i0 < len(c) ==> i0 == i && j == c[i0] // [v] just the j == c[i0] part
+ *
+ * for i0 < length {
+ *
+ * i0 += 1
+ * if i0 < len(c) { i = i0 ; j = c[i] /* [v] */ }
+ * }
+ * }
+ *
+ * In the case where the value variable 'j' is missing all the code annotated with [v]
+ * is omitted
+ */
+ def desugarArrSliceShortRange(n: PShortForRange, range: PRange, shorts: Vector[PUnkLikeId], spec: PLoopSpec, body: PBlock)(src: Source.Parser.Info): Writer[in.Stmt] = unit(block(for {
+ exp <- goE(range.exp)
+
+ (elemType, typ) = underlyingType(exp.typ) match {
+ case s: in.SliceT => (s.elems, s)
+ case a: in.ArrayT => (a.elems, a)
+ case _ => violation("Expected slice or array in for-range statement")
+ }
+
+ rangeExpSrc = meta(range.exp, info)
+ iSrc = meta(shorts(0), info)
+
+ hasValue = shorts.length > 1 && !(shorts(1).isInstanceOf[PWildcard])
+
+ jSrc = if (hasValue) meta(shorts(1), info) else src
+
+ c <- freshDeclaredExclusiveVar(exp.typ.withAddressability(Addressability.exclusiveVariable), n, info)(rangeExpSrc)
+ length <- freshDeclaredExclusiveVar(in.IntT(Addressability.exclusiveVariable), n, info)(rangeExpSrc)
+
+ i = leftOfAssignmentNoInit(shorts(0), info)(in.IntT(Addressability.exclusiveVariable))
+ _ <- declare(i)
+ j = if (hasValue) leftOfAssignmentNoInit(shorts(1), info)(elemType) else i
+
+ _ <- if (hasValue) declare(j) else unit(in.Seqn(Vector())(src))
+ i0 = leftOfAssignmentNoInit(range.enumerated, info)(in.IntT(Addressability.exclusiveVariable))
+ _ <- declare(i0)
+
+ (dTerPre, dTer) <- prelude(option(spec.terminationMeasure map terminationMeasureD(ctx, info)))
+ (dInvPre, dInv) <- prelude(sequence(spec.invariants map assertionD(ctx, info)))
+ addedInvariantsBefore = Vector(
+ in.ExprAssertion(in.And(
+ in.AtMostCmp(in.IntLit(0)(src), i0)(src),
+ in.AtMostCmp(i0, in.Length(c)(src))(src))(src))(src),
+ in.Implication(
+ in.LessCmp(i0, in.Length(c)(src))(src),
+ in.ExprAssertion(in.EqCmp(i0, i)(src))(src))(src)
+ )
+ indexValueSrc = meta(range.exp, info).createAnnotatedInfo(Source.NoPermissionToRangeExpressionAnnotation())
+ addedInvariantsAfter = (if (hasValue) Vector(
+ in.Implication(
+ in.LessCmp(i0, in.Length(c)(src))(src),
+ in.ExprAssertion(in.EqCmp(j, in.IndexedExp(c, i0, typ)(indexValueSrc))(indexValueSrc))(indexValueSrc))(indexValueSrc))
+ else
+ Vector())
+
+ dBody = blockD(ctx, info)(body)
+
+ // handle break and continue labels
+ continueLabelName = nm.continueLabel(n, info)
+ continueLoopLabelProxy = in.LabelProxy(continueLabelName)(src)
+ continueLoopLabel = in.Label(continueLoopLabelProxy)(src)
+
+ breakLabelName = nm.breakLabel(n, info)
+ breakLoopLabelProxy = in.LabelProxy(breakLabelName)(src)
+ _ <- declare(breakLoopLabelProxy)
+ breakLoopLabel = in.Label(breakLoopLabelProxy)(src)
+
+ enc = in.Seqn(Vector(
+ // c := x
+ singleAss(in.Assignee.Var(c), exp)(rangeExpSrc),
+ // length := len(c) to save for later since it can change
+ singleAss(in.Assignee.Var(length), in.Length(c)(src))(src),
+ in.If(
+ in.EqCmp(length, in.IntLit(0)(src))(src),
+ in.Seqn(Vector(
+ // assume i == i0
+ in.Assume(in.ExprAssertion(in.EqCmp(i, i0)(src))(src))(src)
+ ) ++
+ // assert
+ (spec.invariants zip dInv).map[in.Stmt]((x: (PExpression, in.Assertion)) => in.Assert(x._2)(meta(x._1, info).createAnnotatedInfo(Source.LoopInvariantNotEstablishedAnnotation))))(src),
+ in.Seqn(Vector(
+ // i = 0
+ in.Initialization(i)(src),
+ singleAss(in.Assignee.Var(i), in.IntLit(0)(src))(iSrc),
+ // i0 = 0
+ in.Initialization(i0)(src),
+ singleAss(in.Assignee.Var(i0), in.IntLit(0)(src))(src)) ++
+ // j = c[0]
+ (if (hasValue)
+ Vector(in.Initialization(j)(src), singleAss(in.Assignee.Var(j), in.IndexedExp(c, in.IntLit(0)(src), typ)(src))(jSrc))
+ else Vector()) ++
+ dInvPre ++ dTerPre ++ Vector(
+ in.While(
+ in.LessCmp(i0, length)(src),
+ addedInvariantsBefore ++ dInv ++ addedInvariantsAfter,
+ dTer,
+ in.Block(Vector(continueLoopLabelProxy),
+ Vector(
+ dBody,
+ continueLoopLabel,
+ //i0 += 1
+ singleAss(in.Assignee.Var(i0), in.Add(i0, in.IntLit(1)(src))(src))(src),
+ // if i0 < len(c) { i = i0; j = c[i] }
+ in.If(
+ in.LessCmp(i0, length)(src),
+ in.Seqn(Vector(singleAss(in.Assignee.Var(i), i0)(src)) ++
+ (if (hasValue) Vector(singleAss(in.Assignee.Var(j), in.IndexedExp(c, i, typ)(src))(src)) else Vector()))(src),
+ in.Seqn(Vector())(src))(src)
+ ) ++
+ dInvPre ++
+ dTerPre
+ )(src))(src), breakLoopLabel
+ )
+ )(src)
+ )(src)))(src)
+ } yield enc))
+
+ /**
+ * This case handles for loops with a range clause of the form:
+ *
+ *
+ * for i, j = range x with i0 {
+ * body
+ * }
+ *
+ * In the case where x is a slice or array the following code is produced. Note
+ * that everything is in a new block so it can shadow variables with the same
+ * name declared outside. This is also the go behaviour.
+ *
+ * c := x // save the value of the slice/array since changing it doesn't change the iteration
+ * length := len(c)
+ *
+ * if (length == 0) {
+ * havoc i
+ * assume i0 == i
+ * havoc j // [v]
+ * assert
+ * } else {
+ * var i int = 0
+ * var i0 int = 0 // since 'i' can change in the iteration we store the true index in i0
+ * var j T = c[0] // [v]
+ * invariant 0 <= i0 && i0 <= len(c)
+ * invariant i0 < len(c) ==> i0 == i && j == c[i0] // [v] just the j == c[i0] part
+ *
+ * for i0 < length {
+ *
+ * i0 += 1
+ * if i0 < len(c) { i = i0 ; j = c[i] /* [v] */ }
+ * }
+ * }
+ *
+ * In the case where the value variable 'j' is missing all the code annotated with [v]
+ * is omitted
+ */
+ def desugarArrSliceAssRange(n: PAssForRange, range: PRange, ass: Vector[PAssignee], spec: PLoopSpec, body: PBlock)(src: Source.Parser.Info): Writer[in.Stmt] = unit(block(for {
+ exp <- goE(range.exp)
+
+ (elemType, typ) = underlyingType(exp.typ) match {
+ case s: in.SliceT => (s.elems, s)
+ case a: in.ArrayT => (a.elems, a)
+ case _ => violation("Expected slice or array in for-range statement")
+ }
+
+ rangeExpSrc = meta(range.exp, info)
+
+ hasValue = ass.length > 1 && !(ass(1).isInstanceOf[PBlankIdentifier])
+
+ c <- freshDeclaredExclusiveVar(exp.typ.withAddressability(Addressability.exclusiveVariable), n, info)(rangeExpSrc)
+ length <- freshDeclaredExclusiveVar(in.IntT(Addressability.exclusiveVariable), n, info)(rangeExpSrc)
+
+ i <- goL(ass(0))
+ j <- if (hasValue) goL(ass(1)) else unit(in.Assignee.Var(c))
+
+ i0 = leftOfAssignmentNoInit(range.enumerated, info)(in.IntT(Addressability.exclusiveVariable))
+ _ <- declare(i0)
+
+ (dTerPre, dTer) <- prelude(option(spec.terminationMeasure map terminationMeasureD(ctx, info)))
+ (dInvPre, dInv) <- prelude(sequence(spec.invariants map assertionD(ctx, info)))
+ addedInvariantsBefore = Vector(
+ in.ExprAssertion(in.And(
+ in.AtMostCmp(in.IntLit(0)(src), i0)(src),
+ in.AtMostCmp(i0, in.Length(c)(src))(src))(src))(src)
+ )
+ indexValueSrc = meta(range.exp, info).createAnnotatedInfo(Source.NoPermissionToRangeExpressionAnnotation())
+ addedInvariantsAfter = (if (hasValue) Vector(
+ in.Implication(
+ in.LessCmp(i0, in.Length(c)(src))(src),
+ in.ExprAssertion(in.EqCmp(i0, i.op)(src))(src))(src),
+ in.Implication(
+ in.LessCmp(i0, in.Length(c)(src))(src),
+ in.ExprAssertion(in.EqCmp(j.op, in.IndexedExp(c, i0, typ)(indexValueSrc))(indexValueSrc))(indexValueSrc))(indexValueSrc))
+ else
+ Vector(
+ in.Implication(
+ in.LessCmp(i0, in.Length(c)(src))(src),
+ in.ExprAssertion(in.EqCmp(i0, i.op)(src))(src))(src)))
+
+ dBody = blockD(ctx, info)(body)
+
+ // handle break and continue labels
+ continueLabelName = nm.continueLabel(n, info)
+ continueLoopLabelProxy = in.LabelProxy(continueLabelName)(src)
+ continueLoopLabel = in.Label(continueLoopLabelProxy)(src)
+
+ breakLabelName = nm.breakLabel(n, info)
+ breakLoopLabelProxy = in.LabelProxy(breakLabelName)(src)
+ _ <- declare(breakLoopLabelProxy)
+ breakLoopLabel = in.Label(breakLoopLabelProxy)(src)
+
+ enc = in.Seqn(Vector(
+ // c := x
+ singleAss(in.Assignee.Var(c), exp)(rangeExpSrc),
+ // length := len(c) to save for later since it can change
+ singleAss(in.Assignee.Var(length), in.Length(c)(src))(src),
+ in.If(
+ in.EqCmp(length, in.IntLit(0)(src))(src),
+ in.Seqn(
+ // assert
+ (spec.invariants zip dInv).map[in.Stmt]((x: (PExpression, in.Assertion)) => in.Assert(x._2)(meta(x._1, info).createAnnotatedInfo(Source.LoopInvariantNotEstablishedAnnotation))))(src),
+ in.Seqn(Vector(
+ // c := x
+ singleAss(in.Assignee.Var(c), exp)(rangeExpSrc),
+ // i = 0
+ singleAss(i, in.IntLit(0)(src))(src),
+ // i0 = 0
+ singleAss(in.Assignee.Var(i0), in.IntLit(0)(src))(src)) ++
+ // j = c[0]
+ (if (hasValue)
+ Vector(singleAss(j, in.IndexedExp(c, in.IntLit(0)(src), typ)(src))(src))
+ else Vector()) ++
+ dInvPre ++ dTerPre ++ Vector(
+ in.While(
+ in.LessCmp(i0, length)(src),
+ addedInvariantsBefore ++ dInv ++ addedInvariantsAfter,
+ dTer,
+ in.Block(Vector(continueLoopLabelProxy),
+ Vector(
+ dBody,
+ continueLoopLabel,
+ //i0 += 1
+ singleAss(in.Assignee.Var(i0), in.Add(i0, in.IntLit(1)(src))(src))(src),
+ // if i0 < len(c) { i = i0; j = c[i] }
+ in.If(
+ in.LessCmp(i0, length)(src),
+ in.Seqn(Vector(singleAss(i, i0)(src)) ++
+ (if (hasValue) Vector(singleAss(j, in.IndexedExp(c, i.op, typ)(src))(src)) else Vector()))(src),
+ in.Seqn(Vector())(src))(src)
+ ) ++
+ dInvPre ++
+ dTerPre
+ )(src))(src), breakLoopLabel
+ )
+ )(src)
+ )(src)))(src)
+ } yield enc))
+
+ /**
+ * This case handles for loops with a range clause of a map expression of the form:
+ *
+ *
+ * // visited here is a set containing the already visited keys in the map
+ * for k, v := range x with visited {
+ * body
+ * }
+ *
+ * The following code is produced. Note
+ * that everything is in a new block so it can shadow variables with the same
+ * name declared outside. This is also the go behaviour.
+ *
+ * c := x
+ *
+ * if (|c| == 0) {
+ * var k : T1
+ * var v : T2 // [v]
+ * var visited : Set[T1]
+ * assert
+ * }
+ * else {
+ * var k : T1
+ * var v : T2 // [v]
+ * inhale k in domain(c)
+ * v := c[k] // [v]
+ * var visited : Set[T1] := Set()
+ * assert 0 / 1 < per // check if permission provided by user is valid
+ * while (|visited| < |domain(c)|)
+ * invariant |visited| < |domain(c)| ==> k in domain(x) && v == c[k] // [v]
+ * invariant |visited| <= |domain(c)|
+ * invariant visited subset domain(c)
+ *
+ * {
+ * var key : T1
+ * inhale key in domain(c) && !(key in visited)
+ * k := key
+ * v := x[k] // [v]
+ * exhale acc(x, 1/100000)
+ *
+ * inhale acc(x, 1/100000)
+ * visited := visited union Set(k)
+ *
+ * In the case where the value variable 'v' is missing all the code annotated with [v]
+ * is omitted
+ */
+ def desugarMapShortRange(n: PShortForRange, range: PRange, shorts: Vector[PUnkLikeId], spec: PLoopSpec, body: PBlock)(src: Source.Parser.Info): Writer[in.Stmt] = unit(block(for {
+ exp <- goE(range.exp)
+
+ c <- freshDeclaredExclusiveVar(exp.typ.withAddressability(Addressability.exclusiveVariable), n, info)(src)
+
+ (keyType, valType) = underlyingType(exp.typ) match {
+ case in.MapT(k, v, _) => (k.withAddressability(Addressability.exclusiveVariable), v.withAddressability(Addressability.exclusiveVariable))
+ case _ => violation("unexpected type of range expression")
+ }
+ visType = in.SetT(keyType, Addressability.exclusiveVariable)
+
+ domain = in.MapKeys(c, underlyingType(exp.typ))(src)
+
+ visited <- leftOfAssignmentD(range.enumerated, info)(in.SetT(keyType, Addressability.exclusiveVariable))
+
+ perm <- freshDeclaredExclusiveVar(in.PermissionT(Addressability.exclusiveVariable), n, info)(src)
+
+ initPerm = singleAss(in.Assignee.Var(perm), in.PermLit(1, MapExhalePermDenom)(src))(src)
+
+ exhSrc = meta(range.exp, info).createAnnotatedInfo(Source.InsufficientPermissionToRangeExpressionAnnotation())
+
+ // exhale acc(x, p)
+ exhalePerm = in.Exhale(in.Access(in.Accessible.ExprAccess(c), perm)(exhSrc))(exhSrc)
+ inhalePerm = in.Inhale(in.Access(in.Accessible.ExprAccess(c), perm)(exhSrc))(src)
+
+ hasValue = shorts.length > 1 && !(shorts(1).isInstanceOf[PWildcard])
+
+ (dTerPre, dTer) <- prelude(option(spec.terminationMeasure map terminationMeasureD(ctx, info)))
+ (dInvPre, dInv) <- prelude(sequence(spec.invariants map assertionD(ctx, info)))
+ indexValueSrc = meta(range.exp, info).createAnnotatedInfo(Source.NoPermissionToRangeExpressionAnnotation())
+ addedInvariants = Vector(
+ in.ExprAssertion(in.AtMostCmp(in.Length(visited.op)(src), in.Length(c)(src))(src))(src),
+ in.ExprAssertion(in.Subset(visited.op, domain)(src))(src))
+
+ dBody = blockD(ctx, info)(body)
+
+ // handle break and continue labels
+ continueLabelName = nm.continueLabel(n, info)
+ continueLoopLabelProxy = in.LabelProxy(continueLabelName)(src)
+ continueLoopLabel = in.Label(continueLoopLabelProxy)(src)
+
+ breakLabelName = nm.breakLabel(n, info)
+ breakLoopLabelProxy = in.LabelProxy(breakLabelName)(src)
+ _ <- declare(breakLoopLabelProxy)
+ breakLoopLabel = in.Label(breakLoopLabelProxy)(src)
+
+ visitedEqDomain = in.Assert(in.ExprAssertion(in.EqCmp(
+ in.SetMinus(visited.op, domain)(src),
+ in.SetLit(keyType, Vector.empty)(src)
+ )(src))(src))(src)
+
+ k = leftOfAssignmentNoInit(shorts(0), info)(keyType)
+ v = if (hasValue) leftOfAssignmentNoInit(shorts(1), info)(valType) else k
+
+ updateKeyVal = in.Seqn(Vector(
+ in.Inhale(in.ExprAssertion(in.And(
+ in.Contains(k, domain)(src),
+ in.Negation(in.Contains(k, visited.op)(src))(src))(src))(src))(src)
+ ) ++ (if (hasValue) Vector(in.Initialization(v)(src), singleAss(in.Assignee.Var(v), in.IndexedExp(c, k, underlyingType(exp.typ))(src))(src)) else Vector()))(src)
+
+ updateVisited = singleAss(visited, in.Union(visited.op, in.SetLit(keyType, Vector(k))(src))(src))(src)
+
+ enc = in.Seqn(Vector(
+ singleAss(in.Assignee.Var(c), exp)(src),
+ in.If(
+ in.EqCmp(in.Length(c)(src), in.IntLit(0)(src))(src),
+ in.Seqn(
+ // assert
+ (spec.invariants zip dInv).map[in.Stmt]((x: (PExpression, in.Assertion)) => in.Assert(x._2)(meta(x._1, info).createAnnotatedInfo(Source.LoopInvariantNotEstablishedAnnotation))))(src),
+ in.Seqn(
+ dInvPre ++ dTerPre ++ Vector(
+ initPerm,
+ in.While(
+ in.LessCmp(in.Length(visited.op)(src), in.Length(c)(src))(src),
+ dInv ++ addedInvariants, dTer, in.Block(Vector(continueLoopLabelProxy, k) ++ (if (hasValue) Vector(v) else Vector()),
+ Vector(exhalePerm, updateKeyVal, dBody, continueLoopLabel, inhalePerm, updateVisited) ++ dInvPre ++ dTerPre
+ )(src))(src), visitedEqDomain, breakLoopLabel
+ ))(src)
+ )(src)))(src)
+
+ } yield enc))
+
+ def desugarMapAssRange(n: PAssForRange, range: PRange, ass: Vector[PAssignee], spec: PLoopSpec, body: PBlock)(src: Source.Parser.Info): Writer[in.Stmt] = unit(block(for {
+ exp <- goE(range.exp)
+
+ (keyType, valType) = underlyingType(exp.typ) match {
+ case in.MapT(k, v, _) => (k.withAddressability(Addressability.exclusiveVariable), v.withAddressability(Addressability.exclusiveVariable))
+ case _ => violation("unexpected type of range expression")
+ }
+ visType = in.SetT(keyType, Addressability.exclusiveVariable)
+
+ c <- freshDeclaredExclusiveVar(exp.typ.withAddressability(Addressability.exclusiveVariable), n, info)(src)
+
+ domain = in.MapKeys(c, underlyingType(exp.typ))(src)
+
+ visited <- leftOfAssignmentD(range.enumerated, info)(in.SetT(keyType, Addressability.exclusiveVariable))
+
+ perm <- freshDeclaredExclusiveVar(in.PermissionT(Addressability.exclusiveVariable), n, info)(src)
+
+ initPerm = singleAss(in.Assignee.Var(perm), in.PermLit(1, MapExhalePermDenom)(src))(src)
+
+ exhSrc = meta(range.exp, info).createAnnotatedInfo(Source.InsufficientPermissionToRangeExpressionAnnotation())
+
+ // exhale acc(x, p)
+ exhalePerm = in.Exhale(in.Access(in.Accessible.ExprAccess(c), perm)(exhSrc))(exhSrc)
+ inhalePerm = in.Inhale(in.Access(in.Accessible.ExprAccess(c), perm)(exhSrc))(src)
+
+ hasValue = ass.length > 1 && !(ass(1).isInstanceOf[PBlankIdentifier])
+
+ (dTerPre, dTer) <- prelude(option(spec.terminationMeasure map terminationMeasureD(ctx, info)))
+ (dInvPre, dInv) <- prelude(sequence(spec.invariants map assertionD(ctx, info)))
+ indexValueSrc = meta(range.exp, info).createAnnotatedInfo(Source.NoPermissionToRangeExpressionAnnotation())
+ addedInvariants = Vector(
+ in.ExprAssertion(in.AtMostCmp(in.Length(visited.op)(src), in.Length(c)(src))(src))(src),
+ in.ExprAssertion(in.Subset(visited.op, domain)(src))(src))
+
+ dBody = blockD(ctx, info)(body)
+
+ // handle break and continue labels
+ continueLabelName = nm.continueLabel(n, info)
+ continueLoopLabelProxy = in.LabelProxy(continueLabelName)(src)
+ continueLoopLabel = in.Label(continueLoopLabelProxy)(src)
+
+ breakLabelName = nm.breakLabel(n, info)
+ breakLoopLabelProxy = in.LabelProxy(breakLabelName)(src)
+ _ <- declare(breakLoopLabelProxy)
+ breakLoopLabel = in.Label(breakLoopLabelProxy)(src)
+
+ visitedEqDomain = in.Assert(in.ExprAssertion(in.EqCmp(
+ in.SetMinus(visited.op, domain)(src),
+ in.SetLit(keyType, Vector.empty)(src)
+ )(src))(src))(src)
+
+ tempk = in.LocalVar(nm.fresh(n, info), keyType)(src)
+ k <- goL(ass(0))
+ v <- if (hasValue) goL(ass(1)) else unit(in.Assignee.Var(perm))
+
+ updateKeyVal = in.Seqn(Vector(
+ in.Inhale(in.ExprAssertion(in.And(
+ in.Contains(tempk, domain)(src),
+ in.Negation(in.Contains(tempk, visited.op)(src))(src))(src))(src))(src),
+ singleAss(k, tempk)(src)
+ ) ++ (if (hasValue) Vector(singleAss(v, in.IndexedExp(c, k.op, underlyingType(exp.typ))(src))(src)) else Vector()))(src)
+
+ updateVisited = singleAss(visited, in.Union(visited.op, in.SetLit(keyType, Vector(k.op))(src))(src))(src)
+
+ enc = in.Seqn(Vector(
+ singleAss(in.Assignee.Var(c), exp)(src),
+ in.If(
+ in.EqCmp(in.Length(c)(src), in.IntLit(0)(src))(src),
+ in.Seqn(
+ // assert
+ (spec.invariants zip dInv).map[in.Stmt]((x: (PExpression, in.Assertion)) => in.Assert(x._2)(meta(x._1, info).createAnnotatedInfo(Source.LoopInvariantNotEstablishedAnnotation))))(src),
+ in.Seqn(
+ dInvPre ++ dTerPre ++ Vector(
+ initPerm,
+ in.While(
+ in.LessCmp(in.Length(visited.op)(src), in.Length(c)(src))(src),
+ dInv ++ addedInvariants, dTer, in.Block(Vector(continueLoopLabelProxy, tempk),
+ Vector(exhalePerm, updateKeyVal, dBody, continueLoopLabel, inhalePerm, updateVisited) ++ dInvPre ++ dTerPre
+ )(src))(src), visitedEqDomain, breakLoopLabel
+ ))(src)
+ )(src)))(src)
+ } yield enc))
+
val result = stmt match {
case NoGhost(noGhost) => noGhost match {
case _: PEmptyStmt => unit(in.Seqn(Vector.empty)(src))
@@ -1284,328 +1794,19 @@ object Desugar {
case n@PBreak(label) => unit(in.Break(label.map(x => x.name), nm.fetchBreakLabel(n, info))(src))
- /**
- * This case handles for loops with a range clause of the form:
- *
- *
- * for i, j := range x {
- * body
- * }
- *
- * In the case where x is a slice or array the following code is produced. Note
- * that everything is in a new block so it can shadow variables with the same
- * name declared outside. This is also the go behaviour.
- *
- * var i int = 0
- * var i0 int = 0 // since 'i' can change in the iteration we store the true index in i0
- * var j elem(x) // [v] the type of the elements of x
- *
- * c := x // save the value of the slice/array since changing it doesn't change the iteration
- *
- * if (0 <= i && i < len(c)) { // [v]
- * j = c[i]
- * }
- *
- * invariant len(c) > 0 ==> 0 <= i0 && i0 <= len(c) // these invariants do not
- * invariant len(c) > 0 ==> i == i0 // require access to anything so they
- * invariant len(c) > 0 ==> 0 <= i && i <= len(c) // are added before the user invariants
- * 0) and j with f(j, len(c) > 0)>
- * invariant len(c) > 0 ==> (0 <= i && i < len(c) ==> j == c[i]) // [v]
- * for i < len(c) {
- *
- * i0 += 1
- * i = i0
- * if (0 <= i && i < len(c)) { // [v]
- * j = c[i]
- * }
- * }
- *
- * In the case where the value variable 'j' is missing all the code annotated with [v]
- * is omitted
- *
- * Function f is the identity function regarding its first argument with a precondition
- * stating that the second argument must be true.
- *
- * requires b
- * decreases _
- * pure func f(x: , b: bool) { x }
- *
- * It is needed because in the occation of empty slices or arrays, i and j should not exist.
- * Replacing them with the call to this function will cause its precondition to fail for
- * empty slices or arrays and thus produce the error which is then transformed to the
- * desirable one.
- */
- case n@PShortForRange(range, shorts, spec, body) =>
- // is a block as it introduces new variables
- unit(block(for {
- exp <- goE(range.exp)
- (elems, typ) = underlyingType(exp.typ) match {
- case slice : in.SliceT => (slice.elems, slice)
- case array : in.ArrayT => (array.elems, array)
- case _ : in.MapT => violation("Maps are not supported yet in range")
- case _ : in.StringT => violation("Strings are not supported yet in range")
- case t => violation(s"Range not applicable to type $t")
- }
+ case n@PShortForRange(range, shorts, _, spec, body) =>
+ underlyingType(info.typ(range.exp)) match {
+ case _: SliceT | _: ArrayT => desugarArrSliceShortRange(n, range, shorts, spec, body)(src)
+ case _: MapT => desugarMapShortRange(n, range, shorts, spec, body)(src)
+ case t => violation(s"Type $t not supported as a range expression")
+ }
- // index is the place where we store the indices of the range expression
- rangeSrc = meta(range, info)
- rangeExpSrc = meta(range.exp, info)
- indexSrc = meta(shorts(0), info)
-
- indexLeft <- leftOfAssignmentD(shorts(0), info)(in.IntT(Addressability.exclusiveVariable))
- copiedIndexVar <- freshDeclaredExclusiveVar(in.IntT(Addressability.exclusiveVariable), n, info)(rangeExpSrc)
- copyIndexAss = singleAss(in.Assignee.Var(copiedIndexVar), in.IntLit(0)(indexSrc))(rangeExpSrc)
- incrCopiedIndex = singleAss(in.Assignee.Var(copiedIndexVar), in.Add(copiedIndexVar, in.IntLit(1)(indexSrc))(indexSrc))(indexSrc)
-
- indexVar = in.Assignee.Var(indexLeft.op.asInstanceOf[in.AssignableVar])
- incrIndex = singleAss(indexVar, copiedIndexVar)(indexSrc)
- indexAss = singleAss(indexVar, in.IntLit(0)(rangeSrc))(indexSrc)
-
- // in go the range expression is only computed once before the iteration begins
- // we do that by storing it in copiedVar
- // this also ensures that the elements iterated through do not change
- // even if the range expression is modified in the loop body
- copiedVar <- freshDeclaredExclusiveVar(exp.typ, n, info)(rangeExpSrc)
- copyAss = singleAss(in.Assignee.Var(copiedVar), exp)(rangeExpSrc)
-
- // get the length of the expression
- length = in.Length(copiedVar)(rangeSrc)
- cond = in.LessCmp(indexLeft.op, length)(rangeSrc)
-
- // this invariant states that the index variable has the same value as the hidden index variable always
- copiedIndexEqualsIndexInv = in.Implication(
- in.LessCmp(in.IntLit(0)(indexSrc), length)(indexSrc),
- in.ExprAssertion(in.EqCmp(indexLeft.op, copiedIndexVar)(rangeSrc))(rangeSrc))(rangeSrc)
-
- // this invariant states that the hidden index stays within 0 and the length of the array/slice (both inclusive)
- copiedIndexBoundsInv = in.Implication(
- in.LessCmp(in.IntLit(0)(indexSrc), length)(indexSrc),
- in.ExprAssertion(in.And(
- in.AtMostCmp(in.IntLit(0)(rangeSrc), copiedIndexVar)(rangeSrc),
- in.AtMostCmp(copiedIndexVar, length)(rangeSrc))(rangeSrc))(rangeSrc))(rangeSrc)
-
- // this invariant states that the index is between 0 and the length of the array/slice (both inclusive)
- indexBoundsInv = in.Implication(
- in.LessCmp(in.IntLit(0)(indexSrc), length)(indexSrc),
- in.ExprAssertion(in.And(
- in.AtMostCmp(in.IntLit(0)(rangeSrc), indexLeft.op)(rangeSrc),
- in.AtMostCmp(indexLeft.op, length)(rangeSrc))(rangeSrc))(rangeSrc))(rangeSrc)
-
- (dTerPre, dTer) <- prelude(option(spec.terminationMeasure map terminationMeasureD(ctx, info)))
-
- dBody = blockD(ctx, info)(body)
-
- continueLabelName = nm.continueLabel(n, info)
- continueLoopLabelProxy = in.LabelProxy(continueLabelName)(src)
- continueLoopLabel = in.Label(continueLoopLabelProxy)(src)
-
- breakLabelName = nm.breakLabel(n, info)
- breakLoopLabelProxy = in.LabelProxy(breakLabelName)(src)
- _ <- declare(breakLoopLabelProxy)
- breakLoopLabel = in.Label(breakLoopLabelProxy)(src)
-
- wh = if (shorts.length == 2) {
- // in this case we know that the loop looks like this:
- // for i, j := range x { ...
- // until now we have only created the variable i since it is not mandatory for j to exist
- // if it does, we have to declare it and add the code that will update it in each iteration
- // which looks like this:
- // if (0 <= i && i < length(x)) { j = x[i] }
- // note that this will happen after we have incremented i
- val valueSrc = meta(shorts(1), info)
- val valueLeft = assignableVarD(ctx, info)(shorts(1)) match {
- case Left(n) => n
- case Right(n) => n
- }
- val valueVar = in.Assignee.Var(valueLeft.asInstanceOf[in.AssignableVar])
- val valueAss = singleAss(valueVar, in.IndexedExp(copiedVar, indexLeft.op, typ)(valueSrc))(valueSrc)
- val updateValue = in.If(in.And(cond, in.AtLeastCmp(indexLeft.op, in.IntLit(0)(valueSrc))(valueSrc))(valueSrc), valueAss, in.Seqn(Vector())(valueSrc))(valueSrc)
-
- val invCtx = ctx.copyWithExpD{
- case n@PNamedOperand(_@PIdnUse(name)) if name == shorts(0).name =>
- val invSrc = meta(info.enclosingInvariantNode(n), info).createAnnotatedInfo(Source.RangeVariableMightNotExistAnnotation(range.exp.toString()))
- Some(unit(conditionalId(indexLeft.op, in.LessCmp(in.IntLit(0)(invSrc), length)(invSrc), in.IntT(Addressability.exclusiveVariable))(invSrc)))
- case n@PNamedOperand(_@PIdnUse(name)) if name == shorts(1).name =>
- val invSrc = meta(info.enclosingInvariantNode(n), info).createAnnotatedInfo(Source.RangeVariableMightNotExistAnnotation(range.exp.toString()))
- Some(unit(conditionalId(valueLeft, in.LessCmp(in.IntLit(0)(invSrc), length)(invSrc), elems)(invSrc)))
- case _ => None
- }
- val (dInvPre, dInv) = prelude(sequence(spec.invariants map assertionD(invCtx, info))).res
- // we also need an invariant that states that
- // for index i and value j and range expression x
- // invariant len(c) > 0 ==> 0 <= i && i < len(x) ==> j == x[i]
- val indexValueSrc = meta(range, info).createAnnotatedInfo(Source.NoPermissionToRangeExpressionAnnotation())
- val indexValueEq = in.Implication(
- in.LessCmp(in.IntLit(0)(indexSrc), length)(indexSrc),
- in.Implication(
- in.And(
- in.AtMostCmp(in.IntLit(0)(indexSrc), indexLeft.op)(indexSrc),
- in.LessCmp(indexLeft.op, length)(indexSrc))(indexSrc),
- in.ExprAssertion(in.EqCmp(in.IndexedExp(copiedVar, indexLeft.op, typ)(rangeExpSrc), valueLeft)(rangeExpSrc))(rangeExpSrc)
- )(rangeSrc))(indexValueSrc)
- in.Block(
- Vector(valueLeft.asInstanceOf[in.LocalVar]),
- Vector(copyAss, indexAss, copyIndexAss, updateValue) ++ dInvPre ++ dTerPre ++ Vector(
- in.While(cond, Vector(copiedIndexBoundsInv, copiedIndexEqualsIndexInv, indexBoundsInv) ++ dInv ++ Vector(indexValueEq), dTer, in.Block(Vector(continueLoopLabelProxy),
- Vector(dBody, continueLoopLabel, incrCopiedIndex, incrIndex, updateValue) ++ dInvPre ++ dTerPre
- )(src))(src), breakLoopLabel
- )
- )(src)
- } else {
- // else we do not have a value variable and the while loop has only
- // the index in bounds invariant added
- // the loop in this case looks like this:
- // for i := range x { ...
- val invCtx = ctx.copyWithExpD{
- case n@PNamedOperand(_@PIdnUse(name)) if name == shorts(0).name =>
- val invSrc = meta(info.enclosingInvariantNode(n), info).createAnnotatedInfo(Source.RangeVariableMightNotExistAnnotation(range.exp.toString()))
- Some(unit(conditionalId(indexLeft.op, in.LessCmp(in.IntLit(0)(invSrc), length)(invSrc), in.IntT(Addressability.exclusiveVariable))(invSrc)))
- case _ => None
- }
- val (dInvPre, dInv) = prelude(sequence(spec.invariants map assertionD(invCtx, info))).res
- in.Seqn(
- Vector(copyAss, indexAss, copyIndexAss) ++ dInvPre ++ dTerPre ++ Vector(
- in.While(cond, Vector(copiedIndexBoundsInv, copiedIndexEqualsIndexInv, indexBoundsInv) ++ dInv, dTer, in.Block(Vector(continueLoopLabelProxy),
- Vector(dBody, continueLoopLabel, incrCopiedIndex, incrIndex) ++ dInvPre ++ dTerPre
- )(src))(src), breakLoopLabel
- )
- )(src)
- }
- } yield wh))
-
- /**
- * This case handles for loops with a range clause of the form:
- *
- *
- * for expIndex, expValue = range x {
- * body
- * }
- *
- * In the case where x is a slice or array the following code is produced.
- *
- * var i0 int = 0 // since 'expIndex' can change in the iteration we store the true index in i0
- *
- * c := x // save the value of the slice/array since changing it doesn't change the iteration
- *
- * if (len(c) > 0) {
- * expIndex = 0
- * }
- *
- * if (0 <= expIndex && expIndex < len(c)) { // [v]
- * expValue = c[expIndex]
- * }
- *
- * 0) and j with f(j, len(c) > 0)>
- * invariant len(c) > 0 ==> 0 <= i0 && i0 <= len(c) // these invariants might require access to something
- * invariant len(c) > 0 ==> expIndex == i0 // as expIndex can be an indexing operation for example
- * invariant len(c) > 0 ==> 0 <= expIndex && expIndex <= len(c) // so they are added after the user invariants
- * invariant len(c) > 0 ==> (0 <= expIndex && expIndex < len(c) ==> expValue == c[expIndex]) // [v]
- * for expIndex < len(c) {
- *
- * i0 += 1
- * expIndex = i0
- * if (0 <= expIndex && expIndex < len(c)) { // [v]
- * expValue = c[i]
- * }
- * }
- *
- * In the case where the value expression 'expValue' is missing all the code annotated with [v]
- * is omitted
- */
case n@PAssForRange(range, ass, spec, body) =>
- unit(block(for {
- exp <- goE(range.exp)
- typ = underlyingType(exp.typ) match {
- case slice : in.SliceT => slice
- case array : in.ArrayT => array
- case _ : in.MapT => violation("Maps are not supported yet in range")
- case _ : in.StringT => violation("Strings are not supported yet in range")
- case t => violation(s"Range not applicable to type $t")
- }
- indexLeft <- goL(ass(0))
- rangeSrc = meta(range, info)
- indexSrc = meta(ass(0), info)
- rangeExpSrc = meta(range.exp, info)
-
- copiedVar <- freshDeclaredExclusiveVar(exp.typ, n, info)(rangeExpSrc)
- copyAss = singleAss(in.Assignee.Var(copiedVar), exp)(rangeExpSrc)
- length = in.Length(copiedVar)(rangeSrc)
-
- copiedIndexVar <- freshDeclaredExclusiveVar(in.IntT(Addressability.exclusiveVariable), n, info)(rangeExpSrc)
- copyIndexAss = singleAss(in.Assignee.Var(copiedIndexVar), in.IntLit(0)(indexSrc))(rangeExpSrc)
- incrCopiedIndex = singleAss(in.Assignee.Var(copiedIndexVar), in.Add(copiedIndexVar, in.IntLit(1)(indexSrc))(indexSrc))(indexSrc)
-
- indexAss = in.If(in.LessCmp(in.IntLit(0)(indexSrc), length)(indexSrc), singleAss(indexLeft, in.IntLit(0)(rangeSrc))(indexSrc), in.Seqn(Vector())(indexSrc))(indexSrc)
- incrIndex = singleAss(indexLeft, copiedIndexVar)(indexSrc)
-
- cond = in.LessCmp(indexLeft.op, length)(rangeSrc)
-
- copiedIndexEqualsIndexInv = in.Implication(
- in.LessCmp(in.IntLit(0)(indexSrc), length)(indexSrc),
- in.ExprAssertion(in.EqCmp(indexLeft.op, copiedIndexVar)(rangeSrc))(rangeSrc))(rangeSrc)
-
- copiedIndexBoundsInv = in.Implication(
- in.LessCmp(in.IntLit(0)(indexSrc), length)(indexSrc),
- in.ExprAssertion(in.And(
- in.AtMostCmp(in.IntLit(0)(rangeSrc), copiedIndexVar)(rangeSrc),
- in.AtMostCmp(copiedIndexVar, length)(rangeSrc))(rangeSrc))(rangeSrc))(rangeSrc)
-
- indexBoundsInv = in.Implication(
- in.LessCmp(in.IntLit(0)(indexSrc), length)(indexSrc),
- in.ExprAssertion(in.And(
- in.AtMostCmp(in.IntLit(0)(rangeSrc), indexLeft.op)(rangeSrc),
- in.AtMostCmp(indexLeft.op, length)(rangeSrc))(rangeSrc))(rangeSrc))(rangeSrc)
-
- (dInvPre, dInv) <- prelude(sequence(spec.invariants map assertionD(ctx, info)))
- (dTerPre, dTer) <- prelude(option(spec.terminationMeasure map terminationMeasureD(ctx, info)))
-
- dBody = blockD(ctx, info)(body)
-
- continueLabelName = nm.continueLabel(n, info)
- continueLoopLabelProxy = in.LabelProxy(continueLabelName)(src)
- continueLoopLabel = in.Label(continueLoopLabelProxy)(src)
-
- breakLabelName = nm.breakLabel(n, info)
- breakLoopLabelProxy = in.LabelProxy(breakLabelName)(src)
- _ <- declare(breakLoopLabelProxy)
- breakLoopLabel = in.Label(breakLoopLabelProxy)(src)
-
- wh = if (ass.length == 2) {
- val valueLeft = goL(ass(1)).res
- val decls = ass(1) match {
- case _: PBlankIdentifier => Vector(valueLeft.asInstanceOf[in.Assignee.Var].op.asInstanceOf[in.LocalVar])
- case _ => Vector.empty
- }
- val valueSrc = meta(ass(1), info)
- val valueAss = singleAss(valueLeft, in.IndexedExp(copiedVar, indexLeft.op, typ)(valueSrc))(valueSrc)
- val updateValue = in.If(in.And(cond, in.AtLeastCmp(indexLeft.op, in.IntLit(0)(valueSrc))(valueSrc))(valueSrc), valueAss, in.Seqn(Vector())(valueSrc))(valueSrc)
-
- val indexValueEq = in.Implication(
- in.LessCmp(in.IntLit(0)(indexSrc), length)(indexSrc),
- in.Implication(
- in.And(
- in.AtMostCmp(in.IntLit(0)(indexSrc), indexLeft.op)(indexSrc),
- in.LessCmp(indexLeft.op, length)(indexSrc))(indexSrc),
- in.ExprAssertion(in.EqCmp(in.IndexedExp(copiedVar, indexLeft.op, typ)(rangeExpSrc), valueLeft.op)(rangeExpSrc))(rangeExpSrc)
- )(rangeSrc))(rangeSrc)
- in.Block(
- decls,
- Vector(copyAss, indexAss, copyIndexAss, updateValue) ++ dInvPre ++ dTerPre ++ Vector(
- in.While(cond, dInv ++ Vector(copiedIndexBoundsInv, copiedIndexEqualsIndexInv, indexBoundsInv, indexValueEq), dTer, in.Block(Vector(continueLoopLabelProxy),
- Vector(dBody, continueLoopLabel, incrCopiedIndex, incrIndex, updateValue) ++ dInvPre ++ dTerPre
- )(src))(src), breakLoopLabel
- )
- )(src)
- } else {
- in.Seqn(
- Vector(copyAss, indexAss, copyIndexAss) ++ dInvPre ++ dTerPre ++ Vector(
- in.While(cond, dInv ++ Vector(copiedIndexBoundsInv, copiedIndexEqualsIndexInv, indexBoundsInv), dTer, in.Block(Vector(continueLoopLabelProxy),
- Vector(dBody, continueLoopLabel, incrCopiedIndex, incrIndex) ++ dInvPre ++ dTerPre
- )(src))(src), breakLoopLabel
- )
- )(src)
- }
- } yield wh))
+ underlyingType(info.typ(range.exp)) match {
+ case _: SliceT | _: ArrayT => desugarArrSliceAssRange(n, range, ass, spec, body)(src)
+ case _: MapT => desugarMapAssRange(n, range, ass, spec, body)(src)
+ case t => violation(s"Type $t not supported as a range expression")
+ }
case _ => ???
}
@@ -3282,58 +3483,6 @@ object Desugar {
fPred
}
- /**
- * Holds types for which conditionalId functions have been declared for.
- * This way conditionalId functions do not get declared twice for the same
- * type.
- */
- private var hasConditionalIdForType : Set[in.Type] = Set.empty
-
- /**
- * If it doesn't exist it generates a function:
- *
- * function $conditionalId(value: , cond: Bool): Int
- * requires cond
- * {
- * value
- * }
- *
- * where type is the underlying type of param generalType
- *
- * @param valueVar
- * @param condVar
- * @param generalType
- * @param src
- * @return a call to the $conditionalId function with arguments valueVar and condVar
- */
- private def conditionalId(valueVar: in.Expr, condVar: in.Expr, generalType: in.Type)(src: Meta): in.PureFunctionCall = {
- val typ = underlyingType(generalType)
- val name = in.FunctionProxy("$" + s"conditionalId${Names.serializeType(typ)}")(Source.Parser.Internal)
- if (!hasConditionalIdForType(typ)) {
- hasConditionalIdForType += typ
- val value = in.Parameter.In("value", typ.withAddressability(Addressability.inParameter))(Source.Parser.Internal)
- val cond = in.Parameter.In("cond", in.BoolT(Addressability.inParameter))(Source.Parser.Internal)
- val res = in.Parameter.Out("res", typ.withAddressability(Addressability.outParameter))(Source.Parser.Internal)
- val args = Vector(value, cond)
- val results = Vector(res)
- val pres = Vector(in.ExprAssertion(cond)(Source.Parser.Internal))
- val posts = Vector[in.Assertion]()
- val terminationMeasures = Vector(in.WildcardMeasure(None)(Source.Parser.Internal))
- val body = Some(value)
- AdditionalMembers.addMember(
- in.PureFunction(
- name,
- args,
- results,
- pres,
- posts,
- terminationMeasures,
- body)(Source.Parser.Internal)
- )
- }
- in.PureFunctionCall(name, Vector(valueVar, condVar), in.IntT(Addressability.callResult))(src)
- }
-
/** Desugar the function literal and add it to the map. */
private def registerFunctionLit(ctx: FunctionContext, info: TypeInfo)(lit: PFunctionLit): Writer[in.Expr] = {
val fLit = if (lit.spec.isPure) pureFunctionLitD(ctx, info)(lit) else functionLitD(ctx)(lit)
diff --git a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala
index 88c31a6ba..5745091ec 100644
--- a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala
+++ b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala
@@ -1821,18 +1821,25 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole
val post = visitNodeOrNone[PSimpleStmt](ctx.forClause().postStmt)
PForStmt(pre, cond, post, spec, block).at(specCtx)
} else if (has(ctx.rangeClause())) {
- // for ? range
- val expr = visitNode[PExpression](ctx.rangeClause().expression())
- val range = PRange(expr).at(ctx.rangeClause())
+ // for ? range (with enumerated)?
+ val expr = visitNode[PExpression](ctx.rangeClause().expression()).at(ctx.rangeClause())
+ // enumerated will be used no matter what, so we just make it a wildcard if it is not
+ // present in the range clause
+ val enumerated = visitChildren(ctx.rangeClause()) match {
+ case Vector(_, _, "range", _, "with", i) if i.toString() == "_" => PWildcard().at(ctx.rangeClause().IDENTIFIER())
+ case Vector("range", _, "with", i) if i.toString() == "_" => PWildcard().at(ctx.rangeClause().IDENTIFIER())
+ case Vector(_, _, "range", _) | Vector("range", _) => PWildcard().at(ctx.rangeClause())
+ case _ => idnUnk.get(ctx.rangeClause().IDENTIFIER()).at(ctx.rangeClause.IDENTIFIER())
+ }
+ val range = PRange(expr, enumerated).at(ctx.rangeClause())
if (has(ctx.rangeClause().DECLARE_ASSIGN())) {
// :=
- // identifiers should include the blank identifier, but this is currently not supported by PShortForRange
- val goIdnUnkList(idList) = visitIdentifierList(ctx.rangeClause().identifierList())
- PShortForRange(range, idList, spec, block).at(specCtx)
+ val (idnUnkLikeList(vars), addressable) = visitMaybeAddressableIdentifierList(ctx.rangeClause().maybeAddressableIdentifierList())
+ PShortForRange(range, vars, addressable, spec, block).at(specCtx)
} else {
// =
val assignees = visitAssigneeList(ctx.rangeClause().expressionList()) match {
- case v : Vector[PAssignee] => v
+ case v : Vector[PAssignee] => if (v.length > 0 ) v else Vector(PBlankIdentifier().at(ctx.rangeClause()))
case _ => fail(ctx)
}
PAssForRange(range, assignees, spec, block).at(specCtx)
diff --git a/src/main/scala/viper/gobra/frontend/info/base/SymbolTable.scala b/src/main/scala/viper/gobra/frontend/info/base/SymbolTable.scala
index fc350c4c5..2b30e5e43 100644
--- a/src/main/scala/viper/gobra/frontend/info/base/SymbolTable.scala
+++ b/src/main/scala/viper/gobra/frontend/info/base/SymbolTable.scala
@@ -142,6 +142,11 @@ object SymbolTable extends Environments[Entity] {
override def rep: PNode = exp
}
+ case class RangeEnumerateVariable(exp: PRange, ghost: Boolean, context: ExternalTypeInfo) extends ActualVariable {
+ override def addressable: Boolean = false
+ override def rep: PNode = exp
+ }
+
sealed trait TypeEntity extends Regular
sealed trait ActualTypeEntity extends TypeEntity with ActualRegular {
diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala
index d2adce9ac..743cfd2b7 100644
--- a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala
+++ b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala
@@ -115,7 +115,7 @@ trait NameResolution {
case decl: PShortForRange =>
val idx = decl.shorts.zipWithIndex.find(_._1 == id).get._2
- RangeVariable(idx, decl.range, isGhost, addressable = false, this) // TODO: check if range variables are addressable in Go
+ RangeVariable(idx, decl.range, isGhost, addressable = decl.addressable(idx), this)
case decl: PSelectShortRecv =>
val idx = decl.shorts.zipWithIndex.find(_._1 == id).get._2
@@ -126,6 +126,8 @@ trait NameResolution {
case AssignMode.Multi => MultiLocalVariable(idx, decl.recv, isGhost, addressable = false, this)
case _ => UnknownEntity()
}
+ case decl: PRange =>
+ RangeEnumerateVariable(decl, isGhost, this)
case _ => violation("unexpected parent of unknown id")
}
diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/IdTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/IdTyping.scala
index f09caf7fe..513c3eb89 100644
--- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/IdTyping.scala
+++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/IdTyping.scala
@@ -128,6 +128,8 @@ trait IdTyping extends BaseTyping { this: TypeInfoImpl =>
}
})
+ case _:RangeEnumerateVariable => LocalMessages(noMessages)
+
case Field(PFieldDecl(_, typ), _, _) => unsafeMessage(! {
wellDefAndType.valid(typ)
})
@@ -231,6 +233,8 @@ trait IdTyping extends BaseTyping { this: TypeInfoImpl =>
case t => violation(s"expected tuple but got $t")
}
+ case RangeEnumerateVariable(range, _, context) => rangeEnumeratorType(underlyingType(context.typ(range.exp)))
+
case Field(PFieldDecl(_, typ), _, context) => context.symbType(typ)
case Embbed(PEmbeddedDecl(typ, _), _, context) => context.typ(typ)
@@ -269,7 +273,8 @@ trait IdTyping extends BaseTyping { this: TypeInfoImpl =>
def getBlankAssigneeTypeRange(n: PNode, left: Vector[PNode], range: PRange): Type = {
require(n.isInstanceOf[PIdnNode] || n.isInstanceOf[PBlankIdentifier])
val pos = left indexWhere (n eq _)
- exprType(range.exp) match {
+ violation(pos >= 0, "did not find expression corresponding to " + n)
+ underlyingType(exprType(range.exp)) match {
case ChannelT(elem, ChannelModus.Recv | ChannelModus.Bi) => elem
case _ => miscType(range).asInstanceOf[InternalSingleMulti].mul.ts(pos)
}
@@ -281,9 +286,18 @@ trait IdTyping extends BaseTyping { this: TypeInfoImpl =>
case PShortVarDecl(right, left, _) => getBlankAssigneeType(w, left, right)
case PVarDecl(typ, right, left, _) => typ.map(symbType).getOrElse(getBlankAssigneeType(w, left, right))
case PConstSpec(typ, right, left) => typ.map(symbType).getOrElse(getBlankAssigneeType(w, left, right))
+ case PShortForRange(range, shorts, _, _, _) => getBlankAssigneeTypeRange(w, shorts, range)
+ case PRange(exp, enumerated) => if (w eq enumerated) rangeEnumeratorType(underlyingType(exprType(exp)))
+ else violation("did not find expression corresponding to " + w)
case _ => ???
}
case _ => ???
}
}
+
+ def rangeEnumeratorType(typ: Type) : Type = typ match {
+ case _: SliceT | _: ArrayT => IntT(config.typeBounds.Int)
+ case MapT(key, _) => SetT(key)
+ case t => violation(s"type $t is not supported for range")
+ }
}
diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/MiscTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/MiscTyping.scala
index 639b5d74a..059966248 100644
--- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/MiscTyping.scala
+++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/MiscTyping.scala
@@ -24,9 +24,9 @@ trait MiscTyping extends BaseTyping { this: TypeInfoImpl =>
private[typing] def wellDefActualMisc(misc: PActualMisc): Messages = misc match {
- case n@PRange(exp) => isExpr(exp).out ++ (underlyingType(exprType(exp)) match {
- case _: ArrayT | PointerT(_: ArrayT) | _: SliceT | _: GhostSliceT |
- _: MapT | ChannelT(_, ChannelModus.Recv | ChannelModus.Bi) => noMessages
+ case n@PRange(exp, _) => isExpr(exp).out ++ (underlyingType(exprType(exp)) match {
+ case _: ArrayT | PointerT(_: ArrayT) | _: SliceT | _: GhostSliceT | _: MapT |
+ ChannelT(_, ChannelModus.Recv | ChannelModus.Bi) => noMessages
case t => message(n, s"type error: got $t but expected rangeable type")
})
@@ -50,7 +50,7 @@ trait MiscTyping extends BaseTyping { this: TypeInfoImpl =>
private[typing] def actualMiscType(misc: PActualMisc): Type = misc match {
- case PRange(exp) => underlyingType(exprType(exp)) match {
+ case PRange(exp, _) => underlyingType(exprType(exp)) match {
case ArrayT(_, elem) => InternalSingleMulti(IntT(config.typeBounds.Int), InternalTupleT(Vector(IntT(config.typeBounds.Int), elem)))
case PointerT(ArrayT(_, elem)) => InternalSingleMulti(IntT(config.typeBounds.Int), InternalTupleT(Vector(IntT(config.typeBounds.Int), elem)))
case SliceT(elem) => InternalSingleMulti(IntT(config.typeBounds.Int), InternalTupleT(Vector(IntT(config.typeBounds.Int), elem)))
diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/StmtTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/StmtTyping.scala
index c008753a7..ad6c39039 100644
--- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/StmtTyping.scala
+++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/StmtTyping.scala
@@ -8,7 +8,7 @@ package viper.gobra.frontend.info.implementation.typing
import org.bitbucket.inkytonik.kiama.util.Messaging.{Messages, error, noMessages}
import viper.gobra.ast.frontend._
-import viper.gobra.frontend.info.base.Type.{BooleanT, ChannelModus, ChannelT, FunctionT, InterfaceT, InternalTupleT, Type}
+import viper.gobra.frontend.info.base.Type.{BooleanT, ChannelModus, ChannelT, FunctionT, InterfaceT, InternalTupleT, Type, ArrayT, SliceT, MapT, SetT}
import viper.gobra.frontend.info.implementation.TypeInfoImpl
trait StmtTyping extends BaseTyping { this: TypeInfoImpl =>
@@ -101,11 +101,22 @@ trait StmtTyping extends BaseTyping { this: TypeInfoImpl =>
case n@PForStmt(_, cond, _, _, _) => isExpr(cond).out ++ comparableTypes.errors(exprType(cond), BooleanT)(n)
- case _@PShortForRange(range, shorts, _, _) =>
- multiAssignableTo.errors(Vector(miscType(range)), shorts map idType)(range)
+ case PShortForRange(range, shorts, _, _, _) =>
+ underlyingType(exprType(range.exp)) match {
+ case _ : ArrayT | _ : SliceT =>
+ multiAssignableTo.errors(Vector(miscType(range)), shorts map idType)(range) ++
+ assignableTo.errors(miscType(range), idType(range.enumerated))(range)
+ case MapT(key, _) => multiAssignableTo.errors(Vector(miscType(range)), shorts map idType)(range) ++
+ assignableTo.errors((SetT(key), idType(range.enumerated)))(range)
+ case t => error(range, s"range not supported for type $t")
+ }
- case _@PAssForRange(range, ass, _, _) =>
- multiAssignableTo.errors(Vector(miscType(range)), ass map exprType)(range)
+ case PAssForRange(range, ass, _, _) =>
+ underlyingType(exprType(range.exp)) match {
+ case _ : ArrayT | _ : SliceT | _ : MapT =>
+ multiAssignableTo.errors(Vector(miscType(range)), ass map exprType)(range)
+ case t => error(range, s"range not supported for type $t")
+ }
case n@PGoStmt(exp) => isExpr(exp).out ++ isExecutable.errors(exp)(n)
diff --git a/src/main/scala/viper/gobra/reporting/DefaultErrorBackTranslator.scala b/src/main/scala/viper/gobra/reporting/DefaultErrorBackTranslator.scala
index 57bed8f49..2cc79ddc3 100644
--- a/src/main/scala/viper/gobra/reporting/DefaultErrorBackTranslator.scala
+++ b/src/main/scala/viper/gobra/reporting/DefaultErrorBackTranslator.scala
@@ -6,7 +6,7 @@
package viper.gobra.reporting
-import viper.gobra.reporting.Source.{AutoImplProofAnnotation, CertainSource, CertainSynthesized, ImportPreNotEstablished, MainPreNotEstablished, OverflowCheckAnnotation, ReceiverNotNilCheckAnnotation, RangeVariableMightNotExistAnnotation}
+import viper.gobra.reporting.Source.{AutoImplProofAnnotation, CertainSource, CertainSynthesized, ImportPreNotEstablished, MainPreNotEstablished, OverflowCheckAnnotation, ReceiverNotNilCheckAnnotation, InsufficientPermissionToRangeExpressionAnnotation, LoopInvariantNotEstablishedAnnotation}
import viper.gobra.reporting.Source.Verifier./
import viper.silver
@@ -86,7 +86,6 @@ object DefaultErrorBackTranslator {
val transformVerificationErrorReason: VerificationErrorReason => VerificationErrorReason = {
case AssertionFalseError(info / OverflowCheckAnnotation) => OverflowErrorReason(info)
case AssertionFalseError(info / ReceiverNotNilCheckAnnotation) => InterfaceReceiverIsNilReason(info)
- case AssertionFalseError(info / RangeVariableMightNotExistAnnotation(_)) => AssertionFalseError(info)
case x => x
}
@@ -170,8 +169,6 @@ class DefaultErrorBackTranslator(
case _ / AutoImplProofAnnotation(subT, superT) =>
GeneratedImplementationProofError(subT, superT, x)
- case _ / RangeVariableMightNotExistAnnotation(rangeExpr) =>
- x.reasons.foldLeft(RangeVariableMightNotExistError(x.info)(rangeExpr): VerificationError){ case (err, reason) => err dueTo reason }
case _ / MainPreNotEstablished =>
x.reasons.foldLeft(MainPreconditionNotEstablished(x.info): VerificationError){
case (err, reason) => err dueTo reason
@@ -182,6 +179,12 @@ class DefaultErrorBackTranslator(
case (err, reason) => err dueTo reason
}
+ case _ / InsufficientPermissionToRangeExpressionAnnotation() =>
+ x.reasons.foldLeft(InsufficientPermissionToRangeExpressionError(x.info): VerificationError){ case (err, reason) => err dueTo reason }
+
+ case _ / LoopInvariantNotEstablishedAnnotation =>
+ x.reasons.foldLeft(LoopInvariantEstablishmentError(x.info): VerificationError) { case (err, reason) => err dueTo reason }
+
case _ => x
}
diff --git a/src/main/scala/viper/gobra/reporting/Source.scala b/src/main/scala/viper/gobra/reporting/Source.scala
index 269eae872..6204aa50d 100644
--- a/src/main/scala/viper/gobra/reporting/Source.scala
+++ b/src/main/scala/viper/gobra/reporting/Source.scala
@@ -29,8 +29,9 @@ object Source {
case object ReceiverNotNilCheckAnnotation extends Annotation
case object ImportPreNotEstablished extends Annotation
case object MainPreNotEstablished extends Annotation
+ case object LoopInvariantNotEstablishedAnnotation extends Annotation
case class NoPermissionToRangeExpressionAnnotation() extends Annotation
- case class RangeVariableMightNotExistAnnotation(rangeExpr: String) extends Annotation
+ case class InsufficientPermissionToRangeExpressionAnnotation() extends Annotation
case class AutoImplProofAnnotation(subT: String, superT: String) extends Annotation
object Parser {
diff --git a/src/main/scala/viper/gobra/reporting/VerifierError.scala b/src/main/scala/viper/gobra/reporting/VerifierError.scala
index 3e79d20dc..87bc18724 100644
--- a/src/main/scala/viper/gobra/reporting/VerifierError.scala
+++ b/src/main/scala/viper/gobra/reporting/VerifierError.scala
@@ -286,7 +286,12 @@ case class RangeVariableMightNotExistError(info: Source.Verifier.Info)(rangeExpr
case class NoPermissionToRangeExpressionError(info: Source.Verifier.Info) extends VerificationError {
override def localId: String = "no_permission_to_range_expression"
- override def localMessage: String = s"Might not have read permissions to range expression"
+ override def localMessage: String = s"Might not have read permission to range expression"
+}
+
+case class InsufficientPermissionToRangeExpressionError(info: Source.Verifier.Info) extends VerificationError {
+ override def localId: String = "insufficient_permission_to_range_expression"
+ override def localMessage: String = s"Range expression should be immutable inside the loop body"
}
case class MapMakePreconditionError(info: Source.Verifier.Info) extends VerificationError {
diff --git a/src/test/resources/regressions/features/loops/range-fail1.gobra b/src/test/resources/regressions/features/loops/range-fail1.gobra
index 1529584b4..6bc8e2c97 100644
--- a/src/test/resources/regressions/features/loops/range-fail1.gobra
+++ b/src/test/resources/regressions/features/loops/range-fail1.gobra
@@ -6,6 +6,6 @@ package pkg
func foo_arr() {
x := [4]uint{1, 2, 3, 4}
//:: ExpectedOutput(type_error)
- for i, j, k := range x {
+ for i, j, k := range x with i0 {
}
}
diff --git a/src/test/resources/regressions/features/loops/range-fail2.gobra b/src/test/resources/regressions/features/loops/range-fail2.gobra
index f202fa721..f215873b0 100644
--- a/src/test/resources/regressions/features/loops/range-fail2.gobra
+++ b/src/test/resources/regressions/features/loops/range-fail2.gobra
@@ -6,6 +6,6 @@ package pkg
func foo_arr() {
x := []uint{1, 2, 3, 4}
//:: ExpectedOutput(no_permission_to_range_expression)
- for i, j := range x {
+ for i, j := range x with i0 {
}
}
diff --git a/src/test/resources/regressions/features/loops/range-fail3.gobra b/src/test/resources/regressions/features/loops/range-fail3.gobra
index f2ea52d51..4a2aaf470 100644
--- a/src/test/resources/regressions/features/loops/range-fail3.gobra
+++ b/src/test/resources/regressions/features/loops/range-fail3.gobra
@@ -8,6 +8,6 @@ func foo_arr() {
var i int
var j int
//:: ExpectedOutput(type_error)
- for i, j = range x {
+ for i, j = range x with i0 {
}
}
diff --git a/src/test/resources/regressions/features/loops/range-fail4.gobra b/src/test/resources/regressions/features/loops/range-fail4.gobra
index 82becb70f..fe4f2a129 100644
--- a/src/test/resources/regressions/features/loops/range-fail4.gobra
+++ b/src/test/resources/regressions/features/loops/range-fail4.gobra
@@ -8,6 +8,6 @@ func foo_arr() {
var i uint
var j uint
//:: ExpectedOutput(type_error)
- for i, j = range x {
+ for i, j = range x with i0 {
}
}
diff --git a/src/test/resources/regressions/features/loops/range-fail5.gobra b/src/test/resources/regressions/features/loops/range-fail5.gobra
index 836095d32..d4e05c3fc 100644
--- a/src/test/resources/regressions/features/loops/range-fail5.gobra
+++ b/src/test/resources/regressions/features/loops/range-fail5.gobra
@@ -9,6 +9,6 @@ func foo_arr() {
var j uint
var k int
//:: ExpectedOutput(type_error)
- for i, j, k = range x {
+ for i, j, k = range x with i0 {
}
}
diff --git a/src/test/resources/regressions/features/loops/range-fail6.gobra b/src/test/resources/regressions/features/loops/range-fail6.gobra
index 3fdacf5b8..37b2b4f0a 100644
--- a/src/test/resources/regressions/features/loops/range-fail6.gobra
+++ b/src/test/resources/regressions/features/loops/range-fail6.gobra
@@ -6,6 +6,6 @@ package pkg
func foo_arr() {
x := 0
//:: ExpectedOutput(type_error)
- for i, j := range x {
+ for i, j := range x with i0 {
}
}
diff --git a/src/test/resources/regressions/features/loops/range-fail7.gobra b/src/test/resources/regressions/features/loops/range-fail7.gobra
index 02aaa778b..a3a1473c8 100644
--- a/src/test/resources/regressions/features/loops/range-fail7.gobra
+++ b/src/test/resources/regressions/features/loops/range-fail7.gobra
@@ -7,6 +7,6 @@ func foo() {
x := [0]int{}
//:: ExpectedOutput(invariant_establishment_error)
invariant false
- for i, j := range x {
+ for i, j := range x with i0 {
}
}
diff --git a/src/test/resources/regressions/features/loops/range-fail8.gobra b/src/test/resources/regressions/features/loops/range-fail8.gobra
index f71ffffaf..1decd510e 100644
--- a/src/test/resources/regressions/features/loops/range-fail8.gobra
+++ b/src/test/resources/regressions/features/loops/range-fail8.gobra
@@ -6,8 +6,8 @@ package pkg
func foo_arr() {
x := []uint{}
invariant acc(x)
- //:: ExpectedOutput(range_variable_might_not_exist:assertion_error)
+ //:: ExpectedOutput(invariant_establishment_error)
invariant i == 0
- for i, j := range x {
+ for i, j := range x with i0 {
}
}
diff --git a/src/test/resources/regressions/features/loops/range1.gobra b/src/test/resources/regressions/features/loops/range1.gobra
index fa290797b..24d426be5 100644
--- a/src/test/resources/regressions/features/loops/range1.gobra
+++ b/src/test/resources/regressions/features/loops/range1.gobra
@@ -12,9 +12,9 @@ func foo(x []uint) (max uint) {
max = x[0]
invariant acc(x)
invariant 0 <= i && i <= len(x)
- invariant forall k int :: 0 <= k && k < i ==> max >= x[k]
- decreases len(x) - i
- for i, j := range x {
+ invariant forall k int :: 0 <= k && k < i0 ==> max >= x[k]
+ decreases len(x) - i0
+ for i, j := range x with i0 {
if j > max {
max = j
}
@@ -25,8 +25,8 @@ func foo_arr() {
x := [4]uint{1, 2, 3, 4}
max := x[0]
invariant 0 <= i && i <= len(x)
- invariant forall k int :: 0 <= k && k < i ==> max >= x[k]
- for i, j := range x {
+ invariant forall k int :: 0 <= k && k < i0 ==> max >= x[k]
+ for i, j := range x with i0 {
if j > max {
max = j
}
@@ -45,10 +45,9 @@ func bar2() {
x := []int{1, 2, 3, 4, 5}
sum := 0
invariant acc(x)
- invariant 0 <= i && i <= len(x)
- invariant sum == i * (i - 1) / 2
- decreases len(x) - i
- for i := range x {
+ invariant sum == i0 * (i0 - 1) / 2
+ decreases len(x) - i0
+ for i := range x with i0 {
sum += i
}
assert sum == len(x) * (len(x) - 1) / 2
@@ -60,24 +59,24 @@ func foo2() {
for _, j := range x {
}
invariant acc(x)
- for i, _ := range x {
+ for i, _ := range x with i0 {
}
invariant acc(x)
for _, _ := range x {
}
invariant acc(x)
- for _ := range x {
+ for _ := range x with _ {
}
}
func foo3() {
x := [0]int{}
- for i, j := range x {
+ for i, j := range x with i0 {
}
y := []int{}
- for i, j := range x {
+ for i, j := range x with i0 {
}
- for i,j := range x {
+ for i, j := range x {
continue
break
}
diff --git a/src/test/resources/regressions/features/loops/range2.gobra b/src/test/resources/regressions/features/loops/range2.gobra
index b49f5b800..f81c0c52c 100644
--- a/src/test/resources/regressions/features/loops/range2.gobra
+++ b/src/test/resources/regressions/features/loops/range2.gobra
@@ -15,10 +15,9 @@ func foo() {
// this invariant is also automatically generated but
// only after the next one which causes the next one to fail
// in such a case, the user must provide it himself
- invariant 0 <= z[1] && z[1] <= len(x)
- invariant forall k int :: 0 <= k && k < z[1] ==> max >= x[k]
- decreases len(x) - z[1]
- for z[1], y[2] = range x {
+ invariant forall k int :: 0 <= k && k < i0 ==> max >= x[k]
+ decreases len(x) - i0
+ for z[1], y[2] = range x with i0 {
if y[2] > max {
max = y[2]
}
@@ -32,20 +31,20 @@ func foo2() {
var i uint
var j int
invariant acc(x)
- decreases len(x) - j
- for j, _ = range x {
+ decreases len(x) - i0
+ for j, _ = range x with i0 {
}
invariant acc(x)
- for _ = range x {
+ for _ = range x with _ {
}
invariant acc(x)
for _, i = range x {
}
invariant acc(x)
- for j = range x {
+ for j = range x with i0 {
}
invariant acc(x)
- for _ = range x {
+ for _ = range x with i0 {
continue
break
}
diff --git a/src/test/resources/regressions/features/loops/range3.gobra b/src/test/resources/regressions/features/loops/range3.gobra
new file mode 100644
index 000000000..39ea0e1e3
--- /dev/null
+++ b/src/test/resources/regressions/features/loops/range3.gobra
@@ -0,0 +1,29 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/publicdomain/zero/1.0/
+
+package pkg
+
+func foo() {
+ x := []int{1,2,3}
+ invariant acc(&info)
+ invariant acc(x)
+ for _, info@ := range x with i {
+ bar(&info)
+ }
+}
+
+func foo1() {
+ x := []int{1,2,3}
+ info@ := 0
+ invariant acc(&info)
+ invariant acc(x)
+ for _, info = range x with i {
+ bar(&info)
+ }
+}
+
+requires acc(i)
+ensures acc(i)
+func bar(i *int) {
+ *i = 3
+}
diff --git a/src/test/resources/regressions/features/loops/range_maps-fail1.gobra b/src/test/resources/regressions/features/loops/range_maps-fail1.gobra
new file mode 100644
index 000000000..0d8030366
--- /dev/null
+++ b/src/test/resources/regressions/features/loops/range_maps-fail1.gobra
@@ -0,0 +1,13 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/publicdomain/zero/1.0/
+
+package pkg
+
+func foo() {
+ x := map[uint]int{1:1, 2:3}
+ var i int
+ var j int
+ //:: ExpectedOutput(type_error)
+ for i, j = range x with i0 {
+ }
+}
diff --git a/src/test/resources/regressions/features/loops/range_maps1.gobra b/src/test/resources/regressions/features/loops/range_maps1.gobra
new file mode 100644
index 000000000..f065e5c1e
--- /dev/null
+++ b/src/test/resources/regressions/features/loops/range_maps1.gobra
@@ -0,0 +1,55 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/publicdomain/zero/1.0/
+
+package pkg
+
+
+requires acc(x)
+requires len(x) > 0
+ensures acc(x)
+ensures forall k uint :: k in domain(x) ==> max >= k
+decreases
+func foo(x map[uint]int) (max uint) {
+ max = 0
+ invariant acc(x)
+ invariant forall i uint :: i in visited ==> max >= i
+ decreases len(domain(x)) - len(visited)
+ for k, v := range x with visited {
+ if k > max {
+ max = k
+ }
+ }
+}
+
+decreases
+func bar() {
+ x := map[uint]int{1:1, 2:2, 3:3}
+ m := foo(x)
+ assert forall i uint :: i in domain(x) ==> m >= i
+}
+
+requires acc(x)
+requires len(x) > 0
+ensures acc(x)
+ensures forall k int :: k in domain(x) ==> max >= x[k]
+decreases
+func foo1(x map[int]uint) (max uint) {
+ max = 0
+ var k int
+ var v uint
+ invariant acc(x)
+ invariant forall i int :: i in visited ==> max >= x[i]
+ decreases len(domain(x)) - len(visited)
+ for k, v = range x with visited {
+ if v > max {
+ max = v
+ }
+ }
+}
+
+decreases
+func bar1() {
+ x := map[int]uint{1:1, 2:2, 3:3}
+ m := foo1(x)
+ assert forall i int :: i in domain(x) ==> m >= x[i]
+}