feelin 4.3.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.
Files changed (114) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +6 -0
  3. data/.rspec +2 -0
  4. data/CHANGELOG.md +10 -0
  5. data/Gemfile +3 -0
  6. data/LICENSE.txt +21 -0
  7. data/README.md +43 -0
  8. data/feelin.gemspec +22 -0
  9. data/lib/feelin/js/node_modules/.package-lock.json +67 -0
  10. data/lib/feelin/js/node_modules/@lezer/common/LICENSE +21 -0
  11. data/lib/feelin/js/node_modules/@lezer/common/README.md +14 -0
  12. data/lib/feelin/js/node_modules/@lezer/common/dist/index.cjs +2181 -0
  13. data/lib/feelin/js/node_modules/@lezer/common/dist/index.d.cts +1137 -0
  14. data/lib/feelin/js/node_modules/@lezer/common/dist/index.d.ts +1137 -0
  15. data/lib/feelin/js/node_modules/@lezer/common/dist/index.js +2168 -0
  16. data/lib/feelin/js/node_modules/@lezer/common/package.json +32 -0
  17. data/lib/feelin/js/node_modules/@lezer/highlight/LICENSE +21 -0
  18. data/lib/feelin/js/node_modules/@lezer/highlight/README.md +14 -0
  19. data/lib/feelin/js/node_modules/@lezer/highlight/dist/index.cjs +915 -0
  20. data/lib/feelin/js/node_modules/@lezer/highlight/dist/index.d.cts +621 -0
  21. data/lib/feelin/js/node_modules/@lezer/highlight/dist/index.d.ts +623 -0
  22. data/lib/feelin/js/node_modules/@lezer/highlight/dist/index.js +904 -0
  23. data/lib/feelin/js/node_modules/@lezer/highlight/package.json +31 -0
  24. data/lib/feelin/js/node_modules/@lezer/lr/LICENSE +21 -0
  25. data/lib/feelin/js/node_modules/@lezer/lr/README.md +25 -0
  26. data/lib/feelin/js/node_modules/@lezer/lr/dist/constants.d.ts +45 -0
  27. data/lib/feelin/js/node_modules/@lezer/lr/dist/constants.js +5 -0
  28. data/lib/feelin/js/node_modules/@lezer/lr/dist/index.cjs +1890 -0
  29. data/lib/feelin/js/node_modules/@lezer/lr/dist/index.d.cts +303 -0
  30. data/lib/feelin/js/node_modules/@lezer/lr/dist/index.d.ts +303 -0
  31. data/lib/feelin/js/node_modules/@lezer/lr/dist/index.js +1883 -0
  32. data/lib/feelin/js/node_modules/@lezer/lr/package.json +32 -0
  33. data/lib/feelin/js/node_modules/feelin/LICENSE +21 -0
  34. data/lib/feelin/js/node_modules/feelin/README.md +65 -0
  35. data/lib/feelin/js/node_modules/feelin/dist/builtins.d.ts +355 -0
  36. data/lib/feelin/js/node_modules/feelin/dist/index.cjs +2072 -0
  37. data/lib/feelin/js/node_modules/feelin/dist/index.cjs.map +1 -0
  38. data/lib/feelin/js/node_modules/feelin/dist/index.d.ts +3 -0
  39. data/lib/feelin/js/node_modules/feelin/dist/index.esm.js +2063 -0
  40. data/lib/feelin/js/node_modules/feelin/dist/index.esm.js.map +1 -0
  41. data/lib/feelin/js/node_modules/feelin/dist/interpreter.d.ts +26 -0
  42. data/lib/feelin/js/node_modules/feelin/dist/parser.d.ts +4 -0
  43. data/lib/feelin/js/node_modules/feelin/dist/temporal.d.ts +6 -0
  44. data/lib/feelin/js/node_modules/feelin/dist/types.d.ts +35 -0
  45. data/lib/feelin/js/node_modules/feelin/dist/utils.d.ts +12 -0
  46. data/lib/feelin/js/node_modules/feelin/package.json +63 -0
  47. data/lib/feelin/js/node_modules/lezer-feel/LICENSE +21 -0
  48. data/lib/feelin/js/node_modules/lezer-feel/README.md +94 -0
  49. data/lib/feelin/js/node_modules/lezer-feel/dist/index.cjs +1328 -0
  50. data/lib/feelin/js/node_modules/lezer-feel/dist/index.cjs.map +1 -0
  51. data/lib/feelin/js/node_modules/lezer-feel/dist/index.d.ts +32 -0
  52. data/lib/feelin/js/node_modules/lezer-feel/dist/index.js +1323 -0
  53. data/lib/feelin/js/node_modules/lezer-feel/dist/index.js.map +1 -0
  54. data/lib/feelin/js/node_modules/lezer-feel/package.json +61 -0
  55. data/lib/feelin/js/node_modules/luxon/LICENSE.md +7 -0
  56. data/lib/feelin/js/node_modules/luxon/README.md +55 -0
  57. data/lib/feelin/js/node_modules/luxon/build/amd/luxon.js +8623 -0
  58. data/lib/feelin/js/node_modules/luxon/build/amd/luxon.js.map +1 -0
  59. data/lib/feelin/js/node_modules/luxon/build/cjs-browser/luxon.js +8621 -0
  60. data/lib/feelin/js/node_modules/luxon/build/cjs-browser/luxon.js.map +1 -0
  61. data/lib/feelin/js/node_modules/luxon/build/es6/luxon.js +8011 -0
  62. data/lib/feelin/js/node_modules/luxon/build/es6/luxon.js.map +1 -0
  63. data/lib/feelin/js/node_modules/luxon/build/global/luxon.js +8626 -0
  64. data/lib/feelin/js/node_modules/luxon/build/global/luxon.js.map +1 -0
  65. data/lib/feelin/js/node_modules/luxon/build/global/luxon.min.js +1 -0
  66. data/lib/feelin/js/node_modules/luxon/build/global/luxon.min.js.map +1 -0
  67. data/lib/feelin/js/node_modules/luxon/build/node/luxon.js +7679 -0
  68. data/lib/feelin/js/node_modules/luxon/build/node/luxon.js.map +1 -0
  69. data/lib/feelin/js/node_modules/luxon/package.json +87 -0
  70. data/lib/feelin/js/node_modules/luxon/src/datetime.js +2566 -0
  71. data/lib/feelin/js/node_modules/luxon/src/duration.js +990 -0
  72. data/lib/feelin/js/node_modules/luxon/src/errors.js +61 -0
  73. data/lib/feelin/js/node_modules/luxon/src/impl/conversions.js +206 -0
  74. data/lib/feelin/js/node_modules/luxon/src/impl/diff.js +95 -0
  75. data/lib/feelin/js/node_modules/luxon/src/impl/digits.js +90 -0
  76. data/lib/feelin/js/node_modules/luxon/src/impl/english.js +233 -0
  77. data/lib/feelin/js/node_modules/luxon/src/impl/formats.js +176 -0
  78. data/lib/feelin/js/node_modules/luxon/src/impl/formatter.js +409 -0
  79. data/lib/feelin/js/node_modules/luxon/src/impl/invalid.js +14 -0
  80. data/lib/feelin/js/node_modules/luxon/src/impl/locale.js +554 -0
  81. data/lib/feelin/js/node_modules/luxon/src/impl/regexParser.js +335 -0
  82. data/lib/feelin/js/node_modules/luxon/src/impl/tokenParser.js +505 -0
  83. data/lib/feelin/js/node_modules/luxon/src/impl/util.js +316 -0
  84. data/lib/feelin/js/node_modules/luxon/src/impl/zoneUtil.js +34 -0
  85. data/lib/feelin/js/node_modules/luxon/src/info.js +205 -0
  86. data/lib/feelin/js/node_modules/luxon/src/interval.js +665 -0
  87. data/lib/feelin/js/node_modules/luxon/src/luxon.js +26 -0
  88. data/lib/feelin/js/node_modules/luxon/src/package.json +4 -0
  89. data/lib/feelin/js/node_modules/luxon/src/settings.js +180 -0
  90. data/lib/feelin/js/node_modules/luxon/src/zone.js +97 -0
  91. data/lib/feelin/js/node_modules/luxon/src/zones/IANAZone.js +231 -0
  92. data/lib/feelin/js/node_modules/luxon/src/zones/fixedOffsetZone.js +150 -0
  93. data/lib/feelin/js/node_modules/luxon/src/zones/invalidZone.js +53 -0
  94. data/lib/feelin/js/node_modules/luxon/src/zones/systemZone.js +61 -0
  95. data/lib/feelin/js/node_modules/min-dash/LICENSE +21 -0
  96. data/lib/feelin/js/node_modules/min-dash/README.md +38 -0
  97. data/lib/feelin/js/node_modules/min-dash/dist/array.d.ts +12 -0
  98. data/lib/feelin/js/node_modules/min-dash/dist/collection.d.ts +174 -0
  99. data/lib/feelin/js/node_modules/min-dash/dist/fn.d.ts +37 -0
  100. data/lib/feelin/js/node_modules/min-dash/dist/index.cjs +910 -0
  101. data/lib/feelin/js/node_modules/min-dash/dist/index.d.ts +5 -0
  102. data/lib/feelin/js/node_modules/min-dash/dist/index.esm.js +872 -0
  103. data/lib/feelin/js/node_modules/min-dash/dist/lang.d.ts +29 -0
  104. data/lib/feelin/js/node_modules/min-dash/dist/min-dash.js +916 -0
  105. data/lib/feelin/js/node_modules/min-dash/dist/min-dash.min.js +1 -0
  106. data/lib/feelin/js/node_modules/min-dash/dist/object.d.ts +112 -0
  107. data/lib/feelin/js/node_modules/min-dash/package.json +72 -0
  108. data/lib/feelin/js/package-lock.json +72 -0
  109. data/lib/feelin/js/package.json +5 -0
  110. data/lib/feelin/version.rb +3 -0
  111. data/lib/feelin.rb +63 -0
  112. data/spec/feelin/feelin_spec.rb +38 -0
  113. data/spec/spec_helper.rb +2 -0
  114. metadata +198 -0
