Browse Source

[ES|QL] Prevent using unnamed fields in the RERANK command (#127416)

Svilen Mihaylov 5 months ago
parent
commit
54c789d70a

+ 9 - 1
x-pack/plugin/esql/src/main/antlr/EsqlBaseParser.g4

@@ -87,6 +87,14 @@ field
     : (qualifiedName ASSIGN)? booleanExpression
     ;
 
+rerankFields
+    : rerankField (COMMA rerankField)*
+    ;
+
+rerankField
+    : qualifiedName (ASSIGN booleanExpression)?
+    ;
+
 fromCommand
     : FROM indexPatternAndMetadataFields
     ;
@@ -296,7 +304,7 @@ rrfCommand
    ;
 
 rerankCommand
-    : DEV_RERANK queryText=constant ON fields WITH inferenceId=identifierOrParameter
+    : DEV_RERANK queryText=constant ON rerankFields WITH inferenceId=identifierOrParameter
     ;
 
 completionCommand

File diff suppressed because it is too large
+ 2 - 0
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.interp


File diff suppressed because it is too large
+ 357 - 222
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.java


+ 24 - 0
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserBaseListener.java

@@ -140,6 +140,30 @@ public class EsqlBaseParserBaseListener implements EsqlBaseParserListener {
    * <p>The default implementation does nothing.</p>
    */
   @Override public void exitField(EsqlBaseParser.FieldContext ctx) { }
+  /**
+   * {@inheritDoc}
+   *
+   * <p>The default implementation does nothing.</p>
+   */
+  @Override public void enterRerankFields(EsqlBaseParser.RerankFieldsContext ctx) { }
+  /**
+   * {@inheritDoc}
+   *
+   * <p>The default implementation does nothing.</p>
+   */
+  @Override public void exitRerankFields(EsqlBaseParser.RerankFieldsContext ctx) { }
+  /**
+   * {@inheritDoc}
+   *
+   * <p>The default implementation does nothing.</p>
+   */
+  @Override public void enterRerankField(EsqlBaseParser.RerankFieldContext ctx) { }
+  /**
+   * {@inheritDoc}
+   *
+   * <p>The default implementation does nothing.</p>
+   */
+  @Override public void exitRerankField(EsqlBaseParser.RerankFieldContext ctx) { }
   /**
    * {@inheritDoc}
    *

+ 14 - 0
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserBaseVisitor.java

@@ -90,6 +90,20 @@ public class EsqlBaseParserBaseVisitor<T> extends AbstractParseTreeVisitor<T> im
    * {@link #visitChildren} on {@code ctx}.</p>
    */
   @Override public T visitField(EsqlBaseParser.FieldContext ctx) { return visitChildren(ctx); }
+  /**
+   * {@inheritDoc}
+   *
+   * <p>The default implementation returns the result of calling
+   * {@link #visitChildren} on {@code ctx}.</p>
+   */
+  @Override public T visitRerankFields(EsqlBaseParser.RerankFieldsContext ctx) { return visitChildren(ctx); }
+  /**
+   * {@inheritDoc}
+   *
+   * <p>The default implementation returns the result of calling
+   * {@link #visitChildren} on {@code ctx}.</p>
+   */
+  @Override public T visitRerankField(EsqlBaseParser.RerankFieldContext ctx) { return visitChildren(ctx); }
   /**
    * {@inheritDoc}
    *

+ 20 - 0
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserListener.java

@@ -121,6 +121,26 @@ public interface EsqlBaseParserListener extends ParseTreeListener {
    * @param ctx the parse tree
    */
   void exitField(EsqlBaseParser.FieldContext ctx);
+  /**
+   * Enter a parse tree produced by {@link EsqlBaseParser#rerankFields}.
+   * @param ctx the parse tree
+   */
+  void enterRerankFields(EsqlBaseParser.RerankFieldsContext ctx);
+  /**
+   * Exit a parse tree produced by {@link EsqlBaseParser#rerankFields}.
+   * @param ctx the parse tree
+   */
+  void exitRerankFields(EsqlBaseParser.RerankFieldsContext ctx);
+  /**
+   * Enter a parse tree produced by {@link EsqlBaseParser#rerankField}.
+   * @param ctx the parse tree
+   */
+  void enterRerankField(EsqlBaseParser.RerankFieldContext ctx);
+  /**
+   * Exit a parse tree produced by {@link EsqlBaseParser#rerankField}.
+   * @param ctx the parse tree
+   */
+  void exitRerankField(EsqlBaseParser.RerankFieldContext ctx);
   /**
    * Enter a parse tree produced by {@link EsqlBaseParser#fromCommand}.
    * @param ctx the parse tree

+ 12 - 0
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserVisitor.java

@@ -81,6 +81,18 @@ public interface EsqlBaseParserVisitor<T> extends ParseTreeVisitor<T> {
    * @return the visitor result
    */
   T visitField(EsqlBaseParser.FieldContext ctx);
+  /**
+   * Visit a parse tree produced by {@link EsqlBaseParser#rerankFields}.
+   * @param ctx the parse tree
+   * @return the visitor result
+   */
+  T visitRerankFields(EsqlBaseParser.RerankFieldsContext ctx);
+  /**
+   * Visit a parse tree produced by {@link EsqlBaseParser#rerankField}.
+   * @param ctx the parse tree
+   * @return the visitor result
+   */
+  T visitRerankField(EsqlBaseParser.RerankFieldContext ctx);
   /**
    * Visit a parse tree produced by {@link EsqlBaseParser#fromCommand}.
    * @param ctx the parse tree

+ 19 - 0
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/ExpressionBuilder.java

@@ -826,6 +826,25 @@ public abstract class ExpressionBuilder extends IdentifierBuilder {
         return ctx != null ? visitList(this, ctx.field(), Alias.class) : new ArrayList<>();
     }
 
+    @Override
+    public Alias visitRerankField(EsqlBaseParser.RerankFieldContext ctx) {
+        return visitRerankField(ctx, source(ctx));
+    }
+
+    private Alias visitRerankField(EsqlBaseParser.RerankFieldContext ctx, Source source) {
+        UnresolvedAttribute id = visitQualifiedName(ctx.qualifiedName());
+        assert id != null;
+
+        var boolExprCtx = ctx.booleanExpression();
+        Expression value = boolExprCtx == null ? id : expression(boolExprCtx);
+        return new Alias(source, id.name(), value);
+    }
+
+    @Override
+    public List<Alias> visitRerankFields(EsqlBaseParser.RerankFieldsContext ctx) {
+        return ctx != null ? visitList(this, ctx.rerankField(), Alias.class) : new ArrayList<>();
+    }
+
     @Override
     public NamedExpression visitAggField(EsqlBaseParser.AggFieldContext ctx) {
         Source source = source(ctx);

+ 1 - 1
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/LogicalPlanBuilder.java

@@ -731,7 +731,7 @@ public class LogicalPlanBuilder extends ExpressionBuilder {
             );
         }
 
-        return p -> new Rerank(source, p, inferenceId(ctx.inferenceId), queryText, visitFields(ctx.fields()));
+        return p -> new Rerank(source, p, inferenceId(ctx.inferenceId), queryText, visitRerankFields(ctx.rerankFields()));
     }
 
     @Override

+ 13 - 0
x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/AnalyzerTests.java

@@ -3613,6 +3613,19 @@ public class AnalyzerTests extends ESTestCase {
             assertThat(rerank.scoreAttribute(), equalTo(getAttributeByName(relation.output(), MetadataAttribute.SCORE)));
         }
 
+        {
+            // Unnamed field.
+            try {
+                LogicalPlan plan = analyze("""
+                    FROM books METADATA _score
+                    | WHERE title:"food"
+                    | RERANK "food" ON title, SUBSTRING(description, 0, 100), yearRenamed=year WITH `reranking-inference-id`
+                    """, "mapping-books.json");
+            } catch (ParsingException ex) {
+                assertThat(ex.getMessage(), containsString("line 3:36: mismatched input '(' expecting {'=', ',', '.', 'with'}"));
+            }
+        }
+
         {
             VerificationException ve = expectThrows(
                 VerificationException.class,

+ 1 - 1
x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/parser/StatementParserTests.java

@@ -3420,7 +3420,7 @@ public class StatementParserTests extends AbstractStatementParserTests {
 
         expectError("FROM foo* | RERANK \"query text\" WITH inferenceId", "line 1:33: mismatched input 'WITH' expecting 'on'");
 
-        expectError("FROM foo* | RERANK \"query text\" ON title", "line 1:41: mismatched input '<EOF>' expecting {'and',");
+        expectError("FROM foo* | RERANK \"query text\" ON title", "line 1:41: mismatched input '<EOF>' expecting {'=', ',', '.', 'with'}");
     }
 
     public void testCompletionUsingFieldAsPrompt() {

File diff suppressed because it is too large
+ 0 - 0
x-pack/plugin/kql/src/main/java/org/elasticsearch/xpack/kql/parser/KqlBase.interp


+ 176 - 165
x-pack/plugin/kql/src/main/java/org/elasticsearch/xpack/kql/parser/KqlBaseParser.java

@@ -25,21 +25,21 @@ class KqlBaseParser extends Parser {
     protected static final PredictionContextCache _sharedContextCache =
         new PredictionContextCache();
     public static final int
-        DEFAULT_SKIP=1, AND=2, OR=3, NOT=4, COLON=5, OP_LESS=6, OP_LESS_EQ=7, 
-        OP_MORE=8, OP_MORE_EQ=9, LEFT_PARENTHESIS=10, RIGHT_PARENTHESIS=11, LEFT_CURLY_BRACKET=12, 
+        DEFAULT_SKIP=1, AND=2, OR=3, NOT=4, COLON=5, OP_LESS=6, OP_LESS_EQ=7,
+        OP_MORE=8, OP_MORE_EQ=9, LEFT_PARENTHESIS=10, RIGHT_PARENTHESIS=11, LEFT_CURLY_BRACKET=12,
         RIGHT_CURLY_BRACKET=13, UNQUOTED_LITERAL=14, QUOTED_STRING=15, WILDCARD=16;
     public static final int
-        RULE_topLevelQuery = 0, RULE_query = 1, RULE_simpleQuery = 2, RULE_notQuery = 3, 
-        RULE_nestedQuery = 4, RULE_nestedSubQuery = 5, RULE_nestedSimpleSubQuery = 6, 
-        RULE_nestedParenthesizedQuery = 7, RULE_matchAllQuery = 8, RULE_parenthesizedQuery = 9, 
-        RULE_rangeQuery = 10, RULE_rangeQueryValue = 11, RULE_existsQuery = 12, 
-        RULE_fieldQuery = 13, RULE_fieldLessQuery = 14, RULE_fieldQueryValue = 15, 
+        RULE_topLevelQuery = 0, RULE_query = 1, RULE_simpleQuery = 2, RULE_notQuery = 3,
+        RULE_nestedQuery = 4, RULE_nestedSubQuery = 5, RULE_nestedSimpleSubQuery = 6,
+        RULE_nestedParenthesizedQuery = 7, RULE_matchAllQuery = 8, RULE_parenthesizedQuery = 9,
+        RULE_rangeQuery = 10, RULE_rangeQueryValue = 11, RULE_existsQuery = 12,
+        RULE_fieldQuery = 13, RULE_fieldLessQuery = 14, RULE_fieldQueryValue = 15,
         RULE_fieldName = 16;
     private static String[] makeRuleNames() {
         return new String[] {
-            "topLevelQuery", "query", "simpleQuery", "notQuery", "nestedQuery", "nestedSubQuery", 
-            "nestedSimpleSubQuery", "nestedParenthesizedQuery", "matchAllQuery", 
-            "parenthesizedQuery", "rangeQuery", "rangeQueryValue", "existsQuery", 
+            "topLevelQuery", "query", "simpleQuery", "notQuery", "nestedQuery", "nestedSubQuery",
+            "nestedSimpleSubQuery", "nestedParenthesizedQuery", "matchAllQuery",
+            "parenthesizedQuery", "rangeQuery", "rangeQueryValue", "existsQuery",
             "fieldQuery", "fieldLessQuery", "fieldQueryValue", "fieldName"
         };
     }
@@ -47,15 +47,15 @@ class KqlBaseParser extends Parser {
 
     private static String[] makeLiteralNames() {
         return new String[] {
-            null, null, "'and'", "'or'", "'not'", "':'", "'<'", "'<='", "'>'", "'>='", 
+            null, null, "'and'", "'or'", "'not'", "':'", "'<'", "'<='", "'>'", "'>='",
             "'('", "')'", "'{'", "'}'"
         };
     }
     private static final String[] _LITERAL_NAMES = makeLiteralNames();
     private static String[] makeSymbolicNames() {
         return new String[] {
-            null, "DEFAULT_SKIP", "AND", "OR", "NOT", "COLON", "OP_LESS", "OP_LESS_EQ", 
-            "OP_MORE", "OP_MORE_EQ", "LEFT_PARENTHESIS", "RIGHT_PARENTHESIS", "LEFT_CURLY_BRACKET", 
+            null, "DEFAULT_SKIP", "AND", "OR", "NOT", "COLON", "OP_LESS", "OP_LESS_EQ",
+            "OP_MORE", "OP_MORE_EQ", "LEFT_PARENTHESIS", "RIGHT_PARENTHESIS", "LEFT_CURLY_BRACKET",
             "RIGHT_CURLY_BRACKET", "UNQUOTED_LITERAL", "QUOTED_STRING", "WILDCARD"
         };
     }
@@ -173,7 +173,7 @@ class KqlBaseParser extends Parser {
             super(parent, invokingState);
         }
         @Override public int getRuleIndex() { return RULE_query; }
-     
+
         public QueryContext() { }
         public void copyFrom(QueryContext ctx) {
             super.copyFrom(ctx);
@@ -278,7 +278,7 @@ class KqlBaseParser extends Parser {
                     setState(44);
                     query(2);
                     }
-                    } 
+                    }
                 }
                 setState(49);
                 _errHandler.sync(this);
@@ -532,7 +532,7 @@ class KqlBaseParser extends Parser {
             super(parent, invokingState);
         }
         @Override public int getRuleIndex() { return RULE_nestedSubQuery; }
-     
+
         public NestedSubQueryContext() { }
         public void copyFrom(NestedSubQueryContext ctx) {
             super.copyFrom(ctx);
@@ -637,7 +637,7 @@ class KqlBaseParser extends Parser {
                     setState(74);
                     nestedSubQuery(2);
                     }
-                    } 
+                    }
                 }
                 setState(79);
                 _errHandler.sync(this);
@@ -664,6 +664,9 @@ class KqlBaseParser extends Parser {
         public NestedQueryContext nestedQuery() {
             return getRuleContext(NestedQueryContext.class,0);
         }
+        public MatchAllQueryContext matchAllQuery() {
+            return getRuleContext(MatchAllQueryContext.class,0);
+        }
         public NestedParenthesizedQueryContext nestedParenthesizedQuery() {
             return getRuleContext(NestedParenthesizedQueryContext.class,0);
         }
@@ -699,7 +702,7 @@ class KqlBaseParser extends Parser {
         NestedSimpleSubQueryContext _localctx = new NestedSimpleSubQueryContext(_ctx, getState());
         enterRule(_localctx, 12, RULE_nestedSimpleSubQuery);
         try {
-            setState(86);
+            setState(87);
             _errHandler.sync(this);
             switch ( getInterpreter().adaptivePredict(_input,4,_ctx) ) {
             case 1:
@@ -720,27 +723,34 @@ class KqlBaseParser extends Parser {
                 enterOuterAlt(_localctx, 3);
                 {
                 setState(82);
-                nestedParenthesizedQuery();
+                matchAllQuery();
                 }
                 break;
             case 4:
                 enterOuterAlt(_localctx, 4);
                 {
                 setState(83);
-                existsQuery();
+                nestedParenthesizedQuery();
                 }
                 break;
             case 5:
                 enterOuterAlt(_localctx, 5);
                 {
                 setState(84);
-                rangeQuery();
+                existsQuery();
                 }
                 break;
             case 6:
                 enterOuterAlt(_localctx, 6);
                 {
                 setState(85);
+                rangeQuery();
+                }
+                break;
+            case 7:
+                enterOuterAlt(_localctx, 7);
+                {
+                setState(86);
                 fieldQuery();
                 }
                 break;
@@ -789,11 +799,11 @@ class KqlBaseParser extends Parser {
         try {
             enterOuterAlt(_localctx, 1);
             {
-            setState(88);
-            match(LEFT_PARENTHESIS);
             setState(89);
-            nestedSubQuery(0);
+            match(LEFT_PARENTHESIS);
             setState(90);
+            nestedSubQuery(0);
+            setState(91);
             match(RIGHT_PARENTHESIS);
             }
         }
@@ -840,19 +850,19 @@ class KqlBaseParser extends Parser {
         try {
             enterOuterAlt(_localctx, 1);
             {
-            setState(94);
+            setState(95);
             _errHandler.sync(this);
             switch ( getInterpreter().adaptivePredict(_input,5,_ctx) ) {
             case 1:
                 {
-                setState(92);
-                match(WILDCARD);
                 setState(93);
+                match(WILDCARD);
+                setState(94);
                 match(COLON);
                 }
                 break;
             }
-            setState(96);
+            setState(97);
             match(WILDCARD);
             }
         }
@@ -899,11 +909,11 @@ class KqlBaseParser extends Parser {
         try {
             enterOuterAlt(_localctx, 1);
             {
-            setState(98);
-            match(LEFT_PARENTHESIS);
             setState(99);
-            query(0);
+            match(LEFT_PARENTHESIS);
             setState(100);
+            query(0);
+            setState(101);
             match(RIGHT_PARENTHESIS);
             }
         }
@@ -957,9 +967,9 @@ class KqlBaseParser extends Parser {
         try {
             enterOuterAlt(_localctx, 1);
             {
-            setState(102);
-            fieldName();
             setState(103);
+            fieldName();
+            setState(104);
             ((RangeQueryContext)_localctx).operator = _input.LT(1);
             _la = _input.LA(1);
             if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 960L) != 0)) ) {
@@ -970,7 +980,7 @@ class KqlBaseParser extends Parser {
                 _errHandler.reportMatch(this);
                 consume();
             }
-            setState(104);
+            setState(105);
             rangeQueryValue();
             }
         }
@@ -1021,14 +1031,14 @@ class KqlBaseParser extends Parser {
         int _la;
         try {
             int _alt;
-            setState(112);
+            setState(113);
             _errHandler.sync(this);
             switch (_input.LA(1)) {
             case UNQUOTED_LITERAL:
             case WILDCARD:
                 enterOuterAlt(_localctx, 1);
                 {
-                setState(107); 
+                setState(108);
                 _errHandler.sync(this);
                 _alt = 1;
                 do {
@@ -1036,7 +1046,7 @@ class KqlBaseParser extends Parser {
                     case 1:
                         {
                         {
-                        setState(106);
+                        setState(107);
                         _la = _input.LA(1);
                         if ( !(_la==UNQUOTED_LITERAL || _la==WILDCARD) ) {
                         _errHandler.recoverInline(this);
@@ -1052,7 +1062,7 @@ class KqlBaseParser extends Parser {
                     default:
                         throw new NoViableAltException(this);
                     }
-                    setState(109); 
+                    setState(110);
                     _errHandler.sync(this);
                     _alt = getInterpreter().adaptivePredict(_input,6,_ctx);
                 } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER );
@@ -1061,7 +1071,7 @@ class KqlBaseParser extends Parser {
             case QUOTED_STRING:
                 enterOuterAlt(_localctx, 2);
                 {
-                setState(111);
+                setState(112);
                 match(QUOTED_STRING);
                 }
                 break;
@@ -1112,11 +1122,11 @@ class KqlBaseParser extends Parser {
         try {
             enterOuterAlt(_localctx, 1);
             {
-            setState(114);
-            fieldName();
             setState(115);
-            match(COLON);
+            fieldName();
             setState(116);
+            match(COLON);
+            setState(117);
             match(WILDCARD);
             }
         }
@@ -1165,32 +1175,32 @@ class KqlBaseParser extends Parser {
         FieldQueryContext _localctx = new FieldQueryContext(_ctx, getState());
         enterRule(_localctx, 26, RULE_fieldQuery);
         try {
-            setState(128);
+            setState(129);
             _errHandler.sync(this);
             switch ( getInterpreter().adaptivePredict(_input,8,_ctx) ) {
             case 1:
                 enterOuterAlt(_localctx, 1);
                 {
-                setState(118);
-                fieldName();
                 setState(119);
-                match(COLON);
+                fieldName();
                 setState(120);
+                match(COLON);
+                setState(121);
                 fieldQueryValue();
                 }
                 break;
             case 2:
                 enterOuterAlt(_localctx, 2);
                 {
-                setState(122);
-                fieldName();
                 setState(123);
-                match(COLON);
+                fieldName();
                 setState(124);
-                match(LEFT_PARENTHESIS);
+                match(COLON);
                 setState(125);
-                fieldQueryValue();
+                match(LEFT_PARENTHESIS);
                 setState(126);
+                fieldQueryValue();
+                setState(127);
                 match(RIGHT_PARENTHESIS);
                 }
                 break;
@@ -1237,7 +1247,7 @@ class KqlBaseParser extends Parser {
         FieldLessQueryContext _localctx = new FieldLessQueryContext(_ctx, getState());
         enterRule(_localctx, 28, RULE_fieldLessQuery);
         try {
-            setState(135);
+            setState(136);
             _errHandler.sync(this);
             switch (_input.LA(1)) {
             case AND:
@@ -1248,18 +1258,18 @@ class KqlBaseParser extends Parser {
             case WILDCARD:
                 enterOuterAlt(_localctx, 1);
                 {
-                setState(130);
+                setState(131);
                 fieldQueryValue();
                 }
                 break;
             case LEFT_PARENTHESIS:
                 enterOuterAlt(_localctx, 2);
                 {
-                setState(131);
-                match(LEFT_PARENTHESIS);
                 setState(132);
-                fieldQueryValue();
+                match(LEFT_PARENTHESIS);
                 setState(133);
+                fieldQueryValue();
+                setState(134);
                 match(RIGHT_PARENTHESIS);
                 }
                 break;
@@ -1326,18 +1336,18 @@ class KqlBaseParser extends Parser {
         int _la;
         try {
             int _alt;
-            setState(157);
+            setState(158);
             _errHandler.sync(this);
             switch ( getInterpreter().adaptivePredict(_input,15,_ctx) ) {
             case 1:
                 enterOuterAlt(_localctx, 1);
                 {
-                setState(138);
+                setState(139);
                 _errHandler.sync(this);
                 _la = _input.LA(1);
                 if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 28L) != 0)) {
                     {
-                    setState(137);
+                    setState(138);
                     _la = _input.LA(1);
                     if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 28L) != 0)) ) {
                     _errHandler.recoverInline(this);
@@ -1350,7 +1360,7 @@ class KqlBaseParser extends Parser {
                     }
                 }
 
-                setState(141); 
+                setState(142);
                 _errHandler.sync(this);
                 _alt = 1;
                 do {
@@ -1358,7 +1368,7 @@ class KqlBaseParser extends Parser {
                     case 1:
                         {
                         {
-                        setState(140);
+                        setState(141);
                         _la = _input.LA(1);
                         if ( !(_la==UNQUOTED_LITERAL || _la==WILDCARD) ) {
                         _errHandler.recoverInline(this);
@@ -1374,16 +1384,16 @@ class KqlBaseParser extends Parser {
                     default:
                         throw new NoViableAltException(this);
                     }
-                    setState(143); 
+                    setState(144);
                     _errHandler.sync(this);
                     _alt = getInterpreter().adaptivePredict(_input,11,_ctx);
                 } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER );
-                setState(146);
+                setState(147);
                 _errHandler.sync(this);
                 switch ( getInterpreter().adaptivePredict(_input,12,_ctx) ) {
                 case 1:
                     {
-                    setState(145);
+                    setState(146);
                     _la = _input.LA(1);
                     if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 28L) != 0)) ) {
                     _errHandler.recoverInline(this);
@@ -1401,7 +1411,7 @@ class KqlBaseParser extends Parser {
             case 2:
                 enterOuterAlt(_localctx, 2);
                 {
-                setState(148);
+                setState(149);
                 _la = _input.LA(1);
                 if ( !(_la==AND || _la==OR) ) {
                 _errHandler.recoverInline(this);
@@ -1411,12 +1421,12 @@ class KqlBaseParser extends Parser {
                     _errHandler.reportMatch(this);
                     consume();
                 }
-                setState(150);
+                setState(151);
                 _errHandler.sync(this);
                 switch ( getInterpreter().adaptivePredict(_input,13,_ctx) ) {
                 case 1:
                     {
-                    setState(149);
+                    setState(150);
                     _la = _input.LA(1);
                     if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 28L) != 0)) ) {
                     _errHandler.recoverInline(this);
@@ -1434,14 +1444,14 @@ class KqlBaseParser extends Parser {
             case 3:
                 enterOuterAlt(_localctx, 3);
                 {
-                setState(152);
+                setState(153);
                 match(NOT);
-                setState(154);
+                setState(155);
                 _errHandler.sync(this);
                 switch ( getInterpreter().adaptivePredict(_input,14,_ctx) ) {
                 case 1:
                     {
-                    setState(153);
+                    setState(154);
                     _la = _input.LA(1);
                     if ( !(_la==AND || _la==OR) ) {
                     _errHandler.recoverInline(this);
@@ -1459,7 +1469,7 @@ class KqlBaseParser extends Parser {
             case 4:
                 enterOuterAlt(_localctx, 4);
                 {
-                setState(156);
+                setState(157);
                 match(QUOTED_STRING);
                 }
                 break;
@@ -1505,27 +1515,27 @@ class KqlBaseParser extends Parser {
         FieldNameContext _localctx = new FieldNameContext(_ctx, getState());
         enterRule(_localctx, 32, RULE_fieldName);
         try {
-            setState(162);
+            setState(163);
             _errHandler.sync(this);
             switch (_input.LA(1)) {
             case UNQUOTED_LITERAL:
                 enterOuterAlt(_localctx, 1);
                 {
-                setState(159);
+                setState(160);
                 ((FieldNameContext)_localctx).value = match(UNQUOTED_LITERAL);
                 }
                 break;
             case QUOTED_STRING:
                 enterOuterAlt(_localctx, 2);
                 {
-                setState(160);
+                setState(161);
                 ((FieldNameContext)_localctx).value = match(QUOTED_STRING);
                 }
                 break;
             case WILDCARD:
                 enterOuterAlt(_localctx, 3);
                 {
-                setState(161);
+                setState(162);
                 ((FieldNameContext)_localctx).value = match(WILDCARD);
                 }
                 break;
@@ -1569,7 +1579,7 @@ class KqlBaseParser extends Parser {
     }
 
     public static final String _serializedATN =
-        "\u0004\u0001\u0010\u00a5\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001"+
+        "\u0004\u0001\u0010\u00a6\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001"+
         "\u0002\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004\u0007\u0004"+
         "\u0002\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007\u0007\u0007"+
         "\u0002\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b\u0007\u000b"+
@@ -1582,95 +1592,96 @@ class KqlBaseParser extends Parser {
         "\u0003\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001"+
         "\u0004\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+
         "\u0005\u0005\u0005L\b\u0005\n\u0005\f\u0005O\t\u0005\u0001\u0006\u0001"+
-        "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0003\u0006W\b"+
-        "\u0006\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\b\u0001\b"+
-        "\u0003\b_\b\b\u0001\b\u0001\b\u0001\t\u0001\t\u0001\t\u0001\t\u0001\n"+
-        "\u0001\n\u0001\n\u0001\n\u0001\u000b\u0004\u000bl\b\u000b\u000b\u000b"+
-        "\f\u000bm\u0001\u000b\u0003\u000bq\b\u000b\u0001\f\u0001\f\u0001\f\u0001"+
-        "\f\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001"+
-        "\r\u0001\r\u0003\r\u0081\b\r\u0001\u000e\u0001\u000e\u0001\u000e\u0001"+
-        "\u000e\u0001\u000e\u0003\u000e\u0088\b\u000e\u0001\u000f\u0003\u000f\u008b"+
-        "\b\u000f\u0001\u000f\u0004\u000f\u008e\b\u000f\u000b\u000f\f\u000f\u008f"+
-        "\u0001\u000f\u0003\u000f\u0093\b\u000f\u0001\u000f\u0001\u000f\u0003\u000f"+
-        "\u0097\b\u000f\u0001\u000f\u0001\u000f\u0003\u000f\u009b\b\u000f\u0001"+
-        "\u000f\u0003\u000f\u009e\b\u000f\u0001\u0010\u0001\u0010\u0001\u0010\u0003"+
-        "\u0010\u00a3\b\u0010\u0001\u0010\u0000\u0002\u0002\n\u0011\u0000\u0002"+
-        "\u0004\u0006\b\n\f\u000e\u0010\u0012\u0014\u0016\u0018\u001a\u001c\u001e"+
-        " \u0000\u0004\u0001\u0000\u0002\u0003\u0001\u0000\u0006\t\u0002\u0000"+
-        "\u000e\u000e\u0010\u0010\u0001\u0000\u0002\u0004\u00b1\u0000#\u0001\u0000"+
-        "\u0000\u0000\u0002\'\u0001\u0000\u0000\u0000\u0004:\u0001\u0000\u0000"+
-        "\u0000\u0006<\u0001\u0000\u0000\u0000\b?\u0001\u0000\u0000\u0000\nE\u0001"+
-        "\u0000\u0000\u0000\fV\u0001\u0000\u0000\u0000\u000eX\u0001\u0000\u0000"+
-        "\u0000\u0010^\u0001\u0000\u0000\u0000\u0012b\u0001\u0000\u0000\u0000\u0014"+
-        "f\u0001\u0000\u0000\u0000\u0016p\u0001\u0000\u0000\u0000\u0018r\u0001"+
-        "\u0000\u0000\u0000\u001a\u0080\u0001\u0000\u0000\u0000\u001c\u0087\u0001"+
-        "\u0000\u0000\u0000\u001e\u009d\u0001\u0000\u0000\u0000 \u00a2\u0001\u0000"+
-        "\u0000\u0000\"$\u0003\u0002\u0001\u0000#\"\u0001\u0000\u0000\u0000#$\u0001"+
-        "\u0000\u0000\u0000$%\u0001\u0000\u0000\u0000%&\u0005\u0000\u0000\u0001"+
-        "&\u0001\u0001\u0000\u0000\u0000\'(\u0006\u0001\uffff\uffff\u0000()\u0003"+
-        "\u0004\u0002\u0000)/\u0001\u0000\u0000\u0000*+\n\u0002\u0000\u0000+,\u0007"+
-        "\u0000\u0000\u0000,.\u0003\u0002\u0001\u0002-*\u0001\u0000\u0000\u0000"+
-        ".1\u0001\u0000\u0000\u0000/-\u0001\u0000\u0000\u0000/0\u0001\u0000\u0000"+
-        "\u00000\u0003\u0001\u0000\u0000\u00001/\u0001\u0000\u0000\u00002;\u0003"+
-        "\u0006\u0003\u00003;\u0003\b\u0004\u00004;\u0003\u0012\t\u00005;\u0003"+
-        "\u0010\b\u00006;\u0003\u0018\f\u00007;\u0003\u0014\n\u00008;\u0003\u001a"+
-        "\r\u00009;\u0003\u001c\u000e\u0000:2\u0001\u0000\u0000\u0000:3\u0001\u0000"+
-        "\u0000\u0000:4\u0001\u0000\u0000\u0000:5\u0001\u0000\u0000\u0000:6\u0001"+
-        "\u0000\u0000\u0000:7\u0001\u0000\u0000\u0000:8\u0001\u0000\u0000\u0000"+
-        ":9\u0001\u0000\u0000\u0000;\u0005\u0001\u0000\u0000\u0000<=\u0005\u0004"+
-        "\u0000\u0000=>\u0003\u0004\u0002\u0000>\u0007\u0001\u0000\u0000\u0000"+
-        "?@\u0003 \u0010\u0000@A\u0005\u0005\u0000\u0000AB\u0005\f\u0000\u0000"+
-        "BC\u0003\n\u0005\u0000CD\u0005\r\u0000\u0000D\t\u0001\u0000\u0000\u0000"+
-        "EF\u0006\u0005\uffff\uffff\u0000FG\u0003\f\u0006\u0000GM\u0001\u0000\u0000"+
-        "\u0000HI\n\u0002\u0000\u0000IJ\u0007\u0000\u0000\u0000JL\u0003\n\u0005"+
-        "\u0002KH\u0001\u0000\u0000\u0000LO\u0001\u0000\u0000\u0000MK\u0001\u0000"+
-        "\u0000\u0000MN\u0001\u0000\u0000\u0000N\u000b\u0001\u0000\u0000\u0000"+
-        "OM\u0001\u0000\u0000\u0000PW\u0003\u0006\u0003\u0000QW\u0003\b\u0004\u0000"+
-        "RW\u0003\u000e\u0007\u0000SW\u0003\u0018\f\u0000TW\u0003\u0014\n\u0000"+
-        "UW\u0003\u001a\r\u0000VP\u0001\u0000\u0000\u0000VQ\u0001\u0000\u0000\u0000"+
-        "VR\u0001\u0000\u0000\u0000VS\u0001\u0000\u0000\u0000VT\u0001\u0000\u0000"+
-        "\u0000VU\u0001\u0000\u0000\u0000W\r\u0001\u0000\u0000\u0000XY\u0005\n"+
-        "\u0000\u0000YZ\u0003\n\u0005\u0000Z[\u0005\u000b\u0000\u0000[\u000f\u0001"+
-        "\u0000\u0000\u0000\\]\u0005\u0010\u0000\u0000]_\u0005\u0005\u0000\u0000"+
-        "^\\\u0001\u0000\u0000\u0000^_\u0001\u0000\u0000\u0000_`\u0001\u0000\u0000"+
-        "\u0000`a\u0005\u0010\u0000\u0000a\u0011\u0001\u0000\u0000\u0000bc\u0005"+
-        "\n\u0000\u0000cd\u0003\u0002\u0001\u0000de\u0005\u000b\u0000\u0000e\u0013"+
-        "\u0001\u0000\u0000\u0000fg\u0003 \u0010\u0000gh\u0007\u0001\u0000\u0000"+
-        "hi\u0003\u0016\u000b\u0000i\u0015\u0001\u0000\u0000\u0000jl\u0007\u0002"+
-        "\u0000\u0000kj\u0001\u0000\u0000\u0000lm\u0001\u0000\u0000\u0000mk\u0001"+
-        "\u0000\u0000\u0000mn\u0001\u0000\u0000\u0000nq\u0001\u0000\u0000\u0000"+
-        "oq\u0005\u000f\u0000\u0000pk\u0001\u0000\u0000\u0000po\u0001\u0000\u0000"+
-        "\u0000q\u0017\u0001\u0000\u0000\u0000rs\u0003 \u0010\u0000st\u0005\u0005"+
-        "\u0000\u0000tu\u0005\u0010\u0000\u0000u\u0019\u0001\u0000\u0000\u0000"+
-        "vw\u0003 \u0010\u0000wx\u0005\u0005\u0000\u0000xy\u0003\u001e\u000f\u0000"+
-        "y\u0081\u0001\u0000\u0000\u0000z{\u0003 \u0010\u0000{|\u0005\u0005\u0000"+
-        "\u0000|}\u0005\n\u0000\u0000}~\u0003\u001e\u000f\u0000~\u007f\u0005\u000b"+
-        "\u0000\u0000\u007f\u0081\u0001\u0000\u0000\u0000\u0080v\u0001\u0000\u0000"+
-        "\u0000\u0080z\u0001\u0000\u0000\u0000\u0081\u001b\u0001\u0000\u0000\u0000"+
-        "\u0082\u0088\u0003\u001e\u000f\u0000\u0083\u0084\u0005\n\u0000\u0000\u0084"+
-        "\u0085\u0003\u001e\u000f\u0000\u0085\u0086\u0005\u000b\u0000\u0000\u0086"+
-        "\u0088\u0001\u0000\u0000\u0000\u0087\u0082\u0001\u0000\u0000\u0000\u0087"+
-        "\u0083\u0001\u0000\u0000\u0000\u0088\u001d\u0001\u0000\u0000\u0000\u0089"+
-        "\u008b\u0007\u0003\u0000\u0000\u008a\u0089\u0001\u0000\u0000\u0000\u008a"+
-        "\u008b\u0001\u0000\u0000\u0000\u008b\u008d\u0001\u0000\u0000\u0000\u008c"+
-        "\u008e\u0007\u0002\u0000\u0000\u008d\u008c\u0001\u0000\u0000\u0000\u008e"+
-        "\u008f\u0001\u0000\u0000\u0000\u008f\u008d\u0001\u0000\u0000\u0000\u008f"+
-        "\u0090\u0001\u0000\u0000\u0000\u0090\u0092\u0001\u0000\u0000\u0000\u0091"+
-        "\u0093\u0007\u0003\u0000\u0000\u0092\u0091\u0001\u0000\u0000\u0000\u0092"+
-        "\u0093\u0001\u0000\u0000\u0000\u0093\u009e\u0001\u0000\u0000\u0000\u0094"+
-        "\u0096\u0007\u0000\u0000\u0000\u0095\u0097\u0007\u0003\u0000\u0000\u0096"+
-        "\u0095\u0001\u0000\u0000\u0000\u0096\u0097\u0001\u0000\u0000\u0000\u0097"+
-        "\u009e\u0001\u0000\u0000\u0000\u0098\u009a\u0005\u0004\u0000\u0000\u0099"+
-        "\u009b\u0007\u0000\u0000\u0000\u009a\u0099\u0001\u0000\u0000\u0000\u009a"+
-        "\u009b\u0001\u0000\u0000\u0000\u009b\u009e\u0001\u0000\u0000\u0000\u009c"+
-        "\u009e\u0005\u000f\u0000\u0000\u009d\u008a\u0001\u0000\u0000\u0000\u009d"+
-        "\u0094\u0001\u0000\u0000\u0000\u009d\u0098\u0001\u0000\u0000\u0000\u009d"+
-        "\u009c\u0001\u0000\u0000\u0000\u009e\u001f\u0001\u0000\u0000\u0000\u009f"+
-        "\u00a3\u0005\u000e\u0000\u0000\u00a0\u00a3\u0005\u000f\u0000\u0000\u00a1"+
-        "\u00a3\u0005\u0010\u0000\u0000\u00a2\u009f\u0001\u0000\u0000\u0000\u00a2"+
-        "\u00a0\u0001\u0000\u0000\u0000\u00a2\u00a1\u0001\u0000\u0000\u0000\u00a3"+
-        "!\u0001\u0000\u0000\u0000\u0011#/:MV^mp\u0080\u0087\u008a\u008f\u0092"+
-        "\u0096\u009a\u009d\u00a2";
+        "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0003"+
+        "\u0006X\b\u0006\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001"+
+        "\b\u0001\b\u0003\b`\b\b\u0001\b\u0001\b\u0001\t\u0001\t\u0001\t\u0001"+
+        "\t\u0001\n\u0001\n\u0001\n\u0001\n\u0001\u000b\u0004\u000bm\b\u000b\u000b"+
+        "\u000b\f\u000bn\u0001\u000b\u0003\u000br\b\u000b\u0001\f\u0001\f\u0001"+
+        "\f\u0001\f\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001"+
+        "\r\u0001\r\u0001\r\u0003\r\u0082\b\r\u0001\u000e\u0001\u000e\u0001\u000e"+
+        "\u0001\u000e\u0001\u000e\u0003\u000e\u0089\b\u000e\u0001\u000f\u0003\u000f"+
+        "\u008c\b\u000f\u0001\u000f\u0004\u000f\u008f\b\u000f\u000b\u000f\f\u000f"+
+        "\u0090\u0001\u000f\u0003\u000f\u0094\b\u000f\u0001\u000f\u0001\u000f\u0003"+
+        "\u000f\u0098\b\u000f\u0001\u000f\u0001\u000f\u0003\u000f\u009c\b\u000f"+
+        "\u0001\u000f\u0003\u000f\u009f\b\u000f\u0001\u0010\u0001\u0010\u0001\u0010"+
+        "\u0003\u0010\u00a4\b\u0010\u0001\u0010\u0000\u0002\u0002\n\u0011\u0000"+
+        "\u0002\u0004\u0006\b\n\f\u000e\u0010\u0012\u0014\u0016\u0018\u001a\u001c"+
+        "\u001e \u0000\u0004\u0001\u0000\u0002\u0003\u0001\u0000\u0006\t\u0002"+
+        "\u0000\u000e\u000e\u0010\u0010\u0001\u0000\u0002\u0004\u00b3\u0000#\u0001"+
+        "\u0000\u0000\u0000\u0002\'\u0001\u0000\u0000\u0000\u0004:\u0001\u0000"+
+        "\u0000\u0000\u0006<\u0001\u0000\u0000\u0000\b?\u0001\u0000\u0000\u0000"+
+        "\nE\u0001\u0000\u0000\u0000\fW\u0001\u0000\u0000\u0000\u000eY\u0001\u0000"+
+        "\u0000\u0000\u0010_\u0001\u0000\u0000\u0000\u0012c\u0001\u0000\u0000\u0000"+
+        "\u0014g\u0001\u0000\u0000\u0000\u0016q\u0001\u0000\u0000\u0000\u0018s"+
+        "\u0001\u0000\u0000\u0000\u001a\u0081\u0001\u0000\u0000\u0000\u001c\u0088"+
+        "\u0001\u0000\u0000\u0000\u001e\u009e\u0001\u0000\u0000\u0000 \u00a3\u0001"+
+        "\u0000\u0000\u0000\"$\u0003\u0002\u0001\u0000#\"\u0001\u0000\u0000\u0000"+
+        "#$\u0001\u0000\u0000\u0000$%\u0001\u0000\u0000\u0000%&\u0005\u0000\u0000"+
+        "\u0001&\u0001\u0001\u0000\u0000\u0000\'(\u0006\u0001\uffff\uffff\u0000"+
+        "()\u0003\u0004\u0002\u0000)/\u0001\u0000\u0000\u0000*+\n\u0002\u0000\u0000"+
+        "+,\u0007\u0000\u0000\u0000,.\u0003\u0002\u0001\u0002-*\u0001\u0000\u0000"+
+        "\u0000.1\u0001\u0000\u0000\u0000/-\u0001\u0000\u0000\u0000/0\u0001\u0000"+
+        "\u0000\u00000\u0003\u0001\u0000\u0000\u00001/\u0001\u0000\u0000\u0000"+
+        "2;\u0003\u0006\u0003\u00003;\u0003\b\u0004\u00004;\u0003\u0012\t\u0000"+
+        "5;\u0003\u0010\b\u00006;\u0003\u0018\f\u00007;\u0003\u0014\n\u00008;\u0003"+
+        "\u001a\r\u00009;\u0003\u001c\u000e\u0000:2\u0001\u0000\u0000\u0000:3\u0001"+
+        "\u0000\u0000\u0000:4\u0001\u0000\u0000\u0000:5\u0001\u0000\u0000\u0000"+
+        ":6\u0001\u0000\u0000\u0000:7\u0001\u0000\u0000\u0000:8\u0001\u0000\u0000"+
+        "\u0000:9\u0001\u0000\u0000\u0000;\u0005\u0001\u0000\u0000\u0000<=\u0005"+
+        "\u0004\u0000\u0000=>\u0003\u0004\u0002\u0000>\u0007\u0001\u0000\u0000"+
+        "\u0000?@\u0003 \u0010\u0000@A\u0005\u0005\u0000\u0000AB\u0005\f\u0000"+
+        "\u0000BC\u0003\n\u0005\u0000CD\u0005\r\u0000\u0000D\t\u0001\u0000\u0000"+
+        "\u0000EF\u0006\u0005\uffff\uffff\u0000FG\u0003\f\u0006\u0000GM\u0001\u0000"+
+        "\u0000\u0000HI\n\u0002\u0000\u0000IJ\u0007\u0000\u0000\u0000JL\u0003\n"+
+        "\u0005\u0002KH\u0001\u0000\u0000\u0000LO\u0001\u0000\u0000\u0000MK\u0001"+
+        "\u0000\u0000\u0000MN\u0001\u0000\u0000\u0000N\u000b\u0001\u0000\u0000"+
+        "\u0000OM\u0001\u0000\u0000\u0000PX\u0003\u0006\u0003\u0000QX\u0003\b\u0004"+
+        "\u0000RX\u0003\u0010\b\u0000SX\u0003\u000e\u0007\u0000TX\u0003\u0018\f"+
+        "\u0000UX\u0003\u0014\n\u0000VX\u0003\u001a\r\u0000WP\u0001\u0000\u0000"+
+        "\u0000WQ\u0001\u0000\u0000\u0000WR\u0001\u0000\u0000\u0000WS\u0001\u0000"+
+        "\u0000\u0000WT\u0001\u0000\u0000\u0000WU\u0001\u0000\u0000\u0000WV\u0001"+
+        "\u0000\u0000\u0000X\r\u0001\u0000\u0000\u0000YZ\u0005\n\u0000\u0000Z["+
+        "\u0003\n\u0005\u0000[\\\u0005\u000b\u0000\u0000\\\u000f\u0001\u0000\u0000"+
+        "\u0000]^\u0005\u0010\u0000\u0000^`\u0005\u0005\u0000\u0000_]\u0001\u0000"+
+        "\u0000\u0000_`\u0001\u0000\u0000\u0000`a\u0001\u0000\u0000\u0000ab\u0005"+
+        "\u0010\u0000\u0000b\u0011\u0001\u0000\u0000\u0000cd\u0005\n\u0000\u0000"+
+        "de\u0003\u0002\u0001\u0000ef\u0005\u000b\u0000\u0000f\u0013\u0001\u0000"+
+        "\u0000\u0000gh\u0003 \u0010\u0000hi\u0007\u0001\u0000\u0000ij\u0003\u0016"+
+        "\u000b\u0000j\u0015\u0001\u0000\u0000\u0000km\u0007\u0002\u0000\u0000"+
+        "lk\u0001\u0000\u0000\u0000mn\u0001\u0000\u0000\u0000nl\u0001\u0000\u0000"+
+        "\u0000no\u0001\u0000\u0000\u0000or\u0001\u0000\u0000\u0000pr\u0005\u000f"+
+        "\u0000\u0000ql\u0001\u0000\u0000\u0000qp\u0001\u0000\u0000\u0000r\u0017"+
+        "\u0001\u0000\u0000\u0000st\u0003 \u0010\u0000tu\u0005\u0005\u0000\u0000"+
+        "uv\u0005\u0010\u0000\u0000v\u0019\u0001\u0000\u0000\u0000wx\u0003 \u0010"+
+        "\u0000xy\u0005\u0005\u0000\u0000yz\u0003\u001e\u000f\u0000z\u0082\u0001"+
+        "\u0000\u0000\u0000{|\u0003 \u0010\u0000|}\u0005\u0005\u0000\u0000}~\u0005"+
+        "\n\u0000\u0000~\u007f\u0003\u001e\u000f\u0000\u007f\u0080\u0005\u000b"+
+        "\u0000\u0000\u0080\u0082\u0001\u0000\u0000\u0000\u0081w\u0001\u0000\u0000"+
+        "\u0000\u0081{\u0001\u0000\u0000\u0000\u0082\u001b\u0001\u0000\u0000\u0000"+
+        "\u0083\u0089\u0003\u001e\u000f\u0000\u0084\u0085\u0005\n\u0000\u0000\u0085"+
+        "\u0086\u0003\u001e\u000f\u0000\u0086\u0087\u0005\u000b\u0000\u0000\u0087"+
+        "\u0089\u0001\u0000\u0000\u0000\u0088\u0083\u0001\u0000\u0000\u0000\u0088"+
+        "\u0084\u0001\u0000\u0000\u0000\u0089\u001d\u0001\u0000\u0000\u0000\u008a"+
+        "\u008c\u0007\u0003\u0000\u0000\u008b\u008a\u0001\u0000\u0000\u0000\u008b"+
+        "\u008c\u0001\u0000\u0000\u0000\u008c\u008e\u0001\u0000\u0000\u0000\u008d"+
+        "\u008f\u0007\u0002\u0000\u0000\u008e\u008d\u0001\u0000\u0000\u0000\u008f"+
+        "\u0090\u0001\u0000\u0000\u0000\u0090\u008e\u0001\u0000\u0000\u0000\u0090"+
+        "\u0091\u0001\u0000\u0000\u0000\u0091\u0093\u0001\u0000\u0000\u0000\u0092"+
+        "\u0094\u0007\u0003\u0000\u0000\u0093\u0092\u0001\u0000\u0000\u0000\u0093"+
+        "\u0094\u0001\u0000\u0000\u0000\u0094\u009f\u0001\u0000\u0000\u0000\u0095"+
+        "\u0097\u0007\u0000\u0000\u0000\u0096\u0098\u0007\u0003\u0000\u0000\u0097"+
+        "\u0096\u0001\u0000\u0000\u0000\u0097\u0098\u0001\u0000\u0000\u0000\u0098"+
+        "\u009f\u0001\u0000\u0000\u0000\u0099\u009b\u0005\u0004\u0000\u0000\u009a"+
+        "\u009c\u0007\u0000\u0000\u0000\u009b\u009a\u0001\u0000\u0000\u0000\u009b"+
+        "\u009c\u0001\u0000\u0000\u0000\u009c\u009f\u0001\u0000\u0000\u0000\u009d"+
+        "\u009f\u0005\u000f\u0000\u0000\u009e\u008b\u0001\u0000\u0000\u0000\u009e"+
+        "\u0095\u0001\u0000\u0000\u0000\u009e\u0099\u0001\u0000\u0000\u0000\u009e"+
+        "\u009d\u0001\u0000\u0000\u0000\u009f\u001f\u0001\u0000\u0000\u0000\u00a0"+
+        "\u00a4\u0005\u000e\u0000\u0000\u00a1\u00a4\u0005\u000f\u0000\u0000\u00a2"+
+        "\u00a4\u0005\u0010\u0000\u0000\u00a3\u00a0\u0001\u0000\u0000\u0000\u00a3"+
+        "\u00a1\u0001\u0000\u0000\u0000\u00a3\u00a2\u0001\u0000\u0000\u0000\u00a4"+
+        "!\u0001\u0000\u0000\u0000\u0011#/:MW_nq\u0081\u0088\u008b\u0090\u0093"+
+        "\u0097\u009b\u009e\u00a3";
     public static final ATN _ATN =
         new ATNDeserializer().deserialize(_serializedATN.toCharArray());
     static {

Some files were not shown because too many files changed in this diff