simple-graph-query 2.8.2 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -48438,6 +48438,7 @@ module.exports = function whichTypedArray(value) {
48438
48438
  Object.defineProperty(exports, "__esModule", ({ value: true }));
48439
48439
  exports.NameNotFoundError = exports.ForgeExprEvaluator = exports.SUPPORTED_BUILTINS = void 0;
48440
48440
  exports.areTupleArraysEqual = areTupleArraysEqual;
48441
+ exports.unquoteStringLiteral = unquoteStringLiteral;
48441
48442
  const AbstractParseTreeVisitor_1 = __webpack_require__(/*! antlr4ts/tree/AbstractParseTreeVisitor */ "./node_modules/antlr4ts/tree/AbstractParseTreeVisitor.js");
48442
48443
  const utils_1 = __webpack_require__(/*! ./forge-antlr/utils */ "./src/forge-antlr/utils.ts");
48443
48444
  const lodash_1 = __webpack_require__(/*! lodash */ "./node_modules/lodash/lodash.js");
@@ -48475,17 +48476,72 @@ function extractNumber(val) {
48475
48476
  function isString(value) {
48476
48477
  return typeof value === "string";
48477
48478
  }
48478
- // Helper to create a string key from a tuple for fast lookup
48479
+ // Helper to create a string key from a tuple for fast lookup.
48480
+ //
48481
+ // The key is JSON.stringify because it is type-preserving: the atom 1 and the
48482
+ // atom "1" must not collide (buildRelationCache coerces numeric-looking atoms
48483
+ // to numbers). Measurement also showed V8's stringify outruns hand-rolled
48484
+ // delimiter keys, so there is nothing to gain from a custom key function.
48479
48485
  function tupleToKey(tuple) {
48480
48486
  return JSON.stringify(tuple);
48481
48487
  }
48488
+ // Canonical-key side-channel: relationKeys maps a RELATION VALUE (an outer
48489
+ // Tuple[] array) to its tuples' canonical keys, index-aligned. Keys are
48490
+ // computed at most once per relation value; set operations (union,
48491
+ // intersection, difference, dedup, subset) then reuse them instead of
48492
+ // re-serializing every tuple on every operation.
48493
+ //
48494
+ // This is keyed on the outer array -- NOT per tuple -- deliberately:
48495
+ // * Relation values are immutable-after-creation in this evaluator (every
48496
+ // operator returns a fresh array; nothing splices/pushes into a result it
48497
+ // has handed out), so an array's keys can never go stale.
48498
+ // * Live entries number in the dozens (base relations + recent
48499
+ // intermediates), so GC ephemeron processing stays trivially cheap. A
48500
+ // per-TUPLE WeakMap memo was measured to be catastrophically slower
48501
+ // (100k+ high-churn entries make major GCs ~10x more expensive).
48502
+ // * The WeakMap drops entries automatically when intermediate results die,
48503
+ // so this adds no leak, and nothing user-visible is attached to tuples.
48504
+ const relationKeys = new WeakMap();
48505
+ // Only relation values at least this large get registered in relationKeys.
48506
+ // Tiny relations (e.g. the singleton sets compared thousands of times inside
48507
+ // quantifier loops) are cheaper to re-serialize than to churn through
48508
+ // WeakMap.set; the side-channel exists to amortize keying of BULK relations.
48509
+ const KEY_REGISTER_MIN = 16;
48510
+ // Get the canonical keys for a relation value, computing (and, for bulk
48511
+ // relations, registering) them on first use. First use costs one stringify
48512
+ // per tuple (exactly what a single set operation used to cost); every later
48513
+ // operation on the same registered relation value gets its keys for free.
48514
+ function ensureKeys(tuples) {
48515
+ let keys = relationKeys.get(tuples);
48516
+ if (keys === undefined) {
48517
+ keys = tuples.map((t) => JSON.stringify(t));
48518
+ if (tuples.length >= KEY_REGISTER_MIN) {
48519
+ relationKeys.set(tuples, keys);
48520
+ }
48521
+ }
48522
+ return keys;
48523
+ }
48482
48524
  function areTuplesEqual(a, b) {
48483
48525
  return a.length === b.length && a.every((val, i) => val === b[i]);
48484
48526
  }
48485
48527
  function isTupleArraySubset(a, b) {
48528
+ // Tiny operands (e.g. the singleton comparisons quantifier loops make
48529
+ // thousands of times) can never be registered in relationKeys, so the key
48530
+ // side-channel is pure overhead for them -- compare directly, with the
48531
+ // short-circuit the direct path allows.
48532
+ if (a.length < KEY_REGISTER_MIN && b.length < KEY_REGISTER_MIN) {
48533
+ const bSet = new Set(b.map(tupleToKey));
48534
+ return a.every((tupleA) => bSet.has(tupleToKey(tupleA)));
48535
+ }
48486
48536
  // Optimize using Set for O(n) lookup instead of O(n²)
48487
- const bSet = new Set(b.map(tupleToKey));
48488
- return a.every((tupleA) => bSet.has(tupleToKey(tupleA)));
48537
+ const bSet = new Set(ensureKeys(b));
48538
+ const aKeys = ensureKeys(a);
48539
+ for (let i = 0; i < a.length; i++) {
48540
+ if (!bSet.has(aKeys[i])) {
48541
+ return false;
48542
+ }
48543
+ }
48544
+ return true;
48489
48545
  }
48490
48546
  function areTupleArraysEqual(a, b) {
48491
48547
  if (a.length !== b.length) {
@@ -48493,19 +48549,38 @@ function areTupleArraysEqual(a, b) {
48493
48549
  }
48494
48550
  return isTupleArraySubset(a, b) && isTupleArraySubset(b, a);
48495
48551
  }
48496
- function deduplicateTuples(tuples) {
48497
- // Optimize using Set for O(n) deduplication instead of O(n²)
48552
+ // Deduplicate the concatenation of several tuple arrays (set semantics),
48553
+ // reusing each part's registered keys when available and registering the
48554
+ // result's keys so downstream operations get them for free.
48555
+ function deduplicateConcat(parts) {
48498
48556
  const seen = new Set();
48499
48557
  const result = [];
48500
- for (const tuple of tuples) {
48501
- const key = tupleToKey(tuple);
48502
- if (!seen.has(key)) {
48503
- seen.add(key);
48504
- result.push(tuple);
48505
- }
48558
+ const resultKeys = [];
48559
+ for (const part of parts) {
48560
+ // Bulk parts go through ensureKeys so their keys are REGISTERED, not just
48561
+ // consumed -- otherwise a relation reaching dedup via union would be
48562
+ // re-serialized on every union until some other op registered it.
48563
+ // Arrays below KEY_REGISTER_MIN are never registered, so skip the WeakMap
48564
+ // machinery for them entirely -- this helper is called once per join
48565
+ // inside quantifier loops, where even the probe is measurable overhead.
48566
+ const partKeys = part.length >= KEY_REGISTER_MIN ? ensureKeys(part) : undefined;
48567
+ for (let i = 0; i < part.length; i++) {
48568
+ const key = partKeys !== undefined ? partKeys[i] : JSON.stringify(part[i]);
48569
+ if (!seen.has(key)) {
48570
+ seen.add(key);
48571
+ result.push(part[i]);
48572
+ resultKeys.push(key);
48573
+ }
48574
+ }
48575
+ }
48576
+ if (result.length >= KEY_REGISTER_MIN) {
48577
+ relationKeys.set(result, resultKeys);
48506
48578
  }
48507
48579
  return result;
48508
48580
  }
48581
+ function deduplicateTuples(tuples) {
48582
+ return deduplicateConcat([tuples]);
48583
+ }
48509
48584
  function getCombinations(arrays) {
48510
48585
  // first, turn each string[][] into a string[] by flattening
48511
48586
  const valueSets = arrays.map((tuple) => tuple.flat());
@@ -48545,10 +48620,11 @@ function transitiveClosure(pairs) {
48545
48620
  graph.get(from).add(to);
48546
48621
  }
48547
48622
  // Use more efficient BFS with index-based queue to avoid O(n) shift() operations
48548
- // NOTE: we use Set<string> instead of Set<[SingleValue, SingleValue]> since
48549
- // TS would compute equality over the object's reference instead of the value
48550
- // when the value is an array
48551
- const transitiveClosureSet = new Set();
48623
+ // NOTE: no dedup set is needed here -- within one `start`, the `visited`
48624
+ // check guarantees each `current` is emitted at most once, and pairs from
48625
+ // different starts differ in their first element. So we can emit real
48626
+ // tuples directly instead of round-tripping through JSON.stringify/parse.
48627
+ const result = [];
48552
48628
  for (const start of graph.keys()) {
48553
48629
  const visited = new Set();
48554
48630
  const queue = [...(graph.get(start) ?? [])];
@@ -48558,7 +48634,7 @@ function transitiveClosure(pairs) {
48558
48634
  if (visited.has(current))
48559
48635
  continue;
48560
48636
  visited.add(current);
48561
- transitiveClosureSet.add(JSON.stringify([start, current]));
48637
+ result.push([start, current]);
48562
48638
  const neighbors = graph.get(current);
48563
48639
  if (neighbors) {
48564
48640
  for (const neighbor of neighbors) {
@@ -48569,8 +48645,7 @@ function transitiveClosure(pairs) {
48569
48645
  }
48570
48646
  }
48571
48647
  }
48572
- // convert the result back to a Tuple[] and return
48573
- return Array.from(transitiveClosureSet).map((pair) => JSON.parse(pair));
48648
+ return result;
48574
48649
  }
48575
48650
  function bitwidthWraparound(value, bitwidth) {
48576
48651
  const modulus = Math.pow(2, bitwidth); // total number of Int values
@@ -48593,6 +48668,74 @@ const SUPPORTED_BINARY_BUILTINS = ["add", "subtract", "multiply", "divide", "rem
48593
48668
  const SUPPORTED_UNARY_BUILTINS = ["abs", "sign", "floor", "ceil"];
48594
48669
  const SUPPORTED_SET_BUILTINS = ["min", "max"];
48595
48670
  exports.SUPPORTED_BUILTINS = SUPPORTED_BINARY_BUILTINS.concat(SUPPORTED_UNARY_BUILTINS, SUPPORTED_SET_BUILTINS);
48671
+ /**
48672
+ * Levenshtein distance, abandoned early once it provably exceeds `limit`.
48673
+ * Returns `limit + 1` in that case, which callers treat as "too far".
48674
+ */
48675
+ function editDistance(a, b, limit) {
48676
+ if (Math.abs(a.length - b.length) > limit) {
48677
+ return limit + 1;
48678
+ }
48679
+ let previous = Array.from({ length: b.length + 1 }, (_, i) => i);
48680
+ for (let i = 1; i <= a.length; i++) {
48681
+ const current = [i];
48682
+ let rowMin = i;
48683
+ for (let j = 1; j <= b.length; j++) {
48684
+ const cost = a[i - 1] === b[j - 1] ? 0 : 1;
48685
+ const value = Math.min(previous[j] + 1, // deletion
48686
+ current[j - 1] + 1, // insertion
48687
+ previous[j - 1] + cost // substitution
48688
+ );
48689
+ current.push(value);
48690
+ rowMin = Math.min(rowMin, value);
48691
+ }
48692
+ if (rowMin > limit) {
48693
+ return limit + 1; // no completion of this row can come back under the limit
48694
+ }
48695
+ previous = current;
48696
+ }
48697
+ return previous[b.length];
48698
+ }
48699
+ /**
48700
+ * Strip the surrounding double quotes from a STRING_TOK and resolve its escape
48701
+ * sequences. The lexer rule is `'"' (~["\\] | '\\' .)* '"'`, so a backslash
48702
+ * always consumes exactly one following character.
48703
+ */
48704
+ function unquoteStringLiteral(text) {
48705
+ const body = text.slice(1, -1);
48706
+ // Overwhelmingly the common case, and the only one worth optimizing: with no
48707
+ // backslash there is nothing to resolve, so skip the scan entirely.
48708
+ if (body.indexOf("\\") === -1) {
48709
+ return body;
48710
+ }
48711
+ let out = "";
48712
+ for (let i = 0; i < body.length; i++) {
48713
+ if (body[i] !== "\\") {
48714
+ out += body[i];
48715
+ continue;
48716
+ }
48717
+ const escaped = body[++i];
48718
+ switch (escaped) {
48719
+ case "n":
48720
+ out += "\n";
48721
+ break;
48722
+ case "t":
48723
+ out += "\t";
48724
+ break;
48725
+ case "r":
48726
+ out += "\r";
48727
+ break;
48728
+ case "0":
48729
+ out += "\0";
48730
+ break;
48731
+ // `\"`, `\\`, and anything else stand for the character itself.
48732
+ default:
48733
+ out += escaped;
48734
+ break;
48735
+ }
48736
+ }
48737
+ return out;
48738
+ }
48596
48739
  /**
48597
48740
  * A recursive evaluator for Forge expressions.
48598
48741
  * This visitor walks the parse tree and prints the type of operation encountered.
@@ -48608,11 +48751,77 @@ class ForgeExprEvaluator extends AbstractParseTreeVisitor_1.AbstractParseTreeVis
48608
48751
  // Index for relations: Map<relationName, Map<firstElement, Tuple[]>>
48609
48752
  // This allows O(1) lookup for patterns like atom.field
48610
48753
  this.relationIndexCache = null;
48754
+ // Diagnostics accumulated during the current evaluation, keyed by name so a
48755
+ // name referenced many times (e.g. inside a comprehension body) reports once.
48756
+ this.diagnostics = new Map();
48611
48757
  this.instanceData = datum;
48612
48758
  this.environmentStack = [];
48613
48759
  this.freeVariableFinder = new ForgeExprFreeVariableFinder_1.ForgeExprFreeVariableFinder(datum);
48614
48760
  this.freeVariables = new Map();
48615
48761
  }
48762
+ /** Diagnostics recorded since the last `resetDiagnostics()`. */
48763
+ getDiagnostics() {
48764
+ return Array.from(this.diagnostics.values());
48765
+ }
48766
+ /** Clear diagnostics. Callers that reuse an evaluator must call this per evaluation. */
48767
+ resetDiagnostics() {
48768
+ this.diagnostics.clear();
48769
+ }
48770
+ /**
48771
+ * Record a name that could not be resolved against this instance.
48772
+ *
48773
+ * This is deliberately a warning rather than an error. The instance format
48774
+ * carries only populated types and relations, so a sig with no atoms in this
48775
+ * instance is indistinguishable from a typo — and a sig can empty out between
48776
+ * frames of the same trace. Failing hard would break working selectors at
48777
+ * exactly the frames where a set happens to be empty.
48778
+ */
48779
+ reportUnresolvedName(name) {
48780
+ if (this.diagnostics.has(name)) {
48781
+ return;
48782
+ }
48783
+ const suggestion = this.suggestName(name);
48784
+ this.diagnostics.set(name, {
48785
+ kind: "unresolved-name",
48786
+ severity: "warning",
48787
+ name,
48788
+ message: `'${name}' does not name a type, relation, or atom in this instance; ` +
48789
+ `it evaluates to the empty set.` +
48790
+ (suggestion ? ` Did you mean '${suggestion}'?` : "") +
48791
+ ` If you meant the string "${name}", write it in double quotes.`,
48792
+ ...(suggestion !== undefined ? { suggestion } : {}),
48793
+ });
48794
+ }
48795
+ /** Closest name in this instance within a small edit distance, if any. */
48796
+ suggestName(name) {
48797
+ this.buildRelationCache();
48798
+ const candidates = new Set();
48799
+ for (const t of this.instanceData.getTypes()) {
48800
+ candidates.add(t.id);
48801
+ }
48802
+ for (const relationName of this.relationCache.keys()) {
48803
+ candidates.add(relationName);
48804
+ }
48805
+ for (const atom of this.instanceData.getAtoms()) {
48806
+ candidates.add(atom.id);
48807
+ }
48808
+ // Allow one edit for short names, two for longer ones. Without this bound
48809
+ // every unresolved name would get a nonsense suggestion.
48810
+ const maxDistance = name.length <= 4 ? 1 : 2;
48811
+ let best;
48812
+ let bestDistance = maxDistance + 1;
48813
+ for (const candidate of candidates) {
48814
+ if (Math.abs(candidate.length - name.length) >= bestDistance) {
48815
+ continue; // length alone rules it out
48816
+ }
48817
+ const distance = editDistance(name, candidate, bestDistance);
48818
+ if (distance < bestDistance) {
48819
+ bestDistance = distance;
48820
+ best = candidate;
48821
+ }
48822
+ }
48823
+ return best;
48824
+ }
48616
48825
  // helper function to build relation cache and indexes
48617
48826
  buildRelationCache() {
48618
48827
  if (this.relationCache !== null) {
@@ -48622,10 +48831,18 @@ class ForgeExprEvaluator extends AbstractParseTreeVisitor_1.AbstractParseTreeVis
48622
48831
  this.relationIndexCache = new Map();
48623
48832
  const relations = this.instanceData.getRelations();
48624
48833
  for (const relation of relations) {
48625
- let relationAtoms = relation.tuples.map((tuple) => tuple.atoms);
48626
- // Convert numeric and boolean strings to their actual types
48627
- relationAtoms = relationAtoms.map((tuple) => tuple.map((value) => this.isConvertibleToNumber(value) ? Number(value) : value));
48628
- relationAtoms = relationAtoms.map((tuple) => tuple.map((value) => this.isConvertibleToBoolean(value) ? this.convertToBoolean(value) : value));
48834
+ // Convert numeric and boolean strings to their actual types, in a
48835
+ // single pass (one fresh tuple array per tuple, not one per coercion).
48836
+ // Numeric-vs-boolean order matches the old two-pass behavior: the two
48837
+ // predicates are disjoint (Number("true") is NaN), so checking numeric
48838
+ // first is equivalent.
48839
+ const relationAtoms = relation.tuples.map((tuple) => tuple.atoms.map((value) => {
48840
+ if (this.isConvertibleToNumber(value))
48841
+ return Number(value);
48842
+ if (this.isConvertibleToBoolean(value))
48843
+ return this.convertToBoolean(value);
48844
+ return value;
48845
+ }));
48629
48846
  // Relation NAMES are not unique — only the qualified id (`Sig<:label`) is.
48630
48847
  // e.g. `open util/ordering[A]` and `open util/ordering[B]` both expose a field
48631
48848
  // named `Next` (`A/Ord<:Next` and `B/Ord<:Next`). A bare-name reference must
@@ -48694,8 +48911,8 @@ class ForgeExprEvaluator extends AbstractParseTreeVisitor_1.AbstractParseTreeVis
48694
48911
  return atom.label !== undefined ? atom.label : atom.id;
48695
48912
  }
48696
48913
  }
48697
- // Fallback: return the value itself
48698
- console.error(`No atom found for value: ${value}`);
48914
+ // Not an atom id. This is the normal case for a string literal — the label
48915
+ // of `"Black"` is just `Black` so it is not worth reporting.
48699
48916
  return value;
48700
48917
  }
48701
48918
  // helper function to get the label as string (used for @: and @str: operators)
@@ -48818,11 +49035,16 @@ class ForgeExprEvaluator extends AbstractParseTreeVisitor_1.AbstractParseTreeVis
48818
49035
  return deduplicateTuples(result);
48819
49036
  }
48820
49037
  // helper function
48821
- cacheResult(ctx, freeVarsKey, result) {
49038
+ cacheResult(ctx, freeVarsKey, result, diagnosticsBefore) {
48822
49039
  if (!this.cachedResults.has(ctx)) {
48823
49040
  this.cachedResults.set(ctx, new Map());
48824
49041
  }
48825
- this.cachedResults.get(ctx).set(freeVarsKey, result);
49042
+ // Diagnostics raised while evaluating this subtree are cached with the
49043
+ // result. Without this, evaluating the same expression twice would report
49044
+ // an unresolved name only the first time, because the second call is a
49045
+ // cache hit and never reaches visitName.
49046
+ const diagnostics = Array.from(this.diagnostics.values()).filter((d) => !diagnosticsBefore.has(d.name));
49047
+ this.cachedResults.get(ctx).set(freeVarsKey, { result, diagnostics });
48826
49048
  }
48827
49049
  // helper function
48828
49050
  getIden() {
@@ -48945,11 +49167,20 @@ class ForgeExprEvaluator extends AbstractParseTreeVisitor_1.AbstractParseTreeVis
48945
49167
  const freeVarsKey = this.constructFreeVariableKey(freeVarValues);
48946
49168
  // check in the cache
48947
49169
  if (foundAllVars && this.cachedResults.has(ctx)) {
48948
- if (this.cachedResults.get(ctx).has(freeVarsKey)) {
48949
- // cache hit!
48950
- return this.cachedResults.get(ctx).get(freeVarsKey);
49170
+ const cached = this.cachedResults.get(ctx).get(freeVarsKey);
49171
+ if (cached !== undefined) {
49172
+ // cache hit! Replay the diagnostics this subtree produced, so a repeat
49173
+ // evaluation reports the same warnings as the first one.
49174
+ for (const diagnostic of cached.diagnostics) {
49175
+ if (!this.diagnostics.has(diagnostic.name)) {
49176
+ this.diagnostics.set(diagnostic.name, diagnostic);
49177
+ }
49178
+ }
49179
+ return cached.result;
48951
49180
  }
48952
49181
  }
49182
+ // Snapshot so we can attribute newly-raised diagnostics to this subtree.
49183
+ const diagnosticsBefore = new Set(this.diagnostics.keys());
48953
49184
  // cache miss! compute results and store the result in the cache before
48954
49185
  // returning. Store the result only for this context node (not for the
48955
49186
  // children) to manage the cache size
@@ -49024,13 +49255,22 @@ class ForgeExprEvaluator extends AbstractParseTreeVisitor_1.AbstractParseTreeVis
49024
49255
  total += bodyNumber;
49025
49256
  }
49026
49257
  this.environmentStack.pop();
49027
- this.cacheResult(ctx, freeVarsKey, total);
49258
+ this.cacheResult(ctx, freeVarsKey, total, diagnosticsBefore);
49028
49259
  return total;
49029
49260
  }
49030
- // Try to optimize numeric comparisons
49261
+ // Try to optimize numeric comparisons.
49262
+ //
49263
+ // The optimizer generates ONLY the bindings that satisfy the comparison
49264
+ // and marks each as true (skipping body evaluation). That is sound for
49265
+ // quantifiers whose result depends on the *satisfying* bindings --
49266
+ // `some`/`no`/`one`/`two`/`lone` (which count them) -- but NOT for `all`,
49267
+ // whose result depends on the existence of a *falsifying* binding. If we
49268
+ // discard the falsifying bindings, `all` never sees a counterexample and
49269
+ // returns `!foundFalse === true` unconditionally. So exclude `all`.
49031
49270
  let product;
49032
49271
  let useOptimizedPath = false;
49033
- if (!isDisjoint && varNames.length >= 2 && (0, NumericConstraintOptimizer_1.areAllNumericSets)(quantifiedSets)) {
49272
+ const isAllQuantifier = ctx.quant().ALL_TOK() !== undefined;
49273
+ if (!isDisjoint && !isAllQuantifier && varNames.length >= 2 && (0, NumericConstraintOptimizer_1.areAllNumericSets)(quantifiedSets)) {
49034
49274
  // Try to detect and optimize numeric comparison patterns
49035
49275
  const pattern = (0, NumericConstraintOptimizer_1.detectNumericComparisonPattern)(barExpr, varNames);
49036
49276
  if (pattern && pattern.type !== 'none') {
@@ -49102,13 +49342,13 @@ class ForgeExprEvaluator extends AbstractParseTreeVisitor_1.AbstractParseTreeVis
49102
49342
  if (ctx.quant().ALL_TOK() && foundFalse) {
49103
49343
  this.environmentStack.pop();
49104
49344
  const value = false;
49105
- this.cacheResult(ctx, freeVarsKey, value);
49345
+ this.cacheResult(ctx, freeVarsKey, value, diagnosticsBefore);
49106
49346
  return value;
49107
49347
  }
49108
49348
  if (ctx.quant().NO_TOK() && foundTrue) {
49109
49349
  this.environmentStack.pop();
49110
49350
  const value = false;
49111
- this.cacheResult(ctx, freeVarsKey, value);
49351
+ this.cacheResult(ctx, freeVarsKey, value, diagnosticsBefore);
49112
49352
  return value;
49113
49353
  }
49114
49354
  if (ctx.quant().mult()) {
@@ -49116,25 +49356,25 @@ class ForgeExprEvaluator extends AbstractParseTreeVisitor_1.AbstractParseTreeVis
49116
49356
  if (multExpr.LONE_TOK() && result.length > 1) {
49117
49357
  this.environmentStack.pop();
49118
49358
  const value = false;
49119
- this.cacheResult(ctx, freeVarsKey, value);
49359
+ this.cacheResult(ctx, freeVarsKey, value, diagnosticsBefore);
49120
49360
  return value;
49121
49361
  }
49122
49362
  if (multExpr.SOME_TOK() && foundTrue) {
49123
49363
  this.environmentStack.pop();
49124
49364
  const value = true;
49125
- this.cacheResult(ctx, freeVarsKey, value);
49365
+ this.cacheResult(ctx, freeVarsKey, value, diagnosticsBefore);
49126
49366
  return value;
49127
49367
  }
49128
49368
  if (multExpr.ONE_TOK() && result.length > 1) {
49129
49369
  this.environmentStack.pop();
49130
49370
  const value = false;
49131
- this.cacheResult(ctx, freeVarsKey, value);
49371
+ this.cacheResult(ctx, freeVarsKey, value, diagnosticsBefore);
49132
49372
  return value;
49133
49373
  }
49134
49374
  if (multExpr.TWO_TOK() && result.length > 2) {
49135
49375
  this.environmentStack.pop();
49136
49376
  const value = false;
49137
- this.cacheResult(ctx, freeVarsKey, value);
49377
+ this.cacheResult(ctx, freeVarsKey, value, diagnosticsBefore);
49138
49378
  return value;
49139
49379
  }
49140
49380
  }
@@ -49142,34 +49382,34 @@ class ForgeExprEvaluator extends AbstractParseTreeVisitor_1.AbstractParseTreeVis
49142
49382
  this.environmentStack.pop();
49143
49383
  if (ctx.quant().ALL_TOK()) {
49144
49384
  const value = !foundFalse;
49145
- this.cacheResult(ctx, freeVarsKey, value);
49385
+ this.cacheResult(ctx, freeVarsKey, value, diagnosticsBefore);
49146
49386
  return value;
49147
49387
  }
49148
49388
  else if (ctx.quant().NO_TOK()) {
49149
49389
  const value = !foundTrue;
49150
- this.cacheResult(ctx, freeVarsKey, value);
49390
+ this.cacheResult(ctx, freeVarsKey, value, diagnosticsBefore);
49151
49391
  return value;
49152
49392
  }
49153
49393
  else if (ctx.quant().mult()) {
49154
49394
  const multExpr = ctx.quant().mult();
49155
49395
  if (multExpr.LONE_TOK()) {
49156
49396
  const value = result.length <= 1;
49157
- this.cacheResult(ctx, freeVarsKey, value);
49397
+ this.cacheResult(ctx, freeVarsKey, value, diagnosticsBefore);
49158
49398
  return value;
49159
49399
  }
49160
49400
  else if (multExpr.SOME_TOK()) {
49161
49401
  const value = foundTrue;
49162
- this.cacheResult(ctx, freeVarsKey, value);
49402
+ this.cacheResult(ctx, freeVarsKey, value, diagnosticsBefore);
49163
49403
  return value;
49164
49404
  }
49165
49405
  else if (multExpr.ONE_TOK()) {
49166
49406
  const value = result.length === 1;
49167
- this.cacheResult(ctx, freeVarsKey, value);
49407
+ this.cacheResult(ctx, freeVarsKey, value, diagnosticsBefore);
49168
49408
  return value;
49169
49409
  }
49170
49410
  else if (multExpr.TWO_TOK()) {
49171
49411
  const value = result.length === 2;
49172
- this.cacheResult(ctx, freeVarsKey, value);
49412
+ this.cacheResult(ctx, freeVarsKey, value, diagnosticsBefore);
49173
49413
  return value;
49174
49414
  }
49175
49415
  }
@@ -49181,7 +49421,7 @@ class ForgeExprEvaluator extends AbstractParseTreeVisitor_1.AbstractParseTreeVis
49181
49421
  //console.log('childrenResults in expr:', childrenResults);
49182
49422
  if (results === undefined) {
49183
49423
  //console.log('returning childrenResults in expr:', childrenResults);
49184
- this.cacheResult(ctx, freeVarsKey, childrenResults);
49424
+ this.cacheResult(ctx, freeVarsKey, childrenResults, diagnosticsBefore);
49185
49425
  return childrenResults;
49186
49426
  }
49187
49427
  if (isSingleValue(results)) {
@@ -49194,7 +49434,7 @@ class ForgeExprEvaluator extends AbstractParseTreeVisitor_1.AbstractParseTreeVis
49194
49434
  results = results.concat(childrenResults);
49195
49435
  }
49196
49436
  //console.log('results being returned in expr:', results);
49197
- this.cacheResult(ctx, freeVarsKey, results);
49437
+ this.cacheResult(ctx, freeVarsKey, results, diagnosticsBefore);
49198
49438
  return results;
49199
49439
  }
49200
49440
  visitExpr1(ctx) {
@@ -49546,20 +49786,34 @@ class ForgeExprEvaluator extends AbstractParseTreeVisitor_1.AbstractParseTreeVis
49546
49786
  if (ctx.SET_TOK()) {
49547
49787
  return childrenResults;
49548
49788
  }
49549
- if (ctx.ONE_TOK()) {
49550
- return isTupleArray(childrenResults) && childrenResults.length === 1;
49551
- }
49552
- if (ctx.TWO_TOK()) {
49553
- return isTupleArray(childrenResults) && childrenResults.length === 2;
49554
- }
49555
- if (ctx.NO_TOK()) {
49556
- return isTupleArray(childrenResults) && childrenResults.length === 0;
49557
- }
49558
- if (ctx.SOME_TOK()) {
49559
- return isTupleArray(childrenResults) && childrenResults.length > 0;
49560
- }
49561
- if (ctx.LONE_TOK()) {
49562
- return isTupleArray(childrenResults) && childrenResults.length <= 1;
49789
+ // For the multiplicity checks, a bare scalar (atom or int) is a singleton
49790
+ // set of size 1. A boolean is not a set, so it gets size -1 and every
49791
+ // multiplicity below is false (matching the previous behavior).
49792
+ if (ctx.ONE_TOK() ||
49793
+ ctx.TWO_TOK() ||
49794
+ ctx.NO_TOK() ||
49795
+ ctx.SOME_TOK() ||
49796
+ ctx.LONE_TOK()) {
49797
+ const setSize = isTupleArray(childrenResults)
49798
+ ? childrenResults.length
49799
+ : isString(childrenResults) || isNumber(childrenResults)
49800
+ ? 1
49801
+ : -1;
49802
+ if (ctx.ONE_TOK()) {
49803
+ return setSize === 1;
49804
+ }
49805
+ if (ctx.TWO_TOK()) {
49806
+ return setSize === 2;
49807
+ }
49808
+ if (ctx.NO_TOK()) {
49809
+ return setSize === 0;
49810
+ }
49811
+ if (ctx.SOME_TOK()) {
49812
+ return setSize > 0;
49813
+ }
49814
+ if (ctx.LONE_TOK()) {
49815
+ return setSize === 0 || setSize === 1;
49816
+ }
49563
49817
  }
49564
49818
  return childrenResults;
49565
49819
  }
@@ -49570,6 +49824,10 @@ class ForgeExprEvaluator extends AbstractParseTreeVisitor_1.AbstractParseTreeVis
49570
49824
  const rightChildValue = this.visit(ctx.expr10());
49571
49825
  // should only work if arities are the same
49572
49826
  if (isSingleValue(leftChildValue) && isSingleValue(rightChildValue)) {
49827
+ // Union has set semantics: two equal scalars collapse to one element.
49828
+ if (leftChildValue === rightChildValue) {
49829
+ return [[leftChildValue]];
49830
+ }
49573
49831
  return [[leftChildValue], [rightChildValue]];
49574
49832
  }
49575
49833
  else if (isSingleValue(leftChildValue) && isTupleArray(rightChildValue)) {
@@ -49577,7 +49835,7 @@ class ForgeExprEvaluator extends AbstractParseTreeVisitor_1.AbstractParseTreeVis
49577
49835
  return leftChildValue;
49578
49836
  }
49579
49837
  if (rightChildValue[0].length === 1) {
49580
- return deduplicateTuples([[leftChildValue], ...rightChildValue]);
49838
+ return deduplicateConcat([[[leftChildValue]], rightChildValue]);
49581
49839
  }
49582
49840
  throw new Error("arity mismatch in set union!");
49583
49841
  }
@@ -49586,7 +49844,7 @@ class ForgeExprEvaluator extends AbstractParseTreeVisitor_1.AbstractParseTreeVis
49586
49844
  return rightChildValue;
49587
49845
  }
49588
49846
  if (leftChildValue[0].length === 1) {
49589
- return deduplicateTuples([...leftChildValue, [rightChildValue]]);
49847
+ return deduplicateConcat([leftChildValue, [[rightChildValue]]]);
49590
49848
  }
49591
49849
  throw new Error("arity mismatch in set union!");
49592
49850
  }
@@ -49601,7 +49859,7 @@ class ForgeExprEvaluator extends AbstractParseTreeVisitor_1.AbstractParseTreeVis
49601
49859
  return leftChildValue;
49602
49860
  }
49603
49861
  if (leftChildValue[0].length === rightChildValue[0].length) {
49604
- return deduplicateTuples([...leftChildValue, ...rightChildValue]);
49862
+ return deduplicateConcat([leftChildValue, rightChildValue]);
49605
49863
  }
49606
49864
  }
49607
49865
  else {
@@ -49647,9 +49905,22 @@ class ForgeExprEvaluator extends AbstractParseTreeVisitor_1.AbstractParseTreeVis
49647
49905
  return leftChildValue;
49648
49906
  }
49649
49907
  if (leftChildValue[0].length === rightChildValue[0].length) {
49650
- // Optimize set difference using Set for O(n+m) instead of O(n*m)
49651
- const rightSet = new Set(rightChildValue.map(tupleToKey));
49652
- return leftChildValue.filter(tuple => !rightSet.has(tupleToKey(tuple)));
49908
+ // Optimize set difference using Set for O(n+m) instead of O(n*m),
49909
+ // reusing canonical keys instead of re-serializing each side.
49910
+ const rightSet = new Set(ensureKeys(rightChildValue));
49911
+ const leftKeys = ensureKeys(leftChildValue);
49912
+ const result = [];
49913
+ const resultKeys = [];
49914
+ for (let i = 0; i < leftChildValue.length; i++) {
49915
+ if (!rightSet.has(leftKeys[i])) {
49916
+ result.push(leftChildValue[i]);
49917
+ resultKeys.push(leftKeys[i]);
49918
+ }
49919
+ }
49920
+ if (result.length >= KEY_REGISTER_MIN) {
49921
+ relationKeys.set(result, resultKeys);
49922
+ }
49923
+ return result;
49653
49924
  }
49654
49925
  }
49655
49926
  else {
@@ -49663,10 +49934,15 @@ class ForgeExprEvaluator extends AbstractParseTreeVisitor_1.AbstractParseTreeVis
49663
49934
  const childrenResults = this.visitChildren(ctx);
49664
49935
  //console.log('childrenResults in expr9:', childrenResults);
49665
49936
  if (ctx.CARD_TOK()) {
49666
- if (!isTupleArray(childrenResults)) {
49667
- throw new Error("The cardinal operator must be applied to a set of tuples!");
49937
+ if (isTupleArray(childrenResults)) {
49938
+ return childrenResults.length;
49939
+ }
49940
+ // A scalar atom or int is a singleton set (cardinality 1). Booleans are
49941
+ // formulas, not sets, so they remain an error.
49942
+ if (isString(childrenResults) || isNumber(childrenResults)) {
49943
+ return 1;
49668
49944
  }
49669
- return childrenResults.length;
49945
+ throw new Error("The cardinal operator must be applied to a set of tuples!");
49670
49946
  }
49671
49947
  return childrenResults;
49672
49948
  }
@@ -49722,9 +49998,22 @@ class ForgeExprEvaluator extends AbstractParseTreeVisitor_1.AbstractParseTreeVis
49722
49998
  return [];
49723
49999
  }
49724
50000
  if (leftChildValue[0].length === rightChildValue[0].length) {
49725
- // Optimize set intersection using Set for O(n+m) instead of O(n*m)
49726
- const rightSet = new Set(rightChildValue.map(tupleToKey));
49727
- return leftChildValue.filter(tuple => rightSet.has(tupleToKey(tuple)));
50001
+ // Optimize set intersection using Set for O(n+m) instead of O(n*m),
50002
+ // reusing canonical keys instead of re-serializing each side.
50003
+ const rightSet = new Set(ensureKeys(rightChildValue));
50004
+ const leftKeys = ensureKeys(leftChildValue);
50005
+ const result = [];
50006
+ const resultKeys = [];
50007
+ for (let i = 0; i < leftChildValue.length; i++) {
50008
+ if (rightSet.has(leftKeys[i])) {
50009
+ result.push(leftChildValue[i]);
50010
+ resultKeys.push(leftKeys[i]);
50011
+ }
50012
+ }
50013
+ if (result.length >= KEY_REGISTER_MIN) {
50014
+ relationKeys.set(result, resultKeys);
50015
+ }
50016
+ return result;
49728
50017
  }
49729
50018
  }
49730
50019
  else {
@@ -49885,63 +50174,36 @@ class ForgeExprEvaluator extends AbstractParseTreeVisitor_1.AbstractParseTreeVis
49885
50174
  else {
49886
50175
  throw new Error("Unknown label operator");
49887
50176
  }
49888
- try {
49889
- const innerResult = this.visit(innerExpr);
49890
- // Special case: if result is empty array, it means unknown identifier, so use the text
49891
- if (isTupleArray(innerResult) && innerResult.length === 0) {
49892
- // For unknown identifiers, try to convert the text directly
49893
- let text = innerExpr.text;
49894
- // Remove parentheses if present
49895
- if (text.startsWith('(') && text.endsWith(')')) {
49896
- text = text.slice(1, -1);
49897
- }
49898
- try {
49899
- return convertFunction(text);
49900
- }
49901
- catch (error) {
49902
- // If conversion fails, fall back to string for unknown identifiers
49903
- return text;
49904
- }
49905
- }
49906
- if (isSingleValue(innerResult)) {
49907
- return convertFunction(innerResult);
49908
- }
49909
- else if (isTupleArray(innerResult)) {
49910
- // For single-element tuple arrays, return the converted label of the element
49911
- if (innerResult.length === 1 && innerResult[0].length === 1) {
49912
- return convertFunction(innerResult[0][0]);
49913
- }
49914
- // For multi-element cases, apply conversion to each tuple element
49915
- return innerResult.map((tuple) => tuple.map((value) => convertFunction(value)));
49916
- }
49917
- throw new Error(`${operatorName} operator can only be applied to single values or tuple arrays`);
49918
- }
49919
- catch (error) {
49920
- // If evaluation fails due to unknown identifier, use the text as the label
49921
- if (error instanceof NameNotFoundError) {
49922
- // Extract the identifier from the inner expression
49923
- let identifierText = innerExpr.text;
49924
- if (identifierText.startsWith('(') && identifierText.endsWith(')')) {
49925
- identifierText = identifierText.slice(1, -1);
49926
- }
49927
- try {
49928
- return convertFunction(identifierText);
49929
- }
49930
- catch (conversionError) {
49931
- // If conversion fails, fall back to string for unknown identifiers
49932
- return identifierText;
49933
- }
50177
+ const innerResult = this.visit(innerExpr);
50178
+ if (isSingleValue(innerResult)) {
50179
+ return convertFunction(innerResult);
50180
+ }
50181
+ else if (isTupleArray(innerResult)) {
50182
+ // For single-element tuple arrays, return the converted label of the element
50183
+ if (innerResult.length === 1 && innerResult[0].length === 1) {
50184
+ return convertFunction(innerResult[0][0]);
49934
50185
  }
49935
- throw error;
50186
+ // Otherwise convert elementwise. An empty operand yields an empty
50187
+ // result — the operand evaluated fine, it just denotes nothing.
50188
+ return innerResult.map((tuple) => tuple.map((value) => convertFunction(value)));
49936
50189
  }
50190
+ throw new Error(`${operatorName} operator can only be applied to single values or tuple arrays`);
49937
50191
  }
49938
50192
  const childrenResults = this.visitChildren(ctx);
49939
50193
  //console.log('visitChildren result for', ctx.text, ':', childrenResults);
49940
50194
  if (ctx.TILDE_TOK()) {
49941
50195
  // this flips the order of the elements in the tuples of a relation if
49942
50196
  // the relation has arity 2
49943
- if (isTupleArray(childrenResults) && childrenResults.length > 0 && childrenResults[0].length === 2) {
49944
- return childrenResults.map((tuple) => [tuple[1], tuple[0]]);
50197
+ if (isTupleArray(childrenResults)) {
50198
+ // The transpose of the empty relation is the empty relation. Guarding
50199
+ // only on `length > 0` made `~<empty>` throw (e.g. `~(left - left)`),
50200
+ // even though `^`/`*` handle the empty relation fine.
50201
+ if (childrenResults.length === 0) {
50202
+ return [];
50203
+ }
50204
+ if (childrenResults[0].length === 2) {
50205
+ return childrenResults.map((tuple) => [tuple[1], tuple[0]]);
50206
+ }
49945
50207
  }
49946
50208
  throw new Error("expected the expression provided to ~ to have arity 2; bad arity received!");
49947
50209
  }
@@ -49955,15 +50217,9 @@ class ForgeExprEvaluator extends AbstractParseTreeVisitor_1.AbstractParseTreeVis
49955
50217
  if (isTupleArray(childrenResults)) {
49956
50218
  const transitiveClosureResult = transitiveClosure(childrenResults);
49957
50219
  const idenResult = this.getIden();
49958
- // Optimize: Use Set for efficient deduplication instead of deduplicateTuples
49959
- const resultSet = new Set();
49960
- for (const tuple of idenResult) {
49961
- resultSet.add(tupleToKey(tuple));
49962
- }
49963
- for (const tuple of transitiveClosureResult) {
49964
- resultSet.add(tupleToKey(tuple));
49965
- }
49966
- return Array.from(resultSet).map(key => JSON.parse(key));
50220
+ // Dedup while preserving the original tuple objects (and their
50221
+ // memoized keys) -- avoids re-materializing every tuple via JSON.parse.
50222
+ return deduplicateTuples(idenResult.concat(transitiveClosureResult));
49967
50223
  }
49968
50224
  }
49969
50225
  return childrenResults;
@@ -50037,6 +50293,14 @@ class ForgeExprEvaluator extends AbstractParseTreeVisitor_1.AbstractParseTreeVis
50037
50293
  // }
50038
50294
  return value;
50039
50295
  }
50296
+ // Handle none (the empty relation). Without this, `none` falls through to
50297
+ // the string-literal branch below and evaluates to the string "none",
50298
+ // which then pollutes every set operation it touches (e.g.
50299
+ // `S + none` gains a spurious `["none"]` element and `#none` throws).
50300
+ // The static analyzer already treats `none` as the empty set.
50301
+ if (constant.NONE_TOK() !== undefined) {
50302
+ return [];
50303
+ }
50040
50304
  // Handle iden (identity relation)
50041
50305
  if (constant.IDEN_TOK() !== undefined) {
50042
50306
  // The identity relation contains tuples (x, x) for every atom x in the universe
@@ -50073,6 +50337,12 @@ class ForgeExprEvaluator extends AbstractParseTreeVisitor_1.AbstractParseTreeVis
50073
50337
  }
50074
50338
  return univRelation;
50075
50339
  }
50340
+ // A double-quoted string literal. This is the ONLY way to write a string,
50341
+ // so `"Black"` is a string regardless of whether the instance happens to
50342
+ // contain a sig or atom named Black.
50343
+ if (constant.STRING_TOK() !== undefined) {
50344
+ return unquoteStringLiteral(constant.STRING_TOK().text);
50345
+ }
50076
50346
  // Handle boolean constants
50077
50347
  if (constant.text === 'true') {
50078
50348
  return true;
@@ -50319,15 +50589,15 @@ class ForgeExprEvaluator extends AbstractParseTreeVisitor_1.AbstractParseTreeVis
50319
50589
  if (exports.SUPPORTED_BUILTINS.includes(identifier)) {
50320
50590
  return identifier;
50321
50591
  }
50322
- // Check if this looks like a label identifier (for label comparison).
50323
- // Labels can be any alphanumeric string with underscores.
50324
- // This allows identifiers like "Black", "red", "my_label", "Color_123", etc.
50325
- // to be treated as string literals in label comparisons (e.g., @:y = Black).
50326
- const labelLikePattern = /^[a-zA-Z_][a-zA-Z0-9_]*$/;
50327
- if (labelLikePattern.test(identifier)) {
50328
- return identifier;
50329
- }
50330
- throw new NameNotFoundError(`bad name ${identifier} referenced!`);
50592
+ // Nothing in this instance answers to this name. Report it and evaluate to
50593
+ // the empty relation rather than throwing: a selector is authored against a
50594
+ // model but run against instances that vary, and a sig that is empty in this
50595
+ // instance is absent from the instance data entirely. See
50596
+ // `reportUnresolvedName`.
50597
+ //
50598
+ // Note this is NOT how string literals are written — use `"..."`.
50599
+ this.reportUnresolvedName(identifier);
50600
+ return [];
50331
50601
  }
50332
50602
  visitQualName(ctx) {
50333
50603
  // NOTE: this currently only supports Int; doesn't support other branches
@@ -50868,6 +51138,7 @@ exports.ForgeExprStaticAnalyzer = void 0;
50868
51138
  const AbstractParseTreeVisitor_1 = __webpack_require__(/*! antlr4ts/tree/AbstractParseTreeVisitor */ "./node_modules/antlr4ts/tree/AbstractParseTreeVisitor.js");
50869
51139
  const ForgeParser_1 = __webpack_require__(/*! ./forge-antlr/ForgeParser */ "./src/forge-antlr/ForgeParser.ts");
50870
51140
  const utils_1 = __webpack_require__(/*! ./forge-antlr/utils */ "./src/forge-antlr/utils.ts");
51141
+ const ForgeExprEvaluator_1 = __webpack_require__(/*! ./ForgeExprEvaluator */ "./src/ForgeExprEvaluator.ts");
50871
51142
  const UNKNOWN = { kind: "unknown" };
50872
51143
  // Helper that wraps the schema with O(1) lookups and lattice queries.
50873
51144
  class SchemaInfo {
@@ -51000,9 +51271,28 @@ function negationOperandText(ctx) {
51000
51271
  class ForgeExprStaticAnalyzer extends AbstractParseTreeVisitor_1.AbstractParseTreeVisitor {
51001
51272
  constructor(schema) {
51002
51273
  super();
51274
+ // Variables bound by enclosing quantifiers / comprehensions. Consulted only
51275
+ // for unresolved-name reporting, so a binder variable is not mistaken for a
51276
+ // missing schema entity.
51277
+ this.boundScopes = [];
51278
+ // Names that resolve to nothing in the schema, in first-seen order.
51279
+ this.unresolved = new Set();
51003
51280
  if (schema)
51004
51281
  this.schema = new SchemaInfo(schema);
51005
51282
  }
51283
+ isBound(name) {
51284
+ return this.boundScopes.some((scope) => scope.has(name));
51285
+ }
51286
+ /** Run `body` with `names` treated as bound. */
51287
+ withBoundScope(names, body) {
51288
+ this.boundScopes.push(names);
51289
+ try {
51290
+ return body();
51291
+ }
51292
+ finally {
51293
+ this.boundScopes.pop();
51294
+ }
51295
+ }
51006
51296
  // Walk a nameList (`a, b, c`) and accumulate identifiers into `out`.
51007
51297
  collectNamesFromList(ctx, out) {
51008
51298
  out.add((0, utils_1.getIdentifierName)(ctx.name()));
@@ -51036,19 +51326,28 @@ class ForgeExprStaticAnalyzer extends AbstractParseTreeVisitor_1.AbstractParseTr
51036
51326
  }
51037
51327
  // Public entry: convert internal lattice value to a verdict + reason.
51038
51328
  analyze(ctx) {
51329
+ this.unresolved.clear();
51330
+ this.boundScopes.length = 0;
51039
51331
  const v = this.visit(ctx);
51332
+ // Collected separately from the fold, which short-circuits. See
51333
+ // `collectUnresolvedNames`.
51334
+ this.boundScopes.length = 0;
51335
+ this.collectUnresolvedNames(ctx);
51336
+ const names = this.unresolved.size > 0
51337
+ ? { unresolvedNames: Array.from(this.unresolved) }
51338
+ : {};
51040
51339
  if (v.kind === "bool") {
51041
51340
  return v.value
51042
- ? { status: "tautology", reason: "expression folds to literal true" }
51043
- : { status: "unsat", reason: "expression folds to literal false" };
51341
+ ? { status: "tautology", reason: "expression folds to literal true", ...names }
51342
+ : { status: "unsat", reason: "expression folds to literal false", ...names };
51044
51343
  }
51045
51344
  if (v.kind === "empty") {
51046
- return { status: "empty", reason: "expression is provably the empty set" };
51345
+ return { status: "empty", reason: "expression is provably the empty set", ...names };
51047
51346
  }
51048
51347
  if (v.kind === "ill-typed") {
51049
- return { status: "ill-typed", reason: v.reason };
51348
+ return { status: "ill-typed", reason: v.reason, ...names };
51050
51349
  }
51051
- return { status: "unknown" };
51350
+ return { status: "unknown", ...names };
51052
51351
  }
51053
51352
  // Arity of an Abstract when known; -1 means "not determinable".
51054
51353
  static arityOf(v) {
@@ -51106,8 +51405,8 @@ class ForgeExprStaticAnalyzer extends AbstractParseTreeVisitor_1.AbstractParseTr
51106
51405
  // Reserved-name check at the binder: under a schema, type/relation names
51107
51406
  // cannot be reused as quantified variables.
51108
51407
  const declListTop = ctx.quantDeclList();
51408
+ const boundHere = new Set();
51109
51409
  if (declListTop) {
51110
- const boundHere = new Set();
51111
51410
  this.collectBoundNames(declListTop, boundHere);
51112
51411
  const reservedError = this.illTypedIfBindsReservedName(boundHere);
51113
51412
  if (reservedError)
@@ -51134,7 +51433,7 @@ class ForgeExprStaticAnalyzer extends AbstractParseTreeVisitor_1.AbstractParseTr
51134
51433
  // and would need the binding to be meaningful).
51135
51434
  let body = UNKNOWN;
51136
51435
  if (blockOrBar.BAR_TOK() && blockOrBar.expr()) {
51137
- body = this.visit(blockOrBar.expr());
51436
+ body = this.withBoundScope(boundHere, () => this.visit(blockOrBar.expr()));
51138
51437
  }
51139
51438
  const mult = quant.mult();
51140
51439
  const isAll = quant.ALL_TOK() !== undefined;
@@ -51777,7 +52076,7 @@ class ForgeExprStaticAnalyzer extends AbstractParseTreeVisitor_1.AbstractParseTr
51777
52076
  return reservedError;
51778
52077
  const blockOrBar = ctx.blockOrBar();
51779
52078
  if (blockOrBar && blockOrBar.BAR_TOK() && blockOrBar.expr()) {
51780
- const body = this.visit(blockOrBar.expr());
52079
+ const body = this.withBoundScope(boundHere, () => this.visit(blockOrBar.expr()));
51781
52080
  if (body.kind === "ill-typed")
51782
52081
  return body;
51783
52082
  if (body.kind === "bool" && !body.value)
@@ -51824,10 +52123,75 @@ class ForgeExprStaticAnalyzer extends AbstractParseTreeVisitor_1.AbstractParseTr
51824
52123
  ? { kind: "typed", arity, columnTypes: cols }
51825
52124
  : { kind: "typed", arity };
51826
52125
  }
52126
+ return UNKNOWN;
51827
52127
  }
51828
52128
  }
51829
52129
  return UNKNOWN;
51830
52130
  }
52131
+ // ---------------------------------------------------------------------
52132
+ // Unresolved-name collection
52133
+ //
52134
+ // This is a separate traversal rather than a side effect of the folding
52135
+ // visitor above. Folding short-circuits — it returns as soon as one child
52136
+ // settles the verdict — so names in the subtrees it skipped would never be
52137
+ // seen. `{x : none, y : Playr | Foo = Foo}` folds to `empty` at the first
52138
+ // decl and never looks at `Playr` or `Foo`. Reporting has to be complete
52139
+ // regardless of how quickly the verdict is decided.
52140
+ // ---------------------------------------------------------------------
52141
+ /** Walk the whole tree, recording every name the schema does not declare. */
52142
+ collectUnresolvedNames(node) {
52143
+ if (!this.schema)
52144
+ return;
52145
+ if (node instanceof ForgeParser_1.NameContext) {
52146
+ this.recordIfUnresolved((0, utils_1.getIdentifierName)(node));
52147
+ return;
52148
+ }
52149
+ // A binder scopes its variables over the body but not over the domains it
52150
+ // binds them from, and its declared names are binding occurrences rather
52151
+ // than references — so neither is walked generically.
52152
+ const binder = this.asBinder(node);
52153
+ if (binder) {
52154
+ const bound = new Set();
52155
+ let decl = binder.declList;
52156
+ while (decl) {
52157
+ this.collectUnresolvedNames(decl.quantDecl().expr());
52158
+ this.collectNamesFromList(decl.quantDecl().nameList(), bound);
52159
+ decl = decl.quantDeclList();
52160
+ }
52161
+ if (binder.body) {
52162
+ this.withBoundScope(bound, () => this.collectUnresolvedNames(binder.body));
52163
+ }
52164
+ return;
52165
+ }
52166
+ for (let i = 0; i < node.childCount; i++) {
52167
+ this.collectUnresolvedNames(node.getChild(i));
52168
+ }
52169
+ }
52170
+ /** The binder parts of a quantifier or set comprehension, if this node is one. */
52171
+ asBinder(node) {
52172
+ const isQuantifier = node instanceof ForgeParser_1.ExprContext && node.quant() !== undefined;
52173
+ const isComprehension = node instanceof ForgeParser_1.Expr18Context && node.LEFT_CURLY_TOK() !== undefined;
52174
+ if (!isQuantifier && !isComprehension)
52175
+ return undefined;
52176
+ const ctx = node;
52177
+ const declList = ctx.quantDeclList();
52178
+ if (!declList)
52179
+ return undefined;
52180
+ return { declList, body: ctx.blockOrBar() };
52181
+ }
52182
+ recordIfUnresolved(id) {
52183
+ if (id === "true" || id === "false")
52184
+ return;
52185
+ if (this.isBound(id) || ForgeExprEvaluator_1.SUPPORTED_BUILTINS.includes(id))
52186
+ return;
52187
+ // Nothing in the schema answers to this name. Unlike the evaluator — which
52188
+ // sees one instance and cannot tell a typo from a sig that is empty in this
52189
+ // frame — a schema lists every declared entity, so this really is a name
52190
+ // that does not exist.
52191
+ if (this.schema.getType(id) || this.schema.getRelations(id).length > 0)
52192
+ return;
52193
+ this.unresolved.add(id);
52194
+ }
51831
52195
  }
51832
52196
  exports.ForgeExprStaticAnalyzer = ForgeExprStaticAnalyzer;
51833
52197
 
@@ -52718,7 +53082,7 @@ ForgeLexer.OPEN_TOK = 1;
52718
53082
  ForgeLexer.LEFT_SQUARE_TOK = 2;
52719
53083
  ForgeLexer.RIGHT_SQUARE_TOK = 3;
52720
53084
  ForgeLexer.AS_TOK = 4;
52721
- ForgeLexer.FILE_PATH_TOK = 5;
53085
+ ForgeLexer.STRING_TOK = 5;
52722
53086
  ForgeLexer.VAR_TOK = 6;
52723
53087
  ForgeLexer.ABSTRACT_TOK = 7;
52724
53088
  ForgeLexer.SIG_TOK = 8;
@@ -52837,7 +53201,7 @@ ForgeLexer.modeNames = [
52837
53201
  "DEFAULT_MODE",
52838
53202
  ];
52839
53203
  ForgeLexer.ruleNames = [
52840
- "OPEN_TOK", "LEFT_SQUARE_TOK", "RIGHT_SQUARE_TOK", "AS_TOK", "FILE_PATH_TOK",
53204
+ "OPEN_TOK", "LEFT_SQUARE_TOK", "RIGHT_SQUARE_TOK", "AS_TOK", "STRING_TOK",
52841
53205
  "VAR_TOK", "ABSTRACT_TOK", "SIG_TOK", "LEFT_CURLY_TOK", "RIGHT_CURLY_TOK",
52842
53206
  "EXTENDS_TOK", "IN_TOK", "PLUS_TOK", "LONE_TOK", "SOME_TOK", "ONE_TOK",
52843
53207
  "TWO_TOK", "SET_TOK", "FUNC_TOK", "PFUNC_TOK", "DISJ_TOK", "COLON_TOK",
@@ -52877,7 +53241,7 @@ ForgeLexer._LITERAL_NAMES = [
52877
53241
  ];
52878
53242
  ForgeLexer._SYMBOLIC_NAMES = [
52879
53243
  undefined, "OPEN_TOK", "LEFT_SQUARE_TOK", "RIGHT_SQUARE_TOK", "AS_TOK",
52880
- "FILE_PATH_TOK", "VAR_TOK", "ABSTRACT_TOK", "SIG_TOK", "LEFT_CURLY_TOK",
53244
+ "STRING_TOK", "VAR_TOK", "ABSTRACT_TOK", "SIG_TOK", "LEFT_CURLY_TOK",
52881
53245
  "RIGHT_CURLY_TOK", "EXTENDS_TOK", "IN_TOK", "PLUS_TOK", "LONE_TOK", "SOME_TOK",
52882
53246
  "ONE_TOK", "TWO_TOK", "SET_TOK", "FUNC_TOK", "PFUNC_TOK", "DISJ_TOK",
52883
53247
  "COLON_TOK", "WHEAT_TOK", "PRED_TOK", "DOT_TOK", "FUN_TOK", "LEFT_PAREN_TOK",
@@ -53890,7 +54254,7 @@ class ForgeParser extends Parser_1.Parser {
53890
54254
  this.state = 220;
53891
54255
  this.match(ForgeParser.OPEN_TOK);
53892
54256
  this.state = 221;
53893
- this.match(ForgeParser.FILE_PATH_TOK);
54257
+ this.match(ForgeParser.STRING_TOK);
53894
54258
  this.state = 224;
53895
54259
  this._errHandler.sync(this);
53896
54260
  _la = this._input.LA(1);
@@ -55033,7 +55397,7 @@ class ForgeParser extends Parser_1.Parser {
55033
55397
  this.enterRule(_localctx, 46, ForgeParser.RULE_const);
55034
55398
  let _la;
55035
55399
  try {
55036
- this.state = 432;
55400
+ this.state = 433;
55037
55401
  this._errHandler.sync(this);
55038
55402
  switch (this._input.LA(1)) {
55039
55403
  case ForgeParser.NONE_TOK:
@@ -55074,6 +55438,13 @@ class ForgeParser extends Parser_1.Parser {
55074
55438
  this.number();
55075
55439
  }
55076
55440
  break;
55441
+ case ForgeParser.STRING_TOK:
55442
+ this.enterOuterAlt(_localctx, 5);
55443
+ {
55444
+ this.state = 432;
55445
+ this.match(ForgeParser.STRING_TOK);
55446
+ }
55447
+ break;
55077
55448
  default:
55078
55449
  throw new NoViableAltException_1.NoViableAltException(this);
55079
55450
  }
@@ -55101,13 +55472,13 @@ class ForgeParser extends Parser_1.Parser {
55101
55472
  try {
55102
55473
  this.enterOuterAlt(_localctx, 1);
55103
55474
  {
55104
- this.state = 434;
55105
- this.match(ForgeParser.ASSERT_TOK);
55106
55475
  this.state = 435;
55107
- this.expr();
55476
+ this.match(ForgeParser.ASSERT_TOK);
55108
55477
  this.state = 436;
55109
- this.match(ForgeParser.IS_TOK);
55478
+ this.expr();
55110
55479
  this.state = 437;
55480
+ this.match(ForgeParser.IS_TOK);
55481
+ this.state = 438;
55111
55482
  _la = this._input.LA(1);
55112
55483
  if (!(((((_la - 40)) & ~0x1F) === 0 && ((1 << (_la - 40)) & ((1 << (ForgeParser.SAT_TOK - 40)) | (1 << (ForgeParser.UNSAT_TOK - 40)) | (1 << (ForgeParser.FORGE_ERROR_TOK - 40)))) !== 0))) {
55113
55484
  this._errHandler.recoverInline(this);
@@ -55119,24 +55490,24 @@ class ForgeParser extends Parser_1.Parser {
55119
55490
  this._errHandler.reportMatch(this);
55120
55491
  this.consume();
55121
55492
  }
55122
- this.state = 439;
55493
+ this.state = 440;
55123
55494
  this._errHandler.sync(this);
55124
55495
  switch (this.interpreter.adaptivePredict(this._input, 48, this._ctx)) {
55125
55496
  case 1:
55126
55497
  {
55127
- this.state = 438;
55498
+ this.state = 439;
55128
55499
  this.scope();
55129
55500
  }
55130
55501
  break;
55131
55502
  }
55132
- this.state = 443;
55503
+ this.state = 444;
55133
55504
  this._errHandler.sync(this);
55134
55505
  _la = this._input.LA(1);
55135
55506
  if (_la === ForgeParser.FOR_TOK) {
55136
55507
  {
55137
- this.state = 441;
55138
- this.match(ForgeParser.FOR_TOK);
55139
55508
  this.state = 442;
55509
+ this.match(ForgeParser.FOR_TOK);
55510
+ this.state = 443;
55140
55511
  this.bounds();
55141
55512
  }
55142
55513
  }
@@ -55165,29 +55536,29 @@ class ForgeParser extends Parser_1.Parser {
55165
55536
  try {
55166
55537
  this.enterOuterAlt(_localctx, 1);
55167
55538
  {
55168
- this.state = 445;
55169
- this.match(ForgeParser.ASSERT_TOK);
55170
55539
  this.state = 446;
55540
+ this.match(ForgeParser.ASSERT_TOK);
55541
+ this.state = 447;
55171
55542
  this.match(ForgeParser.ALL_TOK);
55172
- this.state = 448;
55543
+ this.state = 449;
55173
55544
  this._errHandler.sync(this);
55174
55545
  switch (this.interpreter.adaptivePredict(this._input, 50, this._ctx)) {
55175
55546
  case 1:
55176
55547
  {
55177
- this.state = 447;
55548
+ this.state = 448;
55178
55549
  this.match(ForgeParser.DISJ_TOK);
55179
55550
  }
55180
55551
  break;
55181
55552
  }
55182
- this.state = 450;
55183
- this.quantDeclList();
55184
55553
  this.state = 451;
55185
- this.match(ForgeParser.BAR_TOK);
55554
+ this.quantDeclList();
55186
55555
  this.state = 452;
55187
- this.expr();
55556
+ this.match(ForgeParser.BAR_TOK);
55188
55557
  this.state = 453;
55189
- this.match(ForgeParser.IS_TOK);
55558
+ this.expr();
55190
55559
  this.state = 454;
55560
+ this.match(ForgeParser.IS_TOK);
55561
+ this.state = 455;
55191
55562
  _la = this._input.LA(1);
55192
55563
  if (!(_la === ForgeParser.SUFFICIENT_TOK || _la === ForgeParser.NECESSARY_TOK)) {
55193
55564
  this._errHandler.recoverInline(this);
@@ -55199,41 +55570,41 @@ class ForgeParser extends Parser_1.Parser {
55199
55570
  this._errHandler.reportMatch(this);
55200
55571
  this.consume();
55201
55572
  }
55202
- this.state = 455;
55203
- this.match(ForgeParser.FOR_TOK);
55204
55573
  this.state = 456;
55574
+ this.match(ForgeParser.FOR_TOK);
55575
+ this.state = 457;
55205
55576
  this.name();
55206
- this.state = 461;
55577
+ this.state = 462;
55207
55578
  this._errHandler.sync(this);
55208
55579
  _la = this._input.LA(1);
55209
55580
  if (_la === ForgeParser.LEFT_SQUARE_TOK) {
55210
55581
  {
55211
- this.state = 457;
55212
- this.match(ForgeParser.LEFT_SQUARE_TOK);
55213
55582
  this.state = 458;
55214
- this.exprList();
55583
+ this.match(ForgeParser.LEFT_SQUARE_TOK);
55215
55584
  this.state = 459;
55585
+ this.exprList();
55586
+ this.state = 460;
55216
55587
  this.match(ForgeParser.RIGHT_SQUARE_TOK);
55217
55588
  }
55218
55589
  }
55219
- this.state = 464;
55590
+ this.state = 465;
55220
55591
  this._errHandler.sync(this);
55221
55592
  switch (this.interpreter.adaptivePredict(this._input, 52, this._ctx)) {
55222
55593
  case 1:
55223
55594
  {
55224
- this.state = 463;
55595
+ this.state = 464;
55225
55596
  this.scope();
55226
55597
  }
55227
55598
  break;
55228
55599
  }
55229
- this.state = 468;
55600
+ this.state = 469;
55230
55601
  this._errHandler.sync(this);
55231
55602
  _la = this._input.LA(1);
55232
55603
  if (_la === ForgeParser.FOR_TOK) {
55233
55604
  {
55234
- this.state = 466;
55235
- this.match(ForgeParser.FOR_TOK);
55236
55605
  this.state = 467;
55606
+ this.match(ForgeParser.FOR_TOK);
55607
+ this.state = 468;
55237
55608
  this.bounds();
55238
55609
  }
55239
55610
  }
@@ -55262,13 +55633,13 @@ class ForgeParser extends Parser_1.Parser {
55262
55633
  try {
55263
55634
  this.enterOuterAlt(_localctx, 1);
55264
55635
  {
55265
- this.state = 470;
55266
- this.match(ForgeParser.ASSERT_TOK);
55267
55636
  this.state = 471;
55268
- this.expr();
55637
+ this.match(ForgeParser.ASSERT_TOK);
55269
55638
  this.state = 472;
55270
- this.match(ForgeParser.IS_TOK);
55639
+ this.expr();
55271
55640
  this.state = 473;
55641
+ this.match(ForgeParser.IS_TOK);
55642
+ this.state = 474;
55272
55643
  _la = this._input.LA(1);
55273
55644
  if (!(_la === ForgeParser.SUFFICIENT_TOK || _la === ForgeParser.NECESSARY_TOK)) {
55274
55645
  this._errHandler.recoverInline(this);
@@ -55280,28 +55651,28 @@ class ForgeParser extends Parser_1.Parser {
55280
55651
  this._errHandler.reportMatch(this);
55281
55652
  this.consume();
55282
55653
  }
55283
- this.state = 474;
55284
- this.match(ForgeParser.FOR_TOK);
55285
55654
  this.state = 475;
55655
+ this.match(ForgeParser.FOR_TOK);
55656
+ this.state = 476;
55286
55657
  this.name();
55287
- this.state = 477;
55658
+ this.state = 478;
55288
55659
  this._errHandler.sync(this);
55289
55660
  switch (this.interpreter.adaptivePredict(this._input, 54, this._ctx)) {
55290
55661
  case 1:
55291
55662
  {
55292
- this.state = 476;
55663
+ this.state = 477;
55293
55664
  this.scope();
55294
55665
  }
55295
55666
  break;
55296
55667
  }
55297
- this.state = 481;
55668
+ this.state = 482;
55298
55669
  this._errHandler.sync(this);
55299
55670
  _la = this._input.LA(1);
55300
55671
  if (_la === ForgeParser.FOR_TOK) {
55301
55672
  {
55302
- this.state = 479;
55303
- this.match(ForgeParser.FOR_TOK);
55304
55673
  this.state = 480;
55674
+ this.match(ForgeParser.FOR_TOK);
55675
+ this.state = 481;
55305
55676
  this.bounds();
55306
55677
  }
55307
55678
  }
@@ -55330,13 +55701,13 @@ class ForgeParser extends Parser_1.Parser {
55330
55701
  try {
55331
55702
  this.enterOuterAlt(_localctx, 1);
55332
55703
  {
55333
- this.state = 483;
55334
- this.match(ForgeParser.ASSERT_TOK);
55335
55704
  this.state = 484;
55336
- this.expr();
55705
+ this.match(ForgeParser.ASSERT_TOK);
55337
55706
  this.state = 485;
55338
- this.match(ForgeParser.IS_TOK);
55707
+ this.expr();
55339
55708
  this.state = 486;
55709
+ this.match(ForgeParser.IS_TOK);
55710
+ this.state = 487;
55340
55711
  _la = this._input.LA(1);
55341
55712
  if (!(_la === ForgeParser.CONSISTENT_TOK || _la === ForgeParser.INCONSISTENT_TOK)) {
55342
55713
  this._errHandler.recoverInline(this);
@@ -55348,28 +55719,28 @@ class ForgeParser extends Parser_1.Parser {
55348
55719
  this._errHandler.reportMatch(this);
55349
55720
  this.consume();
55350
55721
  }
55351
- this.state = 487;
55352
- this.match(ForgeParser.WITH_TOK);
55353
55722
  this.state = 488;
55723
+ this.match(ForgeParser.WITH_TOK);
55724
+ this.state = 489;
55354
55725
  this.name();
55355
- this.state = 490;
55726
+ this.state = 491;
55356
55727
  this._errHandler.sync(this);
55357
55728
  switch (this.interpreter.adaptivePredict(this._input, 56, this._ctx)) {
55358
55729
  case 1:
55359
55730
  {
55360
- this.state = 489;
55731
+ this.state = 490;
55361
55732
  this.scope();
55362
55733
  }
55363
55734
  break;
55364
55735
  }
55365
- this.state = 494;
55736
+ this.state = 495;
55366
55737
  this._errHandler.sync(this);
55367
55738
  _la = this._input.LA(1);
55368
55739
  if (_la === ForgeParser.FOR_TOK) {
55369
55740
  {
55370
- this.state = 492;
55371
- this.match(ForgeParser.FOR_TOK);
55372
55741
  this.state = 493;
55742
+ this.match(ForgeParser.FOR_TOK);
55743
+ this.state = 494;
55373
55744
  this.bounds();
55374
55745
  }
55375
55746
  }
@@ -55398,31 +55769,31 @@ class ForgeParser extends Parser_1.Parser {
55398
55769
  try {
55399
55770
  this.enterOuterAlt(_localctx, 1);
55400
55771
  {
55401
- this.state = 496;
55402
- this.match(ForgeParser.TEST_TOK);
55403
55772
  this.state = 497;
55404
- this.match(ForgeParser.SUITE_TOK);
55773
+ this.match(ForgeParser.TEST_TOK);
55405
55774
  this.state = 498;
55406
- this.match(ForgeParser.FOR_TOK);
55775
+ this.match(ForgeParser.SUITE_TOK);
55407
55776
  this.state = 499;
55408
- this.name();
55777
+ this.match(ForgeParser.FOR_TOK);
55409
55778
  this.state = 500;
55779
+ this.name();
55780
+ this.state = 501;
55410
55781
  this.match(ForgeParser.LEFT_CURLY_TOK);
55411
- this.state = 504;
55782
+ this.state = 505;
55412
55783
  this._errHandler.sync(this);
55413
55784
  _la = this._input.LA(1);
55414
55785
  while (((((_la - 29)) & ~0x1F) === 0 && ((1 << (_la - 29)) & ((1 << (ForgeParser.ASSERT_TOK - 29)) | (1 << (ForgeParser.TEST_TOK - 29)) | (1 << (ForgeParser.EXPECT_TOK - 29)))) !== 0) || _la === ForgeParser.EXAMPLE_TOK) {
55415
55786
  {
55416
55787
  {
55417
- this.state = 501;
55788
+ this.state = 502;
55418
55789
  this.testConstruct();
55419
55790
  }
55420
55791
  }
55421
- this.state = 506;
55792
+ this.state = 507;
55422
55793
  this._errHandler.sync(this);
55423
55794
  _la = this._input.LA(1);
55424
55795
  }
55425
- this.state = 507;
55796
+ this.state = 508;
55426
55797
  this.match(ForgeParser.RIGHT_CURLY_TOK);
55427
55798
  }
55428
55799
  }
@@ -55446,48 +55817,48 @@ class ForgeParser extends Parser_1.Parser {
55446
55817
  let _localctx = new TestConstructContext(this._ctx, this.state);
55447
55818
  this.enterRule(_localctx, 58, ForgeParser.RULE_testConstruct);
55448
55819
  try {
55449
- this.state = 515;
55820
+ this.state = 516;
55450
55821
  this._errHandler.sync(this);
55451
55822
  switch (this.interpreter.adaptivePredict(this._input, 59, this._ctx)) {
55452
55823
  case 1:
55453
55824
  this.enterOuterAlt(_localctx, 1);
55454
55825
  {
55455
- this.state = 509;
55826
+ this.state = 510;
55456
55827
  this.exampleDecl();
55457
55828
  }
55458
55829
  break;
55459
55830
  case 2:
55460
55831
  this.enterOuterAlt(_localctx, 2);
55461
55832
  {
55462
- this.state = 510;
55833
+ this.state = 511;
55463
55834
  this.testExpectDecl();
55464
55835
  }
55465
55836
  break;
55466
55837
  case 3:
55467
55838
  this.enterOuterAlt(_localctx, 3);
55468
55839
  {
55469
- this.state = 511;
55840
+ this.state = 512;
55470
55841
  this.quantifiedPropertyDecl();
55471
55842
  }
55472
55843
  break;
55473
55844
  case 4:
55474
55845
  this.enterOuterAlt(_localctx, 4);
55475
55846
  {
55476
- this.state = 512;
55847
+ this.state = 513;
55477
55848
  this.propertyDecl();
55478
55849
  }
55479
55850
  break;
55480
55851
  case 5:
55481
55852
  this.enterOuterAlt(_localctx, 5);
55482
55853
  {
55483
- this.state = 513;
55854
+ this.state = 514;
55484
55855
  this.satisfiabilityDecl();
55485
55856
  }
55486
55857
  break;
55487
55858
  case 6:
55488
55859
  this.enterOuterAlt(_localctx, 6);
55489
55860
  {
55490
- this.state = 514;
55861
+ this.state = 515;
55491
55862
  this.consistencyDecl();
55492
55863
  }
55493
55864
  break;
@@ -55515,7 +55886,7 @@ class ForgeParser extends Parser_1.Parser {
55515
55886
  try {
55516
55887
  this.enterOuterAlt(_localctx, 1);
55517
55888
  {
55518
- this.state = 519;
55889
+ this.state = 520;
55519
55890
  this._errHandler.sync(this);
55520
55891
  switch (this._input.LA(1)) {
55521
55892
  case ForgeParser.LONE_TOK:
@@ -55523,13 +55894,13 @@ class ForgeParser extends Parser_1.Parser {
55523
55894
  case ForgeParser.ONE_TOK:
55524
55895
  case ForgeParser.TWO_TOK:
55525
55896
  {
55526
- this.state = 517;
55897
+ this.state = 518;
55527
55898
  this.mult();
55528
55899
  }
55529
55900
  break;
55530
55901
  case ForgeParser.SET_TOK:
55531
55902
  {
55532
- this.state = 518;
55903
+ this.state = 519;
55533
55904
  this.match(ForgeParser.SET_TOK);
55534
55905
  }
55535
55906
  break;
@@ -55538,9 +55909,9 @@ class ForgeParser extends Parser_1.Parser {
55538
55909
  default:
55539
55910
  break;
55540
55911
  }
55541
- this.state = 521;
55912
+ this.state = 522;
55542
55913
  this.match(ForgeParser.ARROW_TOK);
55543
- this.state = 524;
55914
+ this.state = 525;
55544
55915
  this._errHandler.sync(this);
55545
55916
  switch (this._input.LA(1)) {
55546
55917
  case ForgeParser.LONE_TOK:
@@ -55548,16 +55919,17 @@ class ForgeParser extends Parser_1.Parser {
55548
55919
  case ForgeParser.ONE_TOK:
55549
55920
  case ForgeParser.TWO_TOK:
55550
55921
  {
55551
- this.state = 522;
55922
+ this.state = 523;
55552
55923
  this.mult();
55553
55924
  }
55554
55925
  break;
55555
55926
  case ForgeParser.SET_TOK:
55556
55927
  {
55557
- this.state = 523;
55928
+ this.state = 524;
55558
55929
  this.match(ForgeParser.SET_TOK);
55559
55930
  }
55560
55931
  break;
55932
+ case ForgeParser.STRING_TOK:
55561
55933
  case ForgeParser.LEFT_CURLY_TOK:
55562
55934
  case ForgeParser.LEFT_PAREN_TOK:
55563
55935
  case ForgeParser.NONE_TOK:
@@ -55609,7 +55981,7 @@ class ForgeParser extends Parser_1.Parser {
55609
55981
  try {
55610
55982
  this.enterOuterAlt(_localctx, 1);
55611
55983
  {
55612
- this.state = 526;
55984
+ this.state = 527;
55613
55985
  _la = this._input.LA(1);
55614
55986
  if (!(_la === ForgeParser.IN_TOK || _la === ForgeParser.IS_TOK || ((((_la - 95)) & ~0x1F) === 0 && ((1 << (_la - 95)) & ((1 << (ForgeParser.EQ_TOK - 95)) | (1 << (ForgeParser.LT_TOK - 95)) | (1 << (ForgeParser.GT_TOK - 95)) | (1 << (ForgeParser.LEQ_TOK - 95)) | (1 << (ForgeParser.GEQ_TOK - 95)) | (1 << (ForgeParser.NI_TOK - 95)))) !== 0))) {
55615
55987
  this._errHandler.recoverInline(this);
@@ -55645,11 +56017,11 @@ class ForgeParser extends Parser_1.Parser {
55645
56017
  try {
55646
56018
  this.enterOuterAlt(_localctx, 1);
55647
56019
  {
55648
- this.state = 528;
55649
- this.name();
55650
56020
  this.state = 529;
55651
- this.match(ForgeParser.EQ_TOK);
56021
+ this.name();
55652
56022
  this.state = 530;
56023
+ this.match(ForgeParser.EQ_TOK);
56024
+ this.state = 531;
55653
56025
  this.expr();
55654
56026
  }
55655
56027
  }
@@ -55676,23 +56048,23 @@ class ForgeParser extends Parser_1.Parser {
55676
56048
  try {
55677
56049
  this.enterOuterAlt(_localctx, 1);
55678
56050
  {
55679
- this.state = 532;
56051
+ this.state = 533;
55680
56052
  this.match(ForgeParser.LEFT_CURLY_TOK);
55681
- this.state = 536;
56053
+ this.state = 537;
55682
56054
  this._errHandler.sync(this);
55683
56055
  _la = this._input.LA(1);
55684
- while (((((_la - 9)) & ~0x1F) === 0 && ((1 << (_la - 9)) & ((1 << (ForgeParser.LEFT_CURLY_TOK - 9)) | (1 << (ForgeParser.LONE_TOK - 9)) | (1 << (ForgeParser.SOME_TOK - 9)) | (1 << (ForgeParser.ONE_TOK - 9)) | (1 << (ForgeParser.TWO_TOK - 9)) | (1 << (ForgeParser.SET_TOK - 9)) | (1 << (ForgeParser.LEFT_PAREN_TOK - 9)) | (1 << (ForgeParser.NONE_TOK - 9)) | (1 << (ForgeParser.UNIV_TOK - 9)) | (1 << (ForgeParser.IDEN_TOK - 9)) | (1 << (ForgeParser.MINUS_TOK - 9)))) !== 0) || ((((_la - 49)) & ~0x1F) === 0 && ((1 << (_la - 49)) & ((1 << (ForgeParser.ALL_TOK - 49)) | (1 << (ForgeParser.LET_TOK - 49)) | (1 << (ForgeParser.BIND_TOK - 49)) | (1 << (ForgeParser.NEG_TOK - 49)) | (1 << (ForgeParser.ALWAYS_TOK - 49)) | (1 << (ForgeParser.EVENTUALLY_TOK - 49)) | (1 << (ForgeParser.AFTER_TOK - 49)) | (1 << (ForgeParser.BEFORE_TOK - 49)) | (1 << (ForgeParser.ONCE_TOK - 49)) | (1 << (ForgeParser.HISTORICALLY_TOK - 49)) | (1 << (ForgeParser.CARD_TOK - 49)) | (1 << (ForgeParser.TILDE_TOK - 49)))) !== 0) || ((((_la - 81)) & ~0x1F) === 0 && ((1 << (_la - 81)) & ((1 << (ForgeParser.EXP_TOK - 81)) | (1 << (ForgeParser.STAR_TOK - 81)) | (1 << (ForgeParser.AT_TOK - 81)) | (1 << (ForgeParser.BACKQUOTE_TOK - 81)) | (1 << (ForgeParser.THIS_TOK - 81)) | (1 << (ForgeParser.SEXPR_TOK - 81)) | (1 << (ForgeParser.GET_LABEL_TOK - 81)) | (1 << (ForgeParser.GET_LABEL_STR_TOK - 81)) | (1 << (ForgeParser.GET_LABEL_BOOL_TOK - 81)) | (1 << (ForgeParser.GET_LABEL_NUM_TOK - 81)) | (1 << (ForgeParser.NO_TOK - 81)) | (1 << (ForgeParser.SUM_TOK - 81)) | (1 << (ForgeParser.INT_TOK - 81)) | (1 << (ForgeParser.NUM_CONST_TOK - 81)) | (1 << (ForgeParser.QUOTED_IDENTIFIER_TOK - 81)) | (1 << (ForgeParser.IDENTIFIER_TOK - 81)))) !== 0)) {
56056
+ while ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << ForgeParser.STRING_TOK) | (1 << ForgeParser.LEFT_CURLY_TOK) | (1 << ForgeParser.LONE_TOK) | (1 << ForgeParser.SOME_TOK) | (1 << ForgeParser.ONE_TOK) | (1 << ForgeParser.TWO_TOK) | (1 << ForgeParser.SET_TOK) | (1 << ForgeParser.LEFT_PAREN_TOK))) !== 0) || ((((_la - 35)) & ~0x1F) === 0 && ((1 << (_la - 35)) & ((1 << (ForgeParser.NONE_TOK - 35)) | (1 << (ForgeParser.UNIV_TOK - 35)) | (1 << (ForgeParser.IDEN_TOK - 35)) | (1 << (ForgeParser.MINUS_TOK - 35)) | (1 << (ForgeParser.ALL_TOK - 35)) | (1 << (ForgeParser.LET_TOK - 35)) | (1 << (ForgeParser.BIND_TOK - 35)))) !== 0) || ((((_la - 67)) & ~0x1F) === 0 && ((1 << (_la - 67)) & ((1 << (ForgeParser.NEG_TOK - 67)) | (1 << (ForgeParser.ALWAYS_TOK - 67)) | (1 << (ForgeParser.EVENTUALLY_TOK - 67)) | (1 << (ForgeParser.AFTER_TOK - 67)) | (1 << (ForgeParser.BEFORE_TOK - 67)) | (1 << (ForgeParser.ONCE_TOK - 67)) | (1 << (ForgeParser.HISTORICALLY_TOK - 67)) | (1 << (ForgeParser.CARD_TOK - 67)) | (1 << (ForgeParser.TILDE_TOK - 67)) | (1 << (ForgeParser.EXP_TOK - 67)) | (1 << (ForgeParser.STAR_TOK - 67)) | (1 << (ForgeParser.AT_TOK - 67)) | (1 << (ForgeParser.BACKQUOTE_TOK - 67)) | (1 << (ForgeParser.THIS_TOK - 67)) | (1 << (ForgeParser.SEXPR_TOK - 67)) | (1 << (ForgeParser.GET_LABEL_TOK - 67)) | (1 << (ForgeParser.GET_LABEL_STR_TOK - 67)) | (1 << (ForgeParser.GET_LABEL_BOOL_TOK - 67)) | (1 << (ForgeParser.GET_LABEL_NUM_TOK - 67)))) !== 0) || ((((_la - 101)) & ~0x1F) === 0 && ((1 << (_la - 101)) & ((1 << (ForgeParser.NO_TOK - 101)) | (1 << (ForgeParser.SUM_TOK - 101)) | (1 << (ForgeParser.INT_TOK - 101)) | (1 << (ForgeParser.NUM_CONST_TOK - 101)) | (1 << (ForgeParser.QUOTED_IDENTIFIER_TOK - 101)) | (1 << (ForgeParser.IDENTIFIER_TOK - 101)))) !== 0)) {
55685
56057
  {
55686
56058
  {
55687
- this.state = 533;
56059
+ this.state = 534;
55688
56060
  this.expr();
55689
56061
  }
55690
56062
  }
55691
- this.state = 538;
56063
+ this.state = 539;
55692
56064
  this._errHandler.sync(this);
55693
56065
  _la = this._input.LA(1);
55694
56066
  }
55695
- this.state = 539;
56067
+ this.state = 540;
55696
56068
  this.match(ForgeParser.RIGHT_CURLY_TOK);
55697
56069
  }
55698
56070
  }
@@ -55716,22 +56088,22 @@ class ForgeParser extends Parser_1.Parser {
55716
56088
  let _localctx = new BlockOrBarContext(this._ctx, this.state);
55717
56089
  this.enterRule(_localctx, 68, ForgeParser.RULE_blockOrBar);
55718
56090
  try {
55719
- this.state = 544;
56091
+ this.state = 545;
55720
56092
  this._errHandler.sync(this);
55721
56093
  switch (this._input.LA(1)) {
55722
56094
  case ForgeParser.LEFT_CURLY_TOK:
55723
56095
  this.enterOuterAlt(_localctx, 1);
55724
56096
  {
55725
- this.state = 541;
56097
+ this.state = 542;
55726
56098
  this.block();
55727
56099
  }
55728
56100
  break;
55729
56101
  case ForgeParser.BAR_TOK:
55730
56102
  this.enterOuterAlt(_localctx, 2);
55731
56103
  {
55732
- this.state = 542;
55733
- this.match(ForgeParser.BAR_TOK);
55734
56104
  this.state = 543;
56105
+ this.match(ForgeParser.BAR_TOK);
56106
+ this.state = 544;
55735
56107
  this.expr();
55736
56108
  }
55737
56109
  break;
@@ -55759,27 +56131,27 @@ class ForgeParser extends Parser_1.Parser {
55759
56131
  let _localctx = new QuantContext(this._ctx, this.state);
55760
56132
  this.enterRule(_localctx, 70, ForgeParser.RULE_quant);
55761
56133
  try {
55762
- this.state = 550;
56134
+ this.state = 551;
55763
56135
  this._errHandler.sync(this);
55764
56136
  switch (this._input.LA(1)) {
55765
56137
  case ForgeParser.ALL_TOK:
55766
56138
  this.enterOuterAlt(_localctx, 1);
55767
56139
  {
55768
- this.state = 546;
56140
+ this.state = 547;
55769
56141
  this.match(ForgeParser.ALL_TOK);
55770
56142
  }
55771
56143
  break;
55772
56144
  case ForgeParser.NO_TOK:
55773
56145
  this.enterOuterAlt(_localctx, 2);
55774
56146
  {
55775
- this.state = 547;
56147
+ this.state = 548;
55776
56148
  this.match(ForgeParser.NO_TOK);
55777
56149
  }
55778
56150
  break;
55779
56151
  case ForgeParser.SUM_TOK:
55780
56152
  this.enterOuterAlt(_localctx, 3);
55781
56153
  {
55782
- this.state = 548;
56154
+ this.state = 549;
55783
56155
  this.match(ForgeParser.SUM_TOK);
55784
56156
  }
55785
56157
  break;
@@ -55789,7 +56161,7 @@ class ForgeParser extends Parser_1.Parser {
55789
56161
  case ForgeParser.TWO_TOK:
55790
56162
  this.enterOuterAlt(_localctx, 4);
55791
56163
  {
55792
- this.state = 549;
56164
+ this.state = 550;
55793
56165
  this.mult();
55794
56166
  }
55795
56167
  break;
@@ -55819,7 +56191,7 @@ class ForgeParser extends Parser_1.Parser {
55819
56191
  let _la;
55820
56192
  try {
55821
56193
  let _alt;
55822
- this.state = 567;
56194
+ this.state = 568;
55823
56195
  this._errHandler.sync(this);
55824
56196
  switch (this._input.LA(1)) {
55825
56197
  case ForgeParser.THIS_TOK:
@@ -55827,50 +56199,50 @@ class ForgeParser extends Parser_1.Parser {
55827
56199
  case ForgeParser.IDENTIFIER_TOK:
55828
56200
  this.enterOuterAlt(_localctx, 1);
55829
56201
  {
55830
- this.state = 554;
56202
+ this.state = 555;
55831
56203
  this._errHandler.sync(this);
55832
56204
  _la = this._input.LA(1);
55833
56205
  if (_la === ForgeParser.THIS_TOK) {
55834
56206
  {
55835
- this.state = 552;
55836
- this.match(ForgeParser.THIS_TOK);
55837
56207
  this.state = 553;
56208
+ this.match(ForgeParser.THIS_TOK);
56209
+ this.state = 554;
55838
56210
  this.match(ForgeParser.SLASH_TOK);
55839
56211
  }
55840
56212
  }
55841
- this.state = 561;
56213
+ this.state = 562;
55842
56214
  this._errHandler.sync(this);
55843
56215
  _alt = this.interpreter.adaptivePredict(this._input, 66, this._ctx);
55844
56216
  while (_alt !== 2 && _alt !== ATN_1.ATN.INVALID_ALT_NUMBER) {
55845
56217
  if (_alt === 1) {
55846
56218
  {
55847
56219
  {
55848
- this.state = 556;
55849
- this.name();
55850
56220
  this.state = 557;
56221
+ this.name();
56222
+ this.state = 558;
55851
56223
  this.match(ForgeParser.SLASH_TOK);
55852
56224
  }
55853
56225
  }
55854
56226
  }
55855
- this.state = 563;
56227
+ this.state = 564;
55856
56228
  this._errHandler.sync(this);
55857
56229
  _alt = this.interpreter.adaptivePredict(this._input, 66, this._ctx);
55858
56230
  }
55859
- this.state = 564;
56231
+ this.state = 565;
55860
56232
  this.name();
55861
56233
  }
55862
56234
  break;
55863
56235
  case ForgeParser.INT_TOK:
55864
56236
  this.enterOuterAlt(_localctx, 2);
55865
56237
  {
55866
- this.state = 565;
56238
+ this.state = 566;
55867
56239
  this.match(ForgeParser.INT_TOK);
55868
56240
  }
55869
56241
  break;
55870
56242
  case ForgeParser.SUM_TOK:
55871
56243
  this.enterOuterAlt(_localctx, 3);
55872
56244
  {
55873
- this.state = 566;
56245
+ this.state = 567;
55874
56246
  this.match(ForgeParser.SUM_TOK);
55875
56247
  }
55876
56248
  break;
@@ -55901,11 +56273,11 @@ class ForgeParser extends Parser_1.Parser {
55901
56273
  try {
55902
56274
  this.enterOuterAlt(_localctx, 1);
55903
56275
  {
55904
- this.state = 569;
55905
- this.match(ForgeParser.OPTION_TOK);
55906
56276
  this.state = 570;
56277
+ this.match(ForgeParser.OPTION_TOK);
56278
+ this.state = 571;
55907
56279
  this.qualName();
55908
- this.state = 577;
56280
+ this.state = 578;
55909
56281
  this._errHandler.sync(this);
55910
56282
  switch (this._input.LA(1)) {
55911
56283
  case ForgeParser.THIS_TOK:
@@ -55914,29 +56286,29 @@ class ForgeParser extends Parser_1.Parser {
55914
56286
  case ForgeParser.QUOTED_IDENTIFIER_TOK:
55915
56287
  case ForgeParser.IDENTIFIER_TOK:
55916
56288
  {
55917
- this.state = 571;
56289
+ this.state = 572;
55918
56290
  this.qualName();
55919
56291
  }
55920
56292
  break;
55921
- case ForgeParser.FILE_PATH_TOK:
56293
+ case ForgeParser.STRING_TOK:
55922
56294
  {
55923
- this.state = 572;
55924
- this.match(ForgeParser.FILE_PATH_TOK);
56295
+ this.state = 573;
56296
+ this.match(ForgeParser.STRING_TOK);
55925
56297
  }
55926
56298
  break;
55927
56299
  case ForgeParser.MINUS_TOK:
55928
56300
  case ForgeParser.NUM_CONST_TOK:
55929
56301
  {
55930
- this.state = 574;
56302
+ this.state = 575;
55931
56303
  this._errHandler.sync(this);
55932
56304
  _la = this._input.LA(1);
55933
56305
  if (_la === ForgeParser.MINUS_TOK) {
55934
56306
  {
55935
- this.state = 573;
56307
+ this.state = 574;
55936
56308
  this.match(ForgeParser.MINUS_TOK);
55937
56309
  }
55938
56310
  }
55939
- this.state = 576;
56311
+ this.state = 577;
55940
56312
  this.number();
55941
56313
  }
55942
56314
  break;
@@ -55968,7 +56340,7 @@ class ForgeParser extends Parser_1.Parser {
55968
56340
  try {
55969
56341
  this.enterOuterAlt(_localctx, 1);
55970
56342
  {
55971
- this.state = 579;
56343
+ this.state = 580;
55972
56344
  _la = this._input.LA(1);
55973
56345
  if (!(_la === ForgeParser.QUOTED_IDENTIFIER_TOK || _la === ForgeParser.IDENTIFIER_TOK)) {
55974
56346
  this._errHandler.recoverInline(this);
@@ -56002,24 +56374,24 @@ class ForgeParser extends Parser_1.Parser {
56002
56374
  let _localctx = new NameListContext(this._ctx, this.state);
56003
56375
  this.enterRule(_localctx, 78, ForgeParser.RULE_nameList);
56004
56376
  try {
56005
- this.state = 586;
56377
+ this.state = 587;
56006
56378
  this._errHandler.sync(this);
56007
56379
  switch (this.interpreter.adaptivePredict(this._input, 70, this._ctx)) {
56008
56380
  case 1:
56009
56381
  this.enterOuterAlt(_localctx, 1);
56010
56382
  {
56011
- this.state = 581;
56383
+ this.state = 582;
56012
56384
  this.name();
56013
56385
  }
56014
56386
  break;
56015
56387
  case 2:
56016
56388
  this.enterOuterAlt(_localctx, 2);
56017
56389
  {
56018
- this.state = 582;
56019
- this.name();
56020
56390
  this.state = 583;
56021
- this.match(ForgeParser.COMMA_TOK);
56391
+ this.name();
56022
56392
  this.state = 584;
56393
+ this.match(ForgeParser.COMMA_TOK);
56394
+ this.state = 585;
56023
56395
  this.nameList();
56024
56396
  }
56025
56397
  break;
@@ -56045,24 +56417,24 @@ class ForgeParser extends Parser_1.Parser {
56045
56417
  let _localctx = new QualNameListContext(this._ctx, this.state);
56046
56418
  this.enterRule(_localctx, 80, ForgeParser.RULE_qualNameList);
56047
56419
  try {
56048
- this.state = 593;
56420
+ this.state = 594;
56049
56421
  this._errHandler.sync(this);
56050
56422
  switch (this.interpreter.adaptivePredict(this._input, 71, this._ctx)) {
56051
56423
  case 1:
56052
56424
  this.enterOuterAlt(_localctx, 1);
56053
56425
  {
56054
- this.state = 588;
56426
+ this.state = 589;
56055
56427
  this.qualName();
56056
56428
  }
56057
56429
  break;
56058
56430
  case 2:
56059
56431
  this.enterOuterAlt(_localctx, 2);
56060
56432
  {
56061
- this.state = 589;
56062
- this.qualName();
56063
56433
  this.state = 590;
56064
- this.match(ForgeParser.COMMA_TOK);
56434
+ this.qualName();
56065
56435
  this.state = 591;
56436
+ this.match(ForgeParser.COMMA_TOK);
56437
+ this.state = 592;
56066
56438
  this.qualNameList();
56067
56439
  }
56068
56440
  break;
@@ -56088,24 +56460,24 @@ class ForgeParser extends Parser_1.Parser {
56088
56460
  let _localctx = new ParaDeclListContext(this._ctx, this.state);
56089
56461
  this.enterRule(_localctx, 82, ForgeParser.RULE_paraDeclList);
56090
56462
  try {
56091
- this.state = 600;
56463
+ this.state = 601;
56092
56464
  this._errHandler.sync(this);
56093
56465
  switch (this.interpreter.adaptivePredict(this._input, 72, this._ctx)) {
56094
56466
  case 1:
56095
56467
  this.enterOuterAlt(_localctx, 1);
56096
56468
  {
56097
- this.state = 595;
56469
+ this.state = 596;
56098
56470
  this.paraDecl();
56099
56471
  }
56100
56472
  break;
56101
56473
  case 2:
56102
56474
  this.enterOuterAlt(_localctx, 2);
56103
56475
  {
56104
- this.state = 596;
56105
- this.paraDecl();
56106
56476
  this.state = 597;
56107
- this.match(ForgeParser.COMMA_TOK);
56477
+ this.paraDecl();
56108
56478
  this.state = 598;
56479
+ this.match(ForgeParser.COMMA_TOK);
56480
+ this.state = 599;
56109
56481
  this.paraDeclList();
56110
56482
  }
56111
56483
  break;
@@ -56131,24 +56503,24 @@ class ForgeParser extends Parser_1.Parser {
56131
56503
  let _localctx = new QuantDeclListContext(this._ctx, this.state);
56132
56504
  this.enterRule(_localctx, 84, ForgeParser.RULE_quantDeclList);
56133
56505
  try {
56134
- this.state = 607;
56506
+ this.state = 608;
56135
56507
  this._errHandler.sync(this);
56136
56508
  switch (this.interpreter.adaptivePredict(this._input, 73, this._ctx)) {
56137
56509
  case 1:
56138
56510
  this.enterOuterAlt(_localctx, 1);
56139
56511
  {
56140
- this.state = 602;
56512
+ this.state = 603;
56141
56513
  this.quantDecl();
56142
56514
  }
56143
56515
  break;
56144
56516
  case 2:
56145
56517
  this.enterOuterAlt(_localctx, 2);
56146
56518
  {
56147
- this.state = 603;
56148
- this.quantDecl();
56149
56519
  this.state = 604;
56150
- this.match(ForgeParser.COMMA_TOK);
56520
+ this.quantDecl();
56151
56521
  this.state = 605;
56522
+ this.match(ForgeParser.COMMA_TOK);
56523
+ this.state = 606;
56152
56524
  this.quantDeclList();
56153
56525
  }
56154
56526
  break;
@@ -56174,24 +56546,24 @@ class ForgeParser extends Parser_1.Parser {
56174
56546
  let _localctx = new ArrowDeclListContext(this._ctx, this.state);
56175
56547
  this.enterRule(_localctx, 86, ForgeParser.RULE_arrowDeclList);
56176
56548
  try {
56177
- this.state = 614;
56549
+ this.state = 615;
56178
56550
  this._errHandler.sync(this);
56179
56551
  switch (this.interpreter.adaptivePredict(this._input, 74, this._ctx)) {
56180
56552
  case 1:
56181
56553
  this.enterOuterAlt(_localctx, 1);
56182
56554
  {
56183
- this.state = 609;
56555
+ this.state = 610;
56184
56556
  this.arrowDecl();
56185
56557
  }
56186
56558
  break;
56187
56559
  case 2:
56188
56560
  this.enterOuterAlt(_localctx, 2);
56189
56561
  {
56190
- this.state = 610;
56191
- this.arrowDecl();
56192
56562
  this.state = 611;
56193
- this.match(ForgeParser.COMMA_TOK);
56563
+ this.arrowDecl();
56194
56564
  this.state = 612;
56565
+ this.match(ForgeParser.COMMA_TOK);
56566
+ this.state = 613;
56195
56567
  this.arrowDeclList();
56196
56568
  }
56197
56569
  break;
@@ -56217,24 +56589,24 @@ class ForgeParser extends Parser_1.Parser {
56217
56589
  let _localctx = new LetDeclListContext(this._ctx, this.state);
56218
56590
  this.enterRule(_localctx, 88, ForgeParser.RULE_letDeclList);
56219
56591
  try {
56220
- this.state = 621;
56592
+ this.state = 622;
56221
56593
  this._errHandler.sync(this);
56222
56594
  switch (this.interpreter.adaptivePredict(this._input, 75, this._ctx)) {
56223
56595
  case 1:
56224
56596
  this.enterOuterAlt(_localctx, 1);
56225
56597
  {
56226
- this.state = 616;
56598
+ this.state = 617;
56227
56599
  this.letDecl();
56228
56600
  }
56229
56601
  break;
56230
56602
  case 2:
56231
56603
  this.enterOuterAlt(_localctx, 2);
56232
56604
  {
56233
- this.state = 617;
56234
- this.letDecl();
56235
56605
  this.state = 618;
56236
- this.match(ForgeParser.COMMA_TOK);
56606
+ this.letDecl();
56237
56607
  this.state = 619;
56608
+ this.match(ForgeParser.COMMA_TOK);
56609
+ this.state = 620;
56238
56610
  this.letDeclList();
56239
56611
  }
56240
56612
  break;
@@ -56260,24 +56632,24 @@ class ForgeParser extends Parser_1.Parser {
56260
56632
  let _localctx = new TypescopeListContext(this._ctx, this.state);
56261
56633
  this.enterRule(_localctx, 90, ForgeParser.RULE_typescopeList);
56262
56634
  try {
56263
- this.state = 628;
56635
+ this.state = 629;
56264
56636
  this._errHandler.sync(this);
56265
56637
  switch (this.interpreter.adaptivePredict(this._input, 76, this._ctx)) {
56266
56638
  case 1:
56267
56639
  this.enterOuterAlt(_localctx, 1);
56268
56640
  {
56269
- this.state = 623;
56641
+ this.state = 624;
56270
56642
  this.typescope();
56271
56643
  }
56272
56644
  break;
56273
56645
  case 2:
56274
56646
  this.enterOuterAlt(_localctx, 2);
56275
56647
  {
56276
- this.state = 624;
56277
- this.typescope();
56278
56648
  this.state = 625;
56279
- this.match(ForgeParser.COMMA_TOK);
56649
+ this.typescope();
56280
56650
  this.state = 626;
56651
+ this.match(ForgeParser.COMMA_TOK);
56652
+ this.state = 627;
56281
56653
  this.typescopeList();
56282
56654
  }
56283
56655
  break;
@@ -56303,24 +56675,24 @@ class ForgeParser extends Parser_1.Parser {
56303
56675
  let _localctx = new ExprListContext(this._ctx, this.state);
56304
56676
  this.enterRule(_localctx, 92, ForgeParser.RULE_exprList);
56305
56677
  try {
56306
- this.state = 635;
56678
+ this.state = 636;
56307
56679
  this._errHandler.sync(this);
56308
56680
  switch (this.interpreter.adaptivePredict(this._input, 77, this._ctx)) {
56309
56681
  case 1:
56310
56682
  this.enterOuterAlt(_localctx, 1);
56311
56683
  {
56312
- this.state = 630;
56684
+ this.state = 631;
56313
56685
  this.expr();
56314
56686
  }
56315
56687
  break;
56316
56688
  case 2:
56317
56689
  this.enterOuterAlt(_localctx, 2);
56318
56690
  {
56319
- this.state = 631;
56320
- this.expr();
56321
56691
  this.state = 632;
56322
- this.match(ForgeParser.COMMA_TOK);
56692
+ this.expr();
56323
56693
  this.state = 633;
56694
+ this.match(ForgeParser.COMMA_TOK);
56695
+ this.state = 634;
56324
56696
  this.exprList();
56325
56697
  }
56326
56698
  break;
@@ -56346,56 +56718,56 @@ class ForgeParser extends Parser_1.Parser {
56346
56718
  let _localctx = new ExprContext(this._ctx, this.state);
56347
56719
  this.enterRule(_localctx, 94, ForgeParser.RULE_expr);
56348
56720
  try {
56349
- this.state = 653;
56721
+ this.state = 654;
56350
56722
  this._errHandler.sync(this);
56351
56723
  switch (this.interpreter.adaptivePredict(this._input, 79, this._ctx)) {
56352
56724
  case 1:
56353
56725
  this.enterOuterAlt(_localctx, 1);
56354
56726
  {
56355
- this.state = 637;
56727
+ this.state = 638;
56356
56728
  this.expr1(0);
56357
56729
  }
56358
56730
  break;
56359
56731
  case 2:
56360
56732
  this.enterOuterAlt(_localctx, 2);
56361
56733
  {
56362
- this.state = 638;
56363
- this.match(ForgeParser.LET_TOK);
56364
56734
  this.state = 639;
56365
- this.letDeclList();
56735
+ this.match(ForgeParser.LET_TOK);
56366
56736
  this.state = 640;
56737
+ this.letDeclList();
56738
+ this.state = 641;
56367
56739
  this.blockOrBar();
56368
56740
  }
56369
56741
  break;
56370
56742
  case 3:
56371
56743
  this.enterOuterAlt(_localctx, 3);
56372
56744
  {
56373
- this.state = 642;
56374
- this.match(ForgeParser.BIND_TOK);
56375
56745
  this.state = 643;
56376
- this.letDeclList();
56746
+ this.match(ForgeParser.BIND_TOK);
56377
56747
  this.state = 644;
56748
+ this.letDeclList();
56749
+ this.state = 645;
56378
56750
  this.blockOrBar();
56379
56751
  }
56380
56752
  break;
56381
56753
  case 4:
56382
56754
  this.enterOuterAlt(_localctx, 4);
56383
56755
  {
56384
- this.state = 646;
56756
+ this.state = 647;
56385
56757
  this.quant();
56386
- this.state = 648;
56758
+ this.state = 649;
56387
56759
  this._errHandler.sync(this);
56388
56760
  switch (this.interpreter.adaptivePredict(this._input, 78, this._ctx)) {
56389
56761
  case 1:
56390
56762
  {
56391
- this.state = 647;
56763
+ this.state = 648;
56392
56764
  this.match(ForgeParser.DISJ_TOK);
56393
56765
  }
56394
56766
  break;
56395
56767
  }
56396
- this.state = 650;
56397
- this.quantDeclList();
56398
56768
  this.state = 651;
56769
+ this.quantDeclList();
56770
+ this.state = 652;
56399
56771
  this.blockOrBar();
56400
56772
  }
56401
56773
  break;
@@ -56432,11 +56804,11 @@ class ForgeParser extends Parser_1.Parser {
56432
56804
  this.enterOuterAlt(_localctx, 1);
56433
56805
  {
56434
56806
  {
56435
- this.state = 656;
56807
+ this.state = 657;
56436
56808
  this.expr1_5(0);
56437
56809
  }
56438
56810
  this._ctx._stop = this._input.tryLT(-1);
56439
- this.state = 663;
56811
+ this.state = 664;
56440
56812
  this._errHandler.sync(this);
56441
56813
  _alt = this.interpreter.adaptivePredict(this._input, 80, this._ctx);
56442
56814
  while (_alt !== 2 && _alt !== ATN_1.ATN.INVALID_ALT_NUMBER) {
@@ -56449,18 +56821,18 @@ class ForgeParser extends Parser_1.Parser {
56449
56821
  {
56450
56822
  _localctx = new Expr1Context(_parentctx, _parentState);
56451
56823
  this.pushNewRecursionContext(_localctx, _startState, ForgeParser.RULE_expr1);
56452
- this.state = 658;
56824
+ this.state = 659;
56453
56825
  if (!(this.precpred(this._ctx, 1))) {
56454
56826
  throw this.createFailedPredicateException("this.precpred(this._ctx, 1)");
56455
56827
  }
56456
- this.state = 659;
56457
- this.match(ForgeParser.OR_TOK);
56458
56828
  this.state = 660;
56829
+ this.match(ForgeParser.OR_TOK);
56830
+ this.state = 661;
56459
56831
  this.expr1_5(0);
56460
56832
  }
56461
56833
  }
56462
56834
  }
56463
- this.state = 665;
56835
+ this.state = 666;
56464
56836
  this._errHandler.sync(this);
56465
56837
  _alt = this.interpreter.adaptivePredict(this._input, 80, this._ctx);
56466
56838
  }
@@ -56497,11 +56869,11 @@ class ForgeParser extends Parser_1.Parser {
56497
56869
  this.enterOuterAlt(_localctx, 1);
56498
56870
  {
56499
56871
  {
56500
- this.state = 667;
56872
+ this.state = 668;
56501
56873
  this.expr2(0);
56502
56874
  }
56503
56875
  this._ctx._stop = this._input.tryLT(-1);
56504
- this.state = 674;
56876
+ this.state = 675;
56505
56877
  this._errHandler.sync(this);
56506
56878
  _alt = this.interpreter.adaptivePredict(this._input, 81, this._ctx);
56507
56879
  while (_alt !== 2 && _alt !== ATN_1.ATN.INVALID_ALT_NUMBER) {
@@ -56514,18 +56886,18 @@ class ForgeParser extends Parser_1.Parser {
56514
56886
  {
56515
56887
  _localctx = new Expr1_5Context(_parentctx, _parentState);
56516
56888
  this.pushNewRecursionContext(_localctx, _startState, ForgeParser.RULE_expr1_5);
56517
- this.state = 669;
56889
+ this.state = 670;
56518
56890
  if (!(this.precpred(this._ctx, 1))) {
56519
56891
  throw this.createFailedPredicateException("this.precpred(this._ctx, 1)");
56520
56892
  }
56521
- this.state = 670;
56522
- this.match(ForgeParser.XOR_TOK);
56523
56893
  this.state = 671;
56894
+ this.match(ForgeParser.XOR_TOK);
56895
+ this.state = 672;
56524
56896
  this.expr2(0);
56525
56897
  }
56526
56898
  }
56527
56899
  }
56528
- this.state = 676;
56900
+ this.state = 677;
56529
56901
  this._errHandler.sync(this);
56530
56902
  _alt = this.interpreter.adaptivePredict(this._input, 81, this._ctx);
56531
56903
  }
@@ -56562,11 +56934,11 @@ class ForgeParser extends Parser_1.Parser {
56562
56934
  this.enterOuterAlt(_localctx, 1);
56563
56935
  {
56564
56936
  {
56565
- this.state = 678;
56937
+ this.state = 679;
56566
56938
  this.expr3();
56567
56939
  }
56568
56940
  this._ctx._stop = this._input.tryLT(-1);
56569
- this.state = 685;
56941
+ this.state = 686;
56570
56942
  this._errHandler.sync(this);
56571
56943
  _alt = this.interpreter.adaptivePredict(this._input, 82, this._ctx);
56572
56944
  while (_alt !== 2 && _alt !== ATN_1.ATN.INVALID_ALT_NUMBER) {
@@ -56579,18 +56951,18 @@ class ForgeParser extends Parser_1.Parser {
56579
56951
  {
56580
56952
  _localctx = new Expr2Context(_parentctx, _parentState);
56581
56953
  this.pushNewRecursionContext(_localctx, _startState, ForgeParser.RULE_expr2);
56582
- this.state = 680;
56954
+ this.state = 681;
56583
56955
  if (!(this.precpred(this._ctx, 1))) {
56584
56956
  throw this.createFailedPredicateException("this.precpred(this._ctx, 1)");
56585
56957
  }
56586
- this.state = 681;
56587
- this.match(ForgeParser.IFF_TOK);
56588
56958
  this.state = 682;
56959
+ this.match(ForgeParser.IFF_TOK);
56960
+ this.state = 683;
56589
56961
  this.expr3();
56590
56962
  }
56591
56963
  }
56592
56964
  }
56593
- this.state = 687;
56965
+ this.state = 688;
56594
56966
  this._errHandler.sync(this);
56595
56967
  _alt = this.interpreter.adaptivePredict(this._input, 82, this._ctx);
56596
56968
  }
@@ -56616,33 +56988,33 @@ class ForgeParser extends Parser_1.Parser {
56616
56988
  let _localctx = new Expr3Context(this._ctx, this.state);
56617
56989
  this.enterRule(_localctx, 102, ForgeParser.RULE_expr3);
56618
56990
  try {
56619
- this.state = 696;
56991
+ this.state = 697;
56620
56992
  this._errHandler.sync(this);
56621
56993
  switch (this.interpreter.adaptivePredict(this._input, 84, this._ctx)) {
56622
56994
  case 1:
56623
56995
  this.enterOuterAlt(_localctx, 1);
56624
56996
  {
56625
- this.state = 688;
56997
+ this.state = 689;
56626
56998
  this.expr4(0);
56627
56999
  }
56628
57000
  break;
56629
57001
  case 2:
56630
57002
  this.enterOuterAlt(_localctx, 2);
56631
57003
  {
56632
- this.state = 689;
56633
- this.expr4(0);
56634
57004
  this.state = 690;
56635
- this.match(ForgeParser.IMP_TOK);
57005
+ this.expr4(0);
56636
57006
  this.state = 691;
57007
+ this.match(ForgeParser.IMP_TOK);
57008
+ this.state = 692;
56637
57009
  this.expr3();
56638
- this.state = 694;
57010
+ this.state = 695;
56639
57011
  this._errHandler.sync(this);
56640
57012
  switch (this.interpreter.adaptivePredict(this._input, 83, this._ctx)) {
56641
57013
  case 1:
56642
57014
  {
56643
- this.state = 692;
56644
- this.match(ForgeParser.ELSE_TOK);
56645
57015
  this.state = 693;
57016
+ this.match(ForgeParser.ELSE_TOK);
57017
+ this.state = 694;
56646
57018
  this.expr3();
56647
57019
  }
56648
57020
  break;
@@ -56682,11 +57054,11 @@ class ForgeParser extends Parser_1.Parser {
56682
57054
  this.enterOuterAlt(_localctx, 1);
56683
57055
  {
56684
57056
  {
56685
- this.state = 699;
57057
+ this.state = 700;
56686
57058
  this.expr4_5();
56687
57059
  }
56688
57060
  this._ctx._stop = this._input.tryLT(-1);
56689
- this.state = 706;
57061
+ this.state = 707;
56690
57062
  this._errHandler.sync(this);
56691
57063
  _alt = this.interpreter.adaptivePredict(this._input, 85, this._ctx);
56692
57064
  while (_alt !== 2 && _alt !== ATN_1.ATN.INVALID_ALT_NUMBER) {
@@ -56699,18 +57071,18 @@ class ForgeParser extends Parser_1.Parser {
56699
57071
  {
56700
57072
  _localctx = new Expr4Context(_parentctx, _parentState);
56701
57073
  this.pushNewRecursionContext(_localctx, _startState, ForgeParser.RULE_expr4);
56702
- this.state = 701;
57074
+ this.state = 702;
56703
57075
  if (!(this.precpred(this._ctx, 1))) {
56704
57076
  throw this.createFailedPredicateException("this.precpred(this._ctx, 1)");
56705
57077
  }
56706
- this.state = 702;
56707
- this.match(ForgeParser.AND_TOK);
56708
57078
  this.state = 703;
57079
+ this.match(ForgeParser.AND_TOK);
57080
+ this.state = 704;
56709
57081
  this.expr4_5();
56710
57082
  }
56711
57083
  }
56712
57084
  }
56713
- this.state = 708;
57085
+ this.state = 709;
56714
57086
  this._errHandler.sync(this);
56715
57087
  _alt = this.interpreter.adaptivePredict(this._input, 85, this._ctx);
56716
57088
  }
@@ -56736,57 +57108,57 @@ class ForgeParser extends Parser_1.Parser {
56736
57108
  let _localctx = new Expr4_5Context(this._ctx, this.state);
56737
57109
  this.enterRule(_localctx, 106, ForgeParser.RULE_expr4_5);
56738
57110
  try {
56739
- this.state = 726;
57111
+ this.state = 727;
56740
57112
  this._errHandler.sync(this);
56741
57113
  switch (this.interpreter.adaptivePredict(this._input, 86, this._ctx)) {
56742
57114
  case 1:
56743
57115
  this.enterOuterAlt(_localctx, 1);
56744
57116
  {
56745
- this.state = 709;
57117
+ this.state = 710;
56746
57118
  this.expr5();
56747
57119
  }
56748
57120
  break;
56749
57121
  case 2:
56750
57122
  this.enterOuterAlt(_localctx, 2);
56751
57123
  {
56752
- this.state = 710;
56753
- this.expr5();
56754
57124
  this.state = 711;
56755
- this.match(ForgeParser.UNTIL_TOK);
57125
+ this.expr5();
56756
57126
  this.state = 712;
57127
+ this.match(ForgeParser.UNTIL_TOK);
57128
+ this.state = 713;
56757
57129
  this.expr5();
56758
57130
  }
56759
57131
  break;
56760
57132
  case 3:
56761
57133
  this.enterOuterAlt(_localctx, 3);
56762
57134
  {
56763
- this.state = 714;
56764
- this.expr5();
56765
57135
  this.state = 715;
56766
- this.match(ForgeParser.RELEASE_TOK);
57136
+ this.expr5();
56767
57137
  this.state = 716;
57138
+ this.match(ForgeParser.RELEASE_TOK);
57139
+ this.state = 717;
56768
57140
  this.expr5();
56769
57141
  }
56770
57142
  break;
56771
57143
  case 4:
56772
57144
  this.enterOuterAlt(_localctx, 4);
56773
57145
  {
56774
- this.state = 718;
56775
- this.expr5();
56776
57146
  this.state = 719;
56777
- this.match(ForgeParser.SINCE_TOK);
57147
+ this.expr5();
56778
57148
  this.state = 720;
57149
+ this.match(ForgeParser.SINCE_TOK);
57150
+ this.state = 721;
56779
57151
  this.expr5();
56780
57152
  }
56781
57153
  break;
56782
57154
  case 5:
56783
57155
  this.enterOuterAlt(_localctx, 5);
56784
57156
  {
56785
- this.state = 722;
56786
- this.expr5();
56787
57157
  this.state = 723;
56788
- this.match(ForgeParser.TRIGGERED_TOK);
57158
+ this.expr5();
56789
57159
  this.state = 724;
57160
+ this.match(ForgeParser.TRIGGERED_TOK);
57161
+ this.state = 725;
56790
57162
  this.expr5();
56791
57163
  }
56792
57164
  break;
@@ -56812,9 +57184,10 @@ class ForgeParser extends Parser_1.Parser {
56812
57184
  let _localctx = new Expr5Context(this._ctx, this.state);
56813
57185
  this.enterRule(_localctx, 108, ForgeParser.RULE_expr5);
56814
57186
  try {
56815
- this.state = 743;
57187
+ this.state = 744;
56816
57188
  this._errHandler.sync(this);
56817
57189
  switch (this._input.LA(1)) {
57190
+ case ForgeParser.STRING_TOK:
56818
57191
  case ForgeParser.LEFT_CURLY_TOK:
56819
57192
  case ForgeParser.LONE_TOK:
56820
57193
  case ForgeParser.SOME_TOK:
@@ -56846,70 +57219,70 @@ class ForgeParser extends Parser_1.Parser {
56846
57219
  case ForgeParser.IDENTIFIER_TOK:
56847
57220
  this.enterOuterAlt(_localctx, 1);
56848
57221
  {
56849
- this.state = 728;
57222
+ this.state = 729;
56850
57223
  this.expr6(0);
56851
57224
  }
56852
57225
  break;
56853
57226
  case ForgeParser.NEG_TOK:
56854
57227
  this.enterOuterAlt(_localctx, 2);
56855
57228
  {
56856
- this.state = 729;
56857
- this.match(ForgeParser.NEG_TOK);
56858
57229
  this.state = 730;
57230
+ this.match(ForgeParser.NEG_TOK);
57231
+ this.state = 731;
56859
57232
  this.expr5();
56860
57233
  }
56861
57234
  break;
56862
57235
  case ForgeParser.ALWAYS_TOK:
56863
57236
  this.enterOuterAlt(_localctx, 3);
56864
57237
  {
56865
- this.state = 731;
56866
- this.match(ForgeParser.ALWAYS_TOK);
56867
57238
  this.state = 732;
57239
+ this.match(ForgeParser.ALWAYS_TOK);
57240
+ this.state = 733;
56868
57241
  this.expr5();
56869
57242
  }
56870
57243
  break;
56871
57244
  case ForgeParser.EVENTUALLY_TOK:
56872
57245
  this.enterOuterAlt(_localctx, 4);
56873
57246
  {
56874
- this.state = 733;
56875
- this.match(ForgeParser.EVENTUALLY_TOK);
56876
57247
  this.state = 734;
57248
+ this.match(ForgeParser.EVENTUALLY_TOK);
57249
+ this.state = 735;
56877
57250
  this.expr5();
56878
57251
  }
56879
57252
  break;
56880
57253
  case ForgeParser.AFTER_TOK:
56881
57254
  this.enterOuterAlt(_localctx, 5);
56882
57255
  {
56883
- this.state = 735;
56884
- this.match(ForgeParser.AFTER_TOK);
56885
57256
  this.state = 736;
57257
+ this.match(ForgeParser.AFTER_TOK);
57258
+ this.state = 737;
56886
57259
  this.expr5();
56887
57260
  }
56888
57261
  break;
56889
57262
  case ForgeParser.BEFORE_TOK:
56890
57263
  this.enterOuterAlt(_localctx, 6);
56891
57264
  {
56892
- this.state = 737;
56893
- this.match(ForgeParser.BEFORE_TOK);
56894
57265
  this.state = 738;
57266
+ this.match(ForgeParser.BEFORE_TOK);
57267
+ this.state = 739;
56895
57268
  this.expr5();
56896
57269
  }
56897
57270
  break;
56898
57271
  case ForgeParser.ONCE_TOK:
56899
57272
  this.enterOuterAlt(_localctx, 7);
56900
57273
  {
56901
- this.state = 739;
56902
- this.match(ForgeParser.ONCE_TOK);
56903
57274
  this.state = 740;
57275
+ this.match(ForgeParser.ONCE_TOK);
57276
+ this.state = 741;
56904
57277
  this.expr5();
56905
57278
  }
56906
57279
  break;
56907
57280
  case ForgeParser.HISTORICALLY_TOK:
56908
57281
  this.enterOuterAlt(_localctx, 8);
56909
57282
  {
56910
- this.state = 741;
56911
- this.match(ForgeParser.HISTORICALLY_TOK);
56912
57283
  this.state = 742;
57284
+ this.match(ForgeParser.HISTORICALLY_TOK);
57285
+ this.state = 743;
56913
57286
  this.expr5();
56914
57287
  }
56915
57288
  break;
@@ -56949,11 +57322,11 @@ class ForgeParser extends Parser_1.Parser {
56949
57322
  this.enterOuterAlt(_localctx, 1);
56950
57323
  {
56951
57324
  {
56952
- this.state = 746;
57325
+ this.state = 747;
56953
57326
  this.expr7();
56954
57327
  }
56955
57328
  this._ctx._stop = this._input.tryLT(-1);
56956
- this.state = 757;
57329
+ this.state = 758;
56957
57330
  this._errHandler.sync(this);
56958
57331
  _alt = this.interpreter.adaptivePredict(this._input, 89, this._ctx);
56959
57332
  while (_alt !== 2 && _alt !== ATN_1.ATN.INVALID_ALT_NUMBER) {
@@ -56966,27 +57339,27 @@ class ForgeParser extends Parser_1.Parser {
56966
57339
  {
56967
57340
  _localctx = new Expr6Context(_parentctx, _parentState);
56968
57341
  this.pushNewRecursionContext(_localctx, _startState, ForgeParser.RULE_expr6);
56969
- this.state = 748;
57342
+ this.state = 749;
56970
57343
  if (!(this.precpred(this._ctx, 1))) {
56971
57344
  throw this.createFailedPredicateException("this.precpred(this._ctx, 1)");
56972
57345
  }
56973
- this.state = 750;
57346
+ this.state = 751;
56974
57347
  this._errHandler.sync(this);
56975
57348
  _la = this._input.LA(1);
56976
57349
  if (_la === ForgeParser.NEG_TOK) {
56977
57350
  {
56978
- this.state = 749;
57351
+ this.state = 750;
56979
57352
  this.match(ForgeParser.NEG_TOK);
56980
57353
  }
56981
57354
  }
56982
- this.state = 752;
56983
- this.compareOp();
56984
57355
  this.state = 753;
57356
+ this.compareOp();
57357
+ this.state = 754;
56985
57358
  this.expr7();
56986
57359
  }
56987
57360
  }
56988
57361
  }
56989
- this.state = 759;
57362
+ this.state = 760;
56990
57363
  this._errHandler.sync(this);
56991
57364
  _alt = this.interpreter.adaptivePredict(this._input, 89, this._ctx);
56992
57365
  }
@@ -57013,9 +57386,10 @@ class ForgeParser extends Parser_1.Parser {
57013
57386
  this.enterRule(_localctx, 112, ForgeParser.RULE_expr7);
57014
57387
  let _la;
57015
57388
  try {
57016
- this.state = 763;
57389
+ this.state = 764;
57017
57390
  this._errHandler.sync(this);
57018
57391
  switch (this._input.LA(1)) {
57392
+ case ForgeParser.STRING_TOK:
57019
57393
  case ForgeParser.LEFT_CURLY_TOK:
57020
57394
  case ForgeParser.LEFT_PAREN_TOK:
57021
57395
  case ForgeParser.NONE_TOK:
@@ -57041,7 +57415,7 @@ class ForgeParser extends Parser_1.Parser {
57041
57415
  case ForgeParser.IDENTIFIER_TOK:
57042
57416
  this.enterOuterAlt(_localctx, 1);
57043
57417
  {
57044
- this.state = 760;
57418
+ this.state = 761;
57045
57419
  this.expr8(0);
57046
57420
  }
57047
57421
  break;
@@ -57053,7 +57427,7 @@ class ForgeParser extends Parser_1.Parser {
57053
57427
  case ForgeParser.NO_TOK:
57054
57428
  this.enterOuterAlt(_localctx, 2);
57055
57429
  {
57056
- this.state = 761;
57430
+ this.state = 762;
57057
57431
  _la = this._input.LA(1);
57058
57432
  if (!((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << ForgeParser.LONE_TOK) | (1 << ForgeParser.SOME_TOK) | (1 << ForgeParser.ONE_TOK) | (1 << ForgeParser.TWO_TOK) | (1 << ForgeParser.SET_TOK))) !== 0) || _la === ForgeParser.NO_TOK)) {
57059
57433
  this._errHandler.recoverInline(this);
@@ -57065,7 +57439,7 @@ class ForgeParser extends Parser_1.Parser {
57065
57439
  this._errHandler.reportMatch(this);
57066
57440
  this.consume();
57067
57441
  }
57068
- this.state = 762;
57442
+ this.state = 763;
57069
57443
  this.expr8(0);
57070
57444
  }
57071
57445
  break;
@@ -57105,11 +57479,11 @@ class ForgeParser extends Parser_1.Parser {
57105
57479
  this.enterOuterAlt(_localctx, 1);
57106
57480
  {
57107
57481
  {
57108
- this.state = 766;
57482
+ this.state = 767;
57109
57483
  this.expr9();
57110
57484
  }
57111
57485
  this._ctx._stop = this._input.tryLT(-1);
57112
- this.state = 773;
57486
+ this.state = 774;
57113
57487
  this._errHandler.sync(this);
57114
57488
  _alt = this.interpreter.adaptivePredict(this._input, 91, this._ctx);
57115
57489
  while (_alt !== 2 && _alt !== ATN_1.ATN.INVALID_ALT_NUMBER) {
@@ -57122,11 +57496,11 @@ class ForgeParser extends Parser_1.Parser {
57122
57496
  {
57123
57497
  _localctx = new Expr8Context(_parentctx, _parentState);
57124
57498
  this.pushNewRecursionContext(_localctx, _startState, ForgeParser.RULE_expr8);
57125
- this.state = 768;
57499
+ this.state = 769;
57126
57500
  if (!(this.precpred(this._ctx, 1))) {
57127
57501
  throw this.createFailedPredicateException("this.precpred(this._ctx, 1)");
57128
57502
  }
57129
- this.state = 769;
57503
+ this.state = 770;
57130
57504
  _la = this._input.LA(1);
57131
57505
  if (!(_la === ForgeParser.PLUS_TOK || _la === ForgeParser.MINUS_TOK)) {
57132
57506
  this._errHandler.recoverInline(this);
@@ -57138,12 +57512,12 @@ class ForgeParser extends Parser_1.Parser {
57138
57512
  this._errHandler.reportMatch(this);
57139
57513
  this.consume();
57140
57514
  }
57141
- this.state = 770;
57515
+ this.state = 771;
57142
57516
  this.expr10(0);
57143
57517
  }
57144
57518
  }
57145
57519
  }
57146
- this.state = 775;
57520
+ this.state = 776;
57147
57521
  this._errHandler.sync(this);
57148
57522
  _alt = this.interpreter.adaptivePredict(this._input, 91, this._ctx);
57149
57523
  }
@@ -57169,9 +57543,10 @@ class ForgeParser extends Parser_1.Parser {
57169
57543
  let _localctx = new Expr9Context(this._ctx, this.state);
57170
57544
  this.enterRule(_localctx, 116, ForgeParser.RULE_expr9);
57171
57545
  try {
57172
- this.state = 779;
57546
+ this.state = 780;
57173
57547
  this._errHandler.sync(this);
57174
57548
  switch (this._input.LA(1)) {
57549
+ case ForgeParser.STRING_TOK:
57175
57550
  case ForgeParser.LEFT_CURLY_TOK:
57176
57551
  case ForgeParser.LEFT_PAREN_TOK:
57177
57552
  case ForgeParser.NONE_TOK:
@@ -57196,16 +57571,16 @@ class ForgeParser extends Parser_1.Parser {
57196
57571
  case ForgeParser.IDENTIFIER_TOK:
57197
57572
  this.enterOuterAlt(_localctx, 1);
57198
57573
  {
57199
- this.state = 776;
57574
+ this.state = 777;
57200
57575
  this.expr10(0);
57201
57576
  }
57202
57577
  break;
57203
57578
  case ForgeParser.CARD_TOK:
57204
57579
  this.enterOuterAlt(_localctx, 2);
57205
57580
  {
57206
- this.state = 777;
57207
- this.match(ForgeParser.CARD_TOK);
57208
57581
  this.state = 778;
57582
+ this.match(ForgeParser.CARD_TOK);
57583
+ this.state = 779;
57209
57584
  this.expr9();
57210
57585
  }
57211
57586
  break;
@@ -57244,11 +57619,11 @@ class ForgeParser extends Parser_1.Parser {
57244
57619
  this.enterOuterAlt(_localctx, 1);
57245
57620
  {
57246
57621
  {
57247
- this.state = 782;
57622
+ this.state = 783;
57248
57623
  this.expr11(0);
57249
57624
  }
57250
57625
  this._ctx._stop = this._input.tryLT(-1);
57251
- this.state = 789;
57626
+ this.state = 790;
57252
57627
  this._errHandler.sync(this);
57253
57628
  _alt = this.interpreter.adaptivePredict(this._input, 93, this._ctx);
57254
57629
  while (_alt !== 2 && _alt !== ATN_1.ATN.INVALID_ALT_NUMBER) {
@@ -57261,18 +57636,18 @@ class ForgeParser extends Parser_1.Parser {
57261
57636
  {
57262
57637
  _localctx = new Expr10Context(_parentctx, _parentState);
57263
57638
  this.pushNewRecursionContext(_localctx, _startState, ForgeParser.RULE_expr10);
57264
- this.state = 784;
57639
+ this.state = 785;
57265
57640
  if (!(this.precpred(this._ctx, 1))) {
57266
57641
  throw this.createFailedPredicateException("this.precpred(this._ctx, 1)");
57267
57642
  }
57268
- this.state = 785;
57269
- this.match(ForgeParser.PPLUS_TOK);
57270
57643
  this.state = 786;
57644
+ this.match(ForgeParser.PPLUS_TOK);
57645
+ this.state = 787;
57271
57646
  this.expr11(0);
57272
57647
  }
57273
57648
  }
57274
57649
  }
57275
- this.state = 791;
57650
+ this.state = 792;
57276
57651
  this._errHandler.sync(this);
57277
57652
  _alt = this.interpreter.adaptivePredict(this._input, 93, this._ctx);
57278
57653
  }
@@ -57309,11 +57684,11 @@ class ForgeParser extends Parser_1.Parser {
57309
57684
  this.enterOuterAlt(_localctx, 1);
57310
57685
  {
57311
57686
  {
57312
- this.state = 793;
57687
+ this.state = 794;
57313
57688
  this.expr12(0);
57314
57689
  }
57315
57690
  this._ctx._stop = this._input.tryLT(-1);
57316
- this.state = 800;
57691
+ this.state = 801;
57317
57692
  this._errHandler.sync(this);
57318
57693
  _alt = this.interpreter.adaptivePredict(this._input, 94, this._ctx);
57319
57694
  while (_alt !== 2 && _alt !== ATN_1.ATN.INVALID_ALT_NUMBER) {
@@ -57326,18 +57701,18 @@ class ForgeParser extends Parser_1.Parser {
57326
57701
  {
57327
57702
  _localctx = new Expr11Context(_parentctx, _parentState);
57328
57703
  this.pushNewRecursionContext(_localctx, _startState, ForgeParser.RULE_expr11);
57329
- this.state = 795;
57704
+ this.state = 796;
57330
57705
  if (!(this.precpred(this._ctx, 1))) {
57331
57706
  throw this.createFailedPredicateException("this.precpred(this._ctx, 1)");
57332
57707
  }
57333
- this.state = 796;
57334
- this.match(ForgeParser.AMP_TOK);
57335
57708
  this.state = 797;
57709
+ this.match(ForgeParser.AMP_TOK);
57710
+ this.state = 798;
57336
57711
  this.expr12(0);
57337
57712
  }
57338
57713
  }
57339
57714
  }
57340
- this.state = 802;
57715
+ this.state = 803;
57341
57716
  this._errHandler.sync(this);
57342
57717
  _alt = this.interpreter.adaptivePredict(this._input, 94, this._ctx);
57343
57718
  }
@@ -57374,11 +57749,11 @@ class ForgeParser extends Parser_1.Parser {
57374
57749
  this.enterOuterAlt(_localctx, 1);
57375
57750
  {
57376
57751
  {
57377
- this.state = 804;
57752
+ this.state = 805;
57378
57753
  this.expr13(0);
57379
57754
  }
57380
57755
  this._ctx._stop = this._input.tryLT(-1);
57381
- this.state = 812;
57756
+ this.state = 813;
57382
57757
  this._errHandler.sync(this);
57383
57758
  _alt = this.interpreter.adaptivePredict(this._input, 95, this._ctx);
57384
57759
  while (_alt !== 2 && _alt !== ATN_1.ATN.INVALID_ALT_NUMBER) {
@@ -57391,18 +57766,18 @@ class ForgeParser extends Parser_1.Parser {
57391
57766
  {
57392
57767
  _localctx = new Expr12Context(_parentctx, _parentState);
57393
57768
  this.pushNewRecursionContext(_localctx, _startState, ForgeParser.RULE_expr12);
57394
- this.state = 806;
57769
+ this.state = 807;
57395
57770
  if (!(this.precpred(this._ctx, 1))) {
57396
57771
  throw this.createFailedPredicateException("this.precpred(this._ctx, 1)");
57397
57772
  }
57398
- this.state = 807;
57399
- this.arrowOp();
57400
57773
  this.state = 808;
57774
+ this.arrowOp();
57775
+ this.state = 809;
57401
57776
  this.expr13(0);
57402
57777
  }
57403
57778
  }
57404
57779
  }
57405
- this.state = 814;
57780
+ this.state = 815;
57406
57781
  this._errHandler.sync(this);
57407
57782
  _alt = this.interpreter.adaptivePredict(this._input, 95, this._ctx);
57408
57783
  }
@@ -57440,11 +57815,11 @@ class ForgeParser extends Parser_1.Parser {
57440
57815
  this.enterOuterAlt(_localctx, 1);
57441
57816
  {
57442
57817
  {
57443
- this.state = 816;
57818
+ this.state = 817;
57444
57819
  this.expr14(0);
57445
57820
  }
57446
57821
  this._ctx._stop = this._input.tryLT(-1);
57447
- this.state = 823;
57822
+ this.state = 824;
57448
57823
  this._errHandler.sync(this);
57449
57824
  _alt = this.interpreter.adaptivePredict(this._input, 96, this._ctx);
57450
57825
  while (_alt !== 2 && _alt !== ATN_1.ATN.INVALID_ALT_NUMBER) {
@@ -57457,11 +57832,11 @@ class ForgeParser extends Parser_1.Parser {
57457
57832
  {
57458
57833
  _localctx = new Expr13Context(_parentctx, _parentState);
57459
57834
  this.pushNewRecursionContext(_localctx, _startState, ForgeParser.RULE_expr13);
57460
- this.state = 818;
57835
+ this.state = 819;
57461
57836
  if (!(this.precpred(this._ctx, 1))) {
57462
57837
  throw this.createFailedPredicateException("this.precpred(this._ctx, 1)");
57463
57838
  }
57464
- this.state = 819;
57839
+ this.state = 820;
57465
57840
  _la = this._input.LA(1);
57466
57841
  if (!(_la === ForgeParser.SUBT_TOK || _la === ForgeParser.SUPT_TOK)) {
57467
57842
  this._errHandler.recoverInline(this);
@@ -57473,12 +57848,12 @@ class ForgeParser extends Parser_1.Parser {
57473
57848
  this._errHandler.reportMatch(this);
57474
57849
  this.consume();
57475
57850
  }
57476
- this.state = 820;
57851
+ this.state = 821;
57477
57852
  this.expr14(0);
57478
57853
  }
57479
57854
  }
57480
57855
  }
57481
- this.state = 825;
57856
+ this.state = 826;
57482
57857
  this._errHandler.sync(this);
57483
57858
  _alt = this.interpreter.adaptivePredict(this._input, 96, this._ctx);
57484
57859
  }
@@ -57515,11 +57890,11 @@ class ForgeParser extends Parser_1.Parser {
57515
57890
  this.enterOuterAlt(_localctx, 1);
57516
57891
  {
57517
57892
  {
57518
- this.state = 827;
57893
+ this.state = 828;
57519
57894
  this.expr15(0);
57520
57895
  }
57521
57896
  this._ctx._stop = this._input.tryLT(-1);
57522
- this.state = 836;
57897
+ this.state = 837;
57523
57898
  this._errHandler.sync(this);
57524
57899
  _alt = this.interpreter.adaptivePredict(this._input, 97, this._ctx);
57525
57900
  while (_alt !== 2 && _alt !== ATN_1.ATN.INVALID_ALT_NUMBER) {
@@ -57532,20 +57907,20 @@ class ForgeParser extends Parser_1.Parser {
57532
57907
  {
57533
57908
  _localctx = new Expr14Context(_parentctx, _parentState);
57534
57909
  this.pushNewRecursionContext(_localctx, _startState, ForgeParser.RULE_expr14);
57535
- this.state = 829;
57910
+ this.state = 830;
57536
57911
  if (!(this.precpred(this._ctx, 1))) {
57537
57912
  throw this.createFailedPredicateException("this.precpred(this._ctx, 1)");
57538
57913
  }
57539
- this.state = 830;
57540
- this.match(ForgeParser.LEFT_SQUARE_TOK);
57541
57914
  this.state = 831;
57542
- this.exprList();
57915
+ this.match(ForgeParser.LEFT_SQUARE_TOK);
57543
57916
  this.state = 832;
57917
+ this.exprList();
57918
+ this.state = 833;
57544
57919
  this.match(ForgeParser.RIGHT_SQUARE_TOK);
57545
57920
  }
57546
57921
  }
57547
57922
  }
57548
- this.state = 838;
57923
+ this.state = 839;
57549
57924
  this._errHandler.sync(this);
57550
57925
  _alt = this.interpreter.adaptivePredict(this._input, 97, this._ctx);
57551
57926
  }
@@ -57581,30 +57956,30 @@ class ForgeParser extends Parser_1.Parser {
57581
57956
  let _alt;
57582
57957
  this.enterOuterAlt(_localctx, 1);
57583
57958
  {
57584
- this.state = 846;
57959
+ this.state = 847;
57585
57960
  this._errHandler.sync(this);
57586
57961
  switch (this.interpreter.adaptivePredict(this._input, 98, this._ctx)) {
57587
57962
  case 1:
57588
57963
  {
57589
- this.state = 840;
57964
+ this.state = 841;
57590
57965
  this.expr16(0);
57591
57966
  }
57592
57967
  break;
57593
57968
  case 2:
57594
57969
  {
57595
- this.state = 841;
57596
- this.name();
57597
57970
  this.state = 842;
57598
- this.match(ForgeParser.LEFT_SQUARE_TOK);
57971
+ this.name();
57599
57972
  this.state = 843;
57600
- this.exprList();
57973
+ this.match(ForgeParser.LEFT_SQUARE_TOK);
57601
57974
  this.state = 844;
57975
+ this.exprList();
57976
+ this.state = 845;
57602
57977
  this.match(ForgeParser.RIGHT_SQUARE_TOK);
57603
57978
  }
57604
57979
  break;
57605
57980
  }
57606
57981
  this._ctx._stop = this._input.tryLT(-1);
57607
- this.state = 853;
57982
+ this.state = 854;
57608
57983
  this._errHandler.sync(this);
57609
57984
  _alt = this.interpreter.adaptivePredict(this._input, 99, this._ctx);
57610
57985
  while (_alt !== 2 && _alt !== ATN_1.ATN.INVALID_ALT_NUMBER) {
@@ -57617,18 +57992,18 @@ class ForgeParser extends Parser_1.Parser {
57617
57992
  {
57618
57993
  _localctx = new Expr15Context(_parentctx, _parentState);
57619
57994
  this.pushNewRecursionContext(_localctx, _startState, ForgeParser.RULE_expr15);
57620
- this.state = 848;
57995
+ this.state = 849;
57621
57996
  if (!(this.precpred(this._ctx, 2))) {
57622
57997
  throw this.createFailedPredicateException("this.precpred(this._ctx, 2)");
57623
57998
  }
57624
- this.state = 849;
57625
- this.match(ForgeParser.DOT_TOK);
57626
57999
  this.state = 850;
58000
+ this.match(ForgeParser.DOT_TOK);
58001
+ this.state = 851;
57627
58002
  this.expr16(0);
57628
58003
  }
57629
58004
  }
57630
58005
  }
57631
- this.state = 855;
58006
+ this.state = 856;
57632
58007
  this._errHandler.sync(this);
57633
58008
  _alt = this.interpreter.adaptivePredict(this._input, 99, this._ctx);
57634
58009
  }
@@ -57665,11 +58040,11 @@ class ForgeParser extends Parser_1.Parser {
57665
58040
  this.enterOuterAlt(_localctx, 1);
57666
58041
  {
57667
58042
  {
57668
- this.state = 857;
58043
+ this.state = 858;
57669
58044
  this.expr17();
57670
58045
  }
57671
58046
  this._ctx._stop = this._input.tryLT(-1);
57672
- this.state = 863;
58047
+ this.state = 864;
57673
58048
  this._errHandler.sync(this);
57674
58049
  _alt = this.interpreter.adaptivePredict(this._input, 100, this._ctx);
57675
58050
  while (_alt !== 2 && _alt !== ATN_1.ATN.INVALID_ALT_NUMBER) {
@@ -57682,16 +58057,16 @@ class ForgeParser extends Parser_1.Parser {
57682
58057
  {
57683
58058
  _localctx = new Expr16Context(_parentctx, _parentState);
57684
58059
  this.pushNewRecursionContext(_localctx, _startState, ForgeParser.RULE_expr16);
57685
- this.state = 859;
58060
+ this.state = 860;
57686
58061
  if (!(this.precpred(this._ctx, 1))) {
57687
58062
  throw this.createFailedPredicateException("this.precpred(this._ctx, 1)");
57688
58063
  }
57689
- this.state = 860;
58064
+ this.state = 861;
57690
58065
  this.match(ForgeParser.PRIME_TOK);
57691
58066
  }
57692
58067
  }
57693
58068
  }
57694
- this.state = 865;
58069
+ this.state = 866;
57695
58070
  this._errHandler.sync(this);
57696
58071
  _alt = this.interpreter.adaptivePredict(this._input, 100, this._ctx);
57697
58072
  }
@@ -57718,9 +58093,10 @@ class ForgeParser extends Parser_1.Parser {
57718
58093
  this.enterRule(_localctx, 132, ForgeParser.RULE_expr17);
57719
58094
  let _la;
57720
58095
  try {
57721
- this.state = 869;
58096
+ this.state = 870;
57722
58097
  this._errHandler.sync(this);
57723
58098
  switch (this._input.LA(1)) {
58099
+ case ForgeParser.STRING_TOK:
57724
58100
  case ForgeParser.LEFT_CURLY_TOK:
57725
58101
  case ForgeParser.LEFT_PAREN_TOK:
57726
58102
  case ForgeParser.NONE_TOK:
@@ -57738,7 +58114,7 @@ class ForgeParser extends Parser_1.Parser {
57738
58114
  case ForgeParser.IDENTIFIER_TOK:
57739
58115
  this.enterOuterAlt(_localctx, 1);
57740
58116
  {
57741
- this.state = 866;
58117
+ this.state = 867;
57742
58118
  this.expr18();
57743
58119
  }
57744
58120
  break;
@@ -57751,7 +58127,7 @@ class ForgeParser extends Parser_1.Parser {
57751
58127
  case ForgeParser.GET_LABEL_NUM_TOK:
57752
58128
  this.enterOuterAlt(_localctx, 2);
57753
58129
  {
57754
- this.state = 867;
58130
+ this.state = 868;
57755
58131
  _la = this._input.LA(1);
57756
58132
  if (!(((((_la - 80)) & ~0x1F) === 0 && ((1 << (_la - 80)) & ((1 << (ForgeParser.TILDE_TOK - 80)) | (1 << (ForgeParser.EXP_TOK - 80)) | (1 << (ForgeParser.STAR_TOK - 80)) | (1 << (ForgeParser.GET_LABEL_TOK - 80)) | (1 << (ForgeParser.GET_LABEL_STR_TOK - 80)) | (1 << (ForgeParser.GET_LABEL_BOOL_TOK - 80)) | (1 << (ForgeParser.GET_LABEL_NUM_TOK - 80)))) !== 0))) {
57757
58133
  this._errHandler.recoverInline(this);
@@ -57763,7 +58139,7 @@ class ForgeParser extends Parser_1.Parser {
57763
58139
  this._errHandler.reportMatch(this);
57764
58140
  this.consume();
57765
58141
  }
57766
- this.state = 868;
58142
+ this.state = 869;
57767
58143
  this.expr17();
57768
58144
  }
57769
58145
  break;
@@ -57791,83 +58167,83 @@ class ForgeParser extends Parser_1.Parser {
57791
58167
  let _localctx = new Expr18Context(this._ctx, this.state);
57792
58168
  this.enterRule(_localctx, 134, ForgeParser.RULE_expr18);
57793
58169
  try {
57794
- this.state = 889;
58170
+ this.state = 890;
57795
58171
  this._errHandler.sync(this);
57796
58172
  switch (this.interpreter.adaptivePredict(this._input, 102, this._ctx)) {
57797
58173
  case 1:
57798
58174
  this.enterOuterAlt(_localctx, 1);
57799
58175
  {
57800
- this.state = 871;
58176
+ this.state = 872;
57801
58177
  this.const();
57802
58178
  }
57803
58179
  break;
57804
58180
  case 2:
57805
58181
  this.enterOuterAlt(_localctx, 2);
57806
58182
  {
57807
- this.state = 872;
58183
+ this.state = 873;
57808
58184
  this.qualName();
57809
58185
  }
57810
58186
  break;
57811
58187
  case 3:
57812
58188
  this.enterOuterAlt(_localctx, 3);
57813
58189
  {
57814
- this.state = 873;
57815
- this.match(ForgeParser.AT_TOK);
57816
58190
  this.state = 874;
58191
+ this.match(ForgeParser.AT_TOK);
58192
+ this.state = 875;
57817
58193
  this.name();
57818
58194
  }
57819
58195
  break;
57820
58196
  case 4:
57821
58197
  this.enterOuterAlt(_localctx, 4);
57822
58198
  {
57823
- this.state = 875;
57824
- this.match(ForgeParser.BACKQUOTE_TOK);
57825
58199
  this.state = 876;
58200
+ this.match(ForgeParser.BACKQUOTE_TOK);
58201
+ this.state = 877;
57826
58202
  this.name();
57827
58203
  }
57828
58204
  break;
57829
58205
  case 5:
57830
58206
  this.enterOuterAlt(_localctx, 5);
57831
58207
  {
57832
- this.state = 877;
58208
+ this.state = 878;
57833
58209
  this.match(ForgeParser.THIS_TOK);
57834
58210
  }
57835
58211
  break;
57836
58212
  case 6:
57837
58213
  this.enterOuterAlt(_localctx, 6);
57838
58214
  {
57839
- this.state = 878;
57840
- this.match(ForgeParser.LEFT_CURLY_TOK);
57841
58215
  this.state = 879;
57842
- this.quantDeclList();
58216
+ this.match(ForgeParser.LEFT_CURLY_TOK);
57843
58217
  this.state = 880;
57844
- this.blockOrBar();
58218
+ this.quantDeclList();
57845
58219
  this.state = 881;
58220
+ this.blockOrBar();
58221
+ this.state = 882;
57846
58222
  this.match(ForgeParser.RIGHT_CURLY_TOK);
57847
58223
  }
57848
58224
  break;
57849
58225
  case 7:
57850
58226
  this.enterOuterAlt(_localctx, 7);
57851
58227
  {
57852
- this.state = 883;
57853
- this.match(ForgeParser.LEFT_PAREN_TOK);
57854
58228
  this.state = 884;
57855
- this.expr();
58229
+ this.match(ForgeParser.LEFT_PAREN_TOK);
57856
58230
  this.state = 885;
58231
+ this.expr();
58232
+ this.state = 886;
57857
58233
  this.match(ForgeParser.RIGHT_PAREN_TOK);
57858
58234
  }
57859
58235
  break;
57860
58236
  case 8:
57861
58237
  this.enterOuterAlt(_localctx, 8);
57862
58238
  {
57863
- this.state = 887;
58239
+ this.state = 888;
57864
58240
  this.block();
57865
58241
  }
57866
58242
  break;
57867
58243
  case 9:
57868
58244
  this.enterOuterAlt(_localctx, 9);
57869
58245
  {
57870
- this.state = 888;
58246
+ this.state = 889;
57871
58247
  this.sexpr();
57872
58248
  }
57873
58249
  break;
@@ -57893,24 +58269,24 @@ class ForgeParser extends Parser_1.Parser {
57893
58269
  let _localctx = new ArrowExprContext(this._ctx, this.state);
57894
58270
  this.enterRule(_localctx, 136, ForgeParser.RULE_arrowExpr);
57895
58271
  try {
57896
- this.state = 896;
58272
+ this.state = 897;
57897
58273
  this._errHandler.sync(this);
57898
58274
  switch (this.interpreter.adaptivePredict(this._input, 103, this._ctx)) {
57899
58275
  case 1:
57900
58276
  this.enterOuterAlt(_localctx, 1);
57901
58277
  {
57902
- this.state = 891;
58278
+ this.state = 892;
57903
58279
  this.qualName();
57904
58280
  }
57905
58281
  break;
57906
58282
  case 2:
57907
58283
  this.enterOuterAlt(_localctx, 2);
57908
58284
  {
57909
- this.state = 892;
57910
- this.qualName();
57911
58285
  this.state = 893;
57912
- this.match(ForgeParser.ARROW_TOK);
58286
+ this.qualName();
57913
58287
  this.state = 894;
58288
+ this.match(ForgeParser.ARROW_TOK);
58289
+ this.state = 895;
57914
58290
  this.arrowExpr();
57915
58291
  }
57916
58292
  break;
@@ -57938,7 +58314,7 @@ class ForgeParser extends Parser_1.Parser {
57938
58314
  try {
57939
58315
  this.enterOuterAlt(_localctx, 1);
57940
58316
  {
57941
- this.state = 898;
58317
+ this.state = 899;
57942
58318
  this.sexpr();
57943
58319
  }
57944
58320
  }
@@ -57964,7 +58340,7 @@ class ForgeParser extends Parser_1.Parser {
57964
58340
  try {
57965
58341
  this.enterOuterAlt(_localctx, 1);
57966
58342
  {
57967
- this.state = 900;
58343
+ this.state = 901;
57968
58344
  this.match(ForgeParser.SEXPR_TOK);
57969
58345
  }
57970
58346
  }
@@ -57991,18 +58367,18 @@ class ForgeParser extends Parser_1.Parser {
57991
58367
  try {
57992
58368
  this.enterOuterAlt(_localctx, 1);
57993
58369
  {
57994
- this.state = 902;
57995
- this.match(ForgeParser.INST_TOK);
57996
58370
  this.state = 903;
57997
- this.name();
58371
+ this.match(ForgeParser.INST_TOK);
57998
58372
  this.state = 904;
58373
+ this.name();
58374
+ this.state = 905;
57999
58375
  this.bounds();
58000
- this.state = 906;
58376
+ this.state = 907;
58001
58377
  this._errHandler.sync(this);
58002
58378
  _la = this._input.LA(1);
58003
58379
  if (_la === ForgeParser.FOR_TOK) {
58004
58380
  {
58005
- this.state = 905;
58381
+ this.state = 906;
58006
58382
  this.scope();
58007
58383
  }
58008
58384
  }
@@ -58030,7 +58406,7 @@ class ForgeParser extends Parser_1.Parser {
58030
58406
  try {
58031
58407
  this.enterOuterAlt(_localctx, 1);
58032
58408
  {
58033
- this.state = 908;
58409
+ this.state = 909;
58034
58410
  this.arrowDecl();
58035
58411
  }
58036
58412
  }
@@ -58056,9 +58432,9 @@ class ForgeParser extends Parser_1.Parser {
58056
58432
  try {
58057
58433
  this.enterOuterAlt(_localctx, 1);
58058
58434
  {
58059
- this.state = 910;
58060
- this.match(ForgeParser.EVAL_TOK);
58061
58435
  this.state = 911;
58436
+ this.match(ForgeParser.EVAL_TOK);
58437
+ this.state = 912;
58062
58438
  this.expr();
58063
58439
  }
58064
58440
  }
@@ -58084,17 +58460,17 @@ class ForgeParser extends Parser_1.Parser {
58084
58460
  try {
58085
58461
  this.enterOuterAlt(_localctx, 1);
58086
58462
  {
58087
- this.state = 913;
58088
- this.match(ForgeParser.EXAMPLE_TOK);
58089
58463
  this.state = 914;
58090
- this.name();
58464
+ this.match(ForgeParser.EXAMPLE_TOK);
58091
58465
  this.state = 915;
58092
- this.match(ForgeParser.IS_TOK);
58466
+ this.name();
58093
58467
  this.state = 916;
58094
- this.expr();
58468
+ this.match(ForgeParser.IS_TOK);
58095
58469
  this.state = 917;
58096
- this.match(ForgeParser.FOR_TOK);
58470
+ this.expr();
58097
58471
  this.state = 918;
58472
+ this.match(ForgeParser.FOR_TOK);
58473
+ this.state = 919;
58098
58474
  this.bounds();
58099
58475
  }
58100
58476
  }
@@ -58120,15 +58496,15 @@ class ForgeParser extends Parser_1.Parser {
58120
58496
  try {
58121
58497
  this.enterOuterAlt(_localctx, 1);
58122
58498
  {
58123
- this.state = 920;
58124
- this.name();
58125
58499
  this.state = 921;
58126
- this.match(ForgeParser.COLON_TOK);
58500
+ this.name();
58127
58501
  this.state = 922;
58128
- this.arrowExpr();
58502
+ this.match(ForgeParser.COLON_TOK);
58129
58503
  this.state = 923;
58130
- this.match(ForgeParser.EQ_TOK);
58504
+ this.arrowExpr();
58131
58505
  this.state = 924;
58506
+ this.match(ForgeParser.EQ_TOK);
58507
+ this.state = 925;
58132
58508
  this.expr();
58133
58509
  }
58134
58510
  }
@@ -58152,24 +58528,24 @@ class ForgeParser extends Parser_1.Parser {
58152
58528
  let _localctx = new NumberListContext(this._ctx, this.state);
58153
58529
  this.enterRule(_localctx, 152, ForgeParser.RULE_numberList);
58154
58530
  try {
58155
- this.state = 931;
58531
+ this.state = 932;
58156
58532
  this._errHandler.sync(this);
58157
58533
  switch (this.interpreter.adaptivePredict(this._input, 105, this._ctx)) {
58158
58534
  case 1:
58159
58535
  this.enterOuterAlt(_localctx, 1);
58160
58536
  {
58161
- this.state = 926;
58537
+ this.state = 927;
58162
58538
  this.number();
58163
58539
  }
58164
58540
  break;
58165
58541
  case 2:
58166
58542
  this.enterOuterAlt(_localctx, 2);
58167
58543
  {
58168
- this.state = 927;
58169
- this.number();
58170
58544
  this.state = 928;
58171
- this.match(ForgeParser.COMMA_TOK);
58545
+ this.number();
58172
58546
  this.state = 929;
58547
+ this.match(ForgeParser.COMMA_TOK);
58548
+ this.state = 930;
58173
58549
  this.numberList();
58174
58550
  }
58175
58551
  break;
@@ -58197,7 +58573,7 @@ class ForgeParser extends Parser_1.Parser {
58197
58573
  try {
58198
58574
  this.enterOuterAlt(_localctx, 1);
58199
58575
  {
58200
- this.state = 933;
58576
+ this.state = 934;
58201
58577
  this.match(ForgeParser.NUM_CONST_TOK);
58202
58578
  }
58203
58579
  }
@@ -58222,29 +58598,29 @@ class ForgeParser extends Parser_1.Parser {
58222
58598
  this.enterRule(_localctx, 156, ForgeParser.RULE_bounds);
58223
58599
  let _la;
58224
58600
  try {
58225
- this.state = 947;
58601
+ this.state = 948;
58226
58602
  this._errHandler.sync(this);
58227
58603
  switch (this._input.LA(1)) {
58228
58604
  case ForgeParser.LEFT_CURLY_TOK:
58229
58605
  this.enterOuterAlt(_localctx, 1);
58230
58606
  {
58231
- this.state = 935;
58607
+ this.state = 936;
58232
58608
  this.match(ForgeParser.LEFT_CURLY_TOK);
58233
- this.state = 939;
58609
+ this.state = 940;
58234
58610
  this._errHandler.sync(this);
58235
58611
  _la = this._input.LA(1);
58236
58612
  while (_la === ForgeParser.MINUS_TOK || ((((_la - 74)) & ~0x1F) === 0 && ((1 << (_la - 74)) & ((1 << (ForgeParser.CARD_TOK - 74)) | (1 << (ForgeParser.BACKQUOTE_TOK - 74)) | (1 << (ForgeParser.THIS_TOK - 74)) | (1 << (ForgeParser.NO_TOK - 74)) | (1 << (ForgeParser.SUM_TOK - 74)) | (1 << (ForgeParser.INT_TOK - 74)))) !== 0) || ((((_la - 107)) & ~0x1F) === 0 && ((1 << (_la - 107)) & ((1 << (ForgeParser.NUM_CONST_TOK - 107)) | (1 << (ForgeParser.QUOTED_IDENTIFIER_TOK - 107)) | (1 << (ForgeParser.IDENTIFIER_TOK - 107)))) !== 0)) {
58237
58613
  {
58238
58614
  {
58239
- this.state = 936;
58615
+ this.state = 937;
58240
58616
  this.bound();
58241
58617
  }
58242
58618
  }
58243
- this.state = 941;
58619
+ this.state = 942;
58244
58620
  this._errHandler.sync(this);
58245
58621
  _la = this._input.LA(1);
58246
58622
  }
58247
- this.state = 942;
58623
+ this.state = 943;
58248
58624
  this.match(ForgeParser.RIGHT_CURLY_TOK);
58249
58625
  }
58250
58626
  break;
@@ -58256,16 +58632,16 @@ class ForgeParser extends Parser_1.Parser {
58256
58632
  case ForgeParser.IDENTIFIER_TOK:
58257
58633
  this.enterOuterAlt(_localctx, 2);
58258
58634
  {
58259
- this.state = 944;
58635
+ this.state = 945;
58260
58636
  this._errHandler.sync(this);
58261
58637
  _la = this._input.LA(1);
58262
58638
  if (_la === ForgeParser.EXACTLY_TOK) {
58263
58639
  {
58264
- this.state = 943;
58640
+ this.state = 944;
58265
58641
  this.match(ForgeParser.EXACTLY_TOK);
58266
58642
  }
58267
58643
  }
58268
- this.state = 946;
58644
+ this.state = 947;
58269
58645
  this.qualName();
58270
58646
  }
58271
58647
  break;
@@ -58293,31 +58669,31 @@ class ForgeParser extends Parser_1.Parser {
58293
58669
  let _localctx = new AtomNameOrNumberContext(this._ctx, this.state);
58294
58670
  this.enterRule(_localctx, 158, ForgeParser.RULE_atomNameOrNumber);
58295
58671
  try {
58296
- this.state = 954;
58672
+ this.state = 955;
58297
58673
  this._errHandler.sync(this);
58298
58674
  switch (this._input.LA(1)) {
58299
58675
  case ForgeParser.BACKQUOTE_TOK:
58300
58676
  this.enterOuterAlt(_localctx, 1);
58301
58677
  {
58302
- this.state = 949;
58303
- this.match(ForgeParser.BACKQUOTE_TOK);
58304
58678
  this.state = 950;
58679
+ this.match(ForgeParser.BACKQUOTE_TOK);
58680
+ this.state = 951;
58305
58681
  this.name();
58306
58682
  }
58307
58683
  break;
58308
58684
  case ForgeParser.NUM_CONST_TOK:
58309
58685
  this.enterOuterAlt(_localctx, 2);
58310
58686
  {
58311
- this.state = 951;
58687
+ this.state = 952;
58312
58688
  this.number();
58313
58689
  }
58314
58690
  break;
58315
58691
  case ForgeParser.MINUS_TOK:
58316
58692
  this.enterOuterAlt(_localctx, 3);
58317
58693
  {
58318
- this.state = 952;
58319
- this.match(ForgeParser.MINUS_TOK);
58320
58694
  this.state = 953;
58695
+ this.match(ForgeParser.MINUS_TOK);
58696
+ this.state = 954;
58321
58697
  this.number();
58322
58698
  }
58323
58699
  break;
@@ -58345,33 +58721,33 @@ class ForgeParser extends Parser_1.Parser {
58345
58721
  let _localctx = new BoundContext(this._ctx, this.state);
58346
58722
  this.enterRule(_localctx, 160, ForgeParser.RULE_bound);
58347
58723
  try {
58348
- this.state = 963;
58724
+ this.state = 964;
58349
58725
  this._errHandler.sync(this);
58350
58726
  switch (this.interpreter.adaptivePredict(this._input, 110, this._ctx)) {
58351
58727
  case 1:
58352
58728
  this.enterOuterAlt(_localctx, 1);
58353
58729
  {
58354
- this.state = 956;
58355
- this.boundLHS();
58356
58730
  this.state = 957;
58357
- this.compareOp();
58731
+ this.boundLHS();
58358
58732
  this.state = 958;
58733
+ this.compareOp();
58734
+ this.state = 959;
58359
58735
  this.bindRHSUnion(0);
58360
58736
  }
58361
58737
  break;
58362
58738
  case 2:
58363
58739
  this.enterOuterAlt(_localctx, 2);
58364
58740
  {
58365
- this.state = 960;
58366
- this.match(ForgeParser.NO_TOK);
58367
58741
  this.state = 961;
58742
+ this.match(ForgeParser.NO_TOK);
58743
+ this.state = 962;
58368
58744
  this.boundLHS();
58369
58745
  }
58370
58746
  break;
58371
58747
  case 3:
58372
58748
  this.enterOuterAlt(_localctx, 3);
58373
58749
  {
58374
- this.state = 962;
58750
+ this.state = 963;
58375
58751
  this.qualName();
58376
58752
  }
58377
58753
  break;
@@ -58398,15 +58774,15 @@ class ForgeParser extends Parser_1.Parser {
58398
58774
  this.enterRule(_localctx, 162, ForgeParser.RULE_boundLHS);
58399
58775
  let _la;
58400
58776
  try {
58401
- this.state = 975;
58777
+ this.state = 976;
58402
58778
  this._errHandler.sync(this);
58403
58779
  switch (this._input.LA(1)) {
58404
58780
  case ForgeParser.CARD_TOK:
58405
58781
  this.enterOuterAlt(_localctx, 1);
58406
58782
  {
58407
- this.state = 965;
58408
- this.match(ForgeParser.CARD_TOK);
58409
58783
  this.state = 966;
58784
+ this.match(ForgeParser.CARD_TOK);
58785
+ this.state = 967;
58410
58786
  this.qualName();
58411
58787
  }
58412
58788
  break;
@@ -58417,7 +58793,7 @@ class ForgeParser extends Parser_1.Parser {
58417
58793
  case ForgeParser.IDENTIFIER_TOK:
58418
58794
  this.enterOuterAlt(_localctx, 2);
58419
58795
  {
58420
- this.state = 967;
58796
+ this.state = 968;
58421
58797
  this.qualName();
58422
58798
  }
58423
58799
  break;
@@ -58426,21 +58802,21 @@ class ForgeParser extends Parser_1.Parser {
58426
58802
  case ForgeParser.NUM_CONST_TOK:
58427
58803
  this.enterOuterAlt(_localctx, 3);
58428
58804
  {
58429
- this.state = 968;
58805
+ this.state = 969;
58430
58806
  this.atomNameOrNumber();
58431
- this.state = 971;
58807
+ this.state = 972;
58432
58808
  this._errHandler.sync(this);
58433
58809
  _la = this._input.LA(1);
58434
58810
  do {
58435
58811
  {
58436
58812
  {
58437
- this.state = 969;
58438
- this.match(ForgeParser.DOT_TOK);
58439
58813
  this.state = 970;
58814
+ this.match(ForgeParser.DOT_TOK);
58815
+ this.state = 971;
58440
58816
  this.qualName();
58441
58817
  }
58442
58818
  }
58443
- this.state = 973;
58819
+ this.state = 974;
58444
58820
  this._errHandler.sync(this);
58445
58821
  _la = this._input.LA(1);
58446
58822
  } while (_la === ForgeParser.DOT_TOK);
@@ -58480,28 +58856,28 @@ class ForgeParser extends Parser_1.Parser {
58480
58856
  let _alt;
58481
58857
  this.enterOuterAlt(_localctx, 1);
58482
58858
  {
58483
- this.state = 983;
58859
+ this.state = 984;
58484
58860
  this._errHandler.sync(this);
58485
58861
  switch (this.interpreter.adaptivePredict(this._input, 113, this._ctx)) {
58486
58862
  case 1:
58487
58863
  {
58488
- this.state = 978;
58864
+ this.state = 979;
58489
58865
  this.bindRHSProduct(0);
58490
58866
  }
58491
58867
  break;
58492
58868
  case 2:
58493
58869
  {
58494
- this.state = 979;
58495
- this.match(ForgeParser.LEFT_PAREN_TOK);
58496
58870
  this.state = 980;
58497
- this.bindRHSUnion(0);
58871
+ this.match(ForgeParser.LEFT_PAREN_TOK);
58498
58872
  this.state = 981;
58873
+ this.bindRHSUnion(0);
58874
+ this.state = 982;
58499
58875
  this.match(ForgeParser.RIGHT_PAREN_TOK);
58500
58876
  }
58501
58877
  break;
58502
58878
  }
58503
58879
  this._ctx._stop = this._input.tryLT(-1);
58504
- this.state = 990;
58880
+ this.state = 991;
58505
58881
  this._errHandler.sync(this);
58506
58882
  _alt = this.interpreter.adaptivePredict(this._input, 114, this._ctx);
58507
58883
  while (_alt !== 2 && _alt !== ATN_1.ATN.INVALID_ALT_NUMBER) {
@@ -58514,18 +58890,18 @@ class ForgeParser extends Parser_1.Parser {
58514
58890
  {
58515
58891
  _localctx = new BindRHSUnionContext(_parentctx, _parentState);
58516
58892
  this.pushNewRecursionContext(_localctx, _startState, ForgeParser.RULE_bindRHSUnion);
58517
- this.state = 985;
58893
+ this.state = 986;
58518
58894
  if (!(this.precpred(this._ctx, 2))) {
58519
58895
  throw this.createFailedPredicateException("this.precpred(this._ctx, 2)");
58520
58896
  }
58521
- this.state = 986;
58522
- this.match(ForgeParser.PLUS_TOK);
58523
58897
  this.state = 987;
58898
+ this.match(ForgeParser.PLUS_TOK);
58899
+ this.state = 988;
58524
58900
  this.bindRHSProduct(0);
58525
58901
  }
58526
58902
  }
58527
58903
  }
58528
- this.state = 992;
58904
+ this.state = 993;
58529
58905
  this._errHandler.sync(this);
58530
58906
  _alt = this.interpreter.adaptivePredict(this._input, 114, this._ctx);
58531
58907
  }
@@ -58562,28 +58938,28 @@ class ForgeParser extends Parser_1.Parser {
58562
58938
  let _alt;
58563
58939
  this.enterOuterAlt(_localctx, 1);
58564
58940
  {
58565
- this.state = 999;
58941
+ this.state = 1000;
58566
58942
  this._errHandler.sync(this);
58567
58943
  switch (this.interpreter.adaptivePredict(this._input, 115, this._ctx)) {
58568
58944
  case 1:
58569
58945
  {
58570
- this.state = 994;
58571
- this.match(ForgeParser.LEFT_PAREN_TOK);
58572
58946
  this.state = 995;
58573
- this.bindRHSProduct(0);
58947
+ this.match(ForgeParser.LEFT_PAREN_TOK);
58574
58948
  this.state = 996;
58949
+ this.bindRHSProduct(0);
58950
+ this.state = 997;
58575
58951
  this.match(ForgeParser.RIGHT_PAREN_TOK);
58576
58952
  }
58577
58953
  break;
58578
58954
  case 2:
58579
58955
  {
58580
- this.state = 998;
58956
+ this.state = 999;
58581
58957
  this.bindRHSProductBase();
58582
58958
  }
58583
58959
  break;
58584
58960
  }
58585
58961
  this._ctx._stop = this._input.tryLT(-1);
58586
- this.state = 1006;
58962
+ this.state = 1007;
58587
58963
  this._errHandler.sync(this);
58588
58964
  _alt = this.interpreter.adaptivePredict(this._input, 116, this._ctx);
58589
58965
  while (_alt !== 2 && _alt !== ATN_1.ATN.INVALID_ALT_NUMBER) {
@@ -58596,11 +58972,11 @@ class ForgeParser extends Parser_1.Parser {
58596
58972
  {
58597
58973
  _localctx = new BindRHSProductContext(_parentctx, _parentState);
58598
58974
  this.pushNewRecursionContext(_localctx, _startState, ForgeParser.RULE_bindRHSProduct);
58599
- this.state = 1001;
58975
+ this.state = 1002;
58600
58976
  if (!(this.precpred(this._ctx, 2))) {
58601
58977
  throw this.createFailedPredicateException("this.precpred(this._ctx, 2)");
58602
58978
  }
58603
- this.state = 1002;
58979
+ this.state = 1003;
58604
58980
  _la = this._input.LA(1);
58605
58981
  if (!(_la === ForgeParser.ARROW_TOK || _la === ForgeParser.COMMA_TOK)) {
58606
58982
  this._errHandler.recoverInline(this);
@@ -58612,12 +58988,12 @@ class ForgeParser extends Parser_1.Parser {
58612
58988
  this._errHandler.reportMatch(this);
58613
58989
  this.consume();
58614
58990
  }
58615
- this.state = 1003;
58991
+ this.state = 1004;
58616
58992
  this.bindRHSProductBase();
58617
58993
  }
58618
58994
  }
58619
58995
  }
58620
- this.state = 1008;
58996
+ this.state = 1009;
58621
58997
  this._errHandler.sync(this);
58622
58998
  _alt = this.interpreter.adaptivePredict(this._input, 116, this._ctx);
58623
58999
  }
@@ -58643,7 +59019,7 @@ class ForgeParser extends Parser_1.Parser {
58643
59019
  let _localctx = new BindRHSProductBaseContext(this._ctx, this.state);
58644
59020
  this.enterRule(_localctx, 168, ForgeParser.RULE_bindRHSProductBase);
58645
59021
  try {
58646
- this.state = 1015;
59022
+ this.state = 1016;
58647
59023
  this._errHandler.sync(this);
58648
59024
  switch (this._input.LA(1)) {
58649
59025
  case ForgeParser.MINUS_TOK:
@@ -58651,7 +59027,7 @@ class ForgeParser extends Parser_1.Parser {
58651
59027
  case ForgeParser.NUM_CONST_TOK:
58652
59028
  this.enterOuterAlt(_localctx, 1);
58653
59029
  {
58654
- this.state = 1009;
59030
+ this.state = 1010;
58655
59031
  this.atomNameOrNumber();
58656
59032
  }
58657
59033
  break;
@@ -58662,18 +59038,18 @@ class ForgeParser extends Parser_1.Parser {
58662
59038
  case ForgeParser.IDENTIFIER_TOK:
58663
59039
  this.enterOuterAlt(_localctx, 2);
58664
59040
  {
58665
- this.state = 1010;
59041
+ this.state = 1011;
58666
59042
  this.qualName();
58667
59043
  }
58668
59044
  break;
58669
59045
  case ForgeParser.LEFT_PAREN_TOK:
58670
59046
  this.enterOuterAlt(_localctx, 3);
58671
59047
  {
58672
- this.state = 1011;
58673
- this.match(ForgeParser.LEFT_PAREN_TOK);
58674
59048
  this.state = 1012;
58675
- this.bindRHSUnion(0);
59049
+ this.match(ForgeParser.LEFT_PAREN_TOK);
58676
59050
  this.state = 1013;
59051
+ this.bindRHSUnion(0);
59052
+ this.state = 1014;
58677
59053
  this.match(ForgeParser.RIGHT_PAREN_TOK);
58678
59054
  }
58679
59055
  break;
@@ -58848,7 +59224,7 @@ ForgeParser.OPEN_TOK = 1;
58848
59224
  ForgeParser.LEFT_SQUARE_TOK = 2;
58849
59225
  ForgeParser.RIGHT_SQUARE_TOK = 3;
58850
59226
  ForgeParser.AS_TOK = 4;
58851
- ForgeParser.FILE_PATH_TOK = 5;
59227
+ ForgeParser.STRING_TOK = 5;
58852
59228
  ForgeParser.VAR_TOK = 6;
58853
59229
  ForgeParser.ABSTRACT_TOK = 7;
58854
59230
  ForgeParser.SIG_TOK = 8;
@@ -59079,7 +59455,7 @@ ForgeParser._LITERAL_NAMES = [
59079
59455
  ];
59080
59456
  ForgeParser._SYMBOLIC_NAMES = [
59081
59457
  undefined, "OPEN_TOK", "LEFT_SQUARE_TOK", "RIGHT_SQUARE_TOK", "AS_TOK",
59082
- "FILE_PATH_TOK", "VAR_TOK", "ABSTRACT_TOK", "SIG_TOK", "LEFT_CURLY_TOK",
59458
+ "STRING_TOK", "VAR_TOK", "ABSTRACT_TOK", "SIG_TOK", "LEFT_CURLY_TOK",
59083
59459
  "RIGHT_CURLY_TOK", "EXTENDS_TOK", "IN_TOK", "PLUS_TOK", "LONE_TOK", "SOME_TOK",
59084
59460
  "ONE_TOK", "TWO_TOK", "SET_TOK", "FUNC_TOK", "PFUNC_TOK", "DISJ_TOK",
59085
59461
  "COLON_TOK", "WHEAT_TOK", "PRED_TOK", "DOT_TOK", "FUN_TOK", "LEFT_PAREN_TOK",
@@ -59101,7 +59477,7 @@ ForgeParser._SYMBOLIC_NAMES = [
59101
59477
  ];
59102
59478
  ForgeParser.VOCABULARY = new VocabularyImpl_1.VocabularyImpl(ForgeParser._LITERAL_NAMES, ForgeParser._SYMBOLIC_NAMES, []);
59103
59479
  ForgeParser._serializedATNSegments = 2;
59104
- ForgeParser._serializedATNSegment0 = "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x03t\u03FC\x04\x02" +
59480
+ ForgeParser._serializedATNSegment0 = "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x03t\u03FD\x04\x02" +
59105
59481
  "\t\x02\x04\x03\t\x03\x04\x04\t\x04\x04\x05\t\x05\x04\x06\t\x06\x04\x07" +
59106
59482
  "\t\x07\x04\b\t\b\x04\t\t\t\x04\n\t\n\x04\v\t\v\x04\f\t\f\x04\r\t\r\x04" +
59107
59483
  "\x0E\t\x0E\x04\x0F\t\x0F\x04\x10\t\x10\x04\x11\t\x11\x04\x12\t\x12\x04" +
@@ -59144,57 +59520,57 @@ ForgeParser._serializedATNSegment0 = "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\u
59144
59520
  "\n\x16\f\x16\x0E\x16\u0198\v\x16\x03\x16\x03\x16\x03\x17\x03\x17\x03\x17" +
59145
59521
  "\x03\x17\x05\x17\u01A0\n\x17\x03\x17\x03\x17\x05\x17\u01A4\n\x17\x03\x18" +
59146
59522
  "\x05\x18\u01A7\n\x18\x03\x18\x03\x18\x03\x18\x03\x19\x03\x19\x03\x19\x03" +
59147
- "\x19\x05\x19\u01B0\n\x19\x03\x19\x05\x19\u01B3\n\x19\x03\x1A\x03\x1A\x03" +
59148
- "\x1A\x03\x1A\x03\x1A\x05\x1A\u01BA\n\x1A\x03\x1A\x03\x1A\x05\x1A\u01BE" +
59149
- "\n\x1A\x03\x1B\x03\x1B\x03\x1B\x05\x1B\u01C3\n\x1B\x03\x1B\x03\x1B\x03" +
59150
- "\x1B\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x05" +
59151
- "\x1B\u01D0\n\x1B\x03\x1B\x05\x1B\u01D3\n\x1B\x03\x1B\x03\x1B\x05\x1B\u01D7" +
59152
- "\n\x1B\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x05\x1C" +
59153
- "\u01E0\n\x1C\x03\x1C\x03\x1C\x05\x1C\u01E4\n\x1C\x03\x1D\x03\x1D\x03\x1D" +
59154
- "\x03\x1D\x03\x1D\x03\x1D\x03\x1D\x05\x1D\u01ED\n\x1D\x03\x1D\x03\x1D\x05" +
59155
- "\x1D\u01F1\n\x1D\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x07\x1E" +
59156
- "\u01F9\n\x1E\f\x1E\x0E\x1E\u01FC\v\x1E\x03\x1E\x03\x1E\x03\x1F\x03\x1F" +
59157
- "\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x05\x1F\u0206\n\x1F\x03 \x03 \x05 \u020A" +
59158
- "\n \x03 \x03 \x03 \x05 \u020F\n \x03!\x03!\x03\"\x03\"\x03\"\x03\"\x03" +
59159
- "#\x03#\x07#\u0219\n#\f#\x0E#\u021C\v#\x03#\x03#\x03$\x03$\x03$\x05$\u0223" +
59160
- "\n$\x03%\x03%\x03%\x03%\x05%\u0229\n%\x03&\x03&\x05&\u022D\n&\x03&\x03" +
59161
- "&\x03&\x07&\u0232\n&\f&\x0E&\u0235\v&\x03&\x03&\x03&\x05&\u023A\n&\x03" +
59162
- "\'\x03\'\x03\'\x03\'\x03\'\x05\'\u0241\n\'\x03\'\x05\'\u0244\n\'\x03(" +
59163
- "\x03(\x03)\x03)\x03)\x03)\x03)\x05)\u024D\n)\x03*\x03*\x03*\x03*\x03*" +
59164
- "\x05*\u0254\n*\x03+\x03+\x03+\x03+\x03+\x05+\u025B\n+\x03,\x03,\x03,\x03" +
59165
- ",\x03,\x05,\u0262\n,\x03-\x03-\x03-\x03-\x03-\x05-\u0269\n-\x03.\x03." +
59166
- "\x03.\x03.\x03.\x05.\u0270\n.\x03/\x03/\x03/\x03/\x03/\x05/\u0277\n/\x03" +
59167
- "0\x030\x030\x030\x030\x050\u027E\n0\x031\x031\x031\x031\x031\x031\x03" +
59168
- "1\x031\x031\x031\x031\x051\u028B\n1\x031\x031\x031\x051\u0290\n1\x032" +
59169
- "\x032\x032\x032\x032\x032\x072\u0298\n2\f2\x0E2\u029B\v2\x033\x033\x03" +
59170
- "3\x033\x033\x033\x073\u02A3\n3\f3\x0E3\u02A6\v3\x034\x034\x034\x034\x03" +
59171
- "4\x034\x074\u02AE\n4\f4\x0E4\u02B1\v4\x035\x035\x035\x035\x035\x035\x05" +
59172
- "5\u02B9\n5\x055\u02BB\n5\x036\x036\x036\x036\x036\x036\x076\u02C3\n6\f" +
59173
- "6\x0E6\u02C6\v6\x037\x037\x037\x037\x037\x037\x037\x037\x037\x037\x03" +
59174
- "7\x037\x037\x037\x037\x037\x037\x057\u02D9\n7\x038\x038\x038\x038\x03" +
59175
- "8\x038\x038\x038\x038\x038\x038\x038\x038\x038\x038\x058\u02EA\n8\x03" +
59176
- "9\x039\x039\x039\x039\x059\u02F1\n9\x039\x039\x039\x079\u02F6\n9\f9\x0E" +
59177
- "9\u02F9\v9\x03:\x03:\x03:\x05:\u02FE\n:\x03;\x03;\x03;\x03;\x03;\x03;" +
59178
- "\x07;\u0306\n;\f;\x0E;\u0309\v;\x03<\x03<\x03<\x05<\u030E\n<\x03=\x03" +
59179
- "=\x03=\x03=\x03=\x03=\x07=\u0316\n=\f=\x0E=\u0319\v=\x03>\x03>\x03>\x03" +
59180
- ">\x03>\x03>\x07>\u0321\n>\f>\x0E>\u0324\v>\x03?\x03?\x03?\x03?\x03?\x03" +
59181
- "?\x03?\x07?\u032D\n?\f?\x0E?\u0330\v?\x03@\x03@\x03@\x03@\x03@\x03@\x07" +
59182
- "@\u0338\n@\f@\x0E@\u033B\v@\x03A\x03A\x03A\x03A\x03A\x03A\x03A\x03A\x07" +
59183
- "A\u0345\nA\fA\x0EA\u0348\vA\x03B\x03B\x03B\x03B\x03B\x03B\x03B\x05B\u0351" +
59184
- "\nB\x03B\x03B\x03B\x07B\u0356\nB\fB\x0EB\u0359\vB\x03C\x03C\x03C\x03C" +
59185
- "\x03C\x07C\u0360\nC\fC\x0EC\u0363\vC\x03D\x03D\x03D\x05D\u0368\nD\x03" +
59186
- "E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03" +
59187
- "E\x03E\x03E\x03E\x05E\u037C\nE\x03F\x03F\x03F\x03F\x03F\x05F\u0383\nF" +
59188
- "\x03G\x03G\x03H\x03H\x03I\x03I\x03I\x03I\x05I\u038D\nI\x03J\x03J\x03K" +
59189
- "\x03K\x03K\x03L\x03L\x03L\x03L\x03L\x03L\x03L\x03M\x03M\x03M\x03M\x03" +
59190
- "M\x03M\x03N\x03N\x03N\x03N\x03N\x05N\u03A6\nN\x03O\x03O\x03P\x03P\x07" +
59191
- "P\u03AC\nP\fP\x0EP\u03AF\vP\x03P\x03P\x05P\u03B3\nP\x03P\x05P\u03B6\n" +
59192
- "P\x03Q\x03Q\x03Q\x03Q\x03Q\x05Q\u03BD\nQ\x03R\x03R\x03R\x03R\x03R\x03" +
59193
- "R\x03R\x05R\u03C6\nR\x03S\x03S\x03S\x03S\x03S\x03S\x06S\u03CE\nS\rS\x0E" +
59194
- "S\u03CF\x05S\u03D2\nS\x03T\x03T\x03T\x03T\x03T\x03T\x05T\u03DA\nT\x03" +
59195
- "T\x03T\x03T\x07T\u03DF\nT\fT\x0ET\u03E2\vT\x03U\x03U\x03U\x03U\x03U\x03" +
59196
- "U\x05U\u03EA\nU\x03U\x03U\x03U\x07U\u03EF\nU\fU\x0EU\u03F2\vU\x03V\x03" +
59197
- "V\x03V\x03V\x03V\x03V\x05V\u03FA\nV\x03V\x02\x02\x11bdfjptxz|~\x80\x82" +
59523
+ "\x19\x05\x19\u01B0\n\x19\x03\x19\x03\x19\x05\x19\u01B4\n\x19\x03\x1A\x03" +
59524
+ "\x1A\x03\x1A\x03\x1A\x03\x1A\x05\x1A\u01BB\n\x1A\x03\x1A\x03\x1A\x05\x1A" +
59525
+ "\u01BF\n\x1A\x03\x1B\x03\x1B\x03\x1B\x05\x1B\u01C4\n\x1B\x03\x1B\x03\x1B" +
59526
+ "\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x03\x1B" +
59527
+ "\x05\x1B\u01D1\n\x1B\x03\x1B\x05\x1B\u01D4\n\x1B\x03\x1B\x03\x1B\x05\x1B" +
59528
+ "\u01D8\n\x1B\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x05" +
59529
+ "\x1C\u01E1\n\x1C\x03\x1C\x03\x1C\x05\x1C\u01E5\n\x1C\x03\x1D\x03\x1D\x03" +
59530
+ "\x1D\x03\x1D\x03\x1D\x03\x1D\x03\x1D\x05\x1D\u01EE\n\x1D\x03\x1D\x03\x1D" +
59531
+ "\x05\x1D\u01F2\n\x1D\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x07" +
59532
+ "\x1E\u01FA\n\x1E\f\x1E\x0E\x1E\u01FD\v\x1E\x03\x1E\x03\x1E\x03\x1F\x03" +
59533
+ "\x1F\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x05\x1F\u0207\n\x1F\x03 \x03 \x05" +
59534
+ " \u020B\n \x03 \x03 \x03 \x05 \u0210\n \x03!\x03!\x03\"\x03\"\x03\"\x03" +
59535
+ "\"\x03#\x03#\x07#\u021A\n#\f#\x0E#\u021D\v#\x03#\x03#\x03$\x03$\x03$\x05" +
59536
+ "$\u0224\n$\x03%\x03%\x03%\x03%\x05%\u022A\n%\x03&\x03&\x05&\u022E\n&\x03" +
59537
+ "&\x03&\x03&\x07&\u0233\n&\f&\x0E&\u0236\v&\x03&\x03&\x03&\x05&\u023B\n" +
59538
+ "&\x03\'\x03\'\x03\'\x03\'\x03\'\x05\'\u0242\n\'\x03\'\x05\'\u0245\n\'" +
59539
+ "\x03(\x03(\x03)\x03)\x03)\x03)\x03)\x05)\u024E\n)\x03*\x03*\x03*\x03*" +
59540
+ "\x03*\x05*\u0255\n*\x03+\x03+\x03+\x03+\x03+\x05+\u025C\n+\x03,\x03,\x03" +
59541
+ ",\x03,\x03,\x05,\u0263\n,\x03-\x03-\x03-\x03-\x03-\x05-\u026A\n-\x03." +
59542
+ "\x03.\x03.\x03.\x03.\x05.\u0271\n.\x03/\x03/\x03/\x03/\x03/\x05/\u0278" +
59543
+ "\n/\x030\x030\x030\x030\x030\x050\u027F\n0\x031\x031\x031\x031\x031\x03" +
59544
+ "1\x031\x031\x031\x031\x031\x051\u028C\n1\x031\x031\x031\x051\u0291\n1" +
59545
+ "\x032\x032\x032\x032\x032\x032\x072\u0299\n2\f2\x0E2\u029C\v2\x033\x03" +
59546
+ "3\x033\x033\x033\x033\x073\u02A4\n3\f3\x0E3\u02A7\v3\x034\x034\x034\x03" +
59547
+ "4\x034\x034\x074\u02AF\n4\f4\x0E4\u02B2\v4\x035\x035\x035\x035\x035\x03" +
59548
+ "5\x055\u02BA\n5\x055\u02BC\n5\x036\x036\x036\x036\x036\x036\x076\u02C4" +
59549
+ "\n6\f6\x0E6\u02C7\v6\x037\x037\x037\x037\x037\x037\x037\x037\x037\x03" +
59550
+ "7\x037\x037\x037\x037\x037\x037\x037\x057\u02DA\n7\x038\x038\x038\x03" +
59551
+ "8\x038\x038\x038\x038\x038\x038\x038\x038\x038\x038\x038\x058\u02EB\n" +
59552
+ "8\x039\x039\x039\x039\x039\x059\u02F2\n9\x039\x039\x039\x079\u02F7\n9" +
59553
+ "\f9\x0E9\u02FA\v9\x03:\x03:\x03:\x05:\u02FF\n:\x03;\x03;\x03;\x03;\x03" +
59554
+ ";\x03;\x07;\u0307\n;\f;\x0E;\u030A\v;\x03<\x03<\x03<\x05<\u030F\n<\x03" +
59555
+ "=\x03=\x03=\x03=\x03=\x03=\x07=\u0317\n=\f=\x0E=\u031A\v=\x03>\x03>\x03" +
59556
+ ">\x03>\x03>\x03>\x07>\u0322\n>\f>\x0E>\u0325\v>\x03?\x03?\x03?\x03?\x03" +
59557
+ "?\x03?\x03?\x07?\u032E\n?\f?\x0E?\u0331\v?\x03@\x03@\x03@\x03@\x03@\x03" +
59558
+ "@\x07@\u0339\n@\f@\x0E@\u033C\v@\x03A\x03A\x03A\x03A\x03A\x03A\x03A\x03" +
59559
+ "A\x07A\u0346\nA\fA\x0EA\u0349\vA\x03B\x03B\x03B\x03B\x03B\x03B\x03B\x05" +
59560
+ "B\u0352\nB\x03B\x03B\x03B\x07B\u0357\nB\fB\x0EB\u035A\vB\x03C\x03C\x03" +
59561
+ "C\x03C\x03C\x07C\u0361\nC\fC\x0EC\u0364\vC\x03D\x03D\x03D\x05D\u0369\n" +
59562
+ "D\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03" +
59563
+ "E\x03E\x03E\x03E\x03E\x05E\u037D\nE\x03F\x03F\x03F\x03F\x03F\x05F\u0384" +
59564
+ "\nF\x03G\x03G\x03H\x03H\x03I\x03I\x03I\x03I\x05I\u038E\nI\x03J\x03J\x03" +
59565
+ "K\x03K\x03K\x03L\x03L\x03L\x03L\x03L\x03L\x03L\x03M\x03M\x03M\x03M\x03" +
59566
+ "M\x03M\x03N\x03N\x03N\x03N\x03N\x05N\u03A7\nN\x03O\x03O\x03P\x03P\x07" +
59567
+ "P\u03AD\nP\fP\x0EP\u03B0\vP\x03P\x03P\x05P\u03B4\nP\x03P\x05P\u03B7\n" +
59568
+ "P\x03Q\x03Q\x03Q\x03Q\x03Q\x05Q\u03BE\nQ\x03R\x03R\x03R\x03R\x03R\x03" +
59569
+ "R\x03R\x05R\u03C7\nR\x03S\x03S\x03S\x03S\x03S\x03S\x06S\u03CF\nS\rS\x0E" +
59570
+ "S\u03D0\x05S\u03D3\nS\x03T\x03T\x03T\x03T\x03T\x03T\x05T\u03DB\nT\x03" +
59571
+ "T\x03T\x03T\x07T\u03E0\nT\fT\x0ET\u03E3\vT\x03U\x03U\x03U\x03U\x03U\x03" +
59572
+ "U\x05U\u03EB\nU\x03U\x03U\x03U\x07U\u03F0\nU\fU\x0EU\u03F3\vU\x03V\x03" +
59573
+ "V\x03V\x03V\x03V\x03V\x05V\u03FB\nV\x03V\x02\x02\x11bdfjptxz|~\x80\x82" +
59198
59574
  "\x84\xA6\xA8W\x02\x02\x04\x02\x06\x02\b\x02\n\x02\f\x02\x0E\x02\x10\x02" +
59199
59575
  "\x12\x02\x14\x02\x16\x02\x18\x02\x1A\x02\x1C\x02\x1E\x02 \x02\"\x02$\x02" +
59200
59576
  "&\x02(\x02*\x02,\x02.\x020\x022\x024\x026\x028\x02:\x02<\x02>\x02@\x02" +
@@ -59206,7 +59582,7 @@ ForgeParser._serializedATNSegment0 = "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\u
59206
59582
  "\x04\x02\x10\x10\x12\x16\x05\x02\x10\x10\x12\x12\x14\x16\x03\x02 !\x03" +
59207
59583
  "\x02*.\x04\x02*+--\x03\x0245\x03\x0267\x05\x02\x0E\x0E))af\x03\x02no\x04" +
59208
59584
  "\x02\x10\x14gg\x04\x02\x0F\x0F((\x03\x02OP\x04\x02RT]`\x04\x02\\\\kk\x02" +
59209
- "\u044E\x02\xAC\x03\x02\x02\x02\x04\xBB\x03\x02\x02\x02\x06\xD0\x03\x02" +
59585
+ "\u0450\x02\xAC\x03\x02\x02\x02\x04\xBB\x03\x02\x02\x02\x06\xD0\x03\x02" +
59210
59586
  "\x02\x02\b\xE4\x03\x02\x02\x02\n\xF7\x03\x02\x02\x02\f\xFA\x03\x02\x02" +
59211
59587
  "\x02\x0E\u011A\x03\x02\x02\x02\x10\u011C\x03\x02\x02\x02\x12\u011E\x03" +
59212
59588
  "\x02\x02\x02\x14\u0120\x03\x02\x02\x02\x16\u0123\x03\x02\x02\x02\x18\u012D" +
@@ -59214,28 +59590,28 @@ ForgeParser._serializedATNSegment0 = "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\u
59214
59590
  "\u0140\x03\x02\x02\x02 \u015D\x03\x02\x02\x02\"\u015F\x03\x02\x02\x02" +
59215
59591
  "$\u0168\x03\x02\x02\x02&\u0179\x03\x02\x02\x02(\u018A\x03\x02\x02\x02" +
59216
59592
  "*\u0192\x03\x02\x02\x02,\u01A3\x03\x02\x02\x02.\u01A6\x03\x02\x02\x02" +
59217
- "0\u01B2\x03\x02\x02\x022\u01B4\x03\x02\x02\x024\u01BF\x03\x02\x02\x02" +
59218
- "6\u01D8\x03\x02\x02\x028\u01E5\x03\x02\x02\x02:\u01F2\x03\x02\x02\x02" +
59219
- "<\u0205\x03\x02\x02\x02>\u0209\x03\x02\x02\x02@\u0210\x03\x02\x02\x02" +
59220
- "B\u0212\x03\x02\x02\x02D\u0216\x03\x02\x02\x02F\u0222\x03\x02\x02\x02" +
59221
- "H\u0228\x03\x02\x02\x02J\u0239\x03\x02\x02\x02L\u023B\x03\x02\x02\x02" +
59222
- "N\u0245\x03\x02\x02\x02P\u024C\x03\x02\x02\x02R\u0253\x03\x02\x02\x02" +
59223
- "T\u025A\x03\x02\x02\x02V\u0261\x03\x02\x02\x02X\u0268\x03\x02\x02\x02" +
59224
- "Z\u026F\x03\x02\x02\x02\\\u0276\x03\x02\x02\x02^\u027D\x03\x02\x02\x02" +
59225
- "`\u028F\x03\x02\x02\x02b\u0291\x03\x02\x02\x02d\u029C\x03\x02\x02\x02" +
59226
- "f\u02A7\x03\x02\x02\x02h\u02BA\x03\x02\x02\x02j\u02BC\x03\x02\x02\x02" +
59227
- "l\u02D8\x03\x02\x02\x02n\u02E9\x03\x02\x02\x02p\u02EB\x03\x02\x02\x02" +
59228
- "r\u02FD\x03\x02\x02\x02t\u02FF\x03\x02\x02\x02v\u030D\x03\x02\x02\x02" +
59229
- "x\u030F\x03\x02\x02\x02z\u031A\x03\x02\x02\x02|\u0325\x03\x02\x02\x02" +
59230
- "~\u0331\x03\x02\x02\x02\x80\u033C\x03\x02\x02\x02\x82\u0350\x03\x02\x02" +
59231
- "\x02\x84\u035A\x03\x02\x02\x02\x86\u0367\x03\x02\x02\x02\x88\u037B\x03" +
59232
- "\x02\x02\x02\x8A\u0382\x03\x02\x02\x02\x8C\u0384\x03\x02\x02\x02\x8E\u0386" +
59233
- "\x03\x02\x02\x02\x90\u0388\x03\x02\x02\x02\x92\u038E\x03\x02\x02\x02\x94" +
59234
- "\u0390\x03\x02\x02\x02\x96\u0393\x03\x02\x02\x02\x98\u039A\x03\x02\x02" +
59235
- "\x02\x9A\u03A5\x03\x02\x02\x02\x9C\u03A7\x03\x02\x02\x02\x9E\u03B5\x03" +
59236
- "\x02\x02\x02\xA0\u03BC\x03\x02\x02\x02\xA2\u03C5\x03\x02\x02\x02\xA4\u03D1" +
59237
- "\x03\x02\x02\x02\xA6\u03D9\x03\x02\x02\x02\xA8\u03E9\x03\x02\x02\x02\xAA" +
59238
- "\u03F9\x03\x02\x02\x02\xAC\xAE\x07\x1A\x02\x02\xAD\xAF\x05\x1C\x0F\x02" +
59593
+ "0\u01B3\x03\x02\x02\x022\u01B5\x03\x02\x02\x024\u01C0\x03\x02\x02\x02" +
59594
+ "6\u01D9\x03\x02\x02\x028\u01E6\x03\x02\x02\x02:\u01F3\x03\x02\x02\x02" +
59595
+ "<\u0206\x03\x02\x02\x02>\u020A\x03\x02\x02\x02@\u0211\x03\x02\x02\x02" +
59596
+ "B\u0213\x03\x02\x02\x02D\u0217\x03\x02\x02\x02F\u0223\x03\x02\x02\x02" +
59597
+ "H\u0229\x03\x02\x02\x02J\u023A\x03\x02\x02\x02L\u023C\x03\x02\x02\x02" +
59598
+ "N\u0246\x03\x02\x02\x02P\u024D\x03\x02\x02\x02R\u0254\x03\x02\x02\x02" +
59599
+ "T\u025B\x03\x02\x02\x02V\u0262\x03\x02\x02\x02X\u0269\x03\x02\x02\x02" +
59600
+ "Z\u0270\x03\x02\x02\x02\\\u0277\x03\x02\x02\x02^\u027E\x03\x02\x02\x02" +
59601
+ "`\u0290\x03\x02\x02\x02b\u0292\x03\x02\x02\x02d\u029D\x03\x02\x02\x02" +
59602
+ "f\u02A8\x03\x02\x02\x02h\u02BB\x03\x02\x02\x02j\u02BD\x03\x02\x02\x02" +
59603
+ "l\u02D9\x03\x02\x02\x02n\u02EA\x03\x02\x02\x02p\u02EC\x03\x02\x02\x02" +
59604
+ "r\u02FE\x03\x02\x02\x02t\u0300\x03\x02\x02\x02v\u030E\x03\x02\x02\x02" +
59605
+ "x\u0310\x03\x02\x02\x02z\u031B\x03\x02\x02\x02|\u0326\x03\x02\x02\x02" +
59606
+ "~\u0332\x03\x02\x02\x02\x80\u033D\x03\x02\x02\x02\x82\u0351\x03\x02\x02" +
59607
+ "\x02\x84\u035B\x03\x02\x02\x02\x86\u0368\x03\x02\x02\x02\x88\u037C\x03" +
59608
+ "\x02\x02\x02\x8A\u0383\x03\x02\x02\x02\x8C\u0385\x03\x02\x02\x02\x8E\u0387" +
59609
+ "\x03\x02\x02\x02\x90\u0389\x03\x02\x02\x02\x92\u038F\x03\x02\x02\x02\x94" +
59610
+ "\u0391\x03\x02\x02\x02\x96\u0394\x03\x02\x02\x02\x98\u039B\x03\x02\x02" +
59611
+ "\x02\x9A\u03A6\x03\x02\x02\x02\x9C\u03A8\x03\x02\x02\x02\x9E\u03B6\x03" +
59612
+ "\x02\x02\x02\xA0\u03BD\x03\x02\x02\x02\xA2\u03C6\x03\x02\x02\x02\xA4\u03D2" +
59613
+ "\x03\x02\x02\x02\xA6\u03DA\x03\x02\x02\x02\xA8\u03EA\x03\x02\x02\x02\xAA" +
59614
+ "\u03FA\x03\x02\x02\x02\xAC\xAE\x07\x1A\x02\x02\xAD\xAF\x05\x1C\x0F\x02" +
59239
59615
  "\xAE\xAD\x03\x02\x02\x02\xAE\xAF\x03\x02\x02\x02\xAF\xB3\x03\x02\x02\x02" +
59240
59616
  "\xB0\xB1\x05J&\x02\xB1\xB2\x07\x1B\x02\x02\xB2\xB4\x03\x02\x02\x02\xB3" +
59241
59617
  "\xB0\x03\x02\x02\x02\xB3\xB4\x03\x02\x02\x02\xB4\xB5\x03\x02\x02\x02\xB5" +
@@ -59347,272 +59723,273 @@ ForgeParser._serializedATNSegment0 = "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\u
59347
59723
  "\x05\\/\x02\u01A3\u019B\x03\x02\x02\x02\u01A3\u01A1\x03\x02\x02\x02\u01A4" +
59348
59724
  "-\x03\x02\x02\x02\u01A5\u01A7\x07$\x02\x02\u01A6\u01A5\x03\x02\x02\x02" +
59349
59725
  "\u01A6\u01A7\x03\x02\x02\x02\u01A7\u01A8\x03\x02\x02\x02\u01A8\u01A9\x05" +
59350
- "\x9CO\x02\u01A9\u01AA\x05J&\x02\u01AA/\x03\x02\x02\x02\u01AB\u01B3\x07" +
59351
- "%\x02\x02\u01AC\u01B3\x07&\x02\x02\u01AD\u01B3\x07\'\x02\x02\u01AE\u01B0" +
59726
+ "\x9CO\x02\u01A9\u01AA\x05J&\x02\u01AA/\x03\x02\x02\x02\u01AB\u01B4\x07" +
59727
+ "%\x02\x02\u01AC\u01B4\x07&\x02\x02\u01AD\u01B4\x07\'\x02\x02\u01AE\u01B0" +
59352
59728
  "\x07(\x02\x02\u01AF\u01AE\x03\x02\x02\x02\u01AF\u01B0\x03\x02\x02\x02" +
59353
- "\u01B0\u01B1\x03\x02\x02\x02\u01B1\u01B3\x05\x9CO\x02\u01B2\u01AB\x03" +
59354
- "\x02\x02\x02\u01B2\u01AC\x03\x02\x02\x02\u01B2\u01AD\x03\x02\x02\x02\u01B2" +
59355
- "\u01AF\x03\x02\x02\x02\u01B31\x03\x02\x02\x02\u01B4\u01B5\x07\x1F\x02" +
59356
- "\x02\u01B5\u01B6\x05`1\x02\u01B6\u01B7\x07)\x02\x02\u01B7\u01B9\t\x07" +
59357
- "\x02\x02\u01B8\u01BA\x05,\x17\x02\u01B9\u01B8\x03\x02\x02\x02\u01B9\u01BA" +
59358
- "\x03\x02\x02\x02\u01BA\u01BD\x03\x02";
59359
- ForgeParser._serializedATNSegment1 = "\x02\x02\u01BB\u01BC\x07\"\x02\x02\u01BC\u01BE\x05\x9EP\x02\u01BD\u01BB" +
59360
- "\x03\x02\x02\x02\u01BD\u01BE\x03\x02\x02\x02\u01BE3\x03\x02\x02\x02\u01BF" +
59361
- "\u01C0\x07\x1F\x02\x02\u01C0\u01C2\x073\x02\x02\u01C1\u01C3\x07\x17\x02" +
59362
- "\x02\u01C2\u01C1\x03\x02\x02\x02\u01C2\u01C3\x03\x02\x02\x02\u01C3\u01C4" +
59363
- "\x03\x02\x02\x02\u01C4\u01C5\x05V,\x02\u01C5\u01C6\x072\x02\x02\u01C6" +
59364
- "\u01C7\x05`1\x02\u01C7\u01C8\x07)\x02\x02\u01C8\u01C9\t\b\x02\x02\u01C9" +
59365
- "\u01CA\x07\"\x02\x02\u01CA\u01CF\x05N(\x02\u01CB\u01CC\x07\x04\x02\x02" +
59366
- "\u01CC\u01CD\x05^0\x02\u01CD\u01CE\x07\x05\x02\x02\u01CE\u01D0\x03\x02" +
59367
- "\x02\x02\u01CF\u01CB\x03\x02\x02\x02\u01CF\u01D0\x03\x02\x02\x02\u01D0" +
59368
- "\u01D2\x03\x02\x02\x02\u01D1\u01D3\x05,\x17\x02\u01D2\u01D1\x03\x02\x02" +
59369
- "\x02\u01D2\u01D3\x03\x02\x02\x02\u01D3\u01D6\x03\x02\x02\x02\u01D4\u01D5" +
59370
- "\x07\"\x02\x02\u01D5\u01D7\x05\x9EP\x02\u01D6\u01D4\x03\x02\x02\x02\u01D6" +
59371
- "\u01D7\x03\x02\x02\x02\u01D75\x03\x02\x02\x02\u01D8\u01D9\x07\x1F\x02" +
59372
- "\x02\u01D9\u01DA\x05`1\x02\u01DA\u01DB\x07)\x02\x02\u01DB\u01DC\t\b\x02" +
59373
- "\x02\u01DC\u01DD\x07\"\x02\x02\u01DD\u01DF\x05N(\x02\u01DE\u01E0\x05," +
59374
- "\x17\x02\u01DF\u01DE\x03\x02\x02\x02\u01DF\u01E0\x03\x02\x02\x02\u01E0" +
59375
- "\u01E3\x03\x02\x02\x02\u01E1\u01E2\x07\"\x02\x02\u01E2\u01E4\x05\x9EP" +
59376
- "\x02\u01E3\u01E1\x03\x02\x02\x02\u01E3\u01E4\x03\x02\x02\x02\u01E47\x03" +
59377
- "\x02\x02\x02\u01E5\u01E6\x07\x1F\x02\x02\u01E6\u01E7\x05`1\x02\u01E7\u01E8" +
59378
- "\x07)\x02\x02\u01E8\u01E9\t\t\x02\x02\u01E9\u01EA\x078\x02\x02\u01EA\u01EC" +
59379
- "\x05N(\x02\u01EB\u01ED\x05,\x17\x02\u01EC\u01EB\x03\x02\x02\x02\u01EC" +
59380
- "\u01ED\x03\x02\x02\x02\u01ED\u01F0\x03\x02\x02\x02\u01EE\u01EF\x07\"\x02" +
59381
- "\x02\u01EF\u01F1\x05\x9EP\x02\u01F0\u01EE\x03\x02\x02\x02\u01F0\u01F1" +
59382
- "\x03\x02\x02\x02\u01F19\x03\x02\x02\x02\u01F2\u01F3\x07/\x02\x02\u01F3" +
59383
- "\u01F4\x071\x02\x02\u01F4\u01F5\x07\"\x02\x02\u01F5\u01F6\x05N(\x02\u01F6" +
59384
- "\u01FA\x07\v\x02\x02\u01F7\u01F9\x05<\x1F\x02\u01F8\u01F7\x03\x02\x02" +
59385
- "\x02\u01F9\u01FC\x03\x02\x02\x02\u01FA\u01F8\x03\x02\x02\x02\u01FA\u01FB" +
59386
- "\x03\x02\x02\x02\u01FB\u01FD\x03\x02\x02\x02\u01FC\u01FA\x03\x02\x02\x02" +
59387
- "\u01FD\u01FE\x07\f\x02\x02\u01FE;\x03\x02\x02\x02\u01FF\u0206\x05\x96" +
59388
- "L\x02\u0200\u0206\x05(\x15\x02\u0201\u0206\x054\x1B\x02\u0202\u0206\x05" +
59389
- "6\x1C\x02\u0203\u0206\x052\x1A\x02\u0204\u0206\x058\x1D\x02\u0205\u01FF" +
59390
- "\x03\x02\x02\x02\u0205\u0200\x03\x02\x02\x02\u0205\u0201\x03\x02\x02\x02" +
59391
- "\u0205\u0202\x03\x02\x02\x02\u0205\u0203\x03\x02\x02\x02\u0205\u0204\x03" +
59392
- "\x02\x02\x02\u0206=\x03\x02\x02\x02\u0207\u020A\x05\x10\t\x02\u0208\u020A" +
59393
- "\x07\x14\x02\x02\u0209\u0207\x03\x02\x02\x02\u0209\u0208\x03\x02\x02\x02" +
59394
- "\u0209\u020A\x03\x02\x02\x02\u020A\u020B\x03\x02\x02\x02\u020B\u020E\x07" +
59395
- "\\\x02\x02\u020C\u020F\x05\x10\t\x02\u020D\u020F\x07\x14\x02\x02\u020E" +
59396
- "\u020C\x03\x02\x02\x02\u020E\u020D\x03\x02\x02\x02\u020E\u020F\x03\x02" +
59397
- "\x02\x02\u020F?\x03\x02\x02\x02\u0210\u0211\t\n\x02\x02\u0211A\x03\x02" +
59398
- "\x02\x02\u0212\u0213\x05N(\x02\u0213\u0214\x07a\x02\x02\u0214\u0215\x05" +
59399
- "`1\x02\u0215C\x03\x02\x02\x02\u0216\u021A\x07\v\x02\x02\u0217\u0219\x05" +
59400
- "`1\x02\u0218\u0217\x03\x02\x02\x02\u0219\u021C\x03\x02\x02\x02\u021A\u0218" +
59401
- "\x03\x02\x02\x02\u021A\u021B\x03\x02\x02\x02\u021B\u021D\x03\x02\x02\x02" +
59402
- "\u021C\u021A\x03\x02\x02\x02\u021D\u021E\x07\f\x02\x02\u021EE\x03\x02" +
59403
- "\x02\x02\u021F\u0223\x05D#\x02\u0220\u0221\x072\x02\x02\u0221\u0223\x05" +
59404
- "`1\x02\u0222\u021F\x03\x02\x02\x02\u0222\u0220\x03\x02\x02\x02\u0223G" +
59405
- "\x03\x02\x02\x02\u0224\u0229\x073\x02\x02\u0225\u0229\x07g\x02\x02\u0226" +
59406
- "\u0229\x07h\x02\x02\u0227\u0229\x05\x10\t\x02\u0228\u0224\x03\x02\x02" +
59407
- "\x02\u0228\u0225\x03\x02\x02\x02\u0228\u0226\x03\x02\x02\x02\u0228\u0227" +
59408
- "\x03\x02\x02\x02\u0229I\x03\x02\x02\x02\u022A\u022B\x07W\x02\x02\u022B" +
59409
- "\u022D\x07l\x02\x02\u022C\u022A\x03\x02\x02\x02\u022C\u022D\x03\x02\x02" +
59410
- "\x02\u022D\u0233\x03\x02\x02\x02\u022E\u022F\x05N(\x02\u022F\u0230\x07" +
59411
- "l\x02\x02\u0230\u0232\x03\x02\x02\x02\u0231\u022E\x03\x02\x02\x02\u0232" +
59412
- "\u0235\x03\x02\x02\x02\u0233\u0231\x03\x02\x02\x02\u0233\u0234\x03\x02" +
59413
- "\x02\x02\u0234\u0236\x03\x02\x02\x02\u0235\u0233\x03\x02\x02\x02\u0236" +
59414
- "\u023A\x05N(\x02\u0237\u023A\x07i\x02\x02\u0238\u023A\x07h\x02\x02\u0239" +
59415
- "\u022C\x03\x02\x02\x02\u0239\u0237\x03\x02\x02\x02\u0239\u0238\x03\x02" +
59416
- "\x02\x02\u023AK\x03\x02\x02\x02\u023B\u023C\x07j\x02\x02\u023C\u0243\x05" +
59417
- "J&\x02\u023D\u0244\x05J&\x02\u023E\u0244\x07\x07\x02\x02\u023F\u0241\x07" +
59418
- "(\x02\x02\u0240\u023F\x03\x02\x02\x02\u0240\u0241\x03\x02\x02\x02\u0241" +
59419
- "\u0242\x03\x02\x02\x02\u0242\u0244\x05\x9CO\x02\u0243\u023D\x03\x02\x02" +
59420
- "\x02\u0243\u023E\x03\x02\x02\x02\u0243\u0240\x03\x02\x02\x02\u0244M\x03" +
59421
- "\x02\x02\x02\u0245\u0246\t\v\x02\x02\u0246O\x03\x02\x02\x02\u0247\u024D" +
59422
- "\x05N(\x02\u0248\u0249\x05N(\x02\u0249\u024A\x07k\x02\x02\u024A\u024B" +
59423
- "\x05P)\x02\u024B\u024D\x03\x02\x02\x02\u024C\u0247\x03\x02\x02\x02\u024C" +
59424
- "\u0248\x03\x02\x02\x02\u024DQ\x03\x02\x02\x02\u024E\u0254\x05J&\x02\u024F" +
59425
- "\u0250\x05J&\x02\u0250\u0251\x07k\x02\x02\u0251\u0252\x05R*\x02\u0252" +
59426
- "\u0254\x03\x02\x02\x02\u0253\u024E\x03\x02\x02\x02\u0253\u024F\x03\x02" +
59427
- "\x02\x02\u0254S\x03\x02\x02\x02\u0255\u025B\x05\x16\f\x02\u0256\u0257" +
59428
- "\x05\x16\f\x02\u0257\u0258\x07k\x02\x02\u0258\u0259\x05T+\x02\u0259\u025B" +
59429
- "\x03\x02\x02\x02\u025A\u0255\x03\x02\x02\x02\u025A\u0256\x03\x02\x02\x02" +
59430
- "\u025BU\x03\x02\x02\x02\u025C\u0262\x05\x18\r\x02\u025D\u025E\x05\x18" +
59431
- "\r\x02\u025E\u025F\x07k\x02\x02\u025F\u0260\x05V,\x02\u0260\u0262\x03" +
59432
- "\x02\x02\x02\u0261\u025C\x03\x02\x02\x02\u0261\u025D\x03\x02\x02\x02\u0262" +
59433
- "W\x03\x02\x02\x02\u0263\u0269\x05\x1A\x0E\x02\u0264\u0265\x05\x1A\x0E" +
59434
- "\x02\u0265\u0266\x07k\x02\x02\u0266\u0267\x05X-\x02\u0267\u0269\x03\x02" +
59435
- "\x02\x02\u0268\u0263\x03\x02\x02\x02\u0268\u0264\x03\x02\x02\x02\u0269" +
59436
- "Y\x03\x02\x02\x02\u026A\u0270\x05B\"\x02\u026B\u026C\x05B\"\x02\u026C" +
59437
- "\u026D\x07k\x02\x02\u026D\u026E\x05Z.\x02\u026E\u0270\x03\x02\x02\x02" +
59438
- "\u026F\u026A\x03\x02\x02\x02\u026F\u026B\x03\x02\x02\x02\u0270[\x03\x02" +
59439
- "\x02\x02\u0271\u0277\x05.\x18\x02\u0272\u0273\x05.\x18\x02\u0273\u0274" +
59440
- "\x07k\x02\x02\u0274\u0275\x05\\/\x02\u0275\u0277\x03\x02\x02\x02\u0276" +
59441
- "\u0271\x03\x02\x02\x02\u0276\u0272\x03\x02\x02\x02\u0277]\x03\x02\x02" +
59442
- "\x02\u0278\u027E\x05`1\x02\u0279\u027A\x05`1\x02\u027A\u027B\x07k\x02" +
59443
- "\x02\u027B\u027C\x05^0\x02\u027C\u027E\x03\x02\x02\x02\u027D\u0278\x03" +
59444
- "\x02\x02\x02\u027D\u0279\x03\x02\x02\x02\u027E_\x03\x02\x02\x02\u027F" +
59445
- "\u0290\x05b2\x02\u0280\u0281\x079\x02\x02\u0281\u0282\x05Z.\x02\u0282" +
59446
- "\u0283\x05F$\x02\u0283\u0290\x03\x02\x02\x02\u0284\u0285\x07:\x02\x02" +
59447
- "\u0285\u0286\x05Z.\x02\u0286\u0287\x05F$\x02\u0287\u0290\x03\x02\x02\x02" +
59448
- "\u0288\u028A\x05H%\x02\u0289\u028B\x07\x17\x02\x02\u028A\u0289\x03\x02" +
59449
- "\x02\x02\u028A\u028B\x03\x02\x02\x02\u028B\u028C\x03\x02\x02\x02\u028C" +
59450
- "\u028D\x05V,\x02\u028D\u028E\x05F$\x02\u028E\u0290\x03\x02\x02\x02\u028F" +
59451
- "\u027F\x03\x02\x02\x02\u028F\u0280\x03\x02\x02\x02\u028F\u0284\x03\x02" +
59452
- "\x02\x02\u028F\u0288\x03\x02\x02\x02\u0290a\x03\x02\x02\x02\u0291\u0292" +
59453
- "\b2\x01\x02\u0292\u0293\x05d3\x02\u0293\u0299\x03\x02\x02\x02\u0294\u0295" +
59454
- "\f\x03\x02\x02\u0295\u0296\x07;\x02\x02\u0296\u0298\x05d3\x02\u0297\u0294" +
59455
- "\x03\x02\x02\x02\u0298\u029B\x03\x02\x02\x02\u0299\u0297\x03\x02\x02\x02" +
59456
- "\u0299\u029A\x03\x02\x02\x02\u029Ac\x03\x02\x02\x02\u029B\u0299\x03\x02" +
59457
- "\x02\x02\u029C\u029D\b3\x01\x02\u029D\u029E\x05f4\x02\u029E\u02A4\x03" +
59458
- "\x02\x02\x02\u029F\u02A0\f\x03\x02\x02\u02A0\u02A1\x07<\x02\x02\u02A1" +
59459
- "\u02A3\x05f4\x02\u02A2\u029F\x03\x02\x02\x02\u02A3\u02A6\x03\x02\x02\x02" +
59460
- "\u02A4\u02A2\x03\x02\x02\x02\u02A4\u02A5\x03\x02\x02\x02\u02A5e\x03\x02" +
59461
- "\x02\x02\u02A6\u02A4\x03\x02\x02\x02\u02A7\u02A8\b4\x01\x02\u02A8\u02A9" +
59462
- "\x05h5\x02\u02A9\u02AF\x03\x02\x02\x02\u02AA\u02AB\f\x03\x02\x02\u02AB" +
59463
- "\u02AC\x07=\x02\x02\u02AC\u02AE\x05h5\x02\u02AD\u02AA\x03\x02\x02\x02" +
59464
- "\u02AE\u02B1\x03\x02\x02\x02\u02AF\u02AD\x03\x02\x02\x02\u02AF\u02B0\x03" +
59465
- "\x02\x02\x02\u02B0g\x03\x02\x02\x02\u02B1\u02AF\x03\x02\x02\x02\u02B2" +
59466
- "\u02BB\x05j6\x02\u02B3\u02B4\x05j6\x02\u02B4\u02B5\x07>\x02\x02\u02B5" +
59467
- "\u02B8\x05h5\x02\u02B6\u02B7\x07?\x02\x02\u02B7\u02B9\x05h5\x02\u02B8" +
59468
- "\u02B6\x03\x02\x02\x02\u02B8\u02B9\x03\x02\x02\x02\u02B9\u02BB\x03\x02" +
59469
- "\x02\x02\u02BA\u02B2\x03\x02\x02\x02\u02BA\u02B3\x03\x02\x02\x02\u02BB" +
59470
- "i\x03\x02\x02\x02\u02BC\u02BD\b6\x01\x02\u02BD\u02BE\x05l7\x02\u02BE\u02C4" +
59471
- "\x03\x02\x02\x02\u02BF\u02C0\f\x03\x02\x02\u02C0\u02C1\x07@\x02\x02\u02C1" +
59472
- "\u02C3\x05l7\x02\u02C2\u02BF\x03\x02\x02\x02\u02C3\u02C6\x03\x02\x02\x02" +
59473
- "\u02C4\u02C2\x03\x02\x02\x02\u02C4\u02C5\x03\x02\x02\x02\u02C5k\x03\x02" +
59474
- "\x02\x02\u02C6\u02C4\x03\x02\x02\x02\u02C7\u02D9\x05n8\x02\u02C8\u02C9" +
59475
- "\x05n8\x02\u02C9\u02CA\x07A\x02\x02\u02CA\u02CB\x05n8\x02\u02CB\u02D9" +
59476
- "\x03\x02\x02\x02\u02CC\u02CD\x05n8\x02\u02CD\u02CE\x07B\x02\x02\u02CE" +
59477
- "\u02CF\x05n8\x02\u02CF\u02D9\x03\x02\x02\x02\u02D0\u02D1\x05n8\x02\u02D1" +
59478
- "\u02D2\x07C\x02\x02\u02D2\u02D3\x05n8\x02\u02D3\u02D9\x03\x02\x02\x02" +
59479
- "\u02D4\u02D5\x05n8\x02\u02D5\u02D6\x07D\x02\x02\u02D6\u02D7\x05n8\x02" +
59480
- "\u02D7\u02D9\x03\x02\x02\x02\u02D8\u02C7\x03\x02\x02\x02\u02D8\u02C8\x03" +
59481
- "\x02\x02\x02\u02D8\u02CC\x03\x02\x02\x02\u02D8\u02D0\x03\x02\x02\x02\u02D8" +
59482
- "\u02D4\x03\x02\x02\x02\u02D9m\x03\x02\x02\x02\u02DA\u02EA\x05p9\x02\u02DB" +
59483
- "\u02DC\x07E\x02\x02\u02DC\u02EA\x05n8\x02\u02DD\u02DE\x07F\x02\x02\u02DE" +
59484
- "\u02EA\x05n8\x02\u02DF\u02E0\x07G\x02\x02\u02E0\u02EA\x05n8\x02\u02E1" +
59485
- "\u02E2\x07H\x02\x02\u02E2\u02EA\x05n8\x02\u02E3\u02E4\x07I\x02\x02\u02E4" +
59486
- "\u02EA\x05n8\x02\u02E5\u02E6\x07J\x02\x02\u02E6\u02EA\x05n8\x02\u02E7" +
59487
- "\u02E8\x07K\x02\x02\u02E8\u02EA\x05n8\x02\u02E9\u02DA\x03\x02\x02\x02" +
59488
- "\u02E9\u02DB\x03\x02\x02\x02\u02E9\u02DD\x03\x02\x02\x02\u02E9\u02DF\x03" +
59489
- "\x02\x02\x02\u02E9\u02E1\x03\x02\x02\x02\u02E9\u02E3\x03\x02\x02\x02\u02E9" +
59490
- "\u02E5\x03\x02\x02\x02\u02E9\u02E7\x03\x02\x02\x02\u02EAo\x03\x02\x02" +
59491
- "\x02\u02EB\u02EC\b9\x01\x02\u02EC\u02ED\x05r:\x02\u02ED\u02F7\x03\x02" +
59492
- "\x02\x02\u02EE\u02F0\f\x03\x02\x02\u02EF\u02F1\x07E\x02\x02\u02F0\u02EF" +
59493
- "\x03\x02\x02\x02\u02F0\u02F1\x03\x02\x02\x02\u02F1\u02F2\x03\x02\x02\x02" +
59494
- "\u02F2\u02F3\x05@!\x02\u02F3\u02F4\x05r:\x02\u02F4\u02F6\x03\x02\x02\x02" +
59495
- "\u02F5\u02EE\x03\x02\x02\x02\u02F6\u02F9\x03\x02\x02\x02\u02F7\u02F5\x03" +
59496
- "\x02\x02\x02\u02F7\u02F8\x03\x02\x02\x02\u02F8q\x03\x02\x02\x02\u02F9" +
59497
- "\u02F7\x03\x02\x02\x02\u02FA\u02FE\x05t;\x02\u02FB\u02FC\t\f\x02\x02\u02FC" +
59498
- "\u02FE\x05t;\x02\u02FD\u02FA\x03\x02\x02\x02\u02FD\u02FB\x03\x02\x02\x02" +
59499
- "\u02FEs\x03\x02\x02\x02\u02FF\u0300\b;\x01\x02\u0300\u0301\x05v<\x02\u0301" +
59500
- "\u0307\x03\x02\x02\x02\u0302\u0303\f\x03\x02\x02\u0303\u0304\t\r\x02\x02" +
59501
- "\u0304\u0306\x05x=\x02\u0305\u0302\x03\x02\x02\x02\u0306\u0309\x03\x02" +
59502
- "\x02\x02\u0307\u0305\x03\x02\x02\x02\u0307\u0308\x03\x02\x02\x02\u0308" +
59503
- "u\x03\x02\x02\x02\u0309\u0307\x03\x02\x02\x02\u030A\u030E\x05x=\x02\u030B" +
59504
- "\u030C\x07L\x02\x02\u030C\u030E\x05v<\x02\u030D\u030A\x03\x02\x02\x02" +
59505
- "\u030D\u030B\x03\x02\x02\x02\u030Ew\x03\x02\x02\x02\u030F\u0310\b=\x01" +
59506
- "\x02\u0310\u0311\x05z>\x02\u0311\u0317\x03\x02\x02\x02\u0312\u0313\f\x03" +
59507
- "\x02\x02\u0313\u0314\x07M\x02\x02\u0314\u0316\x05z>\x02\u0315\u0312\x03" +
59508
- "\x02\x02\x02\u0316\u0319\x03\x02\x02\x02\u0317\u0315\x03\x02\x02\x02\u0317" +
59509
- "\u0318\x03\x02\x02\x02\u0318y\x03\x02\x02\x02\u0319\u0317\x03\x02\x02" +
59510
- "\x02\u031A\u031B\b>\x01\x02\u031B\u031C\x05|?\x02\u031C\u0322\x03\x02" +
59511
- "\x02\x02\u031D\u031E\f\x03\x02\x02\u031E\u031F\x07N\x02\x02\u031F\u0321" +
59512
- "\x05|?\x02\u0320\u031D\x03\x02\x02\x02\u0321\u0324\x03\x02\x02\x02\u0322" +
59513
- "\u0320\x03\x02\x02\x02\u0322\u0323\x03\x02\x02\x02\u0323{\x03\x02\x02" +
59514
- "\x02\u0324\u0322\x03\x02\x02\x02\u0325\u0326\b?\x01\x02\u0326\u0327\x05" +
59515
- "~@\x02\u0327\u032E\x03\x02\x02\x02\u0328\u0329\f\x03\x02\x02\u0329\u032A" +
59516
- "\x05> \x02\u032A\u032B\x05~@\x02\u032B\u032D\x03\x02\x02\x02\u032C\u0328" +
59517
- "\x03\x02\x02\x02\u032D\u0330\x03\x02\x02\x02\u032E\u032C\x03\x02\x02\x02" +
59518
- "\u032E\u032F\x03\x02\x02\x02\u032F}\x03\x02\x02\x02\u0330\u032E\x03\x02" +
59519
- "\x02\x02\u0331\u0332\b@\x01\x02\u0332\u0333\x05\x80A\x02\u0333\u0339\x03" +
59520
- "\x02\x02\x02\u0334\u0335\f\x03\x02\x02\u0335\u0336\t\x0E\x02\x02\u0336" +
59521
- "\u0338\x05\x80A\x02\u0337\u0334\x03\x02\x02\x02\u0338\u033B\x03\x02\x02" +
59522
- "\x02\u0339\u0337\x03\x02\x02\x02\u0339\u033A\x03\x02\x02\x02\u033A\x7F" +
59523
- "\x03\x02\x02\x02\u033B\u0339\x03\x02\x02\x02\u033C\u033D\bA\x01\x02\u033D" +
59524
- "\u033E\x05\x82B\x02\u033E\u0346\x03\x02\x02\x02\u033F\u0340\f\x03\x02" +
59525
- "\x02\u0340\u0341\x07\x04\x02\x02\u0341\u0342\x05^0\x02\u0342\u0343\x07" +
59526
- "\x05\x02\x02\u0343\u0345\x03\x02\x02\x02\u0344\u033F\x03\x02\x02\x02\u0345" +
59527
- "\u0348\x03\x02\x02\x02\u0346\u0344\x03\x02\x02\x02\u0346\u0347\x03\x02" +
59528
- "\x02\x02\u0347\x81\x03\x02\x02\x02\u0348\u0346\x03\x02\x02\x02\u0349\u034A" +
59529
- "\bB\x01\x02\u034A\u0351\x05\x84C\x02\u034B\u034C\x05N(\x02\u034C\u034D" +
59530
- "\x07\x04\x02\x02\u034D\u034E\x05^0\x02\u034E\u034F\x07\x05\x02\x02\u034F" +
59531
- "\u0351\x03\x02\x02\x02\u0350\u0349\x03\x02\x02\x02\u0350\u034B\x03\x02" +
59532
- "\x02\x02\u0351\u0357\x03\x02\x02\x02\u0352\u0353\f\x04\x02\x02\u0353\u0354" +
59533
- "\x07\x1B\x02\x02\u0354\u0356\x05\x84C\x02\u0355\u0352\x03\x02\x02\x02" +
59534
- "\u0356\u0359\x03\x02\x02\x02\u0357\u0355\x03\x02\x02\x02\u0357\u0358\x03" +
59535
- "\x02\x02\x02\u0358\x83\x03\x02\x02\x02\u0359\u0357\x03\x02\x02\x02\u035A" +
59536
- "\u035B\bC\x01\x02\u035B\u035C\x05\x86D\x02\u035C\u0361\x03\x02\x02\x02" +
59537
- "\u035D\u035E\f\x03\x02\x02\u035E\u0360\x07Q\x02\x02\u035F\u035D\x03\x02" +
59538
- "\x02\x02\u0360\u0363\x03\x02\x02\x02\u0361\u035F\x03\x02\x02\x02\u0361" +
59539
- "\u0362\x03\x02\x02\x02\u0362\x85\x03\x02\x02\x02\u0363\u0361\x03\x02\x02" +
59540
- "\x02\u0364\u0368\x05\x88E\x02\u0365\u0366\t\x0F\x02\x02\u0366\u0368\x05" +
59541
- "\x86D\x02\u0367\u0364\x03\x02\x02\x02\u0367\u0365\x03\x02\x02\x02\u0368" +
59542
- "\x87\x03\x02\x02\x02\u0369\u037C\x050\x19\x02\u036A\u037C\x05J&\x02\u036B" +
59543
- "\u036C\x07U\x02\x02\u036C\u037C\x05N(\x02\u036D\u036E\x07V\x02\x02\u036E" +
59544
- "\u037C\x05N(\x02\u036F\u037C\x07W\x02\x02\u0370\u0371\x07\v\x02\x02\u0371" +
59545
- "\u0372\x05V,\x02\u0372\u0373\x05F$\x02\u0373\u0374\x07\f\x02\x02\u0374" +
59546
- "\u037C\x03\x02\x02\x02\u0375\u0376\x07\x1D\x02\x02\u0376\u0377\x05`1\x02" +
59547
- "\u0377\u0378\x07\x1E\x02\x02\u0378\u037C\x03\x02\x02\x02\u0379\u037C\x05" +
59548
- "D#\x02\u037A\u037C\x05\x8EH\x02\u037B\u0369\x03\x02\x02\x02\u037B\u036A" +
59549
- "\x03\x02\x02\x02\u037B\u036B\x03\x02\x02\x02\u037B\u036D\x03\x02\x02\x02" +
59550
- "\u037B\u036F\x03\x02\x02\x02\u037B\u0370\x03\x02\x02\x02\u037B\u0375\x03" +
59551
- "\x02\x02\x02\u037B\u0379\x03\x02\x02\x02\u037B\u037A\x03\x02\x02\x02\u037C" +
59552
- "\x89\x03\x02\x02\x02\u037D\u0383\x05J&\x02\u037E\u037F\x05J&\x02\u037F" +
59553
- "\u0380\x07\\\x02\x02\u0380\u0381\x05\x8AF\x02\u0381\u0383\x03\x02\x02" +
59554
- "\x02\u0382\u037D\x03\x02\x02\x02\u0382\u037E\x03\x02\x02\x02\u0383\x8B" +
59555
- "\x03\x02\x02\x02\u0384\u0385\x05\x8EH\x02\u0385\x8D\x03\x02\x02\x02\u0386" +
59556
- "\u0387\x07X\x02\x02\u0387\x8F\x03\x02\x02\x02\u0388\u0389\x07Y\x02\x02" +
59557
- "\u0389\u038A\x05N(\x02\u038A\u038C\x05\x9EP\x02\u038B\u038D\x05,\x17\x02" +
59558
- "\u038C\u038B\x03\x02\x02\x02\u038C\u038D\x03\x02\x02\x02\u038D\x91\x03" +
59559
- "\x02\x02\x02\u038E\u038F\x05\x1A\x0E\x02\u038F\x93\x03\x02\x02\x02\u0390" +
59560
- "\u0391\x07Z\x02\x02\u0391\u0392\x05`1\x02\u0392\x95\x03\x02\x02\x02\u0393" +
59561
- "\u0394\x07[\x02\x02\u0394\u0395\x05N(\x02\u0395\u0396\x07)\x02\x02\u0396" +
59562
- "\u0397\x05`1\x02\u0397\u0398\x07\"\x02\x02\u0398\u0399\x05\x9EP\x02\u0399" +
59563
- "\x97\x03\x02\x02\x02\u039A\u039B\x05N(\x02\u039B\u039C\x07\x18\x02\x02" +
59564
- "\u039C\u039D\x05\x8AF\x02\u039D\u039E\x07a\x02\x02\u039E\u039F\x05`1\x02" +
59565
- "\u039F\x99\x03\x02\x02\x02\u03A0\u03A6\x05\x9CO\x02\u03A1\u03A2\x05\x9C" +
59566
- "O\x02\u03A2\u03A3\x07k\x02\x02\u03A3\u03A4\x05\x9AN\x02\u03A4\u03A6\x03" +
59567
- "\x02\x02\x02\u03A5\u03A0\x03\x02\x02\x02\u03A5\u03A1\x03\x02\x02\x02\u03A6" +
59568
- "\x9B\x03\x02\x02\x02\u03A7\u03A8\x07m\x02\x02\u03A8\x9D\x03\x02\x02\x02" +
59569
- "\u03A9\u03AD\x07\v\x02\x02\u03AA\u03AC\x05\xA2R\x02\u03AB\u03AA\x03\x02" +
59570
- "\x02\x02\u03AC\u03AF\x03\x02\x02\x02\u03AD\u03AB\x03\x02\x02\x02\u03AD" +
59571
- "\u03AE\x03\x02\x02\x02\u03AE\u03B0\x03\x02\x02\x02\u03AF\u03AD\x03\x02" +
59572
- "\x02\x02\u03B0\u03B6\x07\f\x02\x02\u03B1\u03B3\x07$\x02\x02\u03B2\u03B1" +
59573
- "\x03\x02\x02\x02\u03B2\u03B3\x03\x02\x02\x02\u03B3\u03B4\x03\x02\x02\x02" +
59574
- "\u03B4\u03B6\x05J&\x02\u03B5\u03A9\x03\x02\x02\x02\u03B5\u03B2\x03\x02" +
59575
- "\x02\x02\u03B6\x9F\x03\x02\x02\x02\u03B7\u03B8\x07V\x02\x02\u03B8\u03BD" +
59576
- "\x05N(\x02\u03B9\u03BD\x05\x9CO\x02\u03BA\u03BB\x07(\x02\x02\u03BB\u03BD" +
59577
- "\x05\x9CO\x02\u03BC\u03B7\x03\x02\x02\x02\u03BC\u03B9\x03\x02\x02\x02" +
59578
- "\u03BC\u03BA\x03\x02\x02\x02\u03BD\xA1\x03\x02\x02\x02\u03BE\u03BF\x05" +
59579
- "\xA4S\x02\u03BF\u03C0\x05@!\x02\u03C0\u03C1\x05\xA6T\x02\u03C1\u03C6\x03" +
59580
- "\x02\x02\x02\u03C2\u03C3\x07g\x02\x02\u03C3\u03C6\x05\xA4S\x02\u03C4\u03C6" +
59581
- "\x05J&\x02\u03C5\u03BE\x03\x02\x02\x02\u03C5\u03C2\x03\x02\x02\x02\u03C5" +
59582
- "\u03C4\x03\x02\x02\x02\u03C6\xA3\x03\x02\x02\x02\u03C7\u03C8\x07L\x02" +
59583
- "\x02\u03C8\u03D2\x05J&\x02\u03C9\u03D2\x05J&\x02\u03CA\u03CD\x05\xA0Q" +
59584
- "\x02\u03CB\u03CC\x07\x1B\x02\x02\u03CC\u03CE\x05J&\x02\u03CD\u03CB\x03" +
59585
- "\x02\x02\x02\u03CE\u03CF\x03\x02\x02\x02\u03CF\u03CD\x03\x02\x02\x02\u03CF" +
59586
- "\u03D0\x03\x02\x02\x02\u03D0\u03D2\x03\x02\x02\x02\u03D1\u03C7\x03\x02" +
59587
- "\x02\x02\u03D1\u03C9\x03\x02\x02\x02\u03D1\u03CA\x03\x02\x02\x02\u03D2" +
59588
- "\xA5\x03\x02\x02\x02\u03D3\u03D4\bT\x01\x02\u03D4\u03DA\x05\xA8U\x02\u03D5" +
59589
- "\u03D6\x07\x1D\x02\x02\u03D6\u03D7\x05\xA6T\x02\u03D7\u03D8\x07\x1E\x02" +
59590
- "\x02\u03D8\u03DA\x03\x02\x02\x02\u03D9\u03D3\x03\x02\x02\x02\u03D9\u03D5" +
59591
- "\x03\x02\x02\x02\u03DA\u03E0\x03\x02\x02\x02\u03DB\u03DC\f\x04\x02\x02" +
59592
- "\u03DC\u03DD\x07\x0F\x02\x02\u03DD\u03DF\x05\xA8U\x02\u03DE\u03DB\x03" +
59593
- "\x02\x02\x02\u03DF\u03E2\x03\x02\x02\x02\u03E0\u03DE\x03\x02\x02\x02\u03E0" +
59594
- "\u03E1\x03\x02\x02\x02\u03E1\xA7\x03\x02\x02\x02\u03E2\u03E0\x03\x02\x02" +
59595
- "\x02\u03E3\u03E4\bU\x01\x02\u03E4\u03E5\x07\x1D\x02\x02\u03E5\u03E6\x05" +
59596
- "\xA8U\x02\u03E6\u03E7\x07\x1E\x02\x02\u03E7\u03EA\x03\x02\x02\x02\u03E8" +
59597
- "\u03EA\x05\xAAV\x02\u03E9\u03E3\x03\x02\x02\x02\u03E9\u03E8\x03\x02\x02" +
59598
- "\x02\u03EA\u03F0\x03\x02\x02\x02\u03EB\u03EC\f\x04\x02\x02\u03EC\u03ED" +
59599
- "\t\x10\x02\x02\u03ED\u03EF\x05\xAAV\x02\u03EE\u03EB\x03\x02\x02\x02\u03EF" +
59600
- "\u03F2\x03\x02\x02\x02\u03F0\u03EE\x03\x02\x02\x02\u03F0\u03F1\x03\x02" +
59601
- "\x02\x02\u03F1\xA9\x03\x02\x02\x02\u03F2\u03F0\x03\x02\x02\x02\u03F3\u03FA" +
59602
- "\x05\xA0Q\x02\u03F4\u03FA\x05J&\x02\u03F5\u03F6\x07\x1D\x02\x02\u03F6" +
59603
- "\u03F7\x05\xA6T\x02\u03F7\u03F8\x07\x1E\x02\x02\u03F8\u03FA\x03\x02\x02" +
59604
- "\x02\u03F9\u03F3\x03\x02\x02\x02\u03F9\u03F4\x03\x02\x02\x02\u03F9\u03F5" +
59605
- "\x03\x02\x02\x02\u03FA\xAB\x03\x02\x02\x02x\xAE\xB3\xB7\xC1\xC7\xCD\xD0" +
59729
+ "\u01B0\u01B1\x03\x02\x02\x02\u01B1\u01B4\x05\x9CO\x02\u01B2\u01B4\x07" +
59730
+ "\x07\x02\x02\u01B3\u01AB\x03\x02\x02\x02\u01B3\u01AC\x03\x02\x02\x02\u01B3" +
59731
+ "\u01AD\x03\x02\x02\x02\u01B3\u01AF\x03\x02\x02\x02\u01B3\u01B2\x03\x02" +
59732
+ "\x02\x02\u01B41\x03\x02\x02\x02\u01B5\u01B6\x07\x1F\x02\x02\u01B6\u01B7" +
59733
+ "\x05`1\x02\u01B7\u01B8\x07)\x02\x02\u01B8\u01BA\t\x07\x02\x02\u01B9\u01BB" +
59734
+ "\x05,\x17\x02\u01BA\u01B9";
59735
+ ForgeParser._serializedATNSegment1 = "\x03\x02\x02\x02\u01BA\u01BB\x03\x02\x02\x02\u01BB\u01BE\x03\x02\x02\x02" +
59736
+ "\u01BC\u01BD\x07\"\x02\x02\u01BD\u01BF\x05\x9EP\x02\u01BE\u01BC\x03\x02" +
59737
+ "\x02\x02\u01BE\u01BF\x03\x02\x02\x02\u01BF3\x03\x02\x02\x02\u01C0\u01C1" +
59738
+ "\x07\x1F\x02\x02\u01C1\u01C3\x073\x02\x02\u01C2\u01C4\x07\x17\x02\x02" +
59739
+ "\u01C3\u01C2\x03\x02\x02\x02\u01C3\u01C4\x03\x02\x02\x02\u01C4\u01C5\x03" +
59740
+ "\x02\x02\x02\u01C5\u01C6\x05V,\x02\u01C6\u01C7\x072\x02\x02\u01C7\u01C8" +
59741
+ "\x05`1\x02\u01C8\u01C9\x07)\x02\x02\u01C9\u01CA\t\b\x02\x02\u01CA\u01CB" +
59742
+ "\x07\"\x02\x02\u01CB\u01D0\x05N(\x02\u01CC\u01CD\x07\x04\x02\x02\u01CD" +
59743
+ "\u01CE\x05^0\x02\u01CE\u01CF\x07\x05\x02\x02\u01CF\u01D1\x03\x02\x02\x02" +
59744
+ "\u01D0\u01CC\x03\x02\x02\x02\u01D0\u01D1\x03\x02\x02\x02\u01D1\u01D3\x03" +
59745
+ "\x02\x02\x02\u01D2\u01D4\x05,\x17\x02\u01D3\u01D2\x03\x02\x02\x02\u01D3" +
59746
+ "\u01D4\x03\x02\x02\x02\u01D4\u01D7\x03\x02\x02\x02\u01D5\u01D6\x07\"\x02" +
59747
+ "\x02\u01D6\u01D8\x05\x9EP\x02\u01D7\u01D5\x03\x02\x02\x02\u01D7\u01D8" +
59748
+ "\x03\x02\x02\x02\u01D85\x03\x02\x02\x02\u01D9\u01DA\x07\x1F\x02\x02\u01DA" +
59749
+ "\u01DB\x05`1\x02\u01DB\u01DC\x07)\x02\x02\u01DC\u01DD\t\b\x02\x02\u01DD" +
59750
+ "\u01DE\x07\"\x02\x02\u01DE\u01E0\x05N(\x02\u01DF\u01E1\x05,\x17\x02\u01E0" +
59751
+ "\u01DF\x03\x02\x02\x02\u01E0\u01E1\x03\x02\x02\x02\u01E1\u01E4\x03\x02" +
59752
+ "\x02\x02\u01E2\u01E3\x07\"\x02\x02\u01E3\u01E5\x05\x9EP\x02\u01E4\u01E2" +
59753
+ "\x03\x02\x02\x02\u01E4\u01E5\x03\x02\x02\x02\u01E57\x03\x02\x02\x02\u01E6" +
59754
+ "\u01E7\x07\x1F\x02\x02\u01E7\u01E8\x05`1\x02\u01E8\u01E9\x07)\x02\x02" +
59755
+ "\u01E9\u01EA\t\t\x02\x02\u01EA\u01EB\x078\x02\x02\u01EB\u01ED\x05N(\x02" +
59756
+ "\u01EC\u01EE\x05,\x17\x02\u01ED\u01EC\x03\x02\x02\x02\u01ED\u01EE\x03" +
59757
+ "\x02\x02\x02\u01EE\u01F1\x03\x02\x02\x02\u01EF\u01F0\x07\"\x02\x02\u01F0" +
59758
+ "\u01F2\x05\x9EP\x02\u01F1\u01EF\x03\x02\x02\x02\u01F1\u01F2\x03\x02\x02" +
59759
+ "\x02\u01F29\x03\x02\x02\x02\u01F3\u01F4\x07/\x02\x02\u01F4\u01F5\x071" +
59760
+ "\x02\x02\u01F5\u01F6\x07\"\x02\x02\u01F6\u01F7\x05N(\x02\u01F7\u01FB\x07" +
59761
+ "\v\x02\x02\u01F8\u01FA\x05<\x1F\x02\u01F9\u01F8\x03\x02\x02\x02\u01FA" +
59762
+ "\u01FD\x03\x02\x02\x02\u01FB\u01F9\x03\x02\x02\x02\u01FB\u01FC\x03\x02" +
59763
+ "\x02\x02\u01FC\u01FE\x03\x02\x02\x02\u01FD\u01FB\x03\x02\x02\x02\u01FE" +
59764
+ "\u01FF\x07\f\x02\x02\u01FF;\x03\x02\x02\x02\u0200\u0207\x05\x96L\x02\u0201" +
59765
+ "\u0207\x05(\x15\x02\u0202\u0207\x054\x1B\x02\u0203\u0207\x056\x1C\x02" +
59766
+ "\u0204\u0207\x052\x1A\x02\u0205\u0207\x058\x1D\x02\u0206\u0200\x03\x02" +
59767
+ "\x02\x02\u0206\u0201\x03\x02\x02\x02\u0206\u0202\x03\x02\x02\x02\u0206" +
59768
+ "\u0203\x03\x02\x02\x02\u0206\u0204\x03\x02\x02\x02\u0206\u0205\x03\x02" +
59769
+ "\x02\x02\u0207=\x03\x02\x02\x02\u0208\u020B\x05\x10\t\x02\u0209\u020B" +
59770
+ "\x07\x14\x02\x02\u020A\u0208\x03\x02\x02\x02\u020A\u0209\x03\x02\x02\x02" +
59771
+ "\u020A\u020B\x03\x02\x02\x02\u020B\u020C\x03\x02\x02\x02\u020C\u020F\x07" +
59772
+ "\\\x02\x02\u020D\u0210\x05\x10\t\x02\u020E\u0210\x07\x14\x02\x02\u020F" +
59773
+ "\u020D\x03\x02\x02\x02\u020F\u020E\x03\x02\x02\x02\u020F\u0210\x03\x02" +
59774
+ "\x02\x02\u0210?\x03\x02\x02\x02\u0211\u0212\t\n\x02\x02\u0212A\x03\x02" +
59775
+ "\x02\x02\u0213\u0214\x05N(\x02\u0214\u0215\x07a\x02\x02\u0215\u0216\x05" +
59776
+ "`1\x02\u0216C\x03\x02\x02\x02\u0217\u021B\x07\v\x02\x02\u0218\u021A\x05" +
59777
+ "`1\x02\u0219\u0218\x03\x02\x02\x02\u021A\u021D\x03\x02\x02\x02\u021B\u0219" +
59778
+ "\x03\x02\x02\x02\u021B\u021C\x03\x02\x02\x02\u021C\u021E\x03\x02\x02\x02" +
59779
+ "\u021D\u021B\x03\x02\x02\x02\u021E\u021F\x07\f\x02\x02\u021FE\x03\x02" +
59780
+ "\x02\x02\u0220\u0224\x05D#\x02\u0221\u0222\x072\x02\x02\u0222\u0224\x05" +
59781
+ "`1\x02\u0223\u0220\x03\x02\x02\x02\u0223\u0221\x03\x02\x02\x02\u0224G" +
59782
+ "\x03\x02\x02\x02\u0225\u022A\x073\x02\x02\u0226\u022A\x07g\x02\x02\u0227" +
59783
+ "\u022A\x07h\x02\x02\u0228\u022A\x05\x10\t\x02\u0229\u0225\x03\x02\x02" +
59784
+ "\x02\u0229\u0226\x03\x02\x02\x02\u0229\u0227\x03\x02\x02\x02\u0229\u0228" +
59785
+ "\x03\x02\x02\x02\u022AI\x03\x02\x02\x02\u022B\u022C\x07W\x02\x02\u022C" +
59786
+ "\u022E\x07l\x02\x02\u022D\u022B\x03\x02\x02\x02\u022D\u022E\x03\x02\x02" +
59787
+ "\x02\u022E\u0234\x03\x02\x02\x02\u022F\u0230\x05N(\x02\u0230\u0231\x07" +
59788
+ "l\x02\x02\u0231\u0233\x03\x02\x02\x02\u0232\u022F\x03\x02\x02\x02\u0233" +
59789
+ "\u0236\x03\x02\x02\x02\u0234\u0232\x03\x02\x02\x02\u0234\u0235\x03\x02" +
59790
+ "\x02\x02\u0235\u0237\x03\x02\x02\x02\u0236\u0234\x03\x02\x02\x02\u0237" +
59791
+ "\u023B\x05N(\x02\u0238\u023B\x07i\x02\x02\u0239\u023B\x07h\x02\x02\u023A" +
59792
+ "\u022D\x03\x02\x02\x02\u023A\u0238\x03\x02\x02\x02\u023A\u0239\x03\x02" +
59793
+ "\x02\x02\u023BK\x03\x02\x02\x02\u023C\u023D\x07j\x02\x02\u023D\u0244\x05" +
59794
+ "J&\x02\u023E\u0245\x05J&\x02\u023F\u0245\x07\x07\x02\x02\u0240\u0242\x07" +
59795
+ "(\x02\x02\u0241\u0240\x03\x02\x02\x02\u0241\u0242\x03\x02\x02\x02\u0242" +
59796
+ "\u0243\x03\x02\x02\x02\u0243\u0245\x05\x9CO\x02\u0244\u023E\x03\x02\x02" +
59797
+ "\x02\u0244\u023F\x03\x02\x02\x02\u0244\u0241\x03\x02\x02\x02\u0245M\x03" +
59798
+ "\x02\x02\x02\u0246\u0247\t\v\x02\x02\u0247O\x03\x02\x02\x02\u0248\u024E" +
59799
+ "\x05N(\x02\u0249\u024A\x05N(\x02\u024A\u024B\x07k\x02\x02\u024B\u024C" +
59800
+ "\x05P)\x02\u024C\u024E\x03\x02\x02\x02\u024D\u0248\x03\x02\x02\x02\u024D" +
59801
+ "\u0249\x03\x02\x02\x02\u024EQ\x03\x02\x02\x02\u024F\u0255\x05J&\x02\u0250" +
59802
+ "\u0251\x05J&\x02\u0251\u0252\x07k\x02\x02\u0252\u0253\x05R*\x02\u0253" +
59803
+ "\u0255\x03\x02\x02\x02\u0254\u024F\x03\x02\x02\x02\u0254\u0250\x03\x02" +
59804
+ "\x02\x02\u0255S\x03\x02\x02\x02\u0256\u025C\x05\x16\f\x02\u0257\u0258" +
59805
+ "\x05\x16\f\x02\u0258\u0259\x07k\x02\x02\u0259\u025A\x05T+\x02\u025A\u025C" +
59806
+ "\x03\x02\x02\x02\u025B\u0256\x03\x02\x02\x02\u025B\u0257\x03\x02\x02\x02" +
59807
+ "\u025CU\x03\x02\x02\x02\u025D\u0263\x05\x18\r\x02\u025E\u025F\x05\x18" +
59808
+ "\r\x02\u025F\u0260\x07k\x02\x02\u0260\u0261\x05V,\x02\u0261\u0263\x03" +
59809
+ "\x02\x02\x02\u0262\u025D\x03\x02\x02\x02\u0262\u025E\x03\x02\x02\x02\u0263" +
59810
+ "W\x03\x02\x02\x02\u0264\u026A\x05\x1A\x0E\x02\u0265\u0266\x05\x1A\x0E" +
59811
+ "\x02\u0266\u0267\x07k\x02\x02\u0267\u0268\x05X-\x02\u0268\u026A\x03\x02" +
59812
+ "\x02\x02\u0269\u0264\x03\x02\x02\x02\u0269\u0265\x03\x02\x02\x02\u026A" +
59813
+ "Y\x03\x02\x02\x02\u026B\u0271\x05B\"\x02\u026C\u026D\x05B\"\x02\u026D" +
59814
+ "\u026E\x07k\x02\x02\u026E\u026F\x05Z.\x02\u026F\u0271\x03\x02\x02\x02" +
59815
+ "\u0270\u026B\x03\x02\x02\x02\u0270\u026C\x03\x02\x02\x02\u0271[\x03\x02" +
59816
+ "\x02\x02\u0272\u0278\x05.\x18\x02\u0273\u0274\x05.\x18\x02\u0274\u0275" +
59817
+ "\x07k\x02\x02\u0275\u0276\x05\\/\x02\u0276\u0278\x03\x02\x02\x02\u0277" +
59818
+ "\u0272\x03\x02\x02\x02\u0277\u0273\x03\x02\x02\x02\u0278]\x03\x02\x02" +
59819
+ "\x02\u0279\u027F\x05`1\x02\u027A\u027B\x05`1\x02\u027B\u027C\x07k\x02" +
59820
+ "\x02\u027C\u027D\x05^0\x02\u027D\u027F\x03\x02\x02\x02\u027E\u0279\x03" +
59821
+ "\x02\x02\x02\u027E\u027A\x03\x02\x02\x02\u027F_\x03\x02\x02\x02\u0280" +
59822
+ "\u0291\x05b2\x02\u0281\u0282\x079\x02\x02\u0282\u0283\x05Z.\x02\u0283" +
59823
+ "\u0284\x05F$\x02\u0284\u0291\x03\x02\x02\x02\u0285\u0286\x07:\x02\x02" +
59824
+ "\u0286\u0287\x05Z.\x02\u0287\u0288\x05F$\x02\u0288\u0291\x03\x02\x02\x02" +
59825
+ "\u0289\u028B\x05H%\x02\u028A\u028C\x07\x17\x02\x02\u028B\u028A\x03\x02" +
59826
+ "\x02\x02\u028B\u028C\x03\x02\x02\x02\u028C\u028D\x03\x02\x02\x02\u028D" +
59827
+ "\u028E\x05V,\x02\u028E\u028F\x05F$\x02\u028F\u0291\x03\x02\x02\x02\u0290" +
59828
+ "\u0280\x03\x02\x02\x02\u0290\u0281\x03\x02\x02\x02\u0290\u0285\x03\x02" +
59829
+ "\x02\x02\u0290\u0289\x03\x02\x02\x02\u0291a\x03\x02\x02\x02\u0292\u0293" +
59830
+ "\b2\x01\x02\u0293\u0294\x05d3\x02\u0294\u029A\x03\x02\x02\x02\u0295\u0296" +
59831
+ "\f\x03\x02\x02\u0296\u0297\x07;\x02\x02\u0297\u0299\x05d3\x02\u0298\u0295" +
59832
+ "\x03\x02\x02\x02\u0299\u029C\x03\x02\x02\x02\u029A\u0298\x03\x02\x02\x02" +
59833
+ "\u029A\u029B\x03\x02\x02\x02\u029Bc\x03\x02\x02\x02\u029C\u029A\x03\x02" +
59834
+ "\x02\x02\u029D\u029E\b3\x01\x02\u029E\u029F\x05f4\x02\u029F\u02A5\x03" +
59835
+ "\x02\x02\x02\u02A0\u02A1\f\x03\x02\x02\u02A1\u02A2\x07<\x02\x02\u02A2" +
59836
+ "\u02A4\x05f4\x02\u02A3\u02A0\x03\x02\x02\x02\u02A4\u02A7\x03\x02\x02\x02" +
59837
+ "\u02A5\u02A3\x03\x02\x02\x02\u02A5\u02A6\x03\x02\x02\x02\u02A6e\x03\x02" +
59838
+ "\x02\x02\u02A7\u02A5\x03\x02\x02\x02\u02A8\u02A9\b4\x01\x02\u02A9\u02AA" +
59839
+ "\x05h5\x02\u02AA\u02B0\x03\x02\x02\x02\u02AB\u02AC\f\x03\x02\x02\u02AC" +
59840
+ "\u02AD\x07=\x02\x02\u02AD\u02AF\x05h5\x02\u02AE\u02AB\x03\x02\x02\x02" +
59841
+ "\u02AF\u02B2\x03\x02\x02\x02\u02B0\u02AE\x03\x02\x02\x02\u02B0\u02B1\x03" +
59842
+ "\x02\x02\x02\u02B1g\x03\x02\x02\x02\u02B2\u02B0\x03\x02\x02\x02\u02B3" +
59843
+ "\u02BC\x05j6\x02\u02B4\u02B5\x05j6\x02\u02B5\u02B6\x07>\x02\x02\u02B6" +
59844
+ "\u02B9\x05h5\x02\u02B7\u02B8\x07?\x02\x02\u02B8\u02BA\x05h5\x02\u02B9" +
59845
+ "\u02B7\x03\x02\x02\x02\u02B9\u02BA\x03\x02\x02\x02\u02BA\u02BC\x03\x02" +
59846
+ "\x02\x02\u02BB\u02B3\x03\x02\x02\x02\u02BB\u02B4\x03\x02\x02\x02\u02BC" +
59847
+ "i\x03\x02\x02\x02\u02BD\u02BE\b6\x01\x02\u02BE\u02BF\x05l7\x02\u02BF\u02C5" +
59848
+ "\x03\x02\x02\x02\u02C0\u02C1\f\x03\x02\x02\u02C1\u02C2\x07@\x02\x02\u02C2" +
59849
+ "\u02C4\x05l7\x02\u02C3\u02C0\x03\x02\x02\x02\u02C4\u02C7\x03\x02\x02\x02" +
59850
+ "\u02C5\u02C3\x03\x02\x02\x02\u02C5\u02C6\x03\x02\x02\x02\u02C6k\x03\x02" +
59851
+ "\x02\x02\u02C7\u02C5\x03\x02\x02\x02\u02C8\u02DA\x05n8\x02\u02C9\u02CA" +
59852
+ "\x05n8\x02\u02CA\u02CB\x07A\x02\x02\u02CB\u02CC\x05n8\x02\u02CC\u02DA" +
59853
+ "\x03\x02\x02\x02\u02CD\u02CE\x05n8\x02\u02CE\u02CF\x07B\x02\x02\u02CF" +
59854
+ "\u02D0\x05n8\x02\u02D0\u02DA\x03\x02\x02\x02\u02D1\u02D2\x05n8\x02\u02D2" +
59855
+ "\u02D3\x07C\x02\x02\u02D3\u02D4\x05n8\x02\u02D4\u02DA\x03\x02\x02\x02" +
59856
+ "\u02D5\u02D6\x05n8\x02\u02D6\u02D7\x07D\x02\x02\u02D7\u02D8\x05n8\x02" +
59857
+ "\u02D8\u02DA\x03\x02\x02\x02\u02D9\u02C8\x03\x02\x02\x02\u02D9\u02C9\x03" +
59858
+ "\x02\x02\x02\u02D9\u02CD\x03\x02\x02\x02\u02D9\u02D1\x03\x02\x02\x02\u02D9" +
59859
+ "\u02D5\x03\x02\x02\x02\u02DAm\x03\x02\x02\x02\u02DB\u02EB\x05p9\x02\u02DC" +
59860
+ "\u02DD\x07E\x02\x02\u02DD\u02EB\x05n8\x02\u02DE\u02DF\x07F\x02\x02\u02DF" +
59861
+ "\u02EB\x05n8\x02\u02E0\u02E1\x07G\x02\x02\u02E1\u02EB\x05n8\x02\u02E2" +
59862
+ "\u02E3\x07H\x02\x02\u02E3\u02EB\x05n8\x02\u02E4\u02E5\x07I\x02\x02\u02E5" +
59863
+ "\u02EB\x05n8\x02\u02E6\u02E7\x07J\x02\x02\u02E7\u02EB\x05n8\x02\u02E8" +
59864
+ "\u02E9\x07K\x02\x02\u02E9\u02EB\x05n8\x02\u02EA\u02DB\x03\x02\x02\x02" +
59865
+ "\u02EA\u02DC\x03\x02\x02\x02\u02EA\u02DE\x03\x02\x02\x02\u02EA\u02E0\x03" +
59866
+ "\x02\x02\x02\u02EA\u02E2\x03\x02\x02\x02\u02EA\u02E4\x03\x02\x02\x02\u02EA" +
59867
+ "\u02E6\x03\x02\x02\x02\u02EA\u02E8\x03\x02\x02\x02\u02EBo\x03\x02\x02" +
59868
+ "\x02\u02EC\u02ED\b9\x01\x02\u02ED\u02EE\x05r:\x02\u02EE\u02F8\x03\x02" +
59869
+ "\x02\x02\u02EF\u02F1\f\x03\x02\x02\u02F0\u02F2\x07E\x02\x02\u02F1\u02F0" +
59870
+ "\x03\x02\x02\x02\u02F1\u02F2\x03\x02\x02\x02\u02F2\u02F3\x03\x02\x02\x02" +
59871
+ "\u02F3\u02F4\x05@!\x02\u02F4\u02F5\x05r:\x02\u02F5\u02F7\x03\x02\x02\x02" +
59872
+ "\u02F6\u02EF\x03\x02\x02\x02\u02F7\u02FA\x03\x02\x02\x02\u02F8\u02F6\x03" +
59873
+ "\x02\x02\x02\u02F8\u02F9\x03\x02\x02\x02\u02F9q\x03\x02\x02\x02\u02FA" +
59874
+ "\u02F8\x03\x02\x02\x02\u02FB\u02FF\x05t;\x02\u02FC\u02FD\t\f\x02\x02\u02FD" +
59875
+ "\u02FF\x05t;\x02\u02FE\u02FB\x03\x02\x02\x02\u02FE\u02FC\x03\x02\x02\x02" +
59876
+ "\u02FFs\x03\x02\x02\x02\u0300\u0301\b;\x01\x02\u0301\u0302\x05v<\x02\u0302" +
59877
+ "\u0308\x03\x02\x02\x02\u0303\u0304\f\x03\x02\x02\u0304\u0305\t\r\x02\x02" +
59878
+ "\u0305\u0307\x05x=\x02\u0306\u0303\x03\x02\x02\x02\u0307\u030A\x03\x02" +
59879
+ "\x02\x02\u0308\u0306\x03\x02\x02\x02\u0308\u0309\x03\x02\x02\x02\u0309" +
59880
+ "u\x03\x02\x02\x02\u030A\u0308\x03\x02\x02\x02\u030B\u030F\x05x=\x02\u030C" +
59881
+ "\u030D\x07L\x02\x02\u030D\u030F\x05v<\x02\u030E\u030B\x03\x02\x02\x02" +
59882
+ "\u030E\u030C\x03\x02\x02\x02\u030Fw\x03\x02\x02\x02\u0310\u0311\b=\x01" +
59883
+ "\x02\u0311\u0312\x05z>\x02\u0312\u0318\x03\x02\x02\x02\u0313\u0314\f\x03" +
59884
+ "\x02\x02\u0314\u0315\x07M\x02\x02\u0315\u0317\x05z>\x02\u0316\u0313\x03" +
59885
+ "\x02\x02\x02\u0317\u031A\x03\x02\x02\x02\u0318\u0316\x03\x02\x02\x02\u0318" +
59886
+ "\u0319\x03\x02\x02\x02\u0319y\x03\x02\x02\x02\u031A\u0318\x03\x02\x02" +
59887
+ "\x02\u031B\u031C\b>\x01\x02\u031C\u031D\x05|?\x02\u031D\u0323\x03\x02" +
59888
+ "\x02\x02\u031E\u031F\f\x03\x02\x02\u031F\u0320\x07N\x02\x02\u0320\u0322" +
59889
+ "\x05|?\x02\u0321\u031E\x03\x02\x02\x02\u0322\u0325\x03\x02\x02\x02\u0323" +
59890
+ "\u0321\x03\x02\x02\x02\u0323\u0324\x03\x02\x02\x02\u0324{\x03\x02\x02" +
59891
+ "\x02\u0325\u0323\x03\x02\x02\x02\u0326\u0327\b?\x01\x02\u0327\u0328\x05" +
59892
+ "~@\x02\u0328\u032F\x03\x02\x02\x02\u0329\u032A\f\x03\x02\x02\u032A\u032B" +
59893
+ "\x05> \x02\u032B\u032C\x05~@\x02\u032C\u032E\x03\x02\x02\x02\u032D\u0329" +
59894
+ "\x03\x02\x02\x02\u032E\u0331\x03\x02\x02\x02\u032F\u032D\x03\x02\x02\x02" +
59895
+ "\u032F\u0330\x03\x02\x02\x02\u0330}\x03\x02\x02\x02\u0331\u032F\x03\x02" +
59896
+ "\x02\x02\u0332\u0333\b@\x01\x02\u0333\u0334\x05\x80A\x02\u0334\u033A\x03" +
59897
+ "\x02\x02\x02\u0335\u0336\f\x03\x02\x02\u0336\u0337\t\x0E\x02\x02\u0337" +
59898
+ "\u0339\x05\x80A\x02\u0338\u0335\x03\x02\x02\x02\u0339\u033C\x03\x02\x02" +
59899
+ "\x02\u033A\u0338\x03\x02\x02\x02\u033A\u033B\x03\x02\x02\x02\u033B\x7F" +
59900
+ "\x03\x02\x02\x02\u033C\u033A\x03\x02\x02\x02\u033D\u033E\bA\x01\x02\u033E" +
59901
+ "\u033F\x05\x82B\x02\u033F\u0347\x03\x02\x02\x02\u0340\u0341\f\x03\x02" +
59902
+ "\x02\u0341\u0342\x07\x04\x02\x02\u0342\u0343\x05^0\x02\u0343\u0344\x07" +
59903
+ "\x05\x02\x02\u0344\u0346\x03\x02\x02\x02\u0345\u0340\x03\x02\x02\x02\u0346" +
59904
+ "\u0349\x03\x02\x02\x02\u0347\u0345\x03\x02\x02\x02\u0347\u0348\x03\x02" +
59905
+ "\x02\x02\u0348\x81\x03\x02\x02\x02\u0349\u0347\x03\x02\x02\x02\u034A\u034B" +
59906
+ "\bB\x01\x02\u034B\u0352\x05\x84C\x02\u034C\u034D\x05N(\x02\u034D\u034E" +
59907
+ "\x07\x04\x02\x02\u034E\u034F\x05^0\x02\u034F\u0350\x07\x05\x02\x02\u0350" +
59908
+ "\u0352\x03\x02\x02\x02\u0351\u034A\x03\x02\x02\x02\u0351\u034C\x03\x02" +
59909
+ "\x02\x02\u0352\u0358\x03\x02\x02\x02\u0353\u0354\f\x04\x02\x02\u0354\u0355" +
59910
+ "\x07\x1B\x02\x02\u0355\u0357\x05\x84C\x02\u0356\u0353\x03\x02\x02\x02" +
59911
+ "\u0357\u035A\x03\x02\x02\x02\u0358\u0356\x03\x02\x02\x02\u0358\u0359\x03" +
59912
+ "\x02\x02\x02\u0359\x83\x03\x02\x02\x02\u035A\u0358\x03\x02\x02\x02\u035B" +
59913
+ "\u035C\bC\x01\x02\u035C\u035D\x05\x86D\x02\u035D\u0362\x03\x02\x02\x02" +
59914
+ "\u035E\u035F\f\x03\x02\x02\u035F\u0361\x07Q\x02\x02\u0360\u035E\x03\x02" +
59915
+ "\x02\x02\u0361\u0364\x03\x02\x02\x02\u0362\u0360\x03\x02\x02\x02\u0362" +
59916
+ "\u0363\x03\x02\x02\x02\u0363\x85\x03\x02\x02\x02\u0364\u0362\x03\x02\x02" +
59917
+ "\x02\u0365\u0369\x05\x88E\x02\u0366\u0367\t\x0F\x02\x02\u0367\u0369\x05" +
59918
+ "\x86D\x02\u0368\u0365\x03\x02\x02\x02\u0368\u0366\x03\x02\x02\x02\u0369" +
59919
+ "\x87\x03\x02\x02\x02\u036A\u037D\x050\x19\x02\u036B\u037D\x05J&\x02\u036C" +
59920
+ "\u036D\x07U\x02\x02\u036D\u037D\x05N(\x02\u036E\u036F\x07V\x02\x02\u036F" +
59921
+ "\u037D\x05N(\x02\u0370\u037D\x07W\x02\x02\u0371\u0372\x07\v\x02\x02\u0372" +
59922
+ "\u0373\x05V,\x02\u0373\u0374\x05F$\x02\u0374\u0375\x07\f\x02\x02\u0375" +
59923
+ "\u037D\x03\x02\x02\x02\u0376\u0377\x07\x1D\x02\x02\u0377\u0378\x05`1\x02" +
59924
+ "\u0378\u0379\x07\x1E\x02\x02\u0379\u037D\x03\x02\x02\x02\u037A\u037D\x05" +
59925
+ "D#\x02\u037B\u037D\x05\x8EH\x02\u037C\u036A\x03\x02\x02\x02\u037C\u036B" +
59926
+ "\x03\x02\x02\x02\u037C\u036C\x03\x02\x02\x02\u037C\u036E\x03\x02\x02\x02" +
59927
+ "\u037C\u0370\x03\x02\x02\x02\u037C\u0371\x03\x02\x02\x02\u037C\u0376\x03" +
59928
+ "\x02\x02\x02\u037C\u037A\x03\x02\x02\x02\u037C\u037B\x03\x02\x02\x02\u037D" +
59929
+ "\x89\x03\x02\x02\x02\u037E\u0384\x05J&\x02\u037F\u0380\x05J&\x02\u0380" +
59930
+ "\u0381\x07\\\x02\x02\u0381\u0382\x05\x8AF\x02\u0382\u0384\x03\x02\x02" +
59931
+ "\x02\u0383\u037E\x03\x02\x02\x02\u0383\u037F\x03\x02\x02\x02\u0384\x8B" +
59932
+ "\x03\x02\x02\x02\u0385\u0386\x05\x8EH\x02\u0386\x8D\x03\x02\x02\x02\u0387" +
59933
+ "\u0388\x07X\x02\x02\u0388\x8F\x03\x02\x02\x02\u0389\u038A\x07Y\x02\x02" +
59934
+ "\u038A\u038B\x05N(\x02\u038B\u038D\x05\x9EP\x02\u038C\u038E\x05,\x17\x02" +
59935
+ "\u038D\u038C\x03\x02\x02\x02\u038D\u038E\x03\x02\x02\x02\u038E\x91\x03" +
59936
+ "\x02\x02\x02\u038F\u0390\x05\x1A\x0E\x02\u0390\x93\x03\x02\x02\x02\u0391" +
59937
+ "\u0392\x07Z\x02\x02\u0392\u0393\x05`1\x02\u0393\x95\x03\x02\x02\x02\u0394" +
59938
+ "\u0395\x07[\x02\x02\u0395\u0396\x05N(\x02\u0396\u0397\x07)\x02\x02\u0397" +
59939
+ "\u0398\x05`1\x02\u0398\u0399\x07\"\x02\x02\u0399\u039A\x05\x9EP\x02\u039A" +
59940
+ "\x97\x03\x02\x02\x02\u039B\u039C\x05N(\x02\u039C\u039D\x07\x18\x02\x02" +
59941
+ "\u039D\u039E\x05\x8AF\x02\u039E\u039F\x07a\x02\x02\u039F\u03A0\x05`1\x02" +
59942
+ "\u03A0\x99\x03\x02\x02\x02\u03A1\u03A7\x05\x9CO\x02\u03A2\u03A3\x05\x9C" +
59943
+ "O\x02\u03A3\u03A4\x07k\x02\x02\u03A4\u03A5\x05\x9AN\x02\u03A5\u03A7\x03" +
59944
+ "\x02\x02\x02\u03A6\u03A1\x03\x02\x02\x02\u03A6\u03A2\x03\x02\x02\x02\u03A7" +
59945
+ "\x9B\x03\x02\x02\x02\u03A8\u03A9\x07m\x02\x02\u03A9\x9D\x03\x02\x02\x02" +
59946
+ "\u03AA\u03AE\x07\v\x02\x02\u03AB\u03AD\x05\xA2R\x02\u03AC\u03AB\x03\x02" +
59947
+ "\x02\x02\u03AD\u03B0\x03\x02\x02\x02\u03AE\u03AC\x03\x02\x02\x02\u03AE" +
59948
+ "\u03AF\x03\x02\x02\x02\u03AF\u03B1\x03\x02\x02\x02\u03B0\u03AE\x03\x02" +
59949
+ "\x02\x02\u03B1\u03B7\x07\f\x02\x02\u03B2\u03B4\x07$\x02\x02\u03B3\u03B2" +
59950
+ "\x03\x02\x02\x02\u03B3\u03B4\x03\x02\x02\x02\u03B4\u03B5\x03\x02\x02\x02" +
59951
+ "\u03B5\u03B7\x05J&\x02\u03B6\u03AA\x03\x02\x02\x02\u03B6\u03B3\x03\x02" +
59952
+ "\x02\x02\u03B7\x9F\x03\x02\x02\x02\u03B8\u03B9\x07V\x02\x02\u03B9\u03BE" +
59953
+ "\x05N(\x02\u03BA\u03BE\x05\x9CO\x02\u03BB\u03BC\x07(\x02\x02\u03BC\u03BE" +
59954
+ "\x05\x9CO\x02\u03BD\u03B8\x03\x02\x02\x02\u03BD\u03BA\x03\x02\x02\x02" +
59955
+ "\u03BD\u03BB\x03\x02\x02\x02\u03BE\xA1\x03\x02\x02\x02\u03BF\u03C0\x05" +
59956
+ "\xA4S\x02\u03C0\u03C1\x05@!\x02\u03C1\u03C2\x05\xA6T\x02\u03C2\u03C7\x03" +
59957
+ "\x02\x02\x02\u03C3\u03C4\x07g\x02\x02\u03C4\u03C7\x05\xA4S\x02\u03C5\u03C7" +
59958
+ "\x05J&\x02\u03C6\u03BF\x03\x02\x02\x02\u03C6\u03C3\x03\x02\x02\x02\u03C6" +
59959
+ "\u03C5\x03\x02\x02\x02\u03C7\xA3\x03\x02\x02\x02\u03C8\u03C9\x07L\x02" +
59960
+ "\x02\u03C9\u03D3\x05J&\x02\u03CA\u03D3\x05J&\x02\u03CB\u03CE\x05\xA0Q" +
59961
+ "\x02\u03CC\u03CD\x07\x1B\x02\x02\u03CD\u03CF\x05J&\x02\u03CE\u03CC\x03" +
59962
+ "\x02\x02\x02\u03CF\u03D0\x03\x02\x02\x02\u03D0\u03CE\x03\x02\x02\x02\u03D0" +
59963
+ "\u03D1\x03\x02\x02\x02\u03D1\u03D3\x03\x02\x02\x02\u03D2\u03C8\x03\x02" +
59964
+ "\x02\x02\u03D2\u03CA\x03\x02\x02\x02\u03D2\u03CB\x03\x02\x02\x02\u03D3" +
59965
+ "\xA5\x03\x02\x02\x02\u03D4\u03D5\bT\x01\x02\u03D5\u03DB\x05\xA8U\x02\u03D6" +
59966
+ "\u03D7\x07\x1D\x02\x02\u03D7\u03D8\x05\xA6T\x02\u03D8\u03D9\x07\x1E\x02" +
59967
+ "\x02\u03D9\u03DB\x03\x02\x02\x02\u03DA\u03D4\x03\x02\x02\x02\u03DA\u03D6" +
59968
+ "\x03\x02\x02\x02\u03DB\u03E1\x03\x02\x02\x02\u03DC\u03DD\f\x04\x02\x02" +
59969
+ "\u03DD\u03DE\x07\x0F\x02\x02\u03DE\u03E0\x05\xA8U\x02\u03DF\u03DC\x03" +
59970
+ "\x02\x02\x02\u03E0\u03E3\x03\x02\x02\x02\u03E1\u03DF\x03\x02\x02\x02\u03E1" +
59971
+ "\u03E2\x03\x02\x02\x02\u03E2\xA7\x03\x02\x02\x02\u03E3\u03E1\x03\x02\x02" +
59972
+ "\x02\u03E4\u03E5\bU\x01\x02\u03E5\u03E6\x07\x1D\x02\x02\u03E6\u03E7\x05" +
59973
+ "\xA8U\x02\u03E7\u03E8\x07\x1E\x02\x02\u03E8\u03EB\x03\x02\x02\x02\u03E9" +
59974
+ "\u03EB\x05\xAAV\x02\u03EA\u03E4\x03\x02\x02\x02\u03EA\u03E9\x03\x02\x02" +
59975
+ "\x02\u03EB\u03F1\x03\x02\x02\x02\u03EC\u03ED\f\x04\x02\x02\u03ED\u03EE" +
59976
+ "\t\x10\x02\x02\u03EE\u03F0\x05\xAAV\x02\u03EF\u03EC\x03\x02\x02\x02\u03F0" +
59977
+ "\u03F3\x03\x02\x02\x02\u03F1\u03EF\x03\x02\x02\x02\u03F1\u03F2\x03\x02" +
59978
+ "\x02\x02\u03F2\xA9\x03\x02\x02\x02\u03F3\u03F1\x03\x02\x02\x02\u03F4\u03FB" +
59979
+ "\x05\xA0Q\x02\u03F5\u03FB\x05J&\x02\u03F6\u03F7\x07\x1D\x02\x02\u03F7" +
59980
+ "\u03F8\x05\xA6T\x02\u03F8\u03F9\x07\x1E\x02\x02\u03F9\u03FB\x03\x02\x02" +
59981
+ "\x02\u03FA\u03F4\x03\x02\x02\x02\u03FA\u03F5\x03\x02\x02\x02\u03FA\u03F6" +
59982
+ "\x03\x02\x02\x02\u03FB\xAB\x03\x02\x02\x02x\xAE\xB3\xB7\xC1\xC7\xCD\xD0" +
59606
59983
  "\xD8\xDC\xE2\xE4\xF7\xFA\xFD\u0100\u0105\u0109\u010D\u0117\u011A\u0123" +
59607
59984
  "\u0128\u012D\u0132\u0137\u0144\u0148\u014C\u0155\u015A\u015D\u0161\u0168" +
59608
59985
  "\u016D\u0170\u0174\u0179\u017D\u0180\u0184\u018A\u018E\u0196\u019F\u01A3" +
59609
- "\u01A6\u01AF\u01B2\u01B9\u01BD\u01C2\u01CF\u01D2\u01D6\u01DF\u01E3\u01EC" +
59610
- "\u01F0\u01FA\u0205\u0209\u020E\u021A\u0222\u0228\u022C\u0233\u0239\u0240" +
59611
- "\u0243\u024C\u0253\u025A\u0261\u0268\u026F\u0276\u027D\u028A\u028F\u0299" +
59612
- "\u02A4\u02AF\u02B8\u02BA\u02C4\u02D8\u02E9\u02F0\u02F7\u02FD\u0307\u030D" +
59613
- "\u0317\u0322\u032E\u0339\u0346\u0350\u0357\u0361\u0367\u037B\u0382\u038C" +
59614
- "\u03A5\u03AD\u03B2\u03B5\u03BC\u03C5\u03CF\u03D1\u03D9\u03E0\u03E9\u03F0" +
59615
- "\u03F9";
59986
+ "\u01A6\u01AF\u01B3\u01BA\u01BE\u01C3\u01D0\u01D3\u01D7\u01E0\u01E4\u01ED" +
59987
+ "\u01F1\u01FB\u0206\u020A\u020F\u021B\u0223\u0229\u022D\u0234\u023A\u0241" +
59988
+ "\u0244\u024D\u0254\u025B\u0262\u0269\u0270\u0277\u027E\u028B\u0290\u029A" +
59989
+ "\u02A5\u02B0\u02B9\u02BB\u02C5\u02D9\u02EA\u02F1\u02F8\u02FE\u0308\u030E" +
59990
+ "\u0318\u0323\u032F\u033A\u0347\u0351\u0358\u0362\u0368\u037C\u0383\u038D" +
59991
+ "\u03A6\u03AE\u03B3\u03B6\u03BD\u03C6\u03D0\u03D2\u03DA\u03E1\u03EA\u03F1" +
59992
+ "\u03FA";
59616
59993
  ForgeParser._serializedATN = Utils.join([
59617
59994
  ForgeParser._serializedATNSegment0,
59618
59995
  ForgeParser._serializedATNSegment1,
@@ -59763,7 +60140,7 @@ class ImportDeclContext extends ParserRuleContext_1.ParserRuleContext {
59763
60140
  name() {
59764
60141
  return this.tryGetRuleContext(0, NameContext);
59765
60142
  }
59766
- FILE_PATH_TOK() { return this.tryGetToken(ForgeParser.FILE_PATH_TOK, 0); }
60143
+ STRING_TOK() { return this.tryGetToken(ForgeParser.STRING_TOK, 0); }
59767
60144
  constructor(parent, invokingState) {
59768
60145
  super(parent, invokingState);
59769
60146
  }
@@ -60601,6 +60978,7 @@ class ConstContext extends ParserRuleContext_1.ParserRuleContext {
60601
60978
  return this.tryGetRuleContext(0, NumberContext);
60602
60979
  }
60603
60980
  MINUS_TOK() { return this.tryGetToken(ForgeParser.MINUS_TOK, 0); }
60981
+ STRING_TOK() { return this.tryGetToken(ForgeParser.STRING_TOK, 0); }
60604
60982
  constructor(parent, invokingState) {
60605
60983
  super(parent, invokingState);
60606
60984
  }
@@ -61216,7 +61594,7 @@ class OptionDeclContext extends ParserRuleContext_1.ParserRuleContext {
61216
61594
  return this.getRuleContext(i, QualNameContext);
61217
61595
  }
61218
61596
  }
61219
- FILE_PATH_TOK() { return this.tryGetToken(ForgeParser.FILE_PATH_TOK, 0); }
61597
+ STRING_TOK() { return this.tryGetToken(ForgeParser.STRING_TOK, 0); }
61220
61598
  number() {
61221
61599
  return this.tryGetRuleContext(0, NumberContext);
61222
61600
  }
@@ -63333,6 +63711,11 @@ class SimpleGraphQueryEvaluator {
63333
63711
  // underlying IDataInstance -- callers must signal that themselves.
63334
63712
  this.cachedEvaluator = null;
63335
63713
  this.cachedEvaluatorDatum = null;
63714
+ // Diagnostics from the most recent evaluateExpression call. Kept here rather
63715
+ // than read back off the evaluator, because a failed evaluation discards the
63716
+ // evaluator — and a query that warns and *then* errors is exactly when the
63717
+ // warning is most worth keeping.
63718
+ this.lastDiagnostics = [];
63336
63719
  this.datum = datum;
63337
63720
  }
63338
63721
  /**
@@ -63358,6 +63741,24 @@ class SimpleGraphQueryEvaluator {
63358
63741
  //////// This is empty on parse error? //TODO//////
63359
63742
  return tree;
63360
63743
  }
63744
+ /**
63745
+ * Evaluate `forgeExpr` and return both its value and any diagnostics raised
63746
+ * along the way.
63747
+ *
63748
+ * Diagnostics are advisory and never change the value — today the only kind
63749
+ * is an unresolved name, which evaluates to the empty set. Consumers should
63750
+ * surface them to whoever authored the query; see {@link Diagnostic}.
63751
+ *
63752
+ * Note that an unresolved name is a warning rather than an error on purpose.
63753
+ * An instance carries only populated types and relations, so a sig that is
63754
+ * empty here looks exactly like a typo, and a sig can empty out between
63755
+ * frames of one trace. Deciding which it is needs context this library does
63756
+ * not have.
63757
+ */
63758
+ evaluateExpressionWithDiagnostics(forgeExpr) {
63759
+ const value = this.evaluateExpression(forgeExpr);
63760
+ return { value, diagnostics: this.lastDiagnostics };
63761
+ }
63361
63762
  evaluateExpression(forgeExpr) {
63362
63763
  // Check cache first
63363
63764
  let tree;
@@ -63373,6 +63774,7 @@ class SimpleGraphQueryEvaluator {
63373
63774
  }
63374
63775
  catch (e) {
63375
63776
  // if we can't parse the expression, we return an error
63777
+ this.lastDiagnostics = []; // nothing was evaluated
63376
63778
  return {
63377
63779
  error: new Error(`Error parsing expression "${forgeExpr}"`)
63378
63780
  };
@@ -63386,12 +63788,20 @@ class SimpleGraphQueryEvaluator {
63386
63788
  this.cachedEvaluatorDatum = this.datum;
63387
63789
  }
63388
63790
  const evaluator = this.cachedEvaluator;
63791
+ // Diagnostics describe this evaluation, not the whole life of the reused
63792
+ // evaluator, so clear whatever the previous call left behind.
63793
+ evaluator.resetDiagnostics();
63389
63794
  try {
63390
63795
  let result = evaluator.visit(tree);
63796
+ this.lastDiagnostics = evaluator.getDiagnostics();
63391
63797
  // ensure we're visiting an ExprContext
63392
63798
  return result;
63393
63799
  }
63394
63800
  catch (error) {
63801
+ // Capture diagnostics BEFORE discarding the evaluator. A query that
63802
+ // warns about an unresolved name and then fails for an unrelated reason
63803
+ // should still surface the warning.
63804
+ this.lastDiagnostics = evaluator.getDiagnostics();
63395
63805
  // The visit threw mid-traversal, so the evaluator's transient state
63396
63806
  // (environment stack) may be inconsistent. Discard the cached
63397
63807
  // evaluator so the next call rebuilds from a clean slate. The