sonamu 0.8.13 → 0.8.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/dist/api/sonamu.d.ts.map +1 -1
  2. package/dist/api/sonamu.js +2 -3
  3. package/dist/auth/auth-generator.d.ts +8 -0
  4. package/dist/auth/auth-generator.d.ts.map +1 -1
  5. package/dist/auth/auth-generator.js +33 -1
  6. package/dist/auth/better-auth-entities.d.ts.map +1 -1
  7. package/dist/auth/better-auth-entities.js +12 -2
  8. package/dist/bin/cli.js +18 -3
  9. package/dist/cone/cone-generator.js +10 -4
  10. package/dist/database/knex.d.ts.map +1 -1
  11. package/dist/database/knex.js +64 -2
  12. package/dist/database/puri.d.ts +9 -1
  13. package/dist/database/puri.d.ts.map +1 -1
  14. package/dist/database/puri.js +42 -1
  15. package/dist/database/puri.types.d.ts +2 -0
  16. package/dist/database/puri.types.d.ts.map +1 -1
  17. package/dist/database/puri.types.js +6 -2
  18. package/dist/entity/entity-manager.d.ts +149 -1
  19. package/dist/entity/entity-manager.d.ts.map +1 -1
  20. package/dist/entity/entity-manager.js +68 -4
  21. package/dist/migration/__tests__/code-generation.search-text.test.js +435 -0
  22. package/dist/migration/code-generation.d.ts.map +1 -1
  23. package/dist/migration/code-generation.js +696 -32
  24. package/dist/migration/migration-set.js +3 -1
  25. package/dist/migration/postgresql-schema-reader.d.ts +16 -2
  26. package/dist/migration/postgresql-schema-reader.d.ts.map +1 -1
  27. package/dist/migration/postgresql-schema-reader.js +281 -7
  28. package/dist/stream/sse.js +5 -3
  29. package/dist/template/__tests__/generated.template.search-text.test.js +99 -0
  30. package/dist/template/generated.template.test-d.js +24 -0
  31. package/dist/template/implementations/generated.template.d.ts.map +1 -1
  32. package/dist/template/implementations/generated.template.js +2 -2
  33. package/dist/template/implementations/init_types.template.d.ts.map +1 -1
  34. package/dist/template/implementations/init_types.template.js +11 -3
  35. package/dist/template/zod-converter.d.ts.map +1 -1
  36. package/dist/template/zod-converter.js +6 -2
  37. package/dist/testing/dev-test-routes.d.ts.map +1 -1
  38. package/dist/testing/dev-test-routes.js +5 -3
  39. package/dist/testing/fixture-generator.d.ts +13 -0
  40. package/dist/testing/fixture-generator.d.ts.map +1 -1
  41. package/dist/testing/fixture-generator.js +105 -8
  42. package/dist/testing/fixture-manager.d.ts.map +1 -1
  43. package/dist/testing/fixture-manager.js +19 -2
  44. package/dist/types/__tests__/entity-json-schema-search-text.test.js +256 -0
  45. package/dist/types/types.d.ts +494 -1
  46. package/dist/types/types.d.ts.map +1 -1
  47. package/dist/types/types.js +117 -13
  48. package/dist/ui/api.d.ts.map +1 -1
  49. package/dist/ui/api.js +14 -2
  50. package/dist/ui/cdd-service.d.ts +16 -14
  51. package/dist/ui/cdd-service.d.ts.map +1 -1
  52. package/dist/ui/cdd-service.js +145 -37
  53. package/dist/ui/cdd-types.d.ts +60 -0
  54. package/dist/ui/cdd-types.d.ts.map +1 -0
  55. package/dist/ui/cdd-types.js +3 -0
  56. package/dist/ui-web/assets/index-D4XFBV-f.css +1 -0
  57. package/dist/ui-web/assets/{index-CQ_S40bD.js → index-D_19-Pi4.js} +87 -87
  58. package/dist/ui-web/index.html +2 -2
  59. package/package.json +7 -3
  60. package/src/api/sonamu.ts +1 -2
  61. package/src/auth/auth-generator.ts +38 -0
  62. package/src/auth/better-auth-entities.ts +18 -1
  63. package/src/bin/cli.ts +15 -1
  64. package/src/cone/cone-generator.ts +9 -3
  65. package/src/database/knex.ts +62 -4
  66. package/src/database/puri.ts +71 -0
  67. package/src/database/puri.types.ts +2 -0
  68. package/src/entity/entity-manager.ts +95 -3
  69. package/src/migration/__tests__/code-generation.search-text.test.ts +390 -0
  70. package/src/migration/code-generation.ts +848 -34
  71. package/src/migration/migration-set.ts +2 -0
  72. package/src/migration/postgresql-schema-reader.ts +366 -9
  73. package/src/skills/sonamu/auth-migration.md +80 -0
  74. package/src/skills/sonamu/cdd.md +148 -28
  75. package/src/skills/sonamu/cone.md +16 -0
  76. package/src/skills/sonamu/entity-relations.md +1 -1
  77. package/src/skills/sonamu/fixture-cli.md +4 -0
  78. package/src/skills/sonamu/frontend.md +65 -0
  79. package/src/skills/sonamu/migration.md +3 -1
  80. package/src/skills/sonamu/model.md +28 -0
  81. package/src/skills/sonamu/workflow.md +12 -5
  82. package/src/stream/sse.ts +4 -2
  83. package/src/template/__tests__/generated.template.search-text.test.ts +89 -0
  84. package/src/template/generated.template.test-d.ts +46 -0
  85. package/src/template/implementations/generated.template.ts +4 -1
  86. package/src/template/implementations/init_types.template.ts +20 -5
  87. package/src/template/zod-converter.ts +5 -0
  88. package/src/testing/dev-test-routes.ts +4 -2
  89. package/src/testing/fixture-generator.ts +157 -9
  90. package/src/testing/fixture-manager.ts +15 -1
  91. package/src/types/__tests__/entity-json-schema-search-text.test.ts +179 -0
  92. package/src/types/types.ts +168 -12
  93. package/src/ui/api.ts +24 -1
  94. package/src/ui/cdd-service.ts +195 -55
  95. package/src/ui/cdd-types.ts +73 -0
  96. package/dist/ui-web/assets/index-egkMxKos.css +0 -1
@@ -77,6 +77,12 @@ export class FixtureGenerator {
77
77
  const cone = prop.cone;
78
78
  // 1. Relation prop 처리
79
79
  if (isRelationProp(prop)) {
80
+ // BelongsToOne / OneToOne(hasJoinColumn)은 FK 컬럼명({prop.name}_id)으로도 override를 받는다
81
+ const fkColName = `${prop.name}_id`;
82
+ if (fkColName in overrides && (isBelongsToOneRelationProp(prop) || isOneToOneRelationProp(prop) && prop.hasJoinColumn)) {
83
+ fixture[fkColName] = overrides[fkColName];
84
+ continue;
85
+ }
80
86
  const relationValue = await this.generateRelationValue(entity, prop, context);
81
87
  // BelongsToOne, OneToOne(hasJoinColumn)의 경우 foreign key 컬럼명으로 저장
82
88
  if (isBelongsToOneRelationProp(prop) || isOneToOneRelationProp(prop) && prop.hasJoinColumn) {
@@ -621,14 +627,17 @@ export class FixtureGenerator {
621
627
  const apiKey = this.getApiKey();
622
628
  const { createAnthropic } = await import("@ai-sdk/anthropic");
623
629
  const { generateText } = await import("ai");
624
- const { text } = await generateText({
630
+ const rowResponse = await generateText({
625
631
  model: createAnthropic({
626
632
  apiKey
627
633
  })(this.options.llmModel || "claude-sonnet-4-5"),
628
634
  prompt: this.buildRowLLMPrompt(llmProps, entity)
629
635
  });
636
+ if (!rowResponse || typeof rowResponse.text !== "string") {
637
+ throw new Error("Invalid LLM response");
638
+ }
630
639
  // 응답을 파싱하여 각 필드에 대한 결과를 캐시에 저장
631
- const rowResult = this.parseRowLLMResponse(text, llmProps);
640
+ const rowResult = this.parseRowLLMResponse(rowResponse.text, llmProps);
632
641
  for (const [fieldName, value] of Object.entries(rowResult)){
633
642
  this.llmCache.set(`${rowKey}:${fieldName}`, value);
634
643
  }
@@ -652,13 +661,16 @@ export class FixtureGenerator {
652
661
  const apiKey = this.getApiKey();
653
662
  const { createAnthropic } = await import("@ai-sdk/anthropic");
654
663
  const { generateText } = await import("ai");
655
- const { text } = await generateText({
664
+ const singleResponse = await generateText({
656
665
  model: createAnthropic({
657
666
  apiKey
658
667
  })(this.options.llmModel || "claude-sonnet-4-5"),
659
668
  prompt: this.buildLLMPrompt(fixtureHint, prop, entity)
660
669
  });
661
- const value = this.parseLLMResponse(text, prop.type);
670
+ if (!singleResponse || typeof singleResponse.text !== "string") {
671
+ throw new Error("Invalid LLM response");
672
+ }
673
+ const value = this.parseLLMResponse(singleResponse.text, prop.type);
662
674
  if (this.options.enableLLMCache) {
663
675
  this.llmCache.set(cacheKey, value);
664
676
  }
@@ -715,7 +727,12 @@ ${outputShape}
715
727
  const jsonText = text.trim().replace(/^```json\s*/i, "").replace(/```\s*$/, "").trim();
716
728
  let parsed;
717
729
  try {
718
- parsed = JSON.parse(jsonText);
730
+ const raw = JSON.parse(jsonText);
731
+ if (typeof raw !== "object" || raw === null || Array.isArray(raw)) {
732
+ !isTest() && console.warn("[FixtureGenerator] Row LLM response is not a plain object:", text);
733
+ return {};
734
+ }
735
+ parsed = raw;
719
736
  } catch {
720
737
  !isTest() && console.warn("[FixtureGenerator] Failed to parse row LLM response:", text);
721
738
  return {};
@@ -1173,8 +1190,88 @@ Rules:
1173
1190
  }
1174
1191
  // 3. targetDb에 삽입 (FixtureManager가 의존성 정렬 처리)
1175
1192
  const results = await FixtureManager.insertFixtures(this.targetDbName, fixtureRecords);
1176
- !isTest() && console.log(chalk.green(`Generated and saved ${results.length} fixtures to ${this.targetDbName}`));
1177
- return results;
1193
+ // 4. companion fixtures 생성 (fixtureCompanions가 선언된 경우)
1194
+ const companionResults = await this.generateCompanions(specs, results);
1195
+ const total = results.length + companionResults.length;
1196
+ !isTest() && console.log(chalk.green(`Generated and saved ${total} fixtures to ${this.targetDbName}`));
1197
+ return [
1198
+ ...results,
1199
+ ...companionResults
1200
+ ];
1201
+ }
1202
+ /**
1203
+ * 부모 fixture 결과를 기반으로 fixtureCompanions에 선언된 companion Entity를 생성합니다.
1204
+ *
1205
+ * generateBatch()에서만 호출되며, companion 생성 시 재귀를 방지하기 위해
1206
+ * generateBatch()를 다시 호출하지 않고 직접 삽입합니다.
1207
+ */ async generateCompanions(specs, parentResults) {
1208
+ const allResults = [];
1209
+ const processedEntities = new Set();
1210
+ for (const spec of specs){
1211
+ if (processedEntities.has(spec.entity)) continue;
1212
+ processedEntities.add(spec.entity);
1213
+ const entity = this.entityManager.get(spec.entity);
1214
+ const idProp = entity.props.find((p)=>p.name === "id");
1215
+ const companions = idProp?.cone?.fixtureCompanions;
1216
+ if (!companions || companions.length === 0) continue;
1217
+ const entityResults = parentResults.filter((r)=>r.entityId === spec.entity);
1218
+ if (entityResults.length === 0) continue;
1219
+ for (const companion of companions){
1220
+ // companion entity에서 부모 entity로의 BelongsToOne FK 컬럼명 파악
1221
+ const companionEntity = this.entityManager.get(companion.entity);
1222
+ const fkProp = companionEntity.props.find((p)=>isRelationProp(p) && isBelongsToOneRelationProp(p) && p.with === spec.entity);
1223
+ if (!fkProp) {
1224
+ !isTest() && console.warn(chalk.yellow(`[Companion] No BelongsToOne relation from ${companion.entity} to ${spec.entity}. Skipping.`));
1225
+ continue;
1226
+ }
1227
+ const fkColName = `${fkProp.name}_id`;
1228
+ // companion의 idProp, usesSequence, count는 companion 단위로 고정
1229
+ const companionIdProp = companionEntity.props.find((p)=>p.name === "id");
1230
+ const usesSequence = companionIdProp?.type === "integer" || companionIdProp?.type === "bigInteger" || companionIdProp?.cone?.fixtureStrategy === "sequence";
1231
+ const companionCount = companion.count ?? 1;
1232
+ // 각 parent result에 대해 companion fixture 생성
1233
+ const context = this.createContext();
1234
+ const companionFixtureRecords = [];
1235
+ for (const parentResult of entityResults){
1236
+ const resolvedOverrides = this.resolveTemplateOverrides(companion.overrides ?? {}, parentResult.data);
1237
+ resolvedOverrides[fkColName] = parentResult.data.id;
1238
+ for(let i = 0; i < companionCount; i++){
1239
+ const fixture = await this.generate(companion.entity, resolvedOverrides, context);
1240
+ const dataForRecord = usesSequence ? {
1241
+ ...fixture,
1242
+ id: Math.floor(Math.random() * 1000000)
1243
+ } : fixture;
1244
+ const records = await FixtureManager.createFixtureRecord(companionEntity, dataForRecord, {
1245
+ singleRecord: true
1246
+ });
1247
+ companionFixtureRecords.push(...records);
1248
+ }
1249
+ }
1250
+ const companionResults = await FixtureManager.insertFixtures(this.targetDbName, companionFixtureRecords);
1251
+ allResults.push(...companionResults);
1252
+ !isTest() && console.log(chalk.green(`[Companion] Generated ${companionResults.length} ${companion.entity} fixtures`));
1253
+ }
1254
+ }
1255
+ return allResults;
1256
+ }
1257
+ /**
1258
+ * overrides 값의 "{{fieldName}}" 템플릿을 부모 fixture 데이터로 치환합니다.
1259
+ *
1260
+ * 예: { "account_id": "{{email}}" } → { "account_id": "user@example.com" }
1261
+ */ resolveTemplateOverrides(overrides, parentData) {
1262
+ const resolved = {};
1263
+ for (const [key, value] of Object.entries(overrides)){
1264
+ if (typeof value === "string" && value.startsWith("{{") && value.endsWith("}}")) {
1265
+ const fieldName = value.slice(2, -2).trim();
1266
+ if (!(fieldName in parentData)) {
1267
+ throw new Error(`템플릿 필드 "${fieldName}"이(가) 부모 fixture 데이터에 존재하지 않습니다 (override key: "${key}")`);
1268
+ }
1269
+ resolved[key] = parentData[fieldName];
1270
+ } else {
1271
+ resolved[key] = value;
1272
+ }
1273
+ }
1274
+ return resolved;
1178
1275
  }
1179
1276
  /**
1180
1277
  * 실제 DB(sourceDb)에서 데이터를 조회하여 fixture DB(targetDb)에 import합니다.
@@ -1235,4 +1332,4 @@ Rules:
1235
1332
  }
1236
1333
  }
1237
1334
 
1238
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0aW5nL2ZpeHR1cmUtZ2VuZXJhdG9yLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCB0eXBlIHsgS25leCB9IGZyb20gXCJrbmV4XCI7XG5pbXBvcnQgdHlwZSB7IEVudGl0eSB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5XCI7XG5pbXBvcnQgdHlwZSB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgdHlwZSB7IEVudGl0eVByb3AsIEZpeHR1cmVJbXBvcnRSZXN1bHQsIEZpeHR1cmVSZWNvcmQgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wLCBpc09uZVRvT25lUmVsYXRpb25Qcm9wLCBpc1JlbGF0aW9uUHJvcCB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgaXNUZXN0IH0gZnJvbSBcIi4uL3V0aWxzL2NvbnRyb2xsZXJcIjtcbmltcG9ydCB7XG4gIERhdGFFeHBsb3JlcixcbiAgdHlwZSBFeHBsb3JlV2l0aFJlbGF0aW9uc09wdGlvbnMsXG4gIHR5cGUgRXhwbG9yZVdpdGhSZWxhdGlvbnNSZXN1bHQsXG59IGZyb20gXCIuL2RhdGEtZXhwbG9yZXJcIjtcbmltcG9ydCB7IHR5cGUgRmFrZXJNYXBwaW5ncywgZmFrZXJNYXBwaW5ncyB9IGZyb20gXCIuL2Zha2VyLW1hcHBpbmdzXCI7XG5pbXBvcnQgeyBGaXh0dXJlTWFuYWdlciB9IGZyb20gXCIuL2ZpeHR1cmUtbWFuYWdlclwiO1xuXG5leHBvcnQgdHlwZSBMb2NhbGUgPSBcImtvXCIgfCBcImVuXCIgfCBcImphXCI7XG5cbmV4cG9ydCB0eXBlIEZpeHR1cmVHZW5lcmF0b3JPcHRpb25zID0ge1xuICBsb2NhbGU/OiBMb2NhbGU7XG4gIHVzZUxMTT86IGJvb2xlYW47XG4gIGVuYWJsZUxMTUNhY2hlPzogYm9vbGVhbjtcbiAgbGxtTW9kZWw/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBHZW5lcmF0b3JDb250ZXh0ID0ge1xuICAvKiog7IOd7ISxIOykkeyduCBmaXh0dXJl65OkICjrqZTrqqjrpqwg7IOBKSAqL1xuICBmaXh0dXJlczogTWFwPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xuXG4gIC8qKiDssLjsobAg642w7J207YSwIOy6kOyLnCAoRGF0YUV4cGxvcmVyIOqysOqzvCkgKi9cbiAgcmVmZXJlbmNlQ2FjaGU6IE1hcDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+W10+O1xuXG4gIC8qKiDsnbTrr7ggaW1wb3J065CcIOugiOy9lOuTnOulvCDstpTsoIHtlZjsl6wg7KSR67O1IGltcG9ydOulvCDrsKnsp4Dtlanri4jri6QgKi9cbiAgaW1wb3J0ZWRSZWNvcmRzOiBTZXQ8c3RyaW5nPjsgLy8gXCJVc2VyIzEyM1wiXG59O1xuXG5leHBvcnQgY2xhc3MgRml4dHVyZUdlbmVyYXRvciB7XG4gIHByaXZhdGUgZGF0YUV4cGxvcmVyOiBEYXRhRXhwbG9yZXI7XG4gIHByaXZhdGUgbG9jYWxlOiBMb2NhbGU7XG4gIHByaXZhdGUgbWFwcGluZ3M6IEZha2VyTWFwcGluZ3M7XG4gIHByaXZhdGUgbGxtQ2FjaGU6IE1hcDxzdHJpbmcsIHVua25vd24+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIGVudGl0eUNhY2hlOiBNYXA8c3RyaW5nLCBFbnRpdHk+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIG9wdGlvbnM6IEZpeHR1cmVHZW5lcmF0b3JPcHRpb25zO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgc291cmNlRGI6IEtuZXgsXG4gICAgLy8gRml4dHVyZU1hbmFnZXIuaW5zZXJ0Rml4dHVyZXPqsIAgZGJOYW1lIOusuOyekOyXtOydhCDrsJvquLAg65WM66y47JeQIOyngeygkSDsgqzsmqntlZjsp4Ag7JWK7Iq164uI64ukXG4gICAgLy8g66+4656YIO2ZleyepeyEseydhCDsnITtlbQgQVBJIOyLnOq3uOuLiOyymOyXkOuKlCDtj6ztlajsi5zsvLDsirXri4jri6RcbiAgICBfdGFyZ2V0RGI6IEtuZXgsXG4gICAgcHJpdmF0ZSB0YXJnZXREYk5hbWU6IFwiZml4dHVyZVwiIHwgXCJ0ZXN0XCIgfCBcInByb2R1Y3Rpb25fbWFzdGVyXCIsXG4gICAgcHJpdmF0ZSBlbnRpdHlNYW5hZ2VyOiB0eXBlb2YgRW50aXR5TWFuYWdlcixcbiAgICBvcHRpb25zPzogRml4dHVyZUdlbmVyYXRvck9wdGlvbnMsXG4gICkge1xuICAgIHRoaXMuZGF0YUV4cGxvcmVyID0gbmV3IERhdGFFeHBsb3Jlcihzb3VyY2VEYiwgZW50aXR5TWFuYWdlcik7XG4gICAgdGhpcy5sb2NhbGUgPSBvcHRpb25zPy5sb2NhbGUgfHwgXCJrb1wiO1xuICAgIHRoaXMubWFwcGluZ3MgPSBmYWtlck1hcHBpbmdzO1xuICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgIGxvY2FsZTogb3B0aW9ucz8ubG9jYWxlIHx8IFwia29cIixcbiAgICAgIHVzZUxMTTogb3B0aW9ucz8udXNlTExNIHx8IGZhbHNlLFxuICAgICAgZW5hYmxlTExNQ2FjaGU6IG9wdGlvbnM/LmVuYWJsZUxMTUNhY2hlICE9PSBmYWxzZSxcbiAgICAgIGxsbU1vZGVsOiBvcHRpb25zPy5sbG1Nb2RlbCB8fCBcImNsYXVkZS1zb25uZXQtNC01XCIsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXh0dXJlIOyDneyEsSAo64uo7J28KVxuICAgKiBAcmV0dXJucyDsg53shLHrkJwgZml4dHVyZSDrjbDsnbTthLAgKOuplOuqqOumrCDsg4EpXG4gICAqL1xuICBhc3luYyBnZW5lcmF0ZShcbiAgICBlbnRpdHlOYW1lOiBzdHJpbmcsXG4gICAgb3ZlcnJpZGVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9LFxuICAgIGNvbnRleHQ6IEdlbmVyYXRvckNvbnRleHQgPSB0aGlzLmNyZWF0ZUNvbnRleHQoKSxcbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xuICAgIC8vIEVudGl0eSDsupDsi7E6IO2FjOyKpO2KuOyXkOyEnCBlbnRpdHkgY29uZSDsiJjsoJXsnbQg67CY7JiB65CY64+E66GdIOuztOyepVxuICAgIGxldCBlbnRpdHkgPSB0aGlzLmVudGl0eUNhY2hlLmdldChlbnRpdHlOYW1lKTtcbiAgICBpZiAoIWVudGl0eSkge1xuICAgICAgZW50aXR5ID0gdGhpcy5lbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlOYW1lKTtcbiAgICAgIHRoaXMuZW50aXR5Q2FjaGUuc2V0KGVudGl0eU5hbWUsIGVudGl0eSk7XG4gICAgfVxuXG4gICAgY29uc3QgdGVtcElkID0gYCR7ZW50aXR5TmFtZX0jdGVtcCMke0RhdGUubm93KCl9YDsgLy8g7J6E7IucIElEXG5cbiAgICAvLyBMTE0gcm93IOuLqOychCDsg53shLHsnYQg7JyE7ZWcIOqzoOycoCDtgqQgKOqwmeydgCByb3fsnZgg7ZWE65Oc65Ok7J20IOuPmeydvO2VnCByb3dLZXnrpbwg6rO17JygKVxuICAgIGNvbnN0IHJvd0tleSA9IHRoaXMub3B0aW9ucy51c2VMTE0gPyBgJHtlbnRpdHlOYW1lfSNyb3cjJHtEYXRlLm5vdygpfWAgOiB1bmRlZmluZWQ7XG5cbiAgICAvLyDqsIEgcHJvcOuzhCDqsJIg7IOd7ISxXG4gICAgY29uc3QgZml4dHVyZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICAgIGZvciAoY29uc3QgcHJvcCBvZiBlbnRpdHkucHJvcHMpIHtcbiAgICAgIC8vIFZpcnR1YWwgcHJvcOydgCDsiqTtgrVcbiAgICAgIGlmIChcInZpcnR1YWxcIiBpbiBwcm9wICYmIHByb3AudmlydHVhbCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gaWQgcHJvcCDsspjrpqxcbiAgICAgIGlmIChwcm9wLm5hbWUgPT09IFwiaWRcIikge1xuICAgICAgICBpZiAoXCJjb25lXCIgaW4gcHJvcCAmJiBwcm9wLmNvbmU/LmZpeHR1cmVTdHJhdGVneSA9PT0gXCJzZXF1ZW5jZVwiKSB7XG4gICAgICAgICAgLy8gREIgc2VxdWVuY2XqsIAg7J6Q64+ZIO2VoOuLue2VmOuvgOuhnCDsiqTtgrUgKFVzZXIg65OxKVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wLnR5cGUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAvLyBEQiBERUZBVUxUIOyXhuuKlCBzdHJpbmcgUEs6IGFscGhhbnVtZXJpYyAzMuyekCDsg53shLEgKGJldHRlci1hdXRoIOyKpO2DgOydvClcbiAgICAgICAgICBjb25zdCB7IGZha2VyOiBfZmFrZXIgfSA9IGF3YWl0IGltcG9ydChcIkBmYWtlci1qcy9mYWtlclwiKTtcbiAgICAgICAgICBmaXh0dXJlW3Byb3AubmFtZV0gPSBfZmFrZXIuc3RyaW5nLmFscGhhbnVtZXJpYygzMik7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb3AudHlwZSA9PT0gXCJ1dWlkXCIpIHtcbiAgICAgICAgICBjb25zdCB7IGZha2VyOiBfZmFrZXIgfSA9IGF3YWl0IGltcG9ydChcIkBmYWtlci1qcy9mYWtlclwiKTtcbiAgICAgICAgICBmaXh0dXJlW3Byb3AubmFtZV0gPSBfZmFrZXIuc3RyaW5nLnV1aWQoKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpbnRlZ2VyL2JpZ0ludGVnZXIgUEs6IGdlbmVyYXRlQmF0Y2jsl5DshJwgdGVtcElk66W8IOuEo+ycvOuvgOuhnCDsl6zquLDshKAg7Iqk7YK1XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBvdmVycmlkZeqwgCDsnojsnLzrqbQg7IKs7JqpXG4gICAgICBpZiAocHJvcC5uYW1lIGluIG92ZXJyaWRlcykge1xuICAgICAgICBmaXh0dXJlW3Byb3AubmFtZV0gPSBvdmVycmlkZXNbcHJvcC5uYW1lXTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGNvbmXsl5DshJwg7IOd7ISxIOyghOuetSDtmZXsnbhcbiAgICAgIGNvbnN0IGNvbmUgPSBwcm9wLmNvbmU7XG5cbiAgICAgIC8vIDEuIFJlbGF0aW9uIHByb3Ag7LKY66asXG4gICAgICBpZiAoaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgY29uc3QgcmVsYXRpb25WYWx1ZSA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVSZWxhdGlvblZhbHVlKGVudGl0eSwgcHJvcCwgY29udGV4dCk7XG4gICAgICAgIC8vIEJlbG9uZ3NUb09uZSwgT25lVG9PbmUoaGFzSm9pbkNvbHVtbinsnZgg6rK97JqwIGZvcmVpZ24ga2V5IOy7rOufvOuqheycvOuhnCDsoIDsnqVcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKHByb3ApIHx8XG4gICAgICAgICAgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiYgcHJvcC5oYXNKb2luQ29sdW1uKVxuICAgICAgICApIHtcbiAgICAgICAgICBmaXh0dXJlW2Ake3Byb3AubmFtZX1faWRgXSA9IHJlbGF0aW9uVmFsdWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZml4dHVyZVtwcm9wLm5hbWVdID0gcmVsYXRpb25WYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gMi4gY29uZS5ub3RlICsgTExNIOyCrOyaqSAodXNlTExN7J2066m0IGZpeHR1cmVHZW5lcmF0b3Lrs7Tri6Qg7Jqw7ISgKVxuICAgICAgaWYgKGNvbmU/Lm5vdGUgJiYgdGhpcy5vcHRpb25zLnVzZUxMTSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGZpeHR1cmVbcHJvcC5uYW1lXSA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVXaXRoTExNKGNvbmUubm90ZSwgcHJvcCwgZW50aXR5LCByb3dLZXkpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIGBbRml4dHVyZUdlbmVyYXRvcl0gTExNIGdlbmVyYXRpb24gZmFpbGVkIGZvciAke2VudGl0eS5pZH0uJHtwcm9wLm5hbWV9LCBmYWxsaW5nIGJhY2sgdG8gZml4dHVyZUdlbmVyYXRvciBvciBkZWZhdWx0YCxcbiAgICAgICAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogZXJyb3IsXG4gICAgICAgICAgKTtcbiAgICAgICAgICAvLyBmYWxsYmFjazogZml4dHVyZUdlbmVyYXRvciDihpIgZml4dHVyZURlZmF1bHQg4oaSIOq4sOuzuOqwkuycvOuhnCDqs4Tsho1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyAzLiBmaXh0dXJlR2VuZXJhdG9yIOyCrOyaqVxuICAgICAgaWYgKGNvbmU/LmZpeHR1cmVHZW5lcmF0b3IpIHtcbiAgICAgICAgZml4dHVyZVtwcm9wLm5hbWVdID0gYXdhaXQgdGhpcy5leGVjdXRlR2VuZXJhdG9yKFxuICAgICAgICAgIGNvbmUuZml4dHVyZUdlbmVyYXRvciBhcyBzdHJpbmcsXG4gICAgICAgICAgcHJvcCxcbiAgICAgICAgICBlbnRpdHksXG4gICAgICAgICk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyA0LiBmaXh0dXJlRGVmYXVsdCDsgqzsmqlcbiAgICAgIGlmIChjb25lPy5maXh0dXJlRGVmYXVsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGZpeHR1cmVbcHJvcC5uYW1lXSA9IGNvbmUuZml4dHVyZURlZmF1bHQ7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyA1LiDtg4DsnoXrs4Qg6riw67O4IOyDneyEsVxuICAgICAgZml4dHVyZVtwcm9wLm5hbWVdID0gYXdhaXQgdGhpcy5nZW5lcmF0ZURlZmF1bHRWYWx1ZShwcm9wLCBlbnRpdHkpO1xuICAgIH1cblxuICAgIC8vIDYuIGVtYWlsIO2VhOuTnOqwgCDsnojqs6AgbmFtZSDtlYTrk5zqsIAg7J6I7Jy866m0LCBlbWFpbOydmCDroZzsu6wg7YyM7Yq466W8IG5hbWUg6riw67CY7Jy866GcIOuztOyglVxuICAgIGlmIChcImVtYWlsXCIgaW4gZml4dHVyZSAmJiB0eXBlb2YgZml4dHVyZS5lbWFpbCA9PT0gXCJzdHJpbmdcIiAmJiAhKFwiZW1haWxcIiBpbiBvdmVycmlkZXMpKSB7XG4gICAgICBjb25zdCBuYW1lVmFsdWUgPSBmaXh0dXJlLm5hbWUgfHwgZml4dHVyZS51c2VybmFtZSB8fCBmaXh0dXJlLmZ1bGxfbmFtZSB8fCBmaXh0dXJlLm5hbWVfZW47XG4gICAgICBpZiAobmFtZVZhbHVlICYmIHR5cGVvZiBuYW1lVmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgY29uc3QgZG9tYWluID0gZml4dHVyZS5lbWFpbC5zcGxpdChcIkBcIilbMV0gfHwgXCJleGFtcGxlLmNvbVwiO1xuICAgICAgICBjb25zdCByb21hbml6ZWQgPSBhd2FpdCB0aGlzLnJvbWFuaXplTmFtZShuYW1lVmFsdWUpO1xuICAgICAgICBmaXh0dXJlLmVtYWlsID0gYCR7cm9tYW5pemVkfUAke2RvbWFpbn1gO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDcuIHBhc3N3b3JkIO2VhOuTnCDslZTtmLjtmZRcbiAgICBpZiAoXCJwYXNzd29yZFwiIGluIGZpeHR1cmUgJiYgZml4dHVyZS5wYXNzd29yZCAmJiB0eXBlb2YgZml4dHVyZS5wYXNzd29yZCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgY29uc3QgYmNyeXB0ID0gYXdhaXQgaW1wb3J0KFwiYmNyeXB0XCIpO1xuICAgICAgZml4dHVyZS5wYXNzd29yZCA9IGF3YWl0IGJjcnlwdC5oYXNoKGZpeHR1cmUucGFzc3dvcmQsIDEwKTtcbiAgICB9XG5cbiAgICBjb250ZXh0LmZpeHR1cmVzLnNldCh0ZW1wSWQsIGZpeHR1cmUpO1xuICAgIHJldHVybiBmaXh0dXJlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbGF0aW9uIOqwkiDsg53shLEgKyDsnpDrj5kgSW1wb3J0XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlUmVsYXRpb25WYWx1ZShcbiAgICBlbnRpdHk6IEVudGl0eSxcbiAgICBwcm9wOiBFbnRpdHlQcm9wLFxuICAgIGNvbnRleHQ6IEdlbmVyYXRvckNvbnRleHQsXG4gICk6IFByb21pc2U8bnVtYmVyIHwgbnVsbD4ge1xuICAgIGlmICghaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRml4dHVyZUdlbmVyYXRvcjogJHtlbnRpdHkuaWR9LiR7cHJvcC5uYW1lfSBpcyBub3QgYSByZWxhdGlvbiBwcm9wYCk7XG4gICAgfVxuXG4gICAgLy8gQmVsb25nc1RvT25lLCBPbmVUb09uZShoYXNKb2luQ29sdW1uKeunjCDsspjrpqxcbiAgICBpZiAoXG4gICAgICAhaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiZcbiAgICAgICEoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChwcm9wKSAmJiBwcm9wLmhhc0pvaW5Db2x1bW4pXG4gICAgKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBjb25lID0gcHJvcC5jb25lO1xuICAgIGNvbnN0IGRhdGFTb3VyY2UgPSBjb25lPy5kYXRhU291cmNlO1xuXG4gICAgLy8gRGF0YUV4cGxvcmVy66GcIOywuOyhsCDrjbDsnbTthLAg7KGw7ZqMIChzb3VyY2VEYilcbiAgICAvLyDqtIDqs4Qg7LK07J247J2EIOuUsOudvOqwgOq4sCDsnITtlbQgZXhwbG9yZVdpdGhSZWxhdGlvbnMg7IKs7JqpXG4gICAgaWYgKGRhdGFTb3VyY2UpIHtcbiAgICAgIGNvbnN0IGNhY2hlS2V5ID0gYCR7cHJvcC53aXRofToke0pTT04uc3RyaW5naWZ5KGRhdGFTb3VyY2UpfWA7XG5cbiAgICAgIGlmICghY29udGV4dC5yZWZlcmVuY2VDYWNoZS5oYXMoY2FjaGVLZXkpKSB7XG4gICAgICAgIGNvbnN0IGV4cGxvcmVSZXN1bHQgPSBhd2FpdCB0aGlzLmRhdGFFeHBsb3Jlci5leHBsb3JlV2l0aFJlbGF0aW9ucyhwcm9wLndpdGgsIHtcbiAgICAgICAgICBzdHJhdGVneTogZGF0YVNvdXJjZS5zdHJhdGVneSxcbiAgICAgICAgICBsaW1pdDpcbiAgICAgICAgICAgICgoZGF0YVNvdXJjZS5jb25maWcgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQpPy5saW1pdCBhc1xuICAgICAgICAgICAgICB8IG51bWJlclxuICAgICAgICAgICAgICB8IHVuZGVmaW5lZCkgfHwgMTAsXG4gICAgICAgICAgaW5jbHVkZVJlbGF0aW9uczogdHJ1ZSxcbiAgICAgICAgICBtYXhEZXB0aDogMyxcbiAgICAgICAgICAuLi4oZGF0YVNvdXJjZS5jb25maWcgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQpLFxuICAgICAgICB9KTtcbiAgICAgICAgY29udGV4dC5yZWZlcmVuY2VDYWNoZS5zZXQoY2FjaGVLZXksIGV4cGxvcmVSZXN1bHQubWFpbi5yZWNvcmRzKTtcblxuICAgICAgICAvLyDsobDtmoztlZwg642w7J207YSw7JmAIOq0gOqzhOuQnCDrqqjrk6Ag7JeU7Yuw7Yuw66W8IHRhcmdldERi7JeQIGltcG9ydFxuICAgICAgICBhd2FpdCB0aGlzLmltcG9ydEV4cGxvcmVSZXN1bHQoZXhwbG9yZVJlc3VsdCwgY29udGV4dCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNhbmRpZGF0ZXMgPSBjb250ZXh0LnJlZmVyZW5jZUNhY2hlLmdldChjYWNoZUtleSk7XG4gICAgICBpZiAoY2FuZGlkYXRlcyAmJiBjYW5kaWRhdGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgLy8g656c642k7ZWY6rKMIO2VmOuCmCDshKDtg51cbiAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSBjYW5kaWRhdGVzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGNhbmRpZGF0ZXMubGVuZ3RoKV07XG4gICAgICAgIHJldHVybiBzZWxlY3RlZC5pZCBhcyBudW1iZXI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZGF0YVNvdXJjZeqwgCDsl4bsnYQg65WMIOyekOuPmeycvOuhnCBmaXh0dXJlIERC7JeQ7IScIOyhsO2ajCDsi5zrj4RcbiAgICAvLyDqtIDqs4Qg7LK07J247J2EIOuUsOudvOqwgOq4sCDsnITtlbQgZXhwbG9yZVdpdGhSZWxhdGlvbnMg7IKs7JqpXG4gICAgY29uc3QgYXV0b0tleSA9IGAke3Byb3Aud2l0aH06YXV0b2A7XG4gICAgaWYgKCFjb250ZXh0LnJlZmVyZW5jZUNhY2hlLmhhcyhhdXRvS2V5KSkge1xuICAgICAgLy8gZml4dHVyZSBEQihzb3VyY2VEYinsl5DshJwg7J6Q64+ZIOyhsO2ajCAo6rSA6rOEIO2PrO2VqClcbiAgICAgIGNvbnN0IGF1dG9FeHBsb3JlUmVzdWx0ID0gYXdhaXQgdGhpcy5kYXRhRXhwbG9yZXIuZXhwbG9yZVdpdGhSZWxhdGlvbnMocHJvcC53aXRoLCB7XG4gICAgICAgIHN0cmF0ZWd5OiBcInJhbmRvbVwiLFxuICAgICAgICBsaW1pdDogMTAsXG4gICAgICAgIGluY2x1ZGVSZWxhdGlvbnM6IHRydWUsXG4gICAgICAgIG1heERlcHRoOiAzLFxuICAgICAgfSk7XG4gICAgICBjb250ZXh0LnJlZmVyZW5jZUNhY2hlLnNldChhdXRvS2V5LCBhdXRvRXhwbG9yZVJlc3VsdC5tYWluLnJlY29yZHMpO1xuXG4gICAgICAvLyDsobDtmoztlZwg642w7J207YSw7JmAIOq0gOqzhOuQnCDrqqjrk6Ag7JeU7Yuw7Yuw66W8IHRhcmdldERi7JeQIGltcG9ydFxuICAgICAgaWYgKGF1dG9FeHBsb3JlUmVzdWx0Lm1haW4ucmVjb3Jkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW1wb3J0RXhwbG9yZVJlc3VsdChhdXRvRXhwbG9yZVJlc3VsdCwgY29udGV4dCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgYXV0b0NhbmRpZGF0ZXMgPSBjb250ZXh0LnJlZmVyZW5jZUNhY2hlLmdldChhdXRvS2V5KTtcbiAgICBpZiAoYXV0b0NhbmRpZGF0ZXMgJiYgYXV0b0NhbmRpZGF0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgLy8g656c642k7ZWY6rKMIO2VmOuCmCDshKDtg51cbiAgICAgIGNvbnN0IHNlbGVjdGVkID0gYXV0b0NhbmRpZGF0ZXNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogYXV0b0NhbmRpZGF0ZXMubGVuZ3RoKV07XG4gICAgICByZXR1cm4gc2VsZWN0ZWQuaWQgYXMgbnVtYmVyO1xuICAgIH1cblxuICAgIC8vIOywuOyhsCDrjbDsnbTthLDqsIAg7JeG7Jy866m0IG51bGwg67CY7ZmYIChudWxsYWJsZeyduCDqsr3smrApXG4gICAgaWYgKHByb3AubnVsbGFibGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIG51bGxhYmxl7J20IOyVhOuLiOqzoCDrjbDsnbTthLDrj4Qg7JeG7Jy866m0IOyXkOufrFxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBGaXh0dXJlR2VuZXJhdG9yOiAke2VudGl0eS5pZH0uJHtwcm9wLm5hbWV97JeQIO2VhOyalO2VnCAke3Byb3Aud2l0aH0g642w7J207YSw6rCAIOyXhuyKteuLiOuLpC4gYCArXG4gICAgICAgIGDrqLzsoIAgJHtwcm9wLndpdGh966W8IOyDneyEse2VmOqxsOuCmCBjb25lLmRhdGFTb3VyY2Xrpbwg7ISk7KCV7ZWY7IS47JqULmAsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBsb3JlV2l0aFJlbGF0aW9ucyDqsrDqs7zrpbwgdGFyZ2V0RGLsl5AgaW1wb3J0XG4gICAqXG4gICAqIOq0gOqzhCDssrTsnbjsnYQg65Sw65286rCEIOqysOqzvChtYWluICsgcmVsYXRlZCnrpbwg66qo65GQIGltcG9ydO2VqeuLiOuLpC5cbiAgICog7J2Y7KG07ISxIOyInOyEnOuKlCBGaXh0dXJlTWFuYWdlci5pbnNlcnRGaXh0dXJlc+qwgCDsnpDrj5nsnLzroZwg7LKY66as7ZWp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBpbXBvcnRFeHBsb3JlUmVzdWx0KFxuICAgIGV4cGxvcmVSZXN1bHQ6IEV4cGxvcmVXaXRoUmVsYXRpb25zUmVzdWx0LFxuICAgIGNvbnRleHQ6IEdlbmVyYXRvckNvbnRleHQsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGFsbEZpeHR1cmVSZWNvcmRzOiBGaXh0dXJlUmVjb3JkW10gPSBbXTtcblxuICAgIC8vIDEuIFJlbGF0ZWQgZW50aXRpZXMgaW1wb3J0IChDb21wYW55LCBEZXBhcnRtZW50IOuTsSlcbiAgICBmb3IgKGNvbnN0IFtlbnRpdHlJZCwgcmVjb3Jkc10gb2YgZXhwbG9yZVJlc3VsdC5yZWxhdGVkLmVudHJpZXMoKSkge1xuICAgICAgY29uc3QgZW50aXR5ID0gdGhpcy5lbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gICAgICBjb25zdCByZWNvcmRzVG9JbXBvcnQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W10gPSBbXTtcblxuICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGNoYWxrLmN5YW4oYEltcG9ydGluZyByZWxhdGVkIGVudGl0eTogJHtlbnRpdHlJZH0gKCR7cmVjb3Jkcy5sZW5ndGh9IHJlY29yZHMpYCksXG4gICAgICAgICk7XG5cbiAgICAgIGZvciAoY29uc3QgcmVjb3JkIG9mIHJlY29yZHMpIHtcbiAgICAgICAgY29uc3QgcmVjb3JkS2V5ID0gYCR7ZW50aXR5SWR9IyR7cmVjb3JkLmlkfWA7XG4gICAgICAgIGlmICghY29udGV4dC5pbXBvcnRlZFJlY29yZHMuaGFzKHJlY29yZEtleSkpIHtcbiAgICAgICAgICByZWNvcmRzVG9JbXBvcnQucHVzaChyZWNvcmQpO1xuICAgICAgICAgIGNvbnRleHQuaW1wb3J0ZWRSZWNvcmRzLmFkZChyZWNvcmRLZXkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChyZWNvcmRzVG9JbXBvcnQubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGNvbnN0IHJlY29yZCBvZiByZWNvcmRzVG9JbXBvcnQpIHtcbiAgICAgICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICBjaGFsay5ncmF5KFxuICAgICAgICAgICAgICAgIGAgIC0gUHJvY2Vzc2luZyAke2VudGl0eUlkfSByZWNvcmQ6YCxcbiAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShyZWNvcmQpLnNsaWNlKDAsIDEwMCksXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IGZpeHR1cmVSZWNvcmRzID0gYXdhaXQgRml4dHVyZU1hbmFnZXIuY3JlYXRlRml4dHVyZVJlY29yZChcbiAgICAgICAgICAgIGVudGl0eSxcbiAgICAgICAgICAgIHJlY29yZCBhcyB7IGlkOiBudW1iZXIgfCBzdHJpbmc7IFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsIH0sXG4gICAgICAgICAgICB7IF9kYjogdGhpcy5zb3VyY2VEYiwgc2luZ2xlUmVjb3JkOiB0cnVlIH0sXG4gICAgICAgICAgKTtcbiAgICAgICAgICBhbGxGaXh0dXJlUmVjb3Jkcy5wdXNoKC4uLmZpeHR1cmVSZWNvcmRzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDIuIE1haW4gZW50aXR5IGltcG9ydCAoRW1wbG95ZWUg65OxKVxuICAgIGNvbnN0IG1haW5FbnRpdHkgPSB0aGlzLmVudGl0eU1hbmFnZXIuZ2V0KGV4cGxvcmVSZXN1bHQubWFpbi5lbnRpdHlJZCk7XG4gICAgY29uc3QgbWFpblJlY29yZHNUb0ltcG9ydDogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSA9IFtdO1xuXG4gICAgIWlzVGVzdCgpICYmXG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgY2hhbGsuY3lhbihcbiAgICAgICAgICBgSW1wb3J0aW5nIG1haW4gZW50aXR5OiAke2V4cGxvcmVSZXN1bHQubWFpbi5lbnRpdHlJZH0gKCR7ZXhwbG9yZVJlc3VsdC5tYWluLnJlY29yZHMubGVuZ3RofSByZWNvcmRzKWAsXG4gICAgICAgICksXG4gICAgICApO1xuXG4gICAgZm9yIChjb25zdCByZWNvcmQgb2YgZXhwbG9yZVJlc3VsdC5tYWluLnJlY29yZHMpIHtcbiAgICAgIGNvbnN0IHJlY29yZEtleSA9IGAke2V4cGxvcmVSZXN1bHQubWFpbi5lbnRpdHlJZH0jJHtyZWNvcmQuaWR9YDtcbiAgICAgIGlmICghY29udGV4dC5pbXBvcnRlZFJlY29yZHMuaGFzKHJlY29yZEtleSkpIHtcbiAgICAgICAgbWFpblJlY29yZHNUb0ltcG9ydC5wdXNoKHJlY29yZCk7XG4gICAgICAgIGNvbnRleHQuaW1wb3J0ZWRSZWNvcmRzLmFkZChyZWNvcmRLZXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtYWluUmVjb3Jkc1RvSW1wb3J0Lmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAoY29uc3QgcmVjb3JkIG9mIG1haW5SZWNvcmRzVG9JbXBvcnQpIHtcbiAgICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBjaGFsay5ncmF5KFxuICAgICAgICAgICAgICBgICAtIFByb2Nlc3NpbmcgJHtleHBsb3JlUmVzdWx0Lm1haW4uZW50aXR5SWR9IHJlY29yZDpgLFxuICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShyZWNvcmQpLnNsaWNlKDAsIDEwMCksXG4gICAgICAgICAgICApLFxuICAgICAgICAgICk7XG4gICAgICAgIGNvbnN0IGZpeHR1cmVSZWNvcmRzID0gYXdhaXQgRml4dHVyZU1hbmFnZXIuY3JlYXRlRml4dHVyZVJlY29yZChcbiAgICAgICAgICBtYWluRW50aXR5LFxuICAgICAgICAgIHJlY29yZCBhcyB7IGlkOiBudW1iZXIgfCBzdHJpbmc7IFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsIH0sXG4gICAgICAgICAgeyBfZGI6IHRoaXMuc291cmNlRGIsIHNpbmdsZVJlY29yZDogdHJ1ZSB9LFxuICAgICAgICApO1xuICAgICAgICBhbGxGaXh0dXJlUmVjb3Jkcy5wdXNoKC4uLmZpeHR1cmVSZWNvcmRzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAzLiDrqqjrk6AgZml4dHVyZeulvCDtlZwg67KI7JeQIOyCveyehSAo7J2Y7KG07ISxIOyInOyEnCDsnpDrj5kg7LKY66asKVxuICAgIGlmIChhbGxGaXh0dXJlUmVjb3Jkcy5sZW5ndGggPiAwKSB7XG4gICAgICBhd2FpdCBGaXh0dXJlTWFuYWdlci5pbnNlcnRGaXh0dXJlcyh0aGlzLnRhcmdldERiTmFtZSwgYWxsRml4dHVyZVJlY29yZHMpO1xuXG4gICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgY2hhbGsuZ3JlZW4oXG4gICAgICAgICAgICBgQXV0by1pbXBvcnRlZCAke2V4cGxvcmVSZXN1bHQubWFpbi5lbnRpdHlJZH0gd2l0aCByZWxhdGlvbnM6IGAgK1xuICAgICAgICAgICAgICBgJHtleHBsb3JlUmVzdWx0Lm1haW4ucmVjb3Jkcy5sZW5ndGh9IG1haW4gKyAke2V4cGxvcmVSZXN1bHQucmVsYXRlZC5zaXplfSByZWxhdGVkIGVudGl0aWVzYCxcbiAgICAgICAgICApLFxuICAgICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBmaXh0dXJlR2VuZXJhdG9yIOyLpO2WiSAoRmFrZXIuanPrp4wg7KeA7JuQKVxuICAgKlxuICAgKiBmYWtlci4qIO2YleyLneydmCDtkZztmITsi53snYQg7JWI7KCE7ZWY6rKMIO2MjOyLse2VmOyXrCDsi6Ttlontlanri4jri6QuXG4gICAqIOyYiDogXCJmYWtlci5pbnRlcm5ldC5lbWFpbCgpXCIg4oaSIGZha2VyLmludGVybmV0LmVtYWlsKClcbiAgICog7JiIOiBcImZha2VyLmxvcmVtLndvcmRzKDMpXCIg4oaSIGZha2VyLmxvcmVtLndvcmRzKDMpXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVHZW5lcmF0b3IoXG4gICAgZ2VuZXJhdG9yOiBzdHJpbmcsXG4gICAgcHJvcDogRW50aXR5UHJvcCxcbiAgICBlbnRpdHk6IEVudGl0eSxcbiAgKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgLy8gRmFrZXIuanMg7ZGc7ZiE7Iud66eMIOyngOybkFxuICAgIGlmIChnZW5lcmF0b3Iuc3RhcnRzV2l0aChcImZha2VyLlwiKSkge1xuICAgICAgLy8gdXNlcm5hbWXsnbTrgpggbmFtZSDtlYTrk5zripQg7ZWc6rWt7Ja0IGZha2VyIOyCrOyaqVxuICAgICAgY29uc3QgaXNOYW1lRmllbGQgPSBwcm9wLm5hbWUgPT09IFwidXNlcm5hbWVcIiB8fCBwcm9wLm5hbWUgPT09IFwibmFtZVwiO1xuICAgICAgY29uc3QgZmFrZXJNb2R1bGUgPSBhd2FpdCBpbXBvcnQoXCJAZmFrZXItanMvZmFrZXJcIik7XG4gICAgICBjb25zdCBmYWtlciA9IGlzTmFtZUZpZWxkID8gZmFrZXJNb2R1bGUuZmFrZXJLTyA6IGZha2VyTW9kdWxlLmZha2VyO1xuICAgICAgY29uc3QgZXhwciA9IGdlbmVyYXRvci5zbGljZSg2KTsgLy8gXCJmYWtlci5cIiDsoJzqsbBcblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8g7ZWo7IiYIOqyveuhnOyZgCDsnbjsnpAg7YyM7IuxXG4gICAgICAgIGNvbnN0IG1hdGNoID0gZXhwci5tYXRjaCgvXihbXFx3Ll0rKSg/OlxcKCguKj8pXFwpKT8kLyk7XG4gICAgICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgRml4dHVyZUdlbmVyYXRvcjogSW52YWxpZCBmYWtlciBleHByZXNzaW9uIGZvciAke3Byb3AubmFtZX06ICR7Z2VuZXJhdG9yfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IFssIHBhdGgsIGFyZ3NTdHJdID0gbWF0Y2g7XG4gICAgICAgIGNvbnN0IHBhcnRzID0gcGF0aC5zcGxpdChcIi5cIik7XG5cbiAgICAgICAgLy8gZmFrZXIg6rCd7LK07JeQ7IScIO2VqOyImCDssL7quLBcbiAgICAgICAgbGV0IGZuOiB1bmtub3duID0gZmFrZXI7XG4gICAgICAgIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgICAgICAgIGlmICh0eXBlb2YgZm4gPT09IFwib2JqZWN0XCIgJiYgZm4gIT09IG51bGwgJiYgcGFydCBpbiBmbikge1xuICAgICAgICAgICAgZm4gPSAoZm4gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW3BhcnRdO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpeHR1cmVHZW5lcmF0b3I6IEludmFsaWQgZmFrZXIgcGF0aCBmb3IgJHtwcm9wLm5hbWV9OiBmYWtlci4ke3BhdGh9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8g7ZWo7IiY6rCAIOyVhOuLiOuptCDsl5Drn6xcbiAgICAgICAgaWYgKHR5cGVvZiBmbiAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGaXh0dXJlR2VuZXJhdG9yOiBmYWtlci4ke3BhdGh9IGlzIG5vdCBhIGZ1bmN0aW9uIChmb3IgJHtwcm9wLm5hbWV9KWApO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGFyZ3M6IHVua25vd25bXSA9IFtdO1xuICAgICAgICBpZiAoYXJnc1N0cj8udHJpbSgpKSB7XG4gICAgICAgICAgYXJncyA9IHRoaXMucGFyc2VHZW5lcmF0b3JBcmdzKGFyZ3NTdHIsIHByb3AubmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZm4oLi4uYXJncyk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICAgICAgYEZhaWxlZCB0byBleGVjdXRlIGdlbmVyYXRvciBcIiR7Z2VuZXJhdG9yfVwiIGZvciAke3Byb3AubmFtZX0sIGZhbGxpbmcgYmFjayB0byBkZWZhdWx0OmAsXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVEZWZhdWx0VmFsdWUocHJvcCwgZW50aXR5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBmYWtlciDsnbTsmbjsnZgg7ZGc7ZiE7Iud7J2AIOyngOybkO2VmOyngCDslYrsnYxcbiAgICAhaXNUZXN0KCkgJiZcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBjaGFsay55ZWxsb3coXG4gICAgICAgICAgYFVuc3VwcG9ydGVkIGdlbmVyYXRvciBleHByZXNzaW9uIGZvciAke3Byb3AubmFtZX06ICR7Z2VuZXJhdG9yfS4gT25seSBmYWtlci4qIGV4cHJlc3Npb25zIGFyZSBzdXBwb3J0ZWQuIFVzaW5nIGRlZmF1bHQgdmFsdWUuYCxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVEZWZhdWx0VmFsdWUocHJvcCwgZW50aXR5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtlYTrk5zsnZgg7YOA7J6F6rO8IOydtOumhOydhCDrtoTshJ3tlZjsl6wg7KCB7KCI7ZWcIOq4sOuzuOqwkuydhCDsg53shLHtlanri4jri6QuXG4gICAqXG4gICAqIOyasOyEoOyInOychDpcbiAgICogMS4g7ZWE65Oc66qFIO2MqO2EtCDrp6Tsua0gKHNhbGFyeSwgYnVkZ2V0IOuTsSDsnZjrr7jsnojripQg642w7J207YSwKVxuICAgKiAyLiDtirnsiJgg7LyA7J207IqkIChEZXBhcnRtZW50IG5hbWUg65OxIOuPhOuplOyduCDsp4Dsi50pXG4gICAqIDMuIOuwsOyXtCDtg4DsnoUgKEpTT04g67Cw7Je0KVxuICAgKiA0LiBFbnVtIO2DgOyehVxuICAgKiA1LiDtg4DsnoXrs4Qg6riw67O46rCSXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlRGVmYXVsdFZhbHVlKHByb3A6IEVudGl0eVByb3AsIGVudGl0eT86IEVudGl0eSk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IGZha2VyTW9kdWxlID0gYXdhaXQgaW1wb3J0KFwiQGZha2VyLWpzL2Zha2VyXCIpO1xuICAgIGNvbnN0IGZha2VyID0gZmFrZXJNb2R1bGUuZmFrZXI7XG4gICAgY29uc3QgZmFrZXJLTyA9IGZha2VyTW9kdWxlLmZha2VyS087XG4gICAgY29uc3QgZmFrZXJKQSA9IGZha2VyTW9kdWxlLmZha2VySkE7XG5cbiAgICBjb25zdCBsb2NhbGVGYWtlciA9IHRoaXMubG9jYWxlID09PSBcImtvXCIgPyBmYWtlcktPIDogdGhpcy5sb2NhbGUgPT09IFwiamFcIiA/IGZha2VySkEgOiBmYWtlcjtcblxuICAgIC8qKlxuICAgICAqIDEuIEVudGl0eS1zcGVjaWZpYyDtirnsiJgg7LyA7J207Iqk66W8IOuovOyggCDsspjrpqztlanri4jri6QuXG4gICAgICogZmllbGRfcGF0dGVybnPrs7Tri6Qg7Jqw7ISg7ZWY7JesLCDtirnsoJUg7JeU7Yuw7Yuw7J2YIO2VhOuTnOyXkCDrj4TrqZTsnbjsl5Ag66ee64qUIOqwkuydhCDsg53shLHtlanri4jri6QuXG4gICAgICog7JiIOiBEZXBhcnRtZW50Lm5hbWUg4oaSIO2VnOq1reyWtCDrtoDshJzrqoUgKOyCrOuejCDsnbTrpoTsnbQg7JWE64uYKVxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogRGVwYXJ0bWVudCBuYW1l7J2AIO2VnOq1reyWtCDrtoDshJzrqoUg66qp66Gd7JeQ7IScIOyEoO2Dne2VqeuLiOuLpC5cbiAgICAgKiDqs6DsnKDshLHsnYQg7JyE7ZW0IDcwJSDtmZXrpaDroZwgcHJlZml4L3N1ZmZpeOulvCDstpTqsIDtlanri4jri6QuXG4gICAgICovXG4gICAgaWYgKGVudGl0eT8uaWQgPT09IFwiRGVwYXJ0bWVudFwiICYmIHByb3AubmFtZSA9PT0gXCJuYW1lXCIpIHtcbiAgICAgIGNvbnN0IGRlcGFydG1lbnRzID0gW1xuICAgICAgICBcIuqwnOuwnO2MgFwiLFxuICAgICAgICBcIuq4sO2aje2MgFwiLFxuICAgICAgICBcIuuniOy8gO2Mhe2MgFwiLFxuICAgICAgICBcIuyYgeyXhe2MgFwiLFxuICAgICAgICBcIuyduOyCrO2MgFwiLFxuICAgICAgICBcIuy0neustO2MgFwiLFxuICAgICAgICBcIuyerOustO2MgFwiLFxuICAgICAgICBcIu2ajOqzhO2MgFwiLFxuICAgICAgICBcIuuyleustO2MgFwiLFxuICAgICAgICBcIuuUlOyekOyduO2MgFwiLFxuICAgICAgICBcIklU7YyAXCIsXG4gICAgICAgIFwi6rOg6rCd7KeA7JuQ7YyAXCIsXG4gICAgICAgIFwi7ZKI7KeI6rSA66as7YyAXCIsXG4gICAgICAgIFwi7Jew6rWs6rCc67Cc7YyAXCIsXG4gICAgICAgIFwi7IOd7IKw7YyAXCIsXG4gICAgICAgIFwi6rWs66ek7YyAXCIsXG4gICAgICAgIFwi66y866WY7YyAXCIsXG4gICAgICBdO1xuICAgICAgY29uc3QgcHJlZml4ZXMgPSBbXCLsi6Dqt5xcIiwgXCLthrXtlalcIiwgXCLsoITrnrVcIiwgXCLquIDroZzrsoxcIiwgXCLrlJTsp4DthLhcIiwgXCLtlbXsi6xcIl07XG4gICAgICBjb25zdCBzdWZmaXhlcyA9IFtcIjHtjIBcIiwgXCIy7YyAXCIsIFwiM+2MgFwiLCBcIkHtjIBcIiwgXCJC7YyAXCIsIFwi67O467aAXCIsIFwi7IS87YSwXCIsIFwi6re466O5XCJdO1xuXG4gICAgICBjb25zdCBkZXB0ID0gZmFrZXIuaGVscGVycy5hcnJheUVsZW1lbnQoZGVwYXJ0bWVudHMpO1xuXG4gICAgICBjb25zdCByYW5kb20gPSBNYXRoLnJhbmRvbSgpO1xuICAgICAgaWYgKHJhbmRvbSA+IDAuNykge1xuICAgICAgICBjb25zdCBwcmVmaXggPSBmYWtlci5oZWxwZXJzLmFycmF5RWxlbWVudChwcmVmaXhlcyk7XG4gICAgICAgIHJldHVybiBgJHtwcmVmaXh9ICR7ZGVwdH1gO1xuICAgICAgfVxuICAgICAgaWYgKHJhbmRvbSA+IDAuNCkge1xuICAgICAgICBjb25zdCBzdWZmaXggPSBmYWtlci5oZWxwZXJzLmFycmF5RWxlbWVudChzdWZmaXhlcyk7XG4gICAgICAgIHJldHVybiBgJHtkZXB0fSAke3N1ZmZpeH1gO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRlcHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogMi4g7ZWE65Oc66qF7JeQ7IScIOydmOuvuOulvCDstpTroaDtlZjsl6wg7ZiE7Iuk7KCB7J24IOuNsOydtO2EsOulvCDsg53shLHtlanri4jri6QuXG4gICAgICog7JiIOiBzYWxhcnkg4oaSIDMwTX4xNTBNICjtlZzqta0g7Jew67SJIOuylOychClcbiAgICAgKiAgICAgYnVkZ2V0IOKGkiAxME1+NTAwTSAo7ZSE66Gc7KCd7Yq4IOyYiOyCsCDrspTsnIQpXG4gICAgICovXG4gICAgY29uc3QgbG9jYWxlTWFwcGluZ3MgPSB0aGlzLm1hcHBpbmdzW3RoaXMubG9jYWxlXSB8fCB0aGlzLm1hcHBpbmdzLmVuO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWROYW1lID0gcHJvcC5uYW1lLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXy9nLCBcIlwiKTtcblxuICAgIGZvciAoY29uc3QgW3BhdHRlcm4sIGNvbmZpZ10gb2YgT2JqZWN0LmVudHJpZXMobG9jYWxlTWFwcGluZ3MuZmllbGRfcGF0dGVybnMpKSB7XG4gICAgICBpZiAobm9ybWFsaXplZE5hbWUuaW5jbHVkZXMocGF0dGVybi50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmV4ZWN1dGVGYWtlckV4cHJlc3Npb24oY29uZmlnLmZha2VyLCBwcm9wKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICBjaGFsay55ZWxsb3coXG4gICAgICAgICAgICAgICAgYEZhaWxlZCB0byBleGVjdXRlIGZpZWxkIHBhdHRlcm4gXCIke3BhdHRlcm59XCIgZm9yICR7cHJvcC5uYW1lfSwgZmFsbGluZyBiYWNrOmAsXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIDMuIEpTT04g7YOA7J6F7J2066m07IScIOuwsOyXtOyduCDqsr3smrAgKFNvbmFtdUZpbGVbXSwgc3RyaW5nW10g65OxKVxuICAgICAqIO2VhOuTnOuqhSDtjKjthLTsnYQg67O06rOgIOyggeygiO2VnCDrsLDsl7Qg642w7J207YSw66W8IOyDneyEse2VqeuLiOuLpC5cbiAgICAgKi9cbiAgICBpZiAocHJvcC50eXBlID09PSBcImpzb25cIiAmJiBcImlkXCIgaW4gcHJvcCAmJiBwcm9wLmlkKSB7XG4gICAgICBpZiAocHJvcC5pZC5lbmRzV2l0aChcIltdXCIpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlQXJyYXlWYWx1ZShwcm9wLCBlbnRpdHksIGZha2VyLCBsb2NhbGVGYWtlcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqIDQuIEVudW0g7YOA7J6F7J2AIOygleydmOuQnCDqsJIg7KSRIO2VmOuCmOulvCDrnpzrjaQg7ISg7YOd7ZWp64uI64ukICovXG4gICAgaWYgKHByb3AudHlwZSA9PT0gXCJlbnVtXCIpIHtcbiAgICAgIGxldCBlbnVtVmFsdWVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICBpZiAoXCJlbnVtXCIgaW4gcHJvcCAmJiBBcnJheS5pc0FycmF5KHByb3AuZW51bSkgJiYgcHJvcC5lbnVtLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZW51bVZhbHVlcyA9IHByb3AuZW51bTtcbiAgICAgIH0gZWxzZSBpZiAoXCJpZFwiIGluIHByb3AgJiYgcHJvcC5pZCAmJiBlbnRpdHk/LmVudW1MYWJlbHM/Lltwcm9wLmlkXSkge1xuICAgICAgICBlbnVtVmFsdWVzID0gT2JqZWN0LmtleXMoZW50aXR5LmVudW1MYWJlbHNbcHJvcC5pZF0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoZW51bVZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiBmYWtlci5oZWxwZXJzLmFycmF5RWxlbWVudChlbnVtVmFsdWVzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwcm9wLm51bGxhYmxlID8gbnVsbCA6IFwiVU5LTk9XTlwiO1xuICAgIH1cblxuICAgIGlmIChwcm9wLnR5cGUgPT09IFwiZW51bVtdXCIpIHtcbiAgICAgIGxldCBlbnVtVmFsdWVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICBpZiAoXCJlbnVtXCIgaW4gcHJvcCAmJiBBcnJheS5pc0FycmF5KHByb3AuZW51bSkgJiYgcHJvcC5lbnVtLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZW51bVZhbHVlcyA9IHByb3AuZW51bTtcbiAgICAgIH0gZWxzZSBpZiAoXCJpZFwiIGluIHByb3AgJiYgcHJvcC5pZCAmJiBlbnRpdHk/LmVudW1MYWJlbHM/Lltwcm9wLmlkXSkge1xuICAgICAgICBlbnVtVmFsdWVzID0gT2JqZWN0LmtleXMoZW50aXR5LmVudW1MYWJlbHNbcHJvcC5pZF0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoZW51bVZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiBbZmFrZXIuaGVscGVycy5hcnJheUVsZW1lbnQoZW51bVZhbHVlcyldO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIDUuIFZlY3RvciDtg4DsnoXsnYAg7ZiE7J6sIOyngOybkO2VmOyngCDslYrsnLzrr4DroZwgbnVsbOydhCDrsJjtmZjtlanri4jri6QuXG4gICAgICog7Zal7ZuEIEFJIGVtYmVkZGluZyDsg53shLEg6riw64qlIOy2lOqwgCDsi5wg6rWs7ZiEIOyYiOygleyeheuLiOuLpC5cbiAgICAgKi9cbiAgICBpZiAocHJvcC50eXBlID09PSBcInZlY3RvclwiIHx8IHByb3AudHlwZSA9PT0gXCJ2ZWN0b3JbXVwiIHx8IHByb3AudHlwZSA9PT0gXCJ0c3ZlY3RvclwiKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvKiogNi4g7YOA7J6F67OEIOq4sOuzuCBGYWtlciDtkZztmITsi53snYQg7Iuk7ZaJ7ZWp64uI64ukICovXG4gICAgY29uc3QgdHlwZURlZmF1bHQgPSBsb2NhbGVNYXBwaW5ncy50eXBlX2RlZmF1bHRzW3Byb3AudHlwZV07XG4gICAgaWYgKHR5cGVEZWZhdWx0KSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5leGVjdXRlRmFrZXJFeHByZXNzaW9uKHR5cGVEZWZhdWx0LmZha2VyLCBwcm9wKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgY2hhbGsueWVsbG93KGBGYWlsZWQgdG8gZXhlY3V0ZSB0eXBlIGRlZmF1bHQgZm9yICR7cHJvcC50eXBlfSwgdXNpbmcgZmFsbGJhY2s6YCwgZXJyb3IpLFxuICAgICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqIDcuIOunpO2VkeuQmOyngCDslYrsnYAg7YOA7J6F7J2AIOq4sOuzuCBGYWtlciDtlajsiJjroZwg7LKY66as7ZWp64uI64ukICovXG4gICAgc3dpdGNoIChwcm9wLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgIGNhc2UgXCJzdHJpbmdbXVwiOlxuICAgICAgICByZXR1cm4gZmFrZXIubG9yZW0ud29yZHMoMyk7XG4gICAgICBjYXNlIFwiaW50ZWdlclwiOlxuICAgICAgICByZXR1cm4gZmFrZXIubnVtYmVyLmludCh7IG1pbjogMSwgbWF4OiAxMDAwIH0pO1xuICAgICAgY2FzZSBcImludGVnZXJbXVwiOlxuICAgICAgICByZXR1cm4gW2Zha2VyLm51bWJlci5pbnQoeyBtaW46IDEsIG1heDogMTAwMCB9KV07XG4gICAgICBjYXNlIFwiYmlnSW50ZWdlclwiOlxuICAgICAgICByZXR1cm4gZmFrZXIubnVtYmVyLmJpZ0ludCh7IG1pbjogMW4sIG1heDogMTAwMG4gfSk7XG4gICAgICBjYXNlIFwiYmlnSW50ZWdlcltdXCI6XG4gICAgICAgIHJldHVybiBbZmFrZXIubnVtYmVyLmJpZ0ludCh7IG1pbjogMW4sIG1heDogMTAwMG4gfSldO1xuICAgICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgY2FzZSBcIm51bWVyaWNcIjpcbiAgICAgICAgcmV0dXJuIGZha2VyLm51bWJlci5mbG9hdCh7IG1pbjogMCwgbWF4OiAxMDAwIH0pO1xuICAgICAgY2FzZSBcIm51bWJlcltdXCI6XG4gICAgICBjYXNlIFwibnVtZXJpY1tdXCI6XG4gICAgICAgIHJldHVybiBbZmFrZXIubnVtYmVyLmZsb2F0KHsgbWluOiAwLCBtYXg6IDEwMDAgfSldO1xuICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgcmV0dXJuIGZha2VyLmRhdGF0eXBlLmJvb2xlYW4oKTtcbiAgICAgIGNhc2UgXCJib29sZWFuW11cIjpcbiAgICAgICAgcmV0dXJuIFtmYWtlci5kYXRhdHlwZS5ib29sZWFuKCldO1xuICAgICAgY2FzZSBcImRhdGVcIjpcbiAgICAgIGNhc2UgXCJkYXRlW11cIjpcbiAgICAgICAgcmV0dXJuIGZha2VyLmRhdGUucGFzdCgpO1xuICAgICAgY2FzZSBcImpzb25cIjpcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgY2FzZSBcInV1aWRcIjpcbiAgICAgIGNhc2UgXCJ1dWlkW11cIjpcbiAgICAgICAgcmV0dXJuIGZha2VyLnN0cmluZy51dWlkKCk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog67Cw7Je0IO2DgOyeheydmCDqsJLsnYQg7IOd7ISx7ZWp64uI64ukLlxuICAgKlxuICAgKiDtg4DsnoUgSUTsmYAg7ZWE65Oc66qFIO2MqO2EtOydhCDrtoTshJ3tlZjsl6wg7KCB7KCI7ZWcIOuwsOyXtCDrjbDsnbTthLDrpbwg7IOd7ISx7ZWp64uI64ukLlxuICAgKiDsmIg6IGltYWdlX3VybHMg4oaSIFt7dXJsLCBuYW1lLCBtaW1lX3R5cGV9LCAuLi5dXG4gICAqICAgICB0YWdfaWRzIOKGkiBbMSwgMjMsIDQ1XVxuICAgKi9cbiAgcHJpdmF0ZSBnZW5lcmF0ZUFycmF5VmFsdWUoXG4gICAgcHJvcDogRW50aXR5UHJvcCxcbiAgICBfZW50aXR5OiBFbnRpdHkgfCB1bmRlZmluZWQsXG4gICAgZmFrZXI6IHR5cGVvZiBpbXBvcnQoXCJAZmFrZXItanMvZmFrZXJcIikuZmFrZXIsXG4gICAgX2xvY2FsZUZha2VyOiB0eXBlb2YgaW1wb3J0KFwiQGZha2VyLWpzL2Zha2VyXCIpLmZha2VyLFxuICApOiB1bmtub3duW10ge1xuICAgIGNvbnN0IGNvdW50ID0gZmFrZXIubnVtYmVyLmludCh7IG1pbjogMSwgbWF4OiAzIH0pO1xuXG4gICAgLyoqIFNvbmFtdUZpbGVbXeydgCBTb25hbXUg64K07J6lIO2DgOyeheycvOuhnCDqtazsobDqsIAg7KCV7ZW07KC4IOyeiOyKteuLiOuLpCAqL1xuICAgIGlmIChcImlkXCIgaW4gcHJvcCAmJiBwcm9wLmlkID09PSBcIlNvbmFtdUZpbGVbXVwiKSB7XG4gICAgICByZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogY291bnQgfSwgKCkgPT4gKHtcbiAgICAgICAgdXJsOiBmYWtlci5pbWFnZS51cmwoKSxcbiAgICAgICAgbmFtZTogZmFrZXIuc3lzdGVtLmZpbGVOYW1lKCksXG4gICAgICAgIG1pbWVfdHlwZTogZmFrZXIuaGVscGVycy5hcnJheUVsZW1lbnQoW1xuICAgICAgICAgIFwiaW1hZ2UvanBlZ1wiLFxuICAgICAgICAgIFwiaW1hZ2UvcG5nXCIsXG4gICAgICAgICAgXCJpbWFnZS9naWZcIixcbiAgICAgICAgICBcImFwcGxpY2F0aW9uL3BkZlwiLFxuICAgICAgICBdKSxcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICAvKiog7ZWE65Oc66qF7JeQ7IScIOuwsOyXtOydmCDsmqnrj4Trpbwg7LaU66Gg7ZWp64uI64ukICovXG4gICAgY29uc3Qgbm9ybWFsaXplZE5hbWUgPSBwcm9wLm5hbWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9fL2csIFwiXCIpO1xuXG4gICAgaWYgKG5vcm1hbGl6ZWROYW1lLmluY2x1ZGVzKFwidXJsXCIpIHx8IG5vcm1hbGl6ZWROYW1lLmluY2x1ZGVzKFwiaW1hZ2VcIikpIHtcbiAgICAgIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBjb3VudCB9LCAoKSA9PiBmYWtlci5pbnRlcm5ldC51cmwoKSk7XG4gICAgfVxuXG4gICAgaWYgKG5vcm1hbGl6ZWROYW1lLmluY2x1ZGVzKFwiaWRcIikgJiYgbm9ybWFsaXplZE5hbWUuZW5kc1dpdGgoXCJzXCIpKSB7XG4gICAgICByZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogY291bnQgfSwgKCkgPT4gZmFrZXIubnVtYmVyLmludCh7IG1pbjogMSwgbWF4OiAxMDAgfSkpO1xuICAgIH1cblxuICAgIGlmIChub3JtYWxpemVkTmFtZS5pbmNsdWRlcyhcInRhZ1wiKSB8fCBub3JtYWxpemVkTmFtZS5pbmNsdWRlcyhcIm5hbWVcIikpIHtcbiAgICAgIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBjb3VudCB9LCAoKSA9PiBmYWtlci5sb3JlbS53b3JkKCkpO1xuICAgIH1cblxuICAgIC8qKiDtjKjthLQg66ek7Lmt65CY7KeAIOyViuycvOuptCDruYgg67Cw7Je07J2EIOuwmO2ZmO2VqeuLiOuLpCAqL1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBKU09OIOunpO2VkeydmCBGYWtlciDtkZztmITsi53snYQg7YyM7Iux7ZWY7JesIOyLpO2Wie2VqeuLiOuLpC5cbiAgICpcbiAgICog7ZGc7ZiE7IudIOyYiOyLnDpcbiAgICogLSBcImZha2VyLmludGVybmV0LmVtYWlsKClcIiDihpIg7J247J6QIOyXhuydjFxuICAgKiAtIFwiZmFrZXIubnVtYmVyLmludCh7IG1pbjogMSwgbWF4OiAxMDAgfSlcIiDihpIgSlNPTiDsnbjsnpBcbiAgICogLSBcInt9XCIg4oaSIOumrO2EsOuftCDqsJIgKEpTT04ucGFyc2UpXG4gICAqXG4gICAqIGZha2VyS08sIGZha2VySkHrj4Qg7KeA7JuQ7ZWY7JesIOuLpOq1reyWtCDrjbDsnbTthLDrpbwg7IOd7ISx7ZWp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBleGVjdXRlRmFrZXJFeHByZXNzaW9uKGV4cHJlc3Npb246IHN0cmluZywgcHJvcDogRW50aXR5UHJvcCk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IGZha2VyTW9kdWxlID0gYXdhaXQgaW1wb3J0KFwiQGZha2VyLWpzL2Zha2VyXCIpO1xuICAgIGNvbnN0IGZha2VyID0gZmFrZXJNb2R1bGUuZmFrZXI7XG4gICAgY29uc3QgZmFrZXJLTyA9IGZha2VyTW9kdWxlLmZha2VyS087XG4gICAgY29uc3QgZmFrZXJKQSA9IGZha2VyTW9kdWxlLmZha2VySkE7XG5cbiAgICAvKiogRmFrZXIg7ZGc7ZiE7Iud7J20IOyVhOuLjCDrpqzthLDrn7Qg6rCS7J2AIEpTT07snLzroZwg7YyM7Iux7ZWp64uI64ukICovXG4gICAgaWYgKCFleHByZXNzaW9uLnN0YXJ0c1dpdGgoXCJmYWtlclwiKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZXhwcmVzc2lvbik7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIGV4cHJlc3Npb247XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqIO2RnO2YhOyLneyXkOyEnCBGYWtlciDqsJ3ssrTsmYAg6rK966Gc66W8IOy2lOy2nO2VqeuLiOuLpCAqL1xuICAgIGNvbnN0IG1hdGNoID0gZXhwcmVzc2lvbi5tYXRjaCgvXihmYWtlcnxmYWtlcktPfGZha2VySkEpXFwuKC4qPykkLyk7XG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGZha2VyIGV4cHJlc3Npb246ICR7ZXhwcmVzc2lvbn1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBbLCBmYWtlck5hbWUsIGV4cHJdID0gbWF0Y2g7XG4gICAgY29uc3Qgc2VsZWN0ZWRGYWtlciA9XG4gICAgICBmYWtlck5hbWUgPT09IFwiZmFrZXJLT1wiID8gZmFrZXJLTyA6IGZha2VyTmFtZSA9PT0gXCJmYWtlckpBXCIgPyBmYWtlckpBIDogZmFrZXI7XG5cbiAgICBjb25zdCBmdW5jTWF0Y2ggPSBleHByLm1hdGNoKC9eKFtcXHcuXSspKD86XFwoKC4qPylcXCkpPyQvKTtcbiAgICBpZiAoIWZ1bmNNYXRjaCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGZha2VyIGV4cHJlc3Npb24gZm9yICR7cHJvcC5uYW1lfTogJHtleHByZXNzaW9ufWApO1xuICAgIH1cblxuICAgIGNvbnN0IFssIHBhdGgsIGFyZ3NTdHJdID0gZnVuY01hdGNoO1xuICAgIGNvbnN0IHBhcnRzID0gcGF0aC5zcGxpdChcIi5cIik7XG5cbiAgICAvKiog7KCQIO2RnOq4sOuylShkb3Qgbm90YXRpb24p7Jy866GcIEZha2VyIO2VqOyImOulvCDssL7slYTqsJHri4jri6QgKi9cbiAgICBsZXQgZm46IHVua25vd24gPSBzZWxlY3RlZEZha2VyO1xuICAgIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgICAgaWYgKHR5cGVvZiBmbiA9PT0gXCJvYmplY3RcIiAmJiBmbiAhPT0gbnVsbCAmJiBwYXJ0IGluIGZuKSB7XG4gICAgICAgIGZuID0gKGZuIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtwYXJ0XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBmYWtlciBwYXRoIGZvciAke3Byb3AubmFtZX06ICR7ZmFrZXJOYW1lfS4ke3BhdGh9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBmbiAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZmFrZXJOYW1lfS4ke3BhdGh9IGlzIG5vdCBhIGZ1bmN0aW9uIChmb3IgJHtwcm9wLm5hbWV9KWApO1xuICAgIH1cblxuICAgIGxldCBhcmdzOiB1bmtub3duW10gPSBbXTtcbiAgICBpZiAoYXJnc1N0cj8udHJpbSgpKSB7XG4gICAgICBhcmdzID0gdGhpcy5wYXJzZUdlbmVyYXRvckFyZ3MoYXJnc1N0ciwgcHJvcC5uYW1lKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZm4oLi4uYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogZml4dHVyZUhpbnTrpbwgTExN7JeQ6rKMIOyghOuLrO2VmOyXrCDtmITsi6TsoIHsnbgg7YWM7Iqk7Yq4IOuNsOydtO2EsOulvCDsg53shLHtlanri4jri6QuXG4gICAqXG4gICAqIGZha2VyLmpz66Gc64qUIOyDneyEse2VmOq4sCDslrTroKTsmrQg67O17J6h7ZWcIO2FjeyKpO2KuCjsnpDquLDshozqsJwsIOyEpOuqheusuCDrk7Ep66W8XG4gICAqIExMTeydhCDtmZzsmqntlZjsl6wg7IOd7ISx7ZWp64uI64ukLiDrj5nsnbztlZwgaGludOyXkCDrjIDtlZwg7KSR67O1IO2YuOy2nOydhCDrsKnsp4DtlZjquLAg7JyE7ZW0XG4gICAqIOy6kOyLseydhCDquLDrs7jsnLzroZwg7KeA7JuQ7ZWp64uI64ukIChMTE0gQVBJIOu5hOyaqSDsoIjqsJApLlxuICAgKlxuICAgKiBhaSDtjKjtgqTsp4DripQgZHluYW1pYyBpbXBvcnTroZwg67aI65+s7Jik66+A66GcLCB1c2VMTE3snbQgZmFsc2Xsnbgg6rK97JqwXG4gICAqIOydmOyhtOyEseydtCDshKTsuZjrkJjsp4Ag7JWK7JWE64+EIGZpeHR1cmUg7IOd7ISx7J20IOygleyDgSDrj5nsnpHtlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlV2l0aExMTShcbiAgICBmaXh0dXJlSGludDogc3RyaW5nLFxuICAgIHByb3A6IEVudGl0eVByb3AsXG4gICAgZW50aXR5OiBFbnRpdHksXG4gICAgcm93S2V5Pzogc3RyaW5nLFxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICAvLyByb3dLZXnqsIAg7J6I7Jy866m0IHJvdyDri6jsnIQg7IOd7ISxIOyghOuetSDsgqzsmqlcbiAgICBpZiAocm93S2V5KSB7XG4gICAgICBjb25zdCByb3dDYWNoZUtleSA9IGAke3Jvd0tleX06JHtwcm9wLm5hbWV9YDtcblxuICAgICAgLy8g7J2066+4IOydtCByb3fsl5Ag64yA7ZWcIExMTSDtmLjstpzsnbQg7JmE66OM65CcIOqyveyasCDsupDsi5zsl5DshJwg67CU66GcIOuwmO2ZmFxuICAgICAgaWYgKHRoaXMubGxtQ2FjaGUuaGFzKHJvd0NhY2hlS2V5KSkge1xuICAgICAgICByZXR1cm4gdGhpcy5sbG1DYWNoZS5nZXQocm93Q2FjaGVLZXkpO1xuICAgICAgfVxuXG4gICAgICAvLyDsg4ggcm93OiBMTE0g64yA7IOBIHByb3Ag7KCE7LK066W8IO2VnCDrsojsl5Ag7IOd7ISxXG4gICAgICBjb25zdCBsbG1Qcm9wcyA9IGVudGl0eS5wcm9wcy5maWx0ZXIoKHApID0+IHtcbiAgICAgICAgaWYgKGlzUmVsYXRpb25Qcm9wKHApKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChwLmNvbmU/LmZpeHR1cmVHZW5lcmF0b3IpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKHAubmFtZSA9PT0gXCJpZFwiICYmIHAuY29uZT8uZml4dHVyZVN0cmF0ZWd5ID09PSBcInNlcXVlbmNlXCIpIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuICEhcC5jb25lPy5ub3RlO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIGxsbVByb3Bz6rCAIOu5hOyWtOyeiOycvOuptCDri6jsnbwg7ZWE65OcIOuwqeyLneycvOuhnCBmYWxsYmFja1xuICAgICAgaWYgKGxsbVByb3BzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIGBbRml4dHVyZUdlbmVyYXRvcl0gbGxtUHJvcHMgaXMgZW1wdHkgZm9yICR7ZW50aXR5LmlkfS4ke3Byb3AubmFtZX0sIHVzaW5nIHNpbmdsZSBmaWVsZCBmYWxsYmFja2AsXG4gICAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVTaW5nbGVXaXRoTExNKGZpeHR1cmVIaW50LCBwcm9wLCBlbnRpdHkpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhcGlLZXkgPSB0aGlzLmdldEFwaUtleSgpO1xuICAgICAgY29uc3QgeyBjcmVhdGVBbnRocm9waWMgfSA9IGF3YWl0IGltcG9ydChcIkBhaS1zZGsvYW50aHJvcGljXCIpO1xuICAgICAgY29uc3QgeyBnZW5lcmF0ZVRleHQgfSA9IGF3YWl0IGltcG9ydChcImFpXCIpO1xuXG4gICAgICBjb25zdCB7IHRleHQgfSA9IGF3YWl0IGdlbmVyYXRlVGV4dCh7XG4gICAgICAgIG1vZGVsOiBjcmVhdGVBbnRocm9waWMoeyBhcGlLZXkgfSkodGhpcy5vcHRpb25zLmxsbU1vZGVsIHx8IFwiY2xhdWRlLXNvbm5ldC00LTVcIiksXG4gICAgICAgIHByb21wdDogdGhpcy5idWlsZFJvd0xMTVByb21wdChsbG1Qcm9wcywgZW50aXR5KSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyDsnZHri7XsnYQg7YyM7Iux7ZWY7JesIOqwgSDtlYTrk5zsl5Ag64yA7ZWcIOqysOqzvOulvCDsupDsi5zsl5Ag7KCA7J6lXG4gICAgICBjb25zdCByb3dSZXN1bHQgPSB0aGlzLnBhcnNlUm93TExNUmVzcG9uc2UodGV4dCwgbGxtUHJvcHMpO1xuICAgICAgZm9yIChjb25zdCBbZmllbGROYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocm93UmVzdWx0KSkge1xuICAgICAgICB0aGlzLmxsbUNhY2hlLnNldChgJHtyb3dLZXl9OiR7ZmllbGROYW1lfWAsIHZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgLy8g7JqU7LKt7ZWcIO2VhOuTnOydmCDqsJIg67CY7ZmYICjsl4bsnLzrqbQg64uo7J28IO2VhOuTnCBmYWxsYmFjaylcbiAgICAgIGlmICh0aGlzLmxsbUNhY2hlLmhhcyhyb3dDYWNoZUtleSkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGxtQ2FjaGUuZ2V0KHJvd0NhY2hlS2V5KTtcbiAgICAgIH1cblxuICAgICAgLy8g66eM7JW9IHJvdyDsnZHri7Xsl5Ag7J20IO2VhOuTnOqwgCDriITrnb3rkJwg6rK97JqwIOuLqOydvCDtlYTrk5wgZmFsbGJhY2tcbiAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlU2luZ2xlV2l0aExMTShmaXh0dXJlSGludCwgcHJvcCwgZW50aXR5KTtcbiAgICB9XG5cbiAgICAvLyByb3dLZXnqsIAg7JeG7Jy866m0IOq4sOyhtCDri6jsnbwg7ZWE65OcIOuwqeyLnVxuICAgIHJldHVybiB0aGlzLmdlbmVyYXRlU2luZ2xlV2l0aExMTShmaXh0dXJlSGludCwgcHJvcCwgZW50aXR5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDri6jsnbwg7ZWE65Oc66W8IExMTeycvOuhnCDsg53shLHtlanri4jri6QgKHJvd0tleSDsl4bsnYQg65WMIGZhbGxiYWNr7JqpKVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZVNpbmdsZVdpdGhMTE0oXG4gICAgZml4dHVyZUhpbnQ6IHN0cmluZyxcbiAgICBwcm9wOiBFbnRpdHlQcm9wLFxuICAgIGVudGl0eTogRW50aXR5LFxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBjb25zdCBjYWNoZUtleSA9IGAke2VudGl0eS5pZH06JHtwcm9wLm5hbWV9OiR7Zml4dHVyZUhpbnR9YDtcbiAgICBpZiAodGhpcy5vcHRpb25zLmVuYWJsZUxMTUNhY2hlICYmIHRoaXMubGxtQ2FjaGUuaGFzKGNhY2hlS2V5KSkge1xuICAgICAgcmV0dXJuIHRoaXMubGxtQ2FjaGUuZ2V0KGNhY2hlS2V5KTtcbiAgICB9XG5cbiAgICBjb25zdCBhcGlLZXkgPSB0aGlzLmdldEFwaUtleSgpO1xuICAgIGNvbnN0IHsgY3JlYXRlQW50aHJvcGljIH0gPSBhd2FpdCBpbXBvcnQoXCJAYWktc2RrL2FudGhyb3BpY1wiKTtcbiAgICBjb25zdCB7IGdlbmVyYXRlVGV4dCB9ID0gYXdhaXQgaW1wb3J0KFwiYWlcIik7XG5cbiAgICBjb25zdCB7IHRleHQgfSA9IGF3YWl0IGdlbmVyYXRlVGV4dCh7XG4gICAgICBtb2RlbDogY3JlYXRlQW50aHJvcGljKHsgYXBpS2V5IH0pKHRoaXMub3B0aW9ucy5sbG1Nb2RlbCB8fCBcImNsYXVkZS1zb25uZXQtNC01XCIpLFxuICAgICAgcHJvbXB0OiB0aGlzLmJ1aWxkTExNUHJvbXB0KGZpeHR1cmVIaW50LCBwcm9wLCBlbnRpdHkpLFxuICAgIH0pO1xuXG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLnBhcnNlTExNUmVzcG9uc2UodGV4dCwgcHJvcC50eXBlKTtcbiAgICBpZiAodGhpcy5vcHRpb25zLmVuYWJsZUxMTUNhY2hlKSB7XG4gICAgICB0aGlzLmxsbUNhY2hlLnNldChjYWNoZUtleSwgdmFsdWUpO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiByb3cg7KCE7LK066W8IO2VnCDrsojsl5Ag7IOd7ISx7ZWY64qUIExMTSDtlITroaztlITtirjrpbwg66eM65Ot64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZFJvd0xMTVByb21wdChwcm9wczogRW50aXR5UHJvcFtdLCBlbnRpdHk6IEVudGl0eSk6IHN0cmluZyB7XG4gICAgY29uc3QgbG9jYWxlID0gdGhpcy5vcHRpb25zLmxvY2FsZSB8fCBcImtvXCI7XG4gICAgY29uc3QgbGFuZ3VhZ2UgPSBsb2NhbGUgPT09IFwia29cIiA/IFwiS29yZWFuXCIgOiBsb2NhbGUgPT09IFwiamFcIiA/IFwiSmFwYW5lc2VcIiA6IFwiRW5nbGlzaFwiO1xuXG4gICAgY29uc3QgZmllbGREZXNjcmlwdGlvbnMgPSBwcm9wc1xuICAgICAgLm1hcCgocCkgPT4ge1xuICAgICAgICBsZXQgZGVzYyA9IGAtICR7cC5uYW1lfSAoJHtwLnR5cGV9KTogJHtwLmNvbmU/Lm5vdGUgPz8gXCJcIn1gO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgKHAudHlwZSA9PT0gXCJlbnVtXCIgfHwgcC50eXBlID09PSBcImVudW1bXVwiKSAmJlxuICAgICAgICAgIFwiaWRcIiBpbiBwICYmXG4gICAgICAgICAgcC5pZCAmJlxuICAgICAgICAgIGVudGl0eS5lbnVtTGFiZWxzPy5bcC5pZF1cbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgdmFsdWVzID0gT2JqZWN0LmtleXMoZW50aXR5LmVudW1MYWJlbHNbcC5pZF0pLmpvaW4oXCIsIFwiKTtcbiAgICAgICAgICBkZXNjICs9IGAgW2FsbG93ZWQgdmFsdWVzOiAke3ZhbHVlc31dYDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVzYztcbiAgICAgIH0pXG4gICAgICAuam9pbihcIlxcblwiKTtcblxuICAgIC8vIExMTSDrjIDsg4HsnbQg7JWE64uMIHByb3Drk6Trj4Qg66el65297Jy866GcIOygnOqztSAocmVsYXRpb24g7KCc7Jm4KVxuICAgIGNvbnN0IG90aGVyUHJvcHMgPSBlbnRpdHkucHJvcHNcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChwKSA9PlxuICAgICAgICAgICFwcm9wcy5pbmNsdWRlcyhwKSAmJlxuICAgICAgICAgICFpc1JlbGF0aW9uUHJvcChwKSAmJlxuICAgICAgICAgIHAubmFtZSAhPT0gXCJpZFwiICYmXG4gICAgICAgICAgIShcInZpcnR1YWxcIiBpbiBwICYmIHAudmlydHVhbCksXG4gICAgICApXG4gICAgICAubWFwKChwKSA9PiB7XG4gICAgICAgIGxldCBkZXNjID0gYC0gJHtwLm5hbWV9ICgke3AudHlwZX0pYDtcbiAgICAgICAgaWYgKHAuY29uZT8ubm90ZSkgZGVzYyArPSBgOiAke3AuY29uZS5ub3RlfWA7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAocC50eXBlID09PSBcImVudW1cIiB8fCBwLnR5cGUgPT09IFwiZW51bVtdXCIpICYmXG4gICAgICAgICAgXCJpZFwiIGluIHAgJiZcbiAgICAgICAgICBwLmlkICYmXG4gICAgICAgICAgZW50aXR5LmVudW1MYWJlbHM/LltwLmlkXVxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCB2YWx1ZXMgPSBPYmplY3Qua2V5cyhlbnRpdHkuZW51bUxhYmVsc1twLmlkXSkuam9pbihcIiwgXCIpO1xuICAgICAgICAgIGRlc2MgKz0gYCBbYWxsb3dlZCB2YWx1ZXM6ICR7dmFsdWVzfV1gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZXNjO1xuICAgICAgfSlcbiAgICAgIC5qb2luKFwiXFxuXCIpO1xuICAgIGNvbnN0IG90aGVyUHJvcHNDb250ZXh0ID0gb3RoZXJQcm9wc1xuICAgICAgPyBgXFxuXFxuT3RoZXIgZmllbGRzIGluIHRoaXMgZW50aXR5IChmb3IgY29udGV4dCwgZG8gTk9UIGdlbmVyYXRlIHRoZXNlKTpcXG4ke290aGVyUHJvcHN9YFxuICAgICAgOiBcIlwiO1xuXG4gICAgY29uc3Qgb3V0cHV0U2hhcGUgPSBwcm9wcy5tYXAoKHApID0+IGAgIFwiJHtwLm5hbWV9XCI6IDwke3AudHlwZX0+YCkuam9pbihcIixcXG5cIik7XG5cbiAgICBjb25zdCBlbnRpdHlDb250ZXh0ID0gZW50aXR5LmNvbmU/Lm5vdGUgPyBgXFxuRW50aXR5IGRlc2NyaXB0aW9uOiAke2VudGl0eS5jb25lLm5vdGV9YCA6IFwiXCI7XG5cbiAgICByZXR1cm4gYEdlbmVyYXRlIHRlc3QgZml4dHVyZSBkYXRhIGZvciB0aGUgJHtlbnRpdHkuaWR9IGVudGl0eS4gQWxsIGZpZWxkcyBtdXN0IGJlIGNvaGVyZW50IGFuZCBjb25zaXN0ZW50IHdpdGggZWFjaCBvdGhlci5cblxuRW50aXR5OiAke2VudGl0eS5pZH0ke2VudGl0eUNvbnRleHR9XG5Mb2NhbGU6ICR7bG9jYWxlfSAodXNlICR7bGFuZ3VhZ2V9IGZvciB0ZXh0IGZpZWxkcylcblxuRmllbGRzIHRvIGdlbmVyYXRlOlxuJHtmaWVsZERlc2NyaXB0aW9uc30ke290aGVyUHJvcHNDb250ZXh0fVxuXG5SdWxlczpcbi0gQWxsIGZpZWxkcyBpbiBhIHNpbmdsZSByb3cgbXVzdCBiZSBsb2dpY2FsbHkgY29uc2lzdGVudCAoZS5nLiBuYW1lL25hbWVfZW4vbmFtZV9jbiBzaG91bGQgcmVwcmVzZW50IHRoZSBzYW1lIHBlcnNvbilcbi0gUmV0dXJuIE9OTFkgdmFsaWQgSlNPTiwgbm8gbWFya2Rvd24gb3IgZXhwbGFuYXRpb25cbi0gRGF0ZXMgaW4gSVNPIDg2MDEgZm9ybWF0XG4tIFVzZSAke2xhbmd1YWdlfSBmb3IgdGV4dCB1bmxlc3MgZmllbGQgZGVzY3JpcHRpb24gc2F5cyBvdGhlcndpc2VcblxuUmV0dXJuIGV4YWN0bHkgdGhpcyBKU09OIHNoYXBlOlxue1xuJHtvdXRwdXRTaGFwZX1cbn1gO1xuICB9XG5cbiAgLyoqXG4gICAqIHJvdyBMTE0g7J2R64u17J2EIO2MjOyLse2VmOyXrCDtlYTrk5zrs4Qg6rCS7Jy866GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgcGFyc2VSb3dMTE1SZXNwb25zZSh0ZXh0OiBzdHJpbmcsIHByb3BzOiBFbnRpdHlQcm9wW10pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgY29uc3QganNvblRleHQgPSB0ZXh0XG4gICAgICAudHJpbSgpXG4gICAgICAucmVwbGFjZSgvXmBgYGpzb25cXHMqL2ksIFwiXCIpXG4gICAgICAucmVwbGFjZSgvYGBgXFxzKiQvLCBcIlwiKVxuICAgICAgLnRyaW0oKTtcblxuICAgIGxldCBwYXJzZWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIHRyeSB7XG4gICAgICBwYXJzZWQgPSBKU09OLnBhcnNlKGpzb25UZXh0KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgICFpc1Rlc3QoKSAmJiBjb25zb2xlLndhcm4oXCJbRml4dHVyZUdlbmVyYXRvcl0gRmFpbGVkIHRvIHBhcnNlIHJvdyBMTE0gcmVzcG9uc2U6XCIsIHRleHQpO1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IHByb3Agb2YgcHJvcHMpIHtcbiAgICAgIGlmIChwcm9wLm5hbWUgaW4gcGFyc2VkKSB7XG4gICAgICAgIHJlc3VsdFtwcm9wLm5hbWVdID0gdGhpcy5wYXJzZUxMTVJlc3BvbnNlKFN0cmluZyhwYXJzZWRbcHJvcC5uYW1lXSA/PyBcIlwiKSwgcHJvcC50eXBlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRMTE1Qcm9tcHQoaGludDogc3RyaW5nLCBwcm9wOiBFbnRpdHlQcm9wLCBlbnRpdHk6IEVudGl0eSk6IHN0cmluZyB7XG4gICAgY29uc3QgbG9jYWxlID0gdGhpcy5vcHRpb25zLmxvY2FsZSB8fCBcImtvXCI7XG4gICAgY29uc3QgbGFuZ3VhZ2UgPSBsb2NhbGUgPT09IFwia29cIiA/IFwiS29yZWFuXCIgOiBsb2NhbGUgPT09IFwiamFcIiA/IFwiSmFwYW5lc2VcIiA6IFwiRW5nbGlzaFwiO1xuXG4gICAgY29uc3QgZW50aXR5Q29udGV4dCA9IGVudGl0eS5jb25lPy5ub3RlID8gYFxcbkVudGl0eSBjb250ZXh0OiAke2VudGl0eS5jb25lLm5vdGV9YCA6IFwiXCI7XG5cbiAgICBjb25zdCBvdGhlckZpZWxkcyA9IGVudGl0eS5wcm9wc1xuICAgICAgLmZpbHRlcigocCkgPT4gcC5uYW1lICE9PSBwcm9wLm5hbWUgJiYgIWlzUmVsYXRpb25Qcm9wKHApICYmIHAuY29uZT8ubm90ZSlcbiAgICAgIC5tYXAoKHApID0+IGAtICR7cC5uYW1lfSAoJHtwLnR5cGV9KTogJHtwLmNvbmU/Lm5vdGV9YClcbiAgICAgIC5qb2luKFwiXFxuXCIpO1xuICAgIGNvbnN0IG90aGVyRmllbGRzQ29udGV4dCA9IG90aGVyRmllbGRzXG4gICAgICA/IGBcXG5cXG5PdGhlciBmaWVsZHMgaW4gdGhpcyBlbnRpdHkgKGZvciBjb250ZXh0KTpcXG4ke290aGVyRmllbGRzfWBcbiAgICAgIDogXCJcIjtcblxuICAgIGxldCBwcm9tcHQgPSBgR2VuZXJhdGUgdGVzdCBkYXRhIGZvciAke2VudGl0eS5pZH0uJHtwcm9wLm5hbWV9ICh0eXBlOiAke3Byb3AudHlwZX0pJHtlbnRpdHlDb250ZXh0fSR7b3RoZXJGaWVsZHNDb250ZXh0fVxuXG5SZXF1aXJlbWVudDogJHtoaW50fVxuXG5SdWxlczpcbi0gUmV0dXJuIE9OTFkgdGhlIHZhbHVlLCBubyBleHBsYW5hdGlvbiBvciBtYXJrZG93blxuLSBVc2UgJHtsYW5ndWFnZX0gbGFuZ3VhZ2UgaWYgYXBwbGljYWJsZVxuLSBGb3JtYXQ6ICR7dGhpcy5nZXRFeHBlY3RlZEZvcm1hdChwcm9wLnR5cGUpfWA7XG5cbiAgICAvLyBlbnVtIO2DgOyeheyduCDqsr3smrAg6rCA64ql7ZWcIOqwkiDrqqnroZ0g7LaU6rCAXG4gICAgaWYgKHByb3AudHlwZSA9PT0gXCJlbnVtXCIgfHwgcHJvcC50eXBlID09PSBcImVudW1bXVwiKSB7XG4gICAgICBsZXQgZW51bVZhbHVlczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgaWYgKFwiZW51bVwiIGluIHByb3AgJiYgQXJyYXkuaXNBcnJheShwcm9wLmVudW0pICYmIHByb3AuZW51bS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGVudW1WYWx1ZXMgPSBwcm9wLmVudW07XG4gICAgICB9IGVsc2UgaWYgKFwiaWRcIiBpbiBwcm9wICYmIHByb3AuaWQgJiYgZW50aXR5Py5lbnVtTGFiZWxzPy5bcHJvcC5pZF0pIHtcbiAgICAgICAgZW51bVZhbHVlcyA9IE9iamVjdC5rZXlzKGVudGl0eS5lbnVtTGFiZWxzW3Byb3AuaWRdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGVudW1WYWx1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBwcm9tcHQgKz0gYFxcbi0gSU1QT1JUQU5UOiBDaG9vc2UgT05MWSBmcm9tIHRoZXNlIGFsbG93ZWQgdmFsdWVzOiAke2VudW1WYWx1ZXMuam9pbihcIiwgXCIpfWA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJvbXB0ICs9IGBcXG5cXG5FeGFtcGxlOiAke3RoaXMuZ2V0RXhhbXBsZUZvclR5cGUocHJvcC50eXBlLCBsb2NhbGUpfWA7XG5cbiAgICByZXR1cm4gcHJvbXB0O1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZUxMTVJlc3BvbnNlKHRleHQ6IHN0cmluZywgcHJvcFR5cGU6IHN0cmluZyk6IHVua25vd24ge1xuICAgIGNvbnN0IGNsZWFuZWQgPSB0ZXh0LnRyaW0oKTtcblxuICAgIC8vIOuwsOyXtCDtg4DsnoUg7LKY66asXG4gICAgaWYgKHByb3BUeXBlLmVuZHNXaXRoKFwiW11cIikpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UoY2xlYW5lZCk7XG4gICAgICAgIGNvbnN0IGJhc2VUeXBlID0gcHJvcFR5cGUuc2xpY2UoMCwgLTIpOyAvLyBcImludGVnZXJbXVwiIC0+IFwiaW50ZWdlclwiXG5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGFyc2VkKSkge1xuICAgICAgICAgIHJldHVybiBwYXJzZWQubWFwKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAvLyBudWxsL3VuZGVmaW5lZOuKlCDtg4DsnoXrs4Qg6riw67O46rCS7Jy866GcXG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gbnVsbCB8fCBpdGVtID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RGVmYXVsdFZhbHVlRm9yVHlwZShiYXNlVHlwZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyDqsJ3ssrTripQgSlNPTi5zdHJpbmdpZnkg7ZuEIO2MjOyLsSAoanNvbiDtg4DsnoXsnbgg6rK97JqwKVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICAgIHJldHVybiBiYXNlVHlwZSA9PT0gXCJqc29uXCJcbiAgICAgICAgICAgICAgICA/IGl0ZW1cbiAgICAgICAgICAgICAgICA6IHRoaXMucGFyc2VTY2FsYXJWYWx1ZShKU09OLnN0cmluZ2lmeShpdGVtKSwgYmFzZVR5cGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gcHJpbWl0aXZlIOqwkuydgCDrrLjsnpDsl7TroZwg67OA7ZmYIO2bhCDtjIzsi7FcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcnNlU2NhbGFyVmFsdWUoU3RyaW5nKGl0ZW0pLCBiYXNlVHlwZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDri6jsnbwg6rCS7J20IOyYqCDqsr3smrAg67Cw7Je066GcIOqwkOyLuOq4sFxuICAgICAgICBpZiAocGFyc2VkID09PSBudWxsIHx8IHBhcnNlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIFt0aGlzLmdldERlZmF1bHRWYWx1ZUZvclR5cGUoYmFzZVR5cGUpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW3RoaXMucGFyc2VTY2FsYXJWYWx1ZShTdHJpbmcocGFyc2VkKSwgYmFzZVR5cGUpXTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucGFyc2VTY2FsYXJWYWx1ZShjbGVhbmVkLCBwcm9wVHlwZSk7XG4gIH1cblxuICBwcml2YXRlIGdldERlZmF1bHRWYWx1ZUZvclR5cGUocHJvcFR5cGU6IHN0cmluZyk6IHVua25vd24ge1xuICAgIHN3aXRjaCAocHJvcFR5cGUpIHtcbiAgICAgIGNhc2UgXCJpbnRlZ2VyXCI6XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgY2FzZSBcImJpZ0ludGVnZXJcIjpcbiAgICAgICAgcmV0dXJuIDBuO1xuICAgICAgY2FzZSBcImZsb2F0XCI6XG4gICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICBjYXNlIFwibnVtZXJpY1wiOlxuICAgICAgICByZXR1cm4gMDtcbiAgICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIGNhc2UgXCJkYXRlXCI6XG4gICAgICAgIHJldHVybiBuZXcgRGF0ZSgpO1xuICAgICAgY2FzZSBcImpzb25cIjpcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgY2FzZSBcInV1aWRcIjpcbiAgICAgICAgcmV0dXJuIFwiMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwXCI7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHBhcnNlU2NhbGFyVmFsdWUodGV4dDogc3RyaW5nLCBwcm9wVHlwZTogc3RyaW5nKTogdW5rbm93biB7XG4gICAgY29uc3QgY2xlYW5lZCA9IHRleHQudHJpbSgpO1xuXG4gICAgc3dpdGNoIChwcm9wVHlwZSkge1xuICAgICAgY2FzZSBcImludGVnZXJcIjoge1xuICAgICAgICBjb25zdCBudW0gPSBwYXJzZUludChjbGVhbmVkLCAxMCk7XG4gICAgICAgIHJldHVybiBOdW1iZXIuaXNOYU4obnVtKSA/IDAgOiBudW07XG4gICAgICB9XG4gICAgICBjYXNlIFwiYmlnSW50ZWdlclwiOiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIEJpZ0ludChjbGVhbmVkKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcmV0dXJuIDBuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjYXNlIFwiZmxvYXRcIjpcbiAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgIGNhc2UgXCJudW1lcmljXCI6IHtcbiAgICAgICAgY29uc3QgbnVtID0gcGFyc2VGbG9hdChjbGVhbmVkKTtcbiAgICAgICAgcmV0dXJuIE51bWJlci5pc05hTihudW0pID8gMCA6IG51bTtcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICAgIHJldHVybiBjbGVhbmVkLnRvTG93ZXJDYXNlKCkgPT09IFwidHJ1ZVwiO1xuICAgICAgY2FzZSBcImRhdGVcIjoge1xuICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoY2xlYW5lZCk7XG4gICAgICAgIHJldHVybiBOdW1iZXIuaXNOYU4oZGF0ZS5nZXRUaW1lKCkpID8gbmV3IERhdGUoKSA6IGRhdGU7XG4gICAgICB9XG4gICAgICBjYXNlIFwianNvblwiOlxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKGNsZWFuZWQpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICByZXR1cm4gY2xlYW5lZDtcbiAgICAgICAgfVxuICAgICAgY2FzZSBcInV1aWRcIjpcbiAgICAgIGNhc2UgXCJlbnVtXCI6XG4gICAgICAgIHJldHVybiBjbGVhbmVkO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGNsZWFuZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGZha2VyIO2VqOyImCDsnbjsnpAg66y47J6Q7Je07J2EIO2MjOyLse2VmOyXrCDsnbjsnpAg67Cw7Je066GcIOuwmO2ZmO2VqeuLiOuLpC5cbiAgICpcbiAgICogM+uLqOqzhCDsoITrnrU6XG4gICAqIDEuIEpTT04g7KeB7KCRIO2MjOyLsSAo7ZGc7KSAIEpTT04g7ZGc7ZiE7IudKVxuICAgKiAyLiBKUyDqsJ3ssrQg66as7YSw65+0IOKGkiBKU09OIOuzgO2ZmCDtm4Qg7J6s7Iuc64+EIChzaW5nbGUgcXVvdGUsIHVucXVvdGVkIGtleSDsspjrpqwpXG4gICAqIDMuIOuLqOyInCDri6jsnbwg7J247J6QIO2PtOuwsSAo7Iir7J6QLCDrrLjsnpDsl7QpXG4gICAqL1xuICBwcml2YXRlIHBhcnNlR2VuZXJhdG9yQXJncyhhcmdzU3RyOiBzdHJpbmcsIHByb3BOYW1lOiBzdHJpbmcpOiB1bmtub3duW10ge1xuICAgIC8vIDEuIEpTT04g7KeB7KCRIO2MjOyLsVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGBbJHthcmdzU3RyfV1gKSBhcyB1bmtub3duO1xuICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkocGFyc2VkKSA/IHBhcnNlZCA6IFtwYXJzZWRdO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8g6rOE7IaNXG4gICAgfVxuXG4gICAgLy8gMi4gSlMg6rCd7LK0IOumrO2EsOuftCDihpIgSlNPTiDrs4DtmZgg7ZuEIOyerOyLnOuPhFxuICAgIHRyeSB7XG4gICAgICBjb25zdCBqc29uU3RyID0gdGhpcy5jb252ZXJ0SnNMaXRlcmFsVG9Kc29uKGFyZ3NTdHIpO1xuICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShgWyR7anNvblN0cn1dYCkgYXMgdW5rbm93bjtcbiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHBhcnNlZCkgPyBwYXJzZWQgOiBbcGFyc2VkXTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIOqzhOyGjVxuICAgIH1cblxuICAgIC8vIDMuIOuLqOyInCDri6jsnbwg7J247J6QIO2PtOuwsVxuICAgIGNvbnN0IHRyaW1tZWQgPSBhcmdzU3RyLnRyaW0oKTtcbiAgICBpZiAoIU51bWJlci5pc05hTihOdW1iZXIodHJpbW1lZCkpKSB7XG4gICAgICByZXR1cm4gW051bWJlcih0cmltbWVkKV07XG4gICAgfVxuICAgIGlmIChcbiAgICAgICh0cmltbWVkLnN0YXJ0c1dpdGgoJ1wiJykgJiYgdHJpbW1lZC5lbmRzV2l0aCgnXCInKSkgfHxcbiAgICAgICh0cmltbWVkLnN0YXJ0c1dpdGgoXCInXCIpICYmIHRyaW1tZWQuZW5kc1dpdGgoXCInXCIpKVxuICAgICkge1xuICAgICAgcmV0dXJuIFt0cmltbWVkLnNsaWNlKDEsIC0xKV07XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBGaXh0dXJlR2VuZXJhdG9yOiBDYW5ub3QgcGFyc2UgYXJndW1lbnRzIGZvciAke3Byb3BOYW1lfTogJHthcmdzU3RyfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEpTIOqwneyytCDrpqzthLDrn7TsnYQgSlNPTuycvOuhnCDrs4DtmZjtlanri4jri6QuXG4gICAqXG4gICAqIOuRkCDqsIDsp4Ag67OA7ZmYOlxuICAgKiAxLiBTaW5nbGUtcXVvdGVkIOusuOyekOyXtCDihpIgZG91YmxlLXF1b3RlZCAo7J207Iqk7LyA7J207ZSEIOyymOumrCDtj6ztlagpXG4gICAqIDIuIFVucXVvdGVkIOqwneyytCDtgqQg4oaSIGRvdWJsZS1xdW90ZWRcbiAgICovXG4gIHByaXZhdGUgY29udmVydEpzTGl0ZXJhbFRvSnNvbihpbnB1dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyAxLiAndmFsdWUnIOKGkiBcInZhbHVlXCIgKOuCtOu2gCBcIiDsnbTsiqTsvIDsnbTtlIQsIFxcJyDihpIgJylcbiAgICBjb25zdCB3aXRoRG91YmxlUXVvdGVzID0gaW5wdXQucmVwbGFjZShcbiAgICAgIC8nKFteJ1xcXFxdKig/OlxcXFwuW14nXFxcXF0qKSopJy9nLFxuICAgICAgKF8sIGNvbnRlbnQ6IHN0cmluZykgPT4gYFwiJHtjb250ZW50LnJlcGxhY2UoL1wiL2csICdcXFxcXCInKS5yZXBsYWNlKC9cXFxcJy9nLCBcIidcIil9XCJgLFxuICAgICk7XG5cbiAgICAvLyAyLiB7IGtleTog4oaSIHsgXCJrZXlcIjpcbiAgICByZXR1cm4gd2l0aERvdWJsZVF1b3Rlcy5yZXBsYWNlKC8oW3ssXVxccyopKFthLXpBLVpfJF1bXFx3JF0qKShcXHMqOikvZywgJyQxXCIkMlwiJDMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTb25hbXUuc2VjcmV07J2EIOyasOyEoOycvOuhnCDtlZjqs6AsIOyXhuycvOuptCDtmZjqsr3rs4DsiJjsl5DshJwgQVBJIO2CpOulvCDsnb3sirXri4jri6QuXG4gICAqXG4gICAqIFNvbmFtdS5zZWNyZXTsnYAg7ZSE66Gc7KCd7Yq467OEIOyEpOyglShzb25hbXUuY29uZmlnLnRzKeydtOuvgOuhnCDrjZQg64aS7J2AIOyasOyEoOyInOychOulvCDqsIDsp4DrqbAsXG4gICAqIO2ZmOqyveuzgOyImOuKlCDqsJzrsJwg7ZmY6rK97J2064KYIENJL0NE7JeQ7IScIGZhbGxiYWNr7Jy866GcIOyCrOyaqeuQqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgZ2V0QXBpS2V5KCk6IHN0cmluZyB7XG4gICAgbGV0IGFwaUtleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgU29uYW11IH0gPSByZXF1aXJlKFwiLi4vYXBpXCIpO1xuICAgICAgYXBpS2V5ID0gU29uYW11LnNlY3JldD8uYW50aHJvcGljX2FwaV9rZXk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBTb25hbXXqsIAg7LSI6riw7ZmU65CY7KeAIOyViuydgCDqsr3smrAgKO2FjOyKpO2KuCDtmZjqsr0g65OxKVxuICAgIH1cblxuICAgIGlmICghYXBpS2V5KSB7XG4gICAgICBhcGlLZXkgPSBwcm9jZXNzLmVudi5BTlRIUk9QSUNfQVBJX0tFWTtcbiAgICB9XG5cbiAgICBpZiAoIWFwaUtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIkFOVEhST1BJQ19BUElfS0VZIG5vdCBmb3VuZC4gU2V0IGl0IGluIGVudmlyb25tZW50IHZhcmlhYmxlcyBvciBTb25hbXUuc2VjcmV0LmFudGhyb3BpY19hcGlfa2V5XCIsXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBhcGlLZXk7XG4gIH1cblxuICBwcml2YXRlIGdldEV4cGVjdGVkRm9ybWF0KHByb3BUeXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIOuwsOyXtCDtg4DsnoUg7LKY66asXG4gICAgaWYgKHByb3BUeXBlLmVuZHNXaXRoKFwiW11cIikpIHtcbiAgICAgIGNvbnN0IGJhc2VUeXBlID0gcHJvcFR5cGUuc2xpY2UoMCwgLTIpO1xuICAgICAgY29uc3QgYmFzZUZvcm1hdCA9IHRoaXMuZ2V0U2NhbGFyRm9ybWF0KGJhc2VUeXBlKTtcbiAgICAgIHJldHVybiBgSlNPTiBhcnJheSBvZiAke2Jhc2VGb3JtYXR9IChlLmcuLCBbJHt0aGlzLmdldEV4YW1wbGVGb3JUeXBlKGJhc2VUeXBlLCBcImVuXCIpfSwgLi4uXSlgO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmdldFNjYWxhckZvcm1hdChwcm9wVHlwZSk7XG4gIH1cblxuICBwcml2YXRlIGdldFNjYWxhckZvcm1hdChwcm9wVHlwZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBzd2l0Y2ggKHByb3BUeXBlKSB7XG4gICAgICBjYXNlIFwiaW50ZWdlclwiOlxuICAgICAgY2FzZSBcImJpZ0ludGVnZXJcIjpcbiAgICAgICAgcmV0dXJuIFwiaW50ZWdlciBudW1iZXJzXCI7XG4gICAgICBjYXNlIFwiZmxvYXRcIjpcbiAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgIGNhc2UgXCJudW1lcmljXCI6XG4gICAgICAgIHJldHVybiBcImRlY2ltYWwgbnVtYmVyc1wiO1xuICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgcmV0dXJuIFwiYm9vbGVhbnMgKHRydWUgb3IgZmFsc2UpXCI7XG4gICAgICBjYXNlIFwiZGF0ZVwiOlxuICAgICAgICByZXR1cm4gXCJJU08gODYwMSBkYXRlIHN0cmluZ3NcIjtcbiAgICAgIGNhc2UgXCJqc29uXCI6XG4gICAgICAgIHJldHVybiBcInZhbGlkIEpTT04gb2JqZWN0IG9yIGFycmF5XCI7XG4gICAgICBjYXNlIFwidXVpZFwiOlxuICAgICAgICByZXR1cm4gXCJVVUlEIHN0cmluZ3NcIjtcbiAgICAgIGNhc2UgXCJlbnVtXCI6XG4gICAgICAgIHJldHVybiBcIm9uZSBvZiB0aGUgYWxsb3dlZCBlbnVtIHZhbHVlc1wiO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFwicGxhaW4gdGV4dCBzdHJpbmdzXCI7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRFeGFtcGxlRm9yVHlwZShwcm9wVHlwZTogc3RyaW5nLCBsb2NhbGU6IExvY2FsZSk6IHN0cmluZyB7XG4gICAgLy8g67Cw7Je0IO2DgOyehSDsspjrpqxcbiAgICBpZiAocHJvcFR5cGUuZW5kc1dpdGgoXCJbXVwiKSkge1xuICAgICAgY29uc3QgYmFzZVR5cGUgPSBwcm9wVHlwZS5zbGljZSgwLCAtMik7XG4gICAgICBjb25zdCBiYXNlRXhhbXBsZSA9IHRoaXMuZ2V0U2NhbGFyRXhhbXBsZShiYXNlVHlwZSwgbG9jYWxlKTtcbiAgICAgIHJldHVybiBgWyR7YmFzZUV4YW1wbGV9XWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZ2V0U2NhbGFyRXhhbXBsZShwcm9wVHlwZSwgbG9jYWxlKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2NhbGFyRXhhbXBsZShwcm9wVHlwZTogc3RyaW5nLCBsb2NhbGU6IExvY2FsZSk6IHN0cmluZyB7XG4gICAgY29uc3QgaXNLb3JlYW4gPSBsb2NhbGUgPT09IFwia29cIjtcblxuICAgIHN3aXRjaCAocHJvcFR5cGUpIHtcbiAgICAgIGNhc2UgXCJpbnRlZ2VyXCI6XG4gICAgICBjYXNlIFwiYmlnSW50ZWdlclwiOlxuICAgICAgICByZXR1cm4gXCI0MlwiO1xuICAgICAgY2FzZSBcImZsb2F0XCI6XG4gICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICBjYXNlIFwibnVtZXJpY1wiOlxuICAgICAgICByZXR1cm4gXCIzLjE0XCI7XG4gICAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgICByZXR1cm4gXCJ0cnVlXCI7XG4gICAgICBjYXNlIFwiZGF0ZVwiOlxuICAgICAgICByZXR1cm4gXCIyMDI0LTAxLTAxXCI7XG4gICAgICBjYXNlIFwianNvblwiOlxuICAgICAgICByZXR1cm4gJ3tcImtleVwiOiBcInZhbHVlXCJ9JztcbiAgICAgIGNhc2UgXCJ1dWlkXCI6XG4gICAgICAgIHJldHVybiBcIjU1MGU4NDAwLWUyOWItNDFkNC1hNzE2LTQ0NjY1NTQ0MDAwMFwiO1xuICAgICAgY2FzZSBcImVudW1cIjpcbiAgICAgICAgcmV0dXJuIFwiRU5VTV9WQUxVRVwiO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGlzS29yZWFuID8gXCLslYjrhZXtlZjshLjsmpRcIiA6IFwiSGVsbG9cIjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog7J2066aE7J2EIOydtOuplOydvCDroZzsu6wg7YyM7Yq47JqpIOuhnOuniOuCmOydtOymiOuTnCDrrLjsnpDsl7TroZwg67OA7ZmY7ZWp64uI64ukLlxuICAgKlxuICAgKiDtlZzquIAg7J2066aE7J2AIOy0iOyEsS3spJHshLEt7KKF7ISxIOu2hO2VtCDtm4Qg66Gc66eI64KY7J207KaIIOyymOumrO2VqeuLiOuLpC5cbiAgICog7JiB66y4IOydtOumhOydgCDshozrrLjsnpDroZwg67OA7ZmY7ZWY6rOgIOqzteuwseydhCDsoJAoLilcXHVjNzNj66GcIOy5mO2ZmO2VqeuLiOuLpC5cbiAgICog7JiIOiBcIuq5gOyyoOyImFwiIOKGkiBcImNoZW9sc3Uua2ltXCIsIFwiSm9obiBEb2VcIiDihpIgXCJqb2huLmRvZVwiXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJvbWFuaXplTmFtZShuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIC8vIO2VnOq4gCDtj6ztlagg7Jes67aAIO2ZleyduFxuICAgIGlmICgvW1xcdUFDMDAtXFx1RDdBRl0vLnRlc3QobmFtZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLnJvbWFuaXplS29yZWFuTmFtZShuYW1lKTtcbiAgICB9XG4gICAgLy8g7JiB66y4OiDshozrrLjsnpAgKyDsoJAg6rWs67aEXG4gICAgcmV0dXJuIG5hbWVcbiAgICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgICAucmVwbGFjZSgvXFxzKy9nLCBcIi5cIilcbiAgICAgIC5yZXBsYWNlKC9bXmEtejAtOS5dL2csIFwiXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VnOq4gCDsnbTrpoTsnYQg66Gc66eI64KY7J207KaIIOyymOumrO2VqeuLiOuLpC5cbiAgICpcbiAgICog7LSI7ISxL+ykkeyEsS/sooXshLEg66ek7ZWRIO2FjOydtOu4lOydhCDsgqzsmqntlZjsl6wg7ZWc6riA7J2EIOuhnOuniOyekOuhnCDrs4DtmZjtlanri4jri6QuXG4gICAqIOyyqyDquIDsnpDrpbwg7ISx7Jy866GcIOqwhOyjvO2VmOyXrCBcIuq5gOyyoOyImFwiIOKGkiBcImNoZW9sc3Uua2ltXCIg7ZiV7YOc66GcIOy2nOugpe2VqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgcm9tYW5pemVLb3JlYW5OYW1lKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgQ0hPU0VPTkcgPSBbXG4gICAgICBcImdcIixcbiAgICAgIFwia2tcIixcbiAgICAgIFwiblwiLFxuICAgICAgXCJkXCIsXG4gICAgICBcInR0XCIsXG4gICAgICBcInJcIixcbiAgICAgIFwibVwiLFxuICAgICAgXCJiXCIsXG4gICAgICBcInBwXCIsXG4gICAgICBcInNcIixcbiAgICAgIFwic3NcIixcbiAgICAgIFwiXCIsXG4gICAgICBcImpcIixcbiAgICAgIFwiampcIixcbiAgICAgIFwiY2hcIixcbiAgICAgIFwia1wiLFxuICAgICAgXCJ0XCIsXG4gICAgICBcInBcIixcbiAgICAgIFwiaFwiLFxuICAgIF07XG4gICAgY29uc3QgSlVOR1NFT05HID0gW1xuICAgICAgXCJhXCIsXG4gICAgICBcImFlXCIsXG4gICAgICBcInlhXCIsXG4gICAgICBcInlhZVwiLFxuICAgICAgXCJlb1wiLFxuICAgICAgXCJlXCIsXG4gICAgICBcInllb1wiLFxuICAgICAgXCJ5ZVwiLFxuICAgICAgXCJvXCIsXG4gICAgICBcIndhXCIsXG4gICAgICBcIndhZVwiLFxuICAgICAgXCJvZVwiLFxuICAgICAgXCJ5b1wiLFxuICAgICAgXCJ1XCIsXG4gICAgICBcIndvXCIsXG4gICAgICBcIndlXCIsXG4gICAgICBcIndpXCIsXG4gICAgICBcInl1XCIsXG4gICAgICBcImV1XCIsXG4gICAgICBcInVpXCIsXG4gICAgICBcImlcIixcbiAgICBdO1xuICAgIGNvbnN0IEpPTkdTRU9ORyA9IFtcbiAgICAgIFwiXCIsXG4gICAgICBcImtcIixcbiAgICAgIFwia1wiLFxuICAgICAgXCJrXCIsXG4gICAgICBcIm5cIixcbiAgICAgIFwiblwiLFxuICAgICAgXCJuXCIsXG4gICAgICBcInRcIixcbiAgICAgIFwibFwiLFxuICAgICAgXCJsXCIsXG4gICAgICBcImxcIixcbiAgICAgIFwibFwiLFxuICAgICAgXCJsXCIsXG4gICAgICBcImxcIixcbiAgICAgIFwibFwiLFxuICAgICAgXCJsXCIsXG4gICAgICBcIm1cIixcbiAgICAgIFwicFwiLFxuICAgICAgXCJwXCIsXG4gICAgICBcInRcIixcbiAgICAgIFwidFwiLFxuICAgICAgXCJuZ1wiLFxuICAgICAgXCJ0XCIsXG4gICAgICBcInRcIixcbiAgICAgIFwia1wiLFxuICAgICAgXCJ0XCIsXG4gICAgICBcInBcIixcbiAgICAgIFwidFwiLFxuICAgIF07XG5cbiAgICBjb25zdCByb21hbml6ZSA9IChjaGFyOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICAgICAgY29uc3QgY29kZSA9IGNoYXIuY2hhckNvZGVBdCgwKTtcbiAgICAgIGlmIChjb2RlIDwgMHhhYzAwIHx8IGNvZGUgPiAweGQ3YWYpIHJldHVybiBjaGFyO1xuICAgICAgY29uc3Qgb2Zmc2V0ID0gY29kZSAtIDB4YWMwMDtcbiAgICAgIGNvbnN0IGNobyA9IE1hdGguZmxvb3Iob2Zmc2V0IC8gNTg4KTtcbiAgICAgIGNvbnN0IGp1bmcgPSBNYXRoLmZsb29yKChvZmZzZXQgJSA1ODgpIC8gMjgpO1xuICAgICAgY29uc3Qgam9uZyA9IG9mZnNldCAlIDI4O1xuICAgICAgcmV0dXJuIENIT1NFT05HW2Nob10gKyBKVU5HU0VPTkdbanVuZ10gKyBKT05HU0VPTkdbam9uZ107XG4gICAgfTtcblxuICAgIGNvbnN0IGNoYXJzID0gWy4uLm5hbWVdO1xuICAgIC8vIOyyqyDquIDsnpDrpbwg7ISxKOWnkynsnLzroZwg6rCE7KO8XG4gICAgY29uc3QgZmFtaWx5TmFtZSA9IHJvbWFuaXplKGNoYXJzWzBdKTtcbiAgICBjb25zdCBnaXZlbk5hbWUgPSBjaGFycy5zbGljZSgxKS5tYXAocm9tYW5pemUpLmpvaW4oXCJcIik7XG5cbiAgICBpZiAoZ2l2ZW5OYW1lKSB7XG4gICAgICByZXR1cm4gYCR7Z2l2ZW5OYW1lfS4ke2ZhbWlseU5hbWV9YDtcbiAgICB9XG4gICAgcmV0dXJuIGZhbWlseU5hbWU7XG4gIH1cblxuICAvKipcbiAgICogTExNIOy6kOyLnCDthrXqs4Trpbwg67CY7ZmY7ZWp64uI64ukLlxuICAgKi9cbiAgZ2V0TExNQ2FjaGVTdGF0cygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2l6ZTogdGhpcy5sbG1DYWNoZS5zaXplLFxuICAgICAgZW5hYmxlZDogdGhpcy5vcHRpb25zLmVuYWJsZUxMTUNhY2hlLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogTExNIOy6kOyLnOulvCDstIjquLDtmZTtlanri4jri6QuXG4gICAqL1xuICBjbGVhckxMTUNhY2hlKCkge1xuICAgIHRoaXMubGxtQ2FjaGUuY2xlYXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDsu6jthY3siqTtirgg7IOd7ISxXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUNvbnRleHQoKTogR2VuZXJhdG9yQ29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZpeHR1cmVzOiBuZXcgTWFwKCksXG4gICAgICByZWZlcmVuY2VDYWNoZTogbmV3IE1hcCgpLFxuICAgICAgaW1wb3J0ZWRSZWNvcmRzOiBuZXcgU2V0KCksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDrsLDsuZgg7IOd7ISxIOuwjyDsnpDrj5kg7KCA7J6lXG4gICAqXG4gICAqIDEuIOqwgSBzcGVj67OE66GcIGZpeHR1cmUg7IOd7ISxICjrqZTrqqjrpqwpXG4gICAqIDIuIEZpeHR1cmVSZWNvcmTroZwg67OA7ZmYXG4gICAqIDMuIEZpeHR1cmVNYW5hZ2VyLmluc2VydEZpeHR1cmVzKCnroZwgdGFyZ2V0RGLsl5Ag7KCA7J6lXG4gICAqXG4gICAqIEByZXR1cm5zIOyggOyepeuQnCBmaXh0dXJlIOuNsOydtO2EsCAo7Iuk7KCcIERCIElEIO2PrO2VqClcbiAgICovXG4gIGFzeW5jIGdlbmVyYXRlQmF0Y2goXG4gICAgc3BlY3M6IEFycmF5PHsgZW50aXR5OiBzdHJpbmc7IGNvdW50OiBudW1iZXI7IG92ZXJyaWRlcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0+LFxuICApOiBQcm9taXNlPEZpeHR1cmVJbXBvcnRSZXN1bHRbXT4ge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmNyZWF0ZUNvbnRleHQoKTtcbiAgICBjb25zdCBnZW5lcmF0ZWRGaXh0dXJlczogQXJyYXk8eyBlbnRpdHk6IHN0cmluZzsgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfT4gPSBbXTtcblxuICAgIC8vIDEuIOqwgSBzcGVj67OE66GcIGZpeHR1cmUg7IOd7ISxXG4gICAgZm9yIChjb25zdCBzcGVjIG9mIHNwZWNzKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNwZWMuY291bnQ7IGkrKykge1xuICAgICAgICBjb25zdCBmaXh0dXJlID0gYXdhaXQgdGhpcy5nZW5lcmF0ZShzcGVjLmVudGl0eSwgc3BlYy5vdmVycmlkZXMgfHwge30sIGNvbnRleHQpO1xuICAgICAgICBnZW5lcmF0ZWRGaXh0dXJlcy5wdXNoKHtcbiAgICAgICAgICBlbnRpdHk6IHNwZWMuZW50aXR5LFxuICAgICAgICAgIGRhdGE6IGZpeHR1cmUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDIuIEZpeHR1cmVSZWNvcmTroZwg67OA7ZmYXG4gICAgY29uc3QgZml4dHVyZVJlY29yZHM6IEZpeHR1cmVSZWNvcmRbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgeyBlbnRpdHk6IGVudGl0eU5hbWUsIGRhdGEgfSBvZiBnZW5lcmF0ZWRGaXh0dXJlcykge1xuICAgICAgY29uc3QgZW50aXR5ID0gdGhpcy5lbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlOYW1lKTtcblxuICAgICAgLy8gaW50ZWdlci9iaWdJbnRlZ2VyIFBL64qUIOyehOyLnCBJRCDsg53shLEgKERCIOyLnO2AgOyKpOqwgCDsi6TsoJwgSUQg7ZWg64u5KVxuICAgICAgLy8gc3RyaW5nIFBL64qUIGdlbmVyYXRlKCnsl5DshJwg7J2066+4IOyDneyEseuQnCBpZCDqsJLsnYQg6re464yA66GcIOyCrOyaqVxuICAgICAgY29uc3QgaWRQcm9wID0gZW50aXR5LnByb3BzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gXCJpZFwiKTtcbiAgICAgIGNvbnN0IHVzZXNTZXF1ZW5jZSA9XG4gICAgICAgIGlkUHJvcD8udHlwZSA9PT0gXCJpbnRlZ2VyXCIgfHxcbiAgICAgICAgaWRQcm9wPy50eXBlID09PSBcImJpZ0ludGVnZXJcIiB8fFxuICAgICAgICBpZFByb3A/LmNvbmU/LmZpeHR1cmVTdHJhdGVneSA9PT0gXCJzZXF1ZW5jZVwiO1xuXG4gICAgICBjb25zdCBkYXRhRm9yUmVjb3JkID0gdXNlc1NlcXVlbmNlXG4gICAgICAgID8geyAuLi5kYXRhLCBpZDogTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTAwMDAwMCkgfVxuICAgICAgICA6IGRhdGE7XG5cbiAgICAgIGNvbnN0IHJlY29yZHMgPSBhd2FpdCBGaXh0dXJlTWFuYWdlci5jcmVhdGVGaXh0dXJlUmVjb3JkKFxuICAgICAgICBlbnRpdHksXG4gICAgICAgIGRhdGFGb3JSZWNvcmQgYXMgeyBpZDogbnVtYmVyIHwgc3RyaW5nOyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgbnVsbCB9LFxuICAgICAgICB7IHNpbmdsZVJlY29yZDogdHJ1ZSB9LFxuICAgICAgKTtcbiAgICAgIGZpeHR1cmVSZWNvcmRzLnB1c2goLi4ucmVjb3Jkcyk7XG4gICAgfVxuXG4gICAgLy8gMy4gdGFyZ2V0RGLsl5Ag7IK97J6FIChGaXh0dXJlTWFuYWdlcuqwgCDsnZjsobTshLEg7KCV66CsIOyymOumrClcbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgRml4dHVyZU1hbmFnZXIuaW5zZXJ0Rml4dHVyZXModGhpcy50YXJnZXREYk5hbWUsIGZpeHR1cmVSZWNvcmRzKTtcblxuICAgICFpc1Rlc3QoKSAmJlxuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGNoYWxrLmdyZWVuKGBHZW5lcmF0ZWQgYW5kIHNhdmVkICR7cmVzdWx0cy5sZW5ndGh9IGZpeHR1cmVzIHRvICR7dGhpcy50YXJnZXREYk5hbWV9YCksXG4gICAgICApO1xuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG5cbiAgLyoqXG4gICAqIOyLpOygnCBEQihzb3VyY2VEYinsl5DshJwg642w7J207YSw66W8IOyhsO2ajO2VmOyXrCBmaXh0dXJlIERCKHRhcmdldERiKeyXkCBpbXBvcnTtlanri4jri6QuXG4gICAqXG4gICAqIDEuIERhdGFFeHBsb3JlcuuhnCBzb3VyY2VEYuyXkOyEnCDrjbDsnbTthLAg7KGw7ZqMICjqtIDroKgg642w7J207YSwIO2PrO2VqClcbiAgICogMi4gRml4dHVyZVJlY29yZOuhnCDrs4DtmZhcbiAgICogMy4gdGFyZ2V0RGLsl5Ag7IK97J6FXG4gICAqXG4gICAqIEBwYXJhbSBlbnRpdHlOYW1lIC0g7KGw7ZqM7ZWgIGVudGl0eSDsnbTrpoRcbiAgICogQHBhcmFtIG9wdGlvbnMgLSDsobDtmowg7Ji17IWYIChzdHJhdGVneSwgbGltaXQsIGluY2x1ZGVSZWxhdGlvbnMg65OxKVxuICAgKiBAcmV0dXJucyDsoIDsnqXrkJwgZml4dHVyZSDrjbDsnbTthLAgKOyLpOygnCBEQiBJRCDtj6ztlagpXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIO2UhOuhnOuNleyFmCBEQuyXkOyEnCBVc2VyIDEw66qFICsg6rSA66CoIEVtcGxveWVlLCBEZXBhcnRtZW50IOqwgOyguOyYpOq4sFxuICAgKiBhd2FpdCBnZW5lcmF0b3IuaW1wb3J0RnJvbVNvdXJjZShcIlVzZXJcIiwge1xuICAgKiAgIHN0cmF0ZWd5OiBcInNhbXBsZVwiLFxuICAgKiAgIGxpbWl0OiAxMCxcbiAgICogICBpbmNsdWRlUmVsYXRpb25zOiB0cnVlLFxuICAgKiAgIG1heERlcHRoOiAyXG4gICAqIH0pO1xuICAgKi9cbiAgYXN5bmMgaW1wb3J0RnJvbVNvdXJjZShcbiAgICBlbnRpdHlOYW1lOiBzdHJpbmcsXG4gICAgb3B0aW9uczogRXhwbG9yZVdpdGhSZWxhdGlvbnNPcHRpb25zLFxuICApOiBQcm9taXNlPEZpeHR1cmVJbXBvcnRSZXN1bHRbXT4ge1xuICAgICFpc1Rlc3QoKSAmJlxuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGNoYWxrLmJsdWUoXG4gICAgICAgICAgYEltcG9ydGluZyAke2VudGl0eU5hbWV9IGZyb20gc291cmNlIERCIHdpdGggb3B0aW9uczogJHtKU09OLnN0cmluZ2lmeSh7IHN0cmF0ZWd5OiBvcHRpb25zLnN0cmF0ZWd5LCBsaW1pdDogb3B0aW9ucy5saW1pdCwgaW5jbHVkZVJlbGF0aW9uczogb3B0aW9ucy5pbmNsdWRlUmVsYXRpb25zLCBtYXhEZXB0aDogb3B0aW9ucy5tYXhEZXB0aCB9KX1gLFxuICAgICAgICApLFxuICAgICAgKTtcblxuICAgIC8vIDEuIERhdGFFeHBsb3JlcuuhnCBzb3VyY2VEYuyXkOyEnCDrjbDsnbTthLAg7KGw7ZqMICjqtIDroKgg642w7J207YSwIO2PrO2VqClcbiAgICBjb25zdCBleHBsb3JlUmVzdWx0ID0gYXdhaXQgdGhpcy5kYXRhRXhwbG9yZXIuZXhwbG9yZVdpdGhSZWxhdGlvbnMoZW50aXR5TmFtZSwgb3B0aW9ucyk7XG5cbiAgICAhaXNUZXN0KCkgJiZcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBjaGFsay5jeWFuKFxuICAgICAgICAgIGBGb3VuZCAke2V4cGxvcmVSZXN1bHQubWFpbi5yZWNvcmRzLmxlbmd0aH0gJHtlbnRpdHlOYW1lfSByZWNvcmRzIGFuZCAke2V4cGxvcmVSZXN1bHQucmVsYXRlZC5zaXplfSByZWxhdGVkIGVudGl0aWVzYCxcbiAgICAgICAgKSxcbiAgICAgICk7XG5cbiAgICAvLyAyLiBGaXh0dXJlUmVjb3Jk66GcIOuzgO2ZmFxuICAgIGNvbnN0IGZpeHR1cmVSZWNvcmRzOiBGaXh0dXJlUmVjb3JkW10gPSBbXTtcblxuICAgIC8vIOuplOyduCBlbnRpdHnsnZggcmVjb3Jkc+ulvCBGaXh0dXJlUmVjb3Jk66GcIOuzgO2ZmFxuICAgIGNvbnN0IG1haW5FbnRpdHkgPSB0aGlzLmVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eU5hbWUpO1xuICAgIGZvciAoY29uc3QgcmVjb3JkIG9mIGV4cGxvcmVSZXN1bHQubWFpbi5yZWNvcmRzKSB7XG4gICAgICBjb25zdCByZWNvcmRzID0gYXdhaXQgRml4dHVyZU1hbmFnZXIuY3JlYXRlRml4dHVyZVJlY29yZChcbiAgICAgICAgbWFpbkVudGl0eSxcbiAgICAgICAgcmVjb3JkIGFzIHsgaWQ6IG51bWJlciB8IHN0cmluZzsgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGwgfSxcbiAgICAgICAgeyBfZGI6IHRoaXMuc291cmNlRGIsIHNpbmdsZVJlY29yZDogdHJ1ZSB9LFxuICAgICAgKTtcbiAgICAgIGZpeHR1cmVSZWNvcmRzLnB1c2goLi4ucmVjb3Jkcyk7XG4gICAgfVxuXG4gICAgLy8g6rSA66CoIGVudGl0eeydmCByZWNvcmRz66W8IEZpeHR1cmVSZWNvcmTroZwg67OA7ZmYXG4gICAgZm9yIChjb25zdCBbcmVsYXRlZEVudGl0eU5hbWUsIHJlbGF0ZWRSZWNvcmRzXSBvZiBleHBsb3JlUmVzdWx0LnJlbGF0ZWQuZW50cmllcygpKSB7XG4gICAgICBjb25zdCByZWxhdGVkRW50aXR5ID0gdGhpcy5lbnRpdHlNYW5hZ2VyLmdldChyZWxhdGVkRW50aXR5TmFtZSk7XG4gICAgICBmb3IgKGNvbnN0IHJlY29yZCBvZiByZWxhdGVkUmVjb3Jkcykge1xuICAgICAgICBjb25zdCByZWNvcmRzID0gYXdhaXQgRml4dHVyZU1hbmFnZXIuY3JlYXRlRml4dHVyZVJlY29yZChcbiAgICAgICAgICByZWxhdGVkRW50aXR5LFxuICAgICAgICAgIHJlY29yZCBhcyB7IGlkOiBudW1iZXIgfCBzdHJpbmc7IFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsIH0sXG4gICAgICAgICAgeyBfZGI6IHRoaXMuc291cmNlRGIsIHNpbmdsZVJlY29yZDogdHJ1ZSB9LFxuICAgICAgICApO1xuICAgICAgICBmaXh0dXJlUmVjb3Jkcy5wdXNoKC4uLnJlY29yZHMpO1xuICAgICAgfVxuXG4gICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheShgICAtICR7cmVsYXRlZEVudGl0eU5hbWV9OiAke3JlbGF0ZWRSZWNvcmRzLmxlbmd0aH0gcmVjb3Jkc2ApKTtcbiAgICB9XG5cbiAgICAvLyAzLiB0YXJnZXREYuyXkCDsgr3snoUgKEZpeHR1cmVNYW5hZ2Vy6rCAIOydmOyhtOyEsSDsoJXroKwg7LKY66asKVxuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBGaXh0dXJlTWFuYWdlci5pbnNlcnRGaXh0dXJlcyh0aGlzLnRhcmdldERiTmFtZSwgZml4dHVyZVJlY29yZHMpO1xuXG4gICAgIWlzVGVzdCgpICYmXG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgY2hhbGsuZ3JlZW4oXG4gICAgICAgICAgYFN1Y2Nlc3NmdWxseSBpbXBvcnRlZCAke3Jlc3VsdHMubGVuZ3RofSByZWNvcmRzIHRvICR7dGhpcy50YXJnZXREYk5hbWV9ICgke2V4cGxvcmVSZXN1bHQubWFpbi5yZWNvcmRzLmxlbmd0aH0gJHtlbnRpdHlOYW1lfSArICR7cmVzdWx0cy5sZW5ndGggLSBleHBsb3JlUmVzdWx0Lm1haW4ucmVjb3Jkcy5sZW5ndGh9IHJlbGF0ZWQpYCxcbiAgICAgICAgKSxcbiAgICAgICk7XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxufVxuIl0sIm5hbWVzIjpbImNoYWxrIiwiaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AiLCJpc09uZVRvT25lUmVsYXRpb25Qcm9wIiwiaXNSZWxhdGlvblByb3AiLCJpc1Rlc3QiLCJEYXRhRXhwbG9yZXIiLCJmYWtlck1hcHBpbmdzIiwiRml4dHVyZU1hbmFnZXIiLCJGaXh0dXJlR2VuZXJhdG9yIiwiZGF0YUV4cGxvcmVyIiwibG9jYWxlIiwibWFwcGluZ3MiLCJsbG1DYWNoZSIsIk1hcCIsImVudGl0eUNhY2hlIiwib3B0aW9ucyIsInNvdXJjZURiIiwiX3RhcmdldERiIiwidGFyZ2V0RGJOYW1lIiwiZW50aXR5TWFuYWdlciIsInVzZUxMTSIsImVuYWJsZUxMTUNhY2hlIiwibGxtTW9kZWwiLCJnZW5lcmF0ZSIsImVudGl0eU5hbWUiLCJvdmVycmlkZXMiLCJjb250ZXh0IiwiY3JlYXRlQ29udGV4dCIsImVudGl0eSIsImdldCIsInNldCIsInRlbXBJZCIsIkRhdGUiLCJub3ciLCJyb3dLZXkiLCJ1bmRlZmluZWQiLCJmaXh0dXJlIiwicHJvcCIsInByb3BzIiwidmlydHVhbCIsIm5hbWUiLCJjb25lIiwiZml4dHVyZVN0cmF0ZWd5IiwidHlwZSIsImZha2VyIiwiX2Zha2VyIiwic3RyaW5nIiwiYWxwaGFudW1lcmljIiwidXVpZCIsInJlbGF0aW9uVmFsdWUiLCJnZW5lcmF0ZVJlbGF0aW9uVmFsdWUiLCJoYXNKb2luQ29sdW1uIiwibm90ZSIsImdlbmVyYXRlV2l0aExMTSIsImVycm9yIiwiY29uc29sZSIsIndhcm4iLCJpZCIsIkVycm9yIiwibWVzc2FnZSIsImZpeHR1cmVHZW5lcmF0b3IiLCJleGVjdXRlR2VuZXJhdG9yIiwiZml4dHVyZURlZmF1bHQiLCJnZW5lcmF0ZURlZmF1bHRWYWx1ZSIsImVtYWlsIiwibmFtZVZhbHVlIiwidXNlcm5hbWUiLCJmdWxsX25hbWUiLCJuYW1lX2VuIiwiZG9tYWluIiwic3BsaXQiLCJyb21hbml6ZWQiLCJyb21hbml6ZU5hbWUiLCJwYXNzd29yZCIsImJjcnlwdCIsImhhc2giLCJmaXh0dXJlcyIsImRhdGFTb3VyY2UiLCJjYWNoZUtleSIsIndpdGgiLCJKU09OIiwic3RyaW5naWZ5IiwicmVmZXJlbmNlQ2FjaGUiLCJoYXMiLCJleHBsb3JlUmVzdWx0IiwiZXhwbG9yZVdpdGhSZWxhdGlvbnMiLCJzdHJhdGVneSIsImxpbWl0IiwiY29uZmlnIiwiaW5jbHVkZVJlbGF0aW9ucyIsIm1heERlcHRoIiwibWFpbiIsInJlY29yZHMiLCJpbXBvcnRFeHBsb3JlUmVzdWx0IiwiY2FuZGlkYXRlcyIsImxlbmd0aCIsInNlbGVjdGVkIiwiTWF0aCIsImZsb29yIiwicmFuZG9tIiwiYXV0b0tleSIsImF1dG9FeHBsb3JlUmVzdWx0IiwiYXV0b0NhbmRpZGF0ZXMiLCJudWxsYWJsZSIsImFsbEZpeHR1cmVSZWNvcmRzIiwiZW50aXR5SWQiLCJyZWxhdGVkIiwiZW50cmllcyIsInJlY29yZHNUb0ltcG9ydCIsImxvZyIsImN5YW4iLCJyZWNvcmQiLCJyZWNvcmRLZXkiLCJpbXBvcnRlZFJlY29yZHMiLCJwdXNoIiwiYWRkIiwiZ3JheSIsInNsaWNlIiwiZml4dHVyZVJlY29yZHMiLCJjcmVhdGVGaXh0dXJlUmVjb3JkIiwiX2RiIiwic2luZ2xlUmVjb3JkIiwibWFpbkVudGl0eSIsIm1haW5SZWNvcmRzVG9JbXBvcnQiLCJpbnNlcnRGaXh0dXJlcyIsImdyZWVuIiwic2l6ZSIsImdlbmVyYXRvciIsInN0YXJ0c1dpdGgiLCJpc05hbWVGaWVsZCIsImZha2VyTW9kdWxlIiwiZmFrZXJLTyIsImV4cHIiLCJtYXRjaCIsInBhdGgiLCJhcmdzU3RyIiwicGFydHMiLCJmbiIsInBhcnQiLCJhcmdzIiwidHJpbSIsInBhcnNlR2VuZXJhdG9yQXJncyIsInllbGxvdyIsImZha2VySkEiLCJsb2NhbGVGYWtlciIsImRlcGFydG1lbnRzIiwicHJlZml4ZXMiLCJzdWZmaXhlcyIsImRlcHQiLCJoZWxwZXJzIiwiYXJyYXlFbGVtZW50IiwicHJlZml4Iiwic3VmZml4IiwibG9jYWxlTWFwcGluZ3MiLCJlbiIsIm5vcm1hbGl6ZWROYW1lIiwidG9Mb3dlckNhc2UiLCJyZXBsYWNlIiwicGF0dGVybiIsIk9iamVjdCIsImZpZWxkX3BhdHRlcm5zIiwiaW5jbHVkZXMiLCJleGVjdXRlRmFrZXJFeHByZXNzaW9uIiwiZW5kc1dpdGgiLCJnZW5lcmF0ZUFycmF5VmFsdWUiLCJlbnVtVmFsdWVzIiwiQXJyYXkiLCJpc0FycmF5IiwiZW51bSIsImVudW1MYWJlbHMiLCJrZXlzIiwidHlwZURlZmF1bHQiLCJ0eXBlX2RlZmF1bHRzIiwibG9yZW0iLCJ3b3JkcyIsIm51bWJlciIsImludCIsIm1pbiIsIm1heCIsImJpZ0ludCIsImZsb2F0IiwiZGF0YXR5cGUiLCJib29sZWFuIiwiZGF0ZSIsInBhc3QiLCJfZW50aXR5IiwiX2xvY2FsZUZha2VyIiwiY291bnQiLCJmcm9tIiwidXJsIiwiaW1hZ2UiLCJzeXN0ZW0iLCJmaWxlTmFtZSIsIm1pbWVfdHlwZSIsImludGVybmV0Iiwid29yZCIsImV4cHJlc3Npb24iLCJwYXJzZSIsImZha2VyTmFtZSIsInNlbGVjdGVkRmFrZXIiLCJmdW5jTWF0Y2giLCJmaXh0dXJlSGludCIsInJvd0NhY2hlS2V5IiwibGxtUHJvcHMiLCJmaWx0ZXIiLCJwIiwiZ2VuZXJhdGVTaW5nbGVXaXRoTExNIiwiYXBpS2V5IiwiZ2V0QXBpS2V5IiwiY3JlYXRlQW50aHJvcGljIiwiZ2VuZXJhdGVUZXh0IiwidGV4dCIsIm1vZGVsIiwicHJvbXB0IiwiYnVpbGRSb3dMTE1Qcm9tcHQiLCJyb3dSZXN1bHQiLCJwYXJzZVJvd0xMTVJlc3BvbnNlIiwiZmllbGROYW1lIiwidmFsdWUiLCJidWlsZExMTVByb21wdCIsInBhcnNlTExNUmVzcG9uc2UiLCJsYW5ndWFnZSIsImZpZWxkRGVzY3JpcHRpb25zIiwibWFwIiwiZGVzYyIsInZhbHVlcyIsImpvaW4iLCJvdGhlclByb3BzIiwib3RoZXJQcm9wc0NvbnRleHQiLCJvdXRwdXRTaGFwZSIsImVudGl0eUNvbnRleHQiLCJqc29uVGV4dCIsInBhcnNlZCIsInJlc3VsdCIsIlN0cmluZyIsImhpbnQiLCJvdGhlckZpZWxkcyIsIm90aGVyRmllbGRzQ29udGV4dCIsImdldEV4cGVjdGVkRm9ybWF0IiwiZ2V0RXhhbXBsZUZvclR5cGUiLCJwcm9wVHlwZSIsImNsZWFuZWQiLCJiYXNlVHlwZSIsIml0ZW0iLCJnZXREZWZhdWx0VmFsdWVGb3JUeXBlIiwicGFyc2VTY2FsYXJWYWx1ZSIsIm51bSIsInBhcnNlSW50IiwiTnVtYmVyIiwiaXNOYU4iLCJCaWdJbnQiLCJwYXJzZUZsb2F0IiwiZ2V0VGltZSIsInByb3BOYW1lIiwianNvblN0ciIsImNvbnZlcnRKc0xpdGVyYWxUb0pzb24iLCJ0cmltbWVkIiwiaW5wdXQiLCJ3aXRoRG91YmxlUXVvdGVzIiwiXyIsImNvbnRlbnQiLCJTb25hbXUiLCJyZXF1aXJlIiwic2VjcmV0IiwiYW50aHJvcGljX2FwaV9rZXkiLCJwcm9jZXNzIiwiZW52IiwiQU5USFJPUElDX0FQSV9LRVkiLCJiYXNlRm9ybWF0IiwiZ2V0U2NhbGFyRm9ybWF0IiwiYmFzZUV4YW1wbGUiLCJnZXRTY2FsYXJFeGFtcGxlIiwiaXNLb3JlYW4iLCJ0ZXN0Iiwicm9tYW5pemVLb3JlYW5OYW1lIiwiQ0hPU0VPTkciLCJKVU5HU0VPTkciLCJKT05HU0VPTkciLCJyb21hbml6ZSIsImNoYXIiLCJjb2RlIiwiY2hhckNvZGVBdCIsIm9mZnNldCIsImNobyIsImp1bmciLCJqb25nIiwiY2hhcnMiLCJmYW1pbHlOYW1lIiwiZ2l2ZW5OYW1lIiwiZ2V0TExNQ2FjaGVTdGF0cyIsImVuYWJsZWQiLCJjbGVhckxMTUNhY2hlIiwiY2xlYXIiLCJTZXQiLCJnZW5lcmF0ZUJhdGNoIiwic3BlY3MiLCJnZW5lcmF0ZWRGaXh0dXJlcyIsInNwZWMiLCJpIiwiZGF0YSIsImlkUHJvcCIsImZpbmQiLCJ1c2VzU2VxdWVuY2UiLCJkYXRhRm9yUmVjb3JkIiwicmVzdWx0cyIsImltcG9ydEZyb21Tb3VyY2UiLCJibHVlIiwicmVsYXRlZEVudGl0eU5hbWUiLCJyZWxhdGVkUmVjb3JkcyIsInJlbGF0ZWRFbnRpdHkiXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLFdBQVcsUUFBUTtBQUsxQixTQUFTQywwQkFBMEIsRUFBRUMsc0JBQXNCLEVBQUVDLGNBQWMsUUFBUSxvQkFBaUI7QUFDcEcsU0FBU0MsTUFBTSxRQUFRLHlCQUFzQjtBQUM3QyxTQUNFQyxZQUFZLFFBR1AscUJBQWtCO0FBQ3pCLFNBQTZCQyxhQUFhLFFBQVEsc0JBQW1CO0FBQ3JFLFNBQVNDLGNBQWMsUUFBUSx1QkFBb0I7QUFzQm5ELE9BQU8sTUFBTUM7Ozs7SUFDSEMsYUFBMkI7SUFDM0JDLE9BQWU7SUFDZkMsU0FBd0I7SUFDeEJDLFdBQWlDLElBQUlDLE1BQU07SUFDM0NDLGNBQW1DLElBQUlELE1BQU07SUFDN0NFLFFBQWlDO0lBRXpDLFlBQ0UsQUFBUUMsUUFBYyxFQUN0QixpRUFBaUU7SUFDakUsZ0NBQWdDO0lBQ2hDQyxTQUFlLEVBQ2YsQUFBUUMsWUFBc0QsRUFDOUQsQUFBUUMsYUFBbUMsRUFDM0NKLE9BQWlDLENBQ2pDO2FBUFFDLFdBQUFBO2FBSUFFLGVBQUFBO2FBQ0FDLGdCQUFBQTtRQUdSLElBQUksQ0FBQ1YsWUFBWSxHQUFHLElBQUlKLGFBQWFXLFVBQVVHO1FBQy9DLElBQUksQ0FBQ1QsTUFBTSxHQUFHSyxTQUFTTCxVQUFVO1FBQ2pDLElBQUksQ0FBQ0MsUUFBUSxHQUFHTDtRQUNoQixJQUFJLENBQUNTLE9BQU8sR0FBRztZQUNi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
1335
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0aW5nL2ZpeHR1cmUtZ2VuZXJhdG9yLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCB0eXBlIHsgS25leCB9IGZyb20gXCJrbmV4XCI7XG5pbXBvcnQgdHlwZSB7IEVudGl0eSB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5XCI7XG5pbXBvcnQgdHlwZSB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgdHlwZSB7IEVudGl0eVByb3AsIEZpeHR1cmVJbXBvcnRSZXN1bHQsIEZpeHR1cmVSZWNvcmQgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wLCBpc09uZVRvT25lUmVsYXRpb25Qcm9wLCBpc1JlbGF0aW9uUHJvcCB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgaXNUZXN0IH0gZnJvbSBcIi4uL3V0aWxzL2NvbnRyb2xsZXJcIjtcbmltcG9ydCB7XG4gIERhdGFFeHBsb3JlcixcbiAgdHlwZSBFeHBsb3JlV2l0aFJlbGF0aW9uc09wdGlvbnMsXG4gIHR5cGUgRXhwbG9yZVdpdGhSZWxhdGlvbnNSZXN1bHQsXG59IGZyb20gXCIuL2RhdGEtZXhwbG9yZXJcIjtcbmltcG9ydCB7IHR5cGUgRmFrZXJNYXBwaW5ncywgZmFrZXJNYXBwaW5ncyB9IGZyb20gXCIuL2Zha2VyLW1hcHBpbmdzXCI7XG5pbXBvcnQgeyBGaXh0dXJlTWFuYWdlciB9IGZyb20gXCIuL2ZpeHR1cmUtbWFuYWdlclwiO1xuXG5leHBvcnQgdHlwZSBMb2NhbGUgPSBcImtvXCIgfCBcImVuXCIgfCBcImphXCI7XG5cbmV4cG9ydCB0eXBlIEZpeHR1cmVHZW5lcmF0b3JPcHRpb25zID0ge1xuICBsb2NhbGU/OiBMb2NhbGU7XG4gIHVzZUxMTT86IGJvb2xlYW47XG4gIGVuYWJsZUxMTUNhY2hlPzogYm9vbGVhbjtcbiAgbGxtTW9kZWw/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBHZW5lcmF0b3JDb250ZXh0ID0ge1xuICAvKiog7IOd7ISxIOykkeyduCBmaXh0dXJl65OkICjrqZTrqqjrpqwg7IOBKSAqL1xuICBmaXh0dXJlczogTWFwPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xuXG4gIC8qKiDssLjsobAg642w7J207YSwIOy6kOyLnCAoRGF0YUV4cGxvcmVyIOqysOqzvCkgKi9cbiAgcmVmZXJlbmNlQ2FjaGU6IE1hcDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+W10+O1xuXG4gIC8qKiDsnbTrr7ggaW1wb3J065CcIOugiOy9lOuTnOulvCDstpTsoIHtlZjsl6wg7KSR67O1IGltcG9ydOulvCDrsKnsp4Dtlanri4jri6QgKi9cbiAgaW1wb3J0ZWRSZWNvcmRzOiBTZXQ8c3RyaW5nPjsgLy8gXCJVc2VyIzEyM1wiXG59O1xuXG5leHBvcnQgY2xhc3MgRml4dHVyZUdlbmVyYXRvciB7XG4gIHByaXZhdGUgZGF0YUV4cGxvcmVyOiBEYXRhRXhwbG9yZXI7XG4gIHByaXZhdGUgbG9jYWxlOiBMb2NhbGU7XG4gIHByaXZhdGUgbWFwcGluZ3M6IEZha2VyTWFwcGluZ3M7XG4gIHByaXZhdGUgbGxtQ2FjaGU6IE1hcDxzdHJpbmcsIHVua25vd24+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIGVudGl0eUNhY2hlOiBNYXA8c3RyaW5nLCBFbnRpdHk+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIG9wdGlvbnM6IEZpeHR1cmVHZW5lcmF0b3JPcHRpb25zO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgc291cmNlRGI6IEtuZXgsXG4gICAgLy8gRml4dHVyZU1hbmFnZXIuaW5zZXJ0Rml4dHVyZXPqsIAgZGJOYW1lIOusuOyekOyXtOydhCDrsJvquLAg65WM66y47JeQIOyngeygkSDsgqzsmqntlZjsp4Ag7JWK7Iq164uI64ukXG4gICAgLy8g66+4656YIO2ZleyepeyEseydhCDsnITtlbQgQVBJIOyLnOq3uOuLiOyymOyXkOuKlCDtj6ztlajsi5zsvLDsirXri4jri6RcbiAgICBfdGFyZ2V0RGI6IEtuZXgsXG4gICAgcHJpdmF0ZSB0YXJnZXREYk5hbWU6IFwiZml4dHVyZVwiIHwgXCJ0ZXN0XCIgfCBcInByb2R1Y3Rpb25fbWFzdGVyXCIsXG4gICAgcHJpdmF0ZSBlbnRpdHlNYW5hZ2VyOiB0eXBlb2YgRW50aXR5TWFuYWdlcixcbiAgICBvcHRpb25zPzogRml4dHVyZUdlbmVyYXRvck9wdGlvbnMsXG4gICkge1xuICAgIHRoaXMuZGF0YUV4cGxvcmVyID0gbmV3IERhdGFFeHBsb3Jlcihzb3VyY2VEYiwgZW50aXR5TWFuYWdlcik7XG4gICAgdGhpcy5sb2NhbGUgPSBvcHRpb25zPy5sb2NhbGUgfHwgXCJrb1wiO1xuICAgIHRoaXMubWFwcGluZ3MgPSBmYWtlck1hcHBpbmdzO1xuICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgIGxvY2FsZTogb3B0aW9ucz8ubG9jYWxlIHx8IFwia29cIixcbiAgICAgIHVzZUxMTTogb3B0aW9ucz8udXNlTExNIHx8IGZhbHNlLFxuICAgICAgZW5hYmxlTExNQ2FjaGU6IG9wdGlvbnM/LmVuYWJsZUxMTUNhY2hlICE9PSBmYWxzZSxcbiAgICAgIGxsbU1vZGVsOiBvcHRpb25zPy5sbG1Nb2RlbCB8fCBcImNsYXVkZS1zb25uZXQtNC01XCIsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXh0dXJlIOyDneyEsSAo64uo7J28KVxuICAgKiBAcmV0dXJucyDsg53shLHrkJwgZml4dHVyZSDrjbDsnbTthLAgKOuplOuqqOumrCDsg4EpXG4gICAqL1xuICBhc3luYyBnZW5lcmF0ZShcbiAgICBlbnRpdHlOYW1lOiBzdHJpbmcsXG4gICAgb3ZlcnJpZGVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9LFxuICAgIGNvbnRleHQ6IEdlbmVyYXRvckNvbnRleHQgPSB0aGlzLmNyZWF0ZUNvbnRleHQoKSxcbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xuICAgIC8vIEVudGl0eSDsupDsi7E6IO2FjOyKpO2KuOyXkOyEnCBlbnRpdHkgY29uZSDsiJjsoJXsnbQg67CY7JiB65CY64+E66GdIOuztOyepVxuICAgIGxldCBlbnRpdHkgPSB0aGlzLmVudGl0eUNhY2hlLmdldChlbnRpdHlOYW1lKTtcbiAgICBpZiAoIWVudGl0eSkge1xuICAgICAgZW50aXR5ID0gdGhpcy5lbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlOYW1lKTtcbiAgICAgIHRoaXMuZW50aXR5Q2FjaGUuc2V0KGVudGl0eU5hbWUsIGVudGl0eSk7XG4gICAgfVxuXG4gICAgY29uc3QgdGVtcElkID0gYCR7ZW50aXR5TmFtZX0jdGVtcCMke0RhdGUubm93KCl9YDsgLy8g7J6E7IucIElEXG5cbiAgICAvLyBMTE0gcm93IOuLqOychCDsg53shLHsnYQg7JyE7ZWcIOqzoOycoCDtgqQgKOqwmeydgCByb3fsnZgg7ZWE65Oc65Ok7J20IOuPmeydvO2VnCByb3dLZXnrpbwg6rO17JygKVxuICAgIGNvbnN0IHJvd0tleSA9IHRoaXMub3B0aW9ucy51c2VMTE0gPyBgJHtlbnRpdHlOYW1lfSNyb3cjJHtEYXRlLm5vdygpfWAgOiB1bmRlZmluZWQ7XG5cbiAgICAvLyDqsIEgcHJvcOuzhCDqsJIg7IOd7ISxXG4gICAgY29uc3QgZml4dHVyZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICAgIGZvciAoY29uc3QgcHJvcCBvZiBlbnRpdHkucHJvcHMpIHtcbiAgICAgIC8vIFZpcnR1YWwgcHJvcOydgCDsiqTtgrVcbiAgICAgIGlmIChcInZpcnR1YWxcIiBpbiBwcm9wICYmIHByb3AudmlydHVhbCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gaWQgcHJvcCDsspjrpqxcbiAgICAgIGlmIChwcm9wLm5hbWUgPT09IFwiaWRcIikge1xuICAgICAgICBpZiAoXCJjb25lXCIgaW4gcHJvcCAmJiBwcm9wLmNvbmU/LmZpeHR1cmVTdHJhdGVneSA9PT0gXCJzZXF1ZW5jZVwiKSB7XG4gICAgICAgICAgLy8gREIgc2VxdWVuY2XqsIAg7J6Q64+ZIO2VoOuLue2VmOuvgOuhnCDsiqTtgrUgKFVzZXIg65OxKVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wLnR5cGUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAvLyBEQiBERUZBVUxUIOyXhuuKlCBzdHJpbmcgUEs6IGFscGhhbnVtZXJpYyAzMuyekCDsg53shLEgKGJldHRlci1hdXRoIOyKpO2DgOydvClcbiAgICAgICAgICBjb25zdCB7IGZha2VyOiBfZmFrZXIgfSA9IGF3YWl0IGltcG9ydChcIkBmYWtlci1qcy9mYWtlclwiKTtcbiAgICAgICAgICBmaXh0dXJlW3Byb3AubmFtZV0gPSBfZmFrZXIuc3RyaW5nLmFscGhhbnVtZXJpYygzMik7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb3AudHlwZSA9PT0gXCJ1dWlkXCIpIHtcbiAgICAgICAgICBjb25zdCB7IGZha2VyOiBfZmFrZXIgfSA9IGF3YWl0IGltcG9ydChcIkBmYWtlci1qcy9mYWtlclwiKTtcbiAgICAgICAgICBmaXh0dXJlW3Byb3AubmFtZV0gPSBfZmFrZXIuc3RyaW5nLnV1aWQoKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpbnRlZ2VyL2JpZ0ludGVnZXIgUEs6IGdlbmVyYXRlQmF0Y2jsl5DshJwgdGVtcElk66W8IOuEo+ycvOuvgOuhnCDsl6zquLDshKAg7Iqk7YK1XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBvdmVycmlkZeqwgCDsnojsnLzrqbQg7IKs7JqpXG4gICAgICBpZiAocHJvcC5uYW1lIGluIG92ZXJyaWRlcykge1xuICAgICAgICBmaXh0dXJlW3Byb3AubmFtZV0gPSBvdmVycmlkZXNbcHJvcC5uYW1lXTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGNvbmXsl5DshJwg7IOd7ISxIOyghOuetSDtmZXsnbhcbiAgICAgIGNvbnN0IGNvbmUgPSBwcm9wLmNvbmU7XG5cbiAgICAgIC8vIDEuIFJlbGF0aW9uIHByb3Ag7LKY66asXG4gICAgICBpZiAoaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgLy8gQmVsb25nc1RvT25lIC8gT25lVG9PbmUoaGFzSm9pbkNvbHVtbinsnYAgRksg7Lus65+866qFKHtwcm9wLm5hbWV9X2lkKeycvOuhnOuPhCBvdmVycmlkZeulvCDrsJvripTri6RcbiAgICAgICAgY29uc3QgZmtDb2xOYW1lID0gYCR7cHJvcC5uYW1lfV9pZGA7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBma0NvbE5hbWUgaW4gb3ZlcnJpZGVzICYmXG4gICAgICAgICAgKGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKHByb3ApIHx8IChpc09uZVRvT25lUmVsYXRpb25Qcm9wKHByb3ApICYmIHByb3AuaGFzSm9pbkNvbHVtbikpXG4gICAgICAgICkge1xuICAgICAgICAgIGZpeHR1cmVbZmtDb2xOYW1lXSA9IG92ZXJyaWRlc1tma0NvbE5hbWVdO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVsYXRpb25WYWx1ZSA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVSZWxhdGlvblZhbHVlKGVudGl0eSwgcHJvcCwgY29udGV4dCk7XG4gICAgICAgIC8vIEJlbG9uZ3NUb09uZSwgT25lVG9PbmUoaGFzSm9pbkNvbHVtbinsnZgg6rK97JqwIGZvcmVpZ24ga2V5IOy7rOufvOuqheycvOuhnCDsoIDsnqVcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKHByb3ApIHx8XG4gICAgICAgICAgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiYgcHJvcC5oYXNKb2luQ29sdW1uKVxuICAgICAgICApIHtcbiAgICAgICAgICBmaXh0dXJlW2Ake3Byb3AubmFtZX1faWRgXSA9IHJlbGF0aW9uVmFsdWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZml4dHVyZVtwcm9wLm5hbWVdID0gcmVsYXRpb25WYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gMi4gY29uZS5ub3RlICsgTExNIOyCrOyaqSAodXNlTExN7J2066m0IGZpeHR1cmVHZW5lcmF0b3Lrs7Tri6Qg7Jqw7ISgKVxuICAgICAgaWYgKGNvbmU/Lm5vdGUgJiYgdGhpcy5vcHRpb25zLnVzZUxMTSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGZpeHR1cmVbcHJvcC5uYW1lXSA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVXaXRoTExNKGNvbmUubm90ZSwgcHJvcCwgZW50aXR5LCByb3dLZXkpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIGBbRml4dHVyZUdlbmVyYXRvcl0gTExNIGdlbmVyYXRpb24gZmFpbGVkIGZvciAke2VudGl0eS5pZH0uJHtwcm9wLm5hbWV9LCBmYWxsaW5nIGJhY2sgdG8gZml4dHVyZUdlbmVyYXRvciBvciBkZWZhdWx0YCxcbiAgICAgICAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogZXJyb3IsXG4gICAgICAgICAgKTtcbiAgICAgICAgICAvLyBmYWxsYmFjazogZml4dHVyZUdlbmVyYXRvciDihpIgZml4dHVyZURlZmF1bHQg4oaSIOq4sOuzuOqwkuycvOuhnCDqs4Tsho1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyAzLiBmaXh0dXJlR2VuZXJhdG9yIOyCrOyaqVxuICAgICAgaWYgKGNvbmU/LmZpeHR1cmVHZW5lcmF0b3IpIHtcbiAgICAgICAgZml4dHVyZVtwcm9wLm5hbWVdID0gYXdhaXQgdGhpcy5leGVjdXRlR2VuZXJhdG9yKFxuICAgICAgICAgIGNvbmUuZml4dHVyZUdlbmVyYXRvciBhcyBzdHJpbmcsXG4gICAgICAgICAgcHJvcCxcbiAgICAgICAgICBlbnRpdHksXG4gICAgICAgICk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyA0LiBmaXh0dXJlRGVmYXVsdCDsgqzsmqlcbiAgICAgIGlmIChjb25lPy5maXh0dXJlRGVmYXVsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGZpeHR1cmVbcHJvcC5uYW1lXSA9IGNvbmUuZml4dHVyZURlZmF1bHQ7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyA1LiDtg4DsnoXrs4Qg6riw67O4IOyDneyEsVxuICAgICAgZml4dHVyZVtwcm9wLm5hbWVdID0gYXdhaXQgdGhpcy5nZW5lcmF0ZURlZmF1bHRWYWx1ZShwcm9wLCBlbnRpdHkpO1xuICAgIH1cblxuICAgIC8vIDYuIGVtYWlsIO2VhOuTnOqwgCDsnojqs6AgbmFtZSDtlYTrk5zqsIAg7J6I7Jy866m0LCBlbWFpbOydmCDroZzsu6wg7YyM7Yq466W8IG5hbWUg6riw67CY7Jy866GcIOuztOyglVxuICAgIGlmIChcImVtYWlsXCIgaW4gZml4dHVyZSAmJiB0eXBlb2YgZml4dHVyZS5lbWFpbCA9PT0gXCJzdHJpbmdcIiAmJiAhKFwiZW1haWxcIiBpbiBvdmVycmlkZXMpKSB7XG4gICAgICBjb25zdCBuYW1lVmFsdWUgPSBmaXh0dXJlLm5hbWUgfHwgZml4dHVyZS51c2VybmFtZSB8fCBmaXh0dXJlLmZ1bGxfbmFtZSB8fCBmaXh0dXJlLm5hbWVfZW47XG4gICAgICBpZiAobmFtZVZhbHVlICYmIHR5cGVvZiBuYW1lVmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgY29uc3QgZG9tYWluID0gZml4dHVyZS5lbWFpbC5zcGxpdChcIkBcIilbMV0gfHwgXCJleGFtcGxlLmNvbVwiO1xuICAgICAgICBjb25zdCByb21hbml6ZWQgPSBhd2FpdCB0aGlzLnJvbWFuaXplTmFtZShuYW1lVmFsdWUpO1xuICAgICAgICBmaXh0dXJlLmVtYWlsID0gYCR7cm9tYW5pemVkfUAke2RvbWFpbn1gO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDcuIHBhc3N3b3JkIO2VhOuTnCDslZTtmLjtmZRcbiAgICBpZiAoXCJwYXNzd29yZFwiIGluIGZpeHR1cmUgJiYgZml4dHVyZS5wYXNzd29yZCAmJiB0eXBlb2YgZml4dHVyZS5wYXNzd29yZCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgY29uc3QgYmNyeXB0ID0gYXdhaXQgaW1wb3J0KFwiYmNyeXB0XCIpO1xuICAgICAgZml4dHVyZS5wYXNzd29yZCA9IGF3YWl0IGJjcnlwdC5oYXNoKGZpeHR1cmUucGFzc3dvcmQsIDEwKTtcbiAgICB9XG5cbiAgICBjb250ZXh0LmZpeHR1cmVzLnNldCh0ZW1wSWQsIGZpeHR1cmUpO1xuICAgIHJldHVybiBmaXh0dXJlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbGF0aW9uIOqwkiDsg53shLEgKyDsnpDrj5kgSW1wb3J0XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlUmVsYXRpb25WYWx1ZShcbiAgICBlbnRpdHk6IEVudGl0eSxcbiAgICBwcm9wOiBFbnRpdHlQcm9wLFxuICAgIGNvbnRleHQ6IEdlbmVyYXRvckNvbnRleHQsXG4gICk6IFByb21pc2U8bnVtYmVyIHwgbnVsbD4ge1xuICAgIGlmICghaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRml4dHVyZUdlbmVyYXRvcjogJHtlbnRpdHkuaWR9LiR7cHJvcC5uYW1lfSBpcyBub3QgYSByZWxhdGlvbiBwcm9wYCk7XG4gICAgfVxuXG4gICAgLy8gQmVsb25nc1RvT25lLCBPbmVUb09uZShoYXNKb2luQ29sdW1uKeunjCDsspjrpqxcbiAgICBpZiAoXG4gICAgICAhaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiZcbiAgICAgICEoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChwcm9wKSAmJiBwcm9wLmhhc0pvaW5Db2x1bW4pXG4gICAgKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBjb25lID0gcHJvcC5jb25lO1xuICAgIGNvbnN0IGRhdGFTb3VyY2UgPSBjb25lPy5kYXRhU291cmNlO1xuXG4gICAgLy8gRGF0YUV4cGxvcmVy66GcIOywuOyhsCDrjbDsnbTthLAg7KGw7ZqMIChzb3VyY2VEYilcbiAgICAvLyDqtIDqs4Qg7LK07J247J2EIOuUsOudvOqwgOq4sCDsnITtlbQgZXhwbG9yZVdpdGhSZWxhdGlvbnMg7IKs7JqpXG4gICAgaWYgKGRhdGFTb3VyY2UpIHtcbiAgICAgIGNvbnN0IGNhY2hlS2V5ID0gYCR7cHJvcC53aXRofToke0pTT04uc3RyaW5naWZ5KGRhdGFTb3VyY2UpfWA7XG5cbiAgICAgIGlmICghY29udGV4dC5yZWZlcmVuY2VDYWNoZS5oYXMoY2FjaGVLZXkpKSB7XG4gICAgICAgIGNvbnN0IGV4cGxvcmVSZXN1bHQgPSBhd2FpdCB0aGlzLmRhdGFFeHBsb3Jlci5leHBsb3JlV2l0aFJlbGF0aW9ucyhwcm9wLndpdGgsIHtcbiAgICAgICAgICBzdHJhdGVneTogZGF0YVNvdXJjZS5zdHJhdGVneSxcbiAgICAgICAgICBsaW1pdDpcbiAgICAgICAgICAgICgoZGF0YVNvdXJjZS5jb25maWcgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQpPy5saW1pdCBhc1xuICAgICAgICAgICAgICB8IG51bWJlclxuICAgICAgICAgICAgICB8IHVuZGVmaW5lZCkgfHwgMTAsXG4gICAgICAgICAgaW5jbHVkZVJlbGF0aW9uczogdHJ1ZSxcbiAgICAgICAgICBtYXhEZXB0aDogMyxcbiAgICAgICAgICAuLi4oZGF0YVNvdXJjZS5jb25maWcgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQpLFxuICAgICAgICB9KTtcbiAgICAgICAgY29udGV4dC5yZWZlcmVuY2VDYWNoZS5zZXQoY2FjaGVLZXksIGV4cGxvcmVSZXN1bHQubWFpbi5yZWNvcmRzKTtcblxuICAgICAgICAvLyDsobDtmoztlZwg642w7J207YSw7JmAIOq0gOqzhOuQnCDrqqjrk6Ag7JeU7Yuw7Yuw66W8IHRhcmdldERi7JeQIGltcG9ydFxuICAgICAgICBhd2FpdCB0aGlzLmltcG9ydEV4cGxvcmVSZXN1bHQoZXhwbG9yZVJlc3VsdCwgY29udGV4dCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNhbmRpZGF0ZXMgPSBjb250ZXh0LnJlZmVyZW5jZUNhY2hlLmdldChjYWNoZUtleSk7XG4gICAgICBpZiAoY2FuZGlkYXRlcyAmJiBjYW5kaWRhdGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgLy8g656c642k7ZWY6rKMIO2VmOuCmCDshKDtg51cbiAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSBjYW5kaWRhdGVzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGNhbmRpZGF0ZXMubGVuZ3RoKV07XG4gICAgICAgIHJldHVybiBzZWxlY3RlZC5pZCBhcyBudW1iZXI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZGF0YVNvdXJjZeqwgCDsl4bsnYQg65WMIOyekOuPmeycvOuhnCBmaXh0dXJlIERC7JeQ7IScIOyhsO2ajCDsi5zrj4RcbiAgICAvLyDqtIDqs4Qg7LK07J247J2EIOuUsOudvOqwgOq4sCDsnITtlbQgZXhwbG9yZVdpdGhSZWxhdGlvbnMg7IKs7JqpXG4gICAgY29uc3QgYXV0b0tleSA9IGAke3Byb3Aud2l0aH06YXV0b2A7XG4gICAgaWYgKCFjb250ZXh0LnJlZmVyZW5jZUNhY2hlLmhhcyhhdXRvS2V5KSkge1xuICAgICAgLy8gZml4dHVyZSBEQihzb3VyY2VEYinsl5DshJwg7J6Q64+ZIOyhsO2ajCAo6rSA6rOEIO2PrO2VqClcbiAgICAgIGNvbnN0IGF1dG9FeHBsb3JlUmVzdWx0ID0gYXdhaXQgdGhpcy5kYXRhRXhwbG9yZXIuZXhwbG9yZVdpdGhSZWxhdGlvbnMocHJvcC53aXRoLCB7XG4gICAgICAgIHN0cmF0ZWd5OiBcInJhbmRvbVwiLFxuICAgICAgICBsaW1pdDogMTAsXG4gICAgICAgIGluY2x1ZGVSZWxhdGlvbnM6IHRydWUsXG4gICAgICAgIG1heERlcHRoOiAzLFxuICAgICAgfSk7XG4gICAgICBjb250ZXh0LnJlZmVyZW5jZUNhY2hlLnNldChhdXRvS2V5LCBhdXRvRXhwbG9yZVJlc3VsdC5tYWluLnJlY29yZHMpO1xuXG4gICAgICAvLyDsobDtmoztlZwg642w7J207YSw7JmAIOq0gOqzhOuQnCDrqqjrk6Ag7JeU7Yuw7Yuw66W8IHRhcmdldERi7JeQIGltcG9ydFxuICAgICAgaWYgKGF1dG9FeHBsb3JlUmVzdWx0Lm1haW4ucmVjb3Jkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW1wb3J0RXhwbG9yZVJlc3VsdChhdXRvRXhwbG9yZVJlc3VsdCwgY29udGV4dCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgYXV0b0NhbmRpZGF0ZXMgPSBjb250ZXh0LnJlZmVyZW5jZUNhY2hlLmdldChhdXRvS2V5KTtcbiAgICBpZiAoYXV0b0NhbmRpZGF0ZXMgJiYgYXV0b0NhbmRpZGF0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgLy8g656c642k7ZWY6rKMIO2VmOuCmCDshKDtg51cbiAgICAgIGNvbnN0IHNlbGVjdGVkID0gYXV0b0NhbmRpZGF0ZXNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogYXV0b0NhbmRpZGF0ZXMubGVuZ3RoKV07XG4gICAgICByZXR1cm4gc2VsZWN0ZWQuaWQgYXMgbnVtYmVyO1xuICAgIH1cblxuICAgIC8vIOywuOyhsCDrjbDsnbTthLDqsIAg7JeG7Jy866m0IG51bGwg67CY7ZmYIChudWxsYWJsZeyduCDqsr3smrApXG4gICAgaWYgKHByb3AubnVsbGFibGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIG51bGxhYmxl7J20IOyVhOuLiOqzoCDrjbDsnbTthLDrj4Qg7JeG7Jy866m0IOyXkOufrFxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBGaXh0dXJlR2VuZXJhdG9yOiAke2VudGl0eS5pZH0uJHtwcm9wLm5hbWV97JeQIO2VhOyalO2VnCAke3Byb3Aud2l0aH0g642w7J207YSw6rCAIOyXhuyKteuLiOuLpC4gYCArXG4gICAgICAgIGDrqLzsoIAgJHtwcm9wLndpdGh966W8IOyDneyEse2VmOqxsOuCmCBjb25lLmRhdGFTb3VyY2Xrpbwg7ISk7KCV7ZWY7IS47JqULmAsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBsb3JlV2l0aFJlbGF0aW9ucyDqsrDqs7zrpbwgdGFyZ2V0RGLsl5AgaW1wb3J0XG4gICAqXG4gICAqIOq0gOqzhCDssrTsnbjsnYQg65Sw65286rCEIOqysOqzvChtYWluICsgcmVsYXRlZCnrpbwg66qo65GQIGltcG9ydO2VqeuLiOuLpC5cbiAgICog7J2Y7KG07ISxIOyInOyEnOuKlCBGaXh0dXJlTWFuYWdlci5pbnNlcnRGaXh0dXJlc+qwgCDsnpDrj5nsnLzroZwg7LKY66as7ZWp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBpbXBvcnRFeHBsb3JlUmVzdWx0KFxuICAgIGV4cGxvcmVSZXN1bHQ6IEV4cGxvcmVXaXRoUmVsYXRpb25zUmVzdWx0LFxuICAgIGNvbnRleHQ6IEdlbmVyYXRvckNvbnRleHQsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGFsbEZpeHR1cmVSZWNvcmRzOiBGaXh0dXJlUmVjb3JkW10gPSBbXTtcblxuICAgIC8vIDEuIFJlbGF0ZWQgZW50aXRpZXMgaW1wb3J0IChDb21wYW55LCBEZXBhcnRtZW50IOuTsSlcbiAgICBmb3IgKGNvbnN0IFtlbnRpdHlJZCwgcmVjb3Jkc10gb2YgZXhwbG9yZVJlc3VsdC5yZWxhdGVkLmVudHJpZXMoKSkge1xuICAgICAgY29uc3QgZW50aXR5ID0gdGhpcy5lbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gICAgICBjb25zdCByZWNvcmRzVG9JbXBvcnQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W10gPSBbXTtcblxuICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGNoYWxrLmN5YW4oYEltcG9ydGluZyByZWxhdGVkIGVudGl0eTogJHtlbnRpdHlJZH0gKCR7cmVjb3Jkcy5sZW5ndGh9IHJlY29yZHMpYCksXG4gICAgICAgICk7XG5cbiAgICAgIGZvciAoY29uc3QgcmVjb3JkIG9mIHJlY29yZHMpIHtcbiAgICAgICAgY29uc3QgcmVjb3JkS2V5ID0gYCR7ZW50aXR5SWR9IyR7cmVjb3JkLmlkfWA7XG4gICAgICAgIGlmICghY29udGV4dC5pbXBvcnRlZFJlY29yZHMuaGFzKHJlY29yZEtleSkpIHtcbiAgICAgICAgICByZWNvcmRzVG9JbXBvcnQucHVzaChyZWNvcmQpO1xuICAgICAgICAgIGNvbnRleHQuaW1wb3J0ZWRSZWNvcmRzLmFkZChyZWNvcmRLZXkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChyZWNvcmRzVG9JbXBvcnQubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGNvbnN0IHJlY29yZCBvZiByZWNvcmRzVG9JbXBvcnQpIHtcbiAgICAgICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICBjaGFsay5ncmF5KFxuICAgICAgICAgICAgICAgIGAgIC0gUHJvY2Vzc2luZyAke2VudGl0eUlkfSByZWNvcmQ6YCxcbiAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShyZWNvcmQpLnNsaWNlKDAsIDEwMCksXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IGZpeHR1cmVSZWNvcmRzID0gYXdhaXQgRml4dHVyZU1hbmFnZXIuY3JlYXRlRml4dHVyZVJlY29yZChcbiAgICAgICAgICAgIGVudGl0eSxcbiAgICAgICAgICAgIHJlY29yZCBhcyB7IGlkOiBudW1iZXIgfCBzdHJpbmc7IFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsIH0sXG4gICAgICAgICAgICB7IF9kYjogdGhpcy5zb3VyY2VEYiwgc2luZ2xlUmVjb3JkOiB0cnVlIH0sXG4gICAgICAgICAgKTtcbiAgICAgICAgICBhbGxGaXh0dXJlUmVjb3Jkcy5wdXNoKC4uLmZpeHR1cmVSZWNvcmRzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDIuIE1haW4gZW50aXR5IGltcG9ydCAoRW1wbG95ZWUg65OxKVxuICAgIGNvbnN0IG1haW5FbnRpdHkgPSB0aGlzLmVudGl0eU1hbmFnZXIuZ2V0KGV4cGxvcmVSZXN1bHQubWFpbi5lbnRpdHlJZCk7XG4gICAgY29uc3QgbWFpblJlY29yZHNUb0ltcG9ydDogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSA9IFtdO1xuXG4gICAgIWlzVGVzdCgpICYmXG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgY2hhbGsuY3lhbihcbiAgICAgICAgICBgSW1wb3J0aW5nIG1haW4gZW50aXR5OiAke2V4cGxvcmVSZXN1bHQubWFpbi5lbnRpdHlJZH0gKCR7ZXhwbG9yZVJlc3VsdC5tYWluLnJlY29yZHMubGVuZ3RofSByZWNvcmRzKWAsXG4gICAgICAgICksXG4gICAgICApO1xuXG4gICAgZm9yIChjb25zdCByZWNvcmQgb2YgZXhwbG9yZVJlc3VsdC5tYWluLnJlY29yZHMpIHtcbiAgICAgIGNvbnN0IHJlY29yZEtleSA9IGAke2V4cGxvcmVSZXN1bHQubWFpbi5lbnRpdHlJZH0jJHtyZWNvcmQuaWR9YDtcbiAgICAgIGlmICghY29udGV4dC5pbXBvcnRlZFJlY29yZHMuaGFzKHJlY29yZEtleSkpIHtcbiAgICAgICAgbWFpblJlY29yZHNUb0ltcG9ydC5wdXNoKHJlY29yZCk7XG4gICAgICAgIGNvbnRleHQuaW1wb3J0ZWRSZWNvcmRzLmFkZChyZWNvcmRLZXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtYWluUmVjb3Jkc1RvSW1wb3J0Lmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAoY29uc3QgcmVjb3JkIG9mIG1haW5SZWNvcmRzVG9JbXBvcnQpIHtcbiAgICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBjaGFsay5ncmF5KFxuICAgICAgICAgICAgICBgICAtIFByb2Nlc3NpbmcgJHtleHBsb3JlUmVzdWx0Lm1haW4uZW50aXR5SWR9IHJlY29yZDpgLFxuICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShyZWNvcmQpLnNsaWNlKDAsIDEwMCksXG4gICAgICAgICAgICApLFxuICAgICAgICAgICk7XG4gICAgICAgIGNvbnN0IGZpeHR1cmVSZWNvcmRzID0gYXdhaXQgRml4dHVyZU1hbmFnZXIuY3JlYXRlRml4dHVyZVJlY29yZChcbiAgICAgICAgICBtYWluRW50aXR5LFxuICAgICAgICAgIHJlY29yZCBhcyB7IGlkOiBudW1iZXIgfCBzdHJpbmc7IFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsIH0sXG4gICAgICAgICAgeyBfZGI6IHRoaXMuc291cmNlRGIsIHNpbmdsZVJlY29yZDogdHJ1ZSB9LFxuICAgICAgICApO1xuICAgICAgICBhbGxGaXh0dXJlUmVjb3Jkcy5wdXNoKC4uLmZpeHR1cmVSZWNvcmRzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAzLiDrqqjrk6AgZml4dHVyZeulvCDtlZwg67KI7JeQIOyCveyehSAo7J2Y7KG07ISxIOyInOyEnCDsnpDrj5kg7LKY66asKVxuICAgIGlmIChhbGxGaXh0dXJlUmVjb3Jkcy5sZW5ndGggPiAwKSB7XG4gICAgICBhd2FpdCBGaXh0dXJlTWFuYWdlci5pbnNlcnRGaXh0dXJlcyh0aGlzLnRhcmdldERiTmFtZSwgYWxsRml4dHVyZVJlY29yZHMpO1xuXG4gICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgY2hhbGsuZ3JlZW4oXG4gICAgICAgICAgICBgQXV0by1pbXBvcnRlZCAke2V4cGxvcmVSZXN1bHQubWFpbi5lbnRpdHlJZH0gd2l0aCByZWxhdGlvbnM6IGAgK1xuICAgICAgICAgICAgICBgJHtleHBsb3JlUmVzdWx0Lm1haW4ucmVjb3Jkcy5sZW5ndGh9IG1haW4gKyAke2V4cGxvcmVSZXN1bHQucmVsYXRlZC5zaXplfSByZWxhdGVkIGVudGl0aWVzYCxcbiAgICAgICAgICApLFxuICAgICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBmaXh0dXJlR2VuZXJhdG9yIOyLpO2WiSAoRmFrZXIuanPrp4wg7KeA7JuQKVxuICAgKlxuICAgKiBmYWtlci4qIO2YleyLneydmCDtkZztmITsi53snYQg7JWI7KCE7ZWY6rKMIO2MjOyLse2VmOyXrCDsi6Ttlontlanri4jri6QuXG4gICAqIOyYiDogXCJmYWtlci5pbnRlcm5ldC5lbWFpbCgpXCIg4oaSIGZha2VyLmludGVybmV0LmVtYWlsKClcbiAgICog7JiIOiBcImZha2VyLmxvcmVtLndvcmRzKDMpXCIg4oaSIGZha2VyLmxvcmVtLndvcmRzKDMpXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVHZW5lcmF0b3IoXG4gICAgZ2VuZXJhdG9yOiBzdHJpbmcsXG4gICAgcHJvcDogRW50aXR5UHJvcCxcbiAgICBlbnRpdHk6IEVudGl0eSxcbiAgKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgLy8gRmFrZXIuanMg7ZGc7ZiE7Iud66eMIOyngOybkFxuICAgIGlmIChnZW5lcmF0b3Iuc3RhcnRzV2l0aChcImZha2VyLlwiKSkge1xuICAgICAgLy8gdXNlcm5hbWXsnbTrgpggbmFtZSDtlYTrk5zripQg7ZWc6rWt7Ja0IGZha2VyIOyCrOyaqVxuICAgICAgY29uc3QgaXNOYW1lRmllbGQgPSBwcm9wLm5hbWUgPT09IFwidXNlcm5hbWVcIiB8fCBwcm9wLm5hbWUgPT09IFwibmFtZVwiO1xuICAgICAgY29uc3QgZmFrZXJNb2R1bGUgPSBhd2FpdCBpbXBvcnQoXCJAZmFrZXItanMvZmFrZXJcIik7XG4gICAgICBjb25zdCBmYWtlciA9IGlzTmFtZUZpZWxkID8gZmFrZXJNb2R1bGUuZmFrZXJLTyA6IGZha2VyTW9kdWxlLmZha2VyO1xuICAgICAgY29uc3QgZXhwciA9IGdlbmVyYXRvci5zbGljZSg2KTsgLy8gXCJmYWtlci5cIiDsoJzqsbBcblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8g7ZWo7IiYIOqyveuhnOyZgCDsnbjsnpAg7YyM7IuxXG4gICAgICAgIGNvbnN0IG1hdGNoID0gZXhwci5tYXRjaCgvXihbXFx3Ll0rKSg/OlxcKCguKj8pXFwpKT8kLyk7XG4gICAgICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgRml4dHVyZUdlbmVyYXRvcjogSW52YWxpZCBmYWtlciBleHByZXNzaW9uIGZvciAke3Byb3AubmFtZX06ICR7Z2VuZXJhdG9yfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IFssIHBhdGgsIGFyZ3NTdHJdID0gbWF0Y2g7XG4gICAgICAgIGNvbnN0IHBhcnRzID0gcGF0aC5zcGxpdChcIi5cIik7XG5cbiAgICAgICAgLy8gZmFrZXIg6rCd7LK07JeQ7IScIO2VqOyImCDssL7quLBcbiAgICAgICAgbGV0IGZuOiB1bmtub3duID0gZmFrZXI7XG4gICAgICAgIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgICAgICAgIGlmICh0eXBlb2YgZm4gPT09IFwib2JqZWN0XCIgJiYgZm4gIT09IG51bGwgJiYgcGFydCBpbiBmbikge1xuICAgICAgICAgICAgZm4gPSAoZm4gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW3BhcnRdO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpeHR1cmVHZW5lcmF0b3I6IEludmFsaWQgZmFrZXIgcGF0aCBmb3IgJHtwcm9wLm5hbWV9OiBmYWtlci4ke3BhdGh9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8g7ZWo7IiY6rCAIOyVhOuLiOuptCDsl5Drn6xcbiAgICAgICAgaWYgKHR5cGVvZiBmbiAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGaXh0dXJlR2VuZXJhdG9yOiBmYWtlci4ke3BhdGh9IGlzIG5vdCBhIGZ1bmN0aW9uIChmb3IgJHtwcm9wLm5hbWV9KWApO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGFyZ3M6IHVua25vd25bXSA9IFtdO1xuICAgICAgICBpZiAoYXJnc1N0cj8udHJpbSgpKSB7XG4gICAgICAgICAgYXJncyA9IHRoaXMucGFyc2VHZW5lcmF0b3JBcmdzKGFyZ3NTdHIsIHByb3AubmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZm4oLi4uYXJncyk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICAgICAgYEZhaWxlZCB0byBleGVjdXRlIGdlbmVyYXRvciBcIiR7Z2VuZXJhdG9yfVwiIGZvciAke3Byb3AubmFtZX0sIGZhbGxpbmcgYmFjayB0byBkZWZhdWx0OmAsXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVEZWZhdWx0VmFsdWUocHJvcCwgZW50aXR5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBmYWtlciDsnbTsmbjsnZgg7ZGc7ZiE7Iud7J2AIOyngOybkO2VmOyngCDslYrsnYxcbiAgICAhaXNUZXN0KCkgJiZcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBjaGFsay55ZWxsb3coXG4gICAgICAgICAgYFVuc3VwcG9ydGVkIGdlbmVyYXRvciBleHByZXNzaW9uIGZvciAke3Byb3AubmFtZX06ICR7Z2VuZXJhdG9yfS4gT25seSBmYWtlci4qIGV4cHJlc3Npb25zIGFyZSBzdXBwb3J0ZWQuIFVzaW5nIGRlZmF1bHQgdmFsdWUuYCxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVEZWZhdWx0VmFsdWUocHJvcCwgZW50aXR5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtlYTrk5zsnZgg7YOA7J6F6rO8IOydtOumhOydhCDrtoTshJ3tlZjsl6wg7KCB7KCI7ZWcIOq4sOuzuOqwkuydhCDsg53shLHtlanri4jri6QuXG4gICAqXG4gICAqIOyasOyEoOyInOychDpcbiAgICogMS4g7ZWE65Oc66qFIO2MqO2EtCDrp6Tsua0gKHNhbGFyeSwgYnVkZ2V0IOuTsSDsnZjrr7jsnojripQg642w7J207YSwKVxuICAgKiAyLiDtirnsiJgg7LyA7J207IqkIChEZXBhcnRtZW50IG5hbWUg65OxIOuPhOuplOyduCDsp4Dsi50pXG4gICAqIDMuIOuwsOyXtCDtg4DsnoUgKEpTT04g67Cw7Je0KVxuICAgKiA0LiBFbnVtIO2DgOyehVxuICAgKiA1LiDtg4DsnoXrs4Qg6riw67O46rCSXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlRGVmYXVsdFZhbHVlKHByb3A6IEVudGl0eVByb3AsIGVudGl0eT86IEVudGl0eSk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IGZha2VyTW9kdWxlID0gYXdhaXQgaW1wb3J0KFwiQGZha2VyLWpzL2Zha2VyXCIpO1xuICAgIGNvbnN0IGZha2VyID0gZmFrZXJNb2R1bGUuZmFrZXI7XG4gICAgY29uc3QgZmFrZXJLTyA9IGZha2VyTW9kdWxlLmZha2VyS087XG4gICAgY29uc3QgZmFrZXJKQSA9IGZha2VyTW9kdWxlLmZha2VySkE7XG5cbiAgICBjb25zdCBsb2NhbGVGYWtlciA9IHRoaXMubG9jYWxlID09PSBcImtvXCIgPyBmYWtlcktPIDogdGhpcy5sb2NhbGUgPT09IFwiamFcIiA/IGZha2VySkEgOiBmYWtlcjtcblxuICAgIC8qKlxuICAgICAqIDEuIEVudGl0eS1zcGVjaWZpYyDtirnsiJgg7LyA7J207Iqk66W8IOuovOyggCDsspjrpqztlanri4jri6QuXG4gICAgICogZmllbGRfcGF0dGVybnPrs7Tri6Qg7Jqw7ISg7ZWY7JesLCDtirnsoJUg7JeU7Yuw7Yuw7J2YIO2VhOuTnOyXkCDrj4TrqZTsnbjsl5Ag66ee64qUIOqwkuydhCDsg53shLHtlanri4jri6QuXG4gICAgICog7JiIOiBEZXBhcnRtZW50Lm5hbWUg4oaSIO2VnOq1reyWtCDrtoDshJzrqoUgKOyCrOuejCDsnbTrpoTsnbQg7JWE64uYKVxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogRGVwYXJ0bWVudCBuYW1l7J2AIO2VnOq1reyWtCDrtoDshJzrqoUg66qp66Gd7JeQ7IScIOyEoO2Dne2VqeuLiOuLpC5cbiAgICAgKiDqs6DsnKDshLHsnYQg7JyE7ZW0IDcwJSDtmZXrpaDroZwgcHJlZml4L3N1ZmZpeOulvCDstpTqsIDtlanri4jri6QuXG4gICAgICovXG4gICAgaWYgKGVudGl0eT8uaWQgPT09IFwiRGVwYXJ0bWVudFwiICYmIHByb3AubmFtZSA9PT0gXCJuYW1lXCIpIHtcbiAgICAgIGNvbnN0IGRlcGFydG1lbnRzID0gW1xuICAgICAgICBcIuqwnOuwnO2MgFwiLFxuICAgICAgICBcIuq4sO2aje2MgFwiLFxuICAgICAgICBcIuuniOy8gO2Mhe2MgFwiLFxuICAgICAgICBcIuyYgeyXhe2MgFwiLFxuICAgICAgICBcIuyduOyCrO2MgFwiLFxuICAgICAgICBcIuy0neustO2MgFwiLFxuICAgICAgICBcIuyerOustO2MgFwiLFxuICAgICAgICBcIu2ajOqzhO2MgFwiLFxuICAgICAgICBcIuuyleustO2MgFwiLFxuICAgICAgICBcIuuUlOyekOyduO2MgFwiLFxuICAgICAgICBcIklU7YyAXCIsXG4gICAgICAgIFwi6rOg6rCd7KeA7JuQ7YyAXCIsXG4gICAgICAgIFwi7ZKI7KeI6rSA66as7YyAXCIsXG4gICAgICAgIFwi7Jew6rWs6rCc67Cc7YyAXCIsXG4gICAgICAgIFwi7IOd7IKw7YyAXCIsXG4gICAgICAgIFwi6rWs66ek7YyAXCIsXG4gICAgICAgIFwi66y866WY7YyAXCIsXG4gICAgICBdO1xuICAgICAgY29uc3QgcHJlZml4ZXMgPSBbXCLsi6Dqt5xcIiwgXCLthrXtlalcIiwgXCLsoITrnrVcIiwgXCLquIDroZzrsoxcIiwgXCLrlJTsp4DthLhcIiwgXCLtlbXsi6xcIl07XG4gICAgICBjb25zdCBzdWZmaXhlcyA9IFtcIjHtjIBcIiwgXCIy7YyAXCIsIFwiM+2MgFwiLCBcIkHtjIBcIiwgXCJC7YyAXCIsIFwi67O467aAXCIsIFwi7IS87YSwXCIsIFwi6re466O5XCJdO1xuXG4gICAgICBjb25zdCBkZXB0ID0gZmFrZXIuaGVscGVycy5hcnJheUVsZW1lbnQoZGVwYXJ0bWVudHMpO1xuXG4gICAgICBjb25zdCByYW5kb20gPSBNYXRoLnJhbmRvbSgpO1xuICAgICAgaWYgKHJhbmRvbSA+IDAuNykge1xuICAgICAgICBjb25zdCBwcmVmaXggPSBmYWtlci5oZWxwZXJzLmFycmF5RWxlbWVudChwcmVmaXhlcyk7XG4gICAgICAgIHJldHVybiBgJHtwcmVmaXh9ICR7ZGVwdH1gO1xuICAgICAgfVxuICAgICAgaWYgKHJhbmRvbSA+IDAuNCkge1xuICAgICAgICBjb25zdCBzdWZmaXggPSBmYWtlci5oZWxwZXJzLmFycmF5RWxlbWVudChzdWZmaXhlcyk7XG4gICAgICAgIHJldHVybiBgJHtkZXB0fSAke3N1ZmZpeH1gO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRlcHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogMi4g7ZWE65Oc66qF7JeQ7IScIOydmOuvuOulvCDstpTroaDtlZjsl6wg7ZiE7Iuk7KCB7J24IOuNsOydtO2EsOulvCDsg53shLHtlanri4jri6QuXG4gICAgICog7JiIOiBzYWxhcnkg4oaSIDMwTX4xNTBNICjtlZzqta0g7Jew67SJIOuylOychClcbiAgICAgKiAgICAgYnVkZ2V0IOKGkiAxME1+NTAwTSAo7ZSE66Gc7KCd7Yq4IOyYiOyCsCDrspTsnIQpXG4gICAgICovXG4gICAgY29uc3QgbG9jYWxlTWFwcGluZ3MgPSB0aGlzLm1hcHBpbmdzW3RoaXMubG9jYWxlXSB8fCB0aGlzLm1hcHBpbmdzLmVuO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWROYW1lID0gcHJvcC5uYW1lLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXy9nLCBcIlwiKTtcblxuICAgIGZvciAoY29uc3QgW3BhdHRlcm4sIGNvbmZpZ10gb2YgT2JqZWN0LmVudHJpZXMobG9jYWxlTWFwcGluZ3MuZmllbGRfcGF0dGVybnMpKSB7XG4gICAgICBpZiAobm9ybWFsaXplZE5hbWUuaW5jbHVkZXMocGF0dGVybi50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmV4ZWN1dGVGYWtlckV4cHJlc3Npb24oY29uZmlnLmZha2VyLCBwcm9wKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICBjaGFsay55ZWxsb3coXG4gICAgICAgICAgICAgICAgYEZhaWxlZCB0byBleGVjdXRlIGZpZWxkIHBhdHRlcm4gXCIke3BhdHRlcm59XCIgZm9yICR7cHJvcC5uYW1lfSwgZmFsbGluZyBiYWNrOmAsXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIDMuIEpTT04g7YOA7J6F7J2066m07IScIOuwsOyXtOyduCDqsr3smrAgKFNvbmFtdUZpbGVbXSwgc3RyaW5nW10g65OxKVxuICAgICAqIO2VhOuTnOuqhSDtjKjthLTsnYQg67O06rOgIOyggeygiO2VnCDrsLDsl7Qg642w7J207YSw66W8IOyDneyEse2VqeuLiOuLpC5cbiAgICAgKi9cbiAgICBpZiAocHJvcC50eXBlID09PSBcImpzb25cIiAmJiBcImlkXCIgaW4gcHJvcCAmJiBwcm9wLmlkKSB7XG4gICAgICBpZiAocHJvcC5pZC5lbmRzV2l0aChcIltdXCIpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlQXJyYXlWYWx1ZShwcm9wLCBlbnRpdHksIGZha2VyLCBsb2NhbGVGYWtlcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqIDQuIEVudW0g7YOA7J6F7J2AIOygleydmOuQnCDqsJIg7KSRIO2VmOuCmOulvCDrnpzrjaQg7ISg7YOd7ZWp64uI64ukICovXG4gICAgaWYgKHByb3AudHlwZSA9PT0gXCJlbnVtXCIpIHtcbiAgICAgIGxldCBlbnVtVmFsdWVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICBpZiAoXCJlbnVtXCIgaW4gcHJvcCAmJiBBcnJheS5pc0FycmF5KHByb3AuZW51bSkgJiYgcHJvcC5lbnVtLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZW51bVZhbHVlcyA9IHByb3AuZW51bTtcbiAgICAgIH0gZWxzZSBpZiAoXCJpZFwiIGluIHByb3AgJiYgcHJvcC5pZCAmJiBlbnRpdHk/LmVudW1MYWJlbHM/Lltwcm9wLmlkXSkge1xuICAgICAgICBlbnVtVmFsdWVzID0gT2JqZWN0LmtleXMoZW50aXR5LmVudW1MYWJlbHNbcHJvcC5pZF0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoZW51bVZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiBmYWtlci5oZWxwZXJzLmFycmF5RWxlbWVudChlbnVtVmFsdWVzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwcm9wLm51bGxhYmxlID8gbnVsbCA6IFwiVU5LTk9XTlwiO1xuICAgIH1cblxuICAgIGlmIChwcm9wLnR5cGUgPT09IFwiZW51bVtdXCIpIHtcbiAgICAgIGxldCBlbnVtVmFsdWVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICBpZiAoXCJlbnVtXCIgaW4gcHJvcCAmJiBBcnJheS5pc0FycmF5KHByb3AuZW51bSkgJiYgcHJvcC5lbnVtLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZW51bVZhbHVlcyA9IHByb3AuZW51bTtcbiAgICAgIH0gZWxzZSBpZiAoXCJpZFwiIGluIHByb3AgJiYgcHJvcC5pZCAmJiBlbnRpdHk/LmVudW1MYWJlbHM/Lltwcm9wLmlkXSkge1xuICAgICAgICBlbnVtVmFsdWVzID0gT2JqZWN0LmtleXMoZW50aXR5LmVudW1MYWJlbHNbcHJvcC5pZF0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoZW51bVZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiBbZmFrZXIuaGVscGVycy5hcnJheUVsZW1lbnQoZW51bVZhbHVlcyldO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIDUuIFZlY3RvciDtg4DsnoXsnYAg7ZiE7J6sIOyngOybkO2VmOyngCDslYrsnLzrr4DroZwgbnVsbOydhCDrsJjtmZjtlanri4jri6QuXG4gICAgICog7Zal7ZuEIEFJIGVtYmVkZGluZyDsg53shLEg6riw64qlIOy2lOqwgCDsi5wg6rWs7ZiEIOyYiOygleyeheuLiOuLpC5cbiAgICAgKi9cbiAgICBpZiAocHJvcC50eXBlID09PSBcInZlY3RvclwiIHx8IHByb3AudHlwZSA9PT0gXCJ2ZWN0b3JbXVwiIHx8IHByb3AudHlwZSA9PT0gXCJ0c3ZlY3RvclwiKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvKiogNi4g7YOA7J6F67OEIOq4sOuzuCBGYWtlciDtkZztmITsi53snYQg7Iuk7ZaJ7ZWp64uI64ukICovXG4gICAgY29uc3QgdHlwZURlZmF1bHQgPSBsb2NhbGVNYXBwaW5ncy50eXBlX2RlZmF1bHRzW3Byb3AudHlwZV07XG4gICAgaWYgKHR5cGVEZWZhdWx0KSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5leGVjdXRlRmFrZXJFeHByZXNzaW9uKHR5cGVEZWZhdWx0LmZha2VyLCBwcm9wKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgY2hhbGsueWVsbG93KGBGYWlsZWQgdG8gZXhlY3V0ZSB0eXBlIGRlZmF1bHQgZm9yICR7cHJvcC50eXBlfSwgdXNpbmcgZmFsbGJhY2s6YCwgZXJyb3IpLFxuICAgICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqIDcuIOunpO2VkeuQmOyngCDslYrsnYAg7YOA7J6F7J2AIOq4sOuzuCBGYWtlciDtlajsiJjroZwg7LKY66as7ZWp64uI64ukICovXG4gICAgc3dpdGNoIChwcm9wLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgIGNhc2UgXCJzdHJpbmdbXVwiOlxuICAgICAgICByZXR1cm4gZmFrZXIubG9yZW0ud29yZHMoMyk7XG4gICAgICBjYXNlIFwiaW50ZWdlclwiOlxuICAgICAgICByZXR1cm4gZmFrZXIubnVtYmVyLmludCh7IG1pbjogMSwgbWF4OiAxMDAwIH0pO1xuICAgICAgY2FzZSBcImludGVnZXJbXVwiOlxuICAgICAgICByZXR1cm4gW2Zha2VyLm51bWJlci5pbnQoeyBtaW46IDEsIG1heDogMTAwMCB9KV07XG4gICAgICBjYXNlIFwiYmlnSW50ZWdlclwiOlxuICAgICAgICByZXR1cm4gZmFrZXIubnVtYmVyLmJpZ0ludCh7IG1pbjogMW4sIG1heDogMTAwMG4gfSk7XG4gICAgICBjYXNlIFwiYmlnSW50ZWdlcltdXCI6XG4gICAgICAgIHJldHVybiBbZmFrZXIubnVtYmVyLmJpZ0ludCh7IG1pbjogMW4sIG1heDogMTAwMG4gfSldO1xuICAgICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgY2FzZSBcIm51bWVyaWNcIjpcbiAgICAgICAgcmV0dXJuIGZha2VyLm51bWJlci5mbG9hdCh7IG1pbjogMCwgbWF4OiAxMDAwIH0pO1xuICAgICAgY2FzZSBcIm51bWJlcltdXCI6XG4gICAgICBjYXNlIFwibnVtZXJpY1tdXCI6XG4gICAgICAgIHJldHVybiBbZmFrZXIubnVtYmVyLmZsb2F0KHsgbWluOiAwLCBtYXg6IDEwMDAgfSldO1xuICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgcmV0dXJuIGZha2VyLmRhdGF0eXBlLmJvb2xlYW4oKTtcbiAgICAgIGNhc2UgXCJib29sZWFuW11cIjpcbiAgICAgICAgcmV0dXJuIFtmYWtlci5kYXRhdHlwZS5ib29sZWFuKCldO1xuICAgICAgY2FzZSBcImRhdGVcIjpcbiAgICAgIGNhc2UgXCJkYXRlW11cIjpcbiAgICAgICAgcmV0dXJuIGZha2VyLmRhdGUucGFzdCgpO1xuICAgICAgY2FzZSBcImpzb25cIjpcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgY2FzZSBcInV1aWRcIjpcbiAgICAgIGNhc2UgXCJ1dWlkW11cIjpcbiAgICAgICAgcmV0dXJuIGZha2VyLnN0cmluZy51dWlkKCk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog67Cw7Je0IO2DgOyeheydmCDqsJLsnYQg7IOd7ISx7ZWp64uI64ukLlxuICAgKlxuICAgKiDtg4DsnoUgSUTsmYAg7ZWE65Oc66qFIO2MqO2EtOydhCDrtoTshJ3tlZjsl6wg7KCB7KCI7ZWcIOuwsOyXtCDrjbDsnbTthLDrpbwg7IOd7ISx7ZWp64uI64ukLlxuICAgKiDsmIg6IGltYWdlX3VybHMg4oaSIFt7dXJsLCBuYW1lLCBtaW1lX3R5cGV9LCAuLi5dXG4gICAqICAgICB0YWdfaWRzIOKGkiBbMSwgMjMsIDQ1XVxuICAgKi9cbiAgcHJpdmF0ZSBnZW5lcmF0ZUFycmF5VmFsdWUoXG4gICAgcHJvcDogRW50aXR5UHJvcCxcbiAgICBfZW50aXR5OiBFbnRpdHkgfCB1bmRlZmluZWQsXG4gICAgZmFrZXI6IHR5cGVvZiBpbXBvcnQoXCJAZmFrZXItanMvZmFrZXJcIikuZmFrZXIsXG4gICAgX2xvY2FsZUZha2VyOiB0eXBlb2YgaW1wb3J0KFwiQGZha2VyLWpzL2Zha2VyXCIpLmZha2VyLFxuICApOiB1bmtub3duW10ge1xuICAgIGNvbnN0IGNvdW50ID0gZmFrZXIubnVtYmVyLmludCh7IG1pbjogMSwgbWF4OiAzIH0pO1xuXG4gICAgLyoqIFNvbmFtdUZpbGVbXeydgCBTb25hbXUg64K07J6lIO2DgOyeheycvOuhnCDqtazsobDqsIAg7KCV7ZW07KC4IOyeiOyKteuLiOuLpCAqL1xuICAgIGlmIChcImlkXCIgaW4gcHJvcCAmJiBwcm9wLmlkID09PSBcIlNvbmFtdUZpbGVbXVwiKSB7XG4gICAgICByZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogY291bnQgfSwgKCkgPT4gKHtcbiAgICAgICAgdXJsOiBmYWtlci5pbWFnZS51cmwoKSxcbiAgICAgICAgbmFtZTogZmFrZXIuc3lzdGVtLmZpbGVOYW1lKCksXG4gICAgICAgIG1pbWVfdHlwZTogZmFrZXIuaGVscGVycy5hcnJheUVsZW1lbnQoW1xuICAgICAgICAgIFwiaW1hZ2UvanBlZ1wiLFxuICAgICAgICAgIFwiaW1hZ2UvcG5nXCIsXG4gICAgICAgICAgXCJpbWFnZS9naWZcIixcbiAgICAgICAgICBcImFwcGxpY2F0aW9uL3BkZlwiLFxuICAgICAgICBdKSxcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICAvKiog7ZWE65Oc66qF7JeQ7IScIOuwsOyXtOydmCDsmqnrj4Trpbwg7LaU66Gg7ZWp64uI64ukICovXG4gICAgY29uc3Qgbm9ybWFsaXplZE5hbWUgPSBwcm9wLm5hbWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9fL2csIFwiXCIpO1xuXG4gICAgaWYgKG5vcm1hbGl6ZWROYW1lLmluY2x1ZGVzKFwidXJsXCIpIHx8IG5vcm1hbGl6ZWROYW1lLmluY2x1ZGVzKFwiaW1hZ2VcIikpIHtcbiAgICAgIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBjb3VudCB9LCAoKSA9PiBmYWtlci5pbnRlcm5ldC51cmwoKSk7XG4gICAgfVxuXG4gICAgaWYgKG5vcm1hbGl6ZWROYW1lLmluY2x1ZGVzKFwiaWRcIikgJiYgbm9ybWFsaXplZE5hbWUuZW5kc1dpdGgoXCJzXCIpKSB7XG4gICAgICByZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogY291bnQgfSwgKCkgPT4gZmFrZXIubnVtYmVyLmludCh7IG1pbjogMSwgbWF4OiAxMDAgfSkpO1xuICAgIH1cblxuICAgIGlmIChub3JtYWxpemVkTmFtZS5pbmNsdWRlcyhcInRhZ1wiKSB8fCBub3JtYWxpemVkTmFtZS5pbmNsdWRlcyhcIm5hbWVcIikpIHtcbiAgICAgIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBjb3VudCB9LCAoKSA9PiBmYWtlci5sb3JlbS53b3JkKCkpO1xuICAgIH1cblxuICAgIC8qKiDtjKjthLQg66ek7Lmt65CY7KeAIOyViuycvOuptCDruYgg67Cw7Je07J2EIOuwmO2ZmO2VqeuLiOuLpCAqL1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBKU09OIOunpO2VkeydmCBGYWtlciDtkZztmITsi53snYQg7YyM7Iux7ZWY7JesIOyLpO2Wie2VqeuLiOuLpC5cbiAgICpcbiAgICog7ZGc7ZiE7IudIOyYiOyLnDpcbiAgICogLSBcImZha2VyLmludGVybmV0LmVtYWlsKClcIiDihpIg7J247J6QIOyXhuydjFxuICAgKiAtIFwiZmFrZXIubnVtYmVyLmludCh7IG1pbjogMSwgbWF4OiAxMDAgfSlcIiDihpIgSlNPTiDsnbjsnpBcbiAgICogLSBcInt9XCIg4oaSIOumrO2EsOuftCDqsJIgKEpTT04ucGFyc2UpXG4gICAqXG4gICAqIGZha2VyS08sIGZha2VySkHrj4Qg7KeA7JuQ7ZWY7JesIOuLpOq1reyWtCDrjbDsnbTthLDrpbwg7IOd7ISx7ZWp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBleGVjdXRlRmFrZXJFeHByZXNzaW9uKGV4cHJlc3Npb246IHN0cmluZywgcHJvcDogRW50aXR5UHJvcCk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IGZha2VyTW9kdWxlID0gYXdhaXQgaW1wb3J0KFwiQGZha2VyLWpzL2Zha2VyXCIpO1xuICAgIGNvbnN0IGZha2VyID0gZmFrZXJNb2R1bGUuZmFrZXI7XG4gICAgY29uc3QgZmFrZXJLTyA9IGZha2VyTW9kdWxlLmZha2VyS087XG4gICAgY29uc3QgZmFrZXJKQSA9IGZha2VyTW9kdWxlLmZha2VySkE7XG5cbiAgICAvKiogRmFrZXIg7ZGc7ZiE7Iud7J20IOyVhOuLjCDrpqzthLDrn7Qg6rCS7J2AIEpTT07snLzroZwg7YyM7Iux7ZWp64uI64ukICovXG4gICAgaWYgKCFleHByZXNzaW9uLnN0YXJ0c1dpdGgoXCJmYWtlclwiKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZXhwcmVzc2lvbik7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIGV4cHJlc3Npb247XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqIO2RnO2YhOyLneyXkOyEnCBGYWtlciDqsJ3ssrTsmYAg6rK966Gc66W8IOy2lOy2nO2VqeuLiOuLpCAqL1xuICAgIGNvbnN0IG1hdGNoID0gZXhwcmVzc2lvbi5tYXRjaCgvXihmYWtlcnxmYWtlcktPfGZha2VySkEpXFwuKC4qPykkLyk7XG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGZha2VyIGV4cHJlc3Npb246ICR7ZXhwcmVzc2lvbn1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBbLCBmYWtlck5hbWUsIGV4cHJdID0gbWF0Y2g7XG4gICAgY29uc3Qgc2VsZWN0ZWRGYWtlciA9XG4gICAgICBmYWtlck5hbWUgPT09IFwiZmFrZXJLT1wiID8gZmFrZXJLTyA6IGZha2VyTmFtZSA9PT0gXCJmYWtlckpBXCIgPyBmYWtlckpBIDogZmFrZXI7XG5cbiAgICBjb25zdCBmdW5jTWF0Y2ggPSBleHByLm1hdGNoKC9eKFtcXHcuXSspKD86XFwoKC4qPylcXCkpPyQvKTtcbiAgICBpZiAoIWZ1bmNNYXRjaCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGZha2VyIGV4cHJlc3Npb24gZm9yICR7cHJvcC5uYW1lfTogJHtleHByZXNzaW9ufWApO1xuICAgIH1cblxuICAgIGNvbnN0IFssIHBhdGgsIGFyZ3NTdHJdID0gZnVuY01hdGNoO1xuICAgIGNvbnN0IHBhcnRzID0gcGF0aC5zcGxpdChcIi5cIik7XG5cbiAgICAvKiog7KCQIO2RnOq4sOuylShkb3Qgbm90YXRpb24p7Jy866GcIEZha2VyIO2VqOyImOulvCDssL7slYTqsJHri4jri6QgKi9cbiAgICBsZXQgZm46IHVua25vd24gPSBzZWxlY3RlZEZha2VyO1xuICAgIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgICAgaWYgKHR5cGVvZiBmbiA9PT0gXCJvYmplY3RcIiAmJiBmbiAhPT0gbnVsbCAmJiBwYXJ0IGluIGZuKSB7XG4gICAgICAgIGZuID0gKGZuIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtwYXJ0XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBmYWtlciBwYXRoIGZvciAke3Byb3AubmFtZX06ICR7ZmFrZXJOYW1lfS4ke3BhdGh9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBmbiAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZmFrZXJOYW1lfS4ke3BhdGh9IGlzIG5vdCBhIGZ1bmN0aW9uIChmb3IgJHtwcm9wLm5hbWV9KWApO1xuICAgIH1cblxuICAgIGxldCBhcmdzOiB1bmtub3duW10gPSBbXTtcbiAgICBpZiAoYXJnc1N0cj8udHJpbSgpKSB7XG4gICAgICBhcmdzID0gdGhpcy5wYXJzZUdlbmVyYXRvckFyZ3MoYXJnc1N0ciwgcHJvcC5uYW1lKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZm4oLi4uYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogZml4dHVyZUhpbnTrpbwgTExN7JeQ6rKMIOyghOuLrO2VmOyXrCDtmITsi6TsoIHsnbgg7YWM7Iqk7Yq4IOuNsOydtO2EsOulvCDsg53shLHtlanri4jri6QuXG4gICAqXG4gICAqIGZha2VyLmpz66Gc64qUIOyDneyEse2VmOq4sCDslrTroKTsmrQg67O17J6h7ZWcIO2FjeyKpO2KuCjsnpDquLDshozqsJwsIOyEpOuqheusuCDrk7Ep66W8XG4gICAqIExMTeydhCDtmZzsmqntlZjsl6wg7IOd7ISx7ZWp64uI64ukLiDrj5nsnbztlZwgaGludOyXkCDrjIDtlZwg7KSR67O1IO2YuOy2nOydhCDrsKnsp4DtlZjquLAg7JyE7ZW0XG4gICAqIOy6kOyLseydhCDquLDrs7jsnLzroZwg7KeA7JuQ7ZWp64uI64ukIChMTE0gQVBJIOu5hOyaqSDsoIjqsJApLlxuICAgKlxuICAgKiBhaSDtjKjtgqTsp4DripQgZHluYW1pYyBpbXBvcnTroZwg67aI65+s7Jik66+A66GcLCB1c2VMTE3snbQgZmFsc2Xsnbgg6rK97JqwXG4gICAqIOydmOyhtOyEseydtCDshKTsuZjrkJjsp4Ag7JWK7JWE64+EIGZpeHR1cmUg7IOd7ISx7J20IOygleyDgSDrj5nsnpHtlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlV2l0aExMTShcbiAgICBmaXh0dXJlSGludDogc3RyaW5nLFxuICAgIHByb3A6IEVudGl0eVByb3AsXG4gICAgZW50aXR5OiBFbnRpdHksXG4gICAgcm93S2V5Pzogc3RyaW5nLFxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICAvLyByb3dLZXnqsIAg7J6I7Jy866m0IHJvdyDri6jsnIQg7IOd7ISxIOyghOuetSDsgqzsmqlcbiAgICBpZiAocm93S2V5KSB7XG4gICAgICBjb25zdCByb3dDYWNoZUtleSA9IGAke3Jvd0tleX06JHtwcm9wLm5hbWV9YDtcblxuICAgICAgLy8g7J2066+4IOydtCByb3fsl5Ag64yA7ZWcIExMTSDtmLjstpzsnbQg7JmE66OM65CcIOqyveyasCDsupDsi5zsl5DshJwg67CU66GcIOuwmO2ZmFxuICAgICAgaWYgKHRoaXMubGxtQ2FjaGUuaGFzKHJvd0NhY2hlS2V5KSkge1xuICAgICAgICByZXR1cm4gdGhpcy5sbG1DYWNoZS5nZXQocm93Q2FjaGVLZXkpO1xuICAgICAgfVxuXG4gICAgICAvLyDsg4ggcm93OiBMTE0g64yA7IOBIHByb3Ag7KCE7LK066W8IO2VnCDrsojsl5Ag7IOd7ISxXG4gICAgICBjb25zdCBsbG1Qcm9wcyA9IGVudGl0eS5wcm9wcy5maWx0ZXIoKHApID0+IHtcbiAgICAgICAgaWYgKGlzUmVsYXRpb25Qcm9wKHApKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChwLmNvbmU/LmZpeHR1cmVHZW5lcmF0b3IpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKHAubmFtZSA9PT0gXCJpZFwiICYmIHAuY29uZT8uZml4dHVyZVN0cmF0ZWd5ID09PSBcInNlcXVlbmNlXCIpIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuICEhcC5jb25lPy5ub3RlO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIGxsbVByb3Bz6rCAIOu5hOyWtOyeiOycvOuptCDri6jsnbwg7ZWE65OcIOuwqeyLneycvOuhnCBmYWxsYmFja1xuICAgICAgaWYgKGxsbVByb3BzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIGBbRml4dHVyZUdlbmVyYXRvcl0gbGxtUHJvcHMgaXMgZW1wdHkgZm9yICR7ZW50aXR5LmlkfS4ke3Byb3AubmFtZX0sIHVzaW5nIHNpbmdsZSBmaWVsZCBmYWxsYmFja2AsXG4gICAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVTaW5nbGVXaXRoTExNKGZpeHR1cmVIaW50LCBwcm9wLCBlbnRpdHkpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhcGlLZXkgPSB0aGlzLmdldEFwaUtleSgpO1xuICAgICAgY29uc3QgeyBjcmVhdGVBbnRocm9waWMgfSA9IGF3YWl0IGltcG9ydChcIkBhaS1zZGsvYW50aHJvcGljXCIpO1xuICAgICAgY29uc3QgeyBnZW5lcmF0ZVRleHQgfSA9IGF3YWl0IGltcG9ydChcImFpXCIpO1xuXG4gICAgICBjb25zdCByb3dSZXNwb25zZSA9IGF3YWl0IGdlbmVyYXRlVGV4dCh7XG4gICAgICAgIG1vZGVsOiBjcmVhdGVBbnRocm9waWMoeyBhcGlLZXkgfSkodGhpcy5vcHRpb25zLmxsbU1vZGVsIHx8IFwiY2xhdWRlLXNvbm5ldC00LTVcIiksXG4gICAgICAgIHByb21wdDogdGhpcy5idWlsZFJvd0xMTVByb21wdChsbG1Qcm9wcywgZW50aXR5KSxcbiAgICAgIH0pO1xuICAgICAgaWYgKCFyb3dSZXNwb25zZSB8fCB0eXBlb2Ygcm93UmVzcG9uc2UudGV4dCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIExMTSByZXNwb25zZVwiKTtcbiAgICAgIH1cblxuICAgICAgLy8g7J2R64u17J2EIO2MjOyLse2VmOyXrCDqsIEg7ZWE65Oc7JeQIOuMgO2VnCDqsrDqs7zrpbwg7LqQ7Iuc7JeQIOyggOyepVxuICAgICAgY29uc3Qgcm93UmVzdWx0ID0gdGhpcy5wYXJzZVJvd0xMTVJlc3BvbnNlKHJvd1Jlc3BvbnNlLnRleHQsIGxsbVByb3BzKTtcbiAgICAgIGZvciAoY29uc3QgW2ZpZWxkTmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJvd1Jlc3VsdCkpIHtcbiAgICAgICAgdGhpcy5sbG1DYWNoZS5zZXQoYCR7cm93S2V5fToke2ZpZWxkTmFtZX1gLCB2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIOyalOyyre2VnCDtlYTrk5zsnZgg6rCSIOuwmO2ZmCAo7JeG7Jy866m0IOuLqOydvCDtlYTrk5wgZmFsbGJhY2spXG4gICAgICBpZiAodGhpcy5sbG1DYWNoZS5oYXMocm93Q2FjaGVLZXkpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxsbUNhY2hlLmdldChyb3dDYWNoZUtleSk7XG4gICAgICB9XG5cbiAgICAgIC8vIOunjOyVvSByb3cg7J2R64u17JeQIOydtCDtlYTrk5zqsIAg64iE652965CcIOqyveyasCDri6jsnbwg7ZWE65OcIGZhbGxiYWNrXG4gICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZVNpbmdsZVdpdGhMTE0oZml4dHVyZUhpbnQsIHByb3AsIGVudGl0eSk7XG4gICAgfVxuXG4gICAgLy8gcm93S2V56rCAIOyXhuycvOuptCDquLDsobQg64uo7J28IO2VhOuTnCDrsKnsi51cbiAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZVNpbmdsZVdpdGhMTE0oZml4dHVyZUhpbnQsIHByb3AsIGVudGl0eSk7XG4gIH1cblxuICAvKipcbiAgICog64uo7J28IO2VhOuTnOulvCBMTE3snLzroZwg7IOd7ISx7ZWp64uI64ukIChyb3dLZXkg7JeG7J2EIOuVjCBmYWxsYmFja+yaqSlcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVTaW5nbGVXaXRoTExNKFxuICAgIGZpeHR1cmVIaW50OiBzdHJpbmcsXG4gICAgcHJvcDogRW50aXR5UHJvcCxcbiAgICBlbnRpdHk6IEVudGl0eSxcbiAgKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgY29uc3QgY2FjaGVLZXkgPSBgJHtlbnRpdHkuaWR9OiR7cHJvcC5uYW1lfToke2ZpeHR1cmVIaW50fWA7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5lbmFibGVMTE1DYWNoZSAmJiB0aGlzLmxsbUNhY2hlLmhhcyhjYWNoZUtleSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmxsbUNhY2hlLmdldChjYWNoZUtleSk7XG4gICAgfVxuXG4gICAgY29uc3QgYXBpS2V5ID0gdGhpcy5nZXRBcGlLZXkoKTtcbiAgICBjb25zdCB7IGNyZWF0ZUFudGhyb3BpYyB9ID0gYXdhaXQgaW1wb3J0KFwiQGFpLXNkay9hbnRocm9waWNcIik7XG4gICAgY29uc3QgeyBnZW5lcmF0ZVRleHQgfSA9IGF3YWl0IGltcG9ydChcImFpXCIpO1xuXG4gICAgY29uc3Qgc2luZ2xlUmVzcG9uc2UgPSBhd2FpdCBnZW5lcmF0ZVRleHQoe1xuICAgICAgbW9kZWw6IGNyZWF0ZUFudGhyb3BpYyh7IGFwaUtleSB9KSh0aGlzLm9wdGlvbnMubGxtTW9kZWwgfHwgXCJjbGF1ZGUtc29ubmV0LTQtNVwiKSxcbiAgICAgIHByb21wdDogdGhpcy5idWlsZExMTVByb21wdChmaXh0dXJlSGludCwgcHJvcCwgZW50aXR5KSxcbiAgICB9KTtcbiAgICBpZiAoIXNpbmdsZVJlc3BvbnNlIHx8IHR5cGVvZiBzaW5nbGVSZXNwb25zZS50ZXh0ICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIExMTSByZXNwb25zZVwiKTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMucGFyc2VMTE1SZXNwb25zZShzaW5nbGVSZXNwb25zZS50ZXh0LCBwcm9wLnR5cGUpO1xuICAgIGlmICh0aGlzLm9wdGlvbnMuZW5hYmxlTExNQ2FjaGUpIHtcbiAgICAgIHRoaXMubGxtQ2FjaGUuc2V0KGNhY2hlS2V5LCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIHJvdyDsoITssrTrpbwg7ZWcIOuyiOyXkCDsg53shLHtlZjripQgTExNIO2UhOuhrO2UhO2KuOulvCDrp4zrk63ri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkUm93TExNUHJvbXB0KHByb3BzOiBFbnRpdHlQcm9wW10sIGVudGl0eTogRW50aXR5KTogc3RyaW5nIHtcbiAgICBjb25zdCBsb2NhbGUgPSB0aGlzLm9wdGlvbnMubG9jYWxlIHx8IFwia29cIjtcbiAgICBjb25zdCBsYW5ndWFnZSA9IGxvY2FsZSA9PT0gXCJrb1wiID8gXCJLb3JlYW5cIiA6IGxvY2FsZSA9PT0gXCJqYVwiID8gXCJKYXBhbmVzZVwiIDogXCJFbmdsaXNoXCI7XG5cbiAgICBjb25zdCBmaWVsZERlc2NyaXB0aW9ucyA9IHByb3BzXG4gICAgICAubWFwKChwKSA9PiB7XG4gICAgICAgIGxldCBkZXNjID0gYC0gJHtwLm5hbWV9ICgke3AudHlwZX0pOiAke3AuY29uZT8ubm90ZSA/PyBcIlwifWA7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAocC50eXBlID09PSBcImVudW1cIiB8fCBwLnR5cGUgPT09IFwiZW51bVtdXCIpICYmXG4gICAgICAgICAgXCJpZFwiIGluIHAgJiZcbiAgICAgICAgICBwLmlkICYmXG4gICAgICAgICAgZW50aXR5LmVudW1MYWJlbHM/LltwLmlkXVxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCB2YWx1ZXMgPSBPYmplY3Qua2V5cyhlbnRpdHkuZW51bUxhYmVsc1twLmlkXSkuam9pbihcIiwgXCIpO1xuICAgICAgICAgIGRlc2MgKz0gYCBbYWxsb3dlZCB2YWx1ZXM6ICR7dmFsdWVzfV1gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZXNjO1xuICAgICAgfSlcbiAgICAgIC5qb2luKFwiXFxuXCIpO1xuXG4gICAgLy8gTExNIOuMgOyDgeydtCDslYTri4wgcHJvcOuTpOuPhCDrp6Xrnb3snLzroZwg7KCc6rO1IChyZWxhdGlvbiDsoJzsmbgpXG4gICAgY29uc3Qgb3RoZXJQcm9wcyA9IGVudGl0eS5wcm9wc1xuICAgICAgLmZpbHRlcihcbiAgICAgICAgKHApID0+XG4gICAgICAgICAgIXByb3BzLmluY2x1ZGVzKHApICYmXG4gICAgICAgICAgIWlzUmVsYXRpb25Qcm9wKHApICYmXG4gICAgICAgICAgcC5uYW1lICE9PSBcImlkXCIgJiZcbiAgICAgICAgICAhKFwidmlydHVhbFwiIGluIHAgJiYgcC52aXJ0dWFsKSxcbiAgICAgIClcbiAgICAgIC5tYXAoKHApID0+IHtcbiAgICAgICAgbGV0IGRlc2MgPSBgLSAke3AubmFtZX0gKCR7cC50eXBlfSlgO1xuICAgICAgICBpZiAocC5jb25lPy5ub3RlKSBkZXNjICs9IGA6ICR7cC5jb25lLm5vdGV9YDtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIChwLnR5cGUgPT09IFwiZW51bVwiIHx8IHAudHlwZSA9PT0gXCJlbnVtW11cIikgJiZcbiAgICAgICAgICBcImlkXCIgaW4gcCAmJlxuICAgICAgICAgIHAuaWQgJiZcbiAgICAgICAgICBlbnRpdHkuZW51bUxhYmVscz8uW3AuaWRdXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IE9iamVjdC5rZXlzKGVudGl0eS5lbnVtTGFiZWxzW3AuaWRdKS5qb2luKFwiLCBcIik7XG4gICAgICAgICAgZGVzYyArPSBgIFthbGxvd2VkIHZhbHVlczogJHt2YWx1ZXN9XWA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlc2M7XG4gICAgICB9KVxuICAgICAgLmpvaW4oXCJcXG5cIik7XG4gICAgY29uc3Qgb3RoZXJQcm9wc0NvbnRleHQgPSBvdGhlclByb3BzXG4gICAgICA/IGBcXG5cXG5PdGhlciBmaWVsZHMgaW4gdGhpcyBlbnRpdHkgKGZvciBjb250ZXh0LCBkbyBOT1QgZ2VuZXJhdGUgdGhlc2UpOlxcbiR7b3RoZXJQcm9wc31gXG4gICAgICA6IFwiXCI7XG5cbiAgICBjb25zdCBvdXRwdXRTaGFwZSA9IHByb3BzLm1hcCgocCkgPT4gYCAgXCIke3AubmFtZX1cIjogPCR7cC50eXBlfT5gKS5qb2luKFwiLFxcblwiKTtcblxuICAgIGNvbnN0IGVudGl0eUNvbnRleHQgPSBlbnRpdHkuY29uZT8ubm90ZSA/IGBcXG5FbnRpdHkgZGVzY3JpcHRpb246ICR7ZW50aXR5LmNvbmUubm90ZX1gIDogXCJcIjtcblxuICAgIHJldHVybiBgR2VuZXJhdGUgdGVzdCBmaXh0dXJlIGRhdGEgZm9yIHRoZSAke2VudGl0eS5pZH0gZW50aXR5LiBBbGwgZmllbGRzIG11c3QgYmUgY29oZXJlbnQgYW5kIGNvbnNpc3RlbnQgd2l0aCBlYWNoIG90aGVyLlxuXG5FbnRpdHk6ICR7ZW50aXR5LmlkfSR7ZW50aXR5Q29udGV4dH1cbkxvY2FsZTogJHtsb2NhbGV9ICh1c2UgJHtsYW5ndWFnZX0gZm9yIHRleHQgZmllbGRzKVxuXG5GaWVsZHMgdG8gZ2VuZXJhdGU6XG4ke2ZpZWxkRGVzY3JpcHRpb25zfSR7b3RoZXJQcm9wc0NvbnRleHR9XG5cblJ1bGVzOlxuLSBBbGwgZmllbGRzIGluIGEgc2luZ2xlIHJvdyBtdXN0IGJlIGxvZ2ljYWxseSBjb25zaXN0ZW50IChlLmcuIG5hbWUvbmFtZV9lbi9uYW1lX2NuIHNob3VsZCByZXByZXNlbnQgdGhlIHNhbWUgcGVyc29uKVxuLSBSZXR1cm4gT05MWSB2YWxpZCBKU09OLCBubyBtYXJrZG93biBvciBleHBsYW5hdGlvblxuLSBEYXRlcyBpbiBJU08gODYwMSBmb3JtYXRcbi0gVXNlICR7bGFuZ3VhZ2V9IGZvciB0ZXh0IHVubGVzcyBmaWVsZCBkZXNjcmlwdGlvbiBzYXlzIG90aGVyd2lzZVxuXG5SZXR1cm4gZXhhY3RseSB0aGlzIEpTT04gc2hhcGU6XG57XG4ke291dHB1dFNoYXBlfVxufWA7XG4gIH1cblxuICAvKipcbiAgICogcm93IExMTSDsnZHri7XsnYQg7YyM7Iux7ZWY7JesIO2VhOuTnOuzhCDqsJLsnLzroZwg67OA7ZmY7ZWp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBwYXJzZVJvd0xMTVJlc3BvbnNlKHRleHQ6IHN0cmluZywgcHJvcHM6IEVudGl0eVByb3BbXSk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICBjb25zdCBqc29uVGV4dCA9IHRleHRcbiAgICAgIC50cmltKClcbiAgICAgIC5yZXBsYWNlKC9eYGBganNvblxccyovaSwgXCJcIilcbiAgICAgIC5yZXBsYWNlKC9gYGBcXHMqJC8sIFwiXCIpXG4gICAgICAudHJpbSgpO1xuXG4gICAgbGV0IHBhcnNlZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJhdyA9IEpTT04ucGFyc2UoanNvblRleHQpO1xuICAgICAgaWYgKHR5cGVvZiByYXcgIT09IFwib2JqZWN0XCIgfHwgcmF3ID09PSBudWxsIHx8IEFycmF5LmlzQXJyYXkocmF3KSkge1xuICAgICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgICBjb25zb2xlLndhcm4oXCJbRml4dHVyZUdlbmVyYXRvcl0gUm93IExMTSByZXNwb25zZSBpcyBub3QgYSBwbGFpbiBvYmplY3Q6XCIsIHRleHQpO1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgICBwYXJzZWQgPSByYXcgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgfSBjYXRjaCB7XG4gICAgICAhaXNUZXN0KCkgJiYgY29uc29sZS53YXJuKFwiW0ZpeHR1cmVHZW5lcmF0b3JdIEZhaWxlZCB0byBwYXJzZSByb3cgTExNIHJlc3BvbnNlOlwiLCB0ZXh0KTtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgZm9yIChjb25zdCBwcm9wIG9mIHByb3BzKSB7XG4gICAgICBpZiAocHJvcC5uYW1lIGluIHBhcnNlZCkge1xuICAgICAgICByZXN1bHRbcHJvcC5uYW1lXSA9IHRoaXMucGFyc2VMTE1SZXNwb25zZShTdHJpbmcocGFyc2VkW3Byb3AubmFtZV0gPz8gXCJcIiksIHByb3AudHlwZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkTExNUHJvbXB0KGhpbnQ6IHN0cmluZywgcHJvcDogRW50aXR5UHJvcCwgZW50aXR5OiBFbnRpdHkpOiBzdHJpbmcge1xuICAgIGNvbnN0IGxvY2FsZSA9IHRoaXMub3B0aW9ucy5sb2NhbGUgfHwgXCJrb1wiO1xuICAgIGNvbnN0IGxhbmd1YWdlID0gbG9jYWxlID09PSBcImtvXCIgPyBcIktvcmVhblwiIDogbG9jYWxlID09PSBcImphXCIgPyBcIkphcGFuZXNlXCIgOiBcIkVuZ2xpc2hcIjtcblxuICAgIGNvbnN0IGVudGl0eUNvbnRleHQgPSBlbnRpdHkuY29uZT8ubm90ZSA/IGBcXG5FbnRpdHkgY29udGV4dDogJHtlbnRpdHkuY29uZS5ub3RlfWAgOiBcIlwiO1xuXG4gICAgY29uc3Qgb3RoZXJGaWVsZHMgPSBlbnRpdHkucHJvcHNcbiAgICAgIC5maWx0ZXIoKHApID0+IHAubmFtZSAhPT0gcHJvcC5uYW1lICYmICFpc1JlbGF0aW9uUHJvcChwKSAmJiBwLmNvbmU/Lm5vdGUpXG4gICAgICAubWFwKChwKSA9PiBgLSAke3AubmFtZX0gKCR7cC50eXBlfSk6ICR7cC5jb25lPy5ub3RlfWApXG4gICAgICAuam9pbihcIlxcblwiKTtcbiAgICBjb25zdCBvdGhlckZpZWxkc0NvbnRleHQgPSBvdGhlckZpZWxkc1xuICAgICAgPyBgXFxuXFxuT3RoZXIgZmllbGRzIGluIHRoaXMgZW50aXR5IChmb3IgY29udGV4dCk6XFxuJHtvdGhlckZpZWxkc31gXG4gICAgICA6IFwiXCI7XG5cbiAgICBsZXQgcHJvbXB0ID0gYEdlbmVyYXRlIHRlc3QgZGF0YSBmb3IgJHtlbnRpdHkuaWR9LiR7cHJvcC5uYW1lfSAodHlwZTogJHtwcm9wLnR5cGV9KSR7ZW50aXR5Q29udGV4dH0ke290aGVyRmllbGRzQ29udGV4dH1cblxuUmVxdWlyZW1lbnQ6ICR7aGludH1cblxuUnVsZXM6XG4tIFJldHVybiBPTkxZIHRoZSB2YWx1ZSwgbm8gZXhwbGFuYXRpb24gb3IgbWFya2Rvd25cbi0gVXNlICR7bGFuZ3VhZ2V9IGxhbmd1YWdlIGlmIGFwcGxpY2FibGVcbi0gRm9ybWF0OiAke3RoaXMuZ2V0RXhwZWN0ZWRGb3JtYXQocHJvcC50eXBlKX1gO1xuXG4gICAgLy8gZW51bSDtg4DsnoXsnbgg6rK97JqwIOqwgOuKpe2VnCDqsJIg66qp66GdIOy2lOqwgFxuICAgIGlmIChwcm9wLnR5cGUgPT09IFwiZW51bVwiIHx8IHByb3AudHlwZSA9PT0gXCJlbnVtW11cIikge1xuICAgICAgbGV0IGVudW1WYWx1ZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICAgIGlmIChcImVudW1cIiBpbiBwcm9wICYmIEFycmF5LmlzQXJyYXkocHJvcC5lbnVtKSAmJiBwcm9wLmVudW0ubGVuZ3RoID4gMCkge1xuICAgICAgICBlbnVtVmFsdWVzID0gcHJvcC5lbnVtO1xuICAgICAgfSBlbHNlIGlmIChcImlkXCIgaW4gcHJvcCAmJiBwcm9wLmlkICYmIGVudGl0eT8uZW51bUxhYmVscz8uW3Byb3AuaWRdKSB7XG4gICAgICAgIGVudW1WYWx1ZXMgPSBPYmplY3Qua2V5cyhlbnRpdHkuZW51bUxhYmVsc1twcm9wLmlkXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChlbnVtVmFsdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcHJvbXB0ICs9IGBcXG4tIElNUE9SVEFOVDogQ2hvb3NlIE9OTFkgZnJvbSB0aGVzZSBhbGxvd2VkIHZhbHVlczogJHtlbnVtVmFsdWVzLmpvaW4oXCIsIFwiKX1gO1xuICAgICAgfVxuICAgIH1cblxuICAgIHByb21wdCArPSBgXFxuXFxuRXhhbXBsZTogJHt0aGlzLmdldEV4YW1wbGVGb3JUeXBlKHByb3AudHlwZSwgbG9jYWxlKX1gO1xuXG4gICAgcmV0dXJuIHByb21wdDtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VMTE1SZXNwb25zZSh0ZXh0OiBzdHJpbmcsIHByb3BUeXBlOiBzdHJpbmcpOiB1bmtub3duIHtcbiAgICBjb25zdCBjbGVhbmVkID0gdGV4dC50cmltKCk7XG5cbiAgICAvLyDrsLDsl7Qg7YOA7J6FIOyymOumrFxuICAgIGlmIChwcm9wVHlwZS5lbmRzV2l0aChcIltdXCIpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGNsZWFuZWQpO1xuICAgICAgICBjb25zdCBiYXNlVHlwZSA9IHByb3BUeXBlLnNsaWNlKDAsIC0yKTsgLy8gXCJpbnRlZ2VyW11cIiAtPiBcImludGVnZXJcIlxuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHBhcnNlZCkpIHtcbiAgICAgICAgICByZXR1cm4gcGFyc2VkLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgLy8gbnVsbC91bmRlZmluZWTripQg7YOA7J6F67OEIOq4sOuzuOqwkuycvOuhnFxuICAgICAgICAgICAgaWYgKGl0ZW0gPT09IG51bGwgfHwgaXRlbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldERlZmF1bHRWYWx1ZUZvclR5cGUoYmFzZVR5cGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8g6rCd7LK064qUIEpTT04uc3RyaW5naWZ5IO2bhCDtjIzsi7EgKGpzb24g7YOA7J6F7J24IOqyveyasClcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgICByZXR1cm4gYmFzZVR5cGUgPT09IFwianNvblwiXG4gICAgICAgICAgICAgICAgPyBpdGVtXG4gICAgICAgICAgICAgICAgOiB0aGlzLnBhcnNlU2NhbGFyVmFsdWUoSlNPTi5zdHJpbmdpZnkoaXRlbSksIGJhc2VUeXBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHByaW1pdGl2ZSDqsJLsnYAg66y47J6Q7Je066GcIOuzgO2ZmCDtm4Qg7YyM7IuxXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJzZVNjYWxhclZhbHVlKFN0cmluZyhpdGVtKSwgYmFzZVR5cGUpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g64uo7J28IOqwkuydtCDsmKgg6rK97JqwIOuwsOyXtOuhnCDqsJDsi7jquLBcbiAgICAgICAgaWYgKHBhcnNlZCA9PT0gbnVsbCB8fCBwYXJzZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiBbdGhpcy5nZXREZWZhdWx0VmFsdWVGb3JUeXBlKGJhc2VUeXBlKV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFt0aGlzLnBhcnNlU2NhbGFyVmFsdWUoU3RyaW5nKHBhcnNlZCksIGJhc2VUeXBlKV07XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnBhcnNlU2NhbGFyVmFsdWUoY2xlYW5lZCwgcHJvcFR5cGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREZWZhdWx0VmFsdWVGb3JUeXBlKHByb3BUeXBlOiBzdHJpbmcpOiB1bmtub3duIHtcbiAgICBzd2l0Y2ggKHByb3BUeXBlKSB7XG4gICAgICBjYXNlIFwiaW50ZWdlclwiOlxuICAgICAgICByZXR1cm4gMDtcbiAgICAgIGNhc2UgXCJiaWdJbnRlZ2VyXCI6XG4gICAgICAgIHJldHVybiAwbjtcbiAgICAgIGNhc2UgXCJmbG9hdFwiOlxuICAgICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgY2FzZSBcIm51bWVyaWNcIjpcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICBjYXNlIFwiZGF0ZVwiOlxuICAgICAgICByZXR1cm4gbmV3IERhdGUoKTtcbiAgICAgIGNhc2UgXCJqc29uXCI6XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIGNhc2UgXCJ1dWlkXCI6XG4gICAgICAgIHJldHVybiBcIjAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMFwiO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZVNjYWxhclZhbHVlKHRleHQ6IHN0cmluZywgcHJvcFR5cGU6IHN0cmluZyk6IHVua25vd24ge1xuICAgIGNvbnN0IGNsZWFuZWQgPSB0ZXh0LnRyaW0oKTtcblxuICAgIHN3aXRjaCAocHJvcFR5cGUpIHtcbiAgICAgIGNhc2UgXCJpbnRlZ2VyXCI6IHtcbiAgICAgICAgY29uc3QgbnVtID0gcGFyc2VJbnQoY2xlYW5lZCwgMTApO1xuICAgICAgICByZXR1cm4gTnVtYmVyLmlzTmFOKG51bSkgPyAwIDogbnVtO1xuICAgICAgfVxuICAgICAgY2FzZSBcImJpZ0ludGVnZXJcIjoge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBCaWdJbnQoY2xlYW5lZCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHJldHVybiAwbjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2FzZSBcImZsb2F0XCI6XG4gICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICBjYXNlIFwibnVtZXJpY1wiOiB7XG4gICAgICAgIGNvbnN0IG51bSA9IHBhcnNlRmxvYXQoY2xlYW5lZCk7XG4gICAgICAgIHJldHVybiBOdW1iZXIuaXNOYU4obnVtKSA/IDAgOiBudW07XG4gICAgICB9XG4gICAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgICByZXR1cm4gY2xlYW5lZC50b0xvd2VyQ2FzZSgpID09PSBcInRydWVcIjtcbiAgICAgIGNhc2UgXCJkYXRlXCI6IHtcbiAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKGNsZWFuZWQpO1xuICAgICAgICByZXR1cm4gTnVtYmVyLmlzTmFOKGRhdGUuZ2V0VGltZSgpKSA/IG5ldyBEYXRlKCkgOiBkYXRlO1xuICAgICAgfVxuICAgICAgY2FzZSBcImpzb25cIjpcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShjbGVhbmVkKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcmV0dXJuIGNsZWFuZWQ7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgXCJ1dWlkXCI6XG4gICAgICBjYXNlIFwiZW51bVwiOlxuICAgICAgICByZXR1cm4gY2xlYW5lZDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBjbGVhbmVkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBmYWtlciDtlajsiJgg7J247J6QIOusuOyekOyXtOydhCDtjIzsi7HtlZjsl6wg7J247J6QIOuwsOyXtOuhnCDrsJjtmZjtlanri4jri6QuXG4gICAqXG4gICAqIDPri6jqs4Qg7KCE6561OlxuICAgKiAxLiBKU09OIOyngeygkSDtjIzsi7EgKO2RnOykgCBKU09OIO2RnO2YhOyLnSlcbiAgICogMi4gSlMg6rCd7LK0IOumrO2EsOuftCDihpIgSlNPTiDrs4DtmZgg7ZuEIOyerOyLnOuPhCAoc2luZ2xlIHF1b3RlLCB1bnF1b3RlZCBrZXkg7LKY66asKVxuICAgKiAzLiDri6jsiJwg64uo7J28IOyduOyekCDtj7TrsLEgKOyIq+yekCwg66y47J6Q7Je0KVxuICAgKi9cbiAgcHJpdmF0ZSBwYXJzZUdlbmVyYXRvckFyZ3MoYXJnc1N0cjogc3RyaW5nLCBwcm9wTmFtZTogc3RyaW5nKTogdW5rbm93bltdIHtcbiAgICAvLyAxLiBKU09OIOyngeygkSDtjIzsi7FcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShgWyR7YXJnc1N0cn1dYCkgYXMgdW5rbm93bjtcbiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHBhcnNlZCkgPyBwYXJzZWQgOiBbcGFyc2VkXTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIOqzhOyGjVxuICAgIH1cblxuICAgIC8vIDIuIEpTIOqwneyytCDrpqzthLDrn7Qg4oaSIEpTT04g67OA7ZmYIO2bhCDsnqzsi5zrj4RcbiAgICB0cnkge1xuICAgICAgY29uc3QganNvblN0ciA9IHRoaXMuY29udmVydEpzTGl0ZXJhbFRvSnNvbihhcmdzU3RyKTtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UoYFske2pzb25TdHJ9XWApIGFzIHVua25vd247XG4gICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShwYXJzZWQpID8gcGFyc2VkIDogW3BhcnNlZF07XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyDqs4Tsho1cbiAgICB9XG5cbiAgICAvLyAzLiDri6jsiJwg64uo7J28IOyduOyekCDtj7TrsLFcbiAgICBjb25zdCB0cmltbWVkID0gYXJnc1N0ci50cmltKCk7XG4gICAgaWYgKCFOdW1iZXIuaXNOYU4oTnVtYmVyKHRyaW1tZWQpKSkge1xuICAgICAgcmV0dXJuIFtOdW1iZXIodHJpbW1lZCldO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICAodHJpbW1lZC5zdGFydHNXaXRoKCdcIicpICYmIHRyaW1tZWQuZW5kc1dpdGgoJ1wiJykpIHx8XG4gICAgICAodHJpbW1lZC5zdGFydHNXaXRoKFwiJ1wiKSAmJiB0cmltbWVkLmVuZHNXaXRoKFwiJ1wiKSlcbiAgICApIHtcbiAgICAgIHJldHVybiBbdHJpbW1lZC5zbGljZSgxLCAtMSldO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgRml4dHVyZUdlbmVyYXRvcjogQ2Fubm90IHBhcnNlIGFyZ3VtZW50cyBmb3IgJHtwcm9wTmFtZX06ICR7YXJnc1N0cn1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBKUyDqsJ3ssrQg66as7YSw65+07J2EIEpTT07snLzroZwg67OA7ZmY7ZWp64uI64ukLlxuICAgKlxuICAgKiDrkZAg6rCA7KeAIOuzgO2ZmDpcbiAgICogMS4gU2luZ2xlLXF1b3RlZCDrrLjsnpDsl7Qg4oaSIGRvdWJsZS1xdW90ZWQgKOydtOyKpOy8gOydtO2UhCDsspjrpqwg7Y+s7ZWoKVxuICAgKiAyLiBVbnF1b3RlZCDqsJ3ssrQg7YKkIOKGkiBkb3VibGUtcXVvdGVkXG4gICAqL1xuICBwcml2YXRlIGNvbnZlcnRKc0xpdGVyYWxUb0pzb24oaW5wdXQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gMS4gJ3ZhbHVlJyDihpIgXCJ2YWx1ZVwiICjrgrTrtoAgXCIg7J207Iqk7LyA7J207ZSELCBcXCcg4oaSICcpXG4gICAgY29uc3Qgd2l0aERvdWJsZVF1b3RlcyA9IGlucHV0LnJlcGxhY2UoXG4gICAgICAvJyhbXidcXFxcXSooPzpcXFxcLlteJ1xcXFxdKikqKScvZyxcbiAgICAgIChfLCBjb250ZW50OiBzdHJpbmcpID0+IGBcIiR7Y29udGVudC5yZXBsYWNlKC9cIi9nLCAnXFxcXFwiJykucmVwbGFjZSgvXFxcXCcvZywgXCInXCIpfVwiYCxcbiAgICApO1xuXG4gICAgLy8gMi4geyBrZXk6IOKGkiB7IFwia2V5XCI6XG4gICAgcmV0dXJuIHdpdGhEb3VibGVRdW90ZXMucmVwbGFjZSgvKFt7LF1cXHMqKShbYS16QS1aXyRdW1xcdyRdKikoXFxzKjopL2csICckMVwiJDJcIiQzJyk7XG4gIH1cblxuICAvKipcbiAgICogU29uYW11LnNlY3JldOydhCDsmrDshKDsnLzroZwg7ZWY6rOgLCDsl4bsnLzrqbQg7ZmY6rK967OA7IiY7JeQ7IScIEFQSSDtgqTrpbwg7J297Iq164uI64ukLlxuICAgKlxuICAgKiBTb25hbXUuc2VjcmV07J2AIO2UhOuhnOygne2KuOuzhCDshKTsoJUoc29uYW11LmNvbmZpZy50cynsnbTrr4DroZwg642UIOuGkuydgCDsmrDshKDsiJzsnITrpbwg6rCA7KeA66mwLFxuICAgKiDtmZjqsr3rs4DsiJjripQg6rCc67CcIO2ZmOqyveydtOuCmCBDSS9DROyXkOyEnCBmYWxsYmFja+ycvOuhnCDsgqzsmqnrkKnri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGdldEFwaUtleSgpOiBzdHJpbmcge1xuICAgIGxldCBhcGlLZXk6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IFNvbmFtdSB9ID0gcmVxdWlyZShcIi4uL2FwaVwiKTtcbiAgICAgIGFwaUtleSA9IFNvbmFtdS5zZWNyZXQ/LmFudGhyb3BpY19hcGlfa2V5O1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gU29uYW116rCAIOy0iOq4sO2ZlOuQmOyngCDslYrsnYAg6rK97JqwICjthYzsiqTtirgg7ZmY6rK9IOuTsSlcbiAgICB9XG5cbiAgICBpZiAoIWFwaUtleSkge1xuICAgICAgYXBpS2V5ID0gcHJvY2Vzcy5lbnYuQU5USFJPUElDX0FQSV9LRVk7XG4gICAgfVxuXG4gICAgaWYgKCFhcGlLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJBTlRIUk9QSUNfQVBJX0tFWSBub3QgZm91bmQuIFNldCBpdCBpbiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgb3IgU29uYW11LnNlY3JldC5hbnRocm9waWNfYXBpX2tleVwiLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXBpS2V5O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRFeHBlY3RlZEZvcm1hdChwcm9wVHlwZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyDrsLDsl7Qg7YOA7J6FIOyymOumrFxuICAgIGlmIChwcm9wVHlwZS5lbmRzV2l0aChcIltdXCIpKSB7XG4gICAgICBjb25zdCBiYXNlVHlwZSA9IHByb3BUeXBlLnNsaWNlKDAsIC0yKTtcbiAgICAgIGNvbnN0IGJhc2VGb3JtYXQgPSB0aGlzLmdldFNjYWxhckZvcm1hdChiYXNlVHlwZSk7XG4gICAgICByZXR1cm4gYEpTT04gYXJyYXkgb2YgJHtiYXNlRm9ybWF0fSAoZS5nLiwgWyR7dGhpcy5nZXRFeGFtcGxlRm9yVHlwZShiYXNlVHlwZSwgXCJlblwiKX0sIC4uLl0pYDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5nZXRTY2FsYXJGb3JtYXQocHJvcFR5cGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTY2FsYXJGb3JtYXQocHJvcFR5cGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgc3dpdGNoIChwcm9wVHlwZSkge1xuICAgICAgY2FzZSBcImludGVnZXJcIjpcbiAgICAgIGNhc2UgXCJiaWdJbnRlZ2VyXCI6XG4gICAgICAgIHJldHVybiBcImludGVnZXIgbnVtYmVyc1wiO1xuICAgICAgY2FzZSBcImZsb2F0XCI6XG4gICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICBjYXNlIFwibnVtZXJpY1wiOlxuICAgICAgICByZXR1cm4gXCJkZWNpbWFsIG51bWJlcnNcIjtcbiAgICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICAgIHJldHVybiBcImJvb2xlYW5zICh0cnVlIG9yIGZhbHNlKVwiO1xuICAgICAgY2FzZSBcImRhdGVcIjpcbiAgICAgICAgcmV0dXJuIFwiSVNPIDg2MDEgZGF0ZSBzdHJpbmdzXCI7XG4gICAgICBjYXNlIFwianNvblwiOlxuICAgICAgICByZXR1cm4gXCJ2YWxpZCBKU09OIG9iamVjdCBvciBhcnJheVwiO1xuICAgICAgY2FzZSBcInV1aWRcIjpcbiAgICAgICAgcmV0dXJuIFwiVVVJRCBzdHJpbmdzXCI7XG4gICAgICBjYXNlIFwiZW51bVwiOlxuICAgICAgICByZXR1cm4gXCJvbmUgb2YgdGhlIGFsbG93ZWQgZW51bSB2YWx1ZXNcIjtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBcInBsYWluIHRleHQgc3RyaW5nc1wiO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0RXhhbXBsZUZvclR5cGUocHJvcFR5cGU6IHN0cmluZywgbG9jYWxlOiBMb2NhbGUpOiBzdHJpbmcge1xuICAgIC8vIOuwsOyXtCDtg4DsnoUg7LKY66asXG4gICAgaWYgKHByb3BUeXBlLmVuZHNXaXRoKFwiW11cIikpIHtcbiAgICAgIGNvbnN0IGJhc2VUeXBlID0gcHJvcFR5cGUuc2xpY2UoMCwgLTIpO1xuICAgICAgY29uc3QgYmFzZUV4YW1wbGUgPSB0aGlzLmdldFNjYWxhckV4YW1wbGUoYmFzZVR5cGUsIGxvY2FsZSk7XG4gICAgICByZXR1cm4gYFske2Jhc2VFeGFtcGxlfV1gO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmdldFNjYWxhckV4YW1wbGUocHJvcFR5cGUsIGxvY2FsZSk7XG4gIH1cblxuICBwcml2YXRlIGdldFNjYWxhckV4YW1wbGUocHJvcFR5cGU6IHN0cmluZywgbG9jYWxlOiBMb2NhbGUpOiBzdHJpbmcge1xuICAgIGNvbnN0IGlzS29yZWFuID0gbG9jYWxlID09PSBcImtvXCI7XG5cbiAgICBzd2l0Y2ggKHByb3BUeXBlKSB7XG4gICAgICBjYXNlIFwiaW50ZWdlclwiOlxuICAgICAgY2FzZSBcImJpZ0ludGVnZXJcIjpcbiAgICAgICAgcmV0dXJuIFwiNDJcIjtcbiAgICAgIGNhc2UgXCJmbG9hdFwiOlxuICAgICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgY2FzZSBcIm51bWVyaWNcIjpcbiAgICAgICAgcmV0dXJuIFwiMy4xNFwiO1xuICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgcmV0dXJuIFwidHJ1ZVwiO1xuICAgICAgY2FzZSBcImRhdGVcIjpcbiAgICAgICAgcmV0dXJuIFwiMjAyNC0wMS0wMVwiO1xuICAgICAgY2FzZSBcImpzb25cIjpcbiAgICAgICAgcmV0dXJuICd7XCJrZXlcIjogXCJ2YWx1ZVwifSc7XG4gICAgICBjYXNlIFwidXVpZFwiOlxuICAgICAgICByZXR1cm4gXCI1NTBlODQwMC1lMjliLTQxZDQtYTcxNi00NDY2NTU0NDAwMDBcIjtcbiAgICAgIGNhc2UgXCJlbnVtXCI6XG4gICAgICAgIHJldHVybiBcIkVOVU1fVkFMVUVcIjtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBpc0tvcmVhbiA/IFwi7JWI64WV7ZWY7IS47JqUXCIgOiBcIkhlbGxvXCI7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOydtOumhOydhCDsnbTrqZTsnbwg66Gc7LusIO2MjO2KuOyaqSDroZzrp4jrgpjsnbTspojrk5wg66y47J6Q7Je066GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAgICpcbiAgICog7ZWc6riAIOydtOumhOydgCDstIjshLEt7KSR7ISxLeyiheyEsSDrtoTtlbQg7ZuEIOuhnOuniOuCmOydtOymiCDsspjrpqztlanri4jri6QuXG4gICAqIOyYgeusuCDsnbTrpoTsnYAg7IaM66y47J6Q66GcIOuzgO2ZmO2VmOqzoCDqs7XrsLHsnYQg7KCQKC4pXFx1YzczY+uhnCDsuZjtmZjtlanri4jri6QuXG4gICAqIOyYiDogXCLquYDssqDsiJhcIiDihpIgXCJjaGVvbHN1LmtpbVwiLCBcIkpvaG4gRG9lXCIg4oaSIFwiam9obi5kb2VcIlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByb21hbml6ZU5hbWUobmFtZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAvLyDtlZzquIAg7Y+s7ZWoIOyXrOu2gCDtmZXsnbhcbiAgICBpZiAoL1tcXHVBQzAwLVxcdUQ3QUZdLy50ZXN0KG5hbWUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5yb21hbml6ZUtvcmVhbk5hbWUobmFtZSk7XG4gICAgfVxuICAgIC8vIOyYgeusuDog7IaM66y47J6QICsg7KCQIOq1rOu2hFxuICAgIHJldHVybiBuYW1lXG4gICAgICAudG9Mb3dlckNhc2UoKVxuICAgICAgLnJlcGxhY2UoL1xccysvZywgXCIuXCIpXG4gICAgICAucmVwbGFjZSgvW15hLXowLTkuXS9nLCBcIlwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtlZzquIAg7J2066aE7J2EIOuhnOuniOuCmOydtOymiCDsspjrpqztlanri4jri6QuXG4gICAqXG4gICAqIOy0iOyEsS/spJHshLEv7KKF7ISxIOunpO2VkSDthYzsnbTruJTsnYQg7IKs7Jqp7ZWY7JesIO2VnOq4gOydhCDroZzrp4jsnpDroZwg67OA7ZmY7ZWp64uI64ukLlxuICAgKiDssqsg6riA7J6Q66W8IOyEseycvOuhnCDqsITso7ztlZjsl6wgXCLquYDssqDsiJhcIiDihpIgXCJjaGVvbHN1LmtpbVwiIO2Yle2DnOuhnCDstpzroKXtlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIHJvbWFuaXplS29yZWFuTmFtZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IENIT1NFT05HID0gW1xuICAgICAgXCJnXCIsXG4gICAgICBcImtrXCIsXG4gICAgICBcIm5cIixcbiAgICAgIFwiZFwiLFxuICAgICAgXCJ0dFwiLFxuICAgICAgXCJyXCIsXG4gICAgICBcIm1cIixcbiAgICAgIFwiYlwiLFxuICAgICAgXCJwcFwiLFxuICAgICAgXCJzXCIsXG4gICAgICBcInNzXCIsXG4gICAgICBcIlwiLFxuICAgICAgXCJqXCIsXG4gICAgICBcImpqXCIsXG4gICAgICBcImNoXCIsXG4gICAgICBcImtcIixcbiAgICAgIFwidFwiLFxuICAgICAgXCJwXCIsXG4gICAgICBcImhcIixcbiAgICBdO1xuICAgIGNvbnN0IEpVTkdTRU9ORyA9IFtcbiAgICAgIFwiYVwiLFxuICAgICAgXCJhZVwiLFxuICAgICAgXCJ5YVwiLFxuICAgICAgXCJ5YWVcIixcbiAgICAgIFwiZW9cIixcbiAgICAgIFwiZVwiLFxuICAgICAgXCJ5ZW9cIixcbiAgICAgIFwieWVcIixcbiAgICAgIFwib1wiLFxuICAgICAgXCJ3YVwiLFxuICAgICAgXCJ3YWVcIixcbiAgICAgIFwib2VcIixcbiAgICAgIFwieW9cIixcbiAgICAgIFwidVwiLFxuICAgICAgXCJ3b1wiLFxuICAgICAgXCJ3ZVwiLFxuICAgICAgXCJ3aVwiLFxuICAgICAgXCJ5dVwiLFxuICAgICAgXCJldVwiLFxuICAgICAgXCJ1aVwiLFxuICAgICAgXCJpXCIsXG4gICAgXTtcbiAgICBjb25zdCBKT05HU0VPTkcgPSBbXG4gICAgICBcIlwiLFxuICAgICAgXCJrXCIsXG4gICAgICBcImtcIixcbiAgICAgIFwia1wiLFxuICAgICAgXCJuXCIsXG4gICAgICBcIm5cIixcbiAgICAgIFwiblwiLFxuICAgICAgXCJ0XCIsXG4gICAgICBcImxcIixcbiAgICAgIFwibFwiLFxuICAgICAgXCJsXCIsXG4gICAgICBcImxcIixcbiAgICAgIFwibFwiLFxuICAgICAgXCJsXCIsXG4gICAgICBcImxcIixcbiAgICAgIFwibFwiLFxuICAgICAgXCJtXCIsXG4gICAgICBcInBcIixcbiAgICAgIFwicFwiLFxuICAgICAgXCJ0XCIsXG4gICAgICBcInRcIixcbiAgICAgIFwibmdcIixcbiAgICAgIFwidFwiLFxuICAgICAgXCJ0XCIsXG4gICAgICBcImtcIixcbiAgICAgIFwidFwiLFxuICAgICAgXCJwXCIsXG4gICAgICBcInRcIixcbiAgICBdO1xuXG4gICAgY29uc3Qgcm9tYW5pemUgPSAoY2hhcjogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgICAgIGNvbnN0IGNvZGUgPSBjaGFyLmNoYXJDb2RlQXQoMCk7XG4gICAgICBpZiAoY29kZSA8IDB4YWMwMCB8fCBjb2RlID4gMHhkN2FmKSByZXR1cm4gY2hhcjtcbiAgICAgIGNvbnN0IG9mZnNldCA9IGNvZGUgLSAweGFjMDA7XG4gICAgICBjb25zdCBjaG8gPSBNYXRoLmZsb29yKG9mZnNldCAvIDU4OCk7XG4gICAgICBjb25zdCBqdW5nID0gTWF0aC5mbG9vcigob2Zmc2V0ICUgNTg4KSAvIDI4KTtcbiAgICAgIGNvbnN0IGpvbmcgPSBvZmZzZXQgJSAyODtcbiAgICAgIHJldHVybiBDSE9TRU9OR1tjaG9dICsgSlVOR1NFT05HW2p1bmddICsgSk9OR1NFT05HW2pvbmddO1xuICAgIH07XG5cbiAgICBjb25zdCBjaGFycyA9IFsuLi5uYW1lXTtcbiAgICAvLyDssqsg6riA7J6Q66W8IOyEsSjlp5Mp7Jy866GcIOqwhOyjvFxuICAgIGNvbnN0IGZhbWlseU5hbWUgPSByb21hbml6ZShjaGFyc1swXSk7XG4gICAgY29uc3QgZ2l2ZW5OYW1lID0gY2hhcnMuc2xpY2UoMSkubWFwKHJvbWFuaXplKS5qb2luKFwiXCIpO1xuXG4gICAgaWYgKGdpdmVuTmFtZSkge1xuICAgICAgcmV0dXJuIGAke2dpdmVuTmFtZX0uJHtmYW1pbHlOYW1lfWA7XG4gICAgfVxuICAgIHJldHVybiBmYW1pbHlOYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIExMTSDsupDsi5wg7Ya16rOE66W8IOuwmO2ZmO2VqeuLiOuLpC5cbiAgICovXG4gIGdldExMTUNhY2hlU3RhdHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNpemU6IHRoaXMubGxtQ2FjaGUuc2l6ZSxcbiAgICAgIGVuYWJsZWQ6IHRoaXMub3B0aW9ucy5lbmFibGVMTE1DYWNoZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIExMTSDsupDsi5zrpbwg7LSI6riw7ZmU7ZWp64uI64ukLlxuICAgKi9cbiAgY2xlYXJMTE1DYWNoZSgpIHtcbiAgICB0aGlzLmxsbUNhY2hlLmNsZWFyKCk7XG4gIH1cblxuICAvKipcbiAgICog7Luo7YWN7Iqk7Yq4IOyDneyEsVxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVDb250ZXh0KCk6IEdlbmVyYXRvckNvbnRleHQge1xuICAgIHJldHVybiB7XG4gICAgICBmaXh0dXJlczogbmV3IE1hcCgpLFxuICAgICAgcmVmZXJlbmNlQ2FjaGU6IG5ldyBNYXAoKSxcbiAgICAgIGltcG9ydGVkUmVjb3JkczogbmV3IFNldCgpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICog67Cw7LmYIOyDneyEsSDrsI8g7J6Q64+ZIOyggOyepVxuICAgKlxuICAgKiAxLiDqsIEgc3BlY+uzhOuhnCBmaXh0dXJlIOyDneyEsSAo66mU66qo66asKVxuICAgKiAyLiBGaXh0dXJlUmVjb3Jk66GcIOuzgO2ZmFxuICAgKiAzLiBGaXh0dXJlTWFuYWdlci5pbnNlcnRGaXh0dXJlcygp66GcIHRhcmdldERi7JeQIOyggOyepVxuICAgKlxuICAgKiBAcmV0dXJucyDsoIDsnqXrkJwgZml4dHVyZSDrjbDsnbTthLAgKOyLpOygnCBEQiBJRCDtj6ztlagpXG4gICAqL1xuICBhc3luYyBnZW5lcmF0ZUJhdGNoKFxuICAgIHNwZWNzOiBBcnJheTx7IGVudGl0eTogc3RyaW5nOyBjb3VudDogbnVtYmVyOyBvdmVycmlkZXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9PixcbiAgKTogUHJvbWlzZTxGaXh0dXJlSW1wb3J0UmVzdWx0W10+IHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5jcmVhdGVDb250ZXh0KCk7XG4gICAgY29uc3QgZ2VuZXJhdGVkRml4dHVyZXM6IEFycmF5PHsgZW50aXR5OiBzdHJpbmc7IGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0+ID0gW107XG5cbiAgICAvLyAxLiDqsIEgc3BlY+uzhOuhnCBmaXh0dXJlIOyDneyEsVxuICAgIGZvciAoY29uc3Qgc3BlYyBvZiBzcGVjcykge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzcGVjLmNvdW50OyBpKyspIHtcbiAgICAgICAgY29uc3QgZml4dHVyZSA9IGF3YWl0IHRoaXMuZ2VuZXJhdGUoc3BlYy5lbnRpdHksIHNwZWMub3ZlcnJpZGVzIHx8IHt9LCBjb250ZXh0KTtcbiAgICAgICAgZ2VuZXJhdGVkRml4dHVyZXMucHVzaCh7XG4gICAgICAgICAgZW50aXR5OiBzcGVjLmVudGl0eSxcbiAgICAgICAgICBkYXRhOiBmaXh0dXJlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAyLiBGaXh0dXJlUmVjb3Jk66GcIOuzgO2ZmFxuICAgIGNvbnN0IGZpeHR1cmVSZWNvcmRzOiBGaXh0dXJlUmVjb3JkW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHsgZW50aXR5OiBlbnRpdHlOYW1lLCBkYXRhIH0gb2YgZ2VuZXJhdGVkRml4dHVyZXMpIHtcbiAgICAgIGNvbnN0IGVudGl0eSA9IHRoaXMuZW50aXR5TWFuYWdlci5nZXQoZW50aXR5TmFtZSk7XG5cbiAgICAgIC8vIGludGVnZXIvYmlnSW50ZWdlciBQS+uKlCDsnoTsi5wgSUQg7IOd7ISxIChEQiDsi5ztgIDsiqTqsIAg7Iuk7KCcIElEIO2VoOuLuSlcbiAgICAgIC8vIHN0cmluZyBQS+uKlCBnZW5lcmF0ZSgp7JeQ7IScIOydtOuvuCDsg53shLHrkJwgaWQg6rCS7J2EIOq3uOuMgOuhnCDsgqzsmqlcbiAgICAgIGNvbnN0IGlkUHJvcCA9IGVudGl0eS5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IFwiaWRcIik7XG4gICAgICBjb25zdCB1c2VzU2VxdWVuY2UgPVxuICAgICAgICBpZFByb3A/LnR5cGUgPT09IFwiaW50ZWdlclwiIHx8XG4gICAgICAgIGlkUHJvcD8udHlwZSA9PT0gXCJiaWdJbnRlZ2VyXCIgfHxcbiAgICAgICAgaWRQcm9wPy5jb25lPy5maXh0dXJlU3RyYXRlZ3kgPT09IFwic2VxdWVuY2VcIjtcblxuICAgICAgY29uc3QgZGF0YUZvclJlY29yZCA9IHVzZXNTZXF1ZW5jZVxuICAgICAgICA/IHsgLi4uZGF0YSwgaWQ6IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwMDAwMDApIH1cbiAgICAgICAgOiBkYXRhO1xuXG4gICAgICBjb25zdCByZWNvcmRzID0gYXdhaXQgRml4dHVyZU1hbmFnZXIuY3JlYXRlRml4dHVyZVJlY29yZChcbiAgICAgICAgZW50aXR5LFxuICAgICAgICBkYXRhRm9yUmVjb3JkIGFzIHsgaWQ6IG51bWJlciB8IHN0cmluZzsgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGwgfSxcbiAgICAgICAgeyBzaW5nbGVSZWNvcmQ6IHRydWUgfSxcbiAgICAgICk7XG4gICAgICBmaXh0dXJlUmVjb3Jkcy5wdXNoKC4uLnJlY29yZHMpO1xuICAgIH1cblxuICAgIC8vIDMuIHRhcmdldERi7JeQIOyCveyehSAoRml4dHVyZU1hbmFnZXLqsIAg7J2Y7KG07ISxIOygleugrCDsspjrpqwpXG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IEZpeHR1cmVNYW5hZ2VyLmluc2VydEZpeHR1cmVzKHRoaXMudGFyZ2V0RGJOYW1lLCBmaXh0dXJlUmVjb3Jkcyk7XG5cbiAgICAvLyA0LiBjb21wYW5pb24gZml4dHVyZXMg7IOd7ISxIChmaXh0dXJlQ29tcGFuaW9uc+qwgCDshKDslrjrkJwg6rK97JqwKVxuICAgIGNvbnN0IGNvbXBhbmlvblJlc3VsdHMgPSBhd2FpdCB0aGlzLmdlbmVyYXRlQ29tcGFuaW9ucyhzcGVjcywgcmVzdWx0cyk7XG5cbiAgICBjb25zdCB0b3RhbCA9IHJlc3VsdHMubGVuZ3RoICsgY29tcGFuaW9uUmVzdWx0cy5sZW5ndGg7XG4gICAgIWlzVGVzdCgpICYmXG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihgR2VuZXJhdGVkIGFuZCBzYXZlZCAke3RvdGFsfSBmaXh0dXJlcyB0byAke3RoaXMudGFyZ2V0RGJOYW1lfWApKTtcbiAgICByZXR1cm4gWy4uLnJlc3VsdHMsIC4uLmNvbXBhbmlvblJlc3VsdHNdO1xuICB9XG5cbiAgLyoqXG4gICAqIOu2gOuqqCBmaXh0dXJlIOqysOqzvOulvCDquLDrsJjsnLzroZwgZml4dHVyZUNvbXBhbmlvbnPsl5Ag7ISg7Ja465CcIGNvbXBhbmlvbiBFbnRpdHnrpbwg7IOd7ISx7ZWp64uI64ukLlxuICAgKlxuICAgKiBnZW5lcmF0ZUJhdGNoKCnsl5DshJzrp4wg7Zi47Lac65CY66mwLCBjb21wYW5pb24g7IOd7ISxIOyLnCDsnqzqt4Drpbwg67Cp7KeA7ZWY6riwIOychO2VtFxuICAgKiBnZW5lcmF0ZUJhdGNoKCnrpbwg64uk7IucIO2YuOy2nO2VmOyngCDslYrqs6Ag7KeB7KCRIOyCveyehe2VqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVDb21wYW5pb25zKFxuICAgIHNwZWNzOiBBcnJheTx7IGVudGl0eTogc3RyaW5nOyBjb3VudDogbnVtYmVyOyBvdmVycmlkZXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9PixcbiAgICBwYXJlbnRSZXN1bHRzOiBGaXh0dXJlSW1wb3J0UmVzdWx0W10sXG4gICk6IFByb21pc2U8Rml4dHVyZUltcG9ydFJlc3VsdFtdPiB7XG4gICAgY29uc3QgYWxsUmVzdWx0czogRml4dHVyZUltcG9ydFJlc3VsdFtdID0gW107XG4gICAgY29uc3QgcHJvY2Vzc2VkRW50aXRpZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIGZvciAoY29uc3Qgc3BlYyBvZiBzcGVjcykge1xuICAgICAgaWYgKHByb2Nlc3NlZEVudGl0aWVzLmhhcyhzcGVjLmVudGl0eSkpIGNvbnRpbnVlO1xuICAgICAgcHJvY2Vzc2VkRW50aXRpZXMuYWRkKHNwZWMuZW50aXR5KTtcblxuICAgICAgY29uc3QgZW50aXR5ID0gdGhpcy5lbnRpdHlNYW5hZ2VyLmdldChzcGVjLmVudGl0eSk7XG4gICAgICBjb25zdCBpZFByb3AgPSBlbnRpdHkucHJvcHMuZmluZCgocCkgPT4gcC5uYW1lID09PSBcImlkXCIpO1xuICAgICAgY29uc3QgY29tcGFuaW9ucyA9IGlkUHJvcD8uY29uZT8uZml4dHVyZUNvbXBhbmlvbnM7XG4gICAgICBpZiAoIWNvbXBhbmlvbnMgfHwgY29tcGFuaW9ucy5sZW5ndGggPT09IDApIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBlbnRpdHlSZXN1bHRzID0gcGFyZW50UmVzdWx0cy5maWx0ZXIoKHIpID0+IHIuZW50aXR5SWQgPT09IHNwZWMuZW50aXR5KTtcbiAgICAgIGlmIChlbnRpdHlSZXN1bHRzLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG5cbiAgICAgIGZvciAoY29uc3QgY29tcGFuaW9uIG9mIGNvbXBhbmlvbnMpIHtcbiAgICAgICAgLy8gY29tcGFuaW9uIGVudGl0eeyXkOyEnCDrtoDrqqggZW50aXR566Gc7J2YIEJlbG9uZ3NUb09uZSBGSyDsu6zrn7zrqoUg7YyM7JWFXG4gICAgICAgIGNvbnN0IGNvbXBhbmlvbkVudGl0eSA9IHRoaXMuZW50aXR5TWFuYWdlci5nZXQoY29tcGFuaW9uLmVudGl0eSk7XG4gICAgICAgIGNvbnN0IGZrUHJvcCA9IGNvbXBhbmlvbkVudGl0eS5wcm9wcy5maW5kKFxuICAgICAgICAgIChwKSA9PiBpc1JlbGF0aW9uUHJvcChwKSAmJiBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwKSAmJiBwLndpdGggPT09IHNwZWMuZW50aXR5LFxuICAgICAgICApO1xuICAgICAgICBpZiAoIWZrUHJvcCkge1xuICAgICAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICBjaGFsay55ZWxsb3coXG4gICAgICAgICAgICAgICAgYFtDb21wYW5pb25dIE5vIEJlbG9uZ3NUb09uZSByZWxhdGlvbiBmcm9tICR7Y29tcGFuaW9uLmVudGl0eX0gdG8gJHtzcGVjLmVudGl0eX0uIFNraXBwaW5nLmAsXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZrQ29sTmFtZSA9IGAke2ZrUHJvcC5uYW1lfV9pZGA7XG5cbiAgICAgICAgLy8gY29tcGFuaW9u7J2YIGlkUHJvcCwgdXNlc1NlcXVlbmNlLCBjb3VudOuKlCBjb21wYW5pb24g64uo7JyE66GcIOqzoOyglVxuICAgICAgICBjb25zdCBjb21wYW5pb25JZFByb3AgPSBjb21wYW5pb25FbnRpdHkucHJvcHMuZmluZCgocCkgPT4gcC5uYW1lID09PSBcImlkXCIpO1xuICAgICAgICBjb25zdCB1c2VzU2VxdWVuY2UgPVxuICAgICAgICAgIGNvbXBhbmlvbklkUHJvcD8udHlwZSA9PT0gXCJpbnRlZ2VyXCIgfHxcbiAgICAgICAgICBjb21wYW5pb25JZFByb3A/LnR5cGUgPT09IFwiYmlnSW50ZWdlclwiIHx8XG4gICAgICAgICAgY29tcGFuaW9uSWRQcm9wPy5jb25lPy5maXh0dXJlU3RyYXRlZ3kgPT09IFwic2VxdWVuY2VcIjtcbiAgICAgICAgY29uc3QgY29tcGFuaW9uQ291bnQgPSBjb21wYW5pb24uY291bnQgPz8gMTtcblxuICAgICAgICAvLyDqsIEgcGFyZW50IHJlc3VsdOyXkCDrjIDtlbQgY29tcGFuaW9uIGZpeHR1cmUg7IOd7ISxXG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmNyZWF0ZUNvbnRleHQoKTtcbiAgICAgICAgY29uc3QgY29tcGFuaW9uRml4dHVyZVJlY29yZHM6IEZpeHR1cmVSZWNvcmRbXSA9IFtdO1xuXG4gICAgICAgIGZvciAoY29uc3QgcGFyZW50UmVzdWx0IG9mIGVudGl0eVJlc3VsdHMpIHtcbiAgICAgICAgICBjb25zdCByZXNvbHZlZE92ZXJyaWRlcyA9IHRoaXMucmVzb2x2ZVRlbXBsYXRlT3ZlcnJpZGVzKFxuICAgICAgICAgICAgY29tcGFuaW9uLm92ZXJyaWRlcyA/PyB7fSxcbiAgICAgICAgICAgIHBhcmVudFJlc3VsdC5kYXRhLFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmVzb2x2ZWRPdmVycmlkZXNbZmtDb2xOYW1lXSA9IHBhcmVudFJlc3VsdC5kYXRhLmlkO1xuXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb21wYW5pb25Db3VudDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBmaXh0dXJlID0gYXdhaXQgdGhpcy5nZW5lcmF0ZShjb21wYW5pb24uZW50aXR5LCByZXNvbHZlZE92ZXJyaWRlcywgY29udGV4dCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGRhdGFGb3JSZWNvcmQgPSB1c2VzU2VxdWVuY2VcbiAgICAgICAgICAgICAgPyB7IC4uLmZpeHR1cmUsIGlkOiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDAwMDAwKSB9XG4gICAgICAgICAgICAgIDogZml4dHVyZTtcblxuICAgICAgICAgICAgY29uc3QgcmVjb3JkcyA9IGF3YWl0IEZpeHR1cmVNYW5hZ2VyLmNyZWF0ZUZpeHR1cmVSZWNvcmQoXG4gICAgICAgICAgICAgIGNvbXBhbmlvbkVudGl0eSxcbiAgICAgICAgICAgICAgZGF0YUZvclJlY29yZCBhcyB7XG4gICAgICAgICAgICAgICAgaWQ6IG51bWJlciB8IHN0cmluZztcbiAgICAgICAgICAgICAgICBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgbnVsbDtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgeyBzaW5nbGVSZWNvcmQ6IHRydWUgfSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb21wYW5pb25GaXh0dXJlUmVjb3Jkcy5wdXNoKC4uLnJlY29yZHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbXBhbmlvblJlc3VsdHMgPSBhd2FpdCBGaXh0dXJlTWFuYWdlci5pbnNlcnRGaXh0dXJlcyhcbiAgICAgICAgICB0aGlzLnRhcmdldERiTmFtZSxcbiAgICAgICAgICBjb21wYW5pb25GaXh0dXJlUmVjb3JkcyxcbiAgICAgICAgKTtcbiAgICAgICAgYWxsUmVzdWx0cy5wdXNoKC4uLmNvbXBhbmlvblJlc3VsdHMpO1xuXG4gICAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgY2hhbGsuZ3JlZW4oXG4gICAgICAgICAgICAgIGBbQ29tcGFuaW9uXSBHZW5lcmF0ZWQgJHtjb21wYW5pb25SZXN1bHRzLmxlbmd0aH0gJHtjb21wYW5pb24uZW50aXR5fSBmaXh0dXJlc2AsXG4gICAgICAgICAgICApLFxuICAgICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGFsbFJlc3VsdHM7XG4gIH1cblxuICAvKipcbiAgICogb3ZlcnJpZGVzIOqwkuydmCBcInt7ZmllbGROYW1lfX1cIiDthZztlIzrpr/snYQg67aA66qoIGZpeHR1cmUg642w7J207YSw66GcIOy5mO2ZmO2VqeuLiOuLpC5cbiAgICpcbiAgICog7JiIOiB7IFwiYWNjb3VudF9pZFwiOiBcInt7ZW1haWx9fVwiIH0g4oaSIHsgXCJhY2NvdW50X2lkXCI6IFwidXNlckBleGFtcGxlLmNvbVwiIH1cbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZVRlbXBsYXRlT3ZlcnJpZGVzKFxuICAgIG92ZXJyaWRlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgcGFyZW50RGF0YTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgRGF0ZSB8IG51bGwgfSxcbiAgKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIGNvbnN0IHJlc29sdmVkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG92ZXJyaWRlcykpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgdmFsdWUuc3RhcnRzV2l0aChcInt7XCIpICYmIHZhbHVlLmVuZHNXaXRoKFwifX1cIikpIHtcbiAgICAgICAgY29uc3QgZmllbGROYW1lID0gdmFsdWUuc2xpY2UoMiwgLTIpLnRyaW0oKTtcbiAgICAgICAgaWYgKCEoZmllbGROYW1lIGluIHBhcmVudERhdGEpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYO2FnO2UjOumvyDtlYTrk5wgXCIke2ZpZWxkTmFtZX1cIuydtCjqsIApIOu2gOuqqCBmaXh0dXJlIOuNsOydtO2EsOyXkCDsobTsnqztlZjsp4Ag7JWK7Iq164uI64ukIChvdmVycmlkZSBrZXk6IFwiJHtrZXl9XCIpYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmVkW2tleV0gPSBwYXJlbnREYXRhW2ZpZWxkTmFtZV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNvbHZlZFtrZXldID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXNvbHZlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiDsi6TsoJwgREIoc291cmNlRGIp7JeQ7IScIOuNsOydtO2EsOulvCDsobDtmoztlZjsl6wgZml4dHVyZSBEQih0YXJnZXREYinsl5AgaW1wb3J07ZWp64uI64ukLlxuICAgKlxuICAgKiAxLiBEYXRhRXhwbG9yZXLroZwgc291cmNlRGLsl5DshJwg642w7J207YSwIOyhsO2ajCAo6rSA66CoIOuNsOydtO2EsCDtj6ztlagpXG4gICAqIDIuIEZpeHR1cmVSZWNvcmTroZwg67OA7ZmYXG4gICAqIDMuIHRhcmdldERi7JeQIOyCveyehVxuICAgKlxuICAgKiBAcGFyYW0gZW50aXR5TmFtZSAtIOyhsO2ajO2VoCBlbnRpdHkg7J2066aEXG4gICAqIEBwYXJhbSBvcHRpb25zIC0g7KGw7ZqMIOyYteyFmCAoc3RyYXRlZ3ksIGxpbWl0LCBpbmNsdWRlUmVsYXRpb25zIOuTsSlcbiAgICogQHJldHVybnMg7KCA7J6l65CcIGZpeHR1cmUg642w7J207YSwICjsi6TsoJwgREIgSUQg7Y+s7ZWoKVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyDtlITroZzrjZXshZggRELsl5DshJwgVXNlciAxMOuqhSArIOq0gOugqCBFbXBsb3llZSwgRGVwYXJ0bWVudCDqsIDsoLjsmKTquLBcbiAgICogYXdhaXQgZ2VuZXJhdG9yLmltcG9ydEZyb21Tb3VyY2UoXCJVc2VyXCIsIHtcbiAgICogICBzdHJhdGVneTogXCJzYW1wbGVcIixcbiAgICogICBsaW1pdDogMTAsXG4gICAqICAgaW5jbHVkZVJlbGF0aW9uczogdHJ1ZSxcbiAgICogICBtYXhEZXB0aDogMlxuICAgKiB9KTtcbiAgICovXG4gIGFzeW5jIGltcG9ydEZyb21Tb3VyY2UoXG4gICAgZW50aXR5TmFtZTogc3RyaW5nLFxuICAgIG9wdGlvbnM6IEV4cGxvcmVXaXRoUmVsYXRpb25zT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxGaXh0dXJlSW1wb3J0UmVzdWx0W10+IHtcbiAgICAhaXNUZXN0KCkgJiZcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBjaGFsay5ibHVlKFxuICAgICAgICAgIGBJbXBvcnRpbmcgJHtlbnRpdHlOYW1lfSBmcm9tIHNvdXJjZSBEQiB3aXRoIG9wdGlvbnM6ICR7SlNPTi5zdHJpbmdpZnkoeyBzdHJhdGVneTogb3B0aW9ucy5zdHJhdGVneSwgbGltaXQ6IG9wdGlvbnMubGltaXQsIGluY2x1ZGVSZWxhdGlvbnM6IG9wdGlvbnMuaW5jbHVkZVJlbGF0aW9ucywgbWF4RGVwdGg6IG9wdGlvbnMubWF4RGVwdGggfSl9YCxcbiAgICAgICAgKSxcbiAgICAgICk7XG5cbiAgICAvLyAxLiBEYXRhRXhwbG9yZXLroZwgc291cmNlRGLsl5DshJwg642w7J207YSwIOyhsO2ajCAo6rSA66CoIOuNsOydtO2EsCDtj6ztlagpXG4gICAgY29uc3QgZXhwbG9yZVJlc3VsdCA9IGF3YWl0IHRoaXMuZGF0YUV4cGxvcmVyLmV4cGxvcmVXaXRoUmVsYXRpb25zKGVudGl0eU5hbWUsIG9wdGlvbnMpO1xuXG4gICAgIWlzVGVzdCgpICYmXG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgY2hhbGsuY3lhbihcbiAgICAgICAgICBgRm91bmQgJHtleHBsb3JlUmVzdWx0Lm1haW4ucmVjb3Jkcy5sZW5ndGh9ICR7ZW50aXR5TmFtZX0gcmVjb3JkcyBhbmQgJHtleHBsb3JlUmVzdWx0LnJlbGF0ZWQuc2l6ZX0gcmVsYXRlZCBlbnRpdGllc2AsXG4gICAgICAgICksXG4gICAgICApO1xuXG4gICAgLy8gMi4gRml4dHVyZVJlY29yZOuhnCDrs4DtmZhcbiAgICBjb25zdCBmaXh0dXJlUmVjb3JkczogRml4dHVyZVJlY29yZFtdID0gW107XG5cbiAgICAvLyDrqZTsnbggZW50aXR57J2YIHJlY29yZHPrpbwgRml4dHVyZVJlY29yZOuhnCDrs4DtmZhcbiAgICBjb25zdCBtYWluRW50aXR5ID0gdGhpcy5lbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlOYW1lKTtcbiAgICBmb3IgKGNvbnN0IHJlY29yZCBvZiBleHBsb3JlUmVzdWx0Lm1haW4ucmVjb3Jkcykge1xuICAgICAgY29uc3QgcmVjb3JkcyA9IGF3YWl0IEZpeHR1cmVNYW5hZ2VyLmNyZWF0ZUZpeHR1cmVSZWNvcmQoXG4gICAgICAgIG1haW5FbnRpdHksXG4gICAgICAgIHJlY29yZCBhcyB7IGlkOiBudW1iZXIgfCBzdHJpbmc7IFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsIH0sXG4gICAgICAgIHsgX2RiOiB0aGlzLnNvdXJjZURiLCBzaW5nbGVSZWNvcmQ6IHRydWUgfSxcbiAgICAgICk7XG4gICAgICBmaXh0dXJlUmVjb3Jkcy5wdXNoKC4uLnJlY29yZHMpO1xuICAgIH1cblxuICAgIC8vIOq0gOugqCBlbnRpdHnsnZggcmVjb3Jkc+ulvCBGaXh0dXJlUmVjb3Jk66GcIOuzgO2ZmFxuICAgIGZvciAoY29uc3QgW3JlbGF0ZWRFbnRpdHlOYW1lLCByZWxhdGVkUmVjb3Jkc10gb2YgZXhwbG9yZVJlc3VsdC5yZWxhdGVkLmVudHJpZXMoKSkge1xuICAgICAgY29uc3QgcmVsYXRlZEVudGl0eSA9IHRoaXMuZW50aXR5TWFuYWdlci5nZXQocmVsYXRlZEVudGl0eU5hbWUpO1xuICAgICAgZm9yIChjb25zdCByZWNvcmQgb2YgcmVsYXRlZFJlY29yZHMpIHtcbiAgICAgICAgY29uc3QgcmVjb3JkcyA9IGF3YWl0IEZpeHR1cmVNYW5hZ2VyLmNyZWF0ZUZpeHR1cmVSZWNvcmQoXG4gICAgICAgICAgcmVsYXRlZEVudGl0eSxcbiAgICAgICAgICByZWNvcmQgYXMgeyBpZDogbnVtYmVyIHwgc3RyaW5nOyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgbnVsbCB9LFxuICAgICAgICAgIHsgX2RiOiB0aGlzLnNvdXJjZURiLCBzaW5nbGVSZWNvcmQ6IHRydWUgfSxcbiAgICAgICAgKTtcbiAgICAgICAgZml4dHVyZVJlY29yZHMucHVzaCguLi5yZWNvcmRzKTtcbiAgICAgIH1cblxuICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoYCAgLSAke3JlbGF0ZWRFbnRpdHlOYW1lfTogJHtyZWxhdGVkUmVjb3Jkcy5sZW5ndGh9IHJlY29yZHNgKSk7XG4gICAgfVxuXG4gICAgLy8gMy4gdGFyZ2V0RGLsl5Ag7IK97J6FIChGaXh0dXJlTWFuYWdlcuqwgCDsnZjsobTshLEg7KCV66CsIOyymOumrClcbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgRml4dHVyZU1hbmFnZXIuaW5zZXJ0Rml4dHVyZXModGhpcy50YXJnZXREYk5hbWUsIGZpeHR1cmVSZWNvcmRzKTtcblxuICAgICFpc1Rlc3QoKSAmJlxuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGNoYWxrLmdyZWVuKFxuICAgICAgICAgIGBTdWNjZXNzZnVsbHkgaW1wb3J0ZWQgJHtyZXN1bHRzLmxlbmd0aH0gcmVjb3JkcyB0byAke3RoaXMudGFyZ2V0RGJOYW1lfSAoJHtleHBsb3JlUmVzdWx0Lm1haW4ucmVjb3Jkcy5sZW5ndGh9ICR7ZW50aXR5TmFtZX0gKyAke3Jlc3VsdHMubGVuZ3RoIC0gZXhwbG9yZVJlc3VsdC5tYWluLnJlY29yZHMubGVuZ3RofSByZWxhdGVkKWAsXG4gICAgICAgICksXG4gICAgICApO1xuXG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJjaGFsayIsImlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wIiwiaXNPbmVUb09uZVJlbGF0aW9uUHJvcCIsImlzUmVsYXRpb25Qcm9wIiwiaXNUZXN0IiwiRGF0YUV4cGxvcmVyIiwiZmFrZXJNYXBwaW5ncyIsIkZpeHR1cmVNYW5hZ2VyIiwiRml4dHVyZUdlbmVyYXRvciIsImRhdGFFeHBsb3JlciIsImxvY2FsZSIsIm1hcHBpbmdzIiwibGxtQ2FjaGUiLCJNYXAiLCJlbnRpdHlDYWNoZSIsIm9wdGlvbnMiLCJzb3VyY2VEYiIsIl90YXJnZXREYiIsInRhcmdldERiTmFtZSIsImVudGl0eU1hbmFnZXIiLCJ1c2VMTE0iLCJlbmFibGVMTE1DYWNoZSIsImxsbU1vZGVsIiwiZ2VuZXJhdGUiLCJlbnRpdHlOYW1lIiwib3ZlcnJpZGVzIiwiY29udGV4dCIsImNyZWF0ZUNvbnRleHQiLCJlbnRpdHkiLCJnZXQiLCJzZXQiLCJ0ZW1wSWQiLCJEYXRlIiwibm93Iiwicm93S2V5IiwidW5kZWZpbmVkIiwiZml4dHVyZSIsInByb3AiLCJwcm9wcyIsInZpcnR1YWwiLCJuYW1lIiwiY29uZSIsImZpeHR1cmVTdHJhdGVneSIsInR5cGUiLCJmYWtlciIsIl9mYWtlciIsInN0cmluZyIsImFscGhhbnVtZXJpYyIsInV1aWQiLCJma0NvbE5hbWUiLCJoYXNKb2luQ29sdW1uIiwicmVsYXRpb25WYWx1ZSIsImdlbmVyYXRlUmVsYXRpb25WYWx1ZSIsIm5vdGUiLCJnZW5lcmF0ZVdpdGhMTE0iLCJlcnJvciIsImNvbnNvbGUiLCJ3YXJuIiwiaWQiLCJFcnJvciIsIm1lc3NhZ2UiLCJmaXh0dXJlR2VuZXJhdG9yIiwiZXhlY3V0ZUdlbmVyYXRvciIsImZpeHR1cmVEZWZhdWx0IiwiZ2VuZXJhdGVEZWZhdWx0VmFsdWUiLCJlbWFpbCIsIm5hbWVWYWx1ZSIsInVzZXJuYW1lIiwiZnVsbF9uYW1lIiwibmFtZV9lbiIsImRvbWFpbiIsInNwbGl0Iiwicm9tYW5pemVkIiwicm9tYW5pemVOYW1lIiwicGFzc3dvcmQiLCJiY3J5cHQiLCJoYXNoIiwiZml4dHVyZXMiLCJkYXRhU291cmNlIiwiY2FjaGVLZXkiLCJ3aXRoIiwiSlNPTiIsInN0cmluZ2lmeSIsInJlZmVyZW5jZUNhY2hlIiwiaGFzIiwiZXhwbG9yZVJlc3VsdCIsImV4cGxvcmVXaXRoUmVsYXRpb25zIiwic3RyYXRlZ3kiLCJsaW1pdCIsImNvbmZpZyIsImluY2x1ZGVSZWxhdGlvbnMiLCJtYXhEZXB0aCIsIm1haW4iLCJyZWNvcmRzIiwiaW1wb3J0RXhwbG9yZVJlc3VsdCIsImNhbmRpZGF0ZXMiLCJsZW5ndGgiLCJzZWxlY3RlZCIsIk1hdGgiLCJmbG9vciIsInJhbmRvbSIsImF1dG9LZXkiLCJhdXRvRXhwbG9yZVJlc3VsdCIsImF1dG9DYW5kaWRhdGVzIiwibnVsbGFibGUiLCJhbGxGaXh0dXJlUmVjb3JkcyIsImVudGl0eUlkIiwicmVsYXRlZCIsImVudHJpZXMiLCJyZWNvcmRzVG9JbXBvcnQiLCJsb2ciLCJjeWFuIiwicmVjb3JkIiwicmVjb3JkS2V5IiwiaW1wb3J0ZWRSZWNvcmRzIiwicHVzaCIsImFkZCIsImdyYXkiLCJzbGljZSIsImZpeHR1cmVSZWNvcmRzIiwiY3JlYXRlRml4dHVyZVJlY29yZCIsIl9kYiIsInNpbmdsZVJlY29yZCIsIm1haW5FbnRpdHkiLCJtYWluUmVjb3Jkc1RvSW1wb3J0IiwiaW5zZXJ0Rml4dHVyZXMiLCJncmVlbiIsInNpemUiLCJnZW5lcmF0b3IiLCJzdGFydHNXaXRoIiwiaXNOYW1lRmllbGQiLCJmYWtlck1vZHVsZSIsImZha2VyS08iLCJleHByIiwibWF0Y2giLCJwYXRoIiwiYXJnc1N0ciIsInBhcnRzIiwiZm4iLCJwYXJ0IiwiYXJncyIsInRyaW0iLCJwYXJzZUdlbmVyYXRvckFyZ3MiLCJ5ZWxsb3ciLCJmYWtlckpBIiwibG9jYWxlRmFrZXIiLCJkZXBhcnRtZW50cyIsInByZWZpeGVzIiwic3VmZml4ZXMiLCJkZXB0IiwiaGVscGVycyIsImFycmF5RWxlbWVudCIsInByZWZpeCIsInN1ZmZpeCIsImxvY2FsZU1hcHBpbmdzIiwiZW4iLCJub3JtYWxpemVkTmFtZSIsInRvTG93ZXJDYXNlIiwicmVwbGFjZSIsInBhdHRlcm4iLCJPYmplY3QiLCJmaWVsZF9wYXR0ZXJucyIsImluY2x1ZGVzIiwiZXhlY3V0ZUZha2VyRXhwcmVzc2lvbiIsImVuZHNXaXRoIiwiZ2VuZXJhdGVBcnJheVZhbHVlIiwiZW51bVZhbHVlcyIsIkFycmF5IiwiaXNBcnJheSIsImVudW0iLCJlbnVtTGFiZWxzIiwia2V5cyIsInR5cGVEZWZhdWx0IiwidHlwZV9kZWZhdWx0cyIsImxvcmVtIiwid29yZHMiLCJudW1iZXIiLCJpbnQiLCJtaW4iLCJtYXgiLCJiaWdJbnQiLCJmbG9hdCIsImRhdGF0eXBlIiwiYm9vbGVhbiIsImRhdGUiLCJwYXN0IiwiX2VudGl0eSIsIl9sb2NhbGVGYWtlciIsImNvdW50IiwiZnJvbSIsInVybCIsImltYWdlIiwic3lzdGVtIiwiZmlsZU5hbWUiLCJtaW1lX3R5cGUiLCJpbnRlcm5ldCIsIndvcmQiLCJleHByZXNzaW9uIiwicGFyc2UiLCJmYWtlck5hbWUiLCJzZWxlY3RlZEZha2VyIiwiZnVuY01hdGNoIiwiZml4dHVyZUhpbnQiLCJyb3dDYWNoZUtleSIsImxsbVByb3BzIiwiZmlsdGVyIiwicCIsImdlbmVyYXRlU2luZ2xlV2l0aExMTSIsImFwaUtleSIsImdldEFwaUtleSIsImNyZWF0ZUFudGhyb3BpYyIsImdlbmVyYXRlVGV4dCIsInJvd1Jlc3BvbnNlIiwibW9kZWwiLCJwcm9tcHQiLCJidWlsZFJvd0xMTVByb21wdCIsInRleHQiLCJyb3dSZXN1bHQiLCJwYXJzZVJvd0xMTVJlc3BvbnNlIiwiZmllbGROYW1lIiwidmFsdWUiLCJzaW5nbGVSZXNwb25zZSIsImJ1aWxkTExNUHJvbXB0IiwicGFyc2VMTE1SZXNwb25zZSIsImxhbmd1YWdlIiwiZmllbGREZXNjcmlwdGlvbnMiLCJtYXAiLCJkZXNjIiwidmFsdWVzIiwiam9pbiIsIm90aGVyUHJvcHMiLCJvdGhlclByb3BzQ29udGV4dCIsIm91dHB1dFNoYXBlIiwiZW50aXR5Q29udGV4dCIsImpzb25UZXh0IiwicGFyc2VkIiwicmF3IiwicmVzdWx0IiwiU3RyaW5nIiwiaGludCIsIm90aGVyRmllbGRzIiwib3RoZXJGaWVsZHNDb250ZXh0IiwiZ2V0RXhwZWN0ZWRGb3JtYXQiLCJnZXRFeGFtcGxlRm9yVHlwZSIsInByb3BUeXBlIiwiY2xlYW5lZCIsImJhc2VUeXBlIiwiaXRlbSIsImdldERlZmF1bHRWYWx1ZUZvclR5cGUiLCJwYXJzZVNjYWxhclZhbHVlIiwibnVtIiwicGFyc2VJbnQiLCJOdW1iZXIiLCJpc05hTiIsIkJpZ0ludCIsInBhcnNlRmxvYXQiLCJnZXRUaW1lIiwicHJvcE5hbWUiLCJqc29uU3RyIiwiY29udmVydEpzTGl0ZXJhbFRvSnNvbiIsInRyaW1tZWQiLCJpbnB1dCIsIndpdGhEb3VibGVRdW90ZXMiLCJfIiwiY29udGVudCIsIlNvbmFtdSIsInJlcXVpcmUiLCJzZWNyZXQiLCJhbnRocm9waWNfYXBpX2tleSIsInByb2Nlc3MiLCJlbnYiLCJBTlRIUk9QSUNfQVBJX0tFWSIsImJhc2VGb3JtYXQiLCJnZXRTY2FsYXJGb3JtYXQiLCJiYXNlRXhhbXBsZSIsImdldFNjYWxhckV4YW1wbGUiLCJpc0tvcmVhbiIsInRlc3QiLCJyb21hbml6ZUtvcmVhbk5hbWUiLCJDSE9TRU9ORyIsIkpVTkdTRU9ORyIsIkpPTkdTRU9ORyIsInJvbWFuaXplIiwiY2hhciIsImNvZGUiLCJjaGFyQ29kZUF0Iiwib2Zmc2V0IiwiY2hvIiwianVuZyIsImpvbmciLCJjaGFycyIsImZhbWlseU5hbWUiLCJnaXZlbk5hbWUiLCJnZXRMTE1DYWNoZVN0YXRzIiwiZW5hYmxlZCIsImNsZWFyTExNQ2FjaGUiLCJjbGVhciIsIlNldCIsImdlbmVyYXRlQmF0Y2giLCJzcGVjcyIsImdlbmVyYXRlZEZpeHR1cmVzIiwic3BlYyIsImkiLCJkYXRhIiwiaWRQcm9wIiwiZmluZCIsInVzZXNTZXF1ZW5jZSIsImRhdGFGb3JSZWNvcmQiLCJyZXN1bHRzIiwiY29tcGFuaW9uUmVzdWx0cyIsImdlbmVyYXRlQ29tcGFuaW9ucyIsInRvdGFsIiwicGFyZW50UmVzdWx0cyIsImFsbFJlc3VsdHMiLCJwcm9jZXNzZWRFbnRpdGllcyIsImNvbXBhbmlvbnMiLCJmaXh0dXJlQ29tcGFuaW9ucyIsImVudGl0eVJlc3VsdHMiLCJyIiwiY29tcGFuaW9uIiwiY29tcGFuaW9uRW50aXR5IiwiZmtQcm9wIiwiY29tcGFuaW9uSWRQcm9wIiwiY29tcGFuaW9uQ291bnQiLCJjb21wYW5pb25GaXh0dXJlUmVjb3JkcyIsInBhcmVudFJlc3VsdCIsInJlc29sdmVkT3ZlcnJpZGVzIiwicmVzb2x2ZVRlbXBsYXRlT3ZlcnJpZGVzIiwicGFyZW50RGF0YSIsInJlc29sdmVkIiwia2V5IiwiaW1wb3J0RnJvbVNvdXJjZSIsImJsdWUiLCJyZWxhdGVkRW50aXR5TmFtZSIsInJlbGF0ZWRSZWNvcmRzIiwicmVsYXRlZEVudGl0eSJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsV0FBVyxRQUFRO0FBSzFCLFNBQVNDLDBCQUEwQixFQUFFQyxzQkFBc0IsRUFBRUMsY0FBYyxRQUFRLG9CQUFpQjtBQUNwRyxTQUFTQyxNQUFNLFFBQVEseUJBQXNCO0FBQzdDLFNBQ0VDLFlBQVksUUFHUCxxQkFBa0I7QUFDekIsU0FBNkJDLGFBQWEsUUFBUSxzQkFBbUI7QUFDckUsU0FBU0MsY0FBYyxRQUFRLHVCQUFvQjtBQXNCbkQsT0FBTyxNQUFNQzs7OztJQUNIQyxhQUEyQjtJQUMzQkMsT0FBZTtJQUNmQyxTQUF3QjtJQUN4QkMsV0FBaUMsSUFBSUMsTUFBTTtJQUMzQ0MsY0FBbUMsSUFBSUQsTUFBTTtJQUM3Q0UsUUFBaUM7SUFFekMsWUFDRSxBQUFRQyxRQUFjLEVBQ3RCLGlFQUFpRTtJQUNqRSxnQ0FBZ0M7SUFDaENDLFNBQWUsRUFDZixBQUFRQyxZQUFzRCxFQUM5RCxBQUFRQyxhQUFtQyxFQUMzQ0osT0FBaUMsQ0FD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