Merge branch 'master' into NLPCRAFT-160

# Conflicts:
#	nlpcraft/src/main/scala/org/apache/nlpcraft/examples/lightswitch/lightswitch_model.yaml
diff --git a/KEYS b/KEYS
deleted file mode 100644
index 1c5b337..0000000
--- a/KEYS
+++ /dev/null
@@ -1,163 +0,0 @@
-pub   rsa4096 2020-04-11 [SC]
-      4793 17FA 7AFD 44AC A4CC  0778 C7C4 3555 607F E2EF
-uid           [ultimate] Nikita Ivanov <nivanov30@gmail.com>
-sub   rsa4096 2020-04-11 [E]
-
------BEGIN PGP PUBLIC KEY BLOCK-----
-
-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
-=5XS0
------END PGP PUBLIC KEY BLOCK-----
-
-pub   rsa4096 2020-03-31 [SC] [expires: 2024-03-31]
-      223A2AADD175994F4450467491D161EDD8405C82
-uid           [ultimate] Aaron Radzinski <aradzinski@datalingvo.com>
-sig 3        91D161EDD8405C82 2020-03-31  Aaron Radzinski <aradzinski@datalingvo.com>
-sub   rsa4096 2020-03-31 [E] [expires: 2024-03-31]
-sig          91D161EDD8405C82 2020-03-31  Aaron Radzinski <aradzinski@datalingvo.com>
-
------BEGIN PGP PUBLIC KEY BLOCK-----
-
-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
-U1vaIvVhIXD6xZ6ug/RDsFUJSQ==
-=O7in
------END PGP PUBLIC KEY BLOCK-----
-
-pub   rsa3072 2020-08-23 [SC] [expires: 2022-08-23]
-      CD57A1B6C91F3D512C1D8B07825F1640958F5D27
-uid           [ultimate] Aaron Radzinski <aradzinski@datalingvo.com>
-sub   rsa3072 2020-08-23 [E] [expires: 2022-08-23]
-
------BEGIN PGP PUBLIC KEY BLOCK-----
-
-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
-=2LXc
------END PGP PUBLIC KEY BLOCK-----
\ No newline at end of file
diff --git a/README.md b/README.md
index 20e7e82..d481c59 100644
--- a/README.md
+++ b/README.md
@@ -50,8 +50,19 @@
 ### English Focused
 NLPCraft focuses on processing English language delivering the ease of use and unparalleled comprehension for the language spoken by more than a billion people.
 
+### By Devs - For Devs
+Built with a singular focus - provide developers with unprecedented productivity and efficiency when building  modern NLI applications.
+
+### Advanced NLP Toolset
+Combines easy-of-use and development productivity with state-of-the-art NLP capabilities like short-term-memory (STM) support, advanced intent DSL with deterministic matching, and composable NEs.
+                        
 ### Java-First
-REST API and Java-based implementation natively support world's largest ecosystem of development tools, programming languages and services.
+REST API and Java-based implementation natively support world's largest ecosystem of development tools, multiple programming languages, frameworks and services.
+
+<a target=_ href="https://www.oracle.com/java/"><img src="https://nlpcraft.apache.org/images/java2.png" height="32px" alt=""></a>
+<a target=_ href="https://scala-lang.org/"><img src="https://nlpcraft.apache.org/images/scala-logo.png" height="24px" alt=""></a>
+<a target=_ href="https://groovy-lang.org/"><img src="https://nlpcraft.apache.org/images/groovy.png" height="32px" alt=""></a>
+<a target=_ href="https://kotlinlang.org/"><img src="https://nlpcraft.apache.org/images/kotlin.png" height="32px" alt=""></a>
 
 ### Model-As-A-Code
 Model-as-a-code convention natively supports any system development life cycle tools and frameworks in Java eco-system.
@@ -138,7 +149,7 @@
       - "{<ACTION>|shut|kill|stop|eliminate} {off|out} <LIGHT>"
       - "no <LIGHT>"
 intents:
