mevento 1.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.
- package/README.md +24 -0
- package/esm2020/lib/mevento.mjs +1560 -0
- package/esm2020/mevento.mjs +5 -0
- package/esm2020/public-api.mjs +5 -0
- package/fesm2015/mevento.mjs +1619 -0
- package/fesm2015/mevento.mjs.map +1 -0
- package/fesm2020/mevento.mjs +1570 -0
- package/fesm2020/mevento.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/mevento.d.ts +169 -0
- package/package.json +27 -0
- package/public-api.d.ts +1 -0
|
@@ -0,0 +1,1560 @@
|
|
|
1
|
+
function error(token) {
|
|
2
|
+
const text = `Invalid token ${token.type}[${token.value}] at ${token.line}, ${token.col}\n`;
|
|
3
|
+
throw (text);
|
|
4
|
+
}
|
|
5
|
+
function isNum(value) {
|
|
6
|
+
return typeof value === 'number';
|
|
7
|
+
}
|
|
8
|
+
function isBoolean(value) {
|
|
9
|
+
return typeof value === 'boolean';
|
|
10
|
+
}
|
|
11
|
+
function isString(value) {
|
|
12
|
+
return typeof value === 'string';
|
|
13
|
+
}
|
|
14
|
+
function _boolValue(test) {
|
|
15
|
+
return test !== null &&
|
|
16
|
+
((isNum(test) && test !== 0) ||
|
|
17
|
+
(isString(test) && test.length > 0) ||
|
|
18
|
+
(isBoolean(test) && test));
|
|
19
|
+
}
|
|
20
|
+
;
|
|
21
|
+
function hashCode(str) {
|
|
22
|
+
let hash = 0;
|
|
23
|
+
let i = 0;
|
|
24
|
+
let chr;
|
|
25
|
+
if (str.length === 0)
|
|
26
|
+
return hash;
|
|
27
|
+
for (i = 0; i < str.length; i++) {
|
|
28
|
+
chr = str.charCodeAt(i);
|
|
29
|
+
// tslint:disable-next-line:no-bitwise
|
|
30
|
+
hash = ((hash << 5) - hash) + chr;
|
|
31
|
+
// tslint:disable-next-line:no-bitwise
|
|
32
|
+
hash |= 0; // Convert to 32bit integer
|
|
33
|
+
}
|
|
34
|
+
return hash;
|
|
35
|
+
}
|
|
36
|
+
;
|
|
37
|
+
class TokenType {
|
|
38
|
+
}
|
|
39
|
+
TokenType.id = 0;
|
|
40
|
+
TokenType.comma = 1;
|
|
41
|
+
TokenType.semi = 2;
|
|
42
|
+
TokenType.numberConst = 3;
|
|
43
|
+
TokenType.stringConst = 4;
|
|
44
|
+
TokenType.equal = 5;
|
|
45
|
+
TokenType.lparen = 6;
|
|
46
|
+
TokenType.rparen = 7;
|
|
47
|
+
TokenType.eol = 8;
|
|
48
|
+
TokenType.eof = 9;
|
|
49
|
+
TokenType.lbrace = 10;
|
|
50
|
+
TokenType.rbrace = 11;
|
|
51
|
+
TokenType.lbracket = 12;
|
|
52
|
+
TokenType.rbracket = 13;
|
|
53
|
+
TokenType.great = 14;
|
|
54
|
+
TokenType.greatEq = 15;
|
|
55
|
+
TokenType.less = 16;
|
|
56
|
+
TokenType.lessEq = 17;
|
|
57
|
+
TokenType.eqeq = 18;
|
|
58
|
+
TokenType.IF = 19;
|
|
59
|
+
TokenType.ELSE = 20;
|
|
60
|
+
TokenType.TRUE = 21;
|
|
61
|
+
TokenType.FALSE = 22;
|
|
62
|
+
TokenType.NULL = 23;
|
|
63
|
+
TokenType.not = 24;
|
|
64
|
+
TokenType.notEq = 25;
|
|
65
|
+
TokenType.and = 26;
|
|
66
|
+
TokenType.or = 27;
|
|
67
|
+
TokenType.plus = 28;
|
|
68
|
+
TokenType.minus = 29;
|
|
69
|
+
TokenType.div = 30;
|
|
70
|
+
TokenType.mult = 31;
|
|
71
|
+
TokenType.mod = 32;
|
|
72
|
+
TokenType.invalid = 33;
|
|
73
|
+
TokenType.colon = 34;
|
|
74
|
+
class Token {
|
|
75
|
+
constructor(type, value, line = 1, col = 1) {
|
|
76
|
+
this.type = type;
|
|
77
|
+
this.value = value;
|
|
78
|
+
this.line = line;
|
|
79
|
+
this.col = col;
|
|
80
|
+
}
|
|
81
|
+
static from(type, value) {
|
|
82
|
+
return new Token(type, value);
|
|
83
|
+
}
|
|
84
|
+
toString() {
|
|
85
|
+
return `[${this.type.toString()}, ${this.value}]`;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
class Chars {
|
|
89
|
+
}
|
|
90
|
+
Chars.equal = '='.charCodeAt(0);
|
|
91
|
+
Chars.comma = ','.charCodeAt(0);
|
|
92
|
+
Chars.semiColon = ';'.charCodeAt(0);
|
|
93
|
+
Chars.lparen = '('.charCodeAt(0);
|
|
94
|
+
Chars.rparen = ')'.charCodeAt(0);
|
|
95
|
+
Chars.backslash = '\\'.charCodeAt(0);
|
|
96
|
+
Chars.quote = '"'.charCodeAt(0);
|
|
97
|
+
Chars.squote = "'".charCodeAt(0);
|
|
98
|
+
Chars.plus = "+".charCodeAt(0);
|
|
99
|
+
Chars.minus = "-".charCodeAt(0);
|
|
100
|
+
Chars.star = "*".charCodeAt(0);
|
|
101
|
+
Chars.slash = "/".charCodeAt(0);
|
|
102
|
+
Chars.percent = "%".charCodeAt(0);
|
|
103
|
+
Chars.lbrace = "{".charCodeAt(0);
|
|
104
|
+
Chars.rbrace = "}".charCodeAt(0);
|
|
105
|
+
Chars.lbracket = "[".charCodeAt(0);
|
|
106
|
+
Chars.rbracket = "]".charCodeAt(0);
|
|
107
|
+
Chars.not = "!".charCodeAt(0);
|
|
108
|
+
Chars.great = ">".charCodeAt(0);
|
|
109
|
+
Chars.less = "<".charCodeAt(0);
|
|
110
|
+
Chars.and = "&".charCodeAt(0);
|
|
111
|
+
Chars.pipe = "|".charCodeAt(0);
|
|
112
|
+
Chars.colon = ":".charCodeAt(0);
|
|
113
|
+
class LexerDictionary {
|
|
114
|
+
constructor(lang, keywords) {
|
|
115
|
+
this.keywords = {};
|
|
116
|
+
this.keywords = { ...keywords };
|
|
117
|
+
this.lang = lang;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Lexing => Parsing ===> AST ===> Walking
|
|
122
|
+
*/
|
|
123
|
+
/**
|
|
124
|
+
* Lexer
|
|
125
|
+
*/
|
|
126
|
+
class Lexer {
|
|
127
|
+
constructor(source) {
|
|
128
|
+
this._position = 0;
|
|
129
|
+
this._line = 1;
|
|
130
|
+
this._col = 1;
|
|
131
|
+
this._currentChar = -1;
|
|
132
|
+
this._source = source;
|
|
133
|
+
this._currentChar = this._source[this._position].charCodeAt(0);
|
|
134
|
+
this._resolveLanguage();
|
|
135
|
+
}
|
|
136
|
+
get source() {
|
|
137
|
+
return this._source;
|
|
138
|
+
}
|
|
139
|
+
_resolveLanguage() {
|
|
140
|
+
let token = this.nextToken();
|
|
141
|
+
if (token.type === TokenType.less) {
|
|
142
|
+
// language setting
|
|
143
|
+
const idToken = this.nextToken();
|
|
144
|
+
if (idToken.type !== TokenType.id) {
|
|
145
|
+
error(token);
|
|
146
|
+
}
|
|
147
|
+
const lang = idToken.value.toString();
|
|
148
|
+
this._language = Lexer.languages.find((element) => element.lang === lang) || Lexer._defaultLanguage;
|
|
149
|
+
token = this.nextToken();
|
|
150
|
+
if (token.type !== TokenType.great) {
|
|
151
|
+
error(token);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
this._language = Lexer._defaultLanguage;
|
|
156
|
+
// reset reading
|
|
157
|
+
this._position = 0;
|
|
158
|
+
this._currentChar = this._source[this._position].charCodeAt(0);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
_advance() {
|
|
162
|
+
this._position++;
|
|
163
|
+
if (this._position >= this._source.length) {
|
|
164
|
+
this._currentChar = -1;
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
this._currentChar = this._source[this._position].charCodeAt(0);
|
|
168
|
+
this._col++;
|
|
169
|
+
}
|
|
170
|
+
_pick() {
|
|
171
|
+
if (this._position >= this._source.length) {
|
|
172
|
+
return -1;
|
|
173
|
+
}
|
|
174
|
+
return this._source[this._position].charCodeAt(0);
|
|
175
|
+
}
|
|
176
|
+
_isId(code) {
|
|
177
|
+
if (code < 48) {
|
|
178
|
+
return code === 36;
|
|
179
|
+
}
|
|
180
|
+
if (code < 58) {
|
|
181
|
+
return true;
|
|
182
|
+
}
|
|
183
|
+
if (code < 65) {
|
|
184
|
+
return false;
|
|
185
|
+
}
|
|
186
|
+
if (code < 91) {
|
|
187
|
+
return true;
|
|
188
|
+
}
|
|
189
|
+
if (code < 97) {
|
|
190
|
+
return code === 95;
|
|
191
|
+
}
|
|
192
|
+
if (code < 123) {
|
|
193
|
+
return true;
|
|
194
|
+
}
|
|
195
|
+
return false;
|
|
196
|
+
}
|
|
197
|
+
_isIdStart(code) {
|
|
198
|
+
if (code < 65) {
|
|
199
|
+
return code === 36;
|
|
200
|
+
}
|
|
201
|
+
if (code < 91) {
|
|
202
|
+
return true;
|
|
203
|
+
}
|
|
204
|
+
if (code < 97) {
|
|
205
|
+
return code === 95;
|
|
206
|
+
}
|
|
207
|
+
if (code < 123) {
|
|
208
|
+
return true;
|
|
209
|
+
}
|
|
210
|
+
return false;
|
|
211
|
+
}
|
|
212
|
+
_id() {
|
|
213
|
+
let ret = "";
|
|
214
|
+
const lastC = this._col;
|
|
215
|
+
const lastP = this._position;
|
|
216
|
+
const line = this._line;
|
|
217
|
+
while (this._isId(this._currentChar)) {
|
|
218
|
+
ret += String.fromCharCode(this._currentChar);
|
|
219
|
+
this._advance();
|
|
220
|
+
}
|
|
221
|
+
const translatedId = this._language
|
|
222
|
+
? (this._language.keywords[ret]) || ret
|
|
223
|
+
: ret;
|
|
224
|
+
return Lexer.RESERVED[translatedId] || new Token(TokenType.id, ret, line, lastC);
|
|
225
|
+
}
|
|
226
|
+
_isLineEnd(c) {
|
|
227
|
+
return c === 10 ||
|
|
228
|
+
c === 13 ||
|
|
229
|
+
['\n', '\r', '\u2028', '\u2029'].includes(String.fromCharCode(c));
|
|
230
|
+
}
|
|
231
|
+
_isWhiteSpace(c) {
|
|
232
|
+
return String.fromCharCode(c).trim() === "" &&
|
|
233
|
+
String.fromCharCode(c).length > 0;
|
|
234
|
+
}
|
|
235
|
+
_isDigit(c) {
|
|
236
|
+
// tslint:disable-next-line:no-bitwise
|
|
237
|
+
return c > 0 && (c ^ 0x30) <= 9;
|
|
238
|
+
}
|
|
239
|
+
_skipWhiteSpace() {
|
|
240
|
+
while (this._isWhiteSpace(this._currentChar) === true) {
|
|
241
|
+
this._advance();
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
_number() {
|
|
245
|
+
let ret = "";
|
|
246
|
+
const lastC = this._col;
|
|
247
|
+
const lastP = this._position;
|
|
248
|
+
const line = this._line;
|
|
249
|
+
const first = String.fromCharCode(this._currentChar);
|
|
250
|
+
this._advance();
|
|
251
|
+
const bc = String.fromCharCode(this._currentChar);
|
|
252
|
+
let base = 10;
|
|
253
|
+
if (first === '0' && ['b', 'B', 'x', 'X', 'o', 'O'].includes(bc)) {
|
|
254
|
+
// look ahead to see that the number is tagged
|
|
255
|
+
this._advance();
|
|
256
|
+
switch (bc.toLowerCase()) {
|
|
257
|
+
case 'b':
|
|
258
|
+
base = 2;
|
|
259
|
+
break;
|
|
260
|
+
case "o":
|
|
261
|
+
base = 8;
|
|
262
|
+
break;
|
|
263
|
+
case "x":
|
|
264
|
+
base = 16;
|
|
265
|
+
break;
|
|
266
|
+
default:
|
|
267
|
+
base = 10;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
else {
|
|
271
|
+
ret += first;
|
|
272
|
+
base = 10;
|
|
273
|
+
}
|
|
274
|
+
while (this._isDigit(this._currentChar) ||
|
|
275
|
+
(base === 16 &&
|
|
276
|
+
['A', 'a', 'B', 'b', 'C', 'c', 'D', 'd', 'E', 'e', 'F', 'f']
|
|
277
|
+
.includes(String.fromCharCode(this._currentChar)))) {
|
|
278
|
+
ret += String.fromCharCode(this._currentChar);
|
|
279
|
+
this._advance();
|
|
280
|
+
}
|
|
281
|
+
if (String.fromCharCode(this._currentChar) === '.' && this._isDigit(this._pick()) === true) {
|
|
282
|
+
if (base !== 10) {
|
|
283
|
+
error(new Token(TokenType.id, bc, line, lastP));
|
|
284
|
+
}
|
|
285
|
+
// floating number
|
|
286
|
+
ret += String.fromCharCode(this._currentChar);
|
|
287
|
+
this._advance();
|
|
288
|
+
while (this._isDigit(this._currentChar)) {
|
|
289
|
+
ret += String.fromCharCode(this._currentChar);
|
|
290
|
+
this._advance();
|
|
291
|
+
}
|
|
292
|
+
return new Token(TokenType.numberConst, parseFloat(ret), line, lastC);
|
|
293
|
+
}
|
|
294
|
+
return new Token(TokenType.numberConst, parseInt(ret, base), line, lastC);
|
|
295
|
+
}
|
|
296
|
+
_literalString(startChar) {
|
|
297
|
+
let ret = "";
|
|
298
|
+
let lastChar = -1;
|
|
299
|
+
const lastP = this._position;
|
|
300
|
+
const lastC = this._col;
|
|
301
|
+
const lastL = this._line;
|
|
302
|
+
while (this._currentChar !== -1) {
|
|
303
|
+
const next = String.fromCharCode(this._pick());
|
|
304
|
+
if (this._currentChar === Chars.backslash) {
|
|
305
|
+
// scape char
|
|
306
|
+
if ([
|
|
307
|
+
startChar,
|
|
308
|
+
'\\',
|
|
309
|
+
'0',
|
|
310
|
+
'a',
|
|
311
|
+
'b',
|
|
312
|
+
'e',
|
|
313
|
+
'f',
|
|
314
|
+
'n',
|
|
315
|
+
'r',
|
|
316
|
+
't',
|
|
317
|
+
'u',
|
|
318
|
+
'U',
|
|
319
|
+
'v',
|
|
320
|
+
'x'
|
|
321
|
+
].includes(next)) {
|
|
322
|
+
lastChar = this._currentChar;
|
|
323
|
+
this._advance();
|
|
324
|
+
continue;
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
if (this._currentChar === startChar && lastChar !== Chars.backslash) {
|
|
328
|
+
// end
|
|
329
|
+
break;
|
|
330
|
+
}
|
|
331
|
+
ret += String.fromCharCode(this._currentChar);
|
|
332
|
+
lastChar = this._currentChar;
|
|
333
|
+
this._advance();
|
|
334
|
+
}
|
|
335
|
+
return new Token(TokenType.stringConst, ret, lastL, lastC);
|
|
336
|
+
}
|
|
337
|
+
// f=SUBMIT_FORM(xxx);
|
|
338
|
+
// r = CALL_API(API_ID, f);
|
|
339
|
+
// DISPLAY("MSG #r")
|
|
340
|
+
nextToken() {
|
|
341
|
+
const lastL = this._line;
|
|
342
|
+
const lastC = this._col;
|
|
343
|
+
const lastP = this._position;
|
|
344
|
+
while (this._currentChar !== -1) {
|
|
345
|
+
if (this._isLineEnd(this._currentChar)) {
|
|
346
|
+
this._line++;
|
|
347
|
+
this._col = 1;
|
|
348
|
+
this._advance();
|
|
349
|
+
return new Token(TokenType.eol, "\n", lastL, lastC);
|
|
350
|
+
}
|
|
351
|
+
if (this._isWhiteSpace(this._currentChar)) {
|
|
352
|
+
this._skipWhiteSpace();
|
|
353
|
+
continue;
|
|
354
|
+
}
|
|
355
|
+
if (this._isDigit(this._currentChar)) {
|
|
356
|
+
return this._number();
|
|
357
|
+
}
|
|
358
|
+
if (this._isIdStart(this._currentChar)) {
|
|
359
|
+
return this._id();
|
|
360
|
+
}
|
|
361
|
+
if (this._currentChar === Chars.equal) {
|
|
362
|
+
this._advance();
|
|
363
|
+
if (this._currentChar === Chars.equal) {
|
|
364
|
+
this._advance();
|
|
365
|
+
return new Token(TokenType.eqeq, "==", lastL, lastC);
|
|
366
|
+
}
|
|
367
|
+
return new Token(TokenType.equal, "=", lastL, lastC);
|
|
368
|
+
}
|
|
369
|
+
if (this._currentChar === Chars.great) {
|
|
370
|
+
this._advance();
|
|
371
|
+
if (this._currentChar === Chars.equal) {
|
|
372
|
+
this._advance();
|
|
373
|
+
return new Token(TokenType.greatEq, ">=", lastL, lastC);
|
|
374
|
+
}
|
|
375
|
+
return new Token(TokenType.great, ">", lastL, lastC);
|
|
376
|
+
}
|
|
377
|
+
if (this._currentChar === Chars.less) {
|
|
378
|
+
this._advance();
|
|
379
|
+
if (this._currentChar === Chars.equal) {
|
|
380
|
+
this._advance();
|
|
381
|
+
return new Token(TokenType.lessEq, "<=", lastL, lastC);
|
|
382
|
+
}
|
|
383
|
+
return new Token(TokenType.less, "<", lastL, lastC);
|
|
384
|
+
}
|
|
385
|
+
if (this._currentChar === Chars.semiColon) {
|
|
386
|
+
this._advance();
|
|
387
|
+
return new Token(TokenType.semi, ";", lastL, lastC);
|
|
388
|
+
}
|
|
389
|
+
if (this._currentChar === Chars.lparen) {
|
|
390
|
+
this._advance();
|
|
391
|
+
return new Token(TokenType.lparen, "(", lastL, lastC);
|
|
392
|
+
}
|
|
393
|
+
if (this._currentChar === Chars.rparen) {
|
|
394
|
+
this._advance();
|
|
395
|
+
return new Token(TokenType.rparen, ")", lastL, lastC);
|
|
396
|
+
}
|
|
397
|
+
if (this._currentChar === Chars.comma) {
|
|
398
|
+
this._advance();
|
|
399
|
+
return new Token(TokenType.comma, ",", lastL, lastC);
|
|
400
|
+
}
|
|
401
|
+
if (this._currentChar === Chars.lbrace) {
|
|
402
|
+
this._advance();
|
|
403
|
+
return new Token(TokenType.lbrace, "{", lastL, lastC);
|
|
404
|
+
}
|
|
405
|
+
if (this._currentChar === Chars.rbrace) {
|
|
406
|
+
this._advance();
|
|
407
|
+
return new Token(TokenType.rbrace, "}", lastL, lastC);
|
|
408
|
+
}
|
|
409
|
+
if (this._currentChar === Chars.lbracket) {
|
|
410
|
+
this._advance();
|
|
411
|
+
return new Token(TokenType.lbracket, "[", lastL, lastC);
|
|
412
|
+
}
|
|
413
|
+
if (this._currentChar === Chars.rbracket) {
|
|
414
|
+
this._advance();
|
|
415
|
+
return new Token(TokenType.rbracket, "]", lastL, lastC);
|
|
416
|
+
}
|
|
417
|
+
if (this._currentChar === Chars.plus) {
|
|
418
|
+
this._advance();
|
|
419
|
+
return new Token(TokenType.plus, "+", lastL, lastC);
|
|
420
|
+
}
|
|
421
|
+
if (this._currentChar === Chars.minus) {
|
|
422
|
+
this._advance();
|
|
423
|
+
return new Token(TokenType.minus, "-", lastL, lastC);
|
|
424
|
+
}
|
|
425
|
+
if (this._currentChar === Chars.slash) {
|
|
426
|
+
this._advance();
|
|
427
|
+
return new Token(TokenType.div, "/", lastL, lastC);
|
|
428
|
+
}
|
|
429
|
+
if (this._currentChar === Chars.star) {
|
|
430
|
+
this._advance();
|
|
431
|
+
return new Token(TokenType.mult, "*", lastL, lastC);
|
|
432
|
+
}
|
|
433
|
+
if (this._currentChar === Chars.percent) {
|
|
434
|
+
this._advance();
|
|
435
|
+
return new Token(TokenType.mod, "%", lastL, lastC);
|
|
436
|
+
}
|
|
437
|
+
if (this._currentChar === Chars.colon) {
|
|
438
|
+
this._advance();
|
|
439
|
+
return new Token(TokenType.colon, ":", lastL, lastC);
|
|
440
|
+
}
|
|
441
|
+
if (this._currentChar === Chars.not) {
|
|
442
|
+
this._advance();
|
|
443
|
+
if (this._currentChar === Chars.equal) {
|
|
444
|
+
this._advance();
|
|
445
|
+
return new Token(TokenType.notEq, "!=", lastL, lastC);
|
|
446
|
+
}
|
|
447
|
+
return new Token(TokenType.not, "!", lastL, lastC);
|
|
448
|
+
}
|
|
449
|
+
if (this._currentChar === Chars.and && this._pick() === Chars.and) {
|
|
450
|
+
this._advance();
|
|
451
|
+
this._advance();
|
|
452
|
+
return new Token(TokenType.and, "&&", lastL, lastC);
|
|
453
|
+
}
|
|
454
|
+
if (this._currentChar === Chars.pipe && this._pick() === Chars.pipe) {
|
|
455
|
+
this._advance();
|
|
456
|
+
this._advance();
|
|
457
|
+
return new Token(TokenType.and, '||', lastL, lastC);
|
|
458
|
+
}
|
|
459
|
+
if (this._currentChar === Chars.quote || this._currentChar === Chars.squote) {
|
|
460
|
+
const startChar = this._currentChar;
|
|
461
|
+
this._advance();
|
|
462
|
+
const t = this._literalString(startChar);
|
|
463
|
+
this._advance();
|
|
464
|
+
return t;
|
|
465
|
+
}
|
|
466
|
+
return new Token(TokenType.invalid, String.fromCharCode(this._currentChar), lastL, lastC);
|
|
467
|
+
}
|
|
468
|
+
return new Token(TokenType.eof, "", lastL, lastC);
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
Lexer._defaultLanguage = new LexerDictionary("en", {
|
|
472
|
+
"if": "if",
|
|
473
|
+
"else": "else",
|
|
474
|
+
"true": "true",
|
|
475
|
+
"false": "false",
|
|
476
|
+
"null": "null",
|
|
477
|
+
});
|
|
478
|
+
Lexer.languages = [
|
|
479
|
+
Lexer._defaultLanguage,
|
|
480
|
+
new LexerDictionary("fr", {
|
|
481
|
+
"si": "if",
|
|
482
|
+
"sinon": "else",
|
|
483
|
+
"vrai": "else",
|
|
484
|
+
"faux": "false",
|
|
485
|
+
"nul": "null",
|
|
486
|
+
}),
|
|
487
|
+
new LexerDictionary("bm", {
|
|
488
|
+
"nii": "if",
|
|
489
|
+
"note": "else",
|
|
490
|
+
"tien": "true",
|
|
491
|
+
"galon": "false",
|
|
492
|
+
"gansan": "null",
|
|
493
|
+
}),
|
|
494
|
+
];
|
|
495
|
+
Lexer.RESERVED = {
|
|
496
|
+
"if": Token.from(TokenType.IF, "if"),
|
|
497
|
+
"else": Token.from(TokenType.ELSE, "else"),
|
|
498
|
+
"true": Token.from(TokenType.TRUE, true),
|
|
499
|
+
"false": Token.from(TokenType.FALSE, false),
|
|
500
|
+
"null": Token.from(TokenType.NULL, null),
|
|
501
|
+
};
|
|
502
|
+
/**
|
|
503
|
+
* Parser
|
|
504
|
+
*/
|
|
505
|
+
class AST {
|
|
506
|
+
constructor(line, col) {
|
|
507
|
+
this.line = line;
|
|
508
|
+
this.col = col;
|
|
509
|
+
}
|
|
510
|
+
dump() {
|
|
511
|
+
return this.toString();
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
class RootAST extends AST {
|
|
515
|
+
constructor(body, name, source) {
|
|
516
|
+
super(1, 1);
|
|
517
|
+
this.body = body;
|
|
518
|
+
this.name = name;
|
|
519
|
+
this.source = source;
|
|
520
|
+
}
|
|
521
|
+
dump() {
|
|
522
|
+
let builder = `Module ${this.name} Start {`;
|
|
523
|
+
for (const it of this.body) {
|
|
524
|
+
builder += `${it.dump()}\n`;
|
|
525
|
+
}
|
|
526
|
+
builder += "}";
|
|
527
|
+
return builder;
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
class BlockStatementAST extends AST {
|
|
531
|
+
constructor(body, token) {
|
|
532
|
+
super(token.line, token.col);
|
|
533
|
+
this.body = body;
|
|
534
|
+
}
|
|
535
|
+
toString() {
|
|
536
|
+
return `{\n${this.body.map((e) => e.toString()).join("\n")}}`;
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
class IdentifierAST extends AST {
|
|
540
|
+
constructor(token) {
|
|
541
|
+
super(token.line, token.col);
|
|
542
|
+
this.value = token.value.toString();
|
|
543
|
+
}
|
|
544
|
+
toString() {
|
|
545
|
+
return this.value;
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
class LiteralAST extends AST {
|
|
549
|
+
constructor(token, raw) {
|
|
550
|
+
super(token.line, token.col);
|
|
551
|
+
this.value = token.value;
|
|
552
|
+
this.raw = raw;
|
|
553
|
+
}
|
|
554
|
+
toString() {
|
|
555
|
+
return this.value.toString();
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
class AssignmentExpressionAST extends AST {
|
|
559
|
+
constructor(identifier, init) {
|
|
560
|
+
super(identifier.line, identifier.col);
|
|
561
|
+
this.identifier = identifier;
|
|
562
|
+
this.init = init;
|
|
563
|
+
}
|
|
564
|
+
toString() {
|
|
565
|
+
return `${this.identifier} = ${this.init}`;
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
class ExpressionStatementAST extends AST {
|
|
569
|
+
constructor(expression) {
|
|
570
|
+
super(expression.line, expression.col);
|
|
571
|
+
this.expression = expression;
|
|
572
|
+
}
|
|
573
|
+
toString() {
|
|
574
|
+
return this.expression.toString();
|
|
575
|
+
}
|
|
576
|
+
}
|
|
577
|
+
class CallExpressionAST extends AST {
|
|
578
|
+
constructor(callee, ags) {
|
|
579
|
+
super(callee.line, callee.col);
|
|
580
|
+
this.callee = callee;
|
|
581
|
+
this.arguments = ags;
|
|
582
|
+
}
|
|
583
|
+
toString() {
|
|
584
|
+
return `${this.callee.toString()}(...${this.arguments.length})`;
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
class BinaryExpressionAST extends AST {
|
|
588
|
+
constructor(left, operation, right) {
|
|
589
|
+
super(left.line, left.col);
|
|
590
|
+
this.left = left;
|
|
591
|
+
this.operation = operation;
|
|
592
|
+
this.right = right;
|
|
593
|
+
}
|
|
594
|
+
toString() {
|
|
595
|
+
return `${this.left} ${this.operation} ${this.right}`;
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
class UnaryExpressionAST extends AST {
|
|
599
|
+
constructor(operation, argument) {
|
|
600
|
+
super(operation.line, operation.col);
|
|
601
|
+
this.operation = operation, this.argument = argument;
|
|
602
|
+
}
|
|
603
|
+
toString() {
|
|
604
|
+
return `${this.operation} ${this.argument}`;
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
class IfStatementAST extends AST {
|
|
608
|
+
constructor(test, consequent, alternate) {
|
|
609
|
+
super(test.line, test.col);
|
|
610
|
+
this.test = test;
|
|
611
|
+
this.consequent = consequent;
|
|
612
|
+
this.alternate = alternate;
|
|
613
|
+
}
|
|
614
|
+
toString() {
|
|
615
|
+
return `if ${this.test} ${this.consequent} ${this.alternate !== null ? `else ${this.alternate} ` : ''}`;
|
|
616
|
+
}
|
|
617
|
+
}
|
|
618
|
+
class LogicalExpressionAST extends AST {
|
|
619
|
+
constructor(left, operator, right) {
|
|
620
|
+
super(left.line, left.col);
|
|
621
|
+
this.left = left;
|
|
622
|
+
this.operator = operator;
|
|
623
|
+
this.right = right;
|
|
624
|
+
}
|
|
625
|
+
toString() {
|
|
626
|
+
return `${this.left} ${this.operator.value} ${this.right}`;
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
class IndexAccessorAST extends AST {
|
|
630
|
+
constructor(owner, key, computed = false) {
|
|
631
|
+
super(owner.line, owner.col);
|
|
632
|
+
this.computed = false;
|
|
633
|
+
this.owner = owner;
|
|
634
|
+
this.key = key;
|
|
635
|
+
this.computed = computed;
|
|
636
|
+
}
|
|
637
|
+
toString() {
|
|
638
|
+
return `${this.owner}[${this.key}]`;
|
|
639
|
+
}
|
|
640
|
+
}
|
|
641
|
+
class ObjectExpression extends AST {
|
|
642
|
+
constructor(props, startToken, endToken) {
|
|
643
|
+
super(startToken?.line, startToken?.col);
|
|
644
|
+
this.properties = props;
|
|
645
|
+
}
|
|
646
|
+
toString() {
|
|
647
|
+
return "{...}";
|
|
648
|
+
}
|
|
649
|
+
}
|
|
650
|
+
class ArrayExpression extends AST {
|
|
651
|
+
constructor(props, start, end) {
|
|
652
|
+
super(start?.line, start?.col);
|
|
653
|
+
this.elements = props;
|
|
654
|
+
}
|
|
655
|
+
toString() {
|
|
656
|
+
return "[...]";
|
|
657
|
+
}
|
|
658
|
+
}
|
|
659
|
+
class ObjectProperty extends AST {
|
|
660
|
+
constructor(key, value) {
|
|
661
|
+
super(key.line, key.col);
|
|
662
|
+
this.value = value;
|
|
663
|
+
this.key = key;
|
|
664
|
+
}
|
|
665
|
+
}
|
|
666
|
+
class Parser {
|
|
667
|
+
constructor(lexer) {
|
|
668
|
+
this.currentToken = lexer.nextToken();
|
|
669
|
+
this.lexer = lexer;
|
|
670
|
+
}
|
|
671
|
+
_eat(type) {
|
|
672
|
+
if (this.currentToken?.type === type) {
|
|
673
|
+
this.currentToken = this.lexer.nextToken();
|
|
674
|
+
}
|
|
675
|
+
else {
|
|
676
|
+
error(this.currentToken);
|
|
677
|
+
}
|
|
678
|
+
}
|
|
679
|
+
_eatEOL() {
|
|
680
|
+
while (this.currentToken?.type === TokenType.eol) {
|
|
681
|
+
this._eat(TokenType.eol);
|
|
682
|
+
}
|
|
683
|
+
}
|
|
684
|
+
_eatSemiOrEOL() {
|
|
685
|
+
while (this.currentToken?.type === TokenType.eol ||
|
|
686
|
+
this.currentToken?.type === TokenType.semi) {
|
|
687
|
+
this._eat(this.currentToken.type);
|
|
688
|
+
}
|
|
689
|
+
}
|
|
690
|
+
_eatSemi() {
|
|
691
|
+
while (this.currentToken?.type === TokenType.semi) {
|
|
692
|
+
this._eat(TokenType.semi);
|
|
693
|
+
}
|
|
694
|
+
}
|
|
695
|
+
_variable() {
|
|
696
|
+
const node = new IdentifierAST(this.currentToken);
|
|
697
|
+
this._eat(TokenType.id);
|
|
698
|
+
return node;
|
|
699
|
+
}
|
|
700
|
+
_factor() {
|
|
701
|
+
const token = this.currentToken;
|
|
702
|
+
switch (token.type) {
|
|
703
|
+
case TokenType.plus:
|
|
704
|
+
case TokenType.minus:
|
|
705
|
+
case TokenType.not:
|
|
706
|
+
this._eat(this.currentToken.type);
|
|
707
|
+
return new UnaryExpressionAST(token, this._factor());
|
|
708
|
+
case TokenType.numberConst:
|
|
709
|
+
this._eat(TokenType.numberConst);
|
|
710
|
+
return new LiteralAST(token, token.value.toString());
|
|
711
|
+
case TokenType.stringConst:
|
|
712
|
+
this._eat(TokenType.stringConst);
|
|
713
|
+
return new LiteralAST(token, token.value.toString());
|
|
714
|
+
case TokenType.lparen:
|
|
715
|
+
this._eat(TokenType.lparen);
|
|
716
|
+
const node = this._expression();
|
|
717
|
+
this._eat(TokenType.rparen);
|
|
718
|
+
return node;
|
|
719
|
+
case TokenType.TRUE:
|
|
720
|
+
case TokenType.FALSE:
|
|
721
|
+
this._eat(this.currentToken.type);
|
|
722
|
+
return new LiteralAST(token, token.value.toString());
|
|
723
|
+
case TokenType.NULL:
|
|
724
|
+
this._eat(TokenType.NULL);
|
|
725
|
+
return new LiteralAST(token, "null");
|
|
726
|
+
case TokenType.lbracket:
|
|
727
|
+
// literal array expression
|
|
728
|
+
return this._arrayExpression();
|
|
729
|
+
case TokenType.lbrace:
|
|
730
|
+
return this._objectExpression();
|
|
731
|
+
default:
|
|
732
|
+
return this._variable();
|
|
733
|
+
}
|
|
734
|
+
}
|
|
735
|
+
_term() {
|
|
736
|
+
let node = this._factor();
|
|
737
|
+
node = this._tryParsingMemberExpression(node);
|
|
738
|
+
node = this._tryParsingFunctionCall(node);
|
|
739
|
+
return node;
|
|
740
|
+
}
|
|
741
|
+
_expression() {
|
|
742
|
+
let node = this._term();
|
|
743
|
+
node = this._tryBinaryExpression(0, node);
|
|
744
|
+
while ([TokenType.and, TokenType.or].includes(this.currentToken.type)) {
|
|
745
|
+
const token = this.currentToken;
|
|
746
|
+
this._eat(token.type);
|
|
747
|
+
node = new LogicalExpressionAST(node, token, this._expression());
|
|
748
|
+
}
|
|
749
|
+
if (this._expect(TokenType.equal)) {
|
|
750
|
+
if (node instanceof IdentifierAST || node instanceof IndexAccessorAST) {
|
|
751
|
+
const token = this.currentToken;
|
|
752
|
+
this._eat(TokenType.equal);
|
|
753
|
+
node = new AssignmentExpressionAST(node, this._expression());
|
|
754
|
+
}
|
|
755
|
+
else {
|
|
756
|
+
throw new Error("Unexpected token");
|
|
757
|
+
}
|
|
758
|
+
}
|
|
759
|
+
return node;
|
|
760
|
+
}
|
|
761
|
+
_objectProperty() {
|
|
762
|
+
let key;
|
|
763
|
+
switch (this.currentToken?.type) {
|
|
764
|
+
case TokenType.stringConst:
|
|
765
|
+
{
|
|
766
|
+
key = new LiteralAST(this.currentToken, this.currentToken.value);
|
|
767
|
+
this._eat(TokenType.stringConst);
|
|
768
|
+
break;
|
|
769
|
+
}
|
|
770
|
+
case TokenType.lbracket:
|
|
771
|
+
{
|
|
772
|
+
this._eat(TokenType.lbracket);
|
|
773
|
+
var expr = this._expression();
|
|
774
|
+
this._eat(TokenType.rbracket);
|
|
775
|
+
key = expr;
|
|
776
|
+
break;
|
|
777
|
+
}
|
|
778
|
+
case TokenType.id:
|
|
779
|
+
{
|
|
780
|
+
const id = this._variable();
|
|
781
|
+
key = new LiteralAST(new Token(TokenType.id, id.value, id.line, id.col), id.value);
|
|
782
|
+
break;
|
|
783
|
+
}
|
|
784
|
+
default:
|
|
785
|
+
throw `Unexpected token ${this.currentToken}`;
|
|
786
|
+
}
|
|
787
|
+
this._eat(TokenType.colon);
|
|
788
|
+
var value = this._expression();
|
|
789
|
+
return new ObjectProperty(key, value);
|
|
790
|
+
}
|
|
791
|
+
_property() {
|
|
792
|
+
return this._objectProperty();
|
|
793
|
+
}
|
|
794
|
+
_objectProperties() {
|
|
795
|
+
const properties = [];
|
|
796
|
+
if (this.currentToken?.type != TokenType.rbrace) {
|
|
797
|
+
properties.push(this._property());
|
|
798
|
+
}
|
|
799
|
+
while (this.currentToken?.type == TokenType.comma) {
|
|
800
|
+
this._eat(TokenType.comma);
|
|
801
|
+
properties.push(this._property());
|
|
802
|
+
}
|
|
803
|
+
return properties;
|
|
804
|
+
}
|
|
805
|
+
_objectExpression(braceToken) {
|
|
806
|
+
var token = braceToken ?? this.currentToken;
|
|
807
|
+
if (!braceToken)
|
|
808
|
+
this._eat(TokenType.lbrace);
|
|
809
|
+
var properties = this._objectProperties();
|
|
810
|
+
this._eat(TokenType.rbrace);
|
|
811
|
+
return new ObjectExpression(properties, token, this.currentToken);
|
|
812
|
+
}
|
|
813
|
+
_arrayExpression() {
|
|
814
|
+
this._eat(TokenType.lbracket);
|
|
815
|
+
const elements = this._expect(TokenType.rbracket) ? [] : this._expressionsList();
|
|
816
|
+
this._eat(TokenType.rbracket);
|
|
817
|
+
var startNode = elements.length !== 0 ? elements[0] : undefined;
|
|
818
|
+
var lastNode = elements.length !== 0 ? elements[elements.length - 1] : undefined;
|
|
819
|
+
return new ArrayExpression(elements, startNode, lastNode);
|
|
820
|
+
}
|
|
821
|
+
_tryParsingMemberExpression(n) {
|
|
822
|
+
let node = n;
|
|
823
|
+
while (this.currentToken.type === TokenType.lbracket) {
|
|
824
|
+
this._eat(TokenType.lbracket);
|
|
825
|
+
const key = this._expression();
|
|
826
|
+
node = new IndexAccessorAST(node, key);
|
|
827
|
+
this._eat(TokenType.rbracket);
|
|
828
|
+
}
|
|
829
|
+
return node;
|
|
830
|
+
}
|
|
831
|
+
_tryBinaryExpression(prec, left) {
|
|
832
|
+
let node = left;
|
|
833
|
+
while (true) {
|
|
834
|
+
const currentPrec = Parser._binopPrecdences[this.currentToken.type] || -1;
|
|
835
|
+
if (currentPrec < prec)
|
|
836
|
+
return node;
|
|
837
|
+
const operator = this.currentToken;
|
|
838
|
+
this._eat(operator.type);
|
|
839
|
+
let right = this._term();
|
|
840
|
+
const nextPrec = Parser._binopPrecdences[this.currentToken.type] || -1;
|
|
841
|
+
if (currentPrec < nextPrec) {
|
|
842
|
+
const tmp = this._tryBinaryExpression(currentPrec + 1, right);
|
|
843
|
+
if (tmp === node)
|
|
844
|
+
return tmp;
|
|
845
|
+
right = tmp;
|
|
846
|
+
}
|
|
847
|
+
node = new BinaryExpressionAST(node, operator, right);
|
|
848
|
+
}
|
|
849
|
+
}
|
|
850
|
+
_expressionsList() {
|
|
851
|
+
this._eatEOL();
|
|
852
|
+
// if (expect(Lexer.TokenType.RPAREN)) return emptyList()
|
|
853
|
+
let expr = this._expression();
|
|
854
|
+
const result = [expr];
|
|
855
|
+
while (this.currentToken?.type === TokenType.comma) {
|
|
856
|
+
this._eat(TokenType.comma);
|
|
857
|
+
expr = this._expression();
|
|
858
|
+
result.push(expr);
|
|
859
|
+
}
|
|
860
|
+
return result;
|
|
861
|
+
}
|
|
862
|
+
_callExpression(node) {
|
|
863
|
+
this._eat(TokenType.lparen);
|
|
864
|
+
let args = [];
|
|
865
|
+
if (!this._expect(TokenType.rparen)) {
|
|
866
|
+
args = this._expressionsList();
|
|
867
|
+
}
|
|
868
|
+
this._eat(TokenType.rparen);
|
|
869
|
+
if (!(node instanceof IdentifierAST)) {
|
|
870
|
+
error(this.currentToken);
|
|
871
|
+
}
|
|
872
|
+
return new CallExpressionAST(node, args);
|
|
873
|
+
}
|
|
874
|
+
_tryParsingFunctionCall(n) {
|
|
875
|
+
let node = n;
|
|
876
|
+
while (this.currentToken.type === TokenType.lparen) {
|
|
877
|
+
// probable function call
|
|
878
|
+
node = this._callExpression(node);
|
|
879
|
+
}
|
|
880
|
+
return node;
|
|
881
|
+
}
|
|
882
|
+
_statementExpression() {
|
|
883
|
+
const node = this._expression();
|
|
884
|
+
if (![TokenType.semi, TokenType.eol, TokenType.eof]
|
|
885
|
+
.includes(this.currentToken.type)) {
|
|
886
|
+
error(this.currentToken);
|
|
887
|
+
}
|
|
888
|
+
return node;
|
|
889
|
+
}
|
|
890
|
+
_blockStatement(ignoreFirstBrace = false) {
|
|
891
|
+
if (!ignoreFirstBrace)
|
|
892
|
+
this._eat(TokenType.lbrace);
|
|
893
|
+
this._eatEOL();
|
|
894
|
+
if (this._expect(TokenType.rbrace)) {
|
|
895
|
+
this._eat(TokenType.rbrace);
|
|
896
|
+
return new BlockStatementAST([], this.currentToken);
|
|
897
|
+
}
|
|
898
|
+
// const body = _statements();
|
|
899
|
+
const body = [this._statement()];
|
|
900
|
+
while (this.currentToken.type === TokenType.eol ||
|
|
901
|
+
this.currentToken.type === TokenType.semi) {
|
|
902
|
+
this._eatSemiOrEOL();
|
|
903
|
+
if (this.currentToken.type === TokenType.rbrace || this.currentToken.type === TokenType.eof) {
|
|
904
|
+
// _eat(this.currentToken!.type);
|
|
905
|
+
break;
|
|
906
|
+
}
|
|
907
|
+
body.push(this._statement());
|
|
908
|
+
if (this.currentToken.type !== TokenType.eol &&
|
|
909
|
+
this.currentToken.type !== TokenType.semi &&
|
|
910
|
+
this.currentToken.type !== TokenType.eof) {
|
|
911
|
+
error(this.currentToken);
|
|
912
|
+
}
|
|
913
|
+
}
|
|
914
|
+
this._eat(TokenType.rbrace);
|
|
915
|
+
if (this.currentToken?.type === TokenType.rbrace) {
|
|
916
|
+
// endBlock
|
|
917
|
+
this._eat(TokenType.rbrace);
|
|
918
|
+
}
|
|
919
|
+
return new BlockStatementAST(body, this.currentToken);
|
|
920
|
+
}
|
|
921
|
+
_ifStatement() {
|
|
922
|
+
this._eat(TokenType.IF);
|
|
923
|
+
const withPar = this.currentToken.type === TokenType.lparen;
|
|
924
|
+
if (withPar) {
|
|
925
|
+
this._eat(TokenType.lparen);
|
|
926
|
+
}
|
|
927
|
+
const test = this._expression();
|
|
928
|
+
if (withPar) {
|
|
929
|
+
this._eat(TokenType.rparen);
|
|
930
|
+
}
|
|
931
|
+
let consequent;
|
|
932
|
+
if (this.currentToken.type === TokenType.lbrace) {
|
|
933
|
+
consequent = this._blockStatement();
|
|
934
|
+
}
|
|
935
|
+
else {
|
|
936
|
+
consequent = this._expression();
|
|
937
|
+
}
|
|
938
|
+
this._eatSemiOrEOL();
|
|
939
|
+
let alternate;
|
|
940
|
+
if (this.currentToken.type === TokenType.ELSE) {
|
|
941
|
+
this._eat(TokenType.ELSE);
|
|
942
|
+
switch (this.currentToken.type) {
|
|
943
|
+
case TokenType.IF:
|
|
944
|
+
alternate = this._ifStatement();
|
|
945
|
+
break;
|
|
946
|
+
case TokenType.lbrace:
|
|
947
|
+
alternate = this._blockStatement();
|
|
948
|
+
break;
|
|
949
|
+
default:
|
|
950
|
+
alternate = this._expression();
|
|
951
|
+
}
|
|
952
|
+
}
|
|
953
|
+
return new IfStatementAST(test, consequent, alternate);
|
|
954
|
+
}
|
|
955
|
+
_statement() {
|
|
956
|
+
switch (this.currentToken.type) {
|
|
957
|
+
case TokenType.semi:
|
|
958
|
+
this._eatSemi();
|
|
959
|
+
return this._statement();
|
|
960
|
+
case TokenType.eol:
|
|
961
|
+
this._eatEOL();
|
|
962
|
+
return this._statement();
|
|
963
|
+
case TokenType.IF:
|
|
964
|
+
return this._ifStatement();
|
|
965
|
+
default:
|
|
966
|
+
return this._statementExpression();
|
|
967
|
+
}
|
|
968
|
+
}
|
|
969
|
+
_expect(type) {
|
|
970
|
+
return this.currentToken?.type === type;
|
|
971
|
+
}
|
|
972
|
+
_statements() {
|
|
973
|
+
this._eatEOL();
|
|
974
|
+
if (this._expect(TokenType.eof)) {
|
|
975
|
+
return [];
|
|
976
|
+
}
|
|
977
|
+
const results = [this._statement()];
|
|
978
|
+
while ((this.currentToken.type === TokenType.eol ||
|
|
979
|
+
this.currentToken.type === TokenType.semi)) {
|
|
980
|
+
this._eatSemiOrEOL();
|
|
981
|
+
if (this.currentToken.type === TokenType.eof) {
|
|
982
|
+
this._eat(TokenType.eof);
|
|
983
|
+
break;
|
|
984
|
+
}
|
|
985
|
+
results.push(this._statement());
|
|
986
|
+
if (this.currentToken.type !== TokenType.eol &&
|
|
987
|
+
this.currentToken.type !== TokenType.semi &&
|
|
988
|
+
this.currentToken.type !== TokenType.eof) {
|
|
989
|
+
error(this.currentToken);
|
|
990
|
+
}
|
|
991
|
+
}
|
|
992
|
+
return results;
|
|
993
|
+
}
|
|
994
|
+
_root() {
|
|
995
|
+
const source = this.lexer.source;
|
|
996
|
+
const name = "<module>";
|
|
997
|
+
const list = this._statements();
|
|
998
|
+
return new RootAST(list, name, source);
|
|
999
|
+
}
|
|
1000
|
+
parse() {
|
|
1001
|
+
return this._root();
|
|
1002
|
+
}
|
|
1003
|
+
}
|
|
1004
|
+
Parser._binopPrecdences = {
|
|
1005
|
+
[TokenType.eqeq]: 10,
|
|
1006
|
+
[TokenType.notEq]: 10,
|
|
1007
|
+
[TokenType.great]: 10,
|
|
1008
|
+
[TokenType.greatEq]: 10,
|
|
1009
|
+
[TokenType.less]: 10,
|
|
1010
|
+
[TokenType.lessEq]: 10,
|
|
1011
|
+
[TokenType.plus]: 20,
|
|
1012
|
+
[TokenType.minus]: 20,
|
|
1013
|
+
[TokenType.mult]: 40,
|
|
1014
|
+
[TokenType.div]: 40,
|
|
1015
|
+
[TokenType.mod]: 40,
|
|
1016
|
+
};
|
|
1017
|
+
// AST Wallker
|
|
1018
|
+
class ANodeVisitor {
|
|
1019
|
+
constructor() {
|
|
1020
|
+
this._nodesVisitors = {};
|
|
1021
|
+
}
|
|
1022
|
+
registerVisitor(type, visitor) {
|
|
1023
|
+
const methodName = `visit${type.name}`;
|
|
1024
|
+
// console.log('Reg::::::', methodName, type);
|
|
1025
|
+
this._nodesVisitors[methodName] = visitor;
|
|
1026
|
+
}
|
|
1027
|
+
}
|
|
1028
|
+
class AsyncNodeVisitor extends ANodeVisitor {
|
|
1029
|
+
async visit(node) {
|
|
1030
|
+
const methodName = `visit${node.constructor.name}`;
|
|
1031
|
+
// const fn = Object.getPrototypeOf(this)[methodName];
|
|
1032
|
+
const fn = this._nodesVisitors[methodName];
|
|
1033
|
+
return await fn?.call(this, node);
|
|
1034
|
+
}
|
|
1035
|
+
}
|
|
1036
|
+
class NodeVisitor extends ANodeVisitor {
|
|
1037
|
+
visit(node) {
|
|
1038
|
+
const methodName = `visit${node.constructor.name}`;
|
|
1039
|
+
// const fn = Object.getPrototypeOf(this)[methodName];
|
|
1040
|
+
const fn = this._nodesVisitors[methodName];
|
|
1041
|
+
return fn?.call(this, node);
|
|
1042
|
+
}
|
|
1043
|
+
}
|
|
1044
|
+
export class MEvento extends NodeVisitor {
|
|
1045
|
+
constructor() {
|
|
1046
|
+
super();
|
|
1047
|
+
this._memory = {};
|
|
1048
|
+
this._functionsRegistry = {};
|
|
1049
|
+
this.registerVisitor(RootAST, this.visitRootAST);
|
|
1050
|
+
this.registerVisitor(BlockStatementAST, this.visitBlockStatementAST);
|
|
1051
|
+
this.registerVisitor(IdentifierAST, this.visitIdentifierAST);
|
|
1052
|
+
this.registerVisitor(LiteralAST, this.visitLiteralAST);
|
|
1053
|
+
this.registerVisitor(AssignmentExpressionAST, this.visitAssignmentExpressionAST);
|
|
1054
|
+
this.registerVisitor(ExpressionStatementAST, this.visitExpressionStatementAST);
|
|
1055
|
+
this.registerVisitor(CallExpressionAST, this.visitCallExpressionAST);
|
|
1056
|
+
this.registerVisitor(BinaryExpressionAST, this.visitBinaryExpressionAST);
|
|
1057
|
+
this.registerVisitor(UnaryExpressionAST, this.visitUnaryExpressionAST);
|
|
1058
|
+
this.registerVisitor(IfStatementAST, this.visitIfStatementAST);
|
|
1059
|
+
this.registerVisitor(LogicalExpressionAST, this.visitLogicalExpressionAST);
|
|
1060
|
+
this.registerVisitor(IndexAccessorAST, this.visitIndexAccessorAST);
|
|
1061
|
+
this.registerVisitor(ObjectProperty, this.visitObjectProperty);
|
|
1062
|
+
this.registerVisitor(ObjectExpression, this.visitObjectExpression);
|
|
1063
|
+
this.registerVisitor(ArrayExpression, this.visitArrayExpression);
|
|
1064
|
+
this._functionsRegistry = { ...MEvento._globalFunctionsRegistry };
|
|
1065
|
+
}
|
|
1066
|
+
visitRootAST(node) {
|
|
1067
|
+
const list = node.body;
|
|
1068
|
+
let last;
|
|
1069
|
+
for (const n of list) {
|
|
1070
|
+
last = this.visit(n);
|
|
1071
|
+
}
|
|
1072
|
+
return last;
|
|
1073
|
+
}
|
|
1074
|
+
visitBlockStatementAST(node) {
|
|
1075
|
+
const list = node.body;
|
|
1076
|
+
let last;
|
|
1077
|
+
for (const n of list) {
|
|
1078
|
+
last = this.visit(n);
|
|
1079
|
+
}
|
|
1080
|
+
return last;
|
|
1081
|
+
}
|
|
1082
|
+
visitIdentifierAST(node) {
|
|
1083
|
+
const id = node.value;
|
|
1084
|
+
return this._memory[id];
|
|
1085
|
+
}
|
|
1086
|
+
visitLiteralAST(node) {
|
|
1087
|
+
const value = node.value;
|
|
1088
|
+
return value;
|
|
1089
|
+
}
|
|
1090
|
+
visitAssignmentExpressionAST(node) {
|
|
1091
|
+
const id = node.identifier;
|
|
1092
|
+
const init = node.init;
|
|
1093
|
+
let value = null;
|
|
1094
|
+
if (id instanceof IndexAccessorAST) {
|
|
1095
|
+
var target = this.visit(id.owner);
|
|
1096
|
+
value = this.visit(node.init);
|
|
1097
|
+
var property = this.visit(id.key);
|
|
1098
|
+
this.assignProperty(target, property, value);
|
|
1099
|
+
}
|
|
1100
|
+
else if (id instanceof IdentifierAST) {
|
|
1101
|
+
value = this.visit(init);
|
|
1102
|
+
this._memory[id.value] = value;
|
|
1103
|
+
}
|
|
1104
|
+
return value;
|
|
1105
|
+
}
|
|
1106
|
+
assignProperty(owner, property, value) {
|
|
1107
|
+
if (Array.isArray(owner)) {
|
|
1108
|
+
owner[property] = value;
|
|
1109
|
+
}
|
|
1110
|
+
else if (typeof owner === 'object') {
|
|
1111
|
+
owner[property] = value;
|
|
1112
|
+
}
|
|
1113
|
+
else { }
|
|
1114
|
+
}
|
|
1115
|
+
visitExpressionStatementAST(node) {
|
|
1116
|
+
const expr = node.expression;
|
|
1117
|
+
return this.visit(expr);
|
|
1118
|
+
}
|
|
1119
|
+
visitCallExpressionAST(node) {
|
|
1120
|
+
const callee = node.callee;
|
|
1121
|
+
const args = node.arguments;
|
|
1122
|
+
const calleeName = callee.value;
|
|
1123
|
+
const fn = this._functionsRegistry[calleeName];
|
|
1124
|
+
const argValues = args.map((e) => this.visit(e));
|
|
1125
|
+
// print("argValues::", argValues)
|
|
1126
|
+
return fn?.(argValues, this);
|
|
1127
|
+
}
|
|
1128
|
+
visitBinaryExpressionAST(node) {
|
|
1129
|
+
const left = node.left;
|
|
1130
|
+
const right = node.right;
|
|
1131
|
+
const op = node.operation;
|
|
1132
|
+
const lValue = this.visit(left);
|
|
1133
|
+
const rValue = this.visit(right);
|
|
1134
|
+
switch (op.type) {
|
|
1135
|
+
case TokenType.plus:
|
|
1136
|
+
if (isNum(lValue) && isNum(rValue)) {
|
|
1137
|
+
return lValue + rValue;
|
|
1138
|
+
}
|
|
1139
|
+
return `${lValue}${rValue}`;
|
|
1140
|
+
case TokenType.minus:
|
|
1141
|
+
if (isNum(lValue) && isNum(rValue)) {
|
|
1142
|
+
return lValue - rValue;
|
|
1143
|
+
}
|
|
1144
|
+
if (isString(lValue) && isNum(rValue)) {
|
|
1145
|
+
return lValue * rValue;
|
|
1146
|
+
}
|
|
1147
|
+
if (isNum(lValue) && isString(rValue)) {
|
|
1148
|
+
return rValue * lValue;
|
|
1149
|
+
}
|
|
1150
|
+
throw new Error(`Operation ${op.value} not allowed no num value`);
|
|
1151
|
+
case TokenType.mult:
|
|
1152
|
+
if (isNum(lValue) && isNum(rValue)) {
|
|
1153
|
+
return lValue * rValue;
|
|
1154
|
+
}
|
|
1155
|
+
throw new Error(`Operation ${op.value} not allowed no num value`);
|
|
1156
|
+
case TokenType.div:
|
|
1157
|
+
if (isNum(lValue) && isNum(rValue)) {
|
|
1158
|
+
if (rValue === 0) {
|
|
1159
|
+
throw new Error("Invalid division by 0");
|
|
1160
|
+
}
|
|
1161
|
+
return lValue / rValue;
|
|
1162
|
+
}
|
|
1163
|
+
throw new Error(`Operation ${op.value} not allowed no num value`);
|
|
1164
|
+
case TokenType.mod:
|
|
1165
|
+
if (isNum(lValue) && isNum(rValue)) {
|
|
1166
|
+
return lValue % rValue;
|
|
1167
|
+
}
|
|
1168
|
+
throw new Error(`Operation ${op.value} not allowed no num value`);
|
|
1169
|
+
case TokenType.great:
|
|
1170
|
+
if (isNum(lValue) && isNum(rValue)) {
|
|
1171
|
+
return lValue > rValue;
|
|
1172
|
+
}
|
|
1173
|
+
throw new Error(`Operation ${op.value} not allowed no num value`);
|
|
1174
|
+
case TokenType.greatEq:
|
|
1175
|
+
if (isNum(lValue) && isNum(rValue)) {
|
|
1176
|
+
return lValue >= rValue;
|
|
1177
|
+
}
|
|
1178
|
+
throw new Error(`Operation ${op.value} not allowed no num value`);
|
|
1179
|
+
case TokenType.less:
|
|
1180
|
+
if (isNum(lValue) && isNum(rValue)) {
|
|
1181
|
+
return lValue < rValue;
|
|
1182
|
+
}
|
|
1183
|
+
throw new Error(`Operation ${op.value} not allowed no num value`);
|
|
1184
|
+
case TokenType.lessEq:
|
|
1185
|
+
if (isNum(lValue) && isNum(rValue)) {
|
|
1186
|
+
return lValue <= rValue;
|
|
1187
|
+
}
|
|
1188
|
+
throw new Error(`Operation ${op.value} not allowed no num value`);
|
|
1189
|
+
case TokenType.eqeq:
|
|
1190
|
+
return lValue === rValue;
|
|
1191
|
+
case TokenType.notEq:
|
|
1192
|
+
return lValue !== rValue;
|
|
1193
|
+
default:
|
|
1194
|
+
throw new Error(`Operation ${op.value} not allowed no num value`);
|
|
1195
|
+
}
|
|
1196
|
+
}
|
|
1197
|
+
visitUnaryExpressionAST(node) {
|
|
1198
|
+
const arg = node.argument;
|
|
1199
|
+
const op = node.operation;
|
|
1200
|
+
const argValue = this.visit(arg);
|
|
1201
|
+
if (op.type === TokenType.not) {
|
|
1202
|
+
return _boolValue(argValue) === false;
|
|
1203
|
+
}
|
|
1204
|
+
if (isNum(argValue)) {
|
|
1205
|
+
throw new Error(`Operation ${op.value} not allowed no num value`);
|
|
1206
|
+
}
|
|
1207
|
+
if (op.type === TokenType.plus) {
|
|
1208
|
+
return argValue;
|
|
1209
|
+
}
|
|
1210
|
+
else if (op.type === TokenType.minus) {
|
|
1211
|
+
return -argValue;
|
|
1212
|
+
}
|
|
1213
|
+
throw new Error(`Operation ${op.value} not allowed no num value`);
|
|
1214
|
+
}
|
|
1215
|
+
visitIfStatementAST(node) {
|
|
1216
|
+
const testNode = node.test;
|
|
1217
|
+
const test = this.visit(testNode);
|
|
1218
|
+
const testBoolValue = _boolValue(test);
|
|
1219
|
+
if (testBoolValue) {
|
|
1220
|
+
return this.visit(node.consequent);
|
|
1221
|
+
}
|
|
1222
|
+
if (node.alternate !== null) {
|
|
1223
|
+
return this.visit(node.alternate);
|
|
1224
|
+
}
|
|
1225
|
+
return null;
|
|
1226
|
+
}
|
|
1227
|
+
visitLogicalExpressionAST(node) {
|
|
1228
|
+
const leftNode = node.left;
|
|
1229
|
+
const test = this.visit(leftNode);
|
|
1230
|
+
const testBoolValue = _boolValue(test);
|
|
1231
|
+
if (node.operator.type === TokenType.and) {
|
|
1232
|
+
return testBoolValue && _boolValue(this.visit(node.right));
|
|
1233
|
+
}
|
|
1234
|
+
if (node.operator.type === TokenType.or) {
|
|
1235
|
+
return testBoolValue || _boolValue(this.visit(node.right));
|
|
1236
|
+
}
|
|
1237
|
+
return false;
|
|
1238
|
+
}
|
|
1239
|
+
visitIndexAccessorAST(node) {
|
|
1240
|
+
const ownerNode = node.owner;
|
|
1241
|
+
const owner = this.visit(ownerNode);
|
|
1242
|
+
if (typeof owner === 'object') {
|
|
1243
|
+
const key = this.visit(node.key);
|
|
1244
|
+
return owner[key];
|
|
1245
|
+
}
|
|
1246
|
+
else if (Array.isArray(owner)) {
|
|
1247
|
+
const key = this.visit(node.key);
|
|
1248
|
+
return isNum(key) && owner.length < key && key >= 0 ? owner[key] : null;
|
|
1249
|
+
}
|
|
1250
|
+
return null;
|
|
1251
|
+
}
|
|
1252
|
+
visitObjectProperty(node) { }
|
|
1253
|
+
visitObjectExpression(ast) {
|
|
1254
|
+
const instance = {};
|
|
1255
|
+
const node = ast;
|
|
1256
|
+
for (const it of node.properties) {
|
|
1257
|
+
if (it instanceof ObjectProperty) {
|
|
1258
|
+
let key = this.visit(it.key);
|
|
1259
|
+
key = isString(key) ? key : key.toString();
|
|
1260
|
+
instance[key] = this.visit(it.value);
|
|
1261
|
+
}
|
|
1262
|
+
}
|
|
1263
|
+
return instance;
|
|
1264
|
+
}
|
|
1265
|
+
visitArrayExpression(ast) {
|
|
1266
|
+
const node = ast;
|
|
1267
|
+
const args = this.resolveArguments(node.elements);
|
|
1268
|
+
return args;
|
|
1269
|
+
}
|
|
1270
|
+
resolveArguments(args) {
|
|
1271
|
+
return args.map((it) => {
|
|
1272
|
+
return this.visit(it);
|
|
1273
|
+
});
|
|
1274
|
+
}
|
|
1275
|
+
registerFunction(id, fn) {
|
|
1276
|
+
this._functionsRegistry[id] = fn;
|
|
1277
|
+
}
|
|
1278
|
+
unregisterFunction(id) {
|
|
1279
|
+
delete this._functionsRegistry[id];
|
|
1280
|
+
}
|
|
1281
|
+
execute(source, cache = true) {
|
|
1282
|
+
const module = MEvento.compile(source, cache);
|
|
1283
|
+
return this.visit(module);
|
|
1284
|
+
}
|
|
1285
|
+
static compile(source, cache = false) {
|
|
1286
|
+
const hash = hashCode(source);
|
|
1287
|
+
if (cache && this._cache.has(hash)) {
|
|
1288
|
+
return this._cache.get(hash);
|
|
1289
|
+
}
|
|
1290
|
+
const lexer = new Lexer(source);
|
|
1291
|
+
const parser = new Parser(lexer);
|
|
1292
|
+
const module = parser.parse();
|
|
1293
|
+
if (cache)
|
|
1294
|
+
this._cache.set(hash, module);
|
|
1295
|
+
return module;
|
|
1296
|
+
}
|
|
1297
|
+
static register(id, fn) {
|
|
1298
|
+
MEvento._globalFunctionsRegistry[id] = fn;
|
|
1299
|
+
}
|
|
1300
|
+
static unregister(id) {
|
|
1301
|
+
delete MEvento._globalFunctionsRegistry[id];
|
|
1302
|
+
}
|
|
1303
|
+
static run(source, cache = false) {
|
|
1304
|
+
const mevento = new MEvento();
|
|
1305
|
+
const module = MEvento.compile(source, cache);
|
|
1306
|
+
return mevento.visit(module);
|
|
1307
|
+
}
|
|
1308
|
+
static newInstance() {
|
|
1309
|
+
// const lexer = Lexer(source);
|
|
1310
|
+
// const parser = Parser(lexer);
|
|
1311
|
+
// const module = parser.parse();
|
|
1312
|
+
return new MEvento();
|
|
1313
|
+
}
|
|
1314
|
+
clone() {
|
|
1315
|
+
var ret = new MEvento();
|
|
1316
|
+
ret._functionsRegistry = { ...this._functionsRegistry };
|
|
1317
|
+
ret._memory = { ...this._memory };
|
|
1318
|
+
return ret;
|
|
1319
|
+
}
|
|
1320
|
+
newAsyncInstance() {
|
|
1321
|
+
const asyncIns = MEventoAsync.newInstance();
|
|
1322
|
+
asyncIns._memory = this._memory;
|
|
1323
|
+
/// ????
|
|
1324
|
+
asyncIns._functionsRegistry = this._functionsRegistry;
|
|
1325
|
+
return asyncIns;
|
|
1326
|
+
}
|
|
1327
|
+
;
|
|
1328
|
+
}
|
|
1329
|
+
MEvento._globalFunctionsRegistry = {};
|
|
1330
|
+
MEvento._cache = new Map();
|
|
1331
|
+
export class MEventoAsync extends MEvento {
|
|
1332
|
+
constructor() {
|
|
1333
|
+
super();
|
|
1334
|
+
}
|
|
1335
|
+
async visitRootAST(node) {
|
|
1336
|
+
const list = node.body;
|
|
1337
|
+
let last;
|
|
1338
|
+
for (const n of list) {
|
|
1339
|
+
last = await this.visit(n);
|
|
1340
|
+
}
|
|
1341
|
+
return last;
|
|
1342
|
+
}
|
|
1343
|
+
async visitBlockStatementAST(node) {
|
|
1344
|
+
const list = node.body;
|
|
1345
|
+
let last;
|
|
1346
|
+
for (const n of list) {
|
|
1347
|
+
last = await this.visit(n);
|
|
1348
|
+
}
|
|
1349
|
+
return last;
|
|
1350
|
+
}
|
|
1351
|
+
async visitIdentifierAST(node) {
|
|
1352
|
+
const id = node.value;
|
|
1353
|
+
return this._memory[id];
|
|
1354
|
+
}
|
|
1355
|
+
async visitLiteralAST(node) {
|
|
1356
|
+
const value = node.value;
|
|
1357
|
+
return value;
|
|
1358
|
+
}
|
|
1359
|
+
async visitAssignmentExpressionAST(node) {
|
|
1360
|
+
const id = node.identifier;
|
|
1361
|
+
const init = node.init;
|
|
1362
|
+
let value = null;
|
|
1363
|
+
if (id instanceof IndexAccessorAST) {
|
|
1364
|
+
var target = await this.visit(id.owner);
|
|
1365
|
+
value = await this.visit(node.init);
|
|
1366
|
+
var property = await this.visit(id.key);
|
|
1367
|
+
this.assignProperty(target, property, value);
|
|
1368
|
+
}
|
|
1369
|
+
else if (id instanceof IdentifierAST) {
|
|
1370
|
+
value = await this.visit(init);
|
|
1371
|
+
this._memory[id.value] = value;
|
|
1372
|
+
}
|
|
1373
|
+
return value;
|
|
1374
|
+
}
|
|
1375
|
+
async visitExpressionStatementAST(node) {
|
|
1376
|
+
const expr = node.expression;
|
|
1377
|
+
return await this.visit(expr);
|
|
1378
|
+
}
|
|
1379
|
+
async visitCallExpressionAST(node) {
|
|
1380
|
+
const callee = node.callee;
|
|
1381
|
+
const args = node.arguments;
|
|
1382
|
+
const calleeName = callee.value;
|
|
1383
|
+
const fn = this._functionsRegistry[calleeName];
|
|
1384
|
+
const argValues = await Promise.all(args.map((e) => this.visit(e)));
|
|
1385
|
+
// print("argValues::", argValues)
|
|
1386
|
+
return await fn?.(argValues, this);
|
|
1387
|
+
}
|
|
1388
|
+
async visitBinaryExpressionAST(node) {
|
|
1389
|
+
const left = node.left;
|
|
1390
|
+
const right = node.right;
|
|
1391
|
+
const op = node.operation;
|
|
1392
|
+
const lValue = await this.visit(left);
|
|
1393
|
+
const rValue = await this.visit(right);
|
|
1394
|
+
switch (op.type) {
|
|
1395
|
+
case TokenType.plus:
|
|
1396
|
+
if (isNum(lValue) && isNum(rValue)) {
|
|
1397
|
+
return lValue + rValue;
|
|
1398
|
+
}
|
|
1399
|
+
return `${lValue}${rValue}`;
|
|
1400
|
+
case TokenType.minus:
|
|
1401
|
+
if (isNum(lValue) && isNum(rValue)) {
|
|
1402
|
+
return lValue - rValue;
|
|
1403
|
+
}
|
|
1404
|
+
if (isString(lValue) && isNum(rValue)) {
|
|
1405
|
+
return lValue * rValue;
|
|
1406
|
+
}
|
|
1407
|
+
if (isNum(lValue) && isString(rValue)) {
|
|
1408
|
+
return rValue * lValue;
|
|
1409
|
+
}
|
|
1410
|
+
throw new Error(`Operation ${op.value} not allowed no num value`);
|
|
1411
|
+
case TokenType.mult:
|
|
1412
|
+
if (isNum(lValue) && isNum(rValue)) {
|
|
1413
|
+
return lValue * rValue;
|
|
1414
|
+
}
|
|
1415
|
+
throw new Error(`Operation ${op.value} not allowed no num value`);
|
|
1416
|
+
case TokenType.div:
|
|
1417
|
+
if (isNum(lValue) && isNum(rValue)) {
|
|
1418
|
+
if (rValue === 0) {
|
|
1419
|
+
throw new Error("Invalid division by 0");
|
|
1420
|
+
}
|
|
1421
|
+
return lValue / rValue;
|
|
1422
|
+
}
|
|
1423
|
+
throw new Error(`Operation ${op.value} not allowed no num value`);
|
|
1424
|
+
case TokenType.mod:
|
|
1425
|
+
if (isNum(lValue) && isNum(rValue)) {
|
|
1426
|
+
return lValue % rValue;
|
|
1427
|
+
}
|
|
1428
|
+
throw new Error(`Operation ${op.value} not allowed no num value`);
|
|
1429
|
+
case TokenType.great:
|
|
1430
|
+
if (isNum(lValue) && isNum(rValue)) {
|
|
1431
|
+
return lValue > rValue;
|
|
1432
|
+
}
|
|
1433
|
+
throw new Error(`Operation ${op.value} not allowed no num value`);
|
|
1434
|
+
case TokenType.greatEq:
|
|
1435
|
+
if (isNum(lValue) && isNum(rValue)) {
|
|
1436
|
+
return lValue >= rValue;
|
|
1437
|
+
}
|
|
1438
|
+
throw new Error(`Operation ${op.value} not allowed no num value`);
|
|
1439
|
+
case TokenType.less:
|
|
1440
|
+
if (isNum(lValue) && isNum(rValue)) {
|
|
1441
|
+
return lValue < rValue;
|
|
1442
|
+
}
|
|
1443
|
+
throw new Error(`Operation ${op.value} not allowed no num value`);
|
|
1444
|
+
case TokenType.lessEq:
|
|
1445
|
+
if (isNum(lValue) && isNum(rValue)) {
|
|
1446
|
+
return lValue <= rValue;
|
|
1447
|
+
}
|
|
1448
|
+
throw new Error(`Operation ${op.value} not allowed no num value`);
|
|
1449
|
+
case TokenType.eqeq:
|
|
1450
|
+
return lValue === rValue;
|
|
1451
|
+
case TokenType.notEq:
|
|
1452
|
+
return lValue !== rValue;
|
|
1453
|
+
default:
|
|
1454
|
+
throw new Error(`Operation ${op.value} not allowed no num value`);
|
|
1455
|
+
}
|
|
1456
|
+
}
|
|
1457
|
+
async visitUnaryExpressionAST(node) {
|
|
1458
|
+
const arg = node.argument;
|
|
1459
|
+
const op = node.operation;
|
|
1460
|
+
const argValue = await this.visit(arg);
|
|
1461
|
+
if (isNum(argValue)) {
|
|
1462
|
+
throw new Error(`Operation ${op.value} not allowed no num value`);
|
|
1463
|
+
}
|
|
1464
|
+
if (op.type === TokenType.plus) {
|
|
1465
|
+
return argValue;
|
|
1466
|
+
}
|
|
1467
|
+
else if (op.type === TokenType.minus) {
|
|
1468
|
+
return -argValue;
|
|
1469
|
+
}
|
|
1470
|
+
throw new Error(`Operation ${op.value} not allowed no num value`);
|
|
1471
|
+
}
|
|
1472
|
+
async visitIfStatementAST(node) {
|
|
1473
|
+
const testNode = node.test;
|
|
1474
|
+
const test = await this.visit(testNode);
|
|
1475
|
+
const testBoolValue = _boolValue(test);
|
|
1476
|
+
if (testBoolValue) {
|
|
1477
|
+
return await this.visit(node.consequent);
|
|
1478
|
+
}
|
|
1479
|
+
if (node.alternate !== null) {
|
|
1480
|
+
return await this.visit(node.alternate);
|
|
1481
|
+
}
|
|
1482
|
+
return null;
|
|
1483
|
+
}
|
|
1484
|
+
async visitLogicalExpressionAST(node) {
|
|
1485
|
+
const leftNode = node.left;
|
|
1486
|
+
const test = await this.visit(leftNode);
|
|
1487
|
+
const testBoolValue = _boolValue(test);
|
|
1488
|
+
if (node.operator.type === TokenType.and) {
|
|
1489
|
+
return testBoolValue && _boolValue(await this.visit(node.right));
|
|
1490
|
+
}
|
|
1491
|
+
if (node.operator.type === TokenType.or) {
|
|
1492
|
+
return testBoolValue || _boolValue(await this.visit(node.right));
|
|
1493
|
+
}
|
|
1494
|
+
return false;
|
|
1495
|
+
}
|
|
1496
|
+
async visitIndexAccessorAST(node) {
|
|
1497
|
+
const ownerNode = node.owner;
|
|
1498
|
+
const owner = await this.visit(ownerNode);
|
|
1499
|
+
if (typeof owner === 'object') {
|
|
1500
|
+
const key = await this.visit(node.key);
|
|
1501
|
+
return owner[key];
|
|
1502
|
+
}
|
|
1503
|
+
else if (Array.isArray(owner)) {
|
|
1504
|
+
const key = await this.visit(node.key);
|
|
1505
|
+
return isNum(key) && owner.length < key && key >= 0 ? owner[key] : null;
|
|
1506
|
+
}
|
|
1507
|
+
return null;
|
|
1508
|
+
}
|
|
1509
|
+
async visitObjectProperty(node) { }
|
|
1510
|
+
async visitObjectExpression(ast) {
|
|
1511
|
+
const instance = {};
|
|
1512
|
+
const node = ast;
|
|
1513
|
+
for (const it of node.properties) {
|
|
1514
|
+
if (it instanceof ObjectProperty) {
|
|
1515
|
+
let key = await this.visit(it.key);
|
|
1516
|
+
key = isString(key) ? key : key.toString();
|
|
1517
|
+
instance[key] = await this.visit(it.value);
|
|
1518
|
+
}
|
|
1519
|
+
}
|
|
1520
|
+
return instance;
|
|
1521
|
+
}
|
|
1522
|
+
async visitArrayExpression(ast) {
|
|
1523
|
+
const node = ast;
|
|
1524
|
+
const args = await this.resolveArgumentsAsync(node.elements);
|
|
1525
|
+
return args;
|
|
1526
|
+
}
|
|
1527
|
+
async resolveArgumentsAsync(args) {
|
|
1528
|
+
return await Promise.all(args.map(async (it) => {
|
|
1529
|
+
return await this.visit(it);
|
|
1530
|
+
}));
|
|
1531
|
+
}
|
|
1532
|
+
registerFunction(id, fn) {
|
|
1533
|
+
this._functionsRegistry[id] = fn;
|
|
1534
|
+
}
|
|
1535
|
+
unregisterFunction(id) {
|
|
1536
|
+
delete this._functionsRegistry[id];
|
|
1537
|
+
}
|
|
1538
|
+
async execute(source, cache = true) {
|
|
1539
|
+
const module = MEvento.compile(source, cache);
|
|
1540
|
+
return await this.visit(module);
|
|
1541
|
+
}
|
|
1542
|
+
static async run(source, cache = false) {
|
|
1543
|
+
const mevento = new MEventoAsync();
|
|
1544
|
+
const module = MEvento.compile(source, cache);
|
|
1545
|
+
return await mevento.visit(module);
|
|
1546
|
+
}
|
|
1547
|
+
static newInstance() {
|
|
1548
|
+
// const lexer = Lexer(source);
|
|
1549
|
+
// const parser = Parser(lexer);
|
|
1550
|
+
// const module = parser.parse();
|
|
1551
|
+
return new MEventoAsync();
|
|
1552
|
+
}
|
|
1553
|
+
clone() {
|
|
1554
|
+
var ret = new MEventoAsync();
|
|
1555
|
+
ret._functionsRegistry = { ...this._functionsRegistry };
|
|
1556
|
+
ret._memory = { ...this._memory };
|
|
1557
|
+
return ret;
|
|
1558
|
+
}
|
|
1559
|
+
}
|
|
1560
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV2ZW50by5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL21ldmVudG8vc3JjL2xpYi9tZXZlbnRvLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLFNBQVMsS0FBSyxDQUFDLEtBQVk7SUFDdkIsTUFBTSxJQUFJLEdBQ04saUJBQWlCLEtBQUssQ0FBQyxJQUFJLElBQUksS0FBSyxDQUFDLEtBQUssUUFBUSxLQUFLLENBQUMsSUFBSSxLQUFLLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQztJQUNuRixNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDakIsQ0FBQztBQUNELFNBQVMsS0FBSyxDQUFDLEtBQVU7SUFDckIsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUM7QUFDckMsQ0FBQztBQUNELFNBQVMsU0FBUyxDQUFDLEtBQVU7SUFDekIsT0FBTyxPQUFPLEtBQUssS0FBSyxTQUFTLENBQUM7QUFDdEMsQ0FBQztBQUNELFNBQVMsUUFBUSxDQUFDLEtBQVU7SUFDeEIsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUM7QUFDckMsQ0FBQztBQUNELFNBQVMsVUFBVSxDQUFDLElBQVM7SUFDekIsT0FBTyxJQUFJLEtBQUssSUFBSTtRQUNoQixDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksS0FBSyxDQUFDLENBQUM7WUFDeEIsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFDbkMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztBQUN2QyxDQUFDO0FBQUEsQ0FBQztBQUVGLFNBQVMsUUFBUSxDQUFDLEdBQVc7SUFDekIsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQ2IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1YsSUFBSSxHQUFHLENBQUM7SUFDUixJQUFJ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Q0FBQyxDQUFDO0FBQzFCLGVBQVMsR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzlCLFlBQU0sR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNCLFlBQU0sR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNCLGVBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQy9CLFdBQUssR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzFCLFlBQU0sR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNCLFVBQUksR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3pCLFdBQUssR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzFCLFVBQUksR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3pCLFdBQUssR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzFCLGFBQU8sR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVCLFlBQU0sR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNCLFlBQU0sR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNCLGNBQVEsR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzdCLGNBQVEsR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzdCLFNBQUcsR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3hCLFdBQUssR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzFCLFVBQUksR0FBRyxHQUFHLENB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Q0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDOUMsT0FBTyxNQUFNLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELE1BQU0sQ0FBVSxXQUFXO1FBQ3ZCLCtCQUErQjtRQUMvQixnQ0FBZ0M7UUFDaEMsaUNBQWlDO1FBQ2pDLE9BQU8sSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBR1EsS0FBSztRQUNWLElBQUksR0FBRyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDN0IsR0FBRyxDQUFDLGtCQUFrQixHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUN4RCxHQUFHLENBQUMsT0FBTyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDbEMsT0FBTyxHQUFHLENBQUM7SUFDZixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUeXBlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcblxuZnVuY3Rpb24gZXJyb3IodG9rZW46IFRva2VuKSB7XG4gICAgY29uc3QgdGV4dCA9XG4gICAgICAgIGBJbnZhbGlkIHRva2VuICR7dG9rZW4udHlwZX1bJHt0b2tlbi52YWx1ZX1dIGF0ICR7dG9rZW4ubGluZX0sICR7dG9rZW4uY29sfVxcbmA7XG4gICAgdGhyb3cgKHRleHQpO1xufVxuZnVuY3Rpb24gaXNOdW0odmFsdWU6IGFueSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInO1xufVxuZnVuY3Rpb24gaXNCb29sZWFuKHZhbHVlOiBhbnkpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbic7XG59XG5mdW5jdGlvbiBpc1N0cmluZyh2YWx1ZTogYW55KSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZyc7XG59XG5mdW5jdGlvbiBfYm9vbFZhbHVlKHRlc3Q6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0ZXN0ICE9PSBudWxsICYmXG4gICAgICAgICgoaXNOdW0odGVzdCkgJiYgdGVzdCAhPT0gMCkgfHxcbiAgICAgICAgICAgIChpc1N0cmluZyh0ZXN0KSAmJiB0ZXN0Lmxlbmd0aCA+IDApIHx8XG4gICAgICAgICAgICAoaXNCb29sZWFuKHRlc3QpICYmIHRlc3QpKTtcbn07XG5cbmZ1bmN0aW9uIGhhc2hDb2RlKHN0cjogc3RyaW5nKSB7XG4gICAgbGV0IGhhc2ggPSAwO1xuICAgIGxldCBpID0gMDtcbiAgICBsZXQgY2hyO1xuICAgIGlmIChzdHIubGVuZ3RoID09PSAwKSByZXR1cm4gaGFzaDtcbiAgICBmb3IgKGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNociA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYml0d2lzZVxuICAgICAgICBoYXNoID0gKChoYXNoIDw8IDUpIC0gaGFzaCkgKyBjaHI7XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1iaXR3aXNlXG4gICAgICAgIGhhc2ggfD0gMDsgLy8gQ29udmVydCB0byAzMmJpdCBpbnRlZ2VyXG4gICAgfVxuICAgIHJldHVybiBoYXNoO1xufTtcbmNsYXNzIFRva2VuVHlwZSB7XG4gICAgc3RhdGljIGlkID0gMDtcbiAgICBzdGF0aWMgY29tbWEgPSAxO1xuICAgIHN0YXRpYyBzZW1pID0gMjtcbiAgICBzdGF0aWMgbnVtYmVyQ29uc3QgPSAzO1xuICAgIHN0YXRpYyBzdHJpbmdDb25zdCA9IDQ7XG4gICAgc3RhdGljIGVxdWFsID0gNTtcbiAgICBzdGF0aWMgbHBhcmVuID0gNlxuICAgIHN0YXRpYyBycGFyZW4gPSA3O1xuICAgIHN0YXRpYyBlb2wgPSA4O1xuICAgIHN0YXRpYyBlb2YgPSA5O1xuICAgIHN0YXRpYyBsYnJhY2UgPSAxMDtcbiAgICBzdGF0aWMgcmJyYWNlID0gMTE7XG4gICAgc3RhdGljIGxicmFja2V0ID0gMTI7XG4gICAgc3RhdGljIHJicmFja2V0ID0gMTM7XG4gICAgc3RhdGljIGdyZWF0ID0gMTQ7XG4gICAgc3RhdGljIGdyZWF0RXEgPSAxNTtcbiAgICBzdGF0aWMgbGVzcyA9IDE2O1xuICAgIHN0YXRpYyBsZXNzRXEgPSAxNztcbiAgICBzdGF0aWMgZXFlcSA9IDE4O1xuICAgIHN0YXRpYyBJRiA9IDE5O1xuICAgIHN0YXRpYyBFTFNFID0gMjA7XG4gICAgc3RhdGljIFRSVUUgPSAyMTtcbiAgICBzdGF0aWMgRkFMU0UgPSAyMjtcbiAgICBzdGF0aWMgTlVMTCA9IDIzO1xuICAgIHN0YXRpYyBub3QgPSAyNDtcbiAgICBzdGF0aWMgbm90RXEgPSAyNTtcbiAgICBzdGF0aWMgYW5kID0gMjY7XG4gICAgc3RhdGljIG9yID0gMjc7XG4gICAgc3RhdGljIHBsdXMgPSAyODtcbiAgICBzdGF0aWMgbWludXMgPSAyOTtcbiAgICBzdGF0aWMgZGl2ID0gMzA7XG4gICAgc3RhdGljIG11bHQgPSAzMTtcbiAgICBzdGF0aWMgbW9kID0gMzI7XG4gICAgc3RhdGljIGludmFsaWQgPSAzMztcbiAgICBzdGF0aWMgY29sb24gPSAzNDtcbn1cblxuY2xhc3MgVG9rZW4ge1xuICAgIHR5cGU6IG51bWJlcjtcbiAgICB2YWx1ZTogYW55O1xuICAgIGxpbmU/OiBudW1iZXI7XG4gICAgY29sPzogbnVtYmVyO1xuICAgIGNvbnN0cnVjdG9yKHR5cGU6IG51bWJlciwgdmFsdWU6IGFueSwgbGluZTogbnVtYmVyID0gMSwgY29sOiBudW1iZXIgPSAxKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5saW5lID0gbGluZTtcbiAgICAgICAgdGhpcy5jb2wgPSBjb2w7XG4gICAgfVxuICAgIHN0YXRpYyBmcm9tKHR5cGU6IG51bWJlciwgdmFsdWU6IGFueSkge1xuICAgICAgICByZXR1cm4gbmV3IFRva2VuKHR5cGUsIHZhbHVlKTtcbiAgICB9XG5cbiAgICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gYFske3RoaXMudHlwZS50b1N0cmluZygpfSwgJHt0aGlzLnZhbHVlfV1gO1xuICAgIH1cbn1cblxuY2xhc3MgQ2hhcnMge1xuICAgIHN0YXRpYyBlcXVhbCA9ICc9Jy5jaGFyQ29kZUF0KDApO1xuICAgIHN0YXRpYyBjb21tYSA9ICcsJy5jaGFyQ29kZUF0KDApO1xuICAgIHN0YXRpYyBzZW1pQ29sb24gPSAnOycuY2hhckNvZGVBdCgwKTtcbiAgICBzdGF0aWMgbHBhcmVuID0gJygnLmNoYXJDb2RlQXQoMCk7XG4gICAgc3RhdGljIHJwYXJlbiA9ICcpJy5jaGFyQ29kZUF0KDApO1xuICAgIHN0YXRpYyBiYWNrc2xhc2ggPSAnXFxcXCcuY2hhckNvZGVBdCgwKTtcbiAgICBzdGF0aWMgcXVvdGUgPSAnXCInLmNoYXJDb2RlQXQoMCk7XG4gICAgc3RhdGljIHNxdW90ZSA9IFwiJ1wiLmNoYXJDb2RlQXQoMCk7XG4gICAgc3RhdGljIHBsdXMgPSBcIitcIi5jaGFyQ29kZUF0KDApO1xuICAgIHN0YXRpYyBtaW51cyA9IFwiLVwiLmNoYXJDb2RlQXQoMCk7XG4gICAgc3RhdGljIHN0YXIgPSBcIipcIi5jaGFyQ29kZUF0KDApO1xuICAgIHN0YXRpYyBzbGFzaCA9IFwiL1wiLmNoYXJDb2RlQXQoMCk7XG4gICAgc3RhdGljIHBlcmNlbnQgPSBcIiVcIi5jaGFyQ29kZUF0KDApO1xuICAgIHN0YXRpYyBsYnJhY2UgPSBcIntcIi5jaGFyQ29kZUF0KDApO1xuICAgIHN0YXRpYyByYnJhY2UgPSBcIn1cIi5jaGFyQ29kZUF0KDApO1xuICAgIHN0YXRpYyBsYnJhY2tldCA9IFwiW1wiLmNoYXJDb2RlQXQoMCk7XG4gICAgc3RhdGljIHJicmFja2V0ID0gXCJdXCIuY2hhckNvZGVBdCgwKTtcbiAgICBzdGF0aWMgbm90ID0gXCIhXCIuY2hhckNvZGVBdCgwKTtcbiAgICBzdGF0aWMgZ3JlYXQgPSBcIj5cIi5jaGFyQ29kZUF0KDApO1xuICAgIHN0YXRpYyBsZXNzID0gXCI8XCIuY2hhckNvZGVBdCgwKTtcbiAgICBzdGF0aWMgYW5kID0gXCImXCIuY2hhckNvZGVBdCgwKTtcbiAgICBzdGF0aWMgcGlwZSA9IFwifFwiLmNoYXJDb2RlQXQoMCk7XG4gICAgc3RhdGljIGNvbG9uID0gXCI6XCIuY2hhckNvZGVBdCgwKTtcbn1cblxuY2xhc3MgTGV4ZXJEaWN0aW9uYXJ5IHtcbiAgICBsYW5nOiBzdHJpbmc7XG4gICAga2V5d29yZHM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcbiAgICBjb25zdHJ1Y3RvcihsYW5nOiBzdHJpbmcsIGtleXdvcmRzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9KSB7XG4gICAgICAgIHRoaXMua2V5d29yZHMgPSB7IC4uLmtleXdvcmRzIH07XG4gICAgICAgIHRoaXMubGFuZyA9IGxhbmc7XG4gICAgfVxufVxuXG4vKipcbiAqIExleGluZyA9PiBQYXJzaW5nID09PT4gQVNUID09PT4gV2Fsa2luZ1xuICovXG4vKipcbiAqIExleGVyXG4gKi9cbmNsYXNzIExleGVyIHtcbiAgICBzdGF0aWMgX2RlZmF1bHRMYW5ndWFnZSA9IG5ldyBMZXhlckRpY3Rpb25hcnkoXCJlblwiLCB7XG4gICAgICAgIFwiaWZcIjogXCJpZlwiLFxuICAgICAgICBcImVsc2VcIjogXCJlbHNlXCIsXG4gICAgICAgIFwidHJ1ZVwiOiBcInRydWVcIixcbiAgICAgICAgXCJmYWxzZVwiOiBcImZhbHNlXCIsXG4gICAgICAgIFwibnVsbFwiOiBcIm51bGxcIixcbiAgICB9KTtcbiAgICBzdGF0aWMgbGFuZ3VhZ2VzOiBMZXhlckRpY3Rpb25hcnlbXSA9IFtcbiAgICAgICAgTGV4ZXIuX2RlZmF1bHRMYW5ndWFnZSxcbiAgICAgICAgbmV3IExleGVyRGljdGlvbmFyeShcImZyXCIsIHtcbiAgICAgICAgICAgIFwic2lcIjogXCJpZlwiLFxuICAgICAgICAgICAgXCJzaW5vblwiOiBcImVsc2VcIixcbiAgICAgICAgICAgIFwidnJhaVwiOiBcImVsc2VcIixcbiAgICAgICAgICAgIFwiZmF1eFwiOiBcImZhbHNlXCIsXG4gICAgICAgICAgICBcIm51bFwiOiBcIm51bGxcIixcbiAgICAgICAgfSksXG4gICAgICAgIG5ldyBMZXhlckRpY3Rpb25hcnkoXCJibVwiLCB7XG4gICAgICAgICAgICBcIm5paVwiOiBcImlmXCIsXG4gICAgICAgICAgICBcIm5vdGVcIjogXCJlbHNlXCIsXG4gICAgICAgICAgICBcInRpZW5cIjogXCJ0cnVlXCIsXG4gICAgICAgICAgICBcImdhbG9uXCI6IFwiZmFsc2VcIixcbiAgICAgICAgICAgIFwiZ2Fuc2FuXCI6IFwibnVsbFwiLFxuICAgICAgICB9KSxcbiAgICBdO1xuICAgIHN0YXRpYyBSRVNFUlZFRDogeyBba2V5OiBzdHJpbmddOiBUb2tlbiB9ID0ge1xuICAgICAgICBcImlmXCI6IFRva2VuLmZyb20oVG9rZW5UeXBlLklGLCBcImlmXCIpLFxuICAgICAgICBcImVsc2VcIjogVG9rZW4uZnJvbShUb2tlblR5cGUuRUxTRSwgXCJlbHNlXCIpLFxuICAgICAgICBcInRydWVcIjogVG9rZW4uZnJvbShUb2tlblR5cGUuVFJVRSwgdHJ1ZSksXG4gICAgICAgIFwiZmFsc2VcIjogVG9rZW4uZnJvbShUb2tlblR5cGUuRkFMU0UsIGZhbHNlKSxcbiAgICAgICAgXCJudWxsXCI6IFRva2VuLmZyb20oVG9rZW5UeXBlLk5VTEwsIG51bGwpLFxuICAgIH07XG4gICAgX2xhbmd1YWdlPzogTGV4ZXJEaWN0aW9uYXJ5O1xuICAgIF9zb3VyY2UhOiBzdHJpbmc7XG4gICAgX3Bvc2l0aW9uID0gMDtcbiAgICBfbGluZSA9IDE7XG4gICAgX2NvbCA9IDE7XG4gICAgX2N1cnJlbnRDaGFyID0gLTE7XG4gICAgZ2V0IHNvdXJjZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NvdXJjZTtcbiAgICB9XG4gICAgY29uc3RydWN0b3Ioc291cmNlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fc291cmNlID0gc291cmNlO1xuICAgICAgICB0aGlzLl9jdXJyZW50Q2hhciA9IHRoaXMuX3NvdXJjZVt0aGlzLl9wb3NpdGlvbl0uY2hhckNvZGVBdCgwKTtcbiAgICAgICAgdGhpcy5fcmVzb2x2ZUxhbmd1YWdlKCk7XG4gICAgfVxuICAgIHByaXZhdGUgX3Jlc29sdmVMYW5ndWFnZSgpIHtcbiAgICAgICAgbGV0IHRva2VuID0gdGhpcy5uZXh0VG9rZW4oKTtcbiAgICAgICAgaWYgKHRva2VuLnR5cGUgPT09IFRva2VuVHlwZS5sZXNzKSB7XG4gICAgICAgICAgICAvLyBsYW5ndWFnZSBzZXR0aW5nXG4gICAgICAgICAgICBjb25zdCBpZFRva2VuID0gdGhpcy5uZXh0VG9rZW4oKTtcbiAgICAgICAgICAgIGlmIChpZFRva2VuLnR5cGUgIT09IFRva2VuVHlwZS5pZCkge1xuICAgICAgICAgICAgICAgIGVycm9yKHRva2VuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGxhbmcgPSBpZFRva2VuLnZhbHVlLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICB0aGlzLl9sYW5ndWFnZSA9IExleGVyLmxhbmd1YWdlcy5maW5kKChlbGVtZW50KSA9PiBlbGVtZW50LmxhbmcgPT09IGxhbmcpIHx8IExleGVyLl9kZWZhdWx0TGFuZ3VhZ2U7XG4gICAgICAgICAgICB0b2tlbiA9IHRoaXMubmV4dFRva2VuKCk7XG4gICAgICAgICAgICBpZiAodG9rZW4udHlwZSAhPT0gVG9rZW5UeXBlLmdyZWF0KSB7XG4gICAgICAgICAgICAgICAgZXJyb3IodG9rZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fbGFuZ3VhZ2UgPSBMZXhlci5fZGVmYXVsdExhbmd1YWdlO1xuICAgICAgICAgICAgLy8gcmVzZXQgcmVhZGluZ1xuICAgICAgICAgICAgdGhpcy5fcG9zaXRpb24gPSAwO1xuICAgICAgICAgICAgdGhpcy5fY3VycmVudENoYXIgPSB0aGlzLl9zb3VyY2VbdGhpcy5fcG9zaXRpb25dLmNoYXJDb2RlQXQoMCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9hZHZhbmNlKCkge1xuICAgICAgICB0aGlzLl9wb3NpdGlvbisrO1xuICAgICAgICBpZiAodGhpcy5fcG9zaXRpb24gPj0gdGhpcy5fc291cmNlLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5fY3VycmVudENoYXIgPSAtMTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jdXJyZW50Q2hhciA9IHRoaXMuX3NvdXJjZVt0aGlzLl9wb3NpdGlvbl0uY2hhckNvZGVBdCgwKTtcbiAgICAgICAgdGhpcy5fY29sKys7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcGljaygpOiBudW1iZXIge1xuICAgICAgICBpZiAodGhpcy5fcG9zaXRpb24gPj0gdGhpcy5fc291cmNlLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9zb3VyY2VbdGhpcy5fcG9zaXRpb25dLmNoYXJDb2RlQXQoMCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfaXNJZChjb2RlOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGNvZGUgPCA0OCkge1xuICAgICAgICAgICAgcmV0dXJuIGNvZGUgPT09IDM2O1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb2RlIDwgNTgpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb2RlIDwgNjUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29kZSA8IDkxKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29kZSA8IDk3KSB7XG4gICAgICAgICAgICByZXR1cm4gY29kZSA9PT0gOTU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvZGUgPCAxMjMpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9pc0lkU3RhcnQoY29kZTogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChjb2RlIDwgNjUpIHtcbiAgICAgICAgICAgIHJldHVybiBjb2RlID09PSAzNjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29kZSA8IDkxKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29kZSA8IDk3KSB7XG4gICAgICAgICAgICByZXR1cm4gY29kZSA9PT0gOTU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvZGUgPCAxMjMpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9pZCgpOiBUb2tlbiB7XG4gICAgICAgIGxldCByZXQgPSBcIlwiO1xuICAgICAgICBjb25zdCBsYXN0QyA9IHRoaXMuX2NvbDtcbiAgICAgICAgY29uc3QgbGFzdFAgPSB0aGlzLl9wb3NpdGlvbjtcbiAgICAgICAgY29uc3QgbGluZSA9IHRoaXMuX2xpbmU7XG4gICAgICAgIHdoaWxlICh0aGlzLl9pc0lkKHRoaXMuX2N1cnJlbnRDaGFyKSkge1xuICAgICAgICAgICAgcmV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUodGhpcy5fY3VycmVudENoYXIpO1xuICAgICAgICAgICAgdGhpcy5fYWR2YW5jZSgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRyYW5zbGF0ZWRJZCA9IHRoaXMuX2xhbmd1YWdlXG4gICAgICAgICAgICA/ICh0aGlzLl9sYW5ndWFnZS5rZXl3b3Jkc1tyZXRdKSB8fCByZXRcbiAgICAgICAgICAgIDogcmV0O1xuICAgICAgICByZXR1cm4gTGV4ZXIuUkVTRVJWRURbdHJhbnNsYXRlZElkXSB8fCBuZXcgVG9rZW4oVG9rZW5UeXBlLmlkLCByZXQsIGxpbmUsIGxhc3RDKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9pc0xpbmVFbmQoYzogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBjID09PSAxMCB8fFxuICAgICAgICAgICAgYyA9PT0gMTMgfHxcbiAgICAgICAgICAgIFsnXFxuJywgJ1xccicsICdcXHUyMDI4JywgJ1xcdTIwMjknXS5pbmNsdWRlcyhTdHJpbmcuZnJvbUNoYXJDb2RlKGMpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9pc1doaXRlU3BhY2UoYzogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGMpLnRyaW0oKSA9PT0gXCJcIiAmJlxuICAgICAgICAgICAgU3RyaW5nLmZyb21DaGFyQ29kZShjKS5sZW5ndGggPiAwO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2lzRGlnaXQoYzogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1iaXR3aXNlXG4gICAgICAgIHJldHVybiBjID4gMCAmJiAoYyBeIDB4MzApIDw9IDk7XG4gICAgfVxuICAgIHByaXZhdGUgX3NraXBXaGl0ZVNwYWNlKCkge1xuICAgICAgICB3aGlsZSAodGhpcy5faXNXaGl0ZVNwYWNlKHRoaXMuX2N1cnJlbnRDaGFyKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgdGhpcy5fYWR2YW5jZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfbnVtYmVyKCk6IFRva2VuIHtcbiAgICAgICAgbGV0IHJldCA9IFwiXCI7XG4gICAgICAgIGNvbnN0IGxhc3RDID0gdGhpcy5fY29sO1xuICAgICAgICBjb25zdCBsYXN0UCA9IHRoaXMuX3Bvc2l0aW9uO1xuICAgICAgICBjb25zdCBsaW5lID0gdGhpcy5fbGluZTtcbiAgICAgICAgY29uc3QgZmlyc3QgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHRoaXMuX2N1cnJlbnRDaGFyKTtcbiAgICAgICAgdGhpcy5fYWR2YW5jZSgpO1xuICAgICAgICBjb25zdCBiYyA9IFN0cmluZy5mcm9tQ2hhckNvZGUodGhpcy5fY3VycmVudENoYXIpO1xuICAgICAgICBsZXQgYmFzZSA9IDEwO1xuICAgICAgICBpZiAoZmlyc3QgPT09ICcwJyAmJiBbJ2InLCAnQicsICd4JywgJ1gnLCAnbycsICdPJ10uaW5jbHVkZXMoYmMpKSB7XG4gICAgICAgICAgICAvLyBsb29rIGFoZWFkIHRvIHNlZSB0aGF0IHRoZSBudW1iZXIgaXMgdGFnZ2VkXG4gICAgICAgICAgICB0aGlzLl9hZHZhbmNlKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKGJjLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdiJzpcbiAgICAgICAgICAgICAgICAgICAgYmFzZSA9IDI7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJvXCI6XG4gICAgICAgICAgICAgICAgICAgIGJhc2UgPSA4O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwieFwiOlxuICAgICAgICAgICAgICAgICAgICBiYXNlID0gMTY7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGJhc2UgPSAxMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldCArPSBmaXJzdDtcbiAgICAgICAgICAgIGJhc2UgPSAxMDtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAodGhpcy5faXNEaWdpdCh0aGlzLl9jdXJyZW50Q2hhcikgfHxcbiAgICAgICAgICAgIChiYXNlID09PSAxNiAmJlxuICAgICAgICAgICAgICAgIFsnQScsICdhJywgJ0InLCAnYicsICdDJywgJ2MnLCAnRCcsICdkJywgJ0UnLCAnZScsICdGJywgJ2YnXVxuICAgICAgICAgICAgICAgICAgICAuaW5jbHVkZXMoU3RyaW5nLmZyb21DaGFyQ29kZSh0aGlzLl9jdXJyZW50Q2hhcikpKSkge1xuICAgICAgICAgICAgcmV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUodGhpcy5fY3VycmVudENoYXIpO1xuICAgICAgICAgICAgdGhpcy5fYWR2YW5jZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChTdHJpbmcuZnJvbUNoYXJDb2RlKHRoaXMuX2N1cnJlbnRDaGFyKSA9PT0gJy4nICYmIHRoaXMuX2lzRGlnaXQodGhpcy5fcGljaygpKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgaWYgKGJhc2UgIT09IDEwKSB7XG4gICAgICAgICAgICAgICAgZXJyb3IobmV3IFRva2VuKFRva2VuVHlwZS5pZCwgYmMsIGxpbmUsIGxhc3RQKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBmbG9hdGluZyBudW1iZXJcbiAgICAgICAgICAgIHJldCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHRoaXMuX2N1cnJlbnRDaGFyKTtcbiAgICAgICAgICAgIHRoaXMuX2FkdmFuY2UoKTtcbiAgICAgICAgICAgIHdoaWxlICh0aGlzLl9pc0RpZ2l0KHRoaXMuX2N1cnJlbnRDaGFyKSkge1xuICAgICAgICAgICAgICAgIHJldCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHRoaXMuX2N1cnJlbnRDaGFyKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9hZHZhbmNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV3IFRva2VuKFRva2VuVHlwZS5udW1iZXJDb25zdCwgcGFyc2VGbG9hdChyZXQpLCBsaW5lLCBsYXN0Qyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBUb2tlbihcbiAgICAgICAgICAgIFRva2VuVHlwZS5udW1iZXJDb25zdCwgcGFyc2VJbnQocmV0LCBiYXNlKSwgbGluZSwgbGFzdEMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2xpdGVyYWxTdHJpbmcoc3RhcnRDaGFyOiBudW1iZXIpOiBUb2tlbiB7XG4gICAgICAgIGxldCByZXQgPSBcIlwiO1xuICAgICAgICBsZXQgbGFzdENoYXIgPSAtMTtcbiAgICAgICAgY29uc3QgbGFzdFAgPSB0aGlzLl9wb3NpdGlvbjtcbiAgICAgICAgY29uc3QgbGFzdEMgPSB0aGlzLl9jb2w7XG4gICAgICAgIGNvbnN0IGxhc3RMID0gdGhpcy5fbGluZTtcbiAgICAgICAgd2hpbGUgKHRoaXMuX2N1cnJlbnRDaGFyICE9PSAtMSkge1xuICAgICAgICAgICAgY29uc3QgbmV4dCA9IFN0cmluZy5mcm9tQ2hhckNvZGUodGhpcy5fcGljaygpKTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jdXJyZW50Q2hhciA9PT0gQ2hhcnMuYmFja3NsYXNoKSB7XG4gICAgICAgICAgICAgICAgLy8gc2NhcGUgY2hhclxuICAgICAgICAgICAgICAgIGlmIChbXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0Q2hhcixcbiAgICAgICAgICAgICAgICAgICAgJ1xcXFwnLFxuICAgICAgICAgICAgICAgICAgICAnMCcsXG4gICAgICAgICAgICAgICAgICAgICdhJyxcbiAgICAgICAgICAgICAgICAgICAgJ2InLFxuICAgICAgICAgICAgICAgICAgICAnZScsXG4gICAgICAgICAgICAgICAgICAgICdmJyxcbiAgICAgICAgICAgICAgICAgICAgJ24nLFxuICAgICAgICAgICAgICAgICAgICAncicsXG4gICAgICAgICAgICAgICAgICAgICd0JyxcbiAgICAgICAgICAgICAgICAgICAgJ3UnLFxuICAgICAgICAgICAgICAgICAgICAnVScsXG4gICAgICAgICAgICAgICAgICAgICd2JyxcbiAgICAgICAgICAgICAgICAgICAgJ3gnXG4gICAgICAgICAgICAgICAgXS5pbmNsdWRlcyhuZXh0KSkge1xuICAgICAgICAgICAgICAgICAgICBsYXN0Q2hhciA9IHRoaXMuX2N1cnJlbnRDaGFyO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hZHZhbmNlKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9jdXJyZW50Q2hhciA9PT0gc3RhcnRDaGFyICYmIGxhc3RDaGFyICE9PSBDaGFycy5iYWNrc2xhc2gpIHtcbiAgICAgICAgICAgICAgICAvLyBlbmRcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUodGhpcy5fY3VycmVudENoYXIpO1xuICAgICAgICAgICAgbGFzdENoYXIgPSB0aGlzLl9jdXJyZW50Q2hhcjtcbiAgICAgICAgICAgIHRoaXMuX2FkdmFuY2UoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFRva2VuKFRva2VuVHlwZS5zdHJpbmdDb25zdCwgcmV0LCBsYXN0TCwgbGFzdEMpO1xuICAgIH1cblxuICAgIC8vIGY9U1VCTUlUX0ZPUk0oeHh4KTtcbiAgICAvLyByID0gQ0FMTF9BUEkoQVBJX0lELCBmKTtcbiAgICAvLyBESVNQTEFZKFwiTVNHICNyXCIpXG4gICAgbmV4dFRva2VuKCk6IFRva2VuIHtcbiAgICAgICAgY29uc3QgbGFzdEwgPSB0aGlzLl9saW5lO1xuICAgICAgICBjb25zdCBsYXN0QyA9IHRoaXMuX2NvbDtcbiAgICAgICAgY29uc3QgbGFzdFAgPSB0aGlzLl9wb3NpdGlvbjtcblxuICAgICAgICB3aGlsZSAodGhpcy5fY3VycmVudENoYXIgIT09IC0xKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5faXNMaW5lRW5kKHRoaXMuX2N1cnJlbnRDaGFyKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xpbmUrKztcbiAgICAgICAgICAgICAgICB0aGlzLl9jb2wgPSAxO1xuICAgICAgICAgICAgICAgIHRoaXMuX2FkdmFuY2UoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRva2VuKFRva2VuVHlwZS5lb2wsIFwiXFxuXCIsIGxhc3RMLCBsYXN0Qyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLl9pc1doaXRlU3BhY2UodGhpcy5fY3VycmVudENoYXIpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2tpcFdoaXRlU3BhY2UoKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9pc0RpZ2l0KHRoaXMuX2N1cnJlbnRDaGFyKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9udW1iZXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9pc0lkU3RhcnQodGhpcy5fY3VycmVudENoYXIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2lkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5fY3VycmVudENoYXIgPT09IENoYXJzLmVxdWFsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fYWR2YW5jZSgpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9jdXJyZW50Q2hhciA9PT0gQ2hhcnMuZXF1YWwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYWR2YW5jZSgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRva2VuKFRva2VuVHlwZS5lcWVxLCBcIj09XCIsIGxhc3RMLCBsYXN0Qyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVG9rZW4oVG9rZW5UeXBlLmVxdWFsLCBcIj1cIiwgbGFzdEwsIGxhc3RDKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9jdXJyZW50Q2hhciA9PT0gQ2hhcnMuZ3JlYXQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9hZHZhbmNlKCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRDaGFyID09PSBDaGFycy5lcXVhbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hZHZhbmNlKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVG9rZW4oVG9rZW5UeXBlLmdyZWF0RXEsIFwiPj1cIiwgbGFzdEwsIGxhc3RDKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUb2tlbihUb2tlblR5cGUuZ3JlYXQsIFwiPlwiLCBsYXN0TCwgbGFzdEMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRDaGFyID09PSBDaGFycy5sZXNzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fYWR2YW5jZSgpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9jdXJyZW50Q2hhciA9PT0gQ2hhcnMuZXF1YWwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYWR2YW5jZSgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRva2VuKFRva2VuVHlwZS5sZXNzRXEsIFwiPD1cIiwgbGFzdEwsIGxhc3RDKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUb2tlbihUb2tlblR5cGUubGVzcywgXCI8XCIsIGxhc3RMLCBsYXN0Qyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5fY3VycmVudENoYXIgPT09IENoYXJzLnNlbWlDb2xvbikge1xuICAgICAgICAgICAgICAgIHRoaXMuX2FkdmFuY2UoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRva2VuKFRva2VuVHlwZS5zZW1pLCBcIjtcIiwgbGFzdEwsIGxhc3RDKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9jdXJyZW50Q2hhciA9PT0gQ2hhcnMubHBhcmVuKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fYWR2YW5jZSgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVG9rZW4oVG9rZW5UeXBlLmxwYXJlbiwgXCIoXCIsIGxhc3RMLCBsYXN0Qyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5fY3VycmVudENoYXIgPT09IENoYXJzLnJwYXJlbikge1xuICAgICAgICAgICAgICAgIHRoaXMuX2FkdmFuY2UoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRva2VuKFRva2VuVHlwZS5ycGFyZW4sIFwiKVwiLCBsYXN0TCwgbGFzdEMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRDaGFyID09PSBDaGFycy5jb21tYSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2FkdmFuY2UoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRva2VuKFRva2VuVHlwZS5jb21tYSwgXCIsXCIsIGxhc3RMLCBsYXN0Qyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5fY3VycmVudENoYXIgPT09IENoYXJzLmxicmFjZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2FkdmFuY2UoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRva2VuKFRva2VuVHlwZS5sYnJhY2UsIFwie1wiLCBsYXN0TCwgbGFzdEMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRDaGFyID09PSBDaGFycy5yYnJhY2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9hZHZhbmNlKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUb2tlbihUb2tlblR5cGUucmJyYWNlLCBcIn1cIiwgbGFzdEwsIGxhc3RDKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9jdXJyZW50Q2hhciA9PT0gQ2hhcnMubGJyYWNrZXQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9hZHZhbmNlKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUb2tlbihUb2tlblR5cGUubGJyYWNrZXQsIFwiW1wiLCBsYXN0TCwgbGFzdEMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRDaGFyID09PSBDaGFycy5yYnJhY2tldCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2FkdmFuY2UoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRva2VuKFRva2VuVHlwZS5yYnJhY2tldCwgXCJdXCIsIGxhc3RMLCBsYXN0Qyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5fY3VycmVudENoYXIgPT09IENoYXJzLnBsdXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9hZHZhbmNlKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUb2tlbihUb2tlblR5cGUucGx1cywgXCIrXCIsIGxhc3RMLCBsYXN0Qyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5fY3VycmVudENoYXIgPT09IENoYXJzLm1pbnVzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fYWR2YW5jZSgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVG9rZW4oVG9rZW5UeXBlLm1pbnVzLCBcIi1cIiwgbGFzdEwsIGxhc3RDKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9jdXJyZW50Q2hhciA9PT0gQ2hhcnMuc2xhc2gpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9hZHZhbmNlKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUb2tlbihUb2tlblR5cGUuZGl2LCBcIi9cIiwgbGFzdEwsIGxhc3RDKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9jdXJyZW50Q2hhciA9PT0gQ2hhcnMuc3Rhcikge1xuICAgICAgICAgICAgICAgIHRoaXMuX2FkdmFuY2UoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRva2VuKFRva2VuVHlwZS5tdWx0LCBcIipcIiwgbGFzdEwsIGxhc3RDKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9jdXJyZW50Q2hhciA9PT0gQ2hhcnMucGVyY2VudCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2FkdmFuY2UoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRva2VuKFRva2VuVHlwZS5tb2QsIFwiJVwiLCBsYXN0TCwgbGFzdEMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRDaGFyID09PSBDaGFycy5jb2xvbikge1xuICAgICAgICAgICAgICAgIHRoaXMuX2FkdmFuY2UoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRva2VuKFRva2VuVHlwZS5jb2xvbiwgXCI6XCIsIGxhc3RMLCBsYXN0Qyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5fY3VycmVudENoYXIgPT09IENoYXJzLm5vdCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2FkdmFuY2UoKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fY3VycmVudENoYXIgPT09IENoYXJzLmVxdWFsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2FkdmFuY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUb2tlbihUb2tlblR5cGUubm90RXEsIFwiIT1cIiwgbGFzdEwsIGxhc3RDKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUb2tlbihUb2tlblR5cGUubm90LCBcIiFcIiwgbGFzdEwsIGxhc3RDKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9jdXJyZW50Q2hhciA9PT0gQ2hhcnMuYW5kICYmIHRoaXMuX3BpY2soKSA9PT0gQ2hhcnMuYW5kKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fYWR2YW5jZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2FkdmFuY2UoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRva2VuKFRva2VuVHlwZS5hbmQsIFwiJiZcIiwgbGFzdEwsIGxhc3RDKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9jdXJyZW50Q2hhciA9PT0gQ2hhcnMucGlwZSAmJiB0aGlzLl9waWNrKCkgPT09IENoYXJzLnBpcGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9hZHZhbmNlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fYWR2YW5jZSgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVG9rZW4oVG9rZW5UeXBlLmFuZCwgJ3x8JywgbGFzdEwsIGxhc3RDKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9jdXJyZW50Q2hhciA9PT0gQ2hhcnMucXVvdGUgfHwgdGhpcy5fY3VycmVudENoYXIgPT09IENoYXJzLnNxdW90ZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0Q2hhciA9IHRoaXMuX2N1cnJlbnRDaGFyO1xuICAgICAgICAgICAgICAgIHRoaXMuX2FkdmFuY2UoKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0ID0gdGhpcy5fbGl0ZXJhbFN0cmluZyhzdGFydENoYXIpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2FkdmFuY2UoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXcgVG9rZW4oXG4gICAgICAgICAgICAgICAgVG9rZW5UeXBlLmludmFsaWQsIFN0cmluZy5mcm9tQ2hhckNvZGUodGhpcy5fY3VycmVudENoYXIpLCBsYXN0TCwgbGFzdEMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVG9rZW4oVG9rZW5UeXBlLmVvZiwgXCJcIiwgbGFzdEwsIGxhc3RDKTtcbiAgICB9XG59XG5cblxuLyoqXG4gKiBQYXJzZXJcbiAqL1xuXG5hYnN0cmFjdCBjbGFzcyBBU1Qge1xuICAgIGxpbmU/OiBudW1iZXI7XG4gICAgY29sPzogbnVtYmVyO1xuICAgIGNvbnN0cnVjdG9yKGxpbmU/OiBudW1iZXIsIGNvbD86IG51bWJlcikge1xuICAgICAgICB0aGlzLmxpbmUgPSBsaW5lO1xuICAgICAgICB0aGlzLmNvbCA9IGNvbDtcbiAgICB9XG4gICAgZHVtcCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy50b1N0cmluZygpO1xuICAgIH1cbn1cblxuY2xhc3MgUm9vdEFTVCBleHRlbmRzIEFTVCB7XG4gICAgYm9keTogQVNUW107XG4gICAgc291cmNlOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGNvbnN0cnVjdG9yKGJvZHk6IEFTVFtdLCBuYW1lOiBzdHJpbmcsIHNvdXJjZTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKDEsIDEpO1xuICAgICAgICB0aGlzLmJvZHkgPSBib2R5O1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgICB9XG5cbiAgICBvdmVycmlkZSBkdW1wKCk6IHN0cmluZyB7XG4gICAgICAgIGxldCBidWlsZGVyID0gYE1vZHVsZSAke3RoaXMubmFtZX0gU3RhcnQge2A7XG4gICAgICAgIGZvciAoY29uc3QgaXQgb2YgdGhpcy5ib2R5KSB7XG4gICAgICAgICAgICBidWlsZGVyICs9IGAke2l0LmR1bXAoKX1cXG5gO1xuICAgICAgICB9XG4gICAgICAgIGJ1aWxkZXIgKz0gXCJ9XCI7XG4gICAgICAgIHJldHVybiBidWlsZGVyO1xuICAgIH1cbn1cblxuY2xhc3MgQmxvY2tTdGF0ZW1lbnRBU1QgZXh0ZW5kcyBBU1Qge1xuICAgIGJvZHk6IEFTVFtdO1xuICAgIGNvbnN0cnVjdG9yKGJvZHk6IEFTVFtdLCB0b2tlbjogVG9rZW4pIHtcbiAgICAgICAgc3VwZXIodG9rZW4ubGluZSwgdG9rZW4uY29sKTtcbiAgICAgICAgdGhpcy5ib2R5ID0gYm9keTtcbiAgICB9XG4gICAgb3ZlcnJpZGUgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGB7XFxuJHt0aGlzLmJvZHkubWFwKChlKSA9PiBlLnRvU3RyaW5nKCkpLmpvaW4oXCJcXG5cIil9fWA7XG4gICAgfVxufVxuXG5jbGFzcyBJZGVudGlmaWVyQVNUIGV4dGVuZHMgQVNUIHtcbiAgICB2YWx1ZTogc3RyaW5nO1xuICAgIGNvbnN0cnVjdG9yKHRva2VuOiBUb2tlbikge1xuICAgICAgICBzdXBlcih0b2tlbi5saW5lLCB0b2tlbi5jb2wpO1xuICAgICAgICB0aGlzLnZhbHVlID0gdG9rZW4udmFsdWUudG9TdHJpbmcoKTtcbiAgICB9XG4gICAgb3ZlcnJpZGUgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gICAgfVxufVxuXG5jbGFzcyBMaXRlcmFsQVNUIGV4dGVuZHMgQVNUIHtcbiAgICB2YWx1ZTogYW55O1xuICAgIHJhdzogc3RyaW5nO1xuICAgIGNvbnN0cnVjdG9yKHRva2VuOiBUb2tlbiwgcmF3OiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIodG9rZW4ubGluZSwgdG9rZW4uY29sKTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHRva2VuLnZhbHVlO1xuICAgICAgICB0aGlzLnJhdyA9IHJhdztcbiAgICB9XG4gICAgb3ZlcnJpZGUgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUudG9TdHJpbmcoKTtcbiAgICB9XG59XG5cbmNsYXNzIEFzc2lnbm1lbnRFeHByZXNzaW9uQVNUIGV4dGVuZHMgQVNUIHtcbiAgICBpZGVudGlmaWVyOiBBU1Q7XG4gICAgaW5pdDogQVNUO1xuICAgIGNvbnN0cnVjdG9yKGlkZW50aWZpZXI6IEFTVCwgaW5pdDogQVNUKSB7XG4gICAgICAgIHN1cGVyKGlkZW50aWZpZXIubGluZSwgaWRlbnRpZmllci5jb2wpO1xuICAgICAgICB0aGlzLmlkZW50aWZpZXIgPSBpZGVudGlmaWVyO1xuICAgICAgICB0aGlzLmluaXQgPSBpbml0O1xuICAgIH1cbiAgICBvdmVycmlkZSB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gYCR7dGhpcy5pZGVudGlmaWVyfSA9ICR7dGhpcy5pbml0fWA7XG4gICAgfVxufVxuXG5jbGFzcyBFeHByZXNzaW9uU3RhdGVtZW50QVNUIGV4dGVuZHMgQVNUIHtcbiAgICBleHByZXNzaW9uOiBBU1Q7XG4gICAgY29uc3RydWN0b3IoZXhwcmVzc2lvbjogQVNUKSB7XG4gICAgICAgIHN1cGVyKGV4cHJlc3Npb24ubGluZSwgZXhwcmVzc2lvbi5jb2wpO1xuICAgICAgICB0aGlzLmV4cHJlc3Npb24gPSBleHByZXNzaW9uO1xuICAgIH1cbiAgICBvdmVycmlkZSB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5leHByZXNzaW9uLnRvU3RyaW5nKCk7XG4gICAgfVxufVxuXG5jbGFzcyBDYWxsRXhwcmVzc2lvbkFTVCBleHRlbmRzIEFTVCB7XG4gICAgY2FsbGVlOiBJZGVudGlmaWVyQVNUO1xuICAgIGFyZ3VtZW50czogQVNUW107XG4gICAgY29uc3RydWN0b3IoY2FsbGVlOiBJZGVudGlmaWVyQVNULCBhZ3M6IEFTVFtdKSB7XG4gICAgICAgIHN1cGVyKGNhbGxlZS5saW5lLCBjYWxsZWUuY29sKTtcbiAgICAgICAgdGhpcy5jYWxsZWUgPSBjYWxsZWU7XG4gICAgICAgIHRoaXMuYXJndW1lbnRzID0gYWdzO1xuICAgIH1cbiAgICBvdmVycmlkZSB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gYCR7dGhpcy5jYWxsZWUudG9TdHJpbmcoKX0oLi4uJHt0aGlzLmFyZ3VtZW50cy5sZW5ndGh9KWA7XG4gICAgfVxufVxuXG5jbGFzcyBCaW5hcnlFeHByZXNzaW9uQVNUIGV4dGVuZHMgQVNUIHtcbiAgICBsZWZ0OiBBU1Q7XG4gICAgb3BlcmF0aW9uOiBUb2tlbjtcbiAgICByaWdodDogQVNUO1xuICAgIGNvbnN0cnVjdG9yKGxlZnQ6IEFTVCwgb3BlcmF0aW9uOiBUb2tlbiwgcmlnaHQ6IEFTVCkge1xuICAgICAgICBzdXBlcihsZWZ0LmxpbmUsIGxlZnQuY29sKTtcbiAgICAgICAgdGhpcy5sZWZ0ID0gbGVmdDtcbiAgICAgICAgdGhpcy5vcGVyYXRpb24gPSBvcGVyYXRpb247XG4gICAgICAgIHRoaXMucmlnaHQgPSByaWdodDtcbiAgICB9XG4gICAgb3ZlcnJpZGUgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGAke3RoaXMubGVmdH0gJHt0aGlzLm9wZXJhdGlvbn0gJHt0aGlzLnJpZ2h0fWA7XG4gICAgfVxufVxuXG5jbGFzcyBVbmFyeUV4cHJlc3Npb25BU1QgZXh0ZW5kcyBBU1Qge1xuICAgIG9wZXJhdGlvbjogVG9rZW47XG4gICAgYXJndW1lbnQ6IEFTVDtcbiAgICBjb25zdHJ1Y3RvcihvcGVyYXRpb246IFRva2VuLCBhcmd1bWVudDogQVNUKSB7XG4gICAgICAgIHN1cGVyKG9wZXJhdGlvbi5saW5lLCBvcGVyYXRpb24uY29sKTtcbiAgICAgICAgdGhpcy5vcGVyYXRpb24gPSBvcGVyYXRpb24sIHRoaXMuYXJndW1lbnQgPSBhcmd1bWVudDtcbiAgICB9XG4gICAgb3ZlcnJpZGUgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGAke3RoaXMub3BlcmF0aW9ufSAke3RoaXMuYXJndW1lbnR9YDtcbiAgICB9XG59XG5cbmNsYXNzIElmU3RhdGVtZW50QVNUIGV4dGVuZHMgQVNUIHtcbiAgICB0ZXN0OiBBU1Q7XG4gICAgY29uc2VxdWVudDogQVNUO1xuICAgIGFsdGVybmF0ZT86IEFTVDtcbiAgICBjb25zdHJ1Y3Rvcih0ZXN0OiBBU1QsIGNvbnNlcXVlbnQ6IEFTVCwgYWx0ZXJuYXRlPzogQVNUKSB7XG4gICAgICAgIHN1cGVyKHRlc3QubGluZSwgdGVzdC5jb2wpO1xuICAgICAgICB0aGlzLnRlc3QgPSB0ZXN0O1xuICAgICAgICB0aGlzLmNvbnNlcXVlbnQgPSBjb25zZXF1ZW50O1xuICAgICAgICB0aGlzLmFsdGVybmF0ZSA9IGFsdGVybmF0ZTtcbiAgICB9XG5cbiAgICBvdmVycmlkZSB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gYGlmICR7dGhpcy50ZXN0fSAke3RoaXMuY29uc2VxdWVudH0gJHt0aGlzLmFsdGVybmF0ZSAhPT0gbnVsbCA/IGBlbHNlICR7dGhpcy5hbHRlcm5hdGV9IGAgOiAnJ31gO1xuICAgIH1cbn1cblxuY2xhc3MgTG9naWNhbEV4cHJlc3Npb25BU1QgZXh0ZW5kcyBBU1Qge1xuICAgIGxlZnQ6IEFTVDtcbiAgICBvcGVyYXRvcjogVG9rZW47XG4gICAgcmlnaHQ6IEFTVDtcbiAgICBjb25zdHJ1Y3RvcihsZWZ0OiBBU1QsIG9wZXJhdG9yOiBUb2tlbiwgcmlnaHQ6IEFTVCkge1xuICAgICAgICBzdXBlcihsZWZ0LmxpbmUsIGxlZnQuY29sKTtcbiAgICAgICAgdGhpcy5sZWZ0ID0gbGVmdDtcbiAgICAgICAgdGhpcy5vcGVyYXRvciA9IG9wZXJhdG9yO1xuICAgICAgICB0aGlzLnJpZ2h0ID0gcmlnaHQ7XG4gICAgfVxuICAgIG92ZXJyaWRlIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBgJHt0aGlzLmxlZnR9ICR7dGhpcy5vcGVyYXRvci52YWx1ZX0gJHt0aGlzLnJpZ2h0fWA7XG4gICAgfVxufVxuXG5jbGFzcyBJbmRleEFjY2Vzc29yQVNUIGV4dGVuZHMgQVNUIHtcbiAgICBvd25lcjogQVNUO1xuICAgIGtleTogQVNUO1xuICAgIGNvbXB1dGVkOiBib29sZWFuID0gZmFsc2U7XG4gICAgY29uc3RydWN0b3Iob3duZXI6IEFTVCwga2V5OiBBU1QsIGNvbXB1dGVkOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICAgICAgc3VwZXIob3duZXIubGluZSwgb3duZXIuY29sKTtcbiAgICAgICAgdGhpcy5vd25lciA9IG93bmVyO1xuICAgICAgICB0aGlzLmtleSA9IGtleTtcbiAgICAgICAgdGhpcy5jb21wdXRlZCA9IGNvbXB1dGVkO1xuICAgIH1cbiAgICBvdmVycmlkZSB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gYCR7dGhpcy5vd25lcn1bJHt0aGlzLmtleX1dYDtcbiAgICB9XG59XG5cbmNsYXNzIE9iamVjdEV4cHJlc3Npb24gZXh0ZW5kcyBBU1Qge1xuICAgIHByb3BlcnRpZXM6IEFTVFtdO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzOiBBU1RbXSwgc3RhcnRUb2tlbj86IFRva2VuLCBlbmRUb2tlbj86IFRva2VuKSB7XG4gICAgICAgIHN1cGVyKHN0YXJ0VG9rZW4/LmxpbmUsIHN0YXJ0VG9rZW4/LmNvbCk7XG4gICAgICAgIHRoaXMucHJvcGVydGllcyA9IHByb3BzO1xuICAgIH1cbiAgICBvdmVycmlkZSAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIFwiey4uLn1cIjtcbiAgICB9XG59XG5cbmNsYXNzIEFycmF5RXhwcmVzc2lvbiBleHRlbmRzIEFTVCB7XG4gICAgZWxlbWVudHM6IEFTVFtdO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzOiBBU1RbXSwgc3RhcnQ/OiBBU1QsIGVuZD86IEFTVCkge1xuICAgICAgICBzdXBlcihzdGFydD8ubGluZSwgc3RhcnQ/LmNvbCk7XG4gICAgICAgIHRoaXMuZWxlbWVudHMgPSBwcm9wcztcbiAgICB9XG4gICAgb3ZlcnJpZGUgIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBcIlsuLi5dXCI7XG4gICAgfVxufVxuY2xhc3MgT2JqZWN0UHJvcGVydHkgZXh0ZW5kcyBBU1Qge1xuICAgIGtleTogQVNUO1xuICAgIHZhbHVlOiBBU1Q7XG4gICAgY29uc3RydWN0b3Ioa2V5OiBBU1QsIHZhbHVlOiBBU1QpIHtcbiAgICAgICAgc3VwZXIoa2V5LmxpbmUsIGtleS5jb2wpO1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMua2V5ID0ga2V5O1xuICAgIH1cbn1cblxuY2xhc3MgUGFyc2VyIHtcbiAgICBzdGF0aWMgX2Jpbm9wUHJlY2RlbmNlczogeyBbazogbnVtYmVyXTogbnVtYmVyIH0gPSB7XG4gICAgICAgIFtUb2tlblR5cGUuZXFlcV06IDEwLFxuICAgICAgICBbVG9rZW5UeXBlLm5vdEVxXTogMTAsXG4gICAgICAgIFtUb2tlblR5cGUuZ3JlYXRdOiAxMCxcbiAgICAgICAgW1Rva2VuVHlwZS5ncmVhdEVxXTogMTAsXG4gICAgICAgIFtUb2tlblR5cGUubGVzc106IDEwLFxuICAgICAgICBbVG9rZW5UeXBlLmxlc3NFcV06IDEwLFxuICAgICAgICBbVG9rZW5UeXBlLnBsdXNdOiAyMCxcbiAgICAgICAgW1Rva2VuVHlwZS5taW51c106IDIwLFxuICAgICAgICBbVG9rZW5UeXBlLm11bHRdOiA0MCxcbiAgICAgICAgW1Rva2VuVHlwZS5kaXZdOiA0MCxcbiAgICAgICAgW1Rva2VuVHlwZS5tb2RdOiA0MCxcbiAgICB9O1xuICAgIC8vIExleGVyLlRva2VuVHlwZS5BTkQgdG8gOSxcbiAgICAvLyBMZXhlci5Ub2tlblR5cGUuT1IgdG8gOSxcbiAgICAvLyBMZXhlci5Ub2tlblR5cGUuQlRfQU5EIHRvIDksXG4gICAgLy8gTGV4ZXIuVG9rZW5UeXBlLkJUX09SIHRvIDksXG4gICAgLy8gTGV4ZXIuVG9rZW5UeXBlLkJUX1hPUiB0byA5LFxuICAgIC8vIExleGVyLlRva2VuVHlwZS5FUVVBTCB0byAxMCxcbiAgICAvLyBMZXhlci5Ub2tlblR5cGUuR1JFQVQgdG8gMTAsXG4gICAgLy8gTGV4ZXIuVG9rZW5UeXBlLkxFU1MgdG8gMTAsXG4gICAgLy8gTGV4ZXIuVG9rZW5UeXBlLkxFU1NfRVEgdG8gMTAsXG4gICAgLy8gTGV4ZXIuVG9rZW5UeXBlLkdSRUFUX0VRIHRvIDEwLFxuICAgIC8vIExleGVyLlRva2VuVHlwZS5CVF9TSElGVF9MIHRvIDEyLFxuICAgIC8vIExleGVyLlRva2VuVHlwZS5CVF9TSElGVF9SIHRvIDEyLFxuICAgIC8vIExleGVyLlRva2VuVHlwZS5QTFVTIHRvIDIwLFxuICAgIC8vIExleGVyLlRva2VuVHlwZS5NSU5VUyB0byAyMCxcbiAgICAvLyBMZXhlci5Ub2tlblR5cGUuTVVMVCB0byA0MCxcbiAgICAvLyBMZXhlci5Ub2tlblR5cGUuRElWIHRvIDQwLFxuICAgIC8vIExleGVyLlRva2VuVHlwZS5NT0QgdG8gNDAsXG5cbiAgICBsZXhlciE6IExleGVyO1xuICAgIGN1cnJlbnRUb2tlbj86IFRva2VuO1xuICAgIGNvbnN0cnVjdG9yKGxleGVyOiBMZXhlcikge1xuICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbiA9IGxleGVyLm5leHRUb2tlbigpO1xuICAgICAgICB0aGlzLmxleGVyID0gbGV4ZXI7XG4gICAgfVxuXG4gICAgX2VhdCh0eXBlOiBUb2tlblR5cGUpIHtcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudFRva2VuPy50eXBlID09PSB0eXBlKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbiA9IHRoaXMubGV4ZXIubmV4dFRva2VuKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlcnJvcih0aGlzLmN1cnJlbnRUb2tlbiEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX2VhdEVPTCgpIHtcbiAgICAgICAgd2hpbGUgKHRoaXMuY3VycmVudFRva2VuPy50eXBlID09PSBUb2tlblR5cGUuZW9sKSB7XG4gICAgICAgICAgICB0aGlzLl9lYXQoVG9rZW5UeXBlLmVvbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfZWF0U2VtaU9yRU9MKCkge1xuICAgICAgICB3aGlsZSAodGhpcy5jdXJyZW50VG9rZW4/LnR5cGUgPT09IFRva2VuVHlwZS5lb2wgfHxcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFRva2VuPy50eXBlID09PSBUb2tlblR5cGUuc2VtaSkge1xuICAgICAgICAgICAgdGhpcy5fZWF0KHRoaXMuY3VycmVudFRva2VuIS50eXBlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9lYXRTZW1pKCkge1xuICAgICAgICB3aGlsZSAodGhpcy5jdXJyZW50VG9rZW4/LnR5cGUgPT09IFRva2VuVHlwZS5zZW1pKSB7XG4gICAgICAgICAgICB0aGlzLl9lYXQoVG9rZW5UeXBlLnNlbWkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX3ZhcmlhYmxlKCk6IElkZW50aWZpZXJBU1Qge1xuICAgICAgICBjb25zdCBub2RlID0gbmV3IElkZW50aWZpZXJBU1QodGhpcy5jdXJyZW50VG9rZW4hKTtcbiAgICAgICAgdGhpcy5fZWF0KFRva2VuVHlwZS5pZCk7XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cblxuICAgIF9mYWN0b3IoKTogQVNUIHtcbiAgICAgICAgY29uc3QgdG9rZW4gPSB0aGlzLmN1cnJlbnRUb2tlbiE7XG4gICAgICAgIHN3aXRjaCAodG9rZW4udHlwZSkge1xuICAgICAgICAgICAgY2FzZSBUb2tlblR5cGUucGx1czpcbiAgICAgICAgICAgIGNhc2UgVG9rZW5UeXBlLm1pbnVzOlxuICAgICAgICAgICAgY2FzZSBUb2tlblR5cGUubm90OlxuICAgICAgICAgICAgICAgIHRoaXMuX2VhdCh0aGlzLmN1cnJlbnRUb2tlbiEudHlwZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVbmFyeUV4cHJlc3Npb25BU1QodG9rZW4hLCB0aGlzLl9mYWN0b3IoKSk7XG4gICAgICAgICAgICBjYXNlIFRva2VuVHlwZS5udW1iZXJDb25zdDpcbiAgICAgICAgICAgICAgICB0aGlzLl9lYXQoVG9rZW5UeXBlLm51bWJlckNvbnN0KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IExpdGVyYWxBU1QodG9rZW4sIHRva2VuLnZhbHVlLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgY2FzZSBUb2tlblR5cGUuc3RyaW5nQ29uc3Q6XG4gICAgICAgICAgICAgICAgdGhpcy5fZWF0KFRva2VuVHlwZS5zdHJpbmdDb25zdCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBMaXRlcmFsQVNUKHRva2VuLCB0b2tlbi52YWx1ZS50b1N0cmluZygpKTtcbiAgICAgICAgICAgIGNhc2UgVG9rZW5UeXBlLmxwYXJlbjpcbiAgICAgICAgICAgICAgICB0aGlzLl9lYXQoVG9rZW5UeXBlLmxwYXJlbik7XG4gICAgICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuX2V4cHJlc3Npb24oKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9lYXQoVG9rZW5UeXBlLnJwYXJlbik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgICAgICBjYXNlIFRva2VuVHlwZS5UUlVFOlxuICAgICAgICAgICAgY2FzZSBUb2tlblR5cGUuRkFMU0U6XG4gICAgICAgICAgICAgICAgdGhpcy5fZWF0KHRoaXMuY3VycmVudFRva2VuIS50eXBlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IExpdGVyYWxBU1QodG9rZW4sIHRva2VuLnZhbHVlLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgY2FzZSBUb2tlblR5cGUuTlVMTDpcbiAgICAgICAgICAgICAgICB0aGlzLl9lYXQoVG9rZW5UeXBlLk5VTEwpO1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTGl0ZXJhbEFTVCh0b2tlbiwgXCJudWxsXCIpO1xuICAgICAgICAgICAgY2FzZSBUb2tlblR5cGUubGJyYWNrZXQ6XG4gICAgICAgICAgICAgICAgLy8gbGl0ZXJhbCBhcnJheSBleHByZXNzaW9uXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FycmF5RXhwcmVzc2lvbigpO1xuICAgICAgICAgICAgY2FzZSBUb2tlblR5cGUubGJyYWNlOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9vYmplY3RFeHByZXNzaW9uKCk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl92YXJpYWJsZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX3Rlcm0oKTogQVNUIHtcbiAgICAgICAgbGV0IG5vZGUgPSB0aGlzLl9mYWN0b3IoKTtcbiAgICAgICAgbm9kZSA9IHRoaXMuX3RyeVBhcnNpbmdNZW1iZXJFeHByZXNzaW9uKG5vZGUpO1xuICAgICAgICBub2RlID0gdGhpcy5fdHJ5UGFyc2luZ0Z1bmN0aW9uQ2FsbChub2RlKTtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuXG4gICAgX2V4cHJlc3Npb24oKTogQVNUIHtcbiAgICAgICAgbGV0IG5vZGUgPSB0aGlzLl90ZXJtKCk7XG4gICAgICAgIG5vZGUgPSB0aGlzLl90cnlCaW5hcnlFeHByZXNzaW9uKDAsIG5vZGUpO1xuICAgICAgICB3aGlsZSAoW1Rva2VuVHlwZS5hbmQsIFRva2VuVHlwZS5vcl0uaW5jbHVkZXModGhpcy5jdXJyZW50VG9rZW4hLnR5cGUpKSB7XG4gICAgICAgICAgICBjb25zdCB0b2tlbiA9IHRoaXMuY3VycmVudFRva2VuITtcbiAgICAgICAgICAgIHRoaXMuX2VhdCh0b2tlbi50eXBlKTtcbiAgICAgICAgICAgIG5vZGUgPSBuZXcgTG9naWNhbEV4cHJlc3Npb25BU1Qobm9kZSwgdG9rZW4sIHRoaXMuX2V4cHJlc3Npb24oKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2V4cGVjdChUb2tlblR5cGUuZXF1YWwpKSB7XG4gICAgICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIElkZW50aWZpZXJBU1QgfHwgbm9kZSBpbnN0YW5jZW9mIEluZGV4QWNjZXNzb3JBU1QpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0b2tlbiA9IHRoaXMuY3VycmVudFRva2VuITtcbiAgICAgICAgICAgICAgICB0aGlzLl9lYXQoVG9rZW5UeXBlLmVxdWFsKTtcbiAgICAgICAgICAgICAgICBub2RlID0gbmV3IEFzc2lnbm1lbnRFeHByZXNzaW9uQVNUKG5vZGUsIHRoaXMuX2V4cHJlc3Npb24oKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuZXhwZWN0ZWQgdG9rZW5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIF9vYmplY3RQcm9wZXJ0eSgpOiBPYmplY3RQcm9wZXJ0eSB7XG4gICAgICAgIGxldCBrZXk6IEFTVDtcbiAgICAgICAgc3dpdGNoICh0aGlzLmN1cnJlbnRUb2tlbj8udHlwZSkge1xuICAgICAgICAgICAgY2FzZSBUb2tlblR5cGUuc3RyaW5nQ29uc3Q6XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBrZXkgPSBuZXcgTGl0ZXJhbEFTVCh0aGlzLmN1cnJlbnRUb2tlbiwgdGhpcy5jdXJyZW50VG9rZW4udmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9lYXQoVG9rZW5UeXBlLnN0cmluZ0NvbnN0KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBUb2tlblR5cGUubGJyYWNrZXQ6XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9lYXQoVG9rZW5UeXBlLmxicmFja2V0KTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGV4cHIgPSB0aGlzLl9leHByZXNzaW9uKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2VhdChUb2tlblR5cGUucmJyYWNrZXQpO1xuICAgICAgICAgICAgICAgICAgICBrZXkgPSBleHByO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFRva2VuVHlwZS5pZDpcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlkID0gdGhpcy5fdmFyaWFibGUoKTtcbiAgICAgICAgICAgICAgICAgICAga2V5ID0gbmV3IExpdGVyYWxBU1QobmV3IFRva2VuKFRva2VuVHlwZS5pZCwgaWQudmFsdWUsIGlkLmxpbmUsIGlkLmNvbCksIGlkLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBgVW5leHBlY3RlZCB0b2tlbiAke3RoaXMuY3VycmVudFRva2VufWA7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZWF0KFRva2VuVHlwZS5jb2xvbik7XG4gICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuX2V4cHJlc3Npb24oKTtcbiAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RQcm9wZXJ0eShrZXkhLCB2YWx1ZSk7XG4gICAgfVxuICAgIF9wcm9wZXJ0eSgpOiBBU1Qge1xuICAgICAgICByZXR1cm4gdGhpcy5fb2JqZWN0UHJvcGVydHkoKTtcbiAgICB9XG5cbiAgICBfb2JqZWN0UHJvcGVydGllcygpOiBBU1RbXSB7XG4gICAgICAgIGNvbnN0IHByb3BlcnRpZXM6IEFTVFtdID0gW107XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRUb2tlbj8udHlwZSAhPSBUb2tlblR5cGUucmJyYWNlKSB7XG4gICAgICAgICAgICBwcm9wZXJ0aWVzLnB1c2godGhpcy5fcHJvcGVydHkoKSk7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKHRoaXMuY3VycmVudFRva2VuPy50eXBlID09IFRva2VuVHlwZS5jb21tYSkge1xuICAgICAgICAgICAgdGhpcy5fZWF0KFRva2VuVHlwZS5jb21tYSk7XG4gICAgICAgICAgICBwcm9wZXJ0aWVzLnB1c2godGhpcy5fcHJvcGVydHkoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByb3BlcnRpZXM7XG4gICAgfVxuXG4gICAgX29iamVjdEV4cHJlc3Npb24oYnJhY2VUb2tlbj86IFRva2VuKTogQVNUIHtcbiAgICAgICAgdmFyIHRva2VuID0gYnJhY2VUb2tlbiA/PyB0aGlzLmN1cnJlbnRUb2tlbjtcbiAgICAgICAgaWYgKCFicmFjZVRva2VuKSB0aGlzLl9lYXQoVG9rZW5UeXBlLmxicmFjZSk7XG4gICAgICAgIHZhciBwcm9wZXJ0aWVzID0gdGhpcy5fb2JqZWN0UHJvcGVydGllcygpO1xuICAgICAgICB0aGlzLl9lYXQoVG9rZW5UeXBlLnJicmFjZSk7XG4gICAgICAgIHJldHVybiBuZXcgT2JqZWN0RXhwcmVzc2lvbihwcm9wZXJ0aWVzLCB0b2tlbiwgdGhpcy5jdXJyZW50VG9rZW4pO1xuICAgIH1cblxuICAgIF9hcnJheUV4cHJlc3Npb24oKTogQVNUIHtcbiAgICAgICAgdGhpcy5fZWF0KFRva2VuVHlwZS5sYnJhY2tldCk7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzOiBBU1RbXSA9IHRoaXMuX2V4cGVjdChUb2tlblR5cGUucmJyYWNrZXQpID8gW10gOiB0aGlzLl9leHByZXNzaW9uc0xpc3QoKTtcbiAgICAgICAgdGhpcy5fZWF0KFRva2VuVHlwZS5yYnJhY2tldCk7XG4gICAgICAgIHZhciBzdGFydE5vZGUgPSBlbGVtZW50cy5sZW5ndGggIT09IDAgPyBlbGVtZW50c1swXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgdmFyIGxhc3ROb2RlID0gZWxlbWVudHMubGVuZ3RoICE9PSAwID8gZWxlbWVudHNbZWxlbWVudHMubGVuZ3RoIC0gMV0gOiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiBuZXcgQXJyYXlFeHByZXNzaW9uKGVsZW1lbnRzLCBzdGFydE5vZGUsIGxhc3ROb2RlKTtcbiAgICB9XG4gICAgX3RyeVBhcnNpbmdNZW1iZXJFeHByZXNzaW9uKG46IEFTVCk6IEFTVCB7XG4gICAgICAgIGxldCBub2RlID0gbjtcbiAgICAgICAgd2hpbGUgKHRoaXMuY3VycmVudFRva2VuIS50eXBlID09PSBUb2tlblR5cGUubGJyYWNrZXQpIHtcbiAgICAgICAgICAgIHRoaXMuX2VhdChUb2tlblR5cGUubGJyYWNrZXQpO1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5fZXhwcmVzc2lvbigpO1xuICAgICAgICAgICAgbm9kZSA9IG5ldyBJbmRleEFjY2Vzc29yQVNUKG5vZGUsIGtleSk7XG4gICAgICAgICAgICB0aGlzLl9lYXQoVG9rZW5UeXBlLnJicmFja2V0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG5cbiAgICBfdHJ5QmluYXJ5RXhwcmVzc2lvbihwcmVjOiBudW1iZXIsIGxlZnQ6IEFTVCk6IEFTVCB7XG4gICAgICAgIGxldCBub2RlID0gbGVmdDtcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRQcmVjID0gUGFyc2VyLl9iaW5vcFByZWNkZW5jZXNbdGhpcy5jdXJyZW50VG9rZW4hLnR5cGVdIHx8IC0xO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRQcmVjIDwgcHJlYykgcmV0dXJuIG5vZGU7XG4gICAgICAgICAgICBjb25zdCBvcGVyYXRvciA9IHRoaXMuY3VycmVudFRva2VuITtcbiAgICAgICAgICAgIHRoaXMuX2VhdChvcGVyYXRvci50eXBlKTtcbiAgICAgICAgICAgIGxldCByaWdodCA9IHRoaXMuX3Rlcm0oKTtcbiAgICAgICAgICAgIGNvbnN0IG5leHRQcmVjID0gUGFyc2VyLl9iaW5vcFByZWNkZW5jZXNbdGhpcy5jdXJyZW50VG9rZW4hLnR5cGVdIHx8IC0xO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRQcmVjIDwgbmV4dFByZWMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0bXAgPSB0aGlzLl90cnlCaW5hcnlFeHByZXNzaW9uKGN1cnJlbnRQcmVjICsgMSwgcmlnaHQpO1xuICAgICAgICAgICAgICAgIGlmICh0bXAgPT09IG5vZGUpIHJldHVybiB0bXA7XG4gICAgICAgICAgICAgICAgcmlnaHQgPSB0bXA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBub2RlID0gbmV3IEJpbmFyeUV4cHJlc3Npb25BU1Qobm9kZSwgb3BlcmF0b3IsIHJpZ2h0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9leHByZXNzaW9uc0xpc3QoKTogQVNUW10ge1xuICAgICAgICB0aGlzLl9lYXRFT0woKTtcbiAgICAgICAgLy8gaWYgKGV4cGVjdChMZXhlci5Ub2tlblR5cGUuUlBBUkVOKSkgcmV0dXJuIGVtcHR5TGlzdCgpXG4gICAgICAgIGxldCBleHByID0gdGhpcy5fZXhwcmVzc2lvbigpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBbZXhwcl07XG4gICAgICAgIHdoaWxlICh0aGlzLmN1cnJlbnRUb2tlbj8udHlwZSA9PT0gVG9rZW5UeXBlLmNvbW1hKSB7XG4gICAgICAgICAgICB0aGlzLl9lYXQoVG9rZW5UeXBlLmNvbW1hKTtcbiAgICAgICAgICAgIGV4cHIgPSB0aGlzLl9leHByZXNzaW9uKCk7XG4gICAgICAgICAgICByZXN1bHQucHVzaChleHByKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIF9jYWxsRXhwcmVzc2lvbihub2RlOiBBU1QpOiBDYWxsRXhwcmVzc2lvbkFTVCB7XG4gICAgICAgIHRoaXMuX2VhdChUb2tlblR5cGUubHBhcmVuKTtcbiAgICAgICAgbGV0IGFyZ3M6IEFTVFtdID0gW107XG4gICAgICAgIGlmICghdGhpcy5fZXhwZWN0KFRva2VuVHlwZS5ycGFyZW4pKSB7XG4gICAgICAgICAgICBhcmdzID0gdGhpcy5fZXhwcmVzc2lvbnNMaXN0KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZWF0KFRva2VuVHlwZS5ycGFyZW4pO1xuICAgICAgICBpZiAoIShub2RlIGluc3RhbmNlb2YgSWRlbnRpZmllckFTVCkpIHtcbiAgICAgICAgICAgIGVycm9yKHRoaXMuY3VycmVudFRva2VuISk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBDYWxsRXhwcmVzc2lvbkFTVChub2RlIGFzIElkZW50aWZpZXJBU1QsIGFyZ3MpO1xuICAgIH1cblxuICAgIF90cnlQYXJzaW5nRnVuY3Rpb25DYWxsKG46IEFTVCk6IEFTVCB7XG4gICAgICAgIGxldCBub2RlID0gbjtcbiAgICAgICAgd2hpbGUgKHRoaXMuY3VycmVudFRva2VuIS50eXBlID09PSBUb2tlblR5cGUubHBhcmVuKSB7XG4gICAgICAgICAgICAvLyBwcm9iYWJsZSBmdW5jdGlvbiBjYWxsXG4gICAgICAgICAgICBub2RlID0gdGhpcy5fY2FsbEV4cHJlc3Npb24obm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuXG4gICAgX3N0YXRlbWVudEV4cHJlc3Npb24oKTogQVNUIHtcblxuICAgICAgICBjb25zdCBub2RlID0gdGhpcy5fZXhwcmVzc2lvbigpO1xuXG4gICAgICAgIGlmICghW1Rva2VuVHlwZS5zZW1pLCBUb2tlblR5cGUuZW9sLCBUb2tlblR5cGUuZW9mXVxuICAgICAgICAgICAgLmluY2x1ZGVzKHRoaXMuY3VycmVudFRva2VuIS50eXBlKSkge1xuICAgICAgICAgICAgZXJyb3IodGhpcy5jdXJyZW50VG9rZW4hKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG5cbiAgICBfYmxvY2tTdGF0ZW1lbnQoaWdub3JlRmlyc3RCcmFjZSA9IGZhbHNlKTogQmxvY2tTdGF0ZW1lbnRBU1Qge1xuICAgICAgICBpZiAoIWlnbm9yZUZpcnN0QnJhY2UpIHRoaXMuX2VhdChUb2tlblR5cGUubGJyYWNlKTtcbiAgICAgICAgdGhpcy5fZWF0RU9MKCk7XG4gICAgICAgIGlmICh0aGlzLl9leHBlY3QoVG9rZW5UeXBlLnJicmFjZSkpIHtcbiAgICAgICAgICAgIHRoaXMuX2VhdChUb2tlblR5cGUucmJyYWNlKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQmxvY2tTdGF0ZW1lbnRBU1QoW10sIHRoaXMuY3VycmVudFRva2VuISk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gY29uc3QgYm9keSA9IF9zdGF0ZW1lbnRzKCk7XG4gICAgICAgIGNvbnN0IGJvZHkgPSBbdGhpcy5fc3RhdGVtZW50KCldO1xuICAgICAgICB3aGlsZSAodGhpcy5jdXJyZW50VG9rZW4hLnR5cGUgPT09IFRva2VuVHlwZS5lb2wgfHxcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFRva2VuIS50eXBlID09PSBUb2tlblR5cGUuc2VtaSkge1xuICAgICAgICAgICAgdGhpcy5fZWF0U2VtaU9yRU9MKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50VG9rZW4hLnR5cGUgPT09IFRva2VuVHlwZS5yYnJhY2UgfHwgdGhpcy5jdXJyZW50VG9rZW4hLnR5cGUgPT09IFRva2VuVHlwZS5lb2YpIHtcbiAgICAgICAgICAgICAgICAvLyBfZWF0KHRoaXMuY3VycmVudFRva2VuIS50eXBlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJvZHkucHVzaCh0aGlzLl9zdGF0ZW1lbnQoKSk7XG4gICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50VG9rZW4hLnR5cGUgIT09IFRva2VuVHlwZS5lb2wgJiZcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbiEudHlwZSAhPT0gVG9rZW5UeXBlLnNlbWkgJiZcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbiEudHlwZSAhPT0gVG9rZW5UeXBlLmVvZikge1xuICAgICAgICAgICAgICAgIGVycm9yKHRoaXMuY3VycmVudFRva2VuISk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZWF0KFRva2VuVHlwZS5yYnJhY2UpO1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50VG9rZW4/LnR5cGUgPT09IFRva2VuVHlwZS5yYnJhY2UpIHtcbiAgICAgICAgICAgIC8vIGVuZEJsb2NrXG4gICAgICAgICAgICB0aGlzLl9lYXQoVG9rZW5UeXBlLnJicmFjZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IEJsb2NrU3RhdGVtZW50QVNUKGJvZHksIHRoaXMuY3VycmVudFRva2VuISk7XG4gICAgfVxuXG4gICAgX2lmU3RhdGVtZW50KCk6IElmU3RhdGVtZW50QVNUIHtcbiAgICAgICAgdGhpcy5fZWF0KFRva2VuVHlwZS5JRik7XG4gICAgICAgIGNvbnN0IHdpdGhQYXIgPSB0aGlzLmN1cnJlbnRUb2tlbiEudHlwZSA9PT0gVG9rZW5UeXBlLmxwYXJlbjtcbiAgICAgICAgaWYgKHdpdGhQYXIpIHtcbiAgICAgICAgICAgIHRoaXMuX2VhdChUb2tlblR5cGUubHBhcmVuKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0ZXN0ID0gdGhpcy5fZXhwcmVzc2lvbigpO1xuICAgICAgICBpZiAod2l0aFBhcikge1xuICAgICAgICAgICAgdGhpcy5fZWF0KFRva2VuVHlwZS5ycGFyZW4pO1xuICAgICAgICB9XG4gICAgICAgIGxldCBjb25zZXF1ZW50OiBBU1Q7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRUb2tlbiEudHlwZSA9PT0gVG9rZW5UeXBlLmxicmFjZSkge1xuICAgICAgICAgICAgY29uc2VxdWVudCA9IHRoaXMuX2Jsb2NrU3RhdGVtZW50KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zZXF1ZW50ID0gdGhpcy5fZXhwcmVzc2lvbigpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2VhdFNlbWlPckVPTCgpO1xuICAgICAgICBsZXQgYWx0ZXJuYXRlOiBBU1QgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRUb2tlbiEudHlwZSA9PT0gVG9rZW5UeXBlLkVMU0UpIHtcbiAgICAgICAgICAgIHRoaXMuX2VhdChUb2tlblR5cGUuRUxTRSk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRoaXMuY3VycmVudFRva2VuIS50eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBUb2tlblR5cGUuSUY6XG4gICAgICAgICAgICAgICAgICAgIGFsdGVybmF0ZSA9IHRoaXMuX2lmU3RhdGVtZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgVG9rZW5UeXBlLmxicmFjZTpcbiAgICAgICAgICAgICAgICAgICAgYWx0ZXJuYXRlID0gdGhpcy5fYmxvY2tTdGF0ZW1lbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgYWx0ZXJuYXRlID0gdGhpcy5fZXhwcmVzc2lvbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgSWZTdGF0ZW1lbnRBU1QodGVzdCwgY29uc2VxdWVudCwgYWx0ZXJuYXRlKTtcbiAgICB9XG5cbiAgICBfc3RhdGVtZW50KCk6IEFTVCB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5jdXJyZW50VG9rZW4hLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgVG9rZW5UeXBlLnNlbWk6XG4gICAgICAgICAgICAgICAgdGhpcy5fZWF0U2VtaSgpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9zdGF0ZW1lbnQoKTtcbiAgICAgICAgICAgIGNhc2UgVG9rZW5UeXBlLmVvbDpcbiAgICAgICAgICAgICAgICB0aGlzLl9lYXRFT0woKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fc3RhdGVtZW50KCk7XG4gICAgICAgICAgICBjYXNlIFRva2VuVHlwZS5JRjpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faWZTdGF0ZW1lbnQoKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXRlbWVudEV4cHJlc3Npb24oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9leHBlY3QodHlwZTogVG9rZW5UeXBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRUb2tlbj8udHlwZSA9PT0gdHlwZTtcbiAgICB9XG4gICAgX3N0YXRlbWVudHMoKTogQVNUW10ge1xuICAgICAgICB0aGlzLl9lYXRFT0woKTtcblxuICAgICAgICBpZiAodGhpcy5fZXhwZWN0KFRva2VuVHlwZS5lb2YpKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IFt0aGlzLl9zdGF0ZW1lbnQoKV07XG4gICAgICAgIHdoaWxlICgodGhpcy5jdXJyZW50VG9rZW4hLnR5cGUgPT09IFRva2VuVHlwZS5lb2wgfHxcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFRva2VuIS50eXBlID09PSBUb2tlblR5cGUuc2VtaSkpIHtcbiAgICAgICAgICAgIHRoaXMuX2VhdFNlbWlPckVPTCgpO1xuICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudFRva2VuIS50eXBlID09PSBUb2tlblR5cGUuZW9mKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZWF0KFRva2VuVHlwZS5lb2YpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHRoaXMuX3N0YXRlbWVudCgpKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRUb2tlbiEudHlwZSAhPT0gVG9rZW5UeXBlLmVvbCAmJlxuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFRva2VuIS50eXBlICE9PSBUb2tlblR5cGUuc2VtaSAmJlxuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFRva2VuIS50eXBlICE9PSBUb2tlblR5cGUuZW9mKSB7XG4gICAgICAgICAgICAgICAgZXJyb3IodGhpcy5jdXJyZW50VG9rZW4hKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9XG5cbiAgICBfcm9vdCgpOiBSb290QVNUIHtcbiAgICAgICAgY29uc3Qgc291cmNlID0gdGhpcy5sZXhlci5zb3VyY2U7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBcIjxtb2R1bGU+XCI7XG4gICAgICAgIGNvbnN0IGxpc3QgPSB0aGlzLl9zdGF0ZW1lbnRzKCk7XG4gICAgICAgIHJldHVybiBuZXcgUm9vdEFTVChsaXN0LCBuYW1lLCBzb3VyY2UpO1xuICAgIH1cblxuICAgIHBhcnNlKCk6IEFTVCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yb290KCk7XG4gICAgfVxufVxudHlwZSBGdW5jID0gKG5vZGU6IGFueSkgPT4gYW55O1xuLy8gQVNUIFdhbGxrZXJcbmFic3RyYWN0IGNsYXNzIEFOb2RlVmlzaXRvciB7XG4gICAgcHJvdGVjdGVkIF9ub2Rlc1Zpc2l0b3JzOiB7IFtrOiBzdHJpbmddOiBGdW5jIH0gPSB7fTtcbiAgICBwcm90ZWN0ZWQgcmVnaXN0ZXJWaXNpdG9yKHR5cGU6IFR5cGU8QVNUPiwgdmlzaXRvcjogRnVuYykge1xuICAgICAgICBjb25zdCBtZXRob2ROYW1lID0gYHZpc2l0JHt0eXBlLm5hbWV9YDtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ1JlZzo6Ojo6OicsIG1ldGhvZE5hbWUsIHR5cGUpO1xuICAgICAgICB0aGlzLl9ub2Rlc1Zpc2l0b3JzW21ldGhvZE5hbWVdID0gdmlzaXRvcjtcbiAgICB9XG5cbiAgICBhYnN0cmFjdCB2aXNpdChub2RlOiBBU1QpOiBhbnk7XG59XG5cbmFic3RyYWN0IGNsYXNzIEFzeW5jTm9kZVZpc2l0b3IgZXh0ZW5kcyBBTm9kZVZpc2l0b3Ige1xuICAgIG92ZXJyaWRlIGFzeW5jIHZpc2l0KG5vZGU6IEFTVCk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIGNvbnN0IG1ldGhvZE5hbWUgPSBgdmlzaXQke25vZGUuY29uc3RydWN0b3IubmFtZX1gO1xuICAgICAgICAvLyBjb25zdCBmbiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKVttZXRob2ROYW1lXTtcbiAgICAgICAgY29uc3QgZm4gPSB0aGlzLl9ub2Rlc1Zpc2l0b3JzW21ldGhvZE5hbWVdO1xuICAgICAgICByZXR1cm4gYXdhaXQgZm4/LmNhbGwodGhpcywgbm9kZSk7XG4gICAgfVxufVxuXG5hYnN0cmFjdCBjbGFzcyBOb2RlVmlzaXRvciBleHRlbmRzIEFOb2RlVmlzaXRvciB7XG4gICAgb3ZlcnJpZGUgdmlzaXQobm9kZTogQVNUKTogYW55IHtcbiAgICAgICAgY29uc3QgbWV0aG9kTmFtZSA9IGB2aXNpdCR7bm9kZS5jb25zdHJ1Y3Rvci5uYW1lfWA7XG4gICAgICAgIC8vIGNvbnN0IGZuID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpW21ldGhvZE5hbWVdO1xuICAgICAgICBjb25zdCBmbiA9IHRoaXMuX25vZGVzVmlzaXRvcnNbbWV0aG9kTmFtZV07XG4gICAgICAgIHJldHVybiBmbj8uY2FsbCh0aGlzLCBub2RlKTtcbiAgICB9XG59XG5cbnR5cGUgTUV2ZW50b0ZCaW5kaW5nID0gKGFyZ3M6IGFueVtdLCB2bTogTUV2ZW50bykgPT4gYW55O1xuZXhwb3J0IGNsYXNzIE1FdmVudG8gZXh0ZW5kcyBOb2RlVmlzaXRvciB7XG4gICAgX21lbW9yeTogeyBbazogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgICBwcml2YXRlIHN0YXRpYyBfZ2xvYmFsRnVuY3Rpb25zUmVnaXN0cnk6IHsgW2s6IHN0cmluZ106IE1FdmVudG9GQmluZGluZyB9ID0ge307XG4gICAgcHJpdmF0ZSBzdGF0aWMgX2NhY2hlOiBNYXA8bnVtYmVyLCBBU1Q+ID0gbmV3IE1hcCgpO1xuICAgIF9mdW5jdGlvbnNSZWdpc3RyeTogeyBbazogc3RyaW5nXTogTUV2ZW50b0ZCaW5kaW5nIH0gPSB7fTtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlclZpc2l0b3IoUm9vdEFTVCwgdGhpcy52aXNpdFJvb3RBU1QpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyVmlzaXRvcihCbG9ja1N0YXRlbWVudEFTVCwgdGhpcy52aXNpdEJsb2NrU3RhdGVtZW50QVNUKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlclZpc2l0b3IoSWRlbnRpZmllckFTVCwgdGhpcy52aXNpdElkZW50aWZpZXJBU1QpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyVmlzaXRvcihMaXRlcmFsQVNULCB0aGlzLnZpc2l0TGl0ZXJhbEFTVCk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJWaXNpdG9yKEFzc2lnbm1lbnRFeHByZXNzaW9uQVNULCB0aGlzLnZpc2l0QXNzaWdubWVudEV4cHJlc3Npb25BU1QpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyVmlzaXRvcihFeHByZXNzaW9uU3RhdGVtZW50QVNULCB0aGlzLnZpc2l0RXhwcmVzc2lvblN0YXRlbWVudEFTVCk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJWaXNpdG9yKENhbGxFeHByZXNzaW9uQVNULCB0aGlzLnZpc2l0Q2FsbEV4cHJlc3Npb25BU1QpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyVmlzaXRvcihCaW5hcnlFeHByZXNzaW9uQVNULCB0aGlzLnZpc2l0QmluYXJ5RXhwcmVzc2lvbkFTVCk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJWaXNpdG9yKFVuYXJ5RXhwcmVzc2lvbkFTVCwgdGhpcy52aXNpdFVuYXJ5RXhwcmVzc2lvbkFTVCk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJWaXNpdG9yKElmU3RhdGVtZW50QVNULCB0aGlzLnZpc2l0SWZTdGF0ZW1lbnRBU1QpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyVmlzaXRvcihMb2dpY2FsRXhwcmVzc2lvbkFTVCwgdGhpcy52aXNpdExvZ2ljYWxFeHByZXNzaW9uQVNUKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlclZpc2l0b3IoSW5kZXhBY2Nlc3NvckFTVCwgdGhpcy52aXNpdEluZGV4QWNjZXNzb3JBU1QpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyVmlzaXRvcihPYmplY3RQcm9wZXJ0eSwgdGhpcy52aXNpdE9iamVjdFByb3BlcnR5KTtcbiAgICAgICAgdGhpcy5yZWdpc3RlclZpc2l0b3IoT2JqZWN0RXhwcmVzc2lvbiwgdGhpcy52aXNpdE9iamVjdEV4cHJlc3Npb24pO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyVmlzaXRvcihBcnJheUV4cHJlc3Npb24sIHRoaXMudmlzaXRBcnJheUV4cHJlc3Npb24pO1xuXG4gICAgICAgIHRoaXMuX2Z1bmN0aW9uc1JlZ2lzdHJ5ID0geyAuLi5NRXZlbnRvLl9nbG9iYWxGdW5jdGlvbnNSZWdpc3RyeSB9O1xuICAgIH1cblxuICAgIHByb3RlY3RlZCB2aXNpdFJvb3RBU1Qobm9kZTogUm9vdEFTVCk6IGFueSB7XG4gICAgICAgIGNvbnN0IGxpc3QgPSBub2RlLmJvZHk7XG4gICAgICAgIGxldCBsYXN0O1xuICAgICAgICBmb3IgKGNvbnN0IG4gb2YgbGlzdCkge1xuICAgICAgICAgICAgbGFzdCA9IHRoaXMudmlzaXQobik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxhc3Q7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHZpc2l0QmxvY2tTdGF0ZW1lbnRBU1Qobm9kZTogQmxvY2tTdGF0ZW1lbnRBU1QpOiBhbnkge1xuICAgICAgICBjb25zdCBsaXN0ID0gbm9kZS5ib2R5O1xuICAgICAgICBsZXQgbGFzdDtcbiAgICAgICAgZm9yIChjb25zdCBuIG9mIGxpc3QpIHtcbiAgICAgICAgICAgIGxhc3QgPSB0aGlzLnZpc2l0KG4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsYXN0O1xuICAgIH1cblxuICAgIHByb3RlY3RlZCB2aXNpdElkZW50aWZpZXJBU1Qobm9kZTogSWRlbnRpZmllckFTVCk6IGFueSB7XG4gICAgICAgIGNvbnN0IGlkID0gbm9kZS52YWx1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21lbW9yeVtpZF07XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHZpc2l0TGl0ZXJhbEFTVChub2RlOiBBU1QpOiBhbnkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IChub2RlIGFzIExpdGVyYWxBU1QpLnZhbHVlO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHZpc2l0QXNzaWdubWVudEV4cHJlc3Npb25BU1Qobm9kZTogQXNzaWdubWVudEV4cHJlc3Npb25BU1QpOiBhbnkge1xuXG4gICAgICAgIGNvbnN0IGlkOiBBU1QgPSBub2RlLmlkZW50aWZpZXI7XG5cbiAgICAgICAgY29uc3QgaW5pdDogQVNUID0gbm9kZS5pbml0O1xuICAgICAgICBsZXQgdmFsdWU6IGFueSA9IG51bGw7XG4gICAgICAgIGlmIChpZCBpbnN0YW5jZW9mIEluZGV4QWNjZXNzb3JBU1QpIHtcbiAgICAgICAgICAgIHZhciB0YXJnZXQgPSB0aGlzLnZpc2l0KGlkLm93bmVyKTtcbiAgICAgICAgICAgIHZhbHVlID0gdGhpcy52aXNpdChub2RlLmluaXQpO1xuICAgICAgICAgICAgdmFyIHByb3BlcnR5ID0gdGhpcy52aXNpdChpZC5rZXkpO1xuICAgICAgICAgICAgdGhpcy5hc3NpZ25Qcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5LCB2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaWQgaW5zdGFuY2VvZiBJZGVudGlmaWVyQVNUKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHRoaXMudmlzaXQoaW5pdCk7XG4gICAgICAgICAgICB0aGlzLl9tZW1vcnlbaWQudmFsdWVdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBhc3NpZ25Qcm9wZXJ0eShvd25lcjogYW55LCBwcm9wZXJ0eTogYW55LCB2YWx1ZTogYW55KTogYW55IHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkob3duZXIpKSB7XG4gICAgICAgICAgICBvd25lcltwcm9wZXJ0eV0gPSB2YWx1ZTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygb3duZXIgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBvd25lcltwcm9wZXJ0eV0gPSB2YWx1ZTtcbiAgICAgICAgfSBlbHNlIHsgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCB2aXNpdEV4cHJlc3Npb25TdGF0ZW1lbnRBU1Qobm9kZTogRXhwcmVzc2lvblN0YXRlbWVudEFTVCk6IGFueSB7XG4gICAgICAgIGNvbnN0IGV4cHIgPSBub2RlLmV4cHJlc3Npb247XG4gICAgICAgIHJldHVybiB0aGlzLnZpc2l0KGV4cHIpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCB2aXNpdENhbGxFeHByZXNzaW9uQVNUKG5vZGU6IENhbGxFeHByZXNzaW9uQVNUKSB7XG4gICAgICAgIGNvbnN0IGNhbGxlZSA9IG5vZGUuY2FsbGVlO1xuICAgICAgICBjb25zdCBhcmdzID0gbm9kZS5hcmd1bWVudHM7XG4gICAgICAgIGNvbnN0IGNhbGxlZU5hbWUgPSBjYWxsZWUudmFsdWU7XG4gICAgICAgIGNvbnN0IGZuID0gdGhpcy5fZnVuY3Rpb25zUmVnaXN0cnlbY2FsbGVlTmFtZV07XG4gICAgICAgIGNvbnN0IGFyZ1ZhbHVlcyA9IGFyZ3MubWFwKChlKSA9PiB0aGlzLnZpc2l0KGUpKTtcbiAgICAgICAgLy8gcHJpbnQoXCJhcmdWYWx1ZXM6OlwiLCBhcmdWYWx1ZXMpXG4gICAgICAgIHJldHVybiBmbj8uKGFyZ1ZhbHVlcywgdGhpcyk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHZpc2l0QmluYXJ5RXhwcmVzc2lvbkFTVChub2RlOiBCaW5hcnlFeHByZXNzaW9uQVNUKTogYW55IHtcbiAgICAgICAgY29uc3QgbGVmdCA9IG5vZGUubGVmdDtcbiAgICAgICAgY29uc3QgcmlnaHQgPSBub2RlLnJpZ2h0O1xuICAgICAgICBjb25zdCBvcCA9IG5vZGUub3BlcmF0aW9uO1xuICAgICAgICBjb25zdCBsVmFsdWUgPSB0aGlzLnZpc2l0KGxlZnQpO1xuICAgICAgICBjb25zdCByVmFsdWUgPSB0aGlzLnZpc2l0KHJpZ2h0KTtcbiAgICAgICAgc3dpdGNoIChvcC50eXBlKSB7XG4gICAgICAgICAgICBjYXNlIFRva2VuVHlwZS5wbHVzOlxuICAgICAgICAgICAgICAgIGlmIChpc051bShsVmFsdWUpICYmIGlzTnVtKHJWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxWYWx1ZSArIHJWYWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGAke2xWYWx1ZX0ke3JWYWx1ZX1gO1xuICAgICAgICAgICAgY2FzZSBUb2tlblR5cGUubWludXM6XG4gICAgICAgICAgICAgICAgaWYgKGlzTnVtKGxWYWx1ZSkgJiYgaXNOdW0oclZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbFZhbHVlIC0gclZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaXNTdHJpbmcobFZhbHVlKSAmJiBpc051bShyVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBsVmFsdWUgKiByVmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChpc051bShsVmFsdWUpICYmIGlzU3RyaW5nKHJWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJWYWx1ZSAqIGxWYWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBPcGVyYXRpb24gJHtvcC52YWx1ZX0gbm90IGFsbG93ZWQgbm8gbnVtIHZhbHVlYCk7XG4gICAgICAgICAgICBjYXNlIFRva2VuVHlwZS5tdWx0OlxuICAgICAgICAgICAgICAgIGlmIChpc051bShsVmFsdWUpICYmIGlzTnVtKHJWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxWYWx1ZSAqIHJWYWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBPcGVyYXRpb24gJHtvcC52YWx1ZX0gbm90IGFsbG93ZWQgbm8gbnVtIHZhbHVlYCk7XG4gICAgICAgICAgICBjYXNlIFRva2VuVHlwZS5kaXY6XG4gICAgICAgICAgICAgICAgaWYgKGlzTnVtKGxWYWx1ZSkgJiYgaXNOdW0oclZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoclZhbHVlID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGRpdmlzaW9uIGJ5IDBcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxWYWx1ZSAvIHJWYWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBPcGVyYXRpb24gJHtvcC52YWx1ZX0gbm90IGFsbG93ZWQgbm8gbnVtIHZhbHVlYCk7XG4gICAgICAgICAgICBjYXNlIFRva2VuVHlwZS5tb2Q6XG4gICAgICAgICAgICAgICAgaWYgKGlzTnVtKGxWYWx1ZSkgJiYgaXNOdW0oclZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbFZhbHVlICUgclZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE9wZXJhdGlvbiAke29wLnZhbHVlfSBub3QgYWxsb3dlZCBubyBudW0gdmFsdWVgKTtcbiAgICAgICAgICAgIGNhc2UgVG9rZW5UeXBlLmdyZWF0OlxuICAgICAgICAgICAgICAgIGlmIChpc051bShsVmFsdWUpICYmIGlzTnVtKHJWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxWYWx1ZSA+IHJWYWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBPcGVyYXRpb24gJHtvcC52YWx1ZX0gbm90IGFsbG93ZWQgbm8gbnVtIHZhbHVlYCk7XG4gICAgICAgICAgICBjYXNlIFRva2VuVHlwZS5ncmVhdEVxOlxuICAgICAgICAgICAgICAgIGlmIChpc051bShsVmFsdWUpICYmIGlzTnVtKHJWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxWYWx1ZSA+PSByVmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgT3BlcmF0aW9uICR7b3AudmFsdWV9IG5vdCBhbGxvd2VkIG5vIG51bSB2YWx1ZWApO1xuICAgICAgICAgICAgY2FzZSBUb2tlblR5cGUubGVzczpcbiAgICAgICAgICAgICAgICBpZiAoaXNOdW0obFZhbHVlKSAmJiBpc051bShyVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBsVmFsdWUgPCByVmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgT3BlcmF0aW9uICR7b3AudmFsdWV9IG5vdCBhbGxvd2VkIG5vIG51bSB2YWx1ZWApO1xuICAgICAgICAgICAgY2FzZSBUb2tlblR5cGUubGVzc0VxOlxuICAgICAgICAgICAgICAgIGlmIChpc051bShsVmFsdWUpICYmIGlzTnVtKHJWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxWYWx1ZSA8PSByVmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgT3BlcmF0aW9uICR7b3AudmFsdWV9IG5vdCBhbGxvd2VkIG5vIG51bSB2YWx1ZWApO1xuICAgICAgICAgICAgY2FzZSBUb2tlblR5cGUuZXFlcTpcbiAgICAgICAgICAgICAgICByZXR1cm4gbFZhbHVlID09PSByVmFsdWU7XG4gICAgICAgICAgICBjYXNlIFRva2VuVHlwZS5ub3RFcTpcbiAgICAgICAgICAgICAgICByZXR1cm4gbFZhbHVlICE9PSByVmFsdWU7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgT3BlcmF0aW9uICR7b3AudmFsdWV9IG5vdCBhbGxvd2VkIG5vIG51bSB2YWx1ZWApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHZpc2l0VW5hcnlFeHByZXNzaW9uQVNUKG5vZGU6IFVuYXJ5RXhwcmVzc2lvbkFTVCk6IGFueSB7XG4gICAgICAgIGNvbnN0IGFyZyA9IG5vZGUuYXJndW1lbnQ7XG4gICAgICAgIGNvbnN0IG9wID0gbm9kZS5vcGVyYXRpb247XG4gICAgICAgIGNvbnN0IGFyZ1ZhbHVlID0gdGhpcy52aXNpdChhcmcpO1xuICAgICAgICBpZihvcC50eXBlID09PSBUb2tlblR5cGUubm90KSB7XG4gICAgICAgICAgICByZXR1cm4gX2Jvb2xWYWx1ZShhcmdWYWx1ZSkgPT09IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc051bShhcmdWYWx1ZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgT3BlcmF0aW9uICR7b3AudmFsdWV9IG5vdCBhbGxvd2VkIG5vIG51bSB2YWx1ZWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcC50eXBlID09PSBUb2tlblR5cGUucGx1cykge1xuICAgICAgICAgICAgcmV0dXJuIGFyZ1ZhbHVlO1xuICAgICAgICB9IGVsc2UgaWYgKG9wLnR5cGUgPT09IFRva2VuVHlwZS5taW51cykge1xuICAgICAgICAgICAgcmV0dXJuIC1hcmdWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE9wZXJhdGlvbiAke29wLnZhbHVlfSBub3QgYWxsb3dlZCBubyBudW0gdmFsdWVgKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgdmlzaXRJZlN0YXRlbWVudEFTVChub2RlOiBJZlN0YXRlbWVudEFTVCk6IGFueSB7XG4gICAgICAgIGNvbnN0IHRlc3ROb2RlOiBBU1QgPSBub2RlLnRlc3Q7XG4gICAgICAgIGNvbnN0IHRlc3QgPSB0aGlzLnZpc2l0KHRlc3ROb2RlKTtcbiAgICAgICAgY29uc3QgdGVzdEJvb2xWYWx1ZSA9IF9ib29sVmFsdWUodGVzdCk7XG5cbiAgICAgICAgaWYgKHRlc3RCb29sVmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnZpc2l0KG5vZGUuY29uc2VxdWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy52aXNpdChub2RlLmFsdGVybmF0ZSEpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG5cblxuICAgIHByb3RlY3RlZCB2aXNpdExvZ2ljYWxFeHByZXNzaW9uQVNUKG5vZGU6IExvZ2ljYWxFeHByZXNzaW9uQVNUKTogYW55IHtcbiAgICAgICAgY29uc3QgbGVmdE5vZGUgPSBub2RlLmxlZnQ7XG4gICAgICAgIGNvbnN0IHRlc3QgPSB0aGlzLnZpc2l0KGxlZnROb2RlKTtcbiAgICAgICAgY29uc3QgdGVzdEJvb2xWYWx1ZSA9IF9ib29sVmFsdWUodGVzdCk7XG4gICAgICAgIGlmIChub2RlLm9wZXJhdG9yLnR5cGUgPT09IFRva2VuVHlwZS5hbmQpIHtcbiAgICAgICAgICAgIHJldHVybiB0ZXN0Qm9vbFZhbHVlICYmIF9ib29sVmFsdWUodGhpcy52aXNpdChub2RlLnJpZ2h0KSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUub3BlcmF0b3IudHlwZSA9PT0gVG9rZW5UeXBlLm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gdGVzdEJvb2xWYWx1ZSB8fCBfYm9vbFZhbHVlKHRoaXMudmlzaXQobm9kZS5yaWdodCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgdmlzaXRJbmRleEFjY2Vzc29yQVNUKG5vZGU6IEluZGV4QWNjZXNzb3JBU1QpOiBhbnkge1xuICAgICAgICBjb25zdCBvd25lck5vZGUgPSAobm9kZSBhcyBJbmRleEFjY2Vzc29yQVNUKS5vd25lcjtcbiAgICAgICAgY29uc3Qgb3duZXIgPSB0aGlzLnZpc2l0KG93bmVyTm9kZSk7XG4gICAgICAgIGlmICh0eXBlb2Ygb3duZXIgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSB0aGlzLnZpc2l0KG5vZGUua2V5KTtcbiAgICAgICAgICAgIHJldHVybiBvd25lcltrZXldO1xuICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkob3duZXIpKSB7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSB0aGlzLnZpc2l0KG5vZGUua2V5KTtcbiAgICAgICAgICAgIHJldHVybiBpc051bShrZXkpICYmIG93bmVyLmxlbmd0aCA8IGtleSAmJiBrZXkgPj0gMCA/IG93bmVyW2tleV0gOiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCB2aXNpdE9iamVjdFByb3BlcnR5KG5vZGU6IEFTVCk6IGFueSB7IH1cblxuICAgIHByb3RlY3RlZCB2aXNpdE9iamVjdEV4cHJlc3Npb24oYXN0OiBBU1QpOiBhbnkge1xuICAgICAgICBjb25zdCBpbnN0YW5jZTogYW55ID0ge307XG4gICAgICAgIGNvbnN0IG5vZGUgPSBhc3QgYXMgT2JqZWN0RXhwcmVzc2lvbjtcbiAgICAgICAgZm9yIChjb25zdCBpdCBvZiBub2RlLnByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIGlmIChpdCBpbnN0YW5jZW9mIE9iamVjdFByb3BlcnR5KSB7XG4gICAgICAgICAgICAgICAgbGV0IGtleSA9IHRoaXMudmlzaXQoaXQua2V5KTtcbiAgICAgICAgICAgICAgICBrZXkgPSBpc1N0cmluZyhrZXkpID8ga2V5IDoga2V5LnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgaW5zdGFuY2Vba2V5XSA9IHRoaXMudmlzaXQoaXQudmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgdmlzaXRBcnJheUV4cHJlc3Npb24oYXN0OiBBU1QpOiBhbnkge1xuICAgICAgICBjb25zdCBub2RlID0gYXN0IGFzIEFycmF5RXhwcmVzc2lvbjtcbiAgICAgICAgY29uc3QgYXJncyA9IHRoaXMucmVzb2x2ZUFyZ3VtZW50cyhub2RlLmVsZW1lbnRzKTtcbiAgICAgICAgcmV0dXJuIGFyZ3M7XG4gICAgfVxuXG4gICAgcmVzb2x2ZUFyZ3VtZW50cyhhcmdzOiBBU1RbXSk6IGFueSB7XG4gICAgICAgIHJldHVybiBhcmdzLm1hcCgoaXQ6IEFTVCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmlzaXQoaXQpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZWdpc3RlckZ1bmN0aW9uKGlkOiBzdHJpbmcsIGZuOiBNRXZlbnRvRkJpbmRpbmcpIHtcbiAgICAgICAgdGhpcy5fZnVuY3Rpb25zUmVnaXN0cnlbaWRdID0gZm47XG4gICAgfVxuXG4gICAgdW5yZWdpc3RlckZ1bmN0aW9uKGlkOiBzdHJpbmcpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuX2Z1bmN0aW9uc1JlZ2lzdHJ5W2lkXTtcbiAgICB9XG5cbiAgICBleGVjdXRlKHNvdXJjZTogc3RyaW5nLCBjYWNoZSA9IHRydWUpIHtcbiAgICAgICAgY29uc3QgbW9kdWxlID0gTUV2ZW50by5jb21waWxlKHNvdXJjZSwgY2FjaGUpO1xuICAgICAgICByZXR1cm4gdGhpcy52aXNpdChtb2R1bGUpO1xuICAgIH1cblxuICAgIHN0YXRpYyBjb21waWxlKHNvdXJjZTogc3RyaW5nLCBjYWNoZSA9IGZhbHNlKTogQVNUIHtcbiAgICAgICAgY29uc3QgaGFzaCA9IGhhc2hDb2RlKHNvdXJjZSk7XG4gICAgICAgIGlmIChjYWNoZSAmJiB0aGlzLl9jYWNoZS5oYXMoaGFzaCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jYWNoZS5nZXQoaGFzaCkhO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxleGVyID0gbmV3IExleGVyKHNvdXJjZSk7XG4gICAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBQYXJzZXIobGV4ZXIpO1xuICAgICAgICBjb25zdCBtb2R1bGUgPSBwYXJzZXIucGFyc2UoKTtcbiAgICAgICAgaWYgKGNhY2hlKSB0aGlzLl9jYWNoZS5zZXQoaGFzaCwgbW9kdWxlKTtcbiAgICAgICAgcmV0dXJuIG1vZHVsZTtcbiAgICB9XG5cbiAgICBzdGF0aWMgcmVnaXN0ZXIoaWQ6IHN0cmluZywgZm46IE1FdmVudG9GQmluZGluZykge1xuICAgICAgICBNRXZlbnRvLl9nbG9iYWxGdW5jdGlvbnNSZWdpc3RyeVtpZF0gPSBmbjtcbiAgICB9XG5cbiAgICBzdGF0aWMgdW5yZWdpc3RlcihpZDogc3RyaW5nKSB7XG4gICAgICAgIGRlbGV0ZSBNRXZlbnRvLl9nbG9iYWxGdW5jdGlvbnNSZWdpc3RyeVtpZF07XG4gICAgfVxuXG4gICAgc3RhdGljIHJ1bihzb3VyY2U6IHN0cmluZywgY2FjaGUgPSBmYWxzZSkge1xuICAgICAgICBjb25zdCBtZXZlbnRvID0gbmV3IE1FdmVudG8oKTtcbiAgICAgICAgY29uc3QgbW9kdWxlID0gTUV2ZW50by5jb21waWxlKHNvdXJjZSwgY2FjaGUpO1xuICAgICAgICByZXR1cm4gbWV2ZW50by52aXNpdChtb2R1bGUpO1xuICAgIH1cblxuICAgIHN0YXRpYyBuZXdJbnN0YW5jZSgpOiBNRXZlbnRvIHtcbiAgICAgICAgLy8gY29uc3QgbGV4ZXIgPSBMZXhlcihzb3VyY2UpO1xuICAgICAgICAvLyBjb25zdCBwYXJzZXIgPSBQYXJzZXIobGV4ZXIpO1xuICAgICAgICAvLyBjb25zdCBtb2R1bGUgPSBwYXJzZXIucGFyc2UoKTtcbiAgICAgICAgcmV0dXJuIG5ldyBNRXZlbnRvKCk7XG4gICAgfVxuICAgXG4gICAgY2xvbmUoKTogTUV2ZW50byB7XG4gICAgICAgIHZhciByZXQgPSBuZXcgTUV2ZW50bygpO1xuICAgICAgICByZXQuX2Z1bmN0aW9uc1JlZ2lzdHJ5ID0geyAuLi4gdGhpcy5fZnVuY3Rpb25zUmVnaXN0cnkgfTtcbiAgICAgICAgcmV0Ll9tZW1vcnkgPSB7IC4uLnRoaXMuX21lbW9yeSB9O1xuICAgICAgICByZXR1cm4gcmV0O1xuICAgIH1cbiAgICBuZXdBc3luY0luc3RhbmNlKCk6IE1FdmVudG9Bc3luYyB7XG4gICAgICAgIGNvbnN0IGFzeW5jSW5zID0gIE1FdmVudG9Bc3luYy5uZXdJbnN0YW5jZSgpO1xuICAgICAgICBhc3luY0lucy5fbWVtb3J5ID0gdGhpcy5fbWVtb3J5O1xuICAgICAgICAvLy8gPz8/P1xuICAgICAgICBhc3luY0lucy5fZnVuY3Rpb25zUmVnaXN0cnkgPSB0aGlzLl9mdW5jdGlvbnNSZWdpc3RyeTtcbiAgICAgICAgcmV0dXJuIGFzeW5jSW5zO1xuICAgIH07XG5cbn1cblxuZXhwb3J0IGNsYXNzIE1FdmVudG9Bc3luYyBleHRlbmRzIE1FdmVudG8ge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyB2aXNpdFJvb3RBU1Qobm9kZTogUm9vdEFTVCkge1xuICAgICAgICBjb25zdCBsaXN0ID0gbm9kZS5ib2R5O1xuICAgICAgICBsZXQgbGFzdDtcbiAgICAgICAgZm9yIChjb25zdCBuIG9mIGxpc3QpIHtcbiAgICAgICAgICAgIGxhc3QgPSBhd2FpdCB0aGlzLnZpc2l0KG4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsYXN0O1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgdmlzaXRCbG9ja1N0YXRlbWVudEFTVChub2RlOiBCbG9ja1N0YXRlbWVudEFTVCk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIGNvbnN0IGxpc3QgPSBub2RlLmJvZHk7XG4gICAgICAgIGxldCBsYXN0O1xuICAgICAgICBmb3IgKGNvbnN0IG4gb2YgbGlzdCkge1xuICAgICAgICAgICAgbGFzdCA9IGF3YWl0IHRoaXMudmlzaXQobik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxhc3Q7XG4gICAgfVxuICAgIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyB2aXNpdElkZW50aWZpZXJBU1Qobm9kZTogQVNUKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgY29uc3QgaWQgPSAobm9kZSBhcyBJZGVudGlmaWVyQVNUKS52YWx1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21lbW9yeVtpZF07XG4gICAgfVxuICAgIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyB2aXNpdExpdGVyYWxBU1Qobm9kZTogTGl0ZXJhbEFTVCk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gbm9kZS52YWx1ZTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgdmlzaXRBc3NpZ25tZW50RXhwcmVzc2lvbkFTVChub2RlOiBBc3NpZ25tZW50RXhwcmVzc2lvbkFTVCkge1xuICAgICAgICBjb25zdCBpZDogQVNUID0gbm9kZS5pZGVudGlmaWVyO1xuXG4gICAgICAgIGNvbnN0IGluaXQ6IEFTVCA9IG5vZGUuaW5pdDtcbiAgICAgICAgbGV0IHZhbHVlOiBhbnkgPSBudWxsO1xuICAgICAgICBpZiAoaWQgaW5zdGFuY2VvZiBJbmRleEFjY2Vzc29yQVNUKSB7XG4gICAgICAgICAgICB2YXIgdGFyZ2V0ID0gYXdhaXQgdGhpcy52aXNpdChpZC5vd25lcik7XG4gICAgICAgICAgICB2YWx1ZSA9IGF3YWl0IHRoaXMudmlzaXQobm9kZS5pbml0KTtcbiAgICAgICAgICAgIHZhciBwcm9wZXJ0eSA9IGF3YWl0IHRoaXMudmlzaXQoaWQua2V5KTtcbiAgICAgICAgICAgIHRoaXMuYXNzaWduUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eSwgdmFsdWUpO1xuICAgICAgICB9IGVsc2UgaWYgKGlkIGluc3RhbmNlb2YgSWRlbnRpZmllckFTVCkge1xuICAgICAgICAgICAgdmFsdWUgPSBhd2FpdCB0aGlzLnZpc2l0KGluaXQpO1xuICAgICAgICAgICAgdGhpcy5fbWVtb3J5W2lkLnZhbHVlXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIHZpc2l0RXhwcmVzc2lvblN0YXRlbWVudEFTVChub2RlOiBFeHByZXNzaW9uU3RhdGVtZW50QVNUKSB7XG4gICAgICAgIGNvbnN0IGV4cHIgPSBub2RlLmV4cHJlc3Npb247XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnZpc2l0KGV4cHIpO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgdmlzaXRDYWxsRXhwcmVzc2lvbkFTVChub2RlOiBDYWxsRXhwcmVzc2lvbkFTVCkge1xuICAgICAgICBjb25zdCBjYWxsZWUgPSBub2RlLmNhbGxlZTtcbiAgICAgICAgY29uc3QgYXJncyA9IG5vZGUuYXJndW1lbnRzO1xuICAgICAgICBjb25zdCBjYWxsZWVOYW1lID0gY2FsbGVlLnZhbHVlO1xuICAgICAgICBjb25zdCBmbiA9IHRoaXMuX2Z1bmN0aW9uc1JlZ2lzdHJ5W2NhbGxlZU5hbWVdO1xuICAgICAgICBjb25zdCBhcmdWYWx1ZXMgPSBhd2FpdCBQcm9taXNlLmFsbChhcmdzLm1hcCgoZSkgPT4gdGhpcy52aXNpdChlKSkpO1xuICAgICAgICAvLyBwcmludChcImFyZ1ZhbHVlczo6XCIsIGFyZ1ZhbHVlcylcbiAgICAgICAgcmV0dXJuIGF3YWl0IGZuPy4oYXJnVmFsdWVzLCB0aGlzKTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIHZpc2l0QmluYXJ5RXhwcmVzc2lvbkFTVChub2RlOiBCaW5hcnlFeHByZXNzaW9uQVNUKSB7XG4gICAgICAgIGNvbnN0IGxlZnQgPSBub2RlLmxlZnQ7XG4gICAgICAgIGNvbnN0IHJpZ2h0ID0gbm9kZS5yaWdodDtcbiAgICAgICAgY29uc3Qgb3AgPSBub2RlLm9wZXJhdGlvbjtcbiAgICAgICAgY29uc3QgbFZhbHVlID0gYXdhaXQgdGhpcy52aXNpdChsZWZ0KTtcbiAgICAgICAgY29uc3QgclZhbHVlID0gYXdhaXQgdGhpcy52aXNpdChyaWdodCk7XG4gICAgICAgIHN3aXRjaCAob3AudHlwZSkge1xuICAgICAgICAgICAgY2FzZSBUb2tlblR5cGUucGx1czpcbiAgICAgICAgICAgICAgICBpZiAoaXNOdW0obFZhbHVlKSAmJiBpc051bShyVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBsVmFsdWUgKyByVmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBgJHtsVmFsdWV9JHtyVmFsdWV9YDtcbiAgICAgICAgICAgIGNhc2UgVG9rZW5UeXBlLm1pbnVzOlxuICAgICAgICAgICAgICAgIGlmIChpc051bShsVmFsdWUpICYmIGlzTnVtKHJWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxWYWx1ZSAtIHJWYWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGlzU3RyaW5nKGxWYWx1ZSkgJiYgaXNOdW0oclZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbFZhbHVlICogclZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaXNOdW0obFZhbHVlKSAmJiBpc1N0cmluZyhyVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByVmFsdWUgKiBsVmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgT3BlcmF0aW9uICR7b3AudmFsdWV9IG5vdCBhbGxvd2VkIG5vIG51bSB2YWx1ZWApO1xuICAgICAgICAgICAgY2FzZSBUb2tlblR5cGUubXVsdDpcbiAgICAgICAgICAgICAgICBpZiAoaXNOdW0obFZhbHVlKSAmJiBpc051bShyVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBsVmFsdWUgKiByVmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgT3BlcmF0aW9uICR7b3AudmFsdWV9IG5vdCBhbGxvd2VkIG5vIG51bSB2YWx1ZWApO1xuICAgICAgICAgICAgY2FzZSBUb2tlblR5cGUuZGl2OlxuICAgICAgICAgICAgICAgIGlmIChpc051bShsVmFsdWUpICYmIGlzTnVtKHJWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJWYWx1ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBkaXZpc2lvbiBieSAwXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBsVmFsdWUgLyByVmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgT3BlcmF0aW9uICR7b3AudmFsdWV9IG5vdCBhbGxvd2VkIG5vIG51bSB2YWx1ZWApO1xuICAgICAgICAgICAgY2FzZSBUb2tlblR5cGUubW9kOlxuICAgICAgICAgICAgICAgIGlmIChpc051bShsVmFsdWUpICYmIGlzTnVtKHJWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxWYWx1ZSAlIHJWYWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBPcGVyYXRpb24gJHtvcC52YWx1ZX0gbm90IGFsbG93ZWQgbm8gbnVtIHZhbHVlYCk7XG4gICAgICAgICAgICBjYXNlIFRva2VuVHlwZS5ncmVhdDpcbiAgICAgICAgICAgICAgICBpZiAoaXNOdW0obFZhbHVlKSAmJiBpc051bShyVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBsVmFsdWUgPiByVmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgT3BlcmF0aW9uICR7b3AudmFsdWV9IG5vdCBhbGxvd2VkIG5vIG51bSB2YWx1ZWApO1xuICAgICAgICAgICAgY2FzZSBUb2tlblR5cGUuZ3JlYXRFcTpcbiAgICAgICAgICAgICAgICBpZiAoaXNOdW0obFZhbHVlKSAmJiBpc051bShyVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBsVmFsdWUgPj0gclZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE9wZXJhdGlvbiAke29wLnZhbHVlfSBub3QgYWxsb3dlZCBubyBudW0gdmFsdWVgKTtcbiAgICAgICAgICAgIGNhc2UgVG9rZW5UeXBlLmxlc3M6XG4gICAgICAgICAgICAgICAgaWYgKGlzTnVtKGxWYWx1ZSkgJiYgaXNOdW0oclZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbFZhbHVlIDwgclZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE9wZXJhdGlvbiAke29wLnZhbHVlfSBub3QgYWxsb3dlZCBubyBudW0gdmFsdWVgKTtcbiAgICAgICAgICAgIGNhc2UgVG9rZW5UeXBlLmxlc3NFcTpcbiAgICAgICAgICAgICAgICBpZiAoaXNOdW0obFZhbHVlKSAmJiBpc051bShyVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBsVmFsdWUgPD0gclZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE9wZXJhdGlvbiAke29wLnZhbHVlfSBub3QgYWxsb3dlZCBubyBudW0gdmFsdWVgKTtcbiAgICAgICAgICAgIGNhc2UgVG9rZW5UeXBlLmVxZXE6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxWYWx1ZSA9PT0gclZhbHVlO1xuICAgICAgICAgICAgY2FzZSBUb2tlblR5cGUubm90RXE6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxWYWx1ZSAhPT0gclZhbHVlO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE9wZXJhdGlvbiAke29wLnZhbHVlfSBub3QgYWxsb3dlZCBubyBudW0gdmFsdWVgKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgdmlzaXRVbmFyeUV4cHJlc3Npb25BU1Qobm9kZTogVW5hcnlFeHByZXNzaW9uQVNUKSB7XG4gICAgICAgIGNvbnN0IGFyZyA9IG5vZGUuYXJndW1lbnQ7XG4gICAgICAgIGNvbnN0IG9wID0gbm9kZS5vcGVyYXRpb247XG4gICAgICAgIGNvbnN0IGFyZ1ZhbHVlID0gYXdhaXQgdGhpcy52aXNpdChhcmcpO1xuICAgICAgICBpZiAoaXNOdW0oYXJnVmFsdWUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE9wZXJhdGlvbiAke29wLnZhbHVlfSBub3QgYWxsb3dlZCBubyBudW0gdmFsdWVgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3AudHlwZSA9PT0gVG9rZW5UeXBlLnBsdXMpIHtcbiAgICAgICAgICAgIHJldHVybiBhcmdWYWx1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChvcC50eXBlID09PSBUb2tlblR5cGUubWludXMpIHtcbiAgICAgICAgICAgIHJldHVybiAtYXJnVmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBPcGVyYXRpb24gJHtvcC52YWx1ZX0gbm90IGFsbG93ZWQgbm8gbnVtIHZhbHVlYCk7XG4gICAgfVxuICAgIHByb3RlY3RlZCBvdmVycmlkZSAgYXN5bmMgdmlzaXRJZlN0YXRlbWVudEFTVChub2RlOiBJZlN0YXRlbWVudEFTVCkge1xuICAgICAgICBjb25zdCB0ZXN0Tm9kZTogQVNUID0gbm9kZS50ZXN0O1xuICAgICAgICBjb25zdCB0ZXN0ID0gYXdhaXQgdGhpcy52aXNpdCh0ZXN0Tm9kZSk7XG4gICAgICAgIGNvbnN0IHRlc3RCb29sVmFsdWUgPSBfYm9vbFZhbHVlKHRlc3QpO1xuXG4gICAgICAgIGlmICh0ZXN0Qm9vbFZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy52aXNpdChub2RlLmNvbnNlcXVlbnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMudmlzaXQobm9kZS5hbHRlcm5hdGUhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgdmlzaXRMb2dpY2FsRXhwcmVzc2lvbkFTVChub2RlOiBMb2dpY2FsRXhwcmVzc2lvbkFTVCkge1xuICAgICAgICBjb25zdCBsZWZ0Tm9kZSA9IG5vZGUubGVmdDtcbiAgICAgICAgY29uc3QgdGVzdCA9IGF3YWl0IHRoaXMudmlzaXQobGVmdE5vZGUpO1xuICAgICAgICBjb25zdCB0ZXN0Qm9vbFZhbHVlID0gX2Jvb2xWYWx1ZSh0ZXN0KTtcbiAgICAgICAgaWYgKG5vZGUub3BlcmF0b3IudHlwZSA9PT0gVG9rZW5UeXBlLmFuZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRlc3RCb29sVmFsdWUgJiYgX2Jvb2xWYWx1ZShhd2FpdCB0aGlzLnZpc2l0KG5vZGUucmlnaHQpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5vcGVyYXRvci50eXBlID09PSBUb2tlblR5cGUub3IpIHtcbiAgICAgICAgICAgIHJldHVybiB0ZXN0Qm9vbFZhbHVlIHx8IF9ib29sVmFsdWUoYXdhaXQgdGhpcy52aXNpdChub2RlLnJpZ2h0KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgdmlzaXRJbmRleEFjY2Vzc29yQVNUKG5vZGU6IEluZGV4QWNjZXNzb3JBU1QpIHtcbiAgICAgICAgY29uc3Qgb3duZXJOb2RlID0gKG5vZGUgYXMgSW5kZXhBY2Nlc3NvckFTVCkub3duZXI7XG4gICAgICAgIGNvbnN0IG93bmVyID0gYXdhaXQgdGhpcy52aXNpdChvd25lck5vZGUpO1xuICAgICAgICBpZiAodHlwZW9mIG93bmVyID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gYXdhaXQgdGhpcy52aXNpdChub2RlLmtleSk7XG4gICAgICAgICAgICByZXR1cm4gb3duZXJba2V5XTtcbiAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KG93bmVyKSkge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gYXdhaXQgdGhpcy52aXNpdChub2RlLmtleSk7XG4gICAgICAgICAgICByZXR1cm4gaXNOdW0oa2V5KSAmJiBvd25lci5sZW5ndGggPCBrZXkgJiYga2V5ID49IDAgPyBvd25lcltrZXldIDogbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIHZpc2l0T2JqZWN0UHJvcGVydHkobm9kZTogQVNUKSB7IH1cblxuICAgIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyB2aXNpdE9iamVjdEV4cHJlc3Npb24oYXN0OiBBU1QpIHtcbiAgICAgICAgY29uc3QgaW5zdGFuY2U6IGFueSA9IHt9O1xuICAgICAgICBjb25zdCBub2RlID0gYXN0IGFzIE9iamVjdEV4cHJlc3Npb247XG4gICAgICAgIGZvciAoY29uc3QgaXQgb2Ygbm9kZS5wcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICBpZiAoaXQgaW5zdGFuY2VvZiBPYmplY3RQcm9wZXJ0eSkge1xuICAgICAgICAgICAgICAgIGxldCBrZXkgPSBhd2FpdCB0aGlzLnZpc2l0KGl0LmtleSk7XG4gICAgICAgICAgICAgICAga2V5ID0gaXNTdHJpbmcoa2V5KSA/IGtleSA6IGtleS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgIGluc3RhbmNlW2tleV0gPSBhd2FpdCB0aGlzLnZpc2l0KGl0LnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIHZpc2l0QXJyYXlFeHByZXNzaW9uKGFzdDogQVNUKSB7XG4gICAgICAgIGNvbnN0IG5vZGUgPSBhc3QgYXMgQXJyYXlFeHByZXNzaW9uO1xuICAgICAgICBjb25zdCBhcmdzID0gYXdhaXQgdGhpcy5yZXNvbHZlQXJndW1lbnRzQXN5bmMobm9kZS5lbGVtZW50cyk7XG4gICAgICAgIHJldHVybiBhcmdzO1xuICAgIH1cblxuICAgIGFzeW5jIHJlc29sdmVBcmd1bWVudHNBc3luYyhhcmdzOiBBU1RbXSk6IFByb21pc2U8YW55W10+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IFByb21pc2UuYWxsKGFyZ3MubWFwKGFzeW5jIChpdDogQVNUKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy52aXNpdChpdCk7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgb3ZlcnJpZGUgcmVnaXN0ZXJGdW5jdGlvbihpZDogc3RyaW5nLCBmbjogTUV2ZW50b0ZCaW5kaW5nKSB7XG4gICAgICAgIHRoaXMuX2Z1bmN0aW9uc1JlZ2lzdHJ5W2lkXSA9IGZuO1xuICAgIH1cblxuICAgIG92ZXJyaWRlIHVucmVnaXN0ZXJGdW5jdGlvbihpZDogc3RyaW5nKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9mdW5jdGlvbnNSZWdpc3RyeVtpZF07XG4gICAgfVxuICAgIG92ZXJyaWRlICBhc3luYyBleGVjdXRlKHNvdXJjZTogc3RyaW5nLCBjYWNoZSA9IHRydWUpIHtcbiAgICAgICAgY29uc3QgbW9kdWxlID0gTUV2ZW50by5jb21waWxlKHNvdXJjZSwgY2FjaGUpO1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy52aXNpdChtb2R1bGUpO1xuICAgIH1cblxuICAgIHN0YXRpYyBvdmVycmlkZSBhc3luYyBydW4oc291cmNlOiBzdHJpbmcsIGNhY2hlID0gZmFsc2UpIHtcbiAgICAgICAgY29uc3QgbWV2ZW50byA9IG5ldyBNRXZlbnRvQXN5bmMoKTtcbiAgICAgICAgY29uc3QgbW9kdWxlID0gTUV2ZW50by5jb21waWxlKHNvdXJjZSwgY2FjaGUpO1xuICAgICAgICByZXR1cm4gYXdhaXQgbWV2ZW50by52aXNpdChtb2R1bGUpO1xuICAgIH1cblxuICAgIHN0YXRpYyBvdmVycmlkZSBuZXdJbnN0YW5jZSgpOiBNRXZlbnRvQXN5bmMge1xuICAgICAgICAvLyBjb25zdCBsZXhlciA9IExleGVyKHNvdXJjZSk7XG4gICAgICAgIC8vIGNvbnN0IHBhcnNlciA9IFBhcnNlcihsZXhlcik7XG4gICAgICAgIC8vIGNvbnN0IG1vZHVsZSA9IHBhcnNlci5wYXJzZSgpO1xuICAgICAgICByZXR1cm4gbmV3IE1FdmVudG9Bc3luYygpO1xuICAgIH1cblxuXG4gICAgb3ZlcnJpZGUgY2xvbmUoKTogTUV2ZW50b0FzeW5jIHtcbiAgICAgICAgdmFyIHJldCA9IG5ldyBNRXZlbnRvQXN5bmMoKTtcbiAgICAgICAgcmV0Ll9mdW5jdGlvbnNSZWdpc3RyeSA9IHsgLi4udGhpcy5fZnVuY3Rpb25zUmVnaXN0cnkgfTtcbiAgICAgICAgcmV0Ll9tZW1vcnkgPSB7IC4uLnRoaXMuX21lbW9yeSB9O1xuICAgICAgICByZXR1cm4gcmV0O1xuICAgIH1cbn1cbiJdfQ==
|