vitest 0.0.132 → 0.0.136

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.
@@ -0,0 +1,3462 @@
1
+ import { n as noop, i as isObject } from './index-64aafe4b.js';
2
+ import { i as isMockFunction, a as spyOn, f as fn, s as spies } from './jest-mock-30625866.js';
3
+ import { c as commonjsGlobal, g as getDefaultExportFromCjs } from './_commonjsHelpers-c9e3b764.js';
4
+
5
+ var __defProp = Object.defineProperty;
6
+ var __defProps = Object.defineProperties;
7
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
8
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
9
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
10
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
11
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
12
+ var __spreadValues = (a, b) => {
13
+ for (var prop in b || (b = {}))
14
+ if (__hasOwnProp.call(b, prop))
15
+ __defNormalProp(a, prop, b[prop]);
16
+ if (__getOwnPropSymbols)
17
+ for (var prop of __getOwnPropSymbols(b)) {
18
+ if (__propIsEnum.call(b, prop))
19
+ __defNormalProp(a, prop, b[prop]);
20
+ }
21
+ return a;
22
+ };
23
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
24
+ function createChainable(keys, fn) {
25
+ function create(obj) {
26
+ const chain2 = function(...args) {
27
+ return fn.apply(obj, args);
28
+ };
29
+ for (const key of keys) {
30
+ Object.defineProperty(chain2, key, {
31
+ get() {
32
+ return create(__spreadProps(__spreadValues({}, obj), { [key]: true }));
33
+ }
34
+ });
35
+ }
36
+ return chain2;
37
+ }
38
+ const chain = create({});
39
+ chain.fn = fn;
40
+ return chain;
41
+ }
42
+
43
+ const context = {
44
+ tasks: [],
45
+ currentSuite: null
46
+ };
47
+ function collectTask(task) {
48
+ var _a;
49
+ (_a = context.currentSuite) == null ? void 0 : _a.tasks.push(task);
50
+ }
51
+ async function runWithSuite(suite, fn) {
52
+ const prev = context.currentSuite;
53
+ context.currentSuite = suite;
54
+ await fn();
55
+ context.currentSuite = prev;
56
+ }
57
+ function getDefaultTestTimeout() {
58
+ return process.__vitest_worker__.config.testTimeout;
59
+ }
60
+ function getDefaultHookTimeout() {
61
+ return process.__vitest_worker__.config.hookTimeout;
62
+ }
63
+ function withTimeout(fn, _timeout) {
64
+ const timeout = _timeout ?? getDefaultTestTimeout();
65
+ if (timeout <= 0 || timeout === Infinity)
66
+ return fn;
67
+ return (...args) => {
68
+ return Promise.race([fn(...args), new Promise((resolve, reject) => {
69
+ const timer = setTimeout(() => {
70
+ clearTimeout(timer);
71
+ reject(new Error(`Test timed out in ${timeout}ms.`));
72
+ }, timeout);
73
+ timer.unref();
74
+ })]);
75
+ };
76
+ }
77
+ function ensureAsyncTest(fn) {
78
+ if (!fn.length)
79
+ return fn;
80
+ return () => new Promise((resolve, reject) => {
81
+ const done = (...args) => args[0] ? reject(args[0]) : resolve();
82
+ fn(done);
83
+ });
84
+ }
85
+ function normalizeTest(fn, timeout) {
86
+ return withTimeout(ensureAsyncTest(fn), timeout);
87
+ }
88
+
89
+ const fnMap = new WeakMap();
90
+ const hooksMap = new WeakMap();
91
+ function setFn(key, fn) {
92
+ fnMap.set(key, fn);
93
+ }
94
+ function getFn(key) {
95
+ return fnMap.get(key);
96
+ }
97
+ function setHooks(key, hooks) {
98
+ hooksMap.set(key, hooks);
99
+ }
100
+ function getHooks(key) {
101
+ return hooksMap.get(key);
102
+ }
103
+
104
+ const suite = createSuite();
105
+ const test$7 = createChainable(["concurrent", "skip", "only", "todo", "fails"], function(name, fn, timeout) {
106
+ getCurrentSuite().test.fn.call(this, name, fn, timeout);
107
+ });
108
+ const describe = suite;
109
+ const it = test$7;
110
+ const defaultSuite = suite("");
111
+ function clearContext() {
112
+ context.tasks.length = 0;
113
+ defaultSuite.clear();
114
+ context.currentSuite = defaultSuite;
115
+ }
116
+ function getCurrentSuite() {
117
+ return context.currentSuite || defaultSuite;
118
+ }
119
+ function createSuiteHooks() {
120
+ return {
121
+ beforeAll: [],
122
+ afterAll: [],
123
+ beforeEach: [],
124
+ afterEach: []
125
+ };
126
+ }
127
+ function createSuiteCollector(name, factory = () => {
128
+ }, mode, concurrent) {
129
+ const tasks = [];
130
+ const factoryQueue = [];
131
+ let suite2;
132
+ initSuite();
133
+ const test2 = createChainable(["concurrent", "skip", "only", "todo", "fails"], function(name2, fn, timeout) {
134
+ const mode2 = this.only ? "only" : this.skip ? "skip" : this.todo ? "todo" : "run";
135
+ const test3 = {
136
+ id: "",
137
+ type: "test",
138
+ name: name2,
139
+ mode: mode2,
140
+ suite: void 0,
141
+ fails: this.fails
142
+ };
143
+ if (this.concurrent || concurrent)
144
+ test3.concurrent = true;
145
+ setFn(test3, normalizeTest(fn || noop, timeout));
146
+ tasks.push(test3);
147
+ });
148
+ const collector = {
149
+ type: "collector",
150
+ name,
151
+ mode,
152
+ test: test2,
153
+ tasks,
154
+ collect,
155
+ clear,
156
+ on: addHook
157
+ };
158
+ function addHook(name2, ...fn) {
159
+ getHooks(suite2)[name2].push(...fn);
160
+ }
161
+ function initSuite() {
162
+ suite2 = {
163
+ id: "",
164
+ type: "suite",
165
+ name,
166
+ mode,
167
+ tasks: []
168
+ };
169
+ setHooks(suite2, createSuiteHooks());
170
+ }
171
+ function clear() {
172
+ tasks.length = 0;
173
+ factoryQueue.length = 0;
174
+ initSuite();
175
+ }
176
+ async function collect(file) {
177
+ factoryQueue.length = 0;
178
+ if (factory)
179
+ await runWithSuite(collector, () => factory(test2));
180
+ const allChildren = await Promise.all([...factoryQueue, ...tasks].map((i) => i.type === "collector" ? i.collect(file) : i));
181
+ suite2.file = file;
182
+ suite2.tasks = allChildren;
183
+ allChildren.forEach((task) => {
184
+ task.suite = suite2;
185
+ if (file)
186
+ task.file = file;
187
+ });
188
+ return suite2;
189
+ }
190
+ collectTask(collector);
191
+ return collector;
192
+ }
193
+ function createSuite() {
194
+ return createChainable(["concurrent", "skip", "only", "todo"], function(name, factory) {
195
+ const mode = this.only ? "only" : this.skip ? "skip" : this.todo ? "todo" : "run";
196
+ return createSuiteCollector(name, factory, mode, this.concurrent);
197
+ });
198
+ }
199
+
200
+ var build = {};
201
+
202
+ var ansiStyles = {exports: {}};
203
+
204
+ (function (module) {
205
+
206
+ const ANSI_BACKGROUND_OFFSET = 10;
207
+
208
+ const wrapAnsi256 = (offset = 0) => code => `\u001B[${38 + offset};5;${code}m`;
209
+
210
+ const wrapAnsi16m = (offset = 0) => (red, green, blue) => `\u001B[${38 + offset};2;${red};${green};${blue}m`;
211
+
212
+ function assembleStyles() {
213
+ const codes = new Map();
214
+ const styles = {
215
+ modifier: {
216
+ reset: [0, 0],
217
+ // 21 isn't widely supported and 22 does the same thing
218
+ bold: [1, 22],
219
+ dim: [2, 22],
220
+ italic: [3, 23],
221
+ underline: [4, 24],
222
+ overline: [53, 55],
223
+ inverse: [7, 27],
224
+ hidden: [8, 28],
225
+ strikethrough: [9, 29]
226
+ },
227
+ color: {
228
+ black: [30, 39],
229
+ red: [31, 39],
230
+ green: [32, 39],
231
+ yellow: [33, 39],
232
+ blue: [34, 39],
233
+ magenta: [35, 39],
234
+ cyan: [36, 39],
235
+ white: [37, 39],
236
+
237
+ // Bright color
238
+ blackBright: [90, 39],
239
+ redBright: [91, 39],
240
+ greenBright: [92, 39],
241
+ yellowBright: [93, 39],
242
+ blueBright: [94, 39],
243
+ magentaBright: [95, 39],
244
+ cyanBright: [96, 39],
245
+ whiteBright: [97, 39]
246
+ },
247
+ bgColor: {
248
+ bgBlack: [40, 49],
249
+ bgRed: [41, 49],
250
+ bgGreen: [42, 49],
251
+ bgYellow: [43, 49],
252
+ bgBlue: [44, 49],
253
+ bgMagenta: [45, 49],
254
+ bgCyan: [46, 49],
255
+ bgWhite: [47, 49],
256
+
257
+ // Bright color
258
+ bgBlackBright: [100, 49],
259
+ bgRedBright: [101, 49],
260
+ bgGreenBright: [102, 49],
261
+ bgYellowBright: [103, 49],
262
+ bgBlueBright: [104, 49],
263
+ bgMagentaBright: [105, 49],
264
+ bgCyanBright: [106, 49],
265
+ bgWhiteBright: [107, 49]
266
+ }
267
+ };
268
+
269
+ // Alias bright black as gray (and grey)
270
+ styles.color.gray = styles.color.blackBright;
271
+ styles.bgColor.bgGray = styles.bgColor.bgBlackBright;
272
+ styles.color.grey = styles.color.blackBright;
273
+ styles.bgColor.bgGrey = styles.bgColor.bgBlackBright;
274
+
275
+ for (const [groupName, group] of Object.entries(styles)) {
276
+ for (const [styleName, style] of Object.entries(group)) {
277
+ styles[styleName] = {
278
+ open: `\u001B[${style[0]}m`,
279
+ close: `\u001B[${style[1]}m`
280
+ };
281
+
282
+ group[styleName] = styles[styleName];
283
+
284
+ codes.set(style[0], style[1]);
285
+ }
286
+
287
+ Object.defineProperty(styles, groupName, {
288
+ value: group,
289
+ enumerable: false
290
+ });
291
+ }
292
+
293
+ Object.defineProperty(styles, 'codes', {
294
+ value: codes,
295
+ enumerable: false
296
+ });
297
+
298
+ styles.color.close = '\u001B[39m';
299
+ styles.bgColor.close = '\u001B[49m';
300
+
301
+ styles.color.ansi256 = wrapAnsi256();
302
+ styles.color.ansi16m = wrapAnsi16m();
303
+ styles.bgColor.ansi256 = wrapAnsi256(ANSI_BACKGROUND_OFFSET);
304
+ styles.bgColor.ansi16m = wrapAnsi16m(ANSI_BACKGROUND_OFFSET);
305
+
306
+ // From https://github.com/Qix-/color-convert/blob/3f0e0d4e92e235796ccb17f6e85c72094a651f49/conversions.js
307
+ Object.defineProperties(styles, {
308
+ rgbToAnsi256: {
309
+ value: (red, green, blue) => {
310
+ // We use the extended greyscale palette here, with the exception of
311
+ // black and white. normal palette only has 4 greyscale shades.
312
+ if (red === green && green === blue) {
313
+ if (red < 8) {
314
+ return 16;
315
+ }
316
+
317
+ if (red > 248) {
318
+ return 231;
319
+ }
320
+
321
+ return Math.round(((red - 8) / 247) * 24) + 232;
322
+ }
323
+
324
+ return 16 +
325
+ (36 * Math.round(red / 255 * 5)) +
326
+ (6 * Math.round(green / 255 * 5)) +
327
+ Math.round(blue / 255 * 5);
328
+ },
329
+ enumerable: false
330
+ },
331
+ hexToRgb: {
332
+ value: hex => {
333
+ const matches = /(?<colorString>[a-f\d]{6}|[a-f\d]{3})/i.exec(hex.toString(16));
334
+ if (!matches) {
335
+ return [0, 0, 0];
336
+ }
337
+
338
+ let {colorString} = matches.groups;
339
+
340
+ if (colorString.length === 3) {
341
+ colorString = colorString.split('').map(character => character + character).join('');
342
+ }
343
+
344
+ const integer = Number.parseInt(colorString, 16);
345
+
346
+ return [
347
+ (integer >> 16) & 0xFF,
348
+ (integer >> 8) & 0xFF,
349
+ integer & 0xFF
350
+ ];
351
+ },
352
+ enumerable: false
353
+ },
354
+ hexToAnsi256: {
355
+ value: hex => styles.rgbToAnsi256(...styles.hexToRgb(hex)),
356
+ enumerable: false
357
+ }
358
+ });
359
+
360
+ return styles;
361
+ }
362
+
363
+ // Make the export immutable
364
+ Object.defineProperty(module, 'exports', {
365
+ enumerable: true,
366
+ get: assembleStyles
367
+ });
368
+ }(ansiStyles));
369
+
370
+ var collections = {};
371
+
372
+ Object.defineProperty(collections, '__esModule', {
373
+ value: true
374
+ });
375
+ collections.printIteratorEntries = printIteratorEntries;
376
+ collections.printIteratorValues = printIteratorValues;
377
+ collections.printListItems = printListItems;
378
+ collections.printObjectProperties = printObjectProperties;
379
+
380
+ /**
381
+ * Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
382
+ *
383
+ * This source code is licensed under the MIT license found in the
384
+ * LICENSE file in the root directory of this source tree.
385
+ *
386
+ */
387
+ const getKeysOfEnumerableProperties = (object, compareKeys) => {
388
+ const keys = Object.keys(object).sort(compareKeys);
389
+
390
+ if (Object.getOwnPropertySymbols) {
391
+ Object.getOwnPropertySymbols(object).forEach(symbol => {
392
+ if (Object.getOwnPropertyDescriptor(object, symbol).enumerable) {
393
+ keys.push(symbol);
394
+ }
395
+ });
396
+ }
397
+
398
+ return keys;
399
+ };
400
+ /**
401
+ * Return entries (for example, of a map)
402
+ * with spacing, indentation, and comma
403
+ * without surrounding punctuation (for example, braces)
404
+ */
405
+
406
+ function printIteratorEntries(
407
+ iterator,
408
+ config,
409
+ indentation,
410
+ depth,
411
+ refs,
412
+ printer, // Too bad, so sad that separator for ECMAScript Map has been ' => '
413
+ // What a distracting diff if you change a data structure to/from
414
+ // ECMAScript Object or Immutable.Map/OrderedMap which use the default.
415
+ separator = ': '
416
+ ) {
417
+ let result = '';
418
+ let current = iterator.next();
419
+
420
+ if (!current.done) {
421
+ result += config.spacingOuter;
422
+ const indentationNext = indentation + config.indent;
423
+
424
+ while (!current.done) {
425
+ const name = printer(
426
+ current.value[0],
427
+ config,
428
+ indentationNext,
429
+ depth,
430
+ refs
431
+ );
432
+ const value = printer(
433
+ current.value[1],
434
+ config,
435
+ indentationNext,
436
+ depth,
437
+ refs
438
+ );
439
+ result += indentationNext + name + separator + value;
440
+ current = iterator.next();
441
+
442
+ if (!current.done) {
443
+ result += ',' + config.spacingInner;
444
+ } else if (!config.min) {
445
+ result += ',';
446
+ }
447
+ }
448
+
449
+ result += config.spacingOuter + indentation;
450
+ }
451
+
452
+ return result;
453
+ }
454
+ /**
455
+ * Return values (for example, of a set)
456
+ * with spacing, indentation, and comma
457
+ * without surrounding punctuation (braces or brackets)
458
+ */
459
+
460
+ function printIteratorValues(
461
+ iterator,
462
+ config,
463
+ indentation,
464
+ depth,
465
+ refs,
466
+ printer
467
+ ) {
468
+ let result = '';
469
+ let current = iterator.next();
470
+
471
+ if (!current.done) {
472
+ result += config.spacingOuter;
473
+ const indentationNext = indentation + config.indent;
474
+
475
+ while (!current.done) {
476
+ result +=
477
+ indentationNext +
478
+ printer(current.value, config, indentationNext, depth, refs);
479
+ current = iterator.next();
480
+
481
+ if (!current.done) {
482
+ result += ',' + config.spacingInner;
483
+ } else if (!config.min) {
484
+ result += ',';
485
+ }
486
+ }
487
+
488
+ result += config.spacingOuter + indentation;
489
+ }
490
+
491
+ return result;
492
+ }
493
+ /**
494
+ * Return items (for example, of an array)
495
+ * with spacing, indentation, and comma
496
+ * without surrounding punctuation (for example, brackets)
497
+ **/
498
+
499
+ function printListItems(list, config, indentation, depth, refs, printer) {
500
+ let result = '';
501
+
502
+ if (list.length) {
503
+ result += config.spacingOuter;
504
+ const indentationNext = indentation + config.indent;
505
+
506
+ for (let i = 0; i < list.length; i++) {
507
+ result += indentationNext;
508
+
509
+ if (i in list) {
510
+ result += printer(list[i], config, indentationNext, depth, refs);
511
+ }
512
+
513
+ if (i < list.length - 1) {
514
+ result += ',' + config.spacingInner;
515
+ } else if (!config.min) {
516
+ result += ',';
517
+ }
518
+ }
519
+
520
+ result += config.spacingOuter + indentation;
521
+ }
522
+
523
+ return result;
524
+ }
525
+ /**
526
+ * Return properties of an object
527
+ * with spacing, indentation, and comma
528
+ * without surrounding punctuation (for example, braces)
529
+ */
530
+
531
+ function printObjectProperties(val, config, indentation, depth, refs, printer) {
532
+ let result = '';
533
+ const keys = getKeysOfEnumerableProperties(val, config.compareKeys);
534
+
535
+ if (keys.length) {
536
+ result += config.spacingOuter;
537
+ const indentationNext = indentation + config.indent;
538
+
539
+ for (let i = 0; i < keys.length; i++) {
540
+ const key = keys[i];
541
+ const name = printer(key, config, indentationNext, depth, refs);
542
+ const value = printer(val[key], config, indentationNext, depth, refs);
543
+ result += indentationNext + name + ': ' + value;
544
+
545
+ if (i < keys.length - 1) {
546
+ result += ',' + config.spacingInner;
547
+ } else if (!config.min) {
548
+ result += ',';
549
+ }
550
+ }
551
+
552
+ result += config.spacingOuter + indentation;
553
+ }
554
+
555
+ return result;
556
+ }
557
+
558
+ var AsymmetricMatcher$1 = {};
559
+
560
+ Object.defineProperty(AsymmetricMatcher$1, '__esModule', {
561
+ value: true
562
+ });
563
+ AsymmetricMatcher$1.test = AsymmetricMatcher$1.serialize = AsymmetricMatcher$1.default = void 0;
564
+
565
+ var _collections$3 = collections;
566
+
567
+ var global$2 = (function () {
568
+ if (typeof globalThis !== 'undefined') {
569
+ return globalThis;
570
+ } else if (typeof global$2 !== 'undefined') {
571
+ return global$2;
572
+ } else if (typeof self !== 'undefined') {
573
+ return self;
574
+ } else if (typeof window !== 'undefined') {
575
+ return window;
576
+ } else {
577
+ return Function('return this')();
578
+ }
579
+ })();
580
+
581
+ var Symbol$2 = global$2['jest-symbol-do-not-touch'] || global$2.Symbol;
582
+ const asymmetricMatcher =
583
+ typeof Symbol$2 === 'function' && Symbol$2.for
584
+ ? Symbol$2.for('jest.asymmetricMatcher')
585
+ : 0x1357a5;
586
+ const SPACE$2 = ' ';
587
+
588
+ const serialize$6 = (val, config, indentation, depth, refs, printer) => {
589
+ const stringedValue = val.toString();
590
+
591
+ if (
592
+ stringedValue === 'ArrayContaining' ||
593
+ stringedValue === 'ArrayNotContaining'
594
+ ) {
595
+ if (++depth > config.maxDepth) {
596
+ return '[' + stringedValue + ']';
597
+ }
598
+
599
+ return (
600
+ stringedValue +
601
+ SPACE$2 +
602
+ '[' +
603
+ (0, _collections$3.printListItems)(
604
+ val.sample,
605
+ config,
606
+ indentation,
607
+ depth,
608
+ refs,
609
+ printer
610
+ ) +
611
+ ']'
612
+ );
613
+ }
614
+
615
+ if (
616
+ stringedValue === 'ObjectContaining' ||
617
+ stringedValue === 'ObjectNotContaining'
618
+ ) {
619
+ if (++depth > config.maxDepth) {
620
+ return '[' + stringedValue + ']';
621
+ }
622
+
623
+ return (
624
+ stringedValue +
625
+ SPACE$2 +
626
+ '{' +
627
+ (0, _collections$3.printObjectProperties)(
628
+ val.sample,
629
+ config,
630
+ indentation,
631
+ depth,
632
+ refs,
633
+ printer
634
+ ) +
635
+ '}'
636
+ );
637
+ }
638
+
639
+ if (
640
+ stringedValue === 'StringMatching' ||
641
+ stringedValue === 'StringNotMatching'
642
+ ) {
643
+ return (
644
+ stringedValue +
645
+ SPACE$2 +
646
+ printer(val.sample, config, indentation, depth, refs)
647
+ );
648
+ }
649
+
650
+ if (
651
+ stringedValue === 'StringContaining' ||
652
+ stringedValue === 'StringNotContaining'
653
+ ) {
654
+ return (
655
+ stringedValue +
656
+ SPACE$2 +
657
+ printer(val.sample, config, indentation, depth, refs)
658
+ );
659
+ }
660
+
661
+ return val.toAsymmetricMatcher();
662
+ };
663
+
664
+ AsymmetricMatcher$1.serialize = serialize$6;
665
+
666
+ const test$6 = val => val && val.$$typeof === asymmetricMatcher;
667
+
668
+ AsymmetricMatcher$1.test = test$6;
669
+ const plugin$6 = {
670
+ serialize: serialize$6,
671
+ test: test$6
672
+ };
673
+ var _default$7 = plugin$6;
674
+ AsymmetricMatcher$1.default = _default$7;
675
+
676
+ var ConvertAnsi = {};
677
+
678
+ var ansiRegex = ({onlyFirst = false} = {}) => {
679
+ const pattern = [
680
+ '[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)',
681
+ '(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))'
682
+ ].join('|');
683
+
684
+ return new RegExp(pattern, onlyFirst ? undefined : 'g');
685
+ };
686
+
687
+ Object.defineProperty(ConvertAnsi, '__esModule', {
688
+ value: true
689
+ });
690
+ ConvertAnsi.test = ConvertAnsi.serialize = ConvertAnsi.default = void 0;
691
+
692
+ var _ansiRegex = _interopRequireDefault$2(ansiRegex);
693
+
694
+ var _ansiStyles$1 = _interopRequireDefault$2(ansiStyles.exports);
695
+
696
+ function _interopRequireDefault$2(obj) {
697
+ return obj && obj.__esModule ? obj : {default: obj};
698
+ }
699
+
700
+ /**
701
+ * Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
702
+ *
703
+ * This source code is licensed under the MIT license found in the
704
+ * LICENSE file in the root directory of this source tree.
705
+ */
706
+ const toHumanReadableAnsi = text =>
707
+ text.replace((0, _ansiRegex.default)(), match => {
708
+ switch (match) {
709
+ case _ansiStyles$1.default.red.close:
710
+ case _ansiStyles$1.default.green.close:
711
+ case _ansiStyles$1.default.cyan.close:
712
+ case _ansiStyles$1.default.gray.close:
713
+ case _ansiStyles$1.default.white.close:
714
+ case _ansiStyles$1.default.yellow.close:
715
+ case _ansiStyles$1.default.bgRed.close:
716
+ case _ansiStyles$1.default.bgGreen.close:
717
+ case _ansiStyles$1.default.bgYellow.close:
718
+ case _ansiStyles$1.default.inverse.close:
719
+ case _ansiStyles$1.default.dim.close:
720
+ case _ansiStyles$1.default.bold.close:
721
+ case _ansiStyles$1.default.reset.open:
722
+ case _ansiStyles$1.default.reset.close:
723
+ return '</>';
724
+
725
+ case _ansiStyles$1.default.red.open:
726
+ return '<red>';
727
+
728
+ case _ansiStyles$1.default.green.open:
729
+ return '<green>';
730
+
731
+ case _ansiStyles$1.default.cyan.open:
732
+ return '<cyan>';
733
+
734
+ case _ansiStyles$1.default.gray.open:
735
+ return '<gray>';
736
+
737
+ case _ansiStyles$1.default.white.open:
738
+ return '<white>';
739
+
740
+ case _ansiStyles$1.default.yellow.open:
741
+ return '<yellow>';
742
+
743
+ case _ansiStyles$1.default.bgRed.open:
744
+ return '<bgRed>';
745
+
746
+ case _ansiStyles$1.default.bgGreen.open:
747
+ return '<bgGreen>';
748
+
749
+ case _ansiStyles$1.default.bgYellow.open:
750
+ return '<bgYellow>';
751
+
752
+ case _ansiStyles$1.default.inverse.open:
753
+ return '<inverse>';
754
+
755
+ case _ansiStyles$1.default.dim.open:
756
+ return '<dim>';
757
+
758
+ case _ansiStyles$1.default.bold.open:
759
+ return '<bold>';
760
+
761
+ default:
762
+ return '';
763
+ }
764
+ });
765
+
766
+ const test$5 = val =>
767
+ typeof val === 'string' && !!val.match((0, _ansiRegex.default)());
768
+
769
+ ConvertAnsi.test = test$5;
770
+
771
+ const serialize$5 = (val, config, indentation, depth, refs, printer) =>
772
+ printer(toHumanReadableAnsi(val), config, indentation, depth, refs);
773
+
774
+ ConvertAnsi.serialize = serialize$5;
775
+ const plugin$5 = {
776
+ serialize: serialize$5,
777
+ test: test$5
778
+ };
779
+ var _default$6 = plugin$5;
780
+ ConvertAnsi.default = _default$6;
781
+
782
+ var DOMCollection$1 = {};
783
+
784
+ Object.defineProperty(DOMCollection$1, '__esModule', {
785
+ value: true
786
+ });
787
+ DOMCollection$1.test = DOMCollection$1.serialize = DOMCollection$1.default = void 0;
788
+
789
+ var _collections$2 = collections;
790
+
791
+ /**
792
+ * Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
793
+ *
794
+ * This source code is licensed under the MIT license found in the
795
+ * LICENSE file in the root directory of this source tree.
796
+ */
797
+
798
+ /* eslint-disable local/ban-types-eventually */
799
+ const SPACE$1 = ' ';
800
+ const OBJECT_NAMES = ['DOMStringMap', 'NamedNodeMap'];
801
+ const ARRAY_REGEXP = /^(HTML\w*Collection|NodeList)$/;
802
+
803
+ const testName = name =>
804
+ OBJECT_NAMES.indexOf(name) !== -1 || ARRAY_REGEXP.test(name);
805
+
806
+ const test$4 = val =>
807
+ val &&
808
+ val.constructor &&
809
+ !!val.constructor.name &&
810
+ testName(val.constructor.name);
811
+
812
+ DOMCollection$1.test = test$4;
813
+
814
+ const isNamedNodeMap = collection =>
815
+ collection.constructor.name === 'NamedNodeMap';
816
+
817
+ const serialize$4 = (collection, config, indentation, depth, refs, printer) => {
818
+ const name = collection.constructor.name;
819
+
820
+ if (++depth > config.maxDepth) {
821
+ return '[' + name + ']';
822
+ }
823
+
824
+ return (
825
+ (config.min ? '' : name + SPACE$1) +
826
+ (OBJECT_NAMES.indexOf(name) !== -1
827
+ ? '{' +
828
+ (0, _collections$2.printObjectProperties)(
829
+ isNamedNodeMap(collection)
830
+ ? Array.from(collection).reduce((props, attribute) => {
831
+ props[attribute.name] = attribute.value;
832
+ return props;
833
+ }, {})
834
+ : {...collection},
835
+ config,
836
+ indentation,
837
+ depth,
838
+ refs,
839
+ printer
840
+ ) +
841
+ '}'
842
+ : '[' +
843
+ (0, _collections$2.printListItems)(
844
+ Array.from(collection),
845
+ config,
846
+ indentation,
847
+ depth,
848
+ refs,
849
+ printer
850
+ ) +
851
+ ']')
852
+ );
853
+ };
854
+
855
+ DOMCollection$1.serialize = serialize$4;
856
+ const plugin$4 = {
857
+ serialize: serialize$4,
858
+ test: test$4
859
+ };
860
+ var _default$5 = plugin$4;
861
+ DOMCollection$1.default = _default$5;
862
+
863
+ var DOMElement$1 = {};
864
+
865
+ var markup = {};
866
+
867
+ var escapeHTML$1 = {};
868
+
869
+ Object.defineProperty(escapeHTML$1, '__esModule', {
870
+ value: true
871
+ });
872
+ escapeHTML$1.default = escapeHTML;
873
+
874
+ /**
875
+ * Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
876
+ *
877
+ * This source code is licensed under the MIT license found in the
878
+ * LICENSE file in the root directory of this source tree.
879
+ */
880
+ function escapeHTML(str) {
881
+ return str.replace(/</g, '&lt;').replace(/>/g, '&gt;');
882
+ }
883
+
884
+ Object.defineProperty(markup, '__esModule', {
885
+ value: true
886
+ });
887
+ markup.printText =
888
+ markup.printProps =
889
+ markup.printElementAsLeaf =
890
+ markup.printElement =
891
+ markup.printComment =
892
+ markup.printChildren =
893
+ void 0;
894
+
895
+ var _escapeHTML = _interopRequireDefault$1(escapeHTML$1);
896
+
897
+ function _interopRequireDefault$1(obj) {
898
+ return obj && obj.__esModule ? obj : {default: obj};
899
+ }
900
+
901
+ /**
902
+ * Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
903
+ *
904
+ * This source code is licensed under the MIT license found in the
905
+ * LICENSE file in the root directory of this source tree.
906
+ */
907
+ // Return empty string if keys is empty.
908
+ const printProps = (keys, props, config, indentation, depth, refs, printer) => {
909
+ const indentationNext = indentation + config.indent;
910
+ const colors = config.colors;
911
+ return keys
912
+ .map(key => {
913
+ const value = props[key];
914
+ let printed = printer(value, config, indentationNext, depth, refs);
915
+
916
+ if (typeof value !== 'string') {
917
+ if (printed.indexOf('\n') !== -1) {
918
+ printed =
919
+ config.spacingOuter +
920
+ indentationNext +
921
+ printed +
922
+ config.spacingOuter +
923
+ indentation;
924
+ }
925
+
926
+ printed = '{' + printed + '}';
927
+ }
928
+
929
+ return (
930
+ config.spacingInner +
931
+ indentation +
932
+ colors.prop.open +
933
+ key +
934
+ colors.prop.close +
935
+ '=' +
936
+ colors.value.open +
937
+ printed +
938
+ colors.value.close
939
+ );
940
+ })
941
+ .join('');
942
+ }; // Return empty string if children is empty.
943
+
944
+ markup.printProps = printProps;
945
+
946
+ const printChildren = (children, config, indentation, depth, refs, printer) =>
947
+ children
948
+ .map(
949
+ child =>
950
+ config.spacingOuter +
951
+ indentation +
952
+ (typeof child === 'string'
953
+ ? printText(child, config)
954
+ : printer(child, config, indentation, depth, refs))
955
+ )
956
+ .join('');
957
+
958
+ markup.printChildren = printChildren;
959
+
960
+ const printText = (text, config) => {
961
+ const contentColor = config.colors.content;
962
+ return (
963
+ contentColor.open + (0, _escapeHTML.default)(text) + contentColor.close
964
+ );
965
+ };
966
+
967
+ markup.printText = printText;
968
+
969
+ const printComment = (comment, config) => {
970
+ const commentColor = config.colors.comment;
971
+ return (
972
+ commentColor.open +
973
+ '<!--' +
974
+ (0, _escapeHTML.default)(comment) +
975
+ '-->' +
976
+ commentColor.close
977
+ );
978
+ }; // Separate the functions to format props, children, and element,
979
+ // so a plugin could override a particular function, if needed.
980
+ // Too bad, so sad: the traditional (but unnecessary) space
981
+ // in a self-closing tagColor requires a second test of printedProps.
982
+
983
+ markup.printComment = printComment;
984
+
985
+ const printElement = (
986
+ type,
987
+ printedProps,
988
+ printedChildren,
989
+ config,
990
+ indentation
991
+ ) => {
992
+ const tagColor = config.colors.tag;
993
+ return (
994
+ tagColor.open +
995
+ '<' +
996
+ type +
997
+ (printedProps &&
998
+ tagColor.close +
999
+ printedProps +
1000
+ config.spacingOuter +
1001
+ indentation +
1002
+ tagColor.open) +
1003
+ (printedChildren
1004
+ ? '>' +
1005
+ tagColor.close +
1006
+ printedChildren +
1007
+ config.spacingOuter +
1008
+ indentation +
1009
+ tagColor.open +
1010
+ '</' +
1011
+ type
1012
+ : (printedProps && !config.min ? '' : ' ') + '/') +
1013
+ '>' +
1014
+ tagColor.close
1015
+ );
1016
+ };
1017
+
1018
+ markup.printElement = printElement;
1019
+
1020
+ const printElementAsLeaf = (type, config) => {
1021
+ const tagColor = config.colors.tag;
1022
+ return (
1023
+ tagColor.open +
1024
+ '<' +
1025
+ type +
1026
+ tagColor.close +
1027
+ ' …' +
1028
+ tagColor.open +
1029
+ ' />' +
1030
+ tagColor.close
1031
+ );
1032
+ };
1033
+
1034
+ markup.printElementAsLeaf = printElementAsLeaf;
1035
+
1036
+ Object.defineProperty(DOMElement$1, '__esModule', {
1037
+ value: true
1038
+ });
1039
+ DOMElement$1.test = DOMElement$1.serialize = DOMElement$1.default = void 0;
1040
+
1041
+ var _markup$2 = markup;
1042
+
1043
+ /**
1044
+ * Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
1045
+ *
1046
+ * This source code is licensed under the MIT license found in the
1047
+ * LICENSE file in the root directory of this source tree.
1048
+ */
1049
+ const ELEMENT_NODE = 1;
1050
+ const TEXT_NODE = 3;
1051
+ const COMMENT_NODE = 8;
1052
+ const FRAGMENT_NODE = 11;
1053
+ const ELEMENT_REGEXP = /^((HTML|SVG)\w*)?Element$/;
1054
+
1055
+ const testHasAttribute = val => {
1056
+ try {
1057
+ return typeof val.hasAttribute === 'function' && val.hasAttribute('is');
1058
+ } catch {
1059
+ return false;
1060
+ }
1061
+ };
1062
+
1063
+ const testNode = val => {
1064
+ const constructorName = val.constructor.name;
1065
+ const {nodeType, tagName} = val;
1066
+ const isCustomElement =
1067
+ (typeof tagName === 'string' && tagName.includes('-')) ||
1068
+ testHasAttribute(val);
1069
+ return (
1070
+ (nodeType === ELEMENT_NODE &&
1071
+ (ELEMENT_REGEXP.test(constructorName) || isCustomElement)) ||
1072
+ (nodeType === TEXT_NODE && constructorName === 'Text') ||
1073
+ (nodeType === COMMENT_NODE && constructorName === 'Comment') ||
1074
+ (nodeType === FRAGMENT_NODE && constructorName === 'DocumentFragment')
1075
+ );
1076
+ };
1077
+
1078
+ const test$3 = val => {
1079
+ var _val$constructor;
1080
+
1081
+ return (
1082
+ (val === null || val === void 0
1083
+ ? void 0
1084
+ : (_val$constructor = val.constructor) === null ||
1085
+ _val$constructor === void 0
1086
+ ? void 0
1087
+ : _val$constructor.name) && testNode(val)
1088
+ );
1089
+ };
1090
+
1091
+ DOMElement$1.test = test$3;
1092
+
1093
+ function nodeIsText(node) {
1094
+ return node.nodeType === TEXT_NODE;
1095
+ }
1096
+
1097
+ function nodeIsComment(node) {
1098
+ return node.nodeType === COMMENT_NODE;
1099
+ }
1100
+
1101
+ function nodeIsFragment(node) {
1102
+ return node.nodeType === FRAGMENT_NODE;
1103
+ }
1104
+
1105
+ const serialize$3 = (node, config, indentation, depth, refs, printer) => {
1106
+ if (nodeIsText(node)) {
1107
+ return (0, _markup$2.printText)(node.data, config);
1108
+ }
1109
+
1110
+ if (nodeIsComment(node)) {
1111
+ return (0, _markup$2.printComment)(node.data, config);
1112
+ }
1113
+
1114
+ const type = nodeIsFragment(node)
1115
+ ? `DocumentFragment`
1116
+ : node.tagName.toLowerCase();
1117
+
1118
+ if (++depth > config.maxDepth) {
1119
+ return (0, _markup$2.printElementAsLeaf)(type, config);
1120
+ }
1121
+
1122
+ return (0, _markup$2.printElement)(
1123
+ type,
1124
+ (0, _markup$2.printProps)(
1125
+ nodeIsFragment(node)
1126
+ ? []
1127
+ : Array.from(node.attributes)
1128
+ .map(attr => attr.name)
1129
+ .sort(),
1130
+ nodeIsFragment(node)
1131
+ ? {}
1132
+ : Array.from(node.attributes).reduce((props, attribute) => {
1133
+ props[attribute.name] = attribute.value;
1134
+ return props;
1135
+ }, {}),
1136
+ config,
1137
+ indentation + config.indent,
1138
+ depth,
1139
+ refs,
1140
+ printer
1141
+ ),
1142
+ (0, _markup$2.printChildren)(
1143
+ Array.prototype.slice.call(node.childNodes || node.children),
1144
+ config,
1145
+ indentation + config.indent,
1146
+ depth,
1147
+ refs,
1148
+ printer
1149
+ ),
1150
+ config,
1151
+ indentation
1152
+ );
1153
+ };
1154
+
1155
+ DOMElement$1.serialize = serialize$3;
1156
+ const plugin$3 = {
1157
+ serialize: serialize$3,
1158
+ test: test$3
1159
+ };
1160
+ var _default$4 = plugin$3;
1161
+ DOMElement$1.default = _default$4;
1162
+
1163
+ var Immutable$1 = {};
1164
+
1165
+ Object.defineProperty(Immutable$1, '__esModule', {
1166
+ value: true
1167
+ });
1168
+ Immutable$1.test = Immutable$1.serialize = Immutable$1.default = void 0;
1169
+
1170
+ var _collections$1 = collections;
1171
+
1172
+ /**
1173
+ * Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
1174
+ *
1175
+ * This source code is licensed under the MIT license found in the
1176
+ * LICENSE file in the root directory of this source tree.
1177
+ */
1178
+ // SENTINEL constants are from https://github.com/facebook/immutable-js
1179
+ const IS_ITERABLE_SENTINEL = '@@__IMMUTABLE_ITERABLE__@@';
1180
+ const IS_LIST_SENTINEL = '@@__IMMUTABLE_LIST__@@';
1181
+ const IS_KEYED_SENTINEL$1 = '@@__IMMUTABLE_KEYED__@@';
1182
+ const IS_MAP_SENTINEL = '@@__IMMUTABLE_MAP__@@';
1183
+ const IS_ORDERED_SENTINEL$1 = '@@__IMMUTABLE_ORDERED__@@';
1184
+ const IS_RECORD_SENTINEL = '@@__IMMUTABLE_RECORD__@@'; // immutable v4
1185
+
1186
+ const IS_SEQ_SENTINEL = '@@__IMMUTABLE_SEQ__@@';
1187
+ const IS_SET_SENTINEL$1 = '@@__IMMUTABLE_SET__@@';
1188
+ const IS_STACK_SENTINEL = '@@__IMMUTABLE_STACK__@@';
1189
+
1190
+ const getImmutableName = name => 'Immutable.' + name;
1191
+
1192
+ const printAsLeaf = name => '[' + name + ']';
1193
+
1194
+ const SPACE = ' ';
1195
+ const LAZY = '…'; // Seq is lazy if it calls a method like filter
1196
+
1197
+ const printImmutableEntries = (
1198
+ val,
1199
+ config,
1200
+ indentation,
1201
+ depth,
1202
+ refs,
1203
+ printer,
1204
+ type
1205
+ ) =>
1206
+ ++depth > config.maxDepth
1207
+ ? printAsLeaf(getImmutableName(type))
1208
+ : getImmutableName(type) +
1209
+ SPACE +
1210
+ '{' +
1211
+ (0, _collections$1.printIteratorEntries)(
1212
+ val.entries(),
1213
+ config,
1214
+ indentation,
1215
+ depth,
1216
+ refs,
1217
+ printer
1218
+ ) +
1219
+ '}'; // Record has an entries method because it is a collection in immutable v3.
1220
+ // Return an iterator for Immutable Record from version v3 or v4.
1221
+
1222
+ function getRecordEntries(val) {
1223
+ let i = 0;
1224
+ return {
1225
+ next() {
1226
+ if (i < val._keys.length) {
1227
+ const key = val._keys[i++];
1228
+ return {
1229
+ done: false,
1230
+ value: [key, val.get(key)]
1231
+ };
1232
+ }
1233
+
1234
+ return {
1235
+ done: true,
1236
+ value: undefined
1237
+ };
1238
+ }
1239
+ };
1240
+ }
1241
+
1242
+ const printImmutableRecord = (
1243
+ val,
1244
+ config,
1245
+ indentation,
1246
+ depth,
1247
+ refs,
1248
+ printer
1249
+ ) => {
1250
+ // _name property is defined only for an Immutable Record instance
1251
+ // which was constructed with a second optional descriptive name arg
1252
+ const name = getImmutableName(val._name || 'Record');
1253
+ return ++depth > config.maxDepth
1254
+ ? printAsLeaf(name)
1255
+ : name +
1256
+ SPACE +
1257
+ '{' +
1258
+ (0, _collections$1.printIteratorEntries)(
1259
+ getRecordEntries(val),
1260
+ config,
1261
+ indentation,
1262
+ depth,
1263
+ refs,
1264
+ printer
1265
+ ) +
1266
+ '}';
1267
+ };
1268
+
1269
+ const printImmutableSeq = (val, config, indentation, depth, refs, printer) => {
1270
+ const name = getImmutableName('Seq');
1271
+
1272
+ if (++depth > config.maxDepth) {
1273
+ return printAsLeaf(name);
1274
+ }
1275
+
1276
+ if (val[IS_KEYED_SENTINEL$1]) {
1277
+ return (
1278
+ name +
1279
+ SPACE +
1280
+ '{' + // from Immutable collection of entries or from ECMAScript object
1281
+ (val._iter || val._object
1282
+ ? (0, _collections$1.printIteratorEntries)(
1283
+ val.entries(),
1284
+ config,
1285
+ indentation,
1286
+ depth,
1287
+ refs,
1288
+ printer
1289
+ )
1290
+ : LAZY) +
1291
+ '}'
1292
+ );
1293
+ }
1294
+
1295
+ return (
1296
+ name +
1297
+ SPACE +
1298
+ '[' +
1299
+ (val._iter || // from Immutable collection of values
1300
+ val._array || // from ECMAScript array
1301
+ val._collection || // from ECMAScript collection in immutable v4
1302
+ val._iterable // from ECMAScript collection in immutable v3
1303
+ ? (0, _collections$1.printIteratorValues)(
1304
+ val.values(),
1305
+ config,
1306
+ indentation,
1307
+ depth,
1308
+ refs,
1309
+ printer
1310
+ )
1311
+ : LAZY) +
1312
+ ']'
1313
+ );
1314
+ };
1315
+
1316
+ const printImmutableValues = (
1317
+ val,
1318
+ config,
1319
+ indentation,
1320
+ depth,
1321
+ refs,
1322
+ printer,
1323
+ type
1324
+ ) =>
1325
+ ++depth > config.maxDepth
1326
+ ? printAsLeaf(getImmutableName(type))
1327
+ : getImmutableName(type) +
1328
+ SPACE +
1329
+ '[' +
1330
+ (0, _collections$1.printIteratorValues)(
1331
+ val.values(),
1332
+ config,
1333
+ indentation,
1334
+ depth,
1335
+ refs,
1336
+ printer
1337
+ ) +
1338
+ ']';
1339
+
1340
+ const serialize$2 = (val, config, indentation, depth, refs, printer) => {
1341
+ if (val[IS_MAP_SENTINEL]) {
1342
+ return printImmutableEntries(
1343
+ val,
1344
+ config,
1345
+ indentation,
1346
+ depth,
1347
+ refs,
1348
+ printer,
1349
+ val[IS_ORDERED_SENTINEL$1] ? 'OrderedMap' : 'Map'
1350
+ );
1351
+ }
1352
+
1353
+ if (val[IS_LIST_SENTINEL]) {
1354
+ return printImmutableValues(
1355
+ val,
1356
+ config,
1357
+ indentation,
1358
+ depth,
1359
+ refs,
1360
+ printer,
1361
+ 'List'
1362
+ );
1363
+ }
1364
+
1365
+ if (val[IS_SET_SENTINEL$1]) {
1366
+ return printImmutableValues(
1367
+ val,
1368
+ config,
1369
+ indentation,
1370
+ depth,
1371
+ refs,
1372
+ printer,
1373
+ val[IS_ORDERED_SENTINEL$1] ? 'OrderedSet' : 'Set'
1374
+ );
1375
+ }
1376
+
1377
+ if (val[IS_STACK_SENTINEL]) {
1378
+ return printImmutableValues(
1379
+ val,
1380
+ config,
1381
+ indentation,
1382
+ depth,
1383
+ refs,
1384
+ printer,
1385
+ 'Stack'
1386
+ );
1387
+ }
1388
+
1389
+ if (val[IS_SEQ_SENTINEL]) {
1390
+ return printImmutableSeq(val, config, indentation, depth, refs, printer);
1391
+ } // For compatibility with immutable v3 and v4, let record be the default.
1392
+
1393
+ return printImmutableRecord(val, config, indentation, depth, refs, printer);
1394
+ }; // Explicitly comparing sentinel properties to true avoids false positive
1395
+ // when mock identity-obj-proxy returns the key as the value for any key.
1396
+
1397
+ Immutable$1.serialize = serialize$2;
1398
+
1399
+ const test$2 = val =>
1400
+ val &&
1401
+ (val[IS_ITERABLE_SENTINEL] === true || val[IS_RECORD_SENTINEL] === true);
1402
+
1403
+ Immutable$1.test = test$2;
1404
+ const plugin$2 = {
1405
+ serialize: serialize$2,
1406
+ test: test$2
1407
+ };
1408
+ var _default$3 = plugin$2;
1409
+ Immutable$1.default = _default$3;
1410
+
1411
+ var ReactElement$1 = {};
1412
+
1413
+ var reactIs = {exports: {}};
1414
+
1415
+ var reactIs_production_min = {};
1416
+
1417
+ /** @license React v17.0.2
1418
+ * react-is.production.min.js
1419
+ *
1420
+ * Copyright (c) Facebook, Inc. and its affiliates.
1421
+ *
1422
+ * This source code is licensed under the MIT license found in the
1423
+ * LICENSE file in the root directory of this source tree.
1424
+ */
1425
+ var b=60103,c=60106,d=60107,e=60108,f=60114,g=60109,h=60110,k=60112,l=60113,m=60120,n=60115,p=60116,q=60121,r=60122,u=60117,v=60129,w=60131;
1426
+ if("function"===typeof Symbol&&Symbol.for){var x=Symbol.for;b=x("react.element");c=x("react.portal");d=x("react.fragment");e=x("react.strict_mode");f=x("react.profiler");g=x("react.provider");h=x("react.context");k=x("react.forward_ref");l=x("react.suspense");m=x("react.suspense_list");n=x("react.memo");p=x("react.lazy");q=x("react.block");r=x("react.server.block");u=x("react.fundamental");v=x("react.debug_trace_mode");w=x("react.legacy_hidden");}
1427
+ function y(a){if("object"===typeof a&&null!==a){var t=a.$$typeof;switch(t){case b:switch(a=a.type,a){case d:case f:case e:case l:case m:return a;default:switch(a=a&&a.$$typeof,a){case h:case k:case p:case n:case g:return a;default:return t}}case c:return t}}}var z=g,A=b,B=k,C=d,D=p,E=n,F=c,G=f,H=e,I=l;reactIs_production_min.ContextConsumer=h;reactIs_production_min.ContextProvider=z;reactIs_production_min.Element=A;reactIs_production_min.ForwardRef=B;reactIs_production_min.Fragment=C;reactIs_production_min.Lazy=D;reactIs_production_min.Memo=E;reactIs_production_min.Portal=F;reactIs_production_min.Profiler=G;reactIs_production_min.StrictMode=H;
1428
+ reactIs_production_min.Suspense=I;reactIs_production_min.isAsyncMode=function(){return !1};reactIs_production_min.isConcurrentMode=function(){return !1};reactIs_production_min.isContextConsumer=function(a){return y(a)===h};reactIs_production_min.isContextProvider=function(a){return y(a)===g};reactIs_production_min.isElement=function(a){return "object"===typeof a&&null!==a&&a.$$typeof===b};reactIs_production_min.isForwardRef=function(a){return y(a)===k};reactIs_production_min.isFragment=function(a){return y(a)===d};reactIs_production_min.isLazy=function(a){return y(a)===p};reactIs_production_min.isMemo=function(a){return y(a)===n};
1429
+ reactIs_production_min.isPortal=function(a){return y(a)===c};reactIs_production_min.isProfiler=function(a){return y(a)===f};reactIs_production_min.isStrictMode=function(a){return y(a)===e};reactIs_production_min.isSuspense=function(a){return y(a)===l};reactIs_production_min.isValidElementType=function(a){return "string"===typeof a||"function"===typeof a||a===d||a===f||a===v||a===e||a===l||a===m||a===w||"object"===typeof a&&null!==a&&(a.$$typeof===p||a.$$typeof===n||a.$$typeof===g||a.$$typeof===h||a.$$typeof===k||a.$$typeof===u||a.$$typeof===q||a[0]===r)?!0:!1};
1430
+ reactIs_production_min.typeOf=y;
1431
+
1432
+ var reactIs_development = {};
1433
+
1434
+ /** @license React v17.0.2
1435
+ * react-is.development.js
1436
+ *
1437
+ * Copyright (c) Facebook, Inc. and its affiliates.
1438
+ *
1439
+ * This source code is licensed under the MIT license found in the
1440
+ * LICENSE file in the root directory of this source tree.
1441
+ */
1442
+
1443
+ if (process.env.NODE_ENV !== "production") {
1444
+ (function() {
1445
+
1446
+ // ATTENTION
1447
+ // When adding new symbols to this file,
1448
+ // Please consider also adding to 'react-devtools-shared/src/backend/ReactSymbols'
1449
+ // The Symbol used to tag the ReactElement-like types. If there is no native Symbol
1450
+ // nor polyfill, then a plain number is used for performance.
1451
+ var REACT_ELEMENT_TYPE = 0xeac7;
1452
+ var REACT_PORTAL_TYPE = 0xeaca;
1453
+ var REACT_FRAGMENT_TYPE = 0xeacb;
1454
+ var REACT_STRICT_MODE_TYPE = 0xeacc;
1455
+ var REACT_PROFILER_TYPE = 0xead2;
1456
+ var REACT_PROVIDER_TYPE = 0xeacd;
1457
+ var REACT_CONTEXT_TYPE = 0xeace;
1458
+ var REACT_FORWARD_REF_TYPE = 0xead0;
1459
+ var REACT_SUSPENSE_TYPE = 0xead1;
1460
+ var REACT_SUSPENSE_LIST_TYPE = 0xead8;
1461
+ var REACT_MEMO_TYPE = 0xead3;
1462
+ var REACT_LAZY_TYPE = 0xead4;
1463
+ var REACT_BLOCK_TYPE = 0xead9;
1464
+ var REACT_SERVER_BLOCK_TYPE = 0xeada;
1465
+ var REACT_FUNDAMENTAL_TYPE = 0xead5;
1466
+ var REACT_DEBUG_TRACING_MODE_TYPE = 0xeae1;
1467
+ var REACT_LEGACY_HIDDEN_TYPE = 0xeae3;
1468
+
1469
+ if (typeof Symbol === 'function' && Symbol.for) {
1470
+ var symbolFor = Symbol.for;
1471
+ REACT_ELEMENT_TYPE = symbolFor('react.element');
1472
+ REACT_PORTAL_TYPE = symbolFor('react.portal');
1473
+ REACT_FRAGMENT_TYPE = symbolFor('react.fragment');
1474
+ REACT_STRICT_MODE_TYPE = symbolFor('react.strict_mode');
1475
+ REACT_PROFILER_TYPE = symbolFor('react.profiler');
1476
+ REACT_PROVIDER_TYPE = symbolFor('react.provider');
1477
+ REACT_CONTEXT_TYPE = symbolFor('react.context');
1478
+ REACT_FORWARD_REF_TYPE = symbolFor('react.forward_ref');
1479
+ REACT_SUSPENSE_TYPE = symbolFor('react.suspense');
1480
+ REACT_SUSPENSE_LIST_TYPE = symbolFor('react.suspense_list');
1481
+ REACT_MEMO_TYPE = symbolFor('react.memo');
1482
+ REACT_LAZY_TYPE = symbolFor('react.lazy');
1483
+ REACT_BLOCK_TYPE = symbolFor('react.block');
1484
+ REACT_SERVER_BLOCK_TYPE = symbolFor('react.server.block');
1485
+ REACT_FUNDAMENTAL_TYPE = symbolFor('react.fundamental');
1486
+ symbolFor('react.scope');
1487
+ symbolFor('react.opaque.id');
1488
+ REACT_DEBUG_TRACING_MODE_TYPE = symbolFor('react.debug_trace_mode');
1489
+ symbolFor('react.offscreen');
1490
+ REACT_LEGACY_HIDDEN_TYPE = symbolFor('react.legacy_hidden');
1491
+ }
1492
+
1493
+ // Filter certain DOM attributes (e.g. src, href) if their values are empty strings.
1494
+
1495
+ var enableScopeAPI = false; // Experimental Create Event Handle API.
1496
+
1497
+ function isValidElementType(type) {
1498
+ if (typeof type === 'string' || typeof type === 'function') {
1499
+ return true;
1500
+ } // Note: typeof might be other than 'symbol' or 'number' (e.g. if it's a polyfill).
1501
+
1502
+
1503
+ if (type === REACT_FRAGMENT_TYPE || type === REACT_PROFILER_TYPE || type === REACT_DEBUG_TRACING_MODE_TYPE || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || type === REACT_LEGACY_HIDDEN_TYPE || enableScopeAPI ) {
1504
+ return true;
1505
+ }
1506
+
1507
+ if (typeof type === 'object' && type !== null) {
1508
+ if (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_FUNDAMENTAL_TYPE || type.$$typeof === REACT_BLOCK_TYPE || type[0] === REACT_SERVER_BLOCK_TYPE) {
1509
+ return true;
1510
+ }
1511
+ }
1512
+
1513
+ return false;
1514
+ }
1515
+
1516
+ function typeOf(object) {
1517
+ if (typeof object === 'object' && object !== null) {
1518
+ var $$typeof = object.$$typeof;
1519
+
1520
+ switch ($$typeof) {
1521
+ case REACT_ELEMENT_TYPE:
1522
+ var type = object.type;
1523
+
1524
+ switch (type) {
1525
+ case REACT_FRAGMENT_TYPE:
1526
+ case REACT_PROFILER_TYPE:
1527
+ case REACT_STRICT_MODE_TYPE:
1528
+ case REACT_SUSPENSE_TYPE:
1529
+ case REACT_SUSPENSE_LIST_TYPE:
1530
+ return type;
1531
+
1532
+ default:
1533
+ var $$typeofType = type && type.$$typeof;
1534
+
1535
+ switch ($$typeofType) {
1536
+ case REACT_CONTEXT_TYPE:
1537
+ case REACT_FORWARD_REF_TYPE:
1538
+ case REACT_LAZY_TYPE:
1539
+ case REACT_MEMO_TYPE:
1540
+ case REACT_PROVIDER_TYPE:
1541
+ return $$typeofType;
1542
+
1543
+ default:
1544
+ return $$typeof;
1545
+ }
1546
+
1547
+ }
1548
+
1549
+ case REACT_PORTAL_TYPE:
1550
+ return $$typeof;
1551
+ }
1552
+ }
1553
+
1554
+ return undefined;
1555
+ }
1556
+ var ContextConsumer = REACT_CONTEXT_TYPE;
1557
+ var ContextProvider = REACT_PROVIDER_TYPE;
1558
+ var Element = REACT_ELEMENT_TYPE;
1559
+ var ForwardRef = REACT_FORWARD_REF_TYPE;
1560
+ var Fragment = REACT_FRAGMENT_TYPE;
1561
+ var Lazy = REACT_LAZY_TYPE;
1562
+ var Memo = REACT_MEMO_TYPE;
1563
+ var Portal = REACT_PORTAL_TYPE;
1564
+ var Profiler = REACT_PROFILER_TYPE;
1565
+ var StrictMode = REACT_STRICT_MODE_TYPE;
1566
+ var Suspense = REACT_SUSPENSE_TYPE;
1567
+ var hasWarnedAboutDeprecatedIsAsyncMode = false;
1568
+ var hasWarnedAboutDeprecatedIsConcurrentMode = false; // AsyncMode should be deprecated
1569
+
1570
+ function isAsyncMode(object) {
1571
+ {
1572
+ if (!hasWarnedAboutDeprecatedIsAsyncMode) {
1573
+ hasWarnedAboutDeprecatedIsAsyncMode = true; // Using console['warn'] to evade Babel and ESLint
1574
+
1575
+ console['warn']('The ReactIs.isAsyncMode() alias has been deprecated, ' + 'and will be removed in React 18+.');
1576
+ }
1577
+ }
1578
+
1579
+ return false;
1580
+ }
1581
+ function isConcurrentMode(object) {
1582
+ {
1583
+ if (!hasWarnedAboutDeprecatedIsConcurrentMode) {
1584
+ hasWarnedAboutDeprecatedIsConcurrentMode = true; // Using console['warn'] to evade Babel and ESLint
1585
+
1586
+ console['warn']('The ReactIs.isConcurrentMode() alias has been deprecated, ' + 'and will be removed in React 18+.');
1587
+ }
1588
+ }
1589
+
1590
+ return false;
1591
+ }
1592
+ function isContextConsumer(object) {
1593
+ return typeOf(object) === REACT_CONTEXT_TYPE;
1594
+ }
1595
+ function isContextProvider(object) {
1596
+ return typeOf(object) === REACT_PROVIDER_TYPE;
1597
+ }
1598
+ function isElement(object) {
1599
+ return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;
1600
+ }
1601
+ function isForwardRef(object) {
1602
+ return typeOf(object) === REACT_FORWARD_REF_TYPE;
1603
+ }
1604
+ function isFragment(object) {
1605
+ return typeOf(object) === REACT_FRAGMENT_TYPE;
1606
+ }
1607
+ function isLazy(object) {
1608
+ return typeOf(object) === REACT_LAZY_TYPE;
1609
+ }
1610
+ function isMemo(object) {
1611
+ return typeOf(object) === REACT_MEMO_TYPE;
1612
+ }
1613
+ function isPortal(object) {
1614
+ return typeOf(object) === REACT_PORTAL_TYPE;
1615
+ }
1616
+ function isProfiler(object) {
1617
+ return typeOf(object) === REACT_PROFILER_TYPE;
1618
+ }
1619
+ function isStrictMode(object) {
1620
+ return typeOf(object) === REACT_STRICT_MODE_TYPE;
1621
+ }
1622
+ function isSuspense(object) {
1623
+ return typeOf(object) === REACT_SUSPENSE_TYPE;
1624
+ }
1625
+
1626
+ reactIs_development.ContextConsumer = ContextConsumer;
1627
+ reactIs_development.ContextProvider = ContextProvider;
1628
+ reactIs_development.Element = Element;
1629
+ reactIs_development.ForwardRef = ForwardRef;
1630
+ reactIs_development.Fragment = Fragment;
1631
+ reactIs_development.Lazy = Lazy;
1632
+ reactIs_development.Memo = Memo;
1633
+ reactIs_development.Portal = Portal;
1634
+ reactIs_development.Profiler = Profiler;
1635
+ reactIs_development.StrictMode = StrictMode;
1636
+ reactIs_development.Suspense = Suspense;
1637
+ reactIs_development.isAsyncMode = isAsyncMode;
1638
+ reactIs_development.isConcurrentMode = isConcurrentMode;
1639
+ reactIs_development.isContextConsumer = isContextConsumer;
1640
+ reactIs_development.isContextProvider = isContextProvider;
1641
+ reactIs_development.isElement = isElement;
1642
+ reactIs_development.isForwardRef = isForwardRef;
1643
+ reactIs_development.isFragment = isFragment;
1644
+ reactIs_development.isLazy = isLazy;
1645
+ reactIs_development.isMemo = isMemo;
1646
+ reactIs_development.isPortal = isPortal;
1647
+ reactIs_development.isProfiler = isProfiler;
1648
+ reactIs_development.isStrictMode = isStrictMode;
1649
+ reactIs_development.isSuspense = isSuspense;
1650
+ reactIs_development.isValidElementType = isValidElementType;
1651
+ reactIs_development.typeOf = typeOf;
1652
+ })();
1653
+ }
1654
+
1655
+ if (process.env.NODE_ENV === 'production') {
1656
+ reactIs.exports = reactIs_production_min;
1657
+ } else {
1658
+ reactIs.exports = reactIs_development;
1659
+ }
1660
+
1661
+ Object.defineProperty(ReactElement$1, '__esModule', {
1662
+ value: true
1663
+ });
1664
+ ReactElement$1.test = ReactElement$1.serialize = ReactElement$1.default = void 0;
1665
+
1666
+ var ReactIs = _interopRequireWildcard(reactIs.exports);
1667
+
1668
+ var _markup$1 = markup;
1669
+
1670
+ function _getRequireWildcardCache(nodeInterop) {
1671
+ if (typeof WeakMap !== 'function') return null;
1672
+ var cacheBabelInterop = new WeakMap();
1673
+ var cacheNodeInterop = new WeakMap();
1674
+ return (_getRequireWildcardCache = function (nodeInterop) {
1675
+ return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
1676
+ })(nodeInterop);
1677
+ }
1678
+
1679
+ function _interopRequireWildcard(obj, nodeInterop) {
1680
+ if (!nodeInterop && obj && obj.__esModule) {
1681
+ return obj;
1682
+ }
1683
+ if (obj === null || (typeof obj !== 'object' && typeof obj !== 'function')) {
1684
+ return {default: obj};
1685
+ }
1686
+ var cache = _getRequireWildcardCache(nodeInterop);
1687
+ if (cache && cache.has(obj)) {
1688
+ return cache.get(obj);
1689
+ }
1690
+ var newObj = {};
1691
+ var hasPropertyDescriptor =
1692
+ Object.defineProperty && Object.getOwnPropertyDescriptor;
1693
+ for (var key in obj) {
1694
+ if (key !== 'default' && Object.prototype.hasOwnProperty.call(obj, key)) {
1695
+ var desc = hasPropertyDescriptor
1696
+ ? Object.getOwnPropertyDescriptor(obj, key)
1697
+ : null;
1698
+ if (desc && (desc.get || desc.set)) {
1699
+ Object.defineProperty(newObj, key, desc);
1700
+ } else {
1701
+ newObj[key] = obj[key];
1702
+ }
1703
+ }
1704
+ }
1705
+ newObj.default = obj;
1706
+ if (cache) {
1707
+ cache.set(obj, newObj);
1708
+ }
1709
+ return newObj;
1710
+ }
1711
+
1712
+ /**
1713
+ * Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
1714
+ *
1715
+ * This source code is licensed under the MIT license found in the
1716
+ * LICENSE file in the root directory of this source tree.
1717
+ */
1718
+ // Given element.props.children, or subtree during recursive traversal,
1719
+ // return flattened array of children.
1720
+ const getChildren = (arg, children = []) => {
1721
+ if (Array.isArray(arg)) {
1722
+ arg.forEach(item => {
1723
+ getChildren(item, children);
1724
+ });
1725
+ } else if (arg != null && arg !== false) {
1726
+ children.push(arg);
1727
+ }
1728
+
1729
+ return children;
1730
+ };
1731
+
1732
+ const getType = element => {
1733
+ const type = element.type;
1734
+
1735
+ if (typeof type === 'string') {
1736
+ return type;
1737
+ }
1738
+
1739
+ if (typeof type === 'function') {
1740
+ return type.displayName || type.name || 'Unknown';
1741
+ }
1742
+
1743
+ if (ReactIs.isFragment(element)) {
1744
+ return 'React.Fragment';
1745
+ }
1746
+
1747
+ if (ReactIs.isSuspense(element)) {
1748
+ return 'React.Suspense';
1749
+ }
1750
+
1751
+ if (typeof type === 'object' && type !== null) {
1752
+ if (ReactIs.isContextProvider(element)) {
1753
+ return 'Context.Provider';
1754
+ }
1755
+
1756
+ if (ReactIs.isContextConsumer(element)) {
1757
+ return 'Context.Consumer';
1758
+ }
1759
+
1760
+ if (ReactIs.isForwardRef(element)) {
1761
+ if (type.displayName) {
1762
+ return type.displayName;
1763
+ }
1764
+
1765
+ const functionName = type.render.displayName || type.render.name || '';
1766
+ return functionName !== ''
1767
+ ? 'ForwardRef(' + functionName + ')'
1768
+ : 'ForwardRef';
1769
+ }
1770
+
1771
+ if (ReactIs.isMemo(element)) {
1772
+ const functionName =
1773
+ type.displayName || type.type.displayName || type.type.name || '';
1774
+ return functionName !== '' ? 'Memo(' + functionName + ')' : 'Memo';
1775
+ }
1776
+ }
1777
+
1778
+ return 'UNDEFINED';
1779
+ };
1780
+
1781
+ const getPropKeys$1 = element => {
1782
+ const {props} = element;
1783
+ return Object.keys(props)
1784
+ .filter(key => key !== 'children' && props[key] !== undefined)
1785
+ .sort();
1786
+ };
1787
+
1788
+ const serialize$1 = (element, config, indentation, depth, refs, printer) =>
1789
+ ++depth > config.maxDepth
1790
+ ? (0, _markup$1.printElementAsLeaf)(getType(element), config)
1791
+ : (0, _markup$1.printElement)(
1792
+ getType(element),
1793
+ (0, _markup$1.printProps)(
1794
+ getPropKeys$1(element),
1795
+ element.props,
1796
+ config,
1797
+ indentation + config.indent,
1798
+ depth,
1799
+ refs,
1800
+ printer
1801
+ ),
1802
+ (0, _markup$1.printChildren)(
1803
+ getChildren(element.props.children),
1804
+ config,
1805
+ indentation + config.indent,
1806
+ depth,
1807
+ refs,
1808
+ printer
1809
+ ),
1810
+ config,
1811
+ indentation
1812
+ );
1813
+
1814
+ ReactElement$1.serialize = serialize$1;
1815
+
1816
+ const test$1 = val => val != null && ReactIs.isElement(val);
1817
+
1818
+ ReactElement$1.test = test$1;
1819
+ const plugin$1 = {
1820
+ serialize: serialize$1,
1821
+ test: test$1
1822
+ };
1823
+ var _default$2 = plugin$1;
1824
+ ReactElement$1.default = _default$2;
1825
+
1826
+ var ReactTestComponent$1 = {};
1827
+
1828
+ Object.defineProperty(ReactTestComponent$1, '__esModule', {
1829
+ value: true
1830
+ });
1831
+ ReactTestComponent$1.test = ReactTestComponent$1.serialize = ReactTestComponent$1.default = void 0;
1832
+
1833
+ var _markup = markup;
1834
+
1835
+ var global$1 = (function () {
1836
+ if (typeof globalThis !== 'undefined') {
1837
+ return globalThis;
1838
+ } else if (typeof global$1 !== 'undefined') {
1839
+ return global$1;
1840
+ } else if (typeof self !== 'undefined') {
1841
+ return self;
1842
+ } else if (typeof window !== 'undefined') {
1843
+ return window;
1844
+ } else {
1845
+ return Function('return this')();
1846
+ }
1847
+ })();
1848
+
1849
+ var Symbol$1 = global$1['jest-symbol-do-not-touch'] || global$1.Symbol;
1850
+ const testSymbol =
1851
+ typeof Symbol$1 === 'function' && Symbol$1.for
1852
+ ? Symbol$1.for('react.test.json')
1853
+ : 0xea71357;
1854
+
1855
+ const getPropKeys = object => {
1856
+ const {props} = object;
1857
+ return props
1858
+ ? Object.keys(props)
1859
+ .filter(key => props[key] !== undefined)
1860
+ .sort()
1861
+ : [];
1862
+ };
1863
+
1864
+ const serialize = (object, config, indentation, depth, refs, printer) =>
1865
+ ++depth > config.maxDepth
1866
+ ? (0, _markup.printElementAsLeaf)(object.type, config)
1867
+ : (0, _markup.printElement)(
1868
+ object.type,
1869
+ object.props
1870
+ ? (0, _markup.printProps)(
1871
+ getPropKeys(object),
1872
+ object.props,
1873
+ config,
1874
+ indentation + config.indent,
1875
+ depth,
1876
+ refs,
1877
+ printer
1878
+ )
1879
+ : '',
1880
+ object.children
1881
+ ? (0, _markup.printChildren)(
1882
+ object.children,
1883
+ config,
1884
+ indentation + config.indent,
1885
+ depth,
1886
+ refs,
1887
+ printer
1888
+ )
1889
+ : '',
1890
+ config,
1891
+ indentation
1892
+ );
1893
+
1894
+ ReactTestComponent$1.serialize = serialize;
1895
+
1896
+ const test = val => val && val.$$typeof === testSymbol;
1897
+
1898
+ ReactTestComponent$1.test = test;
1899
+ const plugin = {
1900
+ serialize,
1901
+ test
1902
+ };
1903
+ var _default$1 = plugin;
1904
+ ReactTestComponent$1.default = _default$1;
1905
+
1906
+ Object.defineProperty(build, '__esModule', {
1907
+ value: true
1908
+ });
1909
+ build.default = build.DEFAULT_OPTIONS = void 0;
1910
+ var format_1 = build.format = format;
1911
+ var plugins_1 = build.plugins = void 0;
1912
+
1913
+ var _ansiStyles = _interopRequireDefault(ansiStyles.exports);
1914
+
1915
+ var _collections = collections;
1916
+
1917
+ var _AsymmetricMatcher = _interopRequireDefault(
1918
+ AsymmetricMatcher$1
1919
+ );
1920
+
1921
+ var _ConvertAnsi = _interopRequireDefault(ConvertAnsi);
1922
+
1923
+ var _DOMCollection = _interopRequireDefault(DOMCollection$1);
1924
+
1925
+ var _DOMElement = _interopRequireDefault(DOMElement$1);
1926
+
1927
+ var _Immutable = _interopRequireDefault(Immutable$1);
1928
+
1929
+ var _ReactElement = _interopRequireDefault(ReactElement$1);
1930
+
1931
+ var _ReactTestComponent = _interopRequireDefault(
1932
+ ReactTestComponent$1
1933
+ );
1934
+
1935
+ function _interopRequireDefault(obj) {
1936
+ return obj && obj.__esModule ? obj : {default: obj};
1937
+ }
1938
+
1939
+ /**
1940
+ * Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
1941
+ *
1942
+ * This source code is licensed under the MIT license found in the
1943
+ * LICENSE file in the root directory of this source tree.
1944
+ */
1945
+
1946
+ /* eslint-disable local/ban-types-eventually */
1947
+ const toString = Object.prototype.toString;
1948
+ const toISOString = Date.prototype.toISOString;
1949
+ const errorToString = Error.prototype.toString;
1950
+ const regExpToString = RegExp.prototype.toString;
1951
+ /**
1952
+ * Explicitly comparing typeof constructor to function avoids undefined as name
1953
+ * when mock identity-obj-proxy returns the key as the value for any key.
1954
+ */
1955
+
1956
+ const getConstructorName = val =>
1957
+ (typeof val.constructor === 'function' && val.constructor.name) || 'Object';
1958
+ /* global window */
1959
+
1960
+ /** Is val is equal to global window object? Works even if it does not exist :) */
1961
+
1962
+ const isWindow = val => typeof window !== 'undefined' && val === window;
1963
+
1964
+ const SYMBOL_REGEXP = /^Symbol\((.*)\)(.*)$/;
1965
+ const NEWLINE_REGEXP = /\n/gi;
1966
+
1967
+ class PrettyFormatPluginError extends Error {
1968
+ constructor(message, stack) {
1969
+ super(message);
1970
+ this.stack = stack;
1971
+ this.name = this.constructor.name;
1972
+ }
1973
+ }
1974
+
1975
+ function isToStringedArrayType(toStringed) {
1976
+ return (
1977
+ toStringed === '[object Array]' ||
1978
+ toStringed === '[object ArrayBuffer]' ||
1979
+ toStringed === '[object DataView]' ||
1980
+ toStringed === '[object Float32Array]' ||
1981
+ toStringed === '[object Float64Array]' ||
1982
+ toStringed === '[object Int8Array]' ||
1983
+ toStringed === '[object Int16Array]' ||
1984
+ toStringed === '[object Int32Array]' ||
1985
+ toStringed === '[object Uint8Array]' ||
1986
+ toStringed === '[object Uint8ClampedArray]' ||
1987
+ toStringed === '[object Uint16Array]' ||
1988
+ toStringed === '[object Uint32Array]'
1989
+ );
1990
+ }
1991
+
1992
+ function printNumber(val) {
1993
+ return Object.is(val, -0) ? '-0' : String(val);
1994
+ }
1995
+
1996
+ function printBigInt(val) {
1997
+ return String(`${val}n`);
1998
+ }
1999
+
2000
+ function printFunction(val, printFunctionName) {
2001
+ if (!printFunctionName) {
2002
+ return '[Function]';
2003
+ }
2004
+
2005
+ return '[Function ' + (val.name || 'anonymous') + ']';
2006
+ }
2007
+
2008
+ function printSymbol(val) {
2009
+ return String(val).replace(SYMBOL_REGEXP, 'Symbol($1)');
2010
+ }
2011
+
2012
+ function printError(val) {
2013
+ return '[' + errorToString.call(val) + ']';
2014
+ }
2015
+ /**
2016
+ * The first port of call for printing an object, handles most of the
2017
+ * data-types in JS.
2018
+ */
2019
+
2020
+ function printBasicValue(val, printFunctionName, escapeRegex, escapeString) {
2021
+ if (val === true || val === false) {
2022
+ return '' + val;
2023
+ }
2024
+
2025
+ if (val === undefined) {
2026
+ return 'undefined';
2027
+ }
2028
+
2029
+ if (val === null) {
2030
+ return 'null';
2031
+ }
2032
+
2033
+ const typeOf = typeof val;
2034
+
2035
+ if (typeOf === 'number') {
2036
+ return printNumber(val);
2037
+ }
2038
+
2039
+ if (typeOf === 'bigint') {
2040
+ return printBigInt(val);
2041
+ }
2042
+
2043
+ if (typeOf === 'string') {
2044
+ if (escapeString) {
2045
+ return '"' + val.replace(/"|\\/g, '\\$&') + '"';
2046
+ }
2047
+
2048
+ return '"' + val + '"';
2049
+ }
2050
+
2051
+ if (typeOf === 'function') {
2052
+ return printFunction(val, printFunctionName);
2053
+ }
2054
+
2055
+ if (typeOf === 'symbol') {
2056
+ return printSymbol(val);
2057
+ }
2058
+
2059
+ const toStringed = toString.call(val);
2060
+
2061
+ if (toStringed === '[object WeakMap]') {
2062
+ return 'WeakMap {}';
2063
+ }
2064
+
2065
+ if (toStringed === '[object WeakSet]') {
2066
+ return 'WeakSet {}';
2067
+ }
2068
+
2069
+ if (
2070
+ toStringed === '[object Function]' ||
2071
+ toStringed === '[object GeneratorFunction]'
2072
+ ) {
2073
+ return printFunction(val, printFunctionName);
2074
+ }
2075
+
2076
+ if (toStringed === '[object Symbol]') {
2077
+ return printSymbol(val);
2078
+ }
2079
+
2080
+ if (toStringed === '[object Date]') {
2081
+ return isNaN(+val) ? 'Date { NaN }' : toISOString.call(val);
2082
+ }
2083
+
2084
+ if (toStringed === '[object Error]') {
2085
+ return printError(val);
2086
+ }
2087
+
2088
+ if (toStringed === '[object RegExp]') {
2089
+ if (escapeRegex) {
2090
+ // https://github.com/benjamingr/RegExp.escape/blob/main/polyfill.js
2091
+ return regExpToString.call(val).replace(/[\\^$*+?.()|[\]{}]/g, '\\$&');
2092
+ }
2093
+
2094
+ return regExpToString.call(val);
2095
+ }
2096
+
2097
+ if (val instanceof Error) {
2098
+ return printError(val);
2099
+ }
2100
+
2101
+ return null;
2102
+ }
2103
+ /**
2104
+ * Handles more complex objects ( such as objects with circular references.
2105
+ * maps and sets etc )
2106
+ */
2107
+
2108
+ function printComplexValue(
2109
+ val,
2110
+ config,
2111
+ indentation,
2112
+ depth,
2113
+ refs,
2114
+ hasCalledToJSON
2115
+ ) {
2116
+ if (refs.indexOf(val) !== -1) {
2117
+ return '[Circular]';
2118
+ }
2119
+
2120
+ refs = refs.slice();
2121
+ refs.push(val);
2122
+ const hitMaxDepth = ++depth > config.maxDepth;
2123
+ const min = config.min;
2124
+
2125
+ if (
2126
+ config.callToJSON &&
2127
+ !hitMaxDepth &&
2128
+ val.toJSON &&
2129
+ typeof val.toJSON === 'function' &&
2130
+ !hasCalledToJSON
2131
+ ) {
2132
+ return printer(val.toJSON(), config, indentation, depth, refs, true);
2133
+ }
2134
+
2135
+ const toStringed = toString.call(val);
2136
+
2137
+ if (toStringed === '[object Arguments]') {
2138
+ return hitMaxDepth
2139
+ ? '[Arguments]'
2140
+ : (min ? '' : 'Arguments ') +
2141
+ '[' +
2142
+ (0, _collections.printListItems)(
2143
+ val,
2144
+ config,
2145
+ indentation,
2146
+ depth,
2147
+ refs,
2148
+ printer
2149
+ ) +
2150
+ ']';
2151
+ }
2152
+
2153
+ if (isToStringedArrayType(toStringed)) {
2154
+ return hitMaxDepth
2155
+ ? '[' + val.constructor.name + ']'
2156
+ : (min
2157
+ ? ''
2158
+ : !config.printBasicPrototype && val.constructor.name === 'Array'
2159
+ ? ''
2160
+ : val.constructor.name + ' ') +
2161
+ '[' +
2162
+ (0, _collections.printListItems)(
2163
+ val,
2164
+ config,
2165
+ indentation,
2166
+ depth,
2167
+ refs,
2168
+ printer
2169
+ ) +
2170
+ ']';
2171
+ }
2172
+
2173
+ if (toStringed === '[object Map]') {
2174
+ return hitMaxDepth
2175
+ ? '[Map]'
2176
+ : 'Map {' +
2177
+ (0, _collections.printIteratorEntries)(
2178
+ val.entries(),
2179
+ config,
2180
+ indentation,
2181
+ depth,
2182
+ refs,
2183
+ printer,
2184
+ ' => '
2185
+ ) +
2186
+ '}';
2187
+ }
2188
+
2189
+ if (toStringed === '[object Set]') {
2190
+ return hitMaxDepth
2191
+ ? '[Set]'
2192
+ : 'Set {' +
2193
+ (0, _collections.printIteratorValues)(
2194
+ val.values(),
2195
+ config,
2196
+ indentation,
2197
+ depth,
2198
+ refs,
2199
+ printer
2200
+ ) +
2201
+ '}';
2202
+ } // Avoid failure to serialize global window object in jsdom test environment.
2203
+ // For example, not even relevant if window is prop of React element.
2204
+
2205
+ return hitMaxDepth || isWindow(val)
2206
+ ? '[' + getConstructorName(val) + ']'
2207
+ : (min
2208
+ ? ''
2209
+ : !config.printBasicPrototype && getConstructorName(val) === 'Object'
2210
+ ? ''
2211
+ : getConstructorName(val) + ' ') +
2212
+ '{' +
2213
+ (0, _collections.printObjectProperties)(
2214
+ val,
2215
+ config,
2216
+ indentation,
2217
+ depth,
2218
+ refs,
2219
+ printer
2220
+ ) +
2221
+ '}';
2222
+ }
2223
+
2224
+ function isNewPlugin(plugin) {
2225
+ return plugin.serialize != null;
2226
+ }
2227
+
2228
+ function printPlugin(plugin, val, config, indentation, depth, refs) {
2229
+ let printed;
2230
+
2231
+ try {
2232
+ printed = isNewPlugin(plugin)
2233
+ ? plugin.serialize(val, config, indentation, depth, refs, printer)
2234
+ : plugin.print(
2235
+ val,
2236
+ valChild => printer(valChild, config, indentation, depth, refs),
2237
+ str => {
2238
+ const indentationNext = indentation + config.indent;
2239
+ return (
2240
+ indentationNext +
2241
+ str.replace(NEWLINE_REGEXP, '\n' + indentationNext)
2242
+ );
2243
+ },
2244
+ {
2245
+ edgeSpacing: config.spacingOuter,
2246
+ min: config.min,
2247
+ spacing: config.spacingInner
2248
+ },
2249
+ config.colors
2250
+ );
2251
+ } catch (error) {
2252
+ throw new PrettyFormatPluginError(error.message, error.stack);
2253
+ }
2254
+
2255
+ if (typeof printed !== 'string') {
2256
+ throw new Error(
2257
+ `pretty-format: Plugin must return type "string" but instead returned "${typeof printed}".`
2258
+ );
2259
+ }
2260
+
2261
+ return printed;
2262
+ }
2263
+
2264
+ function findPlugin(plugins, val) {
2265
+ for (let p = 0; p < plugins.length; p++) {
2266
+ try {
2267
+ if (plugins[p].test(val)) {
2268
+ return plugins[p];
2269
+ }
2270
+ } catch (error) {
2271
+ throw new PrettyFormatPluginError(error.message, error.stack);
2272
+ }
2273
+ }
2274
+
2275
+ return null;
2276
+ }
2277
+
2278
+ function printer(val, config, indentation, depth, refs, hasCalledToJSON) {
2279
+ const plugin = findPlugin(config.plugins, val);
2280
+
2281
+ if (plugin !== null) {
2282
+ return printPlugin(plugin, val, config, indentation, depth, refs);
2283
+ }
2284
+
2285
+ const basicResult = printBasicValue(
2286
+ val,
2287
+ config.printFunctionName,
2288
+ config.escapeRegex,
2289
+ config.escapeString
2290
+ );
2291
+
2292
+ if (basicResult !== null) {
2293
+ return basicResult;
2294
+ }
2295
+
2296
+ return printComplexValue(
2297
+ val,
2298
+ config,
2299
+ indentation,
2300
+ depth,
2301
+ refs,
2302
+ hasCalledToJSON
2303
+ );
2304
+ }
2305
+
2306
+ const DEFAULT_THEME = {
2307
+ comment: 'gray',
2308
+ content: 'reset',
2309
+ prop: 'yellow',
2310
+ tag: 'cyan',
2311
+ value: 'green'
2312
+ };
2313
+ const DEFAULT_THEME_KEYS = Object.keys(DEFAULT_THEME);
2314
+ const DEFAULT_OPTIONS = {
2315
+ callToJSON: true,
2316
+ compareKeys: undefined,
2317
+ escapeRegex: false,
2318
+ escapeString: true,
2319
+ highlight: false,
2320
+ indent: 2,
2321
+ maxDepth: Infinity,
2322
+ min: false,
2323
+ plugins: [],
2324
+ printBasicPrototype: true,
2325
+ printFunctionName: true,
2326
+ theme: DEFAULT_THEME
2327
+ };
2328
+ build.DEFAULT_OPTIONS = DEFAULT_OPTIONS;
2329
+
2330
+ function validateOptions(options) {
2331
+ Object.keys(options).forEach(key => {
2332
+ if (!DEFAULT_OPTIONS.hasOwnProperty(key)) {
2333
+ throw new Error(`pretty-format: Unknown option "${key}".`);
2334
+ }
2335
+ });
2336
+
2337
+ if (options.min && options.indent !== undefined && options.indent !== 0) {
2338
+ throw new Error(
2339
+ 'pretty-format: Options "min" and "indent" cannot be used together.'
2340
+ );
2341
+ }
2342
+
2343
+ if (options.theme !== undefined) {
2344
+ if (options.theme === null) {
2345
+ throw new Error(`pretty-format: Option "theme" must not be null.`);
2346
+ }
2347
+
2348
+ if (typeof options.theme !== 'object') {
2349
+ throw new Error(
2350
+ `pretty-format: Option "theme" must be of type "object" but instead received "${typeof options.theme}".`
2351
+ );
2352
+ }
2353
+ }
2354
+ }
2355
+
2356
+ const getColorsHighlight = options =>
2357
+ DEFAULT_THEME_KEYS.reduce((colors, key) => {
2358
+ const value =
2359
+ options.theme && options.theme[key] !== undefined
2360
+ ? options.theme[key]
2361
+ : DEFAULT_THEME[key];
2362
+ const color = value && _ansiStyles.default[value];
2363
+
2364
+ if (
2365
+ color &&
2366
+ typeof color.close === 'string' &&
2367
+ typeof color.open === 'string'
2368
+ ) {
2369
+ colors[key] = color;
2370
+ } else {
2371
+ throw new Error(
2372
+ `pretty-format: Option "theme" has a key "${key}" whose value "${value}" is undefined in ansi-styles.`
2373
+ );
2374
+ }
2375
+
2376
+ return colors;
2377
+ }, Object.create(null));
2378
+
2379
+ const getColorsEmpty = () =>
2380
+ DEFAULT_THEME_KEYS.reduce((colors, key) => {
2381
+ colors[key] = {
2382
+ close: '',
2383
+ open: ''
2384
+ };
2385
+ return colors;
2386
+ }, Object.create(null));
2387
+
2388
+ const getPrintFunctionName = options =>
2389
+ options && options.printFunctionName !== undefined
2390
+ ? options.printFunctionName
2391
+ : DEFAULT_OPTIONS.printFunctionName;
2392
+
2393
+ const getEscapeRegex = options =>
2394
+ options && options.escapeRegex !== undefined
2395
+ ? options.escapeRegex
2396
+ : DEFAULT_OPTIONS.escapeRegex;
2397
+
2398
+ const getEscapeString = options =>
2399
+ options && options.escapeString !== undefined
2400
+ ? options.escapeString
2401
+ : DEFAULT_OPTIONS.escapeString;
2402
+
2403
+ const getConfig = options => {
2404
+ var _options$printBasicPr;
2405
+
2406
+ return {
2407
+ callToJSON:
2408
+ options && options.callToJSON !== undefined
2409
+ ? options.callToJSON
2410
+ : DEFAULT_OPTIONS.callToJSON,
2411
+ colors:
2412
+ options && options.highlight
2413
+ ? getColorsHighlight(options)
2414
+ : getColorsEmpty(),
2415
+ compareKeys:
2416
+ options && typeof options.compareKeys === 'function'
2417
+ ? options.compareKeys
2418
+ : DEFAULT_OPTIONS.compareKeys,
2419
+ escapeRegex: getEscapeRegex(options),
2420
+ escapeString: getEscapeString(options),
2421
+ indent:
2422
+ options && options.min
2423
+ ? ''
2424
+ : createIndent(
2425
+ options && options.indent !== undefined
2426
+ ? options.indent
2427
+ : DEFAULT_OPTIONS.indent
2428
+ ),
2429
+ maxDepth:
2430
+ options && options.maxDepth !== undefined
2431
+ ? options.maxDepth
2432
+ : DEFAULT_OPTIONS.maxDepth,
2433
+ min:
2434
+ options && options.min !== undefined ? options.min : DEFAULT_OPTIONS.min,
2435
+ plugins:
2436
+ options && options.plugins !== undefined
2437
+ ? options.plugins
2438
+ : DEFAULT_OPTIONS.plugins,
2439
+ printBasicPrototype:
2440
+ (_options$printBasicPr =
2441
+ options === null || options === void 0
2442
+ ? void 0
2443
+ : options.printBasicPrototype) !== null &&
2444
+ _options$printBasicPr !== void 0
2445
+ ? _options$printBasicPr
2446
+ : true,
2447
+ printFunctionName: getPrintFunctionName(options),
2448
+ spacingInner: options && options.min ? ' ' : '\n',
2449
+ spacingOuter: options && options.min ? '' : '\n'
2450
+ };
2451
+ };
2452
+
2453
+ function createIndent(indent) {
2454
+ return new Array(indent + 1).join(' ');
2455
+ }
2456
+ /**
2457
+ * Returns a presentation string of your `val` object
2458
+ * @param val any potential JavaScript object
2459
+ * @param options Custom settings
2460
+ */
2461
+
2462
+ function format(val, options) {
2463
+ if (options) {
2464
+ validateOptions(options);
2465
+
2466
+ if (options.plugins) {
2467
+ const plugin = findPlugin(options.plugins, val);
2468
+
2469
+ if (plugin !== null) {
2470
+ return printPlugin(plugin, val, getConfig(options), '', 0, []);
2471
+ }
2472
+ }
2473
+ }
2474
+
2475
+ const basicResult = printBasicValue(
2476
+ val,
2477
+ getPrintFunctionName(options),
2478
+ getEscapeRegex(options),
2479
+ getEscapeString(options)
2480
+ );
2481
+
2482
+ if (basicResult !== null) {
2483
+ return basicResult;
2484
+ }
2485
+
2486
+ return printComplexValue(val, getConfig(options), '', 0, []);
2487
+ }
2488
+
2489
+ const plugins = {
2490
+ AsymmetricMatcher: _AsymmetricMatcher.default,
2491
+ ConvertAnsi: _ConvertAnsi.default,
2492
+ DOMCollection: _DOMCollection.default,
2493
+ DOMElement: _DOMElement.default,
2494
+ Immutable: _Immutable.default,
2495
+ ReactElement: _ReactElement.default,
2496
+ ReactTestComponent: _ReactTestComponent.default
2497
+ };
2498
+ plugins_1 = build.plugins = plugins;
2499
+ var _default = format;
2500
+ build.default = _default;
2501
+
2502
+ const {
2503
+ DOMCollection,
2504
+ DOMElement,
2505
+ Immutable,
2506
+ ReactElement,
2507
+ ReactTestComponent,
2508
+ AsymmetricMatcher
2509
+ } = plugins_1;
2510
+ let PLUGINS = [
2511
+ ReactTestComponent,
2512
+ ReactElement,
2513
+ DOMElement,
2514
+ DOMCollection,
2515
+ Immutable,
2516
+ AsymmetricMatcher
2517
+ ];
2518
+ const addSerializer = (plugin) => {
2519
+ PLUGINS = [plugin].concat(PLUGINS);
2520
+ };
2521
+ const getSerializers = () => PLUGINS;
2522
+
2523
+ function equals(a, b, customTesters, strictCheck) {
2524
+ customTesters = customTesters || [];
2525
+ return eq(a, b, [], [], customTesters, strictCheck ? hasKey : hasDefinedKey);
2526
+ }
2527
+ function isAsymmetric(obj) {
2528
+ return !!obj && isA("Function", obj.asymmetricMatch);
2529
+ }
2530
+ function hasAsymmetric(obj, seen = new Set()) {
2531
+ if (seen.has(obj))
2532
+ return false;
2533
+ seen.add(obj);
2534
+ if (isAsymmetric(obj))
2535
+ return true;
2536
+ if (Array.isArray(obj))
2537
+ return obj.some((i) => hasAsymmetric(i, seen));
2538
+ if (obj instanceof Set)
2539
+ return Array.from(obj).some((i) => hasAsymmetric(i, seen));
2540
+ if (isObject(obj))
2541
+ return Object.values(obj).some((v) => hasAsymmetric(v, seen));
2542
+ return false;
2543
+ }
2544
+ function asymmetricMatch(a, b) {
2545
+ const asymmetricA = isAsymmetric(a);
2546
+ const asymmetricB = isAsymmetric(b);
2547
+ if (asymmetricA && asymmetricB)
2548
+ return void 0;
2549
+ if (asymmetricA)
2550
+ return a.asymmetricMatch(b);
2551
+ if (asymmetricB)
2552
+ return b.asymmetricMatch(a);
2553
+ }
2554
+ function eq(a, b, aStack, bStack, customTesters, hasKey2) {
2555
+ let result = true;
2556
+ const asymmetricResult = asymmetricMatch(a, b);
2557
+ if (asymmetricResult !== void 0)
2558
+ return asymmetricResult;
2559
+ for (let i = 0; i < customTesters.length; i++) {
2560
+ const customTesterResult = customTesters[i](a, b);
2561
+ if (customTesterResult !== void 0)
2562
+ return customTesterResult;
2563
+ }
2564
+ if (a instanceof Error && b instanceof Error)
2565
+ return a.message === b.message;
2566
+ if (Object.is(a, b))
2567
+ return true;
2568
+ if (a === null || b === null)
2569
+ return a === b;
2570
+ const className = Object.prototype.toString.call(a);
2571
+ if (className !== Object.prototype.toString.call(b))
2572
+ return false;
2573
+ switch (className) {
2574
+ case "[object Boolean]":
2575
+ case "[object String]":
2576
+ case "[object Number]":
2577
+ if (typeof a !== typeof b) {
2578
+ return false;
2579
+ } else if (typeof a !== "object" && typeof b !== "object") {
2580
+ return Object.is(a, b);
2581
+ } else {
2582
+ return Object.is(a.valueOf(), b.valueOf());
2583
+ }
2584
+ case "[object Date]":
2585
+ return +a === +b;
2586
+ case "[object RegExp]":
2587
+ return a.source === b.source && a.flags === b.flags;
2588
+ }
2589
+ if (typeof a !== "object" || typeof b !== "object")
2590
+ return false;
2591
+ if (isDomNode(a) && isDomNode(b))
2592
+ return a.isEqualNode(b);
2593
+ let length = aStack.length;
2594
+ while (length--) {
2595
+ if (aStack[length] === a)
2596
+ return bStack[length] === b;
2597
+ else if (bStack[length] === b)
2598
+ return false;
2599
+ }
2600
+ aStack.push(a);
2601
+ bStack.push(b);
2602
+ if (className === "[object Array]" && a.length !== b.length)
2603
+ return false;
2604
+ const aKeys = keys(a, hasKey2);
2605
+ let key;
2606
+ let size = aKeys.length;
2607
+ if (keys(b, hasKey2).length !== size)
2608
+ return false;
2609
+ while (size--) {
2610
+ key = aKeys[size];
2611
+ result = hasKey2(b, key) && eq(a[key], b[key], aStack, bStack, customTesters, hasKey2);
2612
+ if (!result)
2613
+ return false;
2614
+ }
2615
+ aStack.pop();
2616
+ bStack.pop();
2617
+ return result;
2618
+ }
2619
+ function keys(obj, hasKey2) {
2620
+ const keys2 = [];
2621
+ for (const key in obj) {
2622
+ if (hasKey2(obj, key))
2623
+ keys2.push(key);
2624
+ }
2625
+ return keys2.concat(Object.getOwnPropertySymbols(obj).filter((symbol) => Object.getOwnPropertyDescriptor(obj, symbol).enumerable));
2626
+ }
2627
+ function hasDefinedKey(obj, key) {
2628
+ return hasKey(obj, key) && obj[key] !== void 0;
2629
+ }
2630
+ function hasKey(obj, key) {
2631
+ return Object.prototype.hasOwnProperty.call(obj, key);
2632
+ }
2633
+ function isA(typeName, value) {
2634
+ return Object.prototype.toString.apply(value) === `[object ${typeName}]`;
2635
+ }
2636
+ function isDomNode(obj) {
2637
+ return obj !== null && typeof obj === "object" && typeof obj.nodeType === "number" && typeof obj.nodeName === "string" && typeof obj.isEqualNode === "function";
2638
+ }
2639
+ const IS_KEYED_SENTINEL = "@@__IMMUTABLE_KEYED__@@";
2640
+ const IS_SET_SENTINEL = "@@__IMMUTABLE_SET__@@";
2641
+ const IS_ORDERED_SENTINEL = "@@__IMMUTABLE_ORDERED__@@";
2642
+ function isImmutableUnorderedKeyed(maybeKeyed) {
2643
+ return !!(maybeKeyed && maybeKeyed[IS_KEYED_SENTINEL] && !maybeKeyed[IS_ORDERED_SENTINEL]);
2644
+ }
2645
+ function isImmutableUnorderedSet(maybeSet) {
2646
+ return !!(maybeSet && maybeSet[IS_SET_SENTINEL] && !maybeSet[IS_ORDERED_SENTINEL]);
2647
+ }
2648
+ const IteratorSymbol = Symbol.iterator;
2649
+ const hasIterator = (object) => !!(object != null && object[IteratorSymbol]);
2650
+ const iterableEquality = (a, b, aStack = [], bStack = []) => {
2651
+ if (typeof a !== "object" || typeof b !== "object" || Array.isArray(a) || Array.isArray(b) || !hasIterator(a) || !hasIterator(b))
2652
+ return void 0;
2653
+ if (a.constructor !== b.constructor)
2654
+ return false;
2655
+ let length = aStack.length;
2656
+ while (length--) {
2657
+ if (aStack[length] === a)
2658
+ return bStack[length] === b;
2659
+ }
2660
+ aStack.push(a);
2661
+ bStack.push(b);
2662
+ const iterableEqualityWithStack = (a2, b2) => iterableEquality(a2, b2, [...aStack], [...bStack]);
2663
+ if (a.size !== void 0) {
2664
+ if (a.size !== b.size) {
2665
+ return false;
2666
+ } else if (isA("Set", a) || isImmutableUnorderedSet(a)) {
2667
+ let allFound = true;
2668
+ for (const aValue of a) {
2669
+ if (!b.has(aValue)) {
2670
+ let has = false;
2671
+ for (const bValue of b) {
2672
+ const isEqual = equals(aValue, bValue, [iterableEqualityWithStack]);
2673
+ if (isEqual === true)
2674
+ has = true;
2675
+ }
2676
+ if (has === false) {
2677
+ allFound = false;
2678
+ break;
2679
+ }
2680
+ }
2681
+ }
2682
+ aStack.pop();
2683
+ bStack.pop();
2684
+ return allFound;
2685
+ } else if (isA("Map", a) || isImmutableUnorderedKeyed(a)) {
2686
+ let allFound = true;
2687
+ for (const aEntry of a) {
2688
+ if (!b.has(aEntry[0]) || !equals(aEntry[1], b.get(aEntry[0]), [iterableEqualityWithStack])) {
2689
+ let has = false;
2690
+ for (const bEntry of b) {
2691
+ const matchedKey = equals(aEntry[0], bEntry[0], [
2692
+ iterableEqualityWithStack
2693
+ ]);
2694
+ let matchedValue = false;
2695
+ if (matchedKey === true) {
2696
+ matchedValue = equals(aEntry[1], bEntry[1], [
2697
+ iterableEqualityWithStack
2698
+ ]);
2699
+ }
2700
+ if (matchedValue === true)
2701
+ has = true;
2702
+ }
2703
+ if (has === false) {
2704
+ allFound = false;
2705
+ break;
2706
+ }
2707
+ }
2708
+ }
2709
+ aStack.pop();
2710
+ bStack.pop();
2711
+ return allFound;
2712
+ }
2713
+ }
2714
+ const bIterator = b[IteratorSymbol]();
2715
+ for (const aValue of a) {
2716
+ const nextB = bIterator.next();
2717
+ if (nextB.done || !equals(aValue, nextB.value, [iterableEqualityWithStack]))
2718
+ return false;
2719
+ }
2720
+ if (!bIterator.next().done)
2721
+ return false;
2722
+ aStack.pop();
2723
+ bStack.pop();
2724
+ return true;
2725
+ };
2726
+ const hasPropertyInObject = (object, key) => {
2727
+ const shouldTerminate = !object || typeof object !== "object" || object === Object.prototype;
2728
+ if (shouldTerminate)
2729
+ return false;
2730
+ return Object.prototype.hasOwnProperty.call(object, key) || hasPropertyInObject(Object.getPrototypeOf(object), key);
2731
+ };
2732
+ const isObjectWithKeys = (a) => isObject(a) && !(a instanceof Error) && !(a instanceof Array) && !(a instanceof Date);
2733
+ const subsetEquality = (object, subset) => {
2734
+ const subsetEqualityWithContext = (seenReferences = new WeakMap()) => (object2, subset2) => {
2735
+ if (!isObjectWithKeys(subset2))
2736
+ return void 0;
2737
+ return Object.keys(subset2).every((key) => {
2738
+ if (isObjectWithKeys(subset2[key])) {
2739
+ if (seenReferences.has(subset2[key]))
2740
+ return equals(object2[key], subset2[key], [iterableEquality]);
2741
+ seenReferences.set(subset2[key], true);
2742
+ }
2743
+ const result = object2 != null && hasPropertyInObject(object2, key) && equals(object2[key], subset2[key], [
2744
+ iterableEquality,
2745
+ subsetEqualityWithContext(seenReferences)
2746
+ ]);
2747
+ seenReferences.delete(subset2[key]);
2748
+ return result;
2749
+ });
2750
+ };
2751
+ return subsetEqualityWithContext()(object, subset);
2752
+ };
2753
+ const typeEquality = (a, b) => {
2754
+ if (a == null || b == null || a.constructor === b.constructor)
2755
+ return void 0;
2756
+ return false;
2757
+ };
2758
+ const arrayBufferEquality = (a, b) => {
2759
+ if (!(a instanceof ArrayBuffer) || !(b instanceof ArrayBuffer))
2760
+ return void 0;
2761
+ const dataViewA = new DataView(a);
2762
+ const dataViewB = new DataView(b);
2763
+ if (dataViewA.byteLength !== dataViewB.byteLength)
2764
+ return false;
2765
+ for (let i = 0; i < dataViewA.byteLength; i++) {
2766
+ if (dataViewA.getUint8(i) !== dataViewB.getUint8(i))
2767
+ return false;
2768
+ }
2769
+ return true;
2770
+ };
2771
+ const sparseArrayEquality = (a, b) => {
2772
+ if (!Array.isArray(a) || !Array.isArray(b))
2773
+ return void 0;
2774
+ const aKeys = Object.keys(a);
2775
+ const bKeys = Object.keys(b);
2776
+ return equals(a, b, [iterableEquality, typeEquality], true) && equals(aKeys, bKeys);
2777
+ };
2778
+
2779
+ const MATCHERS_OBJECT = Symbol.for("matchers-object");
2780
+ if (!Object.prototype.hasOwnProperty.call(global, MATCHERS_OBJECT)) {
2781
+ const defaultState = {
2782
+ assertionCalls: 0,
2783
+ isExpectingAssertions: false,
2784
+ isExpectingAssertionsError: null,
2785
+ expectedAssertionsNumber: null,
2786
+ expectedAssertionsNumberError: null
2787
+ };
2788
+ Object.defineProperty(global, MATCHERS_OBJECT, {
2789
+ value: {
2790
+ state: defaultState
2791
+ }
2792
+ });
2793
+ }
2794
+ const getState = () => global[MATCHERS_OBJECT].state;
2795
+ const setState = (state) => {
2796
+ Object.assign(global[MATCHERS_OBJECT].state, state);
2797
+ };
2798
+ const JestChaiExpect = (chai, utils) => {
2799
+ function def(name, fn) {
2800
+ const addMethod = (n) => {
2801
+ utils.addMethod(chai.Assertion.prototype, n, fn);
2802
+ };
2803
+ if (Array.isArray(name))
2804
+ name.forEach((n) => addMethod(n));
2805
+ else
2806
+ addMethod(name);
2807
+ }
2808
+ const chaiEqual = chai.Assertion.prototype.equal;
2809
+ def("chaiEqual", function(...args) {
2810
+ return chaiEqual.apply(this, args);
2811
+ });
2812
+ ["throw", "throws", "Throw"].forEach((m) => {
2813
+ utils.overwriteMethod(chai.Assertion.prototype, m, (_super) => {
2814
+ return function(...args) {
2815
+ const promise = utils.flag(this, "promise");
2816
+ const object = utils.flag(this, "object");
2817
+ if (promise === "rejects") {
2818
+ utils.flag(this, "object", () => {
2819
+ throw object;
2820
+ });
2821
+ }
2822
+ _super.apply(this, args);
2823
+ };
2824
+ });
2825
+ });
2826
+ utils.overwriteMethod(chai.Assertion.prototype, "equal", (_super) => {
2827
+ return function(...args) {
2828
+ const expected = args[0];
2829
+ const actual = utils.flag(this, "object");
2830
+ if (hasAsymmetric(expected)) {
2831
+ this.assert(equals(actual, expected, void 0, true), "not match with #{act}", "should not match with #{act}", actual, expected);
2832
+ } else {
2833
+ _super.apply(this, args);
2834
+ }
2835
+ };
2836
+ });
2837
+ utils.overwriteMethod(chai.Assertion.prototype, "eql", (_super) => {
2838
+ return function(...args) {
2839
+ const expected = args[0];
2840
+ const actual = utils.flag(this, "object");
2841
+ if (hasAsymmetric(expected)) {
2842
+ this.assert(equals(actual, expected), "not match with #{exp}", "should not match with #{exp}", expected, actual);
2843
+ } else {
2844
+ _super.apply(this, args);
2845
+ }
2846
+ };
2847
+ });
2848
+ def("toEqual", function(expected) {
2849
+ return this.eql(expected);
2850
+ });
2851
+ def("toStrictEqual", function(expected) {
2852
+ const obj = utils.flag(this, "object");
2853
+ const equal = equals(obj, expected, [
2854
+ iterableEquality,
2855
+ typeEquality,
2856
+ sparseArrayEquality,
2857
+ arrayBufferEquality
2858
+ ], true);
2859
+ return this.assert(equal, "expected #{this} to strictly equal #{exp}", "expected #{this} to not strictly equal #{exp}", expected, obj);
2860
+ });
2861
+ def("toBe", function(expected) {
2862
+ return this.equal(expected);
2863
+ });
2864
+ def("toMatchObject", function(expected) {
2865
+ return this.containSubset(expected);
2866
+ });
2867
+ def("toMatch", function(expected) {
2868
+ if (typeof expected === "string")
2869
+ return this.include(expected);
2870
+ else
2871
+ return this.match(expected);
2872
+ });
2873
+ def("toContain", function(item) {
2874
+ return this.contain(item);
2875
+ });
2876
+ def("toContainEqual", function(expected) {
2877
+ const obj = utils.flag(this, "object");
2878
+ const index = Array.from(obj).findIndex((item) => {
2879
+ return equals(item, expected);
2880
+ });
2881
+ this.assert(index !== -1, "expected #{this} to deep equally contain #{exp}", "expected #{this} to not deep equally contain #{exp}", expected);
2882
+ });
2883
+ def("toBeTruthy", function() {
2884
+ const obj = utils.flag(this, "object");
2885
+ this.assert(Boolean(obj), "expected #{this} to be truthy", "expected #{this} to not be truthy", obj);
2886
+ });
2887
+ def("toBeFalsy", function() {
2888
+ const obj = utils.flag(this, "object");
2889
+ this.assert(!obj, "expected #{this} to be falsy", "expected #{this} to not be falsy", obj);
2890
+ });
2891
+ def("toBeGreaterThan", function(expected) {
2892
+ return this.to.greaterThan(expected);
2893
+ });
2894
+ def("toBeGreaterThanOrEqual", function(expected) {
2895
+ return this.to.greaterThanOrEqual(expected);
2896
+ });
2897
+ def("toBeLessThan", function(expected) {
2898
+ return this.to.lessThan(expected);
2899
+ });
2900
+ def("toBeLessThanOrEqual", function(expected) {
2901
+ return this.to.lessThanOrEqual(expected);
2902
+ });
2903
+ def("toBeNaN", function() {
2904
+ return this.be.NaN;
2905
+ });
2906
+ def("toBeUndefined", function() {
2907
+ return this.be.undefined;
2908
+ });
2909
+ def("toBeNull", function() {
2910
+ return this.be.null;
2911
+ });
2912
+ def("toBeDefined", function() {
2913
+ const negate = utils.flag(this, "negate");
2914
+ utils.flag(this, "negate", false);
2915
+ if (negate)
2916
+ return this.be.undefined;
2917
+ return this.not.be.undefined;
2918
+ });
2919
+ def("toBeInstanceOf", function(obj) {
2920
+ return this.instanceOf(obj);
2921
+ });
2922
+ def("toHaveLength", function(length) {
2923
+ return this.have.length(length);
2924
+ });
2925
+ def("toHaveProperty", function(...args) {
2926
+ return this.have.deep.nested.property(...args);
2927
+ });
2928
+ def("toBeCloseTo", function(received, precision = 2) {
2929
+ const expected = this._obj;
2930
+ let pass = false;
2931
+ let expectedDiff = 0;
2932
+ let receivedDiff = 0;
2933
+ if (received === Infinity && expected === Infinity) {
2934
+ pass = true;
2935
+ } else if (received === -Infinity && expected === -Infinity) {
2936
+ pass = true;
2937
+ } else {
2938
+ expectedDiff = Math.pow(10, -precision) / 2;
2939
+ receivedDiff = Math.abs(expected - received);
2940
+ pass = receivedDiff < expectedDiff;
2941
+ }
2942
+ return this.assert(pass, `expected #{this} to be close to #{exp}, recieved difference is ${receivedDiff}, but expected ${expectedDiff}`, `expected #{this} to not be close to #{exp}, recieved difference is ${receivedDiff}, but expected ${expectedDiff}`, received, expected);
2943
+ });
2944
+ const assertIsMock = (assertion) => {
2945
+ if (!isMockFunction(assertion._obj))
2946
+ throw new TypeError(`${utils.inspect(assertion._obj)} is not a spy or a call to a spy!`);
2947
+ };
2948
+ const getSpy = (assertion) => {
2949
+ assertIsMock(assertion);
2950
+ return assertion._obj;
2951
+ };
2952
+ def(["toHaveBeenCalledTimes", "toBeCalledTimes"], function(number) {
2953
+ const spy = getSpy(this);
2954
+ const spyName = spy.getMockName();
2955
+ const callCount = spy.mock.calls.length;
2956
+ return this.assert(callCount === number, `expected "${spyName}" to be called #{exp} times`, `expected "${spyName}" to not be called #{exp} times`, number, callCount);
2957
+ });
2958
+ def("toHaveBeenCalledOnce", function() {
2959
+ const spy = getSpy(this);
2960
+ const spyName = spy.getMockName();
2961
+ const callCount = spy.mock.calls.length;
2962
+ return this.assert(callCount === 1, `expected "${spyName}" to be called once`, `expected "${spyName}" to not be called once`, 1, callCount);
2963
+ });
2964
+ def(["toHaveBeenCalled", "toBeCalled"], function() {
2965
+ const spy = getSpy(this);
2966
+ const spyName = spy.getMockName();
2967
+ const called = spy.mock.calls.length > 0;
2968
+ return this.assert(called, `expected "${spyName}" to be called at least once`, `expected "${spyName}" to not be called at all`, true, called);
2969
+ });
2970
+ def(["toHaveBeenCalledWith", "toBeCalledWith"], function(...args) {
2971
+ const spy = getSpy(this);
2972
+ const spyName = spy.getMockName();
2973
+ const pass = spy.mock.calls.some((callArg) => equals(callArg, args, [iterableEquality]));
2974
+ return this.assert(pass, `expected "${spyName}" to be called with arguments: #{exp}`, `expected "${spyName}" to not be called with arguments: #{exp}`, args, spy.mock.calls);
2975
+ });
2976
+ const ordinalOf = (i) => {
2977
+ const j = i % 10;
2978
+ const k = i % 100;
2979
+ if (j === 1 && k !== 11)
2980
+ return `${i}st`;
2981
+ if (j === 2 && k !== 12)
2982
+ return `${i}nd`;
2983
+ if (j === 3 && k !== 13)
2984
+ return `${i}rd`;
2985
+ return `${i}th`;
2986
+ };
2987
+ def(["toHaveBeenNthCalledWith", "nthCalledWith"], function(times, ...args) {
2988
+ const spy = getSpy(this);
2989
+ const spyName = spy.getMockName();
2990
+ const nthCall = spy.mock.calls[times - 1];
2991
+ this.assert(equals(nthCall, args, [iterableEquality]), `expected ${ordinalOf(times)} "${spyName}" call to have been called with #{exp}`, `expected ${ordinalOf(times)} "${spyName}" call to not have been called with #{exp}`, args, nthCall);
2992
+ });
2993
+ def(["toHaveBeenLastCalledWith", "lastCalledWith"], function(...args) {
2994
+ const spy = getSpy(this);
2995
+ const spyName = spy.getMockName();
2996
+ const lastCall = spy.mock.calls[spy.calls.length - 1];
2997
+ this.assert(equals(lastCall, args, [iterableEquality]), `expected last "${spyName}" call to have been called with #{exp}`, `expected last "${spyName}" call to not have been called with #{exp}`, args, lastCall);
2998
+ });
2999
+ def(["toThrow", "toThrowError"], function(expected) {
3000
+ return this.to.throw(expected);
3001
+ });
3002
+ def(["toHaveReturned", "toReturn"], function() {
3003
+ const spy = getSpy(this);
3004
+ const spyName = spy.getMockName();
3005
+ const calledAndNotThrew = spy.mock.calls.length > 0 && !spy.mock.results.some(({ type }) => type === "throw");
3006
+ this.assert(calledAndNotThrew, `expected "${spyName}" to be successfully called at least once`, `expected "${spyName}" to not be successfully called`, calledAndNotThrew, !calledAndNotThrew);
3007
+ });
3008
+ def(["toHaveReturnedTimes", "toReturnTimes"], function(times) {
3009
+ const spy = getSpy(this);
3010
+ const spyName = spy.getMockName();
3011
+ const successfullReturns = spy.mock.results.reduce((success, { type }) => type === "throw" ? success : ++success, 0);
3012
+ this.assert(successfullReturns === times, `expected "${spyName}" to be successfully called ${times} times`, `expected "${spyName}" to not be successfully called ${times} times`, `expected number of returns: ${times}`, `received number of returns: ${successfullReturns}`);
3013
+ });
3014
+ def(["toHaveReturnedWith", "toReturnWith"], function(value) {
3015
+ const spy = getSpy(this);
3016
+ const spyName = spy.getMockName();
3017
+ const pass = spy.mock.results.some(({ type, value: result }) => type === "return" && equals(value, result));
3018
+ this.assert(pass, `expected "${spyName}" to be successfully called with #{exp}`, `expected "${spyName}" to not be successfully called with #{exp}`, value);
3019
+ });
3020
+ def(["toHaveLastReturnedWith", "lastReturnedWith"], function(value) {
3021
+ const spy = getSpy(this);
3022
+ const spyName = spy.getMockName();
3023
+ const { value: lastResult } = spy.mock.results[spy.returns.length - 1];
3024
+ const pass = equals(lastResult, value);
3025
+ this.assert(pass, `expected last "${spyName}" call to return #{exp}`, `expected last "${spyName}" call to not return #{exp}`, value, lastResult);
3026
+ });
3027
+ def(["toHaveNthReturnedWith", "nthReturnedWith"], function(nthCall, value) {
3028
+ const spy = getSpy(this);
3029
+ const spyName = spy.getMockName();
3030
+ const isNot = utils.flag(this, "negate");
3031
+ const { type: callType, value: callResult } = spy.mock.results[nthCall - 1];
3032
+ const ordinalCall = `${ordinalOf(nthCall)} call`;
3033
+ if (!isNot && callType === "throw")
3034
+ chai.assert.fail(`expected ${ordinalCall} to return #{exp}, but instead it threw an error`);
3035
+ const nthCallReturn = equals(callResult, value);
3036
+ this.assert(nthCallReturn, `expected ${ordinalCall} "${spyName}" call to return #{exp}`, `expected ${ordinalCall} "${spyName}" call to not return #{exp}`, value, callResult);
3037
+ });
3038
+ utils.addProperty(chai.Assertion.prototype, "resolves", function() {
3039
+ utils.flag(this, "promise", "resolves");
3040
+ const obj = utils.flag(this, "object");
3041
+ const proxy = new Proxy(this, {
3042
+ get: (target, key, reciever) => {
3043
+ const result = Reflect.get(target, key, reciever);
3044
+ if (typeof result !== "function")
3045
+ return result instanceof chai.Assertion ? proxy : result;
3046
+ return async (...args) => {
3047
+ return obj.then((value) => {
3048
+ utils.flag(this, "object", value);
3049
+ return result.call(this, ...args);
3050
+ }, (err) => {
3051
+ throw new Error(`promise rejected "${err}" instead of resolving`);
3052
+ });
3053
+ };
3054
+ }
3055
+ });
3056
+ return proxy;
3057
+ });
3058
+ utils.addProperty(chai.Assertion.prototype, "rejects", function() {
3059
+ utils.flag(this, "promise", "rejects");
3060
+ const obj = utils.flag(this, "object");
3061
+ const wrapper = typeof obj === "function" ? obj() : obj;
3062
+ const proxy = new Proxy(this, {
3063
+ get: (target, key, reciever) => {
3064
+ const result = Reflect.get(target, key, reciever);
3065
+ if (typeof result !== "function")
3066
+ return result instanceof chai.Assertion ? proxy : result;
3067
+ return async (...args) => {
3068
+ return wrapper.then((value) => {
3069
+ throw new Error(`promise resolved "${value}" instead of rejecting`);
3070
+ }, (err) => {
3071
+ utils.flag(this, "object", err);
3072
+ return result.call(this, ...args);
3073
+ });
3074
+ };
3075
+ }
3076
+ });
3077
+ return proxy;
3078
+ });
3079
+ utils.addMethod(chai.expect, "assertions", function assertions(expected) {
3080
+ const error = new Error(`expected number of assertions to be ${expected}, but got ${getState().assertionCalls}`);
3081
+ if (Error.captureStackTrace)
3082
+ Error.captureStackTrace(error, assertions);
3083
+ setState({
3084
+ expectedAssertionsNumber: expected,
3085
+ expectedAssertionsNumberError: error
3086
+ });
3087
+ });
3088
+ utils.addMethod(chai.expect, "hasAssertions", function hasAssertions() {
3089
+ const error = new Error("expected any number of assertion, but got none");
3090
+ if (Error.captureStackTrace)
3091
+ Error.captureStackTrace(error, hasAssertions);
3092
+ setState({
3093
+ isExpectingAssertions: true,
3094
+ isExpectingAssertionsError: error
3095
+ });
3096
+ });
3097
+ utils.addMethod(chai.expect, "addSnapshotSerializer", addSerializer);
3098
+ };
3099
+
3100
+ var mockdate$1 = {exports: {}};
3101
+
3102
+ (function (module, exports) {
3103
+ (function (global, factory) {
3104
+ factory(exports) ;
3105
+ }(commonjsGlobal, (function (exports) {
3106
+ /*! *****************************************************************************
3107
+ Copyright (c) Microsoft Corporation.
3108
+
3109
+ Permission to use, copy, modify, and/or distribute this software for any
3110
+ purpose with or without fee is hereby granted.
3111
+
3112
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
3113
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
3114
+ AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
3115
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
3116
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
3117
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
3118
+ PERFORMANCE OF THIS SOFTWARE.
3119
+ ***************************************************************************** */
3120
+ /* global Reflect, Promise */
3121
+
3122
+ var extendStatics = function(d, b) {
3123
+ extendStatics = Object.setPrototypeOf ||
3124
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
3125
+ function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
3126
+ return extendStatics(d, b);
3127
+ };
3128
+
3129
+ function __extends(d, b) {
3130
+ if (typeof b !== "function" && b !== null)
3131
+ throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
3132
+ extendStatics(d, b);
3133
+ function __() { this.constructor = d; }
3134
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
3135
+ }
3136
+
3137
+ var RealDate = Date;
3138
+ var now = null;
3139
+ var MockDate = /** @class */ (function (_super) {
3140
+ __extends(Date, _super);
3141
+ function Date(y, m, d, h, M, s, ms) {
3142
+ _super.call(this) || this;
3143
+ var date;
3144
+ switch (arguments.length) {
3145
+ case 0:
3146
+ if (now !== null) {
3147
+ date = new RealDate(now.valueOf());
3148
+ }
3149
+ else {
3150
+ date = new RealDate();
3151
+ }
3152
+ break;
3153
+ case 1:
3154
+ date = new RealDate(y);
3155
+ break;
3156
+ default:
3157
+ d = typeof d === 'undefined' ? 1 : d;
3158
+ h = h || 0;
3159
+ M = M || 0;
3160
+ s = s || 0;
3161
+ ms = ms || 0;
3162
+ date = new RealDate(y, m, d, h, M, s, ms);
3163
+ break;
3164
+ }
3165
+ return date;
3166
+ }
3167
+ return Date;
3168
+ }(RealDate));
3169
+ MockDate.prototype = RealDate.prototype;
3170
+ MockDate.UTC = RealDate.UTC;
3171
+ MockDate.now = function () {
3172
+ return new MockDate().valueOf();
3173
+ };
3174
+ MockDate.parse = function (dateString) {
3175
+ return RealDate.parse(dateString);
3176
+ };
3177
+ MockDate.toString = function () {
3178
+ return RealDate.toString();
3179
+ };
3180
+ function set(date) {
3181
+ var dateObj = new Date(date.valueOf());
3182
+ if (isNaN(dateObj.getTime())) {
3183
+ throw new TypeError('mockdate: The time set is an invalid date: ' + date);
3184
+ }
3185
+ // @ts-ignore
3186
+ Date = MockDate;
3187
+ now = dateObj.valueOf();
3188
+ }
3189
+ function reset() {
3190
+ Date = RealDate;
3191
+ }
3192
+ var mockdate = {
3193
+ set: set,
3194
+ reset: reset,
3195
+ };
3196
+
3197
+ exports.default = mockdate;
3198
+ exports.reset = reset;
3199
+ exports.set = set;
3200
+
3201
+ Object.defineProperty(exports, '__esModule', { value: true });
3202
+
3203
+ })));
3204
+ }(mockdate$1, mockdate$1.exports));
3205
+
3206
+ var mockdate = /*@__PURE__*/getDefaultExportFromCjs(mockdate$1.exports);
3207
+
3208
+ const originalSetTimeout = global.setTimeout;
3209
+ const originalSetInterval = global.setInterval;
3210
+ const originalClearTimeout = global.clearTimeout;
3211
+ const originalClearInterval = global.clearInterval;
3212
+ const MAX_LOOPS = 1e4;
3213
+ var QueueTaskType;
3214
+ (function(QueueTaskType2) {
3215
+ QueueTaskType2["Interval"] = "interval";
3216
+ QueueTaskType2["Timeout"] = "timeout";
3217
+ QueueTaskType2["Immediate"] = "immediate";
3218
+ })(QueueTaskType || (QueueTaskType = {}));
3219
+ const assertEvery = (assertions, message) => {
3220
+ if (assertions.some((a) => !a))
3221
+ throw new Error(message);
3222
+ };
3223
+ const assertMaxLoop = (times) => {
3224
+ if (times >= MAX_LOOPS)
3225
+ throw new Error("setTimeout/setInterval called 10 000 times. It's possible it stuck in an infinite loop.");
3226
+ };
3227
+ const getNodeTimeout = (id) => {
3228
+ const timer = {
3229
+ ref: () => timer,
3230
+ unref: () => timer,
3231
+ hasRef: () => true,
3232
+ refresh: () => timer,
3233
+ [Symbol.toPrimitive]: () => id
3234
+ };
3235
+ return timer;
3236
+ };
3237
+ class FakeTimers {
3238
+ constructor() {
3239
+ this._advancedTime = 0;
3240
+ this._nestedTime = {};
3241
+ this._scopeId = 0;
3242
+ this._isNested = false;
3243
+ this._isOnlyPending = false;
3244
+ this._spyid = 0;
3245
+ this._isMocked = false;
3246
+ this._tasksQueue = [];
3247
+ this._queueCount = 0;
3248
+ }
3249
+ useFakeTimers() {
3250
+ this._isMocked = true;
3251
+ this.reset();
3252
+ const spyFactory = (spyType, resultBuilder) => {
3253
+ return (cb, ms = 0) => {
3254
+ const id = ++this._spyid;
3255
+ const nestedTo = Object.entries(this._nestedTime).filter(([key]) => Number(key) <= this._scopeId);
3256
+ const nestedMs = nestedTo.reduce((total, [, ms2]) => total + ms2, ms);
3257
+ const call = { id, cb, ms, nestedMs, scopeId: this._scopeId };
3258
+ const task = { type: spyType, call, nested: this._isNested };
3259
+ this.pushTask(task);
3260
+ return resultBuilder(id, cb);
3261
+ };
3262
+ };
3263
+ this._setTimeout = spyOn(global, "setTimeout").mockImplementation(spyFactory(QueueTaskType.Timeout, getNodeTimeout));
3264
+ this._setInterval = spyOn(global, "setInterval").mockImplementation(spyFactory(QueueTaskType.Interval, getNodeTimeout));
3265
+ const clearTimerFactory = (spyType) => (id) => {
3266
+ if (id === void 0)
3267
+ return;
3268
+ const index = this._tasksQueue.findIndex(({ call, type }) => type === spyType && call.id === Number(id));
3269
+ if (index !== -1)
3270
+ this._tasksQueue.splice(index, 1);
3271
+ };
3272
+ this._clearTimeout = spyOn(global, "clearTimeout").mockImplementation(clearTimerFactory(QueueTaskType.Timeout));
3273
+ this._clearInterval = spyOn(global, "clearInterval").mockImplementation(clearTimerFactory(QueueTaskType.Interval));
3274
+ }
3275
+ useRealTimers() {
3276
+ this._isMocked = false;
3277
+ this.reset();
3278
+ global.setTimeout = originalSetTimeout;
3279
+ global.setInterval = originalSetInterval;
3280
+ global.clearTimeout = originalClearTimeout;
3281
+ global.clearInterval = originalClearInterval;
3282
+ }
3283
+ runOnlyPendingTimers() {
3284
+ this.assertMocked();
3285
+ this._isOnlyPending = true;
3286
+ this.runQueue();
3287
+ }
3288
+ runAllTimers() {
3289
+ this.assertMocked();
3290
+ this.runQueue();
3291
+ }
3292
+ advanceTimersByTime(ms) {
3293
+ this.assertMocked();
3294
+ this._advancedTime += ms;
3295
+ this.runQueue();
3296
+ }
3297
+ advanceTimersToNextTimer() {
3298
+ this.assertMocked();
3299
+ this.callQueueItem(0);
3300
+ }
3301
+ getTimerCount() {
3302
+ this.assertMocked();
3303
+ return this._tasksQueue.length;
3304
+ }
3305
+ reset() {
3306
+ var _a, _b, _c, _d;
3307
+ this._advancedTime = 0;
3308
+ this._nestedTime = {};
3309
+ this._isNested = false;
3310
+ this._isOnlyPending = false;
3311
+ this._spyid = 0;
3312
+ this._queueCount = 0;
3313
+ this._tasksQueue = [];
3314
+ (_a = this._clearInterval) == null ? void 0 : _a.mockRestore();
3315
+ (_b = this._clearTimeout) == null ? void 0 : _b.mockRestore();
3316
+ (_c = this._setInterval) == null ? void 0 : _c.mockRestore();
3317
+ (_d = this._setTimeout) == null ? void 0 : _d.mockRestore();
3318
+ }
3319
+ callQueueItem(index) {
3320
+ var _a, _b;
3321
+ const task = this._tasksQueue[index];
3322
+ if (!task)
3323
+ return;
3324
+ const { call, type } = task;
3325
+ this._scopeId = call.id;
3326
+ this._isNested = true;
3327
+ (_a = this._nestedTime)[_b = call.id] ?? (_a[_b] = 0);
3328
+ this._nestedTime[call.id] += call.ms;
3329
+ if (type === "timeout") {
3330
+ this.removeTask(index);
3331
+ } else if (type === "interval") {
3332
+ call.nestedMs += call.ms;
3333
+ const nestedMs = call.nestedMs;
3334
+ const closestTask = this._tasksQueue.findIndex(({ type: type2, call: call2 }) => type2 === "interval" && call2.nestedMs < nestedMs);
3335
+ if (closestTask !== -1 && closestTask !== index)
3336
+ this.ensureQueueOrder();
3337
+ }
3338
+ call.cb();
3339
+ this._queueCount++;
3340
+ }
3341
+ runQueue() {
3342
+ let index = 0;
3343
+ while (this._tasksQueue[index]) {
3344
+ assertMaxLoop(this._queueCount);
3345
+ const { call, nested } = this._tasksQueue[index];
3346
+ if (this._advancedTime && call.nestedMs > this._advancedTime)
3347
+ break;
3348
+ if (this._isOnlyPending && nested) {
3349
+ index++;
3350
+ continue;
3351
+ }
3352
+ this.callQueueItem(index);
3353
+ }
3354
+ }
3355
+ removeTask(index) {
3356
+ if (index === 0)
3357
+ this._tasksQueue.shift();
3358
+ else
3359
+ this._tasksQueue.splice(index, 1);
3360
+ }
3361
+ pushTask(task) {
3362
+ this._tasksQueue.push(task);
3363
+ this.ensureQueueOrder();
3364
+ }
3365
+ ensureQueueOrder() {
3366
+ this._tasksQueue.sort((t1, t2) => {
3367
+ const diff = t1.call.nestedMs - t2.call.nestedMs;
3368
+ if (diff === 0) {
3369
+ if (t1.type === QueueTaskType.Immediate && t2.type !== QueueTaskType.Immediate)
3370
+ return 1;
3371
+ return 0;
3372
+ }
3373
+ return diff;
3374
+ });
3375
+ }
3376
+ assertMocked() {
3377
+ assertEvery([
3378
+ this._isMocked,
3379
+ this._setTimeout,
3380
+ this._setInterval,
3381
+ this._clearTimeout,
3382
+ this._clearInterval
3383
+ ], 'timers are not mocked. try calling "vi.useFakeTimers()" first');
3384
+ }
3385
+ }
3386
+
3387
+ class VitestUtils {
3388
+ constructor() {
3389
+ this.spyOn = spyOn;
3390
+ this.fn = fn;
3391
+ this._timers = new FakeTimers();
3392
+ this._mockedDate = null;
3393
+ }
3394
+ useFakeTimers() {
3395
+ return this._timers.useFakeTimers();
3396
+ }
3397
+ useRealTimers() {
3398
+ return this._timers.useRealTimers();
3399
+ }
3400
+ runOnlyPendingTimers() {
3401
+ return this._timers.runOnlyPendingTimers();
3402
+ }
3403
+ runAllTimers() {
3404
+ return this._timers.runAllTimers();
3405
+ }
3406
+ advanceTimersByTime(ms) {
3407
+ return this._timers.advanceTimersByTime(ms);
3408
+ }
3409
+ advanceTimersToNextTimer() {
3410
+ return this._timers.advanceTimersToNextTimer();
3411
+ }
3412
+ getTimerCount() {
3413
+ return this._timers.getTimerCount();
3414
+ }
3415
+ mockCurrentDate(date) {
3416
+ this._mockedDate = date;
3417
+ mockdate.set(date);
3418
+ }
3419
+ restoreCurrentDate() {
3420
+ this._mockedDate = null;
3421
+ mockdate.reset();
3422
+ }
3423
+ getMockedDate() {
3424
+ return this._mockedDate;
3425
+ }
3426
+ mock(path, factory) {
3427
+ }
3428
+ unmock(path) {
3429
+ }
3430
+ async importActual(path) {
3431
+ return {};
3432
+ }
3433
+ async importMock(path) {
3434
+ return {};
3435
+ }
3436
+ mocked(item, _deep = false) {
3437
+ return item;
3438
+ }
3439
+ isMockFunction(fn2) {
3440
+ return isMockFunction(fn2);
3441
+ }
3442
+ clearAllMocks() {
3443
+ __vitest__clearMocks__({ clearMocks: true });
3444
+ spies.forEach((spy) => spy.mockClear());
3445
+ return this;
3446
+ }
3447
+ resetAllMocks() {
3448
+ __vitest__clearMocks__({ mockReset: true });
3449
+ spies.forEach((spy) => spy.mockReset());
3450
+ return this;
3451
+ }
3452
+ restoreAllMocks() {
3453
+ __vitest__clearMocks__({ restoreMocks: true });
3454
+ spies.forEach((spy) => spy.mockRestore());
3455
+ return this;
3456
+ }
3457
+ }
3458
+ const vitest = new VitestUtils();
3459
+ const vi = vitest;
3460
+
3461
+ export { JestChaiExpect as J, getDefaultHookTimeout as a, getState as b, suite as c, describe as d, vi as e, format_1 as f, getCurrentSuite as g, getSerializers as h, it as i, equals as j, iterableEquality as k, subsetEquality as l, isA as m, clearContext as n, defaultSuite as o, plugins_1 as p, setHooks as q, getHooks as r, setState as s, test$7 as t, context as u, vitest as v, withTimeout as w, getFn as x };
3462
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmktMjUwOWZlNDMuanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9ydW50aW1lL2NoYWluLnRzIiwiLi4vc3JjL3J1bnRpbWUvY29udGV4dC50cyIsIi4uL3NyYy9ydW50aW1lL21hcC50cyIsIi4uL3NyYy9ydW50aW1lL3N1aXRlLnRzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2Fuc2ktc3R5bGVzQDUuMi4wL25vZGVfbW9kdWxlcy9hbnNpLXN0eWxlcy9pbmRleC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9wcmV0dHktZm9ybWF0QDI3LjQuNi9ub2RlX21vZHVsZXMvcHJldHR5LWZvcm1hdC9idWlsZC9jb2xsZWN0aW9ucy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9wcmV0dHktZm9ybWF0QDI3LjQuNi9ub2RlX21vZHVsZXMvcHJldHR5LWZvcm1hdC9idWlsZC9wbHVnaW5zL0FzeW1tZXRyaWNNYXRjaGVyLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2Fuc2ktcmVnZXhANS4wLjEvbm9kZV9tb2R1bGVzL2Fuc2ktcmVnZXgvaW5kZXguanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vcHJldHR5LWZvcm1hdEAyNy40LjYvbm9kZV9tb2R1bGVzL3ByZXR0eS1mb3JtYXQvYnVpbGQvcGx1Z2lucy9Db252ZXJ0QW5zaS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9wcmV0dHktZm9ybWF0QDI3LjQuNi9ub2RlX21vZHVsZXMvcHJldHR5LWZvcm1hdC9idWlsZC9wbHVnaW5zL0RPTUNvbGxlY3Rpb24uanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vcHJldHR5LWZvcm1hdEAyNy40LjYvbm9kZV9tb2R1bGVzL3ByZXR0eS1mb3JtYXQvYnVpbGQvcGx1Z2lucy9saWIvZXNjYXBlSFRNTC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9wcmV0dHktZm9ybWF0QDI3LjQuNi9ub2RlX21vZHVsZXMvcHJldHR5LWZvcm1hdC9idWlsZC9wbHVnaW5zL2xpYi9tYXJrdXAuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vcHJldHR5LWZvcm1hdEAyNy40LjYvbm9kZV9tb2R1bGVzL3ByZXR0eS1mb3JtYXQvYnVpbGQvcGx1Z2lucy9ET01FbGVtZW50LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3ByZXR0eS1mb3JtYXRAMjcuNC42L25vZGVfbW9kdWxlcy9wcmV0dHktZm9ybWF0L2J1aWxkL3BsdWdpbnMvSW1tdXRhYmxlLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3JlYWN0LWlzQDE3LjAuMi9ub2RlX21vZHVsZXMvcmVhY3QtaXMvY2pzL3JlYWN0LWlzLnByb2R1Y3Rpb24ubWluLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3JlYWN0LWlzQDE3LjAuMi9ub2RlX21vZHVsZXMvcmVhY3QtaXMvY2pzL3JlYWN0LWlzLmRldmVsb3BtZW50LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3JlYWN0LWlzQDE3LjAuMi9ub2RlX21vZHVsZXMvcmVhY3QtaXMvaW5kZXguanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vcHJldHR5LWZvcm1hdEAyNy40LjYvbm9kZV9tb2R1bGVzL3ByZXR0eS1mb3JtYXQvYnVpbGQvcGx1Z2lucy9SZWFjdEVsZW1lbnQuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vcHJldHR5LWZvcm1hdEAyNy40LjYvbm9kZV9tb2R1bGVzL3ByZXR0eS1mb3JtYXQvYnVpbGQvcGx1Z2lucy9SZWFjdFRlc3RDb21wb25lbnQuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vcHJldHR5LWZvcm1hdEAyNy40LjYvbm9kZV9tb2R1bGVzL3ByZXR0eS1mb3JtYXQvYnVpbGQvaW5kZXguanMiLCIuLi9zcmMvaW50ZWdyYXRpb25zL3NuYXBzaG90L3BvcnQvcGx1Z2lucy50cyIsIi4uL3NyYy9pbnRlZ3JhdGlvbnMvY2hhaS9qZXN0LXV0aWxzLnRzIiwiLi4vc3JjL2ludGVncmF0aW9ucy9jaGFpL2plc3QtZXhwZWN0LnRzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL21vY2tkYXRlQDMuMC41L25vZGVfbW9kdWxlcy9tb2NrZGF0ZS9saWIvbW9ja2RhdGUuanMiLCIuLi9zcmMvaW50ZWdyYXRpb25zL3RpbWVycy50cyIsIi4uL3NyYy9pbnRlZ3JhdGlvbnMvdmkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgQ2hhaW5hYmxlRnVuY3Rpb248VCBleHRlbmRzIHN0cmluZywgQXJncyBleHRlbmRzIGFueVtdLCBSID0gYW55PiA9IHtcbiAgKC4uLmFyZ3M6IEFyZ3MpOiBSXG59ICYge1xuICBbeCBpbiBUXTogQ2hhaW5hYmxlRnVuY3Rpb248VCwgQXJncywgUj5cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNoYWluYWJsZTxUIGV4dGVuZHMgc3RyaW5nLCBBcmdzIGV4dGVuZHMgYW55W10sIFIgPSBhbnk+KFxuICBrZXlzOiBUW10sXG4gIGZuOiAodGhpczogUmVjb3JkPFQsIGJvb2xlYW4gfCB1bmRlZmluZWQ+LCAuLi5hcmdzOiBBcmdzKSA9PiBSLFxuKTogQ2hhaW5hYmxlRnVuY3Rpb248VCwgQXJncywgUj4ge1xuICBmdW5jdGlvbiBjcmVhdGUob2JqOiBSZWNvcmQ8VCwgYm9vbGVhbiB8IHVuZGVmaW5lZD4pIHtcbiAgICBjb25zdCBjaGFpbiA9IGZ1bmN0aW9uKHRoaXM6IGFueSwgLi4uYXJnczogQXJncykge1xuICAgICAgcmV0dXJuIGZuLmFwcGx5KG9iaiwgYXJncylcbiAgICB9XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNoYWluLCBrZXksIHtcbiAgICAgICAgZ2V0KCkge1xuICAgICAgICAgIHJldHVybiBjcmVhdGUoeyAuLi5vYmosIFtrZXldOiB0cnVlIH0pXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgIH1cbiAgICByZXR1cm4gY2hhaW5cbiAgfVxuXG4gIGNvbnN0IGNoYWluID0gY3JlYXRlKHt9IGFzIGFueSkgYXMgYW55XG4gIGNoYWluLmZuID0gZm5cbiAgcmV0dXJuIGNoYWluXG59XG4iLCJpbXBvcnQgdHlwZSB7IEF3YWl0YWJsZSwgRG9uZUNhbGxiYWNrLCBSdW50aW1lQ29udGV4dCwgU3VpdGVDb2xsZWN0b3IsIFRlc3RGdW5jdGlvbiB9IGZyb20gJy4uL3R5cGVzJ1xuXG5leHBvcnQgY29uc3QgY29udGV4dDogUnVudGltZUNvbnRleHQgPSB7XG4gIHRhc2tzOiBbXSxcbiAgY3VycmVudFN1aXRlOiBudWxsLFxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29sbGVjdFRhc2sodGFzazogU3VpdGVDb2xsZWN0b3IpIHtcbiAgY29udGV4dC5jdXJyZW50U3VpdGU/LnRhc2tzLnB1c2godGFzaylcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bldpdGhTdWl0ZShzdWl0ZTogU3VpdGVDb2xsZWN0b3IsIGZuOiAoKCkgPT4gQXdhaXRhYmxlPHZvaWQ+KSkge1xuICBjb25zdCBwcmV2ID0gY29udGV4dC5jdXJyZW50U3VpdGVcbiAgY29udGV4dC5jdXJyZW50U3VpdGUgPSBzdWl0ZVxuICBhd2FpdCBmbigpXG4gIGNvbnRleHQuY3VycmVudFN1aXRlID0gcHJldlxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVmYXVsdFRlc3RUaW1lb3V0KCkge1xuICByZXR1cm4gcHJvY2Vzcy5fX3ZpdGVzdF93b3JrZXJfXyEuY29uZmlnIS50ZXN0VGltZW91dFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVmYXVsdEhvb2tUaW1lb3V0KCkge1xuICByZXR1cm4gcHJvY2Vzcy5fX3ZpdGVzdF93b3JrZXJfXyEuY29uZmlnIS5ob29rVGltZW91dFxufVxuXG5leHBvcnQgZnVuY3Rpb24gd2l0aFRpbWVvdXQ8VCBleHRlbmRzKCguLi5hcmdzOiBhbnlbXSkgPT4gYW55KT4oZm46IFQsIF90aW1lb3V0PzogbnVtYmVyKTogVCB7XG4gIGNvbnN0IHRpbWVvdXQgPSBfdGltZW91dCA/PyBnZXREZWZhdWx0VGVzdFRpbWVvdXQoKVxuICBpZiAodGltZW91dCA8PSAwIHx8IHRpbWVvdXQgPT09IEluZmluaXR5KVxuICAgIHJldHVybiBmblxuXG4gIHJldHVybiAoKC4uLmFyZ3M6IChUIGV4dGVuZHMgKCguLi5hcmdzOiBpbmZlciBBKSA9PiBhbnkpID8gQSA6IG5ldmVyKSkgPT4ge1xuICAgIHJldHVybiBQcm9taXNlLnJhY2UoW2ZuKC4uLmFyZ3MpLCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpXG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYFRlc3QgdGltZWQgb3V0IGluICR7dGltZW91dH1tcy5gKSlcbiAgICAgIH0sIHRpbWVvdXQpXG4gICAgICB0aW1lci51bnJlZigpXG4gICAgfSldKSBhcyBBd2FpdGFibGU8dm9pZD5cbiAgfSkgYXMgVFxufVxuXG5mdW5jdGlvbiBlbnN1cmVBc3luY1Rlc3QoZm46IFRlc3RGdW5jdGlvbik6ICgpID0+IEF3YWl0YWJsZTx2b2lkPiB7XG4gIGlmICghZm4ubGVuZ3RoKVxuICAgIHJldHVybiBmbiBhcyAoKSA9PiBBd2FpdGFibGU8dm9pZD5cblxuICByZXR1cm4gKCkgPT4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IGRvbmU6IERvbmVDYWxsYmFjayA9ICguLi5hcmdzOiBhbnlbXSkgPT4gYXJnc1swXSAvLyByZWplY3Qgb24gdHJ1dGh5IHZhbHVlc1xuICAgICAgPyByZWplY3QoYXJnc1swXSlcbiAgICAgIDogcmVzb2x2ZSgpXG4gICAgZm4oZG9uZSlcbiAgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVRlc3QoZm46IFRlc3RGdW5jdGlvbiwgdGltZW91dD86IG51bWJlcik6ICgpID0+IEF3YWl0YWJsZTx2b2lkPiB7XG4gIHJldHVybiB3aXRoVGltZW91dChlbnN1cmVBc3luY1Rlc3QoZm4pLCB0aW1lb3V0KVxufVxuIiwiaW1wb3J0IHR5cGUgeyBBd2FpdGFibGUsIFN1aXRlLCBTdWl0ZUhvb2tzLCBUZXN0IH0gZnJvbSAnLi4vdHlwZXMnXG5cbi8vIHVzZSBXZWFrTWFwIGhlcmUgdG8gbWFrZSB0aGUgVGVzdCBhbmQgU3VpdGUgb2JqZWN0IHNlcmlhbGl6YWJsZVxuY29uc3QgZm5NYXAgPSBuZXcgV2Vha01hcCgpXG5jb25zdCBob29rc01hcCA9IG5ldyBXZWFrTWFwKClcblxuZXhwb3J0IGZ1bmN0aW9uIHNldEZuKGtleTogVGVzdCwgZm46ICgpID0+IEF3YWl0YWJsZTx2b2lkPikge1xuICBmbk1hcC5zZXQoa2V5LCBmbilcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZuKGtleTogVGVzdCk6ICgpID0+IEF3YWl0YWJsZTx2b2lkPiB7XG4gIHJldHVybiBmbk1hcC5nZXQoa2V5KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0SG9va3Moa2V5OiBTdWl0ZSwgaG9va3M6IFN1aXRlSG9va3MpIHtcbiAgaG9va3NNYXAuc2V0KGtleSwgaG9va3MpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRIb29rcyhrZXk6IFN1aXRlKTogU3VpdGVIb29rcyB7XG4gIHJldHVybiBob29rc01hcC5nZXQoa2V5KVxufVxuIiwiaW1wb3J0IHR5cGUgeyBGaWxlLCBSdW5Nb2RlLCBTdWl0ZSwgU3VpdGVDb2xsZWN0b3IsIFN1aXRlSG9va3MsIFRlc3QsIFRlc3RDb2xsZWN0b3IsIFRlc3RGYWN0b3J5LCBUZXN0RnVuY3Rpb24gfSBmcm9tICcuLi90eXBlcydcbmltcG9ydCB7IG5vb3AgfSBmcm9tICcuLi91dGlscydcbmltcG9ydCB7IGNyZWF0ZUNoYWluYWJsZSB9IGZyb20gJy4vY2hhaW4nXG5pbXBvcnQgeyBjb2xsZWN0VGFzaywgY29udGV4dCwgbm9ybWFsaXplVGVzdCwgcnVuV2l0aFN1aXRlIH0gZnJvbSAnLi9jb250ZXh0J1xuaW1wb3J0IHsgZ2V0SG9va3MsIHNldEZuLCBzZXRIb29rcyB9IGZyb20gJy4vbWFwJ1xuXG4vLyBhcGlzXG5leHBvcnQgY29uc3Qgc3VpdGUgPSBjcmVhdGVTdWl0ZSgpXG5leHBvcnQgY29uc3QgdGVzdDogVGVzdENvbGxlY3RvciA9IGNyZWF0ZUNoYWluYWJsZShcbiAgWydjb25jdXJyZW50JywgJ3NraXAnLCAnb25seScsICd0b2RvJywgJ2ZhaWxzJ10sXG4gIGZ1bmN0aW9uKG5hbWU6IHN0cmluZywgZm4/OiBUZXN0RnVuY3Rpb24sIHRpbWVvdXQ/OiBudW1iZXIpIHtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHVudHlwZWQgaW50ZXJuYWwgcHJvcFxuICAgIGdldEN1cnJlbnRTdWl0ZSgpLnRlc3QuZm4uY2FsbCh0aGlzLCBuYW1lLCBmbiwgdGltZW91dClcbiAgfSxcbilcblxuLy8gYWxpYXNcbmV4cG9ydCBjb25zdCBkZXNjcmliZSA9IHN1aXRlXG5leHBvcnQgY29uc3QgaXQgPSB0ZXN0XG5cbi8vIGltcGxlbWVudGF0aW9uc1xuZXhwb3J0IGNvbnN0IGRlZmF1bHRTdWl0ZSA9IHN1aXRlKCcnKVxuXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJDb250ZXh0KCkge1xuICBjb250ZXh0LnRhc2tzLmxlbmd0aCA9IDBcbiAgZGVmYXVsdFN1aXRlLmNsZWFyKClcbiAgY29udGV4dC5jdXJyZW50U3VpdGUgPSBkZWZhdWx0U3VpdGVcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEN1cnJlbnRTdWl0ZSgpIHtcbiAgcmV0dXJuIGNvbnRleHQuY3VycmVudFN1aXRlIHx8IGRlZmF1bHRTdWl0ZVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU3VpdGVIb29rcygpIHtcbiAgcmV0dXJuIHtcbiAgICBiZWZvcmVBbGw6IFtdLFxuICAgIGFmdGVyQWxsOiBbXSxcbiAgICBiZWZvcmVFYWNoOiBbXSxcbiAgICBhZnRlckVhY2g6IFtdLFxuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVN1aXRlQ29sbGVjdG9yKG5hbWU6IHN0cmluZywgZmFjdG9yeTogVGVzdEZhY3RvcnkgPSAoKSA9PiB7IH0sIG1vZGU6IFJ1bk1vZGUsIGNvbmN1cnJlbnQ/OiBib29sZWFuKSB7XG4gIGNvbnN0IHRhc2tzOiAoVGVzdCB8IFN1aXRlIHwgU3VpdGVDb2xsZWN0b3IpW10gPSBbXVxuICBjb25zdCBmYWN0b3J5UXVldWU6IChUZXN0IHwgU3VpdGUgfCBTdWl0ZUNvbGxlY3RvcilbXSA9IFtdXG5cbiAgbGV0IHN1aXRlOiBTdWl0ZVxuXG4gIGluaXRTdWl0ZSgpXG5cbiAgY29uc3QgdGVzdCA9IGNyZWF0ZUNoYWluYWJsZShcbiAgICBbJ2NvbmN1cnJlbnQnLCAnc2tpcCcsICdvbmx5JywgJ3RvZG8nLCAnZmFpbHMnXSxcbiAgICBmdW5jdGlvbihuYW1lOiBzdHJpbmcsIGZuPzogVGVzdEZ1bmN0aW9uLCB0aW1lb3V0PzogbnVtYmVyKSB7XG4gICAgICBjb25zdCBtb2RlID0gdGhpcy5vbmx5ID8gJ29ubHknIDogdGhpcy5za2lwID8gJ3NraXAnIDogdGhpcy50b2RvID8gJ3RvZG8nIDogJ3J1bidcblxuICAgICAgY29uc3QgdGVzdDogVGVzdCA9IHtcbiAgICAgICAgaWQ6ICcnLFxuICAgICAgICB0eXBlOiAndGVzdCcsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIG1vZGUsXG4gICAgICAgIHN1aXRlOiB1bmRlZmluZWQhLFxuICAgICAgICBmYWlsczogdGhpcy5mYWlscyxcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNvbmN1cnJlbnQgfHwgY29uY3VycmVudClcbiAgICAgICAgdGVzdC5jb25jdXJyZW50ID0gdHJ1ZVxuXG4gICAgICBzZXRGbih0ZXN0LCBub3JtYWxpemVUZXN0KGZuIHx8IG5vb3AsIHRpbWVvdXQpKVxuICAgICAgdGFza3MucHVzaCh0ZXN0KVxuICAgIH0sXG4gIClcblxuICBjb25zdCBjb2xsZWN0b3I6IFN1aXRlQ29sbGVjdG9yID0ge1xuICAgIHR5cGU6ICdjb2xsZWN0b3InLFxuICAgIG5hbWUsXG4gICAgbW9kZSxcbiAgICB0ZXN0LFxuICAgIHRhc2tzLFxuICAgIGNvbGxlY3QsXG4gICAgY2xlYXIsXG4gICAgb246IGFkZEhvb2ssXG4gIH1cblxuICBmdW5jdGlvbiBhZGRIb29rPFQgZXh0ZW5kcyBrZXlvZiBTdWl0ZUhvb2tzPihuYW1lOiBULCAuLi5mbjogU3VpdGVIb29rc1tUXSkge1xuICAgIGdldEhvb2tzKHN1aXRlKVtuYW1lXS5wdXNoKC4uLmZuIGFzIGFueSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGluaXRTdWl0ZSgpIHtcbiAgICBzdWl0ZSA9IHtcbiAgICAgIGlkOiAnJyxcbiAgICAgIHR5cGU6ICdzdWl0ZScsXG4gICAgICBuYW1lLFxuICAgICAgbW9kZSxcbiAgICAgIHRhc2tzOiBbXSxcbiAgICB9XG4gICAgc2V0SG9va3Moc3VpdGUsIGNyZWF0ZVN1aXRlSG9va3MoKSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGNsZWFyKCkge1xuICAgIHRhc2tzLmxlbmd0aCA9IDBcbiAgICBmYWN0b3J5UXVldWUubGVuZ3RoID0gMFxuICAgIGluaXRTdWl0ZSgpXG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBjb2xsZWN0KGZpbGU/OiBGaWxlKSB7XG4gICAgZmFjdG9yeVF1ZXVlLmxlbmd0aCA9IDBcbiAgICBpZiAoZmFjdG9yeSlcbiAgICAgIGF3YWl0IHJ1bldpdGhTdWl0ZShjb2xsZWN0b3IsICgpID0+IGZhY3RvcnkodGVzdCkpXG5cbiAgICBjb25zdCBhbGxDaGlsZHJlbiA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgWy4uLmZhY3RvcnlRdWV1ZSwgLi4udGFza3NdXG4gICAgICAgIC5tYXAoaSA9PiBpLnR5cGUgPT09ICdjb2xsZWN0b3InID8gaS5jb2xsZWN0KGZpbGUpIDogaSksXG4gICAgKVxuXG4gICAgc3VpdGUuZmlsZSA9IGZpbGVcbiAgICBzdWl0ZS50YXNrcyA9IGFsbENoaWxkcmVuXG5cbiAgICBhbGxDaGlsZHJlbi5mb3JFYWNoKCh0YXNrKSA9PiB7XG4gICAgICB0YXNrLnN1aXRlID0gc3VpdGVcbiAgICAgIGlmIChmaWxlKVxuICAgICAgICB0YXNrLmZpbGUgPSBmaWxlXG4gICAgfSlcblxuICAgIHJldHVybiBzdWl0ZVxuICB9XG5cbiAgY29sbGVjdFRhc2soY29sbGVjdG9yKVxuXG4gIHJldHVybiBjb2xsZWN0b3Jcbn1cblxuZnVuY3Rpb24gY3JlYXRlU3VpdGUoKSB7XG4gIHJldHVybiBjcmVhdGVDaGFpbmFibGUoXG4gICAgWydjb25jdXJyZW50JywgJ3NraXAnLCAnb25seScsICd0b2RvJ10sXG4gICAgZnVuY3Rpb24obmFtZTogc3RyaW5nLCBmYWN0b3J5PzogVGVzdEZhY3RvcnkpIHtcbiAgICAgIGNvbnN0IG1vZGUgPSB0aGlzLm9ubHkgPyAnb25seScgOiB0aGlzLnNraXAgPyAnc2tpcCcgOiB0aGlzLnRvZG8gPyAndG9kbycgOiAncnVuJ1xuICAgICAgcmV0dXJuIGNyZWF0ZVN1aXRlQ29sbGVjdG9yKG5hbWUsIGZhY3RvcnksIG1vZGUsIHRoaXMuY29uY3VycmVudClcbiAgICB9LFxuICApXG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IEFOU0lfQkFDS0dST1VORF9PRkZTRVQgPSAxMDtcblxuY29uc3Qgd3JhcEFuc2kyNTYgPSAob2Zmc2V0ID0gMCkgPT4gY29kZSA9PiBgXFx1MDAxQlskezM4ICsgb2Zmc2V0fTs1OyR7Y29kZX1tYDtcblxuY29uc3Qgd3JhcEFuc2kxNm0gPSAob2Zmc2V0ID0gMCkgPT4gKHJlZCwgZ3JlZW4sIGJsdWUpID0+IGBcXHUwMDFCWyR7MzggKyBvZmZzZXR9OzI7JHtyZWR9OyR7Z3JlZW59OyR7Ymx1ZX1tYDtcblxuZnVuY3Rpb24gYXNzZW1ibGVTdHlsZXMoKSB7XG5cdGNvbnN0IGNvZGVzID0gbmV3IE1hcCgpO1xuXHRjb25zdCBzdHlsZXMgPSB7XG5cdFx0bW9kaWZpZXI6IHtcblx0XHRcdHJlc2V0OiBbMCwgMF0sXG5cdFx0XHQvLyAyMSBpc24ndCB3aWRlbHkgc3VwcG9ydGVkIGFuZCAyMiBkb2VzIHRoZSBzYW1lIHRoaW5nXG5cdFx0XHRib2xkOiBbMSwgMjJdLFxuXHRcdFx0ZGltOiBbMiwgMjJdLFxuXHRcdFx0aXRhbGljOiBbMywgMjNdLFxuXHRcdFx0dW5kZXJsaW5lOiBbNCwgMjRdLFxuXHRcdFx0b3ZlcmxpbmU6IFs1MywgNTVdLFxuXHRcdFx0aW52ZXJzZTogWzcsIDI3XSxcblx0XHRcdGhpZGRlbjogWzgsIDI4XSxcblx0XHRcdHN0cmlrZXRocm91Z2g6IFs5LCAyOV1cblx0XHR9LFxuXHRcdGNvbG9yOiB7XG5cdFx0XHRibGFjazogWzMwLCAzOV0sXG5cdFx0XHRyZWQ6IFszMSwgMzldLFxuXHRcdFx0Z3JlZW46IFszMiwgMzldLFxuXHRcdFx0eWVsbG93OiBbMzMsIDM5XSxcblx0XHRcdGJsdWU6IFszNCwgMzldLFxuXHRcdFx0bWFnZW50YTogWzM1LCAzOV0sXG5cdFx0XHRjeWFuOiBbMzYsIDM5XSxcblx0XHRcdHdoaXRlOiBbMzcsIDM5XSxcblxuXHRcdFx0Ly8gQnJpZ2h0IGNvbG9yXG5cdFx0XHRibGFja0JyaWdodDogWzkwLCAzOV0sXG5cdFx0XHRyZWRCcmlnaHQ6IFs5MSwgMzldLFxuXHRcdFx0Z3JlZW5CcmlnaHQ6IFs5MiwgMzldLFxuXHRcdFx0eWVsbG93QnJpZ2h0OiBbOTMsIDM5XSxcblx0XHRcdGJsdWVCcmlnaHQ6IFs5NCwgMzldLFxuXHRcdFx0bWFnZW50YUJyaWdodDogWzk1LCAzOV0sXG5cdFx0XHRjeWFuQnJpZ2h0OiBbOTYsIDM5XSxcblx0XHRcdHdoaXRlQnJpZ2h0OiBbOTcsIDM5XVxuXHRcdH0sXG5cdFx0YmdDb2xvcjoge1xuXHRcdFx0YmdCbGFjazogWzQwLCA0OV0sXG5cdFx0XHRiZ1JlZDogWzQxLCA0OV0sXG5cdFx0XHRiZ0dyZWVuOiBbNDIsIDQ5XSxcblx0XHRcdGJnWWVsbG93OiBbNDMsIDQ5XSxcblx0XHRcdGJnQmx1ZTogWzQ0LCA0OV0sXG5cdFx0XHRiZ01hZ2VudGE6IFs0NSwgNDldLFxuXHRcdFx0YmdDeWFuOiBbNDYsIDQ5XSxcblx0XHRcdGJnV2hpdGU6IFs0NywgNDldLFxuXG5cdFx0XHQvLyBCcmlnaHQgY29sb3Jcblx0XHRcdGJnQmxhY2tCcmlnaHQ6IFsxMDAsIDQ5XSxcblx0XHRcdGJnUmVkQnJpZ2h0OiBbMTAxLCA0OV0sXG5cdFx0XHRiZ0dyZWVuQnJpZ2h0OiBbMTAyLCA0OV0sXG5cdFx0XHRiZ1llbGxvd0JyaWdodDogWzEwMywgNDldLFxuXHRcdFx0YmdCbHVlQnJpZ2h0OiBbMTA0LCA0OV0sXG5cdFx0XHRiZ01hZ2VudGFCcmlnaHQ6IFsxMDUsIDQ5XSxcblx0XHRcdGJnQ3lhbkJyaWdodDogWzEwNiwgNDldLFxuXHRcdFx0YmdXaGl0ZUJyaWdodDogWzEwNywgNDldXG5cdFx0fVxuXHR9O1xuXG5cdC8vIEFsaWFzIGJyaWdodCBibGFjayBhcyBncmF5IChhbmQgZ3JleSlcblx0c3R5bGVzLmNvbG9yLmdyYXkgPSBzdHlsZXMuY29sb3IuYmxhY2tCcmlnaHQ7XG5cdHN0eWxlcy5iZ0NvbG9yLmJnR3JheSA9IHN0eWxlcy5iZ0NvbG9yLmJnQmxhY2tCcmlnaHQ7XG5cdHN0eWxlcy5jb2xvci5ncmV5ID0gc3R5bGVzLmNvbG9yLmJsYWNrQnJpZ2h0O1xuXHRzdHlsZXMuYmdDb2xvci5iZ0dyZXkgPSBzdHlsZXMuYmdDb2xvci5iZ0JsYWNrQnJpZ2h0O1xuXG5cdGZvciAoY29uc3QgW2dyb3VwTmFtZSwgZ3JvdXBdIG9mIE9iamVjdC5lbnRyaWVzKHN0eWxlcykpIHtcblx0XHRmb3IgKGNvbnN0IFtzdHlsZU5hbWUsIHN0eWxlXSBvZiBPYmplY3QuZW50cmllcyhncm91cCkpIHtcblx0XHRcdHN0eWxlc1tzdHlsZU5hbWVdID0ge1xuXHRcdFx0XHRvcGVuOiBgXFx1MDAxQlske3N0eWxlWzBdfW1gLFxuXHRcdFx0XHRjbG9zZTogYFxcdTAwMUJbJHtzdHlsZVsxXX1tYFxuXHRcdFx0fTtcblxuXHRcdFx0Z3JvdXBbc3R5bGVOYW1lXSA9IHN0eWxlc1tzdHlsZU5hbWVdO1xuXG5cdFx0XHRjb2Rlcy5zZXQoc3R5bGVbMF0sIHN0eWxlWzFdKTtcblx0XHR9XG5cblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoc3R5bGVzLCBncm91cE5hbWUsIHtcblx0XHRcdHZhbHVlOiBncm91cCxcblx0XHRcdGVudW1lcmFibGU6IGZhbHNlXG5cdFx0fSk7XG5cdH1cblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoc3R5bGVzLCAnY29kZXMnLCB7XG5cdFx0dmFsdWU6IGNvZGVzLFxuXHRcdGVudW1lcmFibGU6IGZhbHNlXG5cdH0pO1xuXG5cdHN0eWxlcy5jb2xvci5jbG9zZSA9ICdcXHUwMDFCWzM5bSc7XG5cdHN0eWxlcy5iZ0NvbG9yLmNsb3NlID0gJ1xcdTAwMUJbNDltJztcblxuXHRzdHlsZXMuY29sb3IuYW5zaTI1NiA9IHdyYXBBbnNpMjU2KCk7XG5cdHN0eWxlcy5jb2xvci5hbnNpMTZtID0gd3JhcEFuc2kxNm0oKTtcblx0c3R5bGVzLmJnQ29sb3IuYW5zaTI1NiA9IHdyYXBBbnNpMjU2KEFOU0lfQkFDS0dST1VORF9PRkZTRVQpO1xuXHRzdHlsZXMuYmdDb2xvci5hbnNpMTZtID0gd3JhcEFuc2kxNm0oQU5TSV9CQUNLR1JPVU5EX09GRlNFVCk7XG5cblx0Ly8gRnJvbSBodHRwczovL2dpdGh1Yi5jb20vUWl4LS9jb2xvci1jb252ZXJ0L2Jsb2IvM2YwZTBkNGU5MmUyMzU3OTZjY2IxN2Y2ZTg1YzcyMDk0YTY1MWY0OS9jb252ZXJzaW9ucy5qc1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydGllcyhzdHlsZXMsIHtcblx0XHRyZ2JUb0Fuc2kyNTY6IHtcblx0XHRcdHZhbHVlOiAocmVkLCBncmVlbiwgYmx1ZSkgPT4ge1xuXHRcdFx0XHQvLyBXZSB1c2UgdGhlIGV4dGVuZGVkIGdyZXlzY2FsZSBwYWxldHRlIGhlcmUsIHdpdGggdGhlIGV4Y2VwdGlvbiBvZlxuXHRcdFx0XHQvLyBibGFjayBhbmQgd2hpdGUuIG5vcm1hbCBwYWxldHRlIG9ubHkgaGFzIDQgZ3JleXNjYWxlIHNoYWRlcy5cblx0XHRcdFx0aWYgKHJlZCA9PT0gZ3JlZW4gJiYgZ3JlZW4gPT09IGJsdWUpIHtcblx0XHRcdFx0XHRpZiAocmVkIDwgOCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIDE2O1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmIChyZWQgPiAyNDgpIHtcblx0XHRcdFx0XHRcdHJldHVybiAyMzE7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIE1hdGgucm91bmQoKChyZWQgLSA4KSAvIDI0NykgKiAyNCkgKyAyMzI7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gMTYgK1xuXHRcdFx0XHRcdCgzNiAqIE1hdGgucm91bmQocmVkIC8gMjU1ICogNSkpICtcblx0XHRcdFx0XHQoNiAqIE1hdGgucm91bmQoZ3JlZW4gLyAyNTUgKiA1KSkgK1xuXHRcdFx0XHRcdE1hdGgucm91bmQoYmx1ZSAvIDI1NSAqIDUpO1xuXHRcdFx0fSxcblx0XHRcdGVudW1lcmFibGU6IGZhbHNlXG5cdFx0fSxcblx0XHRoZXhUb1JnYjoge1xuXHRcdFx0dmFsdWU6IGhleCA9PiB7XG5cdFx0XHRcdGNvbnN0IG1hdGNoZXMgPSAvKD88Y29sb3JTdHJpbmc+W2EtZlxcZF17Nn18W2EtZlxcZF17M30pL2kuZXhlYyhoZXgudG9TdHJpbmcoMTYpKTtcblx0XHRcdFx0aWYgKCFtYXRjaGVzKSB7XG5cdFx0XHRcdFx0cmV0dXJuIFswLCAwLCAwXTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGxldCB7Y29sb3JTdHJpbmd9ID0gbWF0Y2hlcy5ncm91cHM7XG5cblx0XHRcdFx0aWYgKGNvbG9yU3RyaW5nLmxlbmd0aCA9PT0gMykge1xuXHRcdFx0XHRcdGNvbG9yU3RyaW5nID0gY29sb3JTdHJpbmcuc3BsaXQoJycpLm1hcChjaGFyYWN0ZXIgPT4gY2hhcmFjdGVyICsgY2hhcmFjdGVyKS5qb2luKCcnKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IGludGVnZXIgPSBOdW1iZXIucGFyc2VJbnQoY29sb3JTdHJpbmcsIDE2KTtcblxuXHRcdFx0XHRyZXR1cm4gW1xuXHRcdFx0XHRcdChpbnRlZ2VyID4+IDE2KSAmIDB4RkYsXG5cdFx0XHRcdFx0KGludGVnZXIgPj4gOCkgJiAweEZGLFxuXHRcdFx0XHRcdGludGVnZXIgJiAweEZGXG5cdFx0XHRcdF07XG5cdFx0XHR9LFxuXHRcdFx0ZW51bWVyYWJsZTogZmFsc2Vcblx0XHR9LFxuXHRcdGhleFRvQW5zaTI1Njoge1xuXHRcdFx0dmFsdWU6IGhleCA9PiBzdHlsZXMucmdiVG9BbnNpMjU2KC4uLnN0eWxlcy5oZXhUb1JnYihoZXgpKSxcblx0XHRcdGVudW1lcmFibGU6IGZhbHNlXG5cdFx0fVxuXHR9KTtcblxuXHRyZXR1cm4gc3R5bGVzO1xufVxuXG4vLyBNYWtlIHRoZSBleHBvcnQgaW1tdXRhYmxlXG5PYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLCAnZXhwb3J0cycsIHtcblx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0Z2V0OiBhc3NlbWJsZVN0eWxlc1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5wcmludEl0ZXJhdG9yRW50cmllcyA9IHByaW50SXRlcmF0b3JFbnRyaWVzO1xuZXhwb3J0cy5wcmludEl0ZXJhdG9yVmFsdWVzID0gcHJpbnRJdGVyYXRvclZhbHVlcztcbmV4cG9ydHMucHJpbnRMaXN0SXRlbXMgPSBwcmludExpc3RJdGVtcztcbmV4cG9ydHMucHJpbnRPYmplY3RQcm9wZXJ0aWVzID0gcHJpbnRPYmplY3RQcm9wZXJ0aWVzO1xuXG4vKipcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICpcbiAqL1xuY29uc3QgZ2V0S2V5c09mRW51bWVyYWJsZVByb3BlcnRpZXMgPSAob2JqZWN0LCBjb21wYXJlS2V5cykgPT4ge1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KS5zb3J0KGNvbXBhcmVLZXlzKTtcblxuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KS5mb3JFYWNoKHN5bWJvbCA9PiB7XG4gICAgICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bWJvbCkuZW51bWVyYWJsZSkge1xuICAgICAgICBrZXlzLnB1c2goc3ltYm9sKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBrZXlzO1xufTtcbi8qKlxuICogUmV0dXJuIGVudHJpZXMgKGZvciBleGFtcGxlLCBvZiBhIG1hcClcbiAqIHdpdGggc3BhY2luZywgaW5kZW50YXRpb24sIGFuZCBjb21tYVxuICogd2l0aG91dCBzdXJyb3VuZGluZyBwdW5jdHVhdGlvbiAoZm9yIGV4YW1wbGUsIGJyYWNlcylcbiAqL1xuXG5mdW5jdGlvbiBwcmludEl0ZXJhdG9yRW50cmllcyhcbiAgaXRlcmF0b3IsXG4gIGNvbmZpZyxcbiAgaW5kZW50YXRpb24sXG4gIGRlcHRoLFxuICByZWZzLFxuICBwcmludGVyLCAvLyBUb28gYmFkLCBzbyBzYWQgdGhhdCBzZXBhcmF0b3IgZm9yIEVDTUFTY3JpcHQgTWFwIGhhcyBiZWVuICcgPT4gJ1xuICAvLyBXaGF0IGEgZGlzdHJhY3RpbmcgZGlmZiBpZiB5b3UgY2hhbmdlIGEgZGF0YSBzdHJ1Y3R1cmUgdG8vZnJvbVxuICAvLyBFQ01BU2NyaXB0IE9iamVjdCBvciBJbW11dGFibGUuTWFwL09yZGVyZWRNYXAgd2hpY2ggdXNlIHRoZSBkZWZhdWx0LlxuICBzZXBhcmF0b3IgPSAnOiAnXG4pIHtcbiAgbGV0IHJlc3VsdCA9ICcnO1xuICBsZXQgY3VycmVudCA9IGl0ZXJhdG9yLm5leHQoKTtcblxuICBpZiAoIWN1cnJlbnQuZG9uZSkge1xuICAgIHJlc3VsdCArPSBjb25maWcuc3BhY2luZ091dGVyO1xuICAgIGNvbnN0IGluZGVudGF0aW9uTmV4dCA9IGluZGVudGF0aW9uICsgY29uZmlnLmluZGVudDtcblxuICAgIHdoaWxlICghY3VycmVudC5kb25lKSB7XG4gICAgICBjb25zdCBuYW1lID0gcHJpbnRlcihcbiAgICAgICAgY3VycmVudC52YWx1ZVswXSxcbiAgICAgICAgY29uZmlnLFxuICAgICAgICBpbmRlbnRhdGlvbk5leHQsXG4gICAgICAgIGRlcHRoLFxuICAgICAgICByZWZzXG4gICAgICApO1xuICAgICAgY29uc3QgdmFsdWUgPSBwcmludGVyKFxuICAgICAgICBjdXJyZW50LnZhbHVlWzFdLFxuICAgICAgICBjb25maWcsXG4gICAgICAgIGluZGVudGF0aW9uTmV4dCxcbiAgICAgICAgZGVwdGgsXG4gICAgICAgIHJlZnNcbiAgICAgICk7XG4gICAgICByZXN1bHQgKz0gaW5kZW50YXRpb25OZXh0ICsgbmFtZSArIHNlcGFyYXRvciArIHZhbHVlO1xuICAgICAgY3VycmVudCA9IGl0ZXJhdG9yLm5leHQoKTtcblxuICAgICAgaWYgKCFjdXJyZW50LmRvbmUpIHtcbiAgICAgICAgcmVzdWx0ICs9ICcsJyArIGNvbmZpZy5zcGFjaW5nSW5uZXI7XG4gICAgICB9IGVsc2UgaWYgKCFjb25maWcubWluKSB7XG4gICAgICAgIHJlc3VsdCArPSAnLCc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmVzdWx0ICs9IGNvbmZpZy5zcGFjaW5nT3V0ZXIgKyBpbmRlbnRhdGlvbjtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG4vKipcbiAqIFJldHVybiB2YWx1ZXMgKGZvciBleGFtcGxlLCBvZiBhIHNldClcbiAqIHdpdGggc3BhY2luZywgaW5kZW50YXRpb24sIGFuZCBjb21tYVxuICogd2l0aG91dCBzdXJyb3VuZGluZyBwdW5jdHVhdGlvbiAoYnJhY2VzIG9yIGJyYWNrZXRzKVxuICovXG5cbmZ1bmN0aW9uIHByaW50SXRlcmF0b3JWYWx1ZXMoXG4gIGl0ZXJhdG9yLFxuICBjb25maWcsXG4gIGluZGVudGF0aW9uLFxuICBkZXB0aCxcbiAgcmVmcyxcbiAgcHJpbnRlclxuKSB7XG4gIGxldCByZXN1bHQgPSAnJztcbiAgbGV0IGN1cnJlbnQgPSBpdGVyYXRvci5uZXh0KCk7XG5cbiAgaWYgKCFjdXJyZW50LmRvbmUpIHtcbiAgICByZXN1bHQgKz0gY29uZmlnLnNwYWNpbmdPdXRlcjtcbiAgICBjb25zdCBpbmRlbnRhdGlvbk5leHQgPSBpbmRlbnRhdGlvbiArIGNvbmZpZy5pbmRlbnQ7XG5cbiAgICB3aGlsZSAoIWN1cnJlbnQuZG9uZSkge1xuICAgICAgcmVzdWx0ICs9XG4gICAgICAgIGluZGVudGF0aW9uTmV4dCArXG4gICAgICAgIHByaW50ZXIoY3VycmVudC52YWx1ZSwgY29uZmlnLCBpbmRlbnRhdGlvbk5leHQsIGRlcHRoLCByZWZzKTtcbiAgICAgIGN1cnJlbnQgPSBpdGVyYXRvci5uZXh0KCk7XG5cbiAgICAgIGlmICghY3VycmVudC5kb25lKSB7XG4gICAgICAgIHJlc3VsdCArPSAnLCcgKyBjb25maWcuc3BhY2luZ0lubmVyO1xuICAgICAgfSBlbHNlIGlmICghY29uZmlnLm1pbikge1xuICAgICAgICByZXN1bHQgKz0gJywnO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJlc3VsdCArPSBjb25maWcuc3BhY2luZ091dGVyICsgaW5kZW50YXRpb247XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG4gKiBSZXR1cm4gaXRlbXMgKGZvciBleGFtcGxlLCBvZiBhbiBhcnJheSlcbiAqIHdpdGggc3BhY2luZywgaW5kZW50YXRpb24sIGFuZCBjb21tYVxuICogd2l0aG91dCBzdXJyb3VuZGluZyBwdW5jdHVhdGlvbiAoZm9yIGV4YW1wbGUsIGJyYWNrZXRzKVxuICoqL1xuXG5mdW5jdGlvbiBwcmludExpc3RJdGVtcyhsaXN0LCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcywgcHJpbnRlcikge1xuICBsZXQgcmVzdWx0ID0gJyc7XG5cbiAgaWYgKGxpc3QubGVuZ3RoKSB7XG4gICAgcmVzdWx0ICs9IGNvbmZpZy5zcGFjaW5nT3V0ZXI7XG4gICAgY29uc3QgaW5kZW50YXRpb25OZXh0ID0gaW5kZW50YXRpb24gKyBjb25maWcuaW5kZW50O1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXN1bHQgKz0gaW5kZW50YXRpb25OZXh0O1xuXG4gICAgICBpZiAoaSBpbiBsaXN0KSB7XG4gICAgICAgIHJlc3VsdCArPSBwcmludGVyKGxpc3RbaV0sIGNvbmZpZywgaW5kZW50YXRpb25OZXh0LCBkZXB0aCwgcmVmcyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpIDwgbGlzdC5sZW5ndGggLSAxKSB7XG4gICAgICAgIHJlc3VsdCArPSAnLCcgKyBjb25maWcuc3BhY2luZ0lubmVyO1xuICAgICAgfSBlbHNlIGlmICghY29uZmlnLm1pbikge1xuICAgICAgICByZXN1bHQgKz0gJywnO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJlc3VsdCArPSBjb25maWcuc3BhY2luZ091dGVyICsgaW5kZW50YXRpb247XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG4gKiBSZXR1cm4gcHJvcGVydGllcyBvZiBhbiBvYmplY3RcbiAqIHdpdGggc3BhY2luZywgaW5kZW50YXRpb24sIGFuZCBjb21tYVxuICogd2l0aG91dCBzdXJyb3VuZGluZyBwdW5jdHVhdGlvbiAoZm9yIGV4YW1wbGUsIGJyYWNlcylcbiAqL1xuXG5mdW5jdGlvbiBwcmludE9iamVjdFByb3BlcnRpZXModmFsLCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcywgcHJpbnRlcikge1xuICBsZXQgcmVzdWx0ID0gJyc7XG4gIGNvbnN0IGtleXMgPSBnZXRLZXlzT2ZFbnVtZXJhYmxlUHJvcGVydGllcyh2YWwsIGNvbmZpZy5jb21wYXJlS2V5cyk7XG5cbiAgaWYgKGtleXMubGVuZ3RoKSB7XG4gICAgcmVzdWx0ICs9IGNvbmZpZy5zcGFjaW5nT3V0ZXI7XG4gICAgY29uc3QgaW5kZW50YXRpb25OZXh0ID0gaW5kZW50YXRpb24gKyBjb25maWcuaW5kZW50O1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBrZXkgPSBrZXlzW2ldO1xuICAgICAgY29uc3QgbmFtZSA9IHByaW50ZXIoa2V5LCBjb25maWcsIGluZGVudGF0aW9uTmV4dCwgZGVwdGgsIHJlZnMpO1xuICAgICAgY29uc3QgdmFsdWUgPSBwcmludGVyKHZhbFtrZXldLCBjb25maWcsIGluZGVudGF0aW9uTmV4dCwgZGVwdGgsIHJlZnMpO1xuICAgICAgcmVzdWx0ICs9IGluZGVudGF0aW9uTmV4dCArIG5hbWUgKyAnOiAnICsgdmFsdWU7XG5cbiAgICAgIGlmIChpIDwga2V5cy5sZW5ndGggLSAxKSB7XG4gICAgICAgIHJlc3VsdCArPSAnLCcgKyBjb25maWcuc3BhY2luZ0lubmVyO1xuICAgICAgfSBlbHNlIGlmICghY29uZmlnLm1pbikge1xuICAgICAgICByZXN1bHQgKz0gJywnO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJlc3VsdCArPSBjb25maWcuc3BhY2luZ091dGVyICsgaW5kZW50YXRpb247XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMudGVzdCA9IGV4cG9ydHMuc2VyaWFsaXplID0gZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgX2NvbGxlY3Rpb25zID0gcmVxdWlyZSgnLi4vY29sbGVjdGlvbnMnKTtcblxudmFyIGdsb2JhbCA9IChmdW5jdGlvbiAoKSB7XG4gIGlmICh0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gZ2xvYmFsVGhpcztcbiAgfSBlbHNlIGlmICh0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBnbG9iYWw7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIHNlbGY7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gd2luZG93O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuICB9XG59KSgpO1xuXG52YXIgU3ltYm9sID0gZ2xvYmFsWydqZXN0LXN5bWJvbC1kby1ub3QtdG91Y2gnXSB8fCBnbG9iYWwuU3ltYm9sO1xuY29uc3QgYXN5bW1ldHJpY01hdGNoZXIgPVxuICB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5mb3JcbiAgICA/IFN5bWJvbC5mb3IoJ2plc3QuYXN5bW1ldHJpY01hdGNoZXInKVxuICAgIDogMHgxMzU3YTU7XG5jb25zdCBTUEFDRSA9ICcgJztcblxuY29uc3Qgc2VyaWFsaXplID0gKHZhbCwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMsIHByaW50ZXIpID0+IHtcbiAgY29uc3Qgc3RyaW5nZWRWYWx1ZSA9IHZhbC50b1N0cmluZygpO1xuXG4gIGlmIChcbiAgICBzdHJpbmdlZFZhbHVlID09PSAnQXJyYXlDb250YWluaW5nJyB8fFxuICAgIHN0cmluZ2VkVmFsdWUgPT09ICdBcnJheU5vdENvbnRhaW5pbmcnXG4gICkge1xuICAgIGlmICgrK2RlcHRoID4gY29uZmlnLm1heERlcHRoKSB7XG4gICAgICByZXR1cm4gJ1snICsgc3RyaW5nZWRWYWx1ZSArICddJztcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgc3RyaW5nZWRWYWx1ZSArXG4gICAgICBTUEFDRSArXG4gICAgICAnWycgK1xuICAgICAgKDAsIF9jb2xsZWN0aW9ucy5wcmludExpc3RJdGVtcykoXG4gICAgICAgIHZhbC5zYW1wbGUsXG4gICAgICAgIGNvbmZpZyxcbiAgICAgICAgaW5kZW50YXRpb24sXG4gICAgICAgIGRlcHRoLFxuICAgICAgICByZWZzLFxuICAgICAgICBwcmludGVyXG4gICAgICApICtcbiAgICAgICddJ1xuICAgICk7XG4gIH1cblxuICBpZiAoXG4gICAgc3RyaW5nZWRWYWx1ZSA9PT0gJ09iamVjdENvbnRhaW5pbmcnIHx8XG4gICAgc3RyaW5nZWRWYWx1ZSA9PT0gJ09iamVjdE5vdENvbnRhaW5pbmcnXG4gICkge1xuICAgIGlmICgrK2RlcHRoID4gY29uZmlnLm1heERlcHRoKSB7XG4gICAgICByZXR1cm4gJ1snICsgc3RyaW5nZWRWYWx1ZSArICddJztcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgc3RyaW5nZWRWYWx1ZSArXG4gICAgICBTUEFDRSArXG4gICAgICAneycgK1xuICAgICAgKDAsIF9jb2xsZWN0aW9ucy5wcmludE9iamVjdFByb3BlcnRpZXMpKFxuICAgICAgICB2YWwuc2FtcGxlLFxuICAgICAgICBjb25maWcsXG4gICAgICAgIGluZGVudGF0aW9uLFxuICAgICAgICBkZXB0aCxcbiAgICAgICAgcmVmcyxcbiAgICAgICAgcHJpbnRlclxuICAgICAgKSArXG4gICAgICAnfSdcbiAgICApO1xuICB9XG5cbiAgaWYgKFxuICAgIHN0cmluZ2VkVmFsdWUgPT09ICdTdHJpbmdNYXRjaGluZycgfHxcbiAgICBzdHJpbmdlZFZhbHVlID09PSAnU3RyaW5nTm90TWF0Y2hpbmcnXG4gICkge1xuICAgIHJldHVybiAoXG4gICAgICBzdHJpbmdlZFZhbHVlICtcbiAgICAgIFNQQUNFICtcbiAgICAgIHByaW50ZXIodmFsLnNhbXBsZSwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMpXG4gICAgKTtcbiAgfVxuXG4gIGlmIChcbiAgICBzdHJpbmdlZFZhbHVlID09PSAnU3RyaW5nQ29udGFpbmluZycgfHxcbiAgICBzdHJpbmdlZFZhbHVlID09PSAnU3RyaW5nTm90Q29udGFpbmluZydcbiAgKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHN0cmluZ2VkVmFsdWUgK1xuICAgICAgU1BBQ0UgK1xuICAgICAgcHJpbnRlcih2YWwuc2FtcGxlLCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcylcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIHZhbC50b0FzeW1tZXRyaWNNYXRjaGVyKCk7XG59O1xuXG5leHBvcnRzLnNlcmlhbGl6ZSA9IHNlcmlhbGl6ZTtcblxuY29uc3QgdGVzdCA9IHZhbCA9PiB2YWwgJiYgdmFsLiQkdHlwZW9mID09PSBhc3ltbWV0cmljTWF0Y2hlcjtcblxuZXhwb3J0cy50ZXN0ID0gdGVzdDtcbmNvbnN0IHBsdWdpbiA9IHtcbiAgc2VyaWFsaXplLFxuICB0ZXN0XG59O1xudmFyIF9kZWZhdWx0ID0gcGx1Z2luO1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gKHtvbmx5Rmlyc3QgPSBmYWxzZX0gPSB7fSkgPT4ge1xuXHRjb25zdCBwYXR0ZXJuID0gW1xuXHRcdCdbXFxcXHUwMDFCXFxcXHUwMDlCXVtbXFxcXF0oKSM7P10qKD86KD86KD86KD86O1stYS16QS1aXFxcXGRcXFxcLyMmLjo9PyVAfl9dKykqfFthLXpBLVpcXFxcZF0rKD86O1stYS16QS1aXFxcXGRcXFxcLyMmLjo9PyVAfl9dKikqKT9cXFxcdTAwMDcpJyxcblx0XHQnKD86KD86XFxcXGR7MSw0fSg/OjtcXFxcZHswLDR9KSopP1tcXFxcZEEtUFItVFpjZi1udHFyeT0+PH5dKSknXG5cdF0uam9pbignfCcpO1xuXG5cdHJldHVybiBuZXcgUmVnRXhwKHBhdHRlcm4sIG9ubHlGaXJzdCA/IHVuZGVmaW5lZCA6ICdnJyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMudGVzdCA9IGV4cG9ydHMuc2VyaWFsaXplID0gZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgX2Fuc2lSZWdleCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZSgnYW5zaS1yZWdleCcpKTtcblxudmFyIF9hbnNpU3R5bGVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKCdhbnNpLXN0eWxlcycpKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHtcbiAgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHtkZWZhdWx0OiBvYmp9O1xufVxuXG4vKipcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5jb25zdCB0b0h1bWFuUmVhZGFibGVBbnNpID0gdGV4dCA9PlxuICB0ZXh0LnJlcGxhY2UoKDAsIF9hbnNpUmVnZXguZGVmYXVsdCkoKSwgbWF0Y2ggPT4ge1xuICAgIHN3aXRjaCAobWF0Y2gpIHtcbiAgICAgIGNhc2UgX2Fuc2lTdHlsZXMuZGVmYXVsdC5yZWQuY2xvc2U6XG4gICAgICBjYXNlIF9hbnNpU3R5bGVzLmRlZmF1bHQuZ3JlZW4uY2xvc2U6XG4gICAgICBjYXNlIF9hbnNpU3R5bGVzLmRlZmF1bHQuY3lhbi5jbG9zZTpcbiAgICAgIGNhc2UgX2Fuc2lTdHlsZXMuZGVmYXVsdC5ncmF5LmNsb3NlOlxuICAgICAgY2FzZSBfYW5zaVN0eWxlcy5kZWZhdWx0LndoaXRlLmNsb3NlOlxuICAgICAgY2FzZSBfYW5zaVN0eWxlcy5kZWZhdWx0LnllbGxvdy5jbG9zZTpcbiAgICAgIGNhc2UgX2Fuc2lTdHlsZXMuZGVmYXVsdC5iZ1JlZC5jbG9zZTpcbiAgICAgIGNhc2UgX2Fuc2lTdHlsZXMuZGVmYXVsdC5iZ0dyZWVuLmNsb3NlOlxuICAgICAgY2FzZSBfYW5zaVN0eWxlcy5kZWZhdWx0LmJnWWVsbG93LmNsb3NlOlxuICAgICAgY2FzZSBfYW5zaVN0eWxlcy5kZWZhdWx0LmludmVyc2UuY2xvc2U6XG4gICAgICBjYXNlIF9hbnNpU3R5bGVzLmRlZmF1bHQuZGltLmNsb3NlOlxuICAgICAgY2FzZSBfYW5zaVN0eWxlcy5kZWZhdWx0LmJvbGQuY2xvc2U6XG4gICAgICBjYXNlIF9hbnNpU3R5bGVzLmRlZmF1bHQucmVzZXQub3BlbjpcbiAgICAgIGNhc2UgX2Fuc2lTdHlsZXMuZGVmYXVsdC5yZXNldC5jbG9zZTpcbiAgICAgICAgcmV0dXJuICc8Lz4nO1xuXG4gICAgICBjYXNlIF9hbnNpU3R5bGVzLmRlZmF1bHQucmVkLm9wZW46XG4gICAgICAgIHJldHVybiAnPHJlZD4nO1xuXG4gICAgICBjYXNlIF9hbnNpU3R5bGVzLmRlZmF1bHQuZ3JlZW4ub3BlbjpcbiAgICAgICAgcmV0dXJuICc8Z3JlZW4+JztcblxuICAgICAgY2FzZSBfYW5zaVN0eWxlcy5kZWZhdWx0LmN5YW4ub3BlbjpcbiAgICAgICAgcmV0dXJuICc8Y3lhbj4nO1xuXG4gICAgICBjYXNlIF9hbnNpU3R5bGVzLmRlZmF1bHQuZ3JheS5vcGVuOlxuICAgICAgICByZXR1cm4gJzxncmF5Pic7XG5cbiAgICAgIGNhc2UgX2Fuc2lTdHlsZXMuZGVmYXVsdC53aGl0ZS5vcGVuOlxuICAgICAgICByZXR1cm4gJzx3aGl0ZT4nO1xuXG4gICAgICBjYXNlIF9hbnNpU3R5bGVzLmRlZmF1bHQueWVsbG93Lm9wZW46XG4gICAgICAgIHJldHVybiAnPHllbGxvdz4nO1xuXG4gICAgICBjYXNlIF9hbnNpU3R5bGVzLmRlZmF1bHQuYmdSZWQub3BlbjpcbiAgICAgICAgcmV0dXJuICc8YmdSZWQ+JztcblxuICAgICAgY2FzZSBfYW5zaVN0eWxlcy5kZWZhdWx0LmJnR3JlZW4ub3BlbjpcbiAgICAgICAgcmV0dXJuICc8YmdHcmVlbj4nO1xuXG4gICAgICBjYXNlIF9hbnNpU3R5bGVzLmRlZmF1bHQuYmdZZWxsb3cub3BlbjpcbiAgICAgICAgcmV0dXJuICc8YmdZZWxsb3c+JztcblxuICAgICAgY2FzZSBfYW5zaVN0eWxlcy5kZWZhdWx0LmludmVyc2Uub3BlbjpcbiAgICAgICAgcmV0dXJuICc8aW52ZXJzZT4nO1xuXG4gICAgICBjYXNlIF9hbnNpU3R5bGVzLmRlZmF1bHQuZGltLm9wZW46XG4gICAgICAgIHJldHVybiAnPGRpbT4nO1xuXG4gICAgICBjYXNlIF9hbnNpU3R5bGVzLmRlZmF1bHQuYm9sZC5vcGVuOlxuICAgICAgICByZXR1cm4gJzxib2xkPic7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG4gIH0pO1xuXG5jb25zdCB0ZXN0ID0gdmFsID0+XG4gIHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnICYmICEhdmFsLm1hdGNoKCgwLCBfYW5zaVJlZ2V4LmRlZmF1bHQpKCkpO1xuXG5leHBvcnRzLnRlc3QgPSB0ZXN0O1xuXG5jb25zdCBzZXJpYWxpemUgPSAodmFsLCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcywgcHJpbnRlcikgPT5cbiAgcHJpbnRlcih0b0h1bWFuUmVhZGFibGVBbnNpKHZhbCksIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzKTtcblxuZXhwb3J0cy5zZXJpYWxpemUgPSBzZXJpYWxpemU7XG5jb25zdCBwbHVnaW4gPSB7XG4gIHNlcmlhbGl6ZSxcbiAgdGVzdFxufTtcbnZhciBfZGVmYXVsdCA9IHBsdWdpbjtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMudGVzdCA9IGV4cG9ydHMuc2VyaWFsaXplID0gZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgX2NvbGxlY3Rpb25zID0gcmVxdWlyZSgnLi4vY29sbGVjdGlvbnMnKTtcblxuLyoqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBsb2NhbC9iYW4tdHlwZXMtZXZlbnR1YWxseSAqL1xuY29uc3QgU1BBQ0UgPSAnICc7XG5jb25zdCBPQkpFQ1RfTkFNRVMgPSBbJ0RPTVN0cmluZ01hcCcsICdOYW1lZE5vZGVNYXAnXTtcbmNvbnN0IEFSUkFZX1JFR0VYUCA9IC9eKEhUTUxcXHcqQ29sbGVjdGlvbnxOb2RlTGlzdCkkLztcblxuY29uc3QgdGVzdE5hbWUgPSBuYW1lID0+XG4gIE9CSkVDVF9OQU1FUy5pbmRleE9mKG5hbWUpICE9PSAtMSB8fCBBUlJBWV9SRUdFWFAudGVzdChuYW1lKTtcblxuY29uc3QgdGVzdCA9IHZhbCA9PlxuICB2YWwgJiZcbiAgdmFsLmNvbnN0cnVjdG9yICYmXG4gICEhdmFsLmNvbnN0cnVjdG9yLm5hbWUgJiZcbiAgdGVzdE5hbWUodmFsLmNvbnN0cnVjdG9yLm5hbWUpO1xuXG5leHBvcnRzLnRlc3QgPSB0ZXN0O1xuXG5jb25zdCBpc05hbWVkTm9kZU1hcCA9IGNvbGxlY3Rpb24gPT5cbiAgY29sbGVjdGlvbi5jb25zdHJ1Y3Rvci5uYW1lID09PSAnTmFtZWROb2RlTWFwJztcblxuY29uc3Qgc2VyaWFsaXplID0gKGNvbGxlY3Rpb24sIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBwcmludGVyKSA9PiB7XG4gIGNvbnN0IG5hbWUgPSBjb2xsZWN0aW9uLmNvbnN0cnVjdG9yLm5hbWU7XG5cbiAgaWYgKCsrZGVwdGggPiBjb25maWcubWF4RGVwdGgpIHtcbiAgICByZXR1cm4gJ1snICsgbmFtZSArICddJztcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgKGNvbmZpZy5taW4gPyAnJyA6IG5hbWUgKyBTUEFDRSkgK1xuICAgIChPQkpFQ1RfTkFNRVMuaW5kZXhPZihuYW1lKSAhPT0gLTFcbiAgICAgID8gJ3snICtcbiAgICAgICAgKDAsIF9jb2xsZWN0aW9ucy5wcmludE9iamVjdFByb3BlcnRpZXMpKFxuICAgICAgICAgIGlzTmFtZWROb2RlTWFwKGNvbGxlY3Rpb24pXG4gICAgICAgICAgICA/IEFycmF5LmZyb20oY29sbGVjdGlvbikucmVkdWNlKChwcm9wcywgYXR0cmlidXRlKSA9PiB7XG4gICAgICAgICAgICAgICAgcHJvcHNbYXR0cmlidXRlLm5hbWVdID0gYXR0cmlidXRlLnZhbHVlO1xuICAgICAgICAgICAgICAgIHJldHVybiBwcm9wcztcbiAgICAgICAgICAgICAgfSwge30pXG4gICAgICAgICAgICA6IHsuLi5jb2xsZWN0aW9ufSxcbiAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgaW5kZW50YXRpb24sXG4gICAgICAgICAgZGVwdGgsXG4gICAgICAgICAgcmVmcyxcbiAgICAgICAgICBwcmludGVyXG4gICAgICAgICkgK1xuICAgICAgICAnfSdcbiAgICAgIDogJ1snICtcbiAgICAgICAgKDAsIF9jb2xsZWN0aW9ucy5wcmludExpc3RJdGVtcykoXG4gICAgICAgICAgQXJyYXkuZnJvbShjb2xsZWN0aW9uKSxcbiAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgaW5kZW50YXRpb24sXG4gICAgICAgICAgZGVwdGgsXG4gICAgICAgICAgcmVmcyxcbiAgICAgICAgICBwcmludGVyXG4gICAgICAgICkgK1xuICAgICAgICAnXScpXG4gICk7XG59O1xuXG5leHBvcnRzLnNlcmlhbGl6ZSA9IHNlcmlhbGl6ZTtcbmNvbnN0IHBsdWdpbiA9IHtcbiAgc2VyaWFsaXplLFxuICB0ZXN0XG59O1xudmFyIF9kZWZhdWx0ID0gcGx1Z2luO1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7XG4iLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gZXNjYXBlSFRNTDtcblxuLyoqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuZnVuY3Rpb24gZXNjYXBlSFRNTChzdHIpIHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC88L2csICcmbHQ7JykucmVwbGFjZSgvPi9nLCAnJmd0OycpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMucHJpbnRUZXh0ID1cbiAgZXhwb3J0cy5wcmludFByb3BzID1cbiAgZXhwb3J0cy5wcmludEVsZW1lbnRBc0xlYWYgPVxuICBleHBvcnRzLnByaW50RWxlbWVudCA9XG4gIGV4cG9ydHMucHJpbnRDb21tZW50ID1cbiAgZXhwb3J0cy5wcmludENoaWxkcmVuID1cbiAgICB2b2lkIDA7XG5cbnZhciBfZXNjYXBlSFRNTCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZSgnLi9lc2NhcGVIVE1MJykpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikge1xuICByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDoge2RlZmF1bHQ6IG9ian07XG59XG5cbi8qKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cbi8vIFJldHVybiBlbXB0eSBzdHJpbmcgaWYga2V5cyBpcyBlbXB0eS5cbmNvbnN0IHByaW50UHJvcHMgPSAoa2V5cywgcHJvcHMsIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBwcmludGVyKSA9PiB7XG4gIGNvbnN0IGluZGVudGF0aW9uTmV4dCA9IGluZGVudGF0aW9uICsgY29uZmlnLmluZGVudDtcbiAgY29uc3QgY29sb3JzID0gY29uZmlnLmNvbG9ycztcbiAgcmV0dXJuIGtleXNcbiAgICAubWFwKGtleSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHByb3BzW2tleV07XG4gICAgICBsZXQgcHJpbnRlZCA9IHByaW50ZXIodmFsdWUsIGNvbmZpZywgaW5kZW50YXRpb25OZXh0LCBkZXB0aCwgcmVmcyk7XG5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmIChwcmludGVkLmluZGV4T2YoJ1xcbicpICE9PSAtMSkge1xuICAgICAgICAgIHByaW50ZWQgPVxuICAgICAgICAgICAgY29uZmlnLnNwYWNpbmdPdXRlciArXG4gICAgICAgICAgICBpbmRlbnRhdGlvbk5leHQgK1xuICAgICAgICAgICAgcHJpbnRlZCArXG4gICAgICAgICAgICBjb25maWcuc3BhY2luZ091dGVyICtcbiAgICAgICAgICAgIGluZGVudGF0aW9uO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJpbnRlZCA9ICd7JyArIHByaW50ZWQgKyAnfSc7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNvbmZpZy5zcGFjaW5nSW5uZXIgK1xuICAgICAgICBpbmRlbnRhdGlvbiArXG4gICAgICAgIGNvbG9ycy5wcm9wLm9wZW4gK1xuICAgICAgICBrZXkgK1xuICAgICAgICBjb2xvcnMucHJvcC5jbG9zZSArXG4gICAgICAgICc9JyArXG4gICAgICAgIGNvbG9ycy52YWx1ZS5vcGVuICtcbiAgICAgICAgcHJpbnRlZCArXG4gICAgICAgIGNvbG9ycy52YWx1ZS5jbG9zZVxuICAgICAgKTtcbiAgICB9KVxuICAgIC5qb2luKCcnKTtcbn07IC8vIFJldHVybiBlbXB0eSBzdHJpbmcgaWYgY2hpbGRyZW4gaXMgZW1wdHkuXG5cbmV4cG9ydHMucHJpbnRQcm9wcyA9IHByaW50UHJvcHM7XG5cbmNvbnN0IHByaW50Q2hpbGRyZW4gPSAoY2hpbGRyZW4sIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBwcmludGVyKSA9PlxuICBjaGlsZHJlblxuICAgIC5tYXAoXG4gICAgICBjaGlsZCA9PlxuICAgICAgICBjb25maWcuc3BhY2luZ091dGVyICtcbiAgICAgICAgaW5kZW50YXRpb24gK1xuICAgICAgICAodHlwZW9mIGNoaWxkID09PSAnc3RyaW5nJ1xuICAgICAgICAgID8gcHJpbnRUZXh0KGNoaWxkLCBjb25maWcpXG4gICAgICAgICAgOiBwcmludGVyKGNoaWxkLCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcykpXG4gICAgKVxuICAgIC5qb2luKCcnKTtcblxuZXhwb3J0cy5wcmludENoaWxkcmVuID0gcHJpbnRDaGlsZHJlbjtcblxuY29uc3QgcHJpbnRUZXh0ID0gKHRleHQsIGNvbmZpZykgPT4ge1xuICBjb25zdCBjb250ZW50Q29sb3IgPSBjb25maWcuY29sb3JzLmNvbnRlbnQ7XG4gIHJldHVybiAoXG4gICAgY29udGVudENvbG9yLm9wZW4gKyAoMCwgX2VzY2FwZUhUTUwuZGVmYXVsdCkodGV4dCkgKyBjb250ZW50Q29sb3IuY2xvc2VcbiAgKTtcbn07XG5cbmV4cG9ydHMucHJpbnRUZXh0ID0gcHJpbnRUZXh0O1xuXG5jb25zdCBwcmludENvbW1lbnQgPSAoY29tbWVudCwgY29uZmlnKSA9PiB7XG4gIGNvbnN0IGNvbW1lbnRDb2xvciA9IGNvbmZpZy5jb2xvcnMuY29tbWVudDtcbiAgcmV0dXJuIChcbiAgICBjb21tZW50Q29sb3Iub3BlbiArXG4gICAgJzwhLS0nICtcbiAgICAoMCwgX2VzY2FwZUhUTUwuZGVmYXVsdCkoY29tbWVudCkgK1xuICAgICctLT4nICtcbiAgICBjb21tZW50Q29sb3IuY2xvc2VcbiAgKTtcbn07IC8vIFNlcGFyYXRlIHRoZSBmdW5jdGlvbnMgdG8gZm9ybWF0IHByb3BzLCBjaGlsZHJlbiwgYW5kIGVsZW1lbnQsXG4vLyBzbyBhIHBsdWdpbiBjb3VsZCBvdmVycmlkZSBhIHBhcnRpY3VsYXIgZnVuY3Rpb24sIGlmIG5lZWRlZC5cbi8vIFRvbyBiYWQsIHNvIHNhZDogdGhlIHRyYWRpdGlvbmFsIChidXQgdW5uZWNlc3NhcnkpIHNwYWNlXG4vLyBpbiBhIHNlbGYtY2xvc2luZyB0YWdDb2xvciByZXF1aXJlcyBhIHNlY29uZCB0ZXN0IG9mIHByaW50ZWRQcm9wcy5cblxuZXhwb3J0cy5wcmludENvbW1lbnQgPSBwcmludENvbW1lbnQ7XG5cbmNvbnN0IHByaW50RWxlbWVudCA9IChcbiAgdHlwZSxcbiAgcHJpbnRlZFByb3BzLFxuICBwcmludGVkQ2hpbGRyZW4sXG4gIGNvbmZpZyxcbiAgaW5kZW50YXRpb25cbikgPT4ge1xuICBjb25zdCB0YWdDb2xvciA9IGNvbmZpZy5jb2xvcnMudGFnO1xuICByZXR1cm4gKFxuICAgIHRhZ0NvbG9yLm9wZW4gK1xuICAgICc8JyArXG4gICAgdHlwZSArXG4gICAgKHByaW50ZWRQcm9wcyAmJlxuICAgICAgdGFnQ29sb3IuY2xvc2UgK1xuICAgICAgICBwcmludGVkUHJvcHMgK1xuICAgICAgICBjb25maWcuc3BhY2luZ091dGVyICtcbiAgICAgICAgaW5kZW50YXRpb24gK1xuICAgICAgICB0YWdDb2xvci5vcGVuKSArXG4gICAgKHByaW50ZWRDaGlsZHJlblxuICAgICAgPyAnPicgK1xuICAgICAgICB0YWdDb2xvci5jbG9zZSArXG4gICAgICAgIHByaW50ZWRDaGlsZHJlbiArXG4gICAgICAgIGNvbmZpZy5zcGFjaW5nT3V0ZXIgK1xuICAgICAgICBpbmRlbnRhdGlvbiArXG4gICAgICAgIHRhZ0NvbG9yLm9wZW4gK1xuICAgICAgICAnPC8nICtcbiAgICAgICAgdHlwZVxuICAgICAgOiAocHJpbnRlZFByb3BzICYmICFjb25maWcubWluID8gJycgOiAnICcpICsgJy8nKSArXG4gICAgJz4nICtcbiAgICB0YWdDb2xvci5jbG9zZVxuICApO1xufTtcblxuZXhwb3J0cy5wcmludEVsZW1lbnQgPSBwcmludEVsZW1lbnQ7XG5cbmNvbnN0IHByaW50RWxlbWVudEFzTGVhZiA9ICh0eXBlLCBjb25maWcpID0+IHtcbiAgY29uc3QgdGFnQ29sb3IgPSBjb25maWcuY29sb3JzLnRhZztcbiAgcmV0dXJuIChcbiAgICB0YWdDb2xvci5vcGVuICtcbiAgICAnPCcgK1xuICAgIHR5cGUgK1xuICAgIHRhZ0NvbG9yLmNsb3NlICtcbiAgICAnIOKApicgK1xuICAgIHRhZ0NvbG9yLm9wZW4gK1xuICAgICcgLz4nICtcbiAgICB0YWdDb2xvci5jbG9zZVxuICApO1xufTtcblxuZXhwb3J0cy5wcmludEVsZW1lbnRBc0xlYWYgPSBwcmludEVsZW1lbnRBc0xlYWY7XG4iLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy50ZXN0ID0gZXhwb3J0cy5zZXJpYWxpemUgPSBleHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBfbWFya3VwID0gcmVxdWlyZSgnLi9saWIvbWFya3VwJyk7XG5cbi8qKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cbmNvbnN0IEVMRU1FTlRfTk9ERSA9IDE7XG5jb25zdCBURVhUX05PREUgPSAzO1xuY29uc3QgQ09NTUVOVF9OT0RFID0gODtcbmNvbnN0IEZSQUdNRU5UX05PREUgPSAxMTtcbmNvbnN0IEVMRU1FTlRfUkVHRVhQID0gL14oKEhUTUx8U1ZHKVxcdyopP0VsZW1lbnQkLztcblxuY29uc3QgdGVzdEhhc0F0dHJpYnV0ZSA9IHZhbCA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWwuaGFzQXR0cmlidXRlID09PSAnZnVuY3Rpb24nICYmIHZhbC5oYXNBdHRyaWJ1dGUoJ2lzJyk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxuY29uc3QgdGVzdE5vZGUgPSB2YWwgPT4ge1xuICBjb25zdCBjb25zdHJ1Y3Rvck5hbWUgPSB2YWwuY29uc3RydWN0b3IubmFtZTtcbiAgY29uc3Qge25vZGVUeXBlLCB0YWdOYW1lfSA9IHZhbDtcbiAgY29uc3QgaXNDdXN0b21FbGVtZW50ID1cbiAgICAodHlwZW9mIHRhZ05hbWUgPT09ICdzdHJpbmcnICYmIHRhZ05hbWUuaW5jbHVkZXMoJy0nKSkgfHxcbiAgICB0ZXN0SGFzQXR0cmlidXRlKHZhbCk7XG4gIHJldHVybiAoXG4gICAgKG5vZGVUeXBlID09PSBFTEVNRU5UX05PREUgJiZcbiAgICAgIChFTEVNRU5UX1JFR0VYUC50ZXN0KGNvbnN0cnVjdG9yTmFtZSkgfHwgaXNDdXN0b21FbGVtZW50KSkgfHxcbiAgICAobm9kZVR5cGUgPT09IFRFWFRfTk9ERSAmJiBjb25zdHJ1Y3Rvck5hbWUgPT09ICdUZXh0JykgfHxcbiAgICAobm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSAmJiBjb25zdHJ1Y3Rvck5hbWUgPT09ICdDb21tZW50JykgfHxcbiAgICAobm9kZVR5cGUgPT09IEZSQUdNRU5UX05PREUgJiYgY29uc3RydWN0b3JOYW1lID09PSAnRG9jdW1lbnRGcmFnbWVudCcpXG4gICk7XG59O1xuXG5jb25zdCB0ZXN0ID0gdmFsID0+IHtcbiAgdmFyIF92YWwkY29uc3RydWN0b3I7XG5cbiAgcmV0dXJuIChcbiAgICAodmFsID09PSBudWxsIHx8IHZhbCA9PT0gdm9pZCAwXG4gICAgICA/IHZvaWQgMFxuICAgICAgOiAoX3ZhbCRjb25zdHJ1Y3RvciA9IHZhbC5jb25zdHJ1Y3RvcikgPT09IG51bGwgfHxcbiAgICAgICAgX3ZhbCRjb25zdHJ1Y3RvciA9PT0gdm9pZCAwXG4gICAgICA/IHZvaWQgMFxuICAgICAgOiBfdmFsJGNvbnN0cnVjdG9yLm5hbWUpICYmIHRlc3ROb2RlKHZhbClcbiAgKTtcbn07XG5cbmV4cG9ydHMudGVzdCA9IHRlc3Q7XG5cbmZ1bmN0aW9uIG5vZGVJc1RleHQobm9kZSkge1xuICByZXR1cm4gbm9kZS5ub2RlVHlwZSA9PT0gVEVYVF9OT0RFO1xufVxuXG5mdW5jdGlvbiBub2RlSXNDb21tZW50KG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERTtcbn1cblxuZnVuY3Rpb24gbm9kZUlzRnJhZ21lbnQobm9kZSkge1xuICByZXR1cm4gbm9kZS5ub2RlVHlwZSA9PT0gRlJBR01FTlRfTk9ERTtcbn1cblxuY29uc3Qgc2VyaWFsaXplID0gKG5vZGUsIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBwcmludGVyKSA9PiB7XG4gIGlmIChub2RlSXNUZXh0KG5vZGUpKSB7XG4gICAgcmV0dXJuICgwLCBfbWFya3VwLnByaW50VGV4dCkobm9kZS5kYXRhLCBjb25maWcpO1xuICB9XG5cbiAgaWYgKG5vZGVJc0NvbW1lbnQobm9kZSkpIHtcbiAgICByZXR1cm4gKDAsIF9tYXJrdXAucHJpbnRDb21tZW50KShub2RlLmRhdGEsIGNvbmZpZyk7XG4gIH1cblxuICBjb25zdCB0eXBlID0gbm9kZUlzRnJhZ21lbnQobm9kZSlcbiAgICA/IGBEb2N1bWVudEZyYWdtZW50YFxuICAgIDogbm9kZS50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgaWYgKCsrZGVwdGggPiBjb25maWcubWF4RGVwdGgpIHtcbiAgICByZXR1cm4gKDAsIF9tYXJrdXAucHJpbnRFbGVtZW50QXNMZWFmKSh0eXBlLCBjb25maWcpO1xuICB9XG5cbiAgcmV0dXJuICgwLCBfbWFya3VwLnByaW50RWxlbWVudCkoXG4gICAgdHlwZSxcbiAgICAoMCwgX21hcmt1cC5wcmludFByb3BzKShcbiAgICAgIG5vZGVJc0ZyYWdtZW50KG5vZGUpXG4gICAgICAgID8gW11cbiAgICAgICAgOiBBcnJheS5mcm9tKG5vZGUuYXR0cmlidXRlcylcbiAgICAgICAgICAgIC5tYXAoYXR0ciA9PiBhdHRyLm5hbWUpXG4gICAgICAgICAgICAuc29ydCgpLFxuICAgICAgbm9kZUlzRnJhZ21lbnQobm9kZSlcbiAgICAgICAgPyB7fVxuICAgICAgICA6IEFycmF5LmZyb20obm9kZS5hdHRyaWJ1dGVzKS5yZWR1Y2UoKHByb3BzLCBhdHRyaWJ1dGUpID0+IHtcbiAgICAgICAgICAgIHByb3BzW2F0dHJpYnV0ZS5uYW1lXSA9IGF0dHJpYnV0ZS52YWx1ZTtcbiAgICAgICAgICAgIHJldHVybiBwcm9wcztcbiAgICAgICAgICB9LCB7fSksXG4gICAgICBjb25maWcsXG4gICAgICBpbmRlbnRhdGlvbiArIGNvbmZpZy5pbmRlbnQsXG4gICAgICBkZXB0aCxcbiAgICAgIHJlZnMsXG4gICAgICBwcmludGVyXG4gICAgKSxcbiAgICAoMCwgX21hcmt1cC5wcmludENoaWxkcmVuKShcbiAgICAgIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKG5vZGUuY2hpbGROb2RlcyB8fCBub2RlLmNoaWxkcmVuKSxcbiAgICAgIGNvbmZpZyxcbiAgICAgIGluZGVudGF0aW9uICsgY29uZmlnLmluZGVudCxcbiAgICAgIGRlcHRoLFxuICAgICAgcmVmcyxcbiAgICAgIHByaW50ZXJcbiAgICApLFxuICAgIGNvbmZpZyxcbiAgICBpbmRlbnRhdGlvblxuICApO1xufTtcblxuZXhwb3J0cy5zZXJpYWxpemUgPSBzZXJpYWxpemU7XG5jb25zdCBwbHVnaW4gPSB7XG4gIHNlcmlhbGl6ZSxcbiAgdGVzdFxufTtcbnZhciBfZGVmYXVsdCA9IHBsdWdpbjtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMudGVzdCA9IGV4cG9ydHMuc2VyaWFsaXplID0gZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgX2NvbGxlY3Rpb25zID0gcmVxdWlyZSgnLi4vY29sbGVjdGlvbnMnKTtcblxuLyoqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuLy8gU0VOVElORUwgY29uc3RhbnRzIGFyZSBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9pbW11dGFibGUtanNcbmNvbnN0IElTX0lURVJBQkxFX1NFTlRJTkVMID0gJ0BAX19JTU1VVEFCTEVfSVRFUkFCTEVfX0BAJztcbmNvbnN0IElTX0xJU1RfU0VOVElORUwgPSAnQEBfX0lNTVVUQUJMRV9MSVNUX19AQCc7XG5jb25zdCBJU19LRVlFRF9TRU5USU5FTCA9ICdAQF9fSU1NVVRBQkxFX0tFWUVEX19AQCc7XG5jb25zdCBJU19NQVBfU0VOVElORUwgPSAnQEBfX0lNTVVUQUJMRV9NQVBfX0BAJztcbmNvbnN0IElTX09SREVSRURfU0VOVElORUwgPSAnQEBfX0lNTVVUQUJMRV9PUkRFUkVEX19AQCc7XG5jb25zdCBJU19SRUNPUkRfU0VOVElORUwgPSAnQEBfX0lNTVVUQUJMRV9SRUNPUkRfX0BAJzsgLy8gaW1tdXRhYmxlIHY0XG5cbmNvbnN0IElTX1NFUV9TRU5USU5FTCA9ICdAQF9fSU1NVVRBQkxFX1NFUV9fQEAnO1xuY29uc3QgSVNfU0VUX1NFTlRJTkVMID0gJ0BAX19JTU1VVEFCTEVfU0VUX19AQCc7XG5jb25zdCBJU19TVEFDS19TRU5USU5FTCA9ICdAQF9fSU1NVVRBQkxFX1NUQUNLX19AQCc7XG5cbmNvbnN0IGdldEltbXV0YWJsZU5hbWUgPSBuYW1lID0+ICdJbW11dGFibGUuJyArIG5hbWU7XG5cbmNvbnN0IHByaW50QXNMZWFmID0gbmFtZSA9PiAnWycgKyBuYW1lICsgJ10nO1xuXG5jb25zdCBTUEFDRSA9ICcgJztcbmNvbnN0IExBWlkgPSAn4oCmJzsgLy8gU2VxIGlzIGxhenkgaWYgaXQgY2FsbHMgYSBtZXRob2QgbGlrZSBmaWx0ZXJcblxuY29uc3QgcHJpbnRJbW11dGFibGVFbnRyaWVzID0gKFxuICB2YWwsXG4gIGNvbmZpZyxcbiAgaW5kZW50YXRpb24sXG4gIGRlcHRoLFxuICByZWZzLFxuICBwcmludGVyLFxuICB0eXBlXG4pID0+XG4gICsrZGVwdGggPiBjb25maWcubWF4RGVwdGhcbiAgICA/IHByaW50QXNMZWFmKGdldEltbXV0YWJsZU5hbWUodHlwZSkpXG4gICAgOiBnZXRJbW11dGFibGVOYW1lKHR5cGUpICtcbiAgICAgIFNQQUNFICtcbiAgICAgICd7JyArXG4gICAgICAoMCwgX2NvbGxlY3Rpb25zLnByaW50SXRlcmF0b3JFbnRyaWVzKShcbiAgICAgICAgdmFsLmVudHJpZXMoKSxcbiAgICAgICAgY29uZmlnLFxuICAgICAgICBpbmRlbnRhdGlvbixcbiAgICAgICAgZGVwdGgsXG4gICAgICAgIHJlZnMsXG4gICAgICAgIHByaW50ZXJcbiAgICAgICkgK1xuICAgICAgJ30nOyAvLyBSZWNvcmQgaGFzIGFuIGVudHJpZXMgbWV0aG9kIGJlY2F1c2UgaXQgaXMgYSBjb2xsZWN0aW9uIGluIGltbXV0YWJsZSB2My5cbi8vIFJldHVybiBhbiBpdGVyYXRvciBmb3IgSW1tdXRhYmxlIFJlY29yZCBmcm9tIHZlcnNpb24gdjMgb3IgdjQuXG5cbmZ1bmN0aW9uIGdldFJlY29yZEVudHJpZXModmFsKSB7XG4gIGxldCBpID0gMDtcbiAgcmV0dXJuIHtcbiAgICBuZXh0KCkge1xuICAgICAgaWYgKGkgPCB2YWwuX2tleXMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IHZhbC5fa2V5c1tpKytdO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGRvbmU6IGZhbHNlLFxuICAgICAgICAgIHZhbHVlOiBba2V5LCB2YWwuZ2V0KGtleSldXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRvbmU6IHRydWUsXG4gICAgICAgIHZhbHVlOiB1bmRlZmluZWRcbiAgICAgIH07XG4gICAgfVxuICB9O1xufVxuXG5jb25zdCBwcmludEltbXV0YWJsZVJlY29yZCA9IChcbiAgdmFsLFxuICBjb25maWcsXG4gIGluZGVudGF0aW9uLFxuICBkZXB0aCxcbiAgcmVmcyxcbiAgcHJpbnRlclxuKSA9PiB7XG4gIC8vIF9uYW1lIHByb3BlcnR5IGlzIGRlZmluZWQgb25seSBmb3IgYW4gSW1tdXRhYmxlIFJlY29yZCBpbnN0YW5jZVxuICAvLyB3aGljaCB3YXMgY29uc3RydWN0ZWQgd2l0aCBhIHNlY29uZCBvcHRpb25hbCBkZXNjcmlwdGl2ZSBuYW1lIGFyZ1xuICBjb25zdCBuYW1lID0gZ2V0SW1tdXRhYmxlTmFtZSh2YWwuX25hbWUgfHwgJ1JlY29yZCcpO1xuICByZXR1cm4gKytkZXB0aCA+IGNvbmZpZy5tYXhEZXB0aFxuICAgID8gcHJpbnRBc0xlYWYobmFtZSlcbiAgICA6IG5hbWUgK1xuICAgICAgICBTUEFDRSArXG4gICAgICAgICd7JyArXG4gICAgICAgICgwLCBfY29sbGVjdGlvbnMucHJpbnRJdGVyYXRvckVudHJpZXMpKFxuICAgICAgICAgIGdldFJlY29yZEVudHJpZXModmFsKSxcbiAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgaW5kZW50YXRpb24sXG4gICAgICAgICAgZGVwdGgsXG4gICAgICAgICAgcmVmcyxcbiAgICAgICAgICBwcmludGVyXG4gICAgICAgICkgK1xuICAgICAgICAnfSc7XG59O1xuXG5jb25zdCBwcmludEltbXV0YWJsZVNlcSA9ICh2YWwsIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBwcmludGVyKSA9PiB7XG4gIGNvbnN0IG5hbWUgPSBnZXRJbW11dGFibGVOYW1lKCdTZXEnKTtcblxuICBpZiAoKytkZXB0aCA+IGNvbmZpZy5tYXhEZXB0aCkge1xuICAgIHJldHVybiBwcmludEFzTGVhZihuYW1lKTtcbiAgfVxuXG4gIGlmICh2YWxbSVNfS0VZRURfU0VOVElORUxdKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIG5hbWUgK1xuICAgICAgU1BBQ0UgK1xuICAgICAgJ3snICsgLy8gZnJvbSBJbW11dGFibGUgY29sbGVjdGlvbiBvZiBlbnRyaWVzIG9yIGZyb20gRUNNQVNjcmlwdCBvYmplY3RcbiAgICAgICh2YWwuX2l0ZXIgfHwgdmFsLl9vYmplY3RcbiAgICAgICAgPyAoMCwgX2NvbGxlY3Rpb25zLnByaW50SXRlcmF0b3JFbnRyaWVzKShcbiAgICAgICAgICAgIHZhbC5lbnRyaWVzKCksXG4gICAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgICBpbmRlbnRhdGlvbixcbiAgICAgICAgICAgIGRlcHRoLFxuICAgICAgICAgICAgcmVmcyxcbiAgICAgICAgICAgIHByaW50ZXJcbiAgICAgICAgICApXG4gICAgICAgIDogTEFaWSkgK1xuICAgICAgJ30nXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgbmFtZSArXG4gICAgU1BBQ0UgK1xuICAgICdbJyArXG4gICAgKHZhbC5faXRlciB8fCAvLyBmcm9tIEltbXV0YWJsZSBjb2xsZWN0aW9uIG9mIHZhbHVlc1xuICAgIHZhbC5fYXJyYXkgfHwgLy8gZnJvbSBFQ01BU2NyaXB0IGFycmF5XG4gICAgdmFsLl9jb2xsZWN0aW9uIHx8IC8vIGZyb20gRUNNQVNjcmlwdCBjb2xsZWN0aW9uIGluIGltbXV0YWJsZSB2NFxuICAgIHZhbC5faXRlcmFibGUgLy8gZnJvbSBFQ01BU2NyaXB0IGNvbGxlY3Rpb24gaW4gaW1tdXRhYmxlIHYzXG4gICAgICA/ICgwLCBfY29sbGVjdGlvbnMucHJpbnRJdGVyYXRvclZhbHVlcykoXG4gICAgICAgICAgdmFsLnZhbHVlcygpLFxuICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICBpbmRlbnRhdGlvbixcbiAgICAgICAgICBkZXB0aCxcbiAgICAgICAgICByZWZzLFxuICAgICAgICAgIHByaW50ZXJcbiAgICAgICAgKVxuICAgICAgOiBMQVpZKSArXG4gICAgJ10nXG4gICk7XG59O1xuXG5jb25zdCBwcmludEltbXV0YWJsZVZhbHVlcyA9IChcbiAgdmFsLFxuICBjb25maWcsXG4gIGluZGVudGF0aW9uLFxuICBkZXB0aCxcbiAgcmVmcyxcbiAgcHJpbnRlcixcbiAgdHlwZVxuKSA9PlxuICArK2RlcHRoID4gY29uZmlnLm1heERlcHRoXG4gICAgPyBwcmludEFzTGVhZihnZXRJbW11dGFibGVOYW1lKHR5cGUpKVxuICAgIDogZ2V0SW1tdXRhYmxlTmFtZSh0eXBlKSArXG4gICAgICBTUEFDRSArXG4gICAgICAnWycgK1xuICAgICAgKDAsIF9jb2xsZWN0aW9ucy5wcmludEl0ZXJhdG9yVmFsdWVzKShcbiAgICAgICAgdmFsLnZhbHVlcygpLFxuICAgICAgICBjb25maWcsXG4gICAgICAgIGluZGVudGF0aW9uLFxuICAgICAgICBkZXB0aCxcbiAgICAgICAgcmVmcyxcbiAgICAgICAgcHJpbnRlclxuICAgICAgKSArXG4gICAgICAnXSc7XG5cbmNvbnN0IHNlcmlhbGl6ZSA9ICh2YWwsIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBwcmludGVyKSA9PiB7XG4gIGlmICh2YWxbSVNfTUFQX1NFTlRJTkVMXSkge1xuICAgIHJldHVybiBwcmludEltbXV0YWJsZUVudHJpZXMoXG4gICAgICB2YWwsXG4gICAgICBjb25maWcsXG4gICAgICBpbmRlbnRhdGlvbixcbiAgICAgIGRlcHRoLFxuICAgICAgcmVmcyxcbiAgICAgIHByaW50ZXIsXG4gICAgICB2YWxbSVNfT1JERVJFRF9TRU5USU5FTF0gPyAnT3JkZXJlZE1hcCcgOiAnTWFwJ1xuICAgICk7XG4gIH1cblxuICBpZiAodmFsW0lTX0xJU1RfU0VOVElORUxdKSB7XG4gICAgcmV0dXJuIHByaW50SW1tdXRhYmxlVmFsdWVzKFxuICAgICAgdmFsLFxuICAgICAgY29uZmlnLFxuICAgICAgaW5kZW50YXRpb24sXG4gICAgICBkZXB0aCxcbiAgICAgIHJlZnMsXG4gICAgICBwcmludGVyLFxuICAgICAgJ0xpc3QnXG4gICAgKTtcbiAgfVxuXG4gIGlmICh2YWxbSVNfU0VUX1NFTlRJTkVMXSkge1xuICAgIHJldHVybiBwcmludEltbXV0YWJsZVZhbHVlcyhcbiAgICAgIHZhbCxcbiAgICAgIGNvbmZpZyxcbiAgICAgIGluZGVudGF0aW9uLFxuICAgICAgZGVwdGgsXG4gICAgICByZWZzLFxuICAgICAgcHJpbnRlcixcbiAgICAgIHZhbFtJU19PUkRFUkVEX1NFTlRJTkVMXSA/ICdPcmRlcmVkU2V0JyA6ICdTZXQnXG4gICAgKTtcbiAgfVxuXG4gIGlmICh2YWxbSVNfU1RBQ0tfU0VOVElORUxdKSB7XG4gICAgcmV0dXJuIHByaW50SW1tdXRhYmxlVmFsdWVzKFxuICAgICAgdmFsLFxuICAgICAgY29uZmlnLFxuICAgICAgaW5kZW50YXRpb24sXG4gICAgICBkZXB0aCxcbiAgICAgIHJlZnMsXG4gICAgICBwcmludGVyLFxuICAgICAgJ1N0YWNrJ1xuICAgICk7XG4gIH1cblxuICBpZiAodmFsW0lTX1NFUV9TRU5USU5FTF0pIHtcbiAgICByZXR1cm4gcHJpbnRJbW11dGFibGVTZXEodmFsLCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcywgcHJpbnRlcik7XG4gIH0gLy8gRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBpbW11dGFibGUgdjMgYW5kIHY0LCBsZXQgcmVjb3JkIGJlIHRoZSBkZWZhdWx0LlxuXG4gIHJldHVybiBwcmludEltbXV0YWJsZVJlY29yZCh2YWwsIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBwcmludGVyKTtcbn07IC8vIEV4cGxpY2l0bHkgY29tcGFyaW5nIHNlbnRpbmVsIHByb3BlcnRpZXMgdG8gdHJ1ZSBhdm9pZHMgZmFsc2UgcG9zaXRpdmVcbi8vIHdoZW4gbW9jayBpZGVudGl0eS1vYmotcHJveHkgcmV0dXJucyB0aGUga2V5IGFzIHRoZSB2YWx1ZSBmb3IgYW55IGtleS5cblxuZXhwb3J0cy5zZXJpYWxpemUgPSBzZXJpYWxpemU7XG5cbmNvbnN0IHRlc3QgPSB2YWwgPT5cbiAgdmFsICYmXG4gICh2YWxbSVNfSVRFUkFCTEVfU0VOVElORUxdID09PSB0cnVlIHx8IHZhbFtJU19SRUNPUkRfU0VOVElORUxdID09PSB0cnVlKTtcblxuZXhwb3J0cy50ZXN0ID0gdGVzdDtcbmNvbnN0IHBsdWdpbiA9IHtcbiAgc2VyaWFsaXplLFxuICB0ZXN0XG59O1xudmFyIF9kZWZhdWx0ID0gcGx1Z2luO1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7XG4iLCIvKiogQGxpY2Vuc2UgUmVhY3QgdjE3LjAuMlxuICogcmVhY3QtaXMucHJvZHVjdGlvbi5taW4uanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuJ3VzZSBzdHJpY3QnO3ZhciBiPTYwMTAzLGM9NjAxMDYsZD02MDEwNyxlPTYwMTA4LGY9NjAxMTQsZz02MDEwOSxoPTYwMTEwLGs9NjAxMTIsbD02MDExMyxtPTYwMTIwLG49NjAxMTUscD02MDExNixxPTYwMTIxLHI9NjAxMjIsdT02MDExNyx2PTYwMTI5LHc9NjAxMzE7XG5pZihcImZ1bmN0aW9uXCI9PT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuZm9yKXt2YXIgeD1TeW1ib2wuZm9yO2I9eChcInJlYWN0LmVsZW1lbnRcIik7Yz14KFwicmVhY3QucG9ydGFsXCIpO2Q9eChcInJlYWN0LmZyYWdtZW50XCIpO2U9eChcInJlYWN0LnN0cmljdF9tb2RlXCIpO2Y9eChcInJlYWN0LnByb2ZpbGVyXCIpO2c9eChcInJlYWN0LnByb3ZpZGVyXCIpO2g9eChcInJlYWN0LmNvbnRleHRcIik7az14KFwicmVhY3QuZm9yd2FyZF9yZWZcIik7bD14KFwicmVhY3Quc3VzcGVuc2VcIik7bT14KFwicmVhY3Quc3VzcGVuc2VfbGlzdFwiKTtuPXgoXCJyZWFjdC5tZW1vXCIpO3A9eChcInJlYWN0LmxhenlcIik7cT14KFwicmVhY3QuYmxvY2tcIik7cj14KFwicmVhY3Quc2VydmVyLmJsb2NrXCIpO3U9eChcInJlYWN0LmZ1bmRhbWVudGFsXCIpO3Y9eChcInJlYWN0LmRlYnVnX3RyYWNlX21vZGVcIik7dz14KFwicmVhY3QubGVnYWN5X2hpZGRlblwiKX1cbmZ1bmN0aW9uIHkoYSl7aWYoXCJvYmplY3RcIj09PXR5cGVvZiBhJiZudWxsIT09YSl7dmFyIHQ9YS4kJHR5cGVvZjtzd2l0Y2godCl7Y2FzZSBiOnN3aXRjaChhPWEudHlwZSxhKXtjYXNlIGQ6Y2FzZSBmOmNhc2UgZTpjYXNlIGw6Y2FzZSBtOnJldHVybiBhO2RlZmF1bHQ6c3dpdGNoKGE9YSYmYS4kJHR5cGVvZixhKXtjYXNlIGg6Y2FzZSBrOmNhc2UgcDpjYXNlIG46Y2FzZSBnOnJldHVybiBhO2RlZmF1bHQ6cmV0dXJuIHR9fWNhc2UgYzpyZXR1cm4gdH19fXZhciB6PWcsQT1iLEI9ayxDPWQsRD1wLEU9bixGPWMsRz1mLEg9ZSxJPWw7ZXhwb3J0cy5Db250ZXh0Q29uc3VtZXI9aDtleHBvcnRzLkNvbnRleHRQcm92aWRlcj16O2V4cG9ydHMuRWxlbWVudD1BO2V4cG9ydHMuRm9yd2FyZFJlZj1CO2V4cG9ydHMuRnJhZ21lbnQ9QztleHBvcnRzLkxhenk9RDtleHBvcnRzLk1lbW89RTtleHBvcnRzLlBvcnRhbD1GO2V4cG9ydHMuUHJvZmlsZXI9RztleHBvcnRzLlN0cmljdE1vZGU9SDtcbmV4cG9ydHMuU3VzcGVuc2U9STtleHBvcnRzLmlzQXN5bmNNb2RlPWZ1bmN0aW9uKCl7cmV0dXJuITF9O2V4cG9ydHMuaXNDb25jdXJyZW50TW9kZT1mdW5jdGlvbigpe3JldHVybiExfTtleHBvcnRzLmlzQ29udGV4dENvbnN1bWVyPWZ1bmN0aW9uKGEpe3JldHVybiB5KGEpPT09aH07ZXhwb3J0cy5pc0NvbnRleHRQcm92aWRlcj1mdW5jdGlvbihhKXtyZXR1cm4geShhKT09PWd9O2V4cG9ydHMuaXNFbGVtZW50PWZ1bmN0aW9uKGEpe3JldHVyblwib2JqZWN0XCI9PT10eXBlb2YgYSYmbnVsbCE9PWEmJmEuJCR0eXBlb2Y9PT1ifTtleHBvcnRzLmlzRm9yd2FyZFJlZj1mdW5jdGlvbihhKXtyZXR1cm4geShhKT09PWt9O2V4cG9ydHMuaXNGcmFnbWVudD1mdW5jdGlvbihhKXtyZXR1cm4geShhKT09PWR9O2V4cG9ydHMuaXNMYXp5PWZ1bmN0aW9uKGEpe3JldHVybiB5KGEpPT09cH07ZXhwb3J0cy5pc01lbW89ZnVuY3Rpb24oYSl7cmV0dXJuIHkoYSk9PT1ufTtcbmV4cG9ydHMuaXNQb3J0YWw9ZnVuY3Rpb24oYSl7cmV0dXJuIHkoYSk9PT1jfTtleHBvcnRzLmlzUHJvZmlsZXI9ZnVuY3Rpb24oYSl7cmV0dXJuIHkoYSk9PT1mfTtleHBvcnRzLmlzU3RyaWN0TW9kZT1mdW5jdGlvbihhKXtyZXR1cm4geShhKT09PWV9O2V4cG9ydHMuaXNTdXNwZW5zZT1mdW5jdGlvbihhKXtyZXR1cm4geShhKT09PWx9O2V4cG9ydHMuaXNWYWxpZEVsZW1lbnRUeXBlPWZ1bmN0aW9uKGEpe3JldHVyblwic3RyaW5nXCI9PT10eXBlb2YgYXx8XCJmdW5jdGlvblwiPT09dHlwZW9mIGF8fGE9PT1kfHxhPT09Znx8YT09PXZ8fGE9PT1lfHxhPT09bHx8YT09PW18fGE9PT13fHxcIm9iamVjdFwiPT09dHlwZW9mIGEmJm51bGwhPT1hJiYoYS4kJHR5cGVvZj09PXB8fGEuJCR0eXBlb2Y9PT1ufHxhLiQkdHlwZW9mPT09Z3x8YS4kJHR5cGVvZj09PWh8fGEuJCR0eXBlb2Y9PT1rfHxhLiQkdHlwZW9mPT09dXx8YS4kJHR5cGVvZj09PXF8fGFbMF09PT1yKT8hMDohMX07XG5leHBvcnRzLnR5cGVPZj15O1xuIiwiLyoqIEBsaWNlbnNlIFJlYWN0IHYxNy4wLjJcbiAqIHJlYWN0LWlzLmRldmVsb3BtZW50LmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIChmdW5jdGlvbigpIHtcbid1c2Ugc3RyaWN0JztcblxuLy8gQVRURU5USU9OXG4vLyBXaGVuIGFkZGluZyBuZXcgc3ltYm9scyB0byB0aGlzIGZpbGUsXG4vLyBQbGVhc2UgY29uc2lkZXIgYWxzbyBhZGRpbmcgdG8gJ3JlYWN0LWRldnRvb2xzLXNoYXJlZC9zcmMvYmFja2VuZC9SZWFjdFN5bWJvbHMnXG4vLyBUaGUgU3ltYm9sIHVzZWQgdG8gdGFnIHRoZSBSZWFjdEVsZW1lbnQtbGlrZSB0eXBlcy4gSWYgdGhlcmUgaXMgbm8gbmF0aXZlIFN5bWJvbFxuLy8gbm9yIHBvbHlmaWxsLCB0aGVuIGEgcGxhaW4gbnVtYmVyIGlzIHVzZWQgZm9yIHBlcmZvcm1hbmNlLlxudmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9IDB4ZWFjNztcbnZhciBSRUFDVF9QT1JUQUxfVFlQRSA9IDB4ZWFjYTtcbnZhciBSRUFDVF9GUkFHTUVOVF9UWVBFID0gMHhlYWNiO1xudmFyIFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgPSAweGVhY2M7XG52YXIgUkVBQ1RfUFJPRklMRVJfVFlQRSA9IDB4ZWFkMjtcbnZhciBSRUFDVF9QUk9WSURFUl9UWVBFID0gMHhlYWNkO1xudmFyIFJFQUNUX0NPTlRFWFRfVFlQRSA9IDB4ZWFjZTtcbnZhciBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFID0gMHhlYWQwO1xudmFyIFJFQUNUX1NVU1BFTlNFX1RZUEUgPSAweGVhZDE7XG52YXIgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFID0gMHhlYWQ4O1xudmFyIFJFQUNUX01FTU9fVFlQRSA9IDB4ZWFkMztcbnZhciBSRUFDVF9MQVpZX1RZUEUgPSAweGVhZDQ7XG52YXIgUkVBQ1RfQkxPQ0tfVFlQRSA9IDB4ZWFkOTtcbnZhciBSRUFDVF9TRVJWRVJfQkxPQ0tfVFlQRSA9IDB4ZWFkYTtcbnZhciBSRUFDVF9GVU5EQU1FTlRBTF9UWVBFID0gMHhlYWQ1O1xudmFyIFJFQUNUX1NDT1BFX1RZUEUgPSAweGVhZDc7XG52YXIgUkVBQ1RfT1BBUVVFX0lEX1RZUEUgPSAweGVhZTA7XG52YXIgUkVBQ1RfREVCVUdfVFJBQ0lOR19NT0RFX1RZUEUgPSAweGVhZTE7XG52YXIgUkVBQ1RfT0ZGU0NSRUVOX1RZUEUgPSAweGVhZTI7XG52YXIgUkVBQ1RfTEVHQUNZX0hJRERFTl9UWVBFID0gMHhlYWUzO1xuXG5pZiAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wuZm9yKSB7XG4gIHZhciBzeW1ib2xGb3IgPSBTeW1ib2wuZm9yO1xuICBSRUFDVF9FTEVNRU5UX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LmVsZW1lbnQnKTtcbiAgUkVBQ1RfUE9SVEFMX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LnBvcnRhbCcpO1xuICBSRUFDVF9GUkFHTUVOVF9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5mcmFnbWVudCcpO1xuICBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5zdHJpY3RfbW9kZScpO1xuICBSRUFDVF9QUk9GSUxFUl9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5wcm9maWxlcicpO1xuICBSRUFDVF9QUk9WSURFUl9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5wcm92aWRlcicpO1xuICBSRUFDVF9DT05URVhUX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LmNvbnRleHQnKTtcbiAgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSA9IHN5bWJvbEZvcigncmVhY3QuZm9yd2FyZF9yZWYnKTtcbiAgUkVBQ1RfU1VTUEVOU0VfVFlQRSA9IHN5bWJvbEZvcigncmVhY3Quc3VzcGVuc2UnKTtcbiAgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5zdXNwZW5zZV9saXN0Jyk7XG4gIFJFQUNUX01FTU9fVFlQRSA9IHN5bWJvbEZvcigncmVhY3QubWVtbycpO1xuICBSRUFDVF9MQVpZX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LmxhenknKTtcbiAgUkVBQ1RfQkxPQ0tfVFlQRSA9IHN5bWJvbEZvcigncmVhY3QuYmxvY2snKTtcbiAgUkVBQ1RfU0VSVkVSX0JMT0NLX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LnNlcnZlci5ibG9jaycpO1xuICBSRUFDVF9GVU5EQU1FTlRBTF9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5mdW5kYW1lbnRhbCcpO1xuICBSRUFDVF9TQ09QRV9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5zY29wZScpO1xuICBSRUFDVF9PUEFRVUVfSURfVFlQRSA9IHN5bWJvbEZvcigncmVhY3Qub3BhcXVlLmlkJyk7XG4gIFJFQUNUX0RFQlVHX1RSQUNJTkdfTU9ERV9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5kZWJ1Z190cmFjZV9tb2RlJyk7XG4gIFJFQUNUX09GRlNDUkVFTl9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5vZmZzY3JlZW4nKTtcbiAgUkVBQ1RfTEVHQUNZX0hJRERFTl9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5sZWdhY3lfaGlkZGVuJyk7XG59XG5cbi8vIEZpbHRlciBjZXJ0YWluIERPTSBhdHRyaWJ1dGVzIChlLmcuIHNyYywgaHJlZikgaWYgdGhlaXIgdmFsdWVzIGFyZSBlbXB0eSBzdHJpbmdzLlxuXG52YXIgZW5hYmxlU2NvcGVBUEkgPSBmYWxzZTsgLy8gRXhwZXJpbWVudGFsIENyZWF0ZSBFdmVudCBIYW5kbGUgQVBJLlxuXG5mdW5jdGlvbiBpc1ZhbGlkRWxlbWVudFR5cGUodHlwZSkge1xuICBpZiAodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gLy8gTm90ZTogdHlwZW9mIG1pZ2h0IGJlIG90aGVyIHRoYW4gJ3N5bWJvbCcgb3IgJ251bWJlcicgKGUuZy4gaWYgaXQncyBhIHBvbHlmaWxsKS5cblxuXG4gIGlmICh0eXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1BST0ZJTEVSX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfREVCVUdfVFJBQ0lOR19NT0RFX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9MRUdBQ1lfSElEREVOX1RZUEUgfHwgZW5hYmxlU2NvcGVBUEkgKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnICYmIHR5cGUgIT09IG51bGwpIHtcbiAgICBpZiAodHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX01FTU9fVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9QUk9WSURFUl9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0NPTlRFWFRfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0ZVTkRBTUVOVEFMX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQkxPQ0tfVFlQRSB8fCB0eXBlWzBdID09PSBSRUFDVF9TRVJWRVJfQkxPQ0tfVFlQRSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiB0eXBlT2Yob2JqZWN0KSB7XG4gIGlmICh0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJiBvYmplY3QgIT09IG51bGwpIHtcbiAgICB2YXIgJCR0eXBlb2YgPSBvYmplY3QuJCR0eXBlb2Y7XG5cbiAgICBzd2l0Y2ggKCQkdHlwZW9mKSB7XG4gICAgICBjYXNlIFJFQUNUX0VMRU1FTlRfVFlQRTpcbiAgICAgICAgdmFyIHR5cGUgPSBvYmplY3QudHlwZTtcblxuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICBjYXNlIFJFQUNUX0ZSQUdNRU5UX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9QUk9GSUxFUl9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfU1RSSUNUX01PREVfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU6XG4gICAgICAgICAgICByZXR1cm4gdHlwZTtcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB2YXIgJCR0eXBlb2ZUeXBlID0gdHlwZSAmJiB0eXBlLiQkdHlwZW9mO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKCQkdHlwZW9mVHlwZSkge1xuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9NRU1PX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfUFJPVklERVJfVFlQRTpcbiAgICAgICAgICAgICAgICByZXR1cm4gJCR0eXBlb2ZUeXBlO1xuXG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuICQkdHlwZW9mO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgcmV0dXJuICQkdHlwZW9mO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG52YXIgQ29udGV4dENvbnN1bWVyID0gUkVBQ1RfQ09OVEVYVF9UWVBFO1xudmFyIENvbnRleHRQcm92aWRlciA9IFJFQUNUX1BST1ZJREVSX1RZUEU7XG52YXIgRWxlbWVudCA9IFJFQUNUX0VMRU1FTlRfVFlQRTtcbnZhciBGb3J3YXJkUmVmID0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTtcbnZhciBGcmFnbWVudCA9IFJFQUNUX0ZSQUdNRU5UX1RZUEU7XG52YXIgTGF6eSA9IFJFQUNUX0xBWllfVFlQRTtcbnZhciBNZW1vID0gUkVBQ1RfTUVNT19UWVBFO1xudmFyIFBvcnRhbCA9IFJFQUNUX1BPUlRBTF9UWVBFO1xudmFyIFByb2ZpbGVyID0gUkVBQ1RfUFJPRklMRVJfVFlQRTtcbnZhciBTdHJpY3RNb2RlID0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRTtcbnZhciBTdXNwZW5zZSA9IFJFQUNUX1NVU1BFTlNFX1RZUEU7XG52YXIgaGFzV2FybmVkQWJvdXREZXByZWNhdGVkSXNBc3luY01vZGUgPSBmYWxzZTtcbnZhciBoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0NvbmN1cnJlbnRNb2RlID0gZmFsc2U7IC8vIEFzeW5jTW9kZSBzaG91bGQgYmUgZGVwcmVjYXRlZFxuXG5mdW5jdGlvbiBpc0FzeW5jTW9kZShvYmplY3QpIHtcbiAge1xuICAgIGlmICghaGFzV2FybmVkQWJvdXREZXByZWNhdGVkSXNBc3luY01vZGUpIHtcbiAgICAgIGhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQXN5bmNNb2RlID0gdHJ1ZTsgLy8gVXNpbmcgY29uc29sZVsnd2FybiddIHRvIGV2YWRlIEJhYmVsIGFuZCBFU0xpbnRcblxuICAgICAgY29uc29sZVsnd2FybiddKCdUaGUgUmVhY3RJcy5pc0FzeW5jTW9kZSgpIGFsaWFzIGhhcyBiZWVuIGRlcHJlY2F0ZWQsICcgKyAnYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBSZWFjdCAxOCsuJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gaXNDb25jdXJyZW50TW9kZShvYmplY3QpIHtcbiAge1xuICAgIGlmICghaGFzV2FybmVkQWJvdXREZXByZWNhdGVkSXNDb25jdXJyZW50TW9kZSkge1xuICAgICAgaGFzV2FybmVkQWJvdXREZXByZWNhdGVkSXNDb25jdXJyZW50TW9kZSA9IHRydWU7IC8vIFVzaW5nIGNvbnNvbGVbJ3dhcm4nXSB0byBldmFkZSBCYWJlbCBhbmQgRVNMaW50XG5cbiAgICAgIGNvbnNvbGVbJ3dhcm4nXSgnVGhlIFJlYWN0SXMuaXNDb25jdXJyZW50TW9kZSgpIGFsaWFzIGhhcyBiZWVuIGRlcHJlY2F0ZWQsICcgKyAnYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBSZWFjdCAxOCsuJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gaXNDb250ZXh0Q29uc3VtZXIob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFO1xufVxuZnVuY3Rpb24gaXNDb250ZXh0UHJvdmlkZXIob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfUFJPVklERVJfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzRWxlbWVudChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVjdCAhPT0gbnVsbCAmJiBvYmplY3QuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzRm9yd2FyZFJlZihvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFO1xufVxuZnVuY3Rpb24gaXNGcmFnbWVudChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFO1xufVxuZnVuY3Rpb24gaXNMYXp5KG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0xBWllfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzTWVtbyhvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9NRU1PX1RZUEU7XG59XG5mdW5jdGlvbiBpc1BvcnRhbChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9QT1JUQUxfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzUHJvZmlsZXIob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfUFJPRklMRVJfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzU3RyaWN0TW9kZShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFO1xufVxuZnVuY3Rpb24gaXNTdXNwZW5zZShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9TVVNQRU5TRV9UWVBFO1xufVxuXG5leHBvcnRzLkNvbnRleHRDb25zdW1lciA9IENvbnRleHRDb25zdW1lcjtcbmV4cG9ydHMuQ29udGV4dFByb3ZpZGVyID0gQ29udGV4dFByb3ZpZGVyO1xuZXhwb3J0cy5FbGVtZW50ID0gRWxlbWVudDtcbmV4cG9ydHMuRm9yd2FyZFJlZiA9IEZvcndhcmRSZWY7XG5leHBvcnRzLkZyYWdtZW50ID0gRnJhZ21lbnQ7XG5leHBvcnRzLkxhenkgPSBMYXp5O1xuZXhwb3J0cy5NZW1vID0gTWVtbztcbmV4cG9ydHMuUG9ydGFsID0gUG9ydGFsO1xuZXhwb3J0cy5Qcm9maWxlciA9IFByb2ZpbGVyO1xuZXhwb3J0cy5TdHJpY3RNb2RlID0gU3RyaWN0TW9kZTtcbmV4cG9ydHMuU3VzcGVuc2UgPSBTdXNwZW5zZTtcbmV4cG9ydHMuaXNBc3luY01vZGUgPSBpc0FzeW5jTW9kZTtcbmV4cG9ydHMuaXNDb25jdXJyZW50TW9kZSA9IGlzQ29uY3VycmVudE1vZGU7XG5leHBvcnRzLmlzQ29udGV4dENvbnN1bWVyID0gaXNDb250ZXh0Q29uc3VtZXI7XG5leHBvcnRzLmlzQ29udGV4dFByb3ZpZGVyID0gaXNDb250ZXh0UHJvdmlkZXI7XG5leHBvcnRzLmlzRWxlbWVudCA9IGlzRWxlbWVudDtcbmV4cG9ydHMuaXNGb3J3YXJkUmVmID0gaXNGb3J3YXJkUmVmO1xuZXhwb3J0cy5pc0ZyYWdtZW50ID0gaXNGcmFnbWVudDtcbmV4cG9ydHMuaXNMYXp5ID0gaXNMYXp5O1xuZXhwb3J0cy5pc01lbW8gPSBpc01lbW87XG5leHBvcnRzLmlzUG9ydGFsID0gaXNQb3J0YWw7XG5leHBvcnRzLmlzUHJvZmlsZXIgPSBpc1Byb2ZpbGVyO1xuZXhwb3J0cy5pc1N0cmljdE1vZGUgPSBpc1N0cmljdE1vZGU7XG5leHBvcnRzLmlzU3VzcGVuc2UgPSBpc1N1c3BlbnNlO1xuZXhwb3J0cy5pc1ZhbGlkRWxlbWVudFR5cGUgPSBpc1ZhbGlkRWxlbWVudFR5cGU7XG5leHBvcnRzLnR5cGVPZiA9IHR5cGVPZjtcbiAgfSkoKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1pcy5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1pcy5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMudGVzdCA9IGV4cG9ydHMuc2VyaWFsaXplID0gZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgUmVhY3RJcyA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoJ3JlYWN0LWlzJykpO1xuXG52YXIgX21hcmt1cCA9IHJlcXVpcmUoJy4vbGliL21hcmt1cCcpO1xuXG5mdW5jdGlvbiBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUobm9kZUludGVyb3ApIHtcbiAgaWYgKHR5cGVvZiBXZWFrTWFwICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gbnVsbDtcbiAgdmFyIGNhY2hlQmFiZWxJbnRlcm9wID0gbmV3IFdlYWtNYXAoKTtcbiAgdmFyIGNhY2hlTm9kZUludGVyb3AgPSBuZXcgV2Vha01hcCgpO1xuICByZXR1cm4gKF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSA9IGZ1bmN0aW9uIChub2RlSW50ZXJvcCkge1xuICAgIHJldHVybiBub2RlSW50ZXJvcCA/IGNhY2hlTm9kZUludGVyb3AgOiBjYWNoZUJhYmVsSW50ZXJvcDtcbiAgfSkobm9kZUludGVyb3ApO1xufVxuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChvYmosIG5vZGVJbnRlcm9wKSB7XG4gIGlmICghbm9kZUludGVyb3AgJiYgb2JqICYmIG9iai5fX2VzTW9kdWxlKSB7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuICBpZiAob2JqID09PSBudWxsIHx8ICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyAmJiB0eXBlb2Ygb2JqICE9PSAnZnVuY3Rpb24nKSkge1xuICAgIHJldHVybiB7ZGVmYXVsdDogb2JqfTtcbiAgfVxuICB2YXIgY2FjaGUgPSBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUobm9kZUludGVyb3ApO1xuICBpZiAoY2FjaGUgJiYgY2FjaGUuaGFzKG9iaikpIHtcbiAgICByZXR1cm4gY2FjaGUuZ2V0KG9iaik7XG4gIH1cbiAgdmFyIG5ld09iaiA9IHt9O1xuICB2YXIgaGFzUHJvcGVydHlEZXNjcmlwdG9yID1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcbiAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgIGlmIChrZXkgIT09ICdkZWZhdWx0JyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7XG4gICAgICB2YXIgZGVzYyA9IGhhc1Byb3BlcnR5RGVzY3JpcHRvclxuICAgICAgICA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBrZXkpXG4gICAgICAgIDogbnVsbDtcbiAgICAgIGlmIChkZXNjICYmIChkZXNjLmdldCB8fCBkZXNjLnNldCkpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5ld09iaiwga2V5LCBkZXNjKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ld09ialtrZXldID0gb2JqW2tleV07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIG5ld09iai5kZWZhdWx0ID0gb2JqO1xuICBpZiAoY2FjaGUpIHtcbiAgICBjYWNoZS5zZXQob2JqLCBuZXdPYmopO1xuICB9XG4gIHJldHVybiBuZXdPYmo7XG59XG5cbi8qKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cbi8vIEdpdmVuIGVsZW1lbnQucHJvcHMuY2hpbGRyZW4sIG9yIHN1YnRyZWUgZHVyaW5nIHJlY3Vyc2l2ZSB0cmF2ZXJzYWwsXG4vLyByZXR1cm4gZmxhdHRlbmVkIGFycmF5IG9mIGNoaWxkcmVuLlxuY29uc3QgZ2V0Q2hpbGRyZW4gPSAoYXJnLCBjaGlsZHJlbiA9IFtdKSA9PiB7XG4gIGlmIChBcnJheS5pc0FycmF5KGFyZykpIHtcbiAgICBhcmcuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgIGdldENoaWxkcmVuKGl0ZW0sIGNoaWxkcmVuKTtcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChhcmcgIT0gbnVsbCAmJiBhcmcgIT09IGZhbHNlKSB7XG4gICAgY2hpbGRyZW4ucHVzaChhcmcpO1xuICB9XG5cbiAgcmV0dXJuIGNoaWxkcmVuO1xufTtcblxuY29uc3QgZ2V0VHlwZSA9IGVsZW1lbnQgPT4ge1xuICBjb25zdCB0eXBlID0gZWxlbWVudC50eXBlO1xuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdHlwZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB0eXBlLmRpc3BsYXlOYW1lIHx8IHR5cGUubmFtZSB8fCAnVW5rbm93bic7XG4gIH1cblxuICBpZiAoUmVhY3RJcy5pc0ZyYWdtZW50KGVsZW1lbnQpKSB7XG4gICAgcmV0dXJuICdSZWFjdC5GcmFnbWVudCc7XG4gIH1cblxuICBpZiAoUmVhY3RJcy5pc1N1c3BlbnNlKGVsZW1lbnQpKSB7XG4gICAgcmV0dXJuICdSZWFjdC5TdXNwZW5zZSc7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnICYmIHR5cGUgIT09IG51bGwpIHtcbiAgICBpZiAoUmVhY3RJcy5pc0NvbnRleHRQcm92aWRlcihlbGVtZW50KSkge1xuICAgICAgcmV0dXJuICdDb250ZXh0LlByb3ZpZGVyJztcbiAgICB9XG5cbiAgICBpZiAoUmVhY3RJcy5pc0NvbnRleHRDb25zdW1lcihlbGVtZW50KSkge1xuICAgICAgcmV0dXJuICdDb250ZXh0LkNvbnN1bWVyJztcbiAgICB9XG5cbiAgICBpZiAoUmVhY3RJcy5pc0ZvcndhcmRSZWYoZWxlbWVudCkpIHtcbiAgICAgIGlmICh0eXBlLmRpc3BsYXlOYW1lKSB7XG4gICAgICAgIHJldHVybiB0eXBlLmRpc3BsYXlOYW1lO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmdW5jdGlvbk5hbWUgPSB0eXBlLnJlbmRlci5kaXNwbGF5TmFtZSB8fCB0eXBlLnJlbmRlci5uYW1lIHx8ICcnO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uTmFtZSAhPT0gJydcbiAgICAgICAgPyAnRm9yd2FyZFJlZignICsgZnVuY3Rpb25OYW1lICsgJyknXG4gICAgICAgIDogJ0ZvcndhcmRSZWYnO1xuICAgIH1cblxuICAgIGlmIChSZWFjdElzLmlzTWVtbyhlbGVtZW50KSkge1xuICAgICAgY29uc3QgZnVuY3Rpb25OYW1lID1cbiAgICAgICAgdHlwZS5kaXNwbGF5TmFtZSB8fCB0eXBlLnR5cGUuZGlzcGxheU5hbWUgfHwgdHlwZS50eXBlLm5hbWUgfHwgJyc7XG4gICAgICByZXR1cm4gZnVuY3Rpb25OYW1lICE9PSAnJyA/ICdNZW1vKCcgKyBmdW5jdGlvbk5hbWUgKyAnKScgOiAnTWVtbyc7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuICdVTkRFRklORUQnO1xufTtcblxuY29uc3QgZ2V0UHJvcEtleXMgPSBlbGVtZW50ID0+IHtcbiAgY29uc3Qge3Byb3BzfSA9IGVsZW1lbnQ7XG4gIHJldHVybiBPYmplY3Qua2V5cyhwcm9wcylcbiAgICAuZmlsdGVyKGtleSA9PiBrZXkgIT09ICdjaGlsZHJlbicgJiYgcHJvcHNba2V5XSAhPT0gdW5kZWZpbmVkKVxuICAgIC5zb3J0KCk7XG59O1xuXG5jb25zdCBzZXJpYWxpemUgPSAoZWxlbWVudCwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMsIHByaW50ZXIpID0+XG4gICsrZGVwdGggPiBjb25maWcubWF4RGVwdGhcbiAgICA/ICgwLCBfbWFya3VwLnByaW50RWxlbWVudEFzTGVhZikoZ2V0VHlwZShlbGVtZW50KSwgY29uZmlnKVxuICAgIDogKDAsIF9tYXJrdXAucHJpbnRFbGVtZW50KShcbiAgICAgICAgZ2V0VHlwZShlbGVtZW50KSxcbiAgICAgICAgKDAsIF9tYXJrdXAucHJpbnRQcm9wcykoXG4gICAgICAgICAgZ2V0UHJvcEtleXMoZWxlbWVudCksXG4gICAgICAgICAgZWxlbWVudC5wcm9wcyxcbiAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgaW5kZW50YXRpb24gKyBjb25maWcuaW5kZW50LFxuICAgICAgICAgIGRlcHRoLFxuICAgICAgICAgIHJlZnMsXG4gICAgICAgICAgcHJpbnRlclxuICAgICAgICApLFxuICAgICAgICAoMCwgX21hcmt1cC5wcmludENoaWxkcmVuKShcbiAgICAgICAgICBnZXRDaGlsZHJlbihlbGVtZW50LnByb3BzLmNoaWxkcmVuKSxcbiAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgaW5kZW50YXRpb24gKyBjb25maWcuaW5kZW50LFxuICAgICAgICAgIGRlcHRoLFxuICAgICAgICAgIHJlZnMsXG4gICAgICAgICAgcHJpbnRlclxuICAgICAgICApLFxuICAgICAgICBjb25maWcsXG4gICAgICAgIGluZGVudGF0aW9uXG4gICAgICApO1xuXG5leHBvcnRzLnNlcmlhbGl6ZSA9IHNlcmlhbGl6ZTtcblxuY29uc3QgdGVzdCA9IHZhbCA9PiB2YWwgIT0gbnVsbCAmJiBSZWFjdElzLmlzRWxlbWVudCh2YWwpO1xuXG5leHBvcnRzLnRlc3QgPSB0ZXN0O1xuY29uc3QgcGx1Z2luID0ge1xuICBzZXJpYWxpemUsXG4gIHRlc3Rcbn07XG52YXIgX2RlZmF1bHQgPSBwbHVnaW47XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDtcbiIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLnRlc3QgPSBleHBvcnRzLnNlcmlhbGl6ZSA9IGV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIF9tYXJrdXAgPSByZXF1aXJlKCcuL2xpYi9tYXJrdXAnKTtcblxudmFyIGdsb2JhbCA9IChmdW5jdGlvbiAoKSB7XG4gIGlmICh0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gZ2xvYmFsVGhpcztcbiAgfSBlbHNlIGlmICh0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBnbG9iYWw7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIHNlbGY7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gd2luZG93O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuICB9XG59KSgpO1xuXG52YXIgU3ltYm9sID0gZ2xvYmFsWydqZXN0LXN5bWJvbC1kby1ub3QtdG91Y2gnXSB8fCBnbG9iYWwuU3ltYm9sO1xuY29uc3QgdGVzdFN5bWJvbCA9XG4gIHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLmZvclxuICAgID8gU3ltYm9sLmZvcigncmVhY3QudGVzdC5qc29uJylcbiAgICA6IDB4ZWE3MTM1NztcblxuY29uc3QgZ2V0UHJvcEtleXMgPSBvYmplY3QgPT4ge1xuICBjb25zdCB7cHJvcHN9ID0gb2JqZWN0O1xuICByZXR1cm4gcHJvcHNcbiAgICA/IE9iamVjdC5rZXlzKHByb3BzKVxuICAgICAgICAuZmlsdGVyKGtleSA9PiBwcm9wc1trZXldICE9PSB1bmRlZmluZWQpXG4gICAgICAgIC5zb3J0KClcbiAgICA6IFtdO1xufTtcblxuY29uc3Qgc2VyaWFsaXplID0gKG9iamVjdCwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMsIHByaW50ZXIpID0+XG4gICsrZGVwdGggPiBjb25maWcubWF4RGVwdGhcbiAgICA/ICgwLCBfbWFya3VwLnByaW50RWxlbWVudEFzTGVhZikob2JqZWN0LnR5cGUsIGNvbmZpZylcbiAgICA6ICgwLCBfbWFya3VwLnByaW50RWxlbWVudCkoXG4gICAgICAgIG9iamVjdC50eXBlLFxuICAgICAgICBvYmplY3QucHJvcHNcbiAgICAgICAgICA/ICgwLCBfbWFya3VwLnByaW50UHJvcHMpKFxuICAgICAgICAgICAgICBnZXRQcm9wS2V5cyhvYmplY3QpLFxuICAgICAgICAgICAgICBvYmplY3QucHJvcHMsXG4gICAgICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICAgICAgaW5kZW50YXRpb24gKyBjb25maWcuaW5kZW50LFxuICAgICAgICAgICAgICBkZXB0aCxcbiAgICAgICAgICAgICAgcmVmcyxcbiAgICAgICAgICAgICAgcHJpbnRlclxuICAgICAgICAgICAgKVxuICAgICAgICAgIDogJycsXG4gICAgICAgIG9iamVjdC5jaGlsZHJlblxuICAgICAgICAgID8gKDAsIF9tYXJrdXAucHJpbnRDaGlsZHJlbikoXG4gICAgICAgICAgICAgIG9iamVjdC5jaGlsZHJlbixcbiAgICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAgICBpbmRlbnRhdGlvbiArIGNvbmZpZy5pbmRlbnQsXG4gICAgICAgICAgICAgIGRlcHRoLFxuICAgICAgICAgICAgICByZWZzLFxuICAgICAgICAgICAgICBwcmludGVyXG4gICAgICAgICAgICApXG4gICAgICAgICAgOiAnJyxcbiAgICAgICAgY29uZmlnLFxuICAgICAgICBpbmRlbnRhdGlvblxuICAgICAgKTtcblxuZXhwb3J0cy5zZXJpYWxpemUgPSBzZXJpYWxpemU7XG5cbmNvbnN0IHRlc3QgPSB2YWwgPT4gdmFsICYmIHZhbC4kJHR5cGVvZiA9PT0gdGVzdFN5bWJvbDtcblxuZXhwb3J0cy50ZXN0ID0gdGVzdDtcbmNvbnN0IHBsdWdpbiA9IHtcbiAgc2VyaWFsaXplLFxuICB0ZXN0XG59O1xudmFyIF9kZWZhdWx0ID0gcGx1Z2luO1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7XG4iLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gZXhwb3J0cy5ERUZBVUxUX09QVElPTlMgPSB2b2lkIDA7XG5leHBvcnRzLmZvcm1hdCA9IGZvcm1hdDtcbmV4cG9ydHMucGx1Z2lucyA9IHZvaWQgMDtcblxudmFyIF9hbnNpU3R5bGVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKCdhbnNpLXN0eWxlcycpKTtcblxudmFyIF9jb2xsZWN0aW9ucyA9IHJlcXVpcmUoJy4vY29sbGVjdGlvbnMnKTtcblxudmFyIF9Bc3ltbWV0cmljTWF0Y2hlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoXG4gIHJlcXVpcmUoJy4vcGx1Z2lucy9Bc3ltbWV0cmljTWF0Y2hlcicpXG4pO1xuXG52YXIgX0NvbnZlcnRBbnNpID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKCcuL3BsdWdpbnMvQ29udmVydEFuc2knKSk7XG5cbnZhciBfRE9NQ29sbGVjdGlvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZSgnLi9wbHVnaW5zL0RPTUNvbGxlY3Rpb24nKSk7XG5cbnZhciBfRE9NRWxlbWVudCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZSgnLi9wbHVnaW5zL0RPTUVsZW1lbnQnKSk7XG5cbnZhciBfSW1tdXRhYmxlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKCcuL3BsdWdpbnMvSW1tdXRhYmxlJykpO1xuXG52YXIgX1JlYWN0RWxlbWVudCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZSgnLi9wbHVnaW5zL1JlYWN0RWxlbWVudCcpKTtcblxudmFyIF9SZWFjdFRlc3RDb21wb25lbnQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KFxuICByZXF1aXJlKCcuL3BsdWdpbnMvUmVhY3RUZXN0Q29tcG9uZW50Jylcbik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7XG4gIHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ZGVmYXVsdDogb2JqfTtcbn1cblxuLyoqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBsb2NhbC9iYW4tdHlwZXMtZXZlbnR1YWxseSAqL1xuY29uc3QgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuY29uc3QgdG9JU09TdHJpbmcgPSBEYXRlLnByb3RvdHlwZS50b0lTT1N0cmluZztcbmNvbnN0IGVycm9yVG9TdHJpbmcgPSBFcnJvci5wcm90b3R5cGUudG9TdHJpbmc7XG5jb25zdCByZWdFeHBUb1N0cmluZyA9IFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmc7XG4vKipcbiAqIEV4cGxpY2l0bHkgY29tcGFyaW5nIHR5cGVvZiBjb25zdHJ1Y3RvciB0byBmdW5jdGlvbiBhdm9pZHMgdW5kZWZpbmVkIGFzIG5hbWVcbiAqIHdoZW4gbW9jayBpZGVudGl0eS1vYmotcHJveHkgcmV0dXJucyB0aGUga2V5IGFzIHRoZSB2YWx1ZSBmb3IgYW55IGtleS5cbiAqL1xuXG5jb25zdCBnZXRDb25zdHJ1Y3Rvck5hbWUgPSB2YWwgPT5cbiAgKHR5cGVvZiB2YWwuY29uc3RydWN0b3IgPT09ICdmdW5jdGlvbicgJiYgdmFsLmNvbnN0cnVjdG9yLm5hbWUpIHx8ICdPYmplY3QnO1xuLyogZ2xvYmFsIHdpbmRvdyAqL1xuXG4vKiogSXMgdmFsIGlzIGVxdWFsIHRvIGdsb2JhbCB3aW5kb3cgb2JqZWN0PyBXb3JrcyBldmVuIGlmIGl0IGRvZXMgbm90IGV4aXN0IDopICovXG5cbmNvbnN0IGlzV2luZG93ID0gdmFsID0+IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHZhbCA9PT0gd2luZG93O1xuXG5jb25zdCBTWU1CT0xfUkVHRVhQID0gL15TeW1ib2xcXCgoLiopXFwpKC4qKSQvO1xuY29uc3QgTkVXTElORV9SRUdFWFAgPSAvXFxuL2dpO1xuXG5jbGFzcyBQcmV0dHlGb3JtYXRQbHVnaW5FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZSwgc3RhY2spIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLnN0YWNrID0gc3RhY2s7XG4gICAgdGhpcy5uYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzVG9TdHJpbmdlZEFycmF5VHlwZSh0b1N0cmluZ2VkKSB7XG4gIHJldHVybiAoXG4gICAgdG9TdHJpbmdlZCA9PT0gJ1tvYmplY3QgQXJyYXldJyB8fFxuICAgIHRvU3RyaW5nZWQgPT09ICdbb2JqZWN0IEFycmF5QnVmZmVyXScgfHxcbiAgICB0b1N0cmluZ2VkID09PSAnW29iamVjdCBEYXRhVmlld10nIHx8XG4gICAgdG9TdHJpbmdlZCA9PT0gJ1tvYmplY3QgRmxvYXQzMkFycmF5XScgfHxcbiAgICB0b1N0cmluZ2VkID09PSAnW29iamVjdCBGbG9hdDY0QXJyYXldJyB8fFxuICAgIHRvU3RyaW5nZWQgPT09ICdbb2JqZWN0IEludDhBcnJheV0nIHx8XG4gICAgdG9TdHJpbmdlZCA9PT0gJ1tvYmplY3QgSW50MTZBcnJheV0nIHx8XG4gICAgdG9TdHJpbmdlZCA9PT0gJ1tvYmplY3QgSW50MzJBcnJheV0nIHx8XG4gICAgdG9TdHJpbmdlZCA9PT0gJ1tvYmplY3QgVWludDhBcnJheV0nIHx8XG4gICAgdG9TdHJpbmdlZCA9PT0gJ1tvYmplY3QgVWludDhDbGFtcGVkQXJyYXldJyB8fFxuICAgIHRvU3RyaW5nZWQgPT09ICdbb2JqZWN0IFVpbnQxNkFycmF5XScgfHxcbiAgICB0b1N0cmluZ2VkID09PSAnW29iamVjdCBVaW50MzJBcnJheV0nXG4gICk7XG59XG5cbmZ1bmN0aW9uIHByaW50TnVtYmVyKHZhbCkge1xuICByZXR1cm4gT2JqZWN0LmlzKHZhbCwgLTApID8gJy0wJyA6IFN0cmluZyh2YWwpO1xufVxuXG5mdW5jdGlvbiBwcmludEJpZ0ludCh2YWwpIHtcbiAgcmV0dXJuIFN0cmluZyhgJHt2YWx9bmApO1xufVxuXG5mdW5jdGlvbiBwcmludEZ1bmN0aW9uKHZhbCwgcHJpbnRGdW5jdGlvbk5hbWUpIHtcbiAgaWYgKCFwcmludEZ1bmN0aW9uTmFtZSkge1xuICAgIHJldHVybiAnW0Z1bmN0aW9uXSc7XG4gIH1cblxuICByZXR1cm4gJ1tGdW5jdGlvbiAnICsgKHZhbC5uYW1lIHx8ICdhbm9ueW1vdXMnKSArICddJztcbn1cblxuZnVuY3Rpb24gcHJpbnRTeW1ib2wodmFsKSB7XG4gIHJldHVybiBTdHJpbmcodmFsKS5yZXBsYWNlKFNZTUJPTF9SRUdFWFAsICdTeW1ib2woJDEpJyk7XG59XG5cbmZ1bmN0aW9uIHByaW50RXJyb3IodmFsKSB7XG4gIHJldHVybiAnWycgKyBlcnJvclRvU3RyaW5nLmNhbGwodmFsKSArICddJztcbn1cbi8qKlxuICogVGhlIGZpcnN0IHBvcnQgb2YgY2FsbCBmb3IgcHJpbnRpbmcgYW4gb2JqZWN0LCBoYW5kbGVzIG1vc3Qgb2YgdGhlXG4gKiBkYXRhLXR5cGVzIGluIEpTLlxuICovXG5cbmZ1bmN0aW9uIHByaW50QmFzaWNWYWx1ZSh2YWwsIHByaW50RnVuY3Rpb25OYW1lLCBlc2NhcGVSZWdleCwgZXNjYXBlU3RyaW5nKSB7XG4gIGlmICh2YWwgPT09IHRydWUgfHwgdmFsID09PSBmYWxzZSkge1xuICAgIHJldHVybiAnJyArIHZhbDtcbiAgfVxuXG4gIGlmICh2YWwgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiAndW5kZWZpbmVkJztcbiAgfVxuXG4gIGlmICh2YWwgPT09IG51bGwpIHtcbiAgICByZXR1cm4gJ251bGwnO1xuICB9XG5cbiAgY29uc3QgdHlwZU9mID0gdHlwZW9mIHZhbDtcblxuICBpZiAodHlwZU9mID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBwcmludE51bWJlcih2YWwpO1xuICB9XG5cbiAgaWYgKHR5cGVPZiA9PT0gJ2JpZ2ludCcpIHtcbiAgICByZXR1cm4gcHJpbnRCaWdJbnQodmFsKTtcbiAgfVxuXG4gIGlmICh0eXBlT2YgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKGVzY2FwZVN0cmluZykge1xuICAgICAgcmV0dXJuICdcIicgKyB2YWwucmVwbGFjZSgvXCJ8XFxcXC9nLCAnXFxcXCQmJykgKyAnXCInO1xuICAgIH1cblxuICAgIHJldHVybiAnXCInICsgdmFsICsgJ1wiJztcbiAgfVxuXG4gIGlmICh0eXBlT2YgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gcHJpbnRGdW5jdGlvbih2YWwsIHByaW50RnVuY3Rpb25OYW1lKTtcbiAgfVxuXG4gIGlmICh0eXBlT2YgPT09ICdzeW1ib2wnKSB7XG4gICAgcmV0dXJuIHByaW50U3ltYm9sKHZhbCk7XG4gIH1cblxuICBjb25zdCB0b1N0cmluZ2VkID0gdG9TdHJpbmcuY2FsbCh2YWwpO1xuXG4gIGlmICh0b1N0cmluZ2VkID09PSAnW29iamVjdCBXZWFrTWFwXScpIHtcbiAgICByZXR1cm4gJ1dlYWtNYXAge30nO1xuICB9XG5cbiAgaWYgKHRvU3RyaW5nZWQgPT09ICdbb2JqZWN0IFdlYWtTZXRdJykge1xuICAgIHJldHVybiAnV2Vha1NldCB7fSc7XG4gIH1cblxuICBpZiAoXG4gICAgdG9TdHJpbmdlZCA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJyB8fFxuICAgIHRvU3RyaW5nZWQgPT09ICdbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXSdcbiAgKSB7XG4gICAgcmV0dXJuIHByaW50RnVuY3Rpb24odmFsLCBwcmludEZ1bmN0aW9uTmFtZSk7XG4gIH1cblxuICBpZiAodG9TdHJpbmdlZCA9PT0gJ1tvYmplY3QgU3ltYm9sXScpIHtcbiAgICByZXR1cm4gcHJpbnRTeW1ib2wodmFsKTtcbiAgfVxuXG4gIGlmICh0b1N0cmluZ2VkID09PSAnW29iamVjdCBEYXRlXScpIHtcbiAgICByZXR1cm4gaXNOYU4oK3ZhbCkgPyAnRGF0ZSB7IE5hTiB9JyA6IHRvSVNPU3RyaW5nLmNhbGwodmFsKTtcbiAgfVxuXG4gIGlmICh0b1N0cmluZ2VkID09PSAnW29iamVjdCBFcnJvcl0nKSB7XG4gICAgcmV0dXJuIHByaW50RXJyb3IodmFsKTtcbiAgfVxuXG4gIGlmICh0b1N0cmluZ2VkID09PSAnW29iamVjdCBSZWdFeHBdJykge1xuICAgIGlmIChlc2NhcGVSZWdleCkge1xuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2JlbmphbWluZ3IvUmVnRXhwLmVzY2FwZS9ibG9iL21haW4vcG9seWZpbGwuanNcbiAgICAgIHJldHVybiByZWdFeHBUb1N0cmluZy5jYWxsKHZhbCkucmVwbGFjZSgvW1xcXFxeJCorPy4oKXxbXFxde31dL2csICdcXFxcJCYnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVnRXhwVG9TdHJpbmcuY2FsbCh2YWwpO1xuICB9XG5cbiAgaWYgKHZhbCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgcmV0dXJuIHByaW50RXJyb3IodmFsKTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuLyoqXG4gKiBIYW5kbGVzIG1vcmUgY29tcGxleCBvYmplY3RzICggc3VjaCBhcyBvYmplY3RzIHdpdGggY2lyY3VsYXIgcmVmZXJlbmNlcy5cbiAqIG1hcHMgYW5kIHNldHMgZXRjIClcbiAqL1xuXG5mdW5jdGlvbiBwcmludENvbXBsZXhWYWx1ZShcbiAgdmFsLFxuICBjb25maWcsXG4gIGluZGVudGF0aW9uLFxuICBkZXB0aCxcbiAgcmVmcyxcbiAgaGFzQ2FsbGVkVG9KU09OXG4pIHtcbiAgaWYgKHJlZnMuaW5kZXhPZih2YWwpICE9PSAtMSkge1xuICAgIHJldHVybiAnW0NpcmN1bGFyXSc7XG4gIH1cblxuICByZWZzID0gcmVmcy5zbGljZSgpO1xuICByZWZzLnB1c2godmFsKTtcbiAgY29uc3QgaGl0TWF4RGVwdGggPSArK2RlcHRoID4gY29uZmlnLm1heERlcHRoO1xuICBjb25zdCBtaW4gPSBjb25maWcubWluO1xuXG4gIGlmIChcbiAgICBjb25maWcuY2FsbFRvSlNPTiAmJlxuICAgICFoaXRNYXhEZXB0aCAmJlxuICAgIHZhbC50b0pTT04gJiZcbiAgICB0eXBlb2YgdmFsLnRvSlNPTiA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICFoYXNDYWxsZWRUb0pTT05cbiAgKSB7XG4gICAgcmV0dXJuIHByaW50ZXIodmFsLnRvSlNPTigpLCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcywgdHJ1ZSk7XG4gIH1cblxuICBjb25zdCB0b1N0cmluZ2VkID0gdG9TdHJpbmcuY2FsbCh2YWwpO1xuXG4gIGlmICh0b1N0cmluZ2VkID09PSAnW29iamVjdCBBcmd1bWVudHNdJykge1xuICAgIHJldHVybiBoaXRNYXhEZXB0aFxuICAgICAgPyAnW0FyZ3VtZW50c10nXG4gICAgICA6IChtaW4gPyAnJyA6ICdBcmd1bWVudHMgJykgK1xuICAgICAgICAgICdbJyArXG4gICAgICAgICAgKDAsIF9jb2xsZWN0aW9ucy5wcmludExpc3RJdGVtcykoXG4gICAgICAgICAgICB2YWwsXG4gICAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgICBpbmRlbnRhdGlvbixcbiAgICAgICAgICAgIGRlcHRoLFxuICAgICAgICAgICAgcmVmcyxcbiAgICAgICAgICAgIHByaW50ZXJcbiAgICAgICAgICApICtcbiAgICAgICAgICAnXSc7XG4gIH1cblxuICBpZiAoaXNUb1N0cmluZ2VkQXJyYXlUeXBlKHRvU3RyaW5nZWQpKSB7XG4gICAgcmV0dXJuIGhpdE1heERlcHRoXG4gICAgICA/ICdbJyArIHZhbC5jb25zdHJ1Y3Rvci5uYW1lICsgJ10nXG4gICAgICA6IChtaW5cbiAgICAgICAgICA/ICcnXG4gICAgICAgICAgOiAhY29uZmlnLnByaW50QmFzaWNQcm90b3R5cGUgJiYgdmFsLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdBcnJheSdcbiAgICAgICAgICA/ICcnXG4gICAgICAgICAgOiB2YWwuY29uc3RydWN0b3IubmFtZSArICcgJykgK1xuICAgICAgICAgICdbJyArXG4gICAgICAgICAgKDAsIF9jb2xsZWN0aW9ucy5wcmludExpc3RJdGVtcykoXG4gICAgICAgICAgICB2YWwsXG4gICAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgICBpbmRlbnRhdGlvbixcbiAgICAgICAgICAgIGRlcHRoLFxuICAgICAgICAgICAgcmVmcyxcbiAgICAgICAgICAgIHByaW50ZXJcbiAgICAgICAgICApICtcbiAgICAgICAgICAnXSc7XG4gIH1cblxuICBpZiAodG9TdHJpbmdlZCA9PT0gJ1tvYmplY3QgTWFwXScpIHtcbiAgICByZXR1cm4gaGl0TWF4RGVwdGhcbiAgICAgID8gJ1tNYXBdJ1xuICAgICAgOiAnTWFwIHsnICtcbiAgICAgICAgICAoMCwgX2NvbGxlY3Rpb25zLnByaW50SXRlcmF0b3JFbnRyaWVzKShcbiAgICAgICAgICAgIHZhbC5lbnRyaWVzKCksXG4gICAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgICBpbmRlbnRhdGlvbixcbiAgICAgICAgICAgIGRlcHRoLFxuICAgICAgICAgICAgcmVmcyxcbiAgICAgICAgICAgIHByaW50ZXIsXG4gICAgICAgICAgICAnID0+ICdcbiAgICAgICAgICApICtcbiAgICAgICAgICAnfSc7XG4gIH1cblxuICBpZiAodG9TdHJpbmdlZCA9PT0gJ1tvYmplY3QgU2V0XScpIHtcbiAgICByZXR1cm4gaGl0TWF4RGVwdGhcbiAgICAgID8gJ1tTZXRdJ1xuICAgICAgOiAnU2V0IHsnICtcbiAgICAgICAgICAoMCwgX2NvbGxlY3Rpb25zLnByaW50SXRlcmF0b3JWYWx1ZXMpKFxuICAgICAgICAgICAgdmFsLnZhbHVlcygpLFxuICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAgaW5kZW50YXRpb24sXG4gICAgICAgICAgICBkZXB0aCxcbiAgICAgICAgICAgIHJlZnMsXG4gICAgICAgICAgICBwcmludGVyXG4gICAgICAgICAgKSArXG4gICAgICAgICAgJ30nO1xuICB9IC8vIEF2b2lkIGZhaWx1cmUgdG8gc2VyaWFsaXplIGdsb2JhbCB3aW5kb3cgb2JqZWN0IGluIGpzZG9tIHRlc3QgZW52aXJvbm1lbnQuXG4gIC8vIEZvciBleGFtcGxlLCBub3QgZXZlbiByZWxldmFudCBpZiB3aW5kb3cgaXMgcHJvcCBvZiBSZWFjdCBlbGVtZW50LlxuXG4gIHJldHVybiBoaXRNYXhEZXB0aCB8fCBpc1dpbmRvdyh2YWwpXG4gICAgPyAnWycgKyBnZXRDb25zdHJ1Y3Rvck5hbWUodmFsKSArICddJ1xuICAgIDogKG1pblxuICAgICAgICA/ICcnXG4gICAgICAgIDogIWNvbmZpZy5wcmludEJhc2ljUHJvdG90eXBlICYmIGdldENvbnN0cnVjdG9yTmFtZSh2YWwpID09PSAnT2JqZWN0J1xuICAgICAgICA/ICcnXG4gICAgICAgIDogZ2V0Q29uc3RydWN0b3JOYW1lKHZhbCkgKyAnICcpICtcbiAgICAgICAgJ3snICtcbiAgICAgICAgKDAsIF9jb2xsZWN0aW9ucy5wcmludE9iamVjdFByb3BlcnRpZXMpKFxuICAgICAgICAgIHZhbCxcbiAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgaW5kZW50YXRpb24sXG4gICAgICAgICAgZGVwdGgsXG4gICAgICAgICAgcmVmcyxcbiAgICAgICAgICBwcmludGVyXG4gICAgICAgICkgK1xuICAgICAgICAnfSc7XG59XG5cbmZ1bmN0aW9uIGlzTmV3UGx1Z2luKHBsdWdpbikge1xuICByZXR1cm4gcGx1Z2luLnNlcmlhbGl6ZSAhPSBudWxsO1xufVxuXG5mdW5jdGlvbiBwcmludFBsdWdpbihwbHVnaW4sIHZhbCwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMpIHtcbiAgbGV0IHByaW50ZWQ7XG5cbiAgdHJ5IHtcbiAgICBwcmludGVkID0gaXNOZXdQbHVnaW4ocGx1Z2luKVxuICAgICAgPyBwbHVnaW4uc2VyaWFsaXplKHZhbCwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMsIHByaW50ZXIpXG4gICAgICA6IHBsdWdpbi5wcmludChcbiAgICAgICAgICB2YWwsXG4gICAgICAgICAgdmFsQ2hpbGQgPT4gcHJpbnRlcih2YWxDaGlsZCwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMpLFxuICAgICAgICAgIHN0ciA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbmRlbnRhdGlvbk5leHQgPSBpbmRlbnRhdGlvbiArIGNvbmZpZy5pbmRlbnQ7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICBpbmRlbnRhdGlvbk5leHQgK1xuICAgICAgICAgICAgICBzdHIucmVwbGFjZShORVdMSU5FX1JFR0VYUCwgJ1xcbicgKyBpbmRlbnRhdGlvbk5leHQpXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgZWRnZVNwYWNpbmc6IGNvbmZpZy5zcGFjaW5nT3V0ZXIsXG4gICAgICAgICAgICBtaW46IGNvbmZpZy5taW4sXG4gICAgICAgICAgICBzcGFjaW5nOiBjb25maWcuc3BhY2luZ0lubmVyXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjb25maWcuY29sb3JzXG4gICAgICAgICk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdGhyb3cgbmV3IFByZXR0eUZvcm1hdFBsdWdpbkVycm9yKGVycm9yLm1lc3NhZ2UsIGVycm9yLnN0YWNrKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgcHJpbnRlZCAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgcHJldHR5LWZvcm1hdDogUGx1Z2luIG11c3QgcmV0dXJuIHR5cGUgXCJzdHJpbmdcIiBidXQgaW5zdGVhZCByZXR1cm5lZCBcIiR7dHlwZW9mIHByaW50ZWR9XCIuYFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gcHJpbnRlZDtcbn1cblxuZnVuY3Rpb24gZmluZFBsdWdpbihwbHVnaW5zLCB2YWwpIHtcbiAgZm9yIChsZXQgcCA9IDA7IHAgPCBwbHVnaW5zLmxlbmd0aDsgcCsrKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChwbHVnaW5zW3BdLnRlc3QodmFsKSkge1xuICAgICAgICByZXR1cm4gcGx1Z2luc1twXTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IFByZXR0eUZvcm1hdFBsdWdpbkVycm9yKGVycm9yLm1lc3NhZ2UsIGVycm9yLnN0YWNrKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gcHJpbnRlcih2YWwsIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBoYXNDYWxsZWRUb0pTT04pIHtcbiAgY29uc3QgcGx1Z2luID0gZmluZFBsdWdpbihjb25maWcucGx1Z2lucywgdmFsKTtcblxuICBpZiAocGx1Z2luICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIHByaW50UGx1Z2luKHBsdWdpbiwgdmFsLCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcyk7XG4gIH1cblxuICBjb25zdCBiYXNpY1Jlc3VsdCA9IHByaW50QmFzaWNWYWx1ZShcbiAgICB2YWwsXG4gICAgY29uZmlnLnByaW50RnVuY3Rpb25OYW1lLFxuICAgIGNvbmZpZy5lc2NhcGVSZWdleCxcbiAgICBjb25maWcuZXNjYXBlU3RyaW5nXG4gICk7XG5cbiAgaWYgKGJhc2ljUmVzdWx0ICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIGJhc2ljUmVzdWx0O1xuICB9XG5cbiAgcmV0dXJuIHByaW50Q29tcGxleFZhbHVlKFxuICAgIHZhbCxcbiAgICBjb25maWcsXG4gICAgaW5kZW50YXRpb24sXG4gICAgZGVwdGgsXG4gICAgcmVmcyxcbiAgICBoYXNDYWxsZWRUb0pTT05cbiAgKTtcbn1cblxuY29uc3QgREVGQVVMVF9USEVNRSA9IHtcbiAgY29tbWVudDogJ2dyYXknLFxuICBjb250ZW50OiAncmVzZXQnLFxuICBwcm9wOiAneWVsbG93JyxcbiAgdGFnOiAnY3lhbicsXG4gIHZhbHVlOiAnZ3JlZW4nXG59O1xuY29uc3QgREVGQVVMVF9USEVNRV9LRVlTID0gT2JqZWN0LmtleXMoREVGQVVMVF9USEVNRSk7XG5jb25zdCBERUZBVUxUX09QVElPTlMgPSB7XG4gIGNhbGxUb0pTT046IHRydWUsXG4gIGNvbXBhcmVLZXlzOiB1bmRlZmluZWQsXG4gIGVzY2FwZVJlZ2V4OiBmYWxzZSxcbiAgZXNjYXBlU3RyaW5nOiB0cnVlLFxuICBoaWdobGlnaHQ6IGZhbHNlLFxuICBpbmRlbnQ6IDIsXG4gIG1heERlcHRoOiBJbmZpbml0eSxcbiAgbWluOiBmYWxzZSxcbiAgcGx1Z2luczogW10sXG4gIHByaW50QmFzaWNQcm90b3R5cGU6IHRydWUsXG4gIHByaW50RnVuY3Rpb25OYW1lOiB0cnVlLFxuICB0aGVtZTogREVGQVVMVF9USEVNRVxufTtcbmV4cG9ydHMuREVGQVVMVF9PUFRJT05TID0gREVGQVVMVF9PUFRJT05TO1xuXG5mdW5jdGlvbiB2YWxpZGF0ZU9wdGlvbnMob3B0aW9ucykge1xuICBPYmplY3Qua2V5cyhvcHRpb25zKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgaWYgKCFERUZBVUxUX09QVElPTlMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBwcmV0dHktZm9ybWF0OiBVbmtub3duIG9wdGlvbiBcIiR7a2V5fVwiLmApO1xuICAgIH1cbiAgfSk7XG5cbiAgaWYgKG9wdGlvbnMubWluICYmIG9wdGlvbnMuaW5kZW50ICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5pbmRlbnQgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAncHJldHR5LWZvcm1hdDogT3B0aW9ucyBcIm1pblwiIGFuZCBcImluZGVudFwiIGNhbm5vdCBiZSB1c2VkIHRvZ2V0aGVyLidcbiAgICApO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMudGhlbWUgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChvcHRpb25zLnRoZW1lID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHByZXR0eS1mb3JtYXQ6IE9wdGlvbiBcInRoZW1lXCIgbXVzdCBub3QgYmUgbnVsbC5gKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMudGhlbWUgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBwcmV0dHktZm9ybWF0OiBPcHRpb24gXCJ0aGVtZVwiIG11c3QgYmUgb2YgdHlwZSBcIm9iamVjdFwiIGJ1dCBpbnN0ZWFkIHJlY2VpdmVkIFwiJHt0eXBlb2Ygb3B0aW9ucy50aGVtZX1cIi5gXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG5jb25zdCBnZXRDb2xvcnNIaWdobGlnaHQgPSBvcHRpb25zID0+XG4gIERFRkFVTFRfVEhFTUVfS0VZUy5yZWR1Y2UoKGNvbG9ycywga2V5KSA9PiB7XG4gICAgY29uc3QgdmFsdWUgPVxuICAgICAgb3B0aW9ucy50aGVtZSAmJiBvcHRpb25zLnRoZW1lW2tleV0gIT09IHVuZGVmaW5lZFxuICAgICAgICA/IG9wdGlvbnMudGhlbWVba2V5XVxuICAgICAgICA6IERFRkFVTFRfVEhFTUVba2V5XTtcbiAgICBjb25zdCBjb2xvciA9IHZhbHVlICYmIF9hbnNpU3R5bGVzLmRlZmF1bHRbdmFsdWVdO1xuXG4gICAgaWYgKFxuICAgICAgY29sb3IgJiZcbiAgICAgIHR5cGVvZiBjb2xvci5jbG9zZSA9PT0gJ3N0cmluZycgJiZcbiAgICAgIHR5cGVvZiBjb2xvci5vcGVuID09PSAnc3RyaW5nJ1xuICAgICkge1xuICAgICAgY29sb3JzW2tleV0gPSBjb2xvcjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgcHJldHR5LWZvcm1hdDogT3B0aW9uIFwidGhlbWVcIiBoYXMgYSBrZXkgXCIke2tleX1cIiB3aG9zZSB2YWx1ZSBcIiR7dmFsdWV9XCIgaXMgdW5kZWZpbmVkIGluIGFuc2ktc3R5bGVzLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbG9ycztcbiAgfSwgT2JqZWN0LmNyZWF0ZShudWxsKSk7XG5cbmNvbnN0IGdldENvbG9yc0VtcHR5ID0gKCkgPT5cbiAgREVGQVVMVF9USEVNRV9LRVlTLnJlZHVjZSgoY29sb3JzLCBrZXkpID0+IHtcbiAgICBjb2xvcnNba2V5XSA9IHtcbiAgICAgIGNsb3NlOiAnJyxcbiAgICAgIG9wZW46ICcnXG4gICAgfTtcbiAgICByZXR1cm4gY29sb3JzO1xuICB9LCBPYmplY3QuY3JlYXRlKG51bGwpKTtcblxuY29uc3QgZ2V0UHJpbnRGdW5jdGlvbk5hbWUgPSBvcHRpb25zID0+XG4gIG9wdGlvbnMgJiYgb3B0aW9ucy5wcmludEZ1bmN0aW9uTmFtZSAhPT0gdW5kZWZpbmVkXG4gICAgPyBvcHRpb25zLnByaW50RnVuY3Rpb25OYW1lXG4gICAgOiBERUZBVUxUX09QVElPTlMucHJpbnRGdW5jdGlvbk5hbWU7XG5cbmNvbnN0IGdldEVzY2FwZVJlZ2V4ID0gb3B0aW9ucyA9PlxuICBvcHRpb25zICYmIG9wdGlvbnMuZXNjYXBlUmVnZXggIT09IHVuZGVmaW5lZFxuICAgID8gb3B0aW9ucy5lc2NhcGVSZWdleFxuICAgIDogREVGQVVMVF9PUFRJT05TLmVzY2FwZVJlZ2V4O1xuXG5jb25zdCBnZXRFc2NhcGVTdHJpbmcgPSBvcHRpb25zID0+XG4gIG9wdGlvbnMgJiYgb3B0aW9ucy5lc2NhcGVTdHJpbmcgIT09IHVuZGVmaW5lZFxuICAgID8gb3B0aW9ucy5lc2NhcGVTdHJpbmdcbiAgICA6IERFRkFVTFRfT1BUSU9OUy5lc2NhcGVTdHJpbmc7XG5cbmNvbnN0IGdldENvbmZpZyA9IG9wdGlvbnMgPT4ge1xuICB2YXIgX29wdGlvbnMkcHJpbnRCYXNpY1ByO1xuXG4gIHJldHVybiB7XG4gICAgY2FsbFRvSlNPTjpcbiAgICAgIG9wdGlvbnMgJiYgb3B0aW9ucy5jYWxsVG9KU09OICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBvcHRpb25zLmNhbGxUb0pTT05cbiAgICAgICAgOiBERUZBVUxUX09QVElPTlMuY2FsbFRvSlNPTixcbiAgICBjb2xvcnM6XG4gICAgICBvcHRpb25zICYmIG9wdGlvbnMuaGlnaGxpZ2h0XG4gICAgICAgID8gZ2V0Q29sb3JzSGlnaGxpZ2h0KG9wdGlvbnMpXG4gICAgICAgIDogZ2V0Q29sb3JzRW1wdHkoKSxcbiAgICBjb21wYXJlS2V5czpcbiAgICAgIG9wdGlvbnMgJiYgdHlwZW9mIG9wdGlvbnMuY29tcGFyZUtleXMgPT09ICdmdW5jdGlvbidcbiAgICAgICAgPyBvcHRpb25zLmNvbXBhcmVLZXlzXG4gICAgICAgIDogREVGQVVMVF9PUFRJT05TLmNvbXBhcmVLZXlzLFxuICAgIGVzY2FwZVJlZ2V4OiBnZXRFc2NhcGVSZWdleChvcHRpb25zKSxcbiAgICBlc2NhcGVTdHJpbmc6IGdldEVzY2FwZVN0cmluZyhvcHRpb25zKSxcbiAgICBpbmRlbnQ6XG4gICAgICBvcHRpb25zICYmIG9wdGlvbnMubWluXG4gICAgICAgID8gJydcbiAgICAgICAgOiBjcmVhdGVJbmRlbnQoXG4gICAgICAgICAgICBvcHRpb25zICYmIG9wdGlvbnMuaW5kZW50ICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgPyBvcHRpb25zLmluZGVudFxuICAgICAgICAgICAgICA6IERFRkFVTFRfT1BUSU9OUy5pbmRlbnRcbiAgICAgICAgICApLFxuICAgIG1heERlcHRoOlxuICAgICAgb3B0aW9ucyAmJiBvcHRpb25zLm1heERlcHRoICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBvcHRpb25zLm1heERlcHRoXG4gICAgICAgIDogREVGQVVMVF9PUFRJT05TLm1heERlcHRoLFxuICAgIG1pbjpcbiAgICAgIG9wdGlvbnMgJiYgb3B0aW9ucy5taW4gIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMubWluIDogREVGQVVMVF9PUFRJT05TLm1pbixcbiAgICBwbHVnaW5zOlxuICAgICAgb3B0aW9ucyAmJiBvcHRpb25zLnBsdWdpbnMgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IG9wdGlvbnMucGx1Z2luc1xuICAgICAgICA6IERFRkFVTFRfT1BUSU9OUy5wbHVnaW5zLFxuICAgIHByaW50QmFzaWNQcm90b3R5cGU6XG4gICAgICAoX29wdGlvbnMkcHJpbnRCYXNpY1ByID1cbiAgICAgICAgb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDBcbiAgICAgICAgICA/IHZvaWQgMFxuICAgICAgICAgIDogb3B0aW9ucy5wcmludEJhc2ljUHJvdG90eXBlKSAhPT0gbnVsbCAmJlxuICAgICAgX29wdGlvbnMkcHJpbnRCYXNpY1ByICE9PSB2b2lkIDBcbiAgICAgICAgPyBfb3B0aW9ucyRwcmludEJhc2ljUHJcbiAgICAgICAgOiB0cnVlLFxuICAgIHByaW50RnVuY3Rpb25OYW1lOiBnZXRQcmludEZ1bmN0aW9uTmFtZShvcHRpb25zKSxcbiAgICBzcGFjaW5nSW5uZXI6IG9wdGlvbnMgJiYgb3B0aW9ucy5taW4gPyAnICcgOiAnXFxuJyxcbiAgICBzcGFjaW5nT3V0ZXI6IG9wdGlvbnMgJiYgb3B0aW9ucy5taW4gPyAnJyA6ICdcXG4nXG4gIH07XG59O1xuXG5mdW5jdGlvbiBjcmVhdGVJbmRlbnQoaW5kZW50KSB7XG4gIHJldHVybiBuZXcgQXJyYXkoaW5kZW50ICsgMSkuam9pbignICcpO1xufVxuLyoqXG4gKiBSZXR1cm5zIGEgcHJlc2VudGF0aW9uIHN0cmluZyBvZiB5b3VyIGB2YWxgIG9iamVjdFxuICogQHBhcmFtIHZhbCBhbnkgcG90ZW50aWFsIEphdmFTY3JpcHQgb2JqZWN0XG4gKiBAcGFyYW0gb3B0aW9ucyBDdXN0b20gc2V0dGluZ3NcbiAqL1xuXG5mdW5jdGlvbiBmb3JtYXQodmFsLCBvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zKSB7XG4gICAgdmFsaWRhdGVPcHRpb25zKG9wdGlvbnMpO1xuXG4gICAgaWYgKG9wdGlvbnMucGx1Z2lucykge1xuICAgICAgY29uc3QgcGx1Z2luID0gZmluZFBsdWdpbihvcHRpb25zLnBsdWdpbnMsIHZhbCk7XG5cbiAgICAgIGlmIChwbHVnaW4gIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHByaW50UGx1Z2luKHBsdWdpbiwgdmFsLCBnZXRDb25maWcob3B0aW9ucyksICcnLCAwLCBbXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgYmFzaWNSZXN1bHQgPSBwcmludEJhc2ljVmFsdWUoXG4gICAgdmFsLFxuICAgIGdldFByaW50RnVuY3Rpb25OYW1lKG9wdGlvbnMpLFxuICAgIGdldEVzY2FwZVJlZ2V4KG9wdGlvbnMpLFxuICAgIGdldEVzY2FwZVN0cmluZyhvcHRpb25zKVxuICApO1xuXG4gIGlmIChiYXNpY1Jlc3VsdCAhPT0gbnVsbCkge1xuICAgIHJldHVybiBiYXNpY1Jlc3VsdDtcbiAgfVxuXG4gIHJldHVybiBwcmludENvbXBsZXhWYWx1ZSh2YWwsIGdldENvbmZpZyhvcHRpb25zKSwgJycsIDAsIFtdKTtcbn1cblxuY29uc3QgcGx1Z2lucyA9IHtcbiAgQXN5bW1ldHJpY01hdGNoZXI6IF9Bc3ltbWV0cmljTWF0Y2hlci5kZWZhdWx0LFxuICBDb252ZXJ0QW5zaTogX0NvbnZlcnRBbnNpLmRlZmF1bHQsXG4gIERPTUNvbGxlY3Rpb246IF9ET01Db2xsZWN0aW9uLmRlZmF1bHQsXG4gIERPTUVsZW1lbnQ6IF9ET01FbGVtZW50LmRlZmF1bHQsXG4gIEltbXV0YWJsZTogX0ltbXV0YWJsZS5kZWZhdWx0LFxuICBSZWFjdEVsZW1lbnQ6IF9SZWFjdEVsZW1lbnQuZGVmYXVsdCxcbiAgUmVhY3RUZXN0Q29tcG9uZW50OiBfUmVhY3RUZXN0Q29tcG9uZW50LmRlZmF1bHRcbn07XG5leHBvcnRzLnBsdWdpbnMgPSBwbHVnaW5zO1xudmFyIF9kZWZhdWx0ID0gZm9ybWF0O1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgUGx1Z2luIGFzIFByZXR0eUZvcm1hdFBsdWdpbixcbiAgUGx1Z2lucyBhcyBQcmV0dHlGb3JtYXRQbHVnaW5zLFxufSBmcm9tICdwcmV0dHktZm9ybWF0J1xuaW1wb3J0IHtcbiAgcGx1Z2lucyBhcyBwcmV0dHlGb3JtYXRQbHVnaW5zLFxufSBmcm9tICdwcmV0dHktZm9ybWF0J1xuXG5jb25zdCB7XG4gIERPTUNvbGxlY3Rpb24sXG4gIERPTUVsZW1lbnQsXG4gIEltbXV0YWJsZSxcbiAgUmVhY3RFbGVtZW50LFxuICBSZWFjdFRlc3RDb21wb25lbnQsXG4gIEFzeW1tZXRyaWNNYXRjaGVyLFxufSA9IHByZXR0eUZvcm1hdFBsdWdpbnNcblxubGV0IFBMVUdJTlM6IFByZXR0eUZvcm1hdFBsdWdpbnMgPSBbXG4gIFJlYWN0VGVzdENvbXBvbmVudCxcbiAgUmVhY3RFbGVtZW50LFxuICBET01FbGVtZW50LFxuICBET01Db2xsZWN0aW9uLFxuICBJbW11dGFibGUsXG4gIEFzeW1tZXRyaWNNYXRjaGVyLFxuICAvLyBUT0RPOiB3cml0ZSBzaW5vbiBtb2NrIHNlcmlhbGl6ZXJcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL2plc3QvYmxvYi80ZWI0ZjZhNTliNmVhZTBlMDViOGU1MWRkOGNkM2ZkY2ExYzdhZmYxL3BhY2thZ2VzL2plc3Qtc25hcHNob3Qvc3JjL21vY2tTZXJpYWxpemVyLnRzI0w0XG5dXG5cbi8vIFRPRE86IGV4cG9zZSB0aGVzZSBhbmQgYWxsb3cgdXNlciB0byBhZGQgY3VzdG9tIHNlcmlhbGl6ZXJzXG4vLyBQcmVwZW5kIHRvIGxpc3Qgc28gdGhlIGxhc3QgYWRkZWQgaXMgdGhlIGZpcnN0IHRlc3RlZC5cbmV4cG9ydCBjb25zdCBhZGRTZXJpYWxpemVyID0gKHBsdWdpbjogUHJldHR5Rm9ybWF0UGx1Z2luKTogdm9pZCA9PiB7XG4gIFBMVUdJTlMgPSBbcGx1Z2luXS5jb25jYXQoUExVR0lOUylcbn1cblxuZXhwb3J0IGNvbnN0IGdldFNlcmlhbGl6ZXJzID0gKCk6IFByZXR0eUZvcm1hdFBsdWdpbnMgPT4gUExVR0lOU1xuIiwiLypcbkNvcHlyaWdodCAoYykgMjAwOC0yMDE2IFBpdm90YWwgTGFic1xuXG5QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmdcbmEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG53aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG5kaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG9cbnBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0b1xudGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuXG5UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZVxuaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG5cblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsXG5FWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbk1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EXG5OT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFXG5MSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OXG5PRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT05cbldJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4qL1xuXG5pbXBvcnQgeyBpc09iamVjdCB9IGZyb20gJy4uLy4uL3V0aWxzJ1xuaW1wb3J0IHR5cGUgeyBUZXN0ZXIgfSBmcm9tICcuL3R5cGVzJ1xuXG4vLyBFeHRyYWN0ZWQgb3V0IG9mIGphc21pbmUgMi41LjJcbmV4cG9ydCBmdW5jdGlvbiBlcXVhbHMoXG4gIGE6IHVua25vd24sXG4gIGI6IHVua25vd24sXG4gIGN1c3RvbVRlc3RlcnM/OiBBcnJheTxUZXN0ZXI+LFxuICBzdHJpY3RDaGVjaz86IGJvb2xlYW4sXG4pOiBib29sZWFuIHtcbiAgY3VzdG9tVGVzdGVycyA9IGN1c3RvbVRlc3RlcnMgfHwgW11cbiAgcmV0dXJuIGVxKGEsIGIsIFtdLCBbXSwgY3VzdG9tVGVzdGVycywgc3RyaWN0Q2hlY2sgPyBoYXNLZXkgOiBoYXNEZWZpbmVkS2V5KVxufVxuXG5jb25zdCBmdW5jdGlvblRvU3RyaW5nID0gRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nXG5cbmV4cG9ydCBmdW5jdGlvbiBpc0FzeW1tZXRyaWMob2JqOiBhbnkpIHtcbiAgcmV0dXJuICEhb2JqICYmIGlzQSgnRnVuY3Rpb24nLCBvYmouYXN5bW1ldHJpY01hdGNoKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzQXN5bW1ldHJpYyhvYmo6IGFueSwgc2VlbiA9IG5ldyBTZXQoKSk6IGJvb2xlYW4ge1xuICBpZiAoc2Vlbi5oYXMob2JqKSlcbiAgICByZXR1cm4gZmFsc2VcbiAgc2Vlbi5hZGQob2JqKVxuICBpZiAoaXNBc3ltbWV0cmljKG9iaikpXG4gICAgcmV0dXJuIHRydWVcbiAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSlcbiAgICByZXR1cm4gb2JqLnNvbWUoaSA9PiBoYXNBc3ltbWV0cmljKGksIHNlZW4pKVxuICBpZiAob2JqIGluc3RhbmNlb2YgU2V0KVxuICAgIHJldHVybiBBcnJheS5mcm9tKG9iaikuc29tZShpID0+IGhhc0FzeW1tZXRyaWMoaSwgc2VlbikpXG4gIGlmIChpc09iamVjdChvYmopKVxuICAgIHJldHVybiBPYmplY3QudmFsdWVzKG9iaikuc29tZSh2ID0+IGhhc0FzeW1tZXRyaWModiwgc2VlbikpXG4gIHJldHVybiBmYWxzZVxufVxuXG5mdW5jdGlvbiBhc3ltbWV0cmljTWF0Y2goYTogYW55LCBiOiBhbnkpIHtcbiAgY29uc3QgYXN5bW1ldHJpY0EgPSBpc0FzeW1tZXRyaWMoYSlcbiAgY29uc3QgYXN5bW1ldHJpY0IgPSBpc0FzeW1tZXRyaWMoYilcblxuICBpZiAoYXN5bW1ldHJpY0EgJiYgYXN5bW1ldHJpY0IpXG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuXG4gIGlmIChhc3ltbWV0cmljQSlcbiAgICByZXR1cm4gYS5hc3ltbWV0cmljTWF0Y2goYilcblxuICBpZiAoYXN5bW1ldHJpY0IpXG4gICAgcmV0dXJuIGIuYXN5bW1ldHJpY01hdGNoKGEpXG59XG5cbi8vIEVxdWFsaXR5IGZ1bmN0aW9uIGxvdmluZ2x5IGFkYXB0ZWQgZnJvbSBpc0VxdWFsIGluXG4vLyAgIFtVbmRlcnNjb3JlXShodHRwOi8vdW5kZXJzY29yZWpzLm9yZylcbmZ1bmN0aW9uIGVxKFxuICBhOiBhbnksXG4gIGI6IGFueSxcbiAgYVN0YWNrOiBBcnJheTx1bmtub3duPixcbiAgYlN0YWNrOiBBcnJheTx1bmtub3duPixcbiAgY3VzdG9tVGVzdGVyczogQXJyYXk8VGVzdGVyPixcbiAgaGFzS2V5OiBhbnksXG4pOiBib29sZWFuIHtcbiAgbGV0IHJlc3VsdCA9IHRydWVcblxuICBjb25zdCBhc3ltbWV0cmljUmVzdWx0ID0gYXN5bW1ldHJpY01hdGNoKGEsIGIpXG4gIGlmIChhc3ltbWV0cmljUmVzdWx0ICE9PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIGFzeW1tZXRyaWNSZXN1bHRcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGN1c3RvbVRlc3RlcnMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBjdXN0b21UZXN0ZXJSZXN1bHQgPSBjdXN0b21UZXN0ZXJzW2ldKGEsIGIpXG4gICAgaWYgKGN1c3RvbVRlc3RlclJlc3VsdCAhPT0gdW5kZWZpbmVkKVxuICAgICAgcmV0dXJuIGN1c3RvbVRlc3RlclJlc3VsdFxuICB9XG5cbiAgaWYgKGEgaW5zdGFuY2VvZiBFcnJvciAmJiBiIGluc3RhbmNlb2YgRXJyb3IpXG4gICAgcmV0dXJuIGEubWVzc2FnZSA9PT0gYi5tZXNzYWdlXG5cbiAgaWYgKE9iamVjdC5pcyhhLCBiKSlcbiAgICByZXR1cm4gdHJ1ZVxuXG4gIC8vIEEgc3RyaWN0IGNvbXBhcmlzb24gaXMgbmVjZXNzYXJ5IGJlY2F1c2UgYG51bGwgPT0gdW5kZWZpbmVkYC5cbiAgaWYgKGEgPT09IG51bGwgfHwgYiA9PT0gbnVsbClcbiAgICByZXR1cm4gYSA9PT0gYlxuXG4gIGNvbnN0IGNsYXNzTmFtZSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKVxuICBpZiAoY2xhc3NOYW1lICE9PSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYikpXG4gICAgcmV0dXJuIGZhbHNlXG5cbiAgc3dpdGNoIChjbGFzc05hbWUpIHtcbiAgICBjYXNlICdbb2JqZWN0IEJvb2xlYW5dJzpcbiAgICBjYXNlICdbb2JqZWN0IFN0cmluZ10nOlxuICAgIGNhc2UgJ1tvYmplY3QgTnVtYmVyXSc6XG4gICAgICBpZiAodHlwZW9mIGEgIT09IHR5cGVvZiBiKSB7XG4gICAgICAgIC8vIE9uZSBpcyBhIHByaW1pdGl2ZSwgb25lIGEgYG5ldyBQcmltaXRpdmUoKWBcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgICBlbHNlIGlmICh0eXBlb2YgYSAhPT0gJ29iamVjdCcgJiYgdHlwZW9mIGIgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIC8vIGJvdGggYXJlIHByb3BlciBwcmltaXRpdmVzXG4gICAgICAgIHJldHVybiBPYmplY3QuaXMoYSwgYilcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICAvLyBib3RoIGFyZSBgbmV3IFByaW1pdGl2ZSgpYHNcbiAgICAgICAgcmV0dXJuIE9iamVjdC5pcyhhLnZhbHVlT2YoKSwgYi52YWx1ZU9mKCkpXG4gICAgICB9XG4gICAgY2FzZSAnW29iamVjdCBEYXRlXSc6XG4gICAgICAvLyBDb2VyY2UgZGF0ZXMgdG8gbnVtZXJpYyBwcmltaXRpdmUgdmFsdWVzLiBEYXRlcyBhcmUgY29tcGFyZWQgYnkgdGhlaXJcbiAgICAgIC8vIG1pbGxpc2Vjb25kIHJlcHJlc2VudGF0aW9ucy4gTm90ZSB0aGF0IGludmFsaWQgZGF0ZXMgd2l0aCBtaWxsaXNlY29uZCByZXByZXNlbnRhdGlvbnNcbiAgICAgIC8vIG9mIGBOYU5gIGFyZSBub3QgZXF1aXZhbGVudC5cbiAgICAgIHJldHVybiArYSA9PT0gK2JcbiAgICAvLyBSZWdFeHBzIGFyZSBjb21wYXJlZCBieSB0aGVpciBzb3VyY2UgcGF0dGVybnMgYW5kIGZsYWdzLlxuICAgIGNhc2UgJ1tvYmplY3QgUmVnRXhwXSc6XG4gICAgICByZXR1cm4gYS5zb3VyY2UgPT09IGIuc291cmNlICYmIGEuZmxhZ3MgPT09IGIuZmxhZ3NcbiAgfVxuICBpZiAodHlwZW9mIGEgIT09ICdvYmplY3QnIHx8IHR5cGVvZiBiICE9PSAnb2JqZWN0JylcbiAgICByZXR1cm4gZmFsc2VcblxuICAvLyBVc2UgRE9NMyBtZXRob2QgaXNFcXVhbE5vZGUgKElFPj05KVxuICBpZiAoaXNEb21Ob2RlKGEpICYmIGlzRG9tTm9kZShiKSlcbiAgICByZXR1cm4gYS5pc0VxdWFsTm9kZShiKVxuXG4gIC8vIFVzZWQgdG8gZGV0ZWN0IGNpcmN1bGFyIHJlZmVyZW5jZXMuXG4gIGxldCBsZW5ndGggPSBhU3RhY2subGVuZ3RoXG4gIHdoaWxlIChsZW5ndGgtLSkge1xuICAgIC8vIExpbmVhciBzZWFyY2guIFBlcmZvcm1hbmNlIGlzIGludmVyc2VseSBwcm9wb3J0aW9uYWwgdG8gdGhlIG51bWJlciBvZlxuICAgIC8vIHVuaXF1ZSBuZXN0ZWQgc3RydWN0dXJlcy5cbiAgICAvLyBjaXJjdWxhciByZWZlcmVuY2VzIGF0IHNhbWUgZGVwdGggYXJlIGVxdWFsXG4gICAgLy8gY2lyY3VsYXIgcmVmZXJlbmNlIGlzIG5vdCBlcXVhbCB0byBub24tY2lyY3VsYXIgb25lXG4gICAgaWYgKGFTdGFja1tsZW5ndGhdID09PSBhKVxuICAgICAgcmV0dXJuIGJTdGFja1tsZW5ndGhdID09PSBiXG5cbiAgICBlbHNlIGlmIChiU3RhY2tbbGVuZ3RoXSA9PT0gYilcbiAgICAgIHJldHVybiBmYWxzZVxuICB9XG4gIC8vIEFkZCB0aGUgZmlyc3Qgb2JqZWN0IHRvIHRoZSBzdGFjayBvZiB0cmF2ZXJzZWQgb2JqZWN0cy5cbiAgYVN0YWNrLnB1c2goYSlcbiAgYlN0YWNrLnB1c2goYilcbiAgLy8gUmVjdXJzaXZlbHkgY29tcGFyZSBvYmplY3RzIGFuZCBhcnJheXMuXG4gIC8vIENvbXBhcmUgYXJyYXkgbGVuZ3RocyB0byBkZXRlcm1pbmUgaWYgYSBkZWVwIGNvbXBhcmlzb24gaXMgbmVjZXNzYXJ5LlxuICBpZiAoY2xhc3NOYW1lID09PSAnW29iamVjdCBBcnJheV0nICYmIGEubGVuZ3RoICE9PSBiLmxlbmd0aClcbiAgICByZXR1cm4gZmFsc2VcblxuICAvLyBEZWVwIGNvbXBhcmUgb2JqZWN0cy5cbiAgY29uc3QgYUtleXMgPSBrZXlzKGEsIGhhc0tleSlcbiAgbGV0IGtleVxuICBsZXQgc2l6ZSA9IGFLZXlzLmxlbmd0aFxuXG4gIC8vIEVuc3VyZSB0aGF0IGJvdGggb2JqZWN0cyBjb250YWluIHRoZSBzYW1lIG51bWJlciBvZiBwcm9wZXJ0aWVzIGJlZm9yZSBjb21wYXJpbmcgZGVlcCBlcXVhbGl0eS5cbiAgaWYgKGtleXMoYiwgaGFzS2V5KS5sZW5ndGggIT09IHNpemUpXG4gICAgcmV0dXJuIGZhbHNlXG5cbiAgd2hpbGUgKHNpemUtLSkge1xuICAgIGtleSA9IGFLZXlzW3NpemVdXG5cbiAgICAvLyBEZWVwIGNvbXBhcmUgZWFjaCBtZW1iZXJcbiAgICByZXN1bHRcbiAgICAgID0gaGFzS2V5KGIsIGtleSlcbiAgICAgICYmIGVxKGFba2V5XSwgYltrZXldLCBhU3RhY2ssIGJTdGFjaywgY3VzdG9tVGVzdGVycywgaGFzS2V5KVxuXG4gICAgaWYgKCFyZXN1bHQpXG4gICAgICByZXR1cm4gZmFsc2VcbiAgfVxuICAvLyBSZW1vdmUgdGhlIGZpcnN0IG9iamVjdCBmcm9tIHRoZSBzdGFjayBvZiB0cmF2ZXJzZWQgb2JqZWN0cy5cbiAgYVN0YWNrLnBvcCgpXG4gIGJTdGFjay5wb3AoKVxuXG4gIHJldHVybiByZXN1bHRcbn1cblxuZnVuY3Rpb24ga2V5cyhvYmo6IG9iamVjdCwgaGFzS2V5OiAob2JqOiBvYmplY3QsIGtleTogc3RyaW5nKSA9PiBib29sZWFuKSB7XG4gIGNvbnN0IGtleXMgPSBbXVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXhcbiAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgaWYgKGhhc0tleShvYmosIGtleSkpXG4gICAgICBrZXlzLnB1c2goa2V5KVxuICB9XG4gIHJldHVybiBrZXlzLmNvbmNhdChcbiAgICAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmopIGFzIEFycmF5PGFueT4pLmZpbHRlcihcbiAgICAgIHN5bWJvbCA9PlxuICAgICAgICAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIHN5bWJvbCkgYXMgUHJvcGVydHlEZXNjcmlwdG9yKVxuICAgICAgICAgIC5lbnVtZXJhYmxlLFxuICAgICksXG4gIClcbn1cblxuZnVuY3Rpb24gaGFzRGVmaW5lZEtleShvYmo6IGFueSwga2V5OiBzdHJpbmcpIHtcbiAgcmV0dXJuIGhhc0tleShvYmosIGtleSkgJiYgb2JqW2tleV0gIT09IHVuZGVmaW5lZFxufVxuXG5mdW5jdGlvbiBoYXNLZXkob2JqOiBhbnksIGtleTogc3RyaW5nKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0EodHlwZU5hbWU6IHN0cmluZywgdmFsdWU6IHVua25vd24pIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuYXBwbHkodmFsdWUpID09PSBgW29iamVjdCAke3R5cGVOYW1lfV1gXG59XG5cbmZ1bmN0aW9uIGlzRG9tTm9kZShvYmo6IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIG9iaiAhPT0gbnVsbFxuICAgICYmIHR5cGVvZiBvYmogPT09ICdvYmplY3QnXG4gICAgJiYgdHlwZW9mIG9iai5ub2RlVHlwZSA9PT0gJ251bWJlcidcbiAgICAmJiB0eXBlb2Ygb2JqLm5vZGVOYW1lID09PSAnc3RyaW5nJ1xuICAgICYmIHR5cGVvZiBvYmouaXNFcXVhbE5vZGUgPT09ICdmdW5jdGlvbidcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZm5OYW1lRm9yKGZ1bmM6IEZ1bmN0aW9uKSB7XG4gIGlmIChmdW5jLm5hbWUpXG4gICAgcmV0dXJuIGZ1bmMubmFtZVxuXG4gIGNvbnN0IG1hdGNoZXMgPSBmdW5jdGlvblRvU3RyaW5nXG4gICAgLmNhbGwoZnVuYylcbiAgICAubWF0Y2goL14oPzphc3luYyk/XFxzKmZ1bmN0aW9uXFxzKlxcKj9cXHMqKFtcXHckXSspXFxzKlxcKC8pXG4gIHJldHVybiBtYXRjaGVzID8gbWF0Y2hlc1sxXSA6ICc8YW5vbnltb3VzPidcbn1cblxuZnVuY3Rpb24gZ2V0UHJvdG90eXBlKG9iajogb2JqZWN0KSB7XG4gIGlmIChPYmplY3QuZ2V0UHJvdG90eXBlT2YpXG4gICAgcmV0dXJuIE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopXG5cbiAgaWYgKG9iai5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgPT09IG9iailcbiAgICByZXR1cm4gbnVsbFxuXG4gIHJldHVybiBvYmouY29uc3RydWN0b3IucHJvdG90eXBlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNQcm9wZXJ0eShvYmo6IG9iamVjdCB8IG51bGwsIHByb3BlcnR5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKCFvYmopXG4gICAgcmV0dXJuIGZhbHNlXG5cbiAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3BlcnR5KSlcbiAgICByZXR1cm4gdHJ1ZVxuXG4gIHJldHVybiBoYXNQcm9wZXJ0eShnZXRQcm90b3R5cGUob2JqKSwgcHJvcGVydHkpXG59XG5cbi8vIFNFTlRJTkVMIGNvbnN0YW50cyBhcmUgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svaW1tdXRhYmxlLWpzXG5jb25zdCBJU19LRVlFRF9TRU5USU5FTCA9ICdAQF9fSU1NVVRBQkxFX0tFWUVEX19AQCdcbmNvbnN0IElTX1NFVF9TRU5USU5FTCA9ICdAQF9fSU1NVVRBQkxFX1NFVF9fQEAnXG5jb25zdCBJU19PUkRFUkVEX1NFTlRJTkVMID0gJ0BAX19JTU1VVEFCTEVfT1JERVJFRF9fQEAnXG5cbmV4cG9ydCBmdW5jdGlvbiBpc0ltbXV0YWJsZVVub3JkZXJlZEtleWVkKG1heWJlS2V5ZWQ6IGFueSkge1xuICByZXR1cm4gISEoXG4gICAgbWF5YmVLZXllZFxuICAgICYmIG1heWJlS2V5ZWRbSVNfS0VZRURfU0VOVElORUxdXG4gICAgJiYgIW1heWJlS2V5ZWRbSVNfT1JERVJFRF9TRU5USU5FTF1cbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNJbW11dGFibGVVbm9yZGVyZWRTZXQobWF5YmVTZXQ6IGFueSkge1xuICByZXR1cm4gISEoXG4gICAgbWF5YmVTZXRcbiAgICAmJiBtYXliZVNldFtJU19TRVRfU0VOVElORUxdXG4gICAgJiYgIW1heWJlU2V0W0lTX09SREVSRURfU0VOVElORUxdXG4gIClcbn1cblxuLyoqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqXG4gKi9cbmNvbnN0IEl0ZXJhdG9yU3ltYm9sID0gU3ltYm9sLml0ZXJhdG9yXG5cbmNvbnN0IGhhc0l0ZXJhdG9yID0gKG9iamVjdDogYW55KSA9PlxuICAhIShvYmplY3QgIT0gbnVsbCAmJiBvYmplY3RbSXRlcmF0b3JTeW1ib2xdKVxuXG5leHBvcnQgY29uc3QgaXRlcmFibGVFcXVhbGl0eSA9IChcbiAgYTogYW55LFxuICBiOiBhbnksXG4gIGFTdGFjazogQXJyYXk8YW55PiA9IFtdLFxuICBiU3RhY2s6IEFycmF5PGFueT4gPSBbXSxcbik6IGJvb2xlYW4gfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoXG4gICAgdHlwZW9mIGEgIT09ICdvYmplY3QnXG4gICAgfHwgdHlwZW9mIGIgIT09ICdvYmplY3QnXG4gICAgfHwgQXJyYXkuaXNBcnJheShhKVxuICAgIHx8IEFycmF5LmlzQXJyYXkoYilcbiAgICB8fCAhaGFzSXRlcmF0b3IoYSlcbiAgICB8fCAhaGFzSXRlcmF0b3IoYilcbiAgKVxuICAgIHJldHVybiB1bmRlZmluZWRcblxuICBpZiAoYS5jb25zdHJ1Y3RvciAhPT0gYi5jb25zdHJ1Y3RvcilcbiAgICByZXR1cm4gZmFsc2VcblxuICBsZXQgbGVuZ3RoID0gYVN0YWNrLmxlbmd0aFxuICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAvLyBMaW5lYXIgc2VhcmNoLiBQZXJmb3JtYW5jZSBpcyBpbnZlcnNlbHkgcHJvcG9ydGlvbmFsIHRvIHRoZSBudW1iZXIgb2ZcbiAgICAvLyB1bmlxdWUgbmVzdGVkIHN0cnVjdHVyZXMuXG4gICAgLy8gY2lyY3VsYXIgcmVmZXJlbmNlcyBhdCBzYW1lIGRlcHRoIGFyZSBlcXVhbFxuICAgIC8vIGNpcmN1bGFyIHJlZmVyZW5jZSBpcyBub3QgZXF1YWwgdG8gbm9uLWNpcmN1bGFyIG9uZVxuICAgIGlmIChhU3RhY2tbbGVuZ3RoXSA9PT0gYSlcbiAgICAgIHJldHVybiBiU3RhY2tbbGVuZ3RoXSA9PT0gYlxuICB9XG4gIGFTdGFjay5wdXNoKGEpXG4gIGJTdGFjay5wdXNoKGIpXG5cbiAgY29uc3QgaXRlcmFibGVFcXVhbGl0eVdpdGhTdGFjayA9IChhOiBhbnksIGI6IGFueSkgPT5cbiAgICBpdGVyYWJsZUVxdWFsaXR5KGEsIGIsIFsuLi5hU3RhY2tdLCBbLi4uYlN0YWNrXSlcblxuICBpZiAoYS5zaXplICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAoYS5zaXplICE9PSBiLnNpemUpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBlbHNlIGlmIChpc0EoJ1NldCcsIGEpIHx8IGlzSW1tdXRhYmxlVW5vcmRlcmVkU2V0KGEpKSB7XG4gICAgICBsZXQgYWxsRm91bmQgPSB0cnVlXG4gICAgICBmb3IgKGNvbnN0IGFWYWx1ZSBvZiBhKSB7XG4gICAgICAgIGlmICghYi5oYXMoYVZhbHVlKSkge1xuICAgICAgICAgIGxldCBoYXMgPSBmYWxzZVxuICAgICAgICAgIGZvciAoY29uc3QgYlZhbHVlIG9mIGIpIHtcbiAgICAgICAgICAgIGNvbnN0IGlzRXF1YWwgPSBlcXVhbHMoYVZhbHVlLCBiVmFsdWUsIFtpdGVyYWJsZUVxdWFsaXR5V2l0aFN0YWNrXSlcbiAgICAgICAgICAgIGlmIChpc0VxdWFsID09PSB0cnVlKVxuICAgICAgICAgICAgICBoYXMgPSB0cnVlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGhhcyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGFsbEZvdW5kID0gZmFsc2VcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBSZW1vdmUgdGhlIGZpcnN0IHZhbHVlIGZyb20gdGhlIHN0YWNrIG9mIHRyYXZlcnNlZCB2YWx1ZXMuXG4gICAgICBhU3RhY2sucG9wKClcbiAgICAgIGJTdGFjay5wb3AoKVxuICAgICAgcmV0dXJuIGFsbEZvdW5kXG4gICAgfVxuICAgIGVsc2UgaWYgKGlzQSgnTWFwJywgYSkgfHwgaXNJbW11dGFibGVVbm9yZGVyZWRLZXllZChhKSkge1xuICAgICAgbGV0IGFsbEZvdW5kID0gdHJ1ZVxuICAgICAgZm9yIChjb25zdCBhRW50cnkgb2YgYSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIWIuaGFzKGFFbnRyeVswXSlcbiAgICAgICAgICB8fCAhZXF1YWxzKGFFbnRyeVsxXSwgYi5nZXQoYUVudHJ5WzBdKSwgW2l0ZXJhYmxlRXF1YWxpdHlXaXRoU3RhY2tdKVxuICAgICAgICApIHtcbiAgICAgICAgICBsZXQgaGFzID0gZmFsc2VcbiAgICAgICAgICBmb3IgKGNvbnN0IGJFbnRyeSBvZiBiKSB7XG4gICAgICAgICAgICBjb25zdCBtYXRjaGVkS2V5ID0gZXF1YWxzKGFFbnRyeVswXSwgYkVudHJ5WzBdLCBbXG4gICAgICAgICAgICAgIGl0ZXJhYmxlRXF1YWxpdHlXaXRoU3RhY2ssXG4gICAgICAgICAgICBdKVxuXG4gICAgICAgICAgICBsZXQgbWF0Y2hlZFZhbHVlID0gZmFsc2VcbiAgICAgICAgICAgIGlmIChtYXRjaGVkS2V5ID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgIG1hdGNoZWRWYWx1ZSA9IGVxdWFscyhhRW50cnlbMV0sIGJFbnRyeVsxXSwgW1xuICAgICAgICAgICAgICAgIGl0ZXJhYmxlRXF1YWxpdHlXaXRoU3RhY2ssXG4gICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWF0Y2hlZFZhbHVlID09PSB0cnVlKVxuICAgICAgICAgICAgICBoYXMgPSB0cnVlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGhhcyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGFsbEZvdW5kID0gZmFsc2VcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBSZW1vdmUgdGhlIGZpcnN0IHZhbHVlIGZyb20gdGhlIHN0YWNrIG9mIHRyYXZlcnNlZCB2YWx1ZXMuXG4gICAgICBhU3RhY2sucG9wKClcbiAgICAgIGJTdGFjay5wb3AoKVxuICAgICAgcmV0dXJuIGFsbEZvdW5kXG4gICAgfVxuICB9XG5cbiAgY29uc3QgYkl0ZXJhdG9yID0gYltJdGVyYXRvclN5bWJvbF0oKVxuXG4gIGZvciAoY29uc3QgYVZhbHVlIG9mIGEpIHtcbiAgICBjb25zdCBuZXh0QiA9IGJJdGVyYXRvci5uZXh0KClcbiAgICBpZiAoXG4gICAgICBuZXh0Qi5kb25lXG4gICAgICB8fCAhZXF1YWxzKGFWYWx1ZSwgbmV4dEIudmFsdWUsIFtpdGVyYWJsZUVxdWFsaXR5V2l0aFN0YWNrXSlcbiAgICApXG4gICAgICByZXR1cm4gZmFsc2VcbiAgfVxuICBpZiAoIWJJdGVyYXRvci5uZXh0KCkuZG9uZSlcbiAgICByZXR1cm4gZmFsc2VcblxuICAvLyBSZW1vdmUgdGhlIGZpcnN0IHZhbHVlIGZyb20gdGhlIHN0YWNrIG9mIHRyYXZlcnNlZCB2YWx1ZXMuXG4gIGFTdGFjay5wb3AoKVxuICBiU3RhY2sucG9wKClcbiAgcmV0dXJuIHRydWVcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYGhhc093blByb3BlcnR5KG9iamVjdCwga2V5KWAgdXAgdGhlIHByb3RvdHlwZSBjaGFpbiwgc3RvcHBpbmcgYXQgYE9iamVjdC5wcm90b3R5cGVgLlxuICovXG5jb25zdCBoYXNQcm9wZXJ0eUluT2JqZWN0ID0gKG9iamVjdDogb2JqZWN0LCBrZXk6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICBjb25zdCBzaG91bGRUZXJtaW5hdGVcbiAgICA9ICFvYmplY3QgfHwgdHlwZW9mIG9iamVjdCAhPT0gJ29iamVjdCcgfHwgb2JqZWN0ID09PSBPYmplY3QucHJvdG90eXBlXG5cbiAgaWYgKHNob3VsZFRlcm1pbmF0ZSlcbiAgICByZXR1cm4gZmFsc2VcblxuICByZXR1cm4gKFxuICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSlcbiAgICB8fCBoYXNQcm9wZXJ0eUluT2JqZWN0KE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmplY3QpLCBrZXkpXG4gIClcbn1cblxuY29uc3QgaXNPYmplY3RXaXRoS2V5cyA9IChhOiBhbnkpID0+XG4gIGlzT2JqZWN0KGEpXG4gICYmICEoYSBpbnN0YW5jZW9mIEVycm9yKVxuICAmJiAhKGEgaW5zdGFuY2VvZiBBcnJheSlcbiAgJiYgIShhIGluc3RhbmNlb2YgRGF0ZSlcblxuZXhwb3J0IGNvbnN0IHN1YnNldEVxdWFsaXR5ID0gKFxuICBvYmplY3Q6IHVua25vd24sXG4gIHN1YnNldDogdW5rbm93bixcbik6IGJvb2xlYW4gfCB1bmRlZmluZWQgPT4ge1xuICAvLyBzdWJzZXRFcXVhbGl0eSBuZWVkcyB0byBrZWVwIHRyYWNrIG9mIHRoZSByZWZlcmVuY2VzXG4gIC8vIGl0IGhhcyBhbHJlYWR5IHZpc2l0ZWQgdG8gYXZvaWQgaW5maW5pdGUgbG9vcHMgaW4gY2FzZVxuICAvLyB0aGVyZSBhcmUgY2lyY3VsYXIgcmVmZXJlbmNlcyBpbiB0aGUgc3Vic2V0IHBhc3NlZCB0byBpdC5cbiAgY29uc3Qgc3Vic2V0RXF1YWxpdHlXaXRoQ29udGV4dFxuICAgID0gKHNlZW5SZWZlcmVuY2VzOiBXZWFrTWFwPG9iamVjdCwgYm9vbGVhbj4gPSBuZXcgV2Vha01hcCgpKSA9PlxuICAgICAgKG9iamVjdDogYW55LCBzdWJzZXQ6IGFueSk6IGJvb2xlYW4gfCB1bmRlZmluZWQgPT4ge1xuICAgICAgICBpZiAoIWlzT2JqZWN0V2l0aEtleXMoc3Vic2V0KSlcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG5cbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHN1YnNldCkuZXZlcnkoKGtleSkgPT4ge1xuICAgICAgICAgIGlmIChpc09iamVjdFdpdGhLZXlzKHN1YnNldFtrZXldKSkge1xuICAgICAgICAgICAgaWYgKHNlZW5SZWZlcmVuY2VzLmhhcyhzdWJzZXRba2V5XSkpXG4gICAgICAgICAgICAgIHJldHVybiBlcXVhbHMob2JqZWN0W2tleV0sIHN1YnNldFtrZXldLCBbaXRlcmFibGVFcXVhbGl0eV0pXG5cbiAgICAgICAgICAgIHNlZW5SZWZlcmVuY2VzLnNldChzdWJzZXRba2V5XSwgdHJ1ZSlcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgcmVzdWx0XG4gICAgICAgICAgPSBvYmplY3QgIT0gbnVsbFxuICAgICAgICAgICYmIGhhc1Byb3BlcnR5SW5PYmplY3Qob2JqZWN0LCBrZXkpXG4gICAgICAgICAgJiYgZXF1YWxzKG9iamVjdFtrZXldLCBzdWJzZXRba2V5XSwgW1xuICAgICAgICAgICAgaXRlcmFibGVFcXVhbGl0eSxcbiAgICAgICAgICAgIHN1YnNldEVxdWFsaXR5V2l0aENvbnRleHQoc2VlblJlZmVyZW5jZXMpLFxuICAgICAgICAgIF0pXG4gICAgICAgICAgLy8gVGhlIG1haW4gZ29hbCBvZiB1c2luZyBzZWVuUmVmZXJlbmNlIGlzIHRvIGF2b2lkIGNpcmN1bGFyIG5vZGUgb24gdHJlZS5cbiAgICAgICAgICAvLyBJdCB3aWxsIG9ubHkgaGFwcGVuIHdpdGhpbiBhIHBhcmVudCBhbmQgaXRzIGNoaWxkLCBub3QgYSBub2RlIGFuZCBub2RlcyBuZXh0IHRvIGl0IChzYW1lIGxldmVsKVxuICAgICAgICAgIC8vIFdlIHNob3VsZCBrZWVwIHRoZSByZWZlcmVuY2UgZm9yIGEgcGFyZW50IGFuZCBpdHMgY2hpbGQgb25seVxuICAgICAgICAgIC8vIFRodXMgd2Ugc2hvdWxkIGRlbGV0ZSB0aGUgcmVmZXJlbmNlIGltbWVkaWF0ZWx5IHNvIHRoYXQgaXQgZG9lc24ndCBpbnRlcmZlcmVcbiAgICAgICAgICAvLyBvdGhlciBub2RlcyB3aXRoaW4gdGhlIHNhbWUgbGV2ZWwgb24gdHJlZS5cbiAgICAgICAgICBzZWVuUmVmZXJlbmNlcy5kZWxldGUoc3Vic2V0W2tleV0pXG4gICAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gIHJldHVybiBzdWJzZXRFcXVhbGl0eVdpdGhDb250ZXh0KCkob2JqZWN0LCBzdWJzZXQpXG59XG5cbmV4cG9ydCBjb25zdCB0eXBlRXF1YWxpdHkgPSAoYTogYW55LCBiOiBhbnkpOiBib29sZWFuIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKGEgPT0gbnVsbCB8fCBiID09IG51bGwgfHwgYS5jb25zdHJ1Y3RvciA9PT0gYi5jb25zdHJ1Y3RvcilcbiAgICByZXR1cm4gdW5kZWZpbmVkXG5cbiAgcmV0dXJuIGZhbHNlXG59XG5cbmV4cG9ydCBjb25zdCBhcnJheUJ1ZmZlckVxdWFsaXR5ID0gKFxuICBhOiB1bmtub3duLFxuICBiOiB1bmtub3duLFxuKTogYm9vbGVhbiB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICghKGEgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikgfHwgIShiIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpKVxuICAgIHJldHVybiB1bmRlZmluZWRcblxuICBjb25zdCBkYXRhVmlld0EgPSBuZXcgRGF0YVZpZXcoYSlcbiAgY29uc3QgZGF0YVZpZXdCID0gbmV3IERhdGFWaWV3KGIpXG5cbiAgLy8gQnVmZmVycyBhcmUgbm90IGVxdWFsIHdoZW4gdGhleSBkbyBub3QgaGF2ZSB0aGUgc2FtZSBieXRlIGxlbmd0aFxuICBpZiAoZGF0YVZpZXdBLmJ5dGVMZW5ndGggIT09IGRhdGFWaWV3Qi5ieXRlTGVuZ3RoKVxuICAgIHJldHVybiBmYWxzZVxuXG4gIC8vIENoZWNrIGlmIGV2ZXJ5IGJ5dGUgdmFsdWUgaXMgZXF1YWwgdG8gZWFjaCBvdGhlclxuICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGFWaWV3QS5ieXRlTGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZGF0YVZpZXdBLmdldFVpbnQ4KGkpICE9PSBkYXRhVmlld0IuZ2V0VWludDgoaSkpXG4gICAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG5cbmV4cG9ydCBjb25zdCBzcGFyc2VBcnJheUVxdWFsaXR5ID0gKFxuICBhOiB1bmtub3duLFxuICBiOiB1bmtub3duLFxuKTogYm9vbGVhbiB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICghQXJyYXkuaXNBcnJheShhKSB8fCAhQXJyYXkuaXNBcnJheShiKSlcbiAgICByZXR1cm4gdW5kZWZpbmVkXG5cbiAgLy8gQSBzcGFyc2UgYXJyYXkgWywgLCAxXSB3aWxsIGhhdmUga2V5cyBbXCIyXCJdIHdoZXJlYXMgW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCAxXSB3aWxsIGhhdmUga2V5cyBbXCIwXCIsIFwiMVwiLCBcIjJcIl1cbiAgY29uc3QgYUtleXMgPSBPYmplY3Qua2V5cyhhKVxuICBjb25zdCBiS2V5cyA9IE9iamVjdC5rZXlzKGIpXG4gIHJldHVybiAoXG4gICAgZXF1YWxzKGEsIGIsIFtpdGVyYWJsZUVxdWFsaXR5LCB0eXBlRXF1YWxpdHldLCB0cnVlKSAmJiBlcXVhbHMoYUtleXMsIGJLZXlzKVxuICApXG59XG4iLCJpbXBvcnQgdHlwZSB7IEVuaGFuY2VkU3B5IH0gZnJvbSAnLi4vamVzdC1tb2NrJ1xuaW1wb3J0IHsgaXNNb2NrRnVuY3Rpb24gfSBmcm9tICcuLi9qZXN0LW1vY2snXG5pbXBvcnQgeyBhZGRTZXJpYWxpemVyIH0gZnJvbSAnLi4vc25hcHNob3QvcG9ydC9wbHVnaW5zJ1xuaW1wb3J0IHR5cGUgeyBDaGFpUGx1Z2luLCBNYXRjaGVyU3RhdGUgfSBmcm9tICcuL3R5cGVzJ1xuaW1wb3J0IHsgYXJyYXlCdWZmZXJFcXVhbGl0eSwgZXF1YWxzIGFzIGFzeW1tZXRyaWNFcXVhbHMsIGhhc0FzeW1tZXRyaWMsIGl0ZXJhYmxlRXF1YWxpdHksIHNwYXJzZUFycmF5RXF1YWxpdHksIHR5cGVFcXVhbGl0eSB9IGZyb20gJy4vamVzdC11dGlscydcblxuY29uc3QgTUFUQ0hFUlNfT0JKRUNUID0gU3ltYm9sLmZvcignbWF0Y2hlcnMtb2JqZWN0JylcblxuaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZ2xvYmFsLCBNQVRDSEVSU19PQkpFQ1QpKSB7XG4gIGNvbnN0IGRlZmF1bHRTdGF0ZTogUGFydGlhbDxNYXRjaGVyU3RhdGU+ID0ge1xuICAgIGFzc2VydGlvbkNhbGxzOiAwLFxuICAgIGlzRXhwZWN0aW5nQXNzZXJ0aW9uczogZmFsc2UsXG4gICAgaXNFeHBlY3RpbmdBc3NlcnRpb25zRXJyb3I6IG51bGwsXG4gICAgZXhwZWN0ZWRBc3NlcnRpb25zTnVtYmVyOiBudWxsLFxuICAgIGV4cGVjdGVkQXNzZXJ0aW9uc051bWJlckVycm9yOiBudWxsLFxuICB9XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShnbG9iYWwsIE1BVENIRVJTX09CSkVDVCwge1xuICAgIHZhbHVlOiB7XG4gICAgICBzdGF0ZTogZGVmYXVsdFN0YXRlLFxuICAgIH0sXG4gIH0pXG59XG5cbmV4cG9ydCBjb25zdCBnZXRTdGF0ZSA9IDxTdGF0ZSBleHRlbmRzIE1hdGNoZXJTdGF0ZSA9IE1hdGNoZXJTdGF0ZT4oKTogU3RhdGUgPT5cbiAgKGdsb2JhbCBhcyBhbnkpW01BVENIRVJTX09CSkVDVF0uc3RhdGVcblxuZXhwb3J0IGNvbnN0IHNldFN0YXRlID0gPFN0YXRlIGV4dGVuZHMgTWF0Y2hlclN0YXRlID0gTWF0Y2hlclN0YXRlPihcbiAgc3RhdGU6IFBhcnRpYWw8U3RhdGU+LFxuKTogdm9pZCA9PiB7XG4gIE9iamVjdC5hc3NpZ24oKGdsb2JhbCBhcyBhbnkpW01BVENIRVJTX09CSkVDVF0uc3RhdGUsIHN0YXRlKVxufVxuXG4vLyBKZXN0IEV4cGVjdCBDb21wYWN0XG5leHBvcnQgY29uc3QgSmVzdENoYWlFeHBlY3Q6IENoYWlQbHVnaW4gPSAoY2hhaSwgdXRpbHMpID0+IHtcbiAgZnVuY3Rpb24gZGVmKG5hbWU6IGtleW9mIENoYWkuQXNzZXJ0aW9uIHwgKGtleW9mIENoYWkuQXNzZXJ0aW9uKVtdLCBmbjogKCh0aGlzOiBDaGFpLkFzc2VydGlvblN0YXRpYyAmIENoYWkuQXNzZXJ0aW9uLCAuLi5hcmdzOiBhbnlbXSkgPT4gYW55KSkge1xuICAgIGNvbnN0IGFkZE1ldGhvZCA9IChuOiBrZXlvZiBDaGFpLkFzc2VydGlvbikgPT4ge1xuICAgICAgdXRpbHMuYWRkTWV0aG9kKGNoYWkuQXNzZXJ0aW9uLnByb3RvdHlwZSwgbiwgZm4pXG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkobmFtZSkpXG4gICAgICBuYW1lLmZvckVhY2gobiA9PiBhZGRNZXRob2QobikpXG5cbiAgICBlbHNlXG4gICAgICBhZGRNZXRob2QobmFtZSlcbiAgfVxuXG4gIC8vIHdlIG92ZXJyaWRlcyB0aGUgZGVmYXVsdCBgLmVxdWFsYCwga2VlcCBvcmlnaW5hbCBgLmNoYWlFcXVhbGAgaW4gY2FzZSBuZWVkXG4gIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgY29uc3QgY2hhaUVxdWFsID0gY2hhaS5Bc3NlcnRpb24ucHJvdG90eXBlLmVxdWFsXG4gIGRlZignY2hhaUVxdWFsJywgZnVuY3Rpb24oLi4uYXJnczogYW55W10pIHtcbiAgICByZXR1cm4gY2hhaUVxdWFsLmFwcGx5KHRoaXMsIGFyZ3MpXG4gIH0pXG5cbiAgOyhbJ3Rocm93JywgJ3Rocm93cycsICdUaHJvdyddIGFzIGNvbnN0KS5mb3JFYWNoKChtKSA9PiB7XG4gICAgdXRpbHMub3ZlcndyaXRlTWV0aG9kKGNoYWkuQXNzZXJ0aW9uLnByb3RvdHlwZSwgbSwgKF9zdXBlcjogYW55KSA9PiB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24odGhpczogQ2hhaS5Bc3NlcnRpb24gJiBDaGFpLkFzc2VydGlvblN0YXRpYywgLi4uYXJnczogYW55W10pIHtcbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IHV0aWxzLmZsYWcodGhpcywgJ3Byb21pc2UnKVxuICAgICAgICBjb25zdCBvYmplY3QgPSB1dGlscy5mbGFnKHRoaXMsICdvYmplY3QnKVxuICAgICAgICBpZiAocHJvbWlzZSA9PT0gJ3JlamVjdHMnKSB7XG4gICAgICAgICAgdXRpbHMuZmxhZyh0aGlzLCAnb2JqZWN0JywgKCkgPT4ge1xuICAgICAgICAgICAgdGhyb3cgb2JqZWN0XG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICBfc3VwZXIuYXBwbHkodGhpcywgYXJncylcbiAgICAgIH1cbiAgICB9KVxuICB9KVxuXG4gIC8vIG92ZXJyaWRlcyBgLmVxdWFsYCBhbmQgYC5lcWxgIHRvIHByb3ZpZGUgY3VzdG9tIGFzc2VydGlvbiBmb3IgYXN5bW1ldHJpYyBlcXVhbGl0eVxuICB1dGlscy5vdmVyd3JpdGVNZXRob2QoY2hhaS5Bc3NlcnRpb24ucHJvdG90eXBlLCAnZXF1YWwnLCAoX3N1cGVyOiBhbnkpID0+IHtcbiAgICByZXR1cm4gZnVuY3Rpb24odGhpczogQ2hhaS5Bc3NlcnRpb24gJiBDaGFpLkFzc2VydGlvblN0YXRpYywgLi4uYXJnczogYW55W10pIHtcbiAgICAgIGNvbnN0IGV4cGVjdGVkID0gYXJnc1swXVxuICAgICAgY29uc3QgYWN0dWFsID0gdXRpbHMuZmxhZyh0aGlzLCAnb2JqZWN0JylcbiAgICAgIGlmIChoYXNBc3ltbWV0cmljKGV4cGVjdGVkKSkge1xuICAgICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgICBhc3ltbWV0cmljRXF1YWxzKGFjdHVhbCwgZXhwZWN0ZWQsIHVuZGVmaW5lZCwgdHJ1ZSksXG4gICAgICAgICAgJ25vdCBtYXRjaCB3aXRoICN7YWN0fScsXG4gICAgICAgICAgJ3Nob3VsZCBub3QgbWF0Y2ggd2l0aCAje2FjdH0nLFxuICAgICAgICAgIGFjdHVhbCxcbiAgICAgICAgICBleHBlY3RlZCxcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIF9zdXBlci5hcHBseSh0aGlzLCBhcmdzKVxuICAgICAgfVxuICAgIH1cbiAgfSlcbiAgdXRpbHMub3ZlcndyaXRlTWV0aG9kKGNoYWkuQXNzZXJ0aW9uLnByb3RvdHlwZSwgJ2VxbCcsIChfc3VwZXI6IGFueSkgPT4ge1xuICAgIHJldHVybiBmdW5jdGlvbih0aGlzOiBDaGFpLkFzc2VydGlvbiAmIENoYWkuQXNzZXJ0aW9uU3RhdGljLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgICAgY29uc3QgZXhwZWN0ZWQgPSBhcmdzWzBdXG4gICAgICBjb25zdCBhY3R1YWwgPSB1dGlscy5mbGFnKHRoaXMsICdvYmplY3QnKVxuICAgICAgaWYgKGhhc0FzeW1tZXRyaWMoZXhwZWN0ZWQpKSB7XG4gICAgICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICAgIGFzeW1tZXRyaWNFcXVhbHMoYWN0dWFsLCBleHBlY3RlZCksXG4gICAgICAgICAgJ25vdCBtYXRjaCB3aXRoICN7ZXhwfScsXG4gICAgICAgICAgJ3Nob3VsZCBub3QgbWF0Y2ggd2l0aCAje2V4cH0nLFxuICAgICAgICAgIGV4cGVjdGVkLFxuICAgICAgICAgIGFjdHVhbCxcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIF9zdXBlci5hcHBseSh0aGlzLCBhcmdzKVxuICAgICAgfVxuICAgIH1cbiAgfSlcblxuICBkZWYoJ3RvRXF1YWwnLCBmdW5jdGlvbihleHBlY3RlZCkge1xuICAgIHJldHVybiB0aGlzLmVxbChleHBlY3RlZClcbiAgfSlcblxuICBkZWYoJ3RvU3RyaWN0RXF1YWwnLCBmdW5jdGlvbihleHBlY3RlZCkge1xuICAgIGNvbnN0IG9iaiA9IHV0aWxzLmZsYWcodGhpcywgJ29iamVjdCcpXG4gICAgY29uc3QgZXF1YWwgPSBhc3ltbWV0cmljRXF1YWxzKFxuICAgICAgb2JqLFxuICAgICAgZXhwZWN0ZWQsXG4gICAgICBbXG4gICAgICAgIGl0ZXJhYmxlRXF1YWxpdHksXG4gICAgICAgIHR5cGVFcXVhbGl0eSxcbiAgICAgICAgc3BhcnNlQXJyYXlFcXVhbGl0eSxcbiAgICAgICAgYXJyYXlCdWZmZXJFcXVhbGl0eSxcbiAgICAgIF0sXG4gICAgICB0cnVlLFxuICAgIClcblxuICAgIHJldHVybiB0aGlzLmFzc2VydChcbiAgICAgIGVxdWFsLFxuICAgICAgJ2V4cGVjdGVkICN7dGhpc30gdG8gc3RyaWN0bHkgZXF1YWwgI3tleHB9JyxcbiAgICAgICdleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBzdHJpY3RseSBlcXVhbCAje2V4cH0nLFxuICAgICAgZXhwZWN0ZWQsXG4gICAgICBvYmosXG4gICAgKVxuICB9KVxuICBkZWYoJ3RvQmUnLCBmdW5jdGlvbihleHBlY3RlZCkge1xuICAgIHJldHVybiB0aGlzLmVxdWFsKGV4cGVjdGVkKVxuICB9KVxuICBkZWYoJ3RvTWF0Y2hPYmplY3QnLCBmdW5jdGlvbihleHBlY3RlZCkge1xuICAgIHJldHVybiB0aGlzLmNvbnRhaW5TdWJzZXQoZXhwZWN0ZWQpXG4gIH0pXG4gIGRlZigndG9NYXRjaCcsIGZ1bmN0aW9uKGV4cGVjdGVkOiBzdHJpbmcgfCBSZWdFeHApIHtcbiAgICBpZiAodHlwZW9mIGV4cGVjdGVkID09PSAnc3RyaW5nJylcbiAgICAgIHJldHVybiB0aGlzLmluY2x1ZGUoZXhwZWN0ZWQpXG4gICAgZWxzZVxuICAgICAgcmV0dXJuIHRoaXMubWF0Y2goZXhwZWN0ZWQpXG4gIH0pXG4gIGRlZigndG9Db250YWluJywgZnVuY3Rpb24oaXRlbSkge1xuICAgIHJldHVybiB0aGlzLmNvbnRhaW4oaXRlbSlcbiAgfSlcbiAgZGVmKCd0b0NvbnRhaW5FcXVhbCcsIGZ1bmN0aW9uKGV4cGVjdGVkKSB7XG4gICAgY29uc3Qgb2JqID0gdXRpbHMuZmxhZyh0aGlzLCAnb2JqZWN0JylcbiAgICBjb25zdCBpbmRleCA9IEFycmF5LmZyb20ob2JqKS5maW5kSW5kZXgoKGl0ZW0pID0+IHtcbiAgICAgIHJldHVybiBhc3ltbWV0cmljRXF1YWxzKGl0ZW0sIGV4cGVjdGVkKVxuICAgIH0pXG5cbiAgICB0aGlzLmFzc2VydChcbiAgICAgIGluZGV4ICE9PSAtMSxcbiAgICAgICdleHBlY3RlZCAje3RoaXN9IHRvIGRlZXAgZXF1YWxseSBjb250YWluICN7ZXhwfScsXG4gICAgICAnZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgZGVlcCBlcXVhbGx5IGNvbnRhaW4gI3tleHB9JyxcbiAgICAgIGV4cGVjdGVkLFxuICAgIClcbiAgfSlcbiAgZGVmKCd0b0JlVHJ1dGh5JywgZnVuY3Rpb24oKSB7XG4gICAgY29uc3Qgb2JqID0gdXRpbHMuZmxhZyh0aGlzLCAnb2JqZWN0JylcbiAgICB0aGlzLmFzc2VydChcbiAgICAgIEJvb2xlYW4ob2JqKSxcbiAgICAgICdleHBlY3RlZCAje3RoaXN9IHRvIGJlIHRydXRoeScsXG4gICAgICAnZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgYmUgdHJ1dGh5JyxcbiAgICAgIG9iaixcbiAgICApXG4gIH0pXG4gIGRlZigndG9CZUZhbHN5JywgZnVuY3Rpb24oKSB7XG4gICAgY29uc3Qgb2JqID0gdXRpbHMuZmxhZyh0aGlzLCAnb2JqZWN0JylcbiAgICB0aGlzLmFzc2VydChcbiAgICAgICFvYmosXG4gICAgICAnZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBmYWxzeScsXG4gICAgICAnZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgYmUgZmFsc3knLFxuICAgICAgb2JqLFxuICAgIClcbiAgfSlcbiAgZGVmKCd0b0JlR3JlYXRlclRoYW4nLCBmdW5jdGlvbihleHBlY3RlZDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHRoaXMudG8uZ3JlYXRlclRoYW4oZXhwZWN0ZWQpXG4gIH0pXG4gIGRlZigndG9CZUdyZWF0ZXJUaGFuT3JFcXVhbCcsIGZ1bmN0aW9uKGV4cGVjdGVkOiBudW1iZXIpIHtcbiAgICByZXR1cm4gdGhpcy50by5ncmVhdGVyVGhhbk9yRXF1YWwoZXhwZWN0ZWQpXG4gIH0pXG4gIGRlZigndG9CZUxlc3NUaGFuJywgZnVuY3Rpb24oZXhwZWN0ZWQ6IG51bWJlcikge1xuICAgIHJldHVybiB0aGlzLnRvLmxlc3NUaGFuKGV4cGVjdGVkKVxuICB9KVxuICBkZWYoJ3RvQmVMZXNzVGhhbk9yRXF1YWwnLCBmdW5jdGlvbihleHBlY3RlZDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHRoaXMudG8ubGVzc1RoYW5PckVxdWFsKGV4cGVjdGVkKVxuICB9KVxuICBkZWYoJ3RvQmVOYU4nLCBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5iZS5OYU5cbiAgfSlcbiAgZGVmKCd0b0JlVW5kZWZpbmVkJywgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuYmUudW5kZWZpbmVkXG4gIH0pXG4gIGRlZigndG9CZU51bGwnLCBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5iZS5udWxsXG4gIH0pXG4gIGRlZigndG9CZURlZmluZWQnLCBmdW5jdGlvbigpIHtcbiAgICBjb25zdCBuZWdhdGUgPSB1dGlscy5mbGFnKHRoaXMsICduZWdhdGUnKVxuICAgIHV0aWxzLmZsYWcodGhpcywgJ25lZ2F0ZScsIGZhbHNlKVxuXG4gICAgaWYgKG5lZ2F0ZSlcbiAgICAgIHJldHVybiB0aGlzLmJlLnVuZGVmaW5lZFxuXG4gICAgcmV0dXJuIHRoaXMubm90LmJlLnVuZGVmaW5lZFxuICB9KVxuICBkZWYoJ3RvQmVJbnN0YW5jZU9mJywgZnVuY3Rpb24ob2JqOiBhbnkpIHtcbiAgICByZXR1cm4gdGhpcy5pbnN0YW5jZU9mKG9iailcbiAgfSlcbiAgZGVmKCd0b0hhdmVMZW5ndGgnLCBmdW5jdGlvbihsZW5ndGg6IG51bWJlcikge1xuICAgIHJldHVybiB0aGlzLmhhdmUubGVuZ3RoKGxlbmd0aClcbiAgfSlcbiAgLy8gZGVzdHJ1Y3R1cmluZywgYmVjYXVzZSBpdCBjaGVja3MgYGFyZ3VtZW50c2AgaW5zaWRlLCBhbmQgdmFsdWUgaXMgcGFzc2luZyBhcyBgdW5kZWZpbmVkYFxuICBkZWYoJ3RvSGF2ZVByb3BlcnR5JywgZnVuY3Rpb24oLi4uYXJnczogW3Byb3BlcnR5OiBzdHJpbmcsIHZhbHVlPzogYW55XSkge1xuICAgIHJldHVybiB0aGlzLmhhdmUuZGVlcC5uZXN0ZWQucHJvcGVydHkoLi4uYXJncylcbiAgfSlcbiAgZGVmKCd0b0JlQ2xvc2VUbycsIGZ1bmN0aW9uKHJlY2VpdmVkOiBudW1iZXIsIHByZWNpc2lvbiA9IDIpIHtcbiAgICBjb25zdCBleHBlY3RlZCA9IHRoaXMuX29ialxuICAgIGxldCBwYXNzID0gZmFsc2VcbiAgICBsZXQgZXhwZWN0ZWREaWZmID0gMFxuICAgIGxldCByZWNlaXZlZERpZmYgPSAwXG5cbiAgICBpZiAocmVjZWl2ZWQgPT09IEluZmluaXR5ICYmIGV4cGVjdGVkID09PSBJbmZpbml0eSkge1xuICAgICAgcGFzcyA9IHRydWVcbiAgICB9XG4gICAgZWxzZSBpZiAocmVjZWl2ZWQgPT09IC1JbmZpbml0eSAmJiBleHBlY3RlZCA9PT0gLUluZmluaXR5KSB7XG4gICAgICBwYXNzID0gdHJ1ZVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGV4cGVjdGVkRGlmZiA9IE1hdGgucG93KDEwLCAtcHJlY2lzaW9uKSAvIDJcbiAgICAgIHJlY2VpdmVkRGlmZiA9IE1hdGguYWJzKGV4cGVjdGVkIC0gcmVjZWl2ZWQpXG4gICAgICBwYXNzID0gcmVjZWl2ZWREaWZmIDwgZXhwZWN0ZWREaWZmXG4gICAgfVxuICAgIHJldHVybiB0aGlzLmFzc2VydChcbiAgICAgIHBhc3MsXG4gICAgICBgZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBjbG9zZSB0byAje2V4cH0sIHJlY2lldmVkIGRpZmZlcmVuY2UgaXMgJHtyZWNlaXZlZERpZmZ9LCBidXQgZXhwZWN0ZWQgJHtleHBlY3RlZERpZmZ9YCxcbiAgICAgIGBleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBiZSBjbG9zZSB0byAje2V4cH0sIHJlY2lldmVkIGRpZmZlcmVuY2UgaXMgJHtyZWNlaXZlZERpZmZ9LCBidXQgZXhwZWN0ZWQgJHtleHBlY3RlZERpZmZ9YCxcbiAgICAgIHJlY2VpdmVkLFxuICAgICAgZXhwZWN0ZWQsXG4gICAgKVxuICB9KVxuXG4gIGNvbnN0IGFzc2VydElzTW9jayA9IChhc3NlcnRpb246IGFueSkgPT4ge1xuICAgIGlmICghaXNNb2NrRnVuY3Rpb24oYXNzZXJ0aW9uLl9vYmopKVxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgJHt1dGlscy5pbnNwZWN0KGFzc2VydGlvbi5fb2JqKX0gaXMgbm90IGEgc3B5IG9yIGEgY2FsbCB0byBhIHNweSFgKVxuICB9XG4gIGNvbnN0IGdldFNweSA9IChhc3NlcnRpb246IGFueSkgPT4ge1xuICAgIGFzc2VydElzTW9jayhhc3NlcnRpb24pXG4gICAgcmV0dXJuIGFzc2VydGlvbi5fb2JqIGFzIEVuaGFuY2VkU3B5XG4gIH1cbiAgZGVmKFsndG9IYXZlQmVlbkNhbGxlZFRpbWVzJywgJ3RvQmVDYWxsZWRUaW1lcyddLCBmdW5jdGlvbihudW1iZXI6IG51bWJlcikge1xuICAgIGNvbnN0IHNweSA9IGdldFNweSh0aGlzKVxuICAgIGNvbnN0IHNweU5hbWUgPSBzcHkuZ2V0TW9ja05hbWUoKVxuICAgIGNvbnN0IGNhbGxDb3VudCA9IHNweS5tb2NrLmNhbGxzLmxlbmd0aFxuICAgIHJldHVybiB0aGlzLmFzc2VydChcbiAgICAgIGNhbGxDb3VudCA9PT0gbnVtYmVyLFxuICAgICAgYGV4cGVjdGVkIFwiJHtzcHlOYW1lfVwiIHRvIGJlIGNhbGxlZCAje2V4cH0gdGltZXNgLFxuICAgICAgYGV4cGVjdGVkIFwiJHtzcHlOYW1lfVwiIHRvIG5vdCBiZSBjYWxsZWQgI3tleHB9IHRpbWVzYCxcbiAgICAgIG51bWJlcixcbiAgICAgIGNhbGxDb3VudCxcbiAgICApXG4gIH0pXG4gIGRlZigndG9IYXZlQmVlbkNhbGxlZE9uY2UnLCBmdW5jdGlvbigpIHtcbiAgICBjb25zdCBzcHkgPSBnZXRTcHkodGhpcylcbiAgICBjb25zdCBzcHlOYW1lID0gc3B5LmdldE1vY2tOYW1lKClcbiAgICBjb25zdCBjYWxsQ291bnQgPSBzcHkubW9jay5jYWxscy5sZW5ndGhcbiAgICByZXR1cm4gdGhpcy5hc3NlcnQoXG4gICAgICBjYWxsQ291bnQgPT09IDEsXG4gICAgICBgZXhwZWN0ZWQgXCIke3NweU5hbWV9XCIgdG8gYmUgY2FsbGVkIG9uY2VgLFxuICAgICAgYGV4cGVjdGVkIFwiJHtzcHlOYW1lfVwiIHRvIG5vdCBiZSBjYWxsZWQgb25jZWAsXG4gICAgICAxLFxuICAgICAgY2FsbENvdW50LFxuICAgIClcbiAgfSlcbiAgZGVmKFsndG9IYXZlQmVlbkNhbGxlZCcsICd0b0JlQ2FsbGVkJ10sIGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IHNweSA9IGdldFNweSh0aGlzKVxuICAgIGNvbnN0IHNweU5hbWUgPSBzcHkuZ2V0TW9ja05hbWUoKVxuICAgIGNvbnN0IGNhbGxlZCA9IHNweS5tb2NrLmNhbGxzLmxlbmd0aCA+IDBcbiAgICByZXR1cm4gdGhpcy5hc3NlcnQoXG4gICAgICBjYWxsZWQsXG4gICAgICBgZXhwZWN0ZWQgXCIke3NweU5hbWV9XCIgdG8gYmUgY2FsbGVkIGF0IGxlYXN0IG9uY2VgLFxuICAgICAgYGV4cGVjdGVkIFwiJHtzcHlOYW1lfVwiIHRvIG5vdCBiZSBjYWxsZWQgYXQgYWxsYCxcbiAgICAgIHRydWUsXG4gICAgICBjYWxsZWQsXG4gICAgKVxuICB9KVxuICBkZWYoWyd0b0hhdmVCZWVuQ2FsbGVkV2l0aCcsICd0b0JlQ2FsbGVkV2l0aCddLCBmdW5jdGlvbiguLi5hcmdzKSB7XG4gICAgY29uc3Qgc3B5ID0gZ2V0U3B5KHRoaXMpXG4gICAgY29uc3Qgc3B5TmFtZSA9IHNweS5nZXRNb2NrTmFtZSgpXG4gICAgY29uc3QgcGFzcyA9IHNweS5tb2NrLmNhbGxzLnNvbWUoY2FsbEFyZyA9PiBhc3ltbWV0cmljRXF1YWxzKGNhbGxBcmcsIGFyZ3MsIFtpdGVyYWJsZUVxdWFsaXR5XSkpXG4gICAgcmV0dXJuIHRoaXMuYXNzZXJ0KFxuICAgICAgcGFzcyxcbiAgICAgIGBleHBlY3RlZCBcIiR7c3B5TmFtZX1cIiB0byBiZSBjYWxsZWQgd2l0aCBhcmd1bWVudHM6ICN7ZXhwfWAsXG4gICAgICBgZXhwZWN0ZWQgXCIke3NweU5hbWV9XCIgdG8gbm90IGJlIGNhbGxlZCB3aXRoIGFyZ3VtZW50czogI3tleHB9YCxcbiAgICAgIGFyZ3MsXG4gICAgICBzcHkubW9jay5jYWxscyxcbiAgICApXG4gIH0pXG4gIGNvbnN0IG9yZGluYWxPZiA9IChpOiBudW1iZXIpID0+IHtcbiAgICBjb25zdCBqID0gaSAlIDEwXG4gICAgY29uc3QgayA9IGkgJSAxMDBcblxuICAgIGlmIChqID09PSAxICYmIGsgIT09IDExKVxuICAgICAgcmV0dXJuIGAke2l9c3RgXG5cbiAgICBpZiAoaiA9PT0gMiAmJiBrICE9PSAxMilcbiAgICAgIHJldHVybiBgJHtpfW5kYFxuXG4gICAgaWYgKGogPT09IDMgJiYgayAhPT0gMTMpXG4gICAgICByZXR1cm4gYCR7aX1yZGBcblxuICAgIHJldHVybiBgJHtpfXRoYFxuICB9XG4gIGRlZihbJ3RvSGF2ZUJlZW5OdGhDYWxsZWRXaXRoJywgJ250aENhbGxlZFdpdGgnXSwgZnVuY3Rpb24odGltZXM6IG51bWJlciwgLi4uYXJnczogYW55W10pIHtcbiAgICBjb25zdCBzcHkgPSBnZXRTcHkodGhpcylcbiAgICBjb25zdCBzcHlOYW1lID0gc3B5LmdldE1vY2tOYW1lKClcbiAgICBjb25zdCBudGhDYWxsID0gc3B5Lm1vY2suY2FsbHNbdGltZXMgLSAxXVxuXG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICBhc3ltbWV0cmljRXF1YWxzKG50aENhbGwsIGFyZ3MsIFtpdGVyYWJsZUVxdWFsaXR5XSksXG4gICAgICBgZXhwZWN0ZWQgJHtvcmRpbmFsT2YodGltZXMpfSBcIiR7c3B5TmFtZX1cIiBjYWxsIHRvIGhhdmUgYmVlbiBjYWxsZWQgd2l0aCAje2V4cH1gLFxuICAgICAgYGV4cGVjdGVkICR7b3JkaW5hbE9mKHRpbWVzKX0gXCIke3NweU5hbWV9XCIgY2FsbCB0byBub3QgaGF2ZSBiZWVuIGNhbGxlZCB3aXRoICN7ZXhwfWAsXG4gICAgICBhcmdzLFxuICAgICAgbnRoQ2FsbCxcbiAgICApXG4gIH0pXG4gIGRlZihbJ3RvSGF2ZUJlZW5MYXN0Q2FsbGVkV2l0aCcsICdsYXN0Q2FsbGVkV2l0aCddLCBmdW5jdGlvbiguLi5hcmdzOiBhbnlbXSkge1xuICAgIGNvbnN0IHNweSA9IGdldFNweSh0aGlzKVxuICAgIGNvbnN0IHNweU5hbWUgPSBzcHkuZ2V0TW9ja05hbWUoKVxuICAgIGNvbnN0IGxhc3RDYWxsID0gc3B5Lm1vY2suY2FsbHNbc3B5LmNhbGxzLmxlbmd0aCAtIDFdXG5cbiAgICB0aGlzLmFzc2VydChcbiAgICAgIGFzeW1tZXRyaWNFcXVhbHMobGFzdENhbGwsIGFyZ3MsIFtpdGVyYWJsZUVxdWFsaXR5XSksXG4gICAgICBgZXhwZWN0ZWQgbGFzdCBcIiR7c3B5TmFtZX1cIiBjYWxsIHRvIGhhdmUgYmVlbiBjYWxsZWQgd2l0aCAje2V4cH1gLFxuICAgICAgYGV4cGVjdGVkIGxhc3QgXCIke3NweU5hbWV9XCIgY2FsbCB0byBub3QgaGF2ZSBiZWVuIGNhbGxlZCB3aXRoICN7ZXhwfWAsXG4gICAgICBhcmdzLFxuICAgICAgbGFzdENhbGwsXG4gICAgKVxuICB9KVxuICBkZWYoWyd0b1Rocm93JywgJ3RvVGhyb3dFcnJvciddLCBmdW5jdGlvbihleHBlY3RlZDogc3RyaW5nIHwgUmVnRXhwKSB7XG4gICAgcmV0dXJuIHRoaXMudG8udGhyb3coZXhwZWN0ZWQpXG4gIH0pXG4gIGRlZihbJ3RvSGF2ZVJldHVybmVkJywgJ3RvUmV0dXJuJ10sIGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IHNweSA9IGdldFNweSh0aGlzKVxuICAgIGNvbnN0IHNweU5hbWUgPSBzcHkuZ2V0TW9ja05hbWUoKVxuICAgIGNvbnN0IGNhbGxlZEFuZE5vdFRocmV3ID0gc3B5Lm1vY2suY2FsbHMubGVuZ3RoID4gMCAmJiAhc3B5Lm1vY2sucmVzdWx0cy5zb21lKCh7IHR5cGUgfSkgPT4gdHlwZSA9PT0gJ3Rocm93JylcbiAgICB0aGlzLmFzc2VydChcbiAgICAgIGNhbGxlZEFuZE5vdFRocmV3LFxuICAgICAgYGV4cGVjdGVkIFwiJHtzcHlOYW1lfVwiIHRvIGJlIHN1Y2Nlc3NmdWxseSBjYWxsZWQgYXQgbGVhc3Qgb25jZWAsXG4gICAgICBgZXhwZWN0ZWQgXCIke3NweU5hbWV9XCIgdG8gbm90IGJlIHN1Y2Nlc3NmdWxseSBjYWxsZWRgLFxuICAgICAgY2FsbGVkQW5kTm90VGhyZXcsXG4gICAgICAhY2FsbGVkQW5kTm90VGhyZXcsXG4gICAgKVxuICB9KVxuICBkZWYoWyd0b0hhdmVSZXR1cm5lZFRpbWVzJywgJ3RvUmV0dXJuVGltZXMnXSwgZnVuY3Rpb24odGltZXM6IG51bWJlcikge1xuICAgIGNvbnN0IHNweSA9IGdldFNweSh0aGlzKVxuICAgIGNvbnN0IHNweU5hbWUgPSBzcHkuZ2V0TW9ja05hbWUoKVxuICAgIGNvbnN0IHN1Y2Nlc3NmdWxsUmV0dXJucyA9IHNweS5tb2NrLnJlc3VsdHMucmVkdWNlKChzdWNjZXNzLCB7IHR5cGUgfSkgPT4gdHlwZSA9PT0gJ3Rocm93JyA/IHN1Y2Nlc3MgOiArK3N1Y2Nlc3MsIDApXG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICBzdWNjZXNzZnVsbFJldHVybnMgPT09IHRpbWVzLFxuICAgICAgYGV4cGVjdGVkIFwiJHtzcHlOYW1lfVwiIHRvIGJlIHN1Y2Nlc3NmdWxseSBjYWxsZWQgJHt0aW1lc30gdGltZXNgLFxuICAgICAgYGV4cGVjdGVkIFwiJHtzcHlOYW1lfVwiIHRvIG5vdCBiZSBzdWNjZXNzZnVsbHkgY2FsbGVkICR7dGltZXN9IHRpbWVzYCxcbiAgICAgIGBleHBlY3RlZCBudW1iZXIgb2YgcmV0dXJuczogJHt0aW1lc31gLFxuICAgICAgYHJlY2VpdmVkIG51bWJlciBvZiByZXR1cm5zOiAke3N1Y2Nlc3NmdWxsUmV0dXJuc31gLFxuICAgIClcbiAgfSlcbiAgZGVmKFsndG9IYXZlUmV0dXJuZWRXaXRoJywgJ3RvUmV0dXJuV2l0aCddLCBmdW5jdGlvbih2YWx1ZTogYW55KSB7XG4gICAgY29uc3Qgc3B5ID0gZ2V0U3B5KHRoaXMpXG4gICAgY29uc3Qgc3B5TmFtZSA9IHNweS5nZXRNb2NrTmFtZSgpXG4gICAgY29uc3QgcGFzcyA9IHNweS5tb2NrLnJlc3VsdHMuc29tZSgoeyB0eXBlLCB2YWx1ZTogcmVzdWx0IH0pID0+IHR5cGUgPT09ICdyZXR1cm4nICYmIGFzeW1tZXRyaWNFcXVhbHModmFsdWUsIHJlc3VsdCkpXG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICBwYXNzLFxuICAgICAgYGV4cGVjdGVkIFwiJHtzcHlOYW1lfVwiIHRvIGJlIHN1Y2Nlc3NmdWxseSBjYWxsZWQgd2l0aCAje2V4cH1gLFxuICAgICAgYGV4cGVjdGVkIFwiJHtzcHlOYW1lfVwiIHRvIG5vdCBiZSBzdWNjZXNzZnVsbHkgY2FsbGVkIHdpdGggI3tleHB9YCxcbiAgICAgIHZhbHVlLFxuICAgIClcbiAgfSlcbiAgZGVmKFsndG9IYXZlTGFzdFJldHVybmVkV2l0aCcsICdsYXN0UmV0dXJuZWRXaXRoJ10sIGZ1bmN0aW9uKHZhbHVlOiBhbnkpIHtcbiAgICBjb25zdCBzcHkgPSBnZXRTcHkodGhpcylcbiAgICBjb25zdCBzcHlOYW1lID0gc3B5LmdldE1vY2tOYW1lKClcbiAgICBjb25zdCB7IHZhbHVlOiBsYXN0UmVzdWx0IH0gPSBzcHkubW9jay5yZXN1bHRzW3NweS5yZXR1cm5zLmxlbmd0aCAtIDFdXG4gICAgY29uc3QgcGFzcyA9IGFzeW1tZXRyaWNFcXVhbHMobGFzdFJlc3VsdCwgdmFsdWUpXG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICBwYXNzLFxuICAgICAgYGV4cGVjdGVkIGxhc3QgXCIke3NweU5hbWV9XCIgY2FsbCB0byByZXR1cm4gI3tleHB9YCxcbiAgICAgIGBleHBlY3RlZCBsYXN0IFwiJHtzcHlOYW1lfVwiIGNhbGwgdG8gbm90IHJldHVybiAje2V4cH1gLFxuICAgICAgdmFsdWUsXG4gICAgICBsYXN0UmVzdWx0LFxuICAgIClcbiAgfSlcbiAgZGVmKFsndG9IYXZlTnRoUmV0dXJuZWRXaXRoJywgJ250aFJldHVybmVkV2l0aCddLCBmdW5jdGlvbihudGhDYWxsOiBudW1iZXIsIHZhbHVlOiBhbnkpIHtcbiAgICBjb25zdCBzcHkgPSBnZXRTcHkodGhpcylcbiAgICBjb25zdCBzcHlOYW1lID0gc3B5LmdldE1vY2tOYW1lKClcbiAgICBjb25zdCBpc05vdCA9IHV0aWxzLmZsYWcodGhpcywgJ25lZ2F0ZScpIGFzIGJvb2xlYW5cbiAgICBjb25zdCB7IHR5cGU6IGNhbGxUeXBlLCB2YWx1ZTogY2FsbFJlc3VsdCB9ID0gc3B5Lm1vY2sucmVzdWx0c1tudGhDYWxsIC0gMV1cbiAgICBjb25zdCBvcmRpbmFsQ2FsbCA9IGAke29yZGluYWxPZihudGhDYWxsKX0gY2FsbGBcblxuICAgIGlmICghaXNOb3QgJiYgY2FsbFR5cGUgPT09ICd0aHJvdycpXG4gICAgICBjaGFpLmFzc2VydC5mYWlsKGBleHBlY3RlZCAke29yZGluYWxDYWxsfSB0byByZXR1cm4gI3tleHB9LCBidXQgaW5zdGVhZCBpdCB0aHJldyBhbiBlcnJvcmApXG5cbiAgICBjb25zdCBudGhDYWxsUmV0dXJuID0gYXN5bW1ldHJpY0VxdWFscyhjYWxsUmVzdWx0LCB2YWx1ZSlcblxuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgbnRoQ2FsbFJldHVybixcbiAgICAgIGBleHBlY3RlZCAke29yZGluYWxDYWxsfSBcIiR7c3B5TmFtZX1cIiBjYWxsIHRvIHJldHVybiAje2V4cH1gLFxuICAgICAgYGV4cGVjdGVkICR7b3JkaW5hbENhbGx9IFwiJHtzcHlOYW1lfVwiIGNhbGwgdG8gbm90IHJldHVybiAje2V4cH1gLFxuICAgICAgdmFsdWUsXG4gICAgICBjYWxsUmVzdWx0LFxuICAgIClcbiAgfSlcblxuICB1dGlscy5hZGRQcm9wZXJ0eShjaGFpLkFzc2VydGlvbi5wcm90b3R5cGUsICdyZXNvbHZlcycsIGZ1bmN0aW9uKHRoaXM6IGFueSkge1xuICAgIHV0aWxzLmZsYWcodGhpcywgJ3Byb21pc2UnLCAncmVzb2x2ZXMnKVxuICAgIGNvbnN0IG9iaiA9IHV0aWxzLmZsYWcodGhpcywgJ29iamVjdCcpXG4gICAgY29uc3QgcHJveHk6IGFueSA9IG5ldyBQcm94eSh0aGlzLCB7XG4gICAgICBnZXQ6ICh0YXJnZXQsIGtleSwgcmVjaWV2ZXIpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gUmVmbGVjdC5nZXQodGFyZ2V0LCBrZXksIHJlY2lldmVyKVxuXG4gICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ICE9PSAnZnVuY3Rpb24nKVxuICAgICAgICAgIHJldHVybiByZXN1bHQgaW5zdGFuY2VvZiBjaGFpLkFzc2VydGlvbiA/IHByb3h5IDogcmVzdWx0XG5cbiAgICAgICAgcmV0dXJuIGFzeW5jKC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIG9iai50aGVuKFxuICAgICAgICAgICAgKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgdXRpbHMuZmxhZyh0aGlzLCAnb2JqZWN0JywgdmFsdWUpXG4gICAgICAgICAgICAgIHJldHVybiByZXN1bHQuY2FsbCh0aGlzLCAuLi5hcmdzKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIChlcnI6IGFueSkgPT4ge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHByb21pc2UgcmVqZWN0ZWQgXCIke2Vycn1cIiBpbnN0ZWFkIG9mIHJlc29sdmluZ2ApXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9KVxuXG4gICAgcmV0dXJuIHByb3h5XG4gIH0pXG5cbiAgdXRpbHMuYWRkUHJvcGVydHkoY2hhaS5Bc3NlcnRpb24ucHJvdG90eXBlLCAncmVqZWN0cycsIGZ1bmN0aW9uKHRoaXM6IGFueSkge1xuICAgIHV0aWxzLmZsYWcodGhpcywgJ3Byb21pc2UnLCAncmVqZWN0cycpXG4gICAgY29uc3Qgb2JqID0gdXRpbHMuZmxhZyh0aGlzLCAnb2JqZWN0JylcbiAgICBjb25zdCB3cmFwcGVyID0gdHlwZW9mIG9iaiA9PT0gJ2Z1bmN0aW9uJyA/IG9iaigpIDogb2JqIC8vIGZvciBqZXN0IGNvbXBhdFxuICAgIGNvbnN0IHByb3h5OiBhbnkgPSBuZXcgUHJveHkodGhpcywge1xuICAgICAgZ2V0OiAodGFyZ2V0LCBrZXksIHJlY2lldmVyKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFJlZmxlY3QuZ2V0KHRhcmdldCwga2V5LCByZWNpZXZlcilcblxuICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCAhPT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICByZXR1cm4gcmVzdWx0IGluc3RhbmNlb2YgY2hhaS5Bc3NlcnRpb24gPyBwcm94eSA6IHJlc3VsdFxuXG4gICAgICAgIHJldHVybiBhc3luYyguLi5hcmdzOiBhbnlbXSkgPT4ge1xuICAgICAgICAgIHJldHVybiB3cmFwcGVyLnRoZW4oXG4gICAgICAgICAgICAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHByb21pc2UgcmVzb2x2ZWQgXCIke3ZhbHVlfVwiIGluc3RlYWQgb2YgcmVqZWN0aW5nYClcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgdXRpbHMuZmxhZyh0aGlzLCAnb2JqZWN0JywgZXJyKVxuICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LmNhbGwodGhpcywgLi4uYXJncylcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pXG5cbiAgICByZXR1cm4gcHJveHlcbiAgfSlcblxuICB1dGlscy5hZGRNZXRob2QoXG4gICAgY2hhaS5leHBlY3QsXG4gICAgJ2Fzc2VydGlvbnMnLFxuICAgIGZ1bmN0aW9uIGFzc2VydGlvbnMoZXhwZWN0ZWQ6IG51bWJlcikge1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoYGV4cGVjdGVkIG51bWJlciBvZiBhc3NlcnRpb25zIHRvIGJlICR7ZXhwZWN0ZWR9LCBidXQgZ290ICR7Z2V0U3RhdGUoKS5hc3NlcnRpb25DYWxsc31gKVxuICAgICAgaWYgKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKVxuICAgICAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZShlcnJvciwgYXNzZXJ0aW9ucylcblxuICAgICAgc2V0U3RhdGUoe1xuICAgICAgICBleHBlY3RlZEFzc2VydGlvbnNOdW1iZXI6IGV4cGVjdGVkLFxuICAgICAgICBleHBlY3RlZEFzc2VydGlvbnNOdW1iZXJFcnJvcjogZXJyb3IsXG4gICAgICB9KVxuICAgIH0sXG4gIClcblxuICB1dGlscy5hZGRNZXRob2QoXG4gICAgY2hhaS5leHBlY3QsXG4gICAgJ2hhc0Fzc2VydGlvbnMnLFxuICAgIGZ1bmN0aW9uIGhhc0Fzc2VydGlvbnMoKSB7XG4gICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcignZXhwZWN0ZWQgYW55IG51bWJlciBvZiBhc3NlcnRpb24sIGJ1dCBnb3Qgbm9uZScpXG4gICAgICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpXG4gICAgICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKGVycm9yLCBoYXNBc3NlcnRpb25zKVxuXG4gICAgICBzZXRTdGF0ZSh7XG4gICAgICAgIGlzRXhwZWN0aW5nQXNzZXJ0aW9uczogdHJ1ZSxcbiAgICAgICAgaXNFeHBlY3RpbmdBc3NlcnRpb25zRXJyb3I6IGVycm9yLFxuICAgICAgfSlcbiAgICB9LFxuICApXG5cbiAgdXRpbHMuYWRkTWV0aG9kKFxuICAgIGNoYWkuZXhwZWN0LFxuICAgICdhZGRTbmFwc2hvdFNlcmlhbGl6ZXInLFxuICAgIGFkZFNlcmlhbGl6ZXIsXG4gIClcbn1cbiIsIihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gZmFjdG9yeShleHBvcnRzKSA6XG4gICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnZXhwb3J0cyddLCBmYWN0b3J5KSA6XG4gICAgKGdsb2JhbCA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbFRoaXMgOiBnbG9iYWwgfHwgc2VsZiwgZmFjdG9yeShnbG9iYWwuTW9ja0RhdGUgPSB7fSkpO1xufSh0aGlzLCAoZnVuY3Rpb24gKGV4cG9ydHMpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbiAgICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cclxuXHJcbiAgICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnlcclxuICAgIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZC5cclxuXHJcbiAgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXHJcbiAgICBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFlcclxuICAgIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCxcclxuICAgIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxyXG4gICAgTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1JcclxuICAgIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1JcclxuICAgIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXHJcbiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4gICAgLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UgKi9cclxuXHJcbiAgICB2YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcclxuICAgICAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XHJcbiAgICAgICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcclxuICAgICAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcclxuICAgICAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxuICAgIH07XHJcblxyXG4gICAgZnVuY3Rpb24gX19leHRlbmRzKGQsIGIpIHtcclxuICAgICAgICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhiKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XHJcbiAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxuICAgICAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cclxuICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XHJcbiAgICB9XG5cbiAgICB2YXIgUmVhbERhdGUgPSBEYXRlO1xyXG4gICAgdmFyIG5vdyA9IG51bGw7XHJcbiAgICB2YXIgTW9ja0RhdGUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XHJcbiAgICAgICAgX19leHRlbmRzKERhdGUsIF9zdXBlcik7XHJcbiAgICAgICAgZnVuY3Rpb24gRGF0ZSh5LCBtLCBkLCBoLCBNLCBzLCBtcykge1xyXG4gICAgICAgICAgICBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xyXG4gICAgICAgICAgICB2YXIgZGF0ZTtcclxuICAgICAgICAgICAgc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDA6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vdyAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRlID0gbmV3IFJlYWxEYXRlKG5vdy52YWx1ZU9mKCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZSA9IG5ldyBSZWFsRGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgMTpcclxuICAgICAgICAgICAgICAgICAgICBkYXRlID0gbmV3IFJlYWxEYXRlKHkpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICBkID0gdHlwZW9mIGQgPT09ICd1bmRlZmluZWQnID8gMSA6IGQ7XHJcbiAgICAgICAgICAgICAgICAgICAgaCA9IGggfHwgMDtcclxuICAgICAgICAgICAgICAgICAgICBNID0gTSB8fCAwO1xyXG4gICAgICAgICAgICAgICAgICAgIHMgPSBzIHx8IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgbXMgPSBtcyB8fCAwO1xyXG4gICAgICAgICAgICAgICAgICAgIGRhdGUgPSBuZXcgUmVhbERhdGUoeSwgbSwgZCwgaCwgTSwgcywgbXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBkYXRlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gRGF0ZTtcclxuICAgIH0oUmVhbERhdGUpKTtcclxuICAgIE1vY2tEYXRlLnByb3RvdHlwZSA9IFJlYWxEYXRlLnByb3RvdHlwZTtcclxuICAgIE1vY2tEYXRlLlVUQyA9IFJlYWxEYXRlLlVUQztcclxuICAgIE1vY2tEYXRlLm5vdyA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICByZXR1cm4gbmV3IE1vY2tEYXRlKCkudmFsdWVPZigpO1xyXG4gICAgfTtcclxuICAgIE1vY2tEYXRlLnBhcnNlID0gZnVuY3Rpb24gKGRhdGVTdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gUmVhbERhdGUucGFyc2UoZGF0ZVN0cmluZyk7XHJcbiAgICB9O1xyXG4gICAgTW9ja0RhdGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgcmV0dXJuIFJlYWxEYXRlLnRvU3RyaW5nKCk7XHJcbiAgICB9O1xyXG4gICAgZnVuY3Rpb24gc2V0KGRhdGUpIHtcclxuICAgICAgICB2YXIgZGF0ZU9iaiA9IG5ldyBEYXRlKGRhdGUudmFsdWVPZigpKTtcclxuICAgICAgICBpZiAoaXNOYU4oZGF0ZU9iai5nZXRUaW1lKCkpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ21vY2tkYXRlOiBUaGUgdGltZSBzZXQgaXMgYW4gaW52YWxpZCBkYXRlOiAnICsgZGF0ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICBEYXRlID0gTW9ja0RhdGU7XHJcbiAgICAgICAgbm93ID0gZGF0ZU9iai52YWx1ZU9mKCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiByZXNldCgpIHtcclxuICAgICAgICBEYXRlID0gUmVhbERhdGU7XHJcbiAgICB9XHJcbiAgICB2YXIgbW9ja2RhdGUgPSB7XHJcbiAgICAgICAgc2V0OiBzZXQsXHJcbiAgICAgICAgcmVzZXQ6IHJlc2V0LFxyXG4gICAgfTtcblxuICAgIGV4cG9ydHMuZGVmYXVsdCA9IG1vY2tkYXRlO1xuICAgIGV4cG9ydHMucmVzZXQgPSByZXNldDtcbiAgICBleHBvcnRzLnNldCA9IHNldDtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG5cbn0pKSk7XG4iLCIvLyBUT0RPIHNldEltbWVkaWF0ZSwgbmV4dFRpY2ssIHJlcXVlc3RBbmltYXRpb25GcmFtZSwgY2FuY2VsQW5pbWF0aW9uRnJhbWVcbi8vIFRPRE8gYXN5bmMgdGltZXJzXG5cbmltcG9ydCB0eXBlIHsgSmVzdE1vY2tDb21wYXQgfSBmcm9tICcuL2plc3QtbW9jaydcbmltcG9ydCB7IHNweU9uIH0gZnJvbSAnLi9qZXN0LW1vY2snXG5cbmNvbnN0IG9yaWdpbmFsU2V0VGltZW91dCA9IGdsb2JhbC5zZXRUaW1lb3V0XG5jb25zdCBvcmlnaW5hbFNldEludGVydmFsID0gZ2xvYmFsLnNldEludGVydmFsXG5jb25zdCBvcmlnaW5hbENsZWFyVGltZW91dCA9IGdsb2JhbC5jbGVhclRpbWVvdXRcbmNvbnN0IG9yaWdpbmFsQ2xlYXJJbnRlcnZhbCA9IGdsb2JhbC5jbGVhckludGVydmFsXG5cbnR5cGUgQXJndW1lbnRzID0gW2NiOiAoYXJnczogdm9pZCkgPT4gdm9pZCwgbXM/OiBudW1iZXIgfCB1bmRlZmluZWRdXG5cbmNvbnN0IE1BWF9MT09QUyA9IDEwXzAwMFxuXG50eXBlIEZha2VDYWxsID0ge1xuICBjYjogKCkgPT4gYW55XG4gIG1zOiBudW1iZXJcbiAgaWQ6IG51bWJlclxuICBuZXN0ZWRNczogbnVtYmVyXG4gIHNjb3BlSWQ6IG51bWJlclxufVxuXG5lbnVtIFF1ZXVlVGFza1R5cGUge1xuICBJbnRlcnZhbCA9ICdpbnRlcnZhbCcsXG4gIFRpbWVvdXQgPSAndGltZW91dCcsXG4gIEltbWVkaWF0ZSA9ICdpbW1lZGlhdGUnXG59XG5cbmludGVyZmFjZSBRdWV1ZVRhc2sge1xuICB0eXBlOiBRdWV1ZVRhc2tUeXBlXG4gIGNhbGw6IEZha2VDYWxsXG4gIG5lc3RlZDogYm9vbGVhblxufVxuXG5jb25zdCBhc3NlcnRFdmVyeSA9IChhc3NlcnRpb25zOiBhbnlbXSwgbWVzc2FnZTogc3RyaW5nKSA9PiB7XG4gIGlmIChhc3NlcnRpb25zLnNvbWUoYSA9PiAhYSkpXG4gICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpXG59XG5cbmNvbnN0IGFzc2VydE1heExvb3AgPSAodGltZXM6IG51bWJlcikgPT4ge1xuICBpZiAodGltZXMgPj0gTUFYX0xPT1BTKVxuICAgIHRocm93IG5ldyBFcnJvcignc2V0VGltZW91dC9zZXRJbnRlcnZhbCBjYWxsZWQgMTAgMDAwIHRpbWVzLiBJdFxcJ3MgcG9zc2libGUgaXQgc3R1Y2sgaW4gYW4gaW5maW5pdGUgbG9vcC4nKVxufVxuXG4vLyBUT0RPIHNob3VsZCBkbyB3aGF0IE5vZGVKUy5UaW1lb3V0IGRvZXMgb24gcmVmcmVzaFxuY29uc3QgZ2V0Tm9kZVRpbWVvdXQgPSAoaWQ6IG51bWJlcik6IE5vZGVKUy5UaW1lb3V0ID0+IHtcbiAgY29uc3QgdGltZXIgPSB7XG4gICAgcmVmOiAoKSA9PiB0aW1lcixcbiAgICB1bnJlZjogKCkgPT4gdGltZXIsXG4gICAgaGFzUmVmOiAoKSA9PiB0cnVlLFxuICAgIHJlZnJlc2g6ICgpID0+IHRpbWVyLFxuICAgIFtTeW1ib2wudG9QcmltaXRpdmVdOiAoKSA9PiBpZCxcbiAgfVxuXG4gIHJldHVybiB0aW1lclxufVxuXG5leHBvcnQgY2xhc3MgRmFrZVRpbWVycyB7XG4gIHByaXZhdGUgX3NldFRpbWVvdXQhOiBKZXN0TW9ja0NvbXBhdDxBcmd1bWVudHMsIE5vZGVKUy5UaW1lb3V0PlxuICBwcml2YXRlIF9zZXRJbnRlcnZhbCE6IEplc3RNb2NrQ29tcGF0PEFyZ3VtZW50cywgTm9kZUpTLlRpbWVvdXQ+XG5cbiAgcHJpdmF0ZSBfY2xlYXJUaW1lb3V0ITogSmVzdE1vY2tDb21wYXQ8W05vZGVKUy5UaW1lb3V0XSwgdm9pZD5cbiAgcHJpdmF0ZSBfY2xlYXJJbnRlcnZhbCE6IEplc3RNb2NrQ29tcGF0PFtOb2RlSlMuVGltZW91dF0sIHZvaWQ+XG5cbiAgcHJpdmF0ZSBfYWR2YW5jZWRUaW1lID0gMFxuICBwcml2YXRlIF9uZXN0ZWRUaW1lOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge31cbiAgcHJpdmF0ZSBfc2NvcGVJZCA9IDBcbiAgcHJpdmF0ZSBfaXNOZXN0ZWQgPSBmYWxzZVxuICBwcml2YXRlIF9pc09ubHlQZW5kaW5nID0gZmFsc2VcblxuICBwcml2YXRlIF9zcHlpZCA9IDBcblxuICBwcml2YXRlIF9pc01vY2tlZCA9IGZhbHNlXG5cbiAgcHJpdmF0ZSBfdGFza3NRdWV1ZTogUXVldWVUYXNrW10gPSBbXVxuICBwcml2YXRlIF9xdWV1ZUNvdW50ID0gMFxuXG4gIHB1YmxpYyB1c2VGYWtlVGltZXJzKCkge1xuICAgIHRoaXMuX2lzTW9ja2VkID0gdHJ1ZVxuXG4gICAgdGhpcy5yZXNldCgpXG5cbiAgICBjb25zdCBzcHlGYWN0b3J5ID0gKHNweVR5cGU6IFF1ZXVlVGFza1R5cGUsIHJlc3VsdEJ1aWxkZXI6IChpZDogbnVtYmVyLCBjYjogKGFyZ3M6IHZvaWQpID0+IHZvaWQpID0+IGFueSkgPT4ge1xuICAgICAgcmV0dXJuIChjYjogKGFyZ3M6IHZvaWQpID0+IHZvaWQsIG1zID0gMCkgPT4ge1xuICAgICAgICBjb25zdCBpZCA9ICsrdGhpcy5fc3B5aWRcbiAgICAgICAgLy8gYWxsIHRpbWVycyB1cCB1bnRpbCB0aGlzIHBvaW50XG4gICAgICAgIGNvbnN0IG5lc3RlZFRvID0gT2JqZWN0LmVudHJpZXModGhpcy5fbmVzdGVkVGltZSkuZmlsdGVyKChba2V5XSkgPT4gTnVtYmVyKGtleSkgPD0gdGhpcy5fc2NvcGVJZClcbiAgICAgICAgY29uc3QgbmVzdGVkTXMgPSBuZXN0ZWRUby5yZWR1Y2UoKHRvdGFsLCBbLCBtc10pID0+IHRvdGFsICsgbXMsIG1zKVxuICAgICAgICBjb25zdCBjYWxsOiBGYWtlQ2FsbCA9IHsgaWQsIGNiLCBtcywgbmVzdGVkTXMsIHNjb3BlSWQ6IHRoaXMuX3Njb3BlSWQgfVxuICAgICAgICBjb25zdCB0YXNrID0geyB0eXBlOiBzcHlUeXBlLCBjYWxsLCBuZXN0ZWQ6IHRoaXMuX2lzTmVzdGVkIH1cblxuICAgICAgICB0aGlzLnB1c2hUYXNrKHRhc2spXG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdEJ1aWxkZXIoaWQsIGNiKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX3NldFRpbWVvdXQgPSBzcHlPbihnbG9iYWwsICdzZXRUaW1lb3V0JykubW9ja0ltcGxlbWVudGF0aW9uKHNweUZhY3RvcnkoUXVldWVUYXNrVHlwZS5UaW1lb3V0LCBnZXROb2RlVGltZW91dCkpXG4gICAgdGhpcy5fc2V0SW50ZXJ2YWwgPSBzcHlPbihnbG9iYWwsICdzZXRJbnRlcnZhbCcpLm1vY2tJbXBsZW1lbnRhdGlvbihzcHlGYWN0b3J5KFF1ZXVlVGFza1R5cGUuSW50ZXJ2YWwsIGdldE5vZGVUaW1lb3V0KSlcblxuICAgIGNvbnN0IGNsZWFyVGltZXJGYWN0b3J5ID0gKHNweVR5cGU6IFF1ZXVlVGFza1R5cGUpID0+IChpZDogbnVtYmVyIHwgdW5kZWZpbmVkIHwgTm9kZUpTLlRpbWVvdXQpID0+IHtcbiAgICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkKSByZXR1cm5cblxuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLl90YXNrc1F1ZXVlLmZpbmRJbmRleCgoeyBjYWxsLCB0eXBlIH0pID0+IHR5cGUgPT09IHNweVR5cGUgJiYgY2FsbC5pZCA9PT0gTnVtYmVyKGlkKSlcblxuICAgICAgaWYgKGluZGV4ICE9PSAtMSlcbiAgICAgICAgdGhpcy5fdGFza3NRdWV1ZS5zcGxpY2UoaW5kZXgsIDEpXG4gICAgfVxuXG4gICAgdGhpcy5fY2xlYXJUaW1lb3V0ID0gc3B5T24oZ2xvYmFsLCAnY2xlYXJUaW1lb3V0JykubW9ja0ltcGxlbWVudGF0aW9uKGNsZWFyVGltZXJGYWN0b3J5KFF1ZXVlVGFza1R5cGUuVGltZW91dCkpXG4gICAgdGhpcy5fY2xlYXJJbnRlcnZhbCA9IHNweU9uKGdsb2JhbCwgJ2NsZWFySW50ZXJ2YWwnKS5tb2NrSW1wbGVtZW50YXRpb24oY2xlYXJUaW1lckZhY3RvcnkoUXVldWVUYXNrVHlwZS5JbnRlcnZhbCkpXG4gIH1cblxuICBwdWJsaWMgdXNlUmVhbFRpbWVycygpIHtcbiAgICB0aGlzLl9pc01vY2tlZCA9IGZhbHNlXG5cbiAgICB0aGlzLnJlc2V0KClcblxuICAgIGdsb2JhbC5zZXRUaW1lb3V0ID0gb3JpZ2luYWxTZXRUaW1lb3V0XG4gICAgZ2xvYmFsLnNldEludGVydmFsID0gb3JpZ2luYWxTZXRJbnRlcnZhbFxuICAgIGdsb2JhbC5jbGVhclRpbWVvdXQgPSBvcmlnaW5hbENsZWFyVGltZW91dFxuICAgIGdsb2JhbC5jbGVhckludGVydmFsID0gb3JpZ2luYWxDbGVhckludGVydmFsXG4gIH1cblxuICBwdWJsaWMgcnVuT25seVBlbmRpbmdUaW1lcnMoKTogdm9pZCB8IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuYXNzZXJ0TW9ja2VkKClcblxuICAgIHRoaXMuX2lzT25seVBlbmRpbmcgPSB0cnVlXG4gICAgdGhpcy5ydW5RdWV1ZSgpXG4gIH1cblxuICBwdWJsaWMgcnVuQWxsVGltZXJzKCk6IHZvaWQgfCBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmFzc2VydE1vY2tlZCgpXG5cbiAgICB0aGlzLnJ1blF1ZXVlKClcbiAgfVxuXG4gIHB1YmxpYyBhZHZhbmNlVGltZXJzQnlUaW1lKG1zOiBudW1iZXIpOiB2b2lkIHwgUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5hc3NlcnRNb2NrZWQoKVxuXG4gICAgdGhpcy5fYWR2YW5jZWRUaW1lICs9IG1zXG4gICAgdGhpcy5ydW5RdWV1ZSgpXG4gIH1cblxuICBwdWJsaWMgYWR2YW5jZVRpbWVyc1RvTmV4dFRpbWVyKCk6IHZvaWQgfCBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmFzc2VydE1vY2tlZCgpXG5cbiAgICB0aGlzLmNhbGxRdWV1ZUl0ZW0oMClcbiAgfVxuXG4gIHB1YmxpYyBnZXRUaW1lckNvdW50KCk6IG51bWJlciB7XG4gICAgdGhpcy5hc3NlcnRNb2NrZWQoKVxuXG4gICAgcmV0dXJuIHRoaXMuX3Rhc2tzUXVldWUubGVuZ3RoXG4gIH1cblxuICBwcml2YXRlIHJlc2V0KCkge1xuICAgIHRoaXMuX2FkdmFuY2VkVGltZSA9IDBcbiAgICB0aGlzLl9uZXN0ZWRUaW1lID0ge31cbiAgICB0aGlzLl9pc05lc3RlZCA9IGZhbHNlXG4gICAgdGhpcy5faXNPbmx5UGVuZGluZyA9IGZhbHNlXG4gICAgdGhpcy5fc3B5aWQgPSAwXG4gICAgdGhpcy5fcXVldWVDb3VudCA9IDBcbiAgICB0aGlzLl90YXNrc1F1ZXVlID0gW11cblxuICAgIHRoaXMuX2NsZWFySW50ZXJ2YWw/Lm1vY2tSZXN0b3JlKClcbiAgICB0aGlzLl9jbGVhclRpbWVvdXQ/Lm1vY2tSZXN0b3JlKClcbiAgICB0aGlzLl9zZXRJbnRlcnZhbD8ubW9ja1Jlc3RvcmUoKVxuICAgIHRoaXMuX3NldFRpbWVvdXQ/Lm1vY2tSZXN0b3JlKClcbiAgfVxuXG4gIHByaXZhdGUgY2FsbFF1ZXVlSXRlbShpbmRleDogbnVtYmVyKSB7XG4gICAgY29uc3QgdGFzayA9IHRoaXMuX3Rhc2tzUXVldWVbaW5kZXhdXG5cbiAgICBpZiAoIXRhc2spIHJldHVyblxuXG4gICAgY29uc3QgeyBjYWxsLCB0eXBlIH0gPSB0YXNrXG5cbiAgICB0aGlzLl9zY29wZUlkID0gY2FsbC5pZFxuICAgIHRoaXMuX2lzTmVzdGVkID0gdHJ1ZVxuXG4gICAgdGhpcy5fbmVzdGVkVGltZVtjYWxsLmlkXSA/Pz0gMFxuICAgIHRoaXMuX25lc3RlZFRpbWVbY2FsbC5pZF0gKz0gY2FsbC5tc1xuXG4gICAgaWYgKHR5cGUgPT09ICd0aW1lb3V0Jykge1xuICAgICAgdGhpcy5yZW1vdmVUYXNrKGluZGV4KVxuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlID09PSAnaW50ZXJ2YWwnKSB7XG4gICAgICBjYWxsLm5lc3RlZE1zICs9IGNhbGwubXNcbiAgICAgIGNvbnN0IG5lc3RlZE1zID0gY2FsbC5uZXN0ZWRNc1xuICAgICAgY29uc3QgY2xvc2VzdFRhc2sgPSB0aGlzLl90YXNrc1F1ZXVlLmZpbmRJbmRleCgoeyB0eXBlLCBjYWxsIH0pID0+IHR5cGUgPT09ICdpbnRlcnZhbCcgJiYgY2FsbC5uZXN0ZWRNcyA8IG5lc3RlZE1zKVxuXG4gICAgICBpZiAoY2xvc2VzdFRhc2sgIT09IC0xICYmIGNsb3Nlc3RUYXNrICE9PSBpbmRleClcbiAgICAgICAgdGhpcy5lbnN1cmVRdWV1ZU9yZGVyKClcbiAgICB9XG5cbiAgICBjYWxsLmNiKClcblxuICAgIHRoaXMuX3F1ZXVlQ291bnQrK1xuICB9XG5cbiAgcHJpdmF0ZSBydW5RdWV1ZSgpIHtcbiAgICBsZXQgaW5kZXggPSAwXG4gICAgd2hpbGUgKHRoaXMuX3Rhc2tzUXVldWVbaW5kZXhdKSB7XG4gICAgICBhc3NlcnRNYXhMb29wKHRoaXMuX3F1ZXVlQ291bnQpXG5cbiAgICAgIGNvbnN0IHsgY2FsbCwgbmVzdGVkIH0gPSB0aGlzLl90YXNrc1F1ZXVlW2luZGV4XVxuXG4gICAgICBpZiAodGhpcy5fYWR2YW5jZWRUaW1lICYmIGNhbGwubmVzdGVkTXMgPiB0aGlzLl9hZHZhbmNlZFRpbWUpXG4gICAgICAgIGJyZWFrXG5cbiAgICAgIGlmICh0aGlzLl9pc09ubHlQZW5kaW5nICYmIG5lc3RlZCkge1xuICAgICAgICBpbmRleCsrXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIHRoaXMuY2FsbFF1ZXVlSXRlbShpbmRleClcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZVRhc2soaW5kZXg6IG51bWJlcikge1xuICAgIGlmIChpbmRleCA9PT0gMClcbiAgICAgIHRoaXMuX3Rhc2tzUXVldWUuc2hpZnQoKVxuICAgIGVsc2VcbiAgICAgIHRoaXMuX3Rhc2tzUXVldWUuc3BsaWNlKGluZGV4LCAxKVxuICB9XG5cbiAgcHJpdmF0ZSBwdXNoVGFzayh0YXNrOiBRdWV1ZVRhc2spIHtcbiAgICB0aGlzLl90YXNrc1F1ZXVlLnB1c2godGFzaylcbiAgICB0aGlzLmVuc3VyZVF1ZXVlT3JkZXIoKVxuICB9XG5cbiAgcHJpdmF0ZSBlbnN1cmVRdWV1ZU9yZGVyKCkge1xuICAgIHRoaXMuX3Rhc2tzUXVldWUuc29ydCgodDEsIHQyKSA9PiB7XG4gICAgICBjb25zdCBkaWZmID0gdDEuY2FsbC5uZXN0ZWRNcyAtIHQyLmNhbGwubmVzdGVkTXNcblxuICAgICAgaWYgKGRpZmYgPT09IDApIHtcbiAgICAgICAgaWYgKHQxLnR5cGUgPT09IFF1ZXVlVGFza1R5cGUuSW1tZWRpYXRlICYmIHQyLnR5cGUgIT09IFF1ZXVlVGFza1R5cGUuSW1tZWRpYXRlKVxuICAgICAgICAgIHJldHVybiAxXG5cbiAgICAgICAgcmV0dXJuIDBcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRpZmZcbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBhc3NlcnRNb2NrZWQoKSB7XG4gICAgYXNzZXJ0RXZlcnkoW1xuICAgICAgdGhpcy5faXNNb2NrZWQsXG4gICAgICB0aGlzLl9zZXRUaW1lb3V0LFxuICAgICAgdGhpcy5fc2V0SW50ZXJ2YWwsXG4gICAgICB0aGlzLl9jbGVhclRpbWVvdXQsXG4gICAgICB0aGlzLl9jbGVhckludGVydmFsLFxuICAgIF0sICd0aW1lcnMgYXJlIG5vdCBtb2NrZWQuIHRyeSBjYWxsaW5nIFwidmkudXNlRmFrZVRpbWVycygpXCIgZmlyc3QnKVxuICB9XG59XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMgKi9cblxuaW1wb3J0IG1vY2tkYXRlIGZyb20gJ21vY2tkYXRlJ1xuaW1wb3J0IHsgRmFrZVRpbWVycyB9IGZyb20gJy4vdGltZXJzJ1xuaW1wb3J0IHR5cGUgeyBFbmhhbmNlZFNweSwgTWF5YmVNb2NrZWQsIE1heWJlTW9ja2VkRGVlcCB9IGZyb20gJy4vamVzdC1tb2NrJ1xuaW1wb3J0IHsgZm4sIGlzTW9ja0Z1bmN0aW9uLCBzcGllcywgc3B5T24gfSBmcm9tICcuL2plc3QtbW9jaydcblxuY2xhc3MgVml0ZXN0VXRpbHMge1xuICBwcml2YXRlIF90aW1lcnM6IEZha2VUaW1lcnNcbiAgcHJpdmF0ZSBfbW9ja2VkRGF0ZTogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSB8IG51bGxcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLl90aW1lcnMgPSBuZXcgRmFrZVRpbWVycygpXG4gICAgdGhpcy5fbW9ja2VkRGF0ZSA9IG51bGxcbiAgfVxuXG4gIC8vIHRpbWVyc1xuXG4gIHB1YmxpYyB1c2VGYWtlVGltZXJzKCkge1xuICAgIHJldHVybiB0aGlzLl90aW1lcnMudXNlRmFrZVRpbWVycygpXG4gIH1cblxuICBwdWJsaWMgdXNlUmVhbFRpbWVycygpIHtcbiAgICByZXR1cm4gdGhpcy5fdGltZXJzLnVzZVJlYWxUaW1lcnMoKVxuICB9XG5cbiAgcHVibGljIHJ1bk9ubHlQZW5kaW5nVGltZXJzKCkge1xuICAgIHJldHVybiB0aGlzLl90aW1lcnMucnVuT25seVBlbmRpbmdUaW1lcnMoKVxuICB9XG5cbiAgcHVibGljIHJ1bkFsbFRpbWVycygpIHtcbiAgICByZXR1cm4gdGhpcy5fdGltZXJzLnJ1bkFsbFRpbWVycygpXG4gIH1cblxuICBwdWJsaWMgYWR2YW5jZVRpbWVyc0J5VGltZShtczogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RpbWVycy5hZHZhbmNlVGltZXJzQnlUaW1lKG1zKVxuICB9XG5cbiAgcHVibGljIGFkdmFuY2VUaW1lcnNUb05leHRUaW1lcigpIHtcbiAgICByZXR1cm4gdGhpcy5fdGltZXJzLmFkdmFuY2VUaW1lcnNUb05leHRUaW1lcigpXG4gIH1cblxuICBwdWJsaWMgZ2V0VGltZXJDb3VudCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdGltZXJzLmdldFRpbWVyQ291bnQoKVxuICB9XG5cbiAgLy8gZGF0ZVxuXG4gIHB1YmxpYyBtb2NrQ3VycmVudERhdGUoZGF0ZTogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSkge1xuICAgIHRoaXMuX21vY2tlZERhdGUgPSBkYXRlXG4gICAgbW9ja2RhdGUuc2V0KGRhdGUpXG4gIH1cblxuICBwdWJsaWMgcmVzdG9yZUN1cnJlbnREYXRlKCkge1xuICAgIHRoaXMuX21vY2tlZERhdGUgPSBudWxsXG4gICAgbW9ja2RhdGUucmVzZXQoKVxuICB9XG5cbiAgcHVibGljIGdldE1vY2tlZERhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21vY2tlZERhdGVcbiAgfVxuXG4gIC8vIG1vY2tzXG5cbiAgc3B5T24gPSBzcHlPblxuICBmbiA9IGZuXG5cbiAgLy8ganVzdCBoaW50cyBmb3IgdHJhbnNmb3JtZXIgdG8gcmV3cml0ZSBpbXBvcnRzXG5cbiAgLyoqXG4gICAqIE1ha2VzIGFsbCBgaW1wb3J0c2AgdG8gcGFzc2VkIG1vZHVsZSB0byBiZSBtb2NrZWQuXG4gICAqIC0gSWYgdGhlcmUgaXMgYSBmYWN0b3J5LCB3aWxsIHJldHVybiBpdCdzIHJlc3VsdC4gVGhlIGNhbGwgdG8gYHZpLm1vY2tgIGlzIGhvaXN0ZWQgdG8gdGhlIHRvcCBvZiB0aGUgZmlsZSxcbiAgICogc28geW91IGRvbid0IGhhdmUgYWNjZXNzIHRvIHZhcmlhYmxlcyBkZWNsYXJlZCBpbiB0aGUgZ2xvYmFsIGZpbGUgc2NvcGUsIGlmIHlvdSBkaWRuJ3QgcHV0IHRoZW0gYmVmb3JlIGltcG9ydHMhXG4gICAqIC0gSWYgYF9fbW9ja3NfX2AgZm9sZGVyIHdpdGggZmlsZSBvZiB0aGUgc2FtZSBuYW1lIGV4aXN0LCBhbGwgaW1wb3J0cyB3aWxsXG4gICAqIHJldHVybiBpdC5cbiAgICogLSBJZiB0aGVyZSBpcyBubyBgX19tb2Nrc19fYCBmb2xkZXIgb3IgYSBmaWxlIHdpdGggdGhlIHNhbWUgbmFtZSBpbnNpZGUsIHdpbGwgY2FsbCBvcmlnaW5hbFxuICAgKiBtb2R1bGUgYW5kIG1vY2sgaXQuXG4gICAqIEBwYXJhbSBwYXRoIFBhdGggdG8gdGhlIG1vZHVsZS4gQ2FuIGJlIGFsaWFzZWQsIGlmIHlvdXIgY29uZmlnIHN1cHBvcnMgaXRcbiAgICogQHBhcmFtIGZhY3RvcnkgRmFjdG9yeSBmb3IgdGhlIG1vY2tlZCBtb2R1bGUuIEhhcyB0aGUgaGlnaGVzdCBwcmlvcml0eS5cbiAgICovXG4gIHB1YmxpYyBtb2NrKHBhdGg6IHN0cmluZywgZmFjdG9yeT86ICgpID0+IGFueSkge31cbiAgLyoqXG4gICAqIFJlbW92ZXMgbW9kdWxlIGZyb20gbW9ja2VkIHJlZ2lzdHJ5LiBBbGwgc3Vic2VxdWVudCBjYWxscyB0byBpbXBvcnQgd2lsbFxuICAgKiByZXR1cm4gb3JpZ2luYWwgbW9kdWxlIGV2ZW4gaWYgaXQgd2FzIG1vY2tlZC5cbiAgICogQHBhcmFtIHBhdGggUGF0aCB0byB0aGUgbW9kdWxlLiBDYW4gYmUgYWxpYXNlZCwgaWYgeW91ciBjb25maWcgc3VwcG9ycyBpdFxuICAgKi9cbiAgcHVibGljIHVubW9jayhwYXRoOiBzdHJpbmcpIHt9XG5cbiAgLyoqXG4gICAqIEltcG9ydHMgbW9kdWxlLCBieXBhc3NpbmcgYWxsIGNoZWNrcyBpZiBpdCBzaG91bGQgYmUgbW9ja2VkLlxuICAgKiBDYW4gYmUgdXNlZnVsIGlmIHlvdSB3YW50IHRvIG1vY2sgbW9kdWxlIHBhcnRpYWxseS5cbiAgICogQGV4YW1wbGVcbiAgICogdmkubW9jaygnLi9leGFtcGxlJywgYXN5bmMgKCkgPT4ge1xuICAgKiAgY29uc3QgYXhpb3MgPSBhd2FpdCB2aS5pbXBvcnRBY3R1YWwoJy4vZXhhbXBsZScpXG4gICAqXG4gICAqICByZXR1cm4geyAuLi5heGlvcywgZ2V0OiB2aS5mbigpIH1cbiAgICogfSlcbiAgICogQHBhcmFtIHBhdGggUGF0aCB0byB0aGUgbW9kdWxlLiBDYW4gYmUgYWxpYXNlZCwgaWYgeW91ciBjb25maWcgc3VwcG9ycyBpdFxuICAgKiBAcmV0dXJucyBBY3R1YWwgbW9kdWxlIHdpdGhvdXQgc3BpZXNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBpbXBvcnRBY3R1YWw8VD4ocGF0aDogc3RyaW5nKTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIHt9IGFzIFRcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBvcnRzIGEgbW9kdWxlIHdpdGggYWxsIG9mIGl0cyBwcm9wZXJ0aWVzIGFuZCBuZXN0ZWQgcHJvcGVydGllcyBtb2NrZWQuXG4gICAqIEZvciB0aGUgcnVsZXMgYXBwbGllZCwgc2VlIGRvY3MuXG4gICAqIEBwYXJhbSBwYXRoIFBhdGggdG8gdGhlIG1vZHVsZS4gQ2FuIGJlIGFsaWFzZWQsIGlmIHlvdXIgY29uZmlnIHN1cHBvcnMgaXRcbiAgICogQHJldHVybnMgRnVsbHkgbW9ja2VkIG1vZHVsZVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGltcG9ydE1vY2s8VD4ocGF0aDogc3RyaW5nKTogUHJvbWlzZTxNYXliZU1vY2tlZERlZXA8VD4+IHtcbiAgICByZXR1cm4ge30gYXMgTWF5YmVNb2NrZWREZWVwPFQ+XG4gIH1cblxuICAvKipcbiAgICogVHlwZSBoZWxwZXJzIGZvciBUeXBlU2NyaXB0LiBJbiByZWFsaXR5IGp1c3QgcmV0dXJucyB0aGUgb2JqZWN0IHRoYXQgd2FzIHBhc3NlZC5cbiAgICogQGV4YW1wbGVcbiAgICogaW1wb3J0IGV4YW1wbGUgZnJvbSAnLi9leGFtcGxlJ1xuICAgKiB2aS5tb2NrKCcuL2V4YW1wbGUnKVxuICAgKlxuICAgKiB0ZXN0KCcxKzEgZXF1YWxzIDInIGFzeW5jICgpID0+IHtcbiAgICogIHZpLm1vY2tlZChleGFtcGxlLmNhbGMpLm1vY2tSZXN0b3JlKClcbiAgICpcbiAgICogIGNvbnN0IHJlcyA9IGV4YW1wbGUuY2FsYygxLCAnKycsIDEpXG4gICAqXG4gICAqICBleHBlY3QocmVzKS50b0JlKDIpXG4gICAqIH0pXG4gICAqIEBwYXJhbSBpdGVtIEFueXRoaW5nIHRoYXQgY2FuIGJlIG1vY2tlZFxuICAgKiBAcGFyYW0gZGVlcCBJZiB0aGUgb2JqZWN0IGlzIGRlZXBseSBtb2NrZWRcbiAgICovXG4gIHB1YmxpYyBtb2NrZWQ8VD4oaXRlbTogVCwgZGVlcD86IGZhbHNlKTogTWF5YmVNb2NrZWQ8VD5cbiAgcHVibGljIG1vY2tlZDxUPihpdGVtOiBULCBkZWVwOiB0cnVlKTogTWF5YmVNb2NrZWREZWVwPFQ+XG4gIHB1YmxpYyBtb2NrZWQ8VD4oaXRlbTogVCwgX2RlZXAgPSBmYWxzZSk6IE1heWJlTW9ja2VkPFQ+IHwgTWF5YmVNb2NrZWREZWVwPFQ+IHtcbiAgICByZXR1cm4gaXRlbSBhcyBhbnlcbiAgfVxuXG4gIHB1YmxpYyBpc01vY2tGdW5jdGlvbihmbjogYW55KTogZm4gaXMgRW5oYW5jZWRTcHkge1xuICAgIHJldHVybiBpc01vY2tGdW5jdGlvbihmbilcbiAgfVxuXG4gIHB1YmxpYyBjbGVhckFsbE1vY2tzKCkge1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgY2xlYXJpbmcgbW9kdWxlIG1vY2tzXG4gICAgX192aXRlc3RfX2NsZWFyTW9ja3NfXyh7IGNsZWFyTW9ja3M6IHRydWUgfSlcbiAgICBzcGllcy5mb3JFYWNoKHNweSA9PiBzcHkubW9ja0NsZWFyKCkpXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHB1YmxpYyByZXNldEFsbE1vY2tzKCkge1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcmVzZXR0aW5nIG1vZHVsZSBtb2Nrc1xuICAgIF9fdml0ZXN0X19jbGVhck1vY2tzX18oeyBtb2NrUmVzZXQ6IHRydWUgfSlcbiAgICBzcGllcy5mb3JFYWNoKHNweSA9PiBzcHkubW9ja1Jlc2V0KCkpXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHB1YmxpYyByZXN0b3JlQWxsTW9ja3MoKSB7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciByZXN0b3JpbmcgbW9kdWxlIG1vY2tzXG4gICAgX192aXRlc3RfX2NsZWFyTW9ja3NfXyh7IHJlc3RvcmVNb2NrczogdHJ1ZSB9KVxuICAgIHNwaWVzLmZvckVhY2goc3B5ID0+IHNweS5tb2NrUmVzdG9yZSgpKVxuICAgIHJldHVybiB0aGlzXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHZpdGVzdCA9IG5ldyBWaXRlc3RVdGlscygpXG5leHBvcnQgY29uc3QgdmkgPSB2aXRlc3RcbiJdLCJuYW1lcyI6WyJ0ZXN0IiwiQXN5bW1ldHJpY01hdGNoZXIiLCJfY29sbGVjdGlvbnMiLCJyZXF1aXJlJCQwIiwiZ2xvYmFsIiwiU3ltYm9sIiwiU1BBQ0UiLCJzZXJpYWxpemUiLCJwbHVnaW4iLCJfZGVmYXVsdCIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfYW5zaVN0eWxlcyIsInJlcXVpcmUkJDEiLCJET01Db2xsZWN0aW9uIiwiZXNjYXBlSFRNTF8xIiwiRE9NRWxlbWVudCIsIl9tYXJrdXAiLCJJbW11dGFibGUiLCJJU19LRVlFRF9TRU5USU5FTCIsIklTX09SREVSRURfU0VOVElORUwiLCJJU19TRVRfU0VOVElORUwiLCJyZWFjdElzTW9kdWxlIiwiUmVhY3RFbGVtZW50IiwiZ2V0UHJvcEtleXMiLCJSZWFjdFRlc3RDb21wb25lbnQiLCJyZXF1aXJlJCQyIiwicmVxdWlyZSQkMyIsInJlcXVpcmUkJDQiLCJyZXF1aXJlJCQ1IiwicmVxdWlyZSQkNiIsInJlcXVpcmUkJDciLCJyZXF1aXJlJCQ4IiwicHJldHR5Rm9ybWF0UGx1Z2lucyIsImFzeW1tZXRyaWNFcXVhbHMiLCJ0aGlzIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUEsSUFBSSxTQUFTLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQztBQUN0QyxJQUFJLFVBQVUsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUM7QUFDekMsSUFBSSxpQkFBaUIsR0FBRyxNQUFNLENBQUMseUJBQXlCLENBQUM7QUFDekQsSUFBSSxtQkFBbUIsR0FBRyxNQUFNLENBQUMscUJBQXFCLENBQUM7QUFDdkQsSUFBSSxZQUFZLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUM7QUFDbkQsSUFBSSxZQUFZLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxvQkFBb0IsQ0FBQztBQUN6RCxJQUFJLGVBQWUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsS0FBSyxLQUFLLEdBQUcsSUFBSSxHQUFHLEdBQUcsU0FBUyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUM7QUFDaEssSUFBSSxjQUFjLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLO0FBQy9CLEVBQUUsS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNoQyxJQUFJLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDO0FBQ2xDLE1BQU0sZUFBZSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDeEMsRUFBRSxJQUFJLG1CQUFtQjtBQUN6QixJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksbUJBQW1CLENBQUMsQ0FBQyxDQUFDLEVB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cUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMscUJBQXFCLEVBQUMsQ0FBQztBQUNsYyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsR0FBRyxPQUFPLENBQUMsRUFBRSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FB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