-  - "intent=ls conv=false term(act)={groups @@ 'act'} term(loc)={id == 'ls:loc'}*"
+  - "intent=ls term(act)~{groups @@ 'act'} term(loc)~{id == 'ls:loc'}*"
 ```
 
 ### Model Implementation
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/alarm/alarm_model.json b/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/alarm/alarm_model.json
index a076fa7..0e17713 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/alarm/alarm_model.json
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/alarm/alarm_model.json
@@ -34,6 +34,6 @@
         }
     ],
     "intents": [
-        "intent=alarm term={id=='x:alarm'} term(nums)={id=='nlpcraft:num' && ~nlpcraft:num:unittype=='datetime' && ~nlpcraft:num:isequalcondition==true}[0,7]"
+        "intent=alarm term~{id=='x:alarm'} term(nums)~{id=='nlpcraft:num' && ~nlpcraft:num:unittype=='datetime' && ~nlpcraft:num:isequalcondition==true}[0,7]"
     ]
 }
\ No newline at end of file
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/lightswitch/lightswitch_model.yaml b/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/lightswitch/lightswitch_model.yaml
index 8793f50..44419c5 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/lightswitch/lightswitch_model.yaml
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/lightswitch/lightswitch_model.yaml
@@ -52,4 +52,4 @@
       - "{<ACTION>|shut|kill|stop|eliminate} {off|out} <LIGHT>"
       - "no <LIGHT>"
 intents:
-  - "intent=ls conv=true term(act)={groups @@ 'act'} term(loc)={id == 'ls:loc'}*"
\ No newline at end of file
+  - "intent=ls term(act)={groups @@ 'act'} term(loc)={id == 'ls:loc'}*"
\ No newline at end of file
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/phone/PhoneModel.java b/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/phone/PhoneModel.java
index 05c94aa..250c492 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/phone/PhoneModel.java
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/phone/PhoneModel.java
@@ -51,7 +51,6 @@
      */
     @NCIntent("" +
         "intent=action " +
-        "conv=false " + // No conversation support.
         "term={id == 'phone:act'} " +
         // Either organization, person or a phone number (or a combination of).
         "term(rcpt)={id == 'google:organization' || id == 'google:person' || id == 'google:phone_number'}[1,3]"
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/sql/SqlModel.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/sql/SqlModel.scala
index 931f7ac..a837967 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/sql/SqlModel.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/sql/SqlModel.scala
@@ -277,15 +277,15 @@
       * @param limitTokOpt Limit token. Optional.
       */
     @NCIntent(
-        "intent=commonReport conv=true " +
-        "term(tbls)={groups @@ 'table'}[0,7] " +
-        "term(cols)={id == 'col:date' || id == 'col:num' || id == 'col:varchar'}[0,7] " +
-        "term(condNums)={id == 'condition:num'}[0,7] " +
-        "term(condVals)={id == 'condition:value'}[0,7] " +
-        "term(condDates)={id == 'condition:date'}[0,7] " +
-        "term(condFreeDate)={id == 'nlpcraft:date'}? " +
-        "term(sort)={id == 'nlpcraft:sort'}? " +
-        "term(limit)={id == 'nlpcraft:limit'}?"
+        "intent=commonReport " +
+        "term(tbls)~{groups @@ 'table'}[0,7] " +
+        "term(cols)~{id == 'col:date' || id == 'col:num' || id == 'col:varchar'}[0,7] " +
+        "term(condNums)~{id == 'condition:num'}[0,7] " +
+        "term(condVals)~{id == 'condition:value'}[0,7] " +
+        "term(condDates)~{id == 'condition:date'}[0,7] " +
+        "term(condFreeDate)~{id == 'nlpcraft:date'}? " +
+        "term(sort)~{id == 'nlpcraft:sort'}? " +
+        "term(limit)~{id == 'nlpcraft:limit'}?"
     )
     @NCIntentSample(Array(
         "order date, please!",
@@ -339,15 +339,15 @@
       * @param limitTokOpt Limit token. Optional.
       */
     @NCIntent(
-        "intent=customSortReport conv=true " +
-        "term(sort)={id == 'sort:best' || id == 'sort:worst'} " +
-        "term(tbls)={groups @@ 'table'}[0,7] " +
-        "term(cols)={id == 'col:date' || id == 'col:num' || id == 'col:varchar'}[0,7] " +
-        "term(condNums)={id == 'condition:num'}[0,7] " +
-        "term(condVals)={id == 'condition:value'}[0,7] " +
-        "term(condDates)={id == 'condition:date'}[0,7] " +
-        "term(condFreeDate)={id == 'nlpcraft:date'}? " +
-        "term(limit)={id == 'nlpcraft:limit'}?"
+        "intent=customSortReport " +
+        "term(sort)~{id == 'sort:best' || id == 'sort:worst'} " +
+        "term(tbls)~{groups @@ 'table'}[0,7] " +
+        "term(cols)~{id == 'col:date' || id == 'col:num' || id == 'col:varchar'}[0,7] " +
+        "term(condNums)~{id == 'condition:num'}[0,7] " +
+        "term(condVals)~{id == 'condition:value'}[0,7] " +
+        "term(condDates)~{id == 'condition:date'}[0,7] " +
+        "term(condFreeDate)~{id == 'nlpcraft:date'}? " +
+        "term(limit)~{id == 'nlpcraft:limit'}?"
     )
     @NCIntentSample(Array(
         "What are the least performing categories for the last quarter?"
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/time/TimeModel.java b/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/time/TimeModel.java
index 696529e..63b7090 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/time/TimeModel.java
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/time/TimeModel.java
@@ -92,7 +92,7 @@
      * @param cityTok Token for 'geo' term.
      * @return Query result.
      */
-    @NCIntent("intent=intent2 conv=true term={id=='x:time'} term(city)={id=='nlpcraft:city'}")
+    @NCIntent("intent=intent2 term~{id=='x:time'} term(city)~{id=='nlpcraft:city'}")
     @NCIntentSample({
         "What time is it now in New York City?",
         "What's the current time in Moscow?",
@@ -119,7 +119,7 @@
      * @param ctx Intent solver context.
      * @return Query result.
      */
-    @NCIntent("intent=intent1 conv=false term={id=='x:time'}")
+    @NCIntent("intent=intent1 term={id=='x:time'}")
     @NCIntentSample({
         "What's the local time?"
     })
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/weather/WeatherModel.java b/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/weather/WeatherModel.java
index 872cb03..46dcfad 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/weather/WeatherModel.java
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/weather/WeatherModel.java
@@ -124,11 +124,10 @@
      */
     @NCIntent(
         "intent=req " +
-        "conv=true " + // Support conversation context (i.e. short term memory).
-        "term={id == 'wt:phen'}* " + // Zero or more weather phenomenon.
-        "term(ind)={groups @@ 'indicator'}* " + // Optional indicator words (zero or more).
-        "term(city)={id == 'nlpcraft:city'}? " + // Optional city.
-        "term(date)={id == 'nlpcraft:date'}?" // Optional date (overrides indicator words).
+        "term~{id == 'wt:phen'}* " + // Zero or more weather phenomenon.
+        "term(ind)~{groups @@ 'indicator'}* " + // Optional indicator words (zero or more).
+        "term(city)~{id == 'nlpcraft:city'}? " + // Optional city.
+        "term(date)~{id == 'nlpcraft:date'}?" // Optional date (overrides indicator words).
     )
     // NOTE: each samples group will reset conversation STM.
     @NCIntentSample({
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCContext.java b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCContext.java
index 385c834..9e5028d 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCContext.java
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCContext.java
@@ -24,7 +24,7 @@
  * Data model query context. This context defines fully processed user input and its associated data that
  * the model's intents need to process and return the result.
  * 
- * @see NCIntentMatch
+ * @see NCIntentMatch#getContext() 
  */
 public interface NCContext extends Serializable {
     /**
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCIntentMatch.java b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCIntentMatch.java
index 669a0e3..8552856 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCIntentMatch.java
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCIntentMatch.java
@@ -32,6 +32,7 @@
  * @see NCIntent
  * @see NCIntentTerm
  * @see NCIntentSkip
+ * @see NCIntentSample
  * @see NCIntentRef
  */
 public interface NCIntentMatch extends Serializable {
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCIntentSkip.java b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCIntentSkip.java
index f3e7c85..b196632 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCIntentSkip.java
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCIntentSkip.java
@@ -36,6 +36,7 @@
  * @see NCIntent
  * @see NCIntentTerm
  * @see NCIntentRef
+ * @see NCIntentSample
  * @see NCIntentMatch
  * @see NCModel#onMatchedIntent(NCIntentMatch)
  */
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCToken.java b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCToken.java
index c51d093..4913286 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCToken.java
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCToken.java
@@ -20,10 +20,17 @@
 import java.util.*;
 
 /**
- * Detected model element. A token is a detected model element and is a part of a
- * parsed user input. Sequence of tokens represents fully parsed (see {@link NCContext#getVariants()} method) user input. A single
+ * Detected model element. A token is a detected model element and is a part of the
+ * parsed user input. Sequence of tokens represents a fully parsed (see {@link NCContext#getVariants()} method) user input. A single
  * token corresponds to a one or more words, sequential or not, in the user sentence.
  * <p>
+ * Note that tokens can be used to define other tokens (i.e. tokens are composable). Because of that tokens naturally
+ * form a tree hierarchy - see methods {@link #findPartTokens(String...)}, {@link #getAliases()}, {@link #isOfAlias(String)}
+ * and {@link #getPartTokens()}.
+ * Note also that detected model elements that tokens represent also form another hierarchy, namely a model element hierarchy that
+ * user can also access via {@link #getAncestors()}, {@link #getParentId()} methods. These two hierarchies should be not
+ * be confused.
+ * <p>
  * <b>Configuring Token Providers</b><br>
  * Token providers (built-in or 3rd party) have to be enabled in the REST server <a href="https://nlpcraft.apache.org/server-and-probe.html">configuration</a>.
  * Data models also have to specify tokens they are expecting the REST server and probe to detect. This is done to
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/NCIntentDslCompiler.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/NCIntentDslCompiler.scala
index fa56ba2..edb8591 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/NCIntentDslCompiler.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/NCIntentDslCompiler.scala
@@ -43,7 +43,6 @@
       */
     class FiniteStateMachine extends NCIntentDslBaseListener {
         // Intent components.
-        private var conv: Boolean = true
         private var ordered: Boolean = false
         private var id: String = _
         private val terms = ArrayBuffer.empty[NCDslTerm] // Accumulator for parsed terms.
@@ -52,6 +51,7 @@
     
         // Currently parsed term.
         private var termId: String = _
+        private var termConv: Boolean = _
         
         // Current min/max quantifier.
         private var min = 1
@@ -70,7 +70,7 @@
             require(id != null)
             require(terms.nonEmpty)
             
-            NCDslIntent(id, conv, ordered, flow.toArray, terms.toArray)
+            NCDslIntent(id, ordered, flow.toArray, terms.toArray)
         }
     
         /**
@@ -101,7 +101,11 @@
         override def exitTermId(ctx: NCIntentDslParser.TermIdContext): Unit = {
             termId = ctx.ID().getText
         }
-    
+
+        override def exitTermEq(ctx: NCIntentDslParser.TermEqContext): Unit = {
+            termConv = ctx.TILDA() != null
+        }
+
         override def exitMinMaxRange(ctx: NCIntentDslParser.MinMaxRangeContext): Unit = {
             val minStr = ctx.getChild(1).getText
             val maxStr = ctx.getChild(3).getText
@@ -118,10 +122,6 @@
             id = ctx.ID().getText
         }
     
-        override def exitConvDecl(ctx: NCIntentDslParser.ConvDeclContext): Unit = {
-            conv = ctx.BOOL().getText == "true"
-        }
-    
         override def exitOrderedDecl(ctx: NCIntentDslParser.OrderedDeclContext): Unit = {
             ordered = ctx.BOOL().getText == "true"
         }
@@ -131,10 +131,15 @@
             
             val p = predStack.pop
             
-            terms += new NCDslTerm(termId, new java.util.function.Function[NCToken, java.lang.Boolean]() {
-                override def apply(tok: NCToken): java.lang.Boolean = p.apply(tok)
-                override def toString: String = p.toString() //ctx.item().getText
-            }, min, max)
+            terms += new NCDslTerm(
+                termId,
+                new java.util.function.Function[NCToken, java.lang.Boolean]() {
+                    override def apply(tok: NCToken): java.lang.Boolean = p.apply(tok)
+                    override def toString: String = p.toString() //ctx.item().getText
+                },
+                min,
+                max,
+                termConv)
             
             // Reset.
             termId = null
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/NCIntentSolverEngine.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/NCIntentSolverEngine.scala
index e42c92c..db41dd0 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/NCIntentSolverEngine.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/NCIntentSolverEngine.scala
@@ -114,7 +114,6 @@
         usedTokens: List[UsedToken],
         weight: Weight
     ) {
-        lazy val minIndex: Int = usedTokens.minBy(_.token.index).token.index
         lazy val maxIndex: Int = usedTokens.maxBy(_.token.index).token.index
     }
 
@@ -163,7 +162,6 @@
             variantIdx: Int // Variant index.
         )
         val req = ctx.getRequest
-        val conv = ctx.getConversation.getTokens
 
         startScopedSpan("solve",
             "srvReqId" → req.getServerRequestId,
@@ -187,17 +185,17 @@
 
                         // Isolated conversation tokens.
                         val convToks =
-                            if (intent.conv)
+                            if (intent.terms.exists(_.isConversational))
                                 Seq.empty[UsedToken] ++
                                     // We shouldn't mix tokens with same group from conversation
                                     // history and processed sentence.
-                                    conv.
+                                    ctx.getConversation.getTokens.
                                         filter(t ⇒ {
                                             val convTokGroups = t.getGroups.sorted
 
                                             !senTokGroups.exists(convTokGroups.containsSlice)
                                         }).
-                                        map(UsedToken(false, true, _))
+                                        map(UsedToken(used = false, conv = true, _))
                             else
                                 Seq.empty[UsedToken]
 
@@ -418,7 +416,7 @@
                 solveTerm(
                     term,
                     senToks,
-                    convToks
+                    if (term.isConversational) convToks else Seq.empty
                 ) match {
                     case Some(termMatch) ⇒
                         if (ordered && lastTermMatch != null && lastTermMatch.maxIndex > termMatch.maxIndex)
@@ -511,6 +509,7 @@
                 termWeight ++= t._2
     
                 Some(TermMatch(term.getId, termToks, termWeight))
+
             case None ⇒
                 None
         }
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDsl.g4 b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDsl.g4
index 5486689..b3025c4 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDsl.g4
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDsl.g4
@@ -17,9 +17,8 @@
 
 grammar NCIntentDsl;
 
-intent: intentId convDecl? orderedDecl? flowDecl? terms EOF;
+intent: intentId orderedDecl? flowDecl? terms EOF;
 intentId: 'intent' EQ ID;
-convDecl: 'conv' EQ BOOL;
 orderedDecl: 'ordered' EQ BOOL;
 flowDecl: 'flow' EQ SQUOTE flow SQUOTE;
 flow
@@ -37,7 +36,8 @@
     | idList VERT ID
     ;
 terms: term | terms term;
-term: 'term' termId? EQ LCURLY item RCURLY minMax?;
+termEq: EQ | TILDA;
+term: 'term' termId? termEq LCURLY item RCURLY minMax?;
 termId: LPAREN ID RPAREN;
 item
     : predicate
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDsl.interp b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDsl.interp
index 6ea233e..40e4f1c 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDsl.interp
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDsl.interp
@@ -1,7 +1,6 @@
 token literal names:
 null
 'intent'
-'conv'
 'ordered'
 'flow'
 'term'
@@ -59,7 +58,6 @@
 null
 null
 null
-null
 PRED_OP
 AND
 OR
@@ -93,7 +91,6 @@
 rule names:
 intent
 intentId
-convDecl
 orderedDecl
 flowDecl
 flow
@@ -101,6 +98,7 @@
 flowItemIds
 idList
 terms
+termEq
 term
 termId
 item
@@ -119,4 +117,4 @@
 
 
 atn:
-[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 45, 268, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 3, 2, 3, 2, 5, 2, 55, 10, 2, 3, 2, 5, 2, 58, 10, 2, 3, 2, 5, 2, 61, 10, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 5, 7, 86, 10, 7, 3, 7, 3, 7, 3, 7, 7, 7, 91, 10, 7, 12, 7, 14, 7, 94, 11, 7, 3, 8, 3, 8, 5, 8, 98, 10, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 105, 10, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 7, 10, 113, 10, 10, 12, 10, 14, 10, 116, 11, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 7, 11, 123, 10, 11, 12, 11, 14, 11, 126, 11, 11, 3, 12, 3, 12, 5, 12, 130, 10, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 137, 10, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 5, 14, 151, 10, 14, 3, 14, 3, 14, 3, 14, 7, 14, 156, 10, 14, 12, 14, 14, 14, 159, 11, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 172, 10, 15, 3, 16, 5, 16, 175, 10, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 5, 16, 186, 10, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 7, 17, 193, 10, 17, 12, 17, 14, 17, 196, 11, 17, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 5, 19, 203, 10, 19, 3, 19, 3, 19, 3, 19, 5, 19, 208, 10, 19, 3, 19, 3, 19, 5, 19, 212, 10, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 5, 20, 219, 10, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 227, 10, 21, 12, 21, 14, 21, 230, 11, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 5, 22, 245, 10, 22, 3, 23, 3, 23, 7, 23, 249, 10, 23, 12, 23, 14, 23, 252, 11, 23, 3, 23, 3, 23, 3, 24, 3, 24, 5, 24, 258, 10, 24, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 2, 8, 12, 18, 20, 26, 32, 40, 27, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 2, 5, 3, 2, 18, 19, 3, 2, 26, 26, 3, 2, 37, 39, 2, 278, 2, 52, 3, 2, 2, 2, 4, 65, 3, 2, 2, 2, 6, 69, 3, 2, 2, 2, 8, 73, 3, 2, 2, 2, 10, 77, 3, 2, 2, 2, 12, 85, 3, 2, 2, 2, 14, 95, 3, 2, 2, 2, 16, 104, 3, 2, 2, 2, 18, 106, 3, 2, 2, 2, 20, 117, 3, 2, 2, 2, 22, 127, 3, 2, 2, 2, 24, 138, 3, 2, 2, 2, 26, 150, 3, 2, 2, 2, 28, 171, 3, 2, 2, 2, 30, 174, 3, 2, 2, 2, 32, 187, 3, 2, 2, 2, 34, 197, 3, 2, 2, 2, 36, 211, 3, 2, 2, 2, 38, 218, 3, 2, 2, 2, 40, 220, 3, 2, 2, 2, 42, 244, 3, 2, 2, 2, 44, 246, 3, 2, 2, 2, 46, 257, 3, 2, 2, 2, 48, 259, 3, 2, 2, 2, 50, 261, 3, 2, 2, 2, 52, 54, 5, 4, 3, 2, 53, 55, 5, 6, 4, 2, 54, 53, 3, 2, 2, 2, 54, 55, 3, 2, 2, 2, 55, 57, 3, 2, 2, 2, 56, 58, 5, 8, 5, 2, 57, 56, 3, 2, 2, 2, 57, 58, 3, 2, 2, 2, 58, 60, 3, 2, 2, 2, 59, 61, 5, 10, 6, 2, 60, 59, 3, 2, 2, 2, 60, 61, 3, 2, 2, 2, 61, 62, 3, 2, 2, 2, 62, 63, 5, 20, 11, 2, 63, 64, 7, 2, 2, 3, 64, 3, 3, 2, 2, 2, 65, 66, 7, 3, 2, 2, 66, 67, 7, 36, 2, 2, 67, 68, 7, 43, 2, 2, 68, 5, 3, 2, 2, 2, 69, 70, 7, 4, 2, 2, 70, 71, 7, 36, 2, 2, 71, 72, 7, 40, 2, 2, 72, 7, 3, 2, 2, 2, 73, 74, 7, 5, 2, 2, 74, 75, 7, 36, 2, 2, 75, 76, 7, 40, 2, 2, 76, 9, 3, 2, 2, 2, 77, 78, 7, 6, 2, 2, 78, 79, 7, 36, 2, 2, 79, 80, 7, 26, 2, 2, 80, 81, 5, 12, 7, 2, 81, 82, 7, 26, 2, 2, 82, 11, 3, 2, 2, 2, 83, 86, 8, 7, 1, 2, 84, 86, 5, 14, 8, 2, 85, 83, 3, 2, 2, 2, 85, 84, 3, 2, 2, 2, 86, 92, 3, 2, 2, 2, 87, 88, 12, 3, 2, 2, 88, 89, 7, 28, 2, 2, 89, 91, 5, 14, 8, 2, 90, 87, 3, 2, 2, 2, 91, 94, 3, 2, 2, 2, 92, 90, 3, 2, 2, 2, 92, 93, 3, 2, 2, 2, 93, 13, 3, 2, 2, 2, 94, 92, 3, 2, 2, 2, 95, 97, 5, 16, 9, 2, 96, 98, 5, 46, 24, 2, 97, 96, 3, 2, 2, 2, 97, 98, 3, 2, 2, 2, 98, 15, 3, 2, 2, 2, 99, 105, 7, 43, 2, 2, 100, 101, 7, 22, 2, 2, 101, 102, 5, 18, 10, 2, 102, 103, 7, 23, 2, 2, 103, 105, 3, 2, 2, 2, 104, 99, 3, 2, 2, 2, 104, 100, 3, 2, 2, 2, 105, 17, 3, 2, 2, 2, 106, 107, 8, 10, 1, 2, 107, 108, 7, 43, 2, 2, 108, 114, 3, 2, 2, 2, 109, 110, 12, 3, 2, 2, 110, 111, 7, 20, 2, 2, 111, 113, 7, 43, 2, 2, 112, 109, 3, 2, 2, 2, 113, 116, 3, 2, 2, 2, 114, 112, 3, 2, 2, 2, 114, 115, 3, 2, 2, 2, 115, 19, 3, 2, 2, 2, 116, 114, 3, 2, 2, 2, 117, 118, 8, 11, 1, 2, 118, 119, 5, 22, 12, 2, 119, 124, 3, 2, 2, 2, 120, 121, 12, 3, 2, 2, 121, 123, 5, 22, 12, 2, 122, 120, 3, 2, 2, 2, 123, 126, 3, 2, 2, 2, 124, 122, 3, 2, 2, 2, 124, 125, 3, 2, 2, 2, 125, 21, 3, 2, 2, 2, 126, 124, 3, 2, 2, 2, 127, 129, 7, 7, 2, 2, 128, 130, 5, 24, 13, 2, 129, 128, 3, 2, 2, 2, 129, 130, 3, 2, 2, 2, 130, 131, 3, 2, 2, 2, 131, 132, 7, 36, 2, 2, 132, 133, 7, 24, 2, 2, 133, 134, 5, 26, 14, 2, 134, 136, 7, 25, 2, 2, 135, 137, 5, 46, 24, 2, 136, 135, 3, 2, 2, 2, 136, 137, 3, 2, 2, 2, 137, 23, 3, 2, 2, 2, 138, 139, 7, 22, 2, 2, 139, 140, 7, 43, 2, 2, 140, 141, 7, 23, 2, 2, 141, 25, 3, 2, 2, 2, 142, 143, 8, 14, 1, 2, 143, 151, 5, 28, 15, 2, 144, 145, 7, 22, 2, 2, 145, 146, 5, 26, 14, 2, 146, 147, 7, 23, 2, 2, 147, 151, 3, 2, 2, 2, 148, 149, 7, 21, 2, 2, 149, 151, 5, 26, 14, 3, 150, 142, 3, 2, 2, 2, 150, 144, 3, 2, 2, 2, 150, 148, 3, 2, 2, 2, 151, 157, 3, 2, 2, 2, 152, 153, 12, 4, 2, 2, 153, 154, 9, 2, 2, 2, 154, 156, 5, 26, 14, 5, 155, 152, 3, 2, 2, 2, 156, 159, 3, 2, 2, 2, 157, 155, 3, 2, 2, 2, 157, 158, 3, 2, 2, 2, 158, 27, 3, 2, 2, 2, 159, 157, 3, 2, 2, 2, 160, 161, 5, 30, 16, 2, 161, 162, 7, 17, 2, 2, 162, 163, 5, 38, 20, 2, 163, 172, 3, 2, 2, 2, 164, 165, 7, 43, 2, 2, 165, 166, 7, 22, 2, 2, 166, 167, 5, 30, 16, 2, 167, 168, 7, 23, 2, 2, 168, 169, 7, 17, 2, 2, 169, 170, 5, 38, 20, 2, 170, 172, 3, 2, 2, 2, 171, 160, 3, 2, 2, 2, 171, 164, 3, 2, 2, 2, 172, 29, 3, 2, 2, 2, 173, 175, 5, 32, 17, 2, 174, 173, 3, 2, 2, 2, 174, 175, 3, 2, 2, 2, 175, 185, 3, 2, 2, 2, 176, 186, 7, 8, 2, 2, 177, 186, 7, 9, 2, 2, 178, 186, 7, 10, 2, 2, 179, 186, 7, 11, 2, 2, 180, 186, 7, 12, 2, 2, 181, 186, 7, 13, 2, 2, 182, 186, 7, 14, 2, 2, 183, 186, 7, 15, 2, 2, 184, 186, 5, 42, 22, 2, 185, 176, 3, 2, 2, 2, 185, 177, 3, 2, 2, 2, 185, 178, 3, 2, 2, 2, 185, 179, 3, 2, 2, 2, 185, 180, 3, 2, 2, 2, 185, 181, 3, 2, 2, 2, 185, 182, 3, 2, 2, 2, 185, 183, 3, 2, 2, 2, 185, 184, 3, 2, 2, 2, 186, 31, 3, 2, 2, 2, 187, 188, 8, 17, 1, 2, 188, 189, 5, 34, 18, 2, 189, 194, 3, 2, 2, 2, 190, 191, 12, 3, 2, 2, 191, 193, 5, 34, 18, 2, 192, 190, 3, 2, 2, 2, 193, 196, 3, 2, 2, 2, 194, 192, 3, 2, 2, 2, 194, 195, 3, 2, 2, 2, 195, 33, 3, 2, 2, 2, 196, 194, 3, 2, 2, 2, 197, 198, 7, 43, 2, 2, 198, 199, 7, 34, 2, 2, 199, 35, 3, 2, 2, 2, 200, 212, 7, 16, 2, 2, 201, 203, 7, 33, 2, 2, 202, 201, 3, 2, 2, 2, 202, 203, 3, 2, 2, 2, 203, 207, 3, 2, 2, 2, 204, 208, 7, 41, 2, 2, 205, 206, 7, 41, 2, 2, 206, 208, 7, 42, 2, 2, 207, 204, 3, 2, 2, 2, 207, 205, 3, 2, 2, 2, 208, 212, 3, 2, 2, 2, 209, 212, 7, 40, 2, 2, 210, 212, 5, 44, 23, 2, 211, 200, 3, 2, 2, 2, 211, 202, 3, 2, 2, 2, 211, 209, 3, 2, 2, 2, 211, 210, 3, 2, 2, 2, 212, 37, 3, 2, 2, 2, 213, 219, 5, 36, 19, 2, 214, 215, 7, 22, 2, 2, 215, 216, 5, 40, 21, 2, 216, 217, 7, 23, 2, 2, 217, 219, 3, 2, 2, 2, 218, 213, 3, 2, 2, 2, 218, 214, 3, 2, 2, 2, 219, 39, 3, 2, 2, 2, 220, 221, 8, 21, 1, 2, 221, 222, 5, 36, 19, 2, 222, 228, 3, 2, 2, 2, 223, 224, 12, 3, 2, 2, 224, 225, 7, 31, 2, 2, 225, 227, 5, 36, 19, 2, 226, 223, 3, 2, 2, 2, 227, 230, 3, 2, 2, 2, 228, 226, 3, 2, 2, 2, 228, 229, 3, 2, 2, 2, 229, 41, 3, 2, 2, 2, 230, 228, 3, 2, 2, 2, 231, 232, 7, 27, 2, 2, 232, 245, 7, 43, 2, 2, 233, 234, 7, 27, 2, 2, 234, 235, 7, 43, 2, 2, 235, 236, 7, 29, 2, 2, 236, 237, 7, 41, 2, 2, 237, 245, 7, 30, 2, 2, 238, 239, 7, 27, 2, 2, 239, 240, 7, 43, 2, 2, 240, 241, 7, 29, 2, 2, 241, 242, 5, 44, 23, 2, 242, 243, 7, 30, 2, 2, 243, 245, 3, 2, 2, 2, 244, 231, 3, 2, 2, 2, 244, 233, 3, 2, 2, 2, 244, 238, 3, 2, 2, 2, 245, 43, 3, 2, 2, 2, 246, 250, 7, 26, 2, 2, 247, 249, 10, 3, 2, 2, 248, 247, 3, 2, 2, 2, 249, 252, 3, 2, 2, 2, 250, 248, 3, 2, 2, 2, 250, 251, 3, 2, 2, 2, 251, 253, 3, 2, 2, 2, 252, 250, 3, 2, 2, 2, 253, 254, 7, 26, 2, 2, 254, 45, 3, 2, 2, 2, 255, 258, 5, 48, 25, 2, 256, 258, 5, 50, 26, 2, 257, 255, 3, 2, 2, 2, 257, 256, 3, 2, 2, 2, 258, 47, 3, 2, 2, 2, 259, 260, 9, 4, 2, 2, 260, 49, 3, 2, 2, 2, 261, 262, 7, 29, 2, 2, 262, 263, 7, 41, 2, 2, 263, 264, 7, 31, 2, 2, 264, 265, 7, 41, 2, 2, 265, 266, 7, 30, 2, 2, 266, 51, 3, 2, 2, 2, 27, 54, 57, 60, 85, 92, 97, 104, 114, 124, 129, 136, 150, 157, 171, 174, 185, 194, 202, 207, 211, 218, 228, 244, 250, 257]
\ No newline at end of file
+[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 44, 263, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 3, 2, 3, 2, 5, 2, 55, 10, 2, 3, 2, 5, 2, 58, 10, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 5, 6, 79, 10, 6, 3, 6, 3, 6, 3, 6, 7, 6, 84, 10, 6, 12, 6, 14, 6, 87, 11, 6, 3, 7, 3, 7, 5, 7, 91, 10, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 5, 8, 98, 10, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 7, 9, 106, 10, 9, 12, 9, 14, 9, 109, 11, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 7, 10, 116, 10, 10, 12, 10, 14, 10, 119, 11, 10, 3, 11, 3, 11, 3, 12, 3, 12, 5, 12, 125, 10, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 132, 10, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 5, 14, 146, 10, 14, 3, 14, 3, 14, 3, 14, 7, 14, 151, 10, 14, 12, 14, 14, 14, 154, 11, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 167, 10, 15, 3, 16, 5, 16, 170, 10, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 5, 16, 181, 10, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 7, 17, 188, 10, 17, 12, 17, 14, 17, 191, 11, 17, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 5, 19, 198, 10, 19, 3, 19, 3, 19, 3, 19, 5, 19, 203, 10, 19, 3, 19, 3, 19, 5, 19, 207, 10, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 5, 20, 214, 10, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 222, 10, 21, 12, 21, 14, 21, 225, 11, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 5, 22, 240, 10, 22, 3, 23, 3, 23, 7, 23, 244, 10, 23, 12, 23, 14, 23, 247, 11, 23, 3, 23, 3, 23, 3, 24, 3, 24, 5, 24, 253, 10, 24, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 2, 8, 10, 16, 18, 26, 32, 40, 27, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 2, 6, 4, 2, 26, 26, 35, 35, 3, 2, 17, 18, 3, 2, 25, 25, 3, 2, 36, 38, 2, 272, 2, 52, 3, 2, 2, 2, 4, 62, 3, 2, 2, 2, 6, 66, 3, 2, 2, 2, 8, 70, 3, 2, 2, 2, 10, 78, 3, 2, 2, 2, 12, 88, 3, 2, 2, 2, 14, 97, 3, 2, 2, 2, 16, 99, 3, 2, 2, 2, 18, 110, 3, 2, 2, 2, 20, 120, 3, 2, 2, 2, 22, 122, 3, 2, 2, 2, 24, 133, 3, 2, 2, 2, 26, 145, 3, 2, 2, 2, 28, 166, 3, 2, 2, 2, 30, 169, 3, 2, 2, 2, 32, 182, 3, 2, 2, 2, 34, 192, 3, 2, 2, 2, 36, 206, 3, 2, 2, 2, 38, 213, 3, 2, 2, 2, 40, 215, 3, 2, 2, 2, 42, 239, 3, 2, 2, 2, 44, 241, 3, 2, 2, 2, 46, 252, 3, 2, 2, 2, 48, 254, 3, 2, 2, 2, 50, 256, 3, 2, 2, 2, 52, 54, 5, 4, 3, 2, 53, 55, 5, 6, 4, 2, 54, 53, 3, 2, 2, 2, 54, 55, 3, 2, 2, 2, 55, 57, 3, 2, 2, 2, 56, 58, 5, 8, 5, 2, 57, 56, 3, 2, 2, 2, 57, 58, 3, 2, 2, 2, 58, 59, 3, 2, 2, 2, 59, 60, 5, 18, 10, 2, 60, 61, 7, 2, 2, 3, 61, 3, 3, 2, 2, 2, 62, 63, 7, 3, 2, 2, 63, 64, 7, 35, 2, 2, 64, 65, 7, 42, 2, 2, 65, 5, 3, 2, 2, 2, 66, 67, 7, 4, 2, 2, 67, 68, 7, 35, 2, 2, 68, 69, 7, 39, 2, 2, 69, 7, 3, 2, 2, 2, 70, 71, 7, 5, 2, 2, 71, 72, 7, 35, 2, 2, 72, 73, 7, 25, 2, 2, 73, 74, 5, 10, 6, 2, 74, 75, 7, 25, 2, 2, 75, 9, 3, 2, 2, 2, 76, 79, 8, 6, 1, 2, 77, 79, 5, 12, 7, 2, 78, 76, 3, 2, 2, 2, 78, 77, 3, 2, 2, 2, 79, 85, 3, 2, 2, 2, 80, 81, 12, 3, 2, 2, 81, 82, 7, 27, 2, 2, 82, 84, 5, 12, 7, 2, 83, 80, 3, 2, 2, 2, 84, 87, 3, 2, 2, 2, 85, 83, 3, 2, 2, 2, 85, 86, 3, 2, 2, 2, 86, 11, 3, 2, 2, 2, 87, 85, 3, 2, 2, 2, 88, 90, 5, 14, 8, 2, 89, 91, 5, 46, 24, 2, 90, 89, 3, 2, 2, 2, 90, 91, 3, 2, 2, 2, 91, 13, 3, 2, 2, 2, 92, 98, 7, 42, 2, 2, 93, 94, 7, 21, 2, 2, 94, 95, 5, 16, 9, 2, 95, 96, 7, 22, 2, 2, 96, 98, 3, 2, 2, 2, 97, 92, 3, 2, 2, 2, 97, 93, 3, 2, 2, 2, 98, 15, 3, 2, 2, 2, 99, 100, 8, 9, 1, 2, 100, 101, 7, 42, 2, 2, 101, 107, 3, 2, 2, 2, 102, 103, 12, 3, 2, 2, 103, 104, 7, 19, 2, 2, 104, 106, 7, 42, 2, 2, 105, 102, 3, 2, 2, 2, 106, 109, 3, 2, 2, 2, 107, 105, 3, 2, 2, 2, 107, 108, 3, 2, 2, 2, 108, 17, 3, 2, 2, 2, 109, 107, 3, 2, 2, 2, 110, 111, 8, 10, 1, 2, 111, 112, 5, 22, 12, 2, 112, 117, 3, 2, 2, 2, 113, 114, 12, 3, 2, 2, 114, 116, 5, 22, 12, 2, 115, 113, 3, 2, 2, 2, 116, 119, 3, 2, 2, 2, 117, 115, 3, 2, 2, 2, 117, 118, 3, 2, 2, 2, 118, 19, 3, 2, 2, 2, 119, 117, 3, 2, 2, 2, 120, 121, 9, 2, 2, 2, 121, 21, 3, 2, 2, 2, 122, 124, 7, 6, 2, 2, 123, 125, 5, 24, 13, 2, 124, 123, 3, 2, 2, 2, 124, 125, 3, 2, 2, 2, 125, 126, 3, 2, 2, 2, 126, 127, 5, 20, 11, 2, 127, 128, 7, 23, 2, 2, 128, 129, 5, 26, 14, 2, 129, 131, 7, 24, 2, 2, 130, 132, 5, 46, 24, 2, 131, 130, 3, 2, 2, 2, 131, 132, 3, 2, 2, 2, 132, 23, 3, 2, 2, 2, 133, 134, 7, 21, 2, 2, 134, 135, 7, 42, 2, 2, 135, 136, 7, 22, 2, 2, 136, 25, 3, 2, 2, 2, 137, 138, 8, 14, 1, 2, 138, 146, 5, 28, 15, 2, 139, 140, 7, 21, 2, 2, 140, 141, 5, 26, 14, 2, 141, 142, 7, 22, 2, 2, 142, 146, 3, 2, 2, 2, 143, 144, 7, 20, 2, 2, 144, 146, 5, 26, 14, 3, 145, 137, 3, 2, 2, 2, 145, 139, 3, 2, 2, 2, 145, 143, 3, 2, 2, 2, 146, 152, 3, 2, 2, 2, 147, 148, 12, 4, 2, 2, 148, 149, 9, 3, 2, 2, 149, 151, 5, 26, 14, 5, 150, 147, 3, 2, 2, 2, 151, 154, 3, 2, 2, 2, 152, 150, 3, 2, 2, 2, 152, 153, 3, 2, 2, 2, 153, 27, 3, 2, 2, 2, 154, 152, 3, 2, 2, 2, 155, 156, 5, 30, 16, 2, 156, 157, 7, 16, 2, 2, 157, 158, 5, 38, 20, 2, 158, 167, 3, 2, 2, 2, 159, 160, 7, 42, 2, 2, 160, 161, 7, 21, 2, 2, 161, 162, 5, 30, 16, 2, 162, 163, 7, 22, 2, 2, 163, 164, 7, 16, 2, 2, 164, 165, 5, 38, 20, 2, 165, 167, 3, 2, 2, 2, 166, 155, 3, 2, 2, 2, 166, 159, 3, 2, 2, 2, 167, 29, 3, 2, 2, 2, 168, 170, 5, 32, 17, 2, 169, 168, 3, 2, 2, 2, 169, 170, 3, 2, 2, 2, 170, 180, 3, 2, 2, 2, 171, 181, 7, 7, 2, 2, 172, 181, 7, 8, 2, 2, 173, 181, 7, 9, 2, 2, 174, 181, 7, 10, 2, 2, 175, 181, 7, 11, 2, 2, 176, 181, 7, 12, 2, 2, 177, 181, 7, 13, 2, 2, 178, 181, 7, 14, 2, 2, 179, 181, 5, 42, 22, 2, 180, 171, 3, 2, 2, 2, 180, 172, 3, 2, 2, 2, 180, 173, 3, 2, 2, 2, 180, 174, 3, 2, 2, 2, 180, 175, 3, 2, 2, 2, 180, 176, 3, 2, 2, 2, 180, 177, 3, 2, 2, 2, 180, 178, 3, 2, 2, 2, 180, 179, 3, 2, 2, 2, 181, 31, 3, 2, 2, 2, 182, 183, 8, 17, 1, 2, 183, 184, 5, 34, 18, 2, 184, 189, 3, 2, 2, 2, 185, 186, 12, 3, 2, 2, 186, 188, 5, 34, 18, 2, 187, 185, 3, 2, 2, 2, 188, 191, 3, 2, 2, 2, 189, 187, 3, 2, 2, 2, 189, 190, 3, 2, 2, 2, 190, 33, 3, 2, 2, 2, 191, 189, 3, 2, 2, 2, 192, 193, 7, 42, 2, 2, 193, 194, 7, 33, 2, 2, 194, 35, 3, 2, 2, 2, 195, 207, 7, 15, 2, 2, 196, 198, 7, 32, 2, 2, 197, 196, 3, 2, 2, 2, 197, 198, 3, 2, 2, 2, 198, 202, 3, 2, 2, 2, 199, 203, 7, 40, 2, 2, 200, 201, 7, 40, 2, 2, 201, 203, 7, 41, 2, 2, 202, 199, 3, 2, 2, 2, 202, 200, 3, 2, 2, 2, 203, 207, 3, 2, 2, 2, 204, 207, 7, 39, 2, 2, 205, 207, 5, 44, 23, 2, 206, 195, 3, 2, 2, 2, 206, 197, 3, 2, 2, 2, 206, 204, 3, 2, 2, 2, 206, 205, 3, 2, 2, 2, 207, 37, 3, 2, 2, 2, 208, 214, 5, 36, 19, 2, 209, 210, 7, 21, 2, 2, 210, 211, 5, 40, 21, 2, 211, 212, 7, 22, 2, 2, 212, 214, 3, 2, 2, 2, 213, 208, 3, 2, 2, 2, 213, 209, 3, 2, 2, 2, 214, 39, 3, 2, 2, 2, 215, 216, 8, 21, 1, 2, 216, 217, 5, 36, 19, 2, 217, 223, 3, 2, 2, 2, 218, 219, 12, 3, 2, 2, 219, 220, 7, 30, 2, 2, 220, 222, 5, 36, 19, 2, 221, 218, 3, 2, 2, 2, 222, 225, 3, 2, 2, 2, 223, 221, 3, 2, 2, 2, 223, 224, 3, 2, 2, 2, 224, 41, 3, 2, 2, 2, 225, 223, 3, 2, 2, 2, 226, 227, 7, 26, 2, 2, 227, 240, 7, 42, 2, 2, 228, 229, 7, 26, 2, 2, 229, 230, 7, 42, 2, 2, 230, 231, 7, 28, 2, 2, 231, 232, 7, 40, 2, 2, 232, 240, 7, 29, 2, 2, 233, 234, 7, 26, 2, 2, 234, 235, 7, 42, 2, 2, 235, 236, 7, 28, 2, 2, 236, 237, 5, 44, 23, 2, 237, 238, 7, 29, 2, 2, 238, 240, 3, 2, 2, 2, 239, 226, 3, 2, 2, 2, 239, 228, 3, 2, 2, 2, 239, 233, 3, 2, 2, 2, 240, 43, 3, 2, 2, 2, 241, 245, 7, 25, 2, 2, 242, 244, 10, 4, 2, 2, 243, 242, 3, 2, 2, 2, 244, 247, 3, 2, 2, 2, 245, 243, 3, 2, 2, 2, 245, 246, 3, 2, 2, 2, 246, 248, 3, 2, 2, 2, 247, 245, 3, 2, 2, 2, 248, 249, 7, 25, 2, 2, 249, 45, 3, 2, 2, 2, 250, 253, 5, 48, 25, 2, 251, 253, 5, 50, 26, 2, 252, 250, 3, 2, 2, 2, 252, 251, 3, 2, 2, 2, 253, 47, 3, 2, 2, 2, 254, 255, 9, 5, 2, 2, 255, 49, 3, 2, 2, 2, 256, 257, 7, 28, 2, 2, 257, 258, 7, 40, 2, 2, 258, 259, 7, 30, 2, 2, 259, 260, 7, 40, 2, 2, 260, 261, 7, 29, 2, 2, 261, 51, 3, 2, 2, 2, 26, 54, 57, 78, 85, 90, 97, 107, 117, 124, 131, 145, 152, 166, 169, 180, 189, 197, 202, 206, 213, 223, 239, 245, 252]
\ No newline at end of file
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDsl.tokens b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDsl.tokens
index 8ae22bf..e2c3312 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDsl.tokens
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDsl.tokens
@@ -11,69 +11,67 @@
 T__10=11
 T__11=12
 T__12=13
-T__13=14
-PRED_OP=15
-AND=16
-OR=17
-VERT=18
-EXCL=19
-LPAREN=20
-RPAREN=21
-LCURLY=22
-RCURLY=23
-SQUOTE=24
-TILDA=25
-RIGHT=26
-LBR=27
-RBR=28
-COMMA=29
-COLON=30
-MINUS=31
-DOT=32
-UNDERSCORE=33
-EQ=34
-PLUS=35
-QUESTION=36
-STAR=37
-BOOL=38
-INT=39
-EXP=40
-ID=41
-WS=42
-ErrorCharacter=43
+PRED_OP=14
+AND=15
+OR=16
+VERT=17
+EXCL=18
+LPAREN=19
+RPAREN=20
+LCURLY=21
+RCURLY=22
+SQUOTE=23
+TILDA=24
+RIGHT=25
+LBR=26
+RBR=27
+COMMA=28
+COLON=29
+MINUS=30
+DOT=31
+UNDERSCORE=32
+EQ=33
+PLUS=34
+QUESTION=35
+STAR=36
+BOOL=37
+INT=38
+EXP=39
+ID=40
+WS=41
+ErrorCharacter=42
 'intent'=1
-'conv'=2
-'ordered'=3
-'flow'=4
-'term'=5
-'id'=6
-'aliases'=7
-'startidx'=8
-'endidx'=9
-'parent'=10
-'groups'=11
-'ancestors'=12
-'value'=13
-'null'=14
-'&&'=16
-'||'=17
-'|'=18
-'!'=19
-'('=20
-')'=21
-'{'=22
-'}'=23
-'\''=24
-'~'=25
-'>>'=26
-'['=27
-']'=28
-','=29
-':'=30
-'-'=31
-'.'=32
-'_'=33
-'='=34
-'+'=35
-'?'=36
-'*'=37
+'ordered'=2
+'flow'=3
+'term'=4
+'id'=5
+'aliases'=6
+'startidx'=7
+'endidx'=8
+'parent'=9
+'groups'=10
+'ancestors'=11
+'value'=12
+'null'=13
+'&&'=15
+'||'=16
+'|'=17
+'!'=18
+'('=19
+')'=20
+'{'=21
+'}'=22
+'\''=23
+'~'=24
+'>>'=25
+'['=26
+']'=27
+','=28
+':'=29
+'-'=30
+'.'=31
+'_'=32
+'='=33
+'+'=34
+'?'=35
+'*'=36
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslBaseListener.java b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslBaseListener.java
index 14bfb7d..32fdf9c 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslBaseListener.java
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslBaseListener.java
@@ -1,4 +1,4 @@
-// Generated from /Users/xxx/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDsl.g4 by ANTLR 4.8
+// Generated from C:/Users/Nikita Ivanov/Documents/GitHub/incubator-nlpcraft/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4\NCIntentDsl.g4 by ANTLR 4.8
 package org.apache.nlpcraft.model.intent.impl.antlr4;
 
 import org.antlr.v4.runtime.ParserRuleContext;
@@ -40,18 +40,6 @@
 	 *
 	 * <p>The default implementation does nothing.</p>
 	 */
-	@Override public void enterConvDecl(NCIntentDslParser.ConvDeclContext ctx) { }
-	/**
-	 * {@inheritDoc}
-	 *
-	 * <p>The default implementation does nothing.</p>
-	 */
-	@Override public void exitConvDecl(NCIntentDslParser.ConvDeclContext ctx) { }
-	/**
-	 * {@inheritDoc}
-	 *
-	 * <p>The default implementation does nothing.</p>
-	 */
 	@Override public void enterOrderedDecl(NCIntentDslParser.OrderedDeclContext ctx) { }
 	/**
 	 * {@inheritDoc}
@@ -136,6 +124,18 @@
 	 *
 	 * <p>The default implementation does nothing.</p>
 	 */
+	@Override public void enterTermEq(NCIntentDslParser.TermEqContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitTermEq(NCIntentDslParser.TermEqContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
 	@Override public void enterTerm(NCIntentDslParser.TermContext ctx) { }
 	/**
 	 * {@inheritDoc}
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslBaseVisitor.java b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslBaseVisitor.java
deleted file mode 100644
index 5865db4..0000000
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslBaseVisitor.java
+++ /dev/null
@@ -1,189 +0,0 @@
-// Generated from /Users/xxx/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDsl.g4 by ANTLR 4.8
-package org.apache.nlpcraft.model.intent.impl.antlr4;
-import org.antlr.v4.runtime.tree.AbstractParseTreeVisitor;
-
-/**
- * This class provides an empty implementation of {@link NCIntentDslVisitor},
- * which can be extended to create a visitor which only needs to handle a subset
- * of the available methods.
- *
- * @param <T> The return type of the visit operation. Use {@link Void} for
- * operations with no return type.
- */
-public class NCIntentDslBaseVisitor<T> extends AbstractParseTreeVisitor<T> implements NCIntentDslVisitor<T> {
-	/**
-	 * {@inheritDoc}
-	 *
-	 * <p>The default implementation returns the result of calling
-	 * {@link #visitChildren} on {@code ctx}.</p>
-	 */
-	@Override public T visitIntent(NCIntentDslParser.IntentContext ctx) { return visitChildren(ctx); }
-	/**
-	 * {@inheritDoc}
-	 *
-	 * <p>The default implementation returns the result of calling
-	 * {@link #visitChildren} on {@code ctx}.</p>
-	 */
-	@Override public T visitIntentId(NCIntentDslParser.IntentIdContext ctx) { return visitChildren(ctx); }
-	/**
-	 * {@inheritDoc}
-	 *
-	 * <p>The default implementation returns the result of calling
-	 * {@link #visitChildren} on {@code ctx}.</p>
-	 */
-	@Override public T visitConvDecl(NCIntentDslParser.ConvDeclContext ctx) { return visitChildren(ctx); }
-	/**
-	 * {@inheritDoc}
-	 *
-	 * <p>The default implementation returns the result of calling
-	 * {@link #visitChildren} on {@code ctx}.</p>
-	 */
-	@Override public T visitOrderedDecl(NCIntentDslParser.OrderedDeclContext ctx) { return visitChildren(ctx); }
-	/**
-	 * {@inheritDoc}
-	 *
-	 * <p>The default implementation returns the result of calling
-	 * {@link #visitChildren} on {@code ctx}.</p>
-	 */
-	@Override public T visitFlowDecl(NCIntentDslParser.FlowDeclContext ctx) { return visitChildren(ctx); }
-	/**
-	 * {@inheritDoc}
-	 *
-	 * <p>The default implementation returns the result of calling
-	 * {@link #visitChildren} on {@code ctx}.</p>
-	 */
-	@Override public T visitFlow(NCIntentDslParser.FlowContext ctx) { return visitChildren(ctx); }
-	/**
-	 * {@inheritDoc}
-	 *
-	 * <p>The default implementation returns the result of calling
-	 * {@link #visitChildren} on {@code ctx}.</p>
-	 */
-	@Override public T visitFlowItem(NCIntentDslParser.FlowItemContext ctx) { return visitChildren(ctx); }
-	/**
-	 * {@inheritDoc}
-	 *
-	 * <p>The default implementation returns the result of calling
-	 * {@link #visitChildren} on {@code ctx}.</p>
-	 */
-	@Override public T visitFlowItemIds(NCIntentDslParser.FlowItemIdsContext ctx) { return visitChildren(ctx); }
-	/**
-	 * {@inheritDoc}
-	 *
-	 * <p>The default implementation returns the result of calling
-	 * {@link #visitChildren} on {@code ctx}.</p>
-	 */
-	@Override public T visitIdList(NCIntentDslParser.IdListContext ctx) { return visitChildren(ctx); }
-	/**
-	 * {@inheritDoc}
-	 *
-	 * <p>The default implementation returns the result of calling
-	 * {@link #visitChildren} on {@code ctx}.</p>
-	 */
-	@Override public T visitTerms(NCIntentDslParser.TermsContext ctx) { return visitChildren(ctx); }
-	/**
-	 * {@inheritDoc}
-	 *
-	 * <p>The default implementation returns the result of calling
-	 * {@link #visitChildren} on {@code ctx}.</p>
-	 */
-	@Override public T visitTerm(NCIntentDslParser.TermContext ctx) { return visitChildren(ctx); }
-	/**
-	 * {@inheritDoc}
-	 *
-	 * <p>The default implementation returns the result of calling
-	 * {@link #visitChildren} on {@code ctx}.</p>
-	 */
-	@Override public T visitTermId(NCIntentDslParser.TermIdContext ctx) { return visitChildren(ctx); }
-	/**
-	 * {@inheritDoc}
-	 *
-	 * <p>The default implementation returns the result of calling
-	 * {@link #visitChildren} on {@code ctx}.</p>
-	 */
-	@Override public T visitItem(NCIntentDslParser.ItemContext ctx) { return visitChildren(ctx); }
-	/**
-	 * {@inheritDoc}
-	 *
-	 * <p>The default implementation returns the result of calling
-	 * {@link #visitChildren} on {@code ctx}.</p>
-	 */
-	@Override public T visitPredicate(NCIntentDslParser.PredicateContext ctx) { return visitChildren(ctx); }
-	/**
-	 * {@inheritDoc}
-	 *
-	 * <p>The default implementation returns the result of calling
-	 * {@link #visitChildren} on {@code ctx}.</p>
-	 */
-	@Override public T visitLval(NCIntentDslParser.LvalContext ctx) { return visitChildren(ctx); }
-	/**
-	 * {@inheritDoc}
-	 *
-	 * <p>The default implementation returns the result of calling
-	 * {@link #visitChildren} on {@code ctx}.</p>
-	 */
-	@Override public T visitLvalQual(NCIntentDslParser.LvalQualContext ctx) { return visitChildren(ctx); }
-	/**
-	 * {@inheritDoc}
-	 *
-	 * <p>The default implementation returns the result of calling
-	 * {@link #visitChildren} on {@code ctx}.</p>
-	 */
-	@Override public T visitLvalPart(NCIntentDslParser.LvalPartContext ctx) { return visitChildren(ctx); }
-	/**
-	 * {@inheritDoc}
-	 *
-	 * <p>The default implementation returns the result of calling
-	 * {@link #visitChildren} on {@code ctx}.</p>
-	 */
-	@Override public T visitRvalSingle(NCIntentDslParser.RvalSingleContext ctx) { return visitChildren(ctx); }
-	/**
-	 * {@inheritDoc}
-	 *
-	 * <p>The default implementation returns the result of calling
-	 * {@link #visitChildren} on {@code ctx}.</p>
-	 */
-	@Override public T visitRval(NCIntentDslParser.RvalContext ctx) { return visitChildren(ctx); }
-	/**
-	 * {@inheritDoc}
-	 *
-	 * <p>The default implementation returns the result of calling
-	 * {@link #visitChildren} on {@code ctx}.</p>
-	 */
-	@Override public T visitRvalList(NCIntentDslParser.RvalListContext ctx) { return visitChildren(ctx); }
-	/**
-	 * {@inheritDoc}
-	 *
-	 * <p>The default implementation returns the result of calling
-	 * {@link #visitChildren} on {@code ctx}.</p>
-	 */
-	@Override public T visitMeta(NCIntentDslParser.MetaContext ctx) { return visitChildren(ctx); }
-	/**
-	 * {@inheritDoc}
-	 *
-	 * <p>The default implementation returns the result of calling
-	 * {@link #visitChildren} on {@code ctx}.</p>
-	 */
-	@Override public T visitQstring(NCIntentDslParser.QstringContext ctx) { return visitChildren(ctx); }
-	/**
-	 * {@inheritDoc}
-	 *
-	 * <p>The default implementation returns the result of calling
-	 * {@link #visitChildren} on {@code ctx}.</p>
-	 */
-	@Override public T visitMinMax(NCIntentDslParser.MinMaxContext ctx) { return visitChildren(ctx); }
-	/**
-	 * {@inheritDoc}
-	 *
-	 * <p>The default implementation returns the result of calling
-	 * {@link #visitChildren} on {@code ctx}.</p>
-	 */
-	@Override public T visitMinMaxShortcut(NCIntentDslParser.MinMaxShortcutContext ctx) { return visitChildren(ctx); }
-	/**
-	 * {@inheritDoc}
-	 *
-	 * <p>The default implementation returns the result of calling
-	 * {@link #visitChildren} on {@code ctx}.</p>
-	 */
-	@Override public T visitMinMaxRange(NCIntentDslParser.MinMaxRangeContext ctx) { return visitChildren(ctx); }
-}
\ No newline at end of file
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslLexer.interp b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslLexer.interp
index fcb2a0c..4fb76df 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslLexer.interp
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslLexer.interp
@@ -1,7 +1,6 @@
 token literal names:
 null
 'intent'
-'conv'
 'ordered'
 'flow'
 'term'
@@ -59,7 +58,6 @@
 null
 null
 null
-null
 PRED_OP
 AND
 OR
@@ -104,7 +102,6 @@
 T__10
 T__11
 T__12
-T__13
 PRED_OP
 AND
 OR
@@ -143,4 +140,4 @@
 DEFAULT_MODE
 
 atn:
-[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 45, 294, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 5, 16, 195, 10, 16, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 20, 3, 20, 3, 21, 3, 21, 3, 22, 3, 22, 3, 23, 3, 23, 3, 24, 3, 24, 3, 25, 3, 25, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 29, 3, 29, 3, 30, 3, 30, 3, 31, 3, 31, 3, 32, 3, 32, 3, 33, 3, 33, 3, 34, 3, 34, 3, 35, 3, 35, 3, 36, 3, 36, 3, 37, 3, 37, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 5, 39, 253, 10, 39, 3, 40, 3, 40, 3, 40, 7, 40, 258, 10, 40, 12, 40, 14, 40, 261, 11, 40, 5, 40, 263, 10, 40, 3, 41, 3, 41, 6, 41, 267, 10, 41, 13, 41, 14, 41, 268, 3, 42, 3, 42, 6, 42, 273, 10, 42, 13, 42, 14, 42, 274, 3, 42, 3, 42, 3, 42, 3, 42, 7, 42, 281, 10, 42, 12, 42, 14, 42, 284, 11, 42, 3, 43, 6, 43, 287, 10, 43, 13, 43, 14, 43, 288, 3, 43, 3, 43, 3, 44, 3, 44, 2, 2, 45, 3, 3, 5, 4, 7, 5, 9, 6, 11, 7, 13, 8, 15, 9, 17, 10, 19, 11, 21, 12, 23, 13, 25, 14, 27, 15, 29, 16, 31, 17, 33, 18, 35, 19, 37, 20, 39, 21, 41, 22, 43, 23, 45, 24, 47, 25, 49, 26, 51, 27, 53, 28, 55, 29, 57, 30, 59, 31, 61, 32, 63, 33, 65, 34, 67, 35, 69, 36, 71, 37, 73, 38, 75, 39, 77, 40, 79, 41, 81, 42, 83, 43, 85, 44, 87, 45, 3, 2, 9, 4, 2, 62, 62, 64, 64, 3, 2, 51, 59, 4, 2, 50, 59, 97, 97, 3, 2, 50, 59, 4, 2, 67, 92, 99, 124, 5, 2, 50, 59, 67, 92, 99, 124, 5, 2, 11, 12, 14, 15, 34, 34, 2, 310, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 61, 3, 2, 2, 2, 2, 63, 3, 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, 67, 3, 2, 2, 2, 2, 69, 3, 2, 2, 2, 2, 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 77, 3, 2, 2, 2, 2, 79, 3, 2, 2, 2, 2, 81, 3, 2, 2, 2, 2, 83, 3, 2, 2, 2, 2, 85, 3, 2, 2, 2, 2, 87, 3, 2, 2, 2, 3, 89, 3, 2, 2, 2, 5, 96, 3, 2, 2, 2, 7, 101, 3, 2, 2, 2, 9, 109, 3, 2, 2, 2, 11, 114, 3, 2, 2, 2, 13, 119, 3, 2, 2, 2, 15, 122, 3, 2, 2, 2, 17, 130, 3, 2, 2, 2, 19, 139, 3, 2, 2, 2, 21, 146, 3, 2, 2, 2, 23, 153, 3, 2, 2, 2, 25, 160, 3, 2, 2, 2, 27, 170, 3, 2, 2, 2, 29, 176, 3, 2, 2, 2, 31, 194, 3, 2, 2, 2, 33, 196, 3, 2, 2, 2, 35, 199, 3, 2, 2, 2, 37, 202, 3, 2, 2, 2, 39, 204, 3, 2, 2, 2, 41, 206, 3, 2, 2, 2, 43, 208, 3, 2, 2, 2, 45, 210, 3, 2, 2, 2, 47, 212, 3, 2, 2, 2, 49, 214, 3, 2, 2, 2, 51, 216, 3, 2, 2, 2, 53, 218, 3, 2, 2, 2, 55, 221, 3, 2, 2, 2, 57, 223, 3, 2, 2, 2, 59, 225, 3, 2, 2, 2, 61, 227, 3, 2, 2, 2, 63, 229, 3, 2, 2, 2, 65, 231, 3, 2, 2, 2, 67, 233, 3, 2, 2, 2, 69, 235, 3, 2, 2, 2, 71, 237, 3, 2, 2, 2, 73, 239, 3, 2, 2, 2, 75, 241, 3, 2, 2, 2, 77, 252, 3, 2, 2, 2, 79, 262, 3, 2, 2, 2, 81, 264, 3, 2, 2, 2, 83, 272, 3, 2, 2, 2, 85, 286, 3, 2, 2, 2, 87, 292, 3, 2, 2, 2, 89, 90, 7, 107, 2, 2, 90, 91, 7, 112, 2, 2, 91, 92, 7, 118, 2, 2, 92, 93, 7, 103, 2, 2, 93, 94, 7, 112, 2, 2, 94, 95, 7, 118, 2, 2, 95, 4, 3, 2, 2, 2, 96, 97, 7, 101, 2, 2, 97, 98, 7, 113, 2, 2, 98, 99, 7, 112, 2, 2, 99, 100, 7, 120, 2, 2, 100, 6, 3, 2, 2, 2, 101, 102, 7, 113, 2, 2, 102, 103, 7, 116, 2, 2, 103, 104, 7, 102, 2, 2, 104, 105, 7, 103, 2, 2, 105, 106, 7, 116, 2, 2, 106, 107, 7, 103, 2, 2, 107, 108, 7, 102, 2, 2, 108, 8, 3, 2, 2, 2, 109, 110, 7, 104, 2, 2, 110, 111, 7, 110, 2, 2, 111, 112, 7, 113, 2, 2, 112, 113, 7, 121, 2, 2, 113, 10, 3, 2, 2, 2, 114, 115, 7, 118, 2, 2, 115, 116, 7, 103, 2, 2, 116, 117, 7, 116, 2, 2, 117, 118, 7, 111, 2, 2, 118, 12, 3, 2, 2, 2, 119, 120, 7, 107, 2, 2, 120, 121, 7, 102, 2, 2, 121, 14, 3, 2, 2, 2, 122, 123, 7, 99, 2, 2, 123, 124, 7, 110, 2, 2, 124, 125, 7, 107, 2, 2, 125, 126, 7, 99, 2, 2, 126, 127, 7, 117, 2, 2, 127, 128, 7, 103, 2, 2, 128, 129, 7, 117, 2, 2, 129, 16, 3, 2, 2, 2, 130, 131, 7, 117, 2, 2, 131, 132, 7, 118, 2, 2, 132, 133, 7, 99, 2, 2, 133, 134, 7, 116, 2, 2, 134, 135, 7, 118, 2, 2, 135, 136, 7, 107, 2, 2, 136, 137, 7, 102, 2, 2, 137, 138, 7, 122, 2, 2, 138, 18, 3, 2, 2, 2, 139, 140, 7, 103, 2, 2, 140, 141, 7, 112, 2, 2, 141, 142, 7, 102, 2, 2, 142, 143, 7, 107, 2, 2, 143, 144, 7, 102, 2, 2, 144, 145, 7, 122, 2, 2, 145, 20, 3, 2, 2, 2, 146, 147, 7, 114, 2, 2, 147, 148, 7, 99, 2, 2, 148, 149, 7, 116, 2, 2, 149, 150, 7, 103, 2, 2, 150, 151, 7, 112, 2, 2, 151, 152, 7, 118, 2, 2, 152, 22, 3, 2, 2, 2, 153, 154, 7, 105, 2, 2, 154, 155, 7, 116, 2, 2, 155, 156, 7, 113, 2, 2, 156, 157, 7, 119, 2, 2, 157, 158, 7, 114, 2, 2, 158, 159, 7, 117, 2, 2, 159, 24, 3, 2, 2, 2, 160, 161, 7, 99, 2, 2, 161, 162, 7, 112, 2, 2, 162, 163, 7, 101, 2, 2, 163, 164, 7, 103, 2, 2, 164, 165, 7, 117, 2, 2, 165, 166, 7, 118, 2, 2, 166, 167, 7, 113, 2, 2, 167, 168, 7, 116, 2, 2, 168, 169, 7, 117, 2, 2, 169, 26, 3, 2, 2, 2, 170, 171, 7, 120, 2, 2, 171, 172, 7, 99, 2, 2, 172, 173, 7, 110, 2, 2, 173, 174, 7, 119, 2, 2, 174, 175, 7, 103, 2, 2, 175, 28, 3, 2, 2, 2, 176, 177, 7, 112, 2, 2, 177, 178, 7, 119, 2, 2, 178, 179, 7, 110, 2, 2, 179, 180, 7, 110, 2, 2, 180, 30, 3, 2, 2, 2, 181, 182, 7, 63, 2, 2, 182, 195, 7, 63, 2, 2, 183, 184, 7, 35, 2, 2, 184, 195, 7, 63, 2, 2, 185, 186, 7, 64, 2, 2, 186, 195, 7, 63, 2, 2, 187, 188, 7, 62, 2, 2, 188, 195, 7, 63, 2, 2, 189, 195, 9, 2, 2, 2, 190, 191, 7, 66, 2, 2, 191, 195, 7, 66, 2, 2, 192, 193, 7, 35, 2, 2, 193, 195, 7, 66, 2, 2, 194, 181, 3, 2, 2, 2, 194, 183, 3, 2, 2, 2, 194, 185, 3, 2, 2, 2, 194, 187, 3, 2, 2, 2, 194, 189, 3, 2, 2, 2, 194, 190, 3, 2, 2, 2, 194, 192, 3, 2, 2, 2, 195, 32, 3, 2, 2, 2, 196, 197, 7, 40, 2, 2, 197, 198, 7, 40, 2, 2, 198, 34, 3, 2, 2, 2, 199, 200, 7, 126, 2, 2, 200, 201, 7, 126, 2, 2, 201, 36, 3, 2, 2, 2, 202, 203, 7, 126, 2, 2, 203, 38, 3, 2, 2, 2, 204, 205, 7, 35, 2, 2, 205, 40, 3, 2, 2, 2, 206, 207, 7, 42, 2, 2, 207, 42, 3, 2, 2, 2, 208, 209, 7, 43, 2, 2, 209, 44, 3, 2, 2, 2, 210, 211, 7, 125, 2, 2, 211, 46, 3, 2, 2, 2, 212, 213, 7, 127, 2, 2, 213, 48, 3, 2, 2, 2, 214, 215, 7, 41, 2, 2, 215, 50, 3, 2, 2, 2, 216, 217, 7, 128, 2, 2, 217, 52, 3, 2, 2, 2, 218, 219, 7, 64, 2, 2, 219, 220, 7, 64, 2, 2, 220, 54, 3, 2, 2, 2, 221, 222, 7, 93, 2, 2, 222, 56, 3, 2, 2, 2, 223, 224, 7, 95, 2, 2, 224, 58, 3, 2, 2, 2, 225, 226, 7, 46, 2, 2, 226, 60, 3, 2, 2, 2, 227, 228, 7, 60, 2, 2, 228, 62, 3, 2, 2, 2, 229, 230, 7, 47, 2, 2, 230, 64, 3, 2, 2, 2, 231, 232, 7, 48, 2, 2, 232, 66, 3, 2, 2, 2, 233, 234, 7, 97, 2, 2, 234, 68, 3, 2, 2, 2, 235, 236, 7, 63, 2, 2, 236, 70, 3, 2, 2, 2, 237, 238, 7, 45, 2, 2, 238, 72, 3, 2, 2, 2, 239, 240, 7, 65, 2, 2, 240, 74, 3, 2, 2, 2, 241, 242, 7, 44, 2, 2, 242, 76, 3, 2, 2, 2, 243, 244, 7, 118, 2, 2, 244, 245, 7, 116, 2, 2, 245, 246, 7, 119, 2, 2, 246, 253, 7, 103, 2, 2, 247, 248, 7, 104, 2, 2, 248, 249, 7, 99, 2, 2, 249, 250, 7, 110, 2, 2, 250, 251, 7, 117, 2, 2, 251, 253, 7, 103, 2, 2, 252, 243, 3, 2, 2, 2, 252, 247, 3, 2, 2, 2, 253, 78, 3, 2, 2, 2, 254, 263, 7, 50, 2, 2, 255, 259, 9, 3, 2, 2, 256, 258, 9, 4, 2, 2, 257, 256, 3, 2, 2, 2, 258, 261, 3, 2, 2, 2, 259, 257, 3, 2, 2, 2, 259, 260, 3, 2, 2, 2, 260, 263, 3, 2, 2, 2, 261, 259, 3, 2, 2, 2, 262, 254, 3, 2, 2, 2, 262, 255, 3, 2, 2, 2, 263, 80, 3, 2, 2, 2, 264, 266, 5, 65, 33, 2, 265, 267, 9, 5, 2, 2, 266, 265, 3, 2, 2, 2, 267, 268, 3, 2, 2, 2, 268, 266, 3, 2, 2, 2, 268, 269, 3, 2, 2, 2, 269, 82, 3, 2, 2, 2, 270, 273, 5, 67, 34, 2, 271, 273, 9, 6, 2, 2, 272, 270, 3, 2, 2, 2, 272, 271, 3, 2, 2, 2, 273, 274, 3, 2, 2, 2, 274, 272, 3, 2, 2, 2, 274, 275, 3, 2, 2, 2, 275, 282, 3, 2, 2, 2, 276, 281, 9, 7, 2, 2, 277, 281, 5, 61, 31, 2, 278, 281, 5, 63, 32, 2, 279, 281, 5, 67, 34, 2, 280, 276, 3, 2, 2, 2, 280, 277, 3, 2, 2, 2, 280, 278, 3, 2, 2, 2, 280, 279, 3, 2, 2, 2, 281, 284, 3, 2, 2, 2, 282, 280, 3, 2, 2, 2, 282, 283, 3, 2, 2, 2, 283, 84, 3, 2, 2, 2, 284, 282, 3, 2, 2, 2, 285, 287, 9, 8, 2, 2, 286, 285, 3, 2, 2, 2, 287, 288, 3, 2, 2, 2, 288, 286, 3, 2, 2, 2, 288, 289, 3, 2, 2, 2, 289, 290, 3, 2, 2, 2, 290, 291, 8, 43, 2, 2, 291, 86, 3, 2, 2, 2, 292, 293, 11, 2, 2, 2, 293, 88, 3, 2, 2, 2, 13, 2, 194, 252, 259, 262, 268, 272, 274, 280, 282, 288, 3, 8, 2, 2]
\ No newline at end of file
+[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 44, 287, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 188, 10, 15, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 19, 3, 19, 3, 20, 3, 20, 3, 21, 3, 21, 3, 22, 3, 22, 3, 23, 3, 23, 3, 24, 3, 24, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 28, 3, 28, 3, 29, 3, 29, 3, 30, 3, 30, 3, 31, 3, 31, 3, 32, 3, 32, 3, 33, 3, 33, 3, 34, 3, 34, 3, 35, 3, 35, 3, 36, 3, 36, 3, 37, 3, 37, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 5, 38, 246, 10, 38, 3, 39, 3, 39, 3, 39, 7, 39, 251, 10, 39, 12, 39, 14, 39, 254, 11, 39, 5, 39, 256, 10, 39, 3, 40, 3, 40, 6, 40, 260, 10, 40, 13, 40, 14, 40, 261, 3, 41, 3, 41, 6, 41, 266, 10, 41, 13, 41, 14, 41, 267, 3, 41, 3, 41, 3, 41, 3, 41, 7, 41, 274, 10, 41, 12, 41, 14, 41, 277, 11, 41, 3, 42, 6, 42, 280, 10, 42, 13, 42, 14, 42, 281, 3, 42, 3, 42, 3, 43, 3, 43, 2, 2, 44, 3, 3, 5, 4, 7, 5, 9, 6, 11, 7, 13, 8, 15, 9, 17, 10, 19, 11, 21, 12, 23, 13, 25, 14, 27, 15, 29, 16, 31, 17, 33, 18, 35, 19, 37, 20, 39, 21, 41, 22, 43, 23, 45, 24, 47, 25, 49, 26, 51, 27, 53, 28, 55, 29, 57, 30, 59, 31, 61, 32, 63, 33, 65, 34, 67, 35, 69, 36, 71, 37, 73, 38, 75, 39, 77, 40, 79, 41, 81, 42, 83, 43, 85, 44, 3, 2, 9, 4, 2, 62, 62, 64, 64, 3, 2, 51, 59, 4, 2, 50, 59, 97, 97, 3, 2, 50, 59, 4, 2, 67, 92, 99, 124, 5, 2, 50, 59, 67, 92, 99, 124, 5, 2, 11, 12, 14, 15, 34, 34, 2, 303, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 61, 3, 2, 2, 2, 2, 63, 3, 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, 67, 3, 2, 2, 2, 2, 69, 3, 2, 2, 2, 2, 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 77, 3, 2, 2, 2, 2, 79, 3, 2, 2, 2, 2, 81, 3, 2, 2, 2, 2, 83, 3, 2, 2, 2, 2, 85, 3, 2, 2, 2, 3, 87, 3, 2, 2, 2, 5, 94, 3, 2, 2, 2, 7, 102, 3, 2, 2, 2, 9, 107, 3, 2, 2, 2, 11, 112, 3, 2, 2, 2, 13, 115, 3, 2, 2, 2, 15, 123, 3, 2, 2, 2, 17, 132, 3, 2, 2, 2, 19, 139, 3, 2, 2, 2, 21, 146, 3, 2, 2, 2, 23, 153, 3, 2, 2, 2, 25, 163, 3, 2, 2, 2, 27, 169, 3, 2, 2, 2, 29, 187, 3, 2, 2, 2, 31, 189, 3, 2, 2, 2, 33, 192, 3, 2, 2, 2, 35, 195, 3, 2, 2, 2, 37, 197, 3, 2, 2, 2, 39, 199, 3, 2, 2, 2, 41, 201, 3, 2, 2, 2, 43, 203, 3, 2, 2, 2, 45, 205, 3, 2, 2, 2, 47, 207, 3, 2, 2, 2, 49, 209, 3, 2, 2, 2, 51, 211, 3, 2, 2, 2, 53, 214, 3, 2, 2, 2, 55, 216, 3, 2, 2, 2, 57, 218, 3, 2, 2, 2, 59, 220, 3, 2, 2, 2, 61, 222, 3, 2, 2, 2, 63, 224, 3, 2, 2, 2, 65, 226, 3, 2, 2, 2, 67, 228, 3, 2, 2, 2, 69, 230, 3, 2, 2, 2, 71, 232, 3, 2, 2, 2, 73, 234, 3, 2, 2, 2, 75, 245, 3, 2, 2, 2, 77, 255, 3, 2, 2, 2, 79, 257, 3, 2, 2, 2, 81, 265, 3, 2, 2, 2, 83, 279, 3, 2, 2, 2, 85, 285, 3, 2, 2, 2, 87, 88, 7, 107, 2, 2, 88, 89, 7, 112, 2, 2, 89, 90, 7, 118, 2, 2, 90, 91, 7, 103, 2, 2, 91, 92, 7, 112, 2, 2, 92, 93, 7, 118, 2, 2, 93, 4, 3, 2, 2, 2, 94, 95, 7, 113, 2, 2, 95, 96, 7, 116, 2, 2, 96, 97, 7, 102, 2, 2, 97, 98, 7, 103, 2, 2, 98, 99, 7, 116, 2, 2, 99, 100, 7, 103, 2, 2, 100, 101, 7, 102, 2, 2, 101, 6, 3, 2, 2, 2, 102, 103, 7, 104, 2, 2, 103, 104, 7, 110, 2, 2, 104, 105, 7, 113, 2, 2, 105, 106, 7, 121, 2, 2, 106, 8, 3, 2, 2, 2, 107, 108, 7, 118, 2, 2, 108, 109, 7, 103, 2, 2, 109, 110, 7, 116, 2, 2, 110, 111, 7, 111, 2, 2, 111, 10, 3, 2, 2, 2, 112, 113, 7, 107, 2, 2, 113, 114, 7, 102, 2, 2, 114, 12, 3, 2, 2, 2, 115, 116, 7, 99, 2, 2, 116, 117, 7, 110, 2, 2, 117, 118, 7, 107, 2, 2, 118, 119, 7, 99, 2, 2, 119, 120, 7, 117, 2, 2, 120, 121, 7, 103, 2, 2, 121, 122, 7, 117, 2, 2, 122, 14, 3, 2, 2, 2, 123, 124, 7, 117, 2, 2, 124, 125, 7, 118, 2, 2, 125, 126, 7, 99, 2, 2, 126, 127, 7, 116, 2, 2, 127, 128, 7, 118, 2, 2, 128, 129, 7, 107, 2, 2, 129, 130, 7, 102, 2, 2, 130, 131, 7, 122, 2, 2, 131, 16, 3, 2, 2, 2, 132, 133, 7, 103, 2, 2, 133, 134, 7, 112, 2, 2, 134, 135, 7, 102, 2, 2, 135, 136, 7, 107, 2, 2, 136, 137, 7, 102, 2, 2, 137, 138, 7, 122, 2, 2, 138, 18, 3, 2, 2, 2, 139, 140, 7, 114, 2, 2, 140, 141, 7, 99, 2, 2, 141, 142, 7, 116, 2, 2, 142, 143, 7, 103, 2, 2, 143, 144, 7, 112, 2, 2, 144, 145, 7, 118, 2, 2, 145, 20, 3, 2, 2, 2, 146, 147, 7, 105, 2, 2, 147, 148, 7, 116, 2, 2, 148, 149, 7, 113, 2, 2, 149, 150, 7, 119, 2, 2, 150, 151, 7, 114, 2, 2, 151, 152, 7, 117, 2, 2, 152, 22, 3, 2, 2, 2, 153, 154, 7, 99, 2, 2, 154, 155, 7, 112, 2, 2, 155, 156, 7, 101, 2, 2, 156, 157, 7, 103, 2, 2, 157, 158, 7, 117, 2, 2, 158, 159, 7, 118, 2, 2, 159, 160, 7, 113, 2, 2, 160, 161, 7, 116, 2, 2, 161, 162, 7, 117, 2, 2, 162, 24, 3, 2, 2, 2, 163, 164, 7, 120, 2, 2, 164, 165, 7, 99, 2, 2, 165, 166, 7, 110, 2, 2, 166, 167, 7, 119, 2, 2, 167, 168, 7, 103, 2, 2, 168, 26, 3, 2, 2, 2, 169, 170, 7, 112, 2, 2, 170, 171, 7, 119, 2, 2, 171, 172, 7, 110, 2, 2, 172, 173, 7, 110, 2, 2, 173, 28, 3, 2, 2, 2, 174, 175, 7, 63, 2, 2, 175, 188, 7, 63, 2, 2, 176, 177, 7, 35, 2, 2, 177, 188, 7, 63, 2, 2, 178, 179, 7, 64, 2, 2, 179, 188, 7, 63, 2, 2, 180, 181, 7, 62, 2, 2, 181, 188, 7, 63, 2, 2, 182, 188, 9, 2, 2, 2, 183, 184, 7, 66, 2, 2, 184, 188, 7, 66, 2, 2, 185, 186, 7, 35, 2, 2, 186, 188, 7, 66, 2, 2, 187, 174, 3, 2, 2, 2, 187, 176, 3, 2, 2, 2, 187, 178, 3, 2, 2, 2, 187, 180, 3, 2, 2, 2, 187, 182, 3, 2, 2, 2, 187, 183, 3, 2, 2, 2, 187, 185, 3, 2, 2, 2, 188, 30, 3, 2, 2, 2, 189, 190, 7, 40, 2, 2, 190, 191, 7, 40, 2, 2, 191, 32, 3, 2, 2, 2, 192, 193, 7, 126, 2, 2, 193, 194, 7, 126, 2, 2, 194, 34, 3, 2, 2, 2, 195, 196, 7, 126, 2, 2, 196, 36, 3, 2, 2, 2, 197, 198, 7, 35, 2, 2, 198, 38, 3, 2, 2, 2, 199, 200, 7, 42, 2, 2, 200, 40, 3, 2, 2, 2, 201, 202, 7, 43, 2, 2, 202, 42, 3, 2, 2, 2, 203, 204, 7, 125, 2, 2, 204, 44, 3, 2, 2, 2, 205, 206, 7, 127, 2, 2, 206, 46, 3, 2, 2, 2, 207, 208, 7, 41, 2, 2, 208, 48, 3, 2, 2, 2, 209, 210, 7, 128, 2, 2, 210, 50, 3, 2, 2, 2, 211, 212, 7, 64, 2, 2, 212, 213, 7, 64, 2, 2, 213, 52, 3, 2, 2, 2, 214, 215, 7, 93, 2, 2, 215, 54, 3, 2, 2, 2, 216, 217, 7, 95, 2, 2, 217, 56, 3, 2, 2, 2, 218, 219, 7, 46, 2, 2, 219, 58, 3, 2, 2, 2, 220, 221, 7, 60, 2, 2, 221, 60, 3, 2, 2, 2, 222, 223, 7, 47, 2, 2, 223, 62, 3, 2, 2, 2, 224, 225, 7, 48, 2, 2, 225, 64, 3, 2, 2, 2, 226, 227, 7, 97, 2, 2, 227, 66, 3, 2, 2, 2, 228, 229, 7, 63, 2, 2, 229, 68, 3, 2, 2, 2, 230, 231, 7, 45, 2, 2, 231, 70, 3, 2, 2, 2, 232, 233, 7, 65, 2, 2, 233, 72, 3, 2, 2, 2, 234, 235, 7, 44, 2, 2, 235, 74, 3, 2, 2, 2, 236, 237, 7, 118, 2, 2, 237, 238, 7, 116, 2, 2, 238, 239, 7, 119, 2, 2, 239, 246, 7, 103, 2, 2, 240, 241, 7, 104, 2, 2, 241, 242, 7, 99, 2, 2, 242, 243, 7, 110, 2, 2, 243, 244, 7, 117, 2, 2, 244, 246, 7, 103, 2, 2, 245, 236, 3, 2, 2, 2, 245, 240, 3, 2, 2, 2, 246, 76, 3, 2, 2, 2, 247, 256, 7, 50, 2, 2, 248, 252, 9, 3, 2, 2, 249, 251, 9, 4, 2, 2, 250, 249, 3, 2, 2, 2, 251, 254, 3, 2, 2, 2, 252, 250, 3, 2, 2, 2, 252, 253, 3, 2, 2, 2, 253, 256, 3, 2, 2, 2, 254, 252, 3, 2, 2, 2, 255, 247, 3, 2, 2, 2, 255, 248, 3, 2, 2, 2, 256, 78, 3, 2, 2, 2, 257, 259, 5, 63, 32, 2, 258, 260, 9, 5, 2, 2, 259, 258, 3, 2, 2, 2, 260, 261, 3, 2, 2, 2, 261, 259, 3, 2, 2, 2, 261, 262, 3, 2, 2, 2, 262, 80, 3, 2, 2, 2, 263, 266, 5, 65, 33, 2, 264, 266, 9, 6, 2, 2, 265, 263, 3, 2, 2, 2, 265, 264, 3, 2, 2, 2, 266, 267, 3, 2, 2, 2, 267, 265, 3, 2, 2, 2, 267, 268, 3, 2, 2, 2, 268, 275, 3, 2, 2, 2, 269, 274, 9, 7, 2, 2, 270, 274, 5, 59, 30, 2, 271, 274, 5, 61, 31, 2, 272, 274, 5, 65, 33, 2, 273, 269, 3, 2, 2, 2, 273, 270, 3, 2, 2, 2, 273, 271, 3, 2, 2, 2, 273, 272, 3, 2, 2, 2, 274, 277, 3, 2, 2, 2, 275, 273, 3, 2, 2, 2, 275, 276, 3, 2, 2, 2, 276, 82, 3, 2, 2, 2, 277, 275, 3, 2, 2, 2, 278, 280, 9, 8, 2, 2, 279, 278, 3, 2, 2, 2, 280, 281, 3, 2, 2, 2, 281, 279, 3, 2, 2, 2, 281, 282, 3, 2, 2, 2, 282, 283, 3, 2, 2, 2, 283, 284, 8, 42, 2, 2, 284, 84, 3, 2, 2, 2, 285, 286, 11, 2, 2, 2, 286, 86, 3, 2, 2, 2, 13, 2, 187, 245, 252, 255, 261, 265, 267, 273, 275, 281, 3, 8, 2, 2]
\ No newline at end of file
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslLexer.java b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslLexer.java
index 1f458a1..a7c7c26 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslLexer.java
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslLexer.java
@@ -1,10 +1,13 @@
-// Generated from /Users/xxx/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDsl.g4 by ANTLR 4.8
+// Generated from C:/Users/Nikita Ivanov/Documents/GitHub/incubator-nlpcraft/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4\NCIntentDsl.g4 by ANTLR 4.8
 package org.apache.nlpcraft.model.intent.impl.antlr4;
 import org.antlr.v4.runtime.Lexer;
 import org.antlr.v4.runtime.CharStream;
+import org.antlr.v4.runtime.Token;
+import org.antlr.v4.runtime.TokenStream;
 import org.antlr.v4.runtime.*;
 import org.antlr.v4.runtime.atn.*;
 import org.antlr.v4.runtime.dfa.DFA;
+import org.antlr.v4.runtime.misc.*;
 
 @SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"})
 public class NCIntentDslLexer extends Lexer {
@@ -15,11 +18,11 @@
 		new PredictionContextCache();
 	public static final int
 		T__0=1, T__1=2, T__2=3, T__3=4, T__4=5, T__5=6, T__6=7, T__7=8, T__8=9, 
-		T__9=10, T__10=11, T__11=12, T__12=13, T__13=14, PRED_OP=15, AND=16, OR=17, 
-		VERT=18, EXCL=19, LPAREN=20, RPAREN=21, LCURLY=22, RCURLY=23, SQUOTE=24, 
-		TILDA=25, RIGHT=26, LBR=27, RBR=28, COMMA=29, COLON=30, MINUS=31, DOT=32, 
-		UNDERSCORE=33, EQ=34, PLUS=35, QUESTION=36, STAR=37, BOOL=38, INT=39, 
-		EXP=40, ID=41, WS=42, ErrorCharacter=43;
+		T__9=10, T__10=11, T__11=12, T__12=13, PRED_OP=14, AND=15, OR=16, VERT=17, 
+		EXCL=18, LPAREN=19, RPAREN=20, LCURLY=21, RCURLY=22, SQUOTE=23, TILDA=24, 
+		RIGHT=25, LBR=26, RBR=27, COMMA=28, COLON=29, MINUS=30, DOT=31, UNDERSCORE=32, 
+		EQ=33, PLUS=34, QUESTION=35, STAR=36, BOOL=37, INT=38, EXP=39, ID=40, 
+		WS=41, ErrorCharacter=42;
 	public static String[] channelNames = {
 		"DEFAULT_TOKEN_CHANNEL", "HIDDEN"
 	};
@@ -31,9 +34,9 @@
 	private static String[] makeRuleNames() {
 		return new String[] {
 			"T__0", "T__1", "T__2", "T__3", "T__4", "T__5", "T__6", "T__7", "T__8", 
-			"T__9", "T__10", "T__11", "T__12", "T__13", "PRED_OP", "AND", "OR", "VERT", 
-			"EXCL", "LPAREN", "RPAREN", "LCURLY", "RCURLY", "SQUOTE", "TILDA", "RIGHT", 
-			"LBR", "RBR", "COMMA", "COLON", "MINUS", "DOT", "UNDERSCORE", "EQ", "PLUS", 
+			"T__9", "T__10", "T__11", "T__12", "PRED_OP", "AND", "OR", "VERT", "EXCL", 
+			"LPAREN", "RPAREN", "LCURLY", "RCURLY", "SQUOTE", "TILDA", "RIGHT", "LBR", 
+			"RBR", "COMMA", "COLON", "MINUS", "DOT", "UNDERSCORE", "EQ", "PLUS", 
 			"QUESTION", "STAR", "BOOL", "INT", "EXP", "ID", "WS", "ErrorCharacter"
 		};
 	}
@@ -41,18 +44,18 @@
 
 	private static String[] makeLiteralNames() {
 		return new String[] {
-			null, "'intent'", "'conv'", "'ordered'", "'flow'", "'term'", "'id'", 
-			"'aliases'", "'startidx'", "'endidx'", "'parent'", "'groups'", "'ancestors'", 
-			"'value'", "'null'", null, "'&&'", "'||'", "'|'", "'!'", "'('", "')'", 
-			"'{'", "'}'", "'''", "'~'", "'>>'", "'['", "']'", "','", "':'", "'-'", 
-			"'.'", "'_'", "'='", "'+'", "'?'", "'*'"
+			null, "'intent'", "'ordered'", "'flow'", "'term'", "'id'", "'aliases'", 
+			"'startidx'", "'endidx'", "'parent'", "'groups'", "'ancestors'", "'value'", 
+			"'null'", null, "'&&'", "'||'", "'|'", "'!'", "'('", "')'", "'{'", "'}'", 
+			"'''", "'~'", "'>>'", "'['", "']'", "','", "':'", "'-'", "'.'", "'_'", 
+			"'='", "'+'", "'?'", "'*'"
 		};
 	}
 	private static final String[] _LITERAL_NAMES = makeLiteralNames();
 	private static String[] makeSymbolicNames() {
 		return new String[] {
 			null, null, null, null, null, null, null, null, null, null, null, null, 
-			null, null, null, "PRED_OP", "AND", "OR", "VERT", "EXCL", "LPAREN", "RPAREN", 
+			null, null, "PRED_OP", "AND", "OR", "VERT", "EXCL", "LPAREN", "RPAREN", 
 			"LCURLY", "RCURLY", "SQUOTE", "TILDA", "RIGHT", "LBR", "RBR", "COMMA", 
 			"COLON", "MINUS", "DOT", "UNDERSCORE", "EQ", "PLUS", "QUESTION", "STAR", 
 			"BOOL", "INT", "EXP", "ID", "WS", "ErrorCharacter"
@@ -117,100 +120,98 @@
 	public ATN getATN() { return _ATN; }
 
 	public static final String _serializedATN =
-		"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2-\u0126\b\1\4\2\t"+
+		"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2,\u011f\b\1\4\2\t"+
 		"\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13"+
 		"\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+
 		"\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+
 		"\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36\t\36\4\37\t\37\4 \t \4!"+
-		"\t!\4\"\t\"\4#\t#\4$\t$\4%\t%\4&\t&\4\'\t\'\4(\t(\4)\t)\4*\t*\4+\t+\4"+
-		",\t,\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\3\3\3\3\3\3\3\3\3\3\4\3\4\3\4\3\4\3"+
-		"\4\3\4\3\4\3\4\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\7\3\7\3\7\3\b"+
-		"\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\n\3"+
-		"\n\3\n\3\n\3\n\3\n\3\n\3\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\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\16\3\16\3\16"+
-		"\3\16\3\16\3\16\3\17\3\17\3\17\3\17\3\17\3\20\3\20\3\20\3\20\3\20\3\20"+
-		"\3\20\3\20\3\20\3\20\3\20\3\20\3\20\5\20\u00c3\n\20\3\21\3\21\3\21\3\22"+
-		"\3\22\3\22\3\23\3\23\3\24\3\24\3\25\3\25\3\26\3\26\3\27\3\27\3\30\3\30"+
-		"\3\31\3\31\3\32\3\32\3\33\3\33\3\33\3\34\3\34\3\35\3\35\3\36\3\36\3\37"+
-		"\3\37\3 \3 \3!\3!\3\"\3\"\3#\3#\3$\3$\3%\3%\3&\3&\3\'\3\'\3\'\3\'\3\'"+
-		"\3\'\3\'\3\'\3\'\5\'\u00fd\n\'\3(\3(\3(\7(\u0102\n(\f(\16(\u0105\13(\5"+
-		"(\u0107\n(\3)\3)\6)\u010b\n)\r)\16)\u010c\3*\3*\6*\u0111\n*\r*\16*\u0112"+
-		"\3*\3*\3*\3*\7*\u0119\n*\f*\16*\u011c\13*\3+\6+\u011f\n+\r+\16+\u0120"+
-		"\3+\3+\3,\3,\2\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-\3\2\t\4\2>>@@\3\2\63;"+
-		"\4\2\62;aa\3\2\62;\4\2C\\c|\5\2\62;C\\c|\5\2\13\f\16\17\"\"\2\u0136\2"+
-		"\3\3\2\2\2\2\5\3\2\2\2\2\7\3\2\2\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2"+
-		"\2\2\17\3\2\2\2\2\21\3\2\2\2\2\23\3\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2\2"+
-		"\31\3\2\2\2\2\33\3\2\2\2\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2\2\2\2#\3\2\2"+
-		"\2\2%\3\2\2\2\2\'\3\2\2\2\2)\3\2\2\2\2+\3\2\2\2\2-\3\2\2\2\2/\3\2\2\2"+
-		"\2\61\3\2\2\2\2\63\3\2\2\2\2\65\3\2\2\2\2\67\3\2\2\2\29\3\2\2\2\2;\3\2"+
-		"\2\2\2=\3\2\2\2\2?\3\2\2\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2\2\2G\3\2\2\2"+
-		"\2I\3\2\2\2\2K\3\2\2\2\2M\3\2\2\2\2O\3\2\2\2\2Q\3\2\2\2\2S\3\2\2\2\2U"+
-		"\3\2\2\2\2W\3\2\2\2\3Y\3\2\2\2\5`\3\2\2\2\7e\3\2\2\2\tm\3\2\2\2\13r\3"+
-		"\2\2\2\rw\3\2\2\2\17z\3\2\2\2\21\u0082\3\2\2\2\23\u008b\3\2\2\2\25\u0092"+
-		"\3\2\2\2\27\u0099\3\2\2\2\31\u00a0\3\2\2\2\33\u00aa\3\2\2\2\35\u00b0\3"+
-		"\2\2\2\37\u00c2\3\2\2\2!\u00c4\3\2\2\2#\u00c7\3\2\2\2%\u00ca\3\2\2\2\'"+
-		"\u00cc\3\2\2\2)\u00ce\3\2\2\2+\u00d0\3\2\2\2-\u00d2\3\2\2\2/\u00d4\3\2"+
-		"\2\2\61\u00d6\3\2\2\2\63\u00d8\3\2\2\2\65\u00da\3\2\2\2\67\u00dd\3\2\2"+
-		"\29\u00df\3\2\2\2;\u00e1\3\2\2\2=\u00e3\3\2\2\2?\u00e5\3\2\2\2A\u00e7"+
-		"\3\2\2\2C\u00e9\3\2\2\2E\u00eb\3\2\2\2G\u00ed\3\2\2\2I\u00ef\3\2\2\2K"+
-		"\u00f1\3\2\2\2M\u00fc\3\2\2\2O\u0106\3\2\2\2Q\u0108\3\2\2\2S\u0110\3\2"+
-		"\2\2U\u011e\3\2\2\2W\u0124\3\2\2\2YZ\7k\2\2Z[\7p\2\2[\\\7v\2\2\\]\7g\2"+
-		"\2]^\7p\2\2^_\7v\2\2_\4\3\2\2\2`a\7e\2\2ab\7q\2\2bc\7p\2\2cd\7x\2\2d\6"+
-		"\3\2\2\2ef\7q\2\2fg\7t\2\2gh\7f\2\2hi\7g\2\2ij\7t\2\2jk\7g\2\2kl\7f\2"+
-		"\2l\b\3\2\2\2mn\7h\2\2no\7n\2\2op\7q\2\2pq\7y\2\2q\n\3\2\2\2rs\7v\2\2"+
-		"st\7g\2\2tu\7t\2\2uv\7o\2\2v\f\3\2\2\2wx\7k\2\2xy\7f\2\2y\16\3\2\2\2z"+
-		"{\7c\2\2{|\7n\2\2|}\7k\2\2}~\7c\2\2~\177\7u\2\2\177\u0080\7g\2\2\u0080"+
-		"\u0081\7u\2\2\u0081\20\3\2\2\2\u0082\u0083\7u\2\2\u0083\u0084\7v\2\2\u0084"+
-		"\u0085\7c\2\2\u0085\u0086\7t\2\2\u0086\u0087\7v\2\2\u0087\u0088\7k\2\2"+
-		"\u0088\u0089\7f\2\2\u0089\u008a\7z\2\2\u008a\22\3\2\2\2\u008b\u008c\7"+
-		"g\2\2\u008c\u008d\7p\2\2\u008d\u008e\7f\2\2\u008e\u008f\7k\2\2\u008f\u0090"+
-		"\7f\2\2\u0090\u0091\7z\2\2\u0091\24\3\2\2\2\u0092\u0093\7r\2\2\u0093\u0094"+
-		"\7c\2\2\u0094\u0095\7t\2\2\u0095\u0096\7g\2\2\u0096\u0097\7p\2\2\u0097"+
-		"\u0098\7v\2\2\u0098\26\3\2\2\2\u0099\u009a\7i\2\2\u009a\u009b\7t\2\2\u009b"+
-		"\u009c\7q\2\2\u009c\u009d\7w\2\2\u009d\u009e\7r\2\2\u009e\u009f\7u\2\2"+
-		"\u009f\30\3\2\2\2\u00a0\u00a1\7c\2\2\u00a1\u00a2\7p\2\2\u00a2\u00a3\7"+
-		"e\2\2\u00a3\u00a4\7g\2\2\u00a4\u00a5\7u\2\2\u00a5\u00a6\7v\2\2\u00a6\u00a7"+
-		"\7q\2\2\u00a7\u00a8\7t\2\2\u00a8\u00a9\7u\2\2\u00a9\32\3\2\2\2\u00aa\u00ab"+
-		"\7x\2\2\u00ab\u00ac\7c\2\2\u00ac\u00ad\7n\2\2\u00ad\u00ae\7w\2\2\u00ae"+
-		"\u00af\7g\2\2\u00af\34\3\2\2\2\u00b0\u00b1\7p\2\2\u00b1\u00b2\7w\2\2\u00b2"+
-		"\u00b3\7n\2\2\u00b3\u00b4\7n\2\2\u00b4\36\3\2\2\2\u00b5\u00b6\7?\2\2\u00b6"+
-		"\u00c3\7?\2\2\u00b7\u00b8\7#\2\2\u00b8\u00c3\7?\2\2\u00b9\u00ba\7@\2\2"+
-		"\u00ba\u00c3\7?\2\2\u00bb\u00bc\7>\2\2\u00bc\u00c3\7?\2\2\u00bd\u00c3"+
-		"\t\2\2\2\u00be\u00bf\7B\2\2\u00bf\u00c3\7B\2\2\u00c0\u00c1\7#\2\2\u00c1"+
-		"\u00c3\7B\2\2\u00c2\u00b5\3\2\2\2\u00c2\u00b7\3\2\2\2\u00c2\u00b9\3\2"+
-		"\2\2\u00c2\u00bb\3\2\2\2\u00c2\u00bd\3\2\2\2\u00c2\u00be\3\2\2\2\u00c2"+
-		"\u00c0\3\2\2\2\u00c3 \3\2\2\2\u00c4\u00c5\7(\2\2\u00c5\u00c6\7(\2\2\u00c6"+
-		"\"\3\2\2\2\u00c7\u00c8\7~\2\2\u00c8\u00c9\7~\2\2\u00c9$\3\2\2\2\u00ca"+
-		"\u00cb\7~\2\2\u00cb&\3\2\2\2\u00cc\u00cd\7#\2\2\u00cd(\3\2\2\2\u00ce\u00cf"+
-		"\7*\2\2\u00cf*\3\2\2\2\u00d0\u00d1\7+\2\2\u00d1,\3\2\2\2\u00d2\u00d3\7"+
-		"}\2\2\u00d3.\3\2\2\2\u00d4\u00d5\7\177\2\2\u00d5\60\3\2\2\2\u00d6\u00d7"+
-		"\7)\2\2\u00d7\62\3\2\2\2\u00d8\u00d9\7\u0080\2\2\u00d9\64\3\2\2\2\u00da"+
-		"\u00db\7@\2\2\u00db\u00dc\7@\2\2\u00dc\66\3\2\2\2\u00dd\u00de\7]\2\2\u00de"+
-		"8\3\2\2\2\u00df\u00e0\7_\2\2\u00e0:\3\2\2\2\u00e1\u00e2\7.\2\2\u00e2<"+
-		"\3\2\2\2\u00e3\u00e4\7<\2\2\u00e4>\3\2\2\2\u00e5\u00e6\7/\2\2\u00e6@\3"+
-		"\2\2\2\u00e7\u00e8\7\60\2\2\u00e8B\3\2\2\2\u00e9\u00ea\7a\2\2\u00eaD\3"+
-		"\2\2\2\u00eb\u00ec\7?\2\2\u00ecF\3\2\2\2\u00ed\u00ee\7-\2\2\u00eeH\3\2"+
-		"\2\2\u00ef\u00f0\7A\2\2\u00f0J\3\2\2\2\u00f1\u00f2\7,\2\2\u00f2L\3\2\2"+
-		"\2\u00f3\u00f4\7v\2\2\u00f4\u00f5\7t\2\2\u00f5\u00f6\7w\2\2\u00f6\u00fd"+
-		"\7g\2\2\u00f7\u00f8\7h\2\2\u00f8\u00f9\7c\2\2\u00f9\u00fa\7n\2\2\u00fa"+
-		"\u00fb\7u\2\2\u00fb\u00fd\7g\2\2\u00fc\u00f3\3\2\2\2\u00fc\u00f7\3\2\2"+
-		"\2\u00fdN\3\2\2\2\u00fe\u0107\7\62\2\2\u00ff\u0103\t\3\2\2\u0100\u0102"+
-		"\t\4\2\2\u0101\u0100\3\2\2\2\u0102\u0105\3\2\2\2\u0103\u0101\3\2\2\2\u0103"+
-		"\u0104\3\2\2\2\u0104\u0107\3\2\2\2\u0105\u0103\3\2\2\2\u0106\u00fe\3\2"+
-		"\2\2\u0106\u00ff\3\2\2\2\u0107P\3\2\2\2\u0108\u010a\5A!\2\u0109\u010b"+
-		"\t\5\2\2\u010a\u0109\3\2\2\2\u010b\u010c\3\2\2\2\u010c\u010a\3\2\2\2\u010c"+
-		"\u010d\3\2\2\2\u010dR\3\2\2\2\u010e\u0111\5C\"\2\u010f\u0111\t\6\2\2\u0110"+
-		"\u010e\3\2\2\2\u0110\u010f\3\2\2\2\u0111\u0112\3\2\2\2\u0112\u0110\3\2"+
-		"\2\2\u0112\u0113\3\2\2\2\u0113\u011a\3\2\2\2\u0114\u0119\t\7\2\2\u0115"+
-		"\u0119\5=\37\2\u0116\u0119\5? \2\u0117\u0119\5C\"\2\u0118\u0114\3\2\2"+
-		"\2\u0118\u0115\3\2\2\2\u0118\u0116\3\2\2\2\u0118\u0117\3\2\2\2\u0119\u011c"+
-		"\3\2\2\2\u011a\u0118\3\2\2\2\u011a\u011b\3\2\2\2\u011bT\3\2\2\2\u011c"+
-		"\u011a\3\2\2\2\u011d\u011f\t\b\2\2\u011e\u011d\3\2\2\2\u011f\u0120\3\2"+
-		"\2\2\u0120\u011e\3\2\2\2\u0120\u0121\3\2\2\2\u0121\u0122\3\2\2\2\u0122"+
-		"\u0123\b+\2\2\u0123V\3\2\2\2\u0124\u0125\13\2\2\2\u0125X\3\2\2\2\r\2\u00c2"+
-		"\u00fc\u0103\u0106\u010c\u0110\u0112\u0118\u011a\u0120\3\b\2\2";
+		"\t!\4\"\t\"\4#\t#\4$\t$\4%\t%\4&\t&\4\'\t\'\4(\t(\4)\t)\4*\t*\4+\t+\3"+
+		"\2\3\2\3\2\3\2\3\2\3\2\3\2\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\4\3\4\3\4"+
+		"\3\4\3\4\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3\6\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3"+
+		"\7\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\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\13\3\13\3\13\3\13\3\13\3\13\3\13\3\f\3\f\3"+
+		"\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3\r\3\r\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\17\3\17\3\17"+
+		"\3\17\5\17\u00bc\n\17\3\20\3\20\3\20\3\21\3\21\3\21\3\22\3\22\3\23\3\23"+
+		"\3\24\3\24\3\25\3\25\3\26\3\26\3\27\3\27\3\30\3\30\3\31\3\31\3\32\3\32"+
+		"\3\32\3\33\3\33\3\34\3\34\3\35\3\35\3\36\3\36\3\37\3\37\3 \3 \3!\3!\3"+
+		"\"\3\"\3#\3#\3$\3$\3%\3%\3&\3&\3&\3&\3&\3&\3&\3&\3&\5&\u00f6\n&\3\'\3"+
+		"\'\3\'\7\'\u00fb\n\'\f\'\16\'\u00fe\13\'\5\'\u0100\n\'\3(\3(\6(\u0104"+
+		"\n(\r(\16(\u0105\3)\3)\6)\u010a\n)\r)\16)\u010b\3)\3)\3)\3)\7)\u0112\n"+
+		")\f)\16)\u0115\13)\3*\6*\u0118\n*\r*\16*\u0119\3*\3*\3+\3+\2\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,\3\2\t\4\2>>@@\3\2\63;\4\2\62;aa\3\2\62;\4\2C"+
+		"\\c|\5\2\62;C\\c|\5\2\13\f\16\17\"\"\2\u012f\2\3\3\2\2\2\2\5\3\2\2\2\2"+
+		"\7\3\2\2\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2\21\3\2"+
+		"\2\2\2\23\3\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31\3\2\2\2\2\33\3\2\2\2"+
+		"\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2\2"+
+		"\2\2)\3\2\2\2\2+\3\2\2\2\2-\3\2\2\2\2/\3\2\2\2\2\61\3\2\2\2\2\63\3\2\2"+
+		"\2\2\65\3\2\2\2\2\67\3\2\2\2\29\3\2\2\2\2;\3\2\2\2\2=\3\2\2\2\2?\3\2\2"+
+		"\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2\2\2G\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2\2"+
+		"M\3\2\2\2\2O\3\2\2\2\2Q\3\2\2\2\2S\3\2\2\2\2U\3\2\2\2\3W\3\2\2\2\5^\3"+
+		"\2\2\2\7f\3\2\2\2\tk\3\2\2\2\13p\3\2\2\2\rs\3\2\2\2\17{\3\2\2\2\21\u0084"+
+		"\3\2\2\2\23\u008b\3\2\2\2\25\u0092\3\2\2\2\27\u0099\3\2\2\2\31\u00a3\3"+
+		"\2\2\2\33\u00a9\3\2\2\2\35\u00bb\3\2\2\2\37\u00bd\3\2\2\2!\u00c0\3\2\2"+
+		"\2#\u00c3\3\2\2\2%\u00c5\3\2\2\2\'\u00c7\3\2\2\2)\u00c9\3\2\2\2+\u00cb"+
+		"\3\2\2\2-\u00cd\3\2\2\2/\u00cf\3\2\2\2\61\u00d1\3\2\2\2\63\u00d3\3\2\2"+
+		"\2\65\u00d6\3\2\2\2\67\u00d8\3\2\2\29\u00da\3\2\2\2;\u00dc\3\2\2\2=\u00de"+
+		"\3\2\2\2?\u00e0\3\2\2\2A\u00e2\3\2\2\2C\u00e4\3\2\2\2E\u00e6\3\2\2\2G"+
+		"\u00e8\3\2\2\2I\u00ea\3\2\2\2K\u00f5\3\2\2\2M\u00ff\3\2\2\2O\u0101\3\2"+
+		"\2\2Q\u0109\3\2\2\2S\u0117\3\2\2\2U\u011d\3\2\2\2WX\7k\2\2XY\7p\2\2YZ"+
+		"\7v\2\2Z[\7g\2\2[\\\7p\2\2\\]\7v\2\2]\4\3\2\2\2^_\7q\2\2_`\7t\2\2`a\7"+
+		"f\2\2ab\7g\2\2bc\7t\2\2cd\7g\2\2de\7f\2\2e\6\3\2\2\2fg\7h\2\2gh\7n\2\2"+
+		"hi\7q\2\2ij\7y\2\2j\b\3\2\2\2kl\7v\2\2lm\7g\2\2mn\7t\2\2no\7o\2\2o\n\3"+
+		"\2\2\2pq\7k\2\2qr\7f\2\2r\f\3\2\2\2st\7c\2\2tu\7n\2\2uv\7k\2\2vw\7c\2"+
+		"\2wx\7u\2\2xy\7g\2\2yz\7u\2\2z\16\3\2\2\2{|\7u\2\2|}\7v\2\2}~\7c\2\2~"+
+		"\177\7t\2\2\177\u0080\7v\2\2\u0080\u0081\7k\2\2\u0081\u0082\7f\2\2\u0082"+
+		"\u0083\7z\2\2\u0083\20\3\2\2\2\u0084\u0085\7g\2\2\u0085\u0086\7p\2\2\u0086"+
+		"\u0087\7f\2\2\u0087\u0088\7k\2\2\u0088\u0089\7f\2\2\u0089\u008a\7z\2\2"+
+		"\u008a\22\3\2\2\2\u008b\u008c\7r\2\2\u008c\u008d\7c\2\2\u008d\u008e\7"+
+		"t\2\2\u008e\u008f\7g\2\2\u008f\u0090\7p\2\2\u0090\u0091\7v\2\2\u0091\24"+
+		"\3\2\2\2\u0092\u0093\7i\2\2\u0093\u0094\7t\2\2\u0094\u0095\7q\2\2\u0095"+
+		"\u0096\7w\2\2\u0096\u0097\7r\2\2\u0097\u0098\7u\2\2\u0098\26\3\2\2\2\u0099"+
+		"\u009a\7c\2\2\u009a\u009b\7p\2\2\u009b\u009c\7e\2\2\u009c\u009d\7g\2\2"+
+		"\u009d\u009e\7u\2\2\u009e\u009f\7v\2\2\u009f\u00a0\7q\2\2\u00a0\u00a1"+
+		"\7t\2\2\u00a1\u00a2\7u\2\2\u00a2\30\3\2\2\2\u00a3\u00a4\7x\2\2\u00a4\u00a5"+
+		"\7c\2\2\u00a5\u00a6\7n\2\2\u00a6\u00a7\7w\2\2\u00a7\u00a8\7g\2\2\u00a8"+
+		"\32\3\2\2\2\u00a9\u00aa\7p\2\2\u00aa\u00ab\7w\2\2\u00ab\u00ac\7n\2\2\u00ac"+
+		"\u00ad\7n\2\2\u00ad\34\3\2\2\2\u00ae\u00af\7?\2\2\u00af\u00bc\7?\2\2\u00b0"+
+		"\u00b1\7#\2\2\u00b1\u00bc\7?\2\2\u00b2\u00b3\7@\2\2\u00b3\u00bc\7?\2\2"+
+		"\u00b4\u00b5\7>\2\2\u00b5\u00bc\7?\2\2\u00b6\u00bc\t\2\2\2\u00b7\u00b8"+
+		"\7B\2\2\u00b8\u00bc\7B\2\2\u00b9\u00ba\7#\2\2\u00ba\u00bc\7B\2\2\u00bb"+
+		"\u00ae\3\2\2\2\u00bb\u00b0\3\2\2\2\u00bb\u00b2\3\2\2\2\u00bb\u00b4\3\2"+
+		"\2\2\u00bb\u00b6\3\2\2\2\u00bb\u00b7\3\2\2\2\u00bb\u00b9\3\2\2\2\u00bc"+
+		"\36\3\2\2\2\u00bd\u00be\7(\2\2\u00be\u00bf\7(\2\2\u00bf \3\2\2\2\u00c0"+
+		"\u00c1\7~\2\2\u00c1\u00c2\7~\2\2\u00c2\"\3\2\2\2\u00c3\u00c4\7~\2\2\u00c4"+
+		"$\3\2\2\2\u00c5\u00c6\7#\2\2\u00c6&\3\2\2\2\u00c7\u00c8\7*\2\2\u00c8("+
+		"\3\2\2\2\u00c9\u00ca\7+\2\2\u00ca*\3\2\2\2\u00cb\u00cc\7}\2\2\u00cc,\3"+
+		"\2\2\2\u00cd\u00ce\7\177\2\2\u00ce.\3\2\2\2\u00cf\u00d0\7)\2\2\u00d0\60"+
+		"\3\2\2\2\u00d1\u00d2\7\u0080\2\2\u00d2\62\3\2\2\2\u00d3\u00d4\7@\2\2\u00d4"+
+		"\u00d5\7@\2\2\u00d5\64\3\2\2\2\u00d6\u00d7\7]\2\2\u00d7\66\3\2\2\2\u00d8"+
+		"\u00d9\7_\2\2\u00d98\3\2\2\2\u00da\u00db\7.\2\2\u00db:\3\2\2\2\u00dc\u00dd"+
+		"\7<\2\2\u00dd<\3\2\2\2\u00de\u00df\7/\2\2\u00df>\3\2\2\2\u00e0\u00e1\7"+
+		"\60\2\2\u00e1@\3\2\2\2\u00e2\u00e3\7a\2\2\u00e3B\3\2\2\2\u00e4\u00e5\7"+
+		"?\2\2\u00e5D\3\2\2\2\u00e6\u00e7\7-\2\2\u00e7F\3\2\2\2\u00e8\u00e9\7A"+
+		"\2\2\u00e9H\3\2\2\2\u00ea\u00eb\7,\2\2\u00ebJ\3\2\2\2\u00ec\u00ed\7v\2"+
+		"\2\u00ed\u00ee\7t\2\2\u00ee\u00ef\7w\2\2\u00ef\u00f6\7g\2\2\u00f0\u00f1"+
+		"\7h\2\2\u00f1\u00f2\7c\2\2\u00f2\u00f3\7n\2\2\u00f3\u00f4\7u\2\2\u00f4"+
+		"\u00f6\7g\2\2\u00f5\u00ec\3\2\2\2\u00f5\u00f0\3\2\2\2\u00f6L\3\2\2\2\u00f7"+
+		"\u0100\7\62\2\2\u00f8\u00fc\t\3\2\2\u00f9\u00fb\t\4\2\2\u00fa\u00f9\3"+
+		"\2\2\2\u00fb\u00fe\3\2\2\2\u00fc\u00fa\3\2\2\2\u00fc\u00fd\3\2\2\2\u00fd"+
+		"\u0100\3\2\2\2\u00fe\u00fc\3\2\2\2\u00ff\u00f7\3\2\2\2\u00ff\u00f8\3\2"+
+		"\2\2\u0100N\3\2\2\2\u0101\u0103\5? \2\u0102\u0104\t\5\2\2\u0103\u0102"+
+		"\3\2\2\2\u0104\u0105\3\2\2\2\u0105\u0103\3\2\2\2\u0105\u0106\3\2\2\2\u0106"+
+		"P\3\2\2\2\u0107\u010a\5A!\2\u0108\u010a\t\6\2\2\u0109\u0107\3\2\2\2\u0109"+
+		"\u0108\3\2\2\2\u010a\u010b\3\2\2\2\u010b\u0109\3\2\2\2\u010b\u010c\3\2"+
+		"\2\2\u010c\u0113\3\2\2\2\u010d\u0112\t\7\2\2\u010e\u0112\5;\36\2\u010f"+
+		"\u0112\5=\37\2\u0110\u0112\5A!\2\u0111\u010d\3\2\2\2\u0111\u010e\3\2\2"+
+		"\2\u0111\u010f\3\2\2\2\u0111\u0110\3\2\2\2\u0112\u0115\3\2\2\2\u0113\u0111"+
+		"\3\2\2\2\u0113\u0114\3\2\2\2\u0114R\3\2\2\2\u0115\u0113\3\2\2\2\u0116"+
+		"\u0118\t\b\2\2\u0117\u0116\3\2\2\2\u0118\u0119\3\2\2\2\u0119\u0117\3\2"+
+		"\2\2\u0119\u011a\3\2\2\2\u011a\u011b\3\2\2\2\u011b\u011c\b*\2\2\u011c"+
+		"T\3\2\2\2\u011d\u011e\13\2\2\2\u011eV\3\2\2\2\r\2\u00bb\u00f5\u00fc\u00ff"+
+		"\u0105\u0109\u010b\u0111\u0113\u0119\3\b\2\2";
 	public static final ATN _ATN =
 		new ATNDeserializer().deserialize(_serializedATN.toCharArray());
 	static {
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslLexer.tokens b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslLexer.tokens
index 8ae22bf..e2c3312 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslLexer.tokens
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslLexer.tokens
@@ -11,69 +11,67 @@
 T__10=11
 T__11=12
 T__12=13
-T__13=14
-PRED_OP=15
-AND=16
-OR=17
-VERT=18
-EXCL=19
-LPAREN=20
-RPAREN=21
-LCURLY=22
-RCURLY=23
-SQUOTE=24
-TILDA=25
-RIGHT=26
-LBR=27
-RBR=28
-COMMA=29
-COLON=30
-MINUS=31
-DOT=32
-UNDERSCORE=33
-EQ=34
-PLUS=35
-QUESTION=36
-STAR=37
-BOOL=38
-INT=39
-EXP=40
-ID=41
-WS=42
-ErrorCharacter=43
+PRED_OP=14
+AND=15
+OR=16
+VERT=17
+EXCL=18
+LPAREN=19
+RPAREN=20
+LCURLY=21
+RCURLY=22
+SQUOTE=23
+TILDA=24
+RIGHT=25
+LBR=26
+RBR=27
+COMMA=28
+COLON=29
+MINUS=30
+DOT=31
+UNDERSCORE=32
+EQ=33
+PLUS=34
+QUESTION=35
+STAR=36
+BOOL=37
+INT=38
+EXP=39
+ID=40
+WS=41
+ErrorCharacter=42
 'intent'=1
-'conv'=2
-'ordered'=3
-'flow'=4
-'term'=5
-'id'=6
-'aliases'=7
-'startidx'=8
-'endidx'=9
-'parent'=10
-'groups'=11
-'ancestors'=12
-'value'=13
-'null'=14
-'&&'=16
-'||'=17
-'|'=18
-'!'=19
-'('=20
-')'=21
-'{'=22
-'}'=23
-'\''=24
-'~'=25
-'>>'=26
-'['=27
-']'=28
-','=29
-':'=30
-'-'=31
-'.'=32
-'_'=33
-'='=34
-'+'=35
-'?'=36
-'*'=37
+'ordered'=2
+'flow'=3
+'term'=4
+'id'=5
+'aliases'=6
+'startidx'=7
+'endidx'=8
+'parent'=9
+'groups'=10
+'ancestors'=11
+'value'=12
+'null'=13
+'&&'=15
+'||'=16
+'|'=17
+'!'=18
+'('=19
+')'=20
+'{'=21
+'}'=22
+'\''=23
+'~'=24
+'>>'=25
+'['=26
+']'=27
+','=28
+':'=29
+'-'=30
+'.'=31
+'_'=32
+'='=33
+'+'=34
+'?'=35
+'*'=36
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslListener.java b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslListener.java
index f600b0d..59ff399 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslListener.java
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslListener.java
@@ -1,4 +1,4 @@
-// Generated from /Users/xxx/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDsl.g4 by ANTLR 4.8
+// Generated from C:/Users/Nikita Ivanov/Documents/GitHub/incubator-nlpcraft/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4\NCIntentDsl.g4 by ANTLR 4.8
 package org.apache.nlpcraft.model.intent.impl.antlr4;
 import org.antlr.v4.runtime.tree.ParseTreeListener;
 
@@ -28,16 +28,6 @@
 	 */
 	void exitIntentId(NCIntentDslParser.IntentIdContext ctx);
 	/**
-	 * Enter a parse tree produced by {@link NCIntentDslParser#convDecl}.
-	 * @param ctx the parse tree
-	 */
-	void enterConvDecl(NCIntentDslParser.ConvDeclContext ctx);
-	/**
-	 * Exit a parse tree produced by {@link NCIntentDslParser#convDecl}.
-	 * @param ctx the parse tree
-	 */
-	void exitConvDecl(NCIntentDslParser.ConvDeclContext ctx);
-	/**
 	 * Enter a parse tree produced by {@link NCIntentDslParser#orderedDecl}.
 	 * @param ctx the parse tree
 	 */
@@ -108,6 +98,16 @@
 	 */
 	void exitTerms(NCIntentDslParser.TermsContext ctx);
 	/**
+	 * Enter a parse tree produced by {@link NCIntentDslParser#termEq}.
+	 * @param ctx the parse tree
+	 */
+	void enterTermEq(NCIntentDslParser.TermEqContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link NCIntentDslParser#termEq}.
+	 * @param ctx the parse tree
+	 */
+	void exitTermEq(NCIntentDslParser.TermEqContext ctx);
+	/**
 	 * Enter a parse tree produced by {@link NCIntentDslParser#term}.
 	 * @param ctx the parse tree
 	 */
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslParser.java b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslParser.java
index 66f90dd..ef12ce8 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslParser.java
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslParser.java
@@ -1,10 +1,13 @@
-// Generated from /Users/xxx/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDsl.g4 by ANTLR 4.8
+// Generated from C:/Users/Nikita Ivanov/Documents/GitHub/incubator-nlpcraft/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4\NCIntentDsl.g4 by ANTLR 4.8
 package org.apache.nlpcraft.model.intent.impl.antlr4;
 import org.antlr.v4.runtime.atn.*;
 import org.antlr.v4.runtime.dfa.DFA;
 import org.antlr.v4.runtime.*;
+import org.antlr.v4.runtime.misc.*;
 import org.antlr.v4.runtime.tree.*;
 import java.util.List;
+import java.util.Iterator;
+import java.util.ArrayList;
 
 @SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"})
 public class NCIntentDslParser extends Parser {
@@ -15,22 +18,22 @@
 		new PredictionContextCache();
 	public static final int
 		T__0=1, T__1=2, T__2=3, T__3=4, T__4=5, T__5=6, T__6=7, T__7=8, T__8=9, 
-		T__9=10, T__10=11, T__11=12, T__12=13, T__13=14, PRED_OP=15, AND=16, OR=17, 
-		VERT=18, EXCL=19, LPAREN=20, RPAREN=21, LCURLY=22, RCURLY=23, SQUOTE=24, 
-		TILDA=25, RIGHT=26, LBR=27, RBR=28, COMMA=29, COLON=30, MINUS=31, DOT=32, 
-		UNDERSCORE=33, EQ=34, PLUS=35, QUESTION=36, STAR=37, BOOL=38, INT=39, 
-		EXP=40, ID=41, WS=42, ErrorCharacter=43;
+		T__9=10, T__10=11, T__11=12, T__12=13, PRED_OP=14, AND=15, OR=16, VERT=17, 
+		EXCL=18, LPAREN=19, RPAREN=20, LCURLY=21, RCURLY=22, SQUOTE=23, TILDA=24, 
+		RIGHT=25, LBR=26, RBR=27, COMMA=28, COLON=29, MINUS=30, DOT=31, UNDERSCORE=32, 
+		EQ=33, PLUS=34, QUESTION=35, STAR=36, BOOL=37, INT=38, EXP=39, ID=40, 
+		WS=41, ErrorCharacter=42;
 	public static final int
-		RULE_intent = 0, RULE_intentId = 1, RULE_convDecl = 2, RULE_orderedDecl = 3, 
-		RULE_flowDecl = 4, RULE_flow = 5, RULE_flowItem = 6, RULE_flowItemIds = 7, 
-		RULE_idList = 8, RULE_terms = 9, RULE_term = 10, RULE_termId = 11, RULE_item = 12, 
+		RULE_intent = 0, RULE_intentId = 1, RULE_orderedDecl = 2, RULE_flowDecl = 3, 
+		RULE_flow = 4, RULE_flowItem = 5, RULE_flowItemIds = 6, RULE_idList = 7, 
+		RULE_terms = 8, RULE_termEq = 9, RULE_term = 10, RULE_termId = 11, RULE_item = 12, 
 		RULE_predicate = 13, RULE_lval = 14, RULE_lvalQual = 15, RULE_lvalPart = 16, 
 		RULE_rvalSingle = 17, RULE_rval = 18, RULE_rvalList = 19, RULE_meta = 20, 
 		RULE_qstring = 21, RULE_minMax = 22, RULE_minMaxShortcut = 23, RULE_minMaxRange = 24;
 	private static String[] makeRuleNames() {
 		return new String[] {
-			"intent", "intentId", "convDecl", "orderedDecl", "flowDecl", "flow", 
-			"flowItem", "flowItemIds", "idList", "terms", "term", "termId", "item", 
+			"intent", "intentId", "orderedDecl", "flowDecl", "flow", "flowItem", 
+			"flowItemIds", "idList", "terms", "termEq", "term", "termId", "item", 
 			"predicate", "lval", "lvalQual", "lvalPart", "rvalSingle", "rval", "rvalList", 
 			"meta", "qstring", "minMax", "minMaxShortcut", "minMaxRange"
 		};
@@ -39,18 +42,18 @@
 
 	private static String[] makeLiteralNames() {
 		return new String[] {
-			null, "'intent'", "'conv'", "'ordered'", "'flow'", "'term'", "'id'", 
-			"'aliases'", "'startidx'", "'endidx'", "'parent'", "'groups'", "'ancestors'", 
-			"'value'", "'null'", null, "'&&'", "'||'", "'|'", "'!'", "'('", "')'", 
-			"'{'", "'}'", "'''", "'~'", "'>>'", "'['", "']'", "','", "':'", "'-'", 
-			"'.'", "'_'", "'='", "'+'", "'?'", "'*'"
+			null, "'intent'", "'ordered'", "'flow'", "'term'", "'id'", "'aliases'", 
+			"'startidx'", "'endidx'", "'parent'", "'groups'", "'ancestors'", "'value'", 
+			"'null'", null, "'&&'", "'||'", "'|'", "'!'", "'('", "')'", "'{'", "'}'", 
+			"'''", "'~'", "'>>'", "'['", "']'", "','", "':'", "'-'", "'.'", "'_'", 
+			"'='", "'+'", "'?'", "'*'"
 		};
 	}
 	private static final String[] _LITERAL_NAMES = makeLiteralNames();
 	private static String[] makeSymbolicNames() {
 		return new String[] {
 			null, null, null, null, null, null, null, null, null, null, null, null, 
-			null, null, null, "PRED_OP", "AND", "OR", "VERT", "EXCL", "LPAREN", "RPAREN", 
+			null, null, "PRED_OP", "AND", "OR", "VERT", "EXCL", "LPAREN", "RPAREN", 
 			"LCURLY", "RCURLY", "SQUOTE", "TILDA", "RIGHT", "LBR", "RBR", "COMMA", 
 			"COLON", "MINUS", "DOT", "UNDERSCORE", "EQ", "PLUS", "QUESTION", "STAR", 
 			"BOOL", "INT", "EXP", "ID", "WS", "ErrorCharacter"
@@ -115,9 +118,6 @@
 			return getRuleContext(TermsContext.class,0);
 		}
 		public TerminalNode EOF() { return getToken(NCIntentDslParser.EOF, 0); }
-		public ConvDeclContext convDecl() {
-			return getRuleContext(ConvDeclContext.class,0);
-		}
 		public OrderedDeclContext orderedDecl() {
 			return getRuleContext(OrderedDeclContext.class,0);
 		}
@@ -136,11 +136,6 @@
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitIntent(this);
 		}
-		@Override
-		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
-			if ( visitor instanceof NCIntentDslVisitor ) return ((NCIntentDslVisitor<? extends T>)visitor).visitIntent(this);
-			else return visitor.visitChildren(this);
-		}
 	}
 
 	public final IntentContext intent() throws RecognitionException {
@@ -158,7 +153,7 @@
 			if (_la==T__1) {
 				{
 				setState(51);
-				convDecl();
+				orderedDecl();
 				}
 			}
 
@@ -168,23 +163,13 @@
 			if (_la==T__2) {
 				{
 				setState(54);
-				orderedDecl();
-				}
-			}
-
-			setState(58);
-			_errHandler.sync(this);
-			_la = _input.LA(1);
-			if (_la==T__3) {
-				{
-				setState(57);
 				flowDecl();
 				}
 			}
 
-			setState(60);
+			setState(57);
 			terms(0);
-			setState(61);
+			setState(58);
 			match(EOF);
 			}
 		}
@@ -214,11 +199,6 @@
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitIntentId(this);
 		}
-		@Override
-		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
-			if ( visitor instanceof NCIntentDslVisitor ) return ((NCIntentDslVisitor<? extends T>)visitor).visitIntentId(this);
-			else return visitor.visitChildren(this);
-		}
 	}
 
 	public final IntentIdContext intentId() throws RecognitionException {
@@ -227,11 +207,11 @@
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(63);
+			setState(60);
 			match(T__0);
-			setState(64);
+			setState(61);
 			match(EQ);
-			setState(65);
+			setState(62);
 			match(ID);
 			}
 		}
@@ -246,53 +226,6 @@
 		return _localctx;
 	}
 
-	public static class ConvDeclContext extends ParserRuleContext {
-		public TerminalNode EQ() { return getToken(NCIntentDslParser.EQ, 0); }
-		public TerminalNode BOOL() { return getToken(NCIntentDslParser.BOOL, 0); }
-		public ConvDeclContext(ParserRuleContext parent, int invokingState) {
-			super(parent, invokingState);
-		}
-		@Override public int getRuleIndex() { return RULE_convDecl; }
-		@Override
-		public void enterRule(ParseTreeListener listener) {
-			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).enterConvDecl(this);
-		}
-		@Override
-		public void exitRule(ParseTreeListener listener) {
-			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitConvDecl(this);
-		}
-		@Override
-		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
-			if ( visitor instanceof NCIntentDslVisitor ) return ((NCIntentDslVisitor<? extends T>)visitor).visitConvDecl(this);
-			else return visitor.visitChildren(this);
-		}
-	}
-
-	public final ConvDeclContext convDecl() throws RecognitionException {
-		ConvDeclContext _localctx = new ConvDeclContext(_ctx, getState());
-		enterRule(_localctx, 4, RULE_convDecl);
-		try {
-			enterOuterAlt(_localctx, 1);
-			{
-			setState(67);
-			match(T__1);
-			setState(68);
-			match(EQ);
-			setState(69);
-			match(BOOL);
-			}
-		}
-		catch (RecognitionException re) {
-			_localctx.exception = re;
-			_errHandler.reportError(this, re);
-			_errHandler.recover(this, re);
-		}
-		finally {
-			exitRule();
-		}
-		return _localctx;
-	}
-
 	public static class OrderedDeclContext extends ParserRuleContext {
 		public TerminalNode EQ() { return getToken(NCIntentDslParser.EQ, 0); }
 		public TerminalNode BOOL() { return getToken(NCIntentDslParser.BOOL, 0); }
@@ -308,24 +241,19 @@
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitOrderedDecl(this);
 		}
