From a7945cdd868735931853848782b31ad5334e57c6 Mon Sep 17 00:00:00 2001 From: Fabian Lange Date: Sun, 10 Apr 2016 16:40:46 +0200 Subject: [PATCH 1/2] Create valid OSGi bundle manifest --- pom.xml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e02bdec..d85be75 100644 --- a/pom.xml +++ b/pom.xml @@ -23,7 +23,7 @@ com.github.odiszapc nginxparser 0.9.6 - jar + bundle ${project.groupId}:${project.artifactId} Parses Nginx configuration files with JavaCC grammar based parser @@ -84,6 +84,12 @@ + + org.apache.felix + maven-bundle-plugin + 2.5.4 + true + org.apache.maven.plugins maven-compiler-plugin From e1bd57ae560333e8ddd97d1d2d06390898d9464e Mon Sep 17 00:00:00 2001 From: Fabian Lange Date: Fri, 9 Dec 2016 13:56:47 +0100 Subject: [PATCH 2/2] Let the value of a generic statement also be a regex --- .../nginxparser/antlr/NginxParser.java | 253 +++++++++--------- src/main/resources/grammar/Nginx.g4 | 4 +- 2 files changed, 136 insertions(+), 121 deletions(-) diff --git a/src/main/java/com/github/odiszapc/nginxparser/antlr/NginxParser.java b/src/main/java/com/github/odiszapc/nginxparser/antlr/NginxParser.java index 7610218..2d6d479 100644 --- a/src/main/java/com/github/odiszapc/nginxparser/antlr/NginxParser.java +++ b/src/main/java/com/github/odiszapc/nginxparser/antlr/NginxParser.java @@ -270,11 +270,16 @@ public final StatementContext statement() throws RecognitionException { public static class GenericStatementContext extends ParserRuleContext { public NgxParam ret; public Token Value; - public RegexpContext r; + public Token REGEXP_PREFIXED; + public RegexpContext regexp; public List Value() { return getTokens(NginxParser.Value); } public TerminalNode Value(int i) { return getToken(NginxParser.Value, i); } + public List REGEXP_PREFIXED() { return getTokens(NginxParser.REGEXP_PREFIXED); } + public TerminalNode REGEXP_PREFIXED(int i) { + return getToken(NginxParser.REGEXP_PREFIXED, i); + } public List regexp() { return getRuleContexts(RegexpContext.class); } @@ -311,12 +316,12 @@ public final GenericStatementContext genericStatement() throws RecognitionExcept setState(47); ((GenericStatementContext)_localctx).Value = match(Value); _localctx.ret.addValue((((GenericStatementContext)_localctx).Value!=null?((GenericStatementContext)_localctx).Value.getText():null)); - setState(56); + setState(58); _errHandler.sync(this); _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__6) | (1L << T__7) | (1L << Value))) != 0)) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__6) | (1L << T__7) | (1L << Value) | (1L << REGEXP_PREFIXED))) != 0)) { { - setState(54); + setState(56); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,3,_ctx) ) { case 1: @@ -329,13 +334,20 @@ public final GenericStatementContext genericStatement() throws RecognitionExcept case 2: { setState(51); - ((GenericStatementContext)_localctx).r = regexp(); - _localctx.ret.addValue(((GenericStatementContext)_localctx).r.ret); + ((GenericStatementContext)_localctx).REGEXP_PREFIXED = match(REGEXP_PREFIXED); + _localctx.ret.addValue((((GenericStatementContext)_localctx).REGEXP_PREFIXED!=null?((GenericStatementContext)_localctx).REGEXP_PREFIXED.getText():null)); + } + break; + case 3: + { + setState(53); + ((GenericStatementContext)_localctx).regexp = regexp(); + _localctx.ret.addValue(((GenericStatementContext)_localctx).regexp.ret); } break; } } - setState(58); + setState(60); _errHandler.sync(this); _la = _input.LA(1); } @@ -384,10 +396,10 @@ public final RegexHeaderStatementContext regexHeaderStatement() throws Recogniti try { enterOuterAlt(_localctx, 1); { - setState(59); + setState(61); ((RegexHeaderStatementContext)_localctx).REGEXP_PREFIXED = match(REGEXP_PREFIXED); _localctx.ret.addValue((((RegexHeaderStatementContext)_localctx).REGEXP_PREFIXED!=null?((RegexHeaderStatementContext)_localctx).REGEXP_PREFIXED.getText():null)); - setState(61); + setState(63); ((RegexHeaderStatementContext)_localctx).Value = match(Value); _localctx.ret.addValue((((RegexHeaderStatementContext)_localctx).Value!=null?((RegexHeaderStatementContext)_localctx).Value.getText():null)); } @@ -466,18 +478,18 @@ public final BlockContext block() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(70); + setState(72); switch (_input.LA(1)) { case T__8: { - setState(64); + setState(66); ((BlockContext)_localctx).locationBlockHeader = locationBlockHeader(); _localctx.ret.getTokens().addAll(((BlockContext)_localctx).locationBlockHeader.ret); } break; case Value: { - setState(67); + setState(69); ((BlockContext)_localctx).genericBlockHeader = genericBlockHeader(); _localctx.ret.getTokens().addAll(((BlockContext)_localctx).genericBlockHeader.ret); } @@ -485,60 +497,60 @@ public final BlockContext block() throws RecognitionException { default: throw new NoViableAltException(this); } - setState(73); + setState(75); _la = _input.LA(1); if (_la==Comment) { { - setState(72); + setState(74); ((BlockContext)_localctx).Comment = match(Comment); } } - setState(75); + setState(77); match(T__1); - setState(89); + setState(91); _errHandler.sync(this); _la = _input.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__8) | (1L << T__9) | (1L << Value) | (1L << Comment) | (1L << REGEXP_PREFIXED))) != 0)) { { - setState(87); + setState(89); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,7,_ctx) ) { case 1: { - setState(76); + setState(78); ((BlockContext)_localctx).statement = statement(); _localctx.ret.addEntry(((BlockContext)_localctx).statement.ret); } break; case 2: { - setState(79); + setState(81); ((BlockContext)_localctx).b = block(); _localctx.ret.addEntry(((BlockContext)_localctx).b.ret); } break; case 3: { - setState(82); + setState(84); ((BlockContext)_localctx).if_statement = if_statement(); _localctx.ret.addEntry(((BlockContext)_localctx).if_statement.ret); } break; case 4: { - setState(85); + setState(87); ((BlockContext)_localctx).Comment = match(Comment); _localctx.ret.addEntry(new NgxComment((((BlockContext)_localctx).Comment!=null?((BlockContext)_localctx).Comment.getText():null))); } break; } } - setState(91); + setState(93); _errHandler.sync(this); _la = _input.LA(1); } - setState(92); + setState(94); match(T__2); } } @@ -594,34 +606,34 @@ public final GenericBlockHeaderContext genericBlockHeader() throws RecognitionEx try { enterOuterAlt(_localctx, 1); { - setState(94); + setState(96); ((GenericBlockHeaderContext)_localctx).Value = match(Value); _localctx.ret.add(new NgxToken((((GenericBlockHeaderContext)_localctx).Value!=null?((GenericBlockHeaderContext)_localctx).Value.getText():null))); - setState(103); + setState(105); _errHandler.sync(this); _la = _input.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__6) | (1L << T__7) | (1L << Value))) != 0)) { { - setState(101); + setState(103); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,9,_ctx) ) { case 1: { - setState(96); + setState(98); ((GenericBlockHeaderContext)_localctx).Value = match(Value); _localctx.ret.add(new NgxToken((((GenericBlockHeaderContext)_localctx).Value!=null?((GenericBlockHeaderContext)_localctx).Value.getText():null))); } break; case 2: { - setState(98); + setState(100); ((GenericBlockHeaderContext)_localctx).regexp = regexp(); _localctx.ret.add(new NgxToken(((GenericBlockHeaderContext)_localctx).regexp.ret)); } break; } } - setState(105); + setState(107); _errHandler.sync(this); _la = _input.LA(1); } @@ -680,39 +692,39 @@ public final If_statementContext if_statement() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(106); + setState(108); ((If_statementContext)_localctx).id = match(T__3); _localctx.ret.addValue(new NgxToken((((If_statementContext)_localctx).id!=null?((If_statementContext)_localctx).id.getText():null))); - setState(108); + setState(110); ((If_statementContext)_localctx).if_body = if_body(); _localctx.ret.getTokens().addAll(((If_statementContext)_localctx).if_body.ret); - setState(111); + setState(113); _la = _input.LA(1); if (_la==Comment) { { - setState(110); + setState(112); match(Comment); } } - setState(113); + setState(115); match(T__1); - setState(119); + setState(121); _errHandler.sync(this); _la = _input.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__9) | (1L << Value) | (1L << REGEXP_PREFIXED))) != 0)) { { { - setState(114); + setState(116); ((If_statementContext)_localctx).statement = statement(); _localctx.ret.addEntry(((If_statementContext)_localctx).statement.ret); } } - setState(121); + setState(123); _errHandler.sync(this); _la = _input.LA(1); } - setState(122); + setState(124); match(T__2); } } @@ -764,41 +776,41 @@ public final If_bodyContext if_body() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(124); + setState(126); match(T__4); - setState(125); + setState(127); ((If_bodyContext)_localctx).Value = match(Value); _localctx.ret.add(new NgxToken((((If_bodyContext)_localctx).Value!=null?((If_bodyContext)_localctx).Value.getText():null))); - setState(129); + setState(131); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,13,_ctx) ) { case 1: { - setState(127); + setState(129); ((If_bodyContext)_localctx).Value = match(Value); _localctx.ret.add(new NgxToken((((If_bodyContext)_localctx).Value!=null?((If_bodyContext)_localctx).Value.getText():null))); } break; } - setState(136); + setState(138); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,14,_ctx) ) { case 1: { - setState(131); + setState(133); ((If_bodyContext)_localctx).Value = match(Value); _localctx.ret.add(new NgxToken((((If_bodyContext)_localctx).Value!=null?((If_bodyContext)_localctx).Value.getText():null))); } break; case 2: { - setState(133); + setState(135); ((If_bodyContext)_localctx).regexp = regexp(); _localctx.ret.add(new NgxToken(((If_bodyContext)_localctx).regexp.ret)); } break; } - setState(138); + setState(140); match(T__5); } } @@ -855,44 +867,44 @@ public final RegexpContext regexp() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(151); + setState(153); _errHandler.sync(this); _alt = 1; do { switch (_alt) { case 1: { - setState(151); + setState(153); switch (_input.LA(1)) { case T__6: { - setState(140); + setState(142); ((RegexpContext)_localctx).id = match(T__6); _localctx.ret += (((RegexpContext)_localctx).id!=null?((RegexpContext)_localctx).id.getText():null); } break; case T__7: { - setState(142); + setState(144); ((RegexpContext)_localctx).id = match(T__7); _localctx.ret += (((RegexpContext)_localctx).id!=null?((RegexpContext)_localctx).id.getText():null); } break; case Value: { - setState(144); + setState(146); ((RegexpContext)_localctx).Value = match(Value); _localctx.ret += (((RegexpContext)_localctx).Value!=null?((RegexpContext)_localctx).Value.getText():null); } break; case T__4: { - setState(146); + setState(148); match(T__4); - setState(147); + setState(149); ((RegexpContext)_localctx).r = regexp(); _localctx.ret += "(".concat(((RegexpContext)_localctx).r.ret).concat(")"); - setState(149); + setState(151); match(T__5); } break; @@ -904,7 +916,7 @@ public final RegexpContext regexp() throws RecognitionException { default: throw new NoViableAltException(this); } - setState(153); + setState(155); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,16,_ctx); } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); @@ -959,33 +971,33 @@ public final LocationBlockHeaderContext locationBlockHeader() throws Recognition try { enterOuterAlt(_localctx, 1); { - setState(155); + setState(157); ((LocationBlockHeaderContext)_localctx).id = match(T__8); _localctx.ret.add(new NgxToken((((LocationBlockHeaderContext)_localctx).id!=null?((LocationBlockHeaderContext)_localctx).id.getText():null))); - setState(159); + setState(161); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,17,_ctx) ) { case 1: { - setState(157); + setState(159); ((LocationBlockHeaderContext)_localctx).Value = match(Value); _localctx.ret.add(new NgxToken((((LocationBlockHeaderContext)_localctx).Value!=null?((LocationBlockHeaderContext)_localctx).Value.getText():null))); } break; } - setState(166); + setState(168); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,18,_ctx) ) { case 1: { - setState(161); + setState(163); ((LocationBlockHeaderContext)_localctx).Value = match(Value); _localctx.ret.add(new NgxToken((((LocationBlockHeaderContext)_localctx).Value!=null?((LocationBlockHeaderContext)_localctx).Value.getText():null))); } break; case 2: { - setState(163); + setState(165); ((LocationBlockHeaderContext)_localctx).regexp = regexp(); _localctx.ret.add(new NgxToken(((LocationBlockHeaderContext)_localctx).regexp.ret)); } @@ -1044,35 +1056,35 @@ public final RewriteStatementContext rewriteStatement() throws RecognitionExcept try { enterOuterAlt(_localctx, 1); { - setState(168); + setState(170); ((RewriteStatementContext)_localctx).id = match(T__9); _localctx.ret.addValue((((RewriteStatementContext)_localctx).id!=null?((RewriteStatementContext)_localctx).id.getText():null)); - setState(175); + setState(177); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,19,_ctx) ) { case 1: { - setState(170); + setState(172); ((RewriteStatementContext)_localctx).Value = match(Value); _localctx.ret.addValue((((RewriteStatementContext)_localctx).Value!=null?((RewriteStatementContext)_localctx).Value.getText():null)); } break; case 2: { - setState(172); + setState(174); ((RewriteStatementContext)_localctx).regexp = regexp(); _localctx.ret.addValue(((RewriteStatementContext)_localctx).regexp.ret); } break; } - setState(177); + setState(179); ((RewriteStatementContext)_localctx).Value = match(Value); _localctx.ret.addValue((((RewriteStatementContext)_localctx).Value!=null?((RewriteStatementContext)_localctx).Value.getText():null)); - setState(181); + setState(183); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__10) | (1L << T__11) | (1L << T__12) | (1L << T__13))) != 0)) { { - setState(179); + setState(181); ((RewriteStatementContext)_localctx).opt = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__10) | (1L << T__11) | (1L << T__12) | (1L << T__13))) != 0)) ) { @@ -1098,61 +1110,62 @@ public final RewriteStatementContext rewriteStatement() throws RecognitionExcept } public static final String _serializedATN = - "\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd\3\27\u00ba\4\2\t\2"+ + "\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd\3\27\u00bc\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\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\6\2!\n\2\r\2\16\2\"\3\3"+ "\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\5\3.\n\3\3\3\3\3\3\4\3\4\3\4\3\4\3\4"+ - "\3\4\3\4\7\49\n\4\f\4\16\4<\13\4\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3\6\3\6\3"+ - "\6\3\6\5\6I\n\6\3\6\5\6L\n\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3"+ - "\6\3\6\7\6Z\n\6\f\6\16\6]\13\6\3\6\3\6\3\7\3\7\3\7\3\7\3\7\3\7\3\7\7\7"+ - "h\n\7\f\7\16\7k\13\7\3\b\3\b\3\b\3\b\3\b\5\br\n\b\3\b\3\b\3\b\3\b\7\b"+ - "x\n\b\f\b\16\b{\13\b\3\b\3\b\3\t\3\t\3\t\3\t\3\t\5\t\u0084\n\t\3\t\3\t"+ - "\3\t\3\t\3\t\5\t\u008b\n\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\n\6\n\u009a\n\n\r\n\16\n\u009b\3\13\3\13\3\13\3\13\5\13\u00a2\n"+ - "\13\3\13\3\13\3\13\3\13\3\13\5\13\u00a9\n\13\3\f\3\f\3\f\3\f\3\f\3\f\3"+ - "\f\5\f\u00b2\n\f\3\f\3\f\3\f\3\f\5\f\u00b8\n\f\3\f\2\2\r\2\4\6\b\n\f\16"+ - "\20\22\24\26\2\3\3\2\r\20\u00ca\2 \3\2\2\2\4-\3\2\2\2\6\61\3\2\2\2\b="+ - "\3\2\2\2\nH\3\2\2\2\f`\3\2\2\2\16l\3\2\2\2\20~\3\2\2\2\22\u0099\3\2\2"+ - "\2\24\u009d\3\2\2\2\26\u00aa\3\2\2\2\30\31\5\4\3\2\31\32\b\2\1\2\32!\3"+ - "\2\2\2\33\34\5\n\6\2\34\35\b\2\1\2\35!\3\2\2\2\36\37\7\23\2\2\37!\b\2"+ - "\1\2 \30\3\2\2\2 \33\3\2\2\2 \36\3\2\2\2!\"\3\2\2\2\" \3\2\2\2\"#\3\2"+ - "\2\2#\3\3\2\2\2$%\5\26\f\2%&\b\3\1\2&.\3\2\2\2\'(\5\6\4\2()\b\3\1\2)."+ - "\3\2\2\2*+\5\b\5\2+,\b\3\1\2,.\3\2\2\2-$\3\2\2\2-\'\3\2\2\2-*\3\2\2\2"+ - "./\3\2\2\2/\60\7\3\2\2\60\5\3\2\2\2\61\62\7\21\2\2\62:\b\4\1\2\63\64\7"+ - "\21\2\2\649\b\4\1\2\65\66\5\22\n\2\66\67\b\4\1\2\679\3\2\2\28\63\3\2\2"+ - "\28\65\3\2\2\29<\3\2\2\2:8\3\2\2\2:;\3\2\2\2;\7\3\2\2\2<:\3\2\2\2=>\7"+ - "\24\2\2>?\b\5\1\2?@\7\21\2\2@A\b\5\1\2A\t\3\2\2\2BC\5\24\13\2CD\b\6\1"+ - "\2DI\3\2\2\2EF\5\f\7\2FG\b\6\1\2GI\3\2\2\2HB\3\2\2\2HE\3\2\2\2IK\3\2\2"+ - "\2JL\7\23\2\2KJ\3\2\2\2KL\3\2\2\2LM\3\2\2\2M[\7\4\2\2NO\5\4\3\2OP\b\6"+ - "\1\2PZ\3\2\2\2QR\5\n\6\2RS\b\6\1\2SZ\3\2\2\2TU\5\16\b\2UV\b\6\1\2VZ\3"+ - "\2\2\2WX\7\23\2\2XZ\b\6\1\2YN\3\2\2\2YQ\3\2\2\2YT\3\2\2\2YW\3\2\2\2Z]"+ - "\3\2\2\2[Y\3\2\2\2[\\\3\2\2\2\\^\3\2\2\2][\3\2\2\2^_\7\5\2\2_\13\3\2\2"+ - "\2`a\7\21\2\2ai\b\7\1\2bc\7\21\2\2ch\b\7\1\2de\5\22\n\2ef\b\7\1\2fh\3"+ - "\2\2\2gb\3\2\2\2gd\3\2\2\2hk\3\2\2\2ig\3\2\2\2ij\3\2\2\2j\r\3\2\2\2ki"+ - "\3\2\2\2lm\7\6\2\2mn\b\b\1\2no\5\20\t\2oq\b\b\1\2pr\7\23\2\2qp\3\2\2\2"+ - "qr\3\2\2\2rs\3\2\2\2sy\7\4\2\2tu\5\4\3\2uv\b\b\1\2vx\3\2\2\2wt\3\2\2\2"+ - "x{\3\2\2\2yw\3\2\2\2yz\3\2\2\2z|\3\2\2\2{y\3\2\2\2|}\7\5\2\2}\17\3\2\2"+ - "\2~\177\7\7\2\2\177\u0080\7\21\2\2\u0080\u0083\b\t\1\2\u0081\u0082\7\21"+ - "\2\2\u0082\u0084\b\t\1\2\u0083\u0081\3\2\2\2\u0083\u0084\3\2\2\2\u0084"+ - "\u008a\3\2\2\2\u0085\u0086\7\21\2\2\u0086\u008b\b\t\1\2\u0087\u0088\5"+ - "\22\n\2\u0088\u0089\b\t\1\2\u0089\u008b\3\2\2\2\u008a\u0085\3\2\2\2\u008a"+ - "\u0087\3\2\2\2\u008a\u008b\3\2\2\2\u008b\u008c\3\2\2\2\u008c\u008d\7\b"+ - "\2\2\u008d\21\3\2\2\2\u008e\u008f\7\t\2\2\u008f\u009a\b\n\1\2\u0090\u0091"+ - "\7\n\2\2\u0091\u009a\b\n\1\2\u0092\u0093\7\21\2\2\u0093\u009a\b\n\1\2"+ - "\u0094\u0095\7\7\2\2\u0095\u0096\5\22\n\2\u0096\u0097\b\n\1\2\u0097\u0098"+ - "\7\b\2\2\u0098\u009a\3\2\2\2\u0099\u008e\3\2\2\2\u0099\u0090\3\2\2\2\u0099"+ - "\u0092\3\2\2\2\u0099\u0094\3\2\2\2\u009a\u009b\3\2\2\2\u009b\u0099\3\2"+ - "\2\2\u009b\u009c\3\2\2\2\u009c\23\3\2\2\2\u009d\u009e\7\13\2\2\u009e\u00a1"+ - "\b\13\1\2\u009f\u00a0\7\21\2\2\u00a0\u00a2\b\13\1\2\u00a1\u009f\3\2\2"+ - "\2\u00a1\u00a2\3\2\2\2\u00a2\u00a8\3\2\2\2\u00a3\u00a4\7\21\2\2\u00a4"+ - "\u00a9\b\13\1\2\u00a5\u00a6\5\22\n\2\u00a6\u00a7\b\13\1\2\u00a7\u00a9"+ - "\3\2\2\2\u00a8\u00a3\3\2\2\2\u00a8\u00a5\3\2\2\2\u00a9\25\3\2\2\2\u00aa"+ - "\u00ab\7\f\2\2\u00ab\u00b1\b\f\1\2\u00ac\u00ad\7\21\2\2\u00ad\u00b2\b"+ - "\f\1\2\u00ae\u00af\5\22\n\2\u00af\u00b0\b\f\1\2\u00b0\u00b2\3\2\2\2\u00b1"+ - "\u00ac\3\2\2\2\u00b1\u00ae\3\2\2\2\u00b2\u00b3\3\2\2\2\u00b3\u00b4\7\21"+ - "\2\2\u00b4\u00b7\b\f\1\2\u00b5\u00b6\t\2\2\2\u00b6\u00b8\b\f\1\2\u00b7"+ - "\u00b5\3\2\2\2\u00b7\u00b8\3\2\2\2\u00b8\27\3\2\2\2\27 \"-8:HKY[giqy\u0083"+ - "\u008a\u0099\u009b\u00a1\u00a8\u00b1\u00b7"; + "\3\4\3\4\3\4\3\4\7\4;\n\4\f\4\16\4>\13\4\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3"+ + "\6\3\6\3\6\3\6\5\6K\n\6\3\6\5\6N\n\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3"+ + "\6\3\6\3\6\3\6\7\6\\\n\6\f\6\16\6_\13\6\3\6\3\6\3\7\3\7\3\7\3\7\3\7\3"+ + "\7\3\7\7\7j\n\7\f\7\16\7m\13\7\3\b\3\b\3\b\3\b\3\b\5\bt\n\b\3\b\3\b\3"+ + "\b\3\b\7\bz\n\b\f\b\16\b}\13\b\3\b\3\b\3\t\3\t\3\t\3\t\3\t\5\t\u0086\n"+ + "\t\3\t\3\t\3\t\3\t\3\t\5\t\u008d\n\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\n\6\n\u009c\n\n\r\n\16\n\u009d\3\13\3\13\3\13\3\13\5"+ + "\13\u00a4\n\13\3\13\3\13\3\13\3\13\3\13\5\13\u00ab\n\13\3\f\3\f\3\f\3"+ + "\f\3\f\3\f\3\f\5\f\u00b4\n\f\3\f\3\f\3\f\3\f\5\f\u00ba\n\f\3\f\2\2\r\2"+ + "\4\6\b\n\f\16\20\22\24\26\2\3\3\2\r\20\u00cd\2 \3\2\2\2\4-\3\2\2\2\6\61"+ + "\3\2\2\2\b?\3\2\2\2\nJ\3\2\2\2\fb\3\2\2\2\16n\3\2\2\2\20\u0080\3\2\2\2"+ + "\22\u009b\3\2\2\2\24\u009f\3\2\2\2\26\u00ac\3\2\2\2\30\31\5\4\3\2\31\32"+ + "\b\2\1\2\32!\3\2\2\2\33\34\5\n\6\2\34\35\b\2\1\2\35!\3\2\2\2\36\37\7\23"+ + "\2\2\37!\b\2\1\2 \30\3\2\2\2 \33\3\2\2\2 \36\3\2\2\2!\"\3\2\2\2\" \3\2"+ + "\2\2\"#\3\2\2\2#\3\3\2\2\2$%\5\26\f\2%&\b\3\1\2&.\3\2\2\2\'(\5\6\4\2("+ + ")\b\3\1\2).\3\2\2\2*+\5\b\5\2+,\b\3\1\2,.\3\2\2\2-$\3\2\2\2-\'\3\2\2\2"+ + "-*\3\2\2\2./\3\2\2\2/\60\7\3\2\2\60\5\3\2\2\2\61\62\7\21\2\2\62<\b\4\1"+ + "\2\63\64\7\21\2\2\64;\b\4\1\2\65\66\7\24\2\2\66;\b\4\1\2\678\5\22\n\2"+ + "89\b\4\1\29;\3\2\2\2:\63\3\2\2\2:\65\3\2\2\2:\67\3\2\2\2;>\3\2\2\2<:\3"+ + "\2\2\2<=\3\2\2\2=\7\3\2\2\2><\3\2\2\2?@\7\24\2\2@A\b\5\1\2AB\7\21\2\2"+ + "BC\b\5\1\2C\t\3\2\2\2DE\5\24\13\2EF\b\6\1\2FK\3\2\2\2GH\5\f\7\2HI\b\6"+ + "\1\2IK\3\2\2\2JD\3\2\2\2JG\3\2\2\2KM\3\2\2\2LN\7\23\2\2ML\3\2\2\2MN\3"+ + "\2\2\2NO\3\2\2\2O]\7\4\2\2PQ\5\4\3\2QR\b\6\1\2R\\\3\2\2\2ST\5\n\6\2TU"+ + "\b\6\1\2U\\\3\2\2\2VW\5\16\b\2WX\b\6\1\2X\\\3\2\2\2YZ\7\23\2\2Z\\\b\6"+ + "\1\2[P\3\2\2\2[S\3\2\2\2[V\3\2\2\2[Y\3\2\2\2\\_\3\2\2\2][\3\2\2\2]^\3"+ + "\2\2\2^`\3\2\2\2_]\3\2\2\2`a\7\5\2\2a\13\3\2\2\2bc\7\21\2\2ck\b\7\1\2"+ + "de\7\21\2\2ej\b\7\1\2fg\5\22\n\2gh\b\7\1\2hj\3\2\2\2id\3\2\2\2if\3\2\2"+ + "\2jm\3\2\2\2ki\3\2\2\2kl\3\2\2\2l\r\3\2\2\2mk\3\2\2\2no\7\6\2\2op\b\b"+ + "\1\2pq\5\20\t\2qs\b\b\1\2rt\7\23\2\2sr\3\2\2\2st\3\2\2\2tu\3\2\2\2u{\7"+ + "\4\2\2vw\5\4\3\2wx\b\b\1\2xz\3\2\2\2yv\3\2\2\2z}\3\2\2\2{y\3\2\2\2{|\3"+ + "\2\2\2|~\3\2\2\2}{\3\2\2\2~\177\7\5\2\2\177\17\3\2\2\2\u0080\u0081\7\7"+ + "\2\2\u0081\u0082\7\21\2\2\u0082\u0085\b\t\1\2\u0083\u0084\7\21\2\2\u0084"+ + "\u0086\b\t\1\2\u0085\u0083\3\2\2\2\u0085\u0086\3\2\2\2\u0086\u008c\3\2"+ + "\2\2\u0087\u0088\7\21\2\2\u0088\u008d\b\t\1\2\u0089\u008a\5\22\n\2\u008a"+ + "\u008b\b\t\1\2\u008b\u008d\3\2\2\2\u008c\u0087\3\2\2\2\u008c\u0089\3\2"+ + "\2\2\u008c\u008d\3\2\2\2\u008d\u008e\3\2\2\2\u008e\u008f\7\b\2\2\u008f"+ + "\21\3\2\2\2\u0090\u0091\7\t\2\2\u0091\u009c\b\n\1\2\u0092\u0093\7\n\2"+ + "\2\u0093\u009c\b\n\1\2\u0094\u0095\7\21\2\2\u0095\u009c\b\n\1\2\u0096"+ + "\u0097\7\7\2\2\u0097\u0098\5\22\n\2\u0098\u0099\b\n\1\2\u0099\u009a\7"+ + "\b\2\2\u009a\u009c\3\2\2\2\u009b\u0090\3\2\2\2\u009b\u0092\3\2\2\2\u009b"+ + "\u0094\3\2\2\2\u009b\u0096\3\2\2\2\u009c\u009d\3\2\2\2\u009d\u009b\3\2"+ + "\2\2\u009d\u009e\3\2\2\2\u009e\23\3\2\2\2\u009f\u00a0\7\13\2\2\u00a0\u00a3"+ + "\b\13\1\2\u00a1\u00a2\7\21\2\2\u00a2\u00a4\b\13\1\2\u00a3\u00a1\3\2\2"+ + "\2\u00a3\u00a4\3\2\2\2\u00a4\u00aa\3\2\2\2\u00a5\u00a6\7\21\2\2\u00a6"+ + "\u00ab\b\13\1\2\u00a7\u00a8\5\22\n\2\u00a8\u00a9\b\13\1\2\u00a9\u00ab"+ + "\3\2\2\2\u00aa\u00a5\3\2\2\2\u00aa\u00a7\3\2\2\2\u00ab\25\3\2\2\2\u00ac"+ + "\u00ad\7\f\2\2\u00ad\u00b3\b\f\1\2\u00ae\u00af\7\21\2\2\u00af\u00b4\b"+ + "\f\1\2\u00b0\u00b1\5\22\n\2\u00b1\u00b2\b\f\1\2\u00b2\u00b4\3\2\2\2\u00b3"+ + "\u00ae\3\2\2\2\u00b3\u00b0\3\2\2\2\u00b4\u00b5\3\2\2\2\u00b5\u00b6\7\21"+ + "\2\2\u00b6\u00b9\b\f\1\2\u00b7\u00b8\t\2\2\2\u00b8\u00ba\b\f\1\2\u00b9"+ + "\u00b7\3\2\2\2\u00b9\u00ba\3\2\2\2\u00ba\27\3\2\2\2\27 \"-: