sonamu 0.7.15 → 0.7.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ai/providers/rtzr/error.d.ts +1 -1
- package/dist/ai/providers/rtzr/error.d.ts.map +1 -1
- package/dist/api/config.d.ts +1 -0
- package/dist/api/config.d.ts.map +1 -1
- package/dist/api/config.js +1 -1
- package/dist/api/decorators.d.ts +1 -1
- package/dist/api/decorators.d.ts.map +1 -1
- package/dist/api/decorators.js +1 -1
- package/dist/api/sonamu.d.ts +3 -1
- package/dist/api/sonamu.d.ts.map +1 -1
- package/dist/api/sonamu.js +51 -40
- package/dist/database/base-model.d.ts +16 -6
- package/dist/database/base-model.d.ts.map +1 -1
- package/dist/database/base-model.js +44 -3
- package/dist/database/base-model.types.d.ts +29 -48
- package/dist/database/base-model.types.d.ts.map +1 -1
- package/dist/database/base-model.types.js +12 -2
- package/dist/database/puri.d.ts +2 -1
- package/dist/database/puri.d.ts.map +1 -1
- package/dist/database/puri.js +2 -1
- package/dist/database/puri.types.d.ts +3 -3
- package/dist/database/puri.types.d.ts.map +1 -1
- package/dist/database/puri.types.js +1 -1
- package/dist/entity/entity-manager.d.ts +8 -4
- package/dist/entity/entity-manager.d.ts.map +1 -1
- package/dist/entity/entity.d.ts +10 -1
- package/dist/entity/entity.d.ts.map +1 -1
- package/dist/entity/entity.js +84 -39
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/syncer/checksum.d.ts +8 -3
- package/dist/syncer/checksum.d.ts.map +1 -1
- package/dist/syncer/checksum.js +17 -9
- package/dist/syncer/code-generator.js +7 -2
- package/dist/syncer/syncer.d.ts +6 -6
- package/dist/syncer/syncer.d.ts.map +1 -1
- package/dist/syncer/syncer.js +27 -13
- package/dist/tasks/workflow-manager.d.ts +3 -3
- package/dist/tasks/workflow-manager.d.ts.map +1 -1
- package/dist/tasks/workflow-manager.js +15 -11
- package/dist/template/implementations/generated.template.d.ts.map +1 -1
- package/dist/template/implementations/generated.template.js +8 -6
- package/dist/template/implementations/model.template.js +5 -5
- package/dist/template/implementations/services.template.d.ts +17 -0
- package/dist/template/implementations/services.template.d.ts.map +1 -0
- package/dist/template/implementations/services.template.js +159 -0
- package/dist/template/implementations/view_form.template.js +2 -2
- package/dist/template/implementations/view_id_async_select.template.js +2 -2
- package/dist/template/implementations/view_list.template.js +5 -5
- package/dist/types/types.d.ts +43 -25
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/types.js +29 -17
- package/dist/ui/ai-api.d.ts +2 -0
- package/dist/ui/ai-api.d.ts.map +1 -1
- package/dist/ui/ai-api.js +43 -49
- package/dist/ui/ai-client.d.ts +10 -0
- package/dist/ui/ai-client.d.ts.map +1 -1
- package/dist/ui/ai-client.js +457 -437
- package/dist/ui/api.d.ts.map +1 -1
- package/dist/ui/api.js +14 -3
- package/dist/ui-web/assets/{index-J9MCfjCd.js → index-DzqUrTB-.js} +56 -59
- package/dist/ui-web/index.html +1 -1
- package/package.json +12 -8
- package/src/api/config.ts +3 -0
- package/src/api/decorators.ts +6 -1
- package/src/api/sonamu.ts +71 -52
- package/src/database/base-model.ts +66 -11
- package/src/database/base-model.types.ts +79 -76
- package/src/database/puri.ts +5 -1
- package/src/database/puri.types.ts +3 -6
- package/src/entity/entity.ts +83 -34
- package/src/index.ts +1 -0
- package/src/shared/app.shared.ts.txt +1 -1
- package/src/shared/web.shared.ts.txt +0 -43
- package/src/syncer/checksum.ts +31 -9
- package/src/syncer/code-generator.ts +8 -1
- package/src/syncer/syncer.ts +38 -26
- package/src/tasks/workflow-manager.ts +16 -12
- package/src/template/implementations/generated.template.ts +17 -3
- package/src/template/implementations/model.template.ts +4 -4
- package/src/template/implementations/services.template.ts +226 -0
- package/src/template/implementations/view_form.template.ts +1 -1
- package/src/template/implementations/view_id_async_select.template.ts +1 -1
- package/src/template/implementations/view_list.template.ts +4 -4
- package/src/types/types.ts +33 -16
- package/src/ui/ai-api.ts +61 -60
- package/src/ui/ai-client.ts +535 -499
- package/src/ui/api.ts +14 -2
- package/src/ui/entity.instructions.md +536 -0
- package/dist/template/implementations/service.template.d.ts +0 -29
- package/dist/template/implementations/service.template.d.ts.map +0 -1
- package/dist/template/implementations/service.template.js +0 -202
- package/dist/ui-web/assets/provider-utils_false-BKJD46kk.js +0 -1
- package/dist/ui-web/assets/provider-utils_false-Bu5lmX18.js +0 -1
- package/src/template/implementations/service.template.ts +0 -328
package/dist/entity/entity.js
CHANGED
|
@@ -5,7 +5,7 @@ import path from "path";
|
|
|
5
5
|
import { group, unique } from "radashi";
|
|
6
6
|
import { z } from "zod";
|
|
7
7
|
import { Sonamu } from "../api/sonamu.js";
|
|
8
|
-
import { isBelongsToOneRelationProp, isEnumProp, isHasManyRelationProp, isManyToManyRelationProp, isOneToOneRelationProp, isRelationProp, isVirtualProp } from "../types/types.js";
|
|
8
|
+
import { isBelongsToOneRelationProp, isEnumProp, isHasManyRelationProp, isInternalSubsetField, isManyToManyRelationProp, isOneToOneRelationProp, isRelationProp, isVirtualCodeProp, isVirtualProp, normalizeSubsetField } from "../types/types.js";
|
|
9
9
|
import { importMembers } from "../utils/esm-utils.js";
|
|
10
10
|
import { formatCode } from "../utils/formatter.js";
|
|
11
11
|
import { exists } from "../utils/fs-utils.js";
|
|
@@ -23,6 +23,7 @@ export class Entity {
|
|
|
23
23
|
relations;
|
|
24
24
|
indexes;
|
|
25
25
|
subsets;
|
|
26
|
+
subsetsInternal;
|
|
26
27
|
types = {};
|
|
27
28
|
enums = {};
|
|
28
29
|
enumLabels = {};
|
|
@@ -60,8 +61,13 @@ export class Entity {
|
|
|
60
61
|
}
|
|
61
62
|
// indexes
|
|
62
63
|
this.indexes = indexes ?? [];
|
|
63
|
-
// subsets
|
|
64
|
-
this.subsets =
|
|
64
|
+
// subsets: SubsetField[]를 파싱하여 subsets(일반)와 subsetsInternal(internal)로 분리
|
|
65
|
+
this.subsets = {};
|
|
66
|
+
this.subsetsInternal = {};
|
|
67
|
+
for (const [key, fields] of Object.entries(subsets ?? {})){
|
|
68
|
+
this.subsets[key] = fields.filter((f)=>!isInternalSubsetField(f)).map(normalizeSubsetField);
|
|
69
|
+
this.subsetsInternal[key] = fields.filter(isInternalSubsetField).map(normalizeSubsetField);
|
|
70
|
+
}
|
|
65
71
|
// enums
|
|
66
72
|
this.enumLabels = enums ?? {};
|
|
67
73
|
this.enums = Object.fromEntries(Object.entries(this.enumLabels).map(([key, enumLabel])=>{
|
|
@@ -78,9 +84,17 @@ export class Entity {
|
|
|
78
84
|
};
|
|
79
85
|
}
|
|
80
86
|
/**
|
|
87
|
+
* 쿼리용 서브셋 필드를 반환합니다 (subsets + subsetsInternal 합침)
|
|
88
|
+
*/ getSubsetFieldsForQuery(subsetKey) {
|
|
89
|
+
return [
|
|
90
|
+
...this.subsets[subsetKey] ?? [],
|
|
91
|
+
...this.subsetsInternal[subsetKey] ?? []
|
|
92
|
+
];
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
81
95
|
* 주어진 이름(subsetKey)의 subset을 실제로 가져오는 Puri 코드 구현체 string을 반환합니다.
|
|
82
96
|
*/ getPuriSubsetQuery(subsetKey) {
|
|
83
|
-
const subset = this.
|
|
97
|
+
const subset = this.getSubsetFieldsForQuery(subsetKey);
|
|
84
98
|
const subsetQuery = this.resolveSubsetQuery("", subset);
|
|
85
99
|
const lines = [];
|
|
86
100
|
// from
|
|
@@ -190,7 +204,7 @@ export class Entity {
|
|
|
190
204
|
}
|
|
191
205
|
}
|
|
192
206
|
getPuriLoaderQuery(subsetKey) {
|
|
193
|
-
const subset = this.
|
|
207
|
+
const subset = this.getSubsetFieldsForQuery(subsetKey);
|
|
194
208
|
const { loaders } = this.resolveSubsetQuery("", subset);
|
|
195
209
|
const lines = [
|
|
196
210
|
`[`
|
|
@@ -253,7 +267,7 @@ export class Entity {
|
|
|
253
267
|
/*
|
|
254
268
|
subset SELECT/JOIN/LOADER 결과 리턴
|
|
255
269
|
*/ getSubsetQuery(subsetKey) {
|
|
256
|
-
const subset = this.
|
|
270
|
+
const subset = this.getSubsetFieldsForQuery(subsetKey);
|
|
257
271
|
const result = this.resolveSubsetQuery("", subset);
|
|
258
272
|
return result;
|
|
259
273
|
}
|
|
@@ -276,11 +290,13 @@ export class Entity {
|
|
|
276
290
|
// 현재 테이블 필드셋은 select, virtual에 추가하고 리턴
|
|
277
291
|
if (groupKey === "") {
|
|
278
292
|
const realFields = fields.filter((field)=>!isVirtualProp(this.propsDict[field]));
|
|
279
|
-
|
|
293
|
+
// virtualType: "code" (또는 undefined)인 virtual prop만 r.virtual에 추가
|
|
294
|
+
// virtualType: "query"인 경우 사용자가 appendSelect로 직접 추가하므로 제외
|
|
295
|
+
const virtualCodeFields = fields.filter((field)=>isVirtualCodeProp(this.propsDict[field]));
|
|
280
296
|
if (prefix === "") {
|
|
281
297
|
// 현재 테이블인 경우
|
|
282
298
|
r.select = r.select.concat(realFields.map((field)=>`${this.table}.${field}`));
|
|
283
|
-
r.virtual = r.virtual.concat(
|
|
299
|
+
r.virtual = r.virtual.concat(virtualCodeFields);
|
|
284
300
|
} else {
|
|
285
301
|
// 넘어온 테이블인 경우
|
|
286
302
|
r.select = r.select.concat(realFields.map((field)=>`${prefix}.${field} as ${prefix}__${field}`));
|
|
@@ -448,18 +464,6 @@ export class Entity {
|
|
|
448
464
|
// 일반 prop 처리
|
|
449
465
|
if (key === "") {
|
|
450
466
|
return group.map((propName)=>{
|
|
451
|
-
// FIXME: 이거 나중에 없애야함
|
|
452
|
-
if (propName === "말도안되는프롭명__이거왜타입처리가꼬여서이러지?") {
|
|
453
|
-
return {
|
|
454
|
-
nodeType: "plain",
|
|
455
|
-
prop: {
|
|
456
|
-
type: "string",
|
|
457
|
-
name: "uuid",
|
|
458
|
-
length: 128
|
|
459
|
-
},
|
|
460
|
-
children: []
|
|
461
|
-
};
|
|
462
|
-
}
|
|
463
467
|
const prop = entity.props.find((p)=>p.name === propName);
|
|
464
468
|
if (prop === undefined) {
|
|
465
469
|
console.log({
|
|
@@ -470,8 +474,7 @@ export class Entity {
|
|
|
470
474
|
}
|
|
471
475
|
return {
|
|
472
476
|
nodeType: "plain",
|
|
473
|
-
prop
|
|
474
|
-
children: []
|
|
477
|
+
prop
|
|
475
478
|
};
|
|
476
479
|
});
|
|
477
480
|
}
|
|
@@ -492,8 +495,7 @@ export class Entity {
|
|
|
492
495
|
...idProp,
|
|
493
496
|
name: `${key}_id`,
|
|
494
497
|
nullable: prop.nullable
|
|
495
|
-
}
|
|
496
|
-
children: []
|
|
498
|
+
}
|
|
497
499
|
};
|
|
498
500
|
}
|
|
499
501
|
}
|
|
@@ -503,9 +505,9 @@ export class Entity {
|
|
|
503
505
|
const children = this.fieldExprsToPropNodes(group, relEntity);
|
|
504
506
|
const nodeType = isBelongsToOneRelationProp(prop) || isOneToOneRelationProp(prop) ? "object" : "array";
|
|
505
507
|
return {
|
|
508
|
+
nodeType,
|
|
506
509
|
prop,
|
|
507
|
-
children
|
|
508
|
-
nodeType
|
|
510
|
+
children
|
|
509
511
|
};
|
|
510
512
|
});
|
|
511
513
|
}
|
|
@@ -608,6 +610,19 @@ export class Entity {
|
|
|
608
610
|
});
|
|
609
611
|
}
|
|
610
612
|
toJson() {
|
|
613
|
+
// subsets와 subsetsInternal을 SubsetField[] 형태로 복원
|
|
614
|
+
const subsets = {};
|
|
615
|
+
for (const key of Object.keys(this.subsets)){
|
|
616
|
+
const normalFields = this.subsets[key];
|
|
617
|
+
const internalFields = (this.subsetsInternal[key] ?? []).map((field)=>({
|
|
618
|
+
field,
|
|
619
|
+
internal: true
|
|
620
|
+
}));
|
|
621
|
+
subsets[key] = [
|
|
622
|
+
...normalFields,
|
|
623
|
+
...internalFields
|
|
624
|
+
];
|
|
625
|
+
}
|
|
611
626
|
return {
|
|
612
627
|
id: this.id,
|
|
613
628
|
parentId: this.parentId,
|
|
@@ -615,7 +630,7 @@ export class Entity {
|
|
|
615
630
|
title: this.title,
|
|
616
631
|
props: this.props,
|
|
617
632
|
indexes: this.indexes,
|
|
618
|
-
subsets
|
|
633
|
+
subsets,
|
|
619
634
|
enums: this.enumLabels
|
|
620
635
|
};
|
|
621
636
|
}
|
|
@@ -625,7 +640,13 @@ export class Entity {
|
|
|
625
640
|
this.subsets = Object.fromEntries(Object.entries(this.subsets).map(([subsetKey])=>{
|
|
626
641
|
return [
|
|
627
642
|
subsetKey,
|
|
628
|
-
this.subsetRowsToSubsetFields(subsetRows, subsetKey)
|
|
643
|
+
this.subsetRowsToSubsetFields(subsetRows, subsetKey, false)
|
|
644
|
+
];
|
|
645
|
+
}));
|
|
646
|
+
this.subsetsInternal = Object.fromEntries(Object.entries(this.subsetsInternal).map(([subsetKey])=>{
|
|
647
|
+
return [
|
|
648
|
+
subsetKey,
|
|
649
|
+
this.subsetRowsToSubsetFields(subsetRows, subsetKey, true)
|
|
629
650
|
];
|
|
630
651
|
}));
|
|
631
652
|
// save
|
|
@@ -635,20 +656,27 @@ export class Entity {
|
|
|
635
656
|
// reload
|
|
636
657
|
await EntityManager.register(json);
|
|
637
658
|
}
|
|
638
|
-
getSubsetRows(_subsets, prefixes = []) {
|
|
659
|
+
getSubsetRows(_subsets, _subsetsInternal, prefixes = []) {
|
|
639
660
|
if (prefixes.length > 10) {
|
|
640
661
|
return [];
|
|
641
662
|
}
|
|
642
663
|
const subsets = _subsets ?? this.subsets;
|
|
664
|
+
const subsetsInternal = _subsetsInternal ?? this.subsetsInternal;
|
|
643
665
|
const subsetKeys = Object.keys(subsets);
|
|
644
666
|
const allFields = unique(subsetKeys.flatMap((key)=>subsets[key]));
|
|
667
|
+
// internal 필드도 allFields에 포함 (relation 탐색용)
|
|
668
|
+
const allInternalFields = unique(subsetKeys.flatMap((key)=>subsetsInternal[key] ?? []));
|
|
669
|
+
const combinedFields = unique([
|
|
670
|
+
...allFields,
|
|
671
|
+
...allInternalFields
|
|
672
|
+
]);
|
|
645
673
|
return this.props.map((prop)=>{
|
|
646
|
-
if (prop.type === "relation" &&
|
|
674
|
+
if (prop.type === "relation" && combinedFields.find((f)=>f.startsWith(`${[
|
|
647
675
|
...prefixes,
|
|
648
676
|
prop.name
|
|
649
677
|
].join(".")}.`))) {
|
|
650
678
|
const relEntity = EntityManager.get(prop.with);
|
|
651
|
-
const children = relEntity.getSubsetRows(subsets, [
|
|
679
|
+
const children = relEntity.getSubsetRows(subsets, subsetsInternal, [
|
|
652
680
|
...prefixes,
|
|
653
681
|
`${prop.name}`
|
|
654
682
|
]);
|
|
@@ -663,9 +691,19 @@ export class Entity {
|
|
|
663
691
|
subsetKey,
|
|
664
692
|
children.every((child)=>child.has[subsetKey] === true)
|
|
665
693
|
];
|
|
694
|
+
})),
|
|
695
|
+
isInternal: Object.fromEntries(subsetKeys.map((subsetKey)=>{
|
|
696
|
+
return [
|
|
697
|
+
subsetKey,
|
|
698
|
+
children.every((child)=>child.isInternal[subsetKey] === true)
|
|
699
|
+
];
|
|
666
700
|
}))
|
|
667
701
|
};
|
|
668
702
|
}
|
|
703
|
+
const field = [
|
|
704
|
+
...prefixes,
|
|
705
|
+
prop.name
|
|
706
|
+
].join(".");
|
|
669
707
|
return {
|
|
670
708
|
field: prop.name,
|
|
671
709
|
children: [],
|
|
@@ -674,25 +712,32 @@ export class Entity {
|
|
|
674
712
|
has: Object.fromEntries(subsetKeys.map((subsetKey)=>{
|
|
675
713
|
const subsetFields = subsets[subsetKey];
|
|
676
714
|
const has = subsetFields.some((f)=>{
|
|
677
|
-
const field = [
|
|
678
|
-
...prefixes,
|
|
679
|
-
prop.name
|
|
680
|
-
].join(".");
|
|
681
715
|
return f === field || f.startsWith(`${field}.`);
|
|
682
716
|
});
|
|
683
717
|
return [
|
|
684
718
|
subsetKey,
|
|
685
719
|
has
|
|
686
720
|
];
|
|
721
|
+
})),
|
|
722
|
+
isInternal: Object.fromEntries(subsetKeys.map((subsetKey)=>{
|
|
723
|
+
const internalFields = subsetsInternal[subsetKey] ?? [];
|
|
724
|
+
const isInternal = internalFields.some((f)=>{
|
|
725
|
+
return f === field || f.startsWith(`${field}.`);
|
|
726
|
+
});
|
|
727
|
+
return [
|
|
728
|
+
subsetKey,
|
|
729
|
+
isInternal
|
|
730
|
+
];
|
|
687
731
|
}))
|
|
688
732
|
};
|
|
689
733
|
});
|
|
690
734
|
}
|
|
691
|
-
subsetRowsToSubsetFields(subsetRows, subsetKey) {
|
|
735
|
+
subsetRowsToSubsetFields(subsetRows, subsetKey, internal = false) {
|
|
736
|
+
const hasKey = internal ? "isInternal" : "has";
|
|
692
737
|
return subsetRows.map((subsetRow)=>{
|
|
693
738
|
if (subsetRow.children.length > 0) {
|
|
694
|
-
return this.subsetRowsToSubsetFields(subsetRow.children, subsetKey);
|
|
695
|
-
} else if (subsetRow
|
|
739
|
+
return this.subsetRowsToSubsetFields(subsetRow.children, subsetKey, internal);
|
|
740
|
+
} else if (subsetRow[hasKey][subsetKey]) {
|
|
696
741
|
return subsetRow.prefixes.concat(subsetRow.field).join(".");
|
|
697
742
|
} else {
|
|
698
743
|
return null;
|
|
@@ -835,4 +880,4 @@ export class Entity {
|
|
|
835
880
|
}
|
|
836
881
|
}
|
|
837
882
|
|
|
838
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lbnRpdHkvZW50aXR5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuaW1wb3J0IHsgd3JpdGVGaWxlIH0gZnJvbSBcImZzL3Byb21pc2VzXCI7XG5pbXBvcnQgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IGdyb3VwLCB1bmlxdWUgfSBmcm9tIFwicmFkYXNoaVwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGkvc29uYW11XCI7XG5pbXBvcnQge1xuICB0eXBlIEVudGl0eUluZGV4LFxuICB0eXBlIEVudGl0eUpzb24sXG4gIHR5cGUgRW50aXR5UHJvcCxcbiAgdHlwZSBFbnRpdHlQcm9wTm9kZSxcbiAgdHlwZSBFbnRpdHlTdWJzZXRSb3csXG4gIGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wLFxuICBpc0VudW1Qcm9wLFxuICBpc0hhc01hbnlSZWxhdGlvblByb3AsXG4gIGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcCxcbiAgaXNPbmVUb09uZVJlbGF0aW9uUHJvcCxcbiAgaXNSZWxhdGlvblByb3AsXG4gIGlzVmlydHVhbFByb3AsXG4gIHR5cGUgUmVsYXRpb25Qcm9wLFxuICB0eXBlIFN0cmluZ1Byb3AsXG4gIHR5cGUgU3Vic2V0UXVlcnksXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgaW1wb3J0TWVtYmVycyB9IGZyb20gXCIuLi91dGlscy9lc20tdXRpbHNcIjtcbmltcG9ydCB7IGZvcm1hdENvZGUgfSBmcm9tIFwiLi4vdXRpbHMvZm9ybWF0dGVyXCI7XG5pbXBvcnQgeyBleGlzdHMgfSBmcm9tIFwiLi4vdXRpbHMvZnMtdXRpbHNcIjtcbmltcG9ydCB7IHJ1bnRpbWVQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIjtcbmltcG9ydCB7IGFzc2VydERlZmluZWQsIG5vbk51bGxhYmxlIH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzXCI7XG5pbXBvcnQgeyBFbnRpdHlNYW5hZ2VyIH0gZnJvbSBcIi4vZW50aXR5LW1hbmFnZXJcIjtcblxuZXhwb3J0IGNsYXNzIEVudGl0eSB7XG4gIGlkOiBzdHJpbmc7XG4gIHBhcmVudElkPzogc3RyaW5nO1xuICB0YWJsZTogc3RyaW5nO1xuICB0aXRsZTogc3RyaW5nO1xuICBuYW1lczoge1xuICAgIHBhcmVudEZzOiBzdHJpbmc7XG4gICAgZnM6IHN0cmluZztcbiAgICBtb2R1bGU6IHN0cmluZztcbiAgfTtcbiAgcHJvcHM6IEVudGl0eVByb3BbXTtcbiAgcHJvcHNEaWN0OiB7XG4gICAgW2tleTogc3RyaW5nXTogRW50aXR5UHJvcDtcbiAgfTtcbiAgcmVsYXRpb25zOiB7XG4gICAgW2tleTogc3RyaW5nXTogUmVsYXRpb25Qcm9wO1xuICB9O1xuICBpbmRleGVzOiBFbnRpdHlJbmRleFtdO1xuICBzdWJzZXRzOiB7XG4gICAgW2tleTogc3RyaW5nXTogc3RyaW5nW107XG4gIH07XG4gIHR5cGVzOiB7XG4gICAgW25hbWU6IHN0cmluZ106IHouWm9kVHlwZUFueTtcbiAgfSA9IHt9O1xuICBlbnVtczoge1xuICAgIFtlbnVtSWQ6IHN0cmluZ106IHouWm9kRW51bTxSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pj47XG4gIH0gPSB7fTtcbiAgZW51bUxhYmVsczoge1xuICAgIFtlbnVtSWQ6IHN0cmluZ106IHtcbiAgICAgIFtrZXk6IHN0cmluZ106IHN0cmluZztcbiAgICB9O1xuICB9ID0ge307XG5cbiAgY29uc3RydWN0b3IoeyBpZCwgcGFyZW50SWQsIHRhYmxlLCB0aXRsZSwgcHJvcHMsIGluZGV4ZXMsIHN1YnNldHMsIGVudW1zIH06IEVudGl0eUpzb24pIHtcbiAgICAvLyBpZFxuICAgIHRoaXMuaWQgPSBpZDtcbiAgICB0aGlzLnBhcmVudElkID0gcGFyZW50SWQ7XG4gICAgdGhpcy50aXRsZSA9IHRpdGxlID8/IHRoaXMuaWQ7XG4gICAgdGhpcy50YWJsZSA9IHRhYmxlID8/IGluZmxlY3Rpb24udW5kZXJzY29yZShpbmZsZWN0aW9uLnBsdXJhbGl6ZShpZCkpO1xuXG4gICAgLy8gcHJvcHNcbiAgICBpZiAocHJvcHMpIHtcbiAgICAgIHRoaXMucHJvcHMgPSBwcm9wcy5tYXAoKHByb3ApID0+IHtcbiAgICAgICAgaWYgKGlzRW51bVByb3AocHJvcCkpIHtcbiAgICAgICAgICBpZiAocHJvcC5pZC5pbmNsdWRlcyhcIiRNb2RlbFwiKSkge1xuICAgICAgICAgICAgcHJvcC5pZCA9IHByb3AuaWQucmVwbGFjZShcIiRNb2RlbFwiLCBpZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9wO1xuICAgICAgfSk7XG4gICAgICB0aGlzLnByb3BzRGljdCA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgcHJvcHMubWFwKChwcm9wKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIFtwcm9wLm5hbWUsIHByb3BdO1xuICAgICAgICB9KSxcbiAgICAgICk7XG5cbiAgICAgIC8vIHJlbGF0aW9uc1xuICAgICAgdGhpcy5yZWxhdGlvbnMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgIHByb3BzLmZpbHRlcigocHJvcCkgPT4gaXNSZWxhdGlvblByb3AocHJvcCkpLm1hcCgocHJvcCkgPT4gW3Byb3AubmFtZSwgcHJvcF0pLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wcm9wcyA9IFtdO1xuICAgICAgdGhpcy5wcm9wc0RpY3QgPSB7fTtcbiAgICAgIHRoaXMucmVsYXRpb25zID0ge307XG4gICAgfVxuXG4gICAgLy8gaW5kZXhlc1xuICAgIHRoaXMuaW5kZXhlcyA9IGluZGV4ZXMgPz8gW107XG5cbiAgICAvLyBzdWJzZXRzXG4gICAgdGhpcy5zdWJzZXRzID0gc3Vic2V0cyA/PyB7fTtcblxuICAgIC8vIGVudW1zXG4gICAgdGhpcy5lbnVtTGFiZWxzID0gZW51bXMgPz8ge307XG4gICAgdGhpcy5lbnVtcyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKHRoaXMuZW51bUxhYmVscykubWFwKChba2V5LCBlbnVtTGFiZWxdKSA9PiB7XG4gICAgICAgIHJldHVybiBba2V5LCB6LmVudW0oT2JqZWN0LmtleXMoZW51bUxhYmVsKSBhcyB1bmtub3duIGFzIHJlYWRvbmx5IFtzdHJpbmcsIC4uLnN0cmluZ1tdXSldO1xuICAgICAgfSksXG4gICAgKTtcblxuICAgIC8vIG5hbWVzXG4gICAgdGhpcy5uYW1lcyA9IHtcbiAgICAgIHBhcmVudEZzOiBpbmZsZWN0aW9uLmRhc2hlcml6ZShpbmZsZWN0aW9uLnVuZGVyc2NvcmUocGFyZW50SWQgPz8gaWQpKS50b0xvd2VyQ2FzZSgpLFxuICAgICAgZnM6IGluZmxlY3Rpb24uZGFzaGVyaXplKGluZmxlY3Rpb24udW5kZXJzY29yZShpZCkpLnRvTG93ZXJDYXNlKCksXG4gICAgICBtb2R1bGU6IGlkLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICog7KO87Ja07KeEIOydtOumhChzdWJzZXRLZXkp7J2YIHN1YnNldOydhCDsi6TsoJzroZwg6rCA7KC47Jik64qUIFB1cmkg7L2U65OcIOq1rO2YhOyytCBzdHJpbmfsnYQg67CY7ZmY7ZWp64uI64ukLlxuICAgKi9cbiAgZ2V0UHVyaVN1YnNldFF1ZXJ5KHN1YnNldEtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBzdWJzZXQgPSB0aGlzLnN1YnNldHNbc3Vic2V0S2V5XTtcbiAgICBjb25zdCBzdWJzZXRRdWVyeSA9IHRoaXMucmVzb2x2ZVN1YnNldFF1ZXJ5KFwiXCIsIHN1YnNldCk7XG5cbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcblxuICAgIC8vIGZyb21cbiAgICBsaW5lcy5wdXNoKGByZXR1cm4gcWJXcmFwcGVyYCk7XG4gICAgbGluZXMucHVzaChgLmZyb20oXCIke3RoaXMudGFibGV9XCIpYCk7XG5cbiAgICAvLyBqb2luXG4gICAgZm9yIChjb25zdCBqb2luIG9mIHN1YnNldFF1ZXJ5LmpvaW5zKSB7XG4gICAgICAvLyBqb2luIOuplOyEnOuTnCDqsrDsoJU6IGlubmVyIOKGkiBqb2luLCBvdXRlciDihpIgbGVmdEpvaW5cbiAgICAgIC8vIEZLIG51bGxhYmxlIOyXrOu2gOuKlCBsZWZ0Sm9pbiDtg4DsnoUg7Iuc6re464uI7LKY7JeQ7IScIOyekOuPmeycvOuhnCDtjJDri6jrkKhcbiAgICAgIGNvbnN0IGpvaW5NZXRob2QgPSBqb2luLmpvaW4gPT09IFwiaW5uZXJcIiA/IFwiam9pblwiIDogXCJsZWZ0Sm9pblwiO1xuXG4gICAgICBpZiAoXCJjdXN0b21cIiBpbiBqb2luKSB7XG4gICAgICAgIC8vIGN1c3RvbSBqb2luIGNsYXVzZeuKlCByYXcg7IKs7JqpXG4gICAgICAgIGxpbmVzLnB1c2goXG4gICAgICAgICAgYC4ke2pvaW5NZXRob2R9KHsgJHtqb2luLmFzfTogXCIke2pvaW4udGFibGV9XCIgfSwgcWJXcmFwcGVyLmtuZXgucmF3KFxcYCR7am9pbi5jdXN0b219XFxgKSlgLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGluZXMucHVzaChgLiR7am9pbk1ldGhvZH0oeyAke2pvaW4uYXN9OiBcIiR7am9pbi50YWJsZX1cIiB9LCBcIiR7am9pbi5mcm9tfVwiLCBcIiR7am9pbi50b31cIilgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBzZWxlY3QgLSDsnoXssrTsoIEg6rWs7KGw66GcIOyDneyEsVxuICAgIGNvbnN0IHNlbGVjdE9iaiA9IHRoaXMuYnVpbGROZXN0ZWRTZWxlY3RPYmplY3Qoc3Vic2V0UXVlcnkuc2VsZWN0KTtcblxuICAgIGxpbmVzLnB1c2goYC5zZWxlY3QoJHt0aGlzLnN0cmluZ2lmeU5lc3RlZFNlbGVjdE9iamVjdChzZWxlY3RPYmopfSk7YCk7XG5cbiAgICByZXR1cm4gbGluZXMuam9pbihcIlxcblwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAqLmVudGl0eS5qc29u7J2YIHN1YnNldOyXkCDrk6TslrTsnojripQg7ZWE65OcIOuwsOyXtOydhCDrsJvslYTshJwsXG4gICAqIFB1cmnsnZggU2VsZWN0T2JqZWN0IO2DgOyeheycvOuhnCDrs4DtmZjtlanri4jri6QuXG4gICAqXG4gICAqIOyYiDogW1widXNlcnMuaWRcIiwgXCJwYXJlbnQuaWRcIiwgXCJwYXJlbnQubmFtZVwiXVxuICAgKiAgIOKGkiB7IGlkOiBcInVzZXJzLmlkXCIsIHBhcmVudDogeyBpZDogXCJwYXJlbnQuaWRcIiwgbmFtZTogXCJwYXJlbnQubmFtZVwiIH0gfVxuICAgKlxuICAgKiDslrjrjZTrsJTqsIAg7JWE64uMIOykkeyyqSDqsJ3ssrTroZwg67OA7ZmY7ZWo7JeQIOycoOydmO2VmOyEuOyalC5cbiAgICog7J2066CH6rKMIOykkeyyqSDqsJ3ssrTroZwg67OA7ZmY7ZWY7JesIHNlbGVjdOyXkCDrhJjqsqjso7zrqbQgUGFyc2VTZWxlY3RPYmplY3Qg7YOA7J6F7J20IGpvaW7rkJwg6rCd7LK07J2YIO2DgOyeheydhCDsnpgg7J6h7JWE7KSEIOyImCDsnojsirXri4jri6QuXG4gICAqIOymiSwgZW5oYW5jZXLsl5DshJwgcm9366W8IOuwm+yVmOydhCDrlYwgaHlkcmF0ZeuQnCDqsJ3ssrQg7J6Q7LK07J2YIG51bGxpdHnsmYAg6re4IOyViOyqvSDtlYTrk5zsnZggbnVsbGl0eeqwgCBmayBudWxsYWJsZSDsl6zrtoDsl5Ag65Sw6528IOyemCDstpTroaDrkKnri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkTmVzdGVkU2VsZWN0T2JqZWN0KFxuICAgIHNlbGVjdEl0ZW1zOiBzdHJpbmdbXSxcbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IOuwmO2ZmCDsmKTruIzsoJ3tirjsnZgg6rCS7J2AIHN0cmluZ+ydvCDsiJjrj4Qg7J6I6rOgIOuYkOuLpOuluCDsmKTruIzsoJ3tirjsnbwg7IiY64+EIOyeiOuKlOuNsCwg7J2066W8IOyerOq3gCDtg4DsnoXsnLzroZwg64KY7YOA64K8IOyImCDsl4bslrQgYW5566GcIOyymOumrO2VqeuLiOuLpC5cbiAgKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgY29uc3QgcmVzdWx0OiBSZXR1cm5UeXBlPHR5cGVvZiB0aGlzLmJ1aWxkTmVzdGVkU2VsZWN0T2JqZWN0PiA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBzZWxlY3RJdGVtIG9mIHNlbGVjdEl0ZW1zKSB7XG4gICAgICAvLyBcInVzZXJzLmlkXCIg65iQ64qUIFwidXNlcnMuaWQgYXMgdXNlcl9faWRcIiDtmJXtg5wg7YyM7IuxXG4gICAgICBjb25zdCBtYXRjaCA9IHNlbGVjdEl0ZW0ubWF0Y2goL14oLis/KSg/OiBhcyAoLispKT8kLyk7XG4gICAgICBpZiAoIW1hdGNoKSBjb250aW51ZTtcblxuICAgICAgY29uc3QgWywgY29sdW1uLCBhbGlhc10gPSBtYXRjaDtcbiAgICAgIGNvbnN0IGNvbHVtblZhbHVlID0gYFwiJHtjb2x1bW4udHJpbSgpfVwiYDtcblxuICAgICAgaWYgKCFhbGlhcyB8fCAhYWxpYXMuaW5jbHVkZXMoXCJfX1wiKSkge1xuICAgICAgICAvLyBhbGlhc+qwgCDsl4bqsbDrgpggX1/rpbwg7Y+s7ZWo7ZWY7KeAIOyViuycvOuptCDstZzsg4HsnIQg7ZWE65OcXG4gICAgICAgIGNvbnN0IGtleSA9IGFsaWFzID8/IGFzc2VydERlZmluZWQoY29sdW1uLnNwbGl0KFwiLlwiKS5wb3AoKSk7XG4gICAgICAgIHJlc3VsdFtrZXldID0gY29sdW1uVmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBhbGlhc+qwgCBfX+ulvCDtj6ztlajtlZjrqbQg7J6F7LK0IOq1rOyhsOuhnCDqt7jro7ntmZRcbiAgICAgICAgY29uc3QgcGFydHMgPSBhbGlhcy5zcGxpdChcIl9fXCIpO1xuICAgICAgICBsZXQgY3VycmVudCA9IHJlc3VsdDtcblxuICAgICAgICAvLyDrp4jsp4Drp4kg7YyM7Yq4IOyghOq5jOyngCDspJHssqkg6rCd7LK0IOyDneyEsVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHBhcnQgPSBwYXJ0c1tpXTtcbiAgICAgICAgICBpZiAocGFydCBpbiBjdXJyZW50KSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGN1cnJlbnRbcGFydF0gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgLy8g7J6F66Cl7J20IFtcInVzZXJcIiwgXCJ1c2VyX19pZFwiXSDqsJnsnYAg6rK97JqwIVxuICAgICAgICAgICAgICAvLyDslaDstIjsl5Ag66eQ64+EIOyViCDrkJjsp4Drp4wg7JWI7KCE7ZWY6rKMIOyYiOyZuOulvCDrjZjsp5Hri4jri6QuXG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBgQ29uZmxpY3QgZGV0ZWN0ZWQgaW4gc2VsZWN0IGl0ZW1zOiBwYXJlbnQgcGF0aCBcIiR7cGFydHMuc2xpY2UoMCwgaSArIDEpLmpvaW4oXCJfX1wiKX1cIiBpcyBhbHJlYWR5IHNldCBhcyBhIGZpZWxkLCBjYW5ub3QgbmVzdCBcIiR7YWxpYXN9XCIgdW5kZXIgaXQuYCxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY3VycmVudFtwYXJ0XSA9IHt9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBjdXJyZW50ID0gY3VycmVudFtwYXJ0XTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOuniOyngOuniSDtjIztirjsl5Ag6rCSIOyEpOyglVxuICAgICAgICBjb25zdCBsYXN0UGFydCA9IHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdO1xuICAgICAgICBjdXJyZW50W2xhc3RQYXJ0XSA9IGNvbHVtblZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogSlNPTi5zdHJpbmdpZnnsmYAg7Jyg7IKs7ZWcIOydvOydhCDtlanri4jri6QuXG4gICAqIOuLpOunjCDso7zslrTsp4Qg6rCd7LK066W8IEpTT07snbQg7JWE64uMIFR5cGVTY3JpcHQg6rCd7LK0IOumrO2EsOuftCDsiqTtirjrp4HsnLzroZwg66eM65Ok7Ja07KSN64uI64ukLlxuICAgKiBrZXnsl5Ag65Sw7Ji07ZGc6rCAIOyXhuyWtOyalC5cbiAgICog7Lac66ClIOyYiOyLnDpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiB7XG4gICAqICAgaWQ6IFwidXNlcnMuaWRcIixcbiAgICogICBwYXJlbnQ6IHtcbiAgICogICAgIGlkOiBcInBhcmVudC5pZFwiLFxuICAgKiAgICAgbmFtZTogXCJwYXJlbnQubmFtZVwiLFxuICAgKiAgIH0sXG4gICAqIH1cbiAgICogYGBgXG4gICAqIEBwYXJhbSBvYmog67OA7ZmY7ZWgIOqwneyytFxuICAgKiBAcGFyYW0gaW5kZW50IOuTpOyXrOyTsOq4sCDroIjrsqhcbiAgICogQHBhcmFtIHdpdGhCcmFjZXMgdHJ1ZeuptCDspJHqtITtmLgg7Y+s7ZWoLCBmYWxzZeuptCDrgrTsmqnrp4wg67CY7ZmYXG4gICAqL1xuICBwcml2YXRlIHN0cmluZ2lmeU5lc3RlZFNlbGVjdE9iamVjdChcbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IOykkeyyqSDsmKTruIzsoJ3tirjsnZgg6rCS7J2AIHN0cmluZ+ydvCDsiJjrj4Qg7J6I6rOgIOuYkOuLpOuluCDsmKTruIzsoJ3tirjsnbwg7IiY64+EIOyeiOuKlOuNsCwg7J2066W8IOyerOq3gCDtg4DsnoXsnLzroZwg64KY7YOA64K8IOyImCDsl4bslrQgYW5566GcIOyymOumrO2VqeuLiOuLpC5cbiAgICBvYmo6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgaW5kZW50OiBudW1iZXIgPSAwLFxuICAgIHdpdGhCcmFjZXM6IGJvb2xlYW4gPSB0cnVlLFxuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IHNwYWNlcyA9IFwiICBcIi5yZXBlYXQoaW5kZW50KTtcbiAgICBjb25zdCBpbm5lclNwYWNlcyA9IFwiICBcIi5yZXBlYXQoaW5kZW50ICsgMSk7XG5cbiAgICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXMob2JqKTtcbiAgICBpZiAoZW50cmllcy5sZW5ndGggPT09IDApIHJldHVybiB3aXRoQnJhY2VzID8gXCJ7fVwiIDogXCJcIjtcblxuICAgIGNvbnN0IGxpbmVzID0gZW50cmllcy5tYXAoKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAvLyDsu6zrn7wg6rK966GcICjsnbTrr7gg65Sw7Ji07ZGcIO2PrO2VqClcbiAgICAgICAgcmV0dXJuIGAke2lubmVyU3BhY2VzfSR7a2V5fTogJHt2YWx1ZX0sYDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIOykkeyyqSDqsJ3ssrQgKO2VreyDgSDspJHqtITtmLgg7Y+s7ZWoKVxuICAgICAgICByZXR1cm4gYCR7aW5uZXJTcGFjZXN9JHtrZXl9OiAke3RoaXMuc3RyaW5naWZ5TmVzdGVkU2VsZWN0T2JqZWN0KHZhbHVlLCBpbmRlbnQgKyAxLCB0cnVlKX0sYDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICh3aXRoQnJhY2VzKSB7XG4gICAgICByZXR1cm4gYHtcXG4ke2xpbmVzLmpvaW4oXCJcXG5cIil9XFxuJHtzcGFjZXN9fWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIOykkeq0hO2YuCDsl4bsnbQg64K07Jqp66eMIOuwmO2ZmCAo7JWe65KkIOqwnO2WiSDsoJzsmbgpXG4gICAgICByZXR1cm4gbGluZXMuam9pbihcIlxcblwiKTtcbiAgICB9XG4gIH1cblxuICBnZXRQdXJpTG9hZGVyUXVlcnkoc3Vic2V0S2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHN1YnNldCA9IHRoaXMuc3Vic2V0c1tzdWJzZXRLZXldO1xuICAgIGNvbnN0IHsgbG9hZGVycyB9ID0gdGhpcy5yZXNvbHZlU3Vic2V0UXVlcnkoXCJcIiwgc3Vic2V0KTtcblxuICAgIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtgW2BdO1xuXG4gICAgLy8g7J6s6reA7KCB7Jy866GcIGxvYWRlciDsg53shLHtlZjripQg7Zes7Y28IO2VqOyImFxuICAgIGNvbnN0IGdlbmVyYXRlTG9hZGVyQ29kZSA9IChsb2FkZXJzOiBTdWJzZXRRdWVyeVtcImxvYWRlcnNcIl0pOiBzdHJpbmdbXSA9PiB7XG4gICAgICBjb25zdCBsb2FkZXJMaW5lczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgZm9yIChjb25zdCBsb2FkZXIgb2YgbG9hZGVycykge1xuICAgICAgICBjb25zdCB7IHRvVGFibGUsIHRvQ29sLCB0aHJvdWdoIH0gPSBsb2FkZXIubWFueUpvaW47XG4gICAgICAgIGxvYWRlckxpbmVzLnB1c2goXG4gICAgICAgICAgXCJ7XCIsXG4gICAgICAgICAgYGFzOiBcIiR7bG9hZGVyLmFzfVwiLGAsXG4gICAgICAgICAgYHJlZklkOiBcIiR7bG9hZGVyLm1hbnlKb2luLmlkRmllbGR9XCIsYCxcbiAgICAgICAgICBgcWI6IChxYldyYXBwZXI6IFB1cmlXcmFwcGVyPERhdGFiYXNlU2NoZW1hRXh0ZW5kPiwgZnJvbUlkczogbnVtYmVyW10pID0+IHtgLFxuICAgICAgICApO1xuXG4gICAgICAgIGlmICh0aHJvdWdoID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBIYXNNYW55XG4gICAgICAgICAgbG9hZGVyTGluZXMucHVzaChcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICBcInJldHVybiBxYldyYXBwZXJcIixcbiAgICAgICAgICAgIGAuZnJvbShcIiR7dG9UYWJsZX1cIilgLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBsb2FkZXIub25lSm9pbnMuZm9yRWFjaCgoam9pbjogU3Vic2V0UXVlcnlbXCJqb2luc1wiXVtudW1iZXJdKSA9PiB7XG4gICAgICAgICAgICAvLyBGSyBudWxsYWJsZSDsl6zrtoDripQgbGVmdEpvaW4g7YOA7J6FIOyLnOq3uOuLiOyymOyXkOyEnCDsnpDrj5nsnLzroZwg7YyQ64uo65CoXG4gICAgICAgICAgICBjb25zdCBqb2luTWV0aG9kID0gam9pbi5qb2luID09PSBcImlubmVyXCIgPyBcImpvaW5cIiA6IFwibGVmdEpvaW5cIjtcbiAgICAgICAgICAgIGlmIChcImN1c3RvbVwiIGluIGpvaW4pIHtcbiAgICAgICAgICAgICAgLy8gRklYTUU6IOqygOymnSDtlYTsmpRcbiAgICAgICAgICAgICAgbG9hZGVyTGluZXMucHVzaChcbiAgICAgICAgICAgICAgICBgLiR7am9pbk1ldGhvZH0oeyAke2pvaW4uYXN9OiBcIiR7am9pbi50YWJsZX1cIiB9LCAoaikgPT4ge2AsXG4gICAgICAgICAgICAgICAgYGoub24oUHVyaS5yYXdTdHJpbmcoXCIke2pvaW4uY3VzdG9tfVwiKSk7YCxcbiAgICAgICAgICAgICAgICBcIn0pXCIsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFxuICAgICAgICAgICAgICAgIGAuJHtqb2luTWV0aG9kfSh7ICR7am9pbi5hc306IFwiJHtqb2luLnRhYmxlfVwiIH0sIFwiJHtqb2luLmZyb219XCIsIFwiJHtqb2luLnRvfVwiKWAsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyDsnoXssrTsoIEgc2VsZWN0IOq1rOyhsCDsg53shLEgKHJlZklkIO2PrO2VqClcbiAgICAgICAgICBjb25zdCBzZWxlY3RPYmogPSB0aGlzLmJ1aWxkTmVzdGVkU2VsZWN0T2JqZWN0KGxvYWRlci5zZWxlY3QpO1xuICAgICAgICAgIHNlbGVjdE9iai5yZWZJZCA9IGBcIiR7dG9UYWJsZX0uJHt0b0NvbH1cImA7XG4gICAgICAgICAgbG9hZGVyTGluZXMucHVzaChcbiAgICAgICAgICAgIGAud2hlcmVJbihcIiR7dG9UYWJsZX0uJHt0b0NvbH1cIiwgZnJvbUlkcylgLFxuICAgICAgICAgICAgYC5zZWxlY3QoJHt0aGlzLnN0cmluZ2lmeU5lc3RlZFNlbGVjdE9iamVjdChzZWxlY3RPYmopfSk7YCxcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE1hbnlUb01hbnlcbiAgICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFxuICAgICAgICAgICAgXCJyZXR1cm4gcWJXcmFwcGVyXCIsXG4gICAgICAgICAgICBgLmZyb20oXCIke3Rocm91Z2gudGFibGV9XCIpYCxcbiAgICAgICAgICAgIGAuam9pbihcIiR7dG9UYWJsZX1cIiwgXCIke3Rocm91Z2gudGFibGV9LiR7dGhyb3VnaC50b0NvbH1cIiwgXCIke3RvVGFibGV9LiR7dG9Db2x9XCIpYCxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgbG9hZGVyLm9uZUpvaW5zLmZvckVhY2goKGpvaW46IFN1YnNldFF1ZXJ5W1wiam9pbnNcIl1bbnVtYmVyXSkgPT4ge1xuICAgICAgICAgICAgLy8gRksgbnVsbGFibGUg7Jes67aA64qUIGxlZnRKb2luIO2DgOyehSDsi5zqt7jri4jsspjsl5DshJwg7J6Q64+Z7Jy866GcIO2MkOuLqOuQqFxuICAgICAgICAgICAgY29uc3Qgam9pbk1ldGhvZCA9IGpvaW4uam9pbiA9PT0gXCJpbm5lclwiID8gXCJqb2luXCIgOiBcImxlZnRKb2luXCI7XG4gICAgICAgICAgICBpZiAoXCJjdXN0b21cIiBpbiBqb2luKSB7XG4gICAgICAgICAgICAgIC8vIEZJWE1FOiDqsoDspp0g7ZWE7JqUXG4gICAgICAgICAgICAgIGxvYWRlckxpbmVzLnB1c2goXG4gICAgICAgICAgICAgICAgYC4ke2pvaW5NZXRob2R9KHsgJHtqb2luLmFzfTogXCIke2pvaW4udGFibGV9XCIgfSwgKGopID0+IHtgLFxuICAgICAgICAgICAgICAgIGBqLm9uKFB1cmkucmF3U3RyaW5nKFwiJHtqb2luLmN1c3RvbX1cIikpO2AsXG4gICAgICAgICAgICAgICAgXCJ9KVwiLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbG9hZGVyTGluZXMucHVzaChcbiAgICAgICAgICAgICAgICBgLiR7am9pbk1ldGhvZH0oeyAke2pvaW4uYXN9OiBcIiR7am9pbi50YWJsZX1cIiB9LCBcIiR7am9pbi5mcm9tfVwiLCBcIiR7am9pbi50b31cIilgLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8g7J6F7LK07KCBIHNlbGVjdCDqtazsobAg7IOd7ISxIChyZWZJZCDtj6ztlagpXG4gICAgICAgICAgY29uc3Qgc2VsZWN0T2JqID0gdGhpcy5idWlsZE5lc3RlZFNlbGVjdE9iamVjdChsb2FkZXIuc2VsZWN0KTtcbiAgICAgICAgICBzZWxlY3RPYmoucmVmSWQgPSBgXCIke3Rocm91Z2gudGFibGV9LiR7dGhyb3VnaC5mcm9tQ29sfVwiYDtcbiAgICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFxuICAgICAgICAgICAgYC53aGVyZUluKFwiJHt0aHJvdWdoLnRhYmxlfS4ke3Rocm91Z2guZnJvbUNvbH1cIiwgZnJvbUlkcylgLFxuICAgICAgICAgICAgYC5zZWxlY3QoJHt0aGlzLnN0cmluZ2lmeU5lc3RlZFNlbGVjdE9iamVjdChzZWxlY3RPYmopfSk7YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgbG9hZGVyTGluZXMucHVzaChgfSxgKTtcblxuICAgICAgICAvLyDspJHssqkgbG9hZGVycyDsspjrpqxcbiAgICAgICAgaWYgKGxvYWRlci5sb2FkZXJzICYmIGxvYWRlci5sb2FkZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFwibG9hZGVyczogW1wiLCAuLi5nZW5lcmF0ZUxvYWRlckNvZGUobG9hZGVyLmxvYWRlcnMpLCBcIl0sXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgbG9hZGVyTGluZXMucHVzaChcIn0sXCIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbG9hZGVyTGluZXM7XG4gICAgfTtcblxuICAgIGxpbmVzLnB1c2goLi4uZ2VuZXJhdGVMb2FkZXJDb2RlKGxvYWRlcnMpKTtcbiAgICBsaW5lcy5wdXNoKGBdYCk7XG5cbiAgICByZXR1cm4gbGluZXMuam9pbihcIlxcblwiKTtcbiAgfVxuXG4gIC8qXG4gICAgc3Vic2V0IFNFTEVDVC9KT0lOL0xPQURFUiDqsrDqs7wg66as7YS0XG4gICovXG4gIGdldFN1YnNldFF1ZXJ5KHN1YnNldEtleTogc3RyaW5nKTogU3Vic2V0UXVlcnkge1xuICAgIGNvbnN0IHN1YnNldCA9IHRoaXMuc3Vic2V0c1tzdWJzZXRLZXldO1xuXG4gICAgY29uc3QgcmVzdWx0OiBTdWJzZXRRdWVyeSA9IHRoaXMucmVzb2x2ZVN1YnNldFF1ZXJ5KFwiXCIsIHN1YnNldCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qXG4gICAqL1xuICByZXNvbHZlU3Vic2V0UXVlcnkoXG4gICAgcHJlZml4OiBzdHJpbmcsXG4gICAgZmllbGRzOiBzdHJpbmdbXSxcbiAgICBpc0FscmVhZHlPdXRlckpvaW5lZDogYm9vbGVhbiA9IGZhbHNlLFxuICApOiBTdWJzZXRRdWVyeSB7XG4gICAgLy8gcHJlZml4IOy5mO2ZmCAocHJlZml464qUIFRvT25lUmVsYXRpb27snbQg67O17IiY66GcIOu2meydgCDqsr3smrAg66qo65GQIF9f66GcIOuzgOqyveuQqClcbiAgICBwcmVmaXggPSBwcmVmaXgucmVwbGFjZSgvXFwuL2csIFwiX19cIik7XG5cbiAgICAvLyDshJzruIzshYvsnYQgMeuOgeyKpOunjCDrtoTrpqztlZjsl6wg6re466O57ZWRXG4gICAgY29uc3Qgc3Vic2V0R3JvdXAgPSBncm91cChmaWVsZHMsIChmaWVsZCkgPT4ge1xuICAgICAgaWYgKGZpZWxkLmluY2x1ZGVzKFwiLlwiKSkge1xuICAgICAgICBjb25zdCBbcmVsXSA9IGZpZWxkLnNwbGl0KFwiLlwiKTtcbiAgICAgICAgcmV0dXJuIHJlbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gT2JqZWN0LmtleXMoc3Vic2V0R3JvdXApLnJlZHVjZShcbiAgICAgIChyLCBncm91cEtleSkgPT4ge1xuICAgICAgICBjb25zdCBmaWVsZHMgPSBzdWJzZXRHcm91cFtncm91cEtleV07XG4gICAgICAgIGFzc2VydChmaWVsZHMgIT09IHVuZGVmaW5lZCwgXCJmaWVsZHMgaXMgdW5kZWZpbmVkXCIpO1xuXG4gICAgICAgIC8vIO2YhOyerCDthYzsnbTruJQg7ZWE65Oc7IWL7J2AIHNlbGVjdCwgdmlydHVhbOyXkCDstpTqsIDtlZjqs6Ag66as7YS0XG4gICAgICAgIGlmIChncm91cEtleSA9PT0gXCJcIikge1xuICAgICAgICAgIGNvbnN0IHJlYWxGaWVsZHMgPSBmaWVsZHMuZmlsdGVyKChmaWVsZCkgPT4gIWlzVmlydHVhbFByb3AodGhpcy5wcm9wc0RpY3RbZmllbGRdKSk7XG4gICAgICAgICAgY29uc3QgdmlydHVhbEZpZWxkcyA9IGZpZWxkcy5maWx0ZXIoKGZpZWxkKSA9PiBpc1ZpcnR1YWxQcm9wKHRoaXMucHJvcHNEaWN0W2ZpZWxkXSkpO1xuXG4gICAgICAgICAgaWYgKHByZWZpeCA9PT0gXCJcIikge1xuICAgICAgICAgICAgLy8g7ZiE7J6sIO2FjOydtOu4lOyduCDqsr3smrBcbiAgICAgICAgICAgIHIuc2VsZWN0ID0gci5zZWxlY3QuY29uY2F0KHJlYWxGaWVsZHMubWFwKChmaWVsZCkgPT4gYCR7dGhpcy50YWJsZX0uJHtmaWVsZH1gKSk7XG4gICAgICAgICAgICByLnZpcnR1YWwgPSByLnZpcnR1YWwuY29uY2F0KHZpcnR1YWxGaWVsZHMpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyDrhJjslrTsmKgg7YWM7J2067iU7J24IOqyveyasFxuICAgICAgICAgICAgci5zZWxlY3QgPSByLnNlbGVjdC5jb25jYXQoXG4gICAgICAgICAgICAgIHJlYWxGaWVsZHMubWFwKChmaWVsZCkgPT4gYCR7cHJlZml4fS4ke2ZpZWxkfSBhcyAke3ByZWZpeH1fXyR7ZmllbGR9YCksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiByO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVsYXRpb24gPSB0aGlzLnJlbGF0aW9uc1tncm91cEtleV07XG4gICAgICAgIGlmIChyZWxhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDsobTsnqztlZjsp4Ag7JWK64qUIHJlbGF0aW9uIOywuOyhsCAke2dyb3VwS2V5fWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlbEVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHJlbGF0aW9uLndpdGgpO1xuXG4gICAgICAgIGlmIChpc09uZVRvT25lUmVsYXRpb25Qcm9wKHJlbGF0aW9uKSB8fCBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChyZWxhdGlvbikpIHtcbiAgICAgICAgICAvLyAtT25lIFJlbGF0aW9uOiBKT0lOIOycvOuhnCDsspjrpqxcbiAgICAgICAgICBjb25zdCByZWxGaWVsZHMgPSBmaWVsZHMubWFwKChmaWVsZCkgPT4gZmllbGQuc3BsaXQoXCIuXCIpLnNsaWNlKDEpLmpvaW4oXCIuXCIpKTtcblxuICAgICAgICAgIC8vIC1PbmUgUmVsYXRpb27sl5DshJwgaWQg7ZWE65Oc66eMIOywuOyhsO2VmOuKlCDqsr3smrAg66a066CI7J207IWYIOuEmOq4sOyngCDslYrqs6Ag66as7YS0XG4gICAgICAgICAgaWYgKHJlbEZpZWxkcy5sZW5ndGggPT09IDEgJiYgcmVsRmllbGRzWzBdID09PSBcImlkXCIpIHtcbiAgICAgICAgICAgIGlmIChwcmVmaXggPT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgci5zZWxlY3QgPSByLnNlbGVjdC5jb25jYXQoYCR7dGhpcy50YWJsZX0uJHtncm91cEtleX1faWRgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHIuc2VsZWN0ID0gci5zZWxlY3QuY29uY2F0KGAke3ByZWZpeH0uJHtncm91cEtleX1faWQgYXMgJHtwcmVmaXh9X18ke2dyb3VwS2V5fV9pZGApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHI7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gaW5uZXJPck91dGVyXG4gICAgICAgICAgY29uc3QgaW5uZXJPck91dGVyID0gKCgpID0+IHtcbiAgICAgICAgICAgIGlmIChpc0FscmVhZHlPdXRlckpvaW5lZCkge1xuICAgICAgICAgICAgICByZXR1cm4gXCJvdXRlclwiO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChyZWxhdGlvbikpIHtcbiAgICAgICAgICAgICAgaWYgKHJlbGF0aW9uLmhhc0pvaW5Db2x1bW4gPT09IHRydWUgJiYgKHJlbGF0aW9uLm51bGxhYmxlID8/IGZhbHNlKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJpbm5lclwiO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBcIm91dGVyXCI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmIChyZWxhdGlvbi5udWxsYWJsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcIm91dGVyXCI7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiaW5uZXJcIjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pKCk7XG4gICAgICAgICAgY29uc3QgcmVsU3Vic2V0UXVlcnkgPSByZWxFbnRpdHkucmVzb2x2ZVN1YnNldFF1ZXJ5KFxuICAgICAgICAgICAgYCR7cHJlZml4ICE9PSBcIlwiID8gYCR7cHJlZml4fS5gIDogXCJcIn0ke2dyb3VwS2V5fWAsXG4gICAgICAgICAgICByZWxGaWVsZHMsXG4gICAgICAgICAgICBpbm5lck9yT3V0ZXIgPT09IFwib3V0ZXJcIixcbiAgICAgICAgICApO1xuICAgICAgICAgIHIuc2VsZWN0ID0gci5zZWxlY3QuY29uY2F0KHJlbFN1YnNldFF1ZXJ5LnNlbGVjdCk7XG4gICAgICAgICAgci52aXJ0dWFsID0gci52aXJ0dWFsLmNvbmNhdChyZWxTdWJzZXRRdWVyeS52aXJ0dWFsKTtcblxuICAgICAgICAgIGNvbnN0IGpvaW5BcyA9IHByZWZpeCA9PT0gXCJcIiA/IGdyb3VwS2V5IDogYCR7cHJlZml4fV9fJHtncm91cEtleX1gO1xuICAgICAgICAgIGNvbnN0IGZyb21UYWJsZSA9IHByZWZpeCA9PT0gXCJcIiA/IHRoaXMudGFibGUgOiBwcmVmaXg7XG5cbiAgICAgICAgICBsZXQgam9pbkNsYXVzZTpcbiAgICAgICAgICAgIHwge1xuICAgICAgICAgICAgICAgIGZyb206IHN0cmluZztcbiAgICAgICAgICAgICAgICB0bzogc3RyaW5nO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB8IHtcbiAgICAgICAgICAgICAgICBjdXN0b206IHN0cmluZztcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICBpZiAocmVsYXRpb24uY3VzdG9tSm9pbkNsYXVzZSkge1xuICAgICAgICAgICAgam9pbkNsYXVzZSA9IHtcbiAgICAgICAgICAgICAgY3VzdG9tOiByZWxhdGlvbi5jdXN0b21Kb2luQ2xhdXNlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGZyb206IHN0cmluZywgdG86IHN0cmluZztcbiAgICAgICAgICAgIGlmIChpc09uZVRvT25lUmVsYXRpb25Qcm9wKHJlbGF0aW9uKSkge1xuICAgICAgICAgICAgICBpZiAocmVsYXRpb24uaGFzSm9pbkNvbHVtbikge1xuICAgICAgICAgICAgICAgIGZyb20gPSBgJHtmcm9tVGFibGV9LiR7cmVsYXRpb24ubmFtZX1faWRgO1xuICAgICAgICAgICAgICAgIHRvID0gYCR7am9pbkFzfS5pZGA7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZnJvbSA9IGAke2Zyb21UYWJsZX0uaWRgO1xuICAgICAgICAgICAgICAgIHRvID0gYCR7am9pbkFzfS4ke2luZmxlY3Rpb24udW5kZXJzY29yZSh0aGlzLm5hbWVzLmZzLnJlcGxhY2UoLy0vZywgXCJfXCIpKX1faWRgO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBmcm9tID0gYCR7ZnJvbVRhYmxlfS4ke3JlbGF0aW9uLm5hbWV9X2lkYDtcbiAgICAgICAgICAgICAgdG8gPSBgJHtqb2luQXN9LmlkYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGpvaW5DbGF1c2UgPSB7XG4gICAgICAgICAgICAgIGZyb20sXG4gICAgICAgICAgICAgIHRvLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByLmpvaW5zLnB1c2goe1xuICAgICAgICAgICAgYXM6IGpvaW5BcyxcbiAgICAgICAgICAgIGpvaW46IGlubmVyT3JPdXRlcixcbiAgICAgICAgICAgIHRhYmxlOiByZWxFbnRpdHkudGFibGUsXG4gICAgICAgICAgICAuLi5qb2luQ2xhdXNlLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gQmVsb25nc1RvT25lIOuwkeyXkCBIYXNNYW556rCAIOu2meydgCDqsr3smrBcbiAgICAgICAgICBpZiAocmVsU3Vic2V0UXVlcnkubG9hZGVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBjb252ZXJ0ZWRMb2FkZXJzID0gcmVsU3Vic2V0UXVlcnkubG9hZGVycy5tYXAoKGxvYWRlcikgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBuZXdBcyA9IFtncm91cEtleSwgbG9hZGVyLmFzXS5qb2luKFwiX19cIik7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgYXM6IG5ld0FzLFxuICAgICAgICAgICAgICAgIHRhYmxlOiBsb2FkZXIudGFibGUsXG4gICAgICAgICAgICAgICAgbWFueUpvaW46IGxvYWRlci5tYW55Sm9pbixcbiAgICAgICAgICAgICAgICBvbmVKb2luczogbG9hZGVyLm9uZUpvaW5zLFxuICAgICAgICAgICAgICAgIHNlbGVjdDogbG9hZGVyLnNlbGVjdCxcbiAgICAgICAgICAgICAgICBsb2FkZXJzOiBsb2FkZXIubG9hZGVycyxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByLmxvYWRlcnMgPSBbLi4uci5sb2FkZXJzLCAuLi5jb252ZXJ0ZWRMb2FkZXJzXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByLmpvaW5zID0gci5qb2lucy5jb25jYXQocmVsU3Vic2V0UXVlcnkuam9pbnMpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzSGFzTWFueVJlbGF0aW9uUHJvcChyZWxhdGlvbikgfHwgaXNNYW55VG9NYW55UmVsYXRpb25Qcm9wKHJlbGF0aW9uKSkge1xuICAgICAgICAgIC8vIC1NYW55IFJlbGF0aW9uOiBMb2FkZXIg66GcIOyymOumrFxuICAgICAgICAgIGNvbnN0IHJlbEZpZWxkcyA9IGZpZWxkcy5tYXAoKGZpZWxkKSA9PiBmaWVsZC5zcGxpdChcIi5cIikuc2xpY2UoMSkuam9pbihcIi5cIikpO1xuICAgICAgICAgIGNvbnN0IHJlbFN1YnNldFF1ZXJ5ID0gcmVsRW50aXR5LnJlc29sdmVTdWJzZXRRdWVyeShcIlwiLCByZWxGaWVsZHMpO1xuXG4gICAgICAgICAgbGV0IG1hbnlKb2luOiBTdWJzZXRRdWVyeVtcImxvYWRlcnNcIl1bbnVtYmVyXVtcIm1hbnlKb2luXCJdO1xuICAgICAgICAgIGlmIChpc0hhc01hbnlSZWxhdGlvblByb3AocmVsYXRpb24pKSB7XG4gICAgICAgICAgICBjb25zdCBmcm9tQ29sID0gcmVsYXRpb24/LmZyb21Db2x1bW4gPz8gXCJpZFwiO1xuICAgICAgICAgICAgbWFueUpvaW4gPSB7XG4gICAgICAgICAgICAgIGZyb21UYWJsZTogdGhpcy50YWJsZSxcbiAgICAgICAgICAgICAgZnJvbUNvbCxcbiAgICAgICAgICAgICAgaWRGaWVsZDogcHJlZml4ID09PSBcIlwiID8gYCR7ZnJvbUNvbH1gIDogYCR7cHJlZml4fV9fJHtmcm9tQ29sfWAsXG4gICAgICAgICAgICAgIHRvVGFibGU6IHJlbEVudGl0eS50YWJsZSxcbiAgICAgICAgICAgICAgdG9Db2w6IHJlbGF0aW9uLmpvaW5Db2x1bW4sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0gZWxzZSBpZiAoaXNNYW55VG9NYW55UmVsYXRpb25Qcm9wKHJlbGF0aW9uKSkge1xuICAgICAgICAgICAgbWFueUpvaW4gPSB7XG4gICAgICAgICAgICAgIGZyb21UYWJsZTogdGhpcy50YWJsZSxcbiAgICAgICAgICAgICAgZnJvbUNvbDogXCJpZFwiLFxuICAgICAgICAgICAgICBpZEZpZWxkOiBwcmVmaXggPT09IFwiXCIgPyBgaWRgIDogYCR7cHJlZml4fV9faWRgLFxuICAgICAgICAgICAgICB0aHJvdWdoOiB7XG4gICAgICAgICAgICAgICAgdGFibGU6IHJlbGF0aW9uLmpvaW5UYWJsZSxcbiAgICAgICAgICAgICAgICBmcm9tQ29sOiBgJHtpbmZsZWN0aW9uLnNpbmd1bGFyaXplKHRoaXMudGFibGUpfV9pZGAsXG4gICAgICAgICAgICAgICAgdG9Db2w6IGAke2luZmxlY3Rpb24uc2luZ3VsYXJpemUocmVsRW50aXR5LnRhYmxlKX1faWRgLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB0b1RhYmxlOiByZWxFbnRpdHkudGFibGUsXG4gICAgICAgICAgICAgIHRvQ29sOiBcImlkXCIsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByLmxvYWRlcnMucHVzaCh7XG4gICAgICAgICAgICBhczogZ3JvdXBLZXksXG4gICAgICAgICAgICB0YWJsZTogcmVsRW50aXR5LnRhYmxlLFxuICAgICAgICAgICAgbWFueUpvaW4sXG4gICAgICAgICAgICBvbmVKb2luczogcmVsU3Vic2V0UXVlcnkuam9pbnMsXG4gICAgICAgICAgICBzZWxlY3Q6IHJlbFN1YnNldFF1ZXJ5LnNlbGVjdCxcbiAgICAgICAgICAgIGxvYWRlcnM6IHJlbFN1YnNldFF1ZXJ5LmxvYWRlcnMsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcjtcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHNlbGVjdDogW10sXG4gICAgICAgIHZpcnR1YWw6IFtdLFxuICAgICAgICBqb2luczogW10sXG4gICAgICAgIGxvYWRlcnM6IFtdLFxuICAgICAgfSBhcyBTdWJzZXRRdWVyeSxcbiAgICApO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKlxuICAgIEZpZWxkRXhwcltdIOydhCBFbnRpdHlQcm9wTm9kZVtdIOuhnCDrs4DtmZhcbiAgKi9cbiAgZmllbGRFeHByc1RvUHJvcE5vZGVzKGZpZWxkRXhwcnM6IHN0cmluZ1tdLCBlbnRpdHk6IEVudGl0eSA9IHRoaXMpOiBFbnRpdHlQcm9wTm9kZVtdIHtcbiAgICBjb25zdCBncm91cHMgPSBmaWVsZEV4cHJzLnJlZHVjZShcbiAgICAgIChyZXN1bHQsIGZpZWxkRXhwcikgPT4ge1xuICAgICAgICBsZXQga2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcsIGVsc2VFeHByOiBzdHJpbmdbXTtcbiAgICAgICAgaWYgKGZpZWxkRXhwci5pbmNsdWRlcyhcIi5cIikpIHtcbiAgICAgICAgICBba2V5LCAuLi5lbHNlRXhwcl0gPSBmaWVsZEV4cHIuc3BsaXQoXCIuXCIpO1xuICAgICAgICAgIHZhbHVlID0gZWxzZUV4cHIuam9pbihcIi5cIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAga2V5ID0gXCJcIjtcbiAgICAgICAgICB2YWx1ZSA9IGZpZWxkRXhwcjtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHRba2V5XSA9IChyZXN1bHRba2V5XSA/PyBbXSkuY29uY2F0KHZhbHVlKTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSxcbiAgICAgIHt9IGFzIHtcbiAgICAgICAgW2s6IHN0cmluZ106IHN0cmluZ1tdO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGdyb3VwcykuZmxhdE1hcCgoa2V5KSA9PiB7XG4gICAgICBjb25zdCBncm91cCA9IGdyb3Vwc1trZXldO1xuXG4gICAgICAvLyDsnbzrsJggcHJvcCDsspjrpqxcbiAgICAgIGlmIChrZXkgPT09IFwiXCIpIHtcbiAgICAgICAgcmV0dXJuIGdyb3VwLm1hcCgocHJvcE5hbWUpID0+IHtcbiAgICAgICAgICAvLyBGSVhNRTog7J206rGwIOuCmOykkeyXkCDsl4bslaDslbztlahcbiAgICAgICAgICBpZiAocHJvcE5hbWUgPT09IFwi66eQ64+E7JWI65CY64qU7ZSE66Gt66qFX1/snbTqsbDsmZztg4DsnoXsspjrpqzqsIDqvKzsl6zshJzsnbTrn6zsp4A/XCIpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIG5vZGVUeXBlOiBcInBsYWluXCIgYXMgY29uc3QsXG4gICAgICAgICAgICAgIHByb3A6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIG5hbWU6IFwidXVpZFwiLFxuICAgICAgICAgICAgICAgIGxlbmd0aDogMTI4LFxuICAgICAgICAgICAgICB9IGFzIFN0cmluZ1Byb3AsXG4gICAgICAgICAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICAgICAgICAgIH0gYXMgRW50aXR5UHJvcE5vZGU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgcHJvcCA9IGVudGl0eS5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IHByb3BOYW1lKTtcbiAgICAgICAgICBpZiAocHJvcCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyh7IHByb3BOYW1lLCBncm91cHMgfSk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZW50aXR5LmlkfSAtLSDsnpjrqrvrkJwgRmllbGRFeHByICR7cHJvcE5hbWV9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBub2RlVHlwZTogXCJwbGFpblwiIGFzIGNvbnN0LFxuICAgICAgICAgICAgcHJvcCxcbiAgICAgICAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gcmVsYXRpb24gcHJvcCDsspjrpqxcbiAgICAgIGNvbnN0IHByb3AgPSBlbnRpdHkucHJvcHNEaWN0W2tleV07XG4gICAgICBpZiAoIWlzUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihg7J6Y66q765CcIEZpZWxkRXhwciAke2tleX0uJHtncm91cFswXX1gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlbEVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHByb3Aud2l0aCk7XG5cbiAgICAgIC8vIHJlbGF0aW9uIC1PbmUg7JeQIGlkIO2VhOuTnCDtlZjrgpjsnbgg6rK97JqwXG4gICAgICBpZiAoaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocHJvcCkgfHwgaXNPbmVUb09uZVJlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICBpZiAoZ3JvdXAubGVuZ3RoID09PSAxICYmIChncm91cFswXSA9PT0gXCJpZFwiIHx8IGdyb3VwWzBdID09PSBcImlkP1wiKSkge1xuICAgICAgICAgIC8vIGlkIO2VmOuCmOunjCDsnojripTsp4Ag7LK07YGs7ZW07IScLCDtlZjrgpjrp4wg7J6I7Jy866m0IOyDgeychCBwcm9w7Jy866GcIGlk66W8IOumrO2EtFxuICAgICAgICAgIGNvbnN0IGlkUHJvcCA9IHJlbEVudGl0eS5wcm9wc0RpY3QuaWQ7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5vZGVUeXBlOiBcInBsYWluXCIgYXMgY29uc3QsXG4gICAgICAgICAgICBwcm9wOiB7XG4gICAgICAgICAgICAgIC4uLmlkUHJvcCxcbiAgICAgICAgICAgICAgbmFtZTogYCR7a2V5fV9pZGAsXG4gICAgICAgICAgICAgIG51bGxhYmxlOiBwcm9wLm51bGxhYmxlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIC1PbmUg6re47Jm47J2YIOqyveyasCBvYmplY3TroZwg66as7YS0XG4gICAgICAvLyAtTWFueeydmCDqsr3smrAgYXJyYXnroZwg66as7YS0XG4gICAgICAvLyBSZWN1cnNpdmUg66GcIOuOgeyKpCDsspjrpqxcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5maWVsZEV4cHJzVG9Qcm9wTm9kZXMoZ3JvdXAsIHJlbEVudGl0eSk7XG4gICAgICBjb25zdCBub2RlVHlwZSA9XG4gICAgICAgIGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKHByb3ApIHx8IGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcClcbiAgICAgICAgICA/IChcIm9iamVjdFwiIGFzIGNvbnN0KVxuICAgICAgICAgIDogKFwiYXJyYXlcIiBhcyBjb25zdCk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHByb3AsXG4gICAgICAgIGNoaWxkcmVuLFxuICAgICAgICBub2RlVHlwZSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBnZXRGaWVsZEV4cHJzKHByZWZpeCA9IFwiXCIsIG1heERlcHRoOiBudW1iZXIgPSAzLCBmcm9tczogc3RyaW5nW10gPSBbXSk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wc1xuICAgICAgLmZsYXRNYXAoKHByb3ApID0+IHtcbiAgICAgICAgY29uc3QgcHJvcE5hbWUgPSBbcHJlZml4LCBwcm9wLm5hbWVdLmZpbHRlcigodikgPT4gdiAhPT0gXCJcIikuam9pbihcIi5cIik7XG4gICAgICAgIGlmIChwcm9wTmFtZSA9PT0gcHJlZml4KSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgICAgaWYgKG1heERlcHRoIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChmcm9tcy5pbmNsdWRlcyhwcm9wLndpdGgpKSB7XG4gICAgICAgICAgICAvLyDsl63rsKntlqUgcmVsYXRpb27snbgg6rK97JqwIOygnOyZuFxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIOygleuwqe2WpSByZWxhdGlvbuyduCDqsr3smrAgcmVjdXJzaXZlIOy9nFxuICAgICAgICAgIGNvbnN0IHJlbE1kID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcbiAgICAgICAgICByZXR1cm4gcmVsTWQuZ2V0RmllbGRFeHBycyhwcm9wTmFtZSwgbWF4RGVwdGggLSAxLCBbLi4uZnJvbXMsIHRoaXMuaWRdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvcE5hbWU7XG4gICAgICB9KVxuICAgICAgLmZpbHRlcigoZikgPT4gZiAhPT0gbnVsbCkgYXMgc3RyaW5nW107XG4gIH1cblxuICBnZXRUYWJsZUNvbHVtbnMoKTogeyBuYW1lOiBzdHJpbmc7IHR5cGU6IHN0cmluZyB9W10ge1xuICAgIHJldHVybiB0aGlzLnByb3BzXG4gICAgICAubWFwKChwcm9wKSA9PiB7XG4gICAgICAgIGlmIChwcm9wLnR5cGUgPT09IFwicmVsYXRpb25cIikge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHByb3AucmVsYXRpb25UeXBlID09PSBcIkJlbG9uZ3NUb09uZVwiIHx8XG4gICAgICAgICAgICAocHJvcC5yZWxhdGlvblR5cGUgPT09IFwiT25lVG9PbmVcIiAmJiBwcm9wLmhhc0pvaW5Db2x1bW4gPT09IHRydWUpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4geyBuYW1lOiBgJHtwcm9wLm5hbWV9X2lkYCwgdHlwZTogXCJpbnRfdW5zaWduZWRcIiB9O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgbmFtZTogcHJvcC5uYW1lLCB0eXBlOiBwcm9wLnR5cGUgfTtcbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKG5vbk51bGxhYmxlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnRpdHnsl5Ag7KCV7J2Y65CcIOuqqOuToCB2ZWN0b3Ig7YOA7J6FIOy7rOufvCDrsJjtmZhcbiAgICovXG4gIGdldFZlY3RvckNvbHVtbnMoKTogRW50aXR5UHJvcFtdIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5maWx0ZXIoKHApID0+IHAudHlwZSA9PT0gXCJ2ZWN0b3JcIik7XG4gIH1cblxuICAvKipcbiAgICog7Yq57KCVIHZlY3RvciDsu6zrn7wg67CY7ZmYXG4gICAqIEBwYXJhbSBjb2x1bW5OYW1lIC0g7Lus65+866qFICjsg53rnrUg7IucIOyyqyDrsojsp7ggdmVjdG9yIOy7rOufvClcbiAgICovXG4gIGdldFZlY3RvckNvbHVtbihjb2x1bW5OYW1lPzogc3RyaW5nKTogRW50aXR5UHJvcCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgdmVjdG9yUHJvcHMgPSB0aGlzLmdldFZlY3RvckNvbHVtbnMoKTtcbiAgICBpZiAoY29sdW1uTmFtZSkge1xuICAgICAgcmV0dXJuIHZlY3RvclByb3BzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gY29sdW1uTmFtZSk7XG4gICAgfVxuICAgIHJldHVybiB2ZWN0b3JQcm9wc1swXTtcbiAgfVxuXG4gIGFzeW5jIHJlZ2lzdGVyTW9kdWxlUGF0aHMoKSB7XG4gICAgY29uc3QgYmFzZVBhdGggPSBgJHt0aGlzLm5hbWVzLnBhcmVudEZzfWA7XG5cbiAgICAvLyBiYXNlLXNjaGVtZVxuICAgIEVudGl0eU1hbmFnZXIuc2V0TW9kdWxlUGF0aChgJHt0aGlzLmlkfUJhc2VTY2hlbWFgLCBgc29uYW11LmdlbmVyYXRlZGApO1xuXG4gICAgLy8gc3Vic2V0XG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuc3Vic2V0cykubGVuZ3RoID4gMCkge1xuICAgICAgRW50aXR5TWFuYWdlci5zZXRNb2R1bGVQYXRoKGAke3RoaXMuaWR9U3Vic2V0S2V5YCwgYHNvbmFtdS5nZW5lcmF0ZWRgKTtcbiAgICAgIEVudGl0eU1hbmFnZXIuc2V0TW9kdWxlUGF0aChgJHt0aGlzLmlkfVN1YnNldE1hcHBpbmdgLCBgc29uYW11LmdlbmVyYXRlZGApO1xuICAgICAgZm9yIChjb25zdCBzdWJzZXRLZXkgb2YgT2JqZWN0LmtleXModGhpcy5zdWJzZXRzKSkge1xuICAgICAgICBFbnRpdHlNYW5hZ2VyLnNldE1vZHVsZVBhdGgoXG4gICAgICAgICAgYCR7dGhpcy5pZH1TdWJzZXQke3N1YnNldEtleS50b1VwcGVyQ2FzZSgpfWAsXG4gICAgICAgICAgYHNvbmFtdS5nZW5lcmF0ZWRgLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGVudW1zXG4gICAgZm9yIChjb25zdCBlbnVtSWQgb2YgT2JqZWN0LmtleXModGhpcy5lbnVtTGFiZWxzKSkge1xuICAgICAgRW50aXR5TWFuYWdlci5zZXRNb2R1bGVQYXRoKGVudW1JZCwgYHNvbmFtdS5nZW5lcmF0ZWRgKTtcbiAgICB9XG5cbiAgICAvLyB0eXBlc1xuICAgIGNvbnN0IHR5cGVzTW9kdWxlUGF0aCA9IGAke2Jhc2VQYXRofS8ke3RoaXMubmFtZXMucGFyZW50RnN9LnR5cGVzYDtcbiAgICBjb25zdCB0eXBlc0ZpbGVQYXRoID0gcGF0aC5qb2luKFxuICAgICAgU29uYW11LmFwaVJvb3RQYXRoLFxuICAgICAgcnVudGltZVBhdGgoYGRpc3QvYXBwbGljYXRpb24vJHt0eXBlc01vZHVsZVBhdGh9LmpzYCksXG4gICAgKTtcblxuICAgIGlmIChhd2FpdCBleGlzdHModHlwZXNGaWxlUGF0aCkpIHtcbiAgICAgIGNvbnN0IGltcG9ydGVkTWVtYmVycyA9IGF3YWl0IGltcG9ydE1lbWJlcnM8ei5ab2RUeXBlQW55Pih0eXBlc0ZpbGVQYXRoKTtcbiAgICAgIHRoaXMudHlwZXMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgIGltcG9ydGVkTWVtYmVycy5tYXAoKHsgbmFtZSwgdmFsdWUgfSkgPT4ge1xuICAgICAgICAgIEVudGl0eU1hbmFnZXIuc2V0TW9kdWxlUGF0aChuYW1lLCB0eXBlc01vZHVsZVBhdGgpO1xuICAgICAgICAgIHJldHVybiBbbmFtZSwgdmFsdWVdO1xuICAgICAgICB9KSxcbiAgICAgICkgYXMgeyBbbmFtZTogc3RyaW5nXTogei5ab2RUeXBlQW55IH07XG4gICAgfVxuICB9XG5cbiAgcmVnaXN0ZXJUYWJsZVNwZWNzKCk6IHZvaWQge1xuICAgIC8vIOyhsOyduCDthYzsnbTruJQg7J24642x7IqkIOygnOyZuCAo7Lus65+8IOydtOumhOyXkCAnLifsnbQg7Y+s7ZWo65CcIOqyveyasClcbiAgICBjb25zdCB1bmlxdWVJbmRleGVzID0gdGhpcy5pbmRleGVzXG4gICAgICAuZmlsdGVyKChpZHgpID0+IGlkeC50eXBlID09PSBcInVuaXF1ZVwiKVxuICAgICAgLmZpbHRlcigoaWR4KSA9PiBpZHguY29sdW1ucy5ldmVyeSgoY29sKSA9PiAhY29sLm5hbWUuaW5jbHVkZXMoXCIuXCIpKSk7XG5cbiAgICBFbnRpdHlNYW5hZ2VyLnNldFRhYmxlU3BlYyh7XG4gICAgICBuYW1lOiB0aGlzLnRhYmxlLFxuICAgICAgdW5pcXVlSW5kZXhlcyxcbiAgICB9KTtcbiAgfVxuXG4gIHRvSnNvbigpOiBFbnRpdHlKc29uIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICBwYXJlbnRJZDogdGhpcy5wYXJlbnRJZCxcbiAgICAgIHRhYmxlOiB0aGlzLnRhYmxlLFxuICAgICAgdGl0bGU6IHRoaXMudGl0bGUsXG4gICAgICBwcm9wczogdGhpcy5wcm9wcyxcbiAgICAgIGluZGV4ZXM6IHRoaXMuaW5kZXhlcyxcbiAgICAgIHN1YnNldHM6IHRoaXMuc3Vic2V0cyxcbiAgICAgIGVudW1zOiB0aGlzLmVudW1MYWJlbHMsXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIHNhdmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gc29ydDogc3Vic2V0c1xuICAgIGNvbnN0IHN1YnNldFJvd3MgPSB0aGlzLmdldFN1YnNldFJvd3MoKTtcbiAgICB0aGlzLnN1YnNldHMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyh0aGlzLnN1YnNldHMpLm1hcCgoW3N1YnNldEtleV0pID0+IHtcbiAgICAgICAgcmV0dXJuIFtzdWJzZXRLZXksIHRoaXMuc3Vic2V0Um93c1RvU3Vic2V0RmllbGRzKHN1YnNldFJvd3MsIHN1YnNldEtleSldO1xuICAgICAgfSksXG4gICAgKTtcblxuICAgIC8vIHNhdmVcbiAgICBjb25zdCBqc29uUGF0aCA9IHBhdGguam9pbihcbiAgICAgIFNvbmFtdS5hcGlSb290UGF0aCxcbiAgICAgIGBzcmMvYXBwbGljYXRpb24vJHt0aGlzLm5hbWVzLnBhcmVudEZzfS8ke3RoaXMubmFtZXMuZnN9LmVudGl0eS5qc29uYCxcbiAgICApO1xuICAgIGNvbnN0IGpzb24gPSB0aGlzLnRvSnNvbigpO1xuICAgIGF3YWl0IHdyaXRlRmlsZShqc29uUGF0aCwgZm9ybWF0Q29kZShKU09OLnN0cmluZ2lmeShqc29uKSwgXCJqc29uXCIsIGpzb25QYXRoKSk7XG5cbiAgICAvLyByZWxvYWRcbiAgICBhd2FpdCBFbnRpdHlNYW5hZ2VyLnJlZ2lzdGVyKGpzb24pO1xuICB9XG5cbiAgZ2V0U3Vic2V0Um93cyhcbiAgICBfc3Vic2V0cz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nW10gfSxcbiAgICBwcmVmaXhlczogc3RyaW5nW10gPSBbXSxcbiAgKTogRW50aXR5U3Vic2V0Um93W10ge1xuICAgIGlmIChwcmVmaXhlcy5sZW5ndGggPiAxMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IHN1YnNldHMgPSBfc3Vic2V0cyA/PyB0aGlzLnN1YnNldHM7XG4gICAgY29uc3Qgc3Vic2V0S2V5cyA9IE9iamVjdC5rZXlzKHN1YnNldHMpO1xuICAgIGNvbnN0IGFsbEZpZWxkcyA9IHVuaXF1ZShzdWJzZXRLZXlzLmZsYXRNYXAoKGtleSkgPT4gc3Vic2V0c1trZXldKSk7XG5cbiAgICByZXR1cm4gdGhpcy5wcm9wcy5tYXAoKHByb3ApID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgcHJvcC50eXBlID09PSBcInJlbGF0aW9uXCIgJiZcbiAgICAgICAgYWxsRmllbGRzLmZpbmQoKGYpID0+IGYuc3RhcnRzV2l0aChgJHtbLi4ucHJlZml4ZXMsIHByb3AubmFtZV0uam9pbihcIi5cIil9LmApKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHJlbEVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHByb3Aud2l0aCk7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gcmVsRW50aXR5LmdldFN1YnNldFJvd3Moc3Vic2V0cywgWy4uLnByZWZpeGVzLCBgJHtwcm9wLm5hbWV9YF0pO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZmllbGQ6IHByb3AubmFtZSxcbiAgICAgICAgICBjaGlsZHJlbixcbiAgICAgICAgICByZWxhdGlvbkVudGl0eTogcHJvcC53aXRoLFxuICAgICAgICAgIHByZWZpeGVzLFxuICAgICAgICAgIGlzT3BlbjogY2hpbGRyZW4ubGVuZ3RoID4gMCxcbiAgICAgICAgICBoYXM6IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICAgIHN1YnNldEtleXMubWFwKChzdWJzZXRLZXkpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIFtzdWJzZXRLZXksIGNoaWxkcmVuLmV2ZXJ5KChjaGlsZCkgPT4gY2hpbGQuaGFzW3N1YnNldEtleV0gPT09IHRydWUpXTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICksXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZpZWxkOiBwcm9wLm5hbWUsXG4gICAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICAgICAgcmVsYXRpb25FbnRpdHk6IHByb3AudHlwZSA9PT0gXCJyZWxhdGlvblwiID8gcHJvcC53aXRoIDogdW5kZWZpbmVkLFxuICAgICAgICBwcmVmaXhlcyxcbiAgICAgICAgaGFzOiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgc3Vic2V0S2V5cy5tYXAoKHN1YnNldEtleSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3Vic2V0RmllbGRzID0gc3Vic2V0c1tzdWJzZXRLZXldO1xuICAgICAgICAgICAgY29uc3QgaGFzID0gc3Vic2V0RmllbGRzLnNvbWUoKGYpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgZmllbGQgPSBbLi4ucHJlZml4ZXMsIHByb3AubmFtZV0uam9pbihcIi5cIik7XG4gICAgICAgICAgICAgIHJldHVybiBmID09PSBmaWVsZCB8fCBmLnN0YXJ0c1dpdGgoYCR7ZmllbGR9LmApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gW3N1YnNldEtleSwgaGFzXTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgKSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBzdWJzZXRSb3dzVG9TdWJzZXRGaWVsZHMoc3Vic2V0Um93czogRW50aXR5U3Vic2V0Um93W10sIHN1YnNldEtleTogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBzdWJzZXRSb3dzXG4gICAgICAubWFwKChzdWJzZXRSb3cpID0+IHtcbiAgICAgICAgaWYgKHN1YnNldFJvdy5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc3Vic2V0Um93c1RvU3Vic2V0RmllbGRzKHN1YnNldFJvdy5jaGlsZHJlbiwgc3Vic2V0S2V5KTtcbiAgICAgICAgfSBlbHNlIGlmIChzdWJzZXRSb3cuaGFzW3N1YnNldEtleV0pIHtcbiAgICAgICAgICByZXR1cm4gc3Vic2V0Um93LnByZWZpeGVzLmNvbmNhdChzdWJzZXRSb3cuZmllbGQpLmpvaW4oXCIuXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLmZpbHRlcihub25OdWxsYWJsZSlcbiAgICAgIC5mbGF0KCk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVQcm9wKHByb3A6IEVudGl0eVByb3AsIGF0PzogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFhdCkge1xuICAgICAgdGhpcy5wcm9wcy5wdXNoKHByb3ApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnByb3BzLnNwbGljZShhdCwgMCwgcHJvcCk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuc2F2ZSgpO1xuICB9XG5cbiAgYW5hbHl6ZVN1YnNldEZpZWxkKHN1YnNldEZpZWxkOiBzdHJpbmcpOiB7XG4gICAgZW50aXR5SWQ6IHN0cmluZztcbiAgICBwcm9wTmFtZTogc3RyaW5nO1xuICB9W10ge1xuICAgIGNvbnN0IGFyciA9IHN1YnNldEZpZWxkLnNwbGl0KFwiLlwiKTtcblxuICAgIGxldCBlbnRpdHlJZCA9IHRoaXMuaWQ7XG4gICAgY29uc3QgcmVzdWx0OiB7XG4gICAgICBlbnRpdHlJZDogc3RyaW5nO1xuICAgICAgcHJvcE5hbWU6IHN0cmluZztcbiAgICB9W10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgcHJvcE5hbWUgPSBhcnJbaV07XG4gICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgIGVudGl0eUlkLFxuICAgICAgICBwcm9wTmFtZSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBwcm9wID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpLnByb3BzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gcHJvcE5hbWUpO1xuICAgICAgaWYgKCFwcm9wKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtlbnRpdHlJZH3snZgg7J6Y66q765CcIOyEnOu4jOyFi+2CpCAke3N1YnNldEZpZWxkfWApO1xuICAgICAgfVxuICAgICAgaWYgKGlzUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgIGVudGl0eUlkID0gcHJvcC53aXRoO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgYXN5bmMgbW9kaWZ5UHJvcChuZXdQcm9wOiBFbnRpdHlQcm9wLCBhdDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8g7J207KCEIO2UhOuhrSDsnbTrpoQg7KCA7J6lXG4gICAgY29uc3Qgb2xkTmFtZSA9IHRoaXMucHJvcHNbYXRdLm5hbWU7XG5cbiAgICAvLyDsoIDsnqXtlaAg7JeU7Yuw7YuwXG4gICAgY29uc3QgZW50aXRpZXM6IEVudGl0eVtdID0gW3RoaXNdO1xuXG4gICAgLy8g7J2066aE7J20IOuwlOuAkCDqsr3smrBcbiAgICBpZiAob2xkTmFtZSAhPT0gbmV3UHJvcC5uYW1lKSB7XG4gICAgICAvLyDsoITssrQg7JeU7Yuw7Yuw7JeQ7IScIO2YhOyerCDsiJjsoJXrkJwg7ZSE66Gt7J2EIOywuOyhsO2VmOqzoCDsnojripQg66qo65OgIOyEnOu4jOyFi+2VhOuTnCDssL7slYTshJwg7IiY7KCVXG4gICAgICBjb25zdCBhbGxFbnRpdHlJZHMgPSBFbnRpdHlNYW5hZ2VyLmdldEFsbElkcygpO1xuICAgICAgZm9yIChjb25zdCByZWxFbnRpdHlJZCBvZiBhbGxFbnRpdHlJZHMpIHtcbiAgICAgICAgY29uc3QgcmVsRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocmVsRW50aXR5SWQpO1xuICAgICAgICBjb25zdCByZWxFbnRpdHlTdWJzZXRLZXlzID0gT2JqZWN0LmtleXMocmVsRW50aXR5LnN1YnNldHMpO1xuICAgICAgICBmb3IgKGNvbnN0IHN1YnNldEtleSBvZiByZWxFbnRpdHlTdWJzZXRLZXlzKSB7XG4gICAgICAgICAgY29uc3Qgc3Vic2V0ID0gcmVsRW50aXR5LnN1YnNldHNbc3Vic2V0S2V5XTtcblxuICAgICAgICAgIC8vIOyEnOu4jOyFiyDtlYTrk5zrpbwg7Iic7ZqM7ZWY66mwLCDsl5Tti7Dti7At7ZSE66GtIOuLqOychOuhnCDrtoTshJ3tlZwg7ZuEIO2YhOyerCDsl5Tti7Dti7At7ZSE66Gt6rO8IOydvOy5mO2VmOuKlCDqsr3smrAg7IiY7KCVIOyymOumrFxuICAgICAgICAgIGNvbnN0IG1vZGlmaWVkU3Vic2V0RmllbGRzID0gc3Vic2V0Lm1hcCgoc3Vic2V0RmllbGQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFuYWx5emVkID0gcmVsRW50aXR5LmFuYWx5emVTdWJzZXRGaWVsZChzdWJzZXRGaWVsZCk7XG4gICAgICAgICAgICBjb25zdCBtb2RpZmllZCA9IGFuYWx5emVkLm1hcCgoYSkgPT5cbiAgICAgICAgICAgICAgYS5wcm9wTmFtZSA9PT0gb2xkTmFtZSAmJiBhLmVudGl0eUlkID09PSB0aGlzLmlkXG4gICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgIC4uLmEsXG4gICAgICAgICAgICAgICAgICAgIHByb3BOYW1lOiBuZXdQcm9wLm5hbWUsXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgOiBhLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIC8vIOu2hOyEne2VnCDtlYTrk5zrpbwg64uk7IucIOyEnOu4jOyFiyDtlYTrk5zroZwg67O16rWsXG4gICAgICAgICAgICByZXR1cm4gbW9kaWZpZWQubWFwKChhKSA9PiBhLnByb3BOYW1lKS5qb2luKFwiLlwiKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmIChzdWJzZXQuam9pbihcIixcIikgIT09IG1vZGlmaWVkU3Vic2V0RmllbGRzLmpvaW4oXCIsXCIpKSB7XG4gICAgICAgICAgICByZWxFbnRpdHkuc3Vic2V0c1tzdWJzZXRLZXldID0gbW9kaWZpZWRTdWJzZXRGaWVsZHM7XG4gICAgICAgICAgICBlbnRpdGllcy5wdXNoKHJlbEVudGl0eSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g7ZSE66GtIOyImOyglVxuICAgIHRoaXMucHJvcHNbYXRdID0gbmV3UHJvcDtcblxuICAgIGF3YWl0IFByb21pc2UuYWxsKGVudGl0aWVzLm1hcChhc3luYyAoZW50aXR5KSA9PiBlbnRpdHkuc2F2ZSgpKSk7XG4gIH1cblxuICBhc3luYyBkZWxQcm9wKGF0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyDsnbTsoIQg7ZSE66GtIOydtOumhCDsoIDsnqVcbiAgICBjb25zdCBvbGROYW1lID0gdGhpcy5wcm9wc1thdF0ubmFtZTtcblxuICAgIC8vIOyggOyepe2VoCDsl5Tti7Dti7BcbiAgICBjb25zdCBlbnRpdGllczogRW50aXR5W10gPSBbdGhpc107XG5cbiAgICAvLyDsoITssrQg7JeU7Yuw7Yuw7JeQ7IScIO2YhOyerCDsgq3soJzrkJwg7ZSE66Gt7J2EIOywuOyhsO2VmOqzoCDsnojripQg66qo65OgIOyEnOu4jOyFi+2VhOuTnCDssL7slYTshJwg7KCc7Jm4XG4gICAgY29uc3QgYWxsRW50aXR5SWRzID0gRW50aXR5TWFuYWdlci5nZXRBbGxJZHMoKTtcbiAgICBmb3IgKGNvbnN0IHJlbEVudGl0eUlkIG9mIGFsbEVudGl0eUlkcykge1xuICAgICAgY29uc3QgcmVsRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocmVsRW50aXR5SWQpO1xuICAgICAgY29uc3QgcmVsRW50aXR5U3Vic2V0S2V5cyA9IE9iamVjdC5rZXlzKHJlbEVudGl0eS5zdWJzZXRzKTtcbiAgICAgIGZvciAoY29uc3Qgc3Vic2V0S2V5IG9mIHJlbEVudGl0eVN1YnNldEtleXMpIHtcbiAgICAgICAgY29uc3Qgc3Vic2V0ID0gcmVsRW50aXR5LnN1YnNldHNbc3Vic2V0S2V5XTtcbiAgICAgICAgLy8g7ISc67iM7IWLIO2VhOuTnOulvCDsiJztmoztlZjrqbAsIOyXlO2LsO2LsC3tlITroa0g64uo7JyE66GcIOu2hOyEne2VnCDtm4Qg7ZiE7J6sIOyXlO2LsO2LsC3tlITroa3qs7wg7J287LmY7ZWY64qUIOqyveyasCDsnbTtm4TsnZgg7ZWE65Oc66W8IOygnOyZuFxuICAgICAgICBjb25zdCBtb2RpZmllZFN1YnNldEZpZWxkcyA9IHN1YnNldFxuICAgICAgICAgIC5tYXAoKHN1YnNldEZpZWxkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhbmFseXplZCA9IHJlbEVudGl0eS5hbmFseXplU3Vic2V0RmllbGQoc3Vic2V0RmllbGQpO1xuICAgICAgICAgICAgaWYgKGFuYWx5emVkLmZpbmQoKGEpID0+IGEucHJvcE5hbWUgPT09IG9sZE5hbWUgJiYgYS5lbnRpdHlJZCA9PT0gdGhpcy5pZCkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gc3Vic2V0RmllbGQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuZmlsdGVyKG5vbk51bGxhYmxlKTtcblxuICAgICAgICBpZiAoc3Vic2V0LmpvaW4oXCIsXCIpICE9PSBtb2RpZmllZFN1YnNldEZpZWxkcy5qb2luKFwiLFwiKSkge1xuICAgICAgICAgIHJlbEVudGl0eS5zdWJzZXRzW3N1YnNldEtleV0gPSBtb2RpZmllZFN1YnNldEZpZWxkcztcbiAgICAgICAgICBlbnRpdGllcy5wdXNoKHJlbEVudGl0eSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDtmITsnqwg7JeU7Yuw7Yuw7J2YIOyduOuNseyKpOyXkOyEnCDsoJzsmbhcbiAgICBmb3IgKGNvbnN0IGluZGV4IG9mIEVudGl0eU1hbmFnZXIuZ2V0KHRoaXMuaWQpLmluZGV4ZXMpIHtcbiAgICAgIGluZGV4LmNvbHVtbnMgPSBpbmRleC5jb2x1bW5zLmZpbHRlcigoY29sKSA9PiBjb2wubmFtZSAhPT0gb2xkTmFtZSk7XG4gICAgfVxuXG4gICAgLy8g7ZSE66GtIOyCreygnFxuICAgIHRoaXMucHJvcHMuc3BsaWNlKGF0LCAxKTtcblxuICAgIGF3YWl0IFByb21pc2UuYWxsKGVudGl0aWVzLm1hcChhc3luYyAoZW50aXR5KSA9PiBlbnRpdHkuc2F2ZSgpKSk7XG4gIH1cblxuICBnZXRFbnRpdHlJZEZyb21TdWJzZXRGaWVsZChzdWJzZXRGaWVsZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoc3Vic2V0RmllbGQuaW5jbHVkZXMoXCIuXCIpID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIHRoaXMuaWQ7XG4gICAgfVxuXG4gICAgLy8g7ISc67iM7IWLIO2VhOuTnOydmCDrp4jsp4Drp4nsnYAg7ZSE66Gt7J2066+A66GcIOygnOyZuFxuICAgIGNvbnN0IGFyciA9IHN1YnNldEZpZWxkLnNwbGl0KFwiLlwiKS5zbGljZSgwLCAtMSk7XG5cbiAgICAvLyDshJzruIzshYsg7ZWE65Oc66W8IOuCtOugpOqwgOuptOyEnCDrp4jsp4Drp4nsnLzroZwgcmVsYXRpb27rkJwg7JeU7Yuw7Yuw66W8IOywvuydjFxuICAgIGNvbnN0IGxhc3RFbnRpdHlJZCA9IGFyci5yZWR1Y2UoKGVudGl0eUlkLCBmaWVsZCkgPT4ge1xuICAgICAgY29uc3QgcmVsUHJvcCA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKS5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IGZpZWxkKTtcbiAgICAgIGlmICghcmVsUHJvcCB8fCByZWxQcm9wLnR5cGUgIT09IFwicmVsYXRpb25cIikge1xuICAgICAgICBjb25zb2xlLmRlYnVnKHsgYXJyLCB0aGlzSWQ6IHRoaXMuaWQsIGVudGl0eUlkLCBmaWVsZCB9KTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDsnpjrqrvrkJwg7ISc67iM7IWL7YKkICR7c3Vic2V0RmllbGR9YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVsUHJvcC53aXRoO1xuICAgIH0sIHRoaXMuaWQpO1xuICAgIHJldHVybiBsYXN0RW50aXR5SWQ7XG4gIH1cblxuICBhc3luYyBtb3ZlUHJvcChhdDogbnVtYmVyLCB0bzogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcHJvcCA9IHRoaXMucHJvcHNbYXRdO1xuICAgIGNvbnN0IG5ld1Byb3BzID0gWy4uLnRoaXMucHJvcHNdO1xuICAgIG5ld1Byb3BzLnNwbGljZSh0bywgMCwgcHJvcCk7XG4gICAgbmV3UHJvcHMuc3BsaWNlKGF0IDwgdG8gPyBhdCA6IGF0ICsgMSwgMSk7XG4gICAgdGhpcy5wcm9wcyA9IG5ld1Byb3BzO1xuXG4gICAgYXdhaXQgdGhpcy5zYXZlKCk7XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJhc3NlcnQiLCJ3cml0ZUZpbGUiLCJpbmZsZWN0aW9uIiwicGF0aCIsImdyb3VwIiwidW5pcXVlIiwieiIsIlNvbmFtdSIsImlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wIiwiaXNFbnVtUHJvcCIsImlzSGFzTWFueVJlbGF0aW9uUHJvcCIsImlzTWFueVRvTWFueVJlbGF0aW9uUHJvcCIsImlzT25lVG9PbmVSZWxhdGlvblByb3AiLCJpc1JlbGF0aW9uUHJvcCIsImlzVmlydHVhbFByb3AiLCJpbXBvcnRNZW1iZXJzIiwiZm9ybWF0Q29kZSIsImV4aXN0cyIsInJ1bnRpbWVQYXRoIiwiYXNzZXJ0RGVmaW5lZCIsIm5vbk51bGxhYmxlIiwiRW50aXR5TWFuYWdlciIsIkVudGl0eSIsImlkIiwicGFyZW50SWQiLCJ0YWJsZSIsInRpdGxlIiwibmFtZXMiLCJwcm9wcyIsInByb3BzRGljdCIsInJlbGF0aW9ucyIsImluZGV4ZXMiLCJzdWJzZXRzIiwidHlwZXMiLCJlbnVtcyIsImVudW1MYWJlbHMiLCJ1bmRlcnNjb3JlIiwicGx1cmFsaXplIiwibWFwIiwicHJvcCIsImluY2x1ZGVzIiwicmVwbGFjZSIsIk9iamVjdCIsImZyb21FbnRyaWVzIiwibmFtZSIsImZpbHRlciIsImVudHJpZXMiLCJrZXkiLCJlbnVtTGFiZWwiLCJlbnVtIiwia2V5cyIsInBhcmVudEZzIiwiZGFzaGVyaXplIiwidG9Mb3dlckNhc2UiLCJmcyIsIm1vZHVsZSIsImdldFB1cmlTdWJzZXRRdWVyeSIsInN1YnNldEtleSIsInN1YnNldCIsInN1YnNldFF1ZXJ5IiwicmVzb2x2ZVN1YnNldFF1ZXJ5IiwibGluZXMiLCJwdXNoIiwiam9pbiIsImpvaW5zIiwiam9pbk1ldGhvZCIsImFzIiwiY3VzdG9tIiwiZnJvbSIsInRvIiwic2VsZWN0T2JqIiwiYnVpbGROZXN0ZWRTZWxlY3RPYmplY3QiLCJzZWxlY3QiLCJzdHJpbmdpZnlOZXN0ZWRTZWxlY3RPYmplY3QiLCJzZWxlY3RJdGVtcyIsInJlc3VsdCIsInNlbGVjdEl0ZW0iLCJtYXRjaCIsImNvbHVtbiIsImFsaWFzIiwiY29sdW1uVmFsdWUiLCJ0cmltIiwic3BsaXQiLCJwb3AiLCJwYXJ0cyIsImN1cnJlbnQiLCJpIiwibGVuZ3RoIiwicGFydCIsIkVycm9yIiwic2xpY2UiLCJsYXN0UGFydCIsIm9iaiIsImluZGVudCIsIndpdGhCcmFjZXMiLCJzcGFjZXMiLCJyZXBlYXQiLCJpbm5lclNwYWNlcyIsInZhbHVlIiwiZ2V0UHVyaUxvYWRlclF1ZXJ5IiwibG9hZGVycyIsImdlbmVyYXRlTG9hZGVyQ29kZSIsImxvYWRlckxpbmVzIiwibG9hZGVyIiwidG9UYWJsZSIsInRvQ29sIiwidGhyb3VnaCIsIm1hbnlKb2luIiwiaWRGaWVsZCIsInVuZGVmaW5lZCIsIm9uZUpvaW5zIiwiZm9yRWFjaCIsInJlZklkIiwiZnJvbUNvbCIsImdldFN1YnNldFF1ZXJ5IiwicHJlZml4IiwiZmllbGRzIiwiaXNBbHJlYWR5T3V0ZXJKb2luZWQiLCJzdWJzZXRHcm91cCIsImZpZWxkIiwicmVsIiwicmVkdWNlIiwiciIsImdyb3VwS2V5IiwicmVhbEZpZWxkcyIsInZpcnR1YWxGaWVsZHMiLCJjb25jYXQiLCJ2aXJ0dWFsIiwicmVsYXRpb24iLCJyZWxFbnRpdHkiLCJnZXQiLCJ3aXRoIiwicmVsRmllbGRzIiwiaW5uZXJPck91dGVyIiwiaGFzSm9pbkNvbHVtbiIsIm51bGxhYmxlIiwicmVsU3Vic2V0UXVlcnkiLCJqb2luQXMiLCJmcm9tVGFibGUiLCJqb2luQ2xhdXNlIiwiY3VzdG9tSm9pbkNsYXVzZSIsImNvbnZlcnRlZExvYWRlcnMiLCJuZXdBcyIsImZyb21Db2x1bW4iLCJqb2luQ29sdW1uIiwiam9pblRhYmxlIiwic2luZ3VsYXJpemUiLCJmaWVsZEV4cHJzVG9Qcm9wTm9kZXMiLCJmaWVsZEV4cHJzIiwiZW50aXR5IiwiZ3JvdXBzIiwiZmllbGRFeHByIiwiZWxzZUV4cHIiLCJmbGF0TWFwIiwicHJvcE5hbWUiLCJub2RlVHlwZSIsInR5cGUiLCJjaGlsZHJlbiIsImZpbmQiLCJwIiwiY29uc29sZSIsImxvZyIsImlkUHJvcCIsImdldEZpZWxkRXhwcnMiLCJtYXhEZXB0aCIsImZyb21zIiwidiIsInJlbE1kIiwiZiIsImdldFRhYmxlQ29sdW1ucyIsInJlbGF0aW9uVHlwZSIsImdldFZlY3RvckNvbHVtbnMiLCJnZXRWZWN0b3JDb2x1bW4iLCJjb2x1bW5OYW1lIiwidmVjdG9yUHJvcHMiLCJyZWdpc3Rlck1vZHVsZVBhdGhzIiwiYmFzZVBhdGgiLCJzZXRNb2R1bGVQYXRoIiwidG9VcHBlckNhc2UiLCJlbnVtSWQiLCJ0eXBlc01vZHVsZVBhdGgiLCJ0eXBlc0ZpbGVQYXRoIiwiYXBpUm9vdFBhdGgiLCJpbXBvcnRlZE1lbWJlcnMiLCJyZWdpc3RlclRhYmxlU3BlY3MiLCJ1bmlxdWVJbmRleGVzIiwiaWR4IiwiY29sdW1ucyIsImV2ZXJ5IiwiY29sIiwic2V0VGFibGVTcGVjIiwidG9Kc29uIiwic2F2ZSIsInN1YnNldFJvd3MiLCJnZXRTdWJzZXRSb3dzIiwic3Vic2V0Um93c1RvU3Vic2V0RmllbGRzIiwianNvblBhdGgiLCJqc29uIiwiSlNPTiIsInN0cmluZ2lmeSIsInJlZ2lzdGVyIiwiX3N1YnNldHMiLCJwcmVmaXhlcyIsInN1YnNldEtleXMiLCJhbGxGaWVsZHMiLCJzdGFydHNXaXRoIiwicmVsYXRpb25FbnRpdHkiLCJpc09wZW4iLCJoYXMiLCJjaGlsZCIsInN1YnNldEZpZWxkcyIsInNvbWUiLCJzdWJzZXRSb3ciLCJmbGF0IiwiY3JlYXRlUHJvcCIsImF0Iiwic3BsaWNlIiwiYW5hbHl6ZVN1YnNldEZpZWxkIiwic3Vic2V0RmllbGQiLCJhcnIiLCJlbnRpdHlJZCIsIm1vZGlmeVByb3AiLCJuZXdQcm9wIiwib2xkTmFtZSIsImVudGl0aWVzIiwiYWxsRW50aXR5SWRzIiwiZ2V0QWxsSWRzIiwicmVsRW50aXR5SWQiLCJyZWxFbnRpdHlTdWJzZXRLZXlzIiwibW9kaWZpZWRTdWJzZXRGaWVsZHMiLCJhbmFseXplZCIsIm1vZGlmaWVkIiwiYSIsIlByb21pc2UiLCJhbGwiLCJkZWxQcm9wIiwiaW5kZXgiLCJnZXRFbnRpdHlJZEZyb21TdWJzZXRGaWVsZCIsImxhc3RFbnRpdHlJZCIsInJlbFByb3AiLCJkZWJ1ZyIsInRoaXNJZCIsIm1vdmVQcm9wIiwibmV3UHJvcHMiXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLFlBQVksU0FBUztBQUM1QixTQUFTQyxTQUFTLFFBQVEsbUJBQWM7QUFDeEMsT0FBT0MsZ0JBQWdCLGFB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
|
|
883
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lbnRpdHkvZW50aXR5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuaW1wb3J0IHsgd3JpdGVGaWxlIH0gZnJvbSBcImZzL3Byb21pc2VzXCI7XG5pbXBvcnQgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IGdyb3VwLCB1bmlxdWUgfSBmcm9tIFwicmFkYXNoaVwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGkvc29uYW11XCI7XG5pbXBvcnQge1xuICB0eXBlIEVudGl0eUluZGV4LFxuICB0eXBlIEVudGl0eUpzb24sXG4gIHR5cGUgRW50aXR5UHJvcCxcbiAgdHlwZSBFbnRpdHlQcm9wTm9kZSxcbiAgdHlwZSBFbnRpdHlTdWJzZXRSb3csXG4gIGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wLFxuICBpc0VudW1Qcm9wLFxuICBpc0hhc01hbnlSZWxhdGlvblByb3AsXG4gIGlzSW50ZXJuYWxTdWJzZXRGaWVsZCxcbiAgaXNNYW55VG9NYW55UmVsYXRpb25Qcm9wLFxuICBpc09uZVRvT25lUmVsYXRpb25Qcm9wLFxuICBpc1JlbGF0aW9uUHJvcCxcbiAgaXNWaXJ0dWFsQ29kZVByb3AsXG4gIGlzVmlydHVhbFByb3AsXG4gIG5vcm1hbGl6ZVN1YnNldEZpZWxkLFxuICB0eXBlIFJlbGF0aW9uUHJvcCxcbiAgdHlwZSBTdWJzZXRGaWVsZCxcbiAgdHlwZSBTdWJzZXRRdWVyeSxcbn0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBpbXBvcnRNZW1iZXJzIH0gZnJvbSBcIi4uL3V0aWxzL2VzbS11dGlsc1wiO1xuaW1wb3J0IHsgZm9ybWF0Q29kZSB9IGZyb20gXCIuLi91dGlscy9mb3JtYXR0ZXJcIjtcbmltcG9ydCB7IGV4aXN0cyB9IGZyb20gXCIuLi91dGlscy9mcy11dGlsc1wiO1xuaW1wb3J0IHsgcnVudGltZVBhdGggfSBmcm9tIFwiLi4vdXRpbHMvcGF0aC11dGlsc1wiO1xuaW1wb3J0IHsgYXNzZXJ0RGVmaW5lZCwgbm9uTnVsbGFibGUgfSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi9lbnRpdHktbWFuYWdlclwiO1xuXG5leHBvcnQgY2xhc3MgRW50aXR5IHtcbiAgaWQ6IHN0cmluZztcbiAgcGFyZW50SWQ/OiBzdHJpbmc7XG4gIHRhYmxlOiBzdHJpbmc7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIG5hbWVzOiB7XG4gICAgcGFyZW50RnM6IHN0cmluZztcbiAgICBmczogc3RyaW5nO1xuICAgIG1vZHVsZTogc3RyaW5nO1xuICB9O1xuICBwcm9wczogRW50aXR5UHJvcFtdO1xuICBwcm9wc0RpY3Q6IHtcbiAgICBba2V5OiBzdHJpbmddOiBFbnRpdHlQcm9wO1xuICB9O1xuICByZWxhdGlvbnM6IHtcbiAgICBba2V5OiBzdHJpbmddOiBSZWxhdGlvblByb3A7XG4gIH07XG4gIGluZGV4ZXM6IEVudGl0eUluZGV4W107XG4gIHN1YnNldHM6IHtcbiAgICBba2V5OiBzdHJpbmddOiBzdHJpbmdbXTtcbiAgfTtcbiAgc3Vic2V0c0ludGVybmFsOiB7XG4gICAgW2tleTogc3RyaW5nXTogc3RyaW5nW107XG4gIH07XG4gIHR5cGVzOiB7XG4gICAgW25hbWU6IHN0cmluZ106IHouWm9kVHlwZUFueTtcbiAgfSA9IHt9O1xuICBlbnVtczoge1xuICAgIFtlbnVtSWQ6IHN0cmluZ106IHouWm9kRW51bTxSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pj47XG4gIH0gPSB7fTtcbiAgZW51bUxhYmVsczoge1xuICAgIFtlbnVtSWQ6IHN0cmluZ106IHtcbiAgICAgIFtrZXk6IHN0cmluZ106IHN0cmluZztcbiAgICB9O1xuICB9ID0ge307XG5cbiAgY29uc3RydWN0b3IoeyBpZCwgcGFyZW50SWQsIHRhYmxlLCB0aXRsZSwgcHJvcHMsIGluZGV4ZXMsIHN1YnNldHMsIGVudW1zIH06IEVudGl0eUpzb24pIHtcbiAgICAvLyBpZFxuICAgIHRoaXMuaWQgPSBpZDtcbiAgICB0aGlzLnBhcmVudElkID0gcGFyZW50SWQ7XG4gICAgdGhpcy50aXRsZSA9IHRpdGxlID8/IHRoaXMuaWQ7XG4gICAgdGhpcy50YWJsZSA9IHRhYmxlID8/IGluZmxlY3Rpb24udW5kZXJzY29yZShpbmZsZWN0aW9uLnBsdXJhbGl6ZShpZCkpO1xuXG4gICAgLy8gcHJvcHNcbiAgICBpZiAocHJvcHMpIHtcbiAgICAgIHRoaXMucHJvcHMgPSBwcm9wcy5tYXAoKHByb3ApID0+IHtcbiAgICAgICAgaWYgKGlzRW51bVByb3AocHJvcCkpIHtcbiAgICAgICAgICBpZiAocHJvcC5pZC5pbmNsdWRlcyhcIiRNb2RlbFwiKSkge1xuICAgICAgICAgICAgcHJvcC5pZCA9IHByb3AuaWQucmVwbGFjZShcIiRNb2RlbFwiLCBpZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9wO1xuICAgICAgfSk7XG4gICAgICB0aGlzLnByb3BzRGljdCA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgcHJvcHMubWFwKChwcm9wKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIFtwcm9wLm5hbWUsIHByb3BdO1xuICAgICAgICB9KSxcbiAgICAgICk7XG5cbiAgICAgIC8vIHJlbGF0aW9uc1xuICAgICAgdGhpcy5yZWxhdGlvbnMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgIHByb3BzLmZpbHRlcigocHJvcCkgPT4gaXNSZWxhdGlvblByb3AocHJvcCkpLm1hcCgocHJvcCkgPT4gW3Byb3AubmFtZSwgcHJvcF0pLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wcm9wcyA9IFtdO1xuICAgICAgdGhpcy5wcm9wc0RpY3QgPSB7fTtcbiAgICAgIHRoaXMucmVsYXRpb25zID0ge307XG4gICAgfVxuXG4gICAgLy8gaW5kZXhlc1xuICAgIHRoaXMuaW5kZXhlcyA9IGluZGV4ZXMgPz8gW107XG5cbiAgICAvLyBzdWJzZXRzOiBTdWJzZXRGaWVsZFtd66W8IO2MjOyLse2VmOyXrCBzdWJzZXRzKOydvOuwmCnsmYAgc3Vic2V0c0ludGVybmFsKGludGVybmFsKeuhnCDrtoTrpqxcbiAgICB0aGlzLnN1YnNldHMgPSB7fTtcbiAgICB0aGlzLnN1YnNldHNJbnRlcm5hbCA9IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgZmllbGRzXSBvZiBPYmplY3QuZW50cmllcyhzdWJzZXRzID8/IHt9KSkge1xuICAgICAgdGhpcy5zdWJzZXRzW2tleV0gPSBmaWVsZHMuZmlsdGVyKChmKSA9PiAhaXNJbnRlcm5hbFN1YnNldEZpZWxkKGYpKS5tYXAobm9ybWFsaXplU3Vic2V0RmllbGQpO1xuICAgICAgdGhpcy5zdWJzZXRzSW50ZXJuYWxba2V5XSA9IGZpZWxkcy5maWx0ZXIoaXNJbnRlcm5hbFN1YnNldEZpZWxkKS5tYXAobm9ybWFsaXplU3Vic2V0RmllbGQpO1xuICAgIH1cblxuICAgIC8vIGVudW1zXG4gICAgdGhpcy5lbnVtTGFiZWxzID0gZW51bXMgPz8ge307XG4gICAgdGhpcy5lbnVtcyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKHRoaXMuZW51bUxhYmVscykubWFwKChba2V5LCBlbnVtTGFiZWxdKSA9PiB7XG4gICAgICAgIHJldHVybiBba2V5LCB6LmVudW0oT2JqZWN0LmtleXMoZW51bUxhYmVsKSBhcyB1bmtub3duIGFzIHJlYWRvbmx5IFtzdHJpbmcsIC4uLnN0cmluZ1tdXSldO1xuICAgICAgfSksXG4gICAgKTtcblxuICAgIC8vIG5hbWVzXG4gICAgdGhpcy5uYW1lcyA9IHtcbiAgICAgIHBhcmVudEZzOiBpbmZsZWN0aW9uLmRhc2hlcml6ZShpbmZsZWN0aW9uLnVuZGVyc2NvcmUocGFyZW50SWQgPz8gaWQpKS50b0xvd2VyQ2FzZSgpLFxuICAgICAgZnM6IGluZmxlY3Rpb24uZGFzaGVyaXplKGluZmxlY3Rpb24udW5kZXJzY29yZShpZCkpLnRvTG93ZXJDYXNlKCksXG4gICAgICBtb2R1bGU6IGlkLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICog7L+866as7JqpIOyEnOu4jOyFiyDtlYTrk5zrpbwg67CY7ZmY7ZWp64uI64ukIChzdWJzZXRzICsgc3Vic2V0c0ludGVybmFsIO2Vqey5qClcbiAgICovXG4gIGdldFN1YnNldEZpZWxkc0ZvclF1ZXJ5KHN1YnNldEtleTogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbLi4uKHRoaXMuc3Vic2V0c1tzdWJzZXRLZXldID8/IFtdKSwgLi4uKHRoaXMuc3Vic2V0c0ludGVybmFsW3N1YnNldEtleV0gPz8gW10pXTtcbiAgfVxuXG4gIC8qKlxuICAgKiDso7zslrTsp4Qg7J2066aEKHN1YnNldEtleSnsnZggc3Vic2V07J2EIOyLpOygnOuhnCDqsIDsoLjsmKTripQgUHVyaSDsvZTrk5wg6rWs7ZiE7LK0IHN0cmluZ+ydhCDrsJjtmZjtlanri4jri6QuXG4gICAqL1xuICBnZXRQdXJpU3Vic2V0UXVlcnkoc3Vic2V0S2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHN1YnNldCA9IHRoaXMuZ2V0U3Vic2V0RmllbGRzRm9yUXVlcnkoc3Vic2V0S2V5KTtcbiAgICBjb25zdCBzdWJzZXRRdWVyeSA9IHRoaXMucmVzb2x2ZVN1YnNldFF1ZXJ5KFwiXCIsIHN1YnNldCk7XG5cbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcblxuICAgIC8vIGZyb21cbiAgICBsaW5lcy5wdXNoKGByZXR1cm4gcWJXcmFwcGVyYCk7XG4gICAgbGluZXMucHVzaChgLmZyb20oXCIke3RoaXMudGFibGV9XCIpYCk7XG5cbiAgICAvLyBqb2luXG4gICAgZm9yIChjb25zdCBqb2luIG9mIHN1YnNldFF1ZXJ5LmpvaW5zKSB7XG4gICAgICAvLyBqb2luIOuplOyEnOuTnCDqsrDsoJU6IGlubmVyIOKGkiBqb2luLCBvdXRlciDihpIgbGVmdEpvaW5cbiAgICAgIC8vIEZLIG51bGxhYmxlIOyXrOu2gOuKlCBsZWZ0Sm9pbiDtg4DsnoUg7Iuc6re464uI7LKY7JeQ7IScIOyekOuPmeycvOuhnCDtjJDri6jrkKhcbiAgICAgIGNvbnN0IGpvaW5NZXRob2QgPSBqb2luLmpvaW4gPT09IFwiaW5uZXJcIiA/IFwiam9pblwiIDogXCJsZWZ0Sm9pblwiO1xuXG4gICAgICBpZiAoXCJjdXN0b21cIiBpbiBqb2luKSB7XG4gICAgICAgIC8vIGN1c3RvbSBqb2luIGNsYXVzZeuKlCByYXcg7IKs7JqpXG4gICAgICAgIGxpbmVzLnB1c2goXG4gICAgICAgICAgYC4ke2pvaW5NZXRob2R9KHsgJHtqb2luLmFzfTogXCIke2pvaW4udGFibGV9XCIgfSwgcWJXcmFwcGVyLmtuZXgucmF3KFxcYCR7am9pbi5jdXN0b219XFxgKSlgLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGluZXMucHVzaChgLiR7am9pbk1ldGhvZH0oeyAke2pvaW4uYXN9OiBcIiR7am9pbi50YWJsZX1cIiB9LCBcIiR7am9pbi5mcm9tfVwiLCBcIiR7am9pbi50b31cIilgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBzZWxlY3QgLSDsnoXssrTsoIEg6rWs7KGw66GcIOyDneyEsVxuICAgIGNvbnN0IHNlbGVjdE9iaiA9IHRoaXMuYnVpbGROZXN0ZWRTZWxlY3RPYmplY3Qoc3Vic2V0UXVlcnkuc2VsZWN0KTtcbiAgICBsaW5lcy5wdXNoKGAuc2VsZWN0KCR7dGhpcy5zdHJpbmdpZnlOZXN0ZWRTZWxlY3RPYmplY3Qoc2VsZWN0T2JqKX0pO2ApO1xuXG4gICAgcmV0dXJuIGxpbmVzLmpvaW4oXCJcXG5cIik7XG4gIH1cblxuICAvKipcbiAgICogKi5lbnRpdHkuanNvbuydmCBzdWJzZXTsl5Ag65Ok7Ja07J6I64qUIO2VhOuTnCDrsLDsl7TsnYQg67Cb7JWE7IScLFxuICAgKiBQdXJp7J2YIFNlbGVjdE9iamVjdCDtg4DsnoXsnLzroZwg67OA7ZmY7ZWp64uI64ukLlxuICAgKlxuICAgKiDsmIg6IFtcInVzZXJzLmlkXCIsIFwicGFyZW50LmlkXCIsIFwicGFyZW50Lm5hbWVcIl1cbiAgICogICDihpIgeyBpZDogXCJ1c2Vycy5pZFwiLCBwYXJlbnQ6IHsgaWQ6IFwicGFyZW50LmlkXCIsIG5hbWU6IFwicGFyZW50Lm5hbWVcIiB9IH1cbiAgICpcbiAgICog7Ja4642U67CU6rCAIOyVhOuLjCDspJHssqkg6rCd7LK066GcIOuzgO2ZmO2VqOyXkCDsnKDsnZjtlZjshLjsmpQuXG4gICAqIOydtOugh+qyjCDspJHssqkg6rCd7LK066GcIOuzgO2ZmO2VmOyXrCBzZWxlY3Tsl5Ag64SY6rKo7KO866m0IFBhcnNlU2VsZWN0T2JqZWN0IO2DgOyeheydtCBqb2lu65CcIOqwneyytOydmCDtg4DsnoXsnYQg7J6YIOyeoeyVhOykhCDsiJgg7J6I7Iq164uI64ukLlxuICAgKiDspoksIGVuaGFuY2Vy7JeQ7IScIHJvd+ulvCDrsJvslZjsnYQg65WMIGh5ZHJhdGXrkJwg6rCd7LK0IOyekOyytOydmCBudWxsaXR57JmAIOq3uCDslYjsqr0g7ZWE65Oc7J2YIG51bGxpdHnqsIAgZmsgbnVsbGFibGUg7Jes67aA7JeQIOuUsOudvCDsnpgg7LaU66Gg65Cp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZE5lc3RlZFNlbGVjdE9iamVjdChcbiAgICBzZWxlY3RJdGVtczogc3RyaW5nW10sXG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiDrsJjtmZgg7Jik67iM7KCd7Yq47J2YIOqwkuydgCBzdHJpbmfsnbwg7IiY64+EIOyeiOqzoCDrmJDri6Trpbgg7Jik67iM7KCd7Yq47J28IOyImOuPhCDsnojripTrjbAsIOydtOulvCDsnqzqt4Ag7YOA7J6F7Jy866GcIOuCmO2DgOuCvCDsiJgg7JeG7Ja0IGFueeuhnCDsspjrpqztlanri4jri6QuXG4gICk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIGNvbnN0IHJlc3VsdDogUmV0dXJuVHlwZTx0eXBlb2YgdGhpcy5idWlsZE5lc3RlZFNlbGVjdE9iamVjdD4gPSB7fTtcblxuICAgIGZvciAoY29uc3Qgc2VsZWN0SXRlbSBvZiBzZWxlY3RJdGVtcykge1xuICAgICAgLy8gXCJ1c2Vycy5pZFwiIOuYkOuKlCBcInVzZXJzLmlkIGFzIHVzZXJfX2lkXCIg7ZiV7YOcIO2MjOyLsVxuICAgICAgY29uc3QgbWF0Y2ggPSBzZWxlY3RJdGVtLm1hdGNoKC9eKC4rPykoPzogYXMgKC4rKSk/JC8pO1xuICAgICAgaWYgKCFtYXRjaCkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IFssIGNvbHVtbiwgYWxpYXNdID0gbWF0Y2g7XG4gICAgICBjb25zdCBjb2x1bW5WYWx1ZSA9IGBcIiR7Y29sdW1uLnRyaW0oKX1cImA7XG5cbiAgICAgIGlmICghYWxpYXMgfHwgIWFsaWFzLmluY2x1ZGVzKFwiX19cIikpIHtcbiAgICAgICAgLy8gYWxpYXPqsIAg7JeG6rGw64KYIF9f66W8IO2PrO2VqO2VmOyngCDslYrsnLzrqbQg7LWc7IOB7JyEIO2VhOuTnFxuICAgICAgICBjb25zdCBrZXkgPSBhbGlhcyA/PyBhc3NlcnREZWZpbmVkKGNvbHVtbi5zcGxpdChcIi5cIikucG9wKCkpO1xuICAgICAgICByZXN1bHRba2V5XSA9IGNvbHVtblZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gYWxpYXPqsIAgX1/rpbwg7Y+s7ZWo7ZWY66m0IOyeheyytCDqtazsobDroZwg6re466O57ZmUXG4gICAgICAgIGNvbnN0IHBhcnRzID0gYWxpYXMuc3BsaXQoXCJfX1wiKTtcbiAgICAgICAgbGV0IGN1cnJlbnQgPSByZXN1bHQ7XG5cbiAgICAgICAgLy8g66eI7KeA66eJIO2MjO2KuCDsoITquYzsp4Ag7KSR7LKpIOqwneyytCDsg53shLFcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBwYXJ0ID0gcGFydHNbaV07XG4gICAgICAgICAgaWYgKHBhcnQgaW4gY3VycmVudCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBjdXJyZW50W3BhcnRdID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgIC8vIOyeheugpeydtCBbXCJ1c2VyXCIsIFwidXNlcl9faWRcIl0g6rCZ7J2AIOqyveyasCFcbiAgICAgICAgICAgICAgLy8g7JWg7LSI7JeQIOunkOuPhCDslYgg65CY7KeA66eMIOyViOyghO2VmOqyjCDsmIjsmbjrpbwg642Y7KeR64uI64ukLlxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgYENvbmZsaWN0IGRldGVjdGVkIGluIHNlbGVjdCBpdGVtczogcGFyZW50IHBhdGggXCIke3BhcnRzLnNsaWNlKDAsIGkgKyAxKS5qb2luKFwiX19cIil9XCIgaXMgYWxyZWFkeSBzZXQgYXMgYSBmaWVsZCwgY2Fubm90IG5lc3QgXCIke2FsaWFzfVwiIHVuZGVyIGl0LmAsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGN1cnJlbnRbcGFydF0gPSB7fTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY3VycmVudCA9IGN1cnJlbnRbcGFydF07XG4gICAgICAgIH1cblxuICAgICAgICAvLyDrp4jsp4Drp4kg7YyM7Yq47JeQIOqwkiDshKTsoJVcbiAgICAgICAgY29uc3QgbGFzdFBhcnQgPSBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXTtcbiAgICAgICAgY3VycmVudFtsYXN0UGFydF0gPSBjb2x1bW5WYWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEpTT04uc3RyaW5naWZ57JmAIOycoOyCrO2VnCDsnbzsnYQg7ZWp64uI64ukLlxuICAgKiDri6Trp4wg7KO87Ja07KeEIOqwneyytOulvCBKU09O7J20IOyVhOuLjCBUeXBlU2NyaXB0IOqwneyytCDrpqzthLDrn7Qg7Iqk7Yq466eB7Jy866GcIOunjOuTpOyWtOykjeuLiOuLpC5cbiAgICoga2V57JeQIOuUsOyYtO2RnOqwgCDsl4bslrTsmpQuXG4gICAqIOy2nOugpSDsmIjsi5w6XG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICoge1xuICAgKiAgIGlkOiBcInVzZXJzLmlkXCIsXG4gICAqICAgcGFyZW50OiB7XG4gICAqICAgICBpZDogXCJwYXJlbnQuaWRcIixcbiAgICogICAgIG5hbWU6IFwicGFyZW50Lm5hbWVcIixcbiAgICogICB9LFxuICAgKiB9XG4gICAqIGBgYFxuICAgKiBAcGFyYW0gb2JqIOuzgO2ZmO2VoCDqsJ3ssrRcbiAgICogQHBhcmFtIGluZGVudCDrk6Tsl6zsk7DquLAg66CI67KoXG4gICAqIEBwYXJhbSB3aXRoQnJhY2VzIHRydWXrqbQg7KSR6rSE7Zi4IO2PrO2VqCwgZmFsc2XrqbQg64K07Jqp66eMIOuwmO2ZmFxuICAgKi9cbiAgcHJpdmF0ZSBzdHJpbmdpZnlOZXN0ZWRTZWxlY3RPYmplY3QoXG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiDspJHssqkg7Jik67iM7KCd7Yq47J2YIOqwkuydgCBzdHJpbmfsnbwg7IiY64+EIOyeiOqzoCDrmJDri6Trpbgg7Jik67iM7KCd7Yq47J28IOyImOuPhCDsnojripTrjbAsIOydtOulvCDsnqzqt4Ag7YOA7J6F7Jy866GcIOuCmO2DgOuCvCDsiJgg7JeG7Ja0IGFueeuhnCDsspjrpqztlanri4jri6QuXG4gICAgb2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIGluZGVudDogbnVtYmVyID0gMCxcbiAgICB3aXRoQnJhY2VzOiBib29sZWFuID0gdHJ1ZSxcbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCBzcGFjZXMgPSBcIiAgXCIucmVwZWF0KGluZGVudCk7XG4gICAgY29uc3QgaW5uZXJTcGFjZXMgPSBcIiAgXCIucmVwZWF0KGluZGVudCArIDEpO1xuXG4gICAgY29uc3QgZW50cmllcyA9IE9iamVjdC5lbnRyaWVzKG9iaik7XG4gICAgaWYgKGVudHJpZXMubGVuZ3RoID09PSAwKSByZXR1cm4gd2l0aEJyYWNlcyA/IFwie31cIiA6IFwiXCI7XG5cbiAgICBjb25zdCBsaW5lcyA9IGVudHJpZXMubWFwKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgLy8g7Lus65+8IOqyveuhnCAo7J2066+4IOuUsOyYtO2RnCDtj6ztlagpXG4gICAgICAgIHJldHVybiBgJHtpbm5lclNwYWNlc30ke2tleX06ICR7dmFsdWV9LGA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyDspJHssqkg6rCd7LK0ICjtla3sg4Eg7KSR6rSE7Zi4IO2PrO2VqClcbiAgICAgICAgcmV0dXJuIGAke2lubmVyU3BhY2VzfSR7a2V5fTogJHt0aGlzLnN0cmluZ2lmeU5lc3RlZFNlbGVjdE9iamVjdCh2YWx1ZSwgaW5kZW50ICsgMSwgdHJ1ZSl9LGA7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAod2l0aEJyYWNlcykge1xuICAgICAgcmV0dXJuIGB7XFxuJHtsaW5lcy5qb2luKFwiXFxuXCIpfVxcbiR7c3BhY2VzfX1gO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyDspJHqtITtmLgg7JeG7J20IOuCtOyaqeunjCDrsJjtmZggKOyVnuuSpCDqsJztlokg7KCc7Jm4KVxuICAgICAgcmV0dXJuIGxpbmVzLmpvaW4oXCJcXG5cIik7XG4gICAgfVxuICB9XG5cbiAgZ2V0UHVyaUxvYWRlclF1ZXJ5KHN1YnNldEtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBzdWJzZXQgPSB0aGlzLmdldFN1YnNldEZpZWxkc0ZvclF1ZXJ5KHN1YnNldEtleSk7XG4gICAgY29uc3QgeyBsb2FkZXJzIH0gPSB0aGlzLnJlc29sdmVTdWJzZXRRdWVyeShcIlwiLCBzdWJzZXQpO1xuXG4gICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW2BbYF07XG5cbiAgICAvLyDsnqzqt4DsoIHsnLzroZwgbG9hZGVyIOyDneyEse2VmOuKlCDtl6ztjbwg7ZWo7IiYXG4gICAgY29uc3QgZ2VuZXJhdGVMb2FkZXJDb2RlID0gKGxvYWRlcnM6IFN1YnNldFF1ZXJ5W1wibG9hZGVyc1wiXSk6IHN0cmluZ1tdID0+IHtcbiAgICAgIGNvbnN0IGxvYWRlckxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICBmb3IgKGNvbnN0IGxvYWRlciBvZiBsb2FkZXJzKSB7XG4gICAgICAgIGNvbnN0IHsgdG9UYWJsZSwgdG9Db2wsIHRocm91Z2ggfSA9IGxvYWRlci5tYW55Sm9pbjtcbiAgICAgICAgbG9hZGVyTGluZXMucHVzaChcbiAgICAgICAgICBcIntcIixcbiAgICAgICAgICBgYXM6IFwiJHtsb2FkZXIuYXN9XCIsYCxcbiAgICAgICAgICBgcmVmSWQ6IFwiJHtsb2FkZXIubWFueUpvaW4uaWRGaWVsZH1cIixgLFxuICAgICAgICAgIGBxYjogKHFiV3JhcHBlcjogUHVyaVdyYXBwZXI8RGF0YWJhc2VTY2hlbWFFeHRlbmQ+LCBmcm9tSWRzOiBudW1iZXJbXSkgPT4ge2AsXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHRocm91Z2ggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIEhhc01hbnlcbiAgICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIFwicmV0dXJuIHFiV3JhcHBlclwiLFxuICAgICAgICAgICAgYC5mcm9tKFwiJHt0b1RhYmxlfVwiKWAsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGxvYWRlci5vbmVKb2lucy5mb3JFYWNoKChqb2luOiBTdWJzZXRRdWVyeVtcImpvaW5zXCJdW251bWJlcl0pID0+IHtcbiAgICAgICAgICAgIC8vIEZLIG51bGxhYmxlIOyXrOu2gOuKlCBsZWZ0Sm9pbiDtg4DsnoUg7Iuc6re464uI7LKY7JeQ7IScIOyekOuPmeycvOuhnCDtjJDri6jrkKhcbiAgICAgICAgICAgIGNvbnN0IGpvaW5NZXRob2QgPSBqb2luLmpvaW4gPT09IFwiaW5uZXJcIiA/IFwiam9pblwiIDogXCJsZWZ0Sm9pblwiO1xuICAgICAgICAgICAgaWYgKFwiY3VzdG9tXCIgaW4gam9pbikge1xuICAgICAgICAgICAgICAvLyBGSVhNRTog6rKA7KadIO2VhOyalFxuICAgICAgICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFxuICAgICAgICAgICAgICAgIGAuJHtqb2luTWV0aG9kfSh7ICR7am9pbi5hc306IFwiJHtqb2luLnRhYmxlfVwiIH0sIChqKSA9PiB7YCxcbiAgICAgICAgICAgICAgICBgai5vbihQdXJpLnJhd1N0cmluZyhcIiR7am9pbi5jdXN0b219XCIpKTtgLFxuICAgICAgICAgICAgICAgIFwifSlcIixcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGxvYWRlckxpbmVzLnB1c2goXG4gICAgICAgICAgICAgICAgYC4ke2pvaW5NZXRob2R9KHsgJHtqb2luLmFzfTogXCIke2pvaW4udGFibGV9XCIgfSwgXCIke2pvaW4uZnJvbX1cIiwgXCIke2pvaW4udG99XCIpYCxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIOyeheyytOyggSBzZWxlY3Qg6rWs7KGwIOyDneyEsSAocmVmSWQg7Y+s7ZWoKVxuICAgICAgICAgIGNvbnN0IHNlbGVjdE9iaiA9IHRoaXMuYnVpbGROZXN0ZWRTZWxlY3RPYmplY3QobG9hZGVyLnNlbGVjdCk7XG4gICAgICAgICAgc2VsZWN0T2JqLnJlZklkID0gYFwiJHt0b1RhYmxlfS4ke3RvQ29sfVwiYDtcbiAgICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFxuICAgICAgICAgICAgYC53aGVyZUluKFwiJHt0b1RhYmxlfS4ke3RvQ29sfVwiLCBmcm9tSWRzKWAsXG4gICAgICAgICAgICBgLnNlbGVjdCgke3RoaXMuc3RyaW5naWZ5TmVzdGVkU2VsZWN0T2JqZWN0KHNlbGVjdE9iail9KTtgLFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTWFueVRvTWFueVxuICAgICAgICAgIGxvYWRlckxpbmVzLnB1c2goXG4gICAgICAgICAgICBcInJldHVybiBxYldyYXBwZXJcIixcbiAgICAgICAgICAgIGAuZnJvbShcIiR7dGhyb3VnaC50YWJsZX1cIilgLFxuICAgICAgICAgICAgYC5qb2luKFwiJHt0b1RhYmxlfVwiLCBcIiR7dGhyb3VnaC50YWJsZX0uJHt0aHJvdWdoLnRvQ29sfVwiLCBcIiR7dG9UYWJsZX0uJHt0b0NvbH1cIilgLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBsb2FkZXIub25lSm9pbnMuZm9yRWFjaCgoam9pbjogU3Vic2V0UXVlcnlbXCJqb2luc1wiXVtudW1iZXJdKSA9PiB7XG4gICAgICAgICAgICAvLyBGSyBudWxsYWJsZSDsl6zrtoDripQgbGVmdEpvaW4g7YOA7J6FIOyLnOq3uOuLiOyymOyXkOyEnCDsnpDrj5nsnLzroZwg7YyQ64uo65CoXG4gICAgICAgICAgICBjb25zdCBqb2luTWV0aG9kID0gam9pbi5qb2luID09PSBcImlubmVyXCIgPyBcImpvaW5cIiA6IFwibGVmdEpvaW5cIjtcbiAgICAgICAgICAgIGlmIChcImN1c3RvbVwiIGluIGpvaW4pIHtcbiAgICAgICAgICAgICAgLy8gRklYTUU6IOqygOymnSDtlYTsmpRcbiAgICAgICAgICAgICAgbG9hZGVyTGluZXMucHVzaChcbiAgICAgICAgICAgICAgICBgLiR7am9pbk1ldGhvZH0oeyAke2pvaW4uYXN9OiBcIiR7am9pbi50YWJsZX1cIiB9LCAoaikgPT4ge2AsXG4gICAgICAgICAgICAgICAgYGoub24oUHVyaS5yYXdTdHJpbmcoXCIke2pvaW4uY3VzdG9tfVwiKSk7YCxcbiAgICAgICAgICAgICAgICBcIn0pXCIsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFxuICAgICAgICAgICAgICAgIGAuJHtqb2luTWV0aG9kfSh7ICR7am9pbi5hc306IFwiJHtqb2luLnRhYmxlfVwiIH0sIFwiJHtqb2luLmZyb219XCIsIFwiJHtqb2luLnRvfVwiKWAsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyDsnoXssrTsoIEgc2VsZWN0IOq1rOyhsCDsg53shLEgKHJlZklkIO2PrO2VqClcbiAgICAgICAgICBjb25zdCBzZWxlY3RPYmogPSB0aGlzLmJ1aWxkTmVzdGVkU2VsZWN0T2JqZWN0KGxvYWRlci5zZWxlY3QpO1xuICAgICAgICAgIHNlbGVjdE9iai5yZWZJZCA9IGBcIiR7dGhyb3VnaC50YWJsZX0uJHt0aHJvdWdoLmZyb21Db2x9XCJgO1xuICAgICAgICAgIGxvYWRlckxpbmVzLnB1c2goXG4gICAgICAgICAgICBgLndoZXJlSW4oXCIke3Rocm91Z2gudGFibGV9LiR7dGhyb3VnaC5mcm9tQ29sfVwiLCBmcm9tSWRzKWAsXG4gICAgICAgICAgICBgLnNlbGVjdCgke3RoaXMuc3RyaW5naWZ5TmVzdGVkU2VsZWN0T2JqZWN0KHNlbGVjdE9iail9KTtgLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKGB9LGApO1xuXG4gICAgICAgIC8vIOykkeyyqSBsb2FkZXJzIOyymOumrFxuICAgICAgICBpZiAobG9hZGVyLmxvYWRlcnMgJiYgbG9hZGVyLmxvYWRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGxvYWRlckxpbmVzLnB1c2goXCJsb2FkZXJzOiBbXCIsIC4uLmdlbmVyYXRlTG9hZGVyQ29kZShsb2FkZXIubG9hZGVycyksIFwiXSxcIik7XG4gICAgICAgIH1cblxuICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFwifSxcIik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBsb2FkZXJMaW5lcztcbiAgICB9O1xuXG4gICAgbGluZXMucHVzaCguLi5nZW5lcmF0ZUxvYWRlckNvZGUobG9hZGVycykpO1xuICAgIGxpbmVzLnB1c2goYF1gKTtcblxuICAgIHJldHVybiBsaW5lcy5qb2luKFwiXFxuXCIpO1xuICB9XG5cbiAgLypcbiAgICBzdWJzZXQgU0VMRUNUL0pPSU4vTE9BREVSIOqysOqzvCDrpqzthLRcbiAgKi9cbiAgZ2V0U3Vic2V0UXVlcnkoc3Vic2V0S2V5OiBzdHJpbmcpOiBTdWJzZXRRdWVyeSB7XG4gICAgY29uc3Qgc3Vic2V0ID0gdGhpcy5nZXRTdWJzZXRGaWVsZHNGb3JRdWVyeShzdWJzZXRLZXkpO1xuXG4gICAgY29uc3QgcmVzdWx0OiBTdWJzZXRRdWVyeSA9IHRoaXMucmVzb2x2ZVN1YnNldFF1ZXJ5KFwiXCIsIHN1YnNldCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qXG4gICAqL1xuICByZXNvbHZlU3Vic2V0UXVlcnkoXG4gICAgcHJlZml4OiBzdHJpbmcsXG4gICAgZmllbGRzOiBzdHJpbmdbXSxcbiAgICBpc0FscmVhZHlPdXRlckpvaW5lZDogYm9vbGVhbiA9IGZhbHNlLFxuICApOiBTdWJzZXRRdWVyeSB7XG4gICAgLy8gcHJlZml4IOy5mO2ZmCAocHJlZml464qUIFRvT25lUmVsYXRpb27snbQg67O17IiY66GcIOu2meydgCDqsr3smrAg66qo65GQIF9f66GcIOuzgOqyveuQqClcbiAgICBwcmVmaXggPSBwcmVmaXgucmVwbGFjZSgvXFwuL2csIFwiX19cIik7XG5cbiAgICAvLyDshJzruIzshYvsnYQgMeuOgeyKpOunjCDrtoTrpqztlZjsl6wg6re466O57ZWRXG4gICAgY29uc3Qgc3Vic2V0R3JvdXAgPSBncm91cChmaWVsZHMsIChmaWVsZCkgPT4ge1xuICAgICAgaWYgKGZpZWxkLmluY2x1ZGVzKFwiLlwiKSkge1xuICAgICAgICBjb25zdCBbcmVsXSA9IGZpZWxkLnNwbGl0KFwiLlwiKTtcbiAgICAgICAgcmV0dXJuIHJlbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gT2JqZWN0LmtleXMoc3Vic2V0R3JvdXApLnJlZHVjZShcbiAgICAgIChyLCBncm91cEtleSkgPT4ge1xuICAgICAgICBjb25zdCBmaWVsZHMgPSBzdWJzZXRHcm91cFtncm91cEtleV07XG4gICAgICAgIGFzc2VydChmaWVsZHMgIT09IHVuZGVmaW5lZCwgXCJmaWVsZHMgaXMgdW5kZWZpbmVkXCIpO1xuXG4gICAgICAgIC8vIO2YhOyerCDthYzsnbTruJQg7ZWE65Oc7IWL7J2AIHNlbGVjdCwgdmlydHVhbOyXkCDstpTqsIDtlZjqs6Ag66as7YS0XG4gICAgICAgIGlmIChncm91cEtleSA9PT0gXCJcIikge1xuICAgICAgICAgIGNvbnN0IHJlYWxGaWVsZHMgPSBmaWVsZHMuZmlsdGVyKChmaWVsZCkgPT4gIWlzVmlydHVhbFByb3AodGhpcy5wcm9wc0RpY3RbZmllbGRdKSk7XG4gICAgICAgICAgLy8gdmlydHVhbFR5cGU6IFwiY29kZVwiICjrmJDripQgdW5kZWZpbmVkKeyduCB2aXJ0dWFsIHByb3Drp4wgci52aXJ0dWFs7JeQIOy2lOqwgFxuICAgICAgICAgIC8vIHZpcnR1YWxUeXBlOiBcInF1ZXJ5XCLsnbgg6rK97JqwIOyCrOyaqeyekOqwgCBhcHBlbmRTZWxlY3TroZwg7KeB7KCRIOy2lOqwgO2VmOuvgOuhnCDsoJzsmbhcbiAgICAgICAgICBjb25zdCB2aXJ0dWFsQ29kZUZpZWxkcyA9IGZpZWxkcy5maWx0ZXIoKGZpZWxkKSA9PlxuICAgICAgICAgICAgaXNWaXJ0dWFsQ29kZVByb3AodGhpcy5wcm9wc0RpY3RbZmllbGRdKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKHByZWZpeCA9PT0gXCJcIikge1xuICAgICAgICAgICAgLy8g7ZiE7J6sIO2FjOydtOu4lOyduCDqsr3smrBcbiAgICAgICAgICAgIHIuc2VsZWN0ID0gci5zZWxlY3QuY29uY2F0KHJlYWxGaWVsZHMubWFwKChmaWVsZCkgPT4gYCR7dGhpcy50YWJsZX0uJHtmaWVsZH1gKSk7XG4gICAgICAgICAgICByLnZpcnR1YWwgPSByLnZpcnR1YWwuY29uY2F0KHZpcnR1YWxDb2RlRmllbGRzKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8g64SY7Ja07JioIO2FjOydtOu4lOyduCDqsr3smrBcbiAgICAgICAgICAgIHIuc2VsZWN0ID0gci5zZWxlY3QuY29uY2F0KFxuICAgICAgICAgICAgICByZWFsRmllbGRzLm1hcCgoZmllbGQpID0+IGAke3ByZWZpeH0uJHtmaWVsZH0gYXMgJHtwcmVmaXh9X18ke2ZpZWxkfWApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlbGF0aW9uID0gdGhpcy5yZWxhdGlvbnNbZ3JvdXBLZXldO1xuICAgICAgICBpZiAocmVsYXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihg7KG07J6s7ZWY7KeAIOyViuuKlCByZWxhdGlvbiDssLjsobAgJHtncm91cEtleX1gKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZWxFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChyZWxhdGlvbi53aXRoKTtcblxuICAgICAgICBpZiAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChyZWxhdGlvbikgfHwgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocmVsYXRpb24pKSB7XG4gICAgICAgICAgLy8gLU9uZSBSZWxhdGlvbjogSk9JTiDsnLzroZwg7LKY66asXG4gICAgICAgICAgY29uc3QgcmVsRmllbGRzID0gZmllbGRzLm1hcCgoZmllbGQpID0+IGZpZWxkLnNwbGl0KFwiLlwiKS5zbGljZSgxKS5qb2luKFwiLlwiKSk7XG5cbiAgICAgICAgICAvLyAtT25lIFJlbGF0aW9u7JeQ7IScIGlkIO2VhOuTnOunjCDssLjsobDtlZjripQg6rK97JqwIOumtOugiOydtOyFmCDrhJjquLDsp4Ag7JWK6rOgIOumrO2EtFxuICAgICAgICAgIGlmIChyZWxGaWVsZHMubGVuZ3RoID09PSAxICYmIHJlbEZpZWxkc1swXSA9PT0gXCJpZFwiKSB7XG4gICAgICAgICAgICBpZiAocHJlZml4ID09PSBcIlwiKSB7XG4gICAgICAgICAgICAgIHIuc2VsZWN0ID0gci5zZWxlY3QuY29uY2F0KGAke3RoaXMudGFibGV9LiR7Z3JvdXBLZXl9X2lkYCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByLnNlbGVjdCA9IHIuc2VsZWN0LmNvbmNhdChgJHtwcmVmaXh9LiR7Z3JvdXBLZXl9X2lkIGFzICR7cHJlZml4fV9fJHtncm91cEtleX1faWRgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGlubmVyT3JPdXRlclxuICAgICAgICAgIGNvbnN0IGlubmVyT3JPdXRlciA9ICgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoaXNBbHJlYWR5T3V0ZXJKb2luZWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIFwib3V0ZXJcIjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocmVsYXRpb24pKSB7XG4gICAgICAgICAgICAgIGlmIChyZWxhdGlvbi5oYXNKb2luQ29sdW1uID09PSB0cnVlICYmIChyZWxhdGlvbi5udWxsYWJsZSA/PyBmYWxzZSkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiaW5uZXJcIjtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJvdXRlclwiO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpZiAocmVsYXRpb24ubnVsbGFibGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJvdXRlclwiO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBcImlubmVyXCI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSgpO1xuICAgICAgICAgIGNvbnN0IHJlbFN1YnNldFF1ZXJ5ID0gcmVsRW50aXR5LnJlc29sdmVTdWJzZXRRdWVyeShcbiAgICAgICAgICAgIGAke3ByZWZpeCAhPT0gXCJcIiA/IGAke3ByZWZpeH0uYCA6IFwiXCJ9JHtncm91cEtleX1gLFxuICAgICAgICAgICAgcmVsRmllbGRzLFxuICAgICAgICAgICAgaW5uZXJPck91dGVyID09PSBcIm91dGVyXCIsXG4gICAgICAgICAgKTtcbiAgICAgICAgICByLnNlbGVjdCA9IHIuc2VsZWN0LmNvbmNhdChyZWxTdWJzZXRRdWVyeS5zZWxlY3QpO1xuICAgICAgICAgIHIudmlydHVhbCA9IHIudmlydHVhbC5jb25jYXQocmVsU3Vic2V0UXVlcnkudmlydHVhbCk7XG5cbiAgICAgICAgICBjb25zdCBqb2luQXMgPSBwcmVmaXggPT09IFwiXCIgPyBncm91cEtleSA6IGAke3ByZWZpeH1fXyR7Z3JvdXBLZXl9YDtcbiAgICAgICAgICBjb25zdCBmcm9tVGFibGUgPSBwcmVmaXggPT09IFwiXCIgPyB0aGlzLnRhYmxlIDogcHJlZml4O1xuXG4gICAgICAgICAgbGV0IGpvaW5DbGF1c2U6XG4gICAgICAgICAgICB8IHtcbiAgICAgICAgICAgICAgICBmcm9tOiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgdG86IHN0cmluZztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfCB7XG4gICAgICAgICAgICAgICAgY3VzdG9tOiBzdHJpbmc7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKHJlbGF0aW9uLmN1c3RvbUpvaW5DbGF1c2UpIHtcbiAgICAgICAgICAgIGpvaW5DbGF1c2UgPSB7XG4gICAgICAgICAgICAgIGN1c3RvbTogcmVsYXRpb24uY3VzdG9tSm9pbkNsYXVzZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmc7XG4gICAgICAgICAgICBpZiAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChyZWxhdGlvbikpIHtcbiAgICAgICAgICAgICAgaWYgKHJlbGF0aW9uLmhhc0pvaW5Db2x1bW4pIHtcbiAgICAgICAgICAgICAgICBmcm9tID0gYCR7ZnJvbVRhYmxlfS4ke3JlbGF0aW9uLm5hbWV9X2lkYDtcbiAgICAgICAgICAgICAgICB0byA9IGAke2pvaW5Bc30uaWRgO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZyb20gPSBgJHtmcm9tVGFibGV9LmlkYDtcbiAgICAgICAgICAgICAgICB0byA9IGAke2pvaW5Bc30uJHtpbmZsZWN0aW9uLnVuZGVyc2NvcmUodGhpcy5uYW1lcy5mcy5yZXBsYWNlKC8tL2csIFwiX1wiKSl9X2lkYDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZnJvbSA9IGAke2Zyb21UYWJsZX0uJHtyZWxhdGlvbi5uYW1lfV9pZGA7XG4gICAgICAgICAgICAgIHRvID0gYCR7am9pbkFzfS5pZGA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBqb2luQ2xhdXNlID0ge1xuICAgICAgICAgICAgICBmcm9tLFxuICAgICAgICAgICAgICB0byxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgci5qb2lucy5wdXNoKHtcbiAgICAgICAgICAgIGFzOiBqb2luQXMsXG4gICAgICAgICAgICBqb2luOiBpbm5lck9yT3V0ZXIsXG4gICAgICAgICAgICB0YWJsZTogcmVsRW50aXR5LnRhYmxlLFxuICAgICAgICAgICAgLi4uam9pbkNsYXVzZSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIEJlbG9uZ3NUb09uZSDrsJHsl5AgSGFzTWFueeqwgCDrtpnsnYAg6rK97JqwXG4gICAgICAgICAgaWYgKHJlbFN1YnNldFF1ZXJ5LmxvYWRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgY29udmVydGVkTG9hZGVycyA9IHJlbFN1YnNldFF1ZXJ5LmxvYWRlcnMubWFwKChsb2FkZXIpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgbmV3QXMgPSBbZ3JvdXBLZXksIGxvYWRlci5hc10uam9pbihcIl9fXCIpO1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGFzOiBuZXdBcyxcbiAgICAgICAgICAgICAgICB0YWJsZTogbG9hZGVyLnRhYmxlLFxuICAgICAgICAgICAgICAgIG1hbnlKb2luOiBsb2FkZXIubWFueUpvaW4sXG4gICAgICAgICAgICAgICAgb25lSm9pbnM6IGxvYWRlci5vbmVKb2lucyxcbiAgICAgICAgICAgICAgICBzZWxlY3Q6IGxvYWRlci5zZWxlY3QsXG4gICAgICAgICAgICAgICAgbG9hZGVyczogbG9hZGVyLmxvYWRlcnMsXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgci5sb2FkZXJzID0gWy4uLnIubG9hZGVycywgLi4uY29udmVydGVkTG9hZGVyc107XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgci5qb2lucyA9IHIuam9pbnMuY29uY2F0KHJlbFN1YnNldFF1ZXJ5LmpvaW5zKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0hhc01hbnlSZWxhdGlvblByb3AocmVsYXRpb24pIHx8IGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcChyZWxhdGlvbikpIHtcbiAgICAgICAgICAvLyAtTWFueSBSZWxhdGlvbjogTG9hZGVyIOuhnCDsspjrpqxcbiAgICAgICAgICBjb25zdCByZWxGaWVsZHMgPSBmaWVsZHMubWFwKChmaWVsZCkgPT4gZmllbGQuc3BsaXQoXCIuXCIpLnNsaWNlKDEpLmpvaW4oXCIuXCIpKTtcbiAgICAgICAgICBjb25zdCByZWxTdWJzZXRRdWVyeSA9IHJlbEVudGl0eS5yZXNvbHZlU3Vic2V0UXVlcnkoXCJcIiwgcmVsRmllbGRzKTtcblxuICAgICAgICAgIGxldCBtYW55Sm9pbjogU3Vic2V0UXVlcnlbXCJsb2FkZXJzXCJdW251bWJlcl1bXCJtYW55Sm9pblwiXTtcbiAgICAgICAgICBpZiAoaXNIYXNNYW55UmVsYXRpb25Qcm9wKHJlbGF0aW9uKSkge1xuICAgICAgICAgICAgY29uc3QgZnJvbUNvbCA9IHJlbGF0aW9uPy5mcm9tQ29sdW1uID8/IFwiaWRcIjtcbiAgICAgICAgICAgIG1hbnlKb2luID0ge1xuICAgICAgICAgICAgICBmcm9tVGFibGU6IHRoaXMudGFibGUsXG4gICAgICAgICAgICAgIGZyb21Db2wsXG4gICAgICAgICAgICAgIGlkRmllbGQ6IHByZWZpeCA9PT0gXCJcIiA/IGAke2Zyb21Db2x9YCA6IGAke3ByZWZpeH1fXyR7ZnJvbUNvbH1gLFxuICAgICAgICAgICAgICB0b1RhYmxlOiByZWxFbnRpdHkudGFibGUsXG4gICAgICAgICAgICAgIHRvQ29sOiByZWxhdGlvbi5qb2luQ29sdW1uLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcChyZWxhdGlvbikpIHtcbiAgICAgICAgICAgIG1hbnlKb2luID0ge1xuICAgICAgICAgICAgICBmcm9tVGFibGU6IHRoaXMudGFibGUsXG4gICAgICAgICAgICAgIGZyb21Db2w6IFwiaWRcIixcbiAgICAgICAgICAgICAgaWRGaWVsZDogcHJlZml4ID09PSBcIlwiID8gYGlkYCA6IGAke3ByZWZpeH1fX2lkYCxcbiAgICAgICAgICAgICAgdGhyb3VnaDoge1xuICAgICAgICAgICAgICAgIHRhYmxlOiByZWxhdGlvbi5qb2luVGFibGUsXG4gICAgICAgICAgICAgICAgZnJvbUNvbDogYCR7aW5mbGVjdGlvbi5zaW5ndWxhcml6ZSh0aGlzLnRhYmxlKX1faWRgLFxuICAgICAgICAgICAgICAgIHRvQ29sOiBgJHtpbmZsZWN0aW9uLnNpbmd1bGFyaXplKHJlbEVudGl0eS50YWJsZSl9X2lkYCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgdG9UYWJsZTogcmVsRW50aXR5LnRhYmxlLFxuICAgICAgICAgICAgICB0b0NvbDogXCJpZFwiLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgci5sb2FkZXJzLnB1c2goe1xuICAgICAgICAgICAgYXM6IGdyb3VwS2V5LFxuICAgICAgICAgICAgdGFibGU6IHJlbEVudGl0eS50YWJsZSxcbiAgICAgICAgICAgIG1hbnlKb2luLFxuICAgICAgICAgICAgb25lSm9pbnM6IHJlbFN1YnNldFF1ZXJ5LmpvaW5zLFxuICAgICAgICAgICAgc2VsZWN0OiByZWxTdWJzZXRRdWVyeS5zZWxlY3QsXG4gICAgICAgICAgICBsb2FkZXJzOiByZWxTdWJzZXRRdWVyeS5sb2FkZXJzLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHI7XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBzZWxlY3Q6IFtdLFxuICAgICAgICB2aXJ0dWFsOiBbXSxcbiAgICAgICAgam9pbnM6IFtdLFxuICAgICAgICBsb2FkZXJzOiBbXSxcbiAgICAgIH0gYXMgU3Vic2V0UXVlcnksXG4gICAgKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLypcbiAgICBGaWVsZEV4cHJbXSDsnYQgRW50aXR5UHJvcE5vZGVbXSDroZwg67OA7ZmYXG4gICovXG4gIGZpZWxkRXhwcnNUb1Byb3BOb2RlcyhmaWVsZEV4cHJzOiBzdHJpbmdbXSwgZW50aXR5OiBFbnRpdHkgPSB0aGlzKTogRW50aXR5UHJvcE5vZGVbXSB7XG4gICAgY29uc3QgZ3JvdXBzID0gZmllbGRFeHBycy5yZWR1Y2UoXG4gICAgICAocmVzdWx0LCBmaWVsZEV4cHIpID0+IHtcbiAgICAgICAgbGV0IGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nLCBlbHNlRXhwcjogc3RyaW5nW107XG4gICAgICAgIGlmIChmaWVsZEV4cHIuaW5jbHVkZXMoXCIuXCIpKSB7XG4gICAgICAgICAgW2tleSwgLi4uZWxzZUV4cHJdID0gZmllbGRFeHByLnNwbGl0KFwiLlwiKTtcbiAgICAgICAgICB2YWx1ZSA9IGVsc2VFeHByLmpvaW4oXCIuXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGtleSA9IFwiXCI7XG4gICAgICAgICAgdmFsdWUgPSBmaWVsZEV4cHI7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0W2tleV0gPSAocmVzdWx0W2tleV0gPz8gW10pLmNvbmNhdCh2YWx1ZSk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0sXG4gICAgICB7fSBhcyB7XG4gICAgICAgIFtrOiBzdHJpbmddOiBzdHJpbmdbXTtcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIHJldHVybiBPYmplY3Qua2V5cyhncm91cHMpLmZsYXRNYXA8RW50aXR5UHJvcE5vZGUsIEVudGl0eVByb3BOb2RlW10+KChrZXkpID0+IHtcbiAgICAgIGNvbnN0IGdyb3VwID0gZ3JvdXBzW2tleV07XG5cbiAgICAgIC8vIOydvOuwmCBwcm9wIOyymOumrFxuICAgICAgaWYgKGtleSA9PT0gXCJcIikge1xuICAgICAgICByZXR1cm4gZ3JvdXAubWFwKChwcm9wTmFtZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHByb3AgPSBlbnRpdHkucHJvcHMuZmluZCgocCkgPT4gcC5uYW1lID09PSBwcm9wTmFtZSk7XG4gICAgICAgICAgaWYgKHByb3AgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coeyBwcm9wTmFtZSwgZ3JvdXBzIH0pO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2VudGl0eS5pZH0gLS0g7J6Y66q765CcIEZpZWxkRXhwciAke3Byb3BOYW1lfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbm9kZVR5cGU6IFwicGxhaW5cIiBhcyBjb25zdCxcbiAgICAgICAgICAgIHByb3AsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIHJlbGF0aW9uIHByb3Ag7LKY66asXG4gICAgICBjb25zdCBwcm9wID0gZW50aXR5LnByb3BzRGljdFtrZXldO1xuICAgICAgaWYgKCFpc1JlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYOyemOuqu+uQnCBGaWVsZEV4cHIgJHtrZXl9LiR7Z3JvdXBbMF19YCk7XG4gICAgICB9XG4gICAgICBjb25zdCByZWxFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuXG4gICAgICAvLyByZWxhdGlvbiAtT25lIOyXkCBpZCDtlYTrk5wg7ZWY64KY7J24IOqyveyasFxuICAgICAgaWYgKGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKHByb3ApIHx8IGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgaWYgKGdyb3VwLmxlbmd0aCA9PT0gMSAmJiAoZ3JvdXBbMF0gPT09IFwiaWRcIiB8fCBncm91cFswXSA9PT0gXCJpZD9cIikpIHtcbiAgICAgICAgICAvLyBpZCDtlZjrgpjrp4wg7J6I64qU7KeAIOyytO2BrO2VtOyEnCwg7ZWY64KY66eMIOyeiOycvOuptCDsg4HsnIQgcHJvcOycvOuhnCBpZOulvCDrpqzthLRcbiAgICAgICAgICBjb25zdCBpZFByb3AgPSByZWxFbnRpdHkucHJvcHNEaWN0LmlkO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBub2RlVHlwZTogXCJwbGFpblwiIGFzIGNvbnN0LFxuICAgICAgICAgICAgcHJvcDoge1xuICAgICAgICAgICAgICAuLi5pZFByb3AsXG4gICAgICAgICAgICAgIG5hbWU6IGAke2tleX1faWRgLFxuICAgICAgICAgICAgICBudWxsYWJsZTogcHJvcC5udWxsYWJsZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyAtT25lIOq3uOyZuOydmCDqsr3smrAgb2JqZWN066GcIOumrO2EtFxuICAgICAgLy8gLU1hbnnsnZgg6rK97JqwIGFycmF566GcIOumrO2EtFxuICAgICAgLy8gUmVjdXJzaXZlIOuhnCDrjoHsiqQg7LKY66asXG4gICAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuZmllbGRFeHByc1RvUHJvcE5vZGVzKGdyb3VwLCByZWxFbnRpdHkpO1xuICAgICAgY29uc3Qgbm9kZVR5cGUgPVxuICAgICAgICBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSB8fCBpc09uZVRvT25lUmVsYXRpb25Qcm9wKHByb3ApXG4gICAgICAgICAgPyAoXCJvYmplY3RcIiBhcyBjb25zdClcbiAgICAgICAgICA6IChcImFycmF5XCIgYXMgY29uc3QpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBub2RlVHlwZSxcbiAgICAgICAgcHJvcCxcbiAgICAgICAgY2hpbGRyZW4sXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0RmllbGRFeHBycyhwcmVmaXggPSBcIlwiLCBtYXhEZXB0aDogbnVtYmVyID0gMywgZnJvbXM6IHN0cmluZ1tdID0gW10pOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHNcbiAgICAgIC5mbGF0TWFwKChwcm9wKSA9PiB7XG4gICAgICAgIGNvbnN0IHByb3BOYW1lID0gW3ByZWZpeCwgcHJvcC5uYW1lXS5maWx0ZXIoKHYpID0+IHYgIT09IFwiXCIpLmpvaW4oXCIuXCIpO1xuICAgICAgICBpZiAocHJvcE5hbWUgPT09IHByZWZpeCkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1JlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICAgIGlmIChtYXhEZXB0aCA8IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZnJvbXMuaW5jbHVkZXMocHJvcC53aXRoKSkge1xuICAgICAgICAgICAgLy8g7Jet67Cp7ZalIHJlbGF0aW9u7J24IOqyveyasCDsoJzsmbhcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyDsoJXrsKntlqUgcmVsYXRpb27snbgg6rK97JqwIHJlY3Vyc2l2ZSDsvZxcbiAgICAgICAgICBjb25zdCByZWxNZCA9IEVudGl0eU1hbmFnZXIuZ2V0KHByb3Aud2l0aCk7XG4gICAgICAgICAgcmV0dXJuIHJlbE1kLmdldEZpZWxkRXhwcnMocHJvcE5hbWUsIG1heERlcHRoIC0gMSwgWy4uLmZyb21zLCB0aGlzLmlkXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByb3BOYW1lO1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoKGYpID0+IGYgIT09IG51bGwpIGFzIHN0cmluZ1tdO1xuICB9XG5cbiAgZ2V0VGFibGVDb2x1bW5zKCk6IHsgbmFtZTogc3RyaW5nOyB0eXBlOiBzdHJpbmcgfVtdIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wc1xuICAgICAgLm1hcCgocHJvcCkgPT4ge1xuICAgICAgICBpZiAocHJvcC50eXBlID09PSBcInJlbGF0aW9uXCIpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBwcm9wLnJlbGF0aW9uVHlwZSA9PT0gXCJCZWxvbmdzVG9PbmVcIiB8fFxuICAgICAgICAgICAgKHByb3AucmVsYXRpb25UeXBlID09PSBcIk9uZVRvT25lXCIgJiYgcHJvcC5oYXNKb2luQ29sdW1uID09PSB0cnVlKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIHsgbmFtZTogYCR7cHJvcC5uYW1lfV9pZGAsIHR5cGU6IFwiaW50X3Vuc2lnbmVkXCIgfTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IG5hbWU6IHByb3AubmFtZSwgdHlwZTogcHJvcC50eXBlIH07XG4gICAgICB9KVxuICAgICAgLmZpbHRlcihub25OdWxsYWJsZSk7XG4gIH1cblxuICAvKipcbiAgICogRW50aXR57JeQIOygleydmOuQnCDrqqjrk6AgdmVjdG9yIO2DgOyehSDsu6zrn7wg67CY7ZmYXG4gICAqL1xuICBnZXRWZWN0b3JDb2x1bW5zKCk6IEVudGl0eVByb3BbXSB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuZmlsdGVyKChwKSA9PiBwLnR5cGUgPT09IFwidmVjdG9yXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2KueyglSB2ZWN0b3Ig7Lus65+8IOuwmO2ZmFxuICAgKiBAcGFyYW0gY29sdW1uTmFtZSAtIOy7rOufvOuqhSAo7IOd6561IOyLnCDssqsg67KI7Ke4IHZlY3RvciDsu6zrn7wpXG4gICAqL1xuICBnZXRWZWN0b3JDb2x1bW4oY29sdW1uTmFtZT86IHN0cmluZyk6IEVudGl0eVByb3AgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHZlY3RvclByb3BzID0gdGhpcy5nZXRWZWN0b3JDb2x1bW5zKCk7XG4gICAgaWYgKGNvbHVtbk5hbWUpIHtcbiAgICAgIHJldHVybiB2ZWN0b3JQcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IGNvbHVtbk5hbWUpO1xuICAgIH1cbiAgICByZXR1cm4gdmVjdG9yUHJvcHNbMF07XG4gIH1cblxuICBhc3luYyByZWdpc3Rlck1vZHVsZVBhdGhzKCkge1xuICAgIGNvbnN0IGJhc2VQYXRoID0gYCR7dGhpcy5uYW1lcy5wYXJlbnRGc31gO1xuXG4gICAgLy8gYmFzZS1zY2hlbWVcbiAgICBFbnRpdHlNYW5hZ2VyLnNldE1vZHVsZVBhdGgoYCR7dGhpcy5pZH1CYXNlU2NoZW1hYCwgYHNvbmFtdS5nZW5lcmF0ZWRgKTtcblxuICAgIC8vIHN1YnNldFxuICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLnN1YnNldHMpLmxlbmd0aCA+IDApIHtcbiAgICAgIEVudGl0eU1hbmFnZXIuc2V0TW9kdWxlUGF0aChgJHt0aGlzLmlkfVN1YnNldEtleWAsIGBzb25hbXUuZ2VuZXJhdGVkYCk7XG4gICAgICBFbnRpdHlNYW5hZ2VyLnNldE1vZHVsZVBhdGgoYCR7dGhpcy5pZH1TdWJzZXRNYXBwaW5nYCwgYHNvbmFtdS5nZW5lcmF0ZWRgKTtcbiAgICAgIGZvciAoY29uc3Qgc3Vic2V0S2V5IG9mIE9iamVjdC5rZXlzKHRoaXMuc3Vic2V0cykpIHtcbiAgICAgICAgRW50aXR5TWFuYWdlci5zZXRNb2R1bGVQYXRoKFxuICAgICAgICAgIGAke3RoaXMuaWR9U3Vic2V0JHtzdWJzZXRLZXkudG9VcHBlckNhc2UoKX1gLFxuICAgICAgICAgIGBzb25hbXUuZ2VuZXJhdGVkYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBlbnVtc1xuICAgIGZvciAoY29uc3QgZW51bUlkIG9mIE9iamVjdC5rZXlzKHRoaXMuZW51bUxhYmVscykpIHtcbiAgICAgIEVudGl0eU1hbmFnZXIuc2V0TW9kdWxlUGF0aChlbnVtSWQsIGBzb25hbXUuZ2VuZXJhdGVkYCk7XG4gICAgfVxuXG4gICAgLy8gdHlwZXNcbiAgICBjb25zdCB0eXBlc01vZHVsZVBhdGggPSBgJHtiYXNlUGF0aH0vJHt0aGlzLm5hbWVzLnBhcmVudEZzfS50eXBlc2A7XG4gICAgY29uc3QgdHlwZXNGaWxlUGF0aCA9IHBhdGguam9pbihcbiAgICAgIFNvbmFtdS5hcGlSb290UGF0aCxcbiAgICAgIHJ1bnRpbWVQYXRoKGBkaXN0L2FwcGxpY2F0aW9uLyR7dHlwZXNNb2R1bGVQYXRofS5qc2ApLFxuICAgICk7XG5cbiAgICBpZiAoYXdhaXQgZXhpc3RzKHR5cGVzRmlsZVBhdGgpKSB7XG4gICAgICBjb25zdCBpbXBvcnRlZE1lbWJlcnMgPSBhd2FpdCBpbXBvcnRNZW1iZXJzPHouWm9kVHlwZUFueT4odHlwZXNGaWxlUGF0aCk7XG4gICAgICB0aGlzLnR5cGVzID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBpbXBvcnRlZE1lbWJlcnMubWFwKCh7IG5hbWUsIHZhbHVlIH0pID0+IHtcbiAgICAgICAgICBFbnRpdHlNYW5hZ2VyLnNldE1vZHVsZVBhdGgobmFtZSwgdHlwZXNNb2R1bGVQYXRoKTtcbiAgICAgICAgICByZXR1cm4gW25hbWUsIHZhbHVlXTtcbiAgICAgICAgfSksXG4gICAgICApIGFzIHsgW25hbWU6IHN0cmluZ106IHouWm9kVHlwZUFueSB9O1xuICAgIH1cbiAgfVxuXG4gIHJlZ2lzdGVyVGFibGVTcGVjcygpOiB2b2lkIHtcbiAgICAvLyDsobDsnbgg7YWM7J2067iUIOyduOuNseyKpCDsoJzsmbggKOy7rOufvCDsnbTrpoTsl5AgJy4n7J20IO2PrO2VqOuQnCDqsr3smrApXG4gICAgY29uc3QgdW5pcXVlSW5kZXhlcyA9IHRoaXMuaW5kZXhlc1xuICAgICAgLmZpbHRlcigoaWR4KSA9PiBpZHgudHlwZSA9PT0gXCJ1bmlxdWVcIilcbiAgICAgIC5maWx0ZXIoKGlkeCkgPT4gaWR4LmNvbHVtbnMuZXZlcnkoKGNvbCkgPT4gIWNvbC5uYW1lLmluY2x1ZGVzKFwiLlwiKSkpO1xuXG4gICAgRW50aXR5TWFuYWdlci5zZXRUYWJsZVNwZWMoe1xuICAgICAgbmFtZTogdGhpcy50YWJsZSxcbiAgICAgIHVuaXF1ZUluZGV4ZXMsXG4gICAgfSk7XG4gIH1cblxuICB0b0pzb24oKTogRW50aXR5SnNvbiB7XG4gICAgLy8gc3Vic2V0c+yZgCBzdWJzZXRzSW50ZXJuYWzsnYQgU3Vic2V0RmllbGRbXSDtmJXtg5zroZwg67O17JuQXG4gICAgY29uc3Qgc3Vic2V0czogeyBba2V5OiBzdHJpbmddOiBTdWJzZXRGaWVsZFtdIH0gPSB7fTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh0aGlzLnN1YnNldHMpKSB7XG4gICAgICBjb25zdCBub3JtYWxGaWVsZHM6IFN1YnNldEZpZWxkW10gPSB0aGlzLnN1YnNldHNba2V5XTtcbiAgICAgIGNvbnN0IGludGVybmFsRmllbGRzOiBTdWJzZXRGaWVsZFtdID0gKHRoaXMuc3Vic2V0c0ludGVybmFsW2tleV0gPz8gW10pLm1hcCgoZmllbGQpID0+ICh7XG4gICAgICAgIGZpZWxkLFxuICAgICAgICBpbnRlcm5hbDogdHJ1ZSxcbiAgICAgIH0pKTtcbiAgICAgIHN1YnNldHNba2V5XSA9IFsuLi5ub3JtYWxGaWVsZHMsIC4uLmludGVybmFsRmllbGRzXTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICBwYXJlbnRJZDogdGhpcy5wYXJlbnRJZCxcbiAgICAgIHRhYmxlOiB0aGlzLnRhYmxlLFxuICAgICAgdGl0bGU6IHRoaXMudGl0bGUsXG4gICAgICBwcm9wczogdGhpcy5wcm9wcyxcbiAgICAgIGluZGV4ZXM6IHRoaXMuaW5kZXhlcyxcbiAgICAgIHN1YnNldHMsXG4gICAgICBlbnVtczogdGhpcy5lbnVtTGFiZWxzLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBzYXZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIHNvcnQ6IHN1YnNldHNcbiAgICBjb25zdCBzdWJzZXRSb3dzID0gdGhpcy5nZXRTdWJzZXRSb3dzKCk7XG4gICAgdGhpcy5zdWJzZXRzID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXModGhpcy5zdWJzZXRzKS5tYXAoKFtzdWJzZXRLZXldKSA9PiB7XG4gICAgICAgIHJldHVybiBbc3Vic2V0S2V5LCB0aGlzLnN1YnNldFJvd3NUb1N1YnNldEZpZWxkcyhzdWJzZXRSb3dzLCBzdWJzZXRLZXksIGZhbHNlKV07XG4gICAgICB9KSxcbiAgICApO1xuICAgIHRoaXMuc3Vic2V0c0ludGVybmFsID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXModGhpcy5zdWJzZXRzSW50ZXJuYWwpLm1hcCgoW3N1YnNldEtleV0pID0+IHtcbiAgICAgICAgcmV0dXJuIFtzdWJzZXRLZXksIHRoaXMuc3Vic2V0Um93c1RvU3Vic2V0RmllbGRzKHN1YnNldFJvd3MsIHN1YnNldEtleSwgdHJ1ZSldO1xuICAgICAgfSksXG4gICAgKTtcblxuICAgIC8vIHNhdmVcbiAgICBjb25zdCBqc29uUGF0aCA9IHBhdGguam9pbihcbiAgICAgIFNvbmFtdS5hcGlSb290UGF0aCxcbiAgICAgIGBzcmMvYXBwbGljYXRpb24vJHt0aGlzLm5hbWVzLnBhcmVudEZzfS8ke3RoaXMubmFtZXMuZnN9LmVudGl0eS5qc29uYCxcbiAgICApO1xuICAgIGNvbnN0IGpzb24gPSB0aGlzLnRvSnNvbigpO1xuICAgIGF3YWl0IHdyaXRlRmlsZShqc29uUGF0aCwgZm9ybWF0Q29kZShKU09OLnN0cmluZ2lmeShqc29uKSwgXCJqc29uXCIsIGpzb25QYXRoKSk7XG5cbiAgICAvLyByZWxvYWRcbiAgICBhd2FpdCBFbnRpdHlNYW5hZ2VyLnJlZ2lzdGVyKGpzb24pO1xuICB9XG5cbiAgZ2V0U3Vic2V0Um93cyhcbiAgICBfc3Vic2V0cz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nW10gfSxcbiAgICBfc3Vic2V0c0ludGVybmFsPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmdbXSB9LFxuICAgIHByZWZpeGVzOiBzdHJpbmdbXSA9IFtdLFxuICApOiBFbnRpdHlTdWJzZXRSb3dbXSB7XG4gICAgaWYgKHByZWZpeGVzLmxlbmd0aCA+IDEwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3Qgc3Vic2V0cyA9IF9zdWJzZXRzID8/IHRoaXMuc3Vic2V0cztcbiAgICBjb25zdCBzdWJzZXRzSW50ZXJuYWwgPSBfc3Vic2V0c0ludGVybmFsID8/IHRoaXMuc3Vic2V0c0ludGVybmFsO1xuICAgIGNvbnN0IHN1YnNldEtleXMgPSBPYmplY3Qua2V5cyhzdWJzZXRzKTtcbiAgICBjb25zdCBhbGxGaWVsZHMgPSB1bmlxdWUoc3Vic2V0S2V5cy5mbGF0TWFwKChrZXkpID0+IHN1YnNldHNba2V5XSkpO1xuICAgIC8vIGludGVybmFsIO2VhOuTnOuPhCBhbGxGaWVsZHPsl5Ag7Y+s7ZWoIChyZWxhdGlvbiDtg5Dsg4nsmqkpXG4gICAgY29uc3QgYWxsSW50ZXJuYWxGaWVsZHMgPSB1bmlxdWUoc3Vic2V0S2V5cy5mbGF0TWFwKChrZXkpID0+IHN1YnNldHNJbnRlcm5hbFtrZXldID8/IFtdKSk7XG4gICAgY29uc3QgY29tYmluZWRGaWVsZHMgPSB1bmlxdWUoWy4uLmFsbEZpZWxkcywgLi4uYWxsSW50ZXJuYWxGaWVsZHNdKTtcblxuICAgIHJldHVybiB0aGlzLnByb3BzLm1hcCgocHJvcCkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICBwcm9wLnR5cGUgPT09IFwicmVsYXRpb25cIiAmJlxuICAgICAgICBjb21iaW5lZEZpZWxkcy5maW5kKChmKSA9PiBmLnN0YXJ0c1dpdGgoYCR7Wy4uLnByZWZpeGVzLCBwcm9wLm5hbWVdLmpvaW4oXCIuXCIpfS5gKSlcbiAgICAgICkge1xuICAgICAgICBjb25zdCByZWxFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IHJlbEVudGl0eS5nZXRTdWJzZXRSb3dzKHN1YnNldHMsIHN1YnNldHNJbnRlcm5hbCwgW1xuICAgICAgICAgIC4uLnByZWZpeGVzLFxuICAgICAgICAgIGAke3Byb3AubmFtZX1gLFxuICAgICAgICBdKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGZpZWxkOiBwcm9wLm5hbWUsXG4gICAgICAgICAgY2hpbGRyZW4sXG4gICAgICAgICAgcmVsYXRpb25FbnRpdHk6IHByb3Aud2l0aCxcbiAgICAgICAgICBwcmVmaXhlcyxcbiAgICAgICAgICBpc09wZW46IGNoaWxkcmVuLmxlbmd0aCA+IDAsXG4gICAgICAgICAgaGFzOiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgICBzdWJzZXRLZXlzLm1hcCgoc3Vic2V0S2V5KSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBbc3Vic2V0S2V5LCBjaGlsZHJlbi5ldmVyeSgoY2hpbGQpID0+IGNoaWxkLmhhc1tzdWJzZXRLZXldID09PSB0cnVlKV07XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApLFxuICAgICAgICAgIGlzSW50ZXJuYWw6IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICAgIHN1YnNldEtleXMubWFwKChzdWJzZXRLZXkpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIFtzdWJzZXRLZXksIGNoaWxkcmVuLmV2ZXJ5KChjaGlsZCkgPT4gY2hpbGQuaXNJbnRlcm5hbFtzdWJzZXRLZXldID09PSB0cnVlKV07XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmaWVsZCA9IFsuLi5wcmVmaXhlcywgcHJvcC5uYW1lXS5qb2luKFwiLlwiKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZpZWxkOiBwcm9wLm5hbWUsXG4gICAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICAgICAgcmVsYXRpb25FbnRpdHk6IHByb3AudHlwZSA9PT0gXCJyZWxhdGlvblwiID8gcHJvcC53aXRoIDogdW5kZWZpbmVkLFxuICAgICAgICBwcmVmaXhlcyxcbiAgICAgICAgaGFzOiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgc3Vic2V0S2V5cy5tYXAoKHN1YnNldEtleSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3Vic2V0RmllbGRzID0gc3Vic2V0c1tzdWJzZXRLZXldO1xuICAgICAgICAgICAgY29uc3QgaGFzID0gc3Vic2V0RmllbGRzLnNvbWUoKGYpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIGYgPT09IGZpZWxkIHx8IGYuc3RhcnRzV2l0aChgJHtmaWVsZH0uYCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBbc3Vic2V0S2V5LCBoYXNdO1xuICAgICAgICAgIH0pLFxuICAgICAgICApLFxuICAgICAgICBpc0ludGVybmFsOiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgc3Vic2V0S2V5cy5tYXAoKHN1YnNldEtleSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW50ZXJuYWxGaWVsZHMgPSBzdWJzZXRzSW50ZXJuYWxbc3Vic2V0S2V5XSA/PyBbXTtcbiAgICAgICAgICAgIGNvbnN0IGlzSW50ZXJuYWwgPSBpbnRlcm5hbEZpZWxkcy5zb21lKChmKSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBmID09PSBmaWVsZCB8fCBmLnN0YXJ0c1dpdGgoYCR7ZmllbGR9LmApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gW3N1YnNldEtleSwgaXNJbnRlcm5hbF07XG4gICAgICAgICAgfSksXG4gICAgICAgICksXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgc3Vic2V0Um93c1RvU3Vic2V0RmllbGRzKFxuICAgIHN1YnNldFJvd3M6IEVudGl0eVN1YnNldFJvd1tdLFxuICAgIHN1YnNldEtleTogc3RyaW5nLFxuICAgIGludGVybmFsOiBib29sZWFuID0gZmFsc2UsXG4gICk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBoYXNLZXkgPSBpbnRlcm5hbCA/IFwiaXNJbnRlcm5hbFwiIDogXCJoYXNcIjtcbiAgICByZXR1cm4gc3Vic2V0Um93c1xuICAgICAgLm1hcCgoc3Vic2V0Um93KSA9PiB7XG4gICAgICAgIGlmIChzdWJzZXRSb3cuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnN1YnNldFJvd3NUb1N1YnNldEZpZWxkcyhzdWJzZXRSb3cuY2hpbGRyZW4sIHN1YnNldEtleSwgaW50ZXJuYWwpO1xuICAgICAgICB9IGVsc2UgaWYgKHN1YnNldFJvd1toYXNLZXldW3N1YnNldEtleV0pIHtcbiAgICAgICAgICByZXR1cm4gc3Vic2V0Um93LnByZWZpeGVzLmNvbmNhdChzdWJzZXRSb3cuZmllbGQpLmpvaW4oXCIuXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLmZpbHRlcihub25OdWxsYWJsZSlcbiAgICAgIC5mbGF0KCk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVQcm9wKHByb3A6IEVudGl0eVByb3AsIGF0PzogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFhdCkge1xuICAgICAgdGhpcy5wcm9wcy5wdXNoKHByb3ApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnByb3BzLnNwbGljZShhdCwgMCwgcHJvcCk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuc2F2ZSgpO1xuICB9XG5cbiAgYW5hbHl6ZVN1YnNldEZpZWxkKHN1YnNldEZpZWxkOiBzdHJpbmcpOiB7XG4gICAgZW50aXR5SWQ6IHN0cmluZztcbiAgICBwcm9wTmFtZTogc3RyaW5nO1xuICB9W10ge1xuICAgIGNvbnN0IGFyciA9IHN1YnNldEZpZWxkLnNwbGl0KFwiLlwiKTtcblxuICAgIGxldCBlbnRpdHlJZCA9IHRoaXMuaWQ7XG4gICAgY29uc3QgcmVzdWx0OiB7XG4gICAgICBlbnRpdHlJZDogc3RyaW5nO1xuICAgICAgcHJvcE5hbWU6IHN0cmluZztcbiAgICB9W10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgcHJvcE5hbWUgPSBhcnJbaV07XG4gICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgIGVudGl0eUlkLFxuICAgICAgICBwcm9wTmFtZSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBwcm9wID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpLnByb3BzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gcHJvcE5hbWUpO1xuICAgICAgaWYgKCFwcm9wKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtlbnRpdHlJZH3snZgg7J6Y66q765CcIOyEnOu4jOyFi+2CpCAke3N1YnNldEZpZWxkfWApO1xuICAgICAgfVxuICAgICAgaWYgKGlzUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgIGVudGl0eUlkID0gcHJvcC53aXRoO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgYXN5bmMgbW9kaWZ5UHJvcChuZXdQcm9wOiBFbnRpdHlQcm9wLCBhdDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8g7J207KCEIO2UhOuhrSDsnbTrpoQg7KCA7J6lXG4gICAgY29uc3Qgb2xkTmFtZSA9IHRoaXMucHJvcHNbYXRdLm5hbWU7XG5cbiAgICAvLyDsoIDsnqXtlaAg7JeU7Yuw7YuwXG4gICAgY29uc3QgZW50aXRpZXM6IEVudGl0eVtdID0gW3RoaXNdO1xuXG4gICAgLy8g7J2066aE7J20IOuwlOuAkCDqsr3smrBcbiAgICBpZiAob2xkTmFtZSAhPT0gbmV3UHJvcC5uYW1lKSB7XG4gICAgICAvLyDsoITssrQg7JeU7Yuw7Yuw7JeQ7IScIO2YhOyerCDsiJjsoJXrkJwg7ZSE66Gt7J2EIOywuOyhsO2VmOqzoCDsnojripQg66qo65OgIOyEnOu4jOyFi+2VhOuTnCDssL7slYTshJwg7IiY7KCVXG4gICAgICBjb25zdCBhbGxFbnRpdHlJZHMgPSBFbnRpdHlNYW5hZ2VyLmdldEFsbElkcygpO1xuICAgICAgZm9yIChjb25zdCByZWxFbnRpdHlJZCBvZiBhbGxFbnRpdHlJZHMpIHtcbiAgICAgICAgY29uc3QgcmVsRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocmVsRW50aXR5SWQpO1xuICAgICAgICBjb25zdCByZWxFbnRpdHlTdWJzZXRLZXlzID0gT2JqZWN0LmtleXMocmVsRW50aXR5LnN1YnNldHMpO1xuICAgICAgICBmb3IgKGNvbnN0IHN1YnNldEtleSBvZiByZWxFbnRpdHlTdWJzZXRLZXlzKSB7XG4gICAgICAgICAgY29uc3Qgc3Vic2V0ID0gcmVsRW50aXR5LnN1YnNldHNbc3Vic2V0S2V5XTtcblxuICAgICAgICAgIC8vIOyEnOu4jOyFiyDtlYTrk5zrpbwg7Iic7ZqM7ZWY66mwLCDsl5Tti7Dti7At7ZSE66GtIOuLqOychOuhnCDrtoTshJ3tlZwg7ZuEIO2YhOyerCDsl5Tti7Dti7At7ZSE66Gt6rO8IOydvOy5mO2VmOuKlCDqsr3smrAg7IiY7KCVIOyymOumrFxuICAgICAgICAgIGNvbnN0IG1vZGlmaWVkU3Vic2V0RmllbGRzID0gc3Vic2V0Lm1hcCgoc3Vic2V0RmllbGQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFuYWx5emVkID0gcmVsRW50aXR5LmFuYWx5emVTdWJzZXRGaWVsZChzdWJzZXRGaWVsZCk7XG4gICAgICAgICAgICBjb25zdCBtb2RpZmllZCA9IGFuYWx5emVkLm1hcCgoYSkgPT5cbiAgICAgICAgICAgICAgYS5wcm9wTmFtZSA9PT0gb2xkTmFtZSAmJiBhLmVudGl0eUlkID09PSB0aGlzLmlkXG4gICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgIC4uLmEsXG4gICAgICAgICAgICAgICAgICAgIHByb3BOYW1lOiBuZXdQcm9wLm5hbWUsXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgOiBhLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIC8vIOu2hOyEne2VnCDtlYTrk5zrpbwg64uk7IucIOyEnOu4jOyFiyDtlYTrk5zroZwg67O16rWsXG4gICAgICAgICAgICByZXR1cm4gbW9kaWZpZWQubWFwKChhKSA9PiBhLnByb3BOYW1lKS5qb2luKFwiLlwiKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmIChzdWJzZXQuam9pbihcIixcIikgIT09IG1vZGlmaWVkU3Vic2V0RmllbGRzLmpvaW4oXCIsXCIpKSB7XG4gICAgICAgICAgICByZWxFbnRpdHkuc3Vic2V0c1tzdWJzZXRLZXldID0gbW9kaWZpZWRTdWJzZXRGaWVsZHM7XG4gICAgICAgICAgICBlbnRpdGllcy5wdXNoKHJlbEVudGl0eSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g7ZSE66GtIOyImOyglVxuICAgIHRoaXMucHJvcHNbYXRdID0gbmV3UHJvcDtcblxuICAgIGF3YWl0IFByb21pc2UuYWxsKGVudGl0aWVzLm1hcChhc3luYyAoZW50aXR5KSA9PiBlbnRpdHkuc2F2ZSgpKSk7XG4gIH1cblxuICBhc3luYyBkZWxQcm9wKGF0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyDsnbTsoIQg7ZSE66GtIOydtOumhCDsoIDsnqVcbiAgICBjb25zdCBvbGROYW1lID0gdGhpcy5wcm9wc1thdF0ubmFtZTtcblxuICAgIC8vIOyggOyepe2VoCDsl5Tti7Dti7BcbiAgICBjb25zdCBlbnRpdGllczogRW50aXR5W10gPSBbdGhpc107XG5cbiAgICAvLyDsoITssrQg7JeU7Yuw7Yuw7JeQ7IScIO2YhOyerCDsgq3soJzrkJwg7ZSE66Gt7J2EIOywuOyhsO2VmOqzoCDsnojripQg66qo65OgIOyEnOu4jOyFi+2VhOuTnCDssL7slYTshJwg7KCc7Jm4XG4gICAgY29uc3QgYWxsRW50aXR5SWRzID0gRW50aXR5TWFuYWdlci5nZXRBbGxJZHMoKTtcbiAgICBmb3IgKGNvbnN0IHJlbEVudGl0eUlkIG9mIGFsbEVudGl0eUlkcykge1xuICAgICAgY29uc3QgcmVsRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocmVsRW50aXR5SWQpO1xuICAgICAgY29uc3QgcmVsRW50aXR5U3Vic2V0S2V5cyA9IE9iamVjdC5rZXlzKHJlbEVudGl0eS5zdWJzZXRzKTtcbiAgICAgIGZvciAoY29uc3Qgc3Vic2V0S2V5IG9mIHJlbEVudGl0eVN1YnNldEtleXMpIHtcbiAgICAgICAgY29uc3Qgc3Vic2V0ID0gcmVsRW50aXR5LnN1YnNldHNbc3Vic2V0S2V5XTtcbiAgICAgICAgLy8g7ISc67iM7IWLIO2VhOuTnOulvCDsiJztmoztlZjrqbAsIOyXlO2LsO2LsC3tlITroa0g64uo7JyE66GcIOu2hOyEne2VnCDtm4Qg7ZiE7J6sIOyXlO2LsO2LsC3tlITroa3qs7wg7J287LmY7ZWY64qUIOqyveyasCDsnbTtm4TsnZgg7ZWE65Oc66W8IOygnOyZuFxuICAgICAgICBjb25zdCBtb2RpZmllZFN1YnNldEZpZWxkcyA9IHN1YnNldFxuICAgICAgICAgIC5tYXAoKHN1YnNldEZpZWxkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhbmFseXplZCA9IHJlbEVudGl0eS5hbmFseXplU3Vic2V0RmllbGQoc3Vic2V0RmllbGQpO1xuICAgICAgICAgICAgaWYgKGFuYWx5emVkLmZpbmQoKGEpID0+IGEucHJvcE5hbWUgPT09IG9sZE5hbWUgJiYgYS5lbnRpdHlJZCA9PT0gdGhpcy5pZCkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gc3Vic2V0RmllbGQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuZmlsdGVyKG5vbk51bGxhYmxlKTtcblxuICAgICAgICBpZiAoc3Vic2V0LmpvaW4oXCIsXCIpICE9PSBtb2RpZmllZFN1YnNldEZpZWxkcy5qb2luKFwiLFwiKSkge1xuICAgICAgICAgIHJlbEVudGl0eS5zdWJzZXRzW3N1YnNldEtleV0gPSBtb2RpZmllZFN1YnNldEZpZWxkcztcbiAgICAgICAgICBlbnRpdGllcy5wdXNoKHJlbEVudGl0eSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDtmITsnqwg7JeU7Yuw7Yuw7J2YIOyduOuNseyKpOyXkOyEnCDsoJzsmbhcbiAgICBmb3IgKGNvbnN0IGluZGV4IG9mIEVudGl0eU1hbmFnZXIuZ2V0KHRoaXMuaWQpLmluZGV4ZXMpIHtcbiAgICAgIGluZGV4LmNvbHVtbnMgPSBpbmRleC5jb2x1bW5zLmZpbHRlcigoY29sKSA9PiBjb2wubmFtZSAhPT0gb2xkTmFtZSk7XG4gICAgfVxuXG4gICAgLy8g7ZSE66GtIOyCreygnFxuICAgIHRoaXMucHJvcHMuc3BsaWNlKGF0LCAxKTtcblxuICAgIGF3YWl0IFByb21pc2UuYWxsKGVudGl0aWVzLm1hcChhc3luYyAoZW50aXR5KSA9PiBlbnRpdHkuc2F2ZSgpKSk7XG4gIH1cblxuICBnZXRFbnRpdHlJZEZyb21TdWJzZXRGaWVsZChzdWJzZXRGaWVsZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoc3Vic2V0RmllbGQuaW5jbHVkZXMoXCIuXCIpID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIHRoaXMuaWQ7XG4gICAgfVxuXG4gICAgLy8g7ISc67iM7IWLIO2VhOuTnOydmCDrp4jsp4Drp4nsnYAg7ZSE66Gt7J2066+A66GcIOygnOyZuFxuICAgIGNvbnN0IGFyciA9IHN1YnNldEZpZWxkLnNwbGl0KFwiLlwiKS5zbGljZSgwLCAtMSk7XG5cbiAgICAvLyDshJzruIzshYsg7ZWE65Oc66W8IOuCtOugpOqwgOuptOyEnCDrp4jsp4Drp4nsnLzroZwgcmVsYXRpb27rkJwg7JeU7Yuw7Yuw66W8IOywvuydjFxuICAgIGNvbnN0IGxhc3RFbnRpdHlJZCA9IGFyci5yZWR1Y2UoKGVudGl0eUlkLCBmaWVsZCkgPT4ge1xuICAgICAgY29uc3QgcmVsUHJvcCA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKS5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IGZpZWxkKTtcbiAgICAgIGlmICghcmVsUHJvcCB8fCByZWxQcm9wLnR5cGUgIT09IFwicmVsYXRpb25cIikge1xuICAgICAgICBjb25zb2xlLmRlYnVnKHsgYXJyLCB0aGlzSWQ6IHRoaXMuaWQsIGVudGl0eUlkLCBmaWVsZCB9KTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDsnpjrqrvrkJwg7ISc67iM7IWL7YKkICR7c3Vic2V0RmllbGR9YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVsUHJvcC53aXRoO1xuICAgIH0sIHRoaXMuaWQpO1xuICAgIHJldHVybiBsYXN0RW50aXR5SWQ7XG4gIH1cblxuICBhc3luYyBtb3ZlUHJvcChhdDogbnVtYmVyLCB0bzogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcHJvcCA9IHRoaXMucHJvcHNbYXRdO1xuICAgIGNvbnN0IG5ld1Byb3BzID0gWy4uLnRoaXMucHJvcHNdO1xuICAgIG5ld1Byb3BzLnNwbGljZSh0bywgMCwgcHJvcCk7XG4gICAgbmV3UHJvcHMuc3BsaWNlKGF0IDwgdG8gPyBhdCA6IGF0ICsgMSwgMSk7XG4gICAgdGhpcy5wcm9wcyA9IG5ld1Byb3BzO1xuXG4gICAgYXdhaXQgdGhpcy5zYXZlKCk7XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJhc3NlcnQiLCJ3cml0ZUZpbGUiLCJpbmZsZWN0aW9uIiwicGF0aCIsImdyb3VwIiwidW5pcXVlIiwieiIsIlNvbmFtdSIsImlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wIiwiaXNFbnVtUHJvcCIsImlzSGFzTWFueVJlbGF0aW9uUHJvcCIsImlzSW50ZXJuYWxTdWJzZXRGaWVsZCIsImlzTWFueVRvTWFueVJlbGF0aW9uUHJvcCIsImlzT25lVG9PbmVSZWxhdGlvblByb3AiLCJpc1JlbGF0aW9uUHJvcCIsImlzVmlydHVhbENvZGVQcm9wIiwiaXNWaXJ0dWFsUHJvcCIsIm5vcm1hbGl6ZVN1YnNldEZpZWxkIiwiaW1wb3J0TWVtYmVycyIsImZvcm1hdENvZGUiLCJleGlzdHMiLCJydW50aW1lUGF0aCIsImFzc2VydERlZmluZWQiLCJub25OdWxsYWJsZSIsIkVudGl0eU1hbmFnZXIiLCJFbnRpdHkiLCJpZCIsInBhcmVudElkIiwidGFibGUiLCJ0aXRsZSIsIm5hbWVzIiwicHJvcHMiLCJwcm9wc0RpY3QiLCJyZWxhdGlvbnMiLCJpbmRleGVzIiwic3Vic2V0cyIsInN1YnNldHNJbnRlcm5hbCIsInR5cGVzIiwiZW51bXMiLCJlbnVtTGFiZWxzIiwidW5kZXJzY29yZSIsInBsdXJhbGl6ZSIsIm1hcCIsInByb3AiLCJpbmNsdWRlcyIsInJlcGxhY2UiLCJPYmplY3QiLCJmcm9tRW50cmllcyIsIm5hbWUiLCJmaWx0ZXIiLCJrZXkiLCJmaWVsZHMiLCJlbnRyaWVzIiwiZiIsImVudW1MYWJlbCIsImVudW0iLCJrZXlzIiwicGFyZW50RnMiLCJkYXNoZXJpemUiLCJ0b0xvd2VyQ2FzZSIsImZzIiwibW9kdWxlIiwiZ2V0U3Vic2V0RmllbGRzRm9yUXVlcnkiLCJzdWJzZXRLZXkiLCJnZXRQdXJpU3Vic2V0UXVlcnkiLCJzdWJzZXQiLCJzdWJzZXRRdWVyeSIsInJlc29sdmVTdWJzZXRRdWVyeSIsImxpbmVzIiwicHVzaCIsImpvaW4iLCJqb2lucyIsImpvaW5NZXRob2QiLCJhcyIsImN1c3RvbSIsImZyb20iLCJ0byIsInNlbGVjdE9iaiIsImJ1aWxkTmVzdGVkU2VsZWN0T2JqZWN0Iiwic2VsZWN0Iiwic3RyaW5naWZ5TmVzdGVkU2VsZWN0T2JqZWN0Iiwic2VsZWN0SXRlbXMiLCJyZXN1bHQiLCJzZWxlY3RJdGVtIiwibWF0Y2giLCJjb2x1bW4iLCJhbGlhcyIsImNvbHVtblZhbHVlIiwidHJpbSIsInNwbGl0IiwicG9wIiwicGFydHMiLCJjdXJyZW50IiwiaSIsImxlbmd0aCIsInBhcnQiLCJFcnJvciIsInNsaWNlIiwibGFzdFBhcnQiLCJvYmoiLCJpbmRlbnQiLCJ3aXRoQnJhY2VzIiwic3BhY2VzIiwicmVwZWF0IiwiaW5uZXJTcGFjZXMiLCJ2YWx1ZSIsImdldFB1cmlMb2FkZXJRdWVyeSIsImxvYWRlcnMiLCJnZW5lcmF0ZUxvYWRlckNvZGUiLCJsb2FkZXJMaW5lcyIsImxvYWRlciIsInRvVGFibGUiLCJ0b0NvbCIsInRocm91Z2giLCJtYW55Sm9pbiIsImlkRmllbGQiLCJ1bmRlZmluZWQiLCJvbmVKb2lucyIsImZvckVhY2giLCJyZWZJZCIsImZyb21Db2wiLCJnZXRTdWJzZXRRdWVyeSIsInByZWZpeCIsImlzQWxyZWFkeU91dGVySm9pbmVkIiwic3Vic2V0R3JvdXAiLCJmaWVsZCIsInJlbCIsInJlZHVjZSIsInIiLCJncm91cEtleSIsInJlYWxGaWVsZHMiLCJ2aXJ0dWFsQ29kZUZpZWxkcyIsImNvbmNhdCIsInZpcnR1YWwiLCJyZWxhdGlvbiIsInJlbEVudGl0eSIsImdldCIsIndpdGgiLCJyZWxGaWVsZHMiLCJpbm5lck9yT3V0ZXIiLCJoYXNKb2luQ29sdW1uIiwibnVsbGFibGUiLCJyZWxTdWJzZXRRdWVyeSIsImpvaW5BcyIsImZyb21UYWJsZSIsImpvaW5DbGF1c2UiLCJjdXN0b21Kb2luQ2xhdXNlIiwiY29udmVydGVkTG9hZGVycyIsIm5ld0FzIiwiZnJvbUNvbHVtbiIsImpvaW5Db2x1bW4iLCJqb2luVGFibGUiLCJzaW5ndWxhcml6ZSIsImZpZWxkRXhwcnNUb1Byb3BOb2RlcyIsImZpZWxkRXhwcnMiLCJlbnRpdHkiLCJncm91cHMiLCJmaWVsZEV4cHIiLCJlbHNlRXhwciIsImZsYXRNYXAiLCJwcm9wTmFtZSIsImZpbmQiLCJwIiwiY29uc29sZSIsImxvZyIsIm5vZGVUeXBlIiwiaWRQcm9wIiwiY2hpbGRyZW4iLCJnZXRGaWVsZEV4cHJzIiwibWF4RGVwdGgiLCJmcm9tcyIsInYiLCJyZWxNZCIsImdldFRhYmxlQ29sdW1ucyIsInR5cGUiLCJyZWxhdGlvblR5cGUiLCJnZXRWZWN0b3JDb2x1bW5zIiwiZ2V0VmVjdG9yQ29sdW1uIiwiY29sdW1uTmFtZSIsInZlY3RvclByb3BzIiwicmVnaXN0ZXJNb2R1bGVQYXRocyIsImJhc2VQYXRoIiwic2V0TW9kdWxlUGF0aCIsInRvVXBwZXJDYXNlIiwiZW51bUlkIiwidHlwZXNNb2R1bGVQYXRoIiwidHlwZXNGaWxlUGF0aCIsImFwaVJvb3RQYXRoIiwiaW1wb3J0ZWRNZW1iZXJzIiwicmVnaXN0ZXJUYWJsZVNwZWNzIiwidW5pcXVlSW5kZXhlcyIsImlkeCIsImNvbHVtbnMiLCJldmVyeSIsImNvbCIsInNldFRhYmxlU3BlYyIsInRvSnNvbiIsIm5vcm1hbEZpZWxkcyIsImludGVybmFsRmllbGRzIiwiaW50ZXJuYWwiLCJzYXZlIiwic3Vic2V0Um93cyIsImdldFN1YnNldFJvd3MiLCJzdWJzZXRSb3dzVG9TdWJzZXRGaWVsZHMiLCJqc29uUGF0aCIsImpzb24iLCJKU09OIiwic3RyaW5naWZ5IiwicmVnaXN0ZXIiLCJfc3Vic2V0cyIsIl9zdWJzZXRzSW50ZXJuYWwiLCJwcmVmaXhlcyIsInN1YnNldEtleXMiLCJhbGxGaWVsZHMiLCJhbGxJbnRlcm5hbEZpZWxkcyIsImNvbWJpbmVkRmllbGRzIiwic3RhcnRzV2l0aCIsInJlbGF0aW9uRW50aXR5IiwiaXNPcGVuIiwiaGFzIiwiY2hpbGQiLCJpc0ludGVybmFsIiwic3Vic2V0RmllbGRzIiwic29tZSIsImhhc0tleSIsInN1YnNldFJvdyIsImZsYXQiLCJjcmVhdGVQcm9wIiwiYXQiLCJzcGxpY2UiLCJhbmFseXplU3Vic2V0RmllbGQiLCJzdWJzZXRGaWVsZCIsImFyciIsImVudGl0eUlkIiwibW9kaWZ5UHJvcCIsIm5ld1Byb3AiLCJvbGROYW1lIiwiZW50aXRpZXMiLCJhbGxFbnRpdHlJZHMiLCJnZXRBbGxJZHMiLCJyZWxFbnRpdHlJZCIsInJlbEVudGl0eVN1YnNldEtleXMiLCJtb2RpZmllZFN1YnNldEZpZWxkcyIsImFuYWx5emVkIiwibW9kaWZpZWQiLCJhIiwiUHJvbWlzZSIsImFsbCIsImRlbFByb3AiLCJpbmRleCIsImdldEVudGl0eUlkRnJvbVN1YnNldEZpZWxkIiwibGFzdEVudGl0eUlkIiwicmVsUHJvcCIsImRlYnVnIiwidGhpc0lkIiwibW92ZVByb3AiLCJuZXdQcm9wcyJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsWUFBWSxTQUFTO0FBQzVCLFNBQVNDLFNBQVMsUUFBUSxtQkFBYztBQUN4QyxPQUFPQyxnQkFBZ0IsYUFBYTtBQUNwQyxPQUFPQyxVQUFVLE9BQU87QUFDeEIsU0FBU0MsS0FBSyxFQUFFQyxNQUFNLFFBQVEsVUFBVTtBQUN4QyxTQUFTQyxDQUFDLFFBQVEsTUFB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
|