-		@Override
-		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
-			if ( visitor instanceof NCIntentDslVisitor ) return ((NCIntentDslVisitor<? extends T>)visitor).visitOrderedDecl(this);
-			else return visitor.visitChildren(this);
-		}
 	}
 
 	public final OrderedDeclContext orderedDecl() throws RecognitionException {
 		OrderedDeclContext _localctx = new OrderedDeclContext(_ctx, getState());
-		enterRule(_localctx, 6, RULE_orderedDecl);
+		enterRule(_localctx, 4, RULE_orderedDecl);
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(71);
-			match(T__2);
-			setState(72);
+			setState(64);
+			match(T__1);
+			setState(65);
 			match(EQ);
-			setState(73);
+			setState(66);
 			match(BOOL);
 			}
 		}
@@ -361,28 +289,23 @@
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitFlowDecl(this);
 		}
-		@Override
-		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
-			if ( visitor instanceof NCIntentDslVisitor ) return ((NCIntentDslVisitor<? extends T>)visitor).visitFlowDecl(this);
-			else return visitor.visitChildren(this);
-		}
 	}
 
 	public final FlowDeclContext flowDecl() throws RecognitionException {
 		FlowDeclContext _localctx = new FlowDeclContext(_ctx, getState());
-		enterRule(_localctx, 8, RULE_flowDecl);
+		enterRule(_localctx, 6, RULE_flowDecl);
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(75);
-			match(T__3);
-			setState(76);
+			setState(68);
+			match(T__2);
+			setState(69);
 			match(EQ);
-			setState(77);
+			setState(70);
 			match(SQUOTE);
-			setState(78);
+			setState(71);
 			flow(0);
-			setState(79);
+			setState(72);
 			match(SQUOTE);
 			}
 		}
