From 59e97e2da25df6da84ff9d5bb93d483602c0f88b Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 8 Dec 2023 14:28:12 -0500 Subject: [PATCH 01/11] Add IR nodes for type abstraction and application Closes #1296 --- quint/src/ir/quintTypes.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/quint/src/ir/quintTypes.ts b/quint/src/ir/quintTypes.ts index a572d52a7..af87b4408 100644 --- a/quint/src/ir/quintTypes.ts +++ b/quint/src/ir/quintTypes.ts @@ -98,6 +98,19 @@ export function sumType(labelTypePairs: [string, QuintType][], rowVar?: string, return { kind: 'sum', fields: { kind: 'row', fields, other }, id } } +/// Type abstraction: Λτ.Τ +export interface QuintAbsType extends WithOptionalId { + kind: 'abs' + vars: QuintVarType +} + +/// Type application: (Λτ.Τ)υ +export interface QuintAppType extends WithOptionalId { + kind: 'app' + abs: QuintAbsType + arg: QuintType +} + /** * A type in Type System 1.2. */ @@ -114,6 +127,8 @@ export type QuintType = | QuintTupleType | QuintRecordType | QuintSumType + | QuintAbsType + | QuintAppType /** * Row types, used to express tuples and records. From f924eadb787b78df74be8389796222346e45e6e0 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Tue, 23 Jan 2024 16:42:01 -0500 Subject: [PATCH 02/11] Add build scripts --- quint/package.json | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/quint/package.json b/quint/package.json index a1e268ae5..dc71566b5 100644 --- a/quint/package.json +++ b/quint/package.json @@ -2,13 +2,7 @@ "name": "@informalsystems/quint", "version": "0.18.1", "description": "Core tool for the Quint specification language", - "keywords": [ - "temporal", - "logic", - "formal", - "specification", - "verification" - ], + "keywords": ["temporal", "logic", "formal", "specification", "verification"], "homepage": "https://github.com/informalsystems/quint", "bugs": "https://github.com/informalsystems/quint/issues", "license": "Apache 2.0", @@ -35,11 +29,7 @@ "bin": { "quint": "dist/src/cli.js" }, - "files": [ - "README.md", - "dist/**/*", - "test/**/*.ts" - ], + "files": ["README.md", "dist/**/*", "test/**/*.ts"], "engines": { "node": ">=18" }, @@ -72,6 +62,8 @@ "compile": "genversion -e src/version.ts && tsc && copyfiles -u 1 ./src/reflection.proto ./src/builtin.qnt ./dist/src/", "prepare": "rm -rf ./dist && npm run compile && chmod +x ./dist/src/cli.js", "test": "mocha --reporter-option maxDiffSize=0 -r ts-node/register test/*.test.ts test/**/*.test.ts", + "test-w": "while inotifywait -r -e close_write ./ ; do npm run test; done", + "test-f": "mocha --reporter-option maxDiffSize=0 -r ts-node/register", "coverage": "nyc npm run test", "integration": "txm cli-tests.md && txm io-cli-tests.md", "apalache-integration": "txm apalache-tests.md", From 1ad2419e4e8fbfd6a58bf7f8b0d82c559b234a88 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Mon, 11 Dec 2023 11:45:20 -0500 Subject: [PATCH 03/11] Add parsing for polymorphic type declarations --- quint/src/generated/Quint.g4 | 50 +- quint/src/generated/Quint.interp | 17 +- quint/src/generated/Quint.tokens | 106 +- quint/src/generated/QuintLexer.interp | 18 +- quint/src/generated/QuintLexer.tokens | 106 +- quint/src/generated/QuintLexer.ts | 481 +-- quint/src/generated/QuintListener.ts | 60 +- quint/src/generated/QuintParser.ts | 2676 +++++++++-------- quint/src/generated/QuintVisitor.ts | 39 +- quint/src/graphics.ts | 3 + quint/src/ir/IRTransformer.ts | 35 + quint/src/ir/IRVisitor.ts | 18 + quint/src/ir/IRprinting.ts | 10 + quint/src/ir/quintTypes.ts | 20 +- quint/src/parsing/ToIrListener.ts | 90 +- quint/src/quintError.ts | 2 + quint/src/types/base.ts | 1 + quint/src/types/constraintGenerator.ts | 2 + quint/src/types/substitutions.ts | 7 +- quint/test/ir/IRVisitor.test.ts | 47 + quint/test/ir/IRprinting.test.ts | 6 + .../test/parsing/quintParserFrontend.test.ts | 6 +- quint/test/types/parser.test.ts | 33 +- quint/testFixture/_1025importeeWithError.json | 2 +- 24 files changed, 2228 insertions(+), 1607 deletions(-) diff --git a/quint/src/generated/Quint.g4 b/quint/src/generated/Quint.g4 index 6cb27d16f..95154347f 100644 --- a/quint/src/generated/Quint.g4 +++ b/quint/src/generated/Quint.g4 @@ -52,11 +52,15 @@ operDef : qualifier normalCallName ; typeDef - : 'type' qualId # typeAbstractDef - | 'type' qualId '=' type # typeAliasDef - | 'type' typeName=qualId '=' '|'? typeSumVariant ('|' typeSumVariant)* # typeSumDef + : 'type' qualId # typeAbstractDef + | 'type' typeDefHead '=' type # typeAliasDef + | 'type' typeDefHead '=' sumTypeDefinition # typeSumDef ; +typeDefHead : typeName=qualId ('[' typeVars+=typeVar(',' typeVars+=typeVar)* ']')?; + +sumTypeDefinition : '|'? typeSumVariant ('|' typeSumVariant)* ; + // A single variant case in a sum type definition or match statement. // E.g., `A(t)` or `A`. typeSumVariant : sumLabel=simpleId["variant label"] ('(' type ')')? ; @@ -96,28 +100,32 @@ qualifiedName : qualId; fromSource: STRING; // Types in Type System 1.2 of Apalache -type : type '->' type # typeFun - | type '=>' type # typeOper - | '(' (type (',' type)*)? ','? ')' '=>' type # typeOper - | SET '[' type ']' # typeSet - | LIST '[' type ']' # typeList - | '(' type ',' type (',' type)* ','? ')' # typeTuple - | '{' row '}' # typeRec - | 'int' # typeInt - | 'str' # typeStr - | 'bool' # typeBool - | LOW_ID # typeVar - | qualId # typeConst - | '(' type ')' # typeParen - ; +type + : type '->' type # typeFun + | type '=>' type # typeOper + | '(' (type (',' type)*)? ','? ')' '=>' type # typeOper + // TODO: replace Set with general type application + | SET '[' type ']' # typeSet + // TODO: replace List with general type application + | LIST '[' type ']' # typeList + | '(' type ',' type (',' type)* ','? ')' # typeTuple + | '{' row? '}' # typeRec + | 'int' # typeInt + | 'str' # typeStr + | 'bool' # typeBool + | typeVar # typeVarCase + | qualId # typeConst + | '(' type ')' # typeParen + | typeCtor=type ('[' typeArg+=type (',' typeArg+=type)* ']') # typeApp + ; -row : (rowLabel ':' type ',')* ((rowLabel ':' type) (',' | '|' (rowVar=identifier))?)? +typeVar: LOW_ID; +row : (rowLabel ':' type) (',' rowLabel ':' type)* (',' | '|' (rowVar=identifier))? | '|' (rowVar=identifier) ; rowLabel : simpleId["record"] ; - // A Quint expression. The order matters, it defines the priority. // Wherever possible, we keep the same order of operators as in TLA+. // We are also trying to be consistent with mainstream languages, e.g., @@ -269,8 +277,6 @@ AND : 'and' ; OR : 'or' ; IFF : 'iff' ; IMPLIES : 'implies' ; -SET : 'Set' ; -LIST : 'List' ; MAP : 'Map' ; MATCH : 'match' ; PLUS : '+' ; @@ -287,6 +293,8 @@ EQ : '==' ; ASGN : '=' ; LPAREN : '(' ; RPAREN : ')' ; +SET : 'Set'; +LIST : 'List'; // An identifier starting with lowercase LOW_ID : ([a-z][a-zA-Z0-9_]*|[_][a-zA-Z0-9_]+) ; diff --git a/quint/src/generated/Quint.interp b/quint/src/generated/Quint.interp index 966bb4ab8..781eec423 100644 --- a/quint/src/generated/Quint.interp +++ b/quint/src/generated/Quint.interp @@ -10,6 +10,8 @@ null ',' ';' 'type' +'[' +']' '|' 'nondet' 'val' @@ -25,8 +27,6 @@ null 'export' '->' '=>' -'[' -']' 'int' 'str' 'bool' @@ -46,8 +46,6 @@ null 'or' 'iff' 'implies' -'Set' -'List' 'Map' 'match' '+' @@ -64,6 +62,8 @@ null '=' '(' ')' +'Set' +'List' null null null @@ -119,8 +119,6 @@ AND OR IFF IMPLIES -SET -LIST MAP MATCH PLUS @@ -137,6 +135,8 @@ EQ ASGN LPAREN RPAREN +SET +LIST LOW_ID CAP_ID DOCCOMMENT @@ -151,6 +151,8 @@ documentedDeclaration declaration operDef typeDef +typeDefHead +sumTypeDefinition typeSumVariant nondetOperDef qualifier @@ -162,6 +164,7 @@ name qualifiedName fromSource type +typeVar row rowLabel expr @@ -187,4 +190,4 @@ identifier atn: -[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 3, 72, 758, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 3, 2, 6, 2, 82, 10, 2, 13, 2, 14, 2, 83, 3, 2, 3, 2, 3, 3, 7, 3, 89, 10, 3, 12, 3, 14, 3, 92, 11, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 98, 10, 3, 12, 3, 14, 3, 101, 11, 3, 3, 3, 3, 3, 3, 4, 7, 4, 106, 10, 4, 12, 4, 14, 4, 109, 11, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 5, 5, 133, 10, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 141, 10, 6, 12, 6, 14, 6, 144, 11, 6, 5, 6, 146, 10, 6, 3, 6, 3, 6, 3, 6, 5, 6, 151, 10, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 164, 10, 6, 12, 6, 14, 6, 167, 11, 6, 3, 6, 3, 6, 3, 6, 3, 6, 5, 6, 173, 10, 6, 3, 6, 3, 6, 5, 6, 177, 10, 6, 3, 6, 5, 6, 180, 10, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 5, 7, 193, 10, 7, 3, 7, 3, 7, 3, 7, 7, 7, 198, 10, 7, 12, 7, 14, 7, 201, 11, 7, 5, 7, 203, 10, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 5, 8, 210, 10, 8, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 216, 10, 9, 3, 9, 3, 9, 3, 9, 5, 9, 221, 10, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 232, 10, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 240, 10, 11, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 246, 10, 11, 3, 11, 3, 11, 5, 11, 250, 10, 11, 5, 11, 252, 10, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 263, 10, 12, 5, 12, 265, 10, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 7, 13, 278, 10, 13, 12, 13, 14, 13, 281, 11, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 288, 10, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 7, 13, 301, 10, 13, 12, 13, 14, 13, 304, 11, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 311, 10, 13, 5, 13, 313, 10, 13, 3, 14, 3, 14, 3, 15, 3, 15, 3, 16, 3, 16, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 328, 10, 18, 12, 18, 14, 18, 331, 11, 18, 5, 18, 333, 10, 18, 3, 18, 5, 18, 336, 10, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 357, 10, 18, 12, 18, 14, 18, 360, 11, 18, 3, 18, 5, 18, 363, 10, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 5, 18, 380, 10, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 388, 10, 18, 12, 18, 14, 18, 391, 11, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 7, 19, 398, 10, 19, 12, 19, 14, 19, 401, 11, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 5, 19, 410, 10, 19, 5, 19, 412, 10, 19, 3, 19, 3, 19, 5, 19, 416, 10, 19, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 425, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 441, 10, 21, 12, 21, 14, 21, 444, 11, 21, 3, 21, 5, 21, 447, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 456, 10, 21, 12, 21, 14, 21, 459, 11, 21, 3, 21, 5, 21, 462, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 472, 10, 21, 12, 21, 14, 21, 475, 11, 21, 3, 21, 5, 21, 478, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 487, 10, 21, 12, 21, 14, 21, 490, 11, 21, 3, 21, 5, 21, 493, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 501, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 509, 10, 21, 12, 21, 14, 21, 512, 11, 21, 3, 21, 5, 21, 515, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 523, 10, 21, 12, 21, 14, 21, 526, 11, 21, 3, 21, 5, 21, 529, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 537, 10, 21, 12, 21, 14, 21, 540, 11, 21, 5, 21, 542, 10, 21, 3, 21, 5, 21, 545, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 570, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 609, 10, 21, 3, 21, 5, 21, 612, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 619, 10, 21, 12, 21, 14, 21, 622, 11, 21, 3, 22, 3, 22, 3, 22, 3, 22, 5, 22, 628, 10, 22, 3, 22, 3, 22, 3, 22, 7, 22, 633, 10, 22, 12, 22, 14, 22, 636, 11, 22, 3, 22, 3, 22, 3, 23, 3, 23, 5, 23, 642, 10, 23, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 651, 10, 24, 3, 24, 5, 24, 654, 10, 24, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 5, 25, 665, 10, 25, 3, 26, 3, 26, 5, 26, 669, 10, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 7, 27, 679, 10, 27, 12, 27, 14, 27, 682, 11, 27, 3, 27, 3, 27, 3, 27, 3, 27, 5, 27, 688, 10, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 6, 28, 695, 10, 28, 13, 28, 14, 28, 696, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 5, 29, 706, 10, 29, 3, 30, 3, 30, 3, 31, 3, 31, 5, 31, 712, 10, 31, 3, 32, 3, 32, 3, 32, 7, 32, 717, 10, 32, 12, 32, 14, 32, 720, 11, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 5, 33, 728, 10, 33, 3, 34, 3, 34, 5, 34, 732, 10, 34, 3, 35, 3, 35, 5, 35, 736, 10, 35, 3, 36, 3, 36, 3, 37, 3, 37, 3, 38, 3, 38, 3, 38, 7, 38, 745, 10, 38, 12, 38, 14, 38, 748, 11, 38, 3, 39, 3, 39, 3, 39, 3, 39, 5, 39, 754, 10, 39, 3, 40, 3, 40, 3, 40, 2, 2, 4, 34, 40, 41, 2, 2, 4, 2, 6, 2, 8, 2, 10, 2, 12, 2, 14, 2, 16, 2, 18, 2, 20, 2, 22, 2, 24, 2, 26, 2, 28, 2, 30, 2, 32, 2, 34, 2, 36, 2, 38, 2, 40, 2, 42, 2, 44, 2, 46, 2, 48, 2, 50, 2, 52, 2, 54, 2, 56, 2, 58, 2, 60, 2, 62, 2, 64, 2, 66, 2, 68, 2, 70, 2, 72, 2, 74, 2, 76, 2, 78, 2, 2, 10, 3, 2, 55, 57, 3, 2, 53, 54, 3, 2, 58, 63, 3, 2, 45, 51, 3, 2, 45, 48, 5, 2, 33, 33, 45, 48, 53, 63, 3, 2, 42, 44, 3, 2, 67, 68, 2, 854, 2, 81, 3, 2, 2, 2, 4, 90, 3, 2, 2, 2, 6, 107, 3, 2, 2, 2, 8, 132, 3, 2, 2, 2, 10, 134, 3, 2, 2, 2, 12, 202, 3, 2, 2, 2, 14, 204, 3, 2, 2, 2, 16, 211, 3, 2, 2, 2, 18, 231, 3, 2, 2, 2, 20, 251, 3, 2, 2, 2, 22, 264, 3, 2, 2, 2, 24, 312, 3, 2, 2, 2, 26, 314, 3, 2, 2, 2, 28, 316, 3, 2, 2, 2, 30, 318, 3, 2, 2, 2, 32, 320, 3, 2, 2, 2, 34, 379, 3, 2, 2, 2, 36, 415, 3, 2, 2, 2, 38, 417, 3, 2, 2, 2, 40, 569, 3, 2, 2, 2, 42, 623, 3, 2, 2, 2, 44, 641, 3, 2, 2, 2, 46, 646, 3, 2, 2, 2, 48, 664, 3, 2, 2, 2, 50, 668, 3, 2, 2, 2, 52, 687, 3, 2, 2, 2, 54, 689, 3, 2, 2, 2, 56, 705, 3, 2, 2, 2, 58, 707, 3, 2, 2, 2, 60, 711, 3, 2, 2, 2, 62, 713, 3, 2, 2, 2, 64, 727, 3, 2, 2, 2, 66, 731, 3, 2, 2, 2, 68, 735, 3, 2, 2, 2, 70, 737, 3, 2, 2, 2, 72, 739, 3, 2, 2, 2, 74, 741, 3, 2, 2, 2, 76, 753, 3, 2, 2, 2, 78, 755, 3, 2, 2, 2, 80, 82, 5, 4, 3, 2, 81, 80, 3, 2, 2, 2, 82, 83, 3, 2, 2, 2, 83, 81, 3, 2, 2, 2, 83, 84, 3, 2, 2, 2, 84, 85, 3, 2, 2, 2, 85, 86, 7, 2, 2, 3, 86, 3, 3, 2, 2, 2, 87, 89, 7, 69, 2, 2, 88, 87, 3, 2, 2, 2, 89, 92, 3, 2, 2, 2, 90, 88, 3, 2, 2, 2, 90, 91, 3, 2, 2, 2, 91, 93, 3, 2, 2, 2, 92, 90, 3, 2, 2, 2, 93, 94, 7, 3, 2, 2, 94, 95, 5, 74, 38, 2, 95, 99, 7, 4, 2, 2, 96, 98, 5, 6, 4, 2, 97, 96, 3, 2, 2, 2, 98, 101, 3, 2, 2, 2, 99, 97, 3, 2, 2, 2, 99, 100, 3, 2, 2, 2, 100, 102, 3, 2, 2, 2, 101, 99, 3, 2, 2, 2, 102, 103, 7, 5, 2, 2, 103, 5, 3, 2, 2, 2, 104, 106, 7, 69, 2, 2, 105, 104, 3, 2, 2, 2, 106, 109, 3, 2, 2, 2, 107, 105, 3, 2, 2, 2, 107, 108, 3, 2, 2, 2, 108, 110, 3, 2, 2, 2, 109, 107, 3, 2, 2, 2, 110, 111, 5, 8, 5, 2, 111, 7, 3, 2, 2, 2, 112, 113, 7, 6, 2, 2, 113, 114, 5, 74, 38, 2, 114, 115, 7, 7, 2, 2, 115, 116, 5, 34, 18, 2, 116, 133, 3, 2, 2, 2, 117, 118, 7, 8, 2, 2, 118, 119, 5, 74, 38, 2, 119, 120, 7, 7, 2, 2, 120, 121, 5, 34, 18, 2, 121, 133, 3, 2, 2, 2, 122, 123, 7, 9, 2, 2, 123, 124, 5, 56, 29, 2, 124, 125, 7, 64, 2, 2, 125, 126, 5, 40, 21, 2, 126, 133, 3, 2, 2, 2, 127, 133, 5, 24, 13, 2, 128, 133, 5, 10, 6, 2, 129, 133, 5, 12, 7, 2, 130, 133, 5, 20, 11, 2, 131, 133, 5, 22, 12, 2, 132, 112, 3, 2, 2, 2, 132, 117, 3, 2, 2, 2, 132, 122, 3, 2, 2, 2, 132, 127, 3, 2, 2, 2, 132, 128, 3, 2, 2, 2, 132, 129, 3, 2, 2, 2, 132, 130, 3, 2, 2, 2, 132, 131, 3, 2, 2, 2, 133, 9, 3, 2, 2, 2, 134, 135, 5, 18, 10, 2, 135, 172, 5, 66, 34, 2, 136, 145, 7, 65, 2, 2, 137, 142, 5, 58, 30, 2, 138, 139, 7, 10, 2, 2, 139, 141, 5, 58, 30, 2, 140, 138, 3, 2, 2, 2, 141, 144, 3, 2, 2, 2, 142, 140, 3, 2, 2, 2, 142, 143, 3, 2, 2, 2, 143, 146, 3, 2, 2, 2, 144, 142, 3, 2, 2, 2, 145, 137, 3, 2, 2, 2, 145, 146, 3, 2, 2, 2, 146, 147, 3, 2, 2, 2, 147, 150, 7, 66, 2, 2, 148, 149, 7, 7, 2, 2, 149, 151, 5, 34, 18, 2, 150, 148, 3, 2, 2, 2, 150, 151, 3, 2, 2, 2, 151, 173, 3, 2, 2, 2, 152, 153, 7, 7, 2, 2, 153, 173, 5, 34, 18, 2, 154, 155, 7, 65, 2, 2, 155, 156, 5, 58, 30, 2, 156, 157, 7, 7, 2, 2, 157, 165, 5, 34, 18, 2, 158, 159, 7, 10, 2, 2, 159, 160, 5, 58, 30, 2, 160, 161, 7, 7, 2, 2, 161, 162, 5, 34, 18, 2, 162, 164, 3, 2, 2, 2, 163, 158, 3, 2, 2, 2, 164, 167, 3, 2, 2, 2, 165, 163, 3, 2, 2, 2, 165, 166, 3, 2, 2, 2, 166, 168, 3, 2, 2, 2, 167, 165, 3, 2, 2, 2, 168, 169, 7, 66, 2, 2, 169, 170, 7, 7, 2, 2, 170, 171, 5, 34, 18, 2, 171, 173, 3, 2, 2, 2, 172, 136, 3, 2, 2, 2, 172, 152, 3, 2, 2, 2, 172, 154, 3, 2, 2, 2, 172, 173, 3, 2, 2, 2, 173, 176, 3, 2, 2, 2, 174, 175, 7, 64, 2, 2, 175, 177, 5, 40, 21, 2, 176, 174, 3, 2, 2, 2, 176, 177, 3, 2, 2, 2, 177, 179, 3, 2, 2, 2, 178, 180, 7, 11, 2, 2, 179, 178, 3, 2, 2, 2, 179, 180, 3, 2, 2, 2, 180, 11, 3, 2, 2, 2, 181, 182, 7, 12, 2, 2, 182, 203, 5, 74, 38, 2, 183, 184, 7, 12, 2, 2, 184, 185, 5, 74, 38, 2, 185, 186, 7, 64, 2, 2, 186, 187, 5, 34, 18, 2, 187, 203, 3, 2, 2, 2, 188, 189, 7, 12, 2, 2, 189, 190, 5, 74, 38, 2, 190, 192, 7, 64, 2, 2, 191, 193, 7, 13, 2, 2, 192, 191, 3, 2, 2, 2, 192, 193, 3, 2, 2, 2, 193, 194, 3, 2, 2, 2, 194, 199, 5, 14, 8, 2, 195, 196, 7, 13, 2, 2, 196, 198, 5, 14, 8, 2, 197, 195, 3, 2, 2, 2, 198, 201, 3, 2, 2, 2, 199, 197, 3, 2, 2, 2, 199, 200, 3, 2, 2, 2, 200, 203, 3, 2, 2, 2, 201, 199, 3, 2, 2, 2, 202, 181, 3, 2, 2, 2, 202, 183, 3, 2, 2, 2, 202, 188, 3, 2, 2, 2, 203, 13, 3, 2, 2, 2, 204, 209, 5, 76, 39, 2, 205, 206, 7, 65, 2, 2, 206, 207, 5, 34, 18, 2, 207, 208, 7, 66, 2, 2, 208, 210, 3, 2, 2, 2, 209, 205, 3, 2, 2, 2, 209, 210, 3, 2, 2, 2, 210, 15, 3, 2, 2, 2, 211, 212, 7, 14, 2, 2, 212, 215, 5, 74, 38, 2, 213, 214, 7, 7, 2, 2, 214, 216, 5, 34, 18, 2, 215, 213, 3, 2, 2, 2, 215, 216, 3, 2, 2, 2, 216, 217, 3, 2, 2, 2, 217, 218, 7, 64, 2, 2, 218, 220, 5, 40, 21, 2, 219, 221, 7, 11, 2, 2, 220, 219, 3, 2, 2, 2, 220, 221, 3, 2, 2, 2, 221, 17, 3, 2, 2, 2, 222, 232, 7, 15, 2, 2, 223, 232, 7, 16, 2, 2, 224, 225, 7, 17, 2, 2, 225, 232, 7, 15, 2, 2, 226, 227, 7, 17, 2, 2, 227, 232, 7, 16, 2, 2, 228, 232, 7, 18, 2, 2, 229, 232, 7, 19, 2, 2, 230, 232, 7, 20, 2, 2, 231, 222, 3, 2, 2, 2, 231, 223, 3, 2, 2, 2, 231, 224, 3, 2, 2, 2, 231, 226, 3, 2, 2, 2, 231, 228, 3, 2, 2, 2, 231, 229, 3, 2, 2, 2, 231, 230, 3, 2, 2, 2, 232, 19, 3, 2, 2, 2, 233, 234, 7, 21, 2, 2, 234, 235, 5, 28, 15, 2, 235, 236, 7, 22, 2, 2, 236, 239, 5, 60, 31, 2, 237, 238, 7, 23, 2, 2, 238, 240, 5, 32, 17, 2, 239, 237, 3, 2, 2, 2, 239, 240, 3, 2, 2, 2, 240, 252, 3, 2, 2, 2, 241, 242, 7, 21, 2, 2, 242, 245, 5, 28, 15, 2, 243, 244, 7, 24, 2, 2, 244, 246, 5, 28, 15, 2, 245, 243, 3, 2, 2, 2, 245, 246, 3, 2, 2, 2, 246, 249, 3, 2, 2, 2, 247, 248, 7, 23, 2, 2, 248, 250, 5, 32, 17, 2, 249, 247, 3, 2, 2, 2, 249, 250, 3, 2, 2, 2, 250, 252, 3, 2, 2, 2, 251, 233, 3, 2, 2, 2, 251, 241, 3, 2, 2, 2, 252, 21, 3, 2, 2, 2, 253, 254, 7, 25, 2, 2, 254, 255, 5, 28, 15, 2, 255, 256, 7, 22, 2, 2, 256, 257, 5, 60, 31, 2, 257, 265, 3, 2, 2, 2, 258, 259, 7, 25, 2, 2, 259, 262, 5, 28, 15, 2, 260, 261, 7, 24, 2, 2, 261, 263, 5, 28, 15, 2, 262, 260, 3, 2, 2, 2, 262, 263, 3, 2, 2, 2, 263, 265, 3, 2, 2, 2, 264, 253, 3, 2, 2, 2, 264, 258, 3, 2, 2, 2, 265, 23, 3, 2, 2, 2, 266, 267, 7, 21, 2, 2, 267, 268, 5, 26, 14, 2, 268, 269, 7, 65, 2, 2, 269, 270, 5, 28, 15, 2, 270, 271, 7, 64, 2, 2, 271, 279, 5, 40, 21, 2, 272, 273, 7, 10, 2, 2, 273, 274, 5, 28, 15, 2, 274, 275, 7, 64, 2, 2, 275, 276, 5, 40, 21, 2, 276, 278, 3, 2, 2, 2, 277, 272, 3, 2, 2, 2, 278, 281, 3, 2, 2, 2, 279, 277, 3, 2, 2, 2, 279, 280, 3, 2, 2, 2, 280, 282, 3, 2, 2, 2, 281, 279, 3, 2, 2, 2, 282, 283, 7, 66, 2, 2, 283, 284, 7, 22, 2, 2, 284, 287, 7, 55, 2, 2, 285, 286, 7, 23, 2, 2, 286, 288, 5, 32, 17, 2, 287, 285, 3, 2, 2, 2, 287, 288, 3, 2, 2, 2, 288, 313, 3, 2, 2, 2, 289, 290, 7, 21, 2, 2, 290, 291, 5, 26, 14, 2, 291, 292, 7, 65, 2, 2, 292, 293, 5, 28, 15, 2, 293, 294, 7, 64, 2, 2, 294, 302, 5, 40, 21, 2, 295, 296, 7, 10, 2, 2, 296, 297, 5, 28, 15, 2, 297, 298, 7, 64, 2, 2, 298, 299, 5, 40, 21, 2, 299, 301, 3, 2, 2, 2, 300, 295, 3, 2, 2, 2, 301, 304, 3, 2, 2, 2, 302, 300, 3, 2, 2, 2, 302, 303, 3, 2, 2, 2, 303, 305, 3, 2, 2, 2, 304, 302, 3, 2, 2, 2, 305, 306, 7, 66, 2, 2, 306, 307, 7, 24, 2, 2, 307, 310, 5, 30, 16, 2, 308, 309, 7, 23, 2, 2, 309, 311, 5, 32, 17, 2, 310, 308, 3, 2, 2, 2, 310, 311, 3, 2, 2, 2, 311, 313, 3, 2, 2, 2, 312, 266, 3, 2, 2, 2, 312, 289, 3, 2, 2, 2, 313, 25, 3, 2, 2, 2, 314, 315, 5, 74, 38, 2, 315, 27, 3, 2, 2, 2, 316, 317, 5, 74, 38, 2, 317, 29, 3, 2, 2, 2, 318, 319, 5, 74, 38, 2, 319, 31, 3, 2, 2, 2, 320, 321, 7, 42, 2, 2, 321, 33, 3, 2, 2, 2, 322, 323, 8, 18, 1, 2, 323, 332, 7, 65, 2, 2, 324, 329, 5, 34, 18, 2, 325, 326, 7, 10, 2, 2, 326, 328, 5, 34, 18, 2, 327, 325, 3, 2, 2, 2, 328, 331, 3, 2, 2, 2, 329, 327, 3, 2, 2, 2, 329, 330, 3, 2, 2, 2, 330, 333, 3, 2, 2, 2, 331, 329, 3, 2, 2, 2, 332, 324, 3, 2, 2, 2, 332, 333, 3, 2, 2, 2, 333, 335, 3, 2, 2, 2, 334, 336, 7, 10, 2, 2, 335, 334, 3, 2, 2, 2, 335, 336, 3, 2, 2, 2, 336, 337, 3, 2, 2, 2, 337, 338, 7, 66, 2, 2, 338, 339, 7, 27, 2, 2, 339, 380, 5, 34, 18, 13, 340, 341, 7, 49, 2, 2, 341, 342, 7, 28, 2, 2, 342, 343, 5, 34, 18, 2, 343, 344, 7, 29, 2, 2, 344, 380, 3, 2, 2, 2, 345, 346, 7, 50, 2, 2, 346, 347, 7, 28, 2, 2, 347, 348, 5, 34, 18, 2, 348, 349, 7, 29, 2, 2, 349, 380, 3, 2, 2, 2, 350, 351, 7, 65, 2, 2, 351, 352, 5, 34, 18, 2, 352, 353, 7, 10, 2, 2, 353, 358, 5, 34, 18, 2, 354, 355, 7, 10, 2, 2, 355, 357, 5, 34, 18, 2, 356, 354, 3, 2, 2, 2, 357, 360, 3, 2, 2, 2, 358, 356, 3, 2, 2, 2, 358, 359, 3, 2, 2, 2, 359, 362, 3, 2, 2, 2, 360, 358, 3, 2, 2, 2, 361, 363, 7, 10, 2, 2, 362, 361, 3, 2, 2, 2, 362, 363, 3, 2, 2, 2, 363, 364, 3, 2, 2, 2, 364, 365, 7, 66, 2, 2, 365, 380, 3, 2, 2, 2, 366, 367, 7, 4, 2, 2, 367, 368, 5, 36, 19, 2, 368, 369, 7, 5, 2, 2, 369, 380, 3, 2, 2, 2, 370, 380, 7, 30, 2, 2, 371, 380, 7, 31, 2, 2, 372, 380, 7, 32, 2, 2, 373, 380, 7, 67, 2, 2, 374, 380, 5, 74, 38, 2, 375, 376, 7, 65, 2, 2, 376, 377, 5, 34, 18, 2, 377, 378, 7, 66, 2, 2, 378, 380, 3, 2, 2, 2, 379, 322, 3, 2, 2, 2, 379, 340, 3, 2, 2, 2, 379, 345, 3, 2, 2, 2, 379, 350, 3, 2, 2, 2, 379, 366, 3, 2, 2, 2, 379, 370, 3, 2, 2, 2, 379, 371, 3, 2, 2, 2, 379, 372, 3, 2, 2, 2, 379, 373, 3, 2, 2, 2, 379, 374, 3, 2, 2, 2, 379, 375, 3, 2, 2, 2, 380, 389, 3, 2, 2, 2, 381, 382, 12, 15, 2, 2, 382, 383, 7, 26, 2, 2, 383, 388, 5, 34, 18, 15, 384, 385, 12, 14, 2, 2, 385, 386, 7, 27, 2, 2, 386, 388, 5, 34, 18, 14, 387, 381, 3, 2, 2, 2, 387, 384, 3, 2, 2, 2, 388, 391, 3, 2, 2, 2, 389, 387, 3, 2, 2, 2, 389, 390, 3, 2, 2, 2, 390, 35, 3, 2, 2, 2, 391, 389, 3, 2, 2, 2, 392, 393, 5, 38, 20, 2, 393, 394, 7, 7, 2, 2, 394, 395, 5, 34, 18, 2, 395, 396, 7, 10, 2, 2, 396, 398, 3, 2, 2, 2, 397, 392, 3, 2, 2, 2, 398, 401, 3, 2, 2, 2, 399, 397, 3, 2, 2, 2, 399, 400, 3, 2, 2, 2, 400, 411, 3, 2, 2, 2, 401, 399, 3, 2, 2, 2, 402, 403, 5, 38, 20, 2, 403, 404, 7, 7, 2, 2, 404, 405, 5, 34, 18, 2, 405, 409, 3, 2, 2, 2, 406, 410, 7, 10, 2, 2, 407, 408, 7, 13, 2, 2, 408, 410, 5, 78, 40, 2, 409, 406, 3, 2, 2, 2, 409, 407, 3, 2, 2, 2, 409, 410, 3, 2, 2, 2, 410, 412, 3, 2, 2, 2, 411, 402, 3, 2, 2, 2, 411, 412, 3, 2, 2, 2, 412, 416, 3, 2, 2, 2, 413, 414, 7, 13, 2, 2, 414, 416, 5, 78, 40, 2, 415, 399, 3, 2, 2, 2, 415, 413, 3, 2, 2, 2, 416, 37, 3, 2, 2, 2, 417, 418, 5, 76, 39, 2, 418, 39, 3, 2, 2, 2, 419, 420, 8, 21, 1, 2, 420, 570, 5, 50, 26, 2, 421, 422, 5, 66, 34, 2, 422, 424, 7, 65, 2, 2, 423, 425, 5, 62, 32, 2, 424, 423, 3, 2, 2, 2, 424, 425, 3, 2, 2, 2, 425, 426, 3, 2, 2, 2, 426, 427, 7, 66, 2, 2, 427, 570, 3, 2, 2, 2, 428, 429, 7, 54, 2, 2, 429, 570, 5, 40, 21, 27, 430, 431, 5, 74, 38, 2, 431, 432, 7, 34, 2, 2, 432, 433, 7, 64, 2, 2, 433, 434, 5, 40, 21, 23, 434, 570, 3, 2, 2, 2, 435, 436, 7, 45, 2, 2, 436, 437, 7, 4, 2, 2, 437, 442, 5, 40, 21, 2, 438, 439, 7, 10, 2, 2, 439, 441, 5, 40, 21, 2, 440, 438, 3, 2, 2, 2, 441, 444, 3, 2, 2, 2, 442, 440, 3, 2, 2, 2, 442, 443, 3, 2, 2, 2, 443, 446, 3, 2, 2, 2, 444, 442, 3, 2, 2, 2, 445, 447, 7, 10, 2, 2, 446, 445, 3, 2, 2, 2, 446, 447, 3, 2, 2, 2, 447, 448, 3, 2, 2, 2, 448, 449, 7, 5, 2, 2, 449, 570, 3, 2, 2, 2, 450, 451, 7, 46, 2, 2, 451, 452, 7, 4, 2, 2, 452, 457, 5, 40, 21, 2, 453, 454, 7, 10, 2, 2, 454, 456, 5, 40, 21, 2, 455, 453, 3, 2, 2, 2, 456, 459, 3, 2, 2, 2, 457, 455, 3, 2, 2, 2, 457, 458, 3, 2, 2, 2, 458, 461, 3, 2, 2, 2, 459, 457, 3, 2, 2, 2, 460, 462, 7, 10, 2, 2, 461, 460, 3, 2, 2, 2, 461, 462, 3, 2, 2, 2, 462, 463, 3, 2, 2, 2, 463, 464, 7, 5, 2, 2, 464, 570, 3, 2, 2, 2, 465, 570, 5, 42, 22, 2, 466, 467, 7, 35, 2, 2, 467, 468, 7, 4, 2, 2, 468, 473, 5, 40, 21, 2, 469, 470, 7, 10, 2, 2, 470, 472, 5, 40, 21, 2, 471, 469, 3, 2, 2, 2, 472, 475, 3, 2, 2, 2, 473, 471, 3, 2, 2, 2, 473, 474, 3, 2, 2, 2, 474, 477, 3, 2, 2, 2, 475, 473, 3, 2, 2, 2, 476, 478, 7, 10, 2, 2, 477, 476, 3, 2, 2, 2, 477, 478, 3, 2, 2, 2, 478, 479, 3, 2, 2, 2, 479, 480, 7, 5, 2, 2, 480, 570, 3, 2, 2, 2, 481, 482, 7, 36, 2, 2, 482, 483, 7, 4, 2, 2, 483, 488, 5, 40, 21, 2, 484, 485, 7, 10, 2, 2, 485, 487, 5, 40, 21, 2, 486, 484, 3, 2, 2, 2, 487, 490, 3, 2, 2, 2, 488, 486, 3, 2, 2, 2, 488, 489, 3, 2, 2, 2, 489, 492, 3, 2, 2, 2, 490, 488, 3, 2, 2, 2, 491, 493, 7, 10, 2, 2, 492, 491, 3, 2, 2, 2, 492, 493, 3, 2, 2, 2, 493, 494, 3, 2, 2, 2, 494, 495, 7, 5, 2, 2, 495, 570, 3, 2, 2, 2, 496, 501, 5, 74, 38, 2, 497, 501, 7, 44, 2, 2, 498, 501, 7, 43, 2, 2, 499, 501, 7, 42, 2, 2, 500, 496, 3, 2, 2, 2, 500, 497, 3, 2, 2, 2, 500, 498, 3, 2, 2, 2, 500, 499, 3, 2, 2, 2, 501, 570, 3, 2, 2, 2, 502, 503, 7, 65, 2, 2, 503, 504, 5, 40, 21, 2, 504, 505, 7, 10, 2, 2, 505, 510, 5, 40, 21, 2, 506, 507, 7, 10, 2, 2, 507, 509, 5, 40, 21, 2, 508, 506, 3, 2, 2, 2, 509, 512, 3, 2, 2, 2, 510, 508, 3, 2, 2, 2, 510, 511, 3, 2, 2, 2, 511, 514, 3, 2, 2, 2, 512, 510, 3, 2, 2, 2, 513, 515, 7, 10, 2, 2, 514, 513, 3, 2, 2, 2, 514, 515, 3, 2, 2, 2, 515, 516, 3, 2, 2, 2, 516, 517, 7, 66, 2, 2, 517, 570, 3, 2, 2, 2, 518, 519, 7, 4, 2, 2, 519, 524, 5, 64, 33, 2, 520, 521, 7, 10, 2, 2, 521, 523, 5, 64, 33, 2, 522, 520, 3, 2, 2, 2, 523, 526, 3, 2, 2, 2, 524, 522, 3, 2, 2, 2, 524, 525, 3, 2, 2, 2, 525, 528, 3, 2, 2, 2, 526, 524, 3, 2, 2, 2, 527, 529, 7, 10, 2, 2, 528, 527, 3, 2, 2, 2, 528, 529, 3, 2, 2, 2, 529, 530, 3, 2, 2, 2, 530, 531, 7, 5, 2, 2, 531, 570, 3, 2, 2, 2, 532, 541, 7, 28, 2, 2, 533, 538, 5, 40, 21, 2, 534, 535, 7, 10, 2, 2, 535, 537, 5, 40, 21, 2, 536, 534, 3, 2, 2, 2, 537, 540, 3, 2, 2, 2, 538, 536, 3, 2, 2, 2, 538, 539, 3, 2, 2, 2, 539, 542, 3, 2, 2, 2, 540, 538, 3, 2, 2, 2, 541, 533, 3, 2, 2, 2, 541, 542, 3, 2, 2, 2, 542, 544, 3, 2, 2, 2, 543, 545, 7, 10, 2, 2, 544, 543, 3, 2, 2, 2, 544, 545, 3, 2, 2, 2, 545, 546, 3, 2, 2, 2, 546, 570, 7, 29, 2, 2, 547, 548, 7, 37, 2, 2, 548, 549, 7, 65, 2, 2, 549, 550, 5, 40, 21, 2, 550, 551, 7, 66, 2, 2, 551, 552, 5, 40, 21, 2, 552, 553, 7, 38, 2, 2, 553, 554, 5, 40, 21, 7, 554, 570, 3, 2, 2, 2, 555, 556, 5, 10, 6, 2, 556, 557, 5, 40, 21, 6, 557, 570, 3, 2, 2, 2, 558, 559, 5, 16, 9, 2, 559, 560, 5, 40, 21, 5, 560, 570, 3, 2, 2, 2, 561, 562, 7, 65, 2, 2, 562, 563, 5, 40, 21, 2, 563, 564, 7, 66, 2, 2, 564, 570, 3, 2, 2, 2, 565, 566, 7, 4, 2, 2, 566, 567, 5, 40, 21, 2, 567, 568, 7, 5, 2, 2, 568, 570, 3, 2, 2, 2, 569, 419, 3, 2, 2, 2, 569, 421, 3, 2, 2, 2, 569, 428, 3, 2, 2, 2, 569, 430, 3, 2, 2, 2, 569, 435, 3, 2, 2, 2, 569, 450, 3, 2, 2, 2, 569, 465, 3, 2, 2, 2, 569, 466, 3, 2, 2, 2, 569, 481, 3, 2, 2, 2, 569, 500, 3, 2, 2, 2, 569, 502, 3, 2, 2, 2, 569, 518, 3, 2, 2, 2, 569, 532, 3, 2, 2, 2, 569, 547, 3, 2, 2, 2, 569, 555, 3, 2, 2, 2, 569, 558, 3, 2, 2, 2, 569, 561, 3, 2, 2, 2, 569, 565, 3, 2, 2, 2, 570, 620, 3, 2, 2, 2, 571, 572, 12, 28, 2, 2, 572, 573, 7, 33, 2, 2, 573, 619, 5, 40, 21, 28, 574, 575, 12, 26, 2, 2, 575, 576, 9, 2, 2, 2, 576, 619, 5, 40, 21, 27, 577, 578, 12, 25, 2, 2, 578, 579, 9, 3, 2, 2, 579, 619, 5, 40, 21, 26, 580, 581, 12, 24, 2, 2, 581, 582, 9, 4, 2, 2, 582, 619, 5, 40, 21, 25, 583, 584, 12, 22, 2, 2, 584, 585, 7, 64, 2, 2, 585, 586, 5, 40, 21, 23, 586, 587, 8, 21, 1, 2, 587, 619, 3, 2, 2, 2, 588, 589, 12, 20, 2, 2, 589, 590, 7, 45, 2, 2, 590, 619, 5, 40, 21, 21, 591, 592, 12, 18, 2, 2, 592, 593, 7, 46, 2, 2, 593, 619, 5, 40, 21, 19, 594, 595, 12, 17, 2, 2, 595, 596, 7, 47, 2, 2, 596, 619, 5, 40, 21, 18, 597, 598, 12, 16, 2, 2, 598, 599, 7, 48, 2, 2, 599, 619, 5, 40, 21, 17, 600, 601, 12, 10, 2, 2, 601, 602, 7, 26, 2, 2, 602, 619, 5, 40, 21, 11, 603, 604, 12, 32, 2, 2, 604, 605, 7, 22, 2, 2, 605, 611, 5, 68, 35, 2, 606, 608, 7, 65, 2, 2, 607, 609, 5, 62, 32, 2, 608, 607, 3, 2, 2, 2, 608, 609, 3, 2, 2, 2, 609, 610, 3, 2, 2, 2, 610, 612, 7, 66, 2, 2, 611, 606, 3, 2, 2, 2, 611, 612, 3, 2, 2, 2, 612, 619, 3, 2, 2, 2, 613, 614, 12, 29, 2, 2, 614, 615, 7, 28, 2, 2, 615, 616, 5, 40, 21, 2, 616, 617, 7, 29, 2, 2, 617, 619, 3, 2, 2, 2, 618, 571, 3, 2, 2, 2, 618, 574, 3, 2, 2, 2, 618, 577, 3, 2, 2, 2, 618, 580, 3, 2, 2, 2, 618, 583, 3, 2, 2, 2, 618, 588, 3, 2, 2, 2, 618, 591, 3, 2, 2, 2, 618, 594, 3, 2, 2, 2, 618, 597, 3, 2, 2, 2, 618, 600, 3, 2, 2, 2, 618, 603, 3, 2, 2, 2, 618, 613, 3, 2, 2, 2, 619, 622, 3, 2, 2, 2, 620, 618, 3, 2, 2, 2, 620, 621, 3, 2, 2, 2, 621, 41, 3, 2, 2, 2, 622, 620, 3, 2, 2, 2, 623, 624, 7, 52, 2, 2, 624, 625, 5, 40, 21, 2, 625, 627, 7, 4, 2, 2, 626, 628, 7, 13, 2, 2, 627, 626, 3, 2, 2, 2, 627, 628, 3, 2, 2, 2, 628, 629, 3, 2, 2, 2, 629, 634, 5, 44, 23, 2, 630, 631, 7, 13, 2, 2, 631, 633, 5, 44, 23, 2, 632, 630, 3, 2, 2, 2, 633, 636, 3, 2, 2, 2, 634, 632, 3, 2, 2, 2, 634, 635, 3, 2, 2, 2, 635, 637, 3, 2, 2, 2, 636, 634, 3, 2, 2, 2, 637, 638, 7, 5, 2, 2, 638, 43, 3, 2, 2, 2, 639, 642, 5, 46, 24, 2, 640, 642, 7, 39, 2, 2, 641, 639, 3, 2, 2, 2, 641, 640, 3, 2, 2, 2, 642, 643, 3, 2, 2, 2, 643, 644, 7, 27, 2, 2, 644, 645, 5, 40, 21, 2, 645, 45, 3, 2, 2, 2, 646, 653, 5, 76, 39, 2, 647, 650, 7, 65, 2, 2, 648, 651, 5, 76, 39, 2, 649, 651, 7, 39, 2, 2, 650, 648, 3, 2, 2, 2, 650, 649, 3, 2, 2, 2, 651, 652, 3, 2, 2, 2, 652, 654, 7, 66, 2, 2, 653, 647, 3, 2, 2, 2, 653, 654, 3, 2, 2, 2, 654, 47, 3, 2, 2, 2, 655, 656, 5, 8, 5, 2, 656, 657, 7, 2, 2, 3, 657, 665, 3, 2, 2, 2, 658, 659, 5, 40, 21, 2, 659, 660, 7, 2, 2, 3, 660, 665, 3, 2, 2, 2, 661, 662, 7, 69, 2, 2, 662, 665, 7, 2, 2, 3, 663, 665, 7, 2, 2, 3, 664, 655, 3, 2, 2, 2, 664, 658, 3, 2, 2, 2, 664, 661, 3, 2, 2, 2, 664, 663, 3, 2, 2, 2, 665, 49, 3, 2, 2, 2, 666, 669, 5, 52, 27, 2, 667, 669, 5, 54, 28, 2, 668, 666, 3, 2, 2, 2, 668, 667, 3, 2, 2, 2, 669, 51, 3, 2, 2, 2, 670, 671, 5, 58, 30, 2, 671, 672, 7, 27, 2, 2, 672, 673, 5, 40, 21, 2, 673, 688, 3, 2, 2, 2, 674, 675, 7, 65, 2, 2, 675, 680, 5, 58, 30, 2, 676, 677, 7, 10, 2, 2, 677, 679, 5, 58, 30, 2, 678, 676, 3, 2, 2, 2, 679, 682, 3, 2, 2, 2, 680, 678, 3, 2, 2, 2, 680, 681, 3, 2, 2, 2, 681, 683, 3, 2, 2, 2, 682, 680, 3, 2, 2, 2, 683, 684, 7, 66, 2, 2, 684, 685, 7, 27, 2, 2, 685, 686, 5, 40, 21, 2, 686, 688, 3, 2, 2, 2, 687, 670, 3, 2, 2, 2, 687, 674, 3, 2, 2, 2, 688, 53, 3, 2, 2, 2, 689, 690, 7, 65, 2, 2, 690, 691, 7, 65, 2, 2, 691, 694, 5, 58, 30, 2, 692, 693, 7, 10, 2, 2, 693, 695, 5, 58, 30, 2, 694, 692, 3, 2, 2, 2, 695, 696, 3, 2, 2, 2, 696, 694, 3, 2, 2, 2, 696, 697, 3, 2, 2, 2, 697, 698, 3, 2, 2, 2, 698, 699, 7, 66, 2, 2, 699, 700, 7, 66, 2, 2, 700, 701, 7, 27, 2, 2, 701, 702, 5, 40, 21, 2, 702, 55, 3, 2, 2, 2, 703, 706, 7, 39, 2, 2, 704, 706, 5, 74, 38, 2, 705, 703, 3, 2, 2, 2, 705, 704, 3, 2, 2, 2, 706, 57, 3, 2, 2, 2, 707, 708, 5, 56, 29, 2, 708, 59, 3, 2, 2, 2, 709, 712, 7, 55, 2, 2, 710, 712, 5, 74, 38, 2, 711, 709, 3, 2, 2, 2, 711, 710, 3, 2, 2, 2, 712, 61, 3, 2, 2, 2, 713, 718, 5, 40, 21, 2, 714, 715, 7, 10, 2, 2, 715, 717, 5, 40, 21, 2, 716, 714, 3, 2, 2, 2, 717, 720, 3, 2, 2, 2, 718, 716, 3, 2, 2, 2, 718, 719, 3, 2, 2, 2, 719, 63, 3, 2, 2, 2, 720, 718, 3, 2, 2, 2, 721, 722, 5, 76, 39, 2, 722, 723, 7, 7, 2, 2, 723, 724, 5, 40, 21, 2, 724, 728, 3, 2, 2, 2, 725, 726, 7, 40, 2, 2, 726, 728, 5, 40, 21, 2, 727, 721, 3, 2, 2, 2, 727, 725, 3, 2, 2, 2, 728, 65, 3, 2, 2, 2, 729, 732, 5, 74, 38, 2, 730, 732, 9, 5, 2, 2, 731, 729, 3, 2, 2, 2, 731, 730, 3, 2, 2, 2, 732, 67, 3, 2, 2, 2, 733, 736, 5, 74, 38, 2, 734, 736, 9, 6, 2, 2, 735, 733, 3, 2, 2, 2, 735, 734, 3, 2, 2, 2, 736, 69, 3, 2, 2, 2, 737, 738, 9, 7, 2, 2, 738, 71, 3, 2, 2, 2, 739, 740, 9, 8, 2, 2, 740, 73, 3, 2, 2, 2, 741, 746, 5, 78, 40, 2, 742, 743, 7, 41, 2, 2, 743, 745, 5, 78, 40, 2, 744, 742, 3, 2, 2, 2, 745, 748, 3, 2, 2, 2, 746, 744, 3, 2, 2, 2, 746, 747, 3, 2, 2, 2, 747, 75, 3, 2, 2, 2, 748, 746, 3, 2, 2, 2, 749, 754, 5, 78, 40, 2, 750, 751, 5, 74, 38, 2, 751, 752, 8, 39, 1, 2, 752, 754, 3, 2, 2, 2, 753, 749, 3, 2, 2, 2, 753, 750, 3, 2, 2, 2, 754, 77, 3, 2, 2, 2, 755, 756, 9, 9, 2, 2, 756, 79, 3, 2, 2, 2, 84, 83, 90, 99, 107, 132, 142, 145, 150, 165, 172, 176, 179, 192, 199, 202, 209, 215, 220, 231, 239, 245, 249, 251, 262, 264, 279, 287, 302, 310, 312, 329, 332, 335, 358, 362, 379, 387, 389, 399, 409, 411, 415, 424, 442, 446, 457, 461, 473, 477, 488, 492, 500, 510, 514, 524, 528, 538, 541, 544, 569, 608, 611, 618, 620, 627, 634, 641, 650, 653, 664, 668, 680, 687, 696, 705, 711, 718, 727, 731, 735, 746, 753] \ No newline at end of file +[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 3, 72, 793, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 3, 2, 6, 2, 88, 10, 2, 13, 2, 14, 2, 89, 3, 2, 3, 2, 3, 3, 7, 3, 95, 10, 3, 12, 3, 14, 3, 98, 11, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 104, 10, 3, 12, 3, 14, 3, 107, 11, 3, 3, 3, 3, 3, 3, 4, 7, 4, 112, 10, 4, 12, 4, 14, 4, 115, 11, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 5, 5, 139, 10, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 147, 10, 6, 12, 6, 14, 6, 150, 11, 6, 5, 6, 152, 10, 6, 3, 6, 3, 6, 3, 6, 5, 6, 157, 10, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 170, 10, 6, 12, 6, 14, 6, 173, 11, 6, 3, 6, 3, 6, 3, 6, 3, 6, 5, 6, 179, 10, 6, 3, 6, 3, 6, 5, 6, 183, 10, 6, 3, 6, 5, 6, 186, 10, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 5, 7, 200, 10, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 7, 8, 207, 10, 8, 12, 8, 14, 8, 210, 11, 8, 3, 8, 3, 8, 5, 8, 214, 10, 8, 3, 9, 5, 9, 217, 10, 9, 3, 9, 3, 9, 3, 9, 7, 9, 222, 10, 9, 12, 9, 14, 9, 225, 11, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 232, 10, 10, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 238, 10, 11, 3, 11, 3, 11, 3, 11, 5, 11, 243, 10, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 254, 10, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 262, 10, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 268, 10, 13, 3, 13, 3, 13, 5, 13, 272, 10, 13, 5, 13, 274, 10, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 5, 14, 285, 10, 14, 5, 14, 287, 10, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 7, 15, 300, 10, 15, 12, 15, 14, 15, 303, 11, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 310, 10, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 7, 15, 323, 10, 15, 12, 15, 14, 15, 326, 11, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 333, 10, 15, 5, 15, 335, 10, 15, 3, 16, 3, 16, 3, 17, 3, 17, 3, 18, 3, 18, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 350, 10, 20, 12, 20, 14, 20, 353, 11, 20, 5, 20, 355, 10, 20, 3, 20, 5, 20, 358, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 379, 10, 20, 12, 20, 14, 20, 382, 11, 20, 3, 20, 5, 20, 385, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 5, 20, 391, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 5, 20, 403, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 416, 10, 20, 12, 20, 14, 20, 419, 11, 20, 3, 20, 3, 20, 7, 20, 423, 10, 20, 12, 20, 14, 20, 426, 11, 20, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 7, 22, 439, 10, 22, 12, 22, 14, 22, 442, 11, 22, 3, 22, 3, 22, 3, 22, 5, 22, 447, 10, 22, 3, 22, 3, 22, 5, 22, 451, 10, 22, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 460, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 476, 10, 24, 12, 24, 14, 24, 479, 11, 24, 3, 24, 5, 24, 482, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 491, 10, 24, 12, 24, 14, 24, 494, 11, 24, 3, 24, 5, 24, 497, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 507, 10, 24, 12, 24, 14, 24, 510, 11, 24, 3, 24, 5, 24, 513, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 522, 10, 24, 12, 24, 14, 24, 525, 11, 24, 3, 24, 5, 24, 528, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 536, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 544, 10, 24, 12, 24, 14, 24, 547, 11, 24, 3, 24, 5, 24, 550, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 558, 10, 24, 12, 24, 14, 24, 561, 11, 24, 3, 24, 5, 24, 564, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 572, 10, 24, 12, 24, 14, 24, 575, 11, 24, 5, 24, 577, 10, 24, 3, 24, 5, 24, 580, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 605, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 644, 10, 24, 3, 24, 5, 24, 647, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 654, 10, 24, 12, 24, 14, 24, 657, 11, 24, 3, 25, 3, 25, 3, 25, 3, 25, 5, 25, 663, 10, 25, 3, 25, 3, 25, 3, 25, 7, 25, 668, 10, 25, 12, 25, 14, 25, 671, 11, 25, 3, 25, 3, 25, 3, 26, 3, 26, 5, 26, 677, 10, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 5, 27, 686, 10, 27, 3, 27, 5, 27, 689, 10, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 700, 10, 28, 3, 29, 3, 29, 5, 29, 704, 10, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 7, 30, 714, 10, 30, 12, 30, 14, 30, 717, 11, 30, 3, 30, 3, 30, 3, 30, 3, 30, 5, 30, 723, 10, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 6, 31, 730, 10, 31, 13, 31, 14, 31, 731, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 5, 32, 741, 10, 32, 3, 33, 3, 33, 3, 34, 3, 34, 5, 34, 747, 10, 34, 3, 35, 3, 35, 3, 35, 7, 35, 752, 10, 35, 12, 35, 14, 35, 755, 11, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 5, 36, 763, 10, 36, 3, 37, 3, 37, 5, 37, 767, 10, 37, 3, 38, 3, 38, 5, 38, 771, 10, 38, 3, 39, 3, 39, 3, 40, 3, 40, 3, 41, 3, 41, 3, 41, 7, 41, 780, 10, 41, 12, 41, 14, 41, 783, 11, 41, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 789, 10, 42, 3, 43, 3, 43, 3, 43, 2, 2, 4, 38, 46, 44, 2, 2, 4, 2, 6, 2, 8, 2, 10, 2, 12, 2, 14, 2, 16, 2, 18, 2, 20, 2, 22, 2, 24, 2, 26, 2, 28, 2, 30, 2, 32, 2, 34, 2, 36, 2, 38, 2, 40, 2, 42, 2, 44, 2, 46, 2, 48, 2, 50, 2, 52, 2, 54, 2, 56, 2, 58, 2, 60, 2, 62, 2, 64, 2, 66, 2, 68, 2, 70, 2, 72, 2, 74, 2, 76, 2, 78, 2, 80, 2, 82, 2, 84, 2, 2, 10, 3, 2, 53, 55, 3, 2, 51, 52, 3, 2, 56, 61, 4, 2, 45, 49, 65, 66, 3, 2, 45, 48, 5, 2, 33, 33, 45, 48, 51, 61, 3, 2, 42, 44, 3, 2, 67, 68, 2, 890, 2, 87, 3, 2, 2, 2, 4, 96, 3, 2, 2, 2, 6, 113, 3, 2, 2, 2, 8, 138, 3, 2, 2, 2, 10, 140, 3, 2, 2, 2, 12, 199, 3, 2, 2, 2, 14, 201, 3, 2, 2, 2, 16, 216, 3, 2, 2, 2, 18, 226, 3, 2, 2, 2, 20, 233, 3, 2, 2, 2, 22, 253, 3, 2, 2, 2, 24, 273, 3, 2, 2, 2, 26, 286, 3, 2, 2, 2, 28, 334, 3, 2, 2, 2, 30, 336, 3, 2, 2, 2, 32, 338, 3, 2, 2, 2, 34, 340, 3, 2, 2, 2, 36, 342, 3, 2, 2, 2, 38, 402, 3, 2, 2, 2, 40, 427, 3, 2, 2, 2, 42, 450, 3, 2, 2, 2, 44, 452, 3, 2, 2, 2, 46, 604, 3, 2, 2, 2, 48, 658, 3, 2, 2, 2, 50, 676, 3, 2, 2, 2, 52, 681, 3, 2, 2, 2, 54, 699, 3, 2, 2, 2, 56, 703, 3, 2, 2, 2, 58, 722, 3, 2, 2, 2, 60, 724, 3, 2, 2, 2, 62, 740, 3, 2, 2, 2, 64, 742, 3, 2, 2, 2, 66, 746, 3, 2, 2, 2, 68, 748, 3, 2, 2, 2, 70, 762, 3, 2, 2, 2, 72, 766, 3, 2, 2, 2, 74, 770, 3, 2, 2, 2, 76, 772, 3, 2, 2, 2, 78, 774, 3, 2, 2, 2, 80, 776, 3, 2, 2, 2, 82, 788, 3, 2, 2, 2, 84, 790, 3, 2, 2, 2, 86, 88, 5, 4, 3, 2, 87, 86, 3, 2, 2, 2, 88, 89, 3, 2, 2, 2, 89, 87, 3, 2, 2, 2, 89, 90, 3, 2, 2, 2, 90, 91, 3, 2, 2, 2, 91, 92, 7, 2, 2, 3, 92, 3, 3, 2, 2, 2, 93, 95, 7, 69, 2, 2, 94, 93, 3, 2, 2, 2, 95, 98, 3, 2, 2, 2, 96, 94, 3, 2, 2, 2, 96, 97, 3, 2, 2, 2, 97, 99, 3, 2, 2, 2, 98, 96, 3, 2, 2, 2, 99, 100, 7, 3, 2, 2, 100, 101, 5, 80, 41, 2, 101, 105, 7, 4, 2, 2, 102, 104, 5, 6, 4, 2, 103, 102, 3, 2, 2, 2, 104, 107, 3, 2, 2, 2, 105, 103, 3, 2, 2, 2, 105, 106, 3, 2, 2, 2, 106, 108, 3, 2, 2, 2, 107, 105, 3, 2, 2, 2, 108, 109, 7, 5, 2, 2, 109, 5, 3, 2, 2, 2, 110, 112, 7, 69, 2, 2, 111, 110, 3, 2, 2, 2, 112, 115, 3, 2, 2, 2, 113, 111, 3, 2, 2, 2, 113, 114, 3, 2, 2, 2, 114, 116, 3, 2, 2, 2, 115, 113, 3, 2, 2, 2, 116, 117, 5, 8, 5, 2, 117, 7, 3, 2, 2, 2, 118, 119, 7, 6, 2, 2, 119, 120, 5, 80, 41, 2, 120, 121, 7, 7, 2, 2, 121, 122, 5, 38, 20, 2, 122, 139, 3, 2, 2, 2, 123, 124, 7, 8, 2, 2, 124, 125, 5, 80, 41, 2, 125, 126, 7, 7, 2, 2, 126, 127, 5, 38, 20, 2, 127, 139, 3, 2, 2, 2, 128, 129, 7, 9, 2, 2, 129, 130, 5, 62, 32, 2, 130, 131, 7, 62, 2, 2, 131, 132, 5, 46, 24, 2, 132, 139, 3, 2, 2, 2, 133, 139, 5, 28, 15, 2, 134, 139, 5, 10, 6, 2, 135, 139, 5, 12, 7, 2, 136, 139, 5, 24, 13, 2, 137, 139, 5, 26, 14, 2, 138, 118, 3, 2, 2, 2, 138, 123, 3, 2, 2, 2, 138, 128, 3, 2, 2, 2, 138, 133, 3, 2, 2, 2, 138, 134, 3, 2, 2, 2, 138, 135, 3, 2, 2, 2, 138, 136, 3, 2, 2, 2, 138, 137, 3, 2, 2, 2, 139, 9, 3, 2, 2, 2, 140, 141, 5, 22, 12, 2, 141, 178, 5, 72, 37, 2, 142, 151, 7, 63, 2, 2, 143, 148, 5, 64, 33, 2, 144, 145, 7, 10, 2, 2, 145, 147, 5, 64, 33, 2, 146, 144, 3, 2, 2, 2, 147, 150, 3, 2, 2, 2, 148, 146, 3, 2, 2, 2, 148, 149, 3, 2, 2, 2, 149, 152, 3, 2, 2, 2, 150, 148, 3, 2, 2, 2, 151, 143, 3, 2, 2, 2, 151, 152, 3, 2, 2, 2, 152, 153, 3, 2, 2, 2, 153, 156, 7, 64, 2, 2, 154, 155, 7, 7, 2, 2, 155, 157, 5, 38, 20, 2, 156, 154, 3, 2, 2, 2, 156, 157, 3, 2, 2, 2, 157, 179, 3, 2, 2, 2, 158, 159, 7, 7, 2, 2, 159, 179, 5, 38, 20, 2, 160, 161, 7, 63, 2, 2, 161, 162, 5, 64, 33, 2, 162, 163, 7, 7, 2, 2, 163, 171, 5, 38, 20, 2, 164, 165, 7, 10, 2, 2, 165, 166, 5, 64, 33, 2, 166, 167, 7, 7, 2, 2, 167, 168, 5, 38, 20, 2, 168, 170, 3, 2, 2, 2, 169, 164, 3, 2, 2, 2, 170, 173, 3, 2, 2, 2, 171, 169, 3, 2, 2, 2, 171, 172, 3, 2, 2, 2, 172, 174, 3, 2, 2, 2, 173, 171, 3, 2, 2, 2, 174, 175, 7, 64, 2, 2, 175, 176, 7, 7, 2, 2, 176, 177, 5, 38, 20, 2, 177, 179, 3, 2, 2, 2, 178, 142, 3, 2, 2, 2, 178, 158, 3, 2, 2, 2, 178, 160, 3, 2, 2, 2, 178, 179, 3, 2, 2, 2, 179, 182, 3, 2, 2, 2, 180, 181, 7, 62, 2, 2, 181, 183, 5, 46, 24, 2, 182, 180, 3, 2, 2, 2, 182, 183, 3, 2, 2, 2, 183, 185, 3, 2, 2, 2, 184, 186, 7, 11, 2, 2, 185, 184, 3, 2, 2, 2, 185, 186, 3, 2, 2, 2, 186, 11, 3, 2, 2, 2, 187, 188, 7, 12, 2, 2, 188, 200, 5, 80, 41, 2, 189, 190, 7, 12, 2, 2, 190, 191, 5, 14, 8, 2, 191, 192, 7, 62, 2, 2, 192, 193, 5, 38, 20, 2, 193, 200, 3, 2, 2, 2, 194, 195, 7, 12, 2, 2, 195, 196, 5, 14, 8, 2, 196, 197, 7, 62, 2, 2, 197, 198, 5, 16, 9, 2, 198, 200, 3, 2, 2, 2, 199, 187, 3, 2, 2, 2, 199, 189, 3, 2, 2, 2, 199, 194, 3, 2, 2, 2, 200, 13, 3, 2, 2, 2, 201, 213, 5, 80, 41, 2, 202, 203, 7, 13, 2, 2, 203, 208, 5, 40, 21, 2, 204, 205, 7, 10, 2, 2, 205, 207, 5, 40, 21, 2, 206, 204, 3, 2, 2, 2, 207, 210, 3, 2, 2, 2, 208, 206, 3, 2, 2, 2, 208, 209, 3, 2, 2, 2, 209, 211, 3, 2, 2, 2, 210, 208, 3, 2, 2, 2, 211, 212, 7, 14, 2, 2, 212, 214, 3, 2, 2, 2, 213, 202, 3, 2, 2, 2, 213, 214, 3, 2, 2, 2, 214, 15, 3, 2, 2, 2, 215, 217, 7, 15, 2, 2, 216, 215, 3, 2, 2, 2, 216, 217, 3, 2, 2, 2, 217, 218, 3, 2, 2, 2, 218, 223, 5, 18, 10, 2, 219, 220, 7, 15, 2, 2, 220, 222, 5, 18, 10, 2, 221, 219, 3, 2, 2, 2, 222, 225, 3, 2, 2, 2, 223, 221, 3, 2, 2, 2, 223, 224, 3, 2, 2, 2, 224, 17, 3, 2, 2, 2, 225, 223, 3, 2, 2, 2, 226, 231, 5, 82, 42, 2, 227, 228, 7, 63, 2, 2, 228, 229, 5, 38, 20, 2, 229, 230, 7, 64, 2, 2, 230, 232, 3, 2, 2, 2, 231, 227, 3, 2, 2, 2, 231, 232, 3, 2, 2, 2, 232, 19, 3, 2, 2, 2, 233, 234, 7, 16, 2, 2, 234, 237, 5, 80, 41, 2, 235, 236, 7, 7, 2, 2, 236, 238, 5, 38, 20, 2, 237, 235, 3, 2, 2, 2, 237, 238, 3, 2, 2, 2, 238, 239, 3, 2, 2, 2, 239, 240, 7, 62, 2, 2, 240, 242, 5, 46, 24, 2, 241, 243, 7, 11, 2, 2, 242, 241, 3, 2, 2, 2, 242, 243, 3, 2, 2, 2, 243, 21, 3, 2, 2, 2, 244, 254, 7, 17, 2, 2, 245, 254, 7, 18, 2, 2, 246, 247, 7, 19, 2, 2, 247, 254, 7, 17, 2, 2, 248, 249, 7, 19, 2, 2, 249, 254, 7, 18, 2, 2, 250, 254, 7, 20, 2, 2, 251, 254, 7, 21, 2, 2, 252, 254, 7, 22, 2, 2, 253, 244, 3, 2, 2, 2, 253, 245, 3, 2, 2, 2, 253, 246, 3, 2, 2, 2, 253, 248, 3, 2, 2, 2, 253, 250, 3, 2, 2, 2, 253, 251, 3, 2, 2, 2, 253, 252, 3, 2, 2, 2, 254, 23, 3, 2, 2, 2, 255, 256, 7, 23, 2, 2, 256, 257, 5, 32, 17, 2, 257, 258, 7, 24, 2, 2, 258, 261, 5, 66, 34, 2, 259, 260, 7, 25, 2, 2, 260, 262, 5, 36, 19, 2, 261, 259, 3, 2, 2, 2, 261, 262, 3, 2, 2, 2, 262, 274, 3, 2, 2, 2, 263, 264, 7, 23, 2, 2, 264, 267, 5, 32, 17, 2, 265, 266, 7, 26, 2, 2, 266, 268, 5, 32, 17, 2, 267, 265, 3, 2, 2, 2, 267, 268, 3, 2, 2, 2, 268, 271, 3, 2, 2, 2, 269, 270, 7, 25, 2, 2, 270, 272, 5, 36, 19, 2, 271, 269, 3, 2, 2, 2, 271, 272, 3, 2, 2, 2, 272, 274, 3, 2, 2, 2, 273, 255, 3, 2, 2, 2, 273, 263, 3, 2, 2, 2, 274, 25, 3, 2, 2, 2, 275, 276, 7, 27, 2, 2, 276, 277, 5, 32, 17, 2, 277, 278, 7, 24, 2, 2, 278, 279, 5, 66, 34, 2, 279, 287, 3, 2, 2, 2, 280, 281, 7, 27, 2, 2, 281, 284, 5, 32, 17, 2, 282, 283, 7, 26, 2, 2, 283, 285, 5, 32, 17, 2, 284, 282, 3, 2, 2, 2, 284, 285, 3, 2, 2, 2, 285, 287, 3, 2, 2, 2, 286, 275, 3, 2, 2, 2, 286, 280, 3, 2, 2, 2, 287, 27, 3, 2, 2, 2, 288, 289, 7, 23, 2, 2, 289, 290, 5, 30, 16, 2, 290, 291, 7, 63, 2, 2, 291, 292, 5, 32, 17, 2, 292, 293, 7, 62, 2, 2, 293, 301, 5, 46, 24, 2, 294, 295, 7, 10, 2, 2, 295, 296, 5, 32, 17, 2, 296, 297, 7, 62, 2, 2, 297, 298, 5, 46, 24, 2, 298, 300, 3, 2, 2, 2, 299, 294, 3, 2, 2, 2, 300, 303, 3, 2, 2, 2, 301, 299, 3, 2, 2, 2, 301, 302, 3, 2, 2, 2, 302, 304, 3, 2, 2, 2, 303, 301, 3, 2, 2, 2, 304, 305, 7, 64, 2, 2, 305, 306, 7, 24, 2, 2, 306, 309, 7, 53, 2, 2, 307, 308, 7, 25, 2, 2, 308, 310, 5, 36, 19, 2, 309, 307, 3, 2, 2, 2, 309, 310, 3, 2, 2, 2, 310, 335, 3, 2, 2, 2, 311, 312, 7, 23, 2, 2, 312, 313, 5, 30, 16, 2, 313, 314, 7, 63, 2, 2, 314, 315, 5, 32, 17, 2, 315, 316, 7, 62, 2, 2, 316, 324, 5, 46, 24, 2, 317, 318, 7, 10, 2, 2, 318, 319, 5, 32, 17, 2, 319, 320, 7, 62, 2, 2, 320, 321, 5, 46, 24, 2, 321, 323, 3, 2, 2, 2, 322, 317, 3, 2, 2, 2, 323, 326, 3, 2, 2, 2, 324, 322, 3, 2, 2, 2, 324, 325, 3, 2, 2, 2, 325, 327, 3, 2, 2, 2, 326, 324, 3, 2, 2, 2, 327, 328, 7, 64, 2, 2, 328, 329, 7, 26, 2, 2, 329, 332, 5, 34, 18, 2, 330, 331, 7, 25, 2, 2, 331, 333, 5, 36, 19, 2, 332, 330, 3, 2, 2, 2, 332, 333, 3, 2, 2, 2, 333, 335, 3, 2, 2, 2, 334, 288, 3, 2, 2, 2, 334, 311, 3, 2, 2, 2, 335, 29, 3, 2, 2, 2, 336, 337, 5, 80, 41, 2, 337, 31, 3, 2, 2, 2, 338, 339, 5, 80, 41, 2, 339, 33, 3, 2, 2, 2, 340, 341, 5, 80, 41, 2, 341, 35, 3, 2, 2, 2, 342, 343, 7, 42, 2, 2, 343, 37, 3, 2, 2, 2, 344, 345, 8, 20, 1, 2, 345, 354, 7, 63, 2, 2, 346, 351, 5, 38, 20, 2, 347, 348, 7, 10, 2, 2, 348, 350, 5, 38, 20, 2, 349, 347, 3, 2, 2, 2, 350, 353, 3, 2, 2, 2, 351, 349, 3, 2, 2, 2, 351, 352, 3, 2, 2, 2, 352, 355, 3, 2, 2, 2, 353, 351, 3, 2, 2, 2, 354, 346, 3, 2, 2, 2, 354, 355, 3, 2, 2, 2, 355, 357, 3, 2, 2, 2, 356, 358, 7, 10, 2, 2, 357, 356, 3, 2, 2, 2, 357, 358, 3, 2, 2, 2, 358, 359, 3, 2, 2, 2, 359, 360, 7, 64, 2, 2, 360, 361, 7, 29, 2, 2, 361, 403, 5, 38, 20, 14, 362, 363, 7, 65, 2, 2, 363, 364, 7, 13, 2, 2, 364, 365, 5, 38, 20, 2, 365, 366, 7, 14, 2, 2, 366, 403, 3, 2, 2, 2, 367, 368, 7, 66, 2, 2, 368, 369, 7, 13, 2, 2, 369, 370, 5, 38, 20, 2, 370, 371, 7, 14, 2, 2, 371, 403, 3, 2, 2, 2, 372, 373, 7, 63, 2, 2, 373, 374, 5, 38, 20, 2, 374, 375, 7, 10, 2, 2, 375, 380, 5, 38, 20, 2, 376, 377, 7, 10, 2, 2, 377, 379, 5, 38, 20, 2, 378, 376, 3, 2, 2, 2, 379, 382, 3, 2, 2, 2, 380, 378, 3, 2, 2, 2, 380, 381, 3, 2, 2, 2, 381, 384, 3, 2, 2, 2, 382, 380, 3, 2, 2, 2, 383, 385, 7, 10, 2, 2, 384, 383, 3, 2, 2, 2, 384, 385, 3, 2, 2, 2, 385, 386, 3, 2, 2, 2, 386, 387, 7, 64, 2, 2, 387, 403, 3, 2, 2, 2, 388, 390, 7, 4, 2, 2, 389, 391, 5, 42, 22, 2, 390, 389, 3, 2, 2, 2, 390, 391, 3, 2, 2, 2, 391, 392, 3, 2, 2, 2, 392, 403, 7, 5, 2, 2, 393, 403, 7, 30, 2, 2, 394, 403, 7, 31, 2, 2, 395, 403, 7, 32, 2, 2, 396, 403, 5, 40, 21, 2, 397, 403, 5, 80, 41, 2, 398, 399, 7, 63, 2, 2, 399, 400, 5, 38, 20, 2, 400, 401, 7, 64, 2, 2, 401, 403, 3, 2, 2, 2, 402, 344, 3, 2, 2, 2, 402, 362, 3, 2, 2, 2, 402, 367, 3, 2, 2, 2, 402, 372, 3, 2, 2, 2, 402, 388, 3, 2, 2, 2, 402, 393, 3, 2, 2, 2, 402, 394, 3, 2, 2, 2, 402, 395, 3, 2, 2, 2, 402, 396, 3, 2, 2, 2, 402, 397, 3, 2, 2, 2, 402, 398, 3, 2, 2, 2, 403, 424, 3, 2, 2, 2, 404, 405, 12, 16, 2, 2, 405, 406, 7, 28, 2, 2, 406, 423, 5, 38, 20, 16, 407, 408, 12, 15, 2, 2, 408, 409, 7, 29, 2, 2, 409, 423, 5, 38, 20, 15, 410, 411, 12, 3, 2, 2, 411, 412, 7, 13, 2, 2, 412, 417, 5, 38, 20, 2, 413, 414, 7, 10, 2, 2, 414, 416, 5, 38, 20, 2, 415, 413, 3, 2, 2, 2, 416, 419, 3, 2, 2, 2, 417, 415, 3, 2, 2, 2, 417, 418, 3, 2, 2, 2, 418, 420, 3, 2, 2, 2, 419, 417, 3, 2, 2, 2, 420, 421, 7, 14, 2, 2, 421, 423, 3, 2, 2, 2, 422, 404, 3, 2, 2, 2, 422, 407, 3, 2, 2, 2, 422, 410, 3, 2, 2, 2, 423, 426, 3, 2, 2, 2, 424, 422, 3, 2, 2, 2, 424, 425, 3, 2, 2, 2, 425, 39, 3, 2, 2, 2, 426, 424, 3, 2, 2, 2, 427, 428, 7, 67, 2, 2, 428, 41, 3, 2, 2, 2, 429, 430, 5, 44, 23, 2, 430, 431, 7, 7, 2, 2, 431, 432, 5, 38, 20, 2, 432, 440, 3, 2, 2, 2, 433, 434, 7, 10, 2, 2, 434, 435, 5, 44, 23, 2, 435, 436, 7, 7, 2, 2, 436, 437, 5, 38, 20, 2, 437, 439, 3, 2, 2, 2, 438, 433, 3, 2, 2, 2, 439, 442, 3, 2, 2, 2, 440, 438, 3, 2, 2, 2, 440, 441, 3, 2, 2, 2, 441, 446, 3, 2, 2, 2, 442, 440, 3, 2, 2, 2, 443, 447, 7, 10, 2, 2, 444, 445, 7, 15, 2, 2, 445, 447, 5, 84, 43, 2, 446, 443, 3, 2, 2, 2, 446, 444, 3, 2, 2, 2, 446, 447, 3, 2, 2, 2, 447, 451, 3, 2, 2, 2, 448, 449, 7, 15, 2, 2, 449, 451, 5, 84, 43, 2, 450, 429, 3, 2, 2, 2, 450, 448, 3, 2, 2, 2, 451, 43, 3, 2, 2, 2, 452, 453, 5, 82, 42, 2, 453, 45, 3, 2, 2, 2, 454, 455, 8, 24, 1, 2, 455, 605, 5, 56, 29, 2, 456, 457, 5, 72, 37, 2, 457, 459, 7, 63, 2, 2, 458, 460, 5, 68, 35, 2, 459, 458, 3, 2, 2, 2, 459, 460, 3, 2, 2, 2, 460, 461, 3, 2, 2, 2, 461, 462, 7, 64, 2, 2, 462, 605, 3, 2, 2, 2, 463, 464, 7, 52, 2, 2, 464, 605, 5, 46, 24, 27, 465, 466, 5, 80, 41, 2, 466, 467, 7, 34, 2, 2, 467, 468, 7, 62, 2, 2, 468, 469, 5, 46, 24, 23, 469, 605, 3, 2, 2, 2, 470, 471, 7, 45, 2, 2, 471, 472, 7, 4, 2, 2, 472, 477, 5, 46, 24, 2, 473, 474, 7, 10, 2, 2, 474, 476, 5, 46, 24, 2, 475, 473, 3, 2, 2, 2, 476, 479, 3, 2, 2, 2, 477, 475, 3, 2, 2, 2, 477, 478, 3, 2, 2, 2, 478, 481, 3, 2, 2, 2, 479, 477, 3, 2, 2, 2, 480, 482, 7, 10, 2, 2, 481, 480, 3, 2, 2, 2, 481, 482, 3, 2, 2, 2, 482, 483, 3, 2, 2, 2, 483, 484, 7, 5, 2, 2, 484, 605, 3, 2, 2, 2, 485, 486, 7, 46, 2, 2, 486, 487, 7, 4, 2, 2, 487, 492, 5, 46, 24, 2, 488, 489, 7, 10, 2, 2, 489, 491, 5, 46, 24, 2, 490, 488, 3, 2, 2, 2, 491, 494, 3, 2, 2, 2, 492, 490, 3, 2, 2, 2, 492, 493, 3, 2, 2, 2, 493, 496, 3, 2, 2, 2, 494, 492, 3, 2, 2, 2, 495, 497, 7, 10, 2, 2, 496, 495, 3, 2, 2, 2, 496, 497, 3, 2, 2, 2, 497, 498, 3, 2, 2, 2, 498, 499, 7, 5, 2, 2, 499, 605, 3, 2, 2, 2, 500, 605, 5, 48, 25, 2, 501, 502, 7, 35, 2, 2, 502, 503, 7, 4, 2, 2, 503, 508, 5, 46, 24, 2, 504, 505, 7, 10, 2, 2, 505, 507, 5, 46, 24, 2, 506, 504, 3, 2, 2, 2, 507, 510, 3, 2, 2, 2, 508, 506, 3, 2, 2, 2, 508, 509, 3, 2, 2, 2, 509, 512, 3, 2, 2, 2, 510, 508, 3, 2, 2, 2, 511, 513, 7, 10, 2, 2, 512, 511, 3, 2, 2, 2, 512, 513, 3, 2, 2, 2, 513, 514, 3, 2, 2, 2, 514, 515, 7, 5, 2, 2, 515, 605, 3, 2, 2, 2, 516, 517, 7, 36, 2, 2, 517, 518, 7, 4, 2, 2, 518, 523, 5, 46, 24, 2, 519, 520, 7, 10, 2, 2, 520, 522, 5, 46, 24, 2, 521, 519, 3, 2, 2, 2, 522, 525, 3, 2, 2, 2, 523, 521, 3, 2, 2, 2, 523, 524, 3, 2, 2, 2, 524, 527, 3, 2, 2, 2, 525, 523, 3, 2, 2, 2, 526, 528, 7, 10, 2, 2, 527, 526, 3, 2, 2, 2, 527, 528, 3, 2, 2, 2, 528, 529, 3, 2, 2, 2, 529, 530, 7, 5, 2, 2, 530, 605, 3, 2, 2, 2, 531, 536, 5, 80, 41, 2, 532, 536, 7, 44, 2, 2, 533, 536, 7, 43, 2, 2, 534, 536, 7, 42, 2, 2, 535, 531, 3, 2, 2, 2, 535, 532, 3, 2, 2, 2, 535, 533, 3, 2, 2, 2, 535, 534, 3, 2, 2, 2, 536, 605, 3, 2, 2, 2, 537, 538, 7, 63, 2, 2, 538, 539, 5, 46, 24, 2, 539, 540, 7, 10, 2, 2, 540, 545, 5, 46, 24, 2, 541, 542, 7, 10, 2, 2, 542, 544, 5, 46, 24, 2, 543, 541, 3, 2, 2, 2, 544, 547, 3, 2, 2, 2, 545, 543, 3, 2, 2, 2, 545, 546, 3, 2, 2, 2, 546, 549, 3, 2, 2, 2, 547, 545, 3, 2, 2, 2, 548, 550, 7, 10, 2, 2, 549, 548, 3, 2, 2, 2, 549, 550, 3, 2, 2, 2, 550, 551, 3, 2, 2, 2, 551, 552, 7, 64, 2, 2, 552, 605, 3, 2, 2, 2, 553, 554, 7, 4, 2, 2, 554, 559, 5, 70, 36, 2, 555, 556, 7, 10, 2, 2, 556, 558, 5, 70, 36, 2, 557, 555, 3, 2, 2, 2, 558, 561, 3, 2, 2, 2, 559, 557, 3, 2, 2, 2, 559, 560, 3, 2, 2, 2, 560, 563, 3, 2, 2, 2, 561, 559, 3, 2, 2, 2, 562, 564, 7, 10, 2, 2, 563, 562, 3, 2, 2, 2, 563, 564, 3, 2, 2, 2, 564, 565, 3, 2, 2, 2, 565, 566, 7, 5, 2, 2, 566, 605, 3, 2, 2, 2, 567, 576, 7, 13, 2, 2, 568, 573, 5, 46, 24, 2, 569, 570, 7, 10, 2, 2, 570, 572, 5, 46, 24, 2, 571, 569, 3, 2, 2, 2, 572, 575, 3, 2, 2, 2, 573, 571, 3, 2, 2, 2, 573, 574, 3, 2, 2, 2, 574, 577, 3, 2, 2, 2, 575, 573, 3, 2, 2, 2, 576, 568, 3, 2, 2, 2, 576, 577, 3, 2, 2, 2, 577, 579, 3, 2, 2, 2, 578, 580, 7, 10, 2, 2, 579, 578, 3, 2, 2, 2, 579, 580, 3, 2, 2, 2, 580, 581, 3, 2, 2, 2, 581, 605, 7, 14, 2, 2, 582, 583, 7, 37, 2, 2, 583, 584, 7, 63, 2, 2, 584, 585, 5, 46, 24, 2, 585, 586, 7, 64, 2, 2, 586, 587, 5, 46, 24, 2, 587, 588, 7, 38, 2, 2, 588, 589, 5, 46, 24, 7, 589, 605, 3, 2, 2, 2, 590, 591, 5, 10, 6, 2, 591, 592, 5, 46, 24, 6, 592, 605, 3, 2, 2, 2, 593, 594, 5, 20, 11, 2, 594, 595, 5, 46, 24, 5, 595, 605, 3, 2, 2, 2, 596, 597, 7, 63, 2, 2, 597, 598, 5, 46, 24, 2, 598, 599, 7, 64, 2, 2, 599, 605, 3, 2, 2, 2, 600, 601, 7, 4, 2, 2, 601, 602, 5, 46, 24, 2, 602, 603, 7, 5, 2, 2, 603, 605, 3, 2, 2, 2, 604, 454, 3, 2, 2, 2, 604, 456, 3, 2, 2, 2, 604, 463, 3, 2, 2, 2, 604, 465, 3, 2, 2, 2, 604, 470, 3, 2, 2, 2, 604, 485, 3, 2, 2, 2, 604, 500, 3, 2, 2, 2, 604, 501, 3, 2, 2, 2, 604, 516, 3, 2, 2, 2, 604, 535, 3, 2, 2, 2, 604, 537, 3, 2, 2, 2, 604, 553, 3, 2, 2, 2, 604, 567, 3, 2, 2, 2, 604, 582, 3, 2, 2, 2, 604, 590, 3, 2, 2, 2, 604, 593, 3, 2, 2, 2, 604, 596, 3, 2, 2, 2, 604, 600, 3, 2, 2, 2, 605, 655, 3, 2, 2, 2, 606, 607, 12, 28, 2, 2, 607, 608, 7, 33, 2, 2, 608, 654, 5, 46, 24, 28, 609, 610, 12, 26, 2, 2, 610, 611, 9, 2, 2, 2, 611, 654, 5, 46, 24, 27, 612, 613, 12, 25, 2, 2, 613, 614, 9, 3, 2, 2, 614, 654, 5, 46, 24, 26, 615, 616, 12, 24, 2, 2, 616, 617, 9, 4, 2, 2, 617, 654, 5, 46, 24, 25, 618, 619, 12, 22, 2, 2, 619, 620, 7, 62, 2, 2, 620, 621, 5, 46, 24, 23, 621, 622, 8, 24, 1, 2, 622, 654, 3, 2, 2, 2, 623, 624, 12, 20, 2, 2, 624, 625, 7, 45, 2, 2, 625, 654, 5, 46, 24, 21, 626, 627, 12, 18, 2, 2, 627, 628, 7, 46, 2, 2, 628, 654, 5, 46, 24, 19, 629, 630, 12, 17, 2, 2, 630, 631, 7, 47, 2, 2, 631, 654, 5, 46, 24, 18, 632, 633, 12, 16, 2, 2, 633, 634, 7, 48, 2, 2, 634, 654, 5, 46, 24, 17, 635, 636, 12, 10, 2, 2, 636, 637, 7, 28, 2, 2, 637, 654, 5, 46, 24, 11, 638, 639, 12, 32, 2, 2, 639, 640, 7, 24, 2, 2, 640, 646, 5, 74, 38, 2, 641, 643, 7, 63, 2, 2, 642, 644, 5, 68, 35, 2, 643, 642, 3, 2, 2, 2, 643, 644, 3, 2, 2, 2, 644, 645, 3, 2, 2, 2, 645, 647, 7, 64, 2, 2, 646, 641, 3, 2, 2, 2, 646, 647, 3, 2, 2, 2, 647, 654, 3, 2, 2, 2, 648, 649, 12, 29, 2, 2, 649, 650, 7, 13, 2, 2, 650, 651, 5, 46, 24, 2, 651, 652, 7, 14, 2, 2, 652, 654, 3, 2, 2, 2, 653, 606, 3, 2, 2, 2, 653, 609, 3, 2, 2, 2, 653, 612, 3, 2, 2, 2, 653, 615, 3, 2, 2, 2, 653, 618, 3, 2, 2, 2, 653, 623, 3, 2, 2, 2, 653, 626, 3, 2, 2, 2, 653, 629, 3, 2, 2, 2, 653, 632, 3, 2, 2, 2, 653, 635, 3, 2, 2, 2, 653, 638, 3, 2, 2, 2, 653, 648, 3, 2, 2, 2, 654, 657, 3, 2, 2, 2, 655, 653, 3, 2, 2, 2, 655, 656, 3, 2, 2, 2, 656, 47, 3, 2, 2, 2, 657, 655, 3, 2, 2, 2, 658, 659, 7, 50, 2, 2, 659, 660, 5, 46, 24, 2, 660, 662, 7, 4, 2, 2, 661, 663, 7, 15, 2, 2, 662, 661, 3, 2, 2, 2, 662, 663, 3, 2, 2, 2, 663, 664, 3, 2, 2, 2, 664, 669, 5, 50, 26, 2, 665, 666, 7, 15, 2, 2, 666, 668, 5, 50, 26, 2, 667, 665, 3, 2, 2, 2, 668, 671, 3, 2, 2, 2, 669, 667, 3, 2, 2, 2, 669, 670, 3, 2, 2, 2, 670, 672, 3, 2, 2, 2, 671, 669, 3, 2, 2, 2, 672, 673, 7, 5, 2, 2, 673, 49, 3, 2, 2, 2, 674, 677, 5, 52, 27, 2, 675, 677, 7, 39, 2, 2, 676, 674, 3, 2, 2, 2, 676, 675, 3, 2, 2, 2, 677, 678, 3, 2, 2, 2, 678, 679, 7, 29, 2, 2, 679, 680, 5, 46, 24, 2, 680, 51, 3, 2, 2, 2, 681, 688, 5, 82, 42, 2, 682, 685, 7, 63, 2, 2, 683, 686, 5, 82, 42, 2, 684, 686, 7, 39, 2, 2, 685, 683, 3, 2, 2, 2, 685, 684, 3, 2, 2, 2, 686, 687, 3, 2, 2, 2, 687, 689, 7, 64, 2, 2, 688, 682, 3, 2, 2, 2, 688, 689, 3, 2, 2, 2, 689, 53, 3, 2, 2, 2, 690, 691, 5, 8, 5, 2, 691, 692, 7, 2, 2, 3, 692, 700, 3, 2, 2, 2, 693, 694, 5, 46, 24, 2, 694, 695, 7, 2, 2, 3, 695, 700, 3, 2, 2, 2, 696, 697, 7, 69, 2, 2, 697, 700, 7, 2, 2, 3, 698, 700, 7, 2, 2, 3, 699, 690, 3, 2, 2, 2, 699, 693, 3, 2, 2, 2, 699, 696, 3, 2, 2, 2, 699, 698, 3, 2, 2, 2, 700, 55, 3, 2, 2, 2, 701, 704, 5, 58, 30, 2, 702, 704, 5, 60, 31, 2, 703, 701, 3, 2, 2, 2, 703, 702, 3, 2, 2, 2, 704, 57, 3, 2, 2, 2, 705, 706, 5, 64, 33, 2, 706, 707, 7, 29, 2, 2, 707, 708, 5, 46, 24, 2, 708, 723, 3, 2, 2, 2, 709, 710, 7, 63, 2, 2, 710, 715, 5, 64, 33, 2, 711, 712, 7, 10, 2, 2, 712, 714, 5, 64, 33, 2, 713, 711, 3, 2, 2, 2, 714, 717, 3, 2, 2, 2, 715, 713, 3, 2, 2, 2, 715, 716, 3, 2, 2, 2, 716, 718, 3, 2, 2, 2, 717, 715, 3, 2, 2, 2, 718, 719, 7, 64, 2, 2, 719, 720, 7, 29, 2, 2, 720, 721, 5, 46, 24, 2, 721, 723, 3, 2, 2, 2, 722, 705, 3, 2, 2, 2, 722, 709, 3, 2, 2, 2, 723, 59, 3, 2, 2, 2, 724, 725, 7, 63, 2, 2, 725, 726, 7, 63, 2, 2, 726, 729, 5, 64, 33, 2, 727, 728, 7, 10, 2, 2, 728, 730, 5, 64, 33, 2, 729, 727, 3, 2, 2, 2, 730, 731, 3, 2, 2, 2, 731, 729, 3, 2, 2, 2, 731, 732, 3, 2, 2, 2, 732, 733, 3, 2, 2, 2, 733, 734, 7, 64, 2, 2, 734, 735, 7, 64, 2, 2, 735, 736, 7, 29, 2, 2, 736, 737, 5, 46, 24, 2, 737, 61, 3, 2, 2, 2, 738, 741, 7, 39, 2, 2, 739, 741, 5, 80, 41, 2, 740, 738, 3, 2, 2, 2, 740, 739, 3, 2, 2, 2, 741, 63, 3, 2, 2, 2, 742, 743, 5, 62, 32, 2, 743, 65, 3, 2, 2, 2, 744, 747, 7, 53, 2, 2, 745, 747, 5, 80, 41, 2, 746, 744, 3, 2, 2, 2, 746, 745, 3, 2, 2, 2, 747, 67, 3, 2, 2, 2, 748, 753, 5, 46, 24, 2, 749, 750, 7, 10, 2, 2, 750, 752, 5, 46, 24, 2, 751, 749, 3, 2, 2, 2, 752, 755, 3, 2, 2, 2, 753, 751, 3, 2, 2, 2, 753, 754, 3, 2, 2, 2, 754, 69, 3, 2, 2, 2, 755, 753, 3, 2, 2, 2, 756, 757, 5, 82, 42, 2, 757, 758, 7, 7, 2, 2, 758, 759, 5, 46, 24, 2, 759, 763, 3, 2, 2, 2, 760, 761, 7, 40, 2, 2, 761, 763, 5, 46, 24, 2, 762, 756, 3, 2, 2, 2, 762, 760, 3, 2, 2, 2, 763, 71, 3, 2, 2, 2, 764, 767, 5, 80, 41, 2, 765, 767, 9, 5, 2, 2, 766, 764, 3, 2, 2, 2, 766, 765, 3, 2, 2, 2, 767, 73, 3, 2, 2, 2, 768, 771, 5, 80, 41, 2, 769, 771, 9, 6, 2, 2, 770, 768, 3, 2, 2, 2, 770, 769, 3, 2, 2, 2, 771, 75, 3, 2, 2, 2, 772, 773, 9, 7, 2, 2, 773, 77, 3, 2, 2, 2, 774, 775, 9, 8, 2, 2, 775, 79, 3, 2, 2, 2, 776, 781, 5, 84, 43, 2, 777, 778, 7, 41, 2, 2, 778, 780, 5, 84, 43, 2, 779, 777, 3, 2, 2, 2, 780, 783, 3, 2, 2, 2, 781, 779, 3, 2, 2, 2, 781, 782, 3, 2, 2, 2, 782, 81, 3, 2, 2, 2, 783, 781, 3, 2, 2, 2, 784, 789, 5, 84, 43, 2, 785, 786, 5, 80, 41, 2, 786, 787, 8, 42, 1, 2, 787, 789, 3, 2, 2, 2, 788, 784, 3, 2, 2, 2, 788, 785, 3, 2, 2, 2, 789, 83, 3, 2, 2, 2, 790, 791, 9, 9, 2, 2, 791, 85, 3, 2, 2, 2, 87, 89, 96, 105, 113, 138, 148, 151, 156, 171, 178, 182, 185, 199, 208, 213, 216, 223, 231, 237, 242, 253, 261, 267, 271, 273, 284, 286, 301, 309, 324, 332, 334, 351, 354, 357, 380, 384, 390, 402, 417, 422, 424, 440, 446, 450, 459, 477, 481, 492, 496, 508, 512, 523, 527, 535, 545, 549, 559, 563, 573, 576, 579, 604, 643, 646, 653, 655, 662, 669, 676, 685, 688, 699, 703, 715, 722, 731, 740, 746, 753, 762, 766, 770, 781, 788] \ No newline at end of file diff --git a/quint/src/generated/Quint.tokens b/quint/src/generated/Quint.tokens index a3529881a..c8362598c 100644 --- a/quint/src/generated/Quint.tokens +++ b/quint/src/generated/Quint.tokens @@ -44,24 +44,24 @@ AND=43 OR=44 IFF=45 IMPLIES=46 -SET=47 -LIST=48 -MAP=49 -MATCH=50 -PLUS=51 -MINUS=52 -MUL=53 -DIV=54 -MOD=55 -GT=56 -LT=57 -GE=58 -LE=59 -NE=60 -EQ=61 -ASGN=62 -LPAREN=63 -RPAREN=64 +MAP=47 +MATCH=48 +PLUS=49 +MINUS=50 +MUL=51 +DIV=52 +MOD=53 +GT=54 +LT=55 +GE=56 +LE=57 +NE=58 +EQ=59 +ASGN=60 +LPAREN=61 +RPAREN=62 +SET=63 +LIST=64 LOW_ID=65 CAP_ID=66 DOCCOMMENT=67 @@ -78,23 +78,23 @@ WS=70 ','=8 ';'=9 'type'=10 -'|'=11 -'nondet'=12 -'val'=13 -'def'=14 -'pure'=15 -'action'=16 -'run'=17 -'temporal'=18 -'import'=19 -'.'=20 -'from'=21 -'as'=22 -'export'=23 -'->'=24 -'=>'=25 -'['=26 -']'=27 +'['=11 +']'=12 +'|'=13 +'nondet'=14 +'val'=15 +'def'=16 +'pure'=17 +'action'=18 +'run'=19 +'temporal'=20 +'import'=21 +'.'=22 +'from'=23 +'as'=24 +'export'=25 +'->'=26 +'=>'=27 'int'=28 'str'=29 'bool'=30 @@ -111,21 +111,21 @@ WS=70 'or'=44 'iff'=45 'implies'=46 -'Set'=47 -'List'=48 -'Map'=49 -'match'=50 -'+'=51 -'-'=52 -'*'=53 -'/'=54 -'%'=55 -'>'=56 -'<'=57 -'>='=58 -'<='=59 -'!='=60 -'=='=61 -'='=62 -'('=63 -')'=64 +'Map'=47 +'match'=48 +'+'=49 +'-'=50 +'*'=51 +'/'=52 +'%'=53 +'>'=54 +'<'=55 +'>='=56 +'<='=57 +'!='=58 +'=='=59 +'='=60 +'('=61 +')'=62 +'Set'=63 +'List'=64 diff --git a/quint/src/generated/QuintLexer.interp b/quint/src/generated/QuintLexer.interp index e66950a16..b90ce839c 100644 --- a/quint/src/generated/QuintLexer.interp +++ b/quint/src/generated/QuintLexer.interp @@ -10,6 +10,8 @@ null ',' ';' 'type' +'[' +']' '|' 'nondet' 'val' @@ -25,8 +27,6 @@ null 'export' '->' '=>' -'[' -']' 'int' 'str' 'bool' @@ -46,8 +46,6 @@ null 'or' 'iff' 'implies' -'Set' -'List' 'Map' 'match' '+' @@ -64,6 +62,8 @@ null '=' '(' ')' +'Set' +'List' null null null @@ -119,8 +119,6 @@ AND OR IFF IMPLIES -SET -LIST MAP MATCH PLUS @@ -137,6 +135,8 @@ EQ ASGN LPAREN RPAREN +SET +LIST LOW_ID CAP_ID DOCCOMMENT @@ -191,8 +191,6 @@ AND OR IFF IMPLIES -SET -LIST MAP MATCH PLUS @@ -209,6 +207,8 @@ EQ ASGN LPAREN RPAREN +SET +LIST LOW_ID CAP_ID DOCCOMMENT @@ -224,4 +224,4 @@ mode names: DEFAULT_MODE atn: -[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 2, 72, 490, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 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, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 41, 3, 41, 7, 41, 303, 10, 41, 12, 41, 14, 41, 306, 11, 41, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 319, 10, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 7, 43, 326, 10, 43, 12, 43, 14, 43, 329, 11, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 7, 43, 338, 10, 43, 12, 43, 14, 43, 341, 11, 43, 5, 43, 343, 10, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 46, 3, 46, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 53, 3, 53, 3, 54, 3, 54, 3, 55, 3, 55, 3, 56, 3, 56, 3, 57, 3, 57, 3, 58, 3, 58, 3, 59, 3, 59, 3, 59, 3, 60, 3, 60, 3, 60, 3, 61, 3, 61, 3, 61, 3, 62, 3, 62, 3, 62, 3, 63, 3, 63, 3, 64, 3, 64, 3, 65, 3, 65, 3, 66, 3, 66, 7, 66, 417, 10, 66, 12, 66, 14, 66, 420, 11, 66, 3, 66, 3, 66, 6, 66, 424, 10, 66, 13, 66, 14, 66, 425, 5, 66, 428, 10, 66, 3, 67, 3, 67, 7, 67, 432, 10, 67, 12, 67, 14, 67, 435, 11, 67, 3, 67, 3, 67, 6, 67, 439, 10, 67, 13, 67, 14, 67, 440, 5, 67, 443, 10, 67, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 7, 68, 450, 10, 68, 12, 68, 14, 68, 453, 11, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 69, 7, 69, 461, 10, 69, 12, 69, 14, 69, 464, 11, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 70, 3, 70, 3, 70, 3, 70, 7, 70, 474, 10, 70, 12, 70, 14, 70, 477, 11, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 71, 6, 71, 485, 10, 71, 13, 71, 14, 71, 486, 3, 71, 3, 71, 6, 304, 451, 462, 475, 2, 2, 72, 3, 2, 3, 5, 2, 4, 7, 2, 5, 9, 2, 6, 11, 2, 7, 13, 2, 8, 15, 2, 9, 17, 2, 10, 19, 2, 11, 21, 2, 12, 23, 2, 13, 25, 2, 14, 27, 2, 15, 29, 2, 16, 31, 2, 17, 33, 2, 18, 35, 2, 19, 37, 2, 20, 39, 2, 21, 41, 2, 22, 43, 2, 23, 45, 2, 24, 47, 2, 25, 49, 2, 26, 51, 2, 27, 53, 2, 28, 55, 2, 29, 57, 2, 30, 59, 2, 31, 61, 2, 32, 63, 2, 33, 65, 2, 34, 67, 2, 35, 69, 2, 36, 71, 2, 37, 73, 2, 38, 75, 2, 39, 77, 2, 40, 79, 2, 41, 81, 2, 42, 83, 2, 43, 85, 2, 44, 87, 2, 45, 89, 2, 46, 91, 2, 47, 93, 2, 48, 95, 2, 49, 97, 2, 50, 99, 2, 51, 101, 2, 52, 103, 2, 53, 105, 2, 54, 107, 2, 55, 109, 2, 56, 111, 2, 57, 113, 2, 58, 115, 2, 59, 117, 2, 60, 119, 2, 61, 121, 2, 62, 123, 2, 63, 125, 2, 64, 127, 2, 65, 129, 2, 66, 131, 2, 67, 133, 2, 68, 135, 2, 69, 137, 2, 70, 139, 2, 71, 141, 2, 72, 3, 2, 10, 3, 2, 51, 59, 3, 2, 50, 59, 5, 2, 50, 59, 67, 72, 99, 104, 3, 2, 99, 124, 6, 2, 50, 59, 67, 92, 97, 97, 99, 124, 3, 2, 97, 97, 3, 2, 67, 92, 5, 2, 11, 12, 15, 15, 34, 34, 2, 507, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 61, 3, 2, 2, 2, 2, 63, 3, 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, 67, 3, 2, 2, 2, 2, 69, 3, 2, 2, 2, 2, 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 77, 3, 2, 2, 2, 2, 79, 3, 2, 2, 2, 2, 81, 3, 2, 2, 2, 2, 83, 3, 2, 2, 2, 2, 85, 3, 2, 2, 2, 2, 87, 3, 2, 2, 2, 2, 89, 3, 2, 2, 2, 2, 91, 3, 2, 2, 2, 2, 93, 3, 2, 2, 2, 2, 95, 3, 2, 2, 2, 2, 97, 3, 2, 2, 2, 2, 99, 3, 2, 2, 2, 2, 101, 3, 2, 2, 2, 2, 103, 3, 2, 2, 2, 2, 105, 3, 2, 2, 2, 2, 107, 3, 2, 2, 2, 2, 109, 3, 2, 2, 2, 2, 111, 3, 2, 2, 2, 2, 113, 3, 2, 2, 2, 2, 115, 3, 2, 2, 2, 2, 117, 3, 2, 2, 2, 2, 119, 3, 2, 2, 2, 2, 121, 3, 2, 2, 2, 2, 123, 3, 2, 2, 2, 2, 125, 3, 2, 2, 2, 2, 127, 3, 2, 2, 2, 2, 129, 3, 2, 2, 2, 2, 131, 3, 2, 2, 2, 2, 133, 3, 2, 2, 2, 2, 135, 3, 2, 2, 2, 2, 137, 3, 2, 2, 2, 2, 139, 3, 2, 2, 2, 2, 141, 3, 2, 2, 2, 3, 143, 3, 2, 2, 2, 5, 150, 3, 2, 2, 2, 7, 152, 3, 2, 2, 2, 9, 154, 3, 2, 2, 2, 11, 160, 3, 2, 2, 2, 13, 162, 3, 2, 2, 2, 15, 166, 3, 2, 2, 2, 17, 173, 3, 2, 2, 2, 19, 175, 3, 2, 2, 2, 21, 177, 3, 2, 2, 2, 23, 182, 3, 2, 2, 2, 25, 184, 3, 2, 2, 2, 27, 191, 3, 2, 2, 2, 29, 195, 3, 2, 2, 2, 31, 199, 3, 2, 2, 2, 33, 204, 3, 2, 2, 2, 35, 211, 3, 2, 2, 2, 37, 215, 3, 2, 2, 2, 39, 224, 3, 2, 2, 2, 41, 231, 3, 2, 2, 2, 43, 233, 3, 2, 2, 2, 45, 238, 3, 2, 2, 2, 47, 241, 3, 2, 2, 2, 49, 248, 3, 2, 2, 2, 51, 251, 3, 2, 2, 2, 53, 254, 3, 2, 2, 2, 55, 256, 3, 2, 2, 2, 57, 258, 3, 2, 2, 2, 59, 262, 3, 2, 2, 2, 61, 266, 3, 2, 2, 2, 63, 271, 3, 2, 2, 2, 65, 273, 3, 2, 2, 2, 67, 275, 3, 2, 2, 2, 69, 279, 3, 2, 2, 2, 71, 283, 3, 2, 2, 2, 73, 286, 3, 2, 2, 2, 75, 291, 3, 2, 2, 2, 77, 293, 3, 2, 2, 2, 79, 297, 3, 2, 2, 2, 81, 300, 3, 2, 2, 2, 83, 318, 3, 2, 2, 2, 85, 342, 3, 2, 2, 2, 87, 344, 3, 2, 2, 2, 89, 348, 3, 2, 2, 2, 91, 351, 3, 2, 2, 2, 93, 355, 3, 2, 2, 2, 95, 363, 3, 2, 2, 2, 97, 367, 3, 2, 2, 2, 99, 372, 3, 2, 2, 2, 101, 376, 3, 2, 2, 2, 103, 382, 3, 2, 2, 2, 105, 384, 3, 2, 2, 2, 107, 386, 3, 2, 2, 2, 109, 388, 3, 2, 2, 2, 111, 390, 3, 2, 2, 2, 113, 392, 3, 2, 2, 2, 115, 394, 3, 2, 2, 2, 117, 396, 3, 2, 2, 2, 119, 399, 3, 2, 2, 2, 121, 402, 3, 2, 2, 2, 123, 405, 3, 2, 2, 2, 125, 408, 3, 2, 2, 2, 127, 410, 3, 2, 2, 2, 129, 412, 3, 2, 2, 2, 131, 427, 3, 2, 2, 2, 133, 442, 3, 2, 2, 2, 135, 444, 3, 2, 2, 2, 137, 456, 3, 2, 2, 2, 139, 469, 3, 2, 2, 2, 141, 484, 3, 2, 2, 2, 143, 144, 7, 111, 2, 2, 144, 145, 7, 113, 2, 2, 145, 146, 7, 102, 2, 2, 146, 147, 7, 119, 2, 2, 147, 148, 7, 110, 2, 2, 148, 149, 7, 103, 2, 2, 149, 4, 3, 2, 2, 2, 150, 151, 7, 125, 2, 2, 151, 6, 3, 2, 2, 2, 152, 153, 7, 127, 2, 2, 153, 8, 3, 2, 2, 2, 154, 155, 7, 101, 2, 2, 155, 156, 7, 113, 2, 2, 156, 157, 7, 112, 2, 2, 157, 158, 7, 117, 2, 2, 158, 159, 7, 118, 2, 2, 159, 10, 3, 2, 2, 2, 160, 161, 7, 60, 2, 2, 161, 12, 3, 2, 2, 2, 162, 163, 7, 120, 2, 2, 163, 164, 7, 99, 2, 2, 164, 165, 7, 116, 2, 2, 165, 14, 3, 2, 2, 2, 166, 167, 7, 99, 2, 2, 167, 168, 7, 117, 2, 2, 168, 169, 7, 117, 2, 2, 169, 170, 7, 119, 2, 2, 170, 171, 7, 111, 2, 2, 171, 172, 7, 103, 2, 2, 172, 16, 3, 2, 2, 2, 173, 174, 7, 46, 2, 2, 174, 18, 3, 2, 2, 2, 175, 176, 7, 61, 2, 2, 176, 20, 3, 2, 2, 2, 177, 178, 7, 118, 2, 2, 178, 179, 7, 123, 2, 2, 179, 180, 7, 114, 2, 2, 180, 181, 7, 103, 2, 2, 181, 22, 3, 2, 2, 2, 182, 183, 7, 126, 2, 2, 183, 24, 3, 2, 2, 2, 184, 185, 7, 112, 2, 2, 185, 186, 7, 113, 2, 2, 186, 187, 7, 112, 2, 2, 187, 188, 7, 102, 2, 2, 188, 189, 7, 103, 2, 2, 189, 190, 7, 118, 2, 2, 190, 26, 3, 2, 2, 2, 191, 192, 7, 120, 2, 2, 192, 193, 7, 99, 2, 2, 193, 194, 7, 110, 2, 2, 194, 28, 3, 2, 2, 2, 195, 196, 7, 102, 2, 2, 196, 197, 7, 103, 2, 2, 197, 198, 7, 104, 2, 2, 198, 30, 3, 2, 2, 2, 199, 200, 7, 114, 2, 2, 200, 201, 7, 119, 2, 2, 201, 202, 7, 116, 2, 2, 202, 203, 7, 103, 2, 2, 203, 32, 3, 2, 2, 2, 204, 205, 7, 99, 2, 2, 205, 206, 7, 101, 2, 2, 206, 207, 7, 118, 2, 2, 207, 208, 7, 107, 2, 2, 208, 209, 7, 113, 2, 2, 209, 210, 7, 112, 2, 2, 210, 34, 3, 2, 2, 2, 211, 212, 7, 116, 2, 2, 212, 213, 7, 119, 2, 2, 213, 214, 7, 112, 2, 2, 214, 36, 3, 2, 2, 2, 215, 216, 7, 118, 2, 2, 216, 217, 7, 103, 2, 2, 217, 218, 7, 111, 2, 2, 218, 219, 7, 114, 2, 2, 219, 220, 7, 113, 2, 2, 220, 221, 7, 116, 2, 2, 221, 222, 7, 99, 2, 2, 222, 223, 7, 110, 2, 2, 223, 38, 3, 2, 2, 2, 224, 225, 7, 107, 2, 2, 225, 226, 7, 111, 2, 2, 226, 227, 7, 114, 2, 2, 227, 228, 7, 113, 2, 2, 228, 229, 7, 116, 2, 2, 229, 230, 7, 118, 2, 2, 230, 40, 3, 2, 2, 2, 231, 232, 7, 48, 2, 2, 232, 42, 3, 2, 2, 2, 233, 234, 7, 104, 2, 2, 234, 235, 7, 116, 2, 2, 235, 236, 7, 113, 2, 2, 236, 237, 7, 111, 2, 2, 237, 44, 3, 2, 2, 2, 238, 239, 7, 99, 2, 2, 239, 240, 7, 117, 2, 2, 240, 46, 3, 2, 2, 2, 241, 242, 7, 103, 2, 2, 242, 243, 7, 122, 2, 2, 243, 244, 7, 114, 2, 2, 244, 245, 7, 113, 2, 2, 245, 246, 7, 116, 2, 2, 246, 247, 7, 118, 2, 2, 247, 48, 3, 2, 2, 2, 248, 249, 7, 47, 2, 2, 249, 250, 7, 64, 2, 2, 250, 50, 3, 2, 2, 2, 251, 252, 7, 63, 2, 2, 252, 253, 7, 64, 2, 2, 253, 52, 3, 2, 2, 2, 254, 255, 7, 93, 2, 2, 255, 54, 3, 2, 2, 2, 256, 257, 7, 95, 2, 2, 257, 56, 3, 2, 2, 2, 258, 259, 7, 107, 2, 2, 259, 260, 7, 112, 2, 2, 260, 261, 7, 118, 2, 2, 261, 58, 3, 2, 2, 2, 262, 263, 7, 117, 2, 2, 263, 264, 7, 118, 2, 2, 264, 265, 7, 116, 2, 2, 265, 60, 3, 2, 2, 2, 266, 267, 7, 100, 2, 2, 267, 268, 7, 113, 2, 2, 268, 269, 7, 113, 2, 2, 269, 270, 7, 110, 2, 2, 270, 62, 3, 2, 2, 2, 271, 272, 7, 96, 2, 2, 272, 64, 3, 2, 2, 2, 273, 274, 7, 41, 2, 2, 274, 66, 3, 2, 2, 2, 275, 276, 7, 99, 2, 2, 276, 277, 7, 110, 2, 2, 277, 278, 7, 110, 2, 2, 278, 68, 3, 2, 2, 2, 279, 280, 7, 99, 2, 2, 280, 281, 7, 112, 2, 2, 281, 282, 7, 123, 2, 2, 282, 70, 3, 2, 2, 2, 283, 284, 7, 107, 2, 2, 284, 285, 7, 104, 2, 2, 285, 72, 3, 2, 2, 2, 286, 287, 7, 103, 2, 2, 287, 288, 7, 110, 2, 2, 288, 289, 7, 117, 2, 2, 289, 290, 7, 103, 2, 2, 290, 74, 3, 2, 2, 2, 291, 292, 7, 97, 2, 2, 292, 76, 3, 2, 2, 2, 293, 294, 7, 48, 2, 2, 294, 295, 7, 48, 2, 2, 295, 296, 7, 48, 2, 2, 296, 78, 3, 2, 2, 2, 297, 298, 7, 60, 2, 2, 298, 299, 7, 60, 2, 2, 299, 80, 3, 2, 2, 2, 300, 304, 7, 36, 2, 2, 301, 303, 11, 2, 2, 2, 302, 301, 3, 2, 2, 2, 303, 306, 3, 2, 2, 2, 304, 305, 3, 2, 2, 2, 304, 302, 3, 2, 2, 2, 305, 307, 3, 2, 2, 2, 306, 304, 3, 2, 2, 2, 307, 308, 7, 36, 2, 2, 308, 82, 3, 2, 2, 2, 309, 310, 7, 104, 2, 2, 310, 311, 7, 99, 2, 2, 311, 312, 7, 110, 2, 2, 312, 313, 7, 117, 2, 2, 313, 319, 7, 103, 2, 2, 314, 315, 7, 118, 2, 2, 315, 316, 7, 116, 2, 2, 316, 317, 7, 119, 2, 2, 317, 319, 7, 103, 2, 2, 318, 309, 3, 2, 2, 2, 318, 314, 3, 2, 2, 2, 319, 84, 3, 2, 2, 2, 320, 343, 7, 50, 2, 2, 321, 327, 9, 2, 2, 2, 322, 326, 9, 3, 2, 2, 323, 324, 7, 97, 2, 2, 324, 326, 9, 3, 2, 2, 325, 322, 3, 2, 2, 2, 325, 323, 3, 2, 2, 2, 326, 329, 3, 2, 2, 2, 327, 325, 3, 2, 2, 2, 327, 328, 3, 2, 2, 2, 328, 343, 3, 2, 2, 2, 329, 327, 3, 2, 2, 2, 330, 331, 7, 50, 2, 2, 331, 332, 7, 122, 2, 2, 332, 333, 3, 2, 2, 2, 333, 339, 9, 4, 2, 2, 334, 338, 9, 4, 2, 2, 335, 336, 7, 97, 2, 2, 336, 338, 9, 4, 2, 2, 337, 334, 3, 2, 2, 2, 337, 335, 3, 2, 2, 2, 338, 341, 3, 2, 2, 2, 339, 337, 3, 2, 2, 2, 339, 340, 3, 2, 2, 2, 340, 343, 3, 2, 2, 2, 341, 339, 3, 2, 2, 2, 342, 320, 3, 2, 2, 2, 342, 321, 3, 2, 2, 2, 342, 330, 3, 2, 2, 2, 343, 86, 3, 2, 2, 2, 344, 345, 7, 99, 2, 2, 345, 346, 7, 112, 2, 2, 346, 347, 7, 102, 2, 2, 347, 88, 3, 2, 2, 2, 348, 349, 7, 113, 2, 2, 349, 350, 7, 116, 2, 2, 350, 90, 3, 2, 2, 2, 351, 352, 7, 107, 2, 2, 352, 353, 7, 104, 2, 2, 353, 354, 7, 104, 2, 2, 354, 92, 3, 2, 2, 2, 355, 356, 7, 107, 2, 2, 356, 357, 7, 111, 2, 2, 357, 358, 7, 114, 2, 2, 358, 359, 7, 110, 2, 2, 359, 360, 7, 107, 2, 2, 360, 361, 7, 103, 2, 2, 361, 362, 7, 117, 2, 2, 362, 94, 3, 2, 2, 2, 363, 364, 7, 85, 2, 2, 364, 365, 7, 103, 2, 2, 365, 366, 7, 118, 2, 2, 366, 96, 3, 2, 2, 2, 367, 368, 7, 78, 2, 2, 368, 369, 7, 107, 2, 2, 369, 370, 7, 117, 2, 2, 370, 371, 7, 118, 2, 2, 371, 98, 3, 2, 2, 2, 372, 373, 7, 79, 2, 2, 373, 374, 7, 99, 2, 2, 374, 375, 7, 114, 2, 2, 375, 100, 3, 2, 2, 2, 376, 377, 7, 111, 2, 2, 377, 378, 7, 99, 2, 2, 378, 379, 7, 118, 2, 2, 379, 380, 7, 101, 2, 2, 380, 381, 7, 106, 2, 2, 381, 102, 3, 2, 2, 2, 382, 383, 7, 45, 2, 2, 383, 104, 3, 2, 2, 2, 384, 385, 7, 47, 2, 2, 385, 106, 3, 2, 2, 2, 386, 387, 7, 44, 2, 2, 387, 108, 3, 2, 2, 2, 388, 389, 7, 49, 2, 2, 389, 110, 3, 2, 2, 2, 390, 391, 7, 39, 2, 2, 391, 112, 3, 2, 2, 2, 392, 393, 7, 64, 2, 2, 393, 114, 3, 2, 2, 2, 394, 395, 7, 62, 2, 2, 395, 116, 3, 2, 2, 2, 396, 397, 7, 64, 2, 2, 397, 398, 7, 63, 2, 2, 398, 118, 3, 2, 2, 2, 399, 400, 7, 62, 2, 2, 400, 401, 7, 63, 2, 2, 401, 120, 3, 2, 2, 2, 402, 403, 7, 35, 2, 2, 403, 404, 7, 63, 2, 2, 404, 122, 3, 2, 2, 2, 405, 406, 7, 63, 2, 2, 406, 407, 7, 63, 2, 2, 407, 124, 3, 2, 2, 2, 408, 409, 7, 63, 2, 2, 409, 126, 3, 2, 2, 2, 410, 411, 7, 42, 2, 2, 411, 128, 3, 2, 2, 2, 412, 413, 7, 43, 2, 2, 413, 130, 3, 2, 2, 2, 414, 418, 9, 5, 2, 2, 415, 417, 9, 6, 2, 2, 416, 415, 3, 2, 2, 2, 417, 420, 3, 2, 2, 2, 418, 416, 3, 2, 2, 2, 418, 419, 3, 2, 2, 2, 419, 428, 3, 2, 2, 2, 420, 418, 3, 2, 2, 2, 421, 423, 9, 7, 2, 2, 422, 424, 9, 6, 2, 2, 423, 422, 3, 2, 2, 2, 424, 425, 3, 2, 2, 2, 425, 423, 3, 2, 2, 2, 425, 426, 3, 2, 2, 2, 426, 428, 3, 2, 2, 2, 427, 414, 3, 2, 2, 2, 427, 421, 3, 2, 2, 2, 428, 132, 3, 2, 2, 2, 429, 433, 9, 8, 2, 2, 430, 432, 9, 6, 2, 2, 431, 430, 3, 2, 2, 2, 432, 435, 3, 2, 2, 2, 433, 431, 3, 2, 2, 2, 433, 434, 3, 2, 2, 2, 434, 443, 3, 2, 2, 2, 435, 433, 3, 2, 2, 2, 436, 438, 9, 7, 2, 2, 437, 439, 9, 6, 2, 2, 438, 437, 3, 2, 2, 2, 439, 440, 3, 2, 2, 2, 440, 438, 3, 2, 2, 2, 440, 441, 3, 2, 2, 2, 441, 443, 3, 2, 2, 2, 442, 429, 3, 2, 2, 2, 442, 436, 3, 2, 2, 2, 443, 134, 3, 2, 2, 2, 444, 445, 7, 49, 2, 2, 445, 446, 7, 49, 2, 2, 446, 447, 7, 49, 2, 2, 447, 451, 3, 2, 2, 2, 448, 450, 11, 2, 2, 2, 449, 448, 3, 2, 2, 2, 450, 453, 3, 2, 2, 2, 451, 452, 3, 2, 2, 2, 451, 449, 3, 2, 2, 2, 452, 454, 3, 2, 2, 2, 453, 451, 3, 2, 2, 2, 454, 455, 7, 12, 2, 2, 455, 136, 3, 2, 2, 2, 456, 457, 7, 49, 2, 2, 457, 458, 7, 49, 2, 2, 458, 462, 3, 2, 2, 2, 459, 461, 11, 2, 2, 2, 460, 459, 3, 2, 2, 2, 461, 464, 3, 2, 2, 2, 462, 463, 3, 2, 2, 2, 462, 460, 3, 2, 2, 2, 463, 465, 3, 2, 2, 2, 464, 462, 3, 2, 2, 2, 465, 466, 7, 12, 2, 2, 466, 467, 3, 2, 2, 2, 467, 468, 8, 69, 2, 2, 468, 138, 3, 2, 2, 2, 469, 470, 7, 49, 2, 2, 470, 471, 7, 44, 2, 2, 471, 475, 3, 2, 2, 2, 472, 474, 11, 2, 2, 2, 473, 472, 3, 2, 2, 2, 474, 477, 3, 2, 2, 2, 475, 476, 3, 2, 2, 2, 475, 473, 3, 2, 2, 2, 476, 478, 3, 2, 2, 2, 477, 475, 3, 2, 2, 2, 478, 479, 7, 44, 2, 2, 479, 480, 7, 49, 2, 2, 480, 481, 3, 2, 2, 2, 481, 482, 8, 70, 2, 2, 482, 140, 3, 2, 2, 2, 483, 485, 9, 9, 2, 2, 484, 483, 3, 2, 2, 2, 485, 486, 3, 2, 2, 2, 486, 484, 3, 2, 2, 2, 486, 487, 3, 2, 2, 2, 487, 488, 3, 2, 2, 2, 488, 489, 8, 71, 2, 2, 489, 142, 3, 2, 2, 2, 20, 2, 304, 318, 325, 327, 337, 339, 342, 418, 425, 427, 433, 440, 442, 451, 462, 475, 486, 3, 8, 2, 2] \ No newline at end of file +[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 2, 72, 490, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 13, 3, 13, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 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, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 41, 3, 41, 7, 41, 303, 10, 41, 12, 41, 14, 41, 306, 11, 41, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 319, 10, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 7, 43, 326, 10, 43, 12, 43, 14, 43, 329, 11, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 7, 43, 338, 10, 43, 12, 43, 14, 43, 341, 11, 43, 5, 43, 343, 10, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 46, 3, 46, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 50, 3, 50, 3, 51, 3, 51, 3, 52, 3, 52, 3, 53, 3, 53, 3, 54, 3, 54, 3, 55, 3, 55, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 58, 3, 58, 3, 58, 3, 59, 3, 59, 3, 59, 3, 60, 3, 60, 3, 60, 3, 61, 3, 61, 3, 62, 3, 62, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 7, 66, 417, 10, 66, 12, 66, 14, 66, 420, 11, 66, 3, 66, 3, 66, 6, 66, 424, 10, 66, 13, 66, 14, 66, 425, 5, 66, 428, 10, 66, 3, 67, 3, 67, 7, 67, 432, 10, 67, 12, 67, 14, 67, 435, 11, 67, 3, 67, 3, 67, 6, 67, 439, 10, 67, 13, 67, 14, 67, 440, 5, 67, 443, 10, 67, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 7, 68, 450, 10, 68, 12, 68, 14, 68, 453, 11, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 69, 7, 69, 461, 10, 69, 12, 69, 14, 69, 464, 11, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 70, 3, 70, 3, 70, 3, 70, 7, 70, 474, 10, 70, 12, 70, 14, 70, 477, 11, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 71, 6, 71, 485, 10, 71, 13, 71, 14, 71, 486, 3, 71, 3, 71, 6, 304, 451, 462, 475, 2, 2, 72, 3, 2, 3, 5, 2, 4, 7, 2, 5, 9, 2, 6, 11, 2, 7, 13, 2, 8, 15, 2, 9, 17, 2, 10, 19, 2, 11, 21, 2, 12, 23, 2, 13, 25, 2, 14, 27, 2, 15, 29, 2, 16, 31, 2, 17, 33, 2, 18, 35, 2, 19, 37, 2, 20, 39, 2, 21, 41, 2, 22, 43, 2, 23, 45, 2, 24, 47, 2, 25, 49, 2, 26, 51, 2, 27, 53, 2, 28, 55, 2, 29, 57, 2, 30, 59, 2, 31, 61, 2, 32, 63, 2, 33, 65, 2, 34, 67, 2, 35, 69, 2, 36, 71, 2, 37, 73, 2, 38, 75, 2, 39, 77, 2, 40, 79, 2, 41, 81, 2, 42, 83, 2, 43, 85, 2, 44, 87, 2, 45, 89, 2, 46, 91, 2, 47, 93, 2, 48, 95, 2, 49, 97, 2, 50, 99, 2, 51, 101, 2, 52, 103, 2, 53, 105, 2, 54, 107, 2, 55, 109, 2, 56, 111, 2, 57, 113, 2, 58, 115, 2, 59, 117, 2, 60, 119, 2, 61, 121, 2, 62, 123, 2, 63, 125, 2, 64, 127, 2, 65, 129, 2, 66, 131, 2, 67, 133, 2, 68, 135, 2, 69, 137, 2, 70, 139, 2, 71, 141, 2, 72, 3, 2, 10, 3, 2, 51, 59, 3, 2, 50, 59, 5, 2, 50, 59, 67, 72, 99, 104, 3, 2, 99, 124, 6, 2, 50, 59, 67, 92, 97, 97, 99, 124, 3, 2, 97, 97, 3, 2, 67, 92, 5, 2, 11, 12, 15, 15, 34, 34, 2, 507, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 61, 3, 2, 2, 2, 2, 63, 3, 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, 67, 3, 2, 2, 2, 2, 69, 3, 2, 2, 2, 2, 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 77, 3, 2, 2, 2, 2, 79, 3, 2, 2, 2, 2, 81, 3, 2, 2, 2, 2, 83, 3, 2, 2, 2, 2, 85, 3, 2, 2, 2, 2, 87, 3, 2, 2, 2, 2, 89, 3, 2, 2, 2, 2, 91, 3, 2, 2, 2, 2, 93, 3, 2, 2, 2, 2, 95, 3, 2, 2, 2, 2, 97, 3, 2, 2, 2, 2, 99, 3, 2, 2, 2, 2, 101, 3, 2, 2, 2, 2, 103, 3, 2, 2, 2, 2, 105, 3, 2, 2, 2, 2, 107, 3, 2, 2, 2, 2, 109, 3, 2, 2, 2, 2, 111, 3, 2, 2, 2, 2, 113, 3, 2, 2, 2, 2, 115, 3, 2, 2, 2, 2, 117, 3, 2, 2, 2, 2, 119, 3, 2, 2, 2, 2, 121, 3, 2, 2, 2, 2, 123, 3, 2, 2, 2, 2, 125, 3, 2, 2, 2, 2, 127, 3, 2, 2, 2, 2, 129, 3, 2, 2, 2, 2, 131, 3, 2, 2, 2, 2, 133, 3, 2, 2, 2, 2, 135, 3, 2, 2, 2, 2, 137, 3, 2, 2, 2, 2, 139, 3, 2, 2, 2, 2, 141, 3, 2, 2, 2, 3, 143, 3, 2, 2, 2, 5, 150, 3, 2, 2, 2, 7, 152, 3, 2, 2, 2, 9, 154, 3, 2, 2, 2, 11, 160, 3, 2, 2, 2, 13, 162, 3, 2, 2, 2, 15, 166, 3, 2, 2, 2, 17, 173, 3, 2, 2, 2, 19, 175, 3, 2, 2, 2, 21, 177, 3, 2, 2, 2, 23, 182, 3, 2, 2, 2, 25, 184, 3, 2, 2, 2, 27, 186, 3, 2, 2, 2, 29, 188, 3, 2, 2, 2, 31, 195, 3, 2, 2, 2, 33, 199, 3, 2, 2, 2, 35, 203, 3, 2, 2, 2, 37, 208, 3, 2, 2, 2, 39, 215, 3, 2, 2, 2, 41, 219, 3, 2, 2, 2, 43, 228, 3, 2, 2, 2, 45, 235, 3, 2, 2, 2, 47, 237, 3, 2, 2, 2, 49, 242, 3, 2, 2, 2, 51, 245, 3, 2, 2, 2, 53, 252, 3, 2, 2, 2, 55, 255, 3, 2, 2, 2, 57, 258, 3, 2, 2, 2, 59, 262, 3, 2, 2, 2, 61, 266, 3, 2, 2, 2, 63, 271, 3, 2, 2, 2, 65, 273, 3, 2, 2, 2, 67, 275, 3, 2, 2, 2, 69, 279, 3, 2, 2, 2, 71, 283, 3, 2, 2, 2, 73, 286, 3, 2, 2, 2, 75, 291, 3, 2, 2, 2, 77, 293, 3, 2, 2, 2, 79, 297, 3, 2, 2, 2, 81, 300, 3, 2, 2, 2, 83, 318, 3, 2, 2, 2, 85, 342, 3, 2, 2, 2, 87, 344, 3, 2, 2, 2, 89, 348, 3, 2, 2, 2, 91, 351, 3, 2, 2, 2, 93, 355, 3, 2, 2, 2, 95, 363, 3, 2, 2, 2, 97, 367, 3, 2, 2, 2, 99, 373, 3, 2, 2, 2, 101, 375, 3, 2, 2, 2, 103, 377, 3, 2, 2, 2, 105, 379, 3, 2, 2, 2, 107, 381, 3, 2, 2, 2, 109, 383, 3, 2, 2, 2, 111, 385, 3, 2, 2, 2, 113, 387, 3, 2, 2, 2, 115, 390, 3, 2, 2, 2, 117, 393, 3, 2, 2, 2, 119, 396, 3, 2, 2, 2, 121, 399, 3, 2, 2, 2, 123, 401, 3, 2, 2, 2, 125, 403, 3, 2, 2, 2, 127, 405, 3, 2, 2, 2, 129, 409, 3, 2, 2, 2, 131, 427, 3, 2, 2, 2, 133, 442, 3, 2, 2, 2, 135, 444, 3, 2, 2, 2, 137, 456, 3, 2, 2, 2, 139, 469, 3, 2, 2, 2, 141, 484, 3, 2, 2, 2, 143, 144, 7, 111, 2, 2, 144, 145, 7, 113, 2, 2, 145, 146, 7, 102, 2, 2, 146, 147, 7, 119, 2, 2, 147, 148, 7, 110, 2, 2, 148, 149, 7, 103, 2, 2, 149, 4, 3, 2, 2, 2, 150, 151, 7, 125, 2, 2, 151, 6, 3, 2, 2, 2, 152, 153, 7, 127, 2, 2, 153, 8, 3, 2, 2, 2, 154, 155, 7, 101, 2, 2, 155, 156, 7, 113, 2, 2, 156, 157, 7, 112, 2, 2, 157, 158, 7, 117, 2, 2, 158, 159, 7, 118, 2, 2, 159, 10, 3, 2, 2, 2, 160, 161, 7, 60, 2, 2, 161, 12, 3, 2, 2, 2, 162, 163, 7, 120, 2, 2, 163, 164, 7, 99, 2, 2, 164, 165, 7, 116, 2, 2, 165, 14, 3, 2, 2, 2, 166, 167, 7, 99, 2, 2, 167, 168, 7, 117, 2, 2, 168, 169, 7, 117, 2, 2, 169, 170, 7, 119, 2, 2, 170, 171, 7, 111, 2, 2, 171, 172, 7, 103, 2, 2, 172, 16, 3, 2, 2, 2, 173, 174, 7, 46, 2, 2, 174, 18, 3, 2, 2, 2, 175, 176, 7, 61, 2, 2, 176, 20, 3, 2, 2, 2, 177, 178, 7, 118, 2, 2, 178, 179, 7, 123, 2, 2, 179, 180, 7, 114, 2, 2, 180, 181, 7, 103, 2, 2, 181, 22, 3, 2, 2, 2, 182, 183, 7, 93, 2, 2, 183, 24, 3, 2, 2, 2, 184, 185, 7, 95, 2, 2, 185, 26, 3, 2, 2, 2, 186, 187, 7, 126, 2, 2, 187, 28, 3, 2, 2, 2, 188, 189, 7, 112, 2, 2, 189, 190, 7, 113, 2, 2, 190, 191, 7, 112, 2, 2, 191, 192, 7, 102, 2, 2, 192, 193, 7, 103, 2, 2, 193, 194, 7, 118, 2, 2, 194, 30, 3, 2, 2, 2, 195, 196, 7, 120, 2, 2, 196, 197, 7, 99, 2, 2, 197, 198, 7, 110, 2, 2, 198, 32, 3, 2, 2, 2, 199, 200, 7, 102, 2, 2, 200, 201, 7, 103, 2, 2, 201, 202, 7, 104, 2, 2, 202, 34, 3, 2, 2, 2, 203, 204, 7, 114, 2, 2, 204, 205, 7, 119, 2, 2, 205, 206, 7, 116, 2, 2, 206, 207, 7, 103, 2, 2, 207, 36, 3, 2, 2, 2, 208, 209, 7, 99, 2, 2, 209, 210, 7, 101, 2, 2, 210, 211, 7, 118, 2, 2, 211, 212, 7, 107, 2, 2, 212, 213, 7, 113, 2, 2, 213, 214, 7, 112, 2, 2, 214, 38, 3, 2, 2, 2, 215, 216, 7, 116, 2, 2, 216, 217, 7, 119, 2, 2, 217, 218, 7, 112, 2, 2, 218, 40, 3, 2, 2, 2, 219, 220, 7, 118, 2, 2, 220, 221, 7, 103, 2, 2, 221, 222, 7, 111, 2, 2, 222, 223, 7, 114, 2, 2, 223, 224, 7, 113, 2, 2, 224, 225, 7, 116, 2, 2, 225, 226, 7, 99, 2, 2, 226, 227, 7, 110, 2, 2, 227, 42, 3, 2, 2, 2, 228, 229, 7, 107, 2, 2, 229, 230, 7, 111, 2, 2, 230, 231, 7, 114, 2, 2, 231, 232, 7, 113, 2, 2, 232, 233, 7, 116, 2, 2, 233, 234, 7, 118, 2, 2, 234, 44, 3, 2, 2, 2, 235, 236, 7, 48, 2, 2, 236, 46, 3, 2, 2, 2, 237, 238, 7, 104, 2, 2, 238, 239, 7, 116, 2, 2, 239, 240, 7, 113, 2, 2, 240, 241, 7, 111, 2, 2, 241, 48, 3, 2, 2, 2, 242, 243, 7, 99, 2, 2, 243, 244, 7, 117, 2, 2, 244, 50, 3, 2, 2, 2, 245, 246, 7, 103, 2, 2, 246, 247, 7, 122, 2, 2, 247, 248, 7, 114, 2, 2, 248, 249, 7, 113, 2, 2, 249, 250, 7, 116, 2, 2, 250, 251, 7, 118, 2, 2, 251, 52, 3, 2, 2, 2, 252, 253, 7, 47, 2, 2, 253, 254, 7, 64, 2, 2, 254, 54, 3, 2, 2, 2, 255, 256, 7, 63, 2, 2, 256, 257, 7, 64, 2, 2, 257, 56, 3, 2, 2, 2, 258, 259, 7, 107, 2, 2, 259, 260, 7, 112, 2, 2, 260, 261, 7, 118, 2, 2, 261, 58, 3, 2, 2, 2, 262, 263, 7, 117, 2, 2, 263, 264, 7, 118, 2, 2, 264, 265, 7, 116, 2, 2, 265, 60, 3, 2, 2, 2, 266, 267, 7, 100, 2, 2, 267, 268, 7, 113, 2, 2, 268, 269, 7, 113, 2, 2, 269, 270, 7, 110, 2, 2, 270, 62, 3, 2, 2, 2, 271, 272, 7, 96, 2, 2, 272, 64, 3, 2, 2, 2, 273, 274, 7, 41, 2, 2, 274, 66, 3, 2, 2, 2, 275, 276, 7, 99, 2, 2, 276, 277, 7, 110, 2, 2, 277, 278, 7, 110, 2, 2, 278, 68, 3, 2, 2, 2, 279, 280, 7, 99, 2, 2, 280, 281, 7, 112, 2, 2, 281, 282, 7, 123, 2, 2, 282, 70, 3, 2, 2, 2, 283, 284, 7, 107, 2, 2, 284, 285, 7, 104, 2, 2, 285, 72, 3, 2, 2, 2, 286, 287, 7, 103, 2, 2, 287, 288, 7, 110, 2, 2, 288, 289, 7, 117, 2, 2, 289, 290, 7, 103, 2, 2, 290, 74, 3, 2, 2, 2, 291, 292, 7, 97, 2, 2, 292, 76, 3, 2, 2, 2, 293, 294, 7, 48, 2, 2, 294, 295, 7, 48, 2, 2, 295, 296, 7, 48, 2, 2, 296, 78, 3, 2, 2, 2, 297, 298, 7, 60, 2, 2, 298, 299, 7, 60, 2, 2, 299, 80, 3, 2, 2, 2, 300, 304, 7, 36, 2, 2, 301, 303, 11, 2, 2, 2, 302, 301, 3, 2, 2, 2, 303, 306, 3, 2, 2, 2, 304, 305, 3, 2, 2, 2, 304, 302, 3, 2, 2, 2, 305, 307, 3, 2, 2, 2, 306, 304, 3, 2, 2, 2, 307, 308, 7, 36, 2, 2, 308, 82, 3, 2, 2, 2, 309, 310, 7, 104, 2, 2, 310, 311, 7, 99, 2, 2, 311, 312, 7, 110, 2, 2, 312, 313, 7, 117, 2, 2, 313, 319, 7, 103, 2, 2, 314, 315, 7, 118, 2, 2, 315, 316, 7, 116, 2, 2, 316, 317, 7, 119, 2, 2, 317, 319, 7, 103, 2, 2, 318, 309, 3, 2, 2, 2, 318, 314, 3, 2, 2, 2, 319, 84, 3, 2, 2, 2, 320, 343, 7, 50, 2, 2, 321, 327, 9, 2, 2, 2, 322, 326, 9, 3, 2, 2, 323, 324, 7, 97, 2, 2, 324, 326, 9, 3, 2, 2, 325, 322, 3, 2, 2, 2, 325, 323, 3, 2, 2, 2, 326, 329, 3, 2, 2, 2, 327, 325, 3, 2, 2, 2, 327, 328, 3, 2, 2, 2, 328, 343, 3, 2, 2, 2, 329, 327, 3, 2, 2, 2, 330, 331, 7, 50, 2, 2, 331, 332, 7, 122, 2, 2, 332, 333, 3, 2, 2, 2, 333, 339, 9, 4, 2, 2, 334, 338, 9, 4, 2, 2, 335, 336, 7, 97, 2, 2, 336, 338, 9, 4, 2, 2, 337, 334, 3, 2, 2, 2, 337, 335, 3, 2, 2, 2, 338, 341, 3, 2, 2, 2, 339, 337, 3, 2, 2, 2, 339, 340, 3, 2, 2, 2, 340, 343, 3, 2, 2, 2, 341, 339, 3, 2, 2, 2, 342, 320, 3, 2, 2, 2, 342, 321, 3, 2, 2, 2, 342, 330, 3, 2, 2, 2, 343, 86, 3, 2, 2, 2, 344, 345, 7, 99, 2, 2, 345, 346, 7, 112, 2, 2, 346, 347, 7, 102, 2, 2, 347, 88, 3, 2, 2, 2, 348, 349, 7, 113, 2, 2, 349, 350, 7, 116, 2, 2, 350, 90, 3, 2, 2, 2, 351, 352, 7, 107, 2, 2, 352, 353, 7, 104, 2, 2, 353, 354, 7, 104, 2, 2, 354, 92, 3, 2, 2, 2, 355, 356, 7, 107, 2, 2, 356, 357, 7, 111, 2, 2, 357, 358, 7, 114, 2, 2, 358, 359, 7, 110, 2, 2, 359, 360, 7, 107, 2, 2, 360, 361, 7, 103, 2, 2, 361, 362, 7, 117, 2, 2, 362, 94, 3, 2, 2, 2, 363, 364, 7, 79, 2, 2, 364, 365, 7, 99, 2, 2, 365, 366, 7, 114, 2, 2, 366, 96, 3, 2, 2, 2, 367, 368, 7, 111, 2, 2, 368, 369, 7, 99, 2, 2, 369, 370, 7, 118, 2, 2, 370, 371, 7, 101, 2, 2, 371, 372, 7, 106, 2, 2, 372, 98, 3, 2, 2, 2, 373, 374, 7, 45, 2, 2, 374, 100, 3, 2, 2, 2, 375, 376, 7, 47, 2, 2, 376, 102, 3, 2, 2, 2, 377, 378, 7, 44, 2, 2, 378, 104, 3, 2, 2, 2, 379, 380, 7, 49, 2, 2, 380, 106, 3, 2, 2, 2, 381, 382, 7, 39, 2, 2, 382, 108, 3, 2, 2, 2, 383, 384, 7, 64, 2, 2, 384, 110, 3, 2, 2, 2, 385, 386, 7, 62, 2, 2, 386, 112, 3, 2, 2, 2, 387, 388, 7, 64, 2, 2, 388, 389, 7, 63, 2, 2, 389, 114, 3, 2, 2, 2, 390, 391, 7, 62, 2, 2, 391, 392, 7, 63, 2, 2, 392, 116, 3, 2, 2, 2, 393, 394, 7, 35, 2, 2, 394, 395, 7, 63, 2, 2, 395, 118, 3, 2, 2, 2, 396, 397, 7, 63, 2, 2, 397, 398, 7, 63, 2, 2, 398, 120, 3, 2, 2, 2, 399, 400, 7, 63, 2, 2, 400, 122, 3, 2, 2, 2, 401, 402, 7, 42, 2, 2, 402, 124, 3, 2, 2, 2, 403, 404, 7, 43, 2, 2, 404, 126, 3, 2, 2, 2, 405, 406, 7, 85, 2, 2, 406, 407, 7, 103, 2, 2, 407, 408, 7, 118, 2, 2, 408, 128, 3, 2, 2, 2, 409, 410, 7, 78, 2, 2, 410, 411, 7, 107, 2, 2, 411, 412, 7, 117, 2, 2, 412, 413, 7, 118, 2, 2, 413, 130, 3, 2, 2, 2, 414, 418, 9, 5, 2, 2, 415, 417, 9, 6, 2, 2, 416, 415, 3, 2, 2, 2, 417, 420, 3, 2, 2, 2, 418, 416, 3, 2, 2, 2, 418, 419, 3, 2, 2, 2, 419, 428, 3, 2, 2, 2, 420, 418, 3, 2, 2, 2, 421, 423, 9, 7, 2, 2, 422, 424, 9, 6, 2, 2, 423, 422, 3, 2, 2, 2, 424, 425, 3, 2, 2, 2, 425, 423, 3, 2, 2, 2, 425, 426, 3, 2, 2, 2, 426, 428, 3, 2, 2, 2, 427, 414, 3, 2, 2, 2, 427, 421, 3, 2, 2, 2, 428, 132, 3, 2, 2, 2, 429, 433, 9, 8, 2, 2, 430, 432, 9, 6, 2, 2, 431, 430, 3, 2, 2, 2, 432, 435, 3, 2, 2, 2, 433, 431, 3, 2, 2, 2, 433, 434, 3, 2, 2, 2, 434, 443, 3, 2, 2, 2, 435, 433, 3, 2, 2, 2, 436, 438, 9, 7, 2, 2, 437, 439, 9, 6, 2, 2, 438, 437, 3, 2, 2, 2, 439, 440, 3, 2, 2, 2, 440, 438, 3, 2, 2, 2, 440, 441, 3, 2, 2, 2, 441, 443, 3, 2, 2, 2, 442, 429, 3, 2, 2, 2, 442, 436, 3, 2, 2, 2, 443, 134, 3, 2, 2, 2, 444, 445, 7, 49, 2, 2, 445, 446, 7, 49, 2, 2, 446, 447, 7, 49, 2, 2, 447, 451, 3, 2, 2, 2, 448, 450, 11, 2, 2, 2, 449, 448, 3, 2, 2, 2, 450, 453, 3, 2, 2, 2, 451, 452, 3, 2, 2, 2, 451, 449, 3, 2, 2, 2, 452, 454, 3, 2, 2, 2, 453, 451, 3, 2, 2, 2, 454, 455, 7, 12, 2, 2, 455, 136, 3, 2, 2, 2, 456, 457, 7, 49, 2, 2, 457, 458, 7, 49, 2, 2, 458, 462, 3, 2, 2, 2, 459, 461, 11, 2, 2, 2, 460, 459, 3, 2, 2, 2, 461, 464, 3, 2, 2, 2, 462, 463, 3, 2, 2, 2, 462, 460, 3, 2, 2, 2, 463, 465, 3, 2, 2, 2, 464, 462, 3, 2, 2, 2, 465, 466, 7, 12, 2, 2, 466, 467, 3, 2, 2, 2, 467, 468, 8, 69, 2, 2, 468, 138, 3, 2, 2, 2, 469, 470, 7, 49, 2, 2, 470, 471, 7, 44, 2, 2, 471, 475, 3, 2, 2, 2, 472, 474, 11, 2, 2, 2, 473, 472, 3, 2, 2, 2, 474, 477, 3, 2, 2, 2, 475, 476, 3, 2, 2, 2, 475, 473, 3, 2, 2, 2, 476, 478, 3, 2, 2, 2, 477, 475, 3, 2, 2, 2, 478, 479, 7, 44, 2, 2, 479, 480, 7, 49, 2, 2, 480, 481, 3, 2, 2, 2, 481, 482, 8, 70, 2, 2, 482, 140, 3, 2, 2, 2, 483, 485, 9, 9, 2, 2, 484, 483, 3, 2, 2, 2, 485, 486, 3, 2, 2, 2, 486, 484, 3, 2, 2, 2, 486, 487, 3, 2, 2, 2, 487, 488, 3, 2, 2, 2, 488, 489, 8, 71, 2, 2, 489, 142, 3, 2, 2, 2, 20, 2, 304, 318, 325, 327, 337, 339, 342, 418, 425, 427, 433, 440, 442, 451, 462, 475, 486, 3, 8, 2, 2] \ No newline at end of file diff --git a/quint/src/generated/QuintLexer.tokens b/quint/src/generated/QuintLexer.tokens index a3529881a..c8362598c 100644 --- a/quint/src/generated/QuintLexer.tokens +++ b/quint/src/generated/QuintLexer.tokens @@ -44,24 +44,24 @@ AND=43 OR=44 IFF=45 IMPLIES=46 -SET=47 -LIST=48 -MAP=49 -MATCH=50 -PLUS=51 -MINUS=52 -MUL=53 -DIV=54 -MOD=55 -GT=56 -LT=57 -GE=58 -LE=59 -NE=60 -EQ=61 -ASGN=62 -LPAREN=63 -RPAREN=64 +MAP=47 +MATCH=48 +PLUS=49 +MINUS=50 +MUL=51 +DIV=52 +MOD=53 +GT=54 +LT=55 +GE=56 +LE=57 +NE=58 +EQ=59 +ASGN=60 +LPAREN=61 +RPAREN=62 +SET=63 +LIST=64 LOW_ID=65 CAP_ID=66 DOCCOMMENT=67 @@ -78,23 +78,23 @@ WS=70 ','=8 ';'=9 'type'=10 -'|'=11 -'nondet'=12 -'val'=13 -'def'=14 -'pure'=15 -'action'=16 -'run'=17 -'temporal'=18 -'import'=19 -'.'=20 -'from'=21 -'as'=22 -'export'=23 -'->'=24 -'=>'=25 -'['=26 -']'=27 +'['=11 +']'=12 +'|'=13 +'nondet'=14 +'val'=15 +'def'=16 +'pure'=17 +'action'=18 +'run'=19 +'temporal'=20 +'import'=21 +'.'=22 +'from'=23 +'as'=24 +'export'=25 +'->'=26 +'=>'=27 'int'=28 'str'=29 'bool'=30 @@ -111,21 +111,21 @@ WS=70 'or'=44 'iff'=45 'implies'=46 -'Set'=47 -'List'=48 -'Map'=49 -'match'=50 -'+'=51 -'-'=52 -'*'=53 -'/'=54 -'%'=55 -'>'=56 -'<'=57 -'>='=58 -'<='=59 -'!='=60 -'=='=61 -'='=62 -'('=63 -')'=64 +'Map'=47 +'match'=48 +'+'=49 +'-'=50 +'*'=51 +'/'=52 +'%'=53 +'>'=54 +'<'=55 +'>='=56 +'<='=57 +'!='=58 +'=='=59 +'='=60 +'('=61 +')'=62 +'Set'=63 +'List'=64 diff --git a/quint/src/generated/QuintLexer.ts b/quint/src/generated/QuintLexer.ts index a2ccaf0ee..21060e0dd 100644 --- a/quint/src/generated/QuintLexer.ts +++ b/quint/src/generated/QuintLexer.ts @@ -68,24 +68,24 @@ export class QuintLexer extends Lexer { public static readonly OR = 44; public static readonly IFF = 45; public static readonly IMPLIES = 46; - public static readonly SET = 47; - public static readonly LIST = 48; - public static readonly MAP = 49; - public static readonly MATCH = 50; - public static readonly PLUS = 51; - public static readonly MINUS = 52; - public static readonly MUL = 53; - public static readonly DIV = 54; - public static readonly MOD = 55; - public static readonly GT = 56; - public static readonly LT = 57; - public static readonly GE = 58; - public static readonly LE = 59; - public static readonly NE = 60; - public static readonly EQ = 61; - public static readonly ASGN = 62; - public static readonly LPAREN = 63; - public static readonly RPAREN = 64; + public static readonly MAP = 47; + public static readonly MATCH = 48; + public static readonly PLUS = 49; + public static readonly MINUS = 50; + public static readonly MUL = 51; + public static readonly DIV = 52; + public static readonly MOD = 53; + public static readonly GT = 54; + public static readonly LT = 55; + public static readonly GE = 56; + public static readonly LE = 57; + public static readonly NE = 58; + public static readonly EQ = 59; + public static readonly ASGN = 60; + public static readonly LPAREN = 61; + public static readonly RPAREN = 62; + public static readonly SET = 63; + public static readonly LIST = 64; public static readonly LOW_ID = 65; public static readonly CAP_ID = 66; public static readonly DOCCOMMENT = 67; @@ -109,21 +109,21 @@ export class QuintLexer extends Lexer { "T__17", "T__18", "T__19", "T__20", "T__21", "T__22", "T__23", "T__24", "T__25", "T__26", "T__27", "T__28", "T__29", "T__30", "T__31", "T__32", "T__33", "T__34", "T__35", "T__36", "T__37", "T__38", "STRING", "BOOL", - "INT", "AND", "OR", "IFF", "IMPLIES", "SET", "LIST", "MAP", "MATCH", "PLUS", - "MINUS", "MUL", "DIV", "MOD", "GT", "LT", "GE", "LE", "NE", "EQ", "ASGN", - "LPAREN", "RPAREN", "LOW_ID", "CAP_ID", "DOCCOMMENT", "LINE_COMMENT", + "INT", "AND", "OR", "IFF", "IMPLIES", "MAP", "MATCH", "PLUS", "MINUS", + "MUL", "DIV", "MOD", "GT", "LT", "GE", "LE", "NE", "EQ", "ASGN", "LPAREN", + "RPAREN", "SET", "LIST", "LOW_ID", "CAP_ID", "DOCCOMMENT", "LINE_COMMENT", "COMMENT", "WS", ]; private static readonly _LITERAL_NAMES: Array = [ undefined, "'module'", "'{'", "'}'", "'const'", "':'", "'var'", "'assume'", - "','", "';'", "'type'", "'|'", "'nondet'", "'val'", "'def'", "'pure'", - "'action'", "'run'", "'temporal'", "'import'", "'.'", "'from'", "'as'", - "'export'", "'->'", "'=>'", "'['", "']'", "'int'", "'str'", "'bool'", - "'^'", "'''", "'all'", "'any'", "'if'", "'else'", "'_'", "'...'", "'::'", - undefined, undefined, undefined, "'and'", "'or'", "'iff'", "'implies'", - "'Set'", "'List'", "'Map'", "'match'", "'+'", "'-'", "'*'", "'/'", "'%'", - "'>'", "'<'", "'>='", "'<='", "'!='", "'=='", "'='", "'('", "')'", + "','", "';'", "'type'", "'['", "']'", "'|'", "'nondet'", "'val'", "'def'", + "'pure'", "'action'", "'run'", "'temporal'", "'import'", "'.'", "'from'", + "'as'", "'export'", "'->'", "'=>'", "'int'", "'str'", "'bool'", "'^'", + "'''", "'all'", "'any'", "'if'", "'else'", "'_'", "'...'", "'::'", undefined, + undefined, undefined, "'and'", "'or'", "'iff'", "'implies'", "'Map'", + "'match'", "'+'", "'-'", "'*'", "'/'", "'%'", "'>'", "'<'", "'>='", "'<='", + "'!='", "'=='", "'='", "'('", "')'", "'Set'", "'List'", ]; private static readonly _SYMBOLIC_NAMES: Array = [ undefined, undefined, undefined, undefined, undefined, undefined, undefined, @@ -132,9 +132,9 @@ export class QuintLexer extends Lexer { undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, "STRING", "BOOL", - "INT", "AND", "OR", "IFF", "IMPLIES", "SET", "LIST", "MAP", "MATCH", "PLUS", - "MINUS", "MUL", "DIV", "MOD", "GT", "LT", "GE", "LE", "NE", "EQ", "ASGN", - "LPAREN", "RPAREN", "LOW_ID", "CAP_ID", "DOCCOMMENT", "LINE_COMMENT", + "INT", "AND", "OR", "IFF", "IMPLIES", "MAP", "MATCH", "PLUS", "MINUS", + "MUL", "DIV", "MOD", "GT", "LT", "GE", "LE", "NE", "EQ", "ASGN", "LPAREN", + "RPAREN", "SET", "LIST", "LOW_ID", "CAP_ID", "DOCCOMMENT", "LINE_COMMENT", "COMMENT", "WS", ]; public static readonly VOCABULARY: Vocabulary = new VocabularyImpl(QuintLexer._LITERAL_NAMES, QuintLexer._SYMBOLIC_NAMES, []); @@ -183,215 +183,216 @@ export class QuintLexer extends Lexer { "\x03\x03\x03\x03\x04\x03\x04\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03" + "\x05\x03\x06\x03\x06\x03\x07\x03\x07\x03\x07\x03\x07\x03\b\x03\b\x03\b" + "\x03\b\x03\b\x03\b\x03\b\x03\t\x03\t\x03\n\x03\n\x03\v\x03\v\x03\v\x03" + - "\v\x03\v\x03\f\x03\f\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03\x0E" + - "\x03\x0E\x03\x0E\x03\x0E\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x10\x03\x10" + - "\x03\x10\x03\x10\x03\x10\x03\x11\x03\x11\x03\x11\x03\x11\x03\x11\x03\x11" + - "\x03\x11\x03\x12\x03\x12\x03\x12\x03\x12\x03\x13\x03\x13\x03\x13\x03\x13" + - "\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x14\x03\x14\x03\x14\x03\x14" + - "\x03\x14\x03\x14\x03\x14\x03\x15\x03\x15\x03\x16\x03\x16\x03\x16\x03\x16" + - "\x03\x16\x03\x17\x03\x17\x03\x17\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + - "\x03\x18\x03\x18\x03\x19\x03\x19\x03\x19\x03\x1A\x03\x1A\x03\x1A\x03\x1B" + - "\x03\x1B\x03\x1C\x03\x1C\x03\x1D\x03\x1D\x03\x1D\x03\x1D\x03\x1E\x03\x1E" + - "\x03\x1E\x03\x1E\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x03 \x03 \x03" + - "!\x03!\x03\"\x03\"\x03\"\x03\"\x03#\x03#\x03#\x03#\x03$\x03$\x03$\x03" + - "%\x03%\x03%\x03%\x03%\x03&\x03&\x03\'\x03\'\x03\'\x03\'\x03(\x03(\x03" + - "(\x03)\x03)\x07)\u012F\n)\f)\x0E)\u0132\v)\x03)\x03)\x03*\x03*\x03*\x03" + - "*\x03*\x03*\x03*\x03*\x03*\x05*\u013F\n*\x03+\x03+\x03+\x03+\x03+\x07" + - "+\u0146\n+\f+\x0E+\u0149\v+\x03+\x03+\x03+\x03+\x03+\x03+\x03+\x07+\u0152" + - "\n+\f+\x0E+\u0155\v+\x05+\u0157\n+\x03,\x03,\x03,\x03,\x03-\x03-\x03-" + - "\x03.\x03.\x03.\x03.\x03/\x03/\x03/\x03/\x03/\x03/\x03/\x03/\x030\x03" + - "0\x030\x030\x031\x031\x031\x031\x031\x032\x032\x032\x032\x033\x033\x03" + - "3\x033\x033\x033\x034\x034\x035\x035\x036\x036\x037\x037\x038\x038\x03" + - "9\x039\x03:\x03:\x03;\x03;\x03;\x03<\x03<\x03<\x03=\x03=\x03=\x03>\x03" + - ">\x03>\x03?\x03?\x03@\x03@\x03A\x03A\x03B\x03B\x07B\u01A1\nB\fB\x0EB\u01A4" + - "\vB\x03B\x03B\x06B\u01A8\nB\rB\x0EB\u01A9\x05B\u01AC\nB\x03C\x03C\x07" + - "C\u01B0\nC\fC\x0EC\u01B3\vC\x03C\x03C\x06C\u01B7\nC\rC\x0EC\u01B8\x05" + - "C\u01BB\nC\x03D\x03D\x03D\x03D\x03D\x07D\u01C2\nD\fD\x0ED\u01C5\vD\x03" + - "D\x03D\x03E\x03E\x03E\x03E\x07E\u01CD\nE\fE\x0EE\u01D0\vE\x03E\x03E\x03" + - "E\x03E\x03F\x03F\x03F\x03F\x07F\u01DA\nF\fF\x0EF\u01DD\vF\x03F\x03F\x03" + - "F\x03F\x03F\x03G\x06G\u01E5\nG\rG\x0EG\u01E6\x03G\x03G\x06\u0130\u01C3" + - "\u01CE\u01DB\x02\x02H\x03\x02\x03\x05\x02\x04\x07\x02\x05\t\x02\x06\v" + - "\x02\x07\r\x02\b\x0F\x02\t\x11\x02\n\x13\x02\v\x15\x02\f\x17\x02\r\x19" + - "\x02\x0E\x1B\x02\x0F\x1D\x02\x10\x1F\x02\x11!\x02\x12#\x02\x13%\x02\x14" + - "\'\x02\x15)\x02\x16+\x02\x17-\x02\x18/\x02\x191\x02\x1A3\x02\x1B5\x02" + - "\x1C7\x02\x1D9\x02\x1E;\x02\x1F=\x02 ?\x02!A\x02\"C\x02#E\x02$G\x02%I" + - "\x02&K\x02\'M\x02(O\x02)Q\x02*S\x02+U\x02,W\x02-Y\x02.[\x02/]\x020_\x02" + - "1a\x022c\x023e\x024g\x025i\x026k\x027m\x028o\x029q\x02:s\x02;u\x02{\x02?}\x02@\x7F\x02A\x81\x02B\x83\x02C\x85\x02D\x87\x02E\x89\x02" + - "F\x8B\x02G\x8D\x02H\x03\x02\n\x03\x023;\x03\x022;\x05\x022;CHch\x03\x02" + - "c|\x06\x022;C\\aac|\x03\x02aa\x03\x02C\\\x05\x02\v\f\x0F\x0F\"\"\x02\u01FB" + - "\x02\x03\x03\x02\x02\x02\x02\x05\x03\x02\x02\x02\x02\x07\x03\x02\x02\x02" + - "\x02\t\x03\x02\x02\x02\x02\v\x03\x02\x02\x02\x02\r\x03\x02\x02\x02\x02" + - "\x0F\x03\x02\x02\x02\x02\x11\x03\x02\x02\x02\x02\x13\x03\x02\x02\x02\x02" + - "\x15\x03\x02\x02\x02\x02\x17\x03\x02\x02\x02\x02\x19\x03\x02\x02\x02\x02" + - "\x1B\x03\x02\x02\x02\x02\x1D\x03\x02\x02\x02\x02\x1F\x03\x02\x02\x02\x02" + - "!\x03\x02\x02\x02\x02#\x03\x02\x02\x02\x02%\x03\x02\x02\x02\x02\'\x03" + - "\x02\x02\x02\x02)\x03\x02\x02\x02\x02+\x03\x02\x02\x02\x02-\x03\x02\x02" + - "\x02\x02/\x03\x02\x02\x02\x021\x03\x02\x02\x02\x023\x03\x02\x02\x02\x02" + - "5\x03\x02\x02\x02\x027\x03\x02\x02\x02\x029\x03\x02\x02\x02\x02;\x03\x02" + - "\x02\x02\x02=\x03\x02\x02\x02\x02?\x03\x02\x02\x02\x02A\x03\x02\x02\x02" + - "\x02C\x03\x02\x02\x02\x02E\x03\x02\x02\x02\x02G\x03\x02\x02\x02\x02I\x03" + - "\x02\x02\x02\x02K\x03\x02\x02\x02\x02M\x03\x02\x02\x02\x02O\x03\x02\x02" + - "\x02\x02Q\x03\x02\x02\x02\x02S\x03\x02\x02\x02\x02U\x03\x02\x02\x02\x02" + - "W\x03\x02\x02\x02\x02Y\x03\x02\x02\x02\x02[\x03\x02\x02\x02\x02]\x03\x02" + - "\x02\x02\x02_\x03\x02\x02\x02\x02a\x03\x02\x02\x02\x02c\x03\x02\x02\x02" + - "\x02e\x03\x02\x02\x02\x02g\x03\x02\x02\x02\x02i\x03\x02\x02\x02\x02k\x03" + - "\x02\x02\x02\x02m\x03\x02\x02\x02\x02o\x03\x02\x02\x02\x02q\x03\x02\x02" + - "\x02\x02s\x03\x02\x02\x02\x02u\x03\x02\x02\x02\x02w\x03\x02\x02\x02\x02" + - "y\x03\x02\x02\x02\x02{\x03\x02\x02\x02\x02}\x03\x02\x02\x02\x02\x7F\x03" + - "\x02\x02\x02\x02\x81\x03\x02\x02\x02\x02\x83\x03\x02\x02\x02\x02\x85\x03" + - "\x02\x02\x02\x02\x87\x03\x02\x02\x02\x02\x89\x03\x02\x02\x02\x02\x8B\x03" + - "\x02\x02\x02\x02\x8D\x03\x02\x02\x02\x03\x8F\x03\x02\x02\x02\x05\x96\x03" + - "\x02\x02\x02\x07\x98\x03\x02\x02\x02\t\x9A\x03\x02\x02\x02\v\xA0\x03\x02" + - "\x02\x02\r\xA2\x03\x02\x02\x02\x0F\xA6\x03\x02\x02\x02\x11\xAD\x03\x02" + - "\x02\x02\x13\xAF\x03\x02\x02\x02\x15\xB1\x03\x02\x02\x02\x17\xB6\x03\x02" + - "\x02\x02\x19\xB8\x03\x02\x02\x02\x1B\xBF\x03\x02\x02\x02\x1D\xC3\x03\x02" + - "\x02\x02\x1F\xC7\x03\x02\x02\x02!\xCC\x03\x02\x02\x02#\xD3\x03\x02\x02" + - "\x02%\xD7\x03\x02\x02\x02\'\xE0\x03\x02\x02\x02)\xE7\x03\x02\x02\x02+" + - "\xE9\x03\x02\x02\x02-\xEE\x03\x02\x02\x02/\xF1\x03\x02\x02\x021\xF8\x03" + - "\x02\x02\x023\xFB\x03\x02\x02\x025\xFE\x03\x02\x02\x027\u0100\x03\x02" + - "\x02\x029\u0102\x03\x02\x02\x02;\u0106\x03\x02\x02\x02=\u010A\x03\x02" + - "\x02\x02?\u010F\x03\x02\x02\x02A\u0111\x03\x02\x02\x02C\u0113\x03\x02" + - "\x02\x02E\u0117\x03\x02\x02\x02G\u011B\x03\x02\x02\x02I\u011E\x03\x02" + - "\x02\x02K\u0123\x03\x02\x02\x02M\u0125\x03\x02\x02\x02O\u0129\x03\x02" + - "\x02\x02Q\u012C\x03\x02\x02\x02S\u013E\x03\x02\x02\x02U\u0156\x03\x02" + - "\x02\x02W\u0158\x03\x02\x02\x02Y\u015C\x03\x02\x02\x02[\u015F\x03\x02" + - "\x02\x02]\u0163\x03\x02\x02\x02_\u016B\x03\x02\x02\x02a\u016F\x03\x02" + - "\x02\x02c\u0174\x03\x02\x02\x02e\u0178\x03\x02\x02\x02g\u017E\x03\x02" + - "\x02\x02i\u0180\x03\x02\x02\x02k\u0182\x03\x02\x02\x02m\u0184\x03\x02" + - "\x02\x02o\u0186\x03\x02\x02\x02q\u0188\x03\x02\x02\x02s\u018A\x03\x02" + - "\x02\x02u\u018C\x03\x02\x02\x02w\u018F\x03\x02\x02\x02y\u0192\x03\x02" + - "\x02\x02{\u0195\x03\x02\x02\x02}\u0198\x03\x02\x02\x02\x7F\u019A\x03\x02" + - "\x02\x02\x81\u019C\x03\x02\x02\x02\x83\u01AB\x03\x02\x02\x02\x85\u01BA" + - "\x03\x02\x02\x02\x87\u01BC\x03\x02\x02\x02\x89\u01C8\x03\x02\x02\x02\x8B" + - "\u01D5\x03\x02\x02\x02\x8D\u01E4\x03\x02\x02\x02\x8F\x90\x07o\x02\x02" + - "\x90\x91\x07q\x02\x02\x91\x92\x07f\x02\x02\x92\x93\x07w\x02\x02\x93\x94" + - "\x07n\x02\x02\x94\x95\x07g\x02\x02\x95\x04\x03\x02\x02\x02\x96\x97\x07" + - "}\x02\x02\x97\x06\x03\x02\x02\x02\x98\x99\x07\x7F\x02\x02\x99\b\x03\x02" + - "\x02\x02\x9A\x9B\x07e\x02\x02\x9B\x9C\x07q\x02\x02\x9C\x9D\x07p\x02\x02" + - "\x9D\x9E\x07u\x02\x02\x9E\x9F\x07v\x02\x02\x9F\n\x03\x02\x02\x02\xA0\xA1" + - "\x07<\x02\x02\xA1\f\x03\x02\x02\x02\xA2\xA3\x07x\x02\x02\xA3\xA4\x07c" + - "\x02\x02\xA4\xA5\x07t\x02\x02\xA5\x0E\x03\x02\x02\x02\xA6\xA7\x07c\x02" + - "\x02\xA7\xA8\x07u\x02\x02\xA8\xA9\x07u\x02\x02\xA9\xAA\x07w\x02\x02\xAA" + - "\xAB\x07o\x02\x02\xAB\xAC\x07g\x02\x02\xAC\x10\x03\x02\x02\x02\xAD\xAE" + - "\x07.\x02\x02\xAE\x12\x03\x02\x02\x02\xAF\xB0\x07=\x02\x02\xB0\x14\x03" + - "\x02\x02\x02\xB1\xB2\x07v\x02\x02\xB2\xB3\x07{\x02\x02\xB3\xB4\x07r\x02" + - "\x02\xB4\xB5\x07g\x02\x02\xB5\x16\x03\x02\x02\x02\xB6\xB7\x07~\x02\x02" + - "\xB7\x18\x03\x02\x02\x02\xB8\xB9\x07p\x02\x02\xB9\xBA\x07q\x02\x02\xBA" + - "\xBB\x07p\x02\x02\xBB\xBC\x07f\x02\x02\xBC\xBD\x07g\x02\x02\xBD\xBE\x07" + - "v\x02\x02\xBE\x1A\x03\x02\x02\x02\xBF\xC0\x07x\x02\x02\xC0\xC1\x07c\x02" + - "\x02\xC1\xC2\x07n\x02\x02\xC2\x1C\x03\x02\x02\x02\xC3\xC4\x07f\x02\x02" + - "\xC4\xC5\x07g\x02\x02\xC5\xC6\x07h\x02\x02\xC6\x1E\x03\x02\x02\x02\xC7" + - "\xC8\x07r\x02\x02\xC8\xC9\x07w\x02\x02\xC9\xCA\x07t\x02\x02\xCA\xCB\x07" + - "g\x02\x02\xCB \x03\x02\x02\x02\xCC\xCD\x07c\x02\x02\xCD\xCE\x07e\x02\x02" + - "\xCE\xCF\x07v\x02\x02\xCF\xD0\x07k\x02\x02\xD0\xD1\x07q\x02\x02\xD1\xD2" + - "\x07p\x02\x02\xD2\"\x03\x02\x02\x02\xD3\xD4\x07t\x02\x02\xD4\xD5\x07w" + - "\x02\x02\xD5\xD6\x07p\x02\x02\xD6$\x03\x02\x02\x02\xD7\xD8\x07v\x02\x02" + - "\xD8\xD9\x07g\x02\x02\xD9\xDA\x07o\x02\x02\xDA\xDB\x07r\x02\x02\xDB\xDC" + - "\x07q\x02\x02\xDC\xDD\x07t\x02\x02\xDD\xDE\x07c\x02\x02\xDE\xDF\x07n\x02" + - "\x02\xDF&\x03\x02\x02\x02\xE0\xE1\x07k\x02\x02\xE1\xE2\x07o\x02\x02\xE2" + - "\xE3\x07r\x02\x02\xE3\xE4\x07q\x02\x02\xE4\xE5\x07t\x02\x02\xE5\xE6\x07" + - "v\x02\x02\xE6(\x03\x02\x02\x02\xE7\xE8\x070\x02\x02\xE8*\x03\x02\x02\x02" + - "\xE9\xEA\x07h\x02\x02\xEA\xEB\x07t\x02\x02\xEB\xEC\x07q\x02\x02\xEC\xED" + - "\x07o\x02\x02\xED,\x03\x02\x02\x02\xEE\xEF\x07c\x02\x02\xEF\xF0\x07u\x02" + - "\x02\xF0.\x03\x02\x02\x02\xF1\xF2\x07g\x02\x02\xF2\xF3\x07z\x02\x02\xF3" + - "\xF4\x07r\x02\x02\xF4\xF5\x07q\x02\x02\xF5\xF6\x07t\x02\x02\xF6\xF7\x07" + - "v\x02\x02\xF70\x03\x02\x02\x02\xF8\xF9\x07/\x02\x02\xF9\xFA\x07@\x02\x02" + - "\xFA2\x03\x02\x02\x02\xFB\xFC\x07?\x02\x02\xFC\xFD\x07@\x02\x02\xFD4\x03" + - "\x02\x02\x02\xFE\xFF\x07]\x02\x02\xFF6\x03\x02\x02\x02\u0100\u0101\x07" + - "_\x02\x02\u01018\x03\x02\x02\x02\u0102\u0103\x07k\x02\x02\u0103\u0104" + - "\x07p\x02\x02\u0104\u0105\x07v\x02\x02\u0105:\x03\x02\x02\x02\u0106\u0107" + - "\x07u\x02\x02\u0107\u0108\x07v\x02\x02\u0108\u0109\x07t\x02\x02\u0109" + - "<\x03\x02\x02\x02\u010A\u010B\x07d\x02\x02\u010B\u010C\x07q\x02\x02\u010C" + - "\u010D\x07q\x02\x02\u010D\u010E\x07n\x02\x02\u010E>\x03\x02\x02\x02\u010F" + - "\u0110\x07`\x02\x02\u0110@\x03\x02\x02\x02\u0111\u0112\x07)\x02\x02\u0112" + - "B\x03\x02\x02\x02\u0113\u0114\x07c\x02\x02\u0114\u0115\x07n\x02\x02\u0115" + - "\u0116\x07n\x02\x02\u0116D\x03\x02\x02\x02\u0117\u0118\x07c\x02\x02\u0118" + - "\u0119\x07p\x02\x02\u0119\u011A\x07{\x02\x02\u011AF\x03\x02\x02\x02\u011B" + - "\u011C\x07k\x02\x02\u011C\u011D\x07h\x02\x02\u011DH\x03\x02\x02\x02\u011E" + - "\u011F\x07g\x02\x02\u011F\u0120\x07n\x02\x02\u0120\u0121\x07u\x02\x02" + - "\u0121\u0122\x07g\x02\x02\u0122J\x03\x02\x02\x02\u0123\u0124\x07a\x02" + - "\x02\u0124L\x03\x02\x02\x02\u0125\u0126\x070\x02\x02\u0126\u0127\x070" + - "\x02\x02\u0127\u0128\x070\x02\x02\u0128N\x03\x02\x02\x02\u0129\u012A\x07" + - "<\x02\x02\u012A\u012B\x07<\x02\x02\u012BP\x03\x02\x02\x02\u012C\u0130" + - "\x07$\x02\x02\u012D\u012F\v\x02\x02\x02\u012E\u012D\x03\x02\x02\x02\u012F" + - "\u0132\x03\x02\x02\x02\u0130\u0131\x03\x02\x02\x02\u0130\u012E\x03\x02" + - "\x02\x02\u0131\u0133\x03\x02\x02\x02\u0132\u0130\x03\x02\x02\x02\u0133" + - "\u0134\x07$\x02\x02\u0134R\x03\x02\x02\x02\u0135\u0136\x07h\x02\x02\u0136" + - "\u0137\x07c\x02\x02\u0137\u0138\x07n\x02\x02\u0138\u0139\x07u\x02\x02" + - "\u0139\u013F\x07g\x02\x02\u013A\u013B\x07v\x02\x02\u013B\u013C\x07t\x02" + - "\x02\u013C\u013D\x07w\x02\x02\u013D\u013F\x07g\x02\x02\u013E\u0135\x03" + - "\x02\x02\x02\u013E\u013A\x03\x02\x02\x02\u013FT\x03\x02\x02\x02\u0140" + - "\u0157\x072\x02\x02\u0141\u0147\t\x02\x02\x02\u0142\u0146\t\x03\x02\x02" + - "\u0143\u0144\x07a\x02\x02\u0144\u0146\t\x03\x02\x02\u0145\u0142\x03\x02" + - "\x02\x02\u0145\u0143\x03\x02\x02\x02\u0146\u0149\x03\x02\x02\x02\u0147" + - "\u0145\x03\x02\x02\x02\u0147\u0148\x03\x02\x02\x02\u0148\u0157\x03\x02" + - "\x02\x02\u0149\u0147\x03\x02\x02\x02\u014A\u014B\x072\x02\x02\u014B\u014C" + - "\x07z\x02\x02\u014C\u014D\x03\x02\x02\x02\u014D\u0153\t\x04\x02\x02\u014E" + - "\u0152\t\x04\x02\x02\u014F\u0150\x07a\x02\x02\u0150\u0152\t\x04\x02\x02" + - "\u0151\u014E\x03\x02\x02\x02\u0151\u014F\x03\x02\x02\x02\u0152\u0155\x03" + - "\x02\x02\x02\u0153\u0151\x03\x02\x02\x02\u0153\u0154\x03\x02\x02\x02\u0154" + - "\u0157\x03\x02\x02\x02\u0155\u0153\x03\x02\x02\x02\u0156\u0140\x03\x02" + - "\x02\x02\u0156\u0141\x03\x02\x02\x02\u0156\u014A\x03\x02\x02\x02\u0157" + - "V\x03\x02\x02\x02\u0158\u0159\x07c\x02\x02\u0159\u015A\x07p\x02\x02\u015A" + - "\u015B\x07f\x02\x02\u015BX\x03\x02\x02\x02\u015C\u015D\x07q\x02\x02\u015D" + - "\u015E\x07t\x02\x02\u015EZ\x03\x02\x02\x02\u015F\u0160\x07k\x02\x02\u0160" + - "\u0161\x07h\x02\x02\u0161\u0162\x07h\x02\x02\u0162\\\x03\x02\x02\x02\u0163" + - "\u0164\x07k\x02\x02\u0164\u0165\x07o\x02\x02\u0165\u0166\x07r\x02\x02" + - "\u0166\u0167\x07n\x02\x02\u0167\u0168\x07k\x02\x02\u0168\u0169\x07g\x02" + - "\x02\u0169\u016A\x07u\x02\x02\u016A^\x03\x02\x02\x02\u016B\u016C\x07U" + - "\x02\x02\u016C\u016D\x07g\x02\x02\u016D\u016E\x07v\x02\x02\u016E`\x03" + - "\x02\x02\x02\u016F\u0170\x07N\x02\x02\u0170\u0171\x07k\x02\x02\u0171\u0172" + - "\x07u\x02\x02\u0172\u0173\x07v\x02\x02\u0173b\x03\x02\x02\x02\u0174\u0175" + - "\x07O\x02\x02\u0175\u0176\x07c\x02\x02\u0176\u0177\x07r\x02\x02\u0177" + - "d\x03\x02\x02\x02\u0178\u0179\x07o\x02\x02\u0179\u017A\x07c\x02\x02\u017A" + - "\u017B\x07v\x02\x02\u017B\u017C\x07e\x02\x02\u017C\u017D\x07j\x02\x02" + - "\u017Df\x03\x02\x02\x02\u017E\u017F\x07-\x02\x02\u017Fh\x03\x02\x02\x02" + - "\u0180\u0181\x07/\x02\x02\u0181j\x03\x02\x02\x02\u0182\u0183\x07,\x02" + - "\x02\u0183l\x03\x02\x02\x02\u0184\u0185\x071\x02\x02\u0185n\x03\x02\x02" + - "\x02\u0186\u0187\x07\'\x02\x02\u0187p\x03\x02\x02\x02\u0188\u0189\x07" + - "@\x02\x02\u0189r\x03\x02\x02\x02\u018A\u018B\x07>\x02\x02\u018Bt\x03\x02" + - "\x02\x02\u018C\u018D\x07@\x02\x02\u018D\u018E\x07?\x02\x02\u018Ev\x03" + - "\x02\x02\x02\u018F\u0190\x07>\x02\x02\u0190\u0191\x07?\x02\x02\u0191x" + - "\x03\x02\x02\x02\u0192\u0193\x07#\x02\x02\u0193\u0194\x07?\x02\x02\u0194" + - "z\x03\x02\x02\x02\u0195\u0196\x07?\x02\x02\u0196\u0197\x07?\x02\x02\u0197" + - "|\x03\x02\x02\x02\u0198\u0199\x07?\x02\x02\u0199~\x03\x02\x02\x02\u019A" + - "\u019B\x07*\x02\x02\u019B\x80\x03\x02\x02\x02\u019C\u019D\x07+\x02\x02" + - "\u019D\x82\x03\x02\x02\x02\u019E\u01A2\t\x05\x02\x02\u019F\u01A1\t\x06" + - "\x02\x02\u01A0\u019F\x03\x02\x02\x02\u01A1\u01A4\x03\x02\x02\x02\u01A2" + - "\u01A0\x03\x02\x02\x02\u01A2\u01A3\x03\x02\x02\x02\u01A3\u01AC\x03\x02" + - "\x02\x02\u01A4\u01A2\x03\x02\x02\x02\u01A5\u01A7\t\x07\x02\x02\u01A6\u01A8" + - "\t\x06\x02\x02\u01A7\u01A6\x03\x02\x02\x02\u01A8\u01A9\x03\x02\x02\x02" + - "\u01A9\u01A7\x03\x02\x02\x02\u01A9\u01AA\x03\x02\x02\x02\u01AA\u01AC\x03" + - "\x02\x02\x02\u01AB\u019E\x03\x02\x02\x02\u01AB\u01A5\x03\x02\x02\x02\u01AC" + - "\x84\x03\x02\x02\x02\u01AD\u01B1\t\b\x02\x02\u01AE\u01B0\t\x06\x02\x02" + - "\u01AF\u01AE\x03\x02\x02\x02\u01B0\u01B3\x03\x02\x02\x02\u01B1\u01AF\x03" + - "\x02\x02\x02\u01B1\u01B2\x03\x02\x02\x02\u01B2\u01BB\x03\x02\x02\x02\u01B3" + - "\u01B1\x03\x02\x02\x02\u01B4\u01B6\t\x07\x02\x02\u01B5\u01B7\t\x06\x02" + - "\x02\u01B6\u01B5\x03\x02\x02\x02\u01B7\u01B8\x03\x02\x02\x02\u01B8\u01B6" + - "\x03\x02\x02\x02\u01B8\u01B9\x03\x02\x02\x02\u01B9\u01BB\x03\x02\x02\x02" + - "\u01BA\u01AD\x03\x02\x02\x02\u01BA\u01B4\x03\x02\x02\x02\u01BB\x86\x03" + - "\x02\x02\x02\u01BC\u01BD\x071\x02\x02\u01BD\u01BE\x071\x02\x02\u01BE\u01BF" + - "\x071\x02\x02\u01BF\u01C3\x03\x02\x02\x02\u01C0\u01C2\v\x02\x02\x02\u01C1" + - "\u01C0\x03\x02\x02\x02\u01C2\u01C5\x03\x02\x02\x02\u01C3\u01C4\x03\x02" + - "\x02\x02\u01C3\u01C1\x03\x02\x02\x02\u01C4\u01C6\x03\x02\x02\x02\u01C5" + - "\u01C3\x03\x02\x02\x02\u01C6\u01C7\x07\f\x02\x02\u01C7\x88\x03\x02\x02" + - "\x02\u01C8\u01C9\x071\x02\x02\u01C9\u01CA\x071\x02\x02\u01CA\u01CE\x03" + - "\x02\x02\x02\u01CB\u01CD\v\x02\x02\x02\u01CC\u01CB\x03\x02\x02\x02\u01CD" + - "\u01D0\x03\x02\x02\x02\u01CE\u01CF\x03\x02\x02\x02\u01CE\u01CC\x03\x02" + - "\x02\x02\u01CF\u01D1\x03\x02\x02\x02\u01D0\u01CE\x03\x02\x02\x02\u01D1" + - "\u01D2\x07\f\x02\x02\u01D2\u01D3\x03\x02\x02\x02\u01D3\u01D4\bE\x02\x02" + - "\u01D4\x8A\x03\x02\x02\x02\u01D5\u01D6\x071\x02\x02\u01D6\u01D7\x07,\x02" + - "\x02\u01D7\u01DB\x03\x02\x02\x02\u01D8\u01DA\v\x02\x02\x02\u01D9\u01D8" + - "\x03\x02\x02\x02\u01DA\u01DD\x03\x02\x02\x02\u01DB\u01DC\x03\x02\x02\x02" + - "\u01DB\u01D9\x03\x02\x02\x02\u01DC\u01DE\x03\x02\x02\x02\u01DD\u01DB\x03" + - "\x02\x02\x02\u01DE\u01DF\x07,\x02\x02\u01DF\u01E0\x071\x02\x02\u01E0\u01E1" + - "\x03\x02\x02\x02\u01E1\u01E2\bF\x02\x02\u01E2\x8C\x03\x02\x02\x02\u01E3" + - "\u01E5\t\t\x02\x02\u01E4\u01E3\x03\x02\x02\x02\u01E5\u01E6\x03\x02\x02" + - "\x02\u01E6\u01E4\x03\x02\x02\x02\u01E6\u01E7\x03\x02\x02\x02\u01E7\u01E8" + - "\x03\x02\x02\x02\u01E8\u01E9\bG\x02\x02\u01E9\x8E\x03\x02\x02\x02\x14" + - "\x02\u0130\u013E\u0145\u0147\u0151\u0153\u0156\u01A2\u01A9\u01AB\u01B1" + - "\u01B8\u01BA\u01C3\u01CE\u01DB\u01E6\x03\b\x02\x02"; + "\v\x03\v\x03\f\x03\f\x03\r\x03\r\x03\x0E\x03\x0E\x03\x0F\x03\x0F\x03\x0F" + + "\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x10\x03\x10\x03\x10\x03\x10\x03\x11" + + "\x03\x11\x03\x11\x03\x11\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x13" + + "\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x14\x03\x14\x03\x14" + + "\x03\x14\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15" + + "\x03\x15\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x17" + + "\x03\x17\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x19\x03\x19\x03\x19" + + "\x03\x1A\x03\x1A\x03\x1A\x03\x1A\x03\x1A\x03\x1A\x03\x1A\x03\x1B\x03\x1B" + + "\x03\x1B\x03\x1C\x03\x1C\x03\x1C\x03\x1D\x03\x1D\x03\x1D\x03\x1D\x03\x1E" + + "\x03\x1E\x03\x1E\x03\x1E\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x03 " + + "\x03 \x03!\x03!\x03\"\x03\"\x03\"\x03\"\x03#\x03#\x03#\x03#\x03$\x03$" + + "\x03$\x03%\x03%\x03%\x03%\x03%\x03&\x03&\x03\'\x03\'\x03\'\x03\'\x03(" + + "\x03(\x03(\x03)\x03)\x07)\u012F\n)\f)\x0E)\u0132\v)\x03)\x03)\x03*\x03" + + "*\x03*\x03*\x03*\x03*\x03*\x03*\x03*\x05*\u013F\n*\x03+\x03+\x03+\x03" + + "+\x03+\x07+\u0146\n+\f+\x0E+\u0149\v+\x03+\x03+\x03+\x03+\x03+\x03+\x03" + + "+\x07+\u0152\n+\f+\x0E+\u0155\v+\x05+\u0157\n+\x03,\x03,\x03,\x03,\x03" + + "-\x03-\x03-\x03.\x03.\x03.\x03.\x03/\x03/\x03/\x03/\x03/\x03/\x03/\x03" + + "/\x030\x030\x030\x030\x031\x031\x031\x031\x031\x031\x032\x032\x033\x03" + + "3\x034\x034\x035\x035\x036\x036\x037\x037\x038\x038\x039\x039\x039\x03" + + ":\x03:\x03:\x03;\x03;\x03;\x03<\x03<\x03<\x03=\x03=\x03>\x03>\x03?\x03" + + "?\x03@\x03@\x03@\x03@\x03A\x03A\x03A\x03A\x03A\x03B\x03B\x07B\u01A1\n" + + "B\fB\x0EB\u01A4\vB\x03B\x03B\x06B\u01A8\nB\rB\x0EB\u01A9\x05B\u01AC\n" + + "B\x03C\x03C\x07C\u01B0\nC\fC\x0EC\u01B3\vC\x03C\x03C\x06C\u01B7\nC\rC" + + "\x0EC\u01B8\x05C\u01BB\nC\x03D\x03D\x03D\x03D\x03D\x07D\u01C2\nD\fD\x0E" + + "D\u01C5\vD\x03D\x03D\x03E\x03E\x03E\x03E\x07E\u01CD\nE\fE\x0EE\u01D0\v" + + "E\x03E\x03E\x03E\x03E\x03F\x03F\x03F\x03F\x07F\u01DA\nF\fF\x0EF\u01DD" + + "\vF\x03F\x03F\x03F\x03F\x03F\x03G\x06G\u01E5\nG\rG\x0EG\u01E6\x03G\x03" + + "G\x06\u0130\u01C3\u01CE\u01DB\x02\x02H\x03\x02\x03\x05\x02\x04\x07\x02" + + "\x05\t\x02\x06\v\x02\x07\r\x02\b\x0F\x02\t\x11\x02\n\x13\x02\v\x15\x02" + + "\f\x17\x02\r\x19\x02\x0E\x1B\x02\x0F\x1D\x02\x10\x1F\x02\x11!\x02\x12" + + "#\x02\x13%\x02\x14\'\x02\x15)\x02\x16+\x02\x17-\x02\x18/\x02\x191\x02" + + "\x1A3\x02\x1B5\x02\x1C7\x02\x1D9\x02\x1E;\x02\x1F=\x02 ?\x02!A\x02\"C" + + "\x02#E\x02$G\x02%I\x02&K\x02\'M\x02(O\x02)Q\x02*S\x02+U\x02,W\x02-Y\x02" + + ".[\x02/]\x020_\x021a\x022c\x023e\x024g\x025i\x026k\x027m\x028o\x029q\x02" + + ":s\x02;u\x02{\x02?}\x02@\x7F\x02A\x81\x02B\x83\x02C\x85\x02" + + "D\x87\x02E\x89\x02F\x8B\x02G\x8D\x02H\x03\x02\n\x03\x023;\x03\x022;\x05" + + "\x022;CHch\x03\x02c|\x06\x022;C\\aac|\x03\x02aa\x03\x02C\\\x05\x02\v\f" + + "\x0F\x0F\"\"\x02\u01FB\x02\x03\x03\x02\x02\x02\x02\x05\x03\x02\x02\x02" + + "\x02\x07\x03\x02\x02\x02\x02\t\x03\x02\x02\x02\x02\v\x03\x02\x02\x02\x02" + + "\r\x03\x02\x02\x02\x02\x0F\x03\x02\x02\x02\x02\x11\x03\x02\x02\x02\x02" + + "\x13\x03\x02\x02\x02\x02\x15\x03\x02\x02\x02\x02\x17\x03\x02\x02\x02\x02" + + "\x19\x03\x02\x02\x02\x02\x1B\x03\x02\x02\x02\x02\x1D\x03\x02\x02\x02\x02" + + "\x1F\x03\x02\x02\x02\x02!\x03\x02\x02\x02\x02#\x03\x02\x02\x02\x02%\x03" + + "\x02\x02\x02\x02\'\x03\x02\x02\x02\x02)\x03\x02\x02\x02\x02+\x03\x02\x02" + + "\x02\x02-\x03\x02\x02\x02\x02/\x03\x02\x02\x02\x021\x03\x02\x02\x02\x02" + + "3\x03\x02\x02\x02\x025\x03\x02\x02\x02\x027\x03\x02\x02\x02\x029\x03\x02" + + "\x02\x02\x02;\x03\x02\x02\x02\x02=\x03\x02\x02\x02\x02?\x03\x02\x02\x02" + + "\x02A\x03\x02\x02\x02\x02C\x03\x02\x02\x02\x02E\x03\x02\x02\x02\x02G\x03" + + "\x02\x02\x02\x02I\x03\x02\x02\x02\x02K\x03\x02\x02\x02\x02M\x03\x02\x02" + + "\x02\x02O\x03\x02\x02\x02\x02Q\x03\x02\x02\x02\x02S\x03\x02\x02\x02\x02" + + "U\x03\x02\x02\x02\x02W\x03\x02\x02\x02\x02Y\x03\x02\x02\x02\x02[\x03\x02" + + "\x02\x02\x02]\x03\x02\x02\x02\x02_\x03\x02\x02\x02\x02a\x03\x02\x02\x02" + + "\x02c\x03\x02\x02\x02\x02e\x03\x02\x02\x02\x02g\x03\x02\x02\x02\x02i\x03" + + "\x02\x02\x02\x02k\x03\x02\x02\x02\x02m\x03\x02\x02\x02\x02o\x03\x02\x02" + + "\x02\x02q\x03\x02\x02\x02\x02s\x03\x02\x02\x02\x02u\x03\x02\x02\x02\x02" + + "w\x03\x02\x02\x02\x02y\x03\x02\x02\x02\x02{\x03\x02\x02\x02\x02}\x03\x02" + + "\x02\x02\x02\x7F\x03\x02\x02\x02\x02\x81\x03\x02\x02\x02\x02\x83\x03\x02" + + "\x02\x02\x02\x85\x03\x02\x02\x02\x02\x87\x03\x02\x02\x02\x02\x89\x03\x02" + + "\x02\x02\x02\x8B\x03\x02\x02\x02\x02\x8D\x03\x02\x02\x02\x03\x8F\x03\x02" + + "\x02\x02\x05\x96\x03\x02\x02\x02\x07\x98\x03\x02\x02\x02\t\x9A\x03\x02" + + "\x02\x02\v\xA0\x03\x02\x02\x02\r\xA2\x03\x02\x02\x02\x0F\xA6\x03\x02\x02" + + "\x02\x11\xAD\x03\x02\x02\x02\x13\xAF\x03\x02\x02\x02\x15\xB1\x03\x02\x02" + + "\x02\x17\xB6\x03\x02\x02\x02\x19\xB8\x03\x02\x02\x02\x1B\xBA\x03\x02\x02" + + "\x02\x1D\xBC\x03\x02\x02\x02\x1F\xC3\x03\x02\x02\x02!\xC7\x03\x02\x02" + + "\x02#\xCB\x03\x02\x02\x02%\xD0\x03\x02\x02\x02\'\xD7\x03\x02\x02\x02)" + + "\xDB\x03\x02\x02\x02+\xE4\x03\x02\x02\x02-\xEB\x03\x02\x02\x02/\xED\x03" + + "\x02\x02\x021\xF2\x03\x02\x02\x023\xF5\x03\x02\x02\x025\xFC\x03\x02\x02" + + "\x027\xFF\x03\x02\x02\x029\u0102\x03\x02\x02\x02;\u0106\x03\x02\x02\x02" + + "=\u010A\x03\x02\x02\x02?\u010F\x03\x02\x02\x02A\u0111\x03\x02\x02\x02" + + "C\u0113\x03\x02\x02\x02E\u0117\x03\x02\x02\x02G\u011B\x03\x02\x02\x02" + + "I\u011E\x03\x02\x02\x02K\u0123\x03\x02\x02\x02M\u0125\x03\x02\x02\x02" + + "O\u0129\x03\x02\x02\x02Q\u012C\x03\x02\x02\x02S\u013E\x03\x02\x02\x02" + + "U\u0156\x03\x02\x02\x02W\u0158\x03\x02\x02\x02Y\u015C\x03\x02\x02\x02" + + "[\u015F\x03\x02\x02\x02]\u0163\x03\x02\x02\x02_\u016B\x03\x02\x02\x02" + + "a\u016F\x03\x02\x02\x02c\u0175\x03\x02\x02\x02e\u0177\x03\x02\x02\x02" + + "g\u0179\x03\x02\x02\x02i\u017B\x03\x02\x02\x02k\u017D\x03\x02\x02\x02" + + "m\u017F\x03\x02\x02\x02o\u0181\x03\x02\x02\x02q\u0183\x03\x02\x02\x02" + + "s\u0186\x03\x02\x02\x02u\u0189\x03\x02\x02\x02w\u018C\x03\x02\x02\x02" + + "y\u018F\x03\x02\x02\x02{\u0191\x03\x02\x02\x02}\u0193\x03\x02\x02\x02" + + "\x7F\u0195\x03\x02\x02\x02\x81\u0199\x03\x02\x02\x02\x83\u01AB\x03\x02" + + "\x02\x02\x85\u01BA\x03\x02\x02\x02\x87\u01BC\x03\x02\x02\x02\x89\u01C8" + + "\x03\x02\x02\x02\x8B\u01D5\x03\x02\x02\x02\x8D\u01E4\x03\x02\x02\x02\x8F" + + "\x90\x07o\x02\x02\x90\x91\x07q\x02\x02\x91\x92\x07f\x02\x02\x92\x93\x07" + + "w\x02\x02\x93\x94\x07n\x02\x02\x94\x95\x07g\x02\x02\x95\x04\x03\x02\x02" + + "\x02\x96\x97\x07}\x02\x02\x97\x06\x03\x02\x02\x02\x98\x99\x07\x7F\x02" + + "\x02\x99\b\x03\x02\x02\x02\x9A\x9B\x07e\x02\x02\x9B\x9C\x07q\x02\x02\x9C" + + "\x9D\x07p\x02\x02\x9D\x9E\x07u\x02\x02\x9E\x9F\x07v\x02\x02\x9F\n\x03" + + "\x02\x02\x02\xA0\xA1\x07<\x02\x02\xA1\f\x03\x02\x02\x02\xA2\xA3\x07x\x02" + + "\x02\xA3\xA4\x07c\x02\x02\xA4\xA5\x07t\x02\x02\xA5\x0E\x03\x02\x02\x02" + + "\xA6\xA7\x07c\x02\x02\xA7\xA8\x07u\x02\x02\xA8\xA9\x07u\x02\x02\xA9\xAA" + + "\x07w\x02\x02\xAA\xAB\x07o\x02\x02\xAB\xAC\x07g\x02\x02\xAC\x10\x03\x02" + + "\x02\x02\xAD\xAE\x07.\x02\x02\xAE\x12\x03\x02\x02\x02\xAF\xB0\x07=\x02" + + "\x02\xB0\x14\x03\x02\x02\x02\xB1\xB2\x07v\x02\x02\xB2\xB3\x07{\x02\x02" + + "\xB3\xB4\x07r\x02\x02\xB4\xB5\x07g\x02\x02\xB5\x16\x03\x02\x02\x02\xB6" + + "\xB7\x07]\x02\x02\xB7\x18\x03\x02\x02\x02\xB8\xB9\x07_\x02\x02\xB9\x1A" + + "\x03\x02\x02\x02\xBA\xBB\x07~\x02\x02\xBB\x1C\x03\x02\x02\x02\xBC\xBD" + + "\x07p\x02\x02\xBD\xBE\x07q\x02\x02\xBE\xBF\x07p\x02\x02\xBF\xC0\x07f\x02" + + "\x02\xC0\xC1\x07g\x02\x02\xC1\xC2\x07v\x02\x02\xC2\x1E\x03\x02\x02\x02" + + "\xC3\xC4\x07x\x02\x02\xC4\xC5\x07c\x02\x02\xC5\xC6\x07n\x02\x02\xC6 \x03" + + "\x02\x02\x02\xC7\xC8\x07f\x02\x02\xC8\xC9\x07g\x02\x02\xC9\xCA\x07h\x02" + + "\x02\xCA\"\x03\x02\x02\x02\xCB\xCC\x07r\x02\x02\xCC\xCD\x07w\x02\x02\xCD" + + "\xCE\x07t\x02\x02\xCE\xCF\x07g\x02\x02\xCF$\x03\x02\x02\x02\xD0\xD1\x07" + + "c\x02\x02\xD1\xD2\x07e\x02\x02\xD2\xD3\x07v\x02\x02\xD3\xD4\x07k\x02\x02" + + "\xD4\xD5\x07q\x02\x02\xD5\xD6\x07p\x02\x02\xD6&\x03\x02\x02\x02\xD7\xD8" + + "\x07t\x02\x02\xD8\xD9\x07w\x02\x02\xD9\xDA\x07p\x02\x02\xDA(\x03\x02\x02" + + "\x02\xDB\xDC\x07v\x02\x02\xDC\xDD\x07g\x02\x02\xDD\xDE\x07o\x02\x02\xDE" + + "\xDF\x07r\x02\x02\xDF\xE0\x07q\x02\x02\xE0\xE1\x07t\x02\x02\xE1\xE2\x07" + + "c\x02\x02\xE2\xE3\x07n\x02\x02\xE3*\x03\x02\x02\x02\xE4\xE5\x07k\x02\x02" + + "\xE5\xE6\x07o\x02\x02\xE6\xE7\x07r\x02\x02\xE7\xE8\x07q\x02\x02\xE8\xE9" + + "\x07t\x02\x02\xE9\xEA\x07v\x02\x02\xEA,\x03\x02\x02\x02\xEB\xEC\x070\x02" + + "\x02\xEC.\x03\x02\x02\x02\xED\xEE\x07h\x02\x02\xEE\xEF\x07t\x02\x02\xEF" + + "\xF0\x07q\x02\x02\xF0\xF1\x07o\x02\x02\xF10\x03\x02\x02\x02\xF2\xF3\x07" + + "c\x02\x02\xF3\xF4\x07u\x02\x02\xF42\x03\x02\x02\x02\xF5\xF6\x07g\x02\x02" + + "\xF6\xF7\x07z\x02\x02\xF7\xF8\x07r\x02\x02\xF8\xF9\x07q\x02\x02\xF9\xFA" + + "\x07t\x02\x02\xFA\xFB\x07v\x02\x02\xFB4\x03\x02\x02\x02\xFC\xFD\x07/\x02" + + "\x02\xFD\xFE\x07@\x02\x02\xFE6\x03\x02\x02\x02\xFF\u0100\x07?\x02\x02" + + "\u0100\u0101\x07@\x02\x02\u01018\x03\x02\x02\x02\u0102\u0103\x07k\x02" + + "\x02\u0103\u0104\x07p\x02\x02\u0104\u0105\x07v\x02\x02\u0105:\x03\x02" + + "\x02\x02\u0106\u0107\x07u\x02\x02\u0107\u0108\x07v\x02\x02\u0108\u0109" + + "\x07t\x02\x02\u0109<\x03\x02\x02\x02\u010A\u010B\x07d\x02\x02\u010B\u010C" + + "\x07q\x02\x02\u010C\u010D\x07q\x02\x02\u010D\u010E\x07n\x02\x02\u010E" + + ">\x03\x02\x02\x02\u010F\u0110\x07`\x02\x02\u0110@\x03\x02\x02\x02\u0111" + + "\u0112\x07)\x02\x02\u0112B\x03\x02\x02\x02\u0113\u0114\x07c\x02\x02\u0114" + + "\u0115\x07n\x02\x02\u0115\u0116\x07n\x02\x02\u0116D\x03\x02\x02\x02\u0117" + + "\u0118\x07c\x02\x02\u0118\u0119\x07p\x02\x02\u0119\u011A\x07{\x02\x02" + + "\u011AF\x03\x02\x02\x02\u011B\u011C\x07k\x02\x02\u011C\u011D\x07h\x02" + + "\x02\u011DH\x03\x02\x02\x02\u011E\u011F\x07g\x02\x02\u011F\u0120\x07n" + + "\x02\x02\u0120\u0121\x07u\x02\x02\u0121\u0122\x07g\x02\x02\u0122J\x03" + + "\x02\x02\x02\u0123\u0124\x07a\x02\x02\u0124L\x03\x02\x02\x02\u0125\u0126" + + "\x070\x02\x02\u0126\u0127\x070\x02\x02\u0127\u0128\x070\x02\x02\u0128" + + "N\x03\x02\x02\x02\u0129\u012A\x07<\x02\x02\u012A\u012B\x07<\x02\x02\u012B" + + "P\x03\x02\x02\x02\u012C\u0130\x07$\x02\x02\u012D\u012F\v\x02\x02\x02\u012E" + + "\u012D\x03\x02\x02\x02\u012F\u0132\x03\x02\x02\x02\u0130\u0131\x03\x02" + + "\x02\x02\u0130\u012E\x03\x02\x02\x02\u0131\u0133\x03\x02\x02\x02\u0132" + + "\u0130\x03\x02\x02\x02\u0133\u0134\x07$\x02\x02\u0134R\x03\x02\x02\x02" + + "\u0135\u0136\x07h\x02\x02\u0136\u0137\x07c\x02\x02\u0137\u0138\x07n\x02" + + "\x02\u0138\u0139\x07u\x02\x02\u0139\u013F\x07g\x02\x02\u013A\u013B\x07" + + "v\x02\x02\u013B\u013C\x07t\x02\x02\u013C\u013D\x07w\x02\x02\u013D\u013F" + + "\x07g\x02\x02\u013E\u0135\x03\x02\x02\x02\u013E\u013A\x03\x02\x02\x02" + + "\u013FT\x03\x02\x02\x02\u0140\u0157\x072\x02\x02\u0141\u0147\t\x02\x02" + + "\x02\u0142\u0146\t\x03\x02\x02\u0143\u0144\x07a\x02\x02\u0144\u0146\t" + + "\x03\x02\x02\u0145\u0142\x03\x02\x02\x02\u0145\u0143\x03\x02\x02\x02\u0146" + + "\u0149\x03\x02\x02\x02\u0147\u0145\x03\x02\x02\x02\u0147\u0148\x03\x02" + + "\x02\x02\u0148\u0157\x03\x02\x02\x02\u0149\u0147\x03\x02\x02\x02\u014A" + + "\u014B\x072\x02\x02\u014B\u014C\x07z\x02\x02\u014C\u014D\x03\x02\x02\x02" + + "\u014D\u0153\t\x04\x02\x02\u014E\u0152\t\x04\x02\x02\u014F\u0150\x07a" + + "\x02\x02\u0150\u0152\t\x04\x02\x02\u0151\u014E\x03\x02\x02\x02\u0151\u014F" + + "\x03\x02\x02\x02\u0152\u0155\x03\x02\x02\x02\u0153\u0151\x03\x02\x02\x02" + + "\u0153\u0154\x03\x02\x02\x02\u0154\u0157\x03\x02\x02\x02\u0155\u0153\x03" + + "\x02\x02\x02\u0156\u0140\x03\x02\x02\x02\u0156\u0141\x03\x02\x02\x02\u0156" + + "\u014A\x03\x02\x02\x02\u0157V\x03\x02\x02\x02\u0158\u0159\x07c\x02\x02" + + "\u0159\u015A\x07p\x02\x02\u015A\u015B\x07f\x02\x02\u015BX\x03\x02\x02" + + "\x02\u015C\u015D\x07q\x02\x02\u015D\u015E\x07t\x02\x02\u015EZ\x03\x02" + + "\x02\x02\u015F\u0160\x07k\x02\x02\u0160\u0161\x07h\x02\x02\u0161\u0162" + + "\x07h\x02\x02\u0162\\\x03\x02\x02\x02\u0163\u0164\x07k\x02\x02\u0164\u0165" + + "\x07o\x02\x02\u0165\u0166\x07r\x02\x02\u0166\u0167\x07n\x02\x02\u0167" + + "\u0168\x07k\x02\x02\u0168\u0169\x07g\x02\x02\u0169\u016A\x07u\x02\x02" + + "\u016A^\x03\x02\x02\x02\u016B\u016C\x07O\x02\x02\u016C\u016D\x07c\x02" + + "\x02\u016D\u016E\x07r\x02\x02\u016E`\x03\x02\x02\x02\u016F\u0170\x07o" + + "\x02\x02\u0170\u0171\x07c\x02\x02\u0171\u0172\x07v\x02\x02\u0172\u0173" + + "\x07e\x02\x02\u0173\u0174\x07j\x02\x02\u0174b\x03\x02\x02\x02\u0175\u0176" + + "\x07-\x02\x02\u0176d\x03\x02\x02\x02\u0177\u0178\x07/\x02\x02\u0178f\x03" + + "\x02\x02\x02\u0179\u017A\x07,\x02\x02\u017Ah\x03\x02\x02\x02\u017B\u017C" + + "\x071\x02\x02\u017Cj\x03\x02\x02\x02\u017D\u017E\x07\'\x02\x02\u017El" + + "\x03\x02\x02\x02\u017F\u0180\x07@\x02\x02\u0180n\x03\x02\x02\x02\u0181" + + "\u0182\x07>\x02\x02\u0182p\x03\x02\x02\x02\u0183\u0184\x07@\x02\x02\u0184" + + "\u0185\x07?\x02\x02\u0185r\x03\x02\x02\x02\u0186\u0187\x07>\x02\x02\u0187" + + "\u0188\x07?\x02\x02\u0188t\x03\x02\x02\x02\u0189\u018A\x07#\x02\x02\u018A" + + "\u018B\x07?\x02\x02\u018Bv\x03\x02\x02\x02\u018C\u018D\x07?\x02\x02\u018D" + + "\u018E\x07?\x02\x02\u018Ex\x03\x02\x02\x02\u018F\u0190\x07?\x02\x02\u0190" + + "z\x03\x02\x02\x02\u0191\u0192\x07*\x02\x02\u0192|\x03\x02\x02\x02\u0193" + + "\u0194\x07+\x02\x02\u0194~\x03\x02\x02\x02\u0195\u0196\x07U\x02\x02\u0196" + + "\u0197\x07g\x02\x02\u0197\u0198\x07v\x02\x02\u0198\x80\x03\x02\x02\x02" + + "\u0199\u019A\x07N\x02\x02\u019A\u019B\x07k\x02\x02\u019B\u019C\x07u\x02" + + "\x02\u019C\u019D\x07v\x02\x02\u019D\x82\x03\x02\x02\x02\u019E\u01A2\t" + + "\x05\x02\x02\u019F\u01A1\t\x06\x02\x02\u01A0\u019F\x03\x02\x02\x02\u01A1" + + "\u01A4\x03\x02\x02\x02\u01A2\u01A0\x03\x02\x02\x02\u01A2\u01A3\x03\x02" + + "\x02\x02\u01A3\u01AC\x03\x02\x02\x02\u01A4\u01A2\x03\x02\x02\x02\u01A5" + + "\u01A7\t\x07\x02\x02\u01A6\u01A8\t\x06\x02\x02\u01A7\u01A6\x03\x02\x02" + + "\x02\u01A8\u01A9\x03\x02\x02\x02\u01A9\u01A7\x03\x02\x02\x02\u01A9\u01AA" + + "\x03\x02\x02\x02\u01AA\u01AC\x03\x02\x02\x02\u01AB\u019E\x03\x02\x02\x02" + + "\u01AB\u01A5\x03\x02\x02\x02\u01AC\x84\x03\x02\x02\x02\u01AD\u01B1\t\b" + + "\x02\x02\u01AE\u01B0\t\x06\x02\x02\u01AF\u01AE\x03\x02\x02\x02\u01B0\u01B3" + + "\x03\x02\x02\x02\u01B1\u01AF\x03\x02\x02\x02\u01B1\u01B2\x03\x02\x02\x02" + + "\u01B2\u01BB\x03\x02\x02\x02\u01B3\u01B1\x03\x02\x02\x02\u01B4\u01B6\t" + + "\x07\x02\x02\u01B5\u01B7\t\x06\x02\x02\u01B6\u01B5\x03\x02\x02\x02\u01B7" + + "\u01B8\x03\x02\x02\x02\u01B8\u01B6\x03\x02\x02\x02\u01B8\u01B9\x03\x02" + + "\x02\x02\u01B9\u01BB\x03\x02\x02\x02\u01BA\u01AD\x03\x02\x02\x02\u01BA" + + "\u01B4\x03\x02\x02\x02\u01BB\x86\x03\x02\x02\x02\u01BC\u01BD\x071\x02" + + "\x02\u01BD\u01BE\x071\x02\x02\u01BE\u01BF\x071\x02\x02\u01BF\u01C3\x03" + + "\x02\x02\x02\u01C0\u01C2\v\x02\x02\x02\u01C1\u01C0\x03\x02\x02\x02\u01C2" + + "\u01C5\x03\x02\x02\x02\u01C3\u01C4\x03\x02\x02\x02\u01C3\u01C1\x03\x02" + + "\x02\x02\u01C4\u01C6\x03\x02\x02\x02\u01C5\u01C3\x03\x02\x02\x02\u01C6" + + "\u01C7\x07\f\x02\x02\u01C7\x88\x03\x02\x02\x02\u01C8\u01C9\x071\x02\x02" + + "\u01C9\u01CA\x071\x02\x02\u01CA\u01CE\x03\x02\x02\x02\u01CB\u01CD\v\x02" + + "\x02\x02\u01CC\u01CB\x03\x02\x02\x02\u01CD\u01D0\x03\x02\x02\x02\u01CE" + + "\u01CF\x03\x02\x02\x02\u01CE\u01CC\x03\x02\x02\x02\u01CF\u01D1\x03\x02" + + "\x02\x02\u01D0\u01CE\x03\x02\x02\x02\u01D1\u01D2\x07\f\x02\x02\u01D2\u01D3" + + "\x03\x02\x02\x02\u01D3\u01D4\bE\x02\x02\u01D4\x8A\x03\x02\x02\x02\u01D5" + + "\u01D6\x071\x02\x02\u01D6\u01D7\x07,\x02\x02\u01D7\u01DB\x03\x02\x02\x02" + + "\u01D8\u01DA\v\x02\x02\x02\u01D9\u01D8\x03\x02\x02\x02\u01DA\u01DD\x03" + + "\x02\x02\x02\u01DB\u01DC\x03\x02\x02\x02\u01DB\u01D9\x03\x02\x02\x02\u01DC" + + "\u01DE\x03\x02\x02\x02\u01DD\u01DB\x03\x02\x02\x02\u01DE\u01DF\x07,\x02" + + "\x02\u01DF\u01E0\x071\x02\x02\u01E0\u01E1\x03\x02\x02\x02\u01E1\u01E2" + + "\bF\x02\x02\u01E2\x8C\x03\x02\x02\x02\u01E3\u01E5\t\t\x02\x02\u01E4\u01E3" + + "\x03\x02\x02\x02\u01E5\u01E6\x03\x02\x02\x02\u01E6\u01E4\x03\x02\x02\x02" + + "\u01E6\u01E7\x03\x02\x02\x02\u01E7\u01E8\x03\x02\x02\x02\u01E8\u01E9\b" + + "G\x02\x02\u01E9\x8E\x03\x02\x02\x02\x14\x02\u0130\u013E\u0145\u0147\u0151" + + "\u0153\u0156\u01A2\u01A9\u01AB\u01B1\u01B8\u01BA\u01C3\u01CE\u01DB\u01E6" + + "\x03\b\x02\x02"; public static __ATN: ATN; public static get _ATN(): ATN { if (!QuintLexer.__ATN) { diff --git a/quint/src/generated/QuintListener.ts b/quint/src/generated/QuintListener.ts index b687aeefd..3894383e6 100644 --- a/quint/src/generated/QuintListener.ts +++ b/quint/src/generated/QuintListener.ts @@ -18,9 +18,10 @@ import { TypeRecContext } from "./QuintParser"; import { TypeIntContext } from "./QuintParser"; import { TypeStrContext } from "./QuintParser"; import { TypeBoolContext } from "./QuintParser"; -import { TypeVarContext } from "./QuintParser"; +import { TypeVarCaseContext } from "./QuintParser"; import { TypeConstContext } from "./QuintParser"; import { TypeParenContext } from "./QuintParser"; +import { TypeAppContext } from "./QuintParser"; import { TypeAbstractDefContext } from "./QuintParser"; import { TypeAliasDefContext } from "./QuintParser"; import { TypeSumDefContext } from "./QuintParser"; @@ -68,6 +69,8 @@ import { DocumentedDeclarationContext } from "./QuintParser"; import { DeclarationContext } from "./QuintParser"; import { OperDefContext } from "./QuintParser"; import { TypeDefContext } from "./QuintParser"; +import { TypeDefHeadContext } from "./QuintParser"; +import { SumTypeDefinitionContext } from "./QuintParser"; import { TypeSumVariantContext } from "./QuintParser"; import { NondetOperDefContext } from "./QuintParser"; import { QualifierContext } from "./QuintParser"; @@ -79,6 +82,7 @@ import { NameContext } from "./QuintParser"; import { QualifiedNameContext } from "./QuintParser"; import { FromSourceContext } from "./QuintParser"; import { TypeContext } from "./QuintParser"; +import { TypeVarContext } from "./QuintParser"; import { RowContext } from "./QuintParser"; import { RowLabelContext } from "./QuintParser"; import { ExprContext } from "./QuintParser"; @@ -226,17 +230,17 @@ export interface QuintListener extends ParseTreeListener { exitTypeBool?: (ctx: TypeBoolContext) => void; /** - * Enter a parse tree produced by the `typeVar` + * Enter a parse tree produced by the `typeVarCase` * labeled alternative in `QuintParser.type`. * @param ctx the parse tree */ - enterTypeVar?: (ctx: TypeVarContext) => void; + enterTypeVarCase?: (ctx: TypeVarCaseContext) => void; /** - * Exit a parse tree produced by the `typeVar` + * Exit a parse tree produced by the `typeVarCase` * labeled alternative in `QuintParser.type`. * @param ctx the parse tree */ - exitTypeVar?: (ctx: TypeVarContext) => void; + exitTypeVarCase?: (ctx: TypeVarCaseContext) => void; /** * Enter a parse tree produced by the `typeConst` @@ -264,6 +268,19 @@ export interface QuintListener extends ParseTreeListener { */ exitTypeParen?: (ctx: TypeParenContext) => void; + /** + * Enter a parse tree produced by the `typeApp` + * labeled alternative in `QuintParser.type`. + * @param ctx the parse tree + */ + enterTypeApp?: (ctx: TypeAppContext) => void; + /** + * Exit a parse tree produced by the `typeApp` + * labeled alternative in `QuintParser.type`. + * @param ctx the parse tree + */ + exitTypeApp?: (ctx: TypeAppContext) => void; + /** * Enter a parse tree produced by the `typeAbstractDef` * labeled alternative in `QuintParser.typeDef`. @@ -863,6 +880,28 @@ export interface QuintListener extends ParseTreeListener { */ exitTypeDef?: (ctx: TypeDefContext) => void; + /** + * Enter a parse tree produced by `QuintParser.typeDefHead`. + * @param ctx the parse tree + */ + enterTypeDefHead?: (ctx: TypeDefHeadContext) => void; + /** + * Exit a parse tree produced by `QuintParser.typeDefHead`. + * @param ctx the parse tree + */ + exitTypeDefHead?: (ctx: TypeDefHeadContext) => void; + + /** + * Enter a parse tree produced by `QuintParser.sumTypeDefinition`. + * @param ctx the parse tree + */ + enterSumTypeDefinition?: (ctx: SumTypeDefinitionContext) => void; + /** + * Exit a parse tree produced by `QuintParser.sumTypeDefinition`. + * @param ctx the parse tree + */ + exitSumTypeDefinition?: (ctx: SumTypeDefinitionContext) => void; + /** * Enter a parse tree produced by `QuintParser.typeSumVariant`. * @param ctx the parse tree @@ -984,6 +1023,17 @@ export interface QuintListener extends ParseTreeListener { */ exitType?: (ctx: TypeContext) => void; + /** + * Enter a parse tree produced by `QuintParser.typeVar`. + * @param ctx the parse tree + */ + enterTypeVar?: (ctx: TypeVarContext) => void; + /** + * Exit a parse tree produced by `QuintParser.typeVar`. + * @param ctx the parse tree + */ + exitTypeVar?: (ctx: TypeVarContext) => void; + /** * Enter a parse tree produced by `QuintParser.row`. * @param ctx the parse tree diff --git a/quint/src/generated/QuintParser.ts b/quint/src/generated/QuintParser.ts index 8a95eddc0..53294b225 100644 --- a/quint/src/generated/QuintParser.ts +++ b/quint/src/generated/QuintParser.ts @@ -80,24 +80,24 @@ export class QuintParser extends Parser { public static readonly OR = 44; public static readonly IFF = 45; public static readonly IMPLIES = 46; - public static readonly SET = 47; - public static readonly LIST = 48; - public static readonly MAP = 49; - public static readonly MATCH = 50; - public static readonly PLUS = 51; - public static readonly MINUS = 52; - public static readonly MUL = 53; - public static readonly DIV = 54; - public static readonly MOD = 55; - public static readonly GT = 56; - public static readonly LT = 57; - public static readonly GE = 58; - public static readonly LE = 59; - public static readonly NE = 60; - public static readonly EQ = 61; - public static readonly ASGN = 62; - public static readonly LPAREN = 63; - public static readonly RPAREN = 64; + public static readonly MAP = 47; + public static readonly MATCH = 48; + public static readonly PLUS = 49; + public static readonly MINUS = 50; + public static readonly MUL = 51; + public static readonly DIV = 52; + public static readonly MOD = 53; + public static readonly GT = 54; + public static readonly LT = 55; + public static readonly GE = 56; + public static readonly LE = 57; + public static readonly NE = 58; + public static readonly EQ = 59; + public static readonly ASGN = 60; + public static readonly LPAREN = 61; + public static readonly RPAREN = 62; + public static readonly SET = 63; + public static readonly LIST = 64; public static readonly LOW_ID = 65; public static readonly CAP_ID = 66; public static readonly DOCCOMMENT = 67; @@ -110,59 +110,63 @@ export class QuintParser extends Parser { public static readonly RULE_declaration = 3; public static readonly RULE_operDef = 4; public static readonly RULE_typeDef = 5; - public static readonly RULE_typeSumVariant = 6; - public static readonly RULE_nondetOperDef = 7; - public static readonly RULE_qualifier = 8; - public static readonly RULE_importMod = 9; - public static readonly RULE_exportMod = 10; - public static readonly RULE_instanceMod = 11; - public static readonly RULE_moduleName = 12; - public static readonly RULE_name = 13; - public static readonly RULE_qualifiedName = 14; - public static readonly RULE_fromSource = 15; - public static readonly RULE_type = 16; - public static readonly RULE_row = 17; - public static readonly RULE_rowLabel = 18; - public static readonly RULE_expr = 19; - public static readonly RULE_matchSumExpr = 20; - public static readonly RULE_matchSumCase = 21; - public static readonly RULE_matchSumVariant = 22; - public static readonly RULE_declarationOrExpr = 23; - public static readonly RULE_lambda = 24; - public static readonly RULE_lambdaUnsugared = 25; - public static readonly RULE_lambdaTupleSugar = 26; - public static readonly RULE_identOrHole = 27; - public static readonly RULE_parameter = 28; - public static readonly RULE_identOrStar = 29; - public static readonly RULE_argList = 30; - public static readonly RULE_recElem = 31; - public static readonly RULE_normalCallName = 32; - public static readonly RULE_nameAfterDot = 33; - public static readonly RULE_operator = 34; - public static readonly RULE_literal = 35; - public static readonly RULE_qualId = 36; - public static readonly RULE_simpleId = 37; - public static readonly RULE_identifier = 38; + public static readonly RULE_typeDefHead = 6; + public static readonly RULE_sumTypeDefinition = 7; + public static readonly RULE_typeSumVariant = 8; + public static readonly RULE_nondetOperDef = 9; + public static readonly RULE_qualifier = 10; + public static readonly RULE_importMod = 11; + public static readonly RULE_exportMod = 12; + public static readonly RULE_instanceMod = 13; + public static readonly RULE_moduleName = 14; + public static readonly RULE_name = 15; + public static readonly RULE_qualifiedName = 16; + public static readonly RULE_fromSource = 17; + public static readonly RULE_type = 18; + public static readonly RULE_typeVar = 19; + public static readonly RULE_row = 20; + public static readonly RULE_rowLabel = 21; + public static readonly RULE_expr = 22; + public static readonly RULE_matchSumExpr = 23; + public static readonly RULE_matchSumCase = 24; + public static readonly RULE_matchSumVariant = 25; + public static readonly RULE_declarationOrExpr = 26; + public static readonly RULE_lambda = 27; + public static readonly RULE_lambdaUnsugared = 28; + public static readonly RULE_lambdaTupleSugar = 29; + public static readonly RULE_identOrHole = 30; + public static readonly RULE_parameter = 31; + public static readonly RULE_identOrStar = 32; + public static readonly RULE_argList = 33; + public static readonly RULE_recElem = 34; + public static readonly RULE_normalCallName = 35; + public static readonly RULE_nameAfterDot = 36; + public static readonly RULE_operator = 37; + public static readonly RULE_literal = 38; + public static readonly RULE_qualId = 39; + public static readonly RULE_simpleId = 40; + public static readonly RULE_identifier = 41; // tslint:disable:no-trailing-whitespace public static readonly ruleNames: string[] = [ "modules", "module", "documentedDeclaration", "declaration", "operDef", - "typeDef", "typeSumVariant", "nondetOperDef", "qualifier", "importMod", - "exportMod", "instanceMod", "moduleName", "name", "qualifiedName", "fromSource", - "type", "row", "rowLabel", "expr", "matchSumExpr", "matchSumCase", "matchSumVariant", - "declarationOrExpr", "lambda", "lambdaUnsugared", "lambdaTupleSugar", - "identOrHole", "parameter", "identOrStar", "argList", "recElem", "normalCallName", - "nameAfterDot", "operator", "literal", "qualId", "simpleId", "identifier", + "typeDef", "typeDefHead", "sumTypeDefinition", "typeSumVariant", "nondetOperDef", + "qualifier", "importMod", "exportMod", "instanceMod", "moduleName", "name", + "qualifiedName", "fromSource", "type", "typeVar", "row", "rowLabel", "expr", + "matchSumExpr", "matchSumCase", "matchSumVariant", "declarationOrExpr", + "lambda", "lambdaUnsugared", "lambdaTupleSugar", "identOrHole", "parameter", + "identOrStar", "argList", "recElem", "normalCallName", "nameAfterDot", + "operator", "literal", "qualId", "simpleId", "identifier", ]; private static readonly _LITERAL_NAMES: Array = [ undefined, "'module'", "'{'", "'}'", "'const'", "':'", "'var'", "'assume'", - "','", "';'", "'type'", "'|'", "'nondet'", "'val'", "'def'", "'pure'", - "'action'", "'run'", "'temporal'", "'import'", "'.'", "'from'", "'as'", - "'export'", "'->'", "'=>'", "'['", "']'", "'int'", "'str'", "'bool'", - "'^'", "'''", "'all'", "'any'", "'if'", "'else'", "'_'", "'...'", "'::'", - undefined, undefined, undefined, "'and'", "'or'", "'iff'", "'implies'", - "'Set'", "'List'", "'Map'", "'match'", "'+'", "'-'", "'*'", "'/'", "'%'", - "'>'", "'<'", "'>='", "'<='", "'!='", "'=='", "'='", "'('", "')'", + "','", "';'", "'type'", "'['", "']'", "'|'", "'nondet'", "'val'", "'def'", + "'pure'", "'action'", "'run'", "'temporal'", "'import'", "'.'", "'from'", + "'as'", "'export'", "'->'", "'=>'", "'int'", "'str'", "'bool'", "'^'", + "'''", "'all'", "'any'", "'if'", "'else'", "'_'", "'...'", "'::'", undefined, + undefined, undefined, "'and'", "'or'", "'iff'", "'implies'", "'Map'", + "'match'", "'+'", "'-'", "'*'", "'/'", "'%'", "'>'", "'<'", "'>='", "'<='", + "'!='", "'=='", "'='", "'('", "')'", "'Set'", "'List'", ]; private static readonly _SYMBOLIC_NAMES: Array = [ undefined, undefined, undefined, undefined, undefined, undefined, undefined, @@ -171,9 +175,9 @@ export class QuintParser extends Parser { undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, "STRING", "BOOL", - "INT", "AND", "OR", "IFF", "IMPLIES", "SET", "LIST", "MAP", "MATCH", "PLUS", - "MINUS", "MUL", "DIV", "MOD", "GT", "LT", "GE", "LE", "NE", "EQ", "ASGN", - "LPAREN", "RPAREN", "LOW_ID", "CAP_ID", "DOCCOMMENT", "LINE_COMMENT", + "INT", "AND", "OR", "IFF", "IMPLIES", "MAP", "MATCH", "PLUS", "MINUS", + "MUL", "DIV", "MOD", "GT", "LT", "GE", "LE", "NE", "EQ", "ASGN", "LPAREN", + "RPAREN", "SET", "LIST", "LOW_ID", "CAP_ID", "DOCCOMMENT", "LINE_COMMENT", "COMMENT", "WS", ]; public static readonly VOCABULARY: Vocabulary = new VocabularyImpl(QuintParser._LITERAL_NAMES, QuintParser._SYMBOLIC_NAMES, []); @@ -210,21 +214,21 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 79; + this.state = 85; this._errHandler.sync(this); _la = this._input.LA(1); do { { { - this.state = 78; + this.state = 84; this.module(); } } - this.state = 81; + this.state = 87; this._errHandler.sync(this); _la = this._input.LA(1); } while (_la === QuintParser.T__0 || _la === QuintParser.DOCCOMMENT); - this.state = 83; + this.state = 89; this.match(QuintParser.EOF); } } @@ -250,41 +254,41 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 88; + this.state = 94; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.DOCCOMMENT) { { { - this.state = 85; + this.state = 91; this.match(QuintParser.DOCCOMMENT); } } - this.state = 90; + this.state = 96; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 91; + this.state = 97; this.match(QuintParser.T__0); - this.state = 92; + this.state = 98; this.qualId(); - this.state = 93; + this.state = 99; this.match(QuintParser.T__1); - this.state = 97; + this.state = 103; this._errHandler.sync(this); _la = this._input.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__3) | (1 << QuintParser.T__5) | (1 << QuintParser.T__6) | (1 << QuintParser.T__9) | (1 << QuintParser.T__12) | (1 << QuintParser.T__13) | (1 << QuintParser.T__14) | (1 << QuintParser.T__15) | (1 << QuintParser.T__16) | (1 << QuintParser.T__17) | (1 << QuintParser.T__18) | (1 << QuintParser.T__22))) !== 0) || _la === QuintParser.DOCCOMMENT) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__3) | (1 << QuintParser.T__5) | (1 << QuintParser.T__6) | (1 << QuintParser.T__9) | (1 << QuintParser.T__14) | (1 << QuintParser.T__15) | (1 << QuintParser.T__16) | (1 << QuintParser.T__17) | (1 << QuintParser.T__18) | (1 << QuintParser.T__19) | (1 << QuintParser.T__20) | (1 << QuintParser.T__24))) !== 0) || _la === QuintParser.DOCCOMMENT) { { { - this.state = 94; + this.state = 100; this.documentedDeclaration(); } } - this.state = 99; + this.state = 105; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 100; + this.state = 106; this.match(QuintParser.T__2); } } @@ -310,21 +314,21 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 105; + this.state = 111; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.DOCCOMMENT) { { { - this.state = 102; + this.state = 108; this.match(QuintParser.DOCCOMMENT); } } - this.state = 107; + this.state = 113; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 108; + this.state = 114; this.declaration(); } } @@ -347,20 +351,20 @@ export class QuintParser extends Parser { let _localctx: DeclarationContext = new DeclarationContext(this._ctx, this.state); this.enterRule(_localctx, 6, QuintParser.RULE_declaration); try { - this.state = 130; + this.state = 136; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 4, this._ctx) ) { case 1: _localctx = new ConstContext(_localctx); this.enterOuterAlt(_localctx, 1); { - this.state = 110; + this.state = 116; this.match(QuintParser.T__3); - this.state = 111; + this.state = 117; this.qualId(); - this.state = 112; + this.state = 118; this.match(QuintParser.T__4); - this.state = 113; + this.state = 119; this.type(0); } break; @@ -369,13 +373,13 @@ export class QuintParser extends Parser { _localctx = new VarContext(_localctx); this.enterOuterAlt(_localctx, 2); { - this.state = 115; + this.state = 121; this.match(QuintParser.T__5); - this.state = 116; + this.state = 122; this.qualId(); - this.state = 117; + this.state = 123; this.match(QuintParser.T__4); - this.state = 118; + this.state = 124; this.type(0); } break; @@ -384,13 +388,13 @@ export class QuintParser extends Parser { _localctx = new AssumeContext(_localctx); this.enterOuterAlt(_localctx, 3); { - this.state = 120; + this.state = 126; this.match(QuintParser.T__6); - this.state = 121; + this.state = 127; this.identOrHole(); - this.state = 122; + this.state = 128; this.match(QuintParser.ASGN); - this.state = 123; + this.state = 129; this.expr(0); } break; @@ -399,7 +403,7 @@ export class QuintParser extends Parser { _localctx = new InstanceContext(_localctx); this.enterOuterAlt(_localctx, 4); { - this.state = 125; + this.state = 131; this.instanceMod(); } break; @@ -408,7 +412,7 @@ export class QuintParser extends Parser { _localctx = new OperContext(_localctx); this.enterOuterAlt(_localctx, 5); { - this.state = 126; + this.state = 132; this.operDef(); } break; @@ -417,7 +421,7 @@ export class QuintParser extends Parser { _localctx = new TypeDefsContext(_localctx); this.enterOuterAlt(_localctx, 6); { - this.state = 127; + this.state = 133; this.typeDef(); } break; @@ -426,7 +430,7 @@ export class QuintParser extends Parser { _localctx = new ImportDefContext(_localctx); this.enterOuterAlt(_localctx, 7); { - this.state = 128; + this.state = 134; this.importMod(); } break; @@ -435,7 +439,7 @@ export class QuintParser extends Parser { _localctx = new ExportDefContext(_localctx); this.enterOuterAlt(_localctx, 8); { - this.state = 129; + this.state = 135; this.exportMod(); } break; @@ -463,53 +467,53 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 132; + this.state = 138; this.qualifier(); - this.state = 133; + this.state = 139; this.normalCallName(); - this.state = 170; + this.state = 176; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 9, this._ctx) ) { case 1: { - this.state = 134; + this.state = 140; this.match(QuintParser.LPAREN); - this.state = 143; + this.state = 149; this._errHandler.sync(this); _la = this._input.LA(1); if (((((_la - 37)) & ~0x1F) === 0 && ((1 << (_la - 37)) & ((1 << (QuintParser.T__36 - 37)) | (1 << (QuintParser.LOW_ID - 37)) | (1 << (QuintParser.CAP_ID - 37)))) !== 0)) { { - this.state = 135; + this.state = 141; this.parameter(); - this.state = 140; + this.state = 146; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 136; + this.state = 142; this.match(QuintParser.T__7); - this.state = 137; + this.state = 143; this.parameter(); } } - this.state = 142; + this.state = 148; this._errHandler.sync(this); _la = this._input.LA(1); } } } - this.state = 145; + this.state = 151; this.match(QuintParser.RPAREN); - this.state = 148; + this.state = 154; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__4) { { - this.state = 146; + this.state = 152; this.match(QuintParser.T__4); - this.state = 147; + this.state = 153; this.type(0); } } @@ -519,72 +523,72 @@ export class QuintParser extends Parser { case 2: { - this.state = 150; + this.state = 156; this.match(QuintParser.T__4); - this.state = 151; + this.state = 157; this.type(0); } break; case 3: { - this.state = 152; + this.state = 158; this.match(QuintParser.LPAREN); { - this.state = 153; + this.state = 159; this.parameter(); - this.state = 154; + this.state = 160; this.match(QuintParser.T__4); - this.state = 155; + this.state = 161; this.type(0); - this.state = 163; + this.state = 169; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 156; + this.state = 162; this.match(QuintParser.T__7); - this.state = 157; + this.state = 163; this.parameter(); - this.state = 158; + this.state = 164; this.match(QuintParser.T__4); - this.state = 159; + this.state = 165; this.type(0); } } - this.state = 165; + this.state = 171; this._errHandler.sync(this); _la = this._input.LA(1); } } - this.state = 166; + this.state = 172; this.match(QuintParser.RPAREN); - this.state = 167; + this.state = 173; this.match(QuintParser.T__4); - this.state = 168; + this.state = 174; this.type(0); } break; } - this.state = 174; + this.state = 180; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.ASGN) { { - this.state = 172; + this.state = 178; this.match(QuintParser.ASGN); - this.state = 173; + this.state = 179; this.expr(0); } } - this.state = 177; + this.state = 183; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__8) { { - this.state = 176; + this.state = 182; this.match(QuintParser.T__8); } } @@ -609,18 +613,17 @@ export class QuintParser extends Parser { public typeDef(): TypeDefContext { let _localctx: TypeDefContext = new TypeDefContext(this._ctx, this.state); this.enterRule(_localctx, 10, QuintParser.RULE_typeDef); - let _la: number; try { - this.state = 200; + this.state = 197; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 14, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 12, this._ctx) ) { case 1: _localctx = new TypeAbstractDefContext(_localctx); this.enterOuterAlt(_localctx, 1); { - this.state = 179; + this.state = 185; this.match(QuintParser.T__9); - this.state = 180; + this.state = 186; this.qualId(); } break; @@ -629,13 +632,13 @@ export class QuintParser extends Parser { _localctx = new TypeAliasDefContext(_localctx); this.enterOuterAlt(_localctx, 2); { - this.state = 181; + this.state = 187; this.match(QuintParser.T__9); - this.state = 182; - this.qualId(); - this.state = 183; + this.state = 188; + this.typeDefHead(); + this.state = 189; this.match(QuintParser.ASGN); - this.state = 184; + this.state = 190; this.type(0); } break; @@ -644,42 +647,126 @@ export class QuintParser extends Parser { _localctx = new TypeSumDefContext(_localctx); this.enterOuterAlt(_localctx, 3); { - this.state = 186; + this.state = 192; this.match(QuintParser.T__9); - this.state = 187; - (_localctx as TypeSumDefContext)._typeName = this.qualId(); - this.state = 188; + this.state = 193; + this.typeDefHead(); + this.state = 194; this.match(QuintParser.ASGN); - this.state = 190; - this._errHandler.sync(this); - _la = this._input.LA(1); - if (_la === QuintParser.T__10) { - { - this.state = 189; - this.match(QuintParser.T__10); - } + this.state = 195; + this.sumTypeDefinition(); } - - this.state = 192; - this.typeSumVariant(); - this.state = 197; + break; + } + } + catch (re) { + if (re instanceof RecognitionException) { + _localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return _localctx; + } + // @RuleVersion(0) + public typeDefHead(): TypeDefHeadContext { + let _localctx: TypeDefHeadContext = new TypeDefHeadContext(this._ctx, this.state); + this.enterRule(_localctx, 12, QuintParser.RULE_typeDefHead); + let _la: number; + try { + this.enterOuterAlt(_localctx, 1); + { + this.state = 199; + _localctx._typeName = this.qualId(); + this.state = 211; + this._errHandler.sync(this); + _la = this._input.LA(1); + if (_la === QuintParser.T__10) { + { + this.state = 200; + this.match(QuintParser.T__10); + this.state = 201; + _localctx._typeVar = this.typeVar(); + _localctx._typeVars.push(_localctx._typeVar); + this.state = 206; this._errHandler.sync(this); _la = this._input.LA(1); - while (_la === QuintParser.T__10) { + while (_la === QuintParser.T__7) { { { - this.state = 193; - this.match(QuintParser.T__10); - this.state = 194; - this.typeSumVariant(); + this.state = 202; + this.match(QuintParser.T__7); + this.state = 203; + _localctx._typeVar = this.typeVar(); + _localctx._typeVars.push(_localctx._typeVar); } } - this.state = 199; + this.state = 208; this._errHandler.sync(this); _la = this._input.LA(1); } + this.state = 209; + this.match(QuintParser.T__11); } - break; + } + + } + } + catch (re) { + if (re instanceof RecognitionException) { + _localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return _localctx; + } + // @RuleVersion(0) + public sumTypeDefinition(): SumTypeDefinitionContext { + let _localctx: SumTypeDefinitionContext = new SumTypeDefinitionContext(this._ctx, this.state); + this.enterRule(_localctx, 14, QuintParser.RULE_sumTypeDefinition); + let _la: number; + try { + this.enterOuterAlt(_localctx, 1); + { + this.state = 214; + this._errHandler.sync(this); + _la = this._input.LA(1); + if (_la === QuintParser.T__12) { + { + this.state = 213; + this.match(QuintParser.T__12); + } + } + + this.state = 216; + this.typeSumVariant(); + this.state = 221; + this._errHandler.sync(this); + _la = this._input.LA(1); + while (_la === QuintParser.T__12) { + { + { + this.state = 217; + this.match(QuintParser.T__12); + this.state = 218; + this.typeSumVariant(); + } + } + this.state = 223; + this._errHandler.sync(this); + _la = this._input.LA(1); + } } } catch (re) { @@ -699,23 +786,23 @@ export class QuintParser extends Parser { // @RuleVersion(0) public typeSumVariant(): TypeSumVariantContext { let _localctx: TypeSumVariantContext = new TypeSumVariantContext(this._ctx, this.state); - this.enterRule(_localctx, 12, QuintParser.RULE_typeSumVariant); + this.enterRule(_localctx, 16, QuintParser.RULE_typeSumVariant); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 202; + this.state = 224; _localctx._sumLabel = this.simpleId("variant label"); - this.state = 207; + this.state = 229; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.LPAREN) { { - this.state = 203; + this.state = 225; this.match(QuintParser.LPAREN); - this.state = 204; + this.state = 226; this.type(0); - this.state = 205; + this.state = 227; this.match(QuintParser.RPAREN); } } @@ -739,37 +826,37 @@ export class QuintParser extends Parser { // @RuleVersion(0) public nondetOperDef(): NondetOperDefContext { let _localctx: NondetOperDefContext = new NondetOperDefContext(this._ctx, this.state); - this.enterRule(_localctx, 14, QuintParser.RULE_nondetOperDef); + this.enterRule(_localctx, 18, QuintParser.RULE_nondetOperDef); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 209; - this.match(QuintParser.T__11); - this.state = 210; + this.state = 231; + this.match(QuintParser.T__13); + this.state = 232; this.qualId(); - this.state = 213; + this.state = 235; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__4) { { - this.state = 211; + this.state = 233; this.match(QuintParser.T__4); - this.state = 212; + this.state = 234; this.type(0); } } - this.state = 215; + this.state = 237; this.match(QuintParser.ASGN); - this.state = 216; + this.state = 238; this.expr(0); - this.state = 218; + this.state = 240; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__8) { { - this.state = 217; + this.state = 239; this.match(QuintParser.T__8); } } @@ -793,68 +880,68 @@ export class QuintParser extends Parser { // @RuleVersion(0) public qualifier(): QualifierContext { let _localctx: QualifierContext = new QualifierContext(this._ctx, this.state); - this.enterRule(_localctx, 16, QuintParser.RULE_qualifier); + this.enterRule(_localctx, 20, QuintParser.RULE_qualifier); try { - this.state = 229; + this.state = 251; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 18, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 20, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 220; - this.match(QuintParser.T__12); + this.state = 242; + this.match(QuintParser.T__14); } break; case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 221; - this.match(QuintParser.T__13); + this.state = 243; + this.match(QuintParser.T__15); } break; case 3: this.enterOuterAlt(_localctx, 3); { - this.state = 222; + this.state = 244; + this.match(QuintParser.T__16); + this.state = 245; this.match(QuintParser.T__14); - this.state = 223; - this.match(QuintParser.T__12); } break; case 4: this.enterOuterAlt(_localctx, 4); { - this.state = 224; - this.match(QuintParser.T__14); - this.state = 225; - this.match(QuintParser.T__13); + this.state = 246; + this.match(QuintParser.T__16); + this.state = 247; + this.match(QuintParser.T__15); } break; case 5: this.enterOuterAlt(_localctx, 5); { - this.state = 226; - this.match(QuintParser.T__15); + this.state = 248; + this.match(QuintParser.T__17); } break; case 6: this.enterOuterAlt(_localctx, 6); { - this.state = 227; - this.match(QuintParser.T__16); + this.state = 249; + this.match(QuintParser.T__18); } break; case 7: this.enterOuterAlt(_localctx, 7); { - this.state = 228; - this.match(QuintParser.T__17); + this.state = 250; + this.match(QuintParser.T__19); } break; } @@ -876,31 +963,31 @@ export class QuintParser extends Parser { // @RuleVersion(0) public importMod(): ImportModContext { let _localctx: ImportModContext = new ImportModContext(this._ctx, this.state); - this.enterRule(_localctx, 18, QuintParser.RULE_importMod); + this.enterRule(_localctx, 22, QuintParser.RULE_importMod); let _la: number; try { - this.state = 249; + this.state = 271; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 22, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 24, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 231; - this.match(QuintParser.T__18); - this.state = 232; + this.state = 253; + this.match(QuintParser.T__20); + this.state = 254; this.name(); - this.state = 233; - this.match(QuintParser.T__19); - this.state = 234; + this.state = 255; + this.match(QuintParser.T__21); + this.state = 256; this.identOrStar(); - this.state = 237; + this.state = 259; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la === QuintParser.T__20) { + if (_la === QuintParser.T__22) { { - this.state = 235; - this.match(QuintParser.T__20); - this.state = 236; + this.state = 257; + this.match(QuintParser.T__22); + this.state = 258; this.fromSource(); } } @@ -911,30 +998,30 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 239; - this.match(QuintParser.T__18); - this.state = 240; + this.state = 261; + this.match(QuintParser.T__20); + this.state = 262; this.name(); - this.state = 243; + this.state = 265; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la === QuintParser.T__21) { + if (_la === QuintParser.T__23) { { - this.state = 241; - this.match(QuintParser.T__21); - this.state = 242; + this.state = 263; + this.match(QuintParser.T__23); + this.state = 264; this.name(); } } - this.state = 247; + this.state = 269; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la === QuintParser.T__20) { + if (_la === QuintParser.T__22) { { - this.state = 245; - this.match(QuintParser.T__20); - this.state = 246; + this.state = 267; + this.match(QuintParser.T__22); + this.state = 268; this.fromSource(); } } @@ -960,22 +1047,22 @@ export class QuintParser extends Parser { // @RuleVersion(0) public exportMod(): ExportModContext { let _localctx: ExportModContext = new ExportModContext(this._ctx, this.state); - this.enterRule(_localctx, 20, QuintParser.RULE_exportMod); + this.enterRule(_localctx, 24, QuintParser.RULE_exportMod); let _la: number; try { - this.state = 262; + this.state = 284; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 24, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 26, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 251; - this.match(QuintParser.T__22); - this.state = 252; + this.state = 273; + this.match(QuintParser.T__24); + this.state = 274; this.name(); - this.state = 253; - this.match(QuintParser.T__19); - this.state = 254; + this.state = 275; + this.match(QuintParser.T__21); + this.state = 276; this.identOrStar(); } break; @@ -983,18 +1070,18 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 256; - this.match(QuintParser.T__22); - this.state = 257; + this.state = 278; + this.match(QuintParser.T__24); + this.state = 279; this.name(); - this.state = 260; + this.state = 282; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la === QuintParser.T__21) { + if (_la === QuintParser.T__23) { { - this.state = 258; - this.match(QuintParser.T__21); - this.state = 259; + this.state = 280; + this.match(QuintParser.T__23); + this.state = 281; this.name(); } } @@ -1020,63 +1107,63 @@ export class QuintParser extends Parser { // @RuleVersion(0) public instanceMod(): InstanceModContext { let _localctx: InstanceModContext = new InstanceModContext(this._ctx, this.state); - this.enterRule(_localctx, 22, QuintParser.RULE_instanceMod); + this.enterRule(_localctx, 26, QuintParser.RULE_instanceMod); let _la: number; try { - this.state = 310; + this.state = 332; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 29, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 31, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 264; - this.match(QuintParser.T__18); - this.state = 265; + this.state = 286; + this.match(QuintParser.T__20); + this.state = 287; this.moduleName(); - this.state = 266; + this.state = 288; this.match(QuintParser.LPAREN); { - this.state = 267; + this.state = 289; this.name(); - this.state = 268; + this.state = 290; this.match(QuintParser.ASGN); - this.state = 269; + this.state = 291; this.expr(0); - this.state = 277; + this.state = 299; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 270; + this.state = 292; this.match(QuintParser.T__7); - this.state = 271; + this.state = 293; this.name(); - this.state = 272; + this.state = 294; this.match(QuintParser.ASGN); - this.state = 273; + this.state = 295; this.expr(0); } } - this.state = 279; + this.state = 301; this._errHandler.sync(this); _la = this._input.LA(1); } } - this.state = 280; + this.state = 302; this.match(QuintParser.RPAREN); - this.state = 281; - this.match(QuintParser.T__19); - this.state = 282; + this.state = 303; + this.match(QuintParser.T__21); + this.state = 304; this.match(QuintParser.MUL); - this.state = 285; + this.state = 307; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la === QuintParser.T__20) { + if (_la === QuintParser.T__22) { { - this.state = 283; - this.match(QuintParser.T__20); - this.state = 284; + this.state = 305; + this.match(QuintParser.T__22); + this.state = 306; this.fromSource(); } } @@ -1087,54 +1174,54 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 287; - this.match(QuintParser.T__18); - this.state = 288; + this.state = 309; + this.match(QuintParser.T__20); + this.state = 310; this.moduleName(); - this.state = 289; + this.state = 311; this.match(QuintParser.LPAREN); { - this.state = 290; + this.state = 312; this.name(); - this.state = 291; + this.state = 313; this.match(QuintParser.ASGN); - this.state = 292; + this.state = 314; this.expr(0); - this.state = 300; + this.state = 322; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 293; + this.state = 315; this.match(QuintParser.T__7); - this.state = 294; + this.state = 316; this.name(); - this.state = 295; + this.state = 317; this.match(QuintParser.ASGN); - this.state = 296; + this.state = 318; this.expr(0); } } - this.state = 302; + this.state = 324; this._errHandler.sync(this); _la = this._input.LA(1); } } - this.state = 303; + this.state = 325; this.match(QuintParser.RPAREN); - this.state = 304; - this.match(QuintParser.T__21); - this.state = 305; + this.state = 326; + this.match(QuintParser.T__23); + this.state = 327; this.qualifiedName(); - this.state = 308; + this.state = 330; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la === QuintParser.T__20) { + if (_la === QuintParser.T__22) { { - this.state = 306; - this.match(QuintParser.T__20); - this.state = 307; + this.state = 328; + this.match(QuintParser.T__22); + this.state = 329; this.fromSource(); } } @@ -1160,11 +1247,11 @@ export class QuintParser extends Parser { // @RuleVersion(0) public moduleName(): ModuleNameContext { let _localctx: ModuleNameContext = new ModuleNameContext(this._ctx, this.state); - this.enterRule(_localctx, 24, QuintParser.RULE_moduleName); + this.enterRule(_localctx, 28, QuintParser.RULE_moduleName); try { this.enterOuterAlt(_localctx, 1); { - this.state = 312; + this.state = 334; this.qualId(); } } @@ -1185,11 +1272,11 @@ export class QuintParser extends Parser { // @RuleVersion(0) public name(): NameContext { let _localctx: NameContext = new NameContext(this._ctx, this.state); - this.enterRule(_localctx, 26, QuintParser.RULE_name); + this.enterRule(_localctx, 30, QuintParser.RULE_name); try { this.enterOuterAlt(_localctx, 1); { - this.state = 314; + this.state = 336; this.qualId(); } } @@ -1210,11 +1297,11 @@ export class QuintParser extends Parser { // @RuleVersion(0) public qualifiedName(): QualifiedNameContext { let _localctx: QualifiedNameContext = new QualifiedNameContext(this._ctx, this.state); - this.enterRule(_localctx, 28, QuintParser.RULE_qualifiedName); + this.enterRule(_localctx, 32, QuintParser.RULE_qualifiedName); try { this.enterOuterAlt(_localctx, 1); { - this.state = 316; + this.state = 338; this.qualId(); } } @@ -1235,11 +1322,11 @@ export class QuintParser extends Parser { // @RuleVersion(0) public fromSource(): FromSourceContext { let _localctx: FromSourceContext = new FromSourceContext(this._ctx, this.state); - this.enterRule(_localctx, 30, QuintParser.RULE_fromSource); + this.enterRule(_localctx, 34, QuintParser.RULE_fromSource); try { this.enterOuterAlt(_localctx, 1); { - this.state = 318; + this.state = 340; this.match(QuintParser.STRING); } } @@ -1270,68 +1357,68 @@ export class QuintParser extends Parser { let _parentState: number = this.state; let _localctx: TypeContext = new TypeContext(this._ctx, _parentState); let _prevctx: TypeContext = _localctx; - let _startState: number = 32; - this.enterRecursionRule(_localctx, 32, QuintParser.RULE_type, _p); + let _startState: number = 36; + this.enterRecursionRule(_localctx, 36, QuintParser.RULE_type, _p); let _la: number; try { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 377; + this.state = 400; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 35, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 38, this._ctx) ) { case 1: { _localctx = new TypeOperContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 321; + this.state = 343; this.match(QuintParser.LPAREN); - this.state = 330; + this.state = 352; this._errHandler.sync(this); _la = this._input.LA(1); - if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__27) | (1 << QuintParser.T__28) | (1 << QuintParser.T__29))) !== 0) || ((((_la - 47)) & ~0x1F) === 0 && ((1 << (_la - 47)) & ((1 << (QuintParser.SET - 47)) | (1 << (QuintParser.LIST - 47)) | (1 << (QuintParser.LPAREN - 47)) | (1 << (QuintParser.LOW_ID - 47)) | (1 << (QuintParser.CAP_ID - 47)))) !== 0)) { + if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__27) | (1 << QuintParser.T__28) | (1 << QuintParser.T__29))) !== 0) || ((((_la - 61)) & ~0x1F) === 0 && ((1 << (_la - 61)) & ((1 << (QuintParser.LPAREN - 61)) | (1 << (QuintParser.SET - 61)) | (1 << (QuintParser.LIST - 61)) | (1 << (QuintParser.LOW_ID - 61)) | (1 << (QuintParser.CAP_ID - 61)))) !== 0)) { { - this.state = 322; + this.state = 344; this.type(0); - this.state = 327; + this.state = 349; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 30, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 32, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 323; + this.state = 345; this.match(QuintParser.T__7); - this.state = 324; + this.state = 346; this.type(0); } } } - this.state = 329; + this.state = 351; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 30, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 32, this._ctx); } } } - this.state = 333; + this.state = 355; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 332; + this.state = 354; this.match(QuintParser.T__7); } } - this.state = 335; + this.state = 357; this.match(QuintParser.RPAREN); - this.state = 336; - this.match(QuintParser.T__24); - this.state = 337; - this.type(11); + this.state = 358; + this.match(QuintParser.T__26); + this.state = 359; + this.type(12); } break; @@ -1340,14 +1427,14 @@ export class QuintParser extends Parser { _localctx = new TypeSetContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 338; + this.state = 360; this.match(QuintParser.SET); - this.state = 339; - this.match(QuintParser.T__25); - this.state = 340; + this.state = 361; + this.match(QuintParser.T__10); + this.state = 362; this.type(0); - this.state = 341; - this.match(QuintParser.T__26); + this.state = 363; + this.match(QuintParser.T__11); } break; @@ -1356,14 +1443,14 @@ export class QuintParser extends Parser { _localctx = new TypeListContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 343; + this.state = 365; this.match(QuintParser.LIST); - this.state = 344; - this.match(QuintParser.T__25); - this.state = 345; + this.state = 366; + this.match(QuintParser.T__10); + this.state = 367; this.type(0); - this.state = 346; - this.match(QuintParser.T__26); + this.state = 368; + this.match(QuintParser.T__11); } break; @@ -1372,43 +1459,43 @@ export class QuintParser extends Parser { _localctx = new TypeTupleContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 348; + this.state = 370; this.match(QuintParser.LPAREN); - this.state = 349; + this.state = 371; this.type(0); - this.state = 350; + this.state = 372; this.match(QuintParser.T__7); - this.state = 351; + this.state = 373; this.type(0); - this.state = 356; + this.state = 378; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 33, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 35, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 352; + this.state = 374; this.match(QuintParser.T__7); - this.state = 353; + this.state = 375; this.type(0); } } } - this.state = 358; + this.state = 380; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 33, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 35, this._ctx); } - this.state = 360; + this.state = 382; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 359; + this.state = 381; this.match(QuintParser.T__7); } } - this.state = 362; + this.state = 384; this.match(QuintParser.RPAREN); } break; @@ -1418,11 +1505,19 @@ export class QuintParser extends Parser { _localctx = new TypeRecContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 364; + this.state = 386; this.match(QuintParser.T__1); - this.state = 365; - this.row(); - this.state = 366; + this.state = 388; + this._errHandler.sync(this); + _la = this._input.LA(1); + if (_la === QuintParser.T__12 || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { + { + this.state = 387; + this.row(); + } + } + + this.state = 390; this.match(QuintParser.T__2); } break; @@ -1432,7 +1527,7 @@ export class QuintParser extends Parser { _localctx = new TypeIntContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 368; + this.state = 391; this.match(QuintParser.T__27); } break; @@ -1442,7 +1537,7 @@ export class QuintParser extends Parser { _localctx = new TypeStrContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 369; + this.state = 392; this.match(QuintParser.T__28); } break; @@ -1452,18 +1547,18 @@ export class QuintParser extends Parser { _localctx = new TypeBoolContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 370; + this.state = 393; this.match(QuintParser.T__29); } break; case 9: { - _localctx = new TypeVarContext(_localctx); + _localctx = new TypeVarCaseContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 371; - this.match(QuintParser.LOW_ID); + this.state = 394; + this.typeVar(); } break; @@ -1472,7 +1567,7 @@ export class QuintParser extends Parser { _localctx = new TypeConstContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 372; + this.state = 395; this.qualId(); } break; @@ -1482,19 +1577,19 @@ export class QuintParser extends Parser { _localctx = new TypeParenContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 373; + this.state = 396; this.match(QuintParser.LPAREN); - this.state = 374; + this.state = 397; this.type(0); - this.state = 375; + this.state = 398; this.match(QuintParser.RPAREN); } break; } this._ctx._stop = this._input.tryLT(-1); - this.state = 387; + this.state = 422; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 37, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 41, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { if (this._parseListeners != null) { @@ -1502,44 +1597,82 @@ export class QuintParser extends Parser { } _prevctx = _localctx; { - this.state = 385; + this.state = 420; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 36, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 40, this._ctx) ) { case 1: { _localctx = new TypeFunContext(new TypeContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_type); - this.state = 379; + this.state = 402; + if (!(this.precpred(this._ctx, 14))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 14)"); + } + this.state = 403; + this.match(QuintParser.T__25); + this.state = 404; + this.type(14); + } + break; + + case 2: + { + _localctx = new TypeOperContext(new TypeContext(_parentctx, _parentState)); + this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_type); + this.state = 405; if (!(this.precpred(this._ctx, 13))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 13)"); } - this.state = 380; - this.match(QuintParser.T__23); - this.state = 381; + this.state = 406; + this.match(QuintParser.T__26); + this.state = 407; this.type(13); } break; - case 2: + case 3: { - _localctx = new TypeOperContext(new TypeContext(_parentctx, _parentState)); + _localctx = new TypeAppContext(new TypeContext(_parentctx, _parentState)); + (_localctx as TypeAppContext)._typeCtor = _prevctx; this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_type); - this.state = 382; - if (!(this.precpred(this._ctx, 12))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 12)"); + this.state = 408; + if (!(this.precpred(this._ctx, 1))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 1)"); + } + { + this.state = 409; + this.match(QuintParser.T__10); + this.state = 410; + (_localctx as TypeAppContext)._type = this.type(0); + (_localctx as TypeAppContext)._typeArg.push((_localctx as TypeAppContext)._type); + this.state = 415; + this._errHandler.sync(this); + _la = this._input.LA(1); + while (_la === QuintParser.T__7) { + { + { + this.state = 411; + this.match(QuintParser.T__7); + this.state = 412; + (_localctx as TypeAppContext)._type = this.type(0); + (_localctx as TypeAppContext)._typeArg.push((_localctx as TypeAppContext)._type); + } + } + this.state = 417; + this._errHandler.sync(this); + _la = this._input.LA(1); + } + this.state = 418; + this.match(QuintParser.T__11); } - this.state = 383; - this.match(QuintParser.T__24); - this.state = 384; - this.type(12); } break; } } } - this.state = 389; + this.state = 424; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 37, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 41, this._ctx); } } } @@ -1558,91 +1691,106 @@ export class QuintParser extends Parser { return _localctx; } // @RuleVersion(0) + public typeVar(): TypeVarContext { + let _localctx: TypeVarContext = new TypeVarContext(this._ctx, this.state); + this.enterRule(_localctx, 38, QuintParser.RULE_typeVar); + try { + this.enterOuterAlt(_localctx, 1); + { + this.state = 425; + this.match(QuintParser.LOW_ID); + } + } + catch (re) { + if (re instanceof RecognitionException) { + _localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return _localctx; + } + // @RuleVersion(0) public row(): RowContext { let _localctx: RowContext = new RowContext(this._ctx, this.state); - this.enterRule(_localctx, 34, QuintParser.RULE_row); - let _la: number; + this.enterRule(_localctx, 40, QuintParser.RULE_row); try { let _alt: number; - this.state = 413; + this.state = 448; this._errHandler.sync(this); switch (this._input.LA(1)) { - case QuintParser.T__2: case QuintParser.LOW_ID: case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 397; + { + this.state = 427; + this.rowLabel(); + this.state = 428; + this.match(QuintParser.T__4); + this.state = 429; + this.type(0); + } + this.state = 438; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 38, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 42, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 390; + this.state = 431; + this.match(QuintParser.T__7); + this.state = 432; this.rowLabel(); - this.state = 391; + this.state = 433; this.match(QuintParser.T__4); - this.state = 392; + this.state = 434; this.type(0); - this.state = 393; - this.match(QuintParser.T__7); } } } - this.state = 399; + this.state = 440; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 38, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 42, this._ctx); } - this.state = 409; + this.state = 444; this._errHandler.sync(this); - _la = this._input.LA(1); - if (_la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { - { + switch (this._input.LA(1)) { + case QuintParser.T__7: { - this.state = 400; - this.rowLabel(); - this.state = 401; - this.match(QuintParser.T__4); - this.state = 402; - this.type(0); + this.state = 441; + this.match(QuintParser.T__7); } - this.state = 407; - this._errHandler.sync(this); - switch (this._input.LA(1)) { - case QuintParser.T__7: - { - this.state = 404; - this.match(QuintParser.T__7); - } - break; - case QuintParser.T__10: - { - this.state = 405; - this.match(QuintParser.T__10); - { - this.state = 406; - _localctx._rowVar = this.identifier(); - } - } - break; - case QuintParser.T__2: - break; - default: - break; + break; + case QuintParser.T__12: + { + this.state = 442; + this.match(QuintParser.T__12); + { + this.state = 443; + _localctx._rowVar = this.identifier(); } } + break; + case QuintParser.T__2: + break; + default: + break; } - } break; - case QuintParser.T__10: + case QuintParser.T__12: this.enterOuterAlt(_localctx, 2); { - this.state = 411; - this.match(QuintParser.T__10); + this.state = 446; + this.match(QuintParser.T__12); { - this.state = 412; + this.state = 447; _localctx._rowVar = this.identifier(); } } @@ -1668,11 +1816,11 @@ export class QuintParser extends Parser { // @RuleVersion(0) public rowLabel(): RowLabelContext { let _localctx: RowLabelContext = new RowLabelContext(this._ctx, this.state); - this.enterRule(_localctx, 36, QuintParser.RULE_rowLabel); + this.enterRule(_localctx, 42, QuintParser.RULE_rowLabel); try { this.enterOuterAlt(_localctx, 1); { - this.state = 415; + this.state = 450; this.simpleId("record"); } } @@ -1703,23 +1851,23 @@ export class QuintParser extends Parser { let _parentState: number = this.state; let _localctx: ExprContext = new ExprContext(this._ctx, _parentState); let _prevctx: ExprContext = _localctx; - let _startState: number = 38; - this.enterRecursionRule(_localctx, 38, QuintParser.RULE_expr, _p); + let _startState: number = 44; + this.enterRecursionRule(_localctx, 44, QuintParser.RULE_expr, _p); let _la: number; try { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 567; + this.state = 602; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 59, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 62, this._ctx) ) { case 1: { _localctx = new LambdaConsContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 418; + this.state = 453; this.lambda(); } break; @@ -1729,21 +1877,21 @@ export class QuintParser extends Parser { _localctx = new OperAppContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 419; + this.state = 454; this.normalCallName(); - this.state = 420; + this.state = 455; this.match(QuintParser.LPAREN); - this.state = 422; + this.state = 457; this._errHandler.sync(this); _la = this._input.LA(1); - if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__11) | (1 << QuintParser.T__12) | (1 << QuintParser.T__13) | (1 << QuintParser.T__14) | (1 << QuintParser.T__15) | (1 << QuintParser.T__16) | (1 << QuintParser.T__17) | (1 << QuintParser.T__25))) !== 0) || ((((_la - 33)) & ~0x1F) === 0 && ((1 << (_la - 33)) & ((1 << (QuintParser.T__32 - 33)) | (1 << (QuintParser.T__33 - 33)) | (1 << (QuintParser.T__34 - 33)) | (1 << (QuintParser.T__36 - 33)) | (1 << (QuintParser.STRING - 33)) | (1 << (QuintParser.BOOL - 33)) | (1 << (QuintParser.INT - 33)) | (1 << (QuintParser.AND - 33)) | (1 << (QuintParser.OR - 33)) | (1 << (QuintParser.IFF - 33)) | (1 << (QuintParser.IMPLIES - 33)) | (1 << (QuintParser.SET - 33)) | (1 << (QuintParser.LIST - 33)) | (1 << (QuintParser.MAP - 33)) | (1 << (QuintParser.MATCH - 33)) | (1 << (QuintParser.MINUS - 33)) | (1 << (QuintParser.LPAREN - 33)))) !== 0) || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { + if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__10) | (1 << QuintParser.T__13) | (1 << QuintParser.T__14) | (1 << QuintParser.T__15) | (1 << QuintParser.T__16) | (1 << QuintParser.T__17) | (1 << QuintParser.T__18) | (1 << QuintParser.T__19))) !== 0) || ((((_la - 33)) & ~0x1F) === 0 && ((1 << (_la - 33)) & ((1 << (QuintParser.T__32 - 33)) | (1 << (QuintParser.T__33 - 33)) | (1 << (QuintParser.T__34 - 33)) | (1 << (QuintParser.T__36 - 33)) | (1 << (QuintParser.STRING - 33)) | (1 << (QuintParser.BOOL - 33)) | (1 << (QuintParser.INT - 33)) | (1 << (QuintParser.AND - 33)) | (1 << (QuintParser.OR - 33)) | (1 << (QuintParser.IFF - 33)) | (1 << (QuintParser.IMPLIES - 33)) | (1 << (QuintParser.MAP - 33)) | (1 << (QuintParser.MATCH - 33)) | (1 << (QuintParser.MINUS - 33)) | (1 << (QuintParser.LPAREN - 33)) | (1 << (QuintParser.SET - 33)) | (1 << (QuintParser.LIST - 33)))) !== 0) || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { { - this.state = 421; + this.state = 456; this.argList(); } } - this.state = 424; + this.state = 459; this.match(QuintParser.RPAREN); } break; @@ -1753,9 +1901,9 @@ export class QuintParser extends Parser { _localctx = new UminusContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 426; + this.state = 461; this.match(QuintParser.MINUS); - this.state = 427; + this.state = 462; this.expr(25); } break; @@ -1765,13 +1913,13 @@ export class QuintParser extends Parser { _localctx = new AsgnContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 428; + this.state = 463; this.qualId(); - this.state = 429; + this.state = 464; this.match(QuintParser.T__31); - this.state = 430; + this.state = 465; this.match(QuintParser.ASGN); - this.state = 431; + this.state = 466; this.expr(21); } break; @@ -1781,41 +1929,41 @@ export class QuintParser extends Parser { _localctx = new AndExprContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 433; + this.state = 468; this.match(QuintParser.AND); - this.state = 434; + this.state = 469; this.match(QuintParser.T__1); - this.state = 435; + this.state = 470; this.expr(0); - this.state = 440; + this.state = 475; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 43, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 46, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 436; + this.state = 471; this.match(QuintParser.T__7); - this.state = 437; + this.state = 472; this.expr(0); } } } - this.state = 442; + this.state = 477; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 43, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 46, this._ctx); } - this.state = 444; + this.state = 479; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 443; + this.state = 478; this.match(QuintParser.T__7); } } - this.state = 446; + this.state = 481; this.match(QuintParser.T__2); } break; @@ -1825,41 +1973,41 @@ export class QuintParser extends Parser { _localctx = new OrExprContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 448; + this.state = 483; this.match(QuintParser.OR); - this.state = 449; + this.state = 484; this.match(QuintParser.T__1); - this.state = 450; + this.state = 485; this.expr(0); - this.state = 455; + this.state = 490; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 45, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 48, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 451; + this.state = 486; this.match(QuintParser.T__7); - this.state = 452; + this.state = 487; this.expr(0); } } } - this.state = 457; + this.state = 492; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 45, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 48, this._ctx); } - this.state = 459; + this.state = 494; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 458; + this.state = 493; this.match(QuintParser.T__7); } } - this.state = 461; + this.state = 496; this.match(QuintParser.T__2); } break; @@ -1869,7 +2017,7 @@ export class QuintParser extends Parser { _localctx = new MatchContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 463; + this.state = 498; this.matchSumExpr(); } break; @@ -1879,41 +2027,41 @@ export class QuintParser extends Parser { _localctx = new ActionAllContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 464; + this.state = 499; this.match(QuintParser.T__32); - this.state = 465; + this.state = 500; this.match(QuintParser.T__1); - this.state = 466; + this.state = 501; this.expr(0); - this.state = 471; + this.state = 506; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 47, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 50, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 467; + this.state = 502; this.match(QuintParser.T__7); - this.state = 468; + this.state = 503; this.expr(0); } } } - this.state = 473; + this.state = 508; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 47, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 50, this._ctx); } - this.state = 475; + this.state = 510; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 474; + this.state = 509; this.match(QuintParser.T__7); } } - this.state = 477; + this.state = 512; this.match(QuintParser.T__2); } break; @@ -1923,41 +2071,41 @@ export class QuintParser extends Parser { _localctx = new ActionAnyContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 479; + this.state = 514; this.match(QuintParser.T__33); - this.state = 480; + this.state = 515; this.match(QuintParser.T__1); - this.state = 481; + this.state = 516; this.expr(0); - this.state = 486; + this.state = 521; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 49, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 52, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 482; + this.state = 517; this.match(QuintParser.T__7); - this.state = 483; + this.state = 518; this.expr(0); } } } - this.state = 488; + this.state = 523; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 49, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 52, this._ctx); } - this.state = 490; + this.state = 525; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 489; + this.state = 524; this.match(QuintParser.T__7); } } - this.state = 492; + this.state = 527; this.match(QuintParser.T__2); } break; @@ -1967,31 +2115,31 @@ export class QuintParser extends Parser { _localctx = new LiteralOrIdContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 498; + this.state = 533; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: { - this.state = 494; + this.state = 529; this.qualId(); } break; case QuintParser.INT: { - this.state = 495; + this.state = 530; this.match(QuintParser.INT); } break; case QuintParser.BOOL: { - this.state = 496; + this.state = 531; this.match(QuintParser.BOOL); } break; case QuintParser.STRING: { - this.state = 497; + this.state = 532; this.match(QuintParser.STRING); } break; @@ -2006,43 +2154,43 @@ export class QuintParser extends Parser { _localctx = new TupleContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 500; + this.state = 535; this.match(QuintParser.LPAREN); - this.state = 501; + this.state = 536; this.expr(0); - this.state = 502; + this.state = 537; this.match(QuintParser.T__7); - this.state = 503; + this.state = 538; this.expr(0); - this.state = 508; + this.state = 543; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 52, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 55, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 504; + this.state = 539; this.match(QuintParser.T__7); - this.state = 505; + this.state = 540; this.expr(0); } } } - this.state = 510; + this.state = 545; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 52, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 55, this._ctx); } - this.state = 512; + this.state = 547; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 511; + this.state = 546; this.match(QuintParser.T__7); } } - this.state = 514; + this.state = 549; this.match(QuintParser.RPAREN); } break; @@ -2052,39 +2200,39 @@ export class QuintParser extends Parser { _localctx = new RecordContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 516; + this.state = 551; this.match(QuintParser.T__1); - this.state = 517; + this.state = 552; this.recElem(); - this.state = 522; + this.state = 557; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 54, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 57, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 518; + this.state = 553; this.match(QuintParser.T__7); - this.state = 519; + this.state = 554; this.recElem(); } } } - this.state = 524; + this.state = 559; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 54, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 57, this._ctx); } - this.state = 526; + this.state = 561; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 525; + this.state = 560; this.match(QuintParser.T__7); } } - this.state = 528; + this.state = 563; this.match(QuintParser.T__2); } break; @@ -2094,48 +2242,48 @@ export class QuintParser extends Parser { _localctx = new ListContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 530; - this.match(QuintParser.T__25); - this.state = 539; + this.state = 565; + this.match(QuintParser.T__10); + this.state = 574; this._errHandler.sync(this); _la = this._input.LA(1); - if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__11) | (1 << QuintParser.T__12) | (1 << QuintParser.T__13) | (1 << QuintParser.T__14) | (1 << QuintParser.T__15) | (1 << QuintParser.T__16) | (1 << QuintParser.T__17) | (1 << QuintParser.T__25))) !== 0) || ((((_la - 33)) & ~0x1F) === 0 && ((1 << (_la - 33)) & ((1 << (QuintParser.T__32 - 33)) | (1 << (QuintParser.T__33 - 33)) | (1 << (QuintParser.T__34 - 33)) | (1 << (QuintParser.T__36 - 33)) | (1 << (QuintParser.STRING - 33)) | (1 << (QuintParser.BOOL - 33)) | (1 << (QuintParser.INT - 33)) | (1 << (QuintParser.AND - 33)) | (1 << (QuintParser.OR - 33)) | (1 << (QuintParser.IFF - 33)) | (1 << (QuintParser.IMPLIES - 33)) | (1 << (QuintParser.SET - 33)) | (1 << (QuintParser.LIST - 33)) | (1 << (QuintParser.MAP - 33)) | (1 << (QuintParser.MATCH - 33)) | (1 << (QuintParser.MINUS - 33)) | (1 << (QuintParser.LPAREN - 33)))) !== 0) || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { + if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__10) | (1 << QuintParser.T__13) | (1 << QuintParser.T__14) | (1 << QuintParser.T__15) | (1 << QuintParser.T__16) | (1 << QuintParser.T__17) | (1 << QuintParser.T__18) | (1 << QuintParser.T__19))) !== 0) || ((((_la - 33)) & ~0x1F) === 0 && ((1 << (_la - 33)) & ((1 << (QuintParser.T__32 - 33)) | (1 << (QuintParser.T__33 - 33)) | (1 << (QuintParser.T__34 - 33)) | (1 << (QuintParser.T__36 - 33)) | (1 << (QuintParser.STRING - 33)) | (1 << (QuintParser.BOOL - 33)) | (1 << (QuintParser.INT - 33)) | (1 << (QuintParser.AND - 33)) | (1 << (QuintParser.OR - 33)) | (1 << (QuintParser.IFF - 33)) | (1 << (QuintParser.IMPLIES - 33)) | (1 << (QuintParser.MAP - 33)) | (1 << (QuintParser.MATCH - 33)) | (1 << (QuintParser.MINUS - 33)) | (1 << (QuintParser.LPAREN - 33)) | (1 << (QuintParser.SET - 33)) | (1 << (QuintParser.LIST - 33)))) !== 0) || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { { - this.state = 531; + this.state = 566; this.expr(0); - this.state = 536; + this.state = 571; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 56, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 59, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 532; + this.state = 567; this.match(QuintParser.T__7); - this.state = 533; + this.state = 568; this.expr(0); } } } - this.state = 538; + this.state = 573; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 56, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 59, this._ctx); } } } - this.state = 542; + this.state = 577; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 541; + this.state = 576; this.match(QuintParser.T__7); } } - this.state = 544; - this.match(QuintParser.T__26); + this.state = 579; + this.match(QuintParser.T__11); } break; @@ -2144,19 +2292,19 @@ export class QuintParser extends Parser { _localctx = new IfElseContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 545; + this.state = 580; this.match(QuintParser.T__34); - this.state = 546; + this.state = 581; this.match(QuintParser.LPAREN); - this.state = 547; + this.state = 582; this.expr(0); - this.state = 548; + this.state = 583; this.match(QuintParser.RPAREN); - this.state = 549; + this.state = 584; this.expr(0); - this.state = 550; + this.state = 585; this.match(QuintParser.T__35); - this.state = 551; + this.state = 586; this.expr(5); } break; @@ -2166,9 +2314,9 @@ export class QuintParser extends Parser { _localctx = new LetInContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 553; + this.state = 588; this.operDef(); - this.state = 554; + this.state = 589; this.expr(4); } break; @@ -2178,9 +2326,9 @@ export class QuintParser extends Parser { _localctx = new NondetContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 556; + this.state = 591; this.nondetOperDef(); - this.state = 557; + this.state = 592; this.expr(3); } break; @@ -2190,11 +2338,11 @@ export class QuintParser extends Parser { _localctx = new ParenContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 559; + this.state = 594; this.match(QuintParser.LPAREN); - this.state = 560; + this.state = 595; this.expr(0); - this.state = 561; + this.state = 596; this.match(QuintParser.RPAREN); } break; @@ -2204,19 +2352,19 @@ export class QuintParser extends Parser { _localctx = new BracesContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 563; + this.state = 598; this.match(QuintParser.T__1); - this.state = 564; + this.state = 599; this.expr(0); - this.state = 565; + this.state = 600; this.match(QuintParser.T__2); } break; } this._ctx._stop = this._input.tryLT(-1); - this.state = 618; + this.state = 653; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 63, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 66, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { if (this._parseListeners != null) { @@ -2224,20 +2372,20 @@ export class QuintParser extends Parser { } _prevctx = _localctx; { - this.state = 616; + this.state = 651; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 62, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 65, this._ctx) ) { case 1: { _localctx = new PowContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 569; + this.state = 604; if (!(this.precpred(this._ctx, 26))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 26)"); } - this.state = 570; + this.state = 605; (_localctx as PowContext)._op = this.match(QuintParser.T__30); - this.state = 571; + this.state = 606; this.expr(26); } break; @@ -2246,14 +2394,14 @@ export class QuintParser extends Parser { { _localctx = new MultDivContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 572; + this.state = 607; if (!(this.precpred(this._ctx, 24))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 24)"); } - this.state = 573; + this.state = 608; (_localctx as MultDivContext)._op = this._input.LT(1); _la = this._input.LA(1); - if (!(((((_la - 53)) & ~0x1F) === 0 && ((1 << (_la - 53)) & ((1 << (QuintParser.MUL - 53)) | (1 << (QuintParser.DIV - 53)) | (1 << (QuintParser.MOD - 53)))) !== 0))) { + if (!(((((_la - 51)) & ~0x1F) === 0 && ((1 << (_la - 51)) & ((1 << (QuintParser.MUL - 51)) | (1 << (QuintParser.DIV - 51)) | (1 << (QuintParser.MOD - 51)))) !== 0))) { (_localctx as MultDivContext)._op = this._errHandler.recoverInline(this); } else { if (this._input.LA(1) === Token.EOF) { @@ -2263,7 +2411,7 @@ export class QuintParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 574; + this.state = 609; this.expr(25); } break; @@ -2272,11 +2420,11 @@ export class QuintParser extends Parser { { _localctx = new PlusMinusContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 575; + this.state = 610; if (!(this.precpred(this._ctx, 23))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 23)"); } - this.state = 576; + this.state = 611; (_localctx as PlusMinusContext)._op = this._input.LT(1); _la = this._input.LA(1); if (!(_la === QuintParser.PLUS || _la === QuintParser.MINUS)) { @@ -2289,7 +2437,7 @@ export class QuintParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 577; + this.state = 612; this.expr(24); } break; @@ -2298,14 +2446,14 @@ export class QuintParser extends Parser { { _localctx = new RelationsContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 578; + this.state = 613; if (!(this.precpred(this._ctx, 22))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 22)"); } - this.state = 579; + this.state = 614; (_localctx as RelationsContext)._op = this._input.LT(1); _la = this._input.LA(1); - if (!(((((_la - 56)) & ~0x1F) === 0 && ((1 << (_la - 56)) & ((1 << (QuintParser.GT - 56)) | (1 << (QuintParser.LT - 56)) | (1 << (QuintParser.GE - 56)) | (1 << (QuintParser.LE - 56)) | (1 << (QuintParser.NE - 56)) | (1 << (QuintParser.EQ - 56)))) !== 0))) { + if (!(((((_la - 54)) & ~0x1F) === 0 && ((1 << (_la - 54)) & ((1 << (QuintParser.GT - 54)) | (1 << (QuintParser.LT - 54)) | (1 << (QuintParser.GE - 54)) | (1 << (QuintParser.LE - 54)) | (1 << (QuintParser.NE - 54)) | (1 << (QuintParser.EQ - 54)))) !== 0))) { (_localctx as RelationsContext)._op = this._errHandler.recoverInline(this); } else { if (this._input.LA(1) === Token.EOF) { @@ -2315,7 +2463,7 @@ export class QuintParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 580; + this.state = 615; this.expr(23); } break; @@ -2324,13 +2472,13 @@ export class QuintParser extends Parser { { _localctx = new ErrorEqContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 581; + this.state = 616; if (!(this.precpred(this._ctx, 20))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 20)"); } - this.state = 582; + this.state = 617; this.match(QuintParser.ASGN); - this.state = 583; + this.state = 618; this.expr(21); const m = "[QNT006] unexpected '=', did you mean '=='?" @@ -2343,13 +2491,13 @@ export class QuintParser extends Parser { { _localctx = new AndContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 586; + this.state = 621; if (!(this.precpred(this._ctx, 18))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 18)"); } - this.state = 587; + this.state = 622; this.match(QuintParser.AND); - this.state = 588; + this.state = 623; this.expr(19); } break; @@ -2358,13 +2506,13 @@ export class QuintParser extends Parser { { _localctx = new OrContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 589; + this.state = 624; if (!(this.precpred(this._ctx, 16))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 16)"); } - this.state = 590; + this.state = 625; this.match(QuintParser.OR); - this.state = 591; + this.state = 626; this.expr(17); } break; @@ -2373,13 +2521,13 @@ export class QuintParser extends Parser { { _localctx = new IffContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 592; + this.state = 627; if (!(this.precpred(this._ctx, 15))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 15)"); } - this.state = 593; + this.state = 628; this.match(QuintParser.IFF); - this.state = 594; + this.state = 629; this.expr(16); } break; @@ -2388,13 +2536,13 @@ export class QuintParser extends Parser { { _localctx = new ImpliesContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 595; + this.state = 630; if (!(this.precpred(this._ctx, 14))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 14)"); } - this.state = 596; + this.state = 631; this.match(QuintParser.IMPLIES); - this.state = 597; + this.state = 632; this.expr(15); } break; @@ -2403,13 +2551,13 @@ export class QuintParser extends Parser { { _localctx = new PairContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 598; + this.state = 633; if (!(this.precpred(this._ctx, 8))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 8)"); } - this.state = 599; - this.match(QuintParser.T__23); - this.state = 600; + this.state = 634; + this.match(QuintParser.T__25); + this.state = 635; this.expr(9); } break; @@ -2418,32 +2566,32 @@ export class QuintParser extends Parser { { _localctx = new DotCallContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 601; + this.state = 636; if (!(this.precpred(this._ctx, 30))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 30)"); } - this.state = 602; - this.match(QuintParser.T__19); - this.state = 603; + this.state = 637; + this.match(QuintParser.T__21); + this.state = 638; this.nameAfterDot(); - this.state = 609; + this.state = 644; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 61, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 64, this._ctx) ) { case 1: { - this.state = 604; + this.state = 639; this.match(QuintParser.LPAREN); - this.state = 606; + this.state = 641; this._errHandler.sync(this); _la = this._input.LA(1); - if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__11) | (1 << QuintParser.T__12) | (1 << QuintParser.T__13) | (1 << QuintParser.T__14) | (1 << QuintParser.T__15) | (1 << QuintParser.T__16) | (1 << QuintParser.T__17) | (1 << QuintParser.T__25))) !== 0) || ((((_la - 33)) & ~0x1F) === 0 && ((1 << (_la - 33)) & ((1 << (QuintParser.T__32 - 33)) | (1 << (QuintParser.T__33 - 33)) | (1 << (QuintParser.T__34 - 33)) | (1 << (QuintParser.T__36 - 33)) | (1 << (QuintParser.STRING - 33)) | (1 << (QuintParser.BOOL - 33)) | (1 << (QuintParser.INT - 33)) | (1 << (QuintParser.AND - 33)) | (1 << (QuintParser.OR - 33)) | (1 << (QuintParser.IFF - 33)) | (1 << (QuintParser.IMPLIES - 33)) | (1 << (QuintParser.SET - 33)) | (1 << (QuintParser.LIST - 33)) | (1 << (QuintParser.MAP - 33)) | (1 << (QuintParser.MATCH - 33)) | (1 << (QuintParser.MINUS - 33)) | (1 << (QuintParser.LPAREN - 33)))) !== 0) || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { + if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__10) | (1 << QuintParser.T__13) | (1 << QuintParser.T__14) | (1 << QuintParser.T__15) | (1 << QuintParser.T__16) | (1 << QuintParser.T__17) | (1 << QuintParser.T__18) | (1 << QuintParser.T__19))) !== 0) || ((((_la - 33)) & ~0x1F) === 0 && ((1 << (_la - 33)) & ((1 << (QuintParser.T__32 - 33)) | (1 << (QuintParser.T__33 - 33)) | (1 << (QuintParser.T__34 - 33)) | (1 << (QuintParser.T__36 - 33)) | (1 << (QuintParser.STRING - 33)) | (1 << (QuintParser.BOOL - 33)) | (1 << (QuintParser.INT - 33)) | (1 << (QuintParser.AND - 33)) | (1 << (QuintParser.OR - 33)) | (1 << (QuintParser.IFF - 33)) | (1 << (QuintParser.IMPLIES - 33)) | (1 << (QuintParser.MAP - 33)) | (1 << (QuintParser.MATCH - 33)) | (1 << (QuintParser.MINUS - 33)) | (1 << (QuintParser.LPAREN - 33)) | (1 << (QuintParser.SET - 33)) | (1 << (QuintParser.LIST - 33)))) !== 0) || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { { - this.state = 605; + this.state = 640; this.argList(); } } - this.state = 608; + this.state = 643; this.match(QuintParser.RPAREN); } break; @@ -2455,24 +2603,24 @@ export class QuintParser extends Parser { { _localctx = new ListAppContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 611; + this.state = 646; if (!(this.precpred(this._ctx, 27))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 27)"); } - this.state = 612; - this.match(QuintParser.T__25); - this.state = 613; + this.state = 647; + this.match(QuintParser.T__10); + this.state = 648; this.expr(0); - this.state = 614; - this.match(QuintParser.T__26); + this.state = 649; + this.match(QuintParser.T__11); } break; } } } - this.state = 620; + this.state = 655; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 63, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 66, this._ctx); } } } @@ -2493,48 +2641,48 @@ export class QuintParser extends Parser { // @RuleVersion(0) public matchSumExpr(): MatchSumExprContext { let _localctx: MatchSumExprContext = new MatchSumExprContext(this._ctx, this.state); - this.enterRule(_localctx, 40, QuintParser.RULE_matchSumExpr); + this.enterRule(_localctx, 46, QuintParser.RULE_matchSumExpr); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 621; + this.state = 656; this.match(QuintParser.MATCH); - this.state = 622; + this.state = 657; this.expr(0); - this.state = 623; + this.state = 658; this.match(QuintParser.T__1); - this.state = 625; + this.state = 660; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la === QuintParser.T__10) { + if (_la === QuintParser.T__12) { { - this.state = 624; - this.match(QuintParser.T__10); + this.state = 659; + this.match(QuintParser.T__12); } } - this.state = 627; + this.state = 662; _localctx._matchSumCase = this.matchSumCase(); _localctx._matchCase.push(_localctx._matchSumCase); - this.state = 632; + this.state = 667; this._errHandler.sync(this); _la = this._input.LA(1); - while (_la === QuintParser.T__10) { + while (_la === QuintParser.T__12) { { { - this.state = 628; - this.match(QuintParser.T__10); - this.state = 629; + this.state = 663; + this.match(QuintParser.T__12); + this.state = 664; _localctx._matchSumCase = this.matchSumCase(); _localctx._matchCase.push(_localctx._matchSumCase); } } - this.state = 634; + this.state = 669; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 635; + this.state = 670; this.match(QuintParser.T__2); } } @@ -2555,32 +2703,32 @@ export class QuintParser extends Parser { // @RuleVersion(0) public matchSumCase(): MatchSumCaseContext { let _localctx: MatchSumCaseContext = new MatchSumCaseContext(this._ctx, this.state); - this.enterRule(_localctx, 42, QuintParser.RULE_matchSumCase); + this.enterRule(_localctx, 48, QuintParser.RULE_matchSumCase); try { this.enterOuterAlt(_localctx, 1); { - this.state = 639; + this.state = 674; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: { - this.state = 637; + this.state = 672; _localctx._variantMatch = this.matchSumVariant(); } break; case QuintParser.T__36: { - this.state = 638; + this.state = 673; _localctx._wildCardMatch = this.match(QuintParser.T__36); } break; default: throw new NoViableAltException(this); } - this.state = 641; - this.match(QuintParser.T__24); - this.state = 642; + this.state = 676; + this.match(QuintParser.T__26); + this.state = 677; this.expr(0); } } @@ -2601,42 +2749,42 @@ export class QuintParser extends Parser { // @RuleVersion(0) public matchSumVariant(): MatchSumVariantContext { let _localctx: MatchSumVariantContext = new MatchSumVariantContext(this._ctx, this.state); - this.enterRule(_localctx, 44, QuintParser.RULE_matchSumVariant); + this.enterRule(_localctx, 50, QuintParser.RULE_matchSumVariant); let _la: number; try { this.enterOuterAlt(_localctx, 1); { { - this.state = 644; + this.state = 679; _localctx._variantLabel = this.simpleId("variant label"); } - this.state = 651; + this.state = 686; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.LPAREN) { { - this.state = 645; + this.state = 680; this.match(QuintParser.LPAREN); - this.state = 648; + this.state = 683; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: { - this.state = 646; + this.state = 681; _localctx._variantParam = this.simpleId("match case parameter"); } break; case QuintParser.T__36: { - this.state = 647; + this.state = 682; this.match(QuintParser.T__36); } break; default: throw new NoViableAltException(this); } - this.state = 650; + this.state = 685; this.match(QuintParser.RPAREN); } } @@ -2660,17 +2808,17 @@ export class QuintParser extends Parser { // @RuleVersion(0) public declarationOrExpr(): DeclarationOrExprContext { let _localctx: DeclarationOrExprContext = new DeclarationOrExprContext(this._ctx, this.state); - this.enterRule(_localctx, 46, QuintParser.RULE_declarationOrExpr); + this.enterRule(_localctx, 52, QuintParser.RULE_declarationOrExpr); try { - this.state = 662; + this.state = 697; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 69, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 72, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 653; + this.state = 688; this.declaration(); - this.state = 654; + this.state = 689; this.match(QuintParser.EOF); } break; @@ -2678,9 +2826,9 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 656; + this.state = 691; this.expr(0); - this.state = 657; + this.state = 692; this.match(QuintParser.EOF); } break; @@ -2688,9 +2836,9 @@ export class QuintParser extends Parser { case 3: this.enterOuterAlt(_localctx, 3); { - this.state = 659; + this.state = 694; this.match(QuintParser.DOCCOMMENT); - this.state = 660; + this.state = 695; this.match(QuintParser.EOF); } break; @@ -2698,7 +2846,7 @@ export class QuintParser extends Parser { case 4: this.enterOuterAlt(_localctx, 4); { - this.state = 661; + this.state = 696; this.match(QuintParser.EOF); } break; @@ -2721,15 +2869,15 @@ export class QuintParser extends Parser { // @RuleVersion(0) public lambda(): LambdaContext { let _localctx: LambdaContext = new LambdaContext(this._ctx, this.state); - this.enterRule(_localctx, 48, QuintParser.RULE_lambda); + this.enterRule(_localctx, 54, QuintParser.RULE_lambda); try { - this.state = 666; + this.state = 701; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 70, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 73, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 664; + this.state = 699; this.lambdaUnsugared(); } break; @@ -2737,7 +2885,7 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 665; + this.state = 700; this.lambdaTupleSugar(); } break; @@ -2760,10 +2908,10 @@ export class QuintParser extends Parser { // @RuleVersion(0) public lambdaUnsugared(): LambdaUnsugaredContext { let _localctx: LambdaUnsugaredContext = new LambdaUnsugaredContext(this._ctx, this.state); - this.enterRule(_localctx, 50, QuintParser.RULE_lambdaUnsugared); + this.enterRule(_localctx, 56, QuintParser.RULE_lambdaUnsugared); let _la: number; try { - this.state = 685; + this.state = 720; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.T__36: @@ -2771,42 +2919,42 @@ export class QuintParser extends Parser { case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 668; + this.state = 703; this.parameter(); - this.state = 669; - this.match(QuintParser.T__24); - this.state = 670; + this.state = 704; + this.match(QuintParser.T__26); + this.state = 705; this.expr(0); } break; case QuintParser.LPAREN: this.enterOuterAlt(_localctx, 2); { - this.state = 672; + this.state = 707; this.match(QuintParser.LPAREN); - this.state = 673; + this.state = 708; this.parameter(); - this.state = 678; + this.state = 713; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 674; + this.state = 709; this.match(QuintParser.T__7); - this.state = 675; + this.state = 710; this.parameter(); } } - this.state = 680; + this.state = 715; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 681; + this.state = 716; this.match(QuintParser.RPAREN); - this.state = 682; - this.match(QuintParser.T__24); - this.state = 683; + this.state = 717; + this.match(QuintParser.T__26); + this.state = 718; this.expr(0); } break; @@ -2831,40 +2979,40 @@ export class QuintParser extends Parser { // @RuleVersion(0) public lambdaTupleSugar(): LambdaTupleSugarContext { let _localctx: LambdaTupleSugarContext = new LambdaTupleSugarContext(this._ctx, this.state); - this.enterRule(_localctx, 52, QuintParser.RULE_lambdaTupleSugar); + this.enterRule(_localctx, 58, QuintParser.RULE_lambdaTupleSugar); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 687; + this.state = 722; this.match(QuintParser.LPAREN); - this.state = 688; + this.state = 723; this.match(QuintParser.LPAREN); - this.state = 689; + this.state = 724; this.parameter(); - this.state = 692; + this.state = 727; this._errHandler.sync(this); _la = this._input.LA(1); do { { { - this.state = 690; + this.state = 725; this.match(QuintParser.T__7); - this.state = 691; + this.state = 726; this.parameter(); } } - this.state = 694; + this.state = 729; this._errHandler.sync(this); _la = this._input.LA(1); } while (_la === QuintParser.T__7); - this.state = 696; + this.state = 731; this.match(QuintParser.RPAREN); - this.state = 697; + this.state = 732; this.match(QuintParser.RPAREN); - this.state = 698; - this.match(QuintParser.T__24); - this.state = 699; + this.state = 733; + this.match(QuintParser.T__26); + this.state = 734; this.expr(0); } } @@ -2885,15 +3033,15 @@ export class QuintParser extends Parser { // @RuleVersion(0) public identOrHole(): IdentOrHoleContext { let _localctx: IdentOrHoleContext = new IdentOrHoleContext(this._ctx, this.state); - this.enterRule(_localctx, 54, QuintParser.RULE_identOrHole); + this.enterRule(_localctx, 60, QuintParser.RULE_identOrHole); try { - this.state = 703; + this.state = 738; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.T__36: this.enterOuterAlt(_localctx, 1); { - this.state = 701; + this.state = 736; this.match(QuintParser.T__36); } break; @@ -2901,7 +3049,7 @@ export class QuintParser extends Parser { case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 2); { - this.state = 702; + this.state = 737; this.qualId(); } break; @@ -2926,11 +3074,11 @@ export class QuintParser extends Parser { // @RuleVersion(0) public parameter(): ParameterContext { let _localctx: ParameterContext = new ParameterContext(this._ctx, this.state); - this.enterRule(_localctx, 56, QuintParser.RULE_parameter); + this.enterRule(_localctx, 62, QuintParser.RULE_parameter); try { this.enterOuterAlt(_localctx, 1); { - this.state = 705; + this.state = 740; this.identOrHole(); } } @@ -2951,15 +3099,15 @@ export class QuintParser extends Parser { // @RuleVersion(0) public identOrStar(): IdentOrStarContext { let _localctx: IdentOrStarContext = new IdentOrStarContext(this._ctx, this.state); - this.enterRule(_localctx, 58, QuintParser.RULE_identOrStar); + this.enterRule(_localctx, 64, QuintParser.RULE_identOrStar); try { - this.state = 709; + this.state = 744; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.MUL: this.enterOuterAlt(_localctx, 1); { - this.state = 707; + this.state = 742; this.match(QuintParser.MUL); } break; @@ -2967,7 +3115,7 @@ export class QuintParser extends Parser { case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 2); { - this.state = 708; + this.state = 743; this.qualId(); } break; @@ -2992,26 +3140,26 @@ export class QuintParser extends Parser { // @RuleVersion(0) public argList(): ArgListContext { let _localctx: ArgListContext = new ArgListContext(this._ctx, this.state); - this.enterRule(_localctx, 60, QuintParser.RULE_argList); + this.enterRule(_localctx, 66, QuintParser.RULE_argList); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 711; + this.state = 746; this.expr(0); - this.state = 716; + this.state = 751; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 712; + this.state = 747; this.match(QuintParser.T__7); - this.state = 713; + this.state = 748; this.expr(0); } } - this.state = 718; + this.state = 753; this._errHandler.sync(this); _la = this._input.LA(1); } @@ -3034,29 +3182,29 @@ export class QuintParser extends Parser { // @RuleVersion(0) public recElem(): RecElemContext { let _localctx: RecElemContext = new RecElemContext(this._ctx, this.state); - this.enterRule(_localctx, 62, QuintParser.RULE_recElem); + this.enterRule(_localctx, 68, QuintParser.RULE_recElem); try { - this.state = 725; + this.state = 760; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 719; + this.state = 754; this.simpleId("record"); - this.state = 720; + this.state = 755; this.match(QuintParser.T__4); - this.state = 721; + this.state = 756; this.expr(0); } break; case QuintParser.T__37: this.enterOuterAlt(_localctx, 2); { - this.state = 723; + this.state = 758; this.match(QuintParser.T__37); - this.state = 724; + this.state = 759; this.expr(0); } break; @@ -3081,17 +3229,17 @@ export class QuintParser extends Parser { // @RuleVersion(0) public normalCallName(): NormalCallNameContext { let _localctx: NormalCallNameContext = new NormalCallNameContext(this._ctx, this.state); - this.enterRule(_localctx, 64, QuintParser.RULE_normalCallName); + this.enterRule(_localctx, 70, QuintParser.RULE_normalCallName); let _la: number; try { - this.state = 729; + this.state = 764; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 727; + this.state = 762; this.qualId(); } break; @@ -3099,15 +3247,15 @@ export class QuintParser extends Parser { case QuintParser.OR: case QuintParser.IFF: case QuintParser.IMPLIES: + case QuintParser.MAP: case QuintParser.SET: case QuintParser.LIST: - case QuintParser.MAP: this.enterOuterAlt(_localctx, 2); { - this.state = 728; + this.state = 763; _localctx._op = this._input.LT(1); _la = this._input.LA(1); - if (!(((((_la - 43)) & ~0x1F) === 0 && ((1 << (_la - 43)) & ((1 << (QuintParser.AND - 43)) | (1 << (QuintParser.OR - 43)) | (1 << (QuintParser.IFF - 43)) | (1 << (QuintParser.IMPLIES - 43)) | (1 << (QuintParser.SET - 43)) | (1 << (QuintParser.LIST - 43)) | (1 << (QuintParser.MAP - 43)))) !== 0))) { + if (!(((((_la - 43)) & ~0x1F) === 0 && ((1 << (_la - 43)) & ((1 << (QuintParser.AND - 43)) | (1 << (QuintParser.OR - 43)) | (1 << (QuintParser.IFF - 43)) | (1 << (QuintParser.IMPLIES - 43)) | (1 << (QuintParser.MAP - 43)) | (1 << (QuintParser.SET - 43)) | (1 << (QuintParser.LIST - 43)))) !== 0))) { _localctx._op = this._errHandler.recoverInline(this); } else { if (this._input.LA(1) === Token.EOF) { @@ -3140,17 +3288,17 @@ export class QuintParser extends Parser { // @RuleVersion(0) public nameAfterDot(): NameAfterDotContext { let _localctx: NameAfterDotContext = new NameAfterDotContext(this._ctx, this.state); - this.enterRule(_localctx, 66, QuintParser.RULE_nameAfterDot); + this.enterRule(_localctx, 72, QuintParser.RULE_nameAfterDot); let _la: number; try { - this.state = 733; + this.state = 768; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 731; + this.state = 766; this.qualId(); } break; @@ -3160,7 +3308,7 @@ export class QuintParser extends Parser { case QuintParser.IMPLIES: this.enterOuterAlt(_localctx, 2); { - this.state = 732; + this.state = 767; _localctx._op = this._input.LT(1); _la = this._input.LA(1); if (!(((((_la - 43)) & ~0x1F) === 0 && ((1 << (_la - 43)) & ((1 << (QuintParser.AND - 43)) | (1 << (QuintParser.OR - 43)) | (1 << (QuintParser.IFF - 43)) | (1 << (QuintParser.IMPLIES - 43)))) !== 0))) { @@ -3196,12 +3344,12 @@ export class QuintParser extends Parser { // @RuleVersion(0) public operator(): OperatorContext { let _localctx: OperatorContext = new OperatorContext(this._ctx, this.state); - this.enterRule(_localctx, 68, QuintParser.RULE_operator); + this.enterRule(_localctx, 74, QuintParser.RULE_operator); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 735; + this.state = 770; _la = this._input.LA(1); if (!(((((_la - 31)) & ~0x1F) === 0 && ((1 << (_la - 31)) & ((1 << (QuintParser.T__30 - 31)) | (1 << (QuintParser.AND - 31)) | (1 << (QuintParser.OR - 31)) | (1 << (QuintParser.IFF - 31)) | (1 << (QuintParser.IMPLIES - 31)) | (1 << (QuintParser.PLUS - 31)) | (1 << (QuintParser.MINUS - 31)) | (1 << (QuintParser.MUL - 31)) | (1 << (QuintParser.DIV - 31)) | (1 << (QuintParser.MOD - 31)) | (1 << (QuintParser.GT - 31)) | (1 << (QuintParser.LT - 31)) | (1 << (QuintParser.GE - 31)) | (1 << (QuintParser.LE - 31)) | (1 << (QuintParser.NE - 31)) | (1 << (QuintParser.EQ - 31)))) !== 0))) { this._errHandler.recoverInline(this); @@ -3232,12 +3380,12 @@ export class QuintParser extends Parser { // @RuleVersion(0) public literal(): LiteralContext { let _localctx: LiteralContext = new LiteralContext(this._ctx, this.state); - this.enterRule(_localctx, 70, QuintParser.RULE_literal); + this.enterRule(_localctx, 76, QuintParser.RULE_literal); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 737; + this.state = 772; _la = this._input.LA(1); if (!(((((_la - 40)) & ~0x1F) === 0 && ((1 << (_la - 40)) & ((1 << (QuintParser.STRING - 40)) | (1 << (QuintParser.BOOL - 40)) | (1 << (QuintParser.INT - 40)))) !== 0))) { this._errHandler.recoverInline(this); @@ -3268,30 +3416,30 @@ export class QuintParser extends Parser { // @RuleVersion(0) public qualId(): QualIdContext { let _localctx: QualIdContext = new QualIdContext(this._ctx, this.state); - this.enterRule(_localctx, 72, QuintParser.RULE_qualId); + this.enterRule(_localctx, 78, QuintParser.RULE_qualId); try { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 739; + this.state = 774; this.identifier(); - this.state = 744; + this.state = 779; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 80, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 83, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 740; + this.state = 775; this.match(QuintParser.T__38); - this.state = 741; + this.state = 776; this.identifier(); } } } - this.state = 746; + this.state = 781; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 80, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 83, this._ctx); } } } @@ -3312,15 +3460,15 @@ export class QuintParser extends Parser { // @RuleVersion(0) public simpleId(context: string): SimpleIdContext { let _localctx: SimpleIdContext = new SimpleIdContext(this._ctx, this.state, context); - this.enterRule(_localctx, 74, QuintParser.RULE_simpleId); + this.enterRule(_localctx, 80, QuintParser.RULE_simpleId); try { - this.state = 751; + this.state = 786; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 81, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 84, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 747; + this.state = 782; this.identifier(); } break; @@ -3328,7 +3476,7 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 748; + this.state = 783; _localctx._qualId = this.qualId(); const err = quintErrorToString( @@ -3359,12 +3507,12 @@ export class QuintParser extends Parser { // @RuleVersion(0) public identifier(): IdentifierContext { let _localctx: IdentifierContext = new IdentifierContext(this._ctx, this.state); - this.enterRule(_localctx, 76, QuintParser.RULE_identifier); + this.enterRule(_localctx, 82, QuintParser.RULE_identifier); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 753; + this.state = 788; _la = this._input.LA(1); if (!(_la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID)) { this._errHandler.recoverInline(this); @@ -3395,10 +3543,10 @@ export class QuintParser extends Parser { public sempred(_localctx: RuleContext, ruleIndex: number, predIndex: number): boolean { switch (ruleIndex) { - case 16: + case 18: return this.type_sempred(_localctx as TypeContext, predIndex); - case 19: + case 22: return this.expr_sempred(_localctx as ExprContext, predIndex); } return true; @@ -3406,49 +3554,52 @@ export class QuintParser extends Parser { private type_sempred(_localctx: TypeContext, predIndex: number): boolean { switch (predIndex) { case 0: - return this.precpred(this._ctx, 13); + return this.precpred(this._ctx, 14); case 1: - return this.precpred(this._ctx, 12); + return this.precpred(this._ctx, 13); + + case 2: + return this.precpred(this._ctx, 1); } return true; } private expr_sempred(_localctx: ExprContext, predIndex: number): boolean { switch (predIndex) { - case 2: + case 3: return this.precpred(this._ctx, 26); - case 3: + case 4: return this.precpred(this._ctx, 24); - case 4: + case 5: return this.precpred(this._ctx, 23); - case 5: + case 6: return this.precpred(this._ctx, 22); - case 6: + case 7: return this.precpred(this._ctx, 20); - case 7: + case 8: return this.precpred(this._ctx, 18); - case 8: + case 9: return this.precpred(this._ctx, 16); - case 9: + case 10: return this.precpred(this._ctx, 15); - case 10: + case 11: return this.precpred(this._ctx, 14); - case 11: + case 12: return this.precpred(this._ctx, 8); - case 12: + case 13: return this.precpred(this._ctx, 30); - case 13: + case 14: return this.precpred(this._ctx, 27); } return true; @@ -3456,405 +3607,423 @@ export class QuintParser extends Parser { private static readonly _serializedATNSegments: number = 2; private static readonly _serializedATNSegment0: string = - "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x03H\u02F6\x04\x02" + + "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x03H\u0319\x04\x02" + "\t\x02\x04\x03\t\x03\x04\x04\t\x04\x04\x05\t\x05\x04\x06\t\x06\x04\x07" + "\t\x07\x04\b\t\b\x04\t\t\t\x04\n\t\n\x04\v\t\v\x04\f\t\f\x04\r\t\r\x04" + "\x0E\t\x0E\x04\x0F\t\x0F\x04\x10\t\x10\x04\x11\t\x11\x04\x12\t\x12\x04" + "\x13\t\x13\x04\x14\t\x14\x04\x15\t\x15\x04\x16\t\x16\x04\x17\t\x17\x04" + "\x18\t\x18\x04\x19\t\x19\x04\x1A\t\x1A\x04\x1B\t\x1B\x04\x1C\t\x1C\x04" + "\x1D\t\x1D\x04\x1E\t\x1E\x04\x1F\t\x1F\x04 \t \x04!\t!\x04\"\t\"\x04#" + - "\t#\x04$\t$\x04%\t%\x04&\t&\x04\'\t\'\x04(\t(\x03\x02\x06\x02R\n\x02\r" + - "\x02\x0E\x02S\x03\x02\x03\x02\x03\x03\x07\x03Y\n\x03\f\x03\x0E\x03\\\v" + - "\x03\x03\x03\x03\x03\x03\x03\x03\x03\x07\x03b\n\x03\f\x03\x0E\x03e\v\x03" + - "\x03\x03\x03\x03\x03\x04\x07\x04j\n\x04\f\x04\x0E\x04m\v\x04\x03\x04\x03" + - "\x04\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03" + - "\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03" + - "\x05\x03\x05\x03\x05\x05\x05\x85\n\x05\x03\x06\x03\x06\x03\x06\x03\x06" + - "\x03\x06\x03\x06\x07\x06\x8D\n\x06\f\x06\x0E\x06\x90\v\x06\x05\x06\x92" + - "\n\x06\x03\x06\x03\x06\x03\x06\x05\x06\x97\n\x06\x03\x06\x03\x06\x03\x06" + - "\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x07\x06" + - "\xA4\n\x06\f\x06\x0E\x06\xA7\v\x06\x03\x06\x03\x06\x03\x06\x03\x06\x05" + - "\x06\xAD\n\x06\x03\x06\x03\x06\x05\x06\xB1\n\x06\x03\x06\x05\x06\xB4\n" + - "\x06\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03" + - "\x07\x03\x07\x03\x07\x05\x07\xC1\n\x07\x03\x07\x03\x07\x03\x07\x07\x07" + - "\xC6\n\x07\f\x07\x0E\x07\xC9\v\x07\x05\x07\xCB\n\x07\x03\b\x03\b\x03\b" + - "\x03\b\x03\b\x05\b\xD2\n\b\x03\t\x03\t\x03\t\x03\t\x05\t\xD8\n\t\x03\t" + - "\x03\t\x03\t\x05\t\xDD\n\t\x03\n\x03\n\x03\n\x03\n\x03\n\x03\n\x03\n\x03" + - "\n\x03\n\x05\n\xE8\n\n\x03\v\x03\v\x03\v\x03\v\x03\v\x03\v\x05\v\xF0\n" + - "\v\x03\v\x03\v\x03\v\x03\v\x05\v\xF6\n\v\x03\v\x03\v\x05\v\xFA\n\v\x05" + - "\v\xFC\n\v\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x05\f" + - "\u0107\n\f\x05\f\u0109\n\f\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03" + - "\r\x03\r\x03\r\x03\r\x07\r\u0116\n\r\f\r\x0E\r\u0119\v\r\x03\r\x03\r\x03" + - "\r\x03\r\x03\r\x05\r\u0120\n\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03" + - "\r\x03\r\x03\r\x03\r\x03\r\x07\r\u012D\n\r\f\r\x0E\r\u0130\v\r\x03\r\x03" + - "\r\x03\r\x03\r\x03\r\x05\r\u0137\n\r\x05\r\u0139\n\r\x03\x0E\x03\x0E\x03" + - "\x0F\x03\x0F\x03\x10\x03\x10\x03\x11\x03\x11\x03\x12\x03\x12\x03\x12\x03" + - "\x12\x03\x12\x07\x12\u0148\n\x12\f\x12\x0E\x12\u014B\v\x12\x05\x12\u014D" + - "\n\x12\x03\x12\x05\x12\u0150\n\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03" + - "\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03" + - "\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x07\x12\u0165\n\x12\f\x12" + - "\x0E\x12\u0168\v\x12\x03\x12\x05\x12\u016B\n\x12\x03\x12\x03\x12\x03\x12" + - "\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12" + - "\x03\x12\x03\x12\x03\x12\x05\x12\u017C\n\x12\x03\x12\x03\x12\x03\x12\x03" + - "\x12\x03\x12\x03\x12\x07\x12\u0184\n\x12\f\x12\x0E\x12\u0187\v\x12\x03" + - "\x13\x03\x13\x03\x13\x03\x13\x03\x13\x07\x13\u018E\n\x13\f\x13\x0E\x13" + - "\u0191\v\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x05" + - "\x13\u019A\n\x13\x05\x13\u019C\n\x13\x03\x13\x03\x13\x05\x13\u01A0\n\x13" + - "\x03\x14\x03\x14\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x05\x15\u01A9" + - "\n\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15" + - "\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x07\x15\u01B9\n\x15\f" + - "\x15\x0E\x15\u01BC\v\x15\x03\x15\x05\x15\u01BF\n\x15\x03\x15\x03\x15\x03" + - "\x15\x03\x15\x03\x15\x03\x15\x03\x15\x07\x15\u01C8\n\x15\f\x15\x0E\x15" + - "\u01CB\v\x15\x03\x15\x05\x15\u01CE\n\x15\x03\x15\x03\x15\x03\x15\x03\x15" + - "\x03\x15\x03\x15\x03\x15\x03\x15\x07\x15\u01D8\n\x15\f\x15\x0E\x15\u01DB" + - "\v\x15\x03\x15\x05\x15\u01DE\n\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03" + - "\x15\x03\x15\x03\x15\x07\x15\u01E7\n\x15\f\x15\x0E\x15\u01EA\v\x15\x03" + - "\x15\x05\x15\u01ED\n\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15" + - "\x05\x15\u01F5\n\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x07" + - "\x15\u01FD\n\x15\f\x15\x0E\x15\u0200\v\x15\x03\x15\x05\x15\u0203\n\x15" + - "\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x07\x15\u020B\n\x15\f" + - "\x15\x0E\x15\u020E\v\x15\x03\x15\x05\x15\u0211\n\x15\x03\x15\x03\x15\x03" + - "\x15\x03\x15\x03\x15\x03\x15\x07\x15\u0219\n\x15\f\x15\x0E\x15\u021C\v" + - "\x15\x05\x15\u021E\n\x15\x03\x15\x05\x15\u0221\n\x15\x03\x15\x03\x15\x03" + - "\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03" + - "\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03" + - "\x15\x03\x15\x03\x15\x05\x15\u023A\n\x15\x03\x15\x03\x15\x03\x15\x03\x15" + - "\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15" + - "\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15" + - "\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15" + - "\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x05\x15\u0261\n\x15\x03" + - "\x15\x05\x15\u0264\n\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x07\x15" + - "\u026B\n\x15\f\x15\x0E\x15\u026E\v\x15\x03\x16\x03\x16\x03\x16\x03\x16" + - "\x05\x16\u0274\n\x16\x03\x16\x03\x16\x03\x16\x07\x16\u0279\n\x16\f\x16" + - "\x0E\x16\u027C\v\x16\x03\x16\x03\x16\x03\x17\x03\x17\x05\x17\u0282\n\x17" + - "\x03\x17\x03\x17\x03\x17\x03\x18\x03\x18\x03\x18\x03\x18\x05\x18\u028B" + - "\n\x18\x03\x18\x05\x18\u028E\n\x18\x03\x19\x03\x19\x03\x19\x03\x19\x03" + - "\x19\x03\x19\x03\x19\x03\x19\x03\x19\x05\x19\u0299\n\x19\x03\x1A\x03\x1A" + - "\x05\x1A\u029D\n\x1A\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x03" + - "\x1B\x03\x1B\x07\x1B\u02A7\n\x1B\f\x1B\x0E\x1B\u02AA\v\x1B\x03\x1B\x03" + - "\x1B\x03\x1B\x03\x1B\x05\x1B\u02B0\n\x1B\x03\x1C\x03\x1C\x03\x1C\x03\x1C" + - "\x03\x1C\x06\x1C\u02B7\n\x1C\r\x1C\x0E\x1C\u02B8\x03\x1C\x03\x1C\x03\x1C" + - "\x03\x1C\x03\x1C\x03\x1D\x03\x1D\x05\x1D\u02C2\n\x1D\x03\x1E\x03\x1E\x03" + - "\x1F\x03\x1F\x05\x1F\u02C8\n\x1F\x03 \x03 \x03 \x07 \u02CD\n \f \x0E " + - "\u02D0\v \x03!\x03!\x03!\x03!\x03!\x03!\x05!\u02D8\n!\x03\"\x03\"\x05" + - "\"\u02DC\n\"\x03#\x03#\x05#\u02E0\n#\x03$\x03$\x03%\x03%\x03&\x03&\x03" + - "&\x07&\u02E9\n&\f&\x0E&\u02EC\v&\x03\'\x03\'\x03\'\x03\'\x05\'\u02F2\n" + - "\'\x03(\x03(\x03(\x02\x02\x04\"()\x02\x02\x04\x02\x06\x02\b\x02\n\x02" + - "\f\x02\x0E\x02\x10\x02\x12\x02\x14\x02\x16\x02\x18\x02\x1A\x02\x1C\x02" + - "\x1E\x02 \x02\"\x02$\x02&\x02(\x02*\x02,\x02.\x020\x022\x024\x026\x02" + - "8\x02:\x02<\x02>\x02@\x02B\x02D\x02F\x02H\x02J\x02L\x02N\x02\x02\n\x03" + - "\x0279\x03\x0256\x03\x02:?\x03\x02-3\x03\x02-0\x05\x02!!-05?\x03\x02*" + - ",\x03\x02CD\x02\u0356\x02Q\x03\x02\x02\x02\x04Z\x03\x02\x02\x02\x06k\x03" + - "\x02\x02\x02\b\x84\x03\x02\x02\x02\n\x86\x03\x02\x02\x02\f\xCA\x03\x02" + - "\x02\x02\x0E\xCC\x03\x02\x02\x02\x10\xD3\x03\x02\x02\x02\x12\xE7\x03\x02" + - "\x02\x02\x14\xFB\x03\x02\x02\x02\x16\u0108\x03\x02\x02\x02\x18\u0138\x03" + - "\x02\x02\x02\x1A\u013A\x03\x02\x02\x02\x1C\u013C\x03\x02\x02\x02\x1E\u013E" + - "\x03\x02\x02\x02 \u0140\x03\x02\x02\x02\"\u017B\x03\x02\x02\x02$\u019F" + - "\x03\x02\x02\x02&\u01A1\x03\x02\x02\x02(\u0239\x03\x02\x02\x02*\u026F" + - "\x03\x02\x02\x02,\u0281\x03\x02\x02\x02.\u0286\x03\x02\x02\x020\u0298" + - "\x03\x02\x02\x022\u029C\x03\x02\x02\x024\u02AF\x03\x02\x02\x026\u02B1" + - "\x03\x02\x02\x028\u02C1\x03\x02\x02\x02:\u02C3\x03\x02\x02\x02<\u02C7" + - "\x03\x02\x02\x02>\u02C9\x03\x02\x02\x02@\u02D7\x03\x02\x02\x02B\u02DB" + - "\x03\x02\x02\x02D\u02DF\x03\x02\x02\x02F\u02E1\x03\x02\x02\x02H\u02E3" + - "\x03\x02\x02\x02J\u02E5\x03\x02\x02\x02L\u02F1\x03\x02\x02\x02N\u02F3" + - "\x03\x02\x02\x02PR\x05\x04\x03\x02QP\x03\x02\x02\x02RS\x03\x02\x02\x02" + - "SQ\x03\x02\x02\x02ST\x03\x02\x02\x02TU\x03\x02\x02\x02UV\x07\x02\x02\x03" + - "V\x03\x03\x02\x02\x02WY\x07E\x02\x02XW\x03\x02\x02\x02Y\\\x03\x02\x02" + - "\x02ZX\x03\x02\x02\x02Z[\x03\x02\x02\x02[]\x03\x02\x02\x02\\Z\x03\x02" + - "\x02\x02]^\x07\x03\x02\x02^_\x05J&\x02_c\x07\x04\x02\x02`b\x05\x06\x04" + - "\x02a`\x03\x02\x02\x02be\x03\x02\x02\x02ca\x03\x02\x02\x02cd\x03\x02\x02" + - "\x02df\x03\x02\x02\x02ec\x03\x02\x02\x02fg\x07\x05\x02\x02g\x05\x03\x02" + - "\x02\x02hj\x07E\x02\x02ih\x03\x02\x02\x02jm\x03\x02\x02\x02ki\x03\x02" + - "\x02\x02kl\x03\x02\x02\x02ln\x03\x02\x02\x02mk\x03\x02\x02\x02no\x05\b" + - "\x05\x02o\x07\x03\x02\x02\x02pq\x07\x06\x02\x02qr\x05J&\x02rs\x07\x07" + - "\x02\x02st\x05\"\x12\x02t\x85\x03\x02\x02\x02uv\x07\b\x02\x02vw\x05J&" + - "\x02wx\x07\x07\x02\x02xy\x05\"\x12\x02y\x85\x03\x02\x02\x02z{\x07\t\x02" + - "\x02{|\x058\x1D\x02|}\x07@\x02\x02}~\x05(\x15\x02~\x85\x03\x02\x02\x02" + - "\x7F\x85\x05\x18\r\x02\x80\x85\x05\n\x06\x02\x81\x85\x05\f\x07\x02\x82" + - "\x85\x05\x14\v\x02\x83\x85\x05\x16\f\x02\x84p\x03\x02\x02\x02\x84u\x03" + - "\x02\x02\x02\x84z\x03\x02\x02\x02\x84\x7F\x03\x02\x02\x02\x84\x80\x03" + - "\x02\x02\x02\x84\x81\x03\x02\x02\x02\x84\x82\x03\x02\x02\x02\x84\x83\x03" + - "\x02\x02\x02\x85\t\x03\x02\x02\x02\x86\x87\x05\x12\n\x02\x87\xAC\x05B" + - "\"\x02\x88\x91\x07A\x02\x02\x89\x8E\x05:\x1E\x02\x8A\x8B\x07\n\x02\x02" + - "\x8B\x8D\x05:\x1E\x02\x8C\x8A\x03\x02\x02\x02\x8D\x90\x03\x02\x02\x02" + - "\x8E\x8C\x03\x02\x02\x02\x8E\x8F\x03\x02\x02\x02\x8F\x92\x03\x02\x02\x02" + - "\x90\x8E\x03\x02\x02\x02\x91\x89\x03\x02\x02\x02\x91\x92\x03\x02\x02\x02" + - "\x92\x93\x03\x02\x02\x02\x93\x96\x07B\x02\x02\x94\x95\x07\x07\x02\x02" + - "\x95\x97\x05\"\x12\x02\x96\x94\x03\x02\x02\x02\x96\x97\x03\x02\x02\x02" + - "\x97\xAD\x03\x02\x02\x02\x98\x99\x07\x07\x02\x02\x99\xAD\x05\"\x12\x02" + - "\x9A\x9B\x07A\x02\x02\x9B\x9C\x05:\x1E\x02\x9C\x9D\x07\x07\x02\x02\x9D" + - "\xA5\x05\"\x12\x02\x9E\x9F\x07\n\x02\x02\x9F\xA0\x05:\x1E\x02\xA0\xA1" + - "\x07\x07\x02\x02\xA1\xA2\x05\"\x12\x02\xA2\xA4\x03\x02\x02\x02\xA3\x9E" + - "\x03\x02\x02\x02\xA4\xA7\x03\x02\x02\x02\xA5\xA3\x03\x02\x02\x02\xA5\xA6" + - "\x03\x02\x02\x02\xA6\xA8\x03\x02\x02\x02\xA7\xA5\x03\x02\x02\x02\xA8\xA9" + - "\x07B\x02\x02\xA9\xAA\x07\x07\x02\x02\xAA\xAB\x05\"\x12\x02\xAB\xAD\x03" + - "\x02\x02\x02\xAC\x88\x03\x02\x02\x02\xAC\x98\x03\x02\x02\x02\xAC\x9A\x03" + - "\x02\x02\x02\xAC\xAD\x03\x02\x02\x02\xAD\xB0\x03\x02\x02\x02\xAE\xAF\x07" + - "@\x02\x02\xAF\xB1\x05(\x15\x02\xB0\xAE\x03\x02\x02\x02\xB0\xB1\x03\x02" + - "\x02\x02\xB1\xB3\x03\x02\x02\x02\xB2\xB4\x07\v\x02\x02\xB3\xB2\x03\x02" + - "\x02\x02\xB3\xB4\x03\x02\x02\x02\xB4\v\x03\x02\x02\x02\xB5\xB6\x07\f\x02" + - "\x02\xB6\xCB\x05J&\x02\xB7\xB8\x07\f\x02\x02\xB8\xB9\x05J&\x02\xB9\xBA" + - "\x07@\x02\x02\xBA\xBB\x05\"\x12\x02\xBB\xCB\x03\x02\x02\x02\xBC\xBD\x07" + - "\f\x02\x02\xBD\xBE\x05J&\x02\xBE\xC0\x07@\x02\x02\xBF\xC1\x07\r\x02\x02" + - "\xC0\xBF\x03\x02\x02\x02\xC0\xC1\x03\x02\x02\x02\xC1\xC2\x03\x02\x02\x02" + - "\xC2\xC7\x05\x0E\b\x02\xC3\xC4\x07\r\x02\x02\xC4\xC6\x05\x0E\b\x02\xC5" + - "\xC3\x03\x02\x02\x02\xC6\xC9\x03\x02\x02\x02\xC7\xC5\x03\x02\x02\x02\xC7" + - "\xC8\x03\x02\x02\x02\xC8\xCB\x03\x02\x02\x02\xC9\xC7\x03\x02\x02\x02\xCA" + - "\xB5\x03\x02\x02\x02\xCA\xB7\x03\x02\x02\x02\xCA\xBC\x03\x02\x02\x02\xCB" + - "\r\x03\x02\x02\x02\xCC\xD1\x05L\'\x02\xCD\xCE\x07A\x02\x02\xCE\xCF\x05" + - "\"\x12\x02\xCF\xD0\x07B\x02\x02\xD0\xD2\x03\x02\x02\x02\xD1\xCD\x03\x02" + - "\x02\x02\xD1\xD2\x03\x02\x02\x02\xD2\x0F\x03\x02\x02\x02\xD3\xD4\x07\x0E" + - "\x02\x02\xD4\xD7\x05J&\x02\xD5\xD6\x07\x07\x02\x02\xD6\xD8\x05\"\x12\x02" + - "\xD7\xD5\x03\x02\x02\x02\xD7\xD8\x03\x02\x02\x02\xD8\xD9\x03\x02\x02\x02" + - "\xD9\xDA\x07@\x02\x02\xDA\xDC\x05(\x15\x02\xDB\xDD\x07\v\x02\x02\xDC\xDB" + - "\x03\x02\x02\x02\xDC\xDD\x03\x02\x02\x02\xDD\x11\x03\x02\x02\x02\xDE\xE8" + - "\x07\x0F\x02\x02\xDF\xE8\x07\x10\x02\x02\xE0\xE1\x07\x11\x02\x02\xE1\xE8" + - "\x07\x0F\x02\x02\xE2\xE3\x07\x11\x02\x02\xE3\xE8\x07\x10\x02\x02\xE4\xE8" + - "\x07\x12\x02\x02\xE5\xE8\x07\x13\x02\x02\xE6\xE8\x07\x14\x02\x02\xE7\xDE" + - "\x03\x02\x02\x02\xE7\xDF\x03\x02\x02\x02\xE7\xE0\x03\x02\x02\x02\xE7\xE2" + - "\x03\x02\x02\x02\xE7\xE4\x03\x02\x02\x02\xE7\xE5\x03\x02\x02\x02\xE7\xE6" + - "\x03\x02\x02\x02\xE8\x13\x03\x02\x02\x02\xE9\xEA\x07\x15\x02\x02\xEA\xEB" + - "\x05\x1C\x0F\x02\xEB\xEC\x07\x16\x02\x02\xEC\xEF\x05<\x1F\x02\xED\xEE" + - "\x07\x17\x02\x02\xEE\xF0\x05 \x11\x02\xEF\xED\x03\x02\x02\x02\xEF\xF0" + - "\x03\x02\x02\x02\xF0\xFC\x03\x02\x02\x02\xF1\xF2\x07\x15\x02\x02\xF2\xF5" + - "\x05\x1C\x0F\x02\xF3\xF4\x07\x18\x02\x02\xF4\xF6\x05\x1C\x0F\x02\xF5\xF3" + - "\x03\x02\x02\x02\xF5\xF6\x03\x02\x02\x02\xF6\xF9\x03\x02\x02\x02\xF7\xF8" + - "\x07\x17\x02\x02\xF8\xFA\x05 \x11\x02\xF9\xF7\x03\x02\x02\x02\xF9\xFA" + - "\x03\x02\x02\x02\xFA\xFC\x03\x02\x02\x02\xFB\xE9\x03\x02\x02\x02\xFB\xF1" + - "\x03\x02\x02\x02\xFC\x15\x03\x02\x02\x02\xFD\xFE\x07\x19\x02\x02\xFE\xFF" + - "\x05\x1C\x0F\x02\xFF\u0100\x07\x16\x02\x02\u0100\u0101\x05<\x1F\x02\u0101" + - "\u0109\x03\x02\x02\x02\u0102\u0103\x07\x19\x02\x02\u0103\u0106\x05\x1C" + - "\x0F\x02\u0104\u0105\x07\x18\x02\x02\u0105\u0107\x05\x1C\x0F\x02\u0106" + - "\u0104\x03\x02\x02\x02\u0106\u0107\x03\x02\x02\x02\u0107\u0109\x03\x02" + - "\x02\x02\u0108\xFD\x03\x02\x02\x02\u0108\u0102\x03\x02\x02\x02\u0109\x17" + - "\x03\x02\x02\x02\u010A\u010B\x07\x15\x02\x02\u010B\u010C\x05\x1A\x0E\x02" + - "\u010C\u010D\x07A\x02\x02\u010D\u010E\x05\x1C\x0F\x02\u010E\u010F\x07" + - "@\x02\x02\u010F\u0117\x05(\x15\x02\u0110\u0111\x07\n\x02\x02\u0111\u0112" + - "\x05\x1C\x0F\x02\u0112\u0113\x07@\x02\x02\u0113\u0114\x05(\x15\x02\u0114" + - "\u0116\x03\x02\x02\x02\u0115\u0110\x03\x02\x02\x02\u0116\u0119\x03\x02" + - "\x02\x02\u0117\u0115\x03\x02\x02\x02\u0117\u0118\x03\x02\x02\x02\u0118" + - "\u011A\x03\x02\x02\x02\u0119\u0117\x03\x02\x02\x02\u011A\u011B\x07B\x02" + - "\x02\u011B\u011C\x07\x16\x02\x02\u011C\u011F\x077\x02\x02\u011D\u011E" + - "\x07\x17\x02\x02\u011E\u0120\x05 \x11\x02\u011F\u011D\x03\x02\x02\x02" + - "\u011F\u0120\x03\x02\x02\x02\u0120\u0139\x03\x02\x02\x02\u0121\u0122\x07" + - "\x15\x02\x02\u0122\u0123\x05\x1A\x0E\x02\u0123\u0124\x07A\x02\x02\u0124" + - "\u0125\x05\x1C\x0F\x02\u0125\u0126\x07@\x02\x02\u0126\u012E\x05(\x15\x02" + - "\u0127\u0128\x07\n\x02\x02\u0128\u0129\x05\x1C\x0F\x02\u0129\u012A\x07" + - "@\x02\x02\u012A\u012B\x05(\x15\x02\u012B\u012D\x03\x02\x02\x02\u012C\u0127" + - "\x03\x02\x02\x02\u012D\u0130\x03\x02\x02\x02\u012E\u012C\x03\x02\x02\x02" + - "\u012E\u012F\x03\x02\x02\x02\u012F\u0131\x03\x02\x02\x02\u0130\u012E\x03" + - "\x02\x02\x02\u0131\u0132\x07B\x02\x02\u0132\u0133\x07\x18\x02\x02\u0133" + - "\u0136\x05\x1E\x10\x02\u0134\u0135\x07\x17\x02\x02\u0135\u0137\x05 \x11" + - "\x02\u0136\u0134\x03\x02\x02\x02\u0136\u0137\x03\x02\x02\x02\u0137\u0139" + - "\x03\x02\x02\x02\u0138\u010A\x03\x02\x02\x02\u0138\u0121\x03\x02\x02\x02" + - "\u0139\x19\x03\x02\x02\x02\u013A\u013B\x05J&\x02\u013B\x1B\x03\x02\x02" + - "\x02\u013C\u013D\x05J&\x02\u013D\x1D\x03\x02\x02\x02\u013E\u013F\x05J" + - "&\x02\u013F\x1F\x03\x02\x02\x02\u0140\u0141\x07*\x02\x02\u0141!\x03\x02" + - "\x02\x02\u0142\u0143\b\x12\x01\x02\u0143\u014C\x07A\x02\x02\u0144\u0149" + - "\x05\"\x12\x02\u0145\u0146\x07\n\x02\x02\u0146\u0148\x05\"\x12\x02\u0147" + - "\u0145\x03\x02\x02\x02\u0148\u014B\x03\x02\x02\x02\u0149\u0147\x03\x02" + - "\x02\x02\u0149\u014A\x03\x02\x02\x02\u014A\u014D\x03\x02\x02\x02\u014B" + - "\u0149\x03\x02\x02\x02\u014C\u0144\x03\x02\x02\x02\u014C\u014D\x03\x02" + - "\x02\x02\u014D\u014F\x03\x02\x02\x02\u014E\u0150\x07\n\x02\x02\u014F\u014E" + - "\x03\x02\x02\x02\u014F\u0150\x03\x02\x02\x02\u0150\u0151\x03\x02\x02\x02" + - "\u0151\u0152\x07B\x02\x02\u0152\u0153\x07\x1B\x02\x02\u0153\u017C\x05" + - "\"\x12\r\u0154\u0155\x071\x02\x02\u0155\u0156\x07\x1C\x02\x02\u0156\u0157" + - "\x05\"\x12\x02\u0157\u0158\x07\x1D\x02\x02\u0158\u017C\x03\x02\x02\x02" + - "\u0159\u015A\x072\x02\x02\u015A\u015B\x07\x1C\x02\x02\u015B\u015C\x05" + - "\"\x12\x02\u015C\u015D\x07\x1D\x02\x02\u015D\u017C\x03\x02\x02\x02\u015E" + - "\u015F\x07A\x02\x02\u015F\u0160\x05\"\x12\x02\u0160\u0161\x07\n\x02\x02" + - "\u0161\u0166\x05\"\x12\x02\u0162\u0163\x07\n\x02\x02\u0163\u0165\x05\"" + - "\x12\x02\u0164\u0162\x03\x02\x02\x02\u0165\u0168\x03\x02\x02\x02\u0166" + - "\u0164\x03\x02\x02\x02\u0166\u0167\x03\x02\x02\x02\u0167\u016A\x03\x02" + - "\x02\x02\u0168\u0166\x03\x02\x02\x02\u0169\u016B\x07\n\x02\x02\u016A\u0169" + - "\x03\x02\x02\x02\u016A\u016B\x03\x02\x02\x02\u016B\u016C\x03\x02\x02\x02" + - "\u016C\u016D\x07B\x02\x02\u016D\u017C\x03\x02\x02\x02\u016E\u016F\x07" + - "\x04\x02\x02\u016F\u0170\x05$\x13\x02\u0170\u0171\x07\x05\x02\x02\u0171" + - "\u017C\x03\x02\x02\x02\u0172\u017C\x07\x1E\x02\x02\u0173\u017C\x07\x1F" + - "\x02\x02\u0174\u017C\x07 \x02\x02\u0175\u017C\x07C\x02\x02\u0176\u017C" + - "\x05J&\x02\u0177\u0178\x07A\x02\x02\u0178\u0179\x05\"\x12\x02\u0179\u017A" + - "\x07B\x02\x02\u017A\u017C\x03\x02\x02\x02\u017B\u0142\x03\x02\x02\x02" + - "\u017B\u0154\x03\x02\x02\x02\u017B\u0159\x03\x02\x02\x02\u017B\u015E\x03" + - "\x02\x02\x02\u017B\u016E\x03\x02\x02\x02\u017B\u0172\x03\x02\x02\x02\u017B" + - "\u0173\x03\x02\x02\x02\u017B\u0174\x03\x02\x02\x02\u017B\u0175\x03\x02" + - "\x02\x02\u017B\u0176\x03\x02\x02\x02\u017B\u0177\x03\x02\x02\x02\u017C" + - "\u0185\x03\x02\x02\x02\u017D\u017E\f\x0F\x02\x02\u017E\u017F\x07\x1A\x02" + - "\x02\u017F\u0184\x05\"\x12\x0F\u0180\u0181\f\x0E\x02\x02\u0181\u0182\x07" + - "\x1B\x02\x02\u0182\u0184\x05\"\x12\x0E\u0183\u017D\x03\x02\x02\x02\u0183" + - "\u0180\x03\x02\x02\x02\u0184\u0187\x03\x02\x02\x02\u0185\u0183\x03\x02" + - "\x02\x02\u0185\u0186\x03\x02\x02\x02\u0186#\x03\x02\x02\x02\u0187\u0185" + - "\x03\x02\x02\x02\u0188\u0189\x05&\x14\x02\u0189\u018A\x07\x07\x02\x02" + - "\u018A\u018B\x05\"\x12\x02\u018B\u018C\x07\n\x02\x02\u018C\u018E\x03\x02" + - "\x02\x02\u018D\u0188\x03\x02\x02\x02\u018E\u0191\x03\x02\x02\x02\u018F" + - "\u018D\x03\x02\x02\x02\u018F\u0190\x03\x02\x02\x02\u0190\u019B\x03\x02" + - "\x02\x02\u0191\u018F\x03\x02\x02\x02\u0192\u0193\x05&\x14\x02\u0193\u0194" + - "\x07\x07\x02\x02\u0194\u0195\x05\"\x12\x02\u0195\u0199\x03\x02\x02\x02" + - "\u0196\u019A\x07\n\x02\x02\u0197\u0198\x07\r\x02\x02\u0198\u019A\x05N" + - "(\x02\u0199\u0196\x03\x02\x02\x02\u0199\u0197\x03\x02\x02\x02\u0199\u019A" + - "\x03\x02\x02\x02\u019A\u019C\x03\x02\x02\x02\u019B\u0192\x03\x02\x02\x02" + - "\u019B\u019C\x03\x02\x02\x02\u019C\u01A0\x03\x02\x02\x02\u019D\u019E\x07" + - "\r\x02\x02\u019E\u01A0\x05N(\x02\u019F\u018F\x03\x02\x02\x02\u019F\u019D" + - "\x03\x02\x02\x02\u01A0%\x03\x02\x02\x02\u01A1\u01A2\x05L\'\x02\u01A2\'" + - "\x03\x02\x02\x02\u01A3\u01A4\b\x15\x01\x02\u01A4\u023A\x052\x1A\x02\u01A5" + - "\u01A6\x05B\"\x02\u01A6\u01A8\x07A\x02\x02\u01A7\u01A9\x05> \x02\u01A8" + - "\u01A7\x03\x02\x02\x02\u01A8\u01A9\x03\x02\x02\x02\u01A9\u01AA\x03\x02" + - "\x02\x02\u01AA\u01AB\x07B\x02\x02\u01AB\u023A\x03\x02\x02\x02\u01AC\u01AD" + - "\x076\x02\x02\u01AD\u023A\x05(\x15\x1B\u01AE\u01AF\x05J&\x02\u01AF\u01B0" + - "\x07\"\x02\x02\u01B0\u01B1\x07@\x02\x02\u01B1\u01B2\x05(\x15\x17\u01B2" + - "\u023A\x03\x02\x02\x02\u01B3\u01B4\x07-\x02\x02\u01B4\u01B5\x07\x04\x02" + - "\x02\u01B5\u01BA\x05(\x15\x02\u01B6\u01B7\x07\n\x02\x02\u01B7\u01B9\x05" + - "(\x15\x02\u01B8\u01B6\x03\x02\x02\x02\u01B9\u01BC\x03\x02\x02\x02\u01BA" + - "\u01B8\x03\x02\x02\x02\u01BA\u01BB\x03\x02\x02\x02\u01BB\u01BE\x03\x02" + - "\x02\x02\u01BC\u01BA\x03\x02\x02\x02\u01BD\u01BF\x07\n\x02\x02\u01BE\u01BD" + - "\x03\x02\x02\x02\u01BE\u01BF\x03\x02\x02\x02\u01BF\u01C0\x03\x02\x02\x02" + - "\u01C0\u01C1\x07\x05\x02\x02\u01C1\u023A\x03\x02\x02\x02\u01C2\u01C3\x07" + - ".\x02\x02\u01C3\u01C4\x07\x04\x02\x02\u01C4\u01C9\x05(\x15\x02\u01C5\u01C6" + - "\x07\n\x02\x02\u01C6\u01C8\x05(\x15\x02\u01C7\u01C5\x03\x02\x02\x02\u01C8" + - "\u01CB\x03\x02\x02\x02\u01C9\u01C7\x03\x02\x02\x02\u01C9\u01CA\x03\x02" + - "\x02\x02\u01CA\u01CD\x03\x02\x02\x02\u01CB\u01C9\x03\x02\x02\x02\u01CC" + - "\u01CE\x07\n\x02\x02\u01CD\u01CC\x03\x02\x02\x02\u01CD\u01CE\x03\x02\x02" + - "\x02\u01CE\u01CF\x03\x02\x02\x02\u01CF\u01D0\x07\x05\x02\x02\u01D0\u023A" + - "\x03\x02\x02\x02\u01D1\u023A\x05*\x16\x02\u01D2\u01D3\x07#\x02\x02\u01D3" + - "\u01D4\x07\x04\x02\x02\u01D4\u01D9\x05(\x15\x02\u01D5\u01D6\x07\n\x02" + - "\x02\u01D6\u01D8\x05(\x15\x02\u01D7\u01D5\x03\x02\x02\x02\u01D8\u01DB" + - "\x03\x02\x02\x02\u01D9\u01D7\x03\x02\x02\x02\u01D9\u01DA\x03\x02\x02\x02" + - "\u01DA\u01DD\x03\x02\x02\x02\u01DB\u01D9\x03\x02\x02\x02\u01DC\u01DE\x07" + - "\n\x02\x02\u01DD\u01DC\x03\x02\x02\x02\u01DD\u01DE\x03\x02\x02\x02\u01DE" + - "\u01DF\x03\x02\x02\x02\u01DF\u01E0\x07\x05\x02\x02\u01E0\u023A\x03\x02" + - "\x02\x02\u01E1\u01E2\x07$\x02\x02\u01E2\u01E3\x07\x04\x02\x02\u01E3\u01E8" + - "\x05(\x15\x02\u01E4\u01E5\x07\n\x02\x02\u01E5\u01E7\x05(\x15\x02\u01E6" + - "\u01E4\x03\x02\x02\x02\u01E7\u01EA\x03\x02\x02\x02\u01E8\u01E6\x03\x02" + - "\x02\x02\u01E8\u01E9\x03\x02\x02\x02\u01E9\u01EC\x03\x02\x02\x02\u01EA" + - "\u01E8\x03\x02\x02\x02\u01EB\u01ED\x07\n\x02\x02\u01EC\u01EB\x03\x02\x02" + - "\x02\u01EC\u01ED\x03\x02\x02\x02\u01ED\u01EE\x03\x02\x02\x02\u01EE\u01EF" + - "\x07\x05\x02\x02\u01EF\u023A\x03\x02\x02\x02\u01F0\u01F5\x05J&\x02\u01F1" + - "\u01F5\x07,\x02\x02\u01F2\u01F5\x07+\x02\x02\u01F3\u01F5\x07*\x02\x02" + - "\u01F4\u01F0\x03\x02\x02\x02\u01F4\u01F1\x03\x02\x02\x02\u01F4\u01F2\x03" + - "\x02\x02\x02\u01F4\u01F3\x03\x02\x02\x02\u01F5\u023A\x03\x02\x02\x02\u01F6" + - "\u01F7\x07A\x02\x02\u01F7\u01F8\x05(\x15\x02"; + "\t#\x04$\t$\x04%\t%\x04&\t&\x04\'\t\'\x04(\t(\x04)\t)\x04*\t*\x04+\t+" + + "\x03\x02\x06\x02X\n\x02\r\x02\x0E\x02Y\x03\x02\x03\x02\x03\x03\x07\x03" + + "_\n\x03\f\x03\x0E\x03b\v\x03\x03\x03\x03\x03\x03\x03\x03\x03\x07\x03h" + + "\n\x03\f\x03\x0E\x03k\v\x03\x03\x03\x03\x03\x03\x04\x07\x04p\n\x04\f\x04" + + "\x0E\x04s\v\x04\x03\x04\x03\x04\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05" + + "\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05" + + "\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x05\x05\x8B\n\x05\x03" + + "\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x07\x06\x93\n\x06\f\x06\x0E" + + "\x06\x96\v\x06\x05\x06\x98\n\x06\x03\x06\x03\x06\x03\x06\x05\x06\x9D\n" + + "\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03" + + "\x06\x03\x06\x03\x06\x07\x06\xAA\n\x06\f\x06\x0E\x06\xAD\v\x06\x03\x06" + + "\x03\x06\x03\x06\x03\x06\x05\x06\xB3\n\x06\x03\x06\x03\x06\x05\x06\xB7" + + "\n\x06\x03\x06\x05\x06\xBA\n\x06\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07" + + "\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x05\x07\xC8\n" + + "\x07\x03\b\x03\b\x03\b\x03\b\x03\b\x07\b\xCF\n\b\f\b\x0E\b\xD2\v\b\x03" + + "\b\x03\b\x05\b\xD6\n\b\x03\t\x05\t\xD9\n\t\x03\t\x03\t\x03\t\x07\t\xDE" + + "\n\t\f\t\x0E\t\xE1\v\t\x03\n\x03\n\x03\n\x03\n\x03\n\x05\n\xE8\n\n\x03" + + "\v\x03\v\x03\v\x03\v\x05\v\xEE\n\v\x03\v\x03\v\x03\v\x05\v\xF3\n\v\x03" + + "\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x05\f\xFE\n\f\x03\r" + + "\x03\r\x03\r\x03\r\x03\r\x03\r\x05\r\u0106\n\r\x03\r\x03\r\x03\r\x03\r" + + "\x05\r\u010C\n\r\x03\r\x03\r\x05\r\u0110\n\r\x05\r\u0112\n\r\x03\x0E\x03" + + "\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x05\x0E\u011D" + + "\n\x0E\x05\x0E\u011F\n\x0E\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03" + + "\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x07\x0F\u012C\n\x0F\f\x0F" + + "\x0E\x0F\u012F\v\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x05\x0F\u0136" + + "\n\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F" + + "\x03\x0F\x03\x0F\x03\x0F\x07\x0F\u0143\n\x0F\f\x0F\x0E\x0F\u0146\v\x0F" + + "\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x05\x0F\u014D\n\x0F\x05\x0F\u014F" + + "\n\x0F\x03\x10\x03\x10\x03\x11\x03\x11\x03\x12\x03\x12\x03\x13\x03\x13" + + "\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x07\x14\u015E\n\x14\f\x14\x0E" + + "\x14\u0161\v\x14\x05\x14\u0163\n\x14\x03\x14\x05\x14\u0166\n\x14\x03\x14" + + "\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14" + + "\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14" + + "\x07\x14\u017B\n\x14\f\x14\x0E\x14\u017E\v\x14\x03\x14\x05\x14\u0181\n" + + "\x14\x03\x14\x03\x14\x03\x14\x03\x14\x05\x14\u0187\n\x14\x03\x14\x03\x14" + + "\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x05\x14" + + "\u0193\n\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03" + + "\x14\x03\x14\x03\x14\x03\x14\x07\x14\u01A0\n\x14\f\x14\x0E\x14\u01A3\v" + + "\x14\x03\x14\x03\x14\x07\x14\u01A7\n\x14\f\x14\x0E\x14\u01AA\v\x14\x03" + + "\x15\x03\x15\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03" + + "\x16\x03\x16\x07\x16\u01B7\n\x16\f\x16\x0E\x16\u01BA\v\x16\x03\x16\x03" + + "\x16\x03\x16\x05\x16\u01BF\n\x16\x03\x16\x03\x16\x05\x16\u01C3\n\x16\x03" + + "\x17\x03\x17\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x05\x18\u01CC\n\x18" + + "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + + "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u01DC\n\x18\f\x18\x0E" + + "\x18\u01DF\v\x18\x03\x18\x05\x18\u01E2\n\x18\x03\x18\x03\x18\x03\x18\x03" + + "\x18\x03\x18\x03\x18\x03\x18\x07\x18\u01EB\n\x18\f\x18\x0E\x18\u01EE\v" + + "\x18\x03\x18\x05\x18\u01F1\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + + "\x03\x18\x03\x18\x03\x18\x07\x18\u01FB\n\x18\f\x18\x0E\x18\u01FE\v\x18" + + "\x03\x18\x05\x18\u0201\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + + "\x18\x03\x18\x07\x18\u020A\n\x18\f\x18\x0E\x18\u020D\v\x18\x03\x18\x05" + + "\x18\u0210\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x05\x18" + + "\u0218\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u0220" + + "\n\x18\f\x18\x0E\x18\u0223\v\x18\x03\x18\x05\x18\u0226\n\x18\x03\x18\x03" + + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u022E\n\x18\f\x18\x0E\x18" + + "\u0231\v\x18\x03\x18\x05\x18\u0234\n\x18\x03\x18\x03\x18\x03\x18\x03\x18" + + "\x03\x18\x03\x18\x07\x18\u023C\n\x18\f\x18\x0E\x18\u023F\v\x18\x05\x18" + + "\u0241\n\x18\x03\x18\x05\x18\u0244\n\x18\x03\x18\x03\x18\x03\x18\x03\x18" + + "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + + "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + + "\x03\x18\x05\x18\u025D\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x05\x18\u0284\n\x18\x03\x18\x05\x18" + + "\u0287\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u028E\n\x18" + + "\f\x18\x0E\x18\u0291\v\x18\x03\x19\x03\x19\x03\x19\x03\x19\x05\x19\u0297" + + "\n\x19\x03\x19\x03\x19\x03\x19\x07\x19\u029C\n\x19\f\x19\x0E\x19\u029F" + + "\v\x19\x03\x19\x03\x19\x03\x1A\x03\x1A\x05\x1A\u02A5\n\x1A\x03\x1A\x03" + + "\x1A\x03\x1A\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x05\x1B\u02AE\n\x1B\x03\x1B" + + "\x05\x1B\u02B1\n\x1B\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03" + + "\x1C\x03\x1C\x03\x1C\x05\x1C\u02BC\n\x1C\x03\x1D\x03\x1D\x05\x1D\u02C0" + + "\n\x1D\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E" + + "\x07\x1E\u02CA\n\x1E\f\x1E\x0E\x1E\u02CD\v\x1E\x03\x1E\x03\x1E\x03\x1E" + + "\x03\x1E\x05\x1E\u02D3\n\x1E\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x06" + + "\x1F\u02DA\n\x1F\r\x1F\x0E\x1F\u02DB\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x03" + + "\x1F\x03 \x03 \x05 \u02E5\n \x03!\x03!\x03\"\x03\"\x05\"\u02EB\n\"\x03" + + "#\x03#\x03#\x07#\u02F0\n#\f#\x0E#\u02F3\v#\x03$\x03$\x03$\x03$\x03$\x03" + + "$\x05$\u02FB\n$\x03%\x03%\x05%\u02FF\n%\x03&\x03&\x05&\u0303\n&\x03\'" + + "\x03\'\x03(\x03(\x03)\x03)\x03)\x07)\u030C\n)\f)\x0E)\u030F\v)\x03*\x03" + + "*\x03*\x03*\x05*\u0315\n*\x03+\x03+\x03+\x02\x02\x04&.,\x02\x02\x04\x02" + + "\x06\x02\b\x02\n\x02\f\x02\x0E\x02\x10\x02\x12\x02\x14\x02\x16\x02\x18" + + "\x02\x1A\x02\x1C\x02\x1E\x02 \x02\"\x02$\x02&\x02(\x02*\x02,\x02.\x02" + + "0\x022\x024\x026\x028\x02:\x02<\x02>\x02@\x02B\x02D\x02F\x02H\x02J\x02" + + "L\x02N\x02P\x02R\x02T\x02\x02\n\x03\x0257\x03\x0234\x03\x028=\x04\x02" + + "-1AB\x03\x02-0\x05\x02!!-03=\x03\x02*,\x03\x02CD\x02\u037A\x02W\x03\x02" + + "\x02\x02\x04`\x03\x02\x02\x02\x06q\x03\x02\x02\x02\b\x8A\x03\x02\x02\x02" + + "\n\x8C\x03\x02\x02\x02\f\xC7\x03\x02\x02\x02\x0E\xC9\x03\x02\x02\x02\x10" + + "\xD8\x03\x02\x02\x02\x12\xE2\x03\x02\x02\x02\x14\xE9\x03\x02\x02\x02\x16" + + "\xFD\x03\x02\x02\x02\x18\u0111\x03\x02\x02\x02\x1A\u011E\x03\x02\x02\x02" + + "\x1C\u014E\x03\x02\x02\x02\x1E\u0150\x03\x02\x02\x02 \u0152\x03\x02\x02" + + "\x02\"\u0154\x03\x02\x02\x02$\u0156\x03\x02\x02\x02&\u0192\x03\x02\x02" + + "\x02(\u01AB\x03\x02\x02\x02*\u01C2\x03\x02\x02\x02,\u01C4\x03\x02\x02" + + "\x02.\u025C\x03\x02\x02\x020\u0292\x03\x02\x02\x022\u02A4\x03\x02\x02" + + "\x024\u02A9\x03\x02\x02\x026\u02BB\x03\x02\x02\x028\u02BF\x03\x02\x02" + + "\x02:\u02D2\x03\x02\x02\x02<\u02D4\x03\x02\x02\x02>\u02E4\x03\x02\x02" + + "\x02@\u02E6\x03\x02\x02\x02B\u02EA\x03\x02\x02\x02D\u02EC\x03\x02\x02" + + "\x02F\u02FA\x03\x02\x02\x02H\u02FE\x03\x02\x02\x02J\u0302\x03\x02\x02" + + "\x02L\u0304\x03\x02\x02\x02N\u0306\x03\x02\x02\x02P\u0308\x03\x02\x02" + + "\x02R\u0314\x03\x02\x02\x02T\u0316\x03\x02\x02\x02VX\x05\x04\x03\x02W" + + "V\x03\x02\x02\x02XY\x03\x02\x02\x02YW\x03\x02\x02\x02YZ\x03\x02\x02\x02" + + "Z[\x03\x02\x02\x02[\\\x07\x02\x02\x03\\\x03\x03\x02\x02\x02]_\x07E\x02" + + "\x02^]\x03\x02\x02\x02_b\x03\x02\x02\x02`^\x03\x02\x02\x02`a\x03\x02\x02" + + "\x02ac\x03\x02\x02\x02b`\x03\x02\x02\x02cd\x07\x03\x02\x02de\x05P)\x02" + + "ei\x07\x04\x02\x02fh\x05\x06\x04\x02gf\x03\x02\x02\x02hk\x03\x02\x02\x02" + + "ig\x03\x02\x02\x02ij\x03\x02\x02\x02jl\x03\x02\x02\x02ki\x03\x02\x02\x02" + + "lm\x07\x05\x02\x02m\x05\x03\x02\x02\x02np\x07E\x02\x02on\x03\x02\x02\x02" + + "ps\x03\x02\x02\x02qo\x03\x02\x02\x02qr\x03\x02\x02\x02rt\x03\x02\x02\x02" + + "sq\x03\x02\x02\x02tu\x05\b\x05\x02u\x07\x03\x02\x02\x02vw\x07\x06\x02" + + "\x02wx\x05P)\x02xy\x07\x07\x02\x02yz\x05&\x14\x02z\x8B\x03\x02\x02\x02" + + "{|\x07\b\x02\x02|}\x05P)\x02}~\x07\x07\x02\x02~\x7F\x05&\x14\x02\x7F\x8B" + + "\x03\x02\x02\x02\x80\x81\x07\t\x02\x02\x81\x82\x05> \x02\x82\x83\x07>" + + "\x02\x02\x83\x84\x05.\x18\x02\x84\x8B\x03\x02\x02\x02\x85\x8B\x05\x1C" + + "\x0F\x02\x86\x8B\x05\n\x06\x02\x87\x8B\x05\f\x07\x02\x88\x8B\x05\x18\r" + + "\x02\x89\x8B\x05\x1A\x0E\x02\x8Av\x03\x02\x02\x02\x8A{\x03\x02\x02\x02" + + "\x8A\x80\x03\x02\x02\x02\x8A\x85\x03\x02\x02\x02\x8A\x86\x03\x02\x02\x02" + + "\x8A\x87\x03\x02\x02\x02\x8A\x88\x03\x02\x02\x02\x8A\x89\x03\x02\x02\x02" + + "\x8B\t\x03\x02\x02\x02\x8C\x8D\x05\x16\f\x02\x8D\xB2\x05H%\x02\x8E\x97" + + "\x07?\x02\x02\x8F\x94\x05@!\x02\x90\x91\x07\n\x02\x02\x91\x93\x05@!\x02" + + "\x92\x90\x03\x02\x02\x02\x93\x96\x03\x02\x02\x02\x94\x92\x03\x02\x02\x02" + + "\x94\x95\x03\x02\x02\x02\x95\x98\x03\x02\x02\x02\x96\x94\x03\x02\x02\x02" + + "\x97\x8F\x03\x02\x02\x02\x97\x98\x03\x02\x02\x02\x98\x99\x03\x02\x02\x02" + + "\x99\x9C\x07@\x02\x02\x9A\x9B\x07\x07\x02\x02\x9B\x9D\x05&\x14\x02\x9C" + + "\x9A\x03\x02\x02\x02\x9C\x9D\x03\x02\x02\x02\x9D\xB3\x03\x02\x02\x02\x9E" + + "\x9F\x07\x07\x02\x02\x9F\xB3\x05&\x14\x02\xA0\xA1\x07?\x02\x02\xA1\xA2" + + "\x05@!\x02\xA2\xA3\x07\x07\x02\x02\xA3\xAB\x05&\x14\x02\xA4\xA5\x07\n" + + "\x02\x02\xA5\xA6\x05@!\x02\xA6\xA7\x07\x07\x02\x02\xA7\xA8\x05&\x14\x02" + + "\xA8\xAA\x03\x02\x02\x02\xA9\xA4\x03\x02\x02\x02\xAA\xAD\x03\x02\x02\x02" + + "\xAB\xA9\x03\x02\x02\x02\xAB\xAC\x03\x02\x02\x02\xAC\xAE\x03\x02\x02\x02" + + "\xAD\xAB\x03\x02\x02\x02\xAE\xAF\x07@\x02\x02\xAF\xB0\x07\x07\x02\x02" + + "\xB0\xB1\x05&\x14\x02\xB1\xB3\x03\x02\x02\x02\xB2\x8E\x03\x02\x02\x02" + + "\xB2\x9E\x03\x02\x02\x02\xB2\xA0\x03\x02\x02\x02\xB2\xB3\x03\x02\x02\x02" + + "\xB3\xB6\x03\x02\x02\x02\xB4\xB5\x07>\x02\x02\xB5\xB7\x05.\x18\x02\xB6" + + "\xB4\x03\x02\x02\x02\xB6\xB7\x03\x02\x02\x02\xB7\xB9\x03\x02\x02\x02\xB8" + + "\xBA\x07\v\x02\x02\xB9\xB8\x03\x02\x02\x02\xB9\xBA\x03\x02\x02\x02\xBA" + + "\v\x03\x02\x02\x02\xBB\xBC\x07\f\x02\x02\xBC\xC8\x05P)\x02\xBD\xBE\x07" + + "\f\x02\x02\xBE\xBF\x05\x0E\b\x02\xBF\xC0\x07>\x02\x02\xC0\xC1\x05&\x14" + + "\x02\xC1\xC8\x03\x02\x02\x02\xC2\xC3\x07\f\x02\x02\xC3\xC4\x05\x0E\b\x02" + + "\xC4\xC5\x07>\x02\x02\xC5\xC6\x05\x10\t\x02\xC6\xC8\x03\x02\x02\x02\xC7" + + "\xBB\x03\x02\x02\x02\xC7\xBD\x03\x02\x02\x02\xC7\xC2\x03\x02\x02\x02\xC8" + + "\r\x03\x02\x02\x02\xC9\xD5\x05P)\x02\xCA\xCB\x07\r\x02\x02\xCB\xD0\x05" + + "(\x15\x02\xCC\xCD\x07\n\x02\x02\xCD\xCF\x05(\x15\x02\xCE\xCC\x03\x02\x02" + + "\x02\xCF\xD2\x03\x02\x02\x02\xD0\xCE\x03\x02\x02\x02\xD0\xD1\x03\x02\x02" + + "\x02\xD1\xD3\x03\x02\x02\x02\xD2\xD0\x03\x02\x02\x02\xD3\xD4\x07\x0E\x02" + + "\x02\xD4\xD6\x03\x02\x02\x02\xD5\xCA\x03\x02\x02\x02\xD5\xD6\x03\x02\x02" + + "\x02\xD6\x0F\x03\x02\x02\x02\xD7\xD9\x07\x0F\x02\x02\xD8\xD7\x03\x02\x02" + + "\x02\xD8\xD9\x03\x02\x02\x02\xD9\xDA\x03\x02\x02\x02\xDA\xDF\x05\x12\n" + + "\x02\xDB\xDC\x07\x0F\x02\x02\xDC\xDE\x05\x12\n\x02\xDD\xDB\x03\x02\x02" + + "\x02\xDE\xE1\x03\x02\x02\x02\xDF\xDD\x03\x02\x02\x02\xDF\xE0\x03\x02\x02" + + "\x02\xE0\x11\x03\x02\x02\x02\xE1\xDF\x03\x02\x02\x02\xE2\xE7\x05R*\x02" + + "\xE3\xE4\x07?\x02\x02\xE4\xE5\x05&\x14\x02\xE5\xE6\x07@\x02\x02\xE6\xE8" + + "\x03\x02\x02\x02\xE7\xE3\x03\x02\x02\x02\xE7\xE8\x03\x02\x02\x02\xE8\x13" + + "\x03\x02\x02\x02\xE9\xEA\x07\x10\x02\x02\xEA\xED\x05P)\x02\xEB\xEC\x07" + + "\x07\x02\x02\xEC\xEE\x05&\x14\x02\xED\xEB\x03\x02\x02\x02\xED\xEE\x03" + + "\x02\x02\x02\xEE\xEF\x03\x02\x02\x02\xEF\xF0\x07>\x02\x02\xF0\xF2\x05" + + ".\x18\x02\xF1\xF3\x07\v\x02\x02\xF2\xF1\x03\x02\x02\x02\xF2\xF3\x03\x02" + + "\x02\x02\xF3\x15\x03\x02\x02\x02\xF4\xFE\x07\x11\x02\x02\xF5\xFE\x07\x12" + + "\x02\x02\xF6\xF7\x07\x13\x02\x02\xF7\xFE\x07\x11\x02\x02\xF8\xF9\x07\x13" + + "\x02\x02\xF9\xFE\x07\x12\x02\x02\xFA\xFE\x07\x14\x02\x02\xFB\xFE\x07\x15" + + "\x02\x02\xFC\xFE\x07\x16\x02\x02\xFD\xF4\x03\x02\x02\x02\xFD\xF5\x03\x02" + + "\x02\x02\xFD\xF6\x03\x02\x02\x02\xFD\xF8\x03\x02\x02\x02\xFD\xFA\x03\x02" + + "\x02\x02\xFD\xFB\x03\x02\x02\x02\xFD\xFC\x03\x02\x02\x02\xFE\x17\x03\x02" + + "\x02\x02\xFF\u0100\x07\x17\x02\x02\u0100\u0101\x05 \x11\x02\u0101\u0102" + + "\x07\x18\x02\x02\u0102\u0105\x05B\"\x02\u0103\u0104\x07\x19\x02\x02\u0104" + + "\u0106\x05$\x13\x02\u0105\u0103\x03\x02\x02\x02\u0105\u0106\x03\x02\x02" + + "\x02\u0106\u0112\x03\x02\x02\x02\u0107\u0108\x07\x17\x02\x02\u0108\u010B" + + "\x05 \x11\x02\u0109\u010A\x07\x1A\x02\x02\u010A\u010C\x05 \x11\x02\u010B" + + "\u0109\x03\x02\x02\x02\u010B\u010C\x03\x02\x02\x02\u010C\u010F\x03\x02" + + "\x02\x02\u010D\u010E\x07\x19\x02\x02\u010E\u0110\x05$\x13\x02\u010F\u010D" + + "\x03\x02\x02\x02\u010F\u0110\x03\x02\x02\x02\u0110\u0112\x03\x02\x02\x02" + + "\u0111\xFF\x03\x02\x02\x02\u0111\u0107\x03\x02\x02\x02\u0112\x19\x03\x02" + + "\x02\x02\u0113\u0114\x07\x1B\x02\x02\u0114\u0115\x05 \x11\x02\u0115\u0116" + + "\x07\x18\x02\x02\u0116\u0117\x05B\"\x02\u0117\u011F\x03\x02\x02\x02\u0118" + + "\u0119\x07\x1B\x02\x02\u0119\u011C\x05 \x11\x02\u011A\u011B\x07\x1A\x02" + + "\x02\u011B\u011D\x05 \x11\x02\u011C\u011A\x03\x02\x02\x02\u011C\u011D" + + "\x03\x02\x02\x02\u011D\u011F\x03\x02\x02\x02\u011E\u0113\x03\x02\x02\x02" + + "\u011E\u0118\x03\x02\x02\x02\u011F\x1B\x03\x02\x02\x02\u0120\u0121\x07" + + "\x17\x02\x02\u0121\u0122\x05\x1E\x10\x02\u0122\u0123\x07?\x02\x02\u0123" + + "\u0124\x05 \x11\x02\u0124\u0125\x07>\x02\x02\u0125\u012D\x05.\x18\x02" + + "\u0126\u0127\x07\n\x02\x02\u0127\u0128\x05 \x11\x02\u0128\u0129\x07>\x02" + + "\x02\u0129\u012A\x05.\x18\x02\u012A\u012C\x03\x02\x02\x02\u012B\u0126" + + "\x03\x02\x02\x02\u012C\u012F\x03\x02\x02\x02\u012D\u012B\x03\x02\x02\x02" + + "\u012D\u012E\x03\x02\x02\x02\u012E\u0130\x03\x02\x02\x02\u012F\u012D\x03" + + "\x02\x02\x02\u0130\u0131\x07@\x02\x02\u0131\u0132\x07\x18\x02\x02\u0132" + + "\u0135\x075\x02\x02\u0133\u0134\x07\x19\x02\x02\u0134\u0136\x05$\x13\x02" + + "\u0135\u0133\x03\x02\x02\x02\u0135\u0136\x03\x02\x02\x02\u0136\u014F\x03" + + "\x02\x02\x02\u0137\u0138\x07\x17\x02\x02\u0138\u0139\x05\x1E\x10\x02\u0139" + + "\u013A\x07?\x02\x02\u013A\u013B\x05 \x11\x02\u013B\u013C\x07>\x02\x02" + + "\u013C\u0144\x05.\x18\x02\u013D\u013E\x07\n\x02\x02\u013E\u013F\x05 \x11" + + "\x02\u013F\u0140\x07>\x02\x02\u0140\u0141\x05.\x18\x02\u0141\u0143\x03" + + "\x02\x02\x02\u0142\u013D\x03\x02\x02\x02\u0143\u0146\x03\x02\x02\x02\u0144" + + "\u0142\x03\x02\x02\x02\u0144\u0145\x03\x02\x02\x02\u0145\u0147\x03\x02" + + "\x02\x02\u0146\u0144\x03\x02\x02\x02\u0147\u0148\x07@\x02\x02\u0148\u0149" + + "\x07\x1A\x02\x02\u0149\u014C\x05\"\x12\x02\u014A\u014B\x07\x19\x02\x02" + + "\u014B\u014D\x05$\x13\x02\u014C\u014A\x03\x02\x02\x02\u014C\u014D\x03" + + "\x02\x02\x02\u014D\u014F\x03\x02\x02\x02\u014E\u0120\x03\x02\x02\x02\u014E" + + "\u0137\x03\x02\x02\x02\u014F\x1D\x03\x02\x02\x02\u0150\u0151\x05P)\x02" + + "\u0151\x1F\x03\x02\x02\x02\u0152\u0153\x05P)\x02\u0153!\x03\x02\x02\x02" + + "\u0154\u0155\x05P)\x02\u0155#\x03\x02\x02\x02\u0156\u0157\x07*\x02\x02" + + "\u0157%\x03\x02\x02\x02\u0158\u0159\b\x14\x01\x02\u0159\u0162\x07?\x02" + + "\x02\u015A\u015F\x05&\x14\x02\u015B\u015C\x07\n\x02\x02\u015C\u015E\x05" + + "&\x14\x02\u015D\u015B\x03\x02\x02\x02\u015E\u0161\x03\x02\x02\x02\u015F" + + "\u015D\x03\x02\x02\x02\u015F\u0160\x03\x02\x02\x02\u0160\u0163\x03\x02" + + "\x02\x02\u0161\u015F\x03\x02\x02\x02\u0162\u015A\x03\x02\x02\x02\u0162" + + "\u0163\x03\x02\x02\x02\u0163\u0165\x03\x02\x02\x02\u0164\u0166\x07\n\x02" + + "\x02\u0165\u0164\x03\x02\x02\x02\u0165\u0166\x03\x02\x02\x02\u0166\u0167" + + "\x03\x02\x02\x02\u0167\u0168\x07@\x02\x02\u0168\u0169\x07\x1D\x02\x02" + + "\u0169\u0193\x05&\x14\x0E\u016A\u016B\x07A\x02\x02\u016B\u016C\x07\r\x02" + + "\x02\u016C\u016D\x05&\x14\x02\u016D\u016E\x07\x0E\x02\x02\u016E\u0193" + + "\x03\x02\x02\x02\u016F\u0170\x07B\x02\x02\u0170\u0171\x07\r\x02\x02\u0171" + + "\u0172\x05&\x14\x02\u0172\u0173\x07\x0E\x02\x02\u0173\u0193\x03\x02\x02" + + "\x02\u0174\u0175\x07?\x02\x02\u0175\u0176\x05&\x14\x02\u0176\u0177\x07" + + "\n\x02\x02\u0177\u017C\x05&\x14\x02\u0178\u0179\x07\n\x02\x02\u0179\u017B" + + "\x05&\x14\x02\u017A\u0178\x03\x02\x02\x02\u017B\u017E\x03\x02\x02\x02" + + "\u017C\u017A\x03\x02\x02\x02\u017C\u017D\x03\x02\x02\x02\u017D\u0180\x03" + + "\x02\x02\x02\u017E\u017C\x03\x02\x02\x02\u017F\u0181\x07\n\x02\x02\u0180" + + "\u017F\x03\x02\x02\x02\u0180\u0181\x03\x02\x02\x02\u0181\u0182\x03\x02" + + "\x02\x02\u0182\u0183\x07@\x02\x02\u0183\u0193\x03\x02\x02\x02\u0184\u0186" + + "\x07\x04\x02\x02\u0185\u0187\x05*\x16\x02\u0186\u0185\x03\x02\x02\x02" + + "\u0186\u0187\x03\x02\x02\x02\u0187\u0188\x03\x02\x02\x02\u0188\u0193\x07" + + "\x05\x02\x02\u0189\u0193\x07\x1E\x02\x02\u018A\u0193\x07\x1F\x02\x02\u018B" + + "\u0193\x07 \x02\x02\u018C\u0193\x05(\x15\x02\u018D\u0193\x05P)\x02\u018E" + + "\u018F\x07?\x02\x02\u018F\u0190\x05&\x14\x02\u0190\u0191\x07@\x02\x02" + + "\u0191\u0193\x03\x02\x02\x02\u0192\u0158\x03\x02\x02\x02\u0192\u016A\x03" + + "\x02\x02\x02\u0192\u016F\x03\x02\x02\x02\u0192\u0174\x03\x02\x02\x02\u0192" + + "\u0184\x03\x02\x02\x02\u0192\u0189\x03\x02\x02\x02\u0192\u018A\x03\x02" + + "\x02\x02\u0192\u018B\x03\x02\x02\x02\u0192\u018C\x03\x02\x02\x02\u0192" + + "\u018D\x03\x02\x02\x02\u0192\u018E\x03\x02\x02\x02\u0193\u01A8\x03\x02" + + "\x02\x02\u0194\u0195\f\x10\x02\x02\u0195\u0196\x07\x1C\x02\x02\u0196\u01A7" + + "\x05&\x14\x10\u0197\u0198\f\x0F\x02\x02\u0198\u0199\x07\x1D\x02\x02\u0199" + + "\u01A7\x05&\x14\x0F\u019A\u019B\f\x03\x02\x02\u019B\u019C\x07\r\x02\x02" + + "\u019C\u01A1\x05&\x14\x02\u019D\u019E\x07\n\x02\x02\u019E\u01A0\x05&\x14" + + "\x02\u019F\u019D\x03\x02\x02\x02\u01A0\u01A3\x03\x02\x02\x02\u01A1\u019F" + + "\x03\x02\x02\x02\u01A1\u01A2\x03\x02\x02\x02\u01A2\u01A4\x03\x02\x02\x02" + + "\u01A3\u01A1\x03\x02\x02\x02\u01A4\u01A5\x07\x0E\x02\x02\u01A5\u01A7\x03" + + "\x02\x02\x02\u01A6\u0194\x03\x02\x02\x02\u01A6\u0197\x03\x02\x02\x02\u01A6" + + "\u019A\x03\x02\x02\x02\u01A7\u01AA\x03\x02\x02\x02\u01A8\u01A6\x03\x02" + + "\x02\x02\u01A8\u01A9\x03\x02\x02\x02\u01A9\'\x03\x02\x02\x02\u01AA\u01A8" + + "\x03\x02\x02\x02\u01AB\u01AC\x07C\x02\x02\u01AC)\x03\x02\x02\x02\u01AD" + + "\u01AE\x05,\x17\x02\u01AE\u01AF\x07\x07\x02\x02\u01AF\u01B0\x05&\x14\x02" + + "\u01B0\u01B8\x03\x02\x02\x02\u01B1\u01B2\x07\n\x02\x02\u01B2\u01B3\x05" + + ",\x17\x02\u01B3\u01B4\x07\x07\x02\x02\u01B4\u01B5\x05&\x14\x02\u01B5\u01B7" + + "\x03\x02\x02\x02\u01B6\u01B1\x03\x02\x02\x02\u01B7\u01BA\x03\x02\x02\x02" + + "\u01B8\u01B6\x03\x02\x02\x02\u01B8\u01B9\x03\x02\x02\x02\u01B9\u01BE\x03" + + "\x02\x02\x02\u01BA\u01B8\x03\x02\x02\x02\u01BB\u01BF\x07\n\x02\x02\u01BC" + + "\u01BD\x07\x0F\x02\x02\u01BD\u01BF\x05T+\x02\u01BE\u01BB\x03\x02\x02\x02" + + "\u01BE\u01BC\x03\x02\x02\x02\u01BE\u01BF\x03\x02\x02\x02\u01BF\u01C3\x03" + + "\x02\x02\x02\u01C0\u01C1\x07\x0F\x02\x02\u01C1\u01C3\x05T+\x02\u01C2\u01AD" + + "\x03\x02\x02\x02\u01C2\u01C0\x03\x02\x02\x02\u01C3+\x03\x02\x02\x02\u01C4" + + "\u01C5\x05R*\x02\u01C5-\x03\x02\x02\x02\u01C6\u01C7\b\x18\x01\x02\u01C7" + + "\u025D\x058\x1D\x02\u01C8\u01C9\x05H%\x02\u01C9\u01CB\x07?\x02\x02\u01CA" + + "\u01CC\x05D#\x02\u01CB\u01CA\x03\x02\x02\x02\u01CB\u01CC\x03\x02\x02\x02" + + "\u01CC\u01CD\x03\x02\x02\x02\u01CD\u01CE\x07@\x02\x02\u01CE\u025D\x03" + + "\x02\x02\x02\u01CF\u01D0\x074\x02\x02\u01D0\u025D\x05.\x18\x1B\u01D1\u01D2" + + "\x05P)\x02\u01D2\u01D3\x07\"\x02\x02\u01D3\u01D4\x07>\x02\x02\u01D4\u01D5" + + "\x05.\x18\x17\u01D5\u025D\x03\x02\x02\x02\u01D6\u01D7\x07-\x02\x02\u01D7" + + "\u01D8\x07\x04\x02\x02\u01D8\u01DD\x05.\x18\x02\u01D9\u01DA\x07\n\x02" + + "\x02\u01DA\u01DC\x05.\x18\x02\u01DB\u01D9\x03\x02\x02\x02\u01DC\u01DF" + + "\x03\x02\x02\x02\u01DD\u01DB\x03\x02\x02\x02\u01DD\u01DE\x03\x02\x02\x02" + + "\u01DE\u01E1\x03\x02\x02\x02\u01DF\u01DD\x03\x02\x02\x02\u01E0\u01E2\x07" + + "\n\x02\x02\u01E1\u01E0\x03\x02\x02\x02\u01E1\u01E2\x03\x02\x02\x02\u01E2" + + "\u01E3\x03\x02\x02\x02\u01E3\u01E4\x07\x05\x02\x02\u01E4\u025D\x03\x02" + + "\x02\x02\u01E5\u01E6\x07.\x02\x02\u01E6\u01E7\x07\x04\x02\x02\u01E7\u01EC" + + "\x05.\x18\x02\u01E8\u01E9\x07\n\x02\x02\u01E9\u01EB\x05.\x18\x02\u01EA" + + "\u01E8\x03\x02\x02\x02\u01EB\u01EE\x03\x02\x02\x02\u01EC\u01EA\x03\x02" + + "\x02\x02\u01EC\u01ED\x03\x02\x02\x02\u01ED\u01F0\x03\x02\x02\x02\u01EE" + + "\u01EC\x03\x02\x02\x02\u01EF\u01F1\x07\n\x02\x02\u01F0\u01EF\x03\x02\x02" + + "\x02\u01F0"; private static readonly _serializedATNSegment1: string = - "\u01F8\u01F9\x07\n\x02\x02\u01F9\u01FE\x05(\x15\x02\u01FA\u01FB\x07\n" + - "\x02\x02\u01FB\u01FD\x05(\x15\x02\u01FC\u01FA\x03\x02\x02\x02\u01FD\u0200" + - "\x03\x02\x02\x02\u01FE\u01FC\x03\x02\x02\x02\u01FE\u01FF\x03\x02\x02\x02" + - "\u01FF\u0202\x03\x02\x02\x02\u0200\u01FE\x03\x02\x02\x02\u0201\u0203\x07" + - "\n\x02\x02\u0202\u0201\x03\x02\x02\x02\u0202\u0203\x03\x02\x02\x02\u0203" + - "\u0204\x03\x02\x02\x02\u0204\u0205\x07B\x02\x02\u0205\u023A\x03\x02\x02" + - "\x02\u0206\u0207\x07\x04\x02\x02\u0207\u020C\x05@!\x02\u0208\u0209\x07" + - "\n\x02\x02\u0209\u020B\x05@!\x02\u020A\u0208\x03\x02\x02\x02\u020B\u020E" + - "\x03\x02\x02\x02\u020C\u020A\x03\x02\x02\x02\u020C\u020D\x03\x02\x02\x02" + - "\u020D\u0210\x03\x02\x02\x02\u020E\u020C\x03\x02\x02\x02\u020F\u0211\x07" + - "\n\x02\x02\u0210\u020F\x03\x02\x02\x02\u0210\u0211\x03\x02\x02\x02\u0211" + - "\u0212\x03\x02\x02\x02\u0212\u0213\x07\x05\x02\x02\u0213\u023A\x03\x02" + - "\x02\x02\u0214\u021D\x07\x1C\x02\x02\u0215\u021A\x05(\x15\x02\u0216\u0217" + - "\x07\n\x02\x02\u0217\u0219\x05(\x15\x02\u0218\u0216\x03\x02\x02\x02\u0219" + - "\u021C\x03\x02\x02\x02\u021A\u0218\x03\x02\x02\x02\u021A\u021B\x03\x02" + - "\x02\x02\u021B\u021E\x03\x02\x02\x02\u021C\u021A\x03\x02\x02\x02\u021D" + - "\u0215\x03\x02\x02\x02\u021D\u021E\x03\x02\x02\x02\u021E\u0220\x03\x02" + - "\x02\x02\u021F\u0221\x07\n\x02\x02\u0220\u021F\x03\x02\x02\x02\u0220\u0221" + - "\x03\x02\x02\x02\u0221\u0222\x03\x02\x02\x02\u0222\u023A\x07\x1D\x02\x02" + - "\u0223\u0224\x07%\x02\x02\u0224\u0225\x07A\x02\x02\u0225\u0226\x05(\x15" + - "\x02\u0226\u0227\x07B\x02\x02\u0227\u0228\x05(\x15\x02\u0228\u0229\x07" + - "&\x02\x02\u0229\u022A\x05(\x15\x07\u022A\u023A\x03\x02\x02\x02\u022B\u022C" + - "\x05\n\x06\x02\u022C\u022D\x05(\x15\x06\u022D\u023A\x03\x02\x02\x02\u022E" + - "\u022F\x05\x10\t\x02\u022F\u0230\x05(\x15\x05\u0230\u023A\x03\x02\x02" + - "\x02\u0231\u0232\x07A\x02\x02\u0232\u0233\x05(\x15\x02\u0233\u0234\x07" + - "B\x02\x02\u0234\u023A\x03\x02\x02\x02\u0235\u0236\x07\x04\x02\x02\u0236" + - "\u0237\x05(\x15\x02\u0237\u0238\x07\x05\x02\x02\u0238\u023A\x03\x02\x02" + - "\x02\u0239\u01A3\x03\x02\x02\x02\u0239\u01A5\x03\x02\x02\x02\u0239\u01AC" + - "\x03\x02\x02\x02\u0239\u01AE\x03\x02\x02\x02\u0239\u01B3\x03\x02\x02\x02" + - "\u0239\u01C2\x03\x02\x02\x02\u0239\u01D1\x03\x02\x02\x02\u0239\u01D2\x03" + - "\x02\x02\x02\u0239\u01E1\x03\x02\x02\x02\u0239\u01F4\x03\x02\x02\x02\u0239" + - "\u01F6\x03\x02\x02\x02\u0239\u0206\x03\x02\x02\x02\u0239\u0214\x03\x02" + - "\x02\x02\u0239\u0223\x03\x02\x02\x02\u0239\u022B\x03\x02\x02\x02\u0239" + - "\u022E\x03\x02\x02\x02\u0239\u0231\x03\x02\x02\x02\u0239\u0235\x03\x02" + - "\x02\x02\u023A\u026C\x03\x02\x02\x02\u023B\u023C\f\x1C\x02\x02\u023C\u023D" + - "\x07!\x02\x02\u023D\u026B\x05(\x15\x1C\u023E\u023F\f\x1A\x02\x02\u023F" + - "\u0240\t\x02\x02\x02\u0240\u026B\x05(\x15\x1B\u0241\u0242\f\x19\x02\x02" + - "\u0242\u0243\t\x03\x02\x02\u0243\u026B\x05(\x15\x1A\u0244\u0245\f\x18" + - "\x02\x02\u0245\u0246\t\x04\x02\x02\u0246\u026B\x05(\x15\x19\u0247\u0248" + - "\f\x16\x02\x02\u0248\u0249\x07@\x02\x02\u0249\u024A\x05(\x15\x17\u024A" + - "\u024B\b\x15\x01\x02\u024B\u026B\x03\x02\x02\x02\u024C\u024D\f\x14\x02" + - "\x02\u024D\u024E\x07-\x02\x02\u024E\u026B\x05(\x15\x15\u024F\u0250\f\x12" + - "\x02\x02\u0250\u0251\x07.\x02\x02\u0251\u026B\x05(\x15\x13\u0252\u0253" + - "\f\x11\x02\x02\u0253\u0254\x07/\x02\x02\u0254\u026B\x05(\x15\x12\u0255" + - "\u0256\f\x10\x02\x02\u0256\u0257\x070\x02\x02\u0257\u026B\x05(\x15\x11" + - "\u0258\u0259\f\n\x02\x02\u0259\u025A\x07\x1A\x02\x02\u025A\u026B\x05(" + - "\x15\v\u025B\u025C\f \x02\x02\u025C\u025D\x07\x16\x02\x02\u025D\u0263" + - "\x05D#\x02\u025E\u0260\x07A\x02\x02\u025F\u0261\x05> \x02\u0260\u025F" + - "\x03\x02\x02\x02\u0260\u0261\x03\x02\x02\x02\u0261\u0262\x03\x02\x02\x02" + - "\u0262\u0264\x07B\x02\x02\u0263\u025E\x03\x02\x02\x02\u0263\u0264\x03" + - "\x02\x02\x02\u0264\u026B\x03\x02\x02\x02\u0265\u0266\f\x1D\x02\x02\u0266" + - "\u0267\x07\x1C\x02\x02\u0267\u0268\x05(\x15\x02\u0268\u0269\x07\x1D\x02" + - "\x02\u0269\u026B\x03\x02\x02\x02\u026A\u023B\x03\x02\x02\x02\u026A\u023E" + - "\x03\x02\x02\x02\u026A\u0241\x03\x02\x02\x02\u026A\u0244\x03\x02\x02\x02" + - "\u026A\u0247\x03\x02\x02\x02\u026A\u024C\x03\x02\x02\x02\u026A\u024F\x03" + - "\x02\x02\x02\u026A\u0252\x03\x02\x02\x02\u026A\u0255\x03\x02\x02\x02\u026A" + - "\u0258\x03\x02\x02\x02\u026A\u025B\x03\x02\x02\x02\u026A\u0265\x03\x02" + - "\x02\x02\u026B\u026E\x03\x02\x02\x02\u026C\u026A\x03\x02\x02\x02\u026C" + - "\u026D\x03\x02\x02\x02\u026D)\x03\x02\x02\x02\u026E\u026C\x03\x02\x02" + - "\x02\u026F\u0270\x074\x02\x02\u0270\u0271\x05(\x15\x02\u0271\u0273\x07" + - "\x04\x02\x02\u0272\u0274\x07\r\x02\x02\u0273\u0272\x03\x02\x02\x02\u0273" + - "\u0274\x03\x02\x02\x02\u0274\u0275\x03\x02\x02\x02\u0275\u027A\x05,\x17" + - "\x02\u0276\u0277\x07\r\x02\x02\u0277\u0279\x05,\x17\x02\u0278\u0276\x03" + - "\x02\x02\x02\u0279\u027C\x03\x02\x02\x02\u027A\u0278\x03\x02\x02\x02\u027A" + - "\u027B\x03\x02\x02\x02\u027B\u027D\x03\x02\x02\x02\u027C\u027A\x03\x02" + - "\x02\x02\u027D\u027E\x07\x05\x02\x02\u027E+\x03\x02\x02\x02\u027F\u0282" + - "\x05.\x18\x02\u0280\u0282\x07\'\x02\x02\u0281\u027F\x03\x02\x02\x02\u0281" + - "\u0280\x03\x02\x02\x02\u0282\u0283\x03\x02\x02\x02\u0283\u0284\x07\x1B" + - "\x02\x02\u0284\u0285\x05(\x15\x02\u0285-\x03\x02\x02\x02\u0286\u028D\x05" + - "L\'\x02\u0287\u028A\x07A\x02\x02\u0288\u028B\x05L\'\x02\u0289\u028B\x07" + - "\'\x02\x02\u028A\u0288\x03\x02\x02\x02\u028A\u0289\x03\x02\x02\x02\u028B" + - "\u028C\x03\x02\x02\x02\u028C\u028E\x07B\x02\x02\u028D\u0287\x03\x02\x02" + - "\x02\u028D\u028E\x03\x02\x02\x02\u028E/\x03\x02\x02\x02\u028F\u0290\x05" + - "\b\x05\x02\u0290\u0291\x07\x02\x02\x03\u0291\u0299\x03\x02\x02\x02\u0292" + - "\u0293\x05(\x15\x02\u0293\u0294\x07\x02\x02\x03\u0294\u0299\x03\x02\x02" + - "\x02\u0295\u0296\x07E\x02\x02\u0296\u0299\x07\x02\x02\x03\u0297\u0299" + - "\x07\x02\x02\x03\u0298\u028F\x03\x02\x02\x02\u0298\u0292\x03\x02\x02\x02" + - "\u0298\u0295\x03\x02\x02\x02\u0298\u0297\x03\x02\x02\x02\u02991\x03\x02" + - "\x02\x02\u029A\u029D\x054\x1B\x02\u029B\u029D\x056\x1C\x02\u029C\u029A" + - "\x03\x02\x02\x02\u029C\u029B\x03\x02\x02\x02\u029D3\x03\x02\x02\x02\u029E" + - "\u029F\x05:\x1E\x02\u029F\u02A0\x07\x1B\x02\x02\u02A0\u02A1\x05(\x15\x02" + - "\u02A1\u02B0\x03\x02\x02\x02\u02A2\u02A3\x07A\x02\x02\u02A3\u02A8\x05" + - ":\x1E\x02\u02A4\u02A5\x07\n\x02\x02\u02A5\u02A7\x05:\x1E\x02\u02A6\u02A4" + - "\x03\x02\x02\x02\u02A7\u02AA\x03\x02\x02\x02\u02A8\u02A6\x03\x02\x02\x02" + - "\u02A8\u02A9\x03\x02\x02\x02\u02A9\u02AB\x03\x02\x02\x02\u02AA\u02A8\x03" + - "\x02\x02\x02\u02AB\u02AC\x07B\x02\x02\u02AC\u02AD\x07\x1B\x02\x02\u02AD" + - "\u02AE\x05(\x15\x02\u02AE\u02B0\x03\x02\x02\x02\u02AF\u029E\x03\x02\x02" + - "\x02\u02AF\u02A2\x03\x02\x02\x02\u02B05\x03\x02\x02\x02\u02B1\u02B2\x07" + - "A\x02\x02\u02B2\u02B3\x07A\x02\x02\u02B3\u02B6\x05:\x1E\x02\u02B4\u02B5" + - "\x07\n\x02\x02\u02B5\u02B7\x05:\x1E\x02\u02B6\u02B4\x03\x02\x02\x02\u02B7" + - "\u02B8\x03\x02\x02\x02\u02B8\u02B6\x03\x02\x02\x02\u02B8\u02B9\x03\x02" + - "\x02\x02\u02B9\u02BA\x03\x02\x02\x02\u02BA\u02BB\x07B\x02\x02\u02BB\u02BC" + - "\x07B\x02\x02\u02BC\u02BD\x07\x1B\x02\x02\u02BD\u02BE\x05(\x15\x02\u02BE" + - "7\x03\x02\x02\x02\u02BF\u02C2\x07\'\x02\x02\u02C0\u02C2\x05J&\x02\u02C1" + - "\u02BF\x03\x02\x02\x02\u02C1\u02C0\x03\x02\x02\x02\u02C29\x03\x02\x02" + - "\x02\u02C3\u02C4\x058\x1D\x02\u02C4;\x03\x02\x02\x02\u02C5\u02C8\x077" + - "\x02\x02\u02C6\u02C8\x05J&\x02\u02C7\u02C5\x03\x02\x02\x02\u02C7\u02C6" + - "\x03\x02\x02\x02\u02C8=\x03\x02\x02\x02\u02C9\u02CE\x05(\x15\x02\u02CA" + - "\u02CB\x07\n\x02\x02\u02CB\u02CD\x05(\x15\x02\u02CC\u02CA\x03\x02\x02" + - "\x02\u02CD\u02D0\x03\x02\x02\x02\u02CE\u02CC\x03\x02\x02\x02\u02CE\u02CF" + - "\x03\x02\x02\x02\u02CF?\x03\x02\x02\x02\u02D0\u02CE\x03\x02\x02\x02\u02D1" + - "\u02D2\x05L\'\x02\u02D2\u02D3\x07\x07\x02\x02\u02D3\u02D4\x05(\x15\x02" + - "\u02D4\u02D8\x03\x02\x02\x02\u02D5\u02D6\x07(\x02\x02\u02D6\u02D8\x05" + - "(\x15\x02\u02D7\u02D1\x03\x02\x02\x02\u02D7\u02D5\x03\x02\x02\x02\u02D8" + - "A\x03\x02\x02\x02\u02D9\u02DC\x05J&\x02\u02DA\u02DC\t\x05\x02\x02\u02DB" + - "\u02D9\x03\x02\x02\x02\u02DB\u02DA\x03\x02\x02\x02\u02DCC\x03\x02\x02" + - "\x02\u02DD\u02E0\x05J&\x02\u02DE\u02E0\t\x06\x02\x02\u02DF\u02DD\x03\x02" + - "\x02\x02\u02DF\u02DE\x03\x02\x02\x02\u02E0E\x03\x02\x02\x02\u02E1\u02E2" + - "\t\x07\x02\x02\u02E2G\x03\x02\x02\x02\u02E3\u02E4\t\b\x02\x02\u02E4I\x03" + - "\x02\x02\x02\u02E5\u02EA\x05N(\x02\u02E6\u02E7\x07)\x02\x02\u02E7\u02E9" + - "\x05N(\x02\u02E8\u02E6\x03\x02\x02\x02\u02E9\u02EC\x03\x02\x02\x02\u02EA" + - "\u02E8\x03\x02\x02\x02\u02EA\u02EB\x03\x02\x02\x02\u02EBK\x03\x02\x02" + - "\x02\u02EC\u02EA\x03\x02\x02\x02\u02ED\u02F2\x05N(\x02\u02EE\u02EF\x05" + - "J&\x02\u02EF\u02F0\b\'\x01\x02\u02F0\u02F2\x03\x02\x02\x02\u02F1\u02ED" + - "\x03\x02\x02\x02\u02F1\u02EE\x03\x02\x02\x02\u02F2M\x03\x02\x02\x02\u02F3" + - "\u02F4\t\t\x02\x02\u02F4O\x03\x02\x02\x02TSZck\x84\x8E\x91\x96\xA5\xAC" + - "\xB0\xB3\xC0\xC7\xCA\xD1\xD7\xDC\xE7\xEF\xF5\xF9\xFB\u0106\u0108\u0117" + - "\u011F\u012E\u0136\u0138\u0149\u014C\u014F\u0166\u016A\u017B\u0183\u0185" + - "\u018F\u0199\u019B\u019F\u01A8\u01BA\u01BE\u01C9\u01CD\u01D9\u01DD\u01E8" + - "\u01EC\u01F4\u01FE\u0202\u020C\u0210\u021A\u021D\u0220\u0239\u0260\u0263" + - "\u026A\u026C\u0273\u027A\u0281\u028A\u028D\u0298\u029C\u02A8\u02AF\u02B8" + - "\u02C1\u02C7\u02CE\u02D7\u02DB\u02DF\u02EA\u02F1"; + "\u01F1\x03\x02\x02\x02\u01F1\u01F2\x03\x02\x02\x02\u01F2\u01F3\x07\x05" + + "\x02\x02\u01F3\u025D\x03\x02\x02\x02\u01F4\u025D\x050\x19\x02\u01F5\u01F6" + + "\x07#\x02\x02\u01F6\u01F7\x07\x04\x02\x02\u01F7\u01FC\x05.\x18\x02\u01F8" + + "\u01F9\x07\n\x02\x02\u01F9\u01FB\x05.\x18\x02\u01FA\u01F8\x03\x02\x02" + + "\x02\u01FB\u01FE\x03\x02\x02\x02\u01FC\u01FA\x03\x02\x02\x02\u01FC\u01FD" + + "\x03\x02\x02\x02\u01FD\u0200\x03\x02\x02\x02\u01FE\u01FC\x03\x02\x02\x02" + + "\u01FF\u0201\x07\n\x02\x02\u0200\u01FF\x03\x02\x02\x02\u0200\u0201\x03" + + "\x02\x02\x02\u0201\u0202\x03\x02\x02\x02\u0202\u0203\x07\x05\x02\x02\u0203" + + "\u025D\x03\x02\x02\x02\u0204\u0205\x07$\x02\x02\u0205\u0206\x07\x04\x02" + + "\x02\u0206\u020B\x05.\x18\x02\u0207\u0208\x07\n\x02\x02\u0208\u020A\x05" + + ".\x18\x02\u0209\u0207\x03\x02\x02\x02\u020A\u020D\x03\x02\x02\x02\u020B" + + "\u0209\x03\x02\x02\x02\u020B\u020C\x03\x02\x02\x02\u020C\u020F\x03\x02" + + "\x02\x02\u020D\u020B\x03\x02\x02\x02\u020E\u0210\x07\n\x02\x02\u020F\u020E" + + "\x03\x02\x02\x02\u020F\u0210\x03\x02\x02\x02\u0210\u0211\x03\x02\x02\x02" + + "\u0211\u0212\x07\x05\x02\x02\u0212\u025D\x03\x02\x02\x02\u0213\u0218\x05" + + "P)\x02\u0214\u0218\x07,\x02\x02\u0215\u0218\x07+\x02\x02\u0216\u0218\x07" + + "*\x02\x02\u0217\u0213\x03\x02\x02\x02\u0217\u0214\x03\x02\x02\x02\u0217" + + "\u0215\x03\x02\x02\x02\u0217\u0216\x03\x02\x02\x02\u0218\u025D\x03\x02" + + "\x02\x02\u0219\u021A\x07?\x02\x02\u021A\u021B\x05.\x18\x02\u021B\u021C" + + "\x07\n\x02\x02\u021C\u0221\x05.\x18\x02\u021D\u021E\x07\n\x02\x02\u021E" + + "\u0220\x05.\x18\x02\u021F\u021D\x03\x02\x02\x02\u0220\u0223\x03\x02\x02" + + "\x02\u0221\u021F\x03\x02\x02\x02\u0221\u0222\x03\x02\x02\x02\u0222\u0225" + + "\x03\x02\x02\x02\u0223\u0221\x03\x02\x02\x02\u0224\u0226\x07\n\x02\x02" + + "\u0225\u0224\x03\x02\x02\x02\u0225\u0226\x03\x02\x02\x02\u0226\u0227\x03" + + "\x02\x02\x02\u0227\u0228\x07@\x02\x02\u0228\u025D\x03\x02\x02\x02\u0229" + + "\u022A\x07\x04\x02\x02\u022A\u022F\x05F$\x02\u022B\u022C\x07\n\x02\x02" + + "\u022C\u022E\x05F$\x02\u022D\u022B\x03\x02\x02\x02\u022E\u0231\x03\x02" + + "\x02\x02\u022F\u022D\x03\x02\x02\x02\u022F\u0230\x03\x02\x02\x02\u0230" + + "\u0233\x03\x02\x02\x02\u0231\u022F\x03\x02\x02\x02\u0232\u0234\x07\n\x02" + + "\x02\u0233\u0232\x03\x02\x02\x02\u0233\u0234\x03\x02\x02\x02\u0234\u0235" + + "\x03\x02\x02\x02\u0235\u0236\x07\x05\x02\x02\u0236\u025D\x03\x02\x02\x02" + + "\u0237\u0240\x07\r\x02\x02\u0238\u023D\x05.\x18\x02\u0239\u023A\x07\n" + + "\x02\x02\u023A\u023C\x05.\x18\x02\u023B\u0239\x03\x02\x02\x02\u023C\u023F" + + "\x03\x02\x02\x02\u023D\u023B\x03\x02\x02\x02\u023D\u023E\x03\x02\x02\x02" + + "\u023E\u0241\x03\x02\x02\x02\u023F\u023D\x03\x02\x02\x02\u0240\u0238\x03" + + "\x02\x02\x02\u0240\u0241\x03\x02\x02\x02\u0241\u0243\x03\x02\x02\x02\u0242" + + "\u0244\x07\n\x02\x02\u0243\u0242\x03\x02\x02\x02\u0243\u0244\x03\x02\x02" + + "\x02\u0244\u0245\x03\x02\x02\x02\u0245\u025D\x07\x0E\x02\x02\u0246\u0247" + + "\x07%\x02\x02\u0247\u0248\x07?\x02\x02\u0248\u0249\x05.\x18\x02\u0249" + + "\u024A\x07@\x02\x02\u024A\u024B\x05.\x18\x02\u024B\u024C\x07&\x02\x02" + + "\u024C\u024D\x05.\x18\x07\u024D\u025D\x03\x02\x02\x02\u024E\u024F\x05" + + "\n\x06\x02\u024F\u0250\x05.\x18\x06\u0250\u025D\x03\x02\x02\x02\u0251" + + "\u0252\x05\x14\v\x02\u0252\u0253\x05.\x18\x05\u0253\u025D\x03\x02\x02" + + "\x02\u0254\u0255\x07?\x02\x02\u0255\u0256\x05.\x18\x02\u0256\u0257\x07" + + "@\x02\x02\u0257\u025D\x03\x02\x02\x02\u0258\u0259\x07\x04\x02\x02\u0259" + + "\u025A\x05.\x18\x02\u025A\u025B\x07\x05\x02\x02\u025B\u025D\x03\x02\x02" + + "\x02\u025C\u01C6\x03\x02\x02\x02\u025C\u01C8\x03\x02\x02\x02\u025C\u01CF" + + "\x03\x02\x02\x02\u025C\u01D1\x03\x02\x02\x02\u025C\u01D6\x03\x02\x02\x02" + + "\u025C\u01E5\x03\x02\x02\x02\u025C\u01F4\x03\x02\x02\x02\u025C\u01F5\x03" + + "\x02\x02\x02\u025C\u0204\x03\x02\x02\x02\u025C\u0217\x03\x02\x02\x02\u025C" + + "\u0219\x03\x02\x02\x02\u025C\u0229\x03\x02\x02\x02\u025C\u0237\x03\x02" + + "\x02\x02\u025C\u0246\x03\x02\x02\x02\u025C\u024E\x03\x02\x02\x02\u025C" + + "\u0251\x03\x02\x02\x02\u025C\u0254\x03\x02\x02\x02\u025C\u0258\x03\x02" + + "\x02\x02\u025D\u028F\x03\x02\x02\x02\u025E\u025F\f\x1C\x02\x02\u025F\u0260" + + "\x07!\x02\x02\u0260\u028E\x05.\x18\x1C\u0261\u0262\f\x1A\x02\x02\u0262" + + "\u0263\t\x02\x02\x02\u0263\u028E\x05.\x18\x1B\u0264\u0265\f\x19\x02\x02" + + "\u0265\u0266\t\x03\x02\x02\u0266\u028E\x05.\x18\x1A\u0267\u0268\f\x18" + + "\x02\x02\u0268\u0269\t\x04\x02\x02\u0269\u028E\x05.\x18\x19\u026A\u026B" + + "\f\x16\x02\x02\u026B\u026C\x07>\x02\x02\u026C\u026D\x05.\x18\x17\u026D" + + "\u026E\b\x18\x01\x02\u026E\u028E\x03\x02\x02\x02\u026F\u0270\f\x14\x02" + + "\x02\u0270\u0271\x07-\x02\x02\u0271\u028E\x05.\x18\x15\u0272\u0273\f\x12" + + "\x02\x02\u0273\u0274\x07.\x02\x02\u0274\u028E\x05.\x18\x13\u0275\u0276" + + "\f\x11\x02\x02\u0276\u0277\x07/\x02\x02\u0277\u028E\x05.\x18\x12\u0278" + + "\u0279\f\x10\x02\x02\u0279\u027A\x070\x02\x02\u027A\u028E\x05.\x18\x11" + + "\u027B\u027C\f\n\x02\x02\u027C\u027D\x07\x1C\x02\x02\u027D\u028E\x05." + + "\x18\v\u027E\u027F\f \x02\x02\u027F\u0280\x07\x18\x02\x02\u0280\u0286" + + "\x05J&\x02\u0281\u0283\x07?\x02\x02\u0282\u0284\x05D#\x02\u0283\u0282" + + "\x03\x02\x02\x02\u0283\u0284\x03\x02\x02\x02\u0284\u0285\x03\x02\x02\x02" + + "\u0285\u0287\x07@\x02\x02\u0286\u0281\x03\x02\x02\x02\u0286\u0287\x03" + + "\x02\x02\x02\u0287\u028E\x03\x02\x02\x02\u0288\u0289\f\x1D\x02\x02\u0289" + + "\u028A\x07\r\x02\x02\u028A\u028B\x05.\x18\x02\u028B\u028C\x07\x0E\x02" + + "\x02\u028C\u028E\x03\x02\x02\x02\u028D\u025E\x03\x02\x02\x02\u028D\u0261" + + "\x03\x02\x02\x02\u028D\u0264\x03\x02\x02\x02\u028D\u0267\x03\x02\x02\x02" + + "\u028D\u026A\x03\x02\x02\x02\u028D\u026F\x03\x02\x02\x02\u028D\u0272\x03" + + "\x02\x02\x02\u028D\u0275\x03\x02\x02\x02\u028D\u0278\x03\x02\x02\x02\u028D" + + "\u027B\x03\x02\x02\x02\u028D\u027E\x03\x02\x02\x02\u028D\u0288\x03\x02" + + "\x02\x02\u028E\u0291\x03\x02\x02\x02\u028F\u028D\x03\x02\x02\x02\u028F" + + "\u0290\x03\x02\x02\x02\u0290/\x03\x02\x02\x02\u0291\u028F\x03\x02\x02" + + "\x02\u0292\u0293\x072\x02\x02\u0293\u0294\x05.\x18\x02\u0294\u0296\x07" + + "\x04\x02\x02\u0295\u0297\x07\x0F\x02\x02\u0296\u0295\x03\x02\x02\x02\u0296" + + "\u0297\x03\x02\x02\x02\u0297\u0298\x03\x02\x02\x02\u0298\u029D\x052\x1A" + + "\x02\u0299\u029A\x07\x0F\x02\x02\u029A\u029C\x052\x1A\x02\u029B\u0299" + + "\x03\x02\x02\x02\u029C\u029F\x03\x02\x02\x02\u029D\u029B\x03\x02\x02\x02" + + "\u029D\u029E\x03\x02\x02\x02\u029E\u02A0\x03\x02\x02\x02\u029F\u029D\x03" + + "\x02\x02\x02\u02A0\u02A1\x07\x05\x02\x02\u02A11\x03\x02\x02\x02\u02A2" + + "\u02A5\x054\x1B\x02\u02A3\u02A5\x07\'\x02\x02\u02A4\u02A2\x03\x02\x02" + + "\x02\u02A4\u02A3\x03\x02\x02\x02\u02A5\u02A6\x03\x02\x02\x02\u02A6\u02A7" + + "\x07\x1D\x02\x02\u02A7\u02A8\x05.\x18\x02\u02A83\x03\x02\x02\x02\u02A9" + + "\u02B0\x05R*\x02\u02AA\u02AD\x07?\x02\x02\u02AB\u02AE\x05R*\x02\u02AC" + + "\u02AE\x07\'\x02\x02\u02AD\u02AB\x03\x02\x02\x02\u02AD\u02AC\x03\x02\x02" + + "\x02\u02AE\u02AF\x03\x02\x02\x02\u02AF\u02B1\x07@\x02\x02\u02B0\u02AA" + + "\x03\x02\x02\x02\u02B0\u02B1\x03\x02\x02\x02\u02B15\x03\x02\x02\x02\u02B2" + + "\u02B3\x05\b\x05\x02\u02B3\u02B4\x07\x02\x02\x03\u02B4\u02BC\x03\x02\x02" + + "\x02\u02B5\u02B6\x05.\x18\x02\u02B6\u02B7\x07\x02\x02\x03\u02B7\u02BC" + + "\x03\x02\x02\x02\u02B8\u02B9\x07E\x02\x02\u02B9\u02BC\x07\x02\x02\x03" + + "\u02BA\u02BC\x07\x02\x02\x03\u02BB\u02B2\x03\x02\x02\x02\u02BB\u02B5\x03" + + "\x02\x02\x02\u02BB\u02B8\x03\x02\x02\x02\u02BB\u02BA\x03\x02\x02\x02\u02BC" + + "7\x03\x02\x02\x02\u02BD\u02C0\x05:\x1E\x02\u02BE\u02C0\x05<\x1F\x02\u02BF" + + "\u02BD\x03\x02\x02\x02\u02BF\u02BE\x03\x02\x02\x02\u02C09\x03\x02\x02" + + "\x02\u02C1\u02C2\x05@!\x02\u02C2\u02C3\x07\x1D\x02\x02\u02C3\u02C4\x05" + + ".\x18\x02\u02C4\u02D3\x03\x02\x02\x02\u02C5\u02C6\x07?\x02\x02\u02C6\u02CB" + + "\x05@!\x02\u02C7\u02C8\x07\n\x02\x02\u02C8\u02CA\x05@!\x02\u02C9\u02C7" + + "\x03\x02\x02\x02\u02CA\u02CD\x03\x02\x02\x02\u02CB\u02C9\x03\x02\x02\x02" + + "\u02CB\u02CC\x03\x02\x02\x02\u02CC\u02CE\x03\x02\x02\x02\u02CD\u02CB\x03" + + "\x02\x02\x02\u02CE\u02CF\x07@\x02\x02\u02CF\u02D0\x07\x1D\x02\x02\u02D0" + + "\u02D1\x05.\x18\x02\u02D1\u02D3\x03\x02\x02\x02\u02D2\u02C1\x03\x02\x02" + + "\x02\u02D2\u02C5\x03\x02\x02\x02\u02D3;\x03\x02\x02\x02\u02D4\u02D5\x07" + + "?\x02\x02\u02D5\u02D6\x07?\x02\x02\u02D6\u02D9\x05@!\x02\u02D7\u02D8\x07" + + "\n\x02\x02\u02D8\u02DA\x05@!\x02\u02D9\u02D7\x03\x02\x02\x02\u02DA\u02DB" + + "\x03\x02\x02\x02\u02DB\u02D9\x03\x02\x02\x02\u02DB\u02DC\x03\x02\x02\x02" + + "\u02DC\u02DD\x03\x02\x02\x02\u02DD\u02DE\x07@\x02\x02\u02DE\u02DF\x07" + + "@\x02\x02\u02DF\u02E0\x07\x1D\x02\x02\u02E0\u02E1\x05.\x18\x02\u02E1=" + + "\x03\x02\x02\x02\u02E2\u02E5\x07\'\x02\x02\u02E3\u02E5\x05P)\x02\u02E4" + + "\u02E2\x03\x02\x02\x02\u02E4\u02E3\x03\x02\x02\x02\u02E5?\x03\x02\x02" + + "\x02\u02E6\u02E7\x05> \x02\u02E7A\x03\x02\x02\x02\u02E8\u02EB\x075\x02" + + "\x02\u02E9\u02EB\x05P)\x02\u02EA\u02E8\x03\x02\x02\x02\u02EA\u02E9\x03" + + "\x02\x02\x02\u02EBC\x03\x02\x02\x02\u02EC\u02F1\x05.\x18\x02\u02ED\u02EE" + + "\x07\n\x02\x02\u02EE\u02F0\x05.\x18\x02\u02EF\u02ED\x03\x02\x02\x02\u02F0" + + "\u02F3\x03\x02\x02\x02\u02F1\u02EF\x03\x02\x02\x02\u02F1\u02F2\x03\x02" + + "\x02\x02\u02F2E\x03\x02\x02\x02\u02F3\u02F1\x03\x02\x02\x02\u02F4\u02F5" + + "\x05R*\x02\u02F5\u02F6\x07\x07\x02\x02\u02F6\u02F7\x05.\x18\x02\u02F7" + + "\u02FB\x03\x02\x02\x02\u02F8\u02F9\x07(\x02\x02\u02F9\u02FB\x05.\x18\x02" + + "\u02FA\u02F4\x03\x02\x02\x02\u02FA\u02F8\x03\x02\x02\x02\u02FBG\x03\x02" + + "\x02\x02\u02FC\u02FF\x05P)\x02\u02FD\u02FF\t\x05\x02\x02\u02FE\u02FC\x03" + + "\x02\x02\x02\u02FE\u02FD\x03\x02\x02\x02\u02FFI\x03\x02\x02\x02\u0300" + + "\u0303\x05P)\x02\u0301\u0303\t\x06\x02\x02\u0302\u0300\x03\x02\x02\x02" + + "\u0302\u0301\x03\x02\x02\x02\u0303K\x03\x02\x02\x02\u0304\u0305\t\x07" + + "\x02\x02\u0305M\x03\x02\x02\x02\u0306\u0307\t\b\x02\x02\u0307O\x03\x02" + + "\x02\x02\u0308\u030D\x05T+\x02\u0309\u030A\x07)\x02\x02\u030A\u030C\x05" + + "T+\x02\u030B\u0309\x03\x02\x02\x02\u030C\u030F\x03\x02\x02\x02\u030D\u030B" + + "\x03\x02\x02\x02\u030D\u030E\x03\x02\x02\x02\u030EQ\x03\x02\x02\x02\u030F" + + "\u030D\x03\x02\x02\x02\u0310\u0315\x05T+\x02\u0311\u0312\x05P)\x02\u0312" + + "\u0313\b*\x01\x02\u0313\u0315\x03\x02\x02\x02\u0314\u0310\x03\x02\x02" + + "\x02\u0314\u0311\x03\x02\x02\x02\u0315S\x03\x02\x02\x02\u0316\u0317\t" + + "\t\x02\x02\u0317U\x03\x02\x02\x02WY`iq\x8A\x94\x97\x9C\xAB\xB2\xB6\xB9" + + "\xC7\xD0\xD5\xD8\xDF\xE7\xED\xF2\xFD\u0105\u010B\u010F\u0111\u011C\u011E" + + "\u012D\u0135\u0144\u014C\u014E\u015F\u0162\u0165\u017C\u0180\u0186\u0192" + + "\u01A1\u01A6\u01A8\u01B8\u01BE\u01C2\u01CB\u01DD\u01E1\u01EC\u01F0\u01FC" + + "\u0200\u020B\u020F\u0217\u0221\u0225\u022F\u0233\u023D\u0240\u0243\u025C" + + "\u0283\u0286\u028D\u028F\u0296\u029D\u02A4\u02AD\u02B0\u02BB\u02BF\u02CB" + + "\u02D2\u02DB\u02E4\u02EA\u02F1\u02FA\u02FE\u0302\u030D\u0314"; public static readonly _serializedATN: string = Utils.join( [ QuintParser._serializedATNSegment0, @@ -4356,8 +4525,8 @@ export class TypeAbstractDefContext extends TypeDefContext { } } export class TypeAliasDefContext extends TypeDefContext { - public qualId(): QualIdContext { - return this.getRuleContext(0, QualIdContext); + public typeDefHead(): TypeDefHeadContext { + return this.getRuleContext(0, TypeDefHeadContext); } public ASGN(): TerminalNode { return this.getToken(QuintParser.ASGN, 0); } public type(): TypeContext { @@ -4389,19 +4558,12 @@ export class TypeAliasDefContext extends TypeDefContext { } } export class TypeSumDefContext extends TypeDefContext { - public _typeName!: QualIdContext; - public ASGN(): TerminalNode { return this.getToken(QuintParser.ASGN, 0); } - public typeSumVariant(): TypeSumVariantContext[]; - public typeSumVariant(i: number): TypeSumVariantContext; - public typeSumVariant(i?: number): TypeSumVariantContext | TypeSumVariantContext[] { - if (i === undefined) { - return this.getRuleContexts(TypeSumVariantContext); - } else { - return this.getRuleContext(i, TypeSumVariantContext); - } + public typeDefHead(): TypeDefHeadContext { + return this.getRuleContext(0, TypeDefHeadContext); } - public qualId(): QualIdContext { - return this.getRuleContext(0, QualIdContext); + public ASGN(): TerminalNode { return this.getToken(QuintParser.ASGN, 0); } + public sumTypeDefinition(): SumTypeDefinitionContext { + return this.getRuleContext(0, SumTypeDefinitionContext); } constructor(ctx: TypeDefContext) { super(ctx.parent, ctx.invokingState); @@ -4430,6 +4592,88 @@ export class TypeSumDefContext extends TypeDefContext { } +export class TypeDefHeadContext extends ParserRuleContext { + public _typeName!: QualIdContext; + public _typeVar!: TypeVarContext; + public _typeVars: TypeVarContext[] = []; + public qualId(): QualIdContext { + return this.getRuleContext(0, QualIdContext); + } + public typeVar(): TypeVarContext[]; + public typeVar(i: number): TypeVarContext; + public typeVar(i?: number): TypeVarContext | TypeVarContext[] { + if (i === undefined) { + return this.getRuleContexts(TypeVarContext); + } else { + return this.getRuleContext(i, TypeVarContext); + } + } + constructor(parent: ParserRuleContext | undefined, invokingState: number) { + super(parent, invokingState); + } + // @Override + public get ruleIndex(): number { return QuintParser.RULE_typeDefHead; } + // @Override + public enterRule(listener: QuintListener): void { + if (listener.enterTypeDefHead) { + listener.enterTypeDefHead(this); + } + } + // @Override + public exitRule(listener: QuintListener): void { + if (listener.exitTypeDefHead) { + listener.exitTypeDefHead(this); + } + } + // @Override + public accept(visitor: QuintVisitor): Result { + if (visitor.visitTypeDefHead) { + return visitor.visitTypeDefHead(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class SumTypeDefinitionContext extends ParserRuleContext { + public typeSumVariant(): TypeSumVariantContext[]; + public typeSumVariant(i: number): TypeSumVariantContext; + public typeSumVariant(i?: number): TypeSumVariantContext | TypeSumVariantContext[] { + if (i === undefined) { + return this.getRuleContexts(TypeSumVariantContext); + } else { + return this.getRuleContext(i, TypeSumVariantContext); + } + } + constructor(parent: ParserRuleContext | undefined, invokingState: number) { + super(parent, invokingState); + } + // @Override + public get ruleIndex(): number { return QuintParser.RULE_sumTypeDefinition; } + // @Override + public enterRule(listener: QuintListener): void { + if (listener.enterSumTypeDefinition) { + listener.enterSumTypeDefinition(this); + } + } + // @Override + public exitRule(listener: QuintListener): void { + if (listener.exitSumTypeDefinition) { + listener.exitSumTypeDefinition(this); + } + } + // @Override + public accept(visitor: QuintVisitor): Result { + if (visitor.visitSumTypeDefinition) { + return visitor.visitSumTypeDefinition(this); + } else { + return visitor.visitChildren(this); + } + } +} + + export class TypeSumVariantContext extends ParserRuleContext { public _sumLabel!: SimpleIdContext; public simpleId(): SimpleIdContext { @@ -4995,8 +5239,8 @@ export class TypeTupleContext extends TypeContext { } } export class TypeRecContext extends TypeContext { - public row(): RowContext { - return this.getRuleContext(0, RowContext); + public row(): RowContext | undefined { + return this.tryGetRuleContext(0, RowContext); } constructor(ctx: TypeContext) { super(ctx.parent, ctx.invokingState); @@ -5101,28 +5345,30 @@ export class TypeBoolContext extends TypeContext { } } } -export class TypeVarContext extends TypeContext { - public LOW_ID(): TerminalNode { return this.getToken(QuintParser.LOW_ID, 0); } +export class TypeVarCaseContext extends TypeContext { + public typeVar(): TypeVarContext { + return this.getRuleContext(0, TypeVarContext); + } constructor(ctx: TypeContext) { super(ctx.parent, ctx.invokingState); this.copyFrom(ctx); } // @Override public enterRule(listener: QuintListener): void { - if (listener.enterTypeVar) { - listener.enterTypeVar(this); + if (listener.enterTypeVarCase) { + listener.enterTypeVarCase(this); } } // @Override public exitRule(listener: QuintListener): void { - if (listener.exitTypeVar) { - listener.exitTypeVar(this); + if (listener.exitTypeVarCase) { + listener.exitTypeVarCase(this); } } // @Override public accept(visitor: QuintVisitor): Result { - if (visitor.visitTypeVar) { - return visitor.visitTypeVar(this); + if (visitor.visitTypeVarCase) { + return visitor.visitTypeVarCase(this); } else { return visitor.visitChildren(this); } @@ -5188,6 +5434,74 @@ export class TypeParenContext extends TypeContext { } } } +export class TypeAppContext extends TypeContext { + public _typeCtor!: TypeContext; + public _type!: TypeContext; + public _typeArg: TypeContext[] = []; + public type(): TypeContext[]; + public type(i: number): TypeContext; + public type(i?: number): TypeContext | TypeContext[] { + if (i === undefined) { + return this.getRuleContexts(TypeContext); + } else { + return this.getRuleContext(i, TypeContext); + } + } + constructor(ctx: TypeContext) { + super(ctx.parent, ctx.invokingState); + this.copyFrom(ctx); + } + // @Override + public enterRule(listener: QuintListener): void { + if (listener.enterTypeApp) { + listener.enterTypeApp(this); + } + } + // @Override + public exitRule(listener: QuintListener): void { + if (listener.exitTypeApp) { + listener.exitTypeApp(this); + } + } + // @Override + public accept(visitor: QuintVisitor): Result { + if (visitor.visitTypeApp) { + return visitor.visitTypeApp(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class TypeVarContext extends ParserRuleContext { + public LOW_ID(): TerminalNode { return this.getToken(QuintParser.LOW_ID, 0); } + constructor(parent: ParserRuleContext | undefined, invokingState: number) { + super(parent, invokingState); + } + // @Override + public get ruleIndex(): number { return QuintParser.RULE_typeVar; } + // @Override + public enterRule(listener: QuintListener): void { + if (listener.enterTypeVar) { + listener.enterTypeVar(this); + } + } + // @Override + public exitRule(listener: QuintListener): void { + if (listener.exitTypeVar) { + listener.exitTypeVar(this); + } + } + // @Override + public accept(visitor: QuintVisitor): Result { + if (visitor.visitTypeVar) { + return visitor.visitTypeVar(this); + } else { + return visitor.visitChildren(this); + } + } +} export class RowContext extends ParserRuleContext { diff --git a/quint/src/generated/QuintVisitor.ts b/quint/src/generated/QuintVisitor.ts index 19a707994..4d01a74d9 100644 --- a/quint/src/generated/QuintVisitor.ts +++ b/quint/src/generated/QuintVisitor.ts @@ -18,9 +18,10 @@ import { TypeRecContext } from "./QuintParser"; import { TypeIntContext } from "./QuintParser"; import { TypeStrContext } from "./QuintParser"; import { TypeBoolContext } from "./QuintParser"; -import { TypeVarContext } from "./QuintParser"; +import { TypeVarCaseContext } from "./QuintParser"; import { TypeConstContext } from "./QuintParser"; import { TypeParenContext } from "./QuintParser"; +import { TypeAppContext } from "./QuintParser"; import { TypeAbstractDefContext } from "./QuintParser"; import { TypeAliasDefContext } from "./QuintParser"; import { TypeSumDefContext } from "./QuintParser"; @@ -68,6 +69,8 @@ import { DocumentedDeclarationContext } from "./QuintParser"; import { DeclarationContext } from "./QuintParser"; import { OperDefContext } from "./QuintParser"; import { TypeDefContext } from "./QuintParser"; +import { TypeDefHeadContext } from "./QuintParser"; +import { SumTypeDefinitionContext } from "./QuintParser"; import { TypeSumVariantContext } from "./QuintParser"; import { NondetOperDefContext } from "./QuintParser"; import { QualifierContext } from "./QuintParser"; @@ -79,6 +82,7 @@ import { NameContext } from "./QuintParser"; import { QualifiedNameContext } from "./QuintParser"; import { FromSourceContext } from "./QuintParser"; import { TypeContext } from "./QuintParser"; +import { TypeVarContext } from "./QuintParser"; import { RowContext } from "./QuintParser"; import { RowLabelContext } from "./QuintParser"; import { ExprContext } from "./QuintParser"; @@ -184,12 +188,12 @@ export interface QuintVisitor extends ParseTreeVisitor { visitTypeBool?: (ctx: TypeBoolContext) => Result; /** - * Visit a parse tree produced by the `typeVar` + * Visit a parse tree produced by the `typeVarCase` * labeled alternative in `QuintParser.type`. * @param ctx the parse tree * @return the visitor result */ - visitTypeVar?: (ctx: TypeVarContext) => Result; + visitTypeVarCase?: (ctx: TypeVarCaseContext) => Result; /** * Visit a parse tree produced by the `typeConst` @@ -207,6 +211,14 @@ export interface QuintVisitor extends ParseTreeVisitor { */ visitTypeParen?: (ctx: TypeParenContext) => Result; + /** + * Visit a parse tree produced by the `typeApp` + * labeled alternative in `QuintParser.type`. + * @param ctx the parse tree + * @return the visitor result + */ + visitTypeApp?: (ctx: TypeAppContext) => Result; + /** * Visit a parse tree produced by the `typeAbstractDef` * labeled alternative in `QuintParser.typeDef`. @@ -577,6 +589,20 @@ export interface QuintVisitor extends ParseTreeVisitor { */ visitTypeDef?: (ctx: TypeDefContext) => Result; + /** + * Visit a parse tree produced by `QuintParser.typeDefHead`. + * @param ctx the parse tree + * @return the visitor result + */ + visitTypeDefHead?: (ctx: TypeDefHeadContext) => Result; + + /** + * Visit a parse tree produced by `QuintParser.sumTypeDefinition`. + * @param ctx the parse tree + * @return the visitor result + */ + visitSumTypeDefinition?: (ctx: SumTypeDefinitionContext) => Result; + /** * Visit a parse tree produced by `QuintParser.typeSumVariant`. * @param ctx the parse tree @@ -654,6 +680,13 @@ export interface QuintVisitor extends ParseTreeVisitor { */ visitType?: (ctx: TypeContext) => Result; + /** + * Visit a parse tree produced by `QuintParser.typeVar`. + * @param ctx the parse tree + * @return the visitor result + */ + visitTypeVar?: (ctx: TypeVarContext) => Result; + /** * Visit a parse tree produced by `QuintParser.row`. * @param ctx the parse tree diff --git a/quint/src/graphics.ts b/quint/src/graphics.ts index b8602e60e..53985dd18 100644 --- a/quint/src/graphics.ts +++ b/quint/src/graphics.ts @@ -203,6 +203,9 @@ export function prettyQuintType(type: QuintType): Doc { case 'sum': { return prettySumRow(type.fields) } + case 'app': + case 'abs': + throw new Error('TODO This should be impossible?') } } diff --git a/quint/src/ir/IRTransformer.ts b/quint/src/ir/IRTransformer.ts index 2e733d0dd..3f3eb6963 100644 --- a/quint/src/ir/IRTransformer.ts +++ b/quint/src/ir/IRTransformer.ts @@ -86,6 +86,10 @@ export class IRTransformer { exitRecordType?: (type: t.QuintRecordType) => t.QuintRecordType enterSumType?: (type: t.QuintSumType) => t.QuintSumType exitSumType?: (type: t.QuintSumType) => t.QuintSumType + enterAbsType?: (type: t.QuintAbsType) => t.QuintAbsType + exitAbsType?: (type: t.QuintAbsType) => t.QuintAbsType + enterAppType?: (type: t.QuintAppType) => t.QuintAppType + exitAppType?: (type: t.QuintAppType) => t.QuintAppType /** Row types */ enterRow?: (row: t.Row) => t.Row @@ -254,6 +258,37 @@ export function transformType(transformer: IRTransformer, type: t.QuintType): t. } } break + + case 'abs': + { + if (transformer.enterAbsType) { + newType = transformer.enterAbsType(newType) + } + + newType.vars = newType.vars.map(v => transformType(transformer, v) as t.QuintVarType) + newType.body = transformType(transformer, newType.body) + + if (transformer.exitAbsType) { + newType = transformer.exitAbsType(newType) + } + } + break + + case 'app': + { + if (transformer.enterAppType) { + newType = transformer.enterAppType(newType) + } + + newType.ctor = transformType(transformer, newType.ctor) + newType.args = newType.args.map(v => transformType(transformer, v)) + + if (transformer.exitAppType) { + newType = transformer.exitAppType(newType) + } + } + break + default: unreachable(newType) } diff --git a/quint/src/ir/IRVisitor.ts b/quint/src/ir/IRVisitor.ts index 609b62105..282f048ec 100644 --- a/quint/src/ir/IRVisitor.ts +++ b/quint/src/ir/IRVisitor.ts @@ -93,6 +93,10 @@ export interface IRVisitor { exitRecordType?: (_type: t.QuintRecordType) => void enterSumType?: (_type: t.QuintSumType) => void exitSumType?: (_type: t.QuintSumType) => void + enterAppType?: (_type: t.QuintAppType) => void + exitAppType?: (_type: t.QuintAppType) => void + enterAbsType?: (_type: t.QuintAbsType) => void + exitAbsType?: (_type: t.QuintAbsType) => void /** Row types */ enterRow?: (_row: t.Row) => void @@ -245,6 +249,20 @@ export function walkType(visitor: IRVisitor, type: t.QuintType): void { visitor.exitSumType?.(type) break + case 'abs': + visitor.enterAbsType?.(type) + type.vars.map(t => walkType(visitor, t)) + walkType(visitor, type.body) + visitor.exitAbsType?.(type) + break + + case 'app': + visitor.enterAppType?.(type) + walkType(visitor, type.ctor) + type.args.map(t => walkType(visitor, t)) + visitor.exitAppType?.(type) + break + default: unreachable(type) } diff --git a/quint/src/ir/IRprinting.ts b/quint/src/ir/IRprinting.ts index f2ea096f6..274ce939e 100644 --- a/quint/src/ir/IRprinting.ts +++ b/quint/src/ir/IRprinting.ts @@ -187,6 +187,16 @@ export function typeToString(type: QuintType): string { case 'sum': { return sumToString(type) } + case 'abs': { + const vars = type.vars.map(typeToString).join(', ') + const body = typeToString(type.body) + return `Λ(${vars}).${body}` + } + case 'app': { + const abs = typeToString(type.ctor) + const args = type.args.map(typeToString).join(', ') + return `${abs}[${args}]` + } } } diff --git a/quint/src/ir/quintTypes.ts b/quint/src/ir/quintTypes.ts index af87b4408..133f6aeb8 100644 --- a/quint/src/ir/quintTypes.ts +++ b/quint/src/ir/quintTypes.ts @@ -98,17 +98,27 @@ export function sumType(labelTypePairs: [string, QuintType][], rowVar?: string, return { kind: 'sum', fields: { kind: 'row', fields, other }, id } } -/// Type abstraction: Λτ.Τ +/** Type abstraction + * + * In System-F, this corresponds to Λτ1.(...(Λτ2.(Τ)). + */ export interface QuintAbsType extends WithOptionalId { kind: 'abs' - vars: QuintVarType + vars: QuintVarType[] /** The bound variables */ + body: QuintType /** The body of the abstraction */ } -/// Type application: (Λτ.Τ)υ +/** Type application: (Λτ.Τ)υ + * + * In system-F, this corresponds to (Λτ.Τ)υ + * + * Type application is only well well-formed if `ctor` is (resolved to) an + * n-ary type abstraction, and `args.length === n` + */ export interface QuintAppType extends WithOptionalId { kind: 'app' - abs: QuintAbsType - arg: QuintType + ctor: QuintType /** The type "constructor" applied */ + args: QuintType[] /** The arguments to which the constructor is applied */ } /** diff --git a/quint/src/parsing/ToIrListener.ts b/quint/src/parsing/ToIrListener.ts index f1e38a236..b90220d2a 100644 --- a/quint/src/parsing/ToIrListener.ts +++ b/quint/src/parsing/ToIrListener.ts @@ -19,9 +19,12 @@ import { } from '../ir/quintIr' import { ConcreteFixedRow, + QuintAbsType, + QuintAppType, QuintConstType, QuintSumType, QuintType, + QuintVarType, Row, RowField, isUnitType, @@ -36,6 +39,7 @@ import { zip } from '../util' import { QuintError } from '../quintError' import { lowercaseTypeError, tooManySpreadsError } from './parseErrors' import { Loc } from '../ErrorMessage' +import { fail } from 'assert' /** * An ANTLR4 listener that constructs QuintIr objects out of the abstract @@ -363,36 +367,49 @@ export class ToIrListener implements QuintListener { this.declarationStack.push(def) } - // type Alias = set(int) + // TODO + // type Alias = Set(int) exitTypeAliasDef(ctx: p.TypeAliasDefContext) { - const name = ctx.qualId()!.text - const type = this.popType().value const id = this.getId(ctx) + const defHead = ctx.typeDefHead() + const name = defHead._typeName.text + // NOTE: `rhs` must precede `typeVariables` due to the stack order! + const rhs = this.popType().unwrap(() => + fail('internal error: type alias declaration parsed with no right hand side') + ) + const typeVariables: QuintVarType[] = this.popTypeDefHeadTypeVars(defHead) + if (name[0].match('[a-z]')) { this.errors.push(lowercaseTypeError(id, name)) } - const def: QuintTypeDef = { - id, - kind: 'typedef', - name, - type, - } + const type: QuintType = + typeVariables.length === 0 + ? rhs // A monomorphic type declaration + : { id: this.getId(ctx), kind: 'abs', vars: typeVariables, body: rhs } // A polymorphic type declaration + const def: QuintTypeDef = { id, kind: 'typedef', name, type } this.declarationStack.push(def) } // type T = | A | B(t1) | C(t2) exitTypeSumDef(ctx: p.TypeSumDefContext) { - const name = ctx._typeName!.text! const id = this.getId(ctx) + const defHead = ctx.typeDefHead() + const name = defHead._typeName.text + const typeVars = this.popTypeDefHeadTypeVars(defHead) + // Build the type declaraion const fields: RowField[] = popMany(this.variantStack, this.variantStack.length, this.undefinedVariant(ctx)) const row: ConcreteFixedRow = { kind: 'row', fields, other: { kind: 'empty' } } - const type: QuintSumType = { id, kind: 'sum', fields: row } - const typeName: QuintConstType = { id, kind: 'const', name } + const sumType: QuintSumType = { id, kind: 'sum', fields: row } + const type: QuintSumType | QuintAbsType = + typeVars.length === 0 + ? sumType // A monomorphic type + : { id: this.getId(ctx), kind: 'abs', vars: typeVars, body: sumType } // A polymorphic type + const def: QuintTypeDef = { id: id, name, @@ -400,6 +417,13 @@ export class ToIrListener implements QuintListener { type, } + // Used for annotations in the variant constructors + const typeConst: QuintConstType = { id, kind: 'const', name } + const constructorReturnType: QuintConstType | QuintAppType = + typeVars.length === 0 + ? typeConst // For a monomorphic type annotation + : { id: this.getId(ctx), kind: 'app', ctor: typeConst, args: typeVars } // A polymorphic type annotation + // Generate all the variant constructors implied by a variant type definition // a variant constructor is an operator that injects an expression // into the sum type by wrapping it in a label @@ -423,7 +447,7 @@ export class ToIrListener implements QuintListener { // val a: T = A(42) // val b: T = B // ``` - const constructors: QuintOpDef[] = zip(fields, ctx.typeSumVariant()).map( + const constructors: QuintOpDef[] = zip(fields, ctx.sumTypeDefinition().typeSumVariant()).map( ([{ fieldName, fieldType }, variantCtx]) => { // Mangle the parameter name to avoid clashes // This shouldn't be visible to users @@ -448,7 +472,7 @@ export class ToIrListener implements QuintListener { // a variant pairing a label with the unit. const wrappedExpr = unitValue(this.getId(variantCtx._sumLabel)) - typeAnnotation = typeName + typeAnnotation = constructorReturnType expr = { id: this.getId(variantCtx), kind: 'app', @@ -474,7 +498,7 @@ export class ToIrListener implements QuintListener { args: [label, wrappedExpr], } - typeAnnotation = { kind: 'oper', args: [fieldType], res: typeName } + typeAnnotation = { kind: 'oper', args: [fieldType], res: constructorReturnType } expr = { id: this.getId(variantCtx), kind: 'lambda', params, qualifier, expr: variant } } @@ -485,6 +509,26 @@ export class ToIrListener implements QuintListener { this.declarationStack.push(def, ...constructors) } + // Pop all the type variables in the head of a type def from the type stack + // E.g., for a type def like + // + // type Foo[a,b,c] = ... + // + // Return the type variables [a, b, c] + private popTypeDefHeadTypeVars(ctx: p.TypeDefHeadContext): QuintVarType[] { + return ( + ctx._typeVars + .map( + _ => + this.popType().unwrap(() => + fail('internal error: type parameter parsed with no type variable') + ) as QuintVarType + ) + // The stack stores the variables in reverse order + .reverse() + ) + } + exitTypeSumVariant(ctx: p.TypeSumVariantContext) { const fieldName = ctx._sumLabel!.text! const poppedType = this.popType().value @@ -1047,6 +1091,21 @@ export class ToIrListener implements QuintListener { this.typeStack.push({ id, kind: 'const', name }) } + exitTypeApp(ctx: p.TypeAppContext) { + const id = this.getId(ctx) + const args: QuintType[] = ctx._typeArg + .map(_ => + // We require that there is one parsed type for each typeArg recorded + this.popType().unwrap() + ) // The stack stores the arguments in reverse order + .reverse() + // The next type on the stack after the args should be the applied + // type constructor + const ctor = this.popType().unwrap() + this.typeStack.push({ id, kind: 'app', ctor, args }) + } + + // TODO: replace with general type application // a set type, e.g., set(int) exitTypeSet(ctx: p.TypeSetContext) { const last = this.popType().unwrap() @@ -1054,6 +1113,7 @@ export class ToIrListener implements QuintListener { this.typeStack.push({ id, kind: 'set', elem: last }) } + // TODO: replace with general type application // a list type, e.g., list(int) exitTypeList(ctx: p.TypeListContext) { const top = this.popType().unwrap() diff --git a/quint/src/quintError.ts b/quint/src/quintError.ts index b67b9a1e2..2fccad980 100644 --- a/quint/src/quintError.ts +++ b/quint/src/quintError.ts @@ -47,6 +47,8 @@ export type ErrorCode = | 'QNT008' /* QNT009: Missing arguments or parameters. You should omit the parentheses */ | 'QNT009' + /* QNT010: Lower case simple identifiers */ + | 'QNT010' /* QNT012: '...' may be used once in '{ ...record, }' */ | 'QNT012' /* QNT013: import ... from : could not load */ diff --git a/quint/src/types/base.ts b/quint/src/types/base.ts index 1414556a0..607b13554 100644 --- a/quint/src/types/base.ts +++ b/quint/src/types/base.ts @@ -29,6 +29,7 @@ export interface TypeScheme { export type Signature = (_arity: number) => TypeScheme +// TODO: Why aren't we noting type variables in the schema here? export function toScheme(type: QuintType): TypeScheme { return { typeVariables: new Set([]), rowVariables: new Set([]), type } } diff --git a/quint/src/types/constraintGenerator.ts b/quint/src/types/constraintGenerator.ts index e17bdcafa..9b3382cd4 100644 --- a/quint/src/types/constraintGenerator.ts +++ b/quint/src/types/constraintGenerator.ts @@ -391,6 +391,7 @@ export class ConstraintGeneratorVisitor implements IRVisitor { } } + // This is like application (via unification)? private newInstance(t: TypeScheme): QuintType { const typeNames = Array.from(t.typeVariables) const rowNames = Array.from(t.rowVariables) @@ -416,6 +417,7 @@ export class ConstraintGeneratorVisitor implements IRVisitor { ) } + // TODO: This is abstraction private quantify(type: QuintType): TypeScheme { const freeNames = this.currentFreeNames() const nonFreeNames = { diff --git a/quint/src/types/substitutions.ts b/quint/src/types/substitutions.ts index 49fbe496e..a1f4f9c73 100644 --- a/quint/src/types/substitutions.ts +++ b/quint/src/types/substitutions.ts @@ -98,7 +98,12 @@ export function applySubstitution(table: LookupTable, subs: Substitutions, t: Qu fields: applySubstitutionToRow(table, subs, t.fields) as ConcreteFixedRow, } - // The basic types have no variables, so cannot + case 'abs': + throw new Error(`Not yet implemented: https://github.com/informalsystems/quint/issues/1298`) + case 'app': + throw new Error(`Not yet implemented: https://github.com/informalsystems/quint/issues/1298`) + + // The basic types have no variables, so don't require substitution case 'int': case 'bool': case 'str': diff --git a/quint/test/ir/IRVisitor.test.ts b/quint/test/ir/IRVisitor.test.ts index 290fc921f..c3c41d5a3 100644 --- a/quint/test/ir/IRVisitor.test.ts +++ b/quint/test/ir/IRVisitor.test.ts @@ -855,5 +855,52 @@ describe('walkModule', () => { assert.deepEqual(visitor.entered.map(typeToString), enteredTypes) assert.deepEqual(visitor.exited.map(typeToString), exitedTypes) }) + + it('finds type abstractions', () => { + const quintModule = buildModuleWithDecls(['type StrMap[a] = str -> a']) + + class TestVisitor implements IRVisitor { + entered: QuintType[] = [] + exited: QuintType[] = [] + + enterAbsType(type: QuintType): void { + this.entered.push(type) + } + + exitAbsType(type: QuintType): void { + this.exited.push(type) + } + } + + const expectedTypes = ['Λ(a).(str -> a)'] + + const visitor = new TestVisitor() + walkModule(visitor, quintModule) + assert.deepEqual(visitor.entered.map(typeToString), expectedTypes) + assert.deepEqual(visitor.exited.map(typeToString), expectedTypes) + }) + + it('finds type applications', () => { + const quintModule = buildModuleWithDecls(['val strMap: StrMap[int] = Map("a" -> 1, "b" -> 2)']) + class TestVisitor implements IRVisitor { + entered: QuintType[] = [] + exited: QuintType[] = [] + + enterAppType(type: QuintType): void { + this.entered.push(type) + } + + exitAppType(type: QuintType): void { + this.exited.push(type) + } + } + + const expectedTypes = ['StrMap[int]'] + + const visitor = new TestVisitor() + walkModule(visitor, quintModule) + assert.deepEqual(visitor.entered.map(typeToString), expectedTypes) + assert.deepEqual(visitor.exited.map(typeToString), expectedTypes) + }) }) }) diff --git a/quint/test/ir/IRprinting.test.ts b/quint/test/ir/IRprinting.test.ts index dc8df1eb0..f5035f22c 100644 --- a/quint/test/ir/IRprinting.test.ts +++ b/quint/test/ir/IRprinting.test.ts @@ -249,4 +249,10 @@ describe('typeToString', () => { const expectedType = '(A(int) | B)' assert.deepEqual(typeToString(type), expectedType) }) + + it('pretty prints type applications', () => { + const input = 'Result[ok, err]' + const type = buildType(input) + assert.deepEqual(typeToString(type), input) + }) }) diff --git a/quint/test/parsing/quintParserFrontend.test.ts b/quint/test/parsing/quintParserFrontend.test.ts index 42f7d55b7..dbead2601 100644 --- a/quint/test/parsing/quintParserFrontend.test.ts +++ b/quint/test/parsing/quintParserFrontend.test.ts @@ -103,7 +103,7 @@ describe('parsing', () => { readQuint('SuperSpec'), 'mocked_path/testFixture/SuperSpec.qnt' ) - assert.isEmpty(result.errors) + assert.deepEqual(result.errors, []) }) it('parses SuperSpec correctly', () => { @@ -118,6 +118,10 @@ describe('parsing', () => { parseAndCompare('_1043sumTypeDecl') }) + it('parses polymorphic type declarations', () => { + parseAndCompare('_1045polymorphicTypeDecl') + }) + it('parses match expressions', () => { parseAndCompare('_1044matchExpression') }) diff --git a/quint/test/types/parser.test.ts b/quint/test/types/parser.test.ts index 762a55f53..133c0c011 100644 --- a/quint/test/types/parser.test.ts +++ b/quint/test/types/parser.test.ts @@ -96,20 +96,29 @@ describe('parseType', () => { ) }) + it('parses type application', () => { + const type = parseType('Foo[int, bool, str]') + + assert.isTrue(type.isRight()) + type.map(value => + assert.deepEqual(value, { + kind: 'app', + ctor: { kind: 'const', name: 'Foo', id: 1n }, + args: [ + { kind: 'int', id: 2n }, + { kind: 'bool', id: 3n }, + { kind: 'str', id: 4n }, + ], + id: 5n, + }) + ) + }) + it('throws error when type is invalid', () => { - const type = parseType('Set[bool, int]') + const type = parseType('Set(int)') assert.isTrue(type.isLeft()) - type.mapLeft(error => - assert.sameDeepMembers(error, [ - { - // TODO We should not expect a '=>' here, - // but do because of https://github.com/informalsystems/quint/issues/456 - explanation: "mismatched input ',' expecting {'->', '=>', ']'}", - locs: [{ start: { line: 0, col: 8, index: 8 }, end: { line: 0, col: 8, index: 8 } }], - }, - ]) - ) + type.mapLeft(error => assert.deepEqual(error[0].explanation, "missing '[' at '('")) }) it('throws error when row separators are invalid', () => { @@ -121,7 +130,7 @@ describe('parseType', () => { { // TODO We should not expect a '=>' here, // but do because of https://github.com/informalsystems/quint/issues/456 - explanation: "mismatched input '|' expecting {',', '->', '=>'}", + explanation: "mismatched input '|' expecting '}'", locs: [{ start: { line: 0, col: 11, index: 11 }, end: { line: 0, col: 11, index: 11 } }], }, ]) diff --git a/quint/testFixture/_1025importeeWithError.json b/quint/testFixture/_1025importeeWithError.json index 32b335531..0849ac06c 100644 --- a/quint/testFixture/_1025importeeWithError.json +++ b/quint/testFixture/_1025importeeWithError.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":10,"name":"I","declarations":[{"id":9,"kind":"def","name":"x","qualifier":"val","expr":{"id":8,"kind":"let","opdef":{"id":3,"kind":"def","name":"y","qualifier":"val","expr":{"id":2,"kind":"bool","value":true}},"expr":{"id":4,"kind":"let","opdef":{"id":5,"kind":"def","qualifier":"val","name":"__undefinedExprGenerated","expr":{"id":6,"kind":"bool","value":true}},"expr":{"id":7,"kind":"name","name":"__undefinedExprGenerated"}}}}]}],"table":{"7":{"id":5,"kind":"def","qualifier":"val","name":"__undefinedExprGenerated","expr":{"id":6,"kind":"bool","value":true},"depth":1}},"errors":[{"explanation":"[QNT000] mismatched input '}' expecting {'{', 'nondet', 'val', 'def', 'pure', 'action', 'run', 'temporal', '[', 'all', 'any', 'if', '_', STRING, BOOL, INT, 'and', 'or', 'iff', 'implies', 'Set', 'List', 'Map', 'match', '-', '(', LOW_ID, CAP_ID}","locs":[{"source":"mocked_path/testFixture/_1025importeeWithError.qnt","start":{"line":3,"col":0,"index":45},"end":{"line":3,"col":0,"index":45}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":10,"name":"I","declarations":[{"id":9,"kind":"def","name":"x","qualifier":"val","expr":{"id":8,"kind":"let","opdef":{"id":3,"kind":"def","name":"y","qualifier":"val","expr":{"id":2,"kind":"bool","value":true}},"expr":{"id":4,"kind":"let","opdef":{"id":5,"kind":"def","qualifier":"val","name":"__undefinedExprGenerated","expr":{"id":6,"kind":"bool","value":true}},"expr":{"id":7,"kind":"name","name":"__undefinedExprGenerated"}}}}]}],"table":{"7":{"id":5,"kind":"def","qualifier":"val","name":"__undefinedExprGenerated","expr":{"id":6,"kind":"bool","value":true},"depth":1}},"errors":[{"explanation":"[QNT000] mismatched input '}' expecting {'{', '[', 'nondet', 'val', 'def', 'pure', 'action', 'run', 'temporal', 'all', 'any', 'if', '_', STRING, BOOL, INT, 'and', 'or', 'iff', 'implies', 'Map', 'match', '-', '(', 'Set', 'List', LOW_ID, CAP_ID}","locs":[{"source":"mocked_path/testFixture/_1025importeeWithError.qnt","start":{"line":3,"col":0,"index":45},"end":{"line":3,"col":0,"index":45}}]}]} \ No newline at end of file From a7ac9db67a78eab924efd952ba89c64fd288911f Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 24 Jan 2024 21:51:03 -0500 Subject: [PATCH 04/11] Ass missing test fixtures --- quint/testFixture/_1045polymorphicTypeDecl.json | 1 + quint/testFixture/_1045polymorphicTypeDecl.map.json | 1 + quint/testFixture/_1045polymorphicTypeDecl.qnt | 7 +++++++ 3 files changed, 9 insertions(+) create mode 100644 quint/testFixture/_1045polymorphicTypeDecl.json create mode 100644 quint/testFixture/_1045polymorphicTypeDecl.map.json create mode 100644 quint/testFixture/_1045polymorphicTypeDecl.qnt diff --git a/quint/testFixture/_1045polymorphicTypeDecl.json b/quint/testFixture/_1045polymorphicTypeDecl.json new file mode 100644 index 000000000..1bdc18f98 --- /dev/null +++ b/quint/testFixture/_1045polymorphicTypeDecl.json @@ -0,0 +1 @@ +{"stage":"parsing","warnings":[],"modules":[{"id":35,"name":"m","declarations":[{"id":14,"kind":"typedef","name":"MapApp","type":{"id":15,"kind":"abs","vars":[{"id":7,"kind":"var","name":"a"},{"id":8,"kind":"var","name":"b"}],"body":{"id":13,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":11,"kind":"fun","arg":{"id":9,"kind":"var","name":"a"},"res":{"id":10,"kind":"var","name":"b"}}},{"fieldName":"1","fieldType":{"id":12,"kind":"var","name":"a"}}],"other":{"kind":"empty"}}}}},{"id":20,"name":"Result","kind":"typedef","type":{"id":21,"kind":"abs","vars":[{"id":16,"kind":"var","name":"ok"},{"id":17,"kind":"var","name":"err"}],"body":{"id":20,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Ok","fieldType":{"id":18,"kind":"var","name":"ok"}},{"fieldName":"Err","fieldType":{"id":19,"kind":"var","name":"err"}}],"other":{"kind":"empty"}}}}},{"id":5,"kind":"typedef","name":"MonoPair","type":{"id":6,"kind":"abs","vars":[{"id":1,"kind":"var","name":"a"}],"body":{"id":4,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":2,"kind":"var","name":"a"}},{"fieldName":"1","fieldType":{"id":3,"kind":"var","name":"a"}}],"other":{"kind":"empty"}}}}},{"id":28,"kind":"def","name":"Ok","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":18,"kind":"var","name":"ok"}],"res":{"id":22,"kind":"app","ctor":{"id":20,"kind":"const","name":"Result"},"args":[{"id":16,"kind":"var","name":"ok"},{"id":17,"kind":"var","name":"err"}]}},"expr":{"id":27,"kind":"lambda","params":[{"id":24,"name":"__OkParam"}],"qualifier":"def","expr":{"id":26,"kind":"app","opcode":"variant","args":[{"id":23,"kind":"str","value":"Ok"},{"kind":"name","name":"__OkParam","id":25}]}}},{"id":34,"kind":"def","name":"Err","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":19,"kind":"var","name":"err"}],"res":{"id":22,"kind":"app","ctor":{"id":20,"kind":"const","name":"Result"},"args":[{"id":16,"kind":"var","name":"ok"},{"id":17,"kind":"var","name":"err"}]}},"expr":{"id":33,"kind":"lambda","params":[{"id":30,"name":"__ErrParam"}],"qualifier":"def","expr":{"id":32,"kind":"app","opcode":"variant","args":[{"id":29,"kind":"str","value":"Err"},{"kind":"name","name":"__ErrParam","id":31}]}}}]}],"table":{"20":{"id":20,"name":"Result","kind":"typedef","type":{"id":21,"kind":"abs","vars":[{"id":16,"kind":"var","name":"ok"},{"id":17,"kind":"var","name":"err"}],"body":{"id":20,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Ok","fieldType":{"id":18,"kind":"var","name":"ok"}},{"fieldName":"Err","fieldType":{"id":19,"kind":"var","name":"err"}}],"other":{"kind":"empty"}}}}},"25":{"id":24,"name":"__OkParam","kind":"param"},"31":{"id":30,"name":"__ErrParam","kind":"param"}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1045polymorphicTypeDecl.map.json b/quint/testFixture/_1045polymorphicTypeDecl.map.json new file mode 100644 index 000000000..b83f0ae3a --- /dev/null +++ b/quint/testFixture/_1045polymorphicTypeDecl.map.json @@ -0,0 +1 @@ +{"sourceIndex":{"0":"mocked_path/testFixture/_1045polymorphicTypeDecl.qnt"},"map":{"1":[0,{"line":1,"col":16,"index":27},{"line":1,"col":16,"index":27}],"2":[0,{"line":1,"col":22,"index":33},{"line":1,"col":22,"index":33}],"3":[0,{"line":1,"col":25,"index":36},{"line":1,"col":25,"index":36}],"4":[0,{"line":1,"col":21,"index":32},{"line":1,"col":26,"index":37}],"5":[0,{"line":1,"col":2,"index":13},{"line":1,"col":26,"index":37}],"6":[0,{"line":1,"col":2,"index":13},{"line":1,"col":26,"index":37}],"7":[0,{"line":2,"col":14,"index":53},{"line":2,"col":14,"index":53}],"8":[0,{"line":2,"col":17,"index":56},{"line":2,"col":17,"index":56}],"9":[0,{"line":2,"col":23,"index":62},{"line":2,"col":23,"index":62}],"10":[0,{"line":2,"col":28,"index":67},{"line":2,"col":28,"index":67}],"11":[0,{"line":2,"col":23,"index":62},{"line":2,"col":28,"index":67}],"12":[0,{"line":2,"col":31,"index":70},{"line":2,"col":31,"index":70}],"13":[0,{"line":2,"col":22,"index":61},{"line":2,"col":32,"index":71}],"14":[0,{"line":2,"col":2,"index":41},{"line":2,"col":32,"index":71}],"15":[0,{"line":2,"col":2,"index":41},{"line":2,"col":32,"index":71}],"16":[0,{"line":3,"col":14,"index":87},{"line":3,"col":15,"index":88}],"17":[0,{"line":3,"col":18,"index":91},{"line":3,"col":20,"index":93}],"18":[0,{"line":4,"col":9,"index":107},{"line":4,"col":10,"index":108}],"19":[0,{"line":5,"col":10,"index":121},{"line":5,"col":12,"index":123}],"20":[0,{"line":3,"col":2,"index":75},{"line":5,"col":51,"index":124}],"21":[0,{"line":3,"col":2,"index":75},{"line":5,"col":51,"index":124}],"22":[0,{"line":3,"col":2,"index":75},{"line":5,"col":51,"index":124}],"23":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"24":[0,{"line":4,"col":9,"index":107},{"line":4,"col":10,"index":108}],"25":[0,{"line":4,"col":6,"index":104},{"line":4,"col":7,"index":105}],"26":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"27":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"28":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"29":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"30":[0,{"line":5,"col":10,"index":121},{"line":5,"col":12,"index":123}],"31":[0,{"line":5,"col":6,"index":117},{"line":5,"col":8,"index":119}],"32":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"33":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"34":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"35":[0,{"line":0,"col":0,"index":0},{"line":6,"col":126,"index":126}]}} \ No newline at end of file diff --git a/quint/testFixture/_1045polymorphicTypeDecl.qnt b/quint/testFixture/_1045polymorphicTypeDecl.qnt new file mode 100644 index 000000000..423c76fe0 --- /dev/null +++ b/quint/testFixture/_1045polymorphicTypeDecl.qnt @@ -0,0 +1,7 @@ +module m { + type MonoPair[a] = (a, a) + type MapApp[a, b] = (a -> b, a) + type Result[ok, err] = + | Ok(ok) + | Err(err) +} From cd592bbbb5ff59033369c593820a8b54cf0623a7 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 24 Jan 2024 21:55:09 -0500 Subject: [PATCH 05/11] Add abs and app to server completion --- vscode/quint-vscode/server/src/complete.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/vscode/quint-vscode/server/src/complete.ts b/vscode/quint-vscode/server/src/complete.ts index 4d899eeeb..e823d9660 100644 --- a/vscode/quint-vscode/server/src/complete.ts +++ b/vscode/quint-vscode/server/src/complete.ts @@ -219,6 +219,8 @@ function getSuggestedBuiltinsForType(type: QuintType): { name: string }[] { case 'oper': // no suggestions from here on case 'var': case 'sum': + case 'abs': + case 'app': return [] } } From 323305899cc43bb5d5fd3e742bb86fa0fe7ade18 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 24 Jan 2024 22:25:04 -0500 Subject: [PATCH 06/11] Add missing graphics case --- quint/src/graphics.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/quint/src/graphics.ts b/quint/src/graphics.ts index 53985dd18..ad11919a9 100644 --- a/quint/src/graphics.ts +++ b/quint/src/graphics.ts @@ -9,7 +9,7 @@ */ import chalk from 'chalk' -import { strict as assert } from 'assert' +import { fail, strict as assert } from 'assert' import { Doc, braces, @@ -204,8 +204,10 @@ export function prettyQuintType(type: QuintType): Doc { return prettySumRow(type.fields) } case 'app': + const args = type.args.map(prettyQuintType) + return group([prettyQuintType(type), text('['), ...args, text(']')]) case 'abs': - throw new Error('TODO This should be impossible?') + fail('internal error: type abstraction should never be printed for users in graphics') } } From c79a8cf1e0845e3ddb3610c13cd600b5ad741403 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 24 Jan 2024 22:52:32 -0500 Subject: [PATCH 07/11] Cleanup and comment correction --- quint/src/parsing/ToIrListener.ts | 12 +++++++++--- quint/src/quintError.ts | 2 -- quint/src/types/constraintGenerator.ts | 2 -- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/quint/src/parsing/ToIrListener.ts b/quint/src/parsing/ToIrListener.ts index b90220d2a..9ae21c8b5 100644 --- a/quint/src/parsing/ToIrListener.ts +++ b/quint/src/parsing/ToIrListener.ts @@ -367,8 +367,10 @@ export class ToIrListener implements QuintListener { this.declarationStack.push(def) } - // TODO - // type Alias = Set(int) + // E.g., + // + // - type Alias = Set(int) + // - type Constr[a, b] = (Set(a), Set(b)) exitTypeAliasDef(ctx: p.TypeAliasDefContext) { const id = this.getId(ctx) @@ -393,7 +395,10 @@ export class ToIrListener implements QuintListener { this.declarationStack.push(def) } - // type T = | A | B(t1) | C(t2) + // E.g., + // + // - type T = | A | B(t1) | C(t2) + // - type Result[ok, err] = | Ok(ok) | Err(err) exitTypeSumDef(ctx: p.TypeSumDefContext) { const id = this.getId(ctx) @@ -1091,6 +1096,7 @@ export class ToIrListener implements QuintListener { this.typeStack.push({ id, kind: 'const', name }) } + // E.g., Result[int, str] exitTypeApp(ctx: p.TypeAppContext) { const id = this.getId(ctx) const args: QuintType[] = ctx._typeArg diff --git a/quint/src/quintError.ts b/quint/src/quintError.ts index 2fccad980..b67b9a1e2 100644 --- a/quint/src/quintError.ts +++ b/quint/src/quintError.ts @@ -47,8 +47,6 @@ export type ErrorCode = | 'QNT008' /* QNT009: Missing arguments or parameters. You should omit the parentheses */ | 'QNT009' - /* QNT010: Lower case simple identifiers */ - | 'QNT010' /* QNT012: '...' may be used once in '{ ...record, }' */ | 'QNT012' /* QNT013: import ... from : could not load */ diff --git a/quint/src/types/constraintGenerator.ts b/quint/src/types/constraintGenerator.ts index 9b3382cd4..e17bdcafa 100644 --- a/quint/src/types/constraintGenerator.ts +++ b/quint/src/types/constraintGenerator.ts @@ -391,7 +391,6 @@ export class ConstraintGeneratorVisitor implements IRVisitor { } } - // This is like application (via unification)? private newInstance(t: TypeScheme): QuintType { const typeNames = Array.from(t.typeVariables) const rowNames = Array.from(t.rowVariables) @@ -417,7 +416,6 @@ export class ConstraintGeneratorVisitor implements IRVisitor { ) } - // TODO: This is abstraction private quantify(type: QuintType): TypeScheme { const freeNames = this.currentFreeNames() const nonFreeNames = { From fa7a65615224103e13e5d33d858fab79c9f4d58d Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 25 Jan 2024 08:38:45 -0500 Subject: [PATCH 08/11] Fix lints --- quint/src/graphics.ts | 5 +++-- quint/src/runtime/impl/compilerImpl.ts | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/quint/src/graphics.ts b/quint/src/graphics.ts index ad11919a9..1bcfb5575 100644 --- a/quint/src/graphics.ts +++ b/quint/src/graphics.ts @@ -8,8 +8,8 @@ * See LICENSE in the project root for license information. */ +import { strict as assert, fail } from 'assert' import chalk from 'chalk' -import { fail, strict as assert } from 'assert' import { Doc, braces, @@ -203,9 +203,10 @@ export function prettyQuintType(type: QuintType): Doc { case 'sum': { return prettySumRow(type.fields) } - case 'app': + case 'app': { const args = type.args.map(prettyQuintType) return group([prettyQuintType(type), text('['), ...args, text(']')]) + } case 'abs': fail('internal error: type abstraction should never be printed for users in graphics') } diff --git a/quint/src/runtime/impl/compilerImpl.ts b/quint/src/runtime/impl/compilerImpl.ts index 9c50081b8..1e08509e2 100644 --- a/quint/src/runtime/impl/compilerImpl.ts +++ b/quint/src/runtime/impl/compilerImpl.ts @@ -1407,7 +1407,8 @@ export class CompilerVisitor implements IRVisitor { }, } }) - // In case the case of reps, we have multiple copies of the same action. This is why all occurrences have the same id. + // In case the case of reps, we have multiple copies of the same action. + // This is why all occurrences have the same id. return this.chainAllOrThen(actions, 'then', _ => app.args[1].id) }) .join() From 02567d323890cc0d1cec46b821cee655b6f969b8 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 25 Jan 2024 08:44:25 -0500 Subject: [PATCH 09/11] Update quint/src/parsing/ToIrListener.ts Co-authored-by: Gabriela Moreira --- quint/src/parsing/ToIrListener.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/quint/src/parsing/ToIrListener.ts b/quint/src/parsing/ToIrListener.ts index 9ae21c8b5..ffa81a062 100644 --- a/quint/src/parsing/ToIrListener.ts +++ b/quint/src/parsing/ToIrListener.ts @@ -369,8 +369,8 @@ export class ToIrListener implements QuintListener { // E.g., // - // - type Alias = Set(int) - // - type Constr[a, b] = (Set(a), Set(b)) + // - type Alias = Set[int] + // - type Constr[a, b] = (Set[a], Set[b]) exitTypeAliasDef(ctx: p.TypeAliasDefContext) { const id = this.getId(ctx) From 0316cd85b363d097f4e3b256c33cc22d822cb2dc Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 25 Jan 2024 08:44:37 -0500 Subject: [PATCH 10/11] Update quint/src/ir/quintTypes.ts Co-authored-by: Gabriela Moreira --- quint/src/ir/quintTypes.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quint/src/ir/quintTypes.ts b/quint/src/ir/quintTypes.ts index 133f6aeb8..cddd85672 100644 --- a/quint/src/ir/quintTypes.ts +++ b/quint/src/ir/quintTypes.ts @@ -110,7 +110,7 @@ export interface QuintAbsType extends WithOptionalId { /** Type application: (Λτ.Τ)υ * - * In system-F, this corresponds to (Λτ.Τ)υ + * In System-F, this corresponds to (Λτ.Τ)υ * * Type application is only well well-formed if `ctor` is (resolved to) an * n-ary type abstraction, and `args.length === n` From eca5e836f8ccb5375105eea8163c79adb79e3069 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 25 Jan 2024 20:20:51 -0500 Subject: [PATCH 11/11] Add explanatory comment --- quint/src/types/base.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/quint/src/types/base.ts b/quint/src/types/base.ts index 607b13554..23f357f21 100644 --- a/quint/src/types/base.ts +++ b/quint/src/types/base.ts @@ -29,7 +29,8 @@ export interface TypeScheme { export type Signature = (_arity: number) => TypeScheme -// TODO: Why aren't we noting type variables in the schema here? +// Does not bind any type variables in `type`, which we take to assume +// that `type` has no free variables in the context. export function toScheme(type: QuintType): TypeScheme { return { typeVariables: new Set([]), rowVariables: new Set([]), type } }