@@ -0,0 +1,1328 @@
1
+ 'use strict';
2
+
3
+ var lr = require('@lezer/lr');
4
+ var minDash = require('min-dash');
5
+ var highlight = require('@lezer/highlight');
6
+
7
+ // This file was generated by lezer-generator. You probably shouldn't edit it.
8
+ const propertyIdentifier = 121,
9
+ identifier = 122,
10
+ nameIdentifier = 123,
11
+ insertSemi = 124,
12
+ expression0 = 128,
13
+ ForExpression = 4,
14
+ forExpressionStart = 131,
15
+ ForInExpression = 7,
16
+ Name = 8,
17
+ Identifier = 9,
18
+ AdditionalIdentifier = 10,
19
+ forExpressionBodyStart = 139,
20
+ IfExpression = 19,
21
+ ifExpressionStart = 140,
22
+ QuantifiedExpression = 23,
23
+ quantifiedExpressionStart = 141,
24
+ QuantifiedInExpression = 27,
25
+ PositiveUnaryTest = 37,
26
+ ArithmeticExpression = 41,
27
+ arithmeticPlusStart = 145,
28
+ arithmeticTimesStart = 146,
29
+ arithmeticExpStart = 147,
30
+ arithmeticUnaryStart = 148,
31
+ VariableName = 47,
32
+ PathExpression = 68,
33
+ pathExpressionStart = 154,
34
+ FilterExpression = 70,
35
+ filterExpressionStart = 155,
36
+ FunctionInvocation = 72,
37
+ functionInvocationStart = 156,
38
+ ParameterName = 76,
39
+ nil = 161,
40
+ NumericLiteral = 79,
41
+ StringLiteral = 80,
42
+ BooleanLiteral = 81,
43
+ listStart = 167,
44
+ List = 89,
45
+ FunctionDefinition = 90,
46
+ functionDefinitionStart = 169,
47
+ Context = 97,
48
+ contextStart = 171,
49
+ ContextEntry = 98,
50
+ PropertyName = 100,
51
+ PropertyIdentifier = 101;
52
+
53
+ /* global console,process */
54
+
55
+
56
+ // @ts-expect-error env access
57
+ const LOG_PARSE = typeof process != 'undefined' && process.env && /\bfparse(:dbg)?\b/.test(process.env.LOG);
58
+
59
+ // @ts-expect-error env access
60
+ const LOG_PARSE_DEBUG = typeof process != 'undefined' && process.env && /\bfparse:dbg\b/.test(process.env.LOG);
61
+
62
+ // @ts-expect-error env access
63
+ const LOG_VARS = typeof process != 'undefined' && process.env && /\bcontext\b/.test(process.env.LOG);
64
+
65
+ const spaceChars = [
66
+ 9, 11, 12, 32, 133, 160,
67
+ 5760, 8192, 8193, 8194, 8195, 8196, 8197, 8198,
68
+ 8199, 8200, 8201, 8202, 8232, 8233, 8239, 8287, 12288
69
+ ];
70
+
71
+ const newlineChars = chars('\n\r');
72
+
73
+ const asterix = '*'.charCodeAt(0);
74
+
75
+ const additionalNameChars = chars("'./-+*^");
76
+
77
+ /**
78
+ * @typedef { VariableContext | any } ContextValue
79
+ */
80
+
81
+ /**
82
+ * @param { string } str
83
+ * @return { number[] }
84
+ */
85
+ function chars(str) {
86
+ return Array.from(str).map(s => s.charCodeAt(0));
87
+ }
88
+
89
+ /**
90
+ * @param { number } ch
91
+ * @return { boolean }
92
+ */
93
+ function isStartChar(ch) {
94
+ return (
95
+ ch === 63 // ?
96
+ ) || (
97
+ ch >= 65 && ch <= 90 // A-Z
98
+ ) || (
99
+ ch === 95 // _
100
+ ) || (
101
+ ch >= 97 && ch <= 122 // a-z
102
+ ) || (
103
+ ch >= 0xC0 && ch <= 0xD6
104
+ ) || (
105
+ ch >= 0xD8 && ch <= 0xF6
106
+ ) || (
107
+ ch >= 0xF8 && ch <= 0x2FF
108
+ ) || (
109
+ ch >= 0x370 && ch <= 0x37D
110
+ ) || (
111
+ ch >= 0x37F && ch <= 0x1FFF
112
+ ) || (
113
+ ch >= 0x200C && ch <= 0x200D
114
+ ) || (
115
+ ch >= 0x2070 && ch <= 0x218F
116
+ ) || (
117
+ ch >= 0x2C00 && ch <= 0x2FEF
118
+ ) || (
119
+ ch >= 0x3001 && ch <= 0xD7FF
120
+ ) || (
121
+ ch >= 0xF900 && ch <= 0xFDCF
122
+ ) || (
123
+ ch >= 0xFDF0 && ch <= 0xFFFD
124
+ ) || (
125
+ ch >= 0xD800 && ch <= 0xDBFF // upper surrogate
126
+ ) || (
127
+ ch >= 0xDC00 && ch <= 0xDFFF // lower surrogate
128
+ );
129
+ }
130
+
131
+ /**
132
+ * @param { number } ch
133
+ * @return { boolean }
134
+ */
135
+ function isAdditional(ch) {
136
+ return additionalNameChars.includes(ch);
137
+ }
138
+
139
+ /**
140
+ * @param { number } ch
141
+ * @return { boolean }
142
+ */
143
+ function isPartChar(ch) {
144
+ return (
145
+ ch >= 48 && ch <= 57 // 0-9
146
+ ) || (
147
+ ch === 0xB7
148
+ ) || (
149
+ ch >= 0x0300 && ch <= 0x036F
150
+ ) || (
151
+ ch >= 0x203F && ch <= 0x2040
152
+ );
153
+ }
154
+
155
+ /**
156
+ * @param { number } ch
157
+ * @return { boolean }
158
+ */
159
+ function isSpace(ch) {
160
+ return spaceChars.includes(ch);
161
+ }
162
+
163
+ function indent(str, spaces) {
164
+ return spaces.concat(
165
+ str.split(/\n/g).join('\n' + spaces)
166
+ );
167
+ }
168
+
169
+ /**
170
+ * @param { import('@lezer/lr').InputStream } input
171
+ * @param { number } [offset]
172
+ *
173
+ * @return { { token: string, offset: number } | null }
174
+ */
175
+ function parseAdditionalSymbol(input, offset = 0) {
176
+
177
+ const next = input.peek(offset);
178
+
179
+ if (next === asterix && input.peek(offset + 1) === asterix) {
180
+
181
+ return {
182
+ offset: 2,
183
+ token: '**'
184
+ };
185
+ }
186
+
187
+ if (isAdditional(next)) {
188
+ return {
189
+ offset: 1,
190
+ token: String.fromCharCode(next)
191
+ };
192
+ }
193
+
194
+ return null;
195
+ }
196
+
197
+ /**
198
+ * @param { import('@lezer/lr').InputStream } input
199
+ * @param { number } [offset]
200
+ * @param { boolean } [namePart]
201
+ *
202
+ * @return { { token: string, offset: number } | null }
203
+ */
204
+ function parseIdentifier(input, offset = 0, namePart = false) {
205
+ for (let inside = false, chars = [], i = 0;; i++) {
206
+ const next = input.peek(offset + i);
207
+
208
+ if (isStartChar(next) || ((inside || namePart) && isPartChar(next))) {
209
+ if (!inside) {
210
+ inside = true;
211
+ }
212
+
213
+ chars.push(next);
214
+ } else {
215
+
216
+ if (chars.length) {
217
+ return {
218
+ token: String.fromCharCode(...chars),
219
+ offset: i
220
+ };
221
+ }
222
+
223
+ return null;
224
+ }
225
+ }
226
+ }
227
+
228
+ /**
229
+ * @param { import('@lezer/lr').InputStream } input
230
+ * @param { number } offset
231
+ *
232
+ * @return { { token: string, offset: number } | null }
233
+ */
234
+ function parseSpaces(input, offset) {
235
+
236
+ for (let inside = false, i = 0;; i++) {
237
+ let next = input.peek(offset + i);
238
+
239
+ if (isSpace(next)) {
240
+ if (!inside) {
241
+ inside = true;
242
+ }
243
+ } else {
244
+ if (inside) {
245
+ return {
246
+ token: ' ',
247
+ offset: i
248
+ };
249
+ }
250
+
251
+ return null;
252
+ }
253
+ }
254
+ }
255
+
256
+ /**
257
+ * Parse a name from the input and return the first match, if any.
258
+ *
259
+ * @param { import('@lezer/lr').InputStream } input
260
+ * @param { Variables } variables
261
+ *
262
+ * @return { { token: string, offset: number, term: number } | null }
263
+ */
264
+ function parseName(input, variables) {
265
+ const contextKeys = variables.contextKeys();
266
+
267
+ const start = variables.tokens;
268
+
269
+ for (let i = 0, tokens = [], nextMatch = null;;) {
270
+
271
+ const namePart = (start.length + tokens.length) > 0;
272
+ const maybeSpace = tokens.length > 0;
273
+
274
+ const match = (
275
+ parseIdentifier(input, i, namePart) ||
276
+ namePart && parseAdditionalSymbol(input, i) ||
277
+ maybeSpace && parseSpaces(input, i)
278
+ );
279
+
280
+ // match is required
281
+ if (!match) {
282
+ return nextMatch;
283
+ }
284
+
285
+ const {
286
+ token,
287
+ offset
288
+ } = match;
289
+
290
+ i += offset;
291
+
292
+ if (token === ' ') {
293
+ continue;
294
+ }
295
+
296
+ tokens = [ ...tokens, token ];
297
+
298
+ const name = [ ...start, ...tokens ].join(' ');
299
+
300
+ if (contextKeys.some(el => el === name)) {
301
+ const token = tokens[0];
302
+
303
+ nextMatch = {
304
+ token,
305
+ offset: token.length,
306
+ term: nameIdentifier
307
+ };
308
+ }
309
+
310
+ if (contextKeys.some(el => el.startsWith(name))) {
311
+ continue;
312
+ }
313
+
314
+ if (dateTimeIdentifiers.some(el => el === name)) {
315
+ const token = tokens[0];
316
+
317
+ // parse date time identifiers as normal
318
+ // identifiers to allow specialization to kick in
319
+ //
320
+ // cf. https://github.com/nikku/lezer-feel/issues/8
321
+ nextMatch = {
322
+ token,
323
+ offset: token.length,
324
+ term: identifier
325
+ };
326
+ }
327
+
328
+ if (dateTimeIdentifiers.some(el => el.startsWith(name))) {
329
+ continue;
330
+ }
331
+
332
+ return nextMatch;
333
+ }
334
+
335
+ }
336
+
337
+ const identifiersMap = {
338
+ [ identifier ]: 'identifier',
339
+ [ nameIdentifier ]: 'nameIdentifier'
340
+ };
341
+
342
+ const identifiers = new lr.ExternalTokenizer((input, stack) => {
343
+
344
+ LOG_PARSE_DEBUG && console.log('%s: T <identifier | nameIdentifier>', input.pos);
345
+
346
+ const nameMatch = parseName(input, stack.context);
347
+
348
+ const start = stack.context.tokens;
349
+
350
+ const match = nameMatch || parseIdentifier(input, 0, start.length > 0);
351
+
352
+ if (match) {
353
+ input.advance(match.offset);
354
+ input.acceptToken(nameMatch ? nameMatch.term : identifier);
355
+
356
+ LOG_PARSE && console.log('%s: MATCH <%s> <%s>', input.pos, nameMatch ? identifiersMap[nameMatch.term] : 'identifier', match.token);
357
+ }
358
+ }, { contextual: true });
359
+
360
+
361
+ const propertyIdentifiers = new lr.ExternalTokenizer((input, stack) => {
362
+
363
+ LOG_PARSE_DEBUG && console.log('%s: T <propertyIdentifier>', input.pos);
364
+
365
+ const start = stack.context.tokens;
366
+
367
+ const match = parseIdentifier(input, 0, start.length > 0);
368
+
369
+ if (match) {
370
+ input.advance(match.offset);
371
+ input.acceptToken(propertyIdentifier);
372
+
373
+ LOG_PARSE && console.log('%s: MATCH <propertyIdentifier> <%s>', input.pos, match.token);
374
+ }
375
+ });
376
+
377
+
378
+ const insertSemicolon = new lr.ExternalTokenizer((input, stack) => {
379
+
380
+ LOG_PARSE_DEBUG && console.log('%s: T <insertSemi>', input.pos);
381
+
382
+ let offset;
383
+ let insert = false;
384
+
385
+ for (offset = 0;; offset++) {
386
+ const char = input.peek(offset);
387
+
388
+ if (spaceChars.includes(char)) {
389
+ continue;
390
+ }
391
+
392
+ if (newlineChars.includes(char)) {
393
+ insert = true;
394
+ }
395
+
396
+ break;
397
+ }
398
+
399
+ if (insert) {
400
+
401
+ const identifier = parseIdentifier(input, offset + 1);
402
+ const spaces = parseSpaces(input, offset + 1);
403
+
404
+ if (spaces || identifier && /^(then|else|return|satisfies)$/.test(identifier.token)) {
405
+ return;
406
+ }
407
+
408
+ LOG_PARSE && console.log('%s: MATCH <insertSemi>', input.pos);
409
+ input.acceptToken(insertSemi);
410
+ }
411
+ });
412
+
413
+ const prefixedContextStarts = {
414
+ [ functionInvocationStart ]: 'FunctionInvocation',
415
+ [ filterExpressionStart ]: 'FilterExpression',
416
+ [ pathExpressionStart ]: 'PathExpression'
417
+ };
418
+
419
+ const contextStarts = {
420
+ [ contextStart ]: 'Context',
421
+ [ functionDefinitionStart ]: 'FunctionDefinition',
422
+ [ forExpressionStart ]: 'ForExpression',
423
+ [ listStart ]: 'List',
424
+ [ ifExpressionStart ]: 'IfExpression',
425
+ [ quantifiedExpressionStart ]: 'QuantifiedExpression'
426
+ };
427
+
428
+ const contextEnds = {
429
+ [ Context ]: 'Context',
430
+ [ FunctionDefinition ]: 'FunctionDefinition',
431
+ [ ForExpression ]: 'ForExpression',
432
+ [ List ]: 'List',
433
+ [ IfExpression ]: 'IfExpression',
434
+ [ QuantifiedExpression ]: 'QuantifiedExpression',
435
+ [ PathExpression ]: 'PathExpression',
436
+ [ FunctionInvocation ]: 'FunctionInvocation',
437
+ [ FilterExpression ]: 'FilterExpression',
438
+ [ ArithmeticExpression ]: 'ArithmeticExpression'
439
+ };
440
+
441
+ /**
442
+ * A simple producer that retrievs a value from
443
+ * a given context. Used to lazily take things.
444
+ */
445
+ class ValueProducer {
446
+
447
+ /**
448
+ * @param { Function } fn
449
+ */
450
+ constructor(fn) {
451
+ this.fn = fn;
452
+ }
453
+
454
+ get(variables) {
455
+ return this.fn(variables);
456
+ }
457
+
458
+ /**
459
+ * @param { Function } fn
460
+ *
461
+ * @return { ValueProducer }
462
+ */
463
+ static of(fn) {
464
+ return new ValueProducer(fn);
465
+ }
466
+
467
+ }
468
+
469
+ const dateTimeLiterals = {
470
+ 'date and time': 1,
471
+ 'date': 1,
472
+ 'time': 1,
473
+ 'duration': 1
474
+ };
475
+
476
+ const dateTimeIdentifiers = Object.keys(dateTimeLiterals);
477
+
478
+
479
+ /**
480
+ * A basic key-value store to hold context values.
481
+ */
482
+ class VariableContext {
483
+
484
+ /**
485
+ * Creates a new context from a JavaScript object.
486
+ *
487
+ * @param {any} [value]
488
+ */
489
+ constructor(value = {}) {
490
+
491
+ /**
492
+ * @protected
493
+ */
494
+ this.value = value;
495
+ }
496
+
497
+ /**
498
+ * Return all defined keys of the context.
499
+ *
500
+ * @returns {Array<string>} the keys of the context
501
+ */
502
+ getKeys() {
503
+ return Object.keys(this.value);
504
+ }
505
+
506
+ /**
507
+ * Returns the value of the given key.
508
+ *
509
+ * If the value represents a context itself, it should be wrapped in a
510
+ * context class.
511
+ *
512
+ * @param {String} key
513
+ * @returns {VariableContext|ValueProducer|null}
514
+ */
515
+ get(key) {
516
+ const result = this.value[key];
517
+
518
+ const constructor = /** @type { typeof VariableContext } */ (this.constructor);
519
+
520
+ if (constructor.isAtomic(result)) {
521
+ return result;
522
+ }
523
+
524
+ return constructor.of(result);
525
+ }
526
+
527
+ /**
528
+ * Creates a new context with the given key added.
529
+ *
530
+ * @param {String} key
531
+ * @param {any} value
532
+ *
533
+ * @returns {VariableContext} new context with the given key added
534
+ */
535
+ set(key, value) {
536
+
537
+ const constructor = /** @type { typeof VariableContext } */ (this.constructor);
538
+
539
+ return constructor.of({
540
+ ...this.value,
541
+ [key]: value
542
+ });
543
+ }
544
+
545
+ /**
546
+ * Non-destructively merge another context into this one,
547
+ * and return the result.
548
+ *
549
+ * @param {ContextValue} other
550
+ *
551
+ * @return {VariableContext}
552
+ */
553
+ merge(other) {
554
+ const constructor = /** @type { typeof VariableContext } */ (this.constructor);
555
+
556
+ return new constructor(
557
+ constructor.__merge(this.value, other)
558
+ );
559
+ }
560
+
561
+ /**
562
+ * Wether the given value is atomic. Non-atomic values need to be wrapped in a
563
+ * context Class.
564
+ *
565
+ * @param {any} value
566
+ * @returns {Boolean}
567
+ */
568
+ static isAtomic(value) {
569
+ return !value ||
570
+ value instanceof this ||
571
+ value instanceof ValueProducer ||
572
+ typeof value !== 'object';
573
+ }
574
+
575
+ /**
576
+ * Takes any number of Contexts and merges them into a single context.
577
+ *
578
+ * @param { ...VariableContext } contexts
579
+ * @returns { VariableContext }
580
+ */
581
+ static of(...contexts) {
582
+ return contexts.reduce((context, otherContext) => {
583
+ return context.merge(otherContext);
584
+ }, new this({}));
585
+ }
586
+
587
+ /**
588
+ * Returns the raw representation of the given context.
589
+ *
590
+ * @param {VariableContext | any} context
591
+ *
592
+ * @return {any}
593
+ */
594
+ static __unwrap(context) {
595
+ if (!context) {
596
+ return {};
597
+ }
598
+
599
+ if (context instanceof this) {
600
+ return context.value;
601
+ }
602
+
603
+ if (typeof context !== 'object') {
604
+ return {};
605
+ }
606
+
607
+ return { ...context };
608
+ }
609
+
610
+ /**
611
+ * Non-destructively merges two contexts (or their values)
612
+ * with each other, returning the result.
613
+ *
614
+ * @param {ContextValue} context
615
+ * @param {ContextValue} other
616
+ *
617
+ * @return {any}
618
+ */
619
+ static __merge(context, other) {
620
+
621
+ return minDash.reduce(this.__unwrap(other), (merged, value, key) => {
622
+ if (value instanceof ValueProducer) {
623
+
624
+ // keep value producers in tact
625
+ return {
626
+ ...merged,
627
+ [key]: value
628
+ };
629
+ }
630
+
631
+ value = this.__unwrap(value);
632
+
633
+ if (minDash.has(merged, key)) {
634
+ value = this.__merge(this.__unwrap(merged[key]), value);
635
+ }
636
+
637
+ return {
638
+ ...merged,
639
+ [key]: value
640
+ };
641
+ }, this.__unwrap(context));
642
+ }
643
+
644
+ }
645
+
646
+ class Variables {
647
+
648
+ /**
649
+ * @param { {
650
+ * name?: string,
651
+ * tokens?: string[],
652
+ * children?: Variables[],
653
+ * parent: Variables | null
654
+ * context: VariableContext,
655
+ * value?: any,
656
+ * raw?: any
657
+ * } } options
658
+ */
659
+ constructor({
660
+ name = 'Expressions',
661
+ tokens = [],
662
+ children = [],
663
+ parent = null,
664
+ context,
665
+ value,
666
+ raw
667
+ }) {
668
+ this.name = name;
669
+ this.tokens = tokens;
670
+ this.children = children;
671
+ this.parent = parent;
672
+ this.context = context;
673
+ this.value = value;
674
+ this.raw = raw;
675
+ }
676
+
677
+ enterScope(name) {
678
+
679
+ const childScope = this.of({
680
+ name,
681
+ parent: this
682
+ });
683
+
684
+ LOG_VARS && console.log('[%s] enter', childScope.path, childScope.context);
685
+
686
+ return childScope;
687
+ }
688
+
689
+ exitScope(str) {
690
+
691
+ if (!this.parent) {
692
+ LOG_VARS && console.log('[%s] NO exit %o\n%s', this.path, this.context, indent(str, ' '));
693
+
694
+ return this;
695
+ }
696
+
697
+ LOG_VARS && console.log('[%s] exit %o\n%s', this.path, this.context, indent(str, ' '));
698
+
699
+ return this.parent.pushChild(this);
700
+ }
701
+
702
+ token(part) {
703
+
704
+ LOG_VARS && console.log('[%s] token <%s> + <%s>', this.path, this.tokens.join(' '), part);
705
+
706
+ return this.assign({
707
+ tokens: [ ...this.tokens, part ]
708
+ });
709
+ }
710
+
711
+ literal(value) {
712
+
713
+ LOG_VARS && console.log('[%s] literal %o', this.path, value);
714
+
715
+ return this.pushChild(this.of({
716
+ name: 'Literal',
717
+ value
718
+ }));
719
+ }
720
+
721
+ /**
722
+ * Return computed scope value
723
+ *
724
+ * @return {any}
725
+ */
726
+ computedValue() {
727
+ for (let scope = this;;scope = last(scope.children)) {
728
+
729
+ if (!scope) {
730
+ return null;
731
+ }
732
+
733
+ if (scope.value) {
734
+ return scope.value;
735
+ }
736
+ }
737
+ }
738
+
739
+ contextKeys() {
740
+ return this.context.getKeys().map(normalizeContextKey);
741
+ }
742
+
743
+ get path() {
744
+ return this.parent?.path?.concat(' > ', this.name) || this.name;
745
+ }
746
+
747
+ /**
748
+ * Return value of variable.
749
+ *
750
+ * @param { string } variable
751
+ * @return { any } value
752
+ */
753
+ get(variable) {
754
+
755
+ const names = [ variable, variable && normalizeContextKey(variable) ];
756
+
757
+ const contextKey = this.context.getKeys().find(
758
+ key => names.includes(normalizeContextKey(key))
759
+ );
760
+
761
+ if (typeof contextKey === 'undefined') {
762
+ return undefined;
763
+ }
764
+
765
+ const val = this.context.get(contextKey);
766
+
767
+ if (val instanceof ValueProducer) {
768
+ return val.get(this);
769
+ } else {
770
+ return val;
771
+ }
772
+ }
773
+
774
+ resolveName() {
775
+
776
+ const variable = this.tokens.join(' ');
777
+ const tokens = [];
778
+
779
+ const parentScope = this.assign({
780
+ tokens
781
+ });
782
+
783
+ const variableScope = this.of({
784
+ name: 'VariableName',
785
+ parent: parentScope,
786
+ value: this.get(variable),
787
+ raw: variable
788
+ });
789
+
790
+ LOG_VARS && console.log('[%s] resolve name <%s=%s>', variableScope.path, variable, this.get(variable));
791
+
792
+ return parentScope.pushChild(variableScope);
793
+ }
794
+
795
+ pushChild(child) {
796
+
797
+ if (!child) {
798
+ return this;
799
+ }
800
+
801
+ const parent = this.assign({
802
+ children: [ ...this.children, child ]
803
+ });
804
+
805
+ child.parent = parent;
806
+
807
+ return parent;
808
+ }
809
+
810
+ pushChildren(children) {
811
+
812
+ /**
813
+ * @type {Variables}
814
+ */
815
+ let parent = this;
816
+
817
+ for (const child of children) {
818
+ parent = parent.pushChild(child);
819
+ }
820
+
821
+ return parent;
822
+ }
823
+
824
+ declareName() {
825
+
826
+ if (this.tokens.length === 0) {
827
+ throw Error('no tokens to declare name');
828
+ }
829
+
830
+ const variableName = this.tokens.join(' ');
831
+
832
+ LOG_VARS && console.log('[%s] declareName <%s>', this.path, variableName);
833
+
834
+ return this.assign({
835
+ tokens: []
836
+ }).pushChild(
837
+ this.of({
838
+ name: 'Name',
839
+ value: variableName
840
+ })
841
+ );
842
+ }
843
+
844
+ define(name, value) {
845
+
846
+ if (typeof name !== 'string') {
847
+ LOG_VARS && console.log('[%s] no define <%s=%s>', this.path, name, value);
848
+
849
+ return this;
850
+ }
851
+
852
+ LOG_VARS && console.log('[%s] define <%s=%s>', this.path, name, value);
853
+
854
+ const context = this.context.set(name, value);
855
+
856
+ return this.assign({
857
+ context
858
+ });
859
+ }
860
+
861
+ /**
862
+ * @param { Record<string, any> } [options]
863
+ *
864
+ * @return { Variables }
865
+ */
866
+ assign(options = {}) {
867
+
868
+ return Variables.of({
869
+ ...this,
870
+ ...options
871
+ });
872
+ }
873
+
874
+ /**
875
+ * @param { Record<string, any> } [options]
876
+ *
877
+ * @return { Variables }
878
+ */
879
+ of(options = {}) {
880
+
881
+ const defaultOptions = {
882
+ context: this.context,
883
+ parent: this.parent
884
+ };
885
+
886
+ return Variables.of({
887
+ ...defaultOptions,
888
+ ...options
889
+ });
890
+ }
891
+
892
+ /**
893
+ * @param { {
894
+ * name?: string,
895
+ * tokens?: string[],
896
+ * children?: Variables[],
897
+ * parent?: Variables | null
898
+ * context: VariableContext,
899
+ * value?: any,
900
+ * raw?: any
901
+ * } } options
902
+ *
903
+ * @return {Variables}
904
+ */
905
+ static of(options) {
906
+
907
+ const {
908
+ name,
909
+ tokens = [],
910
+ children = [],
911
+ parent = null,
912
+ context,
913
+ value,
914
+ raw
915
+ } = options;
916
+
917
+ if (!context) {
918
+ throw new Error('must provide <context>');
919
+ }
920
+
921
+ return new Variables({
922
+ name,
923
+ tokens: [ ...tokens ],
924
+ children: [ ...children ],
925
+ context,
926
+ parent,
927
+ value,
928
+ raw
929
+ });
930
+ }
931
+
932
+ }
933
+
934
+ /**
935
+ * @param { string } name
936
+ *
937
+ * @return { string } normalizedName
938
+ */
939
+ function normalizeContextKey(name) {
940
+ return name.replace(/\s*([./\-'+]|\*\*?)\s*/g, ' $1 ').replace(/\s{2,}/g, ' ').trim();
941
+ }
942
+
943
+ /**
944
+ * Wrap children of variables under the given named child.
945
+ *
946
+ * @param { Variables } variables
947
+ * @param { string } scopeName
948
+ * @param { string } code
949
+ * @return { Variables }
950
+ */
951
+ function wrap(variables, scopeName, code) {
952
+
953
+ const parts = variables.children.filter(c => c.name !== scopeName);
954
+ const children = variables.children.filter(c => c.name === scopeName);
955
+
956
+ const namePart = parts[0];
957
+ const valuePart = parts[Math.max(1, parts.length - 1)];
958
+
959
+ const name = namePart?.computedValue();
960
+ const value = valuePart?.computedValue() || null;
961
+
962
+ return variables
963
+ .assign({
964
+ children
965
+ })
966
+ .enterScope(scopeName)
967
+ .pushChildren(parts)
968
+ .exitScope(code)
969
+ .define(name, value);
970
+ }
971
+
972
+ /**
973
+ * @param { ContextValue } [context]
974
+ * @param { typeof VariableContext } [Context]
975
+ *
976
+ * @return { ContextTracker<Variables> }
977
+ */
978
+ function trackVariables(context = {}, Context = VariableContext) {
979
+
980
+ const start = Variables.of({
981
+ context: Context.of(context)
982
+ });
983
+
984
+ return new lr.ContextTracker({
985
+ start,
986
+ reduce(variables, term, stack, input) {
987
+
988
+ if (term === IfExpression) {
989
+ const [ thenPart, elsePart ] = variables.children.slice(-2);
990
+
991
+ variables = variables.assign({
992
+ value: Context.of(
993
+ thenPart?.computedValue(),
994
+ elsePart?.computedValue()
995
+ )
996
+ });
997
+ }
998
+
999
+ if (term === List) {
1000
+ variables = variables.assign({
1001
+ value: Context.of(
1002
+ ...variables.children.map(
1003
+ c => c?.computedValue()
1004
+ )
1005
+ )
1006
+ });
1007
+ }
1008
+
1009
+ if (term === FilterExpression) {
1010
+ const [ sourcePart, _ ] = variables.children.slice(-2);
1011
+
1012
+ variables = variables.assign({
1013
+ value: sourcePart?.computedValue()
1014
+ });
1015
+ }
1016
+
1017
+ if (term === FunctionInvocation) {
1018
+
1019
+ const [
1020
+ name,
1021
+ ...args
1022
+ ] = variables.children;
1023
+
1024
+ // preserve type information through `get value(context, key)` utility
1025
+ if (name?.raw === 'get value') {
1026
+ variables = getContextValue(variables, args);
1027
+ }
1028
+ }
1029
+
1030
+ const start = contextStarts[term];
1031
+
1032
+ if (start) {
1033
+ return variables.enterScope(start);
1034
+ }
1035
+
1036
+ const prefixedStart = prefixedContextStarts[term];
1037
+
1038
+ // pull <expression> into new <prefixedStart> context
1039
+ if (prefixedStart) {
1040
+
1041
+ const {
1042
+ children: currentChildren,
1043
+ context: currentContext,
1044
+ } = variables;
1045
+
1046
+ const children = currentChildren.slice(0, -1);
1047
+ const lastChild = last(currentChildren);
1048
+
1049
+ let newContext = null;
1050
+
1051
+ if (term === pathExpressionStart) {
1052
+ newContext = Context.of(lastChild?.computedValue());
1053
+ }
1054
+
1055
+ if (term === filterExpressionStart) {
1056
+ newContext = Context.of(
1057
+ currentContext,
1058
+ lastChild?.computedValue()
1059
+ ).set('item', lastChild?.computedValue());
1060
+ }
1061
+
1062
+ return variables
1063
+ .assign({ children })
1064
+ .enterScope(prefixedStart)
1065
+ .pushChild(lastChild)
1066
+ .assign({ context: newContext || currentContext });
1067
+ }
1068
+
1069
+ // @ts-expect-error internal method
1070
+ const code = input.read(input.pos, stack.pos);
1071
+
1072
+ const end = contextEnds[term];
1073
+
1074
+ if (end) {
1075
+ return variables.exitScope(code);
1076
+ }
1077
+
1078
+ if (term === ContextEntry) {
1079
+ const parts = variables.children.filter(c => c.name !== 'ContextEntry');
1080
+
1081
+ const name = parts[0];
1082
+ const value = last(parts);
1083
+
1084
+ return wrap(variables, 'ContextEntry', code).assign(
1085
+ {
1086
+ value: Context
1087
+ .of(variables.value)
1088
+ .set(name?.computedValue(), value?.computedValue())
1089
+ }
1090
+ );
1091
+ }
1092
+
1093
+ if (
1094
+ term === ForInExpression ||
1095
+ term === QuantifiedInExpression
1096
+ ) {
1097
+ return wrap(variables, 'InExpression', code);
1098
+ }
1099
+
1100
+ // define <partial> within ForExpression body
1101
+ if (term === forExpressionBodyStart) {
1102
+
1103
+ return variables.define(
1104
+ 'partial',
1105
+ ValueProducer.of(variables => {
1106
+ return last(variables.children)?.computedValue();
1107
+ })
1108
+ );
1109
+ }
1110
+
1111
+ if (
1112
+ term === ParameterName
1113
+ ) {
1114
+ const name = last(variables.children).computedValue();
1115
+
1116
+ // TODO: attach type information
1117
+ return variables.define(name, 1);
1118
+ }
1119
+
1120
+ // pull <expression> into ArithmeticExpression child
1121
+ if (
1122
+ term === arithmeticPlusStart ||
1123
+ term === arithmeticTimesStart ||
1124
+ term === arithmeticExpStart
1125
+ ) {
1126
+ const children = variables.children.slice(0, -1);
1127
+ const lastChild = last(variables.children);
1128
+
1129
+ return variables.assign({
1130
+ children
1131
+ }).enterScope('ArithmeticExpression').pushChild(lastChild);
1132
+ }
1133
+
1134
+ if (term === arithmeticUnaryStart) {
1135
+ return variables.enterScope('ArithmeticExpression');
1136
+ }
1137
+
1138
+ if (
1139
+ term === Identifier ||
1140
+ term === AdditionalIdentifier ||
1141
+ term === PropertyIdentifier
1142
+ ) {
1143
+ return variables.token(code);
1144
+ }
1145
+
1146
+ if (
1147
+ term === StringLiteral
1148
+ ) {
1149
+ return variables.literal(code.replace(/^"|"$/g, ''));
1150
+ }
1151
+
1152
+ if (term === BooleanLiteral) {
1153
+ return variables.literal(code === 'true' ? true : false);
1154
+ }
1155
+
1156
+ if (term === NumericLiteral) {
1157
+ return variables.literal(parseFloat(code));
1158
+ }
1159
+
1160
+ if (term === nil) {
1161
+ return variables.literal(null);
1162
+ }
1163
+
1164
+ if (
1165
+ term === VariableName
1166
+ ) {
1167
+ return variables.resolveName();
1168
+ }
1169
+
1170
+ if (
1171
+ term === Name ||
1172
+ term === PropertyName
1173
+ ) {
1174
+ return variables.declareName();
1175
+ }
1176
+
1177
+ if (
1178
+ term === expression0 ||
1179
+ term === PositiveUnaryTest
1180
+ ) {
1181
+ if (variables.tokens.length > 0) {
1182
+ throw new Error('uncleared name');
1183
+ }
1184
+ }
1185
+
1186
+ if (term === expression0) {
1187
+
1188
+ let parent = variables;
1189
+
1190
+ while (parent.parent) {
1191
+ parent = parent.exitScope(code);
1192
+ }
1193
+
1194
+ return parent;
1195
+ }
1196
+
1197
+ return variables;
1198
+ }
1199
+ });
1200
+ }
1201
+
1202
+ const variableTracker = trackVariables({});
1203
+
1204
+
1205
+ // helpers //////////////
1206
+
1207
+ function getContextValue(variables, args) {
1208
+
1209
+ if (!args.length) {
1210
+ return variables.assign({
1211
+ value: null
1212
+ });
1213
+ }
1214
+
1215
+ if (args[0].name === 'Name') {
1216
+ args = extractNamedArgs(args, [ 'm', 'key' ]);
1217
+ }
1218
+
1219
+ if (args.length !== 2) {
1220
+ return variables.assign({
1221
+ value: null
1222
+ });
1223
+ }
1224
+
1225
+ const [
1226
+ context,
1227
+ key
1228
+ ] = args;
1229
+
1230
+ const keyValue = key?.computedValue();
1231
+ const contextValue = context?.computedValue();
1232
+
1233
+ if (
1234
+ (!contextValue || typeof contextValue !== 'object') || typeof keyValue !== 'string'
1235
+ ) {
1236
+ return variables.assign({
1237
+ value: null
1238
+ });
1239
+ }
1240
+
1241
+ return variables.assign({
1242
+ value: [ normalizeContextKey(keyValue), keyValue ].reduce((value, keyValue) => {
1243
+ return contextValue.get(keyValue) || value;
1244
+ }, null)
1245
+ });
1246
+ }
1247
+
1248
+ function extractNamedArgs(args, argNames) {
1249
+
1250
+ const context = {};
1251
+
1252
+ for (let i = 0; i < args.length; i += 2) {
1253
+ const [ name, value ] = args.slice(i, i + 2);
1254
+
1255
+ context[name.value] = value;
1256
+ }
1257
+
1258
+ return argNames.map(name => context[name]);
1259
+ }
1260
+
1261
+ function last(arr) {
1262
+ return arr[arr.length - 1];
1263
+ }
1264
+
1265
+ const feelHighlighting = highlight.styleTags({
1266
+ StringLiteral: highlight.tags.string,
1267
+ NumericLiteral: highlight.tags.number,
1268
+ BooleanLiteral: highlight.tags.bool,
1269
+ 'AtLiteral!': highlight.tags.special(highlight.tags.string),
1270
+ CompareOp: highlight.tags.compareOperator,
1271
+ ArithOp: highlight.tags.arithmeticOperator,
1272
+ 'for if then else some every satisfies between return': highlight.tags.controlKeyword,
1273
+ 'in instance of and or': highlight.tags.operatorKeyword,
1274
+ function: highlight.tags.definitionKeyword,
1275
+ as: highlight.tags.keyword,
1276
+ 'Type/...': highlight.tags.typeName,
1277
+ Wildcard: highlight.tags.special(highlight.tags.variableName),
1278
+ null: highlight.tags.null,
1279
+ LineComment: highlight.tags.lineComment,
1280
+ BlockComment: highlight.tags.blockComment,
1281
+ 'VariableName! "?"': highlight.tags.variableName,
1282
+ 'DateTimeConstructor! SpecialFunctionName!': highlight.tags.function(highlight.tags.special(highlight.tags.variableName)),
1283
+ 'List Interval': highlight.tags.list,
1284
+ Context: highlight.tags.definition(highlight.tags.literal),
1285
+ 'Name!': highlight.tags.definition(highlight.tags.variableName),
1286
+ 'Key/Name! ContextEntryType/Name!': highlight.tags.definition(highlight.tags.propertyName),
1287
+ 'PathExpression/VariableName!': highlight.tags.function(highlight.tags.propertyName),
1288
+ 'FormalParameter/ParameterName!': highlight.tags.function(highlight.tags.definition(highlight.tags.variableName)),
1289
+ '( )': highlight.tags.paren,
1290
+ '[ ]': highlight.tags.squareBracket,
1291
+ '{ }': highlight.tags.brace,
1292
+ '.': highlight.tags.derefOperator,
1293
+ ', ;': highlight.tags.separator,
1294
+ '..': highlight.tags.punctuation
1295
+ });
1296
+
1297
+ // This file was generated by lezer-generator. You probably shouldn't edit it.
1298
+ const spec_identifier = {__proto__:null,for:10, in:32, return:36, if:40, then:42, else:44, some:48, every:50, satisfies:56, or:60, and:64, between:72, instance:86, of:89, days:101, time:103, duration:105, years:107, months:109, date:111, list:117, context:123, function:130, null:156, true:330, false:330, "?":170, external:186, not:211};
1299
+ const parser = lr.LRParser.deserialize({
1300
+ version: 14,
1301
+ states: "C|O`QYOOO`QYOOO$sQYOOOOQU'#Ce'#CeO$}QYO'#C`O&WQYO'#FQOOQQ'#Ff'#FfO&bQYO'#FfO`QYO'#DVOOQU'#En'#EnO(UQ^O'#D]OOQU'#D^'#D^OOQU'#D]'#D]OOQO'#Fn'#FnO*RQWO'#DvOOQQ'#D}'#D}OOQQ'#EO'#EOOOQQ'#EP'#EPO*WOWO'#ESO*RQWO'#EQOOQQ'#EQ'#EQOOQQ'#Ft'#FtOOQQ'#Fr'#FrOOQQ'#Fy'#FyOOQQ'#EU'#EUO`QYO'#EWOOQQ'#FS'#FSO*]Q^O'#FSO,SQYO'#EXO,ZQWO'#EYOOQP'#F}'#F}O,`QXO'#EaOOQQ'#Fz'#FzOOQQ'#FR'#FRQOQWOOOOQQ'#FT'#FTOOQQ'#F^'#F^O`QYO'#CoOOQQ'#F_'#F_O$}QYO'#CsO,kQYO'#DwOOQQ'#Fs'#FsO,pQYO'#EROOQO'#ER'#ERO`QYO'#EVO`QYO'#EUOOQO'#F{'#F{Q,xQWOOO,}QYO'#DRO-tQWO'#FbOOQO'#DT'#DTO.PQYO'#FfO.WQWOOO.}QYO'#CdO/[QYO'#FVOOQQ'#Cc'#CcO/aQYO'#FUOOQQ'#Cb'#CbO/iQYO,58zO`QYO,59iOOQQ'#Fc'#FcOOQQ'#Fd'#FdOOQQ'#Fe'#FeO`QYO,59qO`QYO,59qO`QYO,59qOOQQ'#Fl'#FlO/nQYO,5:^OOQQ'#Fm'#FmO`QYO,5:`O`QYO,59eO`QYO,59gO`QYO,59iO1jQYO,59iO1qQYO,59rOOQQ,5:i,5:iO1vQYO,59qOOQU-E8l-E8lO3jQYO'#FoOOQQ,5:b,5:bOOQQ,5:n,5:nOOQQ,5:l,5:lO3qQYO,5:rOOQQ,5;n,5;nO3{QYO,5:qO4YQWO,5:sO4_QYO,5:tOOQP'#Ee'#EeO5UQXO'#EdOOQO'#Ec'#EcO5]QWO'#EbO5bQWO'#GOO5jQWO,5:{O5oQYO,59ZO/[QYO'#FaOOQQ'#Cw'#CwO5vQYO'#F`OOQQ'#Cv'#CvO6OQYO,59_O6TQYO,5:cO6YQYO,5:mO3tQYO,5:qO6_QYO,5:pO`QYO'#EwQ,xQWOOO`QYO'#EmO7UQWO,5;|O`QYOOOOQR'#Cf'#CfOOQQ'#Ej'#EjO8OQYO,59OO`QYO,5;qOOQQ'#FY'#FYO$}QYO'#EkO8`QYO,5;pO`QYO1G.fOOQQ'#F]'#F]O9VQYO1G/TO;|QYO1G/]O<WQYO1G/]O<bQYO1G/]OOQQ1G/x1G/xO>UQYO1G/zO>]QYO1G/PO?fQYO1G/RO@oQYO1G/TO`QYO1G/TOOQQ1G/T1G/TOAVQYO1G/^OAtQ^O'#CdOCWQYO'#FqOOQO'#Dz'#DzOCbQWO'#DyOCgQWO'#FpOOQO'#Dx'#DxOOQO'#D{'#D{OCoQWO,5<ZOOQQ1G0^1G0^O`QYO1G0]O`QYO'#EsOCtQWO,5<]OOQQ1G0_1G0_ODPQWO'#E[OD[QWO'#F|OOQO'#EZ'#EZODdQWO1G0`OOQP'#Eu'#EuODiQXO,5;OO`QYO,5:|ODpQXO'#EvODxQWO,5<jOOQQ1G0g1G0gO`QYO1G.uO`QYO,5;{O$}QYO'#ElOEQQYO,5;zO`QYO1G.yOEYQYO1G/}OOQO1G0X1G0XOOQO,5;c,5;cOOQO-E8u-E8uOOQO,5;X,5;XOOQO-E8k-E8kOE_QWOOOOQQ-E8h-E8hOEdQYO'#CmOOQQ1G1]1G1]OOQQ,5;V,5;VOOQQ-E8i-E8iOEqQYO7+$QOOQQ7+%f7+%fO`QYO7+$oOFhQYO,5:rOFuQWO7+$oOFzQYO'#D[OOQQ'#DZ'#DZOHnQYO'#D_OHsQYO'#D_OHxQYO'#D_OH}Q`O'#DgOISQ`O'#DjOIXQ`O'#DnOOQQ7+$x7+$xO`QYO,5:eO$}QYO'#ErOI^QWO,5<[OOQQ1G1u1G1uOJdQYO7+%wOJqQYO,5;_OOQO-E8q-E8qOAVQYO,5:vO$}QYO'#EtOKOQWO,5<hOKWQYO7+%zOOQP-E8s-E8sOK_QYO1G0hOOQO,5;b,5;bOOQO-E8t-E8tOKiQYO7+$aOKpQYO1G1gOOQQ,5;W,5;WOOQQ-E8j-E8jOKzQYO7+$eOOQO7+%i7+%iO`QYO,59XOLqQYO<<HZOOQQ<<HZ<<HZO/nQYO'#EoOMzQYO,59vO! nQYO,59yO! sQYO,59yO! xQYO,59yO! }QYO,5:RO$}QYO,5:UO!!lQbO,5:YO!!sQYO1G0POOQO,5;^,5;^OOQO-E8p-E8pO!!}QYO<<IcOOQQ<<Ic<<IcOOQO1G0b1G0bOOQO,5;`,5;`OOQO-E8r-E8rO!%|QYO'#E^OOQQ<<If<<IfO`QYO<<IfO`QYO<<G{O!&sQYO1G.sOOQQ,5;Z,5;ZOOQQ-E8m-E8mO!&}QYO1G/eOOQQ1G/e1G/eO!'SQbO'#D]O!'eQ`O'#D[O!'pQ`O1G/mO!'uQWO'#DmO!'zQ`O'#FhOOQO'#Dl'#DlO!(SQ`O1G/pOOQO'#Dq'#DqO!(XQ`O'#FjOOQO'#Dp'#DpO!(aQ`O1G/tOOQQAN?QAN?QO!(fQYOAN=gOOQQ7+%P7+%PO!)]Q`O,59vOOQQ7+%X7+%XO! }QYO,5:XO$}QYO'#EpO!)hQ`O,5<SOOQQ7+%[7+%[O! }QYO'#EqO!)pQ`O,5<UO!)xQ`O7+%`OOQO1G/s1G/sOOQO,5;[,5;[OOQO-E8n-E8nOOQO,5;],5;]OOQO-E8o-E8oOAVQYO<<HzOOQQAN>fAN>fO/nQYO'#EoO! }QYO<<HzO!)}Q`O7+%`O!*SQ`O1G/tO!!lQbO,5:YO!*XQ`O'#Dn",
1302
+ stateData: "!*h~O#rOS#sOSPOSQOS~OTsOZVO[UOdtOhvOivOr}Os}OviO!T{O!U{O!VxO!XzO!c!OO!g|O!igO!pyO!wjO#SnO#nRO#oRO$ZZO$i_O$j`O$kaO$lbO~OTsO[UOdtOhvOivOr}Os}OviO!T{O!U{O!VxO!XzO!c!OO!g|O!igO!pyO!wjO#SnO#nRO#oRO$ZZO$i_O$j`O$kaO$lbO~OZ!TO#]!UO~P#SO#nRO#oRO~OZ!^O[!^O]!_O^!_O_!`O`!kOn!hOp!iOr!]Os!]Ot!jO{!lO!i!fO#z!dOv$bX~O#l#tX$s#tX~P%VO$i!mOT$YXZ$YX[$YXd$YXh$YXi$YXr$YXs$YXv$YX!T$YX!U$YX!V$YX!X$YX!c$YX!g$YX!i$YX!p$YX!w$YX#S$YX#n$YX#o$YX$Z$YX$j$YX$k$YX$l$YX~O#nRO#oROZ!PX[!PX]!PX^!PX_!PX`!PXn!PXp!PXr!PXs!PXt!PXv!PX{!PX!i!PX#l!PX#p!PX#z!PX$s!PX$O!PXx!PX#}!PX!g!PXe!PXb!PX#R!PXf!PXl!PX~Ov!pO~O$j`O~O#p!uOZ#vX[#vX]#vX^#vX_#vX`#vXn#vXp#vXr#vXs#vXt#vXv#vX{#vX!i#vX#l#vX#z#vX$s#vX$O#vXx#vX#}#vX!g#vXe#vXb#vX#R#vXf#vXl#vX~O!g$eP~P`Ov!xO~O#m!yO$j`O#R$rP~Op#VO~Op#WOv!uX~O$s#ZO~O#luX$OuX$suXxuX#}uX!guXeuXbuX#RuXfuXluX~P%VO$O#]O#l$UXx$UX~O#l#[X~P&bOv#_O~OZ#`O[#`O]#`O^#`O_#`O#nRO#oRO#z#`O#{#`O$]WX~O`WXxWX$OWX~P.]O`#dO~O$O#eOb#xX~Ob#hO~O#nRO#oRO$ZZO~OTsOZVO[UOdtOhvOivOr}Os}O!T{O!U{O!VxO!XzO!c!OO!g|O!igO!pyO!wjO#SnO#nRO#oRO$ZZO$i_O$j`O$kaO$lbO~Ov#rO~P/yO|#tO~O{!lO!i!fO#z!dOZya[ya]ya^ya_ya`yanyapyaryasyatyav$bX#lya$sya$Oyaxya#}ya!gyaeyabya#Ryafyalya~Ox$eP~P`Ox#}O#}$OO~P%VO#}$OO$O$PO!g$eX~P%VO!g$RO~O#nRO#oROx$pP~OZ#`O[#`O]#`O^#`O_#`O#m!yO#z#`O#{#`O~O$]#WX~P4jO$]$YO~O$O$ZO#R$rX~O#R$]O~Oe$^O~P%VO$O$`Ol$SX~Ol$bO~O!W$cO~O!T$dO~O#l!xa$s!xa$O!xax!xa#}!xa!g!xae!xab!xa#R!xaf!xal!xa~P%VO$O#]O#l$Uax$Ua~OZ#`O[#`O]#`O^#`O_#`O#nRO#oRO#z#`O#{#`O~O`Wa$]WaxWa$OWa~P7aO$O#eOb#xa~OZ!^O[!^O]!_O^!_O_!`O{!lO!i!fO#z!dOv$bX~O`qinqipqirqisqitqi#lqi$sqi$Oqixqi#}qi!gqieqibqi#Rqifqilqi~P8hO_!`O{!lO!i!fO#z!dOZyi[yi`yinyipyiryisyityiv$bX#lyi$syi$Oyixyi#}yi!gyieyibyi#Ryifyilyi~O]!_O^!_O~P:`O]yi^yi~P:`O{!lO!i!fO#z!dOZyi[yi]yi^yi_yi`yinyipyiryisyityiv$bX#lyi$syi$Oyixyi#}yi!gyieyibyi#Ryifyilyi~O!g$pO~P%VO`!kOp!iOr!]Os!]Ot!jOnmi#lmi$smi$Omixmi#}mi!gmiemibmi#Rmifmilmi~P8hO`!kOr!]Os!]Ot!jOnoipoi#loi$soi$Ooixoi#}oi!goieoiboi#Roifoiloi~P8hO`!kOn!hOp$qOr!]Os!]Ot!jO~P8hO!S$vO!V$wO!X$xO![$yO!_$zO!c${O#nRO#oRO$ZZO~OZ#bX[#bX]#bX^#bX_#bX`#bXn#bXp#bXr#bXs#bXt#bXv#bXx#bX{#bX!i#bX#n#bX#o#bX#p#bX#z#bX$O#bX~P.]O$O$POx$eX~P%VO$]$}O~O$O%OOx$dX~Ox%QO~O$O$PO!g$eax$ea~O$]%UOx#OX$O#OX~O$O%VOx$pX~Ox%XO~O$]#Wa~P4jO#m!yO$j`O~O$O$ZO#R$ra~O$O$`Ol$Sa~O!U%cO~OxrO~O#}%dObaX$OaX~P%VO#lSq$sSq$OSqxSq#}Sq!gSqeSqbSq#RSqfSqlSq~P%VOx#}O#}$OO$OuX~P%VOx%fO~O#z%gOZ!OX[!OX]!OX^!OX_!OX`!OXn!OXp!OXr!OXs!OXt!OXv!OX{!OX!i!OX#l!OX$s!OX$O!OXx!OX#}!OX!g!OXe!OXb!OX#R!OXf!OXl!OX~Op%iO~Op%jO~Op%kO~O!]%lO~O!]%mO~O!]%nO~O$O%OOx$da~OZ!^O[!^O]!_O^!_O_!`O`!kOn!hOp!iOr!]Os!]Ot!jO{!lO#z!dOv$bX~Ox%sO!g%sO!i%rO~PIfO!g#ga$O#gax#ga~P%VO$O%VOx$pa~O#P%yO~P`O#R#Ui$O#Ui~P%VOf%zO~P%VOl$Ti$O$Ti~P%VO#lgq$sgq$Ogqxgq#}gq!ggqegqbgq#Rgqfgqlgq~P%VO`qynqypqyrqysqytqy#lqy$sqy$Oqyxqy#}qy!gqyeqybqy#Rqyfqylqy~P8hO#z%gOZ!Oa[!Oa]!Oa^!Oa_!Oa`!Oan!Oap!Oar!Oas!Oat!Oav!Oa{!Oa!i!Oa#l!Oa$s!Oa$O!Oax!Oa#}!Oa!g!Oae!Oab!Oa#R!Oaf!Oal!Oa~O!T&OO~O!W&OO~O!T&PO~O!S$vO!V$wO!X$xO![$yO!_$zO!c&uO#nRO#oRO$ZZO~O!Y$^P~P! }Ox!mi$O!mi~P%VOT$aXZ$aX[$aX]!yy^!yy_!yy`!yyd$aXh$aXi$aXn!yyp!yyr$aXs$aXt!yyv$aX{!yy!T$aX!U$aX!V$aX!X$aX!c$aX!g$aX!i$aX!p$aX!w$aX#S$aX#l!yy#n$aX#o$aX#z!yy$Z$aX$i$aX$j$aX$k$aX$l$aX$s!yy$O!yyx!yy#}!yye!yyb!yy#R!yyf!yyl!yy~O#l#QX$s#QX$O#QXx#QX#}#QX!g#QXe#QXb#QX#R#QXf#QXl#QX~P%VObai$Oai~P%VO!U&_O~O#nRO#oRO!Y!PX#z!PX$O!PX~O#z&pO!Y!OX$O!OX~O!Y&aO~O$]&bO~O$O&cO!Y$[X~O!Y&eO~O$O&fO!Y$^X~O!Y&hO~O#lc!R$sc!R$Oc!Rxc!R#}c!R!gc!Rec!Rbc!R#Rc!Rfc!Rlc!R~P%VO#z&pO!Y!Oa$O!Oa~O$O&cO!Y$[a~O$O&fO!Y$^a~O$_&nO~O$_&qO~O!Y&rO~O!]&tO~O$Z~QP_^$i]#z~",
1303
+ goto: "E|$sPPPP$tP%m%p%v&Y'sPPPPPP'|P$tPPP$tPP(P(SP$tP$tP$tPPP(YP(eP$t$tPP(n)T)`*m)TPPPPPPP)TPP)TP+r+u)TP+{,R$tP$tP$t,Y-R-U-[-RP-d.]-d-d/]0UP$t0}$t1v1v2o2rP2xPP1v3O3U/X3YPP3bP3e3l3r3x4O5Z5e5k5q5w6O6U6[6bPPPPPPPP6h6q8x9q:j:mPP:qPP:w:z;s<l<o<s<x=g>V>vP?oP?rP?v@iA[BTBZB^$tBdBdPPPPC]8xDUD}EQEy!mjOPQWilu|}!]!a!b!c!g!h!i!j!k!p#Z#]#_#c#g#r$O$P$Y$^$_$b$q$}%X%d%y%zR![SQ!YSR$m#eS!WS#eS#Qw$`W#w!p!x%O%VT&T%m&c#WXOPQWYilu|}!]!a!b!c!e!g!h!i!j!k#Z#]#_#c#g#r#t$O$P$Y$^$_$b$q$}%U%X%d%g%l%n%y%z&Q&b&f&n&p&q&tb!VSw!x#e$`%O%V%m&cU#a!V#b#uR#u!pU#a!V#b#uT$W!z$XR$l#cR#UwQ#SwR%`$`U!RQ#_#rQ#s!kR$g#]QrQQ$i#_R$s#rQ$|#tQ%t%UQ&S%lU&X%n&f&tQ&i&bT&o&n&qc$u#t%U%l%n&b&f&n&q&t!lkOPQWilu|}!]!a!b!c!g!h!i!j!k!p#Z#]#_#c#g#r$O$P$Y$^$_$b$q$}%X%d%y%zQ#m!eU$t#t%U&nS%|%g&p]&R%l%n&b&f&q&t#V[OPQWilu|}!]!a!b!c!e!g!h!i!j!k!p#Z#]#_#c#g#r#t$O$P$Y$^$_$b$q$}%U%X%d%g%l%n%y%z&b&f&n&p&q&tR&W%mQ&U%mR&j&cQ&[%nR&s&tS&Y%n&tR&l&f!m]OPQWilu|}!]!a!b!c!g!h!i!j!k!p#Z#]#_#c#g#r$O$P$Y$^$_$b$q$}%X%d%y%zR#|!pQ#y!pR%p%OS#x!p%OT$S!x%V!meOPQWilu|}!]!a!b!c!g!h!i!j!k!p#Z#]#_#c#g#r$O$P$Y$^$_$b$q$}%X%d%y%z!leOPQWilu|}!]!a!b!c!g!h!i!j!k!p#Z#]#_#c#g#r$O$P$Y$^$_$b$q$}%X%d%y%zQ!rbT!{o$Z!mcOPQWilu|}!]!a!b!c!g!h!i!j!k!p#Z#]#_#c#g#r$O$P$Y$^$_$b$q$}%X%d%y%z!mdOPQWilu|}!]!a!b!c!g!h!i!j!k!p#Z#]#_#c#g#r$O$P$Y$^$_$b$q$}%X%d%y%z!mhOPQWilu|}!]!a!b!c!g!h!i!j!k!p#Z#]#_#c#g#r$O$P$Y$^$_$b$q$}%X%d%y%z!mpOPQWilu|}!]!a!b!c!g!h!i!j!k!p#Z#]#_#c#g#r$O$P$Y$^$_$b$q$}%X%d%y%zR$V!xQ$T!xR%u%VQ%x%XR&]%yQ!}oR%[$ZT!|o$ZS!zo$ZT$W!z$XRrQS#b!V#uR$j#bQ#f!YR$n#fQ$a#SR%a$aQ#^!RR$h#^!vYOPQWilu|}!]!a!b!c!e!g!h!i!j!k!p#Z#]#_#c#g#r#t$O$P$Y$^$_$b$q$}%U%X%d%g%y%z&nS!oY&Q_&Q%l%n&b&f&p&q&tQ%h$tS%}%h&`R&`&RQ&d&UR&k&dQ&g&YR&m&gQ%P#yR%q%PS$Q!v#vR%T$QQ%W$TR%v%WQ$X!zR%Y$XQ$[!}R%]$[Q#[!PR$f#[QrOQ!PPR$e#ZUTOP#ZW!QQ!k#]#_Q!nWQ!tiQ!vlQ#PuQ#X|Q#Y}Q#i!]Q#j!aQ#k!bQ#l!cQ#n!gQ#o!hQ#p!iQ#q!jQ#v!pQ$k#cQ$o#gQ$r#rQ%R$OQ%S$PQ%Z$YQ%^$^Q%_$_Q%b$bQ%e$qQ%o$}S%w%X%yQ%{%dR&^%z!mqOPQWilu|}!]!a!b!c!g!h!i!j!k!p#Z#]#_#c#g#r$O$P$Y$^$_$b$q$}%X%d%y%z!mSOPQWilu|}!]!a!b!c!g!h!i!j!k!p#Z#]#_#c#g#r$O$P$Y$^$_$b$q$}%X%d%y%zR!ZST!XS#eQ#c!WR$_#QR#g![!muOPQWilu|}!]!a!b!c!g!h!i!j!k!p#Z#]#_#c#g#r$O$P$Y$^$_$b$q$}%X%d%y%z!mwOPQWilu|}!]!a!b!c!g!h!i!j!k!p#Z#]#_#c#g#r$O$P$Y$^$_$b$q$}%X%d%y%zR#TwT#Rw$`V!SQ#_#r!X!aT!Q!t!v#P#X#Y#i#n#o#p#q#v$k$o$r%R%S%Z%^%_%b%e%o%w%{&^!Z!bT!Q!t!v#P#X#Y#i#j#n#o#p#q#v$k$o$r%R%S%Z%^%_%b%e%o%w%{&^!]!cT!Q!t!v#P#X#Y#i#j#k#n#o#p#q#v$k$o$r%R%S%Z%^%_%b%e%o%w%{&^!mWOPQWilu|}!]!a!b!c!g!h!i!j!k!p#Z#]#_#c#g#r$O$P$Y$^$_$b$q$}%X%d%y%zR&V%mT&Z%n&t!a!eT!Q!n!t!v#P#X#Y#i#j#k#l#n#o#p#q#v$k$o$r%R%S%Z%^%_%b%e%o%w%{&^!a!gT!Q!n!t!v#P#X#Y#i#j#k#l#n#o#p#q#v$k$o$r%R%S%Z%^%_%b%e%o%w%{&^!m^OPQWilu|}!]!a!b!c!g!h!i!j!k!p#Z#]#_#c#g#r$O$P$Y$^$_$b$q$}%X%d%y%zQ!q^R!scR#z!pQ!wlR#{!p!mfOPQWilu|}!]!a!b!c!g!h!i!j!k!p#Z#]#_#c#g#r$O$P$Y$^$_$b$q$}%X%d%y%z!mlOPQWilu|}!]!a!b!c!g!h!i!j!k!p#Z#]#_#c#g#r$O$P$Y$^$_$b$q$}%X%d%y%z!mmOPQWilu|}!]!a!b!c!g!h!i!j!k!p#Z#]#_#c#g#r$O$P$Y$^$_$b$q$}%X%d%y%zR$U!x!moOPQWilu|}!]!a!b!c!g!h!i!j!k!p#Z#]#_#c#g#r$O$P$Y$^$_$b$q$}%X%d%y%zR#Oo",
1304
+ nodeNames: "⚠ LineComment BlockComment Expression ForExpression for InExpressions InExpression Name Identifier Identifier ArithOp ArithOp ArithOp ArithOp ArithOp in IterationContext return IfExpression if then else QuantifiedExpression some every InExpressions InExpression satisfies Disjunction or Conjunction and Comparison CompareOp CompareOp between PositiveUnaryTest ( PositiveUnaryTests ) ArithmeticExpression InstanceOfExpression instance of Type QualifiedName VariableName BacktickIdentifier SpecialType days time duration years months date > ListType list < ContextType context ContextEntryTypes ContextEntryType FunctionType function ArgumentTypes ArgumentType PathExpression ] FilterExpression [ FunctionInvocation SpecialFunctionName NamedParameters NamedParameter ParameterName PositionalParameters null NumericLiteral StringLiteral BooleanLiteral DateTimeLiteral DateTimeConstructor AtLiteral ? SimplePositiveUnaryTest Interval ParenthesizedExpression List FunctionDefinition FormalParameters FormalParameter external FunctionBody } { Context ContextEntry Key Name Identifier Expressions UnaryTests Wildcard not",
1305
+ maxTerm: 173,
1306
+ context: variableTracker,
1307
+ nodeProps: [
1308
+ ["group", -17,4,19,23,29,31,33,41,42,68,70,72,85,86,88,89,90,97,"Expr",47,"Expr Expr",-5,78,79,80,81,82,"Expr Literal"],
1309
+ ["closedBy", 38,")",71,"]",96,"}"],
1310
+ ["openedBy", 40,"(",69,"[",95,"{"]
1311
+ ],
1312
+ propSources: [feelHighlighting],
1313
+ skippedNodes: [0,1,2],
1314
+ repeatNodeCount: 14,
1315
+ tokenData: ".Z~RvXY#iYZ$^Z[#i]^$^pq#iqr$crs$nwx&fxy&kyz&pz{&u{|'S|}'X}!O'^!O!P'k!P!Q(u!Q![*p![!]+X!]!^+^!^!_+c!_!`$i!`!a+r!b!c+|!}#O,R#P#Q,W#Q#R&}#S#T,]#o#p.P#q#r.U$f$g#i#BY#BZ#i$IS$I_#i$I|$I}$^$I}$JO$^$JT$JU#i$KV$KW#i&FU&FV#i?HT?HU#i~#nY#r~XY#iZ[#ipq#i$f$g#i#BY#BZ#i$IS$I_#i$JT$JU#i$KV$KW#i&FU&FV#i?HT?HU#i~$cO#s~~$fP!_!`$i~$nOr~~$sW$j~OY$nZr$nrs%]s#O$n#O#P%b#P;'S$n;'S;=`&`<%lO$n~%bO$j~~%eRO;'S$n;'S;=`%n;=`O$n~%sX$j~OY$nZr$nrs%]s#O$n#O#P%b#P;'S$n;'S;=`&`;=`<%l$n<%lO$n~&cP;=`<%l$n~&kO#{~~&pOv~~&uOx~~&zP^~z{&}~'SO_~~'XO[~~'^O$O~R'cPZP!`!a'fQ'kO$_Q~'pQ#z~!O!P'v!Q!['{~'{O#}~~(QR$i~!Q!['{!g!h(Z#X#Y(Z~(^R{|(g}!O(g!Q![(m~(jP!Q![(m~(rP$i~!Q![(m~(zQ]~z{)Q!P!Q*X~)TTOz)Qz{)d{;'S)Q;'S;=`*R<%lO)Q~)gVOz)Qz{)d{!P)Q!P!Q)|!Q;'S)Q;'S;=`*R<%lO)Q~*ROQ~~*UP;=`<%l)Q~*^SP~OY*XZ;'S*X;'S;=`*j<%lO*X~*mP;=`<%l*X~*uS$i~!O!P+R!Q![*p!g!h(Z#X#Y(Z~+UP!Q!['{~+^O$]~~+cO$s~R+jP!]QsP!_!`+mP+rOsPR+yP!YQsP!_!`+m~,RO$l~~,WO!i~~,]O!g~~,`WOY,]Z#O,]#O#P,x#P#S,]#S#T-t#T;'S,];'S;=`-y<%lO,]~,{RO;'S,];'S;=`-U;=`O,]~-XXOY,]Z#O,]#O#P,x#P#S,]#S#T-t#T;'S,];'S;=`-y;=`<%l,]<%lO,]~-yO$Z~~-|P;=`<%l,]~.UO#S~~.ZO#R~",
1316
+ tokenizers: [propertyIdentifiers, identifiers, insertSemicolon, 0, 1],
1317
+ topRules: {"Expression":[0,3],"Expressions":[1,102],"UnaryTests":[2,103]},
1318
+ dialects: {camunda: 2544},
1319
+ dynamicPrecedences: {"31":-1,"68":1,"72":-1,"74":-1},
1320
+ specialized: [{term: 122, get: (value) => spec_identifier[value] || -1}],
1321
+ tokenPrec: 2546
1322
+ });
1323
+
1324
+ exports.VariableContext = VariableContext;
1325
+ exports.normalizeContextKey = normalizeContextKey;
1326
+ exports.parser = parser;
1327
+ exports.trackVariables = trackVariables;
1328
+ //# sourceMappingURL=index.cjs.map