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
|
@@ -325,7 +325,7 @@ async function generateCreateCode_ColumnAndIndexes(table, columns, indexes) {
|
|
|
325
325
|
const resolvedColumns = resolveSearchTextColumns(table, columns);
|
|
326
326
|
const columnDefs = genColumnDefinitions(table, resolvedColumns);
|
|
327
327
|
const lines = [
|
|
328
|
-
"import { Knex } from \"knex\";",
|
|
328
|
+
"import type { Knex } from \"knex\";",
|
|
329
329
|
"",
|
|
330
330
|
"export async function up(knex: Knex): Promise<void> {",
|
|
331
331
|
...getSearchTextHelperDefinitions(table, resolvedColumns),
|
|
@@ -532,7 +532,7 @@ async function generateCreateCode_Foreign(table, foreigns) {
|
|
|
532
532
|
const { up, down } = genForeignDefinitions(table, foreigns);
|
|
533
533
|
if (up.length === 0 && down.length === 0) return [];
|
|
534
534
|
const lines = [
|
|
535
|
-
"import { Knex } from \"knex\";",
|
|
535
|
+
"import type { Knex } from \"knex\";",
|
|
536
536
|
"",
|
|
537
537
|
"export async function up(knex: Knex): Promise<void> {",
|
|
538
538
|
`return knex.schema.alterTable("${table}", (table) => {`,
|
|
@@ -631,7 +631,7 @@ async function generateAlterCode_ColumnAndIndexes(table, entityColumns, entityIn
|
|
|
631
631
|
...indexNeedsToDrop.map((index) => genIndexDefinition(index, table))
|
|
632
632
|
];
|
|
633
633
|
const formatted = await formatCode([
|
|
634
|
-
"import { Knex } from \"knex\";",
|
|
634
|
+
"import type { Knex } from \"knex\";",
|
|
635
635
|
"",
|
|
636
636
|
"export async function up(knex: Knex): Promise<void> {",
|
|
637
637
|
...upBuilderLines.length > 0 ? [
|
|
@@ -948,7 +948,7 @@ async function generateAlterCode_Foreigns(table, entityForeigns, dbForeigns, dro
|
|
|
948
948
|
throw new Error("FK 변경 코드 생성 오류");
|
|
949
949
|
}
|
|
950
950
|
const formatted = await formatCode([
|
|
951
|
-
"import { Knex } from \"knex\";",
|
|
951
|
+
"import type { Knex } from \"knex\";",
|
|
952
952
|
"",
|
|
953
953
|
"export async function up(knex: Knex): Promise<void> {",
|
|
954
954
|
`return knex.schema.alterTable("${table}", (table) => {`,
|
|
@@ -1097,7 +1097,7 @@ async function generatePkTypeChangeMigration(table, entityIdCol, dbIdCol, _entit
|
|
|
1097
1097
|
downLines.push(` await knex.raw('ALTER TABLE "${fk.tableName}" ADD CONSTRAINT "${fk.constraintName}" FOREIGN KEY ("${fk.columnName}") REFERENCES "${table}"("id") ON UPDATE ${fk.onUpdate} ON DELETE ${fk.onDelete}');`);
|
|
1098
1098
|
}
|
|
1099
1099
|
const formatted = await formatCode([
|
|
1100
|
-
"import { Knex } from \"knex\";",
|
|
1100
|
+
"import type { Knex } from \"knex\";",
|
|
1101
1101
|
"",
|
|
1102
1102
|
"export async function up(knex: Knex): Promise<void> {",
|
|
1103
1103
|
...upLines,
|
|
@@ -1318,4 +1318,4 @@ $$\`);`
|
|
|
1318
1318
|
init_code_generation();
|
|
1319
1319
|
export { generateAlterCode, generateCreateCode, getAlterIndexesTo, init_code_generation, setMigrationIndexDefaults };
|
|
1320
1320
|
|
|
1321
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZS1nZW5lcmF0aW9uLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taWdyYXRpb24vY29kZS1nZW5lcmF0aW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBlcXVhbCBmcm9tIFwiZmFzdC1kZWVwLWVxdWFsXCI7XG5pbXBvcnQgeyB0eXBlIEtuZXggfSBmcm9tIFwia25leFwiO1xuaW1wb3J0IHsgYWxwaGFiZXRpY2FsLCBkaWZmIH0gZnJvbSBcInJhZGFzaGlcIjtcblxuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IE5haXRlIH0gZnJvbSBcIi4uL25haXRlL25haXRlXCI7XG5pbXBvcnQge1xuICB0eXBlIEVudGl0eVByb3AsXG4gIHR5cGUgR2VuTWlncmF0aW9uQ29kZSxcbiAgdHlwZSBNaWdyYXRpb25Db2x1bW4sXG4gIHR5cGUgTWlncmF0aW9uRm9yZWlnbixcbiAgdHlwZSBNaWdyYXRpb25JbmRleCxcbiAgdHlwZSBNaWdyYXRpb25TZXQsXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgaXNTZWFyY2hUZXh0UHJvcCB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgZm9ybWF0Q29kZSB9IGZyb20gXCIuLi91dGlscy9mb3JtYXR0ZXJcIjtcbmltcG9ydCB7IGRpZmZlcmVuY2VXaXRoLCBpbnRlcnNlY3Rpb25CeSB9IGZyb20gXCIuLi91dGlscy91dGlsc1wiO1xuaW1wb3J0IHtcbiAgbm9ybWFsaXplSW5kZXhXaGVyZVByZWRpY2F0ZSxcbiAgbm9ybWFsaXplSW5kZXhXaGVyZVByZWRpY2F0ZUZvckNvbXBhcmlzb24sXG59IGZyb20gXCIuL2luZGV4LXdoZXJlLXByZWRpY2F0ZVwiO1xuaW1wb3J0IHsgUG9zdGdyZVNRTFNjaGVtYVJlYWRlciB9IGZyb20gXCIuL3Bvc3RncmVzcWwtc2NoZW1hLXJlYWRlclwiO1xuXG4vKipcbiAqIOy7rOufvCDsoJXsnZgg6rKw6rO8IO2DgOyehVxuICogLSBidWlsZGVyOiBLbmV4IHRhYmxlIGJ1aWxkZXIg66mU7ISc65Oc66GcIOyLpO2Wie2VoCDqtazrrLggKHRhYmxlLnh4eCgpKVxuICogLSByYXc6IGtuZXgucmF3KCnroZwg7Iuk7ZaJ7ZWgIOq1rOusuFxuICovXG50eXBlIENvbHVtbkRlZmluaXRpb25SZXN1bHQgPSB7XG4gIGJ1aWxkZXI6IHN0cmluZ1tdO1xuICByYXc6IHN0cmluZ1tdO1xufTtcblxudHlwZSBTZWFyY2hUZXh0SGVscGVyS2luZCA9IFwidGV4dC1hcnJheVwiIHwgXCJqc29uYi1hcnJheVwiO1xuXG50eXBlIFNlYXJjaFRleHRFeHByZXNzaW9uVG9rZW4gPVxuICB8IHsgdHlwZTogXCJpZGVudGlmaWVyXCI7IHZhbHVlOiBzdHJpbmcgfVxuICB8IHsgdHlwZTogXCJxdW90ZWRJZGVudGlmaWVyXCI7IHZhbHVlOiBzdHJpbmcgfVxuICB8IHsgdHlwZTogXCJzdHJpbmdcIjsgdmFsdWU6IHN0cmluZyB9XG4gIHwgeyB0eXBlOiBcInN5bWJvbFwiOyB2YWx1ZTogXCIoXCIgfCBcIilcIiB8IFwiLFwiIH1cbiAgfCB7IHR5cGU6IFwib3BlcmF0b3JcIjsgdmFsdWU6IFwifHxcIiB8IFwiOjpcIiB9O1xuXG50eXBlIFNlYXJjaFRleHRFeHByZXNzaW9uTm9kZSA9XG4gIHwgeyB0eXBlOiBcImlkZW50aWZpZXJcIjsgbmFtZTogc3RyaW5nOyBxdW90ZWQ6IGJvb2xlYW4gfVxuICB8IHsgdHlwZTogXCJzdHJpbmdcIjsgdmFsdWU6IHN0cmluZyB9XG4gIHwgeyB0eXBlOiBcImJvb2xlYW5cIjsgdmFsdWU6IGJvb2xlYW4gfVxuICB8IHsgdHlwZTogXCJmdW5jdGlvblwiOyBuYW1lOiBzdHJpbmc7IGFyZ3M6IFNlYXJjaFRleHRFeHByZXNzaW9uTm9kZVtdIH1cbiAgfCB7IHR5cGU6IFwiY29uY2F0XCI7IHBhcnRzOiBTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGVbXSB9XG4gIHwgeyB0eXBlOiBcImNvbGxhdGVcIjsgZXhwcjogU2VhcmNoVGV4dEV4cHJlc3Npb25Ob2RlOyBjb2xsYXRpb246IHN0cmluZzsgcXVvdGVkOiBib29sZWFuIH1cbiAgfCB7IHR5cGU6IFwiY2FzdFwiOyBleHByOiBTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGU7IHRhcmdldFR5cGU6IHN0cmluZyB9O1xuXG5jb25zdCBTRUFSQ0hfVEVYVF9IRUxQRVJfREVGSU5JVElPTlM6IFJlY29yZDxTZWFyY2hUZXh0SGVscGVyS2luZCwgc3RyaW5nPiA9IHtcbiAgXCJ0ZXh0LWFycmF5XCI6IGBhd2FpdCBrbmV4LnJhdyhcXGBDUkVBVEUgT1IgUkVQTEFDRSBGVU5DVElPTiBzb25hbXVfdGV4dF9hcnJheV9hZ2coYXJyIHRleHRbXSwgY2kgYm9vbGVhbiBERUZBVUxUIHRydWUpXG5SRVRVUk5TIHRleHRcbkxBTkdVQUdFIHNxbCBJTU1VVEFCTEUgUEFSQUxMRUwgU0FGRSBSRVRVUk5TIE5VTEwgT04gTlVMTCBJTlBVVFxuQVMgJCRcbiAgU0VMRUNUIHN0cmluZ19hZ2coXG4gICAgQ0FTRSBXSEVOIGNpIFRIRU4gbG93ZXIodmFsdWUpIEVMU0UgdmFsdWUgRU5ELFxuICAgICcgJ1xuICApXG4gIEZST00gdW5uZXN0KGFycikgQVMgdmFsdWVcbiQkXFxgKTtgLFxuICBcImpzb25iLWFycmF5XCI6IGBhd2FpdCBrbmV4LnJhdyhcXGBDUkVBVEUgT1IgUkVQTEFDRSBGVU5DVElPTiBzb25hbXVfanNvbmJfYXJyYXlfYWdnKGFyciBqc29uYiwgY2kgYm9vbGVhbiBERUZBVUxUIHRydWUpXG5SRVRVUk5TIHRleHRcbkxBTkdVQUdFIHNxbCBJTU1VVEFCTEUgUEFSQUxMRUwgU0FGRSBSRVRVUk5TIE5VTEwgT04gTlVMTCBJTlBVVFxuQVMgJCRcbiAgU0VMRUNUIHN0cmluZ19hZ2coXG4gICAgQ0FTRSBXSEVOIGNpIFRIRU4gbG93ZXIodmFsdWUpIEVMU0UgdmFsdWUgRU5ELFxuICAgICcgJ1xuICApXG4gIEZST00ganNvbmJfYXJyYXlfZWxlbWVudHNfdGV4dChhcnIpXG4kJFxcYCk7YCxcbn07XG5cbmNsYXNzIFNlYXJjaFRleHRFeHByZXNzaW9uUGFyc2VyIHtcbiAgcHJpdmF0ZSBpbmRleCA9IDA7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSB0b2tlbnM6IFNlYXJjaFRleHRFeHByZXNzaW9uVG9rZW5bXSkge31cblxuICBpc0F0RW5kKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmluZGV4ID49IHRoaXMudG9rZW5zLmxlbmd0aDtcbiAgfVxuXG4gIHBhcnNlRXhwcmVzc2lvbigpOiBTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGUge1xuICAgIHJldHVybiB0aGlzLnBhcnNlQ29uY2F0KCk7XG4gIH1cblxuICBwcml2YXRlIHBhcnNlQ29uY2F0KCk6IFNlYXJjaFRleHRFeHByZXNzaW9uTm9kZSB7XG4gICAgY29uc3QgcGFydHMgPSBbdGhpcy5wYXJzZVBvc3RmaXgoKV07XG5cbiAgICB3aGlsZSAodGhpcy5tYXRjaE9wZXJhdG9yKFwifHxcIikpIHtcbiAgICAgIHBhcnRzLnB1c2godGhpcy5wYXJzZVBvc3RmaXgoKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcnRzLmxlbmd0aCA9PT0gMSA/IHBhcnRzWzBdIDogeyB0eXBlOiBcImNvbmNhdFwiLCBwYXJ0cyB9O1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZVBvc3RmaXgoKTogU2VhcmNoVGV4dEV4cHJlc3Npb25Ob2RlIHtcbiAgICBsZXQgbm9kZSA9IHRoaXMucGFyc2VQcmltYXJ5KCk7XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgaWYgKHRoaXMubWF0Y2hPcGVyYXRvcihcIjo6XCIpKSB7XG4gICAgICAgIG5vZGUgPSB7XG4gICAgICAgICAgdHlwZTogXCJjYXN0XCIsXG4gICAgICAgICAgZXhwcjogbm9kZSxcbiAgICAgICAgICB0YXJnZXRUeXBlOiB0aGlzLnBhcnNlVHlwZU5hbWUoKSxcbiAgICAgICAgfTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm1hdGNoSWRlbnRpZmllcihcImNvbGxhdGVcIikpIHtcbiAgICAgICAgY29uc3QgdG9rZW4gPSB0aGlzLmNvbnN1bWVDb2xsYXRpb25Ub2tlbigpO1xuICAgICAgICBub2RlID0ge1xuICAgICAgICAgIHR5cGU6IFwiY29sbGF0ZVwiLFxuICAgICAgICAgIGV4cHI6IG5vZGUsXG4gICAgICAgICAgY29sbGF0aW9uOiB0b2tlbi52YWx1ZSxcbiAgICAgICAgICBxdW90ZWQ6IHRva2VuLnR5cGUgPT09IFwicXVvdGVkSWRlbnRpZmllclwiLFxuICAgICAgICB9O1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxuICBwcml2YXRlIHBhcnNlUHJpbWFyeSgpOiBTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGUge1xuICAgIGNvbnN0IHRva2VuID0gdGhpcy5jb25zdW1lVG9rZW4oXCLtkZztmITsi51cIik7XG5cbiAgICBpZiAodG9rZW4udHlwZSA9PT0gXCJzeW1ib2xcIiAmJiB0b2tlbi52YWx1ZSA9PT0gXCIoXCIpIHtcbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnBhcnNlRXhwcmVzc2lvbigpO1xuICAgICAgdGhpcy5leHBlY3RTeW1ib2woXCIpXCIpO1xuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuXG4gICAgaWYgKHRva2VuLnR5cGUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IFwic3RyaW5nXCIsIHZhbHVlOiB0b2tlbi52YWx1ZSB9O1xuICAgIH1cblxuICAgIGlmICh0b2tlbi50eXBlID09PSBcImlkZW50aWZpZXJcIiB8fCB0b2tlbi50eXBlID09PSBcInF1b3RlZElkZW50aWZpZXJcIikge1xuICAgICAgY29uc3QgbG93ZXJOYW1lID0gdG9rZW4udmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICAgIGlmICh0b2tlbi50eXBlID09PSBcImlkZW50aWZpZXJcIiAmJiAobG93ZXJOYW1lID09PSBcInRydWVcIiB8fCBsb3dlck5hbWUgPT09IFwiZmFsc2VcIikpIHtcbiAgICAgICAgcmV0dXJuIHsgdHlwZTogXCJib29sZWFuXCIsIHZhbHVlOiBsb3dlck5hbWUgPT09IFwidHJ1ZVwiIH07XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm1hdGNoU3ltYm9sKFwiKFwiKSkge1xuICAgICAgICBpZiAodG9rZW4udHlwZSA9PT0gXCJpZGVudGlmaWVyXCIgJiYgbG93ZXJOYW1lID09PSBcInRyaW1cIiAmJiB0aGlzLmlzVHJpbUJvdGhGcm9tRm9ybSgpKSB7XG4gICAgICAgICAgdGhpcy5pbmRleCArPSAyO1xuICAgICAgICAgIGNvbnN0IGFyZyA9IHRoaXMucGFyc2VFeHByZXNzaW9uKCk7XG4gICAgICAgICAgdGhpcy5leHBlY3RTeW1ib2woXCIpXCIpO1xuICAgICAgICAgIHJldHVybiB7IHR5cGU6IFwiZnVuY3Rpb25cIiwgbmFtZTogXCJ0cmltXCIsIGFyZ3M6IFthcmddIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhcmdzID0gdGhpcy5wYXJzZUZ1bmN0aW9uQXJncygpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6IFwiZnVuY3Rpb25cIixcbiAgICAgICAgICBuYW1lOiB0b2tlbi52YWx1ZSxcbiAgICAgICAgICBhcmdzLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBcImlkZW50aWZpZXJcIixcbiAgICAgICAgbmFtZTogdG9rZW4udmFsdWUsXG4gICAgICAgIHF1b3RlZDogdG9rZW4udHlwZSA9PT0gXCJxdW90ZWRJZGVudGlmaWVyXCIsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihg7KeA7JuQ65CY7KeAIOyViuuKlCBzZWFyY2hUZXh0IGV4cHJlc3Npb24gdG9rZW46ICR7dG9rZW4udHlwZX1gKTtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VGdW5jdGlvbkFyZ3MoKTogU2VhcmNoVGV4dEV4cHJlc3Npb25Ob2RlW10ge1xuICAgIGlmICh0aGlzLm1hdGNoU3ltYm9sKFwiKVwiKSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IGFyZ3M6IFNlYXJjaFRleHRFeHByZXNzaW9uTm9kZVtdID0gW107XG4gICAgZG8ge1xuICAgICAgYXJncy5wdXNoKHRoaXMucGFyc2VFeHByZXNzaW9uKCkpO1xuICAgIH0gd2hpbGUgKHRoaXMubWF0Y2hTeW1ib2woXCIsXCIpKTtcblxuICAgIHRoaXMuZXhwZWN0U3ltYm9sKFwiKVwiKTtcbiAgICByZXR1cm4gYXJncztcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VUeXBlTmFtZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBhcnRzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvbnN0IHRva2VuID0gdGhpcy5wZWVrKCk7XG4gICAgICBpZiAoXG4gICAgICAgIHRva2VuPy50eXBlID09PSBcImlkZW50aWZpZXJcIiB8fFxuICAgICAgICB0b2tlbj8udHlwZSA9PT0gXCJxdW90ZWRJZGVudGlmaWVyXCIgfHxcbiAgICAgICAgKHRva2VuPy50eXBlID09PSBcInN5bWJvbFwiICYmXG4gICAgICAgICAgKHRva2VuLnZhbHVlID09PSBcIihcIiB8fCB0b2tlbi52YWx1ZSA9PT0gXCIpXCIgfHwgdG9rZW4udmFsdWUgPT09IFwiLFwiKSlcbiAgICAgICkge1xuICAgICAgICBpZiAodG9rZW4udHlwZSA9PT0gXCJzeW1ib2xcIikge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgcGFydHMucHVzaCh0b2tlbi52YWx1ZS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgdGhpcy5pbmRleCArPSAxO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwi7YOA7J6FIOy6kOyKpO2MhSDrjIDsg4Eg7YOA7J6F7J2EIOywvuydhCDsiJgg7JeG7Iq164uI64ukLlwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFydHMuam9pbihcIiBcIik7XG4gIH1cblxuICBwcml2YXRlIGNvbnN1bWVDb2xsYXRpb25Ub2tlbigpOiBFeHRyYWN0PFxuICAgIFNlYXJjaFRleHRFeHByZXNzaW9uVG9rZW4sXG4gICAgeyB0eXBlOiBcImlkZW50aWZpZXJcIiB8IFwicXVvdGVkSWRlbnRpZmllclwiIH1cbiAgPiB7XG4gICAgY29uc3QgdG9rZW4gPSB0aGlzLnBlZWsoKTtcbiAgICBpZiAodG9rZW4/LnR5cGUgIT09IFwiaWRlbnRpZmllclwiICYmIHRva2VuPy50eXBlICE9PSBcInF1b3RlZElkZW50aWZpZXJcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ09MTEFURSDrjIDsg4Eg7Iud67OE7J6Q66W8IOywvuydhCDsiJgg7JeG7Iq164uI64ukLlwiKTtcbiAgICB9XG4gICAgdGhpcy5pbmRleCArPSAxO1xuICAgIHJldHVybiB0b2tlbjtcbiAgfVxuXG4gIHByaXZhdGUgaXNUcmltQm90aEZyb21Gb3JtKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGJvdGhUb2tlbiA9IHRoaXMucGVlaygpO1xuICAgIGNvbnN0IGZyb21Ub2tlbiA9IHRoaXMucGVlaygxKTtcblxuICAgIHJldHVybiAoXG4gICAgICBib3RoVG9rZW4/LnR5cGUgPT09IFwiaWRlbnRpZmllclwiICYmXG4gICAgICBib3RoVG9rZW4udmFsdWUudG9Mb3dlckNhc2UoKSA9PT0gXCJib3RoXCIgJiZcbiAgICAgIGZyb21Ub2tlbj8udHlwZSA9PT0gXCJpZGVudGlmaWVyXCIgJiZcbiAgICAgIGZyb21Ub2tlbi52YWx1ZS50b0xvd2VyQ2FzZSgpID09PSBcImZyb21cIlxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGV4cGVjdFN5bWJvbCh2YWx1ZTogXCIoXCIgfCBcIilcIiB8IFwiLFwiKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm1hdGNoU3ltYm9sKHZhbHVlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBcIiR7dmFsdWV9XCIg7Yag7YGw7J20IO2VhOyalO2VqeuLiOuLpC5gKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG1hdGNoU3ltYm9sKHZhbHVlOiBcIihcIiB8IFwiKVwiIHwgXCIsXCIpOiBib29sZWFuIHtcbiAgICBjb25zdCB0b2tlbiA9IHRoaXMucGVlaygpO1xuICAgIGlmICh0b2tlbj8udHlwZSA9PT0gXCJzeW1ib2xcIiAmJiB0b2tlbi52YWx1ZSA9PT0gdmFsdWUpIHtcbiAgICAgIHRoaXMuaW5kZXggKz0gMTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIG1hdGNoT3BlcmF0b3IodmFsdWU6IFwifHxcIiB8IFwiOjpcIik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHRva2VuID0gdGhpcy5wZWVrKCk7XG4gICAgaWYgKHRva2VuPy50eXBlID09PSBcIm9wZXJhdG9yXCIgJiYgdG9rZW4udmFsdWUgPT09IHZhbHVlKSB7XG4gICAgICB0aGlzLmluZGV4ICs9IDE7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXRjaElkZW50aWZpZXIodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHRva2VuID0gdGhpcy5wZWVrKCk7XG4gICAgaWYgKHRva2VuPy50eXBlID09PSBcImlkZW50aWZpZXJcIiAmJiB0b2tlbi52YWx1ZS50b0xvd2VyQ2FzZSgpID09PSB2YWx1ZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICB0aGlzLmluZGV4ICs9IDE7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBjb25zdW1lVG9rZW4oY29udGV4dDogc3RyaW5nKTogU2VhcmNoVGV4dEV4cHJlc3Npb25Ub2tlbiB7XG4gICAgY29uc3QgdG9rZW4gPSB0aGlzLnBlZWsoKTtcbiAgICBpZiAoIXRva2VuKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7Y29udGV4dH0g7Yag7YGw7J20IO2VhOyalO2VqeuLiOuLpC5gKTtcbiAgICB9XG4gICAgdGhpcy5pbmRleCArPSAxO1xuICAgIHJldHVybiB0b2tlbjtcbiAgfVxuXG4gIHByaXZhdGUgcGVlayhvZmZzZXQgPSAwKTogU2VhcmNoVGV4dEV4cHJlc3Npb25Ub2tlbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5zW3RoaXMuaW5kZXggKyBvZmZzZXRdO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldEluZGV4Q29sdW1uT3BjbGFzcyhjb2x1bW46IE1pZ3JhdGlvbkluZGV4W1wiY29sdW1uc1wiXVtudW1iZXJdKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGNvbHVtbi5vcGNsYXNzID8/IGNvbHVtbi52ZWN0b3JPcHM7XG59XG5cbmZ1bmN0aW9uIHRva2VuaXplU2VhcmNoVGV4dEV4cHJlc3Npb24oZXhwcmVzc2lvbjogc3RyaW5nKTogU2VhcmNoVGV4dEV4cHJlc3Npb25Ub2tlbltdIHtcbiAgY29uc3QgdG9rZW5zOiBTZWFyY2hUZXh0RXhwcmVzc2lvblRva2VuW10gPSBbXTtcbiAgbGV0IGluZGV4ID0gMDtcblxuICB3aGlsZSAoaW5kZXggPCBleHByZXNzaW9uLmxlbmd0aCkge1xuICAgIGNvbnN0IGNoYXIgPSBleHByZXNzaW9uW2luZGV4XTtcblxuICAgIGlmIChjaGFyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmICgvXFxzLy50ZXN0KGNoYXIpKSB7XG4gICAgICBpbmRleCArPSAxO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGV4cHJlc3Npb24uc3RhcnRzV2l0aChcInx8XCIsIGluZGV4KSkge1xuICAgICAgdG9rZW5zLnB1c2goeyB0eXBlOiBcIm9wZXJhdG9yXCIsIHZhbHVlOiBcInx8XCIgfSk7XG4gICAgICBpbmRleCArPSAyO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGV4cHJlc3Npb24uc3RhcnRzV2l0aChcIjo6XCIsIGluZGV4KSkge1xuICAgICAgdG9rZW5zLnB1c2goeyB0eXBlOiBcIm9wZXJhdG9yXCIsIHZhbHVlOiBcIjo6XCIgfSk7XG4gICAgICBpbmRleCArPSAyO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGNoYXIgPT09IFwiKFwiIHx8IGNoYXIgPT09IFwiKVwiIHx8IGNoYXIgPT09IFwiLFwiKSB7XG4gICAgICB0b2tlbnMucHVzaCh7IHR5cGU6IFwic3ltYm9sXCIsIHZhbHVlOiBjaGFyIH0pO1xuICAgICAgaW5kZXggKz0gMTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChjaGFyID09PSBcIidcIikge1xuICAgICAgbGV0IHZhbHVlID0gXCJcIjtcbiAgICAgIGluZGV4ICs9IDE7XG5cbiAgICAgIHdoaWxlIChpbmRleCA8IGV4cHJlc3Npb24ubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSBleHByZXNzaW9uW2luZGV4XTtcbiAgICAgICAgaWYgKGN1cnJlbnQgPT09IFwiJ1wiKSB7XG4gICAgICAgICAgaWYgKGV4cHJlc3Npb25baW5kZXggKyAxXSA9PT0gXCInXCIpIHtcbiAgICAgICAgICAgIHZhbHVlICs9IFwiJ1wiO1xuICAgICAgICAgICAgaW5kZXggKz0gMjtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGluZGV4ICs9IDE7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY3VycmVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICB2YWx1ZSArPSBjdXJyZW50O1xuICAgICAgICBpbmRleCArPSAxO1xuICAgICAgfVxuXG4gICAgICB0b2tlbnMucHVzaCh7IHR5cGU6IFwic3RyaW5nXCIsIHZhbHVlIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGNoYXIgPT09ICdcIicpIHtcbiAgICAgIGxldCB2YWx1ZSA9IFwiXCI7XG4gICAgICBpbmRleCArPSAxO1xuXG4gICAgICB3aGlsZSAoaW5kZXggPCBleHByZXNzaW9uLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBjdXJyZW50ID0gZXhwcmVzc2lvbltpbmRleF07XG4gICAgICAgIGlmIChjdXJyZW50ID09PSAnXCInKSB7XG4gICAgICAgICAgaWYgKGV4cHJlc3Npb25baW5kZXggKyAxXSA9PT0gJ1wiJykge1xuICAgICAgICAgICAgdmFsdWUgKz0gJ1wiJztcbiAgICAgICAgICAgIGluZGV4ICs9IDI7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpbmRleCArPSAxO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGN1cnJlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFsdWUgKz0gY3VycmVudDtcbiAgICAgICAgaW5kZXggKz0gMTtcbiAgICAgIH1cblxuICAgICAgdG9rZW5zLnB1c2goeyB0eXBlOiBcInF1b3RlZElkZW50aWZpZXJcIiwgdmFsdWUgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoL1tBLVphLXpfXS8udGVzdChjaGFyKSkge1xuICAgICAgbGV0IHZhbHVlID0gY2hhcjtcbiAgICAgIGluZGV4ICs9IDE7XG5cbiAgICAgIHdoaWxlIChpbmRleCA8IGV4cHJlc3Npb24ubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSBleHByZXNzaW9uW2luZGV4XTtcbiAgICAgICAgaWYgKGN1cnJlbnQgIT09IHVuZGVmaW5lZCAmJiAvW0EtWmEtejAtOV8kXS8udGVzdChjdXJyZW50KSkge1xuICAgICAgICAgIHZhbHVlICs9IGN1cnJlbnQ7XG4gICAgICAgICAgaW5kZXggKz0gMTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgdG9rZW5zLnB1c2goeyB0eXBlOiBcImlkZW50aWZpZXJcIiwgdmFsdWUgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYOyngOybkOuQmOyngCDslYrripQgc2VhcmNoVGV4dCBleHByZXNzaW9uIOusuOyekDogJHtjaGFyfWApO1xuICB9XG5cbiAgcmV0dXJuIHRva2Vucztcbn1cblxuZnVuY3Rpb24gY2Fub25pY2FsaXplU2VhcmNoVGV4dEdlbmVyYXRlZEV4cHJlc3Npb24oZXhwcmVzc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgU2VhcmNoVGV4dEV4cHJlc3Npb25QYXJzZXIodG9rZW5pemVTZWFyY2hUZXh0RXhwcmVzc2lvbihleHByZXNzaW9uKSk7XG4gICAgY29uc3QgcGFyc2VkRXhwcmVzc2lvbiA9IHBhcnNlci5wYXJzZUV4cHJlc3Npb24oKTtcblxuICAgIGlmICghcGFyc2VyLmlzQXRFbmQoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwic2VhcmNoVGV4dCBleHByZXNzaW9uIO2MjOyLseydtCDrgZ3rgpjsp4Ag7JWK7JWY7Iq164uI64ukLlwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVuZGVyU2VhcmNoVGV4dEV4cHJlc3Npb24obm9ybWFsaXplU2VhcmNoVGV4dEV4cHJlc3Npb25Ob2RlKHBhcnNlZEV4cHJlc3Npb24pKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZVNlYXJjaFRleHRFeHByZXNzaW9uRmFsbGJhY2soZXhwcmVzc2lvbik7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplU2VhcmNoVGV4dEV4cHJlc3Npb25Ob2RlKFxuICBub2RlOiBTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGUsXG4pOiBTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGUge1xuICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgIGNhc2UgXCJpZGVudGlmaWVyXCI6XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5ub2RlLFxuICAgICAgICBuYW1lOiBub2RlLnF1b3RlZCA/IG5vZGUubmFtZSA6IG5vZGUubmFtZS50b0xvd2VyQ2FzZSgpLFxuICAgICAgfTtcbiAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgIHJldHVybiBub2RlO1xuICAgIGNhc2UgXCJjb25jYXRcIjoge1xuICAgICAgY29uc3QgcGFydHMgPSBub2RlLnBhcnRzLmZsYXRNYXAoKHBhcnQpID0+IHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFBhcnQgPSBub3JtYWxpemVTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGUocGFydCk7XG4gICAgICAgIHJldHVybiBub3JtYWxpemVkUGFydC50eXBlID09PSBcImNvbmNhdFwiID8gbm9ybWFsaXplZFBhcnQucGFydHMgOiBbbm9ybWFsaXplZFBhcnRdO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4geyB0eXBlOiBcImNvbmNhdFwiLCBwYXJ0cyB9O1xuICAgIH1cbiAgICBjYXNlIFwiY29sbGF0ZVwiOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogXCJjb2xsYXRlXCIsXG4gICAgICAgIGV4cHI6IG5vcm1hbGl6ZVNlYXJjaFRleHRFeHByZXNzaW9uTm9kZShub2RlLmV4cHIpLFxuICAgICAgICBjb2xsYXRpb246IG5vZGUuY29sbGF0aW9uLnRvVXBwZXJDYXNlKCkgPT09IFwiQ1wiID8gXCJDXCIgOiBub2RlLmNvbGxhdGlvbixcbiAgICAgICAgcXVvdGVkOiBub2RlLnF1b3RlZCB8fCBub2RlLmNvbGxhdGlvbi50b1VwcGVyQ2FzZSgpID09PSBcIkNcIixcbiAgICAgIH07XG4gICAgY2FzZSBcImNhc3RcIjoge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZEV4cHIgPSBub3JtYWxpemVTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGUobm9kZS5leHByKTtcbiAgICAgIGNvbnN0IHRhcmdldFR5cGUgPSBub2RlLnRhcmdldFR5cGUucmVwbGFjZSgvXFxzKy9nLCBcIiBcIikudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAodGFyZ2V0VHlwZSA9PT0gXCJ0ZXh0XCIgfHwgdGFyZ2V0VHlwZSA9PT0gXCJjaGFyYWN0ZXIgdmFyeWluZ1wiIHx8IHRhcmdldFR5cGUgPT09IFwidmFyY2hhclwiKSB7XG4gICAgICAgIHJldHVybiBub3JtYWxpemVkRXhwcjtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFwiY2FzdFwiLFxuICAgICAgICBleHByOiBub3JtYWxpemVkRXhwcixcbiAgICAgICAgdGFyZ2V0VHlwZSxcbiAgICAgIH07XG4gICAgfVxuICAgIGNhc2UgXCJmdW5jdGlvblwiOiB7XG4gICAgICBjb25zdCBuYW1lID0gbm9kZS5uYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICBsZXQgYXJncyA9IG5vZGUuYXJncy5tYXAoKGFyZykgPT4gbm9ybWFsaXplU2VhcmNoVGV4dEV4cHJlc3Npb25Ob2RlKGFyZykpO1xuXG4gICAgICBpZiAoKG5hbWUgPT09IFwidHJpbVwiIHx8IG5hbWUgPT09IFwiYnRyaW1cIikgJiYgYXJncy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eXBlOiBcImZ1bmN0aW9uXCIsXG4gICAgICAgICAgbmFtZTogXCJ0cmltXCIsXG4gICAgICAgICAgYXJncyxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICAobmFtZSA9PT0gXCJzb25hbXVfdGV4dF9hcnJheV9hZ2dcIiB8fCBuYW1lID09PSBcInNvbmFtdV9qc29uYl9hcnJheV9hZ2dcIikgJiZcbiAgICAgICAgYXJncy5sZW5ndGggPT09IDIgJiZcbiAgICAgICAgYXJnc1sxXT8udHlwZSA9PT0gXCJib29sZWFuXCIgJiZcbiAgICAgICAgYXJnc1sxXS52YWx1ZVxuICAgICAgKSB7XG4gICAgICAgIGFyZ3MgPSBbYXJnc1swXV07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFwiZnVuY3Rpb25cIixcbiAgICAgICAgbmFtZSxcbiAgICAgICAgYXJncyxcbiAgICAgIH07XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlbmRlclNlYXJjaFRleHRFeHByZXNzaW9uKG5vZGU6IFNlYXJjaFRleHRFeHByZXNzaW9uTm9kZSwgcGFyZW50UHJlY2VkZW5jZSA9IDApOiBzdHJpbmcge1xuICBjb25zdCBwcmVjZWRlbmNlID0gZ2V0U2VhcmNoVGV4dEV4cHJlc3Npb25QcmVjZWRlbmNlKG5vZGUpO1xuICBjb25zdCByZW5kZXJlZCA9ICgoKSA9PiB7XG4gICAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJpZGVudGlmaWVyXCI6XG4gICAgICAgIHJldHVybiBub2RlLnF1b3RlZCA/IGBcIiR7bm9kZS5uYW1lLnJlcGxhY2VBbGwoJ1wiJywgJ1wiXCInKX1cImAgOiBub2RlLm5hbWU7XG4gICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgIHJldHVybiBgJyR7bm9kZS52YWx1ZS5yZXBsYWNlQWxsKFwiJ1wiLCBcIicnXCIpfSdgO1xuICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgcmV0dXJuIG5vZGUudmFsdWUgPyBcInRydWVcIiA6IFwiZmFsc2VcIjtcbiAgICAgIGNhc2UgXCJmdW5jdGlvblwiOlxuICAgICAgICByZXR1cm4gYCR7bm9kZS5uYW1lfSgke25vZGUuYXJnc1xuICAgICAgICAgIC5tYXAoKGFyZykgPT4gcmVuZGVyU2VhcmNoVGV4dEV4cHJlc3Npb24oYXJnKSlcbiAgICAgICAgICAuam9pbihcIiwgXCIpfSlgO1xuICAgICAgY2FzZSBcImNvbmNhdFwiOlxuICAgICAgICByZXR1cm4gbm9kZS5wYXJ0cy5tYXAoKHBhcnQpID0+IHJlbmRlclNlYXJjaFRleHRFeHByZXNzaW9uKHBhcnQsIHByZWNlZGVuY2UpKS5qb2luKFwiIHx8IFwiKTtcbiAgICAgIGNhc2UgXCJjb2xsYXRlXCI6IHtcbiAgICAgICAgY29uc3QgY29sbGF0aW9uID0gbm9kZS5xdW90ZWRcbiAgICAgICAgICA/IGBcIiR7bm9kZS5jb2xsYXRpb24ucmVwbGFjZUFsbCgnXCInLCAnXCJcIicpfVwiYFxuICAgICAgICAgIDogbm9kZS5jb2xsYXRpb247XG4gICAgICAgIHJldHVybiBgJHtyZW5kZXJTZWFyY2hUZXh0RXhwcmVzc2lvbihub2RlLmV4cHIsIHByZWNlZGVuY2UpfSBDT0xMQVRFICR7Y29sbGF0aW9ufWA7XG4gICAgICB9XG4gICAgICBjYXNlIFwiY2FzdFwiOlxuICAgICAgICByZXR1cm4gYCR7cmVuZGVyU2VhcmNoVGV4dEV4cHJlc3Npb24obm9kZS5leHByLCBwcmVjZWRlbmNlKX06OiR7bm9kZS50YXJnZXRUeXBlfWA7XG4gICAgfVxuICB9KSgpO1xuXG4gIGlmIChwcmVjZWRlbmNlIDwgcGFyZW50UHJlY2VkZW5jZSkge1xuICAgIHJldHVybiBgKCR7cmVuZGVyZWR9KWA7XG4gIH1cblxuICByZXR1cm4gcmVuZGVyZWQ7XG59XG5cbmZ1bmN0aW9uIGdldFNlYXJjaFRleHRFeHByZXNzaW9uUHJlY2VkZW5jZShub2RlOiBTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGUpOiBudW1iZXIge1xuICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgIGNhc2UgXCJjb25jYXRcIjpcbiAgICAgIHJldHVybiAxO1xuICAgIGNhc2UgXCJjb2xsYXRlXCI6XG4gICAgY2FzZSBcImNhc3RcIjpcbiAgICAgIHJldHVybiAyO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gMztcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVTZWFyY2hUZXh0RXhwcmVzc2lvbkZhbGxiYWNrKGV4cHJlc3Npb246IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBleHByZXNzaW9uXG4gICAgLnJlcGxhY2UoL1xccysvZywgXCIgXCIpXG4gICAgLnJlcGxhY2UoL1xcYlRSSU1cXHMqXFwoXFxzKkJPVEhcXHMrRlJPTVxccysvZ2ksIFwidHJpbShcIilcbiAgICAucmVwbGFjZSgvOjooPzp0ZXh0fGNoYXJhY3RlciB2YXJ5aW5nfHZhcmNoYXIpXFxiL2dpLCBcIlwiKVxuICAgIC5yZXBsYWNlKC8sXFxzKnRydWVcXGIvZ2ksIFwiXCIpXG4gICAgLnRyaW0oKTtcbn1cblxuZnVuY3Rpb24gdmlzaXRTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGUoXG4gIG5vZGU6IFNlYXJjaFRleHRFeHByZXNzaW9uTm9kZSxcbiAgdmlzaXRvcjogKG5vZGU6IFNlYXJjaFRleHRFeHByZXNzaW9uTm9kZSkgPT4gdm9pZCxcbik6IHZvaWQge1xuICB2aXNpdG9yKG5vZGUpO1xuXG4gIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgY2FzZSBcImNvbmNhdFwiOlxuICAgICAgbm9kZS5wYXJ0cy5mb3JFYWNoKChwYXJ0KSA9PiB7XG4gICAgICAgIHZpc2l0U2VhcmNoVGV4dEV4cHJlc3Npb25Ob2RlKHBhcnQsIHZpc2l0b3IpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgY2FzZSBcImNvbGxhdGVcIjpcbiAgICBjYXNlIFwiY2FzdFwiOlxuICAgICAgdmlzaXRTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGUobm9kZS5leHByLCB2aXNpdG9yKTtcbiAgICAgIHJldHVybjtcbiAgICBjYXNlIFwiZnVuY3Rpb25cIjpcbiAgICAgIG5vZGUuYXJncy5mb3JFYWNoKChhcmcpID0+IHtcbiAgICAgICAgdmlzaXRTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGUoYXJnLCB2aXNpdG9yKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIGNhc2UgXCJpZGVudGlmaWVyXCI6XG4gICAgY2FzZSBcInN0cmluZ1wiOlxuICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICByZXR1cm47XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0U2VhcmNoVGV4dEhlbHBlcktpbmRzRnJvbUV4cHJlc3Npb24oZXhwcmVzc2lvbjogc3RyaW5nKTogU2V0PFNlYXJjaFRleHRIZWxwZXJLaW5kPiB7XG4gIGNvbnN0IGhlbHBlcktpbmRzID0gbmV3IFNldDxTZWFyY2hUZXh0SGVscGVyS2luZD4oKTtcbiAgY29uc3QgYWRkSGVscGVyS2luZEZyb21OYW1lID0gKG5hbWU6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWROYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChub3JtYWxpemVkTmFtZSA9PT0gXCJzb25hbXVfdGV4dF9hcnJheV9hZ2dcIikge1xuICAgICAgaGVscGVyS2luZHMuYWRkKFwidGV4dC1hcnJheVwiKTtcbiAgICB9IGVsc2UgaWYgKG5vcm1hbGl6ZWROYW1lID09PSBcInNvbmFtdV9qc29uYl9hcnJheV9hZ2dcIikge1xuICAgICAgaGVscGVyS2luZHMuYWRkKFwianNvbmItYXJyYXlcIik7XG4gICAgfVxuICB9O1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcGFyc2VyID0gbmV3IFNlYXJjaFRleHRFeHByZXNzaW9uUGFyc2VyKHRva2VuaXplU2VhcmNoVGV4dEV4cHJlc3Npb24oZXhwcmVzc2lvbikpO1xuICAgIGNvbnN0IHBhcnNlZEV4cHJlc3Npb24gPSBwYXJzZXIucGFyc2VFeHByZXNzaW9uKCk7XG5cbiAgICBpZiAoIXBhcnNlci5pc0F0RW5kKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInNlYXJjaFRleHQgaGVscGVyIGV4cHJlc3Npb24g7YyM7Iux7J20IOuBneuCmOyngCDslYrslZjsirXri4jri6QuXCIpO1xuICAgIH1cblxuICAgIHZpc2l0U2VhcmNoVGV4dEV4cHJlc3Npb25Ob2RlKHBhcnNlZEV4cHJlc3Npb24sIChub2RlKSA9PiB7XG4gICAgICBpZiAobm9kZS50eXBlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgYWRkSGVscGVyS2luZEZyb21OYW1lKG5vZGUubmFtZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIGlmICgvXFxic29uYW11X3RleHRfYXJyYXlfYWdnXFxzKlxcKC9pLnRlc3QoZXhwcmVzc2lvbikpIHtcbiAgICAgIGhlbHBlcktpbmRzLmFkZChcInRleHQtYXJyYXlcIik7XG4gICAgfVxuICAgIGlmICgvXFxic29uYW11X2pzb25iX2FycmF5X2FnZ1xccypcXCgvaS50ZXN0KGV4cHJlc3Npb24pKSB7XG4gICAgICBoZWxwZXJLaW5kcy5hZGQoXCJqc29uYi1hcnJheVwiKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaGVscGVyS2luZHM7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVTZWFyY2hUZXh0Q29sdW1ucyh0YWJsZTogc3RyaW5nLCBjb2x1bW5zOiBNaWdyYXRpb25Db2x1bW5bXSk6IE1pZ3JhdGlvbkNvbHVtbltdIHtcbiAgY29uc3QgZW50aXR5ID0gKCgpID0+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIEVudGl0eU1hbmFnZXIuZ2V0QnlUYWJsZSh0YWJsZSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH0pKCk7XG5cbiAgaWYgKCFlbnRpdHkpIHtcbiAgICByZXR1cm4gY29sdW1ucztcbiAgfVxuXG4gIGNvbnN0IHByb3BzQnlOYW1lID0gbmV3IE1hcChlbnRpdHkucHJvcHMubWFwKChwcm9wKSA9PiBbcHJvcC5uYW1lLCBwcm9wXSkpO1xuXG4gIHJldHVybiBjb2x1bW5zLm1hcCgoY29sdW1uKSA9PiB7XG4gICAgY29uc3QgcHJvcCA9IHByb3BzQnlOYW1lLmdldChjb2x1bW4ubmFtZSk7XG4gICAgaWYgKCFwcm9wIHx8ICFpc1NlYXJjaFRleHRQcm9wKHByb3ApKSB7XG4gICAgICByZXR1cm4gY29sdW1uO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb2x1bW4sXG4gICAgICBnZW5lcmF0ZWQ6IHtcbiAgICAgICAgdHlwZTogXCJTVE9SRURcIixcbiAgICAgICAgZXhwcmVzc2lvbjogYnVpbGRTZWFyY2hUZXh0R2VuZXJhdGVkRXhwcmVzc2lvbihwcm9wLCBwcm9wc0J5TmFtZSksXG4gICAgICB9LFxuICAgIH07XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBidWlsZFNlYXJjaFRleHRHZW5lcmF0ZWRFeHByZXNzaW9uKFxuICBwcm9wOiBFeHRyYWN0PEVudGl0eVByb3AsIHsgdHlwZTogXCJzZWFyY2hUZXh0XCIgfT4sXG4gIHByb3BzQnlOYW1lOiBNYXA8c3RyaW5nLCBFbnRpdHlQcm9wPixcbik6IHN0cmluZyB7XG4gIGNvbnN0IHRva2VucyA9IHByb3Auc291cmNlQ29sdW1ucy5tYXAoKHNvdXJjZSkgPT4ge1xuICAgIGNvbnN0IHNvdXJjZVByb3AgPSBwcm9wc0J5TmFtZS5nZXQoc291cmNlLm5hbWUpO1xuICAgIGlmICghc291cmNlUHJvcCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBzZWFyY2hUZXh0IHNvdXJjZSBjb2x1bW4gXCIke3NvdXJjZS5uYW1lfVwi7J2EKOulvCkg7LC+7J2EIOyImCDsl4bsirXri4jri6QuYCk7XG4gICAgfVxuXG4gICAgaWYgKHNvdXJjZVByb3AudHlwZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHNvdXJjZS5jYXNlSW5zZW5zaXRpdmVcbiAgICAgICAgPyBgbG93ZXIoQ09BTEVTQ0UoJHtzb3VyY2UubmFtZX0sICcnKSlgXG4gICAgICAgIDogYENPQUxFU0NFKCR7c291cmNlLm5hbWV9LCAnJylgO1xuICAgIH1cblxuICAgIGlmIChzb3VyY2VQcm9wLnR5cGUgPT09IFwic3RyaW5nW11cIikge1xuICAgICAgcmV0dXJuIHNvdXJjZS5jYXNlSW5zZW5zaXRpdmVcbiAgICAgICAgPyBgQ09BTEVTQ0Uoc29uYW11X3RleHRfYXJyYXlfYWdnKCR7c291cmNlLm5hbWV9KSwgJycpYFxuICAgICAgICA6IGBDT0FMRVNDRShzb25hbXVfdGV4dF9hcnJheV9hZ2coJHtzb3VyY2UubmFtZX0sIGZhbHNlKSwgJycpYDtcbiAgICB9XG5cbiAgICBpZiAoc291cmNlUHJvcC50eXBlID09PSBcImpzb25cIikge1xuICAgICAgcmV0dXJuIHNvdXJjZS5jYXNlSW5zZW5zaXRpdmVcbiAgICAgICAgPyBgQ09BTEVTQ0Uoc29uYW11X2pzb25iX2FycmF5X2FnZygke3NvdXJjZS5uYW1lfSksICcnKWBcbiAgICAgICAgOiBgQ09BTEVTQ0Uoc29uYW11X2pzb25iX2FycmF5X2FnZygke3NvdXJjZS5uYW1lfSwgZmFsc2UpLCAnJylgO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBzZWFyY2hUZXh0IHNvdXJjZSBjb2x1bW4gXCIke3NvdXJjZS5uYW1lfVwi7J2YIO2DgOyehSBcIiR7c291cmNlUHJvcC50eXBlfVwi7J2AKOuKlCkg7KeA7JuQ65CY7KeAIOyViuyKteuLiOuLpC5gLFxuICAgICk7XG4gIH0pO1xuXG4gIHJldHVybiBgdHJpbSgke3Rva2Vucy5qb2luKGAgfHwgJyAnIHx8IGApfSlgO1xufVxuXG5mdW5jdGlvbiBnZXRTZWFyY2hUZXh0SGVscGVyRGVmaW5pdGlvbnModGFibGU6IHN0cmluZywgY29sdW1uczogTWlncmF0aW9uQ29sdW1uW10pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGhlbHBlcktpbmRzID0gbmV3IFNldDxTZWFyY2hUZXh0SGVscGVyS2luZD4oKTtcblxuICBjb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xuICAgIGlmICghY29sdW1uLmdlbmVyYXRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGdldFNlYXJjaFRleHRIZWxwZXJLaW5kc0Zyb21FeHByZXNzaW9uKGNvbHVtbi5nZW5lcmF0ZWQuZXhwcmVzc2lvbikuZm9yRWFjaCgoa2luZCkgPT4ge1xuICAgICAgaGVscGVyS2luZHMuYWRkKGtpbmQpO1xuICAgIH0pO1xuICB9KTtcblxuICBpZiAoaGVscGVyS2luZHMuc2l6ZSA+IDApIHtcbiAgICByZXR1cm4gKFtcInRleHQtYXJyYXlcIiwgXCJqc29uYi1hcnJheVwiXSBhcyBjb25zdClcbiAgICAgIC5maWx0ZXIoKGtpbmQpID0+IGhlbHBlcktpbmRzLmhhcyhraW5kKSlcbiAgICAgIC5tYXAoKGtpbmQpID0+IFNFQVJDSF9URVhUX0hFTFBFUl9ERUZJTklUSU9OU1traW5kXSk7XG4gIH1cblxuICBjb25zdCBlbnRpdHkgPSAoKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gRW50aXR5TWFuYWdlci5nZXRCeVRhYmxlKHRhYmxlKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfSkoKTtcblxuICBpZiAoIWVudGl0eSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBjb25zdCBwcm9wc0J5TmFtZSA9IG5ldyBNYXAoZW50aXR5LnByb3BzLm1hcCgocHJvcCkgPT4gW3Byb3AubmFtZSwgcHJvcF0pKTtcblxuICBjb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xuICAgIGNvbnN0IHByb3AgPSBwcm9wc0J5TmFtZS5nZXQoY29sdW1uLm5hbWUpO1xuICAgIGlmICghcHJvcCB8fCAhaXNTZWFyY2hUZXh0UHJvcChwcm9wKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHByb3Auc291cmNlQ29sdW1ucy5mb3JFYWNoKChzb3VyY2UpID0+IHtcbiAgICAgIGNvbnN0IHNvdXJjZVByb3AgPSBwcm9wc0J5TmFtZS5nZXQoc291cmNlLm5hbWUpO1xuICAgICAgaWYgKHNvdXJjZVByb3A/LnR5cGUgPT09IFwic3RyaW5nW11cIikge1xuICAgICAgICBoZWxwZXJLaW5kcy5hZGQoXCJ0ZXh0LWFycmF5XCIpO1xuICAgICAgfSBlbHNlIGlmIChzb3VyY2VQcm9wPy50eXBlID09PSBcImpzb25cIikge1xuICAgICAgICBoZWxwZXJLaW5kcy5hZGQoXCJqc29uYi1hcnJheVwiKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cbiAgcmV0dXJuIChbXCJ0ZXh0LWFycmF5XCIsIFwianNvbmItYXJyYXlcIl0gYXMgY29uc3QpXG4gICAgLmZpbHRlcigoa2luZCkgPT4gaGVscGVyS2luZHMuaGFzKGtpbmQpKVxuICAgIC5tYXAoKGtpbmQpID0+IFNFQVJDSF9URVhUX0hFTFBFUl9ERUZJTklUSU9OU1traW5kXSk7XG59XG5cbmZ1bmN0aW9uIGdldFNlYXJjaFRleHRDb2x1bW5OYW1lcyh0YWJsZTogc3RyaW5nKTogU2V0PHN0cmluZz4ge1xuICBjb25zdCBlbnRpdHkgPSAoKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gRW50aXR5TWFuYWdlci5nZXRCeVRhYmxlKHRhYmxlKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfSkoKTtcblxuICBpZiAoIWVudGl0eSkge1xuICAgIHJldHVybiBuZXcgU2V0KCk7XG4gIH1cblxuICByZXR1cm4gbmV3IFNldChlbnRpdHkucHJvcHMuZmlsdGVyKGlzU2VhcmNoVGV4dFByb3ApLm1hcCgocHJvcCkgPT4gcHJvcC5uYW1lKSk7XG59XG5cbi8qKlxuICog7YWM7J2067iUIOyDneyEse2VmOuKlCDsvIDsnbTsiqQgLSDsu6zrn7wv7J24642x7IqkIOyDneyEsVxuICovXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUNyZWF0ZUNvZGVfQ29sdW1uQW5kSW5kZXhlcyhcbiAgdGFibGU6IHN0cmluZyxcbiAgY29sdW1uczogTWlncmF0aW9uQ29sdW1uW10sXG4gIGluZGV4ZXM6IE1pZ3JhdGlvbkluZGV4W10sXG4pOiBQcm9taXNlPEdlbk1pZ3JhdGlvbkNvZGU+IHtcbiAgY29uc3QgcmVzb2x2ZWRDb2x1bW5zID0gcmVzb2x2ZVNlYXJjaFRleHRDb2x1bW5zKHRhYmxlLCBjb2x1bW5zKTtcbiAgY29uc3QgY29sdW1uRGVmcyA9IGdlbkNvbHVtbkRlZmluaXRpb25zKHRhYmxlLCByZXNvbHZlZENvbHVtbnMpO1xuICBjb25zdCBoZWxwZXJEZWZpbml0aW9ucyA9IGdldFNlYXJjaFRleHRIZWxwZXJEZWZpbml0aW9ucyh0YWJsZSwgcmVzb2x2ZWRDb2x1bW5zKTtcblxuICAvLyDsu6zrn7wsIOyduOuNseyKpCDsspjrpqxcbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW1xuICAgICdpbXBvcnQgeyBLbmV4IH0gZnJvbSBcImtuZXhcIjsnLFxuICAgIFwiXCIsXG4gICAgXCJleHBvcnQgYXN5bmMgZnVuY3Rpb24gdXAoa25leDogS25leCk6IFByb21pc2U8dm9pZD4ge1wiLFxuICAgIC4uLmhlbHBlckRlZmluaXRpb25zLFxuICAgIGBhd2FpdCBrbmV4LnNjaGVtYS5jcmVhdGVUYWJsZShcIiR7dGFibGV9XCIsICh0YWJsZSkgPT4ge2AsXG4gICAgLi4uY29sdW1uRGVmcy5idWlsZGVyLFxuICAgIFwifSk7XCIsXG4gICAgLy8gcmF3IOq1rOusuCAoR2VuZXJhdGVkIENvbHVtbiDrk7EpXG4gICAgLi4uY29sdW1uRGVmcy5yYXcsXG4gICAgLy8gaW5kZXjripQga25leC5yYXfroZwg7LKY66as7ZWY66+A66GcIGNyZWF0ZVRhYmxlIOuwluyXkOyEnCDsi6TtlolcbiAgICAuLi5pbmRleGVzLm1hcCgoaW5kZXgpID0+IGdlbkluZGV4RGVmaW5pdGlvbihpbmRleCwgdGFibGUpKSxcbiAgICBcIn1cIixcbiAgICBcIlwiLFxuICAgIFwiZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRvd24oa25leDogS25leCk6IFByb21pc2U8dm9pZD4ge1wiLFxuICAgIGAgcmV0dXJuIGtuZXguc2NoZW1hLmRyb3BUYWJsZShcIiR7dGFibGV9XCIpO2AsXG4gICAgXCJ9XCIsXG4gIF07XG4gIHJldHVybiB7XG4gICAgdGFibGUsXG4gICAgdHlwZTogXCJub3JtYWxcIixcbiAgICB0aXRsZTogYGNyZWF0ZV9fJHt0YWJsZX1gLFxuICAgIGZvcm1hdHRlZDogYXdhaXQgZm9ybWF0Q29kZShsaW5lcy5qb2luKFwiXFxuXCIpLCBgc3JjL21pZ3JhdGlvbi8ke3RhYmxlfS50c2ApLFxuICB9O1xufVxuXG4vKipcbiAqIE1pZ3JhdGlvbkNvbHVtbltdIOydveyWtOyEnCDsu6zrn7wg7KCV7J2Y7ZWY64qUIOq1rOusuCDsg53shLFcbiAqIEByZXR1cm5zIGJ1aWxkZXI6IHRhYmxlIGJ1aWxkZXIg66mU7ISc65OcLCByYXc6IGtuZXgucmF3KCkg6rWs66y4XG4gKi9cbmZ1bmN0aW9uIGdlbkNvbHVtbkRlZmluaXRpb25zKHRhYmxlOiBzdHJpbmcsIGNvbHVtbnM6IE1pZ3JhdGlvbkNvbHVtbltdKTogQ29sdW1uRGVmaW5pdGlvblJlc3VsdCB7XG4gIGNvbnN0IHJlc3VsdDogQ29sdW1uRGVmaW5pdGlvblJlc3VsdCA9IHtcbiAgICBidWlsZGVyOiBbXSxcbiAgICByYXc6IFtdLFxuICB9O1xuXG4gIGZvciAoY29uc3QgY29sdW1uIG9mIGNvbHVtbnMpIHtcbiAgICAvLyBHZW5lcmF0ZWQgQ29sdW1u7J2AIHJhd+uhnCDsspjrpqxcbiAgICBpZiAoY29sdW1uLmdlbmVyYXRlZCkge1xuICAgICAgcmVzdWx0LnJhdy5wdXNoKGdlbkdlbmVyYXRlZENvbHVtbkRlZmluaXRpb24odGFibGUsIGNvbHVtbikpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8g7J2867CYIOy7rOufvOydgCBidWlsZGVy66GcIOyymOumrFxuICAgIHJlc3VsdC5idWlsZGVyLnB1c2goZ2VuTm9ybWFsQ29sdW1uRGVmaW5pdGlvbihjb2x1bW4pKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogR2VuZXJhdGVkIENvbHVtbiDsoJXsnZgg7IOd7ISxIChBTFRFUiBUQUJMRSBBREQgQ09MVU1OIOyCrOyaqSlcbiAqL1xuZnVuY3Rpb24gZ2VuR2VuZXJhdGVkQ29sdW1uRGVmaW5pdGlvbih0YWJsZTogc3RyaW5nLCBjb2x1bW46IE1pZ3JhdGlvbkNvbHVtbik6IHN0cmluZyB7XG4gIGlmICghY29sdW1uLmdlbmVyYXRlZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkdlbmVyYXRlZCBjb2x1bW4gZGVmaW5pdGlvbiByZXF1aXJlZFwiKTtcbiAgfVxuICBjb25zdCBwZ1R5cGUgPSBnZXRQZ1R5cGVGb3JDb2x1bW4oY29sdW1uKTtcbiAgY29uc3Qgc3RvcmFnZVR5cGUgPSBjb2x1bW4uZ2VuZXJhdGVkLnR5cGUgPT09IFwiVklSVFVBTFwiID8gXCIgVklSVFVBTFwiIDogXCIgU1RPUkVEXCI7XG4gIGNvbnN0IG51bGxhYmxlQ2xhdXNlID0gY29sdW1uLm51bGxhYmxlID8gXCJcIiA6IFwiIE5PVCBOVUxMXCI7XG4gIHJldHVybiBgYXdhaXQga25leC5yYXcoXFxgQUxURVIgVEFCTEUgXCIke3RhYmxlfVwiIEFERCBDT0xVTU4gXCIke2NvbHVtbi5uYW1lfVwiICR7cGdUeXBlfSBHRU5FUkFURUQgQUxXQVlTIEFTICgke2NvbHVtbi5nZW5lcmF0ZWQuZXhwcmVzc2lvbn0pJHtzdG9yYWdlVHlwZX0ke251bGxhYmxlQ2xhdXNlfVxcYCk7YDtcbn1cblxuLyoqXG4gKiDsnbzrsJgg7Lus65+8IOygleydmCDsg53shLEgKHRhYmxlLnh4eCgpIOyytOyduClcbiAqL1xuZnVuY3Rpb24gZ2VuTm9ybWFsQ29sdW1uRGVmaW5pdGlvbihjb2x1bW46IE1pZ3JhdGlvbkNvbHVtbik6IHN0cmluZyB7XG4gIGNvbnN0IGNoYWluczogc3RyaW5nW10gPSBbXTtcblxuICBpZiAoY29sdW1uLm5hbWUgPT09IFwiaWRcIikge1xuICAgIC8vIFBLIO2DgOyeheyXkCDrlLDrpbgg67aE6riwIOyymOumrFxuICAgIGlmIChjb2x1bW4udHlwZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgLy8gc3RyaW5nIFBLOiBsZW5ndGjqsIAg7J6I7Jy866m0IHZhcmNoYXIsIOyXhuycvOuptCB0ZXh0XG4gICAgICBpZiAoY29sdW1uLmxlbmd0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBgdGFibGUuc3RyaW5nKCdpZCcsICR7Y29sdW1uLmxlbmd0aH0pLnByaW1hcnkoKS5ub3ROdWxsYWJsZSgpO2A7XG4gICAgICB9XG4gICAgICByZXR1cm4gYHRhYmxlLnRleHQoJ2lkJykucHJpbWFyeSgpLm5vdE51bGxhYmxlKCk7YDtcbiAgICB9XG4gICAgaWYgKGNvbHVtbi50eXBlID09PSBcInV1aWRcIikge1xuICAgICAgcmV0dXJuIGB0YWJsZS51dWlkKCdpZCcpLnByaW1hcnkoKS5ub3ROdWxsYWJsZSgpO2A7XG4gICAgfVxuICAgIC8vIOq4sOyhtCBpbnRlZ2VyIFBLICjquLDrs7jqsJIpXG4gICAgcmV0dXJuIGB0YWJsZS5pbmNyZW1lbnRzKCkucHJpbWFyeSgpO2A7XG4gIH1cblxuICAvLyDrsLDsl7Qg7YOA7J6FIOyymOumrFxuICBpZiAoY29sdW1uLnR5cGUuZW5kc1dpdGgoXCJbXVwiKSkge1xuICAgIGNvbnN0IGVsZW1lbnRUeXBlID0gY29sdW1uLnR5cGUuc2xpY2UoMCwgLTIpOyAvLyBcImludGVnZXJbXVwiIC0+IFwiaW50ZWdlclwiXG4gICAgY29uc3QgcGdUeXBlID0gZ2V0UGdBcnJheVR5cGUoY29sdW1uLCBlbGVtZW50VHlwZSk7XG4gICAgY2hhaW5zLnB1c2goYHNwZWNpZmljVHlwZSgnJHtjb2x1bW4ubmFtZX0nLCAnJHtwZ1R5cGV9JylgKTtcbiAgfSBlbHNlIGlmIChjb2x1bW4udHlwZSA9PT0gXCJ2ZWN0b3JcIikge1xuICAgIC8vIEtuZXjripQgdmVjdG9yIO2DgOyeheydhCDsp4HsoJEg7KeA7JuQ7ZWY7KeAIOyViuycvOuvgOuhnCBzcGVjaWZpY1R5cGUg7IKs7JqpXG4gICAgY2hhaW5zLnB1c2goYHNwZWNpZmljVHlwZSgnJHtjb2x1bW4ubmFtZX0nLCAndmVjdG9yKCR7Y29sdW1uLmRpbWVuc2lvbnN9KScpYCk7XG4gIH0gZWxzZSBpZiAoY29sdW1uLnR5cGUgPT09IFwibnVtYmVyT3JOdW1lcmljXCIpIHtcbiAgICAvLyBudW1iZXJcbiAgICBpZiAoY29sdW1uLm51bWJlclR5cGUgPT09IFwicmVhbFwiKSB7XG4gICAgICBjaGFpbnMucHVzaChgZmxvYXQoJyR7Y29sdW1uLm5hbWV9JylgKTtcbiAgICB9IGVsc2UgaWYgKGNvbHVtbi5udW1iZXJUeXBlID09PSBcImRvdWJsZSBwcmVjaXNpb25cIikge1xuICAgICAgY2hhaW5zLnB1c2goYGRvdWJsZSgnJHtjb2x1bW4ubmFtZX0nKWApO1xuICAgIH0gZWxzZSBpZiAoKGNvbHVtbi5udW1iZXJUeXBlID8/IFwibnVtZXJpY1wiKSA9PT0gXCJudW1lcmljXCIpIHtcbiAgICAgIGNoYWlucy5wdXNoKGBkZWNpbWFsKCcke2NvbHVtbi5uYW1lfScsICR7Y29sdW1uLnByZWNpc2lvbn0sICR7Y29sdW1uLnNjYWxlfSlgKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoY29sdW1uLnR5cGUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAvLyBzdHJpbmdcbiAgICBpZiAoY29sdW1uLmxlbmd0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjaGFpbnMucHVzaChgc3RyaW5nKCcke2NvbHVtbi5uYW1lfScsICR7Y29sdW1uLmxlbmd0aH0pYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNoYWlucy5wdXNoKGB0ZXh0KCcke2NvbHVtbi5uYW1lfScpYCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGNvbHVtbi50eXBlID09PSBcImRhdGVcIikge1xuICAgIC8vIGRhdGVcbiAgICBjaGFpbnMucHVzaChcbiAgICAgIGB0aW1lc3RhbXAoJyR7Y29sdW1uLm5hbWV9JywgeyB1c2VUejogdHJ1ZSwgcHJlY2lzaW9uOiAke2NvbHVtbi5wcmVjaXNpb24gPz8gM30gfSlgLFxuICAgICk7XG4gIH0gZWxzZSBpZiAoY29sdW1uLnR5cGUgPT09IFwianNvblwiKSB7XG4gICAgLy8ganNvblxuICAgIGNoYWlucy5wdXNoKGBqc29uYignJHtjb2x1bW4ubmFtZX0nKWApO1xuICB9IGVsc2Uge1xuICAgIC8vIHR5cGUsIGxlbmd0aFxuICAgIGNoYWlucy5wdXNoKGAke2NvbHVtbi50eXBlfSgnJHtjb2x1bW4ubmFtZX0nJHtjb2x1bW4ubGVuZ3RoID8gYCwgJHtjb2x1bW4ubGVuZ3RofWAgOiBcIlwifSlgKTtcbiAgfVxuXG4gIC8vIG51bGxhYmxlXG4gIGNoYWlucy5wdXNoKGNvbHVtbi5udWxsYWJsZSA/IFwibnVsbGFibGUoKVwiIDogXCJub3ROdWxsYWJsZSgpXCIpO1xuXG4gIC8vIGRlZmF1bHRUb1xuICBpZiAoY29sdW1uLmRlZmF1bHRUbyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHR5cGVvZiBjb2x1bW4uZGVmYXVsdFRvID09PSBcInN0cmluZ1wiICYmIGNvbHVtbi5kZWZhdWx0VG8uc3RhcnRzV2l0aChgXCJgKSkge1xuICAgICAgY2hhaW5zLnB1c2goYGRlZmF1bHRUbygke2NvbHVtbi5kZWZhdWx0VG99KWApO1xuICAgIH0gZWxzZSBpZiAoY29sdW1uLnR5cGUgPT09IFwianNvblwiICYmIHR5cGVvZiBjb2x1bW4uZGVmYXVsdFRvLnN0YXJ0c1dpdGgoJ1wiJykpIHtcbiAgICAgIGNoYWlucy5wdXNoKGBkZWZhdWx0VG8oa25leC5yYXcoXCIke2NvbHVtbi5kZWZhdWx0VG8ucmVwbGFjZUFsbCgnXCInLCBcIidcIil9Ojpqc29uYlwiKSlgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2hhaW5zLnB1c2goYGRlZmF1bHRUbyhrbmV4LnJhdygnJHtjb2x1bW4uZGVmYXVsdFRvfScpKWApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBgdGFibGUuJHtjaGFpbnMuam9pbihcIi5cIil9O2A7XG59XG5cbi8qKlxuICogTWlncmF0aW9uQ29sdW1u7J2YIO2DgOyeheydhCBQb3N0Z3JlU1FMIO2DgOyehSDrrLjsnpDsl7TroZwg67OA7ZmYXG4gKi9cbmZ1bmN0aW9uIGdldFBnVHlwZUZvckNvbHVtbihjb2x1bW46IE1pZ3JhdGlvbkNvbHVtbik6IHN0cmluZyB7XG4gIGlmIChjb2x1bW4udHlwZS5lbmRzV2l0aChcIltdXCIpKSB7XG4gICAgY29uc3QgZWxlbWVudFR5cGUgPSBjb2x1bW4udHlwZS5zbGljZSgwLCAtMik7XG4gICAgcmV0dXJuIGdldFBnQXJyYXlUeXBlKGNvbHVtbiwgZWxlbWVudFR5cGUpO1xuICB9XG5cbiAgc3dpdGNoIChjb2x1bW4udHlwZSkge1xuICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgIHJldHVybiBjb2x1bW4ubGVuZ3RoICE9PSB1bmRlZmluZWQgPyBgdmFyY2hhcigke2NvbHVtbi5sZW5ndGh9KWAgOiBcInRleHRcIjtcbiAgICBjYXNlIFwiYmlnSW50ZWdlclwiOlxuICAgICAgcmV0dXJuIFwiYmlnaW50XCI7XG4gICAgY2FzZSBcIm51bWJlck9yTnVtZXJpY1wiOlxuICAgICAgaWYgKGNvbHVtbi5udW1iZXJUeXBlID09PSBcInJlYWxcIikgcmV0dXJuIFwicmVhbFwiO1xuICAgICAgaWYgKGNvbHVtbi5udW1iZXJUeXBlID09PSBcImRvdWJsZSBwcmVjaXNpb25cIikgcmV0dXJuIFwiZG91YmxlIHByZWNpc2lvblwiO1xuICAgICAgcmV0dXJuIGBudW1lcmljKCR7Y29sdW1uLnByZWNpc2lvbn0sICR7Y29sdW1uLnNjYWxlfSlgO1xuICAgIGNhc2UgXCJkYXRlXCI6XG4gICAgICByZXR1cm4gXCJ0aW1lc3RhbXB0elwiO1xuICAgIGNhc2UgXCJqc29uXCI6XG4gICAgICByZXR1cm4gXCJqc29uYlwiO1xuICAgIGNhc2UgXCJ2ZWN0b3JcIjpcbiAgICAgIHJldHVybiBgdmVjdG9yKCR7Y29sdW1uLmRpbWVuc2lvbnN9KWA7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBjb2x1bW4udHlwZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRQZ0FycmF5VHlwZShjb2x1bW46IE1pZ3JhdGlvbkNvbHVtbiwgZWxlbWVudFR5cGU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChlbGVtZW50VHlwZSA9PT0gXCJudW1iZXJPck51bWVyaWNcIikge1xuICAgIGlmIChjb2x1bW4ubnVtYmVyVHlwZSA9PT0gXCJyZWFsXCIpIHJldHVybiBcInJlYWxbXVwiO1xuICAgIGlmIChjb2x1bW4ubnVtYmVyVHlwZSA9PT0gXCJkb3VibGUgcHJlY2lzaW9uXCIpIHJldHVybiBcImRvdWJsZSBwcmVjaXNpb25bXVwiO1xuICAgIHJldHVybiBgbnVtZXJpYygke2NvbHVtbi5wcmVjaXNpb259LCAke2NvbHVtbi5zY2FsZX0pW11gO1xuICB9XG4gIGlmIChlbGVtZW50VHlwZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiBjb2x1bW4ubGVuZ3RoID8gYHZhcmNoYXIoJHtjb2x1bW4ubGVuZ3RofSlbXWAgOiBcInRleHRbXVwiO1xuICB9XG4gIGlmIChlbGVtZW50VHlwZSA9PT0gXCJkYXRlXCIpIHJldHVybiBcInRpbWVzdGFtcHR6W11cIjtcbiAgaWYgKGVsZW1lbnRUeXBlID09PSBcImludGVnZXJcIikgcmV0dXJuIFwiaW50ZWdlcltdXCI7XG4gIGlmIChlbGVtZW50VHlwZSA9PT0gXCJiaWdJbnRlZ2VyXCIpIHJldHVybiBcImJpZ2ludFtdXCI7XG4gIGlmIChlbGVtZW50VHlwZSA9PT0gXCJib29sZWFuXCIpIHJldHVybiBcImJvb2xlYW5bXVwiO1xuICBpZiAoZWxlbWVudFR5cGUgPT09IFwidXVpZFwiKSByZXR1cm4gXCJ1dWlkW11cIjtcbiAgaWYgKGVsZW1lbnRUeXBlID09PSBcImVudW1cIikgcmV0dXJuIFwidGV4dFtdXCI7XG4gIGlmIChlbGVtZW50VHlwZSA9PT0gXCJ2ZWN0b3JcIikgcmV0dXJuIGB2ZWN0b3IoJHtjb2x1bW4uZGltZW5zaW9uc30pW11gO1xuXG4gIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBhcnJheSBlbGVtZW50IHR5cGU6ICR7ZWxlbWVudFR5cGV9YCk7XG59XG5cbi8qKlxuICog6rCc67OEIOyduOuNseyKpCDsoJXsnZgg7IOd7ISxXG4gKi9cbmZ1bmN0aW9uIGdlbkluZGV4RGVmaW5pdGlvbihpbmRleDogTWlncmF0aW9uSW5kZXgsIHRhYmxlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoaW5kZXgudHlwZSA9PT0gXCJobnN3XCIgfHwgaW5kZXgudHlwZSA9PT0gXCJpdmZmbGF0XCIpIHtcbiAgICByZXR1cm4gZ2VuVmVjdG9ySW5kZXhEZWZpbml0aW9uKGluZGV4LCB0YWJsZSk7XG4gIH1cblxuICBpZiAoaW5kZXgudXNpbmcgPT09IFwicGdyb29uZ2FcIikge1xuICAgIHJldHVybiBnZW5QZ3Jvb25nYUluZGV4RGVmaW5pdGlvbihpbmRleCwgdGFibGUpO1xuICB9XG5cbiAgY29uc3QgbWV0aG9kTWFwID0ge1xuICAgIGluZGV4OiBcIklOREVYXCIsXG4gICAgdW5pcXVlOiBcIlVOSVFVRSBJTkRFWFwiLFxuICB9O1xuXG4gIGNvbnN0IG51bGxzTm90RGlzdGluY3RDbGF1c2UgPVxuICAgIGluZGV4LnR5cGUgPT09IFwidW5pcXVlXCIgJiYgaW5kZXgubnVsbHNOb3REaXN0aW5jdCAhPT0gdW5kZWZpbmVkXG4gICAgICA/IGAgTlVMTFMgJHtpbmRleC5udWxsc05vdERpc3RpbmN0ID8gXCJOT1QgRElTVElOQ1RcIiA6IFwiRElTVElOQ1RcIn1gXG4gICAgICA6IFwiXCI7XG5cbiAgY29uc3QgdXNpbmdDbGF1c2UgPSBpbmRleC51c2luZyA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IGBVU0lORyAke2luZGV4LnVzaW5nfWA7XG4gIGNvbnN0IHdoZXJlQ2xhdXNlID0gZ2V0SW5kZXhXaGVyZUNsYXVzZShpbmRleCk7XG5cbiAgcmV0dXJuIGBhd2FpdCBrbmV4LnJhdyhcbiAgXFxgQ1JFQVRFICR7bWV0aG9kTWFwW2luZGV4LnR5cGVdfSAke2luZGV4Lm5hbWV9IE9OICR7dGFibGV9ICR7dXNpbmdDbGF1c2V9KCR7aW5kZXguY29sdW1uc1xuICAgIC5tYXAoKGNvbCkgPT4ge1xuICAgICAgY29uc3Qgb3BjbGFzc0NsYXVzZSA9ICgoKSA9PiB7XG4gICAgICAgIGNvbnN0IG9wY2xhc3MgPSBnZXRJbmRleENvbHVtbk9wY2xhc3MoY29sKTtcbiAgICAgICAgcmV0dXJuIG9wY2xhc3MgPyBgICR7b3BjbGFzc31gIDogXCJcIjtcbiAgICAgIH0pKCk7XG5cbiAgICAgIC8vIOygleugrCDsmLXshZjsnYAgYnRyZWXrp4wg7IKs7JqpIOqwgOuKpVxuICAgICAgaWYgKGluZGV4LnVzaW5nICE9PSBcImJ0cmVlXCIgJiYgaW5kZXgudXNpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gYCR7Y29sLm5hbWV9JHtvcGNsYXNzQ2xhdXNlfWA7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNvcnRPcmRlckNsYXVzZSA9IGNvbC5zb3J0T3JkZXIgPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBgICR7Y29sLnNvcnRPcmRlcn1gO1xuICAgICAgY29uc3QgbnVsbHNGaXJzdENsYXVzZSA9XG4gICAgICAgIGNvbC5udWxsc0ZpcnN0ID09PSB1bmRlZmluZWQgPyBcIlwiIDogYCBOVUxMUyAke2NvbC5udWxsc0ZpcnN0ID8gXCJGSVJTVFwiIDogXCJMQVNUXCJ9YDtcbiAgICAgIHJldHVybiBgJHtjb2wubmFtZX0ke29wY2xhc3NDbGF1c2V9JHtzb3J0T3JkZXJDbGF1c2V9JHtudWxsc0ZpcnN0Q2xhdXNlfWA7XG4gICAgfSlcbiAgICAuam9pbihcIiwgXCIpfSkke251bGxzTm90RGlzdGluY3RDbGF1c2V9JHt3aGVyZUNsYXVzZX07XFxgXG4gICk7YDtcbn1cblxuZnVuY3Rpb24gZ2VuUGdyb29uZ2FJbmRleERlZmluaXRpb24oaW5kZXg6IE1pZ3JhdGlvbkluZGV4LCB0YWJsZTogc3RyaW5nKSB7XG4gIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0QnlUYWJsZSh0YWJsZSk7XG4gIGNvbnN0IHdoZXJlQ2xhdXNlID0gZ2V0SW5kZXhXaGVyZUNsYXVzZShpbmRleCk7XG5cbiAgLy8g67O17ZWpIOyduOuNseyKpOyduCDqsr3smrAgQVJSQVkg7IKs7JqpXG4gIGNvbnN0IGNvbHVtbkNsYXVzZSA9ICgoKSA9PiB7XG4gICAgaWYgKGluZGV4LmNvbHVtbnMubGVuZ3RoID09PSAxKSB7XG4gICAgICBjb25zdCBjb2x1bW4gPSBlbnRpdHkucHJvcHNEaWN0W2luZGV4LmNvbHVtbnNbMF0ubmFtZV07XG4gICAgICBjb25zdCBvcHRpb24gPSBnZXRQZ3Jvb25nYUNvbHVtbk9wdGlvbihjb2x1bW4pO1xuICAgICAgcmV0dXJuIGAke2luZGV4LmNvbHVtbnNbMF0ubmFtZX0ke29wdGlvbiA/IGAgJHtvcHRpb259YCA6IFwiXCJ9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gYChBUlJBWVske2luZGV4LmNvbHVtbnMubWFwKChjb2wpID0+IGAke2NvbC5uYW1lfTo6dGV4dGApLmpvaW4oXCIsXCIpfV0pYDtcbiAgfSkoKTtcblxuICByZXR1cm4gYGF3YWl0IGtuZXgucmF3KFxuICBcXGBDUkVBVEUgSU5ERVggJHtpbmRleC5uYW1lfSBPTiAke3RhYmxlfSBVU0lORyBwZ3Jvb25nYSAoJHtjb2x1bW5DbGF1c2V9KSBXSVRIICh0b2tlbml6ZXI9J1Rva2VuTWVjYWInKSR7d2hlcmVDbGF1c2V9O1xcYFxuICApYDtcbn1cblxuLyoqXG4gKiBQR3Jvb25nYSDsu6zrn7wg7Ji17IWYIOy2lOy2nFxuICpcbiAqIEZ1bGxUZXh0IOyYpO2NvOugiOydtO2EsOulvCDsp4Dsm5DtlZjripQg6rK97JqwIOyasOyEoCDshKTsoJUsIOuCmOuouOyngOuKlCDrlJTtj7Ttirgg7J207JqpXG4gKiBAbGluayBodHRwczovL3Bncm9vbmdhLmdpdGh1Yi5pby9yZWZlcmVuY2VcbiAqL1xuZnVuY3Rpb24gZ2V0UGdyb29uZ2FDb2x1bW5PcHRpb24oY29sdW1uOiBFbnRpdHlQcm9wKSB7XG4gIGlmIChjb2x1bW4udHlwZSA9PT0gXCJzdHJpbmdcIiAmJiBjb2x1bW4ubGVuZ3RoICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gXCJwZ3Jvb25nYV92YXJjaGFyX2Z1bGxfdGV4dF9zZWFyY2hfb3BzX3YyXCI7XG4gIH0gZWxzZSBpZiAoY29sdW1uLnR5cGUgPT09IFwianNvblwiKSB7XG4gICAgcmV0dXJuIFwicGdyb29uZ2FfanNvbmJfZnVsbF90ZXh0X3NlYXJjaF9vcHNfdjJcIjtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIC0gSE5TVyAoSGllcmFyY2hpY2FsIE5hdmlnYWJsZSBTbWFsbCBXb3JsZCk6IOuKkOumsCDruYzrk5wsIOu5oOuluCDqsoDsg4kg7IaN64+ELCDrhpLsnYAg66mU66qo66asIOuwjyDsoJXtmZXrj4RcbiAqIC0gSVZGRmxhdCAoSW52ZXJ0ZWQgRmlsZSB3aXRoIEZsYXQgQ29tcHJlc3Npb24pOiDruaDrpbgg67mM65OcLCDspJHqsIQg6rKA7IOJIOyGjeuPhCwg64Ku7J2AIOuplOuqqOumrFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBITlNXIOyduOuNseyKpCAo6raM7J6lIC0g67mg66W4IOqygOyDiSwg64aS7J2AIOygle2ZleuPhClcbiAqIENSRUFURSBJTkRFWCBpZHhfZW1iZWRkaW5nIE9OIGl0ZW1zIFVTSU5HIGhuc3cgKGVtYmVkZGluZyB2ZWN0b3JfY29zaW5lX29wcykgV0lUSCAobSA9IDE2LCBlZl9jb25zdHJ1Y3Rpb24gPSA2NCk7XG4gKlxuICogLy8gSVZGRmxhdCDsnbjrjbHsiqQgKOuMgOyaqeufiSDrjbDsnbTthLAsIOu5hOyaqSDspJHsmpQg7IucKVxuICogQ1JFQVRFIElOREVYIGlkeF9lbWJlZGRpbmcgT04gaXRlbXMgVVNJTkcgaXZmZmxhdCAoZW1iZWRkaW5nIHZlY3Rvcl9jb3NpbmVfb3BzKSBXSVRIIChsaXN0cyA9IDEwMCk7XG4gKi9cbmZ1bmN0aW9uIGdlblZlY3RvckluZGV4RGVmaW5pdGlvbihpbmRleDogTWlncmF0aW9uSW5kZXgsIHRhYmxlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBjb2x1bW4gPSBpbmRleC5jb2x1bW5zWzBdO1xuICBjb25zdCB2ZWN0b3JPcHMgPSBnZXRJbmRleENvbHVtbk9wY2xhc3MoY29sdW1uKSA/PyBcInZlY3Rvcl9jb3NpbmVfb3BzXCI7XG4gIGNvbnN0IHdoZXJlQ2xhdXNlID0gZ2V0SW5kZXhXaGVyZUNsYXVzZShpbmRleCk7XG5cbiAgLy8gSE5TVyAoSGllcmFyY2hpY2FsIE5hdmlnYWJsZSBTbWFsbCBXb3JsZCkgLSDqtozsnqU6IOu5oOuluCDqsoDsg4ksIOuGkuydgCDsoJXtmZXrj4RcbiAgaWYgKGluZGV4LnR5cGUgPT09IFwiaG5zd1wiKSB7XG4gICAgY29uc3QgbSA9IGluZGV4Lm0gPz8gMTY7XG4gICAgY29uc3QgZWZDb25zdHJ1Y3Rpb24gPSBpbmRleC5lZkNvbnN0cnVjdGlvbiA/PyA2NDtcbiAgICByZXR1cm4gYGF3YWl0IGtuZXgucmF3KFxcYENSRUFURSBJTkRFWCAke2luZGV4Lm5hbWV9IE9OICR7dGFibGV9IFVTSU5HIGhuc3cgKCR7Y29sdW1uLm5hbWV9ICR7dmVjdG9yT3BzfSkgV0lUSCAobSA9ICR7bX0sIGVmX2NvbnN0cnVjdGlvbiA9ICR7ZWZDb25zdHJ1Y3Rpb259KSR7d2hlcmVDbGF1c2V9XFxgKTtgO1xuICB9XG5cbiAgLy8gSVZGRmxhdCAoSW52ZXJ0ZWQgRmlsZSB3aXRoIEZsYXQgQ29tcHJlc3Npb24pIC0g64yA7Jqp65+JLCDruYTsmqkg7KSR7JqUIOyLnFxuICBpZiAoaW5kZXgudHlwZSA9PT0gXCJpdmZmbGF0XCIpIHtcbiAgICBjb25zdCBsaXN0cyA9IGluZGV4Lmxpc3RzID8/IDEwMDtcbiAgICByZXR1cm4gYGF3YWl0IGtuZXgucmF3KFxcYENSRUFURSBJTkRFWCAke2luZGV4Lm5hbWV9IE9OICR7dGFibGV9IFVTSU5HIGl2ZmZsYXQgKCR7Y29sdW1uLm5hbWV9ICR7dmVjdG9yT3BzfSkgV0lUSCAobGlzdHMgPSAke2xpc3RzfSkke3doZXJlQ2xhdXNlfVxcYCk7YDtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihgVW5rbm93biByYXcgU1FMIGluZGV4IHR5cGU6ICR7aW5kZXgudHlwZX1gKTtcbn1cblxuZnVuY3Rpb24gZ2V0SW5kZXhXaGVyZUNsYXVzZShpbmRleDogTWlncmF0aW9uSW5kZXgpOiBzdHJpbmcge1xuICBjb25zdCB3aGVyZSA9IG5vcm1hbGl6ZUluZGV4V2hlcmVQcmVkaWNhdGUoaW5kZXgud2hlcmUpO1xuICByZXR1cm4gd2hlcmUgPyBgIFdIRVJFICR7d2hlcmV9YCA6IFwiXCI7XG59XG5cbi8qKlxuICog7YWM7J2067iUIOyDneyEse2VmOuKlCDsvIDsnbTsiqQgLSBGSyDsg53shLFcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVDcmVhdGVDb2RlX0ZvcmVpZ24oXG4gIHRhYmxlOiBzdHJpbmcsXG4gIGZvcmVpZ25zOiBNaWdyYXRpb25Gb3JlaWduW10sXG4pOiBQcm9taXNlPEdlbk1pZ3JhdGlvbkNvZGVbXT4ge1xuICBpZiAoZm9yZWlnbnMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgeyB1cCwgZG93biB9ID0gZ2VuRm9yZWlnbkRlZmluaXRpb25zKHRhYmxlLCBmb3JlaWducyk7XG4gIGlmICh1cC5sZW5ndGggPT09IDAgJiYgZG93bi5sZW5ndGggPT09IDApIHtcbiAgICAvLyBmb3JlaWduc+qwgCDsnojripTrjbAg7IOd7ISx65CcIOy9lOuTnOqwgCDsl4bripQg6rK97Jqw64qUIOu5hOygleyDgeyggeyduCDsg4HtmansnbTsp4Drp4wsXG4gICAgLy8g66eI7J206re466CI7J207IWYIOyDneyEseydhCDspJHri6jsi5ztgqTsp4Ag7JWK6rOgIOu5iCDrsLDsl7TsnYQg67CY7ZmY7ZWp64uI64ukLlxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtcbiAgICAnaW1wb3J0IHsgS25leCB9IGZyb20gXCJrbmV4XCI7JyxcbiAgICBcIlwiLFxuICAgIFwiZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwKGtuZXg6IEtuZXgpOiBQcm9taXNlPHZvaWQ+IHtcIixcbiAgICBgcmV0dXJuIGtuZXguc2NoZW1hLmFsdGVyVGFibGUoXCIke3RhYmxlfVwiLCAodGFibGUpID0+IHtgLFxuICAgIFwiLy8gY3JlYXRlIGZrXCIsXG4gICAgLi4udXAsXG4gICAgXCJ9KTtcIixcbiAgICBcIn1cIixcbiAgICBcIlwiLFxuICAgIFwiZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRvd24oa25leDogS25leCk6IFByb21pc2U8dm9pZD4ge1wiLFxuICAgIGByZXR1cm4ga25leC5zY2hlbWEuYWx0ZXJUYWJsZShcIiR7dGFibGV9XCIsICh0YWJsZSkgPT4ge2AsXG4gICAgXCIvLyBkcm9wIGZrXCIsXG4gICAgLi4uZG93bixcbiAgICBcIn0pO1wiLFxuICAgIFwifVwiLFxuICBdO1xuXG4gIGNvbnN0IGZvcmVpZ25LZXlzU3RyaW5nID0gZm9yZWlnbnMubWFwKChmb3JlaWduKSA9PiBmb3JlaWduLmNvbHVtbnMuam9pbihcIl9cIikpLmpvaW4oXCJfXCIpO1xuICByZXR1cm4gW1xuICAgIHtcbiAgICAgIHRhYmxlLFxuICAgICAgdHlwZTogXCJmb3JlaWduXCIsXG4gICAgICB0aXRsZTogYGZvcmVpZ25fXyR7dGFibGV9X18ke2ZvcmVpZ25LZXlzU3RyaW5nfWAsXG4gICAgICBmb3JtYXR0ZWQ6IGF3YWl0IGZvcm1hdENvZGUobGluZXMuam9pbihcIlxcblwiKSwgYHNyYy9taWdyYXRpb24vJHt0YWJsZX0udHNgKSxcbiAgICB9LFxuICBdO1xufVxuXG4vKipcbiAqIE1pZ3JhdGlvbkZvcmVpZ25bXSDsnb3slrTshJwg7Jm467aA7YKkIGNvbnN0cmFpbnQg7KCV7J2Y7ZWY64qUIOq1rOusuCDsg53shLFcbiAqL1xuZnVuY3Rpb24gZ2VuRm9yZWlnbkRlZmluaXRpb25zKFxuICB0YWJsZTogc3RyaW5nLFxuICBmb3JlaWduczogTWlncmF0aW9uRm9yZWlnbltdLFxuKTogeyB1cDogc3RyaW5nW107IGRvd246IHN0cmluZ1tdIH0ge1xuICByZXR1cm4gZm9yZWlnbnMucmVkdWNlKFxuICAgIChyLCBmb3JlaWduKSA9PiB7XG4gICAgICBjb25zdCBjb2x1bW5zU3RyaW5nUXVvdGUgPSBmb3JlaWduLmNvbHVtbnNcbiAgICAgICAgLm1hcCgoY29sKSA9PiBgJyR7Y29sLnJlcGxhY2UoYCR7dGFibGV9LmAsIFwiXCIpfSdgKVxuICAgICAgICAuam9pbihcIixcIik7XG4gICAgICByLnVwLnB1c2goXG4gICAgICAgIGB0YWJsZS5mb3JlaWduKCcke2ZvcmVpZ24uY29sdW1ucy5qb2luKFwiLFwiKX0nKVxuICAgICAgICAgICAgLnJlZmVyZW5jZXMoJyR7Zm9yZWlnbi50b30nKVxuICAgICAgICAgICAgLm9uVXBkYXRlKCcke2ZvcmVpZ24ub25VcGRhdGV9JylcbiAgICAgICAgICAgIC5vbkRlbGV0ZSgnJHtmb3JlaWduLm9uRGVsZXRlfScpYCxcbiAgICAgICk7XG4gICAgICByLmRvd24ucHVzaChgdGFibGUuZHJvcEZvcmVpZ24oWyR7Y29sdW1uc1N0cmluZ1F1b3RlfV0pYCk7XG4gICAgICByZXR1cm4gcjtcbiAgICB9LFxuICAgIHtcbiAgICAgIHVwOiBbXSBhcyBzdHJpbmdbXSxcbiAgICAgIGRvd246IFtdIGFzIHN0cmluZ1tdLFxuICAgIH0sXG4gICk7XG59XG5cbi8qKlxuICog7YWM7J2067iUIOuzgOqyvSDsvIDsnbTsiqQgLSDsu6zrn7wv7J24642x7IqkIOuzgOqyvVxuICovXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUFsdGVyQ29kZV9Db2x1bW5BbmRJbmRleGVzKFxuICB0YWJsZTogc3RyaW5nLFxuICBlbnRpdHlDb2x1bW5zOiBNaWdyYXRpb25Db2x1bW5bXSxcbiAgZW50aXR5SW5kZXhlczogTWlncmF0aW9uSW5kZXhbXSxcbiAgZGJDb2x1bW5zOiBNaWdyYXRpb25Db2x1bW5bXSxcbiAgZGJJbmRleGVzOiBNaWdyYXRpb25JbmRleFtdLFxuICBkYkZvcmVpZ25zOiBNaWdyYXRpb25Gb3JlaWduW10sXG4gIGNvbXBhcmVEQj86IEtuZXgsXG4pOiBQcm9taXNlPEdlbk1pZ3JhdGlvbkNvZGVbXT4ge1xuICBjb25zdCByZXNvbHZlZEVudGl0eUNvbHVtbnMgPSByZXNvbHZlU2VhcmNoVGV4dENvbHVtbnModGFibGUsIGVudGl0eUNvbHVtbnMpO1xuICBjb25zdCBzZWFyY2hUZXh0Q29sdW1uTmFtZXMgPSBnZXRTZWFyY2hUZXh0Q29sdW1uTmFtZXModGFibGUpO1xuICAvKlxuICAgIOyEuOu2gCDruYTqtZAg7ZuEIOuLpOuluOygkCDssL7slYTshJwg7L2U65OcIOyDneyEsVxuXG4gICAgMS4g7Lus65+86rCv7IiYIOuLpOumhDogTUTsl5Ag7J6I7Jy864KYLCBEQuyXkCDsl4bri6TrqbQg7LaU6rCAXG4gICAgMi4g7Lus65+86rCv7IiYIOuLpOumhDogTUTsl5Ag7JeG7Jy864KYLCBEQuyXkCDsnojri6TrqbQg7IKt7KCcXG4gICAgMy4g6re47Jm4IOy7rOufvCjsu6zrn7wg6rCv7IiY6rCAIOuPmeydvO2VmOqxsOuCmCwg64uk66W4IOqyveyasCDrj5nsnbztlZwg7Lus65+864G866asKSA9PiBhbHRlclxuICAgIDQuIOuLpOuluOqxsCDri6Qg64+Z7J287ZWY6rOgIGluZGV466eMIOuzgOqyveuQmOuKlCDqsr3smrBcblxuICAgICoqIOy7rOufvOuqheydhCDrs4Dqsr3tlZjripQg6rK97Jqw64qUIOuUsOuhnCDtlbjrk6Trp4HtlZjsp4Ag7JWK7J2MXG4gICAgPT4gZHJvcC9hZGQg7ZiV7YOc7J2YIOuniOydtOq3uOugiOydtOyFmCDsvZTrk5zqsIAg7IOd7ISx65CY64qU642wLCDsiJjrj5nsnLzroZwgcmVuYW1lIOy9lOuTnOuhnCDsiJjsoJXtlZjsl6wg7LKY66asXG4gICovXG5cbiAgLy8gUEsoaWQpIOy7rOufvCDtg4DsnoUg67OA6rK9IOqwkOyngCDrsI8g7LKY66asXG4gIGNvbnN0IGVudGl0eUlkQ29sID0gcmVzb2x2ZWRFbnRpdHlDb2x1bW5zLmZpbmQoKGNvbCkgPT4gY29sLm5hbWUgPT09IFwiaWRcIik7XG4gIGNvbnN0IGRiSWRDb2wgPSBkYkNvbHVtbnMuZmluZCgoY29sKSA9PiBjb2wubmFtZSA9PT0gXCJpZFwiKTtcblxuICBpZiAoZW50aXR5SWRDb2wgJiYgZGJJZENvbCAmJiBjb21wYXJlREIpIHtcbiAgICBjb25zdCBpc1BrVHlwZUNoYW5nZWQgPVxuICAgICAgZW50aXR5SWRDb2wudHlwZSAhPT0gZGJJZENvbC50eXBlIHx8IGVudGl0eUlkQ29sLmxlbmd0aCAhPT0gZGJJZENvbC5sZW5ndGg7XG5cbiAgICBpZiAoaXNQa1R5cGVDaGFuZ2VkKSB7XG4gICAgICByZXR1cm4gZ2VuZXJhdGVQa1R5cGVDaGFuZ2VNaWdyYXRpb24oXG4gICAgICAgIHRhYmxlLFxuICAgICAgICBlbnRpdHlJZENvbCxcbiAgICAgICAgZGJJZENvbCxcbiAgICAgICAgcmVzb2x2ZWRFbnRpdHlDb2x1bW5zLFxuICAgICAgICBlbnRpdHlJbmRleGVzLFxuICAgICAgICBkYkNvbHVtbnMsXG4gICAgICAgIGRiSW5kZXhlcyxcbiAgICAgICAgZGJGb3JlaWducyxcbiAgICAgICAgY29tcGFyZURCLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvLyDqsIEg7Lus65+8IOydtOumhCDquLDspIDsnLzroZwgYWRkLCBkcm9wLCBhbHRlciDsl6zrtoAg7ZmV7J24XG4gIGNvbnN0IGFsdGVyQ29sdW1uc1RvID0gZ2V0QWx0ZXJDb2x1bW5zVG8ocmVzb2x2ZWRFbnRpdHlDb2x1bW5zLCBkYkNvbHVtbnMsIHNlYXJjaFRleHRDb2x1bW5OYW1lcyk7XG5cbiAgLy8g7LaU7Lac65CcIOy7rOufvOuTpOydhCDquLDspIDsnLzroZwg6rCB6rCBIOudvOyduCDsg53shLFcbiAgY29uc3QgYWx0ZXJDb2x1bW5MaW5lc1RvID0gZ2V0QWx0ZXJDb2x1bW5MaW5lc1RvKFxuICAgIGFsdGVyQ29sdW1uc1RvLFxuICAgIHJlc29sdmVkRW50aXR5Q29sdW1ucyxcbiAgICB0YWJsZSxcbiAgICBkYkZvcmVpZ25zLFxuICApO1xuXG4gIC8vIOyduOuNseyKpOydmCBhZGQsIGRyb3Ag7Jes67aAIO2ZleyduFxuICBjb25zdCBhbHRlckluZGV4ZXNUbyA9IGdldEFsdGVySW5kZXhlc1RvKGVudGl0eUluZGV4ZXMsIGRiSW5kZXhlcyk7XG4gIGNvbnN0IHJlY3JlYXRlZFNlYXJjaFRleHRDb2x1bW5OYW1lcyA9IG5ldyBTZXQoXG4gICAgYWx0ZXJDb2x1bW5zVG8uYWx0ZXJcbiAgICAgIC5maWx0ZXIoKGRiQ29sdW1uKSA9PiB7XG4gICAgICAgIGNvbnN0IGVudGl0eUNvbHVtbiA9IHJlc29sdmVkRW50aXR5Q29sdW1ucy5maW5kKChjb2wpID0+IGNvbC5uYW1lID09PSBkYkNvbHVtbi5uYW1lKTtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBzZWFyY2hUZXh0Q29sdW1uTmFtZXMuaGFzKGRiQ29sdW1uLm5hbWUpICYmXG4gICAgICAgICAgZGJDb2x1bW4uZ2VuZXJhdGVkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICBlbnRpdHlDb2x1bW4/LmdlbmVyYXRlZCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICk7XG4gICAgICB9KVxuICAgICAgLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4ubmFtZSksXG4gICk7XG4gIGNvbnN0IHJlY3JlYXRlZFNlYXJjaFRleHREYkluZGV4ZXMgPSBkYkluZGV4ZXMuZmlsdGVyKFxuICAgIChpbmRleCkgPT5cbiAgICAgIGluZGV4LmNvbHVtbnMuc29tZSgoeyBuYW1lIH0pID0+IHJlY3JlYXRlZFNlYXJjaFRleHRDb2x1bW5OYW1lcy5oYXMobmFtZSkpICYmXG4gICAgICAhYWx0ZXJJbmRleGVzVG8uZHJvcC5zb21lKChkcm9wSW5kZXgpID0+IGRyb3BJbmRleC5uYW1lID09PSBpbmRleC5uYW1lKSxcbiAgKTtcbiAgY29uc3QgcmVjcmVhdGVkU2VhcmNoVGV4dEVudGl0eUluZGV4ZXMgPSBlbnRpdHlJbmRleGVzLmZpbHRlcihcbiAgICAoaW5kZXgpID0+XG4gICAgICBpbmRleC5jb2x1bW5zLnNvbWUoKHsgbmFtZSB9KSA9PiByZWNyZWF0ZWRTZWFyY2hUZXh0Q29sdW1uTmFtZXMuaGFzKG5hbWUpKSAmJlxuICAgICAgIWFsdGVySW5kZXhlc1RvLmFkZC5zb21lKChhZGRJbmRleCkgPT4gYWRkSW5kZXgubmFtZSA9PT0gaW5kZXgubmFtZSksXG4gICk7XG4gIGNvbnN0IGltcGxpY2l0bHlEcm9wcGVkRGJJbmRleGVzID0gYWx0ZXJJbmRleGVzVG8uZHJvcC5maWx0ZXIoKGluZGV4KSA9PlxuICAgIGluZGV4LmNvbHVtbnMuZXZlcnkoKHsgbmFtZSB9KSA9PiBhbHRlckNvbHVtbnNUby5kcm9wLnNvbWUoKGNvbHVtbikgPT4gY29sdW1uLm5hbWUgPT09IG5hbWUpKSxcbiAgKTtcblxuICAvLyDsnbjrjbHsiqTqsIAg7IKt7KCc65CY64qUIOqyveyasCwg7Lus65+86rO8IOqwmeydtCDsgq3soJzrkJwg7LyA7J207Iqk7JeQ64qUIGRyb3Dsl5DshJwg7KCc7Jm47ZW07JW87ZWoIVxuICBjb25zdCBpbmRleE5lZWRzVG9Ecm9wID0gYWx0ZXJJbmRleGVzVG8uZHJvcC5maWx0ZXIoXG4gICAgKGluZGV4KSA9PiAhaW1wbGljaXRseURyb3BwZWREYkluZGV4ZXMuc29tZSgoZHJvcHBlZEluZGV4KSA9PiBkcm9wcGVkSW5kZXgubmFtZSA9PT0gaW5kZXgubmFtZSksXG4gICk7XG5cbiAgLy8g67mIIOy9lOuTnCDsg53shLEg67Cp7KeAXG4gIGNvbnN0IGhhc1VwQ2hhbmdlcyA9XG4gICAgYWx0ZXJDb2x1bW5MaW5lc1RvLmFkZC51cC5idWlsZGVyLmxlbmd0aCA+IDAgfHxcbiAgICBhbHRlckNvbHVtbkxpbmVzVG8uYWRkLnVwLnJhdy5sZW5ndGggPiAwIHx8XG4gICAgYWx0ZXJDb2x1bW5MaW5lc1RvLmRyb3AudXAuYnVpbGRlci5sZW5ndGggPiAwIHx8XG4gICAgYWx0ZXJDb2x1bW5MaW5lc1RvLmFsdGVyLnVwLmJ1aWxkZXIubGVuZ3RoID4gMCB8fFxuICAgIGFsdGVyQ29sdW1uTGluZXNUby5hbHRlci51cC5yYXcubGVuZ3RoID4gMCB8fFxuICAgIGFsdGVySW5kZXhlc1RvLmFkZC5sZW5ndGggPiAwIHx8XG4gICAgaW5kZXhOZWVkc1RvRHJvcC5sZW5ndGggPiAwIHx8XG4gICAgcmVjcmVhdGVkU2VhcmNoVGV4dERiSW5kZXhlcy5sZW5ndGggPiAwO1xuICBpZiAoIWhhc1VwQ2hhbmdlcykge1xuICAgIC8vIOuzgOqyveyCrO2VreydtCDsl4bsnLzrqbQg67mIIOuwsOyXtCDrsJjtmZhcbiAgICByZXR1cm4gW107XG4gIH1cbiAgTmFpdGUudChcIm1pZ3JhdG9yOmdlbmVyYXRlQWx0ZXJDb2RlX0NvbHVtbkFuZEluZGV4ZXM6ZGVidWdcIiwge1xuICAgIFwiYWx0ZXJDb2x1bW5zVG8uYWRkLmxlbmd0aFwiOiBhbHRlckNvbHVtbnNUby5hZGQubGVuZ3RoLFxuICAgIFwiYWx0ZXJDb2x1bW5zVG8uZHJvcC5sZW5ndGhcIjogYWx0ZXJDb2x1bW5zVG8uZHJvcC5sZW5ndGgsXG4gICAgXCJhbHRlckNvbHVtbnNUby5hbHRlci5sZW5ndGhcIjogYWx0ZXJDb2x1bW5zVG8uYWx0ZXIubGVuZ3RoLFxuICAgIFwiYWx0ZXJJbmRleGVzVG8uYWRkLmxlbmd0aFwiOiBhbHRlckluZGV4ZXNUby5hZGQubGVuZ3RoLFxuICAgIFwiYWx0ZXJJbmRleGVzVG8uZHJvcC5sZW5ndGhcIjogYWx0ZXJJbmRleGVzVG8uZHJvcC5sZW5ndGgsXG4gICAgXCJpbmRleE5lZWRzVG9Ecm9wLmxlbmd0aFwiOiBpbmRleE5lZWRzVG9Ecm9wLmxlbmd0aCxcbiAgfSk7XG4gIC8vIE5haXRlLnQoXCJtaWdyYXRvcjpnZW5lcmF0ZUFsdGVyQ29kZV9Db2x1bW5BbmRJbmRleGVzOmFsdGVyQ29sdW1uc1RvXCIsIGFsdGVyQ29sdW1uc1RvKTtcblxuICAvLyBUT0RPOiDsnbjrjbHsiqTrqoUg67OA6rK965CcIOqyveyasCDsspjrpqxcblxuICAvLyB0YWJsZSBidWlsZGVyIOuplOyEnOuTnOuhnCDsi6TtlontlaAg7L2U65OcIChkcm9wIOKGkiBhZGQg4oaSIGFsdGVyIOyInOyEnClcbiAgY29uc3QgdXBCdWlsZGVyTGluZXMgPSBbXG4gICAgLi4uKGFsdGVyQ29sdW1uTGluZXNUby5kcm9wLnVwLmJ1aWxkZXIubGVuZ3RoID4gMCA/IGFsdGVyQ29sdW1uTGluZXNUby5kcm9wLnVwLmJ1aWxkZXIgOiBbXSksXG4gICAgLi4uKGFsdGVyQ29sdW1uTGluZXNUby5hZGQudXAuYnVpbGRlci5sZW5ndGggPiAwID8gYWx0ZXJDb2x1bW5MaW5lc1RvLmFkZC51cC5idWlsZGVyIDogW10pLFxuICAgIC4uLnJlY3JlYXRlZFNlYXJjaFRleHREYkluZGV4ZXMubWFwKGdlbkluZGV4RHJvcERlZmluaXRpb24pLFxuICAgIC4uLihhbHRlckNvbHVtbkxpbmVzVG8uYWx0ZXIudXAuYnVpbGRlci5sZW5ndGggPiAwID8gYWx0ZXJDb2x1bW5MaW5lc1RvLmFsdGVyLnVwLmJ1aWxkZXIgOiBbXSksXG4gICAgLi4uaW5kZXhOZWVkc1RvRHJvcC5tYXAoZ2VuSW5kZXhEcm9wRGVmaW5pdGlvbiksXG4gIF07XG5cbiAgLy8ga25leC5yYXcoKeuhnCDsi6TtlontlaAg7L2U65OcXG4gIGNvbnN0IHVwUmF3TGluZXMgPSBbXG4gICAgLi4uKGFsdGVyQ29sdW1uTGluZXNUby5hZGQudXAucmF3Lmxlbmd0aCA+IDAgPyBhbHRlckNvbHVtbkxpbmVzVG8uYWRkLnVwLnJhdyA6IFtdKSxcbiAgICAuLi4oYWx0ZXJDb2x1bW5MaW5lc1RvLmFsdGVyLnVwLnJhdy5sZW5ndGggPiAwID8gYWx0ZXJDb2x1bW5MaW5lc1RvLmFsdGVyLnVwLnJhdyA6IFtdKSxcbiAgICAuLi5yZWNyZWF0ZWRTZWFyY2hUZXh0RW50aXR5SW5kZXhlcy5tYXAoKGluZGV4KSA9PiBnZW5JbmRleERlZmluaXRpb24oaW5kZXgsIHRhYmxlKSksXG4gICAgLi4uYWx0ZXJJbmRleGVzVG8uYWRkLm1hcCgoaW5kZXgpID0+IGdlbkluZGV4RGVmaW5pdGlvbihpbmRleCwgdGFibGUpKSxcbiAgXTtcblxuICAvLyBkb3du7J2AIHVw7J2YIOyXreyInCAoYWRkLmRvd24gPSBkcm9wIHJvbGxiYWNrLCBkcm9wLmRvd24gPSBhZGQgcm9sbGJhY2spXG4gIGNvbnN0IGRvd25CdWlsZGVyTGluZXMgPSBbXG4gICAgLi4uKGFsdGVyQ29sdW1uTGluZXNUby5hZGQuZG93bi5idWlsZGVyLmxlbmd0aCA+IDAgPyBhbHRlckNvbHVtbkxpbmVzVG8uYWRkLmRvd24uYnVpbGRlciA6IFtdKSxcbiAgICAuLi5yZWNyZWF0ZWRTZWFyY2hUZXh0RW50aXR5SW5kZXhlcy5tYXAoZ2VuSW5kZXhEcm9wRGVmaW5pdGlvbiksXG4gICAgLi4uKGFsdGVyQ29sdW1uTGluZXNUby5hbHRlci5kb3duLmJ1aWxkZXIubGVuZ3RoID4gMFxuICAgICAgPyBhbHRlckNvbHVtbkxpbmVzVG8uYWx0ZXIuZG93bi5idWlsZGVyXG4gICAgICA6IFtdKSxcbiAgICAuLi4oYWx0ZXJDb2x1bW5MaW5lc1RvLmRyb3AuZG93bi5idWlsZGVyLmxlbmd0aCA+IDBcbiAgICAgID8gYWx0ZXJDb2x1bW5MaW5lc1RvLmRyb3AuZG93bi5idWlsZGVyXG4gICAgICA6IFtdKSxcbiAgICAuLi5hbHRlckluZGV4ZXNUby5hZGRcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChpbmRleCkgPT5cbiAgICAgICAgICAhaW5kZXguY29sdW1ucy5ldmVyeSgoaW5kZXhDb2wpID0+XG4gICAgICAgICAgICBhbHRlckNvbHVtbnNUby5hZGQubWFwKChjb2wpID0+IGNvbC5uYW1lKS5pbmNsdWRlcyhpbmRleENvbC5uYW1lKSxcbiAgICAgICAgICApLFxuICAgICAgKVxuICAgICAgLm1hcChnZW5JbmRleERyb3BEZWZpbml0aW9uKSxcbiAgXTtcblxuICBjb25zdCBkb3duUmF3TGluZXMgPSBbXG4gICAgLi4uKGFsdGVyQ29sdW1uTGluZXNUby5kcm9wLmRvd24ucmF3Lmxlbmd0aCA+IDAgPyBhbHRlckNvbHVtbkxpbmVzVG8uZHJvcC5kb3duLnJhdyA6IFtdKSxcbiAgICAuLi4oYWx0ZXJDb2x1bW5MaW5lc1RvLmFsdGVyLmRvd24ucmF3Lmxlbmd0aCA+IDAgPyBhbHRlckNvbHVtbkxpbmVzVG8uYWx0ZXIuZG93bi5yYXcgOiBbXSksXG4gICAgLi4ucmVjcmVhdGVkU2VhcmNoVGV4dERiSW5kZXhlcy5tYXAoKGluZGV4KSA9PiBnZW5JbmRleERlZmluaXRpb24oaW5kZXgsIHRhYmxlKSksXG4gICAgLi4uaW1wbGljaXRseURyb3BwZWREYkluZGV4ZXMubWFwKChpbmRleCkgPT4gZ2VuSW5kZXhEZWZpbml0aW9uKGluZGV4LCB0YWJsZSkpLFxuICAgIC4uLmluZGV4TmVlZHNUb0Ryb3AubWFwKChpbmRleCkgPT4gZ2VuSW5kZXhEZWZpbml0aW9uKGluZGV4LCB0YWJsZSkpLFxuICBdO1xuXG4gIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtcbiAgICAnaW1wb3J0IHsgS25leCB9IGZyb20gXCJrbmV4XCI7JyxcbiAgICBcIlwiLFxuICAgIFwiZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwKGtuZXg6IEtuZXgpOiBQcm9taXNlPHZvaWQ+IHtcIixcbiAgICAuLi4odXBCdWlsZGVyTGluZXMubGVuZ3RoID4gMFxuICAgICAgPyBbYGF3YWl0IGtuZXguc2NoZW1hLmFsdGVyVGFibGUoXCIke3RhYmxlfVwiLCAodGFibGUpID0+IHtgLCAuLi51cEJ1aWxkZXJMaW5lcywgXCJ9KTtcIl1cbiAgICAgIDogW10pLFxuICAgIC4uLnVwUmF3TGluZXMsXG4gICAgXCJ9XCIsXG4gICAgXCJcIixcbiAgICBcImV4cG9ydCBhc3luYyBmdW5jdGlvbiBkb3duKGtuZXg6IEtuZXgpOiBQcm9taXNlPHZvaWQ+IHtcIixcbiAgICAuLi4oZG93bkJ1aWxkZXJMaW5lcy5sZW5ndGggPiAwXG4gICAgICA/IFtgYXdhaXQga25leC5zY2hlbWEuYWx0ZXJUYWJsZShcIiR7dGFibGV9XCIsICh0YWJsZSkgPT4ge2AsIC4uLmRvd25CdWlsZGVyTGluZXMsIFwifSk7XCJdXG4gICAgICA6IFtdKSxcbiAgICAuLi5kb3duUmF3TGluZXMsXG4gICAgXCJ9XCIsXG4gIF07XG5cbiAgY29uc3QgZm9ybWF0dGVkID0gYXdhaXQgZm9ybWF0Q29kZShsaW5lcy5qb2luKFwiXFxuXCIpLCBgc3JjL21pZ3JhdGlvbi8ke3RhYmxlfS50c2ApO1xuICBjb25zdCB0aXRsZSA9IFtcbiAgICBcImFsdGVyXCIsXG4gICAgdGFibGUsXG4gICAgLi4uKFtcImFkZFwiLCBcImRyb3BcIiwgXCJhbHRlclwiXSBhcyBjb25zdClcbiAgICAgIC5tYXAoKGFjdGlvbikgPT4ge1xuICAgICAgICBjb25zdCBsZW4gPSBhbHRlckNvbHVtbnNUb1thY3Rpb25dLmxlbmd0aDtcbiAgICAgICAgaWYgKGxlbiA+IDApIHtcbiAgICAgICAgICByZXR1cm4gYWN0aW9uICsgbGVuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoKHBhcnQpID0+IHBhcnQgIT09IG51bGwpLFxuICBdLmpvaW4oXCJfXCIpO1xuXG4gIHJldHVybiBbXG4gICAge1xuICAgICAgdGFibGUsXG4gICAgICB0aXRsZSxcbiAgICAgIGZvcm1hdHRlZCxcbiAgICAgIHR5cGU6IFwibm9ybWFsXCIsXG4gICAgfSxcbiAgXTtcbn1cblxuLyoqXG4gKiDsu6zrn7wg67mE6rWQ66W8IOychO2VtCBHZW5lcmF0ZWQgQ29sdW1u7J2YIGV4cHJlc3Npb27snYQg7KCc7Jm47ZWcIOqwneyytOulvCDsg53shLFcbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplQ29sdW1uRm9yQ29tcGFyaXNvbihcbiAgY29sOiBNaWdyYXRpb25Db2x1bW4sXG4gIHNlYXJjaFRleHRDb2x1bW5OYW1lczogU2V0PHN0cmluZz4sXG4pOiBNaWdyYXRpb25Db2x1bW4ge1xuICBpZiAoIWNvbC5nZW5lcmF0ZWQpIHtcbiAgICByZXR1cm4gY29sO1xuICB9XG5cbiAgaWYgKCFzZWFyY2hUZXh0Q29sdW1uTmFtZXMuaGFzKGNvbC5uYW1lKSkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5jb2wsXG4gICAgICBnZW5lcmF0ZWQ6IHVuZGVmaW5lZCxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5jb2wsXG4gICAgZ2VuZXJhdGVkOiB7XG4gICAgICAuLi5jb2wuZ2VuZXJhdGVkLFxuICAgICAgZXhwcmVzc2lvbjogY2Fub25pY2FsaXplU2VhcmNoVGV4dEdlbmVyYXRlZEV4cHJlc3Npb24oY29sLmdlbmVyYXRlZC5leHByZXNzaW9uKSxcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIOqwgSDsu6zrn7wg7J2066aEIOq4sOykgOycvOuhnCBhZGQsIGRyb3AsIGFsdGVyIOyXrOu2gCDtmZXsnbhcbiAqL1xuZnVuY3Rpb24gZ2V0QWx0ZXJDb2x1bW5zVG8oXG4gIGVudGl0eUNvbHVtbnM6IE1pZ3JhdGlvbkNvbHVtbltdLFxuICBkYkNvbHVtbnM6IE1pZ3JhdGlvbkNvbHVtbltdLFxuICBzZWFyY2hUZXh0Q29sdW1uTmFtZXM6IFNldDxzdHJpbmc+LFxuKSB7XG4gIGNvbnN0IGNvbHVtbnNUbyA9IHtcbiAgICBhZGQ6IFtdIGFzIE1pZ3JhdGlvbkNvbHVtbltdLFxuICAgIGRyb3A6IFtdIGFzIE1pZ3JhdGlvbkNvbHVtbltdLFxuICAgIGFsdGVyOiBbXSBhcyBNaWdyYXRpb25Db2x1bW5bXSxcbiAgfTtcblxuICAvLyDsu6zrn7zrqoUg6riw7KSAIOu5hOq1kFxuICBjb25zdCBleHRyYUNvbHVtbnMgPSB7XG4gICAgZGI6IGRpZmYoZGJDb2x1bW5zLCBlbnRpdHlDb2x1bW5zLCAoY29sKSA9PiBbY29sLm5hbWUsIGNvbC5nZW5lcmF0ZWQ/LnR5cGVdLmpvaW4oXCIvLy9cIikpLFxuICAgIGVudGl0eTogZGlmZihlbnRpdHlDb2x1bW5zLCBkYkNvbHVtbnMsIChjb2wpID0+IFtjb2wubmFtZSwgY29sLmdlbmVyYXRlZD8udHlwZV0uam9pbihcIi8vL1wiKSksXG4gIH07XG4gIGlmIChleHRyYUNvbHVtbnMuZW50aXR5Lmxlbmd0aCA+IDApIHtcbiAgICBjb2x1bW5zVG8uYWRkID0gY29sdW1uc1RvLmFkZC5jb25jYXQoZXh0cmFDb2x1bW5zLmVudGl0eSk7XG4gIH1cbiAgaWYgKGV4dHJhQ29sdW1ucy5kYi5sZW5ndGggPiAwKSB7XG4gICAgY29sdW1uc1RvLmRyb3AgPSBjb2x1bW5zVG8uZHJvcC5jb25jYXQoZXh0cmFDb2x1bW5zLmRiKTtcbiAgfVxuXG4gIC8vIOuPmeydvCDsu6zrn7zrqoXsnZgg7IS467aAIO2VhOuTnCDruYTqtZBcbiAgY29uc3Qgc2FtZURiQ29sdW1ucyA9IGludGVyc2VjdGlvbkJ5KGRiQ29sdW1ucywgZW50aXR5Q29sdW1ucywgKGNvbCkgPT4gY29sLm5hbWUpO1xuICBjb25zdCBzYW1lTWRDb2x1bW5zID0gaW50ZXJzZWN0aW9uQnkoZW50aXR5Q29sdW1ucywgZGJDb2x1bW5zLCAoY29sKSA9PiBjb2wubmFtZSk7XG4gIGNvbHVtbnNUby5hbHRlciA9IGRpZmZlcmVuY2VXaXRoKHNhbWVEYkNvbHVtbnMsIHNhbWVNZENvbHVtbnMsIChhLCBiKSA9PlxuICAgIGVxdWFsKFxuICAgICAgbm9ybWFsaXplQ29sdW1uRm9yQ29tcGFyaXNvbihhLCBzZWFyY2hUZXh0Q29sdW1uTmFtZXMpLFxuICAgICAgbm9ybWFsaXplQ29sdW1uRm9yQ29tcGFyaXNvbihiLCBzZWFyY2hUZXh0Q29sdW1uTmFtZXMpLFxuICAgICksXG4gICk7XG5cbiAgcmV0dXJuIGNvbHVtbnNUbztcbn1cblxuLyoqXG4gKiDstpTstpzrkJwg7Lus65+865Ok7J2EIOq4sOykgOycvOuhnCDqsIHqsIEg65287J24IOyDneyEsVxuICovXG5mdW5jdGlvbiBnZXRBbHRlckNvbHVtbkxpbmVzVG8oXG4gIGNvbHVtbnNUbzogUmV0dXJuVHlwZTx0eXBlb2YgZ2V0QWx0ZXJDb2x1bW5zVG8+LFxuICBlbnRpdHlDb2x1bW5zOiBNaWdyYXRpb25Db2x1bW5bXSxcbiAgdGFibGU6IHN0cmluZyxcbiAgZGJGb3JlaWduczogTWlncmF0aW9uRm9yZWlnbltdLFxuKSB7XG4gIGNvbnN0IHNlYXJjaFRleHRDb2x1bW5OYW1lcyA9IGdldFNlYXJjaFRleHRDb2x1bW5OYW1lcyh0YWJsZSk7XG4gIGNvbnN0IGxpbmVzVG8gPSB7XG4gICAgYWRkOiB7XG4gICAgICB1cDogeyBidWlsZGVyOiBbXSBhcyBzdHJpbmdbXSwgcmF3OiBbXSBhcyBzdHJpbmdbXSB9LFxuICAgICAgZG93bjogeyBidWlsZGVyOiBbXSBhcyBzdHJpbmdbXSwgcmF3OiBbXSBhcyBzdHJpbmdbXSB9LFxuICAgIH0sXG4gICAgZHJvcDoge1xuICAgICAgdXA6IHsgYnVpbGRlcjogW10gYXMgc3RyaW5nW10sIHJhdzogW10gYXMgc3RyaW5nW10gfSxcbiAgICAgIGRvd246IHsgYnVpbGRlcjogW10gYXMgc3RyaW5nW10sIHJhdzogW10gYXMgc3RyaW5nW10gfSxcbiAgICB9LFxuICAgIGFsdGVyOiB7XG4gICAgICB1cDogeyBidWlsZGVyOiBbXSBhcyBzdHJpbmdbXSwgcmF3OiBbXSBhcyBzdHJpbmdbXSB9LFxuICAgICAgZG93bjogeyBidWlsZGVyOiBbXSBhcyBzdHJpbmdbXSwgcmF3OiBbXSBhcyBzdHJpbmdbXSB9LFxuICAgIH0sXG4gIH07XG5cbiAgLy8gYWRkIGNvbHVtbnNcbiAgY29uc3QgYWRkQ29sdW1uRGVmcyA9IGdlbkNvbHVtbkRlZmluaXRpb25zKHRhYmxlLCBjb2x1bW5zVG8uYWRkKTtcbiAgbGluZXNUby5hZGQudXAgPSB7XG4gICAgYnVpbGRlcjogYWRkQ29sdW1uRGVmcy5idWlsZGVyLmxlbmd0aCA+IDAgPyBbXCIvLyBhZGRcIiwgLi4uYWRkQ29sdW1uRGVmcy5idWlsZGVyXSA6IFtdLFxuICAgIHJhdzpcbiAgICAgIGFkZENvbHVtbkRlZnMucmF3Lmxlbmd0aCA+IDBcbiAgICAgICAgPyBbXG4gICAgICAgICAgICAuLi5nZXRTZWFyY2hUZXh0SGVscGVyRGVmaW5pdGlvbnModGFibGUsIGNvbHVtbnNUby5hZGQpLFxuICAgICAgICAgICAgXCIvLyBhZGQgKGdlbmVyYXRlZClcIixcbiAgICAgICAgICAgIC4uLmFkZENvbHVtbkRlZnMucmF3LFxuICAgICAgICAgIF1cbiAgICAgICAgOiBbXSxcbiAgfTtcbiAgbGluZXNUby5hZGQuZG93biA9IHtcbiAgICBidWlsZGVyOlxuICAgICAgY29sdW1uc1RvLmFkZC5sZW5ndGggPiAwXG4gICAgICAgID8gW1xuICAgICAgICAgICAgXCIvLyByb2xsYmFjayAtIGFkZFwiLFxuICAgICAgICAgICAgYHRhYmxlLmRyb3BDb2x1bW5zKCR7Y29sdW1uc1RvLmFkZC5tYXAoKGNvbCkgPT4gYCcke2NvbC5uYW1lfSdgKS5qb2luKFwiLCBcIil9KWAsXG4gICAgICAgICAgXVxuICAgICAgICA6IFtdLFxuICAgIHJhdzogW10sXG4gIH07XG5cbiAgLy8gZHJvcO2VoCDsu6zrn7zsl5Ag6rG466awIEZLIOywvuq4sFxuICBjb25zdCBkcm9wQ29sdW1uTmFtZXMgPSBjb2x1bW5zVG8uZHJvcC5tYXAoKGNvbCkgPT4gY29sLm5hbWUpO1xuICBjb25zdCBma1RvRHJvcEJlZm9yZUNvbHVtbiA9IGRiRm9yZWlnbnMuZmlsdGVyKChmaykgPT5cbiAgICBmay5jb2x1bW5zLnNvbWUoKGNvbCkgPT4gZHJvcENvbHVtbk5hbWVzLmluY2x1ZGVzKGNvbCkpLFxuICApO1xuXG4gIGNvbnN0IGRyb3BGa0xpbmVzID0gZmtUb0Ryb3BCZWZvcmVDb2x1bW4ubWFwKChmaykgPT4ge1xuICAgIGNvbnN0IGNvbHVtbnNTdHJpbmdRdW90ZSA9IGZrLmNvbHVtbnMubWFwKChjb2wpID0+IGAnJHtjb2x9J2ApLmpvaW4oXCIsXCIpO1xuICAgIHJldHVybiBgdGFibGUuZHJvcEZvcmVpZ24oWyR7Y29sdW1uc1N0cmluZ1F1b3RlfV0pYDtcbiAgfSk7XG5cbiAgY29uc3QgcmVzdG9yZUZrTGluZXMgPSBnZW5Gb3JlaWduRGVmaW5pdGlvbnModGFibGUsIGZrVG9Ecm9wQmVmb3JlQ29sdW1uKS51cDtcblxuICAvLyBkcm9w7J2YIHJvbGxiYWNr7Iuc7JeQ64qUIGdlbmVyYXRlZCBjb2x1bW7rj4Qg67O17JuQ7ZW07JW8IO2VqFxuICBjb25zdCBkcm9wQ29sdW1uRGVmcyA9IGdlbkNvbHVtbkRlZmluaXRpb25zKHRhYmxlLCBjb2x1bW5zVG8uZHJvcCk7XG4gIGxpbmVzVG8uZHJvcCA9IHtcbiAgICB1cDoge1xuICAgICAgYnVpbGRlcjogW1xuICAgICAgICAuLi4oZHJvcEZrTGluZXMubGVuZ3RoID4gMFxuICAgICAgICAgID8gW1wiLy8gZHJvcCBmb3JlaWduIGtleXMgb24gY29sdW1ucyB0byBiZSBkcm9wcGVkXCIsIC4uLmRyb3BGa0xpbmVzXVxuICAgICAgICAgIDogW10pLFxuICAgICAgICAuLi4oY29sdW1uc1RvLmRyb3AubGVuZ3RoID4gMFxuICAgICAgICAgID8gW1xuICAgICAgICAgICAgICBcIi8vIGRyb3AgY29sdW1uc1wiLFxuICAgICAgICAgICAgICBgdGFibGUuZHJvcENvbHVtbnMoJHtjb2x1bW5zVG8uZHJvcC5tYXAoKGNvbCkgPT4gYCcke2NvbC5uYW1lfSdgKS5qb2luKFwiLCBcIil9KWAsXG4gICAgICAgICAgICBdXG4gICAgICAgICAgOiBbXSksXG4gICAgICBdLFxuICAgICAgcmF3OiBbXSxcbiAgICB9LFxuICAgIGRvd246IHtcbiAgICAgIGJ1aWxkZXI6IFtcbiAgICAgICAgLi4uKGRyb3BDb2x1bW5EZWZzLmJ1aWxkZXIubGVuZ3RoID4gMFxuICAgICAgICAgID8gW1wiLy8gcm9sbGJhY2sgLSBkcm9wIGNvbHVtbnNcIiwgLi4uZHJvcENvbHVtbkRlZnMuYnVpbGRlcl1cbiAgICAgICAgICA6IFtdKSxcbiAgICAgICAgLi4uKHJlc3RvcmVGa0xpbmVzLmxlbmd0aCA+IDAgPyBbXCIvLyByZXN0b3JlIGZvcmVpZ24ga2V5c1wiLCAuLi5yZXN0b3JlRmtMaW5lc10gOiBbXSksXG4gICAgICBdLFxuICAgICAgcmF3OlxuICAgICAgICBkcm9wQ29sdW1uRGVmcy5yYXcubGVuZ3RoID4gMFxuICAgICAgICAgID8gW1xuICAgICAgICAgICAgICAuLi5nZXRTZWFyY2hUZXh0SGVscGVyRGVmaW5pdGlvbnModGFibGUsIGNvbHVtbnNUby5kcm9wKSxcbiAgICAgICAgICAgICAgXCIvLyByb2xsYmFjayAtIGRyb3AgY29sdW1ucyAoZ2VuZXJhdGVkKVwiLFxuICAgICAgICAgICAgICAuLi5kcm9wQ29sdW1uRGVmcy5yYXcsXG4gICAgICAgICAgICBdXG4gICAgICAgICAgOiBbXSxcbiAgICB9LFxuICB9O1xuXG4gIC8vIGFsdGVyIGNvbHVtbnMgKEdlbmVyYXRlZCBDb2x1bW7snYAgQUxURVIg67aI6rCA7ZWY66+A66GcIGRyb3Ag7ZuEIOyerOyDneyEsSlcbiAgbGluZXNUby5hbHRlciA9IGNvbHVtbnNUby5hbHRlci5yZWR1Y2UoXG4gICAgKHIsIGRiQ29sdW1uKSA9PiB7XG4gICAgICBjb25zdCBlbnRpdHlDb2x1bW4gPSBlbnRpdHlDb2x1bW5zLmZpbmQoKGNvbCkgPT4gY29sLm5hbWUgPT09IGRiQ29sdW1uLm5hbWUpO1xuICAgICAgaWYgKGVudGl0eUNvbHVtbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiByO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIHNlYXJjaFRleHRDb2x1bW5OYW1lcy5oYXMoZGJDb2x1bW4ubmFtZSkgJiZcbiAgICAgICAgZGJDb2x1bW4uZ2VuZXJhdGVkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgZW50aXR5Q29sdW1uLmdlbmVyYXRlZCAhPT0gdW5kZWZpbmVkXG4gICAgICApIHtcbiAgICAgICAgci51cC5idWlsZGVyID0gW1xuICAgICAgICAgIC4uLnIudXAuYnVpbGRlcixcbiAgICAgICAgICBcIi8vIGFsdGVyIGdlbmVyYXRlZCBjb2x1bW5cIixcbiAgICAgICAgICBgdGFibGUuZHJvcENvbHVtbnMoJyR7ZGJDb2x1bW4ubmFtZX0nKWAsXG4gICAgICAgIF07XG4gICAgICAgIHIudXAucmF3ID0gW1xuICAgICAgICAgIC4uLnIudXAucmF3LFxuICAgICAgICAgIC4uLmdldFNlYXJjaFRleHRIZWxwZXJEZWZpbml0aW9ucyh0YWJsZSwgW2VudGl0eUNvbHVtbl0pLFxuICAgICAgICAgIFwiLy8gYWx0ZXIgZ2VuZXJhdGVkIGNvbHVtblwiLFxuICAgICAgICAgIGdlbkdlbmVyYXRlZENvbHVtbkRlZmluaXRpb24odGFibGUsIGVudGl0eUNvbHVtbiksXG4gICAgICAgIF07XG4gICAgICAgIHIuZG93bi5idWlsZGVyID0gW1xuICAgICAgICAgIC4uLnIuZG93bi5idWlsZGVyLFxuICAgICAgICAgIFwiLy8gcm9sbGJhY2sgLSBhbHRlciBnZW5lcmF0ZWQgY29sdW1uXCIsXG4gICAgICAgICAgYHRhYmxlLmRyb3BDb2x1bW5zKCcke2RiQ29sdW1uLm5hbWV9JylgLFxuICAgICAgICBdO1xuICAgICAgICByLmRvd24ucmF3ID0gW1xuICAgICAgICAgIC4uLnIuZG93bi5yYXcsXG4gICAgICAgICAgLi4uZ2V0U2VhcmNoVGV4dEhlbHBlckRlZmluaXRpb25zKHRhYmxlLCBbZGJDb2x1bW5dKSxcbiAgICAgICAgICBcIi8vIHJvbGxiYWNrIC0gYWx0ZXIgZ2VuZXJhdGVkIGNvbHVtblwiLFxuICAgICAgICAgIGdlbkdlbmVyYXRlZENvbHVtbkRlZmluaXRpb24odGFibGUsIGRiQ29sdW1uKSxcbiAgICAgICAgXTtcbiAgICAgICAgcmV0dXJuIHI7XG4gICAgICB9XG5cbiAgICAgIC8vIOy7rOufvCDrs4Dqsr3sgqztla1cbiAgICAgIGNvbnN0IGNvbHVtbkRpZmZVcCA9IGRpZmYoXG4gICAgICAgIGdlbkNvbHVtbkRlZmluaXRpb25zKHRhYmxlLCBbZW50aXR5Q29sdW1uXSkuYnVpbGRlcixcbiAgICAgICAgZ2VuQ29sdW1uRGVmaW5pdGlvbnModGFibGUsIFtkYkNvbHVtbl0pLmJ1aWxkZXIsXG4gICAgICApO1xuICAgICAgY29uc3QgY29sdW1uRGlmZkRvd24gPSBkaWZmKFxuICAgICAgICBnZW5Db2x1bW5EZWZpbml0aW9ucyh0YWJsZSwgW2RiQ29sdW1uXSkuYnVpbGRlcixcbiAgICAgICAgZ2VuQ29sdW1uRGVmaW5pdGlvbnModGFibGUsIFtlbnRpdHlDb2x1bW5dKS5idWlsZGVyLFxuICAgICAgKTtcbiAgICAgIGlmIChjb2x1bW5EaWZmVXAubGVuZ3RoID4gMCkge1xuICAgICAgICByLnVwLmJ1aWxkZXIgPSBbXG4gICAgICAgICAgLi4uci51cC5idWlsZGVyLFxuICAgICAgICAgIFwiLy8gYWx0ZXIgY29sdW1uXCIsXG4gICAgICAgICAgLi4uY29sdW1uRGlmZlVwLm1hcCgobCkgPT4gYCR7bC5yZXBsYWNlKFwiO1wiLCBcIlwiKX0uYWx0ZXIoKTtgKSxcbiAgICAgICAgXTtcbiAgICAgICAgci5kb3duLmJ1aWxkZXIgPSBbXG4gICAgICAgICAgLi4uci5kb3duLmJ1aWxkZXIsXG4gICAgICAgICAgXCIvLyByb2xsYmFjayAtIGFsdGVyIGNvbHVtblwiLFxuICAgICAgICAgIC4uLmNvbHVtbkRpZmZEb3duLm1hcCgobCkgPT4gYCR7bC5yZXBsYWNlKFwiO1wiLCBcIlwiKX0uYWx0ZXIoKTtgKSxcbiAgICAgICAgXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfSxcbiAgICB7XG4gICAgICB1cDogeyBidWlsZGVyOiBbXSBhcyBzdHJpbmdbXSwgcmF3OiBbXSBhcyBzdHJpbmdbXSB9LFxuICAgICAgZG93bjogeyBidWlsZGVyOiBbXSBhcyBzdHJpbmdbXSwgcmF3OiBbXSBhcyBzdHJpbmdbXSB9LFxuICAgIH0sXG4gICk7XG5cbiAgcmV0dXJuIGxpbmVzVG87XG59XG5cbi8qKlxuICog7J24642x7Iqk7J2YIGFkZCwgZHJvcCDsl6zrtoAg7ZmV7J24XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRBbHRlckluZGV4ZXNUbyhlbnRpdHlJbmRleGVzOiBNaWdyYXRpb25JbmRleFtdLCBkYkluZGV4ZXM6IE1pZ3JhdGlvbkluZGV4W10pIHtcbiAgLy8g7J24642x7IqkIOu5hOq1kFxuICBjb25zdCBpbmRleGVzVG8gPSB7XG4gICAgYWRkOiBbXSBhcyBNaWdyYXRpb25JbmRleFtdLFxuICAgIGRyb3A6IFtdIGFzIE1pZ3JhdGlvbkluZGV4W10sXG4gIH07XG5cbiAgLy8g7J24642x7IqkIOqzoOycoCDsi53rs4TsnpAg7IOd7ISxIChuYW1l7J2EIOygnOyZuO2VnCDrqqjrk6Ag7ZWE65Oc66W8IOusuOyekOyXtOuhnCDrs4DtmZjtlZjsl6wg7KGw7ZWpKVxuICBjb25zdCBpZGVudGl0eSA9IDxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KGluZGV4OiBUKTogc3RyaW5nID0+IHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoaW5kZXgpXG4gICAgICAuZmlsdGVyKChrZXkpID0+IGtleSAhPT0gXCJuYW1lXCIpXG4gICAgICAudG9Tb3J0ZWQoKTtcblxuICAgIHJldHVybiBrZXlzXG4gICAgICAubWFwKChrZXkpID0+IHtcbiAgICAgICAgaWYgKGtleSA9PT0gXCJuYW1lXCIpIHtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChrZXkgPT09IFwiY29sdW1uc1wiKSB7XG4gICAgICAgICAgcmV0dXJuIChpbmRleFtrZXldIGFzIE1pZ3JhdGlvbkluZGV4W1wiY29sdW1uc1wiXSkubWFwKChjb2wpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhjb2wpXG4gICAgICAgICAgICAgIC50b1NvcnRlZCgpXG4gICAgICAgICAgICAgIC5tYXAoKGspID0+IGAke2t9PSR7Y29sW2sgYXMga2V5b2YgdHlwZW9mIGNvbF19YClcbiAgICAgICAgICAgICAgLmpvaW4oXCIvL1wiKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYCR7a2V5fT0ke2luZGV4W2tleSBhcyBrZXlvZiBNaWdyYXRpb25JbmRleF19YDtcbiAgICAgIH0pXG4gICAgICAuam9pbihcIi8vXCIpO1xuICB9O1xuXG4gIGNvbnN0IG5vcm1hbGl6ZWRFbnRpdHlJbmRleGVzID0gZW50aXR5SW5kZXhlcy5tYXAoc2V0TWlncmF0aW9uSW5kZXhEZWZhdWx0cyk7XG4gIGNvbnN0IG5vcm1hbGl6ZWREYkluZGV4ZXMgPSBkYkluZGV4ZXMubWFwKHNldE1pZ3JhdGlvbkluZGV4RGVmYXVsdHMpO1xuICAvLyDruYTqtZDsl5DripQg7KCV6rec7ZmU65CcIHByZWRpY2F0ZeulvCDsk7DrkJgsIOyLpOygnCBtaWdyYXRpb24g7Lac66Cl7J2AIOybkOuzuCBTUUzsnYQg67O07KG07ZWc64ukLlxuICBjb25zdCBjb21wYXJpc29uRW50aXR5SW5kZXhlcyA9IGVudGl0eUluZGV4ZXMubWFwKHNldE1pZ3JhdGlvbkluZGV4Q29tcGFyaXNvbkRlZmF1bHRzKTtcbiAgY29uc3QgY29tcGFyaXNvbkRiSW5kZXhlcyA9IGRiSW5kZXhlcy5tYXAoc2V0TWlncmF0aW9uSW5kZXhDb21wYXJpc29uRGVmYXVsdHMpO1xuICBjb25zdCBleHRyYUluZGV4ZXMgPSB7XG4gICAgZGI6IGRpZmYoY29tcGFyaXNvbkRiSW5kZXhlcywgY29tcGFyaXNvbkVudGl0eUluZGV4ZXMsIGlkZW50aXR5KSxcbiAgICBlbnRpdHk6IGRpZmYoY29tcGFyaXNvbkVudGl0eUluZGV4ZXMsIGNvbXBhcmlzb25EYkluZGV4ZXMsIGlkZW50aXR5KSxcbiAgfTtcbiAgaWYgKGV4dHJhSW5kZXhlcy5lbnRpdHkubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGFkZElkZW50aXRpZXMgPSBuZXcgU2V0KGV4dHJhSW5kZXhlcy5lbnRpdHkubWFwKGlkZW50aXR5KSk7XG4gICAgaW5kZXhlc1RvLmFkZCA9IGluZGV4ZXNUby5hZGQuY29uY2F0KFxuICAgICAgbm9ybWFsaXplZEVudGl0eUluZGV4ZXMuZmlsdGVyKChfLCBpbmRleCkgPT5cbiAgICAgICAgYWRkSWRlbnRpdGllcy5oYXMoaWRlbnRpdHkoY29tcGFyaXNvbkVudGl0eUluZGV4ZXNbaW5kZXhdKSksXG4gICAgICApLFxuICAgICk7XG4gIH1cbiAgaWYgKGV4dHJhSW5kZXhlcy5kYi5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgZHJvcElkZW50aXRpZXMgPSBuZXcgU2V0KGV4dHJhSW5kZXhlcy5kYi5tYXAoaWRlbnRpdHkpKTtcbiAgICBpbmRleGVzVG8uZHJvcCA9IGluZGV4ZXNUby5kcm9wLmNvbmNhdChcbiAgICAgIG5vcm1hbGl6ZWREYkluZGV4ZXMuZmlsdGVyKChfLCBpbmRleCkgPT5cbiAgICAgICAgZHJvcElkZW50aXRpZXMuaGFzKGlkZW50aXR5KGNvbXBhcmlzb25EYkluZGV4ZXNbaW5kZXhdKSksXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gaW5kZXhlc1RvO1xufVxuXG4vKipcbiAqIOyduOuNseyKpCDsgq3soJwg7KCV7J2YIOyDneyEsVxuICovXG5mdW5jdGlvbiBnZW5JbmRleERyb3BEZWZpbml0aW9uKGluZGV4OiBNaWdyYXRpb25JbmRleCkge1xuICByZXR1cm4gYHRhYmxlLmRyb3BJbmRleChbJHtpbmRleC5jb2x1bW5zXG4gICAgLm1hcCgoY29sdW1uKSA9PiBgJyR7Y29sdW1uLm5hbWV9J2ApXG4gICAgLmpvaW4oXCIsXCIpfV0sICcke2luZGV4Lm5hbWV9JylgO1xufVxuXG4vKipcbiAqIERCIOyhsO2ajCDqsrDqs7zsmYAg67mE6rWQ7ZWY6riwIOychO2VnCDsnbjrjbHsiqQg6riw67O46rCSIOyEpOyglVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0TWlncmF0aW9uSW5kZXhEZWZhdWx0cyhpbmRleDogTWlncmF0aW9uSW5kZXgpOiBNaWdyYXRpb25JbmRleCB7XG4gIHJldHVybiBzZXRNaWdyYXRpb25JbmRleERlZmF1bHRzQmFzZShpbmRleCwgZmFsc2UpO1xufVxuXG5mdW5jdGlvbiBzZXRNaWdyYXRpb25JbmRleENvbXBhcmlzb25EZWZhdWx0cyhpbmRleDogTWlncmF0aW9uSW5kZXgpOiBNaWdyYXRpb25JbmRleCB7XG4gIC8vIERCIGNhbm9uaWNhbCBTUUzqs7wgZW50aXR5IFNRTOydmCDtkZztmIQg7LCo7J2066W8IGRpZmYgaWRlbnRpdHnsl5DshJzrp4wg7Z2h7IiY7ZWc64ukLlxuICByZXR1cm4gc2V0TWlncmF0aW9uSW5kZXhEZWZhdWx0c0Jhc2UoaW5kZXgsIHRydWUpO1xufVxuXG5mdW5jdGlvbiBzZXRNaWdyYXRpb25JbmRleERlZmF1bHRzQmFzZShcbiAgaW5kZXg6IE1pZ3JhdGlvbkluZGV4LFxuICBub3JtYWxpemVXaGVyZUZvckNvbXBhcmlzb246IGJvb2xlYW4sXG4pOiBNaWdyYXRpb25JbmRleCB7XG4gIGNvbnN0IGlzVmVjdG9ySW5kZXggPSBpbmRleC50eXBlID09PSBcImhuc3dcIiB8fCBpbmRleC50eXBlID09PSBcIml2ZmZsYXRcIjtcbiAgY29uc3Qgc3VwcG9ydHNPcmRlcmluZyA9ICFpc1ZlY3RvckluZGV4ICYmICghaW5kZXgudXNpbmcgfHwgaW5kZXgudXNpbmcgPT09IFwiYnRyZWVcIik7XG4gIGNvbnN0IG5vcm1hbGl6ZWRVc2luZyA9IGlzVmVjdG9ySW5kZXggPyBpbmRleC51c2luZyA6IChpbmRleC51c2luZyA/PyBcImJ0cmVlXCIpO1xuICBjb25zdCBub3JtYWxpemVkV2hlcmUgPSBub3JtYWxpemVXaGVyZUZvckNvbXBhcmlzb25cbiAgICA/IG5vcm1hbGl6ZUluZGV4V2hlcmVQcmVkaWNhdGVGb3JDb21wYXJpc29uKGluZGV4LndoZXJlKVxuICAgIDogbm9ybWFsaXplSW5kZXhXaGVyZVByZWRpY2F0ZShpbmRleC53aGVyZSk7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5pbmRleCxcbiAgICBjb2x1bW5zOiBpbmRleC5jb2x1bW5zLm1hcCgoY29sKSA9PiAoe1xuICAgICAgbmFtZTogY29sLm5hbWUsXG4gICAgICAuLi4oZ2V0SW5kZXhDb2x1bW5PcGNsYXNzKGNvbCkgPyB7IG9wY2xhc3M6IGdldEluZGV4Q29sdW1uT3BjbGFzcyhjb2wpIH0gOiB7fSksXG4gICAgICAuLi4oc3VwcG9ydHNPcmRlcmluZ1xuICAgICAgICA/IHtcbiAgICAgICAgICAgIHNvcnRPcmRlcjogY29sLnNvcnRPcmRlciA/PyBcIkFTQ1wiLFxuICAgICAgICAgICAgbnVsbHNGaXJzdDogY29sLm51bGxzRmlyc3QgPz8gY29sLnNvcnRPcmRlciA9PT0gXCJERVNDXCIsXG4gICAgICAgICAgfVxuICAgICAgICA6IHt9KSxcbiAgICB9KSksXG4gICAgbnVsbHNOb3REaXN0aW5jdDogaW5kZXgubnVsbHNOb3REaXN0aW5jdCA/PyBmYWxzZSxcbiAgICAuLi4obm9ybWFsaXplZFVzaW5nID8geyB1c2luZzogbm9ybWFsaXplZFVzaW5nIH0gOiB7fSksXG4gICAgLi4uKG5vcm1hbGl6ZWRXaGVyZSA/IHsgd2hlcmU6IG5vcm1hbGl6ZWRXaGVyZSB9IDoge30pLFxuICB9O1xufVxuXG4vKipcbiAqIO2FjOydtOu4lCDrs4Dqsr0g7LyA7J207IqkIC0gRm9yZWlnbiBLZXkg67OA6rK9XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQWx0ZXJDb2RlX0ZvcmVpZ25zKFxuICB0YWJsZTogc3RyaW5nLFxuICBlbnRpdHlGb3JlaWduczogTWlncmF0aW9uRm9yZWlnbltdLFxuICBkYkZvcmVpZ25zOiBNaWdyYXRpb25Gb3JlaWduW10sXG4gIGRyb3BwaW5nQ29sdW1uczogTWlncmF0aW9uQ29sdW1uW10gPSBbXSxcbik6IFByb21pc2U8R2VuTWlncmF0aW9uQ29kZVtdPiB7XG4gIC8vIGNvbnNvbGUubG9nKHsgZW50aXR5Rm9yZWlnbnMsIGRiRm9yZWlnbnMgfSk7XG5cbiAgY29uc3QgZ2V0S2V5ID0gKG1mOiBNaWdyYXRpb25Gb3JlaWduKTogc3RyaW5nID0+IHtcbiAgICByZXR1cm4gW21mLmNvbHVtbnMuam9pbihcIi1cIiksIG1mLnRvXS5qb2luKFwiLy8vXCIpO1xuICB9O1xuXG4gIC8vIOyCreygnOuQoCDsu6zrn7zrqoUg66qp66GdXG4gIGNvbnN0IGRyb3BwaW5nQ29sdW1uTmFtZXMgPSBkcm9wcGluZ0NvbHVtbnMubWFwKChjb2wpID0+IGNvbC5uYW1lKTtcblxuICBjb25zdCBma1RvID0gZW50aXR5Rm9yZWlnbnMucmVkdWNlKFxuICAgIChyZXN1bHQsIGVudGl0eUYpID0+IHtcbiAgICAgIGNvbnN0IG1hdGNoaW5nRGJGID0gZGJGb3JlaWducy5maW5kKChkYkYpID0+IGdldEtleShlbnRpdHlGKSA9PT0gZ2V0S2V5KGRiRikpO1xuICAgICAgaWYgKCFtYXRjaGluZ0RiRikge1xuICAgICAgICByZXN1bHQuYWRkLnB1c2goZW50aXR5Rik7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIGlmICghZXF1YWwoZW50aXR5RiwgbWF0Y2hpbmdEYkYpKSB7XG4gICAgICAgIHJlc3VsdC5hbHRlclNyYy5wdXNoKG1hdGNoaW5nRGJGKTtcbiAgICAgICAgcmVzdWx0LmFsdGVyRHN0LnB1c2goZW50aXR5Rik7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG4gICAge1xuICAgICAgYWRkOiBbXSBhcyBNaWdyYXRpb25Gb3JlaWduW10sXG4gICAgICBkcm9wOiBbXSBhcyBNaWdyYXRpb25Gb3JlaWduW10sXG4gICAgICBhbHRlclNyYzogW10gYXMgTWlncmF0aW9uRm9yZWlnbltdLFxuICAgICAgYWx0ZXJEc3Q6IFtdIGFzIE1pZ3JhdGlvbkZvcmVpZ25bXSxcbiAgICB9LFxuICApO1xuXG4gIC8vIGRiRm9yZWlnbnPsl5DripQg7J6I7KeA66eMIGVudGl0eUZvcmVpZ25z7JeQ64qUIOyXhuuKlCDqsr3smrAgKOyCreygnOuQnCBGSylcbiAgLy8g64uoLCDsgq3soJzrkKAg7Lus65+87J2YIEZL64qUIOygnOyZuCAoZ2VuZXJhdGVBbHRlckNvZGVfQ29sdW1uQW5kSW5kZXhlc+yXkOyEnCDsspjrpqwpXG4gIGRiRm9yZWlnbnMuZm9yRWFjaCgoZGJGKSA9PiB7XG4gICAgY29uc3QgbWF0Y2hpbmdFbnRpdHlGID0gZW50aXR5Rm9yZWlnbnMuZmluZCgoZW50aXR5RikgPT4gZ2V0S2V5KGVudGl0eUYpID09PSBnZXRLZXkoZGJGKSk7XG4gICAgaWYgKCFtYXRjaGluZ0VudGl0eUYpIHtcbiAgICAgIC8vIOydtCBGS+ydmCDsu6zrn7zsnbQg7IKt7KCc65CgIOy7rOufvCDrqqnroZ3sl5Ag7J6I64qU7KeAIO2ZleyduFxuICAgICAgY29uc3QgaXNDb2x1bW5Ecm9wcGluZyA9IGRiRi5jb2x1bW5zLnNvbWUoKGNvbCkgPT4gZHJvcHBpbmdDb2x1bW5OYW1lcy5pbmNsdWRlcyhjb2wpKTtcbiAgICAgIC8vIOy7rOufvOydtCDsgq3soJzrkJjsp4Ag7JWK64qUIOqyveyasOyXkOunjCBGSyBkcm9wIOuqqeuhneyXkCDstpTqsIBcbiAgICAgIGlmICghaXNDb2x1bW5Ecm9wcGluZykge1xuICAgICAgICBma1RvLmRyb3AucHVzaChkYkYpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgY29uc3QgbGluZXNUbyA9IHtcbiAgICBhZGQ6IGdlbkZvcmVpZ25EZWZpbml0aW9ucyh0YWJsZSwgZmtUby5hZGQpLFxuICAgIGRyb3A6IGdlbkZvcmVpZ25EZWZpbml0aW9ucyh0YWJsZSwgZmtUby5kcm9wKSxcbiAgICBhbHRlclNyYzogZ2VuRm9yZWlnbkRlZmluaXRpb25zKHRhYmxlLCBma1RvLmFsdGVyU3JjKSxcbiAgICBhbHRlckRzdDogZ2VuRm9yZWlnbkRlZmluaXRpb25zKHRhYmxlLCBma1RvLmFsdGVyRHN0KSxcbiAgfTtcblxuICAvLyBkcm9wIGZrIGNvbHVtbnPsnbgg6rK97JqwKOyDneyEseuQoCDsvZTrk5wg7JeG64qUIOqyveyasCkg7Yyo7IqkXG4gIGNvbnN0IGhhc0xpbmVzID0gT2JqZWN0LnZhbHVlcyhsaW5lc1RvKS5zb21lKChsKSA9PiBsLnVwLmxlbmd0aCA+IDAgfHwgbC5kb3duLmxlbmd0aCA+IDApO1xuICBpZiAoIWhhc0xpbmVzKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgaWYgKFxuICAgIGxpbmVzVG8uYWRkLnVwLmxlbmd0aCA9PT0gMCAmJlxuICAgIGxpbmVzVG8uZHJvcC51cC5sZW5ndGggPT09IDAgJiZcbiAgICBsaW5lc1RvLmFsdGVyU3JjLnVwLmxlbmd0aCA9PT0gMCAmJlxuICAgIGxpbmVzVG8uYWx0ZXJEc3QudXAubGVuZ3RoID09PSAwXG4gICkge1xuICAgIE5haXRlLnQoXCJtaWdyYXRvcjpnZW5lcmF0ZUFsdGVyQ29kZV9Gb3JlaWduczpma0NoYW5nZUNvZGVHZW5lcmF0aW9uRXJyb3JcIiwge1xuICAgICAgdGFibGUsXG4gICAgICBlbnRpdHlGb3JlaWducyxcbiAgICAgIGRiRm9yZWlnbnMsXG4gICAgfSk7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiRksg67OA6rK9IOy9lOuTnCDsg53shLEg7Jik66WYXCIpO1xuICB9XG5cbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW1xuICAgICdpbXBvcnQgeyBLbmV4IH0gZnJvbSBcImtuZXhcIjsnLFxuICAgIFwiXCIsXG4gICAgXCJleHBvcnQgYXN5bmMgZnVuY3Rpb24gdXAoa25leDogS25leCk6IFByb21pc2U8dm9pZD4ge1wiLFxuICAgIGByZXR1cm4ga25leC5zY2hlbWEuYWx0ZXJUYWJsZShcIiR7dGFibGV9XCIsICh0YWJsZSkgPT4ge2AsXG4gICAgLi4ubGluZXNUby5kcm9wLmRvd24sXG4gICAgLi4ubGluZXNUby5hZGQudXAsXG4gICAgLi4ubGluZXNUby5hbHRlclNyYy5kb3duLFxuICAgIC4uLmxpbmVzVG8uYWx0ZXJEc3QudXAsXG4gICAgXCJ9KVwiLFxuICAgIFwifVwiLFxuICAgIFwiXCIsXG4gICAgXCJleHBvcnQgYXN5bmMgZnVuY3Rpb24gZG93bihrbmV4OiBLbmV4KTogUHJvbWlzZTx2b2lkPiB7XCIsXG4gICAgYHJldHVybiBrbmV4LnNjaGVtYS5hbHRlclRhYmxlKFwiJHt0YWJsZX1cIiwgKHRhYmxlKSA9PiB7YCxcbiAgICAuLi5saW5lc1RvLmFkZC5kb3duLFxuICAgIC4uLmxpbmVzVG8uYWx0ZXJEc3QuZG93bixcbiAgICAuLi5saW5lc1RvLmFsdGVyU3JjLnVwLFxuICAgIC4uLmxpbmVzVG8uZHJvcC51cCxcbiAgICBcIn0pXCIsXG4gICAgXCJ9XCIsXG4gIF07XG5cbiAgY29uc3QgZm9ybWF0dGVkID0gYXdhaXQgZm9ybWF0Q29kZShsaW5lcy5qb2luKFwiXFxuXCIpLCBgc3JjL21pZ3JhdGlvbi8ke3RhYmxlfS50c2ApO1xuICBjb25zdCB0aXRsZSA9IFtcImFsdGVyXCIsIHRhYmxlLCBcImZvcmVpZ25zXCJdLmpvaW4oXCJfXCIpO1xuXG4gIHJldHVybiBbXG4gICAge1xuICAgICAgdGFibGUsXG4gICAgICB0aXRsZSxcbiAgICAgIGZvcm1hdHRlZCxcbiAgICAgIHR5cGU6IFwibm9ybWFsXCIsXG4gICAgfSxcbiAgXTtcbn1cblxuLyoqXG4gKiDso7zslrTsp4QgRW50aXR5U2V07J2EIOq4sOuwmOycvOuhnCDthYzsnbTruJQgQ1JFQVRFIOuniOydtOq3uOugiOydtOyFmCDsvZTrk5zrpbwg7IOd7ISx7ZWp64uI64ukLlxuICogQHBhcmFtIGVudGl0eVNldFxuICogQHJldHVybnMgQ1JFQVRFIOuniOydtOq3uOugiOydtOyFmCDsvZTrk5xcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQ3JlYXRlQ29kZShlbnRpdHlTZXQ6IE1pZ3JhdGlvblNldCk6IFByb21pc2U8R2VuTWlncmF0aW9uQ29kZVtdPiB7XG4gIHJldHVybiBbXG4gICAgYXdhaXQgZ2VuZXJhdGVDcmVhdGVDb2RlX0NvbHVtbkFuZEluZGV4ZXMoXG4gICAgICBlbnRpdHlTZXQudGFibGUsXG4gICAgICBlbnRpdHlTZXQuY29sdW1ucyxcbiAgICAgIGVudGl0eVNldC5pbmRleGVzLFxuICAgICksXG4gICAgLi4uKGF3YWl0IGdlbmVyYXRlQ3JlYXRlQ29kZV9Gb3JlaWduKGVudGl0eVNldC50YWJsZSwgZW50aXR5U2V0LmZvcmVpZ25zKSksXG4gIF07XG59XG5cbi8qKlxuICog7KO87Ja07KeEIGVudGl0eVNldOydhCDrqqntkZzroZwsIGRiU2V07J2EIO2YhCDsg4HtmansnLzroZwg7ZWY7JesIO2FjOydtOu4lCBBTFRFUiDrp4jsnbTqt7jroIjsnbTshZgg7L2U65Oc66W8IOyDneyEse2VqeuLiOuLpC5cbiAqIEBwYXJhbSBlbnRpdHlTZXQg7ZiEIOyDge2ZqeydmCBNaWdyYXRpb25TZXRcbiAqIEBwYXJhbSBkYlNldCDrqqntkZwg7IOB7Zmp7J2YIE1pZ3JhdGlvblNldFxuICogQHBhcmFtIGNvbXBhcmVEQiBQSyDtg4DsnoUg67OA6rK9IOyLnCDsl63ssLjsobAgRkvrpbwg7KGw7ZqM7ZWY6riwIOychO2VnCBLbmV4IOyduOyKpO2EtOyKpCAo7ISg7YOdKVxuICogQHJldHVybnMgQUxURVIg66eI7J206re466CI7J207IWYIOy9lOuTnFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVBbHRlckNvZGUoXG4gIGVudGl0eVNldDogTWlncmF0aW9uU2V0LFxuICBkYlNldDogTWlncmF0aW9uU2V0LFxuICBjb21wYXJlREI/OiBLbmV4LFxuKTogUHJvbWlzZTxHZW5NaWdyYXRpb25Db2RlW10+IHtcbiAgY29uc3QgcmVwbGFjZUNvbHVtbkRlZmF1bHRUbyA9IChjb2w6IE1pZ3JhdGlvbkNvbHVtbikgPT4ge1xuICAgIC8vIGZsb2F07J24IOqyveyasCDquLDrs7jqsJLsnYQgMOycvOuhnCDsp4DsoJXtlZjripQg6rK97JqwIFwiMC4wMFwi7Jy866GcIOuzgO2ZmOuQmOuKlCDsvIDsnbTsiqQg64yA7J2RXG4gICAgLy8gaWYgKGNvbC50eXBlID09PSBcImZsb2F0XCIgJiYgY29sLmRlZmF1bHRUbyAmJiBTdHJpbmcoY29sLmRlZmF1bHRUbykuaW5jbHVkZXMoJ1wiJykgPT09IGZhbHNlKSB7XG4gICAgLy8gICBjb2wuZGVmYXVsdFRvID0gYFwiJHtOdW1iZXIoY29sLmRlZmF1bHRUbykudG9GaXhlZChjb2wuc2NhbGUgPz8gMil9XCJgO1xuICAgIC8vIH1cbiAgICAvLyAvLyBzdHJpbmfsnbgg6rK97JqwIOq4sOuzuOqwkuydtCDruYgg7Iqk7Yq466eB7J24IOqyveyasCDrjIDsnZFcbiAgICAvLyBpZiAoY29sLnR5cGUgPT09IFwic3RyaW5nXCIgJiYgY29sLmRlZmF1bHRUbyA9PT0gXCJcIikge1xuICAgIC8vICAgY29sLmRlZmF1bHRUbyA9ICdcIlwiJztcbiAgICAvLyB9XG4gICAgLy8gLy8gYm9vbGVhbuyduCDqsr3smrAg6riw67O46rCSIOygleq3nO2ZlCAoTXlTUUzsl5DshJzripQgVElOWUlOVCgxKeuhnCDsoIDsnqXrkJjrr4DroZwgMCDrmJDripQgMeuhnCDsoJXqt5ztmZQpXG4gICAgLy8gLy8gVE9ETzogZGIudHPsl5AgdHlwZUNhc2Ug7ISk7KCVIO2ZleyduO2VmOyXrCDsspjrpqztlZjrj4TroZ0g7IiY7KCVIO2VhOyalFxuICAgIC8vIGlmIChjb2wudHlwZSA9PT0gXCJib29sZWFuXCIgJiYgY29sLmRlZmF1bHRUbyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gICBpZiAoY29sLmRlZmF1bHRUbyA9PT0gXCIwXCIgfHwgY29sLmRlZmF1bHRUby50b0xvd2VyQ2FzZSgpID09PSBcImZhbHNlXCIpIHtcbiAgICAvLyAgICAgY29sLmRlZmF1bHRUbyA9IFwiMFwiO1xuICAgIC8vICAgfSBlbHNlIGlmIChjb2wuZGVmYXVsdFRvID09PSBcIjFcIiB8fCBjb2wuZGVmYXVsdFRvLnRvTG93ZXJDYXNlKCkgPT09IFwidHJ1ZVwiKSB7XG4gICAgLy8gICAgIGNvbC5kZWZhdWx0VG8gPSBcIjFcIjtcbiAgICAvLyAgIH1cbiAgICAvLyB9XG5cbiAgICAvLyBGSVhNRTog7J2864uoIE15U1FMIOyDge2ZqeyXkOyEnCDrsJzsg53tlojrjZgg7J207IqI7J2YIHdvcmthcm91bmQg7J2066+A66GcIFBn7JeQ7IScIOyerO2ZleyduCDtm4Qg64yA7J2RIOy2lOqwgFxuICAgIHJldHVybiBjb2w7XG4gIH07XG4gIGNvbnN0IGVudGl0eUNvbHVtbnMgPSBhbHBoYWJldGljYWwoZW50aXR5U2V0LmNvbHVtbnMsIChhKSA9PiBhLm5hbWUpLm1hcChyZXBsYWNlQ29sdW1uRGVmYXVsdFRvKTtcbiAgY29uc3QgZGJDb2x1bW5zID0gYWxwaGFiZXRpY2FsKGRiU2V0LmNvbHVtbnMsIChhKSA9PiBhLm5hbWUpLm1hcChyZXBsYWNlQ29sdW1uRGVmYXVsdFRvKTtcblxuICAvKiDrlJTrsoTquYXsmqkg7L2U65OcLCDtirnsoJUg7Lus65+87JeQ7IScIOu2iOydvOy5mCDrsJzsg53tlaAg65WMIO2ZleyduFxuICAgICAgICBjb25zdCBlbnRpdHlDb2x1bW4gPSBlbnRpdHlTZXQuY29sdW1ucy5maW5kKFxuICAgICAgICAgIChjb2wpID0+IGNvbC5uYW1lID09PSBcInByaWNlX2tyd1wiXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGRiQ29sdW1uID0gZGJTZXQuY29sdW1ucy5maW5kKFxuICAgICAgICAgIChjb2wpID0+IGNvbC5uYW1lID09PSBcInByaWNlX2tyd1wiXG4gICAgICAgICk7XG4gICAgICAgIGNvbnNvbGUuZGVidWcoeyBlbnRpdHlDb2x1bW4sIGRiQ29sdW1uIH0pO1xuICAgICAgICAgKi9cblxuICBjb25zdCBlbnRpdHlJbmRleGVzID0gYWxwaGFiZXRpY2FsKGVudGl0eVNldC5pbmRleGVzLCAoYSkgPT5cbiAgICBbYS50eXBlLCAuLi5hLmNvbHVtbnMubWFwKChjKSA9PiBjLm5hbWUpXS5qb2luKFwiLVwiKSxcbiAgKTtcbiAgY29uc3QgZGJJbmRleGVzID0gYWxwaGFiZXRpY2FsKGRiU2V0LmluZGV4ZXMsIChhKSA9PlxuICAgIFthLnR5cGUsIC4uLmEuY29sdW1ucy5tYXAoKGMpID0+IGMubmFtZSldLmpvaW4oXCItXCIpLFxuICApO1xuXG4gIGNvbnN0IHJlcGxhY2VOb0FjdGlvbk9uTXlTUUwgPSAoZjogTWlncmF0aW9uRm9yZWlnbikgPT4ge1xuICAgIC8vIE15U1FM7JeQ7IScIFJFU1RSSUNU7JmAIE5PIEFDVElPTuydgCDrj5nsnbztlahcbiAgICBjb25zdCB7IG9uRGVsZXRlLCBvblVwZGF0ZSB9ID0gZjtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uZixcbiAgICAgIG9uVXBkYXRlOiBvblVwZGF0ZSA9PT0gXCJSRVNUUklDVFwiID8gXCJOTyBBQ1RJT05cIiA6IG9uVXBkYXRlLFxuICAgICAgb25EZWxldGU6IG9uRGVsZXRlID09PSBcIlJFU1RSSUNUXCIgPyBcIk5PIEFDVElPTlwiIDogb25EZWxldGUsXG4gICAgfTtcbiAgfTtcblxuICBjb25zdCBlbnRpdHlGb3JlaWducyA9IGFscGhhYmV0aWNhbChlbnRpdHlTZXQuZm9yZWlnbnMsIChhKSA9PlxuICAgIFthLnRvLCAuLi5hLmNvbHVtbnNdLmpvaW4oXCItXCIpLFxuICApLm1hcCgoZikgPT4gcmVwbGFjZU5vQWN0aW9uT25NeVNRTChmKSk7XG4gIGNvbnN0IGRiRm9yZWlnbnMgPSBhbHBoYWJldGljYWwoZGJTZXQuZm9yZWlnbnMsIChhKSA9PiBbYS50bywgLi4uYS5jb2x1bW5zXS5qb2luKFwiLVwiKSkubWFwKChmKSA9PlxuICAgIHJlcGxhY2VOb0FjdGlvbk9uTXlTUUwoZiksXG4gICk7XG5cbiAgLy8g7IKt7KCc65CgIOy7rOufvCDrqqnroZ0g6rOE7IKwXG4gIGNvbnN0IGRyb3BwaW5nQ29sdW1ucyA9IGRpZmYoZGJDb2x1bW5zLCBlbnRpdHlDb2x1bW5zLCAoY29sKSA9PiBjb2wubmFtZSk7XG5cbiAgY29uc3QgYWx0ZXJDb2RlczogKEdlbk1pZ3JhdGlvbkNvZGUgfCBHZW5NaWdyYXRpb25Db2RlW10gfCBudWxsKVtdID0gW107XG5cbiAgLy8gMS4gY29sdW1uc0FuZEluZGV4ZXMg7LKY66asXG4gIGNvbnN0IHNlYXJjaFRleHRDb2x1bW5OYW1lcyA9IGdldFNlYXJjaFRleHRDb2x1bW5OYW1lcyhlbnRpdHlTZXQudGFibGUpO1xuICBjb25zdCBpc0VxdWFsQ29sdW1ucyA9IGVxdWFsKFxuICAgIGVudGl0eUNvbHVtbnMubWFwKChjb2x1bW4pID0+IG5vcm1hbGl6ZUNvbHVtbkZvckNvbXBhcmlzb24oY29sdW1uLCBzZWFyY2hUZXh0Q29sdW1uTmFtZXMpKSxcbiAgICBkYkNvbHVtbnMubWFwKChjb2x1bW4pID0+IG5vcm1hbGl6ZUNvbHVtbkZvckNvbXBhcmlzb24oY29sdW1uLCBzZWFyY2hUZXh0Q29sdW1uTmFtZXMpKSxcbiAgKTtcbiAgY29uc3QgaXNFcXVhbEluZGV4ZXMgPSBlcXVhbChcbiAgICBlbnRpdHlJbmRleGVzLm1hcChzZXRNaWdyYXRpb25JbmRleERlZmF1bHRzKSxcbiAgICBkYkluZGV4ZXMubWFwKHNldE1pZ3JhdGlvbkluZGV4RGVmYXVsdHMpLFxuICApO1xuICBpZiAoIWlzRXF1YWxDb2x1bW5zIHx8ICFpc0VxdWFsSW5kZXhlcykge1xuICAgIGFsdGVyQ29kZXMucHVzaChcbiAgICAgIGF3YWl0IGdlbmVyYXRlQWx0ZXJDb2RlX0NvbHVtbkFuZEluZGV4ZXMoXG4gICAgICAgIGVudGl0eVNldC50YWJsZSxcbiAgICAgICAgZW50aXR5Q29sdW1ucyxcbiAgICAgICAgZW50aXR5SW5kZXhlcyxcbiAgICAgICAgZGJDb2x1bW5zLFxuICAgICAgICBkYkluZGV4ZXMsXG4gICAgICAgIGRiU2V0LmZvcmVpZ25zLFxuICAgICAgICBjb21wYXJlREIsXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICAvLyAyLiBmb3JlaWducyDsspjrpqwgKOyCreygnOuQoCDsu6zrn7wg7KCV67O0IOyghOuLrClcbiAgaWYgKCFlcXVhbChlbnRpdHlGb3JlaWducywgZGJGb3JlaWducykpIHtcbiAgICBhbHRlckNvZGVzLnB1c2goXG4gICAgICBhd2FpdCBnZW5lcmF0ZUFsdGVyQ29kZV9Gb3JlaWducyhcbiAgICAgICAgZW50aXR5U2V0LnRhYmxlLFxuICAgICAgICBlbnRpdHlGb3JlaWducyxcbiAgICAgICAgZGJGb3JlaWducyxcbiAgICAgICAgZHJvcHBpbmdDb2x1bW5zLFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgaWYgKGFsdGVyQ29kZXMuZXZlcnkoKGFsdGVyQ29kZSkgPT4gYWx0ZXJDb2RlID09PSBudWxsKSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHJldHVybiBhbHRlckNvZGVzLmZpbHRlcigoYWx0ZXJDb2RlKSA9PiBhbHRlckNvZGUgIT09IG51bGwpLmZsYXQoKTtcbn1cblxuLyoqXG4gKiBQSyDtg4DsnoUg67OA6rK9IOyLnCDsl63ssLjsobAgRksg7KCc7JW97KGw6rG07J2EIOyymOumrO2VmOuKlCDrp4jsnbTqt7jroIjsnbTshZgg7L2U65Oc66W8IOyDneyEse2VqeuLiOuLpC5cbiAqXG4gKiBQSyDtg4DsnoUg67OA6rK9IOyLnCDsiJzshJw6XG4gKiAxLiBGSyDsoJzslb3sobDqsbQg7IKt7KCcICjsl63ssLjsobAg7YWM7J2067iU65OkKVxuICogMi4g7J6Q6riwIOywuOyhsCBGSyDsgq3soJwgKOyeiOuKlCDqsr3smrApXG4gKiAzLiBQSyDsoJzslb3sobDqsbQg7IKt7KCcXG4gKiA0LiBQSyDsu6zrn7wg7YOA7J6FIOuzgOqyvVxuICogNS4gRksg7Lus65+8IO2DgOyehSDrs4Dqsr0gKOyXreywuOyhsCDthYzsnbTruJTrk6QpXG4gKiA2LiBQSyDsoJzslb3sobDqsbQg67O16rWsXG4gKiA3LiDsnpDquLAg7LC47KGwIEZLIOuzteq1rFxuICogOC4gRksg7KCc7JW97KGw6rG0IOuzteq1rFxuICovXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVBrVHlwZUNoYW5nZU1pZ3JhdGlvbihcbiAgdGFibGU6IHN0cmluZyxcbiAgZW50aXR5SWRDb2w6IE1pZ3JhdGlvbkNvbHVtbixcbiAgZGJJZENvbDogTWlncmF0aW9uQ29sdW1uLFxuICBfZW50aXR5Q29sdW1uczogTWlncmF0aW9uQ29sdW1uW10sXG4gIF9lbnRpdHlJbmRleGVzOiBNaWdyYXRpb25JbmRleFtdLFxuICBfZGJDb2x1bW5zOiBNaWdyYXRpb25Db2x1bW5bXSxcbiAgX2RiSW5kZXhlczogTWlncmF0aW9uSW5kZXhbXSxcbiAgX2RiRm9yZWlnbnM6IE1pZ3JhdGlvbkZvcmVpZ25bXSxcbiAgY29tcGFyZURCOiBLbmV4LFxuKTogUHJvbWlzZTxHZW5NaWdyYXRpb25Db2RlW10+IHtcbiAgLy8g7Jet7LC47KGwIEZLIOyhsO2ajCAo7J20IO2FjOydtOu4lOydmCBQS+ulvCDssLjsobDtlZjripQg64uk66W4IO2FjOydtOu4lOydmCBGS+uTpClcbiAgY29uc3QgcmVmZXJlbmNpbmdGS3MgPSBhd2FpdCBQb3N0Z3JlU1FMU2NoZW1hUmVhZGVyLmdldFJlZmVyZW5jaW5nRm9yZWlnbktleXMoY29tcGFyZURCLCB0YWJsZSk7XG5cbiAgLy8g7J6Q6riwIOywuOyhsCBGSyDrtoTrpqwgKOyYiDogRGVwYXJ0bWVudC5wYXJlbnRfaWQg4oaSIERlcGFydG1lbnQuaWQpXG4gIGNvbnN0IHNlbGZSZWZlcmVuY2luZ0ZLcyA9IHJlZmVyZW5jaW5nRktzLmZpbHRlcigoZmspID0+IGZrLnRhYmxlTmFtZSA9PT0gdGFibGUpO1xuICBjb25zdCBleHRlcm5hbFJlZmVyZW5jaW5nRktzID0gcmVmZXJlbmNpbmdGS3MuZmlsdGVyKChmaykgPT4gZmsudGFibGVOYW1lICE9PSB0YWJsZSk7XG5cbiAgLy8gUEsg7KCc7JW97KGw6rG0IOydtOumhCDsobDtmoxcbiAgY29uc3QgcGtDb25zdHJhaW50TmFtZSA9IGAke3RhYmxlfV9wa2V5YDtcblxuICAvLyDsg4ggUEsg7YOA7J6F7JeQIOunnuuKlCBQb3N0Z3JlU1FMIO2DgOyehSDrrLjsnpDsl7RcbiAgY29uc3QgbmV3UGtQZ1R5cGUgPSBnZXRQa1BnVHlwZShlbnRpdHlJZENvbCk7XG4gIGNvbnN0IG9sZFBrUGdUeXBlID0gZ2V0UGtQZ1R5cGUoZGJJZENvbCk7XG5cbiAgLy8gVVAg7L2U65OcIOyDneyEsVxuICBjb25zdCB1cExpbmVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8vIDEuIOyZuOu2gCDthYzsnbTruJTsnZggRksg7KCc7JW97KGw6rG0IOyCreygnFxuICBmb3IgKGNvbnN0IGZrIG9mIGV4dGVybmFsUmVmZXJlbmNpbmdGS3MpIHtcbiAgICB1cExpbmVzLnB1c2goYCAgLy8gJHtmay50YWJsZU5hbWV9LiR7ZmsuY29sdW1uTmFtZX0gRksg7KCc7JW97KGw6rG0IOyCreygnGApO1xuICAgIHVwTGluZXMucHVzaChcbiAgICAgIGAgIGF3YWl0IGtuZXgucmF3KCdBTFRFUiBUQUJMRSBcIiR7ZmsudGFibGVOYW1lfVwiIERST1AgQ09OU1RSQUlOVCBcIiR7ZmsuY29uc3RyYWludE5hbWV9XCInKTtgLFxuICAgICk7XG4gIH1cblxuICAvLyAyLiDsnpDquLAg7LC47KGwIEZLIOyCreygnFxuICBmb3IgKGNvbnN0IGZrIG9mIHNlbGZSZWZlcmVuY2luZ0ZLcykge1xuICAgIHVwTGluZXMucHVzaChgICAvLyDsnpDquLAg7LC47KGwIEZLIOyCreygnDogJHtmay5jb2x1bW5OYW1lfWApO1xuICAgIHVwTGluZXMucHVzaChcbiAgICAgIGAgIGF3YWl0IGtuZXgucmF3KCdBTFRFUiBUQUJMRSBcIiR7dGFibGV9XCIgRFJPUCBDT05TVFJBSU5UIFwiJHtmay5jb25zdHJhaW50TmFtZX1cIicpO2AsXG4gICAgKTtcbiAgfVxuXG4gIC8vIDMuIFBLIOygnOyVveyhsOqxtCDsgq3soJxcbiAgdXBMaW5lcy5wdXNoKGAgIC8vIFBLIOygnOyVveyhsOqxtCDsgq3soJxgKTtcbiAgdXBMaW5lcy5wdXNoKGAgIGF3YWl0IGtuZXgucmF3KCdBTFRFUiBUQUJMRSBcIiR7dGFibGV9XCIgRFJPUCBDT05TVFJBSU5UIFwiJHtwa0NvbnN0cmFpbnROYW1lfVwiJyk7YCk7XG5cbiAgLy8gNC4gUEsg7Lus65+8IO2DgOyehSDrs4Dqsr1cbiAgdXBMaW5lcy5wdXNoKGAgIC8vIFBLIOy7rOufvCDtg4DsnoUg67OA6rK9YCk7XG4gIHVwTGluZXMucHVzaChcbiAgICBgICBhd2FpdCBrbmV4LnJhdygnQUxURVIgVEFCTEUgXCIke3RhYmxlfVwiIEFMVEVSIENPTFVNTiBcImlkXCIgVFlQRSAke25ld1BrUGdUeXBlfSBVU0lORyBcImlkXCI6OiR7bmV3UGtQZ1R5cGV9Jyk7YCxcbiAgKTtcblxuICAvLyA1LiBGSyDsu6zrn7wg7YOA7J6FIOuzgOqyvSAo7Jet7LC47KGwIO2FjOydtOu4lOuTpCkgLSDsnpDquLAg7LC47KGwIO2PrO2VqFxuICBmb3IgKGNvbnN0IGZrIG9mIHJlZmVyZW5jaW5nRktzKSB7XG4gICAgdXBMaW5lcy5wdXNoKGAgIC8vICR7ZmsudGFibGVOYW1lfS4ke2ZrLmNvbHVtbk5hbWV9IOy7rOufvCDtg4DsnoUg67OA6rK9YCk7XG4gICAgdXBMaW5lcy5wdXNoKFxuICAgICAgYCAgYXdhaXQga25leC5yYXcoJ0FMVEVSIFRBQkxFIFwiJHtmay50YWJsZU5hbWV9XCIgQUxURVIgQ09MVU1OIFwiJHtmay5jb2x1bW5OYW1lfVwiIFRZUEUgJHtuZXdQa1BnVHlwZX0gVVNJTkcgXCIke2ZrLmNvbHVtbk5hbWV9XCI6OiR7bmV3UGtQZ1R5cGV9Jyk7YCxcbiAgICApO1xuICB9XG5cbiAgLy8gNi4gUEsg7KCc7JW97KGw6rG0IOuzteq1rFxuICB1cExpbmVzLnB1c2goYCAgLy8gUEsg7KCc7JW97KGw6rG0IOuzteq1rGApO1xuICB1cExpbmVzLnB1c2goXG4gICAgYCAgYXdhaXQga25leC5yYXcoJ0FMVEVSIFRBQkxFIFwiJHt0YWJsZX1cIiBBREQgQ09OU1RSQUlOVCBcIiR7cGtDb25zdHJhaW50TmFtZX1cIiBQUklNQVJZIEtFWSAoXCJpZFwiKScpO2AsXG4gICk7XG5cbiAgLy8gNy4g7J6Q6riwIOywuOyhsCBGSyDrs7XqtaxcbiAgZm9yIChjb25zdCBmayBvZiBzZWxmUmVmZXJlbmNpbmdGS3MpIHtcbiAgICB1cExpbmVzLnB1c2goYCAgLy8g7J6Q6riwIOywuOyhsCBGSyDrs7Xqtaw6ICR7ZmsuY29sdW1uTmFtZX1gKTtcbiAgICB1cExpbmVzLnB1c2goXG4gICAgICBgICBhd2FpdCBrbmV4LnJhdygnQUxURVIgVEFCTEUgXCIke3RhYmxlfVwiIEFERCBDT05TVFJBSU5UIFwiJHtmay5jb25zdHJhaW50TmFtZX1cIiBGT1JFSUdOIEtFWSAoXCIke2ZrLmNvbHVtbk5hbWV9XCIpIFJFRkVSRU5DRVMgXCIke3RhYmxlfVwiKFwiaWRcIikgT04gVVBEQVRFICR7Zmsub25VcGRhdGV9IE9OIERFTEVURSAke2ZrLm9uRGVsZXRlfScpO2AsXG4gICAgKTtcbiAgfVxuXG4gIC8vIDguIOyZuOu2gCDthYzsnbTruJTsnZggRksg7KCc7JW97KGw6rG0IOuzteq1rFxuICBmb3IgKGNvbnN0IGZrIG9mIGV4dGVybmFsUmVmZXJlbmNpbmdGS3MpIHtcbiAgICB1cExpbmVzLnB1c2goYCAgLy8gJHtmay50YWJsZU5hbWV9LiR7ZmsuY29sdW1uTmFtZX0gRksg7KCc7JW97KGw6rG0IOuzteq1rGApO1xuICAgIHVwTGluZXMucHVzaChcbiAgICAgIGAgIGF3YWl0IGtuZXgucmF3KCdBTFRFUiBUQUJMRSBcIiR7ZmsudGFibGVOYW1lfVwiIEFERCBDT05TVFJBSU5UIFwiJHtmay5jb25zdHJhaW50TmFtZX1cIiBGT1JFSUdOIEtFWSAoXCIke2ZrLmNvbHVtbk5hbWV9XCIpIFJFRkVSRU5DRVMgXCIke3RhYmxlfVwiKFwiaWRcIikgT04gVVBEQVRFICR7Zmsub25VcGRhdGV9IE9OIERFTEVURSAke2ZrLm9uRGVsZXRlfScpO2AsXG4gICAgKTtcbiAgfVxuXG4gIC8vIERPV04g7L2U65OcIOyDneyEsSAo7Jet7IicKVxuICBjb25zdCBkb3duTGluZXM6IHN0cmluZ1tdID0gW107XG5cbiAgLy8gMS4g7Jm467aAIO2FjOydtOu4lOydmCBGSyDsoJzslb3sobDqsbQg7IKt7KCcXG4gIGZvciAoY29uc3QgZmsgb2YgZXh0ZXJuYWxSZWZlcmVuY2luZ0ZLcykge1xuICAgIGRvd25MaW5lcy5wdXNoKGAgIC8vICR7ZmsudGFibGVOYW1lfS4ke2ZrLmNvbHVtbk5hbWV9IEZLIOygnOyVveyhsOqxtCDsgq3soJxgKTtcbiAgICBkb3duTGluZXMucHVzaChcbiAgICAgIGAgIGF3YWl0IGtuZXgucmF3KCdBTFRFUiBUQUJMRSBcIiR7ZmsudGFibGVOYW1lfVwiIERST1AgQ09OU1RSQUlOVCBcIiR7ZmsuY29uc3RyYWludE5hbWV9XCInKTtgLFxuICAgICk7XG4gIH1cblxuICAvLyAyLiDsnpDquLAg7LC47KGwIEZLIOyCreygnFxuICBmb3IgKGNvbnN0IGZrIG9mIHNlbGZSZWZlcmVuY2luZ0ZLcykge1xuICAgIGRvd25MaW5lcy5wdXNoKGAgIC8vIOyekOq4sCDssLjsobAgRksg7IKt7KCcOiAke2ZrLmNvbHVtbk5hbWV9YCk7XG4gICAgZG93bkxpbmVzLnB1c2goXG4gICAgICBgICBhd2FpdCBrbmV4LnJhdygnQUxURVIgVEFCTEUgXCIke3RhYmxlfVwiIERST1AgQ09OU1RSQUlOVCBcIiR7ZmsuY29uc3RyYWludE5hbWV9XCInKTtgLFxuICAgICk7XG4gIH1cblxuICAvLyAzLiBQSyDsoJzslb3sobDqsbQg7IKt7KCcXG4gIGRvd25MaW5lcy5wdXNoKGAgIC8vIFBLIOygnOyVveyhsOqxtCDsgq3soJxgKTtcbiAgZG93bkxpbmVzLnB1c2goXG4gICAgYCAgYXdhaXQga25leC5yYXcoJ0FMVEVSIFRBQkxFIFwiJHt0YWJsZX1cIiBEUk9QIENPTlNUUkFJTlQgXCIke3BrQ29uc3RyYWludE5hbWV9XCInKTtgLFxuICApO1xuXG4gIC8vIDQuIFBLIOy7rOufvCDtg4DsnoUg7JuQ67O1XG4gIGRvd25MaW5lcy5wdXNoKGAgIC8vIFBLIOy7rOufvCDtg4DsnoUg7JuQ67O1YCk7XG4gIGRvd25MaW5lcy5wdXNoKFxuICAgIGAgIGF3YWl0IGtuZXgucmF3KCdBTFRFUiBUQUJMRSBcIiR7dGFibGV9XCIgQUxURVIgQ09MVU1OIFwiaWRcIiBUWVBFICR7b2xkUGtQZ1R5cGV9IFVTSU5HIFwiaWRcIjo6JHtvbGRQa1BnVHlwZX0nKTtgLFxuICApO1xuXG4gIC8vIDUuIEZLIOy7rOufvCDtg4DsnoUg7JuQ67O1ICjsl63ssLjsobAg7YWM7J2067iU65OkKVxuICBmb3IgKGNvbnN0IGZrIG9mIHJlZmVyZW5jaW5nRktzKSB7XG4gICAgZG93bkxpbmVzLnB1c2goYCAgLy8gJHtmay50YWJsZU5hbWV9LiR7ZmsuY29sdW1uTmFtZX0g7Lus65+8IO2DgOyehSDsm5Drs7VgKTtcbiAgICBkb3duTGluZXMucHVzaChcbiAgICAgIGAgIGF3YWl0IGtuZXgucmF3KCdBTFRFUiBUQUJMRSBcIiR7ZmsudGFibGVOYW1lfVwiIEFMVEVSIENPTFVNTiBcIiR7ZmsuY29sdW1uTmFtZX1cIiBUWVBFICR7b2xkUGtQZ1R5cGV9IFVTSU5HIFwiJHtmay5jb2x1bW5OYW1lfVwiOjoke29sZFBrUGdUeXBlfScpO2AsXG4gICAgKTtcbiAgfVxuXG4gIC8vIDYuIFBLIOygnOyVveyhsOqxtCDrs7XqtaxcbiAgZG93bkxpbmVzLnB1c2goYCAgLy8gUEsg7KCc7JW97KGw6rG0IOuzteq1rGApO1xuICBkb3duTGluZXMucHVzaChcbiAgICBgICBhd2FpdCBrbmV4LnJhdygnQUxURVIgVEFCTEUgXCIke3RhYmxlfVwiIEFERCBDT05TVFJBSU5UIFwiJHtwa0NvbnN0cmFpbnROYW1lfVwiIFBSSU1BUlkgS0VZIChcImlkXCIpJyk7YCxcbiAgKTtcblxuICAvLyA3LiDsnpDquLAg7LC47KGwIEZLIOuzteq1rFxuICBmb3IgKGNvbnN0IGZrIG9mIHNlbGZSZWZlcmVuY2luZ0ZLcykge1xuICAgIGRvd25MaW5lcy5wdXNoKGAgIC8vIOyekOq4sCDssLjsobAgRksg67O16rWsOiAke2ZrLmNvbHVtbk5hbWV9YCk7XG4gICAgZG93bkxpbmVzLnB1c2goXG4gICAgICBgICBhd2FpdCBrbmV4LnJhdygnQUxURVIgVEFCTEUgXCIke3RhYmxlfVwiIEFERCBDT05TVFJBSU5UIFwiJHtmay5jb25zdHJhaW50TmFtZX1cIiBGT1JFSUdOIEtFWSAoXCIke2ZrLmNvbHVtbk5hbWV9XCIpIFJFRkVSRU5DRVMgXCIke3RhYmxlfVwiKFwiaWRcIikgT04gVVBEQVRFICR7Zmsub25VcGRhdGV9IE9OIERFTEVURSAke2ZrLm9uRGVsZXRlfScpO2AsXG4gICAgKTtcbiAgfVxuXG4gIC8vIDguIOyZuOu2gCDthYzsnbTruJTsnZggRksg7KCc7JW97KGw6rG0IOuzteq1rFxuICBmb3IgKGNvbnN0IGZrIG9mIGV4dGVybmFsUmVmZXJlbmNpbmdGS3MpIHtcbiAgICBkb3duTGluZXMucHVzaChgICAvLyAke2ZrLnRhYmxlTmFtZX0uJHtmay5jb2x1bW5OYW1lfSBGSyDsoJzslb3sobDqsbQg67O16rWsYCk7XG4gICAgZG93bkxpbmVzLnB1c2goXG4gICAgICBgICBhd2FpdCBrbmV4LnJhdygnQUxURVIgVEFCTEUgXCIke2ZrLnRhYmxlTmFtZX1cIiBBREQgQ09OU1RSQUlOVCBcIiR7ZmsuY29uc3RyYWludE5hbWV9XCIgRk9SRUlHTiBLRVkgKFwiJHtmay5jb2x1bW5OYW1lfVwiKSBSRUZFUkVOQ0VTIFwiJHt0YWJsZX1cIihcImlkXCIpIE9OIFVQREFURSAke2ZrLm9uVXBkYXRlfSBPTiBERUxFVEUgJHtmay5vbkRlbGV0ZX0nKTtgLFxuICAgICk7XG4gIH1cblxuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXG4gICAgJ2ltcG9ydCB7IEtuZXggfSBmcm9tIFwia25leFwiOycsXG4gICAgXCJcIixcbiAgICBcImV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cChrbmV4OiBLbmV4KTogUHJvbWlzZTx2b2lkPiB7XCIsXG4gICAgLi4udXBMaW5lcyxcbiAgICBcIn1cIixcbiAgICBcIlwiLFxuICAgIFwiZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRvd24oa25leDogS25leCk6IFByb21pc2U8dm9pZD4ge1wiLFxuICAgIC4uLmRvd25MaW5lcyxcbiAgICBcIn1cIixcbiAgXTtcblxuICBjb25zdCBmb3JtYXR0ZWQgPSBhd2FpdCBmb3JtYXRDb2RlKGxpbmVzLmpvaW4oXCJcXG5cIiksIGBzcmMvbWlncmF0aW9uLyR7dGFibGV9LnRzYCk7XG5cbiAgcmV0dXJuIFtcbiAgICB7XG4gICAgICB0YWJsZSxcbiAgICAgIHRpdGxlOiBgYWx0ZXJfJHt0YWJsZX1fcGtfdHlwZWAsXG4gICAgICBmb3JtYXR0ZWQsXG4gICAgICB0eXBlOiBcIm5vcm1hbFwiLFxuICAgIH0sXG4gIF07XG59XG5cbi8qKlxuICogUEsg7Lus65+87J2YIFBvc3RncmVTUUwg7YOA7J6FIOusuOyekOyXtOydhCDrsJjtmZjtlanri4jri6QuXG4gKi9cbmZ1bmN0aW9uIGdldFBrUGdUeXBlKGNvbDogTWlncmF0aW9uQ29sdW1uKTogc3RyaW5nIHtcbiAgaWYgKGNvbC50eXBlID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIGNvbC5sZW5ndGggIT09IHVuZGVmaW5lZCA/IGB2YXJjaGFyKCR7Y29sLmxlbmd0aH0pYCA6IFwidGV4dFwiO1xuICB9XG4gIGlmIChjb2wudHlwZSA9PT0gXCJ1dWlkXCIpIHtcbiAgICByZXR1cm4gXCJ1dWlkXCI7XG4gIH1cbiAgLy8gaW50ZWdlcuydmCDqsr3smrAgc2VyaWFsL2ludGVnZXIg6rWs67aE7J20IO2VhOyalO2VmOyngOunjCxcbiAgLy8g7YOA7J6FIOuzgOqyvSDsi5zsl5DripQgaW50ZWdlcuuhnCDsspjrpqztlanri4jri6QuXG4gIHJldHVybiBcImludGVnZXJcIjtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUErUkEsU0FBUyxzQkFBc0IsUUFBK0Q7Q0FDNUYsT0FBTyxPQUFPLFdBQVcsT0FBTztBQUNsQztBQUVBLFNBQVMsNkJBQTZCLFlBQWlEO0NBQ3JGLE1BQU0sU0FBc0MsQ0FBQztDQUM3QyxJQUFJLFFBQVE7Q0FFWixPQUFPLFFBQVEsV0FBVyxRQUFRO0VBQ2hDLE1BQU0sT0FBTyxXQUFXO0VBRXhCLElBQUksU0FBUyxRQUNYO0VBR0YsSUFBSSxLQUFLLEtBQUssSUFBSSxHQUFHO0dBQ25CLFNBQVM7R0FDVDtFQUNGO0VBRUEsSUFBSSxXQUFXLFdBQVcsTUFBTSxLQUFLLEdBQUc7R0FDdEMsT0FBTyxLQUFLO0lBQUUsTUFBTTtJQUFZLE9BQU87R0FBSyxDQUFDO0dBQzdDLFNBQVM7R0FDVDtFQUNGO0VBRUEsSUFBSSxXQUFXLFdBQVcsTUFBTSxLQUFLLEdBQUc7R0FDdEMsT0FBTyxLQUFLO0lBQUUsTUFBTTtJQUFZLE9BQU87R0FBSyxDQUFDO0dBQzdDLFNBQVM7R0FDVDtFQUNGO0VBRUEsSUFBSSxTQUFTLE9BQU8sU0FBUyxPQUFPLFNBQVMsS0FBSztHQUNoRCxPQUFPLEtBQUs7SUFBRSxNQUFNO0lBQVUsT0FBTztHQUFLLENBQUM7R0FDM0MsU0FBUztHQUNUO0VBQ0Y7RUFFQSxJQUFJ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
|
|
1321
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZS1nZW5lcmF0aW9uLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taWdyYXRpb24vY29kZS1nZW5lcmF0aW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBlcXVhbCBmcm9tIFwiZmFzdC1kZWVwLWVxdWFsXCI7XG5pbXBvcnQgeyB0eXBlIEtuZXggfSBmcm9tIFwia25leFwiO1xuaW1wb3J0IHsgYWxwaGFiZXRpY2FsLCBkaWZmIH0gZnJvbSBcInJhZGFzaGlcIjtcblxuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IE5haXRlIH0gZnJvbSBcIi4uL25haXRlL25haXRlXCI7XG5pbXBvcnQge1xuICB0eXBlIEVudGl0eVByb3AsXG4gIHR5cGUgR2VuTWlncmF0aW9uQ29kZSxcbiAgdHlwZSBNaWdyYXRpb25Db2x1bW4sXG4gIHR5cGUgTWlncmF0aW9uRm9yZWlnbixcbiAgdHlwZSBNaWdyYXRpb25JbmRleCxcbiAgdHlwZSBNaWdyYXRpb25TZXQsXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgaXNTZWFyY2hUZXh0UHJvcCB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgZm9ybWF0Q29kZSB9IGZyb20gXCIuLi91dGlscy9mb3JtYXR0ZXJcIjtcbmltcG9ydCB7IGRpZmZlcmVuY2VXaXRoLCBpbnRlcnNlY3Rpb25CeSB9IGZyb20gXCIuLi91dGlscy91dGlsc1wiO1xuaW1wb3J0IHtcbiAgbm9ybWFsaXplSW5kZXhXaGVyZVByZWRpY2F0ZSxcbiAgbm9ybWFsaXplSW5kZXhXaGVyZVByZWRpY2F0ZUZvckNvbXBhcmlzb24sXG59IGZyb20gXCIuL2luZGV4LXdoZXJlLXByZWRpY2F0ZVwiO1xuaW1wb3J0IHsgUG9zdGdyZVNRTFNjaGVtYVJlYWRlciB9IGZyb20gXCIuL3Bvc3RncmVzcWwtc2NoZW1hLXJlYWRlclwiO1xuXG4vKipcbiAqIOy7rOufvCDsoJXsnZgg6rKw6rO8IO2DgOyehVxuICogLSBidWlsZGVyOiBLbmV4IHRhYmxlIGJ1aWxkZXIg66mU7ISc65Oc66GcIOyLpO2Wie2VoCDqtazrrLggKHRhYmxlLnh4eCgpKVxuICogLSByYXc6IGtuZXgucmF3KCnroZwg7Iuk7ZaJ7ZWgIOq1rOusuFxuICovXG50eXBlIENvbHVtbkRlZmluaXRpb25SZXN1bHQgPSB7XG4gIGJ1aWxkZXI6IHN0cmluZ1tdO1xuICByYXc6IHN0cmluZ1tdO1xufTtcblxudHlwZSBTZWFyY2hUZXh0SGVscGVyS2luZCA9IFwidGV4dC1hcnJheVwiIHwgXCJqc29uYi1hcnJheVwiO1xuXG50eXBlIFNlYXJjaFRleHRFeHByZXNzaW9uVG9rZW4gPVxuICB8IHsgdHlwZTogXCJpZGVudGlmaWVyXCI7IHZhbHVlOiBzdHJpbmcgfVxuICB8IHsgdHlwZTogXCJxdW90ZWRJZGVudGlmaWVyXCI7IHZhbHVlOiBzdHJpbmcgfVxuICB8IHsgdHlwZTogXCJzdHJpbmdcIjsgdmFsdWU6IHN0cmluZyB9XG4gIHwgeyB0eXBlOiBcInN5bWJvbFwiOyB2YWx1ZTogXCIoXCIgfCBcIilcIiB8IFwiLFwiIH1cbiAgfCB7IHR5cGU6IFwib3BlcmF0b3JcIjsgdmFsdWU6IFwifHxcIiB8IFwiOjpcIiB9O1xuXG50eXBlIFNlYXJjaFRleHRFeHByZXNzaW9uTm9kZSA9XG4gIHwgeyB0eXBlOiBcImlkZW50aWZpZXJcIjsgbmFtZTogc3RyaW5nOyBxdW90ZWQ6IGJvb2xlYW4gfVxuICB8IHsgdHlwZTogXCJzdHJpbmdcIjsgdmFsdWU6IHN0cmluZyB9XG4gIHwgeyB0eXBlOiBcImJvb2xlYW5cIjsgdmFsdWU6IGJvb2xlYW4gfVxuICB8IHsgdHlwZTogXCJmdW5jdGlvblwiOyBuYW1lOiBzdHJpbmc7IGFyZ3M6IFNlYXJjaFRleHRFeHByZXNzaW9uTm9kZVtdIH1cbiAgfCB7IHR5cGU6IFwiY29uY2F0XCI7IHBhcnRzOiBTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGVbXSB9XG4gIHwgeyB0eXBlOiBcImNvbGxhdGVcIjsgZXhwcjogU2VhcmNoVGV4dEV4cHJlc3Npb25Ob2RlOyBjb2xsYXRpb246IHN0cmluZzsgcXVvdGVkOiBib29sZWFuIH1cbiAgfCB7IHR5cGU6IFwiY2FzdFwiOyBleHByOiBTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGU7IHRhcmdldFR5cGU6IHN0cmluZyB9O1xuXG5jb25zdCBTRUFSQ0hfVEVYVF9IRUxQRVJfREVGSU5JVElPTlM6IFJlY29yZDxTZWFyY2hUZXh0SGVscGVyS2luZCwgc3RyaW5nPiA9IHtcbiAgXCJ0ZXh0LWFycmF5XCI6IGBhd2FpdCBrbmV4LnJhdyhcXGBDUkVBVEUgT1IgUkVQTEFDRSBGVU5DVElPTiBzb25hbXVfdGV4dF9hcnJheV9hZ2coYXJyIHRleHRbXSwgY2kgYm9vbGVhbiBERUZBVUxUIHRydWUpXG5SRVRVUk5TIHRleHRcbkxBTkdVQUdFIHNxbCBJTU1VVEFCTEUgUEFSQUxMRUwgU0FGRSBSRVRVUk5TIE5VTEwgT04gTlVMTCBJTlBVVFxuQVMgJCRcbiAgU0VMRUNUIHN0cmluZ19hZ2coXG4gICAgQ0FTRSBXSEVOIGNpIFRIRU4gbG93ZXIodmFsdWUpIEVMU0UgdmFsdWUgRU5ELFxuICAgICcgJ1xuICApXG4gIEZST00gdW5uZXN0KGFycikgQVMgdmFsdWVcbiQkXFxgKTtgLFxuICBcImpzb25iLWFycmF5XCI6IGBhd2FpdCBrbmV4LnJhdyhcXGBDUkVBVEUgT1IgUkVQTEFDRSBGVU5DVElPTiBzb25hbXVfanNvbmJfYXJyYXlfYWdnKGFyciBqc29uYiwgY2kgYm9vbGVhbiBERUZBVUxUIHRydWUpXG5SRVRVUk5TIHRleHRcbkxBTkdVQUdFIHNxbCBJTU1VVEFCTEUgUEFSQUxMRUwgU0FGRSBSRVRVUk5TIE5VTEwgT04gTlVMTCBJTlBVVFxuQVMgJCRcbiAgU0VMRUNUIHN0cmluZ19hZ2coXG4gICAgQ0FTRSBXSEVOIGNpIFRIRU4gbG93ZXIodmFsdWUpIEVMU0UgdmFsdWUgRU5ELFxuICAgICcgJ1xuICApXG4gIEZST00ganNvbmJfYXJyYXlfZWxlbWVudHNfdGV4dChhcnIpXG4kJFxcYCk7YCxcbn07XG5cbmNsYXNzIFNlYXJjaFRleHRFeHByZXNzaW9uUGFyc2VyIHtcbiAgcHJpdmF0ZSBpbmRleCA9IDA7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSB0b2tlbnM6IFNlYXJjaFRleHRFeHByZXNzaW9uVG9rZW5bXSkge31cblxuICBpc0F0RW5kKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmluZGV4ID49IHRoaXMudG9rZW5zLmxlbmd0aDtcbiAgfVxuXG4gIHBhcnNlRXhwcmVzc2lvbigpOiBTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGUge1xuICAgIHJldHVybiB0aGlzLnBhcnNlQ29uY2F0KCk7XG4gIH1cblxuICBwcml2YXRlIHBhcnNlQ29uY2F0KCk6IFNlYXJjaFRleHRFeHByZXNzaW9uTm9kZSB7XG4gICAgY29uc3QgcGFydHMgPSBbdGhpcy5wYXJzZVBvc3RmaXgoKV07XG5cbiAgICB3aGlsZSAodGhpcy5tYXRjaE9wZXJhdG9yKFwifHxcIikpIHtcbiAgICAgIHBhcnRzLnB1c2godGhpcy5wYXJzZVBvc3RmaXgoKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcnRzLmxlbmd0aCA9PT0gMSA/IHBhcnRzWzBdIDogeyB0eXBlOiBcImNvbmNhdFwiLCBwYXJ0cyB9O1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZVBvc3RmaXgoKTogU2VhcmNoVGV4dEV4cHJlc3Npb25Ob2RlIHtcbiAgICBsZXQgbm9kZSA9IHRoaXMucGFyc2VQcmltYXJ5KCk7XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgaWYgKHRoaXMubWF0Y2hPcGVyYXRvcihcIjo6XCIpKSB7XG4gICAgICAgIG5vZGUgPSB7XG4gICAgICAgICAgdHlwZTogXCJjYXN0XCIsXG4gICAgICAgICAgZXhwcjogbm9kZSxcbiAgICAgICAgICB0YXJnZXRUeXBlOiB0aGlzLnBhcnNlVHlwZU5hbWUoKSxcbiAgICAgICAgfTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm1hdGNoSWRlbnRpZmllcihcImNvbGxhdGVcIikpIHtcbiAgICAgICAgY29uc3QgdG9rZW4gPSB0aGlzLmNvbnN1bWVDb2xsYXRpb25Ub2tlbigpO1xuICAgICAgICBub2RlID0ge1xuICAgICAgICAgIHR5cGU6IFwiY29sbGF0ZVwiLFxuICAgICAgICAgIGV4cHI6IG5vZGUsXG4gICAgICAgICAgY29sbGF0aW9uOiB0b2tlbi52YWx1ZSxcbiAgICAgICAgICBxdW90ZWQ6IHRva2VuLnR5cGUgPT09IFwicXVvdGVkSWRlbnRpZmllclwiLFxuICAgICAgICB9O1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxuICBwcml2YXRlIHBhcnNlUHJpbWFyeSgpOiBTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGUge1xuICAgIGNvbnN0IHRva2VuID0gdGhpcy5jb25zdW1lVG9rZW4oXCLtkZztmITsi51cIik7XG5cbiAgICBpZiAodG9rZW4udHlwZSA9PT0gXCJzeW1ib2xcIiAmJiB0b2tlbi52YWx1ZSA9PT0gXCIoXCIpIHtcbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnBhcnNlRXhwcmVzc2lvbigpO1xuICAgICAgdGhpcy5leHBlY3RTeW1ib2woXCIpXCIpO1xuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuXG4gICAgaWYgKHRva2VuLnR5cGUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IFwic3RyaW5nXCIsIHZhbHVlOiB0b2tlbi52YWx1ZSB9O1xuICAgIH1cblxuICAgIGlmICh0b2tlbi50eXBlID09PSBcImlkZW50aWZpZXJcIiB8fCB0b2tlbi50eXBlID09PSBcInF1b3RlZElkZW50aWZpZXJcIikge1xuICAgICAgY29uc3QgbG93ZXJOYW1lID0gdG9rZW4udmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICAgIGlmICh0b2tlbi50eXBlID09PSBcImlkZW50aWZpZXJcIiAmJiAobG93ZXJOYW1lID09PSBcInRydWVcIiB8fCBsb3dlck5hbWUgPT09IFwiZmFsc2VcIikpIHtcbiAgICAgICAgcmV0dXJuIHsgdHlwZTogXCJib29sZWFuXCIsIHZhbHVlOiBsb3dlck5hbWUgPT09IFwidHJ1ZVwiIH07XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm1hdGNoU3ltYm9sKFwiKFwiKSkge1xuICAgICAgICBpZiAodG9rZW4udHlwZSA9PT0gXCJpZGVudGlmaWVyXCIgJiYgbG93ZXJOYW1lID09PSBcInRyaW1cIiAmJiB0aGlzLmlzVHJpbUJvdGhGcm9tRm9ybSgpKSB7XG4gICAgICAgICAgdGhpcy5pbmRleCArPSAyO1xuICAgICAgICAgIGNvbnN0IGFyZyA9IHRoaXMucGFyc2VFeHByZXNzaW9uKCk7XG4gICAgICAgICAgdGhpcy5leHBlY3RTeW1ib2woXCIpXCIpO1xuICAgICAgICAgIHJldHVybiB7IHR5cGU6IFwiZnVuY3Rpb25cIiwgbmFtZTogXCJ0cmltXCIsIGFyZ3M6IFthcmddIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhcmdzID0gdGhpcy5wYXJzZUZ1bmN0aW9uQXJncygpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6IFwiZnVuY3Rpb25cIixcbiAgICAgICAgICBuYW1lOiB0b2tlbi52YWx1ZSxcbiAgICAgICAgICBhcmdzLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBcImlkZW50aWZpZXJcIixcbiAgICAgICAgbmFtZTogdG9rZW4udmFsdWUsXG4gICAgICAgIHF1b3RlZDogdG9rZW4udHlwZSA9PT0gXCJxdW90ZWRJZGVudGlmaWVyXCIsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihg7KeA7JuQ65CY7KeAIOyViuuKlCBzZWFyY2hUZXh0IGV4cHJlc3Npb24gdG9rZW46ICR7dG9rZW4udHlwZX1gKTtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VGdW5jdGlvbkFyZ3MoKTogU2VhcmNoVGV4dEV4cHJlc3Npb25Ob2RlW10ge1xuICAgIGlmICh0aGlzLm1hdGNoU3ltYm9sKFwiKVwiKSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IGFyZ3M6IFNlYXJjaFRleHRFeHByZXNzaW9uTm9kZVtdID0gW107XG4gICAgZG8ge1xuICAgICAgYXJncy5wdXNoKHRoaXMucGFyc2VFeHByZXNzaW9uKCkpO1xuICAgIH0gd2hpbGUgKHRoaXMubWF0Y2hTeW1ib2woXCIsXCIpKTtcblxuICAgIHRoaXMuZXhwZWN0U3ltYm9sKFwiKVwiKTtcbiAgICByZXR1cm4gYXJncztcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VUeXBlTmFtZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBhcnRzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvbnN0IHRva2VuID0gdGhpcy5wZWVrKCk7XG4gICAgICBpZiAoXG4gICAgICAgIHRva2VuPy50eXBlID09PSBcImlkZW50aWZpZXJcIiB8fFxuICAgICAgICB0b2tlbj8udHlwZSA9PT0gXCJxdW90ZWRJZGVudGlmaWVyXCIgfHxcbiAgICAgICAgKHRva2VuPy50eXBlID09PSBcInN5bWJvbFwiICYmXG4gICAgICAgICAgKHRva2VuLnZhbHVlID09PSBcIihcIiB8fCB0b2tlbi52YWx1ZSA9PT0gXCIpXCIgfHwgdG9rZW4udmFsdWUgPT09IFwiLFwiKSlcbiAgICAgICkge1xuICAgICAgICBpZiAodG9rZW4udHlwZSA9PT0gXCJzeW1ib2xcIikge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgcGFydHMucHVzaCh0b2tlbi52YWx1ZS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgdGhpcy5pbmRleCArPSAxO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwi7YOA7J6FIOy6kOyKpO2MhSDrjIDsg4Eg7YOA7J6F7J2EIOywvuydhCDsiJgg7JeG7Iq164uI64ukLlwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFydHMuam9pbihcIiBcIik7XG4gIH1cblxuICBwcml2YXRlIGNvbnN1bWVDb2xsYXRpb25Ub2tlbigpOiBFeHRyYWN0PFxuICAgIFNlYXJjaFRleHRFeHByZXNzaW9uVG9rZW4sXG4gICAgeyB0eXBlOiBcImlkZW50aWZpZXJcIiB8IFwicXVvdGVkSWRlbnRpZmllclwiIH1cbiAgPiB7XG4gICAgY29uc3QgdG9rZW4gPSB0aGlzLnBlZWsoKTtcbiAgICBpZiAodG9rZW4/LnR5cGUgIT09IFwiaWRlbnRpZmllclwiICYmIHRva2VuPy50eXBlICE9PSBcInF1b3RlZElkZW50aWZpZXJcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ09MTEFURSDrjIDsg4Eg7Iud67OE7J6Q66W8IOywvuydhCDsiJgg7JeG7Iq164uI64ukLlwiKTtcbiAgICB9XG4gICAgdGhpcy5pbmRleCArPSAxO1xuICAgIHJldHVybiB0b2tlbjtcbiAgfVxuXG4gIHByaXZhdGUgaXNUcmltQm90aEZyb21Gb3JtKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGJvdGhUb2tlbiA9IHRoaXMucGVlaygpO1xuICAgIGNvbnN0IGZyb21Ub2tlbiA9IHRoaXMucGVlaygxKTtcblxuICAgIHJldHVybiAoXG4gICAgICBib3RoVG9rZW4/LnR5cGUgPT09IFwiaWRlbnRpZmllclwiICYmXG4gICAgICBib3RoVG9rZW4udmFsdWUudG9Mb3dlckNhc2UoKSA9PT0gXCJib3RoXCIgJiZcbiAgICAgIGZyb21Ub2tlbj8udHlwZSA9PT0gXCJpZGVudGlmaWVyXCIgJiZcbiAgICAgIGZyb21Ub2tlbi52YWx1ZS50b0xvd2VyQ2FzZSgpID09PSBcImZyb21cIlxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGV4cGVjdFN5bWJvbCh2YWx1ZTogXCIoXCIgfCBcIilcIiB8IFwiLFwiKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm1hdGNoU3ltYm9sKHZhbHVlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBcIiR7dmFsdWV9XCIg7Yag7YGw7J20IO2VhOyalO2VqeuLiOuLpC5gKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG1hdGNoU3ltYm9sKHZhbHVlOiBcIihcIiB8IFwiKVwiIHwgXCIsXCIpOiBib29sZWFuIHtcbiAgICBjb25zdCB0b2tlbiA9IHRoaXMucGVlaygpO1xuICAgIGlmICh0b2tlbj8udHlwZSA9PT0gXCJzeW1ib2xcIiAmJiB0b2tlbi52YWx1ZSA9PT0gdmFsdWUpIHtcbiAgICAgIHRoaXMuaW5kZXggKz0gMTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIG1hdGNoT3BlcmF0b3IodmFsdWU6IFwifHxcIiB8IFwiOjpcIik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHRva2VuID0gdGhpcy5wZWVrKCk7XG4gICAgaWYgKHRva2VuPy50eXBlID09PSBcIm9wZXJhdG9yXCIgJiYgdG9rZW4udmFsdWUgPT09IHZhbHVlKSB7XG4gICAgICB0aGlzLmluZGV4ICs9IDE7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXRjaElkZW50aWZpZXIodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHRva2VuID0gdGhpcy5wZWVrKCk7XG4gICAgaWYgKHRva2VuPy50eXBlID09PSBcImlkZW50aWZpZXJcIiAmJiB0b2tlbi52YWx1ZS50b0xvd2VyQ2FzZSgpID09PSB2YWx1ZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICB0aGlzLmluZGV4ICs9IDE7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBjb25zdW1lVG9rZW4oY29udGV4dDogc3RyaW5nKTogU2VhcmNoVGV4dEV4cHJlc3Npb25Ub2tlbiB7XG4gICAgY29uc3QgdG9rZW4gPSB0aGlzLnBlZWsoKTtcbiAgICBpZiAoIXRva2VuKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7Y29udGV4dH0g7Yag7YGw7J20IO2VhOyalO2VqeuLiOuLpC5gKTtcbiAgICB9XG4gICAgdGhpcy5pbmRleCArPSAxO1xuICAgIHJldHVybiB0b2tlbjtcbiAgfVxuXG4gIHByaXZhdGUgcGVlayhvZmZzZXQgPSAwKTogU2VhcmNoVGV4dEV4cHJlc3Npb25Ub2tlbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5zW3RoaXMuaW5kZXggKyBvZmZzZXRdO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldEluZGV4Q29sdW1uT3BjbGFzcyhjb2x1bW46IE1pZ3JhdGlvbkluZGV4W1wiY29sdW1uc1wiXVtudW1iZXJdKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGNvbHVtbi5vcGNsYXNzID8/IGNvbHVtbi52ZWN0b3JPcHM7XG59XG5cbmZ1bmN0aW9uIHRva2VuaXplU2VhcmNoVGV4dEV4cHJlc3Npb24oZXhwcmVzc2lvbjogc3RyaW5nKTogU2VhcmNoVGV4dEV4cHJlc3Npb25Ub2tlbltdIHtcbiAgY29uc3QgdG9rZW5zOiBTZWFyY2hUZXh0RXhwcmVzc2lvblRva2VuW10gPSBbXTtcbiAgbGV0IGluZGV4ID0gMDtcblxuICB3aGlsZSAoaW5kZXggPCBleHByZXNzaW9uLmxlbmd0aCkge1xuICAgIGNvbnN0IGNoYXIgPSBleHByZXNzaW9uW2luZGV4XTtcblxuICAgIGlmIChjaGFyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmICgvXFxzLy50ZXN0KGNoYXIpKSB7XG4gICAgICBpbmRleCArPSAxO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGV4cHJlc3Npb24uc3RhcnRzV2l0aChcInx8XCIsIGluZGV4KSkge1xuICAgICAgdG9rZW5zLnB1c2goeyB0eXBlOiBcIm9wZXJhdG9yXCIsIHZhbHVlOiBcInx8XCIgfSk7XG4gICAgICBpbmRleCArPSAyO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGV4cHJlc3Npb24uc3RhcnRzV2l0aChcIjo6XCIsIGluZGV4KSkge1xuICAgICAgdG9rZW5zLnB1c2goeyB0eXBlOiBcIm9wZXJhdG9yXCIsIHZhbHVlOiBcIjo6XCIgfSk7XG4gICAgICBpbmRleCArPSAyO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGNoYXIgPT09IFwiKFwiIHx8IGNoYXIgPT09IFwiKVwiIHx8IGNoYXIgPT09IFwiLFwiKSB7XG4gICAgICB0b2tlbnMucHVzaCh7IHR5cGU6IFwic3ltYm9sXCIsIHZhbHVlOiBjaGFyIH0pO1xuICAgICAgaW5kZXggKz0gMTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChjaGFyID09PSBcIidcIikge1xuICAgICAgbGV0IHZhbHVlID0gXCJcIjtcbiAgICAgIGluZGV4ICs9IDE7XG5cbiAgICAgIHdoaWxlIChpbmRleCA8IGV4cHJlc3Npb24ubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSBleHByZXNzaW9uW2luZGV4XTtcbiAgICAgICAgaWYgKGN1cnJlbnQgPT09IFwiJ1wiKSB7XG4gICAgICAgICAgaWYgKGV4cHJlc3Npb25baW5kZXggKyAxXSA9PT0gXCInXCIpIHtcbiAgICAgICAgICAgIHZhbHVlICs9IFwiJ1wiO1xuICAgICAgICAgICAgaW5kZXggKz0gMjtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGluZGV4ICs9IDE7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY3VycmVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICB2YWx1ZSArPSBjdXJyZW50O1xuICAgICAgICBpbmRleCArPSAxO1xuICAgICAgfVxuXG4gICAgICB0b2tlbnMucHVzaCh7IHR5cGU6IFwic3RyaW5nXCIsIHZhbHVlIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGNoYXIgPT09ICdcIicpIHtcbiAgICAgIGxldCB2YWx1ZSA9IFwiXCI7XG4gICAgICBpbmRleCArPSAxO1xuXG4gICAgICB3aGlsZSAoaW5kZXggPCBleHByZXNzaW9uLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBjdXJyZW50ID0gZXhwcmVzc2lvbltpbmRleF07XG4gICAgICAgIGlmIChjdXJyZW50ID09PSAnXCInKSB7XG4gICAgICAgICAgaWYgKGV4cHJlc3Npb25baW5kZXggKyAxXSA9PT0gJ1wiJykge1xuICAgICAgICAgICAgdmFsdWUgKz0gJ1wiJztcbiAgICAgICAgICAgIGluZGV4ICs9IDI7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpbmRleCArPSAxO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGN1cnJlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFsdWUgKz0gY3VycmVudDtcbiAgICAgICAgaW5kZXggKz0gMTtcbiAgICAgIH1cblxuICAgICAgdG9rZW5zLnB1c2goeyB0eXBlOiBcInF1b3RlZElkZW50aWZpZXJcIiwgdmFsdWUgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoL1tBLVphLXpfXS8udGVzdChjaGFyKSkge1xuICAgICAgbGV0IHZhbHVlID0gY2hhcjtcbiAgICAgIGluZGV4ICs9IDE7XG5cbiAgICAgIHdoaWxlIChpbmRleCA8IGV4cHJlc3Npb24ubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSBleHByZXNzaW9uW2luZGV4XTtcbiAgICAgICAgaWYgKGN1cnJlbnQgIT09IHVuZGVmaW5lZCAmJiAvW0EtWmEtejAtOV8kXS8udGVzdChjdXJyZW50KSkge1xuICAgICAgICAgIHZhbHVlICs9IGN1cnJlbnQ7XG4gICAgICAgICAgaW5kZXggKz0gMTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgdG9rZW5zLnB1c2goeyB0eXBlOiBcImlkZW50aWZpZXJcIiwgdmFsdWUgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYOyngOybkOuQmOyngCDslYrripQgc2VhcmNoVGV4dCBleHByZXNzaW9uIOusuOyekDogJHtjaGFyfWApO1xuICB9XG5cbiAgcmV0dXJuIHRva2Vucztcbn1cblxuZnVuY3Rpb24gY2Fub25pY2FsaXplU2VhcmNoVGV4dEdlbmVyYXRlZEV4cHJlc3Npb24oZXhwcmVzc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgU2VhcmNoVGV4dEV4cHJlc3Npb25QYXJzZXIodG9rZW5pemVTZWFyY2hUZXh0RXhwcmVzc2lvbihleHByZXNzaW9uKSk7XG4gICAgY29uc3QgcGFyc2VkRXhwcmVzc2lvbiA9IHBhcnNlci5wYXJzZUV4cHJlc3Npb24oKTtcblxuICAgIGlmICghcGFyc2VyLmlzQXRFbmQoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwic2VhcmNoVGV4dCBleHByZXNzaW9uIO2MjOyLseydtCDrgZ3rgpjsp4Ag7JWK7JWY7Iq164uI64ukLlwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVuZGVyU2VhcmNoVGV4dEV4cHJlc3Npb24obm9ybWFsaXplU2VhcmNoVGV4dEV4cHJlc3Npb25Ob2RlKHBhcnNlZEV4cHJlc3Npb24pKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZVNlYXJjaFRleHRFeHByZXNzaW9uRmFsbGJhY2soZXhwcmVzc2lvbik7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplU2VhcmNoVGV4dEV4cHJlc3Npb25Ob2RlKFxuICBub2RlOiBTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGUsXG4pOiBTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGUge1xuICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgIGNhc2UgXCJpZGVudGlmaWVyXCI6XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5ub2RlLFxuICAgICAgICBuYW1lOiBub2RlLnF1b3RlZCA/IG5vZGUubmFtZSA6IG5vZGUubmFtZS50b0xvd2VyQ2FzZSgpLFxuICAgICAgfTtcbiAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgIHJldHVybiBub2RlO1xuICAgIGNhc2UgXCJjb25jYXRcIjoge1xuICAgICAgY29uc3QgcGFydHMgPSBub2RlLnBhcnRzLmZsYXRNYXAoKHBhcnQpID0+IHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFBhcnQgPSBub3JtYWxpemVTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGUocGFydCk7XG4gICAgICAgIHJldHVybiBub3JtYWxpemVkUGFydC50eXBlID09PSBcImNvbmNhdFwiID8gbm9ybWFsaXplZFBhcnQucGFydHMgOiBbbm9ybWFsaXplZFBhcnRdO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4geyB0eXBlOiBcImNvbmNhdFwiLCBwYXJ0cyB9O1xuICAgIH1cbiAgICBjYXNlIFwiY29sbGF0ZVwiOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogXCJjb2xsYXRlXCIsXG4gICAgICAgIGV4cHI6IG5vcm1hbGl6ZVNlYXJjaFRleHRFeHByZXNzaW9uTm9kZShub2RlLmV4cHIpLFxuICAgICAgICBjb2xsYXRpb246IG5vZGUuY29sbGF0aW9uLnRvVXBwZXJDYXNlKCkgPT09IFwiQ1wiID8gXCJDXCIgOiBub2RlLmNvbGxhdGlvbixcbiAgICAgICAgcXVvdGVkOiBub2RlLnF1b3RlZCB8fCBub2RlLmNvbGxhdGlvbi50b1VwcGVyQ2FzZSgpID09PSBcIkNcIixcbiAgICAgIH07XG4gICAgY2FzZSBcImNhc3RcIjoge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZEV4cHIgPSBub3JtYWxpemVTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGUobm9kZS5leHByKTtcbiAgICAgIGNvbnN0IHRhcmdldFR5cGUgPSBub2RlLnRhcmdldFR5cGUucmVwbGFjZSgvXFxzKy9nLCBcIiBcIikudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAodGFyZ2V0VHlwZSA9PT0gXCJ0ZXh0XCIgfHwgdGFyZ2V0VHlwZSA9PT0gXCJjaGFyYWN0ZXIgdmFyeWluZ1wiIHx8IHRhcmdldFR5cGUgPT09IFwidmFyY2hhclwiKSB7XG4gICAgICAgIHJldHVybiBub3JtYWxpemVkRXhwcjtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFwiY2FzdFwiLFxuICAgICAgICBleHByOiBub3JtYWxpemVkRXhwcixcbiAgICAgICAgdGFyZ2V0VHlwZSxcbiAgICAgIH07XG4gICAgfVxuICAgIGNhc2UgXCJmdW5jdGlvblwiOiB7XG4gICAgICBjb25zdCBuYW1lID0gbm9kZS5uYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICBsZXQgYXJncyA9IG5vZGUuYXJncy5tYXAoKGFyZykgPT4gbm9ybWFsaXplU2VhcmNoVGV4dEV4cHJlc3Npb25Ob2RlKGFyZykpO1xuXG4gICAgICBpZiAoKG5hbWUgPT09IFwidHJpbVwiIHx8IG5hbWUgPT09IFwiYnRyaW1cIikgJiYgYXJncy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eXBlOiBcImZ1bmN0aW9uXCIsXG4gICAgICAgICAgbmFtZTogXCJ0cmltXCIsXG4gICAgICAgICAgYXJncyxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICAobmFtZSA9PT0gXCJzb25hbXVfdGV4dF9hcnJheV9hZ2dcIiB8fCBuYW1lID09PSBcInNvbmFtdV9qc29uYl9hcnJheV9hZ2dcIikgJiZcbiAgICAgICAgYXJncy5sZW5ndGggPT09IDIgJiZcbiAgICAgICAgYXJnc1sxXT8udHlwZSA9PT0gXCJib29sZWFuXCIgJiZcbiAgICAgICAgYXJnc1sxXS52YWx1ZVxuICAgICAgKSB7XG4gICAgICAgIGFyZ3MgPSBbYXJnc1swXV07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFwiZnVuY3Rpb25cIixcbiAgICAgICAgbmFtZSxcbiAgICAgICAgYXJncyxcbiAgICAgIH07XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlbmRlclNlYXJjaFRleHRFeHByZXNzaW9uKG5vZGU6IFNlYXJjaFRleHRFeHByZXNzaW9uTm9kZSwgcGFyZW50UHJlY2VkZW5jZSA9IDApOiBzdHJpbmcge1xuICBjb25zdCBwcmVjZWRlbmNlID0gZ2V0U2VhcmNoVGV4dEV4cHJlc3Npb25QcmVjZWRlbmNlKG5vZGUpO1xuICBjb25zdCByZW5kZXJlZCA9ICgoKSA9PiB7XG4gICAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJpZGVudGlmaWVyXCI6XG4gICAgICAgIHJldHVybiBub2RlLnF1b3RlZCA/IGBcIiR7bm9kZS5uYW1lLnJlcGxhY2VBbGwoJ1wiJywgJ1wiXCInKX1cImAgOiBub2RlLm5hbWU7XG4gICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgIHJldHVybiBgJyR7bm9kZS52YWx1ZS5yZXBsYWNlQWxsKFwiJ1wiLCBcIicnXCIpfSdgO1xuICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgcmV0dXJuIG5vZGUudmFsdWUgPyBcInRydWVcIiA6IFwiZmFsc2VcIjtcbiAgICAgIGNhc2UgXCJmdW5jdGlvblwiOlxuICAgICAgICByZXR1cm4gYCR7bm9kZS5uYW1lfSgke25vZGUuYXJnc1xuICAgICAgICAgIC5tYXAoKGFyZykgPT4gcmVuZGVyU2VhcmNoVGV4dEV4cHJlc3Npb24oYXJnKSlcbiAgICAgICAgICAuam9pbihcIiwgXCIpfSlgO1xuICAgICAgY2FzZSBcImNvbmNhdFwiOlxuICAgICAgICByZXR1cm4gbm9kZS5wYXJ0cy5tYXAoKHBhcnQpID0+IHJlbmRlclNlYXJjaFRleHRFeHByZXNzaW9uKHBhcnQsIHByZWNlZGVuY2UpKS5qb2luKFwiIHx8IFwiKTtcbiAgICAgIGNhc2UgXCJjb2xsYXRlXCI6IHtcbiAgICAgICAgY29uc3QgY29sbGF0aW9uID0gbm9kZS5xdW90ZWRcbiAgICAgICAgICA/IGBcIiR7bm9kZS5jb2xsYXRpb24ucmVwbGFjZUFsbCgnXCInLCAnXCJcIicpfVwiYFxuICAgICAgICAgIDogbm9kZS5jb2xsYXRpb247XG4gICAgICAgIHJldHVybiBgJHtyZW5kZXJTZWFyY2hUZXh0RXhwcmVzc2lvbihub2RlLmV4cHIsIHByZWNlZGVuY2UpfSBDT0xMQVRFICR7Y29sbGF0aW9ufWA7XG4gICAgICB9XG4gICAgICBjYXNlIFwiY2FzdFwiOlxuICAgICAgICByZXR1cm4gYCR7cmVuZGVyU2VhcmNoVGV4dEV4cHJlc3Npb24obm9kZS5leHByLCBwcmVjZWRlbmNlKX06OiR7bm9kZS50YXJnZXRUeXBlfWA7XG4gICAgfVxuICB9KSgpO1xuXG4gIGlmIChwcmVjZWRlbmNlIDwgcGFyZW50UHJlY2VkZW5jZSkge1xuICAgIHJldHVybiBgKCR7cmVuZGVyZWR9KWA7XG4gIH1cblxuICByZXR1cm4gcmVuZGVyZWQ7XG59XG5cbmZ1bmN0aW9uIGdldFNlYXJjaFRleHRFeHByZXNzaW9uUHJlY2VkZW5jZShub2RlOiBTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGUpOiBudW1iZXIge1xuICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgIGNhc2UgXCJjb25jYXRcIjpcbiAgICAgIHJldHVybiAxO1xuICAgIGNhc2UgXCJjb2xsYXRlXCI6XG4gICAgY2FzZSBcImNhc3RcIjpcbiAgICAgIHJldHVybiAyO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gMztcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVTZWFyY2hUZXh0RXhwcmVzc2lvbkZhbGxiYWNrKGV4cHJlc3Npb246IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBleHByZXNzaW9uXG4gICAgLnJlcGxhY2UoL1xccysvZywgXCIgXCIpXG4gICAgLnJlcGxhY2UoL1xcYlRSSU1cXHMqXFwoXFxzKkJPVEhcXHMrRlJPTVxccysvZ2ksIFwidHJpbShcIilcbiAgICAucmVwbGFjZSgvOjooPzp0ZXh0fGNoYXJhY3RlciB2YXJ5aW5nfHZhcmNoYXIpXFxiL2dpLCBcIlwiKVxuICAgIC5yZXBsYWNlKC8sXFxzKnRydWVcXGIvZ2ksIFwiXCIpXG4gICAgLnRyaW0oKTtcbn1cblxuZnVuY3Rpb24gdmlzaXRTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGUoXG4gIG5vZGU6IFNlYXJjaFRleHRFeHByZXNzaW9uTm9kZSxcbiAgdmlzaXRvcjogKG5vZGU6IFNlYXJjaFRleHRFeHByZXNzaW9uTm9kZSkgPT4gdm9pZCxcbik6IHZvaWQge1xuICB2aXNpdG9yKG5vZGUpO1xuXG4gIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgY2FzZSBcImNvbmNhdFwiOlxuICAgICAgbm9kZS5wYXJ0cy5mb3JFYWNoKChwYXJ0KSA9PiB7XG4gICAgICAgIHZpc2l0U2VhcmNoVGV4dEV4cHJlc3Npb25Ob2RlKHBhcnQsIHZpc2l0b3IpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgY2FzZSBcImNvbGxhdGVcIjpcbiAgICBjYXNlIFwiY2FzdFwiOlxuICAgICAgdmlzaXRTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGUobm9kZS5leHByLCB2aXNpdG9yKTtcbiAgICAgIHJldHVybjtcbiAgICBjYXNlIFwiZnVuY3Rpb25cIjpcbiAgICAgIG5vZGUuYXJncy5mb3JFYWNoKChhcmcpID0+IHtcbiAgICAgICAgdmlzaXRTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGUoYXJnLCB2aXNpdG9yKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIGNhc2UgXCJpZGVudGlmaWVyXCI6XG4gICAgY2FzZSBcInN0cmluZ1wiOlxuICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICByZXR1cm47XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0U2VhcmNoVGV4dEhlbHBlcktpbmRzRnJvbUV4cHJlc3Npb24oZXhwcmVzc2lvbjogc3RyaW5nKTogU2V0PFNlYXJjaFRleHRIZWxwZXJLaW5kPiB7XG4gIGNvbnN0IGhlbHBlcktpbmRzID0gbmV3IFNldDxTZWFyY2hUZXh0SGVscGVyS2luZD4oKTtcbiAgY29uc3QgYWRkSGVscGVyS2luZEZyb21OYW1lID0gKG5hbWU6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWROYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChub3JtYWxpemVkTmFtZSA9PT0gXCJzb25hbXVfdGV4dF9hcnJheV9hZ2dcIikge1xuICAgICAgaGVscGVyS2luZHMuYWRkKFwidGV4dC1hcnJheVwiKTtcbiAgICB9IGVsc2UgaWYgKG5vcm1hbGl6ZWROYW1lID09PSBcInNvbmFtdV9qc29uYl9hcnJheV9hZ2dcIikge1xuICAgICAgaGVscGVyS2luZHMuYWRkKFwianNvbmItYXJyYXlcIik7XG4gICAgfVxuICB9O1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcGFyc2VyID0gbmV3IFNlYXJjaFRleHRFeHByZXNzaW9uUGFyc2VyKHRva2VuaXplU2VhcmNoVGV4dEV4cHJlc3Npb24oZXhwcmVzc2lvbikpO1xuICAgIGNvbnN0IHBhcnNlZEV4cHJlc3Npb24gPSBwYXJzZXIucGFyc2VFeHByZXNzaW9uKCk7XG5cbiAgICBpZiAoIXBhcnNlci5pc0F0RW5kKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInNlYXJjaFRleHQgaGVscGVyIGV4cHJlc3Npb24g7YyM7Iux7J20IOuBneuCmOyngCDslYrslZjsirXri4jri6QuXCIpO1xuICAgIH1cblxuICAgIHZpc2l0U2VhcmNoVGV4dEV4cHJlc3Npb25Ob2RlKHBhcnNlZEV4cHJlc3Npb24sIChub2RlKSA9PiB7XG4gICAgICBpZiAobm9kZS50eXBlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgYWRkSGVscGVyS2luZEZyb21OYW1lKG5vZGUubmFtZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIGlmICgvXFxic29uYW11X3RleHRfYXJyYXlfYWdnXFxzKlxcKC9pLnRlc3QoZXhwcmVzc2lvbikpIHtcbiAgICAgIGhlbHBlcktpbmRzLmFkZChcInRleHQtYXJyYXlcIik7XG4gICAgfVxuICAgIGlmICgvXFxic29uYW11X2pzb25iX2FycmF5X2FnZ1xccypcXCgvaS50ZXN0KGV4cHJlc3Npb24pKSB7XG4gICAgICBoZWxwZXJLaW5kcy5hZGQoXCJqc29uYi1hcnJheVwiKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaGVscGVyS2luZHM7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVTZWFyY2hUZXh0Q29sdW1ucyh0YWJsZTogc3RyaW5nLCBjb2x1bW5zOiBNaWdyYXRpb25Db2x1bW5bXSk6IE1pZ3JhdGlvbkNvbHVtbltdIHtcbiAgY29uc3QgZW50aXR5ID0gKCgpID0+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIEVudGl0eU1hbmFnZXIuZ2V0QnlUYWJsZSh0YWJsZSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH0pKCk7XG5cbiAgaWYgKCFlbnRpdHkpIHtcbiAgICByZXR1cm4gY29sdW1ucztcbiAgfVxuXG4gIGNvbnN0IHByb3BzQnlOYW1lID0gbmV3IE1hcChlbnRpdHkucHJvcHMubWFwKChwcm9wKSA9PiBbcHJvcC5uYW1lLCBwcm9wXSkpO1xuXG4gIHJldHVybiBjb2x1bW5zLm1hcCgoY29sdW1uKSA9PiB7XG4gICAgY29uc3QgcHJvcCA9IHByb3BzQnlOYW1lLmdldChjb2x1bW4ubmFtZSk7XG4gICAgaWYgKCFwcm9wIHx8ICFpc1NlYXJjaFRleHRQcm9wKHByb3ApKSB7XG4gICAgICByZXR1cm4gY29sdW1uO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb2x1bW4sXG4gICAgICBnZW5lcmF0ZWQ6IHtcbiAgICAgICAgdHlwZTogXCJTVE9SRURcIixcbiAgICAgICAgZXhwcmVzc2lvbjogYnVpbGRTZWFyY2hUZXh0R2VuZXJhdGVkRXhwcmVzc2lvbihwcm9wLCBwcm9wc0J5TmFtZSksXG4gICAgICB9LFxuICAgIH07XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBidWlsZFNlYXJjaFRleHRHZW5lcmF0ZWRFeHByZXNzaW9uKFxuICBwcm9wOiBFeHRyYWN0PEVudGl0eVByb3AsIHsgdHlwZTogXCJzZWFyY2hUZXh0XCIgfT4sXG4gIHByb3BzQnlOYW1lOiBNYXA8c3RyaW5nLCBFbnRpdHlQcm9wPixcbik6IHN0cmluZyB7XG4gIGNvbnN0IHRva2VucyA9IHByb3Auc291cmNlQ29sdW1ucy5tYXAoKHNvdXJjZSkgPT4ge1xuICAgIGNvbnN0IHNvdXJjZVByb3AgPSBwcm9wc0J5TmFtZS5nZXQoc291cmNlLm5hbWUpO1xuICAgIGlmICghc291cmNlUHJvcCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBzZWFyY2hUZXh0IHNvdXJjZSBjb2x1bW4gXCIke3NvdXJjZS5uYW1lfVwi7J2EKOulvCkg7LC+7J2EIOyImCDsl4bsirXri4jri6QuYCk7XG4gICAgfVxuXG4gICAgaWYgKHNvdXJjZVByb3AudHlwZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHNvdXJjZS5jYXNlSW5zZW5zaXRpdmVcbiAgICAgICAgPyBgbG93ZXIoQ09BTEVTQ0UoJHtzb3VyY2UubmFtZX0sICcnKSlgXG4gICAgICAgIDogYENPQUxFU0NFKCR7c291cmNlLm5hbWV9LCAnJylgO1xuICAgIH1cblxuICAgIGlmIChzb3VyY2VQcm9wLnR5cGUgPT09IFwic3RyaW5nW11cIikge1xuICAgICAgcmV0dXJuIHNvdXJjZS5jYXNlSW5zZW5zaXRpdmVcbiAgICAgICAgPyBgQ09BTEVTQ0Uoc29uYW11X3RleHRfYXJyYXlfYWdnKCR7c291cmNlLm5hbWV9KSwgJycpYFxuICAgICAgICA6IGBDT0FMRVNDRShzb25hbXVfdGV4dF9hcnJheV9hZ2coJHtzb3VyY2UubmFtZX0sIGZhbHNlKSwgJycpYDtcbiAgICB9XG5cbiAgICBpZiAoc291cmNlUHJvcC50eXBlID09PSBcImpzb25cIikge1xuICAgICAgcmV0dXJuIHNvdXJjZS5jYXNlSW5zZW5zaXRpdmVcbiAgICAgICAgPyBgQ09BTEVTQ0Uoc29uYW11X2pzb25iX2FycmF5X2FnZygke3NvdXJjZS5uYW1lfSksICcnKWBcbiAgICAgICAgOiBgQ09BTEVTQ0Uoc29uYW11X2pzb25iX2FycmF5X2FnZygke3NvdXJjZS5uYW1lfSwgZmFsc2UpLCAnJylgO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBzZWFyY2hUZXh0IHNvdXJjZSBjb2x1bW4gXCIke3NvdXJjZS5uYW1lfVwi7J2YIO2DgOyehSBcIiR7c291cmNlUHJvcC50eXBlfVwi7J2AKOuKlCkg7KeA7JuQ65CY7KeAIOyViuyKteuLiOuLpC5gLFxuICAgICk7XG4gIH0pO1xuXG4gIHJldHVybiBgdHJpbSgke3Rva2Vucy5qb2luKGAgfHwgJyAnIHx8IGApfSlgO1xufVxuXG5mdW5jdGlvbiBnZXRTZWFyY2hUZXh0SGVscGVyRGVmaW5pdGlvbnModGFibGU6IHN0cmluZywgY29sdW1uczogTWlncmF0aW9uQ29sdW1uW10pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGhlbHBlcktpbmRzID0gbmV3IFNldDxTZWFyY2hUZXh0SGVscGVyS2luZD4oKTtcblxuICBjb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xuICAgIGlmICghY29sdW1uLmdlbmVyYXRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGdldFNlYXJjaFRleHRIZWxwZXJLaW5kc0Zyb21FeHByZXNzaW9uKGNvbHVtbi5nZW5lcmF0ZWQuZXhwcmVzc2lvbikuZm9yRWFjaCgoa2luZCkgPT4ge1xuICAgICAgaGVscGVyS2luZHMuYWRkKGtpbmQpO1xuICAgIH0pO1xuICB9KTtcblxuICBpZiAoaGVscGVyS2luZHMuc2l6ZSA+IDApIHtcbiAgICByZXR1cm4gKFtcInRleHQtYXJyYXlcIiwgXCJqc29uYi1hcnJheVwiXSBhcyBjb25zdClcbiAgICAgIC5maWx0ZXIoKGtpbmQpID0+IGhlbHBlcktpbmRzLmhhcyhraW5kKSlcbiAgICAgIC5tYXAoKGtpbmQpID0+IFNFQVJDSF9URVhUX0hFTFBFUl9ERUZJTklUSU9OU1traW5kXSk7XG4gIH1cblxuICBjb25zdCBlbnRpdHkgPSAoKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gRW50aXR5TWFuYWdlci5nZXRCeVRhYmxlKHRhYmxlKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfSkoKTtcblxuICBpZiAoIWVudGl0eSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBjb25zdCBwcm9wc0J5TmFtZSA9IG5ldyBNYXAoZW50aXR5LnByb3BzLm1hcCgocHJvcCkgPT4gW3Byb3AubmFtZSwgcHJvcF0pKTtcblxuICBjb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xuICAgIGNvbnN0IHByb3AgPSBwcm9wc0J5TmFtZS5nZXQoY29sdW1uLm5hbWUpO1xuICAgIGlmICghcHJvcCB8fCAhaXNTZWFyY2hUZXh0UHJvcChwcm9wKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHByb3Auc291cmNlQ29sdW1ucy5mb3JFYWNoKChzb3VyY2UpID0+IHtcbiAgICAgIGNvbnN0IHNvdXJjZVByb3AgPSBwcm9wc0J5TmFtZS5nZXQoc291cmNlLm5hbWUpO1xuICAgICAgaWYgKHNvdXJjZVByb3A/LnR5cGUgPT09IFwic3RyaW5nW11cIikge1xuICAgICAgICBoZWxwZXJLaW5kcy5hZGQoXCJ0ZXh0LWFycmF5XCIpO1xuICAgICAgfSBlbHNlIGlmIChzb3VyY2VQcm9wPy50eXBlID09PSBcImpzb25cIikge1xuICAgICAgICBoZWxwZXJLaW5kcy5hZGQoXCJqc29uYi1hcnJheVwiKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cbiAgcmV0dXJuIChbXCJ0ZXh0LWFycmF5XCIsIFwianNvbmItYXJyYXlcIl0gYXMgY29uc3QpXG4gICAgLmZpbHRlcigoa2luZCkgPT4gaGVscGVyS2luZHMuaGFzKGtpbmQpKVxuICAgIC5tYXAoKGtpbmQpID0+IFNFQVJDSF9URVhUX0hFTFBFUl9ERUZJTklUSU9OU1traW5kXSk7XG59XG5cbmZ1bmN0aW9uIGdldFNlYXJjaFRleHRDb2x1bW5OYW1lcyh0YWJsZTogc3RyaW5nKTogU2V0PHN0cmluZz4ge1xuICBjb25zdCBlbnRpdHkgPSAoKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gRW50aXR5TWFuYWdlci5nZXRCeVRhYmxlKHRhYmxlKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfSkoKTtcblxuICBpZiAoIWVudGl0eSkge1xuICAgIHJldHVybiBuZXcgU2V0KCk7XG4gIH1cblxuICByZXR1cm4gbmV3IFNldChlbnRpdHkucHJvcHMuZmlsdGVyKGlzU2VhcmNoVGV4dFByb3ApLm1hcCgocHJvcCkgPT4gcHJvcC5uYW1lKSk7XG59XG5cbi8qKlxuICog7YWM7J2067iUIOyDneyEse2VmOuKlCDsvIDsnbTsiqQgLSDsu6zrn7wv7J24642x7IqkIOyDneyEsVxuICovXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUNyZWF0ZUNvZGVfQ29sdW1uQW5kSW5kZXhlcyhcbiAgdGFibGU6IHN0cmluZyxcbiAgY29sdW1uczogTWlncmF0aW9uQ29sdW1uW10sXG4gIGluZGV4ZXM6IE1pZ3JhdGlvbkluZGV4W10sXG4pOiBQcm9taXNlPEdlbk1pZ3JhdGlvbkNvZGU+IHtcbiAgY29uc3QgcmVzb2x2ZWRDb2x1bW5zID0gcmVzb2x2ZVNlYXJjaFRleHRDb2x1bW5zKHRhYmxlLCBjb2x1bW5zKTtcbiAgY29uc3QgY29sdW1uRGVmcyA9IGdlbkNvbHVtbkRlZmluaXRpb25zKHRhYmxlLCByZXNvbHZlZENvbHVtbnMpO1xuICBjb25zdCBoZWxwZXJEZWZpbml0aW9ucyA9IGdldFNlYXJjaFRleHRIZWxwZXJEZWZpbml0aW9ucyh0YWJsZSwgcmVzb2x2ZWRDb2x1bW5zKTtcblxuICAvLyDsu6zrn7wsIOyduOuNseyKpCDsspjrpqxcbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW1xuICAgICdpbXBvcnQgdHlwZSB7IEtuZXggfSBmcm9tIFwia25leFwiOycsXG4gICAgXCJcIixcbiAgICBcImV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cChrbmV4OiBLbmV4KTogUHJvbWlzZTx2b2lkPiB7XCIsXG4gICAgLi4uaGVscGVyRGVmaW5pdGlvbnMsXG4gICAgYGF3YWl0IGtuZXguc2NoZW1hLmNyZWF0ZVRhYmxlKFwiJHt0YWJsZX1cIiwgKHRhYmxlKSA9PiB7YCxcbiAgICAuLi5jb2x1bW5EZWZzLmJ1aWxkZXIsXG4gICAgXCJ9KTtcIixcbiAgICAvLyByYXcg6rWs66y4IChHZW5lcmF0ZWQgQ29sdW1uIOuTsSlcbiAgICAuLi5jb2x1bW5EZWZzLnJhdyxcbiAgICAvLyBpbmRleOuKlCBrbmV4LnJhd+uhnCDsspjrpqztlZjrr4DroZwgY3JlYXRlVGFibGUg67CW7JeQ7IScIOyLpO2WiVxuICAgIC4uLmluZGV4ZXMubWFwKChpbmRleCkgPT4gZ2VuSW5kZXhEZWZpbml0aW9uKGluZGV4LCB0YWJsZSkpLFxuICAgIFwifVwiLFxuICAgIFwiXCIsXG4gICAgXCJleHBvcnQgYXN5bmMgZnVuY3Rpb24gZG93bihrbmV4OiBLbmV4KTogUHJvbWlzZTx2b2lkPiB7XCIsXG4gICAgYCByZXR1cm4ga25leC5zY2hlbWEuZHJvcFRhYmxlKFwiJHt0YWJsZX1cIik7YCxcbiAgICBcIn1cIixcbiAgXTtcbiAgcmV0dXJuIHtcbiAgICB0YWJsZSxcbiAgICB0eXBlOiBcIm5vcm1hbFwiLFxuICAgIHRpdGxlOiBgY3JlYXRlX18ke3RhYmxlfWAsXG4gICAgZm9ybWF0dGVkOiBhd2FpdCBmb3JtYXRDb2RlKGxpbmVzLmpvaW4oXCJcXG5cIiksIGBzcmMvbWlncmF0aW9uLyR7dGFibGV9LnRzYCksXG4gIH07XG59XG5cbi8qKlxuICogTWlncmF0aW9uQ29sdW1uW10g7J297Ja07IScIOy7rOufvCDsoJXsnZjtlZjripQg6rWs66y4IOyDneyEsVxuICogQHJldHVybnMgYnVpbGRlcjogdGFibGUgYnVpbGRlciDrqZTshJzrk5wsIHJhdzoga25leC5yYXcoKSDqtazrrLhcbiAqL1xuZnVuY3Rpb24gZ2VuQ29sdW1uRGVmaW5pdGlvbnModGFibGU6IHN0cmluZywgY29sdW1uczogTWlncmF0aW9uQ29sdW1uW10pOiBDb2x1bW5EZWZpbml0aW9uUmVzdWx0IHtcbiAgY29uc3QgcmVzdWx0OiBDb2x1bW5EZWZpbml0aW9uUmVzdWx0ID0ge1xuICAgIGJ1aWxkZXI6IFtdLFxuICAgIHJhdzogW10sXG4gIH07XG5cbiAgZm9yIChjb25zdCBjb2x1bW4gb2YgY29sdW1ucykge1xuICAgIC8vIEdlbmVyYXRlZCBDb2x1bW7snYAgcmF366GcIOyymOumrFxuICAgIGlmIChjb2x1bW4uZ2VuZXJhdGVkKSB7XG4gICAgICByZXN1bHQucmF3LnB1c2goZ2VuR2VuZXJhdGVkQ29sdW1uRGVmaW5pdGlvbih0YWJsZSwgY29sdW1uKSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyDsnbzrsJgg7Lus65+87J2AIGJ1aWxkZXLroZwg7LKY66asXG4gICAgcmVzdWx0LmJ1aWxkZXIucHVzaChnZW5Ob3JtYWxDb2x1bW5EZWZpbml0aW9uKGNvbHVtbikpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZWQgQ29sdW1uIOygleydmCDsg53shLEgKEFMVEVSIFRBQkxFIEFERCBDT0xVTU4g7IKs7JqpKVxuICovXG5mdW5jdGlvbiBnZW5HZW5lcmF0ZWRDb2x1bW5EZWZpbml0aW9uKHRhYmxlOiBzdHJpbmcsIGNvbHVtbjogTWlncmF0aW9uQ29sdW1uKTogc3RyaW5nIHtcbiAgaWYgKCFjb2x1bW4uZ2VuZXJhdGVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiR2VuZXJhdGVkIGNvbHVtbiBkZWZpbml0aW9uIHJlcXVpcmVkXCIpO1xuICB9XG4gIGNvbnN0IHBnVHlwZSA9IGdldFBnVHlwZUZvckNvbHVtbihjb2x1bW4pO1xuICBjb25zdCBzdG9yYWdlVHlwZSA9IGNvbHVtbi5nZW5lcmF0ZWQudHlwZSA9PT0gXCJWSVJUVUFMXCIgPyBcIiBWSVJUVUFMXCIgOiBcIiBTVE9SRURcIjtcbiAgY29uc3QgbnVsbGFibGVDbGF1c2UgPSBjb2x1bW4ubnVsbGFibGUgPyBcIlwiIDogXCIgTk9UIE5VTExcIjtcbiAgcmV0dXJuIGBhd2FpdCBrbmV4LnJhdyhcXGBBTFRFUiBUQUJMRSBcIiR7dGFibGV9XCIgQUREIENPTFVNTiBcIiR7Y29sdW1uLm5hbWV9XCIgJHtwZ1R5cGV9IEdFTkVSQVRFRCBBTFdBWVMgQVMgKCR7Y29sdW1uLmdlbmVyYXRlZC5leHByZXNzaW9ufSkke3N0b3JhZ2VUeXBlfSR7bnVsbGFibGVDbGF1c2V9XFxgKTtgO1xufVxuXG4vKipcbiAqIOydvOuwmCDsu6zrn7wg7KCV7J2YIOyDneyEsSAodGFibGUueHh4KCkg7LK07J24KVxuICovXG5mdW5jdGlvbiBnZW5Ob3JtYWxDb2x1bW5EZWZpbml0aW9uKGNvbHVtbjogTWlncmF0aW9uQ29sdW1uKTogc3RyaW5nIHtcbiAgY29uc3QgY2hhaW5zOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGlmIChjb2x1bW4ubmFtZSA9PT0gXCJpZFwiKSB7XG4gICAgLy8gUEsg7YOA7J6F7JeQIOuUsOuluCDrtoTquLAg7LKY66asXG4gICAgaWYgKGNvbHVtbi50eXBlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAvLyBzdHJpbmcgUEs6IGxlbmd0aOqwgCDsnojsnLzrqbQgdmFyY2hhciwg7JeG7Jy866m0IHRleHRcbiAgICAgIGlmIChjb2x1bW4ubGVuZ3RoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGB0YWJsZS5zdHJpbmcoJ2lkJywgJHtjb2x1bW4ubGVuZ3RofSkucHJpbWFyeSgpLm5vdE51bGxhYmxlKCk7YDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBgdGFibGUudGV4dCgnaWQnKS5wcmltYXJ5KCkubm90TnVsbGFibGUoKTtgO1xuICAgIH1cbiAgICBpZiAoY29sdW1uLnR5cGUgPT09IFwidXVpZFwiKSB7XG4gICAgICByZXR1cm4gYHRhYmxlLnV1aWQoJ2lkJykucHJpbWFyeSgpLm5vdE51bGxhYmxlKCk7YDtcbiAgICB9XG4gICAgLy8g6riw7KG0IGludGVnZXIgUEsgKOq4sOuzuOqwkilcbiAgICByZXR1cm4gYHRhYmxlLmluY3JlbWVudHMoKS5wcmltYXJ5KCk7YDtcbiAgfVxuXG4gIC8vIOuwsOyXtCDtg4DsnoUg7LKY66asXG4gIGlmIChjb2x1bW4udHlwZS5lbmRzV2l0aChcIltdXCIpKSB7XG4gICAgY29uc3QgZWxlbWVudFR5cGUgPSBjb2x1bW4udHlwZS5zbGljZSgwLCAtMik7IC8vIFwiaW50ZWdlcltdXCIgLT4gXCJpbnRlZ2VyXCJcbiAgICBjb25zdCBwZ1R5cGUgPSBnZXRQZ0FycmF5VHlwZShjb2x1bW4sIGVsZW1lbnRUeXBlKTtcbiAgICBjaGFpbnMucHVzaChgc3BlY2lmaWNUeXBlKCcke2NvbHVtbi5uYW1lfScsICcke3BnVHlwZX0nKWApO1xuICB9IGVsc2UgaWYgKGNvbHVtbi50eXBlID09PSBcInZlY3RvclwiKSB7XG4gICAgLy8gS25leOuKlCB2ZWN0b3Ig7YOA7J6F7J2EIOyngeygkSDsp4Dsm5DtlZjsp4Ag7JWK7Jy866+A66GcIHNwZWNpZmljVHlwZSDsgqzsmqlcbiAgICBjaGFpbnMucHVzaChgc3BlY2lmaWNUeXBlKCcke2NvbHVtbi5uYW1lfScsICd2ZWN0b3IoJHtjb2x1bW4uZGltZW5zaW9uc30pJylgKTtcbiAgfSBlbHNlIGlmIChjb2x1bW4udHlwZSA9PT0gXCJudW1iZXJPck51bWVyaWNcIikge1xuICAgIC8vIG51bWJlclxuICAgIGlmIChjb2x1bW4ubnVtYmVyVHlwZSA9PT0gXCJyZWFsXCIpIHtcbiAgICAgIGNoYWlucy5wdXNoKGBmbG9hdCgnJHtjb2x1bW4ubmFtZX0nKWApO1xuICAgIH0gZWxzZSBpZiAoY29sdW1uLm51bWJlclR5cGUgPT09IFwiZG91YmxlIHByZWNpc2lvblwiKSB7XG4gICAgICBjaGFpbnMucHVzaChgZG91YmxlKCcke2NvbHVtbi5uYW1lfScpYCk7XG4gICAgfSBlbHNlIGlmICgoY29sdW1uLm51bWJlclR5cGUgPz8gXCJudW1lcmljXCIpID09PSBcIm51bWVyaWNcIikge1xuICAgICAgY2hhaW5zLnB1c2goYGRlY2ltYWwoJyR7Y29sdW1uLm5hbWV9JywgJHtjb2x1bW4ucHJlY2lzaW9ufSwgJHtjb2x1bW4uc2NhbGV9KWApO1xuICAgIH1cbiAgfSBlbHNlIGlmIChjb2x1bW4udHlwZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIC8vIHN0cmluZ1xuICAgIGlmIChjb2x1bW4ubGVuZ3RoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNoYWlucy5wdXNoKGBzdHJpbmcoJyR7Y29sdW1uLm5hbWV9JywgJHtjb2x1bW4ubGVuZ3RofSlgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2hhaW5zLnB1c2goYHRleHQoJyR7Y29sdW1uLm5hbWV9JylgKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoY29sdW1uLnR5cGUgPT09IFwiZGF0ZVwiKSB7XG4gICAgLy8gZGF0ZVxuICAgIGNoYWlucy5wdXNoKFxuICAgICAgYHRpbWVzdGFtcCgnJHtjb2x1bW4ubmFtZX0nLCB7IHVzZVR6OiB0cnVlLCBwcmVjaXNpb246ICR7Y29sdW1uLnByZWNpc2lvbiA/PyAzfSB9KWAsXG4gICAgKTtcbiAgfSBlbHNlIGlmIChjb2x1bW4udHlwZSA9PT0gXCJqc29uXCIpIHtcbiAgICAvLyBqc29uXG4gICAgY2hhaW5zLnB1c2goYGpzb25iKCcke2NvbHVtbi5uYW1lfScpYCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gdHlwZSwgbGVuZ3RoXG4gICAgY2hhaW5zLnB1c2goYCR7Y29sdW1uLnR5cGV9KCcke2NvbHVtbi5uYW1lfScke2NvbHVtbi5sZW5ndGggPyBgLCAke2NvbHVtbi5sZW5ndGh9YCA6IFwiXCJ9KWApO1xuICB9XG5cbiAgLy8gbnVsbGFibGVcbiAgY2hhaW5zLnB1c2goY29sdW1uLm51bGxhYmxlID8gXCJudWxsYWJsZSgpXCIgOiBcIm5vdE51bGxhYmxlKClcIik7XG5cbiAgLy8gZGVmYXVsdFRvXG4gIGlmIChjb2x1bW4uZGVmYXVsdFRvICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAodHlwZW9mIGNvbHVtbi5kZWZhdWx0VG8gPT09IFwic3RyaW5nXCIgJiYgY29sdW1uLmRlZmF1bHRUby5zdGFydHNXaXRoKGBcImApKSB7XG4gICAgICBjaGFpbnMucHVzaChgZGVmYXVsdFRvKCR7Y29sdW1uLmRlZmF1bHRUb30pYCk7XG4gICAgfSBlbHNlIGlmIChjb2x1bW4udHlwZSA9PT0gXCJqc29uXCIgJiYgdHlwZW9mIGNvbHVtbi5kZWZhdWx0VG8uc3RhcnRzV2l0aCgnXCInKSkge1xuICAgICAgY2hhaW5zLnB1c2goYGRlZmF1bHRUbyhrbmV4LnJhdyhcIiR7Y29sdW1uLmRlZmF1bHRUby5yZXBsYWNlQWxsKCdcIicsIFwiJ1wiKX06Ompzb25iXCIpKWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjaGFpbnMucHVzaChgZGVmYXVsdFRvKGtuZXgucmF3KCcke2NvbHVtbi5kZWZhdWx0VG99JykpYCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGB0YWJsZS4ke2NoYWlucy5qb2luKFwiLlwiKX07YDtcbn1cblxuLyoqXG4gKiBNaWdyYXRpb25Db2x1bW7snZgg7YOA7J6F7J2EIFBvc3RncmVTUUwg7YOA7J6FIOusuOyekOyXtOuhnCDrs4DtmZhcbiAqL1xuZnVuY3Rpb24gZ2V0UGdUeXBlRm9yQ29sdW1uKGNvbHVtbjogTWlncmF0aW9uQ29sdW1uKTogc3RyaW5nIHtcbiAgaWYgKGNvbHVtbi50eXBlLmVuZHNXaXRoKFwiW11cIikpIHtcbiAgICBjb25zdCBlbGVtZW50VHlwZSA9IGNvbHVtbi50eXBlLnNsaWNlKDAsIC0yKTtcbiAgICByZXR1cm4gZ2V0UGdBcnJheVR5cGUoY29sdW1uLCBlbGVtZW50VHlwZSk7XG4gIH1cblxuICBzd2l0Y2ggKGNvbHVtbi50eXBlKSB7XG4gICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgcmV0dXJuIGNvbHVtbi5sZW5ndGggIT09IHVuZGVmaW5lZCA/IGB2YXJjaGFyKCR7Y29sdW1uLmxlbmd0aH0pYCA6IFwidGV4dFwiO1xuICAgIGNhc2UgXCJiaWdJbnRlZ2VyXCI6XG4gICAgICByZXR1cm4gXCJiaWdpbnRcIjtcbiAgICBjYXNlIFwibnVtYmVyT3JOdW1lcmljXCI6XG4gICAgICBpZiAoY29sdW1uLm51bWJlclR5cGUgPT09IFwicmVhbFwiKSByZXR1cm4gXCJyZWFsXCI7XG4gICAgICBpZiAoY29sdW1uLm51bWJlclR5cGUgPT09IFwiZG91YmxlIHByZWNpc2lvblwiKSByZXR1cm4gXCJkb3VibGUgcHJlY2lzaW9uXCI7XG4gICAgICByZXR1cm4gYG51bWVyaWMoJHtjb2x1bW4ucHJlY2lzaW9ufSwgJHtjb2x1bW4uc2NhbGV9KWA7XG4gICAgY2FzZSBcImRhdGVcIjpcbiAgICAgIHJldHVybiBcInRpbWVzdGFtcHR6XCI7XG4gICAgY2FzZSBcImpzb25cIjpcbiAgICAgIHJldHVybiBcImpzb25iXCI7XG4gICAgY2FzZSBcInZlY3RvclwiOlxuICAgICAgcmV0dXJuIGB2ZWN0b3IoJHtjb2x1bW4uZGltZW5zaW9uc30pYDtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGNvbHVtbi50eXBlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFBnQXJyYXlUeXBlKGNvbHVtbjogTWlncmF0aW9uQ29sdW1uLCBlbGVtZW50VHlwZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKGVsZW1lbnRUeXBlID09PSBcIm51bWJlck9yTnVtZXJpY1wiKSB7XG4gICAgaWYgKGNvbHVtbi5udW1iZXJUeXBlID09PSBcInJlYWxcIikgcmV0dXJuIFwicmVhbFtdXCI7XG4gICAgaWYgKGNvbHVtbi5udW1iZXJUeXBlID09PSBcImRvdWJsZSBwcmVjaXNpb25cIikgcmV0dXJuIFwiZG91YmxlIHByZWNpc2lvbltdXCI7XG4gICAgcmV0dXJuIGBudW1lcmljKCR7Y29sdW1uLnByZWNpc2lvbn0sICR7Y29sdW1uLnNjYWxlfSlbXWA7XG4gIH1cbiAgaWYgKGVsZW1lbnRUeXBlID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIGNvbHVtbi5sZW5ndGggPyBgdmFyY2hhcigke2NvbHVtbi5sZW5ndGh9KVtdYCA6IFwidGV4dFtdXCI7XG4gIH1cbiAgaWYgKGVsZW1lbnRUeXBlID09PSBcImRhdGVcIikgcmV0dXJuIFwidGltZXN0YW1wdHpbXVwiO1xuICBpZiAoZWxlbWVudFR5cGUgPT09IFwiaW50ZWdlclwiKSByZXR1cm4gXCJpbnRlZ2VyW11cIjtcbiAgaWYgKGVsZW1lbnRUeXBlID09PSBcImJpZ0ludGVnZXJcIikgcmV0dXJuIFwiYmlnaW50W11cIjtcbiAgaWYgKGVsZW1lbnRUeXBlID09PSBcImJvb2xlYW5cIikgcmV0dXJuIFwiYm9vbGVhbltdXCI7XG4gIGlmIChlbGVtZW50VHlwZSA9PT0gXCJ1dWlkXCIpIHJldHVybiBcInV1aWRbXVwiO1xuICBpZiAoZWxlbWVudFR5cGUgPT09IFwiZW51bVwiKSByZXR1cm4gXCJ0ZXh0W11cIjtcbiAgaWYgKGVsZW1lbnRUeXBlID09PSBcInZlY3RvclwiKSByZXR1cm4gYHZlY3Rvcigke2NvbHVtbi5kaW1lbnNpb25zfSlbXWA7XG5cbiAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGFycmF5IGVsZW1lbnQgdHlwZTogJHtlbGVtZW50VHlwZX1gKTtcbn1cblxuLyoqXG4gKiDqsJzrs4Qg7J24642x7IqkIOygleydmCDsg53shLFcbiAqL1xuZnVuY3Rpb24gZ2VuSW5kZXhEZWZpbml0aW9uKGluZGV4OiBNaWdyYXRpb25JbmRleCwgdGFibGU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChpbmRleC50eXBlID09PSBcImhuc3dcIiB8fCBpbmRleC50eXBlID09PSBcIml2ZmZsYXRcIikge1xuICAgIHJldHVybiBnZW5WZWN0b3JJbmRleERlZmluaXRpb24oaW5kZXgsIHRhYmxlKTtcbiAgfVxuXG4gIGlmIChpbmRleC51c2luZyA9PT0gXCJwZ3Jvb25nYVwiKSB7XG4gICAgcmV0dXJuIGdlblBncm9vbmdhSW5kZXhEZWZpbml0aW9uKGluZGV4LCB0YWJsZSk7XG4gIH1cblxuICBjb25zdCBtZXRob2RNYXAgPSB7XG4gICAgaW5kZXg6IFwiSU5ERVhcIixcbiAgICB1bmlxdWU6IFwiVU5JUVVFIElOREVYXCIsXG4gIH07XG5cbiAgY29uc3QgbnVsbHNOb3REaXN0aW5jdENsYXVzZSA9XG4gICAgaW5kZXgudHlwZSA9PT0gXCJ1bmlxdWVcIiAmJiBpbmRleC5udWxsc05vdERpc3RpbmN0ICE9PSB1bmRlZmluZWRcbiAgICAgID8gYCBOVUxMUyAke2luZGV4Lm51bGxzTm90RGlzdGluY3QgPyBcIk5PVCBESVNUSU5DVFwiIDogXCJESVNUSU5DVFwifWBcbiAgICAgIDogXCJcIjtcblxuICBjb25zdCB1c2luZ0NsYXVzZSA9IGluZGV4LnVzaW5nID09PSB1bmRlZmluZWQgPyBcIlwiIDogYFVTSU5HICR7aW5kZXgudXNpbmd9YDtcbiAgY29uc3Qgd2hlcmVDbGF1c2UgPSBnZXRJbmRleFdoZXJlQ2xhdXNlKGluZGV4KTtcblxuICByZXR1cm4gYGF3YWl0IGtuZXgucmF3KFxuICBcXGBDUkVBVEUgJHttZXRob2RNYXBbaW5kZXgudHlwZV19ICR7aW5kZXgubmFtZX0gT04gJHt0YWJsZX0gJHt1c2luZ0NsYXVzZX0oJHtpbmRleC5jb2x1bW5zXG4gICAgLm1hcCgoY29sKSA9PiB7XG4gICAgICBjb25zdCBvcGNsYXNzQ2xhdXNlID0gKCgpID0+IHtcbiAgICAgICAgY29uc3Qgb3BjbGFzcyA9IGdldEluZGV4Q29sdW1uT3BjbGFzcyhjb2wpO1xuICAgICAgICByZXR1cm4gb3BjbGFzcyA/IGAgJHtvcGNsYXNzfWAgOiBcIlwiO1xuICAgICAgfSkoKTtcblxuICAgICAgLy8g7KCV66CsIOyYteyFmOydgCBidHJlZeunjCDsgqzsmqkg6rCA64qlXG4gICAgICBpZiAoaW5kZXgudXNpbmcgIT09IFwiYnRyZWVcIiAmJiBpbmRleC51c2luZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBgJHtjb2wubmFtZX0ke29wY2xhc3NDbGF1c2V9YDtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc29ydE9yZGVyQ2xhdXNlID0gY29sLnNvcnRPcmRlciA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IGAgJHtjb2wuc29ydE9yZGVyfWA7XG4gICAgICBjb25zdCBudWxsc0ZpcnN0Q2xhdXNlID1cbiAgICAgICAgY29sLm51bGxzRmlyc3QgPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBgIE5VTExTICR7Y29sLm51bGxzRmlyc3QgPyBcIkZJUlNUXCIgOiBcIkxBU1RcIn1gO1xuICAgICAgcmV0dXJuIGAke2NvbC5uYW1lfSR7b3BjbGFzc0NsYXVzZX0ke3NvcnRPcmRlckNsYXVzZX0ke251bGxzRmlyc3RDbGF1c2V9YDtcbiAgICB9KVxuICAgIC5qb2luKFwiLCBcIil9KSR7bnVsbHNOb3REaXN0aW5jdENsYXVzZX0ke3doZXJlQ2xhdXNlfTtcXGBcbiAgKTtgO1xufVxuXG5mdW5jdGlvbiBnZW5QZ3Jvb25nYUluZGV4RGVmaW5pdGlvbihpbmRleDogTWlncmF0aW9uSW5kZXgsIHRhYmxlOiBzdHJpbmcpIHtcbiAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXRCeVRhYmxlKHRhYmxlKTtcbiAgY29uc3Qgd2hlcmVDbGF1c2UgPSBnZXRJbmRleFdoZXJlQ2xhdXNlKGluZGV4KTtcblxuICAvLyDrs7Xtlakg7J24642x7Iqk7J24IOqyveyasCBBUlJBWSDsgqzsmqlcbiAgY29uc3QgY29sdW1uQ2xhdXNlID0gKCgpID0+IHtcbiAgICBpZiAoaW5kZXguY29sdW1ucy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IGNvbHVtbiA9IGVudGl0eS5wcm9wc0RpY3RbaW5kZXguY29sdW1uc1swXS5uYW1lXTtcbiAgICAgIGNvbnN0IG9wdGlvbiA9IGdldFBncm9vbmdhQ29sdW1uT3B0aW9uKGNvbHVtbik7XG4gICAgICByZXR1cm4gYCR7aW5kZXguY29sdW1uc1swXS5uYW1lfSR7b3B0aW9uID8gYCAke29wdGlvbn1gIDogXCJcIn1gO1xuICAgIH1cblxuICAgIHJldHVybiBgKEFSUkFZWyR7aW5kZXguY29sdW1ucy5tYXAoKGNvbCkgPT4gYCR7Y29sLm5hbWV9Ojp0ZXh0YCkuam9pbihcIixcIil9XSlgO1xuICB9KSgpO1xuXG4gIHJldHVybiBgYXdhaXQga25leC5yYXcoXG4gIFxcYENSRUFURSBJTkRFWCAke2luZGV4Lm5hbWV9IE9OICR7dGFibGV9IFVTSU5HIHBncm9vbmdhICgke2NvbHVtbkNsYXVzZX0pIFdJVEggKHRva2VuaXplcj0nVG9rZW5NZWNhYicpJHt3aGVyZUNsYXVzZX07XFxgXG4gIClgO1xufVxuXG4vKipcbiAqIFBHcm9vbmdhIOy7rOufvCDsmLXshZgg7LaU7LacXG4gKlxuICogRnVsbFRleHQg7Jik7Y2866CI7J207YSw66W8IOyngOybkO2VmOuKlCDqsr3smrAg7Jqw7ISgIOyEpOyglSwg64KY66i47KeA64qUIOuUlO2PtO2KuCDsnbTsmqlcbiAqIEBsaW5rIGh0dHBzOi8vcGdyb29uZ2EuZ2l0aHViLmlvL3JlZmVyZW5jZVxuICovXG5mdW5jdGlvbiBnZXRQZ3Jvb25nYUNvbHVtbk9wdGlvbihjb2x1bW46IEVudGl0eVByb3ApIHtcbiAgaWYgKGNvbHVtbi50eXBlID09PSBcInN0cmluZ1wiICYmIGNvbHVtbi5sZW5ndGggIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBcInBncm9vbmdhX3ZhcmNoYXJfZnVsbF90ZXh0X3NlYXJjaF9vcHNfdjJcIjtcbiAgfSBlbHNlIGlmIChjb2x1bW4udHlwZSA9PT0gXCJqc29uXCIpIHtcbiAgICByZXR1cm4gXCJwZ3Jvb25nYV9qc29uYl9mdWxsX3RleHRfc2VhcmNoX29wc192MlwiO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICogLSBITlNXIChIaWVyYXJjaGljYWwgTmF2aWdhYmxlIFNtYWxsIFdvcmxkKTog64qQ66awIOu5jOuTnCwg67mg66W4IOqygOyDiSDsho3rj4QsIOuGkuydgCDrqZTrqqjrpqwg67CPIOygle2ZleuPhFxuICogLSBJVkZGbGF0IChJbnZlcnRlZCBGaWxlIHdpdGggRmxhdCBDb21wcmVzc2lvbik6IOu5oOuluCDruYzrk5wsIOykkeqwhCDqsoDsg4kg7IaN64+ELCDrgq7snYAg66mU66qo66asXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEhOU1cg7J24642x7IqkICjqtozsnqUgLSDruaDrpbgg6rKA7IOJLCDrhpLsnYAg7KCV7ZmV64+EKVxuICogQ1JFQVRFIElOREVYIGlkeF9lbWJlZGRpbmcgT04gaXRlbXMgVVNJTkcgaG5zdyAoZW1iZWRkaW5nIHZlY3Rvcl9jb3NpbmVfb3BzKSBXSVRIIChtID0gMTYsIGVmX2NvbnN0cnVjdGlvbiA9IDY0KTtcbiAqXG4gKiAvLyBJVkZGbGF0IOyduOuNseyKpCAo64yA7Jqp65+JIOuNsOydtO2EsCwg67mE7JqpIOykkeyalCDsi5wpXG4gKiBDUkVBVEUgSU5ERVggaWR4X2VtYmVkZGluZyBPTiBpdGVtcyBVU0lORyBpdmZmbGF0IChlbWJlZGRpbmcgdmVjdG9yX2Nvc2luZV9vcHMpIFdJVEggKGxpc3RzID0gMTAwKTtcbiAqL1xuZnVuY3Rpb24gZ2VuVmVjdG9ySW5kZXhEZWZpbml0aW9uKGluZGV4OiBNaWdyYXRpb25JbmRleCwgdGFibGU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGNvbHVtbiA9IGluZGV4LmNvbHVtbnNbMF07XG4gIGNvbnN0IHZlY3Rvck9wcyA9IGdldEluZGV4Q29sdW1uT3BjbGFzcyhjb2x1bW4pID8/IFwidmVjdG9yX2Nvc2luZV9vcHNcIjtcbiAgY29uc3Qgd2hlcmVDbGF1c2UgPSBnZXRJbmRleFdoZXJlQ2xhdXNlKGluZGV4KTtcblxuICAvLyBITlNXIChIaWVyYXJjaGljYWwgTmF2aWdhYmxlIFNtYWxsIFdvcmxkKSAtIOq2jOyepTog67mg66W4IOqygOyDiSwg64aS7J2AIOygle2ZleuPhFxuICBpZiAoaW5kZXgudHlwZSA9PT0gXCJobnN3XCIpIHtcbiAgICBjb25zdCBtID0gaW5kZXgubSA/PyAxNjtcbiAgICBjb25zdCBlZkNvbnN0cnVjdGlvbiA9IGluZGV4LmVmQ29uc3RydWN0aW9uID8/IDY0O1xuICAgIHJldHVybiBgYXdhaXQga25leC5yYXcoXFxgQ1JFQVRFIElOREVYICR7aW5kZXgubmFtZX0gT04gJHt0YWJsZX0gVVNJTkcgaG5zdyAoJHtjb2x1bW4ubmFtZX0gJHt2ZWN0b3JPcHN9KSBXSVRIIChtID0gJHttfSwgZWZfY29uc3RydWN0aW9uID0gJHtlZkNvbnN0cnVjdGlvbn0pJHt3aGVyZUNsYXVzZX1cXGApO2A7XG4gIH1cblxuICAvLyBJVkZGbGF0IChJbnZlcnRlZCBGaWxlIHdpdGggRmxhdCBDb21wcmVzc2lvbikgLSDrjIDsmqnrn4ksIOu5hOyaqSDspJHsmpQg7IucXG4gIGlmIChpbmRleC50eXBlID09PSBcIml2ZmZsYXRcIikge1xuICAgIGNvbnN0IGxpc3RzID0gaW5kZXgubGlzdHMgPz8gMTAwO1xuICAgIHJldHVybiBgYXdhaXQga25leC5yYXcoXFxgQ1JFQVRFIElOREVYICR7aW5kZXgubmFtZX0gT04gJHt0YWJsZX0gVVNJTkcgaXZmZmxhdCAoJHtjb2x1bW4ubmFtZX0gJHt2ZWN0b3JPcHN9KSBXSVRIIChsaXN0cyA9ICR7bGlzdHN9KSR7d2hlcmVDbGF1c2V9XFxgKTtgO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHJhdyBTUUwgaW5kZXggdHlwZTogJHtpbmRleC50eXBlfWApO1xufVxuXG5mdW5jdGlvbiBnZXRJbmRleFdoZXJlQ2xhdXNlKGluZGV4OiBNaWdyYXRpb25JbmRleCk6IHN0cmluZyB7XG4gIGNvbnN0IHdoZXJlID0gbm9ybWFsaXplSW5kZXhXaGVyZVByZWRpY2F0ZShpbmRleC53aGVyZSk7XG4gIHJldHVybiB3aGVyZSA/IGAgV0hFUkUgJHt3aGVyZX1gIDogXCJcIjtcbn1cblxuLyoqXG4gKiDthYzsnbTruJQg7IOd7ISx7ZWY64qUIOy8gOydtOyKpCAtIEZLIOyDneyEsVxuICovXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUNyZWF0ZUNvZGVfRm9yZWlnbihcbiAgdGFibGU6IHN0cmluZyxcbiAgZm9yZWlnbnM6IE1pZ3JhdGlvbkZvcmVpZ25bXSxcbik6IFByb21pc2U8R2VuTWlncmF0aW9uQ29kZVtdPiB7XG4gIGlmIChmb3JlaWducy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCB7IHVwLCBkb3duIH0gPSBnZW5Gb3JlaWduRGVmaW5pdGlvbnModGFibGUsIGZvcmVpZ25zKTtcbiAgaWYgKHVwLmxlbmd0aCA9PT0gMCAmJiBkb3duLmxlbmd0aCA9PT0gMCkge1xuICAgIC8vIGZvcmVpZ25z6rCAIOyeiOuKlOuNsCDsg53shLHrkJwg7L2U65Oc6rCAIOyXhuuKlCDqsr3smrDripQg67mE7KCV7IOB7KCB7J24IOyDge2ZqeydtOyngOunjCxcbiAgICAvLyDrp4jsnbTqt7jroIjsnbTshZgg7IOd7ISx7J2EIOykkeuLqOyLnO2CpOyngCDslYrqs6Ag67mIIOuwsOyXtOydhCDrsJjtmZjtlanri4jri6QuXG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW1xuICAgICdpbXBvcnQgdHlwZSB7IEtuZXggfSBmcm9tIFwia25leFwiOycsXG4gICAgXCJcIixcbiAgICBcImV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cChrbmV4OiBLbmV4KTogUHJvbWlzZTx2b2lkPiB7XCIsXG4gICAgYHJldHVybiBrbmV4LnNjaGVtYS5hbHRlclRhYmxlKFwiJHt0YWJsZX1cIiwgKHRhYmxlKSA9PiB7YCxcbiAgICBcIi8vIGNyZWF0ZSBma1wiLFxuICAgIC4uLnVwLFxuICAgIFwifSk7XCIsXG4gICAgXCJ9XCIsXG4gICAgXCJcIixcbiAgICBcImV4cG9ydCBhc3luYyBmdW5jdGlvbiBkb3duKGtuZXg6IEtuZXgpOiBQcm9taXNlPHZvaWQ+IHtcIixcbiAgICBgcmV0dXJuIGtuZXguc2NoZW1hLmFsdGVyVGFibGUoXCIke3RhYmxlfVwiLCAodGFibGUpID0+IHtgLFxuICAgIFwiLy8gZHJvcCBma1wiLFxuICAgIC4uLmRvd24sXG4gICAgXCJ9KTtcIixcbiAgICBcIn1cIixcbiAgXTtcblxuICBjb25zdCBmb3JlaWduS2V5c1N0cmluZyA9IGZvcmVpZ25zLm1hcCgoZm9yZWlnbikgPT4gZm9yZWlnbi5jb2x1bW5zLmpvaW4oXCJfXCIpKS5qb2luKFwiX1wiKTtcbiAgcmV0dXJuIFtcbiAgICB7XG4gICAgICB0YWJsZSxcbiAgICAgIHR5cGU6IFwiZm9yZWlnblwiLFxuICAgICAgdGl0bGU6IGBmb3JlaWduX18ke3RhYmxlfV9fJHtmb3JlaWduS2V5c1N0cmluZ31gLFxuICAgICAgZm9ybWF0dGVkOiBhd2FpdCBmb3JtYXRDb2RlKGxpbmVzLmpvaW4oXCJcXG5cIiksIGBzcmMvbWlncmF0aW9uLyR7dGFibGV9LnRzYCksXG4gICAgfSxcbiAgXTtcbn1cblxuLyoqXG4gKiBNaWdyYXRpb25Gb3JlaWduW10g7J297Ja07IScIOyZuOu2gO2CpCBjb25zdHJhaW50IOygleydmO2VmOuKlCDqtazrrLgg7IOd7ISxXG4gKi9cbmZ1bmN0aW9uIGdlbkZvcmVpZ25EZWZpbml0aW9ucyhcbiAgdGFibGU6IHN0cmluZyxcbiAgZm9yZWlnbnM6IE1pZ3JhdGlvbkZvcmVpZ25bXSxcbik6IHsgdXA6IHN0cmluZ1tdOyBkb3duOiBzdHJpbmdbXSB9IHtcbiAgcmV0dXJuIGZvcmVpZ25zLnJlZHVjZShcbiAgICAociwgZm9yZWlnbikgPT4ge1xuICAgICAgY29uc3QgY29sdW1uc1N0cmluZ1F1b3RlID0gZm9yZWlnbi5jb2x1bW5zXG4gICAgICAgIC5tYXAoKGNvbCkgPT4gYCcke2NvbC5yZXBsYWNlKGAke3RhYmxlfS5gLCBcIlwiKX0nYClcbiAgICAgICAgLmpvaW4oXCIsXCIpO1xuICAgICAgci51cC5wdXNoKFxuICAgICAgICBgdGFibGUuZm9yZWlnbignJHtmb3JlaWduLmNvbHVtbnMuam9pbihcIixcIil9JylcbiAgICAgICAgICAgIC5yZWZlcmVuY2VzKCcke2ZvcmVpZ24udG99JylcbiAgICAgICAgICAgIC5vblVwZGF0ZSgnJHtmb3JlaWduLm9uVXBkYXRlfScpXG4gICAgICAgICAgICAub25EZWxldGUoJyR7Zm9yZWlnbi5vbkRlbGV0ZX0nKWAsXG4gICAgICApO1xuICAgICAgci5kb3duLnB1c2goYHRhYmxlLmRyb3BGb3JlaWduKFske2NvbHVtbnNTdHJpbmdRdW90ZX1dKWApO1xuICAgICAgcmV0dXJuIHI7XG4gICAgfSxcbiAgICB7XG4gICAgICB1cDogW10gYXMgc3RyaW5nW10sXG4gICAgICBkb3duOiBbXSBhcyBzdHJpbmdbXSxcbiAgICB9LFxuICApO1xufVxuXG4vKipcbiAqIO2FjOydtOu4lCDrs4Dqsr0g7LyA7J207IqkIC0g7Lus65+8L+yduOuNseyKpCDrs4Dqsr1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVBbHRlckNvZGVfQ29sdW1uQW5kSW5kZXhlcyhcbiAgdGFibGU6IHN0cmluZyxcbiAgZW50aXR5Q29sdW1uczogTWlncmF0aW9uQ29sdW1uW10sXG4gIGVudGl0eUluZGV4ZXM6IE1pZ3JhdGlvbkluZGV4W10sXG4gIGRiQ29sdW1uczogTWlncmF0aW9uQ29sdW1uW10sXG4gIGRiSW5kZXhlczogTWlncmF0aW9uSW5kZXhbXSxcbiAgZGJGb3JlaWduczogTWlncmF0aW9uRm9yZWlnbltdLFxuICBjb21wYXJlREI/OiBLbmV4LFxuKTogUHJvbWlzZTxHZW5NaWdyYXRpb25Db2RlW10+IHtcbiAgY29uc3QgcmVzb2x2ZWRFbnRpdHlDb2x1bW5zID0gcmVzb2x2ZVNlYXJjaFRleHRDb2x1bW5zKHRhYmxlLCBlbnRpdHlDb2x1bW5zKTtcbiAgY29uc3Qgc2VhcmNoVGV4dENvbHVtbk5hbWVzID0gZ2V0U2VhcmNoVGV4dENvbHVtbk5hbWVzKHRhYmxlKTtcbiAgLypcbiAgICDshLjrtoAg67mE6rWQIO2bhCDri6TrpbjsoJAg7LC+7JWE7IScIOy9lOuTnCDsg53shLFcblxuICAgIDEuIOy7rOufvOqwr+yImCDri6TrpoQ6IE1E7JeQIOyeiOycvOuCmCwgRELsl5Ag7JeG64uk66m0IOy2lOqwgFxuICAgIDIuIOy7rOufvOqwr+yImCDri6TrpoQ6IE1E7JeQIOyXhuycvOuCmCwgRELsl5Ag7J6I64uk66m0IOyCreygnFxuICAgIDMuIOq3uOyZuCDsu6zrn7wo7Lus65+8IOqwr+yImOqwgCDrj5nsnbztlZjqsbDrgpgsIOuLpOuluCDqsr3smrAg64+Z7J287ZWcIOy7rOufvOuBvOumrCkgPT4gYWx0ZXJcbiAgICA0LiDri6TrpbjqsbAg64ukIOuPmeydvO2VmOqzoCBpbmRleOunjCDrs4Dqsr3rkJjripQg6rK97JqwXG5cbiAgICAqKiDsu6zrn7zrqoXsnYQg67OA6rK97ZWY64qUIOqyveyasOuKlCDrlLDroZwg7ZW465Ok66eB7ZWY7KeAIOyViuydjFxuICAgID0+IGRyb3AvYWRkIO2Yle2DnOydmCDrp4jsnbTqt7jroIjsnbTshZgg7L2U65Oc6rCAIOyDneyEseuQmOuKlOuNsCwg7IiY64+Z7Jy866GcIHJlbmFtZSDsvZTrk5zroZwg7IiY7KCV7ZWY7JesIOyymOumrFxuICAqL1xuXG4gIC8vIFBLKGlkKSDsu6zrn7wg7YOA7J6FIOuzgOqyvSDqsJDsp4Ag67CPIOyymOumrFxuICBjb25zdCBlbnRpdHlJZENvbCA9IHJlc29sdmVkRW50aXR5Q29sdW1ucy5maW5kKChjb2wpID0+IGNvbC5uYW1lID09PSBcImlkXCIpO1xuICBjb25zdCBkYklkQ29sID0gZGJDb2x1bW5zLmZpbmQoKGNvbCkgPT4gY29sLm5hbWUgPT09IFwiaWRcIik7XG5cbiAgaWYgKGVudGl0eUlkQ29sICYmIGRiSWRDb2wgJiYgY29tcGFyZURCKSB7XG4gICAgY29uc3QgaXNQa1R5cGVDaGFuZ2VkID1cbiAgICAgIGVudGl0eUlkQ29sLnR5cGUgIT09IGRiSWRDb2wudHlwZSB8fCBlbnRpdHlJZENvbC5sZW5ndGggIT09IGRiSWRDb2wubGVuZ3RoO1xuXG4gICAgaWYgKGlzUGtUeXBlQ2hhbmdlZCkge1xuICAgICAgcmV0dXJuIGdlbmVyYXRlUGtUeXBlQ2hhbmdlTWlncmF0aW9uKFxuICAgICAgICB0YWJsZSxcbiAgICAgICAgZW50aXR5SWRDb2wsXG4gICAgICAgIGRiSWRDb2wsXG4gICAgICAgIHJlc29sdmVkRW50aXR5Q29sdW1ucyxcbiAgICAgICAgZW50aXR5SW5kZXhlcyxcbiAgICAgICAgZGJDb2x1bW5zLFxuICAgICAgICBkYkluZGV4ZXMsXG4gICAgICAgIGRiRm9yZWlnbnMsXG4gICAgICAgIGNvbXBhcmVEQixcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLy8g6rCBIOy7rOufvCDsnbTrpoQg6riw7KSA7Jy866GcIGFkZCwgZHJvcCwgYWx0ZXIg7Jes67aAIO2ZleyduFxuICBjb25zdCBhbHRlckNvbHVtbnNUbyA9IGdldEFsdGVyQ29sdW1uc1RvKHJlc29sdmVkRW50aXR5Q29sdW1ucywgZGJDb2x1bW5zLCBzZWFyY2hUZXh0Q29sdW1uTmFtZXMpO1xuXG4gIC8vIOy2lOy2nOuQnCDsu6zrn7zrk6TsnYQg6riw7KSA7Jy866GcIOqwgeqwgSDrnbzsnbgg7IOd7ISxXG4gIGNvbnN0IGFsdGVyQ29sdW1uTGluZXNUbyA9IGdldEFsdGVyQ29sdW1uTGluZXNUbyhcbiAgICBhbHRlckNvbHVtbnNUbyxcbiAgICByZXNvbHZlZEVudGl0eUNvbHVtbnMsXG4gICAgdGFibGUsXG4gICAgZGJGb3JlaWducyxcbiAgKTtcblxuICAvLyDsnbjrjbHsiqTsnZggYWRkLCBkcm9wIOyXrOu2gCDtmZXsnbhcbiAgY29uc3QgYWx0ZXJJbmRleGVzVG8gPSBnZXRBbHRlckluZGV4ZXNUbyhlbnRpdHlJbmRleGVzLCBkYkluZGV4ZXMpO1xuICBjb25zdCByZWNyZWF0ZWRTZWFyY2hUZXh0Q29sdW1uTmFtZXMgPSBuZXcgU2V0KFxuICAgIGFsdGVyQ29sdW1uc1RvLmFsdGVyXG4gICAgICAuZmlsdGVyKChkYkNvbHVtbikgPT4ge1xuICAgICAgICBjb25zdCBlbnRpdHlDb2x1bW4gPSByZXNvbHZlZEVudGl0eUNvbHVtbnMuZmluZCgoY29sKSA9PiBjb2wubmFtZSA9PT0gZGJDb2x1bW4ubmFtZSk7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgc2VhcmNoVGV4dENvbHVtbk5hbWVzLmhhcyhkYkNvbHVtbi5uYW1lKSAmJlxuICAgICAgICAgIGRiQ29sdW1uLmdlbmVyYXRlZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgZW50aXR5Q29sdW1uPy5nZW5lcmF0ZWQgIT09IHVuZGVmaW5lZFxuICAgICAgICApO1xuICAgICAgfSlcbiAgICAgIC5tYXAoKGNvbHVtbikgPT4gY29sdW1uLm5hbWUpLFxuICApO1xuICBjb25zdCByZWNyZWF0ZWRTZWFyY2hUZXh0RGJJbmRleGVzID0gZGJJbmRleGVzLmZpbHRlcihcbiAgICAoaW5kZXgpID0+XG4gICAgICBpbmRleC5jb2x1bW5zLnNvbWUoKHsgbmFtZSB9KSA9PiByZWNyZWF0ZWRTZWFyY2hUZXh0Q29sdW1uTmFtZXMuaGFzKG5hbWUpKSAmJlxuICAgICAgIWFsdGVySW5kZXhlc1RvLmRyb3Auc29tZSgoZHJvcEluZGV4KSA9PiBkcm9wSW5kZXgubmFtZSA9PT0gaW5kZXgubmFtZSksXG4gICk7XG4gIGNvbnN0IHJlY3JlYXRlZFNlYXJjaFRleHRFbnRpdHlJbmRleGVzID0gZW50aXR5SW5kZXhlcy5maWx0ZXIoXG4gICAgKGluZGV4KSA9PlxuICAgICAgaW5kZXguY29sdW1ucy5zb21lKCh7IG5hbWUgfSkgPT4gcmVjcmVhdGVkU2VhcmNoVGV4dENvbHVtbk5hbWVzLmhhcyhuYW1lKSkgJiZcbiAgICAgICFhbHRlckluZGV4ZXNUby5hZGQuc29tZSgoYWRkSW5kZXgpID0+IGFkZEluZGV4Lm5hbWUgPT09IGluZGV4Lm5hbWUpLFxuICApO1xuICBjb25zdCBpbXBsaWNpdGx5RHJvcHBlZERiSW5kZXhlcyA9IGFsdGVySW5kZXhlc1RvLmRyb3AuZmlsdGVyKChpbmRleCkgPT5cbiAgICBpbmRleC5jb2x1bW5zLmV2ZXJ5KCh7IG5hbWUgfSkgPT4gYWx0ZXJDb2x1bW5zVG8uZHJvcC5zb21lKChjb2x1bW4pID0+IGNvbHVtbi5uYW1lID09PSBuYW1lKSksXG4gICk7XG5cbiAgLy8g7J24642x7Iqk6rCAIOyCreygnOuQmOuKlCDqsr3smrAsIOy7rOufvOqzvCDqsJnsnbQg7IKt7KCc65CcIOy8gOydtOyKpOyXkOuKlCBkcm9w7JeQ7IScIOygnOyZuO2VtOyVvO2VqCFcbiAgY29uc3QgaW5kZXhOZWVkc1RvRHJvcCA9IGFsdGVySW5kZXhlc1RvLmRyb3AuZmlsdGVyKFxuICAgIChpbmRleCkgPT4gIWltcGxpY2l0bHlEcm9wcGVkRGJJbmRleGVzLnNvbWUoKGRyb3BwZWRJbmRleCkgPT4gZHJvcHBlZEluZGV4Lm5hbWUgPT09IGluZGV4Lm5hbWUpLFxuICApO1xuXG4gIC8vIOu5iCDsvZTrk5wg7IOd7ISxIOuwqeyngFxuICBjb25zdCBoYXNVcENoYW5nZXMgPVxuICAgIGFsdGVyQ29sdW1uTGluZXNUby5hZGQudXAuYnVpbGRlci5sZW5ndGggPiAwIHx8XG4gICAgYWx0ZXJDb2x1bW5MaW5lc1RvLmFkZC51cC5yYXcubGVuZ3RoID4gMCB8fFxuICAgIGFsdGVyQ29sdW1uTGluZXNUby5kcm9wLnVwLmJ1aWxkZXIubGVuZ3RoID4gMCB8fFxuICAgIGFsdGVyQ29sdW1uTGluZXNUby5hbHRlci51cC5idWlsZGVyLmxlbmd0aCA+IDAgfHxcbiAgICBhbHRlckNvbHVtbkxpbmVzVG8uYWx0ZXIudXAucmF3Lmxlbmd0aCA+IDAgfHxcbiAgICBhbHRlckluZGV4ZXNUby5hZGQubGVuZ3RoID4gMCB8fFxuICAgIGluZGV4TmVlZHNUb0Ryb3AubGVuZ3RoID4gMCB8fFxuICAgIHJlY3JlYXRlZFNlYXJjaFRleHREYkluZGV4ZXMubGVuZ3RoID4gMDtcbiAgaWYgKCFoYXNVcENoYW5nZXMpIHtcbiAgICAvLyDrs4Dqsr3sgqztla3snbQg7JeG7Jy866m0IOu5iCDrsLDsl7Qg67CY7ZmYXG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIE5haXRlLnQoXCJtaWdyYXRvcjpnZW5lcmF0ZUFsdGVyQ29kZV9Db2x1bW5BbmRJbmRleGVzOmRlYnVnXCIsIHtcbiAgICBcImFsdGVyQ29sdW1uc1RvLmFkZC5sZW5ndGhcIjogYWx0ZXJDb2x1bW5zVG8uYWRkLmxlbmd0aCxcbiAgICBcImFsdGVyQ29sdW1uc1RvLmRyb3AubGVuZ3RoXCI6IGFsdGVyQ29sdW1uc1RvLmRyb3AubGVuZ3RoLFxuICAgIFwiYWx0ZXJDb2x1bW5zVG8uYWx0ZXIubGVuZ3RoXCI6IGFsdGVyQ29sdW1uc1RvLmFsdGVyLmxlbmd0aCxcbiAgICBcImFsdGVySW5kZXhlc1RvLmFkZC5sZW5ndGhcIjogYWx0ZXJJbmRleGVzVG8uYWRkLmxlbmd0aCxcbiAgICBcImFsdGVySW5kZXhlc1RvLmRyb3AubGVuZ3RoXCI6IGFsdGVySW5kZXhlc1RvLmRyb3AubGVuZ3RoLFxuICAgIFwiaW5kZXhOZWVkc1RvRHJvcC5sZW5ndGhcIjogaW5kZXhOZWVkc1RvRHJvcC5sZW5ndGgsXG4gIH0pO1xuICAvLyBOYWl0ZS50KFwibWlncmF0b3I6Z2VuZXJhdGVBbHRlckNvZGVfQ29sdW1uQW5kSW5kZXhlczphbHRlckNvbHVtbnNUb1wiLCBhbHRlckNvbHVtbnNUbyk7XG5cbiAgLy8gVE9ETzog7J24642x7Iqk66qFIOuzgOqyveuQnCDqsr3smrAg7LKY66asXG5cbiAgLy8gdGFibGUgYnVpbGRlciDrqZTshJzrk5zroZwg7Iuk7ZaJ7ZWgIOy9lOuTnCAoZHJvcCDihpIgYWRkIOKGkiBhbHRlciDsiJzshJwpXG4gIGNvbnN0IHVwQnVpbGRlckxpbmVzID0gW1xuICAgIC4uLihhbHRlckNvbHVtbkxpbmVzVG8uZHJvcC51cC5idWlsZGVyLmxlbmd0aCA+IDAgPyBhbHRlckNvbHVtbkxpbmVzVG8uZHJvcC51cC5idWlsZGVyIDogW10pLFxuICAgIC4uLihhbHRlckNvbHVtbkxpbmVzVG8uYWRkLnVwLmJ1aWxkZXIubGVuZ3RoID4gMCA/IGFsdGVyQ29sdW1uTGluZXNUby5hZGQudXAuYnVpbGRlciA6IFtdKSxcbiAgICAuLi5yZWNyZWF0ZWRTZWFyY2hUZXh0RGJJbmRleGVzLm1hcChnZW5JbmRleERyb3BEZWZpbml0aW9uKSxcbiAgICAuLi4oYWx0ZXJDb2x1bW5MaW5lc1RvLmFsdGVyLnVwLmJ1aWxkZXIubGVuZ3RoID4gMCA/IGFsdGVyQ29sdW1uTGluZXNUby5hbHRlci51cC5idWlsZGVyIDogW10pLFxuICAgIC4uLmluZGV4TmVlZHNUb0Ryb3AubWFwKGdlbkluZGV4RHJvcERlZmluaXRpb24pLFxuICBdO1xuXG4gIC8vIGtuZXgucmF3KCnroZwg7Iuk7ZaJ7ZWgIOy9lOuTnFxuICBjb25zdCB1cFJhd0xpbmVzID0gW1xuICAgIC4uLihhbHRlckNvbHVtbkxpbmVzVG8uYWRkLnVwLnJhdy5sZW5ndGggPiAwID8gYWx0ZXJDb2x1bW5MaW5lc1RvLmFkZC51cC5yYXcgOiBbXSksXG4gICAgLi4uKGFsdGVyQ29sdW1uTGluZXNUby5hbHRlci51cC5yYXcubGVuZ3RoID4gMCA/IGFsdGVyQ29sdW1uTGluZXNUby5hbHRlci51cC5yYXcgOiBbXSksXG4gICAgLi4ucmVjcmVhdGVkU2VhcmNoVGV4dEVudGl0eUluZGV4ZXMubWFwKChpbmRleCkgPT4gZ2VuSW5kZXhEZWZpbml0aW9uKGluZGV4LCB0YWJsZSkpLFxuICAgIC4uLmFsdGVySW5kZXhlc1RvLmFkZC5tYXAoKGluZGV4KSA9PiBnZW5JbmRleERlZmluaXRpb24oaW5kZXgsIHRhYmxlKSksXG4gIF07XG5cbiAgLy8gZG93buydgCB1cOydmCDsl63siJwgKGFkZC5kb3duID0gZHJvcCByb2xsYmFjaywgZHJvcC5kb3duID0gYWRkIHJvbGxiYWNrKVxuICBjb25zdCBkb3duQnVpbGRlckxpbmVzID0gW1xuICAgIC4uLihhbHRlckNvbHVtbkxpbmVzVG8uYWRkLmRvd24uYnVpbGRlci5sZW5ndGggPiAwID8gYWx0ZXJDb2x1bW5MaW5lc1RvLmFkZC5kb3duLmJ1aWxkZXIgOiBbXSksXG4gICAgLi4ucmVjcmVhdGVkU2VhcmNoVGV4dEVudGl0eUluZGV4ZXMubWFwKGdlbkluZGV4RHJvcERlZmluaXRpb24pLFxuICAgIC4uLihhbHRlckNvbHVtbkxpbmVzVG8uYWx0ZXIuZG93bi5idWlsZGVyLmxlbmd0aCA+IDBcbiAgICAgID8gYWx0ZXJDb2x1bW5MaW5lc1RvLmFsdGVyLmRvd24uYnVpbGRlclxuICAgICAgOiBbXSksXG4gICAgLi4uKGFsdGVyQ29sdW1uTGluZXNUby5kcm9wLmRvd24uYnVpbGRlci5sZW5ndGggPiAwXG4gICAgICA/IGFsdGVyQ29sdW1uTGluZXNUby5kcm9wLmRvd24uYnVpbGRlclxuICAgICAgOiBbXSksXG4gICAgLi4uYWx0ZXJJbmRleGVzVG8uYWRkXG4gICAgICAuZmlsdGVyKFxuICAgICAgICAoaW5kZXgpID0+XG4gICAgICAgICAgIWluZGV4LmNvbHVtbnMuZXZlcnkoKGluZGV4Q29sKSA9PlxuICAgICAgICAgICAgYWx0ZXJDb2x1bW5zVG8uYWRkLm1hcCgoY29sKSA9PiBjb2wubmFtZSkuaW5jbHVkZXMoaW5kZXhDb2wubmFtZSksXG4gICAgICAgICAgKSxcbiAgICAgIClcbiAgICAgIC5tYXAoZ2VuSW5kZXhEcm9wRGVmaW5pdGlvbiksXG4gIF07XG5cbiAgY29uc3QgZG93blJhd0xpbmVzID0gW1xuICAgIC4uLihhbHRlckNvbHVtbkxpbmVzVG8uZHJvcC5kb3duLnJhdy5sZW5ndGggPiAwID8gYWx0ZXJDb2x1bW5MaW5lc1RvLmRyb3AuZG93bi5yYXcgOiBbXSksXG4gICAgLi4uKGFsdGVyQ29sdW1uTGluZXNUby5hbHRlci5kb3duLnJhdy5sZW5ndGggPiAwID8gYWx0ZXJDb2x1bW5MaW5lc1RvLmFsdGVyLmRvd24ucmF3IDogW10pLFxuICAgIC4uLnJlY3JlYXRlZFNlYXJjaFRleHREYkluZGV4ZXMubWFwKChpbmRleCkgPT4gZ2VuSW5kZXhEZWZpbml0aW9uKGluZGV4LCB0YWJsZSkpLFxuICAgIC4uLmltcGxpY2l0bHlEcm9wcGVkRGJJbmRleGVzLm1hcCgoaW5kZXgpID0+IGdlbkluZGV4RGVmaW5pdGlvbihpbmRleCwgdGFibGUpKSxcbiAgICAuLi5pbmRleE5lZWRzVG9Ecm9wLm1hcCgoaW5kZXgpID0+IGdlbkluZGV4RGVmaW5pdGlvbihpbmRleCwgdGFibGUpKSxcbiAgXTtcblxuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXG4gICAgJ2ltcG9ydCB0eXBlIHsgS25leCB9IGZyb20gXCJrbmV4XCI7JyxcbiAgICBcIlwiLFxuICAgIFwiZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwKGtuZXg6IEtuZXgpOiBQcm9taXNlPHZvaWQ+IHtcIixcbiAgICAuLi4odXBCdWlsZGVyTGluZXMubGVuZ3RoID4gMFxuICAgICAgPyBbYGF3YWl0IGtuZXguc2NoZW1hLmFsdGVyVGFibGUoXCIke3RhYmxlfVwiLCAodGFibGUpID0+IHtgLCAuLi51cEJ1aWxkZXJMaW5lcywgXCJ9KTtcIl1cbiAgICAgIDogW10pLFxuICAgIC4uLnVwUmF3TGluZXMsXG4gICAgXCJ9XCIsXG4gICAgXCJcIixcbiAgICBcImV4cG9ydCBhc3luYyBmdW5jdGlvbiBkb3duKGtuZXg6IEtuZXgpOiBQcm9taXNlPHZvaWQ+IHtcIixcbiAgICAuLi4oZG93bkJ1aWxkZXJMaW5lcy5sZW5ndGggPiAwXG4gICAgICA/IFtgYXdhaXQga25leC5zY2hlbWEuYWx0ZXJUYWJsZShcIiR7dGFibGV9XCIsICh0YWJsZSkgPT4ge2AsIC4uLmRvd25CdWlsZGVyTGluZXMsIFwifSk7XCJdXG4gICAgICA6IFtdKSxcbiAgICAuLi5kb3duUmF3TGluZXMsXG4gICAgXCJ9XCIsXG4gIF07XG5cbiAgY29uc3QgZm9ybWF0dGVkID0gYXdhaXQgZm9ybWF0Q29kZShsaW5lcy5qb2luKFwiXFxuXCIpLCBgc3JjL21pZ3JhdGlvbi8ke3RhYmxlfS50c2ApO1xuICBjb25zdCB0aXRsZSA9IFtcbiAgICBcImFsdGVyXCIsXG4gICAgdGFibGUsXG4gICAgLi4uKFtcImFkZFwiLCBcImRyb3BcIiwgXCJhbHRlclwiXSBhcyBjb25zdClcbiAgICAgIC5tYXAoKGFjdGlvbikgPT4ge1xuICAgICAgICBjb25zdCBsZW4gPSBhbHRlckNvbHVtbnNUb1thY3Rpb25dLmxlbmd0aDtcbiAgICAgICAgaWYgKGxlbiA+IDApIHtcbiAgICAgICAgICByZXR1cm4gYWN0aW9uICsgbGVuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoKHBhcnQpID0+IHBhcnQgIT09IG51bGwpLFxuICBdLmpvaW4oXCJfXCIpO1xuXG4gIHJldHVybiBbXG4gICAge1xuICAgICAgdGFibGUsXG4gICAgICB0aXRsZSxcbiAgICAgIGZvcm1hdHRlZCxcbiAgICAgIHR5cGU6IFwibm9ybWFsXCIsXG4gICAgfSxcbiAgXTtcbn1cblxuLyoqXG4gKiDsu6zrn7wg67mE6rWQ66W8IOychO2VtCBHZW5lcmF0ZWQgQ29sdW1u7J2YIGV4cHJlc3Npb27snYQg7KCc7Jm47ZWcIOqwneyytOulvCDsg53shLFcbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplQ29sdW1uRm9yQ29tcGFyaXNvbihcbiAgY29sOiBNaWdyYXRpb25Db2x1bW4sXG4gIHNlYXJjaFRleHRDb2x1bW5OYW1lczogU2V0PHN0cmluZz4sXG4pOiBNaWdyYXRpb25Db2x1bW4ge1xuICBpZiAoIWNvbC5nZW5lcmF0ZWQpIHtcbiAgICByZXR1cm4gY29sO1xuICB9XG5cbiAgaWYgKCFzZWFyY2hUZXh0Q29sdW1uTmFtZXMuaGFzKGNvbC5uYW1lKSkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5jb2wsXG4gICAgICBnZW5lcmF0ZWQ6IHVuZGVmaW5lZCxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5jb2wsXG4gICAgZ2VuZXJhdGVkOiB7XG4gICAgICAuLi5jb2wuZ2VuZXJhdGVkLFxuICAgICAgZXhwcmVzc2lvbjogY2Fub25pY2FsaXplU2VhcmNoVGV4dEdlbmVyYXRlZEV4cHJlc3Npb24oY29sLmdlbmVyYXRlZC5leHByZXNzaW9uKSxcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIOqwgSDsu6zrn7wg7J2066aEIOq4sOykgOycvOuhnCBhZGQsIGRyb3AsIGFsdGVyIOyXrOu2gCDtmZXsnbhcbiAqL1xuZnVuY3Rpb24gZ2V0QWx0ZXJDb2x1bW5zVG8oXG4gIGVudGl0eUNvbHVtbnM6IE1pZ3JhdGlvbkNvbHVtbltdLFxuICBkYkNvbHVtbnM6IE1pZ3JhdGlvbkNvbHVtbltdLFxuICBzZWFyY2hUZXh0Q29sdW1uTmFtZXM6IFNldDxzdHJpbmc+LFxuKSB7XG4gIGNvbnN0IGNvbHVtbnNUbyA9IHtcbiAgICBhZGQ6IFtdIGFzIE1pZ3JhdGlvbkNvbHVtbltdLFxuICAgIGRyb3A6IFtdIGFzIE1pZ3JhdGlvbkNvbHVtbltdLFxuICAgIGFsdGVyOiBbXSBhcyBNaWdyYXRpb25Db2x1bW5bXSxcbiAgfTtcblxuICAvLyDsu6zrn7zrqoUg6riw7KSAIOu5hOq1kFxuICBjb25zdCBleHRyYUNvbHVtbnMgPSB7XG4gICAgZGI6IGRpZmYoZGJDb2x1bW5zLCBlbnRpdHlDb2x1bW5zLCAoY29sKSA9PiBbY29sLm5hbWUsIGNvbC5nZW5lcmF0ZWQ/LnR5cGVdLmpvaW4oXCIvLy9cIikpLFxuICAgIGVudGl0eTogZGlmZihlbnRpdHlDb2x1bW5zLCBkYkNvbHVtbnMsIChjb2wpID0+IFtjb2wubmFtZSwgY29sLmdlbmVyYXRlZD8udHlwZV0uam9pbihcIi8vL1wiKSksXG4gIH07XG4gIGlmIChleHRyYUNvbHVtbnMuZW50aXR5Lmxlbmd0aCA+IDApIHtcbiAgICBjb2x1bW5zVG8uYWRkID0gY29sdW1uc1RvLmFkZC5jb25jYXQoZXh0cmFDb2x1bW5zLmVudGl0eSk7XG4gIH1cbiAgaWYgKGV4dHJhQ29sdW1ucy5kYi5sZW5ndGggPiAwKSB7XG4gICAgY29sdW1uc1RvLmRyb3AgPSBjb2x1bW5zVG8uZHJvcC5jb25jYXQoZXh0cmFDb2x1bW5zLmRiKTtcbiAgfVxuXG4gIC8vIOuPmeydvCDsu6zrn7zrqoXsnZgg7IS467aAIO2VhOuTnCDruYTqtZBcbiAgY29uc3Qgc2FtZURiQ29sdW1ucyA9IGludGVyc2VjdGlvbkJ5KGRiQ29sdW1ucywgZW50aXR5Q29sdW1ucywgKGNvbCkgPT4gY29sLm5hbWUpO1xuICBjb25zdCBzYW1lTWRDb2x1bW5zID0gaW50ZXJzZWN0aW9uQnkoZW50aXR5Q29sdW1ucywgZGJDb2x1bW5zLCAoY29sKSA9PiBjb2wubmFtZSk7XG4gIGNvbHVtbnNUby5hbHRlciA9IGRpZmZlcmVuY2VXaXRoKHNhbWVEYkNvbHVtbnMsIHNhbWVNZENvbHVtbnMsIChhLCBiKSA9PlxuICAgIGVxdWFsKFxuICAgICAgbm9ybWFsaXplQ29sdW1uRm9yQ29tcGFyaXNvbihhLCBzZWFyY2hUZXh0Q29sdW1uTmFtZXMpLFxuICAgICAgbm9ybWFsaXplQ29sdW1uRm9yQ29tcGFyaXNvbihiLCBzZWFyY2hUZXh0Q29sdW1uTmFtZXMpLFxuICAgICksXG4gICk7XG5cbiAgcmV0dXJuIGNvbHVtbnNUbztcbn1cblxuLyoqXG4gKiDstpTstpzrkJwg7Lus65+865Ok7J2EIOq4sOykgOycvOuhnCDqsIHqsIEg65287J24IOyDneyEsVxuICovXG5mdW5jdGlvbiBnZXRBbHRlckNvbHVtbkxpbmVzVG8oXG4gIGNvbHVtbnNUbzogUmV0dXJuVHlwZTx0eXBlb2YgZ2V0QWx0ZXJDb2x1bW5zVG8+LFxuICBlbnRpdHlDb2x1bW5zOiBNaWdyYXRpb25Db2x1bW5bXSxcbiAgdGFibGU6IHN0cmluZyxcbiAgZGJGb3JlaWduczogTWlncmF0aW9uRm9yZWlnbltdLFxuKSB7XG4gIGNvbnN0IHNlYXJjaFRleHRDb2x1bW5OYW1lcyA9IGdldFNlYXJjaFRleHRDb2x1bW5OYW1lcyh0YWJsZSk7XG4gIGNvbnN0IGxpbmVzVG8gPSB7XG4gICAgYWRkOiB7XG4gICAgICB1cDogeyBidWlsZGVyOiBbXSBhcyBzdHJpbmdbXSwgcmF3OiBbXSBhcyBzdHJpbmdbXSB9LFxuICAgICAgZG93bjogeyBidWlsZGVyOiBbXSBhcyBzdHJpbmdbXSwgcmF3OiBbXSBhcyBzdHJpbmdbXSB9LFxuICAgIH0sXG4gICAgZHJvcDoge1xuICAgICAgdXA6IHsgYnVpbGRlcjogW10gYXMgc3RyaW5nW10sIHJhdzogW10gYXMgc3RyaW5nW10gfSxcbiAgICAgIGRvd246IHsgYnVpbGRlcjogW10gYXMgc3RyaW5nW10sIHJhdzogW10gYXMgc3RyaW5nW10gfSxcbiAgICB9LFxuICAgIGFsdGVyOiB7XG4gICAgICB1cDogeyBidWlsZGVyOiBbXSBhcyBzdHJpbmdbXSwgcmF3OiBbXSBhcyBzdHJpbmdbXSB9LFxuICAgICAgZG93bjogeyBidWlsZGVyOiBbXSBhcyBzdHJpbmdbXSwgcmF3OiBbXSBhcyBzdHJpbmdbXSB9LFxuICAgIH0sXG4gIH07XG5cbiAgLy8gYWRkIGNvbHVtbnNcbiAgY29uc3QgYWRkQ29sdW1uRGVmcyA9IGdlbkNvbHVtbkRlZmluaXRpb25zKHRhYmxlLCBjb2x1bW5zVG8uYWRkKTtcbiAgbGluZXNUby5hZGQudXAgPSB7XG4gICAgYnVpbGRlcjogYWRkQ29sdW1uRGVmcy5idWlsZGVyLmxlbmd0aCA+IDAgPyBbXCIvLyBhZGRcIiwgLi4uYWRkQ29sdW1uRGVmcy5idWlsZGVyXSA6IFtdLFxuICAgIHJhdzpcbiAgICAgIGFkZENvbHVtbkRlZnMucmF3Lmxlbmd0aCA+IDBcbiAgICAgICAgPyBbXG4gICAgICAgICAgICAuLi5nZXRTZWFyY2hUZXh0SGVscGVyRGVmaW5pdGlvbnModGFibGUsIGNvbHVtbnNUby5hZGQpLFxuICAgICAgICAgICAgXCIvLyBhZGQgKGdlbmVyYXRlZClcIixcbiAgICAgICAgICAgIC4uLmFkZENvbHVtbkRlZnMucmF3LFxuICAgICAgICAgIF1cbiAgICAgICAgOiBbXSxcbiAgfTtcbiAgbGluZXNUby5hZGQuZG93biA9IHtcbiAgICBidWlsZGVyOlxuICAgICAgY29sdW1uc1RvLmFkZC5sZW5ndGggPiAwXG4gICAgICAgID8gW1xuICAgICAgICAgICAgXCIvLyByb2xsYmFjayAtIGFkZFwiLFxuICAgICAgICAgICAgYHRhYmxlLmRyb3BDb2x1bW5zKCR7Y29sdW1uc1RvLmFkZC5tYXAoKGNvbCkgPT4gYCcke2NvbC5uYW1lfSdgKS5qb2luKFwiLCBcIil9KWAsXG4gICAgICAgICAgXVxuICAgICAgICA6IFtdLFxuICAgIHJhdzogW10sXG4gIH07XG5cbiAgLy8gZHJvcO2VoCDsu6zrn7zsl5Ag6rG466awIEZLIOywvuq4sFxuICBjb25zdCBkcm9wQ29sdW1uTmFtZXMgPSBjb2x1bW5zVG8uZHJvcC5tYXAoKGNvbCkgPT4gY29sLm5hbWUpO1xuICBjb25zdCBma1RvRHJvcEJlZm9yZUNvbHVtbiA9IGRiRm9yZWlnbnMuZmlsdGVyKChmaykgPT5cbiAgICBmay5jb2x1bW5zLnNvbWUoKGNvbCkgPT4gZHJvcENvbHVtbk5hbWVzLmluY2x1ZGVzKGNvbCkpLFxuICApO1xuXG4gIGNvbnN0IGRyb3BGa0xpbmVzID0gZmtUb0Ryb3BCZWZvcmVDb2x1bW4ubWFwKChmaykgPT4ge1xuICAgIGNvbnN0IGNvbHVtbnNTdHJpbmdRdW90ZSA9IGZrLmNvbHVtbnMubWFwKChjb2wpID0+IGAnJHtjb2x9J2ApLmpvaW4oXCIsXCIpO1xuICAgIHJldHVybiBgdGFibGUuZHJvcEZvcmVpZ24oWyR7Y29sdW1uc1N0cmluZ1F1b3RlfV0pYDtcbiAgfSk7XG5cbiAgY29uc3QgcmVzdG9yZUZrTGluZXMgPSBnZW5Gb3JlaWduRGVmaW5pdGlvbnModGFibGUsIGZrVG9Ecm9wQmVmb3JlQ29sdW1uKS51cDtcblxuICAvLyBkcm9w7J2YIHJvbGxiYWNr7Iuc7JeQ64qUIGdlbmVyYXRlZCBjb2x1bW7rj4Qg67O17JuQ7ZW07JW8IO2VqFxuICBjb25zdCBkcm9wQ29sdW1uRGVmcyA9IGdlbkNvbHVtbkRlZmluaXRpb25zKHRhYmxlLCBjb2x1bW5zVG8uZHJvcCk7XG4gIGxpbmVzVG8uZHJvcCA9IHtcbiAgICB1cDoge1xuICAgICAgYnVpbGRlcjogW1xuICAgICAgICAuLi4oZHJvcEZrTGluZXMubGVuZ3RoID4gMFxuICAgICAgICAgID8gW1wiLy8gZHJvcCBmb3JlaWduIGtleXMgb24gY29sdW1ucyB0byBiZSBkcm9wcGVkXCIsIC4uLmRyb3BGa0xpbmVzXVxuICAgICAgICAgIDogW10pLFxuICAgICAgICAuLi4oY29sdW1uc1RvLmRyb3AubGVuZ3RoID4gMFxuICAgICAgICAgID8gW1xuICAgICAgICAgICAgICBcIi8vIGRyb3AgY29sdW1uc1wiLFxuICAgICAgICAgICAgICBgdGFibGUuZHJvcENvbHVtbnMoJHtjb2x1bW5zVG8uZHJvcC5tYXAoKGNvbCkgPT4gYCcke2NvbC5uYW1lfSdgKS5qb2luKFwiLCBcIil9KWAsXG4gICAgICAgICAgICBdXG4gICAgICAgICAgOiBbXSksXG4gICAgICBdLFxuICAgICAgcmF3OiBbXSxcbiAgICB9LFxuICAgIGRvd246IHtcbiAgICAgIGJ1aWxkZXI6IFtcbiAgICAgICAgLi4uKGRyb3BDb2x1bW5EZWZzLmJ1aWxkZXIubGVuZ3RoID4gMFxuICAgICAgICAgID8gW1wiLy8gcm9sbGJhY2sgLSBkcm9wIGNvbHVtbnNcIiwgLi4uZHJvcENvbHVtbkRlZnMuYnVpbGRlcl1cbiAgICAgICAgICA6IFtdKSxcbiAgICAgICAgLi4uKHJlc3RvcmVGa0xpbmVzLmxlbmd0aCA+IDAgPyBbXCIvLyByZXN0b3JlIGZvcmVpZ24ga2V5c1wiLCAuLi5yZXN0b3JlRmtMaW5lc10gOiBbXSksXG4gICAgICBdLFxuICAgICAgcmF3OlxuICAgICAgICBkcm9wQ29sdW1uRGVmcy5yYXcubGVuZ3RoID4gMFxuICAgICAgICAgID8gW1xuICAgICAgICAgICAgICAuLi5nZXRTZWFyY2hUZXh0SGVscGVyRGVmaW5pdGlvbnModGFibGUsIGNvbHVtbnNUby5kcm9wKSxcbiAgICAgICAgICAgICAgXCIvLyByb2xsYmFjayAtIGRyb3AgY29sdW1ucyAoZ2VuZXJhdGVkKVwiLFxuICAgICAgICAgICAgICAuLi5kcm9wQ29sdW1uRGVmcy5yYXcsXG4gICAgICAgICAgICBdXG4gICAgICAgICAgOiBbXSxcbiAgICB9LFxuICB9O1xuXG4gIC8vIGFsdGVyIGNvbHVtbnMgKEdlbmVyYXRlZCBDb2x1bW7snYAgQUxURVIg67aI6rCA7ZWY66+A66GcIGRyb3Ag7ZuEIOyerOyDneyEsSlcbiAgbGluZXNUby5hbHRlciA9IGNvbHVtbnNUby5hbHRlci5yZWR1Y2UoXG4gICAgKHIsIGRiQ29sdW1uKSA9PiB7XG4gICAgICBjb25zdCBlbnRpdHlDb2x1bW4gPSBlbnRpdHlDb2x1bW5zLmZpbmQoKGNvbCkgPT4gY29sLm5hbWUgPT09IGRiQ29sdW1uLm5hbWUpO1xuICAgICAgaWYgKGVudGl0eUNvbHVtbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiByO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIHNlYXJjaFRleHRDb2x1bW5OYW1lcy5oYXMoZGJDb2x1bW4ubmFtZSkgJiZcbiAgICAgICAgZGJDb2x1bW4uZ2VuZXJhdGVkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgZW50aXR5Q29sdW1uLmdlbmVyYXRlZCAhPT0gdW5kZWZpbmVkXG4gICAgICApIHtcbiAgICAgICAgci51cC5idWlsZGVyID0gW1xuICAgICAgICAgIC4uLnIudXAuYnVpbGRlcixcbiAgICAgICAgICBcIi8vIGFsdGVyIGdlbmVyYXRlZCBjb2x1bW5cIixcbiAgICAgICAgICBgdGFibGUuZHJvcENvbHVtbnMoJyR7ZGJDb2x1bW4ubmFtZX0nKWAsXG4gICAgICAgIF07XG4gICAgICAgIHIudXAucmF3ID0gW1xuICAgICAgICAgIC4uLnIudXAucmF3LFxuICAgICAgICAgIC4uLmdldFNlYXJjaFRleHRIZWxwZXJEZWZpbml0aW9ucyh0YWJsZSwgW2VudGl0eUNvbHVtbl0pLFxuICAgICAgICAgIFwiLy8gYWx0ZXIgZ2VuZXJhdGVkIGNvbHVtblwiLFxuICAgICAgICAgIGdlbkdlbmVyYXRlZENvbHVtbkRlZmluaXRpb24odGFibGUsIGVudGl0eUNvbHVtbiksXG4gICAgICAgIF07XG4gICAgICAgIHIuZG93bi5idWlsZGVyID0gW1xuICAgICAgICAgIC4uLnIuZG93bi5idWlsZGVyLFxuICAgICAgICAgIFwiLy8gcm9sbGJhY2sgLSBhbHRlciBnZW5lcmF0ZWQgY29sdW1uXCIsXG4gICAgICAgICAgYHRhYmxlLmRyb3BDb2x1bW5zKCcke2RiQ29sdW1uLm5hbWV9JylgLFxuICAgICAgICBdO1xuICAgICAgICByLmRvd24ucmF3ID0gW1xuICAgICAgICAgIC4uLnIuZG93bi5yYXcsXG4gICAgICAgICAgLi4uZ2V0U2VhcmNoVGV4dEhlbHBlckRlZmluaXRpb25zKHRhYmxlLCBbZGJDb2x1bW5dKSxcbiAgICAgICAgICBcIi8vIHJvbGxiYWNrIC0gYWx0ZXIgZ2VuZXJhdGVkIGNvbHVtblwiLFxuICAgICAgICAgIGdlbkdlbmVyYXRlZENvbHVtbkRlZmluaXRpb24odGFibGUsIGRiQ29sdW1uKSxcbiAgICAgICAgXTtcbiAgICAgICAgcmV0dXJuIHI7XG4gICAgICB9XG5cbiAgICAgIC8vIOy7rOufvCDrs4Dqsr3sgqztla1cbiAgICAgIGNvbnN0IGNvbHVtbkRpZmZVcCA9IGRpZmYoXG4gICAgICAgIGdlbkNvbHVtbkRlZmluaXRpb25zKHRhYmxlLCBbZW50aXR5Q29sdW1uXSkuYnVpbGRlcixcbiAgICAgICAgZ2VuQ29sdW1uRGVmaW5pdGlvbnModGFibGUsIFtkYkNvbHVtbl0pLmJ1aWxkZXIsXG4gICAgICApO1xuICAgICAgY29uc3QgY29sdW1uRGlmZkRvd24gPSBkaWZmKFxuICAgICAgICBnZW5Db2x1bW5EZWZpbml0aW9ucyh0YWJsZSwgW2RiQ29sdW1uXSkuYnVpbGRlcixcbiAgICAgICAgZ2VuQ29sdW1uRGVmaW5pdGlvbnModGFibGUsIFtlbnRpdHlDb2x1bW5dKS5idWlsZGVyLFxuICAgICAgKTtcbiAgICAgIGlmIChjb2x1bW5EaWZmVXAubGVuZ3RoID4gMCkge1xuICAgICAgICByLnVwLmJ1aWxkZXIgPSBbXG4gICAgICAgICAgLi4uci51cC5idWlsZGVyLFxuICAgICAgICAgIFwiLy8gYWx0ZXIgY29sdW1uXCIsXG4gICAgICAgICAgLi4uY29sdW1uRGlmZlVwLm1hcCgobCkgPT4gYCR7bC5yZXBsYWNlKFwiO1wiLCBcIlwiKX0uYWx0ZXIoKTtgKSxcbiAgICAgICAgXTtcbiAgICAgICAgci5kb3duLmJ1aWxkZXIgPSBbXG4gICAgICAgICAgLi4uci5kb3duLmJ1aWxkZXIsXG4gICAgICAgICAgXCIvLyByb2xsYmFjayAtIGFsdGVyIGNvbHVtblwiLFxuICAgICAgICAgIC4uLmNvbHVtbkRpZmZEb3duLm1hcCgobCkgPT4gYCR7bC5yZXBsYWNlKFwiO1wiLCBcIlwiKX0uYWx0ZXIoKTtgKSxcbiAgICAgICAgXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfSxcbiAgICB7XG4gICAgICB1cDogeyBidWlsZGVyOiBbXSBhcyBzdHJpbmdbXSwgcmF3OiBbXSBhcyBzdHJpbmdbXSB9LFxuICAgICAgZG93bjogeyBidWlsZGVyOiBbXSBhcyBzdHJpbmdbXSwgcmF3OiBbXSBhcyBzdHJpbmdbXSB9LFxuICAgIH0sXG4gICk7XG5cbiAgcmV0dXJuIGxpbmVzVG87XG59XG5cbi8qKlxuICog7J24642x7Iqk7J2YIGFkZCwgZHJvcCDsl6zrtoAg7ZmV7J24XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRBbHRlckluZGV4ZXNUbyhlbnRpdHlJbmRleGVzOiBNaWdyYXRpb25JbmRleFtdLCBkYkluZGV4ZXM6IE1pZ3JhdGlvbkluZGV4W10pIHtcbiAgLy8g7J24642x7IqkIOu5hOq1kFxuICBjb25zdCBpbmRleGVzVG8gPSB7XG4gICAgYWRkOiBbXSBhcyBNaWdyYXRpb25JbmRleFtdLFxuICAgIGRyb3A6IFtdIGFzIE1pZ3JhdGlvbkluZGV4W10sXG4gIH07XG5cbiAgLy8g7J24642x7IqkIOqzoOycoCDsi53rs4TsnpAg7IOd7ISxIChuYW1l7J2EIOygnOyZuO2VnCDrqqjrk6Ag7ZWE65Oc66W8IOusuOyekOyXtOuhnCDrs4DtmZjtlZjsl6wg7KGw7ZWpKVxuICBjb25zdCBpZGVudGl0eSA9IDxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KGluZGV4OiBUKTogc3RyaW5nID0+IHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoaW5kZXgpXG4gICAgICAuZmlsdGVyKChrZXkpID0+IGtleSAhPT0gXCJuYW1lXCIpXG4gICAgICAudG9Tb3J0ZWQoKTtcblxuICAgIHJldHVybiBrZXlzXG4gICAgICAubWFwKChrZXkpID0+IHtcbiAgICAgICAgaWYgKGtleSA9PT0gXCJuYW1lXCIpIHtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChrZXkgPT09IFwiY29sdW1uc1wiKSB7XG4gICAgICAgICAgcmV0dXJuIChpbmRleFtrZXldIGFzIE1pZ3JhdGlvbkluZGV4W1wiY29sdW1uc1wiXSkubWFwKChjb2wpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhjb2wpXG4gICAgICAgICAgICAgIC50b1NvcnRlZCgpXG4gICAgICAgICAgICAgIC5tYXAoKGspID0+IGAke2t9PSR7Y29sW2sgYXMga2V5b2YgdHlwZW9mIGNvbF19YClcbiAgICAgICAgICAgICAgLmpvaW4oXCIvL1wiKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYCR7a2V5fT0ke2luZGV4W2tleSBhcyBrZXlvZiBNaWdyYXRpb25JbmRleF19YDtcbiAgICAgIH0pXG4gICAgICAuam9pbihcIi8vXCIpO1xuICB9O1xuXG4gIGNvbnN0IG5vcm1hbGl6ZWRFbnRpdHlJbmRleGVzID0gZW50aXR5SW5kZXhlcy5tYXAoc2V0TWlncmF0aW9uSW5kZXhEZWZhdWx0cyk7XG4gIGNvbnN0IG5vcm1hbGl6ZWREYkluZGV4ZXMgPSBkYkluZGV4ZXMubWFwKHNldE1pZ3JhdGlvbkluZGV4RGVmYXVsdHMpO1xuICAvLyDruYTqtZDsl5DripQg7KCV6rec7ZmU65CcIHByZWRpY2F0ZeulvCDsk7DrkJgsIOyLpOygnCBtaWdyYXRpb24g7Lac66Cl7J2AIOybkOuzuCBTUUzsnYQg67O07KG07ZWc64ukLlxuICBjb25zdCBjb21wYXJpc29uRW50aXR5SW5kZXhlcyA9IGVudGl0eUluZGV4ZXMubWFwKHNldE1pZ3JhdGlvbkluZGV4Q29tcGFyaXNvbkRlZmF1bHRzKTtcbiAgY29uc3QgY29tcGFyaXNvbkRiSW5kZXhlcyA9IGRiSW5kZXhlcy5tYXAoc2V0TWlncmF0aW9uSW5kZXhDb21wYXJpc29uRGVmYXVsdHMpO1xuICBjb25zdCBleHRyYUluZGV4ZXMgPSB7XG4gICAgZGI6IGRpZmYoY29tcGFyaXNvbkRiSW5kZXhlcywgY29tcGFyaXNvbkVudGl0eUluZGV4ZXMsIGlkZW50aXR5KSxcbiAgICBlbnRpdHk6IGRpZmYoY29tcGFyaXNvbkVudGl0eUluZGV4ZXMsIGNvbXBhcmlzb25EYkluZGV4ZXMsIGlkZW50aXR5KSxcbiAgfTtcbiAgaWYgKGV4dHJhSW5kZXhlcy5lbnRpdHkubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGFkZElkZW50aXRpZXMgPSBuZXcgU2V0KGV4dHJhSW5kZXhlcy5lbnRpdHkubWFwKGlkZW50aXR5KSk7XG4gICAgaW5kZXhlc1RvLmFkZCA9IGluZGV4ZXNUby5hZGQuY29uY2F0KFxuICAgICAgbm9ybWFsaXplZEVudGl0eUluZGV4ZXMuZmlsdGVyKChfLCBpbmRleCkgPT5cbiAgICAgICAgYWRkSWRlbnRpdGllcy5oYXMoaWRlbnRpdHkoY29tcGFyaXNvbkVudGl0eUluZGV4ZXNbaW5kZXhdKSksXG4gICAgICApLFxuICAgICk7XG4gIH1cbiAgaWYgKGV4dHJhSW5kZXhlcy5kYi5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgZHJvcElkZW50aXRpZXMgPSBuZXcgU2V0KGV4dHJhSW5kZXhlcy5kYi5tYXAoaWRlbnRpdHkpKTtcbiAgICBpbmRleGVzVG8uZHJvcCA9IGluZGV4ZXNUby5kcm9wLmNvbmNhdChcbiAgICAgIG5vcm1hbGl6ZWREYkluZGV4ZXMuZmlsdGVyKChfLCBpbmRleCkgPT5cbiAgICAgICAgZHJvcElkZW50aXRpZXMuaGFzKGlkZW50aXR5KGNvbXBhcmlzb25EYkluZGV4ZXNbaW5kZXhdKSksXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gaW5kZXhlc1RvO1xufVxuXG4vKipcbiAqIOyduOuNseyKpCDsgq3soJwg7KCV7J2YIOyDneyEsVxuICovXG5mdW5jdGlvbiBnZW5JbmRleERyb3BEZWZpbml0aW9uKGluZGV4OiBNaWdyYXRpb25JbmRleCkge1xuICByZXR1cm4gYHRhYmxlLmRyb3BJbmRleChbJHtpbmRleC5jb2x1bW5zXG4gICAgLm1hcCgoY29sdW1uKSA9PiBgJyR7Y29sdW1uLm5hbWV9J2ApXG4gICAgLmpvaW4oXCIsXCIpfV0sICcke2luZGV4Lm5hbWV9JylgO1xufVxuXG4vKipcbiAqIERCIOyhsO2ajCDqsrDqs7zsmYAg67mE6rWQ7ZWY6riwIOychO2VnCDsnbjrjbHsiqQg6riw67O46rCSIOyEpOyglVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0TWlncmF0aW9uSW5kZXhEZWZhdWx0cyhpbmRleDogTWlncmF0aW9uSW5kZXgpOiBNaWdyYXRpb25JbmRleCB7XG4gIHJldHVybiBzZXRNaWdyYXRpb25JbmRleERlZmF1bHRzQmFzZShpbmRleCwgZmFsc2UpO1xufVxuXG5mdW5jdGlvbiBzZXRNaWdyYXRpb25JbmRleENvbXBhcmlzb25EZWZhdWx0cyhpbmRleDogTWlncmF0aW9uSW5kZXgpOiBNaWdyYXRpb25JbmRleCB7XG4gIC8vIERCIGNhbm9uaWNhbCBTUUzqs7wgZW50aXR5IFNRTOydmCDtkZztmIQg7LCo7J2066W8IGRpZmYgaWRlbnRpdHnsl5DshJzrp4wg7Z2h7IiY7ZWc64ukLlxuICByZXR1cm4gc2V0TWlncmF0aW9uSW5kZXhEZWZhdWx0c0Jhc2UoaW5kZXgsIHRydWUpO1xufVxuXG5mdW5jdGlvbiBzZXRNaWdyYXRpb25JbmRleERlZmF1bHRzQmFzZShcbiAgaW5kZXg6IE1pZ3JhdGlvbkluZGV4LFxuICBub3JtYWxpemVXaGVyZUZvckNvbXBhcmlzb246IGJvb2xlYW4sXG4pOiBNaWdyYXRpb25JbmRleCB7XG4gIGNvbnN0IGlzVmVjdG9ySW5kZXggPSBpbmRleC50eXBlID09PSBcImhuc3dcIiB8fCBpbmRleC50eXBlID09PSBcIml2ZmZsYXRcIjtcbiAgY29uc3Qgc3VwcG9ydHNPcmRlcmluZyA9ICFpc1ZlY3RvckluZGV4ICYmICghaW5kZXgudXNpbmcgfHwgaW5kZXgudXNpbmcgPT09IFwiYnRyZWVcIik7XG4gIGNvbnN0IG5vcm1hbGl6ZWRVc2luZyA9IGlzVmVjdG9ySW5kZXggPyBpbmRleC51c2luZyA6IChpbmRleC51c2luZyA/PyBcImJ0cmVlXCIpO1xuICBjb25zdCBub3JtYWxpemVkV2hlcmUgPSBub3JtYWxpemVXaGVyZUZvckNvbXBhcmlzb25cbiAgICA/IG5vcm1hbGl6ZUluZGV4V2hlcmVQcmVkaWNhdGVGb3JDb21wYXJpc29uKGluZGV4LndoZXJlKVxuICAgIDogbm9ybWFsaXplSW5kZXhXaGVyZVByZWRpY2F0ZShpbmRleC53aGVyZSk7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5pbmRleCxcbiAgICBjb2x1bW5zOiBpbmRleC5jb2x1bW5zLm1hcCgoY29sKSA9PiAoe1xuICAgICAgbmFtZTogY29sLm5hbWUsXG4gICAgICAuLi4oZ2V0SW5kZXhDb2x1bW5PcGNsYXNzKGNvbCkgPyB7IG9wY2xhc3M6IGdldEluZGV4Q29sdW1uT3BjbGFzcyhjb2wpIH0gOiB7fSksXG4gICAgICAuLi4oc3VwcG9ydHNPcmRlcmluZ1xuICAgICAgICA/IHtcbiAgICAgICAgICAgIHNvcnRPcmRlcjogY29sLnNvcnRPcmRlciA/PyBcIkFTQ1wiLFxuICAgICAgICAgICAgbnVsbHNGaXJzdDogY29sLm51bGxzRmlyc3QgPz8gY29sLnNvcnRPcmRlciA9PT0gXCJERVNDXCIsXG4gICAgICAgICAgfVxuICAgICAgICA6IHt9KSxcbiAgICB9KSksXG4gICAgbnVsbHNOb3REaXN0aW5jdDogaW5kZXgubnVsbHNOb3REaXN0aW5jdCA/PyBmYWxzZSxcbiAgICAuLi4obm9ybWFsaXplZFVzaW5nID8geyB1c2luZzogbm9ybWFsaXplZFVzaW5nIH0gOiB7fSksXG4gICAgLi4uKG5vcm1hbGl6ZWRXaGVyZSA/IHsgd2hlcmU6IG5vcm1hbGl6ZWRXaGVyZSB9IDoge30pLFxuICB9O1xufVxuXG4vKipcbiAqIO2FjOydtOu4lCDrs4Dqsr0g7LyA7J207IqkIC0gRm9yZWlnbiBLZXkg67OA6rK9XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQWx0ZXJDb2RlX0ZvcmVpZ25zKFxuICB0YWJsZTogc3RyaW5nLFxuICBlbnRpdHlGb3JlaWduczogTWlncmF0aW9uRm9yZWlnbltdLFxuICBkYkZvcmVpZ25zOiBNaWdyYXRpb25Gb3JlaWduW10sXG4gIGRyb3BwaW5nQ29sdW1uczogTWlncmF0aW9uQ29sdW1uW10gPSBbXSxcbik6IFByb21pc2U8R2VuTWlncmF0aW9uQ29kZVtdPiB7XG4gIC8vIGNvbnNvbGUubG9nKHsgZW50aXR5Rm9yZWlnbnMsIGRiRm9yZWlnbnMgfSk7XG5cbiAgY29uc3QgZ2V0S2V5ID0gKG1mOiBNaWdyYXRpb25Gb3JlaWduKTogc3RyaW5nID0+IHtcbiAgICByZXR1cm4gW21mLmNvbHVtbnMuam9pbihcIi1cIiksIG1mLnRvXS5qb2luKFwiLy8vXCIpO1xuICB9O1xuXG4gIC8vIOyCreygnOuQoCDsu6zrn7zrqoUg66qp66GdXG4gIGNvbnN0IGRyb3BwaW5nQ29sdW1uTmFtZXMgPSBkcm9wcGluZ0NvbHVtbnMubWFwKChjb2wpID0+IGNvbC5uYW1lKTtcblxuICBjb25zdCBma1RvID0gZW50aXR5Rm9yZWlnbnMucmVkdWNlKFxuICAgIChyZXN1bHQsIGVudGl0eUYpID0+IHtcbiAgICAgIGNvbnN0IG1hdGNoaW5nRGJGID0gZGJGb3JlaWducy5maW5kKChkYkYpID0+IGdldEtleShlbnRpdHlGKSA9PT0gZ2V0S2V5KGRiRikpO1xuICAgICAgaWYgKCFtYXRjaGluZ0RiRikge1xuICAgICAgICByZXN1bHQuYWRkLnB1c2goZW50aXR5Rik7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIGlmICghZXF1YWwoZW50aXR5RiwgbWF0Y2hpbmdEYkYpKSB7XG4gICAgICAgIHJlc3VsdC5hbHRlclNyYy5wdXNoKG1hdGNoaW5nRGJGKTtcbiAgICAgICAgcmVzdWx0LmFsdGVyRHN0LnB1c2goZW50aXR5Rik7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG4gICAge1xuICAgICAgYWRkOiBbXSBhcyBNaWdyYXRpb25Gb3JlaWduW10sXG4gICAgICBkcm9wOiBbXSBhcyBNaWdyYXRpb25Gb3JlaWduW10sXG4gICAgICBhbHRlclNyYzogW10gYXMgTWlncmF0aW9uRm9yZWlnbltdLFxuICAgICAgYWx0ZXJEc3Q6IFtdIGFzIE1pZ3JhdGlvbkZvcmVpZ25bXSxcbiAgICB9LFxuICApO1xuXG4gIC8vIGRiRm9yZWlnbnPsl5DripQg7J6I7KeA66eMIGVudGl0eUZvcmVpZ25z7JeQ64qUIOyXhuuKlCDqsr3smrAgKOyCreygnOuQnCBGSylcbiAgLy8g64uoLCDsgq3soJzrkKAg7Lus65+87J2YIEZL64qUIOygnOyZuCAoZ2VuZXJhdGVBbHRlckNvZGVfQ29sdW1uQW5kSW5kZXhlc+yXkOyEnCDsspjrpqwpXG4gIGRiRm9yZWlnbnMuZm9yRWFjaCgoZGJGKSA9PiB7XG4gICAgY29uc3QgbWF0Y2hpbmdFbnRpdHlGID0gZW50aXR5Rm9yZWlnbnMuZmluZCgoZW50aXR5RikgPT4gZ2V0S2V5KGVudGl0eUYpID09PSBnZXRLZXkoZGJGKSk7XG4gICAgaWYgKCFtYXRjaGluZ0VudGl0eUYpIHtcbiAgICAgIC8vIOydtCBGS+ydmCDsu6zrn7zsnbQg7IKt7KCc65CgIOy7rOufvCDrqqnroZ3sl5Ag7J6I64qU7KeAIO2ZleyduFxuICAgICAgY29uc3QgaXNDb2x1bW5Ecm9wcGluZyA9IGRiRi5jb2x1bW5zLnNvbWUoKGNvbCkgPT4gZHJvcHBpbmdDb2x1bW5OYW1lcy5pbmNsdWRlcyhjb2wpKTtcbiAgICAgIC8vIOy7rOufvOydtCDsgq3soJzrkJjsp4Ag7JWK64qUIOqyveyasOyXkOunjCBGSyBkcm9wIOuqqeuhneyXkCDstpTqsIBcbiAgICAgIGlmICghaXNDb2x1bW5Ecm9wcGluZykge1xuICAgICAgICBma1RvLmRyb3AucHVzaChkYkYpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgY29uc3QgbGluZXNUbyA9IHtcbiAgICBhZGQ6IGdlbkZvcmVpZ25EZWZpbml0aW9ucyh0YWJsZSwgZmtUby5hZGQpLFxuICAgIGRyb3A6IGdlbkZvcmVpZ25EZWZpbml0aW9ucyh0YWJsZSwgZmtUby5kcm9wKSxcbiAgICBhbHRlclNyYzogZ2VuRm9yZWlnbkRlZmluaXRpb25zKHRhYmxlLCBma1RvLmFsdGVyU3JjKSxcbiAgICBhbHRlckRzdDogZ2VuRm9yZWlnbkRlZmluaXRpb25zKHRhYmxlLCBma1RvLmFsdGVyRHN0KSxcbiAgfTtcblxuICAvLyBkcm9wIGZrIGNvbHVtbnPsnbgg6rK97JqwKOyDneyEseuQoCDsvZTrk5wg7JeG64qUIOqyveyasCkg7Yyo7IqkXG4gIGNvbnN0IGhhc0xpbmVzID0gT2JqZWN0LnZhbHVlcyhsaW5lc1RvKS5zb21lKChsKSA9PiBsLnVwLmxlbmd0aCA+IDAgfHwgbC5kb3duLmxlbmd0aCA+IDApO1xuICBpZiAoIWhhc0xpbmVzKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgaWYgKFxuICAgIGxpbmVzVG8uYWRkLnVwLmxlbmd0aCA9PT0gMCAmJlxuICAgIGxpbmVzVG8uZHJvcC51cC5sZW5ndGggPT09IDAgJiZcbiAgICBsaW5lc1RvLmFsdGVyU3JjLnVwLmxlbmd0aCA9PT0gMCAmJlxuICAgIGxpbmVzVG8uYWx0ZXJEc3QudXAubGVuZ3RoID09PSAwXG4gICkge1xuICAgIE5haXRlLnQoXCJtaWdyYXRvcjpnZW5lcmF0ZUFsdGVyQ29kZV9Gb3JlaWduczpma0NoYW5nZUNvZGVHZW5lcmF0aW9uRXJyb3JcIiwge1xuICAgICAgdGFibGUsXG4gICAgICBlbnRpdHlGb3JlaWducyxcbiAgICAgIGRiRm9yZWlnbnMsXG4gICAgfSk7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiRksg67OA6rK9IOy9lOuTnCDsg53shLEg7Jik66WYXCIpO1xuICB9XG5cbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW1xuICAgICdpbXBvcnQgdHlwZSB7IEtuZXggfSBmcm9tIFwia25leFwiOycsXG4gICAgXCJcIixcbiAgICBcImV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cChrbmV4OiBLbmV4KTogUHJvbWlzZTx2b2lkPiB7XCIsXG4gICAgYHJldHVybiBrbmV4LnNjaGVtYS5hbHRlclRhYmxlKFwiJHt0YWJsZX1cIiwgKHRhYmxlKSA9PiB7YCxcbiAgICAuLi5saW5lc1RvLmRyb3AuZG93bixcbiAgICAuLi5saW5lc1RvLmFkZC51cCxcbiAgICAuLi5saW5lc1RvLmFsdGVyU3JjLmRvd24sXG4gICAgLi4ubGluZXNUby5hbHRlckRzdC51cCxcbiAgICBcIn0pXCIsXG4gICAgXCJ9XCIsXG4gICAgXCJcIixcbiAgICBcImV4cG9ydCBhc3luYyBmdW5jdGlvbiBkb3duKGtuZXg6IEtuZXgpOiBQcm9taXNlPHZvaWQ+IHtcIixcbiAgICBgcmV0dXJuIGtuZXguc2NoZW1hLmFsdGVyVGFibGUoXCIke3RhYmxlfVwiLCAodGFibGUpID0+IHtgLFxuICAgIC4uLmxpbmVzVG8uYWRkLmRvd24sXG4gICAgLi4ubGluZXNUby5hbHRlckRzdC5kb3duLFxuICAgIC4uLmxpbmVzVG8uYWx0ZXJTcmMudXAsXG4gICAgLi4ubGluZXNUby5kcm9wLnVwLFxuICAgIFwifSlcIixcbiAgICBcIn1cIixcbiAgXTtcblxuICBjb25zdCBmb3JtYXR0ZWQgPSBhd2FpdCBmb3JtYXRDb2RlKGxpbmVzLmpvaW4oXCJcXG5cIiksIGBzcmMvbWlncmF0aW9uLyR7dGFibGV9LnRzYCk7XG4gIGNvbnN0IHRpdGxlID0gW1wiYWx0ZXJcIiwgdGFibGUsIFwiZm9yZWlnbnNcIl0uam9pbihcIl9cIik7XG5cbiAgcmV0dXJuIFtcbiAgICB7XG4gICAgICB0YWJsZSxcbiAgICAgIHRpdGxlLFxuICAgICAgZm9ybWF0dGVkLFxuICAgICAgdHlwZTogXCJub3JtYWxcIixcbiAgICB9LFxuICBdO1xufVxuXG4vKipcbiAqIOyjvOyWtOynhCBFbnRpdHlTZXTsnYQg6riw67CY7Jy866GcIO2FjOydtOu4lCBDUkVBVEUg66eI7J206re466CI7J207IWYIOy9lOuTnOulvCDsg53shLHtlanri4jri6QuXG4gKiBAcGFyYW0gZW50aXR5U2V0XG4gKiBAcmV0dXJucyBDUkVBVEUg66eI7J206re466CI7J207IWYIOy9lOuTnFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVDcmVhdGVDb2RlKGVudGl0eVNldDogTWlncmF0aW9uU2V0KTogUHJvbWlzZTxHZW5NaWdyYXRpb25Db2RlW10+IHtcbiAgcmV0dXJuIFtcbiAgICBhd2FpdCBnZW5lcmF0ZUNyZWF0ZUNvZGVfQ29sdW1uQW5kSW5kZXhlcyhcbiAgICAgIGVudGl0eVNldC50YWJsZSxcbiAgICAgIGVudGl0eVNldC5jb2x1bW5zLFxuICAgICAgZW50aXR5U2V0LmluZGV4ZXMsXG4gICAgKSxcbiAgICAuLi4oYXdhaXQgZ2VuZXJhdGVDcmVhdGVDb2RlX0ZvcmVpZ24oZW50aXR5U2V0LnRhYmxlLCBlbnRpdHlTZXQuZm9yZWlnbnMpKSxcbiAgXTtcbn1cblxuLyoqXG4gKiDso7zslrTsp4QgZW50aXR5U2V07J2EIOuqqe2RnOuhnCwgZGJTZXTsnYQg7ZiEIOyDge2ZqeycvOuhnCDtlZjsl6wg7YWM7J2067iUIEFMVEVSIOuniOydtOq3uOugiOydtOyFmCDsvZTrk5zrpbwg7IOd7ISx7ZWp64uI64ukLlxuICogQHBhcmFtIGVudGl0eVNldCDtmIQg7IOB7Zmp7J2YIE1pZ3JhdGlvblNldFxuICogQHBhcmFtIGRiU2V0IOuqqe2RnCDsg4HtmansnZggTWlncmF0aW9uU2V0XG4gKiBAcGFyYW0gY29tcGFyZURCIFBLIO2DgOyehSDrs4Dqsr0g7IucIOyXreywuOyhsCBGS+ulvCDsobDtmoztlZjquLAg7JyE7ZWcIEtuZXgg7J247Iqk7YS07IqkICjshKDtg50pXG4gKiBAcmV0dXJucyBBTFRFUiDrp4jsnbTqt7jroIjsnbTshZgg7L2U65OcXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUFsdGVyQ29kZShcbiAgZW50aXR5U2V0OiBNaWdyYXRpb25TZXQsXG4gIGRiU2V0OiBNaWdyYXRpb25TZXQsXG4gIGNvbXBhcmVEQj86IEtuZXgsXG4pOiBQcm9taXNlPEdlbk1pZ3JhdGlvbkNvZGVbXT4ge1xuICBjb25zdCByZXBsYWNlQ29sdW1uRGVmYXVsdFRvID0gKGNvbDogTWlncmF0aW9uQ29sdW1uKSA9PiB7XG4gICAgLy8gZmxvYXTsnbgg6rK97JqwIOq4sOuzuOqwkuydhCAw7Jy866GcIOyngOygle2VmOuKlCDqsr3smrAgXCIwLjAwXCLsnLzroZwg67OA7ZmY65CY64qUIOy8gOydtOyKpCDrjIDsnZFcbiAgICAvLyBpZiAoY29sLnR5cGUgPT09IFwiZmxvYXRcIiAmJiBjb2wuZGVmYXVsdFRvICYmIFN0cmluZyhjb2wuZGVmYXVsdFRvKS5pbmNsdWRlcygnXCInKSA9PT0gZmFsc2UpIHtcbiAgICAvLyAgIGNvbC5kZWZhdWx0VG8gPSBgXCIke051bWJlcihjb2wuZGVmYXVsdFRvKS50b0ZpeGVkKGNvbC5zY2FsZSA/PyAyKX1cImA7XG4gICAgLy8gfVxuICAgIC8vIC8vIHN0cmluZ+yduCDqsr3smrAg6riw67O46rCS7J20IOu5iCDsiqTtirjrp4Hsnbgg6rK97JqwIOuMgOydkVxuICAgIC8vIGlmIChjb2wudHlwZSA9PT0gXCJzdHJpbmdcIiAmJiBjb2wuZGVmYXVsdFRvID09PSBcIlwiKSB7XG4gICAgLy8gICBjb2wuZGVmYXVsdFRvID0gJ1wiXCInO1xuICAgIC8vIH1cbiAgICAvLyAvLyBib29sZWFu7J24IOqyveyasCDquLDrs7jqsJIg7KCV6rec7ZmUIChNeVNRTOyXkOyEnOuKlCBUSU5ZSU5UKDEp66GcIOyggOyepeuQmOuvgOuhnCAwIOuYkOuKlCAx66GcIOygleq3nO2ZlClcbiAgICAvLyAvLyBUT0RPOiBkYi50c+yXkCB0eXBlQ2FzZSDshKTsoJUg7ZmV7J247ZWY7JesIOyymOumrO2VmOuPhOuhnSDsiJjsoJUg7ZWE7JqUXG4gICAgLy8gaWYgKGNvbC50eXBlID09PSBcImJvb2xlYW5cIiAmJiBjb2wuZGVmYXVsdFRvICE9PSB1bmRlZmluZWQpIHtcbiAgICAvLyAgIGlmIChjb2wuZGVmYXVsdFRvID09PSBcIjBcIiB8fCBjb2wuZGVmYXVsdFRvLnRvTG93ZXJDYXNlKCkgPT09IFwiZmFsc2VcIikge1xuICAgIC8vICAgICBjb2wuZGVmYXVsdFRvID0gXCIwXCI7XG4gICAgLy8gICB9IGVsc2UgaWYgKGNvbC5kZWZhdWx0VG8gPT09IFwiMVwiIHx8IGNvbC5kZWZhdWx0VG8udG9Mb3dlckNhc2UoKSA9PT0gXCJ0cnVlXCIpIHtcbiAgICAvLyAgICAgY29sLmRlZmF1bHRUbyA9IFwiMVwiO1xuICAgIC8vICAgfVxuICAgIC8vIH1cblxuICAgIC8vIEZJWE1FOiDsnbzri6ggTXlTUUwg7IOB7Zmp7JeQ7IScIOuwnOyDne2WiOuNmCDsnbTsiojsnZggd29ya2Fyb3VuZCDsnbTrr4DroZwgUGfsl5DshJwg7J6s7ZmV7J24IO2bhCDrjIDsnZEg7LaU6rCAXG4gICAgcmV0dXJuIGNvbDtcbiAgfTtcbiAgY29uc3QgZW50aXR5Q29sdW1ucyA9IGFscGhhYmV0aWNhbChlbnRpdHlTZXQuY29sdW1ucywgKGEpID0+IGEubmFtZSkubWFwKHJlcGxhY2VDb2x1bW5EZWZhdWx0VG8pO1xuICBjb25zdCBkYkNvbHVtbnMgPSBhbHBoYWJldGljYWwoZGJTZXQuY29sdW1ucywgKGEpID0+IGEubmFtZSkubWFwKHJlcGxhY2VDb2x1bW5EZWZhdWx0VG8pO1xuXG4gIC8qIOuUlOuyhOq5heyaqSDsvZTrk5wsIO2KueyglSDsu6zrn7zsl5DshJwg67aI7J287LmYIOuwnOyDne2VoCDrlYwg7ZmV7J24XG4gICAgICAgIGNvbnN0IGVudGl0eUNvbHVtbiA9IGVudGl0eVNldC5jb2x1bW5zLmZpbmQoXG4gICAgICAgICAgKGNvbCkgPT4gY29sLm5hbWUgPT09IFwicHJpY2Vfa3J3XCJcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgZGJDb2x1bW4gPSBkYlNldC5jb2x1bW5zLmZpbmQoXG4gICAgICAgICAgKGNvbCkgPT4gY29sLm5hbWUgPT09IFwicHJpY2Vfa3J3XCJcbiAgICAgICAgKTtcbiAgICAgICAgY29uc29sZS5kZWJ1Zyh7IGVudGl0eUNvbHVtbiwgZGJDb2x1bW4gfSk7XG4gICAgICAgICAqL1xuXG4gIGNvbnN0IGVudGl0eUluZGV4ZXMgPSBhbHBoYWJldGljYWwoZW50aXR5U2V0LmluZGV4ZXMsIChhKSA9PlxuICAgIFthLnR5cGUsIC4uLmEuY29sdW1ucy5tYXAoKGMpID0+IGMubmFtZSldLmpvaW4oXCItXCIpLFxuICApO1xuICBjb25zdCBkYkluZGV4ZXMgPSBhbHBoYWJldGljYWwoZGJTZXQuaW5kZXhlcywgKGEpID0+XG4gICAgW2EudHlwZSwgLi4uYS5jb2x1bW5zLm1hcCgoYykgPT4gYy5uYW1lKV0uam9pbihcIi1cIiksXG4gICk7XG5cbiAgY29uc3QgcmVwbGFjZU5vQWN0aW9uT25NeVNRTCA9IChmOiBNaWdyYXRpb25Gb3JlaWduKSA9PiB7XG4gICAgLy8gTXlTUUzsl5DshJwgUkVTVFJJQ1TsmYAgTk8gQUNUSU9O7J2AIOuPmeydvO2VqFxuICAgIGNvbnN0IHsgb25EZWxldGUsIG9uVXBkYXRlIH0gPSBmO1xuICAgIHJldHVybiB7XG4gICAgICAuLi5mLFxuICAgICAgb25VcGRhdGU6IG9uVXBkYXRlID09PSBcIlJFU1RSSUNUXCIgPyBcIk5PIEFDVElPTlwiIDogb25VcGRhdGUsXG4gICAgICBvbkRlbGV0ZTogb25EZWxldGUgPT09IFwiUkVTVFJJQ1RcIiA/IFwiTk8gQUNUSU9OXCIgOiBvbkRlbGV0ZSxcbiAgICB9O1xuICB9O1xuXG4gIGNvbnN0IGVudGl0eUZvcmVpZ25zID0gYWxwaGFiZXRpY2FsKGVudGl0eVNldC5mb3JlaWducywgKGEpID0+XG4gICAgW2EudG8sIC4uLmEuY29sdW1uc10uam9pbihcIi1cIiksXG4gICkubWFwKChmKSA9PiByZXBsYWNlTm9BY3Rpb25Pbk15U1FMKGYpKTtcbiAgY29uc3QgZGJGb3JlaWducyA9IGFscGhhYmV0aWNhbChkYlNldC5mb3JlaWducywgKGEpID0+IFthLnRvLCAuLi5hLmNvbHVtbnNdLmpvaW4oXCItXCIpKS5tYXAoKGYpID0+XG4gICAgcmVwbGFjZU5vQWN0aW9uT25NeVNRTChmKSxcbiAgKTtcblxuICAvLyDsgq3soJzrkKAg7Lus65+8IOuqqeuhnSDqs4TsgrBcbiAgY29uc3QgZHJvcHBpbmdDb2x1bW5zID0gZGlmZihkYkNvbHVtbnMsIGVudGl0eUNvbHVtbnMsIChjb2wpID0+IGNvbC5uYW1lKTtcblxuICBjb25zdCBhbHRlckNvZGVzOiAoR2VuTWlncmF0aW9uQ29kZSB8IEdlbk1pZ3JhdGlvbkNvZGVbXSB8IG51bGwpW10gPSBbXTtcblxuICAvLyAxLiBjb2x1bW5zQW5kSW5kZXhlcyDsspjrpqxcbiAgY29uc3Qgc2VhcmNoVGV4dENvbHVtbk5hbWVzID0gZ2V0U2VhcmNoVGV4dENvbHVtbk5hbWVzKGVudGl0eVNldC50YWJsZSk7XG4gIGNvbnN0IGlzRXF1YWxDb2x1bW5zID0gZXF1YWwoXG4gICAgZW50aXR5Q29sdW1ucy5tYXAoKGNvbHVtbikgPT4gbm9ybWFsaXplQ29sdW1uRm9yQ29tcGFyaXNvbihjb2x1bW4sIHNlYXJjaFRleHRDb2x1bW5OYW1lcykpLFxuICAgIGRiQ29sdW1ucy5tYXAoKGNvbHVtbikgPT4gbm9ybWFsaXplQ29sdW1uRm9yQ29tcGFyaXNvbihjb2x1bW4sIHNlYXJjaFRleHRDb2x1bW5OYW1lcykpLFxuICApO1xuICBjb25zdCBpc0VxdWFsSW5kZXhlcyA9IGVxdWFsKFxuICAgIGVudGl0eUluZGV4ZXMubWFwKHNldE1pZ3JhdGlvbkluZGV4RGVmYXVsdHMpLFxuICAgIGRiSW5kZXhlcy5tYXAoc2V0TWlncmF0aW9uSW5kZXhEZWZhdWx0cyksXG4gICk7XG4gIGlmICghaXNFcXVhbENvbHVtbnMgfHwgIWlzRXF1YWxJbmRleGVzKSB7XG4gICAgYWx0ZXJDb2Rlcy5wdXNoKFxuICAgICAgYXdhaXQgZ2VuZXJhdGVBbHRlckNvZGVfQ29sdW1uQW5kSW5kZXhlcyhcbiAgICAgICAgZW50aXR5U2V0LnRhYmxlLFxuICAgICAgICBlbnRpdHlDb2x1bW5zLFxuICAgICAgICBlbnRpdHlJbmRleGVzLFxuICAgICAgICBkYkNvbHVtbnMsXG4gICAgICAgIGRiSW5kZXhlcyxcbiAgICAgICAgZGJTZXQuZm9yZWlnbnMsXG4gICAgICAgIGNvbXBhcmVEQixcbiAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIC8vIDIuIGZvcmVpZ25zIOyymOumrCAo7IKt7KCc65CgIOy7rOufvCDsoJXrs7Qg7KCE64usKVxuICBpZiAoIWVxdWFsKGVudGl0eUZvcmVpZ25zLCBkYkZvcmVpZ25zKSkge1xuICAgIGFsdGVyQ29kZXMucHVzaChcbiAgICAgIGF3YWl0IGdlbmVyYXRlQWx0ZXJDb2RlX0ZvcmVpZ25zKFxuICAgICAgICBlbnRpdHlTZXQudGFibGUsXG4gICAgICAgIGVudGl0eUZvcmVpZ25zLFxuICAgICAgICBkYkZvcmVpZ25zLFxuICAgICAgICBkcm9wcGluZ0NvbHVtbnMsXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICBpZiAoYWx0ZXJDb2Rlcy5ldmVyeSgoYWx0ZXJDb2RlKSA9PiBhbHRlckNvZGUgPT09IG51bGwpKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgcmV0dXJuIGFsdGVyQ29kZXMuZmlsdGVyKChhbHRlckNvZGUpID0+IGFsdGVyQ29kZSAhPT0gbnVsbCkuZmxhdCgpO1xufVxuXG4vKipcbiAqIFBLIO2DgOyehSDrs4Dqsr0g7IucIOyXreywuOyhsCBGSyDsoJzslb3sobDqsbTsnYQg7LKY66as7ZWY64qUIOuniOydtOq3uOugiOydtOyFmCDsvZTrk5zrpbwg7IOd7ISx7ZWp64uI64ukLlxuICpcbiAqIFBLIO2DgOyehSDrs4Dqsr0g7IucIOyInOyEnDpcbiAqIDEuIEZLIOygnOyVveyhsOqxtCDsgq3soJwgKOyXreywuOyhsCDthYzsnbTruJTrk6QpXG4gKiAyLiDsnpDquLAg7LC47KGwIEZLIOyCreygnCAo7J6I64qUIOqyveyasClcbiAqIDMuIFBLIOygnOyVveyhsOqxtCDsgq3soJxcbiAqIDQuIFBLIOy7rOufvCDtg4DsnoUg67OA6rK9XG4gKiA1LiBGSyDsu6zrn7wg7YOA7J6FIOuzgOqyvSAo7Jet7LC47KGwIO2FjOydtOu4lOuTpClcbiAqIDYuIFBLIOygnOyVveyhsOqxtCDrs7XqtaxcbiAqIDcuIOyekOq4sCDssLjsobAgRksg67O16rWsXG4gKiA4LiBGSyDsoJzslb3sobDqsbQg67O16rWsXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUGtUeXBlQ2hhbmdlTWlncmF0aW9uKFxuICB0YWJsZTogc3RyaW5nLFxuICBlbnRpdHlJZENvbDogTWlncmF0aW9uQ29sdW1uLFxuICBkYklkQ29sOiBNaWdyYXRpb25Db2x1bW4sXG4gIF9lbnRpdHlDb2x1bW5zOiBNaWdyYXRpb25Db2x1bW5bXSxcbiAgX2VudGl0eUluZGV4ZXM6IE1pZ3JhdGlvbkluZGV4W10sXG4gIF9kYkNvbHVtbnM6IE1pZ3JhdGlvbkNvbHVtbltdLFxuICBfZGJJbmRleGVzOiBNaWdyYXRpb25JbmRleFtdLFxuICBfZGJGb3JlaWduczogTWlncmF0aW9uRm9yZWlnbltdLFxuICBjb21wYXJlREI6IEtuZXgsXG4pOiBQcm9taXNlPEdlbk1pZ3JhdGlvbkNvZGVbXT4ge1xuICAvLyDsl63ssLjsobAgRksg7KGw7ZqMICjsnbQg7YWM7J2067iU7J2YIFBL66W8IOywuOyhsO2VmOuKlCDri6Trpbgg7YWM7J2067iU7J2YIEZL65OkKVxuICBjb25zdCByZWZlcmVuY2luZ0ZLcyA9IGF3YWl0IFBvc3RncmVTUUxTY2hlbWFSZWFkZXIuZ2V0UmVmZXJlbmNpbmdGb3JlaWduS2V5cyhjb21wYXJlREIsIHRhYmxlKTtcblxuICAvLyDsnpDquLAg7LC47KGwIEZLIOu2hOumrCAo7JiIOiBEZXBhcnRtZW50LnBhcmVudF9pZCDihpIgRGVwYXJ0bWVudC5pZClcbiAgY29uc3Qgc2VsZlJlZmVyZW5jaW5nRktzID0gcmVmZXJlbmNpbmdGS3MuZmlsdGVyKChmaykgPT4gZmsudGFibGVOYW1lID09PSB0YWJsZSk7XG4gIGNvbnN0IGV4dGVybmFsUmVmZXJlbmNpbmdGS3MgPSByZWZlcmVuY2luZ0ZLcy5maWx0ZXIoKGZrKSA9PiBmay50YWJsZU5hbWUgIT09IHRhYmxlKTtcblxuICAvLyBQSyDsoJzslb3sobDqsbQg7J2066aEIOyhsO2ajFxuICBjb25zdCBwa0NvbnN0cmFpbnROYW1lID0gYCR7dGFibGV9X3BrZXlgO1xuXG4gIC8vIOyDiCBQSyDtg4DsnoXsl5Ag66ee64qUIFBvc3RncmVTUUwg7YOA7J6FIOusuOyekOyXtFxuICBjb25zdCBuZXdQa1BnVHlwZSA9IGdldFBrUGdUeXBlKGVudGl0eUlkQ29sKTtcbiAgY29uc3Qgb2xkUGtQZ1R5cGUgPSBnZXRQa1BnVHlwZShkYklkQ29sKTtcblxuICAvLyBVUCDsvZTrk5wg7IOd7ISxXG4gIGNvbnN0IHVwTGluZXM6IHN0cmluZ1tdID0gW107XG5cbiAgLy8gMS4g7Jm467aAIO2FjOydtOu4lOydmCBGSyDsoJzslb3sobDqsbQg7IKt7KCcXG4gIGZvciAoY29uc3QgZmsgb2YgZXh0ZXJuYWxSZWZlcmVuY2luZ0ZLcykge1xuICAgIHVwTGluZXMucHVzaChgICAvLyAke2ZrLnRhYmxlTmFtZX0uJHtmay5jb2x1bW5OYW1lfSBGSyDsoJzslb3sobDqsbQg7IKt7KCcYCk7XG4gICAgdXBMaW5lcy5wdXNoKFxuICAgICAgYCAgYXdhaXQga25leC5yYXcoJ0FMVEVSIFRBQkxFIFwiJHtmay50YWJsZU5hbWV9XCIgRFJPUCBDT05TVFJBSU5UIFwiJHtmay5jb25zdHJhaW50TmFtZX1cIicpO2AsXG4gICAgKTtcbiAgfVxuXG4gIC8vIDIuIOyekOq4sCDssLjsobAgRksg7IKt7KCcXG4gIGZvciAoY29uc3QgZmsgb2Ygc2VsZlJlZmVyZW5jaW5nRktzKSB7XG4gICAgdXBMaW5lcy5wdXNoKGAgIC8vIOyekOq4sCDssLjsobAgRksg7IKt7KCcOiAke2ZrLmNvbHVtbk5hbWV9YCk7XG4gICAgdXBMaW5lcy5wdXNoKFxuICAgICAgYCAgYXdhaXQga25leC5yYXcoJ0FMVEVSIFRBQkxFIFwiJHt0YWJsZX1cIiBEUk9QIENPTlNUUkFJTlQgXCIke2ZrLmNvbnN0cmFpbnROYW1lfVwiJyk7YCxcbiAgICApO1xuICB9XG5cbiAgLy8gMy4gUEsg7KCc7JW97KGw6rG0IOyCreygnFxuICB1cExpbmVzLnB1c2goYCAgLy8gUEsg7KCc7JW97KGw6rG0IOyCreygnGApO1xuICB1cExpbmVzLnB1c2goYCAgYXdhaXQga25leC5yYXcoJ0FMVEVSIFRBQkxFIFwiJHt0YWJsZX1cIiBEUk9QIENPTlNUUkFJTlQgXCIke3BrQ29uc3RyYWludE5hbWV9XCInKTtgKTtcblxuICAvLyA0LiBQSyDsu6zrn7wg7YOA7J6FIOuzgOqyvVxuICB1cExpbmVzLnB1c2goYCAgLy8gUEsg7Lus65+8IO2DgOyehSDrs4Dqsr1gKTtcbiAgdXBMaW5lcy5wdXNoKFxuICAgIGAgIGF3YWl0IGtuZXgucmF3KCdBTFRFUiBUQUJMRSBcIiR7dGFibGV9XCIgQUxURVIgQ09MVU1OIFwiaWRcIiBUWVBFICR7bmV3UGtQZ1R5cGV9IFVTSU5HIFwiaWRcIjo6JHtuZXdQa1BnVHlwZX0nKTtgLFxuICApO1xuXG4gIC8vIDUuIEZLIOy7rOufvCDtg4DsnoUg67OA6rK9ICjsl63ssLjsobAg7YWM7J2067iU65OkKSAtIOyekOq4sCDssLjsobAg7Y+s7ZWoXG4gIGZvciAoY29uc3QgZmsgb2YgcmVmZXJlbmNpbmdGS3MpIHtcbiAgICB1cExpbmVzLnB1c2goYCAgLy8gJHtmay50YWJsZU5hbWV9LiR7ZmsuY29sdW1uTmFtZX0g7Lus65+8IO2DgOyehSDrs4Dqsr1gKTtcbiAgICB1cExpbmVzLnB1c2goXG4gICAgICBgICBhd2FpdCBrbmV4LnJhdygnQUxURVIgVEFCTEUgXCIke2ZrLnRhYmxlTmFtZX1cIiBBTFRFUiBDT0xVTU4gXCIke2ZrLmNvbHVtbk5hbWV9XCIgVFlQRSAke25ld1BrUGdUeXBlfSBVU0lORyBcIiR7ZmsuY29sdW1uTmFtZX1cIjo6JHtuZXdQa1BnVHlwZX0nKTtgLFxuICAgICk7XG4gIH1cblxuICAvLyA2LiBQSyDsoJzslb3sobDqsbQg67O16rWsXG4gIHVwTGluZXMucHVzaChgICAvLyBQSyDsoJzslb3sobDqsbQg67O16rWsYCk7XG4gIHVwTGluZXMucHVzaChcbiAgICBgICBhd2FpdCBrbmV4LnJhdygnQUxURVIgVEFCTEUgXCIke3RhYmxlfVwiIEFERCBDT05TVFJBSU5UIFwiJHtwa0NvbnN0cmFpbnROYW1lfVwiIFBSSU1BUlkgS0VZIChcImlkXCIpJyk7YCxcbiAgKTtcblxuICAvLyA3LiDsnpDquLAg7LC47KGwIEZLIOuzteq1rFxuICBmb3IgKGNvbnN0IGZrIG9mIHNlbGZSZWZlcmVuY2luZ0ZLcykge1xuICAgIHVwTGluZXMucHVzaChgICAvLyDsnpDquLAg7LC47KGwIEZLIOuzteq1rDogJHtmay5jb2x1bW5OYW1lfWApO1xuICAgIHVwTGluZXMucHVzaChcbiAgICAgIGAgIGF3YWl0IGtuZXgucmF3KCdBTFRFUiBUQUJMRSBcIiR7dGFibGV9XCIgQUREIENPTlNUUkFJTlQgXCIke2ZrLmNvbnN0cmFpbnROYW1lfVwiIEZPUkVJR04gS0VZIChcIiR7ZmsuY29sdW1uTmFtZX1cIikgUkVGRVJFTkNFUyBcIiR7dGFibGV9XCIoXCJpZFwiKSBPTiBVUERBVEUgJHtmay5vblVwZGF0ZX0gT04gREVMRVRFICR7Zmsub25EZWxldGV9Jyk7YCxcbiAgICApO1xuICB9XG5cbiAgLy8gOC4g7Jm467aAIO2FjOydtOu4lOydmCBGSyDsoJzslb3sobDqsbQg67O16rWsXG4gIGZvciAoY29uc3QgZmsgb2YgZXh0ZXJuYWxSZWZlcmVuY2luZ0ZLcykge1xuICAgIHVwTGluZXMucHVzaChgICAvLyAke2ZrLnRhYmxlTmFtZX0uJHtmay5jb2x1bW5OYW1lfSBGSyDsoJzslb3sobDqsbQg67O16rWsYCk7XG4gICAgdXBMaW5lcy5wdXNoKFxuICAgICAgYCAgYXdhaXQga25leC5yYXcoJ0FMVEVSIFRBQkxFIFwiJHtmay50YWJsZU5hbWV9XCIgQUREIENPTlNUUkFJTlQgXCIke2ZrLmNvbnN0cmFpbnROYW1lfVwiIEZPUkVJR04gS0VZIChcIiR7ZmsuY29sdW1uTmFtZX1cIikgUkVGRVJFTkNFUyBcIiR7dGFibGV9XCIoXCJpZFwiKSBPTiBVUERBVEUgJHtmay5vblVwZGF0ZX0gT04gREVMRVRFICR7Zmsub25EZWxldGV9Jyk7YCxcbiAgICApO1xuICB9XG5cbiAgLy8gRE9XTiDsvZTrk5wg7IOd7ISxICjsl63siJwpXG4gIGNvbnN0IGRvd25MaW5lczogc3RyaW5nW10gPSBbXTtcblxuICAvLyAxLiDsmbjrtoAg7YWM7J2067iU7J2YIEZLIOygnOyVveyhsOqxtCDsgq3soJxcbiAgZm9yIChjb25zdCBmayBvZiBleHRlcm5hbFJlZmVyZW5jaW5nRktzKSB7XG4gICAgZG93bkxpbmVzLnB1c2goYCAgLy8gJHtmay50YWJsZU5hbWV9LiR7ZmsuY29sdW1uTmFtZX0gRksg7KCc7JW97KGw6rG0IOyCreygnGApO1xuICAgIGRvd25MaW5lcy5wdXNoKFxuICAgICAgYCAgYXdhaXQga25leC5yYXcoJ0FMVEVSIFRBQkxFIFwiJHtmay50YWJsZU5hbWV9XCIgRFJPUCBDT05TVFJBSU5UIFwiJHtmay5jb25zdHJhaW50TmFtZX1cIicpO2AsXG4gICAgKTtcbiAgfVxuXG4gIC8vIDIuIOyekOq4sCDssLjsobAgRksg7IKt7KCcXG4gIGZvciAoY29uc3QgZmsgb2Ygc2VsZlJlZmVyZW5jaW5nRktzKSB7XG4gICAgZG93bkxpbmVzLnB1c2goYCAgLy8g7J6Q6riwIOywuOyhsCBGSyDsgq3soJw6ICR7ZmsuY29sdW1uTmFtZX1gKTtcbiAgICBkb3duTGluZXMucHVzaChcbiAgICAgIGAgIGF3YWl0IGtuZXgucmF3KCdBTFRFUiBUQUJMRSBcIiR7dGFibGV9XCIgRFJPUCBDT05TVFJBSU5UIFwiJHtmay5jb25zdHJhaW50TmFtZX1cIicpO2AsXG4gICAgKTtcbiAgfVxuXG4gIC8vIDMuIFBLIOygnOyVveyhsOqxtCDsgq3soJxcbiAgZG93bkxpbmVzLnB1c2goYCAgLy8gUEsg7KCc7JW97KGw6rG0IOyCreygnGApO1xuICBkb3duTGluZXMucHVzaChcbiAgICBgICBhd2FpdCBrbmV4LnJhdygnQUxURVIgVEFCTEUgXCIke3RhYmxlfVwiIERST1AgQ09OU1RSQUlOVCBcIiR7cGtDb25zdHJhaW50TmFtZX1cIicpO2AsXG4gICk7XG5cbiAgLy8gNC4gUEsg7Lus65+8IO2DgOyehSDsm5Drs7VcbiAgZG93bkxpbmVzLnB1c2goYCAgLy8gUEsg7Lus65+8IO2DgOyehSDsm5Drs7VgKTtcbiAgZG93bkxpbmVzLnB1c2goXG4gICAgYCAgYXdhaXQga25leC5yYXcoJ0FMVEVSIFRBQkxFIFwiJHt0YWJsZX1cIiBBTFRFUiBDT0xVTU4gXCJpZFwiIFRZUEUgJHtvbGRQa1BnVHlwZX0gVVNJTkcgXCJpZFwiOjoke29sZFBrUGdUeXBlfScpO2AsXG4gICk7XG5cbiAgLy8gNS4gRksg7Lus65+8IO2DgOyehSDsm5Drs7UgKOyXreywuOyhsCDthYzsnbTruJTrk6QpXG4gIGZvciAoY29uc3QgZmsgb2YgcmVmZXJlbmNpbmdGS3MpIHtcbiAgICBkb3duTGluZXMucHVzaChgICAvLyAke2ZrLnRhYmxlTmFtZX0uJHtmay5jb2x1bW5OYW1lfSDsu6zrn7wg7YOA7J6FIOybkOuztWApO1xuICAgIGRvd25MaW5lcy5wdXNoKFxuICAgICAgYCAgYXdhaXQga25leC5yYXcoJ0FMVEVSIFRBQkxFIFwiJHtmay50YWJsZU5hbWV9XCIgQUxURVIgQ09MVU1OIFwiJHtmay5jb2x1bW5OYW1lfVwiIFRZUEUgJHtvbGRQa1BnVHlwZX0gVVNJTkcgXCIke2ZrLmNvbHVtbk5hbWV9XCI6OiR7b2xkUGtQZ1R5cGV9Jyk7YCxcbiAgICApO1xuICB9XG5cbiAgLy8gNi4gUEsg7KCc7JW97KGw6rG0IOuzteq1rFxuICBkb3duTGluZXMucHVzaChgICAvLyBQSyDsoJzslb3sobDqsbQg67O16rWsYCk7XG4gIGRvd25MaW5lcy5wdXNoKFxuICAgIGAgIGF3YWl0IGtuZXgucmF3KCdBTFRFUiBUQUJMRSBcIiR7dGFibGV9XCIgQUREIENPTlNUUkFJTlQgXCIke3BrQ29uc3RyYWludE5hbWV9XCIgUFJJTUFSWSBLRVkgKFwiaWRcIiknKTtgLFxuICApO1xuXG4gIC8vIDcuIOyekOq4sCDssLjsobAgRksg67O16rWsXG4gIGZvciAoY29uc3QgZmsgb2Ygc2VsZlJlZmVyZW5jaW5nRktzKSB7XG4gICAgZG93bkxpbmVzLnB1c2goYCAgLy8g7J6Q6riwIOywuOyhsCBGSyDrs7Xqtaw6ICR7ZmsuY29sdW1uTmFtZX1gKTtcbiAgICBkb3duTGluZXMucHVzaChcbiAgICAgIGAgIGF3YWl0IGtuZXgucmF3KCdBTFRFUiBUQUJMRSBcIiR7dGFibGV9XCIgQUREIENPTlNUUkFJTlQgXCIke2ZrLmNvbnN0cmFpbnROYW1lfVwiIEZPUkVJR04gS0VZIChcIiR7ZmsuY29sdW1uTmFtZX1cIikgUkVGRVJFTkNFUyBcIiR7dGFibGV9XCIoXCJpZFwiKSBPTiBVUERBVEUgJHtmay5vblVwZGF0ZX0gT04gREVMRVRFICR7Zmsub25EZWxldGV9Jyk7YCxcbiAgICApO1xuICB9XG5cbiAgLy8gOC4g7Jm467aAIO2FjOydtOu4lOydmCBGSyDsoJzslb3sobDqsbQg67O16rWsXG4gIGZvciAoY29uc3QgZmsgb2YgZXh0ZXJuYWxSZWZlcmVuY2luZ0ZLcykge1xuICAgIGRvd25MaW5lcy5wdXNoKGAgIC8vICR7ZmsudGFibGVOYW1lfS4ke2ZrLmNvbHVtbk5hbWV9IEZLIOygnOyVveyhsOqxtCDrs7XqtaxgKTtcbiAgICBkb3duTGluZXMucHVzaChcbiAgICAgIGAgIGF3YWl0IGtuZXgucmF3KCdBTFRFUiBUQUJMRSBcIiR7ZmsudGFibGVOYW1lfVwiIEFERCBDT05TVFJBSU5UIFwiJHtmay5jb25zdHJhaW50TmFtZX1cIiBGT1JFSUdOIEtFWSAoXCIke2ZrLmNvbHVtbk5hbWV9XCIpIFJFRkVSRU5DRVMgXCIke3RhYmxlfVwiKFwiaWRcIikgT04gVVBEQVRFICR7Zmsub25VcGRhdGV9IE9OIERFTEVURSAke2ZrLm9uRGVsZXRlfScpO2AsXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtcbiAgICAnaW1wb3J0IHR5cGUgeyBLbmV4IH0gZnJvbSBcImtuZXhcIjsnLFxuICAgIFwiXCIsXG4gICAgXCJleHBvcnQgYXN5bmMgZnVuY3Rpb24gdXAoa25leDogS25leCk6IFByb21pc2U8dm9pZD4ge1wiLFxuICAgIC4uLnVwTGluZXMsXG4gICAgXCJ9XCIsXG4gICAgXCJcIixcbiAgICBcImV4cG9ydCBhc3luYyBmdW5jdGlvbiBkb3duKGtuZXg6IEtuZXgpOiBQcm9taXNlPHZvaWQ+IHtcIixcbiAgICAuLi5kb3duTGluZXMsXG4gICAgXCJ9XCIsXG4gIF07XG5cbiAgY29uc3QgZm9ybWF0dGVkID0gYXdhaXQgZm9ybWF0Q29kZShsaW5lcy5qb2luKFwiXFxuXCIpLCBgc3JjL21pZ3JhdGlvbi8ke3RhYmxlfS50c2ApO1xuXG4gIHJldHVybiBbXG4gICAge1xuICAgICAgdGFibGUsXG4gICAgICB0aXRsZTogYGFsdGVyXyR7dGFibGV9X3BrX3R5cGVgLFxuICAgICAgZm9ybWF0dGVkLFxuICAgICAgdHlwZTogXCJub3JtYWxcIixcbiAgICB9LFxuICBdO1xufVxuXG4vKipcbiAqIFBLIOy7rOufvOydmCBQb3N0Z3JlU1FMIO2DgOyehSDrrLjsnpDsl7TsnYQg67CY7ZmY7ZWp64uI64ukLlxuICovXG5mdW5jdGlvbiBnZXRQa1BnVHlwZShjb2w6IE1pZ3JhdGlvbkNvbHVtbik6IHN0cmluZyB7XG4gIGlmIChjb2wudHlwZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiBjb2wubGVuZ3RoICE9PSB1bmRlZmluZWQgPyBgdmFyY2hhcigke2NvbC5sZW5ndGh9KWAgOiBcInRleHRcIjtcbiAgfVxuICBpZiAoY29sLnR5cGUgPT09IFwidXVpZFwiKSB7XG4gICAgcmV0dXJuIFwidXVpZFwiO1xuICB9XG4gIC8vIGludGVnZXLsnZgg6rK97JqwIHNlcmlhbC9pbnRlZ2VyIOq1rOu2hOydtCDtlYTsmpTtlZjsp4Drp4wsXG4gIC8vIO2DgOyehSDrs4Dqsr0g7Iuc7JeQ64qUIGludGVnZXLroZwg7LKY66as7ZWp64uI64ukLlxuICByZXR1cm4gXCJpbnRlZ2VyXCI7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBK1JBLFNBQVMsc0JBQXNCLFFBQStEO0NBQzVGLE9BQU8sT0FBTyxXQUFXLE9BQU87QUFDbEM7QUFFQSxTQUFTLDZCQUE2QixZQUFpRDtDQUNyRixNQUFNLFNBQXNDLENBQUM7Q0FDN0MsSUFBSSxRQUFRO0NBRVosT0FBTyxRQUFRLFdBQVcsUUFBUTtFQUNoQyxNQUFNLE9BQU8sV0FBVztFQUV4QixJQUFJLFNBQVMsUUFDWDtFQUdGLElBQUksS0FBSyxLQUFLLElBQUksR0FBRztHQUNuQixTQUFTO0dBQ1Q7RUFDRjtFQUVBLElBQUksV0FBVyxXQUFXLE1BQU0sS0FBSyxHQUFHO0dBQ3RDLE9BQU8sS0FBSztJQUFFLE1BQU07SUFBWSxPQUFPO0dBQUssQ0FBQztHQUM3QyxTQUFTO0dBQ1Q7RUFDRjtFQUVBLElBQUksV0FBVyxXQUFXLE1BQU0sS0FBSyxHQUFHO0dBQ3RDLE9BQU8sS0FBSztJQUFFLE1BQU07SUFBWSxPQUFPO0dBQUssQ0FBQztHQUM3QyxTQUFTO0dBQ1Q7RUFDRjtFQUVBLElBQUksU0FBUyxPQUFPLFNBQVMsT0FBTyxTQUFTLEtBQUs7R0FDaEQsT0FBTyxLQUFLO0lBQUUsTUFBTTtJQUFVLE9BQU87R0FBSyxDQUFDO0dBQzND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
|