@@ -417,11 +340,6 @@
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitFlow(this);
 		}
-		@Override
-		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
-			if ( visitor instanceof NCIntentDslVisitor ) return ((NCIntentDslVisitor<? extends T>)visitor).visitFlow(this);
-			else return visitor.visitChildren(this);
-		}
 	}
 
 	public final FlowContext flow() throws RecognitionException {
@@ -433,30 +351,30 @@
 		int _parentState = getState();
 		FlowContext _localctx = new FlowContext(_ctx, _parentState);
 		FlowContext _prevctx = _localctx;
-		int _startState = 10;
-		enterRecursionRule(_localctx, 10, RULE_flow, _p);
+		int _startState = 8;
+		enterRecursionRule(_localctx, 8, RULE_flow, _p);
 		try {
 			int _alt;
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(83);
+			setState(76);
 			_errHandler.sync(this);
-			switch ( getInterpreter().adaptivePredict(_input,3,_ctx) ) {
+			switch ( getInterpreter().adaptivePredict(_input,2,_ctx) ) {
 			case 1:
 				{
 				}
 				break;
 			case 2:
 				{
-				setState(82);
+				setState(75);
 				flowItem();
 				}
 				break;
 			}
 			_ctx.stop = _input.LT(-1);
-			setState(90);
+			setState(83);
 			_errHandler.sync(this);
-			_alt = getInterpreter().adaptivePredict(_input,4,_ctx);
+			_alt = getInterpreter().adaptivePredict(_input,3,_ctx);
 			while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
 				if ( _alt==1 ) {
 					if ( _parseListeners!=null ) triggerExitRuleEvent();
@@ -465,18 +383,18 @@
 					{
 					_localctx = new FlowContext(_parentctx, _parentState);
 					pushNewRecursionContext(_localctx, _startState, RULE_flow);
-					setState(85);
+					setState(78);
 					if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)");
-					setState(86);
+					setState(79);
 					match(RIGHT);
-					setState(87);
+					setState(80);
 					flowItem();
 					}
 					} 
 				}
-				setState(92);
+				setState(85);
 				_errHandler.sync(this);
-				_alt = getInterpreter().adaptivePredict(_input,4,_ctx);
+				_alt = getInterpreter().adaptivePredict(_input,3,_ctx);
 			}
 			}
 		}
@@ -510,27 +428,22 @@
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitFlowItem(this);
 		}
-		@Override
-		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
-			if ( visitor instanceof NCIntentDslVisitor ) return ((NCIntentDslVisitor<? extends T>)visitor).visitFlowItem(this);
-			else return visitor.visitChildren(this);
-		}
 	}
 
 	public final FlowItemContext flowItem() throws RecognitionException {
 		FlowItemContext _localctx = new FlowItemContext(_ctx, getState());
-		enterRule(_localctx, 12, RULE_flowItem);
+		enterRule(_localctx, 10, RULE_flowItem);
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(93);
+			setState(86);
 			flowItemIds();
-			setState(95);
+			setState(88);
 			_errHandler.sync(this);
-			switch ( getInterpreter().adaptivePredict(_input,5,_ctx) ) {
+			switch ( getInterpreter().adaptivePredict(_input,4,_ctx) ) {
 			case 1:
 				{
-				setState(94);
+				setState(87);
 				minMax();
 				}
 				break;
@@ -567,35 +480,30 @@
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitFlowItemIds(this);
 		}
-		@Override
-		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
-			if ( visitor instanceof NCIntentDslVisitor ) return ((NCIntentDslVisitor<? extends T>)visitor).visitFlowItemIds(this);
-			else return visitor.visitChildren(this);
-		}
 	}
 
 	public final FlowItemIdsContext flowItemIds() throws RecognitionException {
 		FlowItemIdsContext _localctx = new FlowItemIdsContext(_ctx, getState());
-		enterRule(_localctx, 14, RULE_flowItemIds);
+		enterRule(_localctx, 12, RULE_flowItemIds);
 		try {
-			setState(102);
+			setState(95);
 			_errHandler.sync(this);
 			switch (_input.LA(1)) {
 			case ID:
 				enterOuterAlt(_localctx, 1);
 				{
-				setState(97);
+				setState(90);
 				match(ID);
 				}
 				break;
 			case LPAREN:
 				enterOuterAlt(_localctx, 2);
 				{
-				setState(98);
+				setState(91);
 				match(LPAREN);
-				setState(99);
+				setState(92);
 				idList(0);
-				setState(100);
+				setState(93);
 				match(RPAREN);
 				}
 				break;
@@ -632,11 +540,6 @@
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitIdList(this);
 		}
-		@Override
-		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
-			if ( visitor instanceof NCIntentDslVisitor ) return ((NCIntentDslVisitor<? extends T>)visitor).visitIdList(this);
-			else return visitor.visitChildren(this);
-		}
 	}
 
 	public final IdListContext idList() throws RecognitionException {
@@ -648,20 +551,20 @@
 		int _parentState = getState();
 		IdListContext _localctx = new IdListContext(_ctx, _parentState);
 		IdListContext _prevctx = _localctx;
-		int _startState = 16;
-		enterRecursionRule(_localctx, 16, RULE_idList, _p);
+		int _startState = 14;
+		enterRecursionRule(_localctx, 14, RULE_idList, _p);
 		try {
 			int _alt;
 			enterOuterAlt(_localctx, 1);
 			{
 			{
-			setState(105);
+			setState(98);
 			match(ID);
 			}
 			_ctx.stop = _input.LT(-1);
-			setState(112);
+			setState(105);
 			_errHandler.sync(this);
-			_alt = getInterpreter().adaptivePredict(_input,7,_ctx);
+			_alt = getInterpreter().adaptivePredict(_input,6,_ctx);
 			while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
 				if ( _alt==1 ) {
 					if ( _parseListeners!=null ) triggerExitRuleEvent();
@@ -670,18 +573,18 @@
 					{
 					_localctx = new IdListContext(_parentctx, _parentState);
 					pushNewRecursionContext(_localctx, _startState, RULE_idList);
-					setState(107);
+					setState(100);
 					if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)");
-					setState(108);
+					setState(101);
 					match(VERT);
-					setState(109);
+					setState(102);
 					match(ID);
 					}
 					} 
 				}
-				setState(114);
+				setState(107);
 				_errHandler.sync(this);
-				_alt = getInterpreter().adaptivePredict(_input,7,_ctx);
+				_alt = getInterpreter().adaptivePredict(_input,6,_ctx);
 			}
 			}
 		}
@@ -715,11 +618,6 @@
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitTerms(this);
 		}
