emj 0.0.11 → 0.2.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.
package/lib/parser.js ADDED
@@ -0,0 +1,364 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parse = void 0;
4
+ const characters_1 = require("./characters");
5
+ const limits_1 = require("./limits");
6
+ const Kind = {
7
+ EOF: 0,
8
+ Invalid: 1,
9
+ Space: 2,
10
+ Start: 3,
11
+ End: 4,
12
+ Indent: 5,
13
+ Outdent: 6,
14
+ Open: 7,
15
+ Close: 8,
16
+ Delimit: 9,
17
+ KeyChar: 10,
18
+ KeyUpper: 11,
19
+ KeyUnicode: 12,
20
+ KeyNibble: 13,
21
+ KeyEmpty: 14,
22
+ ValueChar: 15,
23
+ ValueUpper: 16,
24
+ ValueUnicode: 17,
25
+ ValueNibble: 18,
26
+ ValueEmpty: 19,
27
+ Digit: 20,
28
+ Decimal: 21,
29
+ Exponent: 22,
30
+ Negative: 23,
31
+ True: 24,
32
+ False: 25,
33
+ Null: 26,
34
+ };
35
+ // Each token is `kind | code << 8`, looked up by code point in a typed array:
36
+ // one for the BMP (where spaces and a few emoji live) and one for the block
37
+ // of astral emoji, U+1F300–U+1FAFF. Unlisted code points stay Invalid.
38
+ // This makes parse() 19–31% faster than a Map did (see bench/RESULTS.md).
39
+ const ASTRAL_START = 0x1f300;
40
+ const ASTRAL_SIZE = 0x800;
41
+ const BMP_TOKENS = new Uint16Array(0x10000).fill(Kind.Invalid);
42
+ const ASTRAL_TOKENS = new Uint16Array(ASTRAL_SIZE).fill(Kind.Invalid);
43
+ function lookup(point) {
44
+ if (point < 0x10000)
45
+ return BMP_TOKENS[point];
46
+ const offset = point - ASTRAL_START;
47
+ return offset >= 0 && offset < ASTRAL_SIZE
48
+ ? ASTRAL_TOKENS[offset]
49
+ : Kind.Invalid;
50
+ }
51
+ function setToken(point, token) {
52
+ const offset = point - ASTRAL_START;
53
+ if (point < 0x10000)
54
+ BMP_TOKENS[point] = token;
55
+ else if (offset >= 0 && offset < ASTRAL_SIZE)
56
+ ASTRAL_TOKENS[offset] = token;
57
+ else
58
+ throw new Error(`U+${point.toString(16)} is outside the token table`);
59
+ }
60
+ const define = (emoji, kind, code = 0) => {
61
+ setToken(emoji.codePointAt(0), kind | (code << 8));
62
+ };
63
+ define(characters_1.characters.document.start, Kind.Start);
64
+ define(characters_1.characters.document.end, Kind.End);
65
+ define(characters_1.characters.document.indent, Kind.Indent);
66
+ define(characters_1.characters.document.outdent, Kind.Outdent);
67
+ define(characters_1.characters.document.arrayOpen, Kind.Open);
68
+ define(characters_1.characters.document.arrayClose, Kind.Close);
69
+ define(characters_1.characters.document.arrayDelimit, Kind.Delimit);
70
+ define(characters_1.characters.keys.modifiers.upperCase, Kind.KeyUpper);
71
+ define(characters_1.characters.keys.modifiers.unicode, Kind.KeyUnicode);
72
+ define(characters_1.characters.keys.other.empty, Kind.KeyEmpty);
73
+ define(characters_1.characters.values.modifiers.upperCase, Kind.ValueUpper);
74
+ define(characters_1.characters.values.modifiers.unicode, Kind.ValueUnicode);
75
+ define(characters_1.characters.values.modifiers.negative, Kind.Negative);
76
+ define(characters_1.characters.values.other.emptyString, Kind.ValueEmpty);
77
+ define(characters_1.characters.values.other.null, Kind.Null);
78
+ define(characters_1.characters.values.booleans.true, Kind.True);
79
+ define(characters_1.characters.values.booleans.false, Kind.False);
80
+ for (const [char, emoji] of Object.entries(characters_1.characters.keys.letters)) {
81
+ define(emoji, Kind.KeyChar, char.charCodeAt(0));
82
+ }
83
+ for (const [char, emoji] of Object.entries(characters_1.characters.keys.numerals)) {
84
+ define(emoji, Kind.KeyChar, char.charCodeAt(0));
85
+ }
86
+ for (const [hex, emoji] of Object.entries(characters_1.characters.keys.unicode)) {
87
+ define(emoji, Kind.KeyNibble, parseInt(hex, 16));
88
+ }
89
+ for (const [char, emoji] of Object.entries(characters_1.characters.values.letters)) {
90
+ define(emoji, Kind.ValueChar, char.charCodeAt(0));
91
+ }
92
+ for (const [char, emoji] of Object.entries(characters_1.characters.values.numerals)) {
93
+ define(emoji, Kind.ValueChar, char.charCodeAt(0));
94
+ }
95
+ for (const [hex, emoji] of Object.entries(characters_1.characters.values.unicode)) {
96
+ define(emoji, Kind.ValueNibble, parseInt(hex, 16));
97
+ }
98
+ for (const [char, emoji] of Object.entries(characters_1.characters.values.numbers)) {
99
+ const kind = char === '.' ? Kind.Decimal : char === 'e' ? Kind.Exponent : Kind.Digit;
100
+ define(emoji, kind, char.charCodeAt(0));
101
+ }
102
+ // every /\s/ character, plus the variation selector some emoji carry
103
+ for (const space of [
104
+ 0x9, 0xa, 0xb, 0xc, 0xd, 0x20, 0xa0, 0x1680, 0x2000, 0x2001, 0x2002, 0x2003,
105
+ 0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200a, 0x2028, 0x2029,
106
+ 0x202f, 0x205f, 0x3000, 0xfeff, 0xfe0f,
107
+ ]) {
108
+ setToken(space, Kind.Space);
109
+ }
110
+ const OBJECT_PROTOTYPE = Object.prototype;
111
+ let source = '';
112
+ let index = 0;
113
+ let at = 0;
114
+ let point = 0;
115
+ let kind = Kind.EOF;
116
+ let code = 0;
117
+ let depth = 0;
118
+ function next() {
119
+ while (index < source.length) {
120
+ at = index;
121
+ point = source.codePointAt(index);
122
+ index += point > 0xffff ? 2 : 1;
123
+ const token = lookup(point);
124
+ if (token === Kind.Space)
125
+ continue;
126
+ kind = token & 0xff;
127
+ code = token >> 8;
128
+ return kind;
129
+ }
130
+ at = index;
131
+ kind = Kind.EOF;
132
+ return kind;
133
+ }
134
+ function fail() {
135
+ if (kind === Kind.EOF) {
136
+ throw new SyntaxError('Unexpected end of Emojion input');
137
+ }
138
+ throw new SyntaxError(`Unexpected "${String.fromCodePoint(point)}" in Emojion at position ${at}`);
139
+ }
140
+ function nest() {
141
+ if (++depth > limits_1.MAX_DEPTH) {
142
+ throw new SyntaxError(`Emojion nesting exceeds ${limits_1.MAX_DEPTH} levels at position ${at}`);
143
+ }
144
+ }
145
+ function expect(expected) {
146
+ if (kind !== expected)
147
+ fail();
148
+ next();
149
+ }
150
+ function text(char, upper, unicode, nibble) {
151
+ let out = '';
152
+ for (;;) {
153
+ if (kind === char) {
154
+ out += String.fromCharCode(code);
155
+ next();
156
+ }
157
+ else if (kind === upper) {
158
+ next();
159
+ if (kind !== char || code < 97)
160
+ fail();
161
+ out += String.fromCharCode(code - 32);
162
+ next();
163
+ }
164
+ else if (kind === unicode) {
165
+ next();
166
+ if (kind !== nibble)
167
+ fail();
168
+ // U+10FFFF, the highest code point, needs six nibbles.
169
+ let value = 0;
170
+ let nibbles = 0;
171
+ do {
172
+ if (++nibbles > 6)
173
+ fail();
174
+ value = value * 16 + code;
175
+ if (value > 0x10ffff)
176
+ fail();
177
+ next();
178
+ } while (kind === nibble);
179
+ out += String.fromCodePoint(value);
180
+ }
181
+ else {
182
+ return out;
183
+ }
184
+ }
185
+ }
186
+ function digits() {
187
+ if (kind !== Kind.Digit)
188
+ fail();
189
+ let out = '';
190
+ do {
191
+ out += String.fromCharCode(code);
192
+ next();
193
+ } while (kind === Kind.Digit);
194
+ return out;
195
+ }
196
+ function number() {
197
+ let out = '';
198
+ if (kind === Kind.Negative) {
199
+ out = '-';
200
+ next();
201
+ }
202
+ if (kind === Kind.Digit && code === 48) {
203
+ out += '0';
204
+ next();
205
+ if (kind === Kind.Digit)
206
+ fail();
207
+ }
208
+ else {
209
+ out += digits();
210
+ }
211
+ if (kind === Kind.Decimal) {
212
+ next();
213
+ out += '.' + digits();
214
+ }
215
+ if (kind === Kind.Exponent) {
216
+ if (next() === Kind.Negative) {
217
+ out += 'e-';
218
+ next();
219
+ }
220
+ else {
221
+ out += 'e';
222
+ }
223
+ out += digits();
224
+ }
225
+ return Number(out);
226
+ }
227
+ function members(close) {
228
+ const out = {};
229
+ while (kind !== close) {
230
+ let key = '';
231
+ if (kind === Kind.KeyEmpty) {
232
+ next();
233
+ }
234
+ else if (kind === Kind.KeyChar ||
235
+ kind === Kind.KeyUpper ||
236
+ kind === Kind.KeyUnicode) {
237
+ key = text(Kind.KeyChar, Kind.KeyUpper, Kind.KeyUnicode, Kind.KeyNibble);
238
+ }
239
+ else {
240
+ fail();
241
+ }
242
+ const item = value();
243
+ if (key in OBJECT_PROTOTYPE) {
244
+ // Assigning a key that out inherits would run its setter (__proto__
245
+ // would set the prototype) or fail if it is read-only. Define it as
246
+ // an own property instead, as JSON.parse() does.
247
+ Object.defineProperty(out, key, {
248
+ value: item,
249
+ writable: true,
250
+ enumerable: true,
251
+ configurable: true,
252
+ });
253
+ }
254
+ else {
255
+ // A repeated key overwrites the earlier one: the last wins.
256
+ out[key] = item;
257
+ }
258
+ }
259
+ return out;
260
+ }
261
+ function array() {
262
+ const out = [];
263
+ if (next() === Kind.Close) {
264
+ next();
265
+ return out;
266
+ }
267
+ out.push(value());
268
+ while (kind === Kind.Delimit) {
269
+ next();
270
+ out.push(value());
271
+ }
272
+ expect(Kind.Close);
273
+ return out;
274
+ }
275
+ function value() {
276
+ switch (kind) {
277
+ case Kind.Indent: {
278
+ nest();
279
+ next();
280
+ const out = members(Kind.Outdent);
281
+ next();
282
+ depth--;
283
+ return out;
284
+ }
285
+ case Kind.Open: {
286
+ nest();
287
+ const out = array();
288
+ depth--;
289
+ return out;
290
+ }
291
+ case Kind.True:
292
+ next();
293
+ return true;
294
+ case Kind.False:
295
+ next();
296
+ return false;
297
+ case Kind.Null:
298
+ next();
299
+ return null;
300
+ case Kind.ValueEmpty:
301
+ next();
302
+ return '';
303
+ case Kind.Negative:
304
+ case Kind.Digit:
305
+ return number();
306
+ case Kind.ValueChar:
307
+ case Kind.ValueUpper:
308
+ case Kind.ValueUnicode:
309
+ return text(Kind.ValueChar, Kind.ValueUpper, Kind.ValueUnicode, Kind.ValueNibble);
310
+ }
311
+ return fail();
312
+ }
313
+ /**
314
+ * Parse an Emojion document into the value it holds, as `JSON.parse()` parses
315
+ * JSON text.
316
+ *
317
+ * Objects come back as plain objects and arrays as plain arrays. A key that
318
+ * `Object.prototype` has, such as `__proto__`, becomes an ordinary own
319
+ * property and never changes the prototype. When a key repeats, the last
320
+ * value wins.
321
+ *
322
+ * @param emojion - The document, from `🙌` to `✋`. Whitespace and U+FE0F
323
+ * variation selectors anywhere in it are ignored.
324
+ * @returns The object, array, string, number, boolean or `null` it holds.
325
+ * @throws {SyntaxError} If the document is not valid Emojion, naming the
326
+ * unexpected emoji and its position, or if it nests arrays and objects more
327
+ * than 512 levels deep.
328
+ *
329
+ * @example
330
+ * parse('🙌😶😠🤑😳👡🐘🐁🦉🦒🐖🦉🦏✋');
331
+ * //=> { name: 'Emojion' }
332
+ *
333
+ * @example
334
+ * parse('🙌🤜🕐🤝💚🤝🕳🤛✋');
335
+ * //=> [1, true, null]
336
+ */
337
+ const parse = (emojion) => {
338
+ source = emojion;
339
+ index = 0;
340
+ depth = 0;
341
+ try {
342
+ next();
343
+ expect(Kind.Start);
344
+ // A top-level object is written without 👉👈.
345
+ if (kind === Kind.Indent)
346
+ fail();
347
+ const out = kind === Kind.End ||
348
+ kind === Kind.KeyEmpty ||
349
+ kind === Kind.KeyChar ||
350
+ kind === Kind.KeyUpper ||
351
+ kind === Kind.KeyUnicode
352
+ ? members(Kind.End)
353
+ : value();
354
+ expect(Kind.End);
355
+ if (kind !== Kind.EOF)
356
+ fail();
357
+ return out;
358
+ }
359
+ finally {
360
+ source = '';
361
+ }
362
+ };
363
+ exports.parse = parse;
364
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3BhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FBMEM7QUFFMUMscUNBQXFDO0FBRXJDLE1BQU0sSUFBSSxHQUFHO0lBQ1gsR0FBRyxFQUFFLENBQUM7SUFDTixPQUFPLEVBQUUsQ0FBQztJQUNWLEtBQUssRUFBRSxDQUFDO0lBQ1IsS0FBSyxFQUFFLENBQUM7SUFDUixHQUFHLEVBQUUsQ0FBQztJQUNOLE1BQU0sRUFBRSxDQUFDO0lBQ1QsT0FBTyxFQUFFLENBQUM7SUFDVixJQUFJLEVBQUUsQ0FBQztJQUNQLEtBQUssRUFBRSxDQUFDO0lBQ1IsT0FBTyxFQUFFLENBQUM7SUFDVixPQUFPLEVBQUUsRUFBRTtJQUNYLFFBQVEsRUFBRSxFQUFFO0lBQ1osVUFBVSxFQUFFLEVBQUU7SUFDZCxTQUFTLEVBQUUsRUFBRTtJQUNiLFFBQVEsRUFBRSxFQUFFO0lBQ1osU0FBUyxFQUFFLEVBQUU7SUFDYixVQUFVLEVBQUUsRUFBRTtJQUNkLFlBQVksRUFBRSxFQUFFO0lBQ2hCLFdBQVcsRUFBRSxFQUFFO0lBQ2YsVUFBVSxFQUFFLEVBQUU7SUFDZCxLQUFLLEVBQUUsRUFBRTtJQUNULE9BQU8sRUFBRSxFQUFFO0lBQ1gsUUFBUSxFQUFFLEVBQUU7SUFDWixRQUFRLEVBQUUsRUFBRTtJQUNaLElBQUksRUFBRSxFQUFFO0lBQ1IsS0FBSyxFQUFFLEVBQUU7SUFDVCxJQUFJLEVBQUUsRUFBRTtDQUNBLENBQUM7QUFFWCw4RUFBOEU7QUFDOUUsNEVBQTRFO0FBQzVFLHVFQUF1RTtBQUN2RSwwRUFBMEU7QUFDMUUsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDO0FBQzdCLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQztBQUMxQixNQUFNLFVBQVUsR0FBRyxJQUFJLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQy9ELE1BQU0sYUFBYSxHQUFHLElBQUksV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7QUFFdEUsU0FBUyxNQUFNLENBQUMsS0FBYTtJQUMzQixJQUFJLEtBQUssR0FBRyxPQUFPO1FBQUUsT0FBTyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUMsTUFBTSxNQUFNLEdBQUcsS0FBSyxHQUFHLFlBQVksQ0FBQztJQUNwQyxPQUFPLE1BQU0sSUFBSSxDQUFDLElBQUksTUFBTSxHQUFHLFdBQVc7UUFDeEMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUM7UUFDdkIsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7QUFDbkIsQ0FBQztBQUVELFNBQVMsUUFBUSxDQUFDLEtBQWEsRUFBRSxLQUFhO0lBQzVDLE1BQU0sTUFBTSxHQUFHLEtBQUssR0FBRyxZQUFZLENBQUM7SUFDcEMsSUFBSSxLQUFLLEdBQUcsT0FBTztRQUFFLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUM7U0FDMUMsSUFBSSxNQUFNLElBQUksQ0FBQyxJQUFJLE1BQU0sR0FBRyxXQUFXO1FBQUUsYUFBYSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQzs7UUFDdkUsTUFBTSxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLDZCQUE2QixDQUFDLENBQUM7QUFDN0UsQ0FBQztBQUVELE1BQU0sTUFBTSxHQUFHLENBQUMsS0FBYSxFQUFFLElBQVksRUFBRSxJQUFJLEdBQUcsQ0FBQyxFQUFFLEVBQUU7SUFDdkQsUUFBUSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFFLEVBQUUsSUFBSSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEQsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLHVCQUFVLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDOUMsTUFBTSxDQUFDLHVCQUFVLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDMUMsTUFBTSxDQUFDLHVCQUFVLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDaEQsTUFBTSxDQUFDLHVCQUFVLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDbEQsTUFBTSxDQUFDLHVCQUFVLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDakQsTUFBTSxDQUFDLHVCQUFVLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDbkQsTUFBTSxDQUFDLHVCQUFVLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDdkQsTUFBTSxDQUFDLHVCQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQzNELE1BQU0sQ0FBQyx1QkFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUMzRCxNQUFNLENBQUMsdUJBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDbkQsTUFBTSxDQUFDLHVCQUFVLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQy9ELE1BQU0sQ0FBQyx1QkFBVSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUMvRCxNQUFNLENBQUMsdUJBQVUsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDNUQsTUFBTSxDQUFDLHVCQUFVLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQzdELE1BQU0sQ0FBQyx1QkFBVSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNoRCxNQUFNLENBQUMsdUJBQVUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDbkQsTUFBTSxDQUFDLHVCQUFVLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBRXJELEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLHVCQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7SUFDcEUsTUFBTSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsRCxDQUFDO0FBQ0QsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsdUJBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztJQUNyRSxNQUFNLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xELENBQUM7QUFDRCxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyx1QkFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO0lBQ25FLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDbkQsQ0FBQztBQUNELEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLHVCQUFVLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7SUFDdEUsTUFBTSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwRCxDQUFDO0FBQ0QsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsdUJBQVUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztJQUN2RSxNQUFNLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BELENBQUM7QUFDRCxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyx1QkFBVSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO0lBQ3JFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDckQsQ0FBQztBQUNELEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLHVCQUFVLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7SUFDdEUsTUFBTSxJQUFJLEdBQ1IsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztJQUMxRSxNQUFNLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUMsQ0FBQztBQUVELHFFQUFxRTtBQUNyRSxLQUFLLE1BQU0sS0FBSyxJQUFJO0lBQ2xCLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTTtJQUMzRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU07SUFDdEUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU07Q0FDdkMsRUFBRSxDQUFDO0lBQ0YsUUFBUSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDOUIsQ0FBQztBQUVELE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQztBQUUxQyxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7QUFDaEIsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ1gsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsSUFBSSxJQUFJLEdBQVcsSUFBSSxDQUFDLEdBQUcsQ0FBQztBQUM1QixJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7QUFDYixJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7QUFFZCxTQUFTLElBQUk7SUFDWCxPQUFPLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDN0IsRUFBRSxHQUFHLEtBQUssQ0FBQztRQUNYLEtBQUssR0FBRyxNQUFNLENBQUMsV0FBVyxD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SUFBSSxDQUFDLFFBQVE7WUFDdEIsSUFBSSxLQUFLLElBQUksQ0FBQyxPQUFPO1lBQ3JCLElBQUksS0FBSyxJQUFJLENBQUMsUUFBUTtZQUN0QixJQUFJLEtBQUssSUFBSSxDQUFDLFVBQVU7WUFDdEIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO1lBQ25CLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNkLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakIsSUFBSSxJQUFJLEtBQUssSUFBSSxDQUFDLEdBQUc7WUFBRSxJQUFJLEVBQUUsQ0FBQztRQUM5QixPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7WUFBUyxDQUFDO1FBQ1QsTUFBTSxHQUFHLEVBQUUsQ0FBQztJQUNkLENBQUM7QUFDSCxDQUFDLENBQUM7QUF2QlcsUUFBQSxLQUFLLFNBdUJoQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNoYXJhY3RlcnMgfSBmcm9tICcuL2NoYXJhY3RlcnMnO1xuaW1wb3J0IHR5cGUgeyBKc29uIH0gZnJvbSAnLi9qc29uJztcbmltcG9ydCB7IE1BWF9ERVBUSCB9IGZyb20gJy4vbGltaXRzJztcblxuY29uc3QgS2luZCA9IHtcbiAgRU9GOiAwLFxuICBJbnZhbGlkOiAxLFxuICBTcGFjZTogMixcbiAgU3RhcnQ6IDMsXG4gIEVuZDogNCxcbiAgSW5kZW50OiA1LFxuICBPdXRkZW50OiA2LFxuICBPcGVuOiA3LFxuICBDbG9zZTogOCxcbiAgRGVsaW1pdDogOSxcbiAgS2V5Q2hhcjogMTAsXG4gIEtleVVwcGVyOiAxMSxcbiAgS2V5VW5pY29kZTogMTIsXG4gIEtleU5pYmJsZTogMTMsXG4gIEtleUVtcHR5OiAxNCxcbiAgVmFsdWVDaGFyOiAxNSxcbiAgVmFsdWVVcHBlcjogMTYsXG4gIFZhbHVlVW5pY29kZTogMTcsXG4gIFZhbHVlTmliYmxlOiAxOCxcbiAgVmFsdWVFbXB0eTogMTksXG4gIERpZ2l0OiAyMCxcbiAgRGVjaW1hbDogMjEsXG4gIEV4cG9uZW50OiAyMixcbiAgTmVnYXRpdmU6IDIzLFxuICBUcnVlOiAyNCxcbiAgRmFsc2U6IDI1LFxuICBOdWxsOiAyNixcbn0gYXMgY29uc3Q7XG5cbi8vIEVhY2ggdG9rZW4gaXMgYGtpbmQgfCBjb2RlIDw8IDhgLCBsb29rZWQgdXAgYnkgY29kZSBwb2ludCBpbiBhIHR5cGVkIGFycmF5OlxuLy8gb25lIGZvciB0aGUgQk1QICh3aGVyZSBzcGFjZXMgYW5kIGEgZmV3IGVtb2ppIGxpdmUpIGFuZCBvbmUgZm9yIHRoZSBibG9ja1xuLy8gb2YgYXN0cmFsIGVtb2ppLCBVKzFGMzAw4oCTVSsxRkFGRi4gVW5saXN0ZWQgY29kZSBwb2ludHMgc3RheSBJbnZhbGlkLlxuLy8gVGhpcyBtYWtlcyBwYXJzZSgpIDE54oCTMzElIGZhc3RlciB0aGFuIGEgTWFwIGRpZCAoc2VlIGJlbmNoL1JFU1VMVFMubWQpLlxuY29uc3QgQVNUUkFMX1NUQVJUID0gMHgxZjMwMDtcbmNvbnN0IEFTVFJBTF9TSVpFID0gMHg4MDA7XG5jb25zdCBCTVBfVE9LRU5TID0gbmV3IFVpbnQxNkFycmF5KDB4MTAwMDApLmZpbGwoS2luZC5JbnZhbGlkKTtcbmNvbnN0IEFTVFJBTF9UT0tFTlMgPSBuZXcgVWludDE2QXJyYXkoQVNUUkFMX1NJWkUpLmZpbGwoS2luZC5JbnZhbGlkKTtcblxuZnVuY3Rpb24gbG9va3VwKHBvaW50OiBudW1iZXIpOiBudW1iZXIge1xuICBpZiAocG9pbnQgPCAweDEwMDAwKSByZXR1cm4gQk1QX1RPS0VOU1twb2ludF07XG4gIGNvbnN0IG9mZnNldCA9IHBvaW50IC0gQVNUUkFMX1NUQVJUO1xuICByZXR1cm4gb2Zmc2V0ID49IDAgJiYgb2Zmc2V0IDwgQVNUUkFMX1NJWkVcbiAgICA/IEFTVFJBTF9UT0tFTlNbb2Zmc2V0XVxuICAgIDogS2luZC5JbnZhbGlkO1xufVxuXG5mdW5jdGlvbiBzZXRUb2tlbihwb2ludDogbnVtYmVyLCB0b2tlbjogbnVtYmVyKSB7XG4gIGNvbnN0IG9mZnNldCA9IHBvaW50IC0gQVNUUkFMX1NUQVJUO1xuICBpZiAocG9pbnQgPCAweDEwMDAwKSBCTVBfVE9LRU5TW3BvaW50XSA9IHRva2VuO1xuICBlbHNlIGlmIChvZmZzZXQgPj0gMCAmJiBvZmZzZXQgPCBBU1RSQUxfU0laRSkgQVNUUkFMX1RPS0VOU1tvZmZzZXRdID0gdG9rZW47XG4gIGVsc2UgdGhyb3cgbmV3IEVycm9yKGBVKyR7cG9pbnQudG9TdHJpbmcoMTYpfSBpcyBvdXRzaWRlIHRoZSB0b2tlbiB0YWJsZWApO1xufVxuXG5jb25zdCBkZWZpbmUgPSAoZW1vamk6IHN0cmluZywga2luZDogbnVtYmVyLCBjb2RlID0gMCkgPT4ge1xuICBzZXRUb2tlbihlbW9qaS5jb2RlUG9pbnRBdCgwKSEsIGtpbmQgfCAoY29kZSA8PCA4KSk7XG59O1xuXG5kZWZpbmUoY2hhcmFjdGVycy5kb2N1bWVudC5zdGFydCwgS2luZC5TdGFydCk7XG5kZWZpbmUoY2hhcmFjdGVycy5kb2N1bWVudC5lbmQsIEtpbmQuRW5kKTtcbmRlZmluZShjaGFyYWN0ZXJzLmRvY3VtZW50LmluZGVudCwgS2luZC5JbmRlbnQpO1xuZGVmaW5lKGNoYXJhY3RlcnMuZG9jdW1lbnQub3V0ZGVudCwgS2luZC5PdXRkZW50KTtcbmRlZmluZShjaGFyYWN0ZXJzLmRvY3VtZW50LmFycmF5T3BlbiwgS2luZC5PcGVuKTtcbmRlZmluZShjaGFyYWN0ZXJzLmRvY3VtZW50LmFycmF5Q2xvc2UsIEtpbmQuQ2xvc2UpO1xuZGVmaW5lKGNoYXJhY3RlcnMuZG9jdW1lbnQuYXJyYXlEZWxpbWl0LCBLaW5kLkRlbGltaXQpO1xuZGVmaW5lKGNoYXJhY3RlcnMua2V5cy5tb2RpZmllcnMudXBwZXJDYXNlLCBLaW5kLktleVVwcGVyKTtcbmRlZmluZShjaGFyYWN0ZXJzLmtleXMubW9kaWZpZXJzLnVuaWNvZGUsIEtpbmQuS2V5VW5pY29kZSk7XG5kZWZpbmUoY2hhcmFjdGVycy5rZXlzLm90aGVyLmVtcHR5LCBLaW5kLktleUVtcHR5KTtcbmRlZmluZShjaGFyYWN0ZXJzLnZhbHVlcy5tb2RpZmllcnMudXBwZXJDYXNlLCBLaW5kLlZhbHVlVXBwZXIpO1xuZGVmaW5lKGNoYXJhY3RlcnMudmFsdWVzLm1vZGlmaWVycy51bmljb2RlLCBLaW5kLlZhbHVlVW5pY29kZSk7XG5kZWZpbmUoY2hhcmFjdGVycy52YWx1ZXMubW9kaWZpZXJzLm5lZ2F0aXZlLCBLaW5kLk5lZ2F0aXZlKTtcbmRlZmluZShjaGFyYWN0ZXJzLnZhbHVlcy5vdGhlci5lbXB0eVN0cmluZywgS2luZC5WYWx1ZUVtcHR5KTtcbmRlZmluZShjaGFyYWN0ZXJzLnZhbHVlcy5vdGhlci5udWxsLCBLaW5kLk51bGwpO1xuZGVmaW5lKGNoYXJhY3RlcnMudmFsdWVzLmJvb2xlYW5zLnRydWUsIEtpbmQuVHJ1ZSk7XG5kZWZpbmUoY2hhcmFjdGVycy52YWx1ZXMuYm9vbGVhbnMuZmFsc2UsIEtpbmQuRmFsc2UpO1xuXG5mb3IgKGNvbnN0IFtjaGFyLCBlbW9qaV0gb2YgT2JqZWN0LmVudHJpZXMoY2hhcmFjdGVycy5rZXlzLmxldHRlcnMpKSB7XG4gIGRlZmluZShlbW9qaSwgS2luZC5LZXlDaGFyLCBjaGFyLmNoYXJDb2RlQXQoMCkpO1xufVxuZm9yIChjb25zdCBbY2hhciwgZW1vamldIG9mIE9iamVjdC5lbnRyaWVzKGNoYXJhY3RlcnMua2V5cy5udW1lcmFscykpIHtcbiAgZGVmaW5lKGVtb2ppLCBLaW5kLktleUNoYXIsIGNoYXIuY2hhckNvZGVBdCgwKSk7XG59XG5mb3IgKGNvbnN0IFtoZXgsIGVtb2ppXSBvZiBPYmplY3QuZW50cmllcyhjaGFyYWN0ZXJzLmtleXMudW5pY29kZSkpIHtcbiAgZGVmaW5lKGVtb2ppLCBLaW5kLktleU5pYmJsZSwgcGFyc2VJbnQoaGV4LCAxNikpO1xufVxuZm9yIChjb25zdCBbY2hhciwgZW1vamldIG9mIE9iamVjdC5lbnRyaWVzKGNoYXJhY3RlcnMudmFsdWVzLmxldHRlcnMpKSB7XG4gIGRlZmluZShlbW9qaSwgS2luZC5WYWx1ZUNoYXIsIGNoYXIuY2hhckNvZGVBdCgwKSk7XG59XG5mb3IgKGNvbnN0IFtjaGFyLCBlbW9qaV0gb2YgT2JqZWN0LmVudHJpZXMoY2hhcmFjdGVycy52YWx1ZXMubnVtZXJhbHMpKSB7XG4gIGRlZmluZShlbW9qaSwgS2luZC5WYWx1ZUNoYXIsIGNoYXIuY2hhckNvZGVBdCgwKSk7XG59XG5mb3IgKGNvbnN0IFtoZXgsIGVtb2ppXSBvZiBPYmplY3QuZW50cmllcyhjaGFyYWN0ZXJzLnZhbHVlcy51bmljb2RlKSkge1xuICBkZWZpbmUoZW1vamksIEtpbmQuVmFsdWVOaWJibGUsIHBhcnNlSW50KGhleCwgMTYpKTtcbn1cbmZvciAoY29uc3QgW2NoYXIsIGVtb2ppXSBvZiBPYmplY3QuZW50cmllcyhjaGFyYWN0ZXJzLnZhbHVlcy5udW1iZXJzKSkge1xuICBjb25zdCBraW5kID1cbiAgICBjaGFyID09PSAnLicgPyBLaW5kLkRlY2ltYWwgOiBjaGFyID09PSAnZScgPyBLaW5kLkV4cG9uZW50IDogS2luZC5EaWdpdDtcbiAgZGVmaW5lKGVtb2ppLCBraW5kLCBjaGFyLmNoYXJDb2RlQXQoMCkpO1xufVxuXG4vLyBldmVyeSAvXFxzLyBjaGFyYWN0ZXIsIHBsdXMgdGhlIHZhcmlhdGlvbiBzZWxlY3RvciBzb21lIGVtb2ppIGNhcnJ5XG5mb3IgKGNvbnN0IHNwYWNlIG9mIFtcbiAgMHg5LCAweGEsIDB4YiwgMHhjLCAweGQsIDB4MjAsIDB4YTAsIDB4MTY4MCwgMHgyMDAwLCAweDIwMDEsIDB4MjAwMiwgMHgyMDAzLFxuICAweDIwMDQsIDB4MjAwNSwgMHgyMDA2LCAweDIwMDcsIDB4MjAwOCwgMHgyMDA5LCAweDIwMGEsIDB4MjAyOCwgMHgyMDI5LFxuICAweDIwMmYsIDB4MjA1ZiwgMHgzMDAwLCAweGZlZmYsIDB4ZmUwZixcbl0pIHtcbiAgc2V0VG9rZW4oc3BhY2UsIEtpbmQuU3BhY2UpO1xufVxuXG5jb25zdCBPQkpFQ1RfUFJPVE9UWVBFID0gT2JqZWN0LnByb3RvdHlwZTtcblxubGV0IHNvdXJjZSA9ICcnO1xubGV0IGluZGV4ID0gMDtcbmxldCBhdCA9IDA7XG5sZXQgcG9pbnQgPSAwO1xubGV0IGtpbmQ6IG51bWJlciA9IEtpbmQuRU9GO1xubGV0IGNvZGUgPSAwO1xubGV0IGRlcHRoID0gMDtcblxuZnVuY3Rpb24gbmV4dCgpOiBudW1iZXIge1xuICB3aGlsZSAoaW5kZXggPCBzb3VyY2UubGVuZ3RoKSB7XG4gICAgYXQgPSBpbmRleDtcbiAgICBwb2ludCA9IHNvdXJjZS5jb2RlUG9pbnRBdChpbmRleCkhO1xuICAgIGluZGV4ICs9IHBvaW50ID4gMHhmZmZmID8gMiA6IDE7XG4gICAgY29uc3QgdG9rZW4gPSBsb29rdXAocG9pbnQpO1xuICAgIGlmICh0b2tlbiA9PT0gS2luZC5TcGFjZSkgY29udGludWU7XG4gICAga2luZCA9IHRva2VuICYgMHhmZjtcbiAgICBjb2RlID0gdG9rZW4gPj4gODtcbiAgICByZXR1cm4ga2luZDtcbiAgfVxuICBhdCA9IGluZGV4O1xuICBraW5kID0gS2luZC5FT0Y7XG4gIHJldHVybiBraW5kO1xufVxuXG5mdW5jdGlvbiBmYWlsKCk6IG5ldmVyIHtcbiAgaWYgKGtpbmQgPT09IEtpbmQuRU9GKSB7XG4gICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKCdVbmV4cGVjdGVkIGVuZCBvZiBFbW9qaW9uIGlucHV0Jyk7XG4gIH1cbiAgdGhyb3cgbmV3IFN5bnRheEVycm9yKFxuICAgIGBVbmV4cGVjdGVkIFwiJHtTdHJpbmcuZnJvbUNvZGVQb2ludChwb2ludCl9XCIgaW4gRW1vamlvbiBhdCBwb3NpdGlvbiAke2F0fWBcbiAgKTtcbn1cblxuZnVuY3Rpb24gbmVzdCgpIHtcbiAgaWYgKCsrZGVwdGggPiBNQVhfREVQVEgpIHtcbiAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoXG4gICAgICBgRW1vamlvbiBuZXN0aW5nIGV4Y2VlZHMgJHtNQVhfREVQVEh9IGxldmVscyBhdCBwb3NpdGlvbiAke2F0fWBcbiAgICApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGV4cGVjdChleHBlY3RlZDogbnVtYmVyKSB7XG4gIGlmIChraW5kICE9PSBleHBlY3RlZCkgZmFpbCgpO1xuICBuZXh0KCk7XG59XG5cbmZ1bmN0aW9uIHRleHQoXG4gIGNoYXI6IG51bWJlcixcbiAgdXBwZXI6IG51bWJlcixcbiAgdW5pY29kZTogbnVtYmVyLFxuICBuaWJibGU6IG51bWJlclxuKTogc3RyaW5nIHtcbiAgbGV0IG91dCA9ICcnO1xuICBmb3IgKDs7KSB7XG4gICAgaWYgKGtpbmQgPT09IGNoYXIpIHtcbiAgICAgIG91dCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGUpO1xuICAgICAgbmV4dCgpO1xuICAgIH0gZWxzZSBpZiAoa2luZCA9PT0gdXBwZXIpIHtcbiAgICAgIG5leHQoKTtcbiAgICAgIGlmIChraW5kICE9PSBjaGFyIHx8IGNvZGUgPCA5NykgZmFpbCgpO1xuICAgICAgb3V0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZSAtIDMyKTtcbiAgICAgIG5leHQoKTtcbiAgICB9IGVsc2UgaWYgKGtpbmQgPT09IHVuaWNvZGUpIHtcbiAgICAgIG5leHQoKTtcbiAgICAgIGlmIChraW5kICE9PSBuaWJibGUpIGZhaWwoKTtcbiAgICAgIC8vIFUrMTBGRkZGLCB0aGUgaGlnaGVzdCBjb2RlIHBvaW50LCBuZWVkcyBzaXggbmliYmxlcy5cbiAgICAgIGxldCB2YWx1ZSA9IDA7XG4gICAgICBsZXQgbmliYmxlcyA9IDA7XG4gICAgICBkbyB7XG4gICAgICAgIGlmICgrK25pYmJsZXMgPiA2KSBmYWlsKCk7XG4gICAgICAgIHZhbHVlID0gdmFsdWUgKiAxNiArIGNvZGU7XG4gICAgICAgIGlmICh2YWx1ZSA+IDB4MTBmZmZmKSBmYWlsKCk7XG4gICAgICAgIG5leHQoKTtcbiAgICAgIH0gd2hpbGUgKGtpbmQgPT09IG5pYmJsZSk7XG4gICAgICBvdXQgKz0gU3RyaW5nLmZyb21Db2RlUG9pbnQodmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gb3V0O1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBkaWdpdHMoKTogc3RyaW5nIHtcbiAgaWYgKGtpbmQgIT09IEtpbmQuRGlnaXQpIGZhaWwoKTtcbiAgbGV0IG91dCA9ICcnO1xuICBkbyB7XG4gICAgb3V0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZSk7XG4gICAgbmV4dCgpO1xuICB9IHdoaWxlIChraW5kID09PSBLaW5kLkRpZ2l0KTtcbiAgcmV0dXJuIG91dDtcbn1cblxuZnVuY3Rpb24gbnVtYmVyKCk6IG51bWJlciB7XG4gIGxldCBvdXQgPSAnJztcbiAgaWYgKGtpbmQgPT09IEtpbmQuTmVnYXRpdmUpIHtcbiAgICBvdXQgPSAnLSc7XG4gICAgbmV4dCgpO1xuICB9XG4gIGlmIChraW5kID09PSBLaW5kLkRpZ2l0ICYmIGNvZGUgPT09IDQ4KSB7XG4gICAgb3V0ICs9ICcwJztcbiAgICBuZXh0KCk7XG4gICAgaWYgKGtpbmQgPT09IEtpbmQuRGlnaXQpIGZhaWwoKTtcbiAgfSBlbHNlIHtcbiAgICBvdXQgKz0gZGlnaXRzKCk7XG4gIH1cbiAgaWYgKGtpbmQgPT09IEtpbmQuRGVjaW1hbCkge1xuICAgIG5leHQoKTtcbiAgICBvdXQgKz0gJy4nICsgZGlnaXRzKCk7XG4gIH1cbiAgaWYgKGtpbmQgPT09IEtpbmQuRXhwb25lbnQpIHtcbiAgICBpZiAobmV4dCgpID09PSBLaW5kLk5lZ2F0aXZlKSB7XG4gICAgICBvdXQgKz0gJ2UtJztcbiAgICAgIG5leHQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0ICs9ICdlJztcbiAgICB9XG4gICAgb3V0ICs9IGRpZ2l0cygpO1xuICB9XG4gIHJldHVybiBOdW1iZXIob3V0KTtcbn1cblxuZnVuY3Rpb24gbWVtYmVycyhjbG9zZTogbnVtYmVyKTogeyBba2V5OiBzdHJpbmddOiBKc29uIH0ge1xuICBjb25zdCBvdXQ6IHsgW2tleTogc3RyaW5nXTogSnNvbiB9ID0ge307XG4gIHdoaWxlIChraW5kICE9PSBjbG9zZSkge1xuICAgIGxldCBrZXkgPSAnJztcbiAgICBpZiAoa2luZCA9PT0gS2luZC5LZXlFbXB0eSkge1xuICAgICAgbmV4dCgpO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBraW5kID09PSBLaW5kLktleUNoYXIgfHxcbiAgICAgIGtpbmQgPT09IEtpbmQuS2V5VXBwZXIgfHxcbiAgICAgIGtpbmQgPT09IEtpbmQuS2V5VW5pY29kZVxuICAgICkge1xuICAgICAga2V5ID0gdGV4dChLaW5kLktleUNoYXIsIEtpbmQuS2V5VXBwZXIsIEtpbmQuS2V5VW5pY29kZSwgS2luZC5LZXlOaWJibGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmYWlsKCk7XG4gICAgfVxuICAgIGNvbnN0IGl0ZW0gPSB2YWx1ZSgpO1xuICAgIGlmIChrZXkgaW4gT0JKRUNUX1BST1RPVFlQRSkge1xuICAgICAgLy8gQXNzaWduaW5nIGEga2V5IHRoYXQgb3V0IGluaGVyaXRzIHdvdWxkIHJ1biBpdHMgc2V0dGVyIChfX3Byb3RvX19cbiAgICAgIC8vIHdvdWxkIHNldCB0aGUgcHJvdG90eXBlKSBvciBmYWlsIGlmIGl0IGlzIHJlYWQtb25seS4gRGVmaW5lIGl0IGFzXG4gICAgICAvLyBhbiBvd24gcHJvcGVydHkgaW5zdGVhZCwgYXMgSlNPTi5wYXJzZSgpIGRvZXMuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob3V0LCBrZXksIHtcbiAgICAgICAgdmFsdWU6IGl0ZW0sXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQSByZXBlYXRlZCBrZXkgb3ZlcndyaXRlcyB0aGUgZWFybGllciBvbmU6IHRoZSBsYXN0IHdpbnMuXG4gICAgICBvdXRba2V5XSA9IGl0ZW07XG4gICAgfVxuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbmZ1bmN0aW9uIGFycmF5KCk6IEpzb25bXSB7XG4gIGNvbnN0IG91dDogSnNvbltdID0gW107XG4gIGlmIChuZXh0KCkgPT09IEtpbmQuQ2xvc2UpIHtcbiAgICBuZXh0KCk7XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuICBvdXQucHVzaCh2YWx1ZSgpKTtcbiAgd2hpbGUgKGtpbmQgPT09IEtpbmQuRGVsaW1pdCkge1xuICAgIG5leHQoKTtcbiAgICBvdXQucHVzaCh2YWx1ZSgpKTtcbiAgfVxuICBleHBlY3QoS2luZC5DbG9zZSk7XG4gIHJldHVybiBvdXQ7XG59XG5cbmZ1bmN0aW9uIHZhbHVlKCk6IEpzb24ge1xuICBzd2l0Y2ggKGtpbmQpIHtcbiAgICBjYXNlIEtpbmQuSW5kZW50OiB7XG4gICAgICBuZXN0KCk7XG4gICAgICBuZXh0KCk7XG4gICAgICBjb25zdCBvdXQgPSBtZW1iZXJzKEtpbmQuT3V0ZGVudCk7XG4gICAgICBuZXh0KCk7XG4gICAgICBkZXB0aC0tO1xuICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG4gICAgY2FzZSBLaW5kLk9wZW46IHtcbiAgICAgIG5lc3QoKTtcbiAgICAgIGNvbnN0IG91dCA9IGFycmF5KCk7XG4gICAgICBkZXB0aC0tO1xuICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG4gICAgY2FzZSBLaW5kLlRydWU6XG4gICAgICBuZXh0KCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBjYXNlIEtpbmQuRmFsc2U6XG4gICAgICBuZXh0KCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgY2FzZSBLaW5kLk51bGw6XG4gICAgICBuZXh0KCk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICBjYXNlIEtpbmQuVmFsdWVFbXB0eTpcbiAgICAgIG5leHQoKTtcbiAgICAgIHJldHVybiAnJztcbiAgICBjYXNlIEtpbmQuTmVnYXRpdmU6XG4gICAgY2FzZSBLaW5kLkRpZ2l0OlxuICAgICAgcmV0dXJuIG51bWJlcigpO1xuICAgIGNhc2UgS2luZC5WYWx1ZUNoYXI6XG4gICAgY2FzZSBLaW5kLlZhbHVlVXBwZXI6XG4gICAgY2FzZSBLaW5kLlZhbHVlVW5pY29kZTpcbiAgICAgIHJldHVybiB0ZXh0KFxuICAgICAgICBLaW5kLlZhbHVlQ2hhcixcbiAgICAgICAgS2luZC5WYWx1ZVVwcGVyLFxuICAgICAgICBLaW5kLlZhbHVlVW5pY29kZSxcbiAgICAgICAgS2luZC5WYWx1ZU5pYmJsZVxuICAgICAgKTtcbiAgfVxuICByZXR1cm4gZmFpbCgpO1xufVxuXG4vKipcbiAqIFBhcnNlIGFuIEVtb2ppb24gZG9jdW1lbnQgaW50byB0aGUgdmFsdWUgaXQgaG9sZHMsIGFzIGBKU09OLnBhcnNlKClgIHBhcnNlc1xuICogSlNPTiB0ZXh0LlxuICpcbiAqIE9iamVjdHMgY29tZSBiYWNrIGFzIHBsYWluIG9iamVjdHMgYW5kIGFycmF5cyBhcyBwbGFpbiBhcnJheXMuIEEga2V5IHRoYXRcbiAqIGBPYmplY3QucHJvdG90eXBlYCBoYXMsIHN1Y2ggYXMgYF9fcHJvdG9fX2AsIGJlY29tZXMgYW4gb3JkaW5hcnkgb3duXG4gKiBwcm9wZXJ0eSBhbmQgbmV2ZXIgY2hhbmdlcyB0aGUgcHJvdG90eXBlLiBXaGVuIGEga2V5IHJlcGVhdHMsIHRoZSBsYXN0XG4gKiB2YWx1ZSB3aW5zLlxuICpcbiAqIEBwYXJhbSBlbW9qaW9uIC0gVGhlIGRvY3VtZW50LCBmcm9tIGDwn5mMYCB0byBg4pyLYC4gV2hpdGVzcGFjZSBhbmQgVStGRTBGXG4gKiB2YXJpYXRpb24gc2VsZWN0b3JzIGFueXdoZXJlIGluIGl0IGFyZSBpZ25vcmVkLlxuICogQHJldHVybnMgVGhlIG9iamVjdCwgYXJyYXksIHN0cmluZywgbnVtYmVyLCBib29sZWFuIG9yIGBudWxsYCBpdCBob2xkcy5cbiAqIEB0aHJvd3Mge1N5bnRheEVycm9yfSBJZiB0aGUgZG9jdW1lbnQgaXMgbm90IHZhbGlkIEVtb2ppb24sIG5hbWluZyB0aGVcbiAqIHVuZXhwZWN0ZWQgZW1vamkgYW5kIGl0cyBwb3NpdGlvbiwgb3IgaWYgaXQgbmVzdHMgYXJyYXlzIGFuZCBvYmplY3RzIG1vcmVcbiAqIHRoYW4gNTEyIGxldmVscyBkZWVwLlxuICpcbiAqIEBleGFtcGxlXG4gKiBwYXJzZSgn8J+ZjPCfmLbwn5ig8J+kkfCfmLPwn5Gh8J+QmPCfkIHwn6aJ8J+mkvCfkJbwn6aJ8J+mj+KciycpO1xuICogLy89PiB7IG5hbWU6ICdFbW9qaW9uJyB9XG4gKlxuICogQGV4YW1wbGVcbiAqIHBhcnNlKCfwn5mM8J+knPCflZDwn6Sd8J+SmvCfpJ3wn5Wz8J+km+KciycpO1xuICogLy89PiBbMSwgdHJ1ZSwgbnVsbF1cbiAqL1xuZXhwb3J0IGNvbnN0IHBhcnNlID0gKGVtb2ppb246IHN0cmluZyk6IEpzb24gPT4ge1xuICBzb3VyY2UgPSBlbW9qaW9uO1xuICBpbmRleCA9IDA7XG4gIGRlcHRoID0gMDtcbiAgdHJ5IHtcbiAgICBuZXh0KCk7XG4gICAgZXhwZWN0KEtpbmQuU3RhcnQpO1xuICAgIC8vIEEgdG9wLWxldmVsIG9iamVjdCBpcyB3cml0dGVuIHdpdGhvdXQg8J+RifCfkYguXG4gICAgaWYgKGtpbmQgPT09IEtpbmQuSW5kZW50KSBmYWlsKCk7XG4gICAgY29uc3Qgb3V0ID1cbiAgICAgIGtpbmQgPT09IEtpbmQuRW5kIHx8XG4gICAgICBraW5kID09PSBLaW5kLktleUVtcHR5IHx8XG4gICAgICBraW5kID09PSBLaW5kLktleUNoYXIgfHxcbiAgICAgIGtpbmQgPT09IEtpbmQuS2V5VXBwZXIgfHxcbiAgICAgIGtpbmQgPT09IEtpbmQuS2V5VW5pY29kZVxuICAgICAgICA/IG1lbWJlcnMoS2luZC5FbmQpXG4gICAgICAgIDogdmFsdWUoKTtcbiAgICBleHBlY3QoS2luZC5FbmQpO1xuICAgIGlmIChraW5kICE9PSBLaW5kLkVPRikgZmFpbCgpO1xuICAgIHJldHVybiBvdXQ7XG4gIH0gZmluYWxseSB7XG4gICAgc291cmNlID0gJyc7XG4gIH1cbn07XG4iXX0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "emj",
3
- "version": "0.0.11",
3
+ "version": "0.2.0",
4
4
  "description": "Emoji Object Notation",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -18,59 +18,54 @@
