@k8slens/injectable 26.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (5) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +809 -0
  3. package/dist/index.js +2182 -0
  4. package/index.d.ts +1683 -0
  5. package/package.json +53 -0
package/dist/index.js ADDED
@@ -0,0 +1,2182 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
+
19
+ // index.js
20
+ var index_exports = {};
21
+ __export(index_exports, {
22
+ createContainer: () => createContainer_default,
23
+ deregistrationCallbackToken: () => deregistrationCallbackToken,
24
+ deregistrationDecoratorToken: () => deregistrationDecoratorToken,
25
+ getInjectable: () => getInjectable_default,
26
+ getInjectable2: () => getInjectable2_default,
27
+ getInjectableBunch: () => getInjectableBunch_default,
28
+ getInjectionToken: () => getInjectionToken,
29
+ getInjectionToken2: () => getInjectionToken2,
30
+ getKeyedSingletonCompositeKey: () => getKeyedSingletonCompositeKey,
31
+ getSpecificInjectionToken: () => getSpecificInjectionToken,
32
+ getTypedSpecifier: () => getTypedSpecifier,
33
+ injectionDecoratorToken: () => injectionDecoratorToken,
34
+ injectionTokenTag: () => injectionTokenTag,
35
+ instancePurgeCallbackToken: () => instancePurgeCallbackToken,
36
+ instantiationDecoratorToken: () => instantiationDecoratorToken,
37
+ isInjectable: () => isInjectable_default,
38
+ isInjectableBunch: () => isInjectableBunch_default,
39
+ isInjectionToken: () => isInjectionToken_default,
40
+ lifecycleEnum: () => lifecycleEnum_default,
41
+ preInjectCallbackToken: () => preInjectCallbackToken,
42
+ registrationCallbackToken: () => registrationCallbackToken,
43
+ registrationDecoratorToken: () => registrationDecoratorToken,
44
+ toFlatInjectables: () => toFlatInjectables_default
45
+ });
46
+ module.exports = __toCommonJS(index_exports);
47
+
48
+ // src/dependency-injection-container/lifecycleEnum.js
49
+ var nonStoredInstanceKey = Symbol("non-stored-instance-key");
50
+ var storedInstanceKey = Symbol("stored-instance-key");
51
+ var lifecycleEnum_default = {
52
+ singleton: {
53
+ id: "singleton",
54
+ getInstanceKey: () => storedInstanceKey
55
+ },
56
+ keyedSingleton: ({ getInstanceKey }) => ({
57
+ id: "keyedSingleton",
58
+ getInstanceKey
59
+ }),
60
+ transient: {
61
+ id: "transient",
62
+ getInstanceKey: () => nonStoredInstanceKey
63
+ }
64
+ };
65
+
66
+ // src/getCompositeKey/getCompositeKey.js
67
+ var compositeKeySymbol = Symbol("composite-key");
68
+ var getCompositeKey = (...keys) => ({
69
+ [compositeKeySymbol]: true,
70
+ keys
71
+ });
72
+ var isCompositeKey = (thing) => thing && thing[compositeKeySymbol] === true;
73
+
74
+ // src/getInjectable/getInjectable.js
75
+ var injectableSymbol = "injectable";
76
+ var getInjectable_default = ({ lifecycle = lifecycleEnum_default.singleton, ...injectable }) => ({
77
+ aliasType: injectableSymbol,
78
+ lifecycle,
79
+ ...injectable
80
+ });
81
+
82
+ // src/getInjectable2/getInjectable2.js
83
+ var injectableSymbol2 = "injectable2";
84
+ var v2DefaultLifecycle = lifecycleEnum_default.keyedSingleton({
85
+ getInstanceKey: (di, ...args) => {
86
+ if (args.length === 0) return storedInstanceKey;
87
+ return getCompositeKey(...args);
88
+ }
89
+ });
90
+ v2DefaultLifecycle._isV2DefaultLifecycle = true;
91
+ var getInjectable2_default = ({ instantiate: instantiate2, transient = false, ...rest }) => ({
92
+ aliasType: injectableSymbol2,
93
+ instantiate: instantiate2,
94
+ transient,
95
+ lifecycle: transient ? lifecycleEnum_default.transient : v2DefaultLifecycle,
96
+ ...rest
97
+ });
98
+
99
+ // src/getInjectionToken/injectionTokenTag.js
100
+ var injectionTokenTag = "injectionToken";
101
+
102
+ // src/getInjectionToken/getInjectionToken.js
103
+ var injectionTokenSymbol = "injection-token";
104
+ var getInjectionToken = ({
105
+ specificInjectionTokenFactory: specificTokenFactory = getSpecificTokenById,
106
+ target,
107
+ tags,
108
+ ...rest
109
+ }) => {
110
+ const specificTokensBySpeciality = /* @__PURE__ */ new Map();
111
+ const specificTokensBySpecifier = /* @__PURE__ */ new Map();
112
+ const generalToken = Object.assign(target ?? {}, {
113
+ ...rest,
114
+ tags: [injectionTokenTag, ...tags ?? []],
115
+ aliasType: injectionTokenSymbol,
116
+ for: (...specifiers) => {
117
+ const memoizedToken = specifiers.length === 1 ? specificTokensBySpecifier.get(specifiers[0]) : void 0;
118
+ if (memoizedToken) {
119
+ return memoizedToken;
120
+ }
121
+ const specificTokenCandidate = specificTokenFactory(...specifiers);
122
+ const existingSpecificToken = specificTokensBySpeciality.get(
123
+ specificTokenCandidate.speciality
124
+ );
125
+ if (existingSpecificToken) {
126
+ if (specifiers.length === 1) {
127
+ specificTokensBySpecifier.set(specifiers[0], existingSpecificToken);
128
+ }
129
+ return existingSpecificToken;
130
+ }
131
+ const specificToken = specificTokenCandidate;
132
+ specificToken.id = `${generalToken.id}/${specificToken.id}`;
133
+ specificToken.specificTokenOf = generalToken;
134
+ specificToken.maxCacheSize = generalToken.maxCacheSize;
135
+ specificToken.tags = generalToken.tags;
136
+ specificTokensBySpeciality.set(specificToken.speciality, specificToken);
137
+ if (specifiers.length === 1) {
138
+ specificTokensBySpecifier.set(specifiers[0], specificToken);
139
+ }
140
+ return specificToken;
141
+ }
142
+ });
143
+ return generalToken;
144
+ };
145
+ var getSpecificInjectionToken = (...args) => getInjectionToken(...args);
146
+ var getSpecificTokenById = (id) => getInjectionToken({ id, speciality: id });
147
+
148
+ // src/getInjectionToken2/getInjectionToken2.js
149
+ var injectionTokenSymbol2 = "injection-token2";
150
+ var cardinalities = ["one", "zero-or-one", "zero-or-many", "one-or-many"];
151
+ var buildToken = ({
152
+ specificInjectionTokenFactory,
153
+ target,
154
+ tags,
155
+ ...rest
156
+ }) => {
157
+ if (rest.cardinality === void 0) {
158
+ if (rest.speciality === void 0) {
159
+ throw new Error(
160
+ `Tried to create injection token "${rest.id}" without cardinality.`
161
+ );
162
+ }
163
+ } else if (!cardinalities.includes(rest.cardinality)) {
164
+ throw new Error(
165
+ `Tried to create injection token "${rest.id}" with unknown cardinality "${rest.cardinality}".`
166
+ );
167
+ }
168
+ const specificTokensBySpeciality = /* @__PURE__ */ new Map();
169
+ const specificTokensBySpecifier = /* @__PURE__ */ new Map();
170
+ const generalToken = Object.assign(target ?? {}, {
171
+ ...rest,
172
+ tags: [injectionTokenTag, ...tags ?? []],
173
+ aliasType: injectionTokenSymbol2,
174
+ // No factory means no `.for()` at all, matching the type: a token isn't
175
+ // required to be part of a family. A factory also makes the token
176
+ // abstract: it's only ever useful resolved via a real `.for()`, so it
177
+ // cannot be injected/registered directly — see checkForAbstractTokenFor
178
+ // and register.js's `injectionToken?.abstract` check.
179
+ ...specificInjectionTokenFactory && {
180
+ abstract: true,
181
+ for: (...specifiers) => {
182
+ const memoizedToken = specifiers.length === 1 ? specificTokensBySpecifier.get(specifiers[0]) : void 0;
183
+ if (memoizedToken) {
184
+ return memoizedToken;
185
+ }
186
+ const specificTokenCandidate = specificInjectionTokenFactory(
187
+ ...specifiers
188
+ );
189
+ const existingSpecificToken = specificTokensBySpeciality.get(
190
+ specificTokenCandidate.speciality
191
+ );
192
+ if (existingSpecificToken) {
193
+ if (specifiers.length === 1) {
194
+ specificTokensBySpecifier.set(specifiers[0], existingSpecificToken);
195
+ }
196
+ return existingSpecificToken;
197
+ }
198
+ const specificToken = specificTokenCandidate;
199
+ specificToken.id = `${generalToken.id}/${specificToken.id}`;
200
+ specificToken.specificTokenOf = generalToken;
201
+ specificToken.maxCacheSize = generalToken.maxCacheSize;
202
+ specificToken.tags = generalToken.tags;
203
+ specificToken.cardinality = specificToken.cardinality ?? generalToken.cardinality;
204
+ specificTokensBySpeciality.set(specificToken.speciality, specificToken);
205
+ if (specifiers.length === 1) {
206
+ specificTokensBySpecifier.set(specifiers[0], specificToken);
207
+ }
208
+ return specificToken;
209
+ }
210
+ }
211
+ });
212
+ return generalToken;
213
+ };
214
+ var getInjectionToken2 = (...args) => {
215
+ var _a;
216
+ if (args.length !== 1) {
217
+ throw new Error(
218
+ `Tried to create injection token${((_a = args[0]) == null ? void 0 : _a.id) ? ` "${args[0].id}"` : ""} with ${args.length} arguments; getInjectionToken2 takes exactly one (options).`
219
+ );
220
+ }
221
+ const [options] = args;
222
+ return (specificInjectionTokenFactory) => buildToken({ ...options, specificInjectionTokenFactory });
223
+ };
224
+
225
+ // src/dependency-injection-container/tokens.js
226
+ var untagged = (token) => {
227
+ token.tags = void 0;
228
+ return token;
229
+ };
230
+ var registrationCallbackToken = untagged(
231
+ getInjectionToken({
232
+ id: "registration-callback-token"
233
+ })
234
+ );
235
+ var deregistrationCallbackToken = untagged(
236
+ getInjectionToken({
237
+ id: "deregistration-callback-token"
238
+ })
239
+ );
240
+ var instantiationDecoratorToken = untagged(
241
+ getInjectionToken2({
242
+ id: "instantiate-decorator-token",
243
+ cardinality: "zero-or-many"
244
+ })((target) => getInjectionToken2({ id: target.id, speciality: target })())
245
+ );
246
+ var injectionDecoratorToken = untagged(
247
+ getInjectionToken2({
248
+ id: "injection-decorator-token",
249
+ cardinality: "zero-or-many"
250
+ })((target) => getInjectionToken2({ id: target.id, speciality: target })())
251
+ );
252
+ var instancePurgeCallbackToken = untagged(
253
+ getInjectionToken2({
254
+ id: "instance-purge-callback-token",
255
+ cardinality: "zero-or-many"
256
+ })((target) => getInjectionToken2({ id: target.id, speciality: target })())
257
+ );
258
+ var registrationDecoratorToken = untagged(
259
+ getInjectionToken2({
260
+ id: "registration-decorator-token",
261
+ cardinality: "zero-or-many"
262
+ })((target) => getInjectionToken2({ id: target.id, speciality: target })())
263
+ );
264
+ var deregistrationDecoratorToken = untagged(
265
+ getInjectionToken2({
266
+ id: "deregistration-decorator-token",
267
+ cardinality: "zero-or-many"
268
+ })((target) => getInjectionToken2({ id: target.id, speciality: target })())
269
+ );
270
+ var preInjectCallbackToken = untagged(
271
+ getInjectionToken2({
272
+ id: "pre-inject-callback-token",
273
+ cardinality: "zero-or-many"
274
+ })((target) => getInjectionToken2({ id: target.id, speciality: target })())
275
+ );
276
+
277
+ // src/composite-map/composite-map.js
278
+ var isObjectKey = (key) => typeof key === "object" && key !== null || typeof key === "function";
279
+ var makeNode = () => ({
280
+ layer: /* @__PURE__ */ new Map(),
281
+ weakLayer: /* @__PURE__ */ new WeakMap(),
282
+ children: /* @__PURE__ */ new Map(),
283
+ weakChildren: /* @__PURE__ */ new WeakMap(),
284
+ hasWeakEntries: false
285
+ });
286
+ var CompositeMap = class {
287
+ #internalMap = makeNode();
288
+ constructor(initialValues = []) {
289
+ for (const [key, value] of initialValues) {
290
+ this.set(key, value);
291
+ }
292
+ }
293
+ #layerFor(mapEntry, key) {
294
+ return isObjectKey(key) ? mapEntry.weakLayer : mapEntry.layer;
295
+ }
296
+ #childrenFor(mapEntry, key) {
297
+ return isObjectKey(key) ? mapEntry.weakChildren : mapEntry.children;
298
+ }
299
+ #set(mapEntry, key, value) {
300
+ if (key.length === 1) {
301
+ const first = key[0];
302
+ this.#layerFor(mapEntry, first).set(first, value);
303
+ if (isObjectKey(first)) mapEntry.hasWeakEntries = true;
304
+ } else {
305
+ const [first, ...rest] = key;
306
+ const childMap = this.#childrenFor(mapEntry, first);
307
+ let nextMapEntry = childMap.get(first);
308
+ if (!nextMapEntry) {
309
+ nextMapEntry = makeNode();
310
+ childMap.set(first, nextMapEntry);
311
+ if (isObjectKey(first)) mapEntry.hasWeakEntries = true;
312
+ }
313
+ this.#set(nextMapEntry, rest, value);
314
+ }
315
+ }
316
+ set(key, value) {
317
+ if (!Array.isArray(key)) {
318
+ throw new TypeError("Expected key to be an array");
319
+ }
320
+ if (key.length === 0) {
321
+ throw new TypeError("Keys must be at least length 1");
322
+ }
323
+ this.#set(this.#internalMap, key, value);
324
+ }
325
+ #get(mapEntry, key) {
326
+ if (key.length === 1) {
327
+ return this.#layerFor(mapEntry, key[0]).get(key[0]);
328
+ } else {
329
+ const [first, ...rest] = key;
330
+ const nextMapEntry = this.#childrenFor(mapEntry, first).get(first);
331
+ if (!nextMapEntry) {
332
+ return void 0;
333
+ }
334
+ return this.#get(nextMapEntry, rest);
335
+ }
336
+ }
337
+ get(key) {
338
+ if (!Array.isArray(key)) {
339
+ throw new TypeError("Expected key to be an array");
340
+ }
341
+ if (key.length === 0) {
342
+ return void 0;
343
+ }
344
+ return this.#get(this.#internalMap, key);
345
+ }
346
+ #has(mapEntry, key) {
347
+ if (key.length === 1) {
348
+ return this.#layerFor(mapEntry, key[0]).has(key[0]);
349
+ } else {
350
+ const [first, ...rest] = key;
351
+ const nextMapEntry = this.#childrenFor(mapEntry, first).get(first);
352
+ if (!nextMapEntry) {
353
+ return false;
354
+ }
355
+ return this.#has(nextMapEntry, rest);
356
+ }
357
+ }
358
+ has(key) {
359
+ if (!Array.isArray(key)) {
360
+ throw new TypeError("Expected key to be an array");
361
+ }
362
+ if (key.length === 0) {
363
+ return false;
364
+ }
365
+ return this.#has(this.#internalMap, key);
366
+ }
367
+ *values() {
368
+ for (const [, value] of this.entries()) {
369
+ yield value;
370
+ }
371
+ }
372
+ *keys() {
373
+ for (const [key] of this.entries()) {
374
+ yield key;
375
+ }
376
+ }
377
+ *#entries(mapEntry, key) {
378
+ for (const [layerKey, layerValue] of mapEntry.layer.entries()) {
379
+ yield [[...key, layerKey], layerValue];
380
+ }
381
+ for (const [layerKey, layerMapEntry] of mapEntry.children.entries()) {
382
+ yield* this.#entries(layerMapEntry, [...key, layerKey]);
383
+ }
384
+ }
385
+ *entries() {
386
+ yield* this.#entries(this.#internalMap, []);
387
+ }
388
+ #canPrune(node) {
389
+ return !node.hasWeakEntries && node.layer.size === 0 && node.children.size === 0;
390
+ }
391
+ #delete(mapEntry, key) {
392
+ if (key.length === 1) {
393
+ return this.#layerFor(mapEntry, key[0]).delete(key[0]);
394
+ }
395
+ const [first, ...rest] = key;
396
+ const childMap = this.#childrenFor(mapEntry, first);
397
+ const nextMapEntry = childMap.get(first);
398
+ if (!nextMapEntry) {
399
+ return false;
400
+ }
401
+ const deleted = this.#delete(nextMapEntry, rest);
402
+ if (deleted && this.#canPrune(nextMapEntry)) {
403
+ childMap.delete(first);
404
+ }
405
+ return deleted;
406
+ }
407
+ delete(key) {
408
+ if (!Array.isArray(key) || key.length === 0) {
409
+ return false;
410
+ }
411
+ return this.#delete(this.#internalMap, key);
412
+ }
413
+ #forEachInSubtree(mapEntry, onValue) {
414
+ for (const value of mapEntry.layer.values()) {
415
+ onValue(value);
416
+ }
417
+ for (const childEntry of mapEntry.children.values()) {
418
+ this.#forEachInSubtree(childEntry, onValue);
419
+ }
420
+ }
421
+ #deleteByPrefix(mapEntry, keyPrefix, onValue) {
422
+ if (keyPrefix.length === 1) {
423
+ const key = keyPrefix[0];
424
+ const layer = this.#layerFor(mapEntry, key);
425
+ const childMap2 = this.#childrenFor(mapEntry, key);
426
+ let deleted2 = false;
427
+ if (layer.has(key)) {
428
+ if (onValue) onValue(layer.get(key));
429
+ layer.delete(key);
430
+ deleted2 = true;
431
+ }
432
+ const childEntry = childMap2.get(key);
433
+ if (childEntry) {
434
+ if (onValue) this.#forEachInSubtree(childEntry, onValue);
435
+ childMap2.delete(key);
436
+ deleted2 = true;
437
+ }
438
+ return deleted2;
439
+ }
440
+ const [first, ...rest] = keyPrefix;
441
+ const childMap = this.#childrenFor(mapEntry, first);
442
+ const nextMapEntry = childMap.get(first);
443
+ if (!nextMapEntry) {
444
+ return false;
445
+ }
446
+ const deleted = this.#deleteByPrefix(nextMapEntry, rest, onValue);
447
+ if (deleted && this.#canPrune(nextMapEntry)) {
448
+ childMap.delete(first);
449
+ }
450
+ return deleted;
451
+ }
452
+ deleteByPrefix(keyPrefix, onValue) {
453
+ if (!Array.isArray(keyPrefix) || keyPrefix.length === 0) {
454
+ return false;
455
+ }
456
+ return this.#deleteByPrefix(this.#internalMap, keyPrefix, onValue);
457
+ }
458
+ clear() {
459
+ this.#internalMap = makeNode();
460
+ }
461
+ };
462
+
463
+ // src/composite-map/lru-composite-map.js
464
+ var LruCompositeMap = class {
465
+ #inner = new CompositeMap();
466
+ #maxSize;
467
+ #size = 0;
468
+ #head = null;
469
+ #tail = null;
470
+ #onEvict;
471
+ constructor(maxSize, { onEvict } = {}) {
472
+ this.#maxSize = maxSize;
473
+ this.#onEvict = onEvict;
474
+ }
475
+ #addToHead(node) {
476
+ node.next = this.#head;
477
+ node.prev = null;
478
+ if (this.#head) {
479
+ this.#head.prev = node;
480
+ }
481
+ this.#head = node;
482
+ if (!this.#tail) {
483
+ this.#tail = node;
484
+ }
485
+ }
486
+ #removeNode(node) {
487
+ if (node.prev) {
488
+ node.prev.next = node.next;
489
+ } else {
490
+ this.#head = node.next;
491
+ }
492
+ if (node.next) {
493
+ node.next.prev = node.prev;
494
+ } else {
495
+ this.#tail = node.prev;
496
+ }
497
+ node.prev = null;
498
+ node.next = null;
499
+ }
500
+ #promoteNode(node) {
501
+ if (node === this.#head) return;
502
+ this.#removeNode(node);
503
+ this.#addToHead(node);
504
+ }
505
+ #evictLru() {
506
+ const lruNode = this.#tail;
507
+ const key = lruNode.key;
508
+ const wrapper = this.#inner.get(key);
509
+ this.#removeNode(lruNode);
510
+ this.#inner.delete(key);
511
+ this.#size--;
512
+ if (this.#onEvict) this.#onEvict(wrapper.value, key);
513
+ }
514
+ get(key) {
515
+ const wrapper = this.#inner.get(key);
516
+ if (wrapper === void 0) {
517
+ return void 0;
518
+ }
519
+ this.#promoteNode(wrapper.lruNode);
520
+ return wrapper.value;
521
+ }
522
+ set(key, value) {
523
+ const existing = this.#inner.get(key);
524
+ if (existing) {
525
+ existing.value = value;
526
+ this.#promoteNode(existing.lruNode);
527
+ return;
528
+ }
529
+ const lruNode = { key, prev: null, next: null };
530
+ this.#inner.set(key, { value, lruNode });
531
+ this.#addToHead(lruNode);
532
+ this.#size++;
533
+ if (this.#size > this.#maxSize) {
534
+ this.#evictLru();
535
+ }
536
+ }
537
+ has(key) {
538
+ return this.#inner.has(key);
539
+ }
540
+ *values() {
541
+ for (const wrapper of this.#inner.values()) {
542
+ yield wrapper.value;
543
+ }
544
+ }
545
+ *keys() {
546
+ yield* this.#inner.keys();
547
+ }
548
+ *entries() {
549
+ for (const [key, wrapper] of this.#inner.entries()) {
550
+ yield [key, wrapper.value];
551
+ }
552
+ }
553
+ deleteByPrefix(keyPrefix) {
554
+ return this.#inner.deleteByPrefix(keyPrefix, (wrapper) => {
555
+ this.#removeNode(wrapper.lruNode);
556
+ this.#size--;
557
+ });
558
+ }
559
+ clear() {
560
+ this.#inner.clear();
561
+ this.#head = null;
562
+ this.#tail = null;
563
+ this.#size = 0;
564
+ }
565
+ };
566
+
567
+ // src/dependency-injection-container/fastFlow.js
568
+ var fastFlow_default = (...functions) => (x) => {
569
+ let val = x;
570
+ functions.forEach((f) => {
571
+ val = f(val);
572
+ });
573
+ return val;
574
+ };
575
+
576
+ // src/dependency-injection-container/privateInjectFor.js
577
+ var singletonCompositeKey = [storedInstanceKey];
578
+ var isCompositeStorage = (stored) => stored instanceof CompositeMap || stored instanceof LruCompositeMap;
579
+ var privateInjectFor = ({
580
+ getRelatedInjectables,
581
+ injectableSet,
582
+ alreadyInjected,
583
+ overridingInjectables,
584
+ instancesByInjectableMap,
585
+ getDi,
586
+ checkForNoMatches,
587
+ checkForTooManyMatches,
588
+ checkForSideEffects,
589
+ checkForAbstractToken,
590
+ checkForNonMaybeCardinality,
591
+ namespacedIdByInjectableMap,
592
+ getNamespacedId,
593
+ getApplicableDecorators
594
+ }) => ({ withMeta }) => ({ alias, instantiationParameters, injectingInjectable }) => {
595
+ const di = getDi();
596
+ let originalInjectable;
597
+ const aliasType = alias.aliasType;
598
+ if (aliasType === injectableSymbol || aliasType === injectableSymbol2) {
599
+ if (!injectableSet.has(alias)) {
600
+ checkForNoMatches([], alias, injectingInjectable);
601
+ }
602
+ originalInjectable = alias;
603
+ } else {
604
+ checkForAbstractToken(alias, injectingInjectable);
605
+ const relatedInjectables = getRelatedInjectables(alias);
606
+ checkForTooManyMatches(relatedInjectables, alias, injectingInjectable);
607
+ checkForNoMatches(relatedInjectables, alias, injectingInjectable);
608
+ originalInjectable = relatedInjectables[0];
609
+ }
610
+ alreadyInjected.add(originalInjectable);
611
+ const injectable = overridingInjectables.size > 0 ? overridingInjectables.get(originalInjectable) || originalInjectable : originalInjectable;
612
+ checkForSideEffects(injectable, injectingInjectable);
613
+ if (injectable.aliasType !== injectableSymbol2 && injectable.lifecycle.id === "singleton" && instantiationParameters.length > 0 && instantiationParameters.every((p) => p === void 0)) {
614
+ instantiationParameters = [];
615
+ }
616
+ if (instantiationParameters.length === 0) {
617
+ const stored = instancesByInjectableMap.get(
618
+ injectable.overriddenInjectable || injectable
619
+ );
620
+ let existingInstance;
621
+ if (injectable.lifecycle.id === "singleton") {
622
+ existingInstance = stored;
623
+ } else if (isCompositeStorage(stored)) {
624
+ existingInstance = stored.get(singletonCompositeKey);
625
+ } else {
626
+ existingInstance = stored;
627
+ }
628
+ if (existingInstance) {
629
+ if (!withMeta) {
630
+ return existingInstance;
631
+ }
632
+ return {
633
+ instance: existingInstance,
634
+ meta: { id: namespacedIdByInjectableMap.get(injectable) }
635
+ };
636
+ }
637
+ }
638
+ const instance = getInstance(
639
+ di,
640
+ injectable,
641
+ instantiationParameters,
642
+ instancesByInjectableMap,
643
+ injectingInjectable,
644
+ namespacedIdByInjectableMap,
645
+ getNamespacedId,
646
+ getApplicableDecorators,
647
+ checkForNonMaybeCardinality
648
+ );
649
+ if (!withMeta) {
650
+ return instance;
651
+ }
652
+ return {
653
+ instance,
654
+ meta: { id: namespacedIdByInjectableMap.get(injectable) }
655
+ };
656
+ };
657
+ var createMinimalDi = (di, injectableToBeInstantiated, injectingInjectable, namespacedIdByInjectableMap, checkForNonMaybeCardinality) => {
658
+ const shared = {
659
+ register: (...injectables) => {
660
+ di.register({
661
+ injectables,
662
+ context: [{ injectable: injectableToBeInstantiated }],
663
+ source: injectableToBeInstantiated
664
+ });
665
+ },
666
+ deregister: (...injectables) => {
667
+ di.deregister({
668
+ injectables,
669
+ context: [{ injectable: injectableToBeInstantiated }],
670
+ source: injectableToBeInstantiated
671
+ });
672
+ },
673
+ get sourceNamespace() {
674
+ const nsId = namespacedIdByInjectableMap.get(injectingInjectable);
675
+ const lastColon = nsId ? nsId.lastIndexOf(":") : -1;
676
+ return lastColon > 0 ? nsId.slice(0, lastColon) : void 0;
677
+ },
678
+ hasRegistrations: di.hasRegistrations,
679
+ getNumberOfRegistrations: di.getNumberOfRegistrations,
680
+ getNumberOfInstances: di.getNumberOfInstances,
681
+ purge: (alias, ...keyParts) => di.scopedPurge(injectableToBeInstantiated, alias, ...keyParts),
682
+ registeredInLocalScope: (alias) => di.registeredInScopeOf(injectableToBeInstantiated, alias),
683
+ registeredInLocalScopeSubtree: (alias) => di.registeredInSubtreeOf(injectableToBeInstantiated, alias)
684
+ };
685
+ if (injectableToBeInstantiated.aliasType === injectableSymbol2) {
686
+ return {
687
+ ...shared,
688
+ inject: (alias) => (...params) => di.inject({
689
+ alias,
690
+ instantiationParameters: params,
691
+ injectingInjectable: injectableToBeInstantiated
692
+ }),
693
+ injectMany: (alias) => (...params) => di.injectMany({
694
+ alias,
695
+ instantiationParameters: params,
696
+ injectingInjectable: injectableToBeInstantiated
697
+ }),
698
+ injectMaybe: (alias) => {
699
+ checkForNonMaybeCardinality(alias, injectableToBeInstantiated);
700
+ return (...params) => di.injectMany({
701
+ alias,
702
+ instantiationParameters: params,
703
+ injectingInjectable: injectableToBeInstantiated
704
+ })[0];
705
+ },
706
+ injectWithMeta: (alias) => (...params) => di.injectWithMeta({
707
+ alias,
708
+ instantiationParameters: params,
709
+ injectingInjectable: injectableToBeInstantiated
710
+ }),
711
+ injectManyWithMeta: (alias) => (...params) => di.injectManyWithMeta({
712
+ alias,
713
+ instantiationParameters: params,
714
+ injectingInjectable: injectableToBeInstantiated
715
+ }),
716
+ injectMaybeWithMeta: (alias) => {
717
+ checkForNonMaybeCardinality(alias, injectableToBeInstantiated);
718
+ return (...params) => di.injectManyWithMeta({
719
+ alias,
720
+ instantiationParameters: params,
721
+ injectingInjectable: injectableToBeInstantiated
722
+ })[0];
723
+ }
724
+ };
725
+ }
726
+ const minimalInject = (alias, ...args) => di.inject({
727
+ alias,
728
+ instantiationParameters: args,
729
+ injectingInjectable: injectableToBeInstantiated
730
+ });
731
+ const minimalInjectMany = (alias, ...args) => di.injectMany({
732
+ alias,
733
+ instantiationParameters: args,
734
+ injectingInjectable: injectableToBeInstantiated
735
+ });
736
+ const minimalInjectWithMeta = (alias, ...args) => di.injectWithMeta({
737
+ alias,
738
+ instantiationParameters: args,
739
+ injectingInjectable: injectableToBeInstantiated
740
+ });
741
+ const minimalInjectManyWithMeta = (alias, ...args) => di.injectManyWithMeta({
742
+ alias,
743
+ instantiationParameters: args,
744
+ injectingInjectable: injectableToBeInstantiated
745
+ });
746
+ return {
747
+ ...shared,
748
+ inject: minimalInject,
749
+ injectMany: minimalInjectMany,
750
+ injectWithMeta: minimalInjectWithMeta,
751
+ injectManyWithMeta: minimalInjectManyWithMeta,
752
+ injectFactory: (alias) => (...params) => minimalInject(alias, ...params)
753
+ };
754
+ };
755
+ var instantiate = (di, injectableToBeInstantiated, minimalDi, instantiationParameters, getApplicableDecorators) => {
756
+ const target = injectableToBeInstantiated.overriddenInjectable || injectableToBeInstantiated;
757
+ const decorators = getApplicableDecorators({
758
+ decoratorToken: instantiationDecoratorToken,
759
+ target,
760
+ injectingInjectable: injectableToBeInstantiated
761
+ });
762
+ const decorated = decorators.length === 0 ? injectableToBeInstantiated.instantiate : fastFlow_default(...decorators)(injectableToBeInstantiated.instantiate);
763
+ if (injectableToBeInstantiated.aliasType === injectableSymbol2) {
764
+ return decorated(minimalDi)(...instantiationParameters);
765
+ }
766
+ return decorated(minimalDi, ...instantiationParameters);
767
+ };
768
+ var ensureInstanceMap = (instancesByInjectableMap, key) => {
769
+ let instanceMap = instancesByInjectableMap.get(key);
770
+ if (!instanceMap) {
771
+ instanceMap = new CompositeMap();
772
+ instancesByInjectableMap.set(key, instanceMap);
773
+ }
774
+ return instanceMap;
775
+ };
776
+ var getInstance = (di, injectableToBeInstantiated, instantiationParameters, instancesByInjectableMap, injectingInjectable, namespacedIdByInjectableMap, getNamespacedId, getApplicableDecorators, checkForNonMaybeCardinality) => {
777
+ const cacheKey = injectableToBeInstantiated.overriddenInjectable || injectableToBeInstantiated;
778
+ const lifecycleId = injectableToBeInstantiated.lifecycle.id;
779
+ if (lifecycleId === "singleton") {
780
+ if (instantiationParameters.length > 0) {
781
+ throw new Error(
782
+ `Tried to inject singleton "${getNamespacedId(
783
+ injectableToBeInstantiated
784
+ )}" from "${getNamespacedId(
785
+ injectingInjectable
786
+ )}", but illegally to singletons, instantiationParameters were provided: "${instantiationParameters}".`
787
+ );
788
+ }
789
+ const minimalDi2 = createMinimalDi(
790
+ di,
791
+ injectableToBeInstantiated,
792
+ injectingInjectable,
793
+ namespacedIdByInjectableMap,
794
+ checkForNonMaybeCardinality
795
+ );
796
+ const newInstance2 = instantiate(
797
+ di,
798
+ injectableToBeInstantiated,
799
+ minimalDi2,
800
+ instantiationParameters,
801
+ getApplicableDecorators
802
+ );
803
+ instancesByInjectableMap.set(cacheKey, newInstance2);
804
+ return newInstance2;
805
+ }
806
+ if (lifecycleId === "transient") {
807
+ const minimalDi2 = createMinimalDi(
808
+ di,
809
+ injectableToBeInstantiated,
810
+ injectingInjectable,
811
+ namespacedIdByInjectableMap,
812
+ checkForNonMaybeCardinality
813
+ );
814
+ return instantiate(
815
+ di,
816
+ injectableToBeInstantiated,
817
+ minimalDi2,
818
+ instantiationParameters,
819
+ getApplicableDecorators
820
+ );
821
+ }
822
+ if (instantiationParameters.length === 0 && injectableToBeInstantiated.lifecycle._isV2DefaultLifecycle) {
823
+ const existing = instancesByInjectableMap.get(cacheKey);
824
+ if (!isCompositeStorage(existing)) {
825
+ const minimalDi2 = createMinimalDi(
826
+ di,
827
+ injectableToBeInstantiated,
828
+ injectingInjectable,
829
+ namespacedIdByInjectableMap,
830
+ checkForNonMaybeCardinality
831
+ );
832
+ const newInstance2 = instantiate(
833
+ di,
834
+ injectableToBeInstantiated,
835
+ minimalDi2,
836
+ instantiationParameters,
837
+ getApplicableDecorators
838
+ );
839
+ instancesByInjectableMap.set(cacheKey, newInstance2);
840
+ return newInstance2;
841
+ }
842
+ }
843
+ const minimalDi = createMinimalDi(
844
+ di,
845
+ injectableToBeInstantiated,
846
+ injectingInjectable,
847
+ namespacedIdByInjectableMap,
848
+ checkForNonMaybeCardinality
849
+ );
850
+ const instanceKey = injectableToBeInstantiated.lifecycle.getInstanceKey(
851
+ minimalDi,
852
+ ...instantiationParameters
853
+ );
854
+ const instanceCompositeKey = isCompositeKey(instanceKey) ? instanceKey.keys : [instanceKey];
855
+ let existingMap = instancesByInjectableMap.get(cacheKey);
856
+ if (injectableToBeInstantiated.lifecycle._isV2DefaultLifecycle && existingMap !== void 0 && !isCompositeStorage(existingMap)) {
857
+ const previousInstance = existingMap;
858
+ existingMap = new CompositeMap();
859
+ existingMap.set(singletonCompositeKey, previousInstance);
860
+ instancesByInjectableMap.set(cacheKey, existingMap);
861
+ }
862
+ const existingInstance = existingMap == null ? void 0 : existingMap.get(instanceCompositeKey);
863
+ if (existingInstance) {
864
+ return existingInstance;
865
+ }
866
+ const newInstance = instantiate(
867
+ di,
868
+ injectableToBeInstantiated,
869
+ minimalDi,
870
+ instantiationParameters,
871
+ getApplicableDecorators
872
+ );
873
+ if (instanceCompositeKey[0] !== nonStoredInstanceKey) {
874
+ ensureInstanceMap(instancesByInjectableMap, cacheKey).set(
875
+ instanceCompositeKey,
876
+ newInstance
877
+ );
878
+ }
879
+ return newInstance;
880
+ };
881
+
882
+ // src/dependency-injection-container/withInjectionDecoratorsFor.js
883
+ var withInjectionDecoratorsFor = ({ decoratorCache, getApplicableDecorators }) => (toBeDecorated) => ({ alias, instantiationParameters, injectingInjectable }) => {
884
+ if (decoratorCache.injection === null) {
885
+ decoratorCache.injection = true;
886
+ decoratorCache.injectionByAlias = /* @__PURE__ */ new Map();
887
+ }
888
+ let decorated = decoratorCache.injectionByAlias.get(alias);
889
+ if (decorated === void 0) {
890
+ const decorators = getApplicableDecorators({
891
+ decoratorToken: injectionDecoratorToken,
892
+ target: alias,
893
+ injectingInjectable
894
+ });
895
+ if (decorators.length > 0) {
896
+ const boundInject = (...params) => toBeDecorated({
897
+ alias,
898
+ instantiationParameters: params,
899
+ injectingInjectable
900
+ });
901
+ decorated = fastFlow_default(...decorators)(boundInject);
902
+ } else {
903
+ decorated = null;
904
+ }
905
+ decoratorCache.injectionByAlias.set(alias, decorated);
906
+ }
907
+ if (decorated === null) {
908
+ return toBeDecorated({
909
+ alias,
910
+ instantiationParameters,
911
+ injectingInjectable
912
+ });
913
+ }
914
+ return decorated(...instantiationParameters);
915
+ };
916
+
917
+ // src/dependency-injection-container/privateInjectManyFor.js
918
+ var privateInjectManyFor = ({ getRelatedInjectables, getInject, namespacedIdByInjectableMap }) => ({ withMeta }) => ({ alias, instantiationParameters, injectingInjectable }) => {
919
+ const inject = getInject();
920
+ const relatedInjectables = getRelatedInjectables(alias);
921
+ const n = relatedInjectables.length;
922
+ if (n === 0) {
923
+ return [];
924
+ }
925
+ const result = new Array(n);
926
+ const arg = {
927
+ alias: void 0,
928
+ instantiationParameters,
929
+ injectingInjectable: alias
930
+ };
931
+ if (withMeta) {
932
+ for (let i = 0; i < n; i++) {
933
+ const injectable = relatedInjectables[i];
934
+ arg.alias = injectable;
935
+ const instance = inject(arg);
936
+ result[i] = {
937
+ instance,
938
+ meta: { id: namespacedIdByInjectableMap.get(injectable) }
939
+ };
940
+ }
941
+ } else {
942
+ for (let i = 0; i < n; i++) {
943
+ arg.alias = relatedInjectables[i];
944
+ result[i] = inject(arg);
945
+ }
946
+ }
947
+ return result;
948
+ };
949
+
950
+ // src/getInjectionToken/isInjectionToken.js
951
+ var isInjectionToken_default = (maybeInjectionToken) => (maybeInjectionToken == null ? void 0 : maybeInjectionToken.aliasType) === injectionTokenSymbol || (maybeInjectionToken == null ? void 0 : maybeInjectionToken.aliasType) === injectionTokenSymbol2;
952
+
953
+ // src/dependency-injection-container/getNamespacedIdFor.js
954
+ var getNamespacedIdFor = (injectableAndRegistrationContext) => {
955
+ return (alias) => {
956
+ const id = isInjectionToken_default(alias) ? `(${alias.id})` : alias.id;
957
+ const registrationContext = injectableAndRegistrationContext.get(alias);
958
+ if (!registrationContext) {
959
+ return id;
960
+ }
961
+ const immediateParent = registrationContext[registrationContext.length - 1];
962
+ if (!immediateParent || immediateParent.injectable.aliasType === "container") {
963
+ return id;
964
+ }
965
+ const ids = [immediateParent.injectable.id];
966
+ let current = immediateParent.injectable;
967
+ while (true) {
968
+ const parentContext = injectableAndRegistrationContext.get(current);
969
+ if (!parentContext) {
970
+ break;
971
+ }
972
+ const parent = parentContext[parentContext.length - 1];
973
+ if (!parent || parent.injectable.aliasType === "container") {
974
+ break;
975
+ }
976
+ ids.push(parent.injectable.id);
977
+ current = parent.injectable;
978
+ }
979
+ ids.reverse();
980
+ ids.push(id);
981
+ return ids.join(":");
982
+ };
983
+ };
984
+
985
+ // src/getInjectableBunch/getInjectableBunch.js
986
+ var injectableBunchSymbol = "injectable-bunch";
987
+ var getInjectableBunch_default = (bunch) => Object.assign(bunch, {
988
+ aliasType: injectableBunchSymbol
989
+ });
990
+
991
+ // src/getInjectableBunch/isInjectableBunch.js
992
+ var isInjectableBunch_default = (maybeInjectableBunch) => (maybeInjectableBunch == null ? void 0 : maybeInjectableBunch.aliasType) === injectableBunchSymbol;
993
+
994
+ // src/getInjectable/isInjectable.js
995
+ var isInjectable_default = (maybeInjectable) => (maybeInjectable == null ? void 0 : maybeInjectable.aliasType) === injectableSymbol || (maybeInjectable == null ? void 0 : maybeInjectable.aliasType) === injectableSymbol2;
996
+
997
+ // src/dependency-injection-container/toFlatInjectables.js
998
+ var collectDeepBunchValues = (bunch, out) => {
999
+ const values = Object.values(bunch);
1000
+ for (let i = 0; i < values.length; i++) {
1001
+ const thing = values[i];
1002
+ if (isInjectableBunch_default(thing)) {
1003
+ collectDeepBunchValues(thing, out);
1004
+ } else if (isInjectable_default(thing)) {
1005
+ out.push(thing);
1006
+ }
1007
+ }
1008
+ };
1009
+ var toFlatInjectables_default = (injectables) => {
1010
+ const result = [];
1011
+ for (let i = 0; i < injectables.length; i++) {
1012
+ const injectable = injectables[i];
1013
+ if (isInjectableBunch_default(injectable)) {
1014
+ collectDeepBunchValues(injectable, result);
1015
+ } else {
1016
+ result.push(injectable);
1017
+ }
1018
+ }
1019
+ return result;
1020
+ };
1021
+
1022
+ // src/dependency-injection-container/getRelatedTokens.js
1023
+ var tokenChainCache = /* @__PURE__ */ new WeakMap();
1024
+ var getRelatedTokens = (token) => {
1025
+ if (token === void 0) {
1026
+ return emptyArray;
1027
+ }
1028
+ let cached = tokenChainCache.get(token);
1029
+ if (cached) {
1030
+ return cached;
1031
+ }
1032
+ const tokens = [];
1033
+ let current = token;
1034
+ while (current !== void 0) {
1035
+ tokens.push(current);
1036
+ current = current.specificTokenOf;
1037
+ }
1038
+ tokenChainCache.set(token, tokens);
1039
+ return tokens;
1040
+ };
1041
+ var isRelatedToToken = (token, ancestor) => {
1042
+ let current = token;
1043
+ while (current) {
1044
+ if (current === ancestor) return true;
1045
+ current = current.specificTokenOf;
1046
+ }
1047
+ return false;
1048
+ };
1049
+ var emptyArray = [];
1050
+
1051
+ // src/dependency-injection-container/getRelatedInjectablesFor.js
1052
+ var arrayCache = /* @__PURE__ */ new WeakMap();
1053
+ var EMPTY = Object.freeze([]);
1054
+ var getCachedArray = (set) => {
1055
+ let arr = arrayCache.get(set);
1056
+ if (!arr) {
1057
+ arr = [...set];
1058
+ arrayCache.set(set, arr);
1059
+ }
1060
+ return arr;
1061
+ };
1062
+ var invalidateRelatedInjectablesCache = (set) => {
1063
+ arrayCache.delete(set);
1064
+ };
1065
+ var getRelatedInjectablesFor = ({ injectablesByInjectionToken, injectableSet }) => (alias) => {
1066
+ if (isInjectable_default(alias)) {
1067
+ return injectableSet.has(alias) ? [alias] : EMPTY;
1068
+ }
1069
+ const set = injectablesByInjectionToken.get(alias);
1070
+ if (!set || set.size === 0) {
1071
+ return EMPTY;
1072
+ }
1073
+ return getCachedArray(set);
1074
+ };
1075
+
1076
+ // src/dependency-injection-container/register.js
1077
+ var registerFor = ({ registerSingle, injectMany, getApplicableDecorators }) => ({ injectables, context, source }) => {
1078
+ const flatInjectables = toFlatInjectables_default(injectables);
1079
+ const phase0Injectables = [];
1080
+ const registeredRegistrationDecoratorInjectables = [];
1081
+ const phase2Injectables = [];
1082
+ for (let i = 0; i < flatInjectables.length; i++) {
1083
+ const injectable = flatInjectables[i];
1084
+ if (isRelatedToToken(injectable.injectionToken, registrationDecoratorToken)) {
1085
+ registerSingle(injectable, context);
1086
+ registeredRegistrationDecoratorInjectables.push(injectable);
1087
+ } else if (isRelatedToToken(injectable.injectionToken, instantiationDecoratorToken)) {
1088
+ phase0Injectables.push(injectable);
1089
+ } else {
1090
+ phase2Injectables.push(injectable);
1091
+ }
1092
+ }
1093
+ let batchInProgress = true;
1094
+ const registeredInjectables = [];
1095
+ const fireCallbacksFor = (injectable) => {
1096
+ const callbacks2 = injectMany({
1097
+ alias: registrationCallbackToken,
1098
+ instantiationParameters: [],
1099
+ injectingInjectable: source
1100
+ });
1101
+ for (let j = 0; j < callbacks2.length; j++) {
1102
+ callbacks2[j](injectable);
1103
+ }
1104
+ };
1105
+ const registerThroughPipeline = (injectable) => {
1106
+ const decorators = getApplicableDecorators({
1107
+ decoratorToken: registrationDecoratorToken,
1108
+ target: injectable,
1109
+ injectingInjectable: source
1110
+ });
1111
+ if (decorators.length === 0) {
1112
+ registerSingle(injectable, context);
1113
+ registeredInjectables.push(injectable);
1114
+ return;
1115
+ }
1116
+ let wasRegisteredThisInjectable = false;
1117
+ const boundRegisterSingle = (inj) => {
1118
+ registerSingle(inj, context);
1119
+ wasRegisteredThisInjectable = true;
1120
+ if (!batchInProgress) {
1121
+ fireCallbacksFor(inj);
1122
+ }
1123
+ };
1124
+ const decoratedRegister = fastFlow_default(...decorators)(boundRegisterSingle);
1125
+ decoratedRegister(injectable);
1126
+ if (wasRegisteredThisInjectable) {
1127
+ registeredInjectables.push(injectable);
1128
+ }
1129
+ };
1130
+ phase0Injectables.forEach(registerThroughPipeline);
1131
+ phase2Injectables.forEach(registerThroughPipeline);
1132
+ batchInProgress = false;
1133
+ const callbacks = injectMany({
1134
+ alias: registrationCallbackToken,
1135
+ instantiationParameters: [],
1136
+ injectingInjectable: source
1137
+ });
1138
+ if (callbacks.length === 0) {
1139
+ return;
1140
+ }
1141
+ const fireBatchCallbacks = (injectable) => {
1142
+ for (let j = 0; j < callbacks.length; j++) {
1143
+ callbacks[j](injectable);
1144
+ }
1145
+ };
1146
+ registeredRegistrationDecoratorInjectables.forEach(fireBatchCallbacks);
1147
+ registeredInjectables.forEach(fireBatchCallbacks);
1148
+ };
1149
+ var registerSingleFor = ({
1150
+ injectableSet,
1151
+ injectableIdSet,
1152
+ instancesByInjectableMap,
1153
+ namespacedIdByInjectableMap,
1154
+ injectablesByInjectionToken,
1155
+ injectableAndRegistrationContext,
1156
+ childrenByParentMap,
1157
+ firePurgeCallbacks
1158
+ }) => {
1159
+ const getNamespacedId = getNamespacedIdFor(injectableAndRegistrationContext);
1160
+ return (injectable, injectionContext) => {
1161
+ var _a, _b, _c, _d;
1162
+ const injectableId = injectable.id;
1163
+ if (!injectableId) {
1164
+ throw new Error("Tried to register injectable without ID.");
1165
+ }
1166
+ for (let i = 0; i < injectionContext.length; i++) {
1167
+ const parent = injectionContext[i].injectable;
1168
+ let children = childrenByParentMap.get(parent);
1169
+ if (!children) {
1170
+ children = /* @__PURE__ */ new Set();
1171
+ childrenByParentMap.set(parent, children);
1172
+ }
1173
+ children.add(injectable);
1174
+ }
1175
+ const immediateParent = injectionContext.length > 0 ? injectionContext[injectionContext.length - 1] : void 0;
1176
+ const isContainerLevel = !immediateParent || immediateParent.injectable.aliasType === "container";
1177
+ if (!isContainerLevel) {
1178
+ injectableAndRegistrationContext.set(injectable, injectionContext);
1179
+ }
1180
+ const namespacedId = isContainerLevel ? injectableId : getNamespacedId(injectable);
1181
+ if (namespacedIdByInjectableMap.has(injectable)) {
1182
+ throw new Error(
1183
+ `Tried to register same injectable multiple times: "${namespacedIdByInjectableMap.get(
1184
+ injectable
1185
+ )}"`
1186
+ );
1187
+ }
1188
+ if (injectableIdSet.has(namespacedId)) {
1189
+ throw new Error(
1190
+ `Tried to register multiple injectables for ID "${namespacedId}"`
1191
+ );
1192
+ }
1193
+ const upperBoundedCardinality = ((_a = injectable.injectionToken) == null ? void 0 : _a.cardinality) === "one" || ((_b = injectable.injectionToken) == null ? void 0 : _b.cardinality) === "zero-or-one" ? injectable.injectionToken.cardinality : void 0;
1194
+ if (upperBoundedCardinality) {
1195
+ const token = injectable.injectionToken;
1196
+ const registered = injectablesByInjectionToken.get(token);
1197
+ if (registered) {
1198
+ for (const member of registered) {
1199
+ if (member.injectionToken === token) {
1200
+ throw new Error(
1201
+ `Tried to register injectable "${namespacedId}" with injection token "${token.id}", but its cardinality "${upperBoundedCardinality}" allows at most one registration and "${namespacedIdByInjectableMap.get(
1202
+ member
1203
+ )}" is already registered.`
1204
+ );
1205
+ }
1206
+ }
1207
+ }
1208
+ }
1209
+ injectableIdSet.add(namespacedId);
1210
+ injectableSet.add(injectable);
1211
+ namespacedIdByInjectableMap.set(injectable, namespacedId);
1212
+ if ((_c = injectable.injectionToken) == null ? void 0 : _c.abstract) {
1213
+ throw new Error(
1214
+ `Tried to register injectable "${namespacedId}" with injection token "${injectable.injectionToken.id}", but it is abstract. Use ".for(specifier)" for a concrete token.`
1215
+ );
1216
+ }
1217
+ const maxCacheSize = injectable.maxCacheSize ?? ((_d = injectable.injectionToken) == null ? void 0 : _d.maxCacheSize);
1218
+ if (maxCacheSize > 0 && injectable.lifecycle.id !== "singleton") {
1219
+ const instanceMap = new LruCompositeMap(maxCacheSize, {
1220
+ onEvict: (instance, keyArray) => firePurgeCallbacks(injectable, instance, keyArray)
1221
+ });
1222
+ instancesByInjectableMap.set(injectable, instanceMap);
1223
+ }
1224
+ const tokens = getRelatedTokens(injectable.injectionToken);
1225
+ for (let t = 0; t < tokens.length; t++) {
1226
+ const token = tokens[t];
1227
+ let injectablesSet = injectablesByInjectionToken.get(token);
1228
+ if (!injectablesSet) {
1229
+ injectablesSet = /* @__PURE__ */ new Set();
1230
+ injectablesByInjectionToken.set(token, injectablesSet);
1231
+ }
1232
+ injectablesSet.add(injectable);
1233
+ invalidateRelatedInjectablesCache(injectablesSet);
1234
+ }
1235
+ };
1236
+ };
1237
+
1238
+ // src/dependency-injection-container/purgeInstances.js
1239
+ var singletonKeyArray = [storedInstanceKey];
1240
+ var keyArrayStartsWith = (keyArray, prefix) => {
1241
+ if (prefix.length > keyArray.length) return false;
1242
+ for (let i = 0; i < prefix.length; i++) {
1243
+ if (keyArray[i] !== prefix[i]) return false;
1244
+ }
1245
+ return true;
1246
+ };
1247
+ var evict = (instancesByInjectableMap, injectablesInScope, keyParts) => {
1248
+ for (const injectable of injectablesInScope) {
1249
+ const stored = instancesByInjectableMap.get(injectable);
1250
+ if (stored === void 0) continue;
1251
+ if (!isCompositeStorage(stored)) {
1252
+ if (keyParts.length === 0 || keyArrayStartsWith(singletonKeyArray, keyParts)) {
1253
+ instancesByInjectableMap.delete(injectable);
1254
+ }
1255
+ continue;
1256
+ }
1257
+ if (keyParts.length === 0) {
1258
+ stored.clear();
1259
+ } else {
1260
+ stored.deleteByPrefix(keyParts);
1261
+ }
1262
+ }
1263
+ };
1264
+ var purgeStoredInstancesFor = ({
1265
+ instancesByInjectableMap,
1266
+ firePurgeCallbacks,
1267
+ anyPurgeCallbacksRegistered
1268
+ }) => (injectablesInScope, keyParts) => {
1269
+ if (!anyPurgeCallbacksRegistered()) {
1270
+ evict(instancesByInjectableMap, injectablesInScope, keyParts);
1271
+ return;
1272
+ }
1273
+ const tuples = [];
1274
+ for (const injectable of injectablesInScope) {
1275
+ const stored = instancesByInjectableMap.get(injectable);
1276
+ if (stored === void 0) continue;
1277
+ if (!isCompositeStorage(stored)) {
1278
+ if (keyParts.length > 0 && !keyArrayStartsWith(singletonKeyArray, keyParts)) {
1279
+ continue;
1280
+ }
1281
+ tuples.push({
1282
+ injectable,
1283
+ instance: stored,
1284
+ keyArray: singletonKeyArray
1285
+ });
1286
+ continue;
1287
+ }
1288
+ for (const [keyArray, instance] of stored.entries()) {
1289
+ if (keyParts.length > 0 && !keyArrayStartsWith(keyArray, keyParts)) {
1290
+ continue;
1291
+ }
1292
+ tuples.push({ injectable, instance, keyArray });
1293
+ }
1294
+ }
1295
+ for (const { injectable, instance, keyArray } of tuples) {
1296
+ firePurgeCallbacks(injectable, instance, keyArray);
1297
+ }
1298
+ evict(instancesByInjectableMap, injectablesInScope, keyParts);
1299
+ };
1300
+ var purgeInstancesFor = ({
1301
+ getRelatedInjectables,
1302
+ instancesByInjectableMap,
1303
+ firePurgeCallbacks,
1304
+ anyPurgeCallbacksRegistered
1305
+ }) => {
1306
+ const purgeStoredInstances = purgeStoredInstancesFor({
1307
+ instancesByInjectableMap,
1308
+ firePurgeCallbacks,
1309
+ anyPurgeCallbacksRegistered
1310
+ });
1311
+ return (alias, ...keyParts) => purgeStoredInstances(
1312
+ alias === void 0 ? [...instancesByInjectableMap.keys()] : getRelatedInjectables(alias),
1313
+ keyParts
1314
+ );
1315
+ };
1316
+
1317
+ // src/dependency-injection-container/deregister.js
1318
+ var deregisterFor = ({
1319
+ injectMany,
1320
+ getApplicableDecorators,
1321
+ injectableSet,
1322
+ injectableAndRegistrationContext,
1323
+ injectablesByInjectionToken,
1324
+ overridingInjectables,
1325
+ purgeInstances,
1326
+ injectableIdSet,
1327
+ namespacedIdByInjectableMap,
1328
+ childrenByParentMap,
1329
+ // Todo: get rid of function usage.
1330
+ getDi,
1331
+ decoratorCache,
1332
+ syncInjectWiring
1333
+ }) => ({ injectables, context, source }) => {
1334
+ const callbacks = injectMany({
1335
+ alias: deregistrationCallbackToken,
1336
+ instantiationParameters: [],
1337
+ injectingInjectable: source
1338
+ });
1339
+ const flatInjectables = toFlatInjectables_default(injectables);
1340
+ flatInjectables.forEach((injectable) => {
1341
+ callbacks.forEach((callback) => {
1342
+ callback(injectable);
1343
+ });
1344
+ });
1345
+ const di = getDi();
1346
+ const deregisterSingle = deregisterSingleFor({
1347
+ injectableSet,
1348
+ injectableAndRegistrationContext,
1349
+ injectablesByInjectionToken,
1350
+ overridingInjectables,
1351
+ purgeInstances,
1352
+ injectableIdSet,
1353
+ namespacedIdByInjectableMap,
1354
+ childrenByParentMap,
1355
+ di
1356
+ });
1357
+ let injectWiringChanged = false;
1358
+ flatInjectables.forEach((injectable) => {
1359
+ if (isRelatedToToken(injectable.injectionToken, injectionDecoratorToken)) {
1360
+ decoratorCache.injection = null;
1361
+ injectWiringChanged = true;
1362
+ }
1363
+ if (isRelatedToToken(injectable.injectionToken, preInjectCallbackToken)) {
1364
+ decoratorCache.preInject = null;
1365
+ injectWiringChanged = true;
1366
+ }
1367
+ const decorators = getApplicableDecorators({
1368
+ decoratorToken: deregistrationDecoratorToken,
1369
+ target: injectable,
1370
+ injectingInjectable: source
1371
+ });
1372
+ if (decorators.length === 0) {
1373
+ deregisterSingle(injectable);
1374
+ return;
1375
+ }
1376
+ const decoratedDeregister = fastFlow_default(...decorators)(deregisterSingle);
1377
+ decoratedDeregister(injectable);
1378
+ });
1379
+ if (injectWiringChanged) {
1380
+ syncInjectWiring();
1381
+ }
1382
+ };
1383
+ var deregisterSingleFor = ({
1384
+ injectableSet,
1385
+ injectableAndRegistrationContext,
1386
+ injectablesByInjectionToken,
1387
+ overridingInjectables,
1388
+ purgeInstances,
1389
+ injectableIdSet,
1390
+ namespacedIdByInjectableMap,
1391
+ childrenByParentMap,
1392
+ di
1393
+ }) => (injectable) => {
1394
+ if (isInjectionToken_default(injectable)) {
1395
+ throw new Error(
1396
+ `Tried to deregister using injection token "${injectable.id}", but deregistration using token is illegal.`
1397
+ );
1398
+ }
1399
+ if (!injectableSet.has(injectable)) {
1400
+ throw new Error(
1401
+ `Tried to deregister non-registered injectable "${injectable.id}".`
1402
+ );
1403
+ }
1404
+ const children = childrenByParentMap.get(injectable);
1405
+ if (children) {
1406
+ children.forEach((child) => {
1407
+ injectableAndRegistrationContext.delete(child);
1408
+ if (injectableSet.has(child)) {
1409
+ di.deregister({
1410
+ injectables: [child]
1411
+ });
1412
+ }
1413
+ });
1414
+ childrenByParentMap.delete(injectable);
1415
+ }
1416
+ purgeInstances(injectable);
1417
+ injectableAndRegistrationContext.delete(injectable);
1418
+ const namespacedId = namespacedIdByInjectableMap.get(injectable);
1419
+ injectableIdSet.delete(namespacedId);
1420
+ injectableSet.delete(injectable);
1421
+ namespacedIdByInjectableMap.delete(injectable);
1422
+ const tokens = getRelatedTokens(injectable.injectionToken);
1423
+ tokens.forEach((token) => {
1424
+ const tokenSet = injectablesByInjectionToken.get(token);
1425
+ tokenSet.delete(injectable);
1426
+ invalidateRelatedInjectablesCache(tokenSet);
1427
+ });
1428
+ overridingInjectables.delete(injectable);
1429
+ };
1430
+
1431
+ // src/dependency-injection-container/override.js
1432
+ var overrideFor = ({ getRelatedInjectables, earlyOverride }) => (alias, instantiateStub) => {
1433
+ const relatedInjectables = getRelatedInjectables(alias);
1434
+ if (relatedInjectables.length === 0) {
1435
+ if (alias.aliasType === "injection-token") {
1436
+ throw new Error(
1437
+ `Tried to override single implementation of injection token "${alias.id}", but found no registered implementations.`
1438
+ );
1439
+ }
1440
+ throw new Error(
1441
+ `Tried to override "${alias.id}" which is not registered.`
1442
+ );
1443
+ }
1444
+ earlyOverride(alias, instantiateStub);
1445
+ };
1446
+ var unoverrideFor = ({ overridingInjectables, getRelatedInjectables, getNamespacedId }) => (alias) => {
1447
+ const [injectable] = getRelatedInjectables(alias);
1448
+ if (!injectable) {
1449
+ throw new Error(
1450
+ `Tried to unoverride "${alias.id}", but it was not registered.`
1451
+ );
1452
+ }
1453
+ if (!overridingInjectables.has(injectable)) {
1454
+ throw new Error(
1455
+ `Tried to unoverride "${getNamespacedId(
1456
+ injectable
1457
+ )}", but it was not overridden.`
1458
+ );
1459
+ }
1460
+ overridingInjectables.delete(injectable);
1461
+ };
1462
+
1463
+ // src/dependency-injection-container/checkForNoMatchesFor.js
1464
+ var checkForNoMatchesFor = ({ getNamespacedId }) => (relatedInjectables, alias, injectingInjectable) => {
1465
+ if (relatedInjectables.length === 0) {
1466
+ throw new Error(
1467
+ `Tried to inject non-registered injectable "${alias.id}" from "${getNamespacedId(injectingInjectable)}".`
1468
+ );
1469
+ }
1470
+ };
1471
+
1472
+ // src/dependency-injection-container/checkForTooManyMatches.js
1473
+ var checkForTooManyMatchesFor = ({ getNamespacedId }) => (relatedInjectables, alias, injectingInjectable) => {
1474
+ if (relatedInjectables.length > 1) {
1475
+ throw new Error(
1476
+ `Tried to inject single injectable for injection token "${alias.id}" from "${getNamespacedId(
1477
+ injectingInjectable
1478
+ )}" but found multiple injectables: "${relatedInjectables.map(getNamespacedId).join('", "')}"`
1479
+ );
1480
+ }
1481
+ };
1482
+
1483
+ // src/dependency-injection-container/checkForSideEffectsFor.js
1484
+ var checkForSideEffectsFor = ({ getSideEffectsArePrevented, getNamespacedId }) => (injectable, injectingInjectable) => {
1485
+ if (getSideEffectsArePrevented(injectable)) {
1486
+ throw new Error(
1487
+ `Tried to inject "${getNamespacedId(
1488
+ injectable
1489
+ )}" from "${getNamespacedId(
1490
+ injectingInjectable
1491
+ )}" when side-effects are prevented.`
1492
+ );
1493
+ }
1494
+ };
1495
+
1496
+ // src/dependency-injection-container/checkForAbstractTokenFor.js
1497
+ var checkForAbstractTokenFor = ({ getNamespacedId }) => (alias, injectingInjectable) => {
1498
+ if (alias.abstract) {
1499
+ throw new Error(
1500
+ `Tried to inject injection token "${alias.id}" from "${getNamespacedId(
1501
+ injectingInjectable
1502
+ )}", but it is abstract. Use ".for(specifier)" for a concrete token.`
1503
+ );
1504
+ }
1505
+ };
1506
+
1507
+ // src/dependency-injection-container/checkForNonMaybeCardinalityFor.js
1508
+ var checkForNonMaybeCardinalityFor = ({ getNamespacedId }) => (alias, injectingInjectable) => {
1509
+ if (alias.cardinality !== "zero-or-one") {
1510
+ throw new Error(
1511
+ `Tried to injectMaybe "${alias.id}" from "${getNamespacedId(
1512
+ injectingInjectable
1513
+ )}", but its cardinality is "${alias.cardinality}" instead of "zero-or-one".`
1514
+ );
1515
+ }
1516
+ };
1517
+
1518
+ // src/dependency-injection-container/checkForUndeclaredConsumptionFor.js
1519
+ var declaredSetsByInjectable = /* @__PURE__ */ new WeakMap();
1520
+ var getDeclaredSet = (injectable) => {
1521
+ let declared = declaredSetsByInjectable.get(injectable);
1522
+ if (!declared) {
1523
+ declared = new Set(injectable.consumptions ?? []);
1524
+ declaredSetsByInjectable.set(injectable, declared);
1525
+ }
1526
+ return declared;
1527
+ };
1528
+ var checkForUndeclaredConsumptionFor = ({ getNamespacedId }) => ({ alias, injectingInjectable }) => {
1529
+ if (injectingInjectable.aliasType !== injectableSymbol2) {
1530
+ return;
1531
+ }
1532
+ if (isInjectable_default(alias)) {
1533
+ return;
1534
+ }
1535
+ const declared = getDeclaredSet(injectingInjectable);
1536
+ let candidate = alias;
1537
+ while (candidate !== void 0) {
1538
+ if (declared.has(candidate)) {
1539
+ return;
1540
+ }
1541
+ candidate = candidate.specificTokenOf;
1542
+ }
1543
+ throw new Error(
1544
+ `Tried to inject "${alias.id}" from "${getNamespacedId(
1545
+ injectingInjectable
1546
+ )}", but it is not a declared consumption.`
1547
+ );
1548
+ };
1549
+
1550
+ // src/dependency-injection-container/validate.js
1551
+ var isToken2 = (alias) => alias.aliasType === "injection-token2";
1552
+ var validateFor = ({
1553
+ containerId,
1554
+ injectableSet,
1555
+ injectablesByInjectionToken,
1556
+ namespacedIdByInjectableMap,
1557
+ overridingInjectables
1558
+ }) => () => {
1559
+ const verifiedIds = [];
1560
+ const unverifiedIds = [];
1561
+ const unverifiableConsumptions = [];
1562
+ const violations = [];
1563
+ for (const injectable of injectableSet) {
1564
+ const namespacedId = namespacedIdByInjectableMap.get(injectable);
1565
+ if (injectable.aliasType !== injectableSymbol2) {
1566
+ unverifiedIds.push(namespacedId);
1567
+ continue;
1568
+ }
1569
+ verifiedIds.push(namespacedId);
1570
+ if (overridingInjectables.has(injectable)) {
1571
+ continue;
1572
+ }
1573
+ for (const consumption of injectable.consumptions ?? []) {
1574
+ if (!isToken2(consumption)) {
1575
+ unverifiableConsumptions.push({
1576
+ injectableId: namespacedId,
1577
+ consumptionId: consumption.id
1578
+ });
1579
+ continue;
1580
+ }
1581
+ const { cardinality } = consumption;
1582
+ if (cardinality !== "one" && cardinality !== "one-or-many") {
1583
+ continue;
1584
+ }
1585
+ const registered = injectablesByInjectionToken.get(consumption);
1586
+ if (registered === void 0 || registered.size === 0) {
1587
+ violations.push(
1588
+ `Injectable "${namespacedId}" consumes injection token "${consumption.id}" with cardinality "${cardinality}", but it has no registrations.`
1589
+ );
1590
+ }
1591
+ }
1592
+ }
1593
+ if (violations.length > 0) {
1594
+ throw new Error(
1595
+ `Tried to validate container "${containerId}", but found violations:
1596
+ ${violations.map((violation) => ` - ${violation}`).join("\n")}`
1597
+ );
1598
+ }
1599
+ const sorted = (ids) => [...ids].sort();
1600
+ return {
1601
+ verifiedInjectables: {
1602
+ count: verifiedIds.length,
1603
+ ids: sorted(verifiedIds)
1604
+ },
1605
+ unverifiedInjectables: {
1606
+ count: unverifiedIds.length,
1607
+ ids: sorted(unverifiedIds)
1608
+ },
1609
+ unverifiableConsumptions
1610
+ };
1611
+ };
1612
+
1613
+ // src/dependency-injection-container/early-override.js
1614
+ var targetIsV2 = (injectable) => injectable.aliasType === injectableSymbol2 || injectable.aliasType === injectionTokenSymbol2;
1615
+ var asV1Shape = (stub, isV2Target) => isV2Target ? (di) => (...params) => stub(di, ...params) : stub;
1616
+ var asV2Shape = (stub, isV2Target) => isV2Target ? stub : (di, ...params) => stub(di)(...params);
1617
+ var earlyOverrideImplFor = (normalize) => ({
1618
+ getRelatedInjectables,
1619
+ alreadyInjected,
1620
+ overridingInjectables,
1621
+ getNamespacedId
1622
+ }) => (alias, instantiateStub) => {
1623
+ const relatedInjectables = getRelatedInjectables(alias);
1624
+ if (relatedInjectables.length > 1) {
1625
+ throw new Error(
1626
+ `Tried to override single implementation of injection token "${alias.id}", but found multiple registered implementations: "${relatedInjectables.map(getNamespacedId).join('", "')}".`
1627
+ );
1628
+ }
1629
+ if (relatedInjectables.length === 0 && isInjectionToken_default(alias)) {
1630
+ throw new Error(
1631
+ `Tried to early-override an injection token "${alias.id}", but that is currently not supported.`
1632
+ );
1633
+ }
1634
+ const originalInjectable = relatedInjectables[0] || alias;
1635
+ if (alreadyInjected.has(alias) || alreadyInjected.has(originalInjectable)) {
1636
+ throw new Error(
1637
+ `Tried to override injectable "${getNamespacedId(
1638
+ originalInjectable
1639
+ )}", but it was already injected.`
1640
+ );
1641
+ }
1642
+ overridingInjectables.set(originalInjectable, {
1643
+ ...originalInjectable,
1644
+ overriddenInjectable: originalInjectable,
1645
+ causesSideEffects: false,
1646
+ instantiate: normalize(instantiateStub, targetIsV2(originalInjectable))
1647
+ });
1648
+ };
1649
+ var earlyOverrideFor = earlyOverrideImplFor(asV1Shape);
1650
+ var earlyOverride2For = earlyOverrideImplFor(asV2Shape);
1651
+
1652
+ // src/dependency-injection-container/withPreInjectCallbacksFor.js
1653
+ var withPreInjectCallbacksFor = ({ decoratorCache, getApplicableDecorators }) => (kind) => (toBeCalled) => (args) => {
1654
+ if (decoratorCache.preInject === null) {
1655
+ decoratorCache.preInject = true;
1656
+ decoratorCache.preInjectByAlias = /* @__PURE__ */ new Map();
1657
+ }
1658
+ let callbacks = decoratorCache.preInjectByAlias.get(args.alias);
1659
+ if (callbacks === void 0) {
1660
+ const applicable = getApplicableDecorators({
1661
+ decoratorToken: preInjectCallbackToken,
1662
+ target: args.alias,
1663
+ injectingInjectable: args.injectingInjectable
1664
+ });
1665
+ callbacks = applicable.length > 0 ? applicable : null;
1666
+ decoratorCache.preInjectByAlias.set(args.alias, callbacks);
1667
+ }
1668
+ if (callbacks !== null) {
1669
+ for (const callback of callbacks) {
1670
+ callback(args.alias, kind, args.injectingInjectable);
1671
+ }
1672
+ }
1673
+ return toBeCalled(args);
1674
+ };
1675
+
1676
+ // src/dependency-injection-container/firePurgeCallbacksFor.js
1677
+ var firePurgeCallbacksFor = ({ getApplicableDecorators }) => (injectable, instance, keyArray) => {
1678
+ const payload = { instance };
1679
+ const callbacks = getApplicableDecorators({
1680
+ decoratorToken: instancePurgeCallbackToken,
1681
+ target: injectable,
1682
+ injectingInjectable: injectable
1683
+ });
1684
+ for (const cb of callbacks) {
1685
+ cb(payload)(...keyArray);
1686
+ }
1687
+ };
1688
+
1689
+ // src/dependency-injection-container/getApplicableDecoratorsFor.js
1690
+ var EMPTY2 = Object.freeze([]);
1691
+ var getApplicableDecoratorsFor = ({ injectMany, injectablesByInjectionToken }) => ({ decoratorToken, target, injectingInjectable }) => {
1692
+ const registered = injectablesByInjectionToken.get(decoratorToken);
1693
+ if (!registered || registered.size === 0) {
1694
+ return EMPTY2;
1695
+ }
1696
+ const out = [];
1697
+ const dispatch = (alias) => {
1698
+ const registeredForAlias = injectablesByInjectionToken.get(alias);
1699
+ if (registeredForAlias && registeredForAlias.size > 0) {
1700
+ out.push(
1701
+ ...injectMany({
1702
+ alias,
1703
+ instantiationParameters: [],
1704
+ injectingInjectable
1705
+ })
1706
+ );
1707
+ }
1708
+ };
1709
+ dispatch(decoratorToken.for(target));
1710
+ const chain = getRelatedTokens(
1711
+ target.injectionToken ?? target.specificTokenOf
1712
+ );
1713
+ for (const t of chain) {
1714
+ dispatch(decoratorToken.for(t));
1715
+ }
1716
+ const targetTags = target.tags;
1717
+ if (targetTags) {
1718
+ for (const tag of targetTags) {
1719
+ dispatch(decoratorToken.for(tag));
1720
+ }
1721
+ }
1722
+ let processedChainTags = targetTags;
1723
+ for (const t of chain) {
1724
+ const chainTags = t.tags;
1725
+ if (!chainTags || chainTags === processedChainTags) {
1726
+ continue;
1727
+ }
1728
+ processedChainTags = chainTags;
1729
+ for (const tag of chainTags) {
1730
+ if (targetTags && targetTags.indexOf(tag) !== -1) {
1731
+ continue;
1732
+ }
1733
+ dispatch(decoratorToken.for(tag));
1734
+ }
1735
+ }
1736
+ return out;
1737
+ };
1738
+
1739
+ // src/dependency-injection-container/createContainer.js
1740
+ var createContainer_default = (containerId) => {
1741
+ const injectableSet = /* @__PURE__ */ new Set();
1742
+ const decoratorCache = {
1743
+ injection: null,
1744
+ injectionByAlias: /* @__PURE__ */ new Map(),
1745
+ preInject: null,
1746
+ preInjectByAlias: /* @__PURE__ */ new Map()
1747
+ };
1748
+ const overridingInjectables = /* @__PURE__ */ new Map();
1749
+ let sideEffectsArePrevented = true;
1750
+ const alreadyInjected = /* @__PURE__ */ new Set();
1751
+ const injectablesWithPermittedSideEffects = /* @__PURE__ */ new Set();
1752
+ const injectableIdSet = /* @__PURE__ */ new Set();
1753
+ const injectableAndRegistrationContext = /* @__PURE__ */ new Map();
1754
+ const instancesByInjectableMap = /* @__PURE__ */ new Map();
1755
+ const injectablesByInjectionToken = /* @__PURE__ */ new Map();
1756
+ const namespacedIdByInjectableMap = /* @__PURE__ */ new Map();
1757
+ const childrenByParentMap = /* @__PURE__ */ new Map();
1758
+ const getNamespacedId = getNamespacedIdFor(injectableAndRegistrationContext);
1759
+ const getRelatedInjectables = getRelatedInjectablesFor({
1760
+ injectablesByInjectionToken,
1761
+ injectableSet
1762
+ });
1763
+ const containerRootContextItem = {
1764
+ injectable: { id: containerId, aliasType: "container" }
1765
+ };
1766
+ const rootInjectable = containerRootContextItem.injectable;
1767
+ const checkForAbstractToken = checkForAbstractTokenFor({ getNamespacedId });
1768
+ const nonDecoratedPrivateInjectManyForUnknownMeta = privateInjectManyFor({
1769
+ getRelatedInjectables,
1770
+ // Elements go through the element slot, not `privateDi.inject`: entry
1771
+ // wrappers (once-per-operation hooks) must not re-fire per element,
1772
+ // while injection decorators still apply per element.
1773
+ getInject: () => elementInject,
1774
+ namespacedIdByInjectableMap
1775
+ });
1776
+ const nonDecoratedPrivateInjectMany = nonDecoratedPrivateInjectManyForUnknownMeta({
1777
+ withMeta: false
1778
+ });
1779
+ const nonDecoratedPrivateInjectManyWithMeta = nonDecoratedPrivateInjectManyForUnknownMeta({
1780
+ withMeta: true
1781
+ });
1782
+ const getApplicableDecorators = getApplicableDecoratorsFor({
1783
+ injectMany: nonDecoratedPrivateInjectMany,
1784
+ injectablesByInjectionToken
1785
+ });
1786
+ const getSideEffectsArePrevented = (injectable) => sideEffectsArePrevented && injectable.causesSideEffects && !injectablesWithPermittedSideEffects.has(injectable);
1787
+ const checkForSideEffects = checkForSideEffectsFor({
1788
+ getSideEffectsArePrevented,
1789
+ getNamespacedId
1790
+ });
1791
+ const checkForNoMatches = checkForNoMatchesFor({
1792
+ getNamespacedId
1793
+ });
1794
+ const checkForTooManyMatches = checkForTooManyMatchesFor({
1795
+ getNamespacedId
1796
+ });
1797
+ const checkForNonMaybeCardinality = checkForNonMaybeCardinalityFor({
1798
+ getNamespacedId
1799
+ });
1800
+ const checkForUndeclaredConsumption = checkForUndeclaredConsumptionFor({
1801
+ getNamespacedId
1802
+ });
1803
+ const withConsumptionEnforcement = (toBeCalled) => (args) => {
1804
+ checkForUndeclaredConsumption(args);
1805
+ return toBeCalled(args);
1806
+ };
1807
+ const nonDecoratedPrivateInjectUnknownMeta = privateInjectFor({
1808
+ getRelatedInjectables,
1809
+ injectableSet,
1810
+ alreadyInjected,
1811
+ overridingInjectables,
1812
+ instancesByInjectableMap,
1813
+ getDi: () => privateDi,
1814
+ checkForNoMatches,
1815
+ checkForTooManyMatches,
1816
+ checkForSideEffects,
1817
+ checkForAbstractToken,
1818
+ checkForNonMaybeCardinality,
1819
+ namespacedIdByInjectableMap,
1820
+ getNamespacedId,
1821
+ getApplicableDecorators
1822
+ });
1823
+ const nonDecoratedPrivateInject = nonDecoratedPrivateInjectUnknownMeta({
1824
+ withMeta: false
1825
+ });
1826
+ const nonDecoratedPrivateInjectWithMeta = nonDecoratedPrivateInjectUnknownMeta({
1827
+ withMeta: true
1828
+ });
1829
+ const withInjectionDecorators = withInjectionDecoratorsFor({
1830
+ decoratorCache,
1831
+ getApplicableDecorators
1832
+ });
1833
+ const decoratedPrivateInject = withInjectionDecorators(
1834
+ nonDecoratedPrivateInject
1835
+ );
1836
+ const decoratedPrivateInjectWithMeta = withInjectionDecorators(
1837
+ nonDecoratedPrivateInjectWithMeta
1838
+ );
1839
+ const withPreInjectCallbacks = withPreInjectCallbacksFor({
1840
+ decoratorCache,
1841
+ getApplicableDecorators
1842
+ });
1843
+ const withPreInjectCallbacksForInject = withPreInjectCallbacks("inject");
1844
+ const withPreInjectCallbacksForInjectMany = withPreInjectCallbacks("injectMany");
1845
+ const preInjectNonDecoratedInject = withPreInjectCallbacksForInject(
1846
+ nonDecoratedPrivateInject
1847
+ );
1848
+ const preInjectDecoratedInject = withPreInjectCallbacksForInject(
1849
+ decoratedPrivateInject
1850
+ );
1851
+ const preInjectNonDecoratedInjectWithMeta = withPreInjectCallbacksForInject(
1852
+ nonDecoratedPrivateInjectWithMeta
1853
+ );
1854
+ const preInjectDecoratedInjectWithMeta = withPreInjectCallbacksForInject(
1855
+ decoratedPrivateInjectWithMeta
1856
+ );
1857
+ const preInjectInjectMany = withPreInjectCallbacksForInjectMany(
1858
+ nonDecoratedPrivateInjectMany
1859
+ );
1860
+ const preInjectInjectManyWithMeta = withPreInjectCallbacksForInjectMany(
1861
+ nonDecoratedPrivateInjectManyWithMeta
1862
+ );
1863
+ let elementInject = nonDecoratedPrivateInject;
1864
+ const syncInjectWiring = () => {
1865
+ const registeredDecorators = injectablesByInjectionToken.get(
1866
+ injectionDecoratorToken
1867
+ );
1868
+ const decoratorsActive = registeredDecorators !== void 0 && registeredDecorators.size > 0;
1869
+ const registeredPreInjectCallbacks = injectablesByInjectionToken.get(
1870
+ preInjectCallbackToken
1871
+ );
1872
+ const preInjectActive = registeredPreInjectCallbacks !== void 0 && registeredPreInjectCallbacks.size > 0;
1873
+ elementInject = decoratorsActive ? decoratedPrivateInject : nonDecoratedPrivateInject;
1874
+ privateDi.inject = preInjectActive ? decoratorsActive ? preInjectDecoratedInject : preInjectNonDecoratedInject : elementInject;
1875
+ privateDi.injectWithMeta = preInjectActive ? decoratorsActive ? preInjectDecoratedInjectWithMeta : preInjectNonDecoratedInjectWithMeta : decoratorsActive ? decoratedPrivateInjectWithMeta : nonDecoratedPrivateInjectWithMeta;
1876
+ privateDi.injectMany = preInjectActive ? preInjectInjectMany : nonDecoratedPrivateInjectMany;
1877
+ privateDi.injectManyWithMeta = preInjectActive ? preInjectInjectManyWithMeta : nonDecoratedPrivateInjectManyWithMeta;
1878
+ privateDi.inject = withConsumptionEnforcement(privateDi.inject);
1879
+ privateDi.injectWithMeta = withConsumptionEnforcement(
1880
+ privateDi.injectWithMeta
1881
+ );
1882
+ privateDi.injectMany = withConsumptionEnforcement(privateDi.injectMany);
1883
+ privateDi.injectManyWithMeta = withConsumptionEnforcement(
1884
+ privateDi.injectManyWithMeta
1885
+ );
1886
+ };
1887
+ const firePurgeCallbacks = firePurgeCallbacksFor({
1888
+ getApplicableDecorators
1889
+ });
1890
+ const rawRegisterSingle = registerSingleFor({
1891
+ injectableSet,
1892
+ namespacedIdByInjectableMap,
1893
+ instancesByInjectableMap,
1894
+ injectablesByInjectionToken,
1895
+ injectableIdSet,
1896
+ injectableAndRegistrationContext,
1897
+ childrenByParentMap,
1898
+ firePurgeCallbacks
1899
+ });
1900
+ const registerSingle = (injectable, context) => {
1901
+ rawRegisterSingle(injectable, context);
1902
+ let wiringChanged = false;
1903
+ if (isRelatedToToken(injectable.injectionToken, injectionDecoratorToken)) {
1904
+ decoratorCache.injection = null;
1905
+ wiringChanged = true;
1906
+ }
1907
+ if (isRelatedToToken(injectable.injectionToken, preInjectCallbackToken)) {
1908
+ decoratorCache.preInject = null;
1909
+ wiringChanged = true;
1910
+ }
1911
+ if (wiringChanged) {
1912
+ syncInjectWiring();
1913
+ }
1914
+ };
1915
+ const anyPurgeCallbacksRegistered = () => {
1916
+ const registered = injectablesByInjectionToken.get(
1917
+ instancePurgeCallbackToken
1918
+ );
1919
+ return registered !== void 0 && registered.size > 0;
1920
+ };
1921
+ const purgeInstances = purgeInstancesFor({
1922
+ getRelatedInjectables,
1923
+ instancesByInjectableMap,
1924
+ firePurgeCallbacks,
1925
+ anyPurgeCallbacksRegistered
1926
+ });
1927
+ const purgeStoredInstances = purgeStoredInstancesFor({
1928
+ instancesByInjectableMap,
1929
+ firePurgeCallbacks,
1930
+ anyPurgeCallbacksRegistered
1931
+ });
1932
+ const deregister = deregisterFor({
1933
+ injectMany: nonDecoratedPrivateInjectMany,
1934
+ getApplicableDecorators,
1935
+ injectableSet,
1936
+ injectableAndRegistrationContext,
1937
+ injectablesByInjectionToken,
1938
+ overridingInjectables,
1939
+ purgeInstances,
1940
+ injectableIdSet,
1941
+ namespacedIdByInjectableMap,
1942
+ childrenByParentMap,
1943
+ // Todo: get rid of function usage.
1944
+ getDi: () => privateDi,
1945
+ decoratorCache,
1946
+ syncInjectWiring
1947
+ });
1948
+ const privateRegister = registerFor({
1949
+ registerSingle,
1950
+ injectMany: nonDecoratedPrivateInjectMany,
1951
+ getApplicableDecorators
1952
+ });
1953
+ const earlyOverride = earlyOverrideFor({
1954
+ getRelatedInjectables,
1955
+ alreadyInjected,
1956
+ overridingInjectables,
1957
+ getNamespacedId
1958
+ });
1959
+ const earlyOverride2 = earlyOverride2For({
1960
+ getRelatedInjectables,
1961
+ alreadyInjected,
1962
+ overridingInjectables,
1963
+ getNamespacedId
1964
+ });
1965
+ const override = overrideFor({
1966
+ getRelatedInjectables,
1967
+ earlyOverride
1968
+ });
1969
+ const override2 = overrideFor({
1970
+ getRelatedInjectables,
1971
+ earlyOverride: earlyOverride2
1972
+ });
1973
+ const unoverride = unoverrideFor({
1974
+ overridingInjectables,
1975
+ getRelatedInjectables,
1976
+ getNamespacedId
1977
+ });
1978
+ const purgeAllButOverrides = () => {
1979
+ injectableSet.clear();
1980
+ alreadyInjected.clear();
1981
+ injectableIdSet.clear();
1982
+ injectableAndRegistrationContext.clear();
1983
+ instancesByInjectableMap.clear();
1984
+ injectablesByInjectionToken.clear();
1985
+ namespacedIdByInjectableMap.clear();
1986
+ childrenByParentMap.clear();
1987
+ decoratorCache.injection = null;
1988
+ decoratorCache.preInject = null;
1989
+ syncInjectWiring();
1990
+ };
1991
+ const getImmediateScopeOf = (injectable) => {
1992
+ var _a;
1993
+ const context = injectableAndRegistrationContext.get(injectable);
1994
+ const immediateParent = (_a = context == null ? void 0 : context[context.length - 1]) == null ? void 0 : _a.injectable;
1995
+ return !immediateParent || immediateParent.aliasType === "container" ? rootInjectable : immediateParent;
1996
+ };
1997
+ const privateDi = {
1998
+ // Swapped by syncInjectWiring: the decorated variants are wired
1999
+ // in only while at least one injection decorator is registered, so the
2000
+ // common no-decorator case pays no wrapper frame at all.
2001
+ inject: nonDecoratedPrivateInject,
2002
+ injectWithMeta: nonDecoratedPrivateInjectWithMeta,
2003
+ injectMany: nonDecoratedPrivateInjectMany,
2004
+ injectManyWithMeta: nonDecoratedPrivateInjectManyWithMeta,
2005
+ injectFactory: (alias) => (...params) => publicInject(alias, ...params),
2006
+ register: privateRegister,
2007
+ deregister,
2008
+ override,
2009
+ override2,
2010
+ earlyOverride,
2011
+ earlyOverride2,
2012
+ unoverride,
2013
+ reset: () => {
2014
+ overridingInjectables.clear();
2015
+ },
2016
+ permitSideEffects: (alias) => {
2017
+ if (alias === void 0) {
2018
+ sideEffectsArePrevented = false;
2019
+ return;
2020
+ }
2021
+ getRelatedInjectables(alias).forEach(
2022
+ (injectable) => injectablesWithPermittedSideEffects.add(injectable)
2023
+ );
2024
+ },
2025
+ purge: purgeInstances,
2026
+ scopedPurge: (scopeInjectable, alias, ...keyParts) => {
2027
+ if (alias === void 0) {
2028
+ const children = childrenByParentMap.get(scopeInjectable);
2029
+ purgeStoredInstances(
2030
+ children === void 0 ? [scopeInjectable] : [scopeInjectable, ...children],
2031
+ keyParts
2032
+ );
2033
+ return;
2034
+ }
2035
+ const injectables = getRelatedInjectables(alias);
2036
+ const allowedChildren = childrenByParentMap.get(scopeInjectable);
2037
+ for (let i = 0; i < injectables.length; i++) {
2038
+ const injectable = injectables[i];
2039
+ if (injectable !== scopeInjectable && !(allowedChildren == null ? void 0 : allowedChildren.has(injectable))) {
2040
+ throw new Error(
2041
+ `Tried to purge "${namespacedIdByInjectableMap.get(
2042
+ injectable
2043
+ )}" from "${namespacedIdByInjectableMap.get(
2044
+ scopeInjectable
2045
+ )}", but it is not within its registration context tree.`
2046
+ );
2047
+ }
2048
+ }
2049
+ purgeStoredInstances(injectables, keyParts);
2050
+ },
2051
+ purgeAllButOverrides,
2052
+ hasRegistrations: (alias) => !!getRelatedInjectables(alias).length,
2053
+ getNumberOfRegistrations: (alias) => getRelatedInjectables(alias).length,
2054
+ registeredInScopeOf: (scopeInjectable, alias) => getRelatedInjectables(alias).some(
2055
+ (injectable) => getImmediateScopeOf(injectable) === scopeInjectable
2056
+ ),
2057
+ registeredInSubtreeOf: (scopeInjectable, alias) => getRelatedInjectables(alias).some((injectable) => {
2058
+ let scope = getImmediateScopeOf(injectable);
2059
+ while (scope !== scopeInjectable && scope !== rootInjectable) {
2060
+ scope = getImmediateScopeOf(scope);
2061
+ }
2062
+ return scope === scopeInjectable;
2063
+ }),
2064
+ getNumberOfInstances: () => {
2065
+ const result = {};
2066
+ for (const [injectable, stored] of instancesByInjectableMap) {
2067
+ const namespacedId = namespacedIdByInjectableMap.get(injectable);
2068
+ if (!namespacedId) continue;
2069
+ let count = 0;
2070
+ if (isCompositeStorage(stored)) {
2071
+ for (const _ of stored.values()) count++;
2072
+ } else {
2073
+ count = 1;
2074
+ }
2075
+ if (count > 0) result[namespacedId] = count;
2076
+ }
2077
+ return result;
2078
+ }
2079
+ };
2080
+ syncInjectWiring();
2081
+ const publicInject = (alias, ...args) => privateDi.inject({
2082
+ alias,
2083
+ instantiationParameters: args,
2084
+ injectingInjectable: rootInjectable
2085
+ });
2086
+ const publicInjectMany = (alias, ...args) => privateDi.injectMany({
2087
+ alias,
2088
+ instantiationParameters: args,
2089
+ injectingInjectable: rootInjectable
2090
+ });
2091
+ const publicInjectWithMeta = (alias, ...args) => privateDi.injectWithMeta({
2092
+ alias,
2093
+ instantiationParameters: args,
2094
+ injectingInjectable: rootInjectable
2095
+ });
2096
+ const publicInjectManyWithMeta = (alias, ...args) => privateDi.injectManyWithMeta({
2097
+ alias,
2098
+ instantiationParameters: args,
2099
+ injectingInjectable: rootInjectable
2100
+ });
2101
+ const publicDi = {
2102
+ ...privateDi,
2103
+ inject: publicInject,
2104
+ injectWithMeta: publicInjectWithMeta,
2105
+ injectMany: publicInjectMany,
2106
+ injectManyWithMeta: publicInjectManyWithMeta,
2107
+ inject2: (alias) => (...params) => publicInject(alias, ...params),
2108
+ injectMany2: (alias) => (...params) => publicInjectMany(alias, ...params),
2109
+ // Resolves per call like injectMany, but unwraps to the single instance or
2110
+ // undefined — the 'zero-or-one' upper bound guarantees at most one.
2111
+ injectMaybe2: (alias) => {
2112
+ checkForNonMaybeCardinality(alias, rootInjectable);
2113
+ return (...params) => publicInjectMany(alias, ...params)[0];
2114
+ },
2115
+ injectWithMeta2: (alias) => (...params) => publicInjectWithMeta(alias, ...params),
2116
+ injectManyWithMeta2: (alias) => (...params) => publicInjectManyWithMeta(alias, ...params),
2117
+ // injectMaybe2 over the with-meta plane: unwraps to the single
2118
+ // meta-wrapped instance or undefined.
2119
+ injectMaybeWithMeta2: (alias) => {
2120
+ checkForNonMaybeCardinality(alias, rootInjectable);
2121
+ return (...params) => publicInjectManyWithMeta(alias, ...params)[0];
2122
+ },
2123
+ register: (...injectables) => {
2124
+ privateDi.register({
2125
+ injectables,
2126
+ context: [containerRootContextItem],
2127
+ source: rootInjectable
2128
+ });
2129
+ },
2130
+ deregister: (...injectables) => {
2131
+ privateDi.deregister({
2132
+ injectables,
2133
+ context: [containerRootContextItem],
2134
+ source: rootInjectable
2135
+ });
2136
+ },
2137
+ registeredInLocalScope: (alias) => privateDi.registeredInScopeOf(rootInjectable, alias),
2138
+ validate: validateFor({
2139
+ containerId,
2140
+ injectableSet,
2141
+ injectablesByInjectionToken,
2142
+ namespacedIdByInjectableMap,
2143
+ overridingInjectables
2144
+ }),
2145
+ registeredInLocalScopeSubtree: (alias) => privateDi.registeredInSubtreeOf(rootInjectable, alias)
2146
+ };
2147
+ return publicDi;
2148
+ };
2149
+
2150
+ // src/getInjectionToken/getTypedSpecifier.js
2151
+ var import_fp = require("lodash/fp");
2152
+ var getTypedSpecifier = (0, import_fp.constant)(import_fp.identity);
2153
+
2154
+ // index.js
2155
+ var getKeyedSingletonCompositeKey = getCompositeKey;
2156
+ // Annotate the CommonJS export names for ESM import in node:
2157
+ 0 && (module.exports = {
2158
+ createContainer,
2159
+ deregistrationCallbackToken,
2160
+ deregistrationDecoratorToken,
2161
+ getInjectable,
2162
+ getInjectable2,
2163
+ getInjectableBunch,
2164
+ getInjectionToken,
2165
+ getInjectionToken2,
2166
+ getKeyedSingletonCompositeKey,
2167
+ getSpecificInjectionToken,
2168
+ getTypedSpecifier,
2169
+ injectionDecoratorToken,
2170
+ injectionTokenTag,
2171
+ instancePurgeCallbackToken,
2172
+ instantiationDecoratorToken,
2173
+ isInjectable,
2174
+ isInjectableBunch,
2175
+ isInjectionToken,
2176
+ lifecycleEnum,
2177
+ preInjectCallbackToken,
2178
+ registrationCallbackToken,
2179
+ registrationDecoratorToken,
2180
+ toFlatInjectables
2181
+ });
2182
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vaW5kZXguanMiLCAiLi4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci9saWZlY3ljbGVFbnVtLmpzIiwgIi4uL3NyYy9nZXRDb21wb3NpdGVLZXkvZ2V0Q29tcG9zaXRlS2V5LmpzIiwgIi4uL3NyYy9nZXRJbmplY3RhYmxlL2dldEluamVjdGFibGUuanMiLCAiLi4vc3JjL2dldEluamVjdGFibGUyL2dldEluamVjdGFibGUyLmpzIiwgIi4uL3NyYy9nZXRJbmplY3Rpb25Ub2tlbi9pbmplY3Rpb25Ub2tlblRhZy5qcyIsICIuLi9zcmMvZ2V0SW5qZWN0aW9uVG9rZW4vZ2V0SW5qZWN0aW9uVG9rZW4uanMiLCAiLi4vc3JjL2dldEluamVjdGlvblRva2VuMi9nZXRJbmplY3Rpb25Ub2tlbjIuanMiLCAiLi4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci90b2tlbnMuanMiLCAiLi4vc3JjL2NvbXBvc2l0ZS1tYXAvY29tcG9zaXRlLW1hcC5qcyIsICIuLi9zcmMvY29tcG9zaXRlLW1hcC9scnUtY29tcG9zaXRlLW1hcC5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL2Zhc3RGbG93LmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvcHJpdmF0ZUluamVjdEZvci5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL3dpdGhJbmplY3Rpb25EZWNvcmF0b3JzRm9yLmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvcHJpdmF0ZUluamVjdE1hbnlGb3IuanMiLCAiLi4vc3JjL2dldEluamVjdGlvblRva2VuL2lzSW5qZWN0aW9uVG9rZW4uanMiLCAiLi4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci9nZXROYW1lc3BhY2VkSWRGb3IuanMiLCAiLi4vc3JjL2dldEluamVjdGFibGVCdW5jaC9nZXRJbmplY3RhYmxlQnVuY2guanMiLCAiLi4vc3JjL2dldEluamVjdGFibGVCdW5jaC9pc0luamVjdGFibGVCdW5jaC5qcyIsICIuLi9zcmMvZ2V0SW5qZWN0YWJsZS9pc0luamVjdGFibGUuanMiLCAiLi4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci90b0ZsYXRJbmplY3RhYmxlcy5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL2dldFJlbGF0ZWRUb2tlbnMuanMiLCAiLi4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci9nZXRSZWxhdGVkSW5qZWN0YWJsZXNGb3IuanMiLCAiLi4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci9yZWdpc3Rlci5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL3B1cmdlSW5zdGFuY2VzLmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvZGVyZWdpc3Rlci5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL292ZXJyaWRlLmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvY2hlY2tGb3JOb01hdGNoZXNGb3IuanMiLCAiLi4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci9jaGVja0ZvclRvb01hbnlNYXRjaGVzLmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvY2hlY2tGb3JTaWRlRWZmZWN0c0Zvci5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL2NoZWNrRm9yQWJzdHJhY3RUb2tlbkZvci5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL2NoZWNrRm9yTm9uTWF5YmVDYXJkaW5hbGl0eUZvci5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL2NoZWNrRm9yVW5kZWNsYXJlZENvbnN1bXB0aW9uRm9yLmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvdmFsaWRhdGUuanMiLCAiLi4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci9lYXJseS1vdmVycmlkZS5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL3dpdGhQcmVJbmplY3RDYWxsYmFja3NGb3IuanMiLCAiLi4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci9maXJlUHVyZ2VDYWxsYmFja3NGb3IuanMiLCAiLi4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci9nZXRBcHBsaWNhYmxlRGVjb3JhdG9yc0Zvci5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL2NyZWF0ZUNvbnRhaW5lci5qcyIsICIuLi9zcmMvZ2V0SW5qZWN0aW9uVG9rZW4vZ2V0VHlwZWRTcGVjaWZpZXIuanMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCBjcmVhdGVDb250YWluZXIgZnJvbSAnLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL2NyZWF0ZUNvbnRhaW5lcic7XG5cbmltcG9ydCBnZXRJbmplY3RhYmxlIGZyb20gJy4vc3JjL2dldEluamVjdGFibGUvZ2V0SW5qZWN0YWJsZSc7XG5pbXBvcnQgZ2V0SW5qZWN0YWJsZTIgZnJvbSAnLi9zcmMvZ2V0SW5qZWN0YWJsZTIvZ2V0SW5qZWN0YWJsZTInO1xuaW1wb3J0IGlzSW5qZWN0YWJsZSBmcm9tICcuL3NyYy9nZXRJbmplY3RhYmxlL2lzSW5qZWN0YWJsZSc7XG5pbXBvcnQgbGlmZWN5Y2xlRW51bSBmcm9tICcuL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvbGlmZWN5Y2xlRW51bSc7XG5cbmltcG9ydCB7XG4gIGdldEluamVjdGlvblRva2VuLFxuICBnZXRTcGVjaWZpY0luamVjdGlvblRva2VuLFxufSBmcm9tICcuL3NyYy9nZXRJbmplY3Rpb25Ub2tlbi9nZXRJbmplY3Rpb25Ub2tlbic7XG5cbmltcG9ydCB7IGdldEluamVjdGlvblRva2VuMiB9IGZyb20gJy4vc3JjL2dldEluamVjdGlvblRva2VuMi9nZXRJbmplY3Rpb25Ub2tlbjInO1xuXG5pbXBvcnQgaXNJbmplY3Rpb25Ub2tlbiBmcm9tICcuL3NyYy9nZXRJbmplY3Rpb25Ub2tlbi9pc0luamVjdGlvblRva2VuJztcblxuaW1wb3J0IGdldEluamVjdGFibGVCdW5jaCBmcm9tICcuL3NyYy9nZXRJbmplY3RhYmxlQnVuY2gvZ2V0SW5qZWN0YWJsZUJ1bmNoJztcbmltcG9ydCBpc0luamVjdGFibGVCdW5jaCBmcm9tICcuL3NyYy9nZXRJbmplY3RhYmxlQnVuY2gvaXNJbmplY3RhYmxlQnVuY2gnO1xuaW1wb3J0IHRvRmxhdEluamVjdGFibGVzIGZyb20gJy4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci90b0ZsYXRJbmplY3RhYmxlcyc7XG5pbXBvcnQgeyBnZXRDb21wb3NpdGVLZXkgfSBmcm9tICcuL3NyYy9nZXRDb21wb3NpdGVLZXkvZ2V0Q29tcG9zaXRlS2V5JztcblxuZXhwb3J0IHsgZ2V0VHlwZWRTcGVjaWZpZXIgfSBmcm9tICcuL3NyYy9nZXRJbmplY3Rpb25Ub2tlbi9nZXRUeXBlZFNwZWNpZmllcic7XG5leHBvcnQgeyBpbmplY3Rpb25Ub2tlblRhZyB9IGZyb20gJy4vc3JjL2dldEluamVjdGlvblRva2VuL2luamVjdGlvblRva2VuVGFnJztcblxuZXhwb3J0IGNvbnN0IGdldEtleWVkU2luZ2xldG9uQ29tcG9zaXRlS2V5ID0gZ2V0Q29tcG9zaXRlS2V5O1xuXG5cblxuZXhwb3J0IHtcbiAgZGVyZWdpc3RyYXRpb25DYWxsYmFja1Rva2VuLFxuICBkZXJlZ2lzdHJhdGlvbkRlY29yYXRvclRva2VuLFxuICBpbmplY3Rpb25EZWNvcmF0b3JUb2tlbixcbiAgaW5zdGFuY2VQdXJnZUNhbGxiYWNrVG9rZW4sXG4gIGluc3RhbnRpYXRpb25EZWNvcmF0b3JUb2tlbixcbiAgcHJlSW5qZWN0Q2FsbGJhY2tUb2tlbixcbiAgcmVnaXN0cmF0aW9uQ2FsbGJhY2tUb2tlbixcbiAgcmVnaXN0cmF0aW9uRGVjb3JhdG9yVG9rZW4sXG59IGZyb20gJy4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci90b2tlbnMnO1xuXG5leHBvcnQge1xuICBjcmVhdGVDb250YWluZXIsXG4gIGdldEluamVjdGFibGUsXG4gIGdldEluamVjdGFibGUyLFxuICBpc0luamVjdGFibGUsXG4gIGdldEluamVjdGFibGVCdW5jaCxcbiAgaXNJbmplY3RhYmxlQnVuY2gsXG4gIGdldEluamVjdGlvblRva2VuLFxuICBnZXRJbmplY3Rpb25Ub2tlbjIsXG4gIGdldFNwZWNpZmljSW5qZWN0aW9uVG9rZW4sXG4gIGlzSW5qZWN0aW9uVG9rZW4sXG4gIGxpZmVjeWNsZUVudW0sXG4gIHRvRmxhdEluamVjdGFibGVzLFxufTtcbiIsICJleHBvcnQgY29uc3Qgbm9uU3RvcmVkSW5zdGFuY2VLZXkgPSBTeW1ib2woJ25vbi1zdG9yZWQtaW5zdGFuY2Uta2V5Jyk7XG5leHBvcnQgY29uc3Qgc3RvcmVkSW5zdGFuY2VLZXkgPSBTeW1ib2woJ3N0b3JlZC1pbnN0YW5jZS1rZXknKTtcblxuZXhwb3J0IGRlZmF1bHQge1xuICBzaW5nbGV0b246IHtcbiAgICBpZDogJ3NpbmdsZXRvbicsXG5cbiAgICBnZXRJbnN0YW5jZUtleTogKCkgPT4gc3RvcmVkSW5zdGFuY2VLZXksXG4gIH0sXG5cbiAga2V5ZWRTaW5nbGV0b246ICh7IGdldEluc3RhbmNlS2V5IH0pID0+ICh7XG4gICAgaWQ6ICdrZXllZFNpbmdsZXRvbicsXG4gICAgZ2V0SW5zdGFuY2VLZXksXG4gIH0pLFxuXG4gIHRyYW5zaWVudDoge1xuICAgIGlkOiAndHJhbnNpZW50JyxcbiAgICBnZXRJbnN0YW5jZUtleTogKCkgPT4gbm9uU3RvcmVkSW5zdGFuY2VLZXksXG4gIH0sXG59O1xuIiwgImV4cG9ydCBjb25zdCBjb21wb3NpdGVLZXlTeW1ib2wgPSBTeW1ib2woJ2NvbXBvc2l0ZS1rZXknKTtcbmV4cG9ydCBjb25zdCBnZXRDb21wb3NpdGVLZXkgPSAoLi4ua2V5cykgPT4gKHtcbiAgW2NvbXBvc2l0ZUtleVN5bWJvbF06IHRydWUsXG4gIGtleXMsXG59KTtcblxuZXhwb3J0IGNvbnN0IGlzQ29tcG9zaXRlS2V5ID0gdGhpbmcgPT5cbiAgdGhpbmcgJiYgdGhpbmdbY29tcG9zaXRlS2V5U3ltYm9sXSA9PT0gdHJ1ZTtcbiIsICJpbXBvcnQgbGlmZWN5Y2xlRW51bSBmcm9tICcuLi9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvbGlmZWN5Y2xlRW51bSc7XG5cbmV4cG9ydCBjb25zdCBpbmplY3RhYmxlU3ltYm9sID0gJ2luamVjdGFibGUnO1xuXG5leHBvcnQgZGVmYXVsdCAoeyBsaWZlY3ljbGUgPSBsaWZlY3ljbGVFbnVtLnNpbmdsZXRvbiwgLi4uaW5qZWN0YWJsZSB9KSA9PiAoe1xuICBhbGlhc1R5cGU6IGluamVjdGFibGVTeW1ib2wsXG4gIGxpZmVjeWNsZSxcbiAgLi4uaW5qZWN0YWJsZSxcbn0pO1xuIiwgImltcG9ydCBsaWZlY3ljbGVFbnVtIGZyb20gJy4uL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci9saWZlY3ljbGVFbnVtJztcbmltcG9ydCB7IHN0b3JlZEluc3RhbmNlS2V5IH0gZnJvbSAnLi4vZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL2xpZmVjeWNsZUVudW0nO1xuaW1wb3J0IHsgZ2V0Q29tcG9zaXRlS2V5IH0gZnJvbSAnLi4vZ2V0Q29tcG9zaXRlS2V5L2dldENvbXBvc2l0ZUtleSc7XG5cbmV4cG9ydCBjb25zdCBpbmplY3RhYmxlU3ltYm9sMiA9ICdpbmplY3RhYmxlMic7XG5cbi8vIEhvaXN0ZWQgYW5kIHNoYXJlZCBhY3Jvc3MgZXZlcnkgbm9uLXRyYW5zaWVudCBnZXRJbmplY3RhYmxlMiBcdTIwMTQgc2F2ZXMgYVxuLy8gcGVyLWNhbGwgbGlmZWN5Y2xlIGFsbG9jYXRpb24sIGFuZCB0aGUgYF9pc1YyRGVmYXVsdExpZmVjeWNsZWAgdGFnIGxldHNcbi8vIHByaXZhdGVJbmplY3RGb3Igc2tpcCB0aGUgZ2V0SW5zdGFuY2VLZXkgY2FsbCArIGtleS1hcnJheSBhbGxvY2F0aW9uIHdoZW5cbi8vIGEgdjIgaW5qZWN0YWJsZSBpcyBpbmplY3RlZCB3aXRoIG5vIGFyZ3MgKHRoZSBjb21tb24gY2FzZSBmb3Jcbi8vIG5vbi1wYXJhbWV0cmljIHYyKS4gVGhlIHRhZyBpcyB0aGUgKm9ubHkqIHNpZ25hbCB3ZSB0cnVzdCB0byBieXBhc3Ncbi8vIGdldEluc3RhbmNlS2V5IGJlY2F1c2UgdXNlci1wcm92aWRlZCBnZXRJbnN0YW5jZUtleSBtYXkgbGVnaXRpbWF0ZWx5XG4vLyByZXR1cm4gc29tZXRoaW5nIG90aGVyIHRoYW4gYHN0b3JlZEluc3RhbmNlS2V5YCBmb3IgZW1wdHkgYXJncy5cbmNvbnN0IHYyRGVmYXVsdExpZmVjeWNsZSA9IGxpZmVjeWNsZUVudW0ua2V5ZWRTaW5nbGV0b24oe1xuICBnZXRJbnN0YW5jZUtleTogKGRpLCAuLi5hcmdzKSA9PiB7XG4gICAgaWYgKGFyZ3MubGVuZ3RoID09PSAwKSByZXR1cm4gc3RvcmVkSW5zdGFuY2VLZXk7XG4gICAgcmV0dXJuIGdldENvbXBvc2l0ZUtleSguLi5hcmdzKTtcbiAgfSxcbn0pO1xuXG52MkRlZmF1bHRMaWZlY3ljbGUuX2lzVjJEZWZhdWx0TGlmZWN5Y2xlID0gdHJ1ZTtcblxuZXhwb3J0IGRlZmF1bHQgKHsgaW5zdGFudGlhdGUsIHRyYW5zaWVudCA9IGZhbHNlLCAuLi5yZXN0IH0pID0+ICh7XG4gIGFsaWFzVHlwZTogaW5qZWN0YWJsZVN5bWJvbDIsXG4gIGluc3RhbnRpYXRlLFxuICB0cmFuc2llbnQsXG4gIGxpZmVjeWNsZTogdHJhbnNpZW50ID8gbGlmZWN5Y2xlRW51bS50cmFuc2llbnQgOiB2MkRlZmF1bHRMaWZlY3ljbGUsXG4gIC4uLnJlc3QsXG59KTtcbiIsICIvLyBUaGUgaW5pdGlhbCB0YWcgY2FycmllZCBieSBldmVyeSBpbmplY3Rpb24gdG9rZW4gKHYxIGFuZCB2MiksIHBlcm1pdHRpbmdcbi8vIHRhZy1rZXllZCBkZWNvcmF0b3JzIHRvIHRhcmdldCBhbnkgdG9rZW4sIGUuZy5cbi8vIGBpbmplY3Rpb25EZWNvcmF0b3JUb2tlbi5mb3IoaW5qZWN0aW9uVG9rZW5UYWcpYC5cbmV4cG9ydCBjb25zdCBpbmplY3Rpb25Ub2tlblRhZyA9ICdpbmplY3Rpb25Ub2tlbic7XG4iLCAiaW1wb3J0IHsgaW5qZWN0aW9uVG9rZW5UYWcgfSBmcm9tICcuL2luamVjdGlvblRva2VuVGFnJztcblxuZXhwb3J0IGNvbnN0IGluamVjdGlvblRva2VuU3ltYm9sID0gJ2luamVjdGlvbi10b2tlbic7XG5cbmV4cG9ydCBjb25zdCBnZXRJbmplY3Rpb25Ub2tlbiA9ICh7XG4gIHNwZWNpZmljSW5qZWN0aW9uVG9rZW5GYWN0b3J5OiBzcGVjaWZpY1Rva2VuRmFjdG9yeSA9IGdldFNwZWNpZmljVG9rZW5CeUlkLFxuXG4gIHRhcmdldCxcblxuICB0YWdzLFxuXG4gIC4uLnJlc3Rcbn0pID0+IHtcbiAgY29uc3Qgc3BlY2lmaWNUb2tlbnNCeVNwZWNpYWxpdHkgPSBuZXcgTWFwKCk7XG5cbiAgLy8gVGhlIGZhY3RvcnkgaXMgYXNzdW1lZCBwdXJlIGFuZCBkZXRlcm1pbmlzdGljOiBhIHNwZWNpZmllciBhbHdheXMgbWFwc1xuICAvLyB0byB0aGUgc2FtZSB0b2tlbiwgc28gc2luZ2xlLXNwZWNpZmllciBjYWxscyBhcmUgbWVtb2l6ZWQgYnkgc3BlY2lmaWVyXG4gIC8vIHRvIHNraXAgY29uc3RydWN0aW5nIGEgdGhyb3dhd2F5IGNhbmRpZGF0ZSBvbiByZXBlYXQgYC5mb3IoKWAgY2FsbHMuXG4gIGNvbnN0IHNwZWNpZmljVG9rZW5zQnlTcGVjaWZpZXIgPSBuZXcgTWFwKCk7XG5cbiAgY29uc3QgZ2VuZXJhbFRva2VuID0gT2JqZWN0LmFzc2lnbih0YXJnZXQgPz8ge30sIHtcbiAgICAuLi5yZXN0LFxuXG4gICAgdGFnczogW2luamVjdGlvblRva2VuVGFnLCAuLi4odGFncyA/PyBbXSldLFxuXG4gICAgYWxpYXNUeXBlOiBpbmplY3Rpb25Ub2tlblN5bWJvbCxcblxuICAgIGZvcjogKC4uLnNwZWNpZmllcnMpID0+IHtcbiAgICAgIGNvbnN0IG1lbW9pemVkVG9rZW4gPVxuICAgICAgICBzcGVjaWZpZXJzLmxlbmd0aCA9PT0gMVxuICAgICAgICAgID8gc3BlY2lmaWNUb2tlbnNCeVNwZWNpZmllci5nZXQoc3BlY2lmaWVyc1swXSlcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgaWYgKG1lbW9pemVkVG9rZW4pIHtcbiAgICAgICAgcmV0dXJuIG1lbW9pemVkVG9rZW47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNwZWNpZmljVG9rZW5DYW5kaWRhdGUgPSBzcGVjaWZpY1Rva2VuRmFjdG9yeSguLi5zcGVjaWZpZXJzKTtcblxuICAgICAgY29uc3QgZXhpc3RpbmdTcGVjaWZpY1Rva2VuID0gc3BlY2lmaWNUb2tlbnNCeVNwZWNpYWxpdHkuZ2V0KFxuICAgICAgICBzcGVjaWZpY1Rva2VuQ2FuZGlkYXRlLnNwZWNpYWxpdHksXG4gICAgICApO1xuXG4gICAgICBpZiAoZXhpc3RpbmdTcGVjaWZpY1Rva2VuKSB7XG4gICAgICAgIGlmIChzcGVjaWZpZXJzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIHNwZWNpZmljVG9rZW5zQnlTcGVjaWZpZXIuc2V0KHNwZWNpZmllcnNbMF0sIGV4aXN0aW5nU3BlY2lmaWNUb2tlbik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZXhpc3RpbmdTcGVjaWZpY1Rva2VuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzcGVjaWZpY1Rva2VuID0gc3BlY2lmaWNUb2tlbkNhbmRpZGF0ZTtcblxuICAgICAgc3BlY2lmaWNUb2tlbi5pZCA9IGAke2dlbmVyYWxUb2tlbi5pZH0vJHtzcGVjaWZpY1Rva2VuLmlkfWA7XG4gICAgICBzcGVjaWZpY1Rva2VuLnNwZWNpZmljVG9rZW5PZiA9IGdlbmVyYWxUb2tlbjtcbiAgICAgIHNwZWNpZmljVG9rZW4ubWF4Q2FjaGVTaXplID0gZ2VuZXJhbFRva2VuLm1heENhY2hlU2l6ZTtcbiAgICAgIHNwZWNpZmljVG9rZW4udGFncyA9IGdlbmVyYWxUb2tlbi50YWdzO1xuXG4gICAgICBzcGVjaWZpY1Rva2Vuc0J5U3BlY2lhbGl0eS5zZXQoc3BlY2lmaWNUb2tlbi5zcGVjaWFsaXR5LCBzcGVjaWZpY1Rva2VuKTtcblxuICAgICAgaWYgKHNwZWNpZmllcnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHNwZWNpZmljVG9rZW5zQnlTcGVjaWZpZXIuc2V0KHNwZWNpZmllcnNbMF0sIHNwZWNpZmljVG9rZW4pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc3BlY2lmaWNUb2tlbjtcbiAgICB9LFxuICB9KTtcblxuICByZXR1cm4gZ2VuZXJhbFRva2VuO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFNwZWNpZmljSW5qZWN0aW9uVG9rZW4gPSAoLi4uYXJncykgPT5cbiAgZ2V0SW5qZWN0aW9uVG9rZW4oLi4uYXJncyk7XG5cbmNvbnN0IGdldFNwZWNpZmljVG9rZW5CeUlkID0gaWQgPT4gZ2V0SW5qZWN0aW9uVG9rZW4oeyBpZCwgc3BlY2lhbGl0eTogaWQgfSk7XG4iLCAiaW1wb3J0IHsgaW5qZWN0aW9uVG9rZW5UYWcgfSBmcm9tICcuLi9nZXRJbmplY3Rpb25Ub2tlbi9pbmplY3Rpb25Ub2tlblRhZyc7XG5cbmV4cG9ydCBjb25zdCBpbmplY3Rpb25Ub2tlblN5bWJvbDIgPSAnaW5qZWN0aW9uLXRva2VuMic7XG5cbmNvbnN0IGNhcmRpbmFsaXRpZXMgPSBbJ29uZScsICd6ZXJvLW9yLW9uZScsICd6ZXJvLW9yLW1hbnknLCAnb25lLW9yLW1hbnknXTtcblxuY29uc3QgYnVpbGRUb2tlbiA9ICh7XG4gIHNwZWNpZmljSW5qZWN0aW9uVG9rZW5GYWN0b3J5LFxuICB0YXJnZXQsXG4gIHRhZ3MsXG4gIC4uLnJlc3Rcbn0pID0+IHtcbiAgLy8gQSBzcGVjaWZpYyB0b2tlbiBtYXkgZGVjbGFyZSBpdHMgb3duIGNhcmRpbmFsaXR5IFx1MjAxNCBpdHMgZmFtaWx5J3MgZ2VuZXJhbFxuICAvLyB0b2tlbiBvZnRlbiBoYXMgYSBkaWZmZXJlbnQgb25lIFx1MjAxNCBhbmQgaW5oZXJpdHMgd2hlbiBpdCBkb2VzIG5vdCwgd2hpY2hcbiAgLy8gaXMgd2h5IG9ubHkgZ2VuZXJhbCB0b2tlbnMgYXJlIHJlcXVpcmVkIHRvIGRlY2xhcmUuXG4gIGlmIChyZXN0LmNhcmRpbmFsaXR5ID09PSB1bmRlZmluZWQpIHtcbiAgICBpZiAocmVzdC5zcGVjaWFsaXR5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRyaWVkIHRvIGNyZWF0ZSBpbmplY3Rpb24gdG9rZW4gXCIke3Jlc3QuaWR9XCIgd2l0aG91dCBjYXJkaW5hbGl0eS5gLFxuICAgICAgKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoIWNhcmRpbmFsaXRpZXMuaW5jbHVkZXMocmVzdC5jYXJkaW5hbGl0eSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVHJpZWQgdG8gY3JlYXRlIGluamVjdGlvbiB0b2tlbiBcIiR7cmVzdC5pZH1cIiB3aXRoIHVua25vd24gY2FyZGluYWxpdHkgXCIke3Jlc3QuY2FyZGluYWxpdHl9XCIuYCxcbiAgICApO1xuICB9XG5cbiAgY29uc3Qgc3BlY2lmaWNUb2tlbnNCeVNwZWNpYWxpdHkgPSBuZXcgTWFwKCk7XG5cbiAgLy8gVGhlIGZhY3RvcnkgaXMgYXNzdW1lZCBwdXJlIGFuZCBkZXRlcm1pbmlzdGljOiBhIHNwZWNpZmllciBhbHdheXMgbWFwc1xuICAvLyB0byB0aGUgc2FtZSB0b2tlbiwgc28gc2luZ2xlLXNwZWNpZmllciBjYWxscyBhcmUgbWVtb2l6ZWQgYnkgc3BlY2lmaWVyXG4gIC8vIHRvIHNraXAgY29uc3RydWN0aW5nIGEgdGhyb3dhd2F5IGNhbmRpZGF0ZSBvbiByZXBlYXQgYC5mb3IoKWAgY2FsbHMuXG4gIGNvbnN0IHNwZWNpZmljVG9rZW5zQnlTcGVjaWZpZXIgPSBuZXcgTWFwKCk7XG5cbiAgY29uc3QgZ2VuZXJhbFRva2VuID0gT2JqZWN0LmFzc2lnbih0YXJnZXQgPz8ge30sIHtcbiAgICAuLi5yZXN0LFxuXG4gICAgdGFnczogW2luamVjdGlvblRva2VuVGFnLCAuLi4odGFncyA/PyBbXSldLFxuXG4gICAgYWxpYXNUeXBlOiBpbmplY3Rpb25Ub2tlblN5bWJvbDIsXG5cbiAgICAvLyBObyBmYWN0b3J5IG1lYW5zIG5vIGAuZm9yKClgIGF0IGFsbCwgbWF0Y2hpbmcgdGhlIHR5cGU6IGEgdG9rZW4gaXNuJ3RcbiAgICAvLyByZXF1aXJlZCB0byBiZSBwYXJ0IG9mIGEgZmFtaWx5LiBBIGZhY3RvcnkgYWxzbyBtYWtlcyB0aGUgdG9rZW5cbiAgICAvLyBhYnN0cmFjdDogaXQncyBvbmx5IGV2ZXIgdXNlZnVsIHJlc29sdmVkIHZpYSBhIHJlYWwgYC5mb3IoKWAsIHNvIGl0XG4gICAgLy8gY2Fubm90IGJlIGluamVjdGVkL3JlZ2lzdGVyZWQgZGlyZWN0bHkgXHUyMDE0IHNlZSBjaGVja0ZvckFic3RyYWN0VG9rZW5Gb3JcbiAgICAvLyBhbmQgcmVnaXN0ZXIuanMncyBgaW5qZWN0aW9uVG9rZW4/LmFic3RyYWN0YCBjaGVjay5cbiAgICAuLi4oc3BlY2lmaWNJbmplY3Rpb25Ub2tlbkZhY3RvcnkgJiYge1xuICAgICAgYWJzdHJhY3Q6IHRydWUsXG5cbiAgICAgIGZvcjogKC4uLnNwZWNpZmllcnMpID0+IHtcbiAgICAgICAgY29uc3QgbWVtb2l6ZWRUb2tlbiA9XG4gICAgICAgICAgc3BlY2lmaWVycy5sZW5ndGggPT09IDFcbiAgICAgICAgICAgID8gc3BlY2lmaWNUb2tlbnNCeVNwZWNpZmllci5nZXQoc3BlY2lmaWVyc1swXSlcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGlmIChtZW1vaXplZFRva2VuKSB7XG4gICAgICAgICAgcmV0dXJuIG1lbW9pemVkVG9rZW47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzcGVjaWZpY1Rva2VuQ2FuZGlkYXRlID0gc3BlY2lmaWNJbmplY3Rpb25Ub2tlbkZhY3RvcnkoXG4gICAgICAgICAgLi4uc3BlY2lmaWVycyxcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBleGlzdGluZ1NwZWNpZmljVG9rZW4gPSBzcGVjaWZpY1Rva2Vuc0J5U3BlY2lhbGl0eS5nZXQoXG4gICAgICAgICAgc3BlY2lmaWNUb2tlbkNhbmRpZGF0ZS5zcGVjaWFsaXR5LFxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChleGlzdGluZ1NwZWNpZmljVG9rZW4pIHtcbiAgICAgICAgICBpZiAoc3BlY2lmaWVycy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHNwZWNpZmljVG9rZW5zQnlTcGVjaWZpZXIuc2V0KHNwZWNpZmllcnNbMF0sIGV4aXN0aW5nU3BlY2lmaWNUb2tlbik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGV4aXN0aW5nU3BlY2lmaWNUb2tlbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNwZWNpZmljVG9rZW4gPSBzcGVjaWZpY1Rva2VuQ2FuZGlkYXRlO1xuXG4gICAgICAgIHNwZWNpZmljVG9rZW4uaWQgPSBgJHtnZW5lcmFsVG9rZW4uaWR9LyR7c3BlY2lmaWNUb2tlbi5pZH1gO1xuICAgICAgICBzcGVjaWZpY1Rva2VuLnNwZWNpZmljVG9rZW5PZiA9IGdlbmVyYWxUb2tlbjtcbiAgICAgICAgc3BlY2lmaWNUb2tlbi5tYXhDYWNoZVNpemUgPSBnZW5lcmFsVG9rZW4ubWF4Q2FjaGVTaXplO1xuICAgICAgICBzcGVjaWZpY1Rva2VuLnRhZ3MgPSBnZW5lcmFsVG9rZW4udGFncztcbiAgICAgICAgc3BlY2lmaWNUb2tlbi5jYXJkaW5hbGl0eSA9XG4gICAgICAgICAgc3BlY2lmaWNUb2tlbi5jYXJkaW5hbGl0eSA/PyBnZW5lcmFsVG9rZW4uY2FyZGluYWxpdHk7XG5cbiAgICAgICAgc3BlY2lmaWNUb2tlbnNCeVNwZWNpYWxpdHkuc2V0KHNwZWNpZmljVG9rZW4uc3BlY2lhbGl0eSwgc3BlY2lmaWNUb2tlbik7XG5cbiAgICAgICAgaWYgKHNwZWNpZmllcnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgc3BlY2lmaWNUb2tlbnNCeVNwZWNpZmllci5zZXQoc3BlY2lmaWVyc1swXSwgc3BlY2lmaWNUb2tlbik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3BlY2lmaWNUb2tlbjtcbiAgICAgIH0sXG4gICAgfSksXG4gIH0pO1xuXG4gIHJldHVybiBnZW5lcmFsVG9rZW47XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0SW5qZWN0aW9uVG9rZW4yID0gKC4uLmFyZ3MpID0+IHtcbiAgLy8gQSBzaW5nbGUsIG5vbi1jdXJyaWVkIGNhbGw6IG9wdGlvbnMgZ2l2ZW4gZGlyZWN0bHksIGZhY3RvcnkgY3VycmllZCBhc1xuICAvLyBpdHMgb3duIHRyYWlsaW5nIGNhbGwgXHUyMDE0IGdldEluamVjdGlvblRva2VuMihvcHRpb25zKShmYWN0b3J5KSwgb3JcbiAgLy8gZ2V0SW5qZWN0aW9uVG9rZW4yKG9wdGlvbnMpKCkgZm9yIGEgY29uY3JldGUgdG9rZW4gd2l0aCBubyBgLmZvcigpYCBhdFxuICAvLyBhbGwuIFBhc3NpbmcgYSBmYWN0b3J5IGFsc28gbWFrZXMgdGhlIHRva2VuIGFic3RyYWN0IFx1MjAxNCBzZWUgYnVpbGRUb2tlbi5cbiAgLy8gVGhlIGV4cGxpY2l0LVNGIGVzY2FwZSBoYXRjaCAoZ2V0SW5qZWN0aW9uVG9rZW4yPEYsIE1GLCBTRj4ob3B0aW9ucykpXG4gIC8vIHVzZXMgdGhpcyBleGFjdCBzYW1lIHNoYXBlLCBmYWN0b3J5IGp1c3Qgb3B0aW9uYWwgb24gdGhlIHRyYWlsaW5nIGNhbGxcbiAgLy8gaW5zdGVhZCBvZiByZXF1aXJlZCBcdTIwMTQgbm90aGluZyBkaXN0aW5ndWlzaGVzIHRoZW0gYXQgcnVudGltZSwgc2luY2UgU0ZcbiAgLy8gYmVpbmcgc3BlbGxlZCBvdXQgZXhwbGljaXRseSB2cyBpbmZlcnJlZCBmcm9tIHRoZSBmYWN0b3J5IHZhbHVlIGlzXG4gIC8vIGVyYXNlZCBieSB0aGUgdGltZSB0aGlzIGNvZGUgcnVucy5cbiAgLy9cbiAgLy8gQSBgc3BlY2lhbGl0eWAgaW4gb3B0aW9ucyBidWlsZHMgYSBzcGVjaWZpYyB0b2tlbiBkaXJlY3RseSBcdTIwMTQgdGhpcyBpcyBob3dcbiAgLy8gZ2V0U3BlY2lmaWNJbmplY3Rpb25Ub2tlbjIgdXNlZCB0byBiZSBpdHMgb3duIGZ1bmN0aW9uOyBmb2xkZWQgaW4gaGVyZVxuICAvLyBzaW5jZSBidWlsZFRva2VuIGFscmVhZHkgdGhyZWFkcyBgc3BlY2lhbGl0eWAgdGhyb3VnaCB2aWEgYC4uLnJlc3RgXG4gIC8vIHJlZ2FyZGxlc3Mgb2Ygd2hpY2ggY3JlYXRvciBpcyBjYWxsZWQuIFVubGlrZSB0aGUgb2xkXG4gIC8vIGdldFNwZWNpZmljSW5qZWN0aW9uVG9rZW4yLCB0aGlzIGFsc28gYWNjZXB0cyBhIGZhY3RvcnksIHNvIGEgc3BlY2lmaWNcbiAgLy8gdG9rZW4gY2FuIGl0c2VsZiBiZSBhIGZhbWlseSByb290IGZvciBuZXN0ZWQgc3BlY2lmaWNpdHkgXHUyMDE0IHNlZSB0aGVcbiAgLy8gY29tbWVudCBvbiBidWlsZFRva2VuIGZvciB3aHkgdGhhdCBtYWtlcyBpdCBhYnN0cmFjdCB0b28uXG4gIGlmIChhcmdzLmxlbmd0aCAhPT0gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBUcmllZCB0byBjcmVhdGUgaW5qZWN0aW9uIHRva2VuJHtcbiAgICAgICAgYXJnc1swXT8uaWQgPyBgIFwiJHthcmdzWzBdLmlkfVwiYCA6ICcnXG4gICAgICB9IHdpdGggJHtcbiAgICAgICAgYXJncy5sZW5ndGhcbiAgICAgIH0gYXJndW1lbnRzOyBnZXRJbmplY3Rpb25Ub2tlbjIgdGFrZXMgZXhhY3RseSBvbmUgKG9wdGlvbnMpLmAsXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IFtvcHRpb25zXSA9IGFyZ3M7XG5cbiAgcmV0dXJuIHNwZWNpZmljSW5qZWN0aW9uVG9rZW5GYWN0b3J5ID0+XG4gICAgYnVpbGRUb2tlbih7IC4uLm9wdGlvbnMsIHNwZWNpZmljSW5qZWN0aW9uVG9rZW5GYWN0b3J5IH0pO1xufTtcbiIsICJpbXBvcnQgeyBnZXRJbmplY3Rpb25Ub2tlbiB9IGZyb20gJy4uL2dldEluamVjdGlvblRva2VuL2dldEluamVjdGlvblRva2VuJztcbmltcG9ydCB7IGdldEluamVjdGlvblRva2VuMiB9IGZyb20gJy4uL2dldEluamVjdGlvblRva2VuMi9nZXRJbmplY3Rpb25Ub2tlbjInO1xuXG4vLyBNYWNoaW5lcnkgdG9rZW5zIGNhcnJ5IG5vIHRhZ3M6IHRhZyBkaXNwYXRjaCByZWFkcyB0aGUgdGFyZ2V0J3MgdG9rZW5cbi8vIGNoYWluLCBzbyBhIGRlY29yYXRvciByZWdpc3RlcmVkIHVuZGVyIGUuZy5cbi8vIGBpbnN0YW50aWF0aW9uRGVjb3JhdG9yVG9rZW4uZm9yKCdpbmplY3Rpb25Ub2tlbicpYCB3b3VsZCBvdGhlcndpc2UgYmVcbi8vIGZvdW5kIHZpYSBpdHMgb3duIHJlZ2lzdHJhdGlvbiB0b2tlbiBkdXJpbmcgaXRzIG93biBpbnN0YW50aWF0aW9uIFx1MjAxNFxuLy8gaW5maW5pdGUgcmVjdXJzaW9uLiBgLmZvcigpYCBjaGlsZHJlbiBjb3B5IHRoZSBnZW5lcmFsIHRva2VuJ3MgdGFncyBhdFxuLy8gY3JlYXRpb24sIHNvIHRoZSBleGVtcHRpb24gcHJvcGFnYXRlcyB0byB0aGVtLiAoU2FtZSByb2xlIHRoZSByZW1vdmVkXG4vLyBgZGVjb3JhYmxlOiBmYWxzZWAgZmxhZyBoYWQuKVxuY29uc3QgdW50YWdnZWQgPSB0b2tlbiA9PiB7XG4gIHRva2VuLnRhZ3MgPSB1bmRlZmluZWQ7XG4gIHJldHVybiB0b2tlbjtcbn07XG5cbmV4cG9ydCBjb25zdCByZWdpc3RyYXRpb25DYWxsYmFja1Rva2VuID0gdW50YWdnZWQoXG4gIGdldEluamVjdGlvblRva2VuKHtcbiAgICBpZDogJ3JlZ2lzdHJhdGlvbi1jYWxsYmFjay10b2tlbicsXG4gIH0pLFxuKTtcblxuZXhwb3J0IGNvbnN0IGRlcmVnaXN0cmF0aW9uQ2FsbGJhY2tUb2tlbiA9IHVudGFnZ2VkKFxuICBnZXRJbmplY3Rpb25Ub2tlbih7XG4gICAgaWQ6ICdkZXJlZ2lzdHJhdGlvbi1jYWxsYmFjay10b2tlbicsXG4gIH0pLFxuKTtcblxuZXhwb3J0IGNvbnN0IGluc3RhbnRpYXRpb25EZWNvcmF0b3JUb2tlbiA9IHVudGFnZ2VkKFxuICBnZXRJbmplY3Rpb25Ub2tlbjIoe1xuICAgIGlkOiAnaW5zdGFudGlhdGUtZGVjb3JhdG9yLXRva2VuJyxcbiAgICBjYXJkaW5hbGl0eTogJ3plcm8tb3ItbWFueScsXG4gIH0pKHRhcmdldCA9PiBnZXRJbmplY3Rpb25Ub2tlbjIoeyBpZDogdGFyZ2V0LmlkLCBzcGVjaWFsaXR5OiB0YXJnZXQgfSkoKSksXG4pO1xuXG5leHBvcnQgY29uc3QgaW5qZWN0aW9uRGVjb3JhdG9yVG9rZW4gPSB1bnRhZ2dlZChcbiAgZ2V0SW5qZWN0aW9uVG9rZW4yKHtcbiAgICBpZDogJ2luamVjdGlvbi1kZWNvcmF0b3ItdG9rZW4nLFxuICAgIGNhcmRpbmFsaXR5OiAnemVyby1vci1tYW55JyxcbiAgfSkodGFyZ2V0ID0+IGdldEluamVjdGlvblRva2VuMih7IGlkOiB0YXJnZXQuaWQsIHNwZWNpYWxpdHk6IHRhcmdldCB9KSgpKSxcbik7XG5cbmV4cG9ydCBjb25zdCBpbnN0YW5jZVB1cmdlQ2FsbGJhY2tUb2tlbiA9IHVudGFnZ2VkKFxuICBnZXRJbmplY3Rpb25Ub2tlbjIoe1xuICAgIGlkOiAnaW5zdGFuY2UtcHVyZ2UtY2FsbGJhY2stdG9rZW4nLFxuICAgIGNhcmRpbmFsaXR5OiAnemVyby1vci1tYW55JyxcbiAgfSkodGFyZ2V0ID0+IGdldEluamVjdGlvblRva2VuMih7IGlkOiB0YXJnZXQuaWQsIHNwZWNpYWxpdHk6IHRhcmdldCB9KSgpKSxcbik7XG5cbmV4cG9ydCBjb25zdCByZWdpc3RyYXRpb25EZWNvcmF0b3JUb2tlbiA9IHVudGFnZ2VkKFxuICBnZXRJbmplY3Rpb25Ub2tlbjIoe1xuICAgIGlkOiAncmVnaXN0cmF0aW9uLWRlY29yYXRvci10b2tlbicsXG4gICAgY2FyZGluYWxpdHk6ICd6ZXJvLW9yLW1hbnknLFxuICB9KSh0YXJnZXQgPT4gZ2V0SW5qZWN0aW9uVG9rZW4yKHsgaWQ6IHRhcmdldC5pZCwgc3BlY2lhbGl0eTogdGFyZ2V0IH0pKCkpLFxuKTtcblxuZXhwb3J0IGNvbnN0IGRlcmVnaXN0cmF0aW9uRGVjb3JhdG9yVG9rZW4gPSB1bnRhZ2dlZChcbiAgZ2V0SW5qZWN0aW9uVG9rZW4yKHtcbiAgICBpZDogJ2RlcmVnaXN0cmF0aW9uLWRlY29yYXRvci10b2tlbicsXG4gICAgY2FyZGluYWxpdHk6ICd6ZXJvLW9yLW1hbnknLFxuICB9KSh0YXJnZXQgPT4gZ2V0SW5qZWN0aW9uVG9rZW4yKHsgaWQ6IHRhcmdldC5pZCwgc3BlY2lhbGl0eTogdGFyZ2V0IH0pKCkpLFxuKTtcblxuZXhwb3J0IGNvbnN0IHByZUluamVjdENhbGxiYWNrVG9rZW4gPSB1bnRhZ2dlZChcbiAgZ2V0SW5qZWN0aW9uVG9rZW4yKHtcbiAgICBpZDogJ3ByZS1pbmplY3QtY2FsbGJhY2stdG9rZW4nLFxuICAgIGNhcmRpbmFsaXR5OiAnemVyby1vci1tYW55JyxcbiAgfSkodGFyZ2V0ID0+IGdldEluamVjdGlvblRva2VuMih7IGlkOiB0YXJnZXQuaWQsIHNwZWNpYWxpdHk6IHRhcmdldCB9KSgpKSxcbik7XG4iLCAiY29uc3QgaXNPYmplY3RLZXkgPSBrZXkgPT5cbiAgKHR5cGVvZiBrZXkgPT09ICdvYmplY3QnICYmIGtleSAhPT0gbnVsbCkgfHwgdHlwZW9mIGtleSA9PT0gJ2Z1bmN0aW9uJztcblxuY29uc3QgbWFrZU5vZGUgPSAoKSA9PiAoe1xuICBsYXllcjogbmV3IE1hcCgpLFxuICB3ZWFrTGF5ZXI6IG5ldyBXZWFrTWFwKCksXG4gIGNoaWxkcmVuOiBuZXcgTWFwKCksXG4gIHdlYWtDaGlsZHJlbjogbmV3IFdlYWtNYXAoKSxcbiAgaGFzV2Vha0VudHJpZXM6IGZhbHNlLFxufSk7XG5cbmV4cG9ydCBjbGFzcyBDb21wb3NpdGVNYXAge1xuICAjaW50ZXJuYWxNYXAgPSBtYWtlTm9kZSgpO1xuXG4gIGNvbnN0cnVjdG9yKGluaXRpYWxWYWx1ZXMgPSBbXSkge1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGluaXRpYWxWYWx1ZXMpIHtcbiAgICAgIHRoaXMuc2V0KGtleSwgdmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gICNsYXllckZvcihtYXBFbnRyeSwga2V5KSB7XG4gICAgcmV0dXJuIGlzT2JqZWN0S2V5KGtleSkgPyBtYXBFbnRyeS53ZWFrTGF5ZXIgOiBtYXBFbnRyeS5sYXllcjtcbiAgfVxuXG4gICNjaGlsZHJlbkZvcihtYXBFbnRyeSwga2V5KSB7XG4gICAgcmV0dXJuIGlzT2JqZWN0S2V5KGtleSkgPyBtYXBFbnRyeS53ZWFrQ2hpbGRyZW4gOiBtYXBFbnRyeS5jaGlsZHJlbjtcbiAgfVxuXG4gICNzZXQobWFwRW50cnksIGtleSwgdmFsdWUpIHtcbiAgICBpZiAoa2V5Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3QgZmlyc3QgPSBrZXlbMF07XG4gICAgICB0aGlzLiNsYXllckZvcihtYXBFbnRyeSwgZmlyc3QpLnNldChmaXJzdCwgdmFsdWUpO1xuICAgICAgaWYgKGlzT2JqZWN0S2V5KGZpcnN0KSkgbWFwRW50cnkuaGFzV2Vha0VudHJpZXMgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBbZmlyc3QsIC4uLnJlc3RdID0ga2V5O1xuICAgICAgY29uc3QgY2hpbGRNYXAgPSB0aGlzLiNjaGlsZHJlbkZvcihtYXBFbnRyeSwgZmlyc3QpO1xuICAgICAgbGV0IG5leHRNYXBFbnRyeSA9IGNoaWxkTWFwLmdldChmaXJzdCk7XG5cbiAgICAgIGlmICghbmV4dE1hcEVudHJ5KSB7XG4gICAgICAgIG5leHRNYXBFbnRyeSA9IG1ha2VOb2RlKCk7XG4gICAgICAgIGNoaWxkTWFwLnNldChmaXJzdCwgbmV4dE1hcEVudHJ5KTtcbiAgICAgICAgaWYgKGlzT2JqZWN0S2V5KGZpcnN0KSkgbWFwRW50cnkuaGFzV2Vha0VudHJpZXMgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLiNzZXQobmV4dE1hcEVudHJ5LCByZXN0LCB2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgc2V0KGtleSwgdmFsdWUpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoa2V5KSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQga2V5IHRvIGJlIGFuIGFycmF5Jyk7XG4gICAgfVxuXG4gICAgaWYgKGtleS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0tleXMgbXVzdCBiZSBhdCBsZWFzdCBsZW5ndGggMScpO1xuICAgIH1cblxuICAgIHRoaXMuI3NldCh0aGlzLiNpbnRlcm5hbE1hcCwga2V5LCB2YWx1ZSk7XG4gIH1cblxuICAjZ2V0KG1hcEVudHJ5LCBrZXkpIHtcbiAgICBpZiAoa2V5Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIHRoaXMuI2xheWVyRm9yKG1hcEVudHJ5LCBrZXlbMF0pLmdldChrZXlbMF0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBbZmlyc3QsIC4uLnJlc3RdID0ga2V5O1xuICAgICAgY29uc3QgbmV4dE1hcEVudHJ5ID0gdGhpcy4jY2hpbGRyZW5Gb3IobWFwRW50cnksIGZpcnN0KS5nZXQoZmlyc3QpO1xuXG4gICAgICBpZiAoIW5leHRNYXBFbnRyeSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy4jZ2V0KG5leHRNYXBFbnRyeSwgcmVzdCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0KGtleSkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShrZXkpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBrZXkgdG8gYmUgYW4gYXJyYXknKTtcbiAgICB9XG5cbiAgICBpZiAoa2V5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy4jZ2V0KHRoaXMuI2ludGVybmFsTWFwLCBrZXkpO1xuICB9XG5cbiAgI2hhcyhtYXBFbnRyeSwga2V5KSB7XG4gICAgaWYgKGtleS5sZW5ndGggPT09IDEpIHtcbiAgICAgIHJldHVybiB0aGlzLiNsYXllckZvcihtYXBFbnRyeSwga2V5WzBdKS5oYXMoa2V5WzBdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgW2ZpcnN0LCAuLi5yZXN0XSA9IGtleTtcbiAgICAgIGNvbnN0IG5leHRNYXBFbnRyeSA9IHRoaXMuI2NoaWxkcmVuRm9yKG1hcEVudHJ5LCBmaXJzdCkuZ2V0KGZpcnN0KTtcblxuICAgICAgaWYgKCFuZXh0TWFwRW50cnkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy4jaGFzKG5leHRNYXBFbnRyeSwgcmVzdCk7XG4gICAgfVxuICB9XG5cbiAgaGFzKGtleSkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShrZXkpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBrZXkgdG8gYmUgYW4gYXJyYXknKTtcbiAgICB9XG5cbiAgICBpZiAoa2V5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLiNoYXModGhpcy4jaW50ZXJuYWxNYXAsIGtleSk7XG4gIH1cblxuICAqdmFsdWVzKCkge1xuICAgIGZvciAoY29uc3QgWywgdmFsdWVdIG9mIHRoaXMuZW50cmllcygpKSB7XG4gICAgICB5aWVsZCB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICAqa2V5cygpIHtcbiAgICBmb3IgKGNvbnN0IFtrZXldIG9mIHRoaXMuZW50cmllcygpKSB7XG4gICAgICB5aWVsZCBrZXk7XG4gICAgfVxuICB9XG5cbiAgKiNlbnRyaWVzKG1hcEVudHJ5LCBrZXkpIHtcbiAgICBmb3IgKGNvbnN0IFtsYXllcktleSwgbGF5ZXJWYWx1ZV0gb2YgbWFwRW50cnkubGF5ZXIuZW50cmllcygpKSB7XG4gICAgICB5aWVsZCBbWy4uLmtleSwgbGF5ZXJLZXldLCBsYXllclZhbHVlXTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtsYXllcktleSwgbGF5ZXJNYXBFbnRyeV0gb2YgbWFwRW50cnkuY2hpbGRyZW4uZW50cmllcygpKSB7XG4gICAgICB5aWVsZCogdGhpcy4jZW50cmllcyhsYXllck1hcEVudHJ5LCBbLi4ua2V5LCBsYXllcktleV0pO1xuICAgIH1cbiAgfVxuXG4gICplbnRyaWVzKCkge1xuICAgIHlpZWxkKiB0aGlzLiNlbnRyaWVzKHRoaXMuI2ludGVybmFsTWFwLCBbXSk7XG4gIH1cblxuICAjY2FuUHJ1bmUobm9kZSkge1xuICAgIHJldHVybiAoXG4gICAgICAhbm9kZS5oYXNXZWFrRW50cmllcyAmJiBub2RlLmxheWVyLnNpemUgPT09IDAgJiYgbm9kZS5jaGlsZHJlbi5zaXplID09PSAwXG4gICAgKTtcbiAgfVxuXG4gICNkZWxldGUobWFwRW50cnksIGtleSkge1xuICAgIGlmIChrZXkubGVuZ3RoID09PSAxKSB7XG4gICAgICByZXR1cm4gdGhpcy4jbGF5ZXJGb3IobWFwRW50cnksIGtleVswXSkuZGVsZXRlKGtleVswXSk7XG4gICAgfVxuXG4gICAgY29uc3QgW2ZpcnN0LCAuLi5yZXN0XSA9IGtleTtcbiAgICBjb25zdCBjaGlsZE1hcCA9IHRoaXMuI2NoaWxkcmVuRm9yKG1hcEVudHJ5LCBmaXJzdCk7XG4gICAgY29uc3QgbmV4dE1hcEVudHJ5ID0gY2hpbGRNYXAuZ2V0KGZpcnN0KTtcblxuICAgIGlmICghbmV4dE1hcEVudHJ5KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgZGVsZXRlZCA9IHRoaXMuI2RlbGV0ZShuZXh0TWFwRW50cnksIHJlc3QpO1xuXG4gICAgaWYgKGRlbGV0ZWQgJiYgdGhpcy4jY2FuUHJ1bmUobmV4dE1hcEVudHJ5KSkge1xuICAgICAgY2hpbGRNYXAuZGVsZXRlKGZpcnN0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVsZXRlZDtcbiAgfVxuXG4gIGRlbGV0ZShrZXkpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoa2V5KSB8fCBrZXkubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuI2RlbGV0ZSh0aGlzLiNpbnRlcm5hbE1hcCwga2V5KTtcbiAgfVxuXG4gICNmb3JFYWNoSW5TdWJ0cmVlKG1hcEVudHJ5LCBvblZhbHVlKSB7XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiBtYXBFbnRyeS5sYXllci52YWx1ZXMoKSkge1xuICAgICAgb25WYWx1ZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBjaGlsZEVudHJ5IG9mIG1hcEVudHJ5LmNoaWxkcmVuLnZhbHVlcygpKSB7XG4gICAgICB0aGlzLiNmb3JFYWNoSW5TdWJ0cmVlKGNoaWxkRW50cnksIG9uVmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gICNkZWxldGVCeVByZWZpeChtYXBFbnRyeSwga2V5UHJlZml4LCBvblZhbHVlKSB7XG4gICAgaWYgKGtleVByZWZpeC5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IGtleSA9IGtleVByZWZpeFswXTtcbiAgICAgIGNvbnN0IGxheWVyID0gdGhpcy4jbGF5ZXJGb3IobWFwRW50cnksIGtleSk7XG4gICAgICBjb25zdCBjaGlsZE1hcCA9IHRoaXMuI2NoaWxkcmVuRm9yKG1hcEVudHJ5LCBrZXkpO1xuICAgICAgbGV0IGRlbGV0ZWQgPSBmYWxzZTtcblxuICAgICAgaWYgKGxheWVyLmhhcyhrZXkpKSB7XG4gICAgICAgIGlmIChvblZhbHVlKSBvblZhbHVlKGxheWVyLmdldChrZXkpKTtcbiAgICAgICAgbGF5ZXIuZGVsZXRlKGtleSk7XG4gICAgICAgIGRlbGV0ZWQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjaGlsZEVudHJ5ID0gY2hpbGRNYXAuZ2V0KGtleSk7XG5cbiAgICAgIGlmIChjaGlsZEVudHJ5KSB7XG4gICAgICAgIGlmIChvblZhbHVlKSB0aGlzLiNmb3JFYWNoSW5TdWJ0cmVlKGNoaWxkRW50cnksIG9uVmFsdWUpO1xuICAgICAgICBjaGlsZE1hcC5kZWxldGUoa2V5KTtcbiAgICAgICAgZGVsZXRlZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkZWxldGVkO1xuICAgIH1cblxuICAgIGNvbnN0IFtmaXJzdCwgLi4ucmVzdF0gPSBrZXlQcmVmaXg7XG4gICAgY29uc3QgY2hpbGRNYXAgPSB0aGlzLiNjaGlsZHJlbkZvcihtYXBFbnRyeSwgZmlyc3QpO1xuICAgIGNvbnN0IG5leHRNYXBFbnRyeSA9IGNoaWxkTWFwLmdldChmaXJzdCk7XG5cbiAgICBpZiAoIW5leHRNYXBFbnRyeSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGRlbGV0ZWQgPSB0aGlzLiNkZWxldGVCeVByZWZpeChuZXh0TWFwRW50cnksIHJlc3QsIG9uVmFsdWUpO1xuXG4gICAgaWYgKGRlbGV0ZWQgJiYgdGhpcy4jY2FuUHJ1bmUobmV4dE1hcEVudHJ5KSkge1xuICAgICAgY2hpbGRNYXAuZGVsZXRlKGZpcnN0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVsZXRlZDtcbiAgfVxuXG4gIGRlbGV0ZUJ5UHJlZml4KGtleVByZWZpeCwgb25WYWx1ZSkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShrZXlQcmVmaXgpIHx8IGtleVByZWZpeC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy4jZGVsZXRlQnlQcmVmaXgodGhpcy4jaW50ZXJuYWxNYXAsIGtleVByZWZpeCwgb25WYWx1ZSk7XG4gIH1cblxuICBjbGVhcigpIHtcbiAgICB0aGlzLiNpbnRlcm5hbE1hcCA9IG1ha2VOb2RlKCk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBDb21wb3NpdGVNYXAgfSBmcm9tICcuL2NvbXBvc2l0ZS1tYXAnO1xuXG5leHBvcnQgY2xhc3MgTHJ1Q29tcG9zaXRlTWFwIHtcbiAgI2lubmVyID0gbmV3IENvbXBvc2l0ZU1hcCgpO1xuICAjbWF4U2l6ZTtcbiAgI3NpemUgPSAwO1xuICAjaGVhZCA9IG51bGw7XG4gICN0YWlsID0gbnVsbDtcbiAgI29uRXZpY3Q7XG5cbiAgY29uc3RydWN0b3IobWF4U2l6ZSwgeyBvbkV2aWN0IH0gPSB7fSkge1xuICAgIHRoaXMuI21heFNpemUgPSBtYXhTaXplO1xuICAgIHRoaXMuI29uRXZpY3QgPSBvbkV2aWN0O1xuICB9XG5cbiAgI2FkZFRvSGVhZChub2RlKSB7XG4gICAgbm9kZS5uZXh0ID0gdGhpcy4jaGVhZDtcbiAgICBub2RlLnByZXYgPSBudWxsO1xuXG4gICAgaWYgKHRoaXMuI2hlYWQpIHtcbiAgICAgIHRoaXMuI2hlYWQucHJldiA9IG5vZGU7XG4gICAgfVxuXG4gICAgdGhpcy4jaGVhZCA9IG5vZGU7XG5cbiAgICBpZiAoIXRoaXMuI3RhaWwpIHtcbiAgICAgIHRoaXMuI3RhaWwgPSBub2RlO1xuICAgIH1cbiAgfVxuXG4gICNyZW1vdmVOb2RlKG5vZGUpIHtcbiAgICBpZiAobm9kZS5wcmV2KSB7XG4gICAgICBub2RlLnByZXYubmV4dCA9IG5vZGUubmV4dDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy4jaGVhZCA9IG5vZGUubmV4dDtcbiAgICB9XG5cbiAgICBpZiAobm9kZS5uZXh0KSB7XG4gICAgICBub2RlLm5leHQucHJldiA9IG5vZGUucHJldjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy4jdGFpbCA9IG5vZGUucHJldjtcbiAgICB9XG5cbiAgICBub2RlLnByZXYgPSBudWxsO1xuICAgIG5vZGUubmV4dCA9IG51bGw7XG4gIH1cblxuICAjcHJvbW90ZU5vZGUobm9kZSkge1xuICAgIGlmIChub2RlID09PSB0aGlzLiNoZWFkKSByZXR1cm47XG4gICAgdGhpcy4jcmVtb3ZlTm9kZShub2RlKTtcbiAgICB0aGlzLiNhZGRUb0hlYWQobm9kZSk7XG4gIH1cblxuICAjZXZpY3RMcnUoKSB7XG4gICAgY29uc3QgbHJ1Tm9kZSA9IHRoaXMuI3RhaWw7XG4gICAgY29uc3Qga2V5ID0gbHJ1Tm9kZS5rZXk7XG4gICAgY29uc3Qgd3JhcHBlciA9IHRoaXMuI2lubmVyLmdldChrZXkpO1xuICAgIHRoaXMuI3JlbW92ZU5vZGUobHJ1Tm9kZSk7XG4gICAgdGhpcy4jaW5uZXIuZGVsZXRlKGtleSk7XG4gICAgdGhpcy4jc2l6ZS0tO1xuXG4gICAgaWYgKHRoaXMuI29uRXZpY3QpIHRoaXMuI29uRXZpY3Qod3JhcHBlci52YWx1ZSwga2V5KTtcbiAgfVxuXG4gIGdldChrZXkpIHtcbiAgICBjb25zdCB3cmFwcGVyID0gdGhpcy4jaW5uZXIuZ2V0KGtleSk7XG5cbiAgICBpZiAod3JhcHBlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHRoaXMuI3Byb21vdGVOb2RlKHdyYXBwZXIubHJ1Tm9kZSk7XG5cbiAgICByZXR1cm4gd3JhcHBlci52YWx1ZTtcbiAgfVxuXG4gIHNldChrZXksIHZhbHVlKSB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLiNpbm5lci5nZXQoa2V5KTtcblxuICAgIGlmIChleGlzdGluZykge1xuICAgICAgZXhpc3RpbmcudmFsdWUgPSB2YWx1ZTtcbiAgICAgIHRoaXMuI3Byb21vdGVOb2RlKGV4aXN0aW5nLmxydU5vZGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGxydU5vZGUgPSB7IGtleSwgcHJldjogbnVsbCwgbmV4dDogbnVsbCB9O1xuICAgIHRoaXMuI2lubmVyLnNldChrZXksIHsgdmFsdWUsIGxydU5vZGUgfSk7XG4gICAgdGhpcy4jYWRkVG9IZWFkKGxydU5vZGUpO1xuICAgIHRoaXMuI3NpemUrKztcblxuICAgIGlmICh0aGlzLiNzaXplID4gdGhpcy4jbWF4U2l6ZSkge1xuICAgICAgdGhpcy4jZXZpY3RMcnUoKTtcbiAgICB9XG4gIH1cblxuICBoYXMoa2V5KSB7XG4gICAgcmV0dXJuIHRoaXMuI2lubmVyLmhhcyhrZXkpO1xuICB9XG5cbiAgKnZhbHVlcygpIHtcbiAgICBmb3IgKGNvbnN0IHdyYXBwZXIgb2YgdGhpcy4jaW5uZXIudmFsdWVzKCkpIHtcbiAgICAgIHlpZWxkIHdyYXBwZXIudmFsdWU7XG4gICAgfVxuICB9XG5cbiAgKmtleXMoKSB7XG4gICAgeWllbGQqIHRoaXMuI2lubmVyLmtleXMoKTtcbiAgfVxuXG4gICplbnRyaWVzKCkge1xuICAgIGZvciAoY29uc3QgW2tleSwgd3JhcHBlcl0gb2YgdGhpcy4jaW5uZXIuZW50cmllcygpKSB7XG4gICAgICB5aWVsZCBba2V5LCB3cmFwcGVyLnZhbHVlXTtcbiAgICB9XG4gIH1cblxuICBkZWxldGVCeVByZWZpeChrZXlQcmVmaXgpIHtcbiAgICByZXR1cm4gdGhpcy4jaW5uZXIuZGVsZXRlQnlQcmVmaXgoa2V5UHJlZml4LCB3cmFwcGVyID0+IHtcbiAgICAgIHRoaXMuI3JlbW92ZU5vZGUod3JhcHBlci5scnVOb2RlKTtcbiAgICAgIHRoaXMuI3NpemUtLTtcbiAgICB9KTtcbiAgfVxuXG4gIGNsZWFyKCkge1xuICAgIHRoaXMuI2lubmVyLmNsZWFyKCk7XG4gICAgdGhpcy4jaGVhZCA9IG51bGw7XG4gICAgdGhpcy4jdGFpbCA9IG51bGw7XG4gICAgdGhpcy4jc2l6ZSA9IDA7XG4gIH1cbn1cbiIsICJleHBvcnQgZGVmYXVsdCAoLi4uZnVuY3Rpb25zKSA9PlxuICB4ID0+IHtcbiAgICBsZXQgdmFsID0geDtcblxuICAgIGZ1bmN0aW9ucy5mb3JFYWNoKGYgPT4ge1xuICAgICAgdmFsID0gZih2YWwpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHZhbDtcbiAgfTtcbiIsICJpbXBvcnQgeyBub25TdG9yZWRJbnN0YW5jZUtleSwgc3RvcmVkSW5zdGFuY2VLZXkgfSBmcm9tICcuL2xpZmVjeWNsZUVudW0nO1xuaW1wb3J0IHsgaXNDb21wb3NpdGVLZXkgfSBmcm9tICcuLi9nZXRDb21wb3NpdGVLZXkvZ2V0Q29tcG9zaXRlS2V5JztcbmltcG9ydCB7IGluamVjdGFibGVTeW1ib2wgfSBmcm9tICcuLi9nZXRJbmplY3RhYmxlL2dldEluamVjdGFibGUnO1xuaW1wb3J0IHsgaW5qZWN0YWJsZVN5bWJvbDIgfSBmcm9tICcuLi9nZXRJbmplY3RhYmxlMi9nZXRJbmplY3RhYmxlMic7XG5pbXBvcnQgeyBpbnN0YW50aWF0aW9uRGVjb3JhdG9yVG9rZW4gfSBmcm9tICcuL3Rva2Vucyc7XG5pbXBvcnQgeyBDb21wb3NpdGVNYXAgfSBmcm9tICcuLi9jb21wb3NpdGUtbWFwL2NvbXBvc2l0ZS1tYXAnO1xuaW1wb3J0IHsgTHJ1Q29tcG9zaXRlTWFwIH0gZnJvbSAnLi4vY29tcG9zaXRlLW1hcC9scnUtY29tcG9zaXRlLW1hcCc7XG5pbXBvcnQgZmxvdyBmcm9tICcuL2Zhc3RGbG93JztcblxuLy8gUHJlLWFsbG9jYXRlZCBrZXkgZm9yIHNpbmdsZXRvbiBpbnN0YW5jZSBsb29rdXAgXHUyMDE0IGF2b2lkcyBhcnJheSBjcmVhdGlvbiBwZXIgaW5qZWN0KClcbmNvbnN0IHNpbmdsZXRvbkNvbXBvc2l0ZUtleSA9IFtzdG9yZWRJbnN0YW5jZUtleV07XG5cbi8vIERldGVjdHMgdGhlIGtleWVkU2luZ2xldG9uIHN0b3JhZ2Ugc2hhcGUuIFNpbmdsZXRvbnMgKGFuZCB2Mi1kZWZhdWx0XG4vLyBpbmplY3RhYmxlcyB0aGF0IGhhdmUgb25seSBldmVyIGJlZW4gY2FsbGVkIHdpdGhvdXQgYXJncykgc3RvcmUgdGhlXG4vLyBpbnN0YW5jZSBkaXJlY3RseTsga2V5ZWRTaW5nbGV0b24gd2l0aC1hcmdzIHN0b3JhZ2UgdXNlcyBhIENvbXBvc2l0ZU1hcC5cbmV4cG9ydCBjb25zdCBpc0NvbXBvc2l0ZVN0b3JhZ2UgPSBzdG9yZWQgPT5cbiAgc3RvcmVkIGluc3RhbmNlb2YgQ29tcG9zaXRlTWFwIHx8IHN0b3JlZCBpbnN0YW5jZW9mIExydUNvbXBvc2l0ZU1hcDtcblxuZXhwb3J0IGNvbnN0IHByaXZhdGVJbmplY3RGb3IgPVxuICAoe1xuICAgIGdldFJlbGF0ZWRJbmplY3RhYmxlcyxcbiAgICBpbmplY3RhYmxlU2V0LFxuICAgIGFscmVhZHlJbmplY3RlZCxcbiAgICBvdmVycmlkaW5nSW5qZWN0YWJsZXMsXG4gICAgaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLFxuICAgIGdldERpLFxuICAgIGNoZWNrRm9yTm9NYXRjaGVzLFxuICAgIGNoZWNrRm9yVG9vTWFueU1hdGNoZXMsXG4gICAgY2hlY2tGb3JTaWRlRWZmZWN0cyxcbiAgICBjaGVja0ZvckFic3RyYWN0VG9rZW4sXG4gICAgY2hlY2tGb3JOb25NYXliZUNhcmRpbmFsaXR5LFxuICAgIG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcCxcbiAgICBnZXROYW1lc3BhY2VkSWQsXG4gICAgZ2V0QXBwbGljYWJsZURlY29yYXRvcnMsXG4gIH0pID0+XG4gICh7IHdpdGhNZXRhIH0pID0+XG4gICh7IGFsaWFzLCBpbnN0YW50aWF0aW9uUGFyYW1ldGVycywgaW5qZWN0aW5nSW5qZWN0YWJsZSB9KSA9PiB7XG4gICAgY29uc3QgZGkgPSBnZXREaSgpO1xuXG4gICAgbGV0IG9yaWdpbmFsSW5qZWN0YWJsZTtcblxuICAgIC8vIEZhc3QgcGF0aDogYWxpYXMgaXMgaXRzZWxmIGFuIGluamVjdGFibGUgKHRoZSBkb21pbmFudCBjYXNlIFx1MjAxNCBldmVyeVxuICAgIC8vIGNhbGwgZnJvbSBwcml2YXRlSW5qZWN0TWFueSBsYW5kcyBoZXJlIGJlY2F1c2UgaXQgaXRlcmF0ZXMgcmVzb2x2ZWRcbiAgICAvLyBpbmplY3RhYmxlcykuIFNraXAgZ2V0UmVsYXRlZEluamVjdGFibGVzICh3aGljaCB3b3VsZCBhbGxvY2F0ZSBhXG4gICAgLy8gc2luZ2xlLWVsZW1lbnQgW2FsaWFzXSBhcnJheSksIHRoZSBzaW5nbGUtbWF0Y2gvbm8tbWF0Y2ggdmFsaWRhdG9ycyxcbiAgICAvLyBhbmQgdGhlIGFic3RyYWN0LXRva2VuIGNoZWNrIChpbmplY3RhYmxlcyBhcmUgbmV2ZXIgYWJzdHJhY3QpLlxuICAgIGNvbnN0IGFsaWFzVHlwZSA9IGFsaWFzLmFsaWFzVHlwZTtcblxuICAgIGlmIChhbGlhc1R5cGUgPT09IGluamVjdGFibGVTeW1ib2wgfHwgYWxpYXNUeXBlID09PSBpbmplY3RhYmxlU3ltYm9sMikge1xuICAgICAgaWYgKCFpbmplY3RhYmxlU2V0LmhhcyhhbGlhcykpIHtcbiAgICAgICAgLy8gUmV1c2UgdGhlIGV4aXN0aW5nIHRocm93IHdpdGggdGhlIHNhbWUgd29yZGluZyBhcyB0aGUgdG9rZW4gcGF0aC5cbiAgICAgICAgY2hlY2tGb3JOb01hdGNoZXMoW10sIGFsaWFzLCBpbmplY3RpbmdJbmplY3RhYmxlKTtcbiAgICAgIH1cbiAgICAgIG9yaWdpbmFsSW5qZWN0YWJsZSA9IGFsaWFzO1xuICAgIH0gZWxzZSB7XG4gICAgICBjaGVja0ZvckFic3RyYWN0VG9rZW4oYWxpYXMsIGluamVjdGluZ0luamVjdGFibGUpO1xuXG4gICAgICBjb25zdCByZWxhdGVkSW5qZWN0YWJsZXMgPSBnZXRSZWxhdGVkSW5qZWN0YWJsZXMoYWxpYXMpO1xuXG4gICAgICBjaGVja0ZvclRvb01hbnlNYXRjaGVzKHJlbGF0ZWRJbmplY3RhYmxlcywgYWxpYXMsIGluamVjdGluZ0luamVjdGFibGUpO1xuICAgICAgY2hlY2tGb3JOb01hdGNoZXMocmVsYXRlZEluamVjdGFibGVzLCBhbGlhcywgaW5qZWN0aW5nSW5qZWN0YWJsZSk7XG5cbiAgICAgIG9yaWdpbmFsSW5qZWN0YWJsZSA9IHJlbGF0ZWRJbmplY3RhYmxlc1swXTtcbiAgICB9XG5cbiAgICBhbHJlYWR5SW5qZWN0ZWQuYWRkKG9yaWdpbmFsSW5qZWN0YWJsZSk7XG5cbiAgICBjb25zdCBpbmplY3RhYmxlID1cbiAgICAgIG92ZXJyaWRpbmdJbmplY3RhYmxlcy5zaXplID4gMFxuICAgICAgICA/IG92ZXJyaWRpbmdJbmplY3RhYmxlcy5nZXQob3JpZ2luYWxJbmplY3RhYmxlKSB8fCBvcmlnaW5hbEluamVjdGFibGVcbiAgICAgICAgOiBvcmlnaW5hbEluamVjdGFibGU7XG5cbiAgICBjaGVja0ZvclNpZGVFZmZlY3RzKGluamVjdGFibGUsIGluamVjdGluZ0luamVjdGFibGUpO1xuXG4gICAgLy8gQmFja3dhcmQgY29tcGF0OiBvbGQtc3R5bGUgc2luZ2xldG9ucyB0b2xlcmF0ZWQgYGluamVjdChhbGlhcywgdW5kZWZpbmVkKWAuXG4gICAgLy8gTm9ybWFsaXplIGFsbC11bmRlZmluZWQgYXJncyB0byBbXSBzbyBmYXN0LXBhdGggYW5kIHNpbmdsZXRvbiBndWFyZCBiZWhhdmVcbiAgICAvLyBhcyBpZiBubyBwYXJhbWV0ZXIgd2FzIHN1cHBsaWVkLlxuICAgIGlmIChcbiAgICAgIGluamVjdGFibGUuYWxpYXNUeXBlICE9PSBpbmplY3RhYmxlU3ltYm9sMiAmJlxuICAgICAgaW5qZWN0YWJsZS5saWZlY3ljbGUuaWQgPT09ICdzaW5nbGV0b24nICYmXG4gICAgICBpbnN0YW50aWF0aW9uUGFyYW1ldGVycy5sZW5ndGggPiAwICYmXG4gICAgICBpbnN0YW50aWF0aW9uUGFyYW1ldGVycy5ldmVyeShwID0+IHAgPT09IHVuZGVmaW5lZClcbiAgICApIHtcbiAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzID0gW107XG4gICAgfVxuXG4gICAgLy8gRmFzdCBwYXRoOiBzaW5nbGV0b24gY2FjaGUgaGl0IFx1MjAxNCBhdm9pZCBjcmVhdGluZyBtaW5pbWFsRGkgZW50aXJlbHkuXG4gICAgLy8gVGhlIHN0b3JlZCB2YWx1ZSBpcyBvbmUgb2Y6XG4gICAgLy8gICAtIHVuZGVmaW5lZDogbm90aGluZyBjYWNoZWQgeWV0XG4gICAgLy8gICAtIENvbXBvc2l0ZU1hcCAvIExydUNvbXBvc2l0ZU1hcDoga2V5ZWRTaW5nbGV0b24gY2FjaGUsIGxvb2sgdXAgYnlcbiAgICAvLyAgICAgc2luZ2xldG9uQ29tcG9zaXRlS2V5IGZvciBhIG5vLWFyZ3MgY2FsbFxuICAgIC8vICAgLSBhbnkgb3RoZXIgdmFsdWU6IGluc3RhbmNlIGRpcmVjdGx5IChzaW5nbGV0b24gbGlmZWN5Y2xlLCBvciB2MlxuICAgIC8vICAgICBkZWZhdWx0IGxpZmVjeWNsZSB0aGF0IGhhcyBvbmx5IGV2ZXIgYmVlbiBjYWxsZWQgd2l0aCBubyBhcmdzKVxuICAgIC8vXG4gICAgLy8gV2UgZGlzcGF0Y2ggb24gbGlmZWN5Y2xlLmlkIGZpcnN0IHNvIHBsYWluIHNpbmdsZXRvbnMgKHRoZSBkb21pbmFudFxuICAgIC8vIGNhc2UpIHNraXAgdGhlIGluc3RhbmNlb2YgY2hlY2tzIGVudGlyZWx5OyBvbmx5IGtleWVkU2luZ2xldG9uLXNoYXBlZFxuICAgIC8vIGxpZmVjeWNsZXMgZmFsbCB0aHJvdWdoIHRvIHRoZSBzdHJ1Y3R1cmFsIGNoZWNrLlxuICAgIGlmIChpbnN0YW50aWF0aW9uUGFyYW1ldGVycy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnN0IHN0b3JlZCA9IGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcC5nZXQoXG4gICAgICAgIGluamVjdGFibGUub3ZlcnJpZGRlbkluamVjdGFibGUgfHwgaW5qZWN0YWJsZSxcbiAgICAgICk7XG5cbiAgICAgIGxldCBleGlzdGluZ0luc3RhbmNlO1xuXG4gICAgICBpZiAoaW5qZWN0YWJsZS5saWZlY3ljbGUuaWQgPT09ICdzaW5nbGV0b24nKSB7XG4gICAgICAgIGV4aXN0aW5nSW5zdGFuY2UgPSBzdG9yZWQ7XG4gICAgICB9IGVsc2UgaWYgKGlzQ29tcG9zaXRlU3RvcmFnZShzdG9yZWQpKSB7XG4gICAgICAgIGV4aXN0aW5nSW5zdGFuY2UgPSBzdG9yZWQuZ2V0KHNpbmdsZXRvbkNvbXBvc2l0ZUtleSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBleGlzdGluZ0luc3RhbmNlID0gc3RvcmVkO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXhpc3RpbmdJbnN0YW5jZSkge1xuICAgICAgICBpZiAoIXdpdGhNZXRhKSB7XG4gICAgICAgICAgcmV0dXJuIGV4aXN0aW5nSW5zdGFuY2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGluc3RhbmNlOiBleGlzdGluZ0luc3RhbmNlLFxuICAgICAgICAgIG1ldGE6IHsgaWQ6IG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcC5nZXQoaW5qZWN0YWJsZSkgfSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBpbnN0YW5jZSA9IGdldEluc3RhbmNlKFxuICAgICAgZGksXG4gICAgICBpbmplY3RhYmxlLFxuICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnMsXG4gICAgICBpbnN0YW5jZXNCeUluamVjdGFibGVNYXAsXG4gICAgICBpbmplY3RpbmdJbmplY3RhYmxlLFxuICAgICAgbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLFxuICAgICAgZ2V0TmFtZXNwYWNlZElkLFxuICAgICAgZ2V0QXBwbGljYWJsZURlY29yYXRvcnMsXG4gICAgICBjaGVja0Zvck5vbk1heWJlQ2FyZGluYWxpdHksXG4gICAgKTtcblxuICAgIGlmICghd2l0aE1ldGEpIHtcbiAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgaW5zdGFuY2UsXG4gICAgICBtZXRhOiB7IGlkOiBuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAuZ2V0KGluamVjdGFibGUpIH0sXG4gICAgfTtcbiAgfTtcblxuY29uc3QgY3JlYXRlTWluaW1hbERpID0gKFxuICBkaSxcbiAgaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQsXG4gIGluamVjdGluZ0luamVjdGFibGUsXG4gIG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcCxcbiAgY2hlY2tGb3JOb25NYXliZUNhcmRpbmFsaXR5LFxuKSA9PiB7XG4gIC8vIENsb3N1cmUtY2FwdHVyZWQgbWV0aG9kcyBhcmUgZml4ZWQgdXAtZnJvbnQgKGBzaGFyZWRgIHBsdXMgaW5qZWN0KiksXG4gIC8vIHNvIHVzZXIgY29kZSBjYW4gZGV0YWNoIHRoZW0gXHUyMDE0IGBjb25zdCB7IHJlZ2lzdGVyIH0gPSBkaTsgcmVnaXN0ZXIoLi4uKWBcbiAgLy8gYW5kIHNpbWlsYXIgcGF0dGVybnMgYXBwZWFyIGluIHRlc3RzLiBBIGNsYXNzLXdpdGgtcHJvdG90eXBlIGRpc3BhdGNoZXJcbiAgLy8gd291bGQgYmUgY2hlYXBlciB0byBhbGxvY2F0ZSBidXQgbG9zZXMgdGhhdCBkZXRhY2gtZnJpZW5kbHkgYmVoYXZpb3IuXG4gIGNvbnN0IHNoYXJlZCA9IHtcbiAgICByZWdpc3RlcjogKC4uLmluamVjdGFibGVzKSA9PiB7XG4gICAgICBkaS5yZWdpc3Rlcih7XG4gICAgICAgIGluamVjdGFibGVzLFxuICAgICAgICBjb250ZXh0OiBbeyBpbmplY3RhYmxlOiBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCB9XSxcbiAgICAgICAgc291cmNlOiBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBkZXJlZ2lzdGVyOiAoLi4uaW5qZWN0YWJsZXMpID0+IHtcbiAgICAgIGRpLmRlcmVnaXN0ZXIoe1xuICAgICAgICBpbmplY3RhYmxlcyxcbiAgICAgICAgY29udGV4dDogW3sgaW5qZWN0YWJsZTogaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQgfV0sXG4gICAgICAgIHNvdXJjZTogaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQsXG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgZ2V0IHNvdXJjZU5hbWVzcGFjZSgpIHtcbiAgICAgIGNvbnN0IG5zSWQgPSBuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAuZ2V0KGluamVjdGluZ0luamVjdGFibGUpO1xuICAgICAgY29uc3QgbGFzdENvbG9uID0gbnNJZCA/IG5zSWQubGFzdEluZGV4T2YoJzonKSA6IC0xO1xuXG4gICAgICByZXR1cm4gbGFzdENvbG9uID4gMCA/IG5zSWQuc2xpY2UoMCwgbGFzdENvbG9uKSA6IHVuZGVmaW5lZDtcbiAgICB9LFxuXG4gICAgaGFzUmVnaXN0cmF0aW9uczogZGkuaGFzUmVnaXN0cmF0aW9ucyxcbiAgICBnZXROdW1iZXJPZlJlZ2lzdHJhdGlvbnM6IGRpLmdldE51bWJlck9mUmVnaXN0cmF0aW9ucyxcbiAgICBnZXROdW1iZXJPZkluc3RhbmNlczogZGkuZ2V0TnVtYmVyT2ZJbnN0YW5jZXMsXG5cbiAgICBwdXJnZTogKGFsaWFzLCAuLi5rZXlQYXJ0cykgPT5cbiAgICAgIGRpLnNjb3BlZFB1cmdlKGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLCBhbGlhcywgLi4ua2V5UGFydHMpLFxuXG4gICAgcmVnaXN0ZXJlZEluTG9jYWxTY29wZTogYWxpYXMgPT5cbiAgICAgIGRpLnJlZ2lzdGVyZWRJblNjb3BlT2YoaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQsIGFsaWFzKSxcblxuICAgIHJlZ2lzdGVyZWRJbkxvY2FsU2NvcGVTdWJ0cmVlOiBhbGlhcyA9PlxuICAgICAgZGkucmVnaXN0ZXJlZEluU3VidHJlZU9mKGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLCBhbGlhcyksXG4gIH07XG5cbiAgaWYgKGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLmFsaWFzVHlwZSA9PT0gaW5qZWN0YWJsZVN5bWJvbDIpIHtcbiAgICAvLyBWMiBtaW5pbWFsRGk6IGluamVjdC9pbmplY3RNYW55L2V0YyBhcmUgZmFjdG9yeS1yZXR1cm5pbmcuIEVhY2ggbWV0aG9kXG4gICAgLy8gaXMgaW5saW5lZCBkaXJlY3RseSBhZ2FpbnN0IGBkaWAgKG5vIG1pbmltYWxJbmplY3QqIGludGVybWVkaWFyeSkgc29cbiAgICAvLyB3ZSBkb24ndCBhbGxvY2F0ZSBmb3VyIGV4dHJhIGNsb3N1cmVzIHBlciBtaW5pbWFsRGkganVzdCB0byBmb3J3YXJkLlxuICAgIHJldHVybiB7XG4gICAgICAuLi5zaGFyZWQsXG5cbiAgICAgIGluamVjdDpcbiAgICAgICAgYWxpYXMgPT5cbiAgICAgICAgKC4uLnBhcmFtcykgPT5cbiAgICAgICAgICBkaS5pbmplY3Qoe1xuICAgICAgICAgICAgYWxpYXMsXG4gICAgICAgICAgICBpbnN0YW50aWF0aW9uUGFyYW1ldGVyczogcGFyYW1zLFxuICAgICAgICAgICAgaW5qZWN0aW5nSW5qZWN0YWJsZTogaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQsXG4gICAgICAgICAgfSksXG5cbiAgICAgIGluamVjdE1hbnk6XG4gICAgICAgIGFsaWFzID0+XG4gICAgICAgICguLi5wYXJhbXMpID0+XG4gICAgICAgICAgZGkuaW5qZWN0TWFueSh7XG4gICAgICAgICAgICBhbGlhcyxcbiAgICAgICAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBwYXJhbXMsXG4gICAgICAgICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICAgICAgICB9KSxcblxuICAgICAgaW5qZWN0TWF5YmU6IGFsaWFzID0+IHtcbiAgICAgICAgY2hlY2tGb3JOb25NYXliZUNhcmRpbmFsaXR5KGFsaWFzLCBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCk7XG5cbiAgICAgICAgcmV0dXJuICguLi5wYXJhbXMpID0+XG4gICAgICAgICAgZGkuaW5qZWN0TWFueSh7XG4gICAgICAgICAgICBhbGlhcyxcbiAgICAgICAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBwYXJhbXMsXG4gICAgICAgICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICAgICAgICB9KVswXTtcbiAgICAgIH0sXG5cbiAgICAgIGluamVjdFdpdGhNZXRhOlxuICAgICAgICBhbGlhcyA9PlxuICAgICAgICAoLi4ucGFyYW1zKSA9PlxuICAgICAgICAgIGRpLmluamVjdFdpdGhNZXRhKHtcbiAgICAgICAgICAgIGFsaWFzLFxuICAgICAgICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnM6IHBhcmFtcyxcbiAgICAgICAgICAgIGluamVjdGluZ0luamVjdGFibGU6IGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLFxuICAgICAgICAgIH0pLFxuXG4gICAgICBpbmplY3RNYW55V2l0aE1ldGE6XG4gICAgICAgIGFsaWFzID0+XG4gICAgICAgICguLi5wYXJhbXMpID0+XG4gICAgICAgICAgZGkuaW5qZWN0TWFueVdpdGhNZXRhKHtcbiAgICAgICAgICAgIGFsaWFzLFxuICAgICAgICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnM6IHBhcmFtcyxcbiAgICAgICAgICAgIGluamVjdGluZ0luamVjdGFibGU6IGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLFxuICAgICAgICAgIH0pLFxuXG4gICAgICBpbmplY3RNYXliZVdpdGhNZXRhOiBhbGlhcyA9PiB7XG4gICAgICAgIGNoZWNrRm9yTm9uTWF5YmVDYXJkaW5hbGl0eShhbGlhcywgaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQpO1xuXG4gICAgICAgIHJldHVybiAoLi4ucGFyYW1zKSA9PlxuICAgICAgICAgIGRpLmluamVjdE1hbnlXaXRoTWV0YSh7XG4gICAgICAgICAgICBhbGlhcyxcbiAgICAgICAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBwYXJhbXMsXG4gICAgICAgICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICAgICAgICB9KVswXTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8vIFYxIG1pbmltYWxEaTogaW5qZWN0L2luamVjdE1hbnkvZXRjIHJldHVybiBpbnN0YW5jZXMgZGlyZWN0bHkuXG4gIGNvbnN0IG1pbmltYWxJbmplY3QgPSAoYWxpYXMsIC4uLmFyZ3MpID0+XG4gICAgZGkuaW5qZWN0KHtcbiAgICAgIGFsaWFzLFxuICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnM6IGFyZ3MsXG4gICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICB9KTtcblxuICBjb25zdCBtaW5pbWFsSW5qZWN0TWFueSA9IChhbGlhcywgLi4uYXJncykgPT5cbiAgICBkaS5pbmplY3RNYW55KHtcbiAgICAgIGFsaWFzLFxuICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnM6IGFyZ3MsXG4gICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICB9KTtcblxuICBjb25zdCBtaW5pbWFsSW5qZWN0V2l0aE1ldGEgPSAoYWxpYXMsIC4uLmFyZ3MpID0+XG4gICAgZGkuaW5qZWN0V2l0aE1ldGEoe1xuICAgICAgYWxpYXMsXG4gICAgICBpbnN0YW50aWF0aW9uUGFyYW1ldGVyczogYXJncyxcbiAgICAgIGluamVjdGluZ0luamVjdGFibGU6IGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLFxuICAgIH0pO1xuXG4gIGNvbnN0IG1pbmltYWxJbmplY3RNYW55V2l0aE1ldGEgPSAoYWxpYXMsIC4uLmFyZ3MpID0+XG4gICAgZGkuaW5qZWN0TWFueVdpdGhNZXRhKHtcbiAgICAgIGFsaWFzLFxuICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnM6IGFyZ3MsXG4gICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICB9KTtcblxuICByZXR1cm4ge1xuICAgIC4uLnNoYXJlZCxcblxuICAgIGluamVjdDogbWluaW1hbEluamVjdCxcbiAgICBpbmplY3RNYW55OiBtaW5pbWFsSW5qZWN0TWFueSxcbiAgICBpbmplY3RXaXRoTWV0YTogbWluaW1hbEluamVjdFdpdGhNZXRhLFxuICAgIGluamVjdE1hbnlXaXRoTWV0YTogbWluaW1hbEluamVjdE1hbnlXaXRoTWV0YSxcblxuICAgIGluamVjdEZhY3Rvcnk6XG4gICAgICBhbGlhcyA9PlxuICAgICAgKC4uLnBhcmFtcykgPT5cbiAgICAgICAgbWluaW1hbEluamVjdChhbGlhcywgLi4ucGFyYW1zKSxcbiAgfTtcbn07XG5cbmNvbnN0IGluc3RhbnRpYXRlID0gKFxuICBkaSxcbiAgaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQsXG4gIG1pbmltYWxEaSxcbiAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnMsXG4gIGdldEFwcGxpY2FibGVEZWNvcmF0b3JzLFxuKSA9PiB7XG4gIC8vIERlY29yYXRvcnMgYWx3YXlzIGxvb2sgdXAgYWdhaW5zdCB0aGUgb3JpZ2luYWwgaW5qZWN0YWJsZSBzbyB0aGF0IGFuXG4gIC8vIGltcGVyYXRpdmUgb3ZlcnJpZGUgKGRpLm92ZXJyaWRlIC8gZGkuZWFybHlPdmVycmlkZSkgaXMgd3JhcHBlZCBieSBhbnlcbiAgLy8gZGVjb3JhdG9ycyByZWdpc3RlcmVkIGFnYWluc3QgdGhlIG9yaWdpbmFsIHRhcmdldCBcdTIwMTQgY29tcG9zaW5nIGRlY29yYXRvcnNcbiAgLy8gcmVseSBvbiB0aGlzLlxuICBjb25zdCB0YXJnZXQgPVxuICAgIGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLm92ZXJyaWRkZW5JbmplY3RhYmxlIHx8XG4gICAgaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQ7XG5cbiAgY29uc3QgZGVjb3JhdG9ycyA9IGdldEFwcGxpY2FibGVEZWNvcmF0b3JzKHtcbiAgICBkZWNvcmF0b3JUb2tlbjogaW5zdGFudGlhdGlvbkRlY29yYXRvclRva2VuLFxuICAgIHRhcmdldCxcbiAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgfSk7XG5cbiAgY29uc3QgZGVjb3JhdGVkID1cbiAgICBkZWNvcmF0b3JzLmxlbmd0aCA9PT0gMFxuICAgICAgPyBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZC5pbnN0YW50aWF0ZVxuICAgICAgOiBmbG93KC4uLmRlY29yYXRvcnMpKGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLmluc3RhbnRpYXRlKTtcblxuICAvLyBOZXctc3R5bGUgaW5qZWN0YWJsZTI6IGN1cnJpZWQgKGRpKSA9PiAoLi4ucGFyYW1zKSA9PiBpbnN0YW5jZVxuICBpZiAoaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQuYWxpYXNUeXBlID09PSBpbmplY3RhYmxlU3ltYm9sMikge1xuICAgIHJldHVybiBkZWNvcmF0ZWQobWluaW1hbERpKSguLi5pbnN0YW50aWF0aW9uUGFyYW1ldGVycyk7XG4gIH1cblxuICAvLyBPbGQtc3R5bGU6IChkaSwgLi4ucGFyYW1zKSA9PiBpbnN0YW5jZVxuICByZXR1cm4gZGVjb3JhdGVkKG1pbmltYWxEaSwgLi4uaW5zdGFudGlhdGlvblBhcmFtZXRlcnMpO1xufTtcblxuY29uc3QgZW5zdXJlSW5zdGFuY2VNYXAgPSAoaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLCBrZXkpID0+IHtcbiAgbGV0IGluc3RhbmNlTWFwID0gaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLmdldChrZXkpO1xuXG4gIGlmICghaW5zdGFuY2VNYXApIHtcbiAgICBpbnN0YW5jZU1hcCA9IG5ldyBDb21wb3NpdGVNYXAoKTtcbiAgICBpbnN0YW5jZXNCeUluamVjdGFibGVNYXAuc2V0KGtleSwgaW5zdGFuY2VNYXApO1xuICB9XG5cbiAgcmV0dXJuIGluc3RhbmNlTWFwO1xufTtcblxuY29uc3QgZ2V0SW5zdGFuY2UgPSAoXG4gIGRpLFxuICBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnMsXG4gIGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcCxcbiAgaW5qZWN0aW5nSW5qZWN0YWJsZSxcbiAgbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLFxuICBnZXROYW1lc3BhY2VkSWQsXG4gIGdldEFwcGxpY2FibGVEZWNvcmF0b3JzLFxuICBjaGVja0Zvck5vbk1heWJlQ2FyZGluYWxpdHksXG4pID0+IHtcbiAgY29uc3QgY2FjaGVLZXkgPVxuICAgIGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLm92ZXJyaWRkZW5JbmplY3RhYmxlIHx8XG4gICAgaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQ7XG5cbiAgY29uc3QgbGlmZWN5Y2xlSWQgPSBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZC5saWZlY3ljbGUuaWQ7XG5cbiAgLy8gU2luZ2xldG9uOiBmYXN0IHBhdGggaW4gcHJpdmF0ZUluamVjdEZvciBhbHJlYWR5IGNoZWNrZWQgY2FjaGUgYW5kIG1pc3NlZC5cbiAgLy8gU2tpcCByZWR1bmRhbnQgZ2V0SW5zdGFuY2VLZXkgKyBjYWNoZSBjaGVjayBcdTIwMTQgZ28gc3RyYWlnaHQgdG8gaW5zdGFudGlhdGlvbi5cbiAgaWYgKGxpZmVjeWNsZUlkID09PSAnc2luZ2xldG9uJykge1xuICAgIGlmIChpbnN0YW50aWF0aW9uUGFyYW1ldGVycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUcmllZCB0byBpbmplY3Qgc2luZ2xldG9uIFwiJHtnZXROYW1lc3BhY2VkSWQoXG4gICAgICAgICAgaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQsXG4gICAgICAgICl9XCIgZnJvbSBcIiR7Z2V0TmFtZXNwYWNlZElkKFxuICAgICAgICAgIGluamVjdGluZ0luamVjdGFibGUsXG4gICAgICAgICl9XCIsIGJ1dCBpbGxlZ2FsbHkgdG8gc2luZ2xldG9ucywgaW5zdGFudGlhdGlvblBhcmFtZXRlcnMgd2VyZSBwcm92aWRlZDogXCIke2luc3RhbnRpYXRpb25QYXJhbWV0ZXJzfVwiLmAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IG1pbmltYWxEaSA9IGNyZWF0ZU1pbmltYWxEaShcbiAgICAgIGRpLFxuICAgICAgaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQsXG4gICAgICBpbmplY3RpbmdJbmplY3RhYmxlLFxuICAgICAgbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLFxuICAgICAgY2hlY2tGb3JOb25NYXliZUNhcmRpbmFsaXR5LFxuICAgICk7XG5cbiAgICBjb25zdCBuZXdJbnN0YW5jZSA9IGluc3RhbnRpYXRlKFxuICAgICAgZGksXG4gICAgICBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICAgIG1pbmltYWxEaSxcbiAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzLFxuICAgICAgZ2V0QXBwbGljYWJsZURlY29yYXRvcnMsXG4gICAgKTtcblxuICAgIC8vIFNpbmdsZXRvbnMgc3RvcmUgdGhlIGluc3RhbmNlIGRpcmVjdGx5IGluIHRoZSBtYXAgXHUyMDE0IG5vIHBlci1pbmplY3RhYmxlXG4gICAgLy8gQ29tcG9zaXRlTWFwIHdyYXBwZXIuIFNhdmVzIH41IG9iamVjdCBhbGxvY2F0aW9ucyBwZXIgZmlyc3QtaW5qZWN0LlxuICAgIGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcC5zZXQoY2FjaGVLZXksIG5ld0luc3RhbmNlKTtcblxuICAgIHJldHVybiBuZXdJbnN0YW5jZTtcbiAgfVxuXG4gIC8vIFRyYW5zaWVudDogbmV2ZXIgY2FjaGVkIFx1MjAxNCBza2lwIGtleSByZXNvbHV0aW9uLCBjYWNoZSBjaGVjaywgYW5kIGNhY2hlIHN0b3JlLlxuICBpZiAobGlmZWN5Y2xlSWQgPT09ICd0cmFuc2llbnQnKSB7XG4gICAgY29uc3QgbWluaW1hbERpID0gY3JlYXRlTWluaW1hbERpKFxuICAgICAgZGksXG4gICAgICBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICAgIGluamVjdGluZ0luamVjdGFibGUsXG4gICAgICBuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAsXG4gICAgICBjaGVja0Zvck5vbk1heWJlQ2FyZGluYWxpdHksXG4gICAgKTtcblxuICAgIHJldHVybiBpbnN0YW50aWF0ZShcbiAgICAgIGRpLFxuICAgICAgaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQsXG4gICAgICBtaW5pbWFsRGksXG4gICAgICBpbnN0YW50aWF0aW9uUGFyYW1ldGVycyxcbiAgICAgIGdldEFwcGxpY2FibGVEZWNvcmF0b3JzLFxuICAgICk7XG4gIH1cblxuICAvLyBWMi1kZWZhdWx0ICsgbm8tYXJncyBmYXN0IHBhdGg6IGJlaGF2ZXMgbGlrZSBhIHNpbmdsZXRvbi4gU2tpcFxuICAvLyBnZXRJbnN0YW5jZUtleSArIGtleS1hcnJheSBhbGxvY2F0aW9uICsgQ29tcG9zaXRlTWFwIGFsbG9jYXRpb24uIFRoZVxuICAvLyBpbnN0YW5jZSBpcyBzdG9yZWQgZGlyZWN0bHkgdW5kZXIgY2FjaGVLZXksIG1hdGNoaW5nIHRoZSBzaW5nbGV0b25cbiAgLy8gc2hhcGUuIElmIHRoZSBzYW1lIHYyIGluamVjdGFibGUgaXMgbGF0ZXIgY2FsbGVkIHdpdGggYXJncyAocmFyZSBtaXhlZFxuICAvLyB1c2FnZSksIHRoZSBrZXllZFNpbmdsZXRvbiBwYXRoIGJlbG93IG1pZ3JhdGVzIHRoZSBleGlzdGluZyBpbnN0YW5jZVxuICAvLyBpbnRvIGEgQ29tcG9zaXRlTWFwIHVuZGVyIHNpbmdsZXRvbkNvbXBvc2l0ZUtleSBiZWZvcmUgYWRkaW5nIHRoZSBuZXdcbiAgLy8ga2V5ZWQgZW50cnkuXG4gIGlmIChcbiAgICBpbnN0YW50aWF0aW9uUGFyYW1ldGVycy5sZW5ndGggPT09IDAgJiZcbiAgICBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZC5saWZlY3ljbGUuX2lzVjJEZWZhdWx0TGlmZWN5Y2xlXG4gICkge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLmdldChjYWNoZUtleSk7XG5cbiAgICBpZiAoIWlzQ29tcG9zaXRlU3RvcmFnZShleGlzdGluZykpIHtcbiAgICAgIGNvbnN0IG1pbmltYWxEaSA9IGNyZWF0ZU1pbmltYWxEaShcbiAgICAgICAgZGksXG4gICAgICAgIGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLFxuICAgICAgICBpbmplY3RpbmdJbmplY3RhYmxlLFxuICAgICAgICBuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAsXG4gICAgICAgIGNoZWNrRm9yTm9uTWF5YmVDYXJkaW5hbGl0eSxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IG5ld0luc3RhbmNlID0gaW5zdGFudGlhdGUoXG4gICAgICAgIGRpLFxuICAgICAgICBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICAgICAgbWluaW1hbERpLFxuICAgICAgICBpbnN0YW50aWF0aW9uUGFyYW1ldGVycyxcbiAgICAgICAgZ2V0QXBwbGljYWJsZURlY29yYXRvcnMsXG4gICAgICApO1xuXG4gICAgICBpbnN0YW5jZXNCeUluamVjdGFibGVNYXAuc2V0KGNhY2hlS2V5LCBuZXdJbnN0YW5jZSk7XG4gICAgICByZXR1cm4gbmV3SW5zdGFuY2U7XG4gICAgfVxuICAgIC8vIGV4aXN0aW5nIGlzIGEgQ29tcG9zaXRlTWFwIChtaXhlZCB1c2FnZSBwYXRoKSBcdTIwMTQgZmFsbCB0aHJvdWdoLlxuICB9XG5cbiAgLy8ga2V5ZWRTaW5nbGV0b24gLyBjdXN0b20gbGlmZWN5Y2xlOiBmdWxsIGtleSByZXNvbHV0aW9uICsgY2FjaGUgY2hlY2suXG4gIGNvbnN0IG1pbmltYWxEaSA9IGNyZWF0ZU1pbmltYWxEaShcbiAgICBkaSxcbiAgICBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICBpbmplY3RpbmdJbmplY3RhYmxlLFxuICAgIG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcCxcbiAgICBjaGVja0Zvck5vbk1heWJlQ2FyZGluYWxpdHksXG4gICk7XG5cbiAgY29uc3QgaW5zdGFuY2VLZXkgPSBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZC5saWZlY3ljbGUuZ2V0SW5zdGFuY2VLZXkoXG4gICAgbWluaW1hbERpLFxuICAgIC4uLmluc3RhbnRpYXRpb25QYXJhbWV0ZXJzLFxuICApO1xuXG4gIGNvbnN0IGluc3RhbmNlQ29tcG9zaXRlS2V5ID0gaXNDb21wb3NpdGVLZXkoaW5zdGFuY2VLZXkpXG4gICAgPyBpbnN0YW5jZUtleS5rZXlzXG4gICAgOiBbaW5zdGFuY2VLZXldO1xuXG4gIGxldCBleGlzdGluZ01hcCA9IGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcC5nZXQoY2FjaGVLZXkpO1xuXG4gIC8vIE1peGVkLXVzYWdlIG1pZ3JhdGlvbjogb25seSB2Mi1kZWZhdWx0IGluamVjdGFibGVzIGNhbiBoYXZlIGFycml2ZWRcbiAgLy8gaGVyZSB3aXRoIGFuIGluc3RhbmNlIGluIHRoZSBzbG90IChmcm9tIGEgcHJpb3Igbm8tYXJncyBjYWxsKS4gRm9yXG4gIC8vIGV2ZXJ5IG90aGVyIGtleWVkU2luZ2xldG9uLCB0aGUgc2xvdCBpcyBlaXRoZXIgdW5kZWZpbmVkIG9yIGFcbiAgLy8gQ29tcG9zaXRlTWFwLCBzbyBza2lwIHRoZSBzdHJ1Y3R1cmFsIGNoZWNrLlxuICBpZiAoXG4gICAgaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQubGlmZWN5Y2xlLl9pc1YyRGVmYXVsdExpZmVjeWNsZSAmJlxuICAgIGV4aXN0aW5nTWFwICE9PSB1bmRlZmluZWQgJiZcbiAgICAhaXNDb21wb3NpdGVTdG9yYWdlKGV4aXN0aW5nTWFwKVxuICApIHtcbiAgICBjb25zdCBwcmV2aW91c0luc3RhbmNlID0gZXhpc3RpbmdNYXA7XG4gICAgZXhpc3RpbmdNYXAgPSBuZXcgQ29tcG9zaXRlTWFwKCk7XG4gICAgZXhpc3RpbmdNYXAuc2V0KHNpbmdsZXRvbkNvbXBvc2l0ZUtleSwgcHJldmlvdXNJbnN0YW5jZSk7XG4gICAgaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLnNldChjYWNoZUtleSwgZXhpc3RpbmdNYXApO1xuICB9XG5cbiAgY29uc3QgZXhpc3RpbmdJbnN0YW5jZSA9IGV4aXN0aW5nTWFwPy5nZXQoaW5zdGFuY2VDb21wb3NpdGVLZXkpO1xuXG4gIGlmIChleGlzdGluZ0luc3RhbmNlKSB7XG4gICAgcmV0dXJuIGV4aXN0aW5nSW5zdGFuY2U7XG4gIH1cblxuICBjb25zdCBuZXdJbnN0YW5jZSA9IGluc3RhbnRpYXRlKFxuICAgIGRpLFxuICAgIGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLFxuICAgIG1pbmltYWxEaSxcbiAgICBpbnN0YW50aWF0aW9uUGFyYW1ldGVycyxcbiAgICBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyxcbiAgKTtcblxuICBpZiAoaW5zdGFuY2VDb21wb3NpdGVLZXlbMF0gIT09IG5vblN0b3JlZEluc3RhbmNlS2V5KSB7XG4gICAgZW5zdXJlSW5zdGFuY2VNYXAoaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLCBjYWNoZUtleSkuc2V0KFxuICAgICAgaW5zdGFuY2VDb21wb3NpdGVLZXksXG4gICAgICBuZXdJbnN0YW5jZSxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIG5ld0luc3RhbmNlO1xufTtcbiIsICJpbXBvcnQgZmxvdyBmcm9tICcuL2Zhc3RGbG93JztcbmltcG9ydCB7IGluamVjdGlvbkRlY29yYXRvclRva2VuIH0gZnJvbSAnLi90b2tlbnMnO1xuXG5leHBvcnQgY29uc3Qgd2l0aEluamVjdGlvbkRlY29yYXRvcnNGb3IgPVxuICAoeyBkZWNvcmF0b3JDYWNoZSwgZ2V0QXBwbGljYWJsZURlY29yYXRvcnMgfSkgPT5cbiAgdG9CZURlY29yYXRlZCA9PlxuICAoeyBhbGlhcywgaW5zdGFudGlhdGlvblBhcmFtZXRlcnMsIGluamVjdGluZ0luamVjdGFibGUgfSkgPT4ge1xuICAgIC8vIFdoZW4gZGVjb3JhdG9yQ2FjaGUuaW5qZWN0aW9uIGlzIG51bGwsIGEgZGVjb3JhdG9yIHdhcyByZWdpc3RlcmVkIG9yXG4gICAgLy8gZGVyZWdpc3RlcmVkIFx1MjAxNCBpbnZhbGlkYXRlIGFsbCBwZXItYWxpYXMgY2FjaGVkIGNvbXBvc2l0aW9ucy5cbiAgICBpZiAoZGVjb3JhdG9yQ2FjaGUuaW5qZWN0aW9uID09PSBudWxsKSB7XG4gICAgICBkZWNvcmF0b3JDYWNoZS5pbmplY3Rpb24gPSB0cnVlO1xuICAgICAgZGVjb3JhdG9yQ2FjaGUuaW5qZWN0aW9uQnlBbGlhcyA9IG5ldyBNYXAoKTtcbiAgICB9XG5cbiAgICBsZXQgZGVjb3JhdGVkID0gZGVjb3JhdG9yQ2FjaGUuaW5qZWN0aW9uQnlBbGlhcy5nZXQoYWxpYXMpO1xuXG4gICAgaWYgKGRlY29yYXRlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBkZWNvcmF0b3JzID0gZ2V0QXBwbGljYWJsZURlY29yYXRvcnMoe1xuICAgICAgICBkZWNvcmF0b3JUb2tlbjogaW5qZWN0aW9uRGVjb3JhdG9yVG9rZW4sXG4gICAgICAgIHRhcmdldDogYWxpYXMsXG4gICAgICAgIGluamVjdGluZ0luamVjdGFibGUsXG4gICAgICB9KTtcblxuICAgICAgaWYgKGRlY29yYXRvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBib3VuZEluamVjdCA9ICguLi5wYXJhbXMpID0+XG4gICAgICAgICAgdG9CZURlY29yYXRlZCh7XG4gICAgICAgICAgICBhbGlhcyxcbiAgICAgICAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBwYXJhbXMsXG4gICAgICAgICAgICBpbmplY3RpbmdJbmplY3RhYmxlLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgIGRlY29yYXRlZCA9IGZsb3coLi4uZGVjb3JhdG9ycykoYm91bmRJbmplY3QpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVjb3JhdGVkID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgZGVjb3JhdG9yQ2FjaGUuaW5qZWN0aW9uQnlBbGlhcy5zZXQoYWxpYXMsIGRlY29yYXRlZCk7XG4gICAgfVxuXG4gICAgaWYgKGRlY29yYXRlZCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRvQmVEZWNvcmF0ZWQoe1xuICAgICAgICBhbGlhcyxcbiAgICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnMsXG4gICAgICAgIGluamVjdGluZ0luamVjdGFibGUsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVjb3JhdGVkKC4uLmluc3RhbnRpYXRpb25QYXJhbWV0ZXJzKTtcbiAgfTtcbiIsICJleHBvcnQgY29uc3QgcHJpdmF0ZUluamVjdE1hbnlGb3IgPVxuICAoeyBnZXRSZWxhdGVkSW5qZWN0YWJsZXMsIGdldEluamVjdCwgbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwIH0pID0+XG4gICh7IHdpdGhNZXRhIH0pID0+XG4gICh7IGFsaWFzLCBpbnN0YW50aWF0aW9uUGFyYW1ldGVycywgaW5qZWN0aW5nSW5qZWN0YWJsZSB9KSA9PiB7XG4gICAgY29uc3QgaW5qZWN0ID0gZ2V0SW5qZWN0KCk7XG5cbiAgICBjb25zdCByZWxhdGVkSW5qZWN0YWJsZXMgPSBnZXRSZWxhdGVkSW5qZWN0YWJsZXMoYWxpYXMpO1xuICAgIGNvbnN0IG4gPSByZWxhdGVkSW5qZWN0YWJsZXMubGVuZ3RoO1xuXG4gICAgaWYgKG4gPT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBuZXcgQXJyYXkobik7XG5cbiAgICAvLyBUaGUgYXJnIG9iamVjdCBpcyByZXVzZWQgYWNyb3NzIGl0ZXJhdGlvbnMgXHUyMDE0IHByaXZhdGVJbmplY3RGb3JcbiAgICAvLyBkZXN0cnVjdHVyZXMgaXQgb24gZW50cnkgYW5kIG5ldmVyIHJldGFpbnMgYSByZWZlcmVuY2UsIHNvIG11dGF0aW5nXG4gICAgLy8gLmFsaWFzIGJldHdlZW4gY2FsbHMgaXMgc2FmZS5cbiAgICBjb25zdCBhcmcgPSB7XG4gICAgICBhbGlhczogdW5kZWZpbmVkLFxuICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnMsXG4gICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBhbGlhcyxcbiAgICB9O1xuXG4gICAgaWYgKHdpdGhNZXRhKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xuICAgICAgICBjb25zdCBpbmplY3RhYmxlID0gcmVsYXRlZEluamVjdGFibGVzW2ldO1xuICAgICAgICBhcmcuYWxpYXMgPSBpbmplY3RhYmxlO1xuICAgICAgICBjb25zdCBpbnN0YW5jZSA9IGluamVjdChhcmcpO1xuICAgICAgICByZXN1bHRbaV0gPSB7XG4gICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgbWV0YTogeyBpZDogbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLmdldChpbmplY3RhYmxlKSB9LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xuICAgICAgICBhcmcuYWxpYXMgPSByZWxhdGVkSW5qZWN0YWJsZXNbaV07XG4gICAgICAgIHJlc3VsdFtpXSA9IGluamVjdChhcmcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG4iLCAiaW1wb3J0IHsgaW5qZWN0aW9uVG9rZW5TeW1ib2wgfSBmcm9tICcuL2dldEluamVjdGlvblRva2VuJztcbmltcG9ydCB7IGluamVjdGlvblRva2VuU3ltYm9sMiB9IGZyb20gJy4uL2dldEluamVjdGlvblRva2VuMi9nZXRJbmplY3Rpb25Ub2tlbjInO1xuXG5leHBvcnQgZGVmYXVsdCBtYXliZUluamVjdGlvblRva2VuID0+XG4gIG1heWJlSW5qZWN0aW9uVG9rZW4/LmFsaWFzVHlwZSA9PT0gaW5qZWN0aW9uVG9rZW5TeW1ib2wgfHxcbiAgbWF5YmVJbmplY3Rpb25Ub2tlbj8uYWxpYXNUeXBlID09PSBpbmplY3Rpb25Ub2tlblN5bWJvbDI7XG4iLCAiaW1wb3J0IGlzSW5qZWN0aW9uVG9rZW4gZnJvbSAnLi4vZ2V0SW5qZWN0aW9uVG9rZW4vaXNJbmplY3Rpb25Ub2tlbic7XG5cbmV4cG9ydCBjb25zdCBnZXROYW1lc3BhY2VkSWRGb3IgPSBpbmplY3RhYmxlQW5kUmVnaXN0cmF0aW9uQ29udGV4dCA9PiB7XG4gIHJldHVybiBhbGlhcyA9PiB7XG4gICAgY29uc3QgaWQgPSBpc0luamVjdGlvblRva2VuKGFsaWFzKSA/IGAoJHthbGlhcy5pZH0pYCA6IGFsaWFzLmlkO1xuXG4gICAgLy8gRmFzdCBwYXRoOiBjb250YWluZXItbGV2ZWwgcmVnaXN0cmF0aW9uICh0aGUgY29tbW9uIGNhc2UpLlxuICAgIC8vIENvbnRleHQgaXMgW2NvbnRhaW5lclJvb3RDb250ZXh0SXRlbV0gXHUyMDE0IHBhcmVudCBpcyB0aGUgY29udGFpbmVyIGl0c2VsZi5cbiAgICBjb25zdCByZWdpc3RyYXRpb25Db250ZXh0ID0gaW5qZWN0YWJsZUFuZFJlZ2lzdHJhdGlvbkNvbnRleHQuZ2V0KGFsaWFzKTtcblxuICAgIGlmICghcmVnaXN0cmF0aW9uQ29udGV4dCkge1xuICAgICAgcmV0dXJuIGlkO1xuICAgIH1cblxuICAgIGNvbnN0IGltbWVkaWF0ZVBhcmVudCA9IHJlZ2lzdHJhdGlvbkNvbnRleHRbcmVnaXN0cmF0aW9uQ29udGV4dC5sZW5ndGggLSAxXTtcblxuICAgIGlmIChcbiAgICAgICFpbW1lZGlhdGVQYXJlbnQgfHxcbiAgICAgIGltbWVkaWF0ZVBhcmVudC5pbmplY3RhYmxlLmFsaWFzVHlwZSA9PT0gJ2NvbnRhaW5lcidcbiAgICApIHtcbiAgICAgIHJldHVybiBpZDtcbiAgICB9XG5cbiAgICAvLyBTbG93IHBhdGg6IG5lc3RlZCByZWdpc3RyYXRpb24gXHUyMDE0IHdhbGsgdGhlIHBhcmVudCBjaGFpbi5cbiAgICBjb25zdCBpZHMgPSBbaW1tZWRpYXRlUGFyZW50LmluamVjdGFibGUuaWRdO1xuICAgIGxldCBjdXJyZW50ID0gaW1tZWRpYXRlUGFyZW50LmluamVjdGFibGU7XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgY29uc3QgcGFyZW50Q29udGV4dCA9IGluamVjdGFibGVBbmRSZWdpc3RyYXRpb25Db250ZXh0LmdldChjdXJyZW50KTtcblxuICAgICAgaWYgKCFwYXJlbnRDb250ZXh0KSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXJlbnQgPSBwYXJlbnRDb250ZXh0W3BhcmVudENvbnRleHQubGVuZ3RoIC0gMV07XG5cbiAgICAgIGlmICghcGFyZW50IHx8IHBhcmVudC5pbmplY3RhYmxlLmFsaWFzVHlwZSA9PT0gJ2NvbnRhaW5lcicpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGlkcy5wdXNoKHBhcmVudC5pbmplY3RhYmxlLmlkKTtcbiAgICAgIGN1cnJlbnQgPSBwYXJlbnQuaW5qZWN0YWJsZTtcbiAgICB9XG5cbiAgICBpZHMucmV2ZXJzZSgpO1xuICAgIGlkcy5wdXNoKGlkKTtcbiAgICByZXR1cm4gaWRzLmpvaW4oJzonKTtcbiAgfTtcbn07XG4iLCAiZXhwb3J0IGNvbnN0IGluamVjdGFibGVCdW5jaFN5bWJvbCA9ICdpbmplY3RhYmxlLWJ1bmNoJztcblxuZXhwb3J0IGRlZmF1bHQgYnVuY2ggPT5cbiAgT2JqZWN0LmFzc2lnbihidW5jaCwge1xuICAgIGFsaWFzVHlwZTogaW5qZWN0YWJsZUJ1bmNoU3ltYm9sLFxuICB9KTtcbiIsICJpbXBvcnQgeyBpbmplY3RhYmxlQnVuY2hTeW1ib2wgfSBmcm9tICcuL2dldEluamVjdGFibGVCdW5jaCc7XG5cbmV4cG9ydCBkZWZhdWx0IG1heWJlSW5qZWN0YWJsZUJ1bmNoID0+XG4gIG1heWJlSW5qZWN0YWJsZUJ1bmNoPy5hbGlhc1R5cGUgPT09IGluamVjdGFibGVCdW5jaFN5bWJvbDtcbiIsICJpbXBvcnQgeyBpbmplY3RhYmxlU3ltYm9sIH0gZnJvbSAnLi9nZXRJbmplY3RhYmxlJztcbmltcG9ydCB7IGluamVjdGFibGVTeW1ib2wyIH0gZnJvbSAnLi4vZ2V0SW5qZWN0YWJsZTIvZ2V0SW5qZWN0YWJsZTInO1xuXG5leHBvcnQgZGVmYXVsdCBtYXliZUluamVjdGFibGUgPT5cbiAgbWF5YmVJbmplY3RhYmxlPy5hbGlhc1R5cGUgPT09IGluamVjdGFibGVTeW1ib2wgfHxcbiAgbWF5YmVJbmplY3RhYmxlPy5hbGlhc1R5cGUgPT09IGluamVjdGFibGVTeW1ib2wyO1xuIiwgImltcG9ydCBpc0luamVjdGFibGVCdW5jaCBmcm9tICcuLi9nZXRJbmplY3RhYmxlQnVuY2gvaXNJbmplY3RhYmxlQnVuY2gnO1xuaW1wb3J0IGlzSW5qZWN0YWJsZSBmcm9tICcuLi9nZXRJbmplY3RhYmxlL2lzSW5qZWN0YWJsZSc7XG5cbmNvbnN0IGNvbGxlY3REZWVwQnVuY2hWYWx1ZXMgPSAoYnVuY2gsIG91dCkgPT4ge1xuICBjb25zdCB2YWx1ZXMgPSBPYmplY3QudmFsdWVzKGJ1bmNoKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHRoaW5nID0gdmFsdWVzW2ldO1xuXG4gICAgaWYgKGlzSW5qZWN0YWJsZUJ1bmNoKHRoaW5nKSkge1xuICAgICAgY29sbGVjdERlZXBCdW5jaFZhbHVlcyh0aGluZywgb3V0KTtcbiAgICB9IGVsc2UgaWYgKGlzSW5qZWN0YWJsZSh0aGluZykpIHtcbiAgICAgIG91dC5wdXNoKHRoaW5nKTtcbiAgICB9XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IGluamVjdGFibGVzID0+IHtcbiAgY29uc3QgcmVzdWx0ID0gW107XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbmplY3RhYmxlcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGluamVjdGFibGUgPSBpbmplY3RhYmxlc1tpXTtcblxuICAgIGlmIChpc0luamVjdGFibGVCdW5jaChpbmplY3RhYmxlKSkge1xuICAgICAgY29sbGVjdERlZXBCdW5jaFZhbHVlcyhpbmplY3RhYmxlLCByZXN1bHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQucHVzaChpbmplY3RhYmxlKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufTtcbiIsICIvLyBUb2tlbiBoaWVyYXJjaGllcyAoc3BlY2lmaWNUb2tlbk9mIGNoYWlucykgYXJlIGltbXV0YWJsZSBcdTIwMTQgY2FjaGUgcGVyIHRva2VuLlxuY29uc3QgdG9rZW5DaGFpbkNhY2hlID0gbmV3IFdlYWtNYXAoKTtcblxuZXhwb3J0IGNvbnN0IGdldFJlbGF0ZWRUb2tlbnMgPSB0b2tlbiA9PiB7XG4gIGlmICh0b2tlbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGVtcHR5QXJyYXk7XG4gIH1cblxuICBsZXQgY2FjaGVkID0gdG9rZW5DaGFpbkNhY2hlLmdldCh0b2tlbik7XG5cbiAgaWYgKGNhY2hlZCkge1xuICAgIHJldHVybiBjYWNoZWQ7XG4gIH1cblxuICBjb25zdCB0b2tlbnMgPSBbXTtcbiAgbGV0IGN1cnJlbnQgPSB0b2tlbjtcblxuICB3aGlsZSAoY3VycmVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdG9rZW5zLnB1c2goY3VycmVudCk7XG4gICAgY3VycmVudCA9IGN1cnJlbnQuc3BlY2lmaWNUb2tlbk9mO1xuICB9XG5cbiAgdG9rZW5DaGFpbkNhY2hlLnNldCh0b2tlbiwgdG9rZW5zKTtcblxuICByZXR1cm4gdG9rZW5zO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzUmVsYXRlZFRvVG9rZW4gPSAodG9rZW4sIGFuY2VzdG9yKSA9PiB7XG4gIGxldCBjdXJyZW50ID0gdG9rZW47XG5cbiAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICBpZiAoY3VycmVudCA9PT0gYW5jZXN0b3IpIHJldHVybiB0cnVlO1xuICAgIGN1cnJlbnQgPSBjdXJyZW50LnNwZWNpZmljVG9rZW5PZjtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn07XG5cbmNvbnN0IGVtcHR5QXJyYXkgPSBbXTtcbiIsICJpbXBvcnQgaXNJbmplY3RhYmxlIGZyb20gJy4uL2dldEluamVjdGFibGUvaXNJbmplY3RhYmxlJztcblxuLy8gQ2FjaGVkIGFycmF5IHBlciB0b2tlbiBcdTIwMTQgYXZvaWRzIHNwcmVhZGluZyBTZXQgdG8gQXJyYXkgb24gZXZlcnkgaW5qZWN0KCkgY2FsbC5cbi8vIEludmFsaWRhdGVkIGJ5IHNldHRpbmcgdG8gbnVsbCB3aGVuIHRoZSBTZXQgaXMgbXV0YXRlZCAocmVnaXN0ZXIvZGVyZWdpc3RlcikuXG5jb25zdCBhcnJheUNhY2hlID0gbmV3IFdlYWtNYXAoKTtcblxuY29uc3QgRU1QVFkgPSBPYmplY3QuZnJlZXplKFtdKTtcblxuY29uc3QgZ2V0Q2FjaGVkQXJyYXkgPSBzZXQgPT4ge1xuICBsZXQgYXJyID0gYXJyYXlDYWNoZS5nZXQoc2V0KTtcblxuICBpZiAoIWFycikge1xuICAgIGFyciA9IFsuLi5zZXRdO1xuICAgIGFycmF5Q2FjaGUuc2V0KHNldCwgYXJyKTtcbiAgfVxuXG4gIHJldHVybiBhcnI7XG59O1xuXG5leHBvcnQgY29uc3QgaW52YWxpZGF0ZVJlbGF0ZWRJbmplY3RhYmxlc0NhY2hlID0gc2V0ID0+IHtcbiAgYXJyYXlDYWNoZS5kZWxldGUoc2V0KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRSZWxhdGVkSW5qZWN0YWJsZXNGb3IgPVxuICAoeyBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4sIGluamVjdGFibGVTZXQgfSkgPT5cbiAgYWxpYXMgPT4ge1xuICAgIGlmIChpc0luamVjdGFibGUoYWxpYXMpKSB7XG4gICAgICByZXR1cm4gaW5qZWN0YWJsZVNldC5oYXMoYWxpYXMpID8gW2FsaWFzXSA6IEVNUFRZO1xuICAgIH1cblxuICAgIGNvbnN0IHNldCA9IGluamVjdGFibGVzQnlJbmplY3Rpb25Ub2tlbi5nZXQoYWxpYXMpO1xuXG4gICAgaWYgKCFzZXQgfHwgc2V0LnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybiBFTVBUWTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2V0Q2FjaGVkQXJyYXkoc2V0KTtcbiAgfTtcbiIsICJpbXBvcnQgeyBnZXROYW1lc3BhY2VkSWRGb3IgfSBmcm9tICcuL2dldE5hbWVzcGFjZWRJZEZvcic7XG5pbXBvcnQge1xuICBpbnN0YW50aWF0aW9uRGVjb3JhdG9yVG9rZW4sXG4gIHJlZ2lzdHJhdGlvbkNhbGxiYWNrVG9rZW4sXG4gIHJlZ2lzdHJhdGlvbkRlY29yYXRvclRva2VuLFxufSBmcm9tICcuL3Rva2Vucyc7XG5pbXBvcnQgdG9GbGF0SW5qZWN0YWJsZXMgZnJvbSAnLi90b0ZsYXRJbmplY3RhYmxlcyc7XG5pbXBvcnQgeyBMcnVDb21wb3NpdGVNYXAgfSBmcm9tICcuLi9jb21wb3NpdGUtbWFwL2xydS1jb21wb3NpdGUtbWFwJztcbmltcG9ydCB7IGdldFJlbGF0ZWRUb2tlbnMsIGlzUmVsYXRlZFRvVG9rZW4gfSBmcm9tICcuL2dldFJlbGF0ZWRUb2tlbnMnO1xuaW1wb3J0IHsgaW52YWxpZGF0ZVJlbGF0ZWRJbmplY3RhYmxlc0NhY2hlIH0gZnJvbSAnLi9nZXRSZWxhdGVkSW5qZWN0YWJsZXNGb3InO1xuaW1wb3J0IGZsb3cgZnJvbSAnLi9mYXN0Rmxvdyc7XG5cbmV4cG9ydCBjb25zdCByZWdpc3RlckZvciA9XG4gICh7IHJlZ2lzdGVyU2luZ2xlLCBpbmplY3RNYW55LCBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyB9KSA9PlxuICAoeyBpbmplY3RhYmxlcywgY29udGV4dCwgc291cmNlIH0pID0+IHtcbiAgICBjb25zdCBmbGF0SW5qZWN0YWJsZXMgPSB0b0ZsYXRJbmplY3RhYmxlcyhpbmplY3RhYmxlcyk7XG5cbiAgICAvLyBQaGFzZSAwOiBpbnN0YW50aWF0aW9uLWRlY29yYXRvci10YWdnZWQgaW5qZWN0YWJsZXMuIFRoZXkgcmVnaXN0ZXJcbiAgICAvLyAgIGZpcnN0IHNvIHRoYXQgYW55IHNhbWUtYmF0Y2ggb3ZlcnJpZGVzIG9mIChyZWdpc3RyYXRpb24tKWRlY29yYXRvcnNcbiAgICAvLyAgIGFyZSBhbHJlYWR5IGluIHBsYWNlIGJ5IHRoZSB0aW1lIHRob3NlIGRlY29yYXRvcnMgYXJlIGluc3RhbnRpYXRlZFxuICAgIC8vICAgaW4gcGhhc2UgMi4gVGhleSBnbyB0aHJvdWdoIHRoZSByZWdpc3RyYXRpb24tZGVjb3JhdG9yIHBpcGVsaW5lIHNvXG4gICAgLy8gICBwcm9kdWN0aW9uIGNvZGUgY2FuIG9wdCB0aGVtIG91dCB2aWEgdGFnL3RhcmdldC1rZXllZCBkZWNvcmF0b3JzLlxuICAgIC8vIFBoYXNlIDE6IHJlZ2lzdHJhdGlvbi1kZWNvcmF0b3ItdGFnZ2VkIGluamVjdGFibGVzLiBUaGV5IHJlZ2lzdGVyXG4gICAgLy8gICBkaXJlY3RseSB2aWEgcmVnaXN0ZXJTaW5nbGUgKG5vIHJlY3Vyc2l2ZSBkZWNvcmF0aW9uKSB0byBhdm9pZFxuICAgIC8vICAgYm9vdHN0cmFwIGNoYW9zLlxuICAgIC8vIFBoYXNlIDI6IHJlZ3VsYXIgaW5qZWN0YWJsZXMgcmVnaXN0ZXIgdGhyb3VnaCB0aGUgZGVjb3JhdG9yIHBpcGVsaW5lLlxuICAgIGNvbnN0IHBoYXNlMEluamVjdGFibGVzID0gW107XG4gICAgY29uc3QgcmVnaXN0ZXJlZFJlZ2lzdHJhdGlvbkRlY29yYXRvckluamVjdGFibGVzID0gW107XG4gICAgY29uc3QgcGhhc2UySW5qZWN0YWJsZXMgPSBbXTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmxhdEluamVjdGFibGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBpbmplY3RhYmxlID0gZmxhdEluamVjdGFibGVzW2ldO1xuXG4gICAgICBpZiAoXG4gICAgICAgIGlzUmVsYXRlZFRvVG9rZW4oaW5qZWN0YWJsZS5pbmplY3Rpb25Ub2tlbiwgcmVnaXN0cmF0aW9uRGVjb3JhdG9yVG9rZW4pXG4gICAgICApIHtcbiAgICAgICAgcmVnaXN0ZXJTaW5nbGUoaW5qZWN0YWJsZSwgY29udGV4dCk7XG4gICAgICAgIHJlZ2lzdGVyZWRSZWdpc3RyYXRpb25EZWNvcmF0b3JJbmplY3RhYmxlcy5wdXNoKGluamVjdGFibGUpO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgaXNSZWxhdGVkVG9Ub2tlbihpbmplY3RhYmxlLmluamVjdGlvblRva2VuLCBpbnN0YW50aWF0aW9uRGVjb3JhdG9yVG9rZW4pXG4gICAgICApIHtcbiAgICAgICAgcGhhc2UwSW5qZWN0YWJsZXMucHVzaChpbmplY3RhYmxlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBoYXNlMkluamVjdGFibGVzLnB1c2goaW5qZWN0YWJsZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGJhdGNoSW5Qcm9ncmVzcyA9IHRydWU7XG4gICAgY29uc3QgcmVnaXN0ZXJlZEluamVjdGFibGVzID0gW107XG5cbiAgICBjb25zdCBmaXJlQ2FsbGJhY2tzRm9yID0gaW5qZWN0YWJsZSA9PiB7XG4gICAgICBjb25zdCBjYWxsYmFja3MgPSBpbmplY3RNYW55KHtcbiAgICAgICAgYWxpYXM6IHJlZ2lzdHJhdGlvbkNhbGxiYWNrVG9rZW4sXG4gICAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBbXSxcbiAgICAgICAgaW5qZWN0aW5nSW5qZWN0YWJsZTogc291cmNlLFxuICAgICAgfSk7XG5cbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgY2FsbGJhY2tzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGNhbGxiYWNrc1tqXShpbmplY3RhYmxlKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgcmVnaXN0ZXJUaHJvdWdoUGlwZWxpbmUgPSBpbmplY3RhYmxlID0+IHtcbiAgICAgIGNvbnN0IGRlY29yYXRvcnMgPSBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyh7XG4gICAgICAgIGRlY29yYXRvclRva2VuOiByZWdpc3RyYXRpb25EZWNvcmF0b3JUb2tlbixcbiAgICAgICAgdGFyZ2V0OiBpbmplY3RhYmxlLFxuICAgICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBzb3VyY2UsXG4gICAgICB9KTtcblxuICAgICAgaWYgKGRlY29yYXRvcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJlZ2lzdGVyU2luZ2xlKGluamVjdGFibGUsIGNvbnRleHQpO1xuICAgICAgICByZWdpc3RlcmVkSW5qZWN0YWJsZXMucHVzaChpbmplY3RhYmxlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsZXQgd2FzUmVnaXN0ZXJlZFRoaXNJbmplY3RhYmxlID0gZmFsc2U7XG5cbiAgICAgIGNvbnN0IGJvdW5kUmVnaXN0ZXJTaW5nbGUgPSBpbmogPT4ge1xuICAgICAgICByZWdpc3RlclNpbmdsZShpbmosIGNvbnRleHQpO1xuICAgICAgICB3YXNSZWdpc3RlcmVkVGhpc0luamVjdGFibGUgPSB0cnVlO1xuXG4gICAgICAgIGlmICghYmF0Y2hJblByb2dyZXNzKSB7XG4gICAgICAgICAgZmlyZUNhbGxiYWNrc0ZvcihpbmopO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBkZWNvcmF0ZWRSZWdpc3RlciA9IGZsb3coLi4uZGVjb3JhdG9ycykoYm91bmRSZWdpc3RlclNpbmdsZSk7XG5cbiAgICAgIGRlY29yYXRlZFJlZ2lzdGVyKGluamVjdGFibGUpO1xuXG4gICAgICBpZiAod2FzUmVnaXN0ZXJlZFRoaXNJbmplY3RhYmxlKSB7XG4gICAgICAgIHJlZ2lzdGVyZWRJbmplY3RhYmxlcy5wdXNoKGluamVjdGFibGUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBwaGFzZTBJbmplY3RhYmxlcy5mb3JFYWNoKHJlZ2lzdGVyVGhyb3VnaFBpcGVsaW5lKTtcbiAgICBwaGFzZTJJbmplY3RhYmxlcy5mb3JFYWNoKHJlZ2lzdGVyVGhyb3VnaFBpcGVsaW5lKTtcblxuICAgIGJhdGNoSW5Qcm9ncmVzcyA9IGZhbHNlO1xuXG4gICAgY29uc3QgY2FsbGJhY2tzID0gaW5qZWN0TWFueSh7XG4gICAgICBhbGlhczogcmVnaXN0cmF0aW9uQ2FsbGJhY2tUb2tlbixcbiAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBbXSxcbiAgICAgIGluamVjdGluZ0luamVjdGFibGU6IHNvdXJjZSxcbiAgICB9KTtcblxuICAgIC8vIFNraXAgdGhlIHBlci1pbmplY3RhYmxlIGZvckVhY2ggbG9vcCBlbnRpcmVseSB3aGVuIG5vIHJlZ2lzdHJhdGlvblxuICAgIC8vIGNhbGxiYWNrcyBhcmUgd2lyZWQgdXAgXHUyMDE0IHRoaXMgYXZvaWRzIDMwaysgdHJpdmlhbCBmdW5jdGlvbiBjYWxsc1xuICAgIC8vIGR1cmluZyBhIDMway1pbmplY3RhYmxlIGJvb3RzdHJhcCB3aXRoIG5vIGNhbGxiYWNrcyAodGhlIHBlcmYtdGVzdFxuICAgIC8vIGNhc2UgYW5kIHRoZSBjb21tb24gY2FzZSkuXG4gICAgaWYgKGNhbGxiYWNrcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBmaXJlQmF0Y2hDYWxsYmFja3MgPSBpbmplY3RhYmxlID0+IHtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgY2FsbGJhY2tzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGNhbGxiYWNrc1tqXShpbmplY3RhYmxlKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmVnaXN0ZXJlZFJlZ2lzdHJhdGlvbkRlY29yYXRvckluamVjdGFibGVzLmZvckVhY2goZmlyZUJhdGNoQ2FsbGJhY2tzKTtcbiAgICByZWdpc3RlcmVkSW5qZWN0YWJsZXMuZm9yRWFjaChmaXJlQmF0Y2hDYWxsYmFja3MpO1xuICB9O1xuXG5leHBvcnQgY29uc3QgcmVnaXN0ZXJTaW5nbGVGb3IgPSAoe1xuICBpbmplY3RhYmxlU2V0LFxuICBpbmplY3RhYmxlSWRTZXQsXG4gIGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcCxcbiAgbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLFxuICBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4sXG4gIGluamVjdGFibGVBbmRSZWdpc3RyYXRpb25Db250ZXh0LFxuICBjaGlsZHJlbkJ5UGFyZW50TWFwLFxuICBmaXJlUHVyZ2VDYWxsYmFja3MsXG59KSA9PiB7XG4gIGNvbnN0IGdldE5hbWVzcGFjZWRJZCA9IGdldE5hbWVzcGFjZWRJZEZvcihpbmplY3RhYmxlQW5kUmVnaXN0cmF0aW9uQ29udGV4dCk7XG5cbiAgcmV0dXJuIChpbmplY3RhYmxlLCBpbmplY3Rpb25Db250ZXh0KSA9PiB7XG4gICAgY29uc3QgaW5qZWN0YWJsZUlkID0gaW5qZWN0YWJsZS5pZDtcblxuICAgIGlmICghaW5qZWN0YWJsZUlkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RyaWVkIHRvIHJlZ2lzdGVyIGluamVjdGFibGUgd2l0aG91dCBJRC4nKTtcbiAgICB9XG5cbiAgICAvLyBCdWlsZCByZXZlcnNlIGluZGV4OiBmb3IgZWFjaCBwYXJlbnQgaW4gdGhlIGNvbnRleHQsIHJlY29yZCB0aGlzIGluamVjdGFibGUgYXMgYSBjaGlsZC5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluamVjdGlvbkNvbnRleHQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHBhcmVudCA9IGluamVjdGlvbkNvbnRleHRbaV0uaW5qZWN0YWJsZTtcbiAgICAgIGxldCBjaGlsZHJlbiA9IGNoaWxkcmVuQnlQYXJlbnRNYXAuZ2V0KHBhcmVudCk7XG5cbiAgICAgIGlmICghY2hpbGRyZW4pIHtcbiAgICAgICAgY2hpbGRyZW4gPSBuZXcgU2V0KCk7XG4gICAgICAgIGNoaWxkcmVuQnlQYXJlbnRNYXAuc2V0KHBhcmVudCwgY2hpbGRyZW4pO1xuICAgICAgfVxuXG4gICAgICBjaGlsZHJlbi5hZGQoaW5qZWN0YWJsZSk7XG4gICAgfVxuXG4gICAgLy8gRmFzdCBwYXRoOiBjb250YWluZXItbGV2ZWwgcmVnaXN0cmF0aW9uICh0aGUgZG9taW5hbnQgY2FzZSkgeWllbGRzIGFcbiAgICAvLyBuYW1lc3BhY2VkIGlkIGVxdWFsIHRvIHRoZSBiYXJlIGlkIFx1MjAxNCBza2lwIHRoZSBNYXAgcm91bmR0cmlwICsgcGFyZW50XG4gICAgLy8gd2FsayBpbnNpZGUgZ2V0TmFtZXNwYWNlZElkLCBhbmQgc2tpcCByZWNvcmRpbmcgdGhlIHJlZ2lzdHJhdGlvblxuICAgIC8vIGNvbnRleHQgYWx0b2dldGhlciAoYGdldE5hbWVzcGFjZWRJZEZvcmAgYW5kIGBkZXJlZ2lzdGVyYCBib3RoIHRyZWF0XG4gICAgLy8gYSBtaXNzaW5nIGVudHJ5IGFzIFwibm8gbmVzdGVkIGNvbnRleHRcIiBhbHJlYWR5KS5cbiAgICBjb25zdCBpbW1lZGlhdGVQYXJlbnQgPVxuICAgICAgaW5qZWN0aW9uQ29udGV4dC5sZW5ndGggPiAwXG4gICAgICAgID8gaW5qZWN0aW9uQ29udGV4dFtpbmplY3Rpb25Db250ZXh0Lmxlbmd0aCAtIDFdXG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgaXNDb250YWluZXJMZXZlbCA9XG4gICAgICAhaW1tZWRpYXRlUGFyZW50IHx8IGltbWVkaWF0ZVBhcmVudC5pbmplY3RhYmxlLmFsaWFzVHlwZSA9PT0gJ2NvbnRhaW5lcic7XG5cbiAgICBpZiAoIWlzQ29udGFpbmVyTGV2ZWwpIHtcbiAgICAgIGluamVjdGFibGVBbmRSZWdpc3RyYXRpb25Db250ZXh0LnNldChpbmplY3RhYmxlLCBpbmplY3Rpb25Db250ZXh0KTtcbiAgICB9XG5cbiAgICBjb25zdCBuYW1lc3BhY2VkSWQgPSBpc0NvbnRhaW5lckxldmVsXG4gICAgICA/IGluamVjdGFibGVJZFxuICAgICAgOiBnZXROYW1lc3BhY2VkSWQoaW5qZWN0YWJsZSk7XG5cbiAgICBpZiAobmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLmhhcyhpbmplY3RhYmxlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJpZWQgdG8gcmVnaXN0ZXIgc2FtZSBpbmplY3RhYmxlIG11bHRpcGxlIHRpbWVzOiBcIiR7bmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLmdldChcbiAgICAgICAgICBpbmplY3RhYmxlLFxuICAgICAgICApfVwiYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGluamVjdGFibGVJZFNldC5oYXMobmFtZXNwYWNlZElkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJpZWQgdG8gcmVnaXN0ZXIgbXVsdGlwbGUgaW5qZWN0YWJsZXMgZm9yIElEIFwiJHtuYW1lc3BhY2VkSWR9XCJgLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCB1cHBlckJvdW5kZWRDYXJkaW5hbGl0eSA9XG4gICAgICBpbmplY3RhYmxlLmluamVjdGlvblRva2VuPy5jYXJkaW5hbGl0eSA9PT0gJ29uZScgfHxcbiAgICAgIGluamVjdGFibGUuaW5qZWN0aW9uVG9rZW4/LmNhcmRpbmFsaXR5ID09PSAnemVyby1vci1vbmUnXG4gICAgICAgID8gaW5qZWN0YWJsZS5pbmplY3Rpb25Ub2tlbi5jYXJkaW5hbGl0eVxuICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGlmICh1cHBlckJvdW5kZWRDYXJkaW5hbGl0eSkge1xuICAgICAgY29uc3QgdG9rZW4gPSBpbmplY3RhYmxlLmluamVjdGlvblRva2VuO1xuICAgICAgY29uc3QgcmVnaXN0ZXJlZCA9IGluamVjdGFibGVzQnlJbmplY3Rpb25Ub2tlbi5nZXQodG9rZW4pO1xuXG4gICAgICBpZiAocmVnaXN0ZXJlZCkge1xuICAgICAgICBmb3IgKGNvbnN0IG1lbWJlciBvZiByZWdpc3RlcmVkKSB7XG4gICAgICAgICAgLy8gRXhhY3QgcmVnaXN0cmF0aW9ucyBvbmx5OiB0aGUgaW5kZXggYWxzbyBob2xkcyBgLmZvcigpYFxuICAgICAgICAgIC8vIGRlc2NlbmRhbnRzIG9mIHRoZSB0b2tlbiwgYW5kIHNwZWNpYWxpemF0aW9uIG11c3Qgbm90IGJlXG4gICAgICAgICAgLy8gb3V0bGF3ZWQgYnkgdGhlIGJhc2UgdG9rZW4ncyBib3VuZC5cbiAgICAgICAgICBpZiAobWVtYmVyLmluamVjdGlvblRva2VuID09PSB0b2tlbikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgVHJpZWQgdG8gcmVnaXN0ZXIgaW5qZWN0YWJsZSBcIiR7bmFtZXNwYWNlZElkfVwiIHdpdGggaW5qZWN0aW9uIHRva2VuIFwiJHtcbiAgICAgICAgICAgICAgICB0b2tlbi5pZFxuICAgICAgICAgICAgICB9XCIsIGJ1dCBpdHMgY2FyZGluYWxpdHkgXCIke3VwcGVyQm91bmRlZENhcmRpbmFsaXR5fVwiIGFsbG93cyBhdCBtb3N0IG9uZSByZWdpc3RyYXRpb24gYW5kIFwiJHtuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAuZ2V0KFxuICAgICAgICAgICAgICAgIG1lbWJlcixcbiAgICAgICAgICAgICAgKX1cIiBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuYCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaW5qZWN0YWJsZUlkU2V0LmFkZChuYW1lc3BhY2VkSWQpO1xuICAgIGluamVjdGFibGVTZXQuYWRkKGluamVjdGFibGUpO1xuICAgIG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcC5zZXQoaW5qZWN0YWJsZSwgbmFtZXNwYWNlZElkKTtcbiAgICBpZiAoaW5qZWN0YWJsZS5pbmplY3Rpb25Ub2tlbj8uYWJzdHJhY3QpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRyaWVkIHRvIHJlZ2lzdGVyIGluamVjdGFibGUgXCIke25hbWVzcGFjZWRJZH1cIiB3aXRoIGluamVjdGlvbiB0b2tlbiBcIiR7aW5qZWN0YWJsZS5pbmplY3Rpb25Ub2tlbi5pZH1cIiwgYnV0IGl0IGlzIGFic3RyYWN0LiBVc2UgXCIuZm9yKHNwZWNpZmllcilcIiBmb3IgYSBjb25jcmV0ZSB0b2tlbi5gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBtYXhDYWNoZVNpemUgPVxuICAgICAgaW5qZWN0YWJsZS5tYXhDYWNoZVNpemUgPz8gaW5qZWN0YWJsZS5pbmplY3Rpb25Ub2tlbj8ubWF4Q2FjaGVTaXplO1xuXG4gICAgLy8gTFJVIGlzIG9ubHkgbWVhbmluZ2Z1bCBmb3Iga2V5ZWQgbGlmZWN5Y2xlcyBcdTIwMTQgc2luZ2xldG9ucyBob2xkIG9uZVxuICAgIC8vIGluc3RhbmNlIGFuZCB3b3VsZCBuZXZlciBvdmVyZmxvdy4gRm9yIGtleWVkIGxpZmVjeWNsZXMgd2l0aCBhIHNpemVcbiAgICAvLyBjYXAsIGFsbG9jYXRlIGVhZ2VybHkgc28gdGhlIGV2aWN0aW9uIGNhbGxiYWNrIGlzIHdpcmVkIGJlZm9yZSBhbnlcbiAgICAvLyBzdG9yZS4gRm9yIGV2ZXJ5dGhpbmcgZWxzZSwgdGhlIG1hcCBpcyBhbGxvY2F0ZWQgbGF6aWx5IG9uIGZpcnN0XG4gICAgLy8gc3RvcmUgKHNpbmdsZXRvbnMgc3RvcmUgdGhlIGluc3RhbmNlIGRpcmVjdGx5OyBrZXllZFNpbmdsZXRvbiBzdG9yZXNcbiAgICAvLyBhIENvbXBvc2l0ZU1hcCBcdTIwMTQgc2VlIHByaXZhdGVJbmplY3RGb3IuanMpLlxuICAgIGlmIChtYXhDYWNoZVNpemUgPiAwICYmIGluamVjdGFibGUubGlmZWN5Y2xlLmlkICE9PSAnc2luZ2xldG9uJykge1xuICAgICAgY29uc3QgaW5zdGFuY2VNYXAgPSBuZXcgTHJ1Q29tcG9zaXRlTWFwKG1heENhY2hlU2l6ZSwge1xuICAgICAgICBvbkV2aWN0OiAoaW5zdGFuY2UsIGtleUFycmF5KSA9PlxuICAgICAgICAgIGZpcmVQdXJnZUNhbGxiYWNrcyhpbmplY3RhYmxlLCBpbnN0YW5jZSwga2V5QXJyYXkpLFxuICAgICAgfSk7XG5cbiAgICAgIGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcC5zZXQoaW5qZWN0YWJsZSwgaW5zdGFuY2VNYXApO1xuICAgIH1cblxuICAgIGNvbnN0IHRva2VucyA9IGdldFJlbGF0ZWRUb2tlbnMoaW5qZWN0YWJsZS5pbmplY3Rpb25Ub2tlbik7XG5cbiAgICBmb3IgKGxldCB0ID0gMDsgdCA8IHRva2Vucy5sZW5ndGg7IHQrKykge1xuICAgICAgY29uc3QgdG9rZW4gPSB0b2tlbnNbdF07XG4gICAgICBsZXQgaW5qZWN0YWJsZXNTZXQgPSBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4uZ2V0KHRva2VuKTtcblxuICAgICAgaWYgKCFpbmplY3RhYmxlc1NldCkge1xuICAgICAgICBpbmplY3RhYmxlc1NldCA9IG5ldyBTZXQoKTtcbiAgICAgICAgaW5qZWN0YWJsZXNCeUluamVjdGlvblRva2VuLnNldCh0b2tlbiwgaW5qZWN0YWJsZXNTZXQpO1xuICAgICAgfVxuXG4gICAgICBpbmplY3RhYmxlc1NldC5hZGQoaW5qZWN0YWJsZSk7XG4gICAgICBpbnZhbGlkYXRlUmVsYXRlZEluamVjdGFibGVzQ2FjaGUoaW5qZWN0YWJsZXNTZXQpO1xuICAgIH1cbiAgfTtcbn07XG4iLCAiaW1wb3J0IHsgc3RvcmVkSW5zdGFuY2VLZXkgfSBmcm9tICcuL2xpZmVjeWNsZUVudW0nO1xuaW1wb3J0IHsgaXNDb21wb3NpdGVTdG9yYWdlIH0gZnJvbSAnLi9wcml2YXRlSW5qZWN0Rm9yJztcblxuY29uc3Qgc2luZ2xldG9uS2V5QXJyYXkgPSBbc3RvcmVkSW5zdGFuY2VLZXldO1xuXG5jb25zdCBrZXlBcnJheVN0YXJ0c1dpdGggPSAoa2V5QXJyYXksIHByZWZpeCkgPT4ge1xuICBpZiAocHJlZml4Lmxlbmd0aCA+IGtleUFycmF5Lmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHByZWZpeC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChrZXlBcnJheVtpXSAhPT0gcHJlZml4W2ldKSByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5jb25zdCBldmljdCA9IChpbnN0YW5jZXNCeUluamVjdGFibGVNYXAsIGluamVjdGFibGVzSW5TY29wZSwga2V5UGFydHMpID0+IHtcbiAgZm9yIChjb25zdCBpbmplY3RhYmxlIG9mIGluamVjdGFibGVzSW5TY29wZSkge1xuICAgIGNvbnN0IHN0b3JlZCA9IGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcC5nZXQoaW5qZWN0YWJsZSk7XG4gICAgaWYgKHN0b3JlZCA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcblxuICAgIGlmICghaXNDb21wb3NpdGVTdG9yYWdlKHN0b3JlZCkpIHtcbiAgICAgIGlmIChcbiAgICAgICAga2V5UGFydHMubGVuZ3RoID09PSAwIHx8XG4gICAgICAgIGtleUFycmF5U3RhcnRzV2l0aChzaW5nbGV0b25LZXlBcnJheSwga2V5UGFydHMpXG4gICAgICApIHtcbiAgICAgICAgaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLmRlbGV0ZShpbmplY3RhYmxlKTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChrZXlQYXJ0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHN0b3JlZC5jbGVhcigpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdG9yZWQuZGVsZXRlQnlQcmVmaXgoa2V5UGFydHMpO1xuICAgIH1cbiAgfVxufTtcblxuLy8gUHVyZ2VzIHRoZSBzdG9yZWQgaW5zdGFuY2VzIG9mIGEgZ2l2ZW4gc2V0IG9mIGluamVjdGFibGVzLiBTaGFyZWQgYnkgdGhlXG4vLyBjb250YWluZXItd2lkZSBwdXJnZSBhbmQgdGhlIHNjb3BlLXJlc3RyaWN0ZWQgb25lLCBzbyB0aGF0IGJvdGggZmlyZVxuLy8gaW5zdGFuY2UtcHVyZ2UgY2FsbGJhY2tzIHRoZSBzYW1lIHdheS5cbmV4cG9ydCBjb25zdCBwdXJnZVN0b3JlZEluc3RhbmNlc0ZvciA9XG4gICh7XG4gICAgaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLFxuICAgIGZpcmVQdXJnZUNhbGxiYWNrcyxcbiAgICBhbnlQdXJnZUNhbGxiYWNrc1JlZ2lzdGVyZWQsXG4gIH0pID0+XG4gIChpbmplY3RhYmxlc0luU2NvcGUsIGtleVBhcnRzKSA9PiB7XG4gICAgLy8gTm90aGluZyBjYW4gb2JzZXJ2ZSB0aGlzIHB1cmdlLCBzbyBza2lwIGdhdGhlcmluZyB0aGUgc25hcHNob3QgYW5kIGdvXG4gICAgLy8gc3RyYWlnaHQgdG8gZXZpY3Rpb24gXHUyMDE0IHRoZSBzYW1lIHJ1bGUgdGhlIGluamVjdCB3aXJpbmcgZm9sbG93cywgd2hlcmUgYVxuICAgIC8vIGNvbnRhaW5lciB3aXRoIG5vIGRlY29yYXRvcnMgcGF5cyBmb3Igbm9uZS5cbiAgICBpZiAoIWFueVB1cmdlQ2FsbGJhY2tzUmVnaXN0ZXJlZCgpKSB7XG4gICAgICBldmljdChpbnN0YW5jZXNCeUluamVjdGFibGVNYXAsIGluamVjdGFibGVzSW5TY29wZSwga2V5UGFydHMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFBoYXNlIDEgXHUyMDE0IEdhdGhlciBzbmFwc2hvdCB0dXBsZXMgd2l0aG91dCBtdXRhdGluZyBjYWNoZXMuIFRoZSBzdG9yZWRcbiAgICAvLyB2YWx1ZSBpcyBkaXNwYXRjaGVkIHN0cnVjdHVyYWxseTogYSBDb21wb3NpdGVNYXAtc2hhcGUgc3RvcmVzIGtleWVkXG4gICAgLy8gZW50cmllczsgYW55dGhpbmcgZWxzZSBpcyBhIGRpcmVjdGx5LXN0b3JlZCBpbnN0YW5jZSAoc2luZ2xldG9uIG9yXG4gICAgLy8gdjItZGVmYXVsdC1uby1hcmdzKS5cbiAgICBjb25zdCB0dXBsZXMgPSBbXTtcblxuICAgIGZvciAoY29uc3QgaW5qZWN0YWJsZSBvZiBpbmplY3RhYmxlc0luU2NvcGUpIHtcbiAgICAgIGNvbnN0IHN0b3JlZCA9IGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcC5nZXQoaW5qZWN0YWJsZSk7XG4gICAgICBpZiAoc3RvcmVkID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgICBpZiAoIWlzQ29tcG9zaXRlU3RvcmFnZShzdG9yZWQpKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBrZXlQYXJ0cy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgIWtleUFycmF5U3RhcnRzV2l0aChzaW5nbGV0b25LZXlBcnJheSwga2V5UGFydHMpXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHR1cGxlcy5wdXNoKHtcbiAgICAgICAgICBpbmplY3RhYmxlLFxuICAgICAgICAgIGluc3RhbmNlOiBzdG9yZWQsXG4gICAgICAgICAga2V5QXJyYXk6IHNpbmdsZXRvbktleUFycmF5LFxuICAgICAgICB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgW2tleUFycmF5LCBpbnN0YW5jZV0gb2Ygc3RvcmVkLmVudHJpZXMoKSkge1xuICAgICAgICBpZiAoa2V5UGFydHMubGVuZ3RoID4gMCAmJiAha2V5QXJyYXlTdGFydHNXaXRoKGtleUFycmF5LCBrZXlQYXJ0cykpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0dXBsZXMucHVzaCh7IGluamVjdGFibGUsIGluc3RhbmNlLCBrZXlBcnJheSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBQaGFzZSAyIFx1MjAxNCBGaXJlIGNhbGxiYWNrcy4gQ2FjaGVzIHN0YXkgcG9wdWxhdGVkIHNvIHBlZXItY29vcmRpbmF0aW9uXG4gICAgLy8gaW5zaWRlIGEgY2FsbGJhY2sgd29ya3MgKGBkaS5pbmplY3QocGVlcilgIHJldHVybnMgdGhlIGNhY2hlZCBpbnN0YW5jZSkuXG4gICAgZm9yIChjb25zdCB7IGluamVjdGFibGUsIGluc3RhbmNlLCBrZXlBcnJheSB9IG9mIHR1cGxlcykge1xuICAgICAgZmlyZVB1cmdlQ2FsbGJhY2tzKGluamVjdGFibGUsIGluc3RhbmNlLCBrZXlBcnJheSk7XG4gICAgfVxuXG4gICAgLy8gUGhhc2UgMyBcdTIwMTQgRXZpY3QuIFN3ZWVwcyBib3RoIHRoZSBvcmlnaW5hbCBzbmFwc2hvdCBlbnRyaWVzIGFuZCBhbnl0aGluZ1xuICAgIC8vIHJlLXBvcHVsYXRlZCBieSBwaGFzZSAyIGNhbGxiYWNrcy4gQ2FsbGJhY2tzIGRvIE5PVCByZS1maXJlIGhlcmUuXG4gICAgZXZpY3QoaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLCBpbmplY3RhYmxlc0luU2NvcGUsIGtleVBhcnRzKTtcbiAgfTtcblxuZXhwb3J0IGNvbnN0IHB1cmdlSW5zdGFuY2VzRm9yID0gKHtcbiAgZ2V0UmVsYXRlZEluamVjdGFibGVzLFxuICBpbnN0YW5jZXNCeUluamVjdGFibGVNYXAsXG4gIGZpcmVQdXJnZUNhbGxiYWNrcyxcbiAgYW55UHVyZ2VDYWxsYmFja3NSZWdpc3RlcmVkLFxufSkgPT4ge1xuICBjb25zdCBwdXJnZVN0b3JlZEluc3RhbmNlcyA9IHB1cmdlU3RvcmVkSW5zdGFuY2VzRm9yKHtcbiAgICBpbnN0YW5jZXNCeUluamVjdGFibGVNYXAsXG4gICAgZmlyZVB1cmdlQ2FsbGJhY2tzLFxuICAgIGFueVB1cmdlQ2FsbGJhY2tzUmVnaXN0ZXJlZCxcbiAgfSk7XG5cbiAgcmV0dXJuIChhbGlhcywgLi4ua2V5UGFydHMpID0+XG4gICAgcHVyZ2VTdG9yZWRJbnN0YW5jZXMoXG4gICAgICBhbGlhcyA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gWy4uLmluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcC5rZXlzKCldXG4gICAgICAgIDogZ2V0UmVsYXRlZEluamVjdGFibGVzKGFsaWFzKSxcbiAgICAgIGtleVBhcnRzLFxuICAgICk7XG59O1xuIiwgImltcG9ydCB7XG4gIGRlcmVnaXN0cmF0aW9uQ2FsbGJhY2tUb2tlbixcbiAgZGVyZWdpc3RyYXRpb25EZWNvcmF0b3JUb2tlbixcbiAgaW5qZWN0aW9uRGVjb3JhdG9yVG9rZW4sXG4gIHByZUluamVjdENhbGxiYWNrVG9rZW4sXG59IGZyb20gJy4vdG9rZW5zJztcbmltcG9ydCB0b0ZsYXRJbmplY3RhYmxlcyBmcm9tICcuL3RvRmxhdEluamVjdGFibGVzJztcbmltcG9ydCBpc0luamVjdGlvblRva2VuIGZyb20gJy4uL2dldEluamVjdGlvblRva2VuL2lzSW5qZWN0aW9uVG9rZW4nO1xuaW1wb3J0IHsgZ2V0UmVsYXRlZFRva2VucywgaXNSZWxhdGVkVG9Ub2tlbiB9IGZyb20gJy4vZ2V0UmVsYXRlZFRva2Vucyc7XG5pbXBvcnQgeyBpbnZhbGlkYXRlUmVsYXRlZEluamVjdGFibGVzQ2FjaGUgfSBmcm9tICcuL2dldFJlbGF0ZWRJbmplY3RhYmxlc0Zvcic7XG5pbXBvcnQgZmxvdyBmcm9tICcuL2Zhc3RGbG93JztcblxuZXhwb3J0IGNvbnN0IGRlcmVnaXN0ZXJGb3IgPVxuICAoe1xuICAgIGluamVjdE1hbnksXG4gICAgZ2V0QXBwbGljYWJsZURlY29yYXRvcnMsXG4gICAgaW5qZWN0YWJsZVNldCxcbiAgICBpbmplY3RhYmxlQW5kUmVnaXN0cmF0aW9uQ29udGV4dCxcbiAgICBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4sXG4gICAgb3ZlcnJpZGluZ0luamVjdGFibGVzLFxuICAgIHB1cmdlSW5zdGFuY2VzLFxuICAgIGluamVjdGFibGVJZFNldCxcbiAgICBuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAsXG4gICAgY2hpbGRyZW5CeVBhcmVudE1hcCxcbiAgICAvLyBUb2RvOiBnZXQgcmlkIG9mIGZ1bmN0aW9uIHVzYWdlLlxuICAgIGdldERpLFxuICAgIGRlY29yYXRvckNhY2hlLFxuICAgIHN5bmNJbmplY3RXaXJpbmcsXG4gIH0pID0+XG4gICh7IGluamVjdGFibGVzLCBjb250ZXh0LCBzb3VyY2UgfSkgPT4ge1xuICAgIC8vIENvbGxlY3QgY2FsbGJhY2tzIGZpcnN0ICh3aGlsZSBhbGwgaW5qZWN0YWJsZXMgYXJlIHN0aWxsIHJlZ2lzdGVyZWQpXG4gICAgY29uc3QgY2FsbGJhY2tzID0gaW5qZWN0TWFueSh7XG4gICAgICBhbGlhczogZGVyZWdpc3RyYXRpb25DYWxsYmFja1Rva2VuLFxuICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnM6IFtdLFxuICAgICAgaW5qZWN0aW5nSW5qZWN0YWJsZTogc291cmNlLFxuICAgIH0pO1xuXG4gICAgY29uc3QgZmxhdEluamVjdGFibGVzID0gdG9GbGF0SW5qZWN0YWJsZXMoaW5qZWN0YWJsZXMpO1xuXG4gICAgLy8gRmlyZSBjYWxsYmFja3MgZm9yIGFsbCBpbmplY3RhYmxlcyBiZWluZyBkZXJlZ2lzdGVyZWQgKG9yaWdpbmFsIGJhdGNoIHNlbWFudGljcylcbiAgICBmbGF0SW5qZWN0YWJsZXMuZm9yRWFjaChpbmplY3RhYmxlID0+IHtcbiAgICAgIGNhbGxiYWNrcy5mb3JFYWNoKGNhbGxiYWNrID0+IHtcbiAgICAgICAgY2FsbGJhY2soaW5qZWN0YWJsZSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGRpID0gZ2V0RGkoKTtcblxuICAgIGNvbnN0IGRlcmVnaXN0ZXJTaW5nbGUgPSBkZXJlZ2lzdGVyU2luZ2xlRm9yKHtcbiAgICAgIGluamVjdGFibGVTZXQsXG4gICAgICBpbmplY3RhYmxlQW5kUmVnaXN0cmF0aW9uQ29udGV4dCxcbiAgICAgIGluamVjdGFibGVzQnlJbmplY3Rpb25Ub2tlbixcbiAgICAgIG92ZXJyaWRpbmdJbmplY3RhYmxlcyxcbiAgICAgIHB1cmdlSW5zdGFuY2VzLFxuICAgICAgaW5qZWN0YWJsZUlkU2V0LFxuICAgICAgbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLFxuICAgICAgY2hpbGRyZW5CeVBhcmVudE1hcCxcbiAgICAgIGRpLFxuICAgIH0pO1xuXG4gICAgbGV0IGluamVjdFdpcmluZ0NoYW5nZWQgPSBmYWxzZTtcblxuICAgIGZsYXRJbmplY3RhYmxlcy5mb3JFYWNoKGluamVjdGFibGUgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICBpc1JlbGF0ZWRUb1Rva2VuKGluamVjdGFibGUuaW5qZWN0aW9uVG9rZW4sIGluamVjdGlvbkRlY29yYXRvclRva2VuKVxuICAgICAgKSB7XG4gICAgICAgIGRlY29yYXRvckNhY2hlLmluamVjdGlvbiA9IG51bGw7XG4gICAgICAgIGluamVjdFdpcmluZ0NoYW5nZWQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNSZWxhdGVkVG9Ub2tlbihpbmplY3RhYmxlLmluamVjdGlvblRva2VuLCBwcmVJbmplY3RDYWxsYmFja1Rva2VuKSkge1xuICAgICAgICBkZWNvcmF0b3JDYWNoZS5wcmVJbmplY3QgPSBudWxsO1xuICAgICAgICBpbmplY3RXaXJpbmdDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGVjb3JhdG9ycyA9IGdldEFwcGxpY2FibGVEZWNvcmF0b3JzKHtcbiAgICAgICAgZGVjb3JhdG9yVG9rZW46IGRlcmVnaXN0cmF0aW9uRGVjb3JhdG9yVG9rZW4sXG4gICAgICAgIHRhcmdldDogaW5qZWN0YWJsZSxcbiAgICAgICAgaW5qZWN0aW5nSW5qZWN0YWJsZTogc291cmNlLFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChkZWNvcmF0b3JzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBkZXJlZ2lzdGVyU2luZ2xlKGluamVjdGFibGUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRlY29yYXRlZERlcmVnaXN0ZXIgPSBmbG93KC4uLmRlY29yYXRvcnMpKGRlcmVnaXN0ZXJTaW5nbGUpO1xuXG4gICAgICBkZWNvcmF0ZWREZXJlZ2lzdGVyKGluamVjdGFibGUpO1xuICAgIH0pO1xuXG4gICAgLy8gUmVjb21wdXRlZCBmcm9tIHRoZSByZWdpc3RyYXRpb24gaW5kZXggYWZ0ZXIgdGhlIHJlbW92YWxzLCBzbyBhXG4gICAgLy8gZGVyZWdpc3RyYXRpb24gZGVjb3JhdG9yIHRoYXQgcHJldmVudGVkIHRoZSByZW1vdmFsIGlzIGhhbmRsZWQgdG9vLlxuICAgIGlmIChpbmplY3RXaXJpbmdDaGFuZ2VkKSB7XG4gICAgICBzeW5jSW5qZWN0V2lyaW5nKCk7XG4gICAgfVxuICB9O1xuXG5leHBvcnQgY29uc3QgZGVyZWdpc3RlclNpbmdsZUZvciA9XG4gICh7XG4gICAgaW5qZWN0YWJsZVNldCxcbiAgICBpbmplY3RhYmxlQW5kUmVnaXN0cmF0aW9uQ29udGV4dCxcbiAgICBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4sXG4gICAgb3ZlcnJpZGluZ0luamVjdGFibGVzLFxuICAgIHB1cmdlSW5zdGFuY2VzLFxuICAgIGluamVjdGFibGVJZFNldCxcbiAgICBuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAsXG4gICAgY2hpbGRyZW5CeVBhcmVudE1hcCxcbiAgICBkaSxcbiAgfSkgPT5cbiAgaW5qZWN0YWJsZSA9PiB7XG4gICAgaWYgKGlzSW5qZWN0aW9uVG9rZW4oaW5qZWN0YWJsZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRyaWVkIHRvIGRlcmVnaXN0ZXIgdXNpbmcgaW5qZWN0aW9uIHRva2VuIFwiJHtpbmplY3RhYmxlLmlkfVwiLCBidXQgZGVyZWdpc3RyYXRpb24gdXNpbmcgdG9rZW4gaXMgaWxsZWdhbC5gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIWluamVjdGFibGVTZXQuaGFzKGluamVjdGFibGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUcmllZCB0byBkZXJlZ2lzdGVyIG5vbi1yZWdpc3RlcmVkIGluamVjdGFibGUgXCIke2luamVjdGFibGUuaWR9XCIuYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQ2FzY2FkZSBkZXJlZ2lzdGVyIGNoaWxkcmVuIHVzaW5nIHRoZSByZXZlcnNlIGluZGV4IChPKDEpIGxvb2t1cCkuXG4gICAgY29uc3QgY2hpbGRyZW4gPSBjaGlsZHJlbkJ5UGFyZW50TWFwLmdldChpbmplY3RhYmxlKTtcblxuICAgIGlmIChjaGlsZHJlbikge1xuICAgICAgY2hpbGRyZW4uZm9yRWFjaChjaGlsZCA9PiB7XG4gICAgICAgIGluamVjdGFibGVBbmRSZWdpc3RyYXRpb25Db250ZXh0LmRlbGV0ZShjaGlsZCk7XG5cbiAgICAgICAgaWYgKGluamVjdGFibGVTZXQuaGFzKGNoaWxkKSkge1xuICAgICAgICAgIGRpLmRlcmVnaXN0ZXIoe1xuICAgICAgICAgICAgaW5qZWN0YWJsZXM6IFtjaGlsZF0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjaGlsZHJlbkJ5UGFyZW50TWFwLmRlbGV0ZShpbmplY3RhYmxlKTtcbiAgICB9XG5cbiAgICBwdXJnZUluc3RhbmNlcyhpbmplY3RhYmxlKTtcbiAgICBpbmplY3RhYmxlQW5kUmVnaXN0cmF0aW9uQ29udGV4dC5kZWxldGUoaW5qZWN0YWJsZSk7XG4gICAgY29uc3QgbmFtZXNwYWNlZElkID0gbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLmdldChpbmplY3RhYmxlKTtcbiAgICBpbmplY3RhYmxlSWRTZXQuZGVsZXRlKG5hbWVzcGFjZWRJZCk7XG4gICAgaW5qZWN0YWJsZVNldC5kZWxldGUoaW5qZWN0YWJsZSk7XG4gICAgbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLmRlbGV0ZShpbmplY3RhYmxlKTtcblxuICAgIGNvbnN0IHRva2VucyA9IGdldFJlbGF0ZWRUb2tlbnMoaW5qZWN0YWJsZS5pbmplY3Rpb25Ub2tlbik7XG5cbiAgICB0b2tlbnMuZm9yRWFjaCh0b2tlbiA9PiB7XG4gICAgICBjb25zdCB0b2tlblNldCA9IGluamVjdGFibGVzQnlJbmplY3Rpb25Ub2tlbi5nZXQodG9rZW4pO1xuICAgICAgdG9rZW5TZXQuZGVsZXRlKGluamVjdGFibGUpO1xuICAgICAgaW52YWxpZGF0ZVJlbGF0ZWRJbmplY3RhYmxlc0NhY2hlKHRva2VuU2V0KTtcbiAgICB9KTtcblxuICAgIG92ZXJyaWRpbmdJbmplY3RhYmxlcy5kZWxldGUoaW5qZWN0YWJsZSk7XG4gIH07XG4iLCAiZXhwb3J0IGNvbnN0IG92ZXJyaWRlRm9yID1cbiAgKHsgZ2V0UmVsYXRlZEluamVjdGFibGVzLCBlYXJseU92ZXJyaWRlIH0pID0+XG4gIChhbGlhcywgaW5zdGFudGlhdGVTdHViKSA9PiB7XG4gICAgY29uc3QgcmVsYXRlZEluamVjdGFibGVzID0gZ2V0UmVsYXRlZEluamVjdGFibGVzKGFsaWFzKTtcblxuICAgIGlmIChyZWxhdGVkSW5qZWN0YWJsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBpZiAoYWxpYXMuYWxpYXNUeXBlID09PSAnaW5qZWN0aW9uLXRva2VuJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFRyaWVkIHRvIG92ZXJyaWRlIHNpbmdsZSBpbXBsZW1lbnRhdGlvbiBvZiBpbmplY3Rpb24gdG9rZW4gXCIke2FsaWFzLmlkfVwiLCBidXQgZm91bmQgbm8gcmVnaXN0ZXJlZCBpbXBsZW1lbnRhdGlvbnMuYCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJpZWQgdG8gb3ZlcnJpZGUgXCIke2FsaWFzLmlkfVwiIHdoaWNoIGlzIG5vdCByZWdpc3RlcmVkLmAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGVhcmx5T3ZlcnJpZGUoYWxpYXMsIGluc3RhbnRpYXRlU3R1Yik7XG4gIH07XG5cbmV4cG9ydCBjb25zdCB1bm92ZXJyaWRlRm9yID1cbiAgKHsgb3ZlcnJpZGluZ0luamVjdGFibGVzLCBnZXRSZWxhdGVkSW5qZWN0YWJsZXMsIGdldE5hbWVzcGFjZWRJZCB9KSA9PlxuICBhbGlhcyA9PiB7XG4gICAgY29uc3QgW2luamVjdGFibGVdID0gZ2V0UmVsYXRlZEluamVjdGFibGVzKGFsaWFzKTtcblxuICAgIGlmICghaW5qZWN0YWJsZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJpZWQgdG8gdW5vdmVycmlkZSBcIiR7YWxpYXMuaWR9XCIsIGJ1dCBpdCB3YXMgbm90IHJlZ2lzdGVyZWQuYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFvdmVycmlkaW5nSW5qZWN0YWJsZXMuaGFzKGluamVjdGFibGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUcmllZCB0byB1bm92ZXJyaWRlIFwiJHtnZXROYW1lc3BhY2VkSWQoXG4gICAgICAgICAgaW5qZWN0YWJsZSxcbiAgICAgICAgKX1cIiwgYnV0IGl0IHdhcyBub3Qgb3ZlcnJpZGRlbi5gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBvdmVycmlkaW5nSW5qZWN0YWJsZXMuZGVsZXRlKGluamVjdGFibGUpO1xuICB9O1xuIiwgImV4cG9ydCBjb25zdCBjaGVja0Zvck5vTWF0Y2hlc0ZvciA9XG4gICh7IGdldE5hbWVzcGFjZWRJZCB9KSA9PlxuICAocmVsYXRlZEluamVjdGFibGVzLCBhbGlhcywgaW5qZWN0aW5nSW5qZWN0YWJsZSkgPT4ge1xuICAgIGlmIChyZWxhdGVkSW5qZWN0YWJsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUcmllZCB0byBpbmplY3Qgbm9uLXJlZ2lzdGVyZWQgaW5qZWN0YWJsZSBcIiR7XG4gICAgICAgICAgYWxpYXMuaWRcbiAgICAgICAgfVwiIGZyb20gXCIke2dldE5hbWVzcGFjZWRJZChpbmplY3RpbmdJbmplY3RhYmxlKX1cIi5gLFxuICAgICAgKTtcbiAgICB9XG4gIH07XG4iLCAiZXhwb3J0IGNvbnN0IGNoZWNrRm9yVG9vTWFueU1hdGNoZXNGb3IgPVxuICAoeyBnZXROYW1lc3BhY2VkSWQgfSkgPT5cbiAgKHJlbGF0ZWRJbmplY3RhYmxlcywgYWxpYXMsIGluamVjdGluZ0luamVjdGFibGUpID0+IHtcbiAgICBpZiAocmVsYXRlZEluamVjdGFibGVzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRyaWVkIHRvIGluamVjdCBzaW5nbGUgaW5qZWN0YWJsZSBmb3IgaW5qZWN0aW9uIHRva2VuIFwiJHtcbiAgICAgICAgICBhbGlhcy5pZFxuICAgICAgICB9XCIgZnJvbSBcIiR7Z2V0TmFtZXNwYWNlZElkKFxuICAgICAgICAgIGluamVjdGluZ0luamVjdGFibGUsXG4gICAgICAgICl9XCIgYnV0IGZvdW5kIG11bHRpcGxlIGluamVjdGFibGVzOiBcIiR7cmVsYXRlZEluamVjdGFibGVzXG4gICAgICAgICAgLm1hcChnZXROYW1lc3BhY2VkSWQpXG4gICAgICAgICAgLmpvaW4oJ1wiLCBcIicpfVwiYCxcbiAgICAgICk7XG4gICAgfVxuICB9O1xuIiwgImV4cG9ydCBjb25zdCBjaGVja0ZvclNpZGVFZmZlY3RzRm9yID1cbiAgKHsgZ2V0U2lkZUVmZmVjdHNBcmVQcmV2ZW50ZWQsIGdldE5hbWVzcGFjZWRJZCB9KSA9PlxuICAoaW5qZWN0YWJsZSwgaW5qZWN0aW5nSW5qZWN0YWJsZSkgPT4ge1xuICAgIGlmIChnZXRTaWRlRWZmZWN0c0FyZVByZXZlbnRlZChpbmplY3RhYmxlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJpZWQgdG8gaW5qZWN0IFwiJHtnZXROYW1lc3BhY2VkSWQoXG4gICAgICAgICAgaW5qZWN0YWJsZSxcbiAgICAgICAgKX1cIiBmcm9tIFwiJHtnZXROYW1lc3BhY2VkSWQoXG4gICAgICAgICAgaW5qZWN0aW5nSW5qZWN0YWJsZSxcbiAgICAgICAgKX1cIiB3aGVuIHNpZGUtZWZmZWN0cyBhcmUgcHJldmVudGVkLmAsXG4gICAgICApO1xuICAgIH1cbiAgfTtcbiIsICJleHBvcnQgY29uc3QgY2hlY2tGb3JBYnN0cmFjdFRva2VuRm9yID1cbiAgKHsgZ2V0TmFtZXNwYWNlZElkIH0pID0+XG4gIChhbGlhcywgaW5qZWN0aW5nSW5qZWN0YWJsZSkgPT4ge1xuICAgIGlmIChhbGlhcy5hYnN0cmFjdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJpZWQgdG8gaW5qZWN0IGluamVjdGlvbiB0b2tlbiBcIiR7YWxpYXMuaWR9XCIgZnJvbSBcIiR7Z2V0TmFtZXNwYWNlZElkKFxuICAgICAgICAgIGluamVjdGluZ0luamVjdGFibGUsXG4gICAgICAgICl9XCIsIGJ1dCBpdCBpcyBhYnN0cmFjdC4gVXNlIFwiLmZvcihzcGVjaWZpZXIpXCIgZm9yIGEgY29uY3JldGUgdG9rZW4uYCxcbiAgICAgICk7XG4gICAgfVxuICB9O1xuIiwgImV4cG9ydCBjb25zdCBjaGVja0Zvck5vbk1heWJlQ2FyZGluYWxpdHlGb3IgPVxuICAoeyBnZXROYW1lc3BhY2VkSWQgfSkgPT5cbiAgKGFsaWFzLCBpbmplY3RpbmdJbmplY3RhYmxlKSA9PiB7XG4gICAgaWYgKGFsaWFzLmNhcmRpbmFsaXR5ICE9PSAnemVyby1vci1vbmUnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUcmllZCB0byBpbmplY3RNYXliZSBcIiR7YWxpYXMuaWR9XCIgZnJvbSBcIiR7Z2V0TmFtZXNwYWNlZElkKFxuICAgICAgICAgIGluamVjdGluZ0luamVjdGFibGUsXG4gICAgICAgICl9XCIsIGJ1dCBpdHMgY2FyZGluYWxpdHkgaXMgXCIke1xuICAgICAgICAgIGFsaWFzLmNhcmRpbmFsaXR5XG4gICAgICAgIH1cIiBpbnN0ZWFkIG9mIFwiemVyby1vci1vbmVcIi5gLFxuICAgICAgKTtcbiAgICB9XG4gIH07XG4iLCAiaW1wb3J0IGlzSW5qZWN0YWJsZSBmcm9tICcuLi9nZXRJbmplY3RhYmxlL2lzSW5qZWN0YWJsZSc7XG5pbXBvcnQgeyBpbmplY3RhYmxlU3ltYm9sMiB9IGZyb20gJy4uL2dldEluamVjdGFibGUyL2dldEluamVjdGFibGUyJztcblxuLy8gRGVjbGFyZWQgc2V0cyBhcmUgZGVyaXZlZCBvbmNlIHBlciBpbmplY3RhYmxlOiBhIGBjb25zdW1wdGlvbnNgIGFycmF5IGlzXG4vLyBmaXhlZCBhdCBjcmVhdGlvbiwgYW5kIGluamVjdGFibGUgaWRlbnRpdHkgb3V0bGl2ZXMgYW55IHNpbmdsZSBjb250YWluZXIuXG5jb25zdCBkZWNsYXJlZFNldHNCeUluamVjdGFibGUgPSBuZXcgV2Vha01hcCgpO1xuXG5jb25zdCBnZXREZWNsYXJlZFNldCA9IGluamVjdGFibGUgPT4ge1xuICBsZXQgZGVjbGFyZWQgPSBkZWNsYXJlZFNldHNCeUluamVjdGFibGUuZ2V0KGluamVjdGFibGUpO1xuXG4gIGlmICghZGVjbGFyZWQpIHtcbiAgICBkZWNsYXJlZCA9IG5ldyBTZXQoaW5qZWN0YWJsZS5jb25zdW1wdGlvbnMgPz8gW10pO1xuICAgIGRlY2xhcmVkU2V0c0J5SW5qZWN0YWJsZS5zZXQoaW5qZWN0YWJsZSwgZGVjbGFyZWQpO1xuICB9XG5cbiAgcmV0dXJuIGRlY2xhcmVkO1xufTtcblxuZXhwb3J0IGNvbnN0IGNoZWNrRm9yVW5kZWNsYXJlZENvbnN1bXB0aW9uRm9yID1cbiAgKHsgZ2V0TmFtZXNwYWNlZElkIH0pID0+XG4gICh7IGFsaWFzLCBpbmplY3RpbmdJbmplY3RhYmxlIH0pID0+IHtcbiAgICAvLyBPbmx5IGluamVjdGFibGUyIGRlY2xhcmVzIGNvbnN1bXB0aW9ucy4gRXZlcnl0aGluZyBlbHNlIGlzIGV4ZW1wdCBieVxuICAgIC8vIHRoaXMgb25lIGNoZWNrOiB0aGUgY29udGFpbmVyIHJvb3QsIHYxIGluamVjdGFibGVzLCBhbmQgdGhlIHRva2VuIHRoYXRcbiAgICAvLyBzdGFuZHMgaW4gYXMgdGhlIGluamVjdGluZyBwYXJ0eSBmb3IgaW5qZWN0TWFueSdzIGVsZW1lbnQgaW5qZWN0cy5cbiAgICBpZiAoaW5qZWN0aW5nSW5qZWN0YWJsZS5hbGlhc1R5cGUgIT09IGluamVjdGFibGVTeW1ib2wyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSW5qZWN0aW5nIGFuIGluamVjdGFibGUgYnkgcmVmZXJlbmNlIGFscmVhZHkgaW1wbGllcyBhIGRlcGVuZGVuY3kgb25cbiAgICAvLyB3aGF0ZXZlciBwYWNrYWdlIGl0IGxpdmVzIGluLCBzbyBvbmx5IHRva2VucyBhcmUgZGVjbGFyZWQuXG4gICAgaWYgKGlzSW5qZWN0YWJsZShhbGlhcykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBkZWNsYXJlZCA9IGdldERlY2xhcmVkU2V0KGluamVjdGluZ0luamVjdGFibGUpO1xuXG4gICAgLy8gRGVjbGFyaW5nIGEgZ2VuZXJhbCB0b2tlbiBjb3ZlcnMgZXZlcnkgYC5mb3IoKWAgZGVyaXZhdGl2ZSBvZiBpdCwgd2hpY2hcbiAgICAvLyBpcyB3aGF0IG1ha2VzIHJ1bnRpbWUgc3BlY2lmaWVycyBkZWNsYXJhYmxlIGF0IGFsbC4gVGhlIHdhbGsgaXMgdXB3YXJkc1xuICAgIC8vIG9ubHk6IGRlY2xhcmluZyBhIHNwZWNpZmljIHRva2VuIGRvZXMgbm90IGNvdmVyIGl0cyBnZW5lcmFsIHRva2VuLlxuICAgIGxldCBjYW5kaWRhdGUgPSBhbGlhcztcblxuICAgIHdoaWxlIChjYW5kaWRhdGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGRlY2xhcmVkLmhhcyhjYW5kaWRhdGUpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY2FuZGlkYXRlID0gY2FuZGlkYXRlLnNwZWNpZmljVG9rZW5PZjtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVHJpZWQgdG8gaW5qZWN0IFwiJHthbGlhcy5pZH1cIiBmcm9tIFwiJHtnZXROYW1lc3BhY2VkSWQoXG4gICAgICAgIGluamVjdGluZ0luamVjdGFibGUsXG4gICAgICApfVwiLCBidXQgaXQgaXMgbm90IGEgZGVjbGFyZWQgY29uc3VtcHRpb24uYCxcbiAgICApO1xuICB9O1xuIiwgImltcG9ydCB7IGluamVjdGFibGVTeW1ib2wyIH0gZnJvbSAnLi4vZ2V0SW5qZWN0YWJsZTIvZ2V0SW5qZWN0YWJsZTInO1xuXG5jb25zdCBpc1Rva2VuMiA9IGFsaWFzID0+IGFsaWFzLmFsaWFzVHlwZSA9PT0gJ2luamVjdGlvbi10b2tlbjInO1xuXG4vLyBSZWFkLW9ubHk6IHJlYWRzIHRoZSByZWdpc3RyYXRpb24gc3RhdGUgZGlyZWN0bHkgYW5kIGhvbGRzIG5vdGhpbmcgb2YgaXRzXG4vLyBvd24sIHNvIHJlZ2lzdGVyaW5nIGFmdGVyIHZhbGlkYXRpbmcgd29ya3MgYW5kIHZhbGlkYXRpbmcgYWdhaW4gcmVmbGVjdHMgaXQuXG5leHBvcnQgY29uc3QgdmFsaWRhdGVGb3IgPVxuICAoe1xuICAgIGNvbnRhaW5lcklkLFxuICAgIGluamVjdGFibGVTZXQsXG4gICAgaW5qZWN0YWJsZXNCeUluamVjdGlvblRva2VuLFxuICAgIG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcCxcbiAgICBvdmVycmlkaW5nSW5qZWN0YWJsZXMsXG4gIH0pID0+XG4gICgpID0+IHtcbiAgICBjb25zdCB2ZXJpZmllZElkcyA9IFtdO1xuICAgIGNvbnN0IHVudmVyaWZpZWRJZHMgPSBbXTtcbiAgICBjb25zdCB1bnZlcmlmaWFibGVDb25zdW1wdGlvbnMgPSBbXTtcbiAgICBjb25zdCB2aW9sYXRpb25zID0gW107XG5cbiAgICBmb3IgKGNvbnN0IGluamVjdGFibGUgb2YgaW5qZWN0YWJsZVNldCkge1xuICAgICAgY29uc3QgbmFtZXNwYWNlZElkID0gbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLmdldChpbmplY3RhYmxlKTtcblxuICAgICAgLy8gT25seSBpbmplY3RhYmxlMiBkZWNsYXJlcyBjb25zdW1wdGlvbnM7IHYxIGluamVjdGFibGVzIGFyZSBiZXlvbmRcbiAgICAgIC8vIHdoYXQgdGhpcyBjYW4gY2hlY2suXG4gICAgICBpZiAoaW5qZWN0YWJsZS5hbGlhc1R5cGUgIT09IGluamVjdGFibGVTeW1ib2wyKSB7XG4gICAgICAgIHVudmVyaWZpZWRJZHMucHVzaChuYW1lc3BhY2VkSWQpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdmVyaWZpZWRJZHMucHVzaChuYW1lc3BhY2VkSWQpO1xuXG4gICAgICAvLyBBbiBvdmVycmlkZGVuIGluamVjdGFibGUncyBvd24gaW5zdGFudGlhdGUgbmV2ZXIgcnVucywgc28gaXRzXG4gICAgICAvLyBkZWNsYXJhdGlvbnMgc2F5IG5vdGhpbmcgYWJvdXQgd2hhdCB0aGlzIGNvbnRhaW5lciBuZWVkcy5cbiAgICAgIGlmIChvdmVycmlkaW5nSW5qZWN0YWJsZXMuaGFzKGluamVjdGFibGUpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGNvbnN1bXB0aW9uIG9mIGluamVjdGFibGUuY29uc3VtcHRpb25zID8/IFtdKSB7XG4gICAgICAgIGlmICghaXNUb2tlbjIoY29uc3VtcHRpb24pKSB7XG4gICAgICAgICAgLy8gQSB2MSB0b2tlbiBjYXJyaWVzIG5vIGNhcmRpbmFsaXR5LCBzbyB0aGVyZSBpcyBubyBhcml0eSB0byBjaGVjay5cbiAgICAgICAgICB1bnZlcmlmaWFibGVDb25zdW1wdGlvbnMucHVzaCh7XG4gICAgICAgICAgICBpbmplY3RhYmxlSWQ6IG5hbWVzcGFjZWRJZCxcbiAgICAgICAgICAgIGNvbnN1bXB0aW9uSWQ6IGNvbnN1bXB0aW9uLmlkLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IGNhcmRpbmFsaXR5IH0gPSBjb25zdW1wdGlvbjtcblxuICAgICAgICBpZiAoY2FyZGluYWxpdHkgIT09ICdvbmUnICYmIGNhcmRpbmFsaXR5ICE9PSAnb25lLW9yLW1hbnknKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGUgaW5kZXggaG9sZHMgZXZlcnkgcmVnaXN0cmF0aW9uIG1hZGUgYWdhaW5zdCB0aGUgdG9rZW4gb3IgYW55IG9mXG4gICAgICAgIC8vIGl0cyBgLmZvcigpYCBkZXJpdmF0aXZlcywgd2hpY2ggaXMgaG93IGEgZ2VuZXJhbC10b2tlbiBkZWNsYXJhdGlvblxuICAgICAgICAvLyBpcyBzYXRpc2ZpZWQgYnkgYW4gaW1wbGVtZW50YXRpb24gb2Ygb25lIG9mIGl0cyBzcGVjaWZpYyB0b2tlbnMuXG4gICAgICAgIGNvbnN0IHJlZ2lzdGVyZWQgPSBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4uZ2V0KGNvbnN1bXB0aW9uKTtcblxuICAgICAgICAvLyBPbmx5IHRoZSBsb3dlciBib3VuZCBpcyBjaGVja2VkIGhlcmU6IHRoZSB1cHBlciBib3VuZCBjYW5ub3QgYmVcbiAgICAgICAgLy8gZXhjZWVkZWQsIHNpbmNlIHJlZ2lzdGVyaW5nIHJlamVjdHMgdGhlIHNlY29uZCBpbXBsZW1lbnRhdGlvbi5cbiAgICAgICAgaWYgKHJlZ2lzdGVyZWQgPT09IHVuZGVmaW5lZCB8fCByZWdpc3RlcmVkLnNpemUgPT09IDApIHtcbiAgICAgICAgICB2aW9sYXRpb25zLnB1c2goXG4gICAgICAgICAgICBgSW5qZWN0YWJsZSBcIiR7bmFtZXNwYWNlZElkfVwiIGNvbnN1bWVzIGluamVjdGlvbiB0b2tlbiBcIiR7Y29uc3VtcHRpb24uaWR9XCIgd2l0aCBjYXJkaW5hbGl0eSBcIiR7Y2FyZGluYWxpdHl9XCIsIGJ1dCBpdCBoYXMgbm8gcmVnaXN0cmF0aW9ucy5gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodmlvbGF0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUcmllZCB0byB2YWxpZGF0ZSBjb250YWluZXIgXCIke2NvbnRhaW5lcklkfVwiLCBidXQgZm91bmQgdmlvbGF0aW9uczpcXG4ke3Zpb2xhdGlvbnNcbiAgICAgICAgICAubWFwKHZpb2xhdGlvbiA9PiBgIC0gJHt2aW9sYXRpb259YClcbiAgICAgICAgICAuam9pbignXFxuJyl9YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3Qgc29ydGVkID0gaWRzID0+IFsuLi5pZHNdLnNvcnQoKTtcblxuICAgIHJldHVybiB7XG4gICAgICB2ZXJpZmllZEluamVjdGFibGVzOiB7XG4gICAgICAgIGNvdW50OiB2ZXJpZmllZElkcy5sZW5ndGgsXG4gICAgICAgIGlkczogc29ydGVkKHZlcmlmaWVkSWRzKSxcbiAgICAgIH0sXG5cbiAgICAgIHVudmVyaWZpZWRJbmplY3RhYmxlczoge1xuICAgICAgICBjb3VudDogdW52ZXJpZmllZElkcy5sZW5ndGgsXG4gICAgICAgIGlkczogc29ydGVkKHVudmVyaWZpZWRJZHMpLFxuICAgICAgfSxcblxuICAgICAgdW52ZXJpZmlhYmxlQ29uc3VtcHRpb25zLFxuICAgIH07XG4gIH07XG4iLCAiaW1wb3J0IGlzSW5qZWN0aW9uVG9rZW4gZnJvbSAnLi4vZ2V0SW5qZWN0aW9uVG9rZW4vaXNJbmplY3Rpb25Ub2tlbic7XG5pbXBvcnQgeyBpbmplY3RhYmxlU3ltYm9sMiB9IGZyb20gJy4uL2dldEluamVjdGFibGUyL2dldEluamVjdGFibGUyJztcbmltcG9ydCB7IGluamVjdGlvblRva2VuU3ltYm9sMiB9IGZyb20gJy4uL2dldEluamVjdGlvblRva2VuMi9nZXRJbmplY3Rpb25Ub2tlbjInO1xuXG5jb25zdCB0YXJnZXRJc1YyID0gaW5qZWN0YWJsZSA9PlxuICBpbmplY3RhYmxlLmFsaWFzVHlwZSA9PT0gaW5qZWN0YWJsZVN5bWJvbDIgfHxcbiAgaW5qZWN0YWJsZS5hbGlhc1R5cGUgPT09IGluamVjdGlvblRva2VuU3ltYm9sMjtcblxuLy8gdjEtc2hhcGUgc3R1YjogKGRpLCAuLi5wYXJhbXMpID0+IGluc3RhbmNlLiBXcmFwcyBmb3IgdjIgdGFyZ2V0cy5cbmNvbnN0IGFzVjFTaGFwZSA9IChzdHViLCBpc1YyVGFyZ2V0KSA9PlxuICBpc1YyVGFyZ2V0XG4gICAgPyBkaSA9PlxuICAgICAgICAoLi4ucGFyYW1zKSA9PlxuICAgICAgICAgIHN0dWIoZGksIC4uLnBhcmFtcylcbiAgICA6IHN0dWI7XG5cbi8vIHYyLXNoYXBlIHN0dWI6IChkaSkgPT4gKC4uLnBhcmFtcykgPT4gaW5zdGFuY2UuIFVud3JhcHMgZm9yIHYxIHRhcmdldHMuXG5jb25zdCBhc1YyU2hhcGUgPSAoc3R1YiwgaXNWMlRhcmdldCkgPT5cbiAgaXNWMlRhcmdldCA/IHN0dWIgOiAoZGksIC4uLnBhcmFtcykgPT4gc3R1YihkaSkoLi4ucGFyYW1zKTtcblxuY29uc3QgZWFybHlPdmVycmlkZUltcGxGb3IgPVxuICBub3JtYWxpemUgPT5cbiAgKHtcbiAgICBnZXRSZWxhdGVkSW5qZWN0YWJsZXMsXG4gICAgYWxyZWFkeUluamVjdGVkLFxuICAgIG92ZXJyaWRpbmdJbmplY3RhYmxlcyxcbiAgICBnZXROYW1lc3BhY2VkSWQsXG4gIH0pID0+XG4gIChhbGlhcywgaW5zdGFudGlhdGVTdHViKSA9PiB7XG4gICAgY29uc3QgcmVsYXRlZEluamVjdGFibGVzID0gZ2V0UmVsYXRlZEluamVjdGFibGVzKGFsaWFzKTtcblxuICAgIGlmIChyZWxhdGVkSW5qZWN0YWJsZXMubGVuZ3RoID4gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJpZWQgdG8gb3ZlcnJpZGUgc2luZ2xlIGltcGxlbWVudGF0aW9uIG9mIGluamVjdGlvbiB0b2tlbiBcIiR7XG4gICAgICAgICAgYWxpYXMuaWRcbiAgICAgICAgfVwiLCBidXQgZm91bmQgbXVsdGlwbGUgcmVnaXN0ZXJlZCBpbXBsZW1lbnRhdGlvbnM6IFwiJHtyZWxhdGVkSW5qZWN0YWJsZXNcbiAgICAgICAgICAubWFwKGdldE5hbWVzcGFjZWRJZClcbiAgICAgICAgICAuam9pbignXCIsIFwiJyl9XCIuYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHJlbGF0ZWRJbmplY3RhYmxlcy5sZW5ndGggPT09IDAgJiYgaXNJbmplY3Rpb25Ub2tlbihhbGlhcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRyaWVkIHRvIGVhcmx5LW92ZXJyaWRlIGFuIGluamVjdGlvbiB0b2tlbiBcIiR7YWxpYXMuaWR9XCIsIGJ1dCB0aGF0IGlzIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkLmAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IG9yaWdpbmFsSW5qZWN0YWJsZSA9IHJlbGF0ZWRJbmplY3RhYmxlc1swXSB8fCBhbGlhcztcblxuICAgIGlmIChhbHJlYWR5SW5qZWN0ZWQuaGFzKGFsaWFzKSB8fCBhbHJlYWR5SW5qZWN0ZWQuaGFzKG9yaWdpbmFsSW5qZWN0YWJsZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRyaWVkIHRvIG92ZXJyaWRlIGluamVjdGFibGUgXCIke2dldE5hbWVzcGFjZWRJZChcbiAgICAgICAgICBvcmlnaW5hbEluamVjdGFibGUsXG4gICAgICAgICl9XCIsIGJ1dCBpdCB3YXMgYWxyZWFkeSBpbmplY3RlZC5gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBvdmVycmlkaW5nSW5qZWN0YWJsZXMuc2V0KG9yaWdpbmFsSW5qZWN0YWJsZSwge1xuICAgICAgLi4ub3JpZ2luYWxJbmplY3RhYmxlLFxuICAgICAgb3ZlcnJpZGRlbkluamVjdGFibGU6IG9yaWdpbmFsSW5qZWN0YWJsZSxcbiAgICAgIGNhdXNlc1NpZGVFZmZlY3RzOiBmYWxzZSxcbiAgICAgIGluc3RhbnRpYXRlOiBub3JtYWxpemUoaW5zdGFudGlhdGVTdHViLCB0YXJnZXRJc1YyKG9yaWdpbmFsSW5qZWN0YWJsZSkpLFxuICAgIH0pO1xuICB9O1xuXG5leHBvcnQgY29uc3QgZWFybHlPdmVycmlkZUZvciA9IGVhcmx5T3ZlcnJpZGVJbXBsRm9yKGFzVjFTaGFwZSk7XG5leHBvcnQgY29uc3QgZWFybHlPdmVycmlkZTJGb3IgPSBlYXJseU92ZXJyaWRlSW1wbEZvcihhc1YyU2hhcGUpO1xuIiwgImltcG9ydCB7IHByZUluamVjdENhbGxiYWNrVG9rZW4gfSBmcm9tICcuL3Rva2Vucyc7XG5cbi8vIE5vbi13cmFwcGluZyBlbnRyeSBob29rOiBmaXJlcyBldmVyeSBwcmUtaW5qZWN0IGNhbGxiYWNrIGFwcGxpY2FibGUgdG8gdGhlXG4vLyBhbGlhcywgdGhlbiBjYWxscyB0aHJvdWdoLiBGaXJlcyBiZWZvcmUgYW55IHJlc29sdXRpb24gb3IgZmFpbHVyZSBjaGVjayxcbi8vIHNvIGEgY2FsbGJhY2sgY2FuIHJlZ2lzdGVyIGltcGxlbWVudGF0aW9ucyB0aGF0IHRoZSBzYW1lIG9wZXJhdGlvbiB0aGVuXG4vLyBvYnNlcnZlcy4gYGtpbmRgIGlzIGJha2VkIGluIGF0IHdyYXAgdGltZTogJ2luamVjdCcgZm9yIHRoZSBpbmplY3Rcbi8vIHZhcmlhbnRzLCAnaW5qZWN0TWFueScgZm9yIHRoZSBpbmplY3RNYW55IHZhcmlhbnRzICh3aXRoTWV0YSB2YXJpYW50c1xuLy8gcmVwb3J0IHRoZWlyIGJhc2Uga2luZCkuIFRoZSB0aGlyZCBhcmd1bWVudCBpcyB0aGUgaW5qZWN0aW5nIHBhcnR5OiB0aGVcbi8vIGluamVjdGFibGUgd2hvc2UgaW5zdGFudGlhdGUgbWFkZSB0aGUgY2FsbCwgb3IgdGhlIGNvbnRhaW5lciByb290IGZvclxuLy8gaW5qZWN0cyBtYWRlIGRpcmVjdGx5IG9uIGBkaWAuXG5leHBvcnQgY29uc3Qgd2l0aFByZUluamVjdENhbGxiYWNrc0ZvciA9XG4gICh7IGRlY29yYXRvckNhY2hlLCBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyB9KSA9PlxuICBraW5kID0+XG4gIHRvQmVDYWxsZWQgPT5cbiAgYXJncyA9PiB7XG4gICAgLy8gV2hlbiBkZWNvcmF0b3JDYWNoZS5wcmVJbmplY3QgaXMgbnVsbCwgYSBjYWxsYmFjayB3YXMgcmVnaXN0ZXJlZCBvclxuICAgIC8vIGRlcmVnaXN0ZXJlZCBcdTIwMTQgaW52YWxpZGF0ZSBhbGwgcGVyLWFsaWFzIGNhY2hlZCBjYWxsYmFjayBsaXN0cy5cbiAgICBpZiAoZGVjb3JhdG9yQ2FjaGUucHJlSW5qZWN0ID09PSBudWxsKSB7XG4gICAgICBkZWNvcmF0b3JDYWNoZS5wcmVJbmplY3QgPSB0cnVlO1xuICAgICAgZGVjb3JhdG9yQ2FjaGUucHJlSW5qZWN0QnlBbGlhcyA9IG5ldyBNYXAoKTtcbiAgICB9XG5cbiAgICBsZXQgY2FsbGJhY2tzID0gZGVjb3JhdG9yQ2FjaGUucHJlSW5qZWN0QnlBbGlhcy5nZXQoYXJncy5hbGlhcyk7XG5cbiAgICBpZiAoY2FsbGJhY2tzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGFwcGxpY2FibGUgPSBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyh7XG4gICAgICAgIGRlY29yYXRvclRva2VuOiBwcmVJbmplY3RDYWxsYmFja1Rva2VuLFxuICAgICAgICB0YXJnZXQ6IGFyZ3MuYWxpYXMsXG4gICAgICAgIGluamVjdGluZ0luamVjdGFibGU6IGFyZ3MuaW5qZWN0aW5nSW5qZWN0YWJsZSxcbiAgICAgIH0pO1xuXG4gICAgICBjYWxsYmFja3MgPSBhcHBsaWNhYmxlLmxlbmd0aCA+IDAgPyBhcHBsaWNhYmxlIDogbnVsbDtcblxuICAgICAgZGVjb3JhdG9yQ2FjaGUucHJlSW5qZWN0QnlBbGlhcy5zZXQoYXJncy5hbGlhcywgY2FsbGJhY2tzKTtcbiAgICB9XG5cbiAgICBpZiAoY2FsbGJhY2tzICE9PSBudWxsKSB7XG4gICAgICBmb3IgKGNvbnN0IGNhbGxiYWNrIG9mIGNhbGxiYWNrcykge1xuICAgICAgICBjYWxsYmFjayhhcmdzLmFsaWFzLCBraW5kLCBhcmdzLmluamVjdGluZ0luamVjdGFibGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0b0JlQ2FsbGVkKGFyZ3MpO1xuICB9O1xuIiwgImltcG9ydCB7IGluc3RhbmNlUHVyZ2VDYWxsYmFja1Rva2VuIH0gZnJvbSAnLi90b2tlbnMnO1xuXG5leHBvcnQgY29uc3QgZmlyZVB1cmdlQ2FsbGJhY2tzRm9yID1cbiAgKHsgZ2V0QXBwbGljYWJsZURlY29yYXRvcnMgfSkgPT5cbiAgKGluamVjdGFibGUsIGluc3RhbmNlLCBrZXlBcnJheSkgPT4ge1xuICAgIGNvbnN0IHBheWxvYWQgPSB7IGluc3RhbmNlIH07XG5cbiAgICBjb25zdCBjYWxsYmFja3MgPSBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyh7XG4gICAgICBkZWNvcmF0b3JUb2tlbjogaW5zdGFuY2VQdXJnZUNhbGxiYWNrVG9rZW4sXG4gICAgICB0YXJnZXQ6IGluamVjdGFibGUsXG4gICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBpbmplY3RhYmxlLFxuICAgIH0pO1xuXG4gICAgZm9yIChjb25zdCBjYiBvZiBjYWxsYmFja3MpIHtcbiAgICAgIGNiKHBheWxvYWQpKC4uLmtleUFycmF5KTtcbiAgICB9XG4gIH07XG4iLCAiaW1wb3J0IHsgZ2V0UmVsYXRlZFRva2VucyB9IGZyb20gJy4vZ2V0UmVsYXRlZFRva2Vucyc7XG5cbi8vIFJldHVybnMgZXZlcnkgZGVjb3JhdG9yL2NhbGxiYWNrIGluc3RhbmNlIHRoYXQgYXBwbGllcyB0byBgdGFyZ2V0YCBmb3IgdGhlXG4vLyBnaXZlbiBgZGVjb3JhdG9yVG9rZW5gLiBUaHJlZSBsb29rdXAgZGltZW5zaW9ucyBhcmUgdW5pZmllZDpcbi8vXG4vLyAgIDEuIERpcmVjdDogICBkZWNvcmF0b3JUb2tlbi5mb3IodGFyZ2V0KS5cbi8vICAgMi4gQ2hhaW46ICAgIHdhbGsgYHNwZWNpZmljVG9rZW5PZmAgYW5jZXN0b3JzIG9mIHRoZSBjb250cmFjdCB0b2tlbiBcdTIwMTRcbi8vICAgICAgICAgICAgICAgIGB0YXJnZXQuaW5qZWN0aW9uVG9rZW5gIGZvciBpbmplY3RhYmxlIHRhcmdldHMsXG4vLyAgICAgICAgICAgICAgICBgdGFyZ2V0LnNwZWNpZmljVG9rZW5PZmAgZm9yIHRva2VuIHRhcmdldHMgXHUyMDE0IGFuZCBsb29rIHVwXG4vLyAgICAgICAgICAgICAgICBgZGVjb3JhdG9yVG9rZW4uZm9yKGFuY2VzdG9yKWAgZm9yIGVhY2guIFRoaXMgaXMgc3ltbWV0cmljXG4vLyAgICAgICAgICAgICAgICB3aXRoIHRoZSByZWdpc3RyYXRpb24tdGltZSBjaGFpbiBpbmRleGluZyBpblxuLy8gICAgICAgICAgICAgICAgYGdldFJlbGF0ZWRUb2tlbnNgOiBhIGNvbnRyaWJ1dG9yIHJlZ2lzdGVyZWQgdW5kZXJcbi8vICAgICAgICAgICAgICAgIGBzb21lVG9rZW4uZm9yKHNwZWNpZmllcilgIGlzIGFscmVhZHkgcmV0cmlldmFibGUgdmlhXG4vLyAgICAgICAgICAgICAgICBgaW5qZWN0TWFueShzb21lVG9rZW4pYCwgYW5kIGEgZGVjb3JhdG9yIHRhcmdldGluZyB0aGVcbi8vICAgICAgICAgICAgICAgIHBhcmVudCBjb250cmFjdCBzaG91bGQgZmlyZSBmb3IgdGhlIGNoaWxkIHNwZWNpYWxpemF0aW9uLlxuLy8gICAzLiBUYWdzOiAgICAgZm9yIGV2ZXJ5IHRhZyBvZiB0aGUgdGFyZ2V0IGFuZCBvZiBldmVyeSB0b2tlbiBpbiBpdHNcbi8vICAgICAgICAgICAgICAgIGNoYWluLCBsb29rIHVwIGBkZWNvcmF0b3JUb2tlbi5mb3IodGFnKWAuIFRhZ3MgYXJlIGRlZHVwZWRcbi8vICAgICAgICAgICAgICAgIGFjcm9zcyB0aGVzZSBzb3VyY2VzOiBgLmZvcigpYCBjaGlsZHJlbiBpbmhlcml0IHRoZSBnZW5lcmFsXG4vLyAgICAgICAgICAgICAgICB0b2tlbidzIHRhZ3MsIHNvIHRoZSBzYW1lIHRhZyB0eXBpY2FsbHkgb2NjdXJzIG9uIGV2ZXJ5XG4vLyAgICAgICAgICAgICAgICBjaGFpbiBsZXZlbC4gVGhpcyBtYWtlcyBhIHRhZyBvbiBhIHRva2VuIGZpcmUgZXZlcnl3aGVyZVxuLy8gICAgICAgICAgICAgICAgYC5mb3IodG9rZW4pYCB3b3VsZC5cbi8vXG4vLyBJbmplY3RhYmxlcyB3aXRob3V0IGFuIGBpbmplY3Rpb25Ub2tlbmAgc2tpcCB0aGUgY2hhaW4gZGltZW5zaW9uLlxuLy9cbi8vIEZhc3QgcGF0aDogaWYgbm8gaW5qZWN0YWJsZSBpcyByZWdpc3RlcmVkIHVuZGVyIHRoZSBhYnN0cmFjdCBgZGVjb3JhdG9yVG9rZW5gXG4vLyBpdHNlbGYsIG5vbmUgb2YgdGhlIHRocmVlIGxvb2t1cCBkaW1lbnNpb25zIGNhbiBldmVyIG1hdGNoLiBgcmVnaXN0ZXIuanNgXG4vLyBpbmRleGVzIGV2ZXJ5IHNwZWNpZmljIGRlY29yYXRvciBieSB3YWxraW5nIGBnZXRSZWxhdGVkVG9rZW5zKGluamVjdGlvblRva2VuKWAsXG4vLyB3aGljaCB0ZXJtaW5hdGVzIGF0IHRoZSBhYnN0cmFjdCB0b2tlbiBcdTIwMTQgc28gdGhlIGFic3RyYWN0IHNldCBpcyBub24tZW1wdHlcbi8vIGlmZiBhdCBsZWFzdCBvbmUgZGVjb3JhdG9yIG9mIHRoaXMgdHlwZSBpcyByZWdpc3RlcmVkIGFueXdoZXJlLlxuY29uc3QgRU1QVFkgPSBPYmplY3QuZnJlZXplKFtdKTtcblxuZXhwb3J0IGNvbnN0IGdldEFwcGxpY2FibGVEZWNvcmF0b3JzRm9yID1cbiAgKHsgaW5qZWN0TWFueSwgaW5qZWN0YWJsZXNCeUluamVjdGlvblRva2VuIH0pID0+XG4gICh7IGRlY29yYXRvclRva2VuLCB0YXJnZXQsIGluamVjdGluZ0luamVjdGFibGUgfSkgPT4ge1xuICAgIGNvbnN0IHJlZ2lzdGVyZWQgPSBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4uZ2V0KGRlY29yYXRvclRva2VuKTtcblxuICAgIGlmICghcmVnaXN0ZXJlZCB8fCByZWdpc3RlcmVkLnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybiBFTVBUWTtcbiAgICB9XG5cbiAgICBjb25zdCBvdXQgPSBbXTtcblxuICAgIC8vIE1vc3QgZGlzcGF0Y2gga2V5cyBoYXZlIG5vIHJlZ2lzdHJhdGlvbnMgXHUyMDE0IGNoZWNraW5nIHRoZSByZWdpc3RyYXRpb25cbiAgICAvLyBpbmRleCBkaXJlY3RseSBza2lwcyB0aGUgaW5qZWN0TWFueSBtYWNoaW5lcnkgZm9yIHRoZW0uIGAuZm9yKClgIGl0c2VsZlxuICAgIC8vIGlzIGNoZWFwIG9uIHJlcGVhdCBjYWxscyAobWVtb2l6ZWQgYnkgc3BlY2lmaWVyKS5cbiAgICBjb25zdCBkaXNwYXRjaCA9IGFsaWFzID0+IHtcbiAgICAgIGNvbnN0IHJlZ2lzdGVyZWRGb3JBbGlhcyA9IGluamVjdGFibGVzQnlJbmplY3Rpb25Ub2tlbi5nZXQoYWxpYXMpO1xuXG4gICAgICBpZiAocmVnaXN0ZXJlZEZvckFsaWFzICYmIHJlZ2lzdGVyZWRGb3JBbGlhcy5zaXplID4gMCkge1xuICAgICAgICBvdXQucHVzaChcbiAgICAgICAgICAuLi5pbmplY3RNYW55KHtcbiAgICAgICAgICAgIGFsaWFzLFxuICAgICAgICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnM6IFtdLFxuICAgICAgICAgICAgaW5qZWN0aW5nSW5qZWN0YWJsZSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZGlzcGF0Y2goZGVjb3JhdG9yVG9rZW4uZm9yKHRhcmdldCkpO1xuXG4gICAgY29uc3QgY2hhaW4gPSBnZXRSZWxhdGVkVG9rZW5zKFxuICAgICAgdGFyZ2V0LmluamVjdGlvblRva2VuID8/IHRhcmdldC5zcGVjaWZpY1Rva2VuT2YsXG4gICAgKTtcblxuICAgIGZvciAoY29uc3QgdCBvZiBjaGFpbikge1xuICAgICAgZGlzcGF0Y2goZGVjb3JhdG9yVG9rZW4uZm9yKHQpKTtcbiAgICB9XG5cbiAgICBjb25zdCB0YXJnZXRUYWdzID0gdGFyZ2V0LnRhZ3M7XG5cbiAgICBpZiAodGFyZ2V0VGFncykge1xuICAgICAgZm9yIChjb25zdCB0YWcgb2YgdGFyZ2V0VGFncykge1xuICAgICAgICBkaXNwYXRjaChkZWNvcmF0b3JUb2tlbi5mb3IodGFnKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRGVkdXAgd2l0aG91dCBhbGxvY2F0aW9uczogYC5mb3IoKWAgY2hpbGRyZW4gc2hhcmUgdGhlIGdlbmVyYWwgdG9rZW4nc1xuICAgIC8vIHRhZ3MgYXJyYXksIHNvIGEgY2hhaW4gY2FycmllcyBhdCBtb3N0IG9uZSBkaXN0aW5jdCB0YWdzIGFycmF5IFx1MjAxNCBza2lwXG4gICAgLy8gcmVwZWF0cyBieSByZWZlcmVuY2UsIGFuZCBza2lwIHRhZ3MgYWxyZWFkeSBkaXNwYXRjaGVkIHZpYSB0YXJnZXQudGFnc1xuICAgIC8vIHdpdGggaW5kZXhPZiAodGhlIGFycmF5cyBhcmUgdGlueSkuXG4gICAgbGV0IHByb2Nlc3NlZENoYWluVGFncyA9IHRhcmdldFRhZ3M7XG5cbiAgICBmb3IgKGNvbnN0IHQgb2YgY2hhaW4pIHtcbiAgICAgIGNvbnN0IGNoYWluVGFncyA9IHQudGFncztcblxuICAgICAgaWYgKCFjaGFpblRhZ3MgfHwgY2hhaW5UYWdzID09PSBwcm9jZXNzZWRDaGFpblRhZ3MpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHByb2Nlc3NlZENoYWluVGFncyA9IGNoYWluVGFncztcblxuICAgICAgZm9yIChjb25zdCB0YWcgb2YgY2hhaW5UYWdzKSB7XG4gICAgICAgIGlmICh0YXJnZXRUYWdzICYmIHRhcmdldFRhZ3MuaW5kZXhPZih0YWcpICE9PSAtMSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgZGlzcGF0Y2goZGVjb3JhdG9yVG9rZW4uZm9yKHRhZykpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvdXQ7XG4gIH07XG4iLCAiaW1wb3J0IHsgcHJpdmF0ZUluamVjdEZvciB9IGZyb20gJy4vcHJpdmF0ZUluamVjdEZvcic7XG5pbXBvcnQgeyB3aXRoSW5qZWN0aW9uRGVjb3JhdG9yc0ZvciB9IGZyb20gJy4vd2l0aEluamVjdGlvbkRlY29yYXRvcnNGb3InO1xuaW1wb3J0IHsgcHJpdmF0ZUluamVjdE1hbnlGb3IgYXMgbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdE1hbnlGb3IgfSBmcm9tICcuL3ByaXZhdGVJbmplY3RNYW55Rm9yJztcbmltcG9ydCB7IHJlZ2lzdGVyRm9yLCByZWdpc3RlclNpbmdsZUZvciB9IGZyb20gJy4vcmVnaXN0ZXInO1xuaW1wb3J0IHsgcHVyZ2VJbnN0YW5jZXNGb3IsIHB1cmdlU3RvcmVkSW5zdGFuY2VzRm9yIH0gZnJvbSAnLi9wdXJnZUluc3RhbmNlcyc7XG5pbXBvcnQgeyBkZXJlZ2lzdGVyRm9yIH0gZnJvbSAnLi9kZXJlZ2lzdGVyJztcbmltcG9ydCB7IG92ZXJyaWRlRm9yLCB1bm92ZXJyaWRlRm9yIH0gZnJvbSAnLi9vdmVycmlkZSc7XG5pbXBvcnQgeyBnZXROYW1lc3BhY2VkSWRGb3IgfSBmcm9tICcuL2dldE5hbWVzcGFjZWRJZEZvcic7XG5pbXBvcnQgeyBjaGVja0Zvck5vTWF0Y2hlc0ZvciB9IGZyb20gJy4vY2hlY2tGb3JOb01hdGNoZXNGb3InO1xuaW1wb3J0IHsgY2hlY2tGb3JUb29NYW55TWF0Y2hlc0ZvciB9IGZyb20gJy4vY2hlY2tGb3JUb29NYW55TWF0Y2hlcyc7XG5pbXBvcnQgeyBjaGVja0ZvclNpZGVFZmZlY3RzRm9yIH0gZnJvbSAnLi9jaGVja0ZvclNpZGVFZmZlY3RzRm9yJztcbmltcG9ydCB7IGNoZWNrRm9yQWJzdHJhY3RUb2tlbkZvciB9IGZyb20gJy4vY2hlY2tGb3JBYnN0cmFjdFRva2VuRm9yJztcbmltcG9ydCB7IGNoZWNrRm9yTm9uTWF5YmVDYXJkaW5hbGl0eUZvciB9IGZyb20gJy4vY2hlY2tGb3JOb25NYXliZUNhcmRpbmFsaXR5Rm9yJztcbmltcG9ydCB7IGNoZWNrRm9yVW5kZWNsYXJlZENvbnN1bXB0aW9uRm9yIH0gZnJvbSAnLi9jaGVja0ZvclVuZGVjbGFyZWRDb25zdW1wdGlvbkZvcic7XG5pbXBvcnQgeyB2YWxpZGF0ZUZvciB9IGZyb20gJy4vdmFsaWRhdGUnO1xuaW1wb3J0IHsgZ2V0UmVsYXRlZEluamVjdGFibGVzRm9yIH0gZnJvbSAnLi9nZXRSZWxhdGVkSW5qZWN0YWJsZXNGb3InO1xuaW1wb3J0IHsgZWFybHlPdmVycmlkZUZvciwgZWFybHlPdmVycmlkZTJGb3IgfSBmcm9tICcuL2Vhcmx5LW92ZXJyaWRlJztcbmltcG9ydCB7XG4gIGluamVjdGlvbkRlY29yYXRvclRva2VuLFxuICBpbnN0YW5jZVB1cmdlQ2FsbGJhY2tUb2tlbixcbiAgcHJlSW5qZWN0Q2FsbGJhY2tUb2tlbixcbn0gZnJvbSAnLi90b2tlbnMnO1xuaW1wb3J0IHsgd2l0aFByZUluamVjdENhbGxiYWNrc0ZvciB9IGZyb20gJy4vd2l0aFByZUluamVjdENhbGxiYWNrc0Zvcic7XG5pbXBvcnQgeyBpc1JlbGF0ZWRUb1Rva2VuIH0gZnJvbSAnLi9nZXRSZWxhdGVkVG9rZW5zJztcbmltcG9ydCB7IGZpcmVQdXJnZUNhbGxiYWNrc0ZvciB9IGZyb20gJy4vZmlyZVB1cmdlQ2FsbGJhY2tzRm9yJztcbmltcG9ydCB7IGdldEFwcGxpY2FibGVEZWNvcmF0b3JzRm9yIH0gZnJvbSAnLi9nZXRBcHBsaWNhYmxlRGVjb3JhdG9yc0Zvcic7XG5pbXBvcnQgeyBpc0NvbXBvc2l0ZVN0b3JhZ2UgfSBmcm9tICcuL3ByaXZhdGVJbmplY3RGb3InO1xuXG5leHBvcnQgZGVmYXVsdCBjb250YWluZXJJZCA9PiB7XG4gIGNvbnN0IGluamVjdGFibGVTZXQgPSBuZXcgU2V0KCk7XG5cbiAgY29uc3QgZGVjb3JhdG9yQ2FjaGUgPSB7XG4gICAgaW5qZWN0aW9uOiBudWxsLFxuICAgIGluamVjdGlvbkJ5QWxpYXM6IG5ldyBNYXAoKSxcbiAgICBwcmVJbmplY3Q6IG51bGwsXG4gICAgcHJlSW5qZWN0QnlBbGlhczogbmV3IE1hcCgpLFxuICB9O1xuICBjb25zdCBvdmVycmlkaW5nSW5qZWN0YWJsZXMgPSBuZXcgTWFwKCk7XG4gIGxldCBzaWRlRWZmZWN0c0FyZVByZXZlbnRlZCA9IHRydWU7XG4gIGNvbnN0IGFscmVhZHlJbmplY3RlZCA9IG5ldyBTZXQoKTtcbiAgY29uc3QgaW5qZWN0YWJsZXNXaXRoUGVybWl0dGVkU2lkZUVmZmVjdHMgPSBuZXcgU2V0KCk7XG4gIGNvbnN0IGluamVjdGFibGVJZFNldCA9IG5ldyBTZXQoKTtcblxuICBjb25zdCBpbmplY3RhYmxlQW5kUmVnaXN0cmF0aW9uQ29udGV4dCA9IG5ldyBNYXAoKTtcbiAgY29uc3QgaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwID0gbmV3IE1hcCgpO1xuICBjb25zdCBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4gPSBuZXcgTWFwKCk7XG4gIGNvbnN0IG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcCA9IG5ldyBNYXAoKTtcbiAgY29uc3QgY2hpbGRyZW5CeVBhcmVudE1hcCA9IG5ldyBNYXAoKTtcblxuICBjb25zdCBnZXROYW1lc3BhY2VkSWQgPSBnZXROYW1lc3BhY2VkSWRGb3IoaW5qZWN0YWJsZUFuZFJlZ2lzdHJhdGlvbkNvbnRleHQpO1xuXG4gIGNvbnN0IGdldFJlbGF0ZWRJbmplY3RhYmxlcyA9IGdldFJlbGF0ZWRJbmplY3RhYmxlc0Zvcih7XG4gICAgaW5qZWN0YWJsZXNCeUluamVjdGlvblRva2VuLFxuICAgIGluamVjdGFibGVTZXQsXG4gIH0pO1xuXG4gIGNvbnN0IGNvbnRhaW5lclJvb3RDb250ZXh0SXRlbSA9IHtcbiAgICBpbmplY3RhYmxlOiB7IGlkOiBjb250YWluZXJJZCwgYWxpYXNUeXBlOiAnY29udGFpbmVyJyB9LFxuICB9O1xuXG4gIGNvbnN0IHJvb3RJbmplY3RhYmxlID0gY29udGFpbmVyUm9vdENvbnRleHRJdGVtLmluamVjdGFibGU7XG5cbiAgY29uc3QgY2hlY2tGb3JBYnN0cmFjdFRva2VuID0gY2hlY2tGb3JBYnN0cmFjdFRva2VuRm9yKHsgZ2V0TmFtZXNwYWNlZElkIH0pO1xuXG4gIGNvbnN0IG5vbkRlY29yYXRlZFByaXZhdGVJbmplY3RNYW55Rm9yVW5rbm93bk1ldGEgPVxuICAgIG5vbkRlY29yYXRlZFByaXZhdGVJbmplY3RNYW55Rm9yKHtcbiAgICAgIGdldFJlbGF0ZWRJbmplY3RhYmxlcyxcbiAgICAgIC8vIEVsZW1lbnRzIGdvIHRocm91Z2ggdGhlIGVsZW1lbnQgc2xvdCwgbm90IGBwcml2YXRlRGkuaW5qZWN0YDogZW50cnlcbiAgICAgIC8vIHdyYXBwZXJzIChvbmNlLXBlci1vcGVyYXRpb24gaG9va3MpIG11c3Qgbm90IHJlLWZpcmUgcGVyIGVsZW1lbnQsXG4gICAgICAvLyB3aGlsZSBpbmplY3Rpb24gZGVjb3JhdG9ycyBzdGlsbCBhcHBseSBwZXIgZWxlbWVudC5cbiAgICAgIGdldEluamVjdDogKCkgPT4gZWxlbWVudEluamVjdCxcbiAgICAgIG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcCxcbiAgICB9KTtcblxuICBjb25zdCBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0TWFueSA9XG4gICAgbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdE1hbnlGb3JVbmtub3duTWV0YSh7XG4gICAgICB3aXRoTWV0YTogZmFsc2UsXG4gICAgfSk7XG5cbiAgY29uc3Qgbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdE1hbnlXaXRoTWV0YSA9XG4gICAgbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdE1hbnlGb3JVbmtub3duTWV0YSh7XG4gICAgICB3aXRoTWV0YTogdHJ1ZSxcbiAgICB9KTtcblxuICBjb25zdCBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyA9IGdldEFwcGxpY2FibGVEZWNvcmF0b3JzRm9yKHtcbiAgICBpbmplY3RNYW55OiBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0TWFueSxcbiAgICBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4sXG4gIH0pO1xuXG4gIGNvbnN0IGdldFNpZGVFZmZlY3RzQXJlUHJldmVudGVkID0gaW5qZWN0YWJsZSA9PlxuICAgIHNpZGVFZmZlY3RzQXJlUHJldmVudGVkICYmXG4gICAgaW5qZWN0YWJsZS5jYXVzZXNTaWRlRWZmZWN0cyAmJlxuICAgICFpbmplY3RhYmxlc1dpdGhQZXJtaXR0ZWRTaWRlRWZmZWN0cy5oYXMoaW5qZWN0YWJsZSk7XG5cbiAgY29uc3QgY2hlY2tGb3JTaWRlRWZmZWN0cyA9IGNoZWNrRm9yU2lkZUVmZmVjdHNGb3Ioe1xuICAgIGdldFNpZGVFZmZlY3RzQXJlUHJldmVudGVkLFxuICAgIGdldE5hbWVzcGFjZWRJZCxcbiAgfSk7XG5cbiAgY29uc3QgY2hlY2tGb3JOb01hdGNoZXMgPSBjaGVja0Zvck5vTWF0Y2hlc0Zvcih7XG4gICAgZ2V0TmFtZXNwYWNlZElkLFxuICB9KTtcblxuICBjb25zdCBjaGVja0ZvclRvb01hbnlNYXRjaGVzID0gY2hlY2tGb3JUb29NYW55TWF0Y2hlc0Zvcih7XG4gICAgZ2V0TmFtZXNwYWNlZElkLFxuICB9KTtcblxuICBjb25zdCBjaGVja0Zvck5vbk1heWJlQ2FyZGluYWxpdHkgPSBjaGVja0Zvck5vbk1heWJlQ2FyZGluYWxpdHlGb3Ioe1xuICAgIGdldE5hbWVzcGFjZWRJZCxcbiAgfSk7XG5cbiAgY29uc3QgY2hlY2tGb3JVbmRlY2xhcmVkQ29uc3VtcHRpb24gPSBjaGVja0ZvclVuZGVjbGFyZWRDb25zdW1wdGlvbkZvcih7XG4gICAgZ2V0TmFtZXNwYWNlZElkLFxuICB9KTtcblxuICAvLyBFbmZvcmNlbWVudCB3cmFwcyB0aGUgc2xvdHMgcmF0aGVyIHRoYW4gbGl2aW5nIGluc2lkZSB0aGUgb3BlcmF0aW9uXG4gIC8vIGZ1bmN0aW9ucywgc28gdGhhdCB0aGUgbWFjaGluZXJ5IFx1MjAxNCBkZWNvcmF0b3IgYW5kIGNhbGxiYWNrIGRpc3BhdGNoLCBwdXJnZVxuICAvLyBjYWxsYmFja3MgXHUyMDE0IHN0YXlzIGV4ZW1wdDogaXQgaG9sZHMgdGhlIHJhdyBvcGVyYXRpb25zIGNhcHR1cmVkIGF0XG4gIC8vIGNvbnN0cnVjdGlvbiBhbmQgbmV2ZXIgcmVhZHMgdGhlc2Ugc2xvdHMuXG4gIGNvbnN0IHdpdGhDb25zdW1wdGlvbkVuZm9yY2VtZW50ID0gdG9CZUNhbGxlZCA9PiBhcmdzID0+IHtcbiAgICBjaGVja0ZvclVuZGVjbGFyZWRDb25zdW1wdGlvbihhcmdzKTtcblxuICAgIHJldHVybiB0b0JlQ2FsbGVkKGFyZ3MpO1xuICB9O1xuXG4gIGNvbnN0IG5vbkRlY29yYXRlZFByaXZhdGVJbmplY3RVbmtub3duTWV0YSA9IHByaXZhdGVJbmplY3RGb3Ioe1xuICAgIGdldFJlbGF0ZWRJbmplY3RhYmxlcyxcbiAgICBpbmplY3RhYmxlU2V0LFxuICAgIGFscmVhZHlJbmplY3RlZCxcbiAgICBvdmVycmlkaW5nSW5qZWN0YWJsZXMsXG4gICAgaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLFxuICAgIGdldERpOiAoKSA9PiBwcml2YXRlRGksXG4gICAgY2hlY2tGb3JOb01hdGNoZXMsXG4gICAgY2hlY2tGb3JUb29NYW55TWF0Y2hlcyxcbiAgICBjaGVja0ZvclNpZGVFZmZlY3RzLFxuICAgIGNoZWNrRm9yQWJzdHJhY3RUb2tlbixcbiAgICBjaGVja0Zvck5vbk1heWJlQ2FyZGluYWxpdHksXG4gICAgbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLFxuICAgIGdldE5hbWVzcGFjZWRJZCxcbiAgICBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyxcbiAgfSk7XG5cbiAgY29uc3Qgbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdCA9IG5vbkRlY29yYXRlZFByaXZhdGVJbmplY3RVbmtub3duTWV0YSh7XG4gICAgd2l0aE1ldGE6IGZhbHNlLFxuICB9KTtcblxuICBjb25zdCBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0V2l0aE1ldGEgPVxuICAgIG5vbkRlY29yYXRlZFByaXZhdGVJbmplY3RVbmtub3duTWV0YSh7XG4gICAgICB3aXRoTWV0YTogdHJ1ZSxcbiAgICB9KTtcblxuICBjb25zdCB3aXRoSW5qZWN0aW9uRGVjb3JhdG9ycyA9IHdpdGhJbmplY3Rpb25EZWNvcmF0b3JzRm9yKHtcbiAgICBkZWNvcmF0b3JDYWNoZSxcbiAgICBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyxcbiAgfSk7XG5cbiAgLy8gSW5qZWN0aW9uIGRlY29yYXRvcnMgYXBwbHkgb25seSBvbiB0aGUgcGVyLWluamVjdGFibGUgaW5qZWN0IHBhdGguXG4gIC8vIGluamVjdE1hbnkgcmVzb2x2ZXMgcmVsYXRlZCBpbmplY3RhYmxlcyBhbmQgY2FsbHMgdGhlIChkZWNvcmF0ZWQpIGluamVjdFxuICAvLyBvbiBlYWNoLCBzbyBkZWNvcmF0b3JzIHN0aWxsIGZpcmUgcGVyIGVsZW1lbnQgXHUyMDE0IGJ1dCB0aGUgdG9rZW4tbGV2ZWxcbiAgLy8gaW5qZWN0TWFueSBpcyBuZXZlciB3cmFwcGVkLlxuICBjb25zdCBkZWNvcmF0ZWRQcml2YXRlSW5qZWN0ID0gd2l0aEluamVjdGlvbkRlY29yYXRvcnMoXG4gICAgbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdCxcbiAgKTtcblxuICBjb25zdCBkZWNvcmF0ZWRQcml2YXRlSW5qZWN0V2l0aE1ldGEgPSB3aXRoSW5qZWN0aW9uRGVjb3JhdG9ycyhcbiAgICBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0V2l0aE1ldGEsXG4gICk7XG5cbiAgY29uc3Qgd2l0aFByZUluamVjdENhbGxiYWNrcyA9IHdpdGhQcmVJbmplY3RDYWxsYmFja3NGb3Ioe1xuICAgIGRlY29yYXRvckNhY2hlLFxuICAgIGdldEFwcGxpY2FibGVEZWNvcmF0b3JzLFxuICB9KTtcblxuICBjb25zdCB3aXRoUHJlSW5qZWN0Q2FsbGJhY2tzRm9ySW5qZWN0ID0gd2l0aFByZUluamVjdENhbGxiYWNrcygnaW5qZWN0Jyk7XG5cbiAgY29uc3Qgd2l0aFByZUluamVjdENhbGxiYWNrc0ZvckluamVjdE1hbnkgPVxuICAgIHdpdGhQcmVJbmplY3RDYWxsYmFja3MoJ2luamVjdE1hbnknKTtcblxuICBjb25zdCBwcmVJbmplY3ROb25EZWNvcmF0ZWRJbmplY3QgPSB3aXRoUHJlSW5qZWN0Q2FsbGJhY2tzRm9ySW5qZWN0KFxuICAgIG5vbkRlY29yYXRlZFByaXZhdGVJbmplY3QsXG4gICk7XG5cbiAgY29uc3QgcHJlSW5qZWN0RGVjb3JhdGVkSW5qZWN0ID0gd2l0aFByZUluamVjdENhbGxiYWNrc0ZvckluamVjdChcbiAgICBkZWNvcmF0ZWRQcml2YXRlSW5qZWN0LFxuICApO1xuXG4gIGNvbnN0IHByZUluamVjdE5vbkRlY29yYXRlZEluamVjdFdpdGhNZXRhID0gd2l0aFByZUluamVjdENhbGxiYWNrc0ZvckluamVjdChcbiAgICBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0V2l0aE1ldGEsXG4gICk7XG5cbiAgY29uc3QgcHJlSW5qZWN0RGVjb3JhdGVkSW5qZWN0V2l0aE1ldGEgPSB3aXRoUHJlSW5qZWN0Q2FsbGJhY2tzRm9ySW5qZWN0KFxuICAgIGRlY29yYXRlZFByaXZhdGVJbmplY3RXaXRoTWV0YSxcbiAgKTtcblxuICBjb25zdCBwcmVJbmplY3RJbmplY3RNYW55ID0gd2l0aFByZUluamVjdENhbGxiYWNrc0ZvckluamVjdE1hbnkoXG4gICAgbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdE1hbnksXG4gICk7XG5cbiAgY29uc3QgcHJlSW5qZWN0SW5qZWN0TWFueVdpdGhNZXRhID0gd2l0aFByZUluamVjdENhbGxiYWNrc0ZvckluamVjdE1hbnkoXG4gICAgbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdE1hbnlXaXRoTWV0YSxcbiAgKTtcblxuICAvLyBUaGUgaW5qZWN0IHVzZWQgZm9yIGluamVjdE1hbnkgZWxlbWVudHM6IGRlY29yYXRlZCBwZXIgZWxlbWVudCB3aGVuXG4gIC8vIGluamVjdGlvbiBkZWNvcmF0b3JzIGV4aXN0LCBidXQgbmV2ZXIgd3JhcHBlZCBieSBlbnRyeS1sZXZlbCBob29rc1xuICAvLyAocHJlLWluamVjdCBjYWxsYmFja3MgZmlyZSBvbmNlIHBlciBvcGVyYXRpb24sIG5vdCBwZXIgZWxlbWVudCkuXG4gIGxldCBlbGVtZW50SW5qZWN0ID0gbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdDtcblxuICAvLyBXaXJlcyB0aGUgZGVjb3JhdGVkIGFuZCBwcmUtaW5qZWN0LWhvb2tlZCB2YXJpYW50cyBpbiBvbmx5IHdoaWxlIGF0XG4gIC8vIGxlYXN0IG9uZSBtYXRjaGluZyBjb250cmlidXRvciBpcyByZWdpc3RlcmVkLCBzbyB0aGUgY29tbW9uIGJhcmUgY2FzZVxuICAvLyBwYXlzIG5vIHdyYXBwZXIgZnJhbWUgYXQgYWxsLiBFdmVyeSByZWFkZXIgb2YgdGhlIHByaXZhdGVEaSBzbG90cyAoYW5kXG4gIC8vIGBlbGVtZW50SW5qZWN0YCwgdmlhIHRoZSBnZXRJbmplY3QgdGh1bmspIHJlYWRzIHRoZW0gYXQgY2FsbCB0aW1lLlxuICBjb25zdCBzeW5jSW5qZWN0V2lyaW5nID0gKCkgPT4ge1xuICAgIGNvbnN0IHJlZ2lzdGVyZWREZWNvcmF0b3JzID0gaW5qZWN0YWJsZXNCeUluamVjdGlvblRva2VuLmdldChcbiAgICAgIGluamVjdGlvbkRlY29yYXRvclRva2VuLFxuICAgICk7XG5cbiAgICBjb25zdCBkZWNvcmF0b3JzQWN0aXZlID1cbiAgICAgIHJlZ2lzdGVyZWREZWNvcmF0b3JzICE9PSB1bmRlZmluZWQgJiYgcmVnaXN0ZXJlZERlY29yYXRvcnMuc2l6ZSA+IDA7XG5cbiAgICBjb25zdCByZWdpc3RlcmVkUHJlSW5qZWN0Q2FsbGJhY2tzID0gaW5qZWN0YWJsZXNCeUluamVjdGlvblRva2VuLmdldChcbiAgICAgIHByZUluamVjdENhbGxiYWNrVG9rZW4sXG4gICAgKTtcblxuICAgIGNvbnN0IHByZUluamVjdEFjdGl2ZSA9XG4gICAgICByZWdpc3RlcmVkUHJlSW5qZWN0Q2FsbGJhY2tzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHJlZ2lzdGVyZWRQcmVJbmplY3RDYWxsYmFja3Muc2l6ZSA+IDA7XG5cbiAgICBlbGVtZW50SW5qZWN0ID0gZGVjb3JhdG9yc0FjdGl2ZVxuICAgICAgPyBkZWNvcmF0ZWRQcml2YXRlSW5qZWN0XG4gICAgICA6IG5vbkRlY29yYXRlZFByaXZhdGVJbmplY3Q7XG5cbiAgICBwcml2YXRlRGkuaW5qZWN0ID0gcHJlSW5qZWN0QWN0aXZlXG4gICAgICA/IGRlY29yYXRvcnNBY3RpdmVcbiAgICAgICAgPyBwcmVJbmplY3REZWNvcmF0ZWRJbmplY3RcbiAgICAgICAgOiBwcmVJbmplY3ROb25EZWNvcmF0ZWRJbmplY3RcbiAgICAgIDogZWxlbWVudEluamVjdDtcblxuICAgIHByaXZhdGVEaS5pbmplY3RXaXRoTWV0YSA9IHByZUluamVjdEFjdGl2ZVxuICAgICAgPyBkZWNvcmF0b3JzQWN0aXZlXG4gICAgICAgID8gcHJlSW5qZWN0RGVjb3JhdGVkSW5qZWN0V2l0aE1ldGFcbiAgICAgICAgOiBwcmVJbmplY3ROb25EZWNvcmF0ZWRJbmplY3RXaXRoTWV0YVxuICAgICAgOiBkZWNvcmF0b3JzQWN0aXZlXG4gICAgICA/IGRlY29yYXRlZFByaXZhdGVJbmplY3RXaXRoTWV0YVxuICAgICAgOiBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0V2l0aE1ldGE7XG5cbiAgICBwcml2YXRlRGkuaW5qZWN0TWFueSA9IHByZUluamVjdEFjdGl2ZVxuICAgICAgPyBwcmVJbmplY3RJbmplY3RNYW55XG4gICAgICA6IG5vbkRlY29yYXRlZFByaXZhdGVJbmplY3RNYW55O1xuXG4gICAgcHJpdmF0ZURpLmluamVjdE1hbnlXaXRoTWV0YSA9IHByZUluamVjdEFjdGl2ZVxuICAgICAgPyBwcmVJbmplY3RJbmplY3RNYW55V2l0aE1ldGFcbiAgICAgIDogbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdE1hbnlXaXRoTWV0YTtcblxuICAgIC8vIGBlbGVtZW50SW5qZWN0YCBpcyBkZWxpYmVyYXRlbHkgbGVmdCB1bndyYXBwZWQ6IGVuZm9yY2VtZW50IGlzIHBlclxuICAgIC8vIGluamVjdCBvcGVyYXRpb24sIGFuZCBhbiBpbmplY3RNYW55J3MgZWxlbWVudHMgd2VyZSBhbHJlYWR5IGNvdmVyZWQgYnlcbiAgICAvLyB0aGUgY2hlY2sgb24gdGhlIG9wZXJhdGlvbiBpdHNlbGYuXG4gICAgcHJpdmF0ZURpLmluamVjdCA9IHdpdGhDb25zdW1wdGlvbkVuZm9yY2VtZW50KHByaXZhdGVEaS5pbmplY3QpO1xuICAgIHByaXZhdGVEaS5pbmplY3RXaXRoTWV0YSA9IHdpdGhDb25zdW1wdGlvbkVuZm9yY2VtZW50KFxuICAgICAgcHJpdmF0ZURpLmluamVjdFdpdGhNZXRhLFxuICAgICk7XG4gICAgcHJpdmF0ZURpLmluamVjdE1hbnkgPSB3aXRoQ29uc3VtcHRpb25FbmZvcmNlbWVudChwcml2YXRlRGkuaW5qZWN0TWFueSk7XG4gICAgcHJpdmF0ZURpLmluamVjdE1hbnlXaXRoTWV0YSA9IHdpdGhDb25zdW1wdGlvbkVuZm9yY2VtZW50KFxuICAgICAgcHJpdmF0ZURpLmluamVjdE1hbnlXaXRoTWV0YSxcbiAgICApO1xuICB9O1xuXG4gIGNvbnN0IGZpcmVQdXJnZUNhbGxiYWNrcyA9IGZpcmVQdXJnZUNhbGxiYWNrc0Zvcih7XG4gICAgZ2V0QXBwbGljYWJsZURlY29yYXRvcnMsXG4gIH0pO1xuXG4gIGNvbnN0IHJhd1JlZ2lzdGVyU2luZ2xlID0gcmVnaXN0ZXJTaW5nbGVGb3Ioe1xuICAgIGluamVjdGFibGVTZXQsXG4gICAgbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLFxuICAgIGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcCxcbiAgICBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4sXG4gICAgaW5qZWN0YWJsZUlkU2V0LFxuICAgIGluamVjdGFibGVBbmRSZWdpc3RyYXRpb25Db250ZXh0LFxuICAgIGNoaWxkcmVuQnlQYXJlbnRNYXAsXG4gICAgZmlyZVB1cmdlQ2FsbGJhY2tzLFxuICB9KTtcblxuICBjb25zdCByZWdpc3RlclNpbmdsZSA9IChpbmplY3RhYmxlLCBjb250ZXh0KSA9PiB7XG4gICAgcmF3UmVnaXN0ZXJTaW5nbGUoaW5qZWN0YWJsZSwgY29udGV4dCk7XG5cbiAgICBsZXQgd2lyaW5nQ2hhbmdlZCA9IGZhbHNlO1xuXG4gICAgaWYgKGlzUmVsYXRlZFRvVG9rZW4oaW5qZWN0YWJsZS5pbmplY3Rpb25Ub2tlbiwgaW5qZWN0aW9uRGVjb3JhdG9yVG9rZW4pKSB7XG4gICAgICBkZWNvcmF0b3JDYWNoZS5pbmplY3Rpb24gPSBudWxsO1xuICAgICAgd2lyaW5nQ2hhbmdlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGlzUmVsYXRlZFRvVG9rZW4oaW5qZWN0YWJsZS5pbmplY3Rpb25Ub2tlbiwgcHJlSW5qZWN0Q2FsbGJhY2tUb2tlbikpIHtcbiAgICAgIGRlY29yYXRvckNhY2hlLnByZUluamVjdCA9IG51bGw7XG4gICAgICB3aXJpbmdDaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAod2lyaW5nQ2hhbmdlZCkge1xuICAgICAgc3luY0luamVjdFdpcmluZygpO1xuICAgIH1cbiAgfTtcblxuICAvLyBDYWxsYmFja3MgcmVnaXN0ZXJlZCBhZ2FpbnN0IGEgc3BlY2lmaWMgdGFyZ2V0IGFsc28gbGFuZCB1bmRlciB0aGVcbiAgLy8gYWJzdHJhY3QgdG9rZW4sIHNvIGFuIGVtcHR5IHNldCBoZXJlIG1lYW5zIG5vIHB1cmdlIGNhbGxiYWNrIGNhbiBhcHBseS5cbiAgY29uc3QgYW55UHVyZ2VDYWxsYmFja3NSZWdpc3RlcmVkID0gKCkgPT4ge1xuICAgIGNvbnN0IHJlZ2lzdGVyZWQgPSBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4uZ2V0KFxuICAgICAgaW5zdGFuY2VQdXJnZUNhbGxiYWNrVG9rZW4sXG4gICAgKTtcblxuICAgIHJldHVybiByZWdpc3RlcmVkICE9PSB1bmRlZmluZWQgJiYgcmVnaXN0ZXJlZC5zaXplID4gMDtcbiAgfTtcblxuICBjb25zdCBwdXJnZUluc3RhbmNlcyA9IHB1cmdlSW5zdGFuY2VzRm9yKHtcbiAgICBnZXRSZWxhdGVkSW5qZWN0YWJsZXMsXG4gICAgaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLFxuICAgIGZpcmVQdXJnZUNhbGxiYWNrcyxcbiAgICBhbnlQdXJnZUNhbGxiYWNrc1JlZ2lzdGVyZWQsXG4gIH0pO1xuXG4gIGNvbnN0IHB1cmdlU3RvcmVkSW5zdGFuY2VzID0gcHVyZ2VTdG9yZWRJbnN0YW5jZXNGb3Ioe1xuICAgIGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcCxcbiAgICBmaXJlUHVyZ2VDYWxsYmFja3MsXG4gICAgYW55UHVyZ2VDYWxsYmFja3NSZWdpc3RlcmVkLFxuICB9KTtcblxuICBjb25zdCBkZXJlZ2lzdGVyID0gZGVyZWdpc3RlckZvcih7XG4gICAgaW5qZWN0TWFueTogbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdE1hbnksXG4gICAgZ2V0QXBwbGljYWJsZURlY29yYXRvcnMsXG4gICAgaW5qZWN0YWJsZVNldCxcbiAgICBpbmplY3RhYmxlQW5kUmVnaXN0cmF0aW9uQ29udGV4dCxcbiAgICBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4sXG4gICAgb3ZlcnJpZGluZ0luamVjdGFibGVzLFxuICAgIHB1cmdlSW5zdGFuY2VzLFxuICAgIGluamVjdGFibGVJZFNldCxcbiAgICBuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAsXG4gICAgY2hpbGRyZW5CeVBhcmVudE1hcCxcbiAgICAvLyBUb2RvOiBnZXQgcmlkIG9mIGZ1bmN0aW9uIHVzYWdlLlxuICAgIGdldERpOiAoKSA9PiBwcml2YXRlRGksXG4gICAgZGVjb3JhdG9yQ2FjaGUsXG4gICAgc3luY0luamVjdFdpcmluZyxcbiAgfSk7XG5cbiAgY29uc3QgcHJpdmF0ZVJlZ2lzdGVyID0gcmVnaXN0ZXJGb3Ioe1xuICAgIHJlZ2lzdGVyU2luZ2xlLFxuICAgIGluamVjdE1hbnk6IG5vbkRlY29yYXRlZFByaXZhdGVJbmplY3RNYW55LFxuICAgIGdldEFwcGxpY2FibGVEZWNvcmF0b3JzLFxuICB9KTtcblxuICBjb25zdCBlYXJseU92ZXJyaWRlID0gZWFybHlPdmVycmlkZUZvcih7XG4gICAgZ2V0UmVsYXRlZEluamVjdGFibGVzLFxuICAgIGFscmVhZHlJbmplY3RlZCxcbiAgICBvdmVycmlkaW5nSW5qZWN0YWJsZXMsXG4gICAgZ2V0TmFtZXNwYWNlZElkLFxuICB9KTtcblxuICBjb25zdCBlYXJseU92ZXJyaWRlMiA9IGVhcmx5T3ZlcnJpZGUyRm9yKHtcbiAgICBnZXRSZWxhdGVkSW5qZWN0YWJsZXMsXG4gICAgYWxyZWFkeUluamVjdGVkLFxuICAgIG92ZXJyaWRpbmdJbmplY3RhYmxlcyxcbiAgICBnZXROYW1lc3BhY2VkSWQsXG4gIH0pO1xuXG4gIGNvbnN0IG92ZXJyaWRlID0gb3ZlcnJpZGVGb3Ioe1xuICAgIGdldFJlbGF0ZWRJbmplY3RhYmxlcyxcbiAgICBlYXJseU92ZXJyaWRlLFxuICB9KTtcblxuICBjb25zdCBvdmVycmlkZTIgPSBvdmVycmlkZUZvcih7XG4gICAgZ2V0UmVsYXRlZEluamVjdGFibGVzLFxuICAgIGVhcmx5T3ZlcnJpZGU6IGVhcmx5T3ZlcnJpZGUyLFxuICB9KTtcblxuICBjb25zdCB1bm92ZXJyaWRlID0gdW5vdmVycmlkZUZvcih7XG4gICAgb3ZlcnJpZGluZ0luamVjdGFibGVzLFxuICAgIGdldFJlbGF0ZWRJbmplY3RhYmxlcyxcbiAgICBnZXROYW1lc3BhY2VkSWQsXG4gIH0pO1xuXG4gIGNvbnN0IHB1cmdlQWxsQnV0T3ZlcnJpZGVzID0gKCkgPT4ge1xuICAgIGluamVjdGFibGVTZXQuY2xlYXIoKTtcbiAgICBhbHJlYWR5SW5qZWN0ZWQuY2xlYXIoKTtcbiAgICBpbmplY3RhYmxlSWRTZXQuY2xlYXIoKTtcbiAgICBpbmplY3RhYmxlQW5kUmVnaXN0cmF0aW9uQ29udGV4dC5jbGVhcigpO1xuICAgIGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcC5jbGVhcigpO1xuICAgIGluamVjdGFibGVzQnlJbmplY3Rpb25Ub2tlbi5jbGVhcigpO1xuICAgIG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcC5jbGVhcigpO1xuICAgIGNoaWxkcmVuQnlQYXJlbnRNYXAuY2xlYXIoKTtcbiAgICBkZWNvcmF0b3JDYWNoZS5pbmplY3Rpb24gPSBudWxsO1xuICAgIGRlY29yYXRvckNhY2hlLnByZUluamVjdCA9IG51bGw7XG4gICAgc3luY0luamVjdFdpcmluZygpO1xuICB9O1xuXG4gIC8vIFRoZSBpbW1lZGlhdGUgcGFyZW50IGlzIHRoZSBsYXN0IHJlZ2lzdHJhdGlvbiBjb250ZXh0IGl0ZW07IGEgbWlzc2luZ1xuICAvLyBlbnRyeSBvciBhIGNvbnRhaW5lci1sZXZlbCBwYXJlbnQgbm9ybWFsaXplcyB0byByb290SW5qZWN0YWJsZSBzbyB0aGF0XG4gIC8vIHNjb3BlIGNvbXBhcmlzb25zIHdvcmsgdW5pZm9ybWx5IGZvciByb290IGFuZCBuZXN0ZWQgc2NvcGVzLlxuICBjb25zdCBnZXRJbW1lZGlhdGVTY29wZU9mID0gaW5qZWN0YWJsZSA9PiB7XG4gICAgY29uc3QgY29udGV4dCA9IGluamVjdGFibGVBbmRSZWdpc3RyYXRpb25Db250ZXh0LmdldChpbmplY3RhYmxlKTtcbiAgICBjb25zdCBpbW1lZGlhdGVQYXJlbnQgPSBjb250ZXh0Py5bY29udGV4dC5sZW5ndGggLSAxXT8uaW5qZWN0YWJsZTtcblxuICAgIHJldHVybiAhaW1tZWRpYXRlUGFyZW50IHx8IGltbWVkaWF0ZVBhcmVudC5hbGlhc1R5cGUgPT09ICdjb250YWluZXInXG4gICAgICA/IHJvb3RJbmplY3RhYmxlXG4gICAgICA6IGltbWVkaWF0ZVBhcmVudDtcbiAgfTtcblxuICBjb25zdCBwcml2YXRlRGkgPSB7XG4gICAgLy8gU3dhcHBlZCBieSBzeW5jSW5qZWN0V2lyaW5nOiB0aGUgZGVjb3JhdGVkIHZhcmlhbnRzIGFyZSB3aXJlZFxuICAgIC8vIGluIG9ubHkgd2hpbGUgYXQgbGVhc3Qgb25lIGluamVjdGlvbiBkZWNvcmF0b3IgaXMgcmVnaXN0ZXJlZCwgc28gdGhlXG4gICAgLy8gY29tbW9uIG5vLWRlY29yYXRvciBjYXNlIHBheXMgbm8gd3JhcHBlciBmcmFtZSBhdCBhbGwuXG4gICAgaW5qZWN0OiBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0LFxuICAgIGluamVjdFdpdGhNZXRhOiBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0V2l0aE1ldGEsXG4gICAgaW5qZWN0TWFueTogbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdE1hbnksXG4gICAgaW5qZWN0TWFueVdpdGhNZXRhOiBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0TWFueVdpdGhNZXRhLFxuXG4gICAgaW5qZWN0RmFjdG9yeTpcbiAgICAgIGFsaWFzID0+XG4gICAgICAoLi4ucGFyYW1zKSA9PlxuICAgICAgICBwdWJsaWNJbmplY3QoYWxpYXMsIC4uLnBhcmFtcyksXG5cbiAgICByZWdpc3RlcjogcHJpdmF0ZVJlZ2lzdGVyLFxuICAgIGRlcmVnaXN0ZXIsXG4gICAgb3ZlcnJpZGUsXG4gICAgb3ZlcnJpZGUyLFxuICAgIGVhcmx5T3ZlcnJpZGUsXG4gICAgZWFybHlPdmVycmlkZTIsXG4gICAgdW5vdmVycmlkZSxcblxuICAgIHJlc2V0OiAoKSA9PiB7XG4gICAgICBvdmVycmlkaW5nSW5qZWN0YWJsZXMuY2xlYXIoKTtcbiAgICB9LFxuXG4gICAgcGVybWl0U2lkZUVmZmVjdHM6IGFsaWFzID0+IHtcbiAgICAgIGlmIChhbGlhcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHNpZGVFZmZlY3RzQXJlUHJldmVudGVkID0gZmFsc2U7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZ2V0UmVsYXRlZEluamVjdGFibGVzKGFsaWFzKS5mb3JFYWNoKGluamVjdGFibGUgPT5cbiAgICAgICAgaW5qZWN0YWJsZXNXaXRoUGVybWl0dGVkU2lkZUVmZmVjdHMuYWRkKGluamVjdGFibGUpLFxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgcHVyZ2U6IHB1cmdlSW5zdGFuY2VzLFxuXG4gICAgc2NvcGVkUHVyZ2U6IChzY29wZUluamVjdGFibGUsIGFsaWFzLCAuLi5rZXlQYXJ0cykgPT4ge1xuICAgICAgLy8gV2l0aG91dCBhbiBhbGlhcywgdGhlIHNjb3BlJ3Mgb3duIGluc3RhbmNlcyBhbmQgdGhvc2Ugb2Ygd2hhdGV2ZXIgaXRcbiAgICAgIC8vIHJlZ2lzdGVyZWQgZGlyZWN0bHkuXG4gICAgICBpZiAoYWxpYXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IGNoaWxkcmVuQnlQYXJlbnRNYXAuZ2V0KHNjb3BlSW5qZWN0YWJsZSk7XG5cbiAgICAgICAgcHVyZ2VTdG9yZWRJbnN0YW5jZXMoXG4gICAgICAgICAgY2hpbGRyZW4gPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyBbc2NvcGVJbmplY3RhYmxlXVxuICAgICAgICAgICAgOiBbc2NvcGVJbmplY3RhYmxlLCAuLi5jaGlsZHJlbl0sXG4gICAgICAgICAga2V5UGFydHMsXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBpbmplY3RhYmxlcyA9IGdldFJlbGF0ZWRJbmplY3RhYmxlcyhhbGlhcyk7XG4gICAgICBjb25zdCBhbGxvd2VkQ2hpbGRyZW4gPSBjaGlsZHJlbkJ5UGFyZW50TWFwLmdldChzY29wZUluamVjdGFibGUpO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluamVjdGFibGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGluamVjdGFibGUgPSBpbmplY3RhYmxlc1tpXTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgaW5qZWN0YWJsZSAhPT0gc2NvcGVJbmplY3RhYmxlICYmXG4gICAgICAgICAgIWFsbG93ZWRDaGlsZHJlbj8uaGFzKGluamVjdGFibGUpXG4gICAgICAgICkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBUcmllZCB0byBwdXJnZSBcIiR7bmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLmdldChcbiAgICAgICAgICAgICAgaW5qZWN0YWJsZSxcbiAgICAgICAgICAgICl9XCIgZnJvbSBcIiR7bmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLmdldChcbiAgICAgICAgICAgICAgc2NvcGVJbmplY3RhYmxlLFxuICAgICAgICAgICAgKX1cIiwgYnV0IGl0IGlzIG5vdCB3aXRoaW4gaXRzIHJlZ2lzdHJhdGlvbiBjb250ZXh0IHRyZWUuYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHB1cmdlU3RvcmVkSW5zdGFuY2VzKGluamVjdGFibGVzLCBrZXlQYXJ0cyk7XG4gICAgfSxcblxuICAgIHB1cmdlQWxsQnV0T3ZlcnJpZGVzLFxuICAgIGhhc1JlZ2lzdHJhdGlvbnM6IGFsaWFzID0+ICEhZ2V0UmVsYXRlZEluamVjdGFibGVzKGFsaWFzKS5sZW5ndGgsXG4gICAgZ2V0TnVtYmVyT2ZSZWdpc3RyYXRpb25zOiBhbGlhcyA9PiBnZXRSZWxhdGVkSW5qZWN0YWJsZXMoYWxpYXMpLmxlbmd0aCxcblxuICAgIHJlZ2lzdGVyZWRJblNjb3BlT2Y6IChzY29wZUluamVjdGFibGUsIGFsaWFzKSA9PlxuICAgICAgZ2V0UmVsYXRlZEluamVjdGFibGVzKGFsaWFzKS5zb21lKFxuICAgICAgICBpbmplY3RhYmxlID0+IGdldEltbWVkaWF0ZVNjb3BlT2YoaW5qZWN0YWJsZSkgPT09IHNjb3BlSW5qZWN0YWJsZSxcbiAgICAgICksXG5cbiAgICByZWdpc3RlcmVkSW5TdWJ0cmVlT2Y6IChzY29wZUluamVjdGFibGUsIGFsaWFzKSA9PlxuICAgICAgZ2V0UmVsYXRlZEluamVjdGFibGVzKGFsaWFzKS5zb21lKGluamVjdGFibGUgPT4ge1xuICAgICAgICBsZXQgc2NvcGUgPSBnZXRJbW1lZGlhdGVTY29wZU9mKGluamVjdGFibGUpO1xuXG4gICAgICAgIHdoaWxlIChzY29wZSAhPT0gc2NvcGVJbmplY3RhYmxlICYmIHNjb3BlICE9PSByb290SW5qZWN0YWJsZSkge1xuICAgICAgICAgIHNjb3BlID0gZ2V0SW1tZWRpYXRlU2NvcGVPZihzY29wZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc2NvcGUgPT09IHNjb3BlSW5qZWN0YWJsZTtcbiAgICAgIH0pLFxuXG4gICAgZ2V0TnVtYmVyT2ZJbnN0YW5jZXM6ICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgICAgZm9yIChjb25zdCBbaW5qZWN0YWJsZSwgc3RvcmVkXSBvZiBpbnN0YW5jZXNCeUluamVjdGFibGVNYXApIHtcbiAgICAgICAgY29uc3QgbmFtZXNwYWNlZElkID0gbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLmdldChpbmplY3RhYmxlKTtcbiAgICAgICAgaWYgKCFuYW1lc3BhY2VkSWQpIGNvbnRpbnVlO1xuXG4gICAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICAgIGlmIChpc0NvbXBvc2l0ZVN0b3JhZ2Uoc3RvcmVkKSkge1xuICAgICAgICAgIGZvciAoY29uc3QgXyBvZiBzdG9yZWQudmFsdWVzKCkpIGNvdW50Kys7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY291bnQgPSAxO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb3VudCA+IDApIHJlc3VsdFtuYW1lc3BhY2VkSWRdID0gY291bnQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG4gIH07XG5cbiAgLy8gVGhlIHNsb3RzIHN0YXJ0IG91dCBob2xkaW5nIHRoZSBiYXJlIG9wZXJhdGlvbnM7IHdpcmUgdGhlbSBvbmNlIHVwLWZyb250XG4gIC8vIHNvIGVuZm9yY2VtZW50IGFwcGxpZXMgZXZlbiBpbiBhIGNvbnRhaW5lciB3aGVyZSBub3RoaW5nIGlzIHJlZ2lzdGVyZWQuXG4gIHN5bmNJbmplY3RXaXJpbmcoKTtcblxuICBjb25zdCBwdWJsaWNJbmplY3QgPSAoYWxpYXMsIC4uLmFyZ3MpID0+XG4gICAgcHJpdmF0ZURpLmluamVjdCh7XG4gICAgICBhbGlhcyxcbiAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBhcmdzLFxuICAgICAgaW5qZWN0aW5nSW5qZWN0YWJsZTogcm9vdEluamVjdGFibGUsXG4gICAgfSk7XG5cbiAgY29uc3QgcHVibGljSW5qZWN0TWFueSA9IChhbGlhcywgLi4uYXJncykgPT5cbiAgICBwcml2YXRlRGkuaW5qZWN0TWFueSh7XG4gICAgICBhbGlhcyxcbiAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBhcmdzLFxuICAgICAgaW5qZWN0aW5nSW5qZWN0YWJsZTogcm9vdEluamVjdGFibGUsXG4gICAgfSk7XG5cbiAgY29uc3QgcHVibGljSW5qZWN0V2l0aE1ldGEgPSAoYWxpYXMsIC4uLmFyZ3MpID0+XG4gICAgcHJpdmF0ZURpLmluamVjdFdpdGhNZXRhKHtcbiAgICAgIGFsaWFzLFxuICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnM6IGFyZ3MsXG4gICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiByb290SW5qZWN0YWJsZSxcbiAgICB9KTtcblxuICBjb25zdCBwdWJsaWNJbmplY3RNYW55V2l0aE1ldGEgPSAoYWxpYXMsIC4uLmFyZ3MpID0+XG4gICAgcHJpdmF0ZURpLmluamVjdE1hbnlXaXRoTWV0YSh7XG4gICAgICBhbGlhcyxcbiAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBhcmdzLFxuICAgICAgaW5qZWN0aW5nSW5qZWN0YWJsZTogcm9vdEluamVjdGFibGUsXG4gICAgfSk7XG5cbiAgY29uc3QgcHVibGljRGkgPSB7XG4gICAgLi4ucHJpdmF0ZURpLFxuXG4gICAgaW5qZWN0OiBwdWJsaWNJbmplY3QsXG4gICAgaW5qZWN0V2l0aE1ldGE6IHB1YmxpY0luamVjdFdpdGhNZXRhLFxuICAgIGluamVjdE1hbnk6IHB1YmxpY0luamVjdE1hbnksXG4gICAgaW5qZWN0TWFueVdpdGhNZXRhOiBwdWJsaWNJbmplY3RNYW55V2l0aE1ldGEsXG5cbiAgICBpbmplY3QyOlxuICAgICAgYWxpYXMgPT5cbiAgICAgICguLi5wYXJhbXMpID0+XG4gICAgICAgIHB1YmxpY0luamVjdChhbGlhcywgLi4ucGFyYW1zKSxcblxuICAgIGluamVjdE1hbnkyOlxuICAgICAgYWxpYXMgPT5cbiAgICAgICguLi5wYXJhbXMpID0+XG4gICAgICAgIHB1YmxpY0luamVjdE1hbnkoYWxpYXMsIC4uLnBhcmFtcyksXG5cbiAgICAvLyBSZXNvbHZlcyBwZXIgY2FsbCBsaWtlIGluamVjdE1hbnksIGJ1dCB1bndyYXBzIHRvIHRoZSBzaW5nbGUgaW5zdGFuY2Ugb3JcbiAgICAvLyB1bmRlZmluZWQgXHUyMDE0IHRoZSAnemVyby1vci1vbmUnIHVwcGVyIGJvdW5kIGd1YXJhbnRlZXMgYXQgbW9zdCBvbmUuXG4gICAgaW5qZWN0TWF5YmUyOiBhbGlhcyA9PiB7XG4gICAgICBjaGVja0Zvck5vbk1heWJlQ2FyZGluYWxpdHkoYWxpYXMsIHJvb3RJbmplY3RhYmxlKTtcblxuICAgICAgcmV0dXJuICguLi5wYXJhbXMpID0+IHB1YmxpY0luamVjdE1hbnkoYWxpYXMsIC4uLnBhcmFtcylbMF07XG4gICAgfSxcblxuICAgIGluamVjdFdpdGhNZXRhMjpcbiAgICAgIGFsaWFzID0+XG4gICAgICAoLi4ucGFyYW1zKSA9PlxuICAgICAgICBwdWJsaWNJbmplY3RXaXRoTWV0YShhbGlhcywgLi4ucGFyYW1zKSxcblxuICAgIGluamVjdE1hbnlXaXRoTWV0YTI6XG4gICAgICBhbGlhcyA9PlxuICAgICAgKC4uLnBhcmFtcykgPT5cbiAgICAgICAgcHVibGljSW5qZWN0TWFueVdpdGhNZXRhKGFsaWFzLCAuLi5wYXJhbXMpLFxuXG4gICAgLy8gaW5qZWN0TWF5YmUyIG92ZXIgdGhlIHdpdGgtbWV0YSBwbGFuZTogdW53cmFwcyB0byB0aGUgc2luZ2xlXG4gICAgLy8gbWV0YS13cmFwcGVkIGluc3RhbmNlIG9yIHVuZGVmaW5lZC5cbiAgICBpbmplY3RNYXliZVdpdGhNZXRhMjogYWxpYXMgPT4ge1xuICAgICAgY2hlY2tGb3JOb25NYXliZUNhcmRpbmFsaXR5KGFsaWFzLCByb290SW5qZWN0YWJsZSk7XG5cbiAgICAgIHJldHVybiAoLi4ucGFyYW1zKSA9PiBwdWJsaWNJbmplY3RNYW55V2l0aE1ldGEoYWxpYXMsIC4uLnBhcmFtcylbMF07XG4gICAgfSxcblxuICAgIHJlZ2lzdGVyOiAoLi4uaW5qZWN0YWJsZXMpID0+IHtcbiAgICAgIHByaXZhdGVEaS5yZWdpc3Rlcih7XG4gICAgICAgIGluamVjdGFibGVzLFxuICAgICAgICBjb250ZXh0OiBbY29udGFpbmVyUm9vdENvbnRleHRJdGVtXSxcbiAgICAgICAgc291cmNlOiByb290SW5qZWN0YWJsZSxcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBkZXJlZ2lzdGVyOiAoLi4uaW5qZWN0YWJsZXMpID0+IHtcbiAgICAgIHByaXZhdGVEaS5kZXJlZ2lzdGVyKHtcbiAgICAgICAgaW5qZWN0YWJsZXMsXG4gICAgICAgIGNvbnRleHQ6IFtjb250YWluZXJSb290Q29udGV4dEl0ZW1dLFxuICAgICAgICBzb3VyY2U6IHJvb3RJbmplY3RhYmxlLFxuICAgICAgfSk7XG4gICAgfSxcblxuICAgIHJlZ2lzdGVyZWRJbkxvY2FsU2NvcGU6IGFsaWFzID0+XG4gICAgICBwcml2YXRlRGkucmVnaXN0ZXJlZEluU2NvcGVPZihyb290SW5qZWN0YWJsZSwgYWxpYXMpLFxuXG4gICAgdmFsaWRhdGU6IHZhbGlkYXRlRm9yKHtcbiAgICAgIGNvbnRhaW5lcklkLFxuICAgICAgaW5qZWN0YWJsZVNldCxcbiAgICAgIGluamVjdGFibGVzQnlJbmplY3Rpb25Ub2tlbixcbiAgICAgIG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcCxcbiAgICAgIG92ZXJyaWRpbmdJbmplY3RhYmxlcyxcbiAgICB9KSxcblxuICAgIHJlZ2lzdGVyZWRJbkxvY2FsU2NvcGVTdWJ0cmVlOiBhbGlhcyA9PlxuICAgICAgcHJpdmF0ZURpLnJlZ2lzdGVyZWRJblN1YnRyZWVPZihyb290SW5qZWN0YWJsZSwgYWxpYXMpLFxuICB9O1xuXG4gIHJldHVybiBwdWJsaWNEaTtcbn07XG4iLCAiaW1wb3J0IHsgaWRlbnRpdHksIGNvbnN0YW50IH0gZnJvbSAnbG9kYXNoL2ZwJztcblxuZXhwb3J0IGNvbnN0IGdldFR5cGVkU3BlY2lmaWVyID0gY29uc3RhbnQoaWRlbnRpdHkpO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7O0FDQU8sSUFBTSx1QkFBdUIsT0FBTyx5QkFBeUI7QUFDN0QsSUFBTSxvQkFBb0IsT0FBTyxxQkFBcUI7QUFFN0QsSUFBTyx3QkFBUTtBQUFBLEVBQ2IsV0FBVztBQUFBLElBQ1QsSUFBSTtBQUFBLElBRUosZ0JBQWdCLE1BQU07QUFBQSxFQUN4QjtBQUFBLEVBRUEsZ0JBQWdCLENBQUMsRUFBRSxlQUFlLE9BQU87QUFBQSxJQUN2QyxJQUFJO0FBQUEsSUFDSjtBQUFBLEVBQ0Y7QUFBQSxFQUVBLFdBQVc7QUFBQSxJQUNULElBQUk7QUFBQSxJQUNKLGdCQUFnQixNQUFNO0FBQUEsRUFDeEI7QUFDRjs7O0FDbkJPLElBQU0scUJBQXFCLE9BQU8sZUFBZTtBQUNqRCxJQUFNLGtCQUFrQixJQUFJLFVBQVU7QUFBQSxFQUMzQyxDQUFDLGtCQUFrQixHQUFHO0FBQUEsRUFDdEI7QUFDRjtBQUVPLElBQU0saUJBQWlCLFdBQzVCLFNBQVMsTUFBTSxrQkFBa0IsTUFBTTs7O0FDTGxDLElBQU0sbUJBQW1CO0FBRWhDLElBQU8sd0JBQVEsQ0FBQyxFQUFFLFlBQVksc0JBQWMsV0FBVyxHQUFHLFdBQVcsT0FBTztBQUFBLEVB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QVUsbUJBQW1CO0FBQUEsSUFDM0I7QUFBQSxJQUNBLHlCQUF5QjtBQUFBLElBQ3pCLHFCQUFxQjtBQUFBLEVBQ3ZCLENBQUM7QUFFSCxRQUFNLFdBQVc7QUFBQSxJQUNmLEdBQUc7QUFBQSxJQUVILFFBQVE7QUFBQSxJQUNSLGdCQUFnQjtBQUFBLElBQ2hCLFlBQVk7QUFBQSxJQUNaLG9CQUFvQjtBQUFBLElBRXBCLFNBQ0UsV0FDQSxJQUFJLFdBQ0YsYUFBYSxPQUFPLEdBQUcsTUFBTTtBQUFBLElBRWpDLGFBQ0UsV0FDQSxJQUFJLFdBQ0YsaUJBQWlCLE9BQU8sR0FBRyxNQUFNO0FBQUE7QUFBQTtBQUFBLElBSXJDLGNBQWMsV0FBUztBQUNyQixrQ0FBNEIsT0FBTyxjQUFjO0FBRWpELGFBQU8sSUFBSSxXQUFXLGlCQUFpQixPQUFPLEdBQUcsTUFBTSxFQUFFLENBQUM7QUFBQSxJQUM1RDtBQUFBLElBRUEsaUJBQ0UsV0FDQSxJQUFJLFdBQ0YscUJBQXFCLE9BQU8sR0FBRyxNQUFNO0FBQUEsSUFFekMscUJBQ0UsV0FDQSxJQUFJLFdBQ0YseUJBQXlCLE9BQU8sR0FBRyxNQUFNO0FBQUE7QUFBQTtBQUFBLElBSTdDLHNCQUFzQixXQUFTO0FBQzdCLGtDQUE0QixPQUFPLGNBQWM7QUFFakQsYUFBTyxJQUFJLFdBQVcseUJBQXlCLE9BQU8sR0FBRyxNQUFNLEVBQUUsQ0FBQztBQUFBLElBQ3BFO0FBQUEsSUFFQSxVQUFVLElBQUksZ0JBQWdCO0FBQzVCLGdCQUFVLFNBQVM7QUFBQSxRQUNqQjtBQUFBLFFBQ0EsU0FBUyxDQUFDLHdCQUF3QjtBQUFBLFFBQ2xDLFFBQVE7QUFBQSxNQUNWLENBQUM7QUFBQSxJQUNIO0FBQUEsSUFFQSxZQUFZLElBQUksZ0JBQWdCO0FBQzlCLGdCQUFVLFdBQVc7QUFBQSxRQUNuQjtBQUFBLFFBQ0EsU0FBUyxDQUFDLHdCQUF3QjtBQUFBLFFBQ2xDLFFBQVE7QUFBQSxNQUNWLENBQUM7QUFBQSxJQUNIO0FBQUEsSUFFQSx3QkFBd0IsV0FDdEIsVUFBVSxvQkFBb0IsZ0JBQWdCLEtBQUs7QUFBQSxJQUVyRCxVQUFVLFlBQVk7QUFBQSxNQUNwQjtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxJQUNGLENBQUM7QUFBQSxJQUVELCtCQUErQixXQUM3QixVQUFVLHNCQUFzQixnQkFBZ0IsS0FBSztBQUFBLEVBQ3pEO0FBRUEsU0FBTztBQUNUOzs7QUNubkJBLGdCQUFtQztBQUU1QixJQUFNLHdCQUFvQixvQkFBUyxrQkFBUTs7O0F2Q3NCM0MsSUFBTSxnQ0FBZ0M7IiwKICAibmFtZXMiOiBbImluc3RhbnRpYXRlIiwgImNoaWxkTWFwIiwgImRlbGV0ZWQiLCAibWluaW1hbERpIiwgIm5ld0luc3RhbmNlIiwgImNhbGxiYWNrcyIsICJFTVBUWSJdCn0K