sonamu 0.10.4 → 0.10.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin/cli.js +206 -187
- package/dist/cone/cone-generator.js +3 -9
- package/dist/database/knex.d.ts.map +1 -1
- package/dist/database/knex.js +2 -2
- package/dist/database/puri.d.ts +17 -0
- package/dist/database/puri.d.ts.map +1 -1
- package/dist/database/puri.js +102 -3
- package/dist/migration/code-generation.js +6 -6
- package/dist/migration/migrator.d.ts.map +1 -1
- package/dist/migration/migrator.js +51 -6
- package/dist/ui-web/assets/{index-CDd6xT-F.js → index-D0MHYbxl.js} +2 -2
- package/dist/ui-web/assets/index-Dx_JX4aQ.css +1 -0
- package/dist/ui-web/index.html +2 -2
- package/package.json +2 -2
- package/src/bin/cli.ts +283 -282
- package/src/cone/cone-generator.ts +2 -18
- package/src/database/__tests__/puri.test.ts +183 -0
- package/src/database/knex.ts +4 -1
- package/src/database/puri.ts +229 -2
- package/src/database/puri.types.test-d.ts +56 -0
- package/src/migration/code-generation.ts +5 -5
- package/src/migration/migrator.ts +81 -7
- package/src/skills/AGENTS.md +76 -50
- package/src/skills/sonamu/SKILL.md +46 -227
- package/src/skills/{sonamu/ai-agents.md → sonamu-ai-agents/SKILL.md} +3 -3
- package/src/skills/{sonamu/api.md → sonamu-api/SKILL.md} +3 -2
- package/src/skills/{sonamu/auth.md → sonamu-auth/SKILL.md} +9 -4
- package/src/skills/{sonamu/auth-plugins.md → sonamu-auth/references/plugins.md} +2 -7
- package/src/skills/sonamu-auth/references/user-id-migration-followups.md +192 -0
- package/src/skills/{sonamu/auth-migration.md → sonamu-auth/references/user-id-migration.md} +1 -195
- package/src/skills/sonamu-config/SKILL.md +203 -0
- package/src/skills/{sonamu → sonamu-config/references}/database.md +3 -8
- package/src/skills/sonamu-config/references/environments.md +178 -0
- package/src/skills/sonamu-config/references/server-options.md +400 -0
- package/src/skills/sonamu-entity/SKILL.md +180 -0
- package/src/skills/{sonamu/entity-validation-checklist.md → sonamu-entity/references/creation-workflow.md} +117 -8
- package/src/skills/sonamu-entity/references/design-guides.md +243 -0
- package/src/skills/sonamu-entity/references/field-types.md +170 -0
- package/src/skills/sonamu-entity/references/relations-detail.md +245 -0
- package/src/skills/{sonamu/entity-relations.md → sonamu-entity/references/relations.md} +1 -258
- package/src/skills/{sonamu → sonamu-entity/references}/subset.md +1 -11
- package/src/skills/sonamu-fixture/SKILL.md +180 -0
- package/src/skills/{sonamu/fixture-cli.md → sonamu-fixture/references/cli-usage.md} +5 -176
- package/src/skills/{sonamu → sonamu-fixture/references}/cone.md +4 -14
- package/src/skills/sonamu-frontend/SKILL.md +142 -0
- package/src/skills/sonamu-frontend/references/components.md +323 -0
- package/src/skills/sonamu-frontend/references/examples.md +64 -0
- package/src/skills/sonamu-frontend/references/hooks.md +273 -0
- package/src/skills/sonamu-frontend/references/runtime.md +165 -0
- package/src/skills/{sonamu → sonamu-frontend/references}/scaffolding.md +3 -8
- package/src/skills/{sonamu/i18n.md → sonamu-i18n/SKILL.md} +2 -2
- package/src/skills/{sonamu/migration.md → sonamu-migration/SKILL.md} +1 -1
- package/src/skills/{sonamu/naite.md → sonamu-naite/SKILL.md} +5 -5
- package/src/skills/sonamu-query/SKILL.md +48 -0
- package/src/skills/sonamu-query/references/model-patterns.md +390 -0
- package/src/skills/{sonamu → sonamu-query/references}/model.md +1 -401
- package/src/skills/{sonamu → sonamu-query/references}/puri.md +31 -243
- package/src/skills/sonamu-query/references/search.md +238 -0
- package/src/skills/{sonamu → sonamu-query/references}/upsert.md +1 -6
- package/src/skills/{sonamu/tasks.md → sonamu-tasks/SKILL.md} +1 -1
- package/src/skills/sonamu-testing/SKILL.md +251 -0
- package/src/skills/{sonamu/testing-devrunner.md → sonamu-testing/references/devrunner.md} +4 -9
- package/src/skills/sonamu-testing/references/helpers.md +185 -0
- package/src/skills/sonamu-testing/references/patterns.md +263 -0
- package/src/skills/sonamu-testing/references/pitfalls.md +588 -0
- package/src/skills/sonamu-testing/references/quick-start.md +285 -0
- package/src/skills/sonamu-testing/references/type-safety.md +172 -0
- package/src/skills/sonamu-testing/references/writing-plan.md +375 -0
- package/src/skills/{sonamu/vector.md → sonamu-vector/SKILL.md} +1 -1
- package/dist/ui-web/assets/index-Dx4ap5i4.css +0 -1
- package/src/skills/commands/sonamu-skills.md +0 -20
- package/src/skills/project/README.md +0 -19
- package/src/skills/project/architecture.md +0 -373
- package/src/skills/sonamu/cdd.md +0 -129
- package/src/skills/sonamu/config.md +0 -772
- package/src/skills/sonamu/create-sonamu.md +0 -208
- package/src/skills/sonamu/entity-basic.md +0 -678
- package/src/skills/sonamu/framework-change.md +0 -96
- package/src/skills/sonamu/frontend.md +0 -915
- package/src/skills/sonamu/project-init.md +0 -477
- package/src/skills/sonamu/skill-contribution.md +0 -247
- package/src/skills/sonamu/testing.md +0 -2163
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrator.d.ts","sourceRoot":"","sources":["../../src/migration/migrator.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,MAAM,CAAC;AAKjC,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAOrD,OAAO,EAAE,KAAK,gBAAgB,EAAqB,MAAM,gBAAgB,CAAC;AAM1E,OAAO,EAAuC,KAAK,eAAe,EAAE,MAAM,SAAS,CAAC;AAEpF,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"migrator.d.ts","sourceRoot":"","sources":["../../src/migration/migrator.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,MAAM,CAAC;AAKjC,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAOrD,OAAO,EAAE,KAAK,gBAAgB,EAAqB,MAAM,gBAAgB,CAAC;AAM1E,OAAO,EAAuC,KAAK,eAAe,EAAE,MAAM,SAAS,CAAC;AAEpF,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB,EAAE,CAAC;AA2BJ,qBAAa,QAAQ;IACnB,OAAO,CAAC,4BAA4B;IAapC,OAAO,CAAC,sBAAsB;YAahB,yBAAyB;YAoBzB,iBAAiB;IAqB/B;;;;;;;;OAQG;IACG,SAAS,IAAI,OAAO,CAAC,eAAe,CAAC;IA4J3C;;;;;;;;;OASG;IACG,SAAS,CACb,MAAM,EAAE,OAAO,GAAG,UAAU,EAC5B,OAAO,EAAE,CAAC,MAAM,cAAc,CAAC,EAAE,GAChC,OAAO,CAAC,eAAe,CAAC;IAyD3B;;;;;;OAMG;IACH,iBAAiB,CAAC,KAAK,EAAE,eAAe,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE;;;;IAWtE;;;;;;;OAOG;IACG,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAuBpD,OAAO,CAAC,UAAU;IAalB;;;;;;OAMG;IACG,qBAAqB,IAAI,OAAO,CAAC,MAAM,CAAC;IAuBxC,iBAAiB,CAAC,SAAS,EAAE,IAAI,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAqErE;;;;;;OAMG;IACG,aAAa,IAAI,OAAO,CAAC,eAAe,CAAC;CA6EhD"}
|
|
@@ -18,7 +18,23 @@ import path from "path";
|
|
|
18
18
|
import { mkdir, readdir, unlink, writeFile } from "fs/promises";
|
|
19
19
|
import chalk from "chalk";
|
|
20
20
|
//#region src/migration/migrator.ts
|
|
21
|
-
|
|
21
|
+
/**
|
|
22
|
+
* 주어진 Promise가 ms 안에 완료되지 않으면 onTimeout 에러로 reject한다.
|
|
23
|
+
* 원본 Promise 자체는 계속 진행되므로, 호출측에서 커넥션 정리(destroy)를 책임진다.
|
|
24
|
+
*/
|
|
25
|
+
function withTimeout(promise, ms, onTimeout) {
|
|
26
|
+
return new Promise((resolve, reject) => {
|
|
27
|
+
const timer = setTimeout(() => reject(onTimeout()), ms);
|
|
28
|
+
promise.then((value) => {
|
|
29
|
+
clearTimeout(timer);
|
|
30
|
+
resolve(value);
|
|
31
|
+
}, (error) => {
|
|
32
|
+
clearTimeout(timer);
|
|
33
|
+
reject(error);
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
var MIGRATION_CONN_TIMEOUT_MS, Migrator;
|
|
22
38
|
var init_migrator = __esmMin((() => {
|
|
23
39
|
init_sonamu();
|
|
24
40
|
init_db();
|
|
@@ -33,6 +49,7 @@ var init_migrator = __esmMin((() => {
|
|
|
33
49
|
init_code_generation();
|
|
34
50
|
init_migration_set();
|
|
35
51
|
init_postgresql_schema_reader();
|
|
52
|
+
MIGRATION_CONN_TIMEOUT_MS = 5e3;
|
|
36
53
|
Migrator = class {
|
|
37
54
|
isMissingMigrationTableError(error) {
|
|
38
55
|
if (typeof error !== "object" || error === null) return false;
|
|
@@ -83,8 +100,37 @@ var init_migrator = __esmMin((() => {
|
|
|
83
100
|
let migrationStatusError;
|
|
84
101
|
const statuses = await Promise.all(connKeys.map(async (connKey) => {
|
|
85
102
|
const knexOptions = Sonamu.dbConfig[connKey];
|
|
86
|
-
const
|
|
103
|
+
const connection = knexOptions.connection;
|
|
104
|
+
const tConn = createKnexInstance({
|
|
105
|
+
...knexOptions,
|
|
106
|
+
connection: {
|
|
107
|
+
...connection,
|
|
108
|
+
connectionTimeoutMillis: MIGRATION_CONN_TIMEOUT_MS
|
|
109
|
+
},
|
|
110
|
+
pool: {
|
|
111
|
+
...knexOptions.pool,
|
|
112
|
+
min: 0,
|
|
113
|
+
acquireTimeoutMillis: MIGRATION_CONN_TIMEOUT_MS,
|
|
114
|
+
createTimeoutMillis: MIGRATION_CONN_TIMEOUT_MS,
|
|
115
|
+
propagateCreateError: true
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
const connString = `pg://${connection.user ?? ""}@${connection.host}:${connection.port}/${connection.database}`;
|
|
87
119
|
try {
|
|
120
|
+
try {
|
|
121
|
+
await withTimeout(tConn.raw("select 1"), MIGRATION_CONN_TIMEOUT_MS, () => /* @__PURE__ */ new Error(`DB 연결 시간 초과 (${MIGRATION_CONN_TIMEOUT_MS}ms) — ${connection.host}:${connection.port}/${connection.database}`));
|
|
122
|
+
} catch (err) {
|
|
123
|
+
console.warn(chalk.yellow(`${connKey}의 마이그레이션 상태를 가져오는 데에 실패하였습니다. 데이터베이스에 연결할 수 없습니다.\n시도한 연결 설정:\n${JSON.stringify(knexOptions.connection, null, 2)}\n발생한 에러:\n${err}\n`));
|
|
124
|
+
migrationStatusError = err instanceof Error ? err.message : String(err);
|
|
125
|
+
return {
|
|
126
|
+
name: connKey,
|
|
127
|
+
connKey,
|
|
128
|
+
connString,
|
|
129
|
+
currentVersion: "error",
|
|
130
|
+
status: "error",
|
|
131
|
+
pending: []
|
|
132
|
+
};
|
|
133
|
+
}
|
|
88
134
|
const status = await (async () => {
|
|
89
135
|
try {
|
|
90
136
|
return await tConn.migrate.status();
|
|
@@ -115,17 +161,16 @@ var init_migrator = __esmMin((() => {
|
|
|
115
161
|
}
|
|
116
162
|
})();
|
|
117
163
|
Naite.t("migrator:getStatus:status", status);
|
|
118
|
-
const connection = knexOptions.connection;
|
|
119
164
|
return {
|
|
120
165
|
name: connKey,
|
|
121
166
|
connKey,
|
|
122
|
-
connString
|
|
167
|
+
connString,
|
|
123
168
|
currentVersion,
|
|
124
169
|
status,
|
|
125
170
|
pending
|
|
126
171
|
};
|
|
127
172
|
} finally {
|
|
128
|
-
await tConn.destroy();
|
|
173
|
+
await withTimeout(tConn.destroy(), MIGRATION_CONN_TIMEOUT_MS, () => /* @__PURE__ */ new Error("connection destroy timeout")).catch(() => {});
|
|
129
174
|
}
|
|
130
175
|
}));
|
|
131
176
|
Naite.t("migrator:getStatus:conns", statuses);
|
|
@@ -361,4 +406,4 @@ var init_migrator = __esmMin((() => {
|
|
|
361
406
|
init_migrator();
|
|
362
407
|
export { Migrator, init_migrator };
|
|
363
408
|
|
|
364
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlncmF0b3IuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL21pZ3JhdGlvbi9taWdyYXRvci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIjtcbmltcG9ydCB7IG1rZGlyLCByZWFkZGlyLCB1bmxpbmssIHdyaXRlRmlsZSB9IGZyb20gXCJmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcblxuaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xuaW1wb3J0IHsgdHlwZSBLbmV4IH0gZnJvbSBcImtuZXhcIjtcbmltcG9ydCB7IGdyb3VwLCBzdW0sIHVuaXF1ZSB9IGZyb20gXCJyYWRhc2hpXCI7XG5cbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGkvc29uYW11XCI7XG5pbXBvcnQgeyBEQiB9IGZyb20gXCIuLi9kYXRhYmFzZS9kYlwiO1xuaW1wb3J0IHsgdHlwZSBTb25hbXVEQkNvbmZpZyB9IGZyb20gXCIuLi9kYXRhYmFzZS9kYlwiO1xuaW1wb3J0IHsgY3JlYXRlS25leEluc3RhbmNlIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2tuZXhcIjtcbmltcG9ydCB7IFNEIH0gZnJvbSBcIi4uL2RpY3Qvc2RcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyBnZXRTb25hbXVFbnZpcm9ubWVudCB9IGZyb20gXCIuLi9lbnZcIjtcbmltcG9ydCB7IFNlcnZpY2VVbmF2YWlsYWJsZUV4Y2VwdGlvbiB9IGZyb20gXCIuLi9leGNlcHRpb25zL3NvLWV4Y2VwdGlvbnNcIjtcbmltcG9ydCB7IE5haXRlIH0gZnJvbSBcIi4uL25haXRlL25haXRlXCI7XG5pbXBvcnQgeyB0eXBlIEdlbk1pZ3JhdGlvbkNvZGUsIHR5cGUgTWlncmF0aW9uU2V0IH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBpc0xvY2FsLCBpc1Rlc3QgfSBmcm9tIFwiLi4vdXRpbHMvY29udHJvbGxlclwiO1xuaW1wb3J0IHsgZXhpc3RzIH0gZnJvbSBcIi4uL3V0aWxzL2ZzLXV0aWxzXCI7XG5pbXBvcnQgeyBnZW5lcmF0ZUFsdGVyQ29kZSwgZ2VuZXJhdGVDcmVhdGVDb2RlIH0gZnJvbSBcIi4vY29kZS1nZW5lcmF0aW9uXCI7XG5pbXBvcnQgeyBnZXRNaWdyYXRpb25TZXRGcm9tRW50aXR5IH0gZnJvbSBcIi4vbWlncmF0aW9uLXNldFwiO1xuaW1wb3J0IHsgUG9zdGdyZVNRTFNjaGVtYVJlYWRlciB9IGZyb20gXCIuL3Bvc3RncmVzcWwtc2NoZW1hLXJlYWRlclwiO1xuaW1wb3J0IHsgdHlwZSBDb25uU3RyaW5nLCB0eXBlIE1pZ3JhdGlvbkNvZGUsIHR5cGUgTWlncmF0aW9uU3RhdHVzIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuZXhwb3J0IHR5cGUgTWlncmF0aW9uUmVzdWx0ID0ge1xuICBjb25uS2V5OiBzdHJpbmc7XG4gIGJhdGNoTm86IG51bWJlcjtcbiAgYXBwbGllZDogc3RyaW5nW107XG59W107XG5cbmV4cG9ydCBjbGFzcyBNaWdyYXRvciB7XG4gIHByaXZhdGUgaXNNaXNzaW5nTWlncmF0aW9uVGFibGVFcnJvcihlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgIGlmICh0eXBlb2YgZXJyb3IgIT09IFwib2JqZWN0XCIgfHwgZXJyb3IgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBtYXliZVBvc3RncmVzRXJyb3IgPSBlcnJvciBhcyB7IGNvZGU/OiB1bmtub3duOyBtZXNzYWdlPzogdW5rbm93biB9O1xuICAgIHJldHVybiAoXG4gICAgICBtYXliZVBvc3RncmVzRXJyb3IuY29kZSA9PT0gXCI0MlAwMVwiICYmXG4gICAgICB0eXBlb2YgbWF5YmVQb3N0Z3Jlc0Vycm9yLm1lc3NhZ2UgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgIG1heWJlUG9zdGdyZXNFcnJvci5tZXNzYWdlLmluY2x1ZGVzKFwia25leF9taWdyYXRpb25zXCIpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TWlncmF0aW9uVGFyZ2V0S2V5cygpOiAoa2V5b2YgU29uYW11REJDb25maWcpW10ge1xuICAgIGNvbnN0IGNvbm5LZXlzID0gT2JqZWN0LmtleXMoU29uYW11LmRiQ29uZmlnKS5maWx0ZXIoXG4gICAgICAoa2V5KSA9PiAha2V5LmVuZHNXaXRoKFwiX3JlYWRvbmx5XCIpLFxuICAgICkgYXMgKGtleW9mIFNvbmFtdURCQ29uZmlnKVtdO1xuXG4gICAgaWYgKGlzTG9jYWwoKSkge1xuICAgICAgcmV0dXJuIGNvbm5LZXlzO1xuICAgIH1cblxuICAgIGNvbnN0IGVudmlyb25tZW50ID0gZ2V0U29uYW11RW52aXJvbm1lbnQoKTtcbiAgICByZXR1cm4gY29ubktleXMuZmlsdGVyKChrZXkpID0+IGtleSA9PT0gZW52aXJvbm1lbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBydW5NaWdyYXRpb25zU2VxdWVudGlhbGx5KFxuICAgIGNvbm5zOiB7IGNvbm5LZXk6IGtleW9mIFNvbmFtdURCQ29uZmlnOyBrbmV4OiBLbmV4IH1bXSxcbiAgICBhY3Rpb246IFwiYXBwbHlcIiB8IFwicm9sbGJhY2tcIixcbiAgKTogUHJvbWlzZTxNaWdyYXRpb25SZXN1bHQ+IHtcbiAgICBjb25zdCByZXN1bHRzOiBNaWdyYXRpb25SZXN1bHQgPSBbXTtcblxuICAgIGZvciAoY29uc3QgeyBjb25uS2V5LCBrbmV4IH0gb2YgY29ubnMpIHtcbiAgICAgIGNvbnN0IFtiYXRjaE5vLCBhcHBsaWVkXSA9XG4gICAgICAgIGFjdGlvbiA9PT0gXCJhcHBseVwiID8gYXdhaXQga25leC5taWdyYXRlLmxhdGVzdCgpIDogYXdhaXQga25leC5taWdyYXRlLnJvbGxiYWNrKCk7XG5cbiAgICAgIHJlc3VsdHMucHVzaCh7XG4gICAgICAgIGNvbm5LZXksXG4gICAgICAgIGJhdGNoTm8sXG4gICAgICAgIGFwcGxpZWQsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0TWlncmF0aW9uQ29kZXMoKTogUHJvbWlzZTxNaWdyYXRpb25Db2RlW10+IHtcbiAgICBjb25zdCBzcmNNaWdyYXRpb25zRGlyID0gcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCJzcmNcIiwgXCJtaWdyYXRpb25zXCIpOyAvLyDsnbTqsbQg7ZmY6rK97JeQIOq0gOqzhOyXhuydtCDtla3sg4Egc3Jj7JeQ7IScIOywvuyVhOyVvCDtlbTsmpQuXG5cbiAgICBpZiAoIShhd2FpdCBleGlzdHMoc3JjTWlncmF0aW9uc0RpcikpKSB7XG4gICAgICBhd2FpdCBta2RpcihzcmNNaWdyYXRpb25zRGlyLCB7XG4gICAgICAgIHJlY3Vyc2l2ZTogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGNvZGVzID0gKGF3YWl0IHJlYWRkaXIoc3JjTWlncmF0aW9uc0RpcikpXG4gICAgICAuZmlsdGVyKChmKSA9PiBmLmVuZHNXaXRoKFwiLnRzXCIpKVxuICAgICAgLm1hcCgoZikgPT4gKHtcbiAgICAgICAgbmFtZTogZi5yZXBsYWNlKFwiLnRzXCIsIFwiXCIpLFxuICAgICAgICBwYXRoOiBwYXRoLmpvaW4oc3JjTWlncmF0aW9uc0RpciwgZiksXG4gICAgICB9KSlcbiAgICAgIC50b1NvcnRlZCgoYSwgYikgPT4gKGEubmFtZSA8IGIubmFtZSA/IDEgOiAtMSkpOyAvLyDsnbTrpoQg64K066a87LCo7IicIOygleugrCjstZzsi6DsiJwpXG5cbiAgICBOYWl0ZS50KFwibWlncmF0b3I6Z2V0TWlncmF0aW9uQ29kZXM6cmVzdWx0c1wiLCBjb2Rlcyk7XG4gICAgcmV0dXJuIGNvZGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIO2DgOqyn+uzhCDrp4jsnbTqt7jroIjsnbTshZgg7IOB7YOc7JmAIOy9lOuTnCDsg53shLEv7KSA67mEIOyDge2DnOulvCDqtaztlbTsmLXri4jri6QuXG4gICAqIOyLpOygnOuhnCBEQuyXkCDsoJHqt7zrj4Qg7ZWY6rOgIOuniOydtOq3uOugiOydtOyFmCDsvZTrk5wg7YyM7J2864+EIO2ZleyduO2VmOqzoCxcbiAgICog7ZWE7JqU7ZWY64uk66m0IOyggeyaqe2VoCDsiJgg7J6I64qUIOy9lOuTnOulvCDsg53shLHquYzsp4Ag7ZW07Ji164uI64ukLlxuICAgKlxuICAgKiBDTEnsmYAgU29uYW11IFVJ7JeQ7IScIOyCrOyaqeuQqeuLiOuLpC5cbiAgICpcbiAgICogQHJldHVybnNcbiAgICovXG4gIGFzeW5jIGdldFN0YXR1cygpOiBQcm9taXNlPE1pZ3JhdGlvblN0YXR1cz4ge1xuICAgIGNvbnN0IGNvZGVzID0gYXdhaXQgdGhpcy5nZXRNaWdyYXRpb25Db2RlcygpO1xuICAgIE5haXRlLnQoXCJtaWdyYXRvcjpnZXRTdGF0dXM6Y29kZXNcIiwgY29kZXMpO1xuXG4gICAgY29uc3QgY29ubktleXMgPSB0aGlzLmdldE1pZ3JhdGlvblRhcmdldEtleXMoKTtcblxuICAgIGxldCBtaWdyYXRpb25TdGF0dXNFcnJvcjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgY29uc3Qgc3RhdHVzZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGNvbm5LZXlzLm1hcChhc3luYyAoY29ubktleSkgPT4ge1xuICAgICAgICBjb25zdCBrbmV4T3B0aW9ucyA9IFNvbmFtdS5kYkNvbmZpZ1tjb25uS2V5XTtcbiAgICAgICAgY29uc3QgdENvbm4gPSBjcmVhdGVLbmV4SW5zdGFuY2Uoa25leE9wdGlvbnMpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3Qgc3RhdHVzOiBudW1iZXIgfCBcImVycm9yXCIgPSBhd2FpdCAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRDb25uLm1pZ3JhdGUuc3RhdHVzKCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgaWYgKHRoaXMuaXNNaXNzaW5nTWlncmF0aW9uVGFibGVFcnJvcihlcnIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvZGVzLmxlbmd0aDtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgICBjaGFsay55ZWxsb3coXG4gICAgICAgICAgICAgICAgICBgJHtjb25uS2V5feydmCDrp4jsnbTqt7jroIjsnbTshZgg7IOB7YOc66W8IOqwgOyguOyYpOuKlCDrjbDsl5Ag7Iuk7Yyo7ZWY7JiA7Iq164uI64ukLiDrjbDsnbTthLDrsqDsnbTsiqTqsIAg7Jis67CU66W06rKMIOq1rOyEseuQmOyngCDslYrsnYAg6rKDIOqwmeyKteuLiOuLpC4g7ZmV7J247ZWY7Iuc6rOgIOuLpOyLnCDsi5zrj4TtlbTso7zshLjsmpQuXFxu7Iuc64+E7ZWcIOyXsOqysCDshKTsoJU6XFxuJHtKU09OLnN0cmluZ2lmeShrbmV4T3B0aW9ucy5jb25uZWN0aW9uLCBudWxsLCAyKX1cXG7rsJzsg53tlZwg7JeQ65+sOlxcbiR7ZXJyfVxcbmAsXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgbWlncmF0aW9uU3RhdHVzRXJyb3IgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycik7XG4gICAgICAgICAgICAgIHJldHVybiBcImVycm9yXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkoKTtcbiAgICAgICAgICBjb25zdCBwZW5kaW5nOiBzdHJpbmdbXSA9IGF3YWl0IChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCBbLCBmZExpc3RdID0gYXdhaXQgdENvbm4ubWlncmF0ZS5saXN0KCk7XG4gICAgICAgICAgICAgIHJldHVybiBmZExpc3QubWFwKChmZDogeyBmaWxlOiBzdHJpbmcgfSkgPT4gZmQuZmlsZS5yZXBsYWNlKFwiLnRzXCIsIFwiXCIpKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICBpZiAodGhpcy5pc01pc3NpbmdNaWdyYXRpb25UYWJsZUVycm9yKGVycikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29kZXMubWFwKChjb2RlKSA9PiBjb2RlLm5hbWUpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgbWlncmF0aW9uU3RhdHVzRXJyb3IgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycik7XG4gICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSgpO1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRWZXJzaW9uOiBzdHJpbmcgfCBcImVycm9yXCIgPSBhd2FpdCAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRDb25uLm1pZ3JhdGUuY3VycmVudFZlcnNpb24oKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKF9lcnIpIHtcbiAgICAgICAgICAgICAgaWYgKHRoaXMuaXNNaXNzaW5nTWlncmF0aW9uVGFibGVFcnJvcihfZXJyKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcIm5vbmVcIjtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIG1pZ3JhdGlvblN0YXR1c0Vycm9yID0gX2VyciBpbnN0YW5jZW9mIEVycm9yID8gX2Vyci5tZXNzYWdlIDogU3RyaW5nKF9lcnIpO1xuICAgICAgICAgICAgICByZXR1cm4gXCJlcnJvclwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pKCk7XG4gICAgICAgICAgTmFpdGUudChcIm1pZ3JhdG9yOmdldFN0YXR1czpzdGF0dXNcIiwgc3RhdHVzKTtcblxuICAgICAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBrbmV4T3B0aW9ucy5jb25uZWN0aW9uIGFzIEtuZXguUGdDb25uZWN0aW9uQ29uZmlnO1xuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6IGNvbm5LZXksXG4gICAgICAgICAgICBjb25uS2V5LFxuICAgICAgICAgICAgY29ublN0cmluZzogYHBnOi8vJHtjb25uZWN0aW9uLnVzZXIgPz8gXCJcIn1AJHtjb25uZWN0aW9uLmhvc3R9OiR7XG4gICAgICAgICAgICAgIGNvbm5lY3Rpb24ucG9ydFxuICAgICAgICAgICAgfS8ke2Nvbm5lY3Rpb24uZGF0YWJhc2V9YCBhcyBDb25uU3RyaW5nLFxuICAgICAgICAgICAgY3VycmVudFZlcnNpb24sXG4gICAgICAgICAgICBzdGF0dXM6IHN0YXR1cyxcbiAgICAgICAgICAgIHBlbmRpbmcsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBhd2FpdCB0Q29ubi5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICBOYWl0ZS50KFwibWlncmF0b3I6Z2V0U3RhdHVzOmNvbm5zXCIsIHN0YXR1c2VzKTtcblxuICAgIGNvbnN0IHByZXBhcmVkQ29kZXM6IEdlbk1pZ3JhdGlvbkNvZGVbXSA9IGF3YWl0IChhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBzdGF0dXMwY29ubiA9IHN0YXR1c2VzLmZpbmQoKHN0YXR1cykgPT4gc3RhdHVzLnN0YXR1cyA9PT0gMCk7XG4gICAgICBpZiAoc3RhdHVzMGNvbm4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICAgICAgYFdoaWxlIHRyeWluZyB0byBwcmVwYXJlIG1pZ3JhdGlvbiBjb2Rlcywgd2UgZm91bmQgdGhhdCB0aGVyZSBpcyBubyBkYXRhYmFzZSB0byBjb21wYXJlIG1pZ3JhdGlvbnMuIFdlIG5lZWQgYXQgbGVhc3Qgb25lIGRhdGFiYXNlIHdoZXJlIGV2ZXJ5IG1pZ3JhdGlvbiBpcyBhcHBsaWVkKHN0YXR1cyA9PT0gMCkuIFlvdSBtaWdodCB3YW50IHRvIGFwcGx5IHlvdXIgZXhpc3RpbmcgbWlncmF0aW9ucyB0byBvbmUgb2YgdGhlIGRhdGFiYXNlcy5gLFxuICAgICAgICAgICksXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY29tcGFyZURCY29ubiA9IGNyZWF0ZUtuZXhJbnN0YW5jZShTb25hbXUuZGJDb25maWdbc3RhdHVzMGNvbm4uY29ubktleV0pO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY29tcGFyZU1pZ3JhdGlvbnMoY29tcGFyZURCY29ubik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBhd2FpdCBjb21wYXJlREJjb25uLmRlc3Ryb3koKTtcbiAgICAgIH1cbiAgICB9KSgpO1xuXG4gICAgTmFpdGUudChcIm1pZ3JhdG9yOmdldFN0YXR1czpwcmVwYXJlZENvZGVzXCIsIHByZXBhcmVkQ29kZXMpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbm5zOiBzdGF0dXNlcyxcbiAgICAgIGNvZGVzLFxuICAgICAgcHJlcGFyZWRDb2RlcyxcbiAgICAgIGVycm9yOiBtaWdyYXRpb25TdGF0dXNFcnJvcixcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOuniOydtOq3uOugiOydtOyFmOydhCDsoIHsmqntlZjqsbDrgpgg66Gk67Cx7ZWp64uI64ukLlxuICAgKiBTb25hbXUgVUnsl5DshJwg66eI7J206re466CI7J207IWYIOyekeyXheydhCDsiJjtlontlaAg65WMIOyCrOyaqeuQqeuLiOuLpC5cbiAgICpcbiAgICogQ0xJ7JmAIFNvbmFtdSBVSeyXkOyEnCDsgqzsmqnrkKnri4jri6QuXG4gICAqXG4gICAqIEBwYXJhbSBhY3Rpb24g7J6R7JeFIOycoO2YlSAoYXBwbHkvcm9sbGJhY2spXG4gICAqIEBwYXJhbSB0YXJnZXRzIOyekeyXhSDrjIDsg4EgREIg7ISk7KCVIO2CpCAoa2V5b2YgU29uYW11REJDb25maWcpXG4gICAqIEByZXR1cm5zIOyekeyXhSDqsrDqs7xcbiAgICovXG4gIGFzeW5jIHJ1bkFjdGlvbihcbiAgICBhY3Rpb246IFwiYXBwbHlcIiB8IFwicm9sbGJhY2tcIixcbiAgICB0YXJnZXRzOiAoa2V5b2YgU29uYW11REJDb25maWcpW10sXG4gICk6IFByb21pc2U8TWlncmF0aW9uUmVzdWx0PiB7XG4gICAgTmFpdGUudChcIm1pZ3JhdG9yOnJ1bkFjdGlvbjphY3Rpb25cIiwgYWN0aW9uKTtcbiAgICBOYWl0ZS50KFwibWlncmF0b3I6cnVuQWN0aW9uOnRhcmdldHNcIiwgdGFyZ2V0cyk7XG5cbiAgICBjb25zdCBhbGxvd2VkVGFyZ2V0cyA9IG5ldyBTZXQodGhpcy5nZXRNaWdyYXRpb25UYXJnZXRLZXlzKCkpO1xuICAgIGNvbnN0IGRpc2FsbG93ZWRUYXJnZXRzID0gdGFyZ2V0cy5maWx0ZXIoKHRhcmdldCkgPT4gIWFsbG93ZWRUYXJnZXRzLmhhcyh0YXJnZXQpKTtcbiAgICBpZiAoZGlzYWxsb3dlZFRhcmdldHMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgTWlncmF0aW9uIHRhcmdldHMgYXJlIG5vdCBhbGxvd2VkIGluIE5PREVfRU5WPSR7Z2V0U29uYW11RW52aXJvbm1lbnQoKX06ICR7ZGlzYWxsb3dlZFRhcmdldHMuam9pbihcIiwgXCIpfWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIGdldCB1bmlxIGtuZXggY29uZmlnc1xuICAgIGNvbnN0IGNvbmZpZ3MgPSB1bmlxdWUoXG4gICAgICB0YXJnZXRzXG4gICAgICAgIC5tYXAoKHRhcmdldCkgPT4gKHtcbiAgICAgICAgICBjb25uS2V5OiB0YXJnZXQsXG4gICAgICAgICAgb3B0aW9uczogU29uYW11LmRiQ29uZmlnW3RhcmdldF0sXG4gICAgICAgIH0pKVxuICAgICAgICAuZmlsdGVyKChjKSA9PiBjLm9wdGlvbnMgIT09IHVuZGVmaW5lZCksXG4gICAgICAoeyBvcHRpb25zIH0pID0+XG4gICAgICAgIGAkeyhvcHRpb25zLmNvbm5lY3Rpb24gYXMgS25leC5QZ0Nvbm5lY3Rpb25Db25maWcpLmhvc3R9OiR7XG4gICAgICAgICAgKG9wdGlvbnMuY29ubmVjdGlvbiBhcyBLbmV4LlBnQ29ubmVjdGlvbkNvbmZpZykucG9ydCA/PyA1NDMyXG4gICAgICAgIH0vJHsob3B0aW9ucy5jb25uZWN0aW9uIGFzIEtuZXguUGdDb25uZWN0aW9uQ29uZmlnKS5kYXRhYmFzZX1gLFxuICAgICk7XG5cbiAgICAvLyBnZXQgY29ubmVjdGlvbnNcbiAgICBjb25zdCBjb25ucyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgY29uZmlncy5tYXAoYXN5bmMgKGNvbmZpZykgPT4gKHtcbiAgICAgICAgY29ubktleTogY29uZmlnLmNvbm5LZXksXG4gICAgICAgIGtuZXg6IGNyZWF0ZUtuZXhJbnN0YW5jZShjb25maWcub3B0aW9ucyksXG4gICAgICB9KSksXG4gICAgKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBhY3Rpb25cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IChhc3luYyAoKSA9PiB7XG4gICAgICAgIHN3aXRjaCAoYWN0aW9uKSB7XG4gICAgICAgICAgY2FzZSBcImFwcGx5XCI6XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5ydW5NaWdyYXRpb25zU2VxdWVudGlhbGx5KGNvbm5zLCBcImFwcGx5XCIpO1xuICAgICAgICAgIGNhc2UgXCJyb2xsYmFja1wiOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucnVuTWlncmF0aW9uc1NlcXVlbnRpYWxseShjb25ucywgXCJyb2xsYmFja1wiKTtcbiAgICAgICAgfVxuICAgICAgfSkoKTtcblxuICAgICAgTmFpdGUudChcIm1pZ3JhdG9yOnJ1bkFjdGlvbjpyZXN1bHRcIiwgcmVzdWx0KTtcblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIGNvbm5zLm1hcCgoeyBrbmV4IH0pID0+IHtcbiAgICAgICAgICByZXR1cm4ga25leC5kZXN0cm95KCk7XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog7IKt7KCcIOqwgOuKpe2VnCDrp4jsnbTqt7jroIjsnbTshZgg7L2U65OcIO2MjOydvOydhCDqsoDspp3tlanri4jri6QuXG4gICAqXG4gICAqIEBwYXJhbSBjb25ucyDrp4jsnbTqt7jroIjsnbTshZgg7IOB7YOcIOuwsOyXtFxuICAgKiBAcGFyYW0gY29kZU5hbWVzIOyCreygnO2VoCDrp4jsnbTqt7jroIjsnbTshZgg7L2U65OcIO2MjOydvCDsnbTrpoQg67Cw7Je0XG4gICAqIEByZXR1cm5zIOyCreygnCDqsIDriqUg7Jes67aAIOuwjyDsoIHsmqnrkJwg66eI7J206re466CI7J207IWYIOy9lOuTnCDtjIzsnbwg7J2066aEXG4gICAqL1xuICB2YWxpZGF0ZURlbGV0YWJsZShjb25uczogTWlncmF0aW9uU3RhdHVzW1wiY29ubnNcIl0sIGNvZGVOYW1lczogc3RyaW5nW10pIHtcbiAgICBjb25zdCBhcHBsaWVkQ29kZXMgPSBjb2RlTmFtZXMuZmlsdGVyKChjb2RlTmFtZSkgPT5cbiAgICAgIGNvbm5zLnNvbWUoKGNvbm4pID0+ICFjb25uLnBlbmRpbmcuaW5jbHVkZXMoY29kZU5hbWUpKSxcbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNhbkRlbGV0ZTogYXBwbGllZENvZGVzLmxlbmd0aCA9PT0gMCxcbiAgICAgIGFwcGxpZWRDb2RlcyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOuniOydtOq3uOugiOydtOyFmCDsvZTrk5wg7YyM7J287J2EIOyCreygnO2VqeuLiOuLpC5cbiAgICpcbiAgICogU29uYW11IFVJ7JeQ7IScIOyCrOyaqeuQqeuLiOuLpC5cbiAgICpcbiAgICogQHBhcmFtIGNvZGVOYW1lcyDsgq3soJztlaAg66eI7J206re466CI7J207IWYIOy9lOuTnCDtjIzsnbwg7J2066aEIOuwsOyXtFxuICAgKiBAcmV0dXJucyDsgq3soJzrkJwg66eI7J206re466CI7J207IWYIOy9lOuTnCDtjIzsnbwg6rCc7IiYXG4gICAqL1xuICBhc3luYyBkZWxDb2Rlcyhjb2RlTmFtZXM6IHN0cmluZ1tdKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB7IGNvbm5zIH0gPSBhd2FpdCB0aGlzLmdldFN0YXR1cygpO1xuICAgIGNvbnN0IHsgY2FuRGVsZXRlLCBhcHBsaWVkQ29kZXMgfSA9IHRoaXMudmFsaWRhdGVEZWxldGFibGUoY29ubnMsIGNvZGVOYW1lcyk7XG4gICAgaWYgKCFjYW5EZWxldGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFlvdSBjYW5ub3QgZGVsZXRlIGEgbWlncmF0aW9uIGZpbGUgaWYgdGhlcmUgaXMgYWxyZWFkeSBhcHBsaWVkLiBBcHBsaWVkIGNvZGVzOiAke2FwcGxpZWRDb2Rlcy5qb2luKFwiLCBcIil9YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1bShcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBjb2RlTmFtZXMubWFwKGFzeW5jIChjb2RlTmFtZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGZpbGVQYXRoID0gYCR7U29uYW11LmFwaVJvb3RQYXRofS9zcmMvbWlncmF0aW9ucy8ke2NvZGVOYW1lfS50c2A7XG4gICAgICAgICAgaWYgKGF3YWl0IGV4aXN0cyhmaWxlUGF0aCkpIHtcbiAgICAgICAgICAgIGF3YWl0IHVubGluayhmaWxlUGF0aCk7XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH0pLFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZW5EYXRlVGFnKGluZGV4OiBudW1iZXIsIGJhc2VEYXRlOiBEYXRlID0gbmV3IERhdGUoKSk6IHN0cmluZyB7XG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKGJhc2VEYXRlLmdldFRpbWUoKSArIGluZGV4ICogMTAwMCk7XG4gICAgY29uc3QgcGFkID0gKG51bTogbnVtYmVyLCBzaXplOiBudW1iZXIgPSAyKSA9PiBudW0udG9TdHJpbmcoKS5wYWRTdGFydChzaXplLCBcIjBcIik7XG4gICAgcmV0dXJuIChcbiAgICAgIGRhdGUuZ2V0RnVsbFllYXIoKS50b1N0cmluZygpICtcbiAgICAgIHBhZChkYXRlLmdldE1vbnRoKCkgKyAxKSArXG4gICAgICBwYWQoZGF0ZS5nZXREYXRlKCkpICtcbiAgICAgIHBhZChkYXRlLmdldEhvdXJzKCkpICtcbiAgICAgIHBhZChkYXRlLmdldE1pbnV0ZXMoKSkgK1xuICAgICAgcGFkKGRhdGUuZ2V0U2Vjb25kcygpKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICog66eI7J206re466CI7J207IWYIOy9lOuTnCDtjIzsnbzsnYQg7IOd7ISx7ZWp64uI64ukLlxuICAgKlxuICAgKiBTb25hbXUgVUnsl5DshJwg7IKs7Jqp65Cp64uI64ukLlxuICAgKlxuICAgKiBAcmV0dXJucyDsg53shLHrkJwg66eI7J206re466CI7J207IWYIOy9lOuTnCDtjIzsnbwg6rCc7IiYXG4gICAqL1xuICBhc3luYyBnZW5lcmF0ZVByZXBhcmVkQ29kZXMoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB7IHByZXBhcmVkQ29kZXMgfSA9IGF3YWl0IHRoaXMuZ2V0U3RhdHVzKCk7XG4gICAgTmFpdGUudChcIm1pZ3JhdG9yOmdlbmVyYXRlUHJlcGFyZWRDb2RlczpwcmVwYXJlZENvZGVzXCIsIHByZXBhcmVkQ29kZXMpO1xuICAgIGlmIChwcmVwYXJlZENvZGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oXCJcXG7tmITsnqwg66qo65GQIOyLse2BrOuQnCDsg4Htg5zsnoXri4jri6QuXCIpKTtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIC8vIOyLpOygnCDsvZTrk5wg7IOd7ISxXG4gICAgY29uc3QgbWlncmF0aW9uc0RpciA9IGAke1NvbmFtdS5hcGlSb290UGF0aH0vc3JjL21pZ3JhdGlvbnNgO1xuXG4gICAgZm9yIChjb25zdCBbaW5kZXgsIHBjb2RlXSBvZiBwcmVwYXJlZENvZGVzLmVudHJpZXMoKSkge1xuICAgICAgaWYgKHBjb2RlLmZvcm1hdHRlZCkge1xuICAgICAgICBjb25zdCBkYXRlVGFnID0gdGhpcy5nZW5EYXRlVGFnKGluZGV4KTtcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBgJHttaWdyYXRpb25zRGlyfS8ke2RhdGVUYWd9XyR7cGNvZGUudGl0bGV9LnRzYDtcbiAgICAgICAgYXdhaXQgd3JpdGVGaWxlKGZpbGVQYXRoLCBwY29kZS5mb3JtYXR0ZWQpO1xuICAgICAgICAhaXNUZXN0KCkgJiYgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYE1JR1JBVElPTiBDUkVBVEVEICR7ZmlsZVBhdGh9YCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwcmVwYXJlZENvZGVzLmxlbmd0aDtcbiAgfVxuXG4gIGFzeW5jIGNvbXBhcmVNaWdyYXRpb25zKGNvbXBhcmVEQjogS25leCk6IFByb21pc2U8R2VuTWlncmF0aW9uQ29kZVtdPiB7XG4gICAgLy8gRW50aXR5IOyInO2ajO2VmOyXrCDsi7HtgaxcbiAgICBjb25zdCBlbnRpdHlJZHMgPSBFbnRpdHlNYW5hZ2VyLmdldEFsbElkcygpO1xuXG4gICAgLy8g7KGw7J247YWM7J2067iUIO2PrO2VqO2VmOyXrCBFbnRpdHnsl5DshJwgTWlncmF0aW9uU2V0IOy2lOy2nFxuICAgIGNvbnN0IGVudGl0eVNldHNXaXRoSm9pblRhYmxlID0gZW50aXR5SWRzXG4gICAgICAuZmlsdGVyKChlbnRpdHlJZCkgPT4gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpLnByb3BzLmxlbmd0aCA+IDApXG4gICAgICAubWFwKChlbnRpdHlJZCkgPT4gZ2V0TWlncmF0aW9uU2V0RnJvbUVudGl0eShFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCkpKTtcblxuICAgIC8vIOyhsOyduO2FjOydtOu4lOunjCDstpTstpxcbiAgICBjb25zdCBqb2luVGFibGVzV2l0aER1cCA9IGVudGl0eVNldHNXaXRoSm9pblRhYmxlLmZsYXRNYXAoKGVudGl0eVNldCkgPT4gZW50aXR5U2V0LmpvaW5UYWJsZXMpO1xuICAgIC8vIOykkeuztSDsoJzqsbAgKOykkeuzteyduCDqsr3smrAgaW5kZXhlc+ulvCDrs5HtlakpXG4gICAgY29uc3Qgam9pblRhYmxlcyA9IE9iamVjdC52YWx1ZXMoZ3JvdXAoam9pblRhYmxlc1dpdGhEdXAsIChqdCkgPT4ganQudGFibGUpKS5tYXAoKHRhYmxlcykgPT4ge1xuICAgICAgYXNzZXJ0KHRhYmxlcyAhPT0gdW5kZWZpbmVkLCBcInRhYmxlcyBpcyB1bmRlZmluZWRcIik7XG4gICAgICBpZiAodGFibGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4gdGFibGVzWzBdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4udGFibGVzWzBdLFxuICAgICAgICBpbmRleGVzOiB1bmlxdWUoXG4gICAgICAgICAgdGFibGVzLmZsYXRNYXAoKHQpID0+IHQuaW5kZXhlcyksXG4gICAgICAgICAgKGluZGV4KSA9PiBbaW5kZXgudHlwZSwgLi4uaW5kZXguY29sdW1uc10uam9pbihcIi1cIiksXG4gICAgICAgICksXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgLy8g7KGw7J247YWM7J2067iUIO2PrO2VqO2VmOyXrCBNaWdyYXRpb25TZXQg67Cw7Je0XG4gICAgY29uc3QgZW50aXR5U2V0czogTWlncmF0aW9uU2V0W10gPSBbLi4uZW50aXR5U2V0c1dpdGhKb2luVGFibGUsIC4uLmpvaW5UYWJsZXNdO1xuXG4gICAgY29uc3QgY29kZXM6IEdlbk1pZ3JhdGlvbkNvZGVbXSA9IFtdO1xuICAgIGNvbnN0IGJhdGNoU2l6ZSA9IDQ7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVudGl0eVNldHMubGVuZ3RoOyBpICs9IGJhdGNoU2l6ZSkge1xuICAgICAgY29uc3QgYmF0Y2hDb2RlcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBlbnRpdHlTZXRzLnNsaWNlKGksIGkgKyBiYXRjaFNpemUpLm1hcChhc3luYyAoZW50aXR5U2V0KSA9PiB7XG4gICAgICAgICAgY29uc3QgZGJTZXQgPSBhd2FpdCBQb3N0Z3JlU1FMU2NoZW1hUmVhZGVyLmdldE1pZ3JhdGlvblNldEZyb21EQihcbiAgICAgICAgICAgIGNvbXBhcmVEQixcbiAgICAgICAgICAgIGVudGl0eVNldC50YWJsZSxcbiAgICAgICAgICApO1xuICAgICAgICAgIE5haXRlLnQoYG1pZ3JhdG9yOmNvbXBhcmVNaWdyYXRpb25zOmVudGl0eVNldDoke2VudGl0eVNldC50YWJsZX1gLCBlbnRpdHlTZXQpO1xuICAgICAgICAgIE5haXRlLnQoYG1pZ3JhdG9yOmNvbXBhcmVNaWdyYXRpb25zOmRiU2V0OiR7ZW50aXR5U2V0LnRhYmxlfWAsIGRiU2V0KTtcblxuICAgICAgICAgIGlmIChkYlNldCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgLy8g6riw7KG0IO2FjOydtOu4lCDsl4bsnYwsIOyDiOuhnCDthYzsnbTruJQg7IOd7ISxXG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgZ2VuZXJhdGVDcmVhdGVDb2RlKGVudGl0eVNldCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIOq4sOyhtCDthYzsnbTruJQg7KG07J6s7ZWY64qUIOy8gOydtOyKpFxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGdlbmVyYXRlQWx0ZXJDb2RlKGVudGl0eVNldCwgZGJTZXQsIGNvbXBhcmVEQik7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICk7XG5cbiAgICAgIGNvZGVzLnB1c2goLi4uYmF0Y2hDb2Rlcy5mbGF0KCkpO1xuICAgIH1cblxuICAgIC8vIG5vcm1hbCDtg4DsnoXsnbQg7JWe7Jy866GcLCBmb3JlaWdu7J20IOuSpOuhnFxuICAgIGNvZGVzLnNvcnQoKGNvZGVBLCBjb2RlQikgPT4ge1xuICAgICAgaWYgKGNvZGVBLnR5cGUgPT09IFwiZm9yZWlnblwiICYmIGNvZGVCLnR5cGUgPT09IFwibm9ybWFsXCIpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9IGVsc2UgaWYgKGNvZGVBLnR5cGUgPT09IFwibm9ybWFsXCIgJiYgY29kZUIudHlwZSA9PT0gXCJmb3JlaWduXCIpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gY29kZXM7XG4gIH1cblxuICAvKipcbiAgICogU2hhZG93IERCIO2FjOyKpO2KuOulvCDsp4Ttlontlanri4jri6QuXG4gICAqXG4gICAqIFNvbmFtdSBVSeyXkOyEnCDsgqzsmqnrkKnri4jri6QuXG4gICAqXG4gICAqIEByZXR1cm5zIFNoYWRvdyBEQiDthYzsiqTtirgg6rKw6rO8XG4gICAqL1xuICBhc3luYyBydW5TaGFkb3dUZXN0KCk6IFByb21pc2U8TWlncmF0aW9uUmVzdWx0PiB7XG4gICAgY29uc3QgYmFzZVRlc3RDb25uID0gU29uYW11LmRiQ29uZmlnLnRlc3QuY29ubmVjdGlvbiBhcyBLbmV4LlBnQ29ubmVjdGlvbkNvbmZpZztcbiAgICBjb25zdCB3b3JrZXJJZCA9IHByb2Nlc3MuZW52LlNPTkFNVV9XT1JLRVJfREIgPT09IFwidHJ1ZVwiID8gcHJvY2Vzcy5lbnYuVklURVNUX1BPT0xfSUQgOiBudWxsO1xuICAgIGNvbnN0IHRlbXBsYXRlRGF0YWJhc2UgPVxuICAgICAgd29ya2VySWQgIT09IG51bGwgPyBgJHtiYXNlVGVzdENvbm4uZGF0YWJhc2V9XyR7d29ya2VySWQgPz8gXCIxXCJ9YCA6IGJhc2VUZXN0Q29ubi5kYXRhYmFzZTtcbiAgICBjb25zdCB0ZGJDb25uID0geyAuLi5iYXNlVGVzdENvbm4sIGRhdGFiYXNlOiB0ZW1wbGF0ZURhdGFiYXNlIH07XG4gICAgY29uc3Qgc2hhZG93RGF0YWJhc2UgPSBgJHt0ZW1wbGF0ZURhdGFiYXNlfV9fbWlncmF0aW9uX3NoYWRvd2A7XG5cbiAgICAvLyDthYzsiqTtirgg7IOB7Zmp7JeQ7ISc64qUIO2KuOuenOyereyFmOydhCDstIjquLDtmZTtlZjqs6AsIOyDiCDrjbDsnbTthLDrsqDsnbTsiqQg7Luk64Sl7IWY7J2EIOqwgOyguOyZgOyVvCDtlahcbiAgICBpZiAoaXNUZXN0KCkpIHtcbiAgICAgIGF3YWl0IERCLmNsZWFyVGVzdFRyYW5zYWN0aW9uKCk7XG4gICAgICBhd2FpdCBEQi5kZXN0cm95KCk7XG4gICAgfVxuXG4gICAgLy8g6riw7KG0IFNoYWRvdyBEQiDsgq3soJwg7ZuEIFNoYWRvdyBEQiDsg53shLFcbiAgICBjb25zdCB0ZGIgPSBjcmVhdGVLbmV4SW5zdGFuY2Uoe1xuICAgICAgLi4uU29uYW11LmRiQ29uZmlnLnRlc3QsXG4gICAgICBjb25uZWN0aW9uOiB7XG4gICAgICAgIC4uLmJhc2VUZXN0Q29ubixcbiAgICAgICAgZGF0YWJhc2U6IFwicG9zdGdyZXNcIixcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgdHJ5IHtcbiAgICAgICFpc1Rlc3QoKSAmJiBjb25zb2xlLmxvZyhjaGFsay5tYWdlbnRhKGAke3NoYWRvd0RhdGFiYXNlfSDsgq3soJxgKSk7XG4gICAgICBhd2FpdCB0ZGIucmF3KGBEUk9QIERBVEFCQVNFIElGIEVYSVNUUyAke3NoYWRvd0RhdGFiYXNlfWApO1xuICAgICAgYXdhaXQgdGRiLnJhdyhgXG4gICAgICAgIFNFTEVDVCBwZ190ZXJtaW5hdGVfYmFja2VuZChwZ19zdGF0X2FjdGl2aXR5LnBpZClcbiAgICAgICAgRlJPTSBwZ19zdGF0X2FjdGl2aXR5XG4gICAgICAgIFdIRVJFIGRhdG5hbWUgPSAnJHt0ZGJDb25uLmRhdGFiYXNlfSdcbiAgICAgICAgICBBTkQgcGlkIDw+IHBnX2JhY2tlbmRfcGlkKCk7XG4gICAgICBgKTtcbiAgICAgIGF3YWl0IHRkYi5yYXcoYENSRUFURSBEQVRBQkFTRSAke3NoYWRvd0RhdGFiYXNlfSBURU1QTEFURSAke3RkYkNvbm4uZGF0YWJhc2V9YCk7XG5cbiAgICAgIC8vIFNoYWRvdyBEQuyXkCDsl7DqsrBcbiAgICAgIGNvbnN0IHNkYiA9IGNyZWF0ZUtuZXhJbnN0YW5jZSh7XG4gICAgICAgIC4uLlNvbmFtdS5kYkNvbmZpZy50ZXN0LFxuICAgICAgICBjb25uZWN0aW9uOiB7XG4gICAgICAgICAgLi4udGRiQ29ubixcbiAgICAgICAgICBkYXRhYmFzZTogc2hhZG93RGF0YWJhc2UsXG4gICAgICAgICAgcGFzc3dvcmQ6IHRkYkNvbm4ucGFzc3dvcmQsXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgLy8gc2hhZG93IERCIO2FjOyKpO2KuCDsp4TtlolcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IFtiYXRjaE5vLCBhcHBsaWVkXSA9IGF3YWl0IHNkYi5taWdyYXRlLmxhdGVzdCgpO1xuICAgICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihcIlNoYWRvdyBEQiDthYzsiqTtirjsl5Ag7ISx6rO17ZaI7Iq164uI64ukIVwiKSwge1xuICAgICAgICAgICAgYmF0Y2hObyxcbiAgICAgICAgICAgIGFwcGxpZWQsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25uS2V5OiBcInNoYWRvd1wiLFxuICAgICAgICAgICAgYmF0Y2hObyxcbiAgICAgICAgICAgIGFwcGxpZWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgdGhyb3cgbmV3IFNlcnZpY2VVbmF2YWlsYWJsZUV4Y2VwdGlvbihTRChcInNvbmFtdS5lcnJvci5zaGFkb3dEYlRlc3RGYWlsZWRcIikpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgYXdhaXQgc2RiLmRlc3Ryb3koKTtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgLy8gU2hhZG93IERCIOyCreygnFxuICAgICAgIWlzVGVzdCgpICYmIGNvbnNvbGUubG9nKGNoYWxrLm1hZ2VudGEoYCR7c2hhZG93RGF0YWJhc2V9IOyCreygnGApKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRkYi5yYXcoYERST1AgREFUQUJBU0UgSUYgRVhJU1RTICR7c2hhZG93RGF0YWJhc2V9YCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJTaGFkb3cgREIg7KCV66asIOyLpO2MqDpcIiwgZSk7IC8vIOydtOqyjCDsl4bsnLzrqbQg7KGw7Jqp7Z6IIOuIhOyImFxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgYXdhaXQgdGRiLmRlc3Ryb3koKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzthQVFzQztTQUNIO1dBRWtCO1NBQ3RCO3FCQUN5QjtVQUNYO29CQUM0QjtZQUNuQztpQkFFZTtlQUNYO3NCQUMrQjtvQkFDZDsrQkFDUTtDQVN0RCxXQUFiLE1BQXNCO0VBQ3BCLDZCQUFxQyxPQUF5QjtHQUM1RCxJQUFJLE9BQU8sVUFBVSxZQUFZLFVBQVUsTUFDekMsT0FBTztHQUdULE1BQU0scUJBQXFCO0dBQzNCLE9BQ0UsbUJBQW1CLFNBQVMsV0FDNUIsT0FBTyxtQkFBbUIsWUFBWSxZQUN0QyxtQkFBbUIsUUFBUSxTQUFTLGlCQUFpQjtFQUV6RDtFQUVBLHlCQUEyRDtHQUN6RCxNQUFNLFdBQVcsT0FBTyxLQUFLLE9BQU8sUUFBUSxDQUFDLENBQUMsUUFDM0MsUUFBUSxDQUFDLElBQUksU0FBUyxXQUFXLENBQ3BDO0dBRUEsSUFBSSxRQUFRLEdBQ1YsT0FBTztHQUdULE1BQU0sY0FB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
|
|
409
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlncmF0b3IuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL21pZ3JhdGlvbi9taWdyYXRvci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIjtcbmltcG9ydCB7IG1rZGlyLCByZWFkZGlyLCB1bmxpbmssIHdyaXRlRmlsZSB9IGZyb20gXCJmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcblxuaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xuaW1wb3J0IHsgdHlwZSBLbmV4IH0gZnJvbSBcImtuZXhcIjtcbmltcG9ydCB7IGdyb3VwLCBzdW0sIHVuaXF1ZSB9IGZyb20gXCJyYWRhc2hpXCI7XG5cbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGkvc29uYW11XCI7XG5pbXBvcnQgeyBEQiB9IGZyb20gXCIuLi9kYXRhYmFzZS9kYlwiO1xuaW1wb3J0IHsgdHlwZSBTb25hbXVEQkNvbmZpZyB9IGZyb20gXCIuLi9kYXRhYmFzZS9kYlwiO1xuaW1wb3J0IHsgY3JlYXRlS25leEluc3RhbmNlIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2tuZXhcIjtcbmltcG9ydCB7IFNEIH0gZnJvbSBcIi4uL2RpY3Qvc2RcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyBnZXRTb25hbXVFbnZpcm9ubWVudCB9IGZyb20gXCIuLi9lbnZcIjtcbmltcG9ydCB7IFNlcnZpY2VVbmF2YWlsYWJsZUV4Y2VwdGlvbiB9IGZyb20gXCIuLi9leGNlcHRpb25zL3NvLWV4Y2VwdGlvbnNcIjtcbmltcG9ydCB7IE5haXRlIH0gZnJvbSBcIi4uL25haXRlL25haXRlXCI7XG5pbXBvcnQgeyB0eXBlIEdlbk1pZ3JhdGlvbkNvZGUsIHR5cGUgTWlncmF0aW9uU2V0IH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBpc0xvY2FsLCBpc1Rlc3QgfSBmcm9tIFwiLi4vdXRpbHMvY29udHJvbGxlclwiO1xuaW1wb3J0IHsgZXhpc3RzIH0gZnJvbSBcIi4uL3V0aWxzL2ZzLXV0aWxzXCI7XG5pbXBvcnQgeyBnZW5lcmF0ZUFsdGVyQ29kZSwgZ2VuZXJhdGVDcmVhdGVDb2RlIH0gZnJvbSBcIi4vY29kZS1nZW5lcmF0aW9uXCI7XG5pbXBvcnQgeyBnZXRNaWdyYXRpb25TZXRGcm9tRW50aXR5IH0gZnJvbSBcIi4vbWlncmF0aW9uLXNldFwiO1xuaW1wb3J0IHsgUG9zdGdyZVNRTFNjaGVtYVJlYWRlciB9IGZyb20gXCIuL3Bvc3RncmVzcWwtc2NoZW1hLXJlYWRlclwiO1xuaW1wb3J0IHsgdHlwZSBDb25uU3RyaW5nLCB0eXBlIE1pZ3JhdGlvbkNvZGUsIHR5cGUgTWlncmF0aW9uU3RhdHVzIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuZXhwb3J0IHR5cGUgTWlncmF0aW9uUmVzdWx0ID0ge1xuICBjb25uS2V5OiBzdHJpbmc7XG4gIGJhdGNoTm86IG51bWJlcjtcbiAgYXBwbGllZDogc3RyaW5nW107XG59W107XG5cbi8vIOuniOydtOq3uOugiOydtOyFmCDsg4Htg5wg7KGw7ZqMIOyLnCBEQiDsl7DqsrAg7ZmV7J24IO2DgOyehOyVhOybgyhtcykuXG4vLyBjcmVhdGVLbmV4SW5zdGFuY2XsnZgg7Luk64Sl7IWYIO2ajeuTnSDtg4DsnoTslYTsm4MoMzDstIgp7JeQIHN0YXR1cy9saXN0L2N1cnJlbnRWZXJzaW9u7J20XG4vLyDqsIHqsIEg6rG466as66m0IENMSS9VSeqwgCDstZzrjIAg7IiY7IutIOy0iCBoYW5n7ZWc64ukLiDsoJXsg4Eg7J2R64u17J2AIOyImOuwsSBtc+ydtOuvgOuhnCA17LSI66m0IOy2qeu2hO2VmOuLpC5cbmNvbnN0IE1JR1JBVElPTl9DT05OX1RJTUVPVVRfTVMgPSA1MDAwO1xuXG4vKipcbiAqIOyjvOyWtOynhCBQcm9taXNl6rCAIG1zIOyViOyXkCDsmYTro4zrkJjsp4Ag7JWK7Jy866m0IG9uVGltZW91dCDsl5Drn6zroZwgcmVqZWN07ZWc64ukLlxuICog7JuQ67O4IFByb21pc2Ug7J6Q7LK064qUIOqzhOyGjSDsp4TtlonrkJjrr4DroZwsIO2YuOy2nOy4oeyXkOyEnCDsu6TrhKXshZgg7KCV66asKGRlc3Ryb3kp66W8IOyxheyehOynhOuLpC5cbiAqL1xuZnVuY3Rpb24gd2l0aFRpbWVvdXQ8VD4ocHJvbWlzZTogUHJvbWlzZTxUPiwgbXM6IG51bWJlciwgb25UaW1lb3V0OiAoKSA9PiBFcnJvcik6IFByb21pc2U8VD4ge1xuICByZXR1cm4gbmV3IFByb21pc2U8VD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiByZWplY3Qob25UaW1lb3V0KCkpLCBtcyk7XG4gICAgcHJvbWlzZS50aGVuKFxuICAgICAgKHZhbHVlKSA9PiB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgICAgfSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfSxcbiAgICApO1xuICB9KTtcbn1cblxuZXhwb3J0IGNsYXNzIE1pZ3JhdG9yIHtcbiAgcHJpdmF0ZSBpc01pc3NpbmdNaWdyYXRpb25UYWJsZUVycm9yKGVycm9yOiB1bmtub3duKTogYm9vbGVhbiB7XG4gICAgaWYgKHR5cGVvZiBlcnJvciAhPT0gXCJvYmplY3RcIiB8fCBlcnJvciA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IG1heWJlUG9zdGdyZXNFcnJvciA9IGVycm9yIGFzIHsgY29kZT86IHVua25vd247IG1lc3NhZ2U/OiB1bmtub3duIH07XG4gICAgcmV0dXJuIChcbiAgICAgIG1heWJlUG9zdGdyZXNFcnJvci5jb2RlID09PSBcIjQyUDAxXCIgJiZcbiAgICAgIHR5cGVvZiBtYXliZVBvc3RncmVzRXJyb3IubWVzc2FnZSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgbWF5YmVQb3N0Z3Jlc0Vycm9yLm1lc3NhZ2UuaW5jbHVkZXMoXCJrbmV4X21pZ3JhdGlvbnNcIilcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRNaWdyYXRpb25UYXJnZXRLZXlzKCk6IChrZXlvZiBTb25hbXVEQkNvbmZpZylbXSB7XG4gICAgY29uc3QgY29ubktleXMgPSBPYmplY3Qua2V5cyhTb25hbXUuZGJDb25maWcpLmZpbHRlcihcbiAgICAgIChrZXkpID0+ICFrZXkuZW5kc1dpdGgoXCJfcmVhZG9ubHlcIiksXG4gICAgKSBhcyAoa2V5b2YgU29uYW11REJDb25maWcpW107XG5cbiAgICBpZiAoaXNMb2NhbCgpKSB7XG4gICAgICByZXR1cm4gY29ubktleXM7XG4gICAgfVxuXG4gICAgY29uc3QgZW52aXJvbm1lbnQgPSBnZXRTb25hbXVFbnZpcm9ubWVudCgpO1xuICAgIHJldHVybiBjb25uS2V5cy5maWx0ZXIoKGtleSkgPT4ga2V5ID09PSBlbnZpcm9ubWVudCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJ1bk1pZ3JhdGlvbnNTZXF1ZW50aWFsbHkoXG4gICAgY29ubnM6IHsgY29ubktleToga2V5b2YgU29uYW11REJDb25maWc7IGtuZXg6IEtuZXggfVtdLFxuICAgIGFjdGlvbjogXCJhcHBseVwiIHwgXCJyb2xsYmFja1wiLFxuICApOiBQcm9taXNlPE1pZ3JhdGlvblJlc3VsdD4ge1xuICAgIGNvbnN0IHJlc3VsdHM6IE1pZ3JhdGlvblJlc3VsdCA9IFtdO1xuXG4gICAgZm9yIChjb25zdCB7IGNvbm5LZXksIGtuZXggfSBvZiBjb25ucykge1xuICAgICAgY29uc3QgW2JhdGNoTm8sIGFwcGxpZWRdID1cbiAgICAgICAgYWN0aW9uID09PSBcImFwcGx5XCIgPyBhd2FpdCBrbmV4Lm1pZ3JhdGUubGF0ZXN0KCkgOiBhd2FpdCBrbmV4Lm1pZ3JhdGUucm9sbGJhY2soKTtcblxuICAgICAgcmVzdWx0cy5wdXNoKHtcbiAgICAgICAgY29ubktleSxcbiAgICAgICAgYmF0Y2hObyxcbiAgICAgICAgYXBwbGllZCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRNaWdyYXRpb25Db2RlcygpOiBQcm9taXNlPE1pZ3JhdGlvbkNvZGVbXT4ge1xuICAgIGNvbnN0IHNyY01pZ3JhdGlvbnNEaXIgPSBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBcInNyY1wiLCBcIm1pZ3JhdGlvbnNcIik7IC8vIOydtOqxtCDtmZjqsr3sl5Ag6rSA6rOE7JeG7J20IO2VreyDgSBzcmPsl5DshJwg7LC+7JWE7JW8IO2VtOyalC5cblxuICAgIGlmICghKGF3YWl0IGV4aXN0cyhzcmNNaWdyYXRpb25zRGlyKSkpIHtcbiAgICAgIGF3YWl0IG1rZGlyKHNyY01pZ3JhdGlvbnNEaXIsIHtcbiAgICAgICAgcmVjdXJzaXZlOiB0cnVlLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgY29kZXMgPSAoYXdhaXQgcmVhZGRpcihzcmNNaWdyYXRpb25zRGlyKSlcbiAgICAgIC5maWx0ZXIoKGYpID0+IGYuZW5kc1dpdGgoXCIudHNcIikpXG4gICAgICAubWFwKChmKSA9PiAoe1xuICAgICAgICBuYW1lOiBmLnJlcGxhY2UoXCIudHNcIiwgXCJcIiksXG4gICAgICAgIHBhdGg6IHBhdGguam9pbihzcmNNaWdyYXRpb25zRGlyLCBmKSxcbiAgICAgIH0pKVxuICAgICAgLnRvU29ydGVkKChhLCBiKSA9PiAoYS5uYW1lIDwgYi5uYW1lID8gMSA6IC0xKSk7IC8vIOydtOumhCDrgrTrprzssKjsiJwg7KCV66CsKOy1nOyLoOyInClcblxuICAgIE5haXRlLnQoXCJtaWdyYXRvcjpnZXRNaWdyYXRpb25Db2RlczpyZXN1bHRzXCIsIGNvZGVzKTtcbiAgICByZXR1cm4gY29kZXM7XG4gIH1cblxuICAvKipcbiAgICog7YOA6rKf67OEIOuniOydtOq3uOugiOydtOyFmCDsg4Htg5zsmYAg7L2U65OcIOyDneyEsS/spIDruYQg7IOB7YOc66W8IOq1rO2VtOyYteuLiOuLpC5cbiAgICog7Iuk7KCc66GcIERC7JeQIOygkeq3vOuPhCDtlZjqs6Ag66eI7J206re466CI7J207IWYIOy9lOuTnCDtjIzsnbzrj4Qg7ZmV7J247ZWY6rOgLFxuICAgKiDtlYTsmpTtlZjri6TrqbQg7KCB7Jqp7ZWgIOyImCDsnojripQg7L2U65Oc66W8IOyDneyEseq5jOyngCDtlbTsmLXri4jri6QuXG4gICAqXG4gICAqIENMSeyZgCBTb25hbXUgVUnsl5DshJwg7IKs7Jqp65Cp64uI64ukLlxuICAgKlxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgYXN5bmMgZ2V0U3RhdHVzKCk6IFByb21pc2U8TWlncmF0aW9uU3RhdHVzPiB7XG4gICAgY29uc3QgY29kZXMgPSBhd2FpdCB0aGlzLmdldE1pZ3JhdGlvbkNvZGVzKCk7XG4gICAgTmFpdGUudChcIm1pZ3JhdG9yOmdldFN0YXR1czpjb2Rlc1wiLCBjb2Rlcyk7XG5cbiAgICBjb25zdCBjb25uS2V5cyA9IHRoaXMuZ2V0TWlncmF0aW9uVGFyZ2V0S2V5cygpO1xuXG4gICAgbGV0IG1pZ3JhdGlvblN0YXR1c0Vycm9yOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBzdGF0dXNlcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgY29ubktleXMubWFwKGFzeW5jIChjb25uS2V5KSA9PiB7XG4gICAgICAgIGNvbnN0IGtuZXhPcHRpb25zID0gU29uYW11LmRiQ29uZmlnW2Nvbm5LZXldO1xuICAgICAgICBjb25zdCBjb25uZWN0aW9uID0ga25leE9wdGlvbnMuY29ubmVjdGlvbiBhcyBLbmV4LlBnQ29ubmVjdGlvbkNvbmZpZztcbiAgICAgICAgLy8g7IOB7YOcIOyhsO2ajOyaqSDsu6TrhKXshZjsnYAgZmFpbC1mYXN066GcIOunjOuToOuLpDog67aI7Ya1IERC7JeQ7IScIOy7pOuEpeyFmCDtmo3rk53snYQg66y07ZWc7KCVXG4gICAgICAgIC8vIOyerOyLnOuPhO2VmOupsCBDTEkg7ZSE66Gc7IS47Iqk6rCAIOyiheujjOuQmOyngCDslYrripQg6rKD7J2EIOunieuKlOuLpC5cbiAgICAgICAgLy8gLSBjb25uZWN0aW9uVGltZW91dE1pbGxpczog7IaM7LyTIOyXsOqysCDsnpDssrTrpbwgNey0iCDslYjsl5Ag7Y+s6riwIOKGkiDshozsvJPsnbQg7KCV66as65CY7Ja0IO2UhOuhnOyEuOyKpOqwgCDsooXro4zrkKhcbiAgICAgICAgLy8gLSBwcm9wYWdhdGVDcmVhdGVFcnJvcjog7LKrIOyXsOqysCDsi6TtjKjrpbwg7KaJ7IucIOyghO2MjCjtkoAg7J6s7Iuc64+EIOyXhuydtCDrsJTroZwg7Iuk7YyoKVxuICAgICAgICBjb25zdCB0Q29ubiA9IGNyZWF0ZUtuZXhJbnN0YW5jZSh7XG4gICAgICAgICAgLi4ua25leE9wdGlvbnMsXG4gICAgICAgICAgY29ubmVjdGlvbjoge1xuICAgICAgICAgICAgLi4uKGNvbm5lY3Rpb24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLFxuICAgICAgICAgICAgY29ubmVjdGlvblRpbWVvdXRNaWxsaXM6IE1JR1JBVElPTl9DT05OX1RJTUVPVVRfTVMsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBwb29sOiB7XG4gICAgICAgICAgICAuLi5rbmV4T3B0aW9ucy5wb29sLFxuICAgICAgICAgICAgbWluOiAwLFxuICAgICAgICAgICAgYWNxdWlyZVRpbWVvdXRNaWxsaXM6IE1JR1JBVElPTl9DT05OX1RJTUVPVVRfTVMsXG4gICAgICAgICAgICBjcmVhdGVUaW1lb3V0TWlsbGlzOiBNSUdSQVRJT05fQ09OTl9USU1FT1VUX01TLFxuICAgICAgICAgICAgcHJvcGFnYXRlQ3JlYXRlRXJyb3I6IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGNvbm5TdHJpbmcgPVxuICAgICAgICAgIGBwZzovLyR7Y29ubmVjdGlvbi51c2VyID8/IFwiXCJ9QCR7Y29ubmVjdGlvbi5ob3N0fToke2Nvbm5lY3Rpb24ucG9ydH0vJHtjb25uZWN0aW9uLmRhdGFiYXNlfWAgYXMgQ29ublN0cmluZztcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIERCIOyXsOqysCDtmZXsnbg6IOu2iO2GtSBEQuyXkOyEnCBzdGF0dXMvbGlzdC9jdXJyZW50VmVyc2lvbuydtCDsu6TrhKXshZgg7ZqN65OdXG4gICAgICAgICAgLy8g7YOA7J6E7JWE7JuD6rmM7KeAIGhhbmftlZjripQg6rKD7J2EIOunieq4sCDsnITtlbQsIOuovOyggCA17LSIIOyViOyXkCDsnZHri7XtlZjripTsp4Ag7ZmV7J247ZWc64ukLlxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB3aXRoVGltZW91dChcbiAgICAgICAgICAgICAgdENvbm4ucmF3KFwic2VsZWN0IDFcIiksXG4gICAgICAgICAgICAgIE1JR1JBVElPTl9DT05OX1RJTUVPVVRfTVMsXG4gICAgICAgICAgICAgICgpID0+XG4gICAgICAgICAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgYERCIOyXsOqysCDsi5zqsIQg7LSI6rO8ICgke01JR1JBVElPTl9DT05OX1RJTUVPVVRfTVN9bXMpIOKAlCAke2Nvbm5lY3Rpb24uaG9zdH06JHtjb25uZWN0aW9uLnBvcnR9LyR7Y29ubmVjdGlvbi5kYXRhYmFzZX1gLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICBjaGFsay55ZWxsb3coXG4gICAgICAgICAgICAgICAgYCR7Y29ubktleX3snZgg66eI7J206re466CI7J207IWYIOyDge2DnOulvCDqsIDsoLjsmKTripQg642w7JeQIOyLpO2MqO2VmOyYgOyKteuLiOuLpC4g642w7J207YSw67Kg7J207Iqk7JeQIOyXsOqysO2VoCDsiJgg7JeG7Iq164uI64ukLlxcbuyLnOuPhO2VnCDsl7DqsrAg7ISk7KCVOlxcbiR7SlNPTi5zdHJpbmdpZnkoa25leE9wdGlvbnMuY29ubmVjdGlvbiwgbnVsbCwgMil9XFxu67Cc7IOd7ZWcIOyXkOufrDpcXG4ke2Vycn1cXG5gLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIG1pZ3JhdGlvblN0YXR1c0Vycm9yID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgbmFtZTogY29ubktleSxcbiAgICAgICAgICAgICAgY29ubktleSxcbiAgICAgICAgICAgICAgY29ublN0cmluZyxcbiAgICAgICAgICAgICAgY3VycmVudFZlcnNpb246IFwiZXJyb3JcIiBhcyBjb25zdCxcbiAgICAgICAgICAgICAgc3RhdHVzOiBcImVycm9yXCIgYXMgY29uc3QsXG4gICAgICAgICAgICAgIHBlbmRpbmc6IFtdIGFzIHN0cmluZ1tdLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBzdGF0dXM6IG51bWJlciB8IFwiZXJyb3JcIiA9IGF3YWl0IChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdENvbm4ubWlncmF0ZS5zdGF0dXMoKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICBpZiAodGhpcy5pc01pc3NpbmdNaWdyYXRpb25UYWJsZUVycm9yKGVycikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29kZXMubGVuZ3RoO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICAgICAgICAgIGAke2Nvbm5LZXl97J2YIOuniOydtOq3uOugiOydtOyFmCDsg4Htg5zrpbwg6rCA7KC47Jik64qUIOuNsOyXkCDsi6TtjKjtlZjsmIDsirXri4jri6QuIOuNsOydtO2EsOuyoOydtOyKpOqwgCDsmKzrsJTrpbTqsowg6rWs7ISx65CY7KeAIOyViuydgCDqsoMg6rCZ7Iq164uI64ukLiDtmZXsnbjtlZjsi5zqs6Ag64uk7IucIOyLnOuPhO2VtOyjvOyEuOyalC5cXG7si5zrj4TtlZwg7Jew6rKwIOyEpOyglTpcXG4ke0pTT04uc3RyaW5naWZ5KGtuZXhPcHRpb25zLmNvbm5lY3Rpb24sIG51bGwsIDIpfVxcbuuwnOyDne2VnCDsl5Drn6w6XFxuJHtlcnJ9XFxuYCxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBtaWdyYXRpb25TdGF0dXNFcnJvciA9IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKTtcbiAgICAgICAgICAgICAgcmV0dXJuIFwiZXJyb3JcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSgpO1xuICAgICAgICAgIGNvbnN0IHBlbmRpbmc6IHN0cmluZ1tdID0gYXdhaXQgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IFssIGZkTGlzdF0gPSBhd2FpdCB0Q29ubi5taWdyYXRlLmxpc3QoKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGZkTGlzdC5tYXAoKGZkOiB7IGZpbGU6IHN0cmluZyB9KSA9PiBmZC5maWxlLnJlcGxhY2UoXCIudHNcIiwgXCJcIikpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLmlzTWlzc2luZ01pZ3JhdGlvblRhYmxlRXJyb3IoZXJyKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb2Rlcy5tYXAoKGNvZGUpID0+IGNvZGUubmFtZSk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBtaWdyYXRpb25TdGF0dXNFcnJvciA9IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKTtcbiAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pKCk7XG4gICAgICAgICAgY29uc3QgY3VycmVudFZlcnNpb246IHN0cmluZyB8IFwiZXJyb3JcIiA9IGF3YWl0IChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdENvbm4ubWlncmF0ZS5jdXJyZW50VmVyc2lvbigpO1xuICAgICAgICAgICAgfSBjYXRjaCAoX2Vycikge1xuICAgICAgICAgICAgICBpZiAodGhpcy5pc01pc3NpbmdNaWdyYXRpb25UYWJsZUVycm9yKF9lcnIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwibm9uZVwiO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgbWlncmF0aW9uU3RhdHVzRXJyb3IgPSBfZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBfZXJyLm1lc3NhZ2UgOiBTdHJpbmcoX2Vycik7XG4gICAgICAgICAgICAgIHJldHVybiBcImVycm9yXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkoKTtcbiAgICAgICAgICBOYWl0ZS50KFwibWlncmF0b3I6Z2V0U3RhdHVzOnN0YXR1c1wiLCBzdGF0dXMpO1xuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6IGNvbm5LZXksXG4gICAgICAgICAgICBjb25uS2V5LFxuICAgICAgICAgICAgY29ublN0cmluZyxcbiAgICAgICAgICAgIGN1cnJlbnRWZXJzaW9uLFxuICAgICAgICAgICAgc3RhdHVzOiBzdGF0dXMsXG4gICAgICAgICAgICBwZW5kaW5nLFxuICAgICAgICAgIH07XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgLy8g67aI7Ya1IERC7J2YIOy7pOuEpeyFmCDsoJXrpqzqsIAg7Luk64Sl7IWYIO2ajeuTnSDtg4DsnoTslYTsm4PquYzsp4AgaGFuZ+2VmOyngCDslYrrj4TroZ0g6rCQ7Iu864ukLlxuICAgICAgICAgIGF3YWl0IHdpdGhUaW1lb3V0KFxuICAgICAgICAgICAgdENvbm4uZGVzdHJveSgpLFxuICAgICAgICAgICAgTUlHUkFUSU9OX0NPTk5fVElNRU9VVF9NUyxcbiAgICAgICAgICAgICgpID0+IG5ldyBFcnJvcihcImNvbm5lY3Rpb24gZGVzdHJveSB0aW1lb3V0XCIpLFxuICAgICAgICAgICkuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgTmFpdGUudChcIm1pZ3JhdG9yOmdldFN0YXR1czpjb25uc1wiLCBzdGF0dXNlcyk7XG5cbiAgICBjb25zdCBwcmVwYXJlZENvZGVzOiBHZW5NaWdyYXRpb25Db2RlW10gPSBhd2FpdCAoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgc3RhdHVzMGNvbm4gPSBzdGF0dXNlcy5maW5kKChzdGF0dXMpID0+IHN0YXR1cy5zdGF0dXMgPT09IDApO1xuICAgICAgaWYgKHN0YXR1czBjb25uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICAgIGBXaGlsZSB0cnlpbmcgdG8gcHJlcGFyZSBtaWdyYXRpb24gY29kZXMsIHdlIGZvdW5kIHRoYXQgdGhlcmUgaXMgbm8gZGF0YWJhc2UgdG8gY29tcGFyZSBtaWdyYXRpb25zLiBXZSBuZWVkIGF0IGxlYXN0IG9uZSBkYXRhYmFzZSB3aGVyZSBldmVyeSBtaWdyYXRpb24gaXMgYXBwbGllZChzdGF0dXMgPT09IDApLiBZb3UgbWlnaHQgd2FudCB0byBhcHBseSB5b3VyIGV4aXN0aW5nIG1pZ3JhdGlvbnMgdG8gb25lIG9mIHRoZSBkYXRhYmFzZXMuYCxcbiAgICAgICAgICApLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvbXBhcmVEQmNvbm4gPSBjcmVhdGVLbmV4SW5zdGFuY2UoU29uYW11LmRiQ29uZmlnW3N0YXR1czBjb25uLmNvbm5LZXldKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNvbXBhcmVNaWdyYXRpb25zKGNvbXBhcmVEQmNvbm4pO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgYXdhaXQgY29tcGFyZURCY29ubi5kZXN0cm95KCk7XG4gICAgICB9XG4gICAgfSkoKTtcblxuICAgIE5haXRlLnQoXCJtaWdyYXRvcjpnZXRTdGF0dXM6cHJlcGFyZWRDb2Rlc1wiLCBwcmVwYXJlZENvZGVzKTtcblxuICAgIHJldHVybiB7XG4gICAgICBjb25uczogc3RhdHVzZXMsXG4gICAgICBjb2RlcyxcbiAgICAgIHByZXBhcmVkQ29kZXMsXG4gICAgICBlcnJvcjogbWlncmF0aW9uU3RhdHVzRXJyb3IsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDrp4jsnbTqt7jroIjsnbTshZjsnYQg7KCB7Jqp7ZWY6rGw64KYIOuhpOuwse2VqeuLiOuLpC5cbiAgICogU29uYW11IFVJ7JeQ7IScIOuniOydtOq3uOugiOydtOyFmCDsnpHsl4XsnYQg7IiY7ZaJ7ZWgIOuVjCDsgqzsmqnrkKnri4jri6QuXG4gICAqXG4gICAqIENMSeyZgCBTb25hbXUgVUnsl5DshJwg7IKs7Jqp65Cp64uI64ukLlxuICAgKlxuICAgKiBAcGFyYW0gYWN0aW9uIOyekeyXhSDsnKDtmJUgKGFwcGx5L3JvbGxiYWNrKVxuICAgKiBAcGFyYW0gdGFyZ2V0cyDsnpHsl4Ug64yA7IOBIERCIOyEpOyglSDtgqQgKGtleW9mIFNvbmFtdURCQ29uZmlnKVxuICAgKiBAcmV0dXJucyDsnpHsl4Ug6rKw6rO8XG4gICAqL1xuICBhc3luYyBydW5BY3Rpb24oXG4gICAgYWN0aW9uOiBcImFwcGx5XCIgfCBcInJvbGxiYWNrXCIsXG4gICAgdGFyZ2V0czogKGtleW9mIFNvbmFtdURCQ29uZmlnKVtdLFxuICApOiBQcm9taXNlPE1pZ3JhdGlvblJlc3VsdD4ge1xuICAgIE5haXRlLnQoXCJtaWdyYXRvcjpydW5BY3Rpb246YWN0aW9uXCIsIGFjdGlvbik7XG4gICAgTmFpdGUudChcIm1pZ3JhdG9yOnJ1bkFjdGlvbjp0YXJnZXRzXCIsIHRhcmdldHMpO1xuXG4gICAgY29uc3QgYWxsb3dlZFRhcmdldHMgPSBuZXcgU2V0KHRoaXMuZ2V0TWlncmF0aW9uVGFyZ2V0S2V5cygpKTtcbiAgICBjb25zdCBkaXNhbGxvd2VkVGFyZ2V0cyA9IHRhcmdldHMuZmlsdGVyKCh0YXJnZXQpID0+ICFhbGxvd2VkVGFyZ2V0cy5oYXModGFyZ2V0KSk7XG4gICAgaWYgKGRpc2FsbG93ZWRUYXJnZXRzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYE1pZ3JhdGlvbiB0YXJnZXRzIGFyZSBub3QgYWxsb3dlZCBpbiBOT0RFX0VOVj0ke2dldFNvbmFtdUVudmlyb25tZW50KCl9OiAke2Rpc2FsbG93ZWRUYXJnZXRzLmpvaW4oXCIsIFwiKX1gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBnZXQgdW5pcSBrbmV4IGNvbmZpZ3NcbiAgICBjb25zdCBjb25maWdzID0gdW5pcXVlKFxuICAgICAgdGFyZ2V0c1xuICAgICAgICAubWFwKCh0YXJnZXQpID0+ICh7XG4gICAgICAgICAgY29ubktleTogdGFyZ2V0LFxuICAgICAgICAgIG9wdGlvbnM6IFNvbmFtdS5kYkNvbmZpZ1t0YXJnZXRdLFxuICAgICAgICB9KSlcbiAgICAgICAgLmZpbHRlcigoYykgPT4gYy5vcHRpb25zICE9PSB1bmRlZmluZWQpLFxuICAgICAgKHsgb3B0aW9ucyB9KSA9PlxuICAgICAgICBgJHsob3B0aW9ucy5jb25uZWN0aW9uIGFzIEtuZXguUGdDb25uZWN0aW9uQ29uZmlnKS5ob3N0fToke1xuICAgICAgICAgIChvcHRpb25zLmNvbm5lY3Rpb24gYXMgS25leC5QZ0Nvbm5lY3Rpb25Db25maWcpLnBvcnQgPz8gNTQzMlxuICAgICAgICB9LyR7KG9wdGlvbnMuY29ubmVjdGlvbiBhcyBLbmV4LlBnQ29ubmVjdGlvbkNvbmZpZykuZGF0YWJhc2V9YCxcbiAgICApO1xuXG4gICAgLy8gZ2V0IGNvbm5lY3Rpb25zXG4gICAgY29uc3QgY29ubnMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGNvbmZpZ3MubWFwKGFzeW5jIChjb25maWcpID0+ICh7XG4gICAgICAgIGNvbm5LZXk6IGNvbmZpZy5jb25uS2V5LFxuICAgICAgICBrbmV4OiBjcmVhdGVLbmV4SW5zdGFuY2UoY29uZmlnLm9wdGlvbnMpLFxuICAgICAgfSkpLFxuICAgICk7XG5cbiAgICB0cnkge1xuICAgICAgLy8gYWN0aW9uXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBzd2l0Y2ggKGFjdGlvbikge1xuICAgICAgICAgIGNhc2UgXCJhcHBseVwiOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucnVuTWlncmF0aW9uc1NlcXVlbnRpYWxseShjb25ucywgXCJhcHBseVwiKTtcbiAgICAgICAgICBjYXNlIFwicm9sbGJhY2tcIjpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJ1bk1pZ3JhdGlvbnNTZXF1ZW50aWFsbHkoY29ubnMsIFwicm9sbGJhY2tcIik7XG4gICAgICAgIH1cbiAgICAgIH0pKCk7XG5cbiAgICAgIE5haXRlLnQoXCJtaWdyYXRvcjpydW5BY3Rpb246cmVzdWx0XCIsIHJlc3VsdCk7XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBjb25ucy5tYXAoKHsga25leCB9KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGtuZXguZGVzdHJveSgpO1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOyCreygnCDqsIDriqXtlZwg66eI7J206re466CI7J207IWYIOy9lOuTnCDtjIzsnbzsnYQg6rKA7Kad7ZWp64uI64ukLlxuICAgKlxuICAgKiBAcGFyYW0gY29ubnMg66eI7J206re466CI7J207IWYIOyDge2DnCDrsLDsl7RcbiAgICogQHBhcmFtIGNvZGVOYW1lcyDsgq3soJztlaAg66eI7J206re466CI7J207IWYIOy9lOuTnCDtjIzsnbwg7J2066aEIOuwsOyXtFxuICAgKiBAcmV0dXJucyDsgq3soJwg6rCA64qlIOyXrOu2gCDrsI8g7KCB7Jqp65CcIOuniOydtOq3uOugiOydtOyFmCDsvZTrk5wg7YyM7J28IOydtOumhFxuICAgKi9cbiAgdmFsaWRhdGVEZWxldGFibGUoY29ubnM6IE1pZ3JhdGlvblN0YXR1c1tcImNvbm5zXCJdLCBjb2RlTmFtZXM6IHN0cmluZ1tdKSB7XG4gICAgY29uc3QgYXBwbGllZENvZGVzID0gY29kZU5hbWVzLmZpbHRlcigoY29kZU5hbWUpID0+XG4gICAgICBjb25ucy5zb21lKChjb25uKSA9PiAhY29ubi5wZW5kaW5nLmluY2x1ZGVzKGNvZGVOYW1lKSksXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICBjYW5EZWxldGU6IGFwcGxpZWRDb2Rlcy5sZW5ndGggPT09IDAsXG4gICAgICBhcHBsaWVkQ29kZXMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDrp4jsnbTqt7jroIjsnbTshZgg7L2U65OcIO2MjOydvOydhCDsgq3soJztlanri4jri6QuXG4gICAqXG4gICAqIFNvbmFtdSBVSeyXkOyEnCDsgqzsmqnrkKnri4jri6QuXG4gICAqXG4gICAqIEBwYXJhbSBjb2RlTmFtZXMg7IKt7KCc7ZWgIOuniOydtOq3uOugiOydtOyFmCDsvZTrk5wg7YyM7J28IOydtOumhCDrsLDsl7RcbiAgICogQHJldHVybnMg7IKt7KCc65CcIOuniOydtOq3uOugiOydtOyFmCDsvZTrk5wg7YyM7J28IOqwnOyImFxuICAgKi9cbiAgYXN5bmMgZGVsQ29kZXMoY29kZU5hbWVzOiBzdHJpbmdbXSk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgeyBjb25ucyB9ID0gYXdhaXQgdGhpcy5nZXRTdGF0dXMoKTtcbiAgICBjb25zdCB7IGNhbkRlbGV0ZSwgYXBwbGllZENvZGVzIH0gPSB0aGlzLnZhbGlkYXRlRGVsZXRhYmxlKGNvbm5zLCBjb2RlTmFtZXMpO1xuICAgIGlmICghY2FuRGVsZXRlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBZb3UgY2Fubm90IGRlbGV0ZSBhIG1pZ3JhdGlvbiBmaWxlIGlmIHRoZXJlIGlzIGFscmVhZHkgYXBwbGllZC4gQXBwbGllZCBjb2RlczogJHthcHBsaWVkQ29kZXMuam9pbihcIiwgXCIpfWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBzdW0oXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgY29kZU5hbWVzLm1hcChhc3luYyAoY29kZU5hbWUpID0+IHtcbiAgICAgICAgICBjb25zdCBmaWxlUGF0aCA9IGAke1NvbmFtdS5hcGlSb290UGF0aH0vc3JjL21pZ3JhdGlvbnMvJHtjb2RlTmFtZX0udHNgO1xuICAgICAgICAgIGlmIChhd2FpdCBleGlzdHMoZmlsZVBhdGgpKSB7XG4gICAgICAgICAgICBhd2FpdCB1bmxpbmsoZmlsZVBhdGgpO1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9KSxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2VuRGF0ZVRhZyhpbmRleDogbnVtYmVyLCBiYXNlRGF0ZTogRGF0ZSA9IG5ldyBEYXRlKCkpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShiYXNlRGF0ZS5nZXRUaW1lKCkgKyBpbmRleCAqIDEwMDApO1xuICAgIGNvbnN0IHBhZCA9IChudW06IG51bWJlciwgc2l6ZTogbnVtYmVyID0gMikgPT4gbnVtLnRvU3RyaW5nKCkucGFkU3RhcnQoc2l6ZSwgXCIwXCIpO1xuICAgIHJldHVybiAoXG4gICAgICBkYXRlLmdldEZ1bGxZZWFyKCkudG9TdHJpbmcoKSArXG4gICAgICBwYWQoZGF0ZS5nZXRNb250aCgpICsgMSkgK1xuICAgICAgcGFkKGRhdGUuZ2V0RGF0ZSgpKSArXG4gICAgICBwYWQoZGF0ZS5nZXRIb3VycygpKSArXG4gICAgICBwYWQoZGF0ZS5nZXRNaW51dGVzKCkpICtcbiAgICAgIHBhZChkYXRlLmdldFNlY29uZHMoKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIOuniOydtOq3uOugiOydtOyFmCDsvZTrk5wg7YyM7J287J2EIOyDneyEse2VqeuLiOuLpC5cbiAgICpcbiAgICogU29uYW11IFVJ7JeQ7IScIOyCrOyaqeuQqeuLiOuLpC5cbiAgICpcbiAgICogQHJldHVybnMg7IOd7ISx65CcIOuniOydtOq3uOugiOydtOyFmCDsvZTrk5wg7YyM7J28IOqwnOyImFxuICAgKi9cbiAgYXN5bmMgZ2VuZXJhdGVQcmVwYXJlZENvZGVzKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgeyBwcmVwYXJlZENvZGVzIH0gPSBhd2FpdCB0aGlzLmdldFN0YXR1cygpO1xuICAgIE5haXRlLnQoXCJtaWdyYXRvcjpnZW5lcmF0ZVByZXBhcmVkQ29kZXM6cHJlcGFyZWRDb2Rlc1wiLCBwcmVwYXJlZENvZGVzKTtcbiAgICBpZiAocHJlcGFyZWRDb2Rlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKFwiXFxu7ZiE7J6sIOuqqOuRkCDsi7HtgazrkJwg7IOB7YOc7J6F64uI64ukLlwiKSk7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICAvLyDsi6TsoJwg7L2U65OcIOyDneyEsVxuICAgIGNvbnN0IG1pZ3JhdGlvbnNEaXIgPSBgJHtTb25hbXUuYXBpUm9vdFBhdGh9L3NyYy9taWdyYXRpb25zYDtcblxuICAgIGZvciAoY29uc3QgW2luZGV4LCBwY29kZV0gb2YgcHJlcGFyZWRDb2Rlcy5lbnRyaWVzKCkpIHtcbiAgICAgIGlmIChwY29kZS5mb3JtYXR0ZWQpIHtcbiAgICAgICAgY29uc3QgZGF0ZVRhZyA9IHRoaXMuZ2VuRGF0ZVRhZyhpbmRleCk7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gYCR7bWlncmF0aW9uc0Rpcn0vJHtkYXRlVGFnfV8ke3Bjb2RlLnRpdGxlfS50c2A7XG4gICAgICAgIGF3YWl0IHdyaXRlRmlsZShmaWxlUGF0aCwgcGNvZGUuZm9ybWF0dGVkKTtcbiAgICAgICAgIWlzVGVzdCgpICYmIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKGBNSUdSQVRJT04gQ1JFQVRFRCAke2ZpbGVQYXRofWApKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcHJlcGFyZWRDb2Rlcy5sZW5ndGg7XG4gIH1cblxuICBhc3luYyBjb21wYXJlTWlncmF0aW9ucyhjb21wYXJlREI6IEtuZXgpOiBQcm9taXNlPEdlbk1pZ3JhdGlvbkNvZGVbXT4ge1xuICAgIC8vIEVudGl0eSDsiJztmoztlZjsl6wg7Iux7YGsXG4gICAgY29uc3QgZW50aXR5SWRzID0gRW50aXR5TWFuYWdlci5nZXRBbGxJZHMoKTtcblxuICAgIC8vIOyhsOyduO2FjOydtOu4lCDtj6ztlajtlZjsl6wgRW50aXR57JeQ7IScIE1pZ3JhdGlvblNldCDstpTstpxcbiAgICBjb25zdCBlbnRpdHlTZXRzV2l0aEpvaW5UYWJsZSA9IGVudGl0eUlkc1xuICAgICAgLmZpbHRlcigoZW50aXR5SWQpID0+IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKS5wcm9wcy5sZW5ndGggPiAwKVxuICAgICAgLm1hcCgoZW50aXR5SWQpID0+IGdldE1pZ3JhdGlvblNldEZyb21FbnRpdHkoRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpKSk7XG5cbiAgICAvLyDsobDsnbjthYzsnbTruJTrp4wg7LaU7LacXG4gICAgY29uc3Qgam9pblRhYmxlc1dpdGhEdXAgPSBlbnRpdHlTZXRzV2l0aEpvaW5UYWJsZS5mbGF0TWFwKChlbnRpdHlTZXQpID0+IGVudGl0eVNldC5qb2luVGFibGVzKTtcbiAgICAvLyDspJHrs7Ug7KCc6rGwICjspJHrs7Xsnbgg6rK97JqwIGluZGV4ZXPrpbwg67OR7ZWpKVxuICAgIGNvbnN0IGpvaW5UYWJsZXMgPSBPYmplY3QudmFsdWVzKGdyb3VwKGpvaW5UYWJsZXNXaXRoRHVwLCAoanQpID0+IGp0LnRhYmxlKSkubWFwKCh0YWJsZXMpID0+IHtcbiAgICAgIGFzc2VydCh0YWJsZXMgIT09IHVuZGVmaW5lZCwgXCJ0YWJsZXMgaXMgdW5kZWZpbmVkXCIpO1xuICAgICAgaWYgKHRhYmxlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIHRhYmxlc1swXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnRhYmxlc1swXSxcbiAgICAgICAgaW5kZXhlczogdW5pcXVlKFxuICAgICAgICAgIHRhYmxlcy5mbGF0TWFwKCh0KSA9PiB0LmluZGV4ZXMpLFxuICAgICAgICAgIChpbmRleCkgPT4gW2luZGV4LnR5cGUsIC4uLmluZGV4LmNvbHVtbnNdLmpvaW4oXCItXCIpLFxuICAgICAgICApLFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8vIOyhsOyduO2FjOydtOu4lCDtj6ztlajtlZjsl6wgTWlncmF0aW9uU2V0IOuwsOyXtFxuICAgIGNvbnN0IGVudGl0eVNldHM6IE1pZ3JhdGlvblNldFtdID0gWy4uLmVudGl0eVNldHNXaXRoSm9pblRhYmxlLCAuLi5qb2luVGFibGVzXTtcblxuICAgIGNvbnN0IGNvZGVzOiBHZW5NaWdyYXRpb25Db2RlW10gPSBbXTtcbiAgICBjb25zdCBiYXRjaFNpemUgPSA0O1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbnRpdHlTZXRzLmxlbmd0aDsgaSArPSBiYXRjaFNpemUpIHtcbiAgICAgIGNvbnN0IGJhdGNoQ29kZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgZW50aXR5U2V0cy5zbGljZShpLCBpICsgYmF0Y2hTaXplKS5tYXAoYXN5bmMgKGVudGl0eVNldCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGRiU2V0ID0gYXdhaXQgUG9zdGdyZVNRTFNjaGVtYVJlYWRlci5nZXRNaWdyYXRpb25TZXRGcm9tREIoXG4gICAgICAgICAgICBjb21wYXJlREIsXG4gICAgICAgICAgICBlbnRpdHlTZXQudGFibGUsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBOYWl0ZS50KGBtaWdyYXRvcjpjb21wYXJlTWlncmF0aW9uczplbnRpdHlTZXQ6JHtlbnRpdHlTZXQudGFibGV9YCwgZW50aXR5U2V0KTtcbiAgICAgICAgICBOYWl0ZS50KGBtaWdyYXRvcjpjb21wYXJlTWlncmF0aW9uczpkYlNldDoke2VudGl0eVNldC50YWJsZX1gLCBkYlNldCk7XG5cbiAgICAgICAgICBpZiAoZGJTZXQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIOq4sOyhtCDthYzsnbTruJQg7JeG7J2MLCDsg4jroZwg7YWM7J2067iUIOyDneyEsVxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGdlbmVyYXRlQ3JlYXRlQ29kZShlbnRpdHlTZXQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyDquLDsobQg7YWM7J2067iUIOyhtOyerO2VmOuKlCDsvIDsnbTsiqRcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBnZW5lcmF0ZUFsdGVyQ29kZShlbnRpdHlTZXQsIGRiU2V0LCBjb21wYXJlREIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICApO1xuXG4gICAgICBjb2Rlcy5wdXNoKC4uLmJhdGNoQ29kZXMuZmxhdCgpKTtcbiAgICB9XG5cbiAgICAvLyBub3JtYWwg7YOA7J6F7J20IOyVnuycvOuhnCwgZm9yZWlnbuydtCDrkqTroZxcbiAgICBjb2Rlcy5zb3J0KChjb2RlQSwgY29kZUIpID0+IHtcbiAgICAgIGlmIChjb2RlQS50eXBlID09PSBcImZvcmVpZ25cIiAmJiBjb2RlQi50eXBlID09PSBcIm5vcm1hbFwiKSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfSBlbHNlIGlmIChjb2RlQS50eXBlID09PSBcIm5vcm1hbFwiICYmIGNvZGVCLnR5cGUgPT09IFwiZm9yZWlnblwiKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNvZGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNoYWRvdyBEQiDthYzsiqTtirjrpbwg7KeE7ZaJ7ZWp64uI64ukLlxuICAgKlxuICAgKiBTb25hbXUgVUnsl5DshJwg7IKs7Jqp65Cp64uI64ukLlxuICAgKlxuICAgKiBAcmV0dXJucyBTaGFkb3cgREIg7YWM7Iqk7Yq4IOqysOqzvFxuICAgKi9cbiAgYXN5bmMgcnVuU2hhZG93VGVzdCgpOiBQcm9taXNlPE1pZ3JhdGlvblJlc3VsdD4ge1xuICAgIGNvbnN0IGJhc2VUZXN0Q29ubiA9IFNvbmFtdS5kYkNvbmZpZy50ZXN0LmNvbm5lY3Rpb24gYXMgS25leC5QZ0Nvbm5lY3Rpb25Db25maWc7XG4gICAgY29uc3Qgd29ya2VySWQgPSBwcm9jZXNzLmVudi5TT05BTVVfV09SS0VSX0RCID09PSBcInRydWVcIiA/IHByb2Nlc3MuZW52LlZJVEVTVF9QT09MX0lEIDogbnVsbDtcbiAgICBjb25zdCB0ZW1wbGF0ZURhdGFiYXNlID1cbiAgICAgIHdvcmtlcklkICE9PSBudWxsID8gYCR7YmFzZVRlc3RDb25uLmRhdGFiYXNlfV8ke3dvcmtlcklkID8/IFwiMVwifWAgOiBiYXNlVGVzdENvbm4uZGF0YWJhc2U7XG4gICAgY29uc3QgdGRiQ29ubiA9IHsgLi4uYmFzZVRlc3RDb25uLCBkYXRhYmFzZTogdGVtcGxhdGVEYXRhYmFzZSB9O1xuICAgIGNvbnN0IHNoYWRvd0RhdGFiYXNlID0gYCR7dGVtcGxhdGVEYXRhYmFzZX1fX21pZ3JhdGlvbl9zaGFkb3dgO1xuXG4gICAgLy8g7YWM7Iqk7Yq4IOyDge2ZqeyXkOyEnOuKlCDtirjrnpzsnq3shZjsnYQg7LSI6riw7ZmU7ZWY6rOgLCDsg4gg642w7J207YSw67Kg7J207IqkIOy7pOuEpeyFmOydhCDqsIDsoLjsmYDslbwg7ZWoXG4gICAgaWYgKGlzVGVzdCgpKSB7XG4gICAgICBhd2FpdCBEQi5jbGVhclRlc3RUcmFuc2FjdGlvbigpO1xuICAgICAgYXdhaXQgREIuZGVzdHJveSgpO1xuICAgIH1cblxuICAgIC8vIOq4sOyhtCBTaGFkb3cgREIg7IKt7KCcIO2bhCBTaGFkb3cgREIg7IOd7ISxXG4gICAgY29uc3QgdGRiID0gY3JlYXRlS25leEluc3RhbmNlKHtcbiAgICAgIC4uLlNvbmFtdS5kYkNvbmZpZy50ZXN0LFxuICAgICAgY29ubmVjdGlvbjoge1xuICAgICAgICAuLi5iYXNlVGVzdENvbm4sXG4gICAgICAgIGRhdGFiYXNlOiBcInBvc3RncmVzXCIsXG4gICAgICB9LFxuICAgIH0pO1xuICAgIHRyeSB7XG4gICAgICAhaXNUZXN0KCkgJiYgY29uc29sZS5sb2coY2hhbGsubWFnZW50YShgJHtzaGFkb3dEYXRhYmFzZX0g7IKt7KCcYCkpO1xuICAgICAgYXdhaXQgdGRiLnJhdyhgRFJPUCBEQVRBQkFTRSBJRiBFWElTVFMgJHtzaGFkb3dEYXRhYmFzZX1gKTtcbiAgICAgIGF3YWl0IHRkYi5yYXcoYFxuICAgICAgICBTRUxFQ1QgcGdfdGVybWluYXRlX2JhY2tlbmQocGdfc3RhdF9hY3Rpdml0eS5waWQpXG4gICAgICAgIEZST00gcGdfc3RhdF9hY3Rpdml0eVxuICAgICAgICBXSEVSRSBkYXRuYW1lID0gJyR7dGRiQ29ubi5kYXRhYmFzZX0nXG4gICAgICAgICAgQU5EIHBpZCA8PiBwZ19iYWNrZW5kX3BpZCgpO1xuICAgICAgYCk7XG4gICAgICBhd2FpdCB0ZGIucmF3KGBDUkVBVEUgREFUQUJBU0UgJHtzaGFkb3dEYXRhYmFzZX0gVEVNUExBVEUgJHt0ZGJDb25uLmRhdGFiYXNlfWApO1xuXG4gICAgICAvLyBTaGFkb3cgRELsl5Ag7Jew6rKwXG4gICAgICBjb25zdCBzZGIgPSBjcmVhdGVLbmV4SW5zdGFuY2Uoe1xuICAgICAgICAuLi5Tb25hbXUuZGJDb25maWcudGVzdCxcbiAgICAgICAgY29ubmVjdGlvbjoge1xuICAgICAgICAgIC4uLnRkYkNvbm4sXG4gICAgICAgICAgZGF0YWJhc2U6IHNoYWRvd0RhdGFiYXNlLFxuICAgICAgICAgIHBhc3N3b3JkOiB0ZGJDb25uLnBhc3N3b3JkLFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIC8vIHNoYWRvdyBEQiDthYzsiqTtirgg7KeE7ZaJXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBbYmF0Y2hObywgYXBwbGllZF0gPSBhd2FpdCBzZGIubWlncmF0ZS5sYXRlc3QoKTtcbiAgICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oXCJTaGFkb3cgREIg7YWM7Iqk7Yq47JeQIOyEseqzte2WiOyKteuLiOuLpCFcIiksIHtcbiAgICAgICAgICAgIGJhdGNoTm8sXG4gICAgICAgICAgICBhcHBsaWVkLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgY29ubktleTogXCJzaGFkb3dcIixcbiAgICAgICAgICAgIGJhdGNoTm8sXG4gICAgICAgICAgICBhcHBsaWVkLFxuICAgICAgICAgIH0sXG4gICAgICAgIF07XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgIHRocm93IG5ldyBTZXJ2aWNlVW5hdmFpbGFibGVFeGNlcHRpb24oU0QoXCJzb25hbXUuZXJyb3Iuc2hhZG93RGJUZXN0RmFpbGVkXCIpKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGF3YWl0IHNkYi5kZXN0cm95KCk7XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIC8vIFNoYWRvdyBEQiDsgq3soJxcbiAgICAgICFpc1Rlc3QoKSAmJiBjb25zb2xlLmxvZyhjaGFsay5tYWdlbnRhKGAke3NoYWRvd0RhdGFiYXNlfSDsgq3soJxgKSk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0ZGIucmF3KGBEUk9QIERBVEFCQVNFIElGIEVYSVNUUyAke3NoYWRvd0RhdGFiYXNlfWApO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiU2hhZG93IERCIOygleumrCDsi6TtjKg6XCIsIGUpOyAvLyDsnbTqsowg7JeG7Jy866m0IOyhsOyaqe2eiCDriITsiJhcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGF3YWl0IHRkYi5kZXN0cm95KCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXdDQSxTQUFTLFlBQWUsU0FBcUIsSUFBWSxXQUFvQztDQUMzRixPQUFPLElBQUksU0FBWSxTQUFTLFdBQVc7RUFDekMsTUFBTSxRQUFRLGlCQUFpQixPQUFPLFVBQVUsQ0FBQyxHQUFHLEVBQUU7RUFDdEQsUUFBUSxNQUNMLFVBQVU7R0FDVCxhQUFhLEtBQUs7R0FDbEIsUUFBUSxLQUFLO0VBQ2YsSUFDQyxVQUFVO0dBQ1QsYUFBYSxLQUFLO0dBQ2xCLE9BQU8sS0FBSztFQUNkLENBQ0Y7Q0FDRixDQUFDO0FBQ0g7OzthQTlDc0M7U0FDSDtXQUVrQjtTQUN0QjtxQkFDeUI7VUFDWDtvQkFDNEI7WUFDbkM7aUJBRWU7ZUFDWDtzQkFDK0I7b0JBQ2Q7K0JBQ1E7Q0FZN0QsNEJBQTRCO0NBc0JyQixXQUFiLE1BQXNCO0VBQ3BCLDZCQUFxQyxPQUF5QjtHQUM1RCxJQUFJLE9BQU8sVUFBVSxZQUFZLFVBQVUsTUFDekMsT0FBTztHQUdULE1BQU0scUJBQXFCO0dBQzNCLE9BQ0UsbUJBQW1CLFNBQVMsV0FDNUIsT0FBTyxtQkFBbUIsWUFBWSxZQUN0QyxtQkFBbUIsUUFBUSxTQUFTLGlCQUFpQjtFQUV6RDtFQUVBLHlCQUEyRDtHQUN6RCxNQUFNLFdBQVcsT0FBTyxLQUFLLE9BQU8sUUFBUSxD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
|