1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2024-08-02 09:29:35 +00:00

Allowing location to be any expression that ends up being constant. Changed syntax for kickasm directives.

This commit is contained in:
Jesper Gravgaard 2018-07-25 20:09:12 +09:00
parent 19855bed21
commit ae765bec6b
20 changed files with 1245 additions and 1367 deletions

View File

@ -240,6 +240,7 @@ public class Compiler {
private void pass3Analysis() {
new Pass3AssertRValues(program).check();
new Pass3AssertConstants(program).check();
new Pass3AssertArrayLengths(program).check();
new Pass3AssertNoMulDivMod(program).check();
new Pass3BlockSequencePlanner(program).plan();

View File

@ -22,7 +22,7 @@ public abstract class ProgramValue {
public static class ConstantVariableValue extends ProgramValue {
private final ConstantVar constantVar;
public ConstantVariableValue(ConstantVar constantVar) {
ConstantVariableValue(ConstantVar constantVar) {
this.constantVar = constantVar;
}
@ -42,7 +42,7 @@ public abstract class ProgramValue {
public static class TypeArraySize extends ProgramValue {
private final SymbolTypeArray array;
public TypeArraySize(SymbolTypeArray array) {
TypeArraySize(SymbolTypeArray array) {
this.array = array;
}
@ -202,6 +202,29 @@ public abstract class ProgramValue {
}
/** Location inside inline kickasm code. */
public static class KickAsmLocation extends ProgramValue {
private StatementKickAsm statementKickAsm;
KickAsmLocation(StatementKickAsm statementKickAsm) {
super();
this.statementKickAsm = statementKickAsm;
}
@Override
public RValue get() {
return statementKickAsm.getLocation();
}
@Override
public void set(RValue value) {
statementKickAsm.setLocation(value);
}
}
/**
* LValue as part of an assignment statement (or a call).
*/
@ -276,7 +299,7 @@ public abstract class ProgramValue {
private final dk.camelot64.kickc.model.values.ConstantCastValue castValue;
public ConstantCastValue(dk.camelot64.kickc.model.values.ConstantCastValue castValue) {
ConstantCastValue(dk.camelot64.kickc.model.values.ConstantCastValue castValue) {
this.castValue = castValue;
}
@ -299,7 +322,7 @@ public abstract class ProgramValue {
private final ConstantVarPointer varPointer;
public VarPointer(ConstantVarPointer varPointer) {
VarPointer(ConstantVarPointer varPointer) {
this.varPointer = varPointer;
}
@ -319,7 +342,7 @@ public abstract class ProgramValue {
private final ConstantArrayList arrayList;
private final int idx;
public ConstantArrayElement(ConstantArrayList arrayList, int idx) {
ConstantArrayElement(ConstantArrayList arrayList, int idx) {
this.arrayList = arrayList;
this.idx = idx;
}
@ -339,7 +362,7 @@ public abstract class ProgramValue {
private ValueList list;
private int idx;
public ListElement(ValueList list, int idx) {
ListElement(ValueList list, int idx) {
this.list = list;
this.idx = idx;
}
@ -418,7 +441,7 @@ public abstract class ProgramValue {
private final StatementCall call;
private final int i;
public CallParameter(StatementCall call, int i) {
CallParameter(StatementCall call, int i) {
this.call = call;
this.i = i;
}
@ -492,7 +515,7 @@ public abstract class ProgramValue {
private final StatementPhiBlock.PhiVariable phiVariable;
private final int i;
public PhiValue(StatementPhiBlock.PhiVariable phiVariable, int i) {
PhiValue(StatementPhiBlock.PhiVariable phiVariable, int i) {
this.phiVariable = phiVariable;
this.i = i;
}
@ -545,7 +568,8 @@ public abstract class ProgramValue {
@Override
public void set(RValue value) {
this.rValue = (ConstantValue) value;
this.rValue = value;
}
}
}

View File

@ -119,6 +119,12 @@ public class ProgramValueIterator {
}
execute(new ProgramValue.PhiVariable(phiVariable), handler, statement, statementsIt, block);
}
} else if(statement instanceof StatementKickAsm) {
StatementKickAsm statementKickAsm = (StatementKickAsm) statement;
RValue location = statementKickAsm.getLocation();
if(location!=null) {
execute(new ProgramValue.KickAsmLocation(statementKickAsm), handler, statement, statementsIt, block);
}
}
}

View File

@ -1,6 +1,7 @@
package dk.camelot64.kickc.model.statements;
import dk.camelot64.kickc.model.Program;
import dk.camelot64.kickc.model.values.RValue;
/** Inline KickAssembler code */
public class StatementKickAsm extends StatementBase {
@ -9,31 +10,37 @@ public class StatementKickAsm extends StatementBase {
private String kickAsmCode;
/** The absolute address to generate the kick-assembler code at. If null it is generated inline. */
private Long location;
private RValue location;
public StatementKickAsm(String kickAsmCode, StatementSource source) {
super(null, source);
this.kickAsmCode = kickAsmCode;
}
public StatementKickAsm(String kickAsmCode, Long location, StatementSource source) {
public StatementKickAsm(String kickAsmCode, RValue location, StatementSource source) {
super(null, source);
this.kickAsmCode = kickAsmCode;
this.location = location;
}
public Long getLocation() {
public RValue getLocation() {
return location;
}
public void setLocation(Long location) {
public void setLocation(RValue location) {
this.location = location;
}
@Override
public String toString(Program program, boolean aliveInfo) {
StringBuilder txt = new StringBuilder();
txt.append("kickasm {{ ");
txt.append("kickasm");
if(location!=null) {
txt.append("(location ");
txt.append(location.toString(program));
txt.append(")");
}
txt.append(" {{ ");
txt.append(kickAsmCode);
txt.append(" }}");
return txt.toString();

View File

@ -36,28 +36,20 @@ declFunction
;
declKasm
: 'kickasm' kasmParams? KICKASM
: 'kickasm' kasmDirectives? KICKASM
;
kasmParams
: '(' kasmParam ( ';' kasmParam )* ')'
kasmDirectives
: '(' kasmDirective ( ',' kasmDirective )* ')'
;
kasmParam
: 'resources' kasmResourceList #kasmParamResources
| 'clobber' STRING #kasmParamClobber
| 'param' kasmParamList #kasmParamTransfer
| 'bytes' NUMBER #kasmParamBytes
| 'cycles' NUMBER #kasmParamCycles
| 'location' ( 'inline' | NUMBER ) #kasmParamLocation
;
kasmResourceList
: STRING ( ',' STRING )*
;
kasmParamList
: NAME ':' expr ( ',' NAME ':' expr )*
kasmDirective
: 'resource' STRING #kasmDirectiveResource
| 'clobber' STRING #kasmDirectiveClobber
| 'param' NAME ':' expr #kasmDirectiveTransfer
| 'bytes' NUMBER #kasmDirectiveBytes
| 'cycles' NUMBER #kasmDirectiveCycles
| 'location' ( 'inline' | expr ) #kasmDirectiveLocation
;
parameterListDecl

View File

@ -92,15 +92,15 @@ COMMENT_BLOCK=86
'{'=6
'}'=7
'kickasm'=8
'resources'=9
'clobber'=10
'param'=11
'bytes'=12
'cycles'=13
'location'=14
'inline'=15
','=16
':'=17
','=9
'resource'=10
'clobber'=11
'param'=12
':'=13
'bytes'=14
'cycles'=15
'location'=16
'inline'=17
'const'=18
'extern'=19
'align'=20

View File

@ -124,109 +124,85 @@ public class KickCBaseListener implements KickCListener {
*
* <p>The default implementation does nothing.</p>
*/
@Override public void enterKasmParams(KickCParser.KasmParamsContext ctx) { }
@Override public void enterKasmDirectives(KickCParser.KasmDirectivesContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void exitKasmParams(KickCParser.KasmParamsContext ctx) { }
@Override public void exitKasmDirectives(KickCParser.KasmDirectivesContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void enterKasmParamResources(KickCParser.KasmParamResourcesContext ctx) { }
@Override public void enterKasmDirectiveResource(KickCParser.KasmDirectiveResourceContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void exitKasmParamResources(KickCParser.KasmParamResourcesContext ctx) { }
@Override public void exitKasmDirectiveResource(KickCParser.KasmDirectiveResourceContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void enterKasmParamClobber(KickCParser.KasmParamClobberContext ctx) { }
@Override public void enterKasmDirectiveClobber(KickCParser.KasmDirectiveClobberContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void exitKasmParamClobber(KickCParser.KasmParamClobberContext ctx) { }
@Override public void exitKasmDirectiveClobber(KickCParser.KasmDirectiveClobberContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void enterKasmParamTransfer(KickCParser.KasmParamTransferContext ctx) { }
@Override public void enterKasmDirectiveTransfer(KickCParser.KasmDirectiveTransferContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void exitKasmParamTransfer(KickCParser.KasmParamTransferContext ctx) { }
@Override public void exitKasmDirectiveTransfer(KickCParser.KasmDirectiveTransferContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void enterKasmParamBytes(KickCParser.KasmParamBytesContext ctx) { }
@Override public void enterKasmDirectiveBytes(KickCParser.KasmDirectiveBytesContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void exitKasmParamBytes(KickCParser.KasmParamBytesContext ctx) { }
@Override public void exitKasmDirectiveBytes(KickCParser.KasmDirectiveBytesContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void enterKasmParamCycles(KickCParser.KasmParamCyclesContext ctx) { }
@Override public void enterKasmDirectiveCycles(KickCParser.KasmDirectiveCyclesContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void exitKasmParamCycles(KickCParser.KasmParamCyclesContext ctx) { }
@Override public void exitKasmDirectiveCycles(KickCParser.KasmDirectiveCyclesContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void enterKasmParamLocation(KickCParser.KasmParamLocationContext ctx) { }
@Override public void enterKasmDirectiveLocation(KickCParser.KasmDirectiveLocationContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void exitKasmParamLocation(KickCParser.KasmParamLocationContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void enterKasmResourceList(KickCParser.KasmResourceListContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void exitKasmResourceList(KickCParser.KasmResourceListContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void enterKasmParamList(KickCParser.KasmParamListContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void exitKasmParamList(KickCParser.KasmParamListContext ctx) { }
@Override public void exitKasmDirectiveLocation(KickCParser.KasmDirectiveLocationContext ctx) { }
/**
* {@inheritDoc}
*

View File

@ -80,63 +80,49 @@ public class KickCBaseVisitor<T> extends AbstractParseTreeVisitor<T> implements
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitKasmParams(KickCParser.KasmParamsContext ctx) { return visitChildren(ctx); }
@Override public T visitKasmDirectives(KickCParser.KasmDirectivesContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitKasmParamResources(KickCParser.KasmParamResourcesContext ctx) { return visitChildren(ctx); }
@Override public T visitKasmDirectiveResource(KickCParser.KasmDirectiveResourceContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitKasmParamClobber(KickCParser.KasmParamClobberContext ctx) { return visitChildren(ctx); }
@Override public T visitKasmDirectiveClobber(KickCParser.KasmDirectiveClobberContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitKasmParamTransfer(KickCParser.KasmParamTransferContext ctx) { return visitChildren(ctx); }
@Override public T visitKasmDirectiveTransfer(KickCParser.KasmDirectiveTransferContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitKasmParamBytes(KickCParser.KasmParamBytesContext ctx) { return visitChildren(ctx); }
@Override public T visitKasmDirectiveBytes(KickCParser.KasmDirectiveBytesContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitKasmParamCycles(KickCParser.KasmParamCyclesContext ctx) { return visitChildren(ctx); }
@Override public T visitKasmDirectiveCycles(KickCParser.KasmDirectiveCyclesContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitKasmParamLocation(KickCParser.KasmParamLocationContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitKasmResourceList(KickCParser.KasmResourceListContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitKasmParamList(KickCParser.KasmParamListContext ctx) { return visitChildren(ctx); }
@Override public T visitKasmDirectiveLocation(KickCParser.KasmDirectiveLocationContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*

View File

@ -55,8 +55,8 @@ public class KickCLexer extends Lexer {
private static final String[] _LITERAL_NAMES = {
null, "'import'", "'='", "';'", "'('", "')'", "'{'", "'}'", "'kickasm'",
"'resources'", "'clobber'", "'param'", "'bytes'", "'cycles'", "'location'",
"'inline'", "','", "':'", "'const'", "'extern'", "'align'", "'register'",
"','", "'resource'", "'clobber'", "'param'", "':'", "'bytes'", "'cycles'",
"'location'", "'inline'", "'const'", "'extern'", "'align'", "'register'",
"'if'", "'else'", "'while'", "'do'", "'for'", "'return'", "'asm'", "'..'",
"'signed'", "'*'", "'['", "']'", "'--'", "'++'", "'+'", "'-'", "'!'",
"'&'", "'~'", "'>>'", "'<<'", "'/'", "'%'", "'<'", "'>'", "'=='", "'!='",
@ -132,7 +132,7 @@ public class KickCLexer extends Lexer {
public ATN getATN() { return _ATN; }
public static final String _serializedATN =
"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2X\u0373\b\1\4\2\t"+
"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2X\u0372\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"+
@ -144,10 +144,10 @@ public class KickCLexer extends Lexer {
"\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\\\3\2\3\2\3\2\3\2\3\2"+
"\3\2\3\2\3\3\3\3\3\4\3\4\3\5\3\5\3\6\3\6\3\7\3\7\3\b\3\b\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\n\3\n\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\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\17\3\17\3\17\3\17\3\17\3\17"+
"\3\17\3\17\3\17\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\21\3\21\3\22\3\22"+
"\t\3\t\3\t\3\t\3\t\3\n\3\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13"+
"\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3\r\3\r\3\16\3\16\3\17"+
"\3\17\3\17\3\17\3\17\3\17\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\21\3\21"+
"\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\22\3\22\3\22\3\22\3\22\3\22\3\22"+
"\3\23\3\23\3\23\3\23\3\23\3\23\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\25"+
"\3\25\3\25\3\25\3\25\3\25\3\26\3\26\3\26\3\26\3\26\3\26\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\3\31\3\31\3\31"+
@ -167,21 +167,21 @@ public class KickCLexer extends Lexer {
"D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3"+
"D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3"+
"D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3"+
"D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\5D\u0294\nD\3E\3E\3E\3E\7E\u029a"+
"\nE\fE\16E\u029d\13E\3E\3E\3E\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3"+
"F\3F\3F\3F\3F\3F\3F\3F\5F\u02b7\nF\3G\3G\3G\3G\7G\u02bd\nG\fG\16G\u02c0"+
"\13G\3G\3G\3H\3H\3H\3H\5H\u02c8\nH\3H\3H\3I\3I\3I\3I\3I\3I\3I\3I\3I\5"+
"I\u02d5\nI\3J\3J\5J\u02d9\nJ\3K\3K\3K\5K\u02de\nK\3L\3L\3L\3L\3L\5L\u02e5"+
"\nL\3L\7L\u02e8\nL\fL\16L\u02eb\13L\3L\3L\6L\u02ef\nL\rL\16L\u02f0\3M"+
"\7M\u02f4\nM\fM\16M\u02f7\13M\3M\3M\6M\u02fb\nM\rM\16M\u02fc\3N\3N\3N"+
"\3N\3N\5N\u0304\nN\3N\7N\u0307\nN\fN\16N\u030a\13N\3N\3N\6N\u030e\nN\r"+
"N\16N\u030f\3O\3O\3O\5O\u0315\nO\3P\3P\3P\6P\u031a\nP\rP\16P\u031b\3P"+
"\3P\6P\u0320\nP\rP\16P\u0321\5P\u0324\nP\3Q\6Q\u0327\nQ\rQ\16Q\u0328\3"+
"R\3R\3R\3R\3R\5R\u0330\nR\3R\6R\u0333\nR\rR\16R\u0334\3S\3S\3T\3T\3U\3"+
"U\3V\3V\7V\u033f\nV\fV\16V\u0342\13V\3W\3W\3X\3X\3Y\3Y\7Y\u034a\nY\fY"+
"\16Y\u034d\13Y\3Y\6Y\u0350\nY\rY\16Y\u0351\3Z\6Z\u0355\nZ\rZ\16Z\u0356"+
"\3Z\3Z\3[\3[\3[\3[\7[\u035f\n[\f[\16[\u0362\13[\3[\3[\3\\\3\\\3\\\3\\"+
"\7\\\u036a\n\\\f\\\16\\\u036d\13\\\3\\\3\\\3\\\3\\\3\\\4\u029b\u036b\2"+
"D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\5D\u0293\nD\3E\3E\3E\3E\7E\u0299"+
"\nE\fE\16E\u029c\13E\3E\3E\3E\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3"+
"F\3F\3F\3F\3F\3F\3F\3F\5F\u02b6\nF\3G\3G\3G\3G\7G\u02bc\nG\fG\16G\u02bf"+
"\13G\3G\3G\3H\3H\3H\3H\5H\u02c7\nH\3H\3H\3I\3I\3I\3I\3I\3I\3I\3I\3I\5"+
"I\u02d4\nI\3J\3J\5J\u02d8\nJ\3K\3K\3K\5K\u02dd\nK\3L\3L\3L\3L\3L\5L\u02e4"+
"\nL\3L\7L\u02e7\nL\fL\16L\u02ea\13L\3L\3L\6L\u02ee\nL\rL\16L\u02ef\3M"+
"\7M\u02f3\nM\fM\16M\u02f6\13M\3M\3M\6M\u02fa\nM\rM\16M\u02fb\3N\3N\3N"+
"\3N\3N\5N\u0303\nN\3N\7N\u0306\nN\fN\16N\u0309\13N\3N\3N\6N\u030d\nN\r"+
"N\16N\u030e\3O\3O\3O\5O\u0314\nO\3P\3P\3P\6P\u0319\nP\rP\16P\u031a\3P"+
"\3P\6P\u031f\nP\rP\16P\u0320\5P\u0323\nP\3Q\6Q\u0326\nQ\rQ\16Q\u0327\3"+
"R\3R\3R\3R\3R\5R\u032f\nR\3R\6R\u0332\nR\rR\16R\u0333\3S\3S\3T\3T\3U\3"+
"U\3V\3V\7V\u033e\nV\fV\16V\u0341\13V\3W\3W\3X\3X\3Y\3Y\7Y\u0349\nY\fY"+
"\16Y\u034c\13Y\3Y\6Y\u034f\nY\rY\16Y\u0350\3Z\6Z\u0354\nZ\rZ\16Z\u0355"+
"\3Z\3Z\3[\3[\3[\3[\7[\u035e\n[\f[\16[\u0361\13[\3[\3[\3\\\3\\\3\\\3\\"+
"\7\\\u0369\n\\\f\\\16\\\u036c\13\\\3\\\3\\\3\\\3\\\3\\\4\u029a\u036a\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\67m8o"+
@ -190,7 +190,7 @@ public class KickCLexer extends Lexer {
"R\u00a3S\u00a5\2\u00a7\2\u00a9\2\u00abT\u00ad\2\u00af\2\u00b1U\u00b3V"+
"\u00b5W\u00b7X\3\2\r\3\2$$\3\2))\4\2DDdd\3\2\62\63\3\2\62;\5\2\62;CHc"+
"h\5\2C\\aac|\6\2\62;C\\aac|\4\2--//\5\2\13\f\17\17\"\"\4\2\f\f\17\17\2"+
"\u03db\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"+
"\u03da\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"+
@ -207,27 +207,27 @@ public class KickCLexer extends Lexer {
"\2\2\u009f\3\2\2\2\2\u00a1\3\2\2\2\2\u00a3\3\2\2\2\2\u00ab\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\3\u00b9\3\2\2"+
"\2\5\u00c0\3\2\2\2\7\u00c2\3\2\2\2\t\u00c4\3\2\2\2\13\u00c6\3\2\2\2\r"+
"\u00c8\3\2\2\2\17\u00ca\3\2\2\2\21\u00cc\3\2\2\2\23\u00d4\3\2\2\2\25\u00de"+
"\3\2\2\2\27\u00e6\3\2\2\2\31\u00ec\3\2\2\2\33\u00f2\3\2\2\2\35\u00f9\3"+
"\2\2\2\37\u0102\3\2\2\2!\u0109\3\2\2\2#\u010b\3\2\2\2%\u010d\3\2\2\2\'"+
"\u0113\3\2\2\2)\u011a\3\2\2\2+\u0120\3\2\2\2-\u0129\3\2\2\2/\u012c\3\2"+
"\2\2\61\u0131\3\2\2\2\63\u0137\3\2\2\2\65\u013a\3\2\2\2\67\u013e\3\2\2"+
"\29\u0145\3\2\2\2;\u0149\3\2\2\2=\u014c\3\2\2\2?\u0153\3\2\2\2A\u0155"+
"\3\2\2\2C\u0157\3\2\2\2E\u0159\3\2\2\2G\u015c\3\2\2\2I\u015f\3\2\2\2K"+
"\u0161\3\2\2\2M\u0163\3\2\2\2O\u0165\3\2\2\2Q\u0167\3\2\2\2S\u0169\3\2"+
"\2\2U\u016c\3\2\2\2W\u016f\3\2\2\2Y\u0171\3\2\2\2[\u0173\3\2\2\2]\u0175"+
"\3\2\2\2_\u0177\3\2\2\2a\u017a\3\2\2\2c\u017d\3\2\2\2e\u0180\3\2\2\2g"+
"\u0183\3\2\2\2i\u0185\3\2\2\2k\u0187\3\2\2\2m\u018a\3\2\2\2o\u018d\3\2"+
"\2\2q\u0190\3\2\2\2s\u0193\3\2\2\2u\u0196\3\2\2\2w\u0199\3\2\2\2y\u019c"+
"\3\2\2\2{\u01a0\3\2\2\2}\u01a4\3\2\2\2\177\u01a7\3\2\2\2\u0081\u01aa\3"+
"\2\2\2\u0083\u01ad\3\2\2\2\u0085\u01b3\3\2\2\2\u0087\u0293\3\2\2\2\u0089"+
"\u0295\3\2\2\2\u008b\u02b6\3\2\2\2\u008d\u02b8\3\2\2\2\u008f\u02c3\3\2"+
"\2\2\u0091\u02d4\3\2\2\2\u0093\u02d8\3\2\2\2\u0095\u02dd\3\2\2\2\u0097"+
"\u02e4\3\2\2\2\u0099\u02f5\3\2\2\2\u009b\u0303\3\2\2\2\u009d\u0314\3\2"+
"\2\2\u009f\u0323\3\2\2\2\u00a1\u0326\3\2\2\2\u00a3\u032f\3\2\2\2\u00a5"+
"\u0336\3\2\2\2\u00a7\u0338\3\2\2\2\u00a9\u033a\3\2\2\2\u00ab\u033c\3\2"+
"\2\2\u00ad\u0343\3\2\2\2\u00af\u0345\3\2\2\2\u00b1\u0347\3\2\2\2\u00b3"+
"\u0354\3\2\2\2\u00b5\u035a\3\2\2\2\u00b7\u0365\3\2\2\2\u00b9\u00ba\7k"+
"\u00c8\3\2\2\2\17\u00ca\3\2\2\2\21\u00cc\3\2\2\2\23\u00d4\3\2\2\2\25\u00d6"+
"\3\2\2\2\27\u00df\3\2\2\2\31\u00e7\3\2\2\2\33\u00ed\3\2\2\2\35\u00ef\3"+
"\2\2\2\37\u00f5\3\2\2\2!\u00fc\3\2\2\2#\u0105\3\2\2\2%\u010c\3\2\2\2\'"+
"\u0112\3\2\2\2)\u0119\3\2\2\2+\u011f\3\2\2\2-\u0128\3\2\2\2/\u012b\3\2"+
"\2\2\61\u0130\3\2\2\2\63\u0136\3\2\2\2\65\u0139\3\2\2\2\67\u013d\3\2\2"+
"\29\u0144\3\2\2\2;\u0148\3\2\2\2=\u014b\3\2\2\2?\u0152\3\2\2\2A\u0154"+
"\3\2\2\2C\u0156\3\2\2\2E\u0158\3\2\2\2G\u015b\3\2\2\2I\u015e\3\2\2\2K"+
"\u0160\3\2\2\2M\u0162\3\2\2\2O\u0164\3\2\2\2Q\u0166\3\2\2\2S\u0168\3\2"+
"\2\2U\u016b\3\2\2\2W\u016e\3\2\2\2Y\u0170\3\2\2\2[\u0172\3\2\2\2]\u0174"+
"\3\2\2\2_\u0176\3\2\2\2a\u0179\3\2\2\2c\u017c\3\2\2\2e\u017f\3\2\2\2g"+
"\u0182\3\2\2\2i\u0184\3\2\2\2k\u0186\3\2\2\2m\u0189\3\2\2\2o\u018c\3\2"+
"\2\2q\u018f\3\2\2\2s\u0192\3\2\2\2u\u0195\3\2\2\2w\u0198\3\2\2\2y\u019b"+
"\3\2\2\2{\u019f\3\2\2\2}\u01a3\3\2\2\2\177\u01a6\3\2\2\2\u0081\u01a9\3"+
"\2\2\2\u0083\u01ac\3\2\2\2\u0085\u01b2\3\2\2\2\u0087\u0292\3\2\2\2\u0089"+
"\u0294\3\2\2\2\u008b\u02b5\3\2\2\2\u008d\u02b7\3\2\2\2\u008f\u02c2\3\2"+
"\2\2\u0091\u02d3\3\2\2\2\u0093\u02d7\3\2\2\2\u0095\u02dc\3\2\2\2\u0097"+
"\u02e3\3\2\2\2\u0099\u02f4\3\2\2\2\u009b\u0302\3\2\2\2\u009d\u0313\3\2"+
"\2\2\u009f\u0322\3\2\2\2\u00a1\u0325\3\2\2\2\u00a3\u032e\3\2\2\2\u00a5"+
"\u0335\3\2\2\2\u00a7\u0337\3\2\2\2\u00a9\u0339\3\2\2\2\u00ab\u033b\3\2"+
"\2\2\u00ad\u0342\3\2\2\2\u00af\u0344\3\2\2\2\u00b1\u0346\3\2\2\2\u00b3"+
"\u0353\3\2\2\2\u00b5\u0359\3\2\2\2\u00b7\u0364\3\2\2\2\u00b9\u00ba\7k"+
"\2\2\u00ba\u00bb\7o\2\2\u00bb\u00bc\7r\2\2\u00bc\u00bd\7q\2\2\u00bd\u00be"+
"\7t\2\2\u00be\u00bf\7v\2\2\u00bf\4\3\2\2\2\u00c0\u00c1\7?\2\2\u00c1\6"+
"\3\2\2\2\u00c2\u00c3\7=\2\2\u00c3\b\3\2\2\2\u00c4\u00c5\7*\2\2\u00c5\n"+
@ -235,222 +235,222 @@ public class KickCLexer extends Lexer {
"\3\2\2\2\u00ca\u00cb\7\177\2\2\u00cb\20\3\2\2\2\u00cc\u00cd\7m\2\2\u00cd"+
"\u00ce\7k\2\2\u00ce\u00cf\7e\2\2\u00cf\u00d0\7m\2\2\u00d0\u00d1\7c\2\2"+
"\u00d1\u00d2\7u\2\2\u00d2\u00d3\7o\2\2\u00d3\22\3\2\2\2\u00d4\u00d5\7"+
"t\2\2\u00d5\u00d6\7g\2\2\u00d6\u00d7\7u\2\2\u00d7\u00d8\7q\2\2\u00d8\u00d9"+
"\7w\2\2\u00d9\u00da\7t\2\2\u00da\u00db\7e\2\2\u00db\u00dc\7g\2\2\u00dc"+
"\u00dd\7u\2\2\u00dd\24\3\2\2\2\u00de\u00df\7e\2\2\u00df\u00e0\7n\2\2\u00e0"+
"\u00e1\7q\2\2\u00e1\u00e2\7d\2\2\u00e2\u00e3\7d\2\2\u00e3\u00e4\7g\2\2"+
"\u00e4\u00e5\7t\2\2\u00e5\26\3\2\2\2\u00e6\u00e7\7r\2\2\u00e7\u00e8\7"+
"c\2\2\u00e8\u00e9\7t\2\2\u00e9\u00ea\7c\2\2\u00ea\u00eb\7o\2\2\u00eb\30"+
"\3\2\2\2\u00ec\u00ed\7d\2\2\u00ed\u00ee\7{\2\2\u00ee\u00ef\7v\2\2\u00ef"+
"\u00f0\7g\2\2\u00f0\u00f1\7u\2\2\u00f1\32\3\2\2\2\u00f2\u00f3\7e\2\2\u00f3"+
"\u00f4\7{\2\2\u00f4\u00f5\7e\2\2\u00f5\u00f6\7n\2\2\u00f6\u00f7\7g\2\2"+
"\u00f7\u00f8\7u\2\2\u00f8\34\3\2\2\2\u00f9\u00fa\7n\2\2\u00fa\u00fb\7"+
"q\2\2\u00fb\u00fc\7e\2\2\u00fc\u00fd\7c\2\2\u00fd\u00fe\7v\2\2\u00fe\u00ff"+
"\7k\2\2\u00ff\u0100\7q\2\2\u0100\u0101\7p\2\2\u0101\36\3\2\2\2\u0102\u0103"+
"\7k\2\2\u0103\u0104\7p\2\2\u0104\u0105\7n\2\2\u0105\u0106\7k\2\2\u0106"+
"\u0107\7p\2\2\u0107\u0108\7g\2\2\u0108 \3\2\2\2\u0109\u010a\7.\2\2\u010a"+
"\"\3\2\2\2\u010b\u010c\7<\2\2\u010c$\3\2\2\2\u010d\u010e\7e\2\2\u010e"+
"\u010f\7q\2\2\u010f\u0110\7p\2\2\u0110\u0111\7u\2\2\u0111\u0112\7v\2\2"+
"\u0112&\3\2\2\2\u0113\u0114\7g\2\2\u0114\u0115\7z\2\2\u0115\u0116\7v\2"+
"\2\u0116\u0117\7g\2\2\u0117\u0118\7t\2\2\u0118\u0119\7p\2\2\u0119(\3\2"+
"\2\2\u011a\u011b\7c\2\2\u011b\u011c\7n\2\2\u011c\u011d\7k\2\2\u011d\u011e"+
"\7i\2\2\u011e\u011f\7p\2\2\u011f*\3\2\2\2\u0120\u0121\7t\2\2\u0121\u0122"+
"\7g\2\2\u0122\u0123\7i\2\2\u0123\u0124\7k\2\2\u0124\u0125\7u\2\2\u0125"+
"\u0126\7v\2\2\u0126\u0127\7g\2\2\u0127\u0128\7t\2\2\u0128,\3\2\2\2\u0129"+
"\u012a\7k\2\2\u012a\u012b\7h\2\2\u012b.\3\2\2\2\u012c\u012d\7g\2\2\u012d"+
"\u012e\7n\2\2\u012e\u012f\7u\2\2\u012f\u0130\7g\2\2\u0130\60\3\2\2\2\u0131"+
"\u0132\7y\2\2\u0132\u0133\7j\2\2\u0133\u0134\7k\2\2\u0134\u0135\7n\2\2"+
"\u0135\u0136\7g\2\2\u0136\62\3\2\2\2\u0137\u0138\7f\2\2\u0138\u0139\7"+
"q\2\2\u0139\64\3\2\2\2\u013a\u013b\7h\2\2\u013b\u013c\7q\2\2\u013c\u013d"+
"\7t\2\2\u013d\66\3\2\2\2\u013e\u013f\7t\2\2\u013f\u0140\7g\2\2\u0140\u0141"+
"\7v\2\2\u0141\u0142\7w\2\2\u0142\u0143\7t\2\2\u0143\u0144\7p\2\2\u0144"+
"8\3\2\2\2\u0145\u0146\7c\2\2\u0146\u0147\7u\2\2\u0147\u0148\7o\2\2\u0148"+
":\3\2\2\2\u0149\u014a\7\60\2\2\u014a\u014b\7\60\2\2\u014b<\3\2\2\2\u014c"+
"\u014d\7u\2\2\u014d\u014e\7k\2\2\u014e\u014f\7i\2\2\u014f\u0150\7p\2\2"+
"\u0150\u0151\7g\2\2\u0151\u0152\7f\2\2\u0152>\3\2\2\2\u0153\u0154\7,\2"+
"\2\u0154@\3\2\2\2\u0155\u0156\7]\2\2\u0156B\3\2\2\2\u0157\u0158\7_\2\2"+
"\u0158D\3\2\2\2\u0159\u015a\7/\2\2\u015a\u015b\7/\2\2\u015bF\3\2\2\2\u015c"+
"\u015d\7-\2\2\u015d\u015e\7-\2\2\u015eH\3\2\2\2\u015f\u0160\7-\2\2\u0160"+
"J\3\2\2\2\u0161\u0162\7/\2\2\u0162L\3\2\2\2\u0163\u0164\7#\2\2\u0164N"+
"\3\2\2\2\u0165\u0166\7(\2\2\u0166P\3\2\2\2\u0167\u0168\7\u0080\2\2\u0168"+
"R\3\2\2\2\u0169\u016a\7@\2\2\u016a\u016b\7@\2\2\u016bT\3\2\2\2\u016c\u016d"+
"\7>\2\2\u016d\u016e\7>\2\2\u016eV\3\2\2\2\u016f\u0170\7\61\2\2\u0170X"+
"\3\2\2\2\u0171\u0172\7\'\2\2\u0172Z\3\2\2\2\u0173\u0174\7>\2\2\u0174\\"+
"\3\2\2\2\u0175\u0176\7@\2\2\u0176^\3\2\2\2\u0177\u0178\7?\2\2\u0178\u0179"+
"\7?\2\2\u0179`\3\2\2\2\u017a\u017b\7#\2\2\u017b\u017c\7?\2\2\u017cb\3"+
"\2\2\2\u017d\u017e\7>\2\2\u017e\u017f\7?\2\2\u017fd\3\2\2\2\u0180\u0181"+
"\7@\2\2\u0181\u0182\7?\2\2\u0182f\3\2\2\2\u0183\u0184\7`\2\2\u0184h\3"+
"\2\2\2\u0185\u0186\7~\2\2\u0186j\3\2\2\2\u0187\u0188\7(\2\2\u0188\u0189"+
"\7(\2\2\u0189l\3\2\2\2\u018a\u018b\7~\2\2\u018b\u018c\7~\2\2\u018cn\3"+
"\2\2\2\u018d\u018e\7-\2\2\u018e\u018f\7?\2\2\u018fp\3\2\2\2\u0190\u0191"+
"\7/\2\2\u0191\u0192\7?\2\2\u0192r\3\2\2\2\u0193\u0194\7,\2\2\u0194\u0195"+
"\7?\2\2\u0195t\3\2\2\2\u0196\u0197\7\61\2\2\u0197\u0198\7?\2\2\u0198v"+
"\3\2\2\2\u0199\u019a\7\'\2\2\u019a\u019b\7?\2\2\u019bx\3\2\2\2\u019c\u019d"+
"\7>\2\2\u019d\u019e\7>\2\2\u019e\u019f\7?\2\2\u019fz\3\2\2\2\u01a0\u01a1"+
"\7@\2\2\u01a1\u01a2\7@\2\2\u01a2\u01a3\7?\2\2\u01a3|\3\2\2\2\u01a4\u01a5"+
"\7(\2\2\u01a5\u01a6\7?\2\2\u01a6~\3\2\2\2\u01a7\u01a8\7~\2\2\u01a8\u01a9"+
"\7?\2\2\u01a9\u0080\3\2\2\2\u01aa\u01ab\7`\2\2\u01ab\u01ac\7?\2\2\u01ac"+
"\u0082\3\2\2\2\u01ad\u01ae\7\60\2\2\u01ae\u01af\7d\2\2\u01af\u01b0\7{"+
"\2\2\u01b0\u01b1\7v\2\2\u01b1\u01b2\7g\2\2\u01b2\u0084\3\2\2\2\u01b3\u01b4"+
"\7%\2\2\u01b4\u0086\3\2\2\2\u01b5\u01b6\7d\2\2\u01b6\u01b7\7t\2\2\u01b7"+
"\u0294\7m\2\2\u01b8\u01b9\7q\2\2\u01b9\u01ba\7t\2\2\u01ba\u0294\7c\2\2"+
"\u01bb\u01bc\7m\2\2\u01bc\u01bd\7k\2\2\u01bd\u0294\7n\2\2\u01be\u01bf"+
"\7u\2\2\u01bf\u01c0\7n\2\2\u01c0\u0294\7q\2\2\u01c1\u01c2\7p\2\2\u01c2"+
"\u01c3\7q\2\2\u01c3\u0294\7r\2\2\u01c4\u01c5\7c\2\2\u01c5\u01c6\7u\2\2"+
"\u01c6\u0294\7n\2\2\u01c7\u01c8\7r\2\2\u01c8\u01c9\7j\2\2\u01c9\u0294"+
"\7r\2\2\u01ca\u01cb\7c\2\2\u01cb\u01cc\7p\2\2\u01cc\u0294\7e\2\2\u01cd"+
"\u01ce\7d\2\2\u01ce\u01cf\7r\2\2\u01cf\u0294\7n\2\2\u01d0\u01d1\7e\2\2"+
"\u01d1\u01d2\7n\2\2\u01d2\u0294\7e\2\2\u01d3\u01d4\7l\2\2\u01d4\u01d5"+
"\7u\2\2\u01d5\u0294\7t\2\2\u01d6\u01d7\7c\2\2\u01d7\u01d8\7p\2\2\u01d8"+
"\u0294\7f\2\2\u01d9\u01da\7t\2\2\u01da\u01db\7n\2\2\u01db\u0294\7c\2\2"+
"\u01dc\u01dd\7d\2\2\u01dd\u01de\7k\2\2\u01de\u0294\7v\2\2\u01df\u01e0"+
"\7t\2\2\u01e0\u01e1\7q\2\2\u01e1\u0294\7n\2\2\u01e2\u01e3\7r\2\2\u01e3"+
"\u01e4\7n\2\2\u01e4\u0294\7c\2\2\u01e5\u01e6\7r\2\2\u01e6\u01e7\7n\2\2"+
"\u01e7\u0294\7r\2\2\u01e8\u01e9\7d\2\2\u01e9\u01ea\7o\2\2\u01ea\u0294"+
"\7k\2\2\u01eb\u01ec\7u\2\2\u01ec\u01ed\7g\2\2\u01ed\u0294\7e\2\2\u01ee"+
"\u01ef\7t\2\2\u01ef\u01f0\7v\2\2\u01f0\u0294\7k\2\2\u01f1\u01f2\7g\2\2"+
"\u01f2\u01f3\7q\2\2\u01f3\u0294\7t\2\2\u01f4\u01f5\7u\2\2\u01f5\u01f6"+
"\7t\2\2\u01f6\u0294\7g\2\2\u01f7\u01f8\7n\2\2\u01f8\u01f9\7u\2\2\u01f9"+
"\u0294\7t\2\2\u01fa\u01fb\7r\2\2\u01fb\u01fc\7j\2\2\u01fc\u0294\7c\2\2"+
"\u01fd\u01fe\7c\2\2\u01fe\u01ff\7n\2\2\u01ff\u0294\7t\2\2\u0200\u0201"+
"\7l\2\2\u0201\u0202\7o\2\2\u0202\u0294\7r\2\2\u0203\u0204\7d\2\2\u0204"+
"\u0205\7x\2\2\u0205\u0294\7e\2\2\u0206\u0207\7e\2\2\u0207\u0208\7n\2\2"+
"\u0208\u0294\7k\2\2\u0209\u020a\7t\2\2\u020a\u020b\7v\2\2\u020b\u0294"+
"\7u\2\2\u020c\u020d\7c\2\2\u020d\u020e\7f\2\2\u020e\u0294\7e\2\2\u020f"+
"\u0210\7t\2\2\u0210\u0211\7t\2\2\u0211\u0294\7c\2\2\u0212\u0213\7d\2\2"+
"\u0213\u0214\7x\2\2\u0214\u0294\7u\2\2\u0215\u0216\7u\2\2\u0216\u0217"+
"\7g\2\2\u0217\u0294\7k\2\2\u0218\u0219\7u\2\2\u0219\u021a\7c\2\2\u021a"+
"\u0294\7z\2\2\u021b\u021c\7u\2\2\u021c\u021d\7v\2\2\u021d\u0294\7{\2\2"+
"\u021e\u021f\7u\2\2\u021f\u0220\7v\2\2\u0220\u0294\7c\2\2\u0221\u0222"+
"\7u\2\2\u0222\u0223\7v\2\2\u0223\u0294\7z\2\2\u0224\u0225\7f\2\2\u0225"+
"\u0226\7g\2\2\u0226\u0294\7{\2\2\u0227\u0228\7v\2\2\u0228\u0229\7z\2\2"+
"\u0229\u0294\7c\2\2\u022a\u022b\7z\2\2\u022b\u022c\7c\2\2\u022c\u0294"+
"\7c\2\2\u022d\u022e\7d\2\2\u022e\u022f\7e\2\2\u022f\u0294\7e\2\2\u0230"+
"\u0231\7c\2\2\u0231\u0232\7j\2\2\u0232\u0294\7z\2\2\u0233\u0234\7v\2\2"+
"\u0234\u0235\7{\2\2\u0235\u0294\7c\2\2\u0236\u0237\7v\2\2\u0237\u0238"+
"\7z\2\2\u0238\u0294\7u\2\2\u0239\u023a\7v\2\2\u023a\u023b\7c\2\2\u023b"+
"\u0294\7u\2\2\u023c\u023d\7u\2\2\u023d\u023e\7j\2\2\u023e\u0294\7{\2\2"+
"\u023f\u0240\7u\2\2\u0240\u0241\7j\2\2\u0241\u0294\7z\2\2\u0242\u0243"+
"\7n\2\2\u0243\u0244\7f\2\2\u0244\u0294\7{\2\2\u0245\u0246\7n\2\2\u0246"+
"\u0247\7f\2\2\u0247\u0294\7c\2\2\u0248\u0249\7n\2\2\u0249\u024a\7f\2\2"+
"\u024a\u0294\7z\2\2\u024b\u024c\7n\2\2\u024c\u024d\7c\2\2\u024d\u0294"+
"\7z\2\2\u024e\u024f\7v\2\2\u024f\u0250\7c\2\2\u0250\u0294\7{\2\2\u0251"+
"\u0252\7v\2\2\u0252\u0253\7c\2\2\u0253\u0294\7z\2\2\u0254\u0255\7d\2\2"+
"\u0255\u0256\7e\2\2\u0256\u0294\7u\2\2\u0257\u0258\7e\2\2\u0258\u0259"+
"\7n\2\2\u0259\u0294\7x\2\2\u025a\u025b\7v\2\2\u025b\u025c\7u\2\2\u025c"+
"\u0294\7z\2\2\u025d\u025e\7n\2\2\u025e\u025f\7c\2\2\u025f\u0294\7u\2\2"+
"\u0260\u0261\7e\2\2\u0261\u0262\7r\2\2\u0262\u0294\7{\2\2\u0263\u0264"+
"\7e\2\2\u0264\u0265\7o\2\2\u0265\u0294\7r\2\2\u0266\u0267\7e\2\2\u0267"+
"\u0268\7r\2\2\u0268\u0294\7z\2\2\u0269\u026a\7f\2\2\u026a\u026b\7e\2\2"+
"\u026b\u0294\7r\2\2\u026c\u026d\7f\2\2\u026d\u026e\7g\2\2\u026e\u0294"+
"\7e\2\2\u026f\u0270\7k\2\2\u0270\u0271\7p\2\2\u0271\u0294\7e\2\2\u0272"+
"\u0273\7c\2\2\u0273\u0274\7z\2\2\u0274\u0294\7u\2\2\u0275\u0276\7d\2\2"+
"\u0276\u0277\7p\2\2\u0277\u0294\7g\2\2\u0278\u0279\7e\2\2\u0279\u027a"+
"\7n\2\2\u027a\u0294\7f\2\2\u027b\u027c\7u\2\2\u027c\u027d\7d\2\2\u027d"+
"\u0294\7e\2\2\u027e\u027f\7k\2\2\u027f\u0280\7u\2\2\u0280\u0294\7e\2\2"+
"\u0281\u0282\7k\2\2\u0282\u0283\7p\2\2\u0283\u0294\7z\2\2\u0284\u0285"+
"\7d\2\2\u0285\u0286\7g\2\2\u0286\u0294\7s\2\2\u0287\u0288\7u\2\2\u0288"+
"\u0289\7g\2\2\u0289\u0294\7f\2\2\u028a\u028b\7f\2\2\u028b\u028c\7g\2\2"+
"\u028c\u0294\7z\2\2\u028d\u028e\7k\2\2\u028e\u028f\7p\2\2\u028f\u0294"+
"\7{\2\2\u0290\u0291\7t\2\2\u0291\u0292\7q\2\2\u0292\u0294\7t\2\2\u0293"+
"\u01b5\3\2\2\2\u0293\u01b8\3\2\2\2\u0293\u01bb\3\2\2\2\u0293\u01be\3\2"+
"\2\2\u0293\u01c1\3\2\2\2\u0293\u01c4\3\2\2\2\u0293\u01c7\3\2\2\2\u0293"+
"\u01ca\3\2\2\2\u0293\u01cd\3\2\2\2\u0293\u01d0\3\2\2\2\u0293\u01d3\3\2"+
"\2\2\u0293\u01d6\3\2\2\2\u0293\u01d9\3\2\2\2\u0293\u01dc\3\2\2\2\u0293"+
"\u01df\3\2\2\2\u0293\u01e2\3\2\2\2\u0293\u01e5\3\2\2\2\u0293\u01e8\3\2"+
"\2\2\u0293\u01eb\3\2\2\2\u0293\u01ee\3\2\2\2\u0293\u01f1\3\2\2\2\u0293"+
"\u01f4\3\2\2\2\u0293\u01f7\3\2\2\2\u0293\u01fa\3\2\2\2\u0293\u01fd\3\2"+
"\2\2\u0293\u0200\3\2\2\2\u0293\u0203\3\2\2\2\u0293\u0206\3\2\2\2\u0293"+
"\u0209\3\2\2\2\u0293\u020c\3\2\2\2\u0293\u020f\3\2\2\2\u0293\u0212\3\2"+
"\2\2\u0293\u0215\3\2\2\2\u0293\u0218\3\2\2\2\u0293\u021b\3\2\2\2\u0293"+
"\u021e\3\2\2\2\u0293\u0221\3\2\2\2\u0293\u0224\3\2\2\2\u0293\u0227\3\2"+
"\2\2\u0293\u022a\3\2\2\2\u0293\u022d\3\2\2\2\u0293\u0230\3\2\2\2\u0293"+
"\u0233\3\2\2\2\u0293\u0236\3\2\2\2\u0293\u0239\3\2\2\2\u0293\u023c\3\2"+
"\2\2\u0293\u023f\3\2\2\2\u0293\u0242\3\2\2\2\u0293\u0245\3\2\2\2\u0293"+
"\u0248\3\2\2\2\u0293\u024b\3\2\2\2\u0293\u024e\3\2\2\2\u0293\u0251\3\2"+
"\2\2\u0293\u0254\3\2\2\2\u0293\u0257\3\2\2\2\u0293\u025a\3\2\2\2\u0293"+
"\u025d\3\2\2\2\u0293\u0260\3\2\2\2\u0293\u0263\3\2\2\2\u0293\u0266\3\2"+
"\2\2\u0293\u0269\3\2\2\2\u0293\u026c\3\2\2\2\u0293\u026f\3\2\2\2\u0293"+
"\u0272\3\2\2\2\u0293\u0275\3\2\2\2\u0293\u0278\3\2\2\2\u0293\u027b\3\2"+
"\2\2\u0293\u027e\3\2\2\2\u0293\u0281\3\2\2\2\u0293\u0284\3\2\2\2\u0293"+
"\u0287\3\2\2\2\u0293\u028a\3\2\2\2\u0293\u028d\3\2\2\2\u0293\u0290\3\2"+
"\2\2\u0294\u0088\3\2\2\2\u0295\u0296\7}\2\2\u0296\u0297\7}\2\2\u0297\u029b"+
"\3\2\2\2\u0298\u029a\13\2\2\2\u0299\u0298\3\2\2\2\u029a\u029d\3\2\2\2"+
"\u029b\u029c\3\2\2\2\u029b\u0299\3\2\2\2\u029c\u029e\3\2\2\2\u029d\u029b"+
"\3\2\2\2\u029e\u029f\7\177\2\2\u029f\u02a0\7\177\2\2\u02a0\u008a\3\2\2"+
"\2\u02a1\u02a2\7d\2\2\u02a2\u02a3\7{\2\2\u02a3\u02a4\7v\2\2\u02a4\u02b7"+
"\7g\2\2\u02a5\u02a6\7y\2\2\u02a6\u02a7\7q\2\2\u02a7\u02a8\7t\2\2\u02a8"+
"\u02b7\7f\2\2\u02a9\u02aa\7f\2\2\u02aa\u02ab\7y\2\2\u02ab\u02ac\7q\2\2"+
"\u02ac\u02ad\7t\2\2\u02ad\u02b7\7f\2\2\u02ae\u02af\7d\2\2\u02af\u02b0"+
"\7q\2\2\u02b0\u02b1\7q\2\2\u02b1\u02b7\7n\2\2\u02b2\u02b3\7x\2\2\u02b3"+
"\u02b4\7q\2\2\u02b4\u02b5\7k\2\2\u02b5\u02b7\7f\2\2\u02b6\u02a1\3\2\2"+
"\2\u02b6\u02a5\3\2\2\2\u02b6\u02a9\3\2\2\2\u02b6\u02ae\3\2\2\2\u02b6\u02b2"+
"\3\2\2\2\u02b7\u008c\3\2\2\2\u02b8\u02be\7$\2\2\u02b9\u02ba\7^\2\2\u02ba"+
"\u02bd\7$\2\2\u02bb\u02bd\n\2\2\2\u02bc\u02b9\3\2\2\2\u02bc\u02bb\3\2"+
"\2\2\u02bd\u02c0\3\2\2\2\u02be\u02bc\3\2\2\2\u02be\u02bf\3\2\2\2\u02bf"+
"\u02c1\3\2\2\2\u02c0\u02be\3\2\2\2\u02c1\u02c2\7$\2\2\u02c2\u008e\3\2"+
"\2\2\u02c3\u02c7\7)\2\2\u02c4\u02c5\7^\2\2\u02c5\u02c8\7)\2\2\u02c6\u02c8"+
"\n\3\2\2\u02c7\u02c4\3\2\2\2\u02c7\u02c6\3\2\2\2\u02c8\u02c9\3\2\2\2\u02c9"+
"\u02ca\7)\2\2\u02ca\u0090\3\2\2\2\u02cb\u02cc\7v\2\2\u02cc\u02cd\7t\2"+
"\2\u02cd\u02ce\7w\2\2\u02ce\u02d5\7g\2\2\u02cf\u02d0\7h\2\2\u02d0\u02d1"+
"\7c\2\2\u02d1\u02d2\7n\2\2\u02d2\u02d3\7u\2\2\u02d3\u02d5\7g\2\2\u02d4"+
"\u02cb\3\2\2\2\u02d4\u02cf\3\2\2\2\u02d5\u0092\3\2\2\2\u02d6\u02d9\5\u0095"+
"K\2\u02d7\u02d9\5\u009dO\2\u02d8\u02d6\3\2\2\2\u02d8\u02d7\3\2\2\2\u02d9"+
"\u0094\3\2\2\2\u02da\u02de\5\u0097L\2\u02db\u02de\5\u0099M\2\u02dc\u02de"+
"\5\u009bN\2\u02dd\u02da\3\2\2\2\u02dd\u02db\3\2\2\2\u02dd\u02dc\3\2\2"+
"\2\u02de\u0096\3\2\2\2\u02df\u02e5\7\'\2\2\u02e0\u02e1\7\62\2\2\u02e1"+
"\u02e5\7d\2\2\u02e2\u02e3\7\62\2\2\u02e3\u02e5\7D\2\2\u02e4\u02df\3\2"+
"\2\2\u02e4\u02e0\3\2\2\2\u02e4\u02e2\3\2\2\2\u02e5\u02e9\3\2\2\2\u02e6"+
"\u02e8\5\u00a5S\2\u02e7\u02e6\3\2\2\2\u02e8\u02eb\3\2\2\2\u02e9\u02e7"+
"\3\2\2\2\u02e9\u02ea\3\2\2\2\u02ea\u02ec\3\2\2\2\u02eb\u02e9\3\2\2\2\u02ec"+
"\u02ee\7\60\2\2\u02ed\u02ef\5\u00a5S\2\u02ee\u02ed\3\2\2\2\u02ef\u02f0"+
"\3\2\2\2\u02f0\u02ee\3\2\2\2\u02f0\u02f1\3\2\2\2\u02f1\u0098\3\2\2\2\u02f2"+
"\u02f4\5\u00a7T\2\u02f3\u02f2\3\2\2\2\u02f4\u02f7\3\2\2\2\u02f5\u02f3"+
"\3\2\2\2\u02f5\u02f6\3\2\2\2\u02f6\u02f8\3\2\2\2\u02f7\u02f5\3\2\2\2\u02f8"+
"\u02fa\7\60\2\2\u02f9\u02fb\5\u00a7T\2\u02fa\u02f9\3\2\2\2\u02fb\u02fc"+
"\3\2\2\2\u02fc\u02fa\3\2\2\2\u02fc\u02fd\3\2\2\2\u02fd\u009a\3\2\2\2\u02fe"+
"\u0304\7&\2\2\u02ff\u0300\7\62\2\2\u0300\u0304\7z\2\2\u0301\u0302\7\62"+
"\2\2\u0302\u0304\7Z\2\2\u0303\u02fe\3\2\2\2\u0303\u02ff\3\2\2\2\u0303"+
"\u0301\3\2\2\2\u0304\u0308\3\2\2\2\u0305\u0307\5\u00a9U\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\u030d\7\60\2\2\u030c\u030e\5"+
"\u00a9U\2\u030d\u030c\3\2\2\2\u030e\u030f\3\2\2\2\u030f\u030d\3\2\2\2"+
"\u030f\u0310\3\2\2\2\u0310\u009c\3\2\2\2\u0311\u0315\5\u00a1Q\2\u0312"+
"\u0315\5\u00a3R\2\u0313\u0315\5\u009fP\2\u0314\u0311\3\2\2\2\u0314\u0312"+
"\3\2\2\2\u0314\u0313\3\2\2\2\u0315\u009e\3\2\2\2\u0316\u0317\7\62\2\2"+
"\u0317\u0319\t\4\2\2\u0318\u031a\5\u00a5S\2\u0319\u0318\3\2\2\2\u031a"+
"\u031b\3\2\2\2\u031b\u0319\3\2\2\2\u031b\u031c\3\2\2\2\u031c\u0324\3\2"+
"\2\2\u031d\u031f\7\'\2\2\u031e\u0320\5\u00a5S\2\u031f\u031e\3\2\2\2\u0320"+
"\u0321\3\2\2\2\u0321\u031f\3\2\2\2\u0321\u0322\3\2\2\2\u0322\u0324\3\2"+
"\2\2\u0323\u0316\3\2\2\2\u0323\u031d\3\2\2\2\u0324\u00a0\3\2\2\2\u0325"+
"\u0327\5\u00a7T\2\u0326\u0325\3\2\2\2\u0327\u0328\3\2\2\2\u0328\u0326"+
"\3\2\2\2\u0328\u0329\3\2\2\2\u0329\u00a2\3\2\2\2\u032a\u0330\7&\2\2\u032b"+
"\u032c\7\62\2\2\u032c\u0330\7z\2\2\u032d\u032e\7\62\2\2\u032e\u0330\7"+
"Z\2\2\u032f\u032a\3\2\2\2\u032f\u032b\3\2\2\2\u032f\u032d\3\2\2\2\u0330"+
"\u0332\3\2\2\2\u0331\u0333\5\u00a9U\2\u0332\u0331\3\2\2\2\u0333\u0334"+
"\3\2\2\2\u0334\u0332\3\2\2\2\u0334\u0335\3\2\2\2\u0335\u00a4\3\2\2\2\u0336"+
"\u0337\t\5\2\2\u0337\u00a6\3\2\2\2\u0338\u0339\t\6\2\2\u0339\u00a8\3\2"+
"\2\2\u033a\u033b\t\7\2\2\u033b\u00aa\3\2\2\2\u033c\u0340\5\u00adW\2\u033d"+
"\u033f\5\u00afX\2\u033e\u033d\3\2\2\2\u033f\u0342\3\2\2\2\u0340\u033e"+
"\3\2\2\2\u0340\u0341\3\2\2\2\u0341\u00ac\3\2\2\2\u0342\u0340\3\2\2\2\u0343"+
"\u0344\t\b\2\2\u0344\u00ae\3\2\2\2\u0345\u0346\t\t\2\2\u0346\u00b0\3\2"+
"\2\2\u0347\u034b\7#\2\2\u0348\u034a\5\u00afX\2\u0349\u0348\3\2\2\2\u034a"+
"\u034d\3\2\2\2\u034b\u0349\3\2\2\2\u034b\u034c\3\2\2\2\u034c\u034f\3\2"+
"\2\2\u034d\u034b\3\2\2\2\u034e\u0350\t\n\2\2\u034f\u034e\3\2\2\2\u0350"+
"\u0351\3\2\2\2\u0351\u034f\3\2\2\2\u0351\u0352\3\2\2\2\u0352\u00b2\3\2"+
"\2\2\u0353\u0355\t\13\2\2\u0354\u0353\3\2\2\2\u0355\u0356\3\2\2\2\u0356"+
"\u0354\3\2\2\2\u0356\u0357\3\2\2\2\u0357\u0358\3\2\2\2\u0358\u0359\bZ"+
"\2\2\u0359\u00b4\3\2\2\2\u035a\u035b\7\61\2\2\u035b\u035c\7\61\2\2\u035c"+
"\u0360\3\2\2\2\u035d\u035f\n\f\2\2\u035e\u035d\3\2\2\2\u035f\u0362\3\2"+
"\2\2\u0360\u035e\3\2\2\2\u0360\u0361\3\2\2\2\u0361\u0363\3\2\2\2\u0362"+
"\u0360\3\2\2\2\u0363\u0364\b[\2\2\u0364\u00b6\3\2\2\2\u0365\u0366\7\61"+
"\2\2\u0366\u0367\7,\2\2\u0367\u036b\3\2\2\2\u0368\u036a\13\2\2\2\u0369"+
"\u0368\3\2\2\2\u036a\u036d\3\2\2\2\u036b\u036c\3\2\2\2\u036b\u0369\3\2"+
"\2\2\u036c\u036e\3\2\2\2\u036d\u036b\3\2\2\2\u036e\u036f\7,\2\2\u036f"+
"\u0370\7\61\2\2\u0370\u0371\3\2\2\2\u0371\u0372\b\\\2\2\u0372\u00b8\3"+
"\2\2\2!\2\u0293\u029b\u02b6\u02bc\u02be\u02c7\u02d4\u02d8\u02dd\u02e4"+
"\u02e9\u02f0\u02f5\u02fc\u0303\u0308\u030f\u0314\u031b\u0321\u0323\u0328"+
"\u032f\u0334\u0340\u034b\u0351\u0356\u0360\u036b\3\b\2\2";
".\2\2\u00d5\24\3\2\2\2\u00d6\u00d7\7t\2\2\u00d7\u00d8\7g\2\2\u00d8\u00d9"+
"\7u\2\2\u00d9\u00da\7q\2\2\u00da\u00db\7w\2\2\u00db\u00dc\7t\2\2\u00dc"+
"\u00dd\7e\2\2\u00dd\u00de\7g\2\2\u00de\26\3\2\2\2\u00df\u00e0\7e\2\2\u00e0"+
"\u00e1\7n\2\2\u00e1\u00e2\7q\2\2\u00e2\u00e3\7d\2\2\u00e3\u00e4\7d\2\2"+
"\u00e4\u00e5\7g\2\2\u00e5\u00e6\7t\2\2\u00e6\30\3\2\2\2\u00e7\u00e8\7"+
"r\2\2\u00e8\u00e9\7c\2\2\u00e9\u00ea\7t\2\2\u00ea\u00eb\7c\2\2\u00eb\u00ec"+
"\7o\2\2\u00ec\32\3\2\2\2\u00ed\u00ee\7<\2\2\u00ee\34\3\2\2\2\u00ef\u00f0"+
"\7d\2\2\u00f0\u00f1\7{\2\2\u00f1\u00f2\7v\2\2\u00f2\u00f3\7g\2\2\u00f3"+
"\u00f4\7u\2\2\u00f4\36\3\2\2\2\u00f5\u00f6\7e\2\2\u00f6\u00f7\7{\2\2\u00f7"+
"\u00f8\7e\2\2\u00f8\u00f9\7n\2\2\u00f9\u00fa\7g\2\2\u00fa\u00fb\7u\2\2"+
"\u00fb \3\2\2\2\u00fc\u00fd\7n\2\2\u00fd\u00fe\7q\2\2\u00fe\u00ff\7e\2"+
"\2\u00ff\u0100\7c\2\2\u0100\u0101\7v\2\2\u0101\u0102\7k\2\2\u0102\u0103"+
"\7q\2\2\u0103\u0104\7p\2\2\u0104\"\3\2\2\2\u0105\u0106\7k\2\2\u0106\u0107"+
"\7p\2\2\u0107\u0108\7n\2\2\u0108\u0109\7k\2\2\u0109\u010a\7p\2\2\u010a"+
"\u010b\7g\2\2\u010b$\3\2\2\2\u010c\u010d\7e\2\2\u010d\u010e\7q\2\2\u010e"+
"\u010f\7p\2\2\u010f\u0110\7u\2\2\u0110\u0111\7v\2\2\u0111&\3\2\2\2\u0112"+
"\u0113\7g\2\2\u0113\u0114\7z\2\2\u0114\u0115\7v\2\2\u0115\u0116\7g\2\2"+
"\u0116\u0117\7t\2\2\u0117\u0118\7p\2\2\u0118(\3\2\2\2\u0119\u011a\7c\2"+
"\2\u011a\u011b\7n\2\2\u011b\u011c\7k\2\2\u011c\u011d\7i\2\2\u011d\u011e"+
"\7p\2\2\u011e*\3\2\2\2\u011f\u0120\7t\2\2\u0120\u0121\7g\2\2\u0121\u0122"+
"\7i\2\2\u0122\u0123\7k\2\2\u0123\u0124\7u\2\2\u0124\u0125\7v\2\2\u0125"+
"\u0126\7g\2\2\u0126\u0127\7t\2\2\u0127,\3\2\2\2\u0128\u0129\7k\2\2\u0129"+
"\u012a\7h\2\2\u012a.\3\2\2\2\u012b\u012c\7g\2\2\u012c\u012d\7n\2\2\u012d"+
"\u012e\7u\2\2\u012e\u012f\7g\2\2\u012f\60\3\2\2\2\u0130\u0131\7y\2\2\u0131"+
"\u0132\7j\2\2\u0132\u0133\7k\2\2\u0133\u0134\7n\2\2\u0134\u0135\7g\2\2"+
"\u0135\62\3\2\2\2\u0136\u0137\7f\2\2\u0137\u0138\7q\2\2\u0138\64\3\2\2"+
"\2\u0139\u013a\7h\2\2\u013a\u013b\7q\2\2\u013b\u013c\7t\2\2\u013c\66\3"+
"\2\2\2\u013d\u013e\7t\2\2\u013e\u013f\7g\2\2\u013f\u0140\7v\2\2\u0140"+
"\u0141\7w\2\2\u0141\u0142\7t\2\2\u0142\u0143\7p\2\2\u01438\3\2\2\2\u0144"+
"\u0145\7c\2\2\u0145\u0146\7u\2\2\u0146\u0147\7o\2\2\u0147:\3\2\2\2\u0148"+
"\u0149\7\60\2\2\u0149\u014a\7\60\2\2\u014a<\3\2\2\2\u014b\u014c\7u\2\2"+
"\u014c\u014d\7k\2\2\u014d\u014e\7i\2\2\u014e\u014f\7p\2\2\u014f\u0150"+
"\7g\2\2\u0150\u0151\7f\2\2\u0151>\3\2\2\2\u0152\u0153\7,\2\2\u0153@\3"+
"\2\2\2\u0154\u0155\7]\2\2\u0155B\3\2\2\2\u0156\u0157\7_\2\2\u0157D\3\2"+
"\2\2\u0158\u0159\7/\2\2\u0159\u015a\7/\2\2\u015aF\3\2\2\2\u015b\u015c"+
"\7-\2\2\u015c\u015d\7-\2\2\u015dH\3\2\2\2\u015e\u015f\7-\2\2\u015fJ\3"+
"\2\2\2\u0160\u0161\7/\2\2\u0161L\3\2\2\2\u0162\u0163\7#\2\2\u0163N\3\2"+
"\2\2\u0164\u0165\7(\2\2\u0165P\3\2\2\2\u0166\u0167\7\u0080\2\2\u0167R"+
"\3\2\2\2\u0168\u0169\7@\2\2\u0169\u016a\7@\2\2\u016aT\3\2\2\2\u016b\u016c"+
"\7>\2\2\u016c\u016d\7>\2\2\u016dV\3\2\2\2\u016e\u016f\7\61\2\2\u016fX"+
"\3\2\2\2\u0170\u0171\7\'\2\2\u0171Z\3\2\2\2\u0172\u0173\7>\2\2\u0173\\"+
"\3\2\2\2\u0174\u0175\7@\2\2\u0175^\3\2\2\2\u0176\u0177\7?\2\2\u0177\u0178"+
"\7?\2\2\u0178`\3\2\2\2\u0179\u017a\7#\2\2\u017a\u017b\7?\2\2\u017bb\3"+
"\2\2\2\u017c\u017d\7>\2\2\u017d\u017e\7?\2\2\u017ed\3\2\2\2\u017f\u0180"+
"\7@\2\2\u0180\u0181\7?\2\2\u0181f\3\2\2\2\u0182\u0183\7`\2\2\u0183h\3"+
"\2\2\2\u0184\u0185\7~\2\2\u0185j\3\2\2\2\u0186\u0187\7(\2\2\u0187\u0188"+
"\7(\2\2\u0188l\3\2\2\2\u0189\u018a\7~\2\2\u018a\u018b\7~\2\2\u018bn\3"+
"\2\2\2\u018c\u018d\7-\2\2\u018d\u018e\7?\2\2\u018ep\3\2\2\2\u018f\u0190"+
"\7/\2\2\u0190\u0191\7?\2\2\u0191r\3\2\2\2\u0192\u0193\7,\2\2\u0193\u0194"+
"\7?\2\2\u0194t\3\2\2\2\u0195\u0196\7\61\2\2\u0196\u0197\7?\2\2\u0197v"+
"\3\2\2\2\u0198\u0199\7\'\2\2\u0199\u019a\7?\2\2\u019ax\3\2\2\2\u019b\u019c"+
"\7>\2\2\u019c\u019d\7>\2\2\u019d\u019e\7?\2\2\u019ez\3\2\2\2\u019f\u01a0"+
"\7@\2\2\u01a0\u01a1\7@\2\2\u01a1\u01a2\7?\2\2\u01a2|\3\2\2\2\u01a3\u01a4"+
"\7(\2\2\u01a4\u01a5\7?\2\2\u01a5~\3\2\2\2\u01a6\u01a7\7~\2\2\u01a7\u01a8"+
"\7?\2\2\u01a8\u0080\3\2\2\2\u01a9\u01aa\7`\2\2\u01aa\u01ab\7?\2\2\u01ab"+
"\u0082\3\2\2\2\u01ac\u01ad\7\60\2\2\u01ad\u01ae\7d\2\2\u01ae\u01af\7{"+
"\2\2\u01af\u01b0\7v\2\2\u01b0\u01b1\7g\2\2\u01b1\u0084\3\2\2\2\u01b2\u01b3"+
"\7%\2\2\u01b3\u0086\3\2\2\2\u01b4\u01b5\7d\2\2\u01b5\u01b6\7t\2\2\u01b6"+
"\u0293\7m\2\2\u01b7\u01b8\7q\2\2\u01b8\u01b9\7t\2\2\u01b9\u0293\7c\2\2"+
"\u01ba\u01bb\7m\2\2\u01bb\u01bc\7k\2\2\u01bc\u0293\7n\2\2\u01bd\u01be"+
"\7u\2\2\u01be\u01bf\7n\2\2\u01bf\u0293\7q\2\2\u01c0\u01c1\7p\2\2\u01c1"+
"\u01c2\7q\2\2\u01c2\u0293\7r\2\2\u01c3\u01c4\7c\2\2\u01c4\u01c5\7u\2\2"+
"\u01c5\u0293\7n\2\2\u01c6\u01c7\7r\2\2\u01c7\u01c8\7j\2\2\u01c8\u0293"+
"\7r\2\2\u01c9\u01ca\7c\2\2\u01ca\u01cb\7p\2\2\u01cb\u0293\7e\2\2\u01cc"+
"\u01cd\7d\2\2\u01cd\u01ce\7r\2\2\u01ce\u0293\7n\2\2\u01cf\u01d0\7e\2\2"+
"\u01d0\u01d1\7n\2\2\u01d1\u0293\7e\2\2\u01d2\u01d3\7l\2\2\u01d3\u01d4"+
"\7u\2\2\u01d4\u0293\7t\2\2\u01d5\u01d6\7c\2\2\u01d6\u01d7\7p\2\2\u01d7"+
"\u0293\7f\2\2\u01d8\u01d9\7t\2\2\u01d9\u01da\7n\2\2\u01da\u0293\7c\2\2"+
"\u01db\u01dc\7d\2\2\u01dc\u01dd\7k\2\2\u01dd\u0293\7v\2\2\u01de\u01df"+
"\7t\2\2\u01df\u01e0\7q\2\2\u01e0\u0293\7n\2\2\u01e1\u01e2\7r\2\2\u01e2"+
"\u01e3\7n\2\2\u01e3\u0293\7c\2\2\u01e4\u01e5\7r\2\2\u01e5\u01e6\7n\2\2"+
"\u01e6\u0293\7r\2\2\u01e7\u01e8\7d\2\2\u01e8\u01e9\7o\2\2\u01e9\u0293"+
"\7k\2\2\u01ea\u01eb\7u\2\2\u01eb\u01ec\7g\2\2\u01ec\u0293\7e\2\2\u01ed"+
"\u01ee\7t\2\2\u01ee\u01ef\7v\2\2\u01ef\u0293\7k\2\2\u01f0\u01f1\7g\2\2"+
"\u01f1\u01f2\7q\2\2\u01f2\u0293\7t\2\2\u01f3\u01f4\7u\2\2\u01f4\u01f5"+
"\7t\2\2\u01f5\u0293\7g\2\2\u01f6\u01f7\7n\2\2\u01f7\u01f8\7u\2\2\u01f8"+
"\u0293\7t\2\2\u01f9\u01fa\7r\2\2\u01fa\u01fb\7j\2\2\u01fb\u0293\7c\2\2"+
"\u01fc\u01fd\7c\2\2\u01fd\u01fe\7n\2\2\u01fe\u0293\7t\2\2\u01ff\u0200"+
"\7l\2\2\u0200\u0201\7o\2\2\u0201\u0293\7r\2\2\u0202\u0203\7d\2\2\u0203"+
"\u0204\7x\2\2\u0204\u0293\7e\2\2\u0205\u0206\7e\2\2\u0206\u0207\7n\2\2"+
"\u0207\u0293\7k\2\2\u0208\u0209\7t\2\2\u0209\u020a\7v\2\2\u020a\u0293"+
"\7u\2\2\u020b\u020c\7c\2\2\u020c\u020d\7f\2\2\u020d\u0293\7e\2\2\u020e"+
"\u020f\7t\2\2\u020f\u0210\7t\2\2\u0210\u0293\7c\2\2\u0211\u0212\7d\2\2"+
"\u0212\u0213\7x\2\2\u0213\u0293\7u\2\2\u0214\u0215\7u\2\2\u0215\u0216"+
"\7g\2\2\u0216\u0293\7k\2\2\u0217\u0218\7u\2\2\u0218\u0219\7c\2\2\u0219"+
"\u0293\7z\2\2\u021a\u021b\7u\2\2\u021b\u021c\7v\2\2\u021c\u0293\7{\2\2"+
"\u021d\u021e\7u\2\2\u021e\u021f\7v\2\2\u021f\u0293\7c\2\2\u0220\u0221"+
"\7u\2\2\u0221\u0222\7v\2\2\u0222\u0293\7z\2\2\u0223\u0224\7f\2\2\u0224"+
"\u0225\7g\2\2\u0225\u0293\7{\2\2\u0226\u0227\7v\2\2\u0227\u0228\7z\2\2"+
"\u0228\u0293\7c\2\2\u0229\u022a\7z\2\2\u022a\u022b\7c\2\2\u022b\u0293"+
"\7c\2\2\u022c\u022d\7d\2\2\u022d\u022e\7e\2\2\u022e\u0293\7e\2\2\u022f"+
"\u0230\7c\2\2\u0230\u0231\7j\2\2\u0231\u0293\7z\2\2\u0232\u0233\7v\2\2"+
"\u0233\u0234\7{\2\2\u0234\u0293\7c\2\2\u0235\u0236\7v\2\2\u0236\u0237"+
"\7z\2\2\u0237\u0293\7u\2\2\u0238\u0239\7v\2\2\u0239\u023a\7c\2\2\u023a"+
"\u0293\7u\2\2\u023b\u023c\7u\2\2\u023c\u023d\7j\2\2\u023d\u0293\7{\2\2"+
"\u023e\u023f\7u\2\2\u023f\u0240\7j\2\2\u0240\u0293\7z\2\2\u0241\u0242"+
"\7n\2\2\u0242\u0243\7f\2\2\u0243\u0293\7{\2\2\u0244\u0245\7n\2\2\u0245"+
"\u0246\7f\2\2\u0246\u0293\7c\2\2\u0247\u0248\7n\2\2\u0248\u0249\7f\2\2"+
"\u0249\u0293\7z\2\2\u024a\u024b\7n\2\2\u024b\u024c\7c\2\2\u024c\u0293"+
"\7z\2\2\u024d\u024e\7v\2\2\u024e\u024f\7c\2\2\u024f\u0293\7{\2\2\u0250"+
"\u0251\7v\2\2\u0251\u0252\7c\2\2\u0252\u0293\7z\2\2\u0253\u0254\7d\2\2"+
"\u0254\u0255\7e\2\2\u0255\u0293\7u\2\2\u0256\u0257\7e\2\2\u0257\u0258"+
"\7n\2\2\u0258\u0293\7x\2\2\u0259\u025a\7v\2\2\u025a\u025b\7u\2\2\u025b"+
"\u0293\7z\2\2\u025c\u025d\7n\2\2\u025d\u025e\7c\2\2\u025e\u0293\7u\2\2"+
"\u025f\u0260\7e\2\2\u0260\u0261\7r\2\2\u0261\u0293\7{\2\2\u0262\u0263"+
"\7e\2\2\u0263\u0264\7o\2\2\u0264\u0293\7r\2\2\u0265\u0266\7e\2\2\u0266"+
"\u0267\7r\2\2\u0267\u0293\7z\2\2\u0268\u0269\7f\2\2\u0269\u026a\7e\2\2"+
"\u026a\u0293\7r\2\2\u026b\u026c\7f\2\2\u026c\u026d\7g\2\2\u026d\u0293"+
"\7e\2\2\u026e\u026f\7k\2\2\u026f\u0270\7p\2\2\u0270\u0293\7e\2\2\u0271"+
"\u0272\7c\2\2\u0272\u0273\7z\2\2\u0273\u0293\7u\2\2\u0274\u0275\7d\2\2"+
"\u0275\u0276\7p\2\2\u0276\u0293\7g\2\2\u0277\u0278\7e\2\2\u0278\u0279"+
"\7n\2\2\u0279\u0293\7f\2\2\u027a\u027b\7u\2\2\u027b\u027c\7d\2\2\u027c"+
"\u0293\7e\2\2\u027d\u027e\7k\2\2\u027e\u027f\7u\2\2\u027f\u0293\7e\2\2"+
"\u0280\u0281\7k\2\2\u0281\u0282\7p\2\2\u0282\u0293\7z\2\2\u0283\u0284"+
"\7d\2\2\u0284\u0285\7g\2\2\u0285\u0293\7s\2\2\u0286\u0287\7u\2\2\u0287"+
"\u0288\7g\2\2\u0288\u0293\7f\2\2\u0289\u028a\7f\2\2\u028a\u028b\7g\2\2"+
"\u028b\u0293\7z\2\2\u028c\u028d\7k\2\2\u028d\u028e\7p\2\2\u028e\u0293"+
"\7{\2\2\u028f\u0290\7t\2\2\u0290\u0291\7q\2\2\u0291\u0293\7t\2\2\u0292"+
"\u01b4\3\2\2\2\u0292\u01b7\3\2\2\2\u0292\u01ba\3\2\2\2\u0292\u01bd\3\2"+
"\2\2\u0292\u01c0\3\2\2\2\u0292\u01c3\3\2\2\2\u0292\u01c6\3\2\2\2\u0292"+
"\u01c9\3\2\2\2\u0292\u01cc\3\2\2\2\u0292\u01cf\3\2\2\2\u0292\u01d2\3\2"+
"\2\2\u0292\u01d5\3\2\2\2\u0292\u01d8\3\2\2\2\u0292\u01db\3\2\2\2\u0292"+
"\u01de\3\2\2\2\u0292\u01e1\3\2\2\2\u0292\u01e4\3\2\2\2\u0292\u01e7\3\2"+
"\2\2\u0292\u01ea\3\2\2\2\u0292\u01ed\3\2\2\2\u0292\u01f0\3\2\2\2\u0292"+
"\u01f3\3\2\2\2\u0292\u01f6\3\2\2\2\u0292\u01f9\3\2\2\2\u0292\u01fc\3\2"+
"\2\2\u0292\u01ff\3\2\2\2\u0292\u0202\3\2\2\2\u0292\u0205\3\2\2\2\u0292"+
"\u0208\3\2\2\2\u0292\u020b\3\2\2\2\u0292\u020e\3\2\2\2\u0292\u0211\3\2"+
"\2\2\u0292\u0214\3\2\2\2\u0292\u0217\3\2\2\2\u0292\u021a\3\2\2\2\u0292"+
"\u021d\3\2\2\2\u0292\u0220\3\2\2\2\u0292\u0223\3\2\2\2\u0292\u0226\3\2"+
"\2\2\u0292\u0229\3\2\2\2\u0292\u022c\3\2\2\2\u0292\u022f\3\2\2\2\u0292"+
"\u0232\3\2\2\2\u0292\u0235\3\2\2\2\u0292\u0238\3\2\2\2\u0292\u023b\3\2"+
"\2\2\u0292\u023e\3\2\2\2\u0292\u0241\3\2\2\2\u0292\u0244\3\2\2\2\u0292"+
"\u0247\3\2\2\2\u0292\u024a\3\2\2\2\u0292\u024d\3\2\2\2\u0292\u0250\3\2"+
"\2\2\u0292\u0253\3\2\2\2\u0292\u0256\3\2\2\2\u0292\u0259\3\2\2\2\u0292"+
"\u025c\3\2\2\2\u0292\u025f\3\2\2\2\u0292\u0262\3\2\2\2\u0292\u0265\3\2"+
"\2\2\u0292\u0268\3\2\2\2\u0292\u026b\3\2\2\2\u0292\u026e\3\2\2\2\u0292"+
"\u0271\3\2\2\2\u0292\u0274\3\2\2\2\u0292\u0277\3\2\2\2\u0292\u027a\3\2"+
"\2\2\u0292\u027d\3\2\2\2\u0292\u0280\3\2\2\2\u0292\u0283\3\2\2\2\u0292"+
"\u0286\3\2\2\2\u0292\u0289\3\2\2\2\u0292\u028c\3\2\2\2\u0292\u028f\3\2"+
"\2\2\u0293\u0088\3\2\2\2\u0294\u0295\7}\2\2\u0295\u0296\7}\2\2\u0296\u029a"+
"\3\2\2\2\u0297\u0299\13\2\2\2\u0298\u0297\3\2\2\2\u0299\u029c\3\2\2\2"+
"\u029a\u029b\3\2\2\2\u029a\u0298\3\2\2\2\u029b\u029d\3\2\2\2\u029c\u029a"+
"\3\2\2\2\u029d\u029e\7\177\2\2\u029e\u029f\7\177\2\2\u029f\u008a\3\2\2"+
"\2\u02a0\u02a1\7d\2\2\u02a1\u02a2\7{\2\2\u02a2\u02a3\7v\2\2\u02a3\u02b6"+
"\7g\2\2\u02a4\u02a5\7y\2\2\u02a5\u02a6\7q\2\2\u02a6\u02a7\7t\2\2\u02a7"+
"\u02b6\7f\2\2\u02a8\u02a9\7f\2\2\u02a9\u02aa\7y\2\2\u02aa\u02ab\7q\2\2"+
"\u02ab\u02ac\7t\2\2\u02ac\u02b6\7f\2\2\u02ad\u02ae\7d\2\2\u02ae\u02af"+
"\7q\2\2\u02af\u02b0\7q\2\2\u02b0\u02b6\7n\2\2\u02b1\u02b2\7x\2\2\u02b2"+
"\u02b3\7q\2\2\u02b3\u02b4\7k\2\2\u02b4\u02b6\7f\2\2\u02b5\u02a0\3\2\2"+
"\2\u02b5\u02a4\3\2\2\2\u02b5\u02a8\3\2\2\2\u02b5\u02ad\3\2\2\2\u02b5\u02b1"+
"\3\2\2\2\u02b6\u008c\3\2\2\2\u02b7\u02bd\7$\2\2\u02b8\u02b9\7^\2\2\u02b9"+
"\u02bc\7$\2\2\u02ba\u02bc\n\2\2\2\u02bb\u02b8\3\2\2\2\u02bb\u02ba\3\2"+
"\2\2\u02bc\u02bf\3\2\2\2\u02bd\u02bb\3\2\2\2\u02bd\u02be\3\2\2\2\u02be"+
"\u02c0\3\2\2\2\u02bf\u02bd\3\2\2\2\u02c0\u02c1\7$\2\2\u02c1\u008e\3\2"+
"\2\2\u02c2\u02c6\7)\2\2\u02c3\u02c4\7^\2\2\u02c4\u02c7\7)\2\2\u02c5\u02c7"+
"\n\3\2\2\u02c6\u02c3\3\2\2\2\u02c6\u02c5\3\2\2\2\u02c7\u02c8\3\2\2\2\u02c8"+
"\u02c9\7)\2\2\u02c9\u0090\3\2\2\2\u02ca\u02cb\7v\2\2\u02cb\u02cc\7t\2"+
"\2\u02cc\u02cd\7w\2\2\u02cd\u02d4\7g\2\2\u02ce\u02cf\7h\2\2\u02cf\u02d0"+
"\7c\2\2\u02d0\u02d1\7n\2\2\u02d1\u02d2\7u\2\2\u02d2\u02d4\7g\2\2\u02d3"+
"\u02ca\3\2\2\2\u02d3\u02ce\3\2\2\2\u02d4\u0092\3\2\2\2\u02d5\u02d8\5\u0095"+
"K\2\u02d6\u02d8\5\u009dO\2\u02d7\u02d5\3\2\2\2\u02d7\u02d6\3\2\2\2\u02d8"+
"\u0094\3\2\2\2\u02d9\u02dd\5\u0097L\2\u02da\u02dd\5\u0099M\2\u02db\u02dd"+
"\5\u009bN\2\u02dc\u02d9\3\2\2\2\u02dc\u02da\3\2\2\2\u02dc\u02db\3\2\2"+
"\2\u02dd\u0096\3\2\2\2\u02de\u02e4\7\'\2\2\u02df\u02e0\7\62\2\2\u02e0"+
"\u02e4\7d\2\2\u02e1\u02e2\7\62\2\2\u02e2\u02e4\7D\2\2\u02e3\u02de\3\2"+
"\2\2\u02e3\u02df\3\2\2\2\u02e3\u02e1\3\2\2\2\u02e4\u02e8\3\2\2\2\u02e5"+
"\u02e7\5\u00a5S\2\u02e6\u02e5\3\2\2\2\u02e7\u02ea\3\2\2\2\u02e8\u02e6"+
"\3\2\2\2\u02e8\u02e9\3\2\2\2\u02e9\u02eb\3\2\2\2\u02ea\u02e8\3\2\2\2\u02eb"+
"\u02ed\7\60\2\2\u02ec\u02ee\5\u00a5S\2\u02ed\u02ec\3\2\2\2\u02ee\u02ef"+
"\3\2\2\2\u02ef\u02ed\3\2\2\2\u02ef\u02f0\3\2\2\2\u02f0\u0098\3\2\2\2\u02f1"+
"\u02f3\5\u00a7T\2\u02f2\u02f1\3\2\2\2\u02f3\u02f6\3\2\2\2\u02f4\u02f2"+
"\3\2\2\2\u02f4\u02f5\3\2\2\2\u02f5\u02f7\3\2\2\2\u02f6\u02f4\3\2\2\2\u02f7"+
"\u02f9\7\60\2\2\u02f8\u02fa\5\u00a7T\2\u02f9\u02f8\3\2\2\2\u02fa\u02fb"+
"\3\2\2\2\u02fb\u02f9\3\2\2\2\u02fb\u02fc\3\2\2\2\u02fc\u009a\3\2\2\2\u02fd"+
"\u0303\7&\2\2\u02fe\u02ff\7\62\2\2\u02ff\u0303\7z\2\2\u0300\u0301\7\62"+
"\2\2\u0301\u0303\7Z\2\2\u0302\u02fd\3\2\2\2\u0302\u02fe\3\2\2\2\u0302"+
"\u0300\3\2\2\2\u0303\u0307\3\2\2\2\u0304\u0306\5\u00a9U\2\u0305\u0304"+
"\3\2\2\2\u0306\u0309\3\2\2\2\u0307\u0305\3\2\2\2\u0307\u0308\3\2\2\2\u0308"+
"\u030a\3\2\2\2\u0309\u0307\3\2\2\2\u030a\u030c\7\60\2\2\u030b\u030d\5"+
"\u00a9U\2\u030c\u030b\3\2\2\2\u030d\u030e\3\2\2\2\u030e\u030c\3\2\2\2"+
"\u030e\u030f\3\2\2\2\u030f\u009c\3\2\2\2\u0310\u0314\5\u00a1Q\2\u0311"+
"\u0314\5\u00a3R\2\u0312\u0314\5\u009fP\2\u0313\u0310\3\2\2\2\u0313\u0311"+
"\3\2\2\2\u0313\u0312\3\2\2\2\u0314\u009e\3\2\2\2\u0315\u0316\7\62\2\2"+
"\u0316\u0318\t\4\2\2\u0317\u0319\5\u00a5S\2\u0318\u0317\3\2\2\2\u0319"+
"\u031a\3\2\2\2\u031a\u0318\3\2\2\2\u031a\u031b\3\2\2\2\u031b\u0323\3\2"+
"\2\2\u031c\u031e\7\'\2\2\u031d\u031f\5\u00a5S\2\u031e\u031d\3\2\2\2\u031f"+
"\u0320\3\2\2\2\u0320\u031e\3\2\2\2\u0320\u0321\3\2\2\2\u0321\u0323\3\2"+
"\2\2\u0322\u0315\3\2\2\2\u0322\u031c\3\2\2\2\u0323\u00a0\3\2\2\2\u0324"+
"\u0326\5\u00a7T\2\u0325\u0324\3\2\2\2\u0326\u0327\3\2\2\2\u0327\u0325"+
"\3\2\2\2\u0327\u0328\3\2\2\2\u0328\u00a2\3\2\2\2\u0329\u032f\7&\2\2\u032a"+
"\u032b\7\62\2\2\u032b\u032f\7z\2\2\u032c\u032d\7\62\2\2\u032d\u032f\7"+
"Z\2\2\u032e\u0329\3\2\2\2\u032e\u032a\3\2\2\2\u032e\u032c\3\2\2\2\u032f"+
"\u0331\3\2\2\2\u0330\u0332\5\u00a9U\2\u0331\u0330\3\2\2\2\u0332\u0333"+
"\3\2\2\2\u0333\u0331\3\2\2\2\u0333\u0334\3\2\2\2\u0334\u00a4\3\2\2\2\u0335"+
"\u0336\t\5\2\2\u0336\u00a6\3\2\2\2\u0337\u0338\t\6\2\2\u0338\u00a8\3\2"+
"\2\2\u0339\u033a\t\7\2\2\u033a\u00aa\3\2\2\2\u033b\u033f\5\u00adW\2\u033c"+
"\u033e\5\u00afX\2\u033d\u033c\3\2\2\2\u033e\u0341\3\2\2\2\u033f\u033d"+
"\3\2\2\2\u033f\u0340\3\2\2\2\u0340\u00ac\3\2\2\2\u0341\u033f\3\2\2\2\u0342"+
"\u0343\t\b\2\2\u0343\u00ae\3\2\2\2\u0344\u0345\t\t\2\2\u0345\u00b0\3\2"+
"\2\2\u0346\u034a\7#\2\2\u0347\u0349\5\u00afX\2\u0348\u0347\3\2\2\2\u0349"+
"\u034c\3\2\2\2\u034a\u0348\3\2\2\2\u034a\u034b\3\2\2\2\u034b\u034e\3\2"+
"\2\2\u034c\u034a\3\2\2\2\u034d\u034f\t\n\2\2\u034e\u034d\3\2\2\2\u034f"+
"\u0350\3\2\2\2\u0350\u034e\3\2\2\2\u0350\u0351\3\2\2\2\u0351\u00b2\3\2"+
"\2\2\u0352\u0354\t\13\2\2\u0353\u0352\3\2\2\2\u0354\u0355\3\2\2\2\u0355"+
"\u0353\3\2\2\2\u0355\u0356\3\2\2\2\u0356\u0357\3\2\2\2\u0357\u0358\bZ"+
"\2\2\u0358\u00b4\3\2\2\2\u0359\u035a\7\61\2\2\u035a\u035b\7\61\2\2\u035b"+
"\u035f\3\2\2\2\u035c\u035e\n\f\2\2\u035d\u035c\3\2\2\2\u035e\u0361\3\2"+
"\2\2\u035f\u035d\3\2\2\2\u035f\u0360\3\2\2\2\u0360\u0362\3\2\2\2\u0361"+
"\u035f\3\2\2\2\u0362\u0363\b[\2\2\u0363\u00b6\3\2\2\2\u0364\u0365\7\61"+
"\2\2\u0365\u0366\7,\2\2\u0366\u036a\3\2\2\2\u0367\u0369\13\2\2\2\u0368"+
"\u0367\3\2\2\2\u0369\u036c\3\2\2\2\u036a\u036b\3\2\2\2\u036a\u0368\3\2"+
"\2\2\u036b\u036d\3\2\2\2\u036c\u036a\3\2\2\2\u036d\u036e\7,\2\2\u036e"+
"\u036f\7\61\2\2\u036f\u0370\3\2\2\2\u0370\u0371\b\\\2\2\u0371\u00b8\3"+
"\2\2\2!\2\u0292\u029a\u02b5\u02bb\u02bd\u02c6\u02d3\u02d7\u02dc\u02e3"+
"\u02e8\u02ef\u02f4\u02fb\u0302\u0307\u030e\u0313\u031a\u0320\u0322\u0327"+
"\u032e\u0333\u033f\u034a\u0350\u0355\u035f\u036a\3\b\2\2";
public static final ATN _ATN =
new ATNDeserializer().deserialize(_serializedATN.toCharArray());
static {

View File

@ -92,15 +92,15 @@ COMMENT_BLOCK=86
'{'=6
'}'=7
'kickasm'=8
'resources'=9
'clobber'=10
'param'=11
'bytes'=12
'cycles'=13
'location'=14
'inline'=15
','=16
':'=17
','=9
'resource'=10
'clobber'=11
'param'=12
':'=13
'bytes'=14
'cycles'=15
'location'=16
'inline'=17
'const'=18
'extern'=19
'align'=20

View File

@ -98,107 +98,87 @@ public interface KickCListener extends ParseTreeListener {
*/
void exitDeclKasm(KickCParser.DeclKasmContext ctx);
/**
* Enter a parse tree produced by {@link KickCParser#kasmParams}.
* Enter a parse tree produced by {@link KickCParser#kasmDirectives}.
* @param ctx the parse tree
*/
void enterKasmParams(KickCParser.KasmParamsContext ctx);
void enterKasmDirectives(KickCParser.KasmDirectivesContext ctx);
/**
* Exit a parse tree produced by {@link KickCParser#kasmParams}.
* Exit a parse tree produced by {@link KickCParser#kasmDirectives}.
* @param ctx the parse tree
*/
void exitKasmParams(KickCParser.KasmParamsContext ctx);
void exitKasmDirectives(KickCParser.KasmDirectivesContext ctx);
/**
* Enter a parse tree produced by the {@code kasmParamResources}
* labeled alternative in {@link KickCParser#kasmParam}.
* Enter a parse tree produced by the {@code kasmDirectiveResource}
* labeled alternative in {@link KickCParser#kasmDirective}.
* @param ctx the parse tree
*/
void enterKasmParamResources(KickCParser.KasmParamResourcesContext ctx);
void enterKasmDirectiveResource(KickCParser.KasmDirectiveResourceContext ctx);
/**
* Exit a parse tree produced by the {@code kasmParamResources}
* labeled alternative in {@link KickCParser#kasmParam}.
* Exit a parse tree produced by the {@code kasmDirectiveResource}
* labeled alternative in {@link KickCParser#kasmDirective}.
* @param ctx the parse tree
*/
void exitKasmParamResources(KickCParser.KasmParamResourcesContext ctx);
void exitKasmDirectiveResource(KickCParser.KasmDirectiveResourceContext ctx);
/**
* Enter a parse tree produced by the {@code kasmParamClobber}
* labeled alternative in {@link KickCParser#kasmParam}.
* Enter a parse tree produced by the {@code kasmDirectiveClobber}
* labeled alternative in {@link KickCParser#kasmDirective}.
* @param ctx the parse tree
*/
void enterKasmParamClobber(KickCParser.KasmParamClobberContext ctx);
void enterKasmDirectiveClobber(KickCParser.KasmDirectiveClobberContext ctx);
/**
* Exit a parse tree produced by the {@code kasmParamClobber}
* labeled alternative in {@link KickCParser#kasmParam}.
* Exit a parse tree produced by the {@code kasmDirectiveClobber}
* labeled alternative in {@link KickCParser#kasmDirective}.
* @param ctx the parse tree
*/
void exitKasmParamClobber(KickCParser.KasmParamClobberContext ctx);
void exitKasmDirectiveClobber(KickCParser.KasmDirectiveClobberContext ctx);
/**
* Enter a parse tree produced by the {@code kasmParamTransfer}
* labeled alternative in {@link KickCParser#kasmParam}.
* Enter a parse tree produced by the {@code kasmDirectiveTransfer}
* labeled alternative in {@link KickCParser#kasmDirective}.
* @param ctx the parse tree
*/
void enterKasmParamTransfer(KickCParser.KasmParamTransferContext ctx);
void enterKasmDirectiveTransfer(KickCParser.KasmDirectiveTransferContext ctx);
/**
* Exit a parse tree produced by the {@code kasmParamTransfer}
* labeled alternative in {@link KickCParser#kasmParam}.
* Exit a parse tree produced by the {@code kasmDirectiveTransfer}
* labeled alternative in {@link KickCParser#kasmDirective}.
* @param ctx the parse tree
*/
void exitKasmParamTransfer(KickCParser.KasmParamTransferContext ctx);
void exitKasmDirectiveTransfer(KickCParser.KasmDirectiveTransferContext ctx);
/**
* Enter a parse tree produced by the {@code kasmParamBytes}
* labeled alternative in {@link KickCParser#kasmParam}.
* Enter a parse tree produced by the {@code kasmDirectiveBytes}
* labeled alternative in {@link KickCParser#kasmDirective}.
* @param ctx the parse tree
*/
void enterKasmParamBytes(KickCParser.KasmParamBytesContext ctx);
void enterKasmDirectiveBytes(KickCParser.KasmDirectiveBytesContext ctx);
/**
* Exit a parse tree produced by the {@code kasmParamBytes}
* labeled alternative in {@link KickCParser#kasmParam}.
* Exit a parse tree produced by the {@code kasmDirectiveBytes}
* labeled alternative in {@link KickCParser#kasmDirective}.
* @param ctx the parse tree
*/
void exitKasmParamBytes(KickCParser.KasmParamBytesContext ctx);
void exitKasmDirectiveBytes(KickCParser.KasmDirectiveBytesContext ctx);
/**
* Enter a parse tree produced by the {@code kasmParamCycles}
* labeled alternative in {@link KickCParser#kasmParam}.
* Enter a parse tree produced by the {@code kasmDirectiveCycles}
* labeled alternative in {@link KickCParser#kasmDirective}.
* @param ctx the parse tree
*/
void enterKasmParamCycles(KickCParser.KasmParamCyclesContext ctx);
void enterKasmDirectiveCycles(KickCParser.KasmDirectiveCyclesContext ctx);
/**
* Exit a parse tree produced by the {@code kasmParamCycles}
* labeled alternative in {@link KickCParser#kasmParam}.
* Exit a parse tree produced by the {@code kasmDirectiveCycles}
* labeled alternative in {@link KickCParser#kasmDirective}.
* @param ctx the parse tree
*/
void exitKasmParamCycles(KickCParser.KasmParamCyclesContext ctx);
void exitKasmDirectiveCycles(KickCParser.KasmDirectiveCyclesContext ctx);
/**
* Enter a parse tree produced by the {@code kasmParamLocation}
* labeled alternative in {@link KickCParser#kasmParam}.
* Enter a parse tree produced by the {@code kasmDirectiveLocation}
* labeled alternative in {@link KickCParser#kasmDirective}.
* @param ctx the parse tree
*/
void enterKasmParamLocation(KickCParser.KasmParamLocationContext ctx);
void enterKasmDirectiveLocation(KickCParser.KasmDirectiveLocationContext ctx);
/**
* Exit a parse tree produced by the {@code kasmParamLocation}
* labeled alternative in {@link KickCParser#kasmParam}.
* Exit a parse tree produced by the {@code kasmDirectiveLocation}
* labeled alternative in {@link KickCParser#kasmDirective}.
* @param ctx the parse tree
*/
void exitKasmParamLocation(KickCParser.KasmParamLocationContext ctx);
/**
* Enter a parse tree produced by {@link KickCParser#kasmResourceList}.
* @param ctx the parse tree
*/
void enterKasmResourceList(KickCParser.KasmResourceListContext ctx);
/**
* Exit a parse tree produced by {@link KickCParser#kasmResourceList}.
* @param ctx the parse tree
*/
void exitKasmResourceList(KickCParser.KasmResourceListContext ctx);
/**
* Enter a parse tree produced by {@link KickCParser#kasmParamList}.
* @param ctx the parse tree
*/
void enterKasmParamList(KickCParser.KasmParamListContext ctx);
/**
* Exit a parse tree produced by {@link KickCParser#kasmParamList}.
* @param ctx the parse tree
*/
void exitKasmParamList(KickCParser.KasmParamListContext ctx);
void exitKasmDirectiveLocation(KickCParser.KasmDirectiveLocationContext ctx);
/**
* Enter a parse tree produced by {@link KickCParser#parameterListDecl}.
* @param ctx the parse tree

File diff suppressed because it is too large Load Diff

View File

@ -65,65 +65,53 @@ public interface KickCVisitor<T> extends ParseTreeVisitor<T> {
*/
T visitDeclKasm(KickCParser.DeclKasmContext ctx);
/**
* Visit a parse tree produced by {@link KickCParser#kasmParams}.
* Visit a parse tree produced by {@link KickCParser#kasmDirectives}.
* @param ctx the parse tree
* @return the visitor result
*/
T visitKasmParams(KickCParser.KasmParamsContext ctx);
T visitKasmDirectives(KickCParser.KasmDirectivesContext ctx);
/**
* Visit a parse tree produced by the {@code kasmParamResources}
* labeled alternative in {@link KickCParser#kasmParam}.
* Visit a parse tree produced by the {@code kasmDirectiveResource}
* labeled alternative in {@link KickCParser#kasmDirective}.
* @param ctx the parse tree
* @return the visitor result
*/
T visitKasmParamResources(KickCParser.KasmParamResourcesContext ctx);
T visitKasmDirectiveResource(KickCParser.KasmDirectiveResourceContext ctx);
/**
* Visit a parse tree produced by the {@code kasmParamClobber}
* labeled alternative in {@link KickCParser#kasmParam}.
* Visit a parse tree produced by the {@code kasmDirectiveClobber}
* labeled alternative in {@link KickCParser#kasmDirective}.
* @param ctx the parse tree
* @return the visitor result
*/
T visitKasmParamClobber(KickCParser.KasmParamClobberContext ctx);
T visitKasmDirectiveClobber(KickCParser.KasmDirectiveClobberContext ctx);
/**
* Visit a parse tree produced by the {@code kasmParamTransfer}
* labeled alternative in {@link KickCParser#kasmParam}.
* Visit a parse tree produced by the {@code kasmDirectiveTransfer}
* labeled alternative in {@link KickCParser#kasmDirective}.
* @param ctx the parse tree
* @return the visitor result
*/
T visitKasmParamTransfer(KickCParser.KasmParamTransferContext ctx);
T visitKasmDirectiveTransfer(KickCParser.KasmDirectiveTransferContext ctx);
/**
* Visit a parse tree produced by the {@code kasmParamBytes}
* labeled alternative in {@link KickCParser#kasmParam}.
* Visit a parse tree produced by the {@code kasmDirectiveBytes}
* labeled alternative in {@link KickCParser#kasmDirective}.
* @param ctx the parse tree
* @return the visitor result
*/
T visitKasmParamBytes(KickCParser.KasmParamBytesContext ctx);
T visitKasmDirectiveBytes(KickCParser.KasmDirectiveBytesContext ctx);
/**
* Visit a parse tree produced by the {@code kasmParamCycles}
* labeled alternative in {@link KickCParser#kasmParam}.
* Visit a parse tree produced by the {@code kasmDirectiveCycles}
* labeled alternative in {@link KickCParser#kasmDirective}.
* @param ctx the parse tree
* @return the visitor result
*/
T visitKasmParamCycles(KickCParser.KasmParamCyclesContext ctx);
T visitKasmDirectiveCycles(KickCParser.KasmDirectiveCyclesContext ctx);
/**
* Visit a parse tree produced by the {@code kasmParamLocation}
* labeled alternative in {@link KickCParser#kasmParam}.
* Visit a parse tree produced by the {@code kasmDirectiveLocation}
* labeled alternative in {@link KickCParser#kasmDirective}.
* @param ctx the parse tree
* @return the visitor result
*/
T visitKasmParamLocation(KickCParser.KasmParamLocationContext ctx);
/**
* Visit a parse tree produced by {@link KickCParser#kasmResourceList}.
* @param ctx the parse tree
* @return the visitor result
*/
T visitKasmResourceList(KickCParser.KasmResourceListContext ctx);
/**
* Visit a parse tree produced by {@link KickCParser#kasmParamList}.
* @param ctx the parse tree
* @return the visitor result
*/
T visitKasmParamList(KickCParser.KasmParamListContext ctx);
T visitKasmDirectiveLocation(KickCParser.KasmDirectiveLocationContext ctx);
/**
* Visit a parse tree produced by {@link KickCParser#parameterListDecl}.
* @param ctx the parse tree

View File

@ -155,8 +155,8 @@ public class Pass0GenerateStatementSequence extends KickCBaseVisitor<Object> {
String kickAsmCode = m.group(1).replaceAll("\r", "");
StatementKickAsm statementKickAsm = new StatementKickAsm(kickAsmCode, new StatementSource(ctx));
sequence.addStatement(statementKickAsm);
if(ctx.kasmParams() != null) {
List<KasmDirective> kasmDirectives = this.visitKasmParams(ctx.kasmParams());
if(ctx.kasmDirectives() != null) {
List<KasmDirective> kasmDirectives = this.visitKasmDirectives(ctx.kasmDirectives());
for(KasmDirective kasmDirective : kasmDirectives) {
if(kasmDirective instanceof KasmDirectiveLocation) {
statementKickAsm.setLocation(((KasmDirectiveLocation) kasmDirective).getAddress());
@ -170,10 +170,10 @@ public class Pass0GenerateStatementSequence extends KickCBaseVisitor<Object> {
private interface KasmDirective {};
@Override
public List<KasmDirective> visitKasmParams(KickCParser.KasmParamsContext ctx) {
public List<KasmDirective> visitKasmDirectives(KickCParser.KasmDirectivesContext ctx) {
ArrayList<KasmDirective> kasmDirectives = new ArrayList<>();
List<KickCParser.KasmParamContext> params = ctx.kasmParam();
for(KickCParser.KasmParamContext param : params) {
List<KickCParser.KasmDirectiveContext> params = ctx.kasmDirective();
for(KickCParser.KasmDirectiveContext param : params) {
KasmDirective directive = (KasmDirective) visit(param);
if(directive!=null) {
kasmDirectives.add(directive);
@ -184,26 +184,26 @@ public class Pass0GenerateStatementSequence extends KickCBaseVisitor<Object> {
/** KickAssembler directive specifying an absolute address for the generated code/data. */
public static class KasmDirectiveLocation implements KasmDirective {
/** will contain the address to generate the KickAssembler-code to. */
private Long address;
private RValue address;
public KasmDirectiveLocation(Long address) {
public KasmDirectiveLocation(RValue address) {
this.address = address;
}
public Long getAddress() {
public RValue getAddress() {
return address;
}
}
@Override
public KasmDirective visitKasmParamLocation(KickCParser.KasmParamLocationContext ctx) {
public Object visitKasmDirectiveLocation(KickCParser.KasmDirectiveLocationContext ctx) {
ParseTree child = ctx.getChild(1);
if(ctx.NUMBER()!=null) {
Number location = NumberParser.parseLiteral(ctx.NUMBER().getText());
return new KasmDirectiveLocation(location.longValue());
if(ctx.expr()!=null) {
RValue expr = (RValue) visit(ctx.expr());
return new KasmDirectiveLocation(expr);
} else {
// PLace inline
return null;
@ -211,14 +211,13 @@ public class Pass0GenerateStatementSequence extends KickCBaseVisitor<Object> {
}
@Override
public Object visitKasmResourceList(KickCParser.KasmResourceListContext ctx) {
for(TerminalNode resource : ctx.STRING()) {
String resourceName = resource.getText();
resourceName = resourceName.substring(1, resourceName.length() - 1);
File resourceFile = Compiler.loadFile(resourceName, program);
program.addAsmResourceFile(resourceFile.toPath());
program.getLog().append("Added resource " + resourceFile.getPath().replace('\\', '/'));
}
public Object visitKasmDirectiveResource(KickCParser.KasmDirectiveResourceContext ctx) {
TerminalNode resource = ctx.STRING();
String resourceName = resource.getText();
resourceName = resourceName.substring(1, resourceName.length() - 1);
File resourceFile = Compiler.loadFile(resourceName, program);
program.addAsmResourceFile(resourceFile.toPath());
program.getLog().append("Added resource " + resourceFile.getPath().replace('\\', '/'));
return null;
}

View File

@ -0,0 +1,38 @@
package dk.camelot64.kickc.passes;
import dk.camelot64.kickc.model.CompileError;
import dk.camelot64.kickc.model.ControlFlowBlock;
import dk.camelot64.kickc.model.Program;
import dk.camelot64.kickc.model.statements.Statement;
import dk.camelot64.kickc.model.statements.StatementKickAsm;
import dk.camelot64.kickc.model.values.ConstantValue;
import dk.camelot64.kickc.model.values.RValue;
/**
* Asserts that some RValues have been resolved to Constants.
* Checks:
* - KickAssembler locations
*/
public class Pass3AssertConstants extends Pass2SsaAssertion {
public Pass3AssertConstants(Program program) {
super(program);
}
@Override
public void check() throws AssertionFailed {
for(ControlFlowBlock block : getProgram().getGraph().getAllBlocks()) {
for(Statement statement : block.getStatements()) {
if(statement instanceof StatementKickAsm) {
RValue location = ((StatementKickAsm) statement).getLocation();
if(location != null) {
if(!(location instanceof ConstantValue)) {
throw new CompileError("Error! KickAssembler location is not constant " + location.toString(), statement);
}
}
}
}
}
}
}

View File

@ -109,7 +109,7 @@ public class Pass4CodeGeneration {
if(statement instanceof StatementKickAsm) {
StatementKickAsm statementKasm = (StatementKickAsm) statement;
if(statementKasm.getLocation() != null) {
asm.addLine(new AsmSetPc("Inline", AsmFormat.getAsmNumber(statementKasm.getLocation())));
asm.addLine(new AsmSetPc("Inline", AsmFormat.getAsmConstant(program, (ConstantValue) statementKasm.getLocation(), 99, ScopeRef.ROOT)));
asm.addInlinedKickAsm(statementKasm.getKickAsmCode());
}
}

View File

@ -4,7 +4,7 @@ import "memory.kc"
byte* SCREEN = $400;
byte* LOGO = $2000;
kickasm(resources "logo.png"; location $2000 ) {{
kickasm(resource "logo.png", location LOGO ) {{
logo:
.var logoPic = LoadPicture("logo.png", List().add($444444, $808080, $000000, $ffffff))
.for (var y=0; y<6 ; y++)

View File

@ -711,7 +711,7 @@ fill: {
}
.align $100
xsin: .fill 2*XSIN_SIZE, 0
.pc = $2000 "Inline"
.pc = LOGO "Inline"
logo:
.var logoPic = LoadPicture("logo.png", List().add($444444, $808080, $000000, $ffffff))
.for (var y=0; y<6 ; y++)

View File

@ -2,7 +2,7 @@
[0] phi() [ ] ( )
to:@24
@24: scope:[] from @begin
kickasm {{ logo:
kickasm(location (const byte*) LOGO#0) {{ logo:
.var logoPic = LoadPicture("logo.png", List().add($444444, $808080, $000000, $ffffff))
.for (var y=0; y<6 ; y++)
.for (var x=0;x<40; x++)

View File

@ -5,7 +5,7 @@ import "memory.kc"
byte* SCREEN = $400;
byte* LOGO = $2000;
kickasm(resources "logo.png"; location $2000 ) {{
kickasm(resource "logo.png", location LOGO ) {{
logo:
.var logoPic = LoadPicture("logo.png", List().add($444444, $808080, $000000, $ffffff))
.for (var y=0; y<6 ; y++)
@ -2298,7 +2298,7 @@ fill::@return: scope:[fill] from fill::@2
@24: scope:[] from @23
(byte*) SCREEN ← ((byte*)) (word/signed word/dword/signed dword) 1024
(byte*) LOGO ← ((byte*)) (word/signed word/dword/signed dword) 8192
kickasm {{ logo:
kickasm(location (byte*) LOGO) {{ logo:
.var logoPic = LoadPicture("logo.png", List().add($444444, $808080, $000000, $ffffff))
.for (var y=0; y<6 ; y++)
.for (var x=0;x<40; x++)
@ -3233,7 +3233,7 @@ fill::@return: scope:[fill] from fill::@1
(word) rem16u#31 ← phi( @16/(word) rem16u#32 )
(byte*) SCREEN#0 ← ((byte*)) (word/signed word/dword/signed dword) 1024
(byte*) LOGO#0 ← ((byte*)) (word/signed word/dword/signed dword) 8192
kickasm {{ logo:
kickasm(location (byte*) LOGO#0) {{ logo:
.var logoPic = LoadPicture("logo.png", List().add($444444, $808080, $000000, $ffffff))
.for (var y=0; y<6 ; y++)
.for (var x=0;x<40; x++)
@ -5588,7 +5588,7 @@ FINAL CONTROL FLOW GRAPH
[0] phi() [ ] ( )
to:@24
@24: scope:[] from @begin
kickasm {{ logo:
kickasm(location (const byte*) LOGO#0) {{ logo:
.var logoPic = LoadPicture("logo.png", List().add($444444, $808080, $000000, $ffffff))
.for (var y=0; y<6 ; y++)
.for (var x=0;x<40; x++)
@ -6680,7 +6680,7 @@ bbegin:
jmp b24
//SEG3 @24
b24:
//SEG4 kickasm {{ logo: .var logoPic = LoadPicture("logo.png", List().add($444444, $808080, $000000, $ffffff)) .for (var y=0; y<6 ; y++) .for (var x=0;x<40; x++) .for(var cp=0; cp<8; cp++) .byte logoPic.getMulticolorByte(x,cp+y*8) }}
//SEG4 kickasm(location (const byte*) LOGO#0) {{ logo: .var logoPic = LoadPicture("logo.png", List().add($444444, $808080, $000000, $ffffff)) .for (var y=0; y<6 ; y++) .for (var x=0;x<40; x++) .for(var cp=0; cp<8; cp++) .byte logoPic.getMulticolorByte(x,cp+y*8) }}
//SEG5 [2] phi from @24 to @27 [phi:@24->@27]
b27_from_b24:
jmp b27
@ -8235,7 +8235,7 @@ fill: {
}
.align $100
xsin: .fill 2*XSIN_SIZE, 0
.pc = $2000 "Inline"
.pc = LOGO "Inline"
logo:
.var logoPic = LoadPicture("logo.png", List().add($444444, $808080, $000000, $ffffff))
.for (var y=0; y<6 ; y++)
@ -8731,7 +8731,7 @@ bbegin:
jmp b24
//SEG3 @24
b24:
//SEG4 kickasm {{ logo: .var logoPic = LoadPicture("logo.png", List().add($444444, $808080, $000000, $ffffff)) .for (var y=0; y<6 ; y++) .for (var x=0;x<40; x++) .for(var cp=0; cp<8; cp++) .byte logoPic.getMulticolorByte(x,cp+y*8) }}
//SEG4 kickasm(location (const byte*) LOGO#0) {{ logo: .var logoPic = LoadPicture("logo.png", List().add($444444, $808080, $000000, $ffffff)) .for (var y=0; y<6 ; y++) .for (var x=0;x<40; x++) .for(var cp=0; cp<8; cp++) .byte logoPic.getMulticolorByte(x,cp+y*8) }}
//SEG5 [2] phi from @24 to @27 [phi:@24->@27]
b27_from_b24:
jmp b27
@ -10024,7 +10024,7 @@ fill: {
}
.align $100
xsin: .fill 2*XSIN_SIZE, 0
.pc = $2000 "Inline"
.pc = LOGO "Inline"
logo:
.var logoPic = LoadPicture("logo.png", List().add($444444, $808080, $000000, $ffffff))
.for (var y=0; y<6 ; y++)
@ -10663,7 +10663,7 @@ Score: 41393
.label xsin_idx = 2
//SEG2 @begin
//SEG3 @24
//SEG4 kickasm {{ logo: .var logoPic = LoadPicture("logo.png", List().add($444444, $808080, $000000, $ffffff)) .for (var y=0; y<6 ; y++) .for (var x=0;x<40; x++) .for(var cp=0; cp<8; cp++) .byte logoPic.getMulticolorByte(x,cp+y*8) }}
//SEG4 kickasm(location (const byte*) LOGO#0) {{ logo: .var logoPic = LoadPicture("logo.png", List().add($444444, $808080, $000000, $ffffff)) .for (var y=0; y<6 ; y++) .for (var x=0;x<40; x++) .for(var cp=0; cp<8; cp++) .byte logoPic.getMulticolorByte(x,cp+y*8) }}
//SEG5 [2] phi from @24 to @27 [phi:@24->@27]
//SEG6 @27
//SEG7 [3] call main [ ] ( )
@ -11774,7 +11774,7 @@ fill: {
}
.align $100
xsin: .fill 2*XSIN_SIZE, 0
.pc = $2000 "Inline"
.pc = LOGO "Inline"
logo:
.var logoPic = LoadPicture("logo.png", List().add($444444, $808080, $000000, $ffffff))
.for (var y=0; y<6 ; y++)