This is an automated email from the ASF dual-hosted git repository.

aradzinski pushed a commit to branch NLPCRAFT-206
in repository https://gitbox.apache.org/repos/asf/incubator-nlpcraft.git


The following commit(s) were added to refs/heads/NLPCRAFT-206 by this push:
     new 3f77b6f  WIP.
3f77b6f is described below

commit 3f77b6f584b9799b65614abd27d11994129328d0
Author: Aaron Radzinski <[email protected]>
AuthorDate: Mon Mar 8 16:03:39 2021 -0800

    WIP.
---
 .../scala/org/apache/nlpcraft/common/package.scala |   8 +
 .../intent/impl/NCIntentDslBaselCompiler.scala     | 113 ++-
 .../model/intent/impl/NCIntentDslCompiler.scala    |  12 +-
 .../model/intent/impl/antlr4/NCIntentDsl.g4        |  11 +-
 .../model/intent/impl/antlr4/NCIntentDsl.interp    |   4 +-
 .../impl/antlr4/NCIntentDslBaseListener.java       |  24 +
 .../intent/impl/antlr4/NCIntentDslLexer.interp     |   2 +-
 .../model/intent/impl/antlr4/NCIntentDslLexer.java | 761 +++++++++----------
 .../intent/impl/antlr4/NCIntentDslListener.java    |  20 +
 .../intent/impl/antlr4/NCIntentDslParser.java      | 807 ++++++++++++---------
 .../intent/utils/NCDslSynonym.scala}               |  13 +-
 .../nlpcraft/model/intent/utils/NCDslTerm.scala    |   2 +-
 .../model/intent/utils/NCDslTokenChecker.scala     |   2 +-
 .../probe/mgrs/deploy/NCDeployManager.scala        |   6 +-
 .../mgrs/model/NCModelSynonymDslCompiler.scala     |   9 +-
 .../dsl/compiler/NCIntentDslCompilerSpec.scala     |   6 +-
 .../nlpcraft/model/intent/dsl/compiler/test_ok.nc  |   2 +-
 17 files changed, 1018 insertions(+), 784 deletions(-)

diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/package.scala 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/package.scala
index d7701a7..29b2a92 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/package.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/package.scala
@@ -155,6 +155,14 @@ package object common {
         def fps: Long = 1000 / v
     }
 
+    implicit class OptionEq1[T](private val opt: Option[T]) {
+        def === (x: Option[T]): Boolean = opt.isDefined && x.isDefined && 
opt.get == x.get
+        def === (x: T): Boolean = opt.isDefined && opt.get == x
+    }
+    implicit class OptionEq2[T](private val opt: T) {
+        def === (x: Option[T]): Boolean = x.isDefined && opt == x.get
+    }
+
     /**
      * 
      * @param f
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/NCIntentDslBaselCompiler.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/NCIntentDslBaselCompiler.scala
index 0ab72ba..0011b26 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/NCIntentDslBaselCompiler.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/NCIntentDslBaselCompiler.scala
@@ -67,6 +67,7 @@ trait NCIntentDslBaselCompiler {
     //noinspection ComparingUnrelatedTypes
     def isBoolean(v: Object): Boolean = v.isInstanceOf[Boolean]
     def isString(v: Object): Boolean = v.isInstanceOf[String]
+    def isToken(v: Object): Boolean = v.isInstanceOf[NCToken]
     def asJLong(v: Object): Long = v.asInstanceOf[JLong].longValue()
     def asJDouble(v: Object): Double = v.asInstanceOf[JDouble].doubleValue()
     def asString(v: Object): String = v.asInstanceOf[String]
@@ -438,9 +439,9 @@ trait NCIntentDslBaselCompiler {
             val (v1, v2, f1, f2) = pop2()
 
             if (!isString(v1))
-                rtParamTypeError(fun, v1, "string")
+                throw rtParamTypeError(fun, v1, "string")
             if (!isString(v2))
-                rtParamTypeError(fun, v2, "string")
+                throw rtParamTypeError(fun, v2, "string")
 
             asString(v1).split(asString(v2)).foreach { pushAny(_, f1 || f2) }
         }
@@ -450,9 +451,9 @@ trait NCIntentDslBaselCompiler {
             val (v1, v2, f1, f2) = pop2()
 
             if (!isString(v1))
-                rtParamTypeError(fun, v1, "string")
+                throw rtParamTypeError(fun, v1, "string")
             if (!isString(v2))
-                rtParamTypeError(fun, v2, "string")
+                throw rtParamTypeError(fun, v2, "string")
 
             asString(v1).split(asString(v2)).foreach { s ⇒ pushAny(s.strip, f1 
|| f2) }
         }
@@ -475,7 +476,7 @@ trait NCIntentDslBaselCompiler {
         }
         def doMap(): Unit = {
             if (stack.size % 2 != 0)
-                rtParamNumError(fun)
+                throw rtParamNumError(fun)
 
             val jm = new JHashMap[Object, Object]()
             var f = false
@@ -510,6 +511,18 @@ trait NCIntentDslBaselCompiler {
         def doCompMeta(): Unit = get1Str() match { case (s, _) ⇒ 
pushAny(termCtx.compMeta.get(s).orNull, false) }
         def doIntentMeta(): Unit = get1Str() match { case (s, _) ⇒ 
pushAny(termCtx.intentMeta.get(s).orNull, false) }
         def doFragMeta(): Unit = get1Str() match { case (s, _) ⇒ 
pushAny(termCtx.fragMeta.get(s).orNull, false) }
+        def doPartMeta(): Unit = {
+            ensureStack(2)
+
+            val (v1, v2, f1, f2) = pop2()
+
+            if (!isToken(v1))
+                throw rtParamTypeError(fun, v1, "token")
+            if (!isString(v2))
+                throw rtParamTypeError(fun, v2, "string")
+
+            pushAny(v1.asInstanceOf[NCToken].meta(v2.asInstanceOf[String]), f1 
|| f2)
+        }
 
         /*
          * Math operations.
@@ -517,12 +530,12 @@ trait NCIntentDslBaselCompiler {
         def doAbs(): Unit = get1Any() match {
             case (a: JLong, f) ⇒ pushLong(Math.abs(a), f)
             case (a: JDouble, f) ⇒ pushDouble(Math.abs(a), f)
-            case x ⇒ rtParamTypeError(fun, x, "numeric")
+            case x ⇒ throw rtParamTypeError(fun, x, "numeric")
         }
         def doSquare(): Unit = get1Any() match {
             case (a: JLong, f) ⇒ pushLong(a * a, f)
             case (a: JDouble, f) ⇒ pushDouble(a * a, f)
-            case x ⇒ rtParamTypeError(fun, x, "numeric")
+            case x ⇒ throw rtParamTypeError(fun, x, "numeric")
         }
         def doCeil(): Unit = get1Double() match { case (a: JDouble, f) ⇒ 
pushDouble(Math.ceil(a), f) }
         def doFloor(): Unit = get1Double() match { case (a: JDouble, f) ⇒ 
pushDouble(Math.floor(a), f) }
@@ -555,21 +568,6 @@ trait NCIntentDslBaselCompiler {
         def doAtan2(): Unit = get2Doubles() match { case (a1: JDouble, a2: 
JDouble, f) ⇒ pushDouble(Math.atan2(a1, a2), f) }
 
         /*
-         * User operations.
-         */
-        def doUserId(): Unit = pushLong(termCtx.req.getUser.getId, false)
-
-        /*
-         * Company operations.
-         */
-        def doCompId(): Unit = pushLong(termCtx.req.getCompany.getId, false)
-
-        /*
-         * Request operations.
-         */
-        def doReqId(): Unit = pushAny(termCtx.req.getServerRequestId, false)
-
-        /*
          * Date-time operations.
          */
         def doYear(): Unit = pushLong(LocalDate.now.getYear,false)
@@ -593,9 +591,55 @@ trait NCIntentDslBaselCompiler {
                 pushAny(v3, f1 || f3)
         }
 