-		@Override
-		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
-			if ( visitor instanceof NCIntentDslVisitor ) return ((NCIntentDslVisitor<? extends T>)visitor).visitTerms(this);
-			else return visitor.visitChildren(this);
-		}
 	}
 
 	public final TermsContext terms() throws RecognitionException {
@@ -731,20 +629,20 @@
 		int _parentState = getState();
 		TermsContext _localctx = new TermsContext(_ctx, _parentState);
 		TermsContext _prevctx = _localctx;
-		int _startState = 18;
-		enterRecursionRule(_localctx, 18, RULE_terms, _p);
+		int _startState = 16;
+		enterRecursionRule(_localctx, 16, RULE_terms, _p);
 		try {
 			int _alt;
 			enterOuterAlt(_localctx, 1);
 			{
 			{
-			setState(116);
+			setState(109);
 			term();
 			}
 			_ctx.stop = _input.LT(-1);
-			setState(122);
+			setState(115);
 			_errHandler.sync(this);
-			_alt = getInterpreter().adaptivePredict(_input,8,_ctx);
+			_alt = getInterpreter().adaptivePredict(_input,7,_ctx);
 			while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
 				if ( _alt==1 ) {
 					if ( _parseListeners!=null ) triggerExitRuleEvent();
@@ -753,16 +651,16 @@
 					{
 					_localctx = new TermsContext(_parentctx, _parentState);
 					pushNewRecursionContext(_localctx, _startState, RULE_terms);
-					setState(118);
+					setState(111);
 					if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)");
-					setState(119);
+					setState(112);
 					term();
 					}
 					} 
 				}
-				setState(124);
+				setState(117);
 				_errHandler.sync(this);
-				_alt = getInterpreter().adaptivePredict(_input,8,_ctx);
+				_alt = getInterpreter().adaptivePredict(_input,7,_ctx);
 			}
 			}
 		}
@@ -777,8 +675,57 @@
 		return _localctx;
 	}
 
-	public static class TermContext extends ParserRuleContext {
+	public static class TermEqContext extends ParserRuleContext {
 		public TerminalNode EQ() { return getToken(NCIntentDslParser.EQ, 0); }
+		public TerminalNode TILDA() { return getToken(NCIntentDslParser.TILDA, 0); }
+		public TermEqContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_termEq; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).enterTermEq(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitTermEq(this);
+		}
+	}
+
+	public final TermEqContext termEq() throws RecognitionException {
+		TermEqContext _localctx = new TermEqContext(_ctx, getState());
+		enterRule(_localctx, 18, RULE_termEq);
+		int _la;
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(118);
+			_la = _input.LA(1);
+			if ( !(_la==TILDA || _la==EQ) ) {
+			_errHandler.recoverInline(this);
+			}
+			else {
+				if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
+				_errHandler.reportMatch(this);
+				consume();
+			}
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class TermContext extends ParserRuleContext {
+		public TermEqContext termEq() {
+			return getRuleContext(TermEqContext.class,0);
+		}
 		public TerminalNode LCURLY() { return getToken(NCIntentDslParser.LCURLY, 0); }
 		public ItemContext item() {
 			return getRuleContext(ItemContext.class,0);
@@ -802,11 +749,6 @@
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitTerm(this);
 		}
-		@Override
-		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
-			if ( visitor instanceof NCIntentDslVisitor ) return ((NCIntentDslVisitor<? extends T>)visitor).visitTerm(this);
-			else return visitor.visitChildren(this);
-		}
 	}
 
 	public final TermContext term() throws RecognitionException {
@@ -816,32 +758,32 @@
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(125);
-			match(T__4);
-			setState(127);
+			setState(120);
+			match(T__3);
+			setState(122);
 			_errHandler.sync(this);
 			_la = _input.LA(1);
 			if (_la==LPAREN) {
 				{
-				setState(126);
+				setState(121);
 				termId();
 				}
 			}
 
-			setState(129);
-			match(EQ);
-			setState(130);
+			setState(124);
+			termEq();
+			setState(125);
 			match(LCURLY);
-			setState(131);
+			setState(126);
 			item(0);
-			setState(132);
+			setState(127);
 			match(RCURLY);
-			setState(134);
+			setState(129);
 			_errHandler.sync(this);
-			switch ( getInterpreter().adaptivePredict(_input,10,_ctx) ) {
+			switch ( getInterpreter().adaptivePredict(_input,9,_ctx) ) {
 			case 1:
 				{
-				setState(133);
+				setState(128);
 				minMax();
 				}
 				break;
@@ -875,11 +817,6 @@
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitTermId(this);
 		}
-		@Override
-		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
-			if ( visitor instanceof NCIntentDslVisitor ) return ((NCIntentDslVisitor<? extends T>)visitor).visitTermId(this);
-			else return visitor.visitChildren(this);
-		}
 	}
 
 	public final TermIdContext termId() throws RecognitionException {
@@ -888,11 +825,11 @@
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(136);
+			setState(131);
 			match(LPAREN);
-			setState(137);
+			setState(132);
 			match(ID);
-			setState(138);
+			setState(133);
 			match(RPAREN);
 			}
 		}
@@ -934,11 +871,6 @@
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitItem(this);
 		}
-		@Override
-		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
-			if ( visitor instanceof NCIntentDslVisitor ) return ((NCIntentDslVisitor<? extends T>)visitor).visitItem(this);
-			else return visitor.visitChildren(this);
-		}
 	}
 
 	public final ItemContext item() throws RecognitionException {
@@ -957,9 +889,10 @@
 			int _alt;
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(148);
+			setState(143);
 			_errHandler.sync(this);
 			switch (_input.LA(1)) {
+			case T__4:
 			case T__5:
 			case T__6:
 			case T__7:
@@ -967,29 +900,28 @@
 			case T__9:
 			case T__10:
 			case T__11:
-			case T__12:
 			case TILDA:
 			case ID:
 				{
-				setState(141);
+				setState(136);
 				predicate();
 				}
 				break;
 			case LPAREN:
 				{
-				setState(142);
+				setState(137);
 				match(LPAREN);
-				setState(143);
+				setState(138);
 				item(0);
-				setState(144);
+				setState(139);
 				match(RPAREN);
 				}
 				break;
 			case EXCL:
 				{
-				setState(146);
+				setState(141);
 				match(EXCL);
-				setState(147);
+				setState(142);
 				item(1);
 				}
 				break;
@@ -997,9 +929,9 @@
 				throw new NoViableAltException(this);
 			}
 			_ctx.stop = _input.LT(-1);
-			setState(155);
+			setState(150);
 			_errHandler.sync(this);
-			_alt = getInterpreter().adaptivePredict(_input,12,_ctx);
+			_alt = getInterpreter().adaptivePredict(_input,11,_ctx);
 			while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
 				if ( _alt==1 ) {
 					if ( _parseListeners!=null ) triggerExitRuleEvent();
@@ -1008,9 +940,9 @@
 					{
 					_localctx = new ItemContext(_parentctx, _parentState);
 					pushNewRecursionContext(_localctx, _startState, RULE_item);
-					setState(150);
+					setState(145);
 					if (!(precpred(_ctx, 2))) throw new FailedPredicateException(this, "precpred(_ctx, 2)");
-					setState(151);
+					setState(146);
 					_la = _input.LA(1);
 					if ( !(_la==AND || _la==OR) ) {
 					_errHandler.recoverInline(this);
@@ -1020,14 +952,14 @@
 						_errHandler.reportMatch(this);
 						consume();
 					}
-					setState(152);
+					setState(147);
 					item(3);
 					}
 					} 
 				}
-				setState(157);
+				setState(152);
 				_errHandler.sync(this);
-				_alt = getInterpreter().adaptivePredict(_input,12,_ctx);
+				_alt = getInterpreter().adaptivePredict(_input,11,_ctx);
 			}
 			}
 		}
@@ -1065,45 +997,40 @@
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitPredicate(this);
 		}
-		@Override
-		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
-			if ( visitor instanceof NCIntentDslVisitor ) return ((NCIntentDslVisitor<? extends T>)visitor).visitPredicate(this);
-			else return visitor.visitChildren(this);
-		}
 	}
 
 	public final PredicateContext predicate() throws RecognitionException {
 		PredicateContext _localctx = new PredicateContext(_ctx, getState());
 		enterRule(_localctx, 26, RULE_predicate);
 		try {
-			setState(169);
+			setState(164);
 			_errHandler.sync(this);
-			switch ( getInterpreter().adaptivePredict(_input,13,_ctx) ) {
+			switch ( getInterpreter().adaptivePredict(_input,12,_ctx) ) {
 			case 1:
 				enterOuterAlt(_localctx, 1);
 				{
-				setState(158);
+				setState(153);
 				lval();
-				setState(159);
+				setState(154);
 				match(PRED_OP);
-				setState(160);
+				setState(155);
 				rval();
 				}
 				break;
 			case 2:
 				enterOuterAlt(_localctx, 2);
 				{
-				setState(162);
+				setState(157);
 				match(ID);
-				setState(163);
+				setState(158);
 				match(LPAREN);
-				setState(164);
+				setState(159);
 				lval();
-				setState(165);
+				setState(160);
 				match(RPAREN);
-				setState(166);
+				setState(161);
 				match(PRED_OP);
-				setState(167);
+				setState(162);
 				rval();
 				}
 				break;
@@ -1139,11 +1066,6 @@
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitLval(this);
 		}
-		@Override
-		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
-			if ( visitor instanceof NCIntentDslVisitor ) return ((NCIntentDslVisitor<? extends T>)visitor).visitLval(this);
-			else return visitor.visitChildren(this);
-		}
 	}
 
 	public final LvalContext lval() throws RecognitionException {
@@ -1153,70 +1075,70 @@
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(172);
+			setState(167);
 			_errHandler.sync(this);
 			_la = _input.LA(1);
 			if (_la==ID) {
 				{
-				setState(171);
+				setState(166);
 				lvalQual(0);
 				}
 			}
 
-			setState(183);
+			setState(178);
 			_errHandler.sync(this);
 			switch (_input.LA(1)) {
+			case T__4:
+				{
+				setState(169);
+				match(T__4);
+				}
+				break;
 			case T__5:
 				{
-				setState(174);
+				setState(170);
 				match(T__5);
 				}
 				break;
 			case T__6:
 				{
-				setState(175);
+				setState(171);
 				match(T__6);
 				}
 				break;
 			case T__7:
 				{
-				setState(176);
+				setState(172);
 				match(T__7);
 				}
 				break;
 			case T__8:
 				{
-				setState(177);
+				setState(173);
 				match(T__8);
 				}
 				break;
 			case T__9:
 				{
-				setState(178);
+				setState(174);
 				match(T__9);
 				}
 				break;
 			case T__10:
 				{
-				setState(179);
+				setState(175);
 				match(T__10);
 				}
 				break;
 			case T__11:
 				{
-				setState(180);
+				setState(176);
 				match(T__11);
 				}
 				break;
-			case T__12:
-				{
-				setState(181);
-				match(T__12);
-				}
-				break;
 			case TILDA:
 				{
-				setState(182);
+				setState(177);
 				meta();
 				}
 				break;
@@ -1255,11 +1177,6 @@
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitLvalQual(this);
 		}
-		@Override
-		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
-			if ( visitor instanceof NCIntentDslVisitor ) return ((NCIntentDslVisitor<? extends T>)visitor).visitLvalQual(this);
-			else return visitor.visitChildren(this);
-		}
 	}
 
 	public final LvalQualContext lvalQual() throws RecognitionException {
@@ -1278,13 +1195,13 @@
 			enterOuterAlt(_localctx, 1);
 			{
 			{
-			setState(186);
+			setState(181);
 			lvalPart();
 			}
 			_ctx.stop = _input.LT(-1);
-			setState(192);
+			setState(187);
 			_errHandler.sync(this);
-			_alt = getInterpreter().adaptivePredict(_input,16,_ctx);
+			_alt = getInterpreter().adaptivePredict(_input,15,_ctx);
 			while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
 				if ( _alt==1 ) {
 					if ( _parseListeners!=null ) triggerExitRuleEvent();
@@ -1293,16 +1210,16 @@
 					{
 					_localctx = new LvalQualContext(_parentctx, _parentState);
 					pushNewRecursionContext(_localctx, _startState, RULE_lvalQual);
-					setState(188);
+					setState(183);
 					if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)");
-					setState(189);
+					setState(184);
 					lvalPart();
 					}
 					} 
 				}
-				setState(194);
+				setState(189);
 				_errHandler.sync(this);
-				_alt = getInterpreter().adaptivePredict(_input,16,_ctx);
+				_alt = getInterpreter().adaptivePredict(_input,15,_ctx);
 			}
 			}
 		}
@@ -1332,11 +1249,6 @@
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitLvalPart(this);
 		}
-		@Override
-		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
-			if ( visitor instanceof NCIntentDslVisitor ) return ((NCIntentDslVisitor<? extends T>)visitor).visitLvalPart(this);
-			else return visitor.visitChildren(this);
-		}
 	}
 
 	public final LvalPartContext lvalPart() throws RecognitionException {
@@ -1345,9 +1257,9 @@
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(195);
+			setState(190);
 			match(ID);
-			setState(196);
+			setState(191);
 			match(DOT);
 			}
 		}
@@ -1382,11 +1294,6 @@
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitRvalSingle(this);
 		}
-		@Override
-		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
-			if ( visitor instanceof NCIntentDslVisitor ) return ((NCIntentDslVisitor<? extends T>)visitor).visitRvalSingle(this);
-			else return visitor.visitChildren(this);
-		}
 	}
 
 	public final RvalSingleContext rvalSingle() throws RecognitionException {
@@ -1394,44 +1301,44 @@
 		enterRule(_localctx, 34, RULE_rvalSingle);
 		int _la;
 		try {
-			setState(209);
+			setState(204);
 			_errHandler.sync(this);
 			switch (_input.LA(1)) {
-			case T__13:
+			case T__12:
 				enterOuterAlt(_localctx, 1);
 				{
-				setState(198);
-				match(T__13);
+				setState(193);
+				match(T__12);
 				}
 				break;
 			case MINUS:
 			case INT:
 				enterOuterAlt(_localctx, 2);
 				{
-				setState(200);
+				setState(195);
 				_errHandler.sync(this);
 				_la = _input.LA(1);
 				if (_la==MINUS) {
 					{
-					setState(199);
+					setState(194);
 					match(MINUS);
 					}
 				}
 
-				setState(205);
+				setState(200);
 				_errHandler.sync(this);
-				switch ( getInterpreter().adaptivePredict(_input,18,_ctx) ) {
+				switch ( getInterpreter().adaptivePredict(_input,17,_ctx) ) {
 				case 1:
 					{
-					setState(202);
+					setState(197);
 					match(INT);
 					}
 					break;
 				case 2:
 					{
-					setState(203);
+					setState(198);
 					match(INT);
-					setState(204);
+					setState(199);
 					match(EXP);
 					}
 					break;
@@ -1441,14 +1348,14 @@
 			case BOOL:
 				enterOuterAlt(_localctx, 3);
 				{
-				setState(207);
+				setState(202);
 				match(BOOL);
 				}
 				break;
 			case SQUOTE:
 				enterOuterAlt(_localctx, 4);
 				{
-				setState(208);
+				setState(203);
 				qstring();
 				}
 				break;
@@ -1488,39 +1395,34 @@
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitRval(this);
 		}
-		@Override
-		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
-			if ( visitor instanceof NCIntentDslVisitor ) return ((NCIntentDslVisitor<? extends T>)visitor).visitRval(this);
-			else return visitor.visitChildren(this);
-		}
 	}
 
 	public final RvalContext rval() throws RecognitionException {
 		RvalContext _localctx = new RvalContext(_ctx, getState());
 		enterRule(_localctx, 36, RULE_rval);
 		try {
-			setState(216);
+			setState(211);
 			_errHandler.sync(this);
 			switch (_input.LA(1)) {
-			case T__13:
+			case T__12:
 			case SQUOTE:
 			case MINUS:
 			case BOOL:
 			case INT:
 				enterOuterAlt(_localctx, 1);
 				{
-				setState(211);
+				setState(206);
 				rvalSingle();
 				}
 				break;
 			case LPAREN:
 				enterOuterAlt(_localctx, 2);
 				{
-				setState(212);
+				setState(207);
 				match(LPAREN);
-				setState(213);
+				setState(208);
 				rvalList(0);
-				setState(214);
+				setState(209);
 				match(RPAREN);
 				}
 				break;
@@ -1559,11 +1461,6 @@
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitRvalList(this);
 		}
-		@Override
-		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
-			if ( visitor instanceof NCIntentDslVisitor ) return ((NCIntentDslVisitor<? extends T>)visitor).visitRvalList(this);
-			else return visitor.visitChildren(this);
-		}
 	}
 
 	public final RvalListContext rvalList() throws RecognitionException {
@@ -1582,13 +1479,13 @@
 			enterOuterAlt(_localctx, 1);
 			{
 			{
-			setState(219);
+			setState(214);
 			rvalSingle();
 			}
 			_ctx.stop = _input.LT(-1);
-			setState(226);
+			setState(221);
 			_errHandler.sync(this);
-			_alt = getInterpreter().adaptivePredict(_input,21,_ctx);
+			_alt = getInterpreter().adaptivePredict(_input,20,_ctx);
 			while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
 				if ( _alt==1 ) {
 					if ( _parseListeners!=null ) triggerExitRuleEvent();
@@ -1597,18 +1494,18 @@
 					{
 					_localctx = new RvalListContext(_parentctx, _parentState);
 					pushNewRecursionContext(_localctx, _startState, RULE_rvalList);
-					setState(221);
+					setState(216);
 					if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)");
-					setState(222);
+					setState(217);
 					match(COMMA);
-					setState(223);
+					setState(218);
 					rvalSingle();
 					}
 					} 
 				}
-				setState(228);
+				setState(223);
 				_errHandler.sync(this);
-				_alt = getInterpreter().adaptivePredict(_input,21,_ctx);
+				_alt = getInterpreter().adaptivePredict(_input,20,_ctx);
 			}
 			}
 		}
@@ -1644,32 +1541,42 @@
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitMeta(this);
 		}
-		@Override
-		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
-			if ( visitor instanceof NCIntentDslVisitor ) return ((NCIntentDslVisitor<? extends T>)visitor).visitMeta(this);
-			else return visitor.visitChildren(this);
-		}
 	}
 
 	public final MetaContext meta() throws RecognitionException {
 		MetaContext _localctx = new MetaContext(_ctx, getState());
 		enterRule(_localctx, 40, RULE_meta);
 		try {
-			setState(242);
+			setState(237);
 			_errHandler.sync(this);
-			switch ( getInterpreter().adaptivePredict(_input,22,_ctx) ) {
+			switch ( getInterpreter().adaptivePredict(_input,21,_ctx) ) {
 			case 1:
 				enterOuterAlt(_localctx, 1);
 				{
-				setState(229);
+				setState(224);
 				match(TILDA);
-				setState(230);
+				setState(225);
 				match(ID);
 				}
 				break;
 			case 2:
 				enterOuterAlt(_localctx, 2);
 				{
+				setState(226);
+				match(TILDA);
+				setState(227);
+				match(ID);
+				setState(228);
+				match(LBR);
+				setState(229);
+				match(INT);
+				setState(230);
+				match(RBR);
+				}
+				break;
+			case 3:
+				enterOuterAlt(_localctx, 3);
+				{
 				setState(231);
 				match(TILDA);
 				setState(232);
@@ -1677,23 +1584,8 @@
 				setState(233);
 				match(LBR);
 				setState(234);
-				match(INT);
-				setState(235);
-				match(RBR);
-				}
-				break;
-			case 3:
-				enterOuterAlt(_localctx, 3);
-				{
-				setState(236);
-				match(TILDA);
-				setState(237);
-				match(ID);
-				setState(238);
-				match(LBR);
-				setState(239);
 				qstring();
-				setState(240);
+				setState(235);
 				match(RBR);
 				}
 				break;
@@ -1727,11 +1619,6 @@
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitQstring(this);
 		}
-		@Override
-		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
-			if ( visitor instanceof NCIntentDslVisitor ) return ((NCIntentDslVisitor<? extends T>)visitor).visitQstring(this);
-			else return visitor.visitChildren(this);
-		}
 	}
 
 	public final QstringContext qstring() throws RecognitionException {
@@ -1741,15 +1628,15 @@
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(244);
+			setState(239);
 			match(SQUOTE);
-			setState(248);
+			setState(243);
 			_errHandler.sync(this);
 			_la = _input.LA(1);
-			while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << T__1) | (1L << T__2) | (1L << T__3) | (1L << T__4) | (1L << T__5) | (1L << T__6) | (1L << T__7) | (1L << T__8) | (1L << T__9) | (1L << T__10) | (1L << T__11) | (1L << T__12) | (1L << T__13) | (1L << PRED_OP) | (1L << AND) | (1L << OR) | (1L << VERT) | (1L << EXCL) | (1L << LPAREN) | (1L << RPAREN) | (1L << LCURLY) | (1L << RCURLY) | (1L << TILDA) | (1L << RIGHT) | (1L << LBR) | (1L << RBR) | (1L << COMMA) | (1L << COLON) | (1L << MINUS) | (1L << DOT) | (1L << UNDERSCORE) | (1L << EQ) | (1L << PLUS) | (1L << QUESTION) | (1L << STAR) | (1L << BOOL) | (1L << INT) | (1L << EXP) | (1L << ID) | (1L << WS) | (1L << ErrorCharacter))) != 0)) {
+			while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << T__1) | (1L << T__2) | (1L << T__3) | (1L << T__4) | (1L << T__5) | (1L << T__6) | (1L << T__7) | (1L << T__8) | (1L << T__9) | (1L << T__10) | (1L << T__11) | (1L << T__12) | (1L << PRED_OP) | (1L << AND) | (1L << OR) | (1L << VERT) | (1L << EXCL) | (1L << LPAREN) | (1L << RPAREN) | (1L << LCURLY) | (1L << RCURLY) | (1L << TILDA) | (1L << RIGHT) | (1L << LBR) | (1L << RBR) | (1L << COMMA) | (1L << COLON) | (1L << MINUS) | (1L << DOT) | (1L << UNDERSCORE) | (1L << EQ) | (1L << PLUS) | (1L << QUESTION) | (1L << STAR) | (1L << BOOL) | (1L << INT) | (1L << EXP) | (1L << ID) | (1L << WS) | (1L << ErrorCharacter))) != 0)) {
 				{
 				{
-				setState(245);
+				setState(240);
 				_la = _input.LA(1);
 				if ( _la <= 0 || (_la==SQUOTE) ) {
 				_errHandler.recoverInline(this);
@@ -1761,11 +1648,11 @@
 				}
 				}
 				}
-				setState(250);
+				setState(245);
 				_errHandler.sync(this);
 				_la = _input.LA(1);
 			}
-			setState(251);
+			setState(246);
 			match(SQUOTE);
 			}
 		}
@@ -1799,18 +1686,13 @@
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitMinMax(this);
 		}
-		@Override
-		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
-			if ( visitor instanceof NCIntentDslVisitor ) return ((NCIntentDslVisitor<? extends T>)visitor).visitMinMax(this);
-			else return visitor.visitChildren(this);
-		}
 	}
 
 	public final MinMaxContext minMax() throws RecognitionException {
 		MinMaxContext _localctx = new MinMaxContext(_ctx, getState());
 		enterRule(_localctx, 44, RULE_minMax);
 		try {
-			setState(255);
+			setState(250);
 			_errHandler.sync(this);
 			switch (_input.LA(1)) {
 			case PLUS:
@@ -1818,14 +1700,14 @@
 			case STAR:
 				enterOuterAlt(_localctx, 1);
 				{
-				setState(253);
+				setState(248);
 				minMaxShortcut();
 				}
 				break;
 			case LBR:
 				enterOuterAlt(_localctx, 2);
 				{
-				setState(254);
+				setState(249);
 				minMaxRange();
 				}
 				break;
@@ -1860,11 +1742,6 @@
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitMinMaxShortcut(this);
 		}
-		@Override
-		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
-			if ( visitor instanceof NCIntentDslVisitor ) return ((NCIntentDslVisitor<? extends T>)visitor).visitMinMaxShortcut(this);
-			else return visitor.visitChildren(this);
-		}
 	}
 
 	public final MinMaxShortcutContext minMaxShortcut() throws RecognitionException {
@@ -1874,7 +1751,7 @@
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(257);
+			setState(252);
 			_la = _input.LA(1);
 			if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << PLUS) | (1L << QUESTION) | (1L << STAR))) != 0)) ) {
 			_errHandler.recoverInline(this);
@@ -1917,11 +1794,6 @@
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitMinMaxRange(this);
 		}
-		@Override
-		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
-			if ( visitor instanceof NCIntentDslVisitor ) return ((NCIntentDslVisitor<? extends T>)visitor).visitMinMaxRange(this);
-			else return visitor.visitChildren(this);
-		}
 	}
 
 	public final MinMaxRangeContext minMaxRange() throws RecognitionException {
@@ -1930,15 +1802,15 @@
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(259);
+			setState(254);
 			match(LBR);
-			setState(260);
+			setState(255);
 			match(INT);
-			setState(261);
+			setState(256);
 			match(COMMA);
-			setState(262);
+			setState(257);
 			match(INT);
-			setState(263);
+			setState(258);
 			match(RBR);
 			}
 		}
