@regle/core 0.1.4 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs ADDED
@@ -0,0 +1,1662 @@
1
+ 'use strict';
2
+
3
+ var vue = require('vue');
4
+
5
+ // src/core/createRule/unwrapRuleParameters.ts
6
+ function unwrapRuleParameters(params) {
7
+ return params.map((param) => {
8
+ if (param instanceof Function) {
9
+ return param();
10
+ }
11
+ return vue.unref(param);
12
+ });
13
+ }
14
+ function createReactiveParams(params) {
15
+ return params.map((param) => {
16
+ if (param instanceof Function) {
17
+ return param;
18
+ } else if (vue.isRef(param)) {
19
+ return param;
20
+ }
21
+ return vue.toRef(() => param);
22
+ });
23
+ }
24
+ function getFunctionParametersLength(func) {
25
+ const funcStr = func.toString();
26
+ const isArrowFunction = funcStr.includes("=>");
27
+ const params = (isArrowFunction ? funcStr.split("=>")[0] : funcStr).slice(funcStr.indexOf("(") + 1, funcStr.indexOf(")")).split(",").map((param) => param.trim());
28
+ const defaults = params.filter((param) => param.includes("="));
29
+ return defaults.length + func.length;
30
+ }
31
+
32
+ // src/core/createRule/defineRuleProcessors.ts
33
+ function defineRuleProcessors(definition, ...params) {
34
+ const { message, validator, active, ...properties } = definition;
35
+ const isAsync = validator.constructor.name === "AsyncFunction";
36
+ const defaultProcessors = {
37
+ validator(value, ...args) {
38
+ return definition.validator(value, ...unwrapRuleParameters(args.length ? args : params));
39
+ },
40
+ message(value, metadata) {
41
+ if (typeof definition.message === "function") {
42
+ return definition.message(value, {
43
+ ...metadata,
44
+ $params: unwrapRuleParameters(metadata.$params?.length ? metadata.$params : params)
45
+ });
46
+ } else {
47
+ return definition.message;
48
+ }
49
+ },
50
+ active(value, metadata) {
51
+ if (typeof definition.active === "function") {
52
+ return definition.active(value, {
53
+ ...metadata,
54
+ $params: unwrapRuleParameters(metadata.$params?.length ? metadata.$params : params)
55
+ });
56
+ } else {
57
+ return definition.active ?? true;
58
+ }
59
+ },
60
+ exec(value) {
61
+ const validator2 = definition.validator(value, ...unwrapRuleParameters(params));
62
+ let rawResult;
63
+ if (validator2 instanceof Promise) {
64
+ return validator2.then((result) => {
65
+ rawResult = result;
66
+ if (typeof rawResult === "object" && "$valid" in rawResult) {
67
+ return rawResult.$valid;
68
+ } else if (typeof rawResult === "boolean") {
69
+ return rawResult;
70
+ }
71
+ return false;
72
+ });
73
+ } else {
74
+ rawResult = validator2;
75
+ }
76
+ if (typeof rawResult === "object" && "$valid" in rawResult) {
77
+ return rawResult.$valid;
78
+ } else if (typeof rawResult === "boolean") {
79
+ return rawResult;
80
+ }
81
+ return false;
82
+ }
83
+ };
84
+ const processors = {
85
+ ...defaultProcessors,
86
+ ...properties,
87
+ ...{
88
+ _validator: definition.validator,
89
+ _message: definition.message,
90
+ _active: definition.active,
91
+ _type: definition.type,
92
+ _patched: false,
93
+ _async: isAsync,
94
+ _params: createReactiveParams(params)
95
+ }
96
+ };
97
+ return processors;
98
+ }
99
+
100
+ // src/core/createRule/createRule.ts
101
+ function createRule(definition) {
102
+ if (typeof definition.validator === "function") {
103
+ let fakeParams = [];
104
+ const staticProcessors = defineRuleProcessors(definition, ...fakeParams);
105
+ const isAsync = definition.validator.constructor.name === "AsyncFunction";
106
+ if (getFunctionParametersLength(definition.validator) > 1) {
107
+ const ruleFactory = function(...params) {
108
+ return defineRuleProcessors(definition, ...params);
109
+ };
110
+ ruleFactory.validator = staticProcessors.validator;
111
+ ruleFactory.message = staticProcessors.message;
112
+ ruleFactory.active = staticProcessors.active;
113
+ ruleFactory.type = staticProcessors.type;
114
+ ruleFactory.exec = staticProcessors.exec;
115
+ ruleFactory._validator = staticProcessors.validator;
116
+ ruleFactory._message = staticProcessors.message;
117
+ ruleFactory._active = staticProcessors.active;
118
+ ruleFactory._type = definition.type;
119
+ ruleFactory._patched = false;
120
+ ruleFactory._async = isAsync;
121
+ return ruleFactory;
122
+ } else {
123
+ return staticProcessors;
124
+ }
125
+ }
126
+ throw new Error("Validator must be a function");
127
+ }
128
+
129
+ // src/utils/object.utils.ts
130
+ function isObject(obj) {
131
+ return typeof obj === "object" && obj !== null && !Array.isArray(obj);
132
+ }
133
+ function isRefObject(obj) {
134
+ return isObject(obj.value);
135
+ }
136
+ function cloneDeep(obj) {
137
+ let result = obj;
138
+ let type = {}.toString.call(obj).slice(8, -1);
139
+ if (type == "Set") {
140
+ result = new Set([...obj].map((value) => cloneDeep(value)));
141
+ }
142
+ if (type == "Map") {
143
+ result = new Map([...obj].map((kv) => [cloneDeep(kv[0]), cloneDeep(kv[1])]));
144
+ }
145
+ if (type == "Date") {
146
+ result = new Date(obj.getTime());
147
+ }
148
+ if (type == "RegExp") {
149
+ result = RegExp(obj.source, getRegExpFlags(obj));
150
+ }
151
+ if (type == "Array" || type == "Object") {
152
+ result = Array.isArray(obj) ? [] : {};
153
+ for (let key in obj) {
154
+ result[key] = cloneDeep(obj[key]);
155
+ }
156
+ }
157
+ return result;
158
+ }
159
+ function getRegExpFlags(regExp) {
160
+ if (typeof regExp.source.flags == "string") {
161
+ return regExp.source.flags;
162
+ } else {
163
+ let flags = [];
164
+ regExp.global && flags.push("g");
165
+ regExp.ignoreCase && flags.push("i");
166
+ regExp.multiline && flags.push("m");
167
+ regExp.sticky && flags.push("y");
168
+ regExp.unicode && flags.push("u");
169
+ return flags.join("");
170
+ }
171
+ }
172
+ function unwrapGetter(getter, value, index) {
173
+ if (getter instanceof Function) {
174
+ return getter(value, index ?? 0);
175
+ }
176
+ return getter;
177
+ }
178
+
179
+ // src/utils/isEmpty.ts
180
+ function isEmpty(value) {
181
+ if (value === void 0 || value === null) {
182
+ return true;
183
+ }
184
+ if (value === false) {
185
+ return false;
186
+ }
187
+ if (value instanceof Date) {
188
+ return isNaN(value.getTime());
189
+ }
190
+ if (Array.isArray(value)) {
191
+ return value.length === 0;
192
+ }
193
+ if (typeof value === "object" && value != null) {
194
+ return Object.keys(value).length === 0;
195
+ }
196
+ if (typeof value === "string") {
197
+ return !String(value.trim()).length;
198
+ }
199
+ return false;
200
+ }
201
+
202
+ // src/utils/debounce.ts
203
+ function debounce(func, wait, immediate) {
204
+ let timeout;
205
+ const debouncedFn = (...args) => new Promise((resolve) => {
206
+ clearTimeout(timeout);
207
+ timeout = setTimeout(() => {
208
+ timeout = void 0;
209
+ {
210
+ Promise.resolve(func.apply(this, [...args])).then(resolve);
211
+ }
212
+ }, wait);
213
+ });
214
+ debouncedFn.cancel = () => {
215
+ clearTimeout(timeout);
216
+ timeout = void 0;
217
+ };
218
+ debouncedFn.doImmediately = (...args) => new Promise((resolve) => {
219
+ clearTimeout(timeout);
220
+ timeout = setTimeout(() => {
221
+ timeout = void 0;
222
+ Promise.resolve(func.apply(this, [...args])).then(resolve);
223
+ }, 0);
224
+ });
225
+ return debouncedFn;
226
+ }
227
+ function versionCompare(current, other) {
228
+ const cp = String(current).split(".");
229
+ const op = String(other).split(".");
230
+ for (let depth = 0; depth < Math.min(cp.length, op.length); depth++) {
231
+ const cn = Number(cp[depth]);
232
+ const on = Number(op[depth]);
233
+ if (cn > on) return 1 /* GreaterThan */;
234
+ if (on > cn) return -1 /* LessThan */;
235
+ if (!isNaN(cn) && isNaN(on)) return 1 /* GreaterThan */;
236
+ if (isNaN(cn) && !isNaN(on)) return -1 /* LessThan */;
237
+ }
238
+ return 0 /* EqualTo */;
239
+ }
240
+ var isVueSuperiorOrEqualTo3dotFive = versionCompare(vue.version, "3.5.0") === -1 ? false : true;
241
+
242
+ // src/utils/randomId.ts
243
+ function uniqueIDNuxt() {
244
+ return Math.floor(Math.random() * Date.now()).toString();
245
+ }
246
+ function randomId() {
247
+ if (typeof window === "undefined") {
248
+ return uniqueIDNuxt();
249
+ } else {
250
+ const uint32 = window.crypto.getRandomValues(new Uint32Array(1))[0];
251
+ return uint32.toString(10);
252
+ }
253
+ }
254
+ function useStorage() {
255
+ const ruleDeclStorage = vue.shallowRef(/* @__PURE__ */ new Map());
256
+ const fieldsStorage = vue.shallowRef(
257
+ /* @__PURE__ */ new Map()
258
+ );
259
+ const collectionsStorage = vue.shallowRef(/* @__PURE__ */ new Map());
260
+ const dirtyStorage = vue.shallowRef(/* @__PURE__ */ new Map());
261
+ const ruleStatusStorage = vue.shallowRef(/* @__PURE__ */ new Map());
262
+ const arrayStatusStorage = vue.shallowRef(/* @__PURE__ */ new Map());
263
+ function getFieldsEntry($path) {
264
+ const existingFields = fieldsStorage.value.get($path);
265
+ if (existingFields) {
266
+ return existingFields;
267
+ } else {
268
+ const $fields = vue.ref({});
269
+ fieldsStorage.value.set($path, $fields);
270
+ return $fields;
271
+ }
272
+ }
273
+ function getCollectionsEntry($path) {
274
+ const existingEach = collectionsStorage.value.get($path);
275
+ if (existingEach) {
276
+ return existingEach;
277
+ } else {
278
+ const $each = vue.ref([]);
279
+ collectionsStorage.value.set($path, $each);
280
+ return $each;
281
+ }
282
+ }
283
+ function addArrayStatus($arrayId, itemId, value) {
284
+ arrayStatusStorage.value.set(`${$arrayId}-${itemId}`, value);
285
+ }
286
+ function getArrayStatus($arrayId, itemId) {
287
+ return arrayStatusStorage.value.get(`${$arrayId}-${itemId}`);
288
+ }
289
+ function deleteArrayStatus($arrayId, itemId) {
290
+ if ($arrayId && itemId != null) {
291
+ arrayStatusStorage.value.delete(`${$arrayId}-${itemId}`);
292
+ }
293
+ }
294
+ function setDirtyEntry($path, dirty) {
295
+ dirtyStorage.value.set($path, dirty);
296
+ }
297
+ function getDirtyState(path) {
298
+ return dirtyStorage.value.get(path) ?? false;
299
+ }
300
+ function addRuleDeclEntry($path, options) {
301
+ ruleDeclStorage.value.set($path, options);
302
+ }
303
+ function checkRuleDeclEntry($path, newRules) {
304
+ const storedRulesDefs = ruleDeclStorage.value.get($path);
305
+ if (!storedRulesDefs) return void 0;
306
+ const storedRules = storedRulesDefs;
307
+ const isValidCache = areRulesChanged(newRules, storedRules);
308
+ if (!isValidCache) return { valid: false };
309
+ return { valid: true };
310
+ }
311
+ function areRulesChanged(newRules, storedRules) {
312
+ const storedRulesKeys = Object.keys(storedRules);
313
+ const newRulesKeys = Object.keys(newRules);
314
+ if (newRulesKeys.length !== storedRulesKeys.length) return false;
315
+ const hasAllValidators = newRulesKeys.every((ruleKey) => storedRulesKeys.includes(ruleKey));
316
+ if (!hasAllValidators) return false;
317
+ return newRulesKeys.every((ruleKey) => {
318
+ const newRuleElement = newRules[ruleKey];
319
+ const storedRuleElement = storedRules[ruleKey];
320
+ if (!storedRuleElement || !newRuleElement || typeof newRuleElement === "function" || typeof storedRuleElement === "function")
321
+ return false;
322
+ if (typeof newRuleElement === "number") {
323
+ return false;
324
+ } else if (typeof newRuleElement === "boolean") {
325
+ return false;
326
+ } else if (!newRuleElement._params) return true;
327
+ else {
328
+ return newRuleElement._params?.every((paramKey, index) => {
329
+ if (typeof storedRuleElement === "number" || typeof storedRuleElement === "boolean") {
330
+ return true;
331
+ } else {
332
+ const storedParams = unwrapRuleParameters(storedRuleElement._params);
333
+ const newParams = unwrapRuleParameters(newRuleElement._params);
334
+ return storedParams?.[index] === newParams?.[index];
335
+ }
336
+ });
337
+ }
338
+ });
339
+ }
340
+ function trySetRuleStatusRef(path) {
341
+ const ruleStatus = ruleStatusStorage.value.get(path);
342
+ if (ruleStatus) {
343
+ return ruleStatus;
344
+ } else {
345
+ const $pending = vue.ref(false);
346
+ const $valid = vue.ref(true);
347
+ const $metadata = vue.ref({});
348
+ const $validating = vue.ref(false);
349
+ ruleStatusStorage.value.set(path, { $pending, $valid, $metadata, $validating });
350
+ return { $pending, $valid, $metadata, $validating };
351
+ }
352
+ }
353
+ vue.onScopeDispose(() => {
354
+ ruleDeclStorage.value.clear();
355
+ fieldsStorage.value.clear();
356
+ collectionsStorage.value.clear();
357
+ dirtyStorage.value.clear();
358
+ ruleStatusStorage.value.clear();
359
+ arrayStatusStorage.value.clear();
360
+ });
361
+ return {
362
+ addRuleDeclEntry,
363
+ setDirtyEntry,
364
+ checkRuleDeclEntry,
365
+ getDirtyState,
366
+ trySetRuleStatusRef,
367
+ getFieldsEntry,
368
+ getCollectionsEntry,
369
+ getArrayStatus,
370
+ addArrayStatus,
371
+ deleteArrayStatus,
372
+ arrayStatusStorage
373
+ };
374
+ }
375
+
376
+ // src/core/useRegle/guards/ruleDef.guards.ts
377
+ function isNestedRulesDef(state, rules) {
378
+ return isObject(state.value) && isObject(rules.value) && !Object.entries(rules.value).some((rule) => isRuleDef(rule));
379
+ }
380
+ function isCollectionRulesDef(rules) {
381
+ return !!rules.value && "$each" in rules.value;
382
+ }
383
+ function isValidatorRulesDef(rules) {
384
+ return !!rules.value && isObject(rules.value);
385
+ }
386
+ function isRuleDef(rule) {
387
+ return isObject(rule) && "_validator" in rule;
388
+ }
389
+ function isFormRuleDefinition(rule) {
390
+ return !(typeof rule.value === "function");
391
+ }
392
+
393
+ // src/core/useRegle/guards/rule.status.guards.ts
394
+ function isNestedRulesStatus(rule) {
395
+ return isObject(rule) && "$fields" in rule;
396
+ }
397
+ function isCollectionRulesStatus(rule) {
398
+ return !!rule && "$each" in rule;
399
+ }
400
+ function isFieldStatus(rule) {
401
+ return !!rule && "$rules" in rule;
402
+ }
403
+
404
+ // src/core/useRegle/guards/rule.errors.guards.ts
405
+ function isExternalErrorCollection(value) {
406
+ return "$each" in value || "$errors" in value;
407
+ }
408
+
409
+ // src/core/useRegle/useErrors.ts
410
+ function extractRulesErrors({
411
+ field,
412
+ silent = false
413
+ }) {
414
+ return Object.entries(field.$rules ?? {}).map(([ruleKey, rule]) => {
415
+ if (silent) {
416
+ return rule.$message;
417
+ } else if (!rule.$valid && field.$dirty) {
418
+ return rule.$message;
419
+ }
420
+ return null;
421
+ }).filter((msg) => !!msg).reduce((acc, value) => {
422
+ if (typeof value === "string") {
423
+ return acc?.concat([value]);
424
+ } else {
425
+ return acc?.concat(value);
426
+ }
427
+ }, []).concat(field.$externalErrors ?? []);
428
+ }
429
+ function processFieldErrors(fieldStatus, silent = false) {
430
+ if (isNestedRulesStatus(fieldStatus)) {
431
+ return extractNestedErrors(fieldStatus.$fields);
432
+ } else if (isCollectionRulesStatus(fieldStatus)) {
433
+ return {
434
+ $errors: fieldStatus.$field.$rules ? extractRulesErrors({ field: fieldStatus.$field, silent }) : [],
435
+ $each: fieldStatus.$each.map((field) => processFieldErrors(field, silent))
436
+ };
437
+ } else if (isFieldStatus(fieldStatus)) {
438
+ if (fieldStatus.$error) {
439
+ return extractRulesErrors({
440
+ field: fieldStatus,
441
+ silent
442
+ });
443
+ } else {
444
+ return fieldStatus.$externalErrors ?? [];
445
+ }
446
+ }
447
+ return [];
448
+ }
449
+ function extractCollectionError(each, silent = false) {
450
+ return each.map((field) => processFieldErrors(field, silent));
451
+ }
452
+ function extractNestedErrors(fields, silent = false) {
453
+ return Object.fromEntries(
454
+ Object.entries(fields).map(([fieldKey, fieldStatus]) => {
455
+ if (isNestedRulesStatus(fieldStatus)) {
456
+ return [fieldKey, extractNestedErrors(fieldStatus.$fields, silent)];
457
+ } else if (isCollectionRulesStatus(fieldStatus)) {
458
+ return [
459
+ fieldKey,
460
+ {
461
+ $errors: extractRulesErrors({ field: fieldStatus.$field, silent }),
462
+ $each: extractCollectionError(fieldStatus.$each, silent)
463
+ }
464
+ ];
465
+ } else if (isFieldStatus(fieldStatus)) {
466
+ if (fieldStatus.$error) {
467
+ return [
468
+ fieldKey,
469
+ extractRulesErrors({
470
+ field: fieldStatus,
471
+ silent
472
+ })
473
+ ];
474
+ } else {
475
+ return [fieldKey, fieldStatus.$externalErrors ?? []];
476
+ }
477
+ }
478
+ return [fieldKey, []];
479
+ })
480
+ );
481
+ }
482
+ function useErrors($regle) {
483
+ const errors = vue.computed(() => {
484
+ return extractNestedErrors($regle.$fields);
485
+ });
486
+ return errors;
487
+ }
488
+
489
+ // src/types/rules/rule.internal.types.ts
490
+ var InternalRuleType = /* @__PURE__ */ ((InternalRuleType3) => {
491
+ InternalRuleType3["Inline"] = "__inline";
492
+ InternalRuleType3["Async"] = "__async";
493
+ return InternalRuleType3;
494
+ })(InternalRuleType || {});
495
+ function mergeBooleanGroupProperties(entries, property) {
496
+ return vue.computed(() => {
497
+ return entries.value.some((entry) => {
498
+ return entry[property];
499
+ });
500
+ });
501
+ }
502
+ function mergeArrayGroupProperties(entries, property) {
503
+ return vue.computed(() => {
504
+ return entries.value.reduce((all, entry) => {
505
+ const fetchedProperty = entry[property] || [];
506
+ return all.concat(fetchedProperty);
507
+ }, []);
508
+ });
509
+ }
510
+ function createReactiveRuleStatus({
511
+ $dirty,
512
+ customMessages,
513
+ rule,
514
+ ruleKey,
515
+ state,
516
+ path,
517
+ storage,
518
+ $debounce
519
+ }) {
520
+ let scope = vue.effectScope();
521
+ let scopeState;
522
+ let $unwatchState;
523
+ const { $pending, $valid, $metadata, $validating } = storage.trySetRuleStatusRef(
524
+ `${path}.${ruleKey}`
525
+ );
526
+ function $watch() {
527
+ scopeState = scope.run(() => {
528
+ const $defaultMetadata = vue.computed(() => ({
529
+ $invalid: !$valid.value,
530
+ $params: $params.value,
531
+ ...$metadata.value
532
+ }));
533
+ const $active = vue.computed(() => {
534
+ if (isFormRuleDefinition(rule)) {
535
+ if (typeof rule.value.active === "function") {
536
+ return rule.value.active(state.value, $defaultMetadata.value);
537
+ } else {
538
+ return rule.value.active;
539
+ }
540
+ } else {
541
+ return true;
542
+ }
543
+ });
544
+ const $message = vue.computed(() => {
545
+ let message = "";
546
+ const customMessageRule = customMessages ? customMessages[ruleKey]?.message : void 0;
547
+ if (customMessageRule) {
548
+ if (typeof customMessageRule === "function") {
549
+ message = customMessageRule(state.value, $defaultMetadata.value);
550
+ } else {
551
+ message = customMessageRule;
552
+ }
553
+ }
554
+ if (isFormRuleDefinition(rule)) {
555
+ if (!(customMessageRule && !rule.value._patched)) {
556
+ if (typeof rule.value.message === "function") {
557
+ message = rule.value.message(state.value, $defaultMetadata.value);
558
+ } else {
559
+ message = rule.value.message;
560
+ }
561
+ }
562
+ }
563
+ if (isEmpty(message)) {
564
+ message = "Error";
565
+ console.warn(`No error message defined for ${path}.${ruleKey}`);
566
+ }
567
+ return message;
568
+ });
569
+ const $type = vue.computed(() => {
570
+ if (isFormRuleDefinition(rule) && rule.value.type) {
571
+ return rule.value.type;
572
+ } else {
573
+ return ruleKey;
574
+ }
575
+ });
576
+ const $validator = vue.computed(() => {
577
+ if (isFormRuleDefinition(rule)) {
578
+ return rule.value.validator;
579
+ } else {
580
+ return rule.value;
581
+ }
582
+ });
583
+ const $params = vue.computed(() => {
584
+ if (typeof rule.value === "function") {
585
+ return [];
586
+ }
587
+ return unwrapRuleParameters(rule.value._params ?? []);
588
+ });
589
+ const $path = vue.computed(() => `${path}.${$type.value}`);
590
+ return {
591
+ $active,
592
+ $message,
593
+ $type,
594
+ $validator,
595
+ $params,
596
+ $path
597
+ };
598
+ });
599
+ $unwatchState = vue.watch(scopeState.$params, $validate, {
600
+ deep: true
601
+ });
602
+ }
603
+ $watch();
604
+ async function computeAsyncResult(promise) {
605
+ let ruleResult = false;
606
+ try {
607
+ $valid.value = true;
608
+ if ($dirty.value) {
609
+ $pending.value = true;
610
+ }
611
+ const promiseResult = await promise;
612
+ if (typeof promiseResult === "boolean") {
613
+ ruleResult = promiseResult;
614
+ } else {
615
+ const { $valid: $valid2, ...rest } = promiseResult;
616
+ ruleResult = $valid2;
617
+ $metadata.value = rest;
618
+ }
619
+ } catch (e) {
620
+ ruleResult = false;
621
+ } finally {
622
+ $pending.value = false;
623
+ }
624
+ return ruleResult;
625
+ }
626
+ const $computeAsyncDebounce = debounce(computeAsyncResult, $debounce ?? 100);
627
+ async function $validate() {
628
+ $validating.value = true;
629
+ const validator = scopeState.$validator.value;
630
+ let ruleResult = false;
631
+ const resultOrPromise = validator(state.value, ...scopeState.$params.value);
632
+ if (resultOrPromise instanceof Promise) {
633
+ const promiseDebounce = $computeAsyncDebounce(resultOrPromise);
634
+ ruleResult = await promiseDebounce;
635
+ } else {
636
+ if (resultOrPromise != null) {
637
+ if (typeof resultOrPromise === "boolean") {
638
+ ruleResult = resultOrPromise;
639
+ } else {
640
+ const { $valid: $valid2, ...rest } = resultOrPromise;
641
+ ruleResult = $valid2;
642
+ $metadata.value = rest;
643
+ }
644
+ }
645
+ }
646
+ $valid.value = ruleResult;
647
+ $validating.value = false;
648
+ return ruleResult;
649
+ }
650
+ function $reset() {
651
+ $valid.value = true;
652
+ $metadata.value = {};
653
+ $pending.value = false;
654
+ $validating.value = false;
655
+ $watch();
656
+ }
657
+ function $unwatch() {
658
+ $unwatchState();
659
+ scope.stop();
660
+ scope = vue.effectScope();
661
+ }
662
+ return vue.reactive({
663
+ ...scopeState,
664
+ $pending,
665
+ $valid,
666
+ $metadata,
667
+ $validate,
668
+ $unwatch,
669
+ $watch,
670
+ $reset
671
+ });
672
+ }
673
+
674
+ // src/core/useRegle/useStateProperties/createReactiveFieldStatus.ts
675
+ function createReactiveFieldStatus({
676
+ state,
677
+ rulesDef,
678
+ customMessages,
679
+ path,
680
+ storage,
681
+ options,
682
+ externalErrors,
683
+ index,
684
+ onUnwatch
685
+ }) {
686
+ let scope = vue.effectScope();
687
+ let scopeState;
688
+ const $dirty = vue.ref(false);
689
+ const triggerPunishment = vue.ref(false);
690
+ const $externalErrors = vue.ref([]);
691
+ let $unwatchState;
692
+ let $unwatchValid;
693
+ let $unwatchExternalErrors;
694
+ let $unwatchDirty;
695
+ let $commit = () => {
696
+ };
697
+ function collectExternalErrors() {
698
+ $externalErrors.value = externalErrors.value ?? [];
699
+ }
700
+ collectExternalErrors();
701
+ function createReactiveRulesResult() {
702
+ const declaredRules = rulesDef.value;
703
+ const storeResult = storage.checkRuleDeclEntry(path, declaredRules);
704
+ $localOptions.value = Object.fromEntries(
705
+ Object.entries(declaredRules).filter(([ruleKey]) => ruleKey.startsWith("$"))
706
+ );
707
+ $rules.value = Object.fromEntries(
708
+ Object.entries(rulesDef.value).filter(([ruleKey]) => !ruleKey.startsWith("$")).map(([ruleKey, rule]) => {
709
+ if (rule) {
710
+ const ruleRef = vue.toRef(() => rule);
711
+ return [
712
+ ruleKey,
713
+ createReactiveRuleStatus({
714
+ $dirty,
715
+ customMessages,
716
+ rule: ruleRef,
717
+ ruleKey,
718
+ state,
719
+ path,
720
+ storage,
721
+ $debounce: $localOptions.value.$debounce
722
+ })
723
+ ];
724
+ }
725
+ return [];
726
+ }).filter((ruleDef) => !!ruleDef.length)
727
+ );
728
+ $watch();
729
+ $commit = scopeState.$debounce.value ? debounce($commitHandler, scopeState.$debounce.value ?? 0) : $commitHandler;
730
+ if (storeResult?.valid != null) {
731
+ $dirty.value = storage.getDirtyState(path);
732
+ if ($dirty.value) {
733
+ $commit();
734
+ }
735
+ }
736
+ storage.addRuleDeclEntry(path, declaredRules);
737
+ }
738
+ function $unwatch() {
739
+ if ($rules.value) {
740
+ Object.entries($rules.value).forEach(([_, rule]) => {
741
+ rule.$unwatch();
742
+ });
743
+ }
744
+ $unwatchDirty();
745
+ if ($dirty.value) {
746
+ storage.setDirtyEntry(path, $dirty.value);
747
+ }
748
+ $unwatchState();
749
+ $unwatchValid();
750
+ $unwatchExternalErrors();
751
+ scope.stop();
752
+ scope = vue.effectScope();
753
+ onUnwatch?.();
754
+ }
755
+ function $watch() {
756
+ if ($rules.value) {
757
+ Object.entries($rules.value).forEach(([_, rule]) => {
758
+ rule.$watch();
759
+ });
760
+ }
761
+ scopeState = scope.run(() => {
762
+ const $anyDirty = vue.computed(() => $dirty.value);
763
+ const $debounce = vue.computed(() => {
764
+ return $localOptions.value.$debounce;
765
+ });
766
+ const $lazy = vue.computed(() => {
767
+ if ($localOptions.value.$lazy != null) {
768
+ return $localOptions.value.$lazy;
769
+ }
770
+ return vue.unref(options.lazy);
771
+ });
772
+ const $rewardEarly = vue.computed(() => {
773
+ if ($localOptions.value.$rewardEarly != null) {
774
+ return $localOptions.value.$rewardEarly;
775
+ }
776
+ return vue.unref(options.rewardEarly);
777
+ });
778
+ const $autoDirty = vue.computed(() => {
779
+ if ($localOptions.value.$autoDirty != null) {
780
+ return $localOptions.value.$autoDirty;
781
+ }
782
+ return vue.unref(options.autoDirty);
783
+ });
784
+ const $error = vue.computed(() => {
785
+ return $invalid.value && !$pending.value && $dirty.value;
786
+ });
787
+ const $errors = vue.computed(() => {
788
+ return extractRulesErrors({
789
+ field: {
790
+ $dirty: $dirty.value,
791
+ $externalErrors: $externalErrors.value,
792
+ $rules: $rules.value
793
+ }
794
+ });
795
+ });
796
+ const $silentErrors = vue.computed(() => {
797
+ return extractRulesErrors({
798
+ field: {
799
+ $dirty: $dirty.value,
800
+ $externalErrors: $externalErrors.value,
801
+ $rules: $rules.value
802
+ },
803
+ silent: true
804
+ });
805
+ });
806
+ const $pending = vue.computed(() => {
807
+ if (triggerPunishment.value || !$rewardEarly.value) {
808
+ return Object.entries($rules.value).some(([key, ruleResult]) => {
809
+ return ruleResult.$pending;
810
+ });
811
+ }
812
+ return false;
813
+ });
814
+ const $invalid = vue.computed(() => {
815
+ if ($externalErrors.value?.length) {
816
+ return true;
817
+ } else if (!$rewardEarly.value || $rewardEarly.value && triggerPunishment.value) {
818
+ return Object.entries($rules.value).some(([key, ruleResult]) => {
819
+ return !ruleResult.$valid;
820
+ });
821
+ }
822
+ return false;
823
+ });
824
+ const $valid = vue.computed(() => {
825
+ if ($dirty.value && !isEmpty(state.value)) {
826
+ if ($externalErrors.value?.length) {
827
+ return false;
828
+ } else if ($rewardEarly.value) {
829
+ return Object.entries($rules.value).every(([key, ruleResult]) => {
830
+ return ruleResult.$valid;
831
+ });
832
+ } else {
833
+ return !$invalid.value;
834
+ }
835
+ }
836
+ return false;
837
+ });
838
+ vue.watch($valid, (value) => {
839
+ if (value) {
840
+ triggerPunishment.value = false;
841
+ }
842
+ });
843
+ return {
844
+ $error,
845
+ $pending,
846
+ $invalid,
847
+ $valid,
848
+ $debounce,
849
+ $lazy,
850
+ $errors,
851
+ $silentErrors,
852
+ $rewardEarly,
853
+ $autoDirty,
854
+ $anyDirty
855
+ };
856
+ });
857
+ $unwatchExternalErrors = vue.watch(externalErrors, collectExternalErrors);
858
+ $unwatchState = vue.watch(
859
+ state,
860
+ () => {
861
+ if (scopeState.$autoDirty.value) {
862
+ if (!$dirty.value) {
863
+ $dirty.value = true;
864
+ }
865
+ }
866
+ if (rulesDef.value instanceof Function) {
867
+ createReactiveRulesResult();
868
+ }
869
+ $commit();
870
+ if (!scopeState.$rewardEarly.value !== false) ;
871
+ },
872
+ { deep: isVueSuperiorOrEqualTo3dotFive ? 1 : true }
873
+ );
874
+ $unwatchDirty = vue.watch($dirty, () => {
875
+ storage.setDirtyEntry(path, $dirty.value);
876
+ });
877
+ $unwatchValid = vue.watch(scopeState.$valid, (valid) => {
878
+ if (scopeState.$rewardEarly.value && valid) {
879
+ triggerPunishment.value = false;
880
+ }
881
+ });
882
+ }
883
+ function $commitHandler() {
884
+ Object.entries($rules.value).forEach(([key, rule]) => {
885
+ rule.$validate();
886
+ });
887
+ }
888
+ const $rules = vue.ref();
889
+ const $localOptions = vue.ref();
890
+ createReactiveRulesResult();
891
+ function $reset() {
892
+ $dirty.value = false;
893
+ $externalErrors.value = [];
894
+ Object.entries($rules.value).forEach(([key, rule]) => {
895
+ rule.$reset();
896
+ });
897
+ if (!scopeState.$lazy.value) {
898
+ Object.entries($rules.value).map(([key, rule]) => {
899
+ return rule.$validate();
900
+ });
901
+ }
902
+ }
903
+ function $touch() {
904
+ if (!$dirty.value) {
905
+ $dirty.value = true;
906
+ if (!scopeState.$rewardEarly.value !== false) ;
907
+ $commit();
908
+ }
909
+ }
910
+ const $validate = scopeState.$debounce.value ? debounce($validateHandler, scopeState.$debounce.value ?? 0) : $validateHandler;
911
+ async function $validateHandler() {
912
+ try {
913
+ triggerPunishment.value = true;
914
+ if (scopeState.$autoDirty.value && $dirty.value && !scopeState.$pending.value) {
915
+ return !scopeState.$error.value;
916
+ } else {
917
+ const promises = Object.entries($rules.value).map(([key, rule]) => {
918
+ return rule.$validate();
919
+ });
920
+ const results = await Promise.allSettled(promises);
921
+ return results.every((value) => {
922
+ if (value.status === "fulfilled") {
923
+ return value.value;
924
+ } else {
925
+ return false;
926
+ }
927
+ });
928
+ }
929
+ } catch (e) {
930
+ return false;
931
+ }
932
+ }
933
+ function $clearExternalErrors() {
934
+ $externalErrors.value = [];
935
+ }
936
+ if (!scopeState.$lazy.value) {
937
+ $validateHandler();
938
+ }
939
+ return vue.reactive({
940
+ $dirty,
941
+ ...scopeState,
942
+ $externalErrors,
943
+ $value: state,
944
+ $rules,
945
+ $reset,
946
+ $touch,
947
+ $validate,
948
+ $unwatch,
949
+ $watch,
950
+ $clearExternalErrors
951
+ });
952
+ }
953
+
954
+ // src/core/useRegle/useStateProperties/createReactiveCollectionStatus.ts
955
+ function createCollectionElement({
956
+ $id,
957
+ path,
958
+ index,
959
+ options,
960
+ storage,
961
+ stateValue,
962
+ customMessages,
963
+ rules,
964
+ externalErrors
965
+ }) {
966
+ const $fieldId = rules.$key ? rules.$key : randomId();
967
+ let $path = `${path}.${String($fieldId)}`;
968
+ if (typeof stateValue.value === "object" && stateValue.value != null) {
969
+ if (!stateValue.value.$id) {
970
+ Object.defineProperties(stateValue.value, {
971
+ $id: {
972
+ value: $fieldId,
973
+ enumerable: false,
974
+ configurable: false,
975
+ writable: false
976
+ }
977
+ });
978
+ } else {
979
+ $path = `${path}.${stateValue.value.$id}`;
980
+ }
981
+ }
982
+ const $externalErrors = vue.toRef(() => externalErrors.value?.[index]);
983
+ const $status = createReactiveChildrenStatus({
984
+ state: stateValue,
985
+ rulesDef: vue.toRef(() => rules),
986
+ customMessages,
987
+ path: $path,
988
+ storage,
989
+ options,
990
+ externalErrors: $externalErrors
991
+ });
992
+ if ($status) {
993
+ const valueId = stateValue.value?.$id;
994
+ $status.$id = valueId ?? String($fieldId);
995
+ storage.addArrayStatus($id, $status.$id, $status);
996
+ }
997
+ return $status;
998
+ }
999
+ function createReactiveCollectionStatus({
1000
+ state,
1001
+ rulesDef,
1002
+ customMessages,
1003
+ path,
1004
+ storage,
1005
+ options,
1006
+ externalErrors
1007
+ }) {
1008
+ let scope = vue.effectScope();
1009
+ let scopeState;
1010
+ let immediateScope = vue.effectScope();
1011
+ let immediateScopeState;
1012
+ if (Array.isArray(state.value) && !rulesDef.value.$each) {
1013
+ return null;
1014
+ }
1015
+ const $id = vue.ref();
1016
+ const $value = vue.ref(state.value);
1017
+ let $unwatchState = null;
1018
+ const $fieldStatus = vue.ref({});
1019
+ const $eachStatus = storage.getCollectionsEntry(path);
1020
+ immediateScopeState = immediateScope.run(() => {
1021
+ const isPrimitiveArray = vue.computed(() => {
1022
+ if (Array.isArray(state.value) && state.value.length) {
1023
+ return state.value.some((s) => typeof s !== "object");
1024
+ } else if (rulesDef.value.$each && !(rulesDef.value.$each instanceof Function)) {
1025
+ return Object.values(rulesDef.value.$each).every((rule) => isRuleDef(rule));
1026
+ }
1027
+ return false;
1028
+ });
1029
+ const $externalErrorsField = vue.computed(() => {
1030
+ if (externalErrors.value) {
1031
+ if (isExternalErrorCollection(externalErrors.value)) {
1032
+ return externalErrors.value.$errors ?? [];
1033
+ }
1034
+ return [];
1035
+ }
1036
+ return [];
1037
+ });
1038
+ const $externalErrorsEach = vue.computed(() => {
1039
+ if (externalErrors.value) {
1040
+ if (isExternalErrorCollection(externalErrors.value)) {
1041
+ return externalErrors.value.$each ?? [];
1042
+ }
1043
+ return [];
1044
+ }
1045
+ return [];
1046
+ });
1047
+ return {
1048
+ isPrimitiveArray,
1049
+ $externalErrorsField,
1050
+ $externalErrorsEach
1051
+ };
1052
+ });
1053
+ createStatus();
1054
+ $watch();
1055
+ function createStatus() {
1056
+ if (typeof state.value === "object") {
1057
+ if (state.value != null && !state.value?.$id && state.value !== null) {
1058
+ $id.value = randomId();
1059
+ Object.defineProperties(state.value, {
1060
+ $id: {
1061
+ value: $id.value,
1062
+ enumerable: false,
1063
+ configurable: false,
1064
+ writable: false
1065
+ }
1066
+ });
1067
+ } else if (state.value?.$id) {
1068
+ $id.value = state.value.$id;
1069
+ }
1070
+ }
1071
+ if (immediateScopeState.isPrimitiveArray.value) {
1072
+ return;
1073
+ }
1074
+ $value.value = $fieldStatus.value.$value;
1075
+ if (Array.isArray(state.value) && rulesDef.value.$each) {
1076
+ $eachStatus.value = state.value.map((value, index) => {
1077
+ const unwrapped$Each = unwrapGetter(
1078
+ rulesDef.value.$each,
1079
+ vue.toRef(() => value),
1080
+ index
1081
+ );
1082
+ if (unwrapped$Each) {
1083
+ const element = createCollectionElement({
1084
+ $id: $id.value,
1085
+ path,
1086
+ rules: unwrapped$Each,
1087
+ stateValue: vue.toRef(() => value),
1088
+ index,
1089
+ options,
1090
+ storage,
1091
+ externalErrors: immediateScopeState.$externalErrorsEach
1092
+ });
1093
+ if (element) {
1094
+ return element;
1095
+ }
1096
+ return null;
1097
+ }
1098
+ }).filter((each) => !!each);
1099
+ } else {
1100
+ $eachStatus.value = [];
1101
+ }
1102
+ $fieldStatus.value = createReactiveFieldStatus({
1103
+ state,
1104
+ rulesDef,
1105
+ customMessages,
1106
+ path,
1107
+ storage,
1108
+ options,
1109
+ externalErrors: immediateScopeState.$externalErrorsField
1110
+ });
1111
+ }
1112
+ function updateStatus() {
1113
+ if (Array.isArray(state.value)) {
1114
+ const previousStatus = cloneDeep($eachStatus.value);
1115
+ $eachStatus.value = state.value.map((value, index) => {
1116
+ const currentValue = vue.toRef(() => value);
1117
+ if (value.$id && $eachStatus.value.find((each) => each.$id === value.$id)) {
1118
+ const existingStatus = storage.getArrayStatus($id.value, value.$id);
1119
+ if (existingStatus) {
1120
+ existingStatus.$value = currentValue;
1121
+ return existingStatus;
1122
+ }
1123
+ return null;
1124
+ } else {
1125
+ const unwrapped$Each = unwrapGetter(rulesDef.value.$each, currentValue, index);
1126
+ if (unwrapped$Each) {
1127
+ const element = createCollectionElement({
1128
+ $id: $id.value,
1129
+ path,
1130
+ rules: unwrapped$Each,
1131
+ stateValue: currentValue,
1132
+ index,
1133
+ options,
1134
+ storage,
1135
+ externalErrors: immediateScopeState.$externalErrorsEach
1136
+ });
1137
+ if (element) {
1138
+ return element;
1139
+ }
1140
+ return null;
1141
+ }
1142
+ }
1143
+ }).filter((each) => !!each);
1144
+ previousStatus.filter(($each) => !state.value.find((f) => $each.$id === f.$id)).forEach(($each, index) => {
1145
+ storage.deleteArrayStatus($id.value, index.toString());
1146
+ });
1147
+ } else {
1148
+ $eachStatus.value = [];
1149
+ }
1150
+ }
1151
+ function $watch() {
1152
+ $unwatchState = vue.watch(
1153
+ state,
1154
+ () => {
1155
+ if (state.value != null && !Object.hasOwn(state.value, "$id")) {
1156
+ createStatus();
1157
+ } else {
1158
+ updateStatus();
1159
+ }
1160
+ },
1161
+ { deep: isVueSuperiorOrEqualTo3dotFive ? 1 : true, flush: "pre" }
1162
+ );
1163
+ scopeState = scope.run(() => {
1164
+ const $dirty = vue.computed(() => {
1165
+ return $fieldStatus.value.$dirty && $eachStatus.value.every((statusOrField) => {
1166
+ return statusOrField.$dirty;
1167
+ });
1168
+ });
1169
+ const $anyDirty = vue.computed(() => {
1170
+ return $fieldStatus.value.$anyDirty || $eachStatus.value.some((statusOrField) => {
1171
+ return statusOrField.$dirty;
1172
+ });
1173
+ });
1174
+ const $invalid = vue.computed(() => {
1175
+ return $fieldStatus.value.$invalid || $eachStatus.value.some((statusOrField) => {
1176
+ return statusOrField.$invalid;
1177
+ });
1178
+ });
1179
+ const $valid = vue.computed(
1180
+ () => $fieldStatus.value.$valid && $eachStatus.value.every((statusOrField) => {
1181
+ return statusOrField.$valid;
1182
+ })
1183
+ );
1184
+ const $error = vue.computed(() => {
1185
+ return $fieldStatus.value.$error || $eachStatus.value.some((statusOrField) => {
1186
+ return statusOrField.$error;
1187
+ });
1188
+ });
1189
+ const $pending = vue.computed(() => {
1190
+ return $fieldStatus.value.$pending || $eachStatus.value.some((statusOrField) => {
1191
+ return statusOrField.$pending;
1192
+ });
1193
+ });
1194
+ const $errors = vue.computed(() => {
1195
+ return {
1196
+ $errors: extractRulesErrors({ field: $fieldStatus.value, silent: false }),
1197
+ $each: extractCollectionError($eachStatus.value)
1198
+ };
1199
+ });
1200
+ const $silentErrors = vue.computed(() => {
1201
+ return {
1202
+ $errors: extractRulesErrors({ field: $fieldStatus.value, silent: true }),
1203
+ $each: extractCollectionError($eachStatus.value, true)
1204
+ };
1205
+ });
1206
+ return {
1207
+ $dirty,
1208
+ $anyDirty,
1209
+ $invalid,
1210
+ $valid,
1211
+ $error,
1212
+ $pending,
1213
+ $errors,
1214
+ $silentErrors
1215
+ };
1216
+ });
1217
+ if (immediateScopeState.isPrimitiveArray.value) {
1218
+ console.warn(
1219
+ `${path} is a Array of primitives. Tracking can be lost when reassigning the Array. We advise to use an Array of objects instead`
1220
+ );
1221
+ $unwatchState();
1222
+ }
1223
+ }
1224
+ function $unwatch() {
1225
+ if ($unwatchState) {
1226
+ $unwatchState();
1227
+ }
1228
+ if ($fieldStatus.value) {
1229
+ $fieldStatus.value.$unwatch();
1230
+ }
1231
+ if ($eachStatus.value) {
1232
+ $eachStatus.value.forEach((element) => {
1233
+ if ("$dirty" in element) {
1234
+ element.$unwatch();
1235
+ }
1236
+ });
1237
+ }
1238
+ scope.stop();
1239
+ scope = vue.effectScope();
1240
+ immediateScope.stop();
1241
+ immediateScope = vue.effectScope(true);
1242
+ }
1243
+ function $touch() {
1244
+ $fieldStatus.value.$touch();
1245
+ $eachStatus.value.forEach(($each) => {
1246
+ $each.$touch();
1247
+ });
1248
+ }
1249
+ function $reset() {
1250
+ $fieldStatus.value.$reset();
1251
+ $eachStatus.value.forEach(($each) => {
1252
+ $each.$reset();
1253
+ });
1254
+ }
1255
+ async function $validate() {
1256
+ try {
1257
+ const results = await Promise.all([
1258
+ $fieldStatus.value.$validate(),
1259
+ ...$eachStatus.value.map((rule) => {
1260
+ return rule.$validate();
1261
+ })
1262
+ ]);
1263
+ return results.every((value) => !!value);
1264
+ } catch (e) {
1265
+ return false;
1266
+ }
1267
+ }
1268
+ function $clearExternalErrors() {
1269
+ }
1270
+ return vue.reactive({
1271
+ $field: $fieldStatus,
1272
+ ...scopeState,
1273
+ $each: $eachStatus,
1274
+ $value: state,
1275
+ $validate,
1276
+ $unwatch,
1277
+ $watch,
1278
+ $touch,
1279
+ $reset,
1280
+ $clearExternalErrors
1281
+ });
1282
+ }
1283
+
1284
+ // src/core/useRegle/useStateProperties/createReactiveNestedStatus.ts
1285
+ function createReactiveNestedStatus({
1286
+ scopeRules,
1287
+ state,
1288
+ customMessages,
1289
+ path = "",
1290
+ rootRules,
1291
+ storage,
1292
+ options,
1293
+ externalErrors,
1294
+ validationGroups
1295
+ }) {
1296
+ let scope;
1297
+ let scopeState;
1298
+ let $unwatchFields;
1299
+ function createReactiveFieldsStatus(watch5 = true, forceFromGetter = false) {
1300
+ $fields.value = null;
1301
+ vue.triggerRef($fields);
1302
+ const scopedRulesStatus = Object.fromEntries(
1303
+ Object.entries(scopeRules.value).map(([statePropKey, statePropRules]) => {
1304
+ if (statePropRules) {
1305
+ const stateRef = vue.toRef(state.value, statePropKey);
1306
+ const statePropRulesRef = vue.toRef(() => statePropRules);
1307
+ const $externalErrors = vue.toRef(() => externalErrors.value?.[statePropKey]);
1308
+ return [
1309
+ statePropKey,
1310
+ createReactiveChildrenStatus({
1311
+ state: stateRef,
1312
+ rulesDef: statePropRulesRef,
1313
+ customMessages,
1314
+ path: path ? `${path}.${statePropKey}` : statePropKey,
1315
+ storage,
1316
+ options,
1317
+ externalErrors: $externalErrors
1318
+ })
1319
+ ];
1320
+ }
1321
+ return [];
1322
+ }).filter(
1323
+ (rule) => !!rule.length && rule[1] != null
1324
+ )
1325
+ );
1326
+ const externalRulesStatus = Object.fromEntries(
1327
+ Object.entries(vue.unref(externalErrors) ?? {}).filter(([key]) => !(key in scopeRules.value)).map(([key, errors]) => {
1328
+ if (errors) {
1329
+ const statePropRulesRef = vue.toRef(() => ({}));
1330
+ const $externalErrors = vue.toRef(() => errors);
1331
+ return [
1332
+ key,
1333
+ createReactiveChildrenStatus({
1334
+ state: vue.ref(void 0),
1335
+ rulesDef: statePropRulesRef,
1336
+ customMessages,
1337
+ path: path ? `${path}.${key}` : key,
1338
+ storage,
1339
+ options,
1340
+ externalErrors: $externalErrors
1341
+ })
1342
+ ];
1343
+ }
1344
+ return [];
1345
+ })
1346
+ );
1347
+ const groups = Object.fromEntries(
1348
+ Object.entries(validationGroups?.(scopedRulesStatus) ?? {}).map(([key, entries]) => {
1349
+ if (entries.length) {
1350
+ return [
1351
+ key,
1352
+ {
1353
+ ...Object.fromEntries(
1354
+ ["$invalid", "$error", "$pending", "$dirty", "$valid"].map(
1355
+ (property) => [
1356
+ property,
1357
+ mergeBooleanGroupProperties(
1358
+ vue.toRef(() => entries),
1359
+ property
1360
+ )
1361
+ ]
1362
+ )
1363
+ ),
1364
+ ...Object.fromEntries(
1365
+ ["$errors", "$silentErrors"].map((property) => [
1366
+ property,
1367
+ mergeArrayGroupProperties(
1368
+ vue.toRef(() => entries),
1369
+ property
1370
+ )
1371
+ ])
1372
+ )
1373
+ }
1374
+ ];
1375
+ }
1376
+ return [];
1377
+ })
1378
+ );
1379
+ $fields.value = { ...scopedRulesStatus, ...externalRulesStatus, ...groups };
1380
+ if (watch5) {
1381
+ $watch();
1382
+ }
1383
+ }
1384
+ let $fields = storage.getFieldsEntry(path);
1385
+ createReactiveFieldsStatus();
1386
+ function $reset() {
1387
+ createReactiveFieldsStatus(false);
1388
+ Object.entries($fields.value).forEach(([_, statusOrField]) => {
1389
+ statusOrField.$reset();
1390
+ });
1391
+ $watch();
1392
+ }
1393
+ function $touch() {
1394
+ Object.entries($fields.value).forEach(([_, statusOrField]) => {
1395
+ statusOrField.$touch();
1396
+ });
1397
+ }
1398
+ async function $validate() {
1399
+ try {
1400
+ const results = await Promise.allSettled(
1401
+ Object.entries($fields.value).map(([_, statusOrField]) => {
1402
+ return statusOrField.$validate();
1403
+ })
1404
+ );
1405
+ return results.every((value) => {
1406
+ if (value.status === "fulfilled") {
1407
+ return value.value;
1408
+ } else {
1409
+ return false;
1410
+ }
1411
+ });
1412
+ } catch (e) {
1413
+ return false;
1414
+ }
1415
+ }
1416
+ function $watch() {
1417
+ if (rootRules) {
1418
+ $unwatchFields = vue.watch(
1419
+ rootRules,
1420
+ () => {
1421
+ $unwatch();
1422
+ createReactiveFieldsStatus();
1423
+ },
1424
+ { deep: isVueSuperiorOrEqualTo3dotFive ? 1 : true, flush: "post" }
1425
+ );
1426
+ }
1427
+ scope = vue.effectScope();
1428
+ scopeState = scope.run(() => {
1429
+ const $dirty = vue.computed(() => {
1430
+ return !!Object.entries($fields.value).length && Object.entries($fields.value).every(([key, statusOrField]) => {
1431
+ return statusOrField.$dirty;
1432
+ });
1433
+ });
1434
+ const $anyDirty = vue.computed(() => {
1435
+ return Object.entries($fields.value).some(([key, statusOrField]) => {
1436
+ return statusOrField.$dirty;
1437
+ });
1438
+ });
1439
+ const $invalid = vue.computed(() => {
1440
+ return Object.entries($fields.value).some(([key, statusOrField]) => {
1441
+ return statusOrField.$invalid;
1442
+ });
1443
+ });
1444
+ const $valid = vue.computed(() => {
1445
+ return Object.entries($fields.value).every(([key, statusOrField]) => {
1446
+ return statusOrField.$valid;
1447
+ });
1448
+ });
1449
+ const $error = vue.computed(() => {
1450
+ return Object.entries($fields.value).some(([key, statusOrField]) => {
1451
+ return statusOrField.$error;
1452
+ });
1453
+ });
1454
+ const $pending = vue.computed(() => {
1455
+ return Object.entries($fields.value).some(([key, statusOrField]) => {
1456
+ return statusOrField.$pending;
1457
+ });
1458
+ });
1459
+ const $errors = vue.computed(() => {
1460
+ return extractNestedErrors($fields.value);
1461
+ });
1462
+ const $silentErrors = vue.computed(() => {
1463
+ return extractNestedErrors($fields.value, true);
1464
+ });
1465
+ return {
1466
+ $dirty,
1467
+ $anyDirty,
1468
+ $invalid,
1469
+ $valid,
1470
+ $error,
1471
+ $pending,
1472
+ $errors,
1473
+ $silentErrors
1474
+ };
1475
+ });
1476
+ }
1477
+ function $unwatch() {
1478
+ if ($fields.value) {
1479
+ Object.entries($fields.value).forEach(([_, field]) => {
1480
+ field.$unwatch();
1481
+ });
1482
+ }
1483
+ $unwatchFields?.();
1484
+ scope.stop();
1485
+ scope = vue.effectScope();
1486
+ }
1487
+ function $clearExternalErrors() {
1488
+ Object.entries($fields.value).forEach(([_, field]) => {
1489
+ field.$clearExternalErrors();
1490
+ });
1491
+ }
1492
+ return vue.reactive({
1493
+ ...scopeState,
1494
+ $fields,
1495
+ $value: state,
1496
+ $reset,
1497
+ $touch,
1498
+ $validate,
1499
+ $unwatch,
1500
+ $watch,
1501
+ $clearExternalErrors
1502
+ });
1503
+ }
1504
+ function createReactiveChildrenStatus({
1505
+ state,
1506
+ rulesDef,
1507
+ customMessages,
1508
+ path,
1509
+ storage,
1510
+ options,
1511
+ externalErrors,
1512
+ index,
1513
+ onUnwatch
1514
+ }) {
1515
+ if (isCollectionRulesDef(rulesDef)) {
1516
+ return createReactiveCollectionStatus({
1517
+ state,
1518
+ rulesDef,
1519
+ customMessages,
1520
+ path,
1521
+ storage,
1522
+ options,
1523
+ index,
1524
+ externalErrors
1525
+ });
1526
+ } else if (isNestedRulesDef(state, rulesDef) && isRefObject(state)) {
1527
+ return createReactiveNestedStatus({
1528
+ scopeRules: rulesDef,
1529
+ state,
1530
+ customMessages,
1531
+ path,
1532
+ storage,
1533
+ options,
1534
+ index,
1535
+ externalErrors
1536
+ });
1537
+ } else if (isValidatorRulesDef(rulesDef)) {
1538
+ return createReactiveFieldStatus({
1539
+ state,
1540
+ rulesDef,
1541
+ customMessages,
1542
+ path,
1543
+ storage,
1544
+ options,
1545
+ index,
1546
+ externalErrors,
1547
+ onUnwatch
1548
+ });
1549
+ }
1550
+ return null;
1551
+ }
1552
+
1553
+ // src/core/useRegle/useStateProperties/useStateProperties.ts
1554
+ function useStateProperties(scopeRules, state, options, customRules) {
1555
+ const storage = useStorage();
1556
+ const externalErrors = vue.computed(() => vue.unref(options.externalErrors));
1557
+ const regle = vue.reactive(
1558
+ createReactiveNestedStatus({
1559
+ rootRules: scopeRules,
1560
+ scopeRules,
1561
+ state,
1562
+ customMessages: customRules?.(),
1563
+ storage,
1564
+ options,
1565
+ externalErrors,
1566
+ validationGroups: options.validationGroups
1567
+ })
1568
+ );
1569
+ const errors = useErrors(regle);
1570
+ return { regle, errors };
1571
+ }
1572
+
1573
+ // src/core/useRegle/useRegle.ts
1574
+ function createUseRegleComposable(customRules, options) {
1575
+ const globalOptions = {
1576
+ autoDirty: options?.autoDirty ?? true,
1577
+ lazy: options?.lazy ?? false,
1578
+ rewardEarly: options?.rewardEarly ?? false
1579
+ };
1580
+ function useRegle2(state, rulesFactory, options2) {
1581
+ const scopeRules = vue.isRef(rulesFactory) ? rulesFactory : vue.computed(
1582
+ typeof rulesFactory === "function" ? rulesFactory : () => rulesFactory
1583
+ );
1584
+ const resolvedOptions = {
1585
+ ...globalOptions,
1586
+ ...options2
1587
+ };
1588
+ const processedState = vue.isRef(state) ? state : vue.ref(state);
1589
+ const initialState = cloneDeep(vue.toRaw(processedState.value));
1590
+ const { regle, errors } = useStateProperties(
1591
+ scopeRules,
1592
+ processedState,
1593
+ resolvedOptions,
1594
+ customRules
1595
+ );
1596
+ function resetAll() {
1597
+ regle.$unwatch();
1598
+ resetValuesRecursively(state, initialState);
1599
+ regle.$reset();
1600
+ }
1601
+ function resetValuesRecursively(current, initial) {
1602
+ Object.entries(initial).forEach(([key, value]) => {
1603
+ let currentRef = vue.isRef(current) ? current.value : current;
1604
+ let currentValue = vue.isRef(currentRef[key]) ? currentRef[key].value : currentRef[key];
1605
+ let initialRef = vue.isRef(initial[key]) ? initial[key]._value : initial[key];
1606
+ if (Array.isArray(initialRef) && Array.isArray(currentValue)) {
1607
+ currentRef[key] = [];
1608
+ initialRef.forEach((val, index) => {
1609
+ currentRef[key][index] = {};
1610
+ resetValuesRecursively(currentRef[key][index], initialRef[index]);
1611
+ });
1612
+ } else if (isObject(initialRef)) {
1613
+ resetValuesRecursively(currentValue, initialRef);
1614
+ } else {
1615
+ if (vue.isRef(currentRef[key])) {
1616
+ currentRef[key].value = initialRef;
1617
+ } else {
1618
+ currentRef[key] = initialRef;
1619
+ }
1620
+ }
1621
+ });
1622
+ }
1623
+ const ready = vue.computed(() => {
1624
+ return !(regle.$invalid || regle.$pending);
1625
+ });
1626
+ async function validateState() {
1627
+ regle.$touch();
1628
+ const result = await regle.$validate();
1629
+ if (result) {
1630
+ return processedState.value;
1631
+ }
1632
+ return false;
1633
+ }
1634
+ return {
1635
+ regle,
1636
+ errors,
1637
+ resetAll,
1638
+ validateState,
1639
+ ready,
1640
+ state: processedState
1641
+ };
1642
+ }
1643
+ return useRegle2;
1644
+ }
1645
+ var useRegle = createUseRegleComposable();
1646
+
1647
+ // src/core/defineRegleConfig.ts
1648
+ function defineRegleConfig({
1649
+ rules,
1650
+ modifiers
1651
+ }) {
1652
+ const useRegle2 = createUseRegleComposable(rules, modifiers);
1653
+ return useRegle2;
1654
+ }
1655
+
1656
+ exports.InternalRuleType = InternalRuleType;
1657
+ exports.createRule = createRule;
1658
+ exports.defineRegleConfig = defineRegleConfig;
1659
+ exports.unwrapRuleParameters = unwrapRuleParameters;
1660
+ exports.useRegle = useRegle;
1661
+ //# sourceMappingURL=index.cjs.map
1662
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jb3JlL2NyZWF0ZVJ1bGUvdW53cmFwUnVsZVBhcmFtZXRlcnMudHMiLCIuLi9zcmMvY29yZS9jcmVhdGVSdWxlL2RlZmluZVJ1bGVQcm9jZXNzb3JzLnRzIiwiLi4vc3JjL2NvcmUvY3JlYXRlUnVsZS9jcmVhdGVSdWxlLnRzIiwiLi4vc3JjL3V0aWxzL29iamVjdC51dGlscy50cyIsIi4uL3NyYy91dGlscy9pc0VtcHR5LnRzIiwiLi4vc3JjL3V0aWxzL2RlYm91bmNlLnRzIiwiLi4vc3JjL3V0aWxzL3ZlcnNpb24tY29tcGFyZS50cyIsIi4uL3NyYy91dGlscy9yYW5kb21JZC50cyIsIi4uL3NyYy9jb3JlL3VzZVN0b3JhZ2UvdXNlU3RvcmFnZS50cyIsIi4uL3NyYy9jb3JlL3VzZVJlZ2xlL2d1YXJkcy9ydWxlRGVmLmd1YXJkcy50cyIsIi4uL3NyYy9jb3JlL3VzZVJlZ2xlL2d1YXJkcy9ydWxlLnN0YXR1cy5ndWFyZHMudHMiLCIuLi9zcmMvY29yZS91c2VSZWdsZS9ndWFyZHMvcnVsZS5lcnJvcnMuZ3VhcmRzLnRzIiwiLi4vc3JjL2NvcmUvdXNlUmVnbGUvdXNlRXJyb3JzLnRzIiwiLi4vc3JjL3R5cGVzL3J1bGVzL3J1bGUuaW50ZXJuYWwudHlwZXMudHMiLCIuLi9zcmMvdHlwZXMvdXRpbHMvZ3JvdXBzLnRzIiwiLi4vc3JjL2NvcmUvdXNlUmVnbGUvdXNlU3RhdGVQcm9wZXJ0aWVzL2NyZWF0ZVJlYWN0aXZlUnVsZVN0YXR1cy50cyIsIi4uL3NyYy9jb3JlL3VzZVJlZ2xlL3VzZVN0YXRlUHJvcGVydGllcy9jcmVhdGVSZWFjdGl2ZUZpZWxkU3RhdHVzLnRzIiwiLi4vc3JjL2NvcmUvdXNlUmVnbGUvdXNlU3RhdGVQcm9wZXJ0aWVzL2NyZWF0ZVJlYWN0aXZlQ29sbGVjdGlvblN0YXR1cy50cyIsIi4uL3NyYy9jb3JlL3VzZVJlZ2xlL3VzZVN0YXRlUHJvcGVydGllcy9jcmVhdGVSZWFjdGl2ZU5lc3RlZFN0YXR1cy50cyIsIi4uL3NyYy9jb3JlL3VzZVJlZ2xlL3VzZVN0YXRlUHJvcGVydGllcy91c2VTdGF0ZVByb3BlcnRpZXMudHMiLCIuLi9zcmMvY29yZS91c2VSZWdsZS91c2VSZWdsZS50cyIsIi4uL3NyYy9jb3JlL2RlZmluZVJlZ2xlQ29uZmlnLnRzIl0sIm5hbWVzIjpbInVucmVmIiwiaXNSZWYiLCJ0b1JlZiIsInZhbGlkYXRvciIsInZlcnNpb24iLCJzaGFsbG93UmVmIiwicmVmIiwib25TY29wZURpc3Bvc2UiLCJjb21wdXRlZCIsIkludGVybmFsUnVsZVR5cGUiLCJlZmZlY3RTY29wZSIsIndhdGNoIiwiJHZhbGlkIiwicmVhY3RpdmUiLCJ0cmlnZ2VyUmVmIiwidXNlUmVnbGUiLCJvcHRpb25zIiwidG9SYXciXSwibWFwcGluZ3MiOiI7Ozs7O0FBT08sU0FBUyxxQkFBNEMsTUFBOEIsRUFBQTtBQUN4RixFQUFPLE9BQUEsTUFBQSxDQUFPLEdBQUksQ0FBQSxDQUFDLEtBQVUsS0FBQTtBQUMzQixJQUFBLElBQUksaUJBQWlCLFFBQVUsRUFBQTtBQUM3QixNQUFBLE9BQU8sS0FBTSxFQUFBO0FBQUE7QUFFZixJQUFBLE9BQU9BLFVBQU0sS0FBSyxDQUFBO0FBQUEsR0FDbkIsQ0FBQTtBQUNIO0FBTU8sU0FBUyxxQkFBNEMsTUFBOEIsRUFBQTtBQUN4RixFQUFPLE9BQUEsTUFBQSxDQUFPLEdBQUksQ0FBQSxDQUFDLEtBQVUsS0FBQTtBQUMzQixJQUFBLElBQUksaUJBQWlCLFFBQVUsRUFBQTtBQUM3QixNQUFPLE9BQUEsS0FBQTtBQUFBLEtBQ1QsTUFBQSxJQUFXQyxTQUFNLENBQUEsS0FBSyxDQUFHLEVBQUE7QUFDdkIsTUFBTyxPQUFBLEtBQUE7QUFBQTtBQUVULElBQU8sT0FBQUMsU0FBQSxDQUFNLE1BQU0sS0FBSyxDQUFBO0FBQUEsR0FDekIsQ0FBQTtBQUNIO0FBS08sU0FBUyw0QkFBNEIsSUFBd0IsRUFBQTtBQUNsRSxFQUFNLE1BQUEsT0FBQSxHQUFVLEtBQUssUUFBUyxFQUFBO0FBQzlCLEVBQU0sTUFB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LGFBQWtCLE1BQU07QUFDcEMsTUFBTyxPQUFBLEVBQUUsS0FBTSxDQUFBLFFBQUEsSUFBWSxLQUFNLENBQUEsUUFBQSxDQUFBO0FBQUEsS0FDbEMsQ0FBQTtBQUVELElBQUEsZUFBZSxhQUFvRSxHQUFBO0FBQ2pGLE1BQUEsS0FBQSxDQUFNLE1BQU8sRUFBQTtBQUNiLE1BQU0sTUFBQSxNQUFBLEdBQVMsTUFBTSxLQUFBLENBQU0sU0FBVSxFQUFBO0FBQ3JDLE1BQUEsSUFBSSxNQUFRLEVBQUE7QUFDVixRQUFBLE9BQU8sY0FBZSxDQUFBLEtBQUE7QUFBQTtBQUV4QixNQUFPLE9BQUEsS0FBQTtBQUFBO0FBR1QsSUFBTyxPQUFBO0FBQUEsTUFDTCxLQUFBO0FBQUEsTUFDQSxNQUFBO0FBQUEsTUFDQSxRQUFBO0FBQUEsTUFDQSxhQUFBO0FBQUEsTUFDQSxLQUFBO0FBQUEsTUFDQSxLQUFPLEVBQUE7QUFBQSxLQUNUO0FBQUE7QUFHRixFQUFPTyxPQUFBQSxTQUFBQTtBQUNUO0FBRU8sSUFBTSxXQUFXLHdCQUF5Qjs7O0FDaEkxQyxTQUFTLGlCQUFzRSxDQUFBO0FBQUEsRUFDcEYsS0FBQTtBQUFBLEVBQ0E7QUFDRixDQUdHLEVBQUE7QUFDRCxFQUFNQSxNQUFBQSxTQUFBQSxHQUFXLHdCQUF1QyxDQUFBLEtBQUEsRUFBTyxTQUFTLENBQUE7QUFFeEUsRUFBT0EsT0FBQUEsU0FBQUE7QUFDVCIsImZpbGUiOiJpbmRleC5janMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpc1JlZiwgdG9SZWYsIHVucmVmIH0gZnJvbSAndnVlJztcbmltcG9ydCB0eXBlIHsgUGFyYW1EZWNsIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG4vKipcbiAqIFJldHVybnMgYSBjbGVhbiBsaXN0IG9mIHBhcmFtZXRlcnNcbiAqIFJlbW92aW5nIFJlZiBhbmQgZXhlY3V0aW5nIGZ1bmN0aW9uIHRvIHJldHVybiB0aGUgdW53cmFwZWQgdmFsdWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVud3JhcFJ1bGVQYXJhbWV0ZXJzPFRQYXJhbXMgZXh0ZW5kcyBhbnlbXT4ocGFyYW1zOiBQYXJhbURlY2xbXSk6IFRQYXJhbXMge1xuICByZXR1cm4gcGFyYW1zLm1hcCgocGFyYW0pID0+IHtcbiAgICBpZiAocGFyYW0gaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuICAgICAgcmV0dXJuIHBhcmFtKCk7XG4gICAgfVxuICAgIHJldHVybiB1bnJlZihwYXJhbSk7XG4gIH0pIGFzIFRQYXJhbXM7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGNsZWFuIGxpc3Qgb2YgcGFyYW1ldGVyc1xuICogUmVtb3ZpbmcgUmVmIGFuZCBleGVjdXRpbmcgZnVuY3Rpb24gdG8gcmV0dXJuIHRoZSB1bndyYXBlZCB2YWx1ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVhY3RpdmVQYXJhbXM8VFBhcmFtcyBleHRlbmRzIGFueVtdPihwYXJhbXM6IFBhcmFtRGVjbFtdKTogVFBhcmFtcyB7XG4gIHJldHVybiBwYXJhbXMubWFwKChwYXJhbSkgPT4ge1xuICAgIGlmIChwYXJhbSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgICByZXR1cm4gcGFyYW07XG4gICAgfSBlbHNlIGlmIChpc1JlZihwYXJhbSkpIHtcbiAgICAgIHJldHVybiBwYXJhbTtcbiAgICB9XG4gICAgcmV0dXJuIHRvUmVmKCgpID0+IHBhcmFtKTtcbiAgfSkgYXMgVFBhcmFtcztcbn1cblxuLyoqXG4gKiBEdWUgdG8gYGZ1bmN0aW9uLmxlbmd0aGAgbm90IHJldHVybmluZyBkZWZhdWx0IHBhcmFtZXRlcnMsIGl0IG5lZWQgdG8gcGFyc2UgdGhlIGZ1bmMudG9TdHJpbmcoKVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RnVuY3Rpb25QYXJhbWV0ZXJzTGVuZ3RoKGZ1bmM6IEZ1bmN0aW9uKTogbnVtYmVyIHtcbiAgY29uc3QgZnVuY1N0ciA9IGZ1bmMudG9TdHJpbmcoKTtcbiAgY29uc3QgaXNBcnJvd0Z1bmN0aW9uID0gZnVuY1N0ci5pbmNsdWRlcygnPT4nKTtcbiAgY29uc3QgcGFyYW1zID0gKGlzQXJyb3dGdW5jdGlvbiA/IGZ1bmNTdHIuc3BsaXQoJz0+JylbMF0gOiBmdW5jU3RyKVxuICAgIC5zbGljZShmdW5jU3RyLmluZGV4T2YoJygnKSArIDEsIGZ1bmNTdHIuaW5kZXhPZignKScpKVxuICAgIC5zcGxpdCgnLCcpXG4gICAgLm1hcCgocGFyYW0pID0+IHBhcmFtLnRyaW0oKSk7XG4gIGNvbnN0IGRlZmF1bHRzID0gcGFyYW1zLmZpbHRlcigocGFyYW0pID0+IHBhcmFtLmluY2x1ZGVzKCc9JykpO1xuICByZXR1cm4gZGVmYXVsdHMubGVuZ3RoICsgZnVuYy5sZW5ndGg7XG59XG4iLCJpbXBvcnQgdHlwZSB7XG4gICRJbnRlcm5hbFJlZ2xlUnVsZURlZmluaXRpb24sXG4gICRJbnRlcm5hbFJlZ2xlUnVsZUluaXQsXG4gICRJbnRlcm5hbFJlZ2xlUnVsZU1ldGFkYXRhQ29uc3VtZXIsXG4gIFJlZ2xlUnVsZU1ldGFkYXRhRGVmaW5pdGlvbixcbn0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgY3JlYXRlUmVhY3RpdmVQYXJhbXMsIHVud3JhcFJ1bGVQYXJhbWV0ZXJzIH0gZnJvbSAnLi91bndyYXBSdWxlUGFyYW1ldGVycyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVSdWxlUHJvY2Vzc29ycyhcbiAgZGVmaW5pdGlvbjogJEludGVybmFsUmVnbGVSdWxlSW5pdCxcbiAgLi4ucGFyYW1zOiBhbnlbXVxuKTogJEludGVybmFsUmVnbGVSdWxlRGVmaW5pdGlvbiB7XG4gIGNvbnN0IHsgbWVzc2FnZSwgdmFsaWRhdG9yLCBhY3RpdmUsIC4uLnByb3BlcnRpZXMgfSA9IGRlZmluaXRpb247XG5cbiAgY29uc3QgaXNBc3luYyA9IHZhbGlkYXRvci5jb25zdHJ1Y3Rvci5uYW1lID09PSAnQXN5bmNGdW5jdGlvbic7XG5cbiAgY29uc3QgZGVmYXVsdFByb2Nlc3NvcnMgPSB7XG4gICAgdmFsaWRhdG9yKHZhbHVlOiBhbnksIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgICByZXR1cm4gZGVmaW5pdGlvbi52YWxpZGF0b3IodmFsdWUsIC4uLnVud3JhcFJ1bGVQYXJhbWV0ZXJzKGFyZ3MubGVuZ3RoID8gYXJncyA6IHBhcmFtcykpO1xuICAgIH0sXG4gICAgbWVzc2FnZSh2YWx1ZTogYW55LCBtZXRhZGF0YTogJEludGVybmFsUmVnbGVSdWxlTWV0YWRhdGFDb25zdW1lcikge1xuICAgICAgaWYgKHR5cGVvZiBkZWZpbml0aW9uLm1lc3NhZ2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluaXRpb24ubWVzc2FnZSh2YWx1ZSwge1xuICAgICAgICAgIC4uLm1ldGFkYXRhLFxuICAgICAgICAgICRwYXJhbXM6IHVud3JhcFJ1bGVQYXJhbWV0ZXJzKG1ldGFkYXRhLiRwYXJhbXM/Lmxlbmd0aCA/IG1ldGFkYXRhLiRwYXJhbXMgOiBwYXJhbXMpLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBkZWZpbml0aW9uLm1lc3NhZ2U7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFjdGl2ZSh2YWx1ZTogYW55LCBtZXRhZGF0YTogJEludGVybmFsUmVnbGVSdWxlTWV0YWRhdGFDb25zdW1lcikge1xuICAgICAgaWYgKHR5cGVvZiBkZWZpbml0aW9uLmFjdGl2ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gZGVmaW5pdGlvbi5hY3RpdmUodmFsdWUsIHtcbiAgICAgICAgICAuLi5tZXRhZGF0YSxcbiAgICAgICAgICAkcGFyYW1zOiB1bndyYXBSdWxlUGFyYW1ldGVycyhtZXRhZGF0YS4kcGFyYW1zPy5sZW5ndGggPyBtZXRhZGF0YS4kcGFyYW1zIDogcGFyYW1zKSxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZGVmaW5pdGlvbi5hY3RpdmUgPz8gdHJ1ZTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGV4ZWModmFsdWU6IGFueSkge1xuICAgICAgY29uc3QgdmFsaWRhdG9yID0gZGVmaW5pdGlvbi52YWxpZGF0b3IodmFsdWUsIC4uLnVud3JhcFJ1bGVQYXJhbWV0ZXJzKHBhcmFtcykpO1xuICAgICAgbGV0IHJhd1Jlc3VsdDogUmVnbGVSdWxlTWV0YWRhdGFEZWZpbml0aW9uO1xuICAgICAgaWYgKHZhbGlkYXRvciBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRvci50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICByYXdSZXN1bHQgPSByZXN1bHQ7XG4gICAgICAgICAgaWYgKHR5cGVvZiByYXdSZXN1bHQgPT09ICdvYmplY3QnICYmICckdmFsaWQnIGluIHJhd1Jlc3VsdCkge1xuICAgICAgICAgICAgcmV0dXJuIHJhd1Jlc3VsdC4kdmFsaWQ7XG4gICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgcmF3UmVzdWx0ID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIHJldHVybiByYXdSZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByYXdSZXN1bHQgPSB2YWxpZGF0b3I7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgcmF3UmVzdWx0ID09PSAnb2JqZWN0JyAmJiAnJHZhbGlkJyBpbiByYXdSZXN1bHQpIHtcbiAgICAgICAgcmV0dXJuIHJhd1Jlc3VsdC4kdmFsaWQ7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiByYXdSZXN1bHQgPT09ICdib29sZWFuJykge1xuICAgICAgICByZXR1cm4gcmF3UmVzdWx0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0sXG4gIH07XG5cbiAgY29uc3QgcHJvY2Vzc29ycyA9IHtcbiAgICAuLi5kZWZhdWx0UHJvY2Vzc29ycyxcbiAgICAuLi5wcm9wZXJ0aWVzLFxuICAgIC4uLntcbiAgICAgIF92YWxpZGF0b3I6IGRlZmluaXRpb24udmFsaWRhdG9yIGFzIGFueSxcbiAgICAgIF9tZXNzYWdlOiBkZWZpbml0aW9uLm1lc3NhZ2UsXG4gICAgICBfYWN0aXZlOiBkZWZpbml0aW9uLmFjdGl2ZSxcbiAgICAgIF90eXBlOiBkZWZpbml0aW9uLnR5cGUsXG4gICAgICBfcGF0Y2hlZDogZmFsc2UsXG4gICAgICBfYXN5bmM6IGlzQXN5bmMsXG4gICAgICBfcGFyYW1zOiBjcmVhdGVSZWFjdGl2ZVBhcmFtczxuZXZlcj4ocGFyYW1zKSxcbiAgICB9LFxuICB9O1xuXG4gIHJldHVybiBwcm9jZXNzb3JzO1xufVxuIiwiaW1wb3J0IHR5cGUge1xuICBJbmZlclJlZ2xlUnVsZSxcbiAgUmVnbGVSdWxlSW5pdCxcbiAgUmVnbGVSdWxlTWV0YWRhdGFEZWZpbml0aW9uLFxuICBSZWdsZVJ1bGVUeXBlUmV0dXJuLFxuICBSZWdsZVVuaXZlcnNhbFBhcmFtcyxcbn0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgZGVmaW5lUnVsZVByb2Nlc3NvcnMgfSBmcm9tICcuL2RlZmluZVJ1bGVQcm9jZXNzb3JzJztcbmltcG9ydCB7IGdldEZ1bmN0aW9uUGFyYW1ldGVyc0xlbmd0aCB9IGZyb20gJy4vdW53cmFwUnVsZVBhcmFtZXRlcnMnO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICogQ3JlYXRlIGEgdHlwZWQgY3VzdG9tIHJ1bGUgdGhhdCBjYW4gYmUgdXNlZCBsaWtlIGRlZmF1bHQgcnVsZXMuXG4gKiBJdCBjYW4gYWxzbyBiZSBkZWNsYXJlZCBpbiB0aGUgZ2xvYmFsIG9wdGlvbnNcbiAqXG4gKiBJdCB3aWxsIGF1dG9tYXRpY2FsbHkgZGV0ZWN0IGlmIHRoZSBydWxlIGlzIGFzeW5jXG4gKlxuICogQHR5cGVQYXJhbSBUVmFsdWUgLSBUaGUgaW5wdXQgdmFsdWUgdGhlIHJ1bGUgc2hvdWxkIHJlY2VpdmVcbiAqIEB0eXBlUGFyYW0gVFBhcmFtcyAtIFR1cGxlIGRlY2xhcmF0aW9uIG9mIHRoZSBydWxlIHBhcmFtZXRlcnMgKGlmIGFueSlcbiAqXG4gKiBAcGFyYW0gZGVmaW5pdGlvbiAtIFRoZSBydWxlIHByb2Nlc3NvcnMgb2JqZWN0XG4gKlxuICogQHJldHVybnMgQSBydWxlIGRlZmluaXRpb24gdGhhdCBjYW4gYmUgY2FsbGFibGUgZGVwZW5kaW5nIG9uIHBhcmFtcyBwcmVzZW5jZVxuICpcbiAqIEBleGVtcGxlXG4gKlxuICogYGBgdHNcbiAqIC8vIENyZWF0ZSBhIHNpbXBsZSBydWxlIHdpdGggbm8gcGFyYW1zXG4gKiBpbXBvcnQge3J1bGVIZWxwZXJzfSBmcm9tICdAcmVnbGUvcnVsZXMnO1xuICpcbiAqIGV4cG9ydCBjb25zdCBpc0ZvbyA9IGNyZWF0ZVJ1bGUoe1xuICogICB2YWxpZGF0b3IodmFsdWU6IHN0cmluZykge1xuICogICAgICAgaWYgKHJ1bGVIZWxwZXJzLmlzRmlsbGVkKHZhbHVlKSkge1xuICogICAgICAgICAgIHJldHVybiB2YWx1ZSA9PT0gJ2Zvbyc7XG4gKiAgICAgICB9XG4gKiAgICAgICByZXR1cm4gdHJ1ZVxuICogICB9LFxuICogICBtZXNzYWdlOiBcIlRoZSB2YWx1ZSBzaG91bGQgYmUgJ2ZvbydcIlxuICogfSlcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUnVsZTxcbiAgVFZhbHVlIGV4dGVuZHMgYW55LFxuICBUUGFyYW1zIGV4dGVuZHMgYW55W10sXG4gIFRSZXR1cm4gZXh0ZW5kcyBSZWdsZVJ1bGVNZXRhZGF0YURlZmluaXRpb24gfCBQcm9taXNlPFJlZ2xlUnVsZU1ldGFkYXRhRGVmaW5pdGlvbj4sXG4gIFRNZXRhZGF0YSBleHRlbmRzIFJlZ2xlUnVsZU1ldGFkYXRhRGVmaW5pdGlvbiA9IFRSZXR1cm4gZXh0ZW5kcyBQcm9taXNlPGluZmVyIE0+ID8gTSA6IFRSZXR1cm4sXG4gIFRBc3luYyBleHRlbmRzIGJvb2xlYW4gPSBUUmV0dXJuIGV4dGVuZHMgUHJvbWlzZTxhbnk+ID8gdHJ1ZSA6IGZhbHNlLFxuPihcbiAgZGVmaW5pdGlvbjogUmVnbGVSdWxlSW5pdDxUVmFsdWUsIFRQYXJhbXMsIFRSZXR1cm4sIFRNZXRhZGF0YSwgVEFzeW5jPlxuKTogSW5mZXJSZWdsZVJ1bGU8VFZhbHVlLCBUUGFyYW1zLCBUQXN5bmMsIFRNZXRhZGF0YT4ge1xuICBpZiAodHlwZW9mIGRlZmluaXRpb24udmFsaWRhdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgbGV0IGZha2VQYXJhbXM6IGFueVtdID0gW107XG4gICAgY29uc3Qgc3RhdGljUHJvY2Vzc29ycyA9IGRlZmluZVJ1bGVQcm9jZXNzb3JzKGRlZmluaXRpb24gYXMgYW55LCAuLi5mYWtlUGFyYW1zKTtcblxuICAgIGNvbnN0IGlzQXN5bmMgPSBkZWZpbml0aW9uLnZhbGlkYXRvci5jb25zdHJ1Y3Rvci5uYW1lID09PSAnQXN5bmNGdW5jdGlvbic7XG4gICAgLy8gRm9yIHZhbGlkYXRvcnMgbmVlZGluZyBhIHBhcmFtcyBsaWtlIG1heExlbmd0aCBvciByZXF1aXJlZElmXG4gICAgaWYgKGdldEZ1bmN0aW9uUGFyYW1ldGVyc0xlbmd0aChkZWZpbml0aW9uLnZhbGlkYXRvcikgPiAxKSB7XG4gICAgICAvLyBGb3IgdmFsaWRhdG9ycyB3aXRoIHBhcmFtLCByZXR1cm4gYSBmdW5jdGlvbiBwcm92aWRpbmcgcGFyYW1zIGZvciBhbGwgdGhlIHJ1bGUgcHJvY2Vzc29yc1xuICAgICAgY29uc3QgcnVsZUZhY3RvcnkgPSBmdW5jdGlvbiAoLi4ucGFyYW1zOiBSZWdsZVVuaXZlcnNhbFBhcmFtczxUUGFyYW1zPikge1xuICAgICAgICByZXR1cm4gZGVmaW5lUnVsZVByb2Nlc3NvcnMoZGVmaW5pdGlvbiBhcyBhbnksIC4uLnBhcmFtcyk7XG4gICAgICB9O1xuXG4gICAgICAvLyBBc3NpZ24gYWxsIHRoZSBpbnRlcm5hbHMgdG8gdGhlIHJ1bGUgcmF3IGZ1bmN0aW9uIHNvIHRoZXkgYXJlIGFjY2Vzc2libGUgd2l0aG91dCBjYWxsaW5nIGl0XG4gICAgICBydWxlRmFjdG9yeS52YWxpZGF0b3IgPSBzdGF0aWNQcm9jZXNzb3JzLnZhbGlkYXRvcjtcbiAgICAgIHJ1bGVGYWN0b3J5Lm1lc3NhZ2UgPSBzdGF0aWNQcm9jZXNzb3JzLm1lc3NhZ2U7XG4gICAgICBydWxlRmFjdG9yeS5hY3RpdmUgPSBzdGF0aWNQcm9jZXNzb3JzLmFjdGl2ZTtcbiAgICAgIHJ1bGVGYWN0b3J5LnR5cGUgPSBzdGF0aWNQcm9jZXNzb3JzLnR5cGU7XG4gICAgICBydWxlRmFjdG9yeS5leGVjID0gc3RhdGljUHJvY2Vzc29ycy5leGVjO1xuXG4gICAgICBydWxlRmFjdG9yeS5fdmFsaWRhdG9yID0gc3RhdGljUHJvY2Vzc29ycy52YWxpZGF0b3I7XG4gICAgICBydWxlRmFjdG9yeS5fbWVzc2FnZSA9IHN0YXRpY1Byb2Nlc3NvcnMubWVzc2FnZTtcbiAgICAgIHJ1bGVGYWN0b3J5Ll9hY3RpdmUgPSBzdGF0aWNQcm9jZXNzb3JzLmFjdGl2ZTtcbiAgICAgIHJ1bGVGYWN0b3J5Ll90eXBlID0gZGVmaW5pdGlvbi50eXBlO1xuICAgICAgcnVsZUZhY3RvcnkuX3BhdGNoZWQgPSBmYWxzZTtcbiAgICAgIHJ1bGVGYWN0b3J5Ll9hc3luYyA9IGlzQXN5bmMgYXMgVEFzeW5jO1xuICAgICAgcmV0dXJuIHJ1bGVGYWN0b3J5IGFzIGFueTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHN0YXRpY1Byb2Nlc3NvcnMgYXMgYW55O1xuICAgIH1cbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoJ1ZhbGlkYXRvciBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbn1cbiIsImltcG9ydCB0eXBlIHsgUmVmIH0gZnJvbSAndnVlJztcbmltcG9ydCB0eXBlIHsgTWF5YmVHZXR0ZXIgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc09iamVjdChvYmo6IHVua25vd24pOiBvYmogaXMgUmVjb3JkPHN0cmluZywgYW55PiB7XG4gIHJldHVybiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiBvYmogIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkob2JqKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUmVmT2JqZWN0KG9iajogUmVmPHVua25vd24+KTogb2JqIGlzIFJlZjxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gIHJldHVybiBpc09iamVjdChvYmoudmFsdWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xvbmVEZWVwPFQ+KG9iajogVCk6IFQge1xuICBsZXQgcmVzdWx0ID0gb2JqIGFzIGFueTtcbiAgbGV0IHR5cGUgPSB7fS50b1N0cmluZy5jYWxsKG9iaikuc2xpY2UoOCwgLTEpO1xuICBpZiAodHlwZSA9PSAnU2V0Jykge1xuICAgIHJlc3VsdCA9IG5ldyBTZXQoWy4uLihvYmogYXMgYW55KV0ubWFwKCh2YWx1ZSkgPT4gY2xvbmVEZWVwKHZhbHVlKSkpO1xuICB9XG4gIGlmICh0eXBlID09ICdNYXAnKSB7XG4gICAgcmVzdWx0ID0gbmV3IE1hcChbLi4uKG9iaiBhcyBhbnkpXS5tYXAoKGt2KSA9PiBbY2xvbmVEZWVwKGt2WzBdKSwgY2xvbmVEZWVwKGt2WzFdKV0pKTtcbiAgfVxuICBpZiAodHlwZSA9PSAnRGF0ZScpIHtcbiAgICByZXN1bHQgPSBuZXcgRGF0ZSgob2JqIGFzIGFueSkuZ2V0VGltZSgpKTtcbiAgfVxuICBpZiAodHlwZSA9PSAnUmVnRXhwJykge1xuICAgIHJlc3VsdCA9IFJlZ0V4cCgob2JqIGFzIGFueSkuc291cmNlLCBnZXRSZWdFeHBGbGFncyhvYmopKTtcbiAgfVxuICBpZiAodHlwZSA9PSAnQXJyYXknIHx8IHR5cGUgPT0gJ09iamVjdCcpIHtcbiAgICByZXN1bHQgPSBBcnJheS5pc0FycmF5KG9iaikgPyBbXSA6IHt9O1xuICAgIGZvciAobGV0IGtleSBpbiBvYmopIHtcbiAgICAgIC8vIGluY2x1ZGUgcHJvdG90eXBlIHByb3BlcnRpZXNcbiAgICAgIHJlc3VsdFtrZXldID0gY2xvbmVEZWVwKG9ialtrZXldKTtcbiAgICB9XG4gIH1cbiAgLy8gcHJpbWl0aXZlcyBhbmQgbm9uLXN1cHBvcnRlZCBvYmplY3RzIChlLmcuIGZ1bmN0aW9ucykgbGFuZCBoZXJlXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGdldFJlZ0V4cEZsYWdzKHJlZ0V4cDogYW55KSB7XG4gIGlmICh0eXBlb2YgcmVnRXhwLnNvdXJjZS5mbGFncyA9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiByZWdFeHAuc291cmNlLmZsYWdzO1xuICB9IGVsc2Uge1xuICAgIGxldCBmbGFncyA9IFtdO1xuICAgIHJlZ0V4cC5nbG9iYWwgJiYgZmxhZ3MucHVzaCgnZycpO1xuICAgIHJlZ0V4cC5pZ25vcmVDYXNlICYmIGZsYWdzLnB1c2goJ2knKTtcbiAgICByZWdFeHAubXVsdGlsaW5lICYmIGZsYWdzLnB1c2goJ20nKTtcbiAgICByZWdFeHAuc3RpY2t5ICYmIGZsYWdzLnB1c2goJ3knKTtcbiAgICByZWdFeHAudW5pY29kZSAmJiBmbGFncy5wdXNoKCd1Jyk7XG4gICAgcmV0dXJuIGZsYWdzLmpvaW4oJycpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1bndyYXBHZXR0ZXI8VCBleHRlbmRzIGFueT4oXG4gIGdldHRlcjogTWF5YmVHZXR0ZXI8VCwgYW55PixcbiAgdmFsdWU6IFJlZjxhbnk+LFxuICBpbmRleD86IG51bWJlclxuKTogVCB7XG4gIGlmIChnZXR0ZXIgaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuICAgIHJldHVybiBnZXR0ZXIodmFsdWUsIGluZGV4ID8/IDApO1xuICB9XG4gIHJldHVybiBnZXR0ZXI7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gaXNFbXB0eSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIG51bGwgfCB1bmRlZmluZWQge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHZhbHVlID09PSBmYWxzZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAvLyBpbnZhbGlkIGRhdGUgd29uJ3QgcGFzc1xuICAgIHJldHVybiBpc05hTih2YWx1ZS5nZXRUaW1lKCkpO1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZS5sZW5ndGggPT09IDA7XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT0gbnVsbCkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuICFTdHJpbmcodmFsdWUudHJpbSgpKS5sZW5ndGg7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuIiwiaW50ZXJmYWNlIERlYm91bmNlZEZ1bmN0aW9uIHtcbiAgKC4uLmFyZ3M6IHVua25vd25bXSk6IFByb21pc2U8dW5rbm93bj47XG4gIGNhbmNlbCgpOiB2b2lkO1xuICBkb0ltbWVkaWF0ZWx5KC4uLmFyZ3M6IHVua25vd25bXSk6IFByb21pc2U8dW5rbm93bj47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWJvdW5jZTxUIGV4dGVuZHMgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkgfCBQcm9taXNlPGFueT4+KFxuICB0aGlzOiBhbnksXG4gIGZ1bmM6IFQsXG4gIHdhaXQ6IG51bWJlcixcbiAgaW1tZWRpYXRlPzogYm9vbGVhblxuKTogVCB7XG4gIGxldCB0aW1lb3V0OiBOb2RlSlMuVGltZW91dCB8IHVuZGVmaW5lZDtcbiAgY29uc3QgZGVib3VuY2VkRm46IERlYm91bmNlZEZ1bmN0aW9uID0gKC4uLmFyZ3MpID0+XG4gICAgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGltZW91dCA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKCFpbW1lZGlhdGUpIHtcbiAgICAgICAgICBQcm9taXNlLnJlc29sdmUoZnVuYy5hcHBseSh0aGlzLCBbLi4uYXJnc10gYXMgYW55KSkudGhlbihyZXNvbHZlKTtcbiAgICAgICAgfVxuICAgICAgfSwgd2FpdCk7XG4gICAgICBpZiAoaW1tZWRpYXRlICYmICF0aW1lb3V0KSB7XG4gICAgICAgIFByb21pc2UucmVzb2x2ZShmdW5jLmFwcGx5KHRoaXMsIFsuLi5hcmdzXSBhcyBhbnkpKS50aGVuKHJlc29sdmUpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gIGRlYm91bmNlZEZuLmNhbmNlbCA9ICgpID0+IHtcbiAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgdGltZW91dCA9IHVuZGVmaW5lZDtcbiAgfTtcblxuICBkZWJvdW5jZWRGbi5kb0ltbWVkaWF0ZWx5ID0gKC4uLmFyZ3MpID0+XG4gICAgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGltZW91dCA9IHVuZGVmaW5lZDtcbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKGZ1bmMuYXBwbHkodGhpcywgWy4uLmFyZ3NdIGFzIGFueSkpLnRoZW4ocmVzb2x2ZSk7XG4gICAgICB9LCAwKTtcbiAgICB9KTtcblxuICByZXR1cm4gZGVib3VuY2VkRm4gYXMgdW5rbm93biBhcyBUO1xufVxuIiwiaW1wb3J0IHsgdmVyc2lvbiB9IGZyb20gJ3Z1ZSc7XG5cbmV4cG9ydCB0eXBlIFZlcnNpb24gPSBzdHJpbmcgfCBudW1iZXI7XG5leHBvcnQgZW51bSBWZXJzaW9uSXMge1xuICBMZXNzVGhhbiA9IC0xLFxuICBFcXVhbFRvID0gMCxcbiAgR3JlYXRlclRoYW4gPSAxLFxufVxuXG4vKipcbiAqIENvbXBhcmUgdHdvIHZlcnNpb25zIHF1aWNrbHkuXG4gKiBAcGFyYW0gY3VycmVudCBJcyB0aGlzIHZlcnNpb24gZ3JlYXRlciwgZXF1YWwgdG8sIG9yIGxlc3MgdGhhbiB0aGUgb3RoZXI/XG4gKiBAcGFyYW0gb3RoZXIgVGhlIHZlcnNpb24gdG8gY29tcGFyZSBhZ2FpbnN0IHRoZSBjdXJyZW50IHZlcnNpb25cbiAqIEByZXR1cm4gMSBpZiBjdXJyZW50IGlzIGdyZWF0ZXIgdGhhbiBvdGhlciwgMCBpZiB0aGV5IGFyZSBlcXVhbCBvciBlcXVpdmFsZW50LCBhbmQgLTEgaWYgY3VycmVudCBpcyBsZXNzIHRoYW4gb3RoZXJcbiAqL1xuZnVuY3Rpb24gdmVyc2lvbkNvbXBhcmUoY3VycmVudDogVmVyc2lvbiwgb3RoZXI6IFZlcnNpb24pOiBWZXJzaW9uSXMge1xuICBjb25zdCBjcCA9IFN0cmluZyhjdXJyZW50KS5zcGxpdCgnLicpO1xuICBjb25zdCBvcCA9IFN0cmluZyhvdGhlcikuc3BsaXQoJy4nKTtcbiAgZm9yIChsZXQgZGVwdGggPSAwOyBkZXB0aCA8IE1hdGgubWluKGNwLmxlbmd0aCwgb3AubGVuZ3RoKTsgZGVwdGgrKykge1xuICAgIGNvbnN0IGNuID0gTnVtYmVyKGNwW2RlcHRoXSk7XG4gICAgY29uc3Qgb24gPSBOdW1iZXIob3BbZGVwdGhdKTtcbiAgICBpZiAoY24gPiBvbikgcmV0dXJuIFZlcnNpb25Jcy5HcmVhdGVyVGhhbjtcbiAgICBpZiAob24gPiBjbikgcmV0dXJuIFZlcnNpb25Jcy5MZXNzVGhhbjtcbiAgICBpZiAoIWlzTmFOKGNuKSAmJiBpc05hTihvbikpIHJldHVybiBWZXJzaW9uSXMuR3JlYXRlclRoYW47XG4gICAgaWYgKGlzTmFOKGNuKSAmJiAhaXNOYU4ob24pKSByZXR1cm4gVmVyc2lvbklzLkxlc3NUaGFuO1xuICB9XG4gIHJldHVybiBWZXJzaW9uSXMuRXF1YWxUbztcbn1cblxuZXhwb3J0IGNvbnN0IGlzVnVlU3VwZXJpb3JPckVxdWFsVG8zZG90Rml2ZSA9XG4gIHZlcnNpb25Db21wYXJlKHZlcnNpb24sICczLjUuMCcpID09PSAtMSA/IGZhbHNlIDogdHJ1ZTtcbiIsImZ1bmN0aW9uIHVuaXF1ZUlETnV4dCgpIHtcbiAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIERhdGUubm93KCkpLnRvU3RyaW5nKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByYW5kb21JZCgpOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gdW5pcXVlSUROdXh0KCk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgdWludDMyID0gd2luZG93LmNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQzMkFycmF5KDEpKVswXTtcbiAgICByZXR1cm4gdWludDMyLnRvU3RyaW5nKDEwKTtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBSZWYgfSBmcm9tICd2dWUnO1xuaW1wb3J0IHsgb25TY29wZURpc3Bvc2UsIHJlZiwgc2hhbGxvd1JlZiB9IGZyb20gJ3Z1ZSc7XG5pbXBvcnQgdHlwZSB7ICRJbnRlcm5hbFJlZ2xlU3RhdHVzVHlwZSwgUmVnbGVSdWxlRGVjbCB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IHVud3JhcFJ1bGVQYXJhbWV0ZXJzIH0gZnJvbSAnLi4vY3JlYXRlUnVsZS91bndyYXBSdWxlUGFyYW1ldGVycyc7XG5cbmV4cG9ydCB0eXBlIFN0b3JlZFJ1bGVTdGF0dXMgPSB7XG4gICR2YWxpZDogUmVmPGJvb2xlYW4+O1xuICAkcGVuZGluZzogUmVmPGJvb2xlYW4+O1xuICAkbWV0YWRhdGE6IFJlZjxSZWNvcmQ8c3RyaW5nLCBhbnk+PjtcbiAgJHZhbGlkYXRpbmc6IFJlZjxib29sZWFuPjtcbn07XG5cbmV4cG9ydCB0eXBlIFJlZ2xlU3RvcmFnZSA9IFJldHVyblR5cGU8dHlwZW9mIHVzZVN0b3JhZ2U+O1xuXG4vKipcbiAqIEluc3BpcmVkIGJ5IFZ1ZWxpZGF0ZSBzdG9yYWdlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VTdG9yYWdlKCkge1xuICBjb25zdCBydWxlRGVjbFN0b3JhZ2UgPSBzaGFsbG93UmVmKG5ldyBNYXA8c3RyaW5nLCBSZWdsZVJ1bGVEZWNsPGFueSwgYW55Pj4oKSk7XG4gIGNvbnN0IGZpZWxkc1N0b3JhZ2UgPSBzaGFsbG93UmVmKFxuICAgIG5ldyBNYXA8c3RyaW5nLCBSZWY8UmVjb3JkPHN0cmluZywgJEludGVybmFsUmVnbGVTdGF0dXNUeXBlPj4+KClcbiAgKTtcbiAgY29uc3QgY29sbGVjdGlvbnNTdG9yYWdlID0gc2hhbGxvd1JlZihuZXcgTWFwPHN0cmluZywgUmVmPEFycmF5PCRJbnRlcm5hbFJlZ2xlU3RhdHVzVHlwZT4+PigpKTtcbiAgY29uc3QgZGlydHlTdG9yYWdlID0gc2hhbGxvd1JlZihuZXcgTWFwPHN0cmluZywgYm9vbGVhbj4oKSk7XG4gIGNvbnN0IHJ1bGVTdGF0dXNTdG9yYWdlID0gc2hhbGxvd1JlZihuZXcgTWFwPHN0cmluZywgU3RvcmVkUnVsZVN0YXR1cz4oKSk7XG5cbiAgY29uc3QgYXJyYXlTdGF0dXNTdG9yYWdlID0gc2hhbGxvd1JlZihuZXcgTWFwPHN0cmluZywgJEludGVybmFsUmVnbGVTdGF0dXNUeXBlPigpKTtcblxuICBmdW5jdGlvbiBnZXRGaWVsZHNFbnRyeSgkcGF0aDogc3RyaW5nKTogUmVmPFJlY29yZDxzdHJpbmcsICRJbnRlcm5hbFJlZ2xlU3RhdHVzVHlwZT4+IHtcbiAgICBjb25zdCBleGlzdGluZ0ZpZWxkcyA9IGZpZWxkc1N0b3JhZ2UudmFsdWUuZ2V0KCRwYXRoKTtcbiAgICBpZiAoZXhpc3RpbmdGaWVsZHMpIHtcbiAgICAgIHJldHVybiBleGlzdGluZ0ZpZWxkcztcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgJGZpZWxkcyA9IHJlZih7fSkgYXMgUmVmPFJlY29yZDxzdHJpbmcsICRJbnRlcm5hbFJlZ2xlU3RhdHVzVHlwZT4+O1xuICAgICAgZmllbGRzU3RvcmFnZS52YWx1ZS5zZXQoJHBhdGgsICRmaWVsZHMpO1xuICAgICAgcmV0dXJuICRmaWVsZHM7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZ2V0Q29sbGVjdGlvbnNFbnRyeSgkcGF0aDogc3RyaW5nKTogUmVmPEFycmF5PCRJbnRlcm5hbFJlZ2xlU3RhdHVzVHlwZT4+IHtcbiAgICBjb25zdCBleGlzdGluZ0VhY2ggPSBjb2xsZWN0aW9uc1N0b3JhZ2UudmFsdWUuZ2V0KCRwYXRoKTtcbiAgICBpZiAoZXhpc3RpbmdFYWNoKSB7XG4gICAgICByZXR1cm4gZXhpc3RpbmdFYWNoO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCAkZWFjaCA9IHJlZjxBcnJheTwkSW50ZXJuYWxSZWdsZVN0YXR1c1R5cGU+PihbXSk7XG4gICAgICBjb2xsZWN0aW9uc1N0b3JhZ2UudmFsdWUuc2V0KCRwYXRoLCAkZWFjaCk7XG4gICAgICByZXR1cm4gJGVhY2g7XG4gICAgfVxuICB9XG5cbiAgLy8gQ29sbGVjdGlvbnNcblxuICBmdW5jdGlvbiBhZGRBcnJheVN0YXR1cygkYXJyYXlJZDogc3RyaW5nLCBpdGVtSWQ6IHN0cmluZywgdmFsdWU6ICRJbnRlcm5hbFJlZ2xlU3RhdHVzVHlwZSkge1xuICAgIGFycmF5U3RhdHVzU3RvcmFnZS52YWx1ZS5zZXQoYCR7JGFycmF5SWR9LSR7aXRlbUlkfWAsIHZhbHVlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEFycmF5U3RhdHVzKCRhcnJheUlkOiBzdHJpbmcsIGl0ZW1JZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFycmF5U3RhdHVzU3RvcmFnZS52YWx1ZS5nZXQoYCR7JGFycmF5SWR9LSR7aXRlbUlkfWApO1xuICB9XG5cbiAgZnVuY3Rpb24gZGVsZXRlQXJyYXlTdGF0dXMoJGFycmF5SWQ6IHN0cmluZywgaXRlbUlkPzogc3RyaW5nKSB7XG4gICAgaWYgKCRhcnJheUlkICYmIGl0ZW1JZCAhPSBudWxsKSB7XG4gICAgICBhcnJheVN0YXR1c1N0b3JhZ2UudmFsdWUuZGVsZXRlKGAkeyRhcnJheUlkfS0ke2l0ZW1JZH1gKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzZXREaXJ0eUVudHJ5KCRwYXRoOiBzdHJpbmcsIGRpcnR5OiBib29sZWFuKSB7XG4gICAgZGlydHlTdG9yYWdlLnZhbHVlLnNldCgkcGF0aCwgZGlydHkpO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0RGlydHlTdGF0ZShwYXRoOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gZGlydHlTdG9yYWdlLnZhbHVlLmdldChwYXRoKSA/PyBmYWxzZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFkZFJ1bGVEZWNsRW50cnkoJHBhdGg6IHN0cmluZywgb3B0aW9uczogUmVnbGVSdWxlRGVjbDxhbnksIGFueT4pIHtcbiAgICBydWxlRGVjbFN0b3JhZ2UudmFsdWUuc2V0KCRwYXRoLCBvcHRpb25zKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNoZWNrUnVsZURlY2xFbnRyeShcbiAgICAkcGF0aDogc3RyaW5nLFxuICAgIG5ld1J1bGVzOiBSZWdsZVJ1bGVEZWNsXG4gICk6IHsgdmFsaWQ6IGJvb2xlYW4gfSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgc3RvcmVkUnVsZXNEZWZzID0gcnVsZURlY2xTdG9yYWdlLnZhbHVlLmdldCgkcGF0aCk7XG5cbiAgICBpZiAoIXN0b3JlZFJ1bGVzRGVmcykgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IHN0b3JlZFJ1bGVzID0gc3RvcmVkUnVsZXNEZWZzO1xuXG4gICAgY29uc3QgaXNWYWxpZENhY2hlID0gYXJlUnVsZXNDaGFuZ2VkKG5ld1J1bGVzLCBzdG9yZWRSdWxlcyk7XG5cbiAgICBpZiAoIWlzVmFsaWRDYWNoZSkgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlIH07XG4gICAgcmV0dXJuIHsgdmFsaWQ6IHRydWUgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFyZVJ1bGVzQ2hhbmdlZChuZXdSdWxlczogUmVnbGVSdWxlRGVjbCwgc3RvcmVkUnVsZXM6IFJlZ2xlUnVsZURlY2wpOiBib29sZWFuIHtcbiAgICBjb25zdCBzdG9yZWRSdWxlc0tleXMgPSBPYmplY3Qua2V5cyhzdG9yZWRSdWxlcyk7XG4gICAgY29uc3QgbmV3UnVsZXNLZXlzID0gT2JqZWN0LmtleXMobmV3UnVsZXMpO1xuXG4gICAgaWYgKG5ld1J1bGVzS2V5cy5sZW5ndGggIT09IHN0b3JlZFJ1bGVzS2V5cy5sZW5ndGgpIHJldHVybiBmYWxzZTtcblxuICAgIGNvbnN0IGhhc0FsbFZhbGlkYXRvcnMgPSBuZXdSdWxlc0tleXMuZXZlcnkoKHJ1bGVLZXkpID0+IHN0b3JlZFJ1bGVzS2V5cy5pbmNsdWRlcyhydWxlS2V5KSk7XG4gICAgaWYgKCFoYXNBbGxWYWxpZGF0b3JzKSByZXR1cm4gZmFsc2U7XG5cbiAgICByZXR1cm4gbmV3UnVsZXNLZXlzLmV2ZXJ5KChydWxlS2V5KSA9PiB7XG4gICAgICBjb25zdCBuZXdSdWxlRWxlbWVudCA9IG5ld1J1bGVzW3J1bGVLZXldO1xuICAgICAgY29uc3Qgc3RvcmVkUnVsZUVsZW1lbnQgPSBzdG9yZWRSdWxlc1tydWxlS2V5XTtcbiAgICAgIGlmIChcbiAgICAgICAgIXN0b3JlZFJ1bGVFbGVtZW50IHx8XG4gICAgICAgICFuZXdSdWxlRWxlbWVudCB8fFxuICAgICAgICB0eXBlb2YgbmV3UnVsZUVsZW1lbnQgPT09ICdmdW5jdGlvbicgfHxcbiAgICAgICAgdHlwZW9mIHN0b3JlZFJ1bGVFbGVtZW50ID09PSAnZnVuY3Rpb24nXG4gICAgICApXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIC8vICRkZWJvdW5jZVxuICAgICAgaWYgKHR5cGVvZiBuZXdSdWxlRWxlbWVudCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAvLyAkbGF6eSwgJGF1dG9EaXJ0eSBldGMuLlxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbmV3UnVsZUVsZW1lbnQgPT09ICdib29sZWFuJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9IGVsc2UgaWYgKCFuZXdSdWxlRWxlbWVudC5fcGFyYW1zKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gbmV3UnVsZUVsZW1lbnQuX3BhcmFtcz8uZXZlcnkoKHBhcmFtS2V5LCBpbmRleCkgPT4ge1xuICAgICAgICAgIGlmICh0eXBlb2Ygc3RvcmVkUnVsZUVsZW1lbnQgPT09ICdudW1iZXInIHx8IHR5cGVvZiBzdG9yZWRSdWxlRWxlbWVudCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgc3RvcmVkUGFyYW1zID0gdW53cmFwUnVsZVBhcmFtZXRlcnMoc3RvcmVkUnVsZUVsZW1lbnQuX3BhcmFtcyBhcyBhbnlbXSk7XG4gICAgICAgICAgICBjb25zdCBuZXdQYXJhbXMgPSB1bndyYXBSdWxlUGFyYW1ldGVycyhuZXdSdWxlRWxlbWVudC5fcGFyYW1zIGFzIGFueVtdKTtcbiAgICAgICAgICAgIHJldHVybiBzdG9yZWRQYXJhbXM/LltpbmRleF0gPT09IG5ld1BhcmFtcz8uW2luZGV4XTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gdHJ5U2V0UnVsZVN0YXR1c1JlZihwYXRoOiBzdHJpbmcpOiBTdG9yZWRSdWxlU3RhdHVzIHtcbiAgICBjb25zdCBydWxlU3RhdHVzID0gcnVsZVN0YXR1c1N0b3JhZ2UudmFsdWUuZ2V0KHBhdGgpO1xuICAgIGlmIChydWxlU3RhdHVzKSB7XG4gICAgICByZXR1cm4gcnVsZVN0YXR1cztcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgJHBlbmRpbmcgPSByZWYoZmFsc2UpO1xuICAgICAgY29uc3QgJHZhbGlkID0gcmVmKHRydWUpO1xuICAgICAgY29uc3QgJG1ldGFkYXRhID0gcmVmKHt9KTtcbiAgICAgIGNvbnN0ICR2YWxpZGF0aW5nID0gcmVmKGZhbHNlKTtcbiAgICAgIHJ1bGVTdGF0dXNTdG9yYWdlLnZhbHVlLnNldChwYXRoLCB7ICRwZW5kaW5nLCAkdmFsaWQsICRtZXRhZGF0YSwgJHZhbGlkYXRpbmcgfSk7XG4gICAgICByZXR1cm4geyAkcGVuZGluZywgJHZhbGlkLCAkbWV0YWRhdGEsICR2YWxpZGF0aW5nIH07XG4gICAgfVxuICB9XG5cbiAgb25TY29wZURpc3Bvc2UoKCkgPT4ge1xuICAgIHJ1bGVEZWNsU3RvcmFnZS52YWx1ZS5jbGVhcigpO1xuICAgIGZpZWxkc1N0b3JhZ2UudmFsdWUuY2xlYXIoKTtcbiAgICBjb2xsZWN0aW9uc1N0b3JhZ2UudmFsdWUuY2xlYXIoKTtcbiAgICBkaXJ0eVN0b3JhZ2UudmFsdWUuY2xlYXIoKTtcbiAgICBydWxlU3RhdHVzU3RvcmFnZS52YWx1ZS5jbGVhcigpO1xuICAgIGFycmF5U3RhdHVzU3RvcmFnZS52YWx1ZS5jbGVhcigpO1xuICB9KTtcblxuICByZXR1cm4ge1xuICAgIGFkZFJ1bGVEZWNsRW50cnksXG4gICAgc2V0RGlydHlFbnRyeSxcbiAgICBjaGVja1J1bGVEZWNsRW50cnksXG4gICAgZ2V0RGlydHlTdGF0ZSxcbiAgICB0cnlTZXRSdWxlU3RhdHVzUmVmLFxuICAgIGdldEZpZWxkc0VudHJ5LFxuICAgIGdldENvbGxlY3Rpb25zRW50cnksXG4gICAgZ2V0QXJyYXlTdGF0dXMsXG4gICAgYWRkQXJyYXlTdGF0dXMsXG4gICAgZGVsZXRlQXJyYXlTdGF0dXMsXG4gICAgYXJyYXlTdGF0dXNTdG9yYWdlLFxuICB9O1xufVxuIiwiaW1wb3J0IHR5cGUgeyBSZWYgfSBmcm9tICd2dWUnO1xuaW1wb3J0IHR5cGUge1xuICAkSW50ZXJuYWxGb3JtUHJvcGVydHlUeXBlcyxcbiAgJEludGVybmFsUmVnbGVDb2xsZWN0aW9uUnVsZURlY2wsXG4gICRJbnRlcm5hbFJlZ2xlUGFydGlhbFZhbGlkYXRpb25UcmVlLFxuICAkSW50ZXJuYWxSZWdsZVJ1bGVEZWNsLFxuICBJbmxpbmVSdWxlRGVjbGFyYXRpb24sXG4gIE1heWJlR2V0dGVyLFxuICBSZWdsZVJ1bGVEZWZpbml0aW9uLFxufSBmcm9tICcuLi8uLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBpc09iamVjdCwgdW53cmFwR2V0dGVyIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMnO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNOZXN0ZWRSdWxlc0RlZihcbiAgc3RhdGU6IFJlZjx1bmtub3duPixcbiAgcnVsZXM6IFJlZjwkSW50ZXJuYWxGb3JtUHJvcGVydHlUeXBlcz5cbik6IHJ1bGVzIGlzIFJlZjwkSW50ZXJuYWxSZWdsZVBhcnRpYWxWYWxpZGF0aW9uVHJlZT4ge1xuICByZXR1cm4gKFxuICAgIGlzT2JqZWN0KHN0YXRlLnZhbHVlKSAmJlxuICAgIGlzT2JqZWN0KHJ1bGVzLnZhbHVlKSAmJlxuICAgICFPYmplY3QuZW50cmllcyhydWxlcy52YWx1ZSkuc29tZSgocnVsZSkgPT4gaXNSdWxlRGVmKHJ1bGUpKVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNDb2xsZWN0aW9uUnVsZXNEZWYoXG4gIHJ1bGVzOiBSZWY8JEludGVybmFsRm9ybVByb3BlcnR5VHlwZXMsIGFueT5cbik6IHJ1bGVzIGlzIFJlZjwkSW50ZXJuYWxSZWdsZUNvbGxlY3Rpb25SdWxlRGVjbD4ge1xuICByZXR1cm4gISFydWxlcy52YWx1ZSAmJiAnJGVhY2gnIGluIHJ1bGVzLnZhbHVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZGF0b3JSdWxlc0RlZihcbiAgcnVsZXM6IFJlZjwkSW50ZXJuYWxGb3JtUHJvcGVydHlUeXBlcz5cbik6IHJ1bGVzIGlzIFJlZjwkSW50ZXJuYWxSZWdsZVJ1bGVEZWNsPiB7XG4gIHJldHVybiAhIXJ1bGVzLnZhbHVlICYmIGlzT2JqZWN0KHJ1bGVzLnZhbHVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUnVsZURlZihydWxlOiB1bmtub3duKTogcnVsZSBpcyBSZWdsZVJ1bGVEZWZpbml0aW9uPGFueSwgYW55PiB7XG4gIHJldHVybiBpc09iamVjdChydWxlKSAmJiAnX3ZhbGlkYXRvcicgaW4gcnVsZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRm9ybVJ1bGVEZWZpbml0aW9uKFxuICBydWxlOiBSZWY8dW5rbm93bj5cbik6IHJ1bGUgaXMgUmVmPFJlZ2xlUnVsZURlZmluaXRpb248YW55LCBhbnk+PiB7XG4gIHJldHVybiAhKHR5cGVvZiBydWxlLnZhbHVlID09PSAnZnVuY3Rpb24nKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRm9ybUlubGluZShcbiAgcnVsZTogUmVmPHVua25vd24+XG4pOiBydWxlIGlzIFJlZjxJbmxpbmVSdWxlRGVjbGFyYXRpb248YW55LCBhbnlbXSwgYW55Pj4ge1xuICByZXR1cm4gdHlwZW9mIHJ1bGUudmFsdWUgPT09ICdmdW5jdGlvbic7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1N0YXRlQXJyYXkoc3RhdGU6IFJlZjx1bmtub3duPik6IHN0YXRlIGlzIFJlZjwodW5rbm93biAmIHsgJGlkPzogc3RyaW5nIH0pW10+IHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoc3RhdGUudmFsdWUpO1xufVxuIiwiaW1wb3J0IHR5cGUge1xuICAkSW50ZXJuYWxFeHRlcm5hbFJlZ2xlRXJyb3JzLFxuICAkSW50ZXJuYWxSZWdsZUNvbGxlY3Rpb25TdGF0dXMsXG4gICRJbnRlcm5hbFJlZ2xlRmllbGRTdGF0dXMsXG4gICRJbnRlcm5hbFJlZ2xlUnVsZVN0YXR1cyxcbiAgJEludGVybmFsUmVnbGVTdGF0dXMsXG4gICRJbnRlcm5hbFJlZ2xlU3RhdHVzVHlwZSxcbiAgUmVnbGVFeHRlcm5hbENvbGxlY3Rpb25FcnJvcnMsXG4gIFJlZ2xlRXh0ZXJuYWxFcnJvclRyZWUsXG59IGZyb20gJy4uLy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IGlzT2JqZWN0IH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMnO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNOZXN0ZWRSdWxlc1N0YXR1cyhydWxlOiAkSW50ZXJuYWxSZWdsZVN0YXR1c1R5cGUpOiBydWxlIGlzICRJbnRlcm5hbFJlZ2xlU3RhdHVzIHtcbiAgcmV0dXJuIGlzT2JqZWN0KHJ1bGUpICYmICckZmllbGRzJyBpbiBydWxlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNDb2xsZWN0aW9uUnVsZXNTdGF0dXMoXG4gIHJ1bGU6ICRJbnRlcm5hbFJlZ2xlU3RhdHVzVHlwZVxuKTogcnVsZSBpcyAkSW50ZXJuYWxSZWdsZUNvbGxlY3Rpb25TdGF0dXMge1xuICByZXR1cm4gISFydWxlICYmICckZWFjaCcgaW4gcnVsZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRmllbGRTdGF0dXMocnVsZTogJEludGVybmFsUmVnbGVTdGF0dXNUeXBlKTogcnVsZSBpcyAkSW50ZXJuYWxSZWdsZUZpZWxkU3RhdHVzIHtcbiAgcmV0dXJuICEhcnVsZSAmJiAnJHJ1bGVzJyBpbiBydWxlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNSdWxlU3RhdHVzKHJ1bGU6IHVua25vd24pOiBydWxlIGlzICRJbnRlcm5hbFJlZ2xlUnVsZVN0YXR1cyB7XG4gIHJldHVybiBpc09iamVjdChydWxlKSAmJiAnJHR5cGUnIGluIHJ1bGUgJiYgJyRtZXNzYWdlJyBpbiBydWxlO1xufVxuXG4vLyAgLS0gRXh0ZXJuYWxFcnJvcnNcblxuZXhwb3J0IGZ1bmN0aW9uIGlzTmVzdGVkRXh0ZXJuYWxFcnJvclN0YXR1cyhcbiAgcnVsZTogJEludGVybmFsRXh0ZXJuYWxSZWdsZUVycm9yc1xuKTogcnVsZSBpcyBSZWdsZUV4dGVybmFsRXJyb3JUcmVlPGFueT4ge1xuICByZXR1cm4gISFydWxlICYmICckZWFjaCcgaW4gcnVsZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQ29sbGVjdGlvbkV4dGVybmFsRXJyb3JTdGF0dXMoXG4gIHJ1bGU6ICRJbnRlcm5hbEV4dGVybmFsUmVnbGVFcnJvcnNcbik6IHJ1bGUgaXMgUmVnbGVFeHRlcm5hbENvbGxlY3Rpb25FcnJvcnM8YW55PiB7XG4gIHJldHVybiAhIXJ1bGUgJiYgJyRlYWNoJyBpbiBydWxlO1xufVxuIiwiaW1wb3J0IHR5cGUgeyAkSW50ZXJuYWxFeHRlcm5hbFJlZ2xlRXJyb3JzLCBSZWdsZUV4dGVybmFsQ29sbGVjdGlvbkVycm9ycyB9IGZyb20gJy4uLy4uLy4uL3R5cGVzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGlzRXh0ZXJuYWxFcnJvckNvbGxlY3Rpb24oXG4gIHZhbHVlOiAkSW50ZXJuYWxFeHRlcm5hbFJlZ2xlRXJyb3JzXG4pOiB2YWx1ZSBpcyBSZWdsZUV4dGVybmFsQ29sbGVjdGlvbkVycm9ycyB7XG4gIHJldHVybiAnJGVhY2gnIGluIHZhbHVlIHx8ICckZXJyb3JzJyBpbiB2YWx1ZTtcbn1cbiIsImltcG9ydCB7IGNvbXB1dGVkIH0gZnJvbSAndnVlJztcbmltcG9ydCB0eXBlIHtcbiAgJEludGVybmFsUmVnbGVDb2xsZWN0aW9uU3RhdHVzLFxuICAkSW50ZXJuYWxSZWdsZUVycm9ycyxcbiAgJEludGVybmFsUmVnbGVGaWVsZFN0YXR1cyxcbiAgJEludGVybmFsUmVnbGVSdWxlU3RhdHVzLFxuICAkSW50ZXJuYWxSZWdsZVN0YXR1cyxcbiAgJEludGVybmFsUmVnbGVTdGF0dXNUeXBlLFxufSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBpc0NvbGxlY3Rpb25SdWxlc1N0YXR1cywgaXNGaWVsZFN0YXR1cywgaXNOZXN0ZWRSdWxlc1N0YXR1cyB9IGZyb20gJy4vZ3VhcmRzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RSdWxlc0Vycm9ycyh7XG4gIGZpZWxkLFxuICBzaWxlbnQgPSBmYWxzZSxcbn06IHtcbiAgZmllbGQ6IFBpY2s8JEludGVybmFsUmVnbGVGaWVsZFN0YXR1cywgJyRydWxlcycgfCAnJGRpcnR5JyB8ICckZXh0ZXJuYWxFcnJvcnMnPjtcbiAgc2lsZW50PzogYm9vbGVhbjtcbn0pOiBzdHJpbmdbXSB7XG4gIHJldHVybiBPYmplY3QuZW50cmllcyhmaWVsZC4kcnVsZXMgPz8ge30pXG4gICAgLm1hcCgoW3J1bGVLZXksIHJ1bGVdKSA9PiB7XG4gICAgICBpZiAoc2lsZW50KSB7XG4gICAgICAgIHJldHVybiBydWxlLiRtZXNzYWdlO1xuICAgICAgfSBlbHNlIGlmICghcnVsZS4kdmFsaWQgJiYgZmllbGQuJGRpcnR5KSB7XG4gICAgICAgIHJldHVybiBydWxlLiRtZXNzYWdlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9KVxuICAgIC5maWx0ZXIoKG1zZyk6IG1zZyBpcyBzdHJpbmcgfCBzdHJpbmdbXSA9PiAhIW1zZylcbiAgICAucmVkdWNlPHN0cmluZ1tdPigoYWNjLCB2YWx1ZSkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIGFjYz8uY29uY2F0KFt2YWx1ZV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGFjYz8uY29uY2F0KHZhbHVlKTtcbiAgICAgIH1cbiAgICB9LCBbXSlcbiAgICAuY29uY2F0KGZpZWxkLiRleHRlcm5hbEVycm9ycyA/PyBbXSk7XG59XG5cbmZ1bmN0aW9uIHByb2Nlc3NGaWVsZEVycm9ycyhcbiAgZmllbGRTdGF0dXM6ICRJbnRlcm5hbFJlZ2xlU3RhdHVzVHlwZSxcbiAgc2lsZW50ID0gZmFsc2Vcbik6ICRJbnRlcm5hbFJlZ2xlRXJyb3JzIHtcbiAgaWYgKGlzTmVzdGVkUnVsZXNTdGF0dXMoZmllbGRTdGF0dXMpKSB7XG4gICAgcmV0dXJuIGV4dHJhY3ROZXN0ZWRFcnJvcnMoZmllbGRTdGF0dXMuJGZpZWxkcyk7XG4gIH0gZWxzZSBpZiAoaXNDb2xsZWN0aW9uUnVsZXNTdGF0dXMoZmllbGRTdGF0dXMpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICRlcnJvcnM6IGZpZWxkU3RhdHVzLiRmaWVsZC4kcnVsZXNcbiAgICAgICAgPyBleHRyYWN0UnVsZXNFcnJvcnMoeyBmaWVsZDogZmllbGRTdGF0dXMuJGZpZWxkLCBzaWxlbnQgfSlcbiAgICAgICAgOiBbXSxcbiAgICAgICRlYWNoOiBmaWVsZFN0YXR1cy4kZWFjaC5tYXAoKGZpZWxkKSA9PiBwcm9jZXNzRmllbGRFcnJvcnMoZmllbGQsIHNpbGVudCkpLFxuICAgIH07XG4gIH0gZWxzZSBpZiAoaXNGaWVsZFN0YXR1cyhmaWVsZFN0YXR1cykpIHtcbiAgICBpZiAoZmllbGRTdGF0dXMuJGVycm9yKSB7XG4gICAgICByZXR1cm4gZXh0cmFjdFJ1bGVzRXJyb3JzKHtcbiAgICAgICAgZmllbGQ6IGZpZWxkU3RhdHVzLFxuICAgICAgICBzaWxlbnQsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZpZWxkU3RhdHVzLiRleHRlcm5hbEVycm9ycyA/PyBbXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFtdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdENvbGxlY3Rpb25FcnJvcihcbiAgZWFjaDogJEludGVybmFsUmVnbGVTdGF0dXNUeXBlW10sXG4gIHNpbGVudCA9IGZhbHNlXG4pOiAkSW50ZXJuYWxSZWdsZUVycm9yc1tdIHtcbiAgcmV0dXJuIGVhY2gubWFwKChmaWVsZCkgPT4gcHJvY2Vzc0ZpZWxkRXJyb3JzKGZpZWxkLCBzaWxlbnQpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3ROZXN0ZWRFcnJvcnMoXG4gIGZpZWxkczogUmVjb3JkPHN0cmluZywgJEludGVybmFsUmVnbGVTdGF0dXNUeXBlPiB8ICRJbnRlcm5hbFJlZ2xlU3RhdHVzVHlwZVtdLFxuICBzaWxlbnQgPSBmYWxzZVxuKTogUmVjb3JkPHN0cmluZywgJEludGVybmFsUmVnbGVFcnJvcnM+IHtcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBPYmplY3QuZW50cmllcyhmaWVsZHMpLm1hcCgoW2ZpZWxkS2V5LCBmaWVsZFN0YXR1c10pID0+IHtcbiAgICAgIGlmIChpc05lc3RlZFJ1bGVzU3RhdHVzKGZpZWxkU3RhdHVzKSkge1xuICAgICAgICByZXR1cm4gW2ZpZWxkS2V5LCBleHRyYWN0TmVzdGVkRXJyb3JzKGZpZWxkU3RhdHVzLiRmaWVsZHMsIHNpbGVudCldO1xuICAgICAgfSBlbHNlIGlmIChpc0NvbGxlY3Rpb25SdWxlc1N0YXR1cyhmaWVsZFN0YXR1cykpIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICBmaWVsZEtleSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICAkZXJyb3JzOiBleHRyYWN0UnVsZXNFcnJvcnMoeyBmaWVsZDogZmllbGRTdGF0dXMuJGZpZWxkLCBzaWxlbnQgfSksXG4gICAgICAgICAgICAkZWFjaDogZXh0cmFjdENvbGxlY3Rpb25FcnJvcihmaWVsZFN0YXR1cy4kZWFjaCwgc2lsZW50KSxcbiAgICAgICAgICB9LFxuICAgICAgICBdO1xuICAgICAgfSBlbHNlIGlmIChpc0ZpZWxkU3RhdHVzKGZpZWxkU3RhdHVzKSkge1xuICAgICAgICBpZiAoZmllbGRTdGF0dXMuJGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIGZpZWxkS2V5LFxuICAgICAgICAgICAgZXh0cmFjdFJ1bGVzRXJyb3JzKHtcbiAgICAgICAgICAgICAgZmllbGQ6IGZpZWxkU3RhdHVzLFxuICAgICAgICAgICAgICBzaWxlbnQsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICBdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBbZmllbGRLZXksIGZpZWxkU3RhdHVzLiRleHRlcm5hbEVycm9ycyA/PyBbXV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBbZmllbGRLZXksIFtdXTtcbiAgICB9KVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlRXJyb3JzKCRyZWdsZTogJEludGVybmFsUmVnbGVTdGF0dXMpIHtcbiAgY29uc3QgZXJyb3JzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIHJldHVybiBleHRyYWN0TmVzdGVkRXJyb3JzKCRyZWdsZS4kZmllbGRzKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGVycm9ycztcbn1cbiIsImltcG9ydCB0eXBlIHsgTWF5YmUgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgdHlwZSB7XG4gIFBvc3NpYmxlUmVnbGVSdWxlTWV0YWRhdGFDb25zdW1lcixcbiAgUmVnbGVSdWxlTWV0YWRhdGFEZWZpbml0aW9uLFxufSBmcm9tICcuL3J1bGUuZGVmaW5pdGlvbi50eXBlJztcbmltcG9ydCB0eXBlIHsgUmVnbGVVbml2ZXJzYWxQYXJhbXMgfSBmcm9tICcuL3J1bGUucGFyYW1zLnR5cGVzJztcblxuLyoqXG4gKiBJbnRlcm5hbCBkZWZpbml0aW9uIG9mIHRoZSBydWxlLCBjYW4gYmUgdXNlZCB0byByZXNldCBvciBwYXRjaCB0aGUgcnVsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlZ2xlSW50ZXJuYWxSdWxlRGVmczxcbiAgVFZhbHVlIGV4dGVuZHMgYW55ID0gYW55LFxuICBUUGFyYW1zIGV4dGVuZHMgYW55W10gPSBbXSxcbiAgVEFzeW5jIGV4dGVuZHMgYm9vbGVhbiA9IGZhbHNlLFxuICBUTWV0YWRhdGEgZXh0ZW5kcyBSZWdsZVJ1bGVNZXRhZGF0YURlZmluaXRpb24gPSBib29sZWFuLFxuPiB7XG4gIF92YWxpZGF0b3I6IChcbiAgICB2YWx1ZTogTWF5YmU8VFZhbHVlPixcbiAgICAuLi5hcmdzOiBUUGFyYW1zXG4gICkgPT4gVEFzeW5jIGV4dGVuZHMgZmFsc2UgPyBUTWV0YWRhdGEgOiBQcm9taXNlPFRNZXRhZGF0YT47XG4gIF9tZXNzYWdlOlxuICAgIHwgc3RyaW5nXG4gICAgfCBzdHJpbmdbXVxuICAgIHwgKCh2YWx1ZTogTWF5YmU8VFZhbHVlPiwgbWV0YWRhdGE6IFBvc3NpYmxlUmVnbGVSdWxlTWV0YWRhdGFDb25zdW1lcikgPT4gc3RyaW5nIHwgc3RyaW5nW10pO1xuICBfYWN0aXZlPzpcbiAgICB8IGJvb2xlYW5cbiAgICB8ICgodmFsdWU6IE1heWJlPFRWYWx1ZT4sIG1ldGFkYXRhOiBQb3NzaWJsZVJlZ2xlUnVsZU1ldGFkYXRhQ29uc3VtZXIpID0+IGJvb2xlYW4pO1xuICBfdHlwZT86IHN0cmluZztcbiAgX3BhdGNoZWQ6IGJvb2xlYW47XG4gIF9wYXJhbXM/OiBSZWdsZVVuaXZlcnNhbFBhcmFtczxUUGFyYW1zPjtcbiAgX2FzeW5jOiBUQXN5bmM7XG59XG5cbmV4cG9ydCBlbnVtIEludGVybmFsUnVsZVR5cGUge1xuICBJbmxpbmUgPSAnX19pbmxpbmUnLFxuICBBc3luYyA9ICdfX2FzeW5jJyxcbn1cbiIsImltcG9ydCB0eXBlIHsgUmVmIH0gZnJvbSAndnVlJztcbmltcG9ydCB7IGNvbXB1dGVkLCB0b1JlZnMgfSBmcm9tICd2dWUnO1xuaW1wb3J0IHR5cGUgeyBSZWdsZVZhbGlkYXRpb25Hcm91cEVudHJ5IH0gZnJvbSAnLi4vY29yZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUJvb2xlYW5Hcm91cFByb3BlcnRpZXMoXG4gIGVudHJpZXM6IFJlZjxSZWdsZVZhbGlkYXRpb25Hcm91cEVudHJ5W10+LFxuICBwcm9wZXJ0eTogRXh0cmFjdDxcbiAgICBrZXlvZiBSZWdsZVZhbGlkYXRpb25Hcm91cEVudHJ5LFxuICAgICckaW52YWxpZCcgfCAnJGVycm9yJyB8ICckcGVuZGluZycgfCAnJGRpcnR5JyB8ICckdmFsaWQnXG4gID5cbikge1xuICByZXR1cm4gY29tcHV0ZWQoKCkgPT4ge1xuICAgIHJldHVybiBlbnRyaWVzLnZhbHVlLnNvbWUoKGVudHJ5KSA9PiB7XG4gICAgICByZXR1cm4gZW50cnlbcHJvcGVydHldO1xuICAgIH0pO1xuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUFycmF5R3JvdXBQcm9wZXJ0aWVzKFxuICBlbnRyaWVzOiBSZWY8UmVnbGVWYWxpZGF0aW9uR3JvdXBFbnRyeVtdPixcbiAgcHJvcGVydHk6IEV4dHJhY3Q8a2V5b2YgUmVnbGVWYWxpZGF0aW9uR3JvdXBFbnRyeSwgJyRlcnJvcnMnIHwgJyRzaWxlbnRFcnJvcnMnPlxuKSB7XG4gIHJldHVybiBjb21wdXRlZCgoKSA9PiB7XG4gICAgcmV0dXJuIGVudHJpZXMudmFsdWUucmVkdWNlKChhbGwsIGVudHJ5KSA9PiB7XG4gICAgICBjb25zdCBmZXRjaGVkUHJvcGVydHkgPSBlbnRyeVtwcm9wZXJ0eV0gfHwgW107XG4gICAgICByZXR1cm4gYWxsLmNvbmNhdChmZXRjaGVkUHJvcGVydHkpO1xuICAgIH0sIFtdIGFzIHN0cmluZ1tdKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgdHlwZSB7IENvbXB1dGVkUmVmLCBSZWYgfSBmcm9tICd2dWUnO1xuaW1wb3J0IHsgY29tcHV0ZWQsIGVmZmVjdFNjb3BlLCByZWFjdGl2ZSwgdG9SYXcsIHdhdGNoIH0gZnJvbSAndnVlJztcbmltcG9ydCB0eXBlIHtcbiAgJEludGVybmFsUmVnbGVSdWxlTWV0YWRhdGFDb25zdW1lcixcbiAgJEludGVybmFsUmVnbGVSdWxlU3RhdHVzLFxuICBDdXN0b21SdWxlc0RlY2xhcmF0aW9uVHJlZSxcbiAgSW5saW5lUnVsZURlY2xhcmF0aW9uLFxuICBSZWdsZVJ1bGVEZWZpbml0aW9uLFxuICBSZWdsZVJ1bGVEZWZpbml0aW9uUHJvY2Vzc29yLFxuICBSZWdsZVJ1bGVNZXRhZGF0YURlZmluaXRpb24sXG59IGZyb20gJy4uLy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IEludGVybmFsUnVsZVR5cGUgfSBmcm9tICcuLi8uLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBkZWJvdW5jZSwgaXNFbXB0eSB9IGZyb20gJy4uLy4uLy4uL3V0aWxzJztcbmltcG9ydCB7IHVud3JhcFJ1bGVQYXJhbWV0ZXJzIH0gZnJvbSAnLi4vLi4vY3JlYXRlUnVsZS91bndyYXBSdWxlUGFyYW1ldGVycyc7XG5pbXBvcnQgdHlwZSB7IFJlZ2xlU3RvcmFnZSB9IGZyb20gJy4uLy4uL3VzZVN0b3JhZ2UnO1xuaW1wb3J0IHsgaXNGb3JtUnVsZURlZmluaXRpb24gfSBmcm9tICcuLi9ndWFyZHMnO1xuXG5pbnRlcmZhY2UgQ3JlYXRlUmVhY3RpdmVSdWxlU3RhdHVzT3B0aW9ucyB7XG4gIHN0YXRlOiBSZWY8dW5rbm93bj47XG4gIHJ1bGVLZXk6IHN0cmluZztcbiAgcnVsZTogUmVmPElubGluZVJ1bGVEZWNsYXJhdGlvbjxhbnksIGFueVtdLCBhbnk+IHwgUmVnbGVSdWxlRGVmaW5pdGlvbjxhbnksIGFueSwgYW55Pj47XG4gICRkaXJ0eTogUmVmPGJvb2xlYW4+O1xuICBjdXN0b21NZXNzYWdlcz86IFBhcnRpYWw8Q3VzdG9tUnVsZXNEZWNsYXJhdGlvblRyZWU+O1xuICBwYXRoOiBzdHJpbmc7XG4gIHN0b3JhZ2U6IFJlZ2xlU3RvcmFnZTtcbiAgJGRlYm91bmNlPzogbnVtYmVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVhY3RpdmVSdWxlU3RhdHVzKHtcbiAgJGRpcnR5LFxuICBjdXN0b21NZXNzYWdlcyxcbiAgcnVsZSxcbiAgcnVsZUtleSxcbiAgc3RhdGUsXG4gIHBhdGgsXG4gIHN0b3JhZ2UsXG4gICRkZWJvdW5jZSxcbn06IENyZWF0ZVJlYWN0aXZlUnVsZVN0YXR1c09wdGlvbnMpOiAkSW50ZXJuYWxSZWdsZVJ1bGVTdGF0dXMge1xuICB0eXBlIFNjb3BlU3RhdGUgPSB7XG4gICAgJGFjdGl2ZTogQ29tcHV0ZWRSZWY8Ym9vbGVhbj47XG4gICAgJG1lc3NhZ2U6IENvbXB1dGVkUmVmPHN0cmluZyB8IHN0cmluZ1tdPjtcbiAgICAkdHlwZTogQ29tcHV0ZWRSZWY8c3RyaW5nPjtcbiAgICAkdmFsaWRhdG9yOiBDb21wdXRlZFJlZjxcbiAgICAgIFJlZ2xlUnVsZURlZmluaXRpb25Qcm9jZXNzb3I8XG4gICAgICAgIGFueSxcbiAgICAgICAgYW55LFxuICAgICAgICBSZWdsZVJ1bGVNZXRhZGF0YURlZmluaXRpb24gfCBQcm9taXNlPFJlZ2xlUnVsZU1ldGFkYXRhRGVmaW5pdGlvbj5cbiAgICAgID5cbiAgICA+O1xuICAgICRwYXJhbXM6IENvbXB1dGVkUmVmPGFueVtdPjtcbiAgICAkcGF0aDogQ29tcHV0ZWRSZWY8c3RyaW5nPjtcbiAgfTtcbiAgbGV0IHNjb3BlID0gZWZmZWN0U2NvcGUoKTtcbiAgbGV0IHNjb3BlU3RhdGUhOiBTY29wZVN0YXRlO1xuXG4gIGxldCAkdW53YXRjaFN0YXRlOiAoKSA9PiB2b2lkO1xuXG4gIGNvbnN0IHsgJHBlbmRpbmcsICR2YWxpZCwgJG1ldGFkYXRhLCAkdmFsaWRhdGluZyB9ID0gc3RvcmFnZS50cnlTZXRSdWxlU3RhdHVzUmVmKFxuICAgIGAke3BhdGh9LiR7cnVsZUtleX1gXG4gICk7XG5cbiAgZnVuY3Rpb24gJHdhdGNoKCkge1xuICAgIHNjb3BlU3RhdGUgPSBzY29wZS5ydW4oKCkgPT4ge1xuICAgICAgY29uc3QgJGRlZmF1bHRNZXRhZGF0YSA9IGNvbXB1dGVkPCRJbnRlcm5hbFJlZ2xlUnVsZU1ldGFkYXRhQ29uc3VtZXI+KCgpID0+ICh7XG4gICAgICAgICRpbnZhbGlkOiAhJHZhbGlkLnZhbHVlLFxuICAgICAgICAkcGFyYW1zOiAkcGFyYW1zLnZhbHVlLFxuICAgICAgICAuLi4kbWV0YWRhdGEudmFsdWUsXG4gICAgICB9KSk7XG5cbiAgICAgIGNvbnN0ICRhY3RpdmUgPSBjb21wdXRlZDxib29sZWFuPigoKSA9PiB7XG4gICAgICAgIGlmIChpc0Zvcm1SdWxlRGVmaW5pdGlvbihydWxlKSkge1xuICAgICAgICAgIGlmICh0eXBlb2YgcnVsZS52YWx1ZS5hY3RpdmUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiBydWxlLnZhbHVlLmFjdGl2ZShzdGF0ZS52YWx1ZSwgJGRlZmF1bHRNZXRhZGF0YS52YWx1ZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBydWxlLnZhbHVlLmFjdGl2ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCAkbWVzc2FnZSA9IGNvbXB1dGVkPHN0cmluZyB8IHN0cmluZ1tdPigoKSA9PiB7XG4gICAgICAgIGxldCBtZXNzYWdlOiBzdHJpbmcgfCBzdHJpbmdbXSA9ICcnO1xuICAgICAgICBjb25zdCBjdXN0b21NZXNzYWdlUnVsZSA9IGN1c3RvbU1lc3NhZ2VzID8gY3VzdG9tTWVzc2FnZXNbcnVsZUtleV0/Lm1lc3NhZ2UgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKGN1c3RvbU1lc3NhZ2VSdWxlKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBjdXN0b21NZXNzYWdlUnVsZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgbWVzc2FnZSA9IGN1c3RvbU1lc3NhZ2VSdWxlKHN0YXRlLnZhbHVlLCAkZGVmYXVsdE1ldGFkYXRhLnZhbHVlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbWVzc2FnZSA9IGN1c3RvbU1lc3NhZ2VSdWxlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNGb3JtUnVsZURlZmluaXRpb24ocnVsZSkpIHtcbiAgICAgICAgICBpZiAoIShjdXN0b21NZXNzYWdlUnVsZSAmJiAhcnVsZS52YWx1ZS5fcGF0Y2hlZCkpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcnVsZS52YWx1ZS5tZXNzYWdlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgIG1lc3NhZ2UgPSBydWxlLnZhbHVlLm1lc3NhZ2Uoc3RhdGUudmFsdWUsICRkZWZhdWx0TWV0YWRhdGEudmFsdWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbWVzc2FnZSA9IHJ1bGUudmFsdWUubWVzc2FnZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNFbXB0eShtZXNzYWdlKSkge1xuICAgICAgICAgIG1lc3NhZ2UgPSAnRXJyb3InO1xuICAgICAgICAgIGNvbnNvbGUud2FybihgTm8gZXJyb3IgbWVzc2FnZSBkZWZpbmVkIGZvciAke3BhdGh9LiR7cnVsZUtleX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0ICR0eXBlID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBpZiAoaXNGb3JtUnVsZURlZmluaXRpb24ocnVsZSkgJiYgcnVsZS52YWx1ZS50eXBlKSB7XG4gICAgICAgICAgcmV0dXJuIHJ1bGUudmFsdWUudHlwZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gcnVsZUtleTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0ICR2YWxpZGF0b3IgPSBjb21wdXRlZDxcbiAgICAgICAgUmVnbGVSdWxlRGVmaW5pdGlvblByb2Nlc3NvcjxhbnksIGFueSwgYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj4+XG4gICAgICA+KCgpID0+IHtcbiAgICAgICAgaWYgKGlzRm9ybVJ1bGVEZWZpbml0aW9uKHJ1bGUpKSB7XG4gICAgICAgICAgcmV0dXJuIHJ1bGUudmFsdWUudmFsaWRhdG9yO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBydWxlLnZhbHVlIGFzIElubGluZVJ1bGVEZWNsYXJhdGlvbjxhbnksIGFueVtdLCBhbnk+O1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgJHBhcmFtcyA9IGNvbXB1dGVkPGFueVtdPigoKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgcnVsZS52YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW53cmFwUnVsZVBhcmFtZXRlcnMocnVsZS52YWx1ZS5fcGFyYW1zID8/IFtdKTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCAkcGF0aCA9IGNvbXB1dGVkPHN0cmluZz4oKCkgPT4gYCR7cGF0aH0uJHskdHlwZS52YWx1ZX1gKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgJGFjdGl2ZSxcbiAgICAgICAgJG1lc3NhZ2UsXG4gICAgICAgICR0eXBlLFxuICAgICAgICAkdmFsaWRhdG9yLFxuICAgICAgICAkcGFyYW1zLFxuICAgICAgICAkcGF0aCxcbiAgICAgIH0gc2F0aXNmaWVzIFNjb3BlU3RhdGU7XG4gICAgfSkhO1xuXG4gICAgJHVud2F0Y2hTdGF0ZSA9IHdhdGNoKHNjb3BlU3RhdGUuJHBhcmFtcywgJHZhbGlkYXRlLCB7XG4gICAgICBkZWVwOiB0cnVlLFxuICAgIH0pO1xuICB9XG5cbiAgJHdhdGNoKCk7XG5cbiAgYXN5bmMgZnVuY3Rpb24gY29tcHV0ZUFzeW5jUmVzdWx0KHByb21pc2U6IFByb21pc2U8UmVnbGVSdWxlTWV0YWRhdGFEZWZpbml0aW9uPikge1xuICAgIGxldCBydWxlUmVzdWx0ID0gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgICR2YWxpZC52YWx1ZSA9IHRydWU7XG4gICAgICBpZiAoJGRpcnR5LnZhbHVlKSB7XG4gICAgICAgICRwZW5kaW5nLnZhbHVlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHByb21pc2VSZXN1bHQgPSBhd2FpdCBwcm9taXNlO1xuICAgICAgaWYgKHR5cGVvZiBwcm9taXNlUmVzdWx0ID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgcnVsZVJlc3VsdCA9IHByb21pc2VSZXN1bHQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB7ICR2YWxpZCwgLi4ucmVzdCB9ID0gcHJvbWlzZVJlc3VsdDtcbiAgICAgICAgcnVsZVJlc3VsdCA9ICR2YWxpZDtcbiAgICAgICAgJG1ldGFkYXRhLnZhbHVlID0gcmVzdDtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBydWxlUmVzdWx0ID0gZmFsc2U7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgICRwZW5kaW5nLnZhbHVlID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJ1bGVSZXN1bHQ7XG4gIH1cblxuICBjb25zdCAkY29tcHV0ZUFzeW5jRGVib3VuY2UgPSBkZWJvdW5jZShjb21wdXRlQXN5bmNSZXN1bHQsICRkZWJvdW5jZSA/PyAxMDApO1xuXG4gIGFzeW5jIGZ1bmN0aW9uICR2YWxpZGF0ZSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAkdmFsaWRhdGluZy52YWx1ZSA9IHRydWU7XG4gICAgY29uc3QgdmFsaWRhdG9yID0gc2NvcGVTdGF0ZS4kdmFsaWRhdG9yLnZhbHVlO1xuICAgIGxldCBydWxlUmVzdWx0ID0gZmFsc2U7XG4gICAgY29uc3QgcmVzdWx0T3JQcm9taXNlID0gdmFsaWRhdG9yKHN0YXRlLnZhbHVlLCAuLi5zY29wZVN0YXRlLiRwYXJhbXMudmFsdWUpO1xuXG4gICAgaWYgKHJlc3VsdE9yUHJvbWlzZSBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgIGNvbnN0IHByb21pc2VEZWJvdW5jZSA9ICRjb21wdXRlQXN5bmNEZWJvdW5jZShyZXN1bHRPclByb21pc2UpO1xuICAgICAgcnVsZVJlc3VsdCA9IGF3YWl0IHByb21pc2VEZWJvdW5jZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHJlc3VsdE9yUHJvbWlzZSAhPSBudWxsKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcmVzdWx0T3JQcm9taXNlID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICBydWxlUmVzdWx0ID0gcmVzdWx0T3JQcm9taXNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHsgJHZhbGlkLCAuLi5yZXN0IH0gPSByZXN1bHRPclByb21pc2U7XG4gICAgICAgICAgcnVsZVJlc3VsdCA9ICR2YWxpZDtcbiAgICAgICAgICAkbWV0YWRhdGEudmFsdWUgPSByZXN0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgICR2YWxpZC52YWx1ZSA9IHJ1bGVSZXN1bHQ7XG5cbiAgICAkdmFsaWRhdGluZy52YWx1ZSA9IGZhbHNlO1xuXG4gICAgcmV0dXJuIHJ1bGVSZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiAkcmVzZXQoKSB7XG4gICAgJHZhbGlkLnZhbHVlID0gdHJ1ZTtcbiAgICAkbWV0YWRhdGEudmFsdWUgPSB7fTtcbiAgICAkcGVuZGluZy52YWx1ZSA9IGZhbHNlO1xuICAgICR2YWxpZGF0aW5nLnZhbHVlID0gZmFsc2U7XG5cbiAgICAkd2F0Y2goKTtcbiAgfVxuXG4gIGZ1bmN0aW9uICR1bndhdGNoKCkge1xuICAgICR1bndhdGNoU3RhdGUoKTtcbiAgICBzY29wZS5zdG9wKCk7XG4gICAgc2NvcGUgPSBlZmZlY3RTY29wZSgpO1xuICB9XG5cbiAgcmV0dXJuIHJlYWN0aXZlKHtcbiAgICAuLi5zY29wZVN0YXRlLFxuICAgICRwZW5kaW5nLFxuICAgICR2YWxpZCxcbiAgICAkbWV0YWRhdGEsXG4gICAgJHZhbGlkYXRlLFxuICAgICR1bndhdGNoLFxuICAgICR3YXRjaCxcbiAgICAkcmVzZXQsXG4gIH0pIHNhdGlzZmllcyAkSW50ZXJuYWxSZWdsZVJ1bGVTdGF0dXM7XG59XG4iLCJpbXBvcnQgdHlwZSB7IENvbXB1dGVkUmVmLCBSZWYsIFdhdGNoU3RvcEhhbmRsZSB9IGZyb20gJ3Z1ZSc7XG5pbXBvcnQgeyBjb21wdXRlZCwgZWZmZWN0U2NvcGUsIHJlYWN0aXZlLCByZWYsIHRvUmVmLCB1bnJlZiwgd2F0Y2ggfSBmcm9tICd2dWUnO1xuaW1wb3J0IHR5cGUge1xuICAkSW50ZXJuYWxSZWdsZUZpZWxkU3RhdHVzLFxuICAkSW50ZXJuYWxSZWdsZVJ1bGVEZWNsLFxuICAkSW50ZXJuYWxSZWdsZVJ1bGVTdGF0dXMsXG4gIEN1c3RvbVJ1bGVzRGVjbGFyYXRpb25UcmVlLFxuICBGaWVsZFJlZ2xlQmVoYXZpb3VyT3B0aW9ucyxcbiAgUmVnbGVSdWxlRGVjbCxcbiAgUmVzb2x2ZWRSZWdsZUJlaGF2aW91ck9wdGlvbnMsXG59IGZyb20gJy4uLy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IGRlYm91bmNlLCBpc0VtcHR5LCBpc1Z1ZVN1cGVyaW9yT3JFcXVhbFRvM2RvdEZpdmUgfSBmcm9tICcuLi8uLi8uLi91dGlscyc7XG5pbXBvcnQgdHlwZSB7IFJlZ2xlU3RvcmFnZSB9IGZyb20gJy4uLy4uL3VzZVN0b3JhZ2UnO1xuaW1wb3J0IHsgZXh0cmFjdFJ1bGVzRXJyb3JzIH0gZnJvbSAnLi4vdXNlRXJyb3JzJztcbmltcG9ydCB7IGNyZWF0ZVJlYWN0aXZlUnVsZVN0YXR1cyB9IGZyb20gJy4vY3JlYXRlUmVhY3RpdmVSdWxlU3RhdHVzJztcblxuaW50ZXJmYWNlIENyZWF0ZVJlYWN0aXZlRmllbGRTdGF0dXNBcmdzIHtcbiAgc3RhdGU6IFJlZjx1bmtub3duPjtcbiAgcnVsZXNEZWY6IFJlZjwkSW50ZXJuYWxSZWdsZVJ1bGVEZWNsPjtcbiAgY3VzdG9tTWVzc2FnZXM/OiBDdXN0b21SdWxlc0RlY2xhcmF0aW9uVHJlZTtcbiAgcGF0aDogc3RyaW5nO1xuICBpbmRleD86IG51bWJlcjtcbiAgc3RvcmFnZTogUmVnbGVTdG9yYWdlO1xuICBvcHRpb25zOiBSZXNvbHZlZFJlZ2xlQmVoYXZpb3VyT3B0aW9ucztcbiAgZXh0ZXJuYWxFcnJvcnM6IFJlYWRvbmx5PFJlZjxzdHJpbmdbXSB8IHVuZGVmaW5lZD4+O1xuICBvblVud2F0Y2g/OiAoKSA9PiB2b2lkO1xufVxuXG50eXBlIFNjb3BlUmV0dXJuU3RhdGUgPSB7XG4gICRlcnJvcjogQ29tcHV0ZWRSZWY8Ym9vbGVhbj47XG4gICRlcnJvcnM6IENvbXB1dGVkUmVmPHN0cmluZ1tdPjtcbiAgJHNpbGVudEVycm9yczogQ29tcHV0ZWRSZWY8c3RyaW5nW10+O1xuICAkcGVuZGluZzogQ29tcHV0ZWRSZWY8Ym9vbGVhbj47XG4gICRpbnZhbGlkOiBDb21wdXRlZFJlZjxib29sZWFuPjtcbiAgJHZhbGlkOiBDb21wdXRlZFJlZjxib29sZWFuPjtcbiAgJGRlYm91bmNlOiBDb21wdXRlZFJlZjxudW1iZXIgfCB1bmRlZmluZWQ+O1xuICAkbGF6eTogQ29tcHV0ZWRSZWY8Ym9vbGVhbiB8IHVuZGVmaW5lZD47XG4gICRyZXdhcmRFYXJseTogQ29tcHV0ZWRSZWY8Ym9vbGVhbiB8IHVuZGVmaW5lZD47XG4gICRhdXRvRGlydHk6IENvbXB1dGVkUmVmPGJvb2xlYW4gfCB1bmRlZmluZWQ+O1xuICAkYW55RGlydHk6IENvbXB1dGVkUmVmPGJvb2xlYW4+O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlYWN0aXZlRmllbGRTdGF0dXMoe1xuICBzdGF0ZSxcbiAgcnVsZXNEZWYsXG4gIGN1c3RvbU1lc3NhZ2VzLFxuICBwYXRoLFxuICBzdG9yYWdlLFxuICBvcHRpb25zLFxuICBleHRlcm5hbEVycm9ycyxcbiAgaW5kZXgsXG4gIG9uVW53YXRjaCxcbn06IENyZWF0ZVJlYWN0aXZlRmllbGRTdGF0dXNBcmdzKTogJEludGVybmFsUmVnbGVGaWVsZFN0YXR1cyB7XG4gIGxldCBzY29wZSA9IGVmZmVjdFNjb3BlKCk7XG4gIGxldCBzY29wZVN0YXRlITogU2NvcGVSZXR1cm5TdGF0ZTtcblxuICBjb25zdCAkZGlydHkgPSByZWYoZmFsc2UpO1xuXG4gIGNvbnN0IHRyaWdnZXJQdW5pc2htZW50ID0gcmVmKGZhbHNlKTtcblxuICBjb25zdCAkZXh0ZXJuYWxFcnJvcnMgPSByZWY8c3RyaW5nW10gfCB1bmRlZmluZWQ+KFtdKTtcblxuICBsZXQgJHVud2F0Y2hTdGF0ZTogV2F0Y2hTdG9wSGFuZGxlO1xuICBsZXQgJHVud2F0Y2hWYWxpZDogV2F0Y2hTdG9wSGFuZGxlO1xuICBsZXQgJHVud2F0Y2hFeHRlcm5hbEVycm9yczogV2F0Y2hTdG9wSGFuZGxlO1xuICBsZXQgJHVud2F0Y2hEaXJ0eTogV2F0Y2hTdG9wSGFuZGxlO1xuXG4gIGxldCAkY29tbWl0ID0gKCkgPT4ge307XG5cbiAgZnVuY3Rpb24gY29sbGVjdEV4dGVybmFsRXJyb3JzKCkge1xuICAgICRleHRlcm5hbEVycm9ycy52YWx1ZSA9IGV4dGVybmFsRXJyb3JzLnZhbHVlID8/IFtdO1xuICB9XG4gIGNvbGxlY3RFeHRlcm5hbEVycm9ycygpO1xuXG4gIGZ1bmN0aW9uIGNyZWF0ZVJlYWN0aXZlUnVsZXNSZXN1bHQoKSB7XG4gICAgY29uc3QgZGVjbGFyZWRSdWxlcyA9IHJ1bGVzRGVmLnZhbHVlIGFzIFJlZ2xlUnVsZURlY2w8YW55LCBhbnk+O1xuICAgIGNvbnN0IHN0b3JlUmVzdWx0ID0gc3RvcmFnZS5jaGVja1J1bGVEZWNsRW50cnkocGF0aCwgZGVjbGFyZWRSdWxlcyk7XG5cbiAgICAkbG9jYWxPcHRpb25zLnZhbHVlID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXMoZGVjbGFyZWRSdWxlcykuZmlsdGVyKChbcnVsZUtleV0pID0+IHJ1bGVLZXkuc3RhcnRzV2l0aCgnJCcpKVxuICAgICk7XG5cbiAgICAkcnVsZXMudmFsdWUgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyhydWxlc0RlZi52YWx1ZSlcbiAgICAgICAgLmZpbHRlcigoW3J1bGVLZXldKSA9PiAhcnVsZUtleS5zdGFydHNXaXRoKCckJykpXG4gICAgICAgIC5tYXAoKFtydWxlS2V5LCBydWxlXSkgPT4ge1xuICAgICAgICAgIGlmIChydWxlKSB7XG4gICAgICAgICAgICBjb25zdCBydWxlUmVmID0gdG9SZWYoKCkgPT4gcnVsZSk7XG4gICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICBydWxlS2V5LFxuICAgICAgICAgICAgICBjcmVhdGVSZWFjdGl2ZVJ1bGVTdGF0dXMoe1xuICAgICAgICAgICAgICAgICRkaXJ0eSxcbiAgICAgICAgICAgICAgICBjdXN0b21NZXNzYWdlcyxcbiAgICAgICAgICAgICAgICBydWxlOiBydWxlUmVmIGFzIGFueSxcbiAgICAgICAgICAgICAgICBydWxlS2V5LFxuICAgICAgICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICAgICAgc3RvcmFnZSxcbiAgICAgICAgICAgICAgICAkZGVib3VuY2U6ICRsb2NhbE9wdGlvbnMudmFsdWUuJGRlYm91bmNlLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfSlcbiAgICAgICAgLmZpbHRlcigocnVsZURlZik6IHJ1bGVEZWYgaXMgW3N0cmluZywgJEludGVybmFsUmVnbGVSdWxlU3RhdHVzXSA9PiAhIXJ1bGVEZWYubGVuZ3RoKVxuICAgICk7XG5cbiAgICAkd2F0Y2goKTtcblxuICAgICRjb21taXQgPSBzY29wZVN0YXRlLiRkZWJvdW5jZS52YWx1ZVxuICAgICAgPyBkZWJvdW5jZSgkY29tbWl0SGFuZGxlciwgc2NvcGVTdGF0ZS4kZGVib3VuY2UudmFsdWUgPz8gMClcbiAgICAgIDogJGNvbW1pdEhhbmRsZXI7XG5cbiAgICBpZiAoc3RvcmVSZXN1bHQ/LnZhbGlkICE9IG51bGwpIHtcbiAgICAgICRkaXJ0eS52YWx1ZSA9IHN0b3JhZ2UuZ2V0RGlydHlTdGF0ZShwYXRoKTtcbiAgICAgIGlmICgkZGlydHkudmFsdWUpIHtcbiAgICAgICAgJGNvbW1pdCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHN0b3JhZ2UuYWRkUnVsZURlY2xFbnRyeShwYXRoLCBkZWNsYXJlZFJ1bGVzKTtcbiAgfVxuXG4gIGZ1bmN0aW9uICR1bndhdGNoKCkge1xuICAgIGlmICgkcnVsZXMudmFsdWUpIHtcbiAgICAgIE9iamVjdC5lbnRyaWVzKCRydWxlcy52YWx1ZSkuZm9yRWFjaCgoW18sIHJ1bGVdKSA9PiB7XG4gICAgICAgIHJ1bGUuJHVud2F0Y2goKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICAkdW53YXRjaERpcnR5KCk7XG4gICAgaWYgKCRkaXJ0eS52YWx1ZSkge1xuICAgICAgc3RvcmFnZS5zZXREaXJ0eUVudHJ5KHBhdGgsICRkaXJ0eS52YWx1ZSk7XG4gICAgfVxuICAgICR1bndhdGNoU3RhdGUoKTtcbiAgICAkdW53YXRjaFZhbGlkKCk7XG4gICAgJHVud2F0Y2hFeHRlcm5hbEVycm9ycygpO1xuICAgIHNjb3BlLnN0b3AoKTtcbiAgICBzY29wZSA9IGVmZmVjdFNjb3BlKCk7XG4gICAgb25VbndhdGNoPy4oKTtcbiAgfVxuXG4gIGZ1bmN0aW9uICR3YXRjaCgpIHtcbiAgICBpZiAoJHJ1bGVzLnZhbHVlKSB7XG4gICAgICBPYmplY3QuZW50cmllcygkcnVsZXMudmFsdWUpLmZvckVhY2goKFtfLCBydWxlXSkgPT4ge1xuICAgICAgICBydWxlLiR3YXRjaCgpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHNjb3BlU3RhdGUgPSBzY29wZS5ydW4oKCkgPT4ge1xuICAgICAgY29uc3QgJGFueURpcnR5ID0gY29tcHV0ZWQ8Ym9vbGVhbj4oKCkgPT4gJGRpcnR5LnZhbHVlKTtcbiAgICAgIGNvbnN0ICRkZWJvdW5jZSA9IGNvbXB1dGVkPG51bWJlciB8IHVuZGVmaW5lZD4oKCkgPT4ge1xuICAgICAgICByZXR1cm4gJGxvY2FsT3B0aW9ucy52YWx1ZS4kZGVib3VuY2U7XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgJGxhenkgPSBjb21wdXRlZDxib29sZWFuIHwgdW5kZWZpbmVkPigoKSA9PiB7XG4gICAgICAgIGlmICgkbG9jYWxPcHRpb25zLnZhbHVlLiRsYXp5ICE9IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gJGxvY2FsT3B0aW9ucy52YWx1ZS4kbGF6eTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5yZWYob3B0aW9ucy5sYXp5KTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCAkcmV3YXJkRWFybHkgPSBjb21wdXRlZDxib29sZWFuIHwgdW5kZWZpbmVkPigoKSA9PiB7XG4gICAgICAgIGlmICgkbG9jYWxPcHRpb25zLnZhbHVlLiRyZXdhcmRFYXJseSAhPSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuICRsb2NhbE9wdGlvbnMudmFsdWUuJHJld2FyZEVhcmx5O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bnJlZihvcHRpb25zLnJld2FyZEVhcmx5KTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCAkYXV0b0RpcnR5ID0gY29tcHV0ZWQ8Ym9vbGVhbiB8IHVuZGVmaW5lZD4oKCkgPT4ge1xuICAgICAgICBpZiAoJGxvY2FsT3B0aW9ucy52YWx1ZS4kYXV0b0RpcnR5ICE9IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gJGxvY2FsT3B0aW9ucy52YWx1ZS4kYXV0b0RpcnR5O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bnJlZihvcHRpb25zLmF1dG9EaXJ0eSk7XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgJGVycm9yID0gY29tcHV0ZWQ8Ym9vbGVhbj4oKCkgPT4ge1xuICAgICAgICByZXR1cm4gJGludmFsaWQudmFsdWUgJiYgISRwZW5kaW5nLnZhbHVlICYmICRkaXJ0eS52YWx1ZTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCAkZXJyb3JzID0gY29tcHV0ZWQ8c3RyaW5nW10+KCgpID0+IHtcbiAgICAgICAgcmV0dXJuIGV4dHJhY3RSdWxlc0Vycm9ycyh7XG4gICAgICAgICAgZmllbGQ6IHtcbiAgICAgICAgICAgICRkaXJ0eTogJGRpcnR5LnZhbHVlLFxuICAgICAgICAgICAgJGV4dGVybmFsRXJyb3JzOiAkZXh0ZXJuYWxFcnJvcnMudmFsdWUsXG4gICAgICAgICAgICAkcnVsZXM6ICRydWxlcy52YWx1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCAkc2lsZW50RXJyb3JzID0gY29tcHV0ZWQ8c3RyaW5nW10+KCgpID0+IHtcbiAgICAgICAgcmV0dXJuIGV4dHJhY3RSdWxlc0Vycm9ycyh7XG4gICAgICAgICAgZmllbGQ6IHtcbiAgICAgICAgICAgICRkaXJ0eTogJGRpcnR5LnZhbHVlLFxuICAgICAgICAgICAgJGV4dGVybmFsRXJyb3JzOiAkZXh0ZXJuYWxFcnJvcnMudmFsdWUsXG4gICAgICAgICAgICAkcnVsZXM6ICRydWxlcy52YWx1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNpbGVudDogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgJHBlbmRpbmcgPSBjb21wdXRlZDxib29sZWFuPigoKSA9PiB7XG4gICAgICAgIGlmICh0cmlnZ2VyUHVuaXNobWVudC52YWx1ZSB8fCAhJHJld2FyZEVhcmx5LnZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKCRydWxlcy52YWx1ZSkuc29tZSgoW2tleSwgcnVsZVJlc3VsdF0pID0+IHtcbiAgICAgICAgICAgIHJldHVybiBydWxlUmVzdWx0LiRwZW5kaW5nO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCAkaW52YWxpZCA9IGNvbXB1dGVkPGJvb2xlYW4+KCgpID0+IHtcbiAgICAgICAgaWYgKCRleHRlcm5hbEVycm9ycy52YWx1ZT8ubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAoISRyZXdhcmRFYXJseS52YWx1ZSB8fCAoJHJld2FyZEVhcmx5LnZhbHVlICYmIHRyaWdnZXJQdW5pc2htZW50LnZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiBPYmplY3QuZW50cmllcygkcnVsZXMudmFsdWUpLnNvbWUoKFtrZXksIHJ1bGVSZXN1bHRdKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gIXJ1bGVSZXN1bHQuJHZhbGlkO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCAkdmFsaWQgPSBjb21wdXRlZDxib29sZWFuPigoKSA9PiB7XG4gICAgICAgIGlmICgkZGlydHkudmFsdWUgJiYgIWlzRW1wdHkoc3RhdGUudmFsdWUpKSB7XG4gICAgICAgICAgaWYgKCRleHRlcm5hbEVycm9ycy52YWx1ZT8ubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfSBlbHNlIGlmICgkcmV3YXJkRWFybHkudmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3QuZW50cmllcygkcnVsZXMudmFsdWUpLmV2ZXJ5KChba2V5LCBydWxlUmVzdWx0XSkgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gcnVsZVJlc3VsdC4kdmFsaWQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuICEkaW52YWxpZC52YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSk7XG5cbiAgICAgIHdhdGNoKCR2YWxpZCwgKHZhbHVlKSA9PiB7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIHRyaWdnZXJQdW5pc2htZW50LnZhbHVlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAkZXJyb3IsXG4gICAgICAgICRwZW5kaW5nLFxuICAgICAgICAkaW52YWxpZCxcbiAgICAgICAgJHZhbGlkLFxuICAgICAgICAkZGVib3VuY2UsXG4gICAgICAgICRsYXp5LFxuICAgICAgICAkZXJyb3JzLFxuICAgICAgICAkc2lsZW50RXJyb3JzLFxuICAgICAgICAkcmV3YXJkRWFybHksXG4gICAgICAgICRhdXRvRGlydHksXG4gICAgICAgICRhbnlEaXJ0eSxcbiAgICAgIH0gc2F0aXNmaWVzIFNjb3BlUmV0dXJuU3RhdGU7XG4gICAgfSkgYXMgU2NvcGVSZXR1cm5TdGF0ZTtcblxuICAgICR1bndhdGNoRXh0ZXJuYWxFcnJvcnMgPSB3YXRjaChleHRlcm5hbEVycm9ycywgY29sbGVjdEV4dGVybmFsRXJyb3JzKTtcbiAgICAkdW53YXRjaFN0YXRlID0gd2F0Y2goXG4gICAgICBzdGF0ZSxcbiAgICAgICgpID0+IHtcbiAgICAgICAgaWYgKHNjb3BlU3RhdGUuJGF1dG9EaXJ0eS52YWx1ZSkge1xuICAgICAgICAgIGlmICghJGRpcnR5LnZhbHVlKSB7XG4gICAgICAgICAgICAkZGlydHkudmFsdWUgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocnVsZXNEZWYudmFsdWUgaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuICAgICAgICAgIGNyZWF0ZVJlYWN0aXZlUnVsZXNSZXN1bHQoKTtcbiAgICAgICAgfVxuICAgICAgICAkY29tbWl0KCk7XG4gICAgICAgIGlmICghc2NvcGVTdGF0ZS4kcmV3YXJkRWFybHkudmFsdWUgIT09IGZhbHNlKSB7XG4gICAgICAgICAgLy8gJGNsZWFyRXh0ZXJuYWxFcnJvcnMoKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHsgZGVlcDogaXNWdWVTdXBlcmlvck9yRXF1YWxUbzNkb3RGaXZlID8gMSA6IHRydWUgfVxuICAgICk7XG5cbiAgICAkdW53YXRjaERpcnR5ID0gd2F0Y2goJGRpcnR5LCAoKSA9PiB7XG4gICAgICBzdG9yYWdlLnNldERpcnR5RW50cnkocGF0aCwgJGRpcnR5LnZhbHVlKTtcbiAgICB9KTtcblxuICAgICR1bndhdGNoVmFsaWQgPSB3YXRjaChzY29wZVN0YXRlLiR2YWxpZCwgKHZhbGlkKSA9PiB7XG4gICAgICBpZiAoc2NvcGVTdGF0ZS4kcmV3YXJkRWFybHkudmFsdWUgJiYgdmFsaWQpIHtcbiAgICAgICAgdHJpZ2dlclB1bmlzaG1lbnQudmFsdWUgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uICRjb21taXRIYW5kbGVyKCkge1xuICAgIE9iamVjdC5lbnRyaWVzKCRydWxlcy52YWx1ZSkuZm9yRWFjaCgoW2tleSwgcnVsZV0pID0+IHtcbiAgICAgIHJ1bGUuJHZhbGlkYXRlKCk7XG4gICAgfSk7XG4gIH1cblxuICBjb25zdCAkcnVsZXMgPSByZWYoKSBhcyBSZWY8UmVjb3JkPHN0cmluZywgJEludGVybmFsUmVnbGVSdWxlU3RhdHVzPj47XG4gIGNvbnN0ICRsb2NhbE9wdGlvbnMgPSByZWYoKSBhcyBSZWY8RmllbGRSZWdsZUJlaGF2aW91ck9wdGlvbnM+O1xuXG4gIGNyZWF0ZVJlYWN0aXZlUnVsZXNSZXN1bHQoKTtcblxuICBmdW5jdGlvbiAkcmVzZXQoKTogdm9pZCB7XG4gICAgJGRpcnR5LnZhbHVlID0gZmFsc2U7XG4gICAgJGV4dGVybmFsRXJyb3JzLnZhbHVlID0gW107XG4gICAgT2JqZWN0LmVudHJpZXMoJHJ1bGVzLnZhbHVlKS5mb3JFYWNoKChba2V5LCBydWxlXSkgPT4ge1xuICAgICAgcnVsZS4kcmVzZXQoKTtcbiAgICB9KTtcbiAgICBpZiAoIXNjb3BlU3RhdGUuJGxhenkudmFsdWUpIHtcbiAgICAgIE9iamVjdC5lbnRyaWVzKCRydWxlcy52YWx1ZSkubWFwKChba2V5LCBydWxlXSkgPT4ge1xuICAgICAgICByZXR1cm4gcnVsZS4kdmFsaWRhdGUoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uICR0b3VjaCgpOiB2b2lkIHtcbiAgICBpZiAoISRkaXJ0eS52YWx1ZSkge1xuICAgICAgJGRpcnR5LnZhbHVlID0gdHJ1ZTtcbiAgICAgIGlmICghc2NvcGVTdGF0ZS4kcmV3YXJkRWFybHkudmFsdWUgIT09IGZhbHNlKSB7XG4gICAgICAgIC8vICRjbGVhckV4dGVybmFsRXJyb3JzKCk7XG4gICAgICB9XG4gICAgICAkY29tbWl0KCk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgJHZhbGlkYXRlID0gc2NvcGVTdGF0ZS4kZGVib3VuY2UudmFsdWVcbiAgICA/IGRlYm91bmNlKCR2YWxpZGF0ZUhhbmRsZXIsIHNjb3BlU3RhdGUuJGRlYm91bmNlLnZhbHVlID8/IDApXG4gICAgOiAkdmFsaWRhdGVIYW5kbGVyO1xuXG4gIGFzeW5jIGZ1bmN0aW9uICR2YWxpZGF0ZUhhbmRsZXIoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIHRyaWdnZXJQdW5pc2htZW50LnZhbHVlID0gdHJ1ZTtcbiAgICAgIGlmIChzY29wZVN0YXRlLiRhdXRvRGlydHkudmFsdWUgJiYgJGRpcnR5LnZhbHVlICYmICFzY29wZVN0YXRlLiRwZW5kaW5nLnZhbHVlKSB7XG4gICAgICAgIHJldHVybiAhc2NvcGVTdGF0ZS4kZXJyb3IudmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBwcm9taXNlcyA9IE9iamVjdC5lbnRyaWVzKCRydWxlcy52YWx1ZSkubWFwKChba2V5LCBydWxlXSkgPT4ge1xuICAgICAgICAgIHJldHVybiBydWxlLiR2YWxpZGF0ZSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChwcm9taXNlcyk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdHMuZXZlcnkoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgaWYgKHZhbHVlLnN0YXR1cyA9PT0gJ2Z1bGZpbGxlZCcpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS52YWx1ZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uICRjbGVhckV4dGVybmFsRXJyb3JzKCkge1xuICAgICRleHRlcm5hbEVycm9ycy52YWx1ZSA9IFtdO1xuICB9XG5cbiAgaWYgKCFzY29wZVN0YXRlLiRsYXp5LnZhbHVlKSB7XG4gICAgJHZhbGlkYXRlSGFuZGxlcigpO1xuICB9XG5cbiAgcmV0dXJuIHJlYWN0aXZlKHtcbiAgICAkZGlydHksXG4gICAgLi4uc2NvcGVTdGF0ZSxcbiAgICAkZXh0ZXJuYWxFcnJvcnMsXG4gICAgJHZhbHVlOiBzdGF0ZSxcbiAgICAkcnVsZXM6ICRydWxlcyxcbiAgICAkcmVzZXQsXG4gICAgJHRvdWNoLFxuICAgICR2YWxpZGF0ZSxcbiAgICAkdW53YXRjaCxcbiAgICAkd2F0Y2gsXG4gICAgJGNsZWFyRXh0ZXJuYWxFcnJvcnMsXG4gIH0pIHNhdGlzZmllcyAkSW50ZXJuYWxSZWdsZUZpZWxkU3RhdHVzO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBSZXF1aXJlZERlZXAgfSBmcm9tICd0eXBlLWZlc3QnO1xuaW1wb3J0IHR5cGUgeyBDb21wdXRlZFJlZiwgUmVmIH0gZnJvbSAndnVlJztcbmltcG9ydCB7IGNvbXB1dGVkLCBlZmZlY3RTY29wZSwgcmVhY3RpdmUsIHJlZiwgdG9SZWYsIHdhdGNoIH0gZnJvbSAndnVlJztcbmltcG9ydCB0eXBlIHtcbiAgJEludGVybmFsRXh0ZXJuYWxSZWdsZUVycm9ycyxcbiAgJEludGVybmFsRm9ybVByb3BlcnR5VHlwZXMsXG4gICRJbnRlcm5hbFJlZ2xlQ29sbGVjdGlvbkVycm9ycyxcbiAgJEludGVybmFsUmVnbGVDb2xsZWN0aW9uUnVsZURlY2wsXG4gICRJbnRlcm5hbFJlZ2xlQ29sbGVjdGlvblN0YXR1cyxcbiAgJEludGVybmFsUmVnbGVGaWVsZFN0YXR1cyxcbiAgJEludGVybmFsUmVnbGVTdGF0dXNUeXBlLFxuICBDdXN0b21SdWxlc0RlY2xhcmF0aW9uVHJlZSxcbiAgRGVlcE1heWJlUmVmLFxuICBSZWdsZUJlaGF2aW91ck9wdGlvbnMsXG4gIFJlZ2xlQ29sbGVjdGlvblJ1bGVEZWNsS2V5UHJvcGVydHksXG4gIFJlc29sdmVkUmVnbGVCZWhhdmlvdXJPcHRpb25zLFxufSBmcm9tICcuLi8uLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBjbG9uZURlZXAsIHJhbmRvbUlkLCB1bndyYXBHZXR0ZXIgfSBmcm9tICcuLi8uLi8uLi91dGlscyc7XG5pbXBvcnQgeyBpc1Z1ZVN1cGVyaW9yT3JFcXVhbFRvM2RvdEZpdmUgfSBmcm9tICcuLi8uLi8uLi91dGlscy92ZXJzaW9uLWNvbXBhcmUnO1xuaW1wb3J0IHR5cGUgeyBSZWdsZVN0b3JhZ2UgfSBmcm9tICcuLi8uLi91c2VTdG9yYWdlJztcbmltcG9ydCB7IGlzRXh0ZXJuYWxFcnJvckNvbGxlY3Rpb24sIGlzUnVsZURlZiB9IGZyb20gJy4uL2d1YXJkcyc7XG5pbXBvcnQgeyBleHRyYWN0Q29sbGVjdGlvbkVycm9yLCBleHRyYWN0UnVsZXNFcnJvcnMgfSBmcm9tICcuLi91c2VFcnJvcnMnO1xuaW1wb3J0IHsgY3JlYXRlUmVhY3RpdmVGaWVsZFN0YXR1cyB9IGZyb20gJy4vY3JlYXRlUmVhY3RpdmVGaWVsZFN0YXR1cyc7XG5pbXBvcnQgeyBjcmVhdGVSZWFjdGl2ZUNoaWxkcmVuU3RhdHVzIH0gZnJvbSAnLi9jcmVhdGVSZWFjdGl2ZU5lc3RlZFN0YXR1cyc7XG5cbnR5cGUgU3RhdGVXaXRoSWQgPSB1bmtub3duICYgeyAkaWQ/OiBzdHJpbmcgfTtcblxuZnVuY3Rpb24gY3JlYXRlQ29sbGVjdGlvbkVsZW1lbnQoe1xuICAkaWQsXG4gIHBhdGgsXG4gIGluZGV4LFxuICBvcHRpb25zLFxuICBzdG9yYWdlLFxuICBzdGF0ZVZhbHVlLFxuICBjdXN0b21NZXNzYWdlcyxcbiAgcnVsZXMsXG4gIGV4dGVybmFsRXJyb3JzLFxufToge1xuICAkaWQ6IHN0cmluZztcbiAgcGF0aDogc3RyaW5nO1xuICBpbmRleDogbnVtYmVyO1xuICBzdGF0ZVZhbHVlOiBSZWY8U3RhdGVXaXRoSWQ+O1xuICBjdXN0b21NZXNzYWdlcz86IEN1c3RvbVJ1bGVzRGVjbGFyYXRpb25UcmVlO1xuICBzdG9yYWdlOiBSZWdsZVN0b3JhZ2U7XG4gIG9wdGlvbnM6IERlZXBNYXliZVJlZjxSZXF1aXJlZERlZXA8UmVnbGVCZWhhdmlvdXJPcHRpb25zPj47XG4gIHJ1bGVzOiAkSW50ZXJuYWxGb3JtUHJvcGVydHlUeXBlcyAmIFJlZ2xlQ29sbGVjdGlvblJ1bGVEZWNsS2V5UHJvcGVydHk7XG4gIGV4dGVybmFsRXJyb3JzOiBDb21wdXRlZFJlZjwkSW50ZXJuYWxFeHRlcm5hbFJlZ2xlRXJyb3JzW10gfCB1bmRlZmluZWQ+O1xufSk6ICRJbnRlcm5hbFJlZ2xlU3RhdHVzVHlwZSB8IG51bGwge1xuICBjb25zdCAkZmllbGRJZCA9IHJ1bGVzLiRrZXkgPyBydWxlcy4ka2V5IDogcmFuZG9tSWQoKTtcbiAgbGV0ICRwYXRoID0gYCR7cGF0aH0uJHtTdHJpbmcoJGZpZWxkSWQpfWA7XG5cbiAgaWYgKHR5cGVvZiBzdGF0ZVZhbHVlLnZhbHVlID09PSAnb2JqZWN0JyAmJiBzdGF0ZVZhbHVlLnZhbHVlICE9IG51bGwpIHtcbiAgICBpZiAoIXN0YXRlVmFsdWUudmFsdWUuJGlkKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhzdGF0ZVZhbHVlLnZhbHVlLCB7XG4gICAgICAgICRpZDoge1xuICAgICAgICAgIHZhbHVlOiAkZmllbGRJZCxcbiAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAkcGF0aCA9IGAke3BhdGh9LiR7c3RhdGVWYWx1ZS52YWx1ZS4kaWR9YDtcbiAgICB9XG4gIH1cblxuICBjb25zdCAkZXh0ZXJuYWxFcnJvcnMgPSB0b1JlZigoKSA9PiBleHRlcm5hbEVycm9ycy52YWx1ZT8uW2luZGV4XSk7XG5cbiAgY29uc3QgJHN0YXR1cyA9IGNyZWF0ZVJlYWN0aXZlQ2hpbGRyZW5TdGF0dXMoe1xuICAgIHN0YXRlOiBzdGF0ZVZhbHVlLFxuICAgIHJ1bGVzRGVmOiB0b1JlZigoKSA9PiBydWxlcyksXG4gICAgY3VzdG9tTWVzc2FnZXMsXG4gICAgcGF0aDogJHBhdGgsXG4gICAgc3RvcmFnZSxcbiAgICBvcHRpb25zLFxuICAgIGV4dGVybmFsRXJyb3JzOiAkZXh0ZXJuYWxFcnJvcnMsXG4gIH0pO1xuXG4gIGlmICgkc3RhdHVzKSB7XG4gICAgY29uc3QgdmFsdWVJZCA9IHN0YXRlVmFsdWUudmFsdWU/LiRpZDtcbiAgICAkc3RhdHVzLiRpZCA9IHZhbHVlSWQgPz8gU3RyaW5nKCRmaWVsZElkKTtcbiAgICBzdG9yYWdlLmFkZEFycmF5U3RhdHVzKCRpZCwgJHN0YXR1cy4kaWQsICRzdGF0dXMpO1xuICB9XG5cbiAgcmV0dXJuICRzdGF0dXM7XG59XG5cbmludGVyZmFjZSBDcmVhdGVSZWFjdGl2ZUNvbGxlY3Rpb25TdGF0dXNBcmdzIHtcbiAgc3RhdGU6IFJlZjxTdGF0ZVdpdGhJZFtdICYgU3RhdGVXaXRoSWQ+O1xuICBydWxlc0RlZjogUmVmPCRJbnRlcm5hbFJlZ2xlQ29sbGVjdGlvblJ1bGVEZWNsPjtcbiAgY3VzdG9tTWVzc2FnZXM/OiBDdXN0b21SdWxlc0RlY2xhcmF0aW9uVHJlZTtcbiAgcGF0aDogc3RyaW5nO1xuICBpbmRleD86IG51bWJlcjtcbiAgc3RvcmFnZTogUmVnbGVTdG9yYWdlO1xuICBvcHRpb25zOiBSZXNvbHZlZFJlZ2xlQmVoYXZpb3VyT3B0aW9ucztcbiAgZXh0ZXJuYWxFcnJvcnM6IFJlYWRvbmx5PFJlZjwkSW50ZXJuYWxFeHRlcm5hbFJlZ2xlRXJyb3JzIHwgdW5kZWZpbmVkPj47XG59XG5cbmludGVyZmFjZSBTY29wZVJldHVyblN0YXRlIHtcbiAgJGRpcnR5OiBDb21wdXRlZFJlZjxib29sZWFuPjtcbiAgJGFueURpcnR5OiBDb21wdXRlZFJlZjxib29sZWFuPjtcbiAgJGludmFsaWQ6IENvbXB1dGVkUmVmPGJvb2xlYW4+O1xuICAkdmFsaWQ6IENvbXB1dGVkUmVmPGJvb2xlYW4+O1xuICAkZXJyb3I6IENvbXB1dGVkUmVmPGJvb2xlYW4+O1xuICAkcGVuZGluZzogQ29tcHV0ZWRSZWY8Ym9vbGVhbj47XG4gICRlcnJvcnM6IENvbXB1dGVkUmVmPCRJbnRlcm5hbFJlZ2xlQ29sbGVjdGlvbkVycm9ycz47XG4gICRzaWxlbnRFcnJvcnM6IENvbXB1dGVkUmVmPCRJbnRlcm5hbFJlZ2xlQ29sbGVjdGlvbkVycm9ycz47XG59XG5cbmludGVyZmFjZSBJbW1lZGlhdGVTY29wZVJldHVyblN0YXRlIHtcbiAgaXNQcmltaXRpdmVBcnJheTogQ29tcHV0ZWRSZWY8Ym9vbGVhbj47XG4gICRleHRlcm5hbEVycm9yc0ZpZWxkOiBDb21wdXRlZFJlZjxzdHJpbmdbXT47XG4gICRleHRlcm5hbEVycm9yc0VhY2g6IENvbXB1dGVkUmVmPCRJbnRlcm5hbEV4dGVybmFsUmVnbGVFcnJvcnNbXT47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZWFjdGl2ZUNvbGxlY3Rpb25TdGF0dXMoe1xuICBzdGF0ZSxcbiAgcnVsZXNEZWYsXG4gIGN1c3RvbU1lc3NhZ2VzLFxuICBwYXRoLFxuICBzdG9yYWdlLFxuICBvcHRpb25zLFxuICBleHRlcm5hbEVycm9ycyxcbn06IENyZWF0ZVJlYWN0aXZlQ29sbGVjdGlvblN0YXR1c0FyZ3MpOiAkSW50ZXJuYWxSZWdsZUNvbGxlY3Rpb25TdGF0dXMgfCBudWxsIHtcbiAgbGV0IHNjb3BlID0gZWZmZWN0U2NvcGUoKTtcbiAgbGV0IHNjb3BlU3RhdGUhOiBTY29wZVJldHVyblN0YXRlO1xuXG4gIGxldCBpbW1lZGlhdGVTY29wZSA9IGVmZmVjdFNjb3BlKCk7XG4gIGxldCBpbW1lZGlhdGVTY29wZVN0YXRlITogSW1tZWRpYXRlU2NvcGVSZXR1cm5TdGF0ZTtcblxuICBpZiAoQXJyYXkuaXNBcnJheShzdGF0ZS52YWx1ZSkgJiYgIXJ1bGVzRGVmLnZhbHVlLiRlYWNoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgJGlkID0gcmVmPHN0cmluZz4oKSBhcyBSZWY8c3RyaW5nPjtcbiAgY29uc3QgJHZhbHVlID0gcmVmKHN0YXRlLnZhbHVlKTtcblxuICBsZXQgJHVud2F0Y2hTdGF0ZTogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3QgJGZpZWxkU3RhdHVzID0gcmVmKHt9KSBhcyBSZWY8JEludGVybmFsUmVnbGVGaWVsZFN0YXR1cz47XG4gIGNvbnN0ICRlYWNoU3RhdHVzID0gc3RvcmFnZS5nZXRDb2xsZWN0aW9uc0VudHJ5KHBhdGgpO1xuXG4gIGltbWVkaWF0ZVNjb3BlU3RhdGUgPSBpbW1lZGlhdGVTY29wZS5ydW4oKCkgPT4ge1xuICAgIGNvbnN0IGlzUHJpbWl0aXZlQXJyYXkgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShzdGF0ZS52YWx1ZSkgJiYgc3RhdGUudmFsdWUubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZS52YWx1ZS5zb21lKChzKSA9PiB0eXBlb2YgcyAhPT0gJ29iamVjdCcpO1xuICAgICAgfSBlbHNlIGlmIChydWxlc0RlZi52YWx1ZS4kZWFjaCAmJiAhKHJ1bGVzRGVmLnZhbHVlLiRlYWNoIGluc3RhbmNlb2YgRnVuY3Rpb24pKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKHJ1bGVzRGVmLnZhbHVlLiRlYWNoKS5ldmVyeSgocnVsZSkgPT4gaXNSdWxlRGVmKHJ1bGUpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9KTtcblxuICAgIGNvbnN0ICRleHRlcm5hbEVycm9yc0ZpZWxkID0gY29tcHV0ZWQ8c3RyaW5nW10+KCgpID0+IHtcbiAgICAgIGlmIChleHRlcm5hbEVycm9ycy52YWx1ZSkge1xuICAgICAgICBpZiAoaXNFeHRlcm5hbEVycm9yQ29sbGVjdGlvbihleHRlcm5hbEVycm9ycy52YWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gZXh0ZXJuYWxFcnJvcnMudmFsdWUuJGVycm9ycyA/PyBbXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICByZXR1cm4gW107XG4gICAgfSk7XG5cbiAgICBjb25zdCAkZXh0ZXJuYWxFcnJvcnNFYWNoID0gY29tcHV0ZWQ8JEludGVybmFsRXh0ZXJuYWxSZWdsZUVycm9yc1tdPigoKSA9PiB7XG4gICAgICBpZiAoZXh0ZXJuYWxFcnJvcnMudmFsdWUpIHtcbiAgICAgICAgaWYgKGlzRXh0ZXJuYWxFcnJvckNvbGxlY3Rpb24oZXh0ZXJuYWxFcnJvcnMudmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIGV4dGVybmFsRXJyb3JzLnZhbHVlLiRlYWNoID8/IFtdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbXTtcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgaXNQcmltaXRpdmVBcnJheSxcbiAgICAgICRleHRlcm5hbEVycm9yc0ZpZWxkLFxuICAgICAgJGV4dGVybmFsRXJyb3JzRWFjaCxcbiAgICB9IHNhdGlzZmllcyBJbW1lZGlhdGVTY29wZVJldHVyblN0YXRlO1xuICB9KSE7XG5cbiAgY3JlYXRlU3RhdHVzKCk7XG4gICR3YXRjaCgpO1xuXG4gIGZ1bmN0aW9uIGNyZWF0ZVN0YXR1cygpIHtcbiAgICBpZiAodHlwZW9mIHN0YXRlLnZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgaWYgKHN0YXRlLnZhbHVlICE9IG51bGwgJiYgIXN0YXRlLnZhbHVlPy4kaWQgJiYgc3RhdGUudmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgJGlkLnZhbHVlID0gcmFuZG9tSWQoKTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoc3RhdGUudmFsdWUsIHtcbiAgICAgICAgICAkaWQ6IHtcbiAgICAgICAgICAgIHZhbHVlOiAkaWQudmFsdWUsXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHN0YXRlLnZhbHVlPy4kaWQpIHtcbiAgICAgICAgJGlkLnZhbHVlID0gc3RhdGUudmFsdWUuJGlkO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpbW1lZGlhdGVTY29wZVN0YXRlLmlzUHJpbWl0aXZlQXJyYXkudmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAkdmFsdWUudmFsdWUgPSAkZmllbGRTdGF0dXMudmFsdWUuJHZhbHVlO1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc3RhdGUudmFsdWUpICYmIHJ1bGVzRGVmLnZhbHVlLiRlYWNoKSB7XG4gICAgICAkZWFjaFN0YXR1cy52YWx1ZSA9IHN0YXRlLnZhbHVlXG4gICAgICAgIC5tYXAoKHZhbHVlLCBpbmRleCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHVud3JhcHBlZCRFYWNoID0gdW53cmFwR2V0dGVyKFxuICAgICAgICAgICAgcnVsZXNEZWYudmFsdWUuJGVhY2gsXG4gICAgICAgICAgICB0b1JlZigoKSA9PiB2YWx1ZSksXG4gICAgICAgICAgICBpbmRleFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHVud3JhcHBlZCRFYWNoKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gY3JlYXRlQ29sbGVjdGlvbkVsZW1lbnQoe1xuICAgICAgICAgICAgICAkaWQ6ICRpZC52YWx1ZSxcbiAgICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgICAgcnVsZXM6IHVud3JhcHBlZCRFYWNoLFxuICAgICAgICAgICAgICBzdGF0ZVZhbHVlOiB0b1JlZigoKSA9PiB2YWx1ZSksXG4gICAgICAgICAgICAgIGluZGV4LFxuICAgICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgICBzdG9yYWdlLFxuICAgICAgICAgICAgICBleHRlcm5hbEVycm9yczogaW1tZWRpYXRlU2NvcGVTdGF0ZS4kZXh0ZXJuYWxFcnJvcnNFYWNoLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLmZpbHRlcigoZWFjaCkgPT4gISFlYWNoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgJGVhY2hTdGF0dXMudmFsdWUgPSBbXTtcbiAgICB9XG5cbiAgICAkZmllbGRTdGF0dXMudmFsdWUgPSBjcmVhdGVSZWFjdGl2ZUZpZWxkU3RhdHVzKHtcbiAgICAgIHN0YXRlLFxuICAgICAgcnVsZXNEZWYsXG4gICAgICBjdXN0b21NZXNzYWdlcyxcbiAgICAgIHBhdGgsXG4gICAgICBzdG9yYWdlLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIGV4dGVybmFsRXJyb3JzOiBpbW1lZGlhdGVTY29wZVN0YXRlLiRleHRlcm5hbEVycm9yc0ZpZWxkLFxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlU3RhdHVzKCkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHN0YXRlLnZhbHVlKSkge1xuICAgICAgY29uc3QgcHJldmlvdXNTdGF0dXMgPSBjbG9uZURlZXAoJGVhY2hTdGF0dXMudmFsdWUpO1xuXG4gICAgICAkZWFjaFN0YXR1cy52YWx1ZSA9IHN0YXRlLnZhbHVlXG4gICAgICAgIC5tYXAoKHZhbHVlLCBpbmRleCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHRvUmVmKCgpID0+IHZhbHVlKTtcbiAgICAgICAgICBpZiAodmFsdWUuJGlkICYmICRlYWNoU3RhdHVzLnZhbHVlLmZpbmQoKGVhY2gpID0+IGVhY2guJGlkID09PSB2YWx1ZS4kaWQpKSB7XG4gICAgICAgICAgICBjb25zdCBleGlzdGluZ1N0YXR1cyA9IHN0b3JhZ2UuZ2V0QXJyYXlTdGF0dXMoJGlkLnZhbHVlLCB2YWx1ZS4kaWQpO1xuICAgICAgICAgICAgaWYgKGV4aXN0aW5nU3RhdHVzKSB7XG4gICAgICAgICAgICAgIGV4aXN0aW5nU3RhdHVzLiR2YWx1ZSA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICAgICAgcmV0dXJuIGV4aXN0aW5nU3RhdHVzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHVud3JhcHBlZCRFYWNoID0gdW53cmFwR2V0dGVyKHJ1bGVzRGVmLnZhbHVlLiRlYWNoLCBjdXJyZW50VmFsdWUsIGluZGV4KTtcbiAgICAgICAgICAgIGlmICh1bndyYXBwZWQkRWFjaCkge1xuICAgICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gY3JlYXRlQ29sbGVjdGlvbkVsZW1lbnQoe1xuICAgICAgICAgICAgICAgICRpZDogJGlkLnZhbHVlLFxuICAgICAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICAgICAgcnVsZXM6IHVud3JhcHBlZCRFYWNoLFxuICAgICAgICAgICAgICAgIHN0YXRlVmFsdWU6IGN1cnJlbnRWYWx1ZSxcbiAgICAgICAgICAgICAgICBpbmRleCxcbiAgICAgICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgICAgIHN0b3JhZ2UsXG4gICAgICAgICAgICAgICAgZXh0ZXJuYWxFcnJvcnM6IGltbWVkaWF0ZVNjb3BlU3RhdGUuJGV4dGVybmFsRXJyb3JzRWFjaCxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAuZmlsdGVyKChlYWNoKSA9PiAhIWVhY2gpO1xuXG4gICAgICBwcmV2aW91c1N0YXR1c1xuICAgICAgICAuZmlsdGVyKCgkZWFjaCkgPT4gIXN0YXRlLnZhbHVlLmZpbmQoKGYpID0+ICRlYWNoLiRpZCA9PT0gZi4kaWQpKVxuICAgICAgICAuZm9yRWFjaCgoJGVhY2gsIGluZGV4KSA9PiB7XG4gICAgICAgICAgc3RvcmFnZS5kZWxldGVBcnJheVN0YXR1cygkaWQudmFsdWUsIGluZGV4LnRvU3RyaW5nKCkpO1xuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgJGVhY2hTdGF0dXMudmFsdWUgPSBbXTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiAkd2F0Y2goKSB7XG4gICAgJHVud2F0Y2hTdGF0ZSA9IHdhdGNoKFxuICAgICAgc3RhdGUsXG4gICAgICAoKSA9PiB7XG4gICAgICAgIGlmIChzdGF0ZS52YWx1ZSAhPSBudWxsICYmICFPYmplY3QuaGFzT3duKHN0YXRlLnZhbHVlIGFzIGFueSwgJyRpZCcpKSB7XG4gICAgICAgICAgY3JlYXRlU3RhdHVzKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdXBkYXRlU3RhdHVzKCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7IGRlZXA6IGlzVnVlU3VwZXJpb3JPckVxdWFsVG8zZG90Rml2ZSA/IDEgOiB0cnVlLCBmbHVzaDogJ3ByZScgfVxuICAgICk7XG4gICAgc2NvcGVTdGF0ZSA9IHNjb3BlLnJ1bigoKSA9PiB7XG4gICAgICBjb25zdCAkZGlydHkgPSBjb21wdXRlZDxib29sZWFuPigoKSA9PiB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgJGZpZWxkU3RhdHVzLnZhbHVlLiRkaXJ0eSAmJlxuICAgICAgICAgICRlYWNoU3RhdHVzLnZhbHVlLmV2ZXJ5KChzdGF0dXNPckZpZWxkKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gc3RhdHVzT3JGaWVsZC4kZGlydHk7XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCAkYW55RGlydHkgPSBjb21wdXRlZDxib29sZWFuPigoKSA9PiB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgJGZpZWxkU3RhdHVzLnZhbHVlLiRhbnlEaXJ0eSB8fFxuICAgICAgICAgICRlYWNoU3RhdHVzLnZhbHVlLnNvbWUoKHN0YXR1c09yRmllbGQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBzdGF0dXNPckZpZWxkLiRkaXJ0eTtcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0ICRpbnZhbGlkID0gY29tcHV0ZWQ8Ym9vbGVhbj4oKCkgPT4ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICRmaWVsZFN0YXR1cy52YWx1ZS4kaW52YWxpZCB8fFxuICAgICAgICAgICRlYWNoU3RhdHVzLnZhbHVlLnNvbWUoKHN0YXR1c09yRmllbGQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBzdGF0dXNPckZpZWxkLiRpbnZhbGlkO1xuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgJHZhbGlkID0gY29tcHV0ZWQ8Ym9vbGVhbj4oXG4gICAgICAgICgpID0+XG4gICAgICAgICAgJGZpZWxkU3RhdHVzLnZhbHVlLiR2YWxpZCAmJlxuICAgICAgICAgICRlYWNoU3RhdHVzLnZhbHVlLmV2ZXJ5KChzdGF0dXNPckZpZWxkKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gc3RhdHVzT3JGaWVsZC4kdmFsaWQ7XG4gICAgICAgICAgfSlcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0ICRlcnJvciA9IGNvbXB1dGVkPGJvb2xlYW4+KCgpID0+IHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAkZmllbGRTdGF0dXMudmFsdWUuJGVycm9yIHx8XG4gICAgICAgICAgJGVhY2hTdGF0dXMudmFsdWUuc29tZSgoc3RhdHVzT3JGaWVsZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHN0YXR1c09yRmllbGQuJGVycm9yO1xuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgJHBlbmRpbmcgPSBjb21wdXRlZDxib29sZWFuPigoKSA9PiB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgJGZpZWxkU3RhdHVzLnZhbHVlLiRwZW5kaW5nIHx8XG4gICAgICAgICAgJGVhY2hTdGF0dXMudmFsdWUuc29tZSgoc3RhdHVzT3JGaWVsZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHN0YXR1c09yRmllbGQuJHBlbmRpbmc7XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCAkZXJyb3JzID0gY29tcHV0ZWQ8JEludGVybmFsUmVnbGVDb2xsZWN0aW9uRXJyb3JzPigoKSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgJGVycm9yczogZXh0cmFjdFJ1bGVzRXJyb3JzKHsgZmllbGQ6ICRmaWVsZFN0YXR1cy52YWx1ZSwgc2lsZW50OiBmYWxzZSB9KSxcbiAgICAgICAgICAkZWFjaDogZXh0cmFjdENvbGxlY3Rpb25FcnJvcigkZWFjaFN0YXR1cy52YWx1ZSksXG4gICAgICAgIH07XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgJHNpbGVudEVycm9ycyA9IGNvbXB1dGVkPCRJbnRlcm5hbFJlZ2xlQ29sbGVjdGlvbkVycm9ycz4oKCkgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICRlcnJvcnM6IGV4dHJhY3RSdWxlc0Vycm9ycyh7IGZpZWxkOiAkZmllbGRTdGF0dXMudmFsdWUsIHNpbGVudDogdHJ1ZSB9KSxcbiAgICAgICAgICAkZWFjaDogZXh0cmFjdENvbGxlY3Rpb25FcnJvcigkZWFjaFN0YXR1cy52YWx1ZSwgdHJ1ZSksXG4gICAgICAgIH07XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgJGRpcnR5LFxuICAgICAgICAkYW55RGlydHksXG4gICAgICAgICRpbnZhbGlkLFxuICAgICAgICAkdmFsaWQsXG4gICAgICAgICRlcnJvcixcbiAgICAgICAgJHBlbmRpbmcsXG4gICAgICAgICRlcnJvcnMsXG4gICAgICAgICRzaWxlbnRFcnJvcnMsXG4gICAgICB9IHNhdGlzZmllcyBTY29wZVJldHVyblN0YXRlO1xuICAgIH0pITtcblxuICAgIGlmIChpbW1lZGlhdGVTY29wZVN0YXRlLmlzUHJpbWl0aXZlQXJyYXkudmFsdWUpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYCR7cGF0aH0gaXMgYSBBcnJheSBvZiBwcmltaXRpdmVzLiBUcmFja2luZyBjYW4gYmUgbG9zdCB3aGVuIHJlYXNzaWduaW5nIHRoZSBBcnJheS4gV2UgYWR2aXNlIHRvIHVzZSBhbiBBcnJheSBvZiBvYmplY3RzIGluc3RlYWRgXG4gICAgICApO1xuICAgICAgJHVud2F0Y2hTdGF0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uICR1bndhdGNoKCkge1xuICAgIGlmICgkdW53YXRjaFN0YXRlKSB7XG4gICAgICAkdW53YXRjaFN0YXRlKCk7XG4gICAgfVxuICAgIGlmICgkZmllbGRTdGF0dXMudmFsdWUpIHtcbiAgICAgICRmaWVsZFN0YXR1cy52YWx1ZS4kdW53YXRjaCgpO1xuICAgIH1cbiAgICBpZiAoJGVhY2hTdGF0dXMudmFsdWUpIHtcbiAgICAgICRlYWNoU3RhdHVzLnZhbHVlLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgaWYgKCckZGlydHknIGluIGVsZW1lbnQpIHtcbiAgICAgICAgICBlbGVtZW50LiR1bndhdGNoKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBzY29wZS5zdG9wKCk7XG4gICAgc2NvcGUgPSBlZmZlY3RTY29wZSgpO1xuICAgIGltbWVkaWF0ZVNjb3BlLnN0b3AoKTtcbiAgICBpbW1lZGlhdGVTY29wZSA9IGVmZmVjdFNjb3BlKHRydWUpO1xuICB9XG5cbiAgZnVuY3Rpb24gJHRvdWNoKCk6IHZvaWQge1xuICAgICRmaWVsZFN0YXR1cy52YWx1ZS4kdG91Y2goKTtcbiAgICAkZWFjaFN0YXR1cy52YWx1ZS5mb3JFYWNoKCgkZWFjaCkgPT4ge1xuICAgICAgJGVhY2guJHRvdWNoKCk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiAkcmVzZXQoKTogdm9pZCB7XG4gICAgJGZpZWxkU3RhdHVzLnZhbHVlLiRyZXNldCgpO1xuICAgICRlYWNoU3RhdHVzLnZhbHVlLmZvckVhY2goKCRlYWNoKSA9PiB7XG4gICAgICAkZWFjaC4kcmVzZXQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uICR2YWxpZGF0ZSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgJGZpZWxkU3RhdHVzLnZhbHVlLiR2YWxpZGF0ZSgpLFxuICAgICAgICAuLi4kZWFjaFN0YXR1cy52YWx1ZS5tYXAoKHJ1bGUpID0+IHtcbiAgICAgICAgICByZXR1cm4gcnVsZS4kdmFsaWRhdGUoKTtcbiAgICAgICAgfSksXG4gICAgICBdKTtcbiAgICAgIHJldHVybiByZXN1bHRzLmV2ZXJ5KCh2YWx1ZSkgPT4gISF2YWx1ZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uICRjbGVhckV4dGVybmFsRXJyb3JzKCkge1xuICAgIC8vIFRPRE8gY2xlYXIgZXh0ZXJuYWwgZXJyb3JzXG4gIH1cblxuICByZXR1cm4gcmVhY3RpdmUoe1xuICAgICRmaWVsZDogJGZpZWxkU3RhdHVzLFxuICAgIC4uLnNjb3BlU3RhdGUsXG4gICAgJGVhY2g6ICRlYWNoU3RhdHVzLFxuICAgICR2YWx1ZTogc3RhdGUsXG4gICAgJHZhbGlkYXRlLFxuICAgICR1bndhdGNoLFxuICAgICR3YXRjaCxcbiAgICAkdG91Y2gsXG4gICAgJHJlc2V0LFxuICAgICRjbGVhckV4dGVybmFsRXJyb3JzLFxuICB9KSBzYXRpc2ZpZXMgJEludGVybmFsUmVnbGVDb2xsZWN0aW9uU3RhdHVzO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBSZXF1aXJlZERlZXAgfSBmcm9tICd0eXBlLWZlc3QnO1xuaW1wb3J0IHR5cGUgeyBDb21wdXRlZFJlZiwgRWZmZWN0U2NvcGUsIFJlZiwgV2F0Y2hTdG9wSGFuZGxlIH0gZnJvbSAndnVlJztcbmltcG9ydCB7IGNvbXB1dGVkLCBlZmZlY3RTY29wZSwgcmVhY3RpdmUsIHJlZiwgdG9SZWYsIHRyaWdnZXJSZWYsIHVucmVmLCB3YXRjaCB9IGZyb20gJ3Z1ZSc7XG5pbXBvcnQgdHlwZSB7XG4gIERlZXBNYXliZVJlZixcbiAgQ3VzdG9tUnVsZXNEZWNsYXJhdGlvblRyZWUsXG4gICRJbnRlcm5hbEV4dGVybmFsUmVnbGVFcnJvcnMsXG4gICRJbnRlcm5hbEZvcm1Qcm9wZXJ0eVR5cGVzLFxuICAkSW50ZXJuYWxSZWdsZVBhcnRpYWxWYWxpZGF0aW9uVHJlZSxcbiAgJEludGVybmFsUmVnbGVTdGF0dXMsXG4gICRJbnRlcm5hbFJlZ2xlU3RhdHVzVHlwZSxcbiAgTWF5YmVHZXR0ZXIsXG4gIFJlZ2xlQmVoYXZpb3VyT3B0aW9ucyxcbiAgUmVnbGVFeHRlcm5hbEVycm9yVHJlZSxcbiAgUmVnbGVWYWxpZGF0aW9uR3JvdXBFbnRyeSxcbiAgUmVzb2x2ZWRSZWdsZUJlaGF2aW91ck9wdGlvbnMsXG4gICRJbnRlcm5hbFJlZ2xlRXJyb3JzLFxufSBmcm9tICcuLi8uLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBtZXJnZUFycmF5R3JvdXBQcm9wZXJ0aWVzLCBtZXJnZUJvb2xlYW5Hcm91cFByb3BlcnRpZXMgfSBmcm9tICcuLi8uLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBpc1JlZk9iamVjdCwgaXNWdWVTdXBlcmlvck9yRXF1YWxUbzNkb3RGaXZlLCB1bndyYXBHZXR0ZXIgfSBmcm9tICcuLi8uLi8uLi91dGlscyc7XG5pbXBvcnQgdHlwZSB7IFJlZ2xlU3RvcmFnZSB9IGZyb20gJy4uLy4uL3VzZVN0b3JhZ2UnO1xuaW1wb3J0IHtcbiAgaXNDb2xsZWN0aW9uUnVsZXNEZWYsXG4gIGlzTmVzdGVkUnVsZXNEZWYsXG4gIGlzU3RhdGVBcnJheSxcbiAgaXNWYWxpZGF0b3JSdWxlc0RlZixcbn0gZnJvbSAnLi4vZ3VhcmRzJztcbmltcG9ydCB7IGNyZWF0ZVJlYWN0aXZlQ29sbGVjdGlvblN0YXR1cyB9IGZyb20gJy4vY3JlYXRlUmVhY3RpdmVDb2xsZWN0aW9uU3RhdHVzJztcbmltcG9ydCB7IGNyZWF0ZVJlYWN0aXZlRmllbGRTdGF0dXMgfSBmcm9tICcuL2NyZWF0ZVJlYWN0aXZlRmllbGRTdGF0dXMnO1xuaW1wb3J0IHsgZXh0cmFjdE5lc3RlZEVycm9ycyB9IGZyb20gJy4uL3VzZUVycm9ycyc7XG5cbmludGVyZmFjZSBDcmVhdGVSZWFjdGl2ZU5lc3RlZFN0YXR1cyB7XG4gIHJvb3RSdWxlcz86IFJlZjwkSW50ZXJuYWxSZWdsZVBhcnRpYWxWYWxpZGF0aW9uVHJlZT47XG4gIHNjb3BlUnVsZXM6IFJlZjwkSW50ZXJuYWxSZWdsZVBhcnRpYWxWYWxpZGF0aW9uVHJlZT47XG4gIHN0YXRlOiBSZWY8UmVjb3JkPHN0cmluZywgYW55Pj47XG4gIGN1c3RvbU1lc3NhZ2VzPzogQ3VzdG9tUnVsZXNEZWNsYXJhdGlvblRyZWU7XG4gIHBhdGg/OiBzdHJpbmc7XG4gIGluZGV4PzogbnVtYmVyO1xuICBzdG9yYWdlOiBSZWdsZVN0b3JhZ2U7XG4gIG9wdGlvbnM6IFJlc29sdmVkUmVnbGVCZWhhdmlvdXJPcHRpb25zO1xuICBleHRlcm5hbEVycm9yczogUmVhZG9ubHk8UmVmPFJlZ2xlRXh0ZXJuYWxFcnJvclRyZWUgfCB1bmRlZmluZWQ+PjtcbiAgdmFsaWRhdGlvbkdyb3Vwcz86XG4gICAgfCAoKHJ1bGVzOiB7XG4gICAgICAgIFt4OiBzdHJpbmddOiAkSW50ZXJuYWxSZWdsZVN0YXR1c1R5cGU7XG4gICAgICB9KSA9PiBSZWNvcmQ8c3RyaW5nLCBSZWdsZVZhbGlkYXRpb25Hcm91cEVudHJ5W10+KVxuICAgIHwgdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVhY3RpdmVOZXN0ZWRTdGF0dXMoe1xuICBzY29wZVJ1bGVzLFxuICBzdGF0ZSxcbiAgY3VzdG9tTWVzc2FnZXMsXG4gIHBhdGggPSAnJyxcbiAgcm9vdFJ1bGVzLFxuICBzdG9yYWdlLFxuICBvcHRpb25zLFxuICBleHRlcm5hbEVycm9ycyxcbiAgdmFsaWRhdGlvbkdyb3Vwcyxcbn06IENyZWF0ZVJlYWN0aXZlTmVzdGVkU3RhdHVzKTogJEludGVybmFsUmVnbGVTdGF0dXMge1xuICB0eXBlIFNjb3BlU3RhdGUgPSB7XG4gICAgJGRpcnR5OiBDb21wdXRlZFJlZjxib29sZWFuPjtcbiAgICAkYW55RGlydHk6IENvbXB1dGVkUmVmPGJvb2xlYW4+O1xuICAgICRpbnZhbGlkOiBDb21wdXRlZFJlZjxib29sZWFuPjtcbiAgICAkdmFsaWQ6IENvbXB1dGVkUmVmPGJvb2xlYW4+O1xuICAgICRlcnJvcjogQ29tcHV0ZWRSZWY8Ym9vbGVhbj47XG4gICAgJHBlbmRpbmc6IENvbXB1dGVkUmVmPGJvb2xlYW4+O1xuICAgICRlcnJvcnM6IENvbXB1dGVkUmVmPFJlY29yZDxzdHJpbmcsICRJbnRlcm5hbFJlZ2xlRXJyb3JzPj47XG4gICAgJHNpbGVudEVycm9yczogQ29tcHV0ZWRSZWY8UmVjb3JkPHN0cmluZywgJEludGVybmFsUmVnbGVFcnJvcnM+PjtcbiAgfTtcbiAgbGV0IHNjb3BlOiBFZmZlY3RTY29wZTtcbiAgbGV0IHNjb3BlU3RhdGUhOiBTY29wZVN0YXRlO1xuICBsZXQgJHVud2F0Y2hGaWVsZHM6IFdhdGNoU3RvcEhhbmRsZTtcbiAgbGV0ICR1bndhdGNoU3RhdGU6IFdhdGNoU3RvcEhhbmRsZTtcbiAgbGV0ICR1bndhdGNoR3JvdXBzOiBXYXRjaFN0b3BIYW5kbGU7XG5cbiAgZnVuY3Rpb24gY3JlYXRlUmVhY3RpdmVGaWVsZHNTdGF0dXMod2F0Y2ggPSB0cnVlLCBmb3JjZUZyb21HZXR0ZXIgPSBmYWxzZSkge1xuICAgICRmaWVsZHMudmFsdWUgPSBudWxsITtcbiAgICB0cmlnZ2VyUmVmKCRmaWVsZHMpO1xuXG4gICAgY29uc3Qgc2NvcGVkUnVsZXNTdGF0dXMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyhzY29wZVJ1bGVzLnZhbHVlKVxuICAgICAgICAubWFwKChbc3RhdGVQcm9wS2V5LCBzdGF0ZVByb3BSdWxlc10pID0+IHtcbiAgICAgICAgICBpZiAoc3RhdGVQcm9wUnVsZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXRlUmVmID0gdG9SZWYoc3RhdGUudmFsdWUsIHN0YXRlUHJvcEtleSk7XG4gICAgICAgICAgICBjb25zdCBzdGF0ZVByb3BSdWxlc1JlZiA9IHRvUmVmKCgpID0+IHN0YXRlUHJvcFJ1bGVzKTtcbiAgICAgICAgICAgIGNvbnN0ICRleHRlcm5hbEVycm9ycyA9IHRvUmVmKCgpID0+IGV4dGVybmFsRXJyb3JzLnZhbHVlPy5bc3RhdGVQcm9wS2V5XSk7XG4gICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICBzdGF0ZVByb3BLZXksXG4gICAgICAgICAgICAgIGNyZWF0ZVJlYWN0aXZlQ2hpbGRyZW5TdGF0dXMoe1xuICAgICAgICAgICAgICAgIHN0YXRlOiBzdGF0ZVJlZixcbiAgICAgICAgICAgICAgICBydWxlc0RlZjogc3RhdGVQcm9wUnVsZXNSZWYsXG4gICAgICAgICAgICAgICAgY3VzdG9tTWVzc2FnZXMsXG4gICAgICAgICAgICAgICAgcGF0aDogcGF0aCA/IGAke3BhdGh9LiR7c3RhdGVQcm9wS2V5fWAgOiBzdGF0ZVByb3BLZXksXG4gICAgICAgICAgICAgICAgc3RvcmFnZSxcbiAgICAgICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgICAgIGV4dGVybmFsRXJyb3JzOiAkZXh0ZXJuYWxFcnJvcnMsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9KVxuICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgIChydWxlKTogcnVsZSBpcyBbc3RyaW5nLCAkSW50ZXJuYWxSZWdsZVN0YXR1c1R5cGVdID0+ICEhcnVsZS5sZW5ndGggJiYgcnVsZVsxXSAhPSBudWxsXG4gICAgICAgIClcbiAgICApO1xuXG4gICAgY29uc3QgZXh0ZXJuYWxSdWxlc1N0YXR1cyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKHVucmVmKGV4dGVybmFsRXJyb3JzKSA/PyB7fSlcbiAgICAgICAgLmZpbHRlcigoW2tleV0pID0+ICEoa2V5IGluIHNjb3BlUnVsZXMudmFsdWUpKVxuICAgICAgICAubWFwKChba2V5LCBlcnJvcnNdKSA9PiB7XG4gICAgICAgICAgaWYgKGVycm9ycykge1xuICAgICAgICAgICAgY29uc3Qgc3RhdGVQcm9wUnVsZXNSZWYgPSB0b1JlZigoKSA9PiAoe30pKTtcbiAgICAgICAgICAgIGNvbnN0ICRleHRlcm5hbEVycm9ycyA9IHRvUmVmKCgpID0+IGVycm9ycyk7XG4gICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgIGNyZWF0ZVJlYWN0aXZlQ2hpbGRyZW5TdGF0dXMoe1xuICAgICAgICAgICAgICAgIHN0YXRlOiByZWYodW5kZWZpbmVkKSxcbiAgICAgICAgICAgICAgICBydWxlc0RlZjogc3RhdGVQcm9wUnVsZXNSZWYsXG4gICAgICAgICAgICAgICAgY3VzdG9tTWVzc2FnZXMsXG4gICAgICAgICAgICAgICAgcGF0aDogcGF0aCA/IGAke3BhdGh9LiR7a2V5fWAgOiBrZXksXG4gICAgICAgICAgICAgICAgc3RvcmFnZSxcbiAgICAgICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgICAgIGV4dGVybmFsRXJyb3JzOiAkZXh0ZXJuYWxFcnJvcnMsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9KVxuICAgICk7XG5cbiAgICBjb25zdCBncm91cHMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyh2YWxpZGF0aW9uR3JvdXBzPy4oc2NvcGVkUnVsZXNTdGF0dXMpID8/IHt9KS5tYXAoKFtrZXksIGVudHJpZXNdKSA9PiB7XG4gICAgICAgIGlmIChlbnRyaWVzLmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIC4uLk9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICAgICAgICAoWyckaW52YWxpZCcsICckZXJyb3InLCAnJHBlbmRpbmcnLCAnJGRpcnR5JywgJyR2YWxpZCddIGFzIGNvbnN0KS5tYXAoXG4gICAgICAgICAgICAgICAgICAocHJvcGVydHkpID0+IFtcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydHksXG4gICAgICAgICAgICAgICAgICAgIG1lcmdlQm9vbGVhbkdyb3VwUHJvcGVydGllcyhcbiAgICAgICAgICAgICAgICAgICAgICB0b1JlZigoKSA9PiBlbnRyaWVzKSxcbiAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgLi4uT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgICAgICAgIChbJyRlcnJvcnMnLCAnJHNpbGVudEVycm9ycyddIGFzIGNvbnN0KS5tYXAoKHByb3BlcnR5KSA9PiBbXG4gICAgICAgICAgICAgICAgICBwcm9wZXJ0eSxcbiAgICAgICAgICAgICAgICAgIG1lcmdlQXJyYXlHcm91cFByb3BlcnRpZXMoXG4gICAgICAgICAgICAgICAgICAgIHRvUmVmKCgpID0+IGVudHJpZXMpLFxuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVxuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgICRmaWVsZHMudmFsdWUgPSB7IC4uLnNjb3BlZFJ1bGVzU3RhdHVzLCAuLi5leHRlcm5hbFJ1bGVzU3RhdHVzLCAuLi5ncm91cHMgfTtcbiAgICBpZiAod2F0Y2gpIHtcbiAgICAgICR3YXRjaCgpO1xuICAgIH1cbiAgfVxuXG4gIGxldCAkZmllbGRzOiBSZWY8UmVjb3JkPHN0cmluZywgJEludGVybmFsUmVnbGVTdGF0dXNUeXBlPj4gPSBzdG9yYWdlLmdldEZpZWxkc0VudHJ5KHBhdGgpO1xuICBjcmVhdGVSZWFjdGl2ZUZpZWxkc1N0YXR1cygpO1xuXG4gIGZ1bmN0aW9uICRyZXNldCgpOiB2b2lkIHtcbiAgICBjcmVhdGVSZWFjdGl2ZUZpZWxkc1N0YXR1cyhmYWxzZSk7XG4gICAgT2JqZWN0LmVudHJpZXMoJGZpZWxkcy52YWx1ZSkuZm9yRWFjaCgoW18sIHN0YXR1c09yRmllbGRdKSA9PiB7XG4gICAgICBzdGF0dXNPckZpZWxkLiRyZXNldCgpO1xuICAgIH0pO1xuICAgICR3YXRjaCgpO1xuICB9XG5cbiAgZnVuY3Rpb24gJHRvdWNoKCk6IHZvaWQge1xuICAgIE9iamVjdC5lbnRyaWVzKCRmaWVsZHMudmFsdWUpLmZvckVhY2goKFtfLCBzdGF0dXNPckZpZWxkXSkgPT4ge1xuICAgICAgc3RhdHVzT3JGaWVsZC4kdG91Y2goKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uICR2YWxpZGF0ZSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoJGZpZWxkcy52YWx1ZSkubWFwKChbXywgc3RhdHVzT3JGaWVsZF0pID0+IHtcbiAgICAgICAgICByZXR1cm4gc3RhdHVzT3JGaWVsZC4kdmFsaWRhdGUoKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICByZXR1cm4gcmVzdWx0cy5ldmVyeSgodmFsdWUpID0+IHtcbiAgICAgICAgaWYgKHZhbHVlLnN0YXR1cyA9PT0gJ2Z1bGZpbGxlZCcpIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWUudmFsdWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gJHdhdGNoKCkge1xuICAgIGlmIChyb290UnVsZXMpIHtcbiAgICAgICR1bndhdGNoRmllbGRzID0gd2F0Y2goXG4gICAgICAgIHJvb3RSdWxlcyxcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICR1bndhdGNoKCk7XG4gICAgICAgICAgY3JlYXRlUmVhY3RpdmVGaWVsZHNTdGF0dXMoKTtcbiAgICAgICAgfSxcbiAgICAgICAgeyBkZWVwOiBpc1Z1ZVN1cGVyaW9yT3JFcXVhbFRvM2RvdEZpdmUgPyAxIDogdHJ1ZSwgZmx1c2g6ICdwb3N0JyB9XG4gICAgICApO1xuICAgIH1cblxuICAgIHNjb3BlID0gZWZmZWN0U2NvcGUoKTtcbiAgICBzY29wZVN0YXRlID0gc2NvcGUucnVuKCgpID0+IHtcbiAgICAgIGNvbnN0ICRkaXJ0eSA9IGNvbXB1dGVkPGJvb2xlYW4+KCgpID0+IHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAhIU9iamVjdC5lbnRyaWVzKCRmaWVsZHMudmFsdWUpLmxlbmd0aCAmJlxuICAgICAgICAgIE9iamVjdC5lbnRyaWVzKCRmaWVsZHMudmFsdWUpLmV2ZXJ5KChba2V5LCBzdGF0dXNPckZpZWxkXSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHN0YXR1c09yRmllbGQuJGRpcnR5O1xuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgJGFueURpcnR5ID0gY29tcHV0ZWQ8Ym9vbGVhbj4oKCkgPT4ge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMoJGZpZWxkcy52YWx1ZSkuc29tZSgoW2tleSwgc3RhdHVzT3JGaWVsZF0pID0+IHtcbiAgICAgICAgICByZXR1cm4gc3RhdHVzT3JGaWVsZC4kZGlydHk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0ICRpbnZhbGlkID0gY29tcHV0ZWQ8Ym9vbGVhbj4oKCkgPT4ge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMoJGZpZWxkcy52YWx1ZSkuc29tZSgoW2tleSwgc3RhdHVzT3JGaWVsZF0pID0+IHtcbiAgICAgICAgICByZXR1cm4gc3RhdHVzT3JGaWVsZC4kaW52YWxpZDtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgJHZhbGlkID0gY29tcHV0ZWQ8Ym9vbGVhbj4oKCkgPT4ge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMoJGZpZWxkcy52YWx1ZSkuZXZlcnkoKFtrZXksIHN0YXR1c09yRmllbGRdKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHN0YXR1c09yRmllbGQuJHZhbGlkO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCAkZXJyb3IgPSBjb21wdXRlZDxib29sZWFuPigoKSA9PiB7XG4gICAgICAgIHJldHVybiBPYmplY3QuZW50cmllcygkZmllbGRzLnZhbHVlKS5zb21lKChba2V5LCBzdGF0dXNPckZpZWxkXSkgPT4ge1xuICAgICAgICAgIHJldHVybiBzdGF0dXNPckZpZWxkLiRlcnJvcjtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgJHBlbmRpbmcgPSBjb21wdXRlZDxib29sZWFuPigoKSA9PiB7XG4gICAgICAgIHJldHVybiBPYmplY3QuZW50cmllcygkZmllbGRzLnZhbHVlKS5zb21lKChba2V5LCBzdGF0dXNPckZpZWxkXSkgPT4ge1xuICAgICAgICAgIHJldHVybiBzdGF0dXNPckZpZWxkLiRwZW5kaW5nO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCAkZXJyb3JzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICByZXR1cm4gZXh0cmFjdE5lc3RlZEVycm9ycygkZmllbGRzLnZhbHVlKTtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgJHNpbGVudEVycm9ycyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgcmV0dXJuIGV4dHJhY3ROZXN0ZWRFcnJvcnMoJGZpZWxkcy52YWx1ZSwgdHJ1ZSk7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgJGRpcnR5LFxuICAgICAgICAkYW55RGlydHksXG4gICAgICAgICRpbnZhbGlkLFxuICAgICAgICAkdmFsaWQsXG4gICAgICAgICRlcnJvcixcbiAgICAgICAgJHBlbmRpbmcsXG4gICAgICAgICRlcnJvcnMsXG4gICAgICAgICRzaWxlbnRFcnJvcnMsXG4gICAgICB9IHNhdGlzZmllcyBTY29wZVN0YXRlO1xuICAgIH0pITtcbiAgfVxuXG4gIGZ1bmN0aW9uICR1bndhdGNoKCkge1xuICAgIGlmICgkZmllbGRzLnZhbHVlKSB7XG4gICAgICBPYmplY3QuZW50cmllcygkZmllbGRzLnZhbHVlKS5mb3JFYWNoKChbXywgZmllbGRdKSA9PiB7XG4gICAgICAgIGZpZWxkLiR1bndhdGNoKCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAkdW53YXRjaEZpZWxkcz8uKCk7XG4gICAgJHVud2F0Y2hTdGF0ZT8uKCk7XG4gICAgJHVud2F0Y2hHcm91cHM/LigpO1xuICAgIHNjb3BlLnN0b3AoKTtcbiAgICBzY29wZSA9IGVmZmVjdFNjb3BlKCk7XG4gIH1cblxuICBmdW5jdGlvbiAkY2xlYXJFeHRlcm5hbEVycm9ycygpIHtcbiAgICBPYmplY3QuZW50cmllcygkZmllbGRzLnZhbHVlKS5mb3JFYWNoKChbXywgZmllbGRdKSA9PiB7XG4gICAgICBmaWVsZC4kY2xlYXJFeHRlcm5hbEVycm9ycygpO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHJlYWN0aXZlKHtcbiAgICAuLi5zY29wZVN0YXRlLFxuICAgICRmaWVsZHMsXG4gICAgJHZhbHVlOiBzdGF0ZSxcbiAgICAkcmVzZXQsXG4gICAgJHRvdWNoLFxuICAgICR2YWxpZGF0ZSxcbiAgICAkdW53YXRjaCxcbiAgICAkd2F0Y2gsXG4gICAgJGNsZWFyRXh0ZXJuYWxFcnJvcnMsXG4gIH0pIHNhdGlzZmllcyAkSW50ZXJuYWxSZWdsZVN0YXR1cztcbn1cblxuaW50ZXJmYWNlIENyZWF0ZVJlYWN0aXZlQ2hpbGRyZW5TdGF0dXMge1xuICBzdGF0ZTogUmVmPHVua25vd24+O1xuICBydWxlc0RlZjogUmVmPCRJbnRlcm5hbEZvcm1Qcm9wZXJ0eVR5cGVzLCBhbnk+O1xuICBjdXN0b21NZXNzYWdlcz86IEN1c3RvbVJ1bGVzRGVjbGFyYXRpb25UcmVlO1xuICBwYXRoOiBzdHJpbmc7XG4gIGluZGV4PzogbnVtYmVyO1xuICBzdG9yYWdlOiBSZWdsZVN0b3JhZ2U7XG4gIG9wdGlvbnM6IERlZXBNYXliZVJlZjxSZXF1aXJlZERlZXA8UmVnbGVCZWhhdmlvdXJPcHRpb25zPj47XG4gIGV4dGVybmFsRXJyb3JzOiBSZWFkb25seTxSZWY8JEludGVybmFsRXh0ZXJuYWxSZWdsZUVycm9ycyB8IHVuZGVmaW5lZD4+O1xuICBvblVud2F0Y2g/OiAoKSA9PiB2b2lkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVhY3RpdmVDaGlsZHJlblN0YXR1cyh7XG4gIHN0YXRlLFxuICBydWxlc0RlZixcbiAgY3VzdG9tTWVzc2FnZXMsXG4gIHBhdGgsXG4gIHN0b3JhZ2UsXG4gIG9wdGlvbnMsXG4gIGV4dGVybmFsRXJyb3JzLFxuICBpbmRleCxcbiAgb25VbndhdGNoLFxufTogQ3JlYXRlUmVhY3RpdmVDaGlsZHJlblN0YXR1cyk6ICRJbnRlcm5hbFJlZ2xlU3RhdHVzVHlwZSB8IG51bGwge1xuICBpZiAoaXNDb2xsZWN0aW9uUnVsZXNEZWYocnVsZXNEZWYpKSB7XG4gICAgcmV0dXJuIGNyZWF0ZVJlYWN0aXZlQ29sbGVjdGlvblN0YXR1cyh7XG4gICAgICBzdGF0ZTogc3RhdGUgYXMgUmVmPHVua25vd24gJiB7ICRpZD86IHN0cmluZyB9W10+LFxuICAgICAgcnVsZXNEZWYsXG4gICAgICBjdXN0b21NZXNzYWdlcyxcbiAgICAgIHBhdGgsXG4gICAgICBzdG9yYWdlLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIGluZGV4LFxuICAgICAgZXh0ZXJuYWxFcnJvcnMsXG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoaXNOZXN0ZWRSdWxlc0RlZihzdGF0ZSwgcnVsZXNEZWYpICYmIGlzUmVmT2JqZWN0KHN0YXRlKSkge1xuICAgIHJldHVybiBjcmVhdGVSZWFjdGl2ZU5lc3RlZFN0YXR1cyh7XG4gICAgICBzY29wZVJ1bGVzOiBydWxlc0RlZixcbiAgICAgIHN0YXRlLFxuICAgICAgY3VzdG9tTWVzc2FnZXMsXG4gICAgICBwYXRoLFxuICAgICAgc3RvcmFnZSxcbiAgICAgIG9wdGlvbnMsXG4gICAgICBpbmRleCxcbiAgICAgIGV4dGVybmFsRXJyb3JzOiBleHRlcm5hbEVycm9ycyBhcyBSZWFkb25seTxSZWY8UmVnbGVFeHRlcm5hbEVycm9yVHJlZSB8IHVuZGVmaW5lZD4+LFxuICAgIH0pO1xuICB9IGVsc2UgaWYgKGlzVmFsaWRhdG9yUnVsZXNEZWYocnVsZXNEZWYpKSB7XG4gICAgcmV0dXJuIGNyZWF0ZVJlYWN0aXZlRmllbGRTdGF0dXMoe1xuICAgICAgc3RhdGUsXG4gICAgICBydWxlc0RlZixcbiAgICAgIGN1c3RvbU1lc3NhZ2VzLFxuICAgICAgcGF0aCxcbiAgICAgIHN0b3JhZ2UsXG4gICAgICBvcHRpb25zLFxuICAgICAgaW5kZXgsXG4gICAgICBleHRlcm5hbEVycm9yczogZXh0ZXJuYWxFcnJvcnMgYXMgUmVmPHN0cmluZ1tdIHwgdW5kZWZpbmVkPixcbiAgICAgIG9uVW53YXRjaCxcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBDb21wdXRlZFJlZiwgUmVmIH0gZnJvbSAndnVlJztcbmltcG9ydCB7IGNvbXB1dGVkLCByZWFjdGl2ZSwgdW5yZWYgfSBmcm9tICd2dWUnO1xuaW1wb3J0IHR5cGUge1xuICAkSW50ZXJuYWxSZWdsZVBhcnRpYWxWYWxpZGF0aW9uVHJlZSxcbiAgQ3VzdG9tUnVsZXNEZWNsYXJhdGlvblRyZWUsXG4gIFJlc29sdmVkUmVnbGVCZWhhdmlvdXJPcHRpb25zLFxufSBmcm9tICcuLi8uLi8uLi90eXBlcyc7XG5pbXBvcnQgeyB1c2VTdG9yYWdlIH0gZnJvbSAnLi4vLi4vdXNlU3RvcmFnZSc7XG5pbXBvcnQgeyB1c2VFcnJvcnMgfSBmcm9tICcuLi91c2VFcnJvcnMnO1xuaW1wb3J0IHsgY3JlYXRlUmVhY3RpdmVOZXN0ZWRTdGF0dXMgfSBmcm9tICcuL2NyZWF0ZVJlYWN0aXZlTmVzdGVkU3RhdHVzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVN0YXRlUHJvcGVydGllcyhcbiAgc2NvcGVSdWxlczogQ29tcHV0ZWRSZWY8JEludGVybmFsUmVnbGVQYXJ0aWFsVmFsaWRhdGlvblRyZWU+LFxuICBzdGF0ZTogUmVmPFJlY29yZDxzdHJpbmcsIGFueT4+LFxuICBvcHRpb25zOiBSZXNvbHZlZFJlZ2xlQmVoYXZpb3VyT3B0aW9ucyxcbiAgY3VzdG9tUnVsZXM/OiAoKSA9PiBDdXN0b21SdWxlc0RlY2xhcmF0aW9uVHJlZVxuKSB7XG4gIGNvbnN0IHN0b3JhZ2UgPSB1c2VTdG9yYWdlKCk7XG5cbiAgY29uc3QgZXh0ZXJuYWxFcnJvcnMgPSBjb21wdXRlZCgoKSA9PiB1bnJlZihvcHRpb25zLmV4dGVybmFsRXJyb3JzKSk7XG5cbiAgY29uc3QgcmVnbGUgPSByZWFjdGl2ZShcbiAgICBjcmVhdGVSZWFjdGl2ZU5lc3RlZFN0YXR1cyh7XG4gICAgICByb290UnVsZXM6IHNjb3BlUnVsZXMsXG4gICAgICBzY29wZVJ1bGVzLFxuICAgICAgc3RhdGUsXG4gICAgICBjdXN0b21NZXNzYWdlczogY3VzdG9tUnVsZXM/LigpLFxuICAgICAgc3RvcmFnZSxcbiAgICAgIG9wdGlvbnMsXG4gICAgICBleHRlcm5hbEVycm9ycyxcbiAgICAgIHZhbGlkYXRpb25Hcm91cHM6IG9wdGlvbnMudmFsaWRhdGlvbkdyb3VwcyxcbiAgICB9KVxuICApO1xuXG4gIGNvbnN0IGVycm9ycyA9IHVzZUVycm9ycyhyZWdsZSk7XG5cbiAgcmV0dXJuIHsgcmVnbGUsIGVycm9ycyB9O1xufVxuIiwiaW1wb3J0IHR5cGUgeyBSZXF1aXJlZERlZXAgfSBmcm9tICd0eXBlLWZlc3QnO1xuaW1wb3J0IHR5cGUgeyBDb21wdXRlZFJlZiwgTWF5YmVSZWYsIFJlZiB9IGZyb20gJ3Z1ZSc7XG5pbXBvcnQgeyBjb21wdXRlZCwgaXNSZWYsIHJlZiwgdG9SYXcgfSBmcm9tICd2dWUnO1xuaW1wb3J0IHR5cGUge1xuICAkSW50ZXJuYWxSZWdsZVBhcnRpYWxWYWxpZGF0aW9uVHJlZSxcbiAgQWxsUnVsZXNEZWNsYXJhdGlvbnMsXG4gIERlZXBSZWFjdGl2ZVN0YXRlLFxuICBEZWVwU2FmZUZvcm1TdGF0ZSxcbiAgTG9jYWxSZWdsZUJlaGF2aW91ck9wdGlvbnMsXG4gIFJlZ2xlLFxuICBSZWdsZUJlaGF2aW91ck9wdGlvbnMsXG4gIFJlZ2xlRXJyb3JUcmVlLFxuICBSZWdsZUV4dGVybmFsRXJyb3JUcmVlLFxuICBSZWdsZVBhcnRpYWxWYWxpZGF0aW9uVHJlZSxcbiAgUmVnbGVTdGF0dXMsXG4gIFJlZ2xlVmFsaWRhdGlvbkdyb3VwRW50cnksXG4gIFJlc29sdmVkUmVnbGVCZWhhdmlvdXJPcHRpb25zLFxufSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgdHlwZSB7IERlZXBNYXliZVJlZiB9IGZyb20gJy4uLy4uL3R5cGVzL3V0aWxzJztcbmltcG9ydCB7IGNsb25lRGVlcCwgaXNPYmplY3QgfSBmcm9tICcuLi8uLi91dGlscyc7XG5pbXBvcnQgeyB1c2VTdGF0ZVByb3BlcnRpZXMgfSBmcm9tICcuL3VzZVN0YXRlUHJvcGVydGllcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVVc2VSZWdsZUNvbXBvc2FibGU8VEN1c3RvbVJ1bGVzIGV4dGVuZHMgUGFydGlhbDxBbGxSdWxlc0RlY2xhcmF0aW9ucz4+KFxuICBjdXN0b21SdWxlcz86ICgpID0+IFRDdXN0b21SdWxlcyxcbiAgb3B0aW9ucz86IFJlZ2xlQmVoYXZpb3VyT3B0aW9uc1xuKSB7XG4gIGNvbnN0IGdsb2JhbE9wdGlvbnM6IFJlcXVpcmVkRGVlcDxSZWdsZUJlaGF2aW91ck9wdGlvbnM+ID0ge1xuICAgIGF1dG9EaXJ0eTogb3B0aW9ucz8uYXV0b0RpcnR5ID8/IHRydWUsXG4gICAgbGF6eTogb3B0aW9ucz8ubGF6eSA/PyBmYWxzZSxcbiAgICByZXdhcmRFYXJseTogb3B0aW9ucz8ucmV3YXJkRWFybHkgPz8gZmFsc2UsXG4gIH07XG5cbiAgZnVuY3Rpb24gdXNlUmVnbGU8XG4gICAgVFN0YXRlIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBUUnVsZXMgZXh0ZW5kcyBSZWdsZVBhcnRpYWxWYWxpZGF0aW9uVHJlZTxUU3RhdGUsIFBhcnRpYWw8QWxsUnVsZXNEZWNsYXJhdGlvbnM+ICYgVEN1c3RvbVJ1bGVzPixcbiAgICBURXh0ZXJuYWwgZXh0ZW5kcyBSZWdsZUV4dGVybmFsRXJyb3JUcmVlPFRTdGF0ZT4sXG4gICAgVFZhbGlkYXRpb25Hcm91cHMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBSZWdsZVZhbGlkYXRpb25Hcm91cEVudHJ5W10+LFxuICAgIFRWYWxpZCA9IGtleW9mIFRSdWxlcyBleHRlbmRzIGtleW9mIFJlZ2xlUGFydGlhbFZhbGlkYXRpb25UcmVlPFxuICAgICAgVFN0YXRlLFxuICAgICAgUGFydGlhbDxBbGxSdWxlc0RlY2xhcmF0aW9ucz4gJiBUQ3VzdG9tUnVsZXNcbiAgICA+XG4gICAgICA/IHRydWVcbiAgICAgIDogZmFsc2UsXG4gID4oXG4gICAgc3RhdGU6IE1heWJlUmVmPFRTdGF0ZT4gfCBEZWVwUmVhY3RpdmVTdGF0ZTxUU3RhdGU+LFxuICAgIHJ1bGVzRmFjdG9yeTogVFZhbGlkIGV4dGVuZHMgdHJ1ZSA/IFRSdWxlcyB8ICgoKSA9PiBUUnVsZXMpIHwgQ29tcHV0ZWRSZWY8VFJ1bGVzPiA6IG5ldmVyLFxuICAgIG9wdGlvbnM/OiBQYXJ0aWFsPERlZXBNYXliZVJlZjxSZWdsZUJlaGF2aW91ck9wdGlvbnM+PiAmXG4gICAgICBMb2NhbFJlZ2xlQmVoYXZpb3VyT3B0aW9uczxUU3RhdGUsIFRSdWxlcywgVEV4dGVybmFsLCBUVmFsaWRhdGlvbkdyb3Vwcz5cbiAgKTogUmVnbGU8VFN0YXRlLCBUUnVsZXMsIFRFeHRlcm5hbCwgVFZhbGlkYXRpb25Hcm91cHM+IHtcbiAgICBjb25zdCBzY29wZVJ1bGVzID0gaXNSZWYocnVsZXNGYWN0b3J5KVxuICAgICAgPyBydWxlc0ZhY3RvcnlcbiAgICAgIDogY29tcHV0ZWQoXG4gICAgICAgICAgKHR5cGVvZiAocnVsZXNGYWN0b3J5IGFzIFRSdWxlcyB8ICgoKSA9PiBUUnVsZXMpKSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgPyBydWxlc0ZhY3RvcnlcbiAgICAgICAgICAgIDogKCkgPT4gcnVsZXNGYWN0b3J5KSBhcyBhbnlcbiAgICAgICAgKTtcblxuICAgIGNvbnN0IHJlc29sdmVkT3B0aW9uczogUmVzb2x2ZWRSZWdsZUJlaGF2aW91ck9wdGlvbnMgPSB7XG4gICAgICAuLi5nbG9iYWxPcHRpb25zLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9IGFzIGFueTtcblxuICAgIGNvbnN0IHByb2Nlc3NlZFN0YXRlID0gaXNSZWYoc3RhdGUpID8gc3RhdGUgOiAocmVmKHN0YXRlKSBhcyBSZWY8VFN0YXRlPik7XG5cbiAgICBjb25zdCBpbml0aWFsU3RhdGUgPSBjbG9uZURlZXAodG9SYXcocHJvY2Vzc2VkU3RhdGUudmFsdWUpKTtcblxuICAgIGNvbnN0IHsgcmVnbGUsIGVycm9ycyB9ID0gdXNlU3RhdGVQcm9wZXJ0aWVzKFxuICAgICAgc2NvcGVSdWxlcyBhcyBDb21wdXRlZFJlZjwkSW50ZXJuYWxSZWdsZVBhcnRpYWxWYWxpZGF0aW9uVHJlZT4sXG4gICAgICBwcm9jZXNzZWRTdGF0ZSxcbiAgICAgIHJlc29sdmVkT3B0aW9ucyxcbiAgICAgIGN1c3RvbVJ1bGVzXG4gICAgKTtcblxuICAgIGZ1bmN0aW9uIHJlc2V0QWxsKCkge1xuICAgICAgcmVnbGUuJHVud2F0Y2goKTtcbiAgICAgIHJlc2V0VmFsdWVzUmVjdXJzaXZlbHkoc3RhdGUsIGluaXRpYWxTdGF0ZSk7XG4gICAgICByZWdsZS4kcmVzZXQoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZXNldFZhbHVlc1JlY3Vyc2l2ZWx5KFxuICAgICAgY3VycmVudDogUmVmPFJlY29yZDxzdHJpbmcsIE1heWJlUmVmPGFueT4+PiB8IFJlY29yZDxzdHJpbmcsIE1heWJlUmVmPGFueT4+LFxuICAgICAgaW5pdGlhbDogUmVjb3JkPHN0cmluZywgTWF5YmVSZWY8YW55Pj5cbiAgICApIHtcbiAgICAgIE9iamVjdC5lbnRyaWVzKGluaXRpYWwpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICBsZXQgY3VycmVudFJlZiA9IGlzUmVmPFJlY29yZDxzdHJpbmcsIE1heWJlUmVmPGFueT4+PihjdXJyZW50KSA/IGN1cnJlbnQudmFsdWUgOiBjdXJyZW50O1xuICAgICAgICBsZXQgY3VycmVudFZhbHVlID0gaXNSZWYoY3VycmVudFJlZltrZXldKSA/IGN1cnJlbnRSZWZba2V5XS52YWx1ZSA6IGN1cnJlbnRSZWZba2V5XTtcbiAgICAgICAgbGV0IGluaXRpYWxSZWYgPSBpc1JlZihpbml0aWFsW2tleV0pID8gKGluaXRpYWxba2V5XSBhcyBhbnkpLl92YWx1ZSA6IGluaXRpYWxba2V5XTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaW5pdGlhbFJlZikgJiYgQXJyYXkuaXNBcnJheShjdXJyZW50VmFsdWUpKSB7XG4gICAgICAgICAgY3VycmVudFJlZltrZXldID0gW107XG4gICAgICAgICAgaW5pdGlhbFJlZi5mb3JFYWNoKCh2YWwsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBjdXJyZW50UmVmW2tleV1baW5kZXhdID0ge307XG4gICAgICAgICAgICByZXNldFZhbHVlc1JlY3Vyc2l2ZWx5KGN1cnJlbnRSZWZba2V5XVtpbmRleF0sIGluaXRpYWxSZWZbaW5kZXhdKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChpc09iamVjdChpbml0aWFsUmVmKSkge1xuICAgICAgICAgIHJlc2V0VmFsdWVzUmVjdXJzaXZlbHkoY3VycmVudFZhbHVlLCBpbml0aWFsUmVmKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoaXNSZWYoY3VycmVudFJlZltrZXldKSkge1xuICAgICAgICAgICAgY3VycmVudFJlZltrZXldLnZhbHVlID0gaW5pdGlhbFJlZjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY3VycmVudFJlZltrZXldID0gaW5pdGlhbFJlZjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHJlYWR5ID0gY29tcHV0ZWQ8Ym9vbGVhbj4oKCkgPT4ge1xuICAgICAgcmV0dXJuICEocmVnbGUuJGludmFsaWQgfHwgcmVnbGUuJHBlbmRpbmcpO1xuICAgIH0pO1xuXG4gICAgYXN5bmMgZnVuY3Rpb24gdmFsaWRhdGVTdGF0ZSgpOiBQcm9taXNlPGZhbHNlIHwgRGVlcFNhZmVGb3JtU3RhdGU8VFN0YXRlLCBUUnVsZXM+PiB7XG4gICAgICByZWdsZS4kdG91Y2goKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlZ2xlLiR2YWxpZGF0ZSgpO1xuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICByZXR1cm4gcHJvY2Vzc2VkU3RhdGUudmFsdWUgYXMgYW55O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICByZWdsZTogcmVnbGUgYXMgdW5rbm93biBhcyBSZWdsZVN0YXR1czxUU3RhdGUsIFRSdWxlcywgVFZhbGlkYXRpb25Hcm91cHM+LFxuICAgICAgZXJyb3JzOiBlcnJvcnMgYXMgUmVnbGVFcnJvclRyZWU8VFJ1bGVzPixcbiAgICAgIHJlc2V0QWxsLFxuICAgICAgdmFsaWRhdGVTdGF0ZSxcbiAgICAgIHJlYWR5LFxuICAgICAgc3RhdGU6IHByb2Nlc3NlZFN0YXRlLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4gdXNlUmVnbGU7XG59XG5cbmV4cG9ydCBjb25zdCB1c2VSZWdsZSA9IGNyZWF0ZVVzZVJlZ2xlQ29tcG9zYWJsZSgpO1xuIiwiaW1wb3J0IHR5cGUgeyBBbGxSdWxlc0RlY2xhcmF0aW9ucywgUmVnbGVCZWhhdmlvdXJPcHRpb25zIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgY3JlYXRlVXNlUmVnbGVDb21wb3NhYmxlIH0gZnJvbSAnLi91c2VSZWdsZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVSZWdsZUNvbmZpZzxUQ3VzdG9tUnVsZXMgZXh0ZW5kcyBQYXJ0aWFsPEFsbFJ1bGVzRGVjbGFyYXRpb25zPj4oe1xuICBydWxlcyxcbiAgbW9kaWZpZXJzLFxufToge1xuICBydWxlcz86ICgpID0+IFRDdXN0b21SdWxlcztcbiAgbW9kaWZpZXJzPzogUmVnbGVCZWhhdmlvdXJPcHRpb25zO1xufSkge1xuICBjb25zdCB1c2VSZWdsZSA9IGNyZWF0ZVVzZVJlZ2xlQ29tcG9zYWJsZTxUQ3VzdG9tUnVsZXM+KHJ1bGVzLCBtb2RpZmllcnMpO1xuXG4gIHJldHVybiB1c2VSZWdsZTtcbn1cbiJdfQ==