diff --git a/compiler/antlr/prog8.g4 b/compiler/antlr/prog8.g4 index 62014530b..6e47cfbd8 100644 --- a/compiler/antlr/prog8.g4 +++ b/compiler/antlr/prog8.g4 @@ -112,7 +112,7 @@ assignment : assign_targets '=' expression ; assign_targets : assign_target (',' assign_target)* ; augassignment : - assign_target operator=('+=' | '-=' | '/=' | '//=' | '*=' | '**=' | '&=' | '|=' | '^=' | '%=' ) expression + assign_target operator=('+=' | '-=' | '/=' | '//=' | '*=' | '**=' | '&=' | '|=' | '^=' | '%=' | '<<=' | '>>=' ) expression ; assign_target: @@ -130,6 +130,7 @@ expression : | left = expression bop = '**' right = expression | left = expression bop = ('*' | '/' | '//' | '%' ) right = expression | left = expression bop = ('+' | '-' ) right = expression + | left = expression bop = ('<<' | '>>' ) right = expression | left = expression bop = ('<' | '>' | '<=' | '>=') right = expression | left = expression bop = ('==' | '!=') right = expression | left = expression bop = '&' right = expression diff --git a/compiler/examples/cube3d-c64.p8 b/compiler/examples/cube3d-c64.p8 index fa78fd9d4..a6e0ac521 100644 --- a/compiler/examples/cube3d-c64.p8 +++ b/compiler/examples/cube3d-c64.p8 @@ -43,22 +43,8 @@ word wcosc = cos8(az) as word word wsinc = sin8(az) as word - word wcosa_sinb = wcosa*wsinb - lsr(wcosa_sinb) - lsr(wcosa_sinb) - lsr(wcosa_sinb) - lsr(wcosa_sinb) - lsr(wcosa_sinb) - lsr(wcosa_sinb) - lsr(wcosa_sinb) ; / 128 - word wsina_sinb = wsina*wsinb - lsr(wsina_sinb) - lsr(wsina_sinb) - lsr(wsina_sinb) - lsr(wsina_sinb) - lsr(wsina_sinb) - lsr(wsina_sinb) - lsr(wsina_sinb) ; / 128 + word wcosa_sinb = wcosa*wsinb // 128 + word wsina_sinb = wsina*wsinb // 128 word Axx = (wcosa*wcosb as float / 128.0) as word word Axy = ((wcosa_sinb*wsinc - wsina*wcosc) as float / 128.0) as word @@ -74,32 +60,11 @@ word xc = xcoor[i] as word word yc = ycoor[i] as word word zc = zcoor[i] as word - word zz = Axx*xc + Axy*yc + Axz*zc - lsr(zz) - lsr(zz) - lsr(zz) - lsr(zz) - lsr(zz) - lsr(zz) - lsr(zz) ; /128 + word zz = (Axx*xc + Axy*yc + Axz*zc) // 128 ; @todo bugs when not using 'zz' temporary var!? rotatedx[i] = zz - zz=Ayx*xc + Ayy*yc + Ayz*zc - lsr(zz) - lsr(zz) - lsr(zz) - lsr(zz) - lsr(zz) - lsr(zz) - lsr(zz) ; /128 + zz=(Ayx*xc + Ayy*yc + Ayz*zc) // 128 rotatedy[i] = zz - zz = Azx*xc + Azy*yc + Azz*zc - lsr(zz) - lsr(zz) - lsr(zz) - lsr(zz) - lsr(zz) - lsr(zz) - lsr(zz) ; /128 + zz = (Azx*xc + Azy*yc + Azz*zc) // 128 rotatedz[i] = zz } } diff --git a/compiler/examples/test.p8 b/compiler/examples/test.p8 index 837474f61..b42069727 100644 --- a/compiler/examples/test.p8 +++ b/compiler/examples/test.p8 @@ -3,6 +3,74 @@ ~ main { + byte[3] stuff=[1,2,3] + ubyte ub + word w + uword uw + sub start() { + + A //= 1 ; @todo wrong error about float + A = A//1 ; @todo wrong error about float + Y = A//1 ; @todo wrong error about float + + + A=A*2 + A=255 + A=A*4 + A=255 + A=A*8 + A=255 + A=A*16 + A=255 + A=A*32 + A=255 + A=A*64 + A=255 + A=A*128 + A=255 + A=A*3 + A=255 + +; A *= 0 +; A *= 1 +; A *= 2 +; A *= 3 +; A *= 4 +; A *= 5 +; A *= 6 +; A *= 7 +; A *= 8 +; A *= 9 +; A *= 10 +; A *= 11 +; A *= 16 +; A *= 32 +; A *= 64 +; A *= 128 +; A *= 255 + ;A *= 256 + ;A *= 257 + +; Y = A +; Y = A*0 +; Y = A*1 +; Y = A*2 +; Y = A*3 +; Y = A*4 +; Y = A*5 +; Y = A*6 +; Y = A*7 +; Y = A*8 +; Y = A*9 +; Y = A*10 +; Y = A*11 +; Y = A*16 +; Y = A*32 +; Y = A*64 +; Y = A*128 +; Y = A*255 + ;Y = A*256 + ;Y = A*257 } } diff --git a/compiler/examples/wizzine.p8 b/compiler/examples/wizzine.p8 index 9d95a8700..94e529054 100644 --- a/compiler/examples/wizzine.p8 +++ b/compiler/examples/wizzine.p8 @@ -44,7 +44,7 @@ c64.SPRPTR7 = sprite_address_ptr c64.SPENA = 255 ; enable all sprites - c64utils.set_rasterirq(240) ; enable animation + c64utils.set_rasterirq(260) ; enable animation } } @@ -64,8 +64,8 @@ sub irq() { ubyte i=14 nextsprite: ; @todo should be a for loop from 14 to 0 step -2 but this causes a value out of range error at the moment - word x = (sin8(angle*2-i*8) as word)+190 ; @todo will/should be using shifts for faster multiplication and division - byte y = cos8(angle*3-i*8) // 2 ; @todo will/should be using shifts for faster multiplication and division + word x = (sin8(angle*2-i*8) as word)+190 + byte y = cos8(angle*3-i*8) // 2 @(SP0X+i) = lsb(x) @(SP0Y+i) = y+150 as ubyte diff --git a/compiler/src/prog8/ast/AST.kt b/compiler/src/prog8/ast/AST.kt index a4e0ba20f..44ee08b37 100644 --- a/compiler/src/prog8/ast/AST.kt +++ b/compiler/src/prog8/ast/AST.kt @@ -254,7 +254,7 @@ interface IAstProcessor { } fun process(arrayIndexedExpression: ArrayIndexedExpression): IExpression { - arrayIndexedExpression.identifier?.process(this) + arrayIndexedExpression.identifier.process(this) arrayIndexedExpression.arrayspec.process(this) return arrayIndexedExpression } @@ -792,7 +792,7 @@ data class AssignTarget(val register: Register?, if(identifier!=null) return identifier.nameInSource.last() if(arrayindexed!=null) - return arrayindexed.identifier!!.nameInSource.last() + return arrayindexed.identifier.nameInSource.last() val address = memoryAddress?.addressExpression if(address is LiteralValue) return address.asIntegerValue.toString() @@ -869,6 +869,7 @@ class BinaryExpression(var left: IExpression, var operator: String, var right: I "<", ">", "<=", ">=", "==", "!=" -> DataType.UBYTE + "<<", ">>" -> leftDt "/" -> DataType.FLOAT // use integer division '//' if you don't want floats else -> throw FatalAstException("resulting datatype check for invalid operator $operator") } @@ -938,23 +939,23 @@ class BinaryExpression(var left: IExpression, var operator: String, var right: I } } -class ArrayIndexedExpression(val identifier: IdentifierReference?, +class ArrayIndexedExpression(val identifier: IdentifierReference, var arrayspec: ArraySpec, override val position: Position) : IExpression { override lateinit var parent: Node override fun linkParents(parent: Node) { this.parent = parent - identifier?.linkParents(this) + identifier.linkParents(this) arrayspec.linkParents(this) } override fun isIterable(namespace: INameScope, heap: HeapValues) = false override fun constValue(namespace: INameScope, heap: HeapValues): LiteralValue? = null override fun process(processor: IAstProcessor): IExpression = processor.process(this) - override fun referencesIdentifier(name: String) = identifier?.referencesIdentifier(name) ?: false + override fun referencesIdentifier(name: String) = identifier.referencesIdentifier(name) override fun resultingDatatype(namespace: INameScope, heap: HeapValues): DataType? { - val target = identifier?.targetStatement(namespace) + val target = identifier.targetStatement(namespace) if (target is VarDecl) { return when (target.datatype) { in NumericDatatypes -> null @@ -1089,7 +1090,10 @@ class LiteralValue(val type: DataType, } fun optimalInteger(value: Number, position: Position): LiteralValue { - return when (value) { + val intval = value.toInt() + if(intval.toDouble() != value.toDouble()) + throw FatalAstException("value is not an integer: $value") + return when (intval) { in 0..255 -> LiteralValue(DataType.UBYTE, bytevalue=value.toShort(), position = position) in -128..127 -> LiteralValue(DataType.BYTE, bytevalue=value.toShort(), position = position) in 0..65535 -> LiteralValue(DataType.UWORD, wordvalue = value.toInt(), position = position) @@ -1589,6 +1593,17 @@ class AnonymousScope(override var statements: MutableList, } +class NopStatement(override val position:Position): IStatement { + override lateinit var parent: Node + + override fun linkParents(parent: Node) { + this.parent = parent + } + + override fun process(processor: IAstProcessor) = this +} + + // the subroutine class covers both the normal user-defined subroutines, // and also the predefined/ROM/register-based subroutines. // (multiple return types can only occur for the latter type) diff --git a/compiler/src/prog8/ast/AstChecker.kt b/compiler/src/prog8/ast/AstChecker.kt index 36ad1a3c2..00dcc269b 100644 --- a/compiler/src/prog8/ast/AstChecker.kt +++ b/compiler/src/prog8/ast/AstChecker.kt @@ -424,7 +424,7 @@ class AstChecker(private val namespace: INameScope, } if(assignment.aug_op!=null) { - // check augmented assignment: + // check augmented assignment (and convert it into a normal assignment!) // A /= 3 -> check as if it was A = A / 3 val newTarget: IExpression = when { @@ -847,7 +847,7 @@ class AstChecker(private val namespace: INameScope, } override fun process(arrayIndexedExpression: ArrayIndexedExpression): IExpression { - val target = arrayIndexedExpression.identifier!!.targetStatement(namespace) + val target = arrayIndexedExpression.identifier.targetStatement(namespace) if(target is VarDecl) { if(target.datatype !in IterableDatatypes) checkResult.add(SyntaxError("indexing requires an iterable variable", arrayIndexedExpression.position)) diff --git a/compiler/src/prog8/compiler/Compiler.kt b/compiler/src/prog8/compiler/Compiler.kt index fb6ac7ac1..4d9f339ed 100644 --- a/compiler/src/prog8/compiler/Compiler.kt +++ b/compiler/src/prog8/compiler/Compiler.kt @@ -218,6 +218,7 @@ private class StatementTranslator(private val prog: IntermediateProgram, } } is VarDecl, is Subroutine -> {} // skip this, already processed these. + is NopStatement -> {} is InlineAssembly -> translate(stmt) else -> TODO("translate statement $stmt to stackvm") } @@ -600,7 +601,10 @@ private class StatementTranslator(private val prog: IntermediateProgram, translate(expr.right) if(rightDt!=commonDt) convertType(rightDt, commonDt) - translateBinaryOperator(expr.operator, commonDt) + if(expr.operator=="<<" || expr.operator==">>") + translateBitshiftedOperator(expr.operator, leftDt, expr.right.constValue(namespace, heap)) + else + translateBinaryOperator(expr.operator, commonDt) } is FunctionCall -> { val target = expr.target.targetStatement(namespace) @@ -1218,6 +1222,36 @@ private class StatementTranslator(private val prog: IntermediateProgram, prog.instr(opcode) } + private fun translateBitshiftedOperator(operator: String, leftDt: DataType, amount: LiteralValue?) { + if(amount?.asIntegerValue == null) + throw FatalAstException("bitshift operators should only have constant integer value as right operand") + var shifts=amount.asIntegerValue + if(shifts<0) + throw FatalAstException("bitshift value should be >= 0") + + prog.removeLastInstruction() // the amount of shifts is not used as a stack value + if(shifts==0) + return + while(shifts>0) { + if(operator==">>") { + when (leftDt) { + DataType.UBYTE -> prog.instr(Opcode.SHIFTEDR_UBYTE) + DataType.BYTE -> prog.instr(Opcode.SHIFTEDR_SBYTE) + DataType.UWORD -> prog.instr(Opcode.SHIFTEDR_UWORD) + DataType.WORD -> prog.instr(Opcode.SHIFTEDR_SWORD) + else -> throw CompilerException("wrong datatype") + } + } else if(operator=="<<") { + when (leftDt) { + DataType.UBYTE, DataType.BYTE -> prog.instr(Opcode.SHIFTEDL_BYTE) + DataType.UWORD, DataType.WORD -> prog.instr(Opcode.SHIFTEDL_WORD) + else -> throw CompilerException("wrong datatype") + } + } + shifts-- + } + } + private fun translatePrefixOperator(operator: String, operandDt: DataType?) { if(operandDt==null) throw CompilerException("operand datatype not known") @@ -1251,7 +1285,7 @@ private class StatementTranslator(private val prog: IntermediateProgram, } private fun translate(arrayindexed: ArrayIndexedExpression, write: Boolean) { - val variable = arrayindexed.identifier?.targetStatement(namespace) as VarDecl + val variable = arrayindexed.identifier.targetStatement(namespace) as VarDecl translate(arrayindexed.arrayspec.x) if (write) prog.instr(opcodeWriteindexedvar(variable.datatype), callLabel = variable.scopedname) @@ -1309,7 +1343,7 @@ private class StatementTranslator(private val prog: IntermediateProgram, } } stmt.target.arrayindexed != null -> { - val variable = stmt.target.arrayindexed!!.identifier?.targetStatement(namespace) as VarDecl + val variable = stmt.target.arrayindexed!!.identifier.targetStatement(namespace) as VarDecl translate(stmt.target.arrayindexed!!.arrayspec.x) when(stmt.operator) { "++" -> prog.instr(opcodeIncArrayindexedVar(variable.datatype), callLabel = variable.scopedname) diff --git a/compiler/src/prog8/compiler/intermediate/Opcode.kt b/compiler/src/prog8/compiler/intermediate/Opcode.kt index 0cf4c46f2..42a8c8778 100644 --- a/compiler/src/prog8/compiler/intermediate/Opcode.kt +++ b/compiler/src/prog8/compiler/intermediate/Opcode.kt @@ -75,6 +75,12 @@ enum class Opcode { ABS_F, // bit shifts and bitwise arithmetic + SHIFTEDL_BYTE, // shifts stack value + SHIFTEDL_WORD, // shifts stack value + SHIFTEDR_UBYTE, // shifts stack value + SHIFTEDR_SBYTE, // shifts stack value + SHIFTEDR_UWORD, // shifts stack value + SHIFTEDR_SWORD, // shifts stack value SHL_BYTE, SHL_WORD, SHL_MEM_BYTE, diff --git a/compiler/src/prog8/compiler/target/c64/AsmGen.kt b/compiler/src/prog8/compiler/target/c64/AsmGen.kt index b2d6960da..d918eea4d 100644 --- a/compiler/src/prog8/compiler/target/c64/AsmGen.kt +++ b/compiler/src/prog8/compiler/target/c64/AsmGen.kt @@ -860,6 +860,13 @@ class AsmGen(val options: CompilationOptions, val program: IntermediateProgram, Opcode.LESSEQ_W -> " jsr prog8_lib.lesseq_w" Opcode.LESSEQ_F -> " jsr c64flt.lesseq_f" + Opcode.SHIFTEDL_BYTE -> " asl ${(ESTACK_LO+1).toHex()},x" + Opcode.SHIFTEDL_WORD -> " asl ${(ESTACK_LO+1).toHex()},x | rol ${(ESTACK_HI+1).toHex()},x" + Opcode.SHIFTEDR_SBYTE -> " lda ${(ESTACK_LO+1).toHex()},x | asl a | ror ${(ESTACK_LO+1).toHex()},x" + Opcode.SHIFTEDR_UBYTE -> " lsr ${(ESTACK_LO+1).toHex()},x" + Opcode.SHIFTEDR_SWORD -> " lda ${(ESTACK_HI+1).toHex()},x | asl a | ror ${(ESTACK_HI+1).toHex()},x | ror ${(ESTACK_LO+1).toHex()},x" + Opcode.SHIFTEDR_UWORD -> " lsr ${(ESTACK_HI+1).toHex()},x | ror ${(ESTACK_LO+1).toHex()},x" + else -> null } } diff --git a/compiler/src/prog8/optimizing/ConstExprEvaluator.kt b/compiler/src/prog8/optimizing/ConstExprEvaluator.kt index 67912f745..78205c612 100644 --- a/compiler/src/prog8/optimizing/ConstExprEvaluator.kt +++ b/compiler/src/prog8/optimizing/ConstExprEvaluator.kt @@ -31,10 +31,30 @@ class ConstExprEvaluator { ">=" -> LiteralValue.fromBoolean(left >= right, left.position) "==" -> LiteralValue.fromBoolean(left == right, left.position) "!=" -> LiteralValue.fromBoolean(left != right, left.position) + "<<" -> shiftedleft(left, right) + ">>" -> shiftedright(left, right) else -> throw FatalAstException("const evaluation for invalid operator $operator") } } + private fun shiftedright(left: LiteralValue, amount: LiteralValue): IExpression { + if(left.asIntegerValue==null || amount.asIntegerValue==null) + throw ExpressionError("cannot compute $left >> $amount", left.position) + val result = + if(left.type==DataType.UBYTE || left.type==DataType.UWORD) + left.asIntegerValue.ushr(amount.asIntegerValue) + else + left.asIntegerValue.shr(amount.asIntegerValue) + return LiteralValue.fromNumber(result, left.type, left.position) + } + + private fun shiftedleft(left: LiteralValue, amount: LiteralValue): IExpression { + if(left.asIntegerValue==null || amount.asIntegerValue==null) + throw ExpressionError("cannot compute $left << $amount", left.position) + val result = left.asIntegerValue.shl(amount.asIntegerValue) + return LiteralValue.fromNumber(result, left.type, left.position) + } + private fun logicalxor(left: LiteralValue, right: LiteralValue): LiteralValue { val error = "cannot compute $left locical-bitxor $right" return when { diff --git a/compiler/src/prog8/optimizing/SimplifyExpressions.kt b/compiler/src/prog8/optimizing/SimplifyExpressions.kt index b368adb6a..83c6752bd 100644 --- a/compiler/src/prog8/optimizing/SimplifyExpressions.kt +++ b/compiler/src/prog8/optimizing/SimplifyExpressions.kt @@ -3,6 +3,7 @@ package prog8.optimizing import prog8.ast.* import prog8.compiler.HeapValues import kotlin.math.abs +import kotlin.math.log2 /* todo simplify expression terms: @@ -15,6 +16,22 @@ import kotlin.math.abs X % 2 -> X and 1 (if X is byte/word) + todo often used multiplications to factors that are more efficiently calculated (via shifts) + + X*3 -> X*2+X + X*5 -> X*4+X + X*6 -> X*2+X*2+X*2 + X*7 -> X*4+X*2+X + X*9 -> X*8 + X + X*10 -> X*8 + X*2 + X*11 -> X*8 + X*2 +X + X*12 -> X*8 + X*4 + X*13 -> X*8 + X*4 +X + X*14 -> X*8 + X*4 + X*2 + X*15 -> X*8 + X*4 + X*2 + X + (and negatives) + + todo expression optimization: common (sub) expression elimination (turn common expressions into single subroutine call + introduce variable to hold it) */ @@ -23,9 +40,8 @@ class SimplifyExpressions(private val namespace: INameScope, private val heap: H var optimizationsDone: Int = 0 override fun process(assignment: Assignment): IStatement { - if(assignment.aug_op!=null) { + if(assignment.aug_op!=null) throw AstException("augmented assignments should have been converted to normal assignments before this optimizer") - } return super.process(assignment) } @@ -46,7 +62,7 @@ class SimplifyExpressions(private val namespace: INameScope, private val heap: H } } - // simplify logical expressions when a term is constant and determines the outcome + // simplify when a term is constant and determines the outcome when(expr.operator) { "or" -> { if((leftVal!=null && leftVal.asBooleanValue) || (rightVal!=null && rightVal.asBooleanValue)) { @@ -352,10 +368,13 @@ class SimplifyExpressions(private val namespace: INameScope, private val heap: H if(leftVal==null && rightVal==null) return expr + // cannot shuffle assiciativity with division! + if(rightVal!=null) { // right value is a constant, see if we can optimize val rightConst: LiteralValue = rightVal - when(rightConst.asNumericValue?.toDouble()) { + val cv = rightConst.asNumericValue?.toDouble() + when(cv) { -1.0 -> { // '/' -> -left, '//' -> -ceil(left) optimizationsDone++ @@ -374,6 +393,22 @@ class SimplifyExpressions(private val namespace: INameScope, private val heap: H "//" -> return FunctionCall(IdentifierReference(listOf("floor"), expr.position), mutableListOf(expr.left), expr.position) } } + 2.0, 4.0, 8.0, 16.0, 32.0, 64.0, 128.0, 256.0, 512.0, 1024.0, 2048.0, 4096.0, 8192.0, 16384.0, 32768.0, 65536.0 -> { + if(expr.left.resultingDatatype(namespace, heap) in IntegerDatatypes) { + // divided by a power of two => shift right + optimizationsDone++ + val numshifts = log2(cv) + return BinaryExpression(expr.left, ">>", LiteralValue.optimalInteger(numshifts, expr.position), expr.position) + } + } + -2.0, -4.0, -8.0, -16.0, -32.0, -64.0, -128.0, -256.0, -512.0, -1024.0, -2048.0, -4096.0, -8192.0, -16384.0, -32768.0, -65536.0 -> { + if(expr.left.resultingDatatype(namespace, heap) in IntegerDatatypes) { + // divided by a negative power of two => negate, then shift right + optimizationsDone++ + val numshifts = log2(-cv) + return BinaryExpression(PrefixExpression("-", expr.left, expr.position), ">>", LiteralValue.optimalInteger(numshifts, expr.position), expr.position) + } + } } if (expr.left.resultingDatatype(namespace, heap) == DataType.UBYTE) { @@ -413,7 +448,8 @@ class SimplifyExpressions(private val namespace: INameScope, private val heap: H // right value is a constant, see if we can optimize val leftValue: IExpression = expr.left val rightConst: LiteralValue = rightVal - when(rightConst.asNumericValue?.toDouble()) { + val cv = rightConst.asNumericValue?.toDouble() + when(cv) { -1.0 -> { // -left optimizationsDone++ @@ -429,6 +465,22 @@ class SimplifyExpressions(private val namespace: INameScope, private val heap: H optimizationsDone++ return expr.left } + 2.0, 4.0, 8.0, 16.0, 32.0, 64.0, 128.0, 256.0, 512.0, 1024.0, 2048.0, 4096.0, 8192.0, 16384.0, 32768.0, 65536.0 -> { + if(leftValue.resultingDatatype(namespace, heap) in IntegerDatatypes) { + // times a power of two => shift left + optimizationsDone++ + val numshifts = log2(cv) + return BinaryExpression(expr.left, "<<", LiteralValue.optimalInteger(numshifts, expr.position), expr.position) + } + } + -2.0, -4.0, -8.0, -16.0, -32.0, -64.0, -128.0, -256.0, -512.0, -1024.0, -2048.0, -4096.0, -8192.0, -16384.0, -32768.0, -65536.0 -> { + if(leftValue.resultingDatatype(namespace, heap) in IntegerDatatypes) { + // times a negative power of two => negate, then shift left + optimizationsDone++ + val numshifts = log2(-cv) + return BinaryExpression(PrefixExpression("-", expr.left, expr.position), "<<", LiteralValue.optimalInteger(numshifts, expr.position), expr.position) + } + } } } // no need to check for left val constant (because of associativity) diff --git a/compiler/src/prog8/optimizing/StatementOptimizer.kt b/compiler/src/prog8/optimizing/StatementOptimizer.kt index e91c4d913..2a1af17af 100644 --- a/compiler/src/prog8/optimizing/StatementOptimizer.kt +++ b/compiler/src/prog8/optimizing/StatementOptimizer.kt @@ -6,18 +6,18 @@ import prog8.functions.BuiltinFunctions /* + todo remove empty blocks? already done? + todo remove empty subs? already done? + todo remove unused blocks todo remove unused variables todo remove unused subroutines todo remove unused strings and arrays from the heap - todo remove if statements with empty statement blocks + todo remove if/while/repeat/for statements with empty statement blocks todo replace if statements with only else block todo regular subroutines that have 1 or 2 (u)byte or 1 (u)word parameters -> change to asmsub to accept these in A/Y registers instead of on stack - todo statement optimization: create augmented assignment from assignment that only refers to its lvalue (A=A+10, A=4*A, ...) - todo statement optimization: X+=1, X-=1 --> X++/X-- (to 3? 4? incs/decs in a row after that use arithmetic) - todo remove statements that have no effect X=X , X+=0, X-=0, X*=1, X/=1, X//=1, A |= 0, A ^= 0, A<<=0, etc etc - todo optimize addition with self into shift 1 (A+=A -> A<<=1) - todo assignment optimization: optimize some simple multiplications and divisions into shifts (A*=2 -> lsl(A), X=X/2 -> lsr(X) ) + todo statement optimization: X+=1, X-=1 --> X++/X-- (to 3? 4? incs/decs in a row, after that use arithmetic) + todo optimize integer addition with self into shift 1 (A+=A -> A<<=1) todo analyse for unreachable code and remove that (f.i. code after goto or return that has no label so can never be jumped to) todo merge sequence of assignments into one to avoid repeated value loads (as long as the value is a constant and the target not a MEMORY type!) todo report more always true/always false conditions @@ -121,7 +121,7 @@ class StatementOptimizer(private val namespace: INameScope, private val heap: He // always false -> ditch whole statement printWarning("condition is always false", whileLoop.position) optimizationsDone++ - AnonymousScope(mutableListOf(), whileLoop.position) + NopStatement(whileLoop.position) } } return whileLoop @@ -163,4 +163,125 @@ class StatementOptimizer(private val namespace: INameScope, private val heap: He } return jump } + + override fun process(assignment: Assignment): IStatement { + if(assignment.aug_op!=null) + throw AstException("augmented assignments should have been converted to normal assignments before this optimizer") + + // remove assignments that have no effect X=X , X+=0, X-=0, X*=1, X/=1, X//=1, A |= 0, A ^= 0, A<<=0, etc etc + if(assignment.targets.size==1) { + val target=assignment.targets[0] + if(same(target, assignment.value)) { + optimizationsDone++ + return NopStatement(assignment.position) + } + val targetDt = target.determineDatatype(namespace, heap, assignment) + val bexpr=assignment.value as? BinaryExpression + if(bexpr!=null && same(target, bexpr.left)) { + val cv = bexpr.right.constValue(namespace, heap)?.asNumericValue?.toDouble() + if(cv!=null) { + when (bexpr.operator) { + "+" -> if (cv==0.0) { + optimizationsDone++ + return NopStatement(assignment.position) + } + "-" -> if (cv==0.0) { + optimizationsDone++ + return NopStatement(assignment.position) + } + "*" -> if (cv==1.0) { + optimizationsDone++ + return NopStatement(assignment.position) + } + "%" -> if (cv==1.0) { + optimizationsDone++ + return NopStatement(assignment.position) + } + "/" -> if (cv==1.0) { + optimizationsDone++ + return NopStatement(assignment.position) + } + "//" -> if (cv==1.0) { + optimizationsDone++ + return NopStatement(assignment.position) + } + "**" -> if (cv==1.0) { + optimizationsDone++ + return NopStatement(assignment.position) + } + "|" -> if (cv==0.0) { + optimizationsDone++ + return NopStatement(assignment.position) + } + "^" -> if (cv==0.0) { + optimizationsDone++ + return NopStatement(assignment.position) + } + "<<" -> { + if(cv==0.0) { + optimizationsDone++ + return NopStatement(assignment.position) + } + if(((targetDt==DataType.UWORD || targetDt==DataType.WORD) && cv >15.0) || + ((targetDt==DataType.UBYTE || targetDt==DataType.BYTE) && cv > 7.0)) { + assignment.value = LiteralValue.optimalInteger(0, assignment.value.position) + assignment.value.linkParents(assignment) + optimizationsDone++ + } + else { + // replace by in-place lsl(...) call + val scope = AnonymousScope(mutableListOf(), assignment.position) + var numshifts = cv.toInt() + while(numshifts>0) { + scope.statements.add(FunctionCallStatement(IdentifierReference(listOf("lsl"), assignment.position), mutableListOf(bexpr.left), assignment.position)) + numshifts-- + } + optimizationsDone++ + return scope + } + } + ">>" -> { + if(cv==0.0) { + optimizationsDone++ + return NopStatement(assignment.position) + } + if(((targetDt==DataType.UWORD || targetDt==DataType.WORD) && cv >15.0) || + ((targetDt==DataType.UBYTE || targetDt==DataType.BYTE) && cv > 7.0)) { + assignment.value = LiteralValue.optimalInteger(0, assignment.value.position) + assignment.value.linkParents(assignment) + optimizationsDone++ + } + else { + // replace by in-place lsr(...) call + val scope = AnonymousScope(mutableListOf(), assignment.position) + var numshifts = cv.toInt() + while(numshifts>0) { + scope.statements.add(FunctionCallStatement(IdentifierReference(listOf("lsr"), assignment.position), mutableListOf(bexpr.left), assignment.position)) + numshifts-- + } + optimizationsDone++ + return scope + } + } + } + } + } + } + + return super.process(assignment) + } + + private fun same(target: AssignTarget, value: IExpression): Boolean { + return when { + target.memoryAddress!=null -> false + target.register!=null -> value is RegisterExpr && value.register==target.register + target.identifier!=null -> value is IdentifierReference && value.nameInSource==target.identifier.nameInSource + target.arrayindexed!=null -> value is ArrayIndexedExpression && + value.identifier.nameInSource==target.arrayindexed.identifier.nameInSource && + value.arrayspec.size()!=null && + target.arrayindexed.arrayspec.size()!=null && + value.arrayspec.size()==target.arrayindexed.arrayspec.size() + else -> false + } + } } diff --git a/compiler/src/prog8/parser/prog8Lexer.java b/compiler/src/prog8/parser/prog8Lexer.java index 7ff5d3837..05bfeae8c 100644 --- a/compiler/src/prog8/parser/prog8Lexer.java +++ b/compiler/src/prog8/parser/prog8Lexer.java @@ -32,9 +32,10 @@ public class prog8Lexer extends Lexer { T__87=88, T__88=89, T__89=90, T__90=91, T__91=92, T__92=93, T__93=94, T__94=95, T__95=96, T__96=97, T__97=98, T__98=99, T__99=100, T__100=101, T__101=102, T__102=103, T__103=104, T__104=105, T__105=106, T__106=107, - T__107=108, T__108=109, T__109=110, LINECOMMENT=111, COMMENT=112, WS=113, - EOL=114, NAME=115, DEC_INTEGER=116, HEX_INTEGER=117, BIN_INTEGER=118, - FLOAT_NUMBER=119, STRING=120, INLINEASMBLOCK=121, SINGLECHAR=122; + T__107=108, T__108=109, T__109=110, T__110=111, T__111=112, T__112=113, + T__113=114, LINECOMMENT=115, COMMENT=116, WS=117, EOL=118, NAME=119, DEC_INTEGER=120, + HEX_INTEGER=121, BIN_INTEGER=122, FLOAT_NUMBER=123, STRING=124, INLINEASMBLOCK=125, + SINGLECHAR=126; public static String[] channelNames = { "DEFAULT_TOKEN_CHANNEL", "HIDDEN" }; @@ -58,9 +59,10 @@ public class prog8Lexer extends Lexer { "T__81", "T__82", "T__83", "T__84", "T__85", "T__86", "T__87", "T__88", "T__89", "T__90", "T__91", "T__92", "T__93", "T__94", "T__95", "T__96", "T__97", "T__98", "T__99", "T__100", "T__101", "T__102", "T__103", "T__104", - "T__105", "T__106", "T__107", "T__108", "T__109", "LINECOMMENT", "COMMENT", - "WS", "EOL", "NAME", "DEC_INTEGER", "HEX_INTEGER", "BIN_INTEGER", "FLOAT_NUMBER", - "FNUMBER", "STRING_ESCAPE_SEQ", "STRING", "INLINEASMBLOCK", "SINGLECHAR" + "T__105", "T__106", "T__107", "T__108", "T__109", "T__110", "T__111", + "T__112", "T__113", "LINECOMMENT", "COMMENT", "WS", "EOL", "NAME", "DEC_INTEGER", + "HEX_INTEGER", "BIN_INTEGER", "FLOAT_NUMBER", "FNUMBER", "STRING_ESCAPE_SEQ", + "STRING", "INLINEASMBLOCK", "SINGLECHAR" }; } public static final String[] ruleNames = makeRuleNames(); @@ -72,16 +74,16 @@ public class prog8Lexer extends Lexer { "'%asmbinary'", "'%option'", "','", "'='", "'const'", "'memory'", "'ubyte'", "'byte'", "'uword'", "'word'", "'float'", "'str'", "'str_p'", "'str_s'", "'str_ps'", "'['", "']'", "'+='", "'-='", "'/='", "'//='", "'*='", "'**='", - "'&='", "'|='", "'^='", "'%='", "'++'", "'--'", "'+'", "'-'", "'**'", - "'*'", "'/'", "'//'", "'%'", "'<'", "'>'", "'<='", "'>='", "'=='", "'!='", - "'&'", "'^'", "'|'", "'to'", "'step'", "'and'", "'or'", "'xor'", "'not'", - "'('", "')'", "'as'", "'@'", "'return'", "'break'", "'continue'", "'.'", - "'A'", "'X'", "'Y'", "'AX'", "'AY'", "'XY'", "'Pc'", "'Pz'", "'Pn'", - "'Pv'", "'.w'", "'true'", "'false'", "'%asm'", "'sub'", "'->'", "'{'", - "'}'", "'asmsub'", "'clobbers'", "'stack'", "'if'", "'else'", "'if_cs'", - "'if_cc'", "'if_eq'", "'if_z'", "'if_ne'", "'if_nz'", "'if_pl'", "'if_pos'", - "'if_mi'", "'if_neg'", "'if_vs'", "'if_vc'", "'for'", "'in'", "'while'", - "'repeat'", "'until'" + "'&='", "'|='", "'^='", "'%='", "'<<='", "'>>='", "'++'", "'--'", "'+'", + "'-'", "'**'", "'*'", "'/'", "'//'", "'%'", "'<<'", "'>>'", "'<'", "'>'", + "'<='", "'>='", "'=='", "'!='", "'&'", "'^'", "'|'", "'to'", "'step'", + "'and'", "'or'", "'xor'", "'not'", "'('", "')'", "'as'", "'@'", "'return'", + "'break'", "'continue'", "'.'", "'A'", "'X'", "'Y'", "'AX'", "'AY'", + "'XY'", "'Pc'", "'Pz'", "'Pn'", "'Pv'", "'.w'", "'true'", "'false'", + "'%asm'", "'sub'", "'->'", "'{'", "'}'", "'asmsub'", "'clobbers'", "'stack'", + "'if'", "'else'", "'if_cs'", "'if_cc'", "'if_eq'", "'if_z'", "'if_ne'", + "'if_nz'", "'if_pl'", "'if_pos'", "'if_mi'", "'if_neg'", "'if_vs'", "'if_vc'", + "'for'", "'in'", "'while'", "'repeat'", "'until'" }; } private static final String[] _LITERAL_NAMES = makeLiteralNames(); @@ -96,9 +98,9 @@ public class prog8Lexer extends Lexer { null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, "LINECOMMENT", "COMMENT", "WS", "EOL", "NAME", "DEC_INTEGER", - "HEX_INTEGER", "BIN_INTEGER", "FLOAT_NUMBER", "STRING", "INLINEASMBLOCK", - "SINGLECHAR" + null, null, null, null, null, null, null, "LINECOMMENT", "COMMENT", "WS", + "EOL", "NAME", "DEC_INTEGER", "HEX_INTEGER", "BIN_INTEGER", "FLOAT_NUMBER", + "STRING", "INLINEASMBLOCK", "SINGLECHAR" }; } private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); @@ -162,13 +164,13 @@ public class prog8Lexer extends Lexer { @Override public void action(RuleContext _localctx, int ruleIndex, int actionIndex) { switch (ruleIndex) { - case 121: + case 125: STRING_action((RuleContext)_localctx, actionIndex); break; - case 122: + case 126: INLINEASMBLOCK_action((RuleContext)_localctx, actionIndex); break; - case 123: + case 127: SINGLECHAR_action((RuleContext)_localctx, actionIndex); break; } @@ -208,293 +210,303 @@ public class prog8Lexer extends Lexer { } public static final String _serializedATN = - "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2|\u0362\b\1\4\2\t"+ - "\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13"+ - "\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+ - "\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+ - "\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36\t\36\4\37\t\37\4 \t \4!"+ - "\t!\4\"\t\"\4#\t#\4$\t$\4%\t%\4&\t&\4\'\t\'\4(\t(\4)\t)\4*\t*\4+\t+\4"+ - ",\t,\4-\t-\4.\t.\4/\t/\4\60\t\60\4\61\t\61\4\62\t\62\4\63\t\63\4\64\t"+ - "\64\4\65\t\65\4\66\t\66\4\67\t\67\48\t8\49\t9\4:\t:\4;\t;\4<\t<\4=\t="+ - "\4>\t>\4?\t?\4@\t@\4A\tA\4B\tB\4C\tC\4D\tD\4E\tE\4F\tF\4G\tG\4H\tH\4I"+ - "\tI\4J\tJ\4K\tK\4L\tL\4M\tM\4N\tN\4O\tO\4P\tP\4Q\tQ\4R\tR\4S\tS\4T\tT"+ - "\4U\tU\4V\tV\4W\tW\4X\tX\4Y\tY\4Z\tZ\4[\t[\4\\\t\\\4]\t]\4^\t^\4_\t_\4"+ - "`\t`\4a\ta\4b\tb\4c\tc\4d\td\4e\te\4f\tf\4g\tg\4h\th\4i\ti\4j\tj\4k\t"+ - "k\4l\tl\4m\tm\4n\tn\4o\to\4p\tp\4q\tq\4r\tr\4s\ts\4t\tt\4u\tu\4v\tv\4"+ - "w\tw\4x\tx\4y\ty\4z\tz\4{\t{\4|\t|\4}\t}\3\2\3\2\3\3\3\3\3\4\3\4\3\4\3"+ - "\4\3\4\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6"+ - "\3\6\3\6\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\b\3\b\3\b\3\b\3\b\3"+ - "\b\3\b\3\b\3\b\3\b\3\b\3\b\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\n\3\n"+ - "\3\n\3\n\3\n\3\n\3\n\3\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13"+ - "\3\13\3\13\3\13\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\r\3"+ - "\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\16\3\16\3\16\3\16\3\16\3\16\3"+ - "\16\3\16\3\17\3\17\3\20\3\20\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\23\3\23\3\23\3\23\3\24\3\24\3\24\3"+ - "\24\3\24\3\25\3\25\3\25\3\25\3\25\3\25\3\26\3\26\3\26\3\26\3\26\3\27\3"+ - "\27\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\31\3\31\3\31\3\31\3\31\3"+ - "\31\3\32\3\32\3\32\3\32\3\32\3\32\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3"+ - "\34\3\34\3\35\3\35\3\36\3\36\3\36\3\37\3\37\3\37\3 \3 \3 \3!\3!\3!\3!"+ - "\3\"\3\"\3\"\3#\3#\3#\3#\3$\3$\3$\3%\3%\3%\3&\3&\3&\3\'\3\'\3\'\3(\3("+ - "\3(\3)\3)\3)\3*\3*\3+\3+\3,\3,\3,\3-\3-\3.\3.\3/\3/\3/\3\60\3\60\3\61"+ - "\3\61\3\62\3\62\3\63\3\63\3\63\3\64\3\64\3\64\3\65\3\65\3\65\3\66\3\66"+ - "\3\66\3\67\3\67\38\38\39\39\3:\3:\3:\3;\3;\3;\3;\3;\3<\3<\3<\3<\3=\3="+ - "\3=\3>\3>\3>\3>\3?\3?\3?\3?\3@\3@\3A\3A\3B\3B\3B\3C\3C\3D\3D\3D\3D\3D"+ - "\3D\3D\3E\3E\3E\3E\3E\3E\3F\3F\3F\3F\3F\3F\3F\3F\3F\3G\3G\3H\3H\3I\3I"+ - "\3J\3J\3K\3K\3K\3L\3L\3L\3M\3M\3M\3N\3N\3N\3O\3O\3O\3P\3P\3P\3Q\3Q\3Q"+ - "\3R\3R\3R\3S\3S\3S\3S\3S\3T\3T\3T\3T\3T\3T\3U\3U\3U\3U\3U\3V\3V\3V\3V"+ - "\3W\3W\3W\3X\3X\3Y\3Y\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3[\3[\3[\3[\3[\3[\3[\3[\3["+ - "\3\\\3\\\3\\\3\\\3\\\3\\\3]\3]\3]\3^\3^\3^\3^\3^\3_\3_\3_\3_\3_\3_\3`"+ - "\3`\3`\3`\3`\3`\3a\3a\3a\3a\3a\3a\3b\3b\3b\3b\3b\3c\3c\3c\3c\3c\3c\3d"+ - "\3d\3d\3d\3d\3d\3e\3e\3e\3e\3e\3e\3f\3f\3f\3f\3f\3f\3f\3g\3g\3g\3g\3g"+ - "\3g\3h\3h\3h\3h\3h\3h\3h\3i\3i\3i\3i\3i\3i\3j\3j\3j\3j\3j\3j\3k\3k\3k"+ - "\3k\3l\3l\3l\3m\3m\3m\3m\3m\3m\3n\3n\3n\3n\3n\3n\3n\3o\3o\3o\3o\3o\3o"+ - "\3p\3p\7p\u02f1\np\fp\16p\u02f4\13p\3p\3p\3p\3p\3q\3q\7q\u02fc\nq\fq\16"+ - "q\u02ff\13q\3q\3q\3r\3r\3r\3r\3s\6s\u0308\ns\rs\16s\u0309\3t\3t\7t\u030e"+ - "\nt\ft\16t\u0311\13t\3u\3u\3u\6u\u0316\nu\ru\16u\u0317\5u\u031a\nu\3v"+ - "\3v\6v\u031e\nv\rv\16v\u031f\3w\3w\6w\u0324\nw\rw\16w\u0325\3x\3x\3x\5"+ - "x\u032b\nx\3x\5x\u032e\nx\3y\6y\u0331\ny\ry\16y\u0332\3y\3y\6y\u0337\n"+ - "y\ry\16y\u0338\5y\u033b\ny\3z\3z\3z\3z\5z\u0341\nz\3{\3{\3{\7{\u0346\n"+ - "{\f{\16{\u0349\13{\3{\3{\3{\3|\3|\3|\3|\6|\u0352\n|\r|\16|\u0353\3|\3"+ - "|\3|\3|\3|\3}\3}\3}\5}\u035e\n}\3}\3}\3}\3\u0353\2~\3\3\5\4\7\5\t\6\13"+ - "\7\r\b\17\t\21\n\23\13\25\f\27\r\31\16\33\17\35\20\37\21!\22#\23%\24\'"+ - "\25)\26+\27-\30/\31\61\32\63\33\65\34\67\359\36;\37= ?!A\"C#E$G%I&K\'"+ - "M(O)Q*S+U,W-Y.[/]\60_\61a\62c\63e\64g\65i\66k\67m8o9q:s;u{?}@\177"+ - "A\u0081B\u0083C\u0085D\u0087E\u0089F\u008bG\u008dH\u008fI\u0091J\u0093"+ - "K\u0095L\u0097M\u0099N\u009bO\u009dP\u009fQ\u00a1R\u00a3S\u00a5T\u00a7"+ - "U\u00a9V\u00abW\u00adX\u00afY\u00b1Z\u00b3[\u00b5\\\u00b7]\u00b9^\u00bb"+ - "_\u00bd`\u00bfa\u00c1b\u00c3c\u00c5d\u00c7e\u00c9f\u00cbg\u00cdh\u00cf"+ - "i\u00d1j\u00d3k\u00d5l\u00d7m\u00d9n\u00dbo\u00ddp\u00dfq\u00e1r\u00e3"+ - "s\u00e5t\u00e7u\u00e9v\u00ebw\u00edx\u00efy\u00f1\2\u00f3\2\u00f5z\u00f7"+ - "{\u00f9|\3\2\n\4\2\f\f\17\17\4\2\13\13\"\"\5\2C\\aac|\6\2\62;C\\aac|\5"+ - "\2\62;CHch\4\2GGgg\4\2--//\6\2\f\f\16\17$$^^\2\u0371\2\3\3\2\2\2\2\5\3"+ - "\2\2\2\2\7\3\2\2\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2\2\17\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\31\3\2\2\2\2\33\3"+ - "\2\2\2\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'"+ - "\3\2\2\2\2)\3\2\2\2\2+\3\2\2\2\2-\3\2\2\2\2/\3\2\2\2\2\61\3\2\2\2\2\63"+ - "\3\2\2\2\2\65\3\2\2\2\2\67\3\2\2\2\29\3\2\2\2\2;\3\2\2\2\2=\3\2\2\2\2"+ - "?\3\2\2\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2\2\2G\3\2\2\2\2I\3\2\2\2\2K\3"+ - "\2\2\2\2M\3\2\2\2\2O\3\2\2\2\2Q\3\2\2\2\2S\3\2\2\2\2U\3\2\2\2\2W\3\2\2"+ - "\2\2Y\3\2\2\2\2[\3\2\2\2\2]\3\2\2\2\2_\3\2\2\2\2a\3\2\2\2\2c\3\2\2\2\2"+ - "e\3\2\2\2\2g\3\2\2\2\2i\3\2\2\2\2k\3\2\2\2\2m\3\2\2\2\2o\3\2\2\2\2q\3"+ - "\2\2\2\2s\3\2\2\2\2u\3\2\2\2\2w\3\2\2\2\2y\3\2\2\2\2{\3\2\2\2\2}\3\2\2"+ - "\2\2\177\3\2\2\2\2\u0081\3\2\2\2\2\u0083\3\2\2\2\2\u0085\3\2\2\2\2\u0087"+ - "\3\2\2\2\2\u0089\3\2\2\2\2\u008b\3\2\2\2\2\u008d\3\2\2\2\2\u008f\3\2\2"+ - "\2\2\u0091\3\2\2\2\2\u0093\3\2\2\2\2\u0095\3\2\2\2\2\u0097\3\2\2\2\2\u0099"+ - "\3\2\2\2\2\u009b\3\2\2\2\2\u009d\3\2\2\2\2\u009f\3\2\2\2\2\u00a1\3\2\2"+ - "\2\2\u00a3\3\2\2\2\2\u00a5\3\2\2\2\2\u00a7\3\2\2\2\2\u00a9\3\2\2\2\2\u00ab"+ - "\3\2\2\2\2\u00ad\3\2\2\2\2\u00af\3\2\2\2\2\u00b1\3\2\2\2\2\u00b3\3\2\2"+ - "\2\2\u00b5\3\2\2\2\2\u00b7\3\2\2\2\2\u00b9\3\2\2\2\2\u00bb\3\2\2\2\2\u00bd"+ - "\3\2\2\2\2\u00bf\3\2\2\2\2\u00c1\3\2\2\2\2\u00c3\3\2\2\2\2\u00c5\3\2\2"+ - "\2\2\u00c7\3\2\2\2\2\u00c9\3\2\2\2\2\u00cb\3\2\2\2\2\u00cd\3\2\2\2\2\u00cf"+ - "\3\2\2\2\2\u00d1\3\2\2\2\2\u00d3\3\2\2\2\2\u00d5\3\2\2\2\2\u00d7\3\2\2"+ - "\2\2\u00d9\3\2\2\2\2\u00db\3\2\2\2\2\u00dd\3\2\2\2\2\u00df\3\2\2\2\2\u00e1"+ - "\3\2\2\2\2\u00e3\3\2\2\2\2\u00e5\3\2\2\2\2\u00e7\3\2\2\2\2\u00e9\3\2\2"+ - "\2\2\u00eb\3\2\2\2\2\u00ed\3\2\2\2\2\u00ef\3\2\2\2\2\u00f5\3\2\2\2\2\u00f7"+ - "\3\2\2\2\2\u00f9\3\2\2\2\3\u00fb\3\2\2\2\5\u00fd\3\2\2\2\7\u00ff\3\2\2"+ - "\2\t\u0104\3\2\2\2\13\u010c\3\2\2\2\r\u0116\3\2\2\2\17\u0120\3\2\2\2\21"+ - "\u012c\3\2\2\2\23\u0135\3\2\2\2\25\u013d\3\2\2\2\27\u0149\3\2\2\2\31\u0155"+ - "\3\2\2\2\33\u0160\3\2\2\2\35\u0168\3\2\2\2\37\u016a\3\2\2\2!\u016c\3\2"+ - "\2\2#\u0172\3\2\2\2%\u0179\3\2\2\2\'\u017f\3\2\2\2)\u0184\3\2\2\2+\u018a"+ - "\3\2\2\2-\u018f\3\2\2\2/\u0195\3\2\2\2\61\u0199\3\2\2\2\63\u019f\3\2\2"+ - "\2\65\u01a5\3\2\2\2\67\u01ac\3\2\2\29\u01ae\3\2\2\2;\u01b0\3\2\2\2=\u01b3"+ - "\3\2\2\2?\u01b6\3\2\2\2A\u01b9\3\2\2\2C\u01bd\3\2\2\2E\u01c0\3\2\2\2G"+ - "\u01c4\3\2\2\2I\u01c7\3\2\2\2K\u01ca\3\2\2\2M\u01cd\3\2\2\2O\u01d0\3\2"+ - "\2\2Q\u01d3\3\2\2\2S\u01d6\3\2\2\2U\u01d8\3\2\2\2W\u01da\3\2\2\2Y\u01dd"+ - "\3\2\2\2[\u01df\3\2\2\2]\u01e1\3\2\2\2_\u01e4\3\2\2\2a\u01e6\3\2\2\2c"+ - "\u01e8\3\2\2\2e\u01ea\3\2\2\2g\u01ed\3\2\2\2i\u01f0\3\2\2\2k\u01f3\3\2"+ - "\2\2m\u01f6\3\2\2\2o\u01f8\3\2\2\2q\u01fa\3\2\2\2s\u01fc\3\2\2\2u\u01ff"+ - "\3\2\2\2w\u0204\3\2\2\2y\u0208\3\2\2\2{\u020b\3\2\2\2}\u020f\3\2\2\2\177"+ - "\u0213\3\2\2\2\u0081\u0215\3\2\2\2\u0083\u0217\3\2\2\2\u0085\u021a\3\2"+ - "\2\2\u0087\u021c\3\2\2\2\u0089\u0223\3\2\2\2\u008b\u0229\3\2\2\2\u008d"+ - "\u0232\3\2\2\2\u008f\u0234\3\2\2\2\u0091\u0236\3\2\2\2\u0093\u0238\3\2"+ - "\2\2\u0095\u023a\3\2\2\2\u0097\u023d\3\2\2\2\u0099\u0240\3\2\2\2\u009b"+ - "\u0243\3\2\2\2\u009d\u0246\3\2\2\2\u009f\u0249\3\2\2\2\u00a1\u024c\3\2"+ - "\2\2\u00a3\u024f\3\2\2\2\u00a5\u0252\3\2\2\2\u00a7\u0257\3\2\2\2\u00a9"+ - "\u025d\3\2\2\2\u00ab\u0262\3\2\2\2\u00ad\u0266\3\2\2\2\u00af\u0269\3\2"+ - "\2\2\u00b1\u026b\3\2\2\2\u00b3\u026d\3\2\2\2\u00b5\u0274\3\2\2\2\u00b7"+ - "\u027d\3\2\2\2\u00b9\u0283\3\2\2\2\u00bb\u0286\3\2\2\2\u00bd\u028b\3\2"+ - "\2\2\u00bf\u0291\3\2\2\2\u00c1\u0297\3\2\2\2\u00c3\u029d\3\2\2\2\u00c5"+ - "\u02a2\3\2\2\2\u00c7\u02a8\3\2\2\2\u00c9\u02ae\3\2\2\2\u00cb\u02b4\3\2"+ - "\2\2\u00cd\u02bb\3\2\2\2\u00cf\u02c1\3\2\2\2\u00d1\u02c8\3\2\2\2\u00d3"+ - "\u02ce\3\2\2\2\u00d5\u02d4\3\2\2\2\u00d7\u02d8\3\2\2\2\u00d9\u02db\3\2"+ - "\2\2\u00db\u02e1\3\2\2\2\u00dd\u02e8\3\2\2\2\u00df\u02ee\3\2\2\2\u00e1"+ - "\u02f9\3\2\2\2\u00e3\u0302\3\2\2\2\u00e5\u0307\3\2\2\2\u00e7\u030b\3\2"+ - "\2\2\u00e9\u0319\3\2\2\2\u00eb\u031b\3\2\2\2\u00ed\u0321\3\2\2\2\u00ef"+ - "\u0327\3\2\2\2\u00f1\u0330\3\2\2\2\u00f3\u0340\3\2\2\2\u00f5\u0342\3\2"+ - "\2\2\u00f7\u034d\3\2\2\2\u00f9\u035a\3\2\2\2\u00fb\u00fc\7\u0080\2\2\u00fc"+ - "\4\3\2\2\2\u00fd\u00fe\7<\2\2\u00fe\6\3\2\2\2\u00ff\u0100\7i\2\2\u0100"+ - "\u0101\7q\2\2\u0101\u0102\7v\2\2\u0102\u0103\7q\2\2\u0103\b\3\2\2\2\u0104"+ - "\u0105\7\'\2\2\u0105\u0106\7q\2\2\u0106\u0107\7w\2\2\u0107\u0108\7v\2"+ - "\2\u0108\u0109\7r\2\2\u0109\u010a\7w\2\2\u010a\u010b\7v\2\2\u010b\n\3"+ - "\2\2\2\u010c\u010d\7\'\2\2\u010d\u010e\7n\2\2\u010e\u010f\7c\2\2\u010f"+ - "\u0110\7w\2\2\u0110\u0111\7p\2\2\u0111\u0112\7e\2\2\u0112\u0113\7j\2\2"+ - "\u0113\u0114\7g\2\2\u0114\u0115\7t\2\2\u0115\f\3\2\2\2\u0116\u0117\7\'"+ - "\2\2\u0117\u0118\7|\2\2\u0118\u0119\7g\2\2\u0119\u011a\7t\2\2\u011a\u011b"+ - "\7q\2\2\u011b\u011c\7r\2\2\u011c\u011d\7c\2\2\u011d\u011e\7i\2\2\u011e"+ - "\u011f\7g\2\2\u011f\16\3\2\2\2\u0120\u0121\7\'\2\2\u0121\u0122\7|\2\2"+ - "\u0122\u0123\7r\2\2\u0123\u0124\7t\2\2\u0124\u0125\7g\2\2\u0125\u0126"+ - "\7u\2\2\u0126\u0127\7g\2\2\u0127\u0128\7t\2\2\u0128\u0129\7x\2\2\u0129"+ - "\u012a\7g\2\2\u012a\u012b\7f\2\2\u012b\20\3\2\2\2\u012c\u012d\7\'\2\2"+ - "\u012d\u012e\7c\2\2\u012e\u012f\7f\2\2\u012f\u0130\7f\2\2\u0130\u0131"+ - "\7t\2\2\u0131\u0132\7g\2\2\u0132\u0133\7u\2\2\u0133\u0134\7u\2\2\u0134"+ - "\22\3\2\2\2\u0135\u0136\7\'\2\2\u0136\u0137\7k\2\2\u0137\u0138\7o\2\2"+ - "\u0138\u0139\7r\2\2\u0139\u013a\7q\2\2\u013a\u013b\7t\2\2\u013b\u013c"+ - "\7v\2\2\u013c\24\3\2\2\2\u013d\u013e\7\'\2\2\u013e\u013f\7d\2\2\u013f"+ - "\u0140\7t\2\2\u0140\u0141\7g\2\2\u0141\u0142\7c\2\2\u0142\u0143\7m\2\2"+ - "\u0143\u0144\7r\2\2\u0144\u0145\7q\2\2\u0145\u0146\7k\2\2\u0146\u0147"+ - "\7p\2\2\u0147\u0148\7v\2\2\u0148\26\3\2\2\2\u0149\u014a\7\'\2\2\u014a"+ - "\u014b\7c\2\2\u014b\u014c\7u\2\2\u014c\u014d\7o\2\2\u014d\u014e\7k\2\2"+ - "\u014e\u014f\7p\2\2\u014f\u0150\7e\2\2\u0150\u0151\7n\2\2\u0151\u0152"+ - "\7w\2\2\u0152\u0153\7f\2\2\u0153\u0154\7g\2\2\u0154\30\3\2\2\2\u0155\u0156"+ - "\7\'\2\2\u0156\u0157\7c\2\2\u0157\u0158\7u\2\2\u0158\u0159\7o\2\2\u0159"+ - "\u015a\7d\2\2\u015a\u015b\7k\2\2\u015b\u015c\7p\2\2\u015c\u015d\7c\2\2"+ - "\u015d\u015e\7t\2\2\u015e\u015f\7{\2\2\u015f\32\3\2\2\2\u0160\u0161\7"+ - "\'\2\2\u0161\u0162\7q\2\2\u0162\u0163\7r\2\2\u0163\u0164\7v\2\2\u0164"+ - "\u0165\7k\2\2\u0165\u0166\7q\2\2\u0166\u0167\7p\2\2\u0167\34\3\2\2\2\u0168"+ - "\u0169\7.\2\2\u0169\36\3\2\2\2\u016a\u016b\7?\2\2\u016b \3\2\2\2\u016c"+ - "\u016d\7e\2\2\u016d\u016e\7q\2\2\u016e\u016f\7p\2\2\u016f\u0170\7u\2\2"+ - "\u0170\u0171\7v\2\2\u0171\"\3\2\2\2\u0172\u0173\7o\2\2\u0173\u0174\7g"+ - "\2\2\u0174\u0175\7o\2\2\u0175\u0176\7q\2\2\u0176\u0177\7t\2\2\u0177\u0178"+ - "\7{\2\2\u0178$\3\2\2\2\u0179\u017a\7w\2\2\u017a\u017b\7d\2\2\u017b\u017c"+ - "\7{\2\2\u017c\u017d\7v\2\2\u017d\u017e\7g\2\2\u017e&\3\2\2\2\u017f\u0180"+ - "\7d\2\2\u0180\u0181\7{\2\2\u0181\u0182\7v\2\2\u0182\u0183\7g\2\2\u0183"+ - "(\3\2\2\2\u0184\u0185\7w\2\2\u0185\u0186\7y\2\2\u0186\u0187\7q\2\2\u0187"+ - "\u0188\7t\2\2\u0188\u0189\7f\2\2\u0189*\3\2\2\2\u018a\u018b\7y\2\2\u018b"+ - "\u018c\7q\2\2\u018c\u018d\7t\2\2\u018d\u018e\7f\2\2\u018e,\3\2\2\2\u018f"+ - "\u0190\7h\2\2\u0190\u0191\7n\2\2\u0191\u0192\7q\2\2\u0192\u0193\7c\2\2"+ - "\u0193\u0194\7v\2\2\u0194.\3\2\2\2\u0195\u0196\7u\2\2\u0196\u0197\7v\2"+ - "\2\u0197\u0198\7t\2\2\u0198\60\3\2\2\2\u0199\u019a\7u\2\2\u019a\u019b"+ - "\7v\2\2\u019b\u019c\7t\2\2\u019c\u019d\7a\2\2\u019d\u019e\7r\2\2\u019e"+ - "\62\3\2\2\2\u019f\u01a0\7u\2\2\u01a0\u01a1\7v\2\2\u01a1\u01a2\7t\2\2\u01a2"+ - "\u01a3\7a\2\2\u01a3\u01a4\7u\2\2\u01a4\64\3\2\2\2\u01a5\u01a6\7u\2\2\u01a6"+ - "\u01a7\7v\2\2\u01a7\u01a8\7t\2\2\u01a8\u01a9\7a\2\2\u01a9\u01aa\7r\2\2"+ - "\u01aa\u01ab\7u\2\2\u01ab\66\3\2\2\2\u01ac\u01ad\7]\2\2\u01ad8\3\2\2\2"+ - "\u01ae\u01af\7_\2\2\u01af:\3\2\2\2\u01b0\u01b1\7-\2\2\u01b1\u01b2\7?\2"+ - "\2\u01b2<\3\2\2\2\u01b3\u01b4\7/\2\2\u01b4\u01b5\7?\2\2\u01b5>\3\2\2\2"+ - "\u01b6\u01b7\7\61\2\2\u01b7\u01b8\7?\2\2\u01b8@\3\2\2\2\u01b9\u01ba\7"+ - "\61\2\2\u01ba\u01bb\7\61\2\2\u01bb\u01bc\7?\2\2\u01bcB\3\2\2\2\u01bd\u01be"+ - "\7,\2\2\u01be\u01bf\7?\2\2\u01bfD\3\2\2\2\u01c0\u01c1\7,\2\2\u01c1\u01c2"+ - "\7,\2\2\u01c2\u01c3\7?\2\2\u01c3F\3\2\2\2\u01c4\u01c5\7(\2\2\u01c5\u01c6"+ - "\7?\2\2\u01c6H\3\2\2\2\u01c7\u01c8\7~\2\2\u01c8\u01c9\7?\2\2\u01c9J\3"+ - "\2\2\2\u01ca\u01cb\7`\2\2\u01cb\u01cc\7?\2\2\u01ccL\3\2\2\2\u01cd\u01ce"+ - "\7\'\2\2\u01ce\u01cf\7?\2\2\u01cfN\3\2\2\2\u01d0\u01d1\7-\2\2\u01d1\u01d2"+ - "\7-\2\2\u01d2P\3\2\2\2\u01d3\u01d4\7/\2\2\u01d4\u01d5\7/\2\2\u01d5R\3"+ - "\2\2\2\u01d6\u01d7\7-\2\2\u01d7T\3\2\2\2\u01d8\u01d9\7/\2\2\u01d9V\3\2"+ - "\2\2\u01da\u01db\7,\2\2\u01db\u01dc\7,\2\2\u01dcX\3\2\2\2\u01dd\u01de"+ - "\7,\2\2\u01deZ\3\2\2\2\u01df\u01e0\7\61\2\2\u01e0\\\3\2\2\2\u01e1\u01e2"+ - "\7\61\2\2\u01e2\u01e3\7\61\2\2\u01e3^\3\2\2\2\u01e4\u01e5\7\'\2\2\u01e5"+ - "`\3\2\2\2\u01e6\u01e7\7>\2\2\u01e7b\3\2\2\2\u01e8\u01e9\7@\2\2\u01e9d"+ - "\3\2\2\2\u01ea\u01eb\7>\2\2\u01eb\u01ec\7?\2\2\u01ecf\3\2\2\2\u01ed\u01ee"+ - "\7@\2\2\u01ee\u01ef\7?\2\2\u01efh\3\2\2\2\u01f0\u01f1\7?\2\2\u01f1\u01f2"+ - "\7?\2\2\u01f2j\3\2\2\2\u01f3\u01f4\7#\2\2\u01f4\u01f5\7?\2\2\u01f5l\3"+ - "\2\2\2\u01f6\u01f7\7(\2\2\u01f7n\3\2\2\2\u01f8\u01f9\7`\2\2\u01f9p\3\2"+ - "\2\2\u01fa\u01fb\7~\2\2\u01fbr\3\2\2\2\u01fc\u01fd\7v\2\2\u01fd\u01fe"+ - "\7q\2\2\u01fet\3\2\2\2\u01ff\u0200\7u\2\2\u0200\u0201\7v\2\2\u0201\u0202"+ - "\7g\2\2\u0202\u0203\7r\2\2\u0203v\3\2\2\2\u0204\u0205\7c\2\2\u0205\u0206"+ - "\7p\2\2\u0206\u0207\7f\2\2\u0207x\3\2\2\2\u0208\u0209\7q\2\2\u0209\u020a"+ - "\7t\2\2\u020az\3\2\2\2\u020b\u020c\7z\2\2\u020c\u020d\7q\2\2\u020d\u020e"+ - "\7t\2\2\u020e|\3\2\2\2\u020f\u0210\7p\2\2\u0210\u0211\7q\2\2\u0211\u0212"+ - "\7v\2\2\u0212~\3\2\2\2\u0213\u0214\7*\2\2\u0214\u0080\3\2\2\2\u0215\u0216"+ - "\7+\2\2\u0216\u0082\3\2\2\2\u0217\u0218\7c\2\2\u0218\u0219\7u\2\2\u0219"+ - "\u0084\3\2\2\2\u021a\u021b\7B\2\2\u021b\u0086\3\2\2\2\u021c\u021d\7t\2"+ - "\2\u021d\u021e\7g\2\2\u021e\u021f\7v\2\2\u021f\u0220\7w\2\2\u0220\u0221"+ - "\7t\2\2\u0221\u0222\7p\2\2\u0222\u0088\3\2\2\2\u0223\u0224\7d\2\2\u0224"+ - "\u0225\7t\2\2\u0225\u0226\7g\2\2\u0226\u0227\7c\2\2\u0227\u0228\7m\2\2"+ - "\u0228\u008a\3\2\2\2\u0229\u022a\7e\2\2\u022a\u022b\7q\2\2\u022b\u022c"+ - "\7p\2\2\u022c\u022d\7v\2\2\u022d\u022e\7k\2\2\u022e\u022f\7p\2\2\u022f"+ - "\u0230\7w\2\2\u0230\u0231\7g\2\2\u0231\u008c\3\2\2\2\u0232\u0233\7\60"+ - "\2\2\u0233\u008e\3\2\2\2\u0234\u0235\7C\2\2\u0235\u0090\3\2\2\2\u0236"+ - "\u0237\7Z\2\2\u0237\u0092\3\2\2\2\u0238\u0239\7[\2\2\u0239\u0094\3\2\2"+ - "\2\u023a\u023b\7C\2\2\u023b\u023c\7Z\2\2\u023c\u0096\3\2\2\2\u023d\u023e"+ - "\7C\2\2\u023e\u023f\7[\2\2\u023f\u0098\3\2\2\2\u0240\u0241\7Z\2\2\u0241"+ - "\u0242\7[\2\2\u0242\u009a\3\2\2\2\u0243\u0244\7R\2\2\u0244\u0245\7e\2"+ - "\2\u0245\u009c\3\2\2\2\u0246\u0247\7R\2\2\u0247\u0248\7|\2\2\u0248\u009e"+ - "\3\2\2\2\u0249\u024a\7R\2\2\u024a\u024b\7p\2\2\u024b\u00a0\3\2\2\2\u024c"+ - "\u024d\7R\2\2\u024d\u024e\7x\2\2\u024e\u00a2\3\2\2\2\u024f\u0250\7\60"+ - "\2\2\u0250\u0251\7y\2\2\u0251\u00a4\3\2\2\2\u0252\u0253\7v\2\2\u0253\u0254"+ - "\7t\2\2\u0254\u0255\7w\2\2\u0255\u0256\7g\2\2\u0256\u00a6\3\2\2\2\u0257"+ - "\u0258\7h\2\2\u0258\u0259\7c\2\2\u0259\u025a\7n\2\2\u025a\u025b\7u\2\2"+ - "\u025b\u025c\7g\2\2\u025c\u00a8\3\2\2\2\u025d\u025e\7\'\2\2\u025e\u025f"+ - "\7c\2\2\u025f\u0260\7u\2\2\u0260\u0261\7o\2\2\u0261\u00aa\3\2\2\2\u0262"+ - "\u0263\7u\2\2\u0263\u0264\7w\2\2\u0264\u0265\7d\2\2\u0265\u00ac\3\2\2"+ - "\2\u0266\u0267\7/\2\2\u0267\u0268\7@\2\2\u0268\u00ae\3\2\2\2\u0269\u026a"+ - "\7}\2\2\u026a\u00b0\3\2\2\2\u026b\u026c\7\177\2\2\u026c\u00b2\3\2\2\2"+ - "\u026d\u026e\7c\2\2\u026e\u026f\7u\2\2\u026f\u0270\7o\2\2\u0270\u0271"+ - "\7u\2\2\u0271\u0272\7w\2\2\u0272\u0273\7d\2\2\u0273\u00b4\3\2\2\2\u0274"+ - "\u0275\7e\2\2\u0275\u0276\7n\2\2\u0276\u0277\7q\2\2\u0277\u0278\7d\2\2"+ - "\u0278\u0279\7d\2\2\u0279\u027a\7g\2\2\u027a\u027b\7t\2\2\u027b\u027c"+ - "\7u\2\2\u027c\u00b6\3\2\2\2\u027d\u027e\7u\2\2\u027e\u027f\7v\2\2\u027f"+ - "\u0280\7c\2\2\u0280\u0281\7e\2\2\u0281\u0282\7m\2\2\u0282\u00b8\3\2\2"+ - "\2\u0283\u0284\7k\2\2\u0284\u0285\7h\2\2\u0285\u00ba\3\2\2\2\u0286\u0287"+ - "\7g\2\2\u0287\u0288\7n\2\2\u0288\u0289\7u\2\2\u0289\u028a\7g\2\2\u028a"+ - "\u00bc\3\2\2\2\u028b\u028c\7k\2\2\u028c\u028d\7h\2\2\u028d\u028e\7a\2"+ - "\2\u028e\u028f\7e\2\2\u028f\u0290\7u\2\2\u0290\u00be\3\2\2\2\u0291\u0292"+ - "\7k\2\2\u0292\u0293\7h\2\2\u0293\u0294\7a\2\2\u0294\u0295\7e\2\2\u0295"+ - "\u0296\7e\2\2\u0296\u00c0\3\2\2\2\u0297\u0298\7k\2\2\u0298\u0299\7h\2"+ - "\2\u0299\u029a\7a\2\2\u029a\u029b\7g\2\2\u029b\u029c\7s\2\2\u029c\u00c2"+ - "\3\2\2\2\u029d\u029e\7k\2\2\u029e\u029f\7h\2\2\u029f\u02a0\7a\2\2\u02a0"+ - "\u02a1\7|\2\2\u02a1\u00c4\3\2\2\2\u02a2\u02a3\7k\2\2\u02a3\u02a4\7h\2"+ - "\2\u02a4\u02a5\7a\2\2\u02a5\u02a6\7p\2\2\u02a6\u02a7\7g\2\2\u02a7\u00c6"+ - "\3\2\2\2\u02a8\u02a9\7k\2\2\u02a9\u02aa\7h\2\2\u02aa\u02ab\7a\2\2\u02ab"+ - "\u02ac\7p\2\2\u02ac\u02ad\7|\2\2\u02ad\u00c8\3\2\2\2\u02ae\u02af\7k\2"+ - "\2\u02af\u02b0\7h\2\2\u02b0\u02b1\7a\2\2\u02b1\u02b2\7r\2\2\u02b2\u02b3"+ - "\7n\2\2\u02b3\u00ca\3\2\2\2\u02b4\u02b5\7k\2\2\u02b5\u02b6\7h\2\2\u02b6"+ - "\u02b7\7a\2\2\u02b7\u02b8\7r\2\2\u02b8\u02b9\7q\2\2\u02b9\u02ba\7u\2\2"+ - "\u02ba\u00cc\3\2\2\2\u02bb\u02bc\7k\2\2\u02bc\u02bd\7h\2\2\u02bd\u02be"+ - "\7a\2\2\u02be\u02bf\7o\2\2\u02bf\u02c0\7k\2\2\u02c0\u00ce\3\2\2\2\u02c1"+ - "\u02c2\7k\2\2\u02c2\u02c3\7h\2\2\u02c3\u02c4\7a\2\2\u02c4\u02c5\7p\2\2"+ - "\u02c5\u02c6\7g\2\2\u02c6\u02c7\7i\2\2\u02c7\u00d0\3\2\2\2\u02c8\u02c9"+ - "\7k\2\2\u02c9\u02ca\7h\2\2\u02ca\u02cb\7a\2\2\u02cb\u02cc\7x\2\2\u02cc"+ - "\u02cd\7u\2\2\u02cd\u00d2\3\2\2\2\u02ce\u02cf\7k\2\2\u02cf\u02d0\7h\2"+ - "\2\u02d0\u02d1\7a\2\2\u02d1\u02d2\7x\2\2\u02d2\u02d3\7e\2\2\u02d3\u00d4"+ - "\3\2\2\2\u02d4\u02d5\7h\2\2\u02d5\u02d6\7q\2\2\u02d6\u02d7\7t\2\2\u02d7"+ - "\u00d6\3\2\2\2\u02d8\u02d9\7k\2\2\u02d9\u02da\7p\2\2\u02da\u00d8\3\2\2"+ - "\2\u02db\u02dc\7y\2\2\u02dc\u02dd\7j\2\2\u02dd\u02de\7k\2\2\u02de\u02df"+ - "\7n\2\2\u02df\u02e0\7g\2\2\u02e0\u00da\3\2\2\2\u02e1\u02e2\7t\2\2\u02e2"+ - "\u02e3\7g\2\2\u02e3\u02e4\7r\2\2\u02e4\u02e5\7g\2\2\u02e5\u02e6\7c\2\2"+ - "\u02e6\u02e7\7v\2\2\u02e7\u00dc\3\2\2\2\u02e8\u02e9\7w\2\2\u02e9\u02ea"+ - "\7p\2\2\u02ea\u02eb\7v\2\2\u02eb\u02ec\7k\2\2\u02ec\u02ed\7n\2\2\u02ed"+ - "\u00de\3\2\2\2\u02ee\u02f2\t\2\2\2\u02ef\u02f1\t\3\2\2\u02f0\u02ef\3\2"+ - "\2\2\u02f1\u02f4\3\2\2\2\u02f2\u02f0\3\2\2\2\u02f2\u02f3\3\2\2\2\u02f3"+ - "\u02f5\3\2\2\2\u02f4\u02f2\3\2\2\2\u02f5\u02f6\5\u00e1q\2\u02f6\u02f7"+ - "\3\2\2\2\u02f7\u02f8\bp\2\2\u02f8\u00e0\3\2\2\2\u02f9\u02fd\7=\2\2\u02fa"+ - "\u02fc\n\2\2\2\u02fb\u02fa\3\2\2\2\u02fc\u02ff\3\2\2\2\u02fd\u02fb\3\2"+ - "\2\2\u02fd\u02fe\3\2\2\2\u02fe\u0300\3\2\2\2\u02ff\u02fd\3\2\2\2\u0300"+ - "\u0301\bq\2\2\u0301\u00e2\3\2\2\2\u0302\u0303\t\3\2\2\u0303\u0304\3\2"+ - "\2\2\u0304\u0305\br\3\2\u0305\u00e4\3\2\2\2\u0306\u0308\t\2\2\2\u0307"+ - "\u0306\3\2\2\2\u0308\u0309\3\2\2\2\u0309\u0307\3\2\2\2\u0309\u030a\3\2"+ - "\2\2\u030a\u00e6\3\2\2\2\u030b\u030f\t\4\2\2\u030c\u030e\t\5\2\2\u030d"+ - "\u030c\3\2\2\2\u030e\u0311\3\2\2\2\u030f\u030d\3\2\2\2\u030f\u0310\3\2"+ - "\2\2\u0310\u00e8\3\2\2\2\u0311\u030f\3\2\2\2\u0312\u031a\4\62;\2\u0313"+ - "\u0315\4\63;\2\u0314\u0316\4\62;\2\u0315\u0314\3\2\2\2\u0316\u0317\3\2"+ - "\2\2\u0317\u0315\3\2\2\2\u0317\u0318\3\2\2\2\u0318\u031a\3\2\2\2\u0319"+ - "\u0312\3\2\2\2\u0319\u0313\3\2\2\2\u031a\u00ea\3\2\2\2\u031b\u031d\7&"+ - "\2\2\u031c\u031e\t\6\2\2\u031d\u031c\3\2\2\2\u031e\u031f\3\2\2\2\u031f"+ - "\u031d\3\2\2\2\u031f\u0320\3\2\2\2\u0320\u00ec\3\2\2\2\u0321\u0323\7\'"+ - "\2\2\u0322\u0324\4\62\63\2\u0323\u0322\3\2\2\2\u0324\u0325\3\2\2\2\u0325"+ - "\u0323\3\2\2\2\u0325\u0326\3\2\2\2\u0326\u00ee\3\2\2\2\u0327\u032d\5\u00f1"+ - "y\2\u0328\u032a\t\7\2\2\u0329\u032b\t\b\2\2\u032a\u0329\3\2\2\2\u032a"+ - "\u032b\3\2\2\2\u032b\u032c\3\2\2\2\u032c\u032e\5\u00f1y\2\u032d\u0328"+ - "\3\2\2\2\u032d\u032e\3\2\2\2\u032e\u00f0\3\2\2\2\u032f\u0331\4\62;\2\u0330"+ - "\u032f\3\2\2\2\u0331\u0332\3\2\2\2\u0332\u0330\3\2\2\2\u0332\u0333\3\2"+ - "\2\2\u0333\u033a\3\2\2\2\u0334\u0336\7\60\2\2\u0335\u0337\4\62;\2\u0336"+ - "\u0335\3\2\2\2\u0337\u0338\3\2\2\2\u0338\u0336\3\2\2\2\u0338\u0339\3\2"+ - "\2\2\u0339\u033b\3\2\2\2\u033a\u0334\3\2\2\2\u033a\u033b\3\2\2\2\u033b"+ - "\u00f2\3\2\2\2\u033c\u033d\7^\2\2\u033d\u0341\13\2\2\2\u033e\u033f\7^"+ - "\2\2\u033f\u0341\5\u00e5s\2\u0340\u033c\3\2\2\2\u0340\u033e\3\2\2\2\u0341"+ - "\u00f4\3\2\2\2\u0342\u0347\7$\2\2\u0343\u0346\5\u00f3z\2\u0344\u0346\n"+ - "\t\2\2\u0345\u0343\3\2\2\2\u0345\u0344\3\2\2\2\u0346\u0349\3\2\2\2\u0347"+ - "\u0345\3\2\2\2\u0347\u0348\3\2\2\2\u0348\u034a\3\2\2\2\u0349\u0347\3\2"+ - "\2\2\u034a\u034b\7$\2\2\u034b\u034c\b{\4\2\u034c\u00f6\3\2\2\2\u034d\u034e"+ - "\7}\2\2\u034e\u034f\7}\2\2\u034f\u0351\3\2\2\2\u0350\u0352\13\2\2\2\u0351"+ - "\u0350\3\2\2\2\u0352\u0353\3\2\2\2\u0353\u0354\3\2\2\2\u0353\u0351\3\2"+ - "\2\2\u0354\u0355\3\2\2\2\u0355\u0356\7\177\2\2\u0356\u0357\7\177\2\2\u0357"+ - "\u0358\3\2\2\2\u0358\u0359\b|\5\2\u0359\u00f8\3\2\2\2\u035a\u035d\7)\2"+ - "\2\u035b\u035e\5\u00f3z\2\u035c\u035e\n\t\2\2\u035d\u035b\3\2\2\2\u035d"+ - "\u035c\3\2\2\2\u035e\u035f\3\2\2\2\u035f\u0360\7)\2\2\u0360\u0361\b}\6"+ - "\2\u0361\u00fa\3\2\2\2\26\2\u02f2\u02fd\u0309\u030f\u0317\u0319\u031d"+ - "\u031f\u0325\u032a\u032d\u0332\u0338\u033a\u0340\u0345\u0347\u0353\u035d"+ - "\7\2\3\2\b\2\2\3{\2\3|\3\3}\4"; + "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\u0080\u0378\b\1\4"+ + "\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n"+ + "\4\13\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22"+ + "\t\22\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31"+ + "\t\31\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36\t\36\4\37\t\37\4 \t"+ + " \4!\t!\4\"\t\"\4#\t#\4$\t$\4%\t%\4&\t&\4\'\t\'\4(\t(\4)\t)\4*\t*\4+\t"+ + "+\4,\t,\4-\t-\4.\t.\4/\t/\4\60\t\60\4\61\t\61\4\62\t\62\4\63\t\63\4\64"+ + "\t\64\4\65\t\65\4\66\t\66\4\67\t\67\48\t8\49\t9\4:\t:\4;\t;\4<\t<\4=\t"+ + "=\4>\t>\4?\t?\4@\t@\4A\tA\4B\tB\4C\tC\4D\tD\4E\tE\4F\tF\4G\tG\4H\tH\4"+ + "I\tI\4J\tJ\4K\tK\4L\tL\4M\tM\4N\tN\4O\tO\4P\tP\4Q\tQ\4R\tR\4S\tS\4T\t"+ + "T\4U\tU\4V\tV\4W\tW\4X\tX\4Y\tY\4Z\tZ\4[\t[\4\\\t\\\4]\t]\4^\t^\4_\t_"+ + "\4`\t`\4a\ta\4b\tb\4c\tc\4d\td\4e\te\4f\tf\4g\tg\4h\th\4i\ti\4j\tj\4k"+ + "\tk\4l\tl\4m\tm\4n\tn\4o\to\4p\tp\4q\tq\4r\tr\4s\ts\4t\tt\4u\tu\4v\tv"+ + "\4w\tw\4x\tx\4y\ty\4z\tz\4{\t{\4|\t|\4}\t}\4~\t~\4\177\t\177\4\u0080\t"+ + "\u0080\4\u0081\t\u0081\3\2\3\2\3\3\3\3\3\4\3\4\3\4\3\4\3\4\3\5\3\5\3\5"+ + "\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\7\3\7\3"+ + "\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b"+ + "\3\b\3\b\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\n\3\n\3\n\3\n\3\n\3\n\3"+ + "\n\3\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\f"+ + "\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3\r\3\r\3"+ + "\r\3\r\3\r\3\r\3\r\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\17\3\17\3"+ + "\20\3\20\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\23\3\23\3\23\3\23\3\24\3\24\3\24\3\24\3\24\3\25\3\25\3"+ + "\25\3\25\3\25\3\25\3\26\3\26\3\26\3\26\3\26\3\27\3\27\3\27\3\27\3\27\3"+ + "\27\3\30\3\30\3\30\3\30\3\31\3\31\3\31\3\31\3\31\3\31\3\32\3\32\3\32\3"+ + "\32\3\32\3\32\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\34\3\34\3\35\3\35\3"+ + "\36\3\36\3\36\3\37\3\37\3\37\3 \3 \3 \3!\3!\3!\3!\3\"\3\"\3\"\3#\3#\3"+ + "#\3#\3$\3$\3$\3%\3%\3%\3&\3&\3&\3\'\3\'\3\'\3(\3(\3(\3(\3)\3)\3)\3)\3"+ + "*\3*\3*\3+\3+\3+\3,\3,\3-\3-\3.\3.\3.\3/\3/\3\60\3\60\3\61\3\61\3\61\3"+ + "\62\3\62\3\63\3\63\3\63\3\64\3\64\3\64\3\65\3\65\3\66\3\66\3\67\3\67\3"+ + "\67\38\38\38\39\39\39\3:\3:\3:\3;\3;\3<\3<\3=\3=\3>\3>\3>\3?\3?\3?\3?"+ + "\3?\3@\3@\3@\3@\3A\3A\3A\3B\3B\3B\3B\3C\3C\3C\3C\3D\3D\3E\3E\3F\3F\3F"+ + "\3G\3G\3H\3H\3H\3H\3H\3H\3H\3I\3I\3I\3I\3I\3I\3J\3J\3J\3J\3J\3J\3J\3J"+ + "\3J\3K\3K\3L\3L\3M\3M\3N\3N\3O\3O\3O\3P\3P\3P\3Q\3Q\3Q\3R\3R\3R\3S\3S"+ + "\3S\3T\3T\3T\3U\3U\3U\3V\3V\3V\3W\3W\3W\3W\3W\3X\3X\3X\3X\3X\3X\3Y\3Y"+ + "\3Y\3Y\3Y\3Z\3Z\3Z\3Z\3[\3[\3[\3\\\3\\\3]\3]\3^\3^\3^\3^\3^\3^\3^\3_\3"+ + "_\3_\3_\3_\3_\3_\3_\3_\3`\3`\3`\3`\3`\3`\3a\3a\3a\3b\3b\3b\3b\3b\3c\3"+ + "c\3c\3c\3c\3c\3d\3d\3d\3d\3d\3d\3e\3e\3e\3e\3e\3e\3f\3f\3f\3f\3f\3g\3"+ + "g\3g\3g\3g\3g\3h\3h\3h\3h\3h\3h\3i\3i\3i\3i\3i\3i\3j\3j\3j\3j\3j\3j\3"+ + "j\3k\3k\3k\3k\3k\3k\3l\3l\3l\3l\3l\3l\3l\3m\3m\3m\3m\3m\3m\3n\3n\3n\3"+ + "n\3n\3n\3o\3o\3o\3o\3p\3p\3p\3q\3q\3q\3q\3q\3q\3r\3r\3r\3r\3r\3r\3r\3"+ + "s\3s\3s\3s\3s\3s\3t\3t\7t\u0307\nt\ft\16t\u030a\13t\3t\3t\3t\3t\3u\3u"+ + "\7u\u0312\nu\fu\16u\u0315\13u\3u\3u\3v\3v\3v\3v\3w\6w\u031e\nw\rw\16w"+ + "\u031f\3x\3x\7x\u0324\nx\fx\16x\u0327\13x\3y\3y\3y\6y\u032c\ny\ry\16y"+ + "\u032d\5y\u0330\ny\3z\3z\6z\u0334\nz\rz\16z\u0335\3{\3{\6{\u033a\n{\r"+ + "{\16{\u033b\3|\3|\3|\5|\u0341\n|\3|\5|\u0344\n|\3}\6}\u0347\n}\r}\16}"+ + "\u0348\3}\3}\6}\u034d\n}\r}\16}\u034e\5}\u0351\n}\3~\3~\3~\3~\5~\u0357"+ + "\n~\3\177\3\177\3\177\7\177\u035c\n\177\f\177\16\177\u035f\13\177\3\177"+ + "\3\177\3\177\3\u0080\3\u0080\3\u0080\3\u0080\6\u0080\u0368\n\u0080\r\u0080"+ + "\16\u0080\u0369\3\u0080\3\u0080\3\u0080\3\u0080\3\u0080\3\u0081\3\u0081"+ + "\3\u0081\5\u0081\u0374\n\u0081\3\u0081\3\u0081\3\u0081\3\u0369\2\u0082"+ + "\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f\27\r\31\16\33\17\35\20"+ + "\37\21!\22#\23%\24\'\25)\26+\27-\30/\31\61\32\63\33\65\34\67\359\36;\37"+ + "= ?!A\"C#E$G%I&K\'M(O)Q*S+U,W-Y.[/]\60_\61a\62c\63e\64g\65i\66k\67m8o"+ + "9q:s;u{?}@\177A\u0081B\u0083C\u0085D\u0087E\u0089F\u008bG\u008dH"+ + "\u008fI\u0091J\u0093K\u0095L\u0097M\u0099N\u009bO\u009dP\u009fQ\u00a1"+ + "R\u00a3S\u00a5T\u00a7U\u00a9V\u00abW\u00adX\u00afY\u00b1Z\u00b3[\u00b5"+ + "\\\u00b7]\u00b9^\u00bb_\u00bd`\u00bfa\u00c1b\u00c3c\u00c5d\u00c7e\u00c9"+ + "f\u00cbg\u00cdh\u00cfi\u00d1j\u00d3k\u00d5l\u00d7m\u00d9n\u00dbo\u00dd"+ + "p\u00dfq\u00e1r\u00e3s\u00e5t\u00e7u\u00e9v\u00ebw\u00edx\u00efy\u00f1"+ + "z\u00f3{\u00f5|\u00f7}\u00f9\2\u00fb\2\u00fd~\u00ff\177\u0101\u0080\3"+ + "\2\n\4\2\f\f\17\17\4\2\13\13\"\"\5\2C\\aac|\6\2\62;C\\aac|\5\2\62;CHc"+ + "h\4\2GGgg\4\2--//\6\2\f\f\16\17$$^^\2\u0387\2\3\3\2\2\2\2\5\3\2\2\2\2"+ + "\7\3\2\2\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2\2\17\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\31\3\2\2\2\2\33\3\2\2\2"+ + "\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2\2"+ + "\2\2)\3\2\2\2\2+\3\2\2\2\2-\3\2\2\2\2/\3\2\2\2\2\61\3\2\2\2\2\63\3\2\2"+ + "\2\2\65\3\2\2\2\2\67\3\2\2\2\29\3\2\2\2\2;\3\2\2\2\2=\3\2\2\2\2?\3\2\2"+ + "\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2\2\2G\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2\2"+ + "M\3\2\2\2\2O\3\2\2\2\2Q\3\2\2\2\2S\3\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y\3"+ + "\2\2\2\2[\3\2\2\2\2]\3\2\2\2\2_\3\2\2\2\2a\3\2\2\2\2c\3\2\2\2\2e\3\2\2"+ + "\2\2g\3\2\2\2\2i\3\2\2\2\2k\3\2\2\2\2m\3\2\2\2\2o\3\2\2\2\2q\3\2\2\2\2"+ + "s\3\2\2\2\2u\3\2\2\2\2w\3\2\2\2\2y\3\2\2\2\2{\3\2\2\2\2}\3\2\2\2\2\177"+ + "\3\2\2\2\2\u0081\3\2\2\2\2\u0083\3\2\2\2\2\u0085\3\2\2\2\2\u0087\3\2\2"+ + "\2\2\u0089\3\2\2\2\2\u008b\3\2\2\2\2\u008d\3\2\2\2\2\u008f\3\2\2\2\2\u0091"+ + "\3\2\2\2\2\u0093\3\2\2\2\2\u0095\3\2\2\2\2\u0097\3\2\2\2\2\u0099\3\2\2"+ + "\2\2\u009b\3\2\2\2\2\u009d\3\2\2\2\2\u009f\3\2\2\2\2\u00a1\3\2\2\2\2\u00a3"+ + "\3\2\2\2\2\u00a5\3\2\2\2\2\u00a7\3\2\2\2\2\u00a9\3\2\2\2\2\u00ab\3\2\2"+ + "\2\2\u00ad\3\2\2\2\2\u00af\3\2\2\2\2\u00b1\3\2\2\2\2\u00b3\3\2\2\2\2\u00b5"+ + "\3\2\2\2\2\u00b7\3\2\2\2\2\u00b9\3\2\2\2\2\u00bb\3\2\2\2\2\u00bd\3\2\2"+ + "\2\2\u00bf\3\2\2\2\2\u00c1\3\2\2\2\2\u00c3\3\2\2\2\2\u00c5\3\2\2\2\2\u00c7"+ + "\3\2\2\2\2\u00c9\3\2\2\2\2\u00cb\3\2\2\2\2\u00cd\3\2\2\2\2\u00cf\3\2\2"+ + "\2\2\u00d1\3\2\2\2\2\u00d3\3\2\2\2\2\u00d5\3\2\2\2\2\u00d7\3\2\2\2\2\u00d9"+ + "\3\2\2\2\2\u00db\3\2\2\2\2\u00dd\3\2\2\2\2\u00df\3\2\2\2\2\u00e1\3\2\2"+ + "\2\2\u00e3\3\2\2\2\2\u00e5\3\2\2\2\2\u00e7\3\2\2\2\2\u00e9\3\2\2\2\2\u00eb"+ + "\3\2\2\2\2\u00ed\3\2\2\2\2\u00ef\3\2\2\2\2\u00f1\3\2\2\2\2\u00f3\3\2\2"+ + "\2\2\u00f5\3\2\2\2\2\u00f7\3\2\2\2\2\u00fd\3\2\2\2\2\u00ff\3\2\2\2\2\u0101"+ + "\3\2\2\2\3\u0103\3\2\2\2\5\u0105\3\2\2\2\7\u0107\3\2\2\2\t\u010c\3\2\2"+ + "\2\13\u0114\3\2\2\2\r\u011e\3\2\2\2\17\u0128\3\2\2\2\21\u0134\3\2\2\2"+ + "\23\u013d\3\2\2\2\25\u0145\3\2\2\2\27\u0151\3\2\2\2\31\u015d\3\2\2\2\33"+ + "\u0168\3\2\2\2\35\u0170\3\2\2\2\37\u0172\3\2\2\2!\u0174\3\2\2\2#\u017a"+ + "\3\2\2\2%\u0181\3\2\2\2\'\u0187\3\2\2\2)\u018c\3\2\2\2+\u0192\3\2\2\2"+ + "-\u0197\3\2\2\2/\u019d\3\2\2\2\61\u01a1\3\2\2\2\63\u01a7\3\2\2\2\65\u01ad"+ + "\3\2\2\2\67\u01b4\3\2\2\29\u01b6\3\2\2\2;\u01b8\3\2\2\2=\u01bb\3\2\2\2"+ + "?\u01be\3\2\2\2A\u01c1\3\2\2\2C\u01c5\3\2\2\2E\u01c8\3\2\2\2G\u01cc\3"+ + "\2\2\2I\u01cf\3\2\2\2K\u01d2\3\2\2\2M\u01d5\3\2\2\2O\u01d8\3\2\2\2Q\u01dc"+ + "\3\2\2\2S\u01e0\3\2\2\2U\u01e3\3\2\2\2W\u01e6\3\2\2\2Y\u01e8\3\2\2\2["+ + "\u01ea\3\2\2\2]\u01ed\3\2\2\2_\u01ef\3\2\2\2a\u01f1\3\2\2\2c\u01f4\3\2"+ + "\2\2e\u01f6\3\2\2\2g\u01f9\3\2\2\2i\u01fc\3\2\2\2k\u01fe\3\2\2\2m\u0200"+ + "\3\2\2\2o\u0203\3\2\2\2q\u0206\3\2\2\2s\u0209\3\2\2\2u\u020c\3\2\2\2w"+ + "\u020e\3\2\2\2y\u0210\3\2\2\2{\u0212\3\2\2\2}\u0215\3\2\2\2\177\u021a"+ + "\3\2\2\2\u0081\u021e\3\2\2\2\u0083\u0221\3\2\2\2\u0085\u0225\3\2\2\2\u0087"+ + "\u0229\3\2\2\2\u0089\u022b\3\2\2\2\u008b\u022d\3\2\2\2\u008d\u0230\3\2"+ + "\2\2\u008f\u0232\3\2\2\2\u0091\u0239\3\2\2\2\u0093\u023f\3\2\2\2\u0095"+ + "\u0248\3\2\2\2\u0097\u024a\3\2\2\2\u0099\u024c\3\2\2\2\u009b\u024e\3\2"+ + "\2\2\u009d\u0250\3\2\2\2\u009f\u0253\3\2\2\2\u00a1\u0256\3\2\2\2\u00a3"+ + "\u0259\3\2\2\2\u00a5\u025c\3\2\2\2\u00a7\u025f\3\2\2\2\u00a9\u0262\3\2"+ + "\2\2\u00ab\u0265\3\2\2\2\u00ad\u0268\3\2\2\2\u00af\u026d\3\2\2\2\u00b1"+ + "\u0273\3\2\2\2\u00b3\u0278\3\2\2\2\u00b5\u027c\3\2\2\2\u00b7\u027f\3\2"+ + "\2\2\u00b9\u0281\3\2\2\2\u00bb\u0283\3\2\2\2\u00bd\u028a\3\2\2\2\u00bf"+ + "\u0293\3\2\2\2\u00c1\u0299\3\2\2\2\u00c3\u029c\3\2\2\2\u00c5\u02a1\3\2"+ + "\2\2\u00c7\u02a7\3\2\2\2\u00c9\u02ad\3\2\2\2\u00cb\u02b3\3\2\2\2\u00cd"+ + "\u02b8\3\2\2\2\u00cf\u02be\3\2\2\2\u00d1\u02c4\3\2\2\2\u00d3\u02ca\3\2"+ + "\2\2\u00d5\u02d1\3\2\2\2\u00d7\u02d7\3\2\2\2\u00d9\u02de\3\2\2\2\u00db"+ + "\u02e4\3\2\2\2\u00dd\u02ea\3\2\2\2\u00df\u02ee\3\2\2\2\u00e1\u02f1\3\2"+ + "\2\2\u00e3\u02f7\3\2\2\2\u00e5\u02fe\3\2\2\2\u00e7\u0304\3\2\2\2\u00e9"+ + "\u030f\3\2\2\2\u00eb\u0318\3\2\2\2\u00ed\u031d\3\2\2\2\u00ef\u0321\3\2"+ + "\2\2\u00f1\u032f\3\2\2\2\u00f3\u0331\3\2\2\2\u00f5\u0337\3\2\2\2\u00f7"+ + "\u033d\3\2\2\2\u00f9\u0346\3\2\2\2\u00fb\u0356\3\2\2\2\u00fd\u0358\3\2"+ + "\2\2\u00ff\u0363\3\2\2\2\u0101\u0370\3\2\2\2\u0103\u0104\7\u0080\2\2\u0104"+ + "\4\3\2\2\2\u0105\u0106\7<\2\2\u0106\6\3\2\2\2\u0107\u0108\7i\2\2\u0108"+ + "\u0109\7q\2\2\u0109\u010a\7v\2\2\u010a\u010b\7q\2\2\u010b\b\3\2\2\2\u010c"+ + "\u010d\7\'\2\2\u010d\u010e\7q\2\2\u010e\u010f\7w\2\2\u010f\u0110\7v\2"+ + "\2\u0110\u0111\7r\2\2\u0111\u0112\7w\2\2\u0112\u0113\7v\2\2\u0113\n\3"+ + "\2\2\2\u0114\u0115\7\'\2\2\u0115\u0116\7n\2\2\u0116\u0117\7c\2\2\u0117"+ + "\u0118\7w\2\2\u0118\u0119\7p\2\2\u0119\u011a\7e\2\2\u011a\u011b\7j\2\2"+ + "\u011b\u011c\7g\2\2\u011c\u011d\7t\2\2\u011d\f\3\2\2\2\u011e\u011f\7\'"+ + "\2\2\u011f\u0120\7|\2\2\u0120\u0121\7g\2\2\u0121\u0122\7t\2\2\u0122\u0123"+ + "\7q\2\2\u0123\u0124\7r\2\2\u0124\u0125\7c\2\2\u0125\u0126\7i\2\2\u0126"+ + "\u0127\7g\2\2\u0127\16\3\2\2\2\u0128\u0129\7\'\2\2\u0129\u012a\7|\2\2"+ + "\u012a\u012b\7r\2\2\u012b\u012c\7t\2\2\u012c\u012d\7g\2\2\u012d\u012e"+ + "\7u\2\2\u012e\u012f\7g\2\2\u012f\u0130\7t\2\2\u0130\u0131\7x\2\2\u0131"+ + "\u0132\7g\2\2\u0132\u0133\7f\2\2\u0133\20\3\2\2\2\u0134\u0135\7\'\2\2"+ + "\u0135\u0136\7c\2\2\u0136\u0137\7f\2\2\u0137\u0138\7f\2\2\u0138\u0139"+ + "\7t\2\2\u0139\u013a\7g\2\2\u013a\u013b\7u\2\2\u013b\u013c\7u\2\2\u013c"+ + "\22\3\2\2\2\u013d\u013e\7\'\2\2\u013e\u013f\7k\2\2\u013f\u0140\7o\2\2"+ + "\u0140\u0141\7r\2\2\u0141\u0142\7q\2\2\u0142\u0143\7t\2\2\u0143\u0144"+ + "\7v\2\2\u0144\24\3\2\2\2\u0145\u0146\7\'\2\2\u0146\u0147\7d\2\2\u0147"+ + "\u0148\7t\2\2\u0148\u0149\7g\2\2\u0149\u014a\7c\2\2\u014a\u014b\7m\2\2"+ + "\u014b\u014c\7r\2\2\u014c\u014d\7q\2\2\u014d\u014e\7k\2\2\u014e\u014f"+ + "\7p\2\2\u014f\u0150\7v\2\2\u0150\26\3\2\2\2\u0151\u0152\7\'\2\2\u0152"+ + "\u0153\7c\2\2\u0153\u0154\7u\2\2\u0154\u0155\7o\2\2\u0155\u0156\7k\2\2"+ + "\u0156\u0157\7p\2\2\u0157\u0158\7e\2\2\u0158\u0159\7n\2\2\u0159\u015a"+ + "\7w\2\2\u015a\u015b\7f\2\2\u015b\u015c\7g\2\2\u015c\30\3\2\2\2\u015d\u015e"+ + "\7\'\2\2\u015e\u015f\7c\2\2\u015f\u0160\7u\2\2\u0160\u0161\7o\2\2\u0161"+ + "\u0162\7d\2\2\u0162\u0163\7k\2\2\u0163\u0164\7p\2\2\u0164\u0165\7c\2\2"+ + "\u0165\u0166\7t\2\2\u0166\u0167\7{\2\2\u0167\32\3\2\2\2\u0168\u0169\7"+ + "\'\2\2\u0169\u016a\7q\2\2\u016a\u016b\7r\2\2\u016b\u016c\7v\2\2\u016c"+ + "\u016d\7k\2\2\u016d\u016e\7q\2\2\u016e\u016f\7p\2\2\u016f\34\3\2\2\2\u0170"+ + "\u0171\7.\2\2\u0171\36\3\2\2\2\u0172\u0173\7?\2\2\u0173 \3\2\2\2\u0174"+ + "\u0175\7e\2\2\u0175\u0176\7q\2\2\u0176\u0177\7p\2\2\u0177\u0178\7u\2\2"+ + "\u0178\u0179\7v\2\2\u0179\"\3\2\2\2\u017a\u017b\7o\2\2\u017b\u017c\7g"+ + "\2\2\u017c\u017d\7o\2\2\u017d\u017e\7q\2\2\u017e\u017f\7t\2\2\u017f\u0180"+ + "\7{\2\2\u0180$\3\2\2\2\u0181\u0182\7w\2\2\u0182\u0183\7d\2\2\u0183\u0184"+ + "\7{\2\2\u0184\u0185\7v\2\2\u0185\u0186\7g\2\2\u0186&\3\2\2\2\u0187\u0188"+ + "\7d\2\2\u0188\u0189\7{\2\2\u0189\u018a\7v\2\2\u018a\u018b\7g\2\2\u018b"+ + "(\3\2\2\2\u018c\u018d\7w\2\2\u018d\u018e\7y\2\2\u018e\u018f\7q\2\2\u018f"+ + "\u0190\7t\2\2\u0190\u0191\7f\2\2\u0191*\3\2\2\2\u0192\u0193\7y\2\2\u0193"+ + "\u0194\7q\2\2\u0194\u0195\7t\2\2\u0195\u0196\7f\2\2\u0196,\3\2\2\2\u0197"+ + "\u0198\7h\2\2\u0198\u0199\7n\2\2\u0199\u019a\7q\2\2\u019a\u019b\7c\2\2"+ + "\u019b\u019c\7v\2\2\u019c.\3\2\2\2\u019d\u019e\7u\2\2\u019e\u019f\7v\2"+ + "\2\u019f\u01a0\7t\2\2\u01a0\60\3\2\2\2\u01a1\u01a2\7u\2\2\u01a2\u01a3"+ + "\7v\2\2\u01a3\u01a4\7t\2\2\u01a4\u01a5\7a\2\2\u01a5\u01a6\7r\2\2\u01a6"+ + "\62\3\2\2\2\u01a7\u01a8\7u\2\2\u01a8\u01a9\7v\2\2\u01a9\u01aa\7t\2\2\u01aa"+ + "\u01ab\7a\2\2\u01ab\u01ac\7u\2\2\u01ac\64\3\2\2\2\u01ad\u01ae\7u\2\2\u01ae"+ + "\u01af\7v\2\2\u01af\u01b0\7t\2\2\u01b0\u01b1\7a\2\2\u01b1\u01b2\7r\2\2"+ + "\u01b2\u01b3\7u\2\2\u01b3\66\3\2\2\2\u01b4\u01b5\7]\2\2\u01b58\3\2\2\2"+ + "\u01b6\u01b7\7_\2\2\u01b7:\3\2\2\2\u01b8\u01b9\7-\2\2\u01b9\u01ba\7?\2"+ + "\2\u01ba<\3\2\2\2\u01bb\u01bc\7/\2\2\u01bc\u01bd\7?\2\2\u01bd>\3\2\2\2"+ + "\u01be\u01bf\7\61\2\2\u01bf\u01c0\7?\2\2\u01c0@\3\2\2\2\u01c1\u01c2\7"+ + "\61\2\2\u01c2\u01c3\7\61\2\2\u01c3\u01c4\7?\2\2\u01c4B\3\2\2\2\u01c5\u01c6"+ + "\7,\2\2\u01c6\u01c7\7?\2\2\u01c7D\3\2\2\2\u01c8\u01c9\7,\2\2\u01c9\u01ca"+ + "\7,\2\2\u01ca\u01cb\7?\2\2\u01cbF\3\2\2\2\u01cc\u01cd\7(\2\2\u01cd\u01ce"+ + "\7?\2\2\u01ceH\3\2\2\2\u01cf\u01d0\7~\2\2\u01d0\u01d1\7?\2\2\u01d1J\3"+ + "\2\2\2\u01d2\u01d3\7`\2\2\u01d3\u01d4\7?\2\2\u01d4L\3\2\2\2\u01d5\u01d6"+ + "\7\'\2\2\u01d6\u01d7\7?\2\2\u01d7N\3\2\2\2\u01d8\u01d9\7>\2\2\u01d9\u01da"+ + "\7>\2\2\u01da\u01db\7?\2\2\u01dbP\3\2\2\2\u01dc\u01dd\7@\2\2\u01dd\u01de"+ + "\7@\2\2\u01de\u01df\7?\2\2\u01dfR\3\2\2\2\u01e0\u01e1\7-\2\2\u01e1\u01e2"+ + "\7-\2\2\u01e2T\3\2\2\2\u01e3\u01e4\7/\2\2\u01e4\u01e5\7/\2\2\u01e5V\3"+ + "\2\2\2\u01e6\u01e7\7-\2\2\u01e7X\3\2\2\2\u01e8\u01e9\7/\2\2\u01e9Z\3\2"+ + "\2\2\u01ea\u01eb\7,\2\2\u01eb\u01ec\7,\2\2\u01ec\\\3\2\2\2\u01ed\u01ee"+ + "\7,\2\2\u01ee^\3\2\2\2\u01ef\u01f0\7\61\2\2\u01f0`\3\2\2\2\u01f1\u01f2"+ + "\7\61\2\2\u01f2\u01f3\7\61\2\2\u01f3b\3\2\2\2\u01f4\u01f5\7\'\2\2\u01f5"+ + "d\3\2\2\2\u01f6\u01f7\7>\2\2\u01f7\u01f8\7>\2\2\u01f8f\3\2\2\2\u01f9\u01fa"+ + "\7@\2\2\u01fa\u01fb\7@\2\2\u01fbh\3\2\2\2\u01fc\u01fd\7>\2\2\u01fdj\3"+ + "\2\2\2\u01fe\u01ff\7@\2\2\u01ffl\3\2\2\2\u0200\u0201\7>\2\2\u0201\u0202"+ + "\7?\2\2\u0202n\3\2\2\2\u0203\u0204\7@\2\2\u0204\u0205\7?\2\2\u0205p\3"+ + "\2\2\2\u0206\u0207\7?\2\2\u0207\u0208\7?\2\2\u0208r\3\2\2\2\u0209\u020a"+ + "\7#\2\2\u020a\u020b\7?\2\2\u020bt\3\2\2\2\u020c\u020d\7(\2\2\u020dv\3"+ + "\2\2\2\u020e\u020f\7`\2\2\u020fx\3\2\2\2\u0210\u0211\7~\2\2\u0211z\3\2"+ + "\2\2\u0212\u0213\7v\2\2\u0213\u0214\7q\2\2\u0214|\3\2\2\2\u0215\u0216"+ + "\7u\2\2\u0216\u0217\7v\2\2\u0217\u0218\7g\2\2\u0218\u0219\7r\2\2\u0219"+ + "~\3\2\2\2\u021a\u021b\7c\2\2\u021b\u021c\7p\2\2\u021c\u021d\7f\2\2\u021d"+ + "\u0080\3\2\2\2\u021e\u021f\7q\2\2\u021f\u0220\7t\2\2\u0220\u0082\3\2\2"+ + "\2\u0221\u0222\7z\2\2\u0222\u0223\7q\2\2\u0223\u0224\7t\2\2\u0224\u0084"+ + "\3\2\2\2\u0225\u0226\7p\2\2\u0226\u0227\7q\2\2\u0227\u0228\7v\2\2\u0228"+ + "\u0086\3\2\2\2\u0229\u022a\7*\2\2\u022a\u0088\3\2\2\2\u022b\u022c\7+\2"+ + "\2\u022c\u008a\3\2\2\2\u022d\u022e\7c\2\2\u022e\u022f\7u\2\2\u022f\u008c"+ + "\3\2\2\2\u0230\u0231\7B\2\2\u0231\u008e\3\2\2\2\u0232\u0233\7t\2\2\u0233"+ + "\u0234\7g\2\2\u0234\u0235\7v\2\2\u0235\u0236\7w\2\2\u0236\u0237\7t\2\2"+ + "\u0237\u0238\7p\2\2\u0238\u0090\3\2\2\2\u0239\u023a\7d\2\2\u023a\u023b"+ + "\7t\2\2\u023b\u023c\7g\2\2\u023c\u023d\7c\2\2\u023d\u023e\7m\2\2\u023e"+ + "\u0092\3\2\2\2\u023f\u0240\7e\2\2\u0240\u0241\7q\2\2\u0241\u0242\7p\2"+ + "\2\u0242\u0243\7v\2\2\u0243\u0244\7k\2\2\u0244\u0245\7p\2\2\u0245\u0246"+ + "\7w\2\2\u0246\u0247\7g\2\2\u0247\u0094\3\2\2\2\u0248\u0249\7\60\2\2\u0249"+ + "\u0096\3\2\2\2\u024a\u024b\7C\2\2\u024b\u0098\3\2\2\2\u024c\u024d\7Z\2"+ + "\2\u024d\u009a\3\2\2\2\u024e\u024f\7[\2\2\u024f\u009c\3\2\2\2\u0250\u0251"+ + "\7C\2\2\u0251\u0252\7Z\2\2\u0252\u009e\3\2\2\2\u0253\u0254\7C\2\2\u0254"+ + "\u0255\7[\2\2\u0255\u00a0\3\2\2\2\u0256\u0257\7Z\2\2\u0257\u0258\7[\2"+ + "\2\u0258\u00a2\3\2\2\2\u0259\u025a\7R\2\2\u025a\u025b\7e\2\2\u025b\u00a4"+ + "\3\2\2\2\u025c\u025d\7R\2\2\u025d\u025e\7|\2\2\u025e\u00a6\3\2\2\2\u025f"+ + "\u0260\7R\2\2\u0260\u0261\7p\2\2\u0261\u00a8\3\2\2\2\u0262\u0263\7R\2"+ + "\2\u0263\u0264\7x\2\2\u0264\u00aa\3\2\2\2\u0265\u0266\7\60\2\2\u0266\u0267"+ + "\7y\2\2\u0267\u00ac\3\2\2\2\u0268\u0269\7v\2\2\u0269\u026a\7t\2\2\u026a"+ + "\u026b\7w\2\2\u026b\u026c\7g\2\2\u026c\u00ae\3\2\2\2\u026d\u026e\7h\2"+ + "\2\u026e\u026f\7c\2\2\u026f\u0270\7n\2\2\u0270\u0271\7u\2\2\u0271\u0272"+ + "\7g\2\2\u0272\u00b0\3\2\2\2\u0273\u0274\7\'\2\2\u0274\u0275\7c\2\2\u0275"+ + "\u0276\7u\2\2\u0276\u0277\7o\2\2\u0277\u00b2\3\2\2\2\u0278\u0279\7u\2"+ + "\2\u0279\u027a\7w\2\2\u027a\u027b\7d\2\2\u027b\u00b4\3\2\2\2\u027c\u027d"+ + "\7/\2\2\u027d\u027e\7@\2\2\u027e\u00b6\3\2\2\2\u027f\u0280\7}\2\2\u0280"+ + "\u00b8\3\2\2\2\u0281\u0282\7\177\2\2\u0282\u00ba\3\2\2\2\u0283\u0284\7"+ + "c\2\2\u0284\u0285\7u\2\2\u0285\u0286\7o\2\2\u0286\u0287\7u\2\2\u0287\u0288"+ + "\7w\2\2\u0288\u0289\7d\2\2\u0289\u00bc\3\2\2\2\u028a\u028b\7e\2\2\u028b"+ + "\u028c\7n\2\2\u028c\u028d\7q\2\2\u028d\u028e\7d\2\2\u028e\u028f\7d\2\2"+ + "\u028f\u0290\7g\2\2\u0290\u0291\7t\2\2\u0291\u0292\7u\2\2\u0292\u00be"+ + "\3\2\2\2\u0293\u0294\7u\2\2\u0294\u0295\7v\2\2\u0295\u0296\7c\2\2\u0296"+ + "\u0297\7e\2\2\u0297\u0298\7m\2\2\u0298\u00c0\3\2\2\2\u0299\u029a\7k\2"+ + "\2\u029a\u029b\7h\2\2\u029b\u00c2\3\2\2\2\u029c\u029d\7g\2\2\u029d\u029e"+ + "\7n\2\2\u029e\u029f\7u\2\2\u029f\u02a0\7g\2\2\u02a0\u00c4\3\2\2\2\u02a1"+ + "\u02a2\7k\2\2\u02a2\u02a3\7h\2\2\u02a3\u02a4\7a\2\2\u02a4\u02a5\7e\2\2"+ + "\u02a5\u02a6\7u\2\2\u02a6\u00c6\3\2\2\2\u02a7\u02a8\7k\2\2\u02a8\u02a9"+ + "\7h\2\2\u02a9\u02aa\7a\2\2\u02aa\u02ab\7e\2\2\u02ab\u02ac\7e\2\2\u02ac"+ + "\u00c8\3\2\2\2\u02ad\u02ae\7k\2\2\u02ae\u02af\7h\2\2\u02af\u02b0\7a\2"+ + "\2\u02b0\u02b1\7g\2\2\u02b1\u02b2\7s\2\2\u02b2\u00ca\3\2\2\2\u02b3\u02b4"+ + "\7k\2\2\u02b4\u02b5\7h\2\2\u02b5\u02b6\7a\2\2\u02b6\u02b7\7|\2\2\u02b7"+ + "\u00cc\3\2\2\2\u02b8\u02b9\7k\2\2\u02b9\u02ba\7h\2\2\u02ba\u02bb\7a\2"+ + "\2\u02bb\u02bc\7p\2\2\u02bc\u02bd\7g\2\2\u02bd\u00ce\3\2\2\2\u02be\u02bf"+ + "\7k\2\2\u02bf\u02c0\7h\2\2\u02c0\u02c1\7a\2\2\u02c1\u02c2\7p\2\2\u02c2"+ + "\u02c3\7|\2\2\u02c3\u00d0\3\2\2\2\u02c4\u02c5\7k\2\2\u02c5\u02c6\7h\2"+ + "\2\u02c6\u02c7\7a\2\2\u02c7\u02c8\7r\2\2\u02c8\u02c9\7n\2\2\u02c9\u00d2"+ + "\3\2\2\2\u02ca\u02cb\7k\2\2\u02cb\u02cc\7h\2\2\u02cc\u02cd\7a\2\2\u02cd"+ + "\u02ce\7r\2\2\u02ce\u02cf\7q\2\2\u02cf\u02d0\7u\2\2\u02d0\u00d4\3\2\2"+ + "\2\u02d1\u02d2\7k\2\2\u02d2\u02d3\7h\2\2\u02d3\u02d4\7a\2\2\u02d4\u02d5"+ + "\7o\2\2\u02d5\u02d6\7k\2\2\u02d6\u00d6\3\2\2\2\u02d7\u02d8\7k\2\2\u02d8"+ + "\u02d9\7h\2\2\u02d9\u02da\7a\2\2\u02da\u02db\7p\2\2\u02db\u02dc\7g\2\2"+ + "\u02dc\u02dd\7i\2\2\u02dd\u00d8\3\2\2\2\u02de\u02df\7k\2\2\u02df\u02e0"+ + "\7h\2\2\u02e0\u02e1\7a\2\2\u02e1\u02e2\7x\2\2\u02e2\u02e3\7u\2\2\u02e3"+ + "\u00da\3\2\2\2\u02e4\u02e5\7k\2\2\u02e5\u02e6\7h\2\2\u02e6\u02e7\7a\2"+ + "\2\u02e7\u02e8\7x\2\2\u02e8\u02e9\7e\2\2\u02e9\u00dc\3\2\2\2\u02ea\u02eb"+ + "\7h\2\2\u02eb\u02ec\7q\2\2\u02ec\u02ed\7t\2\2\u02ed\u00de\3\2\2\2\u02ee"+ + "\u02ef\7k\2\2\u02ef\u02f0\7p\2\2\u02f0\u00e0\3\2\2\2\u02f1\u02f2\7y\2"+ + "\2\u02f2\u02f3\7j\2\2\u02f3\u02f4\7k\2\2\u02f4\u02f5\7n\2\2\u02f5\u02f6"+ + "\7g\2\2\u02f6\u00e2\3\2\2\2\u02f7\u02f8\7t\2\2\u02f8\u02f9\7g\2\2\u02f9"+ + "\u02fa\7r\2\2\u02fa\u02fb\7g\2\2\u02fb\u02fc\7c\2\2\u02fc\u02fd\7v\2\2"+ + "\u02fd\u00e4\3\2\2\2\u02fe\u02ff\7w\2\2\u02ff\u0300\7p\2\2\u0300\u0301"+ + "\7v\2\2\u0301\u0302\7k\2\2\u0302\u0303\7n\2\2\u0303\u00e6\3\2\2\2\u0304"+ + "\u0308\t\2\2\2\u0305\u0307\t\3\2\2\u0306\u0305\3\2\2\2\u0307\u030a\3\2"+ + "\2\2\u0308\u0306\3\2\2\2\u0308\u0309\3\2\2\2\u0309\u030b\3\2\2\2\u030a"+ + "\u0308\3\2\2\2\u030b\u030c\5\u00e9u\2\u030c\u030d\3\2\2\2\u030d\u030e"+ + "\bt\2\2\u030e\u00e8\3\2\2\2\u030f\u0313\7=\2\2\u0310\u0312\n\2\2\2\u0311"+ + "\u0310\3\2\2\2\u0312\u0315\3\2\2\2\u0313\u0311\3\2\2\2\u0313\u0314\3\2"+ + "\2\2\u0314\u0316\3\2\2\2\u0315\u0313\3\2\2\2\u0316\u0317\bu\2\2\u0317"+ + "\u00ea\3\2\2\2\u0318\u0319\t\3\2\2\u0319\u031a\3\2\2\2\u031a\u031b\bv"+ + "\3\2\u031b\u00ec\3\2\2\2\u031c\u031e\t\2\2\2\u031d\u031c\3\2\2\2\u031e"+ + "\u031f\3\2\2\2\u031f\u031d\3\2\2\2\u031f\u0320\3\2\2\2\u0320\u00ee\3\2"+ + "\2\2\u0321\u0325\t\4\2\2\u0322\u0324\t\5\2\2\u0323\u0322\3\2\2\2\u0324"+ + "\u0327\3\2\2\2\u0325\u0323\3\2\2\2\u0325\u0326\3\2\2\2\u0326\u00f0\3\2"+ + "\2\2\u0327\u0325\3\2\2\2\u0328\u0330\4\62;\2\u0329\u032b\4\63;\2\u032a"+ + "\u032c\4\62;\2\u032b\u032a\3\2\2\2\u032c\u032d\3\2\2\2\u032d\u032b\3\2"+ + "\2\2\u032d\u032e\3\2\2\2\u032e\u0330\3\2\2\2\u032f\u0328\3\2\2\2\u032f"+ + "\u0329\3\2\2\2\u0330\u00f2\3\2\2\2\u0331\u0333\7&\2\2\u0332\u0334\t\6"+ + "\2\2\u0333\u0332\3\2\2\2\u0334\u0335\3\2\2\2\u0335\u0333\3\2\2\2\u0335"+ + "\u0336\3\2\2\2\u0336\u00f4\3\2\2\2\u0337\u0339\7\'\2\2\u0338\u033a\4\62"+ + "\63\2\u0339\u0338\3\2\2\2\u033a\u033b\3\2\2\2\u033b\u0339\3\2\2\2\u033b"+ + "\u033c\3\2\2\2\u033c\u00f6\3\2\2\2\u033d\u0343\5\u00f9}\2\u033e\u0340"+ + "\t\7\2\2\u033f\u0341\t\b\2\2\u0340\u033f\3\2\2\2\u0340\u0341\3\2\2\2\u0341"+ + "\u0342\3\2\2\2\u0342\u0344\5\u00f9}\2\u0343\u033e\3\2\2\2\u0343\u0344"+ + "\3\2\2\2\u0344\u00f8\3\2\2\2\u0345\u0347\4\62;\2\u0346\u0345\3\2\2\2\u0347"+ + "\u0348\3\2\2\2\u0348\u0346\3\2\2\2\u0348\u0349\3\2\2\2\u0349\u0350\3\2"+ + "\2\2\u034a\u034c\7\60\2\2\u034b\u034d\4\62;\2\u034c\u034b\3\2\2\2\u034d"+ + "\u034e\3\2\2\2\u034e\u034c\3\2\2\2\u034e\u034f\3\2\2\2\u034f\u0351\3\2"+ + "\2\2\u0350\u034a\3\2\2\2\u0350\u0351\3\2\2\2\u0351\u00fa\3\2\2\2\u0352"+ + "\u0353\7^\2\2\u0353\u0357\13\2\2\2\u0354\u0355\7^\2\2\u0355\u0357\5\u00ed"+ + "w\2\u0356\u0352\3\2\2\2\u0356\u0354\3\2\2\2\u0357\u00fc\3\2\2\2\u0358"+ + "\u035d\7$\2\2\u0359\u035c\5\u00fb~\2\u035a\u035c\n\t\2\2\u035b\u0359\3"+ + "\2\2\2\u035b\u035a\3\2\2\2\u035c\u035f\3\2\2\2\u035d\u035b\3\2\2\2\u035d"+ + "\u035e\3\2\2\2\u035e\u0360\3\2\2\2\u035f\u035d\3\2\2\2\u0360\u0361\7$"+ + "\2\2\u0361\u0362\b\177\4\2\u0362\u00fe\3\2\2\2\u0363\u0364\7}\2\2\u0364"+ + "\u0365\7}\2\2\u0365\u0367\3\2\2\2\u0366\u0368\13\2\2\2\u0367\u0366\3\2"+ + "\2\2\u0368\u0369\3\2\2\2\u0369\u036a\3\2\2\2\u0369\u0367\3\2\2\2\u036a"+ + "\u036b\3\2\2\2\u036b\u036c\7\177\2\2\u036c\u036d\7\177\2\2\u036d\u036e"+ + "\3\2\2\2\u036e\u036f\b\u0080\5\2\u036f\u0100\3\2\2\2\u0370\u0373\7)\2"+ + "\2\u0371\u0374\5\u00fb~\2\u0372\u0374\n\t\2\2\u0373\u0371\3\2\2\2\u0373"+ + "\u0372\3\2\2\2\u0374\u0375\3\2\2\2\u0375\u0376\7)\2\2\u0376\u0377\b\u0081"+ + "\6\2\u0377\u0102\3\2\2\2\26\2\u0308\u0313\u031f\u0325\u032d\u032f\u0333"+ + "\u0335\u033b\u0340\u0343\u0348\u034e\u0350\u0356\u035b\u035d\u0369\u0373"+ + "\7\2\3\2\b\2\2\3\177\2\3\u0080\3\3\u0081\4"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/compiler/src/prog8/parser/prog8Parser.java b/compiler/src/prog8/parser/prog8Parser.java index b6cbc0bbe..639bfd022 100644 --- a/compiler/src/prog8/parser/prog8Parser.java +++ b/compiler/src/prog8/parser/prog8Parser.java @@ -32,9 +32,10 @@ public class prog8Parser extends Parser { T__87=88, T__88=89, T__89=90, T__90=91, T__91=92, T__92=93, T__93=94, T__94=95, T__95=96, T__96=97, T__97=98, T__98=99, T__99=100, T__100=101, T__101=102, T__102=103, T__103=104, T__104=105, T__105=106, T__106=107, - T__107=108, T__108=109, T__109=110, LINECOMMENT=111, COMMENT=112, WS=113, - EOL=114, NAME=115, DEC_INTEGER=116, HEX_INTEGER=117, BIN_INTEGER=118, - FLOAT_NUMBER=119, STRING=120, INLINEASMBLOCK=121, SINGLECHAR=122; + T__107=108, T__108=109, T__109=110, T__110=111, T__111=112, T__112=113, + T__113=114, LINECOMMENT=115, COMMENT=116, WS=117, EOL=118, NAME=119, DEC_INTEGER=120, + HEX_INTEGER=121, BIN_INTEGER=122, FLOAT_NUMBER=123, STRING=124, INLINEASMBLOCK=125, + SINGLECHAR=126; public static final int RULE_module = 0, RULE_modulestatement = 1, RULE_block = 2, RULE_statement = 3, RULE_labeldef = 4, RULE_unconditionaljump = 5, RULE_directive = 6, RULE_directivearg = 7, @@ -80,16 +81,16 @@ public class prog8Parser extends Parser { "'%asmbinary'", "'%option'", "','", "'='", "'const'", "'memory'", "'ubyte'", "'byte'", "'uword'", "'word'", "'float'", "'str'", "'str_p'", "'str_s'", "'str_ps'", "'['", "']'", "'+='", "'-='", "'/='", "'//='", "'*='", "'**='", - "'&='", "'|='", "'^='", "'%='", "'++'", "'--'", "'+'", "'-'", "'**'", - "'*'", "'/'", "'//'", "'%'", "'<'", "'>'", "'<='", "'>='", "'=='", "'!='", - "'&'", "'^'", "'|'", "'to'", "'step'", "'and'", "'or'", "'xor'", "'not'", - "'('", "')'", "'as'", "'@'", "'return'", "'break'", "'continue'", "'.'", - "'A'", "'X'", "'Y'", "'AX'", "'AY'", "'XY'", "'Pc'", "'Pz'", "'Pn'", - "'Pv'", "'.w'", "'true'", "'false'", "'%asm'", "'sub'", "'->'", "'{'", - "'}'", "'asmsub'", "'clobbers'", "'stack'", "'if'", "'else'", "'if_cs'", - "'if_cc'", "'if_eq'", "'if_z'", "'if_ne'", "'if_nz'", "'if_pl'", "'if_pos'", - "'if_mi'", "'if_neg'", "'if_vs'", "'if_vc'", "'for'", "'in'", "'while'", - "'repeat'", "'until'" + "'&='", "'|='", "'^='", "'%='", "'<<='", "'>>='", "'++'", "'--'", "'+'", + "'-'", "'**'", "'*'", "'/'", "'//'", "'%'", "'<<'", "'>>'", "'<'", "'>'", + "'<='", "'>='", "'=='", "'!='", "'&'", "'^'", "'|'", "'to'", "'step'", + "'and'", "'or'", "'xor'", "'not'", "'('", "')'", "'as'", "'@'", "'return'", + "'break'", "'continue'", "'.'", "'A'", "'X'", "'Y'", "'AX'", "'AY'", + "'XY'", "'Pc'", "'Pz'", "'Pn'", "'Pv'", "'.w'", "'true'", "'false'", + "'%asm'", "'sub'", "'->'", "'{'", "'}'", "'asmsub'", "'clobbers'", "'stack'", + "'if'", "'else'", "'if_cs'", "'if_cc'", "'if_eq'", "'if_z'", "'if_ne'", + "'if_nz'", "'if_pl'", "'if_pos'", "'if_mi'", "'if_neg'", "'if_vs'", "'if_vc'", + "'for'", "'in'", "'while'", "'repeat'", "'until'" }; } private static final String[] _LITERAL_NAMES = makeLiteralNames(); @@ -104,9 +105,9 @@ public class prog8Parser extends Parser { null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, "LINECOMMENT", "COMMENT", "WS", "EOL", "NAME", "DEC_INTEGER", - "HEX_INTEGER", "BIN_INTEGER", "FLOAT_NUMBER", "STRING", "INLINEASMBLOCK", - "SINGLECHAR" + null, null, null, null, null, null, null, "LINECOMMENT", "COMMENT", "WS", + "EOL", "NAME", "DEC_INTEGER", "HEX_INTEGER", "BIN_INTEGER", "FLOAT_NUMBER", + "STRING", "INLINEASMBLOCK", "SINGLECHAR" }; } private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); @@ -327,7 +328,7 @@ public class prog8Parser extends Parser { setState(140); _errHandler.sync(this); _la = _input.LA(1); - if (((((_la - 116)) & ~0x3f) == 0 && ((1L << (_la - 116)) & ((1L << (DEC_INTEGER - 116)) | (1L << (HEX_INTEGER - 116)) | (1L << (BIN_INTEGER - 116)))) != 0)) { + if (((((_la - 120)) & ~0x3f) == 0 && ((1L << (_la - 120)) & ((1L << (DEC_INTEGER - 120)) | (1L << (HEX_INTEGER - 120)) | (1L << (BIN_INTEGER - 120)))) != 0)) { { setState(139); integerliteral(); @@ -1191,7 +1192,7 @@ public class prog8Parser extends Parser { setState(235); ((AugassignmentContext)_localctx).operator = _input.LT(1); _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__28) | (1L << T__29) | (1L << T__30) | (1L << T__31) | (1L << T__32) | (1L << T__33) | (1L << T__34) | (1L << T__35) | (1L << T__36) | (1L << T__37))) != 0)) ) { + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__28) | (1L << T__29) | (1L << T__30) | (1L << T__31) | (1L << T__32) | (1L << T__33) | (1L << T__34) | (1L << T__35) | (1L << T__36) | (1L << T__37) | (1L << T__38) | (1L << T__39))) != 0)) ) { ((AugassignmentContext)_localctx).operator = (Token)_errHandler.recoverInline(this); } else { @@ -1304,7 +1305,7 @@ public class prog8Parser extends Parser { setState(245); ((PostincrdecrContext)_localctx).operator = _input.LT(1); _la = _input.LA(1); - if ( !(_la==T__38 || _la==T__39) ) { + if ( !(_la==T__40 || _la==T__41) ) { ((PostincrdecrContext)_localctx).operator = (Token)_errHandler.recoverInline(this); } else { @@ -1396,7 +1397,7 @@ public class prog8Parser extends Parser { setState(249); ((ExpressionContext)_localctx).prefix = _input.LT(1); _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << T__40) | (1L << T__41))) != 0)) ) { + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << T__42) | (1L << T__43))) != 0)) ) { ((ExpressionContext)_localctx).prefix = (Token)_errHandler.recoverInline(this); } else { @@ -1405,13 +1406,13 @@ public class prog8Parser extends Parser { consume(); } setState(250); - expression(21); + expression(22); } break; case 3: { setState(251); - ((ExpressionContext)_localctx).prefix = match(T__61); + ((ExpressionContext)_localctx).prefix = match(T__65); setState(252); expression(8); } @@ -1449,16 +1450,16 @@ public class prog8Parser extends Parser { case 9: { setState(258); - match(T__62); + match(T__66); setState(259); expression(0); setState(260); - match(T__63); + match(T__67); } break; } _ctx.stop = _input.LT(-1); - setState(308); + setState(311); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,17,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { @@ -1466,7 +1467,7 @@ public class prog8Parser extends Parser { if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(306); + setState(309); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,16,_ctx) ) { case 1: @@ -1476,11 +1477,11 @@ public class prog8Parser extends Parser { _localctx.left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); setState(264); - if (!(precpred(_ctx, 20))) throw new FailedPredicateException(this, "precpred(_ctx, 20)"); + if (!(precpred(_ctx, 21))) throw new FailedPredicateException(this, "precpred(_ctx, 21)"); setState(265); - ((ExpressionContext)_localctx).bop = match(T__42); + ((ExpressionContext)_localctx).bop = match(T__44); setState(266); - ((ExpressionContext)_localctx).right = expression(21); + ((ExpressionContext)_localctx).right = expression(22); } break; case 2: @@ -1490,11 +1491,11 @@ public class prog8Parser extends Parser { _localctx.left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); setState(267); - if (!(precpred(_ctx, 19))) throw new FailedPredicateException(this, "precpred(_ctx, 19)"); + if (!(precpred(_ctx, 20))) throw new FailedPredicateException(this, "precpred(_ctx, 20)"); setState(268); ((ExpressionContext)_localctx).bop = _input.LT(1); _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__43) | (1L << T__44) | (1L << T__45) | (1L << T__46))) != 0)) ) { + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__45) | (1L << T__46) | (1L << T__47) | (1L << T__48))) != 0)) ) { ((ExpressionContext)_localctx).bop = (Token)_errHandler.recoverInline(this); } else { @@ -1503,7 +1504,7 @@ public class prog8Parser extends Parser { consume(); } setState(269); - ((ExpressionContext)_localctx).right = expression(20); + ((ExpressionContext)_localctx).right = expression(21); } break; case 3: @@ -1513,11 +1514,11 @@ public class prog8Parser extends Parser { _localctx.left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); setState(270); - if (!(precpred(_ctx, 18))) throw new FailedPredicateException(this, "precpred(_ctx, 18)"); + if (!(precpred(_ctx, 19))) throw new FailedPredicateException(this, "precpred(_ctx, 19)"); setState(271); ((ExpressionContext)_localctx).bop = _input.LT(1); _la = _input.LA(1); - if ( !(_la==T__40 || _la==T__41) ) { + if ( !(_la==T__42 || _la==T__43) ) { ((ExpressionContext)_localctx).bop = (Token)_errHandler.recoverInline(this); } else { @@ -1526,7 +1527,7 @@ public class prog8Parser extends Parser { consume(); } setState(272); - ((ExpressionContext)_localctx).right = expression(19); + ((ExpressionContext)_localctx).right = expression(20); } break; case 4: @@ -1536,11 +1537,11 @@ public class prog8Parser extends Parser { _localctx.left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); setState(273); - if (!(precpred(_ctx, 17))) throw new FailedPredicateException(this, "precpred(_ctx, 17)"); + if (!(precpred(_ctx, 18))) throw new FailedPredicateException(this, "precpred(_ctx, 18)"); setState(274); ((ExpressionContext)_localctx).bop = _input.LT(1); _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__47) | (1L << T__48) | (1L << T__49) | (1L << T__50))) != 0)) ) { + if ( !(_la==T__49 || _la==T__50) ) { ((ExpressionContext)_localctx).bop = (Token)_errHandler.recoverInline(this); } else { @@ -1549,7 +1550,7 @@ public class prog8Parser extends Parser { consume(); } setState(275); - ((ExpressionContext)_localctx).right = expression(18); + ((ExpressionContext)_localctx).right = expression(19); } break; case 5: @@ -1559,11 +1560,11 @@ public class prog8Parser extends Parser { _localctx.left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); setState(276); - if (!(precpred(_ctx, 16))) throw new FailedPredicateException(this, "precpred(_ctx, 16)"); + if (!(precpred(_ctx, 17))) throw new FailedPredicateException(this, "precpred(_ctx, 17)"); setState(277); ((ExpressionContext)_localctx).bop = _input.LT(1); _la = _input.LA(1); - if ( !(_la==T__51 || _la==T__52) ) { + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__51) | (1L << T__52) | (1L << T__53) | (1L << T__54))) != 0)) ) { ((ExpressionContext)_localctx).bop = (Token)_errHandler.recoverInline(this); } else { @@ -1572,7 +1573,7 @@ public class prog8Parser extends Parser { consume(); } setState(278); - ((ExpressionContext)_localctx).right = expression(17); + ((ExpressionContext)_localctx).right = expression(18); } break; case 6: @@ -1582,11 +1583,20 @@ public class prog8Parser extends Parser { _localctx.left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); setState(279); - if (!(precpred(_ctx, 15))) throw new FailedPredicateException(this, "precpred(_ctx, 15)"); + if (!(precpred(_ctx, 16))) throw new FailedPredicateException(this, "precpred(_ctx, 16)"); setState(280); - ((ExpressionContext)_localctx).bop = match(T__53); + ((ExpressionContext)_localctx).bop = _input.LT(1); + _la = _input.LA(1); + if ( !(_la==T__55 || _la==T__56) ) { + ((ExpressionContext)_localctx).bop = (Token)_errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } setState(281); - ((ExpressionContext)_localctx).right = expression(16); + ((ExpressionContext)_localctx).right = expression(17); } break; case 7: @@ -1596,11 +1606,11 @@ public class prog8Parser extends Parser { _localctx.left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); setState(282); - if (!(precpred(_ctx, 14))) throw new FailedPredicateException(this, "precpred(_ctx, 14)"); + if (!(precpred(_ctx, 15))) throw new FailedPredicateException(this, "precpred(_ctx, 15)"); setState(283); - ((ExpressionContext)_localctx).bop = match(T__54); + ((ExpressionContext)_localctx).bop = match(T__57); setState(284); - ((ExpressionContext)_localctx).right = expression(15); + ((ExpressionContext)_localctx).right = expression(16); } break; case 8: @@ -1610,11 +1620,11 @@ public class prog8Parser extends Parser { _localctx.left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); setState(285); - if (!(precpred(_ctx, 13))) throw new FailedPredicateException(this, "precpred(_ctx, 13)"); + if (!(precpred(_ctx, 14))) throw new FailedPredicateException(this, "precpred(_ctx, 14)"); setState(286); - ((ExpressionContext)_localctx).bop = match(T__55); + ((ExpressionContext)_localctx).bop = match(T__58); setState(287); - ((ExpressionContext)_localctx).right = expression(14); + ((ExpressionContext)_localctx).right = expression(15); } break; case 9: @@ -1624,11 +1634,11 @@ public class prog8Parser extends Parser { _localctx.left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); setState(288); - if (!(precpred(_ctx, 11))) throw new FailedPredicateException(this, "precpred(_ctx, 11)"); + if (!(precpred(_ctx, 13))) throw new FailedPredicateException(this, "precpred(_ctx, 13)"); setState(289); - ((ExpressionContext)_localctx).bop = match(T__58); + ((ExpressionContext)_localctx).bop = match(T__59); setState(290); - ((ExpressionContext)_localctx).right = expression(12); + ((ExpressionContext)_localctx).right = expression(14); } break; case 10: @@ -1638,11 +1648,11 @@ public class prog8Parser extends Parser { _localctx.left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); setState(291); - if (!(precpred(_ctx, 10))) throw new FailedPredicateException(this, "precpred(_ctx, 10)"); + if (!(precpred(_ctx, 11))) throw new FailedPredicateException(this, "precpred(_ctx, 11)"); setState(292); - ((ExpressionContext)_localctx).bop = match(T__59); + ((ExpressionContext)_localctx).bop = match(T__62); setState(293); - ((ExpressionContext)_localctx).right = expression(11); + ((ExpressionContext)_localctx).right = expression(12); } break; case 11: @@ -1652,53 +1662,67 @@ public class prog8Parser extends Parser { _localctx.left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); setState(294); - if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)"); + if (!(precpred(_ctx, 10))) throw new FailedPredicateException(this, "precpred(_ctx, 10)"); setState(295); - ((ExpressionContext)_localctx).bop = match(T__60); + ((ExpressionContext)_localctx).bop = match(T__63); setState(296); - ((ExpressionContext)_localctx).right = expression(10); + ((ExpressionContext)_localctx).right = expression(11); } break; case 12: + { + _localctx = new ExpressionContext(_parentctx, _parentState); + _localctx.left = _prevctx; + _localctx.left = _prevctx; + pushNewRecursionContext(_localctx, _startState, RULE_expression); + setState(297); + if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)"); + setState(298); + ((ExpressionContext)_localctx).bop = match(T__64); + setState(299); + ((ExpressionContext)_localctx).right = expression(10); + } + break; + case 13: { _localctx = new ExpressionContext(_parentctx, _parentState); _localctx.rangefrom = _prevctx; _localctx.rangefrom = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(297); + setState(300); if (!(precpred(_ctx, 12))) throw new FailedPredicateException(this, "precpred(_ctx, 12)"); - setState(298); - match(T__56); - setState(299); - ((ExpressionContext)_localctx).rangeto = expression(0); + setState(301); + match(T__60); setState(302); + ((ExpressionContext)_localctx).rangeto = expression(0); + setState(305); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,15,_ctx) ) { case 1: { - setState(300); - match(T__57); - setState(301); + setState(303); + match(T__61); + setState(304); ((ExpressionContext)_localctx).rangestep = expression(0); } break; } } break; - case 13: + case 14: { _localctx = new ExpressionContext(_parentctx, _parentState); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(304); + setState(307); if (!(precpred(_ctx, 2))) throw new FailedPredicateException(this, "precpred(_ctx, 2)"); - setState(305); + setState(308); typecast(); } break; } } } - setState(310); + setState(313); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,17,_ctx); } @@ -1731,9 +1755,9 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(311); - match(T__64); - setState(312); + setState(314); + match(T__68); + setState(315); datatype(); } } @@ -1767,9 +1791,9 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(314); + setState(317); scoped_identifier(); - setState(315); + setState(318); arrayspec(); } } @@ -1800,14 +1824,14 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(317); - match(T__65); - setState(318); - match(T__62); - setState(319); - expression(0); setState(320); - match(T__63); + match(T__69); + setState(321); + match(T__66); + setState(322); + expression(0); + setState(323); + match(T__67); } } catch (RecognitionException re) { @@ -1841,22 +1865,22 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(322); - scoped_identifier(); - setState(323); - match(T__62); setState(325); + scoped_identifier(); + setState(326); + match(T__66); + setState(328); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << T__26) | (1L << T__40) | (1L << T__41) | (1L << T__61) | (1L << T__62))) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & ((1L << (T__65 - 66)) | (1L << (T__70 - 66)) | (1L << (T__71 - 66)) | (1L << (T__72 - 66)) | (1L << (T__81 - 66)) | (1L << (T__82 - 66)) | (1L << (NAME - 66)) | (1L << (DEC_INTEGER - 66)) | (1L << (HEX_INTEGER - 66)) | (1L << (BIN_INTEGER - 66)) | (1L << (FLOAT_NUMBER - 66)) | (1L << (STRING - 66)) | (1L << (SINGLECHAR - 66)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << T__26) | (1L << T__42) | (1L << T__43))) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & ((1L << (T__65 - 66)) | (1L << (T__66 - 66)) | (1L << (T__69 - 66)) | (1L << (T__74 - 66)) | (1L << (T__75 - 66)) | (1L << (T__76 - 66)) | (1L << (T__85 - 66)) | (1L << (T__86 - 66)) | (1L << (NAME - 66)) | (1L << (DEC_INTEGER - 66)) | (1L << (HEX_INTEGER - 66)) | (1L << (BIN_INTEGER - 66)) | (1L << (FLOAT_NUMBER - 66)) | (1L << (STRING - 66)) | (1L << (SINGLECHAR - 66)))) != 0)) { { - setState(324); + setState(327); expression_list(); } } - setState(327); - match(T__63); + setState(330); + match(T__67); } } catch (RecognitionException re) { @@ -1890,22 +1914,22 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(329); - scoped_identifier(); - setState(330); - match(T__62); setState(332); + scoped_identifier(); + setState(333); + match(T__66); + setState(335); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << T__26) | (1L << T__40) | (1L << T__41) | (1L << T__61) | (1L << T__62))) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & ((1L << (T__65 - 66)) | (1L << (T__70 - 66)) | (1L << (T__71 - 66)) | (1L << (T__72 - 66)) | (1L << (T__81 - 66)) | (1L << (T__82 - 66)) | (1L << (NAME - 66)) | (1L << (DEC_INTEGER - 66)) | (1L << (HEX_INTEGER - 66)) | (1L << (BIN_INTEGER - 66)) | (1L << (FLOAT_NUMBER - 66)) | (1L << (STRING - 66)) | (1L << (SINGLECHAR - 66)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << T__26) | (1L << T__42) | (1L << T__43))) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & ((1L << (T__65 - 66)) | (1L << (T__66 - 66)) | (1L << (T__69 - 66)) | (1L << (T__74 - 66)) | (1L << (T__75 - 66)) | (1L << (T__76 - 66)) | (1L << (T__85 - 66)) | (1L << (T__86 - 66)) | (1L << (NAME - 66)) | (1L << (DEC_INTEGER - 66)) | (1L << (HEX_INTEGER - 66)) | (1L << (BIN_INTEGER - 66)) | (1L << (FLOAT_NUMBER - 66)) | (1L << (STRING - 66)) | (1L << (SINGLECHAR - 66)))) != 0)) { { - setState(331); + setState(334); expression_list(); } } - setState(334); - match(T__63); + setState(337); + match(T__67); } } catch (RecognitionException re) { @@ -1943,31 +1967,31 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(336); + setState(339); expression(0); - setState(344); + setState(347); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__13) { { { - setState(337); + setState(340); match(T__13); - setState(339); + setState(342); _errHandler.sync(this); _la = _input.LA(1); if (_la==EOL) { { - setState(338); + setState(341); match(EOL); } } - setState(341); + setState(344); expression(0); } } - setState(346); + setState(349); _errHandler.sync(this); _la = _input.LA(1); } @@ -2000,14 +2024,14 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(347); - match(T__66); - setState(349); + setState(350); + match(T__70); + setState(352); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,22,_ctx) ) { case 1: { - setState(348); + setState(351); expression_list(); } break; @@ -2038,8 +2062,8 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(351); - match(T__67); + setState(354); + match(T__71); } } catch (RecognitionException re) { @@ -2066,8 +2090,8 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(353); - match(T__68); + setState(356); + match(T__72); } } catch (RecognitionException re) { @@ -2095,7 +2119,7 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(355); + setState(358); match(NAME); } } @@ -2128,23 +2152,23 @@ public class prog8Parser extends Parser { int _alt; enterOuterAlt(_localctx, 1); { - setState(357); + setState(360); match(NAME); - setState(362); + setState(365); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,23,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(358); - match(T__69); - setState(359); + setState(361); + match(T__73); + setState(362); match(NAME); } } } - setState(364); + setState(367); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,23,_ctx); } @@ -2175,9 +2199,9 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(365); + setState(368); _la = _input.LA(1); - if ( !(((((_la - 71)) & ~0x3f) == 0 && ((1L << (_la - 71)) & ((1L << (T__70 - 71)) | (1L << (T__71 - 71)) | (1L << (T__72 - 71)))) != 0)) ) { + if ( !(((((_la - 75)) & ~0x3f) == 0 && ((1L << (_la - 75)) & ((1L << (T__74 - 75)) | (1L << (T__75 - 75)) | (1L << (T__76 - 75)))) != 0)) ) { _errHandler.recoverInline(this); } else { @@ -2212,9 +2236,9 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(367); + setState(370); _la = _input.LA(1); - if ( !(((((_la - 71)) & ~0x3f) == 0 && ((1L << (_la - 71)) & ((1L << (T__70 - 71)) | (1L << (T__71 - 71)) | (1L << (T__72 - 71)) | (1L << (T__73 - 71)) | (1L << (T__74 - 71)) | (1L << (T__75 - 71)))) != 0)) ) { + if ( !(((((_la - 75)) & ~0x3f) == 0 && ((1L << (_la - 75)) & ((1L << (T__74 - 75)) | (1L << (T__75 - 75)) | (1L << (T__76 - 75)) | (1L << (T__77 - 75)) | (1L << (T__78 - 75)) | (1L << (T__79 - 75)))) != 0)) ) { _errHandler.recoverInline(this); } else { @@ -2249,9 +2273,9 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(369); + setState(372); _la = _input.LA(1); - if ( !(((((_la - 77)) & ~0x3f) == 0 && ((1L << (_la - 77)) & ((1L << (T__76 - 77)) | (1L << (T__77 - 77)) | (1L << (T__78 - 77)) | (1L << (T__79 - 77)))) != 0)) ) { + if ( !(((((_la - 81)) & ~0x3f) == 0 && ((1L << (_la - 81)) & ((1L << (T__80 - 81)) | (1L << (T__81 - 81)) | (1L << (T__82 - 81)) | (1L << (T__83 - 81)))) != 0)) ) { _errHandler.recoverInline(this); } else { @@ -2293,10 +2317,10 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(371); + setState(374); ((IntegerliteralContext)_localctx).intpart = _input.LT(1); _la = _input.LA(1); - if ( !(((((_la - 116)) & ~0x3f) == 0 && ((1L << (_la - 116)) & ((1L << (DEC_INTEGER - 116)) | (1L << (HEX_INTEGER - 116)) | (1L << (BIN_INTEGER - 116)))) != 0)) ) { + if ( !(((((_la - 120)) & ~0x3f) == 0 && ((1L << (_la - 120)) & ((1L << (DEC_INTEGER - 120)) | (1L << (HEX_INTEGER - 120)) | (1L << (BIN_INTEGER - 120)))) != 0)) ) { ((IntegerliteralContext)_localctx).intpart = (Token)_errHandler.recoverInline(this); } else { @@ -2304,12 +2328,12 @@ public class prog8Parser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(373); + setState(376); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,24,_ctx) ) { case 1: { - setState(372); + setState(375); wordsuffix(); } break; @@ -2340,8 +2364,8 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(375); - match(T__80); + setState(378); + match(T__84); } } catch (RecognitionException re) { @@ -2369,9 +2393,9 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(377); + setState(380); _la = _input.LA(1); - if ( !(_la==T__81 || _la==T__82) ) { + if ( !(_la==T__85 || _la==T__86) ) { _errHandler.recoverInline(this); } else { @@ -2416,57 +2440,57 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(379); + setState(382); match(T__26); - setState(381); + setState(384); _errHandler.sync(this); _la = _input.LA(1); if (_la==EOL) { { - setState(380); + setState(383); match(EOL); } } - setState(383); + setState(386); expression(0); - setState(391); + setState(394); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__13) { { { - setState(384); + setState(387); match(T__13); - setState(386); + setState(389); _errHandler.sync(this); _la = _input.LA(1); if (_la==EOL) { { - setState(385); + setState(388); match(EOL); } } - setState(388); + setState(391); expression(0); } } - setState(393); + setState(396); _errHandler.sync(this); _la = _input.LA(1); } - setState(395); + setState(398); _errHandler.sync(this); _la = _input.LA(1); if (_la==EOL) { { - setState(394); + setState(397); match(EOL); } } - setState(397); + setState(400); match(T__27); } } @@ -2495,7 +2519,7 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(399); + setState(402); match(STRING); } } @@ -2524,7 +2548,7 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(401); + setState(404); match(SINGLECHAR); } } @@ -2553,7 +2577,7 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(403); + setState(406); match(FLOAT_NUMBER); } } @@ -2597,7 +2621,7 @@ public class prog8Parser extends Parser { LiteralvalueContext _localctx = new LiteralvalueContext(_ctx, getState()); enterRule(_localctx, 82, RULE_literalvalue); try { - setState(411); + setState(414); _errHandler.sync(this); switch (_input.LA(1)) { case DEC_INTEGER: @@ -2605,43 +2629,43 @@ public class prog8Parser extends Parser { case BIN_INTEGER: enterOuterAlt(_localctx, 1); { - setState(405); + setState(408); integerliteral(); } break; - case T__81: - case T__82: + case T__85: + case T__86: enterOuterAlt(_localctx, 2); { - setState(406); + setState(409); booleanliteral(); } break; case T__26: enterOuterAlt(_localctx, 3); { - setState(407); + setState(410); arrayliteral(); } break; case STRING: enterOuterAlt(_localctx, 4); { - setState(408); + setState(411); stringliteral(); } break; case SINGLECHAR: enterOuterAlt(_localctx, 5); { - setState(409); + setState(412); charliteral(); } break; case FLOAT_NUMBER: enterOuterAlt(_localctx, 6); { - setState(410); + setState(413); floatliteral(); } break; @@ -2674,9 +2698,9 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(413); - match(T__83); - setState(414); + setState(416); + match(T__87); + setState(417); match(INLINEASMBLOCK); } } @@ -2718,38 +2742,38 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(416); - match(T__84); - setState(417); - identifier(); - setState(418); - match(T__62); + setState(419); + match(T__88); setState(420); + identifier(); + setState(421); + match(T__66); + setState(423); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__17) | (1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23) | (1L << T__24) | (1L << T__25))) != 0)) { { - setState(419); + setState(422); sub_params(); } } - setState(422); - match(T__63); - setState(424); + setState(425); + match(T__67); + setState(427); _errHandler.sync(this); _la = _input.LA(1); - if (_la==T__85) { + if (_la==T__89) { { - setState(423); + setState(426); sub_return_part(); } } { - setState(426); + setState(429); statement_block(); - setState(427); + setState(430); match(EOL); } } @@ -2781,9 +2805,9 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(429); - match(T__85); - setState(430); + setState(432); + match(T__89); + setState(433); sub_returns(); } } @@ -2822,16 +2846,16 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(432); - match(T__86); - setState(433); + setState(435); + match(T__90); + setState(436); match(EOL); - setState(438); + setState(441); _errHandler.sync(this); _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__2) | (1L << T__3) | (1L << T__4) | (1L << T__5) | (1L << T__6) | (1L << T__7) | (1L << T__8) | (1L << T__9) | (1L << T__10) | (1L << T__11) | (1L << T__12) | (1L << T__15) | (1L << T__16) | (1L << T__17) | (1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23) | (1L << T__24) | (1L << T__25))) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & ((1L << (T__65 - 66)) | (1L << (T__66 - 66)) | (1L << (T__67 - 66)) | (1L << (T__68 - 66)) | (1L << (T__70 - 66)) | (1L << (T__71 - 66)) | (1L << (T__72 - 66)) | (1L << (T__83 - 66)) | (1L << (T__84 - 66)) | (1L << (T__88 - 66)) | (1L << (T__91 - 66)) | (1L << (T__93 - 66)) | (1L << (T__94 - 66)) | (1L << (T__95 - 66)) | (1L << (T__96 - 66)) | (1L << (T__97 - 66)) | (1L << (T__98 - 66)) | (1L << (T__99 - 66)) | (1L << (T__100 - 66)) | (1L << (T__101 - 66)) | (1L << (T__102 - 66)) | (1L << (T__103 - 66)) | (1L << (T__104 - 66)) | (1L << (T__105 - 66)) | (1L << (T__107 - 66)) | (1L << (T__108 - 66)) | (1L << (EOL - 66)) | (1L << (NAME - 66)))) != 0)) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__2) | (1L << T__3) | (1L << T__4) | (1L << T__5) | (1L << T__6) | (1L << T__7) | (1L << T__8) | (1L << T__9) | (1L << T__10) | (1L << T__11) | (1L << T__12) | (1L << T__15) | (1L << T__16) | (1L << T__17) | (1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23) | (1L << T__24) | (1L << T__25))) != 0) || ((((_la - 70)) & ~0x3f) == 0 && ((1L << (_la - 70)) & ((1L << (T__69 - 70)) | (1L << (T__70 - 70)) | (1L << (T__71 - 70)) | (1L << (T__72 - 70)) | (1L << (T__74 - 70)) | (1L << (T__75 - 70)) | (1L << (T__76 - 70)) | (1L << (T__87 - 70)) | (1L << (T__88 - 70)) | (1L << (T__92 - 70)) | (1L << (T__95 - 70)) | (1L << (T__97 - 70)) | (1L << (T__98 - 70)) | (1L << (T__99 - 70)) | (1L << (T__100 - 70)) | (1L << (T__101 - 70)) | (1L << (T__102 - 70)) | (1L << (T__103 - 70)) | (1L << (T__104 - 70)) | (1L << (T__105 - 70)) | (1L << (T__106 - 70)) | (1L << (T__107 - 70)) | (1L << (T__108 - 70)) | (1L << (T__109 - 70)) | (1L << (T__111 - 70)) | (1L << (T__112 - 70)) | (1L << (EOL - 70)) | (1L << (NAME - 70)))) != 0)) { { - setState(436); + setState(439); _errHandler.sync(this); switch (_input.LA(1)) { case T__2: @@ -2856,21 +2880,17 @@ public class prog8Parser extends Parser { case T__23: case T__24: case T__25: - case T__65: - case T__66: - case T__67: - case T__68: + case T__69: case T__70: case T__71: case T__72: - case T__83: - case T__84: + case T__74: + case T__75: + case T__76: + case T__87: case T__88: - case T__91: - case T__93: - case T__94: + case T__92: case T__95: - case T__96: case T__97: case T__98: case T__99: @@ -2880,17 +2900,21 @@ public class prog8Parser extends Parser { case T__103: case T__104: case T__105: + case T__106: case T__107: case T__108: + case T__109: + case T__111: + case T__112: case NAME: { - setState(434); + setState(437); statement(); } break; case EOL: { - setState(435); + setState(438); match(EOL); } break; @@ -2898,12 +2922,12 @@ public class prog8Parser extends Parser { throw new NoViableAltException(this); } } - setState(440); + setState(443); _errHandler.sync(this); _la = _input.LA(1); } - setState(441); - match(T__87); + setState(444); + match(T__91); } } catch (RecognitionException re) { @@ -2941,31 +2965,31 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(443); + setState(446); vardecl(); - setState(451); + setState(454); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__13) { { { - setState(444); + setState(447); match(T__13); - setState(446); + setState(449); _errHandler.sync(this); _la = _input.LA(1); if (_la==EOL) { { - setState(445); + setState(448); match(EOL); } } - setState(448); + setState(451); vardecl(); } } - setState(453); + setState(456); _errHandler.sync(this); _la = _input.LA(1); } @@ -3006,31 +3030,31 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(454); + setState(457); datatype(); - setState(462); + setState(465); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__13) { { { - setState(455); + setState(458); match(T__13); - setState(457); + setState(460); _errHandler.sync(this); _la = _input.LA(1); if (_la==EOL) { { - setState(456); + setState(459); match(EOL); } } - setState(459); + setState(462); datatype(); } } - setState(464); + setState(467); _errHandler.sync(this); _la = _input.LA(1); } @@ -3079,70 +3103,70 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(465); - match(T__88); - setState(466); - identifier(); - setState(467); - match(T__62); + setState(468); + match(T__92); setState(469); + identifier(); + setState(470); + match(T__66); + setState(472); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__17) | (1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23) | (1L << T__24) | (1L << T__25))) != 0)) { { - setState(468); + setState(471); asmsub_params(); } } - setState(471); - match(T__63); - setState(472); - match(T__85); - setState(473); - match(T__89); setState(474); - match(T__62); + match(T__67); + setState(475); + match(T__89); setState(476); + match(T__93); + setState(477); + match(T__66); + setState(479); _errHandler.sync(this); _la = _input.LA(1); - if (((((_la - 71)) & ~0x3f) == 0 && ((1L << (_la - 71)) & ((1L << (T__70 - 71)) | (1L << (T__71 - 71)) | (1L << (T__72 - 71)))) != 0)) { + if (((((_la - 75)) & ~0x3f) == 0 && ((1L << (_la - 75)) & ((1L << (T__74 - 75)) | (1L << (T__75 - 75)) | (1L << (T__76 - 75)))) != 0)) { { - setState(475); + setState(478); clobber(); } } - setState(478); - match(T__63); - setState(479); - match(T__85); - setState(480); - match(T__62); + setState(481); + match(T__67); setState(482); + match(T__89); + setState(483); + match(T__66); + setState(485); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__17) | (1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23) | (1L << T__24) | (1L << T__25))) != 0)) { { - setState(481); + setState(484); asmsub_returns(); } } - setState(484); - match(T__63); setState(487); + match(T__67); + setState(490); _errHandler.sync(this); switch (_input.LA(1)) { case T__14: { - setState(485); + setState(488); asmsub_address(); } break; - case T__86: + case T__90: { - setState(486); + setState(489); statement_block(); } break; @@ -3179,9 +3203,9 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(489); + setState(492); match(T__14); - setState(490); + setState(493); ((Asmsub_addressContext)_localctx).address = integerliteral(); } } @@ -3220,31 +3244,31 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(492); + setState(495); asmsub_param(); - setState(500); + setState(503); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__13) { { { - setState(493); + setState(496); match(T__13); - setState(495); + setState(498); _errHandler.sync(this); _la = _input.LA(1); if (_la==EOL) { { - setState(494); + setState(497); match(EOL); } } - setState(497); + setState(500); asmsub_param(); } } - setState(502); + setState(505); _errHandler.sync(this); _la = _input.LA(1); } @@ -3284,37 +3308,37 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(503); + setState(506); vardecl(); - setState(504); - match(T__65); - setState(508); + setState(507); + match(T__69); + setState(511); _errHandler.sync(this); switch (_input.LA(1)) { - case T__70: - case T__71: - case T__72: - case T__73: case T__74: case T__75: - { - setState(505); - registerorpair(); - } - break; case T__76: case T__77: case T__78: case T__79: { - setState(506); + setState(508); + registerorpair(); + } + break; + case T__80: + case T__81: + case T__82: + case T__83: + { + setState(509); statusregister(); } break; - case T__90: + case T__94: { - setState(507); - ((Asmsub_paramContext)_localctx).stack = match(T__90); + setState(510); + ((Asmsub_paramContext)_localctx).stack = match(T__94); } break; default: @@ -3353,21 +3377,21 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(510); + setState(513); register(); - setState(515); + setState(518); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__13) { { { - setState(511); + setState(514); match(T__13); - setState(512); + setState(515); register(); } } - setState(517); + setState(520); _errHandler.sync(this); _la = _input.LA(1); } @@ -3408,31 +3432,31 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(518); + setState(521); asmsub_return(); - setState(526); + setState(529); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__13) { { { - setState(519); + setState(522); match(T__13); - setState(521); + setState(524); _errHandler.sync(this); _la = _input.LA(1); if (_la==EOL) { { - setState(520); + setState(523); match(EOL); } } - setState(523); + setState(526); asmsub_return(); } } - setState(528); + setState(531); _errHandler.sync(this); _la = _input.LA(1); } @@ -3472,37 +3496,37 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(529); + setState(532); datatype(); - setState(530); - match(T__65); - setState(534); + setState(533); + match(T__69); + setState(537); _errHandler.sync(this); switch (_input.LA(1)) { - case T__70: - case T__71: - case T__72: - case T__73: case T__74: case T__75: - { - setState(531); - registerorpair(); - } - break; case T__76: case T__77: case T__78: case T__79: { - setState(532); + setState(534); + registerorpair(); + } + break; + case T__80: + case T__81: + case T__82: + case T__83: + { + setState(535); statusregister(); } break; - case T__90: + case T__94: { - setState(533); - ((Asmsub_returnContext)_localctx).stack = match(T__90); + setState(536); + ((Asmsub_returnContext)_localctx).stack = match(T__94); } break; default: @@ -3551,21 +3575,21 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(536); - match(T__91); - setState(537); - expression(0); setState(539); + match(T__95); + setState(540); + expression(0); + setState(542); _errHandler.sync(this); _la = _input.LA(1); if (_la==EOL) { { - setState(538); + setState(541); match(EOL); } } - setState(543); + setState(546); _errHandler.sync(this); switch (_input.LA(1)) { case T__2: @@ -3590,21 +3614,17 @@ public class prog8Parser extends Parser { case T__23: case T__24: case T__25: - case T__65: - case T__66: - case T__67: - case T__68: + case T__69: case T__70: case T__71: case T__72: - case T__83: - case T__84: + case T__74: + case T__75: + case T__76: + case T__87: case T__88: - case T__91: - case T__93: - case T__94: + case T__92: case T__95: - case T__96: case T__97: case T__98: case T__99: @@ -3614,39 +3634,43 @@ public class prog8Parser extends Parser { case T__103: case T__104: case T__105: + case T__106: case T__107: case T__108: + case T__109: + case T__111: + case T__112: case NAME: { - setState(541); + setState(544); statement(); } break; - case T__86: + case T__90: { - setState(542); + setState(545); statement_block(); } break; default: throw new NoViableAltException(this); } - setState(546); + setState(549); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,51,_ctx) ) { case 1: { - setState(545); + setState(548); match(EOL); } break; } - setState(549); + setState(552); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,52,_ctx) ) { case 1: { - setState(548); + setState(551); else_part(); } break; @@ -3685,19 +3709,19 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(551); - match(T__92); - setState(553); + setState(554); + match(T__96); + setState(556); _errHandler.sync(this); _la = _input.LA(1); if (_la==EOL) { { - setState(552); + setState(555); match(EOL); } } - setState(557); + setState(560); _errHandler.sync(this); switch (_input.LA(1)) { case T__2: @@ -3722,21 +3746,17 @@ public class prog8Parser extends Parser { case T__23: case T__24: case T__25: - case T__65: - case T__66: - case T__67: - case T__68: + case T__69: case T__70: case T__71: case T__72: - case T__83: - case T__84: + case T__74: + case T__75: + case T__76: + case T__87: case T__88: - case T__91: - case T__93: - case T__94: + case T__92: case T__95: - case T__96: case T__97: case T__98: case T__99: @@ -3746,17 +3766,21 @@ public class prog8Parser extends Parser { case T__103: case T__104: case T__105: + case T__106: case T__107: case T__108: + case T__109: + case T__111: + case T__112: case NAME: { - setState(555); + setState(558); statement(); } break; - case T__86: + case T__90: { - setState(556); + setState(559); statement_block(); } break; @@ -3806,19 +3830,19 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(559); + setState(562); branchcondition(); - setState(561); + setState(564); _errHandler.sync(this); _la = _input.LA(1); if (_la==EOL) { { - setState(560); + setState(563); match(EOL); } } - setState(565); + setState(568); _errHandler.sync(this); switch (_input.LA(1)) { case T__2: @@ -3843,21 +3867,17 @@ public class prog8Parser extends Parser { case T__23: case T__24: case T__25: - case T__65: - case T__66: - case T__67: - case T__68: + case T__69: case T__70: case T__71: case T__72: - case T__83: - case T__84: + case T__74: + case T__75: + case T__76: + case T__87: case T__88: - case T__91: - case T__93: - case T__94: + case T__92: case T__95: - case T__96: case T__97: case T__98: case T__99: @@ -3867,44 +3887,48 @@ public class prog8Parser extends Parser { case T__103: case T__104: case T__105: + case T__106: case T__107: case T__108: + case T__109: + case T__111: + case T__112: case NAME: { - setState(563); + setState(566); statement(); } break; - case T__86: + case T__90: { - setState(564); + setState(567); statement_block(); } break; default: throw new NoViableAltException(this); } - setState(568); + setState(571); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,57,_ctx) ) { case 1: { - setState(567); + setState(570); match(EOL); } break; } - setState(571); + setState(574); _errHandler.sync(this); _la = _input.LA(1); - if (_la==T__92) { + if (_la==T__96) { { - setState(570); + setState(573); else_part(); } } - setState(573); + setState(576); match(EOL); } } @@ -3933,9 +3957,9 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(575); + setState(578); _la = _input.LA(1); - if ( !(((((_la - 94)) & ~0x3f) == 0 && ((1L << (_la - 94)) & ((1L << (T__93 - 94)) | (1L << (T__94 - 94)) | (1L << (T__95 - 94)) | (1L << (T__96 - 94)) | (1L << (T__97 - 94)) | (1L << (T__98 - 94)) | (1L << (T__99 - 94)) | (1L << (T__100 - 94)) | (1L << (T__101 - 94)) | (1L << (T__102 - 94)) | (1L << (T__103 - 94)) | (1L << (T__104 - 94)))) != 0)) ) { + if ( !(((((_la - 98)) & ~0x3f) == 0 && ((1L << (_la - 98)) & ((1L << (T__97 - 98)) | (1L << (T__98 - 98)) | (1L << (T__99 - 98)) | (1L << (T__100 - 98)) | (1L << (T__101 - 98)) | (1L << (T__102 - 98)) | (1L << (T__103 - 98)) | (1L << (T__104 - 98)) | (1L << (T__105 - 98)) | (1L << (T__106 - 98)) | (1L << (T__107 - 98)) | (1L << (T__108 - 98)))) != 0)) ) { _errHandler.recoverInline(this); } else { @@ -3986,53 +4010,53 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(577); - match(T__105); - setState(579); + setState(580); + match(T__109); + setState(582); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__17) | (1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23) | (1L << T__24) | (1L << T__25))) != 0)) { { - setState(578); + setState(581); datatype(); } } - setState(583); + setState(586); _errHandler.sync(this); switch (_input.LA(1)) { - case T__70: - case T__71: - case T__72: + case T__74: + case T__75: + case T__76: { - setState(581); + setState(584); register(); } break; case NAME: { - setState(582); + setState(585); identifier(); } break; default: throw new NoViableAltException(this); } - setState(585); - match(T__106); - setState(586); - expression(0); setState(588); + match(T__110); + setState(589); + expression(0); + setState(591); _errHandler.sync(this); _la = _input.LA(1); if (_la==EOL) { { - setState(587); + setState(590); match(EOL); } } - setState(590); + setState(593); statement_block(); } } @@ -4071,21 +4095,21 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(592); - match(T__107); - setState(593); - expression(0); setState(595); + match(T__111); + setState(596); + expression(0); + setState(598); _errHandler.sync(this); _la = _input.LA(1); if (_la==EOL) { { - setState(594); + setState(597); match(EOL); } } - setState(599); + setState(602); _errHandler.sync(this); switch (_input.LA(1)) { case T__2: @@ -4110,21 +4134,17 @@ public class prog8Parser extends Parser { case T__23: case T__24: case T__25: - case T__65: - case T__66: - case T__67: - case T__68: + case T__69: case T__70: case T__71: case T__72: - case T__83: - case T__84: + case T__74: + case T__75: + case T__76: + case T__87: case T__88: - case T__91: - case T__93: - case T__94: + case T__92: case T__95: - case T__96: case T__97: case T__98: case T__99: @@ -4134,17 +4154,21 @@ public class prog8Parser extends Parser { case T__103: case T__104: case T__105: + case T__106: case T__107: case T__108: + case T__109: + case T__111: + case T__112: case NAME: { - setState(597); + setState(600); statement(); } break; - case T__86: + case T__90: { - setState(598); + setState(601); statement_block(); } break; @@ -4188,9 +4212,9 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(601); - match(T__108); setState(604); + match(T__112); + setState(607); _errHandler.sync(this); switch (_input.LA(1)) { case T__2: @@ -4215,21 +4239,17 @@ public class prog8Parser extends Parser { case T__23: case T__24: case T__25: - case T__65: - case T__66: - case T__67: - case T__68: + case T__69: case T__70: case T__71: case T__72: - case T__83: - case T__84: + case T__74: + case T__75: + case T__76: + case T__87: case T__88: - case T__91: - case T__93: - case T__94: + case T__92: case T__95: - case T__96: case T__97: case T__98: case T__99: @@ -4239,36 +4259,40 @@ public class prog8Parser extends Parser { case T__103: case T__104: case T__105: + case T__106: case T__107: case T__108: + case T__109: + case T__111: + case T__112: case NAME: { - setState(602); + setState(605); statement(); } break; - case T__86: + case T__90: { - setState(603); + setState(606); statement_block(); } break; default: throw new NoViableAltException(this); } - setState(607); + setState(610); _errHandler.sync(this); _la = _input.LA(1); if (_la==EOL) { { - setState(606); + setState(609); match(EOL); } } - setState(609); - match(T__109); - setState(610); + setState(612); + match(T__113); + setState(613); expression(0); } } @@ -4293,39 +4317,41 @@ public class prog8Parser extends Parser { private boolean expression_sempred(ExpressionContext _localctx, int predIndex) { switch (predIndex) { case 0: - return precpred(_ctx, 20); + return precpred(_ctx, 21); case 1: - return precpred(_ctx, 19); + return precpred(_ctx, 20); case 2: - return precpred(_ctx, 18); + return precpred(_ctx, 19); case 3: - return precpred(_ctx, 17); + return precpred(_ctx, 18); case 4: - return precpred(_ctx, 16); + return precpred(_ctx, 17); case 5: - return precpred(_ctx, 15); + return precpred(_ctx, 16); case 6: - return precpred(_ctx, 14); + return precpred(_ctx, 15); case 7: - return precpred(_ctx, 13); + return precpred(_ctx, 14); case 8: - return precpred(_ctx, 11); + return precpred(_ctx, 13); case 9: - return precpred(_ctx, 10); + return precpred(_ctx, 11); case 10: - return precpred(_ctx, 9); + return precpred(_ctx, 10); case 11: - return precpred(_ctx, 12); + return precpred(_ctx, 9); case 12: + return precpred(_ctx, 12); + case 13: return precpred(_ctx, 2); } return true; } public static final String _serializedATN = - "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3|\u0267\4\2\t\2\4"+ - "\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t"+ - "\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+ + "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\u0080\u026a\4\2\t"+ + "\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13"+ + "\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+ "\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+ "\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36\t\36\4\37\t\37\4 \t \4!"+ "\t!\4\"\t\"\4#\t#\4$\t$\4%\t%\4&\t&\4\'\t\'\4(\t(\4)\t)\4*\t*\4+\t+\4"+ @@ -4344,216 +4370,219 @@ public class prog8Parser extends Parser { "\3\25\3\25\3\25\3\25\5\25\u0109\n\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25"+ "\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25"+ "\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25"+ - "\3\25\3\25\3\25\5\25\u0131\n\25\3\25\3\25\7\25\u0135\n\25\f\25\16\25\u0138"+ - "\13\25\3\26\3\26\3\26\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3\31\3\31"+ - "\3\31\5\31\u0148\n\31\3\31\3\31\3\32\3\32\3\32\5\32\u014f\n\32\3\32\3"+ - "\32\3\33\3\33\3\33\5\33\u0156\n\33\3\33\7\33\u0159\n\33\f\33\16\33\u015c"+ - "\13\33\3\34\3\34\5\34\u0160\n\34\3\35\3\35\3\36\3\36\3\37\3\37\3 \3 \3"+ - " \7 \u016b\n \f \16 \u016e\13 \3!\3!\3\"\3\"\3#\3#\3$\3$\5$\u0178\n$\3"+ - "%\3%\3&\3&\3\'\3\'\5\'\u0180\n\'\3\'\3\'\3\'\5\'\u0185\n\'\3\'\7\'\u0188"+ - "\n\'\f\'\16\'\u018b\13\'\3\'\5\'\u018e\n\'\3\'\3\'\3(\3(\3)\3)\3*\3*\3"+ - "+\3+\3+\3+\3+\3+\5+\u019e\n+\3,\3,\3,\3-\3-\3-\3-\5-\u01a7\n-\3-\3-\5"+ - "-\u01ab\n-\3-\3-\3-\3.\3.\3.\3/\3/\3/\3/\7/\u01b7\n/\f/\16/\u01ba\13/"+ - "\3/\3/\3\60\3\60\3\60\5\60\u01c1\n\60\3\60\7\60\u01c4\n\60\f\60\16\60"+ - "\u01c7\13\60\3\61\3\61\3\61\5\61\u01cc\n\61\3\61\7\61\u01cf\n\61\f\61"+ - "\16\61\u01d2\13\61\3\62\3\62\3\62\3\62\5\62\u01d8\n\62\3\62\3\62\3\62"+ - "\3\62\3\62\5\62\u01df\n\62\3\62\3\62\3\62\3\62\5\62\u01e5\n\62\3\62\3"+ - "\62\3\62\5\62\u01ea\n\62\3\63\3\63\3\63\3\64\3\64\3\64\5\64\u01f2\n\64"+ - "\3\64\7\64\u01f5\n\64\f\64\16\64\u01f8\13\64\3\65\3\65\3\65\3\65\3\65"+ - "\5\65\u01ff\n\65\3\66\3\66\3\66\7\66\u0204\n\66\f\66\16\66\u0207\13\66"+ - "\3\67\3\67\3\67\5\67\u020c\n\67\3\67\7\67\u020f\n\67\f\67\16\67\u0212"+ - "\13\67\38\38\38\38\38\58\u0219\n8\39\39\39\59\u021e\n9\39\39\59\u0222"+ - "\n9\39\59\u0225\n9\39\59\u0228\n9\3:\3:\5:\u022c\n:\3:\3:\5:\u0230\n:"+ - "\3;\3;\5;\u0234\n;\3;\3;\5;\u0238\n;\3;\5;\u023b\n;\3;\5;\u023e\n;\3;"+ - "\3;\3<\3<\3=\3=\5=\u0246\n=\3=\3=\5=\u024a\n=\3=\3=\3=\5=\u024f\n=\3="+ - "\3=\3>\3>\3>\5>\u0256\n>\3>\3>\5>\u025a\n>\3?\3?\3?\5?\u025f\n?\3?\5?"+ - "\u0262\n?\3?\3?\3?\3?\2\3(@\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \""+ - "$&(*,.\60\62\64\668:<>@BDFHJLNPRTVXZ\\^`bdfhjlnprtvxz|\2\21\3\2\6\17\3"+ - "\2\24\34\3\2\37(\3\2)*\4\2\3\3+,\3\2.\61\3\2+,\3\2\62\65\3\2\66\67\3\2"+ - "IK\3\2IN\3\2OR\3\2vx\3\2TU\3\2`k\2\u0299\2\u0082\3\2\2\2\4\u0089\3\2\2"+ - "\2\6\u008b\3\2\2\2\b\u00a9\3\2\2\2\n\u00ab\3\2\2\2\f\u00ae\3\2\2\2\16"+ - "\u00b3\3\2\2\2\20\u00c4\3\2\2\2\22\u00c6\3\2\2\2\24\u00cc\3\2\2\2\26\u00d4"+ - "\3\2\2\2\30\u00d7\3\2\2\2\32\u00da\3\2\2\2\34\u00dc\3\2\2\2\36\u00e0\3"+ - "\2\2\2 \u00e4\3\2\2\2\"\u00ec\3\2\2\2$\u00f4\3\2\2\2&\u00f6\3\2\2\2(\u0108"+ - "\3\2\2\2*\u0139\3\2\2\2,\u013c\3\2\2\2.\u013f\3\2\2\2\60\u0144\3\2\2\2"+ - "\62\u014b\3\2\2\2\64\u0152\3\2\2\2\66\u015d\3\2\2\28\u0161\3\2\2\2:\u0163"+ - "\3\2\2\2<\u0165\3\2\2\2>\u0167\3\2\2\2@\u016f\3\2\2\2B\u0171\3\2\2\2D"+ - "\u0173\3\2\2\2F\u0175\3\2\2\2H\u0179\3\2\2\2J\u017b\3\2\2\2L\u017d\3\2"+ - "\2\2N\u0191\3\2\2\2P\u0193\3\2\2\2R\u0195\3\2\2\2T\u019d\3\2\2\2V\u019f"+ - "\3\2\2\2X\u01a2\3\2\2\2Z\u01af\3\2\2\2\\\u01b2\3\2\2\2^\u01bd\3\2\2\2"+ - "`\u01c8\3\2\2\2b\u01d3\3\2\2\2d\u01eb\3\2\2\2f\u01ee\3\2\2\2h\u01f9\3"+ - "\2\2\2j\u0200\3\2\2\2l\u0208\3\2\2\2n\u0213\3\2\2\2p\u021a\3\2\2\2r\u0229"+ - "\3\2\2\2t\u0231\3\2\2\2v\u0241\3\2\2\2x\u0243\3\2\2\2z\u0252\3\2\2\2|"+ - "\u025b\3\2\2\2~\u0081\5\4\3\2\177\u0081\7t\2\2\u0080~\3\2\2\2\u0080\177"+ - "\3\2\2\2\u0081\u0084\3\2\2\2\u0082\u0080\3\2\2\2\u0082\u0083\3\2\2\2\u0083"+ - "\u0085\3\2\2\2\u0084\u0082\3\2\2\2\u0085\u0086\7\2\2\3\u0086\3\3\2\2\2"+ - "\u0087\u008a\5\16\b\2\u0088\u008a\5\6\4\2\u0089\u0087\3\2\2\2\u0089\u0088"+ - "\3\2\2\2\u008a\5\3\2\2\2\u008b\u008c\7\3\2\2\u008c\u008e\5<\37\2\u008d"+ - "\u008f\5F$\2\u008e\u008d\3\2\2\2\u008e\u008f\3\2\2\2\u008f\u0090\3\2\2"+ - "\2\u0090\u0091\5\\/\2\u0091\u0092\7t\2\2\u0092\7\3\2\2\2\u0093\u00aa\5"+ - "\16\b\2\u0094\u00aa\5\24\13\2\u0095\u00aa\5\22\n\2\u0096\u00aa\5\26\f"+ - "\2\u0097\u00aa\5\30\r\2\u0098\u00aa\5\36\20\2\u0099\u00aa\5\"\22\2\u009a"+ - "\u00aa\5\f\7\2\u009b\u00aa\5&\24\2\u009c\u00aa\5\62\32\2\u009d\u00aa\5"+ - "p9\2\u009e\u00aa\5t;\2\u009f\u00aa\5X-\2\u00a0\u00aa\5b\62\2\u00a1\u00aa"+ - "\5V,\2\u00a2\u00aa\5\66\34\2\u00a3\u00aa\5x=\2\u00a4\u00aa\5z>\2\u00a5"+ - "\u00aa\5|?\2\u00a6\u00aa\58\35\2\u00a7\u00aa\5:\36\2\u00a8\u00aa\5\n\6"+ - "\2\u00a9\u0093\3\2\2\2\u00a9\u0094\3\2\2\2\u00a9\u0095\3\2\2\2\u00a9\u0096"+ - "\3\2\2\2\u00a9\u0097\3\2\2\2\u00a9\u0098\3\2\2\2\u00a9\u0099\3\2\2\2\u00a9"+ - "\u009a\3\2\2\2\u00a9\u009b\3\2\2\2\u00a9\u009c\3\2\2\2\u00a9\u009d\3\2"+ - "\2\2\u00a9\u009e\3\2\2\2\u00a9\u009f\3\2\2\2\u00a9\u00a0\3\2\2\2\u00a9"+ - "\u00a1\3\2\2\2\u00a9\u00a2\3\2\2\2\u00a9\u00a3\3\2\2\2\u00a9\u00a4\3\2"+ - "\2\2\u00a9\u00a5\3\2\2\2\u00a9\u00a6\3\2\2\2\u00a9\u00a7\3\2\2\2\u00a9"+ - "\u00a8\3\2\2\2\u00aa\t\3\2\2\2\u00ab\u00ac\5<\37\2\u00ac\u00ad\7\4\2\2"+ - "\u00ad\13\3\2\2\2\u00ae\u00b1\7\5\2\2\u00af\u00b2\5F$\2\u00b0\u00b2\5"+ - "> \2\u00b1\u00af\3\2\2\2\u00b1\u00b0\3\2\2\2\u00b2\r\3\2\2\2\u00b3\u00bf"+ - "\t\2\2\2\u00b4\u00b6\5\20\t\2\u00b5\u00b4\3\2\2\2\u00b5\u00b6\3\2\2\2"+ - "\u00b6\u00c0\3\2\2\2\u00b7\u00bc\5\20\t\2\u00b8\u00b9\7\20\2\2\u00b9\u00bb"+ - "\5\20\t\2\u00ba\u00b8\3\2\2\2\u00bb\u00be\3\2\2\2\u00bc\u00ba\3\2\2\2"+ - "\u00bc\u00bd\3\2\2\2\u00bd\u00c0\3\2\2\2\u00be\u00bc\3\2\2\2\u00bf\u00b5"+ - "\3\2\2\2\u00bf\u00b7\3\2\2\2\u00c0\17\3\2\2\2\u00c1\u00c5\5N(\2\u00c2"+ - "\u00c5\5<\37\2\u00c3\u00c5\5F$\2\u00c4\u00c1\3\2\2\2\u00c4\u00c2\3\2\2"+ - "\2\u00c4\u00c3\3\2\2\2\u00c5\21\3\2\2\2\u00c6\u00c8\5\32\16\2\u00c7\u00c9"+ - "\5\34\17\2\u00c8\u00c7\3\2\2\2\u00c8\u00c9\3\2\2\2\u00c9\u00ca\3\2\2\2"+ - "\u00ca\u00cb\5<\37\2\u00cb\23\3\2\2\2\u00cc\u00ce\5\32\16\2\u00cd\u00cf"+ - "\5\34\17\2\u00ce\u00cd\3\2\2\2\u00ce\u00cf\3\2\2\2\u00cf\u00d0\3\2\2\2"+ - "\u00d0\u00d1\5<\37\2\u00d1\u00d2\7\21\2\2\u00d2\u00d3\5(\25\2\u00d3\25"+ - "\3\2\2\2\u00d4\u00d5\7\22\2\2\u00d5\u00d6\5\24\13\2\u00d6\27\3\2\2\2\u00d7"+ - "\u00d8\7\23\2\2\u00d8\u00d9\5\24\13\2\u00d9\31\3\2\2\2\u00da\u00db\t\3"+ - "\2\2\u00db\33\3\2\2\2\u00dc\u00dd\7\35\2\2\u00dd\u00de\5(\25\2\u00de\u00df"+ - "\7\36\2\2\u00df\35\3\2\2\2\u00e0\u00e1\5 \21\2\u00e1\u00e2\7\21\2\2\u00e2"+ - "\u00e3\5(\25\2\u00e3\37\3\2\2\2\u00e4\u00e9\5$\23\2\u00e5\u00e6\7\20\2"+ - "\2\u00e6\u00e8\5$\23\2\u00e7\u00e5\3\2\2\2\u00e8\u00eb\3\2\2\2\u00e9\u00e7"+ - "\3\2\2\2\u00e9\u00ea\3\2\2\2\u00ea!\3\2\2\2\u00eb\u00e9\3\2\2\2\u00ec"+ - "\u00ed\5$\23\2\u00ed\u00ee\t\4\2\2\u00ee\u00ef\5(\25\2\u00ef#\3\2\2\2"+ - "\u00f0\u00f5\5@!\2\u00f1\u00f5\5> \2\u00f2\u00f5\5,\27\2\u00f3\u00f5\5"+ - ".\30\2\u00f4\u00f0\3\2\2\2\u00f4\u00f1\3\2\2\2\u00f4\u00f2\3\2\2\2\u00f4"+ - "\u00f3\3\2\2\2\u00f5%\3\2\2\2\u00f6\u00f7\5$\23\2\u00f7\u00f8\t\5\2\2"+ - "\u00f8\'\3\2\2\2\u00f9\u00fa\b\25\1\2\u00fa\u0109\5\60\31\2\u00fb\u00fc"+ - "\t\6\2\2\u00fc\u0109\5(\25\27\u00fd\u00fe\7@\2\2\u00fe\u0109\5(\25\n\u00ff"+ - "\u0109\5T+\2\u0100\u0109\5@!\2\u0101\u0109\5> \2\u0102\u0109\5,\27\2\u0103"+ - "\u0109\5.\30\2\u0104\u0105\7A\2\2\u0105\u0106\5(\25\2\u0106\u0107\7B\2"+ - "\2\u0107\u0109\3\2\2\2\u0108\u00f9\3\2\2\2\u0108\u00fb\3\2\2\2\u0108\u00fd"+ - "\3\2\2\2\u0108\u00ff\3\2\2\2\u0108\u0100\3\2\2\2\u0108\u0101\3\2\2\2\u0108"+ - "\u0102\3\2\2\2\u0108\u0103\3\2\2\2\u0108\u0104\3\2\2\2\u0109\u0136\3\2"+ - "\2\2\u010a\u010b\f\26\2\2\u010b\u010c\7-\2\2\u010c\u0135\5(\25\27\u010d"+ - "\u010e\f\25\2\2\u010e\u010f\t\7\2\2\u010f\u0135\5(\25\26\u0110\u0111\f"+ - "\24\2\2\u0111\u0112\t\b\2\2\u0112\u0135\5(\25\25\u0113\u0114\f\23\2\2"+ - "\u0114\u0115\t\t\2\2\u0115\u0135\5(\25\24\u0116\u0117\f\22\2\2\u0117\u0118"+ - "\t\n\2\2\u0118\u0135\5(\25\23\u0119\u011a\f\21\2\2\u011a\u011b\78\2\2"+ - "\u011b\u0135\5(\25\22\u011c\u011d\f\20\2\2\u011d\u011e\79\2\2\u011e\u0135"+ - "\5(\25\21\u011f\u0120\f\17\2\2\u0120\u0121\7:\2\2\u0121\u0135\5(\25\20"+ - "\u0122\u0123\f\r\2\2\u0123\u0124\7=\2\2\u0124\u0135\5(\25\16\u0125\u0126"+ - "\f\f\2\2\u0126\u0127\7>\2\2\u0127\u0135\5(\25\r\u0128\u0129\f\13\2\2\u0129"+ - "\u012a\7?\2\2\u012a\u0135\5(\25\f\u012b\u012c\f\16\2\2\u012c\u012d\7;"+ - "\2\2\u012d\u0130\5(\25\2\u012e\u012f\7<\2\2\u012f\u0131\5(\25\2\u0130"+ - "\u012e\3\2\2\2\u0130\u0131\3\2\2\2\u0131\u0135\3\2\2\2\u0132\u0133\f\4"+ - "\2\2\u0133\u0135\5*\26\2\u0134\u010a\3\2\2\2\u0134\u010d\3\2\2\2\u0134"+ - "\u0110\3\2\2\2\u0134\u0113\3\2\2\2\u0134\u0116\3\2\2\2\u0134\u0119\3\2"+ - "\2\2\u0134\u011c\3\2\2\2\u0134\u011f\3\2\2\2\u0134\u0122\3\2\2\2\u0134"+ - "\u0125\3\2\2\2\u0134\u0128\3\2\2\2\u0134\u012b\3\2\2\2\u0134\u0132\3\2"+ - "\2\2\u0135\u0138\3\2\2\2\u0136\u0134\3\2\2\2\u0136\u0137\3\2\2\2\u0137"+ - ")\3\2\2\2\u0138\u0136\3\2\2\2\u0139\u013a\7C\2\2\u013a\u013b\5\32\16\2"+ - "\u013b+\3\2\2\2\u013c\u013d\5> \2\u013d\u013e\5\34\17\2\u013e-\3\2\2\2"+ - "\u013f\u0140\7D\2\2\u0140\u0141\7A\2\2\u0141\u0142\5(\25\2\u0142\u0143"+ - "\7B\2\2\u0143/\3\2\2\2\u0144\u0145\5> \2\u0145\u0147\7A\2\2\u0146\u0148"+ - "\5\64\33\2\u0147\u0146\3\2\2\2\u0147\u0148\3\2\2\2\u0148\u0149\3\2\2\2"+ - "\u0149\u014a\7B\2\2\u014a\61\3\2\2\2\u014b\u014c\5> \2\u014c\u014e\7A"+ - "\2\2\u014d\u014f\5\64\33\2\u014e\u014d\3\2\2\2\u014e\u014f\3\2\2\2\u014f"+ - "\u0150\3\2\2\2\u0150\u0151\7B\2\2\u0151\63\3\2\2\2\u0152\u015a\5(\25\2"+ - "\u0153\u0155\7\20\2\2\u0154\u0156\7t\2\2\u0155\u0154\3\2\2\2\u0155\u0156"+ - "\3\2\2\2\u0156\u0157\3\2\2\2\u0157\u0159\5(\25\2\u0158\u0153\3\2\2\2\u0159"+ - "\u015c\3\2\2\2\u015a\u0158\3\2\2\2\u015a\u015b\3\2\2\2\u015b\65\3\2\2"+ - "\2\u015c\u015a\3\2\2\2\u015d\u015f\7E\2\2\u015e\u0160\5\64\33\2\u015f"+ - "\u015e\3\2\2\2\u015f\u0160\3\2\2\2\u0160\67\3\2\2\2\u0161\u0162\7F\2\2"+ - "\u01629\3\2\2\2\u0163\u0164\7G\2\2\u0164;\3\2\2\2\u0165\u0166\7u\2\2\u0166"+ - "=\3\2\2\2\u0167\u016c\7u\2\2\u0168\u0169\7H\2\2\u0169\u016b\7u\2\2\u016a"+ - "\u0168\3\2\2\2\u016b\u016e\3\2\2\2\u016c\u016a\3\2\2\2\u016c\u016d\3\2"+ - "\2\2\u016d?\3\2\2\2\u016e\u016c\3\2\2\2\u016f\u0170\t\13\2\2\u0170A\3"+ - "\2\2\2\u0171\u0172\t\f\2\2\u0172C\3\2\2\2\u0173\u0174\t\r\2\2\u0174E\3"+ - "\2\2\2\u0175\u0177\t\16\2\2\u0176\u0178\5H%\2\u0177\u0176\3\2\2\2\u0177"+ - "\u0178\3\2\2\2\u0178G\3\2\2\2\u0179\u017a\7S\2\2\u017aI\3\2\2\2\u017b"+ - "\u017c\t\17\2\2\u017cK\3\2\2\2\u017d\u017f\7\35\2\2\u017e\u0180\7t\2\2"+ - "\u017f\u017e\3\2\2\2\u017f\u0180\3\2\2\2\u0180\u0181\3\2\2\2\u0181\u0189"+ - "\5(\25\2\u0182\u0184\7\20\2\2\u0183\u0185\7t\2\2\u0184\u0183\3\2\2\2\u0184"+ - "\u0185\3\2\2\2\u0185\u0186\3\2\2\2\u0186\u0188\5(\25\2\u0187\u0182\3\2"+ - "\2\2\u0188\u018b\3\2\2\2\u0189\u0187\3\2\2\2\u0189\u018a\3\2\2\2\u018a"+ - "\u018d\3\2\2\2\u018b\u0189\3\2\2\2\u018c\u018e\7t\2\2\u018d\u018c\3\2"+ - "\2\2\u018d\u018e\3\2\2\2\u018e\u018f\3\2\2\2\u018f\u0190\7\36\2\2\u0190"+ - "M\3\2\2\2\u0191\u0192\7z\2\2\u0192O\3\2\2\2\u0193\u0194\7|\2\2\u0194Q"+ - "\3\2\2\2\u0195\u0196\7y\2\2\u0196S\3\2\2\2\u0197\u019e\5F$\2\u0198\u019e"+ - "\5J&\2\u0199\u019e\5L\'\2\u019a\u019e\5N(\2\u019b\u019e\5P)\2\u019c\u019e"+ - "\5R*\2\u019d\u0197\3\2\2\2\u019d\u0198\3\2\2\2\u019d\u0199\3\2\2\2\u019d"+ - "\u019a\3\2\2\2\u019d\u019b\3\2\2\2\u019d\u019c\3\2\2\2\u019eU\3\2\2\2"+ - "\u019f\u01a0\7V\2\2\u01a0\u01a1\7{\2\2\u01a1W\3\2\2\2\u01a2\u01a3\7W\2"+ - "\2\u01a3\u01a4\5<\37\2\u01a4\u01a6\7A\2\2\u01a5\u01a7\5^\60\2\u01a6\u01a5"+ - "\3\2\2\2\u01a6\u01a7\3\2\2\2\u01a7\u01a8\3\2\2\2\u01a8\u01aa\7B\2\2\u01a9"+ - "\u01ab\5Z.\2\u01aa\u01a9\3\2\2\2\u01aa\u01ab\3\2\2\2\u01ab\u01ac\3\2\2"+ - "\2\u01ac\u01ad\5\\/\2\u01ad\u01ae\7t\2\2\u01aeY\3\2\2\2\u01af\u01b0\7"+ - "X\2\2\u01b0\u01b1\5`\61\2\u01b1[\3\2\2\2\u01b2\u01b3\7Y\2\2\u01b3\u01b8"+ - "\7t\2\2\u01b4\u01b7\5\b\5\2\u01b5\u01b7\7t\2\2\u01b6\u01b4\3\2\2\2\u01b6"+ - "\u01b5\3\2\2\2\u01b7\u01ba\3\2\2\2\u01b8\u01b6\3\2\2\2\u01b8\u01b9\3\2"+ - "\2\2\u01b9\u01bb\3\2\2\2\u01ba\u01b8\3\2\2\2\u01bb\u01bc\7Z\2\2\u01bc"+ - "]\3\2\2\2\u01bd\u01c5\5\22\n\2\u01be\u01c0\7\20\2\2\u01bf\u01c1\7t\2\2"+ - "\u01c0\u01bf\3\2\2\2\u01c0\u01c1\3\2\2\2\u01c1\u01c2\3\2\2\2\u01c2\u01c4"+ - "\5\22\n\2\u01c3\u01be\3\2\2\2\u01c4\u01c7\3\2\2\2\u01c5\u01c3\3\2\2\2"+ - "\u01c5\u01c6\3\2\2\2\u01c6_\3\2\2\2\u01c7\u01c5\3\2\2\2\u01c8\u01d0\5"+ - "\32\16\2\u01c9\u01cb\7\20\2\2\u01ca\u01cc\7t\2\2\u01cb\u01ca\3\2\2\2\u01cb"+ - "\u01cc\3\2\2\2\u01cc\u01cd\3\2\2\2\u01cd\u01cf\5\32\16\2\u01ce\u01c9\3"+ - "\2\2\2\u01cf\u01d2\3\2\2\2\u01d0\u01ce\3\2\2\2\u01d0\u01d1\3\2\2\2\u01d1"+ - "a\3\2\2\2\u01d2\u01d0\3\2\2\2\u01d3\u01d4\7[\2\2\u01d4\u01d5\5<\37\2\u01d5"+ - "\u01d7\7A\2\2\u01d6\u01d8\5f\64\2\u01d7\u01d6\3\2\2\2\u01d7\u01d8\3\2"+ - "\2\2\u01d8\u01d9\3\2\2\2\u01d9\u01da\7B\2\2\u01da\u01db\7X\2\2\u01db\u01dc"+ - "\7\\\2\2\u01dc\u01de\7A\2\2\u01dd\u01df\5j\66\2\u01de\u01dd\3\2\2\2\u01de"+ - "\u01df\3\2\2\2\u01df\u01e0\3\2\2\2\u01e0\u01e1\7B\2\2\u01e1\u01e2\7X\2"+ - "\2\u01e2\u01e4\7A\2\2\u01e3\u01e5\5l\67\2\u01e4\u01e3\3\2\2\2\u01e4\u01e5"+ - "\3\2\2\2\u01e5\u01e6\3\2\2\2\u01e6\u01e9\7B\2\2\u01e7\u01ea\5d\63\2\u01e8"+ - "\u01ea\5\\/\2\u01e9\u01e7\3\2\2\2\u01e9\u01e8\3\2\2\2\u01eac\3\2\2\2\u01eb"+ - "\u01ec\7\21\2\2\u01ec\u01ed\5F$\2\u01ede\3\2\2\2\u01ee\u01f6\5h\65\2\u01ef"+ - "\u01f1\7\20\2\2\u01f0\u01f2\7t\2\2\u01f1\u01f0\3\2\2\2\u01f1\u01f2\3\2"+ - "\2\2\u01f2\u01f3\3\2\2\2\u01f3\u01f5\5h\65\2\u01f4\u01ef\3\2\2\2\u01f5"+ - "\u01f8\3\2\2\2\u01f6\u01f4\3\2\2\2\u01f6\u01f7\3\2\2\2\u01f7g\3\2\2\2"+ - "\u01f8\u01f6\3\2\2\2\u01f9\u01fa\5\22\n\2\u01fa\u01fe\7D\2\2\u01fb\u01ff"+ - "\5B\"\2\u01fc\u01ff\5D#\2\u01fd\u01ff\7]\2\2\u01fe\u01fb\3\2\2\2\u01fe"+ - "\u01fc\3\2\2\2\u01fe\u01fd\3\2\2\2\u01ffi\3\2\2\2\u0200\u0205\5@!\2\u0201"+ - "\u0202\7\20\2\2\u0202\u0204\5@!\2\u0203\u0201\3\2\2\2\u0204\u0207\3\2"+ - "\2\2\u0205\u0203\3\2\2\2\u0205\u0206\3\2\2\2\u0206k\3\2\2\2\u0207\u0205"+ - "\3\2\2\2\u0208\u0210\5n8\2\u0209\u020b\7\20\2\2\u020a\u020c\7t\2\2\u020b"+ - "\u020a\3\2\2\2\u020b\u020c\3\2\2\2\u020c\u020d\3\2\2\2\u020d\u020f\5n"+ - "8\2\u020e\u0209\3\2\2\2\u020f\u0212\3\2\2\2\u0210\u020e\3\2\2\2\u0210"+ - "\u0211\3\2\2\2\u0211m\3\2\2\2\u0212\u0210\3\2\2\2\u0213\u0214\5\32\16"+ - "\2\u0214\u0218\7D\2\2\u0215\u0219\5B\"\2\u0216\u0219\5D#\2\u0217\u0219"+ - "\7]\2\2\u0218\u0215\3\2\2\2\u0218\u0216\3\2\2\2\u0218\u0217\3\2\2\2\u0219"+ - "o\3\2\2\2\u021a\u021b\7^\2\2\u021b\u021d\5(\25\2\u021c\u021e\7t\2\2\u021d"+ - "\u021c\3\2\2\2\u021d\u021e\3\2\2\2\u021e\u0221\3\2\2\2\u021f\u0222\5\b"+ - "\5\2\u0220\u0222\5\\/\2\u0221\u021f\3\2\2\2\u0221\u0220\3\2\2\2\u0222"+ - "\u0224\3\2\2\2\u0223\u0225\7t\2\2\u0224\u0223\3\2\2\2\u0224\u0225\3\2"+ - "\2\2\u0225\u0227\3\2\2\2\u0226\u0228\5r:\2\u0227\u0226\3\2\2\2\u0227\u0228"+ - "\3\2\2\2\u0228q\3\2\2\2\u0229\u022b\7_\2\2\u022a\u022c\7t\2\2\u022b\u022a"+ - "\3\2\2\2\u022b\u022c\3\2\2\2\u022c\u022f\3\2\2\2\u022d\u0230\5\b\5\2\u022e"+ - "\u0230\5\\/\2\u022f\u022d\3\2\2\2\u022f\u022e\3\2\2\2\u0230s\3\2\2\2\u0231"+ - "\u0233\5v<\2\u0232\u0234\7t\2\2\u0233\u0232\3\2\2\2\u0233\u0234\3\2\2"+ - "\2\u0234\u0237\3\2\2\2\u0235\u0238\5\b\5\2\u0236\u0238\5\\/\2\u0237\u0235"+ - "\3\2\2\2\u0237\u0236\3\2\2\2\u0238\u023a\3\2\2\2\u0239\u023b\7t\2\2\u023a"+ - "\u0239\3\2\2\2\u023a\u023b\3\2\2\2\u023b\u023d\3\2\2\2\u023c\u023e\5r"+ - ":\2\u023d\u023c\3\2\2\2\u023d\u023e\3\2\2\2\u023e\u023f\3\2\2\2\u023f"+ - "\u0240\7t\2\2\u0240u\3\2\2\2\u0241\u0242\t\20\2\2\u0242w\3\2\2\2\u0243"+ - "\u0245\7l\2\2\u0244\u0246\5\32\16\2\u0245\u0244\3\2\2\2\u0245\u0246\3"+ - "\2\2\2\u0246\u0249\3\2\2\2\u0247\u024a\5@!\2\u0248\u024a\5<\37\2\u0249"+ - "\u0247\3\2\2\2\u0249\u0248\3\2\2\2\u024a\u024b\3\2\2\2\u024b\u024c\7m"+ - "\2\2\u024c\u024e\5(\25\2\u024d\u024f\7t\2\2\u024e\u024d\3\2\2\2\u024e"+ - "\u024f\3\2\2\2\u024f\u0250\3\2\2\2\u0250\u0251\5\\/\2\u0251y\3\2\2\2\u0252"+ - "\u0253\7n\2\2\u0253\u0255\5(\25\2\u0254\u0256\7t\2\2\u0255\u0254\3\2\2"+ - "\2\u0255\u0256\3\2\2\2\u0256\u0259\3\2\2\2\u0257\u025a\5\b\5\2\u0258\u025a"+ - "\5\\/\2\u0259\u0257\3\2\2\2\u0259\u0258\3\2\2\2\u025a{\3\2\2\2\u025b\u025e"+ - "\7o\2\2\u025c\u025f\5\b\5\2\u025d\u025f\5\\/\2\u025e\u025c\3\2\2\2\u025e"+ - "\u025d\3\2\2\2\u025f\u0261\3\2\2\2\u0260\u0262\7t\2\2\u0261\u0260\3\2"+ - "\2\2\u0261\u0262\3\2\2\2\u0262\u0263\3\2\2\2\u0263\u0264\7p\2\2\u0264"+ - "\u0265\5(\25\2\u0265}\3\2\2\2D\u0080\u0082\u0089\u008e\u00a9\u00b1\u00b5"+ - "\u00bc\u00bf\u00c4\u00c8\u00ce\u00e9\u00f4\u0108\u0130\u0134\u0136\u0147"+ - "\u014e\u0155\u015a\u015f\u016c\u0177\u017f\u0184\u0189\u018d\u019d\u01a6"+ - "\u01aa\u01b6\u01b8\u01c0\u01c5\u01cb\u01d0\u01d7\u01de\u01e4\u01e9\u01f1"+ - "\u01f6\u01fe\u0205\u020b\u0210\u0218\u021d\u0221\u0224\u0227\u022b\u022f"+ - "\u0233\u0237\u023a\u023d\u0245\u0249\u024e\u0255\u0259\u025e\u0261"; + "\3\25\3\25\3\25\3\25\3\25\3\25\5\25\u0134\n\25\3\25\3\25\7\25\u0138\n"+ + "\25\f\25\16\25\u013b\13\25\3\26\3\26\3\26\3\27\3\27\3\27\3\30\3\30\3\30"+ + "\3\30\3\30\3\31\3\31\3\31\5\31\u014b\n\31\3\31\3\31\3\32\3\32\3\32\5\32"+ + "\u0152\n\32\3\32\3\32\3\33\3\33\3\33\5\33\u0159\n\33\3\33\7\33\u015c\n"+ + "\33\f\33\16\33\u015f\13\33\3\34\3\34\5\34\u0163\n\34\3\35\3\35\3\36\3"+ + "\36\3\37\3\37\3 \3 \3 \7 \u016e\n \f \16 \u0171\13 \3!\3!\3\"\3\"\3#\3"+ + "#\3$\3$\5$\u017b\n$\3%\3%\3&\3&\3\'\3\'\5\'\u0183\n\'\3\'\3\'\3\'\5\'"+ + "\u0188\n\'\3\'\7\'\u018b\n\'\f\'\16\'\u018e\13\'\3\'\5\'\u0191\n\'\3\'"+ + "\3\'\3(\3(\3)\3)\3*\3*\3+\3+\3+\3+\3+\3+\5+\u01a1\n+\3,\3,\3,\3-\3-\3"+ + "-\3-\5-\u01aa\n-\3-\3-\5-\u01ae\n-\3-\3-\3-\3.\3.\3.\3/\3/\3/\3/\7/\u01ba"+ + "\n/\f/\16/\u01bd\13/\3/\3/\3\60\3\60\3\60\5\60\u01c4\n\60\3\60\7\60\u01c7"+ + "\n\60\f\60\16\60\u01ca\13\60\3\61\3\61\3\61\5\61\u01cf\n\61\3\61\7\61"+ + "\u01d2\n\61\f\61\16\61\u01d5\13\61\3\62\3\62\3\62\3\62\5\62\u01db\n\62"+ + "\3\62\3\62\3\62\3\62\3\62\5\62\u01e2\n\62\3\62\3\62\3\62\3\62\5\62\u01e8"+ + "\n\62\3\62\3\62\3\62\5\62\u01ed\n\62\3\63\3\63\3\63\3\64\3\64\3\64\5\64"+ + "\u01f5\n\64\3\64\7\64\u01f8\n\64\f\64\16\64\u01fb\13\64\3\65\3\65\3\65"+ + "\3\65\3\65\5\65\u0202\n\65\3\66\3\66\3\66\7\66\u0207\n\66\f\66\16\66\u020a"+ + "\13\66\3\67\3\67\3\67\5\67\u020f\n\67\3\67\7\67\u0212\n\67\f\67\16\67"+ + "\u0215\13\67\38\38\38\38\38\58\u021c\n8\39\39\39\59\u0221\n9\39\39\59"+ + "\u0225\n9\39\59\u0228\n9\39\59\u022b\n9\3:\3:\5:\u022f\n:\3:\3:\5:\u0233"+ + "\n:\3;\3;\5;\u0237\n;\3;\3;\5;\u023b\n;\3;\5;\u023e\n;\3;\5;\u0241\n;"+ + "\3;\3;\3<\3<\3=\3=\5=\u0249\n=\3=\3=\5=\u024d\n=\3=\3=\3=\5=\u0252\n="+ + "\3=\3=\3>\3>\3>\5>\u0259\n>\3>\3>\5>\u025d\n>\3?\3?\3?\5?\u0262\n?\3?"+ + "\5?\u0265\n?\3?\3?\3?\3?\2\3(@\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36"+ + " \"$&(*,.\60\62\64\668:<>@BDFHJLNPRTVXZ\\^`bdfhjlnprtvxz|\2\22\3\2\6\17"+ + "\3\2\24\34\3\2\37*\3\2+,\4\2\3\3-.\3\2\60\63\3\2-.\3\2\64\65\3\2\669\3"+ + "\2:;\3\2MO\3\2MR\3\2SV\3\2z|\3\2XY\3\2do\2\u029d\2\u0082\3\2\2\2\4\u0089"+ + "\3\2\2\2\6\u008b\3\2\2\2\b\u00a9\3\2\2\2\n\u00ab\3\2\2\2\f\u00ae\3\2\2"+ + "\2\16\u00b3\3\2\2\2\20\u00c4\3\2\2\2\22\u00c6\3\2\2\2\24\u00cc\3\2\2\2"+ + "\26\u00d4\3\2\2\2\30\u00d7\3\2\2\2\32\u00da\3\2\2\2\34\u00dc\3\2\2\2\36"+ + "\u00e0\3\2\2\2 \u00e4\3\2\2\2\"\u00ec\3\2\2\2$\u00f4\3\2\2\2&\u00f6\3"+ + "\2\2\2(\u0108\3\2\2\2*\u013c\3\2\2\2,\u013f\3\2\2\2.\u0142\3\2\2\2\60"+ + "\u0147\3\2\2\2\62\u014e\3\2\2\2\64\u0155\3\2\2\2\66\u0160\3\2\2\28\u0164"+ + "\3\2\2\2:\u0166\3\2\2\2<\u0168\3\2\2\2>\u016a\3\2\2\2@\u0172\3\2\2\2B"+ + "\u0174\3\2\2\2D\u0176\3\2\2\2F\u0178\3\2\2\2H\u017c\3\2\2\2J\u017e\3\2"+ + "\2\2L\u0180\3\2\2\2N\u0194\3\2\2\2P\u0196\3\2\2\2R\u0198\3\2\2\2T\u01a0"+ + "\3\2\2\2V\u01a2\3\2\2\2X\u01a5\3\2\2\2Z\u01b2\3\2\2\2\\\u01b5\3\2\2\2"+ + "^\u01c0\3\2\2\2`\u01cb\3\2\2\2b\u01d6\3\2\2\2d\u01ee\3\2\2\2f\u01f1\3"+ + "\2\2\2h\u01fc\3\2\2\2j\u0203\3\2\2\2l\u020b\3\2\2\2n\u0216\3\2\2\2p\u021d"+ + "\3\2\2\2r\u022c\3\2\2\2t\u0234\3\2\2\2v\u0244\3\2\2\2x\u0246\3\2\2\2z"+ + "\u0255\3\2\2\2|\u025e\3\2\2\2~\u0081\5\4\3\2\177\u0081\7x\2\2\u0080~\3"+ + "\2\2\2\u0080\177\3\2\2\2\u0081\u0084\3\2\2\2\u0082\u0080\3\2\2\2\u0082"+ + "\u0083\3\2\2\2\u0083\u0085\3\2\2\2\u0084\u0082\3\2\2\2\u0085\u0086\7\2"+ + "\2\3\u0086\3\3\2\2\2\u0087\u008a\5\16\b\2\u0088\u008a\5\6\4\2\u0089\u0087"+ + "\3\2\2\2\u0089\u0088\3\2\2\2\u008a\5\3\2\2\2\u008b\u008c\7\3\2\2\u008c"+ + "\u008e\5<\37\2\u008d\u008f\5F$\2\u008e\u008d\3\2\2\2\u008e\u008f\3\2\2"+ + "\2\u008f\u0090\3\2\2\2\u0090\u0091\5\\/\2\u0091\u0092\7x\2\2\u0092\7\3"+ + "\2\2\2\u0093\u00aa\5\16\b\2\u0094\u00aa\5\24\13\2\u0095\u00aa\5\22\n\2"+ + "\u0096\u00aa\5\26\f\2\u0097\u00aa\5\30\r\2\u0098\u00aa\5\36\20\2\u0099"+ + "\u00aa\5\"\22\2\u009a\u00aa\5\f\7\2\u009b\u00aa\5&\24\2\u009c\u00aa\5"+ + "\62\32\2\u009d\u00aa\5p9\2\u009e\u00aa\5t;\2\u009f\u00aa\5X-\2\u00a0\u00aa"+ + "\5b\62\2\u00a1\u00aa\5V,\2\u00a2\u00aa\5\66\34\2\u00a3\u00aa\5x=\2\u00a4"+ + "\u00aa\5z>\2\u00a5\u00aa\5|?\2\u00a6\u00aa\58\35\2\u00a7\u00aa\5:\36\2"+ + "\u00a8\u00aa\5\n\6\2\u00a9\u0093\3\2\2\2\u00a9\u0094\3\2\2\2\u00a9\u0095"+ + "\3\2\2\2\u00a9\u0096\3\2\2\2\u00a9\u0097\3\2\2\2\u00a9\u0098\3\2\2\2\u00a9"+ + "\u0099\3\2\2\2\u00a9\u009a\3\2\2\2\u00a9\u009b\3\2\2\2\u00a9\u009c\3\2"+ + "\2\2\u00a9\u009d\3\2\2\2\u00a9\u009e\3\2\2\2\u00a9\u009f\3\2\2\2\u00a9"+ + "\u00a0\3\2\2\2\u00a9\u00a1\3\2\2\2\u00a9\u00a2\3\2\2\2\u00a9\u00a3\3\2"+ + "\2\2\u00a9\u00a4\3\2\2\2\u00a9\u00a5\3\2\2\2\u00a9\u00a6\3\2\2\2\u00a9"+ + "\u00a7\3\2\2\2\u00a9\u00a8\3\2\2\2\u00aa\t\3\2\2\2\u00ab\u00ac\5<\37\2"+ + "\u00ac\u00ad\7\4\2\2\u00ad\13\3\2\2\2\u00ae\u00b1\7\5\2\2\u00af\u00b2"+ + "\5F$\2\u00b0\u00b2\5> \2\u00b1\u00af\3\2\2\2\u00b1\u00b0\3\2\2\2\u00b2"+ + "\r\3\2\2\2\u00b3\u00bf\t\2\2\2\u00b4\u00b6\5\20\t\2\u00b5\u00b4\3\2\2"+ + "\2\u00b5\u00b6\3\2\2\2\u00b6\u00c0\3\2\2\2\u00b7\u00bc\5\20\t\2\u00b8"+ + "\u00b9\7\20\2\2\u00b9\u00bb\5\20\t\2\u00ba\u00b8\3\2\2\2\u00bb\u00be\3"+ + "\2\2\2\u00bc\u00ba\3\2\2\2\u00bc\u00bd\3\2\2\2\u00bd\u00c0\3\2\2\2\u00be"+ + "\u00bc\3\2\2\2\u00bf\u00b5\3\2\2\2\u00bf\u00b7\3\2\2\2\u00c0\17\3\2\2"+ + "\2\u00c1\u00c5\5N(\2\u00c2\u00c5\5<\37\2\u00c3\u00c5\5F$\2\u00c4\u00c1"+ + "\3\2\2\2\u00c4\u00c2\3\2\2\2\u00c4\u00c3\3\2\2\2\u00c5\21\3\2\2\2\u00c6"+ + "\u00c8\5\32\16\2\u00c7\u00c9\5\34\17\2\u00c8\u00c7\3\2\2\2\u00c8\u00c9"+ + "\3\2\2\2\u00c9\u00ca\3\2\2\2\u00ca\u00cb\5<\37\2\u00cb\23\3\2\2\2\u00cc"+ + "\u00ce\5\32\16\2\u00cd\u00cf\5\34\17\2\u00ce\u00cd\3\2\2\2\u00ce\u00cf"+ + "\3\2\2\2\u00cf\u00d0\3\2\2\2\u00d0\u00d1\5<\37\2\u00d1\u00d2\7\21\2\2"+ + "\u00d2\u00d3\5(\25\2\u00d3\25\3\2\2\2\u00d4\u00d5\7\22\2\2\u00d5\u00d6"+ + "\5\24\13\2\u00d6\27\3\2\2\2\u00d7\u00d8\7\23\2\2\u00d8\u00d9\5\24\13\2"+ + "\u00d9\31\3\2\2\2\u00da\u00db\t\3\2\2\u00db\33\3\2\2\2\u00dc\u00dd\7\35"+ + "\2\2\u00dd\u00de\5(\25\2\u00de\u00df\7\36\2\2\u00df\35\3\2\2\2\u00e0\u00e1"+ + "\5 \21\2\u00e1\u00e2\7\21\2\2\u00e2\u00e3\5(\25\2\u00e3\37\3\2\2\2\u00e4"+ + "\u00e9\5$\23\2\u00e5\u00e6\7\20\2\2\u00e6\u00e8\5$\23\2\u00e7\u00e5\3"+ + "\2\2\2\u00e8\u00eb\3\2\2\2\u00e9\u00e7\3\2\2\2\u00e9\u00ea\3\2\2\2\u00ea"+ + "!\3\2\2\2\u00eb\u00e9\3\2\2\2\u00ec\u00ed\5$\23\2\u00ed\u00ee\t\4\2\2"+ + "\u00ee\u00ef\5(\25\2\u00ef#\3\2\2\2\u00f0\u00f5\5@!\2\u00f1\u00f5\5> "+ + "\2\u00f2\u00f5\5,\27\2\u00f3\u00f5\5.\30\2\u00f4\u00f0\3\2\2\2\u00f4\u00f1"+ + "\3\2\2\2\u00f4\u00f2\3\2\2\2\u00f4\u00f3\3\2\2\2\u00f5%\3\2\2\2\u00f6"+ + "\u00f7\5$\23\2\u00f7\u00f8\t\5\2\2\u00f8\'\3\2\2\2\u00f9\u00fa\b\25\1"+ + "\2\u00fa\u0109\5\60\31\2\u00fb\u00fc\t\6\2\2\u00fc\u0109\5(\25\30\u00fd"+ + "\u00fe\7D\2\2\u00fe\u0109\5(\25\n\u00ff\u0109\5T+\2\u0100\u0109\5@!\2"+ + "\u0101\u0109\5> \2\u0102\u0109\5,\27\2\u0103\u0109\5.\30\2\u0104\u0105"+ + "\7E\2\2\u0105\u0106\5(\25\2\u0106\u0107\7F\2\2\u0107\u0109\3\2\2\2\u0108"+ + "\u00f9\3\2\2\2\u0108\u00fb\3\2\2\2\u0108\u00fd\3\2\2\2\u0108\u00ff\3\2"+ + "\2\2\u0108\u0100\3\2\2\2\u0108\u0101\3\2\2\2\u0108\u0102\3\2\2\2\u0108"+ + "\u0103\3\2\2\2\u0108\u0104\3\2\2\2\u0109\u0139\3\2\2\2\u010a\u010b\f\27"+ + "\2\2\u010b\u010c\7/\2\2\u010c\u0138\5(\25\30\u010d\u010e\f\26\2\2\u010e"+ + "\u010f\t\7\2\2\u010f\u0138\5(\25\27\u0110\u0111\f\25\2\2\u0111\u0112\t"+ + "\b\2\2\u0112\u0138\5(\25\26\u0113\u0114\f\24\2\2\u0114\u0115\t\t\2\2\u0115"+ + "\u0138\5(\25\25\u0116\u0117\f\23\2\2\u0117\u0118\t\n\2\2\u0118\u0138\5"+ + "(\25\24\u0119\u011a\f\22\2\2\u011a\u011b\t\13\2\2\u011b\u0138\5(\25\23"+ + "\u011c\u011d\f\21\2\2\u011d\u011e\7<\2\2\u011e\u0138\5(\25\22\u011f\u0120"+ + "\f\20\2\2\u0120\u0121\7=\2\2\u0121\u0138\5(\25\21\u0122\u0123\f\17\2\2"+ + "\u0123\u0124\7>\2\2\u0124\u0138\5(\25\20\u0125\u0126\f\r\2\2\u0126\u0127"+ + "\7A\2\2\u0127\u0138\5(\25\16\u0128\u0129\f\f\2\2\u0129\u012a\7B\2\2\u012a"+ + "\u0138\5(\25\r\u012b\u012c\f\13\2\2\u012c\u012d\7C\2\2\u012d\u0138\5("+ + "\25\f\u012e\u012f\f\16\2\2\u012f\u0130\7?\2\2\u0130\u0133\5(\25\2\u0131"+ + "\u0132\7@\2\2\u0132\u0134\5(\25\2\u0133\u0131\3\2\2\2\u0133\u0134\3\2"+ + "\2\2\u0134\u0138\3\2\2\2\u0135\u0136\f\4\2\2\u0136\u0138\5*\26\2\u0137"+ + "\u010a\3\2\2\2\u0137\u010d\3\2\2\2\u0137\u0110\3\2\2\2\u0137\u0113\3\2"+ + "\2\2\u0137\u0116\3\2\2\2\u0137\u0119\3\2\2\2\u0137\u011c\3\2\2\2\u0137"+ + "\u011f\3\2\2\2\u0137\u0122\3\2\2\2\u0137\u0125\3\2\2\2\u0137\u0128\3\2"+ + "\2\2\u0137\u012b\3\2\2\2\u0137\u012e\3\2\2\2\u0137\u0135\3\2\2\2\u0138"+ + "\u013b\3\2\2\2\u0139\u0137\3\2\2\2\u0139\u013a\3\2\2\2\u013a)\3\2\2\2"+ + "\u013b\u0139\3\2\2\2\u013c\u013d\7G\2\2\u013d\u013e\5\32\16\2\u013e+\3"+ + "\2\2\2\u013f\u0140\5> \2\u0140\u0141\5\34\17\2\u0141-\3\2\2\2\u0142\u0143"+ + "\7H\2\2\u0143\u0144\7E\2\2\u0144\u0145\5(\25\2\u0145\u0146\7F\2\2\u0146"+ + "/\3\2\2\2\u0147\u0148\5> \2\u0148\u014a\7E\2\2\u0149\u014b\5\64\33\2\u014a"+ + "\u0149\3\2\2\2\u014a\u014b\3\2\2\2\u014b\u014c\3\2\2\2\u014c\u014d\7F"+ + "\2\2\u014d\61\3\2\2\2\u014e\u014f\5> \2\u014f\u0151\7E\2\2\u0150\u0152"+ + "\5\64\33\2\u0151\u0150\3\2\2\2\u0151\u0152\3\2\2\2\u0152\u0153\3\2\2\2"+ + "\u0153\u0154\7F\2\2\u0154\63\3\2\2\2\u0155\u015d\5(\25\2\u0156\u0158\7"+ + "\20\2\2\u0157\u0159\7x\2\2\u0158\u0157\3\2\2\2\u0158\u0159\3\2\2\2\u0159"+ + "\u015a\3\2\2\2\u015a\u015c\5(\25\2\u015b\u0156\3\2\2\2\u015c\u015f\3\2"+ + "\2\2\u015d\u015b\3\2\2\2\u015d\u015e\3\2\2\2\u015e\65\3\2\2\2\u015f\u015d"+ + "\3\2\2\2\u0160\u0162\7I\2\2\u0161\u0163\5\64\33\2\u0162\u0161\3\2\2\2"+ + "\u0162\u0163\3\2\2\2\u0163\67\3\2\2\2\u0164\u0165\7J\2\2\u01659\3\2\2"+ + "\2\u0166\u0167\7K\2\2\u0167;\3\2\2\2\u0168\u0169\7y\2\2\u0169=\3\2\2\2"+ + "\u016a\u016f\7y\2\2\u016b\u016c\7L\2\2\u016c\u016e\7y\2\2\u016d\u016b"+ + "\3\2\2\2\u016e\u0171\3\2\2\2\u016f\u016d\3\2\2\2\u016f\u0170\3\2\2\2\u0170"+ + "?\3\2\2\2\u0171\u016f\3\2\2\2\u0172\u0173\t\f\2\2\u0173A\3\2\2\2\u0174"+ + "\u0175\t\r\2\2\u0175C\3\2\2\2\u0176\u0177\t\16\2\2\u0177E\3\2\2\2\u0178"+ + "\u017a\t\17\2\2\u0179\u017b\5H%\2\u017a\u0179\3\2\2\2\u017a\u017b\3\2"+ + "\2\2\u017bG\3\2\2\2\u017c\u017d\7W\2\2\u017dI\3\2\2\2\u017e\u017f\t\20"+ + "\2\2\u017fK\3\2\2\2\u0180\u0182\7\35\2\2\u0181\u0183\7x\2\2\u0182\u0181"+ + "\3\2\2\2\u0182\u0183\3\2\2\2\u0183\u0184\3\2\2\2\u0184\u018c\5(\25\2\u0185"+ + "\u0187\7\20\2\2\u0186\u0188\7x\2\2\u0187\u0186\3\2\2\2\u0187\u0188\3\2"+ + "\2\2\u0188\u0189\3\2\2\2\u0189\u018b\5(\25\2\u018a\u0185\3\2\2\2\u018b"+ + "\u018e\3\2\2\2\u018c\u018a\3\2\2\2\u018c\u018d\3\2\2\2\u018d\u0190\3\2"+ + "\2\2\u018e\u018c\3\2\2\2\u018f\u0191\7x\2\2\u0190\u018f\3\2\2\2\u0190"+ + "\u0191\3\2\2\2\u0191\u0192\3\2\2\2\u0192\u0193\7\36\2\2\u0193M\3\2\2\2"+ + "\u0194\u0195\7~\2\2\u0195O\3\2\2\2\u0196\u0197\7\u0080\2\2\u0197Q\3\2"+ + "\2\2\u0198\u0199\7}\2\2\u0199S\3\2\2\2\u019a\u01a1\5F$\2\u019b\u01a1\5"+ + "J&\2\u019c\u01a1\5L\'\2\u019d\u01a1\5N(\2\u019e\u01a1\5P)\2\u019f\u01a1"+ + "\5R*\2\u01a0\u019a\3\2\2\2\u01a0\u019b\3\2\2\2\u01a0\u019c\3\2\2\2\u01a0"+ + "\u019d\3\2\2\2\u01a0\u019e\3\2\2\2\u01a0\u019f\3\2\2\2\u01a1U\3\2\2\2"+ + "\u01a2\u01a3\7Z\2\2\u01a3\u01a4\7\177\2\2\u01a4W\3\2\2\2\u01a5\u01a6\7"+ + "[\2\2\u01a6\u01a7\5<\37\2\u01a7\u01a9\7E\2\2\u01a8\u01aa\5^\60\2\u01a9"+ + "\u01a8\3\2\2\2\u01a9\u01aa\3\2\2\2\u01aa\u01ab\3\2\2\2\u01ab\u01ad\7F"+ + "\2\2\u01ac\u01ae\5Z.\2\u01ad\u01ac\3\2\2\2\u01ad\u01ae\3\2\2\2\u01ae\u01af"+ + "\3\2\2\2\u01af\u01b0\5\\/\2\u01b0\u01b1\7x\2\2\u01b1Y\3\2\2\2\u01b2\u01b3"+ + "\7\\\2\2\u01b3\u01b4\5`\61\2\u01b4[\3\2\2\2\u01b5\u01b6\7]\2\2\u01b6\u01bb"+ + "\7x\2\2\u01b7\u01ba\5\b\5\2\u01b8\u01ba\7x\2\2\u01b9\u01b7\3\2\2\2\u01b9"+ + "\u01b8\3\2\2\2\u01ba\u01bd\3\2\2\2\u01bb\u01b9\3\2\2\2\u01bb\u01bc\3\2"+ + "\2\2\u01bc\u01be\3\2\2\2\u01bd\u01bb\3\2\2\2\u01be\u01bf\7^\2\2\u01bf"+ + "]\3\2\2\2\u01c0\u01c8\5\22\n\2\u01c1\u01c3\7\20\2\2\u01c2\u01c4\7x\2\2"+ + "\u01c3\u01c2\3\2\2\2\u01c3\u01c4\3\2\2\2\u01c4\u01c5\3\2\2\2\u01c5\u01c7"+ + "\5\22\n\2\u01c6\u01c1\3\2\2\2\u01c7\u01ca\3\2\2\2\u01c8\u01c6\3\2\2\2"+ + "\u01c8\u01c9\3\2\2\2\u01c9_\3\2\2\2\u01ca\u01c8\3\2\2\2\u01cb\u01d3\5"+ + "\32\16\2\u01cc\u01ce\7\20\2\2\u01cd\u01cf\7x\2\2\u01ce\u01cd\3\2\2\2\u01ce"+ + "\u01cf\3\2\2\2\u01cf\u01d0\3\2\2\2\u01d0\u01d2\5\32\16\2\u01d1\u01cc\3"+ + "\2\2\2\u01d2\u01d5\3\2\2\2\u01d3\u01d1\3\2\2\2\u01d3\u01d4\3\2\2\2\u01d4"+ + "a\3\2\2\2\u01d5\u01d3\3\2\2\2\u01d6\u01d7\7_\2\2\u01d7\u01d8\5<\37\2\u01d8"+ + "\u01da\7E\2\2\u01d9\u01db\5f\64\2\u01da\u01d9\3\2\2\2\u01da\u01db\3\2"+ + "\2\2\u01db\u01dc\3\2\2\2\u01dc\u01dd\7F\2\2\u01dd\u01de\7\\\2\2\u01de"+ + "\u01df\7`\2\2\u01df\u01e1\7E\2\2\u01e0\u01e2\5j\66\2\u01e1\u01e0\3\2\2"+ + "\2\u01e1\u01e2\3\2\2\2\u01e2\u01e3\3\2\2\2\u01e3\u01e4\7F\2\2\u01e4\u01e5"+ + "\7\\\2\2\u01e5\u01e7\7E\2\2\u01e6\u01e8\5l\67\2\u01e7\u01e6\3\2\2\2\u01e7"+ + "\u01e8\3\2\2\2\u01e8\u01e9\3\2\2\2\u01e9\u01ec\7F\2\2\u01ea\u01ed\5d\63"+ + "\2\u01eb\u01ed\5\\/\2\u01ec\u01ea\3\2\2\2\u01ec\u01eb\3\2\2\2\u01edc\3"+ + "\2\2\2\u01ee\u01ef\7\21\2\2\u01ef\u01f0\5F$\2\u01f0e\3\2\2\2\u01f1\u01f9"+ + "\5h\65\2\u01f2\u01f4\7\20\2\2\u01f3\u01f5\7x\2\2\u01f4\u01f3\3\2\2\2\u01f4"+ + "\u01f5\3\2\2\2\u01f5\u01f6\3\2\2\2\u01f6\u01f8\5h\65\2\u01f7\u01f2\3\2"+ + "\2\2\u01f8\u01fb\3\2\2\2\u01f9\u01f7\3\2\2\2\u01f9\u01fa\3\2\2\2\u01fa"+ + "g\3\2\2\2\u01fb\u01f9\3\2\2\2\u01fc\u01fd\5\22\n\2\u01fd\u0201\7H\2\2"+ + "\u01fe\u0202\5B\"\2\u01ff\u0202\5D#\2\u0200\u0202\7a\2\2\u0201\u01fe\3"+ + "\2\2\2\u0201\u01ff\3\2\2\2\u0201\u0200\3\2\2\2\u0202i\3\2\2\2\u0203\u0208"+ + "\5@!\2\u0204\u0205\7\20\2\2\u0205\u0207\5@!\2\u0206\u0204\3\2\2\2\u0207"+ + "\u020a\3\2\2\2\u0208\u0206\3\2\2\2\u0208\u0209\3\2\2\2\u0209k\3\2\2\2"+ + "\u020a\u0208\3\2\2\2\u020b\u0213\5n8\2\u020c\u020e\7\20\2\2\u020d\u020f"+ + "\7x\2\2\u020e\u020d\3\2\2\2\u020e\u020f\3\2\2\2\u020f\u0210\3\2\2\2\u0210"+ + "\u0212\5n8\2\u0211\u020c\3\2\2\2\u0212\u0215\3\2\2\2\u0213\u0211\3\2\2"+ + "\2\u0213\u0214\3\2\2\2\u0214m\3\2\2\2\u0215\u0213\3\2\2\2\u0216\u0217"+ + "\5\32\16\2\u0217\u021b\7H\2\2\u0218\u021c\5B\"\2\u0219\u021c\5D#\2\u021a"+ + "\u021c\7a\2\2\u021b\u0218\3\2\2\2\u021b\u0219\3\2\2\2\u021b\u021a\3\2"+ + "\2\2\u021co\3\2\2\2\u021d\u021e\7b\2\2\u021e\u0220\5(\25\2\u021f\u0221"+ + "\7x\2\2\u0220\u021f\3\2\2\2\u0220\u0221\3\2\2\2\u0221\u0224\3\2\2\2\u0222"+ + "\u0225\5\b\5\2\u0223\u0225\5\\/\2\u0224\u0222\3\2\2\2\u0224\u0223\3\2"+ + "\2\2\u0225\u0227\3\2\2\2\u0226\u0228\7x\2\2\u0227\u0226\3\2\2\2\u0227"+ + "\u0228\3\2\2\2\u0228\u022a\3\2\2\2\u0229\u022b\5r:\2\u022a\u0229\3\2\2"+ + "\2\u022a\u022b\3\2\2\2\u022bq\3\2\2\2\u022c\u022e\7c\2\2\u022d\u022f\7"+ + "x\2\2\u022e\u022d\3\2\2\2\u022e\u022f\3\2\2\2\u022f\u0232\3\2\2\2\u0230"+ + "\u0233\5\b\5\2\u0231\u0233\5\\/\2\u0232\u0230\3\2\2\2\u0232\u0231\3\2"+ + "\2\2\u0233s\3\2\2\2\u0234\u0236\5v<\2\u0235\u0237\7x\2\2\u0236\u0235\3"+ + "\2\2\2\u0236\u0237\3\2\2\2\u0237\u023a\3\2\2\2\u0238\u023b\5\b\5\2\u0239"+ + "\u023b\5\\/\2\u023a\u0238\3\2\2\2\u023a\u0239\3\2\2\2\u023b\u023d\3\2"+ + "\2\2\u023c\u023e\7x\2\2\u023d\u023c\3\2\2\2\u023d\u023e\3\2\2\2\u023e"+ + "\u0240\3\2\2\2\u023f\u0241\5r:\2\u0240\u023f\3\2\2\2\u0240\u0241\3\2\2"+ + "\2\u0241\u0242\3\2\2\2\u0242\u0243\7x\2\2\u0243u\3\2\2\2\u0244\u0245\t"+ + "\21\2\2\u0245w\3\2\2\2\u0246\u0248\7p\2\2\u0247\u0249\5\32\16\2\u0248"+ + "\u0247\3\2\2\2\u0248\u0249\3\2\2\2\u0249\u024c\3\2\2\2\u024a\u024d\5@"+ + "!\2\u024b\u024d\5<\37\2\u024c\u024a\3\2\2\2\u024c\u024b\3\2\2\2\u024d"+ + "\u024e\3\2\2\2\u024e\u024f\7q\2\2\u024f\u0251\5(\25\2\u0250\u0252\7x\2"+ + "\2\u0251\u0250\3\2\2\2\u0251\u0252\3\2\2\2\u0252\u0253\3\2\2\2\u0253\u0254"+ + "\5\\/\2\u0254y\3\2\2\2\u0255\u0256\7r\2\2\u0256\u0258\5(\25\2\u0257\u0259"+ + "\7x\2\2\u0258\u0257\3\2\2\2\u0258\u0259\3\2\2\2\u0259\u025c\3\2\2\2\u025a"+ + "\u025d\5\b\5\2\u025b\u025d\5\\/\2\u025c\u025a\3\2\2\2\u025c\u025b\3\2"+ + "\2\2\u025d{\3\2\2\2\u025e\u0261\7s\2\2\u025f\u0262\5\b\5\2\u0260\u0262"+ + "\5\\/\2\u0261\u025f\3\2\2\2\u0261\u0260\3\2\2\2\u0262\u0264\3\2\2\2\u0263"+ + "\u0265\7x\2\2\u0264\u0263\3\2\2\2\u0264\u0265\3\2\2\2\u0265\u0266\3\2"+ + "\2\2\u0266\u0267\7t\2\2\u0267\u0268\5(\25\2\u0268}\3\2\2\2D\u0080\u0082"+ + "\u0089\u008e\u00a9\u00b1\u00b5\u00bc\u00bf\u00c4\u00c8\u00ce\u00e9\u00f4"+ + "\u0108\u0133\u0137\u0139\u014a\u0151\u0158\u015d\u0162\u016f\u017a\u0182"+ + "\u0187\u018c\u0190\u01a0\u01a9\u01ad\u01b9\u01bb\u01c3\u01c8\u01ce\u01d3"+ + "\u01da\u01e1\u01e7\u01ec\u01f4\u01f9\u0201\u0208\u020e\u0213\u021b\u0220"+ + "\u0224\u0227\u022a\u022e\u0232\u0236\u023a\u023d\u0240\u0248\u024c\u0251"+ + "\u0258\u025c\u0261\u0264"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/compiler/src/prog8/stackvm/StackVm.kt b/compiler/src/prog8/stackvm/StackVm.kt index cf39f9cc1..594381dbe 100644 --- a/compiler/src/prog8/stackvm/StackVm.kt +++ b/compiler/src/prog8/stackvm/StackVm.kt @@ -585,6 +585,12 @@ class StackVm(private var traceOutputFile: String?) { checkDt(v, DataType.WORD) evalstack.push(v.shr()) } + Opcode.SHIFTEDL_BYTE -> TODO() + Opcode.SHIFTEDL_WORD -> TODO() + Opcode.SHIFTEDR_UBYTE -> TODO() + Opcode.SHIFTEDR_SBYTE -> TODO() + Opcode.SHIFTEDR_UWORD -> TODO() + Opcode.SHIFTEDR_SWORD -> TODO() Opcode.ROL_BYTE -> { val v = evalstack.pop() checkDt(v, DataType.UBYTE) diff --git a/docs/source/syntaxreference.rst b/docs/source/syntaxreference.rst index b2c4e38ec..fc6cfd683 100644 --- a/docs/source/syntaxreference.rst +++ b/docs/source/syntaxreference.rst @@ -369,14 +369,15 @@ arithmetic: ``+`` ``-`` ``*`` ``/`` ``//`` ``**`` ``%`` Remainder is only supported on integer operands (not floats). -bitwise arithmetic: ``&`` ``|`` ``^`` ``~`` +bitwise arithmetic: ``&`` ``|`` ``^`` ``~`` ``<<`` ``>>`` ``&`` is bitwise and, ``|`` is bitwise or, ``^`` is bitwise xor, ``~`` is bitwise invert (this one is an unary operator) + ``<<`` is bitwise left shift and ``>>`` is bitwise right shift (both will not change the datatype of the value) assignment: ``=`` Sets the target on the LHS (left hand side) of the operator to the value of the expression on the RHS (right hand side). Note that an assignment sometimes is not possible or supported. -augmented assignment: ``+=`` ``-=`` ``*=`` ``/=`` ``**=`` ``&=`` ``|=`` ``^=`` +augmented assignment: ``+=`` ``-=`` ``*=`` ``/=`` ``**=`` ``&=`` ``|=`` ``^=`` ``<<=`` ``>>=`` Syntactic sugar; ``A += X`` is equivalent to ``A = A + X`` postfix increment and decrement: ``++`` ``--``