@@ -1955,11 +1827,11 @@
 
 	public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) {
 		switch (ruleIndex) {
-		case 5:
+		case 4:
 			return flow_sempred((FlowContext)_localctx, predIndex);
-		case 8:
+		case 7:
 			return idList_sempred((IdListContext)_localctx, predIndex);
-		case 9:
+		case 8:
 			return terms_sempred((TermsContext)_localctx, predIndex);
 		case 12:
 			return item_sempred((ItemContext)_localctx, predIndex);
@@ -2014,95 +1886,93 @@
 	}
 
 	public static final String _serializedATN =
-		"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3-\u010c\4\2\t\2\4"+
+		"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3,\u0107\4\2\t\2\4"+
 		"\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t"+
 		"\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+
 		"\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+
-		"\4\32\t\32\3\2\3\2\5\2\67\n\2\3\2\5\2:\n\2\3\2\5\2=\n\2\3\2\3\2\3\2\3"+
-		"\3\3\3\3\3\3\3\3\4\3\4\3\4\3\4\3\5\3\5\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\6"+
-		"\3\7\3\7\5\7V\n\7\3\7\3\7\3\7\7\7[\n\7\f\7\16\7^\13\7\3\b\3\b\5\bb\n\b"+
-		"\3\t\3\t\3\t\3\t\3\t\5\ti\n\t\3\n\3\n\3\n\3\n\3\n\3\n\7\nq\n\n\f\n\16"+
-		"\nt\13\n\3\13\3\13\3\13\3\13\3\13\7\13{\n\13\f\13\16\13~\13\13\3\f\3\f"+
-		"\5\f\u0082\n\f\3\f\3\f\3\f\3\f\3\f\5\f\u0089\n\f\3\r\3\r\3\r\3\r\3\16"+
-		"\3\16\3\16\3\16\3\16\3\16\3\16\3\16\5\16\u0097\n\16\3\16\3\16\3\16\7\16"+
-		"\u009c\n\16\f\16\16\16\u009f\13\16\3\17\3\17\3\17\3\17\3\17\3\17\3\17"+
-		"\3\17\3\17\3\17\3\17\5\17\u00ac\n\17\3\20\5\20\u00af\n\20\3\20\3\20\3"+
-		"\20\3\20\3\20\3\20\3\20\3\20\3\20\5\20\u00ba\n\20\3\21\3\21\3\21\3\21"+
-		"\3\21\7\21\u00c1\n\21\f\21\16\21\u00c4\13\21\3\22\3\22\3\22\3\23\3\23"+
-		"\5\23\u00cb\n\23\3\23\3\23\3\23\5\23\u00d0\n\23\3\23\3\23\5\23\u00d4\n"+
-		"\23\3\24\3\24\3\24\3\24\3\24\5\24\u00db\n\24\3\25\3\25\3\25\3\25\3\25"+
-		"\3\25\7\25\u00e3\n\25\f\25\16\25\u00e6\13\25\3\26\3\26\3\26\3\26\3\26"+
-		"\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\5\26\u00f5\n\26\3\27\3\27\7\27"+
-		"\u00f9\n\27\f\27\16\27\u00fc\13\27\3\27\3\27\3\30\3\30\5\30\u0102\n\30"+
-		"\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\32\3\32\2\b\f\22\24\32 (\33\2\4"+
-		"\6\b\n\f\16\20\22\24\26\30\32\34\36 \"$&(*,.\60\62\2\5\3\2\22\23\3\2\32"+
-		"\32\3\2%\'\2\u0116\2\64\3\2\2\2\4A\3\2\2\2\6E\3\2\2\2\bI\3\2\2\2\nM\3"+
-		"\2\2\2\fU\3\2\2\2\16_\3\2\2\2\20h\3\2\2\2\22j\3\2\2\2\24u\3\2\2\2\26\177"+
-		"\3\2\2\2\30\u008a\3\2\2\2\32\u0096\3\2\2\2\34\u00ab\3\2\2\2\36\u00ae\3"+
-		"\2\2\2 \u00bb\3\2\2\2\"\u00c5\3\2\2\2$\u00d3\3\2\2\2&\u00da\3\2\2\2(\u00dc"+
-		"\3\2\2\2*\u00f4\3\2\2\2,\u00f6\3\2\2\2.\u0101\3\2\2\2\60\u0103\3\2\2\2"+
-		"\62\u0105\3\2\2\2\64\66\5\4\3\2\65\67\5\6\4\2\66\65\3\2\2\2\66\67\3\2"+
-		"\2\2\679\3\2\2\28:\5\b\5\298\3\2\2\29:\3\2\2\2:<\3\2\2\2;=\5\n\6\2<;\3"+
-		"\2\2\2<=\3\2\2\2=>\3\2\2\2>?\5\24\13\2?@\7\2\2\3@\3\3\2\2\2AB\7\3\2\2"+
-		"BC\7$\2\2CD\7+\2\2D\5\3\2\2\2EF\7\4\2\2FG\7$\2\2GH\7(\2\2H\7\3\2\2\2I"+
-		"J\7\5\2\2JK\7$\2\2KL\7(\2\2L\t\3\2\2\2MN\7\6\2\2NO\7$\2\2OP\7\32\2\2P"+
-		"Q\5\f\7\2QR\7\32\2\2R\13\3\2\2\2SV\b\7\1\2TV\5\16\b\2US\3\2\2\2UT\3\2"+
-		"\2\2V\\\3\2\2\2WX\f\3\2\2XY\7\34\2\2Y[\5\16\b\2ZW\3\2\2\2[^\3\2\2\2\\"+
-		"Z\3\2\2\2\\]\3\2\2\2]\r\3\2\2\2^\\\3\2\2\2_a\5\20\t\2`b\5.\30\2a`\3\2"+
-		"\2\2ab\3\2\2\2b\17\3\2\2\2ci\7+\2\2de\7\26\2\2ef\5\22\n\2fg\7\27\2\2g"+
-		"i\3\2\2\2hc\3\2\2\2hd\3\2\2\2i\21\3\2\2\2jk\b\n\1\2kl\7+\2\2lr\3\2\2\2"+
-		"mn\f\3\2\2no\7\24\2\2oq\7+\2\2pm\3\2\2\2qt\3\2\2\2rp\3\2\2\2rs\3\2\2\2"+
-		"s\23\3\2\2\2tr\3\2\2\2uv\b\13\1\2vw\5\26\f\2w|\3\2\2\2xy\f\3\2\2y{\5\26"+
-		"\f\2zx\3\2\2\2{~\3\2\2\2|z\3\2\2\2|}\3\2\2\2}\25\3\2\2\2~|\3\2\2\2\177"+
-		"\u0081\7\7\2\2\u0080\u0082\5\30\r\2\u0081\u0080\3\2\2\2\u0081\u0082\3"+
-		"\2\2\2\u0082\u0083\3\2\2\2\u0083\u0084\7$\2\2\u0084\u0085\7\30\2\2\u0085"+
-		"\u0086\5\32\16\2\u0086\u0088\7\31\2\2\u0087\u0089\5.\30\2\u0088\u0087"+
-		"\3\2\2\2\u0088\u0089\3\2\2\2\u0089\27\3\2\2\2\u008a\u008b\7\26\2\2\u008b"+
-		"\u008c\7+\2\2\u008c\u008d\7\27\2\2\u008d\31\3\2\2\2\u008e\u008f\b\16\1"+
-		"\2\u008f\u0097\5\34\17\2\u0090\u0091\7\26\2\2\u0091\u0092\5\32\16\2\u0092"+
-		"\u0093\7\27\2\2\u0093\u0097\3\2\2\2\u0094\u0095\7\25\2\2\u0095\u0097\5"+
-		"\32\16\3\u0096\u008e\3\2\2\2\u0096\u0090\3\2\2\2\u0096\u0094\3\2\2\2\u0097"+
-		"\u009d\3\2\2\2\u0098\u0099\f\4\2\2\u0099\u009a\t\2\2\2\u009a\u009c\5\32"+
-		"\16\5\u009b\u0098\3\2\2\2\u009c\u009f\3\2\2\2\u009d\u009b\3\2\2\2\u009d"+
-		"\u009e\3\2\2\2\u009e\33\3\2\2\2\u009f\u009d\3\2\2\2\u00a0\u00a1\5\36\20"+
-		"\2\u00a1\u00a2\7\21\2\2\u00a2\u00a3\5&\24\2\u00a3\u00ac\3\2\2\2\u00a4"+
-		"\u00a5\7+\2\2\u00a5\u00a6\7\26\2\2\u00a6\u00a7\5\36\20\2\u00a7\u00a8\7"+
-		"\27\2\2\u00a8\u00a9\7\21\2\2\u00a9\u00aa\5&\24\2\u00aa\u00ac\3\2\2\2\u00ab"+
-		"\u00a0\3\2\2\2\u00ab\u00a4\3\2\2\2\u00ac\35\3\2\2\2\u00ad\u00af\5 \21"+
-		"\2\u00ae\u00ad\3\2\2\2\u00ae\u00af\3\2\2\2\u00af\u00b9\3\2\2\2\u00b0\u00ba"+
-		"\7\b\2\2\u00b1\u00ba\7\t\2\2\u00b2\u00ba\7\n\2\2\u00b3\u00ba\7\13\2\2"+
-		"\u00b4\u00ba\7\f\2\2\u00b5\u00ba\7\r\2\2\u00b6\u00ba\7\16\2\2\u00b7\u00ba"+
-		"\7\17\2\2\u00b8\u00ba\5*\26\2\u00b9\u00b0\3\2\2\2\u00b9\u00b1\3\2\2\2"+
-		"\u00b9\u00b2\3\2\2\2\u00b9\u00b3\3\2\2\2\u00b9\u00b4\3\2\2\2\u00b9\u00b5"+
-		"\3\2\2\2\u00b9\u00b6\3\2\2\2\u00b9\u00b7\3\2\2\2\u00b9\u00b8\3\2\2\2\u00ba"+
-		"\37\3\2\2\2\u00bb\u00bc\b\21\1\2\u00bc\u00bd\5\"\22\2\u00bd\u00c2\3\2"+
-		"\2\2\u00be\u00bf\f\3\2\2\u00bf\u00c1\5\"\22\2\u00c0\u00be\3\2\2\2\u00c1"+
-		"\u00c4\3\2\2\2\u00c2\u00c0\3\2\2\2\u00c2\u00c3\3\2\2\2\u00c3!\3\2\2\2"+
-		"\u00c4\u00c2\3\2\2\2\u00c5\u00c6\7+\2\2\u00c6\u00c7\7\"\2\2\u00c7#\3\2"+
-		"\2\2\u00c8\u00d4\7\20\2\2\u00c9\u00cb\7!\2\2\u00ca\u00c9\3\2\2\2\u00ca"+
-		"\u00cb\3\2\2\2\u00cb\u00cf\3\2\2\2\u00cc\u00d0\7)\2\2\u00cd\u00ce\7)\2"+
-		"\2\u00ce\u00d0\7*\2\2\u00cf\u00cc\3\2\2\2\u00cf\u00cd\3\2\2\2\u00d0\u00d4"+
-		"\3\2\2\2\u00d1\u00d4\7(\2\2\u00d2\u00d4\5,\27\2\u00d3\u00c8\3\2\2\2\u00d3"+
-		"\u00ca\3\2\2\2\u00d3\u00d1\3\2\2\2\u00d3\u00d2\3\2\2\2\u00d4%\3\2\2\2"+
-		"\u00d5\u00db\5$\23\2\u00d6\u00d7\7\26\2\2\u00d7\u00d8\5(\25\2\u00d8\u00d9"+
-		"\7\27\2\2\u00d9\u00db\3\2\2\2\u00da\u00d5\3\2\2\2\u00da\u00d6\3\2\2\2"+
-		"\u00db\'\3\2\2\2\u00dc\u00dd\b\25\1\2\u00dd\u00de\5$\23\2\u00de\u00e4"+
-		"\3\2\2\2\u00df\u00e0\f\3\2\2\u00e0\u00e1\7\37\2\2\u00e1\u00e3\5$\23\2"+
-		"\u00e2\u00df\3\2\2\2\u00e3\u00e6\3\2\2\2\u00e4\u00e2\3\2\2\2\u00e4\u00e5"+
-		"\3\2\2\2\u00e5)\3\2\2\2\u00e6\u00e4\3\2\2\2\u00e7\u00e8\7\33\2\2\u00e8"+
-		"\u00f5\7+\2\2\u00e9\u00ea\7\33\2\2\u00ea\u00eb\7+\2\2\u00eb\u00ec\7\35"+
-		"\2\2\u00ec\u00ed\7)\2\2\u00ed\u00f5\7\36\2\2\u00ee\u00ef\7\33\2\2\u00ef"+
-		"\u00f0\7+\2\2\u00f0\u00f1\7\35\2\2\u00f1\u00f2\5,\27\2\u00f2\u00f3\7\36"+
-		"\2\2\u00f3\u00f5\3\2\2\2\u00f4\u00e7\3\2\2\2\u00f4\u00e9\3\2\2\2\u00f4"+
-		"\u00ee\3\2\2\2\u00f5+\3\2\2\2\u00f6\u00fa\7\32\2\2\u00f7\u00f9\n\3\2\2"+
-		"\u00f8\u00f7\3\2\2\2\u00f9\u00fc\3\2\2\2\u00fa\u00f8\3\2\2\2\u00fa\u00fb"+
-		"\3\2\2\2\u00fb\u00fd\3\2\2\2\u00fc\u00fa\3\2\2\2\u00fd\u00fe\7\32\2\2"+
-		"\u00fe-\3\2\2\2\u00ff\u0102\5\60\31\2\u0100\u0102\5\62\32\2\u0101\u00ff"+
-		"\3\2\2\2\u0101\u0100\3\2\2\2\u0102/\3\2\2\2\u0103\u0104\t\4\2\2\u0104"+
-		"\61\3\2\2\2\u0105\u0106\7\35\2\2\u0106\u0107\7)\2\2\u0107\u0108\7\37\2"+
-		"\2\u0108\u0109\7)\2\2\u0109\u010a\7\36\2\2\u010a\63\3\2\2\2\33\669<U\\"+
-		"ahr|\u0081\u0088\u0096\u009d\u00ab\u00ae\u00b9\u00c2\u00ca\u00cf\u00d3"+
-		"\u00da\u00e4\u00f4\u00fa\u0101";
+		"\4\32\t\32\3\2\3\2\5\2\67\n\2\3\2\5\2:\n\2\3\2\3\2\3\2\3\3\3\3\3\3\3\3"+
+		"\3\4\3\4\3\4\3\4\3\5\3\5\3\5\3\5\3\5\3\5\3\6\3\6\5\6O\n\6\3\6\3\6\3\6"+
+		"\7\6T\n\6\f\6\16\6W\13\6\3\7\3\7\5\7[\n\7\3\b\3\b\3\b\3\b\3\b\5\bb\n\b"+
+		"\3\t\3\t\3\t\3\t\3\t\3\t\7\tj\n\t\f\t\16\tm\13\t\3\n\3\n\3\n\3\n\3\n\7"+
+		"\nt\n\n\f\n\16\nw\13\n\3\13\3\13\3\f\3\f\5\f}\n\f\3\f\3\f\3\f\3\f\3\f"+
+		"\5\f\u0084\n\f\3\r\3\r\3\r\3\r\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16"+
+		"\5\16\u0092\n\16\3\16\3\16\3\16\7\16\u0097\n\16\f\16\16\16\u009a\13\16"+
+		"\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\5\17\u00a7\n\17"+
+		"\3\20\5\20\u00aa\n\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\5\20"+
+		"\u00b5\n\20\3\21\3\21\3\21\3\21\3\21\7\21\u00bc\n\21\f\21\16\21\u00bf"+
+		"\13\21\3\22\3\22\3\22\3\23\3\23\5\23\u00c6\n\23\3\23\3\23\3\23\5\23\u00cb"+
+		"\n\23\3\23\3\23\5\23\u00cf\n\23\3\24\3\24\3\24\3\24\3\24\5\24\u00d6\n"+
+		"\24\3\25\3\25\3\25\3\25\3\25\3\25\7\25\u00de\n\25\f\25\16\25\u00e1\13"+
+		"\25\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\5"+
+		"\26\u00f0\n\26\3\27\3\27\7\27\u00f4\n\27\f\27\16\27\u00f7\13\27\3\27\3"+
+		"\27\3\30\3\30\5\30\u00fd\n\30\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\32"+
+		"\3\32\2\b\n\20\22\32 (\33\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \"$&"+
+		"(*,.\60\62\2\6\4\2\32\32##\3\2\21\22\3\2\31\31\3\2$&\2\u0110\2\64\3\2"+
+		"\2\2\4>\3\2\2\2\6B\3\2\2\2\bF\3\2\2\2\nN\3\2\2\2\fX\3\2\2\2\16a\3\2\2"+
+		"\2\20c\3\2\2\2\22n\3\2\2\2\24x\3\2\2\2\26z\3\2\2\2\30\u0085\3\2\2\2\32"+
+		"\u0091\3\2\2\2\34\u00a6\3\2\2\2\36\u00a9\3\2\2\2 \u00b6\3\2\2\2\"\u00c0"+
+		"\3\2\2\2$\u00ce\3\2\2\2&\u00d5\3\2\2\2(\u00d7\3\2\2\2*\u00ef\3\2\2\2,"+
+		"\u00f1\3\2\2\2.\u00fc\3\2\2\2\60\u00fe\3\2\2\2\62\u0100\3\2\2\2\64\66"+
+		"\5\4\3\2\65\67\5\6\4\2\66\65\3\2\2\2\66\67\3\2\2\2\679\3\2\2\28:\5\b\5"+
+		"\298\3\2\2\29:\3\2\2\2:;\3\2\2\2;<\5\22\n\2<=\7\2\2\3=\3\3\2\2\2>?\7\3"+
+		"\2\2?@\7#\2\2@A\7*\2\2A\5\3\2\2\2BC\7\4\2\2CD\7#\2\2DE\7\'\2\2E\7\3\2"+
+		"\2\2FG\7\5\2\2GH\7#\2\2HI\7\31\2\2IJ\5\n\6\2JK\7\31\2\2K\t\3\2\2\2LO\b"+
+		"\6\1\2MO\5\f\7\2NL\3\2\2\2NM\3\2\2\2OU\3\2\2\2PQ\f\3\2\2QR\7\33\2\2RT"+
+		"\5\f\7\2SP\3\2\2\2TW\3\2\2\2US\3\2\2\2UV\3\2\2\2V\13\3\2\2\2WU\3\2\2\2"+
+		"XZ\5\16\b\2Y[\5.\30\2ZY\3\2\2\2Z[\3\2\2\2[\r\3\2\2\2\\b\7*\2\2]^\7\25"+
+		"\2\2^_\5\20\t\2_`\7\26\2\2`b\3\2\2\2a\\\3\2\2\2a]\3\2\2\2b\17\3\2\2\2"+
+		"cd\b\t\1\2de\7*\2\2ek\3\2\2\2fg\f\3\2\2gh\7\23\2\2hj\7*\2\2if\3\2\2\2"+
+		"jm\3\2\2\2ki\3\2\2\2kl\3\2\2\2l\21\3\2\2\2mk\3\2\2\2no\b\n\1\2op\5\26"+
+		"\f\2pu\3\2\2\2qr\f\3\2\2rt\5\26\f\2sq\3\2\2\2tw\3\2\2\2us\3\2\2\2uv\3"+
+		"\2\2\2v\23\3\2\2\2wu\3\2\2\2xy\t\2\2\2y\25\3\2\2\2z|\7\6\2\2{}\5\30\r"+
+		"\2|{\3\2\2\2|}\3\2\2\2}~\3\2\2\2~\177\5\24\13\2\177\u0080\7\27\2\2\u0080"+
+		"\u0081\5\32\16\2\u0081\u0083\7\30\2\2\u0082\u0084\5.\30\2\u0083\u0082"+
+		"\3\2\2\2\u0083\u0084\3\2\2\2\u0084\27\3\2\2\2\u0085\u0086\7\25\2\2\u0086"+
+		"\u0087\7*\2\2\u0087\u0088\7\26\2\2\u0088\31\3\2\2\2\u0089\u008a\b\16\1"+
+		"\2\u008a\u0092\5\34\17\2\u008b\u008c\7\25\2\2\u008c\u008d\5\32\16\2\u008d"+
+		"\u008e\7\26\2\2\u008e\u0092\3\2\2\2\u008f\u0090\7\24\2\2\u0090\u0092\5"+
+		"\32\16\3\u0091\u0089\3\2\2\2\u0091\u008b\3\2\2\2\u0091\u008f\3\2\2\2\u0092"+
+		"\u0098\3\2\2\2\u0093\u0094\f\4\2\2\u0094\u0095\t\3\2\2\u0095\u0097\5\32"+
+		"\16\5\u0096\u0093\3\2\2\2\u0097\u009a\3\2\2\2\u0098\u0096\3\2\2\2\u0098"+
+		"\u0099\3\2\2\2\u0099\33\3\2\2\2\u009a\u0098\3\2\2\2\u009b\u009c\5\36\20"+
+		"\2\u009c\u009d\7\20\2\2\u009d\u009e\5&\24\2\u009e\u00a7\3\2\2\2\u009f"+
+		"\u00a0\7*\2\2\u00a0\u00a1\7\25\2\2\u00a1\u00a2\5\36\20\2\u00a2\u00a3\7"+
+		"\26\2\2\u00a3\u00a4\7\20\2\2\u00a4\u00a5\5&\24\2\u00a5\u00a7\3\2\2\2\u00a6"+
+		"\u009b\3\2\2\2\u00a6\u009f\3\2\2\2\u00a7\35\3\2\2\2\u00a8\u00aa\5 \21"+
+		"\2\u00a9\u00a8\3\2\2\2\u00a9\u00aa\3\2\2\2\u00aa\u00b4\3\2\2\2\u00ab\u00b5"+
+		"\7\7\2\2\u00ac\u00b5\7\b\2\2\u00ad\u00b5\7\t\2\2\u00ae\u00b5\7\n\2\2\u00af"+
+		"\u00b5\7\13\2\2\u00b0\u00b5\7\f\2\2\u00b1\u00b5\7\r\2\2\u00b2\u00b5\7"+
+		"\16\2\2\u00b3\u00b5\5*\26\2\u00b4\u00ab\3\2\2\2\u00b4\u00ac\3\2\2\2\u00b4"+
+		"\u00ad\3\2\2\2\u00b4\u00ae\3\2\2\2\u00b4\u00af\3\2\2\2\u00b4\u00b0\3\2"+
+		"\2\2\u00b4\u00b1\3\2\2\2\u00b4\u00b2\3\2\2\2\u00b4\u00b3\3\2\2\2\u00b5"+
+		"\37\3\2\2\2\u00b6\u00b7\b\21\1\2\u00b7\u00b8\5\"\22\2\u00b8\u00bd\3\2"+
+		"\2\2\u00b9\u00ba\f\3\2\2\u00ba\u00bc\5\"\22\2\u00bb\u00b9\3\2\2\2\u00bc"+
+		"\u00bf\3\2\2\2\u00bd\u00bb\3\2\2\2\u00bd\u00be\3\2\2\2\u00be!\3\2\2\2"+
+		"\u00bf\u00bd\3\2\2\2\u00c0\u00c1\7*\2\2\u00c1\u00c2\7!\2\2\u00c2#\3\2"+
+		"\2\2\u00c3\u00cf\7\17\2\2\u00c4\u00c6\7 \2\2\u00c5\u00c4\3\2\2\2\u00c5"+
+		"\u00c6\3\2\2\2\u00c6\u00ca\3\2\2\2\u00c7\u00cb\7(\2\2\u00c8\u00c9\7(\2"+
+		"\2\u00c9\u00cb\7)\2\2\u00ca\u00c7\3\2\2\2\u00ca\u00c8\3\2\2\2\u00cb\u00cf"+
+		"\3\2\2\2\u00cc\u00cf\7\'\2\2\u00cd\u00cf\5,\27\2\u00ce\u00c3\3\2\2\2\u00ce"+
+		"\u00c5\3\2\2\2\u00ce\u00cc\3\2\2\2\u00ce\u00cd\3\2\2\2\u00cf%\3\2\2\2"+
+		"\u00d0\u00d6\5$\23\2\u00d1\u00d2\7\25\2\2\u00d2\u00d3\5(\25\2\u00d3\u00d4"+
+		"\7\26\2\2\u00d4\u00d6\3\2\2\2\u00d5\u00d0\3\2\2\2\u00d5\u00d1\3\2\2\2"+
+		"\u00d6\'\3\2\2\2\u00d7\u00d8\b\25\1\2\u00d8\u00d9\5$\23\2\u00d9\u00df"+
+		"\3\2\2\2\u00da\u00db\f\3\2\2\u00db\u00dc\7\36\2\2\u00dc\u00de\5$\23\2"+
+		"\u00dd\u00da\3\2\2\2\u00de\u00e1\3\2\2\2\u00df\u00dd\3\2\2\2\u00df\u00e0"+
+		"\3\2\2\2\u00e0)\3\2\2\2\u00e1\u00df\3\2\2\2\u00e2\u00e3\7\32\2\2\u00e3"+
+		"\u00f0\7*\2\2\u00e4\u00e5\7\32\2\2\u00e5\u00e6\7*\2\2\u00e6\u00e7\7\34"+
+		"\2\2\u00e7\u00e8\7(\2\2\u00e8\u00f0\7\35\2\2\u00e9\u00ea\7\32\2\2\u00ea"+
+		"\u00eb\7*\2\2\u00eb\u00ec\7\34\2\2\u00ec\u00ed\5,\27\2\u00ed\u00ee\7\35"+
+		"\2\2\u00ee\u00f0\3\2\2\2\u00ef\u00e2\3\2\2\2\u00ef\u00e4\3\2\2\2\u00ef"+
+		"\u00e9\3\2\2\2\u00f0+\3\2\2\2\u00f1\u00f5\7\31\2\2\u00f2\u00f4\n\4\2\2"+
+		"\u00f3\u00f2\3\2\2\2\u00f4\u00f7\3\2\2\2\u00f5\u00f3\3\2\2\2\u00f5\u00f6"+
+		"\3\2\2\2\u00f6\u00f8\3\2\2\2\u00f7\u00f5\3\2\2\2\u00f8\u00f9\7\31\2\2"+
+		"\u00f9-\3\2\2\2\u00fa\u00fd\5\60\31\2\u00fb\u00fd\5\62\32\2\u00fc\u00fa"+
+		"\3\2\2\2\u00fc\u00fb\3\2\2\2\u00fd/\3\2\2\2\u00fe\u00ff\t\5\2\2\u00ff"+
+		"\61\3\2\2\2\u0100\u0101\7\34\2\2\u0101\u0102\7(\2\2\u0102\u0103\7\36\2"+
+		"\2\u0103\u0104\7(\2\2\u0104\u0105\7\35\2\2\u0105\63\3\2\2\2\32\669NUZ"+
+		"aku|\u0083\u0091\u0098\u00a6\u00a9\u00b4\u00bd\u00c5\u00ca\u00ce\u00d5"+
+		"\u00df\u00ef\u00f5\u00fc";
 	public static final ATN _ATN =
 		new ATNDeserializer().deserialize(_serializedATN.toCharArray());
 	static {
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslVisitor.java b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslVisitor.java
deleted file mode 100644
index b9b45c6..0000000
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslVisitor.java
+++ /dev/null
@@ -1,163 +0,0 @@
-// Generated from /Users/xxx/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDsl.g4 by ANTLR 4.8
-package org.apache.nlpcraft.model.intent.impl.antlr4;
-import org.antlr.v4.runtime.tree.ParseTreeVisitor;
-
-/**
- * This interface defines a complete generic visitor for a parse tree produced
- * by {@link NCIntentDslParser}.
- *
- * @param <T> The return type of the visit operation. Use {@link Void} for
- * operations with no return type.
- */
-public interface NCIntentDslVisitor<T> extends ParseTreeVisitor<T> {
-	/**
-	 * Visit a parse tree produced by {@link NCIntentDslParser#intent}.
-	 * @param ctx the parse tree
-	 * @return the visitor result
-	 */
-	T visitIntent(NCIntentDslParser.IntentContext ctx);
-	/**
-	 * Visit a parse tree produced by {@link NCIntentDslParser#intentId}.
-	 * @param ctx the parse tree
-	 * @return the visitor result
-	 */
-	T visitIntentId(NCIntentDslParser.IntentIdContext ctx);
-	/**
-	 * Visit a parse tree produced by {@link NCIntentDslParser#convDecl}.
-	 * @param ctx the parse tree
-	 * @return the visitor result
-	 */
-	T visitConvDecl(NCIntentDslParser.ConvDeclContext ctx);
-	/**
-	 * Visit a parse tree produced by {@link NCIntentDslParser#orderedDecl}.
-	 * @param ctx the parse tree
-	 * @return the visitor result
-	 */
-	T visitOrderedDecl(NCIntentDslParser.OrderedDeclContext ctx);
-	/**
-	 * Visit a parse tree produced by {@link NCIntentDslParser#flowDecl}.
-	 * @param ctx the parse tree
-	 * @return the visitor result
-	 */
-	T visitFlowDecl(NCIntentDslParser.FlowDeclContext ctx);
-	/**
-	 * Visit a parse tree produced by {@link NCIntentDslParser#flow}.
-	 * @param ctx the parse tree
-	 * @return the visitor result
-	 */
-	T visitFlow(NCIntentDslParser.FlowContext ctx);
-	/**
-	 * Visit a parse tree produced by {@link NCIntentDslParser#flowItem}.
-	 * @param ctx the parse tree
-	 * @return the visitor result
-	 */
-	T visitFlowItem(NCIntentDslParser.FlowItemContext ctx);
-	/**
-	 * Visit a parse tree produced by {@link NCIntentDslParser#flowItemIds}.
-	 * @param ctx the parse tree
-	 * @return the visitor result
-	 */
-	T visitFlowItemIds(NCIntentDslParser.FlowItemIdsContext ctx);
-	/**
-	 * Visit a parse tree produced by {@link NCIntentDslParser#idList}.
-	 * @param ctx the parse tree
-	 * @return the visitor result
-	 */
-	T visitIdList(NCIntentDslParser.IdListContext ctx);
-	/**
-	 * Visit a parse tree produced by {@link NCIntentDslParser#terms}.
-	 * @param ctx the parse tree
-	 * @return the visitor result
-	 */
-	T visitTerms(NCIntentDslParser.TermsContext ctx);
-	/**
-	 * Visit a parse tree produced by {@link NCIntentDslParser#term}.
-	 * @param ctx the parse tree
-	 * @return the visitor result
-	 */
-	T visitTerm(NCIntentDslParser.TermContext ctx);
-	/**
-	 * Visit a parse tree produced by {@link NCIntentDslParser#termId}.
-	 * @param ctx the parse tree
-	 * @return the visitor result
-	 */
-	T visitTermId(NCIntentDslParser.TermIdContext ctx);
-	/**
-	 * Visit a parse tree produced by {@link NCIntentDslParser#item}.
-	 * @param ctx the parse tree
-	 * @return the visitor result
-	 */
-	T visitItem(NCIntentDslParser.ItemContext ctx);
-	/**
-	 * Visit a parse tree produced by {@link NCIntentDslParser#predicate}.
-	 * @param ctx the parse tree
-	 * @return the visitor result
-	 */
-	T visitPredicate(NCIntentDslParser.PredicateContext ctx);
-	/**
-	 * Visit a parse tree produced by {@link NCIntentDslParser#lval}.
-	 * @param ctx the parse tree
-	 * @return the visitor result
-	 */
-	T visitLval(NCIntentDslParser.LvalContext ctx);
-	/**
-	 * Visit a parse tree produced by {@link NCIntentDslParser#lvalQual}.
-	 * @param ctx the parse tree
-	 * @return the visitor result
-	 */
-	T visitLvalQual(NCIntentDslParser.LvalQualContext ctx);
-	/**
-	 * Visit a parse tree produced by {@link NCIntentDslParser#lvalPart}.
-	 * @param ctx the parse tree
-	 * @return the visitor result
-	 */
-	T visitLvalPart(NCIntentDslParser.LvalPartContext ctx);
-	/**
-	 * Visit a parse tree produced by {@link NCIntentDslParser#rvalSingle}.
-	 * @param ctx the parse tree
-	 * @return the visitor result
-	 */
-	T visitRvalSingle(NCIntentDslParser.RvalSingleContext ctx);
-	/**
-	 * Visit a parse tree produced by {@link NCIntentDslParser#rval}.
-	 * @param ctx the parse tree
-	 * @return the visitor result
-	 */
-	T visitRval(NCIntentDslParser.RvalContext ctx);
-	/**
-	 * Visit a parse tree produced by {@link NCIntentDslParser#rvalList}.
-	 * @param ctx the parse tree
-	 * @return the visitor result
-	 */
-	T visitRvalList(NCIntentDslParser.RvalListContext ctx);
-	/**
-	 * Visit a parse tree produced by {@link NCIntentDslParser#meta}.
-	 * @param ctx the parse tree
-	 * @return the visitor result
-	 */
-	T visitMeta(NCIntentDslParser.MetaContext ctx);
-	/**
-	 * Visit a parse tree produced by {@link NCIntentDslParser#qstring}.
-	 * @param ctx the parse tree
-	 * @return the visitor result
-	 */
-	T visitQstring(NCIntentDslParser.QstringContext ctx);
-	/**
-	 * Visit a parse tree produced by {@link NCIntentDslParser#minMax}.
-	 * @param ctx the parse tree
-	 * @return the visitor result
-	 */
-	T visitMinMax(NCIntentDslParser.MinMaxContext ctx);
-	/**
-	 * Visit a parse tree produced by {@link NCIntentDslParser#minMaxShortcut}.
-	 * @param ctx the parse tree
-	 * @return the visitor result
-	 */
-	T visitMinMaxShortcut(NCIntentDslParser.MinMaxShortcutContext ctx);
-	/**
-	 * Visit a parse tree produced by {@link NCIntentDslParser#minMaxRange}.
-	 * @param ctx the parse tree
-	 * @return the visitor result
-	 */
-	T visitMinMaxRange(NCIntentDslParser.MinMaxRangeContext ctx);
-}
\ No newline at end of file
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/utils/NCDslIntent.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/utils/NCDslIntent.scala
index 945439f..3274edf 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/utils/NCDslIntent.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/utils/NCDslIntent.scala
@@ -20,7 +20,7 @@
 /**
  * Intent from intent DSL.
  */
-case class NCDslIntent(id: String, conv: Boolean, ordered: Boolean, flow: Array[NCDslFlowItem], terms: Array[NCDslTerm]) {
+case class NCDslIntent(id: String, ordered: Boolean, flow: Array[NCDslFlowItem], terms: Array[NCDslTerm]) {
     if (id == null)
         throw new IllegalArgumentException("Intent ID must be provided.")
     if (terms.length == 0)
@@ -35,13 +35,12 @@
      * @return Full intent string representation in text DSL format.
      */
     def toDslString: String = {
-        val convStr = if (conv) "" else " conv=false"
         val orderedStr = if (!ordered) "" else " ordered=true"
         val flowStr = flow.mkString(" >> ") match {
             case s: String if s.nonEmpty ⇒ s" flow=$s"
             case _ ⇒ ""
         }
 
-        s"intent=$id$convStr$orderedStr$flowStr ${terms.mkString(" ")}"
+        s"intent=$id$orderedStr$flowStr ${terms.mkString(" ")}"
     }
 }
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/utils/NCDslTerm.java b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/utils/NCDslTerm.java
index 6ed04a6..4192da8 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/utils/NCDslTerm.java
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/utils/NCDslTerm.java
@@ -28,6 +28,9 @@
     // Term's predicate.
     final private Function<NCToken, Boolean> pred;
 
+    // Conversational or not.
+    final private boolean conv;
+
     // Terms quantifiers.
     final private int min, max;
 
@@ -41,8 +44,9 @@
      * @param pred Token predicate.
      * @param min Minimum quantifier for the predicate (inclusive).
      * @param max Maximum quantifier for the predicate (inclusive).
+     * @param conv Whether or not this term is conversational.
      */
-    public NCDslTerm(String id, Function<NCToken, Boolean> pred, int min, int max) {
+    public NCDslTerm(String id, Function<NCToken, Boolean> pred, int min, int max, boolean conv) {
         if (pred == null)
             throw new IllegalArgumentException("Intent DSL term predicate cannot be null.");
         if (min < 0 || min > max)
@@ -56,6 +60,7 @@
         this.pred = pred;
         this.min = min;
         this.max = max;
+        this.conv = conv;
     }
 
     /**
@@ -94,6 +99,13 @@
         return max;
     }
 
+    /**
+     * Whether or not this term support conversational context.
+     *
+     * @return {@code true} if this term supports conversational context, {@code false} otherwise.
+     */
+    public boolean isConversational() { return conv; }
+
     @Override
     public String toString() {
         String minMax;
@@ -109,9 +121,11 @@
         else
             minMax = String.format("[%d,%d]", min, max);
 
+        String eq = conv ? "~" : "=";
+
         if (id == null)
-            return String.format("term={%s}%s", pred, minMax);
+            return String.format("term%s{%s}%s", eq, pred, minMax);
         else
-            return String.format("term(%s)={%s}%s", id, pred, minMax);
+            return String.format("term(%s)%s{%s}%s", id, eq, pred, minMax);
     }
 }
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/tools/cmdline/NCCli.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/tools/cmdline/NCCli.scala
index dd56754..7b21809 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/tools/cmdline/NCCli.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/tools/cmdline/NCCli.scala
@@ -58,6 +58,7 @@
 import scala.collection.JavaConverters._
 import scala.compat.Platform.currentTime
 import scala.util.Try
+import scala.util.control.Breaks.{break, breakable}
 import scala.util.control.Exception.ignoring
 
 /**
@@ -1413,18 +1414,28 @@
             case None ⇒ 20 // Default.
         }
 
+        if (lines <= 0)
+            throw InvalidParameter(cmd, "lines")
+
         loadServerBeacon() match {
             case Some(beacon) ⇒
                 try
                     managed(new ReversedLinesFileReader(new File(beacon.logPath), StandardCharsets.UTF_8)) acquireAndGet { in ⇒
                         var tail = List.empty[String]
 
-                        for (_ ← 0 to lines)
-                            tail ::= in.readLine()
+                        breakable {
+                            for (_ ← 0 until lines)
+                                in.readLine() match {
+                                    case null ⇒ break
+                                    case line ⇒ tail ::= line
+                                }
+                        }
 
-                        logln(bb(w(s"+----< ${K}Last $lines server log lines $W>---")))
+                        val cnt = tail.size
+
+                        logln(bb(w(s"+----< ${K}Last $cnt server log lines $W>---")))
                         tail.foreach(line ⇒ logln(s"${bb(w("| "))}  $line"))
-                        logln(bb(w(s"+----< ${K}Last $lines server log lines $W>---")))
+                        logln(bb(w(s"+----< ${K}Last $cnt server log lines $W>---")))
                     }
                 catch {
                     case e: Exception ⇒ error(s"Failed to read log file: ${e.getLocalizedMessage}")
@@ -1903,7 +1914,9 @@
      * @param repl Whether or not executing from REPL.
      */
     private def cmdNano(cmd: Command, args: Seq[Argument], repl: Boolean): Unit = {
-        if (args.size > 1)
+        if (args.isEmpty)
+            throw NotEnoughArguments(cmd)
+        else if (args.size > 1)
             throw TooManyArguments(cmd)
 
         Commands.nano(term,
@@ -1955,7 +1968,7 @@
     private def cmdLess(cmd: Command, args: Seq[Argument], repl: Boolean): Unit = {
         if (args.isEmpty)
             throw NotEnoughArguments(cmd)
-        else if  (args.size > 1)
+        else if (args.size > 1)
             throw TooManyArguments(cmd)
 
         Commands.less(term,
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/NCModelSynonymDslCompiler.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/NCModelSynonymDslCompiler.scala
index 18328d7..532ad76 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/NCModelSynonymDslCompiler.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/NCModelSynonymDslCompiler.scala
@@ -20,11 +20,11 @@
 import com.typesafe.scalalogging.LazyLogging
 import org.antlr.v4.runtime._
 import org.antlr.v4.runtime.tree._
-
 import org.apache.nlpcraft.common._
 import org.apache.nlpcraft.model.NCToken
 import org.apache.nlpcraft.model.intent.utils.NCDslTokenPredicate
-import org.apache.nlpcraft.probe.mgrs.model.antlr4._
+import org.apache.nlpcraft.probe.mgrs.model.antlr4.{NCSynonymDslBaseListener, NCSynonymDslLexer, NCSynonymDslParser}
+//import org.apache.nlpcraft.probe.mgrs.model.antlr4._
 
 import scala.collection.JavaConverters._
 import scala.collection.mutable
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4/NCSynonymDslBaseListener.java b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4/NCSynonymDslBaseListener.java
index d655d5c..5e399d9 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4/NCSynonymDslBaseListener.java
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4/NCSynonymDslBaseListener.java
@@ -1,4 +1,4 @@
-// Generated from /Users/xxx/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4/NCSynonymDsl.g4 by ANTLR 4.8
+// Generated from C:/Users/Nikita Ivanov/Documents/GitHub/incubator-nlpcraft/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4\NCSynonymDsl.g4 by ANTLR 4.8
 package org.apache.nlpcraft.probe.mgrs.model.antlr4;
 
 import org.antlr.v4.runtime.ParserRuleContext;
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4/NCSynonymDslBaseVisitor.java b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4/NCSynonymDslBaseVisitor.java
deleted file mode 100644
index ed8033c..0000000
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4/NCSynonymDslBaseVisitor.java
+++ /dev/null
@@ -1,98 +0,0 @@
-// Generated from /Users/xxx/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4/NCSynonymDsl.g4 by ANTLR 4.8
-package org.apache.nlpcraft.probe.mgrs.model.antlr4;
-import org.antlr.v4.runtime.tree.AbstractParseTreeVisitor;
-
-/**
- * This class provides an empty implementation of {@link NCSynonymDslVisitor},
- * which can be extended to create a visitor which only needs to handle a subset
- * of the available methods.
- *
- * @param <T> The return type of the visit operation. Use {@link Void} for
- * operations with no return type.
- */
-public class NCSynonymDslBaseVisitor<T> extends AbstractParseTreeVisitor<T> implements NCSynonymDslVisitor<T> {
-	/**
-	 * {@inheritDoc}
-	 *
-	 * <p>The default implementation returns the result of calling
-	 * {@link #visitChildren} on {@code ctx}.</p>
-	 */
-	@Override public T visitSynonym(NCSynonymDslParser.SynonymContext ctx) { return visitChildren(ctx); }
-	/**
-	 * {@inheritDoc}
-	 *
-	 * <p>The default implementation returns the result of calling
-	 * {@link #visitChildren} on {@code ctx}.</p>
-	 */
-	@Override public T visitAlias(NCSynonymDslParser.AliasContext ctx) { return visitChildren(ctx); }
-	/**
-	 * {@inheritDoc}
-	 *
-	 * <p>The default implementation returns the result of calling
-	 * {@link #visitChildren} on {@code ctx}.</p>
-	 */
-	@Override public T visitItem(NCSynonymDslParser.ItemContext ctx) { return visitChildren(ctx); }
-	/**
-	 * {@inheritDoc}
-	 *
-	 * <p>The default implementation returns the result of calling
-	 * {@link #visitChildren} on {@code ctx}.</p>
-	 */
-	@Override public T visitPredicate(NCSynonymDslParser.PredicateContext ctx) { return visitChildren(ctx); }
-	/**
-	 * {@inheritDoc}
-	 *
-	 * <p>The default implementation returns the result of calling
-	 * {@link #visitChildren} on {@code ctx}.</p>
-	 */
-	@Override public T visitLval(NCSynonymDslParser.LvalContext ctx) { return visitChildren(ctx); }
-	/**
-	 * {@inheritDoc}
-	 *
-	 * <p>The default implementation returns the result of calling
-	 * {@link #visitChildren} on {@code ctx}.</p>
-	 */
-	@Override public T visitLvalQual(NCSynonymDslParser.LvalQualContext ctx) { return visitChildren(ctx); }
-	/**
-	 * {@inheritDoc}
-	 *
-	 * <p>The default implementation returns the result of calling
-	 * {@link #visitChildren} on {@code ctx}.</p>
-	 */
-	@Override public T visitLvalPart(NCSynonymDslParser.LvalPartContext ctx) { return visitChildren(ctx); }
-	/**
-	 * {@inheritDoc}
-	 *
-	 * <p>The default implementation returns the result of calling
-	 * {@link #visitChildren} on {@code ctx}.</p>
-	 */
-	@Override public T visitRvalSingle(NCSynonymDslParser.RvalSingleContext ctx) { return visitChildren(ctx); }
-	/**
-	 * {@inheritDoc}
-	 *
-	 * <p>The default implementation returns the result of calling
-	 * {@link #visitChildren} on {@code ctx}.</p>
-	 */
-	@Override public T visitRval(NCSynonymDslParser.RvalContext ctx) { return visitChildren(ctx); }
-	/**
-	 * {@inheritDoc}
-	 *
-	 * <p>The default implementation returns the result of calling
-	 * {@link #visitChildren} on {@code ctx}.</p>
-	 */
-	@Override public T visitRvalList(NCSynonymDslParser.RvalListContext ctx) { return visitChildren(ctx); }
-	/**
-	 * {@inheritDoc}
-	 *
-	 * <p>The default implementation returns the result of calling
-	 * {@link #visitChildren} on {@code ctx}.</p>
-	 */
-	@Override public T visitMeta(NCSynonymDslParser.MetaContext ctx) { return visitChildren(ctx); }
-	/**
-	 * {@inheritDoc}
-	 *
-	 * <p>The default implementation returns the result of calling
-	 * {@link #visitChildren} on {@code ctx}.</p>
-	 */
-	@Override public T visitQstring(NCSynonymDslParser.QstringContext ctx) { return visitChildren(ctx); }
-}
\ No newline at end of file
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4/NCSynonymDslLexer.java b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4/NCSynonymDslLexer.java
index 106a6b6..97468fc 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4/NCSynonymDslLexer.java
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4/NCSynonymDslLexer.java
@@ -1,10 +1,13 @@
-// Generated from /Users/xxx/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4/NCSynonymDsl.g4 by ANTLR 4.8
+// Generated from C:/Users/Nikita Ivanov/Documents/GitHub/incubator-nlpcraft/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4\NCSynonymDsl.g4 by ANTLR 4.8
 package org.apache.nlpcraft.probe.mgrs.model.antlr4;
 import org.antlr.v4.runtime.Lexer;
 import org.antlr.v4.runtime.CharStream;
+import org.antlr.v4.runtime.Token;
+import org.antlr.v4.runtime.TokenStream;
 import org.antlr.v4.runtime.*;
 import org.antlr.v4.runtime.atn.*;
 import org.antlr.v4.runtime.dfa.DFA;
+import org.antlr.v4.runtime.misc.*;
 
 @SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"})
 public class NCSynonymDslLexer extends Lexer {
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4/NCSynonymDslListener.java b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4/NCSynonymDslListener.java
index cff963c..e33a5cb 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4/NCSynonymDslListener.java
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4/NCSynonymDslListener.java
@@ -1,4 +1,4 @@
-// Generated from /Users/xxx/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4/NCSynonymDsl.g4 by ANTLR 4.8
+// Generated from C:/Users/Nikita Ivanov/Documents/GitHub/incubator-nlpcraft/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4\NCSynonymDsl.g4 by ANTLR 4.8
 package org.apache.nlpcraft.probe.mgrs.model.antlr4;
 import org.antlr.v4.runtime.tree.ParseTreeListener;
 
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4/NCSynonymDslParser.java b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4/NCSynonymDslParser.java
index 2767757..09bf741 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4/NCSynonymDslParser.java
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4/NCSynonymDslParser.java
@@ -1,10 +1,13 @@
-// Generated from /Users/xxx/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4/NCSynonymDsl.g4 by ANTLR 4.8
+// Generated from C:/Users/Nikita Ivanov/Documents/GitHub/incubator-nlpcraft/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4\NCSynonymDsl.g4 by ANTLR 4.8
 package org.apache.nlpcraft.probe.mgrs.model.antlr4;
 import org.antlr.v4.runtime.atn.*;
 import org.antlr.v4.runtime.dfa.DFA;
 import org.antlr.v4.runtime.*;
+import org.antlr.v4.runtime.misc.*;
 import org.antlr.v4.runtime.tree.*;
 import java.util.List;
+import java.util.Iterator;
+import java.util.ArrayList;
 
 @SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"})
 public class NCSynonymDslParser extends Parser {
@@ -119,11 +122,6 @@
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCSynonymDslListener ) ((NCSynonymDslListener)listener).exitSynonym(this);
 		}
-		@Override
-		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
-			if ( visitor instanceof NCSynonymDslVisitor ) return ((NCSynonymDslVisitor<? extends T>)visitor).visitSynonym(this);
-			else return visitor.visitChildren(this);
-		}
 	}
 
 	public final SynonymContext synonym() throws RecognitionException {
@@ -199,11 +197,6 @@
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCSynonymDslListener ) ((NCSynonymDslListener)listener).exitAlias(this);
 		}
-		@Override
-		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
-			if ( visitor instanceof NCSynonymDslVisitor ) return ((NCSynonymDslVisitor<? extends T>)visitor).visitAlias(this);
-			else return visitor.visitChildren(this);
-		}
 	}
 
 	public final AliasContext alias() throws RecognitionException {
@@ -258,11 +251,6 @@
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCSynonymDslListener ) ((NCSynonymDslListener)listener).exitItem(this);
 		}
-		@Override
-		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
-			if ( visitor instanceof NCSynonymDslVisitor ) return ((NCSynonymDslVisitor<? extends T>)visitor).visitItem(this);
-			else return visitor.visitChildren(this);
-		}
 	}
 
 	public final ItemContext item() throws RecognitionException {
@@ -389,11 +377,6 @@
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCSynonymDslListener ) ((NCSynonymDslListener)listener).exitPredicate(this);
 		}