+        def token(): NCToken =
+            if (stack.nonEmpty && stack.top.isInstanceOf[NCToken]) 
stack.top.asInstanceOf[NCToken] else tok
+
+        def doPart(): Unit = {
+            ensureStack(2)
+
+            val (v1, v2, f1, f2) = pop2()
+
+            if (!isToken(v1))
+                throw rtParamTypeError(fun, v1, "token")
+            if (!isString(v2))
+                throw rtParamTypeError(fun, v2, "string")
+
+            val t = v1.asInstanceOf[NCToken]
+            val aliasId = v2.asInstanceOf[String]
+
+            val parts = t.findPartTokens(aliasId)
+
+            if (parts.isEmpty)
+                throw newRuntimeError(s"Cannot find part for token (use 
'parts' function instead) [" +
+                    s"id=${t.getId}, " +
+                    s"aliasId=$aliasId" +
+                s"]")
+            else if (parts.size() > 1)
+                throw newRuntimeError(s"Too many parts found for token (use 
'parts' function instead) [" +
+                    s"id=${t.getId}, " +
+                    s"aliasId=$aliasId" +
+                s"]")
+
+            pushAny(parts.get(0), f1 || f2)
+        }
+
+        def doParts(): Unit = {
+            ensureStack(2)
+
+            val (v1, v2, f1, f2) = pop2()
+
+            if (!isToken(v1))
+                throw rtParamTypeError(fun, v1, "token")
+            if (!isString(v2))
+                throw rtParamTypeError(fun, v2, "string")
+
+            
pushAny(v1.asInstanceOf[NCToken].findPartTokens(v2.asInstanceOf[String]), f1 || 
f2)
+        }
+
         fun match {
             // Metadata access.
             case "meta_token" ⇒ doTokenMeta()
+            case "meta_part" ⇒ doPartMeta()
             case "meta_model" ⇒ doModelMeta()
             case "meta_intent" ⇒ doIntentMeta()
             case "meta_req" ⇒ doReqMeta()
@@ -612,24 +656,27 @@ trait NCIntentDslBaselCompiler {
             case "if" ⇒ doIf()
 
             // Token functions.
-            case "id" ⇒ pushAny(tok.getId, true)
-            case "ancestors" ⇒ pushAny(tok.getAncestors, true)
-            case "parent" ⇒ pushAny(tok.getParentId, true)
-            case "groups" ⇒ pushAny(tok.getGroups, true)
-            case "value" ⇒ pushAny(tok.getValue, true)
-            case "aliases" ⇒ pushAny(tok.getAliases, true)
-            case "start_idx" ⇒ pushLong(tok.getStartCharIndex, true)
-            case "end_idx" ⇒ pushLong(tok.getEndCharIndex, true)
+            case "id" ⇒ pushAny(token().getId, true)
+            case "ancestors" ⇒ pushAny(token().getAncestors, true)
+            case "parent" ⇒ pushAny(token().getParentId, true)
+            case "groups" ⇒ pushAny(token().getGroups, true)
+            case "value" ⇒ pushAny(token().getValue, true)
+            case "aliases" ⇒ pushAny(token().getAliases, true)
+            case "start_idx" ⇒ pushLong(token().getStartCharIndex, true)
+            case "end_idx" ⇒ pushLong(token().getEndCharIndex, true)
+            case "this" ⇒ pushAny(tok, true)
+            case "part" ⇒ doPart()
+            case "parts" ⇒ doParts()
 
             // Request data.
-            case "req_id" ⇒ doReqId()
+            case "req_id" ⇒ pushAny(termCtx.req.getServerRequestId, false)
             case "req_normtext" ⇒
             case "req_tstamp" ⇒
             case "req_addr" ⇒
             case "req_agent" ⇒
 
             // User data.
-            case "user_id" ⇒ doUserId()
+            case "user_id" ⇒ pushLong(termCtx.req.getUser.getId, false)
             case "user_fname" ⇒
             case "user_lname" ⇒
             case "user_email" ⇒
@@ -637,7 +684,7 @@ trait NCIntentDslBaselCompiler {
             case "user_signup_tstamp" ⇒
 
             // Company data.
-            case "comp_id" ⇒ doCompId()
+            case "comp_id" ⇒ pushLong(termCtx.req.getCompany.getId, false)
             case "comp_name" ⇒
             case "comp_website" ⇒
             case "comp_country" ⇒
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 53a1eb0..1fdbd57 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
@@ -127,7 +127,7 @@ object NCIntentDslCompiler extends LazyLogging {
         override def exitTermId(ctx: IDP.TermIdContext): Unit = {
             termId = ctx.id().getText
     
-            if (terms.exists(t ⇒ t.id != null && t.id == termId))
+            if (terms.exists(t ⇒ t.id === termId))
                 throw newSyntaxError(s"Duplicate term ID: $termId")(ctx.id())
         }
     
@@ -158,8 +158,8 @@ object NCIntentDslCompiler extends LazyLogging {
                     val meta = if (fragMeta == null) Map.empty[String, Any] 
else fragMeta
 
                     for (fragTerm ← frag.terms)
-                         if (terms.exists(t ⇒ t.id != null && t.id == 
fragTerm.id))
-                            throw newSyntaxError(s"Duplicate term ID 
'${fragTerm.id}' in fragment '$id'.")(ctx.id())
+                         if (terms.exists(t ⇒ t.id === fragTerm.id))
+                            throw newSyntaxError(s"Duplicate term ID 
'${fragTerm.id.get}' in fragment '$id'.")(ctx.id())
                         else
                             terms += fragTerm.cloneWithFragMeta(meta)
 
@@ -276,7 +276,7 @@ object NCIntentDslCompiler extends LazyLogging {
                 
             // Add term.
             terms += NCDslTerm(
-                termId,
+                Option(termId),
                 pred,
                 min,
                 max,
@@ -464,7 +464,7 @@ object NCIntentDslCompiler extends LazyLogging {
       * @return
       */
     @throws[NCE]
-    def compilePath(
+    def compileIntent(
         filePath: Path,
         mdlId: String
     ): Set[NCDslIntent] = antlr4(U.readFile(filePath.toFile).mkString("\n"), 
mdlId, filePath.getFileName.toString)
@@ -479,7 +479,7 @@ object NCIntentDslCompiler extends LazyLogging {
      * @return
      */
     @throws[NCE]
-    def compile(
+    def compileIntent(
         dsl: String,
         mdlId: String,
         srcName: String = "<inline>"
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 1de551b..01c16a3 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
@@ -18,7 +18,9 @@
 grammar NCIntentDsl;
 
 // Parser.
-dsl: dslItems EOF;
+dsl: dslItems EOF; // Intent DSL enty point.
+synonym: alias? LBRACE expr RBRACE EOF; // Synonym DSL entry point.
+alias: LBR id RBR;
 dslItems
     : dslItem
     | dslItems dslItem
@@ -39,7 +41,8 @@ flowDecl: 'flow' ASSIGN (qstring | mtdDecl);
 metaDecl: 'meta' ASSIGN jsonObj;
 jsonObj
     : LBRACE jsonPair (COMMA jsonPair)* RBRACE
-    | LBRACE RBRACE
+    |
+     LBRACE RBRACE
     ;
 jsonPair: qstring COLON jsonVal;
 jsonVal
@@ -116,6 +119,7 @@ id
 // Lexer.
 FUN_NAME
     : 'meta_token'
+    | 'meta_part'
     | 'meta_model'
     | 'meta_intent'
     | 'meta_req'
@@ -127,6 +131,9 @@ FUN_NAME
     | 'json'
     | 'if'
     | 'id'
+    | 'this'
+    | 'part'
+    | 'parts'
     | 'ancestors'
     | 'parent'
     | 'groups'
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 764d593..12a9541 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
@@ -106,6 +106,8 @@ ErrorChar
 
 rule names:
 dsl
+synonym
+alias
 dslItems
 dslItem
 frag
@@ -140,4 +142,4 @@ id
 
 
 atn:
-[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 52, 314, 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, [...]
\ No newline at end of file
+[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 52, 330, 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, [...]
\ No newline at end of file
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 c28c86a..3c6c2cf 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
@@ -28,6 +28,30 @@ public class NCIntentDslBaseListener implements 
NCIntentDslListener {
         *
         * <p>The default implementation does nothing.</p>
         */
+       @Override public void enterSynonym(NCIntentDslParser.SynonymContext 
ctx) { }
+       /**
+        * {@inheritDoc}
+        *
+        * <p>The default implementation does nothing.</p>
+        */
+       @Override public void exitSynonym(NCIntentDslParser.SynonymContext ctx) 
{ }
+       /**
+        * {@inheritDoc}
+        *
+        * <p>The default implementation does nothing.</p>
+        */
+       @Override public void enterAlias(NCIntentDslParser.AliasContext ctx) { }
+       /**
+        * {@inheritDoc}
+        *
+        * <p>The default implementation does nothing.</p>
+        */
+       @Override public void exitAlias(NCIntentDslParser.AliasContext ctx) { }
+       /**
+        * {@inheritDoc}
+        *
+        * <p>The default implementation does nothing.</p>
+        */
        @Override public void enterDslItems(NCIntentDslParser.DslItemsContext 
ctx) { }
        /**
         * {@inheritDoc}
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 715fa06..b81ad08 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
@@ -166,4 +166,4 @@ mode names:
 DEFAULT_MODE
 
 atn:
-[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 52, 1179, 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, [...]
\ No newline at end of file
+[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 52, 1201, 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, [...]
\ 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 5ccf6b5..aeb35e2 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
@@ -124,7 +124,7 @@ public class NCIntentDslLexer extends Lexer {
        public ATN getATN() { return _ATN; }
 
        public static final String _serializedATN =
-               
"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\64\u049b\b\1\4\2"+
+               
"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\64\u04b1\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"+
@@ -180,381 +180,390 @@ public class NCIntentDslLexer extends Lexer {
                
"\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3"+
                
"\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7"+
                
"\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3"+
-               
"\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\5\7\u03d0\n"+
-               
"\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\7\t\u03df\n\t\f"+
-               
"\t\16\t\u03e2\13\t\3\t\3\t\3\n\3\n\3\n\3\n\7\n\u03ea\n\n\f\n\16\n\u03ed"+
-               
"\13\n\3\n\3\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\5\13\u03fa"+
-               
"\n\13\3\f\3\f\3\f\3\f\3\f\3\r\3\r\3\r\3\16\3\16\3\16\3\17\3\17\3\17\3"+
-               
"\20\3\20\3\20\3\21\3\21\3\22\3\22\3\23\3\23\3\23\3\24\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\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+\3+\3,\3,\3-\3-\3-\7-\u044a\n-\f-"+
-               
"\16-\u044d\13-\5-\u044f\n-\3.\3.\6.\u0453\n.\r.\16.\u0454\3/\3/\5/\u0459"+
-               
"\n/\3/\3/\3\60\3\60\3\61\3\61\3\62\3\62\3\62\3\62\6\62\u0465\n\62\r\62"+
-               
"\16\62\u0466\3\62\3\62\3\62\3\62\3\62\3\62\3\62\7\62\u0470\n\62\f\62\16"+
-               
"\62\u0473\13\62\3\63\3\63\3\63\3\63\7\63\u0479\n\63\f\63\16\63\u047c\13"+
-               
"\63\3\63\5\63\u047f\n\63\3\63\5\63\u0482\n\63\3\63\3\63\3\63\3\63\7\63"+
-               
"\u0488\n\63\f\63\16\63\u048b\13\63\3\63\3\63\5\63\u048f\n\63\3\63\3\63"+
-               
"\3\64\6\64\u0494\n\64\r\64\16\64\u0495\3\64\3\64\3\65\3\65\3\u0489\2\66"+
-               
"\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f\27\r\31\16\33\17\35\20"+
-               
"\37\21!\22#\23%\24\'\25)\26+\27-\30/\31\61\32\63\33\65\34\67\359\36;\37"+
-               "= 
?!A\"C#E$G%I&K\'M(O)Q*S+U,W-Y.[/]\60_\2a\2c\61e\62g\63i\64\3\2\16\3"+
-               
"\2))\3\2$$\3\2\63;\4\2\62;aa\3\2\62;\4\2GGgg\4\2--//\17\2\u00a2\u0251"+
-               
"\u025b\u0294\u02b2\u0371\u0402\u0501\u1e04\u1ef5\u1f03\u2001\u200e\u200f"+
-               
"\u2041\u2042\u2072\u2191\u2c02\u2ff1\u3003\ud801\uf902\ufdd1\ufdf2\uffff"+
-               
"\4\2C\\c|\4\2\f\f\17\17\3\3\f\f\5\2\13\f\16\17\"\"\2\u052d\2\3\3\2\2\2"+
-               
"\2\5\3\2\2\2\2\7\3\2\2\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2\2\17\3\2"+
-               
"\2\2\2\21\3\2\2\2\2\23\3\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31\3\2\2\2"+
-               
"\2\33\3\2\2\2\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2\2\2\2#\3\2\2\2\2%\3\2\2"+
-               
"\2\2\'\3\2\2\2\2)\3\2\2\2\2+\3\2\2\2\2-\3\2\2\2\2/\3\2\2\2\2\61\3\2\2"+
-               
"\2\2\63\3\2\2\2\2\65\3\2\2\2\2\67\3\2\2\2\29\3\2\2\2\2;\3\2\2\2\2=\3\2"+
-               
"\2\2\2?\3\2\2\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2\2\2G\3\2\2\2\2I\3\2\2\2"+
-               
"\2K\3\2\2\2\2M\3\2\2\2\2O\3\2\2\2\2Q\3\2\2\2\2S\3\2\2\2\2U\3\2\2\2\2W"+
-               
"\3\2\2\2\2Y\3\2\2\2\2[\3\2\2\2\2]\3\2\2\2\2c\3\2\2\2\2e\3\2\2\2\2g\3\2"+
-               
"\2\2\2i\3\2\2\2\3k\3\2\2\2\5r\3\2\2\2\7z\3\2\2\2\t\177\3\2\2\2\13\u0084"+
-               
"\3\2\2\2\r\u03cf\3\2\2\2\17\u03d1\3\2\2\2\21\u03da\3\2\2\2\23\u03e5\3"+
-               
"\2\2\2\25\u03f9\3\2\2\2\27\u03fb\3\2\2\2\31\u0400\3\2\2\2\33\u0403\3\2"+
-               
"\2\2\35\u0406\3\2\2\2\37\u0409\3\2\2\2!\u040c\3\2\2\2#\u040e\3\2\2\2%"+
-               
"\u0410\3\2\2\2\'\u0413\3\2\2\2)\u0416\3\2\2\2+\u0418\3\2\2\2-\u041a\3"+
-               
"\2\2\2/\u041c\3\2\2\2\61\u041e\3\2\2\2\63\u0420\3\2\2\2\65\u0422\3\2\2"+
-               
"\2\67\u0424\3\2\2\29\u0426\3\2\2\2;\u0428\3\2\2\2=\u042a\3\2\2\2?\u042c"+
-               
"\3\2\2\2A\u042e\3\2\2\2C\u0430\3\2\2\2E\u0432\3\2\2\2G\u0434\3\2\2\2I"+
-               
"\u0436\3\2\2\2K\u0438\3\2\2\2M\u043a\3\2\2\2O\u043c\3\2\2\2Q\u043e\3\2"+
-               
"\2\2S\u0440\3\2\2\2U\u0442\3\2\2\2W\u0444\3\2\2\2Y\u044e\3\2\2\2[\u0450"+
-               
"\3\2\2\2]\u0456\3\2\2\2_\u045c\3\2\2\2a\u045e\3\2\2\2c\u0464\3\2\2\2e"+
-               
"\u048e\3\2\2\2g\u0493\3\2\2\2i\u0499\3\2\2\2kl\7k\2\2lm\7p\2\2mn\7v\2"+
-               
"\2no\7g\2\2op\7p\2\2pq\7v\2\2q\4\3\2\2\2rs\7q\2\2st\7t\2\2tu\7f\2\2uv"+
-               
"\7g\2\2vw\7t\2\2wx\7g\2\2xy\7f\2\2y\6\3\2\2\2z{\7h\2\2{|\7n\2\2|}\7q\2"+
-               
"\2}~\7y\2\2~\b\3\2\2\2\177\u0080\7o\2\2\u0080\u0081\7g\2\2\u0081\u0082"+
-               
"\7v\2\2\u0082\u0083\7c\2\2\u0083\n\3\2\2\2\u0084\u0085\7v\2\2\u0085\u0086"+
-               
"\7g\2\2\u0086\u0087\7t\2\2\u0087\u0088\7o\2\2\u0088\f\3\2\2\2\u0089\u008a"+
-               
"\7o\2\2\u008a\u008b\7g\2\2\u008b\u008c\7v\2\2\u008c\u008d\7c\2\2\u008d"+
-               
"\u008e\7a\2\2\u008e\u008f\7v\2\2\u008f\u0090\7q\2\2\u0090\u0091\7m\2\2"+
-               
"\u0091\u0092\7g\2\2\u0092\u03d0\7p\2\2\u0093\u0094\7o\2\2\u0094\u0095"+
-               
"\7g\2\2\u0095\u0096\7v\2\2\u0096\u0097\7c\2\2\u0097\u0098\7a\2\2\u0098"+
-               
"\u0099\7o\2\2\u0099\u009a\7q\2\2\u009a\u009b\7f\2\2\u009b\u009c\7g\2\2"+
-               
"\u009c\u03d0\7n\2\2\u009d\u009e\7o\2\2\u009e\u009f\7g\2\2\u009f\u00a0"+
-               
"\7v\2\2\u00a0\u00a1\7c\2\2\u00a1\u00a2\7a\2\2\u00a2\u00a3\7k\2\2\u00a3"+
-               
"\u00a4\7p\2\2\u00a4\u00a5\7v\2\2\u00a5\u00a6\7g\2\2\u00a6\u00a7\7p\2\2"+
-               
"\u00a7\u03d0\7v\2\2\u00a8\u00a9\7o\2\2\u00a9\u00aa\7g\2\2\u00aa\u00ab"+
-               
"\7v\2\2\u00ab\u00ac\7c\2\2\u00ac\u00ad\7a\2\2\u00ad\u00ae\7t\2\2\u00ae"+
-               
"\u00af\7g\2\2\u00af\u03d0\7s\2\2\u00b0\u00b1\7o\2\2\u00b1\u00b2\7g\2\2"+
-               
"\u00b2\u00b3\7v\2\2\u00b3\u00b4\7c\2\2\u00b4\u00b5\7a\2\2\u00b5\u00b6"+
-               
"\7w\2\2\u00b6\u00b7\7u\2\2\u00b7\u00b8\7g\2\2\u00b8\u03d0\7t\2\2\u00b9"+
-               
"\u00ba\7o\2\2\u00ba\u00bb\7g\2\2\u00bb\u00bc\7v\2\2\u00bc\u00bd\7c\2\2"+
-               
"\u00bd\u00be\7a\2\2\u00be\u00bf\7e\2\2\u00bf\u00c0\7q\2\2\u00c0\u00c1"+
-               
"\7o\2\2\u00c1\u00c2\7r\2\2\u00c2\u00c3\7c\2\2\u00c3\u00c4\7p\2\2\u00c4"+
-               
"\u03d0\7{\2\2\u00c5\u00c6\7o\2\2\u00c6\u00c7\7g\2\2\u00c7\u00c8\7v\2\2"+
-               
"\u00c8\u00c9\7c\2\2\u00c9\u00ca\7a\2\2\u00ca\u00cb\7u\2\2\u00cb\u00cc"+
-               
"\7{\2\2\u00cc\u03d0\7u\2\2\u00cd\u00ce\7o\2\2\u00ce\u00cf\7g\2\2\u00cf"+
-               
"\u00d0\7v\2\2\u00d0\u00d1\7c\2\2\u00d1\u00d2\7a\2\2\u00d2\u00d3\7e\2\2"+
-               
"\u00d3\u00d4\7q\2\2\u00d4\u00d5\7p\2\2\u00d5\u03d0\7x\2\2\u00d6\u00d7"+
-               
"\7o\2\2\u00d7\u00d8\7g\2\2\u00d8\u00d9\7v\2\2\u00d9\u00da\7c\2\2\u00da"+
-               
"\u00db\7a\2\2\u00db\u00dc\7h\2\2\u00dc\u00dd\7t\2\2\u00dd\u00de\7c\2\2"+
-               
"\u00de\u03d0\7i\2\2\u00df\u00e0\7l\2\2\u00e0\u00e1\7u\2\2\u00e1\u00e2"+
-               
"\7q\2\2\u00e2\u03d0\7p\2\2\u00e3\u00e4\7k\2\2\u00e4\u03d0\7h\2\2\u00e5"+
-               
"\u00e6\7k\2\2\u00e6\u03d0\7f\2\2\u00e7\u00e8\7c\2\2\u00e8\u00e9\7p\2\2"+
-               
"\u00e9\u00ea\7e\2\2\u00ea\u00eb\7g\2\2\u00eb\u00ec\7u\2\2\u00ec\u00ed"+
-               
"\7v\2\2\u00ed\u00ee\7q\2\2\u00ee\u00ef\7t\2\2\u00ef\u03d0\7u\2\2\u00f0"+
-               
"\u00f1\7r\2\2\u00f1\u00f2\7c\2\2\u00f2\u00f3\7t\2\2\u00f3\u00f4\7g\2\2"+
-               
"\u00f4\u00f5\7p\2\2\u00f5\u03d0\7v\2\2\u00f6\u00f7\7i\2\2\u00f7\u00f8"+
-               
"\7t\2\2\u00f8\u00f9\7q\2\2\u00f9\u00fa\7w\2\2\u00fa\u00fb\7r\2\2\u00fb"+
-               
"\u03d0\7u\2\2\u00fc\u00fd\7x\2\2\u00fd\u00fe\7c\2\2\u00fe\u00ff\7n\2\2"+
-               
"\u00ff\u0100\7w\2\2\u0100\u03d0\7g\2\2\u0101\u0102\7c\2\2\u0102\u0103"+
-               
"\7n\2\2\u0103\u0104\7k\2\2\u0104\u0105\7c\2\2\u0105\u0106\7u\2\2\u0106"+
-               
"\u0107\7g\2\2\u0107\u03d0\7u\2\2\u0108\u0109\7u\2\2\u0109\u010a\7v\2\2"+
-               
"\u010a\u010b\7c\2\2\u010b\u010c\7t\2\2\u010c\u010d\7v\2\2\u010d\u010e"+
-               
"\7a\2\2\u010e\u010f\7k\2\2\u010f\u0110\7f\2\2\u0110\u03d0\7z\2\2\u0111"+
-               
"\u0112\7g\2\2\u0112\u0113\7p\2\2\u0113\u0114\7f\2\2\u0114\u0115\7a\2\2"+
-               
"\u0115\u0116\7k\2\2\u0116\u0117\7f\2\2\u0117\u03d0\7z\2\2\u0118\u0119"+
-               
"\7t\2\2\u0119\u011a\7g\2\2\u011a\u011b\7s\2\2\u011b\u011c\7a\2\2\u011c"+
-               
"\u011d\7k\2\2\u011d\u03d0\7f\2\2\u011e\u011f\7t\2\2\u011f\u0120\7g\2\2"+
-               
"\u0120\u0121\7s\2\2\u0121\u0122\7a\2\2\u0122\u0123\7p\2\2\u0123\u0124"+
-               
"\7q\2\2\u0124\u0125\7t\2\2\u0125\u0126\7o\2\2\u0126\u0127\7v\2\2\u0127"+
-               
"\u0128\7g\2\2\u0128\u0129\7z\2\2\u0129\u03d0\7v\2\2\u012a\u012b\7t\2\2"+
-               
"\u012b\u012c\7g\2\2\u012c\u012d\7s\2\2\u012d\u012e\7a\2\2\u012e\u012f"+
-               
"\7v\2\2\u012f\u0130\7u\2\2\u0130\u0131\7v\2\2\u0131\u0132\7c\2\2\u0132"+
-               
"\u0133\7o\2\2\u0133\u03d0\7r\2\2\u0134\u0135\7t\2\2\u0135\u0136\7g\2\2"+
-               
"\u0136\u0137\7s\2\2\u0137\u0138\7a\2\2\u0138\u0139\7c\2\2\u0139\u013a"+
-               
"\7f\2\2\u013a\u013b\7f\2\2\u013b\u03d0\7t\2\2\u013c\u013d\7t\2\2\u013d"+
-               
"\u013e\7g\2\2\u013e\u013f\7s\2\2\u013f\u0140\7a\2\2\u0140\u0141\7c\2\2"+
-               
"\u0141\u0142\7i\2\2\u0142\u0143\7g\2\2\u0143\u0144\7p\2\2\u0144\u03d0"+
-               
"\7v\2\2\u0145\u0146\7w\2\2\u0146\u0147\7u\2\2\u0147\u0148\7g\2\2\u0148"+
-               
"\u0149\7t\2\2\u0149\u014a\7a\2\2\u014a\u014b\7k\2\2\u014b\u03d0\7f\2\2"+
-               
"\u014c\u014d\7w\2\2\u014d\u014e\7u\2\2\u014e\u014f\7g\2\2\u014f\u0150"+
-               
"\7t\2\2\u0150\u0151\7a\2\2\u0151\u0152\7h\2\2\u0152\u0153\7p\2\2\u0153"+
-               
"\u0154\7c\2\2\u0154\u0155\7o\2\2\u0155\u03d0\7g\2\2\u0156\u0157\7w\2\2"+
-               
"\u0157\u0158\7u\2\2\u0158\u0159\7g\2\2\u0159\u015a\7t\2\2\u015a\u015b"+
-               
"\7a\2\2\u015b\u015c\7n\2\2\u015c\u015d\7p\2\2\u015d\u015e\7c\2\2\u015e"+
-               
"\u015f\7o\2\2\u015f\u03d0\7g\2\2\u0160\u0161\7w\2\2\u0161\u0162\7u\2\2"+
-               
"\u0162\u0163\7g\2\2\u0163\u0164\7t\2\2\u0164\u0165\7a\2\2\u0165\u0166"+
-               
"\7g\2\2\u0166\u0167\7o\2\2\u0167\u0168\7c\2\2\u0168\u0169\7k\2\2\u0169"+
-               
"\u03d0\7n\2\2\u016a\u016b\7w\2\2\u016b\u016c\7u\2\2\u016c\u016d\7g\2\2"+
-               
"\u016d\u016e\7t\2\2\u016e\u016f\7a\2\2\u016f\u0170\7c\2\2\u0170\u0171"+
-               
"\7f\2\2\u0171\u0172\7o\2\2\u0172\u0173\7k\2\2\u0173\u03d0\7p\2\2\u0174"+
-               
"\u0175\7w\2\2\u0175\u0176\7u\2\2\u0176\u0177\7g\2\2\u0177\u0178\7t\2\2"+
-               
"\u0178\u0179\7a\2\2\u0179\u017a\7u\2\2\u017a\u017b\7k\2\2\u017b\u017c"+
-               
"\7i\2\2\u017c\u017d\7p\2\2\u017d\u017e\7w\2\2\u017e\u017f\7r\2\2\u017f"+
-               
"\u0180\7a\2\2\u0180\u0181\7v\2\2\u0181\u0182\7u\2\2\u0182\u0183\7v\2\2"+
-               
"\u0183\u0184\7c\2\2\u0184\u0185\7o\2\2\u0185\u03d0\7r\2\2\u0186\u0187"+
-               
"\7e\2\2\u0187\u0188\7q\2\2\u0188\u0189\7o\2\2\u0189\u018a\7r\2\2\u018a"+
-               
"\u018b\7a\2\2\u018b\u018c\7k\2\2\u018c\u03d0\7f\2\2\u018d\u018e\7e\2\2"+
-               
"\u018e\u018f\7q\2\2\u018f\u0190\7o\2\2\u0190\u0191\7r\2\2\u0191\u0192"+
-               
"\7a\2\2\u0192\u0193\7p\2\2\u0193\u0194\7c\2\2\u0194\u0195\7o\2\2\u0195"+
-               
"\u03d0\7g\2\2\u0196\u0197\7e\2\2\u0197\u0198\7q\2\2\u0198\u0199\7o\2\2"+
-               
"\u0199\u019a\7r\2\2\u019a\u019b\7a\2\2\u019b\u019c\7y\2\2\u019c\u019d"+
-               
"\7g\2\2\u019d\u019e\7d\2\2\u019e\u019f\7u\2\2\u019f\u01a0\7k\2\2\u01a0"+
-               
"\u01a1\7v\2\2\u01a1\u03d0\7g\2\2\u01a2\u01a3\7e\2\2\u01a3\u01a4\7q\2\2"+
-               
"\u01a4\u01a5\7o\2\2\u01a5\u01a6\7r\2\2\u01a6\u01a7\7a\2\2\u01a7\u01a8"+
-               
"\7e\2\2\u01a8\u01a9\7q\2\2\u01a9\u01aa\7w\2\2\u01aa\u01ab\7p\2\2\u01ab"+
-               
"\u01ac\7v\2\2\u01ac\u01ad\7t\2\2\u01ad\u03d0\7{\2\2\u01ae\u01af\7e\2\2"+
-               
"\u01af\u01b0\7q\2\2\u01b0\u01b1\7o\2\2\u01b1\u01b2\7r\2\2\u01b2\u01b3"+
-               
"\7a\2\2\u01b3\u01b4\7t\2\2\u01b4\u01b5\7g\2\2\u01b5\u01b6\7i\2\2\u01b6"+
-               
"\u01b7\7k\2\2\u01b7\u01b8\7q\2\2\u01b8\u03d0\7p\2\2\u01b9\u01ba\7e\2\2"+
-               
"\u01ba\u01bb\7q\2\2\u01bb\u01bc\7o\2\2\u01bc\u01bd\7r\2\2\u01bd\u01be"+
-               
"\7a\2\2\u01be\u01bf\7e\2\2\u01bf\u01c0\7k\2\2\u01c0\u01c1\7v\2\2\u01c1"+
-               
"\u03d0\7{\2\2\u01c2\u01c3\7e\2\2\u01c3\u01c4\7q\2\2\u01c4\u01c5\7o\2\2"+
-               
"\u01c5\u01c6\7r\2\2\u01c6\u01c7\7a\2\2\u01c7\u01c8\7c\2\2\u01c8\u01c9"+
-               
"\7f\2\2\u01c9\u01ca\7f\2\2\u01ca\u03d0\7t\2\2\u01cb\u01cc\7e\2\2\u01cc"+
-               
"\u01cd\7q\2\2\u01cd\u01ce\7o\2\2\u01ce\u01cf\7r\2\2\u01cf\u01d0\7a\2\2"+
-               
"\u01d0\u01d1\7r\2\2\u01d1\u01d2\7q\2\2\u01d2\u01d3\7u\2\2\u01d3\u01d4"+
-               
"\7v\2\2\u01d4\u01d5\7e\2\2\u01d5\u01d6\7q\2\2\u01d6\u01d7\7f\2\2\u01d7"+
-               
"\u03d0\7g\2\2\u01d8\u01d9\7v\2\2\u01d9\u01da\7t\2\2\u01da\u01db\7k\2\2"+
-               
"\u01db\u03d0\7o\2\2\u01dc\u01dd\7u\2\2\u01dd\u01de\7v\2\2\u01de\u01df"+
-               
"\7t\2\2\u01df\u01e0\7k\2\2\u01e0\u03d0\7r\2\2\u01e1\u01e2\7w\2\2\u01e2"+
-               
"\u01e3\7r\2\2\u01e3\u01e4\7r\2\2\u01e4\u01e5\7g\2\2\u01e5\u01e6\7t\2\2"+
-               
"\u01e6\u01e7\7e\2\2\u01e7\u01e8\7c\2\2\u01e8\u01e9\7u\2\2\u01e9\u03d0"+
-               
"\7g\2\2\u01ea\u01eb\7n\2\2\u01eb\u01ec\7q\2\2\u01ec\u01ed\7y\2\2\u01ed"+
-               
"\u01ee\7g\2\2\u01ee\u01ef\7t\2\2\u01ef\u01f0\7e\2\2\u01f0\u01f1\7c\2\2"+
-               
"\u01f1\u01f2\7u\2\2\u01f2\u03d0\7g\2\2\u01f3\u01f4\7k\2\2\u01f4\u01f5"+
-               
"\7u\2\2\u01f5\u01f6\7a\2\2\u01f6\u01f7\7c\2\2\u01f7\u01f8\7n\2\2\u01f8"+
-               
"\u01f9\7r\2\2\u01f9\u01fa\7j\2\2\u01fa\u03d0\7c\2\2\u01fb\u01fc\7k\2\2"+
-               
"\u01fc\u01fd\7u\2\2\u01fd\u01fe\7a\2\2\u01fe\u01ff\7c\2\2\u01ff\u0200"+
-               
"\7n\2\2\u0200\u0201\7r\2\2\u0201\u0202\7j\2\2\u0202\u0203\7c\2\2\u0203"+
-               
"\u0204\7p\2\2\u0204\u0205\7w\2\2\u0205\u03d0\7o\2\2\u0206\u0207\7k\2\2"+
-               
"\u0207\u0208\7u\2\2\u0208\u0209\7a\2\2\u0209\u020a\7y\2\2\u020a\u020b"+
-               
"\7j\2\2\u020b\u020c\7k\2\2\u020c\u020d\7v\2\2\u020d\u020e\7g\2\2\u020e"+
-               
"\u020f\7u\2\2\u020f\u0210\7r\2\2\u0210\u0211\7c\2\2\u0211\u0212\7e\2\2"+
-               
"\u0212\u03d0\7g\2\2\u0213\u0214\7k\2\2\u0214\u0215\7u\2\2\u0215\u0216"+
-               
"\7a\2\2\u0216\u0217\7p\2\2\u0217\u0218\7w\2\2\u0218\u03d0\7o\2\2\u0219"+
-               
"\u021a\7k\2\2\u021a\u021b\7u\2\2\u021b\u021c\7a\2\2\u021c\u021d\7p\2\2"+
-               
"\u021d\u021e\7w\2\2\u021e\u021f\7o\2\2\u021f\u0220\7u\2\2\u0220\u0221"+
-               
"\7r\2\2\u0221\u0222\7c\2\2\u0222\u0223\7e\2\2\u0223\u03d0\7g\2\2\u0224"+
-               
"\u0225\7k\2\2\u0225\u0226\7u\2\2\u0226\u0227\7a\2\2\u0227\u0228\7c\2\2"+
-               
"\u0228\u0229\7n\2\2\u0229\u022a\7r\2\2\u022a\u022b\7j\2\2\u022b\u022c"+
-               
"\7c\2\2\u022c\u022d\7u\2\2\u022d\u022e\7r\2\2\u022e\u022f\7c\2\2\u022f"+
-               
"\u0230\7e\2\2\u0230\u03d0\7g\2\2\u0231\u0232\7k\2\2\u0232\u0233\7u\2\2"+
-               
"\u0233\u0234\7a\2\2\u0234\u0235\7c\2\2\u0235\u0236\7n\2\2\u0236\u0237"+
-               
"\7r\2\2\u0237\u0238\7j\2\2\u0238\u0239\7c\2\2\u0239\u023a\7p\2\2\u023a"+
-               
"\u023b\7w\2\2\u023b\u023c\7o\2\2\u023c\u023d\7u\2\2\u023d\u023e\7r\2\2"+
-               
"\u023e\u023f\7c\2\2\u023f\u0240\7e\2\2\u0240\u03d0\7g\2\2\u0241\u0242"+
-               
"\7u\2\2\u0242\u0243\7w\2\2\u0243\u0244\7d\2\2\u0244\u0245\7u\2\2\u0245"+
-               
"\u0246\7v\2\2\u0246\u0247\7t\2\2\u0247\u0248\7k\2\2\u0248\u0249\7p\2\2"+
-               
"\u0249\u03d0\7i\2\2\u024a\u024b\7e\2\2\u024b\u024c\7j\2\2\u024c\u024d"+
-               
"\7c\2\2\u024d\u024e\7t\2\2\u024e\u024f\7C\2\2\u024f\u03d0\7v\2\2\u0250"+
-               
"\u0251\7t\2\2\u0251\u0252\7g\2\2\u0252\u0253\7i\2\2\u0253\u0254\7g\2\2"+
-               
"\u0254\u03d0\7z\2\2\u0255\u0256\7u\2\2\u0256\u0257\7q\2\2\u0257\u0258"+
-               
"\7w\2\2\u0258\u0259\7p\2\2\u0259\u025a\7f\2\2\u025a\u025b\7g\2\2\u025b"+
-               
"\u03d0\7z\2\2\u025c\u025d\7u\2\2\u025d\u025e\7r\2\2\u025e\u025f\7n\2\2"+
-               
"\u025f\u0260\7k\2\2\u0260\u03d0\7v\2\2\u0261\u0262\7u\2\2\u0262\u0263"+
-               
"\7r\2\2\u0263\u0264\7n\2\2\u0264\u0265\7k\2\2\u0265\u0266\7v\2\2\u0266"+
-               
"\u0267\7a\2\2\u0267\u0268\7v\2\2\u0268\u0269\7t\2\2\u0269\u026a\7k\2\2"+
-               
"\u026a\u03d0\7o\2\2\u026b\u026c\7t\2\2\u026c\u026d\7g\2\2\u026d\u026e"+
-               
"\7r\2\2\u026e\u026f\7n\2\2\u026f\u0270\7c\2\2\u0270\u0271\7e\2\2\u0271"+
-               
"\u03d0\7g\2\2\u0272\u0273\7c\2\2\u0273\u0274\7d\2\2\u0274\u03d0\7u\2\2"+
-               
"\u0275\u0276\7e\2\2\u0276\u0277\7g\2\2\u0277\u0278\7k\2\2\u0278\u03d0"+
-               
"\7n\2\2\u0279\u027a\7h\2\2\u027a\u027b\7n\2\2\u027b\u027c\7q\2\2\u027c"+
-               
"\u027d\7q\2\2\u027d\u03d0\7t\2\2\u027e\u027f\7t\2\2\u027f\u0280\7k\2\2"+
-               
"\u0280\u0281\7p\2\2\u0281\u03d0\7v\2\2\u0282\u0283\7t\2\2\u0283\u0284"+
-               
"\7q\2\2\u0284\u0285\7w\2\2\u0285\u0286\7p\2\2\u0286\u03d0\7f\2\2\u0287"+
-               
"\u0288\7u\2\2\u0288\u0289\7k\2\2\u0289\u028a\7i\2\2\u028a\u028b\7p\2\2"+
-               
"\u028b\u028c\7w\2\2\u028c\u03d0\7o\2\2\u028d\u028e\7u\2\2\u028e\u028f"+
-               
"\7s\2\2\u028f\u0290\7t\2\2\u0290\u03d0\7v\2\2\u0291\u0292\7e\2\2\u0292"+
-               
"\u0293\7d\2\2\u0293\u0294\7t\2\2\u0294\u03d0\7v\2\2\u0295\u0296\7r\2\2"+
-               
"\u0296\u03d0\7k\2\2\u0297\u0298\7g\2\2\u0298\u0299\7w\2\2\u0299\u029a"+
-               
"\7n\2\2\u029a\u029b\7g\2\2\u029b\u03d0\7t\2\2\u029c\u029d\7c\2\2\u029d"+
-               
"\u029e\7e\2\2\u029e\u029f\7q\2\2\u029f\u03d0\7u\2\2\u02a0\u02a1\7c\2\2"+
-               
"\u02a1\u02a2\7u\2\2\u02a2\u02a3\7k\2\2\u02a3\u03d0\7p\2\2\u02a4\u02a5"+
-               
"\7c\2\2\u02a5\u02a6\7v\2\2\u02a6\u02a7\7c\2\2\u02a7\u03d0\7p\2\2\u02a8"+
-               
"\u02a9\7e\2\2\u02a9\u02aa\7q\2\2\u02aa\u03d0\7u\2\2\u02ab\u02ac\7u\2\2"+
-               
"\u02ac\u02ad\7k\2\2\u02ad\u03d0\7p\2\2\u02ae\u02af\7v\2\2\u02af\u02b0"+
-               
"\7c\2\2\u02b0\u03d0\7p\2\2\u02b1\u02b2\7e\2\2\u02b2\u02b3\7q\2\2\u02b3"+
-               
"\u02b4\7u\2\2\u02b4\u03d0\7j\2\2\u02b5\u02b6\7u\2\2\u02b6\u02b7\7k\2\2"+
-               
"\u02b7\u02b8\7p\2\2\u02b8\u03d0\7j\2\2\u02b9\u02ba\7v\2\2\u02ba\u02bb"+
-               
"\7c\2\2\u02bb\u02bc\7p\2\2\u02bc\u03d0\7j\2\2\u02bd\u02be\7c\2\2\u02be"+
-               
"\u02bf\7v\2\2\u02bf\u02c0\7p\2\2\u02c0\u03d0\7\64\2\2\u02c1\u02c2\7f\2"+
-               
"\2\u02c2\u02c3\7g\2\2\u02c3\u02c4\7i\2\2\u02c4\u02c5\7t\2\2\u02c5\u02c6"+
-               
"\7g\2\2\u02c6\u02c7\7g\2\2\u02c7\u03d0\7u\2\2\u02c8\u02c9\7t\2\2\u02c9"+
-               
"\u02ca\7c\2\2\u02ca\u02cb\7f\2\2\u02cb\u02cc\7k\2\2\u02cc\u02cd\7c\2\2"+
-               
"\u02cd\u02ce\7p\2\2\u02ce\u03d0\7u\2\2\u02cf\u02d0\7g\2\2\u02d0\u02d1"+
-               
"\7z\2\2\u02d1\u03d0\7r\2\2\u02d2\u02d3\7g\2\2\u02d3\u02d4\7z\2\2\u02d4"+
-               
"\u02d5\7r\2\2\u02d5\u02d6\7o\2\2\u02d6\u03d0\7\63\2\2\u02d7\u02d8\7j\2"+
-               
"\2\u02d8\u02d9\7{\2\2\u02d9\u02da\7r\2\2\u02da\u02db\7q\2\2\u02db\u03d0"+
-               
"\7v\2\2\u02dc\u02dd\7n\2\2\u02dd\u02de\7q\2\2\u02de\u03d0\7i\2\2\u02df"+
-               
"\u02e0\7n\2\2\u02e0\u02e1\7q\2\2\u02e1\u02e2\7i\2\2\u02e2\u02e3\7\63\2"+
-               
"\2\u02e3\u03d0\7\62\2\2\u02e4\u02e5\7n\2\2\u02e5\u02e6\7q\2\2\u02e6\u02e7"+
-               
"\7i\2\2\u02e7\u02e8\7\63\2\2\u02e8\u03d0\7r\2\2\u02e9\u02ea\7r\2\2\u02ea"+
-               
"\u02eb\7q\2\2\u02eb\u03d0\7y\2\2\u02ec\u02ed\7t\2\2\u02ed\u02ee\7c\2\2"+
-               
"\u02ee\u02ef\7p\2\2\u02ef\u03d0\7f\2\2\u02f0\u02f1\7u\2\2\u02f1\u02f2"+
-               
"\7s\2\2\u02f2\u02f3\7w\2\2\u02f3\u02f4\7c\2\2\u02f4\u02f5\7t\2\2\u02f5"+
-               
"\u03d0\7g\2\2\u02f6\u02f7\7n\2\2\u02f7\u02f8\7k\2\2\u02f8\u02f9\7u\2\2"+
-               
"\u02f9\u03d0\7v\2\2\u02fa\u02fb\7o\2\2\u02fb\u02fc\7c\2\2\u02fc\u03d0"+
-               
"\7r\2\2\u02fd\u02fe\7i\2\2\u02fe\u02ff\7g\2\2\u02ff\u03d0\7v\2\2\u0300"+
-               
"\u0301\7k\2\2\u0301\u0302\7p\2\2\u0302\u0303\7f\2\2\u0303\u0304\7g\2\2"+
-               
"\u0304\u03d0\7z\2\2\u0305\u0306\7j\2\2\u0306\u0307\7c\2\2\u0307\u03d0"+
-               
"\7u\2\2\u0308\u0309\7v\2\2\u0309\u030a\7c\2\2\u030a\u030b\7k\2\2\u030b"+
-               
"\u03d0\7n\2\2\u030c\u030d\7c\2\2\u030d\u030e\7f\2\2\u030e\u03d0\7f\2\2"+
-               
"\u030f\u0310\7t\2\2\u0310\u0311\7g\2\2\u0311\u0312\7o\2\2\u0312\u0313"+
-               
"\7q\2\2\u0313\u0314\7x\2\2\u0314\u03d0\7g\2\2\u0315\u0316\7h\2\2\u0316"+
-               
"\u0317\7k\2\2\u0317\u0318\7t\2\2\u0318\u0319\7u\2\2\u0319\u03d0\7v\2\2"+
-               
"\u031a\u031b\7n\2\2\u031b\u031c\7c\2\2\u031c\u031d\7u\2\2\u031d\u03d0"+
-               
"\7v\2\2\u031e\u031f\7m\2\2\u031f\u0320\7g\2\2\u0320\u0321\7{\2\2\u0321"+
-               
"\u03d0\7u\2\2\u0322\u0323\7x\2\2\u0323\u0324\7c\2\2\u0324\u0325\7n\2\2"+
-               
"\u0325\u0326\7w\2\2\u0326\u0327\7g\2\2\u0327\u03d0\7u\2\2\u0328\u0329"+
-               
"\7n\2\2\u0329\u032a\7g\2\2\u032a\u032b\7p\2\2\u032b\u032c\7i\2\2\u032c"+
-               
"\u032d\7v\2\2\u032d\u03d0\7j\2\2\u032e\u032f\7e\2\2\u032f\u0330\7q\2\2"+
-               
"\u0330\u0331\7w\2\2\u0331\u0332\7p\2\2\u0332\u03d0\7v\2\2\u0333\u0334"+
-               
"\7v\2\2\u0334\u0335\7c\2\2\u0335\u0336\7m\2\2\u0336\u03d0\7g\2\2\u0337"+
-               
"\u0338\7f\2\2\u0338\u0339\7t\2\2\u0339\u033a\7q\2\2\u033a\u03d0\7r\2\2"+
-               
"\u033b\u033c\7u\2\2\u033c\u033d\7k\2\2\u033d\u033e\7|\2\2\u033e\u03d0"+
-               
"\7g\2\2\u033f\u0340\7t\2\2\u0340\u0341\7g\2\2\u0341\u0342\7x\2\2\u0342"+
-               
"\u0343\7g\2\2\u0343\u0344\7t\2\2\u0344\u0345\7u\2\2\u0345\u03d0\7g\2\2"+
-               
"\u0346\u0347\7k\2\2\u0347\u0348\7u\2\2\u0348\u0349\7a\2\2\u0349\u034a"+
-               
"\7g\2\2\u034a\u034b\7o\2\2\u034b\u034c\7r\2\2\u034c\u034d\7v\2\2\u034d"+
-               
"\u03d0\7{\2\2\u034e\u034f\7p\2\2\u034f\u0350\7q\2\2\u0350\u0351\7p\2\2"+
-               
"\u0351\u0352\7a\2\2\u0352\u0353\7g\2\2\u0353\u0354\7o\2\2\u0354\u0355"+
-               
"\7r\2\2\u0355\u0356\7v\2\2\u0356\u03d0\7{\2\2\u0357\u0358\7v\2\2\u0358"+
-               
"\u0359\7q\2\2\u0359\u035a\7a\2\2\u035a\u035b\7u\2\2\u035b\u035c\7v\2\2"+
-               
"\u035c\u035d\7t\2\2\u035d\u035e\7k\2\2\u035e\u035f\7p\2\2\u035f\u03d0"+
-               
"\7i\2\2\u0360\u0361\7c\2\2\u0361\u0362\7x\2\2\u0362\u03d0\7i\2\2\u0363"+
-               
"\u0364\7o\2\2\u0364\u0365\7c\2\2\u0365\u03d0\7z\2\2\u0366\u0367\7o\2\2"+
-               
"\u0367\u0368\7k\2\2\u0368\u03d0\7p\2\2\u0369\u036a\7u\2\2\u036a\u036b"+
-               
"\7v\2\2\u036b\u036c\7f\2\2\u036c\u036d\7g\2\2\u036d\u03d0\7x\2\2\u036e"+
-               
"\u036f\7u\2\2\u036f\u0370\7w\2\2\u0370\u03d0\7o\2\2\u0371\u0372\7{\2\2"+
-               
"\u0372\u0373\7g\2\2\u0373\u0374\7c\2\2\u0374\u03d0\7t\2\2\u0375\u0376"+
-               
"\7o\2\2\u0376\u0377\7q\2\2\u0377\u0378\7p\2\2\u0378\u0379\7v\2\2\u0379"+
-               
"\u03d0\7j\2\2\u037a\u037b\7f\2\2\u037b\u037c\7c\2\2\u037c\u037d\7{\2\2"+
-               
"\u037d\u037e\7a\2\2\u037e\u037f\7q\2\2\u037f\u0380\7h\2\2\u0380\u0381"+
-               
"\7a\2\2\u0381\u0382\7o\2\2\u0382\u0383\7q\2\2\u0383\u0384\7p\2\2\u0384"+
-               
"\u0385\7v\2\2\u0385\u03d0\7j\2\2\u0386\u0387\7f\2\2\u0387\u0388\7c\2\2"+
-               
"\u0388\u0389\7{\2\2\u0389\u038a\7a\2\2\u038a\u038b\7q\2\2\u038b\u038c"+
-               
"\7h\2\2\u038c\u038d\7a\2\2\u038d\u038e\7y\2\2\u038e\u038f\7g\2\2\u038f"+
-               
"\u0390\7g\2\2\u0390\u03d0\7m\2\2\u0391\u0392\7f\2\2\u0392\u0393\7c\2\2"+
-               
"\u0393\u0394\7{\2\2\u0394\u0395\7a\2\2\u0395\u0396\7q\2\2\u0396\u0397"+
-               
"\7h\2\2\u0397\u0398\7a\2\2\u0398\u0399\7{\2\2\u0399\u039a\7g\2\2\u039a"+
-               
"\u039b\7c\2\2\u039b\u03d0\7t\2\2\u039c\u039d\7j\2\2\u039d\u039e\7q\2\2"+
-               
"\u039e\u039f\7w\2\2\u039f\u03d0\7t\2\2\u03a0\u03a1\7o\2\2\u03a1\u03a2"+
-               
"\7k\2\2\u03a2\u03a3\7p\2\2\u03a3\u03a4\7w\2\2\u03a4\u03a5\7v\2\2\u03a5"+
-               
"\u03d0\7g\2\2\u03a6\u03a7\7u\2\2\u03a7\u03a8\7g\2\2\u03a8\u03a9\7e\2\2"+
-               
"\u03a9\u03aa\7q\2\2\u03aa\u03ab\7p\2\2\u03ab\u03d0\7f\2\2\u03ac\u03ad"+
-               
"\7y\2\2\u03ad\u03ae\7g\2\2\u03ae\u03af\7g\2\2\u03af\u03b0\7m\2\2\u03b0"+
-               
"\u03b1\7a\2\2\u03b1\u03b2\7q\2\2\u03b2\u03b3\7h\2\2\u03b3\u03b4\7a\2\2"+
-               
"\u03b4\u03b5\7o\2\2\u03b5\u03b6\7q\2\2\u03b6\u03b7\7p\2\2\u03b7\u03b8"+
-               
"\7v\2\2\u03b8\u03d0\7j\2\2\u03b9\u03ba\7y\2\2\u03ba\u03bb\7g\2\2\u03bb"+
-               
"\u03bc\7g\2\2\u03bc\u03bd\7m\2\2\u03bd\u03be\7a\2\2\u03be\u03bf\7q\2\2"+
-               
"\u03bf\u03c0\7h\2\2\u03c0\u03c1\7a\2\2\u03c1\u03c2\7{\2\2\u03c2\u03c3"+
-               
"\7g\2\2\u03c3\u03c4\7c\2\2\u03c4\u03d0\7t\2\2\u03c5\u03c6\7s\2\2\u03c6"+
-               
"\u03c7\7w\2\2\u03c7\u03c8\7c\2\2\u03c8\u03c9\7t\2\2\u03c9\u03ca\7v\2\2"+
-               
"\u03ca\u03cb\7g\2\2\u03cb\u03d0\7t\2\2\u03cc\u03cd\7p\2\2\u03cd\u03ce"+
-               
"\7q\2\2\u03ce\u03d0\7y\2\2\u03cf\u0089\3\2\2\2\u03cf\u0093\3\2\2\2\u03cf"+
-               
"\u009d\3\2\2\2\u03cf\u00a8\3\2\2\2\u03cf\u00b0\3\2\2\2\u03cf\u00b9\3\2"+
-               
"\2\2\u03cf\u00c5\3\2\2\2\u03cf\u00cd\3\2\2\2\u03cf\u00d6\3\2\2\2\u03cf"+
-               
"\u00df\3\2\2\2\u03cf\u00e3\3\2\2\2\u03cf\u00e5\3\2\2\2\u03cf\u00e7\3\2"+
-               
"\2\2\u03cf\u00f0\3\2\2\2\u03cf\u00f6\3\2\2\2\u03cf\u00fc\3\2\2\2\u03cf"+
-               
"\u0101\3\2\2\2\u03cf\u0108\3\2\2\2\u03cf\u0111\3\2\2\2\u03cf\u0118\3\2"+
-               
"\2\2\u03cf\u011e\3\2\2\2\u03cf\u012a\3\2\2\2\u03cf\u0134\3\2\2\2\u03cf"+
-               
"\u013c\3\2\2\2\u03cf\u0145\3\2\2\2\u03cf\u014c\3\2\2\2\u03cf\u0156\3\2"+
-               
"\2\2\u03cf\u0160\3\2\2\2\u03cf\u016a\3\2\2\2\u03cf\u0174\3\2\2\2\u03cf"+
-               
"\u0186\3\2\2\2\u03cf\u018d\3\2\2\2\u03cf\u0196\3\2\2\2\u03cf\u01a2\3\2"+
-               
"\2\2\u03cf\u01ae\3\2\2\2\u03cf\u01b9\3\2\2\2\u03cf\u01c2\3\2\2\2\u03cf"+
-               
"\u01cb\3\2\2\2\u03cf\u01d8\3\2\2\2\u03cf\u01dc\3\2\2\2\u03cf\u01e1\3\2"+
-               
"\2\2\u03cf\u01ea\3\2\2\2\u03cf\u01f3\3\2\2\2\u03cf\u01fb\3\2\2\2\u03cf"+
-               
"\u0206\3\2\2\2\u03cf\u0213\3\2\2\2\u03cf\u0219\3\2\2\2\u03cf\u0224\3\2"+
-               
"\2\2\u03cf\u0231\3\2\2\2\u03cf\u0241\3\2\2\2\u03cf\u024a\3\2\2\2\u03cf"+
-               
"\u0250\3\2\2\2\u03cf\u0255\3\2\2\2\u03cf\u025c\3\2\2\2\u03cf\u0261\3\2"+
-               
"\2\2\u03cf\u026b\3\2\2\2\u03cf\u0272\3\2\2\2\u03cf\u0275\3\2\2\2\u03cf"+
-               
"\u0279\3\2\2\2\u03cf\u027e\3\2\2\2\u03cf\u0282\3\2\2\2\u03cf\u0287\3\2"+
-               
"\2\2\u03cf\u028d\3\2\2\2\u03cf\u0291\3\2\2\2\u03cf\u0295\3\2\2\2\u03cf"+
-               
"\u0297\3\2\2\2\u03cf\u029c\3\2\2\2\u03cf\u02a0\3\2\2\2\u03cf\u02a4\3\2"+
-               
"\2\2\u03cf\u02a8\3\2\2\2\u03cf\u02ab\3\2\2\2\u03cf\u02ae\3\2\2\2\u03cf"+
-               
"\u02b1\3\2\2\2\u03cf\u02b5\3\2\2\2\u03cf\u02b9\3\2\2\2\u03cf\u02bd\3\2"+
-               
"\2\2\u03cf\u02c1\3\2\2\2\u03cf\u02c8\3\2\2\2\u03cf\u02cf\3\2\2\2\u03cf"+
-               
"\u02d2\3\2\2\2\u03cf\u02d7\3\2\2\2\u03cf\u02dc\3\2\2\2\u03cf\u02df\3\2"+
-               
"\2\2\u03cf\u02e4\3\2\2\2\u03cf\u02e9\3\2\2\2\u03cf\u02ec\3\2\2\2\u03cf"+
-               
"\u02f0\3\2\2\2\u03cf\u02f6\3\2\2\2\u03cf\u02fa\3\2\2\2\u03cf\u02fd\3\2"+
-               
"\2\2\u03cf\u0300\3\2\2\2\u03cf\u0305\3\2\2\2\u03cf\u0308\3\2\2\2\u03cf"+
-               
"\u030c\3\2\2\2\u03cf\u030f\3\2\2\2\u03cf\u0315\3\2\2\2\u03cf\u031a\3\2"+
-               
"\2\2\u03cf\u031e\3\2\2\2\u03cf\u0322\3\2\2\2\u03cf\u0328\3\2\2\2\u03cf"+
-               
"\u032e\3\2\2\2\u03cf\u0333\3\2\2\2\u03cf\u0337\3\2\2\2\u03cf\u033b\3\2"+
-               
"\2\2\u03cf\u033f\3\2\2\2\u03cf\u0346\3\2\2\2\u03cf\u034e\3\2\2\2\u03cf"+
-               
"\u0357\3\2\2\2\u03cf\u0360\3\2\2\2\u03cf\u0363\3\2\2\2\u03cf\u0366\3\2"+
-               
"\2\2\u03cf\u0369\3\2\2\2\u03cf\u036e\3\2\2\2\u03cf\u0371\3\2\2\2\u03cf"+
-               
"\u0375\3\2\2\2\u03cf\u037a\3\2\2\2\u03cf\u0386\3\2\2\2\u03cf\u0391\3\2"+
-               
"\2\2\u03cf\u039c\3\2\2\2\u03cf\u03a0\3\2\2\2\u03cf\u03a6\3\2\2\2\u03cf"+
-               
"\u03ac\3\2\2\2\u03cf\u03b9\3\2\2\2\u03cf\u03c5\3\2\2\2\u03cf\u03cc\3\2"+
-               
"\2\2\u03d0\16\3\2\2\2\u03d1\u03d2\7h\2\2\u03d2\u03d3\7t\2\2\u03d3\u03d4"+
-               
"\7c\2\2\u03d4\u03d5\7i\2\2\u03d5\u03d6\7o\2\2\u03d6\u03d7\7g\2\2\u03d7"+
-               
"\u03d8\7p\2\2\u03d8\u03d9\7v\2\2\u03d9\20\3\2\2\2\u03da\u03e0\5\65\33"+
-               
"\2\u03db\u03df\n\2\2\2\u03dc\u03dd\7^\2\2\u03dd\u03df\7)\2\2\u03de\u03db"+
-               
"\3\2\2\2\u03de\u03dc\3\2\2\2\u03df\u03e2\3\2\2\2\u03e0\u03de\3\2\2\2\u03e0"+
-               
"\u03e1\3\2\2\2\u03e1\u03e3\3\2\2\2\u03e2\u03e0\3\2\2\2\u03e3\u03e4\5\65"+
-               
"\33\2\u03e4\22\3\2\2\2\u03e5\u03eb\5\67\34\2\u03e6\u03ea\n\3\2\2\u03e7"+
-               
"\u03e8\7^\2\2\u03e8\u03ea\7$\2\2\u03e9\u03e6\3\2\2\2\u03e9\u03e7\3\2\2"+
-               
"\2\u03ea\u03ed\3\2\2\2\u03eb\u03e9\3\2\2\2\u03eb\u03ec\3\2\2\2\u03ec\u03ee"+
-               
"\3\2\2\2\u03ed\u03eb\3\2\2\2\u03ee\u03ef\5\67\34\2\u03ef\24\3\2\2\2\u03f0"+
-               
"\u03f1\7v\2\2\u03f1\u03f2\7t\2\2\u03f2\u03f3\7w\2\2\u03f3\u03fa\7g\2\2"+
-               
"\u03f4\u03f5\7h\2\2\u03f5\u03f6\7c\2\2\u03f6\u03f7\7n\2\2\u03f7\u03f8"+
-               
"\7u\2\2\u03f8\u03fa\7g\2\2\u03f9\u03f0\3\2\2\2\u03f9\u03f4\3\2\2\2\u03fa"+
-               
"\26\3\2\2\2\u03fb\u03fc\7p\2\2\u03fc\u03fd\7w\2\2\u03fd\u03fe\7n\2\2\u03fe"+
-               
"\u03ff\7n\2\2\u03ff\30\3\2\2\2\u0400\u0401\7?\2\2\u0401\u0402\7?\2\2\u0402"+
-               
"\32\3\2\2\2\u0403\u0404\7#\2\2\u0404\u0405\7?\2\2\u0405\34\3\2\2\2\u0406"+
-               
"\u0407\7@\2\2\u0407\u0408\7?\2\2\u0408\36\3\2\2\2\u0409\u040a\7>\2\2\u040a"+
-               "\u040b\7?\2\2\u040b 
\3\2\2\2\u040c\u040d\7@\2\2\u040d\"\3\2\2\2\u040e"+
-               
"\u040f\7>\2\2\u040f$\3\2\2\2\u0410\u0411\7(\2\2\u0411\u0412\7(\2\2\u0412"+
-               
"&\3\2\2\2\u0413\u0414\7~\2\2\u0414\u0415\7~\2\2\u0415(\3\2\2\2\u0416\u0417"+
-               
"\7~\2\2\u0417*\3\2\2\2\u0418\u0419\7#\2\2\u0419,\3\2\2\2\u041a\u041b\7"+
-               
"*\2\2\u041b.\3\2\2\2\u041c\u041d\7+\2\2\u041d\60\3\2\2\2\u041e\u041f\7"+
-               
"}\2\2\u041f\62\3\2\2\2\u0420\u0421\7\177\2\2\u0421\64\3\2\2\2\u0422\u0423"+
-               
"\7)\2\2\u0423\66\3\2\2\2\u0424\u0425\7$\2\2\u04258\3\2\2\2\u0426\u0427"+
-               
"\7\u0080\2\2\u0427:\3\2\2\2\u0428\u0429\7]\2\2\u0429<\3\2\2\2\u042a\u042b"+
-               
"\7_\2\2\u042b>\3\2\2\2\u042c\u042d\7%\2\2\u042d@\3\2\2\2\u042e\u042f\7"+
-               
".\2\2\u042fB\3\2\2\2\u0430\u0431\7<\2\2\u0431D\3\2\2\2\u0432\u0433\7/"+
-               
"\2\2\u0433F\3\2\2\2\u0434\u0435\7\60\2\2\u0435H\3\2\2\2\u0436\u0437\7"+
-               
"a\2\2\u0437J\3\2\2\2\u0438\u0439\7?\2\2\u0439L\3\2\2\2\u043a\u043b\7-"+
-               
"\2\2\u043bN\3\2\2\2\u043c\u043d\7A\2\2\u043dP\3\2\2\2\u043e\u043f\7,\2"+
-               
"\2\u043fR\3\2\2\2\u0440\u0441\7\61\2\2\u0441T\3\2\2\2\u0442\u0443\7\'"+
-               
"\2\2\u0443V\3\2\2\2\u0444\u0445\7&\2\2\u0445X\3\2\2\2\u0446\u044f\7\62"+
-               
"\2\2\u0447\u044b\t\4\2\2\u0448\u044a\t\5\2\2\u0449\u0448\3\2\2\2\u044a"+
-               
"\u044d\3\2\2\2\u044b\u0449\3\2\2\2\u044b\u044c\3\2\2\2\u044c\u044f\3\2"+
-               
"\2\2\u044d\u044b\3\2\2\2\u044e\u0446\3\2\2\2\u044e\u0447\3\2\2\2\u044f"+
-               
"Z\3\2\2\2\u0450\u0452\5G$\2\u0451\u0453\t\6\2\2\u0452\u0451\3\2\2\2\u0453"+
-               
"\u0454\3\2\2\2\u0454\u0452\3\2\2\2\u0454\u0455\3\2\2\2\u0455\\\3\2\2\2"+
-               
"\u0456\u0458\t\7\2\2\u0457\u0459\t\b\2\2\u0458\u0457\3\2\2\2\u0458\u0459"+
-               
"\3\2\2\2\u0459\u045a\3\2\2\2\u045a\u045b\5Y-\2\u045b^\3\2\2\2\u045c\u045d"+
-               
"\t\t\2\2\u045d`\3\2\2\2\u045e\u045f\t\n\2\2\u045fb\3\2\2\2\u0460\u0465"+
-               
"\5_\60\2\u0461\u0465\5I%\2\u0462\u0465\5a\61\2\u0463\u0465\5W,\2\u0464"+
-               
"\u0460\3\2\2\2\u0464\u0461\3\2\2\2\u0464\u0462\3\2\2\2\u0464\u0463\3\2"+
-               
"\2\2\u0465\u0466\3\2\2\2\u0466\u0464\3\2\2\2\u0466\u0467\3\2\2\2\u0467"+
-               
"\u0471\3\2\2\2\u0468\u0470\5_\60\2\u0469\u0470\5W,\2\u046a\u0470\5a\61"+
-               
"\2\u046b\u0470\t\6\2\2\u046c\u0470\5C\"\2\u046d\u0470\5E#\2\u046e\u0470"+
-               
"\5I%\2\u046f\u0468\3\2\2\2\u046f\u0469\3\2\2\2\u046f\u046a\3\2\2\2\u046f"+
-               
"\u046b\3\2\2\2\u046f\u046c\3\2\2\2\u046f\u046d\3\2\2\2\u046f\u046e\3\2"+
-               
"\2\2\u0470\u0473\3\2\2\2\u0471\u046f\3\2\2\2\u0471\u0472\3\2\2\2\u0472"+
-               
"d\3\2\2\2\u0473\u0471\3\2\2\2\u0474\u0475\7\61\2\2\u0475\u0476\7\61\2"+
-               
"\2\u0476\u047a\3\2\2\2\u0477\u0479\n\13\2\2\u0478\u0477\3\2\2\2\u0479"+
-               
"\u047c\3\2\2\2\u047a\u0478\3\2\2\2\u047a\u047b\3\2\2\2\u047b\u047e\3\2"+
-               
"\2\2\u047c\u047a\3\2\2\2\u047d\u047f\7\17\2\2\u047e\u047d\3\2\2\2\u047e"+
-               
"\u047f\3\2\2\2\u047f\u0481\3\2\2\2\u0480\u0482\t\f\2\2\u0481\u0480\3\2"+
-               
"\2\2\u0482\u048f\3\2\2\2\u0483\u0484\7\61\2\2\u0484\u0485\7,\2\2\u0485"+
-               
"\u0489\3\2\2\2\u0486\u0488\13\2\2\2\u0487\u0486\3\2\2\2\u0488\u048b\3"+
-               
"\2\2\2\u0489\u048a\3\2\2\2\u0489\u0487\3\2\2\2\u048a\u048c\3\2\2\2\u048b"+
-               
"\u0489\3\2\2\2\u048c\u048d\7,\2\2\u048d\u048f\7\61\2\2\u048e\u0474\3\2"+
-               
"\2\2\u048e\u0483\3\2\2\2\u048f\u0490\3\2\2\2\u0490\u0491\b\63\2\2\u0491"+
-               
"f\3\2\2\2\u0492\u0494\t\r\2\2\u0493\u0492\3\2\2\2\u0494\u0495\3\2\2\2"+
-               
"\u0495\u0493\3\2\2\2\u0495\u0496\3\2\2\2\u0496\u0497\3\2\2\2\u0497\u0498"+
-               
"\b\64\2\2\u0498h\3\2\2\2\u0499\u049a\13\2\2\2\u049aj\3\2\2\2\27\2\u03cf"+
-               
"\u03de\u03e0\u03e9\u03eb\u03f9\u044b\u044e\u0454\u0458\u0464\u0466\u046f"+
-               "\u0471\u047a\u047e\u0481\u0489\u048e\u0495\3\b\2\2";
+               
"\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7"+
+               
"\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3"+
+               
"\7\3\7\5\7\u03e6\n\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\7\t\u03f5\n\t\f\t\16\t\u03f8\13\t\3\t\3\t\3\n\3\n\3\n\3\n\7\n\u0400"+
+               
"\n\n\f\n\16\n\u0403\13\n\3\n\3\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3"+
+               
"\13\3\13\5\13\u0410\n\13\3\f\3\f\3\f\3\f\3\f\3\r\3\r\3\r\3\16\3\16\3\16"+
+               
"\3\17\3\17\3\17\3\20\3\20\3\20\3\21\3\21\3\22\3\22\3\23\3\23\3\23\3\24"+
+               
"\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\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+\3+\3,\3,\3-\3-\3"+
+               
"-\7-\u0460\n-\f-\16-\u0463\13-\5-\u0465\n-\3.\3.\6.\u0469\n.\r.\16.\u046a"+
+               
"\3/\3/\5/\u046f\n/\3/\3/\3\60\3\60\3\61\3\61\3\62\3\62\3\62\3\62\6\62"+
+               
"\u047b\n\62\r\62\16\62\u047c\3\62\3\62\3\62\3\62\3\62\3\62\3\62\7\62\u0486"+
+               
"\n\62\f\62\16\62\u0489\13\62\3\63\3\63\3\63\3\63\7\63\u048f\n\63\f\63"+
+               
"\16\63\u0492\13\63\3\63\5\63\u0495\n\63\3\63\5\63\u0498\n\63\3\63\3\63"+
+               
"\3\63\3\63\7\63\u049e\n\63\f\63\16\63\u04a1\13\63\3\63\3\63\5\63\u04a5"+
+               
"\n\63\3\63\3\63\3\64\6\64\u04aa\n\64\r\64\16\64\u04ab\3\64\3\64\3\65\3"+
+               
"\65\3\u049f\2\66\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f\27\r\31"+
+               
"\16\33\17\35\20\37\21!\22#\23%\24\'\25)\26+\27-\30/\31\61\32\63\33\65"+
+               "\34\67\359\36;\37= 
?!A\"C#E$G%I&K\'M(O)Q*S+U,W-Y.[/]\60_\2a\2c\61e\62"+
+               
"g\63i\64\3\2\16\3\2))\3\2$$\3\2\63;\4\2\62;aa\3\2\62;\4\2GGgg\4\2--//"+
+               
"\17\2\u00a2\u0251\u025b\u0294\u02b2\u0371\u0402\u0501\u1e04\u1ef5\u1f03"+
+               
"\u2001\u200e\u200f\u2041\u2042\u2072\u2191\u2c02\u2ff1\u3003\ud801\uf902"+
+               
"\ufdd1\ufdf2\uffff\4\2C\\c|\4\2\f\f\17\17\3\3\f\f\5\2\13\f\16\17\"\"\2"+
+               
"\u0547\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\2"+
+               
"G\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2\2M\3\2\2\2\2O\3\2\2\2\2Q\3\2\2\2\2S\3"+
+               
"\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y\3\2\2\2\2[\3\2\2\2\2]\3\2\2\2\2c\3\2\2"+
+               
"\2\2e\3\2\2\2\2g\3\2\2\2\2i\3\2\2\2\3k\3\2\2\2\5r\3\2\2\2\7z\3\2\2\2\t"+
+               
"\177\3\2\2\2\13\u0084\3\2\2\2\r\u03e5\3\2\2\2\17\u03e7\3\2\2\2\21\u03f0"+
+               
"\3\2\2\2\23\u03fb\3\2\2\2\25\u040f\3\2\2\2\27\u0411\3\2\2\2\31\u0416\3"+
+               
"\2\2\2\33\u0419\3\2\2\2\35\u041c\3\2\2\2\37\u041f\3\2\2\2!\u0422\3\2\2"+
+               
"\2#\u0424\3\2\2\2%\u0426\3\2\2\2\'\u0429\3\2\2\2)\u042c\3\2\2\2+\u042e"+
+               
"\3\2\2\2-\u0430\3\2\2\2/\u0432\3\2\2\2\61\u0434\3\2\2\2\63\u0436\3\2\2"+
+               
"\2\65\u0438\3\2\2\2\67\u043a\3\2\2\29\u043c\3\2\2\2;\u043e\3\2\2\2=\u0440"+
+               
"\3\2\2\2?\u0442\3\2\2\2A\u0444\3\2\2\2C\u0446\3\2\2\2E\u0448\3\2\2\2G"+
+               
"\u044a\3\2\2\2I\u044c\3\2\2\2K\u044e\3\2\2\2M\u0450\3\2\2\2O\u0452\3\2"+
+               
"\2\2Q\u0454\3\2\2\2S\u0456\3\2\2\2U\u0458\3\2\2\2W\u045a\3\2\2\2Y\u0464"+
+               
"\3\2\2\2[\u0466\3\2\2\2]\u046c\3\2\2\2_\u0472\3\2\2\2a\u0474\3\2\2\2c"+
+               
"\u047a\3\2\2\2e\u04a4\3\2\2\2g\u04a9\3\2\2\2i\u04af\3\2\2\2kl\7k\2\2l"+
+               
"m\7p\2\2mn\7v\2\2no\7g\2\2op\7p\2\2pq\7v\2\2q\4\3\2\2\2rs\7q\2\2st\7t"+
+               
"\2\2tu\7f\2\2uv\7g\2\2vw\7t\2\2wx\7g\2\2xy\7f\2\2y\6\3\2\2\2z{\7h\2\2"+
+               
"{|\7n\2\2|}\7q\2\2}~\7y\2\2~\b\3\2\2\2\177\u0080\7o\2\2\u0080\u0081\7"+
+               
"g\2\2\u0081\u0082\7v\2\2\u0082\u0083\7c\2\2\u0083\n\3\2\2\2\u0084\u0085"+
+               
"\7v\2\2\u0085\u0086\7g\2\2\u0086\u0087\7t\2\2\u0087\u0088\7o\2\2\u0088"+
+               
"\f\3\2\2\2\u0089\u008a\7o\2\2\u008a\u008b\7g\2\2\u008b\u008c\7v\2\2\u008c"+
+               
"\u008d\7c\2\2\u008d\u008e\7a\2\2\u008e\u008f\7v\2\2\u008f\u0090\7q\2\2"+
+               
"\u0090\u0091\7m\2\2\u0091\u0092\7g\2\2\u0092\u03e6\7p\2\2\u0093\u0094"+
+               
"\7o\2\2\u0094\u0095\7g\2\2\u0095\u0096\7v\2\2\u0096\u0097\7c\2\2\u0097"+
+               
"\u0098\7a\2\2\u0098\u0099\7r\2\2\u0099\u009a\7c\2\2\u009a\u009b\7t\2\2"+
+               
"\u009b\u03e6\7v\2\2\u009c\u009d\7o\2\2\u009d\u009e\7g\2\2\u009e\u009f"+
+               
"\7v\2\2\u009f\u00a0\7c\2\2\u00a0\u00a1\7a\2\2\u00a1\u00a2\7o\2\2\u00a2"+
+               
"\u00a3\7q\2\2\u00a3\u00a4\7f\2\2\u00a4\u00a5\7g\2\2\u00a5\u03e6\7n\2\2"+
+               
"\u00a6\u00a7\7o\2\2\u00a7\u00a8\7g\2\2\u00a8\u00a9\7v\2\2\u00a9\u00aa"+
+               
"\7c\2\2\u00aa\u00ab\7a\2\2\u00ab\u00ac\7k\2\2\u00ac\u00ad\7p\2\2\u00ad"+
+               
"\u00ae\7v\2\2\u00ae\u00af\7g\2\2\u00af\u00b0\7p\2\2\u00b0\u03e6\7v\2\2"+
+               
"\u00b1\u00b2\7o\2\2\u00b2\u00b3\7g\2\2\u00b3\u00b4\7v\2\2\u00b4\u00b5"+
+               
"\7c\2\2\u00b5\u00b6\7a\2\2\u00b6\u00b7\7t\2\2\u00b7\u00b8\7g\2\2\u00b8"+
+               
"\u03e6\7s\2\2\u00b9\u00ba\7o\2\2\u00ba\u00bb\7g\2\2\u00bb\u00bc\7v\2\2"+
+               
"\u00bc\u00bd\7c\2\2\u00bd\u00be\7a\2\2\u00be\u00bf\7w\2\2\u00bf\u00c0"+
+               
"\7u\2\2\u00c0\u00c1\7g\2\2\u00c1\u03e6\7t\2\2\u00c2\u00c3\7o\2\2\u00c3"+
+               
"\u00c4\7g\2\2\u00c4\u00c5\7v\2\2\u00c5\u00c6\7c\2\2\u00c6\u00c7\7a\2\2"+
+               
"\u00c7\u00c8\7e\2\2\u00c8\u00c9\7q\2\2\u00c9\u00ca\7o\2\2\u00ca\u00cb"+
+               
"\7r\2\2\u00cb\u00cc\7c\2\2\u00cc\u00cd\7p\2\2\u00cd\u03e6\7{\2\2\u00ce"+
+               
"\u00cf\7o\2\2\u00cf\u00d0\7g\2\2\u00d0\u00d1\7v\2\2\u00d1\u00d2\7c\2\2"+
+               
"\u00d2\u00d3\7a\2\2\u00d3\u00d4\7u\2\2\u00d4\u00d5\7{\2\2\u00d5\u03e6"+
+               
"\7u\2\2\u00d6\u00d7\7o\2\2\u00d7\u00d8\7g\2\2\u00d8\u00d9\7v\2\2\u00d9"+
+               
"\u00da\7c\2\2\u00da\u00db\7a\2\2\u00db\u00dc\7e\2\2\u00dc\u00dd\7q\2\2"+
+               
"\u00dd\u00de\7p\2\2\u00de\u03e6\7x\2\2\u00df\u00e0\7o\2\2\u00e0\u00e1"+
+               
"\7g\2\2\u00e1\u00e2\7v\2\2\u00e2\u00e3\7c\2\2\u00e3\u00e4\7a\2\2\u00e4"+
+               
"\u00e5\7h\2\2\u00e5\u00e6\7t\2\2\u00e6\u00e7\7c\2\2\u00e7\u03e6\7i\2\2"+
+               
"\u00e8\u00e9\7l\2\2\u00e9\u00ea\7u\2\2\u00ea\u00eb\7q\2\2\u00eb\u03e6"+
+               
"\7p\2\2\u00ec\u00ed\7k\2\2\u00ed\u03e6\7h\2\2\u00ee\u00ef\7k\2\2\u00ef"+
+               
"\u03e6\7f\2\2\u00f0\u00f1\7v\2\2\u00f1\u00f2\7j\2\2\u00f2\u00f3\7k\2\2"+
+               
"\u00f3\u03e6\7u\2\2\u00f4\u00f5\7r\2\2\u00f5\u00f6\7c\2\2\u00f6\u00f7"+
+               
"\7t\2\2\u00f7\u03e6\7v\2\2\u00f8\u00f9\7r\2\2\u00f9\u00fa\7c\2\2\u00fa"+
+               
"\u00fb\7t\2\2\u00fb\u00fc\7v\2\2\u00fc\u03e6\7u\2\2\u00fd\u00fe\7c\2\2"+
+               
"\u00fe\u00ff\7p\2\2\u00ff\u0100\7e\2\2\u0100\u0101\7g\2\2\u0101\u0102"+
+               
"\7u\2\2\u0102\u0103\7v\2\2\u0103\u0104\7q\2\2\u0104\u0105\7t\2\2\u0105"+
+               
"\u03e6\7u\2\2\u0106\u0107\7r\2\2\u0107\u0108\7c\2\2\u0108\u0109\7t\2\2"+
+               
"\u0109\u010a\7g\2\2\u010a\u010b\7p\2\2\u010b\u03e6\7v\2\2\u010c\u010d"+
+               
"\7i\2\2\u010d\u010e\7t\2\2\u010e\u010f\7q\2\2\u010f\u0110\7w\2\2\u0110"+
+               
"\u0111\7r\2\2\u0111\u03e6\7u\2\2\u0112\u0113\7x\2\2\u0113\u0114\7c\2\2"+
+               
"\u0114\u0115\7n\2\2\u0115\u0116\7w\2\2\u0116\u03e6\7g\2\2\u0117\u0118"+
+               
"\7c\2\2\u0118\u0119\7n\2\2\u0119\u011a\7k\2\2\u011a\u011b\7c\2\2\u011b"+
+               
"\u011c\7u\2\2\u011c\u011d\7g\2\2\u011d\u03e6\7u\2\2\u011e\u011f\7u\2\2"+
+               
"\u011f\u0120\7v\2\2\u0120\u0121\7c\2\2\u0121\u0122\7t\2\2\u0122\u0123"+
+               
"\7v\2\2\u0123\u0124\7a\2\2\u0124\u0125\7k\2\2\u0125\u0126\7f\2\2\u0126"+
+               
"\u03e6\7z\2\2\u0127\u0128\7g\2\2\u0128\u0129\7p\2\2\u0129\u012a\7f\2\2"+
+               
"\u012a\u012b\7a\2\2\u012b\u012c\7k\2\2\u012c\u012d\7f\2\2\u012d\u03e6"+
+               
"\7z\2\2\u012e\u012f\7t\2\2\u012f\u0130\7g\2\2\u0130\u0131\7s\2\2\u0131"+
+               
"\u0132\7a\2\2\u0132\u0133\7k\2\2\u0133\u03e6\7f\2\2\u0134\u0135\7t\2\2"+
+               
"\u0135\u0136\7g\2\2\u0136\u0137\7s\2\2\u0137\u0138\7a\2\2\u0138\u0139"+
+               
"\7p\2\2\u0139\u013a\7q\2\2\u013a\u013b\7t\2\2\u013b\u013c\7o\2\2\u013c"+
+               
"\u013d\7v\2\2\u013d\u013e\7g\2\2\u013e\u013f\7z\2\2\u013f\u03e6\7v\2\2"+
+               
"\u0140\u0141\7t\2\2\u0141\u0142\7g\2\2\u0142\u0143\7s\2\2\u0143\u0144"+
+               
"\7a\2\2\u0144\u0145\7v\2\2\u0145\u0146\7u\2\2\u0146\u0147\7v\2\2\u0147"+
+               
"\u0148\7c\2\2\u0148\u0149\7o\2\2\u0149\u03e6\7r\2\2\u014a\u014b\7t\2\2"+
+               
"\u014b\u014c\7g\2\2\u014c\u014d\7s\2\2\u014d\u014e\7a\2\2\u014e\u014f"+
+               
"\7c\2\2\u014f\u0150\7f\2\2\u0150\u0151\7f\2\2\u0151\u03e6\7t\2\2\u0152"+
+               
"\u0153\7t\2\2\u0153\u0154\7g\2\2\u0154\u0155\7s\2\2\u0155\u0156\7a\2\2"+
+               
"\u0156\u0157\7c\2\2\u0157\u0158\7i\2\2\u0158\u0159\7g\2\2\u0159\u015a"+
+               
"\7p\2\2\u015a\u03e6\7v\2\2\u015b\u015c\7w\2\2\u015c\u015d\7u\2\2\u015d"+
+               
"\u015e\7g\2\2\u015e\u015f\7t\2\2\u015f\u0160\7a\2\2\u0160\u0161\7k\2\2"+
+               
"\u0161\u03e6\7f\2\2\u0162\u0163\7w\2\2\u0163\u0164\7u\2\2\u0164\u0165"+
+               
"\7g\2\2\u0165\u0166\7t\2\2\u0166\u0167\7a\2\2\u0167\u0168\7h\2\2\u0168"+
+               
"\u0169\7p\2\2\u0169\u016a\7c\2\2\u016a\u016b\7o\2\2\u016b\u03e6\7g\2\2"+
+               
"\u016c\u016d\7w\2\2\u016d\u016e\7u\2\2\u016e\u016f\7g\2\2\u016f\u0170"+
+               
"\7t\2\2\u0170\u0171\7a\2\2\u0171\u0172\7n\2\2\u0172\u0173\7p\2\2\u0173"+
+               
"\u0174\7c\2\2\u0174\u0175\7o\2\2\u0175\u03e6\7g\2\2\u0176\u0177\7w\2\2"+
+               
"\u0177\u0178\7u\2\2\u0178\u0179\7g\2\2\u0179\u017a\7t\2\2\u017a\u017b"+
+               
"\7a\2\2\u017b\u017c\7g\2\2\u017c\u017d\7o\2\2\u017d\u017e\7c\2\2\u017e"+
+               
"\u017f\7k\2\2\u017f\u03e6\7n\2\2\u0180\u0181\7w\2\2\u0181\u0182\7u\2\2"+
+               
"\u0182\u0183\7g\2\2\u0183\u0184\7t\2\2\u0184\u0185\7a\2\2\u0185\u0186"+
+               
"\7c\2\2\u0186\u0187\7f\2\2\u0187\u0188\7o\2\2\u0188\u0189\7k\2\2\u0189"+
+               
"\u03e6\7p\2\2\u018a\u018b\7w\2\2\u018b\u018c\7u\2\2\u018c\u018d\7g\2\2"+
+               
"\u018d\u018e\7t\2\2\u018e\u018f\7a\2\2\u018f\u0190\7u\2\2\u0190\u0191"+
+               
"\7k\2\2\u0191\u0192\7i\2\2\u0192\u0193\7p\2\2\u0193\u0194\7w\2\2\u0194"+
+               
"\u0195\7r\2\2\u0195\u0196\7a\2\2\u0196\u0197\7v\2\2\u0197\u0198\7u\2\2"+
+               
"\u0198\u0199\7v\2\2\u0199\u019a\7c\2\2\u019a\u019b\7o\2\2\u019b\u03e6"+
+               
"\7r\2\2\u019c\u019d\7e\2\2\u019d\u019e\7q\2\2\u019e\u019f\7o\2\2\u019f"+
+               
"\u01a0\7r\2\2\u01a0\u01a1\7a\2\2\u01a1\u01a2\7k\2\2\u01a2\u03e6\7f\2\2"+
+               
"\u01a3\u01a4\7e\2\2\u01a4\u01a5\7q\2\2\u01a5\u01a6\7o\2\2\u01a6\u01a7"+
+               
"\7r\2\2\u01a7\u01a8\7a\2\2\u01a8\u01a9\7p\2\2\u01a9\u01aa\7c\2\2\u01aa"+
+               
"\u01ab\7o\2\2\u01ab\u03e6\7g\2\2\u01ac\u01ad\7e\2\2\u01ad\u01ae\7q\2\2"+
+               
"\u01ae\u01af\7o\2\2\u01af\u01b0\7r\2\2\u01b0\u01b1\7a\2\2\u01b1\u01b2"+
+               
"\7y\2\2\u01b2\u01b3\7g\2\2\u01b3\u01b4\7d\2\2\u01b4\u01b5\7u\2\2\u01b5"+
+               
"\u01b6\7k\2\2\u01b6\u01b7\7v\2\2\u01b7\u03e6\7g\2\2\u01b8\u01b9\7e\2\2"+
+               
"\u01b9\u01ba\7q\2\2\u01ba\u01bb\7o\2\2\u01bb\u01bc\7r\2\2\u01bc\u01bd"+
+               
"\7a\2\2\u01bd\u01be\7e\2\2\u01be\u01bf\7q\2\2\u01bf\u01c0\7w\2\2\u01c0"+
+               
"\u01c1\7p\2\2\u01c1\u01c2\7v\2\2\u01c2\u01c3\7t\2\2\u01c3\u03e6\7{\2\2"+
+               
"\u01c4\u01c5\7e\2\2\u01c5\u01c6\7q\2\2\u01c6\u01c7\7o\2\2\u01c7\u01c8"+
+               
"\7r\2\2\u01c8\u01c9\7a\2\2\u01c9\u01ca\7t\2\2\u01ca\u01cb\7g\2\2\u01cb"+
+               
"\u01cc\7i\2\2\u01cc\u01cd\7k\2\2\u01cd\u01ce\7q\2\2\u01ce\u03e6\7p\2\2"+
+               
"\u01cf\u01d0\7e\2\2\u01d0\u01d1\7q\2\2\u01d1\u01d2\7o\2\2\u01d2\u01d3"+
+               
"\7r\2\2\u01d3\u01d4\7a\2\2\u01d4\u01d5\7e\2\2\u01d5\u01d6\7k\2\2\u01d6"+
+               
"\u01d7\7v\2\2\u01d7\u03e6\7{\2\2\u01d8\u01d9\7e\2\2\u01d9\u01da\7q\2\2"+
+               
"\u01da\u01db\7o\2\2\u01db\u01dc\7r\2\2\u01dc\u01dd\7a\2\2\u01dd\u01de"+
+               
"\7c\2\2\u01de\u01df\7f\2\2\u01df\u01e0\7f\2\2\u01e0\u03e6\7t\2\2\u01e1"+
+               
"\u01e2\7e\2\2\u01e2\u01e3\7q\2\2\u01e3\u01e4\7o\2\2\u01e4\u01e5\7r\2\2"+
+               
"\u01e5\u01e6\7a\2\2\u01e6\u01e7\7r\2\2\u01e7\u01e8\7q\2\2\u01e8\u01e9"+
+               
"\7u\2\2\u01e9\u01ea\7v\2\2\u01ea\u01eb\7e\2\2\u01eb\u01ec\7q\2\2\u01ec"+
+               
"\u01ed\7f\2\2\u01ed\u03e6\7g\2\2\u01ee\u01ef\7v\2\2\u01ef\u01f0\7t\2\2"+
+               
"\u01f0\u01f1\7k\2\2\u01f1\u03e6\7o\2\2\u01f2\u01f3\7u\2\2\u01f3\u01f4"+
+               
"\7v\2\2\u01f4\u01f5\7t\2\2\u01f5\u01f6\7k\2\2\u01f6\u03e6\7r\2\2\u01f7"+
+               
"\u01f8\7w\2\2\u01f8\u01f9\7r\2\2\u01f9\u01fa\7r\2\2\u01fa\u01fb\7g\2\2"+
+               
"\u01fb\u01fc\7t\2\2\u01fc\u01fd\7e\2\2\u01fd\u01fe\7c\2\2\u01fe\u01ff"+
+               
"\7u\2\2\u01ff\u03e6\7g\2\2\u0200\u0201\7n\2\2\u0201\u0202\7q\2\2\u0202"+
+               
"\u0203\7y\2\2\u0203\u0204\7g\2\2\u0204\u0205\7t\2\2\u0205\u0206\7e\2\2"+
+               
"\u0206\u0207\7c\2\2\u0207\u0208\7u\2\2\u0208\u03e6\7g\2\2\u0209\u020a"+
+               
"\7k\2\2\u020a\u020b\7u\2\2\u020b\u020c\7a\2\2\u020c\u020d\7c\2\2\u020d"+
+               
"\u020e\7n\2\2\u020e\u020f\7r\2\2\u020f\u0210\7j\2\2\u0210\u03e6\7c\2\2"+
+               
"\u0211\u0212\7k\2\2\u0212\u0213\7u\2\2\u0213\u0214\7a\2\2\u0214\u0215"+
+               
"\7c\2\2\u0215\u0216\7n\2\2\u0216\u0217\7r\2\2\u0217\u0218\7j\2\2\u0218"+
+               
"\u0219\7c\2\2\u0219\u021a\7p\2\2\u021a\u021b\7w\2\2\u021b\u03e6\7o\2\2"+
+               
"\u021c\u021d\7k\2\2\u021d\u021e\7u\2\2\u021e\u021f\7a\2\2\u021f\u0220"+
+               
"\7y\2\2\u0220\u0221\7j\2\2\u0221\u0222\7k\2\2\u0222\u0223\7v\2\2\u0223"+
+               
"\u0224\7g\2\2\u0224\u0225\7u\2\2\u0225\u0226\7r\2\2\u0226\u0227\7c\2\2"+
+               
"\u0227\u0228\7e\2\2\u0228\u03e6\7g\2\2\u0229\u022a\7k\2\2\u022a\u022b"+
+               
"\7u\2\2\u022b\u022c\7a\2\2\u022c\u022d\7p\2\2\u022d\u022e\7w\2\2\u022e"+
+               
"\u03e6\7o\2\2\u022f\u0230\7k\2\2\u0230\u0231\7u\2\2\u0231\u0232\7a\2\2"+
+               
"\u0232\u0233\7p\2\2\u0233\u0234\7w\2\2\u0234\u0235\7o\2\2\u0235\u0236"+
+               
"\7u\2\2\u0236\u0237\7r\2\2\u0237\u0238\7c\2\2\u0238\u0239\7e\2\2\u0239"+
+               
"\u03e6\7g\2\2\u023a\u023b\7k\2\2\u023b\u023c\7u\2\2\u023c\u023d\7a\2\2"+
+               
"\u023d\u023e\7c\2\2\u023e\u023f\7n\2\2\u023f\u0240\7r\2\2\u0240\u0241"+
+               
"\7j\2\2\u0241\u0242\7c\2\2\u0242\u0243\7u\2\2\u0243\u0244\7r\2\2\u0244"+
+               
"\u0245\7c\2\2\u0245\u0246\7e\2\2\u0246\u03e6\7g\2\2\u0247\u0248\7k\2\2"+
+               
"\u0248\u0249\7u\2\2\u0249\u024a\7a\2\2\u024a\u024b\7c\2\2\u024b\u024c"+
+               
"\7n\2\2\u024c\u024d\7r\2\2\u024d\u024e\7j\2\2\u024e\u024f\7c\2\2\u024f"+
+               
"\u0250\7p\2\2\u0250\u0251\7w\2\2\u0251\u0252\7o\2\2\u0252\u0253\7u\2\2"+
+               
"\u0253\u0254\7r\2\2\u0254\u0255\7c\2\2\u0255\u0256\7e\2\2\u0256\u03e6"+
+               
"\7g\2\2\u0257\u0258\7u\2\2\u0258\u0259\7w\2\2\u0259\u025a\7d\2\2\u025a"+
+               
"\u025b\7u\2\2\u025b\u025c\7v\2\2\u025c\u025d\7t\2\2\u025d\u025e\7k\2\2"+
+               
"\u025e\u025f\7p\2\2\u025f\u03e6\7i\2\2\u0260\u0261\7e\2\2\u0261\u0262"+
+               
"\7j\2\2\u0262\u0263\7c\2\2\u0263\u0264\7t\2\2\u0264\u0265\7C\2\2\u0265"+
+               
"\u03e6\7v\2\2\u0266\u0267\7t\2\2\u0267\u0268\7g\2\2\u0268\u0269\7i\2\2"+
+               
"\u0269\u026a\7g\2\2\u026a\u03e6\7z\2\2\u026b\u026c\7u\2\2\u026c\u026d"+
+               
"\7q\2\2\u026d\u026e\7w\2\2\u026e\u026f\7p\2\2\u026f\u0270\7f\2\2\u0270"+
+               
"\u0271\7g\2\2\u0271\u03e6\7z\2\2\u0272\u0273\7u\2\2\u0273\u0274\7r\2\2"+
+               
"\u0274\u0275\7n\2\2\u0275\u0276\7k\2\2\u0276\u03e6\7v\2\2\u0277\u0278"+
+               
"\7u\2\2\u0278\u0279\7r\2\2\u0279\u027a\7n\2\2\u027a\u027b\7k\2\2\u027b"+
+               
"\u027c\7v\2\2\u027c\u027d\7a\2\2\u027d\u027e\7v\2\2\u027e\u027f\7t\2\2"+
+               
"\u027f\u0280\7k\2\2\u0280\u03e6\7o\2\2\u0281\u0282\7t\2\2\u0282\u0283"+
+               
"\7g\2\2\u0283\u0284\7r\2\2\u0284\u0285\7n\2\2\u0285\u0286\7c\2\2\u0286"+
+               
"\u0287\7e\2\2\u0287\u03e6\7g\2\2\u0288\u0289\7c\2\2\u0289\u028a\7d\2\2"+
+               
"\u028a\u03e6\7u\2\2\u028b\u028c\7e\2\2\u028c\u028d\7g\2\2\u028d\u028e"+
+               
"\7k\2\2\u028e\u03e6\7n\2\2\u028f\u0290\7h\2\2\u0290\u0291\7n\2\2\u0291"+
+               
"\u0292\7q\2\2\u0292\u0293\7q\2\2\u0293\u03e6\7t\2\2\u0294\u0295\7t\2\2"+
+               
"\u0295\u0296\7k\2\2\u0296\u0297\7p\2\2\u0297\u03e6\7v\2\2\u0298\u0299"+
+               
"\7t\2\2\u0299\u029a\7q\2\2\u029a\u029b\7w\2\2\u029b\u029c\7p\2\2\u029c"+
+               
"\u03e6\7f\2\2\u029d\u029e\7u\2\2\u029e\u029f\7k\2\2\u029f\u02a0\7i\2\2"+
+               
"\u02a0\u02a1\7p\2\2\u02a1\u02a2\7w\2\2\u02a2\u03e6\7o\2\2\u02a3\u02a4"+
+               
"\7u\2\2\u02a4\u02a5\7s\2\2\u02a5\u02a6\7t\2\2\u02a6\u03e6\7v\2\2\u02a7"+
+               
"\u02a8\7e\2\2\u02a8\u02a9\7d\2\2\u02a9\u02aa\7t\2\2\u02aa\u03e6\7v\2\2"+
+               
"\u02ab\u02ac\7r\2\2\u02ac\u03e6\7k\2\2\u02ad\u02ae\7g\2\2\u02ae\u02af"+
+               
"\7w\2\2\u02af\u02b0\7n\2\2\u02b0\u02b1\7g\2\2\u02b1\u03e6\7t\2\2\u02b2"+
+               
"\u02b3\7c\2\2\u02b3\u02b4\7e\2\2\u02b4\u02b5\7q\2\2\u02b5\u03e6\7u\2\2"+
+               
"\u02b6\u02b7\7c\2\2\u02b7\u02b8\7u\2\2\u02b8\u02b9\7k\2\2\u02b9\u03e6"+
+               
"\7p\2\2\u02ba\u02bb\7c\2\2\u02bb\u02bc\7v\2\2\u02bc\u02bd\7c\2\2\u02bd"+
+               
"\u03e6\7p\2\2\u02be\u02bf\7e\2\2\u02bf\u02c0\7q\2\2\u02c0\u03e6\7u\2\2"+
+               
"\u02c1\u02c2\7u\2\2\u02c2\u02c3\7k\2\2\u02c3\u03e6\7p\2\2\u02c4\u02c5"+
+               
"\7v\2\2\u02c5\u02c6\7c\2\2\u02c6\u03e6\7p\2\2\u02c7\u02c8\7e\2\2\u02c8"+
+               
"\u02c9\7q\2\2\u02c9\u02ca\7u\2\2\u02ca\u03e6\7j\2\2\u02cb\u02cc\7u\2\2"+
+               
"\u02cc\u02cd\7k\2\2\u02cd\u02ce\7p\2\2\u02ce\u03e6\7j\2\2\u02cf\u02d0"+
+               
"\7v\2\2\u02d0\u02d1\7c\2\2\u02d1\u02d2\7p\2\2\u02d2\u03e6\7j\2\2\u02d3"+
+               
"\u02d4\7c\2\2\u02d4\u02d5\7v\2\2\u02d5\u02d6\7p\2\2\u02d6\u03e6\7\64\2"+
+               
"\2\u02d7\u02d8\7f\2\2\u02d8\u02d9\7g\2\2\u02d9\u02da\7i\2\2\u02da\u02db"+
+               
"\7t\2\2\u02db\u02dc\7g\2\2\u02dc\u02dd\7g\2\2\u02dd\u03e6\7u\2\2\u02de"+
+               
"\u02df\7t\2\2\u02df\u02e0\7c\2\2\u02e0\u02e1\7f\2\2\u02e1\u02e2\7k\2\2"+
+               
"\u02e2\u02e3\7c\2\2\u02e3\u02e4\7p\2\2\u02e4\u03e6\7u\2\2\u02e5\u02e6"+
+               
"\7g\2\2\u02e6\u02e7\7z\2\2\u02e7\u03e6\7r\2\2\u02e8\u02e9\7g\2\2\u02e9"+
+               
"\u02ea\7z\2\2\u02ea\u02eb\7r\2\2\u02eb\u02ec\7o\2\2\u02ec\u03e6\7\63\2"+
+               
"\2\u02ed\u02ee\7j\2\2\u02ee\u02ef\7{\2\2\u02ef\u02f0\7r\2\2\u02f0\u02f1"+
+               
"\7q\2\2\u02f1\u03e6\7v\2\2\u02f2\u02f3\7n\2\2\u02f3\u02f4\7q\2\2\u02f4"+
+               
"\u03e6\7i\2\2\u02f5\u02f6\7n\2\2\u02f6\u02f7\7q\2\2\u02f7\u02f8\7i\2\2"+
+               
"\u02f8\u02f9\7\63\2\2\u02f9\u03e6\7\62\2\2\u02fa\u02fb\7n\2\2\u02fb\u02fc"+
+               
"\7q\2\2\u02fc\u02fd\7i\2\2\u02fd\u02fe\7\63\2\2\u02fe\u03e6\7r\2\2\u02ff"+
+               
"\u0300\7r\2\2\u0300\u0301\7q\2\2\u0301\u03e6\7y\2\2\u0302\u0303\7t\2\2"+
+               
"\u0303\u0304\7c\2\2\u0304\u0305\7p\2\2\u0305\u03e6\7f\2\2\u0306\u0307"+
+               
"\7u\2\2\u0307\u0308\7s\2\2\u0308\u0309\7w\2\2\u0309\u030a\7c\2\2\u030a"+
+               
"\u030b\7t\2\2\u030b\u03e6\7g\2\2\u030c\u030d\7n\2\2\u030d\u030e\7k\2\2"+
+               
"\u030e\u030f\7u\2\2\u030f\u03e6\7v\2\2\u0310\u0311\7o\2\2\u0311\u0312"+
+               
"\7c\2\2\u0312\u03e6\7r\2\2\u0313\u0314\7i\2\2\u0314\u0315\7g\2\2\u0315"+
+               
"\u03e6\7v\2\2\u0316\u0317\7k\2\2\u0317\u0318\7p\2\2\u0318\u0319\7f\2\2"+
+               
"\u0319\u031a\7g\2\2\u031a\u03e6\7z\2\2\u031b\u031c\7j\2\2\u031c\u031d"+
+               
"\7c\2\2\u031d\u03e6\7u\2\2\u031e\u031f\7v\2\2\u031f\u0320\7c\2\2\u0320"+
+               
"\u0321\7k\2\2\u0321\u03e6\7n\2\2\u0322\u0323\7c\2\2\u0323\u0324\7f\2\2"+
+               
"\u0324\u03e6\7f\2\2\u0325\u0326\7t\2\2\u0326\u0327\7g\2\2\u0327\u0328"+
+               
"\7o\2\2\u0328\u0329\7q\2\2\u0329\u032a\7x\2\2\u032a\u03e6\7g\2\2\u032b"+
+               
"\u032c\7h\2\2\u032c\u032d\7k\2\2\u032d\u032e\7t\2\2\u032e\u032f\7u\2\2"+
+               
"\u032f\u03e6\7v\2\2\u0330\u0331\7n\2\2\u0331\u0332\7c\2\2\u0332\u0333"+
+               
"\7u\2\2\u0333\u03e6\7v\2\2\u0334\u0335\7m\2\2\u0335\u0336\7g\2\2\u0336"+
+               
"\u0337\7{\2\2\u0337\u03e6\7u\2\2\u0338\u0339\7x\2\2\u0339\u033a\7c\2\2"+
+               
"\u033a\u033b\7n\2\2\u033b\u033c\7w\2\2\u033c\u033d\7g\2\2\u033d\u03e6"+
+               
"\7u\2\2\u033e\u033f\7n\2\2\u033f\u0340\7g\2\2\u0340\u0341\7p\2\2\u0341"+
+               
"\u0342\7i\2\2\u0342\u0343\7v\2\2\u0343\u03e6\7j\2\2\u0344\u0345\7e\2\2"+
+               
"\u0345\u0346\7q\2\2\u0346\u0347\7w\2\2\u0347\u0348\7p\2\2\u0348\u03e6"+
+               
"\7v\2\2\u0349\u034a\7v\2\2\u034a\u034b\7c\2\2\u034b\u034c\7m\2\2\u034c"+
+               
"\u03e6\7g\2\2\u034d\u034e\7f\2\2\u034e\u034f\7t\2\2\u034f\u0350\7q\2\2"+
+               
"\u0350\u03e6\7r\2\2\u0351\u0352\7u\2\2\u0352\u0353\7k\2\2\u0353\u0354"+
+               
"\7|\2\2\u0354\u03e6\7g\2\2\u0355\u0356\7t\2\2\u0356\u0357\7g\2\2\u0357"+
+               
"\u0358\7x\2\2\u0358\u0359\7g\2\2\u0359\u035a\7t\2\2\u035a\u035b\7u\2\2"+
+               
"\u035b\u03e6\7g\2\2\u035c\u035d\7k\2\2\u035d\u035e\7u\2\2\u035e\u035f"+
+               
"\7a\2\2\u035f\u0360\7g\2\2\u0360\u0361\7o\2\2\u0361\u0362\7r\2\2\u0362"+
+               
"\u0363\7v\2\2\u0363\u03e6\7{\2\2\u0364\u0365\7p\2\2\u0365\u0366\7q\2\2"+
+               
"\u0366\u0367\7p\2\2\u0367\u0368\7a\2\2\u0368\u0369\7g\2\2\u0369\u036a"+
+               
"\7o\2\2\u036a\u036b\7r\2\2\u036b\u036c\7v\2\2\u036c\u03e6\7{\2\2\u036d"+
+               
"\u036e\7v\2\2\u036e\u036f\7q\2\2\u036f\u0370\7a\2\2\u0370\u0371\7u\2\2"+
+               
"\u0371\u0372\7v\2\2\u0372\u0373\7t\2\2\u0373\u0374\7k\2\2\u0374\u0375"+
+               
"\7p\2\2\u0375\u03e6\7i\2\2\u0376\u0377\7c\2\2\u0377\u0378\7x\2\2\u0378"+
+               
"\u03e6\7i\2\2\u0379\u037a\7o\2\2\u037a\u037b\7c\2\2\u037b\u03e6\7z\2\2"+
+               
"\u037c\u037d\7o\2\2\u037d\u037e\7k\2\2\u037e\u03e6\7p\2\2\u037f\u0380"+
+               
"\7u\2\2\u0380\u0381\7v\2\2\u0381\u0382\7f\2\2\u0382\u0383\7g\2\2\u0383"+
+               
"\u03e6\7x\2\2\u0384\u0385\7u\2\2\u0385\u0386\7w\2\2\u0386\u03e6\7o\2\2"+
+               
"\u0387\u0388\7{\2\2\u0388\u0389\7g\2\2\u0389\u038a\7c\2\2\u038a\u03e6"+
+               
"\7t\2\2\u038b\u038c\7o\2\2\u038c\u038d\7q\2\2\u038d\u038e\7p\2\2\u038e"+
+               
"\u038f\7v\2\2\u038f\u03e6\7j\2\2\u0390\u0391\7f\2\2\u0391\u0392\7c\2\2"+
+               
"\u0392\u0393\7{\2\2\u0393\u0394\7a\2\2\u0394\u0395\7q\2\2\u0395\u0396"+
+               
"\7h\2\2\u0396\u0397\7a\2\2\u0397\u0398\7o\2\2\u0398\u0399\7q\2\2\u0399"+
+               
"\u039a\7p\2\2\u039a\u039b\7v\2\2\u039b\u03e6\7j\2\2\u039c\u039d\7f\2\2"+
+               
"\u039d\u039e\7c\2\2\u039e\u039f\7{\2\2\u039f\u03a0\7a\2\2\u03a0\u03a1"+
+               
"\7q\2\2\u03a1\u03a2\7h\2\2\u03a2\u03a3\7a\2\2\u03a3\u03a4\7y\2\2\u03a4"+
+               
"\u03a5\7g\2\2\u03a5\u03a6\7g\2\2\u03a6\u03e6\7m\2\2\u03a7\u03a8\7f\2\2"+
+               
"\u03a8\u03a9\7c\2\2\u03a9\u03aa\7{\2\2\u03aa\u03ab\7a\2\2\u03ab\u03ac"+
+               
"\7q\2\2\u03ac\u03ad\7h\2\2\u03ad\u03ae\7a\2\2\u03ae\u03af\7{\2\2\u03af"+
+               
"\u03b0\7g\2\2\u03b0\u03b1\7c\2\2\u03b1\u03e6\7t\2\2\u03b2\u03b3\7j\2\2"+
+               
"\u03b3\u03b4\7q\2\2\u03b4\u03b5\7w\2\2\u03b5\u03e6\7t\2\2\u03b6\u03b7"+
+               
"\7o\2\2\u03b7\u03b8\7k\2\2\u03b8\u03b9\7p\2\2\u03b9\u03ba\7w\2\2\u03ba"+
+               
"\u03bb\7v\2\2\u03bb\u03e6\7g\2\2\u03bc\u03bd\7u\2\2\u03bd\u03be\7g\2\2"+
+               
"\u03be\u03bf\7e\2\2\u03bf\u03c0\7q\2\2\u03c0\u03c1\7p\2\2\u03c1\u03e6"+
+               
"\7f\2\2\u03c2\u03c3\7y\2\2\u03c3\u03c4\7g\2\2\u03c4\u03c5\7g\2\2\u03c5"+
+               
"\u03c6\7m\2\2\u03c6\u03c7\7a\2\2\u03c7\u03c8\7q\2\2\u03c8\u03c9\7h\2\2"+
+               
"\u03c9\u03ca\7a\2\2\u03ca\u03cb\7o\2\2\u03cb\u03cc\7q\2\2\u03cc\u03cd"+
+               
"\7p\2\2\u03cd\u03ce\7v\2\2\u03ce\u03e6\7j\2\2\u03cf\u03d0\7y\2\2\u03d0"+
+               
"\u03d1\7g\2\2\u03d1\u03d2\7g\2\2\u03d2\u03d3\7m\2\2\u03d3\u03d4\7a\2\2"+
+               
"\u03d4\u03d5\7q\2\2\u03d5\u03d6\7h\2\2\u03d6\u03d7\7a\2\2\u03d7\u03d8"+
+               
"\7{\2\2\u03d8\u03d9\7g\2\2\u03d9\u03da\7c\2\2\u03da\u03e6\7t\2\2\u03db"+
+               
"\u03dc\7s\2\2\u03dc\u03dd\7w\2\2\u03dd\u03de\7c\2\2\u03de\u03df\7t\2\2"+
+               
"\u03df\u03e0\7v\2\2\u03e0\u03e1\7g\2\2\u03e1\u03e6\7t\2\2\u03e2\u03e3"+
+               
"\7p\2\2\u03e3\u03e4\7q\2\2\u03e4\u03e6\7y\2\2\u03e5\u0089\3\2\2\2\u03e5"+
+               
"\u0093\3\2\2\2\u03e5\u009c\3\2\2\2\u03e5\u00a6\3\2\2\2\u03e5\u00b1\3\2"+
+               
"\2\2\u03e5\u00b9\3\2\2\2\u03e5\u00c2\3\2\2\2\u03e5\u00ce\3\2\2\2\u03e5"+
+               
"\u00d6\3\2\2\2\u03e5\u00df\3\2\2\2\u03e5\u00e8\3\2\2\2\u03e5\u00ec\3\2"+
+               
"\2\2\u03e5\u00ee\3\2\2\2\u03e5\u00f0\3\2\2\2\u03e5\u00f4\3\2\2\2\u03e5"+
+               
"\u00f8\3\2\2\2\u03e5\u00fd\3\2\2\2\u03e5\u0106\3\2\2\2\u03e5\u010c\3\2"+
+               
"\2\2\u03e5\u0112\3\2\2\2\u03e5\u0117\3\2\2\2\u03e5\u011e\3\2\2\2\u03e5"+
+               
"\u0127\3\2\2\2\u03e5\u012e\3\2\2\2\u03e5\u0134\3\2\2\2\u03e5\u0140\3\2"+
+               
"\2\2\u03e5\u014a\3\2\2\2\u03e5\u0152\3\2\2\2\u03e5\u015b\3\2\2\2\u03e5"+
+               
"\u0162\3\2\2\2\u03e5\u016c\3\2\2\2\u03e5\u0176\3\2\2\2\u03e5\u0180\3\2"+
+               
"\2\2\u03e5\u018a\3\2\2\2\u03e5\u019c\3\2\2\2\u03e5\u01a3\3\2\2\2\u03e5"+
+               
"\u01ac\3\2\2\2\u03e5\u01b8\3\2\2\2\u03e5\u01c4\3\2\2\2\u03e5\u01cf\3\2"+
+               
"\2\2\u03e5\u01d8\3\2\2\2\u03e5\u01e1\3\2\2\2\u03e5\u01ee\3\2\2\2\u03e5"+
+               
"\u01f2\3\2\2\2\u03e5\u01f7\3\2\2\2\u03e5\u0200\3\2\2\2\u03e5\u0209\3\2"+
+               
"\2\2\u03e5\u0211\3\2\2\2\u03e5\u021c\3\2\2\2\u03e5\u0229\3\2\2\2\u03e5"+
+               
"\u022f\3\2\2\2\u03e5\u023a\3\2\2\2\u03e5\u0247\3\2\2\2\u03e5\u0257\3\2"+
+               
"\2\2\u03e5\u0260\3\2\2\2\u03e5\u0266\3\2\2\2\u03e5\u026b\3\2\2\2\u03e5"+
+               
"\u0272\3\2\2\2\u03e5\u0277\3\2\2\2\u03e5\u0281\3\2\2\2\u03e5\u0288\3\2"+
+               
"\2\2\u03e5\u028b\3\2\2\2\u03e5\u028f\3\2\2\2\u03e5\u0294\3\2\2\2\u03e5"+
+               
"\u0298\3\2\2\2\u03e5\u029d\3\2\2\2\u03e5\u02a3\3\2\2\2\u03e5\u02a7\3\2"+
+               
"\2\2\u03e5\u02ab\3\2\2\2\u03e5\u02ad\3\2\2\2\u03e5\u02b2\3\2\2\2\u03e5"+
+               
"\u02b6\3\2\2\2\u03e5\u02ba\3\2\2\2\u03e5\u02be\3\2\2\2\u03e5\u02c1\3\2"+
+               
"\2\2\u03e5\u02c4\3\2\2\2\u03e5\u02c7\3\2\2\2\u03e5\u02cb\3\2\2\2\u03e5"+
+               
"\u02cf\3\2\2\2\u03e5\u02d3\3\2\2\2\u03e5\u02d7\3\2\2\2\u03e5\u02de\3\2"+
+               
"\2\2\u03e5\u02e5\3\2\2\2\u03e5\u02e8\3\2\2\2\u03e5\u02ed\3\2\2\2\u03e5"+
+               
"\u02f2\3\2\2\2\u03e5\u02f5\3\2\2\2\u03e5\u02fa\3\2\2\2\u03e5\u02ff\3\2"+
+               
"\2\2\u03e5\u0302\3\2\2\2\u03e5\u0306\3\2\2\2\u03e5\u030c\3\2\2\2\u03e5"+
+               
"\u0310\3\2\2\2\u03e5\u0313\3\2\2\2\u03e5\u0316\3\2\2\2\u03e5\u031b\3\2"+
+               
"\2\2\u03e5\u031e\3\2\2\2\u03e5\u0322\3\2\2\2\u03e5\u0325\3\2\2\2\u03e5"+
+               
"\u032b\3\2\2\2\u03e5\u0330\3\2\2\2\u03e5\u0334\3\2\2\2\u03e5\u0338\3\2"+
+               
"\2\2\u03e5\u033e\3\2\2\2\u03e5\u0344\3\2\2\2\u03e5\u0349\3\2\2\2\u03e5"+
+               
"\u034d\3\2\2\2\u03e5\u0351\3\2\2\2\u03e5\u0355\3\2\2\2\u03e5\u035c\3\2"+
+               
"\2\2\u03e5\u0364\3\2\2\2\u03e5\u036d\3\2\2\2\u03e5\u0376\3\2\2\2\u03e5"+
+               
"\u0379\3\2\2\2\u03e5\u037c\3\2\2\2\u03e5\u037f\3\2\2\2\u03e5\u0384\3\2"+
+               
"\2\2\u03e5\u0387\3\2\2\2\u03e5\u038b\3\2\2\2\u03e5\u0390\3\2\2\2\u03e5"+
+               
"\u039c\3\2\2\2\u03e5\u03a7\3\2\2\2\u03e5\u03b2\3\2\2\2\u03e5\u03b6\3\2"+
+               
"\2\2\u03e5\u03bc\3\2\2\2\u03e5\u03c2\3\2\2\2\u03e5\u03cf\3\2\2\2\u03e5"+
+               
"\u03db\3\2\2\2\u03e5\u03e2\3\2\2\2\u03e6\16\3\2\2\2\u03e7\u03e8\7h\2\2"+
+               
"\u03e8\u03e9\7t\2\2\u03e9\u03ea\7c\2\2\u03ea\u03eb\7i\2\2\u03eb\u03ec"+
+               
"\7o\2\2\u03ec\u03ed\7g\2\2\u03ed\u03ee\7p\2\2\u03ee\u03ef\7v\2\2\u03ef"+
+               
"\20\3\2\2\2\u03f0\u03f6\5\65\33\2\u03f1\u03f5\n\2\2\2\u03f2\u03f3\7^\2"+
+               
"\2\u03f3\u03f5\7)\2\2\u03f4\u03f1\3\2\2\2\u03f4\u03f2\3\2\2\2\u03f5\u03f8"+
+               
"\3\2\2\2\u03f6\u03f4\3\2\2\2\u03f6\u03f7\3\2\2\2\u03f7\u03f9\3\2\2\2\u03f8"+
+               
"\u03f6\3\2\2\2\u03f9\u03fa\5\65\33\2\u03fa\22\3\2\2\2\u03fb\u0401\5\67"+
+               
"\34\2\u03fc\u0400\n\3\2\2\u03fd\u03fe\7^\2\2\u03fe\u0400\7$\2\2\u03ff"+
+               
"\u03fc\3\2\2\2\u03ff\u03fd\3\2\2\2\u0400\u0403\3\2\2\2\u0401\u03ff\3\2"+
+               
"\2\2\u0401\u0402\3\2\2\2\u0402\u0404\3\2\2\2\u0403\u0401\3\2\2\2\u0404"+
+               
"\u0405\5\67\34\2\u0405\24\3\2\2\2\u0406\u0407\7v\2\2\u0407\u0408\7t\2"+
+               
"\2\u0408\u0409\7w\2\2\u0409\u0410\7g\2\2\u040a\u040b\7h\2\2\u040b\u040c"+
+               
"\7c\2\2\u040c\u040d\7n\2\2\u040d\u040e\7u\2\2\u040e\u0410\7g\2\2\u040f"+
+               
"\u0406\3\2\2\2\u040f\u040a\3\2\2\2\u0410\26\3\2\2\2\u0411\u0412\7p\2\2"+
+               
"\u0412\u0413\7w\2\2\u0413\u0414\7n\2\2\u0414\u0415\7n\2\2\u0415\30\3\2"+
+               
"\2\2\u0416\u0417\7?\2\2\u0417\u0418\7?\2\2\u0418\32\3\2\2\2\u0419\u041a"+
+               
"\7#\2\2\u041a\u041b\7?\2\2\u041b\34\3\2\2\2\u041c\u041d\7@\2\2\u041d\u041e"+
+               
"\7?\2\2\u041e\36\3\2\2\2\u041f\u0420\7>\2\2\u0420\u0421\7?\2\2\u0421 "+
+               
"\3\2\2\2\u0422\u0423\7@\2\2\u0423\"\3\2\2\2\u0424\u0425\7>\2\2\u0425$"+
+               
"\3\2\2\2\u0426\u0427\7(\2\2\u0427\u0428\7(\2\2\u0428&\3\2\2\2\u0429\u042a"+
+               
"\7~\2\2\u042a\u042b\7~\2\2\u042b(\3\2\2\2\u042c\u042d\7~\2\2\u042d*\3"+
+               
"\2\2\2\u042e\u042f\7#\2\2\u042f,\3\2\2\2\u0430\u0431\7*\2\2\u0431.\3\2"+
+               
"\2\2\u0432\u0433\7+\2\2\u0433\60\3\2\2\2\u0434\u0435\7}\2\2\u0435\62\3"+
+               
"\2\2\2\u0436\u0437\7\177\2\2\u0437\64\3\2\2\2\u0438\u0439\7)\2\2\u0439"+
+               
"\66\3\2\2\2\u043a\u043b\7$\2\2\u043b8\3\2\2\2\u043c\u043d\7\u0080\2\2"+
+               
"\u043d:\3\2\2\2\u043e\u043f\7]\2\2\u043f<\3\2\2\2\u0440\u0441\7_\2\2\u0441"+
+               
">\3\2\2\2\u0442\u0443\7%\2\2\u0443@\3\2\2\2\u0444\u0445\7.\2\2\u0445B"+
+               
"\3\2\2\2\u0446\u0447\7<\2\2\u0447D\3\2\2\2\u0448\u0449\7/\2\2\u0449F\3"+
+               
"\2\2\2\u044a\u044b\7\60\2\2\u044bH\3\2\2\2\u044c\u044d\7a\2\2\u044dJ\3"+
+               
"\2\2\2\u044e\u044f\7?\2\2\u044fL\3\2\2\2\u0450\u0451\7-\2\2\u0451N\3\2"+
+               
"\2\2\u0452\u0453\7A\2\2\u0453P\3\2\2\2\u0454\u0455\7,\2\2\u0455R\3\2\2"+
+               
"\2\u0456\u0457\7\61\2\2\u0457T\3\2\2\2\u0458\u0459\7\'\2\2\u0459V\3\2"+
+               
"\2\2\u045a\u045b\7&\2\2\u045bX\3\2\2\2\u045c\u0465\7\62\2\2\u045d\u0461"+
+               
"\t\4\2\2\u045e\u0460\t\5\2\2\u045f\u045e\3\2\2\2\u0460\u0463\3\2\2\2\u0461"+
+               
"\u045f\3\2\2\2\u0461\u0462\3\2\2\2\u0462\u0465\3\2\2\2\u0463\u0461\3\2"+
+               
"\2\2\u0464\u045c\3\2\2\2\u0464\u045d\3\2\2\2\u0465Z\3\2\2\2\u0466\u0468"+
+               
"\5G$\2\u0467\u0469\t\6\2\2\u0468\u0467\3\2\2\2\u0469\u046a\3\2\2\2\u046a"+
+               
"\u0468\3\2\2\2\u046a\u046b\3\2\2\2\u046b\\\3\2\2\2\u046c\u046e\t\7\2\2"+
+               
"\u046d\u046f\t\b\2\2\u046e\u046d\3\2\2\2\u046e\u046f\3\2\2\2\u046f\u0470"+
+               
"\3\2\2\2\u0470\u0471\5Y-\2\u0471^\3\2\2\2\u0472\u0473\t\t\2\2\u0473`\3"+
+               
"\2\2\2\u0474\u0475\t\n\2\2\u0475b\3\2\2\2\u0476\u047b\5_\60\2\u0477\u047b"+
+               
"\5I%\2\u0478\u047b\5a\61\2\u0479\u047b\5W,\2\u047a\u0476\3\2\2\2\u047a"+
+               
"\u0477\3\2\2\2\u047a\u0478\3\2\2\2\u047a\u0479\3\2\2\2\u047b\u047c\3\2"+
+               
"\2\2\u047c\u047a\3\2\2\2\u047c\u047d\3\2\2\2\u047d\u0487\3\2\2\2\u047e"+
+               
"\u0486\5_\60\2\u047f\u0486\5W,\2\u0480\u0486\5a\61\2\u0481\u0486\t\6\2"+
+               
"\2\u0482\u0486\5C\"\2\u0483\u0486\5E#\2\u0484\u0486\5I%\2\u0485\u047e"+
+               
"\3\2\2\2\u0485\u047f\3\2\2\2\u0485\u0480\3\2\2\2\u0485\u0481\3\2\2\2\u0485"+
+               
"\u0482\3\2\2\2\u0485\u0483\3\2\2\2\u0485\u0484\3\2\2\2\u0486\u0489\3\2"+
+               
"\2\2\u0487\u0485\3\2\2\2\u0487\u0488\3\2\2\2\u0488d\3\2\2\2\u0489\u0487"+
+               
"\3\2\2\2\u048a\u048b\7\61\2\2\u048b\u048c\7\61\2\2\u048c\u0490\3\2\2\2"+
+               
"\u048d\u048f\n\13\2\2\u048e\u048d\3\2\2\2\u048f\u0492\3\2\2\2\u0490\u048e"+
+               
"\3\2\2\2\u0490\u0491\3\2\2\2\u0491\u0494\3\2\2\2\u0492\u0490\3\2\2\2\u0493"+
+               
"\u0495\7\17\2\2\u0494\u0493\3\2\2\2\u0494\u0495\3\2\2\2\u0495\u0497\3"+
+               
"\2\2\2\u0496\u0498\t\f\2\2\u0497\u0496\3\2\2\2\u0498\u04a5\3\2\2\2\u0499"+
+               
"\u049a\7\61\2\2\u049a\u049b\7,\2\2\u049b\u049f\3\2\2\2\u049c\u049e\13"+
+               
"\2\2\2\u049d\u049c\3\2\2\2\u049e\u04a1\3\2\2\2\u049f\u04a0\3\2\2\2\u049f"+
+               
"\u049d\3\2\2\2\u04a0\u04a2\3\2\2\2\u04a1\u049f\3\2\2\2\u04a2\u04a3\7,"+
+               
"\2\2\u04a3\u04a5\7\61\2\2\u04a4\u048a\3\2\2\2\u04a4\u0499\3\2\2\2\u04a5"+
+               
"\u04a6\3\2\2\2\u04a6\u04a7\b\63\2\2\u04a7f\3\2\2\2\u04a8\u04aa\t\r\2\2"+
+               
"\u04a9\u04a8\3\2\2\2\u04aa\u04ab\3\2\2\2\u04ab\u04a9\3\2\2\2\u04ab\u04ac"+
+               
"\3\2\2\2\u04ac\u04ad\3\2\2\2\u04ad\u04ae\b\64\2\2\u04aeh\3\2\2\2\u04af"+
+               
"\u04b0\13\2\2\2\u04b0j\3\2\2\2\27\2\u03e5\u03f4\u03f6\u03ff\u0401\u040f"+
+               
"\u0461\u0464\u046a\u046e\u047a\u047c\u0485\u0487\u0490\u0494\u0497\u049f"+
+               "\u04a4\u04ab\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/NCIntentDslListener.java
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslListener.java
index 88a072e..904069b 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
@@ -18,6 +18,26 @@ public interface NCIntentDslListener extends 
ParseTreeListener {
         */
        void exitDsl(NCIntentDslParser.DslContext ctx);
        /**
+        * Enter a parse tree produced by {@link NCIntentDslParser#synonym}.
+        * @param ctx the parse tree
+        */
+       void enterSynonym(NCIntentDslParser.SynonymContext ctx);
+       /**
+        * Exit a parse tree produced by {@link NCIntentDslParser#synonym}.
+        * @param ctx the parse tree
+        */
+       void exitSynonym(NCIntentDslParser.SynonymContext ctx);
+       /**
+        * Enter a parse tree produced by {@link NCIntentDslParser#alias}.
+        * @param ctx the parse tree
+        */
+       void enterAlias(NCIntentDslParser.AliasContext ctx);
+       /**
+        * Exit a parse tree produced by {@link NCIntentDslParser#alias}.
+        * @param ctx the parse tree
+        */
+       void exitAlias(NCIntentDslParser.AliasContext ctx);
+       /**
         * Enter a parse tree produced by {@link NCIntentDslParser#dslItems}.
         * @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 deada0d..976d4c3 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
@@ -25,21 +25,21 @@ public class NCIntentDslParser extends Parser {
                DIV=41, MOD=42, DOLLAR=43, INT=44, REAL=45, EXP=46, ID=47, 
COMMENT=48, 
                WS=49, ErrorChar=50;
        public static final int
-               RULE_dsl = 0, RULE_dslItems = 1, RULE_dslItem = 2, RULE_frag = 
3, RULE_fragId = 4, 
-               RULE_fragRef = 5, RULE_fragMeta = 6, RULE_intent = 7, 
RULE_intentId = 8, 
-               RULE_orderedDecl = 9, RULE_mtdDecl = 10, RULE_flowDecl = 11, 
RULE_metaDecl = 12, 
-               RULE_jsonObj = 13, RULE_jsonPair = 14, RULE_jsonVal = 15, 
RULE_jsonArr = 16, 
-               RULE_terms = 17, RULE_termItem = 18, RULE_termEq = 19, 
RULE_term = 20, 
-               RULE_mtdRef = 21, RULE_javaFqn = 22, RULE_termId = 23, 
RULE_expr = 24, 
-               RULE_paramList = 25, RULE_atom = 26, RULE_qstring = 27, 
RULE_minMax = 28, 
-               RULE_minMaxShortcut = 29, RULE_minMaxRange = 30, RULE_id = 31;
+               RULE_dsl = 0, RULE_synonym = 1, RULE_alias = 2, RULE_dslItems = 
3, RULE_dslItem = 4, 
+               RULE_frag = 5, RULE_fragId = 6, RULE_fragRef = 7, RULE_fragMeta 
= 8, RULE_intent = 9, 
+               RULE_intentId = 10, RULE_orderedDecl = 11, RULE_mtdDecl = 12, 
RULE_flowDecl = 13, 
+               RULE_metaDecl = 14, RULE_jsonObj = 15, RULE_jsonPair = 16, 
RULE_jsonVal = 17, 
+               RULE_jsonArr = 18, RULE_terms = 19, RULE_termItem = 20, 
RULE_termEq = 21, 
+               RULE_term = 22, RULE_mtdRef = 23, RULE_javaFqn = 24, 
RULE_termId = 25, 
+               RULE_expr = 26, RULE_paramList = 27, RULE_atom = 28, 
RULE_qstring = 29, 
+               RULE_minMax = 30, RULE_minMaxShortcut = 31, RULE_minMaxRange = 
32, RULE_id = 33;
        private static String[] makeRuleNames() {
                return new String[] {
-                       "dsl", "dslItems", "dslItem", "frag", "fragId", 
"fragRef", "fragMeta", 
-                       "intent", "intentId", "orderedDecl", "mtdDecl", 
"flowDecl", "metaDecl", 
-                       "jsonObj", "jsonPair", "jsonVal", "jsonArr", "terms", 
"termItem", "termEq", 
-                       "term", "mtdRef", "javaFqn", "termId", "expr", 
"paramList", "atom", "qstring", 
-                       "minMax", "minMaxShortcut", "minMaxRange", "id"
+                       "dsl", "synonym", "alias", "dslItems", "dslItem", 
"frag", "fragId", "fragRef", 
+                       "fragMeta", "intent", "intentId", "orderedDecl", 
"mtdDecl", "flowDecl", 
+                       "metaDecl", "jsonObj", "jsonPair", "jsonVal", 
"jsonArr", "terms", "termItem", 
+                       "termEq", "term", "mtdRef", "javaFqn", "termId", 
"expr", "paramList", 
+                       "atom", "qstring", "minMax", "minMaxShortcut", 
"minMaxRange", "id"
                };
        }
        public static final String[] ruleNames = makeRuleNames();
@@ -140,9 +140,9 @@ public class NCIntentDslParser extends Parser {
                try {
                        enterOuterAlt(_localctx, 1);
                        {
-                       setState(64);
+                       setState(68);
                        dslItems(0);
-                       setState(65);
+                       setState(69);
                        match(EOF);
                        }
                }
@@ -157,6 +157,113 @@ public class NCIntentDslParser extends Parser {
                return _localctx;
        }
 
+       public static class SynonymContext extends ParserRuleContext {
+               public TerminalNode LBRACE() { return 
getToken(NCIntentDslParser.LBRACE, 0); }
+               public ExprContext expr() {
+                       return getRuleContext(ExprContext.class,0);
+               }
+               public TerminalNode RBRACE() { return 
getToken(NCIntentDslParser.RBRACE, 0); }
+               public TerminalNode EOF() { return 
getToken(NCIntentDslParser.EOF, 0); }
+               public AliasContext alias() {
+                       return getRuleContext(AliasContext.class,0);
+               }
+               public SynonymContext(ParserRuleContext parent, int 
invokingState) {
+                       super(parent, invokingState);
+               }
+               @Override public int getRuleIndex() { return RULE_synonym; }
+               @Override
+               public void enterRule(ParseTreeListener listener) {
+                       if ( listener instanceof NCIntentDslListener ) 
((NCIntentDslListener)listener).enterSynonym(this);
+               }
+               @Override
+               public void exitRule(ParseTreeListener listener) {
+                       if ( listener instanceof NCIntentDslListener ) 
((NCIntentDslListener)listener).exitSynonym(this);
+               }
+       }
+
+       public final SynonymContext synonym() throws RecognitionException {
+               SynonymContext _localctx = new SynonymContext(_ctx, getState());
+               enterRule(_localctx, 2, RULE_synonym);
+               int _la;
+               try {
+                       enterOuterAlt(_localctx, 1);
+                       {
+                       setState(72);
+                       _errHandler.sync(this);
+                       _la = _input.LA(1);
+                       if (_la==LBR) {
+                               {
+                               setState(71);
+                               alias();
+                               }
+                       }
+
+                       setState(74);
+                       match(LBRACE);
+                       setState(75);
+                       expr(0);
+                       setState(76);
+                       match(RBRACE);
+                       setState(77);
+                       match(EOF);
+                       }
+               }
+               catch (RecognitionException re) {
+                       _localctx.exception = re;
+                       _errHandler.reportError(this, re);
+                       _errHandler.recover(this, re);
+               }
+               finally {
+                       exitRule();
+               }
+               return _localctx;
+       }
+
+       public static class AliasContext extends ParserRuleContext {
+               public TerminalNode LBR() { return 
getToken(NCIntentDslParser.LBR, 0); }
+               public IdContext id() {
+                       return getRuleContext(IdContext.class,0);
+               }
+               public TerminalNode RBR() { return 
getToken(NCIntentDslParser.RBR, 0); }
+               public AliasContext(ParserRuleContext parent, int 
invokingState) {
+                       super(parent, invokingState);
+               }
+               @Override public int getRuleIndex() { return RULE_alias; }
+               @Override
+               public void enterRule(ParseTreeListener listener) {
+                       if ( listener instanceof NCIntentDslListener ) 
((NCIntentDslListener)listener).enterAlias(this);
+               }
+               @Override
+               public void exitRule(ParseTreeListener listener) {
+                       if ( listener instanceof NCIntentDslListener ) 
((NCIntentDslListener)listener).exitAlias(this);
+               }
+       }
+
+       public final AliasContext alias() throws RecognitionException {
+               AliasContext _localctx = new AliasContext(_ctx, getState());
+               enterRule(_localctx, 4, RULE_alias);
+               try {
+                       enterOuterAlt(_localctx, 1);
+                       {
+                       setState(79);
+                       match(LBR);
+                       setState(80);
+                       id();
+                       setState(81);
+                       match(RBR);
+                       }
+               }
+               catch (RecognitionException re) {
+                       _localctx.exception = re;
+                       _errHandler.reportError(this, re);
+                       _errHandler.recover(this, re);
+               }
+               finally {
+                       exitRule();
+               }
+               return _localctx;
+       }
+
        public static class DslItemsContext extends ParserRuleContext {
                public DslItemContext dslItem() {
                        return getRuleContext(DslItemContext.class,0);
@@ -187,20 +294,20 @@ public class NCIntentDslParser extends Parser {
                int _parentState = getState();
                DslItemsContext _localctx = new DslItemsContext(_ctx, 
_parentState);
                DslItemsContext _prevctx = _localctx;
-               int _startState = 2;
-               enterRecursionRule(_localctx, 2, RULE_dslItems, _p);
+               int _startState = 6;
+               enterRecursionRule(_localctx, 6, RULE_dslItems, _p);
                try {
                        int _alt;
                        enterOuterAlt(_localctx, 1);
                        {
                        {
-                       setState(68);
+                       setState(84);
                        dslItem();
                        }
                        _ctx.stop = _input.LT(-1);
-                       setState(74);
+                       setState(90);
                        _errHandler.sync(this);
-                       _alt = getInterpreter().adaptivePredict(_input,0,_ctx);
+                       _alt = getInterpreter().adaptivePredict(_input,1,_ctx);
                        while ( _alt!=2 && 
_alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
                                if ( _alt==1 ) {
                                        if ( _parseListeners!=null ) 
triggerExitRuleEvent();
@@ -209,16 +316,16 @@ public class NCIntentDslParser extends Parser {
                                        {
                                        _localctx = new 
DslItemsContext(_parentctx, _parentState);
                                        pushNewRecursionContext(_localctx, 
_startState, RULE_dslItems);
-                                       setState(70);
+                                       setState(86);
                                        if (!(precpred(_ctx, 1))) throw new 
FailedPredicateException(this, "precpred(_ctx, 1)");
-                                       setState(71);
+                                       setState(87);
                                        dslItem();
                                        }
                                        } 
                                }
-                               setState(76);
+                               setState(92);
                                _errHandler.sync(this);
-                               _alt = 
getInterpreter().adaptivePredict(_input,0,_ctx);
+                               _alt = 
getInterpreter().adaptivePredict(_input,1,_ctx);
                        }
                        }
                }
@@ -256,22 +363,22 @@ public class NCIntentDslParser extends Parser {
 
        public final DslItemContext dslItem() throws RecognitionException {
                DslItemContext _localctx = new DslItemContext(_ctx, getState());
-               enterRule(_localctx, 4, RULE_dslItem);
+               enterRule(_localctx, 8, RULE_dslItem);
                try {
-                       setState(79);
+                       setState(95);
                        _errHandler.sync(this);
                        switch (_input.LA(1)) {
                        case T__0:
                                enterOuterAlt(_localctx, 1);
                                {
-                               setState(77);
+                               setState(93);
                                intent();
                                }
                                break;
                        case FRAG:
                                enterOuterAlt(_localctx, 2);
                                {
-                               setState(78);
+                               setState(94);
                                frag();
                                }
                                break;
@@ -313,13 +420,13 @@ public class NCIntentDslParser extends Parser {
 
        public final FragContext frag() throws RecognitionException {
                FragContext _localctx = new FragContext(_ctx, getState());
-               enterRule(_localctx, 6, RULE_frag);
+               enterRule(_localctx, 10, RULE_frag);
                try {
                        enterOuterAlt(_localctx, 1);
                        {
-                       setState(81);
+                       setState(97);
                        fragId();
-                       setState(82);
+                       setState(98);
                        terms(0);
                        }
                }
@@ -356,15 +463,15 @@ public class NCIntentDslParser extends Parser {
 
        public final FragIdContext fragId() throws RecognitionException {
                FragIdContext _localctx = new FragIdContext(_ctx, getState());
-               enterRule(_localctx, 8, RULE_fragId);
+               enterRule(_localctx, 12, RULE_fragId);
                try {
                        enterOuterAlt(_localctx, 1);
                        {
-                       setState(84);
+                       setState(100);
                        match(FRAG);
-                       setState(85);
+                       setState(101);
                        match(ASSIGN);
-                       setState(86);
+                       setState(102);
                        id();
                        }
                }
@@ -405,28 +512,28 @@ public class NCIntentDslParser extends Parser {
 
        public final FragRefContext fragRef() throws RecognitionException {
                FragRefContext _localctx = new FragRefContext(_ctx, getState());
-               enterRule(_localctx, 10, RULE_fragRef);
+               enterRule(_localctx, 14, RULE_fragRef);
                int _la;
                try {
                        enterOuterAlt(_localctx, 1);
                        {
-                       setState(88);
+                       setState(104);
                        match(FRAG);
-                       setState(89);
+                       setState(105);
                        match(LPAR);
-                       setState(90);
+                       setState(106);
                        id();
-                       setState(92);
+                       setState(108);
                        _errHandler.sync(this);
                        _la = _input.LA(1);
                        if (_la==COMMA) {
                                {
-                               setState(91);
+                               setState(107);
                                fragMeta();
                                }
                        }
 
-                       setState(94);
+                       setState(110);
                        match(RPAR);
                        }
                }
@@ -462,13 +569,13 @@ public class NCIntentDslParser extends Parser {
 
        public final FragMetaContext fragMeta() throws RecognitionException {
                FragMetaContext _localctx = new FragMetaContext(_ctx, 
getState());
-               enterRule(_localctx, 12, RULE_fragMeta);
+               enterRule(_localctx, 16, RULE_fragMeta);
                try {
                        enterOuterAlt(_localctx, 1);
                        {
-                       setState(96);
+                       setState(112);
                        match(COMMA);
-                       setState(97);
+                       setState(113);
                        jsonObj();
                        }
                }
@@ -515,44 +622,44 @@ public class NCIntentDslParser extends Parser {
 
        public final IntentContext intent() throws RecognitionException {
                IntentContext _localctx = new IntentContext(_ctx, getState());
-               enterRule(_localctx, 14, RULE_intent);
+               enterRule(_localctx, 18, RULE_intent);
                int _la;
                try {
                        enterOuterAlt(_localctx, 1);
                        {
-                       setState(99);
+                       setState(115);
                        intentId();
-                       setState(101);
+                       setState(117);
                        _errHandler.sync(this);
                        _la = _input.LA(1);
                        if (_la==T__1) {
                                {
-                               setState(100);
+                               setState(116);
                                orderedDecl();
                                }
                        }
 
-                       setState(104);
+                       setState(120);
                        _errHandler.sync(this);
                        _la = _input.LA(1);
                        if (_la==T__2) {
                                {
-                               setState(103);
+                               setState(119);
                                flowDecl();
                                }
                        }
 
-                       setState(107);
+                       setState(123);
                        _errHandler.sync(this);
                        _la = _input.LA(1);
                        if (_la==T__3) {
                                {
-                               setState(106);
+                               setState(122);
                                metaDecl();
                                }
                        }
 
-                       setState(109);
+                       setState(125);
                        terms(0);
                        }
                }
@@ -588,15 +695,15 @@ public class NCIntentDslParser extends Parser {
 
        public final IntentIdContext intentId() throws RecognitionException {
                IntentIdContext _localctx = new IntentIdContext(_ctx, 
getState());
-               enterRule(_localctx, 16, RULE_intentId);
+               enterRule(_localctx, 20, RULE_intentId);
                try {
                        enterOuterAlt(_localctx, 1);
                        {
-                       setState(111);
+                       setState(127);
                        match(T__0);
-                       setState(112);
+                       setState(128);
                        match(ASSIGN);
-                       setState(113);
+                       setState(129);
                        id();
                        }
                }
@@ -630,15 +737,15 @@ public class NCIntentDslParser extends Parser {
 
        public final OrderedDeclContext orderedDecl() throws 
RecognitionException {
                OrderedDeclContext _localctx = new OrderedDeclContext(_ctx, 
getState());
-               enterRule(_localctx, 18, RULE_orderedDecl);
+               enterRule(_localctx, 22, RULE_orderedDecl);
                try {
                        enterOuterAlt(_localctx, 1);
                        {
-                       setState(115);
+                       setState(131);
                        match(T__1);
-                       setState(116);
+                       setState(132);
                        match(ASSIGN);
-                       setState(117);
+                       setState(133);
                        match(BOOL);
                        }
                }
@@ -677,15 +784,15 @@ public class NCIntentDslParser extends Parser {
 
        public final MtdDeclContext mtdDecl() throws RecognitionException {
                MtdDeclContext _localctx = new MtdDeclContext(_ctx, getState());
-               enterRule(_localctx, 20, RULE_mtdDecl);
+               enterRule(_localctx, 24, RULE_mtdDecl);
                try {
                        enterOuterAlt(_localctx, 1);
                        {
-                       setState(119);
+                       setState(135);
                        match(DIV);
-                       setState(120);
+                       setState(136);
                        mtdRef();
-                       setState(121);
+                       setState(137);
                        match(DIV);
                        }
                }
@@ -724,27 +831,27 @@ public class NCIntentDslParser extends Parser {
 
        public final FlowDeclContext flowDecl() throws RecognitionException {
                FlowDeclContext _localctx = new FlowDeclContext(_ctx, 
getState());
-               enterRule(_localctx, 22, RULE_flowDecl);
+               enterRule(_localctx, 26, RULE_flowDecl);
                try {
                        enterOuterAlt(_localctx, 1);
                        {
-                       setState(123);
+                       setState(139);
                        match(T__2);
-                       setState(124);
+                       setState(140);
                        match(ASSIGN);
-                       setState(127);
+                       setState(143);
                        _errHandler.sync(this);
                        switch (_input.LA(1)) {
                        case SQSTRING:
                        case DQSTRING:
                                {
-                               setState(125);
+                               setState(141);
                                qstring();
                                }
                                break;
                        case DIV:
                                {
-                               setState(126);
+                               setState(142);
                                mtdDecl();
                                }
                                break;
@@ -785,15 +892,15 @@ public class NCIntentDslParser extends Parser {
 
        public final MetaDeclContext metaDecl() throws RecognitionException {
                MetaDeclContext _localctx = new MetaDeclContext(_ctx, 
getState());
-               enterRule(_localctx, 24, RULE_metaDecl);
+               enterRule(_localctx, 28, RULE_metaDecl);
                try {
                        enterOuterAlt(_localctx, 1);
                        {
-                       setState(129);
+                       setState(145);
                        match(T__3);
-                       setState(130);
+                       setState(146);
                        match(ASSIGN);
-                       setState(131);
+                       setState(147);
                        jsonObj();
                        }
                }
@@ -837,45 +944,45 @@ public class NCIntentDslParser extends Parser {
 
        public final JsonObjContext jsonObj() throws RecognitionException {
                JsonObjContext _localctx = new JsonObjContext(_ctx, getState());
-               enterRule(_localctx, 26, RULE_jsonObj);
+               enterRule(_localctx, 30, RULE_jsonObj);
                int _la;
                try {
-                       setState(146);
+                       setState(162);
                        _errHandler.sync(this);
-                       switch ( 
getInterpreter().adaptivePredict(_input,8,_ctx) ) {
+                       switch ( 
getInterpreter().adaptivePredict(_input,9,_ctx) ) {
                        case 1:
                                enterOuterAlt(_localctx, 1);
                                {
-                               setState(133);
+                               setState(149);
                                match(LBRACE);
-                               setState(134);
+                               setState(150);
                                jsonPair();
-                               setState(139);
+                               setState(155);
                                _errHandler.sync(this);
                                _la = _input.LA(1);
                                while (_la==COMMA) {
                                        {
                                        {
-                                       setState(135);
+                                       setState(151);
                                        match(COMMA);
-                                       setState(136);
+                                       setState(152);
                                        jsonPair();
                                        }
                                        }
-                                       setState(141);
+                                       setState(157);
                                        _errHandler.sync(this);
                                        _la = _input.LA(1);
                                }
-                               setState(142);
+                               setState(158);
                                match(RBRACE);
                                }
                                break;
                        case 2:
                                enterOuterAlt(_localctx, 2);
                                {
-                               setState(144);
+                               setState(160);
                                match(LBRACE);
-                               setState(145);
+                               setState(161);
                                match(RBRACE);
                                }
                                break;
@@ -916,15 +1023,15 @@ public class NCIntentDslParser extends Parser {
 
        public final JsonPairContext jsonPair() throws RecognitionException {
                JsonPairContext _localctx = new JsonPairContext(_ctx, 
getState());
-               enterRule(_localctx, 28, RULE_jsonPair);
+               enterRule(_localctx, 32, RULE_jsonPair);
                try {
                        enterOuterAlt(_localctx, 1);
                        {
-                       setState(148);
+                       setState(164);
                        qstring();
-                       setState(149);
+                       setState(165);
                        match(COLON);
-                       setState(150);
+                       setState(166);
                        jsonVal();
                        }
                }
@@ -971,17 +1078,17 @@ public class NCIntentDslParser extends Parser {
 
        public final JsonValContext jsonVal() throws RecognitionException {
                JsonValContext _localctx = new JsonValContext(_ctx, getState());
-               enterRule(_localctx, 30, RULE_jsonVal);
+               enterRule(_localctx, 34, RULE_jsonVal);
                int _la;
                try {
-                       setState(167);
+                       setState(183);
                        _errHandler.sync(this);
                        switch (_input.LA(1)) {
                        case SQSTRING:
                        case DQSTRING:
                                enterOuterAlt(_localctx, 1);
                                {
-                               setState(152);
+                               setState(168);
                                qstring();
                                }
                                break;
@@ -989,34 +1096,34 @@ public class NCIntentDslParser extends Parser {
                        case INT:
                                enterOuterAlt(_localctx, 2);
                                {
-                               setState(154);
+                               setState(170);
                                _errHandler.sync(this);
                                _la = _input.LA(1);
                                if (_la==MINUS) {
                                        {
-                                       setState(153);
+                                       setState(169);
                                        match(MINUS);
                                        }
                                }
 
-                               setState(156);
+                               setState(172);
                                match(INT);
-                               setState(158);
+                               setState(174);
                                _errHandler.sync(this);
                                _la = _input.LA(1);
                                if (_la==REAL) {
                                        {
-                                       setState(157);
+                                       setState(173);
                                        match(REAL);
                                        }
                                }
 
-                               setState(161);
+                               setState(177);
                                _errHandler.sync(this);
                                _la = _input.LA(1);
                                if (_la==EXP) {
                                        {
-                                       setState(160);
+                                       setState(176);
                                        match(EXP);
                                        }
                                }
@@ -1026,28 +1133,28 @@ public class NCIntentDslParser extends Parser {
                        case LBRACE:
                                enterOuterAlt(_localctx, 3);
                                {
-                               setState(163);
+                               setState(179);
                                jsonObj();
                                }
                                break;
                        case LBR:
                                enterOuterAlt(_localctx, 4);
                                {
-                               setState(164);
+                               setState(180);
                                jsonArr();
                                }
                                break;
                        case BOOL:
                                enterOuterAlt(_localctx, 5);
                                {
-                               setState(165);
+                               setState(181);
                                match(BOOL);
                                }
                                break;
                        case NULL:
                                enterOuterAlt(_localctx, 6);
                                {
-                               setState(166);
+                               setState(182);
                                match(NULL);
                                }
                                break;
@@ -1095,45 +1202,45 @@ public class NCIntentDslParser extends Parser {
 
        public final JsonArrContext jsonArr() throws RecognitionException {
                JsonArrContext _localctx = new JsonArrContext(_ctx, getState());
-               enterRule(_localctx, 32, RULE_jsonArr);
+               enterRule(_localctx, 36, RULE_jsonArr);
                int _la;
                try {
-                       setState(182);
+                       setState(198);
                        _errHandler.sync(this);
-                       switch ( 
getInterpreter().adaptivePredict(_input,14,_ctx) ) {
+                       switch ( 
getInterpreter().adaptivePredict(_input,15,_ctx) ) {
                        case 1:
                                enterOuterAlt(_localctx, 1);
                                {
-                               setState(169);
+                               setState(185);
                                match(LBR);
-                               setState(170);
+                               setState(186);
                                jsonVal();
-                               setState(175);
+                               setState(191);
                                _errHandler.sync(this);
                                _la = _input.LA(1);
                                while (_la==COMMA) {
                                        {
                                        {
-                                       setState(171);
+                                       setState(187);
                                        match(COMMA);
-                                       setState(172);
+                                       setState(188);
                                        jsonVal();
                                        }
                                        }
-                                       setState(177);
+                                       setState(193);
                                        _errHandler.sync(this);
                                        _la = _input.LA(1);
                                }
-                               setState(178);
+                               setState(194);
                                match(RBR);
                                }
                                break;
                        case 2:
                                enterOuterAlt(_localctx, 2);
                                {
-                               setState(180);
+                               setState(196);
                                match(LBR);
-                               setState(181);
+                               setState(197);
                                match(RBR);
                                }
                                break;
@@ -1180,20 +1287,20 @@ public class NCIntentDslParser extends Parser {
                int _parentState = getState();
                TermsContext _localctx = new TermsContext(_ctx, _parentState);
                TermsContext _prevctx = _localctx;
-               int _startState = 34;
-               enterRecursionRule(_localctx, 34, RULE_terms, _p);
+               int _startState = 38;
+               enterRecursionRule(_localctx, 38, RULE_terms, _p);
                try {
                        int _alt;
                        enterOuterAlt(_localctx, 1);
                        {
                        {
-                       setState(185);
+                       setState(201);
                        termItem();
                        }
                        _ctx.stop = _input.LT(-1);
-                       setState(191);
+                       setState(207);
                        _errHandler.sync(this);
-                       _alt = getInterpreter().adaptivePredict(_input,15,_ctx);
+                       _alt = getInterpreter().adaptivePredict(_input,16,_ctx);
                        while ( _alt!=2 && 
_alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
                                if ( _alt==1 ) {
                                        if ( _parseListeners!=null ) 
triggerExitRuleEvent();
@@ -1202,16 +1309,16 @@ public class NCIntentDslParser extends Parser {
                                        {
                                        _localctx = new 
TermsContext(_parentctx, _parentState);
                                        pushNewRecursionContext(_localctx, 
_startState, RULE_terms);
-                                       setState(187);
+                                       setState(203);
                                        if (!(precpred(_ctx, 1))) throw new 
FailedPredicateException(this, "precpred(_ctx, 1)");
-                                       setState(188);
+                                       setState(204);
                                        termItem();
                                        }
                                        } 
                                }
-                               setState(193);
+                               setState(209);
                                _errHandler.sync(this);
-                               _alt = 
getInterpreter().adaptivePredict(_input,15,_ctx);
+                               _alt = 
getInterpreter().adaptivePredict(_input,16,_ctx);
                        }
                        }
                }
@@ -1249,22 +1356,22 @@ public class NCIntentDslParser extends Parser {
 
        public final TermItemContext termItem() throws RecognitionException {
                TermItemContext _localctx = new TermItemContext(_ctx, 
getState());
-               enterRule(_localctx, 36, RULE_termItem);
+               enterRule(_localctx, 40, RULE_termItem);
                try {
-                       setState(196);
+                       setState(212);
                        _errHandler.sync(this);
                        switch (_input.LA(1)) {
                        case T__4:
                                enterOuterAlt(_localctx, 1);
                                {
-                               setState(194);
+                               setState(210);
                                term();
                                }
                                break;
                        case FRAG:
                                enterOuterAlt(_localctx, 2);
                                {
-                               setState(195);
+                               setState(211);
                                fragRef();
                                }
                                break;
@@ -1302,12 +1409,12 @@ public class NCIntentDslParser extends Parser {
 
        public final TermEqContext termEq() throws RecognitionException {
                TermEqContext _localctx = new TermEqContext(_ctx, getState());
-               enterRule(_localctx, 38, RULE_termEq);
+               enterRule(_localctx, 42, RULE_termEq);
                int _la;
                try {
                        enterOuterAlt(_localctx, 1);
                        {
-                       setState(198);
+                       setState(214);
                        _la = _input.LA(1);
                        if ( !(_la==TILDA || _la==ASSIGN) ) {
                        _errHandler.recoverInline(this);
@@ -1364,55 +1471,55 @@ public class NCIntentDslParser extends Parser {
 
        public final TermContext term() throws RecognitionException {
                TermContext _localctx = new TermContext(_ctx, getState());
-               enterRule(_localctx, 40, RULE_term);
+               enterRule(_localctx, 44, RULE_term);
                int _la;
                try {
                        enterOuterAlt(_localctx, 1);
                        {
-                       setState(200);
+                       setState(216);
                        match(T__4);
-                       setState(202);
+                       setState(218);
                        _errHandler.sync(this);
                        _la = _input.LA(1);
                        if (_la==LPAR) {
                                {
-                               setState(201);
+                               setState(217);
                                termId();
                                }
                        }
 
-                       setState(204);
+                       setState(220);
                        termEq();
-                       setState(210);
+                       setState(226);
                        _errHandler.sync(this);
                        switch (_input.LA(1)) {
                        case LBRACE:
                                {
                                {
-                               setState(205);
+                               setState(221);
                                match(LBRACE);
-                               setState(206);
+                               setState(222);
                                expr(0);
-                               setState(207);
+                               setState(223);
                                match(RBRACE);
                                }
                                }
                                break;
                        case DIV:
                                {
-                               setState(209);
+                               setState(225);
                                mtdDecl();
                                }
                                break;
                        default:
                                throw new NoViableAltException(this);
                        }
-                       setState(213);
+                       setState(229);
                        _errHandler.sync(this);
-                       switch ( 
getInterpreter().adaptivePredict(_input,19,_ctx) ) {
+                       switch ( 
getInterpreter().adaptivePredict(_input,20,_ctx) ) {
                        case 1:
                                {
-                               setState(212);
+                               setState(228);
                                minMax();
                                }
                                break;
@@ -1454,24 +1561,24 @@ public class NCIntentDslParser extends Parser {
 
        public final MtdRefContext mtdRef() throws RecognitionException {
                MtdRefContext _localctx = new MtdRefContext(_ctx, getState());
-               enterRule(_localctx, 42, RULE_mtdRef);
+               enterRule(_localctx, 46, RULE_mtdRef);
                int _la;
                try {
                        enterOuterAlt(_localctx, 1);
                        {
-                       setState(216);
+                       setState(232);
                        _errHandler.sync(this);
                        _la = _input.LA(1);
                        if (_la==FUN_NAME || _la==ID) {
                                {
-                               setState(215);
+                               setState(231);
                                javaFqn(0);
                                }
                        }
 
-                       setState(218);
+                       setState(234);
                        match(POUND);
-                       setState(219);
+                       setState(235);
                        id();
                        }
                }
@@ -1517,20 +1624,20 @@ public class NCIntentDslParser extends Parser {
                int _parentState = getState();
                JavaFqnContext _localctx = new JavaFqnContext(_ctx, 
_parentState);
                JavaFqnContext _prevctx = _localctx;
-               int _startState = 44;
-               enterRecursionRule(_localctx, 44, RULE_javaFqn, _p);
+               int _startState = 48;
+               enterRecursionRule(_localctx, 48, RULE_javaFqn, _p);
                try {
                        int _alt;
                        enterOuterAlt(_localctx, 1);
                        {
                        {
-                       setState(222);
+                       setState(238);
                        id();
                        }
                        _ctx.stop = _input.LT(-1);
-                       setState(229);
+                       setState(245);
                        _errHandler.sync(this);
-                       _alt = getInterpreter().adaptivePredict(_input,21,_ctx);
+                       _alt = getInterpreter().adaptivePredict(_input,22,_ctx);
                        while ( _alt!=2 && 
_alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
                                if ( _alt==1 ) {
                                        if ( _parseListeners!=null ) 
triggerExitRuleEvent();
@@ -1539,18 +1646,18 @@ public class NCIntentDslParser extends Parser {
                                        {
                                        _localctx = new 
JavaFqnContext(_parentctx, _parentState);
                                        pushNewRecursionContext(_localctx, 
_startState, RULE_javaFqn);
-                                       setState(224);
+                                       setState(240);
                                        if (!(precpred(_ctx, 1))) throw new 
FailedPredicateException(this, "precpred(_ctx, 1)");
-                                       setState(225);
+                                       setState(241);
                                        match(DOT);
-                                       setState(226);
+                                       setState(242);
                                        id();
                                        }
                                        } 
                                }
-                               setState(231);
+                               setState(247);
                                _errHandler.sync(this);
-                               _alt = 
getInterpreter().adaptivePredict(_input,21,_ctx);
+                               _alt = 
getInterpreter().adaptivePredict(_input,22,_ctx);
                        }
                        }
                }
@@ -1587,15 +1694,15 @@ public class NCIntentDslParser extends Parser {
 
        public final TermIdContext termId() throws RecognitionException {
                TermIdContext _localctx = new TermIdContext(_ctx, getState());
-               enterRule(_localctx, 46, RULE_termId);
+               enterRule(_localctx, 50, RULE_termId);
                try {
                        enterOuterAlt(_localctx, 1);
                        {
-                       setState(232);
+                       setState(248);
                        match(LPAR);
-                       setState(233);
+                       setState(249);
                        id();
-                       setState(234);
+                       setState(250);
                        match(RPAR);
                        }
                }
@@ -1798,14 +1905,14 @@ public class NCIntentDslParser extends Parser {
                int _parentState = getState();
                ExprContext _localctx = new ExprContext(_ctx, _parentState);
                ExprContext _prevctx = _localctx;
-               int _startState = 48;
-               enterRecursionRule(_localctx, 48, RULE_expr, _p);
+               int _startState = 52;
+               enterRecursionRule(_localctx, 52, RULE_expr, _p);
                int _la;
                try {
                        int _alt;
                        enterOuterAlt(_localctx, 1);
                        {
-                       setState(250);
+                       setState(266);
                        _errHandler.sync(this);
                        switch (_input.LA(1)) {
                        case NOT:
@@ -1815,7 +1922,7 @@ public class NCIntentDslParser extends Parser {
                                _ctx = _localctx;
                                _prevctx = _localctx;
 
-                               setState(237);
+                               setState(253);
                                ((UnaryExprContext)_localctx).op = _input.LT(1);
                                _la = _input.LA(1);
                                if ( !(_la==NOT || _la==MINUS) ) {
@@ -1826,7 +1933,7 @@ public class NCIntentDslParser extends Parser {
                                        _errHandler.reportMatch(this);
                                        consume();
                                }
-                               setState(238);
+                               setState(254);
                                expr(9);
                                }
                                break;
@@ -1835,11 +1942,11 @@ public class NCIntentDslParser extends Parser {
                                _localctx = new ParExprContext(_localctx);
                                _ctx = _localctx;
                                _prevctx = _localctx;
-                               setState(239);
+                               setState(255);
                                match(LPAR);
-                               setState(240);
+                               setState(256);
                                expr(0);
-                               setState(241);
+                               setState(257);
                                match(RPAR);
                                }
                                break;
@@ -1852,7 +1959,7 @@ public class NCIntentDslParser extends Parser {
                                _localctx = new AtomExprContext(_localctx);
                                _ctx = _localctx;
                                _prevctx = _localctx;
-                               setState(243);
+                               setState(259);
                                atom();
                                }
                                break;
@@ -1861,21 +1968,21 @@ public class NCIntentDslParser extends Parser {
                                _localctx = new CallExprContext(_localctx);
                                _ctx = _localctx;
                                _prevctx = _localctx;
-                               setState(244);
+                               setState(260);
                                match(FUN_NAME);
-                               setState(245);
+                               setState(261);
                                match(LPAR);
-                               setState(247);
+                               setState(263);
                                _errHandler.sync(this);
                                _la = _input.LA(1);
                                if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 
((1L << FUN_NAME) | (1L << SQSTRING) | (1L << DQSTRING) | (1L << BOOL) | (1L << 
NULL) | (1L << NOT) | (1L << LPAR) | (1L << MINUS) | (1L << INT))) != 0)) {
                                        {
-                                       setState(246);
+                                       setState(262);
                                        paramList(0);
                                        }
                                }
 
-                               setState(249);
+                               setState(265);
                                match(RPAR);
                                }
                                break;
@@ -1883,24 +1990,24 @@ public class NCIntentDslParser extends Parser {
                                throw new NoViableAltException(this);
                        }
                        _ctx.stop = _input.LT(-1);
-                       setState(269);
+                       setState(285);
                        _errHandler.sync(this);
-                       _alt = getInterpreter().adaptivePredict(_input,25,_ctx);
+                       _alt = getInterpreter().adaptivePredict(_input,26,_ctx);
                        while ( _alt!=2 && 
_alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
                                if ( _alt==1 ) {
                                        if ( _parseListeners!=null ) 
triggerExitRuleEvent();
                                        _prevctx = _localctx;
                                        {
-                                       setState(267);
+                                       setState(283);
                                        _errHandler.sync(this);
-                                       switch ( 
getInterpreter().adaptivePredict(_input,24,_ctx) ) {
+                                       switch ( 
getInterpreter().adaptivePredict(_input,25,_ctx) ) {
                                        case 1:
                                                {
                                                _localctx = new 
MultExprContext(new ExprContext(_parentctx, _parentState));
                                                
pushNewRecursionContext(_localctx, _startState, RULE_expr);
-                                               setState(252);
+                                               setState(268);
                                                if (!(precpred(_ctx, 7))) throw 
new FailedPredicateException(this, "precpred(_ctx, 7)");
-                                               setState(253);
+                                               setState(269);
                                                ((MultExprContext)_localctx).op 
= _input.LT(1);
                                                _la = _input.LA(1);
                                                if ( !((((_la) & ~0x3f) == 0 && 
((1L << _la) & ((1L << MULT) | (1L << DIV) | (1L << MOD))) != 0)) ) {
@@ -1911,7 +2018,7 @@ public class NCIntentDslParser extends Parser {
                                                        
_errHandler.reportMatch(this);
                                                        consume();
                                                }
-                                               setState(254);
+                                               setState(270);
                                                expr(8);
                                                }
                                                break;
@@ -1919,9 +2026,9 @@ public class NCIntentDslParser extends Parser {
                                                {
                                                _localctx = new 
PlusExprContext(new ExprContext(_parentctx, _parentState));
                                                
pushNewRecursionContext(_localctx, _startState, RULE_expr);
-                                               setState(255);
+                                               setState(271);
                                                if (!(precpred(_ctx, 6))) throw 
new FailedPredicateException(this, "precpred(_ctx, 6)");
-                                               setState(256);
+                                               setState(272);
                                                ((PlusExprContext)_localctx).op 
= _input.LT(1);
                                                _la = _input.LA(1);
                                                if ( !(_la==MINUS || _la==PLUS) 
) {
@@ -1932,7 +2039,7 @@ public class NCIntentDslParser extends Parser {
                                                        
_errHandler.reportMatch(this);
                                                        consume();
                                                }
-                                               setState(257);
+                                               setState(273);
                                                expr(7);
                                                }
                                                break;
@@ -1940,9 +2047,9 @@ public class NCIntentDslParser extends Parser {
                                                {
                                                _localctx = new 
CompExprContext(new ExprContext(_parentctx, _parentState));
                                                
pushNewRecursionContext(_localctx, _startState, RULE_expr);
-                                               setState(258);
+                                               setState(274);
                                                if (!(precpred(_ctx, 5))) throw 
new FailedPredicateException(this, "precpred(_ctx, 5)");
-                                               setState(259);
+                                               setState(275);
                                                ((CompExprContext)_localctx).op 
= _input.LT(1);
                                                _la = _input.LA(1);
                                                if ( !((((_la) & ~0x3f) == 0 && 
((1L << _la) & ((1L << GTEQ) | (1L << LTEQ) | (1L << GT) | (1L << LT))) != 0)) 
) {
@@ -1953,7 +2060,7 @@ public class NCIntentDslParser extends Parser {
                                                        
_errHandler.reportMatch(this);
                                                        consume();
                                                }
-                                               setState(260);
+                                               setState(276);
                                                expr(6);
                                                }
                                                break;
@@ -1961,9 +2068,9 @@ public class NCIntentDslParser extends Parser {
                                                {
                                                _localctx = new 
EqExprContext(new ExprContext(_parentctx, _parentState));
                                                
pushNewRecursionContext(_localctx, _startState, RULE_expr);
-                                               setState(261);
+                                               setState(277);
                                                if (!(precpred(_ctx, 4))) throw 
new FailedPredicateException(this, "precpred(_ctx, 4)");
-                                               setState(262);
+                                               setState(278);
                                                ((EqExprContext)_localctx).op = 
_input.LT(1);
                                                _la = _input.LA(1);
                                                if ( !(_la==EQ || _la==NEQ) ) {
@@ -1974,7 +2081,7 @@ public class NCIntentDslParser extends Parser {
                                                        
_errHandler.reportMatch(this);
                                                        consume();
                                                }
-                                               setState(263);
+                                               setState(279);
                                                expr(5);
                                                }
                                                break;
@@ -1982,9 +2089,9 @@ public class NCIntentDslParser extends Parser {
                                                {
                                                _localctx = new 
LogExprContext(new ExprContext(_parentctx, _parentState));
                                                
pushNewRecursionContext(_localctx, _startState, RULE_expr);
-                                               setState(264);
+                                               setState(280);
                                                if (!(precpred(_ctx, 3))) throw 
new FailedPredicateException(this, "precpred(_ctx, 3)");
-                                               setState(265);
+                                               setState(281);
                                                ((LogExprContext)_localctx).op 
= _input.LT(1);
                                                _la = _input.LA(1);
                                                if ( !(_la==AND || _la==OR) ) {
@@ -1995,16 +2102,16 @@ public class NCIntentDslParser extends Parser {
                                                        
_errHandler.reportMatch(this);
                                                        consume();
                                                }
-                                               setState(266);
+                                               setState(282);
                                                expr(4);
                                                }
                                                break;
                                        }
                                        } 
                                }
-                               setState(271);
+                               setState(287);
                                _errHandler.sync(this);
-                               _alt = 
getInterpreter().adaptivePredict(_input,25,_ctx);
+                               _alt = 
getInterpreter().adaptivePredict(_input,26,_ctx);
                        }
                        }
                }
@@ -2050,20 +2157,20 @@ public class NCIntentDslParser extends Parser {
                int _parentState = getState();
                ParamListContext _localctx = new ParamListContext(_ctx, 
_parentState);
                ParamListContext _prevctx = _localctx;
-               int _startState = 50;
-               enterRecursionRule(_localctx, 50, RULE_paramList, _p);
+               int _startState = 54;
+               enterRecursionRule(_localctx, 54, RULE_paramList, _p);
                try {
                        int _alt;
                        enterOuterAlt(_localctx, 1);
                        {
                        {
-                       setState(273);
+                       setState(289);
                        expr(0);
                        }
                        _ctx.stop = _input.LT(-1);
-                       setState(280);
+                       setState(296);
                        _errHandler.sync(this);
-                       _alt = getInterpreter().adaptivePredict(_input,26,_ctx);
+                       _alt = getInterpreter().adaptivePredict(_input,27,_ctx);
                        while ( _alt!=2 && 
_alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
                                if ( _alt==1 ) {
                                        if ( _parseListeners!=null ) 
triggerExitRuleEvent();
@@ -2072,18 +2179,18 @@ public class NCIntentDslParser extends Parser {
                                        {
                                        _localctx = new 
ParamListContext(_parentctx, _parentState);
                                        pushNewRecursionContext(_localctx, 
_startState, RULE_paramList);
-                                       setState(275);
+                                       setState(291);
                                        if (!(precpred(_ctx, 1))) throw new 
FailedPredicateException(this, "precpred(_ctx, 1)");
-                                       setState(276);
+                                       setState(292);
                                        match(COMMA);
-                                       setState(277);
+                                       setState(293);
                                        expr(0);
                                        }
                                        } 
                                }
-                               setState(282);
+                               setState(298);
                                _errHandler.sync(this);
-                               _alt = 
getInterpreter().adaptivePredict(_input,26,_ctx);
+                               _alt = 
getInterpreter().adaptivePredict(_input,27,_ctx);
                        }
                        }
                }
@@ -2123,39 +2230,39 @@ public class NCIntentDslParser extends Parser {
 
        public final AtomContext atom() throws RecognitionException {
                AtomContext _localctx = new AtomContext(_ctx, getState());
-               enterRule(_localctx, 52, RULE_atom);
+               enterRule(_localctx, 56, RULE_atom);
                try {
-                       setState(293);
+                       setState(309);
                        _errHandler.sync(this);
                        switch (_input.LA(1)) {
                        case NULL:
                                enterOuterAlt(_localctx, 1);
                                {
-                               setState(283);
+                               setState(299);
                                match(NULL);
                                }
                                break;
                        case INT:
                                enterOuterAlt(_localctx, 2);
                                {
-                               setState(284);
+                               setState(300);
                                match(INT);
-                               setState(286);
+                               setState(302);
                                _errHandler.sync(this);
-                               switch ( 
getInterpreter().adaptivePredict(_input,27,_ctx) ) {
+                               switch ( 
getInterpreter().adaptivePredict(_input,28,_ctx) ) {
                                case 1:
                                        {
-                                       setState(285);
+                                       setState(301);
                                        match(REAL);
                                        }
                                        break;
                                }
-                               setState(289);
+                               setState(305);
                                _errHandler.sync(this);
-                               switch ( 
getInterpreter().adaptivePredict(_input,28,_ctx) ) {
+                               switch ( 
getInterpreter().adaptivePredict(_input,29,_ctx) ) {
                                case 1:
                                        {
-                                       setState(288);
+                                       setState(304);
                                        match(EXP);
                                        }
                                        break;
@@ -2165,7 +2272,7 @@ public class NCIntentDslParser extends Parser {
                        case BOOL:
                                enterOuterAlt(_localctx, 3);
                                {
-                               setState(291);
+                               setState(307);
                                match(BOOL);
                                }
                                break;
@@ -2173,7 +2280,7 @@ public class NCIntentDslParser extends Parser {
                        case DQSTRING:
                                enterOuterAlt(_localctx, 4);
                                {
-                               setState(292);
+                               setState(308);
                                qstring();
                                }
                                break;
@@ -2211,12 +2318,12 @@ public class NCIntentDslParser extends Parser {
 
        public final QstringContext qstring() throws RecognitionException {
                QstringContext _localctx = new QstringContext(_ctx, getState());
-               enterRule(_localctx, 54, RULE_qstring);
+               enterRule(_localctx, 58, RULE_qstring);
                int _la;
                try {
                        enterOuterAlt(_localctx, 1);
                        {
-                       setState(295);
+                       setState(311);
                        _la = _input.LA(1);
                        if ( !(_la==SQSTRING || _la==DQSTRING) ) {
                        _errHandler.recoverInline(this);
@@ -2262,9 +2369,9 @@ public class NCIntentDslParser extends Parser {
 
        public final MinMaxContext minMax() throws RecognitionException {
                MinMaxContext _localctx = new MinMaxContext(_ctx, getState());
-               enterRule(_localctx, 56, RULE_minMax);
+               enterRule(_localctx, 60, RULE_minMax);
                try {
-                       setState(299);
+                       setState(315);
                        _errHandler.sync(this);
                        switch (_input.LA(1)) {
                        case PLUS:
@@ -2272,14 +2379,14 @@ public class NCIntentDslParser extends Parser {
                        case MULT:
                                enterOuterAlt(_localctx, 1);
                                {
-                               setState(297);
+                               setState(313);
                                minMaxShortcut();
                                }
                                break;
                        case LBR:
                                enterOuterAlt(_localctx, 2);
                                {
-                               setState(298);
+                               setState(314);
                                minMaxRange();
                                }
                                break;
@@ -2318,12 +2425,12 @@ public class NCIntentDslParser extends Parser {
 
        public final MinMaxShortcutContext minMaxShortcut() throws 
RecognitionException {
                MinMaxShortcutContext _localctx = new 
MinMaxShortcutContext(_ctx, getState());
-               enterRule(_localctx, 58, RULE_minMaxShortcut);
+               enterRule(_localctx, 62, RULE_minMaxShortcut);
                int _la;
                try {
                        enterOuterAlt(_localctx, 1);
                        {
-                       setState(301);
+                       setState(317);
                        _la = _input.LA(1);
                        if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << 
PLUS) | (1L << QUESTION) | (1L << MULT))) != 0)) ) {
                        _errHandler.recoverInline(this);
@@ -2370,19 +2477,19 @@ public class NCIntentDslParser extends Parser {
 
        public final MinMaxRangeContext minMaxRange() throws 
RecognitionException {
                MinMaxRangeContext _localctx = new MinMaxRangeContext(_ctx, 
getState());
-               enterRule(_localctx, 60, RULE_minMaxRange);
+               enterRule(_localctx, 64, RULE_minMaxRange);
                try {
                        enterOuterAlt(_localctx, 1);
                        {
-                       setState(303);
+                       setState(319);
                        match(LBR);
-                       setState(304);
+                       setState(320);
                        match(INT);
-                       setState(305);
+                       setState(321);
                        match(COMMA);
-                       setState(306);
+                       setState(322);
                        match(INT);
-                       setState(307);
+                       setState(323);
                        match(RBR);
                        }
                }
@@ -2416,12 +2523,12 @@ public class NCIntentDslParser extends Parser {
 
        public final IdContext id() throws RecognitionException {
                IdContext _localctx = new IdContext(_ctx, getState());
-               enterRule(_localctx, 62, RULE_id);
+               enterRule(_localctx, 66, RULE_id);
                int _la;
                try {
                        enterOuterAlt(_localctx, 1);
                        {
-                       setState(309);
+                       setState(325);
                        _la = _input.LA(1);
                        if ( !(_la==FUN_NAME || _la==ID) ) {
                        _errHandler.recoverInline(this);
@@ -2446,15 +2553,15 @@ public class NCIntentDslParser extends Parser {
 
        public boolean sempred(RuleContext _localctx, int ruleIndex, int 
predIndex) {
                switch (ruleIndex) {
-               case 1:
+               case 3:
                        return dslItems_sempred((DslItemsContext)_localctx, 
predIndex);
-               case 17:
+               case 19:
                        return terms_sempred((TermsContext)_localctx, 
predIndex);
-               case 22:
-                       return javaFqn_sempred((JavaFqnContext)_localctx, 
predIndex);
                case 24:
+                       return javaFqn_sempred((JavaFqnContext)_localctx, 
predIndex);
+               case 26:
                        return expr_sempred((ExprContext)_localctx, predIndex);
-               case 25:
+               case 27:
                        return paramList_sempred((ParamListContext)_localctx, 
predIndex);
                }
                return true;
@@ -2504,114 +2611,120 @@ public class NCIntentDslParser extends Parser {
        }
 
        public static final String _serializedATN =
-               
"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\64\u013a\4\2\t\2"+
+               
"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\64\u014a\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!\3\2\3\2\3\2\3\3\3\3\3\3\3\3\3\3\7\3K\n\3\f\3\16\3N\13\3\3\4\3\4\5"+
-               
"\4R\n\4\3\5\3\5\3\5\3\6\3\6\3\6\3\6\3\7\3\7\3\7\3\7\5\7_\n\7\3\7\3\7\3"+
-               
"\b\3\b\3\b\3\t\3\t\5\th\n\t\3\t\5\tk\n\t\3\t\5\tn\n\t\3\t\3\t\3\n\3\n"+
-               
"\3\n\3\n\3\13\3\13\3\13\3\13\3\f\3\f\3\f\3\f\3\r\3\r\3\r\3\r\5\r\u0082"+
-               
"\n\r\3\16\3\16\3\16\3\16\3\17\3\17\3\17\3\17\7\17\u008c\n\17\f\17\16\17"+
-               
"\u008f\13\17\3\17\3\17\3\17\3\17\5\17\u0095\n\17\3\20\3\20\3\20\3\20\3"+
-               
"\21\3\21\5\21\u009d\n\21\3\21\3\21\5\21\u00a1\n\21\3\21\5\21\u00a4\n\21"+
-               
"\3\21\3\21\3\21\3\21\5\21\u00aa\n\21\3\22\3\22\3\22\3\22\7\22\u00b0\n"+
-               
"\22\f\22\16\22\u00b3\13\22\3\22\3\22\3\22\3\22\5\22\u00b9\n\22\3\23\3"+
-               
"\23\3\23\3\23\3\23\7\23\u00c0\n\23\f\23\16\23\u00c3\13\23\3\24\3\24\5"+
-               
"\24\u00c7\n\24\3\25\3\25\3\26\3\26\5\26\u00cd\n\26\3\26\3\26\3\26\3\26"+
-               
"\3\26\3\26\5\26\u00d5\n\26\3\26\5\26\u00d8\n\26\3\27\5\27\u00db\n\27\3"+
-               
"\27\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3\30\7\30\u00e6\n\30\f\30\16\30"+
-               
"\u00e9\13\30\3\31\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3"+
-               
"\32\3\32\3\32\3\32\5\32\u00fa\n\32\3\32\5\32\u00fd\n\32\3\32\3\32\3\32"+
-               
"\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\7\32\u010e"+
-               
"\n\32\f\32\16\32\u0111\13\32\3\33\3\33\3\33\3\33\3\33\3\33\7\33\u0119"+
-               
"\n\33\f\33\16\33\u011c\13\33\3\34\3\34\3\34\5\34\u0121\n\34\3\34\5\34"+
-               
"\u0124\n\34\3\34\3\34\5\34\u0128\n\34\3\35\3\35\3\36\3\36\5\36\u012e\n"+
-               "\36\3\37\3\37\3 \3 \3 \3 \3 \3 
\3!\3!\3!\2\7\4$.\62\64\"\2\4\6\b\n\f\16"+
-               "\20\22\24\26\30\32\34\36 
\"$&(*,.\60\62\64\668:<>@\2\f\4\2\36\36\'\'\4"+
-               
"\2\27\27$$\3\2*,\4\2$$((\3\2\20\23\3\2\16\17\3\2\24\25\3\2\n\13\3\2(*"+
-               
"\4\2\b\b\61\61\2\u0143\2B\3\2\2\2\4E\3\2\2\2\6Q\3\2\2\2\bS\3\2\2\2\nV"+
-               
"\3\2\2\2\fZ\3\2\2\2\16b\3\2\2\2\20e\3\2\2\2\22q\3\2\2\2\24u\3\2\2\2\26"+
-               
"y\3\2\2\2\30}\3\2\2\2\32\u0083\3\2\2\2\34\u0094\3\2\2\2\36\u0096\3\2\2"+
-               "\2 
\u00a9\3\2\2\2\"\u00b8\3\2\2\2$\u00ba\3\2\2\2&\u00c6\3\2\2\2(\u00c8"+
-               
"\3\2\2\2*\u00ca\3\2\2\2,\u00da\3\2\2\2.\u00df\3\2\2\2\60\u00ea\3\2\2\2"+
-               
"\62\u00fc\3\2\2\2\64\u0112\3\2\2\2\66\u0127\3\2\2\28\u0129\3\2\2\2:\u012d"+
-               
"\3\2\2\2<\u012f\3\2\2\2>\u0131\3\2\2\2@\u0137\3\2\2\2BC\5\4\3\2CD\7\2"+
-               
"\2\3D\3\3\2\2\2EF\b\3\1\2FG\5\6\4\2GL\3\2\2\2HI\f\3\2\2IK\5\6\4\2JH\3"+
-               
"\2\2\2KN\3\2\2\2LJ\3\2\2\2LM\3\2\2\2M\5\3\2\2\2NL\3\2\2\2OR\5\20\t\2P"+
-               
"R\5\b\5\2QO\3\2\2\2QP\3\2\2\2R\7\3\2\2\2ST\5\n\6\2TU\5$\23\2U\t\3\2\2"+
-               
"\2VW\7\t\2\2WX\7\'\2\2XY\5@!\2Y\13\3\2\2\2Z[\7\t\2\2[\\\7\30\2\2\\^\5"+
-               
"@!\2]_\5\16\b\2^]\3\2\2\2^_\3\2\2\2_`\3\2\2\2`a\7\31\2\2a\r\3\2\2\2bc"+
-               
"\7\"\2\2cd\5\34\17\2d\17\3\2\2\2eg\5\22\n\2fh\5\24\13\2gf\3\2\2\2gh\3"+
-               
"\2\2\2hj\3\2\2\2ik\5\30\r\2ji\3\2\2\2jk\3\2\2\2km\3\2\2\2ln\5\32\16\2"+
-               
"ml\3\2\2\2mn\3\2\2\2no\3\2\2\2op\5$\23\2p\21\3\2\2\2qr\7\3\2\2rs\7\'\2"+
-               
"\2st\5@!\2t\23\3\2\2\2uv\7\4\2\2vw\7\'\2\2wx\7\f\2\2x\25\3\2\2\2yz\7+"+
-               
"\2\2z{\5,\27\2{|\7+\2\2|\27\3\2\2\2}~\7\5\2\2~\u0081\7\'\2\2\177\u0082"+
-               
"\58\35\2\u0080\u0082\5\26\f\2\u0081\177\3\2\2\2\u0081\u0080\3\2\2\2\u0082"+
-               
"\31\3\2\2\2\u0083\u0084\7\6\2\2\u0084\u0085\7\'\2\2\u0085\u0086\5\34\17"+
-               
"\2\u0086\33\3\2\2\2\u0087\u0088\7\32\2\2\u0088\u008d\5\36\20\2\u0089\u008a"+
-               
"\7\"\2\2\u008a\u008c\5\36\20\2\u008b\u0089\3\2\2\2\u008c\u008f\3\2\2\2"+
-               
"\u008d\u008b\3\2\2\2\u008d\u008e\3\2\2\2\u008e\u0090\3\2\2\2\u008f\u008d"+
-               
"\3\2\2\2\u0090\u0091\7\33\2\2\u0091\u0095\3\2\2\2\u0092\u0093\7\32\2\2"+
-               
"\u0093\u0095\7\33\2\2\u0094\u0087\3\2\2\2\u0094\u0092\3\2\2\2\u0095\35"+
-               "\3\2\2\2\u0096\u0097\58\35\2\u0097\u0098\7#\2\2\u0098\u0099\5 
\21\2\u0099"+
-               
"\37\3\2\2\2\u009a\u00aa\58\35\2\u009b\u009d\7$\2\2\u009c\u009b\3\2\2\2"+
-               
"\u009c\u009d\3\2\2\2\u009d\u009e\3\2\2\2\u009e\u00a0\7.\2\2\u009f\u00a1"+
-               
"\7/\2\2\u00a0\u009f\3\2\2\2\u00a0\u00a1\3\2\2\2\u00a1\u00a3\3\2\2\2\u00a2"+
-               
"\u00a4\7\60\2\2\u00a3\u00a2\3\2\2\2\u00a3\u00a4\3\2\2\2\u00a4\u00aa\3"+
-               
"\2\2\2\u00a5\u00aa\5\34\17\2\u00a6\u00aa\5\"\22\2\u00a7\u00aa\7\f\2\2"+
-               
"\u00a8\u00aa\7\r\2\2\u00a9\u009a\3\2\2\2\u00a9\u009c\3\2\2\2\u00a9\u00a5"+
-               
"\3\2\2\2\u00a9\u00a6\3\2\2\2\u00a9\u00a7\3\2\2\2\u00a9\u00a8\3\2\2\2\u00aa"+
-               "!\3\2\2\2\u00ab\u00ac\7\37\2\2\u00ac\u00b1\5 
\21\2\u00ad\u00ae\7\"\2\2"+
-               "\u00ae\u00b0\5 
\21\2\u00af\u00ad\3\2\2\2\u00b0\u00b3\3\2\2\2\u00b1\u00af"+
-               
"\3\2\2\2\u00b1\u00b2\3\2\2\2\u00b2\u00b4\3\2\2\2\u00b3\u00b1\3\2\2\2\u00b4"+
-               "\u00b5\7 
\2\2\u00b5\u00b9\3\2\2\2\u00b6\u00b7\7\37\2\2\u00b7\u00b9\7 "+
-               
"\2\2\u00b8\u00ab\3\2\2\2\u00b8\u00b6\3\2\2\2\u00b9#\3\2\2\2\u00ba\u00bb"+
-               
"\b\23\1\2\u00bb\u00bc\5&\24\2\u00bc\u00c1\3\2\2\2\u00bd\u00be\f\3\2\2"+
-               
"\u00be\u00c0\5&\24\2\u00bf\u00bd\3\2\2\2\u00c0\u00c3\3\2\2\2\u00c1\u00bf"+
-               
"\3\2\2\2\u00c1\u00c2\3\2\2\2\u00c2%\3\2\2\2\u00c3\u00c1\3\2\2\2\u00c4"+
-               
"\u00c7\5*\26\2\u00c5\u00c7\5\f\7\2\u00c6\u00c4\3\2\2\2\u00c6\u00c5\3\2"+
-               
"\2\2\u00c7\'\3\2\2\2\u00c8\u00c9\t\2\2\2\u00c9)\3\2\2\2\u00ca\u00cc\7"+
-               
"\7\2\2\u00cb\u00cd\5\60\31\2\u00cc\u00cb\3\2\2\2\u00cc\u00cd\3\2\2\2\u00cd"+
-               
"\u00ce\3\2\2\2\u00ce\u00d4\5(\25\2\u00cf\u00d0\7\32\2\2\u00d0\u00d1\5"+
-               
"\62\32\2\u00d1\u00d2\7\33\2\2\u00d2\u00d5\3\2\2\2\u00d3\u00d5\5\26\f\2"+
-               
"\u00d4\u00cf\3\2\2\2\u00d4\u00d3\3\2\2\2\u00d5\u00d7\3\2\2\2\u00d6\u00d8"+
-               
"\5:\36\2\u00d7\u00d6\3\2\2\2\u00d7\u00d8\3\2\2\2\u00d8+\3\2\2\2\u00d9"+
-               
"\u00db\5.\30\2\u00da\u00d9\3\2\2\2\u00da\u00db\3\2\2\2\u00db\u00dc\3\2"+
-               
"\2\2\u00dc\u00dd\7!\2\2\u00dd\u00de\5@!\2\u00de-\3\2\2\2\u00df\u00e0\b"+
-               
"\30\1\2\u00e0\u00e1\5@!\2\u00e1\u00e7\3\2\2\2\u00e2\u00e3\f\3\2\2\u00e3"+
-               
"\u00e4\7%\2\2\u00e4\u00e6\5@!\2\u00e5\u00e2\3\2\2\2\u00e6\u00e9\3\2\2"+
-               
"\2\u00e7\u00e5\3\2\2\2\u00e7\u00e8\3\2\2\2\u00e8/\3\2\2\2\u00e9\u00e7"+
-               
"\3\2\2\2\u00ea\u00eb\7\30\2\2\u00eb\u00ec\5@!\2\u00ec\u00ed\7\31\2\2\u00ed"+
-               
"\61\3\2\2\2\u00ee\u00ef\b\32\1\2\u00ef\u00f0\t\3\2\2\u00f0\u00fd\5\62"+
-               
"\32\13\u00f1\u00f2\7\30\2\2\u00f2\u00f3\5\62\32\2\u00f3\u00f4\7\31\2\2"+
-               
"\u00f4\u00fd\3\2\2\2\u00f5\u00fd\5\66\34\2\u00f6\u00f7\7\b\2\2\u00f7\u00f9"+
-               
"\7\30\2\2\u00f8\u00fa\5\64\33\2\u00f9\u00f8\3\2\2\2\u00f9\u00fa\3\2\2"+
-               
"\2\u00fa\u00fb\3\2\2\2\u00fb\u00fd\7\31\2\2\u00fc\u00ee\3\2\2\2\u00fc"+
-               
"\u00f1\3\2\2\2\u00fc\u00f5\3\2\2\2\u00fc\u00f6\3\2\2\2\u00fd\u010f\3\2"+
-               
"\2\2\u00fe\u00ff\f\t\2\2\u00ff\u0100\t\4\2\2\u0100\u010e\5\62\32\n\u0101"+
-               
"\u0102\f\b\2\2\u0102\u0103\t\5\2\2\u0103\u010e\5\62\32\t\u0104\u0105\f"+
-               
"\7\2\2\u0105\u0106\t\6\2\2\u0106\u010e\5\62\32\b\u0107\u0108\f\6\2\2\u0108"+
-               
"\u0109\t\7\2\2\u0109\u010e\5\62\32\7\u010a\u010b\f\5\2\2\u010b\u010c\t"+
-               
"\b\2\2\u010c\u010e\5\62\32\6\u010d\u00fe\3\2\2\2\u010d\u0101\3\2\2\2\u010d"+
-               
"\u0104\3\2\2\2\u010d\u0107\3\2\2\2\u010d\u010a\3\2\2\2\u010e\u0111\3\2"+
-               
"\2\2\u010f\u010d\3\2\2\2\u010f\u0110\3\2\2\2\u0110\63\3\2\2\2\u0111\u010f"+
-               
"\3\2\2\2\u0112\u0113\b\33\1\2\u0113\u0114\5\62\32\2\u0114\u011a\3\2\2"+
-               
"\2\u0115\u0116\f\3\2\2\u0116\u0117\7\"\2\2\u0117\u0119\5\62\32\2\u0118"+
-               
"\u0115\3\2\2\2\u0119\u011c\3\2\2\2\u011a\u0118\3\2\2\2\u011a\u011b\3\2"+
-               
"\2\2\u011b\65\3\2\2\2\u011c\u011a\3\2\2\2\u011d\u0128\7\r\2\2\u011e\u0120"+
-               
"\7.\2\2\u011f\u0121\7/\2\2\u0120\u011f\3\2\2\2\u0120\u0121\3\2\2\2\u0121"+
-               
"\u0123\3\2\2\2\u0122\u0124\7\60\2\2\u0123\u0122\3\2\2\2\u0123\u0124\3"+
-               
"\2\2\2\u0124\u0128\3\2\2\2\u0125\u0128\7\f\2\2\u0126\u0128\58\35\2\u0127"+
-               
"\u011d\3\2\2\2\u0127\u011e\3\2\2\2\u0127\u0125\3\2\2\2\u0127\u0126\3\2"+
-               
"\2\2\u0128\67\3\2\2\2\u0129\u012a\t\t\2\2\u012a9\3\2\2\2\u012b\u012e\5"+
-               "<\37\2\u012c\u012e\5> 
\2\u012d\u012b\3\2\2\2\u012d\u012c\3\2\2\2\u012e"+
-               
";\3\2\2\2\u012f\u0130\t\n\2\2\u0130=\3\2\2\2\u0131\u0132\7\37\2\2\u0132"+
-               
"\u0133\7.\2\2\u0133\u0134\7\"\2\2\u0134\u0135\7.\2\2\u0135\u0136\7 \2"+
-               
"\2\u0136?\3\2\2\2\u0137\u0138\t\13\2\2\u0138A\3\2\2\2!LQ^gjm\u0081\u008d"+
-               
"\u0094\u009c\u00a0\u00a3\u00a9\u00b1\u00b8\u00c1\u00c6\u00cc\u00d4\u00d7"+
-               
"\u00da\u00e7\u00f9\u00fc\u010d\u010f\u011a\u0120\u0123\u0127\u012d";
+               
"\t!\4\"\t\"\4#\t#\3\2\3\2\3\2\3\3\5\3K\n\3\3\3\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\7\5[\n\5\f\5\16\5^\13\5\3\6\3\6\5\6b\n\6"+
+               
"\3\7\3\7\3\7\3\b\3\b\3\b\3\b\3\t\3\t\3\t\3\t\5\to\n\t\3\t\3\t\3\n\3\n"+
+               
"\3\n\3\13\3\13\5\13x\n\13\3\13\5\13{\n\13\3\13\5\13~\n\13\3\13\3\13\3"+
+               
"\f\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3\16\3\16\3\16\3\16\3\17\3\17\3\17\3\17"+
+               
"\5\17\u0092\n\17\3\20\3\20\3\20\3\20\3\21\3\21\3\21\3\21\7\21\u009c\n"+
+               
"\21\f\21\16\21\u009f\13\21\3\21\3\21\3\21\3\21\5\21\u00a5\n\21\3\22\3"+
+               
"\22\3\22\3\22\3\23\3\23\5\23\u00ad\n\23\3\23\3\23\5\23\u00b1\n\23\3\23"+
+               
"\5\23\u00b4\n\23\3\23\3\23\3\23\3\23\5\23\u00ba\n\23\3\24\3\24\3\24\3"+
+               
"\24\7\24\u00c0\n\24\f\24\16\24\u00c3\13\24\3\24\3\24\3\24\3\24\5\24\u00c9"+
+               
"\n\24\3\25\3\25\3\25\3\25\3\25\7\25\u00d0\n\25\f\25\16\25\u00d3\13\25"+
+               
"\3\26\3\26\5\26\u00d7\n\26\3\27\3\27\3\30\3\30\5\30\u00dd\n\30\3\30\3"+
+               
"\30\3\30\3\30\3\30\3\30\5\30\u00e5\n\30\3\30\5\30\u00e8\n\30\3\31\5\31"+
+               
"\u00eb\n\31\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\32\7\32\u00f6\n"+
+               
"\32\f\32\16\32\u00f9\13\32\3\33\3\33\3\33\3\33\3\34\3\34\3\34\3\34\3\34"+
+               
"\3\34\3\34\3\34\3\34\3\34\3\34\5\34\u010a\n\34\3\34\5\34\u010d\n\34\3"+
+               
"\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3"+
+               
"\34\7\34\u011e\n\34\f\34\16\34\u0121\13\34\3\35\3\35\3\35\3\35\3\35\3"+
+               
"\35\7\35\u0129\n\35\f\35\16\35\u012c\13\35\3\36\3\36\3\36\5\36\u0131\n"+
+               "\36\3\36\5\36\u0134\n\36\3\36\3\36\5\36\u0138\n\36\3\37\3\37\3 
\3 \5 "+
+               "\u013e\n 
\3!\3!\3\"\3\"\3\"\3\"\3\"\3\"\3#\3#\3#\2\7\b(\62\668$\2\4\6"+
+               "\b\n\f\16\20\22\24\26\30\32\34\36 
\"$&(*,.\60\62\64\668:<>@BD\2\f\4\2"+
+               
"\36\36\'\'\4\2\27\27$$\3\2*,\4\2$$((\3\2\20\23\3\2\16\17\3\2\24\25\3\2"+
+               
"\n\13\3\2(*\4\2\b\b\61\61\2\u0152\2F\3\2\2\2\4J\3\2\2\2\6Q\3\2\2\2\bU"+
+               
"\3\2\2\2\na\3\2\2\2\fc\3\2\2\2\16f\3\2\2\2\20j\3\2\2\2\22r\3\2\2\2\24"+
+               
"u\3\2\2\2\26\u0081\3\2\2\2\30\u0085\3\2\2\2\32\u0089\3\2\2\2\34\u008d"+
+               "\3\2\2\2\36\u0093\3\2\2\2 
\u00a4\3\2\2\2\"\u00a6\3\2\2\2$\u00b9\3\2\2"+
+               
"\2&\u00c8\3\2\2\2(\u00ca\3\2\2\2*\u00d6\3\2\2\2,\u00d8\3\2\2\2.\u00da"+
+               
"\3\2\2\2\60\u00ea\3\2\2\2\62\u00ef\3\2\2\2\64\u00fa\3\2\2\2\66\u010c\3"+
+               
"\2\2\28\u0122\3\2\2\2:\u0137\3\2\2\2<\u0139\3\2\2\2>\u013d\3\2\2\2@\u013f"+
+               
"\3\2\2\2B\u0141\3\2\2\2D\u0147\3\2\2\2FG\5\b\5\2GH\7\2\2\3H\3\3\2\2\2"+
+               
"IK\5\6\4\2JI\3\2\2\2JK\3\2\2\2KL\3\2\2\2LM\7\32\2\2MN\5\66\34\2NO\7\33"+
+               "\2\2OP\7\2\2\3P\5\3\2\2\2QR\7\37\2\2RS\5D#\2ST\7 
\2\2T\7\3\2\2\2UV\b\5"+
+               
"\1\2VW\5\n\6\2W\\\3\2\2\2XY\f\3\2\2Y[\5\n\6\2ZX\3\2\2\2[^\3\2\2\2\\Z\3"+
+               
"\2\2\2\\]\3\2\2\2]\t\3\2\2\2^\\\3\2\2\2_b\5\24\13\2`b\5\f\7\2a_\3\2\2"+
+               
"\2a`\3\2\2\2b\13\3\2\2\2cd\5\16\b\2de\5(\25\2e\r\3\2\2\2fg\7\t\2\2gh\7"+
+               
"\'\2\2hi\5D#\2i\17\3\2\2\2jk\7\t\2\2kl\7\30\2\2ln\5D#\2mo\5\22\n\2nm\3"+
+               
"\2\2\2no\3\2\2\2op\3\2\2\2pq\7\31\2\2q\21\3\2\2\2rs\7\"\2\2st\5 \21\2"+
+               
"t\23\3\2\2\2uw\5\26\f\2vx\5\30\r\2wv\3\2\2\2wx\3\2\2\2xz\3\2\2\2y{\5\34"+
+               
"\17\2zy\3\2\2\2z{\3\2\2\2{}\3\2\2\2|~\5\36\20\2}|\3\2\2\2}~\3\2\2\2~\177"+
+               
"\3\2\2\2\177\u0080\5(\25\2\u0080\25\3\2\2\2\u0081\u0082\7\3\2\2\u0082"+
+               
"\u0083\7\'\2\2\u0083\u0084\5D#\2\u0084\27\3\2\2\2\u0085\u0086\7\4\2\2"+
+               
"\u0086\u0087\7\'\2\2\u0087\u0088\7\f\2\2\u0088\31\3\2\2\2\u0089\u008a"+
+               
"\7+\2\2\u008a\u008b\5\60\31\2\u008b\u008c\7+\2\2\u008c\33\3\2\2\2\u008d"+
+               
"\u008e\7\5\2\2\u008e\u0091\7\'\2\2\u008f\u0092\5<\37\2\u0090\u0092\5\32"+
+               
"\16\2\u0091\u008f\3\2\2\2\u0091\u0090\3\2\2\2\u0092\35\3\2\2\2\u0093\u0094"+
+               "\7\6\2\2\u0094\u0095\7\'\2\2\u0095\u0096\5 
\21\2\u0096\37\3\2\2\2\u0097"+
+               
"\u0098\7\32\2\2\u0098\u009d\5\"\22\2\u0099\u009a\7\"\2\2\u009a\u009c\5"+
+               
"\"\22\2\u009b\u0099\3\2\2\2\u009c\u009f\3\2\2\2\u009d\u009b\3\2\2\2\u009d"+
+               
"\u009e\3\2\2\2\u009e\u00a0\3\2\2\2\u009f\u009d\3\2\2\2\u00a0\u00a1\7\33"+
+               
"\2\2\u00a1\u00a5\3\2\2\2\u00a2\u00a3\7\32\2\2\u00a3\u00a5\7\33\2\2\u00a4"+
+               
"\u0097\3\2\2\2\u00a4\u00a2\3\2\2\2\u00a5!\3\2\2\2\u00a6\u00a7\5<\37\2"+
+               
"\u00a7\u00a8\7#\2\2\u00a8\u00a9\5$\23\2\u00a9#\3\2\2\2\u00aa\u00ba\5<"+
+               
"\37\2\u00ab\u00ad\7$\2\2\u00ac\u00ab\3\2\2\2\u00ac\u00ad\3\2\2\2\u00ad"+
+               
"\u00ae\3\2\2\2\u00ae\u00b0\7.\2\2\u00af\u00b1\7/\2\2\u00b0\u00af\3\2\2"+
+               
"\2\u00b0\u00b1\3\2\2\2\u00b1\u00b3\3\2\2\2\u00b2\u00b4\7\60\2\2\u00b3"+
+               
"\u00b2\3\2\2\2\u00b3\u00b4\3\2\2\2\u00b4\u00ba\3\2\2\2\u00b5\u00ba\5 "+
+               
"\21\2\u00b6\u00ba\5&\24\2\u00b7\u00ba\7\f\2\2\u00b8\u00ba\7\r\2\2\u00b9"+
+               
"\u00aa\3\2\2\2\u00b9\u00ac\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%\3\2\2\2\u00bb\u00bc"+
+               
"\7\37\2\2\u00bc\u00c1\5$\23\2\u00bd\u00be\7\"\2\2\u00be\u00c0\5$\23\2"+
+               
"\u00bf\u00bd\3\2\2\2\u00c0\u00c3\3\2\2\2\u00c1\u00bf\3\2\2\2\u00c1\u00c2"+
+               "\3\2\2\2\u00c2\u00c4\3\2\2\2\u00c3\u00c1\3\2\2\2\u00c4\u00c5\7 
\2\2\u00c5"+
+               "\u00c9\3\2\2\2\u00c6\u00c7\7\37\2\2\u00c7\u00c9\7 
\2\2\u00c8\u00bb\3\2"+
+               
"\2\2\u00c8\u00c6\3\2\2\2\u00c9\'\3\2\2\2\u00ca\u00cb\b\25\1\2\u00cb\u00cc"+
+               
"\5*\26\2\u00cc\u00d1\3\2\2\2\u00cd\u00ce\f\3\2\2\u00ce\u00d0\5*\26\2\u00cf"+
+               
"\u00cd\3\2\2\2\u00d0\u00d3\3\2\2\2\u00d1\u00cf\3\2\2\2\u00d1\u00d2\3\2"+
+               
"\2\2\u00d2)\3\2\2\2\u00d3\u00d1\3\2\2\2\u00d4\u00d7\5.\30\2\u00d5\u00d7"+
+               
"\5\20\t\2\u00d6\u00d4\3\2\2\2\u00d6\u00d5\3\2\2\2\u00d7+\3\2\2\2\u00d8"+
+               
"\u00d9\t\2\2\2\u00d9-\3\2\2\2\u00da\u00dc\7\7\2\2\u00db\u00dd\5\64\33"+
+               
"\2\u00dc\u00db\3\2\2\2\u00dc\u00dd\3\2\2\2\u00dd\u00de\3\2\2\2\u00de\u00e4"+
+               
"\5,\27\2\u00df\u00e0\7\32\2\2\u00e0\u00e1\5\66\34\2\u00e1\u00e2\7\33\2"+
+               
"\2\u00e2\u00e5\3\2\2\2\u00e3\u00e5\5\32\16\2\u00e4\u00df\3\2\2\2\u00e4"+
+               "\u00e3\3\2\2\2\u00e5\u00e7\3\2\2\2\u00e6\u00e8\5> 
\2\u00e7\u00e6\3\2\2"+
+               
"\2\u00e7\u00e8\3\2\2\2\u00e8/\3\2\2\2\u00e9\u00eb\5\62\32\2\u00ea\u00e9"+
+               
"\3\2\2\2\u00ea\u00eb\3\2\2\2\u00eb\u00ec\3\2\2\2\u00ec\u00ed\7!\2\2\u00ed"+
+               
"\u00ee\5D#\2\u00ee\61\3\2\2\2\u00ef\u00f0\b\32\1\2\u00f0\u00f1\5D#\2\u00f1"+
+               
"\u00f7\3\2\2\2\u00f2\u00f3\f\3\2\2\u00f3\u00f4\7%\2\2\u00f4\u00f6\5D#"+
+               
"\2\u00f5\u00f2\3\2\2\2\u00f6\u00f9\3\2\2\2\u00f7\u00f5\3\2\2\2\u00f7\u00f8"+
+               
"\3\2\2\2\u00f8\63\3\2\2\2\u00f9\u00f7\3\2\2\2\u00fa\u00fb\7\30\2\2\u00fb"+
+               
"\u00fc\5D#\2\u00fc\u00fd\7\31\2\2\u00fd\65\3\2\2\2\u00fe\u00ff\b\34\1"+
+               
"\2\u00ff\u0100\t\3\2\2\u0100\u010d\5\66\34\13\u0101\u0102\7\30\2\2\u0102"+
+               
"\u0103\5\66\34\2\u0103\u0104\7\31\2\2\u0104\u010d\3\2\2\2\u0105\u010d"+
+               
"\5:\36\2\u0106\u0107\7\b\2\2\u0107\u0109\7\30\2\2\u0108\u010a\58\35\2"+
+               
"\u0109\u0108\3\2\2\2\u0109\u010a\3\2\2\2\u010a\u010b\3\2\2\2\u010b\u010d"+
+               
"\7\31\2\2\u010c\u00fe\3\2\2\2\u010c\u0101\3\2\2\2\u010c\u0105\3\2\2\2"+
+               
"\u010c\u0106\3\2\2\2\u010d\u011f\3\2\2\2\u010e\u010f\f\t\2\2\u010f\u0110"+
+               
"\t\4\2\2\u0110\u011e\5\66\34\n\u0111\u0112\f\b\2\2\u0112\u0113\t\5\2\2"+
+               
"\u0113\u011e\5\66\34\t\u0114\u0115\f\7\2\2\u0115\u0116\t\6\2\2\u0116\u011e"+
+               
"\5\66\34\b\u0117\u0118\f\6\2\2\u0118\u0119\t\7\2\2\u0119\u011e\5\66\34"+
+               
"\7\u011a\u011b\f\5\2\2\u011b\u011c\t\b\2\2\u011c\u011e\5\66\34\6\u011d"+
+               
"\u010e\3\2\2\2\u011d\u0111\3\2\2\2\u011d\u0114\3\2\2\2\u011d\u0117\3\2"+
+               
"\2\2\u011d\u011a\3\2\2\2\u011e\u0121\3\2\2\2\u011f\u011d\3\2\2\2\u011f"+
+               
"\u0120\3\2\2\2\u0120\67\3\2\2\2\u0121\u011f\3\2\2\2\u0122\u0123\b\35\1"+
+               
"\2\u0123\u0124\5\66\34\2\u0124\u012a\3\2\2\2\u0125\u0126\f\3\2\2\u0126"+
+               
"\u0127\7\"\2\2\u0127\u0129\5\66\34\2\u0128\u0125\3\2\2\2\u0129\u012c\3"+
+               
"\2\2\2\u012a\u0128\3\2\2\2\u012a\u012b\3\2\2\2\u012b9\3\2\2\2\u012c\u012a"+
+               
"\3\2\2\2\u012d\u0138\7\r\2\2\u012e\u0130\7.\2\2\u012f\u0131\7/\2\2\u0130"+
+               
"\u012f\3\2\2\2\u0130\u0131\3\2\2\2\u0131\u0133\3\2\2\2\u0132\u0134\7\60"+
+               
"\2\2\u0133\u0132\3\2\2\2\u0133\u0134\3\2\2\2\u0134\u0138\3\2\2\2\u0135"+
+               
"\u0138\7\f\2\2\u0136\u0138\5<\37\2\u0137\u012d\3\2\2\2\u0137\u012e\3\2"+
+               
"\2\2\u0137\u0135\3\2\2\2\u0137\u0136\3\2\2\2\u0138;\3\2\2\2\u0139\u013a"+
+               
"\t\t\2\2\u013a=\3\2\2\2\u013b\u013e\5@!\2\u013c\u013e\5B\"\2\u013d\u013b"+
+               
"\3\2\2\2\u013d\u013c\3\2\2\2\u013e?\3\2\2\2\u013f\u0140\t\n\2\2\u0140"+
+               
"A\3\2\2\2\u0141\u0142\7\37\2\2\u0142\u0143\7.\2\2\u0143\u0144\7\"\2\2"+
+               "\u0144\u0145\7.\2\2\u0145\u0146\7 
\2\2\u0146C\3\2\2\2\u0147\u0148\t\13"+
+               
"\2\2\u0148E\3\2\2\2\"J\\anwz}\u0091\u009d\u00a4\u00ac\u00b0\u00b3\u00b9"+
+               
"\u00c1\u00c8\u00d1\u00d6\u00dc\u00e4\u00e7\u00ea\u00f7\u0109\u010c\u011d"+
+               "\u011f\u012a\u0130\u0133\u0137\u013d";
        public static final ATN _ATN =
                new ATNDeserializer().deserialize(_serializedATN.toCharArray());
        static {
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/NCModelSynonymDsl.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/utils/NCDslSynonym.scala
similarity index 81%
rename from 
nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/NCModelSynonymDsl.scala
rename to 
nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/utils/NCDslSynonym.scala
index de8784e..8c9ea03 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/NCModelSynonymDsl.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/utils/NCDslSynonym.scala
@@ -15,14 +15,17 @@
  * limitations under the License.
  */
 
-package org.apache.nlpcraft.probe.mgrs.model
+package org.apache.nlpcraft.model.intent.utils
 
 import org.apache.nlpcraft.model.NCToken
 
 /**
- * Synonym DSL compilation unit.
+ * DSl synonym.
+ *
+ * @param alias
+ * @param pred
  */
-case class NCModelSynonymDsl(
-    alias: String,
-    predicate: java.util.function.Function[NCToken, java.lang.Boolean]
+case class NCDslSynonym(
+    alias: Option[String],
+    pred: (NCToken, NCDslTermContext) ⇒ Boolean,
 )
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/utils/NCDslTerm.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/utils/NCDslTerm.scala
index 58ebb2f..97e8efd 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/utils/NCDslTerm.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/utils/NCDslTerm.scala
@@ -29,7 +29,7 @@ import org.apache.nlpcraft.model.NCToken
   * @param conv
   */
 case class NCDslTerm(
-    id: String, // Could be null.
+    id: Option[String],
     pred: (NCToken, NCDslTermContext) ⇒ (Boolean/*Predicate.*/, 
Boolean/*Whether or not token was used.*/),
     min: Int,
     max: Int,
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/utils/NCDslTokenChecker.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/utils/NCDslTokenChecker.scala
index 24344a2..6bfce61 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/utils/NCDslTokenChecker.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/utils/NCDslTokenChecker.scala
@@ -23,7 +23,7 @@ import org.apache.nlpcraft.common._
 import scala.collection.mutable
 
 /**
- * Scala-based checks.
+ * Token checker.
  */
 object NCDslTokenChecker {
     /**
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/deploy/NCDeployManager.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/deploy/NCDeployManager.scala
index e94fdbd..f470529 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/deploy/NCDeployManager.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/deploy/NCDeployManager.scala
@@ -1473,7 +1473,7 @@ object NCDeployManager extends NCService with 
DecorateAsScala {
             val mStr = method2Str(m)
 
             // Process inline intent declarations by @NCIntent annotation.
-            for (ann ← m.getAnnotationsByType(CLS_INTENT); intent ← 
NCIntentDslCompiler.compile(ann.value(), mdl.getId, mStr))
+            for (ann ← m.getAnnotationsByType(CLS_INTENT); intent ← 
NCIntentDslCompiler.compileIntent(ann.value(), mdl.getId, mStr))
                 intents += (intent → prepareCallback(m, mdl, intent))
     
             // Process intent references from @NCIntentRef annotation.
@@ -1485,7 +1485,7 @@ object NCDeployManager extends NCService with 
DecorateAsScala {
                         val compiledIntents = adapter
                             .getIntents
                             .asScala
-                            .flatMap(NCIntentDslCompiler.compile(_, mdl.getId, 
mStr))
+                            .flatMap(NCIntentDslCompiler.compileIntent(_, 
mdl.getId, mStr))
             
                         U.getDups(compiledIntents.toSeq.map(_.id)) match {
                             case ids if ids.nonEmpty ⇒
@@ -1554,7 +1554,7 @@ object NCDeployManager extends NCService with 
DecorateAsScala {
                     val distinct = seqSeq.map(_.distinct).distinct
 
                     for (ann ← intAnns) {
-                        for (intent ← NCIntentDslCompiler.compile(ann.value(), 
mdlId, mStr))
+                        for (intent ← 
NCIntentDslCompiler.compileIntent(ann.value(), mdlId, mStr))
                             samples += (intent.id → distinct)
                     }
                     for (ann ← refAnns)
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 2b2b714..92faf7b 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
@@ -22,7 +22,8 @@ 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.model.intent.utils
+import org.apache.nlpcraft.model.intent.utils._
 import org.apache.nlpcraft.probe.mgrs.model.antlr4.{NCSynonymDslBaseListener, 
NCSynonymDslLexer, NCSynonymDslParser}
 
 import scala.collection.JavaConverters._
@@ -69,8 +70,8 @@ object NCModelSynonymDslCompiler extends LazyLogging {
          * 
          * @return
          */
-        def getCompiledSynonymDsl: NCModelSynonymDsl = {
-            NCModelSynonymDsl(alias, toJavaFunc(alias, predStack.pop()))
+        def getCompiledSynonymDsl: NCDslSynonym = {
+            utils.NCDslSynonym(alias, toJavaFunc(alias, predStack.pop()))
         }
     
 //        override def exitRvalSingle(ctx: 
NCSynonymDslParser.RvalSingleContext): Unit = {
@@ -264,7 +265,7 @@ object NCModelSynonymDslCompiler extends LazyLogging {
      * @param dsl Synonym DSL to parse.
      * @return
      */
-    def parse(dsl: String): NCModelSynonymDsl = {
+    def parse(dsl: String): NCDslSynonym = {
         require(dsl != null)
         
         // ANTLR4 armature.
diff --git 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/model/intent/dsl/compiler/NCIntentDslCompilerSpec.scala
 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/model/intent/dsl/compiler/NCIntentDslCompilerSpec.scala
index 63d3e68..a7b2d95 100644
--- 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/model/intent/dsl/compiler/NCIntentDslCompilerSpec.scala
+++ 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/model/intent/dsl/compiler/NCIntentDslCompilerSpec.scala
@@ -35,7 +35,7 @@ class NCIntentDslCompilerSpec {
      */
     private def checkCompileOk(dsl: String): Unit =
         try {
-            NCIntentDslCompiler.compile(dsl, MODEL_ID)
+            NCIntentDslCompiler.compileIntent(dsl, MODEL_ID)
 
             assert(true)
         }
@@ -49,7 +49,7 @@ class NCIntentDslCompilerSpec {
       */
     private def checkPathCompileOk(path: Path): Unit =
         try {
-            NCIntentDslCompiler.compilePath(path, MODEL_ID)
+            NCIntentDslCompiler.compileIntent(path, MODEL_ID)
             
             assert(true)
         }
@@ -63,7 +63,7 @@ class NCIntentDslCompilerSpec {
      */
     private def checkCompileError(txt: String): Unit =
         try {
-            NCIntentDslCompiler.compile(txt, MODEL_ID)
+            NCIntentDslCompiler.compileIntent(txt, MODEL_ID)
 
             assert(false)
         } catch {
diff --git 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/model/intent/dsl/compiler/test_ok.nc
 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/model/intent/dsl/compiler/test_ok.nc
index 0042488..cd0a137 100644
--- 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/model/intent/dsl/compiler/test_ok.nc
+++ 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/model/intent/dsl/compiler/test_ok.nc
@@ -21,7 +21,7 @@
 
 // Re-usable predicate #1.
 fragment=p1
-    term={1 == 2}
+    term={id(part("alias")) == 2}
 
 // Intent #1.
 intent=i1

Reply via email to