sonamu 0.13.2 → 0.13.4
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/api/decorators.d.ts +2 -3
- package/dist/api/decorators.d.ts.map +1 -1
- package/dist/api/decorators.js +1 -1
- package/dist/api/sonamu.d.ts.map +1 -1
- package/dist/api/sonamu.js +5 -5
- package/dist/database/base-model.d.ts.map +1 -1
- package/dist/database/base-model.js +8 -3
- package/dist/database/puri.d.ts +8 -3
- package/dist/database/puri.d.ts.map +1 -1
- package/dist/database/puri.js +120 -15
- package/dist/database/puri.types.d.ts +5 -2
- package/dist/database/puri.types.d.ts.map +1 -1
- package/dist/database/puri.types.js +1 -1
- package/dist/dict/sonamu-dictionary.d.ts.map +1 -1
- package/dist/dict/sonamu-dictionary.js +24 -9
- package/dist/storage/buffered-file.d.ts +3 -3
- package/dist/storage/buffered-file.d.ts.map +1 -1
- package/dist/storage/buffered-file.js +2 -2
- package/dist/storage/index.d.ts +1 -1
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +1 -1
- package/dist/storage/storage-manager.d.ts +3 -4
- package/dist/storage/storage-manager.d.ts.map +1 -1
- package/dist/storage/storage-manager.js +2 -2
- package/dist/storage/types.d.ts +3 -2
- package/dist/storage/types.d.ts.map +1 -1
- package/dist/storage/uploaded-file.d.ts +3 -3
- package/dist/storage/uploaded-file.d.ts.map +1 -1
- package/dist/storage/uploaded-file.js +1 -1
- package/package.json +5 -2
- package/src/api/__tests__/sonamu.storage.test.ts +145 -0
- package/src/api/decorators.ts +2 -3
- package/src/api/sonamu.ts +6 -6
- package/src/database/__tests__/puri-hydration.test.ts +226 -0
- package/src/database/base-model.ts +7 -3
- package/src/database/puri.ts +204 -15
- package/src/database/puri.types.test-d.ts +29 -0
- package/src/database/puri.types.ts +10 -2
- package/src/dict/sonamu-dictionary.ts +28 -6
- package/src/storage/__tests__/storage-manager.test.ts +64 -0
- package/src/storage/buffered-file.ts +3 -3
- package/src/storage/index.ts +1 -1
- package/src/storage/storage-manager.ts +4 -5
- package/src/storage/storage.test-d.ts +47 -0
- package/src/storage/types.ts +3 -2
- package/src/storage/uploaded-file.ts +4 -4
package/dist/database/puri.js
CHANGED
|
@@ -6,6 +6,7 @@ import { FUZZY_OPERATORS, init_puri_types } from "./puri.types.js";
|
|
|
6
6
|
import inflection from "inflection";
|
|
7
7
|
import assert from "assert";
|
|
8
8
|
import chalk from "chalk";
|
|
9
|
+
import { randomUUID } from "node:crypto";
|
|
9
10
|
// src/database/puri.ts
|
|
10
11
|
function parseFuzzyOperator(operator) {
|
|
11
12
|
const normalized = operator?.trim() ?? "<%";
|
|
@@ -47,6 +48,52 @@ function isOrderByExpression(value) {
|
|
|
47
48
|
function isNestedSelectObject(value) {
|
|
48
49
|
return isObjectValue(value) && !("_type" in value);
|
|
49
50
|
}
|
|
51
|
+
function getSelectRelationAlias(path, correlations, identitySources) {
|
|
52
|
+
const identityAlias = identitySources.get(`${path}__id`);
|
|
53
|
+
const identityRelation = identityAlias === void 0 ? void 0 : correlations.get(identityAlias);
|
|
54
|
+
if (identityRelation?.kind === "join" && identityRelation.joinType === "leftJoin") return identityAlias;
|
|
55
|
+
const relation = correlations.get(path);
|
|
56
|
+
return relation?.kind === "join" && relation.joinType === "leftJoin" ? path : void 0;
|
|
57
|
+
}
|
|
58
|
+
function hydrateSelectResult(result, paths, correlations, presenceColumns, identitySources) {
|
|
59
|
+
if (paths.size === 0 || result === void 0) return result;
|
|
60
|
+
const hiddenColumns = new Set(presenceColumns.values());
|
|
61
|
+
const projection = /* @__PURE__ */ new Map();
|
|
62
|
+
for (const [alias, path] of paths) {
|
|
63
|
+
let parent = projection;
|
|
64
|
+
for (const key of path.slice(0, -1)) {
|
|
65
|
+
let child = parent.get(key);
|
|
66
|
+
if (!(child instanceof Map)) {
|
|
67
|
+
child = /* @__PURE__ */ new Map();
|
|
68
|
+
parent.set(key, child);
|
|
69
|
+
}
|
|
70
|
+
parent = child;
|
|
71
|
+
}
|
|
72
|
+
const leaf = path[path.length - 1];
|
|
73
|
+
assert(leaf !== void 0);
|
|
74
|
+
parent.set(leaf, alias);
|
|
75
|
+
}
|
|
76
|
+
const hydrateRow = (row) => {
|
|
77
|
+
const project = (fields, path) => {
|
|
78
|
+
const entries = [];
|
|
79
|
+
for (const [key, field] of fields) if (field instanceof Map) entries.push([key, project(field, [...path, key])]);
|
|
80
|
+
else if (Object.hasOwn(row, field)) entries.push([key, row[field]]);
|
|
81
|
+
const value = Object.fromEntries(entries);
|
|
82
|
+
const relationAlias = getSelectRelationAlias(path.join("__"), correlations, identitySources);
|
|
83
|
+
const presenceColumn = relationAlias === void 0 ? void 0 : presenceColumns.get(relationAlias);
|
|
84
|
+
if (relationAlias !== void 0 && (presenceColumn !== void 0 ? row[presenceColumn] === false : Object.hasOwn(value, "id") && value.id === null)) return null;
|
|
85
|
+
return value;
|
|
86
|
+
};
|
|
87
|
+
return {
|
|
88
|
+
...Object.fromEntries(Object.entries(row).filter(([key]) => !paths.has(key) && !hiddenColumns.has(key))),
|
|
89
|
+
...Object.fromEntries([...projection].map(([key, fields]) => {
|
|
90
|
+
assert(fields instanceof Map);
|
|
91
|
+
return [key, project(fields, [key])];
|
|
92
|
+
}))
|
|
93
|
+
};
|
|
94
|
+
};
|
|
95
|
+
return Array.isArray(result) ? result.map(hydrateRow) : hydrateRow(result);
|
|
96
|
+
}
|
|
50
97
|
var Puri, WhereGroup, JoinClauseGroup, ResolvedPuri;
|
|
51
98
|
var init_puri = __esmMin((() => {
|
|
52
99
|
init_entity_manager();
|
|
@@ -57,6 +104,8 @@ var init_puri = __esmMin((() => {
|
|
|
57
104
|
knex;
|
|
58
105
|
knexQuery;
|
|
59
106
|
tableSpec = null;
|
|
107
|
+
nestedSelectPaths = /* @__PURE__ */ new Map();
|
|
108
|
+
nestedSelectIdentitySources = /* @__PURE__ */ new Map();
|
|
60
109
|
correlationRegistry = /* @__PURE__ */ new Map();
|
|
61
110
|
constructor(knex, tableNameOrSource) {
|
|
62
111
|
this.knex = knex;
|
|
@@ -374,15 +423,22 @@ var init_puri = __esmMin((() => {
|
|
|
374
423
|
* 예: { parent: { id: "parent.id", name: "parent.name" } }
|
|
375
424
|
* → { parent__id: "parent.id", parent__name: "parent.name" }
|
|
376
425
|
*/
|
|
377
|
-
*flattenSelectEntries(selectObj,
|
|
426
|
+
*flattenSelectEntries(selectObj, path = []) {
|
|
378
427
|
for (const [key, value] of Object.entries(selectObj)) {
|
|
379
|
-
const
|
|
380
|
-
|
|
381
|
-
|
|
428
|
+
const fieldPath = [...path, key];
|
|
429
|
+
const fullKey = fieldPath.join("__");
|
|
430
|
+
if (isNestedSelectObject(value)) yield* this.flattenSelectEntries(value, fieldPath);
|
|
431
|
+
else {
|
|
432
|
+
if (fieldPath.length > 1) this.nestedSelectPaths.set(fullKey, fieldPath);
|
|
433
|
+
else this.nestedSelectPaths.delete(fullKey);
|
|
434
|
+
this.nestedSelectIdentitySources.delete(fullKey);
|
|
435
|
+
if (fieldPath.length > 1 && key === "id" && isStringValue(value) && value.includes(".")) this.nestedSelectIdentitySources.set(fullKey, value.slice(0, value.lastIndexOf(".")));
|
|
436
|
+
yield [fullKey, value];
|
|
437
|
+
}
|
|
382
438
|
}
|
|
383
439
|
}
|
|
384
|
-
flattenSelect(selectObj
|
|
385
|
-
return Object.fromEntries(this.flattenSelectEntries(selectObj
|
|
440
|
+
flattenSelect(selectObj) {
|
|
441
|
+
return Object.fromEntries(this.flattenSelectEntries(selectObj));
|
|
386
442
|
}
|
|
387
443
|
appendSelect(selectObj) {
|
|
388
444
|
const flatSelect = this.flattenSelect(selectObj);
|
|
@@ -406,6 +462,10 @@ var init_puri = __esmMin((() => {
|
|
|
406
462
|
}
|
|
407
463
|
clear(statement) {
|
|
408
464
|
this.knexQuery.clear(statement);
|
|
465
|
+
if (statement === "select" || statement === "columns") {
|
|
466
|
+
this.nestedSelectPaths.clear();
|
|
467
|
+
this.nestedSelectIdentitySources.clear();
|
|
468
|
+
}
|
|
409
469
|
if (statement === "join") this.clearJoinRegistrations();
|
|
410
470
|
return this;
|
|
411
471
|
}
|
|
@@ -778,19 +838,60 @@ var init_puri = __esmMin((() => {
|
|
|
778
838
|
else throw new Error("Invalid having arguments");
|
|
779
839
|
return this;
|
|
780
840
|
}
|
|
841
|
+
executeSelect() {
|
|
842
|
+
if (this.nestedSelectPaths.size === 0) return this.knexQuery.then();
|
|
843
|
+
const presenceColumns = /* @__PURE__ */ new Map();
|
|
844
|
+
let executable = this.knexQuery;
|
|
845
|
+
if (this.canSelectRelationPresence()) {
|
|
846
|
+
const sql = this.toQuery();
|
|
847
|
+
for (const path of this.nestedSelectPaths.values()) for (let length = 1; length < path.length; length++) {
|
|
848
|
+
const alias = getSelectRelationAlias(path.slice(0, length).join("__"), this.correlationRegistry, this.nestedSelectIdentitySources);
|
|
849
|
+
if (alias === void 0 || presenceColumns.has(alias)) continue;
|
|
850
|
+
let column;
|
|
851
|
+
do
|
|
852
|
+
column = `__sonamu_presence_${randomUUID().replaceAll("-", "")}`;
|
|
853
|
+
while (sql.includes(column));
|
|
854
|
+
if (presenceColumns.size === 0) {
|
|
855
|
+
executable = this.knexQuery.clone();
|
|
856
|
+
const timeout = this.knexQuery._timeout;
|
|
857
|
+
if (isNumberValue(timeout)) executable.timeout(timeout, { cancel: this.knexQuery._cancelOnTimeout === true });
|
|
858
|
+
const emitter = this.knexQuery;
|
|
859
|
+
const executionEmitter = executable;
|
|
860
|
+
for (const event of emitter.eventNames()) executionEmitter.on(event, (...args) => emitter.emit(event, ...args));
|
|
861
|
+
}
|
|
862
|
+
presenceColumns.set(alias, column);
|
|
863
|
+
executable.select(this.knex.raw("??.* IS DISTINCT FROM NULL AS ??", [alias, column]));
|
|
864
|
+
}
|
|
865
|
+
}
|
|
866
|
+
return executable.then((result) => hydrateSelectResult(result, this.nestedSelectPaths, this.correlationRegistry, presenceColumns, this.nestedSelectIdentitySources));
|
|
867
|
+
}
|
|
868
|
+
canSelectRelationPresence() {
|
|
869
|
+
return this.knexQuery._statements.every((statement) => {
|
|
870
|
+
if ([
|
|
871
|
+
"group",
|
|
872
|
+
"having",
|
|
873
|
+
"union"
|
|
874
|
+
].includes(statement.grouping)) return false;
|
|
875
|
+
if (statement.grouping !== "columns") return true;
|
|
876
|
+
if (statement.distinct || statement.distinctOn || statement.type) return false;
|
|
877
|
+
return statement.value.every((column) => isStringValue(column) ? !column.includes("*") : isObjectValue(column) && isStringValue(column.ref));
|
|
878
|
+
});
|
|
879
|
+
}
|
|
781
880
|
then(onfulfilled, onrejected) {
|
|
782
881
|
Naite.t("puri:executed-query", this.toQuery());
|
|
783
|
-
return this.
|
|
882
|
+
return this.executeSelect().then(onfulfilled, onrejected);
|
|
784
883
|
}
|
|
785
884
|
catch(onrejected) {
|
|
786
|
-
return this.
|
|
885
|
+
return this.then().catch(onrejected);
|
|
787
886
|
}
|
|
788
887
|
finally(onfinally) {
|
|
789
|
-
return this.
|
|
888
|
+
return this.then().finally(onfinally);
|
|
790
889
|
}
|
|
791
890
|
first() {
|
|
792
891
|
this.knexQuery.first();
|
|
793
|
-
return new ResolvedPuri(this.knexQuery, this.knex, this.tableSpec)
|
|
892
|
+
return new ResolvedPuri(this.knexQuery, this.knex, this.tableSpec, () => {
|
|
893
|
+
return this.executeSelect();
|
|
894
|
+
});
|
|
794
895
|
}
|
|
795
896
|
pluck(column) {
|
|
796
897
|
this.knexQuery.pluck(column);
|
|
@@ -849,6 +950,8 @@ var init_puri = __esmMin((() => {
|
|
|
849
950
|
const newPuri = new Puri(this.knex, "dual");
|
|
850
951
|
newPuri.knexQuery = this.knexQuery.clone();
|
|
851
952
|
newPuri.tableSpec = this.tableSpec;
|
|
953
|
+
newPuri.nestedSelectPaths = new Map(this.nestedSelectPaths);
|
|
954
|
+
newPuri.nestedSelectIdentitySources = new Map(this.nestedSelectIdentitySources);
|
|
852
955
|
newPuri.correlationRegistry = new Map(this.correlationRegistry);
|
|
853
956
|
return newPuri;
|
|
854
957
|
}
|
|
@@ -1098,10 +1201,12 @@ var init_puri = __esmMin((() => {
|
|
|
1098
1201
|
knexQuery;
|
|
1099
1202
|
knex;
|
|
1100
1203
|
tableSpec;
|
|
1101
|
-
|
|
1204
|
+
resolveResult;
|
|
1205
|
+
constructor(knexQuery, knex, tableSpec = null, resolveResult) {
|
|
1102
1206
|
this.knexQuery = knexQuery;
|
|
1103
1207
|
this.knex = knex;
|
|
1104
1208
|
this.tableSpec = tableSpec;
|
|
1209
|
+
this.resolveResult = resolveResult;
|
|
1105
1210
|
}
|
|
1106
1211
|
[Symbol.toStringTag] = "Promise";
|
|
1107
1212
|
toQuery() {
|
|
@@ -1113,13 +1218,13 @@ var init_puri = __esmMin((() => {
|
|
|
1113
1218
|
}
|
|
1114
1219
|
then(onfulfilled, onrejected) {
|
|
1115
1220
|
Naite.t("puri:executed-query", this.toQuery());
|
|
1116
|
-
return this.knexQuery.then(onfulfilled, onrejected);
|
|
1221
|
+
return (this.resolveResult ? this.resolveResult() : this.knexQuery).then(onfulfilled, onrejected);
|
|
1117
1222
|
}
|
|
1118
1223
|
catch(onrejected) {
|
|
1119
|
-
return this.
|
|
1224
|
+
return this.then().catch(onrejected);
|
|
1120
1225
|
}
|
|
1121
1226
|
finally(onfinally) {
|
|
1122
|
-
return this.
|
|
1227
|
+
return this.then().finally(onfinally);
|
|
1123
1228
|
}
|
|
1124
1229
|
onConflict(columns, action) {
|
|
1125
1230
|
const target = Array.isArray(columns) ? columns : [columns];
|
|
@@ -1147,4 +1252,4 @@ var init_puri = __esmMin((() => {
|
|
|
1147
1252
|
init_puri();
|
|
1148
1253
|
export { JoinClauseGroup, Puri, ResolvedPuri, WhereGroup, init_puri, parseFuzzyOperator };
|
|
1149
1254
|
|
|
1150
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVyaS5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0YWJhc2UvcHVyaS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBveGxpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovIC8vIFB1cmnripQg64uk7JaR7ZWcIO2DgOyeheydhCDsgqzsmqntlZjqs6Ag7J6I7Iq164uI64ukLlxuXG5pbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIjtcblxuaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xuaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCB7IHR5cGUgS25leCB9IGZyb20gXCJrbmV4XCI7XG5cbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyB0eXBlIFRhYmxlU3BlYyB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IE5haXRlIH0gZnJvbSBcIi4uL25haXRlL25haXRlXCI7XG5pbXBvcnQge1xuICBpc0Z1bmN0aW9uVmFsdWUsXG4gIGlzTnVtYmVyVmFsdWUsXG4gIGlzT2JqZWN0VmFsdWUsXG4gIGlzU3RyaW5nVmFsdWUsXG59IGZyb20gXCIuLi91dGlscy9ydW50aW1lLXZhbHVlXCI7XG5pbXBvcnQgeyB0eXBlIENsZWFyU3RhdGVtZW50cyB9IGZyb20gXCIuL3B1cmktc3Vic2V0LnR5cGVzXCI7XG5pbXBvcnQge1xuICB0eXBlIEF2YWlsYWJsZUNvbHVtbnMsXG4gIHR5cGUgQ29sdW1uS2V5cyxcbiAgdHlwZSBDb21wYXJpc29uT3BlcmF0b3IsXG4gIHR5cGUgRXhwYW5kLFxuICB0eXBlIEV4dHJhY3RDb2x1bW5UeXBlLFxuICB0eXBlIEZ1bGx0ZXh0Q29sdW1ucyxcbiAgdHlwZSBGdXp6eU9wZXJhdG9yLFxuICB0eXBlIEluc2VydERhdGEsXG4gIHR5cGUgSW5zZXJ0UmVzdWx0LFxuICB0eXBlIEpzb25Db2x1bW5zLFxuICB0eXBlIEpzb25TdXBlcnNldFZhbHVlLFxuICB0eXBlIExlZnRKb2luZWRNYXJrZXIsXG4gIHR5cGUgTGVmdEpvaW5NYXJrZXJGb3IsXG4gIHR5cGUgTnVtZXJpY0NvbHVtbnMsXG4gIHR5cGUgT25Db25mbGljdEFjdGlvbixcbiAgdHlwZSBQYXJzZVNlbGVjdE9iamVjdCxcbiAgdHlwZSBSZXN1bHRBdmFpbGFibGVDb2x1bW5zLFxuICB0eXBlIFNlbGVjdEFsbFJlc3VsdCxcbiAgdHlwZSBTZWxlY3RPYmplY3QsXG4gIHR5cGUgU2VsZWN0VmFsdWUsXG4gIHR5cGUgU2luZ2xlVGFibGVWYWx1ZSxcbiAgdHlwZSBTcWxFeHByZXNzaW9uLFxuICB0eXBlIFRzSGlnaGxpZ2h0T3B0aW9ucyxcbiAgdHlwZSBUc1F1ZXJ5Q29uZmlnLFxuICB0eXBlIFRzUXVlcnlPcHRpb25zLFxuICB0eXBlIFRzUmFua09wdGlvbnMsXG4gIHR5cGUgVmVjdG9yQ29sdW1ucyxcbiAgdHlwZSBXaGVyZUNvbmRpdGlvbixcbiAgdHlwZSBXaGVyZU9wZXJhdG9yLFxufSBmcm9tIFwiLi9wdXJpLnR5cGVzXCI7XG5pbXBvcnQgeyBGVVpaWV9PUEVSQVRPUlMgfSBmcm9tIFwiLi9wdXJpLnR5cGVzXCI7XG5cbnR5cGUgUHVyaU9yZGVyQnlEaXJlY3Rpb24gPSBcImFzY1wiIHwgXCJkZXNjXCI7XG50eXBlIFB1cmlPcmRlckJ5TnVsbHMgPSBcImZpcnN0XCIgfCBcImxhc3RcIjtcbnR5cGUgQW55U3FsRXhwcmVzc2lvbiA9IFNxbEV4cHJlc3Npb248XG4gIFwic3RyaW5nXCIgfCBcIm51bWJlclwiIHwgXCJib29sZWFuXCIgfCBcImRhdGVcIiB8IFwic3RyaW5nW11cIiB8IFwidHN2ZWN0b3JcIixcbiAgYm9vbGVhblxuPjtcbnR5cGUgU3RyaW5nU3FsRXhwcmVzc2lvbjxUTnVsbGFibGUgZXh0ZW5kcyBib29sZWFuID0gYm9vbGVhbj4gPSBTcWxFeHByZXNzaW9uPFwic3RyaW5nXCIsIFROdWxsYWJsZT47XG50eXBlIFB1cmlPcmRlckJ5RXhwcmVzc2lvbiA9IFNxbEV4cHJlc3Npb248XCJudW1iZXJcIiB8IFwic3RyaW5nXCIsIGJvb2xlYW4+O1xudHlwZSBTdHJpbmdFeHByZXNzaW9uU2VsZWN0ID0gUmVjb3JkPHN0cmluZywgU3RyaW5nU3FsRXhwcmVzc2lvbj47XG50eXBlIFN0cmluZ0V4cHJlc3Npb25TZWxlY3RSZXN1bHQ8VFNlbGVjdCBleHRlbmRzIFN0cmluZ0V4cHJlc3Npb25TZWxlY3Q+ID0ge1xuICBbSyBpbiBrZXlvZiBUU2VsZWN0XTogVFNlbGVjdFtLXSBleHRlbmRzIFNxbEV4cHJlc3Npb248XCJzdHJpbmdcIiwgaW5mZXIgVE51bGxhYmxlPlxuICAgID8gdHJ1ZSBleHRlbmRzIFROdWxsYWJsZVxuICAgICAgPyBzdHJpbmcgfCBudWxsXG4gICAgICA6IHN0cmluZ1xuICAgIDogbmV2ZXI7XG59O1xudHlwZSBQdXJpT3JkZXJCeUl0ZW08VENvbHVtbiBleHRlbmRzIHN0cmluZz4gPSB7XG4gIGNvbHVtbjogVENvbHVtbiB8IFB1cmlPcmRlckJ5RXhwcmVzc2lvbjtcbiAgb3JkZXI/OiBQdXJpT3JkZXJCeURpcmVjdGlvbjtcbiAgbnVsbHM/OiBQdXJpT3JkZXJCeU51bGxzO1xufTtcbnR5cGUgUHVyaU9yZGVyQnlFbnRyeTxUQ29sdW1uIGV4dGVuZHMgc3RyaW5nPiA9XG4gIHwgVENvbHVtblxuICB8IFB1cmlPcmRlckJ5RXhwcmVzc2lvblxuICB8IFB1cmlPcmRlckJ5SXRlbTxUQ29sdW1uPjtcbnR5cGUgUHVyaU9yZGVyQnlSdW50aW1lSXRlbSA9IHtcbiAgY29sdW1uOiBzdHJpbmcgfCBQdXJpT3JkZXJCeUV4cHJlc3Npb247XG4gIG9yZGVyPzogUHVyaU9yZGVyQnlEaXJlY3Rpb247XG4gIG51bGxzPzogUHVyaU9yZGVyQnlOdWxscztcbn07XG50eXBlIFB1cmlPcmRlckJ5UnVudGltZUVudHJ5ID0gc3RyaW5nIHwgUHVyaU9yZGVyQnlFeHByZXNzaW9uIHwgUHVyaU9yZGVyQnlSdW50aW1lSXRlbTtcblxudHlwZSBGcm9tUmVnaXN0cmF0aW9uID0ge1xuICBraW5kOiBcImZyb21cIjtcbiAgYWxpYXM6IHN0cmluZztcbiAgdGFibGU6IHN0cmluZyB8IG51bGw7XG59O1xuXG50eXBlIEpvaW5SZWdpc3RyYXRpb24gPSB7XG4gIGtpbmQ6IFwiam9pblwiO1xuICBhbGlhczogc3RyaW5nO1xuICB0YWJsZTogc3RyaW5nIHwgbnVsbDtcbiAgam9pblR5cGU6IFwiam9pblwiIHwgXCJsZWZ0Sm9pblwiO1xuICBsZWZ0OiBzdHJpbmcgfCBudWxsO1xuICByaWdodDogc3RyaW5nIHwgbnVsbDtcbiAgcmV1c2FibGU6IGJvb2xlYW47XG59O1xuXG50eXBlIENvcnJlbGF0aW9uUmVnaXN0cmF0aW9uID0gRnJvbVJlZ2lzdHJhdGlvbiB8IEpvaW5SZWdpc3RyYXRpb247XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUZ1enp5T3BlcmF0b3Iob3BlcmF0b3I/OiBzdHJpbmcpOiBGdXp6eU9wZXJhdG9yIHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IG9wZXJhdG9yPy50cmltKCkgPz8gXCI8JVwiO1xuICBjb25zdCBmdXp6eU9wZXJhdG9yID0gRlVaWllfT1BFUkFUT1JTLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlID09PSBub3JtYWxpemVkKTtcblxuICBpZiAoIWZ1enp5T3BlcmF0b3IpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZnV6enkgb3BlcmF0b3I6ICR7b3BlcmF0b3IgPz8gXCJcIn1gKTtcbiAgfVxuXG4gIHJldHVybiBmdXp6eU9wZXJhdG9yO1xufVxuXG5mdW5jdGlvbiBzZXJpYWxpemVKc29uU3VwZXJzZXRWYWx1ZTxWYWx1ZT4odmFsdWU6IFZhbHVlKTogc3RyaW5nIHtcbiAgY29uc3Qgc2VyaWFsaXplZCA9IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcblxuICBpZiAoc2VyaWFsaXplZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgIFwiUHVyaSBKU09OQiBjb250YWlubWVudCB2YWx1ZSBtdXN0IGJlIEpTT04tc2VyaWFsaXphYmxlOyBKU09OLnN0cmluZ2lmeSByZXR1cm5lZCB1bmRlZmluZWQuXCIsXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBzZXJpYWxpemVkO1xufVxuXG5mdW5jdGlvbiBzZXJpYWxpemVKc29uQ29sdW1uVmFsdWU8VmFsdWU+KFxuICB0YWJsZVNwZWM6IFRhYmxlU3BlYyB8IG51bGwsXG4gIGNvbHVtbjogc3RyaW5nLFxuICB2YWx1ZTogVmFsdWUsXG4pOiBWYWx1ZSB8IHN0cmluZyB7XG4gIGlmICghdGFibGVTcGVjPy5qc29uQ29sdW1ucy5pbmNsdWRlcyhjb2x1bW4pIHx8IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVPcmRlckJ5RGlyZWN0aW9uKGRpcmVjdGlvbjogUHVyaU9yZGVyQnlEaXJlY3Rpb24gPSBcImFzY1wiKTogUHVyaU9yZGVyQnlEaXJlY3Rpb24ge1xuICBpZiAoZGlyZWN0aW9uICE9PSBcImFzY1wiICYmIGRpcmVjdGlvbiAhPT0gXCJkZXNjXCIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgb3JkZXIgZGlyZWN0aW9uOiAke2RpcmVjdGlvbn1gKTtcbiAgfVxuXG4gIHJldHVybiBkaXJlY3Rpb247XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZU9yZGVyQnlOdWxscyhudWxscz86IFB1cmlPcmRlckJ5TnVsbHMpOiBQdXJpT3JkZXJCeU51bGxzIHwgdW5kZWZpbmVkIHtcbiAgaWYgKG51bGxzID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKG51bGxzICE9PSBcImZpcnN0XCIgJiYgbnVsbHMgIT09IFwibGFzdFwiKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIG9yZGVyIG51bGxzOiAke251bGxzfWApO1xuICB9XG5cbiAgcmV0dXJuIG51bGxzO1xufVxuXG5mdW5jdGlvbiBmb3JtYXROdWxsc1N1ZmZpeChudWxscz86IFB1cmlPcmRlckJ5TnVsbHMpOiBzdHJpbmcge1xuICBpZiAoIW51bGxzKSB7XG4gICAgcmV0dXJuIFwiXCI7XG4gIH1cblxuICByZXR1cm4gYCBOVUxMUyAke251bGxzLnRvVXBwZXJDYXNlKCl9YDtcbn1cblxuZnVuY3Rpb24gaXNPcmRlckJ5RW50cmllczxWYWx1ZT4oXG4gIHZhbHVlOiBWYWx1ZSxcbik6IHZhbHVlIGlzIFZhbHVlICYgcmVhZG9ubHkgUHVyaU9yZGVyQnlSdW50aW1lRW50cnlbXSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gaXNTcWxFeHByZXNzaW9uPFZhbHVlPih2YWx1ZTogVmFsdWUpOiB2YWx1ZSBpcyBWYWx1ZSAmIEFueVNxbEV4cHJlc3Npb24ge1xuICByZXR1cm4gaXNPYmplY3RWYWx1ZSh2YWx1ZSkgJiYgXCJfdHlwZVwiIGluIHZhbHVlICYmIHZhbHVlW1wiX3R5cGVcIl0gPT09IFwic3FsX2V4cHJlc3Npb25cIjtcbn1cblxuZnVuY3Rpb24gaXNPcmRlckJ5RXhwcmVzc2lvbjxWYWx1ZT4odmFsdWU6IFZhbHVlKTogdmFsdWUgaXMgVmFsdWUgJiBQdXJpT3JkZXJCeUV4cHJlc3Npb24ge1xuICByZXR1cm4gaXNTcWxFeHByZXNzaW9uKHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gaXNOZXN0ZWRTZWxlY3RPYmplY3Q8VFRhYmxlcyBleHRlbmRzIG9iamVjdD4oXG4gIHZhbHVlOiBTZWxlY3RWYWx1ZTxUVGFibGVzPiB8IFNlbGVjdE9iamVjdDxUVGFibGVzPixcbik6IHZhbHVlIGlzIFNlbGVjdE9iamVjdDxUVGFibGVzPiB7XG4gIHJldHVybiBpc09iamVjdFZhbHVlKHZhbHVlKSAmJiAhKFwiX3R5cGVcIiBpbiB2YWx1ZSk7XG59XG5cbmV4cG9ydCBjbGFzcyBQdXJpPFRTY2hlbWEsIFRUYWJsZXMgZXh0ZW5kcyBvYmplY3QsIFRSZXN1bHQ+IHtcbiAgcHJpdmF0ZSBrbmV4UXVlcnk6IEtuZXguUXVlcnlCdWlsZGVyO1xuICBwcml2YXRlIHRhYmxlU3BlYzogVGFibGVTcGVjIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY29ycmVsYXRpb25SZWdpc3RyeSA9IG5ldyBNYXA8c3RyaW5nLCBDb3JyZWxhdGlvblJlZ2lzdHJhdGlvbj4oKTtcblxuICAvLyDsg53shLHsnpAg7Iuc6re464uI7LKY65OkXG4gIGNvbnN0cnVjdG9yKGtuZXg6IEtuZXgsIHRhYmxlTmFtZTogc3RyaW5nKTtcbiAgY29uc3RydWN0b3Ioa25leDogS25leCwgdGFibGVTb3VyY2U6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IFB1cmk8VFNjaGVtYSwgYW55LCBhbnk+Pik7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBrbmV4OiBLbmV4LFxuICAgIHRhYmxlTmFtZU9yU291cmNlOiBhbnksXG4gICkge1xuICAgIGlmIChpc1N0cmluZ1ZhbHVlKHRhYmxlTmFtZU9yU291cmNlKSkge1xuICAgICAgLy8gQ2FzZTogbmV3IFB1cmkoa25leCwgXCJ1c2Vyc1wiKVxuICAgICAgdGhpcy5rbmV4UXVlcnkgPSB0aGlzLmtuZXgodGFibGVOYW1lT3JTb3VyY2UpLmZyb20odGFibGVOYW1lT3JTb3VyY2UpO1xuICAgICAgdGhpcy50YWJsZVNwZWMgPSB0aGlzLnNhZmVHZXRUYWJsZVNwZWModGFibGVOYW1lT3JTb3VyY2UpO1xuICAgICAgdGhpcy5jb3JyZWxhdGlvblJlZ2lzdHJ5LnNldCh0YWJsZU5hbWVPclNvdXJjZSwge1xuICAgICAgICBraW5kOiBcImZyb21cIixcbiAgICAgICAgYWxpYXM6IHRhYmxlTmFtZU9yU291cmNlLFxuICAgICAgICB0YWJsZTogdGFibGVOYW1lT3JTb3VyY2UsXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGlzT2JqZWN0VmFsdWUodGFibGVOYW1lT3JTb3VyY2UpKSB7XG4gICAgICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXModGFibGVOYW1lT3JTb3VyY2UpO1xuICAgICAgaWYgKGVudHJpZXMubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRhYmxlIHNwZWMgbXVzdCBoYXZlIGV4YWN0bHkgb25lIGVudHJ5XCIpO1xuICAgICAgfVxuICAgICAgYXNzZXJ0KGVudHJpZXNbMF0pO1xuICAgICAgY29uc3QgW2FsaWFzLCBzb3VyY2VdID0gZW50cmllc1swXTtcbiAgICAgIGlmIChpc1N0cmluZ1ZhbHVlKHNvdXJjZSkpIHtcbiAgICAgICAgdGhpcy5rbmV4UXVlcnkgPSB0aGlzLmtuZXgoc291cmNlKS5mcm9tKHsgW2FsaWFzXTogc291cmNlIH0pO1xuICAgICAgICB0aGlzLnRhYmxlU3BlYyA9IHRoaXMuc2FmZUdldFRhYmxlU3BlYyhzb3VyY2UpO1xuICAgICAgICB0aGlzLmNvcnJlbGF0aW9uUmVnaXN0cnkuc2V0KGFsaWFzLCB7IGtpbmQ6IFwiZnJvbVwiLCBhbGlhcywgdGFibGU6IHNvdXJjZSB9KTtcbiAgICAgIH0gZWxzZSBpZiAoc291cmNlIGluc3RhbmNlb2YgUHVyaSkge1xuICAgICAgICBjb25zdCBzdWJxdWVyeUJ1aWxkZXIgPSBzb3VyY2UucmF3UXVlcnkoKTtcbiAgICAgICAgdGhpcy5rbmV4UXVlcnkgPSB0aGlzLmtuZXguZnJvbShzdWJxdWVyeUJ1aWxkZXIuYXMoYWxpYXMpKTtcbiAgICAgICAgdGhpcy5jb3JyZWxhdGlvblJlZ2lzdHJ5LnNldChhbGlhcywgeyBraW5kOiBcImZyb21cIiwgYWxpYXMsIHRhYmxlOiBudWxsIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCB0YWJsZSBzcGVjaWZpY2F0aW9uXCIpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHRhYmxlIHNwZWNpZmljYXRpb25cIik7XG4gICAgfVxuICB9XG5cbiAgc2FmZUdldFRhYmxlU3BlYyh0YWJsZU5hbWU6IHN0cmluZyk6IFRhYmxlU3BlYyB8IG51bGwge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gRW50aXR5TWFuYWdlci5nZXRUYWJsZVNwZWModGFibGVOYW1lKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8vIFN0YXRpYyBTUUwgaGVscGVyIGZ1bmN0aW9ucyBmb3IgU0VMRUNUXG4gIHN0YXRpYyBjb3VudChjb2x1bW46IHN0cmluZyA9IFwiKlwiKTogU3FsRXhwcmVzc2lvbjxcIm51bWJlclwiPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICBfcmV0dXJuOiBcIm51bWJlclwiLFxuICAgICAgX3NxbDogYENPVU5UKD8/KTo6aW50ZWdlcmAsXG4gICAgICBfcGFyYW1zOiBbY29sdW1uXSxcbiAgICB9O1xuICB9XG4gIHN0YXRpYyBzdW0oY29sdW1uOiBzdHJpbmcpOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCI+IHtcbiAgICByZXR1cm4ge1xuICAgICAgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIixcbiAgICAgIF9yZXR1cm46IFwibnVtYmVyXCIsXG4gICAgICBfc3FsOiBgU1VNKD8/KWAsXG4gICAgICBfcGFyYW1zOiBbY29sdW1uXSxcbiAgICB9O1xuICB9XG4gIHN0YXRpYyBhdmcoY29sdW1uOiBzdHJpbmcpOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCI+IHtcbiAgICByZXR1cm4ge1xuICAgICAgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIixcbiAgICAgIF9yZXR1cm46IFwibnVtYmVyXCIsXG4gICAgICBfc3FsOiBgQVZHKD8/KWAsXG4gICAgICBfcGFyYW1zOiBbY29sdW1uXSxcbiAgICB9O1xuICB9XG4gIHN0YXRpYyBtYXgoY29sdW1uOiBzdHJpbmcpOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCI+IHtcbiAgICByZXR1cm4ge1xuICAgICAgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIixcbiAgICAgIF9yZXR1cm46IFwibnVtYmVyXCIsXG4gICAgICBfc3FsOiBgTUFYKD8/KWAsXG4gICAgICBfcGFyYW1zOiBbY29sdW1uXSxcbiAgICB9O1xuICB9XG4gIHN0YXRpYyBtaW4oY29sdW1uOiBzdHJpbmcpOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCI+IHtcbiAgICByZXR1cm4ge1xuICAgICAgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIixcbiAgICAgIF9yZXR1cm46IFwibnVtYmVyXCIsXG4gICAgICBfc3FsOiBgTUlOKD8/KWAsXG4gICAgICBfcGFyYW1zOiBbY29sdW1uXSxcbiAgICB9O1xuICB9XG4gIHN0YXRpYyBjb25jYXQoLi4uYXJnczogc3RyaW5nW10pOiBTcWxFeHByZXNzaW9uPFwic3RyaW5nXCI+IHtcbiAgICByZXR1cm4ge1xuICAgICAgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIixcbiAgICAgIF9yZXR1cm46IFwic3RyaW5nXCIsXG4gICAgICBfc3FsOiBgQ09OQ0FUKCR7YXJncy5tYXAoKCkgPT4gXCI/XCIpLmpvaW4oXCIsIFwiKX0pYCxcbiAgICAgIF9wYXJhbXM6IGFyZ3MsXG4gICAgfTtcbiAgfVxuICBzdGF0aWMgY29hbGVzY2UoZXhwcmVzc2lvbjogU3RyaW5nU3FsRXhwcmVzc2lvbiwgZmFsbGJhY2s6IHN0cmluZyk6IFNxbEV4cHJlc3Npb248XCJzdHJpbmdcIj4ge1xuICAgIHJldHVybiB7XG4gICAgICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLFxuICAgICAgX3JldHVybjogXCJzdHJpbmdcIixcbiAgICAgIF9zcWw6IGBDT0FMRVNDRSgke2V4cHJlc3Npb24uX3NxbH0sID8pYCxcbiAgICAgIF9wYXJhbXM6IFsuLi5leHByZXNzaW9uLl9wYXJhbXMsIGZhbGxiYWNrXSxcbiAgICB9O1xuICB9XG4gIHN0YXRpYyBjb25jYXRFeHByZXNzaW9ucyguLi5hcmdzOiAoc3RyaW5nIHwgU3RyaW5nU3FsRXhwcmVzc2lvbilbXSk6IFNxbEV4cHJlc3Npb248XCJzdHJpbmdcIj4ge1xuICAgIHJldHVybiB7XG4gICAgICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLFxuICAgICAgX3JldHVybjogXCJzdHJpbmdcIixcbiAgICAgIF9zcWw6IGBDT05DQVQoJHthcmdzLm1hcCgoYXJnKSA9PiAoaXNTdHJpbmdWYWx1ZShhcmcpID8gXCI/Ojp0ZXh0XCIgOiBhcmcuX3NxbCkpLmpvaW4oXCIsIFwiKX0pYCxcbiAgICAgIF9wYXJhbXM6IGFyZ3MuZmxhdE1hcCgoYXJnKSA9PiAoaXNTdHJpbmdWYWx1ZShhcmcpID8gW2FyZ10gOiBhcmcuX3BhcmFtcykpLFxuICAgIH07XG4gIH1cbiAgc3RhdGljIHVwcGVyKGNvbHVtbjogc3RyaW5nKTogU3FsRXhwcmVzc2lvbjxcInN0cmluZ1wiPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICBfcmV0dXJuOiBcInN0cmluZ1wiLFxuICAgICAgX3NxbDogXCJVUFBFUig/PylcIixcbiAgICAgIF9wYXJhbXM6IFtjb2x1bW5dLFxuICAgIH07XG4gIH1cbiAgc3RhdGljIGxvd2VyKGNvbHVtbjogc3RyaW5nKTogU3FsRXhwcmVzc2lvbjxcInN0cmluZ1wiPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICBfcmV0dXJuOiBcInN0cmluZ1wiLFxuICAgICAgX3NxbDogXCJMT1dFUig/PylcIixcbiAgICAgIF9wYXJhbXM6IFtjb2x1bW5dLFxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgd29yZFNpbWlsYXJpdHkoY29sdW1uOiBzdHJpbmcsIHF1ZXJ5OiBzdHJpbmcpOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCI+O1xuICBzdGF0aWMgd29yZFNpbWlsYXJpdHk8VE51bGxhYmxlIGV4dGVuZHMgYm9vbGVhbj4oXG4gICAgY29sdW1uOiBTdHJpbmdTcWxFeHByZXNzaW9uPFROdWxsYWJsZT4sXG4gICAgcXVlcnk6IHN0cmluZyxcbiAgKTogU3FsRXhwcmVzc2lvbjxcIm51bWJlclwiLCBUTnVsbGFibGU+O1xuICBzdGF0aWMgd29yZFNpbWlsYXJpdHkoXG4gICAgY29sdW1uOiBzdHJpbmcgfCBTdHJpbmdTcWxFeHByZXNzaW9uLFxuICAgIHF1ZXJ5OiBzdHJpbmcsXG4gICk6IFNxbEV4cHJlc3Npb248XCJudW1iZXJcIiwgYm9vbGVhbj4ge1xuICAgIGlmIChpc1N0cmluZ1ZhbHVlKGNvbHVtbikpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICAgIF9yZXR1cm46IFwibnVtYmVyXCIsXG4gICAgICAgIF9zcWw6IFwid29yZF9zaW1pbGFyaXR5KD8sID8/KVwiLFxuICAgICAgICBfcGFyYW1zOiBbcXVlcnksIGNvbHVtbl0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLFxuICAgICAgX3JldHVybjogXCJudW1iZXJcIixcbiAgICAgIF9zcWw6IGB3b3JkX3NpbWlsYXJpdHkoPywgJHtjb2x1bW5bXCJfc3FsXCJdfSlgLFxuICAgICAgX3BhcmFtczogW3F1ZXJ5LCAuLi5jb2x1bW5bXCJfcGFyYW1zXCJdXSxcbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIHNpbWlsYXJpdHkoY29sdW1uOiBzdHJpbmcsIHF1ZXJ5OiBzdHJpbmcpOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCI+O1xuICBzdGF0aWMgc2ltaWxhcml0eTxUTnVsbGFibGUgZXh0ZW5kcyBib29sZWFuPihcbiAgICBjb2x1bW46IFN0cmluZ1NxbEV4cHJlc3Npb248VE51bGxhYmxlPixcbiAgICBxdWVyeTogc3RyaW5nLFxuICApOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCIsIFROdWxsYWJsZT47XG4gIHN0YXRpYyBzaW1pbGFyaXR5KFxuICAgIGNvbHVtbjogc3RyaW5nIHwgU3RyaW5nU3FsRXhwcmVzc2lvbixcbiAgICBxdWVyeTogc3RyaW5nLFxuICApOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCIsIGJvb2xlYW4+IHtcbiAgICBpZiAoaXNTdHJpbmdWYWx1ZShjb2x1bW4pKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLFxuICAgICAgICBfcmV0dXJuOiBcIm51bWJlclwiLFxuICAgICAgICBfc3FsOiBcInNpbWlsYXJpdHkoPz8sID8pXCIsXG4gICAgICAgIF9wYXJhbXM6IFtjb2x1bW4sIHF1ZXJ5XSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICBfcmV0dXJuOiBcIm51bWJlclwiLFxuICAgICAgX3NxbDogYHNpbWlsYXJpdHkoJHtjb2x1bW5bXCJfc3FsXCJdfSwgPylgLFxuICAgICAgX3BhcmFtczogWy4uLmNvbHVtbltcIl9wYXJhbXNcIl0sIHF1ZXJ5XSxcbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIHN0cmljdFdvcmRTaW1pbGFyaXR5KGNvbHVtbjogc3RyaW5nLCBxdWVyeTogc3RyaW5nKTogU3FsRXhwcmVzc2lvbjxcIm51bWJlclwiPjtcbiAgc3RhdGljIHN0cmljdFdvcmRTaW1pbGFyaXR5PFROdWxsYWJsZSBleHRlbmRzIGJvb2xlYW4+KFxuICAgIGNvbHVtbjogU3RyaW5nU3FsRXhwcmVzc2lvbjxUTnVsbGFibGU+LFxuICAgIHF1ZXJ5OiBzdHJpbmcsXG4gICk6IFNxbEV4cHJlc3Npb248XCJudW1iZXJcIiwgVE51bGxhYmxlPjtcbiAgc3RhdGljIHN0cmljdFdvcmRTaW1pbGFyaXR5KFxuICAgIGNvbHVtbjogc3RyaW5nIHwgU3RyaW5nU3FsRXhwcmVzc2lvbixcbiAgICBxdWVyeTogc3RyaW5nLFxuICApOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCIsIGJvb2xlYW4+IHtcbiAgICBpZiAoaXNTdHJpbmdWYWx1ZShjb2x1bW4pKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLFxuICAgICAgICBfcmV0dXJuOiBcIm51bWJlclwiLFxuICAgICAgICBfc3FsOiBgc3RyaWN0X3dvcmRfc2ltaWxhcml0eSg/LCA/PylgLFxuICAgICAgICBfcGFyYW1zOiBbcXVlcnksIGNvbHVtbl0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLFxuICAgICAgX3JldHVybjogXCJudW1iZXJcIixcbiAgICAgIF9zcWw6IGBzdHJpY3Rfd29yZF9zaW1pbGFyaXR5KD8sICR7Y29sdW1uW1wiX3NxbFwiXX0pYCxcbiAgICAgIF9wYXJhbXM6IFtxdWVyeSwgLi4uY29sdW1uW1wiX3BhcmFtc1wiXV0sXG4gICAgfTtcbiAgfVxuXG4gIC8vIFJhdyBmdW5jdGlvbnMgZm9yIFNFTEVDVFxuICBzdGF0aWMgcmF3U3RyaW5nKHNxbDogc3RyaW5nLCBwYXJhbXM6IEtuZXguUmF3QmluZGluZ1tdID0gW10pOiBTcWxFeHByZXNzaW9uPFwic3RyaW5nXCI+IHtcbiAgICByZXR1cm4geyBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLCBfcmV0dXJuOiBcInN0cmluZ1wiLCBfc3FsOiBzcWwsIF9wYXJhbXM6IHBhcmFtcyB9O1xuICB9XG5cbiAgc3RhdGljIHJhd1N0cmluZ0FycmF5KHNxbDogc3RyaW5nLCBwYXJhbXM6IEtuZXguUmF3QmluZGluZ1tdID0gW10pOiBTcWxFeHByZXNzaW9uPFwic3RyaW5nW11cIj4ge1xuICAgIHJldHVybiB7IF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsIF9yZXR1cm46IFwic3RyaW5nW11cIiwgX3NxbDogc3FsLCBfcGFyYW1zOiBwYXJhbXMgfTtcbiAgfVxuXG4gIHN0YXRpYyByYXdOdW1iZXIoc3FsOiBzdHJpbmcsIHBhcmFtczogS25leC5SYXdCaW5kaW5nW10gPSBbXSk6IFNxbEV4cHJlc3Npb248XCJudW1iZXJcIj4ge1xuICAgIHJldHVybiB7IF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsIF9yZXR1cm46IFwibnVtYmVyXCIsIF9zcWw6IHNxbCwgX3BhcmFtczogcGFyYW1zIH07XG4gIH1cblxuICBzdGF0aWMgcmF3Qm9vbGVhbihzcWw6IHN0cmluZywgcGFyYW1zOiBLbmV4LlJhd0JpbmRpbmdbXSA9IFtdKTogU3FsRXhwcmVzc2lvbjxcImJvb2xlYW5cIj4ge1xuICAgIHJldHVybiB7IF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsIF9yZXR1cm46IFwiYm9vbGVhblwiLCBfc3FsOiBzcWwsIF9wYXJhbXM6IHBhcmFtcyB9O1xuICB9XG5cbiAgc3RhdGljIHJhd0RhdGUoc3FsOiBzdHJpbmcsIHBhcmFtczogS25leC5SYXdCaW5kaW5nW10gPSBbXSk6IFNxbEV4cHJlc3Npb248XCJkYXRlXCI+IHtcbiAgICByZXR1cm4geyBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLCBfcmV0dXJuOiBcImRhdGVcIiwgX3NxbDogc3FsLCBfcGFyYW1zOiBwYXJhbXMgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGVFMg6rKA7IOJ7Ja0IO2VmOydtOudvOydtO2MhVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAuc2VsZWN0KHtcbiAgICogICB0aXRsZTogUHVyaS5oaWdobGlnaHQoXCJwb3N0cy50aXRsZVwiLCBzZWFyY2gpLFxuICAgKiAgIGNvbnRlbnQ6IFB1cmkuaGlnaGxpZ2h0KFwicG9zdHMuY29udGVudFwiLCBzZWFyY2gsIHtcbiAgICogICAgIHN0YXJ0U2VsOiBcIjxtYXJrPlwiLFxuICAgKiAgICAgc3RvcFNlbDogXCI8L21hcms+XCIsXG4gICAqICAgICBtYXhGcmFnbWVudHM6IDMsXG4gICAqICAgfSksXG4gICAqIH0pXG4gICAqL1xuICBzdGF0aWMgdHNIaWdobGlnaHQoXG4gICAgY29sdW1uOiBzdHJpbmcsXG4gICAgcXVlcnk6IHN0cmluZyxcbiAgICBfb3B0aW9ucz86IFRzSGlnaGxpZ2h0T3B0aW9ucyxcbiAgKTogU3FsRXhwcmVzc2lvbjxcInN0cmluZ1wiPiB7XG4gICAgY29uc3QgeyBwYXJzZXIgPSBcIndlYnNlYXJjaF90b190c3F1ZXJ5XCIsIGNvbmZpZyA9IFwic2ltcGxlXCIsIC4uLm9wdGlvbnMgfSA9IF9vcHRpb25zID8/IHt9O1xuXG4gICAgY29uc3QgaGxPcHRpb25QYXJ0cyA9IE9iamVjdC5lbnRyaWVzKG9wdGlvbnMpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICByZXR1cm4gYCR7aW5mbGVjdGlvbi5jYW1lbGl6ZShrZXkpfT0ke3ZhbHVlfWA7XG4gICAgfSk7XG5cbiAgICBjb25zdCBobE9wdGlvbnMgPSBobE9wdGlvblBhcnRzLmxlbmd0aCA+IDAgPyBgLCAnJHtobE9wdGlvblBhcnRzLmpvaW4oXCIsIFwiKX0nYCA6IFwiXCI7XG5cbiAgICByZXR1cm4ge1xuICAgICAgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIixcbiAgICAgIF9yZXR1cm46IFwic3RyaW5nXCIsXG4gICAgICBfc3FsOiBgdHNfaGVhZGxpbmUoPywgPz8sICR7cGFyc2VyfSg/LCA/KSR7aGxPcHRpb25zfSlgLFxuICAgICAgX3BhcmFtczogW2NvbmZpZywgY29sdW1uLCBjb25maWcsIHF1ZXJ5XSxcbiAgICB9O1xuICB9XG5cbiAgLy8gdHNfcmFua1xuICBzdGF0aWMgdHNSYW5rKFxuICAgIGNvbHVtbjogc3RyaW5nIHwgU3FsRXhwcmVzc2lvbjxcInRzdmVjdG9yXCI+LFxuICAgIHF1ZXJ5OiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFRzUmFua09wdGlvbnMsXG4gICk6IFNxbEV4cHJlc3Npb248XCJudW1iZXJcIj4ge1xuICAgIHJldHVybiBQdXJpW1wiX3RzUmFua1wiXShcInRzX3JhbmtcIiwgY29sdW1uLCBxdWVyeSwgb3B0aW9ucyk7XG4gIH1cblxuICAvLyB0c19yYW5rX2NkXG4gIHN0YXRpYyB0c1JhbmtDZChcbiAgICBjb2x1bW46IHN0cmluZyB8IFNxbEV4cHJlc3Npb248XCJ0c3ZlY3RvclwiPixcbiAgICBxdWVyeTogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBUc1JhbmtPcHRpb25zLFxuICApOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCI+IHtcbiAgICByZXR1cm4gUHVyaVtcIl90c1JhbmtcIl0oXCJ0c19yYW5rX2NkXCIsIGNvbHVtbiwgcXVlcnksIG9wdGlvbnMpO1xuICB9XG5cbiAgc3RhdGljIHRvVHNWZWN0b3IoY29sdW1uOiBzdHJpbmcsIGNvbmZpZzogc3RyaW5nID0gXCJzaW1wbGVcIik6IFNxbEV4cHJlc3Npb248XCJ0c3ZlY3RvclwiPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICBfcmV0dXJuOiBcInRzdmVjdG9yXCIsXG4gICAgICBfc3FsOiBgdG9fdHN2ZWN0b3IoPywgPz8pYCxcbiAgICAgIF9wYXJhbXM6IFtjb25maWcsIGNvbHVtbl0sXG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBfdHNSYW5rKFxuICAgIHR5cGU6IFwidHNfcmFua1wiIHwgXCJ0c19yYW5rX2NkXCIsXG4gICAgY29sdW1uOiBzdHJpbmcgfCBTcWxFeHByZXNzaW9uPFwidHN2ZWN0b3JcIj4sXG4gICAgcXVlcnk6IHN0cmluZyxcbiAgICBvcHRpb25zPzogVHNSYW5rT3B0aW9ucyxcbiAgKTogU3FsRXhwcmVzc2lvbjxcIm51bWJlclwiPiB7XG4gICAgY29uc3Qge1xuICAgICAgcGFyc2VyID0gXCJ3ZWJzZWFyY2hfdG9fdHNxdWVyeVwiLFxuICAgICAgY29uZmlnID0gXCJzaW1wbGVcIixcbiAgICAgIG5vcm1hbGl6YXRpb24sXG4gICAgICB3ZWlnaHRzLFxuICAgIH0gPSBvcHRpb25zID8/IHt9O1xuXG4gICAgY29uc3QgcGFyYW1zID0gW107XG4gICAgbGV0IHNxbFRlbXBsYXRlID0gYCR7dHlwZX0oYDtcblxuICAgIGlmICh3ZWlnaHRzKSB7XG4gICAgICBzcWxUZW1wbGF0ZSArPSBgQVJSQVlbJHt3ZWlnaHRzLm1hcCgoKSA9PiBcIj9cIikuam9pbihcIiwgXCIpfV06OmZsb2F0NFtdLCBgO1xuICAgICAgcGFyYW1zLnB1c2goLi4ud2VpZ2h0cyk7XG4gICAgfVxuXG4gICAgaWYgKGlzU3RyaW5nVmFsdWUoY29sdW1uKSkge1xuICAgICAgc3FsVGVtcGxhdGUgKz0gYD8/LCAke3BhcnNlcn0oPywgPylgO1xuICAgICAgcGFyYW1zLnB1c2goY29sdW1uLCBjb25maWcsIHF1ZXJ5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3FsVGVtcGxhdGUgKz0gYCR7Y29sdW1uW1wiX3NxbFwiXX0sICR7cGFyc2VyfSg/LCA/KWA7XG4gICAgICBwYXJhbXMucHVzaCguLi5jb2x1bW5bXCJfcGFyYW1zXCJdLCBjb25maWcsIHF1ZXJ5KTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXphdGlvbikge1xuICAgICAgc3FsVGVtcGxhdGUgKz0gXCIsID9cIjtcbiAgICAgIHBhcmFtcy5wdXNoKG5vcm1hbGl6YXRpb24pO1xuICAgIH1cblxuICAgIHNxbFRlbXBsYXRlICs9IFwiKVwiO1xuXG4gICAgcmV0dXJuIHsgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIiwgX3JldHVybjogXCJudW1iZXJcIiwgX3NxbDogc3FsVGVtcGxhdGUsIF9wYXJhbXM6IHBhcmFtcyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFBHcm9vbmdhIEZ1bGxUZXh0IOyduOuNseyKpCDqsoDsg4kg7KCQ7IiYXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC5zZWxlY3Qoe1xuICAgKiAgIHNjb3JlOiBQdXJpLnNjb3JlKCksXG4gICAqIH0pXG4gICAqL1xuICBzdGF0aWMgc2NvcmUoKTogU3FsRXhwcmVzc2lvbjxcIm51bWJlclwiPiB7XG4gICAgcmV0dXJuIFB1cmkucmF3TnVtYmVyKFwicGdyb29uZ2Ffc2NvcmUodGFibGVvaWQsIGN0aWQpXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBHcm9vbmdhIEZ1bGxUZXh0IOyduOuNseyKpCDqsoDsg4kg7ZWY7J2065287J207YyFXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC5zZWxlY3Qoe1xuICAgKiAgIHRpdGxlOiBQdXJpLmhpZ2hsaWdodChcInBvc3RzLnRpdGxlXCIsIHNlYXJjaCksXG4gICAqIH0pXG4gICAqL1xuICBzdGF0aWMgaGlnaGxpZ2h0KGNvbHVtbjogc3RyaW5nLCBxdWVyeTogc3RyaW5nIHwgc3RyaW5nW10pOiBTcWxFeHByZXNzaW9uPFwic3RyaW5nXCI+O1xuICBzdGF0aWMgaGlnaGxpZ2h0KGNvbHVtbnM6IHN0cmluZ1tdLCBxdWVyeTogc3RyaW5nIHwgc3RyaW5nW10pOiBTcWxFeHByZXNzaW9uPFwic3RyaW5nW11cIj47XG5cbiAgc3RhdGljIGhpZ2hsaWdodChcbiAgICBjb2x1bW5PckNvbHVtbnM6IHN0cmluZyB8IHN0cmluZ1tdLFxuICAgIHF1ZXJ5OiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgKTogU3FsRXhwcmVzc2lvbjxcInN0cmluZ1wiPiB8IFNxbEV4cHJlc3Npb248XCJzdHJpbmdbXVwiPiB7XG4gICAgY29uc3QgcXVlcnlBcnIgPSBBcnJheS5pc0FycmF5KHF1ZXJ5KSA/IHF1ZXJ5IDogW3F1ZXJ5XTtcbiAgICBjb25zdCBxdWVyeUNsYXVzZSA9IGBBUlJBWVske3F1ZXJ5QXJyLm1hcCgoKSA9PiBcIj9cIikuam9pbihcIiwgXCIpfV1gO1xuXG4gICAgLy8g64uo7J28IOy7rOufvOyduCDqsr3smrBcbiAgICBpZiAoaXNTdHJpbmdWYWx1ZShjb2x1bW5PckNvbHVtbnMpKSB7XG4gICAgICByZXR1cm4gUHVyaS5yYXdTdHJpbmcoYHBncm9vbmdhX2hpZ2hsaWdodF9odG1sKD8/LCAke3F1ZXJ5Q2xhdXNlfSlgLCBbXG4gICAgICAgIGNvbHVtbk9yQ29sdW1ucyxcbiAgICAgICAgLi4ucXVlcnlBcnIsXG4gICAgICBdKTtcbiAgICB9XG5cbiAgICAvLyDsu6zrn7wg67Cw7Je07J24IOqyveyasFxuICAgIHJldHVybiBQdXJpLnJhd1N0cmluZ0FycmF5KFxuICAgICAgYHBncm9vbmdhX2hpZ2hsaWdodF9odG1sKEFSUkFZWyR7Y29sdW1uT3JDb2x1bW5zLm1hcCgoKSA9PiBcIj8/XCIpLmpvaW4oXCIsIFwiKX1dLCAke3F1ZXJ5Q2xhdXNlfSlgLFxuICAgICAgWy4uLmNvbHVtbk9yQ29sdW1ucywgLi4ucXVlcnlBcnJdLFxuICAgICk7XG4gIH1cblxuICBqc29uVGV4dChcbiAgICBjb2x1bW46IEpzb25Db2x1bW5zPFRUYWJsZXM+LFxuICAgIC4uLnBhdGg6IFtzdHJpbmcsIC4uLnN0cmluZ1tdXVxuICApOiBTcWxFeHByZXNzaW9uPFwic3RyaW5nXCIsIHRydWU+IHtcbiAgICByZXR1cm4ge1xuICAgICAgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIixcbiAgICAgIF9yZXR1cm46IFwic3RyaW5nXCIsXG4gICAgICBfc3FsOiBgPz8gIz4+IEFSUkFZWyR7cGF0aC5tYXAoKCkgPT4gXCI/XCIpLmpvaW4oXCIsIFwiKX1dYCxcbiAgICAgIF9wYXJhbXM6IFtjb2x1bW4sIC4uLnBhdGhdLFxuICAgIH07XG4gIH1cblxuICAvLyBTRUxFQ1QgKG92ZXJ3cml0ZSlcbiAgc2VsZWN0PFRTZWxlY3QgZXh0ZW5kcyBTdHJpbmdFeHByZXNzaW9uU2VsZWN0PihcbiAgICBzZWxlY3RPYmo6IFRTZWxlY3QsXG4gICk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcywgU3RyaW5nRXhwcmVzc2lvblNlbGVjdFJlc3VsdDxUU2VsZWN0Pj47XG4gIHNlbGVjdDxUU2VsZWN0IGV4dGVuZHMgU2VsZWN0T2JqZWN0PFRUYWJsZXM+PihcbiAgICBzZWxlY3RPYmo6IFRTZWxlY3QsXG4gICk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcywgUGFyc2VTZWxlY3RPYmplY3Q8VFRhYmxlcywgVFNlbGVjdD4+O1xuICBzZWxlY3Qoc2VsZWN0T2JqOiBTZWxlY3RPYmplY3Q8VFRhYmxlcz4pOiBQdXJpPFRTY2hlbWEsIFRUYWJsZXMsIGFueT4ge1xuICAgIC8vIOykkeyyqSDqsJ3ssrTrpbwgZmxhdO2VmOqyjCDrs4DtmZhcbiAgICBjb25zdCBmbGF0U2VsZWN0ID0gdGhpcy5mbGF0dGVuU2VsZWN0KHNlbGVjdE9iaik7XG5cbiAgICBjb25zdCBzZWxlY3RDbGF1c2VzOiAoc3RyaW5nIHwgS25leC5SYXcpW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgW2FsaWFzLCBjb2x1bW5PckZ1bmN0aW9uXSBvZiBPYmplY3QuZW50cmllcyhmbGF0U2VsZWN0KSkge1xuICAgICAgaWYgKGlzU3FsRXhwcmVzc2lvbihjb2x1bW5PckZ1bmN0aW9uKSkge1xuICAgICAgICAvLyBTUUwg7ZWo7IiY7J24IOqyveyasFxuICAgICAgICBzZWxlY3RDbGF1c2VzLnB1c2goXG4gICAgICAgICAgdGhpcy5rbmV4LnJhdyhgJHtjb2x1bW5PckZ1bmN0aW9uW1wiX3NxbFwiXX0gQVMgXCIke2FsaWFzfVwiYCwgY29sdW1uT3JGdW5jdGlvbltcIl9wYXJhbXNcIl0pLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8g7J2867CYIOy7rOufvOyduCDqsr3smrBcbiAgICAgICAgLy8gU0FGRVRZOiDsv7zrpqwg67mM642U7J2YIOygnOuEpOumrSDqs4Tslb3qs7wg7ISg7ZaJIOqygOymneydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAgICAgY29uc3QgY29sdW1uUGF0aCA9IGNvbHVtbk9yRnVuY3Rpb24gYXMgc3RyaW5nO1xuICAgICAgICBpZiAoYWxpYXMgPT09IGNvbHVtblBhdGgpIHtcbiAgICAgICAgICAvLyBhbGlhc+yZgCDsu6zrn7zrqoXsnbQg6rCZ7Jy866m0IGFsaWFzIOyDneuetVxuICAgICAgICAgIHNlbGVjdENsYXVzZXMucHVzaChjb2x1bW5QYXRoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBhbGlhcyDsp4DsoJVcbiAgICAgICAgICBzZWxlY3RDbGF1c2VzLnB1c2goYCR7Y29sdW1uUGF0aH0gQVMgJHthbGlhc31gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMua25leFF1ZXJ5LnNlbGVjdChzZWxlY3RDbGF1c2VzKTtcbiAgICAvLyBTQUZFVFk6IOy/vOumrCDruYzrjZTsnZgg7KCc64Sk66atIOqzhOyVveqzvCDshKDtlokg6rKA7Kad7J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgIHJldHVybiB0aGlzIGFzIGFueTtcbiAgfVxuXG4gIC8qKlxuICAgKiDspJHssqkg6rCd7LK066W8IGZsYXQg6rCd7LK066GcIOuzgO2ZmFxuICAgKiDsmIg6IHsgcGFyZW50OiB7IGlkOiBcInBhcmVudC5pZFwiLCBuYW1lOiBcInBhcmVudC5uYW1lXCIgfSB9XG4gICAqICAg4oaSIHsgcGFyZW50X19pZDogXCJwYXJlbnQuaWRcIiwgcGFyZW50X19uYW1lOiBcInBhcmVudC5uYW1lXCIgfVxuICAgKi9cbiAgcHJpdmF0ZSAqZmxhdHRlblNlbGVjdEVudHJpZXMoXG4gICAgc2VsZWN0T2JqOiBTZWxlY3RPYmplY3Q8VFRhYmxlcz4sXG4gICAgcHJlZml4ID0gXCJcIixcbiAgKTogR2VuZXJhdG9yPFtzdHJpbmcsIFNlbGVjdFZhbHVlPFRUYWJsZXM+XSwgdm9pZD4ge1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHNlbGVjdE9iaikpIHtcbiAgICAgIGNvbnN0IGZ1bGxLZXkgPSBwcmVmaXggPyBgJHtwcmVmaXh9X18ke2tleX1gIDoga2V5O1xuXG4gICAgICBpZiAoaXNOZXN0ZWRTZWxlY3RPYmplY3QodmFsdWUpKSB7XG4gICAgICAgIHlpZWxkKiB0aGlzLmZsYXR0ZW5TZWxlY3RFbnRyaWVzKHZhbHVlLCBmdWxsS2V5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHlpZWxkIFtmdWxsS2V5LCB2YWx1ZV07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmbGF0dGVuU2VsZWN0KHNlbGVjdE9iajogU2VsZWN0T2JqZWN0PFRUYWJsZXM+LCBwcmVmaXggPSBcIlwiKSB7XG4gICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyh0aGlzLmZsYXR0ZW5TZWxlY3RFbnRyaWVzKHNlbGVjdE9iaiwgcHJlZml4KSk7XG4gIH1cblxuICAvLyBTRUxFQ1QgKHNlbGVjdOuKlCBvdmVyd3JpdGUsIGFwcGVuZFNlbGVjdOuKlCBhcHBlbmQpXG4gIGFwcGVuZFNlbGVjdDxUU2VsZWN0IGV4dGVuZHMgU2VsZWN0T2JqZWN0PFRUYWJsZXM+PihcbiAgICBzZWxlY3RPYmo6IFRTZWxlY3QsXG4gICk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcywgVFJlc3VsdCAmIFBhcnNlU2VsZWN0T2JqZWN0PFRUYWJsZXMsIFRTZWxlY3Q+PiB7XG4gICAgLy8g7KSR7LKpIOqwneyytOulvCBmbGF07ZWY6rKMIOuzgO2ZmFxuICAgIGNvbnN0IGZsYXRTZWxlY3QgPSB0aGlzLmZsYXR0ZW5TZWxlY3Qoc2VsZWN0T2JqKTtcblxuICAgIGNvbnN0IHNlbGVjdENsYXVzZXM6IChzdHJpbmcgfCBLbmV4LlJhdylbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBbYWxpYXMsIGNvbHVtbk9yRnVuY3Rpb25dIG9mIE9iamVjdC5lbnRyaWVzKGZsYXRTZWxlY3QpKSB7XG4gICAgICBpZiAoaXNTcWxFeHByZXNzaW9uKGNvbHVtbk9yRnVuY3Rpb24pKSB7XG4gICAgICAgIHNlbGVjdENsYXVzZXMucHVzaChcbiAgICAgICAgICB0aGlzLmtuZXgucmF3KGAke2NvbHVtbk9yRnVuY3Rpb25bXCJfc3FsXCJdfSBBUyAke2FsaWFzfWAsIGNvbHVtbk9yRnVuY3Rpb25bXCJfcGFyYW1zXCJdKSxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFNBRkVUWTog7L+866asIOu5jOuNlOydmCDsoJzrhKTrpq0g6rOE7JW96rO8IOyEoO2WiSDqsoDspp3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgICAgIGNvbnN0IGNvbHVtblBhdGggPSBjb2x1bW5PckZ1bmN0aW9uIGFzIHN0cmluZztcbiAgICAgICAgaWYgKGFsaWFzID09PSBjb2x1bW5QYXRoKSB7XG4gICAgICAgICAgc2VsZWN0Q2xhdXNlcy5wdXNoKGNvbHVtblBhdGgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlbGVjdENsYXVzZXMucHVzaCh0aGlzLmtuZXgucmVmKGNvbHVtblBhdGgpLmFzKGFsaWFzKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmtuZXhRdWVyeS5zZWxlY3Qoc2VsZWN0Q2xhdXNlcyk7XG4gICAgLy8gU0FGRVRZOiDsv7zrpqwg67mM642U7J2YIOygnOuEpOumrSDqs4Tslb3qs7wg7ISg7ZaJIOqygOymneydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICByZXR1cm4gdGhpcyBhcyBhbnk7XG4gIH1cblxuICAvLyBTRUxFQ1QgKlxuICBzZWxlY3RBbGwoKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzLCBTZWxlY3RBbGxSZXN1bHQ8VFRhYmxlcz4+IHtcbiAgICB0aGlzLmtuZXhRdWVyeS5zZWxlY3QoXCIqXCIpO1xuICAgIC8vIFNBRkVUWTog7L+866asIOu5jOuNlOydmCDsoJzrhKTrpq0g6rOE7JW96rO8IOyEoO2WiSDqsoDspp3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgcmV0dXJuIHRoaXMgYXMgYW55O1xuICB9XG5cbiAgLy8gRElTVElOQ1RcbiAgZGlzdGluY3Q8VENvbHVtbnMgZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PiguLi5jb2x1bW5zOiBUQ29sdW1uc1tdKTogdGhpcztcbiAgZGlzdGluY3QoLi4uY29sdW1uczogc3RyaW5nW10pOiB0aGlzIHtcbiAgICB0aGlzLmtuZXhRdWVyeS5kaXN0aW5jdCguLi5jb2x1bW5zKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIENMRUFSXG4gIGNsZWFyKHN0YXRlbWVudDogQ2xlYXJTdGF0ZW1lbnRzKTogdGhpcyB7XG4gICAgdGhpcy5rbmV4UXVlcnkuY2xlYXIoc3RhdGVtZW50KTtcbiAgICBpZiAoc3RhdGVtZW50ID09PSBcImpvaW5cIikge1xuICAgICAgdGhpcy5jbGVhckpvaW5SZWdpc3RyYXRpb25zKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8ga25leOyXkCDsl4bslrTshJwg7KeB7KCRIOq1rO2YhO2VqFxuICBjbGVhckpvaW4oYWxpYXM6IHN0cmluZyk6IHRoaXMge1xuICAgIGxldCByZW1vdmVkID0gZmFsc2U7XG4gICAgLy8gU0FGRVRZOiDsv7zrpqwg67mM642U7J2YIOygnOuEpOumrSDqs4Tslb3qs7wg7ISg7ZaJIOqygOymneydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAodGhpcy5rbmV4UXVlcnkgYXMgYW55KVtcIl9zdGF0ZW1lbnRzXCJdID0gKHRoaXMua25leFF1ZXJ5IGFzIGFueSlbXCJfc3RhdGVtZW50c1wiXS5maWx0ZXIoXG4gICAgICAoczogYW55KSA9PiB7XG4gICAgICAgIGlmIChcImpvaW5UeXBlXCIgaW4gcykge1xuICAgICAgICAgIGNvbnN0IHNob3VsZFJlbW92ZSA9IHRoaXMuZ2V0S25leEpvaW5BbGlhcyhzLnRhYmxlKSA9PT0gYWxpYXM7XG4gICAgICAgICAgcmVtb3ZlZCB8fD0gc2hvdWxkUmVtb3ZlO1xuICAgICAgICAgIHJldHVybiAhc2hvdWxkUmVtb3ZlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICk7XG4gICAgaWYgKHJlbW92ZWQgJiYgdGhpcy5jb3JyZWxhdGlvblJlZ2lzdHJ5LmdldChhbGlhcyk/LmtpbmQgPT09IFwiam9pblwiKSB7XG4gICAgICB0aGlzLmNvcnJlbGF0aW9uUmVnaXN0cnkuZGVsZXRlKGFsaWFzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBKT0lOOiDshJzruIzsv7zrpqwgKyBBbGlhc1xuICBqb2luPFRKb2luQWxpYXMgZXh0ZW5kcyBzdHJpbmcsIFRTdWJSZXN1bHQ+KFxuICAgIHRhYmxlU3BlYzogeyBbSyBpbiBUSm9pbkFsaWFzXTogUHVyaTxUU2NoZW1hLCBhbnksIFRTdWJSZXN1bHQ+IH0sXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPixcbiAgICByaWdodDogYCR7VEpvaW5BbGlhc30uJHtDb2x1bW5LZXlzPFRTdWJSZXN1bHQ+fWAsXG4gICk6IFB1cmk8XG4gICAgVFNjaGVtYSxcbiAgICBUVGFibGVzICYgUmVjb3JkPFRKb2luQWxpYXMsIFRTdWJSZXN1bHQ+LCAvLyDshJzruIzsv7zrpqzsnZggVFJlc3VsdFxuICAgIFRSZXN1bHRcbiAgPjtcbiAgLy8gSk9JTjog7YWM7J2067iUICsgQWxpYXNcbiAgam9pbjxUSm9pblRhYmxlIGV4dGVuZHMga2V5b2YgVFNjaGVtYSwgVEpvaW5BbGlhcyBleHRlbmRzIHN0cmluZz4oXG4gICAgdGFibGVTcGVjOiB7IFtLIGluIFRKb2luQWxpYXNdOiBUSm9pblRhYmxlIH0sXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPixcbiAgICByaWdodDogYCR7VEpvaW5BbGlhc30uJHtDb2x1bW5LZXlzPFRTY2hlbWFbVEpvaW5UYWJsZV0+fWAsXG4gICk6IFB1cmk8XG4gICAgVFNjaGVtYSxcbiAgICBUVGFibGVzICYgUmVjb3JkPFRKb2luQWxpYXMsIFRTY2hlbWFbVEpvaW5UYWJsZV0+LCAvLyBUVGFibGVzIO2ZleyepSFcbiAgICBUUmVzdWx0XG4gID47XG4gIC8vIEpPSU46IO2FjOydtOu4lOuqhVxuICBqb2luPFRKb2luVGFibGUgZXh0ZW5kcyBrZXlvZiBUU2NoZW1hPihcbiAgICB0YWJsZU5hbWU6IFRKb2luVGFibGUsXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPixcbiAgICByaWdodDogYCR7VEpvaW5UYWJsZSAmIHN0cmluZ30uJHtDb2x1bW5LZXlzPFRTY2hlbWFbVEpvaW5UYWJsZV0+fWAsXG4gICk6IFB1cmk8XG4gICAgVFNjaGVtYSxcbiAgICBUVGFibGVzICYgUmVjb3JkPFRKb2luVGFibGUsIFRTY2hlbWFbVEpvaW5UYWJsZV0+LCAvLyDthYzsnbTruJTrqoXsnbQg7YKkXG4gICAgVFJlc3VsdFxuICA+O1xuICAvLyBKT0lOOiDshJzruIzsv7zrpqwgKyBBbGlhcyArIOy9nOuwsVxuICBqb2luPFRKb2luQWxpYXMgZXh0ZW5kcyBzdHJpbmcsIFRTdWJSZXN1bHQ+KFxuICAgIHRhYmxlU3BlYzogeyBbSyBpbiBUSm9pbkFsaWFzXTogUHVyaTxUU2NoZW1hLCBhbnksIFRTdWJSZXN1bHQ+IH0sXG4gICAgY2FsbGJhY2s6IChqOiBKb2luQ2xhdXNlR3JvdXA8VFRhYmxlcywgUmVjb3JkPFRKb2luQWxpYXMsIFRTdWJSZXN1bHQ+PikgPT4gdm9pZCxcbiAgKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzICYgUmVjb3JkPFRKb2luQWxpYXMsIFRTdWJSZXN1bHQ+LCBUUmVzdWx0PjtcbiAgLy8gSk9JTjog7YWM7J2067iUICsgQWxpYXMgKyDsvZzrsLFcbiAgam9pbjxUSm9pblRhYmxlIGV4dGVuZHMga2V5b2YgVFNjaGVtYSwgVEpvaW5BbGlhcyBleHRlbmRzIHN0cmluZz4oXG4gICAgdGFibGVTcGVjOiB7IFtLIGluIFRKb2luQWxpYXNdOiBUSm9pblRhYmxlIH0sXG4gICAgY2FsbGJhY2s6IChqOiBKb2luQ2xhdXNlR3JvdXA8VFRhYmxlcywgUmVjb3JkPFRKb2luQWxpYXMsIFRTY2hlbWFbVEpvaW5UYWJsZV0+PikgPT4gdm9pZCxcbiAgKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzICYgUmVjb3JkPFRKb2luQWxpYXMsIFRTY2hlbWFbVEpvaW5UYWJsZV0+LCBUUmVzdWx0PjtcbiAgLy8gSk9JTjog7YWM7J2067iU66qFICsg7L2c67CxXG4gIGpvaW48VEpvaW5UYWJsZSBleHRlbmRzIGtleW9mIFRTY2hlbWE+KFxuICAgIHRhYmxlTmFtZTogVEpvaW5UYWJsZSxcbiAgICBjYWxsYmFjazogKGo6IEpvaW5DbGF1c2VHcm91cDxUVGFibGVzLCBSZWNvcmQ8VEpvaW5UYWJsZSwgVFNjaGVtYVtUSm9pblRhYmxlXT4+KSA9PiB2b2lkLFxuICApOiBQdXJpPFRTY2hlbWEsIFRUYWJsZXMgJiBSZWNvcmQ8VEpvaW5UYWJsZSwgVFNjaGVtYVtUSm9pblRhYmxlXT4sIFRSZXN1bHQ+O1xuICAvLyBKT0lOIOyLpOygnCDqtaztmIRcbiAgam9pbih0YWJsZU5hbWVPclNwZWM6IGFueSwgLi4uYXJnczogYW55W10pOiBhbnkge1xuICAgIHJldHVybiB0aGlzW1wiX19jb21tb25Kb2luXCJdKFwiam9pblwiLCB0YWJsZU5hbWVPclNwZWMsIC4uLmFyZ3MpO1xuICB9XG5cbiAgLy8gRU5TVVJFIEpPSU46IO2FjOydtOu4lCArIEFsaWFzXG4gIGVuc3VyZUpvaW48VEpvaW5UYWJsZSBleHRlbmRzIGtleW9mIFRTY2hlbWEsIFRKb2luQWxpYXMgZXh0ZW5kcyBzdHJpbmc+KFxuICAgIHRhYmxlU3BlYzogeyBbSyBpbiBUSm9pbkFsaWFzXTogVEpvaW5UYWJsZSB9LFxuICAgIGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4sXG4gICAgcmlnaHQ6IGAke1RKb2luQWxpYXN9LiR7Q29sdW1uS2V5czxUU2NoZW1hW1RKb2luVGFibGVdPn1gLFxuICApOiBQdXJpPFRTY2hlbWEsIFRUYWJsZXMgJiBSZWNvcmQ8VEpvaW5BbGlhcywgVFNjaGVtYVtUSm9pblRhYmxlXT4sIFRSZXN1bHQ+O1xuICAvLyBFTlNVUkUgSk9JTjog7YWM7J2067iU66qFXG4gIGVuc3VyZUpvaW48VEpvaW5UYWJsZSBleHRlbmRzIGtleW9mIFRTY2hlbWE+KFxuICAgIHRhYmxlTmFtZTogVEpvaW5UYWJsZSxcbiAgICBsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+LFxuICAgIHJpZ2h0OiBgJHtUSm9pblRhYmxlICYgc3RyaW5nfS4ke0NvbHVtbktleXM8VFNjaGVtYVtUSm9pblRhYmxlXT59YCxcbiAgKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzICYgUmVjb3JkPFRKb2luVGFibGUsIFRTY2hlbWFbVEpvaW5UYWJsZV0+LCBUUmVzdWx0PjtcbiAgZW5zdXJlSm9pbih0YWJsZU5hbWVPclNwZWM6IGFueSwgbGVmdDogc3RyaW5nLCByaWdodDogc3RyaW5nKTogYW55IHtcbiAgICByZXR1cm4gdGhpc1tcIl9fZW5zdXJlSm9pblwiXShcImpvaW5cIiwgdGFibGVOYW1lT3JTcGVjLCBsZWZ0LCByaWdodCk7XG4gIH1cblxuICAvLyBMRUZUIEpPSU46IOyEnOu4jOy/vOumrCArIEFsaWFzXG4gIGxlZnRKb2luPFRKb2luQWxpYXMgZXh0ZW5kcyBzdHJpbmcsIFRTdWJSZXN1bHQ+KFxuICAgIHRhYmxlU3BlYzogeyBbSyBpbiBUSm9pbkFsaWFzXTogUHVyaTxUU2NoZW1hLCBhbnksIFRTdWJSZXN1bHQ+IH0sXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPixcbiAgICByaWdodDogYCR7VEpvaW5BbGlhc30uJHtDb2x1bW5LZXlzPFRTdWJSZXN1bHQ+fWAsXG4gICk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcyAmIFJlY29yZDxUSm9pbkFsaWFzLCBUU3ViUmVzdWx0ICYgTGVmdEpvaW5lZE1hcmtlcj4sIFRSZXN1bHQ+OyAvLyDshJzruIzsv7zrpqzsnZggVFJlc3VsdFxuICAvLyBMRUZUIEpPSU46IO2FjOydtOu4lCArIEFsaWFzXG4gIC8vIEZLIG51bGxhYmxlIOyXrOu2gOyXkCDrlLDrnbwg7J6Q64+Z7Jy866GcIExlZnRKb2luZWRNYXJrZXIg6rKw7KCVXG4gIGxlZnRKb2luPFxuICAgIFRKb2luVGFibGUgZXh0ZW5kcyBrZXlvZiBUU2NoZW1hLFxuICAgIFRKb2luQWxpYXMgZXh0ZW5kcyBzdHJpbmcsXG4gICAgVExlZnQgZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+LFxuICA+KFxuICAgIHRhYmxlU3BlYzogeyBbSyBpbiBUSm9pbkFsaWFzXTogVEpvaW5UYWJsZSB9LFxuICAgIGxlZnQ6IFRMZWZ0LFxuICAgIHJpZ2h0OiBgJHtUSm9pbkFsaWFzfS4ke0NvbHVtbktleXM8VFNjaGVtYVtUSm9pblRhYmxlXT59YCxcbiAgKTogUHVyaTxcbiAgICBUU2NoZW1hLFxuICAgIFRUYWJsZXMgJiBSZWNvcmQ8VEpvaW5BbGlhcywgVFNjaGVtYVtUSm9pblRhYmxlXSAmIExlZnRKb2luTWFya2VyRm9yPFRUYWJsZXMsIFRMZWZ0Pj4sXG4gICAgVFJlc3VsdFxuICA+O1xuICAvLyBMRUZUIEpPSU46IO2FjOydtOu4lOuqhVxuICBsZWZ0Sm9pbjxUSm9pblRhYmxlIGV4dGVuZHMga2V5b2YgVFNjaGVtYSwgVExlZnQgZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PihcbiAgICB0YWJsZU5hbWU6IFRKb2luVGFibGUsXG4gICAgbGVmdDogVExlZnQsXG4gICAgcmlnaHQ6IGAke1RKb2luVGFibGUgJiBzdHJpbmd9LiR7Q29sdW1uS2V5czxUU2NoZW1hW1RKb2luVGFibGVdPn1gLFxuICApOiBQdXJpPFxuICAgIFRTY2hlbWEsXG4gICAgVFRhYmxlcyAmIFJlY29yZDxUSm9pblRhYmxlLCBUU2NoZW1hW1RKb2luVGFibGVdICYgTGVmdEpvaW5NYXJrZXJGb3I8VFRhYmxlcywgVExlZnQ+PixcbiAgICBUUmVzdWx0XG4gID47XG4gIC8vIExFRlQgSk9JTjog7ISc67iM7L+866asICsgQWxpYXMgKyDsvZzrsLFcbiAgbGVmdEpvaW48VEpvaW5BbGlhcyBleHRlbmRzIHN0cmluZywgVFN1YlJlc3VsdD4oXG4gICAgdGFibGVTcGVjOiB7IFtLIGluIFRKb2luQWxpYXNdOiBQdXJpPFRTY2hlbWEsIGFueSwgVFN1YlJlc3VsdD4gfSxcbiAgICBjYWxsYmFjazogKGo6IEpvaW5DbGF1c2VHcm91cDxUVGFibGVzLCBSZWNvcmQ8VEpvaW5BbGlhcywgVFN1YlJlc3VsdD4+KSA9PiB2b2lkLFxuICApOiBQdXJpPFRTY2hlbWEsIFRUYWJsZXMgJiBSZWNvcmQ8VEpvaW5BbGlhcywgVFN1YlJlc3VsdCAmIExlZnRKb2luZWRNYXJrZXI+LCBUUmVzdWx0PjtcbiAgLy8gTEVGVCBKT0lOOiDthYzsnbTruJQgKyBBbGlhcyArIOy9nOuwsVxuICBsZWZ0Sm9pbjxUSm9pblRhYmxlIGV4dGVuZHMga2V5b2YgVFNjaGVtYSwgVEpvaW5BbGlhcyBleHRlbmRzIHN0cmluZz4oXG4gICAgdGFibGVTcGVjOiB7IFtLIGluIFRKb2luQWxpYXNdOiBUSm9pblRhYmxlIH0sXG4gICAgY2FsbGJhY2s6IChqOiBKb2luQ2xhdXNlR3JvdXA8VFRhYmxlcywgUmVjb3JkPFRKb2luQWxpYXMsIFRTY2hlbWFbVEpvaW5UYWJsZV0+PikgPT4gdm9pZCxcbiAgKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzICYgUmVjb3JkPFRKb2luQWxpYXMsIFRTY2hlbWFbVEpvaW5UYWJsZV0gJiBMZWZ0Sm9pbmVkTWFya2VyPiwgVFJlc3VsdD47XG4gIC8vIExFRlQgSk9JTjog7YWM7J2067iU66qFICsg7L2c67CxXG4gIGxlZnRKb2luPFRKb2luVGFibGUgZXh0ZW5kcyBrZXlvZiBUU2NoZW1hPihcbiAgICB0YWJsZU5hbWU6IFRKb2luVGFibGUsXG4gICAgY2FsbGJhY2s6IChqOiBKb2luQ2xhdXNlR3JvdXA8VFRhYmxlcywgUmVjb3JkPFRKb2luVGFibGUsIFRTY2hlbWFbVEpvaW5UYWJsZV0+PikgPT4gdm9pZCxcbiAgKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzICYgUmVjb3JkPFRKb2luVGFibGUsIFRTY2hlbWFbVEpvaW5UYWJsZV0gJiBMZWZ0Sm9pbmVkTWFya2VyPiwgVFJlc3VsdD47XG4gIC8vIExFRlQgSk9JTiDsi6TsoJwg6rWs7ZiEXG4gIGxlZnRKb2luKHRhYmxlTmFtZU9yU3BlYzogYW55LCAuLi5hcmdzOiBhbnlbXSk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXNbXCJfX2NvbW1vbkpvaW5cIl0oXCJsZWZ0Sm9pblwiLCB0YWJsZU5hbWVPclNwZWMsIC4uLmFyZ3MpO1xuICB9XG5cbiAgLy8gRU5TVVJFIExFRlQgSk9JTjog7YWM7J2067iUICsgQWxpYXNcbiAgZW5zdXJlTGVmdEpvaW48XG4gICAgVEpvaW5UYWJsZSBleHRlbmRzIGtleW9mIFRTY2hlbWEsXG4gICAgVEpvaW5BbGlhcyBleHRlbmRzIHN0cmluZyxcbiAgICBUTGVmdCBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4sXG4gID4oXG4gICAgdGFibGVTcGVjOiB7IFtLIGluIFRKb2luQWxpYXNdOiBUSm9pblRhYmxlIH0sXG4gICAgbGVmdDogVExlZnQsXG4gICAgcmlnaHQ6IGAke1RKb2luQWxpYXN9LiR7Q29sdW1uS2V5czxUU2NoZW1hW1RKb2luVGFibGVdPn1gLFxuICApOiBQdXJpPFxuICAgIFRTY2hlbWEsXG4gICAgVFRhYmxlcyAmIFJlY29yZDxUSm9pbkFsaWFzLCBUU2NoZW1hW1RKb2luVGFibGVdICYgTGVmdEpvaW5NYXJrZXJGb3I8VFRhYmxlcywgVExlZnQ+PixcbiAgICBUUmVzdWx0XG4gID47XG4gIC8vIEVOU1VSRSBMRUZUIEpPSU46IO2FjOydtOu4lOuqhVxuICBlbnN1cmVMZWZ0Sm9pbjxUSm9pblRhYmxlIGV4dGVuZHMga2V5b2YgVFNjaGVtYSwgVExlZnQgZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PihcbiAgICB0YWJsZU5hbWU6IFRKb2luVGFibGUsXG4gICAgbGVmdDogVExlZnQsXG4gICAgcmlnaHQ6IGAke1RKb2luVGFibGUgJiBzdHJpbmd9LiR7Q29sdW1uS2V5czxUU2NoZW1hW1RKb2luVGFibGVdPn1gLFxuICApOiBQdXJpPFxuICAgIFRTY2hlbWEsXG4gICAgVFRhYmxlcyAmIFJlY29yZDxUSm9pblRhYmxlLCBUU2NoZW1hW1RKb2luVGFibGVdICYgTGVmdEpvaW5NYXJrZXJGb3I8VFRhYmxlcywgVExlZnQ+PixcbiAgICBUUmVzdWx0XG4gID47XG4gIGVuc3VyZUxlZnRKb2luKHRhYmxlTmFtZU9yU3BlYzogYW55LCBsZWZ0OiBzdHJpbmcsIHJpZ2h0OiBzdHJpbmcpOiBhbnkge1xuICAgIHJldHVybiB0aGlzW1wiX19lbnN1cmVKb2luXCJdKFwibGVmdEpvaW5cIiwgdGFibGVOYW1lT3JTcGVjLCBsZWZ0LCByaWdodCk7XG4gIH1cblxuICBfX2NvbW1vbkpvaW4oam9pblR5cGU6IFwiam9pblwiIHwgXCJsZWZ0Sm9pblwiLCB0YWJsZU5hbWVPclNwZWM6IGFueSwgLi4uYXJnczogYW55W10pOiB0aGlzIHtcbiAgICBjb25zdCByZWdpc3RyYXRpb24gPSB0aGlzLmNyZWF0ZUpvaW5SZWdpc3RyYXRpb24oam9pblR5cGUsIHRhYmxlTmFtZU9yU3BlYywgYXJncyk7XG4gICAgdGhpcy5hc3NlcnRDb3JyZWxhdGlvbkF2YWlsYWJsZShyZWdpc3RyYXRpb24pO1xuXG4gICAgaWYgKGlzU3RyaW5nVmFsdWUodGFibGVOYW1lT3JTcGVjKSkge1xuICAgICAgLy8gQ2FzZSAxOiBqb2luKFwicG9zdHNcIiwgLi4uKVxuICAgICAgY29uc3QgdGFibGVOYW1lID0gdGFibGVOYW1lT3JTcGVjO1xuXG4gICAgICBpZiAoYXJncy5sZW5ndGggPT09IDEgJiYgaXNGdW5jdGlvblZhbHVlKGFyZ3NbMF0pKSB7XG4gICAgICAgIC8vIGpvaW4oXCJwb3N0c1wiLCBjYWxsYmFjaylcbiAgICAgICAgY29uc3QgY2FsbGJhY2sgPSBhcmdzWzBdO1xuICAgICAgICB0aGlzLmtuZXhRdWVyeVtqb2luVHlwZV0odGFibGVOYW1lLCAoam9pbkNsYXVzZSkgPT4ge1xuICAgICAgICAgIGNhbGxiYWNrKG5ldyBKb2luQ2xhdXNlR3JvdXAoam9pbkNsYXVzZSkpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGpvaW4oXCJwb3N0c1wiLCBsZWZ0LCByaWdodClcbiAgICAgICAgY29uc3QgW2xlZnQsIHJpZ2h0XSA9IGFyZ3M7XG4gICAgICAgIHRoaXMua25leFF1ZXJ5W2pvaW5UeXBlXSh0YWJsZU5hbWUsIGxlZnQsIHJpZ2h0KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzT2JqZWN0VmFsdWUodGFibGVOYW1lT3JTcGVjKSkge1xuICAgICAgLy8gQ2FzZSAyOiBqb2luKHsgYWxpYXM6IFwidGFibGVcIiB9LCAuLi4pIG9yIGpvaW4oeyBhbGlhczogc3VicXVlcnkgfSwgLi4uKVxuICAgICAgY29uc3QgZW50cmllcyA9IE9iamVjdC5lbnRyaWVzKHRhYmxlTmFtZU9yU3BlYyk7XG4gICAgICBpZiAoZW50cmllcy5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGFibGUgc3BlYyBtdXN0IGhhdmUgZXhhY3RseSBvbmUgZW50cnlcIik7XG4gICAgICB9XG4gICAgICBhc3NlcnQoZW50cmllc1swXSk7XG4gICAgICBjb25zdCBbW2FsaWFzLCBzcGVjXV0gPSBlbnRyaWVzO1xuXG4gICAgICBpZiAoaXNTdHJpbmdWYWx1ZShzcGVjKSkge1xuICAgICAgICAvLyDthYzsnbTruJQ6IGpvaW4oeyBwOiBcInBvc3RzXCIgfSwgLi4uKVxuICAgICAgICBpZiAoYXJncy5sZW5ndGggPT09IDEgJiYgaXNGdW5jdGlvblZhbHVlKGFyZ3NbMF0pKSB7XG4gICAgICAgICAgLy8gQ2FsbGJhY2tcbiAgICAgICAgICBjb25zdCBjYWxsYmFjayA9IGFyZ3NbMF07XG4gICAgICAgICAgdGhpcy5rbmV4UXVlcnlbam9pblR5cGVdKHsgW2FsaWFzXTogc3BlYyB9LCAoam9pbkNsYXVzZSkgPT4ge1xuICAgICAgICAgICAgY2FsbGJhY2sobmV3IEpvaW5DbGF1c2VHcm91cChqb2luQ2xhdXNlKSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gU2ltcGxlXG4gICAgICAgICAgY29uc3QgW2xlZnQsIHJpZ2h0XSA9IGFyZ3M7XG4gICAgICAgICAgdGhpcy5rbmV4UXVlcnlbam9pblR5cGVdKHsgW2FsaWFzXTogc3BlYyB9LCBsZWZ0LCByaWdodCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc3BlYyBpbnN0YW5jZW9mIFB1cmkpIHtcbiAgICAgICAgLy8g7ISc67iM7L+866asOiBqb2luKHsgc3E6IHN1YnF1ZXJ5IH0sIC4uLilcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09PSAxICYmIGlzRnVuY3Rpb25WYWx1ZShhcmdzWzBdKSkge1xuICAgICAgICAgIC8vIENhbGxiYWNrXG4gICAgICAgICAgY29uc3QgY2FsbGJhY2sgPSBhcmdzWzBdO1xuICAgICAgICAgIHRoaXMua25leFF1ZXJ5W2pvaW5UeXBlXShzcGVjLnJhd1F1ZXJ5KCkuYXMoYWxpYXMpLCAoam9pbkNsYXVzZSkgPT4ge1xuICAgICAgICAgICAgY2FsbGJhY2sobmV3IEpvaW5DbGF1c2VHcm91cChqb2luQ2xhdXNlKSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gU2ltcGxlXG4gICAgICAgICAgY29uc3QgW2xlZnQsIHJpZ2h0XSA9IGFyZ3M7XG4gICAgICAgICAgdGhpcy5rbmV4UXVlcnlbam9pblR5cGVdKHNwZWMucmF3UXVlcnkoKS5hcyhhbGlhcyksIGxlZnQsIHJpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCB0YWJsZSBzcGVjaWZpY2F0aW9uXCIpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGFyZ3VtZW50c1wiKTtcbiAgICB9XG5cbiAgICB0aGlzLmNvcnJlbGF0aW9uUmVnaXN0cnkuc2V0KHJlZ2lzdHJhdGlvbi5hbGlhcywgcmVnaXN0cmF0aW9uKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHByaXZhdGUgX19lbnN1cmVKb2luKFxuICAgIGpvaW5UeXBlOiBcImpvaW5cIiB8IFwibGVmdEpvaW5cIixcbiAgICB0YWJsZU5hbWVPclNwZWM6IHN0cmluZyB8IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gICAgbGVmdDogc3RyaW5nLFxuICAgIHJpZ2h0OiBzdHJpbmcsXG4gICk6IHRoaXMge1xuICAgIGNvbnN0IHJlcXVlc3RlZCA9IHRoaXMuY3JlYXRlSm9pblJlZ2lzdHJhdGlvbihqb2luVHlwZSwgdGFibGVOYW1lT3JTcGVjLCBbbGVmdCwgcmlnaHRdKTtcbiAgICBpZiAoIXJlcXVlc3RlZC5yZXVzYWJsZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgJHtqb2luVHlwZSA9PT0gXCJqb2luXCIgPyBcImVuc3VyZUpvaW5cIiA6IFwiZW5zdXJlTGVmdEpvaW5cIn0gb25seSBzdXBwb3J0cyBwaHlzaWNhbCB0YWJsZXMgd2l0aCBzaW1wbGUgY29sdW1uIGVxdWFsaXR5IGNvbmRpdGlvbnMuYCxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5jb3JyZWxhdGlvblJlZ2lzdHJ5LmdldChyZXF1ZXN0ZWQuYWxpYXMpO1xuXG4gICAgaWYgKCFleGlzdGluZykge1xuICAgICAgcmV0dXJuIHRoaXNbXCJfX2NvbW1vbkpvaW5cIl0oam9pblR5cGUsIHRhYmxlTmFtZU9yU3BlYywgbGVmdCwgcmlnaHQpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzU2FtZUpvaW5SZWdpc3RyYXRpb24oZXhpc3RpbmcsIHJlcXVlc3RlZCkpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHRocm93IHRoaXMuY3JlYXRlSm9pbkNvbmZsaWN0RXJyb3IoZXhpc3RpbmcsIHJlcXVlc3RlZCk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUpvaW5SZWdpc3RyYXRpb24oXG4gICAgam9pblR5cGU6IFwiam9pblwiIHwgXCJsZWZ0Sm9pblwiLFxuICAgIHRhYmxlTmFtZU9yU3BlYzogYW55LFxuICAgIGFyZ3M6IGFueVtdLFxuICApOiBKb2luUmVnaXN0cmF0aW9uIHtcbiAgICBsZXQgYWxpYXM6IHN0cmluZztcbiAgICBsZXQgdGFibGU6IHN0cmluZyB8IG51bGw7XG5cbiAgICBpZiAoaXNTdHJpbmdWYWx1ZSh0YWJsZU5hbWVPclNwZWMpKSB7XG4gICAgICBhbGlhcyA9IHRhYmxlTmFtZU9yU3BlYztcbiAgICAgIHRhYmxlID0gdGFibGVOYW1lT3JTcGVjO1xuICAgIH0gZWxzZSBpZiAoaXNPYmplY3RWYWx1ZSh0YWJsZU5hbWVPclNwZWMpKSB7XG4gICAgICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXModGFibGVOYW1lT3JTcGVjKTtcbiAgICAgIGlmIChlbnRyaWVzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUYWJsZSBzcGVjIG11c3QgaGF2ZSBleGFjdGx5IG9uZSBlbnRyeVwiKTtcbiAgICAgIH1cbiAgICAgIGFzc2VydChlbnRyaWVzWzBdKTtcbiAgICAgIGNvbnN0IFtbam9pbkFsaWFzLCBzcGVjXV0gPSBlbnRyaWVzO1xuICAgICAgYWxpYXMgPSBqb2luQWxpYXM7XG4gICAgICB0YWJsZSA9IGlzU3RyaW5nVmFsdWUoc3BlYykgPyBzcGVjIDogbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBhcmd1bWVudHNcIik7XG4gICAgfVxuXG4gICAgY29uc3QgW2xlZnQsIHJpZ2h0XSA9IGFyZ3M7XG4gICAgY29uc3QgcmV1c2FibGUgPVxuICAgICAgdGFibGUgIT09IG51bGwgJiYgYXJncy5sZW5ndGggPT09IDIgJiYgaXNTdHJpbmdWYWx1ZShsZWZ0KSAmJiBpc1N0cmluZ1ZhbHVlKHJpZ2h0KTtcblxuICAgIHJldHVybiB7XG4gICAgICBraW5kOiBcImpvaW5cIixcbiAgICAgIGFsaWFzLFxuICAgICAgdGFibGUsXG4gICAgICBqb2luVHlwZSxcbiAgICAgIGxlZnQ6IHJldXNhYmxlID8gbGVmdCA6IG51bGwsXG4gICAgICByaWdodDogcmV1c2FibGUgPyByaWdodCA6IG51bGwsXG4gICAgICByZXVzYWJsZSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3NlcnRDb3JyZWxhdGlvbkF2YWlsYWJsZShyZXF1ZXN0ZWQ6IEpvaW5SZWdpc3RyYXRpb24pOiB2b2lkIHtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuY29ycmVsYXRpb25SZWdpc3RyeS5nZXQocmVxdWVzdGVkLmFsaWFzKTtcbiAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgIGlmICh0aGlzLmlzU2FtZUpvaW5SZWdpc3RyYXRpb24oZXhpc3RpbmcsIHJlcXVlc3RlZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBKb2luIGFsaWFzIFwiJHtyZXF1ZXN0ZWQuYWxpYXN9XCIgaXMgYWxyZWFkeSByZWdpc3RlcmVkLiBVc2UgZW5zdXJlSm9pbigpIG9yIGVuc3VyZUxlZnRKb2luKCkgdG8gcmV1c2UgYW4gaWRlbnRpY2FsIGpvaW4uYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRocm93IHRoaXMuY3JlYXRlSm9pbkNvbmZsaWN0RXJyb3IoZXhpc3RpbmcsIHJlcXVlc3RlZCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpc1NhbWVKb2luUmVnaXN0cmF0aW9uKFxuICAgIGV4aXN0aW5nOiBDb3JyZWxhdGlvblJlZ2lzdHJhdGlvbixcbiAgICByZXF1ZXN0ZWQ6IEpvaW5SZWdpc3RyYXRpb24sXG4gICk6IGV4aXN0aW5nIGlzIEpvaW5SZWdpc3RyYXRpb24ge1xuICAgIHJldHVybiAoXG4gICAgICBleGlzdGluZy5raW5kID09PSBcImpvaW5cIiAmJlxuICAgICAgZXhpc3RpbmcucmV1c2FibGUgJiZcbiAgICAgIHJlcXVlc3RlZC5yZXVzYWJsZSAmJlxuICAgICAgZXhpc3RpbmcudGFibGUgPT09IHJlcXVlc3RlZC50YWJsZSAmJlxuICAgICAgZXhpc3Rpbmcuam9pblR5cGUgPT09IHJlcXVlc3RlZC5qb2luVHlwZSAmJlxuICAgICAgZXhpc3RpbmcubGVmdCA9PT0gcmVxdWVzdGVkLmxlZnQgJiZcbiAgICAgIGV4aXN0aW5nLnJpZ2h0ID09PSByZXF1ZXN0ZWQucmlnaHRcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVKb2luQ29uZmxpY3RFcnJvcihcbiAgICBleGlzdGluZzogQ29ycmVsYXRpb25SZWdpc3RyYXRpb24sXG4gICAgcmVxdWVzdGVkOiBKb2luUmVnaXN0cmF0aW9uLFxuICApOiBFcnJvciB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihcbiAgICAgIFtcbiAgICAgICAgYEpvaW4gYWxpYXMgXCIke3JlcXVlc3RlZC5hbGlhc31cIiBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQgd2l0aCBhIGRpZmZlcmVudCBkZWZpbml0aW9uLmAsXG4gICAgICAgIGBFeGlzdGluZzogJHt0aGlzLmZvcm1hdENvcnJlbGF0aW9uUmVnaXN0cmF0aW9uKGV4aXN0aW5nKX1gLFxuICAgICAgICBgUmVxdWVzdGVkOiAke3RoaXMuZm9ybWF0Q29ycmVsYXRpb25SZWdpc3RyYXRpb24ocmVxdWVzdGVkKX1gLFxuICAgICAgXS5qb2luKFwiXFxuXCIpLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdENvcnJlbGF0aW9uUmVnaXN0cmF0aW9uKHJlZ2lzdHJhdGlvbjogQ29ycmVsYXRpb25SZWdpc3RyYXRpb24pOiBzdHJpbmcge1xuICAgIGlmIChyZWdpc3RyYXRpb24ua2luZCA9PT0gXCJmcm9tXCIpIHtcbiAgICAgIHJldHVybiBgRlJPTSAke3JlZ2lzdHJhdGlvbi50YWJsZSA/PyBcInN1YnF1ZXJ5XCJ9IEFTICR7cmVnaXN0cmF0aW9uLmFsaWFzfWA7XG4gICAgfVxuXG4gICAgY29uc3Qgam9pbktleXdvcmQgPSByZWdpc3RyYXRpb24uam9pblR5cGUgPT09IFwiam9pblwiID8gXCJKT0lOXCIgOiBcIkxFRlQgSk9JTlwiO1xuICAgIGNvbnN0IHNvdXJjZSA9IHJlZ2lzdHJhdGlvbi50YWJsZSA/PyBcIm9wYXF1ZSBzb3VyY2VcIjtcbiAgICBjb25zdCBjb25kaXRpb24gPSByZWdpc3RyYXRpb24ucmV1c2FibGVcbiAgICAgID8gYCBPTiAke3JlZ2lzdHJhdGlvbi5sZWZ0fSA9ICR7cmVnaXN0cmF0aW9uLnJpZ2h0fWBcbiAgICAgIDogXCIgd2l0aCBvcGFxdWUgY29uZGl0aW9uXCI7XG4gICAgcmV0dXJuIGAke2pvaW5LZXl3b3JkfSAke3NvdXJjZX0gQVMgJHtyZWdpc3RyYXRpb24uYWxpYXN9JHtjb25kaXRpb259YDtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJKb2luUmVnaXN0cmF0aW9ucygpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IFthbGlhcywgcmVnaXN0cmF0aW9uXSBvZiB0aGlzLmNvcnJlbGF0aW9uUmVnaXN0cnkpIHtcbiAgICAgIGlmIChyZWdpc3RyYXRpb24ua2luZCA9PT0gXCJqb2luXCIpIHtcbiAgICAgICAgdGhpcy5jb3JyZWxhdGlvblJlZ2lzdHJ5LmRlbGV0ZShhbGlhcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRLbmV4Sm9pbkFsaWFzPFZhbHVlPih0YWJsZTogVmFsdWUpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAoaXNTdHJpbmdWYWx1ZSh0YWJsZSkpIHtcbiAgICAgIHJldHVybiB0YWJsZTtcbiAgICB9XG4gICAgaWYgKGlzT2JqZWN0VmFsdWUodGFibGUpICYmIHRhYmxlICE9PSBudWxsKSB7XG4gICAgICBpZiAoXG4gICAgICAgIFwiX3NpbmdsZVwiIGluIHRhYmxlICYmXG4gICAgICAgIGlzT2JqZWN0VmFsdWUodGFibGVbXCJfc2luZ2xlXCJdKSAmJlxuICAgICAgICB0YWJsZVtcIl9zaW5nbGVcIl0gIT09IG51bGwgJiZcbiAgICAgICAgXCJhc1wiIGluIHRhYmxlW1wiX3NpbmdsZVwiXSAmJlxuICAgICAgICBpc1N0cmluZ1ZhbHVlKHRhYmxlW1wiX3NpbmdsZVwiXS5hcylcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gdGFibGVbXCJfc2luZ2xlXCJdLmFzO1xuICAgICAgfVxuICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRhYmxlKVswXSA/PyBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIFdIRVJFOiDqsJ3ssrQgLSDsgqzsmqk6IC53aGVyZSh7IFwidS5pZFwiOiAxLCBcInUuc3RhdHVzXCI6IFwiYWN0aXZlXCIgfSlcbiAgd2hlcmUoY29uZGl0aW9uczogV2hlcmVDb25kaXRpb248VFRhYmxlcz4pOiB0aGlzO1xuICAvLyBXSEVSRTog7Lus65+8IC0g7IKs7JqpOiAud2hlcmUoXCJ1LmlkXCIsIDEpLCAud2hlcmUoXCJ1LmlkXCIsIG51bGwpXG4gIHdoZXJlPFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWU6IEV4dHJhY3RDb2x1bW5UeXBlPFRUYWJsZXMsIFRDb2x1bW4gJiBzdHJpbmc+LFxuICApOiB0aGlzO1xuICAvLyBXSEVSRTog7Lus65+8IC0g7IKs7JqpOiAud2hlcmUoXCJ1LmlkXCIsIFwiPlwiLCAxMCksIC53aGVyZShcInUuaWRcIiwgXCIhPVwiLCBudWxsKVxuICB3aGVyZTxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIG9wZXJhdG9yOiBXaGVyZU9wZXJhdG9yLFxuICAgIHZhbHVlOiBFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUQ29sdW1uICYgc3RyaW5nPixcbiAgKTogdGhpcztcbiAgLy8gV0hFUkU6IFNRTCDtkZztmITsi50gLSDsgqzsmqk6IC53aGVyZShwdXJpLnJhdyhcIkNPTkNBVCh1Lm5hbWUsIHUuZW1haWwpXCIpLCBcImxpa2VcIiwgXCIldGVzdCVcIilcbiAgd2hlcmU8VENvbHVtbiBleHRlbmRzIEtuZXguUmF3Pihjb2x1bW46IFRDb2x1bW4sIG9wZXJhdG9yOiBXaGVyZU9wZXJhdG9yLCB2YWx1ZTogYW55KTogdGhpcztcbiAgLy8gV0hFUkU6IOy7rOufvCAtIOyCrOyaqTogLndoZXJlKFwidS5pZFwiLCBcImxpa2VcIiwgXCIldGVzdCVcIilcbiAgd2hlcmUoLi4uYXJnczogW2NvbHVtbk9yQ29uZGl0aW9uczogYW55LCBvcGVyYXRvck9yVmFsdWU/OiBhbnksIHZhbHVlPzogYW55XSk6IHRoaXMge1xuICAgIGNvbnN0IFtjb2x1bW5PckNvbmRpdGlvbnMsIG9wZXJhdG9yT3JWYWx1ZSwgdmFsdWVdID0gYXJncztcbiAgICBpZiAoaXNPYmplY3RWYWx1ZShjb2x1bW5PckNvbmRpdGlvbnMpKSB7XG4gICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZShjb2x1bW5PckNvbmRpdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKG9wZXJhdG9yT3JWYWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZU51bGwoY29sdW1uT3JDb25kaXRpb25zKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZShjb2x1bW5PckNvbmRpdGlvbnMsIG9wZXJhdG9yT3JWYWx1ZSk7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgaWYgKG9wZXJhdG9yT3JWYWx1ZSA9PT0gXCIhPVwiKSB7XG4gICAgICAgICAgdGhpcy5rbmV4UXVlcnkud2hlcmVOb3ROdWxsKGNvbHVtbk9yQ29uZGl0aW9ucyk7XG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0gZWxzZSBpZiAob3BlcmF0b3JPclZhbHVlID09PSBcIj1cIikge1xuICAgICAgICAgIHRoaXMua25leFF1ZXJ5LndoZXJlTnVsbChjb2x1bW5PckNvbmRpdGlvbnMpO1xuICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZShjb2x1bW5PckNvbmRpdGlvbnMsIG9wZXJhdG9yT3JWYWx1ZSwgdmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZShjb2x1bW5PckNvbmRpdGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIFdIRVJFIElOXG4gIHdoZXJlSW48VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICB2YWx1ZXM6IChFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUQ29sdW1uICYgc3RyaW5nPiAmIEtuZXguVmFsdWUpW10sXG4gICk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcywgVFJlc3VsdD4ge1xuICAgIC8vIEtuZXjsnZgg67mE7Ja0IOyeiOuKlCBJTiDrsLDsl7Qg7LKY66as7JmAIOuPmeydvO2VmOqyjCDtla3sg4Eg6rGw7KeT7J24IOyhsOqxtOydhCDsg53shLHtlanri4jri6QuXG4gICAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMua25leFF1ZXJ5LndoZXJlUmF3KFwiMSA9IDBcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHBsYWNlaG9sZGVycyA9IHZhbHVlcy5tYXAoKCkgPT4gXCI/XCIpLmpvaW4oXCIsIFwiKTtcbiAgICAgIHRoaXMua25leFF1ZXJ5LndoZXJlUmF3KGA/PyBpbiAoJHtwbGFjZWhvbGRlcnN9KWAsIFtTdHJpbmcoY29sdW1uKSwgLi4udmFsdWVzXSk7XG4gICAgfVxuICAgIC8vIFNBRkVUWTog7L+866asIOu5jOuNlOydmCDsoJzrhKTrpq0g6rOE7JW96rO8IOyEoO2WiSDqsoDspp3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgcmV0dXJuIHRoaXMgYXMgYW55O1xuICB9XG5cbiAgLy8gV0hFUkUgTk9UIElOXG4gIHdoZXJlTm90SW48VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICB2YWx1ZXM6IChFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUQ29sdW1uICYgc3RyaW5nPiAmIEtuZXguVmFsdWUpW10sXG4gICk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcywgVFJlc3VsdD4ge1xuICAgIC8vIEtuZXjsnZgg67mE7Ja0IOyeiOuKlCBOT1QgSU4g67Cw7Je0IOyymOumrOyZgCDrj5nsnbztlZjqsowg7ZWt7IOBIOywuOyduCDsobDqsbTsnYQg7IOd7ISx7ZWp64uI64ukLlxuICAgIGlmICh2YWx1ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZVJhdyhcIjEgPSAxXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBwbGFjZWhvbGRlcnMgPSB2YWx1ZXMubWFwKCgpID0+IFwiP1wiKS5qb2luKFwiLCBcIik7XG4gICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZVJhdyhgPz8gbm90IGluICgke3BsYWNlaG9sZGVyc30pYCwgW1N0cmluZyhjb2x1bW4pLCAuLi52YWx1ZXNdKTtcbiAgICB9XG4gICAgLy8gU0FGRVRZOiDsv7zrpqwg67mM642U7J2YIOygnOuEpOumrSDqs4Tslb3qs7wg7ISg7ZaJIOqygOymneydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICByZXR1cm4gdGhpcyBhcyBhbnk7XG4gIH1cblxuICAvLyBXSEVSRSBKU09OQiBTVVBFUlNFVCAoQD4pXG4gIHdoZXJlSnNvblN1cGVyc2V0T2Y8VENvbHVtbiBleHRlbmRzIEpzb25Db2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWU6IEpzb25TdXBlcnNldFZhbHVlPEV4dHJhY3RDb2x1bW5UeXBlPFRUYWJsZXMsIFRDb2x1bW4+PixcbiAgKTogdGhpcyB7XG4gICAgdGhpcy5rbmV4UXVlcnkud2hlcmVKc29uU3VwZXJzZXRPZihjb2x1bW4sIHNlcmlhbGl6ZUpzb25TdXBlcnNldFZhbHVlKHZhbHVlKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB3aGVyZUpzb25LZXlFeGlzdHMoY29sdW1uOiBKc29uQ29sdW1uczxUVGFibGVzPiwga2V5OiBzdHJpbmcpOiB0aGlzIHtcbiAgICB0aGlzLmtuZXhRdWVyeS53aGVyZVJhdyhcIj8/IFxcXFw/ID9cIiwgW2NvbHVtbiwga2V5XSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBXSEVSRSBNQVRDSFxuICB3aGVyZU1hdGNoPFRDb2x1bW4gZXh0ZW5kcyBGdWxsdGV4dENvbHVtbnM8VFRhYmxlcz4+KGNvbHVtbjogVENvbHVtbiwgdmFsdWU6IHN0cmluZyk6IHRoaXMge1xuICAgIHRoaXMua25leFF1ZXJ5LndoZXJlUmF3KGBNQVRDSCAoJHtTdHJpbmcoY29sdW1uKX0pIEFHQUlOU1QgKD8pYCwgW3ZhbHVlXSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUEdyb29uZ2EgRnVsbFRleHQg7J24642x7IqkIOqygOyDiVxuICAgKiAtIOyCrOyaqe2VoCBQR3Jvb25nYSDsnbjrjbHsiqTsmYAg64+Z7J287ZWcIOy7rOufvCDqtazshLHsnLzroZwg6rKA7IOJ7ZW07JW8IOyduOuNseyKpOqwgCDsgqzsmqnrkKnri4jri6QuXG4gICAqXG4gICAqIOuLqOydvCDsu6zrn7wg6rKA7IOJOlxuICAgKiBgYGBzcWxcbiAgICogV0hFUkUgbmFtZSAmQH4gJ3NlYXJjaCdcbiAgICogYGBgXG4gICAqXG4gICAqIOuzte2VqSDsu6zrn7wg6rKA7IOJOlxuICAgKiBgYGBzcWxcbiAgICogV0hFUkUgQVJSQVlbbmFtZTo6dGV4dCwgZGVzY3JpcHRpb246OnRleHRdICZAfiAnc2VhcmNoJ1xuICAgKiBgYGBcbiAgICovXG4gIHdoZXJlU2VhcmNoPFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4gfCBUQ29sdW1uW10sXG4gICAgdmFsdWU6IHN0cmluZyxcbiAgICBvcHRpb25zPzoge1xuICAgICAgd2VpZ2h0cz86IG51bWJlcltdOyAvLyDsoJXsiJgg67Cw7Je0XG4gICAgfSxcbiAgKTogdGhpcyB7XG4gICAgY29uc3QgeyB3ZWlnaHRzIH0gPSBvcHRpb25zID8/IHt9O1xuICAgIGNvbnN0IGNvbHVtbkV4cHIgPSBBcnJheS5pc0FycmF5KGNvbHVtbilcbiAgICAgID8gYEFSUkFZWyR7Y29sdW1uLm1hcCgoYykgPT4gYCR7Y306OnRleHRgKS5qb2luKFwiLFwiKX1dYFxuICAgICAgOiBjb2x1bW47XG4gICAgY29uc3QgcGdyb29uZ2FDb25kaXRpb24gPSBgcGdyb29uZ2FfY29uZGl0aW9uKD8ke3dlaWdodHM/Lmxlbmd0aCA/IGAsIHdlaWdodHMgPT4gQVJSQVlbJHt3ZWlnaHRzLmpvaW4oXCIsXCIpfV1gIDogXCJcIn0pYDtcblxuICAgIHRoaXMua25leFF1ZXJ5LndoZXJlUmF3KGAke2NvbHVtbkV4cHJ9ICZAfiAke3Bncm9vbmdhQ29uZGl0aW9ufWAsIFt2YWx1ZV0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBXSEVSRSBGVUxMVEVYVFxuICB3aGVyZVRzU2VhcmNoPFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+IHwgU3RyaW5nU3FsRXhwcmVzc2lvbj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFRzUXVlcnlPcHRpb25zIHwgVHNRdWVyeUNvbmZpZyxcbiAgKTogdGhpcyB7XG4gICAgY29uc3Qgb3B0cyA9XG4gICAgICAvLyBTQUZFVFk6IOy/vOumrCDruYzrjZTsnZgg7KCc64Sk66atIOqzhOyVveqzvCDshKDtlokg6rKA7Kad7J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgICAgaXNTdHJpbmdWYWx1ZShvcHRpb25zKSA/ICh7IGNvbmZpZzogb3B0aW9ucyB9IGFzIFRzUXVlcnlPcHRpb25zKSA6IChvcHRpb25zID8/IHt9KTtcblxuICAgIGNvbnN0IHBhcnNlciA9IG9wdHMucGFyc2VyID8/IFwid2Vic2VhcmNoX3RvX3RzcXVlcnlcIjtcbiAgICBjb25zdCBjb25maWcgPSBvcHRzLmNvbmZpZyA/PyBcInNpbXBsZVwiO1xuICAgIGNvbnN0IGNvbHVtbkV4cHIgPSBpc1NxbEV4cHJlc3Npb24oY29sdW1uKSA/IGNvbHVtbltcIl9zcWxcIl0gOiBTdHJpbmcoY29sdW1uKTtcbiAgICBjb25zdCBwYXJhbXMgPSBpc1NxbEV4cHJlc3Npb24oY29sdW1uKVxuICAgICAgPyBbLi4uY29sdW1uW1wiX3BhcmFtc1wiXSwgY29uZmlnLCB2YWx1ZV1cbiAgICAgIDogW2NvbmZpZywgdmFsdWVdO1xuXG4gICAgdGhpcy5rbmV4UXVlcnkud2hlcmVSYXcoYCR7Y29sdW1uRXhwcn0gQEAgJHtwYXJzZXJ9KD8sID8pYCwgcGFyYW1zKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHdoZXJlRnV6enk8VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4gfCBTdHJpbmdTcWxFeHByZXNzaW9uPihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWU6IHN0cmluZyxcbiAgICBvcHRpb25zPzoge1xuICAgICAgb3BlcmF0b3I/OiBGdXp6eU9wZXJhdG9yO1xuICAgIH0sXG4gICk6IHRoaXMge1xuICAgIGNvbnN0IG9wZXJhdG9yID0gcGFyc2VGdXp6eU9wZXJhdG9yKG9wdGlvbnM/Lm9wZXJhdG9yKTtcblxuICAgIGlmIChvcGVyYXRvciA9PT0gXCIlXCIpIHtcbiAgICAgIGlmIChpc1NxbEV4cHJlc3Npb24oY29sdW1uKSkge1xuICAgICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZVJhdyhgJHtjb2x1bW5bXCJfc3FsXCJdfSAke29wZXJhdG9yfSA/YCwgWy4uLmNvbHVtbltcIl9wYXJhbXNcIl0sIHZhbHVlXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZVJhdyhgPz8gJHtvcGVyYXRvcn0gP2AsIFtjb2x1bW4sIHZhbHVlXSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBpZiAoaXNTcWxFeHByZXNzaW9uKGNvbHVtbikpIHtcbiAgICAgIHRoaXMua25leFF1ZXJ5LndoZXJlUmF3KGA/ICR7b3BlcmF0b3J9ICR7Y29sdW1uW1wiX3NxbFwiXX1gLCBbdmFsdWUsIC4uLmNvbHVtbltcIl9wYXJhbXNcIl1dKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5rbmV4UXVlcnkud2hlcmVSYXcoYD8gJHtvcGVyYXRvcn0gPz9gLCBbdmFsdWUsIGNvbHVtbl0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIFdIRVJFIFJBV1xuICB3aGVyZVJhdyhzcWw6IHN0cmluZywgYmluZGluZ3M/OiByZWFkb25seSBLbmV4LlJhd0JpbmRpbmdbXSk6IHRoaXMge1xuICAgIHRoaXMua25leFF1ZXJ5LndoZXJlUmF3KHNxbCwgYmluZGluZ3MpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gV0hFUkUg6rSE7Zi4IOq3uOujue2VkVxuICB3aGVyZUdyb3VwKGNhbGxiYWNrOiAoZzogV2hlcmVHcm91cDxUVGFibGVzPikgPT4gdm9pZCk6IHRoaXMge1xuICAgIHRoaXMua25leFF1ZXJ5LndoZXJlKChidWlsZGVyKSA9PiB7XG4gICAgICBjb25zdCBncm91cCA9IG5ldyBXaGVyZUdyb3VwPFRUYWJsZXM+KGJ1aWxkZXIpO1xuICAgICAgY2FsbGJhY2soZ3JvdXApO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIG9yV2hlcmVHcm91cChjYWxsYmFjazogKGc6IFdoZXJlR3JvdXA8VFRhYmxlcz4pID0+IHZvaWQpOiB0aGlzIHtcbiAgICB0aGlzLmtuZXhRdWVyeS5vcldoZXJlKChidWlsZGVyKSA9PiB7XG4gICAgICBjb25zdCBncm91cCA9IG5ldyBXaGVyZUdyb3VwPFRUYWJsZXM+KGJ1aWxkZXIpO1xuICAgICAgY2FsbGJhY2soZ3JvdXApO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gT1JERVIgQlkgKFNxbEV4cHJlc3Npb27snLzroZzrj4Qg7ZWgIOyImCDsnojslrTslbwg7ZWoKVxuICBvcmRlckJ5PFRDb2x1bW4gZXh0ZW5kcyBSZXN1bHRBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXMsIFRSZXN1bHQ+PihcbiAgICBjb2x1bW46IFRDb2x1bW4gfCBQdXJpT3JkZXJCeUV4cHJlc3Npb24sXG4gICAgZGlyZWN0aW9uPzogUHVyaU9yZGVyQnlEaXJlY3Rpb24sXG4gICAgbnVsbHM/OiBQdXJpT3JkZXJCeU51bGxzLFxuICApOiB0aGlzO1xuICBvcmRlckJ5PFRDb2x1bW4gZXh0ZW5kcyBSZXN1bHRBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXMsIFRSZXN1bHQ+PihcbiAgICBjb2x1bW5zOiByZWFkb25seSBQdXJpT3JkZXJCeUVudHJ5PFRDb2x1bW4+W10sXG4gICk6IHRoaXM7XG4gIG9yZGVyQnkoXG4gICAgY29sdW1uT3JDb2x1bW5zOiBzdHJpbmcgfCBQdXJpT3JkZXJCeUV4cHJlc3Npb24gfCByZWFkb25seSBQdXJpT3JkZXJCeVJ1bnRpbWVFbnRyeVtdLFxuICAgIGRpcmVjdGlvbjogUHVyaU9yZGVyQnlEaXJlY3Rpb24gPSBcImFzY1wiLFxuICAgIG51bGxzPzogUHVyaU9yZGVyQnlOdWxscyxcbiAgKTogdGhpcyB7XG4gICAgaWYgKGlzT3JkZXJCeUVudHJpZXMoY29sdW1uT3JDb2x1bW5zKSkge1xuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBjb2x1bW5PckNvbHVtbnMpIHtcbiAgICAgICAgaWYgKGlzU3RyaW5nVmFsdWUoZW50cnkpIHx8IGlzT3JkZXJCeUV4cHJlc3Npb24oZW50cnkpKSB7XG4gICAgICAgICAgdGhpcy5hcHBseU9yZGVyQnkoZW50cnkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuYXBwbHlPcmRlckJ5KGVudHJ5LmNvbHVtbiwgZW50cnkub3JkZXIsIGVudHJ5Lm51bGxzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgdGhpcy5hcHBseU9yZGVyQnkoY29sdW1uT3JDb2x1bW5zLCBkaXJlY3Rpb24sIG51bGxzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlPcmRlckJ5KFxuICAgIGNvbHVtbjogc3RyaW5nIHwgUHVyaU9yZGVyQnlFeHByZXNzaW9uLFxuICAgIGRpcmVjdGlvbj86IFB1cmlPcmRlckJ5RGlyZWN0aW9uLFxuICAgIG51bGxzPzogUHVyaU9yZGVyQnlOdWxscyxcbiAgKTogdm9pZCB7XG4gICAgY29uc3Qgbm9ybWFsaXplZERpcmVjdGlvbiA9IG5vcm1hbGl6ZU9yZGVyQnlEaXJlY3Rpb24oZGlyZWN0aW9uKTtcbiAgICBjb25zdCBub3JtYWxpemVkTnVsbHMgPSBub3JtYWxpemVPcmRlckJ5TnVsbHMobnVsbHMpO1xuXG4gICAgaWYgKGlzT3JkZXJCeUV4cHJlc3Npb24oY29sdW1uKSkge1xuICAgICAgdGhpcy5rbmV4UXVlcnkub3JkZXJCeVJhdyhcbiAgICAgICAgYCR7Y29sdW1uW1wiX3NxbFwiXX0gJHtub3JtYWxpemVkRGlyZWN0aW9ufSR7Zm9ybWF0TnVsbHNTdWZmaXgobm9ybWFsaXplZE51bGxzKX1gLFxuICAgICAgICBjb2x1bW5bXCJfcGFyYW1zXCJdLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5rbmV4UXVlcnkub3JkZXJCeShjb2x1bW4sIG5vcm1hbGl6ZWREaXJlY3Rpb24sIG5vcm1hbGl6ZWROdWxscyk7XG4gICAgfVxuICB9XG5cbiAgZm9yVXBkYXRlKCk6IHRoaXMge1xuICAgIHRoaXMua25leFF1ZXJ5LmZvclVwZGF0ZSgpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZm9yU2hhcmUoKTogdGhpcyB7XG4gICAgdGhpcy5rbmV4UXVlcnkuZm9yU2hhcmUoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiDrsqHthLAg7Jyg7IKs64+EIOqygOyDiSDshKTsoJVcbiAgICpcbiAgICogLSBTRUxFQ1Tsl5Agc2ltaWxhcml0eSDsu6zrn7wg7LaU6rCAXG4gICAqIC0gV0hFUkUgY29sIElTIE5PVCBOVUxMIOy2lOqwgFxuICAgKiAtIHRocmVzaG9sZOqwgCDsnojsnLzrqbQgV0hFUkUg7KGw6rG0IOy2lOqwgFxuICAgKiAtIOq4sOyhtCBPUkRFUiBCWeulvCBjbGVhcu2VmOqzoCDsm5Dsi5wg7Jew7IKw7J6Q66GcIOygleugrCAoSE5TVyDsnbjrjbHsiqQg7LWc7KCB7ZmUKVxuICAgKlxuICAgKiBAcGFyYW0gY29sdW1uIOuyoe2EsCDsu6zrn7wg6rK966GcXG4gICAqIEBwYXJhbSBlbWJlZGRpbmcg7L+866asIOyehOuyoOuUqSDrsqHthLBcbiAgICogQHBhcmFtIG9wdGlvbnMgbWV0aG9kLCB0aHJlc2hvbGQsIGFzIOuTsSDsmLXshZhcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBjb3NpbmUgc2ltaWxhcml0eSAo6riw67O46rCSKVxuICAgKiBxYi52ZWN0b3JTaW1pbGFyaXR5KFwiY29sdW1uTmFtZVwiLCBxdWVyeVZlY3Rvciwge1xuICAgKiAgIG1ldGhvZDogXCJjb3NpbmVcIixcbiAgICogICB0aHJlc2hvbGQ6IDAuNVxuICAgKiB9KTtcbiAgICpcbiAgICogLy8gTDIgZGlzdGFuY2VcbiAgICogcWIudmVjdG9yU2ltaWxhcml0eShcImNvbHVtbk5hbWVcIiwgcXVlcnlWZWN0b3IsIHtcbiAgICogICBtZXRob2Q6IFwibDJcIixcbiAgICogICB0aHJlc2hvbGQ6IDEuNSAgLy8g6rGw66as6rCAIDEuNSDsnbTtlZjsnbgg6rKw6rO866eMXG4gICAqIH0pO1xuICAgKlxuICAgKiAvLyBJbm5lciBwcm9kdWN0XG4gICAqIHFiLnZlY3RvclNpbWlsYXJpdHkoXCJjb2x1bW5OYW1lXCIsIHF1ZXJ5VmVjdG9yLCB7XG4gICAqICAgbWV0aG9kOiBcImlubmVyX3Byb2R1Y3RcIixcbiAgICogICB0aHJlc2hvbGQ6IDAuN1xuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICB2ZWN0b3JTaW1pbGFyaXR5KFxuICAgIGNvbHVtbjogVmVjdG9yQ29sdW1uczxUVGFibGVzPixcbiAgICBlbWJlZGRpbmc6IG51bWJlcltdLFxuICAgIG9wdGlvbnM6IHtcbiAgICAgIG1ldGhvZD86IFwiY29zaW5lXCIgfCBcImwyXCIgfCBcImlubmVyX3Byb2R1Y3RcIjtcbiAgICAgIHRocmVzaG9sZD86IG51bWJlcjtcbiAgICAgIGRpc3RpbmN0T24/OiBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+O1xuICAgIH0gPSB7fSxcbiAgKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzLCBUUmVzdWx0ICYgeyBzaW1pbGFyaXR5OiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHsgbWV0aG9kID0gXCJjb3NpbmVcIiwgdGhyZXNob2xkLCBkaXN0aW5jdE9uIH0gPSBvcHRpb25zO1xuXG4gICAgaWYgKFxuICAgICAgIUFycmF5LmlzQXJyYXkoZW1iZWRkaW5nKSB8fFxuICAgICAgZW1iZWRkaW5nLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgZW1iZWRkaW5nLnNvbWUoKHYpID0+ICFOdW1iZXIuaXNGaW5pdGUodikpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGVtYmVkZGluZyB2ZWN0b3I6IGV4cGVjdGVkIGEgbm9uLWVtcHR5IGFycmF5IG9mIGZpbml0ZSBudW1iZXJzXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IHZlY3RvckxpdGVyYWwgPSBKU09OLnN0cmluZ2lmeShlbWJlZGRpbmcubWFwKCh2KSA9PiBOdW1iZXIodikpKTtcbiAgICBjb25zdCBvcGVyYXRvciA9IHsgY29zaW5lOiBcIjw9PlwiLCBsMjogXCI8LT5cIiwgaW5uZXJfcHJvZHVjdDogXCI8Iz5cIiB9W21ldGhvZF07XG5cbiAgICAvLyBtZXRob2Trs4Qg7Jew7IKw7J6QIOuwjyBzaW1pbGFyaXR5IOqzhOyCsOyLnVxuICAgIC8vIC0gY29zaW5lOiA8PT4gKGNvc2luZSBkaXN0YW5jZSwgMH4yKSwgc2ltaWxhcml0eSA9IDEgLSBkaXN0YW5jZVxuICAgIC8vIC0gbDI6IDwtPiAoZXVjbGlkZWFuIGRpc3RhbmNlKSwgc2ltaWxhcml0eSA9IGRpc3RhbmNlICjrgq7snYTsiJjroZ0g7Jyg7IKsKVxuICAgIC8vIC0gaW5uZXJfcHJvZHVjdDogPCM+IChuZWdhdGl2ZSBpbm5lciBwcm9kdWN0KSwgc2ltaWxhcml0eSA9IC1kaXN0YW5jZSAo64aS7J2E7IiY66GdIOycoOyCrClcbiAgICBjb25zdCBzaW1pbGFyaXR5RXhwciA9XG4gICAgICBtZXRob2QgPT09IFwiY29zaW5lXCJcbiAgICAgICAgPyB0aGlzLmtuZXgucmF3KGAxIC0gKD8/ICR7b3BlcmF0b3J9ID86OnZlY3RvcikgYXMgc2ltaWxhcml0eWAsIFtjb2x1bW4sIHZlY3RvckxpdGVyYWxdKVxuICAgICAgICA6IG1ldGhvZCA9PT0gXCJsMlwiXG4gICAgICAgICAgPyB0aGlzLmtuZXgucmF3KGA/PyAke29wZXJhdG9yfSA/Ojp2ZWN0b3IgYXMgc2ltaWxhcml0eWAsIFtjb2x1bW4sIHZlY3RvckxpdGVyYWxdKVxuICAgICAgICAgIDogdGhpcy5rbmV4LnJhdyhgLSg/PyAke29wZXJhdG9yfSA/Ojp2ZWN0b3IpIGFzIHNpbWlsYXJpdHlgLCBbY29sdW1uLCB2ZWN0b3JMaXRlcmFsXSk7XG5cbiAgICAvLyBXSEVSRSBOT1QgTlVMTFxuICAgIHRoaXMua25leFF1ZXJ5LndoZXJlTm90TnVsbChjb2x1bW4pO1xuXG4gICAgLy8g6riw7KG0IE9SREVSIEJZIGNsZWFyXG4gICAgdGhpcy5rbmV4UXVlcnkuY2xlYXIoXCJvcmRlclwiKTtcbiAgICBpZiAoZGlzdGluY3RPbikge1xuICAgICAgLy8gRElTVElOQ1QgT07snYAgU0VMRUNUIOygiOydmCDrp6gg7JWe7JeQIOyZgOyVvCDtlZjrr4DroZwsIOq4sOyhtCBzZWxlY3Qoc3Vic2V0IO2VhOuTnOuTpCnrpbwg67O07KG0IO2bhCBjbGVhcu2VmOqzoCDri6Tsi5wg7LaU6rCAXG4gICAgICAvLyBTQUZFVFk6IOy/vOumrCDruYzrjZTsnZgg7KCc64Sk66atIOqzhOyVveqzvCDshKDtlokg6rKA7Kad7J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgICAgY29uc3QgZXhpc3RpbmdTdWJzZXRDb2xzID0gKHRoaXMua25leFF1ZXJ5IGFzIGFueSlbXCJfc3RhdGVtZW50c1wiXVxuICAgICAgICAuZmlsdGVyKChzOiBhbnkpID0+IHMuZ3JvdXBpbmcgPT09IFwiY29sdW1uc1wiKVxuICAgICAgICAuZmxhdE1hcCgoczogYW55KSA9PiBzLnZhbHVlKTtcbiAgICAgIHRoaXMua25leFF1ZXJ5LmNsZWFyKFwic2VsZWN0XCIpO1xuICAgICAgdGhpcy5rbmV4UXVlcnkuc2VsZWN0KHRoaXMua25leC5yYXcoYERJU1RJTkNUIE9OICg/PykgPz9gLCBbZGlzdGluY3RPbiwgZGlzdGluY3RPbl0pKTtcbiAgICAgIGV4aXN0aW5nU3Vic2V0Q29scy5tYXAoKGNvbDogYW55KSA9PiB0aGlzLmtuZXhRdWVyeS5zZWxlY3QoY29sKSk7XG4gICAgICB0aGlzLmtuZXhRdWVyeS5zZWxlY3Qoc2ltaWxhcml0eUV4cHIpO1xuICAgICAgdGhpcy5rbmV4UXVlcnkub3JkZXJCeVJhdyhgPz8sID8/ICR7b3BlcmF0b3J9ID86OnZlY3RvcmAsIFtcbiAgICAgICAgZGlzdGluY3RPbixcbiAgICAgICAgY29sdW1uLFxuICAgICAgICB2ZWN0b3JMaXRlcmFsLFxuICAgICAgXSk7XG5cbiAgICAgIHRoaXMua25leFF1ZXJ5ID0gdGhpcy5rbmV4XG4gICAgICAgIC5mcm9tKHRoaXMua25leFF1ZXJ5LmFzKFwiZGlzdGluY3RfdmVjdG9yc1wiKSlcbiAgICAgICAgLnNlbGVjdChcIipcIilcbiAgICAgICAgLm9yZGVyQnkoXCJzaW1pbGFyaXR5XCIsIFwiZGVzY1wiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5rbmV4UXVlcnkuc2VsZWN0KHNpbWlsYXJpdHlFeHByKTtcbiAgICAgIHRoaXMua25leFF1ZXJ5Lm9yZGVyQnlSYXcoYD8/ICR7b3BlcmF0b3J9ID86OnZlY3RvcmAsIFtjb2x1bW4sIHZlY3RvckxpdGVyYWxdKTtcbiAgICB9XG5cbiAgICAvLyB0aHJlc2hvbGRcbiAgICBpZiAoaXNOdW1iZXJWYWx1ZSh0aHJlc2hvbGQpKSB7XG4gICAgICBpZiAoIU51bWJlci5pc0Zpbml0ZSh0aHJlc2hvbGQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB2ZWN0b3JTaW1pbGFyaXR5IHRocmVzaG9sZDogJHt0aHJlc2hvbGR9YCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChkaXN0aW5jdE9uKSB7XG4gICAgICAgIGNvbnN0IHRocmVzaG9sZE9wID0gbWV0aG9kID09PSBcImwyXCIgPyBcIjw9XCIgOiBcIj49XCI7XG4gICAgICAgIHRoaXMua25leFF1ZXJ5LndoZXJlKFwic2ltaWxhcml0eVwiLCB0aHJlc2hvbGRPcCwgdGhyZXNob2xkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHRocmVzaG9sZFZhbHVlID1cbiAgICAgICAgICBtZXRob2QgPT09IFwiY29zaW5lXCIgPyAxIC0gdGhyZXNob2xkIDogbWV0aG9kID09PSBcImlubmVyX3Byb2R1Y3RcIiA/IC10aHJlc2hvbGQgOiB0aHJlc2hvbGQ7XG4gICAgICAgIHRoaXMua25leFF1ZXJ5LndoZXJlUmF3KGA/PyAke29wZXJhdG9yfSA/Ojp2ZWN0b3IgPD0gP2AsIFtcbiAgICAgICAgICBjb2x1bW4sXG4gICAgICAgICAgdmVjdG9yTGl0ZXJhbCxcbiAgICAgICAgICB0aHJlc2hvbGRWYWx1ZSxcbiAgICAgICAgXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU0FGRVRZOiDsv7zrpqwg67mM642U7J2YIOygnOuEpOumrSDqs4Tslb3qs7wg7ISg7ZaJIOqygOymneydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICByZXR1cm4gdGhpcyBhcyBhbnk7XG4gIH1cblxuICAvLyDquLDrs7gg7L+866asIOuplOyEnOuTnOuTpFxuICBsaW1pdChjb3VudDogbnVtYmVyKTogdGhpcyB7XG4gICAgaWYgKGNvdW50IDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBsaW1pdDogbXVzdCBiZSA+PSAwXCIpO1xuICAgIH1cbiAgICB0aGlzLmtuZXhRdWVyeS5saW1pdChjb3VudCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBvZmZzZXQoY291bnQ6IG51bWJlcik6IHRoaXMge1xuICAgIGlmIChjb3VudCA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgb2Zmc2V0OiBtdXN0IGJlID49IDBcIik7XG4gICAgfVxuICAgIHRoaXMua25leFF1ZXJ5Lm9mZnNldChjb3VudCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBHUk9VUCBCWVxuICBncm91cEJ5PFRDb2x1bW5zIGV4dGVuZHMgUmVzdWx0QXZhaWxhYmxlQ29sdW1uczxUVGFibGVzLCBUUmVzdWx0Pj4oLi4uY29sdW1uczogVENvbHVtbnNbXSk6IHRoaXM7XG4gIGdyb3VwQnkoLi4uY29sdW1uczogc3RyaW5nW10pOiB0aGlzIHtcbiAgICB0aGlzLmtuZXhRdWVyeS5ncm91cEJ5KC4uLmNvbHVtbnMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gSEFWSU5HXG4gIGhhdmluZyhjb25kaXRpb246IHN0cmluZyk6IHRoaXM7XG4gIGhhdmluZzxUQ29sdW1uIGV4dGVuZHMgUmVzdWx0QXZhaWxhYmxlQ29sdW1uczxUVGFibGVzLCBUUmVzdWx0Pj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IsXG4gICAgdmFsdWU6IGFueSxcbiAgKTogdGhpcztcbiAgLy8gSEFWSU5HIOq1rO2YhFxuICBoYXZpbmcoLi4uY29uZGl0aW9uczogYW55W10pOiB0aGlzIHtcbiAgICBpZiAoY29uZGl0aW9ucy5sZW5ndGggPT09IDEpIHtcbiAgICAgIC8vIGhhdmluZyhcIkNPVU5UKCopID4gMTBcIilcbiAgICAgIHRoaXMua25leFF1ZXJ5LmhhdmluZyh0aGlzLmtuZXgucmF3KGNvbmRpdGlvbnNbMF0pKTtcbiAgICB9IGVsc2UgaWYgKGNvbmRpdGlvbnMubGVuZ3RoID09PSAzKSB7XG4gICAgICAvLyBoYXZpbmcoXCJjb3VudFwiLCBcIj5cIiwgMTApXG4gICAgICB0aGlzLmtuZXhRdWVyeS5oYXZpbmcoXG4gICAgICAgIHRoaXMua25leC5yYXcoY29uZGl0aW9uc1swXSksXG4gICAgICAgIGNvbmRpdGlvbnNbMV0sXG4gICAgICAgIHRoaXMua25leC5yYXcoY29uZGl0aW9uc1syXSksXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGhhdmluZyBhcmd1bWVudHNcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8g7Iuk7ZaJIOuplOyEnOuTnOuTpCAtIHRoZW5hYmxlIOq1rO2YhFxuICB0aGVuPFRSZXN1bHQxID0gRXhwYW5kPFRSZXN1bHQ+W10sIFRSZXN1bHQyID0gbmV2ZXI+KFxuICAgIG9uZnVsZmlsbGVkPzogKCh2YWx1ZTogRXhwYW5kPFRSZXN1bHQ+W10pID0+IFRSZXN1bHQxIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDE+KSB8IG51bGwsXG4gICAgb25yZWplY3RlZD86ICgocmVhc29uOiBhbnkpID0+IFRSZXN1bHQyIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDI+KSB8IG51bGwsXG4gICk6IFByb21pc2U8VFJlc3VsdDEgfCBUUmVzdWx0Mj4ge1xuICAgIE5haXRlLnQoXCJwdXJpOmV4ZWN1dGVkLXF1ZXJ5XCIsIHRoaXMudG9RdWVyeSgpKTtcbiAgICAvLyBTQUZFVFk6IOy/vOumrCDruYzrjZTsnZgg7KCc64Sk66atIOqzhOyVveqzvCDshKDtlokg6rKA7Kad7J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgIHJldHVybiB0aGlzLmtuZXhRdWVyeS50aGVuKG9uZnVsZmlsbGVkIGFzIGFueSwgb25yZWplY3RlZCk7XG4gIH1cbiAgY2F0Y2g8VFJlc3VsdDIgPSBuZXZlcj4oXG4gICAgb25yZWplY3RlZD86ICgocmVhc29uOiBhbnkpID0+IFRSZXN1bHQyIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDI+KSB8IG51bGwsXG4gICk6IFByb21pc2U8VFJlc3VsdCB8IFRSZXN1bHQyPiB7XG4gICAgcmV0dXJuIHRoaXMua25leFF1ZXJ5LmNhdGNoKG9ucmVqZWN0ZWQpO1xuICB9XG4gIGZpbmFsbHkob25maW5hbGx5PzogKCgpID0+IHZvaWQpIHwgbnVsbCk6IFByb21pc2U8VFJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLmtuZXhRdWVyeS5maW5hbGx5KG9uZmluYWxseSk7XG4gIH1cblxuICAvLyDtlZjrgpjrp4wg7L+866asXG4gIGZpcnN0KCk6IFJlc29sdmVkUHVyaTxFeHBhbmQ8VFJlc3VsdD4sIG5ldmVyPiB7XG4gICAgdGhpcy5rbmV4UXVlcnkuZmlyc3QoKTtcbiAgICByZXR1cm4gbmV3IFJlc29sdmVkUHVyaSh0aGlzLmtuZXhRdWVyeSwgdGhpcy5rbmV4LCB0aGlzLnRhYmxlU3BlYyk7XG4gIH1cblxuICAvLyDsv7zrpqztlZwg66CI7L2U65Oc7JeQ7IScIO2KueyglSDsu6zrn7zrp4wg7LaU7Lac7ZWcIOuwsOyXtCDrpqzthLRcbiAgcGx1Y2s8VENvbHVtbiBleHRlbmRzIGtleW9mIFRSZXN1bHQgfCBSZXN1bHRBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXMsIFRSZXN1bHQ+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICk6IFJlc29sdmVkUHVyaTxcbiAgICBUQ29sdW1uIGV4dGVuZHMga2V5b2YgVFJlc3VsdFxuICAgICAgPyBUUmVzdWx0W1RDb2x1bW5dW11cbiAgICAgIDogRXh0cmFjdENvbHVtblR5cGU8VFRhYmxlcywgVENvbHVtbiAmIHN0cmluZz5bXSxcbiAgICBuZXZlclxuICA+IHtcbiAgICAvLyBTQUZFVFk6IOy/vOumrCDruYzrjZTsnZgg7KCc64Sk66atIOqzhOyVveqzvCDshKDtlokg6rKA7Kad7J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgIHRoaXMua25leFF1ZXJ5LnBsdWNrKGNvbHVtbiBhcyBzdHJpbmcpO1xuICAgIHJldHVybiBuZXcgUmVzb2x2ZWRQdXJpKHRoaXMua25leFF1ZXJ5LCB0aGlzLmtuZXgsIHRoaXMudGFibGVTcGVjKTtcbiAgfVxuXG4gIC8vIElOU0VSVCA6IOuLqOydvCDqsJ3ssrRcbiAgaW5zZXJ0KFxuICAgIGRhdGE6IEluc2VydERhdGE8U2luZ2xlVGFibGVWYWx1ZTxUVGFibGVzPj4sXG4gICk6IFJlc29sdmVkUHVyaTxJbnNlcnRSZXN1bHQsIFNpbmdsZVRhYmxlVmFsdWU8VFRhYmxlcz4+O1xuICAvLyBJTlNFUlQ6IOuwsOyXtFxuICBpbnNlcnQoXG4gICAgZGF0YTogSW5zZXJ0RGF0YTxTaW5nbGVUYWJsZVZhbHVlPFRUYWJsZXM+PltdLFxuICApOiBSZXNvbHZlZFB1cmk8SW5zZXJ0UmVzdWx0LCBTaW5nbGVUYWJsZVZhbHVlPFRUYWJsZXM+PjtcbiAgLy8gSU5TRVJUIOyLpOygnCDqtaztmIRcbiAgaW5zZXJ0KFxuICAgIHJhd0RhdGE6IEluc2VydERhdGE8U2luZ2xlVGFibGVWYWx1ZTxUVGFibGVzPj4gfCBJbnNlcnREYXRhPFNpbmdsZVRhYmxlVmFsdWU8VFRhYmxlcz4+W10sXG4gICk6IFJlc29sdmVkUHVyaTxJbnNlcnRSZXN1bHQsIFNpbmdsZVRhYmxlVmFsdWU8VFRhYmxlcz4+IHtcbiAgICAvLyBKU09OIOy7rOufvCBzdHJpbmdpZnkg66Gc7KeB7J2EIOuplOyEnOuTnOuhnCDrtoTrpqztlZjsl6wg7KSR67O1IOygnOqxsFxuICAgIGNvbnN0IHJlZmluZWREYXRhID0gdGhpcy5yZWZpbmVKc29uQ29sdW1ucyhyYXdEYXRhKTtcbiAgICB0aGlzLmtuZXhRdWVyeS5pbnNlcnQocmVmaW5lZERhdGEpO1xuICAgIHJldHVybiBuZXcgUmVzb2x2ZWRQdXJpKHRoaXMua25leFF1ZXJ5LCB0aGlzLmtuZXgsIHRoaXMudGFibGVTcGVjKTtcbiAgfVxuXG4gIC8vIFVQREFURVxuICB1cGRhdGUocmF3RGF0YTogV2hlcmVDb25kaXRpb248VFRhYmxlcz4pOiBSZXNvbHZlZFB1cmk8bnVtYmVyLCBTaW5nbGVUYWJsZVZhbHVlPFRUYWJsZXM+PiB7XG4gICAgLy8gSlNPTiDsu6zrn7wgc3RyaW5naWZ5IOuhnOyngeydhCDrqZTshJzrk5zroZwg67aE66as7ZWY7JesIOykkeuztSDsoJzqsbBcbiAgICBjb25zdCByZWZpbmVkRGF0YSA9IHRoaXMucmVmaW5lSnNvbkNvbHVtbnMocmF3RGF0YSk7XG4gICAgdGhpcy5rbmV4UXVlcnkudXBkYXRlKHJlZmluZWREYXRhKTtcbiAgICByZXR1cm4gbmV3IFJlc29sdmVkUHVyaSh0aGlzLmtuZXhRdWVyeSwgdGhpcy5rbmV4LCB0aGlzLnRhYmxlU3BlYyk7XG4gIH1cblxuICAvKipcbiAgICogSlNPTiDsu6zrn7zsl5Ag64yA7ZW0IHN0cmluZ2lmeSDsspjrpqzrpbwg7IiY7ZaJ7ZWY64qUIOuCtOu2gCDrqZTshJzrk5zsnoXri4jri6QuXG4gICAqIG9iamVjdCDrmJDripQgb2JqZWN0IOuwsOyXtOydhCDrsJvqs6AsIEpTT04g7Lus65+87J20IOyeiOycvOuptCDsp4HroKztmZTtlZjsl6wg67CY7ZmY7ZWp64uI64ukLlxuICAgKiDsp4HsoJEg6rCS7J2EIOuzgOqyve2VmOuvgOuhnCBzaWRlIGVmZmVjdOqwgCDsnojsirXri4jri6QuXG4gICAqL1xuICBwcml2YXRlIHJlZmluZUpzb25Db2x1bW5zPFJvdyBleHRlbmRzIG9iamVjdD4oZGF0YTogUm93IHwgUm93W10pOiB0eXBlb2YgZGF0YSB7XG4gICAgLy8gdGFibGVTcGVj7J2064KYIGpzb25Db2x1bW5zIOyXhuuKlCDqsr3smrAg67CU66GcIOuwmO2ZmFxuICAgIGlmICghdGhpcy50YWJsZVNwZWMgfHwgIXRoaXMudGFibGVTcGVjLmpzb25Db2x1bW5zLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgLy8g65Ox66Gd65CcIFRhYmxlU3BlY+ydhCDthrXtlbQgSlNPTuy7rOufvCDrqqnroZ3snYQg6rCA7KC47JmAIEpTT04uc3RyaW5naWZ5IOyymOumrFxuICAgIGNvbnN0IGpzb25Db2x1bW5zID0gdGhpcy50YWJsZVNwZWMuanNvbkNvbHVtbnM7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBkYXRhKSB7XG4gICAgICAgIGZvciAoY29uc3QgY29sdW1uIG9mIGpzb25Db2x1bW5zKSB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBPYmplY3QuZW50cmllcyhpdGVtKS5maW5kKChba2V5XSkgPT4ga2V5ID09PSBjb2x1bW4pPy5bMV07XG4gICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oaXRlbSwge1xuICAgICAgICAgICAgICBbY29sdW1uXTogc2VyaWFsaXplSnNvbkNvbHVtblZhbHVlKHRoaXMudGFibGVTcGVjLCBjb2x1bW4sIHZhbHVlKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiBqc29uQ29sdW1ucykge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IE9iamVjdC5lbnRyaWVzKGRhdGEpLmZpbmQoKFtrZXldKSA9PiBrZXkgPT09IGNvbHVtbik/LlsxXTtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICBPYmplY3QuYXNzaWduKGRhdGEsIHtcbiAgICAgICAgICAgIFtjb2x1bW5dOiBzZXJpYWxpemVKc29uQ29sdW1uVmFsdWUodGhpcy50YWJsZVNwZWMsIGNvbHVtbiwgdmFsdWUpLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgLy8gSW5jcmVtZW50XG4gIGluY3JlbWVudDxUQ29sdW1uIGV4dGVuZHMgTnVtZXJpY0NvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICB2YWx1ZTogbnVtYmVyLFxuICApOiBSZXNvbHZlZFB1cmk8bnVtYmVyLCBTaW5nbGVUYWJsZVZhbHVlPFRUYWJsZXM+PiB7XG4gICAgaWYgKHZhbHVlIDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkluY3JlbWVudCB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwXCIpO1xuICAgIH1cbiAgICB0aGlzLmtuZXhRdWVyeS5pbmNyZW1lbnQoY29sdW1uLCB2YWx1ZSk7XG4gICAgcmV0dXJuIG5ldyBSZXNvbHZlZFB1cmkodGhpcy5rbmV4UXVlcnksIHRoaXMua25leCwgdGhpcy50YWJsZVNwZWMpO1xuICB9XG4gIC8vIERlY3JlbWVudFxuICBkZWNyZW1lbnQ8VENvbHVtbiBleHRlbmRzIE51bWVyaWNDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWU6IG51bWJlcixcbiAgKTogUmVzb2x2ZWRQdXJpPG51bWJlciwgU2luZ2xlVGFibGVWYWx1ZTxUVGFibGVzPj4ge1xuICAgIGlmICh2YWx1ZSA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEZWNyZW1lbnQgdmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gMFwiKTtcbiAgICB9XG4gICAgdGhpcy5rbmV4UXVlcnkuZGVjcmVtZW50KGNvbHVtbiwgdmFsdWUpO1xuICAgIHJldHVybiBuZXcgUmVzb2x2ZWRQdXJpKHRoaXMua25leFF1ZXJ5LCB0aGlzLmtuZXgsIHRoaXMudGFibGVTcGVjKTtcbiAgfVxuXG4gIC8vIERFTEVURVxuICBkZWxldGUoKTogUmVzb2x2ZWRQdXJpPG51bWJlciwgU2luZ2xlVGFibGVWYWx1ZTxUVGFibGVzPj4ge1xuICAgIHRoaXMua25leFF1ZXJ5LmRlbGV0ZSgpO1xuICAgIHJldHVybiBuZXcgUmVzb2x2ZWRQdXJpKHRoaXMua25leFF1ZXJ5LCB0aGlzLmtuZXgsIHRoaXMudGFibGVTcGVjKTtcbiAgfVxuXG4gIC8vIO2ZleyduCDsv7zrpqwg66as7YS0XG4gIHRvUXVlcnkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5rbmV4UXVlcnkudG9RdWVyeSgpO1xuICB9XG5cbiAgLy8g7L+866asIOuUlOuyhOq5hSDroZzqt7gg7Lac66ClXG4gIGRlYnVnKCk6IHRoaXMge1xuICAgIGNvbnNvbGUubG9nKGAke2NoYWxrLmN5YW4oXCJbUHVyaSBEZWJ1Z11cIil9ICR7Y2hhbGsueWVsbG93KHRoaXMudG9RdWVyeSgpKX1gKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGNsb25lKCk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcywgVFJlc3VsdD4ge1xuICAgIC8vICdkdWFsJ+ydgCDrjZTrr7gg7YWM7J2067iU7J2066mwLCDrsJTroZwg7JWE656YIOykhOyXkOyEnCBrbmV4UXVlcnnqsIAg642u7Ja07JSM7JuM7KeR64uI64ukLlxuICAgIGNvbnN0IG5ld1B1cmkgPSBuZXcgUHVyaTxUU2NoZW1hLCBUVGFibGVzLCBUUmVzdWx0Pih0aGlzLmtuZXgsIFwiZHVhbFwiKTtcbiAgICBuZXdQdXJpLmtuZXhRdWVyeSA9IHRoaXMua25leFF1ZXJ5LmNsb25lKCk7XG4gICAgbmV3UHVyaS50YWJsZVNwZWMgPSB0aGlzLnRhYmxlU3BlYztcbiAgICBuZXdQdXJpLmNvcnJlbGF0aW9uUmVnaXN0cnkgPSBuZXcgTWFwKHRoaXMuY29ycmVsYXRpb25SZWdpc3RyeSk7XG4gICAgcmV0dXJuIG5ld1B1cmk7XG4gIH1cblxuICBmb3JtYXRTUUwodW5mb3JtYXR0ZWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gU1FMIOyYiOyVveyWtCDrqqnroZ1cbiAgICBjb25zdCBrZXl3b3JkcyA9IFtcbiAgICAgIFwiU0VMRUNUXCIsXG4gICAgICBcIkZST01cIixcbiAgICAgIFwiV0hFUkVcIixcbiAgICAgIFwiSU5TRVJUXCIsXG4gICAgICBcIklOVE9cIixcbiAgICAgIFwiVkFMVUVTXCIsXG4gICAgICBcIlVQREFURVwiLFxuICAgICAgXCJERUxFVEVcIixcbiAgICAgIFwiQ1JFQVRFXCIsXG4gICAgICBcIlRBQkxFXCIsXG4gICAgICBcIkFMVEVSXCIsXG4gICAgICBcIkRST1BcIixcbiAgICAgIFwiSk9JTlwiLFxuICAgICAgXCJPTlwiLFxuICAgICAgXCJJTk5FUlwiLFxuICAgICAgXCJMRUZUXCIsXG4gICAgICBcIlJJR0hUXCIsXG4gICAgICBcIkZVTExcIixcbiAgICAgIFwiT1VURVJcIixcbiAgICAgIFwiR1JPVVBcIixcbiAgICAgIFwiQllcIixcbiAgICAgIFwiT1JERVJcIixcbiAgICAgIFwiSEFWSU5HXCIsXG4gICAgICBcIkRJU1RJTkNUXCIsXG4gICAgICBcIkxJTUlUXCIsXG4gICAgICBcIk9GRlNFVFwiLFxuICAgICAgXCJBU1wiLFxuICAgICAgXCJBTkRcIixcbiAgICAgIFwiT1JcIixcbiAgICAgIFwiTk9UXCIsXG4gICAgICBcIklOXCIsXG4gICAgICBcIkxJS0VcIixcbiAgICAgIFwiSVNcIixcbiAgICAgIFwiTlVMTFwiLFxuICAgICAgXCJDQVNFXCIsXG4gICAgICBcIldIRU5cIixcbiAgICAgIFwiVEhFTlwiLFxuICAgICAgXCJFTFNFXCIsXG4gICAgICBcIkVORFwiLFxuICAgICAgXCJVTklPTlwiLFxuICAgICAgXCJBTExcIixcbiAgICAgIFwiRVhJU1RTXCIsXG4gICAgICBcIkJFVFdFRU5cIixcbiAgICBdO1xuXG4gICAgbGV0IGZvcm1hdHRlZCA9IHVuZm9ybWF0dGVkO1xuXG4gICAgLy8g7JiI7JW97Ja066W8IOuMgOusuOyekOuhnCDrs4DtmZhcbiAgICBrZXl3b3Jkcy5mb3JFYWNoKChrZXl3b3JkKSA9PiB7XG4gICAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoYFxcXFxiJHtrZXl3b3JkfVxcXFxiYCwgXCJnaVwiKTtcbiAgICAgIGZvcm1hdHRlZCA9IGZvcm1hdHRlZC5yZXBsYWNlKHJlZ2V4LCBrZXl3b3JkLnRvVXBwZXJDYXNlKCkpO1xuICAgIH0pO1xuXG4gICAgLy8g7KO87JqUIOygiCDslZ7sl5Ag7KSE67CU6r+IIOy2lOqwgFxuICAgIGNvbnN0IG1ham9yQ2xhdXNlcyA9IFtcbiAgICAgIFwiU0VMRUNUXCIsXG4gICAgICBcIkZST01cIixcbiAgICAgIFwiV0hFUkVcIixcbiAgICAgIFwiR1JPVVAgQllcIixcbiAgICAgIFwiT1JERVIgQllcIixcbiAgICAgIFwiSEFWSU5HXCIsXG4gICAgICBcIkxJTUlUXCIsXG4gICAgICBcIlVOSU9OXCIsXG4gICAgXTtcbiAgICBtYWpvckNsYXVzZXMuZm9yRWFjaCgoY2xhdXNlKSA9PiB7XG4gICAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoYFxcXFxzKygke2NsYXVzZX0pXFxcXHMrYCwgXCJnaVwiKTtcbiAgICAgIGZvcm1hdHRlZCA9IGZvcm1hdHRlZC5yZXBsYWNlKHJlZ2V4LCBgXFxuJHtjbGF1c2UudG9VcHBlckNhc2UoKX0gYCk7XG4gICAgfSk7XG5cbiAgICAvLyBKT0lOIOygiCDsspjrpqxcbiAgICBmb3JtYXR0ZWQgPSBmb3JtYXR0ZWQucmVwbGFjZSgvXFxzKygoPzpJTk5FUnxMRUZUfFJJR0hUfEZVTEwgT1VURVIpXFxzKyk/Sk9JTlxccysvZ2ksIFwiXFxuJDFKT0lOIFwiKTtcblxuICAgIC8vIEFORCwgT1Ig7KGw6rG0IOyymOumrFxuICAgIGZvcm1hdHRlZCA9IGZvcm1hdHRlZC5yZXBsYWNlKC9cXHMrKEFORHxPUilcXHMrL2dpLCBcIlxcbiAgJDEgXCIpO1xuXG4gICAgLy8g6rSE7Zi4IOyymOumrCDrsI8g65Ok7Jes7JOw6riwXG4gICAgY29uc3QgbGluZXMgPSBmb3JtYXR0ZWQuc3BsaXQoXCJcXG5cIik7XG4gICAgY29uc3QgaW5kZW50ZWRMaW5lcyA9IFtdO1xuICAgIGxldCBpbmRlbnRMZXZlbCA9IDA7XG5cbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgIGNvbnN0IHRyaW1tZWRMaW5lID0gbGluZS50cmltKCk7XG4gICAgICBpZiAoIXRyaW1tZWRMaW5lKSBjb250aW51ZTtcblxuICAgICAgLy8g64ur64qUIOq0hO2YuOqwgCDsnojsnLzrqbQg65Ok7Jes7JOw6riwIOugiOuyqCDqsJDshoxcbiAgICAgIGNvbnN0IGNsb3NpbmdQYXJlbnMgPSAodHJpbW1lZExpbmUubWF0Y2goL1xcKS9nKSB8fCBbXSkubGVuZ3RoO1xuICAgICAgY29uc3Qgb3BlbmluZ1BhcmVucyA9ICh0cmltbWVkTGluZS5tYXRjaCgvXFwoL2cpIHx8IFtdKS5sZW5ndGg7XG5cbiAgICAgIGlmIChjbG9zaW5nUGFyZW5zID4gMCAmJiBvcGVuaW5nUGFyZW5zID09PSAwKSB7XG4gICAgICAgIGluZGVudExldmVsID0gTWF0aC5tYXgoMCwgaW5kZW50TGV2ZWwgLSBjbG9zaW5nUGFyZW5zKTtcbiAgICAgIH1cblxuICAgICAgLy8g7ZiE7J6sIOuTpOyXrOyTsOq4sCDsoIHsmqlcbiAgICAgIGNvbnN0IGluZGVudCA9IFwiICBcIi5yZXBlYXQoaW5kZW50TGV2ZWwpO1xuICAgICAgaW5kZW50ZWRMaW5lcy5wdXNoKGluZGVudCArIHRyaW1tZWRMaW5lKTtcblxuICAgICAgLy8g7Jes64qUIOq0hO2YuOqwgCDsnojsnLzrqbQg65Ok7Jes7JOw6riwIOugiOuyqCDspp3qsIBcbiAgICAgIGlmIChvcGVuaW5nUGFyZW5zID4gY2xvc2luZ1BhcmVucykge1xuICAgICAgICBpbmRlbnRMZXZlbCArPSBvcGVuaW5nUGFyZW5zIC0gY2xvc2luZ1BhcmVucztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gaW5kZW50ZWRMaW5lcy5qb2luKFwiXFxuXCIpLnRyaW0oKTtcbiAgfVxuXG4gIHJhdyhzcWw6IHN0cmluZyk6IEtuZXguUmF3IHtcbiAgICByZXR1cm4gdGhpcy5rbmV4LnJhdyhzcWwpO1xuICB9XG5cbiAgLy8gS25leCDsv7zrpqwg67mM642UIOyngeygkSDsoJHqt7xcbiAgcmF3UXVlcnkoKTogS25leC5RdWVyeUJ1aWxkZXIge1xuICAgIHJldHVybiB0aGlzLmtuZXhRdWVyeTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgV2hlcmVHcm91cDxUVGFibGVzIGV4dGVuZHMgb2JqZWN0PiB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgYnVpbGRlcjogS25leC5RdWVyeUJ1aWxkZXIpIHt9XG5cbiAgLy8gd2hlcmUg66mU7ISc65Oc65OkXG4gIHdoZXJlKGNvbmRpdGlvbnM6IFdoZXJlQ29uZGl0aW9uPFRUYWJsZXM+KTogdGhpcztcbiAgd2hlcmU8VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICB2YWx1ZTogRXh0cmFjdENvbHVtblR5cGU8VFRhYmxlcywgVENvbHVtbiAmIHN0cmluZz4sXG4gICk6IHRoaXM7XG4gIHdoZXJlPFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgb3BlcmF0b3I6IFdoZXJlT3BlcmF0b3IsXG4gICAgdmFsdWU6IEV4dHJhY3RDb2x1bW5UeXBlPFRUYWJsZXMsIFRDb2x1bW4gJiBzdHJpbmc+LFxuICApOiB0aGlzO1xuICB3aGVyZSguLi5hcmdzOiBhbnlbXSk6IFdoZXJlR3JvdXA8VFRhYmxlcz4ge1xuICAgIHRoaXMuYnVpbGRlci53aGVyZShhcmdzWzBdLCAuLi5hcmdzLnNsaWNlKDEpKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIHdoZXJlSW4gLyB3aGVyZU5vdEluIOuplOyEnOuTnOuTpFxuICB3aGVyZUluPFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWVzOiAoRXh0cmFjdENvbHVtblR5cGU8VFRhYmxlcywgVENvbHVtbiAmIHN0cmluZz4gJiBLbmV4LlZhbHVlKVtdLFxuICApOiB0aGlzO1xuICB3aGVyZUluKC4uLmFyZ3M6IGFueVtdKTogV2hlcmVHcm91cDxUVGFibGVzPiB7XG4gICAgdGhpcy5idWlsZGVyLndoZXJlSW4oYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB3aGVyZU5vdEluPFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWVzOiAoRXh0cmFjdENvbHVtblR5cGU8VFRhYmxlcywgVENvbHVtbiAmIHN0cmluZz4gJiBLbmV4LlZhbHVlKVtdLFxuICApOiB0aGlzO1xuICB3aGVyZU5vdEluKC4uLmFyZ3M6IGFueVtdKTogV2hlcmVHcm91cDxUVGFibGVzPiB7XG4gICAgdGhpcy5idWlsZGVyLndoZXJlTm90SW4oYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBvcldoZXJlIOuplOyEnOuTnOuTpFxuICBvcldoZXJlKGNvbmRpdGlvbnM6IFdoZXJlQ29uZGl0aW9uPFRUYWJsZXM+KTogdGhpcztcbiAgb3JXaGVyZTxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIHZhbHVlOiBFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUQ29sdW1uICYgc3RyaW5nPixcbiAgKTogdGhpcztcbiAgb3JXaGVyZTxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIG9wZXJhdG9yOiBXaGVyZU9wZXJhdG9yLFxuICAgIHZhbHVlOiBFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUQ29sdW1uICYgc3RyaW5nPixcbiAgKTogdGhpcztcbiAgb3JXaGVyZSguLi5hcmdzOiBhbnlbXSk6IFdoZXJlR3JvdXA8VFRhYmxlcz4ge1xuICAgIHRoaXMuYnVpbGRlci5vcldoZXJlKGFyZ3NbMF0sIC4uLmFyZ3Muc2xpY2UoMSkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gb3JXaGVyZUluIC8gb3JXaGVyZU5vdEluIOuplOyEnOuTnOuTpFxuICBvcldoZXJlSW48VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICB2YWx1ZXM6IChFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUQ29sdW1uICYgc3RyaW5nPiAmIEtuZXguVmFsdWUpW10sXG4gICk6IHRoaXM7XG4gIG9yV2hlcmVJbiguLi5hcmdzOiBhbnlbXSk6IFdoZXJlR3JvdXA8VFRhYmxlcz4ge1xuICAgIHRoaXMuYnVpbGRlci5vcldoZXJlSW4oYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBvcldoZXJlTm90SW48VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICB2YWx1ZXM6IChFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUQ29sdW1uICYgc3RyaW5nPiAmIEtuZXguVmFsdWUpW10sXG4gICk6IHRoaXM7XG4gIG9yV2hlcmVOb3RJbiguLi5hcmdzOiBhbnlbXSk6IFdoZXJlR3JvdXA8VFRhYmxlcz4ge1xuICAgIHRoaXMuYnVpbGRlci5vcldoZXJlTm90SW4oYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBXSEVSRSBKU09OQiBTVVBFUlNFVCAoQD4pXG4gIHdoZXJlSnNvblN1cGVyc2V0T2Y8VENvbHVtbiBleHRlbmRzIEpzb25Db2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWU6IEpzb25TdXBlcnNldFZhbHVlPEV4dHJhY3RDb2x1bW5UeXBlPFRUYWJsZXMsIFRDb2x1bW4+PixcbiAgKTogdGhpcyB7XG4gICAgdGhpcy5idWlsZGVyLndoZXJlSnNvblN1cGVyc2V0T2YoY29sdW1uLCBzZXJpYWxpemVKc29uU3VwZXJzZXRWYWx1ZSh2YWx1ZSkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgb3JXaGVyZUpzb25TdXBlcnNldE9mPFRDb2x1bW4gZXh0ZW5kcyBKc29uQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIHZhbHVlOiBKc29uU3VwZXJzZXRWYWx1ZTxFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUQ29sdW1uPj4sXG4gICk6IHRoaXMge1xuICAgIHRoaXMuYnVpbGRlci5vcldoZXJlSnNvblN1cGVyc2V0T2YoY29sdW1uLCBzZXJpYWxpemVKc29uU3VwZXJzZXRWYWx1ZSh2YWx1ZSkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgd2hlcmVKc29uS2V5RXhpc3RzKGNvbHVtbjogSnNvbkNvbHVtbnM8VFRhYmxlcz4sIGtleTogc3RyaW5nKTogdGhpcyB7XG4gICAgdGhpcy5idWlsZGVyLndoZXJlUmF3KFwiPz8gXFxcXD8gP1wiLCBbY29sdW1uLCBrZXldKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIG9yV2hlcmVKc29uS2V5RXhpc3RzKGNvbHVtbjogSnNvbkNvbHVtbnM8VFRhYmxlcz4sIGtleTogc3RyaW5nKTogdGhpcyB7XG4gICAgdGhpcy5idWlsZGVyLm9yV2hlcmVSYXcoXCI/PyBcXFxcPyA/XCIsIFtjb2x1bW4sIGtleV0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gV0hFUkUgTUFUQ0hcbiAgd2hlcmVNYXRjaDxUQ29sdW1uIGV4dGVuZHMgRnVsbHRleHRDb2x1bW5zPFRUYWJsZXM+Pihjb2x1bW46IFRDb2x1bW4sIHZhbHVlOiBzdHJpbmcpOiB0aGlzO1xuICB3aGVyZU1hdGNoKC4uLmFyZ3M6IGFueVtdKTogdGhpcyB7XG4gICAgdGhpcy5idWlsZGVyLndoZXJlUmF3KGBNQVRDSCAoJHtTdHJpbmcoYXJnc1swXSl9KSBBR0FJTlNUICg/KWAsIFthcmdzWzFdXSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBvcldoZXJlTWF0Y2g8VENvbHVtbiBleHRlbmRzIEZ1bGx0ZXh0Q29sdW1uczxUVGFibGVzPj4oY29sdW1uOiBUQ29sdW1uLCB2YWx1ZTogc3RyaW5nKTogdGhpcztcbiAgb3JXaGVyZU1hdGNoKC4uLmFyZ3M6IGFueVtdKTogdGhpcyB7XG4gICAgdGhpcy5idWlsZGVyLm9yV2hlcmVSYXcoYE1BVENIICgke1N0cmluZyhhcmdzWzBdKX0pIEFHQUlOU1QgKD8pYCwgW2FyZ3NbMV1dKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIFdIRVJFIFNFQVJDSFxuICB3aGVyZVNlYXJjaDxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uIHwgVENvbHVtbltdLFxuICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIHdlaWdodHM/OiBudW1iZXJbXTsgLy8g7KCV7IiYIOuwsOyXtFxuICAgIH0sXG4gICk6IHRoaXM7XG4gIHdoZXJlU2VhcmNoKC4uLmFyZ3M6IGFueVtdKTogdGhpcyB7XG4gICAgY29uc3QgeyB3ZWlnaHRzIH0gPSBhcmdzWzJdID8/IHt9O1xuICAgIGNvbnN0IGNvbHVtbkV4cHIgPSBBcnJheS5pc0FycmF5KGFyZ3NbMF0pXG4gICAgICA/IGBBUlJBWVske2FyZ3NbMF0ubWFwKChjKSA9PiBgJHtjfTo6dGV4dGApLmpvaW4oXCIsXCIpfV1gXG4gICAgICA6IGFyZ3NbMF07XG4gICAgY29uc3QgcGdyb29uZ2FDb25kaXRpb24gPSBgcGdyb29uZ2FfY29uZGl0aW9uKD8ke3dlaWdodHM/Lmxlbmd0aCA/IGAsIHdlaWdodHMgPT4gQVJSQVlbJHt3ZWlnaHRzLmpvaW4oXCIsXCIpfV1gIDogXCJcIn0pYDtcbiAgICB0aGlzLmJ1aWxkZXIud2hlcmVSYXcoYCR7Y29sdW1uRXhwcn0gJkB+ICR7cGdyb29uZ2FDb25kaXRpb259YCwgW2FyZ3NbMV1dKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgb3JXaGVyZVNlYXJjaDxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uIHwgVENvbHVtbltdLFxuICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIHdlaWdodHM/OiBudW1iZXJbXTsgLy8g7KCV7IiYIOuwsOyXtFxuICAgIH0sXG4gICk6IHRoaXM7XG4gIG9yV2hlcmVTZWFyY2goLi4uYXJnczogYW55W10pOiB0aGlzIHtcbiAgICBjb25zdCB7IHdlaWdodHMgfSA9IGFyZ3NbMl0gPz8ge307XG4gICAgY29uc3QgY29sdW1uRXhwciA9IEFycmF5LmlzQXJyYXkoYXJnc1swXSlcbiAgICAgID8gYEFSUkFZWyR7YXJnc1swXS5tYXAoKGMpID0+IGAke2N9Ojp0ZXh0YCkuam9pbihcIixcIil9XWBcbiAgICAgIDogYXJnc1swXTtcbiAgICBjb25zdCBwZ3Jvb25nYUNvbmRpdGlvbiA9IGBwZ3Jvb25nYV9jb25kaXRpb24oPyR7d2VpZ2h0cz8ubGVuZ3RoID8gYCwgd2VpZ2h0cyA9PiBBUlJBWVske3dlaWdodHMuam9pbihcIixcIil9XWAgOiBcIlwifSlgO1xuICAgIHRoaXMuYnVpbGRlci5vcldoZXJlUmF3KGAke2NvbHVtbkV4cHJ9ICZAfiAke3Bncm9vbmdhQ29uZGl0aW9ufWAsIFthcmdzWzFdXSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIFdIRVJFIEZVTExURVhUXG4gIHdoZXJlVHNTZWFyY2g8VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4gfCBTdHJpbmdTcWxFeHByZXNzaW9uPihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWU6IHN0cmluZyxcbiAgICBvcHRpb25zPzogVHNRdWVyeU9wdGlvbnMgfCBUc1F1ZXJ5Q29uZmlnLFxuICApOiB0aGlzO1xuICB3aGVyZVRzU2VhcmNoKC4uLmFyZ3M6IGFueVtdKTogdGhpcyB7XG4gICAgY29uc3Qgb3B0cyA9XG4gICAgICAvLyBTQUZFVFk6IOy/vOumrCDruYzrjZTsnZgg7KCc64Sk66atIOqzhOyVveqzvCDshKDtlokg6rKA7Kad7J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgICAgaXNTdHJpbmdWYWx1ZShhcmdzWzJdKSA/ICh7IGNvbmZpZzogYXJnc1syXSB9IGFzIFRzUXVlcnlPcHRpb25zKSA6IChhcmdzWzJdID8/IHt9KTtcblxuICAgIGNvbnN0IHBhcnNlciA9IG9wdHMucGFyc2VyID8/IFwid2Vic2VhcmNoX3RvX3RzcXVlcnlcIjtcbiAgICBjb25zdCBjb25maWcgPSBvcHRzLmNvbmZpZyA/PyBcInNpbXBsZVwiO1xuICAgIGNvbnN0IGNvbHVtbkV4cHIgPSBpc1NxbEV4cHJlc3Npb24oYXJnc1swXSkgPyBhcmdzWzBdW1wiX3NxbFwiXSA6IFN0cmluZyhhcmdzWzBdKTtcbiAgICBjb25zdCBwYXJhbXMgPSBpc1NxbEV4cHJlc3Npb24oYXJnc1swXSlcbiAgICAgID8gWy4uLmFyZ3NbMF1bXCJfcGFyYW1zXCJdLCBjb25maWcsIGFyZ3NbMV1dXG4gICAgICA6IFtjb25maWcsIGFyZ3NbMV1dO1xuXG4gICAgdGhpcy5idWlsZGVyLndoZXJlUmF3KGAke2NvbHVtbkV4cHJ9IEBAICR7cGFyc2VyfSg/LCA/KWAsIHBhcmFtcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBvcldoZXJlVHNTZWFyY2g8VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4gfCBTdHJpbmdTcWxFeHByZXNzaW9uPihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWU6IHN0cmluZyxcbiAgICBvcHRpb25zPzogVHNRdWVyeU9wdGlvbnMgfCBUc1F1ZXJ5Q29uZmlnLFxuICApOiB0aGlzO1xuICBvcldoZXJlVHNTZWFyY2goLi4uYXJnczogYW55W10pOiB0aGlzIHtcbiAgICBjb25zdCBvcHRzID1cbiAgICAgIC8vIFNBRkVUWTog7L+866asIOu5jOuNlOydmCDsoJzrhKTrpq0g6rOE7JW96rO8IOyEoO2WiSDqsoDspp3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgICBpc1N0cmluZ1ZhbHVlKGFyZ3NbMl0pID8gKHsgY29uZmlnOiBhcmdzWzJdIH0gYXMgVHNRdWVyeU9wdGlvbnMpIDogKGFyZ3NbMl0gPz8ge30pO1xuXG4gICAgY29uc3QgcGFyc2VyID0gb3B0cy5wYXJzZXIgPz8gXCJ3ZWJzZWFyY2hfdG9fdHNxdWVyeVwiO1xuICAgIGNvbnN0IGNvbmZpZyA9IG9wdHMuY29uZmlnID8/IFwic2ltcGxlXCI7XG4gICAgY29uc3QgY29sdW1uRXhwciA9IGlzU3FsRXhwcmVzc2lvbihhcmdzWzBdKSA/IGFyZ3NbMF1bXCJfc3FsXCJdIDogU3RyaW5nKGFyZ3NbMF0pO1xuICAgIGNvbnN0IHBhcmFtcyA9IGlzU3FsRXhwcmVzc2lvbihhcmdzWzBdKVxuICAgICAgPyBbLi4uYXJnc1swXVtcIl9wYXJhbXNcIl0sIGNvbmZpZywgYXJnc1sxXV1cbiAgICAgIDogW2NvbmZpZywgYXJnc1sxXV07XG5cbiAgICB0aGlzLmJ1aWxkZXIub3JXaGVyZVJhdyhgJHtjb2x1bW5FeHByfSBAQCAke3BhcnNlcn0oPywgPylgLCBwYXJhbXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgd2hlcmVGdXp6eTxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPiB8IFN0cmluZ1NxbEV4cHJlc3Npb24+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICB2YWx1ZTogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiB7XG4gICAgICBvcGVyYXRvcj86IEZ1enp5T3BlcmF0b3I7XG4gICAgfSxcbiAgKTogdGhpcztcbiAgd2hlcmVGdXp6eSguLi5hcmdzOiBhbnlbXSk6IHRoaXMge1xuICAgIGNvbnN0IG9wZXJhdG9yID0gcGFyc2VGdXp6eU9wZXJhdG9yKGFyZ3NbMl0/Lm9wZXJhdG9yKTtcblxuICAgIGlmIChvcGVyYXRvciA9PT0gXCIlXCIpIHtcbiAgICAgIGlmIChpc1NxbEV4cHJlc3Npb24oYXJnc1swXSkpIHtcbiAgICAgICAgdGhpcy5idWlsZGVyLndoZXJlUmF3KGAke2FyZ3NbMF1bXCJfc3FsXCJdfSAke29wZXJhdG9yfSA/YCwgWy4uLmFyZ3NbMF1bXCJfcGFyYW1zXCJdLCBhcmdzWzFdXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmJ1aWxkZXIud2hlcmVSYXcoYD8/ICR7b3BlcmF0b3J9ID9gLCBbYXJnc1swXSwgYXJnc1sxXV0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgaWYgKGlzU3FsRXhwcmVzc2lvbihhcmdzWzBdKSkge1xuICAgICAgdGhpcy5idWlsZGVyLndoZXJlUmF3KGA/ICR7b3BlcmF0b3J9ICR7YXJnc1swXVtcIl9zcWxcIl19YCwgW2FyZ3NbMV0sIC4uLmFyZ3NbMF1bXCJfcGFyYW1zXCJdXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYnVpbGRlci53aGVyZVJhdyhgPyAke29wZXJhdG9yfSA/P2AsIFthcmdzWzFdLCBhcmdzWzBdXSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgb3JXaGVyZUZ1enp5PFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+IHwgU3RyaW5nU3FsRXhwcmVzc2lvbj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIG9wZXJhdG9yPzogRnV6enlPcGVyYXRvcjtcbiAgICB9LFxuICApOiB0aGlzO1xuICBvcldoZXJlRnV6enkoLi4uYXJnczogYW55W10pOiB0aGlzIHtcbiAgICBjb25zdCBvcGVyYXRvciA9IHBhcnNlRnV6enlPcGVyYXRvcihhcmdzWzJdPy5vcGVyYXRvcik7XG5cbiAgICBpZiAob3BlcmF0b3IgPT09IFwiJVwiKSB7XG4gICAgICBpZiAoaXNTcWxFeHByZXNzaW9uKGFyZ3NbMF0pKSB7XG4gICAgICAgIHRoaXMuYnVpbGRlci5vcldoZXJlUmF3KGAke2FyZ3NbMF1bXCJfc3FsXCJdfSAke29wZXJhdG9yfSA/YCwgW1xuICAgICAgICAgIC4uLmFyZ3NbMF1bXCJfcGFyYW1zXCJdLFxuICAgICAgICAgIGFyZ3NbMV0sXG4gICAgICAgIF0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5idWlsZGVyLm9yV2hlcmVSYXcoYD8/ICR7b3BlcmF0b3J9ID9gLCBbYXJnc1swXSwgYXJnc1sxXV0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgaWYgKGlzU3FsRXhwcmVzc2lvbihhcmdzWzBdKSkge1xuICAgICAgdGhpcy5idWlsZGVyLm9yV2hlcmVSYXcoYD8gJHtvcGVyYXRvcn0gJHthcmdzWzBdW1wiX3NxbFwiXX1gLCBbYXJnc1sxXSwgLi4uYXJnc1swXVtcIl9wYXJhbXNcIl1dKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5idWlsZGVyLm9yV2hlcmVSYXcoYD8gJHtvcGVyYXRvcn0gPz9gLCBbYXJnc1sxXSwgYXJnc1swXV0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIOykkeyyqSDqt7jro7lcbiAgd2hlcmVHcm91cChjYWxsYmFjazogKGc6IFdoZXJlR3JvdXA8VFRhYmxlcz4pID0+IHZvaWQpOiB0aGlzO1xuICB3aGVyZUdyb3VwKGNhbGxiYWNrOiAoZzogV2hlcmVHcm91cDxUVGFibGVzPikgPT4gdm9pZCk6IFdoZXJlR3JvdXA8VFRhYmxlcz4ge1xuICAgIHRoaXMuYnVpbGRlci53aGVyZSgoc3ViQnVpbGRlcikgPT4ge1xuICAgICAgY29uc3Qgc3ViR3JvdXAgPSBuZXcgV2hlcmVHcm91cDxUVGFibGVzPihzdWJCdWlsZGVyKTtcbiAgICAgIGNhbGxiYWNrKHN1Ykdyb3VwKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBvcldoZXJlR3JvdXAoY2FsbGJhY2s6IChnOiBXaGVyZUdyb3VwPFRUYWJsZXM+KSA9PiB2b2lkKTogdGhpcztcbiAgb3JXaGVyZUdyb3VwKGNhbGxiYWNrOiAoZzogV2hlcmVHcm91cDxUVGFibGVzPikgPT4gdm9pZCk6IFdoZXJlR3JvdXA8VFRhYmxlcz4ge1xuICAgIHRoaXMuYnVpbGRlci5vcldoZXJlKChzdWJCdWlsZGVyKSA9PiB7XG4gICAgICBjb25zdCBzdWJHcm91cCA9IG5ldyBXaGVyZUdyb3VwPFRUYWJsZXM+KHN1YkJ1aWxkZXIpO1xuICAgICAgY2FsbGJhY2soc3ViR3JvdXApO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG5cbi8vIEpPSU4g7KCIIOq3uOujueyXkOuKlCBMZWZ07JmAIFJpZ2h07JeQIOuMgO2VnCDsiJzshJzqsIAg7ZWE7JqU7ZWY7KeAIOyViuycvOuvgOuhnCwg66qo65OgIOqyveyasOydmCDsiJjrpbwg6rOE7IKw7ZW07JW87ZWoLlxuZXhwb3J0IGNsYXNzIEpvaW5DbGF1c2VHcm91cDxUTGVmdCBleHRlbmRzIG9iamVjdCwgVFJpZ2h0IGV4dGVuZHMgb2JqZWN0PiB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2FsbGJhY2s6IEtuZXguSm9pbkNsYXVzZSkge31cblxuICAvLyBPTihBTkQpOiDsu6zrn7wgPSDsu6zrn7xcbiAgb24obGVmdDogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sIHJpZ2h0OiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4pOiB0aGlzO1xuICBvbihsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4sIHJpZ2h0OiBBdmFpbGFibGVDb2x1bW5zPFRMZWZ0Pik6IHRoaXM7XG4gIC8vIE9OKEFORCk6IOy7rOufvCA9IOqwklxuICBvbihcbiAgICBsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRMZWZ0PixcbiAgICByaWdodDogRXh0cmFjdENvbHVtblR5cGU8VExlZnQsIEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+ICYgc3RyaW5nPixcbiAgKTogdGhpcztcbiAgb24oXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+LFxuICAgIHJpZ2h0OiBFeHRyYWN0Q29sdW1uVHlwZTxUUmlnaHQsIEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0PiAmIHN0cmluZz4sXG4gICk6IHRoaXM7XG4gIC8vIE9OKEFORCk6IOy7rOufvCAo7Jew7IKw7J6QKSDsu6zrn7xcbiAgb24oXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sXG4gICAgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvcixcbiAgICByaWdodDogQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+LFxuICApOiB0aGlzO1xuICBvbihcbiAgICBsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4sXG4gICAgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvcixcbiAgICByaWdodDogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sXG4gICk6IHRoaXM7XG4gIC8vIE9OKEFORCk6IOy7rOufvCAo7Jew7IKw7J6QKSDqsJJcbiAgb24oXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sXG4gICAgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvcixcbiAgICByaWdodDogRXh0cmFjdENvbHVtblR5cGU8VExlZnQsIEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+ICYgc3RyaW5nPixcbiAgKTogdGhpcztcbiAgb24oXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+LFxuICAgIG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IsXG4gICAgcmlnaHQ6IEV4dHJhY3RDb2x1bW5UeXBlPFRSaWdodCwgQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+ICYgc3RyaW5nPixcbiAgKTogdGhpcztcbiAgLy8gT04oQU5EKTog7L2c67CxXG4gIG9uKGNhbGxiYWNrOiAobmVzdGVkOiBKb2luQ2xhdXNlR3JvdXA8VExlZnQsIFRSaWdodD4pID0+IHZvaWQpOiB0aGlzO1xuICBvbihjYWxsYmFjazogKG5lc3RlZDogSm9pbkNsYXVzZUdyb3VwPFRSaWdodCwgVExlZnQ+KSA9PiB2b2lkKTogdGhpcztcbiAgLy8gT04oQU5EKSDqtaztmIRcbiAgb24oLi4uYXJnczogYW55W10pOiB0aGlzIHtcbiAgICAvLyBTQUZFVFk6IOy/vOumrCDruYzrjZTsnZgg7KCc64Sk66atIOqzhOyVveqzvCDshKDtlokg6rKA7Kad7J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgIHRoaXMuY2FsbGJhY2sub24oLi4uKGFyZ3MgYXMgW3N0cmluZywgc3RyaW5nXSkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gT04oT1IpOiDsu6zrn7wgPSDsu6zrn7xcbiAgb3JPbihsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRMZWZ0PiwgcmlnaHQ6IEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0Pik6IHRoaXM7XG4gIG9yT24obGVmdDogQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+LCByaWdodDogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4pOiB0aGlzO1xuICAvLyBPTihPUik6IOy7rOufvCA9IOqwklxuICBvck9uKFxuICAgIGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+LFxuICAgIHJpZ2h0OiBFeHRyYWN0Q29sdW1uVHlwZTxUTGVmdCwgQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4gJiBzdHJpbmc+LFxuICApOiB0aGlzO1xuICBvck9uKFxuICAgIGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0PixcbiAgICByaWdodDogRXh0cmFjdENvbHVtblR5cGU8VFJpZ2h0LCBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4gJiBzdHJpbmc+LFxuICApOiB0aGlzO1xuICAvLyBPTihPUik6IOy7rOufvCAo7Jew7IKw7J6QKSDsu6zrn7xcbiAgb3JPbihcbiAgICBsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRMZWZ0PixcbiAgICBvcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yLFxuICAgIHJpZ2h0OiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4sXG4gICk6IHRoaXM7XG4gIG9yT24oXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+LFxuICAgIG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IsXG4gICAgcmlnaHQ6IEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+LFxuICApOiB0aGlzO1xuICAvLyBPTihPUik6IOy7rOufvCAo7Jew7IKw7J6QKSDqsJJcbiAgb3JPbihcbiAgICBsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRMZWZ0PixcbiAgICBvcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yLFxuICAgIHJpZ2h0OiBFeHRyYWN0Q29sdW1uVHlwZTxUTGVmdCwgQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4gJiBzdHJpbmc+LFxuICApOiB0aGlzO1xuICBvck9uKFxuICAgIGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0PixcbiAgICBvcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yLFxuICAgIHJpZ2h0OiBFeHRyYWN0Q29sdW1uVHlwZTxUUmlnaHQsIEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0PiAmIHN0cmluZz4sXG4gICk6IHRoaXM7XG4gIC8vIE9OKE9SKTog7L2c67CxXG4gIG9yT24oY2FsbGJhY2s6IChuZXN0ZWQ6IEpvaW5DbGF1c2VHcm91cDxUTGVmdCwgVFJpZ2h0PikgPT4gdm9pZCk6IHRoaXM7XG4gIG9yT24oY2FsbGJhY2s6IChuZXN0ZWQ6IEpvaW5DbGF1c2VHcm91cDxUUmlnaHQsIFRMZWZ0PikgPT4gdm9pZCk6IHRoaXM7XG4gIC8vIE9OKE9SKSDqtaztmIRcbiAgb3JPbiguLi5hcmdzOiBhbnlbXSk6IHRoaXMge1xuICAgIC8vIFNBRkVUWTog7L+866asIOu5jOuNlOydmCDsoJzrhKTrpq0g6rOE7JW96rO8IOyEoO2WiSDqsoDspp3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgdGhpcy5jYWxsYmFjay5vck9uKC4uLihhcmdzIGFzIFtzdHJpbmcsIHN0cmluZ10pKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIE9OIFZBTChBTkQpOiDsu6zrn7wgPSDqsJIgKOqwkuydhCDsu6zrn7wg7LC47KGw6rCAIOyVhOuLjCDtjIzrnbzrr7jthLDroZwg67CU7J2465SpKVxuICBvblZhbChjb2x1bW46IEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+LCB2YWx1ZTogYW55KTogdGhpcztcbiAgb25WYWwoY29sdW1uOiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4sIHZhbHVlOiBhbnkpOiB0aGlzO1xuICBvblZhbChjb2x1bW46IEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+LCBvcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yLCB2YWx1ZTogYW55KTogdGhpcztcbiAgb25WYWwoY29sdW1uOiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4sIG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IsIHZhbHVlOiBhbnkpOiB0aGlzO1xuICBvblZhbCguLi5hcmdzOiBhbnlbXSk6IHRoaXMge1xuICAgIC8vIFNBRkVUWTog7L+866asIOu5jOuNlOydmCDsoJzrhKTrpq0g6rOE7JW96rO8IOyEoO2WiSDqsoDspp3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgKHRoaXMuY2FsbGJhY2sgYXMgYW55KS5vblZhbCguLi5hcmdzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIEFORCBPTiBWQUw6IG9uVmFs7J2YIOuqheyLnOyggSBhbGlhcyAoS25leCDtmLjtmZgpXG4gIGFuZE9uVmFsKGNvbHVtbjogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sIHZhbHVlOiBhbnkpOiB0aGlzO1xuICBhbmRPblZhbChjb2x1bW46IEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0PiwgdmFsdWU6IGFueSk6IHRoaXM7XG4gIGFuZE9uVmFsKGNvbHVtbjogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sIG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IsIHZhbHVlOiBhbnkpOiB0aGlzO1xuICBhbmRPblZhbChjb2x1bW46IEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0Piwgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvciwgdmFsdWU6IGFueSk6IHRoaXM7XG4gIGFuZE9uVmFsKC4uLmFyZ3M6IGFueVtdKTogdGhpcyB7XG4gICAgLy8gU0FGRVRZOiDsv7zrpqwg67mM642U7J2YIOygnOuEpOumrSDqs4Tslb3qs7wg7ISg7ZaJIOqygOymneydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAodGhpcy5jYWxsYmFjayBhcyBhbnkpLmFuZE9uVmFsKC4uLmFyZ3MpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gT1IgT04gVkFMOiBPUiDsobDqsbTsnLzroZwg6rCSIOuwlOyduOuUqVxuICBvck9uVmFsKGNvbHVtbjogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sIHZhbHVlOiBhbnkpOiB0aGlzO1xuICBvck9uVmFsKGNvbHVtbjogQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+LCB2YWx1ZTogYW55KTogdGhpcztcbiAgb3JPblZhbChjb2x1bW46IEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+LCBvcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yLCB2YWx1ZTogYW55KTogdGhpcztcbiAgb3JPblZhbChjb2x1bW46IEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0Piwgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvciwgdmFsdWU6IGFueSk6IHRoaXM7XG4gIG9yT25WYWwoLi4uYXJnczogYW55W10pOiB0aGlzIHtcbiAgICAvLyBTQUZFVFk6IOy/vOumrCDruYzrjZTsnZgg7KCc64Sk66atIOqzhOyVveqzvCDshKDtlokg6rKA7Kad7J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgICh0aGlzLmNhbGxiYWNrIGFzIGFueSkub3JPblZhbCguLi5hcmdzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuXG4vKlxuICBUUmVzb2x2ZWQ6IOy/vOumrCDsi6Ttlokg7ZuEIOuwmO2ZmOuQoCDqsrDqs7wg7YOA7J6FXG4gIFRSZXR1cm5pbmc6IFJFVFVSTklORyDsoIjsl5Ag7IKs7Jqp65CgIO2DgOyehVxuKi9cbmV4cG9ydCBjbGFzcyBSZXNvbHZlZFB1cmk8VFJlc29sdmVkLCBUUmV0dXJuaW5nPiBpbXBsZW1lbnRzIFByb21pc2U8VFJlc29sdmVkPiB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBrbmV4UXVlcnk6IEtuZXguUXVlcnlCdWlsZGVyLFxuICAgIHByaXZhdGUga25leDogS25leCxcbiAgICBwcml2YXRlIHRhYmxlU3BlYzogVGFibGVTcGVjIHwgbnVsbCA9IG51bGwsXG4gICkge31cblxuICBbU3ltYm9sLnRvU3RyaW5nVGFnXTogc3RyaW5nID0gXCJQcm9taXNlXCI7XG5cbiAgdG9RdWVyeSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmtuZXhRdWVyeS50b1F1ZXJ5KCk7XG4gIH1cblxuICBkZWJ1ZygpOiB0aGlzIHtcbiAgICBjb25zb2xlLmxvZyhgJHtjaGFsay5jeWFuKFwiW1B1cmkgRGVidWddXCIpfSAke2NoYWxrLnllbGxvdyh0aGlzLnRvUXVlcnkoKSl9YCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB0aGVuPFRSZXN1bHQxID0gVFJlc29sdmVkLCBUUmVzdWx0MiA9IG5ldmVyPihcbiAgICBvbmZ1bGZpbGxlZD86ICgodmFsdWU6IFRSZXNvbHZlZCkgPT4gVFJlc3VsdDEgfCBQcm9taXNlTGlrZTxUUmVzdWx0MT4pIHwgbnVsbCxcbiAgICBvbnJlamVjdGVkPzogKChyZWFzb246IGFueSkgPT4gVFJlc3VsdDIgfCBQcm9taXNlTGlrZTxUUmVzdWx0Mj4pIHwgbnVsbCxcbiAgKTogUHJvbWlzZTxUUmVzdWx0MSB8IFRSZXN1bHQyPiB7XG4gICAgTmFpdGUudChcInB1cmk6ZXhlY3V0ZWQtcXVlcnlcIiwgdGhpcy50b1F1ZXJ5KCkpO1xuICAgIC8vIFNBRkVUWTog7L+866asIOu5jOuNlOydmCDsoJzrhKTrpq0g6rOE7JW96rO8IOyEoO2WiSDqsoDspp3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgcmV0dXJuIHRoaXMua25leFF1ZXJ5LnRoZW4ob25mdWxmaWxsZWQgYXMgYW55LCBvbnJlamVjdGVkKTtcbiAgfVxuXG4gIGNhdGNoPFRSZXN1bHQyID0gbmV2ZXI+KFxuICAgIG9ucmVqZWN0ZWQ/OiAoKHJlYXNvbjogYW55KSA9PiBUUmVzdWx0MiB8IFByb21pc2VMaWtlPFRSZXN1bHQyPikgfCBudWxsLFxuICApOiBQcm9taXNlPFRSZXNvbHZlZCB8IFRSZXN1bHQyPiB7XG4gICAgcmV0dXJuIHRoaXMua25leFF1ZXJ5LmNhdGNoKG9ucmVqZWN0ZWQpO1xuICB9XG5cbiAgZmluYWxseShvbmZpbmFsbHk/OiAoKCkgPT4gdm9pZCkgfCBudWxsKTogUHJvbWlzZTxUUmVzb2x2ZWQ+IHtcbiAgICByZXR1cm4gdGhpcy5rbmV4UXVlcnkuZmluYWxseShvbmZpbmFsbHkpO1xuICB9XG5cbiAgLy8gT04gQ09ORkxJQ1QgLSDsu6zrn7wg6riw67CYXG4gIG9uQ29uZmxpY3Q8VFRhYmxlcyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIFRSZXR1cm5pbmc+PihcbiAgICBjb2x1bW5zOiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgICBhY3Rpb24/OiBPbkNvbmZsaWN0QWN0aW9uPFRUYWJsZXM+LFxuICApOiB0aGlzIHtcbiAgICBjb25zdCB0YXJnZXQgPSBBcnJheS5pc0FycmF5KGNvbHVtbnMpID8gY29sdW1ucyA6IFtjb2x1bW5zXTtcblxuICAgIGlmICghYWN0aW9uIHx8IGFjdGlvbiA9PT0gXCJub3RoaW5nXCIpIHtcbiAgICAgIC8vIERPIE5PVEhJTkdcbiAgICAgIHRoaXMua25leFF1ZXJ5Lm9uQ29uZmxpY3QodGFyZ2V0KS5pZ25vcmUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRE8gVVBEQVRFXG4gICAgICBjb25zdCB7IHVwZGF0ZSB9ID0gYWN0aW9uO1xuXG4gICAgICAvLyBhY3Rpb24udXBkYXRlIOuwsOyXtCDtmJXtg5wgOiBbXCJuYW1lXCIsIFwiZW1haWxcIl1cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHVwZGF0ZSkpIHtcbiAgICAgICAgdGhpcy5rbmV4UXVlcnkub25Db25mbGljdCh0YXJnZXQpLm1lcmdlKHVwZGF0ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBhY3Rpb24udXBkYXRlIOqwneyytCDtmJXtg5w6IHsgbmFtZTogXCJKb2huXCIsIGNvdW50OiByYXcoLi4uKSB9XG4gICAgICAgIGNvbnN0IG1lcmdlT2JqID0ge307XG5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModXBkYXRlKSkge1xuICAgICAgICAgIGNvbnN0IG1lcmdlZFZhbHVlID0gaXNTcWxFeHByZXNzaW9uKHZhbHVlKVxuICAgICAgICAgICAgPyB0aGlzLmtuZXgucmF3KHZhbHVlW1wiX3NxbFwiXSlcbiAgICAgICAgICAgIDogc2VyaWFsaXplSnNvbkNvbHVtblZhbHVlKHRoaXMudGFibGVTcGVjLCBrZXksIHZhbHVlKTtcbiAgICAgICAgICBPYmplY3QuYXNzaWduKG1lcmdlT2JqLCB7IFtrZXldOiBtZXJnZWRWYWx1ZSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMua25leFF1ZXJ5Lm9uQ29uZmxpY3QodGFyZ2V0KS5tZXJnZShtZXJnZU9iaik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBSRVRVUk5JTkc6IFwiKlwiIC0g7KCE7LK0IOy7rOufvFxuICByZXR1cm5pbmcoY29sdW1uOiBcIipcIik6IFJlc29sdmVkUHVyaTxUUmV0dXJuaW5nW10sIG5ldmVyPjtcbiAgLy8gUkVUVVJOSU5HOiDri6jsnbwg7Lus65+8XG4gIHJldHVybmluZzxUQ29sdW1uIGV4dGVuZHMgQ29sdW1uS2V5czxUUmV0dXJuaW5nPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICApOiBSZXNvbHZlZFB1cmk8UGljazxUUmV0dXJuaW5nLCBUQ29sdW1uPltdLCBuZXZlcj47XG4gIC8vIFJFVFVSTklORzog67O17IiYIOy7rOufvCAo67Cw7Je0KVxuICByZXR1cm5pbmc8VENvbHVtbiBleHRlbmRzIENvbHVtbktleXM8VFJldHVybmluZz4+KFxuICAgIGNvbHVtbnM6IFRDb2x1bW5bXSxcbiAgKTogUmVzb2x2ZWRQdXJpPFBpY2s8VFJldHVybmluZywgVENvbHVtbj5bXSwgbmV2ZXI+O1xuICAvLyBSRVRVUk5JTkcg6rWs7ZiEXG4gIHJldHVybmluZyhjb2x1bW5PckNvbHVtbnM6IHN0cmluZyB8IHN0cmluZ1tdKTogUmVzb2x2ZWRQdXJpPGFueVtdLCBuZXZlcj4ge1xuICAgIHRoaXMua25leFF1ZXJ5LnJldHVybmluZyhjb2x1bW5PckNvbHVtbnMpO1xuICAgIHJldHVybiBuZXcgUmVzb2x2ZWRQdXJpKHRoaXMua25leFF1ZXJ5LCB0aGlzLmtuZXgsIHRoaXMudGFibGVTcGVjKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFxR0EsU0FBZ0IsbUJBQW1CLFVBQWtDO0NBQ25FLE1BQU0sYUFBYSxVQUFVLEtBQUssS0FBSztDQUN2QyxNQUFNLGdCQUFnQixnQkFBZ0IsTUFBTSxjQUFjLGNBQWMsVUFBVTtDQUVsRixJQUFJLENBQUMsZUFDSCxNQUFNLElBQUksTUFBTSwyQkFBMkIsWUFBWSxJQUFJO0NBRzdELE9BQU87QUFDVDtBQUVBLFNBQVMsMkJBQWtDLE9BQXNCO0NBQy9ELE1BQU0sYUFBYSxLQUFLLFVBQVUsS0FBSztDQUV2QyxJQUFJLGVBQWUsUUFDakIsTUFBTSxJQUFJLFVBQ1IsNEZBQ0Y7Q0FHRixPQUFPO0FBQ1Q7QUFFQSxTQUFTLHlCQUNQLFdBQ0EsUUFDQSxPQUNnQjtDQUNoQixJQUFJLENBQUMsV0FBVyxZQUFZLFNBQVMsTUFBTSxLQUFLLFVBQVUsVUFBYSxVQUFVLE1BQy9FLE9BQU87Q0FHVCxPQUFPLEtBQUssVUFBVSxLQUFLO0FBQzdCO0FBRUEsU0FBUywwQkFBMEIsWUFBa0MsT0FBNkI7Q0FDaEcsSUFBSSxjQUFjLFNBQVMsY0FBYyxRQUN2QyxNQUFNLElBQUksTUFBTSw0QkFBNEIsV0FBVztDQUd6RCxPQUFPO0FBQ1Q7QUFFQSxTQUFTLHNCQUFzQixPQUF3RDtDQUNyRixJQUFJLFVBQVUsUUFDWjtDQUdGLElBQUksVUFBVSxXQUFXLFVBQVUsUUFDakMsTUFBTSxJQUFJLE1BQU0sd0JBQXdCLE9BQU87Q0FHakQsT0FBTztBQUNUO0FBRUEsU0FBUyxrQkFBa0IsT0FBa0M7Q0FDM0QsSUFBSSxDQUFDLE9BQ0gsT0FBTztDQUdULE9BQU8sVUFBVSxNQUFNLFlBQVk7QUFDckM7QUFFQSxTQUFTLGlCQUNQLE9BQ3FEO0NBQ3JELE9BQU8sTUFBTSxRQUFRLEtBQUs7QUFDNUI7QUFFQSxTQUFTLGdCQUF1QixPQUFpRDtDQUMvRSxPQUFPLGNBQWMsS0FBSyxLQUFLLFdBQVcsU0FBUyxNQUFNLGFBQWE7QUFDeEU7QUFFQSxTQUFTLG9CQUEyQixPQUFzRDtDQUN4RixPQUFPLGdCQUFnQixLQUFLO0FBQzlCO0FBRUEsU0FBUyxxQkFDUCxPQUNnQztDQUNoQyxPQUFPLGNBQWMsS0FBSyxLQUFLLEVBQUUsV0FBVztBQUM5Qzs7O0NBOUt3RCxvQkFBQTtDQUVsQixXQUFBO0NBTVAsbUJBQUE7Q0FpQ2UsZ0JBQUE7Q0F1SWpDLE9BQWIsTUFBYSxLQUErQztFQVNqRDtFQVJUO0VBQ0EsWUFBc0M7RUFDdEMsc0NBQThCLElBQUksSUFBcUM7RUFLdkUsWUFDRSxNQUNBLG1CQUNBO0dBRk8sS0FBQSxPQUFBO0dBR1AsSUFBSSxjQUFjLGlCQUFpQixHQUFHO0lBRXBDLEtBQUssWUFBWSxLQUFLLEtBQUssaUJBQWlCLENBQUMsQ0FBQyxLQUFLLGlCQUFpQjtJQUNwRSxLQUFLLFlBQVksS0FBSyxpQkFBaUIsaUJBQWlCO0lBQ3hELEtBQUssb0JBQW9CLElBQUksbUJBQW1CO0tBQzlDLE1BQU07S0FDTixPQUFPO0tBQ1AsT0FBTztJQUNULENBQUM7R0FDSCxPQUFPLElBQUksY0FBYyxpQkFBaUIsR0FBRztJQUMzQyxNQUFNLFVBQVUsT0FBTyxRQUFRLGlCQUFpQjtJQUNoRCxJQUFJLFFBQVEsV0FBVyxHQUNyQixNQUFNLElBQUksTUFBTSx3Q0FBd0M7SUFFMUQsT0FBTyxRQUFRLEVBQUU7SUFDakIsTUFBTSxDQUFDLE9BQU8sVUFBVSxRQUFRO0lBQ2hDLElBQUksY0FBYyxNQUFNLEdBQUc7S0FDekIsS0FBSyxZQUFZLEtBQUssS0FBSyxNQUFNLENBQUMsQ0FBQyxLQUFLLEdBQUcsUUFBUSxPQUFPLENBQUM7S0FDM0QsS0FBSyxZQUFZLEtBQUssaUJBQWlCLE1BQU07S0FDN0MsS0FBSyxvQkFBb0IsSUFBSSxPQUFPO01BQUUsTUFBTTtNQUFRO01BQU8sT0FBTztLQUFPLENBQUM7SUFDNUUsT0FBTyxJQUFJLGtCQUFrQixNQUFNO0tBQ2pDLE1BQU0sa0JBQWtCLE9BQU8sU0FBUztLQUN4QyxLQUFLLFlBQVksS0FBSyxLQUFLLEtBQUssZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO0tBQ3pELEtBQUssb0JBQW9CLElBQUksT0FBTztNQUFFLE1BQU07TUFBUTtNQUFPLE9BQU87S0FBSyxDQUFDO0lBQzFFLE9BQ0UsTUFBTSxJQUFJLE1BQU0sNkJBQTZCO0dBRWpELE9BQ0UsTUFBTSxJQUFJLE1BQU0sNkJBQTZCO0VBRWpEO0VBRUEsaUJBQWlCLFdBQXFDO0dBQ3BELElBQUk7SUFDRixPQUFPLGNBQWMsYUFBYSxTQUFTO0dBQzdDLFFBQVE7SUFDTixPQUFPO0dBQ1Q7RUFDRjtFQUdBLE9BQU8sTUFBTSxTQUFpQixLQUE4QjtHQUMxRCxPQUFPO0lBQ0wsT0FBTztJQUNQLFNBQVM7SUFDVCxNQUFNO0lBQ04sU0FBUyxDQUFDLE1BQU07R0FDbEI7RUFDRjtFQUNBLE9BQU8sSUFBSSxRQUF5QztHQUNsRCxPQUFPO0lBQ0wsT0FBTztJQUNQLFNBQVM7SUFDVCxNQUFNO0lBQ04sU0FBUyxDQUFDLE1BQU07R0FDbEI7RUFDRjtFQUNBLE9BQU8sSUFBSSxRQUF5QztHQUNsRCxPQUFPO0lBQ0wsT0FBTztJQUNQLFNBQVM7SUFDVCxNQUFNO0lBQ04sU0FBUyxDQUFDLE1BQU07R0FDbEI7RUFDRjtFQUNBLE9BQU8sSUFBSSxRQUF5QztHQUNsRCxPQUFPO0lBQ0wsT0FBTztJQUNQLFNBQVM7SUFDVCxNQUFNO0lBQ04sU0FBUyxDQUFDLE1BQU07R0FDbEI7RUFDRjtFQUNBLE9BQU8sSUFBSSxRQUF5QztHQUNsRCxPQUFPO0lBQ0wsT0FBTztJQUNQLFNBQVM7SUFDVCxNQUFNO0lBQ04sU0FBUyxDQUFDLE1BQU07R0FDbEI7RUFDRjtFQUNBLE9BQU8sT0FBTyxHQUFHLE1BQXlDO0dBQ3hELE9BQU87SUFDTCxPQUFPO0lBQ1AsU0FBUztJQUNULE1BQU0sVUFBVSxLQUFLLFVBQVUsR0FBRyxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQUU7SUFDL0MsU0FBUztHQUNYO0VBQ0Y7RUFDQSxPQUFPLFNBQVMsWUFBaUMsVUFBMkM7R0FDMUYsT0FBTztJQUNMLE9BQU87SUFDUCxTQUFTO0lBQ1QsTUFBTSxZQUFZLFdBQVcsS0FBSztJQUNsQyxTQUFTLENBQUMsR0FBRyxXQUFXLFNBQVMsUUFBUTtHQUMzQztFQUNGO0VBQ0EsT0FBTyxrQkFBa0IsR0FBRyxNQUFpRTtHQUMzRixPQUFPO0lBQ0wsT0FBTztJQUNQLFNBQVM7SUFDVCxNQUFNLFVBQVUsS0FBSyxLQUFLLFFBQVMsY0FBYyxHQUFHLElBQUksWUFBWSxJQUFJLElBQUssQ0FBQyxDQUFDLEtBQUssSUFBSSxFQUFFO0lBQzFGLFNBQVMsS0FBSyxTQUFTLFFBQVMsY0FBYyxHQUFHLElBQUksQ0FBQyxHQUFHLElBQUksSUFBSSxPQUFRO0dBQzNFO0VBQ0Y7RUFDQSxPQUFPLE1BQU0sUUFBeUM7R0FDcEQsT0FBTztJQUNMLE9BQU87SUFDUCxTQUFTO0lBQ1QsTUFBTTtJQUNOLFNBQVMsQ0FBQyxNQUFNO0dBQ2xCO0VBQ0Y7RUFDQSxPQUFPLE1BQU0sUUFBeUM7R0FDcEQsT0FBTztJQUNMLE9BQU87SUFDUCxTQUFTO0lBQ1QsTUFBTTtJQUNOLFNBQVMsQ0FBQyxNQUFNO0dBQ2xCO0VBQ0Y7RUFPQSxPQUFPLGVBQ0wsUUFDQSxPQUNrQztHQUNsQyxJQUFJLGNBQWMsTUFBTSxHQUN0QixPQUFPO0lBQ0wsT0FBTztJQUNQLFNBQVM7SUFDVCxNQUFNO0lBQ04sU0FBUyxDQUFDLE9BQU8sTUFBTTtHQUN6QjtHQUdGLE9BQU87SUFDTCxPQUFPO0lBQ1AsU0FBUztJQUNULE1BQU0sc0JBQXNCLE9BQU8sUUFBUTtJQUMzQyxTQUFTLENBQUMsT0FBTyxHQUFHLE9BQU8sVUFBVTtHQUN2QztFQUNGO0VBT0EsT0FBTyxXQUNMLFFBQ0EsT0FDa0M7R0FDbEMsSUFBSSxjQUFjLE1BQU0sR0FDdEIsT0FBTztJQUNMLE9BQU87SUFDUCxTQUFTO0lBQ1QsTUFBTTtJQUNOLFNBQVMsQ0FBQyxRQUFRLEtBQUs7R0FDekI7R0FHRixPQUFPO0lBQ0wsT0FBTztJQUNQLFNBQVM7SUFDVCxNQUFNLGNBQWMsT0FBTyxRQUFRO0lBQ25DLFNBQVMsQ0FBQyxHQUFHLE9BQU8sWUFBWSxLQUFLO0dBQ3ZDO0VBQ0Y7RUFPQSxPQUFPLHFCQUNMLFFBQ0EsT0FDa0M7R0FDbEMsSUFBSSxjQUFjLE1BQU0sR0FDdEIsT0FBTztJQUNMLE9BQU87SUFDUCxTQUFTO0lBQ1QsTUFBTTtJQUNOLFNBQVMsQ0FBQyxPQUFPLE1BQU07R0FDekI7R0FHRixPQUFPO0lBQ0wsT0FBTztJQUNQLFNBQVM7SUFDVCxNQUFNLDZCQUE2QixPQUFPLFFBQVE7SUFDbEQsU0FBUyxDQUFDLE9BQU8sR0FBRyxPQUFPLFVBQVU7R0FDdkM7RUFDRjtFQUdBLE9BQU8sVUFBVSxLQUFhLFNBQTRCLENBQUMsR0FBNEI7R0FDckYsT0FBTztJQUFFLE9BQU87SUFBa0IsU0FBUztJQUFVLE1BQU07SUFBSyxTQUFTO0dBQU87RUFDbEY7RUFFQSxPQUFPLGVBQWUsS0FBYSxTQUE0QixDQUFDLEdBQThCO0dBQzVGLE9BQU87SUFBRSxPQUFPO0lBQWtCLFNBQVM7SUFBWSxNQUFNO0lBQUssU0FBUztHQUFPO0VBQ3BGO0VBRUEsT0FBTyxVQUFVLEtBQWEsU0FBNEIsQ0FBQyxHQUE0QjtHQUNyRixPQUFPO0lBQUUsT0FBTztJQUFrQixTQUFTO0lBQVUsTUFBTTtJQUFLLFNBQVM7R0FBTztFQUNsRjtFQUVBLE9BQU8sV0FBVyxLQUFhLFNBQTRCLENBQUMsR0FBNkI7R0FDdkYsT0FBTztJQUFFLE9BQU87SUFBa0IsU0FBUztJQUFXLE1BQU07SUFBSyxTQUFTO0dBQU87RUFDbkY7RUFFQSxPQUFPLFFBQVEsS0FBYSxTQUE0QixDQUFDLEdBQTBCO0dBQ2pGLE9BQU87SUFBRSxPQUFPO0lBQWtCLFNBQVM7SUFBUSxNQUFNO0lBQUssU0FBUztHQUFPO0VBQ2hGOzs7Ozs7Ozs7Ozs7OztFQWVBLE9BQU8sWUFDTCxRQUNBLE9BQ0EsVUFDeUI7R0FDekIsTUFBTSxFQUFFLFNBQVMsd0JBQXdCLFNBQVMsVUFBVSxHQUFHLFlBQVksWUFBWSxDQUFDO0dBRXhGLE1BQU0sZ0JBQWdCLE9BQU8sUUFBUSxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxXQUFXO0lBQ2xFLE9BQU8sR0FBRyxXQUFXLFNBQVMsR0FBRyxFQUFFLEdBQUc7R0FDeEMsQ0FBQztHQUlELE9BQU87SUFDTCxPQUFPO0lBQ1AsU0FBUztJQUNULE1BQU0sc0JBQXNCLE9BQU8sUUFMbkIsY0FBYyxTQUFTLElBQUksTUFBTSxjQUFjLEtBQUssSUFBSSxFQUFFLEtBQUssR0FLMUI7SUFDckQsU0FBUztLQUFDO0tBQVE7S0FBUTtLQUFRO0lBQUs7R0FDekM7RUFDRjtFQUdBLE9BQU8sT0FDTCxRQUNBLE9BQ0EsU0FDeUI7R0FDekIsT0FBTyxLQUFLLFVBQVUsQ0FBQyxXQUFXLFFBQVEsT0FBTyxPQUFPO0VBQzFEO0VBR0EsT0FBTyxTQUNMLFFBQ0EsT0FDQSxTQUN5QjtHQUN6QixPQUFPLEtBQUssVUFBVSxDQUFDLGNBQWMsUUFBUSxPQUFPLE9BQU87RUFDN0Q7RUFFQSxPQUFPLFdBQVcsUUFBZ0IsU0FBaUIsVUFBcUM7R0FDdEYsT0FBTztJQUNMLE9BQU87SUFDUCxTQUFTO0lBQ1QsTUFBTTtJQUNOLFNBQVMsQ0FBQyxRQUFRLE1BQU07R0FDMUI7RUFDRjtFQUVBLE9BQU8sUUFDTCxNQUNBLFFBQ0EsT0FDQSxTQUN5QjtHQUN6QixNQUFNLEVBQ0osU0FBUyx3QkFDVCxTQUFTLFVBQ1QsZUFDQSxZQUNFLFdBQVcsQ0FBQztHQUVoQixNQUFNLFNBQVMsQ0FBQztHQUNoQixJQUFJLGNBQWMsR0FBRyxLQUFLO0dBRTFCLElBQUksU0FBUztJQUNYLGVBQWUsU0FBUyxRQUFRLFVBQVUsR0FBRyxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQUU7SUFDMUQsT0FBTyxLQUFLLEdBQUcsT0FBTztHQUN4QjtHQUVBLElBQUksY0FBYyxNQUFNLEdBQUc7SUFDekIsZUFBZSxPQUFPLE9BQU87SUFDN0IsT0FBTyxLQUFLLFFBQVEsUUFBUSxLQUFLO0dBQ25DLE9BQU87SUFDTCxlQUFlLEdBQUcsT0FBTyxRQUFRLElBQUksT0FBTztJQUM1QyxPQUFPLEtBQUssR0FBRyxPQUFPLFlBQVksUUFBUSxLQUFLO0dBQ2pEO0dBRUEsSUFBSSxlQUFlO0lBQ2pCLGVBQWU7SUFDZixPQUFPLEtBQUssYUFBYTtHQUMzQjtHQUVBLGVBQWU7R0FFZixPQUFPO0lBQUUsT0FBTztJQUFrQixTQUFTO0lBQVUsTUFBTTtJQUFhLFNBQVM7R0FBTztFQUMxRjs7Ozs7Ozs7O0VBVUEsT0FBTyxRQUFpQztHQUN0QyxPQUFPLEtBQUssVUFBVSxnQ0FBZ0M7RUFDeEQ7RUFhQSxPQUFPLFVBQ0wsaUJBQ0EsT0FDcUQ7R0FDckQsTUFBTSxXQUFXLE1BQU0sUUFBUSxLQUFLLElBQUksUUFBUSxDQUFDLEtBQUs7R0FDdEQsTUFBTSxjQUFjLFNBQVMsU0FBUyxVQUFVLEdBQUcsQ0FBQyxDQUFDLEtBQUssSUFBSSxFQUFFO0dBR2hFLElBQUksY0FBYyxlQUFlLEdBQy9CLE9BQU8sS0FBSyxVQUFVLCtCQUErQixZQUFZLElBQUksQ0FDbkUsaUJBQ0EsR0FBRyxRQUNMLENBQUM7R0FJSCxPQUFPLEtBQUssZUFDVixpQ0FBaUMsZ0JBQWdCLFVBQVUsSUFBSSxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQUUsS0FBSyxZQUFZLElBQzdGLENBQUMsR0FBRyxpQkFBaUIsR0FBRyxRQUFRLENBQ2xDO0VBQ0Y7RUFFQSxTQUNFLFFBQ0EsR0FBRyxNQUM0QjtHQUMvQixPQUFPO0lBQ0wsT0FBTztJQUNQLFNBQVM7SUFDVCxNQUFNLGdCQUFnQixLQUFLLFVBQVUsR0FBRyxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQUU7SUFDckQsU0FBUyxDQUFDLFFBQVEsR0FBRyxJQUFJO0dBQzNCO0VBQ0Y7RUFTQSxPQUFPLFdBQStEO0dBRXBFLE1BQU0sYUFBYSxLQUFLLGNBQWMsU0FBUztHQUUvQyxNQUFNLGdCQUF1QyxDQUFDO0dBRTlDLEtBQUssTUFBTSxDQUFDLE9BQU8scUJBQXFCLE9BQU8sUUFBUSxVQUFVLEdBQy9ELElBQUksZ0JBQWdCLGdCQUFnQixHQUVsQyxjQUFjLEtBQ1osS0FBSyxLQUFLLElBQUksR0FBRyxpQkFBaUIsUUFBUSxPQUFPLE1BQU0sSUFBSSxpQkFBaUIsVUFBVSxDQUN4RjtRQUNLO0lBR0wsTUFBTSxhQUFhO0lBQ25CLElBQUksVUFBVSxZQUVaLGNBQWMsS0FBSyxVQUFVO1NBRzdCLGNBQWMsS0FBSyxHQUFHLFdBQVcsTUFBTSxPQUFPO0dBRWxEO0dBR0YsS0FBSyxVQUFVLE9BQU8sYUFBYTtHQUVuQyxPQUFPO0VBQ1Q7Ozs7OztFQU9BLENBQVMscUJBQ1AsV0FDQSxTQUFTLElBQ3dDO0dBQ2pELEtBQUssTUFBTSxDQUFDLEtBQUssVUFBVSxPQUFPLFFBQVEsU0FBUyxHQUFHO0lBQ3BELE1BQU0sVUFBVSxTQUFTLEdBQUcsT0FBTyxJQUFJLFFBQVE7SUFFL0MsSUFBSSxxQkFBcUIsS0FBSyxHQUM1QixPQUFPLEtBQUsscUJBQXFCLE9BQU8sT0FBTztTQUUvQyxNQUFNLENBQUMsU0FBUyxLQUFLO0dBRXpCO0VBQ0Y7RUFFQSxjQUFzQixXQUFrQyxTQUFTLElBQUk7R0FDbkUsT0FBTyxPQUFPLFlBQVksS0FBSyxxQkFBcUIsV0FBVyxNQUFNLENBQUM7RUFDeEU7RUFHQSxhQUNFLFdBQ3VFO0dBRXZFLE1BQU0sYUFBYSxLQUFLLGNBQWMsU0FBUztHQUUvQyxNQUFNLGdCQUF1QyxDQUFDO0dBRTlDLEtBQUssTUFBTSxDQUFDLE9BQU8scUJBQXFCLE9BQU8sUUFBUSxVQUFVLEdBQy9ELElBQUksZ0JBQWdCLGdCQUFnQixHQUNsQyxjQUFjLEtBQ1osS0FBSyxLQUFLLElBQUksR0FBRyxpQkFBaUIsUUFBUSxNQUFNLFNBQVMsaUJBQWlCLFVBQVUsQ0FDdEY7UUFDSztJQUVMLE1BQU0sYUFBYTtJQUNuQixJQUFJLFVBQVUsWUFDWixjQUFjLEtBQUssVUFBVTtTQUU3QixjQUFjLEtBQUssS0FBSyxLQUFLLElBQUksVUFBVSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7R0FFMUQ7R0FHRixLQUFLLFVBQVUsT0FBTyxhQUFhO0dBRW5DLE9BQU87RUFDVDtFQUdBLFlBQThEO0dBQzVELEtBQUssVUFBVSxPQUFPLEdBQUc7R0FFekIsT0FBTztFQUNUO0VBSUEsU0FBUyxHQUFHLFNBQXlCO0dBQ25DLEtBQUssVUFBVSxTQUFTLEdBQUcsT0FBTztHQUNsQyxPQUFPO0VBQ1Q7RUFHQSxNQUFNLFdBQWtDO0dBQ3RDLEtBQUssVUFBVSxNQUFNLFNBQVM7R0FDOUIsSUFBSSxjQUFjLFFBQ2hCLEtBQUssdUJBQXVCO0dBRTlCLE9BQU87RUFDVDtFQUdBLFVBQVUsT0FBcUI7R0FDN0IsSUFBSSxVQUFVO0dBRWQsS0FBTSxVQUFrQixpQkFBa0IsS0FBSyxVQUFrQixjQUFjLENBQUMsUUFDN0UsTUFBVztJQUNWLElBQUksY0FBYyxHQUFHO0tBQ25CLE1BQU0sZUFBZSxLQUFLLGlCQUFpQixFQUFFLEtBQUssTUFBTTtLQUN4RCxZQUFZO0tBQ1osT0FBTyxDQUFDO0lBQ1YsT0FDRSxPQUFPO0dBRVgsQ0FDRjtHQUNBLElBQUksV0FBVyxLQUFLLG9CQUFvQixJQUFJLEtBQUssQ0FBQyxFQUFFLFNBQVMsUUFDM0QsS0FBSyxvQkFBb0IsT0FBTyxLQUFLO0dBRXZDLE9BQU87RUFDVDtFQWdEQSxLQUFLLGlCQUFzQixHQUFHLE1BQWtCO0dBQzlDLE9BQU8sS0FBSyxlQUFlLENBQUMsUUFBUSxpQkFBaUIsR0FBRyxJQUFJO0VBQzlEO0VBY0EsV0FBVyxpQkFBc0IsTUFBYyxPQUFvQjtHQUNqRSxPQUFPLEtBQUssZUFBZSxDQUFDLFFBQVEsaUJBQWlCLE1BQU0sS0FBSztFQUNsRTtFQWlEQSxTQUFTLGlCQUFzQixHQUFHLE1BQWtCO0dBQ2xELE9BQU8sS0FBSyxlQUFlLENBQUMsWUFBWSxpQkFBaUIsR0FBRyxJQUFJO0VBQ2xFO0VBMEJBLGVBQWUsaUJBQXNCLE1BQWMsT0FBb0I7R0FDckUsT0FBTyxLQUFLLGVBQWUsQ0FBQyxZQUFZLGlCQUFpQixNQUFNLEtBQUs7RUFDdEU7RUFFQSxhQUFhLFVBQStCLGlCQUFzQixHQUFHLE1BQW1CO0dBQ3RGLE1BQU0sZUFBZSxLQUFLLHVCQUF1QixVQUFVLGlCQUFpQixJQUFJO0dBQ2hGLEtBQUssMkJBQTJCLFlBQVk7R0FFNUMsSUFBSSxjQUFjLGVBQWUsR0FBRztJQUVsQyxNQUFNLFlBQVk7SUFFbEIsSUFBSSxLQUFLLFdBQVcsS0FBSyxnQkFBZ0IsS0FBSyxFQUFFLEdBQUc7S0FFakQsTUFBTSxXQUFXLEtBQUs7S0FDdEIsS0FBSyxVQUFVLFNBQVMsQ0FBQyxZQUFZLGVBQWU7TUFDbEQsU0FBUyxJQUFJLGdCQUFnQixVQUFVLENBQUM7S0FDMUMsQ0FBQztJQUNILE9BQU87S0FFTCxNQUFNLENBQUMsTUFBTSxTQUFTO0tBQ3RCLEtBQUssVUFBVSxTQUFTLENBQUMsV0FBVyxNQUFNLEtBQUs7SUFDakQ7R0FDRixPQUFPLElBQUksY0FBYyxlQUFlLEdBQUc7SUFFekMsTUFBTSxVQUFVLE9BQU8sUUFBUSxlQUFlO0lBQzlDLElBQUksUUFBUSxXQUFXLEdBQ3JCLE1BQU0sSUFBSSxNQUFNLHdDQUF3QztJQUUxRCxPQUFPLFFBQVEsRUFBRTtJQUNqQixNQUFNLENBQUMsQ0FBQyxPQUFPLFNBQVM7SUFFeEIsSUFBSSxjQUFjLElBQUksR0FBRztLQUV2QixJQUFJLEtBQUssV0FBVyxLQUFLLGdCQUFnQixLQUFLLEVBQUUsR0FBRztNQUVqRCxNQUFNLFdBQVcsS0FBSztNQUN0QixLQUFLLFVBQVUsU0FBUyxDQUFDLEdBQUcsUUFBUSxLQUFLLElBQUksZUFBZTtPQUMxRCxTQUFTLElBQUksZ0JBQWdCLFVBQVUsQ0FBQztNQUMxQyxDQUFDO0tBQ0gsT0FBTztNQUVMLE1BQU0sQ0FBQyxNQUFNLFNBQVM7TUFDdEIsS0FBSyxVQUFVLFNBQVMsQ0FBQyxHQUFHLFFBQVEsS0FBSyxHQUFHLE1BQU0sS0FBSztLQUN6RDtJQUNGLE9BQU8sSUFBSSxnQkFBZ0IsTUFBTTtLQUUvQixJQUFJLEtBQUssV0FBVyxLQUFLLGdCQUFnQixLQUFLLEVBQUUsR0FBRztNQUVqRCxNQUFNLFdBQVcsS0FBSztNQUN0QixLQUFLLFVBQVUsU0FBUyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsR0FBRyxLQUFLLElBQUksZUFBZTtPQUNsRSxTQUFTLElBQUksZ0JBQWdCLFVBQVUsQ0FBQztNQUMxQyxDQUFDO0tBQ0gsT0FBTztNQUVMLE1BQU0sQ0FBQyxNQUFNLFNBQVM7TUFDdEIsS0FBSyxVQUFVLFNBQVMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLE1BQU0sS0FBSztLQUNqRTtJQUNGLE9BQ0UsTUFBTSxJQUFJLE1BQU0sNkJBQTZCO0dBRWpELE9BQ0UsTUFBTSxJQUFJLE1BQU0sbUJBQW1CO0dBR3JDLEtBQUssb0JBQW9CLElBQUksYUFBYSxPQUFPLFlBQVk7R0FDN0QsT0FBTztFQUNUO0VBRUEsYUFDRSxVQUNBLGlCQUNBLE1BQ0EsT0FDTTtHQUNOLE1BQU0sWUFBWSxLQUFLLHVCQUF1QixVQUFVLGlCQUFpQixDQUFDLE1BQU0sS0FBSyxDQUFDO0dBQ3RGLElBQUksQ0FBQyxVQUFVLFVBQ2IsTUFBTSxJQUFJLE1BQ1IsR0FBRyxhQUFhLFNBQVMsZUFBZSxpQkFBaUIsdUVBQzNEO0dBRUYsTUFBTSxXQUFXLEtBQUssb0JBQW9CLElBQUksVUFBVSxLQUFLO0dBRTdELElBQUksQ0FBQyxVQUNILE9BQU8sS0FBSyxlQUFlLENBQUMsVUFBVSxpQkFBaUIsTUFBTSxLQUFLO0dBR3BFLElBQUksS0FBSyx1QkFBdUIsVUFBVSxTQUFTLEdBQ2pELE9BQU87R0FHVCxNQUFNLEtBQUssd0JBQXdCLFVBQVUsU0FBUztFQUN4RDtFQUVBLHVCQUNFLFVBQ0EsaUJBQ0EsTUFDa0I7R0FDbEIsSUFBSTtHQUNKLElBQUk7R0FFSixJQUFJLGNBQWMsZUFBZSxHQUFHO0lBQ2xDLFFBQVE7SUFDUixRQUFRO0dBQ1YsT0FBTyxJQUFJLGNBQWMsZUFBZSxHQUFHO0lBQ3pDLE1BQU0sVUFBVSxPQUFPLFFBQVEsZUFBZTtJQUM5QyxJQUFJLFFBQVEsV0FBVyxHQUNyQixNQUFNLElBQUksTUFBTSx3Q0FBd0M7SUFFMUQsT0FBTyxRQUFRLEVBQUU7SUFDakIsTUFBTSxDQUFDLENBQUMsV0FBVyxTQUFTO0lBQzVCLFFBQVE7SUFDUixRQUFRLGNBQWMsSUFBSSxJQUFJLE9BQU87R0FDdkMsT0FDRSxNQUFNLElBQUksTUFBTSxtQkFBbUI7R0FHckMsTUFBTSxDQUFDLE1BQU0sU0FBUztHQUN0QixNQUFNLFdBQ0osVUFBVSxRQUFRLEtBQUssV0FBVyxLQUFLLGNBQWMsSUFBSSxLQUFLLGNBQWMsS0FBSztHQUVuRixPQUFPO0lBQ0wsTUFBTTtJQUNOO0lBQ0E7SUFDQTtJQUNBLE1BQU0sV0FBVyxPQUFPO0lBQ3hCLE9BQU8sV0FBVyxRQUFRO0lBQzFCO0dBQ0Y7RUFDRjtFQUVBLDJCQUFtQyxXQUFtQztHQUNwRSxNQUFNLFdBQVcsS0FBSyxvQkFBb0IsSUFBSSxVQUFVLEtBQUs7R0FDN0QsSUFBSSxVQUFVO0lBQ1osSUFBSSxLQUFLLHVCQUF1QixVQUFVLFNBQVMsR0FDakQsTUFBTSxJQUFJLE1BQ1IsZUFBZSxVQUFVLE1BQU0sMEZBQ2pDO0lBRUYsTUFBTSxLQUFLLHdCQUF3QixVQUFVLFNBQVM7R0FDeEQ7RUFDRjtFQUVBLHVCQUNFLFVBQ0EsV0FDOEI7R0FDOUIsT0FDRSxTQUFTLFNBQVMsVUFDbEIsU0FBUyxZQUNULFVBQVUsWUFDVixTQUFTLFVBQVUsVUFBVSxTQUM3QixTQUFTLGFBQWEsVUFBVSxZQUNoQyxTQUFTLFNBQVMsVUFBVSxRQUM1QixTQUFTLFVBQVUsVUFBVTtFQUVqQztFQUVBLHdCQUNFLFVBQ0EsV0FDTztHQUNQLE9BQU8sSUFBSSxNQUNUO0lBQ0UsZUFBZSxVQUFVLE1BQU07SUFDL0IsYUFBYSxLQUFLLDhCQUE4QixRQUFRO0lBQ3hELGNBQWMsS0FBSyw4QkFBOEIsU0FBUztHQUM1RCxDQUFDLENBQUMsS0FBSyxJQUFJLENBQ2I7RUFDRjtFQUVBLDhCQUFzQyxjQUErQztHQUNuRixJQUFJLGFBQWEsU0FBUyxRQUN4QixPQUFPLFFBQVEsYUFBYSxTQUFTLFdBQVcsTUFBTSxhQUFhO0dBR3JFLE1BQU0sY0FBYyxhQUFhLGFBQWEsU0FBUyxTQUFTO0dBQ2hFLE1BQU0sU0FBUyxhQUFhLFNBQVM7R0FDckMsTUFBTSxZQUFZLGFBQWEsV0FDM0IsT0FBTyxhQUFhLEtBQUssS0FBSyxhQUFhLFVBQzNDO0dBQ0osT0FBTyxHQUFHLFlBQVksR0FBRyxPQUFPLE1BQU0sYUFBYSxRQUFRO0VBQzdEO0VBRUEseUJBQXVDO0dBQ3JDLEtBQUssTUFBTSxDQUFDLE9BQU8saUJBQWlCLEtBQUsscUJBQ3ZDLElBQUksYUFBYSxTQUFTLFFBQ3hCLEtBQUssb0JBQW9CLE9BQU8sS0FBSztFQUczQztFQUVBLGlCQUFnQyxPQUE2QjtHQUMzRCxJQUFJLGNBQWMsS0FBSyxHQUNyQixPQUFPO0dBRVQsSUFBSSxjQUFjLEtBQUssS0FBSyxVQUFVLE1BQU07SUFDMUMsSUFDRSxhQUFhLFNBQ2IsY0FBYyxNQUFNLFVBQVUsS0FDOUIsTUFBTSxlQUFlLFFBQ3JCLFFBQVEsTUFBTSxjQUNkLGNBQWMsTUFBTSxVQUFVLENBQUMsRUFBRSxHQUVqQyxPQUFPLE1BQU0sVUFBVSxDQUFDO0lBRTFCLE9BQU8sT0FBTyxLQUFLLEtBQUssQ0FBQyxDQUFDLE1BQU07R0FDbEM7R0FDQSxPQUFPO0VBQ1Q7RUFrQkEsTUFBTSxHQUFHLE1BQTJFO0dBQ2xGLE1BQU0sQ0FBQyxvQkFBb0IsaUJBQWlCLFNBQVM7R0FDckQsSUFBSSxjQUFjLGtCQUFrQixHQUNsQyxLQUFLLFVBQVUsTUFBTSxrQkFBa0I7UUFDbEMsSUFBSSxVQUFVLFFBQVc7SUFDOUIsSUFBSSxvQkFBb0IsTUFBTTtLQUM1QixLQUFLLFVBQVUsVUFBVSxrQkFBa0I7S0FDM0MsT0FBTztJQUNUO0lBQ0EsS0FBSyxVQUFVLE1BQU0sb0JBQW9CLGVBQWU7R0FDMUQsT0FBTyxJQUFJLFVBQVUsUUFBVztJQUM5QixJQUFJLFVBQVUsTUFBTTtLQUNsQixJQUFJLG9CQUFvQixNQUFNO01BQzVCLEtBQUssVUFBVSxhQUFhLGtCQUFrQjtNQUM5QyxPQUFPO0tBQ1QsT0FBTyxJQUFJLG9CQUFvQixLQUFLO01BQ2xDLEtBQUssVUFBVSxVQUFVLGtCQUFrQjtNQUMzQyxPQUFPO0tBQ1Q7SUFDRjtJQUNBLEtBQUssVUFBVSxNQUFNLG9CQUFvQixpQkFBaUIsS0FBSztHQUNqRSxPQUNFLEtBQUssVUFBVSxNQUFNLGtCQUFrQjtHQUV6QyxPQUFPO0VBQ1Q7RUFHQSxRQUNFLFFBQ0EsUUFDaUM7R0FFakMsSUFBSSxPQUFPLFdBQVcsR0FDcEIsS0FBSyxVQUFVLFNBQVMsT0FBTztRQUMxQjtJQUNMLE1BQU0sZUFBZSxPQUFPLFVBQVUsR0FBRyxDQUFDLENBQUMsS0FBSyxJQUFJO0lBQ3BELEtBQUssVUFBVSxTQUFTLFVBQVUsYUFBYSxJQUFJLENBQUMsT0FBTyxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUM7R0FDaEY7R0FFQSxPQUFPO0VBQ1Q7RUFHQSxXQUNFLFFBQ0EsUUFDaUM7R0FFakMsSUFBSSxPQUFPLFdBQVcsR0FDcEIsS0FBSyxVQUFVLFNBQVMsT0FBTztRQUMxQjtJQUNMLE1BQU0sZUFBZSxPQUFPLFVBQVUsR0FBRyxDQUFDLENBQUMsS0FBSyxJQUFJO0lBQ3BELEtBQUssVUFBVSxTQUFTLGNBQWMsYUFBYSxJQUFJLENBQUMsT0FBTyxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUM7R0FDcEY7R0FFQSxPQUFPO0VBQ1Q7RUFHQSxvQkFDRSxRQUNBLE9BQ007R0FDTixLQUFLLFVBQVUsb0JBQW9CLFFBQVEsMkJBQTJCLEtBQUssQ0FBQztHQUM1RSxPQUFPO0VBQ1Q7RUFFQSxtQkFBbUIsUUFBOEIsS0FBbUI7R0FDbEUsS0FBSyxVQUFVLFNBQVMsWUFBWSxDQUFDLFFBQVEsR0FBRyxDQUFDO0dBQ2pELE9BQU87RUFDVDtFQUdBLFdBQXFELFFBQWlCLE9BQXFCO0dBQ3pGLEtBQUssVUFBVSxTQUFTLFVBQVUsT0FBTyxNQUFNLEVBQUUsZ0JBQWdCLENBQUMsS0FBSyxDQUFDO0dBQ3hFLE9BQU87RUFDVDs7Ozs7Ozs7Ozs7Ozs7O0VBZ0JBLFlBQ0UsUUFDQSxPQUNBLFNBR007R0FDTixNQUFNLEVBQUUsWUFBWSxXQUFXLENBQUM7R0FDaEMsTUFBTSxhQUFhLE1BQU0sUUFBUSxNQUFNLElBQ25DLFNBQVMsT0FBTyxLQUFLLE1BQU0sR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFLEtBQ25EO0dBQ0osTUFBTSxvQkFBb0IsdUJBQXVCLFNBQVMsU0FBUyxzQkFBc0IsUUFBUSxLQUFLLEdBQUcsRUFBRSxLQUFLLEdBQUc7R0FFbkgsS0FBSyxVQUFVLFNBQVMsR0FBRyxXQUFXLE9BQU8scUJBQXFCLENBQUMsS0FBSyxDQUFDO0dBRXpFLE9BQU87RUFDVDtFQUdBLGNBQ0UsUUFDQSxPQUNBLFNBQ007R0FDTixNQUFNLE9BRUosY0FBYyxPQUFPLElBQUssRUFBRSxRQUFRLFFBQVEsSUFBd0IsV0FBVyxDQUFDO0dBRWxGLE1BQU0sU0FBUyxLQUFLLFVBQVU7R0FDOUIsTUFBTSxTQUFTLEtBQUssVUFBVTtHQUM5QixNQUFNLGFBQWEsZ0JBQWdCLE1BQU0sSUFBSSxPQUFPLFVBQVUsT0FBTyxNQUFNO0dBQzNFLE1BQU0sU0FBUyxnQkFBZ0IsTUFBTSxJQUNqQztJQUFDLEdBQUcsT0FBTztJQUFZO0lBQVE7R0FBSyxJQUNwQyxDQUFDLFFBQVEsS0FBSztHQUVsQixLQUFLLFVBQVUsU0FBUyxHQUFHLFdBQVcsTUFBTSxPQUFPLFNBQVMsTUFBTTtHQUNsRSxPQUFPO0VBQ1Q7RUFFQSxXQUNFLFFBQ0EsT0FDQSxTQUdNO0dBQ04sTUFBTSxXQUFXLG1CQUFtQixTQUFTLFFBQVE7R0FFckQsSUFBSSxhQUFhLEtBQUs7SUFDcEIsSUFBSSxnQkFBZ0IsTUFBTSxHQUN4QixLQUFLLFVBQVUsU0FBUyxHQUFHLE9BQU8sUUFBUSxHQUFHLFNBQVMsS0FBSyxDQUFDLEdBQUcsT0FBTyxZQUFZLEtBQUssQ0FBQztTQUV4RixLQUFLLFVBQVUsU0FBUyxNQUFNLFNBQVMsS0FBSyxDQUFDLFFBQVEsS0FBSyxDQUFDO0lBRTdELE9BQU87R0FDVDtHQUVBLElBQUksZ0JBQWdCLE1BQU0sR0FDeEIsS0FBSyxVQUFVLFNBQVMsS0FBSyxTQUFTLEdBQUcsT0FBTyxXQUFXLENBQUMsT0FBTyxHQUFHLE9BQU8sVUFBVSxDQUFDO1FBRXhGLEtBQUssVUFBVSxTQUFTLEtBQUssU0FBUyxNQUFNLENBQUMsT0FBTyxNQUFNLENBQUM7R0FFN0QsT0FBTztFQUNUO0VBR0EsU0FBUyxLQUFhLFVBQTZDO0dBQ2pFLEtBQUssVUFBVSxTQUFTLEtBQUssUUFBUTtHQUNyQyxPQUFPO0VBQ1Q7RUFHQSxXQUFXLFVBQWtEO0dBQzNELEtBQUssVUFBVSxPQUFPLFlBQVk7SUFFaEMsU0FBUyxJQURTLFdBQW9CLE9BQzdCLENBQUs7R0FDaEIsQ0FBQztHQUNELE9BQU87RUFDVDtFQUNBLGFBQWEsVUFBa0Q7R0FDN0QsS0FBSyxVQUFVLFNBQVMsWUFBWTtJQUVsQyxTQUFTLElBRFMsV0FBb0IsT0FDN0IsQ0FBSztHQUNoQixDQUFDO0dBQ0QsT0FBTztFQUNUO0VBV0EsUUFDRSxpQkFDQSxZQUFrQyxPQUNsQyxPQUNNO0dBQ04sSUFBSSxpQkFBaUIsZUFBZSxHQUFHO0lBQ3JDLEtBQUssTUFBTSxTQUFTLGlCQUNsQixJQUFJLGNBQWMsS0FBSyxLQUFLLG9CQUFvQixLQUFLLEdBQ25ELEtBQUssYUFBYSxLQUFLO1NBRXZCLEtBQUssYUFBYSxNQUFNLFFBQVEsTUFBTSxPQUFPLE1BQU0sS0FBSztJQUc1RCxPQUFPO0dBQ1Q7R0FFQSxLQUFLLGFBQWEsaUJBQWlCLFdBQVcsS0FBSztHQUNuRCxPQUFPO0VBQ1Q7RUFFQSxhQUNFLFFBQ0EsV0FDQSxPQUNNO0dBQ04sTUFBTSxzQkFBc0IsMEJBQTBCLFNBQVM7R0FDL0QsTUFBTSxrQkFBa0Isc0JBQXNCLEtBQUs7R0FFbkQsSUFBSSxvQkFBb0IsTUFBTSxHQUM1QixLQUFLLFVBQVUsV0FDYixHQUFHLE9BQU8sUUFBUSxHQUFHLHNCQUFzQixrQkFBa0IsZUFBZSxLQUM1RSxPQUFPLFVBQ1Q7UUFFQSxLQUFLLFVBQVUsUUFBUSxRQUFRLHFCQUFxQixlQUFlO0VBRXZFO0VBRUEsWUFBa0I7R0FDaEIsS0FBSyxVQUFVLFVBQVU7R0FDekIsT0FBTztFQUNUO0VBRUEsV0FBaUI7R0FDZixLQUFLLFVBQVUsU0FBUztHQUN4QixPQUFPO0VBQ1Q7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUFtQ0EsaUJBQ0UsUUFDQSxXQUNBLFVBSUksQ0FBQyxHQUNxRDtHQUMxRCxNQUFNLEVBQUUsU0FBUyxVQUFVLFdBQVcsZUFBZTtHQUVyRCxJQUNFLENBQUMsTUFBTSxRQUFRLFNBQVMsS0FDeEIsVUFBVSxXQUFXLEtBQ3JCLFVBQVUsTUFBTSxNQUFNLENBQUMsT0FBTyxTQUFTLENBQUMsQ0FBQyxHQUV6QyxNQUFNLElBQUksTUFBTSx3RUFBd0U7R0FHMUYsTUFBTSxnQkFBZ0IsS0FBSyxVQUFVLFVBQVUsS0FBSyxNQUFNLE9BQU8sQ0FBQyxDQUFDLENBQUM7R0FDcEUsTUFBTSxXQUFXO0lBQUUsUUFBUTtJQUFPLElBQUk7SUFBTyxlQUFlO0dBQU0sRUFBRTtHQU1wRSxNQUFNLGlCQUNKLFdBQVcsV0FDUCxLQUFLLEtBQUssSUFBSSxXQUFXLFNBQVMsNEJBQTRCLENBQUMsUUFBUSxhQUFhLENBQUMsSUFDckYsV0FBVyxPQUNULEtBQUssS0FBSyxJQUFJLE1BQU0sU0FBUywyQkFBMkIsQ0FBQyxRQUFRLGFBQWEsQ0FBQyxJQUMvRSxLQUFLLEtBQUssSUFBSSxRQUFRLFNBQVMsNEJBQTRCLENBQUMsUUFBUSxhQUFhLENBQUM7R0FHMUYsS0FBSyxVQUFVLGFBQWEsTUFBTTtHQUdsQyxLQUFLLFVBQVUsTUFBTSxPQUFPO0dBQzVCLElBQUksWUFBWTtJQUdkLE1BQU0scUJBQXNCLEtBQUssVUFBa0IsY0FBYyxDQUM5RCxRQUFRLE1BQVcsRUFBRSxhQUFhLFNBQVMsQ0FBQyxDQUM1QyxTQUFTLE1BQVcsRUFBRSxLQUFLO0lBQzlCLEtBQUssVUFBVSxNQUFNLFFBQVE7SUFDN0IsS0FBSyxVQUFVLE9BQU8sS0FBSyxLQUFLLElBQUksdUJBQXVCLENBQUMsWUFBWSxVQUFVLENBQUMsQ0FBQztJQUNwRixtQkFBbUIsS0FBSyxRQUFhLEtBQUssVUFBVSxPQUFPLEdBQUcsQ0FBQztJQUMvRCxLQUFLLFVBQVUsT0FBTyxjQUFjO0lBQ3BDLEtBQUssVUFBVSxXQUFXLFVBQVUsU0FBUyxhQUFhO0tBQ3hEO0tBQ0E7S0FDQTtJQUNGLENBQUM7SUFFRCxLQUFLLFlBQVksS0FBSyxLQUNuQixLQUFLLEtBQUssVUFBVSxHQUFHLGtCQUFrQixDQUFDLENBQUMsQ0FDM0MsT0FBTyxHQUFHLENBQUMsQ0FDWCxRQUFRLGNBQWMsTUFBTTtHQUNqQyxPQUFPO0lBQ0wsS0FBSyxVQUFVLE9BQU8sY0FBYztJQUNwQyxLQUFLLFVBQVUsV0FBVyxNQUFNLFNBQVMsYUFBYSxDQUFDLFFBQVEsYUFBYSxDQUFDO0dBQy9FO0dBR0EsSUFBSSxjQUFjLFNBQVMsR0FBRztJQUM1QixJQUFJLENBQUMsT0FBTyxTQUFTLFNBQVMsR0FDNUIsTUFBTSxJQUFJLE1BQU0sdUNBQXVDLFdBQVc7SUFHcEUsSUFBSSxZQUFZO0tBQ2QsTUFBTSxjQUFjLFdBQVcsT0FBTyxPQUFPO0tBQzdDLEtBQUssVUFBVSxNQUFNLGNBQWMsYUFBYSxTQUFTO0lBQzNELE9BQU87S0FDTCxNQUFNLGlCQUNKLFdBQVcsV0FBVyxJQUFJLFlBQVksV0FBVyxrQkFBa0IsQ0FBQyxZQUFZO0tBQ2xGLEtBQUssVUFBVSxTQUFTLE1BQU0sU0FBUyxrQkFBa0I7TUFDdkQ7TUFDQTtNQUNBO0tBQ0YsQ0FBQztJQUNIO0dBQ0Y7R0FHQSxPQUFPO0VBQ1Q7RUFHQSxNQUFNLE9BQXFCO0dBQ3pCLElBQUksUUFBUSxHQUNWLE1BQU0sSUFBSSxNQUFNLDZCQUE2QjtHQUUvQyxLQUFLLFVBQVUsTUFBTSxLQUFLO0dBQzFCLE9BQU87RUFDVDtFQUVBLE9BQU8sT0FBcUI7R0FDMUIsSUFBSSxRQUFRLEdBQ1YsTUFBTSxJQUFJLE1BQU0sOEJBQThCO0dBRWhELEtBQUssVUFBVSxPQUFPLEtBQUs7R0FDM0IsT0FBTztFQUNUO0VBSUEsUUFBUSxHQUFHLFNBQXlCO0dBQ2xDLEtBQUssVUFBVSxRQUFRLEdBQUcsT0FBTztHQUNqQyxPQUFPO0VBQ1Q7RUFVQSxPQUFPLEdBQUcsWUFBeUI7R0FDakMsSUFBSSxXQUFXLFdBQVcsR0FFeEIsS0FBSyxVQUFVLE9BQU8sS0FBSyxLQUFLLElBQUksV0FBVyxFQUFFLENBQUM7UUFDN0MsSUFBSSxXQUFXLFdBQVcsR0FFL0IsS0FBSyxVQUFVLE9BQ2IsS0FBSyxLQUFLLElBQUksV0FBVyxFQUFFLEdBQzNCLFdBQVcsSUFDWCxLQUFLLEtBQUssSUFBSSxXQUFXLEVBQUUsQ0FDN0I7UUFFQSxNQUFNLElBQUksTUFBTSwwQkFBMEI7R0FFNUMsT0FBTztFQUNUO0VBR0EsS0FDRSxhQUNBLFlBQzhCO0dBQzlCLE1BQU0sRUFBRSx1QkFBdUIsS0FBSyxRQUFRLENBQUM7R0FFN0MsT0FBTyxLQUFLLFVBQVUsS0FBSyxhQUFvQixVQUFVO0VBQzNEO0VBQ0EsTUFDRSxZQUM2QjtHQUM3QixPQUFPLEtBQUssVUFBVSxNQUFNLFVBQVU7RUFDeEM7RUFDQSxRQUFRLFdBQW1EO0dBQ3pELE9BQU8sS0FBSyxVQUFVLFFBQVEsU0FBUztFQUN6QztFQUdBLFFBQThDO0dBQzVDLEtBQUssVUFBVSxNQUFNO0dBQ3JCLE9BQU8sSUFBSSxhQUFhLEtBQUssV0FBVyxLQUFLLE1BQU0sS0FBSyxTQUFTO0VBQ25FO0VBR0EsTUFDRSxRQU1BO0dBRUEsS0FBSyxVQUFVLE1BQU0sTUFBZ0I7R0FDckMsT0FBTyxJQUFJLGFBQWEsS0FBSyxXQUFXLEtBQUssTUFBTSxLQUFLLFNBQVM7RUFDbkU7RUFXQSxPQUNFLFNBQ3VEO0dBRXZELE1BQU0sY0FBYyxLQUFLLGtCQUFrQixPQUFPO0dBQ2xELEtBQUssVUFBVSxPQUFPLFdBQVc7R0FDakMsT0FBTyxJQUFJLGFBQWEsS0FBSyxXQUFXLEtBQUssTUFBTSxLQUFLLFNBQVM7RUFDbkU7RUFHQSxPQUFPLFNBQW1GO0dBRXhGLE1BQU0sY0FBYyxLQUFLLGtCQUFrQixPQUFPO0dBQ2xELEtBQUssVUFBVSxPQUFPLFdBQVc7R0FDakMsT0FBTyxJQUFJLGFBQWEsS0FBSyxXQUFXLEtBQUssTUFBTSxLQUFLLFNBQVM7RUFDbkU7Ozs7OztFQU9BLGtCQUE4QyxNQUFnQztHQUU1RSxJQUFJLENBQUMsS0FBSyxhQUFhLENBQUMsS0FBSyxVQUFVLFlBQVksUUFDakQsT0FBTztHQUlULE1BQU0sY0FBYyxLQUFLLFVBQVU7R0FDbkMsSUFBSSxNQUFNLFFBQVEsSUFBSSxHQUNwQixLQUFLLE1BQU0sUUFBUSxNQUNqQixLQUFLLE1BQU0sVUFBVSxhQUFhO0lBQ2hDLE1BQU0sUUFBUSxPQUFPLFFBQVEsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsUUFBUSxNQUFNLENBQUMsR0FBRztJQUNyRSxJQUFJLFVBQVUsVUFBYSxVQUFVLE1BQ25DLE9BQU8sT0FBTyxNQUFNLEdBQ2pCLFNBQVMseUJBQXlCLEtBQUssV0FBVyxRQUFRLEtBQUssRUFDbEUsQ0FBQztHQUVMO1FBR0YsS0FBSyxNQUFNLFVBQVUsYUFBYTtJQUNoQyxNQUFNLFFBQVEsT0FBTyxRQUFRLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLFFBQVEsTUFBTSxDQUFDLEdBQUc7SUFDckUsSUFBSSxVQUFVLFVBQWEsVUFBVSxNQUNuQyxPQUFPLE9BQU8sTUFBTSxHQUNqQixTQUFTLHlCQUF5QixLQUFLLFdBQVcsUUFBUSxLQUFLLEVBQ2xFLENBQUM7R0FFTDtHQUVGLE9BQU87RUFDVDtFQUdBLFVBQ0UsUUFDQSxPQUNpRDtHQUNqRCxJQUFJLFNBQVMsR0FDWCxNQUFNLElBQUksTUFBTSx3Q0FBd0M7R0FFMUQsS0FBSyxVQUFVLFVBQVUsUUFBUSxLQUFLO0dBQ3RDLE9BQU8sSUFBSSxhQUFhLEtBQUssV0FBVyxLQUFLLE1BQU0sS0FBSyxTQUFTO0VBQ25FO0VBRUEsVUFDRSxRQUNBLE9BQ2lEO0dBQ2pELElBQUksU0FBUyxHQUNYLE1BQU0sSUFBSSxNQUFNLHdDQUF3QztHQUUxRCxLQUFLLFVBQVUsVUFBVSxRQUFRLEtBQUs7R0FDdEMsT0FBTyxJQUFJLGFBQWEsS0FBSyxXQUFXLEtBQUssTUFBTSxLQUFLLFNBQVM7RUFDbkU7RUFHQSxTQUEwRDtHQUN4RCxLQUFLLFVBQVUsT0FBTztHQUN0QixPQUFPLElBQUksYUFBYSxLQUFLLFdBQVcsS0FBSyxNQUFNLEtBQUssU0FBUztFQUNuRTtFQUdBLFVBQWtCO0dBQ2hCLE9BQU8sS0FBSyxVQUFVLFFBQVE7RUFDaEM7RUFHQSxRQUFjO0dBQ1osUUFBUSxJQUFJLEdBQUcsTUFBTSxLQUFLLGNBQWMsRUFBRSxHQUFHLE1BQU0sT0FBTyxLQUFLLFFBQVEsQ0FBQyxHQUFHO0dBQzNFLE9BQU87RUFDVDtFQUVBLFFBQXlDO0dBRXZDLE1BQU0sVUFBVSxJQUFJLEtBQWdDLEtBQUssTUFBTSxNQUFNO0dBQ3JFLFFBQVEsWUFBWSxLQUFLLFVBQVUsTUFBTTtHQUN6QyxRQUFRLFlBQVksS0FBSztHQUN6QixRQUFRLHNCQUFzQixJQUFJLElBQUksS0FBSyxtQkFBbUI7R0FDOUQsT0FBTztFQUNUO0VBRUEsVUFBVSxhQUE2QjtHQUVyQyxNQUFNLFdBQVc7SUFDZjtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtHQUNGO0dBRUEsSUFBSSxZQUFZO0dBR2hCLFNBQVMsU0FBUyxZQUFZO0lBQzVCLE1BQU0sUUFBUSxJQUFJLE9BQU8sTUFBTSxRQUFRLE1BQU0sSUFBSTtJQUNqRCxZQUFZLFVBQVUsUUFBUSxPQUFPLFFBQVEsWUFBWSxDQUFDO0dBQzVELENBQUM7R0FhRDtJQVRFO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7R0FFRixDQUFBLENBQWEsU0FBUyxXQUFXO0lBQy9CLE1BQU0sUUFBUSxJQUFJLE9BQU8sUUFBUSxPQUFPLFFBQVEsSUFBSTtJQUNwRCxZQUFZLFVBQVUsUUFBUSxPQUFPLEtBQUssT0FBTyxZQUFZLEVBQUUsRUFBRTtHQUNuRSxDQUFDO0dBR0QsWUFBWSxVQUFVLFFBQVEscURBQXFELFdBQVc7R0FHOUYsWUFBWSxVQUFVLFFBQVEsb0JBQW9CLFNBQVM7R0FHM0QsTUFBTSxRQUFRLFVBQVUsTUFBTSxJQUFJO0dBQ2xDLE1BQU0sZ0JBQWdCLENBQUM7R0FDdkIsSUFBSSxjQUFjO0dBRWxCLEtBQUssTUFBTSxRQUFRLE9BQU87SUFDeEIsTUFBTSxjQUFjLEtBQUssS0FBSztJQUM5QixJQUFJLENBQUMsYUFBYTtJQUdsQixNQUFNLGlCQUFpQixZQUFZLE1BQU0sS0FBSyxLQUFLLENBQUMsRUFBQSxDQUFHO0lBQ3ZELE1BQU0saUJBQWlCLFlBQVksTUFBTSxLQUFLLEtBQUssQ0FBQyxFQUFBLENBQUc7SUFFdkQsSUFBSSxnQkFBZ0IsS0FBSyxrQkFBa0IsR0FDekMsY0FBYyxLQUFLLElBQUksR0FBRyxjQUFjLGFBQWE7SUFJdkQsTUFBTSxTQUFTLEtBQUssT0FBTyxXQUFXO0lBQ3RDLGNBQWMsS0FBSyxTQUFTLFdBQVc7SUFHdkMsSUFBSSxnQkFBZ0IsZUFDbEIsZUFBZSxnQkFBZ0I7R0FFbkM7R0FFQSxPQUFPLGNBQWMsS0FBSyxJQUFJLENBQUMsQ0FBQyxLQUFLO0VBQ3ZDO0VBRUEsSUFBSSxLQUF1QjtHQUN6QixPQUFPLEtBQUssS0FBSyxJQUFJLEdBQUc7RUFDMUI7RUFHQSxXQUE4QjtHQUM1QixPQUFPLEtBQUs7RUFDZDtDQUNGO0NBRWEsYUFBYixNQUFhLFdBQW1DO0VBQzFCO0VBQXBCLFlBQVksU0FBb0M7R0FBNUIsS0FBQSxVQUFBO0VBQTZCO0VBYWpELE1BQU0sR0FBRyxNQUFrQztHQUN6QyxLQUFLLFFBQVEsTUFBTSxLQUFLLElBQUksR0FBRyxLQUFLLE1BQU0sQ0FBQyxDQUFDO0dBQzVDLE9BQU87RUFDVDtFQU9BLFFBQVEsR0FBRyxNQUFrQztHQUMzQyxLQUFLLFFBQVEsUUFBUSxLQUFLLElBQUksS0FBSyxFQUFFO0dBQ3JDLE9BQU87RUFDVDtFQU1BLFdBQVcsR0FBRyxNQUFrQztHQUM5QyxLQUFLLFFBQVEsV0FBVyxLQUFLLElBQUksS0FBSyxFQUFFO0dBQ3hDLE9BQU87RUFDVDtFQWFBLFFBQVEsR0FBRyxNQUFrQztHQUMzQyxLQUFLLFFBQVEsUUFBUSxLQUFLLElBQUksR0FBRyxLQUFLLE1BQU0sQ0FBQyxDQUFDO0dBQzlDLE9BQU87RUFDVDtFQU9BLFVBQVUsR0FBRyxNQUFrQztHQUM3QyxLQUFLLFFBQVEsVUFBVSxLQUFLLElBQUksS0FBSyxFQUFFO0dBQ3ZDLE9BQU87RUFDVDtFQU1BLGFBQWEsR0FBRyxNQUFrQztHQUNoRCxLQUFLLFFBQVEsYUFBYSxLQUFLLElBQUksS0FBSyxFQUFFO0dBQzFDLE9BQU87RUFDVDtFQUdBLG9CQUNFLFFBQ0EsT0FDTTtHQUNOLEtBQUssUUFBUSxvQkFBb0IsUUFBUSwyQkFBMkIsS0FBSyxDQUFDO0dBQzFFLE9BQU87RUFDVDtFQUVBLHNCQUNFLFFBQ0EsT0FDTTtHQUNOLEtBQUssUUFBUSxzQkFBc0IsUUFBUSwyQkFBMkIsS0FBSyxDQUFDO0dBQzVFLE9BQU87RUFDVDtFQUVBLG1CQUFtQixRQUE4QixLQUFtQjtHQUNsRSxLQUFLLFFBQVEsU0FBUyxZQUFZLENBQUMsUUFBUSxHQUFHLENBQUM7R0FDL0MsT0FBTztFQUNUO0VBRUEscUJBQXFCLFFBQThCLEtBQW1CO0dBQ3BFLEtBQUssUUFBUSxXQUFXLFlBQVksQ0FBQyxRQUFRLEdBQUcsQ0FBQztHQUNqRCxPQUFPO0VBQ1Q7RUFJQSxXQUFXLEdBQUcsTUFBbUI7R0FDL0IsS0FBSyxRQUFRLFNBQVMsVUFBVSxPQUFPLEtBQUssRUFBRSxFQUFFLGdCQUFnQixDQUFDLEtBQUssRUFBRSxDQUFDO0dBQ3pFLE9BQU87RUFDVDtFQUdBLGFBQWEsR0FBRyxNQUFtQjtHQUNqQyxLQUFLLFFBQVEsV0FBVyxVQUFVLE9BQU8sS0FBSyxFQUFFLEVBQUUsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLENBQUM7R0FDM0UsT0FBTztFQUNUO0VBVUEsWUFBWSxHQUFHLE1BQW1CO0dBQ2hDLE1BQU0sRUFBRSxZQUFZLEtBQUssTUFBTSxDQUFDO0dBQ2hDLE1BQU0sYUFBYSxNQUFNLFFBQVEsS0FBSyxFQUFFLElBQ3BDLFNBQVMsS0FBSyxFQUFFLENBQUMsS0FBSyxNQUFNLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRSxLQUNwRCxLQUFLO0dBQ1QsTUFBTSxvQkFBb0IsdUJBQXVCLFNBQVMsU0FBUyxzQkFBc0IsUUFBUSxLQUFLLEdBQUcsRUFBRSxLQUFLLEdBQUc7R0FDbkgsS0FBSyxRQUFRLFNBQVMsR0FBRyxXQUFXLE9BQU8scUJBQXFCLENBQUMsS0FBSyxFQUFFLENBQUM7R0FFekUsT0FBTztFQUNUO0VBU0EsY0FBYyxHQUFHLE1BQW1CO0dBQ2xDLE1BQU0sRUFBRSxZQUFZLEtBQUssTUFBTSxDQUFDO0dBQ2hDLE1BQU0sYUFBYSxNQUFNLFFBQVEsS0FBSyxFQUFFLElBQ3BDLFNBQVMsS0FBSyxFQUFFLENBQUMsS0FBSyxNQUFNLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRSxLQUNwRCxLQUFLO0dBQ1QsTUFBTSxvQkFBb0IsdUJBQXVCLFNBQVMsU0FBUyxzQkFBc0IsUUFBUSxLQUFLLEdBQUcsRUFBRSxLQUFLLEdBQUc7R0FDbkgsS0FBSyxRQUFRLFdBQVcsR0FBRyxXQUFXLE9BQU8scUJBQXFCLENBQUMsS0FBSyxFQUFFLENBQUM7R0FFM0UsT0FBTztFQUNUO0VBUUEsY0FBYyxHQUFHLE1BQW1CO0dBQ2xDLE1BQU0sT0FFSixjQUFjLEtBQUssRUFBRSxJQUFLLEVBQUUsUUFBUSxLQUFLLEdBQUcsSUFBd0IsS0FBSyxNQUFNLENBQUM7R0FFbEYsTUFBTSxTQUFTLEtBQUssVUFBVTtHQUM5QixNQUFNLFNBQVMsS0FBSyxVQUFVO0dBQzlCLE1BQU0sYUFBYSxnQkFBZ0IsS0FBSyxFQUFFLElBQUksS0FBSyxFQUFFLENBQUMsVUFBVSxPQUFPLEtBQUssRUFBRTtHQUM5RSxNQUFNLFNBQVMsZ0JBQWdCLEtBQUssRUFBRSxJQUNsQztJQUFDLEdBQUcsS0FBSyxFQUFFLENBQUM7SUFBWTtJQUFRLEtBQUs7R0FBRSxJQUN2QyxDQUFDLFFBQVEsS0FBSyxFQUFFO0dBRXBCLEtBQUssUUFBUSxTQUFTLEdBQUcsV0FBVyxNQUFNLE9BQU8sU0FBUyxNQUFNO0dBQ2hFLE9BQU87RUFDVDtFQU9BLGdCQUFnQixHQUFHLE1BQW1CO0dBQ3BDLE1BQU0sT0FFSixjQUFjLEtBQUssRUFBRSxJQUFLLEVBQUUsUUFBUSxLQUFLLEdBQUcsSUFBd0IsS0FBSyxNQUFNLENBQUM7R0FFbEYsTUFBTSxTQUFTLEtBQUssVUFBVTtHQUM5QixNQUFNLFNBQVMsS0FBSyxVQUFVO0dBQzlCLE1BQU0sYUFBYSxnQkFBZ0IsS0FBSyxFQUFFLElBQUksS0FBSyxFQUFFLENBQUMsVUFBVSxPQUFPLEtBQUssRUFBRTtHQUM5RSxNQUFNLFNBQVMsZ0JBQWdCLEtBQUssRUFBRSxJQUNsQztJQUFDLEdBQUcsS0FBSyxFQUFFLENBQUM7SUFBWTtJQUFRLEtBQUs7R0FBRSxJQUN2QyxDQUFDLFFBQVEsS0FBSyxFQUFFO0dBRXBCLEtBQUssUUFBUSxXQUFXLEdBQUcsV0FBVyxNQUFNLE9BQU8sU0FBUyxNQUFNO0dBQ2xFLE9BQU87RUFDVDtFQVNBLFdBQVcsR0FBRyxNQUFtQjtHQUMvQixNQUFNLFdBQVcsbUJBQW1CLEtBQUssRUFBRSxFQUFFLFFBQVE7R0FFckQsSUFBSSxhQUFhLEtBQUs7SUFDcEIsSUFBSSxnQkFBZ0IsS0FBSyxFQUFFLEdBQ3pCLEtBQUssUUFBUSxTQUFTLEdBQUcsS0FBSyxFQUFFLENBQUMsUUFBUSxHQUFHLFNBQVMsS0FBSyxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsWUFBWSxLQUFLLEVBQUUsQ0FBQztTQUUxRixLQUFLLFFBQVEsU0FBUyxNQUFNLFNBQVMsS0FBSyxDQUFDLEtBQUssSUFBSSxLQUFLLEVBQUUsQ0FBQztJQUU5RCxPQUFPO0dBQ1Q7R0FFQSxJQUFJLGdCQUFnQixLQUFLLEVBQUUsR0FDekIsS0FBSyxRQUFRLFNBQVMsS0FBSyxTQUFTLEdBQUcsS0FBSyxFQUFFLENBQUMsV0FBVyxDQUFDLEtBQUssSUFBSSxHQUFHLEtBQUssRUFBRSxDQUFDLFVBQVUsQ0FBQztRQUUxRixLQUFLLFFBQVEsU0FBUyxLQUFLLFNBQVMsTUFBTSxDQUFDLEtBQUssSUFBSSxLQUFLLEVBQUUsQ0FBQztHQUU5RCxPQUFPO0VBQ1Q7RUFTQSxhQUFhLEdBQUcsTUFBbUI7R0FDakMsTUFBTSxXQUFXLG1CQUFtQixLQUFLLEVBQUUsRUFBRSxRQUFRO0dBRXJELElBQUksYUFBYSxLQUFLO0lBQ3BCLElBQUksZ0JBQWdCLEtBQUssRUFBRSxHQUN6QixLQUFLLFFBQVEsV0FBVyxHQUFHLEtBQUssRUFBRSxDQUFDLFFBQVEsR0FBRyxTQUFTLEtBQUssQ0FDMUQsR0FBRyxLQUFLLEVBQUUsQ0FBQyxZQUNYLEtBQUssRUFDUCxDQUFDO1NBRUQsS0FBSyxRQUFRLFdBQVcsTUFBTSxTQUFTLEtBQUssQ0FBQyxLQUFLLElBQUksS0FBSyxFQUFFLENBQUM7SUFFaEUsT0FBTztHQUNUO0dBRUEsSUFBSSxnQkFBZ0IsS0FBSyxFQUFFLEdBQ3pCLEtBQUssUUFBUSxXQUFXLEtBQUssU0FBUyxHQUFHLEtBQUssRUFBRSxDQUFDLFdBQVcsQ0FBQyxLQUFLLElBQUksR0FBRyxLQUFLLEVBQUUsQ0FBQyxVQUFVLENBQUM7UUFFNUYsS0FBSyxRQUFRLFdBQVcsS0FBSyxTQUFTLE1BQU0sQ0FBQyxLQUFLLElBQUksS0FBSyxFQUFFLENBQUM7R0FFaEUsT0FBTztFQUNUO0VBSUEsV0FBVyxVQUFpRTtHQUMxRSxLQUFLLFFBQVEsT0FBTyxlQUFlO0lBRWpDLFNBQVMsSUFEWSxXQUFvQixVQUNoQyxDQUFRO0dBQ25CLENBQUM7R0FDRCxPQUFPO0VBQ1Q7RUFFQSxhQUFhLFVBQWlFO0dBQzVFLEtBQUssUUFBUSxTQUFTLGVBQWU7SUFFbkMsU0FBUyxJQURZLFdBQW9CLFVBQ2hDLENBQVE7R0FDbkIsQ0FBQztHQUNELE9BQU87RUFDVDtDQUNGO0NBR2Esa0JBQWIsTUFBMEU7RUFDcEQ7RUFBcEIsWUFBWSxVQUFtQztHQUEzQixLQUFBLFdBQUE7RUFBNEI7RUF3Q2hELEdBQUcsR0FBRyxNQUFtQjtHQUV2QixLQUFLLFNBQVMsR0FBRyxHQUFJLElBQXlCO0dBQzlDLE9BQU87RUFDVDtFQXdDQSxLQUFLLEdBQUcsTUFBbUI7R0FFekIsS0FBSyxTQUFTLEtBQUssR0FBSSxJQUF5QjtHQUNoRCxPQUFPO0VBQ1Q7RUFPQSxNQUFNLEdBQUcsTUFBbUI7R0FFMUIsS0FBTSxTQUFpQixNQUFNLEdBQUcsSUFBSTtHQUNwQyxPQUFPO0VBQ1Q7RUFPQSxTQUFTLEdBQUcsTUFBbUI7R0FFN0IsS0FBTSxTQUFpQixTQUFTLEdBQUcsSUFBSTtHQUN2QyxPQUFPO0VBQ1Q7RUFPQSxRQUFRLEdBQUcsTUFBbUI7R0FFNUIsS0FBTSxTQUFpQixRQUFRLEdBQUcsSUFBSTtHQUN0QyxPQUFPO0VBQ1Q7Q0FDRjtDQU1hLGVBQWIsTUFBYSxhQUFrRTtFQUVwRTtFQUNDO0VBQ0E7RUFIVixZQUNFLFdBQ0EsTUFDQSxZQUFzQyxNQUN0QztHQUhPLEtBQUEsWUFBQTtHQUNDLEtBQUEsT0FBQTtHQUNBLEtBQUEsWUFBQTtFQUNQO0VBRUgsQ0FBQyxPQUFPLGVBQXVCO0VBRS9CLFVBQWtCO0dBQ2hCLE9BQU8sS0FBSyxVQUFVLFFBQVE7RUFDaEM7RUFFQSxRQUFjO0dBQ1osUUFBUSxJQUFJLEdBQUcsTUFBTSxLQUFLLGNBQWMsRUFBRSxHQUFHLE1BQU0sT0FBTyxLQUFLLFFBQVEsQ0FBQyxHQUFHO0dBQzNFLE9BQU87RUFDVDtFQUVBLEtBQ0UsYUFDQSxZQUM4QjtHQUM5QixNQUFNLEVBQUUsdUJBQXVCLEtBQUssUUFBUSxDQUFDO0dBRTdDLE9BQU8sS0FBSyxVQUFVLEtBQUssYUFBb0IsVUFBVTtFQUMzRDtFQUVBLE1BQ0UsWUFDK0I7R0FDL0IsT0FBTyxLQUFLLFVBQVUsTUFBTSxVQUFVO0VBQ3hDO0VBRUEsUUFBUSxXQUFxRDtHQUMzRCxPQUFPLEtBQUssVUFBVSxRQUFRLFNBQVM7RUFDekM7RUFHQSxXQUNFLFNBQ0EsUUFDTTtHQUNOLE1BQU0sU0FBUyxNQUFNLFFBQVEsT0FBTyxJQUFJLFVBQVUsQ0FBQyxPQUFPO0dBRTFELElBQUksQ0FBQyxVQUFVLFdBQVcsV0FFeEIsS0FBSyxVQUFVLFdBQVcsTUFBTSxDQUFDLENBQUMsT0FBTztRQUNwQztJQUVMLE1BQU0sRUFBRSxXQUFXO0lBR25CLElBQUksTUFBTSxRQUFRLE1BQU0sR0FDdEIsS0FBSyxVQUFVLFdBQVcsTUFBTSxDQUFDLENBQUMsTUFBTSxNQUFNO1NBQ3pDO0tBRUwsTUFBTSxXQUFXLENBQUM7S0FFbEIsS0FBSyxNQUFNLENBQUMsS0FBSyxVQUFVLE9BQU8sUUFBUSxNQUFNLEdBQUc7TUFDakQsTUFBTSxjQUFjLGdCQUFnQixLQUFLLElBQ3JDLEtBQUssS0FBSyxJQUFJLE1BQU0sT0FBTyxJQUMzQix5QkFBeUIsS0FBSyxXQUFXLEtBQUssS0FBSztNQUN2RCxPQUFPLE9BQU8sVUFBVSxHQUFHLE1BQU0sWUFBWSxDQUFDO0tBQ2hEO0tBRUEsS0FBSyxVQUFVLFdBQVcsTUFBTSxDQUFDLENBQUMsTUFBTSxRQUFRO0lBQ2xEO0dBQ0Y7R0FFQSxPQUFPO0VBQ1Q7RUFhQSxVQUFVLGlCQUFnRTtHQUN4RSxLQUFLLFVBQVUsVUFBVSxlQUFlO0dBQ3hDLE9BQU8sSUFBSSxhQUFhLEtBQUssV0FBVyxLQUFLLE1BQU0sS0FBSyxTQUFTO0VBQ25FO0NBQ0YifQ==
|
|
1255
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVyaS5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0YWJhc2UvcHVyaS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBveGxpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovIC8vIFB1cmnripQg64uk7JaR7ZWcIO2DgOyeheydhCDsgqzsmqntlZjqs6Ag7J6I7Iq164uI64ukLlxuXG5pbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIjtcbmltcG9ydCB7IHJhbmRvbVVVSUQgfSBmcm9tIFwibm9kZTpjcnlwdG9cIjtcbmltcG9ydCB7IHR5cGUgRXZlbnRFbWl0dGVyIH0gZnJvbSBcIm5vZGU6ZXZlbnRzXCI7XG5cbmltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCBpbmZsZWN0aW9uIGZyb20gXCJpbmZsZWN0aW9uXCI7XG5pbXBvcnQgeyB0eXBlIEtuZXggfSBmcm9tIFwia25leFwiO1xuXG5pbXBvcnQgeyBFbnRpdHlNYW5hZ2VyIH0gZnJvbSBcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHsgdHlwZSBUYWJsZVNwZWMgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyBOYWl0ZSB9IGZyb20gXCIuLi9uYWl0ZS9uYWl0ZVwiO1xuaW1wb3J0IHtcbiAgaXNGdW5jdGlvblZhbHVlLFxuICBpc051bWJlclZhbHVlLFxuICBpc09iamVjdFZhbHVlLFxuICBpc1N0cmluZ1ZhbHVlLFxufSBmcm9tIFwiLi4vdXRpbHMvcnVudGltZS12YWx1ZVwiO1xuaW1wb3J0IHsgdHlwZSBDbGVhclN0YXRlbWVudHMgfSBmcm9tIFwiLi9wdXJpLXN1YnNldC50eXBlc1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBBdmFpbGFibGVDb2x1bW5zLFxuICB0eXBlIENvbHVtbktleXMsXG4gIHR5cGUgQ29tcGFyaXNvbk9wZXJhdG9yLFxuICB0eXBlIEV4cGFuZCxcbiAgdHlwZSBFeHRyYWN0Q29sdW1uVHlwZSxcbiAgdHlwZSBGdWxsdGV4dENvbHVtbnMsXG4gIHR5cGUgRnV6enlPcGVyYXRvcixcbiAgdHlwZSBJbnNlcnREYXRhLFxuICB0eXBlIEluc2VydFJlc3VsdCxcbiAgdHlwZSBKc29uQ29sdW1ucyxcbiAgdHlwZSBKc29uU3VwZXJzZXRWYWx1ZSxcbiAgdHlwZSBMZWZ0Sm9pbmVkTWFya2VyLFxuICB0eXBlIExlZnRKb2luTWFya2VyRm9yLFxuICB0eXBlIE51bWVyaWNDb2x1bW5zLFxuICB0eXBlIE9uQ29uZmxpY3RBY3Rpb24sXG4gIHR5cGUgUGFyc2VTZWxlY3RPYmplY3QsXG4gIHR5cGUgUmVzdWx0QXZhaWxhYmxlQ29sdW1ucyxcbiAgdHlwZSBTZWxlY3RBbGxSZXN1bHQsXG4gIHR5cGUgU2VsZWN0T2JqZWN0LFxuICB0eXBlIFNlbGVjdFZhbHVlLFxuICB0eXBlIFNpbmdsZVRhYmxlVmFsdWUsXG4gIHR5cGUgU3FsRXhwcmVzc2lvbixcbiAgdHlwZSBUc0hpZ2hsaWdodE9wdGlvbnMsXG4gIHR5cGUgVHNRdWVyeUNvbmZpZyxcbiAgdHlwZSBUc1F1ZXJ5T3B0aW9ucyxcbiAgdHlwZSBUc1JhbmtPcHRpb25zLFxuICB0eXBlIFZlY3RvckNvbHVtbnMsXG4gIHR5cGUgV2hlcmVDb25kaXRpb24sXG4gIHR5cGUgV2hlcmVPcGVyYXRvcixcbn0gZnJvbSBcIi4vcHVyaS50eXBlc1wiO1xuaW1wb3J0IHsgRlVaWllfT1BFUkFUT1JTIH0gZnJvbSBcIi4vcHVyaS50eXBlc1wiO1xuXG50eXBlIFB1cmlPcmRlckJ5RGlyZWN0aW9uID0gXCJhc2NcIiB8IFwiZGVzY1wiO1xudHlwZSBQdXJpT3JkZXJCeU51bGxzID0gXCJmaXJzdFwiIHwgXCJsYXN0XCI7XG50eXBlIEFueVNxbEV4cHJlc3Npb24gPSBTcWxFeHByZXNzaW9uPFxuICBcInN0cmluZ1wiIHwgXCJudW1iZXJcIiB8IFwiYm9vbGVhblwiIHwgXCJkYXRlXCIgfCBcInN0cmluZ1tdXCIgfCBcInRzdmVjdG9yXCIsXG4gIGJvb2xlYW5cbj47XG50eXBlIFN0cmluZ1NxbEV4cHJlc3Npb248VE51bGxhYmxlIGV4dGVuZHMgYm9vbGVhbiA9IGJvb2xlYW4+ID0gU3FsRXhwcmVzc2lvbjxcInN0cmluZ1wiLCBUTnVsbGFibGU+O1xudHlwZSBQdXJpT3JkZXJCeUV4cHJlc3Npb24gPSBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCIgfCBcInN0cmluZ1wiLCBib29sZWFuPjtcbnR5cGUgU3RyaW5nRXhwcmVzc2lvblNlbGVjdCA9IFJlY29yZDxzdHJpbmcsIFN0cmluZ1NxbEV4cHJlc3Npb24+O1xudHlwZSBTdHJpbmdFeHByZXNzaW9uU2VsZWN0UmVzdWx0PFRTZWxlY3QgZXh0ZW5kcyBTdHJpbmdFeHByZXNzaW9uU2VsZWN0PiA9IHtcbiAgW0sgaW4ga2V5b2YgVFNlbGVjdF06IFRTZWxlY3RbS10gZXh0ZW5kcyBTcWxFeHByZXNzaW9uPFwic3RyaW5nXCIsIGluZmVyIFROdWxsYWJsZT5cbiAgICA/IHRydWUgZXh0ZW5kcyBUTnVsbGFibGVcbiAgICAgID8gc3RyaW5nIHwgbnVsbFxuICAgICAgOiBzdHJpbmdcbiAgICA6IG5ldmVyO1xufTtcbnR5cGUgUHVyaU9yZGVyQnlJdGVtPFRDb2x1bW4gZXh0ZW5kcyBzdHJpbmc+ID0ge1xuICBjb2x1bW46IFRDb2x1bW4gfCBQdXJpT3JkZXJCeUV4cHJlc3Npb247XG4gIG9yZGVyPzogUHVyaU9yZGVyQnlEaXJlY3Rpb247XG4gIG51bGxzPzogUHVyaU9yZGVyQnlOdWxscztcbn07XG50eXBlIFB1cmlPcmRlckJ5RW50cnk8VENvbHVtbiBleHRlbmRzIHN0cmluZz4gPVxuICB8IFRDb2x1bW5cbiAgfCBQdXJpT3JkZXJCeUV4cHJlc3Npb25cbiAgfCBQdXJpT3JkZXJCeUl0ZW08VENvbHVtbj47XG50eXBlIFB1cmlPcmRlckJ5UnVudGltZUl0ZW0gPSB7XG4gIGNvbHVtbjogc3RyaW5nIHwgUHVyaU9yZGVyQnlFeHByZXNzaW9uO1xuICBvcmRlcj86IFB1cmlPcmRlckJ5RGlyZWN0aW9uO1xuICBudWxscz86IFB1cmlPcmRlckJ5TnVsbHM7XG59O1xudHlwZSBQdXJpT3JkZXJCeVJ1bnRpbWVFbnRyeSA9IHN0cmluZyB8IFB1cmlPcmRlckJ5RXhwcmVzc2lvbiB8IFB1cmlPcmRlckJ5UnVudGltZUl0ZW07XG5cbnR5cGUgRnJvbVJlZ2lzdHJhdGlvbiA9IHtcbiAga2luZDogXCJmcm9tXCI7XG4gIGFsaWFzOiBzdHJpbmc7XG4gIHRhYmxlOiBzdHJpbmcgfCBudWxsO1xufTtcblxudHlwZSBKb2luUmVnaXN0cmF0aW9uID0ge1xuICBraW5kOiBcImpvaW5cIjtcbiAgYWxpYXM6IHN0cmluZztcbiAgdGFibGU6IHN0cmluZyB8IG51bGw7XG4gIGpvaW5UeXBlOiBcImpvaW5cIiB8IFwibGVmdEpvaW5cIjtcbiAgbGVmdDogc3RyaW5nIHwgbnVsbDtcbiAgcmlnaHQ6IHN0cmluZyB8IG51bGw7XG4gIHJldXNhYmxlOiBib29sZWFuO1xufTtcblxudHlwZSBDb3JyZWxhdGlvblJlZ2lzdHJhdGlvbiA9IEZyb21SZWdpc3RyYXRpb24gfCBKb2luUmVnaXN0cmF0aW9uO1xuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VGdXp6eU9wZXJhdG9yKG9wZXJhdG9yPzogc3RyaW5nKTogRnV6enlPcGVyYXRvciB7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBvcGVyYXRvcj8udHJpbSgpID8/IFwiPCVcIjtcbiAgY29uc3QgZnV6enlPcGVyYXRvciA9IEZVWlpZX09QRVJBVE9SUy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZSA9PT0gbm9ybWFsaXplZCk7XG5cbiAgaWYgKCFmdXp6eU9wZXJhdG9yKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGZ1enp5IG9wZXJhdG9yOiAke29wZXJhdG9yID8/IFwiXCJ9YCk7XG4gIH1cblxuICByZXR1cm4gZnV6enlPcGVyYXRvcjtcbn1cblxuZnVuY3Rpb24gc2VyaWFsaXplSnNvblN1cGVyc2V0VmFsdWU8VmFsdWU+KHZhbHVlOiBWYWx1ZSk6IHN0cmluZyB7XG4gIGNvbnN0IHNlcmlhbGl6ZWQgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG5cbiAgaWYgKHNlcmlhbGl6ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICBcIlB1cmkgSlNPTkIgY29udGFpbm1lbnQgdmFsdWUgbXVzdCBiZSBKU09OLXNlcmlhbGl6YWJsZTsgSlNPTi5zdHJpbmdpZnkgcmV0dXJuZWQgdW5kZWZpbmVkLlwiLFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gc2VyaWFsaXplZDtcbn1cblxuZnVuY3Rpb24gc2VyaWFsaXplSnNvbkNvbHVtblZhbHVlPFZhbHVlPihcbiAgdGFibGVTcGVjOiBUYWJsZVNwZWMgfCBudWxsLFxuICBjb2x1bW46IHN0cmluZyxcbiAgdmFsdWU6IFZhbHVlLFxuKTogVmFsdWUgfCBzdHJpbmcge1xuICBpZiAoIXRhYmxlU3BlYz8uanNvbkNvbHVtbnMuaW5jbHVkZXMoY29sdW1uKSB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplT3JkZXJCeURpcmVjdGlvbihkaXJlY3Rpb246IFB1cmlPcmRlckJ5RGlyZWN0aW9uID0gXCJhc2NcIik6IFB1cmlPcmRlckJ5RGlyZWN0aW9uIHtcbiAgaWYgKGRpcmVjdGlvbiAhPT0gXCJhc2NcIiAmJiBkaXJlY3Rpb24gIT09IFwiZGVzY1wiKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIG9yZGVyIGRpcmVjdGlvbjogJHtkaXJlY3Rpb259YCk7XG4gIH1cblxuICByZXR1cm4gZGlyZWN0aW9uO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVPcmRlckJ5TnVsbHMobnVsbHM/OiBQdXJpT3JkZXJCeU51bGxzKTogUHVyaU9yZGVyQnlOdWxscyB8IHVuZGVmaW5lZCB7XG4gIGlmIChudWxscyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlmIChudWxscyAhPT0gXCJmaXJzdFwiICYmIG51bGxzICE9PSBcImxhc3RcIikge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBvcmRlciBudWxsczogJHtudWxsc31gKTtcbiAgfVxuXG4gIHJldHVybiBudWxscztcbn1cblxuZnVuY3Rpb24gZm9ybWF0TnVsbHNTdWZmaXgobnVsbHM/OiBQdXJpT3JkZXJCeU51bGxzKTogc3RyaW5nIHtcbiAgaWYgKCFudWxscykge1xuICAgIHJldHVybiBcIlwiO1xuICB9XG5cbiAgcmV0dXJuIGAgTlVMTFMgJHtudWxscy50b1VwcGVyQ2FzZSgpfWA7XG59XG5cbmZ1bmN0aW9uIGlzT3JkZXJCeUVudHJpZXM8VmFsdWU+KFxuICB2YWx1ZTogVmFsdWUsXG4pOiB2YWx1ZSBpcyBWYWx1ZSAmIHJlYWRvbmx5IFB1cmlPcmRlckJ5UnVudGltZUVudHJ5W10ge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIGlzU3FsRXhwcmVzc2lvbjxWYWx1ZT4odmFsdWU6IFZhbHVlKTogdmFsdWUgaXMgVmFsdWUgJiBBbnlTcWxFeHByZXNzaW9uIHtcbiAgcmV0dXJuIGlzT2JqZWN0VmFsdWUodmFsdWUpICYmIFwiX3R5cGVcIiBpbiB2YWx1ZSAmJiB2YWx1ZVtcIl90eXBlXCJdID09PSBcInNxbF9leHByZXNzaW9uXCI7XG59XG5cbmZ1bmN0aW9uIGlzT3JkZXJCeUV4cHJlc3Npb248VmFsdWU+KHZhbHVlOiBWYWx1ZSk6IHZhbHVlIGlzIFZhbHVlICYgUHVyaU9yZGVyQnlFeHByZXNzaW9uIHtcbiAgcmV0dXJuIGlzU3FsRXhwcmVzc2lvbih2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIGlzTmVzdGVkU2VsZWN0T2JqZWN0PFRUYWJsZXMgZXh0ZW5kcyBvYmplY3Q+KFxuICB2YWx1ZTogU2VsZWN0VmFsdWU8VFRhYmxlcz4gfCBTZWxlY3RPYmplY3Q8VFRhYmxlcz4sXG4pOiB2YWx1ZSBpcyBTZWxlY3RPYmplY3Q8VFRhYmxlcz4ge1xuICByZXR1cm4gaXNPYmplY3RWYWx1ZSh2YWx1ZSkgJiYgIShcIl90eXBlXCIgaW4gdmFsdWUpO1xufVxuXG50eXBlIFNlbGVjdFByb2plY3Rpb24gPSBNYXA8c3RyaW5nLCBzdHJpbmcgfCBTZWxlY3RQcm9qZWN0aW9uPjtcbnR5cGUgU2VsZWN0UmVzdWx0VmFsdWUgPVxuICB8IHN0cmluZ1xuICB8IG51bWJlclxuICB8IGJvb2xlYW5cbiAgfCBiaWdpbnRcbiAgfCBEYXRlXG4gIHwgQnVmZmVyXG4gIHwgbnVsbFxuICB8IHVuZGVmaW5lZFxuICB8IFNlbGVjdFJvd1xuICB8IFNlbGVjdFJlc3VsdFZhbHVlW107XG50eXBlIFNlbGVjdFJvdyA9IHsgW2NvbHVtbjogc3RyaW5nXTogU2VsZWN0UmVzdWx0VmFsdWUgfTtcbnR5cGUgU2VsZWN0UmVzdWx0ID0gU2VsZWN0Um93IHwgU2VsZWN0Um93W10gfCB1bmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGdldFNlbGVjdFJlbGF0aW9uQWxpYXMoXG4gIHBhdGg6IHN0cmluZyxcbiAgY29ycmVsYXRpb25zOiBSZWFkb25seU1hcDxzdHJpbmcsIENvcnJlbGF0aW9uUmVnaXN0cmF0aW9uPixcbiAgaWRlbnRpdHlTb3VyY2VzOiBSZWFkb25seU1hcDxzdHJpbmcsIHN0cmluZz4sXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBpZGVudGl0eUFsaWFzID0gaWRlbnRpdHlTb3VyY2VzLmdldChgJHtwYXRofV9faWRgKTtcbiAgY29uc3QgaWRlbnRpdHlSZWxhdGlvbiA9XG4gICAgaWRlbnRpdHlBbGlhcyA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogY29ycmVsYXRpb25zLmdldChpZGVudGl0eUFsaWFzKTtcbiAgaWYgKGlkZW50aXR5UmVsYXRpb24/LmtpbmQgPT09IFwiam9pblwiICYmIGlkZW50aXR5UmVsYXRpb24uam9pblR5cGUgPT09IFwibGVmdEpvaW5cIilcbiAgICByZXR1cm4gaWRlbnRpdHlBbGlhcztcbiAgY29uc3QgcmVsYXRpb24gPSBjb3JyZWxhdGlvbnMuZ2V0KHBhdGgpO1xuICByZXR1cm4gcmVsYXRpb24/LmtpbmQgPT09IFwiam9pblwiICYmIHJlbGF0aW9uLmpvaW5UeXBlID09PSBcImxlZnRKb2luXCIgPyBwYXRoIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBoeWRyYXRlU2VsZWN0UmVzdWx0KFxuICByZXN1bHQ6IFNlbGVjdFJlc3VsdCxcbiAgcGF0aHM6IFJlYWRvbmx5TWFwPHN0cmluZywgcmVhZG9ubHkgc3RyaW5nW10+LFxuICBjb3JyZWxhdGlvbnM6IFJlYWRvbmx5TWFwPHN0cmluZywgQ29ycmVsYXRpb25SZWdpc3RyYXRpb24+LFxuICBwcmVzZW5jZUNvbHVtbnM6IFJlYWRvbmx5TWFwPHN0cmluZywgc3RyaW5nPixcbiAgaWRlbnRpdHlTb3VyY2VzOiBSZWFkb25seU1hcDxzdHJpbmcsIHN0cmluZz4sXG4pOiBTZWxlY3RSZXN1bHQge1xuICBpZiAocGF0aHMuc2l6ZSA9PT0gMCB8fCByZXN1bHQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHJlc3VsdDtcblxuICBjb25zdCBoaWRkZW5Db2x1bW5zID0gbmV3IFNldChwcmVzZW5jZUNvbHVtbnMudmFsdWVzKCkpO1xuICBjb25zdCBwcm9qZWN0aW9uOiBTZWxlY3RQcm9qZWN0aW9uID0gbmV3IE1hcCgpO1xuICBmb3IgKGNvbnN0IFthbGlhcywgcGF0aF0gb2YgcGF0aHMpIHtcbiAgICBsZXQgcGFyZW50ID0gcHJvamVjdGlvbjtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBwYXRoLnNsaWNlKDAsIC0xKSkge1xuICAgICAgbGV0IGNoaWxkID0gcGFyZW50LmdldChrZXkpO1xuICAgICAgaWYgKCEoY2hpbGQgaW5zdGFuY2VvZiBNYXApKSB7XG4gICAgICAgIGNoaWxkID0gbmV3IE1hcCgpO1xuICAgICAgICBwYXJlbnQuc2V0KGtleSwgY2hpbGQpO1xuICAgICAgfVxuICAgICAgcGFyZW50ID0gY2hpbGQ7XG4gICAgfVxuICAgIGNvbnN0IGxlYWYgPSBwYXRoW3BhdGgubGVuZ3RoIC0gMV07XG4gICAgYXNzZXJ0KGxlYWYgIT09IHVuZGVmaW5lZCk7XG4gICAgcGFyZW50LnNldChsZWFmLCBhbGlhcyk7XG4gIH1cblxuICBjb25zdCBoeWRyYXRlUm93ID0gKHJvdzogU2VsZWN0Um93KSA9PiB7XG4gICAgY29uc3QgcHJvamVjdCA9IChmaWVsZHM6IFNlbGVjdFByb2plY3Rpb24sIHBhdGg6IHJlYWRvbmx5IHN0cmluZ1tdKTogU2VsZWN0Um93IHwgbnVsbCA9PiB7XG4gICAgICBjb25zdCBlbnRyaWVzOiBbc3RyaW5nLCBTZWxlY3RSZXN1bHRWYWx1ZV1bXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBba2V5LCBmaWVsZF0gb2YgZmllbGRzKSB7XG4gICAgICAgIGlmIChmaWVsZCBpbnN0YW5jZW9mIE1hcCkge1xuICAgICAgICAgIGVudHJpZXMucHVzaChba2V5LCBwcm9qZWN0KGZpZWxkLCBbLi4ucGF0aCwga2V5XSldKTtcbiAgICAgICAgfSBlbHNlIGlmIChPYmplY3QuaGFzT3duKHJvdywgZmllbGQpKSB7XG4gICAgICAgICAgZW50cmllcy5wdXNoKFtrZXksIHJvd1tmaWVsZF1dKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgdmFsdWUgPSBPYmplY3QuZnJvbUVudHJpZXMoZW50cmllcyk7XG4gICAgICAvLyDqt7jro7kg7J2066aE7J20IOuLrOudvOuPhCDrqoXsi5ztlZwgaWTsnZggTEVGVCBKT0lOIOybkOuzuOycvOuhnCDqtIDqs4Qg7KG07J6sIOyXrOu2gOulvCDtjJDri6jtlanri4jri6QuXG4gICAgICBjb25zdCByZWxhdGlvbkFsaWFzID0gZ2V0U2VsZWN0UmVsYXRpb25BbGlhcyhwYXRoLmpvaW4oXCJfX1wiKSwgY29ycmVsYXRpb25zLCBpZGVudGl0eVNvdXJjZXMpO1xuICAgICAgY29uc3QgcHJlc2VuY2VDb2x1bW4gPVxuICAgICAgICByZWxhdGlvbkFsaWFzID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBwcmVzZW5jZUNvbHVtbnMuZ2V0KHJlbGF0aW9uQWxpYXMpO1xuICAgICAgaWYgKFxuICAgICAgICByZWxhdGlvbkFsaWFzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgKHByZXNlbmNlQ29sdW1uICE9PSB1bmRlZmluZWRcbiAgICAgICAgICA/IHJvd1twcmVzZW5jZUNvbHVtbl0gPT09IGZhbHNlXG4gICAgICAgICAgOiBPYmplY3QuaGFzT3duKHZhbHVlLCBcImlkXCIpICYmIHZhbHVlLmlkID09PSBudWxsKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH07XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLk9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgT2JqZWN0LmVudHJpZXMocm93KS5maWx0ZXIoKFtrZXldKSA9PiAhcGF0aHMuaGFzKGtleSkgJiYgIWhpZGRlbkNvbHVtbnMuaGFzKGtleSkpLFxuICAgICAgKSxcbiAgICAgIC4uLk9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgWy4uLnByb2plY3Rpb25dLm1hcCgoW2tleSwgZmllbGRzXSkgPT4ge1xuICAgICAgICAgIGFzc2VydChmaWVsZHMgaW5zdGFuY2VvZiBNYXApO1xuICAgICAgICAgIHJldHVybiBba2V5LCBwcm9qZWN0KGZpZWxkcywgW2tleV0pXTtcbiAgICAgICAgfSksXG4gICAgICApLFxuICAgIH07XG4gIH07XG5cbiAgLy8gSlNPTiDrgrTrtoDsmYAg7KeB7KCRIOyngOygle2VnCBfXyDrs4Tsua3snYAg7KSR7LKpIHNlbGVjdOydmCDqsr3roZzqsIAg7JWE64uI66+A66GcIO2DkOyDie2VmOyngCDslYrsirXri4jri6QuXG4gIHJldHVybiBBcnJheS5pc0FycmF5KHJlc3VsdCkgPyByZXN1bHQubWFwKGh5ZHJhdGVSb3cpIDogaHlkcmF0ZVJvdyhyZXN1bHQpO1xufVxuXG5leHBvcnQgY2xhc3MgUHVyaTxUU2NoZW1hLCBUVGFibGVzIGV4dGVuZHMgb2JqZWN0LCBUUmVzdWx0PiB7XG4gIHByaXZhdGUga25leFF1ZXJ5OiBLbmV4LlF1ZXJ5QnVpbGRlcjtcbiAgcHJpdmF0ZSB0YWJsZVNwZWM6IFRhYmxlU3BlYyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIG5lc3RlZFNlbGVjdFBhdGhzID0gbmV3IE1hcDxzdHJpbmcsIHJlYWRvbmx5IHN0cmluZ1tdPigpO1xuICBwcml2YXRlIG5lc3RlZFNlbGVjdElkZW50aXR5U291cmNlcyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIHByaXZhdGUgY29ycmVsYXRpb25SZWdpc3RyeSA9IG5ldyBNYXA8c3RyaW5nLCBDb3JyZWxhdGlvblJlZ2lzdHJhdGlvbj4oKTtcblxuICAvLyDsg53shLHsnpAg7Iuc6re464uI7LKY65OkXG4gIGNvbnN0cnVjdG9yKGtuZXg6IEtuZXgsIHRhYmxlTmFtZTogc3RyaW5nKTtcbiAgY29uc3RydWN0b3Ioa25leDogS25leCwgdGFibGVTb3VyY2U6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IFB1cmk8VFNjaGVtYSwgYW55LCBhbnk+Pik7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBrbmV4OiBLbmV4LFxuICAgIHRhYmxlTmFtZU9yU291cmNlOiBhbnksXG4gICkge1xuICAgIGlmIChpc1N0cmluZ1ZhbHVlKHRhYmxlTmFtZU9yU291cmNlKSkge1xuICAgICAgLy8gQ2FzZTogbmV3IFB1cmkoa25leCwgXCJ1c2Vyc1wiKVxuICAgICAgdGhpcy5rbmV4UXVlcnkgPSB0aGlzLmtuZXgodGFibGVOYW1lT3JTb3VyY2UpLmZyb20odGFibGVOYW1lT3JTb3VyY2UpO1xuICAgICAgdGhpcy50YWJsZVNwZWMgPSB0aGlzLnNhZmVHZXRUYWJsZVNwZWModGFibGVOYW1lT3JTb3VyY2UpO1xuICAgICAgdGhpcy5jb3JyZWxhdGlvblJlZ2lzdHJ5LnNldCh0YWJsZU5hbWVPclNvdXJjZSwge1xuICAgICAgICBraW5kOiBcImZyb21cIixcbiAgICAgICAgYWxpYXM6IHRhYmxlTmFtZU9yU291cmNlLFxuICAgICAgICB0YWJsZTogdGFibGVOYW1lT3JTb3VyY2UsXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGlzT2JqZWN0VmFsdWUodGFibGVOYW1lT3JTb3VyY2UpKSB7XG4gICAgICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXModGFibGVOYW1lT3JTb3VyY2UpO1xuICAgICAgaWYgKGVudHJpZXMubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRhYmxlIHNwZWMgbXVzdCBoYXZlIGV4YWN0bHkgb25lIGVudHJ5XCIpO1xuICAgICAgfVxuICAgICAgYXNzZXJ0KGVudHJpZXNbMF0pO1xuICAgICAgY29uc3QgW2FsaWFzLCBzb3VyY2VdID0gZW50cmllc1swXTtcbiAgICAgIGlmIChpc1N0cmluZ1ZhbHVlKHNvdXJjZSkpIHtcbiAgICAgICAgdGhpcy5rbmV4UXVlcnkgPSB0aGlzLmtuZXgoc291cmNlKS5mcm9tKHsgW2FsaWFzXTogc291cmNlIH0pO1xuICAgICAgICB0aGlzLnRhYmxlU3BlYyA9IHRoaXMuc2FmZUdldFRhYmxlU3BlYyhzb3VyY2UpO1xuICAgICAgICB0aGlzLmNvcnJlbGF0aW9uUmVnaXN0cnkuc2V0KGFsaWFzLCB7IGtpbmQ6IFwiZnJvbVwiLCBhbGlhcywgdGFibGU6IHNvdXJjZSB9KTtcbiAgICAgIH0gZWxzZSBpZiAoc291cmNlIGluc3RhbmNlb2YgUHVyaSkge1xuICAgICAgICBjb25zdCBzdWJxdWVyeUJ1aWxkZXIgPSBzb3VyY2UucmF3UXVlcnkoKTtcbiAgICAgICAgdGhpcy5rbmV4UXVlcnkgPSB0aGlzLmtuZXguZnJvbShzdWJxdWVyeUJ1aWxkZXIuYXMoYWxpYXMpKTtcbiAgICAgICAgdGhpcy5jb3JyZWxhdGlvblJlZ2lzdHJ5LnNldChhbGlhcywgeyBraW5kOiBcImZyb21cIiwgYWxpYXMsIHRhYmxlOiBudWxsIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCB0YWJsZSBzcGVjaWZpY2F0aW9uXCIpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHRhYmxlIHNwZWNpZmljYXRpb25cIik7XG4gICAgfVxuICB9XG5cbiAgc2FmZUdldFRhYmxlU3BlYyh0YWJsZU5hbWU6IHN0cmluZyk6IFRhYmxlU3BlYyB8IG51bGwge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gRW50aXR5TWFuYWdlci5nZXRUYWJsZVNwZWModGFibGVOYW1lKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8vIFN0YXRpYyBTUUwgaGVscGVyIGZ1bmN0aW9ucyBmb3IgU0VMRUNUXG4gIHN0YXRpYyBjb3VudChjb2x1bW46IHN0cmluZyA9IFwiKlwiKTogU3FsRXhwcmVzc2lvbjxcIm51bWJlclwiPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICBfcmV0dXJuOiBcIm51bWJlclwiLFxuICAgICAgX3NxbDogYENPVU5UKD8/KTo6aW50ZWdlcmAsXG4gICAgICBfcGFyYW1zOiBbY29sdW1uXSxcbiAgICB9O1xuICB9XG4gIHN0YXRpYyBzdW0oY29sdW1uOiBzdHJpbmcpOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCI+IHtcbiAgICByZXR1cm4ge1xuICAgICAgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIixcbiAgICAgIF9yZXR1cm46IFwibnVtYmVyXCIsXG4gICAgICBfc3FsOiBgU1VNKD8/KWAsXG4gICAgICBfcGFyYW1zOiBbY29sdW1uXSxcbiAgICB9O1xuICB9XG4gIHN0YXRpYyBhdmcoY29sdW1uOiBzdHJpbmcpOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCI+IHtcbiAgICByZXR1cm4ge1xuICAgICAgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIixcbiAgICAgIF9yZXR1cm46IFwibnVtYmVyXCIsXG4gICAgICBfc3FsOiBgQVZHKD8/KWAsXG4gICAgICBfcGFyYW1zOiBbY29sdW1uXSxcbiAgICB9O1xuICB9XG4gIHN0YXRpYyBtYXgoY29sdW1uOiBzdHJpbmcpOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCI+IHtcbiAgICByZXR1cm4ge1xuICAgICAgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIixcbiAgICAgIF9yZXR1cm46IFwibnVtYmVyXCIsXG4gICAgICBfc3FsOiBgTUFYKD8/KWAsXG4gICAgICBfcGFyYW1zOiBbY29sdW1uXSxcbiAgICB9O1xuICB9XG4gIHN0YXRpYyBtaW4oY29sdW1uOiBzdHJpbmcpOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCI+IHtcbiAgICByZXR1cm4ge1xuICAgICAgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIixcbiAgICAgIF9yZXR1cm46IFwibnVtYmVyXCIsXG4gICAgICBfc3FsOiBgTUlOKD8/KWAsXG4gICAgICBfcGFyYW1zOiBbY29sdW1uXSxcbiAgICB9O1xuICB9XG4gIHN0YXRpYyBjb25jYXQoLi4uYXJnczogc3RyaW5nW10pOiBTcWxFeHByZXNzaW9uPFwic3RyaW5nXCI+IHtcbiAgICByZXR1cm4ge1xuICAgICAgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIixcbiAgICAgIF9yZXR1cm46IFwic3RyaW5nXCIsXG4gICAgICBfc3FsOiBgQ09OQ0FUKCR7YXJncy5tYXAoKCkgPT4gXCI/XCIpLmpvaW4oXCIsIFwiKX0pYCxcbiAgICAgIF9wYXJhbXM6IGFyZ3MsXG4gICAgfTtcbiAgfVxuICBzdGF0aWMgY29hbGVzY2UoZXhwcmVzc2lvbjogU3RyaW5nU3FsRXhwcmVzc2lvbiwgZmFsbGJhY2s6IHN0cmluZyk6IFNxbEV4cHJlc3Npb248XCJzdHJpbmdcIj4ge1xuICAgIHJldHVybiB7XG4gICAgICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLFxuICAgICAgX3JldHVybjogXCJzdHJpbmdcIixcbiAgICAgIF9zcWw6IGBDT0FMRVNDRSgke2V4cHJlc3Npb24uX3NxbH0sID8pYCxcbiAgICAgIF9wYXJhbXM6IFsuLi5leHByZXNzaW9uLl9wYXJhbXMsIGZhbGxiYWNrXSxcbiAgICB9O1xuICB9XG4gIHN0YXRpYyBjb25jYXRFeHByZXNzaW9ucyguLi5hcmdzOiAoc3RyaW5nIHwgU3RyaW5nU3FsRXhwcmVzc2lvbilbXSk6IFNxbEV4cHJlc3Npb248XCJzdHJpbmdcIj4ge1xuICAgIHJldHVybiB7XG4gICAgICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLFxuICAgICAgX3JldHVybjogXCJzdHJpbmdcIixcbiAgICAgIF9zcWw6IGBDT05DQVQoJHthcmdzLm1hcCgoYXJnKSA9PiAoaXNTdHJpbmdWYWx1ZShhcmcpID8gXCI/Ojp0ZXh0XCIgOiBhcmcuX3NxbCkpLmpvaW4oXCIsIFwiKX0pYCxcbiAgICAgIF9wYXJhbXM6IGFyZ3MuZmxhdE1hcCgoYXJnKSA9PiAoaXNTdHJpbmdWYWx1ZShhcmcpID8gW2FyZ10gOiBhcmcuX3BhcmFtcykpLFxuICAgIH07XG4gIH1cbiAgc3RhdGljIHVwcGVyKGNvbHVtbjogc3RyaW5nKTogU3FsRXhwcmVzc2lvbjxcInN0cmluZ1wiPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICBfcmV0dXJuOiBcInN0cmluZ1wiLFxuICAgICAgX3NxbDogXCJVUFBFUig/PylcIixcbiAgICAgIF9wYXJhbXM6IFtjb2x1bW5dLFxuICAgIH07XG4gIH1cbiAgc3RhdGljIGxvd2VyKGNvbHVtbjogc3RyaW5nKTogU3FsRXhwcmVzc2lvbjxcInN0cmluZ1wiPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICBfcmV0dXJuOiBcInN0cmluZ1wiLFxuICAgICAgX3NxbDogXCJMT1dFUig/PylcIixcbiAgICAgIF9wYXJhbXM6IFtjb2x1bW5dLFxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgd29yZFNpbWlsYXJpdHkoY29sdW1uOiBzdHJpbmcsIHF1ZXJ5OiBzdHJpbmcpOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCI+O1xuICBzdGF0aWMgd29yZFNpbWlsYXJpdHk8VE51bGxhYmxlIGV4dGVuZHMgYm9vbGVhbj4oXG4gICAgY29sdW1uOiBTdHJpbmdTcWxFeHByZXNzaW9uPFROdWxsYWJsZT4sXG4gICAgcXVlcnk6IHN0cmluZyxcbiAgKTogU3FsRXhwcmVzc2lvbjxcIm51bWJlclwiLCBUTnVsbGFibGU+O1xuICBzdGF0aWMgd29yZFNpbWlsYXJpdHkoXG4gICAgY29sdW1uOiBzdHJpbmcgfCBTdHJpbmdTcWxFeHByZXNzaW9uLFxuICAgIHF1ZXJ5OiBzdHJpbmcsXG4gICk6IFNxbEV4cHJlc3Npb248XCJudW1iZXJcIiwgYm9vbGVhbj4ge1xuICAgIGlmIChpc1N0cmluZ1ZhbHVlKGNvbHVtbikpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICAgIF9yZXR1cm46IFwibnVtYmVyXCIsXG4gICAgICAgIF9zcWw6IFwid29yZF9zaW1pbGFyaXR5KD8sID8/KVwiLFxuICAgICAgICBfcGFyYW1zOiBbcXVlcnksIGNvbHVtbl0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLFxuICAgICAgX3JldHVybjogXCJudW1iZXJcIixcbiAgICAgIF9zcWw6IGB3b3JkX3NpbWlsYXJpdHkoPywgJHtjb2x1bW5bXCJfc3FsXCJdfSlgLFxuICAgICAgX3BhcmFtczogW3F1ZXJ5LCAuLi5jb2x1bW5bXCJfcGFyYW1zXCJdXSxcbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIHNpbWlsYXJpdHkoY29sdW1uOiBzdHJpbmcsIHF1ZXJ5OiBzdHJpbmcpOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCI+O1xuICBzdGF0aWMgc2ltaWxhcml0eTxUTnVsbGFibGUgZXh0ZW5kcyBib29sZWFuPihcbiAgICBjb2x1bW46IFN0cmluZ1NxbEV4cHJlc3Npb248VE51bGxhYmxlPixcbiAgICBxdWVyeTogc3RyaW5nLFxuICApOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCIsIFROdWxsYWJsZT47XG4gIHN0YXRpYyBzaW1pbGFyaXR5KFxuICAgIGNvbHVtbjogc3RyaW5nIHwgU3RyaW5nU3FsRXhwcmVzc2lvbixcbiAgICBxdWVyeTogc3RyaW5nLFxuICApOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCIsIGJvb2xlYW4+IHtcbiAgICBpZiAoaXNTdHJpbmdWYWx1ZShjb2x1bW4pKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLFxuICAgICAgICBfcmV0dXJuOiBcIm51bWJlclwiLFxuICAgICAgICBfc3FsOiBcInNpbWlsYXJpdHkoPz8sID8pXCIsXG4gICAgICAgIF9wYXJhbXM6IFtjb2x1bW4sIHF1ZXJ5XSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICBfcmV0dXJuOiBcIm51bWJlclwiLFxuICAgICAgX3NxbDogYHNpbWlsYXJpdHkoJHtjb2x1bW5bXCJfc3FsXCJdfSwgPylgLFxuICAgICAgX3BhcmFtczogWy4uLmNvbHVtbltcIl9wYXJhbXNcIl0sIHF1ZXJ5XSxcbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIHN0cmljdFdvcmRTaW1pbGFyaXR5KGNvbHVtbjogc3RyaW5nLCBxdWVyeTogc3RyaW5nKTogU3FsRXhwcmVzc2lvbjxcIm51bWJlclwiPjtcbiAgc3RhdGljIHN0cmljdFdvcmRTaW1pbGFyaXR5PFROdWxsYWJsZSBleHRlbmRzIGJvb2xlYW4+KFxuICAgIGNvbHVtbjogU3RyaW5nU3FsRXhwcmVzc2lvbjxUTnVsbGFibGU+LFxuICAgIHF1ZXJ5OiBzdHJpbmcsXG4gICk6IFNxbEV4cHJlc3Npb248XCJudW1iZXJcIiwgVE51bGxhYmxlPjtcbiAgc3RhdGljIHN0cmljdFdvcmRTaW1pbGFyaXR5KFxuICAgIGNvbHVtbjogc3RyaW5nIHwgU3RyaW5nU3FsRXhwcmVzc2lvbixcbiAgICBxdWVyeTogc3RyaW5nLFxuICApOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCIsIGJvb2xlYW4+IHtcbiAgICBpZiAoaXNTdHJpbmdWYWx1ZShjb2x1bW4pKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLFxuICAgICAgICBfcmV0dXJuOiBcIm51bWJlclwiLFxuICAgICAgICBfc3FsOiBgc3RyaWN0X3dvcmRfc2ltaWxhcml0eSg/LCA/PylgLFxuICAgICAgICBfcGFyYW1zOiBbcXVlcnksIGNvbHVtbl0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLFxuICAgICAgX3JldHVybjogXCJudW1iZXJcIixcbiAgICAgIF9zcWw6IGBzdHJpY3Rfd29yZF9zaW1pbGFyaXR5KD8sICR7Y29sdW1uW1wiX3NxbFwiXX0pYCxcbiAgICAgIF9wYXJhbXM6IFtxdWVyeSwgLi4uY29sdW1uW1wiX3BhcmFtc1wiXV0sXG4gICAgfTtcbiAgfVxuXG4gIC8vIFJhdyBmdW5jdGlvbnMgZm9yIFNFTEVDVFxuICBzdGF0aWMgcmF3U3RyaW5nKHNxbDogc3RyaW5nLCBwYXJhbXM6IEtuZXguUmF3QmluZGluZ1tdID0gW10pOiBTcWxFeHByZXNzaW9uPFwic3RyaW5nXCI+IHtcbiAgICByZXR1cm4geyBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLCBfcmV0dXJuOiBcInN0cmluZ1wiLCBfc3FsOiBzcWwsIF9wYXJhbXM6IHBhcmFtcyB9O1xuICB9XG5cbiAgc3RhdGljIHJhd1N0cmluZ0FycmF5KHNxbDogc3RyaW5nLCBwYXJhbXM6IEtuZXguUmF3QmluZGluZ1tdID0gW10pOiBTcWxFeHByZXNzaW9uPFwic3RyaW5nW11cIj4ge1xuICAgIHJldHVybiB7IF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsIF9yZXR1cm46IFwic3RyaW5nW11cIiwgX3NxbDogc3FsLCBfcGFyYW1zOiBwYXJhbXMgfTtcbiAgfVxuXG4gIHN0YXRpYyByYXdOdW1iZXIoc3FsOiBzdHJpbmcsIHBhcmFtczogS25leC5SYXdCaW5kaW5nW10gPSBbXSk6IFNxbEV4cHJlc3Npb248XCJudW1iZXJcIj4ge1xuICAgIHJldHVybiB7IF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsIF9yZXR1cm46IFwibnVtYmVyXCIsIF9zcWw6IHNxbCwgX3BhcmFtczogcGFyYW1zIH07XG4gIH1cblxuICBzdGF0aWMgcmF3Qm9vbGVhbihzcWw6IHN0cmluZywgcGFyYW1zOiBLbmV4LlJhd0JpbmRpbmdbXSA9IFtdKTogU3FsRXhwcmVzc2lvbjxcImJvb2xlYW5cIj4ge1xuICAgIHJldHVybiB7IF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsIF9yZXR1cm46IFwiYm9vbGVhblwiLCBfc3FsOiBzcWwsIF9wYXJhbXM6IHBhcmFtcyB9O1xuICB9XG5cbiAgc3RhdGljIHJhd0RhdGUoc3FsOiBzdHJpbmcsIHBhcmFtczogS25leC5SYXdCaW5kaW5nW10gPSBbXSk6IFNxbEV4cHJlc3Npb248XCJkYXRlXCI+IHtcbiAgICByZXR1cm4geyBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLCBfcmV0dXJuOiBcImRhdGVcIiwgX3NxbDogc3FsLCBfcGFyYW1zOiBwYXJhbXMgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGVFMg6rKA7IOJ7Ja0IO2VmOydtOudvOydtO2MhVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAuc2VsZWN0KHtcbiAgICogICB0aXRsZTogUHVyaS5oaWdobGlnaHQoXCJwb3N0cy50aXRsZVwiLCBzZWFyY2gpLFxuICAgKiAgIGNvbnRlbnQ6IFB1cmkuaGlnaGxpZ2h0KFwicG9zdHMuY29udGVudFwiLCBzZWFyY2gsIHtcbiAgICogICAgIHN0YXJ0U2VsOiBcIjxtYXJrPlwiLFxuICAgKiAgICAgc3RvcFNlbDogXCI8L21hcms+XCIsXG4gICAqICAgICBtYXhGcmFnbWVudHM6IDMsXG4gICAqICAgfSksXG4gICAqIH0pXG4gICAqL1xuICBzdGF0aWMgdHNIaWdobGlnaHQoXG4gICAgY29sdW1uOiBzdHJpbmcsXG4gICAgcXVlcnk6IHN0cmluZyxcbiAgICBfb3B0aW9ucz86IFRzSGlnaGxpZ2h0T3B0aW9ucyxcbiAgKTogU3FsRXhwcmVzc2lvbjxcInN0cmluZ1wiPiB7XG4gICAgY29uc3QgeyBwYXJzZXIgPSBcIndlYnNlYXJjaF90b190c3F1ZXJ5XCIsIGNvbmZpZyA9IFwic2ltcGxlXCIsIC4uLm9wdGlvbnMgfSA9IF9vcHRpb25zID8/IHt9O1xuXG4gICAgY29uc3QgaGxPcHRpb25QYXJ0cyA9IE9iamVjdC5lbnRyaWVzKG9wdGlvbnMpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICByZXR1cm4gYCR7aW5mbGVjdGlvbi5jYW1lbGl6ZShrZXkpfT0ke3ZhbHVlfWA7XG4gICAgfSk7XG5cbiAgICBjb25zdCBobE9wdGlvbnMgPSBobE9wdGlvblBhcnRzLmxlbmd0aCA+IDAgPyBgLCAnJHtobE9wdGlvblBhcnRzLmpvaW4oXCIsIFwiKX0nYCA6IFwiXCI7XG5cbiAgICByZXR1cm4ge1xuICAgICAgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIixcbiAgICAgIF9yZXR1cm46IFwic3RyaW5nXCIsXG4gICAgICBfc3FsOiBgdHNfaGVhZGxpbmUoPywgPz8sICR7cGFyc2VyfSg/LCA/KSR7aGxPcHRpb25zfSlgLFxuICAgICAgX3BhcmFtczogW2NvbmZpZywgY29sdW1uLCBjb25maWcsIHF1ZXJ5XSxcbiAgICB9O1xuICB9XG5cbiAgLy8gdHNfcmFua1xuICBzdGF0aWMgdHNSYW5rKFxuICAgIGNvbHVtbjogc3RyaW5nIHwgU3FsRXhwcmVzc2lvbjxcInRzdmVjdG9yXCI+LFxuICAgIHF1ZXJ5OiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFRzUmFua09wdGlvbnMsXG4gICk6IFNxbEV4cHJlc3Npb248XCJudW1iZXJcIj4ge1xuICAgIHJldHVybiBQdXJpW1wiX3RzUmFua1wiXShcInRzX3JhbmtcIiwgY29sdW1uLCBxdWVyeSwgb3B0aW9ucyk7XG4gIH1cblxuICAvLyB0c19yYW5rX2NkXG4gIHN0YXRpYyB0c1JhbmtDZChcbiAgICBjb2x1bW46IHN0cmluZyB8IFNxbEV4cHJlc3Npb248XCJ0c3ZlY3RvclwiPixcbiAgICBxdWVyeTogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBUc1JhbmtPcHRpb25zLFxuICApOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCI+IHtcbiAgICByZXR1cm4gUHVyaVtcIl90c1JhbmtcIl0oXCJ0c19yYW5rX2NkXCIsIGNvbHVtbiwgcXVlcnksIG9wdGlvbnMpO1xuICB9XG5cbiAgc3RhdGljIHRvVHNWZWN0b3IoY29sdW1uOiBzdHJpbmcsIGNvbmZpZzogc3RyaW5nID0gXCJzaW1wbGVcIik6IFNxbEV4cHJlc3Npb248XCJ0c3ZlY3RvclwiPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICBfcmV0dXJuOiBcInRzdmVjdG9yXCIsXG4gICAgICBfc3FsOiBgdG9fdHN2ZWN0b3IoPywgPz8pYCxcbiAgICAgIF9wYXJhbXM6IFtjb25maWcsIGNvbHVtbl0sXG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBfdHNSYW5rKFxuICAgIHR5cGU6IFwidHNfcmFua1wiIHwgXCJ0c19yYW5rX2NkXCIsXG4gICAgY29sdW1uOiBzdHJpbmcgfCBTcWxFeHByZXNzaW9uPFwidHN2ZWN0b3JcIj4sXG4gICAgcXVlcnk6IHN0cmluZyxcbiAgICBvcHRpb25zPzogVHNSYW5rT3B0aW9ucyxcbiAgKTogU3FsRXhwcmVzc2lvbjxcIm51bWJlclwiPiB7XG4gICAgY29uc3Qge1xuICAgICAgcGFyc2VyID0gXCJ3ZWJzZWFyY2hfdG9fdHNxdWVyeVwiLFxuICAgICAgY29uZmlnID0gXCJzaW1wbGVcIixcbiAgICAgIG5vcm1hbGl6YXRpb24sXG4gICAgICB3ZWlnaHRzLFxuICAgIH0gPSBvcHRpb25zID8/IHt9O1xuXG4gICAgY29uc3QgcGFyYW1zID0gW107XG4gICAgbGV0IHNxbFRlbXBsYXRlID0gYCR7dHlwZX0oYDtcblxuICAgIGlmICh3ZWlnaHRzKSB7XG4gICAgICBzcWxUZW1wbGF0ZSArPSBgQVJSQVlbJHt3ZWlnaHRzLm1hcCgoKSA9PiBcIj9cIikuam9pbihcIiwgXCIpfV06OmZsb2F0NFtdLCBgO1xuICAgICAgcGFyYW1zLnB1c2goLi4ud2VpZ2h0cyk7XG4gICAgfVxuXG4gICAgaWYgKGlzU3RyaW5nVmFsdWUoY29sdW1uKSkge1xuICAgICAgc3FsVGVtcGxhdGUgKz0gYD8/LCAke3BhcnNlcn0oPywgPylgO1xuICAgICAgcGFyYW1zLnB1c2goY29sdW1uLCBjb25maWcsIHF1ZXJ5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3FsVGVtcGxhdGUgKz0gYCR7Y29sdW1uW1wiX3NxbFwiXX0sICR7cGFyc2VyfSg/LCA/KWA7XG4gICAgICBwYXJhbXMucHVzaCguLi5jb2x1bW5bXCJfcGFyYW1zXCJdLCBjb25maWcsIHF1ZXJ5KTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXphdGlvbikge1xuICAgICAgc3FsVGVtcGxhdGUgKz0gXCIsID9cIjtcbiAgICAgIHBhcmFtcy5wdXNoKG5vcm1hbGl6YXRpb24pO1xuICAgIH1cblxuICAgIHNxbFRlbXBsYXRlICs9IFwiKVwiO1xuXG4gICAgcmV0dXJuIHsgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIiwgX3JldHVybjogXCJudW1iZXJcIiwgX3NxbDogc3FsVGVtcGxhdGUsIF9wYXJhbXM6IHBhcmFtcyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFBHcm9vbmdhIEZ1bGxUZXh0IOyduOuNseyKpCDqsoDsg4kg7KCQ7IiYXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC5zZWxlY3Qoe1xuICAgKiAgIHNjb3JlOiBQdXJpLnNjb3JlKCksXG4gICAqIH0pXG4gICAqL1xuICBzdGF0aWMgc2NvcmUoKTogU3FsRXhwcmVzc2lvbjxcIm51bWJlclwiPiB7XG4gICAgcmV0dXJuIFB1cmkucmF3TnVtYmVyKFwicGdyb29uZ2Ffc2NvcmUodGFibGVvaWQsIGN0aWQpXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBHcm9vbmdhIEZ1bGxUZXh0IOyduOuNseyKpCDqsoDsg4kg7ZWY7J2065287J207YyFXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC5zZWxlY3Qoe1xuICAgKiAgIHRpdGxlOiBQdXJpLmhpZ2hsaWdodChcInBvc3RzLnRpdGxlXCIsIHNlYXJjaCksXG4gICAqIH0pXG4gICAqL1xuICBzdGF0aWMgaGlnaGxpZ2h0KGNvbHVtbjogc3RyaW5nLCBxdWVyeTogc3RyaW5nIHwgc3RyaW5nW10pOiBTcWxFeHByZXNzaW9uPFwic3RyaW5nXCI+O1xuICBzdGF0aWMgaGlnaGxpZ2h0KGNvbHVtbnM6IHN0cmluZ1tdLCBxdWVyeTogc3RyaW5nIHwgc3RyaW5nW10pOiBTcWxFeHByZXNzaW9uPFwic3RyaW5nW11cIj47XG5cbiAgc3RhdGljIGhpZ2hsaWdodChcbiAgICBjb2x1bW5PckNvbHVtbnM6IHN0cmluZyB8IHN0cmluZ1tdLFxuICAgIHF1ZXJ5OiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgKTogU3FsRXhwcmVzc2lvbjxcInN0cmluZ1wiPiB8IFNxbEV4cHJlc3Npb248XCJzdHJpbmdbXVwiPiB7XG4gICAgY29uc3QgcXVlcnlBcnIgPSBBcnJheS5pc0FycmF5KHF1ZXJ5KSA/IHF1ZXJ5IDogW3F1ZXJ5XTtcbiAgICBjb25zdCBxdWVyeUNsYXVzZSA9IGBBUlJBWVske3F1ZXJ5QXJyLm1hcCgoKSA9PiBcIj9cIikuam9pbihcIiwgXCIpfV1gO1xuXG4gICAgLy8g64uo7J28IOy7rOufvOyduCDqsr3smrBcbiAgICBpZiAoaXNTdHJpbmdWYWx1ZShjb2x1bW5PckNvbHVtbnMpKSB7XG4gICAgICByZXR1cm4gUHVyaS5yYXdTdHJpbmcoYHBncm9vbmdhX2hpZ2hsaWdodF9odG1sKD8/LCAke3F1ZXJ5Q2xhdXNlfSlgLCBbXG4gICAgICAgIGNvbHVtbk9yQ29sdW1ucyxcbiAgICAgICAgLi4ucXVlcnlBcnIsXG4gICAgICBdKTtcbiAgICB9XG5cbiAgICAvLyDsu6zrn7wg67Cw7Je07J24IOqyveyasFxuICAgIHJldHVybiBQdXJpLnJhd1N0cmluZ0FycmF5KFxuICAgICAgYHBncm9vbmdhX2hpZ2hsaWdodF9odG1sKEFSUkFZWyR7Y29sdW1uT3JDb2x1bW5zLm1hcCgoKSA9PiBcIj8/XCIpLmpvaW4oXCIsIFwiKX1dLCAke3F1ZXJ5Q2xhdXNlfSlgLFxuICAgICAgWy4uLmNvbHVtbk9yQ29sdW1ucywgLi4ucXVlcnlBcnJdLFxuICAgICk7XG4gIH1cblxuICBqc29uVGV4dChcbiAgICBjb2x1bW46IEpzb25Db2x1bW5zPFRUYWJsZXM+LFxuICAgIC4uLnBhdGg6IFtzdHJpbmcsIC4uLnN0cmluZ1tdXVxuICApOiBTcWxFeHByZXNzaW9uPFwic3RyaW5nXCIsIHRydWU+IHtcbiAgICByZXR1cm4ge1xuICAgICAgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIixcbiAgICAgIF9yZXR1cm46IFwic3RyaW5nXCIsXG4gICAgICBfc3FsOiBgPz8gIz4+IEFSUkFZWyR7cGF0aC5tYXAoKCkgPT4gXCI/XCIpLmpvaW4oXCIsIFwiKX1dYCxcbiAgICAgIF9wYXJhbXM6IFtjb2x1bW4sIC4uLnBhdGhdLFxuICAgIH07XG4gIH1cblxuICAvLyBTRUxFQ1QgKG92ZXJ3cml0ZSlcbiAgc2VsZWN0PFRTZWxlY3QgZXh0ZW5kcyBTdHJpbmdFeHByZXNzaW9uU2VsZWN0PihcbiAgICBzZWxlY3RPYmo6IFRTZWxlY3QsXG4gICk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcywgU3RyaW5nRXhwcmVzc2lvblNlbGVjdFJlc3VsdDxUU2VsZWN0Pj47XG4gIHNlbGVjdDxUU2VsZWN0IGV4dGVuZHMgU2VsZWN0T2JqZWN0PFRUYWJsZXM+PihcbiAgICBzZWxlY3RPYmo6IFRTZWxlY3QsXG4gICk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcywgUGFyc2VTZWxlY3RPYmplY3Q8VFRhYmxlcywgVFNlbGVjdD4+O1xuICBzZWxlY3Qoc2VsZWN0T2JqOiBTZWxlY3RPYmplY3Q8VFRhYmxlcz4pOiBQdXJpPFRTY2hlbWEsIFRUYWJsZXMsIGFueT4ge1xuICAgIC8vIOykkeyyqSDqsJ3ssrTrpbwgZmxhdO2VmOqyjCDrs4DtmZhcbiAgICBjb25zdCBmbGF0U2VsZWN0ID0gdGhpcy5mbGF0dGVuU2VsZWN0KHNlbGVjdE9iaik7XG5cbiAgICBjb25zdCBzZWxlY3RDbGF1c2VzOiAoc3RyaW5nIHwgS25leC5SYXcpW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgW2FsaWFzLCBjb2x1bW5PckZ1bmN0aW9uXSBvZiBPYmplY3QuZW50cmllcyhmbGF0U2VsZWN0KSkge1xuICAgICAgaWYgKGlzU3FsRXhwcmVzc2lvbihjb2x1bW5PckZ1bmN0aW9uKSkge1xuICAgICAgICAvLyBTUUwg7ZWo7IiY7J24IOqyveyasFxuICAgICAgICBzZWxlY3RDbGF1c2VzLnB1c2goXG4gICAgICAgICAgdGhpcy5rbmV4LnJhdyhgJHtjb2x1bW5PckZ1bmN0aW9uW1wiX3NxbFwiXX0gQVMgXCIke2FsaWFzfVwiYCwgY29sdW1uT3JGdW5jdGlvbltcIl9wYXJhbXNcIl0pLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8g7J2867CYIOy7rOufvOyduCDqsr3smrBcbiAgICAgICAgLy8gU0FGRVRZOiDsv7zrpqwg67mM642U7J2YIOygnOuEpOumrSDqs4Tslb3qs7wg7ISg7ZaJIOqygOymneydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAgICAgY29uc3QgY29sdW1uUGF0aCA9IGNvbHVtbk9yRnVuY3Rpb24gYXMgc3RyaW5nO1xuICAgICAgICBpZiAoYWxpYXMgPT09IGNvbHVtblBhdGgpIHtcbiAgICAgICAgICAvLyBhbGlhc+yZgCDsu6zrn7zrqoXsnbQg6rCZ7Jy866m0IGFsaWFzIOyDneuetVxuICAgICAgICAgIHNlbGVjdENsYXVzZXMucHVzaChjb2x1bW5QYXRoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBhbGlhcyDsp4DsoJVcbiAgICAgICAgICBzZWxlY3RDbGF1c2VzLnB1c2goYCR7Y29sdW1uUGF0aH0gQVMgJHthbGlhc31gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMua25leFF1ZXJ5LnNlbGVjdChzZWxlY3RDbGF1c2VzKTtcbiAgICAvLyBTQUZFVFk6IOy/vOumrCDruYzrjZTsnZgg7KCc64Sk66atIOqzhOyVveqzvCDshKDtlokg6rKA7Kad7J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgIHJldHVybiB0aGlzIGFzIGFueTtcbiAgfVxuXG4gIC8qKlxuICAgKiDspJHssqkg6rCd7LK066W8IGZsYXQg6rCd7LK066GcIOuzgO2ZmFxuICAgKiDsmIg6IHsgcGFyZW50OiB7IGlkOiBcInBhcmVudC5pZFwiLCBuYW1lOiBcInBhcmVudC5uYW1lXCIgfSB9XG4gICAqICAg4oaSIHsgcGFyZW50X19pZDogXCJwYXJlbnQuaWRcIiwgcGFyZW50X19uYW1lOiBcInBhcmVudC5uYW1lXCIgfVxuICAgKi9cbiAgcHJpdmF0ZSAqZmxhdHRlblNlbGVjdEVudHJpZXMoXG4gICAgc2VsZWN0T2JqOiBTZWxlY3RPYmplY3Q8VFRhYmxlcz4sXG4gICAgcGF0aDogcmVhZG9ubHkgc3RyaW5nW10gPSBbXSxcbiAgKTogR2VuZXJhdG9yPFtzdHJpbmcsIFNlbGVjdFZhbHVlPFRUYWJsZXM+XSwgdm9pZD4ge1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHNlbGVjdE9iaikpIHtcbiAgICAgIGNvbnN0IGZpZWxkUGF0aCA9IFsuLi5wYXRoLCBrZXldO1xuICAgICAgY29uc3QgZnVsbEtleSA9IGZpZWxkUGF0aC5qb2luKFwiX19cIik7XG5cbiAgICAgIGlmIChpc05lc3RlZFNlbGVjdE9iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgeWllbGQqIHRoaXMuZmxhdHRlblNlbGVjdEVudHJpZXModmFsdWUsIGZpZWxkUGF0aCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZmllbGRQYXRoLmxlbmd0aCA+IDEpIHRoaXMubmVzdGVkU2VsZWN0UGF0aHMuc2V0KGZ1bGxLZXksIGZpZWxkUGF0aCk7XG4gICAgICAgIGVsc2UgdGhpcy5uZXN0ZWRTZWxlY3RQYXRocy5kZWxldGUoZnVsbEtleSk7XG4gICAgICAgIHRoaXMubmVzdGVkU2VsZWN0SWRlbnRpdHlTb3VyY2VzLmRlbGV0ZShmdWxsS2V5KTtcbiAgICAgICAgaWYgKGZpZWxkUGF0aC5sZW5ndGggPiAxICYmIGtleSA9PT0gXCJpZFwiICYmIGlzU3RyaW5nVmFsdWUodmFsdWUpICYmIHZhbHVlLmluY2x1ZGVzKFwiLlwiKSkge1xuICAgICAgICAgIHRoaXMubmVzdGVkU2VsZWN0SWRlbnRpdHlTb3VyY2VzLnNldChmdWxsS2V5LCB2YWx1ZS5zbGljZSgwLCB2YWx1ZS5sYXN0SW5kZXhPZihcIi5cIikpKTtcbiAgICAgICAgfVxuICAgICAgICB5aWVsZCBbZnVsbEtleSwgdmFsdWVdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZmxhdHRlblNlbGVjdChzZWxlY3RPYmo6IFNlbGVjdE9iamVjdDxUVGFibGVzPikge1xuICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXModGhpcy5mbGF0dGVuU2VsZWN0RW50cmllcyhzZWxlY3RPYmopKTtcbiAgfVxuXG4gIC8vIFNFTEVDVCAoc2VsZWN064qUIG92ZXJ3cml0ZSwgYXBwZW5kU2VsZWN064qUIGFwcGVuZClcbiAgYXBwZW5kU2VsZWN0PFRTZWxlY3QgZXh0ZW5kcyBTZWxlY3RPYmplY3Q8VFRhYmxlcz4+KFxuICAgIHNlbGVjdE9iajogVFNlbGVjdCxcbiAgKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzLCBUUmVzdWx0ICYgUGFyc2VTZWxlY3RPYmplY3Q8VFRhYmxlcywgVFNlbGVjdD4+IHtcbiAgICAvLyDspJHssqkg6rCd7LK066W8IGZsYXTtlZjqsowg67OA7ZmYXG4gICAgY29uc3QgZmxhdFNlbGVjdCA9IHRoaXMuZmxhdHRlblNlbGVjdChzZWxlY3RPYmopO1xuXG4gICAgY29uc3Qgc2VsZWN0Q2xhdXNlczogKHN0cmluZyB8IEtuZXguUmF3KVtdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IFthbGlhcywgY29sdW1uT3JGdW5jdGlvbl0gb2YgT2JqZWN0LmVudHJpZXMoZmxhdFNlbGVjdCkpIHtcbiAgICAgIGlmIChpc1NxbEV4cHJlc3Npb24oY29sdW1uT3JGdW5jdGlvbikpIHtcbiAgICAgICAgc2VsZWN0Q2xhdXNlcy5wdXNoKFxuICAgICAgICAgIHRoaXMua25leC5yYXcoYCR7Y29sdW1uT3JGdW5jdGlvbltcIl9zcWxcIl19IEFTICR7YWxpYXN9YCwgY29sdW1uT3JGdW5jdGlvbltcIl9wYXJhbXNcIl0pLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gU0FGRVRZOiDsv7zrpqwg67mM642U7J2YIOygnOuEpOumrSDqs4Tslb3qs7wg7ISg7ZaJIOqygOymneydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAgICAgY29uc3QgY29sdW1uUGF0aCA9IGNvbHVtbk9yRnVuY3Rpb24gYXMgc3RyaW5nO1xuICAgICAgICBpZiAoYWxpYXMgPT09IGNvbHVtblBhdGgpIHtcbiAgICAgICAgICBzZWxlY3RDbGF1c2VzLnB1c2goY29sdW1uUGF0aCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2VsZWN0Q2xhdXNlcy5wdXNoKHRoaXMua25leC5yZWYoY29sdW1uUGF0aCkuYXMoYWxpYXMpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMua25leFF1ZXJ5LnNlbGVjdChzZWxlY3RDbGF1c2VzKTtcbiAgICAvLyBTQUZFVFk6IOy/vOumrCDruYzrjZTsnZgg7KCc64Sk66atIOqzhOyVveqzvCDshKDtlokg6rKA7Kad7J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgIHJldHVybiB0aGlzIGFzIGFueTtcbiAgfVxuXG4gIC8vIFNFTEVDVCAqXG4gIHNlbGVjdEFsbCgpOiBQdXJpPFRTY2hlbWEsIFRUYWJsZXMsIFNlbGVjdEFsbFJlc3VsdDxUVGFibGVzPj4ge1xuICAgIHRoaXMua25leFF1ZXJ5LnNlbGVjdChcIipcIik7XG4gICAgLy8gU0FGRVRZOiDsv7zrpqwg67mM642U7J2YIOygnOuEpOumrSDqs4Tslb3qs7wg7ISg7ZaJIOqygOymneydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICByZXR1cm4gdGhpcyBhcyBhbnk7XG4gIH1cblxuICAvLyBESVNUSU5DVFxuICBkaXN0aW5jdDxUQ29sdW1ucyBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KC4uLmNvbHVtbnM6IFRDb2x1bW5zW10pOiB0aGlzO1xuICBkaXN0aW5jdCguLi5jb2x1bW5zOiBzdHJpbmdbXSk6IHRoaXMge1xuICAgIHRoaXMua25leFF1ZXJ5LmRpc3RpbmN0KC4uLmNvbHVtbnMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gQ0xFQVJcbiAgY2xlYXIoc3RhdGVtZW50OiBDbGVhclN0YXRlbWVudHMpOiB0aGlzIHtcbiAgICB0aGlzLmtuZXhRdWVyeS5jbGVhcihzdGF0ZW1lbnQpO1xuICAgIGlmIChzdGF0ZW1lbnQgPT09IFwic2VsZWN0XCIgfHwgc3RhdGVtZW50ID09PSBcImNvbHVtbnNcIikge1xuICAgICAgdGhpcy5uZXN0ZWRTZWxlY3RQYXRocy5jbGVhcigpO1xuICAgICAgdGhpcy5uZXN0ZWRTZWxlY3RJZGVudGl0eVNvdXJjZXMuY2xlYXIoKTtcbiAgICB9XG4gICAgaWYgKHN0YXRlbWVudCA9PT0gXCJqb2luXCIpIHtcbiAgICAgIHRoaXMuY2xlYXJKb2luUmVnaXN0cmF0aW9ucygpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIGtuZXjsl5Ag7JeG7Ja07IScIOyngeygkSDqtaztmITtlahcbiAgY2xlYXJKb2luKGFsaWFzOiBzdHJpbmcpOiB0aGlzIHtcbiAgICBsZXQgcmVtb3ZlZCA9IGZhbHNlO1xuICAgIC8vIFNBRkVUWTog7L+866asIOu5jOuNlOydmCDsoJzrhKTrpq0g6rOE7JW96rO8IOyEoO2WiSDqsoDspp3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgKHRoaXMua25leFF1ZXJ5IGFzIGFueSlbXCJfc3RhdGVtZW50c1wiXSA9ICh0aGlzLmtuZXhRdWVyeSBhcyBhbnkpW1wiX3N0YXRlbWVudHNcIl0uZmlsdGVyKFxuICAgICAgKHM6IGFueSkgPT4ge1xuICAgICAgICBpZiAoXCJqb2luVHlwZVwiIGluIHMpIHtcbiAgICAgICAgICBjb25zdCBzaG91bGRSZW1vdmUgPSB0aGlzLmdldEtuZXhKb2luQWxpYXMocy50YWJsZSkgPT09IGFsaWFzO1xuICAgICAgICAgIHJlbW92ZWQgfHw9IHNob3VsZFJlbW92ZTtcbiAgICAgICAgICByZXR1cm4gIXNob3VsZFJlbW92ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICApO1xuICAgIGlmIChyZW1vdmVkICYmIHRoaXMuY29ycmVsYXRpb25SZWdpc3RyeS5nZXQoYWxpYXMpPy5raW5kID09PSBcImpvaW5cIikge1xuICAgICAgdGhpcy5jb3JyZWxhdGlvblJlZ2lzdHJ5LmRlbGV0ZShhbGlhcyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gSk9JTjog7ISc67iM7L+866asICsgQWxpYXNcbiAgam9pbjxUSm9pbkFsaWFzIGV4dGVuZHMgc3RyaW5nLCBUU3ViUmVzdWx0PihcbiAgICB0YWJsZVNwZWM6IHsgW0sgaW4gVEpvaW5BbGlhc106IFB1cmk8VFNjaGVtYSwgYW55LCBUU3ViUmVzdWx0PiB9LFxuICAgIGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4sXG4gICAgcmlnaHQ6IGAke1RKb2luQWxpYXN9LiR7Q29sdW1uS2V5czxUU3ViUmVzdWx0Pn1gLFxuICApOiBQdXJpPFxuICAgIFRTY2hlbWEsXG4gICAgVFRhYmxlcyAmIFJlY29yZDxUSm9pbkFsaWFzLCBUU3ViUmVzdWx0PiwgLy8g7ISc67iM7L+866as7J2YIFRSZXN1bHRcbiAgICBUUmVzdWx0XG4gID47XG4gIC8vIEpPSU46IO2FjOydtOu4lCArIEFsaWFzXG4gIGpvaW48VEpvaW5UYWJsZSBleHRlbmRzIGtleW9mIFRTY2hlbWEsIFRKb2luQWxpYXMgZXh0ZW5kcyBzdHJpbmc+KFxuICAgIHRhYmxlU3BlYzogeyBbSyBpbiBUSm9pbkFsaWFzXTogVEpvaW5UYWJsZSB9LFxuICAgIGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4sXG4gICAgcmlnaHQ6IGAke1RKb2luQWxpYXN9LiR7Q29sdW1uS2V5czxUU2NoZW1hW1RKb2luVGFibGVdPn1gLFxuICApOiBQdXJpPFxuICAgIFRTY2hlbWEsXG4gICAgVFRhYmxlcyAmIFJlY29yZDxUSm9pbkFsaWFzLCBUU2NoZW1hW1RKb2luVGFibGVdPiwgLy8gVFRhYmxlcyDtmZXsnqUhXG4gICAgVFJlc3VsdFxuICA+O1xuICAvLyBKT0lOOiDthYzsnbTruJTrqoVcbiAgam9pbjxUSm9pblRhYmxlIGV4dGVuZHMga2V5b2YgVFNjaGVtYT4oXG4gICAgdGFibGVOYW1lOiBUSm9pblRhYmxlLFxuICAgIGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4sXG4gICAgcmlnaHQ6IGAke1RKb2luVGFibGUgJiBzdHJpbmd9LiR7Q29sdW1uS2V5czxUU2NoZW1hW1RKb2luVGFibGVdPn1gLFxuICApOiBQdXJpPFxuICAgIFRTY2hlbWEsXG4gICAgVFRhYmxlcyAmIFJlY29yZDxUSm9pblRhYmxlLCBUU2NoZW1hW1RKb2luVGFibGVdPiwgLy8g7YWM7J2067iU66qF7J20IO2CpFxuICAgIFRSZXN1bHRcbiAgPjtcbiAgLy8gSk9JTjog7ISc67iM7L+866asICsgQWxpYXMgKyDsvZzrsLFcbiAgam9pbjxUSm9pbkFsaWFzIGV4dGVuZHMgc3RyaW5nLCBUU3ViUmVzdWx0PihcbiAgICB0YWJsZVNwZWM6IHsgW0sgaW4gVEpvaW5BbGlhc106IFB1cmk8VFNjaGVtYSwgYW55LCBUU3ViUmVzdWx0PiB9LFxuICAgIGNhbGxiYWNrOiAoajogSm9pbkNsYXVzZUdyb3VwPFRUYWJsZXMsIFJlY29yZDxUSm9pbkFsaWFzLCBUU3ViUmVzdWx0Pj4pID0+IHZvaWQsXG4gICk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcyAmIFJlY29yZDxUSm9pbkFsaWFzLCBUU3ViUmVzdWx0PiwgVFJlc3VsdD47XG4gIC8vIEpPSU46IO2FjOydtOu4lCArIEFsaWFzICsg7L2c67CxXG4gIGpvaW48VEpvaW5UYWJsZSBleHRlbmRzIGtleW9mIFRTY2hlbWEsIFRKb2luQWxpYXMgZXh0ZW5kcyBzdHJpbmc+KFxuICAgIHRhYmxlU3BlYzogeyBbSyBpbiBUSm9pbkFsaWFzXTogVEpvaW5UYWJsZSB9LFxuICAgIGNhbGxiYWNrOiAoajogSm9pbkNsYXVzZUdyb3VwPFRUYWJsZXMsIFJlY29yZDxUSm9pbkFsaWFzLCBUU2NoZW1hW1RKb2luVGFibGVdPj4pID0+IHZvaWQsXG4gICk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcyAmIFJlY29yZDxUSm9pbkFsaWFzLCBUU2NoZW1hW1RKb2luVGFibGVdPiwgVFJlc3VsdD47XG4gIC8vIEpPSU46IO2FjOydtOu4lOuqhSArIOy9nOuwsVxuICBqb2luPFRKb2luVGFibGUgZXh0ZW5kcyBrZXlvZiBUU2NoZW1hPihcbiAgICB0YWJsZU5hbWU6IFRKb2luVGFibGUsXG4gICAgY2FsbGJhY2s6IChqOiBKb2luQ2xhdXNlR3JvdXA8VFRhYmxlcywgUmVjb3JkPFRKb2luVGFibGUsIFRTY2hlbWFbVEpvaW5UYWJsZV0+PikgPT4gdm9pZCxcbiAgKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzICYgUmVjb3JkPFRKb2luVGFibGUsIFRTY2hlbWFbVEpvaW5UYWJsZV0+LCBUUmVzdWx0PjtcbiAgLy8gSk9JTiDsi6TsoJwg6rWs7ZiEXG4gIGpvaW4odGFibGVOYW1lT3JTcGVjOiBhbnksIC4uLmFyZ3M6IGFueVtdKTogYW55IHtcbiAgICByZXR1cm4gdGhpc1tcIl9fY29tbW9uSm9pblwiXShcImpvaW5cIiwgdGFibGVOYW1lT3JTcGVjLCAuLi5hcmdzKTtcbiAgfVxuXG4gIC8vIEVOU1VSRSBKT0lOOiDthYzsnbTruJQgKyBBbGlhc1xuICBlbnN1cmVKb2luPFRKb2luVGFibGUgZXh0ZW5kcyBrZXlvZiBUU2NoZW1hLCBUSm9pbkFsaWFzIGV4dGVuZHMgc3RyaW5nPihcbiAgICB0YWJsZVNwZWM6IHsgW0sgaW4gVEpvaW5BbGlhc106IFRKb2luVGFibGUgfSxcbiAgICBsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+LFxuICAgIHJpZ2h0OiBgJHtUSm9pbkFsaWFzfS4ke0NvbHVtbktleXM8VFNjaGVtYVtUSm9pblRhYmxlXT59YCxcbiAgKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzICYgUmVjb3JkPFRKb2luQWxpYXMsIFRTY2hlbWFbVEpvaW5UYWJsZV0+LCBUUmVzdWx0PjtcbiAgLy8gRU5TVVJFIEpPSU46IO2FjOydtOu4lOuqhVxuICBlbnN1cmVKb2luPFRKb2luVGFibGUgZXh0ZW5kcyBrZXlvZiBUU2NoZW1hPihcbiAgICB0YWJsZU5hbWU6IFRKb2luVGFibGUsXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPixcbiAgICByaWdodDogYCR7VEpvaW5UYWJsZSAmIHN0cmluZ30uJHtDb2x1bW5LZXlzPFRTY2hlbWFbVEpvaW5UYWJsZV0+fWAsXG4gICk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcyAmIFJlY29yZDxUSm9pblRhYmxlLCBUU2NoZW1hW1RKb2luVGFibGVdPiwgVFJlc3VsdD47XG4gIGVuc3VyZUpvaW4odGFibGVOYW1lT3JTcGVjOiBhbnksIGxlZnQ6IHN0cmluZywgcmlnaHQ6IHN0cmluZyk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXNbXCJfX2Vuc3VyZUpvaW5cIl0oXCJqb2luXCIsIHRhYmxlTmFtZU9yU3BlYywgbGVmdCwgcmlnaHQpO1xuICB9XG5cbiAgLy8gTEVGVCBKT0lOOiDshJzruIzsv7zrpqwgKyBBbGlhc1xuICBsZWZ0Sm9pbjxUSm9pbkFsaWFzIGV4dGVuZHMgc3RyaW5nLCBUU3ViUmVzdWx0PihcbiAgICB0YWJsZVNwZWM6IHsgW0sgaW4gVEpvaW5BbGlhc106IFB1cmk8VFNjaGVtYSwgYW55LCBUU3ViUmVzdWx0PiB9LFxuICAgIGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4sXG4gICAgcmlnaHQ6IGAke1RKb2luQWxpYXN9LiR7Q29sdW1uS2V5czxUU3ViUmVzdWx0Pn1gLFxuICApOiBQdXJpPFRTY2hlbWEsIFRUYWJsZXMgJiBSZWNvcmQ8VEpvaW5BbGlhcywgVFN1YlJlc3VsdCAmIExlZnRKb2luZWRNYXJrZXI+LCBUUmVzdWx0PjsgLy8g7ISc67iM7L+866as7J2YIFRSZXN1bHRcbiAgLy8gTEVGVCBKT0lOOiDthYzsnbTruJQgKyBBbGlhc1xuICAvLyBGSyBudWxsYWJsZSDsl6zrtoDsl5Ag65Sw6528IOyekOuPmeycvOuhnCBMZWZ0Sm9pbmVkTWFya2VyIOqysOyglVxuICBsZWZ0Sm9pbjxcbiAgICBUSm9pblRhYmxlIGV4dGVuZHMga2V5b2YgVFNjaGVtYSxcbiAgICBUSm9pbkFsaWFzIGV4dGVuZHMgc3RyaW5nLFxuICAgIFRMZWZ0IGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPixcbiAgPihcbiAgICB0YWJsZVNwZWM6IHsgW0sgaW4gVEpvaW5BbGlhc106IFRKb2luVGFibGUgfSxcbiAgICBsZWZ0OiBUTGVmdCxcbiAgICByaWdodDogYCR7VEpvaW5BbGlhc30uJHtDb2x1bW5LZXlzPFRTY2hlbWFbVEpvaW5UYWJsZV0+fWAsXG4gICk6IFB1cmk8XG4gICAgVFNjaGVtYSxcbiAgICBUVGFibGVzICYgUmVjb3JkPFRKb2luQWxpYXMsIFRTY2hlbWFbVEpvaW5UYWJsZV0gJiBMZWZ0Sm9pbk1hcmtlckZvcjxUVGFibGVzLCBUTGVmdD4+LFxuICAgIFRSZXN1bHRcbiAgPjtcbiAgLy8gTEVGVCBKT0lOOiDthYzsnbTruJTrqoVcbiAgbGVmdEpvaW48VEpvaW5UYWJsZSBleHRlbmRzIGtleW9mIFRTY2hlbWEsIFRMZWZ0IGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgdGFibGVOYW1lOiBUSm9pblRhYmxlLFxuICAgIGxlZnQ6IFRMZWZ0LFxuICAgIHJpZ2h0OiBgJHtUSm9pblRhYmxlICYgc3RyaW5nfS4ke0NvbHVtbktleXM8VFNjaGVtYVtUSm9pblRhYmxlXT59YCxcbiAgKTogUHVyaTxcbiAgICBUU2NoZW1hLFxuICAgIFRUYWJsZXMgJiBSZWNvcmQ8VEpvaW5UYWJsZSwgVFNjaGVtYVtUSm9pblRhYmxlXSAmIExlZnRKb2luTWFya2VyRm9yPFRUYWJsZXMsIFRMZWZ0Pj4sXG4gICAgVFJlc3VsdFxuICA+O1xuICAvLyBMRUZUIEpPSU46IOyEnOu4jOy/vOumrCArIEFsaWFzICsg7L2c67CxXG4gIGxlZnRKb2luPFRKb2luQWxpYXMgZXh0ZW5kcyBzdHJpbmcsIFRTdWJSZXN1bHQ+KFxuICAgIHRhYmxlU3BlYzogeyBbSyBpbiBUSm9pbkFsaWFzXTogUHVyaTxUU2NoZW1hLCBhbnksIFRTdWJSZXN1bHQ+IH0sXG4gICAgY2FsbGJhY2s6IChqOiBKb2luQ2xhdXNlR3JvdXA8VFRhYmxlcywgUmVjb3JkPFRKb2luQWxpYXMsIFRTdWJSZXN1bHQ+PikgPT4gdm9pZCxcbiAgKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzICYgUmVjb3JkPFRKb2luQWxpYXMsIFRTdWJSZXN1bHQgJiBMZWZ0Sm9pbmVkTWFya2VyPiwgVFJlc3VsdD47XG4gIC8vIExFRlQgSk9JTjog7YWM7J2067iUICsgQWxpYXMgKyDsvZzrsLFcbiAgbGVmdEpvaW48VEpvaW5UYWJsZSBleHRlbmRzIGtleW9mIFRTY2hlbWEsIFRKb2luQWxpYXMgZXh0ZW5kcyBzdHJpbmc+KFxuICAgIHRhYmxlU3BlYzogeyBbSyBpbiBUSm9pbkFsaWFzXTogVEpvaW5UYWJsZSB9LFxuICAgIGNhbGxiYWNrOiAoajogSm9pbkNsYXVzZUdyb3VwPFRUYWJsZXMsIFJlY29yZDxUSm9pbkFsaWFzLCBUU2NoZW1hW1RKb2luVGFibGVdPj4pID0+IHZvaWQsXG4gICk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcyAmIFJlY29yZDxUSm9pbkFsaWFzLCBUU2NoZW1hW1RKb2luVGFibGVdICYgTGVmdEpvaW5lZE1hcmtlcj4sIFRSZXN1bHQ+O1xuICAvLyBMRUZUIEpPSU46IO2FjOydtOu4lOuqhSArIOy9nOuwsVxuICBsZWZ0Sm9pbjxUSm9pblRhYmxlIGV4dGVuZHMga2V5b2YgVFNjaGVtYT4oXG4gICAgdGFibGVOYW1lOiBUSm9pblRhYmxlLFxuICAgIGNhbGxiYWNrOiAoajogSm9pbkNsYXVzZUdyb3VwPFRUYWJsZXMsIFJlY29yZDxUSm9pblRhYmxlLCBUU2NoZW1hW1RKb2luVGFibGVdPj4pID0+IHZvaWQsXG4gICk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcyAmIFJlY29yZDxUSm9pblRhYmxlLCBUU2NoZW1hW1RKb2luVGFibGVdICYgTGVmdEpvaW5lZE1hcmtlcj4sIFRSZXN1bHQ+O1xuICAvLyBMRUZUIEpPSU4g7Iuk7KCcIOq1rO2YhFxuICBsZWZ0Sm9pbih0YWJsZU5hbWVPclNwZWM6IGFueSwgLi4uYXJnczogYW55W10pOiBhbnkge1xuICAgIHJldHVybiB0aGlzW1wiX19jb21tb25Kb2luXCJdKFwibGVmdEpvaW5cIiwgdGFibGVOYW1lT3JTcGVjLCAuLi5hcmdzKTtcbiAgfVxuXG4gIC8vIEVOU1VSRSBMRUZUIEpPSU46IO2FjOydtOu4lCArIEFsaWFzXG4gIGVuc3VyZUxlZnRKb2luPFxuICAgIFRKb2luVGFibGUgZXh0ZW5kcyBrZXlvZiBUU2NoZW1hLFxuICAgIFRKb2luQWxpYXMgZXh0ZW5kcyBzdHJpbmcsXG4gICAgVExlZnQgZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+LFxuICA+KFxuICAgIHRhYmxlU3BlYzogeyBbSyBpbiBUSm9pbkFsaWFzXTogVEpvaW5UYWJsZSB9LFxuICAgIGxlZnQ6IFRMZWZ0LFxuICAgIHJpZ2h0OiBgJHtUSm9pbkFsaWFzfS4ke0NvbHVtbktleXM8VFNjaGVtYVtUSm9pblRhYmxlXT59YCxcbiAgKTogUHVyaTxcbiAgICBUU2NoZW1hLFxuICAgIFRUYWJsZXMgJiBSZWNvcmQ8VEpvaW5BbGlhcywgVFNjaGVtYVtUSm9pblRhYmxlXSAmIExlZnRKb2luTWFya2VyRm9yPFRUYWJsZXMsIFRMZWZ0Pj4sXG4gICAgVFJlc3VsdFxuICA+O1xuICAvLyBFTlNVUkUgTEVGVCBKT0lOOiDthYzsnbTruJTrqoVcbiAgZW5zdXJlTGVmdEpvaW48VEpvaW5UYWJsZSBleHRlbmRzIGtleW9mIFRTY2hlbWEsIFRMZWZ0IGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgdGFibGVOYW1lOiBUSm9pblRhYmxlLFxuICAgIGxlZnQ6IFRMZWZ0LFxuICAgIHJpZ2h0OiBgJHtUSm9pblRhYmxlICYgc3RyaW5nfS4ke0NvbHVtbktleXM8VFNjaGVtYVtUSm9pblRhYmxlXT59YCxcbiAgKTogUHVyaTxcbiAgICBUU2NoZW1hLFxuICAgIFRUYWJsZXMgJiBSZWNvcmQ8VEpvaW5UYWJsZSwgVFNjaGVtYVtUSm9pblRhYmxlXSAmIExlZnRKb2luTWFya2VyRm9yPFRUYWJsZXMsIFRMZWZ0Pj4sXG4gICAgVFJlc3VsdFxuICA+O1xuICBlbnN1cmVMZWZ0Sm9pbih0YWJsZU5hbWVPclNwZWM6IGFueSwgbGVmdDogc3RyaW5nLCByaWdodDogc3RyaW5nKTogYW55IHtcbiAgICByZXR1cm4gdGhpc1tcIl9fZW5zdXJlSm9pblwiXShcImxlZnRKb2luXCIsIHRhYmxlTmFtZU9yU3BlYywgbGVmdCwgcmlnaHQpO1xuICB9XG5cbiAgX19jb21tb25Kb2luKGpvaW5UeXBlOiBcImpvaW5cIiB8IFwibGVmdEpvaW5cIiwgdGFibGVOYW1lT3JTcGVjOiBhbnksIC4uLmFyZ3M6IGFueVtdKTogdGhpcyB7XG4gICAgY29uc3QgcmVnaXN0cmF0aW9uID0gdGhpcy5jcmVhdGVKb2luUmVnaXN0cmF0aW9uKGpvaW5UeXBlLCB0YWJsZU5hbWVPclNwZWMsIGFyZ3MpO1xuICAgIHRoaXMuYXNzZXJ0Q29ycmVsYXRpb25BdmFpbGFibGUocmVnaXN0cmF0aW9uKTtcblxuICAgIGlmIChpc1N0cmluZ1ZhbHVlKHRhYmxlTmFtZU9yU3BlYykpIHtcbiAgICAgIC8vIENhc2UgMTogam9pbihcInBvc3RzXCIsIC4uLilcbiAgICAgIGNvbnN0IHRhYmxlTmFtZSA9IHRhYmxlTmFtZU9yU3BlYztcblxuICAgICAgaWYgKGFyZ3MubGVuZ3RoID09PSAxICYmIGlzRnVuY3Rpb25WYWx1ZShhcmdzWzBdKSkge1xuICAgICAgICAvLyBqb2luKFwicG9zdHNcIiwgY2FsbGJhY2spXG4gICAgICAgIGNvbnN0IGNhbGxiYWNrID0gYXJnc1swXTtcbiAgICAgICAgdGhpcy5rbmV4UXVlcnlbam9pblR5cGVdKHRhYmxlTmFtZSwgKGpvaW5DbGF1c2UpID0+IHtcbiAgICAgICAgICBjYWxsYmFjayhuZXcgSm9pbkNsYXVzZUdyb3VwKGpvaW5DbGF1c2UpKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBqb2luKFwicG9zdHNcIiwgbGVmdCwgcmlnaHQpXG4gICAgICAgIGNvbnN0IFtsZWZ0LCByaWdodF0gPSBhcmdzO1xuICAgICAgICB0aGlzLmtuZXhRdWVyeVtqb2luVHlwZV0odGFibGVOYW1lLCBsZWZ0LCByaWdodCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc09iamVjdFZhbHVlKHRhYmxlTmFtZU9yU3BlYykpIHtcbiAgICAgIC8vIENhc2UgMjogam9pbih7IGFsaWFzOiBcInRhYmxlXCIgfSwgLi4uKSBvciBqb2luKHsgYWxpYXM6IHN1YnF1ZXJ5IH0sIC4uLilcbiAgICAgIGNvbnN0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyh0YWJsZU5hbWVPclNwZWMpO1xuICAgICAgaWYgKGVudHJpZXMubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRhYmxlIHNwZWMgbXVzdCBoYXZlIGV4YWN0bHkgb25lIGVudHJ5XCIpO1xuICAgICAgfVxuICAgICAgYXNzZXJ0KGVudHJpZXNbMF0pO1xuICAgICAgY29uc3QgW1thbGlhcywgc3BlY11dID0gZW50cmllcztcblxuICAgICAgaWYgKGlzU3RyaW5nVmFsdWUoc3BlYykpIHtcbiAgICAgICAgLy8g7YWM7J2067iUOiBqb2luKHsgcDogXCJwb3N0c1wiIH0sIC4uLilcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09PSAxICYmIGlzRnVuY3Rpb25WYWx1ZShhcmdzWzBdKSkge1xuICAgICAgICAgIC8vIENhbGxiYWNrXG4gICAgICAgICAgY29uc3QgY2FsbGJhY2sgPSBhcmdzWzBdO1xuICAgICAgICAgIHRoaXMua25leFF1ZXJ5W2pvaW5UeXBlXSh7IFthbGlhc106IHNwZWMgfSwgKGpvaW5DbGF1c2UpID0+IHtcbiAgICAgICAgICAgIGNhbGxiYWNrKG5ldyBKb2luQ2xhdXNlR3JvdXAoam9pbkNsYXVzZSkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFNpbXBsZVxuICAgICAgICAgIGNvbnN0IFtsZWZ0LCByaWdodF0gPSBhcmdzO1xuICAgICAgICAgIHRoaXMua25leFF1ZXJ5W2pvaW5UeXBlXSh7IFthbGlhc106IHNwZWMgfSwgbGVmdCwgcmlnaHQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHNwZWMgaW5zdGFuY2VvZiBQdXJpKSB7XG4gICAgICAgIC8vIOyEnOu4jOy/vOumrDogam9pbih7IHNxOiBzdWJxdWVyeSB9LCAuLi4pXG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMSAmJiBpc0Z1bmN0aW9uVmFsdWUoYXJnc1swXSkpIHtcbiAgICAgICAgICAvLyBDYWxsYmFja1xuICAgICAgICAgIGNvbnN0IGNhbGxiYWNrID0gYXJnc1swXTtcbiAgICAgICAgICB0aGlzLmtuZXhRdWVyeVtqb2luVHlwZV0oc3BlYy5yYXdRdWVyeSgpLmFzKGFsaWFzKSwgKGpvaW5DbGF1c2UpID0+IHtcbiAgICAgICAgICAgIGNhbGxiYWNrKG5ldyBKb2luQ2xhdXNlR3JvdXAoam9pbkNsYXVzZSkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFNpbXBsZVxuICAgICAgICAgIGNvbnN0IFtsZWZ0LCByaWdodF0gPSBhcmdzO1xuICAgICAgICAgIHRoaXMua25leFF1ZXJ5W2pvaW5UeXBlXShzcGVjLnJhd1F1ZXJ5KCkuYXMoYWxpYXMpLCBsZWZ0LCByaWdodCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgdGFibGUgc3BlY2lmaWNhdGlvblwiKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBhcmd1bWVudHNcIik7XG4gICAgfVxuXG4gICAgdGhpcy5jb3JyZWxhdGlvblJlZ2lzdHJ5LnNldChyZWdpc3RyYXRpb24uYWxpYXMsIHJlZ2lzdHJhdGlvbik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwcml2YXRlIF9fZW5zdXJlSm9pbihcbiAgICBqb2luVHlwZTogXCJqb2luXCIgfCBcImxlZnRKb2luXCIsXG4gICAgdGFibGVOYW1lT3JTcGVjOiBzdHJpbmcgfCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICAgIGxlZnQ6IHN0cmluZyxcbiAgICByaWdodDogc3RyaW5nLFxuICApOiB0aGlzIHtcbiAgICBjb25zdCByZXF1ZXN0ZWQgPSB0aGlzLmNyZWF0ZUpvaW5SZWdpc3RyYXRpb24oam9pblR5cGUsIHRhYmxlTmFtZU9yU3BlYywgW2xlZnQsIHJpZ2h0XSk7XG4gICAgaWYgKCFyZXF1ZXN0ZWQucmV1c2FibGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYCR7am9pblR5cGUgPT09IFwiam9pblwiID8gXCJlbnN1cmVKb2luXCIgOiBcImVuc3VyZUxlZnRKb2luXCJ9IG9ubHkgc3VwcG9ydHMgcGh5c2ljYWwgdGFibGVzIHdpdGggc2ltcGxlIGNvbHVtbiBlcXVhbGl0eSBjb25kaXRpb25zLmAsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuY29ycmVsYXRpb25SZWdpc3RyeS5nZXQocmVxdWVzdGVkLmFsaWFzKTtcblxuICAgIGlmICghZXhpc3RpbmcpIHtcbiAgICAgIHJldHVybiB0aGlzW1wiX19jb21tb25Kb2luXCJdKGpvaW5UeXBlLCB0YWJsZU5hbWVPclNwZWMsIGxlZnQsIHJpZ2h0KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc1NhbWVKb2luUmVnaXN0cmF0aW9uKGV4aXN0aW5nLCByZXF1ZXN0ZWQpKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB0aHJvdyB0aGlzLmNyZWF0ZUpvaW5Db25mbGljdEVycm9yKGV4aXN0aW5nLCByZXF1ZXN0ZWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVKb2luUmVnaXN0cmF0aW9uKFxuICAgIGpvaW5UeXBlOiBcImpvaW5cIiB8IFwibGVmdEpvaW5cIixcbiAgICB0YWJsZU5hbWVPclNwZWM6IGFueSxcbiAgICBhcmdzOiBhbnlbXSxcbiAgKTogSm9pblJlZ2lzdHJhdGlvbiB7XG4gICAgbGV0IGFsaWFzOiBzdHJpbmc7XG4gICAgbGV0IHRhYmxlOiBzdHJpbmcgfCBudWxsO1xuXG4gICAgaWYgKGlzU3RyaW5nVmFsdWUodGFibGVOYW1lT3JTcGVjKSkge1xuICAgICAgYWxpYXMgPSB0YWJsZU5hbWVPclNwZWM7XG4gICAgICB0YWJsZSA9IHRhYmxlTmFtZU9yU3BlYztcbiAgICB9IGVsc2UgaWYgKGlzT2JqZWN0VmFsdWUodGFibGVOYW1lT3JTcGVjKSkge1xuICAgICAgY29uc3QgZW50cmllcyA9IE9iamVjdC5lbnRyaWVzKHRhYmxlTmFtZU9yU3BlYyk7XG4gICAgICBpZiAoZW50cmllcy5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGFibGUgc3BlYyBtdXN0IGhhdmUgZXhhY3RseSBvbmUgZW50cnlcIik7XG4gICAgICB9XG4gICAgICBhc3NlcnQoZW50cmllc1swXSk7XG4gICAgICBjb25zdCBbW2pvaW5BbGlhcywgc3BlY11dID0gZW50cmllcztcbiAgICAgIGFsaWFzID0gam9pbkFsaWFzO1xuICAgICAgdGFibGUgPSBpc1N0cmluZ1ZhbHVlKHNwZWMpID8gc3BlYyA6IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgYXJndW1lbnRzXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IFtsZWZ0LCByaWdodF0gPSBhcmdzO1xuICAgIGNvbnN0IHJldXNhYmxlID1cbiAgICAgIHRhYmxlICE9PSBudWxsICYmIGFyZ3MubGVuZ3RoID09PSAyICYmIGlzU3RyaW5nVmFsdWUobGVmdCkgJiYgaXNTdHJpbmdWYWx1ZShyaWdodCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAga2luZDogXCJqb2luXCIsXG4gICAgICBhbGlhcyxcbiAgICAgIHRhYmxlLFxuICAgICAgam9pblR5cGUsXG4gICAgICBsZWZ0OiByZXVzYWJsZSA/IGxlZnQgOiBudWxsLFxuICAgICAgcmlnaHQ6IHJldXNhYmxlID8gcmlnaHQgOiBudWxsLFxuICAgICAgcmV1c2FibGUsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXNzZXJ0Q29ycmVsYXRpb25BdmFpbGFibGUocmVxdWVzdGVkOiBKb2luUmVnaXN0cmF0aW9uKTogdm9pZCB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmNvcnJlbGF0aW9uUmVnaXN0cnkuZ2V0KHJlcXVlc3RlZC5hbGlhcyk7XG4gICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICBpZiAodGhpcy5pc1NhbWVKb2luUmVnaXN0cmF0aW9uKGV4aXN0aW5nLCByZXF1ZXN0ZWQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgSm9pbiBhbGlhcyBcIiR7cmVxdWVzdGVkLmFsaWFzfVwiIGlzIGFscmVhZHkgcmVnaXN0ZXJlZC4gVXNlIGVuc3VyZUpvaW4oKSBvciBlbnN1cmVMZWZ0Sm9pbigpIHRvIHJldXNlIGFuIGlkZW50aWNhbCBqb2luLmAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0aHJvdyB0aGlzLmNyZWF0ZUpvaW5Db25mbGljdEVycm9yKGV4aXN0aW5nLCByZXF1ZXN0ZWQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaXNTYW1lSm9pblJlZ2lzdHJhdGlvbihcbiAgICBleGlzdGluZzogQ29ycmVsYXRpb25SZWdpc3RyYXRpb24sXG4gICAgcmVxdWVzdGVkOiBKb2luUmVnaXN0cmF0aW9uLFxuICApOiBleGlzdGluZyBpcyBKb2luUmVnaXN0cmF0aW9uIHtcbiAgICByZXR1cm4gKFxuICAgICAgZXhpc3Rpbmcua2luZCA9PT0gXCJqb2luXCIgJiZcbiAgICAgIGV4aXN0aW5nLnJldXNhYmxlICYmXG4gICAgICByZXF1ZXN0ZWQucmV1c2FibGUgJiZcbiAgICAgIGV4aXN0aW5nLnRhYmxlID09PSByZXF1ZXN0ZWQudGFibGUgJiZcbiAgICAgIGV4aXN0aW5nLmpvaW5UeXBlID09PSByZXF1ZXN0ZWQuam9pblR5cGUgJiZcbiAgICAgIGV4aXN0aW5nLmxlZnQgPT09IHJlcXVlc3RlZC5sZWZ0ICYmXG4gICAgICBleGlzdGluZy5yaWdodCA9PT0gcmVxdWVzdGVkLnJpZ2h0XG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlSm9pbkNvbmZsaWN0RXJyb3IoXG4gICAgZXhpc3Rpbmc6IENvcnJlbGF0aW9uUmVnaXN0cmF0aW9uLFxuICAgIHJlcXVlc3RlZDogSm9pblJlZ2lzdHJhdGlvbixcbiAgKTogRXJyb3Ige1xuICAgIHJldHVybiBuZXcgRXJyb3IoXG4gICAgICBbXG4gICAgICAgIGBKb2luIGFsaWFzIFwiJHtyZXF1ZXN0ZWQuYWxpYXN9XCIgaXMgYWxyZWFkeSByZWdpc3RlcmVkIHdpdGggYSBkaWZmZXJlbnQgZGVmaW5pdGlvbi5gLFxuICAgICAgICBgRXhpc3Rpbmc6ICR7dGhpcy5mb3JtYXRDb3JyZWxhdGlvblJlZ2lzdHJhdGlvbihleGlzdGluZyl9YCxcbiAgICAgICAgYFJlcXVlc3RlZDogJHt0aGlzLmZvcm1hdENvcnJlbGF0aW9uUmVnaXN0cmF0aW9uKHJlcXVlc3RlZCl9YCxcbiAgICAgIF0uam9pbihcIlxcblwiKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRDb3JyZWxhdGlvblJlZ2lzdHJhdGlvbihyZWdpc3RyYXRpb246IENvcnJlbGF0aW9uUmVnaXN0cmF0aW9uKTogc3RyaW5nIHtcbiAgICBpZiAocmVnaXN0cmF0aW9uLmtpbmQgPT09IFwiZnJvbVwiKSB7XG4gICAgICByZXR1cm4gYEZST00gJHtyZWdpc3RyYXRpb24udGFibGUgPz8gXCJzdWJxdWVyeVwifSBBUyAke3JlZ2lzdHJhdGlvbi5hbGlhc31gO1xuICAgIH1cblxuICAgIGNvbnN0IGpvaW5LZXl3b3JkID0gcmVnaXN0cmF0aW9uLmpvaW5UeXBlID09PSBcImpvaW5cIiA/IFwiSk9JTlwiIDogXCJMRUZUIEpPSU5cIjtcbiAgICBjb25zdCBzb3VyY2UgPSByZWdpc3RyYXRpb24udGFibGUgPz8gXCJvcGFxdWUgc291cmNlXCI7XG4gICAgY29uc3QgY29uZGl0aW9uID0gcmVnaXN0cmF0aW9uLnJldXNhYmxlXG4gICAgICA/IGAgT04gJHtyZWdpc3RyYXRpb24ubGVmdH0gPSAke3JlZ2lzdHJhdGlvbi5yaWdodH1gXG4gICAgICA6IFwiIHdpdGggb3BhcXVlIGNvbmRpdGlvblwiO1xuICAgIHJldHVybiBgJHtqb2luS2V5d29yZH0gJHtzb3VyY2V9IEFTICR7cmVnaXN0cmF0aW9uLmFsaWFzfSR7Y29uZGl0aW9ufWA7XG4gIH1cblxuICBwcml2YXRlIGNsZWFySm9pblJlZ2lzdHJhdGlvbnMoKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBbYWxpYXMsIHJlZ2lzdHJhdGlvbl0gb2YgdGhpcy5jb3JyZWxhdGlvblJlZ2lzdHJ5KSB7XG4gICAgICBpZiAocmVnaXN0cmF0aW9uLmtpbmQgPT09IFwiam9pblwiKSB7XG4gICAgICAgIHRoaXMuY29ycmVsYXRpb25SZWdpc3RyeS5kZWxldGUoYWxpYXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0S25leEpvaW5BbGlhczxWYWx1ZT4odGFibGU6IFZhbHVlKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKGlzU3RyaW5nVmFsdWUodGFibGUpKSB7XG4gICAgICByZXR1cm4gdGFibGU7XG4gICAgfVxuICAgIGlmIChpc09iamVjdFZhbHVlKHRhYmxlKSAmJiB0YWJsZSAhPT0gbnVsbCkge1xuICAgICAgaWYgKFxuICAgICAgICBcIl9zaW5nbGVcIiBpbiB0YWJsZSAmJlxuICAgICAgICBpc09iamVjdFZhbHVlKHRhYmxlW1wiX3NpbmdsZVwiXSkgJiZcbiAgICAgICAgdGFibGVbXCJfc2luZ2xlXCJdICE9PSBudWxsICYmXG4gICAgICAgIFwiYXNcIiBpbiB0YWJsZVtcIl9zaW5nbGVcIl0gJiZcbiAgICAgICAgaXNTdHJpbmdWYWx1ZSh0YWJsZVtcIl9zaW5nbGVcIl0uYXMpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHRhYmxlW1wiX3NpbmdsZVwiXS5hcztcbiAgICAgIH1cbiAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0YWJsZSlbMF0gPz8gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBXSEVSRTog6rCd7LK0IC0g7IKs7JqpOiAud2hlcmUoeyBcInUuaWRcIjogMSwgXCJ1LnN0YXR1c1wiOiBcImFjdGl2ZVwiIH0pXG4gIHdoZXJlKGNvbmRpdGlvbnM6IFdoZXJlQ29uZGl0aW9uPFRUYWJsZXM+KTogdGhpcztcbiAgLy8gV0hFUkU6IOy7rOufvCAtIOyCrOyaqTogLndoZXJlKFwidS5pZFwiLCAxKSwgLndoZXJlKFwidS5pZFwiLCBudWxsKVxuICB3aGVyZTxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIHZhbHVlOiBFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUQ29sdW1uICYgc3RyaW5nPixcbiAgKTogdGhpcztcbiAgLy8gV0hFUkU6IOy7rOufvCAtIOyCrOyaqTogLndoZXJlKFwidS5pZFwiLCBcIj5cIiwgMTApLCAud2hlcmUoXCJ1LmlkXCIsIFwiIT1cIiwgbnVsbClcbiAgd2hlcmU8VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICBvcGVyYXRvcjogV2hlcmVPcGVyYXRvcixcbiAgICB2YWx1ZTogRXh0cmFjdENvbHVtblR5cGU8VFRhYmxlcywgVENvbHVtbiAmIHN0cmluZz4sXG4gICk6IHRoaXM7XG4gIC8vIFdIRVJFOiBTUUwg7ZGc7ZiE7IudIC0g7IKs7JqpOiAud2hlcmUocHVyaS5yYXcoXCJDT05DQVQodS5uYW1lLCB1LmVtYWlsKVwiKSwgXCJsaWtlXCIsIFwiJXRlc3QlXCIpXG4gIHdoZXJlPFRDb2x1bW4gZXh0ZW5kcyBLbmV4LlJhdz4oY29sdW1uOiBUQ29sdW1uLCBvcGVyYXRvcjogV2hlcmVPcGVyYXRvciwgdmFsdWU6IGFueSk6IHRoaXM7XG4gIC8vIFdIRVJFOiDsu6zrn7wgLSDsgqzsmqk6IC53aGVyZShcInUuaWRcIiwgXCJsaWtlXCIsIFwiJXRlc3QlXCIpXG4gIHdoZXJlKC4uLmFyZ3M6IFtjb2x1bW5PckNvbmRpdGlvbnM6IGFueSwgb3BlcmF0b3JPclZhbHVlPzogYW55LCB2YWx1ZT86IGFueV0pOiB0aGlzIHtcbiAgICBjb25zdCBbY29sdW1uT3JDb25kaXRpb25zLCBvcGVyYXRvck9yVmFsdWUsIHZhbHVlXSA9IGFyZ3M7XG4gICAgaWYgKGlzT2JqZWN0VmFsdWUoY29sdW1uT3JDb25kaXRpb25zKSkge1xuICAgICAgdGhpcy5rbmV4UXVlcnkud2hlcmUoY29sdW1uT3JDb25kaXRpb25zKTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChvcGVyYXRvck9yVmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5rbmV4UXVlcnkud2hlcmVOdWxsKGNvbHVtbk9yQ29uZGl0aW9ucyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgdGhpcy5rbmV4UXVlcnkud2hlcmUoY29sdW1uT3JDb25kaXRpb25zLCBvcGVyYXRvck9yVmFsdWUpO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgIGlmIChvcGVyYXRvck9yVmFsdWUgPT09IFwiIT1cIikge1xuICAgICAgICAgIHRoaXMua25leFF1ZXJ5LndoZXJlTm90TnVsbChjb2x1bW5PckNvbmRpdGlvbnMpO1xuICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9IGVsc2UgaWYgKG9wZXJhdG9yT3JWYWx1ZSA9PT0gXCI9XCIpIHtcbiAgICAgICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZU51bGwoY29sdW1uT3JDb25kaXRpb25zKTtcbiAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5rbmV4UXVlcnkud2hlcmUoY29sdW1uT3JDb25kaXRpb25zLCBvcGVyYXRvck9yVmFsdWUsIHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5rbmV4UXVlcnkud2hlcmUoY29sdW1uT3JDb25kaXRpb25zKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBXSEVSRSBJTlxuICB3aGVyZUluPFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWVzOiAoRXh0cmFjdENvbHVtblR5cGU8VFRhYmxlcywgVENvbHVtbiAmIHN0cmluZz4gJiBLbmV4LlZhbHVlKVtdLFxuICApOiBQdXJpPFRTY2hlbWEsIFRUYWJsZXMsIFRSZXN1bHQ+IHtcbiAgICAvLyBLbmV47J2YIOu5hOyWtCDsnojripQgSU4g67Cw7Je0IOyymOumrOyZgCDrj5nsnbztlZjqsowg7ZWt7IOBIOqxsOynk+yduCDsobDqsbTsnYQg7IOd7ISx7ZWp64uI64ukLlxuICAgIGlmICh2YWx1ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZVJhdyhcIjEgPSAwXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBwbGFjZWhvbGRlcnMgPSB2YWx1ZXMubWFwKCgpID0+IFwiP1wiKS5qb2luKFwiLCBcIik7XG4gICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZVJhdyhgPz8gaW4gKCR7cGxhY2Vob2xkZXJzfSlgLCBbU3RyaW5nKGNvbHVtbiksIC4uLnZhbHVlc10pO1xuICAgIH1cbiAgICAvLyBTQUZFVFk6IOy/vOumrCDruYzrjZTsnZgg7KCc64Sk66atIOqzhOyVveqzvCDshKDtlokg6rKA7Kad7J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgIHJldHVybiB0aGlzIGFzIGFueTtcbiAgfVxuXG4gIC8vIFdIRVJFIE5PVCBJTlxuICB3aGVyZU5vdEluPFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWVzOiAoRXh0cmFjdENvbHVtblR5cGU8VFRhYmxlcywgVENvbHVtbiAmIHN0cmluZz4gJiBLbmV4LlZhbHVlKVtdLFxuICApOiBQdXJpPFRTY2hlbWEsIFRUYWJsZXMsIFRSZXN1bHQ+IHtcbiAgICAvLyBLbmV47J2YIOu5hOyWtCDsnojripQgTk9UIElOIOuwsOyXtCDsspjrpqzsmYAg64+Z7J287ZWY6rKMIO2VreyDgSDssLjsnbgg7KGw6rG07J2EIOyDneyEse2VqeuLiOuLpC5cbiAgICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5rbmV4UXVlcnkud2hlcmVSYXcoXCIxID0gMVwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcGxhY2Vob2xkZXJzID0gdmFsdWVzLm1hcCgoKSA9PiBcIj9cIikuam9pbihcIiwgXCIpO1xuICAgICAgdGhpcy5rbmV4UXVlcnkud2hlcmVSYXcoYD8/IG5vdCBpbiAoJHtwbGFjZWhvbGRlcnN9KWAsIFtTdHJpbmcoY29sdW1uKSwgLi4udmFsdWVzXSk7XG4gICAgfVxuICAgIC8vIFNBRkVUWTog7L+866asIOu5jOuNlOydmCDsoJzrhKTrpq0g6rOE7JW96rO8IOyEoO2WiSDqsoDspp3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgcmV0dXJuIHRoaXMgYXMgYW55O1xuICB9XG5cbiAgLy8gV0hFUkUgSlNPTkIgU1VQRVJTRVQgKEA+KVxuICB3aGVyZUpzb25TdXBlcnNldE9mPFRDb2x1bW4gZXh0ZW5kcyBKc29uQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIHZhbHVlOiBKc29uU3VwZXJzZXRWYWx1ZTxFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUQ29sdW1uPj4sXG4gICk6IHRoaXMge1xuICAgIHRoaXMua25leFF1ZXJ5LndoZXJlSnNvblN1cGVyc2V0T2YoY29sdW1uLCBzZXJpYWxpemVKc29uU3VwZXJzZXRWYWx1ZSh2YWx1ZSkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgd2hlcmVKc29uS2V5RXhpc3RzKGNvbHVtbjogSnNvbkNvbHVtbnM8VFRhYmxlcz4sIGtleTogc3RyaW5nKTogdGhpcyB7XG4gICAgdGhpcy5rbmV4UXVlcnkud2hlcmVSYXcoXCI/PyBcXFxcPyA/XCIsIFtjb2x1bW4sIGtleV0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gV0hFUkUgTUFUQ0hcbiAgd2hlcmVNYXRjaDxUQ29sdW1uIGV4dGVuZHMgRnVsbHRleHRDb2x1bW5zPFRUYWJsZXM+Pihjb2x1bW46IFRDb2x1bW4sIHZhbHVlOiBzdHJpbmcpOiB0aGlzIHtcbiAgICB0aGlzLmtuZXhRdWVyeS53aGVyZVJhdyhgTUFUQ0ggKCR7U3RyaW5nKGNvbHVtbil9KSBBR0FJTlNUICg/KWAsIFt2YWx1ZV0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFBHcm9vbmdhIEZ1bGxUZXh0IOyduOuNseyKpCDqsoDsg4lcbiAgICogLSDsgqzsmqntlaAgUEdyb29uZ2Eg7J24642x7Iqk7JmAIOuPmeydvO2VnCDsu6zrn7wg6rWs7ISx7Jy866GcIOqygOyDie2VtOyVvCDsnbjrjbHsiqTqsIAg7IKs7Jqp65Cp64uI64ukLlxuICAgKlxuICAgKiDri6jsnbwg7Lus65+8IOqygOyDiTpcbiAgICogYGBgc3FsXG4gICAqIFdIRVJFIG5hbWUgJkB+ICdzZWFyY2gnXG4gICAqIGBgYFxuICAgKlxuICAgKiDrs7Xtlakg7Lus65+8IOqygOyDiTpcbiAgICogYGBgc3FsXG4gICAqIFdIRVJFIEFSUkFZW25hbWU6OnRleHQsIGRlc2NyaXB0aW9uOjp0ZXh0XSAmQH4gJ3NlYXJjaCdcbiAgICogYGBgXG4gICAqL1xuICB3aGVyZVNlYXJjaDxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uIHwgVENvbHVtbltdLFxuICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIHdlaWdodHM/OiBudW1iZXJbXTsgLy8g7KCV7IiYIOuwsOyXtFxuICAgIH0sXG4gICk6IHRoaXMge1xuICAgIGNvbnN0IHsgd2VpZ2h0cyB9ID0gb3B0aW9ucyA/PyB7fTtcbiAgICBjb25zdCBjb2x1bW5FeHByID0gQXJyYXkuaXNBcnJheShjb2x1bW4pXG4gICAgICA/IGBBUlJBWVske2NvbHVtbi5tYXAoKGMpID0+IGAke2N9Ojp0ZXh0YCkuam9pbihcIixcIil9XWBcbiAgICAgIDogY29sdW1uO1xuICAgIGNvbnN0IHBncm9vbmdhQ29uZGl0aW9uID0gYHBncm9vbmdhX2NvbmRpdGlvbig/JHt3ZWlnaHRzPy5sZW5ndGggPyBgLCB3ZWlnaHRzID0+IEFSUkFZWyR7d2VpZ2h0cy5qb2luKFwiLFwiKX1dYCA6IFwiXCJ9KWA7XG5cbiAgICB0aGlzLmtuZXhRdWVyeS53aGVyZVJhdyhgJHtjb2x1bW5FeHByfSAmQH4gJHtwZ3Jvb25nYUNvbmRpdGlvbn1gLCBbdmFsdWVdKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gV0hFUkUgRlVMTFRFWFRcbiAgd2hlcmVUc1NlYXJjaDxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPiB8IFN0cmluZ1NxbEV4cHJlc3Npb24+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICB2YWx1ZTogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBUc1F1ZXJ5T3B0aW9ucyB8IFRzUXVlcnlDb25maWcsXG4gICk6IHRoaXMge1xuICAgIGNvbnN0IG9wdHMgPVxuICAgICAgLy8gU0FGRVRZOiDsv7zrpqwg67mM642U7J2YIOygnOuEpOumrSDqs4Tslb3qs7wg7ISg7ZaJIOqygOymneydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAgIGlzU3RyaW5nVmFsdWUob3B0aW9ucykgPyAoeyBjb25maWc6IG9wdGlvbnMgfSBhcyBUc1F1ZXJ5T3B0aW9ucykgOiAob3B0aW9ucyA/PyB7fSk7XG5cbiAgICBjb25zdCBwYXJzZXIgPSBvcHRzLnBhcnNlciA/PyBcIndlYnNlYXJjaF90b190c3F1ZXJ5XCI7XG4gICAgY29uc3QgY29uZmlnID0gb3B0cy5jb25maWcgPz8gXCJzaW1wbGVcIjtcbiAgICBjb25zdCBjb2x1bW5FeHByID0gaXNTcWxFeHByZXNzaW9uKGNvbHVtbikgPyBjb2x1bW5bXCJfc3FsXCJdIDogU3RyaW5nKGNvbHVtbik7XG4gICAgY29uc3QgcGFyYW1zID0gaXNTcWxFeHByZXNzaW9uKGNvbHVtbilcbiAgICAgID8gWy4uLmNvbHVtbltcIl9wYXJhbXNcIl0sIGNvbmZpZywgdmFsdWVdXG4gICAgICA6IFtjb25maWcsIHZhbHVlXTtcblxuICAgIHRoaXMua25leFF1ZXJ5LndoZXJlUmF3KGAke2NvbHVtbkV4cHJ9IEBAICR7cGFyc2VyfSg/LCA/KWAsIHBhcmFtcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB3aGVyZUZ1enp5PFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+IHwgU3RyaW5nU3FsRXhwcmVzc2lvbj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIG9wZXJhdG9yPzogRnV6enlPcGVyYXRvcjtcbiAgICB9LFxuICApOiB0aGlzIHtcbiAgICBjb25zdCBvcGVyYXRvciA9IHBhcnNlRnV6enlPcGVyYXRvcihvcHRpb25zPy5vcGVyYXRvcik7XG5cbiAgICBpZiAob3BlcmF0b3IgPT09IFwiJVwiKSB7XG4gICAgICBpZiAoaXNTcWxFeHByZXNzaW9uKGNvbHVtbikpIHtcbiAgICAgICAgdGhpcy5rbmV4UXVlcnkud2hlcmVSYXcoYCR7Y29sdW1uW1wiX3NxbFwiXX0gJHtvcGVyYXRvcn0gP2AsIFsuLi5jb2x1bW5bXCJfcGFyYW1zXCJdLCB2YWx1ZV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5rbmV4UXVlcnkud2hlcmVSYXcoYD8/ICR7b3BlcmF0b3J9ID9gLCBbY29sdW1uLCB2YWx1ZV0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgaWYgKGlzU3FsRXhwcmVzc2lvbihjb2x1bW4pKSB7XG4gICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZVJhdyhgPyAke29wZXJhdG9yfSAke2NvbHVtbltcIl9zcWxcIl19YCwgW3ZhbHVlLCAuLi5jb2x1bW5bXCJfcGFyYW1zXCJdXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMua25leFF1ZXJ5LndoZXJlUmF3KGA/ICR7b3BlcmF0b3J9ID8/YCwgW3ZhbHVlLCBjb2x1bW5dKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBXSEVSRSBSQVdcbiAgd2hlcmVSYXcoc3FsOiBzdHJpbmcsIGJpbmRpbmdzPzogcmVhZG9ubHkgS25leC5SYXdCaW5kaW5nW10pOiB0aGlzIHtcbiAgICB0aGlzLmtuZXhRdWVyeS53aGVyZVJhdyhzcWwsIGJpbmRpbmdzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIFdIRVJFIOq0hO2YuCDqt7jro7ntlZFcbiAgd2hlcmVHcm91cChjYWxsYmFjazogKGc6IFdoZXJlR3JvdXA8VFRhYmxlcz4pID0+IHZvaWQpOiB0aGlzIHtcbiAgICB0aGlzLmtuZXhRdWVyeS53aGVyZSgoYnVpbGRlcikgPT4ge1xuICAgICAgY29uc3QgZ3JvdXAgPSBuZXcgV2hlcmVHcm91cDxUVGFibGVzPihidWlsZGVyKTtcbiAgICAgIGNhbGxiYWNrKGdyb3VwKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBvcldoZXJlR3JvdXAoY2FsbGJhY2s6IChnOiBXaGVyZUdyb3VwPFRUYWJsZXM+KSA9PiB2b2lkKTogdGhpcyB7XG4gICAgdGhpcy5rbmV4UXVlcnkub3JXaGVyZSgoYnVpbGRlcikgPT4ge1xuICAgICAgY29uc3QgZ3JvdXAgPSBuZXcgV2hlcmVHcm91cDxUVGFibGVzPihidWlsZGVyKTtcbiAgICAgIGNhbGxiYWNrKGdyb3VwKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIE9SREVSIEJZIChTcWxFeHByZXNzaW9u7Jy866Gc64+EIO2VoCDsiJgg7J6I7Ja07JW8IO2VqClcbiAgb3JkZXJCeTxUQ29sdW1uIGV4dGVuZHMgUmVzdWx0QXZhaWxhYmxlQ29sdW1uczxUVGFibGVzLCBUUmVzdWx0Pj4oXG4gICAgY29sdW1uOiBUQ29sdW1uIHwgUHVyaU9yZGVyQnlFeHByZXNzaW9uLFxuICAgIGRpcmVjdGlvbj86IFB1cmlPcmRlckJ5RGlyZWN0aW9uLFxuICAgIG51bGxzPzogUHVyaU9yZGVyQnlOdWxscyxcbiAgKTogdGhpcztcbiAgb3JkZXJCeTxUQ29sdW1uIGV4dGVuZHMgUmVzdWx0QXZhaWxhYmxlQ29sdW1uczxUVGFibGVzLCBUUmVzdWx0Pj4oXG4gICAgY29sdW1uczogcmVhZG9ubHkgUHVyaU9yZGVyQnlFbnRyeTxUQ29sdW1uPltdLFxuICApOiB0aGlzO1xuICBvcmRlckJ5KFxuICAgIGNvbHVtbk9yQ29sdW1uczogc3RyaW5nIHwgUHVyaU9yZGVyQnlFeHByZXNzaW9uIHwgcmVhZG9ubHkgUHVyaU9yZGVyQnlSdW50aW1lRW50cnlbXSxcbiAgICBkaXJlY3Rpb246IFB1cmlPcmRlckJ5RGlyZWN0aW9uID0gXCJhc2NcIixcbiAgICBudWxscz86IFB1cmlPcmRlckJ5TnVsbHMsXG4gICk6IHRoaXMge1xuICAgIGlmIChpc09yZGVyQnlFbnRyaWVzKGNvbHVtbk9yQ29sdW1ucykpIHtcbiAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgY29sdW1uT3JDb2x1bW5zKSB7XG4gICAgICAgIGlmIChpc1N0cmluZ1ZhbHVlKGVudHJ5KSB8fCBpc09yZGVyQnlFeHByZXNzaW9uKGVudHJ5KSkge1xuICAgICAgICAgIHRoaXMuYXBwbHlPcmRlckJ5KGVudHJ5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmFwcGx5T3JkZXJCeShlbnRyeS5jb2x1bW4sIGVudHJ5Lm9yZGVyLCBlbnRyeS5udWxscyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHRoaXMuYXBwbHlPcmRlckJ5KGNvbHVtbk9yQ29sdW1ucywgZGlyZWN0aW9uLCBudWxscyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5T3JkZXJCeShcbiAgICBjb2x1bW46IHN0cmluZyB8IFB1cmlPcmRlckJ5RXhwcmVzc2lvbixcbiAgICBkaXJlY3Rpb24/OiBQdXJpT3JkZXJCeURpcmVjdGlvbixcbiAgICBudWxscz86IFB1cmlPcmRlckJ5TnVsbHMsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWREaXJlY3Rpb24gPSBub3JtYWxpemVPcmRlckJ5RGlyZWN0aW9uKGRpcmVjdGlvbik7XG4gICAgY29uc3Qgbm9ybWFsaXplZE51bGxzID0gbm9ybWFsaXplT3JkZXJCeU51bGxzKG51bGxzKTtcblxuICAgIGlmIChpc09yZGVyQnlFeHByZXNzaW9uKGNvbHVtbikpIHtcbiAgICAgIHRoaXMua25leFF1ZXJ5Lm9yZGVyQnlSYXcoXG4gICAgICAgIGAke2NvbHVtbltcIl9zcWxcIl19ICR7bm9ybWFsaXplZERpcmVjdGlvbn0ke2Zvcm1hdE51bGxzU3VmZml4KG5vcm1hbGl6ZWROdWxscyl9YCxcbiAgICAgICAgY29sdW1uW1wiX3BhcmFtc1wiXSxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMua25leFF1ZXJ5Lm9yZGVyQnkoY29sdW1uLCBub3JtYWxpemVkRGlyZWN0aW9uLCBub3JtYWxpemVkTnVsbHMpO1xuICAgIH1cbiAgfVxuXG4gIGZvclVwZGF0ZSgpOiB0aGlzIHtcbiAgICB0aGlzLmtuZXhRdWVyeS5mb3JVcGRhdGUoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGZvclNoYXJlKCk6IHRoaXMge1xuICAgIHRoaXMua25leFF1ZXJ5LmZvclNoYXJlKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICog67Kh7YSwIOycoOyCrOuPhCDqsoDsg4kg7ISk7KCVXG4gICAqXG4gICAqIC0gU0VMRUNU7JeQIHNpbWlsYXJpdHkg7Lus65+8IOy2lOqwgFxuICAgKiAtIFdIRVJFIGNvbCBJUyBOT1QgTlVMTCDstpTqsIBcbiAgICogLSB0aHJlc2hvbGTqsIAg7J6I7Jy866m0IFdIRVJFIOyhsOqxtCDstpTqsIBcbiAgICogLSDquLDsobQgT1JERVIgQlnrpbwgY2xlYXLtlZjqs6Ag7JuQ7IucIOyXsOyCsOyekOuhnCDsoJXroKwgKEhOU1cg7J24642x7IqkIOy1nOygge2ZlClcbiAgICpcbiAgICogQHBhcmFtIGNvbHVtbiDrsqHthLAg7Lus65+8IOqyveuhnFxuICAgKiBAcGFyYW0gZW1iZWRkaW5nIOy/vOumrCDsnoTrsqDrlKkg67Kh7YSwXG4gICAqIEBwYXJhbSBvcHRpb25zIG1ldGhvZCwgdGhyZXNob2xkLCBhcyDrk7Eg7Ji17IWYXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gY29zaW5lIHNpbWlsYXJpdHkgKOq4sOuzuOqwkilcbiAgICogcWIudmVjdG9yU2ltaWxhcml0eShcImNvbHVtbk5hbWVcIiwgcXVlcnlWZWN0b3IsIHtcbiAgICogICBtZXRob2Q6IFwiY29zaW5lXCIsXG4gICAqICAgdGhyZXNob2xkOiAwLjVcbiAgICogfSk7XG4gICAqXG4gICAqIC8vIEwyIGRpc3RhbmNlXG4gICAqIHFiLnZlY3RvclNpbWlsYXJpdHkoXCJjb2x1bW5OYW1lXCIsIHF1ZXJ5VmVjdG9yLCB7XG4gICAqICAgbWV0aG9kOiBcImwyXCIsXG4gICAqICAgdGhyZXNob2xkOiAxLjUgIC8vIOqxsOumrOqwgCAxLjUg7J207ZWY7J24IOqysOqzvOunjFxuICAgKiB9KTtcbiAgICpcbiAgICogLy8gSW5uZXIgcHJvZHVjdFxuICAgKiBxYi52ZWN0b3JTaW1pbGFyaXR5KFwiY29sdW1uTmFtZVwiLCBxdWVyeVZlY3Rvciwge1xuICAgKiAgIG1ldGhvZDogXCJpbm5lcl9wcm9kdWN0XCIsXG4gICAqICAgdGhyZXNob2xkOiAwLjdcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgdmVjdG9yU2ltaWxhcml0eShcbiAgICBjb2x1bW46IFZlY3RvckNvbHVtbnM8VFRhYmxlcz4sXG4gICAgZW1iZWRkaW5nOiBudW1iZXJbXSxcbiAgICBvcHRpb25zOiB7XG4gICAgICBtZXRob2Q/OiBcImNvc2luZVwiIHwgXCJsMlwiIHwgXCJpbm5lcl9wcm9kdWN0XCI7XG4gICAgICB0aHJlc2hvbGQ/OiBudW1iZXI7XG4gICAgICBkaXN0aW5jdE9uPzogQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPjtcbiAgICB9ID0ge30sXG4gICk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcywgVFJlc3VsdCAmIHsgc2ltaWxhcml0eTogbnVtYmVyIH0+IHtcbiAgICBjb25zdCB7IG1ldGhvZCA9IFwiY29zaW5lXCIsIHRocmVzaG9sZCwgZGlzdGluY3RPbiB9ID0gb3B0aW9ucztcblxuICAgIGlmIChcbiAgICAgICFBcnJheS5pc0FycmF5KGVtYmVkZGluZykgfHxcbiAgICAgIGVtYmVkZGluZy5sZW5ndGggPT09IDAgfHxcbiAgICAgIGVtYmVkZGluZy5zb21lKCh2KSA9PiAhTnVtYmVyLmlzRmluaXRlKHYpKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBlbWJlZGRpbmcgdmVjdG9yOiBleHBlY3RlZCBhIG5vbi1lbXB0eSBhcnJheSBvZiBmaW5pdGUgbnVtYmVyc1wiKTtcbiAgICB9XG5cbiAgICBjb25zdCB2ZWN0b3JMaXRlcmFsID0gSlNPTi5zdHJpbmdpZnkoZW1iZWRkaW5nLm1hcCgodikgPT4gTnVtYmVyKHYpKSk7XG4gICAgY29uc3Qgb3BlcmF0b3IgPSB7IGNvc2luZTogXCI8PT5cIiwgbDI6IFwiPC0+XCIsIGlubmVyX3Byb2R1Y3Q6IFwiPCM+XCIgfVttZXRob2RdO1xuXG4gICAgLy8gbWV0aG9k67OEIOyXsOyCsOyekCDrsI8gc2ltaWxhcml0eSDqs4TsgrDsi51cbiAgICAvLyAtIGNvc2luZTogPD0+IChjb3NpbmUgZGlzdGFuY2UsIDB+MiksIHNpbWlsYXJpdHkgPSAxIC0gZGlzdGFuY2VcbiAgICAvLyAtIGwyOiA8LT4gKGV1Y2xpZGVhbiBkaXN0YW5jZSksIHNpbWlsYXJpdHkgPSBkaXN0YW5jZSAo64Ku7J2E7IiY66GdIOycoOyCrClcbiAgICAvLyAtIGlubmVyX3Byb2R1Y3Q6IDwjPiAobmVnYXRpdmUgaW5uZXIgcHJvZHVjdCksIHNpbWlsYXJpdHkgPSAtZGlzdGFuY2UgKOuGkuydhOyImOuhnSDsnKDsgqwpXG4gICAgY29uc3Qgc2ltaWxhcml0eUV4cHIgPVxuICAgICAgbWV0aG9kID09PSBcImNvc2luZVwiXG4gICAgICAgID8gdGhpcy5rbmV4LnJhdyhgMSAtICg/PyAke29wZXJhdG9yfSA/Ojp2ZWN0b3IpIGFzIHNpbWlsYXJpdHlgLCBbY29sdW1uLCB2ZWN0b3JMaXRlcmFsXSlcbiAgICAgICAgOiBtZXRob2QgPT09IFwibDJcIlxuICAgICAgICAgID8gdGhpcy5rbmV4LnJhdyhgPz8gJHtvcGVyYXRvcn0gPzo6dmVjdG9yIGFzIHNpbWlsYXJpdHlgLCBbY29sdW1uLCB2ZWN0b3JMaXRlcmFsXSlcbiAgICAgICAgICA6IHRoaXMua25leC5yYXcoYC0oPz8gJHtvcGVyYXRvcn0gPzo6dmVjdG9yKSBhcyBzaW1pbGFyaXR5YCwgW2NvbHVtbiwgdmVjdG9yTGl0ZXJhbF0pO1xuXG4gICAgLy8gV0hFUkUgTk9UIE5VTExcbiAgICB0aGlzLmtuZXhRdWVyeS53aGVyZU5vdE51bGwoY29sdW1uKTtcblxuICAgIC8vIOq4sOyhtCBPUkRFUiBCWSBjbGVhclxuICAgIHRoaXMua25leFF1ZXJ5LmNsZWFyKFwib3JkZXJcIik7XG4gICAgaWYgKGRpc3RpbmN0T24pIHtcbiAgICAgIC8vIERJU1RJTkNUIE9O7J2AIFNFTEVDVCDsoIjsnZgg66eoIOyVnuyXkCDsmYDslbwg7ZWY66+A66GcLCDquLDsobQgc2VsZWN0KHN1YnNldCDtlYTrk5zrk6Qp66W8IOuztOyhtCDtm4QgY2xlYXLtlZjqs6Ag64uk7IucIOy2lOqwgFxuICAgICAgLy8gU0FGRVRZOiDsv7zrpqwg67mM642U7J2YIOygnOuEpOumrSDqs4Tslb3qs7wg7ISg7ZaJIOqygOymneydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAgIGNvbnN0IGV4aXN0aW5nU3Vic2V0Q29scyA9ICh0aGlzLmtuZXhRdWVyeSBhcyBhbnkpW1wiX3N0YXRlbWVudHNcIl1cbiAgICAgICAgLmZpbHRlcigoczogYW55KSA9PiBzLmdyb3VwaW5nID09PSBcImNvbHVtbnNcIilcbiAgICAgICAgLmZsYXRNYXAoKHM6IGFueSkgPT4gcy52YWx1ZSk7XG4gICAgICB0aGlzLmtuZXhRdWVyeS5jbGVhcihcInNlbGVjdFwiKTtcbiAgICAgIHRoaXMua25leFF1ZXJ5LnNlbGVjdCh0aGlzLmtuZXgucmF3KGBESVNUSU5DVCBPTiAoPz8pID8/YCwgW2Rpc3RpbmN0T24sIGRpc3RpbmN0T25dKSk7XG4gICAgICBleGlzdGluZ1N1YnNldENvbHMubWFwKChjb2w6IGFueSkgPT4gdGhpcy5rbmV4UXVlcnkuc2VsZWN0KGNvbCkpO1xuICAgICAgdGhpcy5rbmV4UXVlcnkuc2VsZWN0KHNpbWlsYXJpdHlFeHByKTtcbiAgICAgIHRoaXMua25leFF1ZXJ5Lm9yZGVyQnlSYXcoYD8/LCA/PyAke29wZXJhdG9yfSA/Ojp2ZWN0b3JgLCBbXG4gICAgICAgIGRpc3RpbmN0T24sXG4gICAgICAgIGNvbHVtbixcbiAgICAgICAgdmVjdG9yTGl0ZXJhbCxcbiAgICAgIF0pO1xuXG4gICAgICB0aGlzLmtuZXhRdWVyeSA9IHRoaXMua25leFxuICAgICAgICAuZnJvbSh0aGlzLmtuZXhRdWVyeS5hcyhcImRpc3RpbmN0X3ZlY3RvcnNcIikpXG4gICAgICAgIC5zZWxlY3QoXCIqXCIpXG4gICAgICAgIC5vcmRlckJ5KFwic2ltaWxhcml0eVwiLCBcImRlc2NcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMua25leFF1ZXJ5LnNlbGVjdChzaW1pbGFyaXR5RXhwcik7XG4gICAgICB0aGlzLmtuZXhRdWVyeS5vcmRlckJ5UmF3KGA/PyAke29wZXJhdG9yfSA/Ojp2ZWN0b3JgLCBbY29sdW1uLCB2ZWN0b3JMaXRlcmFsXSk7XG4gICAgfVxuXG4gICAgLy8gdGhyZXNob2xkXG4gICAgaWYgKGlzTnVtYmVyVmFsdWUodGhyZXNob2xkKSkge1xuICAgICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUodGhyZXNob2xkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdmVjdG9yU2ltaWxhcml0eSB0aHJlc2hvbGQ6ICR7dGhyZXNob2xkfWApO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGlzdGluY3RPbikge1xuICAgICAgICBjb25zdCB0aHJlc2hvbGRPcCA9IG1ldGhvZCA9PT0gXCJsMlwiID8gXCI8PVwiIDogXCI+PVwiO1xuICAgICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZShcInNpbWlsYXJpdHlcIiwgdGhyZXNob2xkT3AsIHRocmVzaG9sZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB0aHJlc2hvbGRWYWx1ZSA9XG4gICAgICAgICAgbWV0aG9kID09PSBcImNvc2luZVwiID8gMSAtIHRocmVzaG9sZCA6IG1ldGhvZCA9PT0gXCJpbm5lcl9wcm9kdWN0XCIgPyAtdGhyZXNob2xkIDogdGhyZXNob2xkO1xuICAgICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZVJhdyhgPz8gJHtvcGVyYXRvcn0gPzo6dmVjdG9yIDw9ID9gLCBbXG4gICAgICAgICAgY29sdW1uLFxuICAgICAgICAgIHZlY3RvckxpdGVyYWwsXG4gICAgICAgICAgdGhyZXNob2xkVmFsdWUsXG4gICAgICAgIF0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNBRkVUWTog7L+866asIOu5jOuNlOydmCDsoJzrhKTrpq0g6rOE7JW96rO8IOyEoO2WiSDqsoDspp3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgcmV0dXJuIHRoaXMgYXMgYW55O1xuICB9XG5cbiAgLy8g6riw67O4IOy/vOumrCDrqZTshJzrk5zrk6RcbiAgbGltaXQoY291bnQ6IG51bWJlcik6IHRoaXMge1xuICAgIGlmIChjb3VudCA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgbGltaXQ6IG11c3QgYmUgPj0gMFwiKTtcbiAgICB9XG4gICAgdGhpcy5rbmV4UXVlcnkubGltaXQoY291bnQpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgb2Zmc2V0KGNvdW50OiBudW1iZXIpOiB0aGlzIHtcbiAgICBpZiAoY291bnQgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIG9mZnNldDogbXVzdCBiZSA+PSAwXCIpO1xuICAgIH1cbiAgICB0aGlzLmtuZXhRdWVyeS5vZmZzZXQoY291bnQpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gR1JPVVAgQllcbiAgZ3JvdXBCeTxUQ29sdW1ucyBleHRlbmRzIFJlc3VsdEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcywgVFJlc3VsdD4+KC4uLmNvbHVtbnM6IFRDb2x1bW5zW10pOiB0aGlzO1xuICBncm91cEJ5KC4uLmNvbHVtbnM6IHN0cmluZ1tdKTogdGhpcyB7XG4gICAgdGhpcy5rbmV4UXVlcnkuZ3JvdXBCeSguLi5jb2x1bW5zKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIEhBVklOR1xuICBoYXZpbmcoY29uZGl0aW9uOiBzdHJpbmcpOiB0aGlzO1xuICBoYXZpbmc8VENvbHVtbiBleHRlbmRzIFJlc3VsdEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcywgVFJlc3VsdD4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICBvcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yLFxuICAgIHZhbHVlOiBhbnksXG4gICk6IHRoaXM7XG4gIC8vIEhBVklORyDqtaztmIRcbiAgaGF2aW5nKC4uLmNvbmRpdGlvbnM6IGFueVtdKTogdGhpcyB7XG4gICAgaWYgKGNvbmRpdGlvbnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAvLyBoYXZpbmcoXCJDT1VOVCgqKSA+IDEwXCIpXG4gICAgICB0aGlzLmtuZXhRdWVyeS5oYXZpbmcodGhpcy5rbmV4LnJhdyhjb25kaXRpb25zWzBdKSk7XG4gICAgfSBlbHNlIGlmIChjb25kaXRpb25zLmxlbmd0aCA9PT0gMykge1xuICAgICAgLy8gaGF2aW5nKFwiY291bnRcIiwgXCI+XCIsIDEwKVxuICAgICAgdGhpcy5rbmV4UXVlcnkuaGF2aW5nKFxuICAgICAgICB0aGlzLmtuZXgucmF3KGNvbmRpdGlvbnNbMF0pLFxuICAgICAgICBjb25kaXRpb25zWzFdLFxuICAgICAgICB0aGlzLmtuZXgucmF3KGNvbmRpdGlvbnNbMl0pLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBoYXZpbmcgYXJndW1lbnRzXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHByaXZhdGUgZXhlY3V0ZVNlbGVjdCgpOiBQcm9taXNlPFNlbGVjdFJlc3VsdD4ge1xuICAgIGlmICh0aGlzLm5lc3RlZFNlbGVjdFBhdGhzLnNpemUgPT09IDApIHJldHVybiB0aGlzLmtuZXhRdWVyeS50aGVuKCk7XG4gICAgY29uc3QgcHJlc2VuY2VDb2x1bW5zID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgICAvLyDsm5Drs7gg7L+866as64qUIHJhd1F1ZXJ57JmAIOyEnOu4jOyFiyDroZzrjZTqsIAg6rO17Jyg7ZWY66+A66GcIOyLpO2WiSDrs7XsoJzrs7jsl5Drp4wg7YyQ67OE7Iud7J2EIOy2lOqwgO2VqeuLiOuLpC5cbiAgICBsZXQgZXhlY3V0YWJsZSA9IHRoaXMua25leFF1ZXJ5O1xuICAgIGlmICh0aGlzLmNhblNlbGVjdFJlbGF0aW9uUHJlc2VuY2UoKSkge1xuICAgICAgY29uc3Qgc3FsID0gdGhpcy50b1F1ZXJ5KCk7XG4gICAgICBmb3IgKGNvbnN0IHBhdGggb2YgdGhpcy5uZXN0ZWRTZWxlY3RQYXRocy52YWx1ZXMoKSkge1xuICAgICAgICBmb3IgKGxldCBsZW5ndGggPSAxOyBsZW5ndGggPCBwYXRoLmxlbmd0aDsgbGVuZ3RoKyspIHtcbiAgICAgICAgICBjb25zdCBhbGlhcyA9IGdldFNlbGVjdFJlbGF0aW9uQWxpYXMoXG4gICAgICAgICAgICBwYXRoLnNsaWNlKDAsIGxlbmd0aCkuam9pbihcIl9fXCIpLFxuICAgICAgICAgICAgdGhpcy5jb3JyZWxhdGlvblJlZ2lzdHJ5LFxuICAgICAgICAgICAgdGhpcy5uZXN0ZWRTZWxlY3RJZGVudGl0eVNvdXJjZXMsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoYWxpYXMgPT09IHVuZGVmaW5lZCB8fCBwcmVzZW5jZUNvbHVtbnMuaGFzKGFsaWFzKSkgY29udGludWU7XG4gICAgICAgICAgbGV0IGNvbHVtbjogc3RyaW5nO1xuICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgIGNvbHVtbiA9IGBfX3NvbmFtdV9wcmVzZW5jZV8ke3JhbmRvbVVVSUQoKS5yZXBsYWNlQWxsKFwiLVwiLCBcIlwiKX1gO1xuICAgICAgICAgIH0gd2hpbGUgKHNxbC5pbmNsdWRlcyhjb2x1bW4pKTtcbiAgICAgICAgICBpZiAocHJlc2VuY2VDb2x1bW5zLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIGV4ZWN1dGFibGUgPSB0aGlzLmtuZXhRdWVyeS5jbG9uZSgpO1xuICAgICAgICAgICAgLy8gS25leC5jbG9uZeydtCDrs7XsoJztlZjsp4Ag7JWK64qUIOyLpO2WiSDsoJztlZzqs7wg7J2067Kk7Yq464qUIOybkOuzuOydmCDqs4Tslb3snYQg7Jyg7KeA7ZWp64uI64ukLlxuICAgICAgICAgICAgLy8gU0FGRVRZOiB0aW1lb3V07J2AIEtuZXggUXVlcnlCdWlsZGVy6rCAIOuztOq0gO2VmOuKlCDsi6Ttlokg7Ji17IWY7J6F64uI64ukLlxuICAgICAgICAgICAgY29uc3QgdGltZW91dCA9ICh0aGlzLmtuZXhRdWVyeSBhcyBhbnkpLl90aW1lb3V0O1xuICAgICAgICAgICAgaWYgKGlzTnVtYmVyVmFsdWUodGltZW91dCkpIHtcbiAgICAgICAgICAgICAgLy8gU0FGRVRZOiBjYW5jZWxPblRpbWVvdXTsnYAgdGltZW91dCDsmLXshZjqs7wg7ZWo6ruYIEtuZXjqsIAg6riw66Gd7ZWY64qUIOu2iOumrOyWuOyeheuLiOuLpC5cbiAgICAgICAgICAgICAgZXhlY3V0YWJsZS50aW1lb3V0KHRpbWVvdXQsIHtcbiAgICAgICAgICAgICAgICBjYW5jZWw6ICh0aGlzLmtuZXhRdWVyeSBhcyBhbnkpLl9jYW5jZWxPblRpbWVvdXQgPT09IHRydWUsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gU0FGRVRZOiBLbmV4IFF1ZXJ5QnVpbGRlcuuKlCBFdmVudEVtaXR0ZXLrpbwg7IOB7IaN7ZWY7KeA66eMIOqzteqwnCDtg4DsnoXsl5DripQg7J2867aAIOuplOyEnOuTnOunjCDsnojsirXri4jri6QuXG4gICAgICAgICAgICBjb25zdCBlbWl0dGVyID0gdGhpcy5rbmV4UXVlcnkgYXMgS25leC5RdWVyeUJ1aWxkZXIgJiBFdmVudEVtaXR0ZXI7XG4gICAgICAgICAgICAvLyBTQUZFVFk6IOyLpO2WiSDrs7XsoJzrs7jrj4Qg64+Z7J287ZWcIEtuZXggRXZlbnRFbWl0dGVyIOq1rO2YhOyeheuLiOuLpC5cbiAgICAgICAgICAgIGNvbnN0IGV4ZWN1dGlvbkVtaXR0ZXI6IEV2ZW50RW1pdHRlciA9IGV4ZWN1dGFibGUgYXMgS25leC5RdWVyeUJ1aWxkZXIgJiBFdmVudEVtaXR0ZXI7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGV2ZW50IG9mIGVtaXR0ZXIuZXZlbnROYW1lcygpKSB7XG4gICAgICAgICAgICAgIGV4ZWN1dGlvbkVtaXR0ZXIub24oZXZlbnQsICguLi5hcmdzOiBhbnlbXSkgPT4gZW1pdHRlci5lbWl0KGV2ZW50LCAuLi5hcmdzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHByZXNlbmNlQ29sdW1ucy5zZXQoYWxpYXMsIGNvbHVtbik7XG4gICAgICAgICAgZXhlY3V0YWJsZS5zZWxlY3QodGhpcy5rbmV4LnJhdyhcIj8/LiogSVMgRElTVElOQ1QgRlJPTSBOVUxMIEFTID8/XCIsIFthbGlhcywgY29sdW1uXSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBleGVjdXRhYmxlLnRoZW4oKHJlc3VsdCkgPT5cbiAgICAgIGh5ZHJhdGVTZWxlY3RSZXN1bHQoXG4gICAgICAgIHJlc3VsdCxcbiAgICAgICAgdGhpcy5uZXN0ZWRTZWxlY3RQYXRocyxcbiAgICAgICAgdGhpcy5jb3JyZWxhdGlvblJlZ2lzdHJ5LFxuICAgICAgICBwcmVzZW5jZUNvbHVtbnMsXG4gICAgICAgIHRoaXMubmVzdGVkU2VsZWN0SWRlbnRpdHlTb3VyY2VzLFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBjYW5TZWxlY3RSZWxhdGlvblByZXNlbmNlKCk6IGJvb2xlYW4ge1xuICAgIC8vIOq3uOujucK37KeR6rOEwrdESVNUSU5DVMK37JuQ7IucIO2RnO2YhOyLneyXkOuKlCDsl7TsnYQg7LaU6rCA7ZWY66m0IFNRTCDsnZjrr7jqsIAg67CU64CUIOyImCDsnojsirXri4jri6QuXG4gICAgLy8gU0FGRVRZOiBLbmV47J2YIHN0YXRlbWVudCDqtazsobDripQg64uk66W4IEpPSU4v67Kh7YSwIOyymOumrOyZgCDrj5nsnbztlZwg64K067aAIOqzhOyVveycvOuhnCDsnb3sirXri4jri6QuXG4gICAgY29uc3Qgc3RhdGVtZW50cyA9ICh0aGlzLmtuZXhRdWVyeSBhcyBhbnkpLl9zdGF0ZW1lbnRzO1xuICAgIHJldHVybiBzdGF0ZW1lbnRzLmV2ZXJ5KChzdGF0ZW1lbnQ6IGFueSkgPT4ge1xuICAgICAgaWYgKFtcImdyb3VwXCIsIFwiaGF2aW5nXCIsIFwidW5pb25cIl0uaW5jbHVkZXMoc3RhdGVtZW50Lmdyb3VwaW5nKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKHN0YXRlbWVudC5ncm91cGluZyAhPT0gXCJjb2x1bW5zXCIpIHJldHVybiB0cnVlO1xuICAgICAgaWYgKHN0YXRlbWVudC5kaXN0aW5jdCB8fCBzdGF0ZW1lbnQuZGlzdGluY3RPbiB8fCBzdGF0ZW1lbnQudHlwZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHN0YXRlbWVudC52YWx1ZS5ldmVyeSgoY29sdW1uOiBzdHJpbmcgfCB7IHJlZj86IHN0cmluZyB9KSA9PlxuICAgICAgICBpc1N0cmluZ1ZhbHVlKGNvbHVtbilcbiAgICAgICAgICA/ICFjb2x1bW4uaW5jbHVkZXMoXCIqXCIpXG4gICAgICAgICAgOiBpc09iamVjdFZhbHVlKGNvbHVtbikgJiYgaXNTdHJpbmdWYWx1ZShjb2x1bW4ucmVmKSxcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICAvLyDsi6Ttlokg66mU7ISc65Oc65OkIC0gdGhlbmFibGUg6rWs7ZiEXG4gIHRoZW48VFJlc3VsdDEgPSBFeHBhbmQ8VFJlc3VsdD5bXSwgVFJlc3VsdDIgPSBuZXZlcj4oXG4gICAgb25mdWxmaWxsZWQ/OiAoKHZhbHVlOiBFeHBhbmQ8VFJlc3VsdD5bXSkgPT4gVFJlc3VsdDEgfCBQcm9taXNlTGlrZTxUUmVzdWx0MT4pIHwgbnVsbCxcbiAgICBvbnJlamVjdGVkPzogKChyZWFzb246IGFueSkgPT4gVFJlc3VsdDIgfCBQcm9taXNlTGlrZTxUUmVzdWx0Mj4pIHwgbnVsbCxcbiAgKTogUHJvbWlzZTxUUmVzdWx0MSB8IFRSZXN1bHQyPiB7XG4gICAgTmFpdGUudChcInB1cmk6ZXhlY3V0ZWQtcXVlcnlcIiwgdGhpcy50b1F1ZXJ5KCkpO1xuICAgIC8vIFNBRkVUWTogU1FMIOqysOqzvOyXkCDshKDtg50g6rK966Gc66eMIOuzteybkO2VmOuvgOuhnCDshKDslrjrkJwg6rKw6rO8IOuwsOyXtCDtg4DsnoXsnYQg7Jyg7KeA7ZWp64uI64ukLlxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGVTZWxlY3QoKS50aGVuKG9uZnVsZmlsbGVkIGFzIGFueSwgb25yZWplY3RlZCk7XG4gIH1cbiAgY2F0Y2g8VFJlc3VsdDIgPSBuZXZlcj4oXG4gICAgb25yZWplY3RlZD86ICgocmVhc29uOiBhbnkpID0+IFRSZXN1bHQyIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDI+KSB8IG51bGwsXG4gICk6IFByb21pc2U8RXhwYW5kPFRSZXN1bHQ+W10gfCBUUmVzdWx0Mj4ge1xuICAgIHJldHVybiB0aGlzLnRoZW4oKS5jYXRjaChvbnJlamVjdGVkKTtcbiAgfVxuICBmaW5hbGx5KG9uZmluYWxseT86ICgoKSA9PiB2b2lkKSB8IG51bGwpOiBQcm9taXNlPEV4cGFuZDxUUmVzdWx0PltdPiB7XG4gICAgcmV0dXJuIHRoaXMudGhlbigpLmZpbmFsbHkob25maW5hbGx5KTtcbiAgfVxuXG4gIC8vIO2VmOuCmOunjCDsv7zrpqxcbiAgZmlyc3QoKTogUmVzb2x2ZWRQdXJpPEV4cGFuZDxUUmVzdWx0PiwgbmV2ZXI+IHtcbiAgICB0aGlzLmtuZXhRdWVyeS5maXJzdCgpO1xuICAgIHJldHVybiBuZXcgUmVzb2x2ZWRQdXJpKHRoaXMua25leFF1ZXJ5LCB0aGlzLmtuZXgsIHRoaXMudGFibGVTcGVjLCAoKSA9PiB7XG4gICAgICAvLyBTQUZFVFk6IGZpcnN07J2YIFNRTCDqsrDqs7zsl5Ag7ISg7YOdIOqyveuhnOunjCDrs7Xsm5DtlZjrr4DroZwg7ISg7Ja465CcIOuLqOydvCDroIjsvZTrk5wg7YOA7J6F7J2EIOycoOyngO2VqeuLiOuLpC5cbiAgICAgIHJldHVybiB0aGlzLmV4ZWN1dGVTZWxlY3QoKSBhcyBQcm9taXNlPEV4cGFuZDxUUmVzdWx0Pj47XG4gICAgfSk7XG4gIH1cblxuICAvLyDsv7zrpqztlZwg66CI7L2U65Oc7JeQ7IScIO2KueyglSDsu6zrn7zrp4wg7LaU7Lac7ZWcIOuwsOyXtCDrpqzthLRcbiAgcGx1Y2s8VENvbHVtbiBleHRlbmRzIGtleW9mIFRSZXN1bHQgfCBSZXN1bHRBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXMsIFRSZXN1bHQ+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICk6IFJlc29sdmVkUHVyaTxcbiAgICBUQ29sdW1uIGV4dGVuZHMga2V5b2YgVFJlc3VsdFxuICAgICAgPyBUUmVzdWx0W1RDb2x1bW5dW11cbiAgICAgIDogRXh0cmFjdENvbHVtblR5cGU8VFRhYmxlcywgVENvbHVtbiAmIHN0cmluZz5bXSxcbiAgICBuZXZlclxuICA+IHtcbiAgICAvLyBTQUZFVFk6IOy/vOumrCDruYzrjZTsnZgg7KCc64Sk66atIOqzhOyVveqzvCDshKDtlokg6rKA7Kad7J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgIHRoaXMua25leFF1ZXJ5LnBsdWNrKGNvbHVtbiBhcyBzdHJpbmcpO1xuICAgIHJldHVybiBuZXcgUmVzb2x2ZWRQdXJpKHRoaXMua25leFF1ZXJ5LCB0aGlzLmtuZXgsIHRoaXMudGFibGVTcGVjKTtcbiAgfVxuXG4gIC8vIElOU0VSVCA6IOuLqOydvCDqsJ3ssrRcbiAgaW5zZXJ0KFxuICAgIGRhdGE6IEluc2VydERhdGE8U2luZ2xlVGFibGVWYWx1ZTxUVGFibGVzPj4sXG4gICk6IFJlc29sdmVkUHVyaTxJbnNlcnRSZXN1bHQsIFNpbmdsZVRhYmxlVmFsdWU8VFRhYmxlcz4+O1xuICAvLyBJTlNFUlQ6IOuwsOyXtFxuICBpbnNlcnQoXG4gICAgZGF0YTogSW5zZXJ0RGF0YTxTaW5nbGVUYWJsZVZhbHVlPFRUYWJsZXM+PltdLFxuICApOiBSZXNvbHZlZFB1cmk8SW5zZXJ0UmVzdWx0LCBTaW5nbGVUYWJsZVZhbHVlPFRUYWJsZXM+PjtcbiAgLy8gSU5TRVJUIOyLpOygnCDqtaztmIRcbiAgaW5zZXJ0KFxuICAgIHJhd0RhdGE6IEluc2VydERhdGE8U2luZ2xlVGFibGVWYWx1ZTxUVGFibGVzPj4gfCBJbnNlcnREYXRhPFNpbmdsZVRhYmxlVmFsdWU8VFRhYmxlcz4+W10sXG4gICk6IFJlc29sdmVkUHVyaTxJbnNlcnRSZXN1bHQsIFNpbmdsZVRhYmxlVmFsdWU8VFRhYmxlcz4+IHtcbiAgICAvLyBKU09OIOy7rOufvCBzdHJpbmdpZnkg66Gc7KeB7J2EIOuplOyEnOuTnOuhnCDrtoTrpqztlZjsl6wg7KSR67O1IOygnOqxsFxuICAgIGNvbnN0IHJlZmluZWREYXRhID0gdGhpcy5yZWZpbmVKc29uQ29sdW1ucyhyYXdEYXRhKTtcbiAgICB0aGlzLmtuZXhRdWVyeS5pbnNlcnQocmVmaW5lZERhdGEpO1xuICAgIHJldHVybiBuZXcgUmVzb2x2ZWRQdXJpKHRoaXMua25leFF1ZXJ5LCB0aGlzLmtuZXgsIHRoaXMudGFibGVTcGVjKTtcbiAgfVxuXG4gIC8vIFVQREFURVxuICB1cGRhdGUocmF3RGF0YTogV2hlcmVDb25kaXRpb248VFRhYmxlcz4pOiBSZXNvbHZlZFB1cmk8bnVtYmVyLCBTaW5nbGVUYWJsZVZhbHVlPFRUYWJsZXM+PiB7XG4gICAgLy8gSlNPTiDsu6zrn7wgc3RyaW5naWZ5IOuhnOyngeydhCDrqZTshJzrk5zroZwg67aE66as7ZWY7JesIOykkeuztSDsoJzqsbBcbiAgICBjb25zdCByZWZpbmVkRGF0YSA9IHRoaXMucmVmaW5lSnNvbkNvbHVtbnMocmF3RGF0YSk7XG4gICAgdGhpcy5rbmV4UXVlcnkudXBkYXRlKHJlZmluZWREYXRhKTtcbiAgICByZXR1cm4gbmV3IFJlc29sdmVkUHVyaSh0aGlzLmtuZXhRdWVyeSwgdGhpcy5rbmV4LCB0aGlzLnRhYmxlU3BlYyk7XG4gIH1cblxuICAvKipcbiAgICogSlNPTiDsu6zrn7zsl5Ag64yA7ZW0IHN0cmluZ2lmeSDsspjrpqzrpbwg7IiY7ZaJ7ZWY64qUIOuCtOu2gCDrqZTshJzrk5zsnoXri4jri6QuXG4gICAqIG9iamVjdCDrmJDripQgb2JqZWN0IOuwsOyXtOydhCDrsJvqs6AsIEpTT04g7Lus65+87J20IOyeiOycvOuptCDsp4HroKztmZTtlZjsl6wg67CY7ZmY7ZWp64uI64ukLlxuICAgKiDsp4HsoJEg6rCS7J2EIOuzgOqyve2VmOuvgOuhnCBzaWRlIGVmZmVjdOqwgCDsnojsirXri4jri6QuXG4gICAqL1xuICBwcml2YXRlIHJlZmluZUpzb25Db2x1bW5zPFJvdyBleHRlbmRzIG9iamVjdD4oZGF0YTogUm93IHwgUm93W10pOiB0eXBlb2YgZGF0YSB7XG4gICAgLy8gdGFibGVTcGVj7J2064KYIGpzb25Db2x1bW5zIOyXhuuKlCDqsr3smrAg67CU66GcIOuwmO2ZmFxuICAgIGlmICghdGhpcy50YWJsZVNwZWMgfHwgIXRoaXMudGFibGVTcGVjLmpzb25Db2x1bW5zLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgLy8g65Ox66Gd65CcIFRhYmxlU3BlY+ydhCDthrXtlbQgSlNPTuy7rOufvCDrqqnroZ3snYQg6rCA7KC47JmAIEpTT04uc3RyaW5naWZ5IOyymOumrFxuICAgIGNvbnN0IGpzb25Db2x1bW5zID0gdGhpcy50YWJsZVNwZWMuanNvbkNvbHVtbnM7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBkYXRhKSB7XG4gICAgICAgIGZvciAoY29uc3QgY29sdW1uIG9mIGpzb25Db2x1bW5zKSB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBPYmplY3QuZW50cmllcyhpdGVtKS5maW5kKChba2V5XSkgPT4ga2V5ID09PSBjb2x1bW4pPy5bMV07XG4gICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oaXRlbSwge1xuICAgICAgICAgICAgICBbY29sdW1uXTogc2VyaWFsaXplSnNvbkNvbHVtblZhbHVlKHRoaXMudGFibGVTcGVjLCBjb2x1bW4sIHZhbHVlKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiBqc29uQ29sdW1ucykge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IE9iamVjdC5lbnRyaWVzKGRhdGEpLmZpbmQoKFtrZXldKSA9PiBrZXkgPT09IGNvbHVtbik/LlsxXTtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICBPYmplY3QuYXNzaWduKGRhdGEsIHtcbiAgICAgICAgICAgIFtjb2x1bW5dOiBzZXJpYWxpemVKc29uQ29sdW1uVmFsdWUodGhpcy50YWJsZVNwZWMsIGNvbHVtbiwgdmFsdWUpLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgLy8gSW5jcmVtZW50XG4gIGluY3JlbWVudDxUQ29sdW1uIGV4dGVuZHMgTnVtZXJpY0NvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICB2YWx1ZTogbnVtYmVyLFxuICApOiBSZXNvbHZlZFB1cmk8bnVtYmVyLCBTaW5nbGVUYWJsZVZhbHVlPFRUYWJsZXM+PiB7XG4gICAgaWYgKHZhbHVlIDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkluY3JlbWVudCB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwXCIpO1xuICAgIH1cbiAgICB0aGlzLmtuZXhRdWVyeS5pbmNyZW1lbnQoY29sdW1uLCB2YWx1ZSk7XG4gICAgcmV0dXJuIG5ldyBSZXNvbHZlZFB1cmkodGhpcy5rbmV4UXVlcnksIHRoaXMua25leCwgdGhpcy50YWJsZVNwZWMpO1xuICB9XG4gIC8vIERlY3JlbWVudFxuICBkZWNyZW1lbnQ8VENvbHVtbiBleHRlbmRzIE51bWVyaWNDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWU6IG51bWJlcixcbiAgKTogUmVzb2x2ZWRQdXJpPG51bWJlciwgU2luZ2xlVGFibGVWYWx1ZTxUVGFibGVzPj4ge1xuICAgIGlmICh2YWx1ZSA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEZWNyZW1lbnQgdmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gMFwiKTtcbiAgICB9XG4gICAgdGhpcy5rbmV4UXVlcnkuZGVjcmVtZW50KGNvbHVtbiwgdmFsdWUpO1xuICAgIHJldHVybiBuZXcgUmVzb2x2ZWRQdXJpKHRoaXMua25leFF1ZXJ5LCB0aGlzLmtuZXgsIHRoaXMudGFibGVTcGVjKTtcbiAgfVxuXG4gIC8vIERFTEVURVxuICBkZWxldGUoKTogUmVzb2x2ZWRQdXJpPG51bWJlciwgU2luZ2xlVGFibGVWYWx1ZTxUVGFibGVzPj4ge1xuICAgIHRoaXMua25leFF1ZXJ5LmRlbGV0ZSgpO1xuICAgIHJldHVybiBuZXcgUmVzb2x2ZWRQdXJpKHRoaXMua25leFF1ZXJ5LCB0aGlzLmtuZXgsIHRoaXMudGFibGVTcGVjKTtcbiAgfVxuXG4gIC8vIO2ZleyduCDsv7zrpqwg66as7YS0XG4gIHRvUXVlcnkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5rbmV4UXVlcnkudG9RdWVyeSgpO1xuICB9XG5cbiAgLy8g7L+866asIOuUlOuyhOq5hSDroZzqt7gg7Lac66ClXG4gIGRlYnVnKCk6IHRoaXMge1xuICAgIGNvbnNvbGUubG9nKGAke2NoYWxrLmN5YW4oXCJbUHVyaSBEZWJ1Z11cIil9ICR7Y2hhbGsueWVsbG93KHRoaXMudG9RdWVyeSgpKX1gKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGNsb25lKCk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcywgVFJlc3VsdD4ge1xuICAgIC8vICdkdWFsJ+ydgCDrjZTrr7gg7YWM7J2067iU7J2066mwLCDrsJTroZwg7JWE656YIOykhOyXkOyEnCBrbmV4UXVlcnnqsIAg642u7Ja07JSM7JuM7KeR64uI64ukLlxuICAgIGNvbnN0IG5ld1B1cmkgPSBuZXcgUHVyaTxUU2NoZW1hLCBUVGFibGVzLCBUUmVzdWx0Pih0aGlzLmtuZXgsIFwiZHVhbFwiKTtcbiAgICBuZXdQdXJpLmtuZXhRdWVyeSA9IHRoaXMua25leFF1ZXJ5LmNsb25lKCk7XG4gICAgbmV3UHVyaS50YWJsZVNwZWMgPSB0aGlzLnRhYmxlU3BlYztcbiAgICBuZXdQdXJpLm5lc3RlZFNlbGVjdFBhdGhzID0gbmV3IE1hcCh0aGlzLm5lc3RlZFNlbGVjdFBhdGhzKTtcbiAgICBuZXdQdXJpLm5lc3RlZFNlbGVjdElkZW50aXR5U291cmNlcyA9IG5ldyBNYXAodGhpcy5uZXN0ZWRTZWxlY3RJZGVudGl0eVNvdXJjZXMpO1xuICAgIG5ld1B1cmkuY29ycmVsYXRpb25SZWdpc3RyeSA9IG5ldyBNYXAodGhpcy5jb3JyZWxhdGlvblJlZ2lzdHJ5KTtcbiAgICByZXR1cm4gbmV3UHVyaTtcbiAgfVxuXG4gIGZvcm1hdFNRTCh1bmZvcm1hdHRlZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyBTUUwg7JiI7JW97Ja0IOuqqeuhnVxuICAgIGNvbnN0IGtleXdvcmRzID0gW1xuICAgICAgXCJTRUxFQ1RcIixcbiAgICAgIFwiRlJPTVwiLFxuICAgICAgXCJXSEVSRVwiLFxuICAgICAgXCJJTlNFUlRcIixcbiAgICAgIFwiSU5UT1wiLFxuICAgICAgXCJWQUxVRVNcIixcbiAgICAgIFwiVVBEQVRFXCIsXG4gICAgICBcIkRFTEVURVwiLFxuICAgICAgXCJDUkVBVEVcIixcbiAgICAgIFwiVEFCTEVcIixcbiAgICAgIFwiQUxURVJcIixcbiAgICAgIFwiRFJPUFwiLFxuICAgICAgXCJKT0lOXCIsXG4gICAgICBcIk9OXCIsXG4gICAgICBcIklOTkVSXCIsXG4gICAgICBcIkxFRlRcIixcbiAgICAgIFwiUklHSFRcIixcbiAgICAgIFwiRlVMTFwiLFxuICAgICAgXCJPVVRFUlwiLFxuICAgICAgXCJHUk9VUFwiLFxuICAgICAgXCJCWVwiLFxuICAgICAgXCJPUkRFUlwiLFxuICAgICAgXCJIQVZJTkdcIixcbiAgICAgIFwiRElTVElOQ1RcIixcbiAgICAgIFwiTElNSVRcIixcbiAgICAgIFwiT0ZGU0VUXCIsXG4gICAgICBcIkFTXCIsXG4gICAgICBcIkFORFwiLFxuICAgICAgXCJPUlwiLFxuICAgICAgXCJOT1RcIixcbiAgICAgIFwiSU5cIixcbiAgICAgIFwiTElLRVwiLFxuICAgICAgXCJJU1wiLFxuICAgICAgXCJOVUxMXCIsXG4gICAgICBcIkNBU0VcIixcbiAgICAgIFwiV0hFTlwiLFxuICAgICAgXCJUSEVOXCIsXG4gICAgICBcIkVMU0VcIixcbiAgICAgIFwiRU5EXCIsXG4gICAgICBcIlVOSU9OXCIsXG4gICAgICBcIkFMTFwiLFxuICAgICAgXCJFWElTVFNcIixcbiAgICAgIFwiQkVUV0VFTlwiLFxuICAgIF07XG5cbiAgICBsZXQgZm9ybWF0dGVkID0gdW5mb3JtYXR0ZWQ7XG5cbiAgICAvLyDsmIjslb3slrTrpbwg64yA66y47J6Q66GcIOuzgO2ZmFxuICAgIGtleXdvcmRzLmZvckVhY2goKGtleXdvcmQpID0+IHtcbiAgICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChgXFxcXGIke2tleXdvcmR9XFxcXGJgLCBcImdpXCIpO1xuICAgICAgZm9ybWF0dGVkID0gZm9ybWF0dGVkLnJlcGxhY2UocmVnZXgsIGtleXdvcmQudG9VcHBlckNhc2UoKSk7XG4gICAgfSk7XG5cbiAgICAvLyDso7zsmpQg7KCIIOyVnuyXkCDspITrsJTqv4gg7LaU6rCAXG4gICAgY29uc3QgbWFqb3JDbGF1c2VzID0gW1xuICAgICAgXCJTRUxFQ1RcIixcbiAgICAgIFwiRlJPTVwiLFxuICAgICAgXCJXSEVSRVwiLFxuICAgICAgXCJHUk9VUCBCWVwiLFxuICAgICAgXCJPUkRFUiBCWVwiLFxuICAgICAgXCJIQVZJTkdcIixcbiAgICAgIFwiTElNSVRcIixcbiAgICAgIFwiVU5JT05cIixcbiAgICBdO1xuICAgIG1ham9yQ2xhdXNlcy5mb3JFYWNoKChjbGF1c2UpID0+IHtcbiAgICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChgXFxcXHMrKCR7Y2xhdXNlfSlcXFxccytgLCBcImdpXCIpO1xuICAgICAgZm9ybWF0dGVkID0gZm9ybWF0dGVkLnJlcGxhY2UocmVnZXgsIGBcXG4ke2NsYXVzZS50b1VwcGVyQ2FzZSgpfSBgKTtcbiAgICB9KTtcblxuICAgIC8vIEpPSU4g7KCIIOyymOumrFxuICAgIGZvcm1hdHRlZCA9IGZvcm1hdHRlZC5yZXBsYWNlKC9cXHMrKCg/OklOTkVSfExFRlR8UklHSFR8RlVMTCBPVVRFUilcXHMrKT9KT0lOXFxzKy9naSwgXCJcXG4kMUpPSU4gXCIpO1xuXG4gICAgLy8gQU5ELCBPUiDsobDqsbQg7LKY66asXG4gICAgZm9ybWF0dGVkID0gZm9ybWF0dGVkLnJlcGxhY2UoL1xccysoQU5EfE9SKVxccysvZ2ksIFwiXFxuICAkMSBcIik7XG5cbiAgICAvLyDqtITtmLgg7LKY66asIOuwjyDrk6Tsl6zsk7DquLBcbiAgICBjb25zdCBsaW5lcyA9IGZvcm1hdHRlZC5zcGxpdChcIlxcblwiKTtcbiAgICBjb25zdCBpbmRlbnRlZExpbmVzID0gW107XG4gICAgbGV0IGluZGVudExldmVsID0gMDtcblxuICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgY29uc3QgdHJpbW1lZExpbmUgPSBsaW5lLnRyaW0oKTtcbiAgICAgIGlmICghdHJpbW1lZExpbmUpIGNvbnRpbnVlO1xuXG4gICAgICAvLyDri6vripQg6rSE7Zi46rCAIOyeiOycvOuptCDrk6Tsl6zsk7DquLAg66CI67KoIOqwkOyGjFxuICAgICAgY29uc3QgY2xvc2luZ1BhcmVucyA9ICh0cmltbWVkTGluZS5tYXRjaCgvXFwpL2cpIHx8IFtdKS5sZW5ndGg7XG4gICAgICBjb25zdCBvcGVuaW5nUGFyZW5zID0gKHRyaW1tZWRMaW5lLm1hdGNoKC9cXCgvZykgfHwgW10pLmxlbmd0aDtcblxuICAgICAgaWYgKGNsb3NpbmdQYXJlbnMgPiAwICYmIG9wZW5pbmdQYXJlbnMgPT09IDApIHtcbiAgICAgICAgaW5kZW50TGV2ZWwgPSBNYXRoLm1heCgwLCBpbmRlbnRMZXZlbCAtIGNsb3NpbmdQYXJlbnMpO1xuICAgICAgfVxuXG4gICAgICAvLyDtmITsnqwg65Ok7Jes7JOw6riwIOyggeyaqVxuICAgICAgY29uc3QgaW5kZW50ID0gXCIgIFwiLnJlcGVhdChpbmRlbnRMZXZlbCk7XG4gICAgICBpbmRlbnRlZExpbmVzLnB1c2goaW5kZW50ICsgdHJpbW1lZExpbmUpO1xuXG4gICAgICAvLyDsl6zripQg6rSE7Zi46rCAIOyeiOycvOuptCDrk6Tsl6zsk7DquLAg66CI67KoIOymneqwgFxuICAgICAgaWYgKG9wZW5pbmdQYXJlbnMgPiBjbG9zaW5nUGFyZW5zKSB7XG4gICAgICAgIGluZGVudExldmVsICs9IG9wZW5pbmdQYXJlbnMgLSBjbG9zaW5nUGFyZW5zO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBpbmRlbnRlZExpbmVzLmpvaW4oXCJcXG5cIikudHJpbSgpO1xuICB9XG5cbiAgcmF3KHNxbDogc3RyaW5nKTogS25leC5SYXcge1xuICAgIHJldHVybiB0aGlzLmtuZXgucmF3KHNxbCk7XG4gIH1cblxuICAvLyBLbmV4IOy/vOumrCDruYzrjZQg7KeB7KCRIOygkeq3vFxuICByYXdRdWVyeSgpOiBLbmV4LlF1ZXJ5QnVpbGRlciB7XG4gICAgcmV0dXJuIHRoaXMua25leFF1ZXJ5O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBXaGVyZUdyb3VwPFRUYWJsZXMgZXh0ZW5kcyBvYmplY3Q+IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBidWlsZGVyOiBLbmV4LlF1ZXJ5QnVpbGRlcikge31cblxuICAvLyB3aGVyZSDrqZTshJzrk5zrk6RcbiAgd2hlcmUoY29uZGl0aW9uczogV2hlcmVDb25kaXRpb248VFRhYmxlcz4pOiB0aGlzO1xuICB3aGVyZTxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIHZhbHVlOiBFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUQ29sdW1uICYgc3RyaW5nPixcbiAgKTogdGhpcztcbiAgd2hlcmU8VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICBvcGVyYXRvcjogV2hlcmVPcGVyYXRvcixcbiAgICB2YWx1ZTogRXh0cmFjdENvbHVtblR5cGU8VFRhYmxlcywgVENvbHVtbiAmIHN0cmluZz4sXG4gICk6IHRoaXM7XG4gIHdoZXJlKC4uLmFyZ3M6IGFueVtdKTogV2hlcmVHcm91cDxUVGFibGVzPiB7XG4gICAgdGhpcy5idWlsZGVyLndoZXJlKGFyZ3NbMF0sIC4uLmFyZ3Muc2xpY2UoMSkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gd2hlcmVJbiAvIHdoZXJlTm90SW4g66mU7ISc65Oc65OkXG4gIHdoZXJlSW48VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICB2YWx1ZXM6IChFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUQ29sdW1uICYgc3RyaW5nPiAmIEtuZXguVmFsdWUpW10sXG4gICk6IHRoaXM7XG4gIHdoZXJlSW4oLi4uYXJnczogYW55W10pOiBXaGVyZUdyb3VwPFRUYWJsZXM+IHtcbiAgICB0aGlzLmJ1aWxkZXIud2hlcmVJbihhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHdoZXJlTm90SW48VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICB2YWx1ZXM6IChFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUQ29sdW1uICYgc3RyaW5nPiAmIEtuZXguVmFsdWUpW10sXG4gICk6IHRoaXM7XG4gIHdoZXJlTm90SW4oLi4uYXJnczogYW55W10pOiBXaGVyZUdyb3VwPFRUYWJsZXM+IHtcbiAgICB0aGlzLmJ1aWxkZXIud2hlcmVOb3RJbihhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIG9yV2hlcmUg66mU7ISc65Oc65OkXG4gIG9yV2hlcmUoY29uZGl0aW9uczogV2hlcmVDb25kaXRpb248VFRhYmxlcz4pOiB0aGlzO1xuICBvcldoZXJlPFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWU6IEV4dHJhY3RDb2x1bW5UeXBlPFRUYWJsZXMsIFRDb2x1bW4gJiBzdHJpbmc+LFxuICApOiB0aGlzO1xuICBvcldoZXJlPFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgb3BlcmF0b3I6IFdoZXJlT3BlcmF0b3IsXG4gICAgdmFsdWU6IEV4dHJhY3RDb2x1bW5UeXBlPFRUYWJsZXMsIFRDb2x1bW4gJiBzdHJpbmc+LFxuICApOiB0aGlzO1xuICBvcldoZXJlKC4uLmFyZ3M6IGFueVtdKTogV2hlcmVHcm91cDxUVGFibGVzPiB7XG4gICAgdGhpcy5idWlsZGVyLm9yV2hlcmUoYXJnc1swXSwgLi4uYXJncy5zbGljZSgxKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBvcldoZXJlSW4gLyBvcldoZXJlTm90SW4g66mU7ISc65Oc65OkXG4gIG9yV2hlcmVJbjxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIHZhbHVlczogKEV4dHJhY3RDb2x1bW5UeXBlPFRUYWJsZXMsIFRDb2x1bW4gJiBzdHJpbmc+ICYgS25leC5WYWx1ZSlbXSxcbiAgKTogdGhpcztcbiAgb3JXaGVyZUluKC4uLmFyZ3M6IGFueVtdKTogV2hlcmVHcm91cDxUVGFibGVzPiB7XG4gICAgdGhpcy5idWlsZGVyLm9yV2hlcmVJbihhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIG9yV2hlcmVOb3RJbjxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIHZhbHVlczogKEV4dHJhY3RDb2x1bW5UeXBlPFRUYWJsZXMsIFRDb2x1bW4gJiBzdHJpbmc+ICYgS25leC5WYWx1ZSlbXSxcbiAgKTogdGhpcztcbiAgb3JXaGVyZU5vdEluKC4uLmFyZ3M6IGFueVtdKTogV2hlcmVHcm91cDxUVGFibGVzPiB7XG4gICAgdGhpcy5idWlsZGVyLm9yV2hlcmVOb3RJbihhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIFdIRVJFIEpTT05CIFNVUEVSU0VUIChAPilcbiAgd2hlcmVKc29uU3VwZXJzZXRPZjxUQ29sdW1uIGV4dGVuZHMgSnNvbkNvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICB2YWx1ZTogSnNvblN1cGVyc2V0VmFsdWU8RXh0cmFjdENvbHVtblR5cGU8VFRhYmxlcywgVENvbHVtbj4+LFxuICApOiB0aGlzIHtcbiAgICB0aGlzLmJ1aWxkZXIud2hlcmVKc29uU3VwZXJzZXRPZihjb2x1bW4sIHNlcmlhbGl6ZUpzb25TdXBlcnNldFZhbHVlKHZhbHVlKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBvcldoZXJlSnNvblN1cGVyc2V0T2Y8VENvbHVtbiBleHRlbmRzIEpzb25Db2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWU6IEpzb25TdXBlcnNldFZhbHVlPEV4dHJhY3RDb2x1bW5UeXBlPFRUYWJsZXMsIFRDb2x1bW4+PixcbiAgKTogdGhpcyB7XG4gICAgdGhpcy5idWlsZGVyLm9yV2hlcmVKc29uU3VwZXJzZXRPZihjb2x1bW4sIHNlcmlhbGl6ZUpzb25TdXBlcnNldFZhbHVlKHZhbHVlKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB3aGVyZUpzb25LZXlFeGlzdHMoY29sdW1uOiBKc29uQ29sdW1uczxUVGFibGVzPiwga2V5OiBzdHJpbmcpOiB0aGlzIHtcbiAgICB0aGlzLmJ1aWxkZXIud2hlcmVSYXcoXCI/PyBcXFxcPyA/XCIsIFtjb2x1bW4sIGtleV0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgb3JXaGVyZUpzb25LZXlFeGlzdHMoY29sdW1uOiBKc29uQ29sdW1uczxUVGFibGVzPiwga2V5OiBzdHJpbmcpOiB0aGlzIHtcbiAgICB0aGlzLmJ1aWxkZXIub3JXaGVyZVJhdyhcIj8/IFxcXFw/ID9cIiwgW2NvbHVtbiwga2V5XSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBXSEVSRSBNQVRDSFxuICB3aGVyZU1hdGNoPFRDb2x1bW4gZXh0ZW5kcyBGdWxsdGV4dENvbHVtbnM8VFRhYmxlcz4+KGNvbHVtbjogVENvbHVtbiwgdmFsdWU6IHN0cmluZyk6IHRoaXM7XG4gIHdoZXJlTWF0Y2goLi4uYXJnczogYW55W10pOiB0aGlzIHtcbiAgICB0aGlzLmJ1aWxkZXIud2hlcmVSYXcoYE1BVENIICgke1N0cmluZyhhcmdzWzBdKX0pIEFHQUlOU1QgKD8pYCwgW2FyZ3NbMV1dKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIG9yV2hlcmVNYXRjaDxUQ29sdW1uIGV4dGVuZHMgRnVsbHRleHRDb2x1bW5zPFRUYWJsZXM+Pihjb2x1bW46IFRDb2x1bW4sIHZhbHVlOiBzdHJpbmcpOiB0aGlzO1xuICBvcldoZXJlTWF0Y2goLi4uYXJnczogYW55W10pOiB0aGlzIHtcbiAgICB0aGlzLmJ1aWxkZXIub3JXaGVyZVJhdyhgTUFUQ0ggKCR7U3RyaW5nKGFyZ3NbMF0pfSkgQUdBSU5TVCAoPylgLCBbYXJnc1sxXV0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gV0hFUkUgU0VBUkNIXG4gIHdoZXJlU2VhcmNoPFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4gfCBUQ29sdW1uW10sXG4gICAgdmFsdWU6IHN0cmluZyxcbiAgICBvcHRpb25zPzoge1xuICAgICAgd2VpZ2h0cz86IG51bWJlcltdOyAvLyDsoJXsiJgg67Cw7Je0XG4gICAgfSxcbiAgKTogdGhpcztcbiAgd2hlcmVTZWFyY2goLi4uYXJnczogYW55W10pOiB0aGlzIHtcbiAgICBjb25zdCB7IHdlaWdodHMgfSA9IGFyZ3NbMl0gPz8ge307XG4gICAgY29uc3QgY29sdW1uRXhwciA9IEFycmF5LmlzQXJyYXkoYXJnc1swXSlcbiAgICAgID8gYEFSUkFZWyR7YXJnc1swXS5tYXAoKGMpID0+IGAke2N9Ojp0ZXh0YCkuam9pbihcIixcIil9XWBcbiAgICAgIDogYXJnc1swXTtcbiAgICBjb25zdCBwZ3Jvb25nYUNvbmRpdGlvbiA9IGBwZ3Jvb25nYV9jb25kaXRpb24oPyR7d2VpZ2h0cz8ubGVuZ3RoID8gYCwgd2VpZ2h0cyA9PiBBUlJBWVske3dlaWdodHMuam9pbihcIixcIil9XWAgOiBcIlwifSlgO1xuICAgIHRoaXMuYnVpbGRlci53aGVyZVJhdyhgJHtjb2x1bW5FeHByfSAmQH4gJHtwZ3Jvb25nYUNvbmRpdGlvbn1gLCBbYXJnc1sxXV0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBvcldoZXJlU2VhcmNoPFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4gfCBUQ29sdW1uW10sXG4gICAgdmFsdWU6IHN0cmluZyxcbiAgICBvcHRpb25zPzoge1xuICAgICAgd2VpZ2h0cz86IG51bWJlcltdOyAvLyDsoJXsiJgg67Cw7Je0XG4gICAgfSxcbiAgKTogdGhpcztcbiAgb3JXaGVyZVNlYXJjaCguLi5hcmdzOiBhbnlbXSk6IHRoaXMge1xuICAgIGNvbnN0IHsgd2VpZ2h0cyB9ID0gYXJnc1syXSA/PyB7fTtcbiAgICBjb25zdCBjb2x1bW5FeHByID0gQXJyYXkuaXNBcnJheShhcmdzWzBdKVxuICAgICAgPyBgQVJSQVlbJHthcmdzWzBdLm1hcCgoYykgPT4gYCR7Y306OnRleHRgKS5qb2luKFwiLFwiKX1dYFxuICAgICAgOiBhcmdzWzBdO1xuICAgIGNvbnN0IHBncm9vbmdhQ29uZGl0aW9uID0gYHBncm9vbmdhX2NvbmRpdGlvbig/JHt3ZWlnaHRzPy5sZW5ndGggPyBgLCB3ZWlnaHRzID0+IEFSUkFZWyR7d2VpZ2h0cy5qb2luKFwiLFwiKX1dYCA6IFwiXCJ9KWA7XG4gICAgdGhpcy5idWlsZGVyLm9yV2hlcmVSYXcoYCR7Y29sdW1uRXhwcn0gJkB+ICR7cGdyb29uZ2FDb25kaXRpb259YCwgW2FyZ3NbMV1dKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gV0hFUkUgRlVMTFRFWFRcbiAgd2hlcmVUc1NlYXJjaDxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPiB8IFN0cmluZ1NxbEV4cHJlc3Npb24+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICB2YWx1ZTogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBUc1F1ZXJ5T3B0aW9ucyB8IFRzUXVlcnlDb25maWcsXG4gICk6IHRoaXM7XG4gIHdoZXJlVHNTZWFyY2goLi4uYXJnczogYW55W10pOiB0aGlzIHtcbiAgICBjb25zdCBvcHRzID1cbiAgICAgIC8vIFNBRkVUWTog7L+866asIOu5jOuNlOydmCDsoJzrhKTrpq0g6rOE7JW96rO8IOyEoO2WiSDqsoDspp3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgICBpc1N0cmluZ1ZhbHVlKGFyZ3NbMl0pID8gKHsgY29uZmlnOiBhcmdzWzJdIH0gYXMgVHNRdWVyeU9wdGlvbnMpIDogKGFyZ3NbMl0gPz8ge30pO1xuXG4gICAgY29uc3QgcGFyc2VyID0gb3B0cy5wYXJzZXIgPz8gXCJ3ZWJzZWFyY2hfdG9fdHNxdWVyeVwiO1xuICAgIGNvbnN0IGNvbmZpZyA9IG9wdHMuY29uZmlnID8/IFwic2ltcGxlXCI7XG4gICAgY29uc3QgY29sdW1uRXhwciA9IGlzU3FsRXhwcmVzc2lvbihhcmdzWzBdKSA/IGFyZ3NbMF1bXCJfc3FsXCJdIDogU3RyaW5nKGFyZ3NbMF0pO1xuICAgIGNvbnN0IHBhcmFtcyA9IGlzU3FsRXhwcmVzc2lvbihhcmdzWzBdKVxuICAgICAgPyBbLi4uYXJnc1swXVtcIl9wYXJhbXNcIl0sIGNvbmZpZywgYXJnc1sxXV1cbiAgICAgIDogW2NvbmZpZywgYXJnc1sxXV07XG5cbiAgICB0aGlzLmJ1aWxkZXIud2hlcmVSYXcoYCR7Y29sdW1uRXhwcn0gQEAgJHtwYXJzZXJ9KD8sID8pYCwgcGFyYW1zKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIG9yV2hlcmVUc1NlYXJjaDxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPiB8IFN0cmluZ1NxbEV4cHJlc3Npb24+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICB2YWx1ZTogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBUc1F1ZXJ5T3B0aW9ucyB8IFRzUXVlcnlDb25maWcsXG4gICk6IHRoaXM7XG4gIG9yV2hlcmVUc1NlYXJjaCguLi5hcmdzOiBhbnlbXSk6IHRoaXMge1xuICAgIGNvbnN0IG9wdHMgPVxuICAgICAgLy8gU0FGRVRZOiDsv7zrpqwg67mM642U7J2YIOygnOuEpOumrSDqs4Tslb3qs7wg7ISg7ZaJIOqygOymneydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAgIGlzU3RyaW5nVmFsdWUoYXJnc1syXSkgPyAoeyBjb25maWc6IGFyZ3NbMl0gfSBhcyBUc1F1ZXJ5T3B0aW9ucykgOiAoYXJnc1syXSA/PyB7fSk7XG5cbiAgICBjb25zdCBwYXJzZXIgPSBvcHRzLnBhcnNlciA/PyBcIndlYnNlYXJjaF90b190c3F1ZXJ5XCI7XG4gICAgY29uc3QgY29uZmlnID0gb3B0cy5jb25maWcgPz8gXCJzaW1wbGVcIjtcbiAgICBjb25zdCBjb2x1bW5FeHByID0gaXNTcWxFeHByZXNzaW9uKGFyZ3NbMF0pID8gYXJnc1swXVtcIl9zcWxcIl0gOiBTdHJpbmcoYXJnc1swXSk7XG4gICAgY29uc3QgcGFyYW1zID0gaXNTcWxFeHByZXNzaW9uKGFyZ3NbMF0pXG4gICAgICA/IFsuLi5hcmdzWzBdW1wiX3BhcmFtc1wiXSwgY29uZmlnLCBhcmdzWzFdXVxuICAgICAgOiBbY29uZmlnLCBhcmdzWzFdXTtcblxuICAgIHRoaXMuYnVpbGRlci5vcldoZXJlUmF3KGAke2NvbHVtbkV4cHJ9IEBAICR7cGFyc2VyfSg/LCA/KWAsIHBhcmFtcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB3aGVyZUZ1enp5PFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+IHwgU3RyaW5nU3FsRXhwcmVzc2lvbj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIG9wZXJhdG9yPzogRnV6enlPcGVyYXRvcjtcbiAgICB9LFxuICApOiB0aGlzO1xuICB3aGVyZUZ1enp5KC4uLmFyZ3M6IGFueVtdKTogdGhpcyB7XG4gICAgY29uc3Qgb3BlcmF0b3IgPSBwYXJzZUZ1enp5T3BlcmF0b3IoYXJnc1syXT8ub3BlcmF0b3IpO1xuXG4gICAgaWYgKG9wZXJhdG9yID09PSBcIiVcIikge1xuICAgICAgaWYgKGlzU3FsRXhwcmVzc2lvbihhcmdzWzBdKSkge1xuICAgICAgICB0aGlzLmJ1aWxkZXIud2hlcmVSYXcoYCR7YXJnc1swXVtcIl9zcWxcIl19ICR7b3BlcmF0b3J9ID9gLCBbLi4uYXJnc1swXVtcIl9wYXJhbXNcIl0sIGFyZ3NbMV1dKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYnVpbGRlci53aGVyZVJhdyhgPz8gJHtvcGVyYXRvcn0gP2AsIFthcmdzWzBdLCBhcmdzWzFdXSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBpZiAoaXNTcWxFeHByZXNzaW9uKGFyZ3NbMF0pKSB7XG4gICAgICB0aGlzLmJ1aWxkZXIud2hlcmVSYXcoYD8gJHtvcGVyYXRvcn0gJHthcmdzWzBdW1wiX3NxbFwiXX1gLCBbYXJnc1sxXSwgLi4uYXJnc1swXVtcIl9wYXJhbXNcIl1dKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5idWlsZGVyLndoZXJlUmF3KGA/ICR7b3BlcmF0b3J9ID8/YCwgW2FyZ3NbMV0sIGFyZ3NbMF1dKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBvcldoZXJlRnV6enk8VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4gfCBTdHJpbmdTcWxFeHByZXNzaW9uPihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWU6IHN0cmluZyxcbiAgICBvcHRpb25zPzoge1xuICAgICAgb3BlcmF0b3I/OiBGdXp6eU9wZXJhdG9yO1xuICAgIH0sXG4gICk6IHRoaXM7XG4gIG9yV2hlcmVGdXp6eSguLi5hcmdzOiBhbnlbXSk6IHRoaXMge1xuICAgIGNvbnN0IG9wZXJhdG9yID0gcGFyc2VGdXp6eU9wZXJhdG9yKGFyZ3NbMl0/Lm9wZXJhdG9yKTtcblxuICAgIGlmIChvcGVyYXRvciA9PT0gXCIlXCIpIHtcbiAgICAgIGlmIChpc1NxbEV4cHJlc3Npb24oYXJnc1swXSkpIHtcbiAgICAgICAgdGhpcy5idWlsZGVyLm9yV2hlcmVSYXcoYCR7YXJnc1swXVtcIl9zcWxcIl19ICR7b3BlcmF0b3J9ID9gLCBbXG4gICAgICAgICAgLi4uYXJnc1swXVtcIl9wYXJhbXNcIl0sXG4gICAgICAgICAgYXJnc1sxXSxcbiAgICAgICAgXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmJ1aWxkZXIub3JXaGVyZVJhdyhgPz8gJHtvcGVyYXRvcn0gP2AsIFthcmdzWzBdLCBhcmdzWzFdXSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBpZiAoaXNTcWxFeHByZXNzaW9uKGFyZ3NbMF0pKSB7XG4gICAgICB0aGlzLmJ1aWxkZXIub3JXaGVyZVJhdyhgPyAke29wZXJhdG9yfSAke2FyZ3NbMF1bXCJfc3FsXCJdfWAsIFthcmdzWzFdLCAuLi5hcmdzWzBdW1wiX3BhcmFtc1wiXV0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmJ1aWxkZXIub3JXaGVyZVJhdyhgPyAke29wZXJhdG9yfSA/P2AsIFthcmdzWzFdLCBhcmdzWzBdXSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8g7KSR7LKpIOq3uOujuVxuICB3aGVyZUdyb3VwKGNhbGxiYWNrOiAoZzogV2hlcmVHcm91cDxUVGFibGVzPikgPT4gdm9pZCk6IHRoaXM7XG4gIHdoZXJlR3JvdXAoY2FsbGJhY2s6IChnOiBXaGVyZUdyb3VwPFRUYWJsZXM+KSA9PiB2b2lkKTogV2hlcmVHcm91cDxUVGFibGVzPiB7XG4gICAgdGhpcy5idWlsZGVyLndoZXJlKChzdWJCdWlsZGVyKSA9PiB7XG4gICAgICBjb25zdCBzdWJHcm91cCA9IG5ldyBXaGVyZUdyb3VwPFRUYWJsZXM+KHN1YkJ1aWxkZXIpO1xuICAgICAgY2FsbGJhY2soc3ViR3JvdXApO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIG9yV2hlcmVHcm91cChjYWxsYmFjazogKGc6IFdoZXJlR3JvdXA8VFRhYmxlcz4pID0+IHZvaWQpOiB0aGlzO1xuICBvcldoZXJlR3JvdXAoY2FsbGJhY2s6IChnOiBXaGVyZUdyb3VwPFRUYWJsZXM+KSA9PiB2b2lkKTogV2hlcmVHcm91cDxUVGFibGVzPiB7XG4gICAgdGhpcy5idWlsZGVyLm9yV2hlcmUoKHN1YkJ1aWxkZXIpID0+IHtcbiAgICAgIGNvbnN0IHN1Ykdyb3VwID0gbmV3IFdoZXJlR3JvdXA8VFRhYmxlcz4oc3ViQnVpbGRlcik7XG4gICAgICBjYWxsYmFjayhzdWJHcm91cCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cblxuLy8gSk9JTiDsoIgg6re466O57JeQ64qUIExlZnTsmYAgUmlnaHTsl5Ag64yA7ZWcIOyInOyEnOqwgCDtlYTsmpTtlZjsp4Ag7JWK7Jy866+A66GcLCDrqqjrk6Ag6rK97Jqw7J2YIOyImOulvCDqs4TsgrDtlbTslbztlaguXG5leHBvcnQgY2xhc3MgSm9pbkNsYXVzZUdyb3VwPFRMZWZ0IGV4dGVuZHMgb2JqZWN0LCBUUmlnaHQgZXh0ZW5kcyBvYmplY3Q+IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjYWxsYmFjazogS25leC5Kb2luQ2xhdXNlKSB7fVxuXG4gIC8vIE9OKEFORCk6IOy7rOufvCA9IOy7rOufvFxuICBvbihsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRMZWZ0PiwgcmlnaHQ6IEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0Pik6IHRoaXM7XG4gIG9uKGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0PiwgcmlnaHQ6IEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+KTogdGhpcztcbiAgLy8gT04oQU5EKTog7Lus65+8ID0g6rCSXG4gIG9uKFxuICAgIGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+LFxuICAgIHJpZ2h0OiBFeHRyYWN0Q29sdW1uVHlwZTxUTGVmdCwgQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4gJiBzdHJpbmc+LFxuICApOiB0aGlzO1xuICBvbihcbiAgICBsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4sXG4gICAgcmlnaHQ6IEV4dHJhY3RDb2x1bW5UeXBlPFRSaWdodCwgQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+ICYgc3RyaW5nPixcbiAgKTogdGhpcztcbiAgLy8gT04oQU5EKTog7Lus65+8ICjsl7DsgrDsnpApIOy7rOufvFxuICBvbihcbiAgICBsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRMZWZ0PixcbiAgICBvcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yLFxuICAgIHJpZ2h0OiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4sXG4gICk6IHRoaXM7XG4gIG9uKFxuICAgIGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0PixcbiAgICBvcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yLFxuICAgIHJpZ2h0OiBBdmFpbGFibGVDb2x1bW5zPFRMZWZ0PixcbiAgKTogdGhpcztcbiAgLy8gT04oQU5EKTog7Lus65+8ICjsl7DsgrDsnpApIOqwklxuICBvbihcbiAgICBsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRMZWZ0PixcbiAgICBvcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yLFxuICAgIHJpZ2h0OiBFeHRyYWN0Q29sdW1uVHlwZTxUTGVmdCwgQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4gJiBzdHJpbmc+LFxuICApOiB0aGlzO1xuICBvbihcbiAgICBsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4sXG4gICAgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvcixcbiAgICByaWdodDogRXh0cmFjdENvbHVtblR5cGU8VFJpZ2h0LCBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4gJiBzdHJpbmc+LFxuICApOiB0aGlzO1xuICAvLyBPTihBTkQpOiDsvZzrsLFcbiAgb24oY2FsbGJhY2s6IChuZXN0ZWQ6IEpvaW5DbGF1c2VHcm91cDxUTGVmdCwgVFJpZ2h0PikgPT4gdm9pZCk6IHRoaXM7XG4gIG9uKGNhbGxiYWNrOiAobmVzdGVkOiBKb2luQ2xhdXNlR3JvdXA8VFJpZ2h0LCBUTGVmdD4pID0+IHZvaWQpOiB0aGlzO1xuICAvLyBPTihBTkQpIOq1rO2YhFxuICBvbiguLi5hcmdzOiBhbnlbXSk6IHRoaXMge1xuICAgIC8vIFNBRkVUWTog7L+866asIOu5jOuNlOydmCDsoJzrhKTrpq0g6rOE7JW96rO8IOyEoO2WiSDqsoDspp3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgdGhpcy5jYWxsYmFjay5vbiguLi4oYXJncyBhcyBbc3RyaW5nLCBzdHJpbmddKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBPTihPUik6IOy7rOufvCA9IOy7rOufvFxuICBvck9uKGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+LCByaWdodDogQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+KTogdGhpcztcbiAgb3JPbihsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4sIHJpZ2h0OiBBdmFpbGFibGVDb2x1bW5zPFRMZWZ0Pik6IHRoaXM7XG4gIC8vIE9OKE9SKTog7Lus65+8ID0g6rCSXG4gIG9yT24oXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sXG4gICAgcmlnaHQ6IEV4dHJhY3RDb2x1bW5UeXBlPFRMZWZ0LCBBdmFpbGFibGVDb2x1bW5zPFRMZWZ0PiAmIHN0cmluZz4sXG4gICk6IHRoaXM7XG4gIG9yT24oXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+LFxuICAgIHJpZ2h0OiBFeHRyYWN0Q29sdW1uVHlwZTxUUmlnaHQsIEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0PiAmIHN0cmluZz4sXG4gICk6IHRoaXM7XG4gIC8vIE9OKE9SKTog7Lus65+8ICjsl7DsgrDsnpApIOy7rOufvFxuICBvck9uKFxuICAgIGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+LFxuICAgIG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IsXG4gICAgcmlnaHQ6IEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0PixcbiAgKTogdGhpcztcbiAgb3JPbihcbiAgICBsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4sXG4gICAgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvcixcbiAgICByaWdodDogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sXG4gICk6IHRoaXM7XG4gIC8vIE9OKE9SKTog7Lus65+8ICjsl7DsgrDsnpApIOqwklxuICBvck9uKFxuICAgIGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+LFxuICAgIG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IsXG4gICAgcmlnaHQ6IEV4dHJhY3RDb2x1bW5UeXBlPFRMZWZ0LCBBdmFpbGFibGVDb2x1bW5zPFRMZWZ0PiAmIHN0cmluZz4sXG4gICk6IHRoaXM7XG4gIG9yT24oXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+LFxuICAgIG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IsXG4gICAgcmlnaHQ6IEV4dHJhY3RDb2x1bW5UeXBlPFRSaWdodCwgQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+ICYgc3RyaW5nPixcbiAgKTogdGhpcztcbiAgLy8gT04oT1IpOiDsvZzrsLFcbiAgb3JPbihjYWxsYmFjazogKG5lc3RlZDogSm9pbkNsYXVzZUdyb3VwPFRMZWZ0LCBUUmlnaHQ+KSA9PiB2b2lkKTogdGhpcztcbiAgb3JPbihjYWxsYmFjazogKG5lc3RlZDogSm9pbkNsYXVzZUdyb3VwPFRSaWdodCwgVExlZnQ+KSA9PiB2b2lkKTogdGhpcztcbiAgLy8gT04oT1IpIOq1rO2YhFxuICBvck9uKC4uLmFyZ3M6IGFueVtdKTogdGhpcyB7XG4gICAgLy8gU0FGRVRZOiDsv7zrpqwg67mM642U7J2YIOygnOuEpOumrSDqs4Tslb3qs7wg7ISg7ZaJIOqygOymneydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICB0aGlzLmNhbGxiYWNrLm9yT24oLi4uKGFyZ3MgYXMgW3N0cmluZywgc3RyaW5nXSkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gT04gVkFMKEFORCk6IOy7rOufvCA9IOqwkiAo6rCS7J2EIOy7rOufvCDssLjsobDqsIAg7JWE64uMIO2MjOudvOuvuO2EsOuhnCDrsJTsnbjrlKkpXG4gIG9uVmFsKGNvbHVtbjogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sIHZhbHVlOiBhbnkpOiB0aGlzO1xuICBvblZhbChjb2x1bW46IEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0PiwgdmFsdWU6IGFueSk6IHRoaXM7XG4gIG9uVmFsKGNvbHVtbjogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sIG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IsIHZhbHVlOiBhbnkpOiB0aGlzO1xuICBvblZhbChjb2x1bW46IEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0Piwgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvciwgdmFsdWU6IGFueSk6IHRoaXM7XG4gIG9uVmFsKC4uLmFyZ3M6IGFueVtdKTogdGhpcyB7XG4gICAgLy8gU0FGRVRZOiDsv7zrpqwg67mM642U7J2YIOygnOuEpOumrSDqs4Tslb3qs7wg7ISg7ZaJIOqygOymneydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAodGhpcy5jYWxsYmFjayBhcyBhbnkpLm9uVmFsKC4uLmFyZ3MpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gQU5EIE9OIFZBTDogb25WYWzsnZgg66qF7Iuc7KCBIGFsaWFzIChLbmV4IO2YuO2ZmClcbiAgYW5kT25WYWwoY29sdW1uOiBBdmFpbGFibGVDb2x1bW5zPFRMZWZ0PiwgdmFsdWU6IGFueSk6IHRoaXM7XG4gIGFuZE9uVmFsKGNvbHVtbjogQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+LCB2YWx1ZTogYW55KTogdGhpcztcbiAgYW5kT25WYWwoY29sdW1uOiBBdmFpbGFibGVDb2x1bW5zPFRMZWZ0Piwgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvciwgdmFsdWU6IGFueSk6IHRoaXM7XG4gIGFuZE9uVmFsKGNvbHVtbjogQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+LCBvcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yLCB2YWx1ZTogYW55KTogdGhpcztcbiAgYW5kT25WYWwoLi4uYXJnczogYW55W10pOiB0aGlzIHtcbiAgICAvLyBTQUZFVFk6IOy/vOumrCDruYzrjZTsnZgg7KCc64Sk66atIOqzhOyVveqzvCDshKDtlokg6rKA7Kad7J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgICh0aGlzLmNhbGxiYWNrIGFzIGFueSkuYW5kT25WYWwoLi4uYXJncyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBPUiBPTiBWQUw6IE9SIOyhsOqxtOycvOuhnCDqsJIg67CU7J2465SpXG4gIG9yT25WYWwoY29sdW1uOiBBdmFpbGFibGVDb2x1bW5zPFRMZWZ0PiwgdmFsdWU6IGFueSk6IHRoaXM7XG4gIG9yT25WYWwoY29sdW1uOiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4sIHZhbHVlOiBhbnkpOiB0aGlzO1xuICBvck9uVmFsKGNvbHVtbjogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sIG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IsIHZhbHVlOiBhbnkpOiB0aGlzO1xuICBvck9uVmFsKGNvbHVtbjogQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+LCBvcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yLCB2YWx1ZTogYW55KTogdGhpcztcbiAgb3JPblZhbCguLi5hcmdzOiBhbnlbXSk6IHRoaXMge1xuICAgIC8vIFNBRkVUWTog7L+866asIOu5jOuNlOydmCDsoJzrhKTrpq0g6rOE7JW96rO8IOyEoO2WiSDqsoDspp3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgKHRoaXMuY2FsbGJhY2sgYXMgYW55KS5vck9uVmFsKC4uLmFyZ3MpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG5cbi8qXG4gIFRSZXNvbHZlZDog7L+866asIOyLpO2WiSDtm4Qg67CY7ZmY65CgIOqysOqzvCDtg4DsnoVcbiAgVFJldHVybmluZzogUkVUVVJOSU5HIOygiOyXkCDsgqzsmqnrkKAg7YOA7J6FXG4qL1xuZXhwb3J0IGNsYXNzIFJlc29sdmVkUHVyaTxUUmVzb2x2ZWQsIFRSZXR1cm5pbmc+IGltcGxlbWVudHMgUHJvbWlzZTxUUmVzb2x2ZWQ+IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGtuZXhRdWVyeTogS25leC5RdWVyeUJ1aWxkZXIsXG4gICAgcHJpdmF0ZSBrbmV4OiBLbmV4LFxuICAgIHByaXZhdGUgdGFibGVTcGVjOiBUYWJsZVNwZWMgfCBudWxsID0gbnVsbCxcbiAgICBwcml2YXRlIHJlc29sdmVSZXN1bHQ/OiAoKSA9PiBQcm9taXNlPFRSZXNvbHZlZD4sXG4gICkge31cblxuICBbU3ltYm9sLnRvU3RyaW5nVGFnXTogc3RyaW5nID0gXCJQcm9taXNlXCI7XG5cbiAgdG9RdWVyeSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmtuZXhRdWVyeS50b1F1ZXJ5KCk7XG4gIH1cblxuICBkZWJ1ZygpOiB0aGlzIHtcbiAgICBjb25zb2xlLmxvZyhgJHtjaGFsay5jeWFuKFwiW1B1cmkgRGVidWddXCIpfSAke2NoYWxrLnllbGxvdyh0aGlzLnRvUXVlcnkoKSl9YCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB0aGVuPFRSZXN1bHQxID0gVFJlc29sdmVkLCBUUmVzdWx0MiA9IG5ldmVyPihcbiAgICBvbmZ1bGZpbGxlZD86ICgodmFsdWU6IFRSZXNvbHZlZCkgPT4gVFJlc3VsdDEgfCBQcm9taXNlTGlrZTxUUmVzdWx0MT4pIHwgbnVsbCxcbiAgICBvbnJlamVjdGVkPzogKChyZWFzb246IGFueSkgPT4gVFJlc3VsdDIgfCBQcm9taXNlTGlrZTxUUmVzdWx0Mj4pIHwgbnVsbCxcbiAgKTogUHJvbWlzZTxUUmVzdWx0MSB8IFRSZXN1bHQyPiB7XG4gICAgTmFpdGUudChcInB1cmk6ZXhlY3V0ZWQtcXVlcnlcIiwgdGhpcy50b1F1ZXJ5KCkpO1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMucmVzb2x2ZVJlc3VsdCA/IHRoaXMucmVzb2x2ZVJlc3VsdCgpIDogdGhpcy5rbmV4UXVlcnk7XG4gICAgLy8gU0FGRVRZOiDsv7zrpqwg67mM642U7J2YIOygnOuEpOumrSDqs4Tslb3qs7wg7ISg7ZaJIOqygOymneydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICByZXR1cm4gcmVzdWx0LnRoZW4ob25mdWxmaWxsZWQgYXMgYW55LCBvbnJlamVjdGVkKTtcbiAgfVxuXG4gIGNhdGNoPFRSZXN1bHQyID0gbmV2ZXI+KFxuICAgIG9ucmVqZWN0ZWQ/OiAoKHJlYXNvbjogYW55KSA9PiBUUmVzdWx0MiB8IFByb21pc2VMaWtlPFRSZXN1bHQyPikgfCBudWxsLFxuICApOiBQcm9taXNlPFRSZXNvbHZlZCB8IFRSZXN1bHQyPiB7XG4gICAgcmV0dXJuIHRoaXMudGhlbigpLmNhdGNoKG9ucmVqZWN0ZWQpO1xuICB9XG5cbiAgZmluYWxseShvbmZpbmFsbHk/OiAoKCkgPT4gdm9pZCkgfCBudWxsKTogUHJvbWlzZTxUUmVzb2x2ZWQ+IHtcbiAgICByZXR1cm4gdGhpcy50aGVuKCkuZmluYWxseShvbmZpbmFsbHkpO1xuICB9XG5cbiAgLy8gT04gQ09ORkxJQ1QgLSDsu6zrn7wg6riw67CYXG4gIG9uQ29uZmxpY3Q8VFRhYmxlcyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIFRSZXR1cm5pbmc+PihcbiAgICBjb2x1bW5zOiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgICBhY3Rpb24/OiBPbkNvbmZsaWN0QWN0aW9uPFRUYWJsZXM+LFxuICApOiB0aGlzIHtcbiAgICBjb25zdCB0YXJnZXQgPSBBcnJheS5pc0FycmF5KGNvbHVtbnMpID8gY29sdW1ucyA6IFtjb2x1bW5zXTtcblxuICAgIGlmICghYWN0aW9uIHx8IGFjdGlvbiA9PT0gXCJub3RoaW5nXCIpIHtcbiAgICAgIC8vIERPIE5PVEhJTkdcbiAgICAgIHRoaXMua25leFF1ZXJ5Lm9uQ29uZmxpY3QodGFyZ2V0KS5pZ25vcmUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRE8gVVBEQVRFXG4gICAgICBjb25zdCB7IHVwZGF0ZSB9ID0gYWN0aW9uO1xuXG4gICAgICAvLyBhY3Rpb24udXBkYXRlIOuwsOyXtCDtmJXtg5wgOiBbXCJuYW1lXCIsIFwiZW1haWxcIl1cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHVwZGF0ZSkpIHtcbiAgICAgICAgdGhpcy5rbmV4UXVlcnkub25Db25mbGljdCh0YXJnZXQpLm1lcmdlKHVwZGF0ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBhY3Rpb24udXBkYXRlIOqwneyytCDtmJXtg5w6IHsgbmFtZTogXCJKb2huXCIsIGNvdW50OiByYXcoLi4uKSB9XG4gICAgICAgIGNvbnN0IG1lcmdlT2JqID0ge307XG5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModXBkYXRlKSkge1xuICAgICAgICAgIGNvbnN0IG1lcmdlZFZhbHVlID0gaXNTcWxFeHByZXNzaW9uKHZhbHVlKVxuICAgICAgICAgICAgPyB0aGlzLmtuZXgucmF3KHZhbHVlW1wiX3NxbFwiXSlcbiAgICAgICAgICAgIDogc2VyaWFsaXplSnNvbkNvbHVtblZhbHVlKHRoaXMudGFibGVTcGVjLCBrZXksIHZhbHVlKTtcbiAgICAgICAgICBPYmplY3QuYXNzaWduKG1lcmdlT2JqLCB7IFtrZXldOiBtZXJnZWRWYWx1ZSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMua25leFF1ZXJ5Lm9uQ29uZmxpY3QodGFyZ2V0KS5tZXJnZShtZXJnZU9iaik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBSRVRVUk5JTkc6IFwiKlwiIC0g7KCE7LK0IOy7rOufvFxuICByZXR1cm5pbmcoY29sdW1uOiBcIipcIik6IFJlc29sdmVkUHVyaTxUUmV0dXJuaW5nW10sIG5ldmVyPjtcbiAgLy8gUkVUVVJOSU5HOiDri6jsnbwg7Lus65+8XG4gIHJldHVybmluZzxUQ29sdW1uIGV4dGVuZHMgQ29sdW1uS2V5czxUUmV0dXJuaW5nPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICApOiBSZXNvbHZlZFB1cmk8UGljazxUUmV0dXJuaW5nLCBUQ29sdW1uPltdLCBuZXZlcj47XG4gIC8vIFJFVFVSTklORzog67O17IiYIOy7rOufvCAo67Cw7Je0KVxuICByZXR1cm5pbmc8VENvbHVtbiBleHRlbmRzIENvbHVtbktleXM8VFJldHVybmluZz4+KFxuICAgIGNvbHVtbnM6IFRDb2x1bW5bXSxcbiAgKTogUmVzb2x2ZWRQdXJpPFBpY2s8VFJldHVybmluZywgVENvbHVtbj5bXSwgbmV2ZXI+O1xuICAvLyBSRVRVUk5JTkcg6rWs7ZiEXG4gIHJldHVybmluZyhjb2x1bW5PckNvbHVtbnM6IHN0cmluZyB8IHN0cmluZ1tdKTogUmVzb2x2ZWRQdXJpPGFueVtdLCBuZXZlcj4ge1xuICAgIHRoaXMua25leFF1ZXJ5LnJldHVybmluZyhjb2x1bW5PckNvbHVtbnMpO1xuICAgIHJldHVybiBuZXcgUmVzb2x2ZWRQdXJpKHRoaXMua25leFF1ZXJ5LCB0aGlzLmtuZXgsIHRoaXMudGFibGVTcGVjKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBdUdBLFNBQWdCLG1CQUFtQixVQUFrQztDQUNuRSxNQUFNLGFBQWEsVUFBVSxLQUFLLEtBQUs7Q0FDdkMsTUFBTSxnQkFBZ0IsZ0JBQWdCLE1BQU0sY0FBYyxjQUFjLFVBQVU7Q0FFbEYsSUFBSSxDQUFDLGVBQ0gsTUFBTSxJQUFJLE1BQU0sMkJBQTJCLFlBQVksSUFBSTtDQUc3RCxPQUFPO0FBQ1Q7QUFFQSxTQUFTLDJCQUFrQyxPQUFzQjtDQUMvRCxNQUFNLGFBQWEsS0FBSyxVQUFVLEtBQUs7Q0FFdkMsSUFBSSxlQUFlLFFBQ2pCLE1BQU0sSUFBSSxVQUNSLDRGQUNGO0NBR0YsT0FBTztBQUNUO0FBRUEsU0FBUyx5QkFDUCxXQUNBLFFBQ0EsT0FDZ0I7Q0FDaEIsSUFBSSxDQUFDLFdBQVcsWUFBWSxTQUFTLE1BQU0sS0FBSyxVQUFVLFVBQWEsVUFBVSxNQUMvRSxPQUFPO0NBR1QsT0FBTyxLQUFLLFVBQVUsS0FBSztBQUM3QjtBQUVBLFNBQVMsMEJBQTBCLFlBQWtDLE9BQTZCO0NBQ2hHLElBQUksY0FBYyxTQUFTLGNBQWMsUUFDdkMsTUFBTSxJQUFJLE1BQU0sNEJBQTRCLFdBQVc7Q0FHekQsT0FBTztBQUNUO0FBRUEsU0FBUyxzQkFBc0IsT0FBd0Q7Q0FDckYsSUFBSSxVQUFVLFFBQ1o7Q0FHRixJQUFJLFVBQVUsV0FBVyxVQUFVLFFBQ2pDLE1BQU0sSUFBSSxNQUFNLHdCQUF3QixPQUFPO0NBR2pELE9BQU87QUFDVDtBQUVBLFNBQVMsa0JBQWtCLE9BQWtDO0NBQzNELElBQUksQ0FBQyxPQUNILE9BQU87Q0FHVCxPQUFPLFVBQVUsTUFBTSxZQUFZO0FBQ3JDO0FBRUEsU0FBUyxpQkFDUCxPQUNxRDtDQUNyRCxPQUFPLE1BQU0sUUFBUSxLQUFLO0FBQzVCO0FBRUEsU0FBUyxnQkFBdUIsT0FBaUQ7Q0FDL0UsT0FBTyxjQUFj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
|