-		@Override
-		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
-			if ( visitor instanceof NCSynonymDslVisitor ) return ((NCSynonymDslVisitor<? extends T>)visitor).visitPredicate(this);
-			else return visitor.visitChildren(this);
-		}
 	}
 
 	public final PredicateContext predicate() throws RecognitionException {
@@ -463,11 +446,6 @@
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCSynonymDslListener ) ((NCSynonymDslListener)listener).exitLval(this);
 		}
-		@Override
-		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
-			if ( visitor instanceof NCSynonymDslVisitor ) return ((NCSynonymDslVisitor<? extends T>)visitor).visitLval(this);
-			else return visitor.visitChildren(this);
-		}
 	}
 
 	public final LvalContext lval() throws RecognitionException {
@@ -579,11 +557,6 @@
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCSynonymDslListener ) ((NCSynonymDslListener)listener).exitLvalQual(this);
 		}
-		@Override
-		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
-			if ( visitor instanceof NCSynonymDslVisitor ) return ((NCSynonymDslVisitor<? extends T>)visitor).visitLvalQual(this);
-			else return visitor.visitChildren(this);
-		}
 	}
 
 	public final LvalQualContext lvalQual() throws RecognitionException {
@@ -656,11 +629,6 @@
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCSynonymDslListener ) ((NCSynonymDslListener)listener).exitLvalPart(this);
 		}
-		@Override
-		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
-			if ( visitor instanceof NCSynonymDslVisitor ) return ((NCSynonymDslVisitor<? extends T>)visitor).visitLvalPart(this);
-			else return visitor.visitChildren(this);
-		}
 	}
 
 	public final LvalPartContext lvalPart() throws RecognitionException {
@@ -706,11 +674,6 @@
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCSynonymDslListener ) ((NCSynonymDslListener)listener).exitRvalSingle(this);
 		}
-		@Override
-		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
-			if ( visitor instanceof NCSynonymDslVisitor ) return ((NCSynonymDslVisitor<? extends T>)visitor).visitRvalSingle(this);
-			else return visitor.visitChildren(this);
-		}
 	}
 
 	public final RvalSingleContext rvalSingle() throws RecognitionException {
@@ -812,11 +775,6 @@
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCSynonymDslListener ) ((NCSynonymDslListener)listener).exitRval(this);
 		}
-		@Override
-		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
-			if ( visitor instanceof NCSynonymDslVisitor ) return ((NCSynonymDslVisitor<? extends T>)visitor).visitRval(this);
-			else return visitor.visitChildren(this);
-		}
 	}
 
 	public final RvalContext rval() throws RecognitionException {
@@ -883,11 +841,6 @@
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCSynonymDslListener ) ((NCSynonymDslListener)listener).exitRvalList(this);
 		}
-		@Override
-		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
-			if ( visitor instanceof NCSynonymDslVisitor ) return ((NCSynonymDslVisitor<? extends T>)visitor).visitRvalList(this);
-			else return visitor.visitChildren(this);
-		}
 	}
 
 	public final RvalListContext rvalList() throws RecognitionException {
@@ -968,11 +921,6 @@
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCSynonymDslListener ) ((NCSynonymDslListener)listener).exitMeta(this);
 		}
-		@Override
-		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
-			if ( visitor instanceof NCSynonymDslVisitor ) return ((NCSynonymDslVisitor<? extends T>)visitor).visitMeta(this);
-			else return visitor.visitChildren(this);
-		}
 	}
 
 	public final MetaContext meta() throws RecognitionException {
@@ -1051,11 +999,6 @@
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCSynonymDslListener ) ((NCSynonymDslListener)listener).exitQstring(this);
 		}
-		@Override
-		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
-			if ( visitor instanceof NCSynonymDslVisitor ) return ((NCSynonymDslVisitor<? extends T>)visitor).visitQstring(this);
-			else return visitor.visitChildren(this);
-		}
 	}
 
 	public final QstringContext qstring() throws RecognitionException {
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4/NCSynonymDslVisitor.java b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4/NCSynonymDslVisitor.java
deleted file mode 100644
index 72bedbf..0000000
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4/NCSynonymDslVisitor.java
+++ /dev/null
@@ -1,85 +0,0 @@
-// Generated from /Users/xxx/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4/NCSynonymDsl.g4 by ANTLR 4.8
-package org.apache.nlpcraft.probe.mgrs.model.antlr4;
-import org.antlr.v4.runtime.tree.ParseTreeVisitor;
-
-/**
- * This interface defines a complete generic visitor for a parse tree produced
- * by {@link NCSynonymDslParser}.
- *
- * @param <T> The return type of the visit operation. Use {@link Void} for
- * operations with no return type.
- */
-public interface NCSynonymDslVisitor<T> extends ParseTreeVisitor<T> {
-	/**
-	 * Visit a parse tree produced by {@link NCSynonymDslParser#synonym}.
-	 * @param ctx the parse tree
-	 * @return the visitor result
-	 */
-	T visitSynonym(NCSynonymDslParser.SynonymContext ctx);
-	/**
-	 * Visit a parse tree produced by {@link NCSynonymDslParser#alias}.
-	 * @param ctx the parse tree
-	 * @return the visitor result
-	 */
-	T visitAlias(NCSynonymDslParser.AliasContext ctx);
-	/**
-	 * Visit a parse tree produced by {@link NCSynonymDslParser#item}.
-	 * @param ctx the parse tree
-	 * @return the visitor result
-	 */
-	T visitItem(NCSynonymDslParser.ItemContext ctx);
-	/**
-	 * Visit a parse tree produced by {@link NCSynonymDslParser#predicate}.
-	 * @param ctx the parse tree
-	 * @return the visitor result
-	 */
-	T visitPredicate(NCSynonymDslParser.PredicateContext ctx);
-	/**
-	 * Visit a parse tree produced by {@link NCSynonymDslParser#lval}.
-	 * @param ctx the parse tree
-	 * @return the visitor result
-	 */
-	T visitLval(NCSynonymDslParser.LvalContext ctx);
-	/**
-	 * Visit a parse tree produced by {@link NCSynonymDslParser#lvalQual}.
-	 * @param ctx the parse tree
-	 * @return the visitor result
-	 */
-	T visitLvalQual(NCSynonymDslParser.LvalQualContext ctx);
-	/**
-	 * Visit a parse tree produced by {@link NCSynonymDslParser#lvalPart}.
-	 * @param ctx the parse tree
-	 * @return the visitor result
-	 */
-	T visitLvalPart(NCSynonymDslParser.LvalPartContext ctx);
-	/**
-	 * Visit a parse tree produced by {@link NCSynonymDslParser#rvalSingle}.
-	 * @param ctx the parse tree
-	 * @return the visitor result
-	 */
-	T visitRvalSingle(NCSynonymDslParser.RvalSingleContext ctx);
-	/**
-	 * Visit a parse tree produced by {@link NCSynonymDslParser#rval}.
-	 * @param ctx the parse tree
-	 * @return the visitor result
-	 */
-	T visitRval(NCSynonymDslParser.RvalContext ctx);
-	/**
-	 * Visit a parse tree produced by {@link NCSynonymDslParser#rvalList}.
-	 * @param ctx the parse tree
-	 * @return the visitor result
-	 */
-	T visitRvalList(NCSynonymDslParser.RvalListContext ctx);
-	/**
-	 * Visit a parse tree produced by {@link NCSynonymDslParser#meta}.
-	 * @param ctx the parse tree
-	 * @return the visitor result
-	 */
-	T visitMeta(NCSynonymDslParser.MetaContext ctx);
-	/**
-	 * Visit a parse tree produced by {@link NCSynonymDslParser#qstring}.
-	 * @param ctx the parse tree
-	 * @return the visitor result
-	 */
-	T visitQstring(NCSynonymDslParser.QstringContext ctx);
-}
\ No newline at end of file
diff --git a/nlpcraft/src/test/scala/org/apache/nlpcraft/model/NCIntentSampleSpec.scala b/nlpcraft/src/test/scala/org/apache/nlpcraft/model/NCIntentSampleSpec.scala
index 5b3804a..e98558c 100644
--- a/nlpcraft/src/test/scala/org/apache/nlpcraft/model/NCIntentSampleSpec.scala
+++ b/nlpcraft/src/test/scala/org/apache/nlpcraft/model/NCIntentSampleSpec.scala
@@ -23,7 +23,7 @@
             override def getId: String = id
         }
 
-    @NCIntent("intent=intent1 term={id=='x1'}")
+    @NCIntent("intent=intent1 term~{id=='x1'}")
     @NCIntentSample(Array("x1", "x1"))
     @NCIntentSample(Array("unknown", "unknown"))
     private def onX1(ctx: NCIntentMatch): NCResult = "OK"
@@ -31,7 +31,7 @@
     @NCIntentSample(Array("x1", "x2", "x3"))
     @NCIntentSample(Array("x1", "x2"))
     @NCIntentSample(Array("x1"))
-    @NCIntent("intent=intent2 term={id=='x2'}")
+    @NCIntent("intent=intent2 term~{id=='x2'}")
     private def onX2(ctx: NCIntentMatch): NCResult = "OK"
 }
 
diff --git a/nlpcraft/src/test/scala/org/apache/nlpcraft/model/conversation/NCConversationTimeoutSpec.scala b/nlpcraft/src/test/scala/org/apache/nlpcraft/model/conversation/NCConversationTimeoutSpec.scala
index fb042c5..6c6869e 100644
--- a/nlpcraft/src/test/scala/org/apache/nlpcraft/model/conversation/NCConversationTimeoutSpec.scala
+++ b/nlpcraft/src/test/scala/org/apache/nlpcraft/model/conversation/NCConversationTimeoutSpec.scala
@@ -54,7 +54,7 @@
             }
         )
 
-    @NCIntent("intent=req conv=true term={id == 'test'}")
+    @NCIntent("intent=req term~{id == 'test'}")
     def onMatch(ctx: NCIntentMatch): NCResult = {
         val conv = ctx.getContext.getConversation
 
diff --git a/nlpcraft/src/test/scala/org/apache/nlpcraft/model/intent/dsl/dsl_test_model.yaml b/nlpcraft/src/test/scala/org/apache/nlpcraft/model/intent/dsl/dsl_test_model.yaml
index d0a0eaa..ae76150 100644
--- a/nlpcraft/src/test/scala/org/apache/nlpcraft/model/intent/dsl/dsl_test_model.yaml
+++ b/nlpcraft/src/test/scala/org/apache/nlpcraft/model/intent/dsl/dsl_test_model.yaml
@@ -52,4 +52,4 @@
       - "{fourth|4th} ^^[alias4](id == 'a3')^^"
 
 intents:
-  - "intent=i1 conv=false term(t1)={id == 'a' && ~txt == 'x'}"
+  - "intent=i1 term(t1)={id == 'a' && ~txt == 'x'}"
diff --git a/nlpcraft/src/test/scala/org/apache/nlpcraft/models/stm/NCStmTestModel.scala b/nlpcraft/src/test/scala/org/apache/nlpcraft/models/stm/NCStmTestModel.scala
index 5325077..a9ebe86 100644
--- a/nlpcraft/src/test/scala/org/apache/nlpcraft/models/stm/NCStmTestModel.scala
+++ b/nlpcraft/src/test/scala/org/apache/nlpcraft/models/stm/NCStmTestModel.scala
@@ -44,15 +44,15 @@
             override def getGroups: util.List[String] = groups.asJava
         }
 
-    @NCIntent("intent=sale term={id=='sale'}")
+    @NCIntent("intent=sale term~{id=='sale'}")
     private def onSale(ctx: NCIntentMatch): NCResult = "sale"
 
-    @NCIntent("intent=buy term={id=='buy'}")
+    @NCIntent("intent=buy term~{id=='buy'}")
     private def onBuy(ctx: NCIntentMatch): NCResult = "buy"
 
-    @NCIntent("intent=sale_best_employee term={id=='sale'} term={id=='best_employee'}")
+    @NCIntent("intent=sale_best_employee term~{id=='sale'} term~{id=='best_employee'}")
     private def onBestEmployeeSale(ctx: NCIntentMatch): NCResult = "sale_best_employee"
 
-    @NCIntent("intent=buy_best_employee term={id=='buy'} term={id=='best_employee'}")
+    @NCIntent("intent=buy_best_employee term~{id=='buy'} term~{id=='best_employee'}")
     private def onBestEmployeeBuy(ctx: NCIntentMatch): NCResult = "buy_best_employee"
 }