18
18
  "files": [
19
19
  "lib"
20
20
  ],
21
- "main": "lib/src/index.js",
21
+ "main": "lib/index.js",
22
+ "types": "lib/index.d.ts",
22
23
  "scripts": {
23
24
  "clean": "rimraf lib && rimraf coverage",
24
25
  "format": "prettier --write \"src/**/*.ts\" \"test/**/*.{ts,cjs}\" README.md",
25
26
  "format:check": "prettier --check \"src/**/*.ts\" \"test/**/*.{ts,cjs}\" README.md",
26
27
  "lint": "eslint src/**/*.ts",
27
28
  "prebuild": "npm run clean && npm run format:check && npm run lint && echo Using TypeScript && tsc --version",
28
- "build": "npm run build:grammar && npm run build:lib && npm run build:bundle",
29
- "build:grammar": "mkdir -p gen && nearleyc src/grammar.ne -o gen/grammar.ts && replace-in-file \"Lexer: lexer,\" \"// @ts-ignore\nLexer: lexer,\" gen/grammar.ts",
29
+ "build": "npm run build:lib && npm run build:bundle",
30
30
  "build:bundle": "npm run rollup",
31
31
  "build:lib": "tsc --pretty",
32
32
  "start": "npm run build && npm run test",
33
- "test": "npm run build:grammar && vitest run --allowOnly=false",
33
+ "test": "vitest run --allowOnly=false",
34
34
  "test:consumer": "node test/consumer-smoke.cjs .",
35
- "coverage": "npm run build:grammar && vitest run --coverage",
35
+ "coverage": "vitest run --coverage",
36
36
  "update": "ncu -u && npm i && npm test",
37
37
  "rollup": "rollup --config rollup.config.mjs",
38
38
  "watch": "npm run build -- --watch",
39
- "watch:test": "vitest"
40
- },
41
- "dependencies": {
42
- "lodash": "^4.18.1",
43
- "moo": "^0.5.3",
44
- "nearley": "^2.20.1"
39
+ "watch:test": "vitest",
40
+ "bench": "npm run build:lib && node --expose-gc bench/index.mjs",
41
+ "bench:ab": "node bench/ab.mjs"
45
42
  },
46
43
  "devDependencies": {
47
- "@emnapi/core": "^1.10.0",
48
- "@emnapi/runtime": "^1.10.0",
44
+ "@emnapi/core": "^1.11.3",
45
+ "@emnapi/runtime": "^1.11.3",
49
46
  "@eslint/js": "^10.0.1",
50
- "@rollup/plugin-commonjs": "^29.0.2",
51
- "@rollup/plugin-node-resolve": "^16.0.3",
52
- "@rollup/plugin-typescript": "^12.3.0",
53
- "@types/lodash": "^4.17.24",
54
- "@types/moo": "^0.5.10",
55
- "@types/nearley": "^2.11.5",
56
- "@types/node": "^26.1.1",
57
- "@typescript-eslint/eslint-plugin": "^8.59.2",
58
- "@typescript-eslint/parser": "^8.59.2",
59
- "@vitest/coverage-v8": "^4.1.8",
60
- "eslint": "^10.3.0",
47
+ "@rollup/plugin-typescript": "^12.3.1",
48
+ "@types/node": "^26.6.6",
49
+ "@typescript-eslint/eslint-plugin": "^8.72.2",
50
+ "@typescript-eslint/parser": "^8.72.2",
51
+ "@vitest/coverage-v8": "^5.1.0",
52
+ "eslint": "^10.14.0",
61
53
  "eslint-config-prettier": "^10.1.8",
62
- "eslint-plugin-prettier": "^5.5.5",
63
- "globals": "^17.6.0",
64
- "npm-check-updates": "^23.0.0",
65
- "prettier": "^3.9.6",
66
- "replace-in-file": "^9.0.0",
67
- "rimraf": "^6.1.3",
68
- "rollup": "^4.60.3",
69
- "tslib": "^2.8.1",
54
+ "eslint-plugin-prettier": "^5.5.7",
55
+ "globals": "^17.14.0",
56
+ "mitata": "^1.0.34",
57
+ "npm-check-updates": "^23.1.1",
58
+ "prettier": "^3.10.0",
59
+ "rimraf": "^6.1.4",
60
+ "rollup": "^4.68.2",
61
+ "tslib": "^2.9.1",
70
62
  "typescript": "^6.0.3",
71
- "vitest": "^4.1.8"
63
+ "vitest": "^5.1.0"
72
64
  },
73
65
  "engines": {
74
66
  "node": ">=10.0.0"
67
+ },
68
+ "overrides": {
69
+ "minimatch": "^11.0.1"
75
70
  }
76
71
  }