@dollhousemcp/mcp-server 2.0.12-rc.9 → 2.0.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +66 -0
- package/README.md +4 -4
- package/README.md.backup +5 -5
- package/README.npm.md +4 -4
- package/dist/di/Container.d.ts +14 -0
- package/dist/di/Container.d.ts.map +1 -1
- package/dist/di/Container.js +43 -26
- package/dist/elements/agents/AgentManager.d.ts +11 -4
- package/dist/elements/agents/AgentManager.d.ts.map +1 -1
- package/dist/elements/agents/AgentManager.js +38 -11
- package/dist/elements/base/BaseElementManager.d.ts +10 -0
- package/dist/elements/base/BaseElementManager.d.ts.map +1 -1
- package/dist/elements/base/BaseElementManager.js +26 -1
- package/dist/elements/ensembles/EnsembleManager.d.ts +1 -0
- package/dist/elements/ensembles/EnsembleManager.d.ts.map +1 -1
- package/dist/elements/ensembles/EnsembleManager.js +13 -2
- package/dist/elements/templates/Template.d.ts +33 -1
- package/dist/elements/templates/Template.d.ts.map +1 -1
- package/dist/elements/templates/Template.js +74 -15
- package/dist/elements/templates/TemplateManager.d.ts.map +1 -1
- package/dist/elements/templates/TemplateManager.js +8 -1
- package/dist/generated/version.d.ts +2 -2
- package/dist/generated/version.d.ts.map +1 -1
- package/dist/generated/version.js +3 -3
- package/dist/handlers/element-crud/createElement.js +2 -2
- package/dist/handlers/mcp-aql/SchemaDispatcher.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/SchemaDispatcher.js +8 -1
- package/dist/handlers/strategies/EnsembleActivationStrategy.d.ts +3 -0
- package/dist/handlers/strategies/EnsembleActivationStrategy.d.ts.map +1 -1
- package/dist/handlers/strategies/EnsembleActivationStrategy.js +48 -9
- package/dist/index.js +19 -13
- package/dist/portfolio/DefaultElementProvider.d.ts +8 -0
- package/dist/portfolio/DefaultElementProvider.d.ts.map +1 -1
- package/dist/portfolio/DefaultElementProvider.js +43 -1
- package/dist/security/contentValidator.d.ts +15 -0
- package/dist/security/contentValidator.d.ts.map +1 -1
- package/dist/security/contentValidator.js +40 -2
- package/dist/utils/TemplateRenderer.d.ts +9 -0
- package/dist/utils/TemplateRenderer.d.ts.map +1 -1
- package/dist/utils/TemplateRenderer.js +21 -1
- package/dist/web/console/IngestRoutes.d.ts.map +1 -1
- package/dist/web/console/IngestRoutes.js +193 -59
- package/dist/web/console/SessionNames.d.ts +18 -5
- package/dist/web/console/SessionNames.d.ts.map +1 -1
- package/dist/web/console/SessionNames.js +63 -8
- package/dist/web/console/StaleProcessRecovery.d.ts.map +1 -1
- package/dist/web/console/StaleProcessRecovery.js +5 -4
- package/dist/web/console/UnifiedConsole.js +3 -3
- package/dist/web/console/consoleToken.js +3 -3
- package/dist/web/portDiscovery.d.ts +1 -1
- package/dist/web/portDiscovery.d.ts.map +1 -1
- package/dist/web/portDiscovery.js +2 -2
- package/dist/web/public/app.js +65 -11
- package/dist/web/public/index.html +2 -0
- package/dist/web/public/logs.js +24 -2
- package/dist/web/public/metrics.js +22 -4
- package/dist/web/public/sessions.js +55 -8
- package/dist/web/public/setup.js +11 -2
- package/dist/web/public/styles.css +12 -0
- package/dist/web/routes/permissionRoutes.js +2 -2
- package/dist/web/routes/setupRoutes.d.ts +67 -1
- package/dist/web/routes/setupRoutes.d.ts.map +1 -1
- package/dist/web/routes/setupRoutes.js +298 -6
- package/dist/web/routes.d.ts.map +1 -1
- package/dist/web/routes.js +4 -2
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +14 -5
- package/package.json +5 -3
- package/server.json +2 -2
|
@@ -316,6 +316,16 @@ export declare abstract class BaseElementManager<T extends IElement> implements
|
|
|
316
316
|
* @param filePath - File path (relative or absolute)
|
|
317
317
|
*/
|
|
318
318
|
protected cacheElement(element: T, filePath: string): void;
|
|
319
|
+
/**
|
|
320
|
+
* Force a fresh disk scan and evict any modified/removed entries from the
|
|
321
|
+
* in-memory LRU cache. Call before findByName() when freshness is critical
|
|
322
|
+
* (e.g. on ensemble activation) to pick up external file changes that
|
|
323
|
+
* occurred since the last scan, even if the scan cooldown is still active.
|
|
324
|
+
*
|
|
325
|
+
* Unlike list(), this does not load all elements — it only evicts stale ones.
|
|
326
|
+
* Fixes #1895 (ensemble activation serving stale cached element list).
|
|
327
|
+
*/
|
|
328
|
+
protected scanAndEvict(): Promise<void>;
|
|
319
329
|
/**
|
|
320
330
|
* Removes an element from both caches by file path
|
|
321
331
|
* This is the preferred method for deletion to avoid stale cache entries
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseElementManager.d.ts","sourceRoot":"","sources":["../../../src/elements/base/BaseElementManager.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"BaseElementManager.d.ts","sourceRoot":"","sources":["../../../src/elements/base/BaseElementManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAC;AAC1E,OAAO,EAAE,QAAQ,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AACrF,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAEvE,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAMpE,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAInD,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,wCAAwC,CAAC;AAErG,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,yCAAyC,CAAC;AAChF,OAAO,EAAE,kBAAkB,EAAE,MAAM,iDAAiD,CAAC;AACrF,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,+CAA+C,CAAC;AAEtF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAMhE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAC1E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAKrE,MAAM,WAAW,yBAAyB;IACxC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,eAAe,CAAC,EAAE,sBAAsB,CAAC;IACzC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,0BAA0B,CAAC,EAAE,OAAO,CAAC;IACrC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,YAAY,CAAC,EAAE,iBAAiB,CAAC;IACjC,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,uDAAuD;IACvD,QAAQ,EAAE,MAAM,CAAC;IACjB,sDAAsD;IACtD,MAAM,EAAE,MAAM,CAAC;IACf,iDAAiD;IACjD,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,8BAAsB,kBAAkB,CAAC,CAAC,SAAS,QAAQ,CAAE,YAAW,eAAe,CAAC,CAAC,CAAC;IACxF,SAAS,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;IAC7C,SAAS,CAAC,eAAe,EAAE,eAAe,CAAC;IAC3C,SAAS,CAAC,cAAc,EAAE,qBAAqB,CAAC;IAChD,SAAS,CAAC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IAC9C,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC;IAE7B;;;OAGG;IACH,SAAS,CAAC,SAAS,EAAE,gBAAgB,CAAC;IAGtC,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;IAGhC,OAAO,CAAC,YAAY,CAAmB;IACvC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAA6B;IAChE,OAAO,CAAC,sBAAsB,CAAK;IACnC,OAAO,CAAC,cAAc,CAAC,CAAa;IACpC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAyB;IACzD,OAAO,CAAC,QAAQ,CAAC,0BAA0B,CAAU;IACrD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAoB;IAClD,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,aAAa,CAAC;IAEjD;0FACsF;IACtF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,uBAAuB,CAM7C;IAEF,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,aAAa,CAAC;IAE/C;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA2C;IAE3E;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAqB;IAEzD;;;;;;;OAOG;IACH,SAAS,CAAC,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAI1D,SAAS,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IACjE,SAAS,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAClE,SAAS,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IACjE,SAAS,CAAC,gBAAgB,CAAC,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IACvE,SAAS,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAEhF;;;OAGG;cACa,sBAAsB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK3E;;;;OAIG;cACa,wBAAwB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAMhF;;;;;;;;;;;;OAYG;IACH,SAAS,KAAK,UAAU,IAAI,sBAAsB,CAEjD;IAGD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,sBAAsB,CAAQ;IACtD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAQ;IAEnD;;;;;;;;OAQG;gBAED,WAAW,EAAE,WAAW,EACxB,gBAAgB,EAAE,gBAAgB,EAClC,eAAe,EAAE,eAAe,EAChC,OAAO,EAAE,yBAAyB,YAAK,EACvC,qBAAqB,EAAE,qBAAqB,EAC5C,kBAAkB,EAAE,kBAAkB;IAqExC;;;;OAIG;IACH,SAAS,CAAC,kBAAkB,CAAC,qBAAqB,EAAE,qBAAqB,GAAG,aAAa;IAQzF;;;;OAIG;IACH,SAAS,CAAC,QAAQ,CAAC,eAAe,IAAI,MAAM;IAE5C;;OAEG;IACH,SAAS,CAAC,0BAA0B,IAAI,MAAM;IAK9C;;;;;;;;OAQG;IACG,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IAkFxC;;;;;;;OAOG;IACH,OAAO,CAAC,uBAAuB;IAuC/B;;;OAGG;IACH,kBAAkB,IAAI,oBAAoB,EAAE;IAI5C;;;OAGG;IACH,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,oBAAoB,GAAG,SAAS;IAYjE;;;;;;;;OAQG;IACG,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgEvD;;;;;OAKG;IACH,OAAO,CAAC,yBAAyB;IA+CjC;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC;IAqD1B;;;OAGG;IACG,aAAa,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAKnD;;OAEG;IACG,IAAI,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,OAAO,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAKtE;;OAEG;IACG,QAAQ,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,OAAO,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IAKhE;;;;;;;;;;;;;;;;OAgBG;IACG,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAyC5D;;;OAGG;YACW,WAAW;IA0BzB;;;OAGG;YACW,aAAa;IAiC3B;;;;;;OAMG;IACH,QAAQ,CAAC,OAAO,EAAE,CAAC,GAAG,uBAAuB;IAK7C;;;;OAIG;IACG,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqD7C;;OAEG;IACG,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAShD;;OAEG;IACH,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAqBvC;;OAEG;IACH,cAAc,IAAI,WAAW;IAI7B;;;OAGG;IACH,SAAS,CAAC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;YAMzC,wBAAwB;IA6BtC,OAAO,CAAC,8BAA8B;IAQtC;;;;OAIG;IACH,SAAS,CAAC,uBAAuB,CAAC,YAAY,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;YAIxD,mBAAmB;IAkBjC;;;;;;;;OAQG;IACH,SAAS,CAAC,kBAAkB,CAAC,MAAM,EAAE;QACnC,aAAa,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,OAAO,CAAC,EAAE,CAAC,CAAC;QACZ,KAAK,CAAC,EAAE,OAAO,CAAC;KACjB,GAAG,mBAAmB;IAcvB,OAAO,CAAC,oBAAoB;IAwB5B;;;;OAIG;IACH,SAAS,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IA+C1D;;;;;;;;OAQG;cACa,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAgB7C;;;;OAIG;IACH,SAAS,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAY/C;;OAEG;IACH,UAAU,IAAI,IAAI;IAQlB;;;OAGG;IACH,SAAS,CAAC,aAAa,IAAI;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE;IAUzE;;OAEG;IACI,gBAAgB,IAAI,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAA;KAAE,CAAC;IAO/E;;;OAGG;IACI,OAAO,IAAI,IAAI;IAkBtB;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACH,SAAS,CAAC,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAoBjD;;;;;;;;;;;;;;;OAeG;IACH,SAAS,CAAC,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAWlD;;;;;;OAMG;IACH,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IAEnE;;;OAGG;IACG,gBAAgB,CAAC,QAAQ,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,0CAA0C,EAAE,eAAe,EAAE,CAAC;IAKvI;;;;;;;OAOG;IACH,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,CAAC;IAE7E;;;;;;OAMG;IACH,SAAS,CAAC,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAEhE;;;OAGG;IACH,QAAQ,CAAC,gBAAgB,IAAI,MAAM;IAEnC;;;OAGG;IACH,QAAQ,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC;IAEvF;;;OAGG;IACH,QAAQ,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;CAC3F"}
|
|
@@ -871,6 +871,31 @@ export class BaseElementManager {
|
|
|
871
871
|
});
|
|
872
872
|
}
|
|
873
873
|
}
|
|
874
|
+
/**
|
|
875
|
+
* Force a fresh disk scan and evict any modified/removed entries from the
|
|
876
|
+
* in-memory LRU cache. Call before findByName() when freshness is critical
|
|
877
|
+
* (e.g. on ensemble activation) to pick up external file changes that
|
|
878
|
+
* occurred since the last scan, even if the scan cooldown is still active.
|
|
879
|
+
*
|
|
880
|
+
* Unlike list(), this does not load all elements — it only evicts stale ones.
|
|
881
|
+
* Fixes #1895 (ensemble activation serving stale cached element list).
|
|
882
|
+
*/
|
|
883
|
+
async scanAndEvict() {
|
|
884
|
+
this.storageLayer.invalidate(); // bypass cooldown so the next scan hits disk
|
|
885
|
+
try {
|
|
886
|
+
const diff = await this.storageLayer.scan();
|
|
887
|
+
for (const relPath of [...diff.modified, ...diff.removed]) {
|
|
888
|
+
const absPath = path.join(this.elementDir, relPath);
|
|
889
|
+
const existingId = this.filePathToId.get(absPath);
|
|
890
|
+
if (existingId) {
|
|
891
|
+
this.elements.delete(existingId);
|
|
892
|
+
this.filePathToId.delete(absPath);
|
|
893
|
+
this.elementGenerations.delete(existingId);
|
|
894
|
+
}
|
|
895
|
+
}
|
|
896
|
+
}
|
|
897
|
+
catch { /* non-fatal — cache may be slightly stale, but activation proceeds */ }
|
|
898
|
+
}
|
|
874
899
|
/**
|
|
875
900
|
* Removes an element from both caches by file path
|
|
876
901
|
* This is the preferred method for deletion to avoid stale cache entries
|
|
@@ -1011,4 +1036,4 @@ export class BaseElementManager {
|
|
|
1011
1036
|
return result.errors.map(e => ({ field: 'general', message: e }));
|
|
1012
1037
|
}
|
|
1013
1038
|
}
|
|
1014
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmFzZUVsZW1lbnRNYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL2Jhc2UvQmFzZUVsZW1lbnRNYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFHekMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRXZELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUvQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ25ELE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNoRSxPQUFPLEVBQUUsc0JBQXNCLEVBQXVCLE1BQU0sd0NBQXdDLENBQUM7QUFDckcsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFLdkUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFHM0UsT0FBTyxFQUNMLHdCQUF3QixFQUN4QiwyQkFBMkIsRUFDM0Isd0JBQXdCLEVBQ3pCLE1BQU0sdUNBQXVDLENBQUM7QUFJL0MsTUFBTSw0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QUFDLGdCQUFnQixFQUFFLENBQUM7UUFDMUMsT0FBTyxHQUFHLGNBQWMsR0FBRyxTQUFTLEVBQUUsQ0FBQztJQUN6QyxDQUFDO0lBZ0JEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFhLEVBQUUsT0FBaUI7UUFDckQsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQy9ELE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3BFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEJhc2VFbGVtZW50TWFuYWdlciAtIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGFsbCBlbGVtZW50IG1hbmFnZXJzXG4gKlxuICogUHJvdmlkZXMgY29tbW9uIENSVUQgb3BlcmF0aW9ucyBmb3IgYWxsIGVsZW1lbnQgdHlwZXMgdXNpbmcgdGhlXG4gKiBUZW1wbGF0ZSBNZXRob2QgUGF0dGVybjpcbiAqIC0gRGVmaW5lcyB0aGUgc2tlbGV0b24gb2Ygb3BlcmF0aW9ucyBpbiBiYXNlIGNsYXNzXG4gKiAtIExldHMgc3ViY2xhc3NlcyBvdmVycmlkZSBzcGVjaWZpYyBzdGVwcyB3aXRob3V0IGNoYW5naW5nIHN0cnVjdHVyZVxuICpcbiAqIFN1YmNsYXNzZXM6IFNraWxsTWFuYWdlciwgVGVtcGxhdGVNYW5hZ2VyLCBBZ2VudE1hbmFnZXIsIE1lbW9yeU1hbmFnZXJcbiAqXG4gKiBTRUNVUklUWTpcbiAqIDEuIENSSVRJQ0FMOiBVc2VzIEZpbGVMb2NrTWFuYWdlciBmb3IgYXRvbWljIHJlYWQvd3JpdGUgb3BlcmF0aW9uc1xuICogMi4gSElHSDogUGF0aCB2YWxpZGF0aW9uIGFuZCBzYW5pdGl6YXRpb24gdG8gcHJldmVudCB0cmF2ZXJzYWwgYXR0YWNrc1xuICogMy4gTUVESVVNOiBTZWN1cml0eSBldmVudCBsb2dnaW5nIGZvciBhdWRpdCB0cmFpbFxuICogNC4gTUVESVVNOiBJbnB1dCB2YWxpZGF0aW9uIGFuZCBzYW5pdGl6YXRpb24gdGhyb3VnaG91dFxuICovXG5cbmltcG9ydCB7IHJhbmRvbVVVSUQgfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQgeyBJRWxlbWVudE1hbmFnZXIgfSBmcm9tICcuLi8uLi90eXBlcy9lbGVtZW50cy9JRWxlbWVudE1hbmFnZXIuanMnO1xuaW1wb3J0IHsgSUVsZW1lbnQsIEVsZW1lbnRWYWxpZGF0aW9uUmVzdWx0IH0gZnJvbSAnLi4vLi4vdHlwZXMvZWxlbWVudHMvSUVsZW1lbnQuanMnO1xuaW1wb3J0IHsgRWxlbWVudFR5cGUgfSBmcm9tICcuLi8uLi9wb3J0Zm9saW8vdHlwZXMuanMnO1xuaW1wb3J0IHsgUG9ydGZvbGlvTWFuYWdlciB9IGZyb20gJy4uLy4uL3BvcnRmb2xpby9Qb3J0Zm9saW9NYW5hZ2VyLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBGaWxlTG9ja01hbmFnZXIgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9maWxlTG9ja01hbmFnZXIuanMnO1xuaW1wb3J0IHsgU2VjdXJpdHlNb25pdG9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvc2VjdXJpdHlNb25pdG9yLmpzJztcbmltcG9ydCB7IHNhbml0aXplSW5wdXQgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9JbnB1dFZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBDb250ZW50VmFsaWRhdG9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvY29udGVudFZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eUVycm9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvZXJyb3JzLmpzJztcbmltcG9ydCB7IFNFQ1VSSVRZX0xJTUlUUyB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L2NvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyBMUlVDYWNoZSB9IGZyb20gJy4uLy4uL2NhY2hlL0xSVUNhY2hlLmpzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBTZWN1cmVZYW1sUGFyc2VyIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvc2VjdXJlWWFtbFBhcnNlci5qcyc7XG5pbXBvcnQgeyBQYXRoVmFsaWRhdG9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvcGF0aFZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBFbGVtZW50RXZlbnREaXNwYXRjaGVyLCBFbGVtZW50RXZlbnRQYXlsb2FkIH0gZnJvbSAnLi4vLi4vZXZlbnRzL0VsZW1lbnRFdmVudERpc3BhdGNoZXIuanMnO1xuaW1wb3J0IHsgRWxlbWVudFRyYW5zYWN0aW9uU2NvcGUgfSBmcm9tICcuL0VsZW1lbnRUcmFuc2FjdGlvblNjb3BlLmpzJztcbmltcG9ydCB7IEZpbGVXYXRjaFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9GaWxlV2F0Y2hTZXJ2aWNlLmpzJztcbmltcG9ydCB7IEZpbGVPcGVyYXRpb25zU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL0ZpbGVPcGVyYXRpb25zU2VydmljZS5qcyc7XG5pbXBvcnQgeyBWYWxpZGF0aW9uUmVnaXN0cnkgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZWdpc3RyeS5qcyc7XG5pbXBvcnQgeyB0eXBlIEVsZW1lbnRWYWxpZGF0b3IgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy92YWxpZGF0aW9uL0VsZW1lbnRWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgRWxlbWVudFN0b3JhZ2VMYXllciB9IGZyb20gJy4uLy4uL3N0b3JhZ2UvRWxlbWVudFN0b3JhZ2VMYXllci5qcyc7XG5pbXBvcnQgdHlwZSB7IElTdG9yYWdlTGF5ZXIgfSBmcm9tICcuLi8uLi9zdG9yYWdlL0lTdG9yYWdlTGF5ZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBFbGVtZW50SW5kZXhFbnRyeSB9IGZyb20gJy4uLy4uL3N0b3JhZ2UvdHlwZXMuanMnO1xuaW1wb3J0IHtcbiAgZ2V0VmFsaWRhdGVkU2NhbkNvb2xkb3duLFxuICBnZXRWYWxpZGF0ZWRFbGVtZW50Q2FjaGVUVEwsXG4gIGdldFZhbGlkYXRlZFBhdGhDYWNoZVRUTFxufSBmcm9tICcuLi8uLi9jb25maWcvcGVyZm9ybWFuY2UtY29uc3RhbnRzLmpzJztcbmltcG9ydCB0eXBlIHsgQ2FjaGVNZW1vcnlCdWRnZXQgfSBmcm9tICcuLi8uLi9jYWNoZS9DYWNoZU1lbW9yeUJ1ZGdldC5qcyc7XG5pbXBvcnQgdHlwZSB7IEJhY2t1cFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9CYWNrdXBTZXJ2aWNlLmpzJztcblxuY29uc3QgREVGQVVMVF9FTEVNRU5UX0NBQ0hFX1RUTF9NUyA9IGdldFZhbGlkYXRlZEVsZW1lbnRDYWNoZVRUTCgpO1xuY29uc3QgREVGQVVMVF9QQVRIX0NBQ0hFX1RUTF9NUyA9IGdldFZhbGlkYXRlZFBhdGhDYWNoZVRUTCgpO1xuXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VFbGVtZW50TWFuYWdlck9wdGlvbnMge1xuICBlbGVtZW50RGlyT3ZlcnJpZGU/OiBzdHJpbmc7XG4gIGV2ZW50RGlzcGF0Y2hlcj86IEVsZW1lbnRFdmVudERpc3BhdGNoZXI7XG4gIGVsZW1lbnRDYWNoZVRUTD86IG51bWJlcjtcbiAgcGF0aENhY2hlVFRMPzogbnVtYmVyO1xuICBlbmFibGVGaWxlV2F0Y2hlcj86IGJvb2xlYW47XG4gIGF1dG9SZWxvYWRPbkV4dGVybmFsQ2hhbmdlPzogYm9vbGVhbjtcbiAgZmlsZVdhdGNoU2VydmljZT86IEZpbGVXYXRjaFNlcnZpY2U7XG4gIG1lbW9yeUJ1ZGdldD86IENhY2hlTWVtb3J5QnVkZ2V0O1xuICBiYWNrdXBTZXJ2aWNlPzogQmFja3VwU2VydmljZTtcbn1cblxuLyoqXG4gKiBSZWNvcmQgb2YgYW4gZWxlbWVudCB0aGF0IGZhaWxlZCB0byBsb2FkIChJc3N1ZSAjNzA4KS5cbiAqIFN0b3JlZCBzbyBjYWxsZXJzIGNhbiBkaXN0aW5ndWlzaCBcImZpbGUgbm90IGZvdW5kXCIgZnJvbSBcImZpbGUgaW52YWxpZFwiLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEludmFsaWRFbGVtZW50UmVjb3JkIHtcbiAgLyoqIFJlbGF0aXZlIGZpbGUgcGF0aCB3aXRoaW4gdGhlIGVsZW1lbnQgZGlyZWN0b3J5LiAqL1xuICBmaWxlUGF0aDogc3RyaW5nO1xuICAvKiogSHVtYW4tcmVhZGFibGUgcmVhc29uIHRoZSBlbGVtZW50IHdhcyByZWplY3RlZC4gKi9cbiAgcmVhc29uOiBzdHJpbmc7XG4gIC8qKiBJU08gdGltZXN0YW1wIG9mIGxhc3QgZmFpbGVkIGxvYWQgYXR0ZW1wdC4gKi9cbiAgZmFpbGVkQXQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBYnN0cmFjdCBiYXNlIGNsYXNzIGltcGxlbWVudGluZyBjb21tb24gZWxlbWVudCBtYW5hZ2VtZW50IG9wZXJhdGlvbnNcbiAqIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgZWxlbWVudC1zcGVjaWZpYyBsb2dpYyB2aWEgYWJzdHJhY3QgbWV0aG9kc1xuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZUVsZW1lbnRNYW5hZ2VyPFQgZXh0ZW5kcyBJRWxlbWVudD4gaW1wbGVtZW50cyBJRWxlbWVudE1hbmFnZXI8VD4ge1xuICBwcm90ZWN0ZWQgcG9ydGZvbGlvTWFuYWdlcjogUG9ydGZvbGlvTWFuYWdlcjtcbiAgcHJvdGVjdGVkIGZpbGVMb2NrTWFuYWdlcjogRmlsZUxvY2tNYW5hZ2VyO1xuICBwcm90ZWN0ZWQgZmlsZU9wZXJhdGlvbnM6IEZpbGVPcGVyYXRpb25zU2VydmljZTtcbiAgcHJvdGVjdGVkIGZpbGVXYXRjaFNlcnZpY2U/OiBGaWxlV2F0Y2hTZXJ2aWNlO1xuICBwcm90ZWN0ZWQgZWxlbWVudERpcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTcGVjaWFsaXplZCB2YWxpZGF0b3IgZm9yIHRoaXMgZWxlbWVudCB0eXBlXG4gICAqIE9idGFpbmVkIGZyb20gVmFsaWRhdGlvblJlZ2lzdHJ5IGR1cmluZyBjb25zdHJ1Y3Rpb25cbiAgICovXG4gIHByb3RlY3RlZCB2YWxpZGF0b3I6IEVsZW1lbnRWYWxpZGF0b3I7XG5cbiAgLy8gUHJpbWFyeSBjYWNoZTogSUQg4oaSIEVsZW1lbnQgKHdpdGggc2l6ZSBsaW1pdHMgdG8gcHJldmVudCBtZW1vcnkgbGVha3MpXG4gIHByb3RlY3RlZCBlbGVtZW50czogTFJVQ2FjaGU8VD47XG5cbiAgLy8gUmV2ZXJzZSBpbmRleDogQWJzb2x1dGUgRmlsZVBhdGgg4oaSIEVsZW1lbnQgSUQgKHdpdGggc2l6ZSBsaW1pdHMpXG4gIHByaXZhdGUgZmlsZVBhdGhUb0lkOiBMUlVDYWNoZTxzdHJpbmc+O1xuICBwcml2YXRlIHJlYWRvbmx5IGVsZW1lbnRHZW5lcmF0aW9ucyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gIHByaXZhdGUgY2FjaGVHZW5lcmF0aW9uQ291bnRlciA9IDA7XG4gIHByaXZhdGUgd2F0Y2hlckNsZWFudXA/OiAoKSA9PiB2b2lkO1xuICBwcml2YXRlIHJlYWRvbmx5IGV2ZW50RGlzcGF0Y2hlcjogRWxlbWVudEV2ZW50RGlzcGF0Y2hlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBhdXRvUmVsb2FkT25FeHRlcm5hbENoYW5nZTogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBlbGVtZW50VHlwZTogRWxlbWVudFR5cGU7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWVtb3J5QnVkZ2V0PzogQ2FjaGVNZW1vcnlCdWRnZXQ7XG4gIHByb3RlY3RlZCByZWFkb25seSBiYWNrdXBTZXJ2aWNlPzogQmFja3VwU2VydmljZTtcblxuICAvKiogTWFwIHBsdXJhbCBFbGVtZW50VHlwZSBlbnVtIHZhbHVlcyB0byBzaW5ndWxhciBDb250ZW50VmFsaWRhdG9yIGNvbnRleHQuXG4gICAqICBQYXJ0aWFsIGJlY2F1c2Ugbm90IGFsbCBlbGVtZW50IHR5cGVzIGhhdmUgYSBjb250ZW50IGNvbnRleHQgKGUuZy4sIGVuc2VtYmxlcykuICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEVMRU1FTlRfVFlQRV9UT19DT05URVhUOiBQYXJ0aWFsPFJlY29yZDxFbGVtZW50VHlwZSwgJ3BlcnNvbmEnIHwgJ3NraWxsJyB8ICd0ZW1wbGF0ZScgfCAnYWdlbnQnIHwgJ21lbW9yeSc+PiA9IHtcbiAgICBbRWxlbWVudFR5cGUuUEVSU09OQV06ICdwZXJzb25hJyxcbiAgICBbRWxlbWVudFR5cGUuU0tJTExdOiAnc2tpbGwnLFxuICAgIFtFbGVtZW50VHlwZS5URU1QTEFURV06ICd0ZW1wbGF0ZScsXG4gICAgW0VsZW1lbnRUeXBlLkFHRU5UXTogJ2FnZW50JyxcbiAgICBbRWxlbWVudFR5cGUuTUVNT1JZXTogJ21lbW9yeScsXG4gIH07XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHN0b3JhZ2VMYXllcjogSVN0b3JhZ2VMYXllcjtcblxuICAvKipcbiAgICogSXNzdWUgIzcwODogRWxlbWVudHMgdGhhdCBleGlzdCBvbiBkaXNrIGJ1dCBmYWlsZWQgdmFsaWRhdGlvbiBkdXJpbmcgbG9hZC5cbiAgICogS2V5ZWQgYnkgcmVsYXRpdmUgZmlsZSBwYXRoIGZvciBkZWR1cGxpY2F0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBpbnZhbGlkRWxlbWVudHMgPSBuZXcgTWFwPHN0cmluZywgSW52YWxpZEVsZW1lbnRSZWNvcmQ+KCk7XG5cbiAgLyoqXG4gICAqIFRyYWNrcyBmaWxlIHBhdGhzIHdob3NlIGxvYWQgZmFpbHVyZSBoYXMgYWxyZWFkeSBiZWVuIGxvZ2dlZCBhdCBlcnJvciBsZXZlbC5cbiAgICogUmVwZWF0ZWQgZmFpbHVyZXMgd2l0aCB0aGUgc2FtZSByZWFzb24gYXJlIGRlbW90ZWQgdG8gZGVidWcgdG8gYXZvaWQgbG9nIGZsb29kaW5nLlxuICAgKiBDbGVhcmVkIHdoZW4gdGhlIGZpbGUgY2hhbmdlcyBvbiBkaXNrIG9yIGxvYWRzIHN1Y2Nlc3NmdWxseS5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc3VwcHJlc3NlZExvYWRQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIG1vc3QgcmVjZW50IGxvYWQoKSBmYWlsdXJlIGZvciB0aGlzIHBhdGggd2FzIHN1cHByZXNzZWRcbiAgICogYmVjYXVzZSBpdCB3YXMgYSByZXBlYXQgb2YgYW4gYWxyZWFkeS1sb2dnZWQgZXJyb3IuXG4gICAqIFN1YmNsYXNzZXMgY2FuIHVzZSB0aGlzIHRvIGF2b2lkIGR1cGxpY2F0ZSBzZWN1cml0eSBldmVudCBsb2dnaW5nLlxuICAgKlxuICAgKiBAcGFyYW0gZmlsZVBhdGggLSBSZWxhdGl2ZSBmaWxlIHBhdGggd2l0aGluIHRoZSBlbGVtZW50IGRpcmVjdG9yeVxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBlcnJvciBmb3IgdGhpcyBwYXRoIGlzIGN1cnJlbnRseSBzdXBwcmVzc2VkXG4gICAqL1xuICBwcm90ZWN0ZWQgaXNMb2FkRXJyb3JTdXBwcmVzc2VkKGZpbGVQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zdXBwcmVzc2VkTG9hZFBhdGhzLmhhcyhmaWxlUGF0aCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWZ0ZXJMb2FkPyhlbGVtZW50OiBULCBmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcbiAgcHJvdGVjdGVkIGJlZm9yZVNhdmU/KGVsZW1lbnQ6IFQsIGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xuICBwcm90ZWN0ZWQgYWZ0ZXJTYXZlPyhlbGVtZW50OiBULCBmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcbiAgcHJvdGVjdGVkIGZpbmRCeUlkZW50aWZpZXI/KGlkZW50aWZpZXI6IHN0cmluZyk6IFByb21pc2U8VCB8IHVuZGVmaW5lZD47XG4gIHByb3RlY3RlZCBjYW5EZWxldGU/KGVsZW1lbnQ6IFQpOiBQcm9taXNlPHsgYWxsb3dlZDogYm9vbGVhbjsgcmVhc29uPzogc3RyaW5nIH0+O1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBiYWNrdXAgYmVmb3JlIG92ZXJ3cml0aW5nIGFuIGV4aXN0aW5nIGZpbGUuXG4gICAqIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRvIG5vLW9wIChlLmcuIE1lbW9yeU1hbmFnZXIgaGFzIGl0cyBvd24gYmFja3VwIHN5c3RlbSkuXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgY3JlYXRlQmFja3VwQmVmb3JlU2F2ZShhYnNvbHV0ZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5iYWNrdXBTZXJ2aWNlKSByZXR1cm47XG4gICAgYXdhaXQgdGhpcy5iYWNrdXBTZXJ2aWNlLmJhY2t1cEJlZm9yZVNhdmUoYWJzb2x1dGVQYXRoLCB0aGlzLmVsZW1lbnRUeXBlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBiYWNrdXAgYmVmb3JlIGRlbGV0aW5nIGEgZmlsZSAobW92ZXMgZmlsZSB0byBiYWNrdXAgZGlyKS5cbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBvcmlnaW5hbCBmaWxlIHdhcyBtb3ZlZCAoY2FsbGVyIHNob3VsZCBza2lwIGRlbGV0ZUZpbGUpLlxuICAgKiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSB0byBuby1vcCAoZS5nLiBNZW1vcnlNYW5hZ2VyIGhhcyBpdHMgb3duIGJhY2t1cCBzeXN0ZW0pLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGNyZWF0ZUJhY2t1cEJlZm9yZURlbGV0ZShhYnNvbHV0ZVBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICghdGhpcy5iYWNrdXBTZXJ2aWNlKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5iYWNrdXBTZXJ2aWNlLmJhY2t1cEJlZm9yZURlbGV0ZShhYnNvbHV0ZVBhdGgsIHRoaXMuZWxlbWVudFR5cGUpO1xuICAgIHJldHVybiAhIXJlc3VsdC5tb3ZlZE9yaWdpbmFsO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3ZpZGVzIGFjY2VzcyB0byB0aGUgZXZlbnQgZGlzcGF0Y2hlciBmb3Igc3ViY2xhc3NlcyB0aGF0IG5lZWQgdG8gZW1pdCBjdXN0b20gZXZlbnRzLlxuICAgKlxuICAgKiBCYXNlRWxlbWVudE1hbmFnZXIgaGFuZGxlcyBzdGFuZGFyZCBsaWZlY3ljbGUgZXZlbnRzIChsb2FkLCBzYXZlLCBkZWxldGUpIGF1dG9tYXRpY2FsbHkuXG4gICAqIFN1YmNsYXNzZXMgc2hvdWxkIHVzZSB0aGlzIGdldHRlciBvbmx5IHdoZW4gdGhleSBuZWVkIHRvIGVtaXQgYWRkaXRpb25hbCBkb21haW4tc3BlY2lmaWNcbiAgICogZXZlbnRzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBzdGFuZGFyZCBDUlVEIGxpZmVjeWNsZS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gUGVyc29uYU1hbmFnZXIgZW1pdHMgYWN0aXZhdGlvbi9kZWFjdGl2YXRpb24gZXZlbnRzXG4gICAqIHRoaXMuZGlzcGF0Y2hlci5lbWl0KCdlbGVtZW50OmFjdGl2YXRlJywgdGhpcy5jcmVhdGVFdmVudFBheWxvYWQoey4uLn0pKTtcbiAgICpcbiAgICogQHJldHVybnMgVGhlIEVsZW1lbnRFdmVudERpc3BhdGNoZXIgaW5zdGFuY2UgdXNlZCBieSB0aGlzIG1hbmFnZXJcbiAgICovXG4gIHByb3RlY3RlZCBnZXQgZGlzcGF0Y2hlcigpOiBFbGVtZW50RXZlbnREaXNwYXRjaGVyIHtcbiAgICByZXR1cm4gdGhpcy5ldmVudERpc3BhdGNoZXI7XG4gIH1cblxuICAvLyBDYWNoZSBjb25maWd1cmF0aW9uIGNvbnN0YW50c1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNQVhfRUxFTUVOVF9DQUNIRV9TSVpFID0gMTAwMDtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTUFYX1BBVEhfQ0FDSEVfU0laRSA9IDEwMDA7XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIC0gaW5pdGlhbGl6ZXMgY29tbW9uIGRlcGVuZGVuY2llc1xuICAgKiBAcGFyYW0gZWxlbWVudFR5cGUgLSBUaGUgdHlwZSBvZiBlbGVtZW50IHRoaXMgbWFuYWdlciBoYW5kbGVzXG4gICAqIEBwYXJhbSBwb3J0Zm9saW9NYW5hZ2VyIC0gUG9ydGZvbGlvIG1hbmFnZXIgZm9yIGRpcmVjdG9yeSByZXNvbHV0aW9uXG4gICAqIEBwYXJhbSBmaWxlTG9ja01hbmFnZXIgLSBGaWxlIGxvY2sgbWFuYWdlciBmb3IgYXRvbWljIG9wZXJhdGlvbnNcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgaW5jbHVkaW5nIGZpbGVXYXRjaFNlcnZpY2VcbiAgICogQHBhcmFtIGZpbGVPcGVyYXRpb25zU2VydmljZSAtIFNlcnZpY2UgZm9yIGZpbGUgb3BlcmF0aW9uc1xuICAgKiBAcGFyYW0gdmFsaWRhdGlvblJlZ2lzdHJ5IC0gUmVnaXN0cnkgZm9yIG9idGFpbmluZyB0eXBlLXNwZWNpZmljIHZhbGlkYXRvcnNcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIGVsZW1lbnRUeXBlOiBFbGVtZW50VHlwZSxcbiAgICBwb3J0Zm9saW9NYW5hZ2VyOiBQb3J0Zm9saW9NYW5hZ2VyLFxuICAgIGZpbGVMb2NrTWFuYWdlcjogRmlsZUxvY2tNYW5hZ2VyLFxuICAgIG9wdGlvbnM6IEJhc2VFbGVtZW50TWFuYWdlck9wdGlvbnMgPSB7fSxcbiAgICBmaWxlT3BlcmF0aW9uc1NlcnZpY2U6IEZpbGVPcGVyYXRpb25zU2VydmljZSxcbiAgICB2YWxpZGF0aW9uUmVnaXN0cnk6IFZhbGlkYXRpb25SZWdpc3RyeVxuICApIHtcbiAgICB0aGlzLmVsZW1lbnRUeXBlID0gZWxlbWVudFR5cGU7XG4gICAgdGhpcy5wb3J0Zm9saW9NYW5hZ2VyID0gcG9ydGZvbGlvTWFuYWdlcjtcbiAgICB0aGlzLmZpbGVMb2NrTWFuYWdlciA9IGZpbGVMb2NrTWFuYWdlcjtcbiAgICB0aGlzLmZpbGVPcGVyYXRpb25zID0gZmlsZU9wZXJhdGlvbnNTZXJ2aWNlO1xuICAgIHRoaXMuZmlsZVdhdGNoU2VydmljZSA9IG9wdGlvbnMuZmlsZVdhdGNoU2VydmljZTtcbiAgICB0aGlzLmJhY2t1cFNlcnZpY2UgPSBvcHRpb25zLmJhY2t1cFNlcnZpY2U7XG5cbiAgICAvLyBHZXQgdGhlIHNwZWNpYWxpemVkIHZhbGlkYXRvciBmb3IgdGhpcyBlbGVtZW50IHR5cGVcbiAgICB0aGlzLnZhbGlkYXRvciA9IHZhbGlkYXRpb25SZWdpc3RyeS5nZXRWYWxpZGF0b3IoZWxlbWVudFR5cGUpO1xuXG4gICAgY29uc3QgZWxlbWVudENhY2hlVFRMID0gb3B0aW9ucy5lbGVtZW50Q2FjaGVUVEwgPz8gREVGQVVMVF9FTEVNRU5UX0NBQ0hFX1RUTF9NUztcbiAgICBjb25zdCBwYXRoQ2FjaGVUVEwgPSBvcHRpb25zLnBhdGhDYWNoZVRUTCA/PyBERUZBVUxUX1BBVEhfQ0FDSEVfVFRMX01TO1xuICAgIHRoaXMubWVtb3J5QnVkZ2V0ID0gb3B0aW9ucy5tZW1vcnlCdWRnZXQ7XG5cbiAgICBjb25zdCBvblNldENhbGxiYWNrID0gdGhpcy5tZW1vcnlCdWRnZXRcbiAgICAgID8gKCkgPT4gdGhpcy5tZW1vcnlCdWRnZXQhLmVuZm9yY2UoKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAvLyBJbml0aWFsaXplIExSVSBjYWNoZXMgd2l0aCBzaXplIGxpbWl0cyB0byBwcmV2ZW50IG1lbW9yeSBsZWFrc1xuICAgIHRoaXMuZWxlbWVudHMgPSBuZXcgTFJVQ2FjaGU8VD4oe1xuICAgICAgbmFtZTogYGVsZW1lbnRzOiR7ZWxlbWVudFR5cGV9YCxcbiAgICAgIG1heFNpemU6IEJhc2VFbGVtZW50TWFuYWdlci5NQVhfRUxFTUVOVF9DQUNIRV9TSVpFLFxuICAgICAgbWF4TWVtb3J5TUI6IDUwLCAvLyBNYXggNTBNQiBmb3IgZWxlbWVudCBjYWNoZVxuICAgICAgdHRsTXM6IGVsZW1lbnRDYWNoZVRUTCxcbiAgICAgIG9uU2V0OiBvblNldENhbGxiYWNrLFxuICAgIH0pO1xuXG4gICAgdGhpcy5maWxlUGF0aFRvSWQgPSBuZXcgTFJVQ2FjaGU8c3RyaW5nPih7XG4gICAgICBuYW1lOiBgcGF0aEluZGV4OiR7ZWxlbWVudFR5cGV9YCxcbiAgICAgIG1heFNpemU6IEJhc2VFbGVtZW50TWFuYWdlci5NQVhfUEFUSF9DQUNIRV9TSVpFLFxuICAgICAgbWF4TWVtb3J5TUI6IDEwLCAvLyBNYXggMTBNQiBmb3IgcGF0aCBtYXBwaW5nc1xuICAgICAgdHRsTXM6IHBhdGhDYWNoZVRUTCxcbiAgICAgIG9uU2V0OiBvblNldENhbGxiYWNrLFxuICAgIH0pO1xuXG4gICAgLy8gUmVnaXN0ZXIgY2FjaGVzIHdpdGggZ2xvYmFsIG1lbW9yeSBidWRnZXRcbiAgICBpZiAodGhpcy5tZW1vcnlCdWRnZXQpIHtcbiAgICAgIHRoaXMubWVtb3J5QnVkZ2V0LnJlZ2lzdGVyKHRoaXMuZWxlbWVudHMpO1xuICAgICAgdGhpcy5tZW1vcnlCdWRnZXQucmVnaXN0ZXIodGhpcy5maWxlUGF0aFRvSWQpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmVsZW1lbnREaXJPdmVycmlkZSkge1xuICAgICAgdGhpcy5lbGVtZW50RGlyID0gb3B0aW9ucy5lbGVtZW50RGlyT3ZlcnJpZGU7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgKHRoaXMucG9ydGZvbGlvTWFuYWdlciBhcyBhbnkpLmdldEVsZW1lbnREaXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXMuZWxlbWVudERpciA9ICh0aGlzLnBvcnRmb2xpb01hbmFnZXIgYXMgYW55KS5nZXRFbGVtZW50RGlyKGVsZW1lbnRUeXBlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVW5hYmxlIHRvIHJlc29sdmUgZWxlbWVudCBkaXJlY3RvcnkgZm9yICR7ZWxlbWVudFR5cGV9LiBgICtcbiAgICAgICAgJ1Byb3ZpZGUgYW4gZWxlbWVudERpck92ZXJyaWRlIHdoZW4gaW5zdGFudGlhdGluZyB0aGlzIG1hbmFnZXIuJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlciA9IG9wdGlvbnMuZXZlbnREaXNwYXRjaGVyID8/IEVsZW1lbnRFdmVudERpc3BhdGNoZXIuZ2V0U2hhcmVkRGlzcGF0Y2hlcigpO1xuICAgIHRoaXMuYXV0b1JlbG9hZE9uRXh0ZXJuYWxDaGFuZ2UgPVxuICAgICAgb3B0aW9ucy5hdXRvUmVsb2FkT25FeHRlcm5hbENoYW5nZSA/PyBwcm9jZXNzLmVudi5BVVRPX1JFTE9BRF9PTl9FWFRFUk5BTF9DSEFOR0UgPT09ICd0cnVlJztcblxuICAgIGNvbnN0IGVuYWJsZVdhdGNoZXIgPSBvcHRpb25zLmVuYWJsZUZpbGVXYXRjaGVyID8/IHByb2Nlc3MuZW52LkRPTExIT1VTRV9FTkFCTEVfRklMRV9XQVRDSEVSID09PSAndHJ1ZSc7XG4gICAgaWYgKGVuYWJsZVdhdGNoZXIgJiYgdGhpcy5maWxlV2F0Y2hTZXJ2aWNlKSB7XG4gICAgICB0aGlzLndhdGNoZXJDbGVhbnVwID0gdGhpcy5maWxlV2F0Y2hTZXJ2aWNlLndhdGNoRGlyZWN0b3J5KFxuICAgICAgICB0aGlzLmVsZW1lbnREaXIsXG4gICAgICAgIChyZWxhdGl2ZVBhdGgpID0+IHRoaXMuaGFuZGxlRXh0ZXJuYWxDaGFuZ2UocmVsYXRpdmVQYXRoKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLnN0b3JhZ2VMYXllciA9IHRoaXMuY3JlYXRlU3RvcmFnZUxheWVyKGZpbGVPcGVyYXRpb25zU2VydmljZSk7XG4gIH1cblxuICAvKipcbiAgICogRmFjdG9yeSBtZXRob2QgZm9yIGNyZWF0aW5nIHRoZSBzdG9yYWdlIGxheWVyLlxuICAgKiBEZWZhdWx0IHJldHVybnMgRWxlbWVudFN0b3JhZ2VMYXllciBmb3IgLm1kIGVsZW1lbnRzLlxuICAgKiBTdWJjbGFzc2VzIChlLmcuIE1lbW9yeU1hbmFnZXIpIGNhbiBvdmVycmlkZSB0byByZXR1cm4gYSBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb24uXG4gICAqL1xuICBwcm90ZWN0ZWQgY3JlYXRlU3RvcmFnZUxheWVyKGZpbGVPcGVyYXRpb25zU2VydmljZTogRmlsZU9wZXJhdGlvbnNTZXJ2aWNlKTogSVN0b3JhZ2VMYXllciB7XG4gICAgcmV0dXJuIG5ldyBFbGVtZW50U3RvcmFnZUxheWVyKGZpbGVPcGVyYXRpb25zU2VydmljZSwge1xuICAgICAgZWxlbWVudERpcjogdGhpcy5lbGVtZW50RGlyLFxuICAgICAgZmlsZUV4dGVuc2lvbjogdGhpcy5nZXRGaWxlRXh0ZW5zaW9uKCksXG4gICAgICBzY2FuQ29vbGRvd25NczogZ2V0VmFsaWRhdGVkU2NhbkNvb2xkb3duKCksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgc2luZ3VsYXIgaHVtYW4tcmVhZGFibGUgbGFiZWwgZm9yIHRoaXMgZWxlbWVudCB0eXBlIChlLmcuLCBcInNraWxsXCIsIFwicGVyc29uYVwiKS5cbiAgICogVXNlZCBpbiBmaWxlbmFtZSBnZW5lcmF0aW9uICh7bmFtZX0te2xhYmVsfS5tZCkgYW5kIGRpc3BsYXkgc3RyaW5ncy5cbiAgICogTXVzdCByZXR1cm4gdGhlIHNpbmd1bGFyIGZvcm0g4oCUIG5vdCB0aGUgcGx1cmFsIEVsZW1lbnRUeXBlIHZhbHVlLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldEVsZW1lbnRMYWJlbCgpOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBjYXBpdGFsaXplZCB2ZXJzaW9uIG9mIHRoZSBlbGVtZW50IGxhYmVsLlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldEVsZW1lbnRMYWJlbENhcGl0YWxpemVkKCk6IHN0cmluZyB7XG4gICAgY29uc3QgbGFiZWwgPSB0aGlzLmdldEVsZW1lbnRMYWJlbCgpO1xuICAgIHJldHVybiBsYWJlbC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGxhYmVsLnNsaWNlKDEpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgYW4gZWxlbWVudCBmcm9tIGZpbGVcbiAgICogVEVNUExBVEUgTUVUSE9EOiBEZWZpbmVzIHRoZSBhbGdvcml0aG0sIHN1YmNsYXNzZXMgY3VzdG9taXplIHN0ZXBzXG4gICAqXG4gICAqIFNFQ1VSSVRZIEZJWEVTIChpbmhlcml0ZWQgZnJvbSBvcmlnaW5hbCBtYW5hZ2Vycyk6XG4gICAqIC0gdGhpcy5maWxlTG9ja01hbmFnZXIuYXRvbWljUmVhZEZpbGUoKSBwcmV2ZW50cyByYWNlIGNvbmRpdGlvbnNcbiAgICogLSBQYXRoIHZhbGlkYXRpb24gcHJldmVudHMgdHJhdmVyc2FsIGF0dGFja3NcbiAgICogLSBTZWN1cml0eSBldmVudCBsb2dnaW5nIGZvciBhdWRpdCB0cmFpbFxuICAgKi9cbiAgYXN5bmMgbG9hZChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxUPiB7XG4gICAgY29uc3QgeyByZWxhdGl2ZVBhdGgsIGFic29sdXRlUGF0aCB9ID0gYXdhaXQgdGhpcy5ub3JtYWxpemVBbmRWYWxpZGF0ZVBhdGgoZmlsZVBhdGgpO1xuICAgIGNvbnN0IGNvcnJlbGF0aW9uSWQgPSByYW5kb21VVUlEKCk7XG5cbiAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlci5lbWl0KFxuICAgICAgJ2VsZW1lbnQ6bG9hZDpzdGFydCcsXG4gICAgICB0aGlzLmNyZWF0ZUV2ZW50UGF5bG9hZCh7IGNvcnJlbGF0aW9uSWQsIGZpbGVQYXRoOiByZWxhdGl2ZVBhdGggfSlcbiAgICApO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLnJlYWRFbGVtZW50RmlsZShhYnNvbHV0ZVBhdGgsIHRoaXMuZWxlbWVudFR5cGUsIHtcbiAgICAgICAgc291cmNlOiBgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9LmxvYWRgXG4gICAgICB9KTtcbiAgICAgIC8vIElzc3VlICM4MTA6IFBhc3MgZWxlbWVudCB0eXBlIGFzIGNvbnRlbnRDb250ZXh0IHNvIFNlY3VyZVlhbWxQYXJzZXIgZXhlbXB0c1xuICAgICAgLy8gbGVnaXRpbWF0ZSBwYXR0ZXJucyAoZS5nLiwgPHNjcmlwdD4gc2VjdGlvbiB0YWdzIGluIHRlbXBsYXRlcylcbiAgICAgIGNvbnN0IGNvbnRlbnRDb250ZXh0ID0gQmFzZUVsZW1lbnRNYW5hZ2VyLkVMRU1FTlRfVFlQRV9UT19DT05URVhUW3RoaXMuZWxlbWVudFR5cGVdO1xuICAgICAgaWYgKCFjb250ZW50Q29udGV4dCkge1xuICAgICAgICBsb2dnZXIuZGVidWcoYFske3RoaXMuY29uc3RydWN0b3IubmFtZX1dIE5vIGNvbnRlbnRDb250ZXh0IG1hcHBpbmcgZm9yIGVsZW1lbnRUeXBlICcke3RoaXMuZWxlbWVudFR5cGV9JyDigJQgcGFyc2luZyB3aXRob3V0IGNvbnRleHQgZXhlbXB0aW9ucy4gQXZhaWxhYmxlOiAke09iamVjdC5rZXlzKEJhc2VFbGVtZW50TWFuYWdlci5FTEVNRU5UX1RZUEVfVE9fQ09OVEVYVCkuam9pbignLCAnKX1gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBhcnNlZCA9IFNlY3VyZVlhbWxQYXJzZXIuc2FmZU1hdHRlcihjb250ZW50LCB1bmRlZmluZWQsIHsgY29udGVudENvbnRleHQgfSk7XG5cbiAgICAgIC8vIElzc3VlICM2OTU6IEZpbGwgaW4gbWlzc2luZyBtZXRhZGF0YSBmaWVsZHMgd2l0aCBzZW5zaWJsZSBkZWZhdWx0c1xuICAgICAgLy8gYmVmb3JlIHBhcnNlTWV0YWRhdGEoKSBzbyBvbGRlciBlbGVtZW50cyB3aXRoIHNwYXJzZSBmcm9udG1hdHRlclxuICAgICAgLy8gZG9uJ3QgZ2V0IHJlamVjdGVkLlxuICAgICAgdGhpcy5taWdyYXRlTWV0YWRhdGFEZWZhdWx0cyhwYXJzZWQuZGF0YSwgcmVsYXRpdmVQYXRoKTtcblxuICAgICAgY29uc3QgbWV0YWRhdGEgPSBhd2FpdCB0aGlzLnBhcnNlTWV0YWRhdGEocGFyc2VkLmRhdGEpO1xuICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuY3JlYXRlRWxlbWVudChtZXRhZGF0YSwgcGFyc2VkLmNvbnRlbnQpO1xuXG4gICAgICBpZiAodGhpcy5hZnRlckxvYWQpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5hZnRlckxvYWQoZWxlbWVudCwgcmVsYXRpdmVQYXRoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jYWNoZUVsZW1lbnQoZWxlbWVudCwgcmVsYXRpdmVQYXRoKTtcblxuICAgICAgLy8gSXNzdWUgIzcwODogQ2xlYXIgYW55IHByZXZpb3VzIGludmFsaWQgcmVjb3JkIG9uIHN1Y2Nlc3NmdWwgbG9hZFxuICAgICAgdGhpcy5pbnZhbGlkRWxlbWVudHMuZGVsZXRlKHJlbGF0aXZlUGF0aCk7XG4gICAgICB0aGlzLnN1cHByZXNzZWRMb2FkUGF0aHMuZGVsZXRlKHJlbGF0aXZlUGF0aCk7XG5cbiAgICAgIGxvZ2dlci5pbmZvKGAke3RoaXMuZ2V0RWxlbWVudExhYmVsQ2FwaXRhbGl6ZWQoKX0gbG9hZGVkOiAke2VsZW1lbnQubWV0YWRhdGEubmFtZX1gKTtcblxuICAgICAgdGhpcy5ldmVudERpc3BhdGNoZXIuZW1pdEFzeW5jKFxuICAgICAgICAnZWxlbWVudDpsb2FkOnN1Y2Nlc3MnLFxuICAgICAgICB0aGlzLmNyZWF0ZUV2ZW50UGF5bG9hZCh7IGNvcnJlbGF0aW9uSWQsIGZpbGVQYXRoOiByZWxhdGl2ZVBhdGgsIGVsZW1lbnQgfSlcbiAgICAgICk7XG5cbiAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBJc3N1ZSAjNzA4OiBSZWNvcmQgdGhlIGZhaWx1cmUgc28gY2FsbGVycyBjYW4gZGlzdGluZ3Vpc2hcbiAgICAgIC8vIFwiZmlsZSBub3QgZm91bmRcIiBmcm9tIFwiZmlsZSBleGlzdHMgYnV0IGZhaWxlZCB2YWxpZGF0aW9uXCIuXG4gICAgICAvLyBPbmx5IHRyYWNrIHBhcnNlL3ZhbGlkYXRpb24gZXJyb3JzIOKAlCBFTk9FTlQgbWVhbnMgdGhlIGZpbGUgaXMgZ2VudWluZWx5XG4gICAgICAvLyBtaXNzaW5nLCBub3QgaW52YWxpZCwgc28gd2UgbXVzdCBub3QgcG9sbHV0ZSB0aGUgaW52YWxpZCBtYXAgd2l0aCBpdC5cbiAgICAgIGNvbnN0IGlzRmlsZU5vdEZvdW5kID0gKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSA9PT0gJ0VOT0VOVCc7XG4gICAgICBsZXQgaXNSZXBlYXRFcnJvciA9IGZhbHNlO1xuXG4gICAgICBpZiAoIWlzRmlsZU5vdEZvdW5kKSB7XG4gICAgICAgIGNvbnN0IHJlYXNvbiA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICAgICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmludmFsaWRFbGVtZW50cy5nZXQocmVsYXRpdmVQYXRoKTtcbiAgICAgICAgaXNSZXBlYXRFcnJvciA9IGV4aXN0aW5nPy5yZWFzb24gPT09IHJlYXNvbjtcblxuICAgICAgICB0aGlzLmludmFsaWRFbGVtZW50cy5zZXQocmVsYXRpdmVQYXRoLCB7XG4gICAgICAgICAgZmlsZVBhdGg6IHJlbGF0aXZlUGF0aCxcbiAgICAgICAgICByZWFzb24sXG4gICAgICAgICAgZmFpbGVkQXQ6IGlzUmVwZWF0RXJyb3IgPyBleGlzdGluZyEuZmFpbGVkQXQgOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNSZXBlYXRFcnJvcikge1xuICAgICAgICB0aGlzLnN1cHByZXNzZWRMb2FkUGF0aHMuYWRkKHJlbGF0aXZlUGF0aCk7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgU3VwcHJlc3NlZCByZXBlYXRlZCBsb2FkIGVycm9yIGZvciAke3RoaXMuZ2V0RWxlbWVudExhYmVsKCl9ICR7cmVsYXRpdmVQYXRofWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zdXBwcmVzc2VkTG9hZFBhdGhzLmRlbGV0ZShyZWxhdGl2ZVBhdGgpO1xuICAgICAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlci5lbWl0QXN5bmMoXG4gICAgICAgICAgJ2VsZW1lbnQ6bG9hZDplcnJvcicsXG4gICAgICAgICAgdGhpcy5jcmVhdGVFdmVudFBheWxvYWQoeyBjb3JyZWxhdGlvbklkLCBmaWxlUGF0aDogcmVsYXRpdmVQYXRoLCBlcnJvciB9KVxuICAgICAgICApO1xuICAgICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBsb2FkICR7dGhpcy5nZXRFbGVtZW50TGFiZWwoKX0gZnJvbSAke2Fic29sdXRlUGF0aH06YCwgZXJyb3IpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIElzc3VlICM2OTU6IFByZS1maWxsIG1pc3NpbmcgbWV0YWRhdGEgZmllbGRzIHdpdGggc2Vuc2libGUgZGVmYXVsdHNcbiAgICogYmVmb3JlIHBhcnNlTWV0YWRhdGEoKSBydW5zLiBUaGlzIGltcGxlbWVudHMgdGhlIFwidG9sZXJhbnQgcmVhZGVyXCIgcGF0dGVyblxuICAgKiDigJQgc3RyaWN0IG9uIG91dHB1dCwgbGVuaWVudCBvbiBpbnB1dCBmb3Igb2xkZXIvc3BhcnNlIGZyb250bWF0dGVyLlxuICAgKlxuICAgKiBNdXRhdGVzIGBkYXRhYCBpbiBwbGFjZS4gTG9ncyBhIHdhcm5pbmcgZm9yIGVhY2ggZGVmYXVsdGVkIGZpZWxkIHNvXG4gICAqIG9wZXJhdG9ycyBrbm93IHdoaWNoIGZpbGVzIG5lZWQgdXBkYXRpbmcuXG4gICAqL1xuICBwcml2YXRlIG1pZ3JhdGVNZXRhZGF0YURlZmF1bHRzKGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBmaWxlUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgbWlncmF0ZWQ6IHN0cmluZ1tdID0gW107XG5cbiAgICAvLyBJbmZlciB0eXBlIGZyb20gdGhpcyBtYW5hZ2VyJ3MgZWxlbWVudCB0eXBlXG4gICAgaWYgKCFkYXRhLnR5cGUpIHtcbiAgICAgIC8vIEVsZW1lbnRUeXBlIGlzIHBsdXJhbCAoJ3BlcnNvbmFzJywgJ3NraWxscycsIGV0Yy4pXG4gICAgICAvLyBTb21lIG1hbmFnZXJzIGV4cGVjdCBzaW5ndWxhciAoJ3BlcnNvbmEnLCAnYWdlbnQnKSwgc29tZSBwbHVyYWwuXG4gICAgICAvLyBTZXQgdGhlIHBsdXJhbCBmb3JtIOKAlCBwYXJzZU1ldGFkYXRhKCkgaGFuZGxlcyBub3JtYWxpemF0aW9uLlxuICAgICAgZGF0YS50eXBlID0gdGhpcy5lbGVtZW50VHlwZTtcbiAgICAgIG1pZ3JhdGVkLnB1c2goJ3R5cGUnKTtcbiAgICB9XG5cbiAgICAvLyBJbmZlciBuYW1lIGZyb20gZmlsZW5hbWUgKHN0cmlwIGV4dGVuc2lvbiwgdW4tc2x1Z2lmeSlcbiAgICBpZiAoIWRhdGEubmFtZSkge1xuICAgICAgY29uc3QgYmFzZW5hbWUgPSBwYXRoLmJhc2VuYW1lKGZpbGVQYXRoLCB0aGlzLmdldEZpbGVFeHRlbnNpb24oKSk7XG4gICAgICBkYXRhLm5hbWUgPSBiYXNlbmFtZTtcbiAgICAgIG1pZ3JhdGVkLnB1c2goJ25hbWUnKTtcbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0IHZlcnNpb25cbiAgICBpZiAoIWRhdGEudmVyc2lvbikge1xuICAgICAgZGF0YS52ZXJzaW9uID0gJzEuMC4wJztcbiAgICAgIG1pZ3JhdGVkLnB1c2goJ3ZlcnNpb24nKTtcbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0IGF1dGhvclxuICAgIGlmICghZGF0YS5hdXRob3IpIHtcbiAgICAgIGRhdGEuYXV0aG9yID0gJ3Vua25vd24nO1xuICAgICAgbWlncmF0ZWQucHVzaCgnYXV0aG9yJyk7XG4gICAgfVxuXG4gICAgaWYgKG1pZ3JhdGVkLmxlbmd0aCA+IDApIHtcbiAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICBgW1RvbGVyYW50UmVhZGVyXSAke3RoaXMuZ2V0RWxlbWVudExhYmVsQ2FwaXRhbGl6ZWQoKX0gXCIke2ZpbGVQYXRofVwiOiBgICtcbiAgICAgICAgYGRlZmF1bHRlZCBtaXNzaW5nIGZpZWxkczogJHttaWdyYXRlZC5qb2luKCcsICcpfWBcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIElzc3VlICM3MDg6IFJldHVybnMgZWxlbWVudHMgdGhhdCBleGlzdCBvbiBkaXNrIGJ1dCBmYWlsZWQgdmFsaWRhdGlvbiBkdXJpbmcgbG9hZC5cbiAgICogQ2FsbGVycyBjYW4gdXNlIHRoaXMgdG8gcmVwb3J0IGludmFsaWQgZWxlbWVudHMgaW5zdGVhZCBvZiBzaWxlbnRseSBoaWRpbmcgdGhlbS5cbiAgICovXG4gIGdldEludmFsaWRFbGVtZW50cygpOiBJbnZhbGlkRWxlbWVudFJlY29yZFtdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuaW52YWxpZEVsZW1lbnRzLnZhbHVlcygpXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJc3N1ZSAjNzA4OiBDaGVjayBpZiBhIHNwZWNpZmljIGZpbGUgZmFpbGVkIHZhbGlkYXRpb24gZHVyaW5nIGxvYWQuXG4gICAqIFVzZWQgYnkgZ2V0X2VsZW1lbnQgdG8gZGlzdGluZ3Vpc2ggXCJub3QgZm91bmRcIiBmcm9tIFwiaW52YWxpZFwiLlxuICAgKi9cbiAgZ2V0SW52YWxpZEVsZW1lbnQobmFtZTogc3RyaW5nKTogSW52YWxpZEVsZW1lbnRSZWNvcmQgfCB1bmRlZmluZWQge1xuICAgIC8vIENoZWNrIGJ5IGV4YWN0IHBhdGggbWF0Y2ggYW5kIGJ5IG5hbWUtYmFzZWQgbWF0Y2hcbiAgICBmb3IgKGNvbnN0IFtmaWxlUGF0aCwgcmVjb3JkXSBvZiB0aGlzLmludmFsaWRFbGVtZW50cykge1xuICAgICAgaWYgKGZpbGVQYXRoID09PSBuYW1lKSByZXR1cm4gcmVjb3JkO1xuICAgICAgY29uc3QgYmFzZW5hbWUgPSBwYXRoLmJhc2VuYW1lKGZpbGVQYXRoLCB0aGlzLmdldEZpbGVFeHRlbnNpb24oKSk7XG4gICAgICBpZiAoYmFzZW5hbWUgPT09IG5hbWUgfHwgdGhpcy5ub3JtYWxpemVGaWxlbmFtZShiYXNlbmFtZSkgPT09IHRoaXMubm9ybWFsaXplRmlsZW5hbWUobmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlIGFuIGVsZW1lbnQgdG8gZmlsZVxuICAgKiBURU1QTEFURSBNRVRIT0Q6IENvbW1vbiBzYXZlIGxvZ2ljIHdpdGggaG9va3MgZm9yIGN1c3RvbWl6YXRpb25cbiAgICpcbiAgICogU0VDVVJJVFkgRklYRVM6XG4gICAqIC0gdGhpcy5maWxlTG9ja01hbmFnZXIuYXRvbWljV3JpdGVGaWxlKCkgZm9yIGF0b21pYyBvcGVyYXRpb25zXG4gICAqIC0gUGF0aCB2YWxpZGF0aW9uIHRvIHByZXZlbnQgdHJhdmVyc2FsIGF0dGFja3NcbiAgICogLSBTZWN1cml0eSBldmVudCBsb2dnaW5nXG4gICAqL1xuICBhc3luYyBzYXZlKGVsZW1lbnQ6IFQsIGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IHJlbGF0aXZlUGF0aCwgYWJzb2x1dGVQYXRoIH0gPSBhd2FpdCB0aGlzLm5vcm1hbGl6ZUFuZFZhbGlkYXRlUGF0aChmaWxlUGF0aCk7XG4gICAgY29uc3QgY29ycmVsYXRpb25JZCA9IHJhbmRvbVVVSUQoKTtcbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IG5ldyBFbGVtZW50VHJhbnNhY3Rpb25TY29wZSh0aGlzLmdldEVsZW1lbnRMYWJlbCgpLCBjb3JyZWxhdGlvbklkKTtcblxuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6ICdFTEVNRU5UX0VESVRFRCcsXG4gICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICBzb3VyY2U6IGAke3RoaXMuY29uc3RydWN0b3IubmFtZX0uc2F2ZWAsXG4gICAgICBkZXRhaWxzOiBgU2F2aW5nICR7dGhpcy5nZXRFbGVtZW50TGFiZWwoKX06ICR7ZWxlbWVudC5tZXRhZGF0YS5uYW1lfSB2JHtlbGVtZW50Lm1ldGFkYXRhLnZlcnNpb24gfHwgJ3Vua25vd24nfWAsXG4gICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICBlbGVtZW50SWQ6IGVsZW1lbnQuaWQsXG4gICAgICAgIGVsZW1lbnRUeXBlOiB0aGlzLmdldEVsZW1lbnRMYWJlbCgpLFxuICAgICAgICBhdXRob3I6IGVsZW1lbnQubWV0YWRhdGEuYXV0aG9yLFxuICAgICAgICB2ZXJzaW9uOiBlbGVtZW50Lm1ldGFkYXRhLnZlcnNpb24sXG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlci5lbWl0KFxuICAgICAgJ2VsZW1lbnQ6c2F2ZTpzdGFydCcsXG4gICAgICB0aGlzLmNyZWF0ZUV2ZW50UGF5bG9hZCh7IGNvcnJlbGF0aW9uSWQsIGZpbGVQYXRoOiByZWxhdGl2ZVBhdGgsIGVsZW1lbnQgfSlcbiAgICApO1xuXG4gICAgdHJhbnNhY3Rpb24uYWRkQ29tbWl0KGFzeW5jICgpID0+IHtcbiAgICAgIHRoaXMuY2FjaGVFbGVtZW50KGVsZW1lbnQsIHJlbGF0aXZlUGF0aCk7XG4gICAgICBhd2FpdCB0aGlzLnN0b3JhZ2VMYXllci5ub3RpZnlTYXZlZChyZWxhdGl2ZVBhdGgsIGFic29sdXRlUGF0aCk7XG4gICAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlci5lbWl0QXN5bmMoXG4gICAgICAgICdlbGVtZW50OnNhdmU6c3VjY2VzcycsXG4gICAgICAgIHRoaXMuY3JlYXRlRXZlbnRQYXlsb2FkKHsgY29ycmVsYXRpb25JZCwgZmlsZVBhdGg6IHJlbGF0aXZlUGF0aCwgZWxlbWVudCB9KVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIHRyYW5zYWN0aW9uLmFkZFJvbGxiYWNrKGFzeW5jIChlcnJvcikgPT4ge1xuICAgICAgdGhpcy5ldmVudERpc3BhdGNoZXIuZW1pdEFzeW5jKFxuICAgICAgICAnZWxlbWVudDpzYXZlOmVycm9yJyxcbiAgICAgICAgdGhpcy5jcmVhdGVFdmVudFBheWxvYWQoeyBjb3JyZWxhdGlvbklkLCBmaWxlUGF0aDogcmVsYXRpdmVQYXRoLCBlbGVtZW50LCBlcnJvciB9KVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGF3YWl0IHRyYW5zYWN0aW9uLnJ1bihhc3luYyAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5iZWZvcmVTYXZlKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYmVmb3JlU2F2ZShlbGVtZW50LCByZWxhdGl2ZVBhdGgpO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmNyZWF0ZURpcmVjdG9yeShwYXRoLmRpcm5hbWUoYWJzb2x1dGVQYXRoKSk7XG4gICAgICBhd2FpdCB0aGlzLmNyZWF0ZUJhY2t1cEJlZm9yZVNhdmUoYWJzb2x1dGVQYXRoKTtcblxuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IHRoaXMuc2VyaWFsaXplRWxlbWVudChlbGVtZW50KTtcblxuICAgICAgLy8gRml4ICM5MDg6IFZhbGlkYXRlIHNlcmlhbGl6ZWQgY29udGVudCBiZWZvcmUgd3JpdGluZyAoc3ltbWV0cmljIHdpdGggcmVhZCBwYXRoKS5cbiAgICAgIC8vIFJlYWQgcGF0aCB2YWxpZGF0ZXMgdmlhIFNlY3VyZVlhbWxQYXJzZXIucGFyc2UoKSDihpIgQ29udGVudFZhbGlkYXRvcjsgd3JpdGUgcGF0aFxuICAgICAgLy8gbXVzdCBhcHBseSB0aGUgc2FtZSBjaGVja3MgdG8gcHJldmVudCBzYXZpbmcgY29udGVudCB0aGF0IHdvdWxkIGZhaWwgdG8gbG9hZC5cbiAgICAgIHRoaXMudmFsaWRhdGVTZXJpYWxpemVkQ29udGVudChjb250ZW50KTtcblxuICAgICAgYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy53cml0ZUZpbGUoYWJzb2x1dGVQYXRoLCBjb250ZW50LCB7IGVuY29kaW5nOiAndXRmLTgnIH0pO1xuXG4gICAgICBpZiAodGhpcy5hZnRlclNhdmUpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5hZnRlclNhdmUoZWxlbWVudCwgcmVsYXRpdmVQYXRoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGxvZ2dlci5pbmZvKGAke3RoaXMuZ2V0RWxlbWVudExhYmVsQ2FwaXRhbGl6ZWQoKX0gc2F2ZWQ6ICR7ZWxlbWVudC5tZXRhZGF0YS5uYW1lfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHNlcmlhbGl6ZWQgZWxlbWVudCBjb250ZW50IGJlZm9yZSB3cml0aW5nIHRvIGRpc2suXG4gICAqIEZpeCAjOTA4OiBNaXJyb3JzIHRoZSByZWFkLXBhdGggdmFsaWRhdGlvbiBmcm9tIFNlY3VyZVlhbWxQYXJzZXIucGFyc2UoKVxuICAgKiB0byBlbnN1cmUgd3JpdGUg4oaSIHJlYWQgc3ltbWV0cnkuIENvbnRlbnQgdGhhdCBmYWlscyB0aGlzIGNoZWNrIHdvdWxkIGFsc29cbiAgICogZmFpbCB0byBsb2FkLCBzbyByZWplY3RpbmcgaXQgb24gd3JpdGUgcHJldmVudHMgcGVybWFuZW50bHkgYnJva2VuIGVsZW1lbnRzLlxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVNlcmlhbGl6ZWRDb250ZW50KGNvbnRlbnQ6IHN0cmluZyk6IHZvaWQge1xuICAgIC8vIEV4dHJhY3QgZnJvbnRtYXR0ZXIgaWYgcHJlc2VudCAoU29uYXJDbG91ZCBTNjU5NDogdXNlIFJlZ0V4cC5leGVjKVxuICAgIGNvbnN0IGZyb250bWF0dGVyUmVnZXggPSAvXi0tLVxccj9cXG4oW1xcc1xcU10qPylcXHI/XFxuLS0tLztcbiAgICBjb25zdCBmcm9udG1hdHRlck1hdGNoID0gZnJvbnRtYXR0ZXJSZWdleC5leGVjKGNvbnRlbnQpO1xuXG4gICAgaWYgKGZyb250bWF0dGVyTWF0Y2gpIHtcbiAgICAgIGNvbnN0IHlhbWxDb250ZW50ID0gZnJvbnRtYXR0ZXJNYXRjaFsxXTtcbiAgICAgIGNvbnN0IGJvZHlDb250ZW50ID0gY29udGVudC5zdWJzdHJpbmcoZnJvbnRtYXR0ZXJNYXRjaFswXS5sZW5ndGgpO1xuXG4gICAgICAvLyBZQU1MIGJvbWIgZGV0ZWN0aW9uIChtaXJyb3JzIFNlY3VyZVlhbWxQYXJzZXIucGFyc2UoKSBzdGVwIDQpLlxuICAgICAgLy8gT25seSBydW4gd2hlbiBZQU1MIGlzIHVuZGVyIE1BWF9ZQU1MX0xFTkdUSCAoNjRLQikg4oCUIHRoZSBzYW1lIGxpbWl0XG4gICAgICAvLyB1c2VkIGJ5IHRoZSByZWFkIHBhdGggaW4gU2VjdXJlWWFtbFBhcnNlci5wYXJzZSgpLiB2YWxpZGF0ZVlhbWxDb250ZW50KClcbiAgICAgIC8vIGluY2x1ZGVzIGl0cyBvd24gc2l6ZSBjaGVjayBpbnRlcm5hbGx5LCBhbmQgd2UgaW50ZW50aW9uYWxseSBza2lwIHNpemVcbiAgICAgIC8vIGVuZm9yY2VtZW50IG9uIHRoZSB3cml0ZSBwYXRoIGJlY2F1c2UgdGhlIHNlcmlhbGl6ZXIgbWF5IHByb2R1Y2UgbGFyZ2VcbiAgICAgIC8vIGZyb250bWF0dGVyIGZvciBlbGVtZW50cyB3aXRoIGxvbmcgaW5zdHJ1Y3Rpb25zLiBUaGUgcmVhZCBwYXRoIHdpbGxcbiAgICAgIC8vIHJlamVjdCBvdmVyc2l6ZWQgWUFNTCBvbiB0aGUgbmV4dCBsb2FkIGlmIG5lZWRlZC5cbiAgICAgIGlmICh5YW1sQ29udGVudC5sZW5ndGggPD0gU0VDVVJJVFlfTElNSVRTLk1BWF9ZQU1MX0xFTkdUSCkge1xuICAgICAgICBpZiAoIUNvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVZYW1sQ29udGVudCh5YW1sQ29udGVudCkpIHtcbiAgICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgICB0eXBlOiAnWUFNTF9JTkpFQ1RJT05fQVRURU1QVCcsXG4gICAgICAgICAgICBzZXZlcml0eTogJ0NSSVRJQ0FMJyxcbiAgICAgICAgICAgIHNvdXJjZTogYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfS52YWxpZGF0ZVNlcmlhbGl6ZWRDb250ZW50YCxcbiAgICAgICAgICAgIGRldGFpbHM6IGBNYWxpY2lvdXMgWUFNTCBwYXR0ZXJuIGRldGVjdGVkIGluIHNlcmlhbGl6ZWQgb3V0cHV0IGZvciAke3RoaXMuZ2V0RWxlbWVudExhYmVsKCl9YCxcbiAgICAgICAgICAgIG1ldGFkYXRhOiB7IHlhbWxMZW5ndGg6IHlhbWxDb250ZW50Lmxlbmd0aCB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXJyb3IoXG4gICAgICAgICAgICBgU2VyaWFsaXplZCAke3RoaXMuZ2V0RWxlbWVudExhYmVsKCl9IGNvbnRhaW5zIG1hbGljaW91cyBZQU1MIHBhdHRlcm5zIOKAlCB3cml0ZSBibG9ja2VkLiBgICtcbiAgICAgICAgICAgIGBSZXZpZXcgdGhlIGVsZW1lbnQncyBtZXRhZGF0YSBhbmQgaW5zdHJ1Y3Rpb25zIGZvciBzdXNwaWNpb3VzIGFuY2hvci9hbGlhcyBwYXR0ZXJucy5gLFxuICAgICAgICAgICAgJ2NyaXRpY2FsJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQm9keSBjb250ZW50IHZhbGlkYXRpb24gd2l0aCBlbGVtZW50IHR5cGUgY29udGV4dFxuICAgICAgY29uc3QgY29udGVudENvbnRleHQgPSBCYXNlRWxlbWVudE1hbmFnZXIuRUxFTUVOVF9UWVBFX1RPX0NPTlRFWFRbdGhpcy5lbGVtZW50VHlwZV07XG4gICAgICBjb25zdCBib2R5VmFsaWRhdGlvbiA9IENvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVBbmRTYW5pdGl6ZShib2R5Q29udGVudCwge1xuICAgICAgICBjb250ZW50Q29udGV4dCxcbiAgICAgIH0pO1xuICAgICAgaWYgKCFib2R5VmFsaWRhdGlvbi5pc1ZhbGlkICYmIGJvZHlWYWxpZGF0aW9uLnNldmVyaXR5ID09PSAnY3JpdGljYWwnKSB7XG4gICAgICAgIHRocm93IG5ldyBTZWN1cml0eUVycm9yKFxuICAgICAgICAgIGBDcml0aWNhbCBzZWN1cml0eSB0aHJlYXQgZGV0ZWN0ZWQgaW4gc2VyaWFsaXplZCBib2R5IGNvbnRlbnQ6ICR7Ym9keVZhbGlkYXRpb24uZGV0ZWN0ZWRQYXR0ZXJucz8uam9pbignLCAnKX1gLFxuICAgICAgICAgICdjcml0aWNhbCdcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGlzdCBhbGwgYXZhaWxhYmxlIGVsZW1lbnRzXG4gICAqIFNFQ1VSSVRZOiBVc2VzIFBvcnRmb2xpb01hbmFnZXIubGlzdEVsZW1lbnRzKCkgd2hpY2ggZmlsdGVycyB0ZXN0IGVsZW1lbnRzXG4gICAqL1xuICBhc3luYyBsaXN0KCk6IFByb21pc2U8VFtdPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEVuc3VyZSBkaXJlY3RvcnkgZXhpc3RzXG4gICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmNyZWF0ZURpcmVjdG9yeSh0aGlzLmVsZW1lbnREaXIpO1xuXG4gICAgICAvLyBTY2FuIGZvciBjaGFuZ2VzIOKAlCBwb3B1bGF0ZXMgaW5kZXggZm9yIGxpc3RTdW1tYXJpZXMoKS9maW5kQnlOYW1lKClcbiAgICAgIC8vIE5vbi1mYXRhbDogc2NhbiBmYWlsdXJlIG11c3QgbmV2ZXIgcHJldmVudCBsaXN0KCkgZnJvbSByZXR1cm5pbmcgcmVzdWx0c1xuICAgICAgLy8gRXZpY3Qgc3RhbGUgY2FjaGUgZW50cmllcyBzbyB0aGUgY2FjaGUgY2hlY2sgYmVsb3cgbmV2ZXIgcmV0dXJucyBvdXRkYXRlZCBkYXRhXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBkaWZmID0gYXdhaXQgdGhpcy5zdG9yYWdlTGF5ZXIuc2NhbigpO1xuICAgICAgICBmb3IgKGNvbnN0IHJlbFBhdGggb2YgWy4uLmRpZmYubW9kaWZpZWQsIC4uLmRpZmYucmVtb3ZlZF0pIHtcbiAgICAgICAgICBjb25zdCBhYnNQYXRoID0gcGF0aC5qb2luKHRoaXMuZWxlbWVudERpciwgcmVsUGF0aCk7XG4gICAgICAgICAgY29uc3QgZXhpc3RpbmdJZCA9IHRoaXMuZmlsZVBhdGhUb0lkLmdldChhYnNQYXRoKTtcbiAgICAgICAgICBpZiAoZXhpc3RpbmdJZCkge1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50cy5kZWxldGUoZXhpc3RpbmdJZCk7XG4gICAgICAgICAgICB0aGlzLmZpbGVQYXRoVG9JZC5kZWxldGUoYWJzUGF0aCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHsgLyogaW5kZXggdW5hdmFpbGFibGUsIGxpc3QoKSBjb250aW51ZXMgd2l0aG91dCBjYWNoZSBvcHRpbWl6YXRpb24gKi8gfVxuXG4gICAgICAvLyBVc2UgUG9ydGZvbGlvTWFuYWdlciBmb3IgYXV0aG9yaXRhdGl2ZSBmaWxlIGxpc3QgKyBzZWN1cml0eSBmaWx0ZXJpbmdcbiAgICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgdGhpcy5wb3J0Zm9saW9NYW5hZ2VyLmxpc3RFbGVtZW50cyh0aGlzLmVsZW1lbnRUeXBlKTtcblxuICAgICAgLy8gTG9hZCBhbGwgZWxlbWVudHMgaW4gcGFyYWxsZWwsIGNoZWNraW5nIGNhY2hlIGJlZm9yZSBkaXNrXG4gICAgICBjb25zdCBlbGVtZW50cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBmaWxlcy5tYXAoYXN5bmMgKGZpbGUpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gQ2hlY2sgY2FjaGUgZmlyc3QgKGF2b2lkcyBkaXNrIHJlYWQgaWYgZWxlbWVudCBpcyBhbHJlYWR5IGxvYWRlZClcbiAgICAgICAgICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IHRoaXMucmVzb2x2ZUFic29sdXRlUGF0aChmaWxlKTtcbiAgICAgICAgICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMuZ2V0Q2FjaGVkRWxlbWVudEJ5QWJzb2x1dGVQYXRoKGFic29sdXRlUGF0aCk7XG4gICAgICAgICAgICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkO1xuICAgICAgICAgICAgLy8gQ2FjaGUgbWlzcyDigJQgcmVhZCBmcm9tIGRpc2sgKHBvcHVsYXRlcyBjYWNoZSBmb3IgbmV4dCB0aW1lKVxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubG9hZChmaWxlKTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vIGxvYWQoKSBoYW5kbGVzIGVycm9yIGxvZ2dpbmcgd2l0aCBkZWR1cGxpY2F0aW9uXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApO1xuXG4gICAgICAvLyBGaWx0ZXIgb3V0IGZhaWxlZCBsb2FkcyBhbmQgcmV0dXJuXG4gICAgICByZXR1cm4gZWxlbWVudHMuZmlsdGVyKChlKTogZSBpcyBBd2FpdGVkPFQ+ID0+IGUgIT09IG51bGwpIGFzIFRbXTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKChlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICAgIGNvbnN0IGxhYmVsID0gdGhpcy5nZXRFbGVtZW50TGFiZWxDYXBpdGFsaXplZCgpO1xuICAgICAgICBsb2dnZXIuZGVidWcoYCR7bGFiZWx9cyBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QgeWV0LCByZXR1cm5pbmcgZW1wdHkgYXJyYXlgKTtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gbGlzdCAke3RoaXMuZWxlbWVudFR5cGV9czpgLCBlcnJvcik7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExpc3QgbGlnaHR3ZWlnaHQgbWV0YWRhdGEgc3VtbWFyaWVzIHdpdGhvdXQgbG9hZGluZyBmdWxsIGVsZW1lbnRzLlxuICAgKiBVc2VmdWwgd2hlbiBvbmx5IG5hbWVzL2Rlc2NyaXB0aW9ucy90YWdzIGFyZSBuZWVkZWQuXG4gICAqL1xuICBhc3luYyBsaXN0U3VtbWFyaWVzKCk6IFByb21pc2U8RWxlbWVudEluZGV4RW50cnlbXT4ge1xuICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuY3JlYXRlRGlyZWN0b3J5KHRoaXMuZWxlbWVudERpcik7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmFnZUxheWVyLmxpc3RTdW1tYXJpZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGFuIGVsZW1lbnQgYnkgcHJlZGljYXRlXG4gICAqL1xuICBhc3luYyBmaW5kKHByZWRpY2F0ZTogKGVsZW1lbnQ6IFQpID0+IGJvb2xlYW4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBlbGVtZW50cyA9IGF3YWl0IHRoaXMubGlzdCgpO1xuICAgIHJldHVybiBlbGVtZW50cy5maW5kKHByZWRpY2F0ZSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZCBtdWx0aXBsZSBlbGVtZW50cyBieSBwcmVkaWNhdGVcbiAgICovXG4gIGFzeW5jIGZpbmRNYW55KHByZWRpY2F0ZTogKGVsZW1lbnQ6IFQpID0+IGJvb2xlYW4pOiBQcm9taXNlPFRbXT4ge1xuICAgIGNvbnN0IGVsZW1lbnRzID0gYXdhaXQgdGhpcy5saXN0KCk7XG4gICAgcmV0dXJuIGVsZW1lbnRzLmZpbHRlcihwcmVkaWNhdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYW4gZWxlbWVudCBieSBuYW1lIG9yIElEIHdpdGhvdXQgbG9hZGluZyBhbGwgZWxlbWVudHNcbiAgICpcbiAgICogSXNzdWUgIzI0IChMT1cgUFJJT1JJVFkpOiBQZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24gZm9yIGFjdGl2YXRpb24gZmxvd1xuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBwcm92aWRlcyBhbiBvcHRpbWl6ZWQgbG9va3VwIHRoYXQgdHJpZXMgY2FjaGUgZmlyc3QsIHRoZW5cbiAgICogYXR0ZW1wdHMgZGlyZWN0IGZpbGUgYWNjZXNzIGJlZm9yZSBmYWxsaW5nIGJhY2sgdG8gZnVsbCBsaXN0KCkgc2Nhbi5cbiAgICogVGhpcyBpcyBzaWduaWZpY2FudGx5IGZhc3RlciB0aGFuIGxpc3QoKSBmb3IgbGFyZ2UgcG9ydGZvbGlvcy5cbiAgICpcbiAgICogUEVSRk9STUFOQ0UgSU1QUk9WRU1FTlRTOlxuICAgKiAxLiBDYWNoZSBsb29rdXAgLSBPKDEpIGlmIGVsZW1lbnQgd2FzIHByZXZpb3VzbHkgbG9hZGVkXG4gICAqIDIuIERpcmVjdCBmaWxlIGFjY2VzcyAtIE8oMSkgZm9yIG5hbWUtYmFzZWQgbG9va3Vwc1xuICAgKiAzLiBGdWxsIHNjYW4gZmFsbGJhY2sgLSBPKG4pIG9ubHkgaWYgYWJvdmUgbWV0aG9kcyBmYWlsXG4gICAqXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIC0gRWxlbWVudCBuYW1lIG9yIElEIHRvIHNlYXJjaCBmb3JcbiAgICogQHJldHVybnMgRWxlbWVudCBpZiBmb3VuZCwgdW5kZWZpbmVkIG90aGVyd2lzZVxuICAgKi9cbiAgYXN5bmMgZmluZEJ5TmFtZShpZGVudGlmaWVyOiBzdHJpbmcpOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgICAvLyBGaXJzdCwgdHJ5IGZpbmRpbmcgaW4gY2FjaGUgYnkgaXRlcmF0aW5nIGNhY2hlZCBlbGVtZW50c1xuICAgIC8vIFRoaXMgaXMgZmFzdCAoTyhjYWNoZSBzaXplKSkgYW5kIHdvcmtzIGZvciByZWNlbnRseSBhY2Nlc3NlZCBlbGVtZW50c1xuICAgIGNvbnN0IGNhY2hlZEVsZW1lbnQgPSBhd2FpdCB0aGlzLmZpbmRJbkNhY2hlKGlkZW50aWZpZXIpO1xuICAgIGlmIChjYWNoZWRFbGVtZW50KSB7XG4gICAgICByZXR1cm4gY2FjaGVkRWxlbWVudDtcbiAgICB9XG5cbiAgICAvLyBTZWNvbmQsIHRyeSBzdG9yYWdlIGxheWVyIGluZGV4IChPKDEpIG5hbWUgbG9va3VwKVxuICAgIGNvbnN0IGluZGV4ZWRQYXRoID0gdGhpcy5zdG9yYWdlTGF5ZXIuZ2V0UGF0aEJ5TmFtZShpZGVudGlmaWVyKTtcbiAgICBpZiAoaW5kZXhlZFBhdGgpIHtcbiAgICAgIHRyeSB7IHJldHVybiBhd2FpdCB0aGlzLmxvYWQoaW5kZXhlZFBhdGgpOyB9IGNhdGNoIHsgLyogZmFsbCB0aHJvdWdoICovIH1cbiAgICB9XG5cbiAgICAvLyBUaGlyZCwgdHJ5IGRpcmVjdCBmaWxlIGFjY2VzcyB1c2luZyBzdGFuZGFyZCBuYW1pbmcgY29udmVudGlvblxuICAgIC8vIEVsZW1lbnQgZmlsZXMgYXJlIHR5cGljYWxseSBuYW1lZDogbG93ZXJjYXNlLW5hbWUtd2l0aC1oeXBoZW5zLntleHR9XG4gICAgLy8gVGhpcyBpcyBPKDEpIGZpbGUgc3lzdGVtIGxvb2t1cFxuICAgIGNvbnN0IGRpcmVjdExvYWRBdHRlbXB0ID0gYXdhaXQgdGhpcy50cnlEaXJlY3RMb2FkKGlkZW50aWZpZXIpO1xuICAgIGlmIChkaXJlY3RMb2FkQXR0ZW1wdCkge1xuICAgICAgcmV0dXJuIGRpcmVjdExvYWRBdHRlbXB0O1xuICAgIH1cblxuICAgIC8vIElmIHN0b3JhZ2UgbGF5ZXIgaGFzIGNvbXBsZXRlZCBhdCBsZWFzdCBvbmUgc2NhbiwgdGhlIGluZGV4IGlzXG4gICAgLy8gYXV0aG9yaXRhdGl2ZSDigJQgYSBtaXNzIG1lYW5zIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0LiBTa2lwIHRoZVxuICAgIC8vIGV4cGVuc2l2ZSBsaXN0KCkgZmFsbGJhY2sgdG8gYXZvaWQgTyhuKSByZXNjYW5zIG9uIGV2ZXJ5IGNhY2hlIG1pc3MuXG4gICAgaWYgKHRoaXMuc3RvcmFnZUxheWVyLmhhc0NvbXBsZXRlZFNjYW4oKSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjazogRnVsbCBsaXN0KCkgc2NhbiAoTyhuKSAtIGxvYWRzIGFsbCBlbGVtZW50cylcbiAgICAvLyBPbmx5IHVzZWQgb24gZmlyc3QgYWNjZXNzIGJlZm9yZSBhbnkgc2NhbiBoYXMgY29tcGxldGVkLlxuICAgIC8vIFRoaXMgZW5zdXJlcyB3ZSBmaW5kIGVsZW1lbnRzIGV2ZW4gd2l0aCBub24tc3RhbmRhcmQgZmlsZSBuYW1pbmcuXG4gICAgY29uc3QgZWxlbWVudHMgPSBhd2FpdCB0aGlzLmxpc3QoKTtcbiAgICBjb25zdCBub3JtYWxpemVkSWRlbnRpZmllciA9IHRoaXMubm9ybWFsaXplRmlsZW5hbWUoaWRlbnRpZmllcik7XG4gICAgcmV0dXJuIGVsZW1lbnRzLmZpbmQoZSA9PlxuICAgICAgdGhpcy5ub3JtYWxpemVGaWxlbmFtZShlLm1ldGFkYXRhLm5hbWUpID09PSBub3JtYWxpemVkSWRlbnRpZmllciB8fFxuICAgICAgZS5tZXRhZGF0YS5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IGlkZW50aWZpZXIudG9Mb3dlckNhc2UoKSB8fFxuICAgICAgZS5pZCA9PT0gaWRlbnRpZmllclxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyOiBTZWFyY2ggY2FjaGUgZm9yIGVsZW1lbnQgYnkgbmFtZSBvciBJRFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBmaW5kSW5DYWNoZShpZGVudGlmaWVyOiBzdHJpbmcpOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgICAvLyBMUlVDYWNoZSBkb2Vzbid0IHByb3ZpZGUgaXRlcmF0aW9uLCBidXQgd2UgY2FuIGNoZWNrIGlmIHdlIGhhdmVcbiAgICAvLyBhIGNhY2hlZCBwYXRoIGZvciB0aGlzIGlkZW50aWZpZXIgYnkgdHJ5aW5nIGNvbW1vbiBuYW1pbmcgcGF0dGVybnMuXG4gICAgLy8gSU1QT1JUQU5UOiBmaWxlUGF0aFRvSWQgc3RvcmVzIGFic29sdXRlIHBhdGhzIChzZXQgYnkgY2FjaGVFbGVtZW50IHZpYVxuICAgIC8vIHJlc29sdmVBYnNvbHV0ZVBhdGgpLCBzbyB3ZSBtdXN0IHJlc29sdmUgdG8gYWJzb2x1dGUgYmVmb3JlIGxvb2t1cC5cbiAgICBjb25zdCBwb3NzaWJsZUZpbGVuYW1lcyA9IFtcbiAgICAgIGlkZW50aWZpZXIsXG4gICAgICBgJHtpZGVudGlmaWVyfSR7dGhpcy5nZXRGaWxlRXh0ZW5zaW9uKCl9YCxcbiAgICAgIC8vIFVzZSB1bmlmaWVkIG5vcm1hbGl6ZUZpbGVuYW1lIGZvciBjb25zaXN0ZW50IGNhY2hlIGxvb2t1cHNcbiAgICAgIHRoaXMuZ2V0RWxlbWVudEZpbGVuYW1lKGlkZW50aWZpZXIpXG4gICAgXTtcblxuICAgIGZvciAoY29uc3QgZmlsZW5hbWUgb2YgcG9zc2libGVGaWxlbmFtZXMpIHtcbiAgICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IHRoaXMucmVzb2x2ZUFic29sdXRlUGF0aChmaWxlbmFtZSk7XG4gICAgICBjb25zdCBjYWNoZWRJZCA9IHRoaXMuZmlsZVBhdGhUb0lkLmdldChhYnNvbHV0ZVBhdGgpO1xuICAgICAgaWYgKGNhY2hlZElkKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmVsZW1lbnRzLmdldChjYWNoZWRJZCk7XG4gICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlcjogVHJ5IGxvYWRpbmcgZWxlbWVudCBkaXJlY3RseSBieSBjb25zdHJ1Y3RpbmcgZXhwZWN0ZWQgZmlsZW5hbWVcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgdHJ5RGlyZWN0TG9hZChpZGVudGlmaWVyOiBzdHJpbmcpOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgICAvLyBUcnkgbG9hZGluZyB1c2luZyBjb21tb24gbmFtaW5nIHBhdHRlcm5zXG4gICAgLy8gVXNlIHVuaWZpZWQgbm9ybWFsaXplRmlsZW5hbWUgZm9yIGNvbnNpc3RlbnQgZmlsZW5hbWUgY29uc3RydWN0aW9uXG4gICAgY29uc3QgcG9zc2libGVQYXRocyA9IFtcbiAgICAgIC8vIFByaW1hcnk6IFVzZSB1bmlmaWVkIG5vcm1hbGl6YXRpb24gKGhhbmRsZXMgQ2FtZWxDYXNlLCBzcGFjZXMsIHVuZGVyc2NvcmVzLCBldGMuKVxuICAgICAgdGhpcy5nZXRFbGVtZW50RmlsZW5hbWUoaWRlbnRpZmllciksXG4gICAgICAvLyBGYWxsYmFjazogSWRlbnRpZmllciBhcy1pcyB3aXRoIGV4dGVuc2lvblxuICAgICAgYCR7aWRlbnRpZmllcn0ke3RoaXMuZ2V0RmlsZUV4dGVuc2lvbigpfWAsXG4gICAgICAvLyBGYWxsYmFjazogSWRlbnRpZmllciBhbHJlYWR5IGluY2x1ZGVzIGV4dGVuc2lvblxuICAgICAgaWRlbnRpZmllclxuICAgIF07XG5cbiAgICBmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIHBvc3NpYmxlUGF0aHMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBhd2FpdCB0aGlzLmxvYWQoZmlsZVBhdGgpO1xuICAgICAgICAvLyBWZXJpZnkgdGhlIGxvYWRlZCBlbGVtZW50IG1hdGNoZXMgdGhlIGlkZW50aWZpZXJcbiAgICAgICAgLy8gTm9ybWFsaXplIGJvdGggc2lkZXMgc28gXCJDb2RlIFJldmlld1wiIChzcGFjZXMpIG1hdGNoZXMgXCJjb2RlLXJldmlld1wiIChoeXBoZW5zKVxuICAgICAgICBjb25zdCBub3JtYWxpemVkTWV0YU5hbWUgPSB0aGlzLm5vcm1hbGl6ZUZpbGVuYW1lKGVsZW1lbnQubWV0YWRhdGEubmFtZSk7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRJZGVudGlmaWVyID0gdGhpcy5ub3JtYWxpemVGaWxlbmFtZShpZGVudGlmaWVyKTtcbiAgICAgICAgaWYgKG5vcm1hbGl6ZWRNZXRhTmFtZSA9PT0gbm9ybWFsaXplZElkZW50aWZpZXIgfHxcbiAgICAgICAgICAgIGVsZW1lbnQubWV0YWRhdGEubmFtZS50b0xvd2VyQ2FzZSgpID09PSBpZGVudGlmaWVyLnRvTG93ZXJDYXNlKCkgfHxcbiAgICAgICAgICAgIGVsZW1lbnQuaWQgPT09IGlkZW50aWZpZXIpIHtcbiAgICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoX2Vycm9yKSB7XG4gICAgICAgIC8vIEZpbGUgZG9lc24ndCBleGlzdCBvciBmYWlsZWQgdG8gbG9hZCAtIHRyeSBuZXh0IHBhdGhcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBhbiBlbGVtZW50XG4gICAqIERlbGVnYXRlcyB0byBlbGVtZW50J3Mgb3duIHZhbGlkYXRlIG1ldGhvZFxuICAgKlxuICAgKiBAcmV0dXJucyBWYWxpZGF0aW9uIHJlc3VsdCB3aXRoIGJvdGggJ3ZhbGlkJyBhbmQgJ2lzVmFsaWQnIHByb3BlcnRpZXMuXG4gICAqICAgICAgICAgICdpc1ZhbGlkJyBpcyBkZXByZWNhdGVkIC0gdXNlICd2YWxpZCcgZm9yIG5ldyBjb2RlLlxuICAgKi9cbiAgdmFsaWRhdGUoZWxlbWVudDogVCk6IEVsZW1lbnRWYWxpZGF0aW9uUmVzdWx0IHtcbiAgICBjb25zdCByZXN1bHQgPSBlbGVtZW50LnZhbGlkYXRlKCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgYW4gZWxlbWVudFxuICAgKiBTRUNVUklUWTogUGF0aCB2YWxpZGF0aW9uIHRvIHByZXZlbnQgZGVsZXRpb24gb3V0c2lkZSBkaXJlY3RvcnlcbiAgICogQ0FDSEUgRklYOiBVc2VzIGZpbGVwYXRoLWJhc2VkIGNhY2hlIHJlbW92YWwgdG8gcHJldmVudCBzdGFsZSBlbnRyaWVzXG4gICAqL1xuICBhc3luYyBkZWxldGUoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6ICdFTEVNRU5UX0RFTEVURUQnLFxuICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgc291cmNlOiBgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9LmRlbGV0ZWAsXG4gICAgICBkZXRhaWxzOiBgQXR0ZW1wdGluZyB0byBkZWxldGUgJHt0aGlzLmdldEVsZW1lbnRMYWJlbCgpfTogJHtmaWxlUGF0aH1gXG4gICAgfSk7XG5cbiAgICBjb25zdCB7IHJlbGF0aXZlUGF0aCwgYWJzb2x1dGVQYXRoIH0gPSBhd2FpdCB0aGlzLm5vcm1hbGl6ZUFuZFZhbGlkYXRlUGF0aChmaWxlUGF0aCk7XG4gICAgY29uc3QgY29ycmVsYXRpb25JZCA9IHJhbmRvbVVVSUQoKTtcbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IG5ldyBFbGVtZW50VHJhbnNhY3Rpb25TY29wZSh0aGlzLmdldEVsZW1lbnRMYWJlbCgpLCBjb3JyZWxhdGlvbklkKTtcblxuICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyLmVtaXQoXG4gICAgICAnZWxlbWVudDpkZWxldGU6c3RhcnQnLFxuICAgICAgdGhpcy5jcmVhdGVFdmVudFBheWxvYWQoeyBjb3JyZWxhdGlvbklkLCBmaWxlUGF0aDogcmVsYXRpdmVQYXRoIH0pXG4gICAgKTtcblxuICAgIHRyYW5zYWN0aW9uLmFkZENvbW1pdChhc3luYyAoKSA9PiB7XG4gICAgICB0aGlzLnVuY2FjaGVCeVBhdGgocmVsYXRpdmVQYXRoKTtcbiAgICAgIHRoaXMuc3RvcmFnZUxheWVyLm5vdGlmeURlbGV0ZWQocmVsYXRpdmVQYXRoKTtcbiAgICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyLmVtaXRBc3luYyhcbiAgICAgICAgJ2VsZW1lbnQ6ZGVsZXRlOnN1Y2Nlc3MnLFxuICAgICAgICB0aGlzLmNyZWF0ZUV2ZW50UGF5bG9hZCh7IGNvcnJlbGF0aW9uSWQsIGZpbGVQYXRoOiByZWxhdGl2ZVBhdGggfSlcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICB0cmFuc2FjdGlvbi5hZGRSb2xsYmFjayhhc3luYyAoZXJyb3IpID0+IHtcbiAgICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyLmVtaXRBc3luYyhcbiAgICAgICAgJ2VsZW1lbnQ6ZGVsZXRlOmVycm9yJyxcbiAgICAgICAgdGhpcy5jcmVhdGVFdmVudFBheWxvYWQoeyBjb3JyZWxhdGlvbklkLCBmaWxlUGF0aDogcmVsYXRpdmVQYXRoLCBlcnJvciB9KVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGF3YWl0IHRyYW5zYWN0aW9uLnJ1bihhc3luYyAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5jYW5EZWxldGUpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudEZvclZhbGlkYXRpb24gPSBhd2FpdCB0aGlzLmxvYWRFbGVtZW50U25hcHNob3QoYWJzb2x1dGVQYXRoLCByZWxhdGl2ZVBhdGgpO1xuICAgICAgICBjb25zdCBkZWNpc2lvbiA9IGF3YWl0IHRoaXMuY2FuRGVsZXRlKGVsZW1lbnRGb3JWYWxpZGF0aW9uKTtcbiAgICAgICAgaWYgKCFkZWNpc2lvbi5hbGxvd2VkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGRlY2lzaW9uLnJlYXNvbiA/PyBgRGVsZXRpb24gbm90IHBlcm1pdHRlZCBmb3IgJHt0aGlzLmdldEVsZW1lbnRMYWJlbCgpfWApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1vdmVkVG9CYWNrdXAgPSBhd2FpdCB0aGlzLmNyZWF0ZUJhY2t1cEJlZm9yZURlbGV0ZShhYnNvbHV0ZVBhdGgpO1xuICAgICAgaWYgKCFtb3ZlZFRvQmFja3VwKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuZGVsZXRlRmlsZShhYnNvbHV0ZVBhdGgsIHRoaXMuZWxlbWVudFR5cGUsIHtcbiAgICAgICAgICBzb3VyY2U6IGAke3RoaXMuY29uc3RydWN0b3IubmFtZX0uZGVsZXRlYFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGxvZ2dlci5pbmZvKGAke3RoaXMuZ2V0RWxlbWVudExhYmVsQ2FwaXRhbGl6ZWQoKX0gZGVsZXRlZDogJHtmaWxlUGF0aH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbiBlbGVtZW50IGV4aXN0c1xuICAgKi9cbiAgYXN5bmMgZXhpc3RzKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBhYnNvbHV0ZVBhdGggfSA9IGF3YWl0IHRoaXMubm9ybWFsaXplQW5kVmFsaWRhdGVQYXRoKGZpbGVQYXRoKTtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmV4aXN0cyhhYnNvbHV0ZVBhdGgpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBhIGZpbGUgcGF0aFxuICAgKi9cbiAgdmFsaWRhdGVQYXRoKGZpbGVQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2FuaXRpemVkID0gc2FuaXRpemVJbnB1dChmaWxlUGF0aCwgMjU1KTtcblxuICAgICAgaWYgKCFzYW5pdGl6ZWQgfHwgcGF0aC5pc0Fic29sdXRlKHNhbml0aXplZCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2FuaXRpemVkLmluY2x1ZGVzKCcuLicpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZXh0ID0gcGF0aC5leHRuYW1lKHNhbml0aXplZCkudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNvbnN0IGFsbG93ZWRFeHRlbnNpb25zID0gWycubWQnLCAnLm1hcmtkb3duJywgJy50eHQnLCAnLnltbCcsICcueWFtbCddO1xuXG4gICAgICByZXR1cm4gZXh0ID09PSAnJyB8fCBhbGxvd2VkRXh0ZW5zaW9ucy5pbmNsdWRlcyhleHQpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGVsZW1lbnQgdHlwZVxuICAgKi9cbiAgZ2V0RWxlbWVudFR5cGUoKTogRWxlbWVudFR5cGUge1xuICAgIHJldHVybiB0aGlzLmVsZW1lbnRUeXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIGEgZmlsZSBwYXRoIHRvIGl0cyBhYnNvbHV0ZSBmb3JtIGZvciBjYWNoZSBjb25zaXN0ZW5jeVxuICAgKiBFbnN1cmVzIGNvbnNpc3RlbnQgcGF0aCBoYW5kbGluZyBhY3Jvc3MgcmVsYXRpdmUvYWJzb2x1dGUgcGF0aHNcbiAgICovXG4gIHByb3RlY3RlZCByZXNvbHZlQWJzb2x1dGVQYXRoKGZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBwYXRoLmlzQWJzb2x1dGUoZmlsZVBhdGgpXG4gICAgICA/IHBhdGgubm9ybWFsaXplKGZpbGVQYXRoKVxuICAgICAgOiBwYXRoLm5vcm1hbGl6ZShwYXRoLmpvaW4odGhpcy5lbGVtZW50RGlyLCBmaWxlUGF0aCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBub3JtYWxpemVBbmRWYWxpZGF0ZVBhdGgoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8eyByZWxhdGl2ZVBhdGg6IHN0cmluZzsgYWJzb2x1dGVQYXRoOiBzdHJpbmcgfT4ge1xuICAgIGNvbnN0IHNhbml0aXplZFBhdGggPSBzYW5pdGl6ZUlucHV0KGZpbGVQYXRoLCAyNTUpO1xuXG4gICAgaWYgKCFzYW5pdGl6ZWRQYXRoIHx8IHNhbml0aXplZFBhdGgudHJpbSgpLmxlbmd0aCA9PT0gMCB8fCBzYW5pdGl6ZWRQYXRoID09PSAnLicgfHwgc2FuaXRpemVkUGF0aCA9PT0gcGF0aC5zZXApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCAke3RoaXMuZ2V0RWxlbWVudExhYmVsKCl9IHBhdGg6IGVtcHR5IHBhdGggaXMgbm90IGFsbG93ZWRgKTtcbiAgICB9XG5cbiAgICBpZiAocGF0aC5pc0Fic29sdXRlKHNhbml0aXplZFBhdGgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEFic29sdXRlICR7dGhpcy5nZXRFbGVtZW50TGFiZWwoKX0gcGF0aHMgYXJlIG5vdCBhbGxvd2VkYCk7XG4gICAgfVxuXG4gICAgLy8gTm9ybWFsaXplIHRoZSBwYXRoIChyZW1vdmUgcmVkdW5kYW50IHNlcGFyYXRvcnMsIHJlc29sdmUgLiBhbmQgLi4pXG4gICAgY29uc3Qgbm9ybWFsaXplZFJlbGF0aXZlID0gcGF0aC5ub3JtYWxpemUoc2FuaXRpemVkUGF0aCk7XG5cbiAgICAvLyBCdWlsZCBhYnNvbHV0ZSBwYXRoXG4gICAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5qb2luKHRoaXMuZWxlbWVudERpciwgbm9ybWFsaXplZFJlbGF0aXZlKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBWYWxpZGF0ZSBXSVRIT1VUIHJlc29sdmluZyBzeW1saW5rcyAtIGp1c3QgY2hlY2sgc2VjdXJpdHkgY29uc3RyYWludHNcbiAgICAgIGF3YWl0IFBhdGhWYWxpZGF0b3IudmFsaWRhdGVFbGVtZW50UGF0aE9ubHkoYWJzb2x1dGVQYXRoLCB0aGlzLmVsZW1lbnREaXIpO1xuXG4gICAgICAvLyBSZXR1cm4gdGhlIGlucHV0IGFzIHJlbGF0aXZlUGF0aCAoaXQncyBhbHJlYWR5IHJlbGF0aXZlKSBhbmQgY29tcHV0ZWQgYWJzb2x1dGVQYXRoXG4gICAgICByZXR1cm4geyByZWxhdGl2ZVBhdGg6IG5vcm1hbGl6ZWRSZWxhdGl2ZSwgYWJzb2x1dGVQYXRoIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IHJlYXNvbiA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ0ludmFsaWQgcGF0aCc7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgJHt0aGlzLmdldEVsZW1lbnRMYWJlbCgpfSBwYXRoOiAke3JlYXNvbn1gKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldENhY2hlZEVsZW1lbnRCeUFic29sdXRlUGF0aChhYnNvbHV0ZVBhdGg6IHN0cmluZyk6IFQgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGVsZW1lbnRJZCA9IHRoaXMuZmlsZVBhdGhUb0lkLmdldCh0aGlzLnJlc29sdmVBYnNvbHV0ZVBhdGgoYWJzb2x1dGVQYXRoKSk7XG4gICAgaWYgKCFlbGVtZW50SWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmVsZW1lbnRzLmdldChlbGVtZW50SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3RlY3RlZCBjYWNoZSBsb29rdXAgYnkgYWJzb2x1dGUgcGF0aC5cbiAgICogQWxsb3dzIHN1YmNsYXNzZXMgd2l0aCBjdXN0b20gbG9hZCgpIG92ZXJyaWRlcyAoZS5nLiBNZW1vcnlNYW5hZ2VyKVxuICAgKiB0byBjaGVjayB0aGUgTFJVIGNhY2hlIGJlZm9yZSByZS1yZWFkaW5nIGZyb20gZGlzay5cbiAgICovXG4gIHByb3RlY3RlZCBnZXRDYWNoZWRCeUFic29sdXRlUGF0aChhYnNvbHV0ZVBhdGg6IHN0cmluZyk6IFQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmdldENhY2hlZEVsZW1lbnRCeUFic29sdXRlUGF0aChhYnNvbHV0ZVBhdGgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBsb2FkRWxlbWVudFNuYXBzaG90KGFic29sdXRlUGF0aDogc3RyaW5nLCByZWxhdGl2ZVBhdGg6IHN0cmluZyk6IFByb21pc2U8VD4ge1xuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMuZ2V0Q2FjaGVkRWxlbWVudEJ5QWJzb2x1dGVQYXRoKGFic29sdXRlUGF0aCk7XG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcmV0dXJuIGNhY2hlZDtcbiAgICB9XG5cbiAgICBjb25zdCByYXcgPSBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLnJlYWRFbGVtZW50RmlsZShhYnNvbHV0ZVBhdGgsIHRoaXMuZWxlbWVudFR5cGUsIHtcbiAgICAgIHNvdXJjZTogYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfS5sb2FkRWxlbWVudFNuYXBzaG90YFxuICAgIH0pO1xuICAgIGNvbnN0IHBhcnNlZCA9IFNlY3VyZVlhbWxQYXJzZXIuc2FmZU1hdHRlcihyYXcsIHVuZGVmaW5lZCwge1xuICAgICAgY29udGVudENvbnRleHQ6IEJhc2VFbGVtZW50TWFuYWdlci5FTEVNRU5UX1RZUEVfVE9fQ09OVEVYVFt0aGlzLmVsZW1lbnRUeXBlXSxcbiAgICB9KTtcbiAgICBjb25zdCBtZXRhZGF0YSA9IGF3YWl0IHRoaXMucGFyc2VNZXRhZGF0YShwYXJzZWQuZGF0YSk7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuY3JlYXRlRWxlbWVudChtZXRhZGF0YSwgcGFyc2VkLmNvbnRlbnQpO1xuICAgIHRoaXMuY2FjaGVFbGVtZW50KGVsZW1lbnQsIHJlbGF0aXZlUGF0aCk7XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHN0YW5kYXJkaXplZCBldmVudCBwYXlsb2FkIGZvciBlbGVtZW50IGxpZmVjeWNsZSBldmVudHMuXG4gICAqXG4gICAqIFRoaXMgaGVscGVyIGlzIGF2YWlsYWJsZSB0byBzdWJjbGFzc2VzIHRvIGVuc3VyZSBjb25zaXN0ZW50IGV2ZW50IHBheWxvYWRcbiAgICogc3RydWN0dXJlIHdoZW4gZW1pdHRpbmcgY3VzdG9tIGV2ZW50cyB2aWEgdGhlIGRpc3BhdGNoZXIgZ2V0dGVyLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gRXZlbnQgcGFyYW1ldGVycyBpbmNsdWRpbmcgY29ycmVsYXRpb24gSUQsIGVsZW1lbnQsIGZpbGUgcGF0aCwgYW5kIG9wdGlvbmFsIGVycm9yXG4gICAqIEByZXR1cm5zIEZ1bGx5LWZvcm1lZCBFbGVtZW50RXZlbnRQYXlsb2FkIHJlYWR5IGZvciBlbWlzc2lvblxuICAgKi9cbiAgcHJvdGVjdGVkIGNyZWF0ZUV2ZW50UGF5bG9hZChwYXJhbXM6IHtcbiAgICBjb3JyZWxhdGlvbklkOiBzdHJpbmc7XG4gICAgZmlsZVBhdGg/OiBzdHJpbmc7XG4gICAgZWxlbWVudD86IFQ7XG4gICAgZXJyb3I/OiB1bmtub3duO1xuICB9KTogRWxlbWVudEV2ZW50UGF5bG9hZCB7XG4gICAgY29uc3QgZWxlbWVudElkID0gcGFyYW1zLmVsZW1lbnQ/LmlkO1xuICAgIGNvbnN0IGdlbmVyYXRpb24gPSBlbGVtZW50SWQgIT09IHVuZGVmaW5lZCA/IHRoaXMuZWxlbWVudEdlbmVyYXRpb25zLmdldChlbGVtZW50SWQpIDogdW5kZWZpbmVkO1xuICAgIHJldHVybiB7XG4gICAgICBjb3JyZWxhdGlvbklkOiBwYXJhbXMuY29ycmVsYXRpb25JZCxcbiAgICAgIGVsZW1lbnRUeXBlOiB0aGlzLmVsZW1lbnRUeXBlLFxuICAgICAgZWxlbWVudElkLFxuICAgICAgZmlsZVBhdGg6IHBhcmFtcy5maWxlUGF0aCxcbiAgICAgIG1ldGFkYXRhOiBFbGVtZW50RXZlbnREaXNwYXRjaGVyLnNuYXBzaG90TWV0YWRhdGEocGFyYW1zLmVsZW1lbnQpLFxuICAgICAgZ2VuZXJhdGlvbixcbiAgICAgIGVycm9yOiBwYXJhbXMuZXJyb3JcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVFeHRlcm5hbENoYW5nZShyZWxhdGl2ZVBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMudW5jYWNoZUJ5UGF0aChyZWxhdGl2ZVBhdGgpO1xuICAgIHRoaXMuc3RvcmFnZUxheWVyLmludmFsaWRhdGUoKTtcbiAgICAvLyBDbGVhciBlcnJvciBzdXBwcmVzc2lvbiBzbyBhIGNoYW5nZWQgZmlsZSBnZXRzIGZyZXNoIGxvZ2dpbmdcbiAgICB0aGlzLmludmFsaWRFbGVtZW50cy5kZWxldGUocmVsYXRpdmVQYXRoKTtcbiAgICB0aGlzLnN1cHByZXNzZWRMb2FkUGF0aHMuZGVsZXRlKHJlbGF0aXZlUGF0aCk7XG4gICAgY29uc3QgY29ycmVsYXRpb25JZCA9IHJhbmRvbVVVSUQoKTtcbiAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlci5lbWl0QXN5bmMoXG4gICAgICAnZWxlbWVudDpleHRlcm5hbC1jaGFuZ2UnLFxuICAgICAgdGhpcy5jcmVhdGVFdmVudFBheWxvYWQoeyBjb3JyZWxhdGlvbklkLCBmaWxlUGF0aDogcmVsYXRpdmVQYXRoIH0pXG4gICAgKTtcblxuICAgIGlmICh0aGlzLmF1dG9SZWxvYWRPbkV4dGVybmFsQ2hhbmdlKSB7XG4gICAgICB2b2lkIHRoaXMubG9hZChyZWxhdGl2ZVBhdGgpLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICBsb2dnZXIud2FybignQXV0byByZWxvYWQgYWZ0ZXIgZXh0ZXJuYWwgY2hhbmdlIGZhaWxlZCcsIHtcbiAgICAgICAgICBlbGVtZW50VHlwZTogdGhpcy5lbGVtZW50VHlwZSxcbiAgICAgICAgICBmaWxlUGF0aDogcmVsYXRpdmVQYXRoLFxuICAgICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IGVycm9yXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cblxuICAvKipcbiAgICogQWRkcyBhbiBlbGVtZW50IHRvIGJvdGggY2FjaGVzIChiaWRpcmVjdGlvbmFsIG1hcHBpbmcpXG4gICAqIEBwYXJhbSBlbGVtZW50IC0gRWxlbWVudCB0byBjYWNoZVxuICAgKiBAcGFyYW0gZmlsZVBhdGggLSBGaWxlIHBhdGggKHJlbGF0aXZlIG9yIGFic29sdXRlKVxuICAgKi9cbiAgcHJvdGVjdGVkIGNhY2hlRWxlbWVudChlbGVtZW50OiBULCBmaWxlUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgYWJzb2x1dGVQYXRoID0gdGhpcy5yZXNvbHZlQWJzb2x1dGVQYXRoKGZpbGVQYXRoKTtcblxuICAgIC8vIENsZWFyIGFueSBzdGFsZSBjYWNoZSBlbnRyaWVzIGZvciB0aGlzIGZpbGVwYXRoIGJlZm9yZSBhZGRpbmcgdGhlIG5ldyBvbmUuXG4gICAgLy8gVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBnZW5lcmF0ZUlkKCkgaW4gQmFzZUVsZW1lbnQudHMgaW5jbHVkZXMgYSBEYXRlLm5vdygpXG4gICAgLy8gdGltZXN0YW1wLCBjYXVzaW5nIGVhY2ggbG9hZCBmcm9tIGRpc2sgdG8gZ2VuZXJhdGUgYSBkaWZmZXJlbnQgSUQuIFdpdGhvdXQgdGhpc1xuICAgIC8vIGNsZWFudXAsIG9sZCBJRHMgcmVtYWluIGluIHRoZSBjYWNoZSBhcyBzdGFsZSBkYXRhLCBsZWFkaW5nIHRvIGluY29uc2lzdGVudFxuICAgIC8vIHJlc3VsdHMgaW4gbWV0aG9kcyBsaWtlIGZpbmRQZXJzb25hKCkgb3IgbGlzdCgpLlxuICAgIGNvbnN0IGV4aXN0aW5nSWQgPSB0aGlzLmZpbGVQYXRoVG9JZC5nZXQoYWJzb2x1dGVQYXRoKTtcbiAgICBpZiAoZXhpc3RpbmdJZCAmJiBleGlzdGluZ0lkICE9PSBlbGVtZW50LmlkKSB7XG4gICAgICAvLyBDbGVhciBzdGFsZSBjYWNoZSBlbnRyeSB3aGVuIGVsZW1lbnQgSUQgaGFzIGNoYW5nZWRcbiAgICAgIHRoaXMuZWxlbWVudHMuZGVsZXRlKGV4aXN0aW5nSWQpO1xuICAgICAgdGhpcy5lbGVtZW50R2VuZXJhdGlvbnMuZGVsZXRlKGV4aXN0aW5nSWQpO1xuICAgIH1cblxuICAgIHRoaXMuZWxlbWVudHMuc2V0KGVsZW1lbnQuaWQsIGVsZW1lbnQpO1xuICAgIHRoaXMuZmlsZVBhdGhUb0lkLnNldChhYnNvbHV0ZVBhdGgsIGVsZW1lbnQuaWQpO1xuICAgIGNvbnN0IGdlbmVyYXRpb24gPSArK3RoaXMuY2FjaGVHZW5lcmF0aW9uQ291bnRlcjtcbiAgICB0aGlzLmVsZW1lbnRHZW5lcmF0aW9ucy5zZXQoZWxlbWVudC5pZCwgZ2VuZXJhdGlvbik7XG5cbiAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLmlzQWJzb2x1dGUoZmlsZVBhdGgpXG4gICAgICA/IHBhdGgucmVsYXRpdmUodGhpcy5lbGVtZW50RGlyLCBmaWxlUGF0aClcbiAgICAgIDogZmlsZVBhdGg7XG5cbiAgICB0cnkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW1lbnQsICdmaWxlbmFtZScsIHtcbiAgICAgICAgdmFsdWU6IHBhdGguYmFzZW5hbWUocmVsYXRpdmVQYXRoKSxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgfSk7XG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50LCAnZmlsZVBhdGgnLCB7XG4gICAgICAgIHZhbHVlOiByZWxhdGl2ZVBhdGgsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZGVidWcoJ0ZhaWxlZCB0byBhdHRhY2ggZmlsZW5hbWUgbWV0YWRhdGEgdG8gZWxlbWVudCcsIHtcbiAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICAgICAgZWxlbWVudElkOiBlbGVtZW50LmlkLFxuICAgICAgICBmaWxlUGF0aDogcmVsYXRpdmVQYXRoXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhbiBlbGVtZW50IGZyb20gYm90aCBjYWNoZXMgYnkgZmlsZSBwYXRoXG4gICAqIFRoaXMgaXMgdGhlIHByZWZlcnJlZCBtZXRob2QgZm9yIGRlbGV0aW9uIHRvIGF2b2lkIHN0YWxlIGNhY2hlIGVudHJpZXNcbiAgICogQHBhcmFtIGZpbGVQYXRoIC0gRmlsZSBwYXRoIChyZWxhdGl2ZSBvciBhYnNvbHV0ZSlcbiAgICovXG4gIHByb3RlY3RlZCB1bmNhY2hlQnlQYXRoKGZpbGVQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSB0aGlzLnJlc29sdmVBYnNvbHV0ZVBhdGgoZmlsZVBhdGgpO1xuICAgIGNvbnN0IGVsZW1lbnRJZCA9IHRoaXMuZmlsZVBhdGhUb0lkLmdldChhYnNvbHV0ZVBhdGgpO1xuXG4gICAgaWYgKGVsZW1lbnRJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmVsZW1lbnRzLmRlbGV0ZShlbGVtZW50SWQpO1xuICAgICAgdGhpcy5maWxlUGF0aFRvSWQuZGVsZXRlKGFic29sdXRlUGF0aCk7XG4gICAgICB0aGlzLmVsZW1lbnRHZW5lcmF0aW9ucy5kZWxldGUoZWxlbWVudElkKTtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgVW5jYWNoZWQgZWxlbWVudCAke2VsZW1lbnRJZH0gZnJvbSAke2Fic29sdXRlUGF0aH1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgYWxsIGNhY2hlZCBlbGVtZW50c1xuICAgKi9cbiAgY2xlYXJDYWNoZSgpOiB2b2lkIHtcbiAgICB0aGlzLmVsZW1lbnRzLmNsZWFyKCk7XG4gICAgdGhpcy5maWxlUGF0aFRvSWQuY2xlYXIoKTtcbiAgICB0aGlzLmVsZW1lbnRHZW5lcmF0aW9ucy5jbGVhcigpO1xuICAgIHRoaXMuc3RvcmFnZUxheWVyLmNsZWFyKCk7XG4gICAgdGhpcy5zdXBwcmVzc2VkTG9hZFBhdGhzLmNsZWFyKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGNhY2hlIHN0YXRpc3RpY3MgZm9yIGRlYnVnZ2luZ1xuICAgKiBAcmV0dXJucyBPYmplY3Qgd2l0aCBjYWNoZSBzaXplIG1ldHJpY3NcbiAgICovXG4gIHByb3RlY3RlZCBnZXRDYWNoZVN0YXRzKCk6IHsgZWxlbWVudENvdW50OiBudW1iZXI7IHBhdGhNYXBwaW5nczogbnVtYmVyIH0ge1xuICAgIGNvbnN0IGVsZW1lbnRzU3RhdHMgPSB0aGlzLmVsZW1lbnRzLmdldFN0YXRzKCk7XG4gICAgY29uc3QgcGF0aFN0YXRzID0gdGhpcy5maWxlUGF0aFRvSWQuZ2V0U3RhdHMoKTtcblxuICAgIHJldHVybiB7XG4gICAgICBlbGVtZW50Q291bnQ6IGVsZW1lbnRzU3RhdHMuc2l6ZSxcbiAgICAgIHBhdGhNYXBwaW5nczogcGF0aFN0YXRzLnNpemVcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cG9zZSBpbnRlcm5hbCBMUlUgY2FjaGUgaW5zdGFuY2VzIGZvciBtZXRyaWNzIGNvbGxlY3Rpb24uXG4gICAqL1xuICBwdWJsaWMgZ2V0TWV0cmljc0NhY2hlcygpOiBBcnJheTx7IG5hbWU6IHN0cmluZzsgaW5zdGFuY2U6IExSVUNhY2hlPHVua25vd24+IH0+IHtcbiAgICByZXR1cm4gW1xuICAgICAgeyBuYW1lOiBgZWxlbWVudHM6JHt0aGlzLmVsZW1lbnRUeXBlfWAsIGluc3RhbmNlOiB0aGlzLmVsZW1lbnRzIGFzIExSVUNhY2hlPHVua25vd24+IH0sXG4gICAgICB7IG5hbWU6IGBwYXRoSW5kZXg6JHt0aGlzLmVsZW1lbnRUeXBlfWAsIGluc3RhbmNlOiB0aGlzLmZpbGVQYXRoVG9JZCBhcyBMUlVDYWNoZTx1bmtub3duPiB9LFxuICAgIF07XG4gIH1cblxuICAvKipcbiAgICogRGlzcG9zZSBvZiByZXNvdXJjZXMgYW5kIGNsZWFudXBcbiAgICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdG8gYWRkIHRoZWlyIG93biBjbGVhbnVwIGxvZ2ljXG4gICAqL1xuICBwdWJsaWMgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tZW1vcnlCdWRnZXQpIHtcbiAgICAgIHRoaXMubWVtb3J5QnVkZ2V0LnVucmVnaXN0ZXIodGhpcy5lbGVtZW50cyk7XG4gICAgICB0aGlzLm1lbW9yeUJ1ZGdldC51bnJlZ2lzdGVyKHRoaXMuZmlsZVBhdGhUb0lkKTtcbiAgICB9XG4gICAgdGhpcy5lbGVtZW50cy5jbGVhcigpO1xuICAgIHRoaXMuZmlsZVBhdGhUb0lkLmNsZWFyKCk7XG4gICAgdGhpcy5lbGVtZW50R2VuZXJhdGlvbnMuY2xlYXIoKTtcbiAgICB0aGlzLnN0b3JhZ2VMYXllci5jbGVhcigpO1xuICAgIHRoaXMud2F0Y2hlckNsZWFudXA/LigpO1xuICAgIHRoaXMud2F0Y2hlckNsZWFudXAgPSB1bmRlZmluZWQ7XG4gICAgbG9nZ2VyLmRlYnVnKGAke3RoaXMuZ2V0RWxlbWVudExhYmVsQ2FwaXRhbGl6ZWQoKX1NYW5hZ2VyIGRpc3Bvc2VkIGFuZCBjYWNoZXMgY2xlYXJlZGApO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gRklMRU5BTUUgTk9STUFMSVpBVElPTiBNRVRIT0RTXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIE5vcm1hbGl6ZSBhIG5hbWUgdG8ga2ViYWItY2FzZSBmb3IgY29uc2lzdGVudCBmaWxlbmFtZSBmb3JtYXR0aW5nLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBwcm92aWRlcyB1bmlmaWVkIGZpbGVuYW1lIG5vcm1hbGl6YXRpb24gYWNyb3NzIGFsbCBlbGVtZW50IG1hbmFnZXJzLFxuICAgKiBlbnN1cmluZyBjb25zaXN0ZW50IG5hbWluZyByZWdhcmRsZXNzIG9mIHRoZSBpbnB1dCBmb3JtYXQgKENhbWVsQ2FzZSwgc3BhY2VzLFxuICAgKiB1bmRlcnNjb3JlcywgbWl4ZWQgY2FzZSwgZXRjLikuXG4gICAqXG4gICAqIFRyYW5zZm9ybWF0aW9ucyBhcHBsaWVkIChpbiBvcmRlcik6XG4gICAqIDEuIEluc2VydCBoeXBoZW5zIGJldHdlZW4gY2FtZWxDYXNlIGJvdW5kYXJpZXMgKE15TmFtZSAtPiBNeS1OYW1lKVxuICAgKiAyLiBSZXBsYWNlIHNwYWNlcyBhbmQgdW5kZXJzY29yZXMgd2l0aCBoeXBoZW5zXG4gICAqIDMuIENvbnZlcnQgdG8gbG93ZXJjYXNlXG4gICAqIDQuIFN0cmlwIGludmFsaWQgY2hhcmFjdGVycyAoa2VlcCBvbmx5IGEteiwgMC05LCAtKVxuICAgKiA1LiBDb2xsYXBzZSBtdWx0aXBsZSBjb25zZWN1dGl2ZSBoeXBoZW5zXG4gICAqIDYuIFRyaW0gbGVhZGluZy90cmFpbGluZyBoeXBoZW5zXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIG5vcm1hbGl6ZUZpbGVuYW1lKFwiQ1JVRFYtQWdlbnQtRGVsdGFcIikgLy8gXCJjcnVkdi1hZ2VudC1kZWx0YVwiXG4gICAqIG5vcm1hbGl6ZUZpbGVuYW1lKFwiQ3JlYXRpdmUgV3JpdGVyXCIpICAgLy8gXCJjcmVhdGl2ZS13cml0ZXJcIlxuICAgKiBub3JtYWxpemVGaWxlbmFtZShcIkNhbWVsQ2FzZU5hbWVcIikgICAgIC8vIFwiY2FtZWwtY2FzZS1uYW1lXCJcbiAgICogbm9ybWFsaXplRmlsZW5hbWUoXCJteV9za2lsbF9uYW1lXCIpICAgICAvLyBcIm15LXNraWxsLW5hbWVcIlxuICAgKiBub3JtYWxpemVGaWxlbmFtZShcIlNwZWNpYWxAQ2hhcnMhXCIpICAgIC8vIFwic3BlY2lhbC1jaGFyc1wiXG4gICAqIG5vcm1hbGl6ZUZpbGVuYW1lKFwiLS1sZWFkaW5nLWFuZC10cmFpbGluZy0tXCIpIC8vIFwibGVhZGluZy1hbmQtdHJhaWxpbmdcIlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBlbGVtZW50IG5hbWUgdG8gbm9ybWFsaXplXG4gICAqIEByZXR1cm5zIE5vcm1hbGl6ZWQga2ViYWItY2FzZSBmaWxlbmFtZSAod2l0aG91dCBleHRlbnNpb24pXG4gICAqL1xuICBwcm90ZWN0ZWQgbm9ybWFsaXplRmlsZW5hbWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIW5hbWUgfHwgbmFtZS50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gJ3VubmFtZWQnO1xuICAgIH1cblxuICAgIHJldHVybiBuYW1lXG4gICAgICAvLyBTdGVwIDE6IEluc2VydCBoeXBoZW5zIGJldHdlZW4gY2FtZWxDYXNlIGJvdW5kYXJpZXMgKGxvd2VyY2FzZSBmb2xsb3dlZCBieSB1cHBlcmNhc2UpXG4gICAgICAucmVwbGFjZSgvKFthLXpdKShbQS1aXSkvZywgJyQxLSQyJylcbiAgICAgIC8vIFN0ZXAgMjogUmVwbGFjZSBzcGFjZXMgYW5kIHVuZGVyc2NvcmVzIHdpdGggaHlwaGVuc1xuICAgICAgLnJlcGxhY2UoL1tcXHNfXSsvZywgJy0nKVxuICAgICAgLy8gU3RlcCAzOiBDb252ZXJ0IHRvIGxvd2VyY2FzZVxuICAgICAgLnRvTG93ZXJDYXNlKClcbiAgICAgIC8vIFN0ZXAgNDogU3RyaXAgaW52YWxpZCBjaGFyYWN0ZXJzIChrZWVwIG9ubHkgYWxwaGFudW1lcmljIGFuZCBoeXBoZW5zKVxuICAgICAgLnJlcGxhY2UoL1teYS16MC05LV0vZywgJy0nKVxuICAgICAgLy8gU3RlcCA1OiBDb2xsYXBzZSBtdWx0aXBsZSBjb25zZWN1dGl2ZSBoeXBoZW5zXG4gICAgICAucmVwbGFjZSgvLSsvZywgJy0nKVxuICAgICAgLy8gU3RlcCA2OiBUcmltIGxlYWRpbmcgYW5kIHRyYWlsaW5nIGh5cGhlbnNcbiAgICAgIC5yZXBsYWNlKC9eLSt8LSskL2csICcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHN0YW5kYXJkaXplZCBmaWxlbmFtZSBmb3IgYW4gZWxlbWVudC5cbiAgICpcbiAgICogTm9ybWFsaXplcyB0aGUgZWxlbWVudCBuYW1lIChoYW5kbGluZyBDYW1lbENhc2UsIHNwYWNlcywgdW5kZXJzY29yZXMsIGV0Yy4pXG4gICAqIGFuZCBhcHBlbmRzIHRoZSBmaWxlIGV4dGVuc2lvbi4gVGhlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgKHBlcnNvbmFzLywgc2tpbGxzLywgZXRjLilcbiAgICogYWxyZWFkeSBwcm92aWRlcyB0eXBlIGNvbnRleHQsIHNvIHRoZSB0eXBlIGlzIE5PVCBpbmNsdWRlZCBpbiB0aGUgZmlsZW5hbWUuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIGVsZW1lbnQgbmFtZSB0byBjb252ZXJ0IHRvIGEgZmlsZW5hbWVcbiAgICogQHJldHVybnMgVGhlIHN0YW5kYXJkaXplZCBmaWxlbmFtZSAoZS5nLiwgXCJjb2RlLXJldmlldy5tZFwiKVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBnZXRFbGVtZW50RmlsZW5hbWUoXCJDb2RlIFJldmlld1wiKSAgICAgICAgIC8vIOKGkiBcImNvZGUtcmV2aWV3Lm1kXCJcbiAgICogZ2V0RWxlbWVudEZpbGVuYW1lKFwiRGVidWcgRGV0ZWN0aXZlXCIpICAgICAvLyDihpIgXCJkZWJ1Zy1kZXRlY3RpdmUubWRcIlxuICAgKiBnZXRFbGVtZW50RmlsZW5hbWUoXCJCdWdSZXBvcnRcIikgICAgICAgICAgIC8vIOKGkiBcImJ1Zy1yZXBvcnQubWRcIiAoQ2FtZWxDYXNlIHNwbGl0KVxuICAgKiBnZXRFbGVtZW50RmlsZW5hbWUoXCJmaXgtcGVyc29uYS1oZWxwZXJcIikgIC8vIOKGkiBcImZpeC1wZXJzb25hLWhlbHBlci5tZFwiIChubyBtYW5nbGluZylcbiAgICovXG4gIHByb3RlY3RlZCBnZXRFbGVtZW50RmlsZW5hbWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBub3JtYWxpemVkTmFtZSA9IHRoaXMubm9ybWFsaXplRmlsZW5hbWUobmFtZSkgfHwgJ3VubmFtZWQnO1xuICAgIGNvbnN0IGV4dGVuc2lvbiA9IHRoaXMuZ2V0RmlsZUV4dGVuc2lvbigpO1xuICAgIHJldHVybiBgJHtub3JtYWxpemVkTmFtZX0ke2V4dGVuc2lvbn1gO1xuICB9XG5cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBBQlNUUkFDVCBNRVRIT0RTIC0gU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudFxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBQYXJzZSBhbmQgdmFsaWRhdGUgbWV0YWRhdGEgZnJvbSBmcm9udG1hdHRlclxuICAgKiBTdWJjbGFzc2VzIGltcGxlbWVudCBlbGVtZW50LXNwZWNpZmljIHZhbGlkYXRpb24gbG9naWNcbiAgICpcbiAgICogQHBhcmFtIGRhdGEgLSBSYXcgbWV0YWRhdGEgZnJvbSBZQU1MIGZyb250bWF0dGVyXG4gICAqIEByZXR1cm5zIFZhbGlkYXRlZCBhbmQgdHlwZWQgbWV0YWRhdGFcbiAgICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBwYXJzZU1ldGFkYXRhKGRhdGE6IGFueSk6IFByb21pc2U8VFsnbWV0YWRhdGEnXT47XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFVzZSBFbGVtZW50VmFsaWRhdG9yIHZpYSBWYWxpZGF0aW9uUmVnaXN0cnkgaW5zdGVhZC5cbiAgICogV2lsbCBiZSByZW1vdmVkIGluIG5leHQgbWFqb3IgdmVyc2lvbi5cbiAgICovXG4gIGFzeW5jIHZhbGlkYXRlTWV0YWRhdGEobWV0YWRhdGE6IGFueSwgX3N0cmljdD86IGJvb2xlYW4pOiBQcm9taXNlPGltcG9ydCgnLi4vLi4vdXRpbHMvdmFsaWRhdGlvbi9GaWVsZFZhbGlkYXRvci5qcycpLlZhbGlkYXRpb25FcnJvcltdPiB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy52YWxpZGF0b3IudmFsaWRhdGVNZXRhZGF0YShtZXRhZGF0YSk7XG4gICAgcmV0dXJuIHJlc3VsdC5lcnJvcnMubWFwKGUgPT4gKHsgZmllbGQ6ICdnZW5lcmFsJywgbWVzc2FnZTogZSB9KSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIGVsZW1lbnQgaW5zdGFuY2UgZnJvbSBtZXRhZGF0YSBhbmQgY29udGVudFxuICAgKiBTdWJjbGFzc2VzIGltcGxlbWVudCBlbGVtZW50LXNwZWNpZmljIGNvbnN0cnVjdGlvblxuICAgKlxuICAgKiBAcGFyYW0gbWV0YWRhdGEgLSBWYWxpZGF0ZWQgbWV0YWRhdGFcbiAgICogQHBhcmFtIGNvbnRlbnQgLSBFbGVtZW50IGNvbnRlbnQgKGluc3RydWN0aW9ucywgdGVtcGxhdGUsIGV0Yy4pXG4gICAqIEByZXR1cm5zIE5ldyBlbGVtZW50IGluc3RhbmNlXG4gICAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgY3JlYXRlRWxlbWVudChtZXRhZGF0YTogVFsnbWV0YWRhdGEnXSwgY29udGVudDogc3RyaW5nKTogVDtcblxuICAvKipcbiAgICogU2VyaWFsaXplIGFuIGVsZW1lbnQgdG8gZmlsZSBjb250ZW50XG4gICAqIFN1YmNsYXNzZXMgY2FuIGN1c3RvbWl6ZSBzZXJpYWxpemF0aW9uIGZvcm1hdFxuICAgKlxuICAgKiBAcGFyYW0gZWxlbWVudCAtIEVsZW1lbnQgdG8gc2VyaWFsaXplXG4gICAqIEByZXR1cm5zIEZpbGUgY29udGVudCAodXN1YWxseSBtYXJrZG93biB3aXRoIGZyb250bWF0dGVyKVxuICAgKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IHNlcmlhbGl6ZUVsZW1lbnQoZWxlbWVudDogVCk6IFByb21pc2U8c3RyaW5nPjtcblxuICAvKipcbiAgICogR2V0IHRoZSBmaWxlIGV4dGVuc2lvbiBmb3IgdGhpcyBlbGVtZW50IHR5cGVcbiAgICogTW9zdCBlbGVtZW50cyB1c2UgLm1kLCBidXQgc3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGVcbiAgICovXG4gIGFic3RyYWN0IGdldEZpbGVFeHRlbnNpb24oKTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJbXBvcnQgYW4gZWxlbWVudCBmcm9tIGV4dGVybmFsIGZvcm1hdFxuICAgKiBTdWJjbGFzc2VzIGltcGxlbWVudCBmb3JtYXQtc3BlY2lmaWMgaW1wb3J0IGxvZ2ljXG4gICAqL1xuICBhYnN0cmFjdCBpbXBvcnRFbGVtZW50KGRhdGE6IHN0cmluZywgZm9ybWF0PzogJ2pzb24nIHwgJ3lhbWwnIHwgJ21hcmtkb3duJyk6IFByb21pc2U8VD47XG5cbiAgLyoqXG4gICAqIEV4cG9ydCBhbiBlbGVtZW50IHRvIGV4dGVybmFsIGZvcm1hdFxuICAgKiBTdWJjbGFzc2VzIGltcGxlbWVudCBmb3JtYXQtc3BlY2lmaWMgZXhwb3J0IGxvZ2ljXG4gICAqL1xuICBhYnN0cmFjdCBleHBvcnRFbGVtZW50KGVsZW1lbnQ6IFQsIGZvcm1hdD86ICdqc29uJyB8ICd5YW1sJyB8ICdtYXJrZG93bicpOiBQcm9taXNlPHN0cmluZz47XG59XG4iXX0=
|
|
1039
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmFzZUVsZW1lbnRNYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL2Jhc2UvQmFzZUVsZW1lbnRNYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFHekMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRXZELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUvQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ25ELE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNoRSxPQUFPLEVBQUUsc0JBQXNCLEVBQXVCLE1BQU0sd0NBQXdDLENBQUM7QUFDckcsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFLdkUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFHM0UsT0FBTyxFQUNMLHdCQUF3QixFQUN4QiwyQkFBMkIsRUFDM0Isd0JBQXdCLEVBQ3pCLE1BQU0sdUNBQXVDLENBQUM7QUFJL0MsTUFBTSw0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QUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDcEUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQmFzZUVsZW1lbnRNYW5hZ2VyIC0gQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYWxsIGVsZW1lbnQgbWFuYWdlcnNcbiAqXG4gKiBQcm92aWRlcyBjb21tb24gQ1JVRCBvcGVyYXRpb25zIGZvciBhbGwgZWxlbWVudCB0eXBlcyB1c2luZyB0aGVcbiAqIFRlbXBsYXRlIE1ldGhvZCBQYXR0ZXJuOlxuICogLSBEZWZpbmVzIHRoZSBza2VsZXRvbiBvZiBvcGVyYXRpb25zIGluIGJhc2UgY2xhc3NcbiAqIC0gTGV0cyBzdWJjbGFzc2VzIG92ZXJyaWRlIHNwZWNpZmljIHN0ZXBzIHdpdGhvdXQgY2hhbmdpbmcgc3RydWN0dXJlXG4gKlxuICogU3ViY2xhc3NlczogU2tpbGxNYW5hZ2VyLCBUZW1wbGF0ZU1hbmFnZXIsIEFnZW50TWFuYWdlciwgTWVtb3J5TWFuYWdlclxuICpcbiAqIFNFQ1VSSVRZOlxuICogMS4gQ1JJVElDQUw6IFVzZXMgRmlsZUxvY2tNYW5hZ2VyIGZvciBhdG9taWMgcmVhZC93cml0ZSBvcGVyYXRpb25zXG4gKiAyLiBISUdIOiBQYXRoIHZhbGlkYXRpb24gYW5kIHNhbml0aXphdGlvbiB0byBwcmV2ZW50IHRyYXZlcnNhbCBhdHRhY2tzXG4gKiAzLiBNRURJVU06IFNlY3VyaXR5IGV2ZW50IGxvZ2dpbmcgZm9yIGF1ZGl0IHRyYWlsXG4gKiA0LiBNRURJVU06IElucHV0IHZhbGlkYXRpb24gYW5kIHNhbml0aXphdGlvbiB0aHJvdWdob3V0XG4gKi9cblxuaW1wb3J0IHsgcmFuZG9tVVVJRCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCB7IElFbGVtZW50TWFuYWdlciB9IGZyb20gJy4uLy4uL3R5cGVzL2VsZW1lbnRzL0lFbGVtZW50TWFuYWdlci5qcyc7XG5pbXBvcnQgeyBJRWxlbWVudCwgRWxlbWVudFZhbGlkYXRpb25SZXN1bHQgfSBmcm9tICcuLi8uLi90eXBlcy9lbGVtZW50cy9JRWxlbWVudC5qcyc7XG5pbXBvcnQgeyBFbGVtZW50VHlwZSB9IGZyb20gJy4uLy4uL3BvcnRmb2xpby90eXBlcy5qcyc7XG5pbXBvcnQgeyBQb3J0Zm9saW9NYW5hZ2VyIH0gZnJvbSAnLi4vLi4vcG9ydGZvbGlvL1BvcnRmb2xpb01hbmFnZXIuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IEZpbGVMb2NrTWFuYWdlciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L2ZpbGVMb2NrTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuaW1wb3J0IHsgc2FuaXRpemVJbnB1dCB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L0lucHV0VmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IENvbnRlbnRWYWxpZGF0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9jb250ZW50VmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IFNlY3VyaXR5RXJyb3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9lcnJvcnMuanMnO1xuaW1wb3J0IHsgU0VDVVJJVFlfTElNSVRTIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IExSVUNhY2hlIH0gZnJvbSAnLi4vLi4vY2FjaGUvTFJVQ2FjaGUuanMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IFNlY3VyZVlhbWxQYXJzZXIgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9zZWN1cmVZYW1sUGFyc2VyLmpzJztcbmltcG9ydCB7IFBhdGhWYWxpZGF0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9wYXRoVmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IEVsZW1lbnRFdmVudERpc3BhdGNoZXIsIEVsZW1lbnRFdmVudFBheWxvYWQgfSBmcm9tICcuLi8uLi9ldmVudHMvRWxlbWVudEV2ZW50RGlzcGF0Y2hlci5qcyc7XG5pbXBvcnQgeyBFbGVtZW50VHJhbnNhY3Rpb25TY29wZSB9IGZyb20gJy4vRWxlbWVudFRyYW5zYWN0aW9uU2NvcGUuanMnO1xuaW1wb3J0IHsgRmlsZVdhdGNoU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL0ZpbGVXYXRjaFNlcnZpY2UuanMnO1xuaW1wb3J0IHsgRmlsZU9wZXJhdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvRmlsZU9wZXJhdGlvbnNTZXJ2aWNlLmpzJztcbmltcG9ydCB7IFZhbGlkYXRpb25SZWdpc3RyeSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlZ2lzdHJ5LmpzJztcbmltcG9ydCB7IHR5cGUgRWxlbWVudFZhbGlkYXRvciB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3ZhbGlkYXRpb24vRWxlbWVudFZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBFbGVtZW50U3RvcmFnZUxheWVyIH0gZnJvbSAnLi4vLi4vc3RvcmFnZS9FbGVtZW50U3RvcmFnZUxheWVyLmpzJztcbmltcG9ydCB0eXBlIHsgSVN0b3JhZ2VMYXllciB9IGZyb20gJy4uLy4uL3N0b3JhZ2UvSVN0b3JhZ2VMYXllci5qcyc7XG5pbXBvcnQgdHlwZSB7IEVsZW1lbnRJbmRleEVudHJ5IH0gZnJvbSAnLi4vLi4vc3RvcmFnZS90eXBlcy5qcyc7XG5pbXBvcnQge1xuICBnZXRWYWxpZGF0ZWRTY2FuQ29vbGRvd24sXG4gIGdldFZhbGlkYXRlZEVsZW1lbnRDYWNoZVRUTCxcbiAgZ2V0VmFsaWRhdGVkUGF0aENhY2hlVFRMXG59IGZyb20gJy4uLy4uL2NvbmZpZy9wZXJmb3JtYW5jZS1jb25zdGFudHMuanMnO1xuaW1wb3J0IHR5cGUgeyBDYWNoZU1lbW9yeUJ1ZGdldCB9IGZyb20gJy4uLy4uL2NhY2hlL0NhY2hlTWVtb3J5QnVkZ2V0LmpzJztcbmltcG9ydCB0eXBlIHsgQmFja3VwU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL0JhY2t1cFNlcnZpY2UuanMnO1xuXG5jb25zdCBERUZBVUxUX0VMRU1FTlRfQ0FDSEVfVFRMX01TID0gZ2V0VmFsaWRhdGVkRWxlbWVudENhY2hlVFRMKCk7XG5jb25zdCBERUZBVUxUX1BBVEhfQ0FDSEVfVFRMX01TID0gZ2V0VmFsaWRhdGVkUGF0aENhY2hlVFRMKCk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZUVsZW1lbnRNYW5hZ2VyT3B0aW9ucyB7XG4gIGVsZW1lbnREaXJPdmVycmlkZT86IHN0cmluZztcbiAgZXZlbnREaXNwYXRjaGVyPzogRWxlbWVudEV2ZW50RGlzcGF0Y2hlcjtcbiAgZWxlbWVudENhY2hlVFRMPzogbnVtYmVyO1xuICBwYXRoQ2FjaGVUVEw/OiBudW1iZXI7XG4gIGVuYWJsZUZpbGVXYXRjaGVyPzogYm9vbGVhbjtcbiAgYXV0b1JlbG9hZE9uRXh0ZXJuYWxDaGFuZ2U/OiBib29sZWFuO1xuICBmaWxlV2F0Y2hTZXJ2aWNlPzogRmlsZVdhdGNoU2VydmljZTtcbiAgbWVtb3J5QnVkZ2V0PzogQ2FjaGVNZW1vcnlCdWRnZXQ7XG4gIGJhY2t1cFNlcnZpY2U/OiBCYWNrdXBTZXJ2aWNlO1xufVxuXG4vKipcbiAqIFJlY29yZCBvZiBhbiBlbGVtZW50IHRoYXQgZmFpbGVkIHRvIGxvYWQgKElzc3VlICM3MDgpLlxuICogU3RvcmVkIHNvIGNhbGxlcnMgY2FuIGRpc3Rpbmd1aXNoIFwiZmlsZSBub3QgZm91bmRcIiBmcm9tIFwiZmlsZSBpbnZhbGlkXCIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW52YWxpZEVsZW1lbnRSZWNvcmQge1xuICAvKiogUmVsYXRpdmUgZmlsZSBwYXRoIHdpdGhpbiB0aGUgZWxlbWVudCBkaXJlY3RvcnkuICovXG4gIGZpbGVQYXRoOiBzdHJpbmc7XG4gIC8qKiBIdW1hbi1yZWFkYWJsZSByZWFzb24gdGhlIGVsZW1lbnQgd2FzIHJlamVjdGVkLiAqL1xuICByZWFzb246IHN0cmluZztcbiAgLyoqIElTTyB0aW1lc3RhbXAgb2YgbGFzdCBmYWlsZWQgbG9hZCBhdHRlbXB0LiAqL1xuICBmYWlsZWRBdDogc3RyaW5nO1xufVxuXG4vKipcbiAqIEFic3RyYWN0IGJhc2UgY2xhc3MgaW1wbGVtZW50aW5nIGNvbW1vbiBlbGVtZW50IG1hbmFnZW1lbnQgb3BlcmF0aW9uc1xuICogU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCBlbGVtZW50LXNwZWNpZmljIGxvZ2ljIHZpYSBhYnN0cmFjdCBtZXRob2RzXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlRWxlbWVudE1hbmFnZXI8VCBleHRlbmRzIElFbGVtZW50PiBpbXBsZW1lbnRzIElFbGVtZW50TWFuYWdlcjxUPiB7XG4gIHByb3RlY3RlZCBwb3J0Zm9saW9NYW5hZ2VyOiBQb3J0Zm9saW9NYW5hZ2VyO1xuICBwcm90ZWN0ZWQgZmlsZUxvY2tNYW5hZ2VyOiBGaWxlTG9ja01hbmFnZXI7XG4gIHByb3RlY3RlZCBmaWxlT3BlcmF0aW9uczogRmlsZU9wZXJhdGlvbnNTZXJ2aWNlO1xuICBwcm90ZWN0ZWQgZmlsZVdhdGNoU2VydmljZT86IEZpbGVXYXRjaFNlcnZpY2U7XG4gIHByb3RlY3RlZCBlbGVtZW50RGlyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNwZWNpYWxpemVkIHZhbGlkYXRvciBmb3IgdGhpcyBlbGVtZW50IHR5cGVcbiAgICogT2J0YWluZWQgZnJvbSBWYWxpZGF0aW9uUmVnaXN0cnkgZHVyaW5nIGNvbnN0cnVjdGlvblxuICAgKi9cbiAgcHJvdGVjdGVkIHZhbGlkYXRvcjogRWxlbWVudFZhbGlkYXRvcjtcblxuICAvLyBQcmltYXJ5IGNhY2hlOiBJRCDihpIgRWxlbWVudCAod2l0aCBzaXplIGxpbWl0cyB0byBwcmV2ZW50IG1lbW9yeSBsZWFrcylcbiAgcHJvdGVjdGVkIGVsZW1lbnRzOiBMUlVDYWNoZTxUPjtcblxuICAvLyBSZXZlcnNlIGluZGV4OiBBYnNvbHV0ZSBGaWxlUGF0aCDihpIgRWxlbWVudCBJRCAod2l0aCBzaXplIGxpbWl0cylcbiAgcHJpdmF0ZSBmaWxlUGF0aFRvSWQ6IExSVUNhY2hlPHN0cmluZz47XG4gIHByaXZhdGUgcmVhZG9ubHkgZWxlbWVudEdlbmVyYXRpb25zID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgcHJpdmF0ZSBjYWNoZUdlbmVyYXRpb25Db3VudGVyID0gMDtcbiAgcHJpdmF0ZSB3YXRjaGVyQ2xlYW51cD86ICgpID0+IHZvaWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgZXZlbnREaXNwYXRjaGVyOiBFbGVtZW50RXZlbnREaXNwYXRjaGVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGF1dG9SZWxvYWRPbkV4dGVybmFsQ2hhbmdlOiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IGVsZW1lbnRUeXBlOiBFbGVtZW50VHlwZTtcbiAgcHJpdmF0ZSByZWFkb25seSBtZW1vcnlCdWRnZXQ/OiBDYWNoZU1lbW9yeUJ1ZGdldDtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGJhY2t1cFNlcnZpY2U/OiBCYWNrdXBTZXJ2aWNlO1xuXG4gIC8qKiBNYXAgcGx1cmFsIEVsZW1lbnRUeXBlIGVudW0gdmFsdWVzIHRvIHNpbmd1bGFyIENvbnRlbnRWYWxpZGF0b3IgY29udGV4dC5cbiAgICogIFBhcnRpYWwgYmVjYXVzZSBub3QgYWxsIGVsZW1lbnQgdHlwZXMgaGF2ZSBhIGNvbnRlbnQgY29udGV4dCAoZS5nLiwgZW5zZW1ibGVzKS4gKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgRUxFTUVOVF9UWVBFX1RPX0NPTlRFWFQ6IFBhcnRpYWw8UmVjb3JkPEVsZW1lbnRUeXBlLCAncGVyc29uYScgfCAnc2tpbGwnIHwgJ3RlbXBsYXRlJyB8ICdhZ2VudCcgfCAnbWVtb3J5Jz4+ID0ge1xuICAgIFtFbGVtZW50VHlwZS5QRVJTT05BXTogJ3BlcnNvbmEnLFxuICAgIFtFbGVtZW50VHlwZS5TS0lMTF06ICdza2lsbCcsXG4gICAgW0VsZW1lbnRUeXBlLlRFTVBMQVRFXTogJ3RlbXBsYXRlJyxcbiAgICBbRWxlbWVudFR5cGUuQUdFTlRdOiAnYWdlbnQnLFxuICAgIFtFbGVtZW50VHlwZS5NRU1PUlldOiAnbWVtb3J5JyxcbiAgfTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc3RvcmFnZUxheWVyOiBJU3RvcmFnZUxheWVyO1xuXG4gIC8qKlxuICAgKiBJc3N1ZSAjNzA4OiBFbGVtZW50cyB0aGF0IGV4aXN0IG9uIGRpc2sgYnV0IGZhaWxlZCB2YWxpZGF0aW9uIGR1cmluZyBsb2FkLlxuICAgKiBLZXllZCBieSByZWxhdGl2ZSBmaWxlIHBhdGggZm9yIGRlZHVwbGljYXRpb24uXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGludmFsaWRFbGVtZW50cyA9IG5ldyBNYXA8c3RyaW5nLCBJbnZhbGlkRWxlbWVudFJlY29yZD4oKTtcblxuICAvKipcbiAgICogVHJhY2tzIGZpbGUgcGF0aHMgd2hvc2UgbG9hZCBmYWlsdXJlIGhhcyBhbHJlYWR5IGJlZW4gbG9nZ2VkIGF0IGVycm9yIGxldmVsLlxuICAgKiBSZXBlYXRlZCBmYWlsdXJlcyB3aXRoIHRoZSBzYW1lIHJlYXNvbiBhcmUgZGVtb3RlZCB0byBkZWJ1ZyB0byBhdm9pZCBsb2cgZmxvb2RpbmcuXG4gICAqIENsZWFyZWQgd2hlbiB0aGUgZmlsZSBjaGFuZ2VzIG9uIGRpc2sgb3IgbG9hZHMgc3VjY2Vzc2Z1bGx5LlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBzdXBwcmVzc2VkTG9hZFBhdGhzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbW9zdCByZWNlbnQgbG9hZCgpIGZhaWx1cmUgZm9yIHRoaXMgcGF0aCB3YXMgc3VwcHJlc3NlZFxuICAgKiBiZWNhdXNlIGl0IHdhcyBhIHJlcGVhdCBvZiBhbiBhbHJlYWR5LWxvZ2dlZCBlcnJvci5cbiAgICogU3ViY2xhc3NlcyBjYW4gdXNlIHRoaXMgdG8gYXZvaWQgZHVwbGljYXRlIHNlY3VyaXR5IGV2ZW50IGxvZ2dpbmcuXG4gICAqXG4gICAqIEBwYXJhbSBmaWxlUGF0aCAtIFJlbGF0aXZlIGZpbGUgcGF0aCB3aXRoaW4gdGhlIGVsZW1lbnQgZGlyZWN0b3J5XG4gICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGVycm9yIGZvciB0aGlzIHBhdGggaXMgY3VycmVudGx5IHN1cHByZXNzZWRcbiAgICovXG4gIHByb3RlY3RlZCBpc0xvYWRFcnJvclN1cHByZXNzZWQoZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnN1cHByZXNzZWRMb2FkUGF0aHMuaGFzKGZpbGVQYXRoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhZnRlckxvYWQ/KGVsZW1lbnQ6IFQsIGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xuICBwcm90ZWN0ZWQgYmVmb3JlU2F2ZT8oZWxlbWVudDogVCwgZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD47XG4gIHByb3RlY3RlZCBhZnRlclNhdmU/KGVsZW1lbnQ6IFQsIGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xuICBwcm90ZWN0ZWQgZmluZEJ5SWRlbnRpZmllcj8oaWRlbnRpZmllcjogc3RyaW5nKTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPjtcbiAgcHJvdGVjdGVkIGNhbkRlbGV0ZT8oZWxlbWVudDogVCk6IFByb21pc2U8eyBhbGxvd2VkOiBib29sZWFuOyByZWFzb24/OiBzdHJpbmcgfT47XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGJhY2t1cCBiZWZvcmUgb3ZlcndyaXRpbmcgYW4gZXhpc3RpbmcgZmlsZS5cbiAgICogU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdG8gbm8tb3AgKGUuZy4gTWVtb3J5TWFuYWdlciBoYXMgaXRzIG93biBiYWNrdXAgc3lzdGVtKS5cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBjcmVhdGVCYWNrdXBCZWZvcmVTYXZlKGFic29sdXRlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmJhY2t1cFNlcnZpY2UpIHJldHVybjtcbiAgICBhd2FpdCB0aGlzLmJhY2t1cFNlcnZpY2UuYmFja3VwQmVmb3JlU2F2ZShhYnNvbHV0ZVBhdGgsIHRoaXMuZWxlbWVudFR5cGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGJhY2t1cCBiZWZvcmUgZGVsZXRpbmcgYSBmaWxlIChtb3ZlcyBmaWxlIHRvIGJhY2t1cCBkaXIpLlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIG9yaWdpbmFsIGZpbGUgd2FzIG1vdmVkIChjYWxsZXIgc2hvdWxkIHNraXAgZGVsZXRlRmlsZSkuXG4gICAqIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRvIG5vLW9wIChlLmcuIE1lbW9yeU1hbmFnZXIgaGFzIGl0cyBvd24gYmFja3VwIHN5c3RlbSkuXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgY3JlYXRlQmFja3VwQmVmb3JlRGVsZXRlKGFic29sdXRlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKCF0aGlzLmJhY2t1cFNlcnZpY2UpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmJhY2t1cFNlcnZpY2UuYmFja3VwQmVmb3JlRGVsZXRlKGFic29sdXRlUGF0aCwgdGhpcy5lbGVtZW50VHlwZSk7XG4gICAgcmV0dXJuICEhcmVzdWx0Lm1vdmVkT3JpZ2luYWw7XG4gIH1cblxuICAvKipcbiAgICogUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBldmVudCBkaXNwYXRjaGVyIGZvciBzdWJjbGFzc2VzIHRoYXQgbmVlZCB0byBlbWl0IGN1c3RvbSBldmVudHMuXG4gICAqXG4gICAqIEJhc2VFbGVtZW50TWFuYWdlciBoYW5kbGVzIHN0YW5kYXJkIGxpZmVjeWNsZSBldmVudHMgKGxvYWQsIHNhdmUsIGRlbGV0ZSkgYXV0b21hdGljYWxseS5cbiAgICogU3ViY2xhc3NlcyBzaG91bGQgdXNlIHRoaXMgZ2V0dGVyIG9ubHkgd2hlbiB0aGV5IG5lZWQgdG8gZW1pdCBhZGRpdGlvbmFsIGRvbWFpbi1zcGVjaWZpY1xuICAgKiBldmVudHMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIHN0YW5kYXJkIENSVUQgbGlmZWN5Y2xlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBQZXJzb25hTWFuYWdlciBlbWl0cyBhY3RpdmF0aW9uL2RlYWN0aXZhdGlvbiBldmVudHNcbiAgICogdGhpcy5kaXNwYXRjaGVyLmVtaXQoJ2VsZW1lbnQ6YWN0aXZhdGUnLCB0aGlzLmNyZWF0ZUV2ZW50UGF5bG9hZCh7Li4ufSkpO1xuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgRWxlbWVudEV2ZW50RGlzcGF0Y2hlciBpbnN0YW5jZSB1c2VkIGJ5IHRoaXMgbWFuYWdlclxuICAgKi9cbiAgcHJvdGVjdGVkIGdldCBkaXNwYXRjaGVyKCk6IEVsZW1lbnRFdmVudERpc3BhdGNoZXIge1xuICAgIHJldHVybiB0aGlzLmV2ZW50RGlzcGF0Y2hlcjtcbiAgfVxuXG4gIC8vIENhY2hlIGNvbmZpZ3VyYXRpb24gY29uc3RhbnRzXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1BWF9FTEVNRU5UX0NBQ0hFX1NJWkUgPSAxMDAwO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNQVhfUEFUSF9DQUNIRV9TSVpFID0gMTAwMDtcblxuICAvKipcbiAgICogQ29uc3RydWN0b3IgLSBpbml0aWFsaXplcyBjb21tb24gZGVwZW5kZW5jaWVzXG4gICAqIEBwYXJhbSBlbGVtZW50VHlwZSAtIFRoZSB0eXBlIG9mIGVsZW1lbnQgdGhpcyBtYW5hZ2VyIGhhbmRsZXNcbiAgICogQHBhcmFtIHBvcnRmb2xpb01hbmFnZXIgLSBQb3J0Zm9saW8gbWFuYWdlciBmb3IgZGlyZWN0b3J5IHJlc29sdXRpb25cbiAgICogQHBhcmFtIGZpbGVMb2NrTWFuYWdlciAtIEZpbGUgbG9jayBtYW5hZ2VyIGZvciBhdG9taWMgb3BlcmF0aW9uc1xuICAgKiBAcGFyYW0gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBpbmNsdWRpbmcgZmlsZVdhdGNoU2VydmljZVxuICAgKiBAcGFyYW0gZmlsZU9wZXJhdGlvbnNTZXJ2aWNlIC0gU2VydmljZSBmb3IgZmlsZSBvcGVyYXRpb25zXG4gICAqIEBwYXJhbSB2YWxpZGF0aW9uUmVnaXN0cnkgLSBSZWdpc3RyeSBmb3Igb2J0YWluaW5nIHR5cGUtc3BlY2lmaWMgdmFsaWRhdG9yc1xuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgZWxlbWVudFR5cGU6IEVsZW1lbnRUeXBlLFxuICAgIHBvcnRmb2xpb01hbmFnZXI6IFBvcnRmb2xpb01hbmFnZXIsXG4gICAgZmlsZUxvY2tNYW5hZ2VyOiBGaWxlTG9ja01hbmFnZXIsXG4gICAgb3B0aW9uczogQmFzZUVsZW1lbnRNYW5hZ2VyT3B0aW9ucyA9IHt9LFxuICAgIGZpbGVPcGVyYXRpb25zU2VydmljZTogRmlsZU9wZXJhdGlvbnNTZXJ2aWNlLFxuICAgIHZhbGlkYXRpb25SZWdpc3RyeTogVmFsaWRhdGlvblJlZ2lzdHJ5XG4gICkge1xuICAgIHRoaXMuZWxlbWVudFR5cGUgPSBlbGVtZW50VHlwZTtcbiAgICB0aGlzLnBvcnRmb2xpb01hbmFnZXIgPSBwb3J0Zm9saW9NYW5hZ2VyO1xuICAgIHRoaXMuZmlsZUxvY2tNYW5hZ2VyID0gZmlsZUxvY2tNYW5hZ2VyO1xuICAgIHRoaXMuZmlsZU9wZXJhdGlvbnMgPSBmaWxlT3BlcmF0aW9uc1NlcnZpY2U7XG4gICAgdGhpcy5maWxlV2F0Y2hTZXJ2aWNlID0gb3B0aW9ucy5maWxlV2F0Y2hTZXJ2aWNlO1xuICAgIHRoaXMuYmFja3VwU2VydmljZSA9IG9wdGlvbnMuYmFja3VwU2VydmljZTtcblxuICAgIC8vIEdldCB0aGUgc3BlY2lhbGl6ZWQgdmFsaWRhdG9yIGZvciB0aGlzIGVsZW1lbnQgdHlwZVxuICAgIHRoaXMudmFsaWRhdG9yID0gdmFsaWRhdGlvblJlZ2lzdHJ5LmdldFZhbGlkYXRvcihlbGVtZW50VHlwZSk7XG5cbiAgICBjb25zdCBlbGVtZW50Q2FjaGVUVEwgPSBvcHRpb25zLmVsZW1lbnRDYWNoZVRUTCA/PyBERUZBVUxUX0VMRU1FTlRfQ0FDSEVfVFRMX01TO1xuICAgIGNvbnN0IHBhdGhDYWNoZVRUTCA9IG9wdGlvbnMucGF0aENhY2hlVFRMID8/IERFRkFVTFRfUEFUSF9DQUNIRV9UVExfTVM7XG4gICAgdGhpcy5tZW1vcnlCdWRnZXQgPSBvcHRpb25zLm1lbW9yeUJ1ZGdldDtcblxuICAgIGNvbnN0IG9uU2V0Q2FsbGJhY2sgPSB0aGlzLm1lbW9yeUJ1ZGdldFxuICAgICAgPyAoKSA9PiB0aGlzLm1lbW9yeUJ1ZGdldCEuZW5mb3JjZSgpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIC8vIEluaXRpYWxpemUgTFJVIGNhY2hlcyB3aXRoIHNpemUgbGltaXRzIHRvIHByZXZlbnQgbWVtb3J5IGxlYWtzXG4gICAgdGhpcy5lbGVtZW50cyA9IG5ldyBMUlVDYWNoZTxUPih7XG4gICAgICBuYW1lOiBgZWxlbWVudHM6JHtlbGVtZW50VHlwZX1gLFxuICAgICAgbWF4U2l6ZTogQmFzZUVsZW1lbnRNYW5hZ2VyLk1BWF9FTEVNRU5UX0NBQ0hFX1NJWkUsXG4gICAgICBtYXhNZW1vcnlNQjogNTAsIC8vIE1heCA1ME1CIGZvciBlbGVtZW50IGNhY2hlXG4gICAgICB0dGxNczogZWxlbWVudENhY2hlVFRMLFxuICAgICAgb25TZXQ6IG9uU2V0Q2FsbGJhY2ssXG4gICAgfSk7XG5cbiAgICB0aGlzLmZpbGVQYXRoVG9JZCA9IG5ldyBMUlVDYWNoZTxzdHJpbmc+KHtcbiAgICAgIG5hbWU6IGBwYXRoSW5kZXg6JHtlbGVtZW50VHlwZX1gLFxuICAgICAgbWF4U2l6ZTogQmFzZUVsZW1lbnRNYW5hZ2VyLk1BWF9QQVRIX0NBQ0hFX1NJWkUsXG4gICAgICBtYXhNZW1vcnlNQjogMTAsIC8vIE1heCAxME1CIGZvciBwYXRoIG1hcHBpbmdzXG4gICAgICB0dGxNczogcGF0aENhY2hlVFRMLFxuICAgICAgb25TZXQ6IG9uU2V0Q2FsbGJhY2ssXG4gICAgfSk7XG5cbiAgICAvLyBSZWdpc3RlciBjYWNoZXMgd2l0aCBnbG9iYWwgbWVtb3J5IGJ1ZGdldFxuICAgIGlmICh0aGlzLm1lbW9yeUJ1ZGdldCkge1xuICAgICAgdGhpcy5tZW1vcnlCdWRnZXQucmVnaXN0ZXIodGhpcy5lbGVtZW50cyk7XG4gICAgICB0aGlzLm1lbW9yeUJ1ZGdldC5yZWdpc3Rlcih0aGlzLmZpbGVQYXRoVG9JZCk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuZWxlbWVudERpck92ZXJyaWRlKSB7XG4gICAgICB0aGlzLmVsZW1lbnREaXIgPSBvcHRpb25zLmVsZW1lbnREaXJPdmVycmlkZTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiAodGhpcy5wb3J0Zm9saW9NYW5hZ2VyIGFzIGFueSkuZ2V0RWxlbWVudERpciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpcy5lbGVtZW50RGlyID0gKHRoaXMucG9ydGZvbGlvTWFuYWdlciBhcyBhbnkpLmdldEVsZW1lbnREaXIoZWxlbWVudFR5cGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBVbmFibGUgdG8gcmVzb2x2ZSBlbGVtZW50IGRpcmVjdG9yeSBmb3IgJHtlbGVtZW50VHlwZX0uIGAgK1xuICAgICAgICAnUHJvdmlkZSBhbiBlbGVtZW50RGlyT3ZlcnJpZGUgd2hlbiBpbnN0YW50aWF0aW5nIHRoaXMgbWFuYWdlci4nXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyID0gb3B0aW9ucy5ldmVudERpc3BhdGNoZXIgPz8gRWxlbWVudEV2ZW50RGlzcGF0Y2hlci5nZXRTaGFyZWREaXNwYXRjaGVyKCk7XG4gICAgdGhpcy5hdXRvUmVsb2FkT25FeHRlcm5hbENoYW5nZSA9XG4gICAgICBvcHRpb25zLmF1dG9SZWxvYWRPbkV4dGVybmFsQ2hhbmdlID8/IHByb2Nlc3MuZW52LkFVVE9fUkVMT0FEX09OX0VYVEVSTkFMX0NIQU5HRSA9PT0gJ3RydWUnO1xuXG4gICAgY29uc3QgZW5hYmxlV2F0Y2hlciA9IG9wdGlvbnMuZW5hYmxlRmlsZVdhdGNoZXIgPz8gcHJvY2Vzcy5lbnYuRE9MTEhPVVNFX0VOQUJMRV9GSUxFX1dBVENIRVIgPT09ICd0cnVlJztcbiAgICBpZiAoZW5hYmxlV2F0Y2hlciAmJiB0aGlzLmZpbGVXYXRjaFNlcnZpY2UpIHtcbiAgICAgIHRoaXMud2F0Y2hlckNsZWFudXAgPSB0aGlzLmZpbGVXYXRjaFNlcnZpY2Uud2F0Y2hEaXJlY3RvcnkoXG4gICAgICAgIHRoaXMuZWxlbWVudERpcixcbiAgICAgICAgKHJlbGF0aXZlUGF0aCkgPT4gdGhpcy5oYW5kbGVFeHRlcm5hbENoYW5nZShyZWxhdGl2ZVBhdGgpXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuc3RvcmFnZUxheWVyID0gdGhpcy5jcmVhdGVTdG9yYWdlTGF5ZXIoZmlsZU9wZXJhdGlvbnNTZXJ2aWNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGYWN0b3J5IG1ldGhvZCBmb3IgY3JlYXRpbmcgdGhlIHN0b3JhZ2UgbGF5ZXIuXG4gICAqIERlZmF1bHQgcmV0dXJucyBFbGVtZW50U3RvcmFnZUxheWVyIGZvciAubWQgZWxlbWVudHMuXG4gICAqIFN1YmNsYXNzZXMgKGUuZy4gTWVtb3J5TWFuYWdlcikgY2FuIG92ZXJyaWRlIHRvIHJldHVybiBhIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbi5cbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVTdG9yYWdlTGF5ZXIoZmlsZU9wZXJhdGlvbnNTZXJ2aWNlOiBGaWxlT3BlcmF0aW9uc1NlcnZpY2UpOiBJU3RvcmFnZUxheWVyIHtcbiAgICByZXR1cm4gbmV3IEVsZW1lbnRTdG9yYWdlTGF5ZXIoZmlsZU9wZXJhdGlvbnNTZXJ2aWNlLCB7XG4gICAgICBlbGVtZW50RGlyOiB0aGlzLmVsZW1lbnREaXIsXG4gICAgICBmaWxlRXh0ZW5zaW9uOiB0aGlzLmdldEZpbGVFeHRlbnNpb24oKSxcbiAgICAgIHNjYW5Db29sZG93bk1zOiBnZXRWYWxpZGF0ZWRTY2FuQ29vbGRvd24oKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzaW5ndWxhciBodW1hbi1yZWFkYWJsZSBsYWJlbCBmb3IgdGhpcyBlbGVtZW50IHR5cGUgKGUuZy4sIFwic2tpbGxcIiwgXCJwZXJzb25hXCIpLlxuICAgKiBVc2VkIGluIGZpbGVuYW1lIGdlbmVyYXRpb24gKHtuYW1lfS17bGFiZWx9Lm1kKSBhbmQgZGlzcGxheSBzdHJpbmdzLlxuICAgKiBNdXN0IHJldHVybiB0aGUgc2luZ3VsYXIgZm9ybSDigJQgbm90IHRoZSBwbHVyYWwgRWxlbWVudFR5cGUgdmFsdWUuXG4gICAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0RWxlbWVudExhYmVsKCk6IHN0cmluZztcblxuICAvKipcbiAgICogUmV0dXJucyBhIGNhcGl0YWxpemVkIHZlcnNpb24gb2YgdGhlIGVsZW1lbnQgbGFiZWwuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0RWxlbWVudExhYmVsQ2FwaXRhbGl6ZWQoKTogc3RyaW5nIHtcbiAgICBjb25zdCBsYWJlbCA9IHRoaXMuZ2V0RWxlbWVudExhYmVsKCk7XG4gICAgcmV0dXJuIGxhYmVsLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgbGFiZWwuc2xpY2UoMSk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBhbiBlbGVtZW50IGZyb20gZmlsZVxuICAgKiBURU1QTEFURSBNRVRIT0Q6IERlZmluZXMgdGhlIGFsZ29yaXRobSwgc3ViY2xhc3NlcyBjdXN0b21pemUgc3RlcHNcbiAgICpcbiAgICogU0VDVVJJVFkgRklYRVMgKGluaGVyaXRlZCBmcm9tIG9yaWdpbmFsIG1hbmFnZXJzKTpcbiAgICogLSB0aGlzLmZpbGVMb2NrTWFuYWdlci5hdG9taWNSZWFkRmlsZSgpIHByZXZlbnRzIHJhY2UgY29uZGl0aW9uc1xuICAgKiAtIFBhdGggdmFsaWRhdGlvbiBwcmV2ZW50cyB0cmF2ZXJzYWwgYXR0YWNrc1xuICAgKiAtIFNlY3VyaXR5IGV2ZW50IGxvZ2dpbmcgZm9yIGF1ZGl0IHRyYWlsXG4gICAqL1xuICBhc3luYyBsb2FkKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCB7IHJlbGF0aXZlUGF0aCwgYWJzb2x1dGVQYXRoIH0gPSBhd2FpdCB0aGlzLm5vcm1hbGl6ZUFuZFZhbGlkYXRlUGF0aChmaWxlUGF0aCk7XG4gICAgY29uc3QgY29ycmVsYXRpb25JZCA9IHJhbmRvbVVVSUQoKTtcblxuICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyLmVtaXQoXG4gICAgICAnZWxlbWVudDpsb2FkOnN0YXJ0JyxcbiAgICAgIHRoaXMuY3JlYXRlRXZlbnRQYXlsb2FkKHsgY29ycmVsYXRpb25JZCwgZmlsZVBhdGg6IHJlbGF0aXZlUGF0aCB9KVxuICAgICk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMucmVhZEVsZW1lbnRGaWxlKGFic29sdXRlUGF0aCwgdGhpcy5lbGVtZW50VHlwZSwge1xuICAgICAgICBzb3VyY2U6IGAke3RoaXMuY29uc3RydWN0b3IubmFtZX0ubG9hZGBcbiAgICAgIH0pO1xuICAgICAgLy8gSXNzdWUgIzgxMDogUGFzcyBlbGVtZW50IHR5cGUgYXMgY29udGVudENvbnRleHQgc28gU2VjdXJlWWFtbFBhcnNlciBleGVtcHRzXG4gICAgICAvLyBsZWdpdGltYXRlIHBhdHRlcm5zIChlLmcuLCA8c2NyaXB0PiBzZWN0aW9uIHRhZ3MgaW4gdGVtcGxhdGVzKVxuICAgICAgY29uc3QgY29udGVudENvbnRleHQgPSBCYXNlRWxlbWVudE1hbmFnZXIuRUxFTUVOVF9UWVBFX1RPX0NPTlRFWFRbdGhpcy5lbGVtZW50VHlwZV07XG4gICAgICBpZiAoIWNvbnRlbnRDb250ZXh0KSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgWyR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfV0gTm8gY29udGVudENvbnRleHQgbWFwcGluZyBmb3IgZWxlbWVudFR5cGUgJyR7dGhpcy5lbGVtZW50VHlwZX0nIOKAlCBwYXJzaW5nIHdpdGhvdXQgY29udGV4dCBleGVtcHRpb25zLiBBdmFpbGFibGU6ICR7T2JqZWN0LmtleXMoQmFzZUVsZW1lbnRNYW5hZ2VyLkVMRU1FTlRfVFlQRV9UT19DT05URVhUKS5qb2luKCcsICcpfWApO1xuICAgICAgfVxuICAgICAgY29uc3QgcGFyc2VkID0gU2VjdXJlWWFtbFBhcnNlci5zYWZlTWF0dGVyKGNvbnRlbnQsIHVuZGVmaW5lZCwgeyBjb250ZW50Q29udGV4dCB9KTtcblxuICAgICAgLy8gSXNzdWUgIzY5NTogRmlsbCBpbiBtaXNzaW5nIG1ldGFkYXRhIGZpZWxkcyB3aXRoIHNlbnNpYmxlIGRlZmF1bHRzXG4gICAgICAvLyBiZWZvcmUgcGFyc2VNZXRhZGF0YSgpIHNvIG9sZGVyIGVsZW1lbnRzIHdpdGggc3BhcnNlIGZyb250bWF0dGVyXG4gICAgICAvLyBkb24ndCBnZXQgcmVqZWN0ZWQuXG4gICAgICB0aGlzLm1pZ3JhdGVNZXRhZGF0YURlZmF1bHRzKHBhcnNlZC5kYXRhLCByZWxhdGl2ZVBhdGgpO1xuXG4gICAgICBjb25zdCBtZXRhZGF0YSA9IGF3YWl0IHRoaXMucGFyc2VNZXRhZGF0YShwYXJzZWQuZGF0YSk7XG4gICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5jcmVhdGVFbGVtZW50KG1ldGFkYXRhLCBwYXJzZWQuY29udGVudCk7XG5cbiAgICAgIGlmICh0aGlzLmFmdGVyTG9hZCkge1xuICAgICAgICBhd2FpdCB0aGlzLmFmdGVyTG9hZChlbGVtZW50LCByZWxhdGl2ZVBhdGgpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmNhY2hlRWxlbWVudChlbGVtZW50LCByZWxhdGl2ZVBhdGgpO1xuXG4gICAgICAvLyBJc3N1ZSAjNzA4OiBDbGVhciBhbnkgcHJldmlvdXMgaW52YWxpZCByZWNvcmQgb24gc3VjY2Vzc2Z1bCBsb2FkXG4gICAgICB0aGlzLmludmFsaWRFbGVtZW50cy5kZWxldGUocmVsYXRpdmVQYXRoKTtcbiAgICAgIHRoaXMuc3VwcHJlc3NlZExvYWRQYXRocy5kZWxldGUocmVsYXRpdmVQYXRoKTtcblxuICAgICAgbG9nZ2VyLmluZm8oYCR7dGhpcy5nZXRFbGVtZW50TGFiZWxDYXBpdGFsaXplZCgpfSBsb2FkZWQ6ICR7ZWxlbWVudC5tZXRhZGF0YS5uYW1lfWApO1xuXG4gICAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlci5lbWl0QXN5bmMoXG4gICAgICAgICdlbGVtZW50OmxvYWQ6c3VjY2VzcycsXG4gICAgICAgIHRoaXMuY3JlYXRlRXZlbnRQYXlsb2FkKHsgY29ycmVsYXRpb25JZCwgZmlsZVBhdGg6IHJlbGF0aXZlUGF0aCwgZWxlbWVudCB9KVxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIElzc3VlICM3MDg6IFJlY29yZCB0aGUgZmFpbHVyZSBzbyBjYWxsZXJzIGNhbiBkaXN0aW5ndWlzaFxuICAgICAgLy8gXCJmaWxlIG5vdCBmb3VuZFwiIGZyb20gXCJmaWxlIGV4aXN0cyBidXQgZmFpbGVkIHZhbGlkYXRpb25cIi5cbiAgICAgIC8vIE9ubHkgdHJhY2sgcGFyc2UvdmFsaWRhdGlvbiBlcnJvcnMg4oCUIEVOT0VOVCBtZWFucyB0aGUgZmlsZSBpcyBnZW51aW5lbHlcbiAgICAgIC8vIG1pc3NpbmcsIG5vdCBpbnZhbGlkLCBzbyB3ZSBtdXN0IG5vdCBwb2xsdXRlIHRoZSBpbnZhbGlkIG1hcCB3aXRoIGl0LlxuICAgICAgY29uc3QgaXNGaWxlTm90Rm91bmQgPSAoZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlID09PSAnRU5PRU5UJztcbiAgICAgIGxldCBpc1JlcGVhdEVycm9yID0gZmFsc2U7XG5cbiAgICAgIGlmICghaXNGaWxlTm90Rm91bmQpIHtcbiAgICAgICAgY29uc3QgcmVhc29uID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuICAgICAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuaW52YWxpZEVsZW1lbnRzLmdldChyZWxhdGl2ZVBhdGgpO1xuICAgICAgICBpc1JlcGVhdEVycm9yID0gZXhpc3Rpbmc/LnJlYXNvbiA9PT0gcmVhc29uO1xuXG4gICAgICAgIHRoaXMuaW52YWxpZEVsZW1lbnRzLnNldChyZWxhdGl2ZVBhdGgsIHtcbiAgICAgICAgICBmaWxlUGF0aDogcmVsYXRpdmVQYXRoLFxuICAgICAgICAgIHJlYXNvbixcbiAgICAgICAgICBmYWlsZWRBdDogaXNSZXBlYXRFcnJvciA/IGV4aXN0aW5nIS5mYWlsZWRBdCA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc1JlcGVhdEVycm9yKSB7XG4gICAgICAgIHRoaXMuc3VwcHJlc3NlZExvYWRQYXRocy5hZGQocmVsYXRpdmVQYXRoKTtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBTdXBwcmVzc2VkIHJlcGVhdGVkIGxvYWQgZXJyb3IgZm9yICR7dGhpcy5nZXRFbGVtZW50TGFiZWwoKX0gJHtyZWxhdGl2ZVBhdGh9YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnN1cHByZXNzZWRMb2FkUGF0aHMuZGVsZXRlKHJlbGF0aXZlUGF0aCk7XG4gICAgICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyLmVtaXRBc3luYyhcbiAgICAgICAgICAnZWxlbWVudDpsb2FkOmVycm9yJyxcbiAgICAgICAgICB0aGlzLmNyZWF0ZUV2ZW50UGF5bG9hZCh7IGNvcnJlbGF0aW9uSWQsIGZpbGVQYXRoOiByZWxhdGl2ZVBhdGgsIGVycm9yIH0pXG4gICAgICAgICk7XG4gICAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGxvYWQgJHt0aGlzLmdldEVsZW1lbnRMYWJlbCgpfSBmcm9tICR7YWJzb2x1dGVQYXRofTpgLCBlcnJvcik7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSXNzdWUgIzY5NTogUHJlLWZpbGwgbWlzc2luZyBtZXRhZGF0YSBmaWVsZHMgd2l0aCBzZW5zaWJsZSBkZWZhdWx0c1xuICAgKiBiZWZvcmUgcGFyc2VNZXRhZGF0YSgpIHJ1bnMuIFRoaXMgaW1wbGVtZW50cyB0aGUgXCJ0b2xlcmFudCByZWFkZXJcIiBwYXR0ZXJuXG4gICAqIOKAlCBzdHJpY3Qgb24gb3V0cHV0LCBsZW5pZW50IG9uIGlucHV0IGZvciBvbGRlci9zcGFyc2UgZnJvbnRtYXR0ZXIuXG4gICAqXG4gICAqIE11dGF0ZXMgYGRhdGFgIGluIHBsYWNlLiBMb2dzIGEgd2FybmluZyBmb3IgZWFjaCBkZWZhdWx0ZWQgZmllbGQgc29cbiAgICogb3BlcmF0b3JzIGtub3cgd2hpY2ggZmlsZXMgbmVlZCB1cGRhdGluZy5cbiAgICovXG4gIHByaXZhdGUgbWlncmF0ZU1ldGFkYXRhRGVmYXVsdHMoZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGZpbGVQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBtaWdyYXRlZDogc3RyaW5nW10gPSBbXTtcblxuICAgIC8vIEluZmVyIHR5cGUgZnJvbSB0aGlzIG1hbmFnZXIncyBlbGVtZW50IHR5cGVcbiAgICBpZiAoIWRhdGEudHlwZSkge1xuICAgICAgLy8gRWxlbWVudFR5cGUgaXMgcGx1cmFsICgncGVyc29uYXMnLCAnc2tpbGxzJywgZXRjLilcbiAgICAgIC8vIFNvbWUgbWFuYWdlcnMgZXhwZWN0IHNpbmd1bGFyICgncGVyc29uYScsICdhZ2VudCcpLCBzb21lIHBsdXJhbC5cbiAgICAgIC8vIFNldCB0aGUgcGx1cmFsIGZvcm0g4oCUIHBhcnNlTWV0YWRhdGEoKSBoYW5kbGVzIG5vcm1hbGl6YXRpb24uXG4gICAgICBkYXRhLnR5cGUgPSB0aGlzLmVsZW1lbnRUeXBlO1xuICAgICAgbWlncmF0ZWQucHVzaCgndHlwZScpO1xuICAgIH1cblxuICAgIC8vIEluZmVyIG5hbWUgZnJvbSBmaWxlbmFtZSAoc3RyaXAgZXh0ZW5zaW9uLCB1bi1zbHVnaWZ5KVxuICAgIGlmICghZGF0YS5uYW1lKSB7XG4gICAgICBjb25zdCBiYXNlbmFtZSA9IHBhdGguYmFzZW5hbWUoZmlsZVBhdGgsIHRoaXMuZ2V0RmlsZUV4dGVuc2lvbigpKTtcbiAgICAgIGRhdGEubmFtZSA9IGJhc2VuYW1lO1xuICAgICAgbWlncmF0ZWQucHVzaCgnbmFtZScpO1xuICAgIH1cblxuICAgIC8vIERlZmF1bHQgdmVyc2lvblxuICAgIGlmICghZGF0YS52ZXJzaW9uKSB7XG4gICAgICBkYXRhLnZlcnNpb24gPSAnMS4wLjAnO1xuICAgICAgbWlncmF0ZWQucHVzaCgndmVyc2lvbicpO1xuICAgIH1cblxuICAgIC8vIERlZmF1bHQgYXV0aG9yXG4gICAgaWYgKCFkYXRhLmF1dGhvcikge1xuICAgICAgZGF0YS5hdXRob3IgPSAndW5rbm93bic7XG4gICAgICBtaWdyYXRlZC5wdXNoKCdhdXRob3InKTtcbiAgICB9XG5cbiAgICBpZiAobWlncmF0ZWQubGVuZ3RoID4gMCkge1xuICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgIGBbVG9sZXJhbnRSZWFkZXJdICR7dGhpcy5nZXRFbGVtZW50TGFiZWxDYXBpdGFsaXplZCgpfSBcIiR7ZmlsZVBhdGh9XCI6IGAgK1xuICAgICAgICBgZGVmYXVsdGVkIG1pc3NpbmcgZmllbGRzOiAke21pZ3JhdGVkLmpvaW4oJywgJyl9YFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSXNzdWUgIzcwODogUmV0dXJucyBlbGVtZW50cyB0aGF0IGV4aXN0IG9uIGRpc2sgYnV0IGZhaWxlZCB2YWxpZGF0aW9uIGR1cmluZyBsb2FkLlxuICAgKiBDYWxsZXJzIGNhbiB1c2UgdGhpcyB0byByZXBvcnQgaW52YWxpZCBlbGVtZW50cyBpbnN0ZWFkIG9mIHNpbGVudGx5IGhpZGluZyB0aGVtLlxuICAgKi9cbiAgZ2V0SW52YWxpZEVsZW1lbnRzKCk6IEludmFsaWRFbGVtZW50UmVjb3JkW10ge1xuICAgIHJldHVybiBbLi4udGhpcy5pbnZhbGlkRWxlbWVudHMudmFsdWVzKCldO1xuICB9XG5cbiAgLyoqXG4gICAqIElzc3VlICM3MDg6IENoZWNrIGlmIGEgc3BlY2lmaWMgZmlsZSBmYWlsZWQgdmFsaWRhdGlvbiBkdXJpbmcgbG9hZC5cbiAgICogVXNlZCBieSBnZXRfZWxlbWVudCB0byBkaXN0aW5ndWlzaCBcIm5vdCBmb3VuZFwiIGZyb20gXCJpbnZhbGlkXCIuXG4gICAqL1xuICBnZXRJbnZhbGlkRWxlbWVudChuYW1lOiBzdHJpbmcpOiBJbnZhbGlkRWxlbWVudFJlY29yZCB8IHVuZGVmaW5lZCB7XG4gICAgLy8gQ2hlY2sgYnkgZXhhY3QgcGF0aCBtYXRjaCBhbmQgYnkgbmFtZS1iYXNlZCBtYXRjaFxuICAgIGZvciAoY29uc3QgW2ZpbGVQYXRoLCByZWNvcmRdIG9mIHRoaXMuaW52YWxpZEVsZW1lbnRzKSB7XG4gICAgICBpZiAoZmlsZVBhdGggPT09IG5hbWUpIHJldHVybiByZWNvcmQ7XG4gICAgICBjb25zdCBiYXNlbmFtZSA9IHBhdGguYmFzZW5hbWUoZmlsZVBhdGgsIHRoaXMuZ2V0RmlsZUV4dGVuc2lvbigpKTtcbiAgICAgIGlmIChiYXNlbmFtZSA9PT0gbmFtZSB8fCB0aGlzLm5vcm1hbGl6ZUZpbGVuYW1lKGJhc2VuYW1lKSA9PT0gdGhpcy5ub3JtYWxpemVGaWxlbmFtZShuYW1lKSkge1xuICAgICAgICByZXR1cm4gcmVjb3JkO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmUgYW4gZWxlbWVudCB0byBmaWxlXG4gICAqIFRFTVBMQVRFIE1FVEhPRDogQ29tbW9uIHNhdmUgbG9naWMgd2l0aCBob29rcyBmb3IgY3VzdG9taXphdGlvblxuICAgKlxuICAgKiBTRUNVUklUWSBGSVhFUzpcbiAgICogLSB0aGlzLmZpbGVMb2NrTWFuYWdlci5hdG9taWNXcml0ZUZpbGUoKSBmb3IgYXRvbWljIG9wZXJhdGlvbnNcbiAgICogLSBQYXRoIHZhbGlkYXRpb24gdG8gcHJldmVudCB0cmF2ZXJzYWwgYXR0YWNrc1xuICAgKiAtIFNlY3VyaXR5IGV2ZW50IGxvZ2dpbmdcbiAgICovXG4gIGFzeW5jIHNhdmUoZWxlbWVudDogVCwgZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgcmVsYXRpdmVQYXRoLCBhYnNvbHV0ZVBhdGggfSA9IGF3YWl0IHRoaXMubm9ybWFsaXplQW5kVmFsaWRhdGVQYXRoKGZpbGVQYXRoKTtcbiAgICBjb25zdCBjb3JyZWxhdGlvbklkID0gcmFuZG9tVVVJRCgpO1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IEVsZW1lbnRUcmFuc2FjdGlvblNjb3BlKHRoaXMuZ2V0RWxlbWVudExhYmVsKCksIGNvcnJlbGF0aW9uSWQpO1xuXG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgdHlwZTogJ0VMRU1FTlRfRURJVEVEJyxcbiAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgIHNvdXJjZTogYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfS5zYXZlYCxcbiAgICAgIGRldGFpbHM6IGBTYXZpbmcgJHt0aGlzLmdldEVsZW1lbnRMYWJlbCgpfTogJHtlbGVtZW50Lm1ldGFkYXRhLm5hbWV9IHYke2VsZW1lbnQubWV0YWRhdGEudmVyc2lvbiB8fCAndW5rbm93bid9YCxcbiAgICAgIGFkZGl0aW9uYWxEYXRhOiB7XG4gICAgICAgIGVsZW1lbnRJZDogZWxlbWVudC5pZCxcbiAgICAgICAgZWxlbWVudFR5cGU6IHRoaXMuZ2V0RWxlbWVudExhYmVsKCksXG4gICAgICAgIGF1dGhvcjogZWxlbWVudC5tZXRhZGF0YS5hdXRob3IsXG4gICAgICAgIHZlcnNpb246IGVsZW1lbnQubWV0YWRhdGEudmVyc2lvbixcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyLmVtaXQoXG4gICAgICAnZWxlbWVudDpzYXZlOnN0YXJ0JyxcbiAgICAgIHRoaXMuY3JlYXRlRXZlbnRQYXlsb2FkKHsgY29ycmVsYXRpb25JZCwgZmlsZVBhdGg6IHJlbGF0aXZlUGF0aCwgZWxlbWVudCB9KVxuICAgICk7XG5cbiAgICB0cmFuc2FjdGlvbi5hZGRDb21taXQoYXN5bmMgKCkgPT4ge1xuICAgICAgdGhpcy5jYWNoZUVsZW1lbnQoZWxlbWVudCwgcmVsYXRpdmVQYXRoKTtcbiAgICAgIGF3YWl0IHRoaXMuc3RvcmFnZUxheWVyLm5vdGlmeVNhdmVkKHJlbGF0aXZlUGF0aCwgYWJzb2x1dGVQYXRoKTtcbiAgICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyLmVtaXRBc3luYyhcbiAgICAgICAgJ2VsZW1lbnQ6c2F2ZTpzdWNjZXNzJyxcbiAgICAgICAgdGhpcy5jcmVhdGVFdmVudFBheWxvYWQoeyBjb3JyZWxhdGlvbklkLCBmaWxlUGF0aDogcmVsYXRpdmVQYXRoLCBlbGVtZW50IH0pXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgdHJhbnNhY3Rpb24uYWRkUm9sbGJhY2soYXN5bmMgKGVycm9yKSA9PiB7XG4gICAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlci5lbWl0QXN5bmMoXG4gICAgICAgICdlbGVtZW50OnNhdmU6ZXJyb3InLFxuICAgICAgICB0aGlzLmNyZWF0ZUV2ZW50UGF5bG9hZCh7IGNvcnJlbGF0aW9uSWQsIGZpbGVQYXRoOiByZWxhdGl2ZVBhdGgsIGVsZW1lbnQsIGVycm9yIH0pXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgYXdhaXQgdHJhbnNhY3Rpb24ucnVuKGFzeW5jICgpID0+IHtcbiAgICAgIGlmICh0aGlzLmJlZm9yZVNhdmUpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5iZWZvcmVTYXZlKGVsZW1lbnQsIHJlbGF0aXZlUGF0aCk7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuY3JlYXRlRGlyZWN0b3J5KHBhdGguZGlybmFtZShhYnNvbHV0ZVBhdGgpKTtcbiAgICAgIGF3YWl0IHRoaXMuY3JlYXRlQmFja3VwQmVmb3JlU2F2ZShhYnNvbHV0ZVBhdGgpO1xuXG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgdGhpcy5zZXJpYWxpemVFbGVtZW50KGVsZW1lbnQpO1xuXG4gICAgICAvLyBGaXggIzkwODogVmFsaWRhdGUgc2VyaWFsaXplZCBjb250ZW50IGJlZm9yZSB3cml0aW5nIChzeW1tZXRyaWMgd2l0aCByZWFkIHBhdGgpLlxuICAgICAgLy8gUmVhZCBwYXRoIHZhbGlkYXRlcyB2aWEgU2VjdXJlWWFtbFBhcnNlci5wYXJzZSgpIOKGkiBDb250ZW50VmFsaWRhdG9yOyB3cml0ZSBwYXRoXG4gICAgICAvLyBtdXN0IGFwcGx5IHRoZSBzYW1lIGNoZWNrcyB0byBwcmV2ZW50IHNhdmluZyBjb250ZW50IHRoYXQgd291bGQgZmFpbCB0byBsb2FkLlxuICAgICAgdGhpcy52YWxpZGF0ZVNlcmlhbGl6ZWRDb250ZW50KGNvbnRlbnQpO1xuXG4gICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLndyaXRlRmlsZShhYnNvbHV0ZVBhdGgsIGNvbnRlbnQsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSk7XG5cbiAgICAgIGlmICh0aGlzLmFmdGVyU2F2ZSkge1xuICAgICAgICBhd2FpdCB0aGlzLmFmdGVyU2F2ZShlbGVtZW50LCByZWxhdGl2ZVBhdGgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgbG9nZ2VyLmluZm8oYCR7dGhpcy5nZXRFbGVtZW50TGFiZWxDYXBpdGFsaXplZCgpfSBzYXZlZDogJHtlbGVtZW50Lm1ldGFkYXRhLm5hbWV9YCk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgc2VyaWFsaXplZCBlbGVtZW50IGNvbnRlbnQgYmVmb3JlIHdyaXRpbmcgdG8gZGlzay5cbiAgICogRml4ICM5MDg6IE1pcnJvcnMgdGhlIHJlYWQtcGF0aCB2YWxpZGF0aW9uIGZyb20gU2VjdXJlWWFtbFBhcnNlci5wYXJzZSgpXG4gICAqIHRvIGVuc3VyZSB3cml0ZSDihpIgcmVhZCBzeW1tZXRyeS4gQ29udGVudCB0aGF0IGZhaWxzIHRoaXMgY2hlY2sgd291bGQgYWxzb1xuICAgKiBmYWlsIHRvIGxvYWQsIHNvIHJlamVjdGluZyBpdCBvbiB3cml0ZSBwcmV2ZW50cyBwZXJtYW5lbnRseSBicm9rZW4gZWxlbWVudHMuXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlU2VyaWFsaXplZENvbnRlbnQoY29udGVudDogc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gRXh0cmFjdCBmcm9udG1hdHRlciBpZiBwcmVzZW50IChTb25hckNsb3VkIFM2NTk0OiB1c2UgUmVnRXhwLmV4ZWMpXG4gICAgY29uc3QgZnJvbnRtYXR0ZXJSZWdleCA9IC9eLS0tXFxyP1xcbihbXFxzXFxTXSo/KVxccj9cXG4tLS0vO1xuICAgIGNvbnN0IGZyb250bWF0dGVyTWF0Y2ggPSBmcm9udG1hdHRlclJlZ2V4LmV4ZWMoY29udGVudCk7XG5cbiAgICBpZiAoZnJvbnRtYXR0ZXJNYXRjaCkge1xuICAgICAgY29uc3QgeWFtbENvbnRlbnQgPSBmcm9udG1hdHRlck1hdGNoWzFdO1xuICAgICAgY29uc3QgYm9keUNvbnRlbnQgPSBjb250ZW50LnN1YnN0cmluZyhmcm9udG1hdHRlck1hdGNoWzBdLmxlbmd0aCk7XG5cbiAgICAgIC8vIFlBTUwgYm9tYiBkZXRlY3Rpb24gKG1pcnJvcnMgU2VjdXJlWWFtbFBhcnNlci5wYXJzZSgpIHN0ZXAgNCkuXG4gICAgICAvLyBPbmx5IHJ1biB3aGVuIFlBTUwgaXMgdW5kZXIgTUFYX1lBTUxfTEVOR1RIICg2NEtCKSDigJQgdGhlIHNhbWUgbGltaXRcbiAgICAgIC8vIHVzZWQgYnkgdGhlIHJlYWQgcGF0aCBpbiBTZWN1cmVZYW1sUGFyc2VyLnBhcnNlKCkuIHZhbGlkYXRlWWFtbENvbnRlbnQoKVxuICAgICAgLy8gaW5jbHVkZXMgaXRzIG93biBzaXplIGNoZWNrIGludGVybmFsbHksIGFuZCB3ZSBpbnRlbnRpb25hbGx5IHNraXAgc2l6ZVxuICAgICAgLy8gZW5mb3JjZW1lbnQgb24gdGhlIHdyaXRlIHBhdGggYmVjYXVzZSB0aGUgc2VyaWFsaXplciBtYXkgcHJvZHVjZSBsYXJnZVxuICAgICAgLy8gZnJvbnRtYXR0ZXIgZm9yIGVsZW1lbnRzIHdpdGggbG9uZyBpbnN0cnVjdGlvbnMuIFRoZSByZWFkIHBhdGggd2lsbFxuICAgICAgLy8gcmVqZWN0IG92ZXJzaXplZCBZQU1MIG9uIHRoZSBuZXh0IGxvYWQgaWYgbmVlZGVkLlxuICAgICAgaWYgKHlhbWxDb250ZW50Lmxlbmd0aCA8PSBTRUNVUklUWV9MSU1JVFMuTUFYX1lBTUxfTEVOR1RIKSB7XG4gICAgICAgIGlmICghQ29udGVudFZhbGlkYXRvci52YWxpZGF0ZVlhbWxDb250ZW50KHlhbWxDb250ZW50KSkge1xuICAgICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICAgIHR5cGU6ICdZQU1MX0lOSkVDVElPTl9BVFRFTVBUJyxcbiAgICAgICAgICAgIHNldmVyaXR5OiAnQ1JJVElDQUwnLFxuICAgICAgICAgICAgc291cmNlOiBgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9LnZhbGlkYXRlU2VyaWFsaXplZENvbnRlbnRgLFxuICAgICAgICAgICAgZGV0YWlsczogYE1hbGljaW91cyBZQU1MIHBhdHRlcm4gZGV0ZWN0ZWQgaW4gc2VyaWFsaXplZCBvdXRwdXQgZm9yICR7dGhpcy5nZXRFbGVtZW50TGFiZWwoKX1gLFxuICAgICAgICAgICAgbWV0YWRhdGE6IHsgeWFtbExlbmd0aDogeWFtbENvbnRlbnQubGVuZ3RoIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFcnJvcihcbiAgICAgICAgICAgIGBTZXJpYWxpemVkICR7dGhpcy5nZXRFbGVtZW50TGFiZWwoKX0gY29udGFpbnMgbWFsaWNpb3VzIFlBTUwgcGF0dGVybnMg4oCUIHdyaXRlIGJsb2NrZWQuIGAgK1xuICAgICAgICAgICAgYFJldmlldyB0aGUgZWxlbWVudCdzIG1ldGFkYXRhIGFuZCBpbnN0cnVjdGlvbnMgZm9yIHN1c3BpY2lvdXMgYW5jaG9yL2FsaWFzIHBhdHRlcm5zLmAsXG4gICAgICAgICAgICAnY3JpdGljYWwnXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBCb2R5IGNvbnRlbnQgdmFsaWRhdGlvbiB3aXRoIGVsZW1lbnQgdHlwZSBjb250ZXh0XG4gICAgICBjb25zdCBjb250ZW50Q29udGV4dCA9IEJhc2VFbGVtZW50TWFuYWdlci5FTEVNRU5UX1RZUEVfVE9fQ09OVEVYVFt0aGlzLmVsZW1lbnRUeXBlXTtcbiAgICAgIGNvbnN0IGJvZHlWYWxpZGF0aW9uID0gQ29udGVudFZhbGlkYXRvci52YWxpZGF0ZUFuZFNhbml0aXplKGJvZHlDb250ZW50LCB7XG4gICAgICAgIGNvbnRlbnRDb250ZXh0LFxuICAgICAgfSk7XG4gICAgICBpZiAoIWJvZHlWYWxpZGF0aW9uLmlzVmFsaWQgJiYgYm9keVZhbGlkYXRpb24uc2V2ZXJpdHkgPT09ICdjcml0aWNhbCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXJyb3IoXG4gICAgICAgICAgYENyaXRpY2FsIHNlY3VyaXR5IHRocmVhdCBkZXRlY3RlZCBpbiBzZXJpYWxpemVkIGJvZHkgY29udGVudDogJHtib2R5VmFsaWRhdGlvbi5kZXRlY3RlZFBhdHRlcm5zPy5qb2luKCcsICcpfWAsXG4gICAgICAgICAgJ2NyaXRpY2FsJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IGFsbCBhdmFpbGFibGUgZWxlbWVudHNcbiAgICogU0VDVVJJVFk6IFVzZXMgUG9ydGZvbGlvTWFuYWdlci5saXN0RWxlbWVudHMoKSB3aGljaCBmaWx0ZXJzIHRlc3QgZWxlbWVudHNcbiAgICovXG4gIGFzeW5jIGxpc3QoKTogUHJvbWlzZTxUW10+IHtcbiAgICB0cnkge1xuICAgICAgLy8gRW5zdXJlIGRpcmVjdG9yeSBleGlzdHNcbiAgICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuY3JlYXRlRGlyZWN0b3J5KHRoaXMuZWxlbWVudERpcik7XG5cbiAgICAgIC8vIFNjYW4gZm9yIGNoYW5nZXMg4oCUIHBvcHVsYXRlcyBpbmRleCBmb3IgbGlzdFN1bW1hcmllcygpL2ZpbmRCeU5hbWUoKVxuICAgICAgLy8gTm9uLWZhdGFsOiBzY2FuIGZhaWx1cmUgbXVzdCBuZXZlciBwcmV2ZW50IGxpc3QoKSBmcm9tIHJldHVybmluZyByZXN1bHRzXG4gICAgICAvLyBFdmljdCBzdGFsZSBjYWNoZSBlbnRyaWVzIHNvIHRoZSBjYWNoZSBjaGVjayBiZWxvdyBuZXZlciByZXR1cm5zIG91dGRhdGVkIGRhdGFcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGRpZmYgPSBhd2FpdCB0aGlzLnN0b3JhZ2VMYXllci5zY2FuKCk7XG4gICAgICAgIGZvciAoY29uc3QgcmVsUGF0aCBvZiBbLi4uZGlmZi5tb2RpZmllZCwgLi4uZGlmZi5yZW1vdmVkXSkge1xuICAgICAgICAgIGNvbnN0IGFic1BhdGggPSBwYXRoLmpvaW4odGhpcy5lbGVtZW50RGlyLCByZWxQYXRoKTtcbiAgICAgICAgICBjb25zdCBleGlzdGluZ0lkID0gdGhpcy5maWxlUGF0aFRvSWQuZ2V0KGFic1BhdGgpO1xuICAgICAgICAgIGlmIChleGlzdGluZ0lkKSB7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnRzLmRlbGV0ZShleGlzdGluZ0lkKTtcbiAgICAgICAgICAgIHRoaXMuZmlsZVBhdGhUb0lkLmRlbGV0ZShhYnNQYXRoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggeyAvKiBpbmRleCB1bmF2YWlsYWJsZSwgbGlzdCgpIGNvbnRpbnVlcyB3aXRob3V0IGNhY2hlIG9wdGltaXphdGlvbiAqLyB9XG5cbiAgICAgIC8vIFVzZSBQb3J0Zm9saW9NYW5hZ2VyIGZvciBhdXRob3JpdGF0aXZlIGZpbGUgbGlzdCArIHNlY3VyaXR5IGZpbHRlcmluZ1xuICAgICAgY29uc3QgZmlsZXMgPSBhd2FpdCB0aGlzLnBvcnRmb2xpb01hbmFnZXIubGlzdEVsZW1lbnRzKHRoaXMuZWxlbWVudFR5cGUpO1xuXG4gICAgICAvLyBMb2FkIGFsbCBlbGVtZW50cyBpbiBwYXJhbGxlbCwgY2hlY2tpbmcgY2FjaGUgYmVmb3JlIGRpc2tcbiAgICAgIGNvbnN0IGVsZW1lbnRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIGZpbGVzLm1hcChhc3luYyAoZmlsZSkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBDaGVjayBjYWNoZSBmaXJzdCAoYXZvaWRzIGRpc2sgcmVhZCBpZiBlbGVtZW50IGlzIGFscmVhZHkgbG9hZGVkKVxuICAgICAgICAgICAgY29uc3QgYWJzb2x1dGVQYXRoID0gdGhpcy5yZXNvbHZlQWJzb2x1dGVQYXRoKGZpbGUpO1xuICAgICAgICAgICAgY29uc3QgY2FjaGVkID0gdGhpcy5nZXRDYWNoZWRFbGVtZW50QnlBYnNvbHV0ZVBhdGgoYWJzb2x1dGVQYXRoKTtcbiAgICAgICAgICAgIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWQ7XG4gICAgICAgICAgICAvLyBDYWNoZSBtaXNzIOKAlCByZWFkIGZyb20gZGlzayAocG9wdWxhdGVzIGNhY2hlIGZvciBuZXh0IHRpbWUpXG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5sb2FkKGZpbGUpO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gbG9hZCgpIGhhbmRsZXMgZXJyb3IgbG9nZ2luZyB3aXRoIGRlZHVwbGljYXRpb25cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICk7XG5cbiAgICAgIC8vIEZpbHRlciBvdXQgZmFpbGVkIGxvYWRzIGFuZCByZXR1cm5cbiAgICAgIHJldHVybiBlbGVtZW50cy5maWx0ZXIoKGUpOiBlIGlzIEF3YWl0ZWQ8VD4gPT4gZSAhPT0gbnVsbCkgYXMgVFtdO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgY29uc3QgbGFiZWwgPSB0aGlzLmdldEVsZW1lbnRMYWJlbENhcGl0YWxpemVkKCk7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgJHtsYWJlbH1zIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdCB5ZXQsIHJldHVybmluZyBlbXB0eSBhcnJheWApO1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBsaXN0ICR7dGhpcy5lbGVtZW50VHlwZX1zOmAsIGVycm9yKTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGlzdCBsaWdodHdlaWdodCBtZXRhZGF0YSBzdW1tYXJpZXMgd2l0aG91dCBsb2FkaW5nIGZ1bGwgZWxlbWVudHMuXG4gICAqIFVzZWZ1bCB3aGVuIG9ubHkgbmFtZXMvZGVzY3JpcHRpb25zL3RhZ3MgYXJlIG5lZWRlZC5cbiAgICovXG4gIGFzeW5jIGxpc3RTdW1tYXJpZXMoKTogUHJvbWlzZTxFbGVtZW50SW5kZXhFbnRyeVtdPiB7XG4gICAgYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5jcmVhdGVEaXJlY3RvcnkodGhpcy5lbGVtZW50RGlyKTtcbiAgICByZXR1cm4gdGhpcy5zdG9yYWdlTGF5ZXIubGlzdFN1bW1hcmllcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYW4gZWxlbWVudCBieSBwcmVkaWNhdGVcbiAgICovXG4gIGFzeW5jIGZpbmQocHJlZGljYXRlOiAoZWxlbWVudDogVCkgPT4gYm9vbGVhbik6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IGVsZW1lbnRzID0gYXdhaXQgdGhpcy5saXN0KCk7XG4gICAgcmV0dXJuIGVsZW1lbnRzLmZpbmQocHJlZGljYXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIG11bHRpcGxlIGVsZW1lbnRzIGJ5IHByZWRpY2F0ZVxuICAgKi9cbiAgYXN5bmMgZmluZE1hbnkocHJlZGljYXRlOiAoZWxlbWVudDogVCkgPT4gYm9vbGVhbik6IFByb21pc2U8VFtdPiB7XG4gICAgY29uc3QgZWxlbWVudHMgPSBhd2FpdCB0aGlzLmxpc3QoKTtcbiAgICByZXR1cm4gZWxlbWVudHMuZmlsdGVyKHByZWRpY2F0ZSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZCBhbiBlbGVtZW50IGJ5IG5hbWUgb3IgSUQgd2l0aG91dCBsb2FkaW5nIGFsbCBlbGVtZW50c1xuICAgKlxuICAgKiBJc3N1ZSAjMjQgKExPVyBQUklPUklUWSk6IFBlcmZvcm1hbmNlIG9wdGltaXphdGlvbiBmb3IgYWN0aXZhdGlvbiBmbG93XG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIGFuIG9wdGltaXplZCBsb29rdXAgdGhhdCB0cmllcyBjYWNoZSBmaXJzdCwgdGhlblxuICAgKiBhdHRlbXB0cyBkaXJlY3QgZmlsZSBhY2Nlc3MgYmVmb3JlIGZhbGxpbmcgYmFjayB0byBmdWxsIGxpc3QoKSBzY2FuLlxuICAgKiBUaGlzIGlzIHNpZ25pZmljYW50bHkgZmFzdGVyIHRoYW4gbGlzdCgpIGZvciBsYXJnZSBwb3J0Zm9saW9zLlxuICAgKlxuICAgKiBQRVJGT1JNQU5DRSBJTVBST1ZFTUVOVFM6XG4gICAqIDEuIENhY2hlIGxvb2t1cCAtIE8oMSkgaWYgZWxlbWVudCB3YXMgcHJldmlvdXNseSBsb2FkZWRcbiAgICogMi4gRGlyZWN0IGZpbGUgYWNjZXNzIC0gTygxKSBmb3IgbmFtZS1iYXNlZCBsb29rdXBzXG4gICAqIDMuIEZ1bGwgc2NhbiBmYWxsYmFjayAtIE8obikgb25seSBpZiBhYm92ZSBtZXRob2RzIGZhaWxcbiAgICpcbiAgICogQHBhcmFtIGlkZW50aWZpZXIgLSBFbGVtZW50IG5hbWUgb3IgSUQgdG8gc2VhcmNoIGZvclxuICAgKiBAcmV0dXJucyBFbGVtZW50IGlmIGZvdW5kLCB1bmRlZmluZWQgb3RoZXJ3aXNlXG4gICAqL1xuICBhc3luYyBmaW5kQnlOYW1lKGlkZW50aWZpZXI6IHN0cmluZyk6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICAgIC8vIEZpcnN0LCB0cnkgZmluZGluZyBpbiBjYWNoZSBieSBpdGVyYXRpbmcgY2FjaGVkIGVsZW1lbnRzXG4gICAgLy8gVGhpcyBpcyBmYXN0IChPKGNhY2hlIHNpemUpKSBhbmQgd29ya3MgZm9yIHJlY2VudGx5IGFjY2Vzc2VkIGVsZW1lbnRzXG4gICAgY29uc3QgY2FjaGVkRWxlbWVudCA9IGF3YWl0IHRoaXMuZmluZEluQ2FjaGUoaWRlbnRpZmllcik7XG4gICAgaWYgKGNhY2hlZEVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBjYWNoZWRFbGVtZW50O1xuICAgIH1cblxuICAgIC8vIFNlY29uZCwgdHJ5IHN0b3JhZ2UgbGF5ZXIgaW5kZXggKE8oMSkgbmFtZSBsb29rdXApXG4gICAgY29uc3QgaW5kZXhlZFBhdGggPSB0aGlzLnN0b3JhZ2VMYXllci5nZXRQYXRoQnlOYW1lKGlkZW50aWZpZXIpO1xuICAgIGlmIChpbmRleGVkUGF0aCkge1xuICAgICAgdHJ5IHsgcmV0dXJuIGF3YWl0IHRoaXMubG9hZChpbmRleGVkUGF0aCk7IH0gY2F0Y2ggeyAvKiBmYWxsIHRocm91Z2ggKi8gfVxuICAgIH1cblxuICAgIC8vIFRoaXJkLCB0cnkgZGlyZWN0IGZpbGUgYWNjZXNzIHVzaW5nIHN0YW5kYXJkIG5hbWluZyBjb252ZW50aW9uXG4gICAgLy8gRWxlbWVudCBmaWxlcyBhcmUgdHlwaWNhbGx5IG5hbWVkOiBsb3dlcmNhc2UtbmFtZS13aXRoLWh5cGhlbnMue2V4dH1cbiAgICAvLyBUaGlzIGlzIE8oMSkgZmlsZSBzeXN0ZW0gbG9va3VwXG4gICAgY29uc3QgZGlyZWN0TG9hZEF0dGVtcHQgPSBhd2FpdCB0aGlzLnRyeURpcmVjdExvYWQoaWRlbnRpZmllcik7XG4gICAgaWYgKGRpcmVjdExvYWRBdHRlbXB0KSB7XG4gICAgICByZXR1cm4gZGlyZWN0TG9hZEF0dGVtcHQ7XG4gICAgfVxuXG4gICAgLy8gSWYgc3RvcmFnZSBsYXllciBoYXMgY29tcGxldGVkIGF0IGxlYXN0IG9uZSBzY2FuLCB0aGUgaW5kZXggaXNcbiAgICAvLyBhdXRob3JpdGF0aXZlIOKAlCBhIG1pc3MgbWVhbnMgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QuIFNraXAgdGhlXG4gICAgLy8gZXhwZW5zaXZlIGxpc3QoKSBmYWxsYmFjayB0byBhdm9pZCBPKG4pIHJlc2NhbnMgb24gZXZlcnkgY2FjaGUgbWlzcy5cbiAgICBpZiAodGhpcy5zdG9yYWdlTGF5ZXIuaGFzQ29tcGxldGVkU2NhbigpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrOiBGdWxsIGxpc3QoKSBzY2FuIChPKG4pIC0gbG9hZHMgYWxsIGVsZW1lbnRzKVxuICAgIC8vIE9ubHkgdXNlZCBvbiBmaXJzdCBhY2Nlc3MgYmVmb3JlIGFueSBzY2FuIGhhcyBjb21wbGV0ZWQuXG4gICAgLy8gVGhpcyBlbnN1cmVzIHdlIGZpbmQgZWxlbWVudHMgZXZlbiB3aXRoIG5vbi1zdGFuZGFyZCBmaWxlIG5hbWluZy5cbiAgICBjb25zdCBlbGVtZW50cyA9IGF3YWl0IHRoaXMubGlzdCgpO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRJZGVudGlmaWVyID0gdGhpcy5ub3JtYWxpemVGaWxlbmFtZShpZGVudGlmaWVyKTtcbiAgICByZXR1cm4gZWxlbWVudHMuZmluZChlID0+XG4gICAgICB0aGlzLm5vcm1hbGl6ZUZpbGVuYW1lKGUubWV0YWRhdGEubmFtZSkgPT09IG5vcm1hbGl6ZWRJZGVudGlmaWVyIHx8XG4gICAgICBlLm1ldGFkYXRhLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gaWRlbnRpZmllci50b0xvd2VyQ2FzZSgpIHx8XG4gICAgICBlLmlkID09PSBpZGVudGlmaWVyXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXI6IFNlYXJjaCBjYWNoZSBmb3IgZWxlbWVudCBieSBuYW1lIG9yIElEXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZpbmRJbkNhY2hlKGlkZW50aWZpZXI6IHN0cmluZyk6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICAgIC8vIExSVUNhY2hlIGRvZXNuJ3QgcHJvdmlkZSBpdGVyYXRpb24sIGJ1dCB3ZSBjYW4gY2hlY2sgaWYgd2UgaGF2ZVxuICAgIC8vIGEgY2FjaGVkIHBhdGggZm9yIHRoaXMgaWRlbnRpZmllciBieSB0cnlpbmcgY29tbW9uIG5hbWluZyBwYXR0ZXJucy5cbiAgICAvLyBJTVBPUlRBTlQ6IGZpbGVQYXRoVG9JZCBzdG9yZXMgYWJzb2x1dGUgcGF0aHMgKHNldCBieSBjYWNoZUVsZW1lbnQgdmlhXG4gICAgLy8gcmVzb2x2ZUFic29sdXRlUGF0aCksIHNvIHdlIG11c3QgcmVzb2x2ZSB0byBhYnNvbHV0ZSBiZWZvcmUgbG9va3VwLlxuICAgIGNvbnN0IHBvc3NpYmxlRmlsZW5hbWVzID0gW1xuICAgICAgaWRlbnRpZmllcixcbiAgICAgIGAke2lkZW50aWZpZXJ9JHt0aGlzLmdldEZpbGVFeHRlbnNpb24oKX1gLFxuICAgICAgLy8gVXNlIHVuaWZpZWQgbm9ybWFsaXplRmlsZW5hbWUgZm9yIGNvbnNpc3RlbnQgY2FjaGUgbG9va3Vwc1xuICAgICAgdGhpcy5nZXRFbGVtZW50RmlsZW5hbWUoaWRlbnRpZmllcilcbiAgICBdO1xuXG4gICAgZm9yIChjb25zdCBmaWxlbmFtZSBvZiBwb3NzaWJsZUZpbGVuYW1lcykge1xuICAgICAgY29uc3QgYWJzb2x1dGVQYXRoID0gdGhpcy5yZXNvbHZlQWJzb2x1dGVQYXRoKGZpbGVuYW1lKTtcbiAgICAgIGNvbnN0IGNhY2hlZElkID0gdGhpcy5maWxlUGF0aFRvSWQuZ2V0KGFic29sdXRlUGF0aCk7XG4gICAgICBpZiAoY2FjaGVkSWQpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxlbWVudHMuZ2V0KGNhY2hlZElkKTtcbiAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyOiBUcnkgbG9hZGluZyBlbGVtZW50IGRpcmVjdGx5IGJ5IGNvbnN0cnVjdGluZyBleHBlY3RlZCBmaWxlbmFtZVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB0cnlEaXJlY3RMb2FkKGlkZW50aWZpZXI6IHN0cmluZyk6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICAgIC8vIFRyeSBsb2FkaW5nIHVzaW5nIGNvbW1vbiBuYW1pbmcgcGF0dGVybnNcbiAgICAvLyBVc2UgdW5pZmllZCBub3JtYWxpemVGaWxlbmFtZSBmb3IgY29uc2lzdGVudCBmaWxlbmFtZSBjb25zdHJ1Y3Rpb25cbiAgICBjb25zdCBwb3NzaWJsZVBhdGhzID0gW1xuICAgICAgLy8gUHJpbWFyeTogVXNlIHVuaWZpZWQgbm9ybWFsaXphdGlvbiAoaGFuZGxlcyBDYW1lbENhc2UsIHNwYWNlcywgdW5kZXJzY29yZXMsIGV0Yy4pXG4gICAgICB0aGlzLmdldEVsZW1lbnRGaWxlbmFtZShpZGVudGlmaWVyKSxcbiAgICAgIC8vIEZhbGxiYWNrOiBJZGVudGlmaWVyIGFzLWlzIHdpdGggZXh0ZW5zaW9uXG4gICAgICBgJHtpZGVudGlmaWVyfSR7dGhpcy5nZXRGaWxlRXh0ZW5zaW9uKCl9YCxcbiAgICAgIC8vIEZhbGxiYWNrOiBJZGVudGlmaWVyIGFscmVhZHkgaW5jbHVkZXMgZXh0ZW5zaW9uXG4gICAgICBpZGVudGlmaWVyXG4gICAgXTtcblxuICAgIGZvciAoY29uc3QgZmlsZVBhdGggb2YgcG9zc2libGVQYXRocykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGF3YWl0IHRoaXMubG9hZChmaWxlUGF0aCk7XG4gICAgICAgIC8vIFZlcmlmeSB0aGUgbG9hZGVkIGVsZW1lbnQgbWF0Y2hlcyB0aGUgaWRlbnRpZmllclxuICAgICAgICAvLyBOb3JtYWxpemUgYm90aCBzaWRlcyBzbyBcIkNvZGUgUmV2aWV3XCIgKHNwYWNlcykgbWF0Y2hlcyBcImNvZGUtcmV2aWV3XCIgKGh5cGhlbnMpXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRNZXRhTmFtZSA9IHRoaXMubm9ybWFsaXplRmlsZW5hbWUoZWxlbWVudC5tZXRhZGF0YS5uYW1lKTtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZElkZW50aWZpZXIgPSB0aGlzLm5vcm1hbGl6ZUZpbGVuYW1lKGlkZW50aWZpZXIpO1xuICAgICAgICBpZiAobm9ybWFsaXplZE1ldGFOYW1lID09PSBub3JtYWxpemVkSWRlbnRpZmllciB8fFxuICAgICAgICAgICAgZWxlbWVudC5tZXRhZGF0YS5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IGlkZW50aWZpZXIudG9Mb3dlckNhc2UoKSB8fFxuICAgICAgICAgICAgZWxlbWVudC5pZCA9PT0gaWRlbnRpZmllcikge1xuICAgICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChfZXJyb3IpIHtcbiAgICAgICAgLy8gRmlsZSBkb2Vzbid0IGV4aXN0IG9yIGZhaWxlZCB0byBsb2FkIC0gdHJ5IG5leHQgcGF0aFxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGFuIGVsZW1lbnRcbiAgICogRGVsZWdhdGVzIHRvIGVsZW1lbnQncyBvd24gdmFsaWRhdGUgbWV0aG9kXG4gICAqXG4gICAqIEByZXR1cm5zIFZhbGlkYXRpb24gcmVzdWx0IHdpdGggYm90aCAndmFsaWQnIGFuZCAnaXNWYWxpZCcgcHJvcGVydGllcy5cbiAgICogICAgICAgICAgJ2lzVmFsaWQnIGlzIGRlcHJlY2F0ZWQgLSB1c2UgJ3ZhbGlkJyBmb3IgbmV3IGNvZGUuXG4gICAqL1xuICB2YWxpZGF0ZShlbGVtZW50OiBUKTogRWxlbWVudFZhbGlkYXRpb25SZXN1bHQge1xuICAgIGNvbnN0IHJlc3VsdCA9IGVsZW1lbnQudmFsaWRhdGUoKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBhbiBlbGVtZW50XG4gICAqIFNFQ1VSSVRZOiBQYXRoIHZhbGlkYXRpb24gdG8gcHJldmVudCBkZWxldGlvbiBvdXRzaWRlIGRpcmVjdG9yeVxuICAgKiBDQUNIRSBGSVg6IFVzZXMgZmlsZXBhdGgtYmFzZWQgY2FjaGUgcmVtb3ZhbCB0byBwcmV2ZW50IHN0YWxlIGVudHJpZXNcbiAgICovXG4gIGFzeW5jIGRlbGV0ZShmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgdHlwZTogJ0VMRU1FTlRfREVMRVRFRCcsXG4gICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICBzb3VyY2U6IGAke3RoaXMuY29uc3RydWN0b3IubmFtZX0uZGVsZXRlYCxcbiAgICAgIGRldGFpbHM6IGBBdHRlbXB0aW5nIHRvIGRlbGV0ZSAke3RoaXMuZ2V0RWxlbWVudExhYmVsKCl9OiAke2ZpbGVQYXRofWBcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgcmVsYXRpdmVQYXRoLCBhYnNvbHV0ZVBhdGggfSA9IGF3YWl0IHRoaXMubm9ybWFsaXplQW5kVmFsaWRhdGVQYXRoKGZpbGVQYXRoKTtcbiAgICBjb25zdCBjb3JyZWxhdGlvbklkID0gcmFuZG9tVVVJRCgpO1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IEVsZW1lbnRUcmFuc2FjdGlvblNjb3BlKHRoaXMuZ2V0RWxlbWVudExhYmVsKCksIGNvcnJlbGF0aW9uSWQpO1xuXG4gICAgdGhpcy5ldmVudERpc3BhdGNoZXIuZW1pdChcbiAgICAgICdlbGVtZW50OmRlbGV0ZTpzdGFydCcsXG4gICAgICB0aGlzLmNyZWF0ZUV2ZW50UGF5bG9hZCh7IGNvcnJlbGF0aW9uSWQsIGZpbGVQYXRoOiByZWxhdGl2ZVBhdGggfSlcbiAgICApO1xuXG4gICAgdHJhbnNhY3Rpb24uYWRkQ29tbWl0KGFzeW5jICgpID0+IHtcbiAgICAgIHRoaXMudW5jYWNoZUJ5UGF0aChyZWxhdGl2ZVBhdGgpO1xuICAgICAgdGhpcy5zdG9yYWdlTGF5ZXIubm90aWZ5RGVsZXRlZChyZWxhdGl2ZVBhdGgpO1xuICAgICAgdGhpcy5ldmVudERpc3BhdGNoZXIuZW1pdEFzeW5jKFxuICAgICAgICAnZWxlbWVudDpkZWxldGU6c3VjY2VzcycsXG4gICAgICAgIHRoaXMuY3JlYXRlRXZlbnRQYXlsb2FkKHsgY29ycmVsYXRpb25JZCwgZmlsZVBhdGg6IHJlbGF0aXZlUGF0aCB9KVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIHRyYW5zYWN0aW9uLmFkZFJvbGxiYWNrKGFzeW5jIChlcnJvcikgPT4ge1xuICAgICAgdGhpcy5ldmVudERpc3BhdGNoZXIuZW1pdEFzeW5jKFxuICAgICAgICAnZWxlbWVudDpkZWxldGU6ZXJyb3InLFxuICAgICAgICB0aGlzLmNyZWF0ZUV2ZW50UGF5bG9hZCh7IGNvcnJlbGF0aW9uSWQsIGZpbGVQYXRoOiByZWxhdGl2ZVBhdGgsIGVycm9yIH0pXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgYXdhaXQgdHJhbnNhY3Rpb24ucnVuKGFzeW5jICgpID0+IHtcbiAgICAgIGlmICh0aGlzLmNhbkRlbGV0ZSkge1xuICAgICAgICBjb25zdCBlbGVtZW50Rm9yVmFsaWRhdGlvbiA9IGF3YWl0IHRoaXMubG9hZEVsZW1lbnRTbmFwc2hvdChhYnNvbHV0ZVBhdGgsIHJlbGF0aXZlUGF0aCk7XG4gICAgICAgIGNvbnN0IGRlY2lzaW9uID0gYXdhaXQgdGhpcy5jYW5EZWxldGUoZWxlbWVudEZvclZhbGlkYXRpb24pO1xuICAgICAgICBpZiAoIWRlY2lzaW9uLmFsbG93ZWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZGVjaXNpb24ucmVhc29uID8/IGBEZWxldGlvbiBub3QgcGVybWl0dGVkIGZvciAke3RoaXMuZ2V0RWxlbWVudExhYmVsKCl9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgbW92ZWRUb0JhY2t1cCA9IGF3YWl0IHRoaXMuY3JlYXRlQmFja3VwQmVmb3JlRGVsZXRlKGFic29sdXRlUGF0aCk7XG4gICAgICBpZiAoIW1vdmVkVG9CYWNrdXApIHtcbiAgICAgICAgYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5kZWxldGVGaWxlKGFic29sdXRlUGF0aCwgdGhpcy5lbGVtZW50VHlwZSwge1xuICAgICAgICAgIHNvdXJjZTogYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfS5kZWxldGVgXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgbG9nZ2VyLmluZm8oYCR7dGhpcy5nZXRFbGVtZW50TGFiZWxDYXBpdGFsaXplZCgpfSBkZWxldGVkOiAke2ZpbGVQYXRofWApO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGFuIGVsZW1lbnQgZXhpc3RzXG4gICAqL1xuICBhc3luYyBleGlzdHMoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IGFic29sdXRlUGF0aCB9ID0gYXdhaXQgdGhpcy5ub3JtYWxpemVBbmRWYWxpZGF0ZVBhdGgoZmlsZVBhdGgpO1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuZXhpc3RzKGFic29sdXRlUGF0aCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGEgZmlsZSBwYXRoXG4gICAqL1xuICB2YWxpZGF0ZVBhdGgoZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzYW5pdGl6ZWQgPSBzYW5pdGl6ZUlucHV0KGZpbGVQYXRoLCAyNTUpO1xuXG4gICAgICBpZiAoIXNhbml0aXplZCB8fCBwYXRoLmlzQWJzb2x1dGUoc2FuaXRpemVkKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChzYW5pdGl6ZWQuaW5jbHVkZXMoJy4uJykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBleHQgPSBwYXRoLmV4dG5hbWUoc2FuaXRpemVkKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgY29uc3QgYWxsb3dlZEV4dGVuc2lvbnMgPSBbJy5tZCcsICcubWFya2Rvd24nLCAnLnR4dCcsICcueW1sJywgJy55YW1sJ107XG5cbiAgICAgIHJldHVybiBleHQgPT09ICcnIHx8IGFsbG93ZWRFeHRlbnNpb25zLmluY2x1ZGVzKGV4dCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZWxlbWVudCB0eXBlXG4gICAqL1xuICBnZXRFbGVtZW50VHlwZSgpOiBFbGVtZW50VHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudFR5cGU7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgYSBmaWxlIHBhdGggdG8gaXRzIGFic29sdXRlIGZvcm0gZm9yIGNhY2hlIGNvbnNpc3RlbmN5XG4gICAqIEVuc3VyZXMgY29uc2lzdGVudCBwYXRoIGhhbmRsaW5nIGFjcm9zcyByZWxhdGl2ZS9hYnNvbHV0ZSBwYXRoc1xuICAgKi9cbiAgcHJvdGVjdGVkIHJlc29sdmVBYnNvbHV0ZVBhdGgoZmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHBhdGguaXNBYnNvbHV0ZShmaWxlUGF0aClcbiAgICAgID8gcGF0aC5ub3JtYWxpemUoZmlsZVBhdGgpXG4gICAgICA6IHBhdGgubm9ybWFsaXplKHBhdGguam9pbih0aGlzLmVsZW1lbnREaXIsIGZpbGVQYXRoKSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIG5vcm1hbGl6ZUFuZFZhbGlkYXRlUGF0aChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx7IHJlbGF0aXZlUGF0aDogc3RyaW5nOyBhYnNvbHV0ZVBhdGg6IHN0cmluZyB9PiB7XG4gICAgY29uc3Qgc2FuaXRpemVkUGF0aCA9IHNhbml0aXplSW5wdXQoZmlsZVBhdGgsIDI1NSk7XG5cbiAgICBpZiAoIXNhbml0aXplZFBhdGggfHwgc2FuaXRpemVkUGF0aC50cmltKCkubGVuZ3RoID09PSAwIHx8IHNhbml0aXplZFBhdGggPT09ICcuJyB8fCBzYW5pdGl6ZWRQYXRoID09PSBwYXRoLnNlcCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkICR7dGhpcy5nZXRFbGVtZW50TGFiZWwoKX0gcGF0aDogZW1wdHkgcGF0aCBpcyBub3QgYWxsb3dlZGApO1xuICAgIH1cblxuICAgIGlmIChwYXRoLmlzQWJzb2x1dGUoc2FuaXRpemVkUGF0aCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQWJzb2x1dGUgJHt0aGlzLmdldEVsZW1lbnRMYWJlbCgpfSBwYXRocyBhcmUgbm90IGFsbG93ZWRgKTtcbiAgICB9XG5cbiAgICAvLyBOb3JtYWxpemUgdGhlIHBhdGggKHJlbW92ZSByZWR1bmRhbnQgc2VwYXJhdG9ycywgcmVzb2x2ZSAuIGFuZCAuLilcbiAgICBjb25zdCBub3JtYWxpemVkUmVsYXRpdmUgPSBwYXRoLm5vcm1hbGl6ZShzYW5pdGl6ZWRQYXRoKTtcblxuICAgIC8vIEJ1aWxkIGFic29sdXRlIHBhdGhcbiAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLmpvaW4odGhpcy5lbGVtZW50RGlyLCBub3JtYWxpemVkUmVsYXRpdmUpO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFZhbGlkYXRlIFdJVEhPVVQgcmVzb2x2aW5nIHN5bWxpbmtzIC0ganVzdCBjaGVjayBzZWN1cml0eSBjb25zdHJhaW50c1xuICAgICAgYXdhaXQgUGF0aFZhbGlkYXRvci52YWxpZGF0ZUVsZW1lbnRQYXRoT25seShhYnNvbHV0ZVBhdGgsIHRoaXMuZWxlbWVudERpcik7XG5cbiAgICAgIC8vIFJldHVybiB0aGUgaW5wdXQgYXMgcmVsYXRpdmVQYXRoIChpdCdzIGFscmVhZHkgcmVsYXRpdmUpIGFuZCBjb21wdXRlZCBhYnNvbHV0ZVBhdGhcbiAgICAgIHJldHVybiB7IHJlbGF0aXZlUGF0aDogbm9ybWFsaXplZFJlbGF0aXZlLCBhYnNvbHV0ZVBhdGggfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgcmVhc29uID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnSW52YWxpZCBwYXRoJztcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCAke3RoaXMuZ2V0RWxlbWVudExhYmVsKCl9IHBhdGg6ICR7cmVhc29ufWApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q2FjaGVkRWxlbWVudEJ5QWJzb2x1dGVQYXRoKGFic29sdXRlUGF0aDogc3RyaW5nKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZWxlbWVudElkID0gdGhpcy5maWxlUGF0aFRvSWQuZ2V0KHRoaXMucmVzb2x2ZUFic29sdXRlUGF0aChhYnNvbHV0ZVBhdGgpKTtcbiAgICBpZiAoIWVsZW1lbnRJZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudHMuZ2V0KGVsZW1lbnRJZCk7XG4gIH1cblxuICAvKipcbiAgICogUHJvdGVjdGVkIGNhY2hlIGxvb2t1cCBieSBhYnNvbHV0ZSBwYXRoLlxuICAgKiBBbGxvd3Mgc3ViY2xhc3NlcyB3aXRoIGN1c3RvbSBsb2FkKCkgb3ZlcnJpZGVzIChlLmcuIE1lbW9yeU1hbmFnZXIpXG4gICAqIHRvIGNoZWNrIHRoZSBMUlUgY2FjaGUgYmVmb3JlIHJlLXJlYWRpbmcgZnJvbSBkaXNrLlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldENhY2hlZEJ5QWJzb2x1dGVQYXRoKGFic29sdXRlUGF0aDogc3RyaW5nKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q2FjaGVkRWxlbWVudEJ5QWJzb2x1dGVQYXRoKGFic29sdXRlUGF0aCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGxvYWRFbGVtZW50U25hcHNob3QoYWJzb2x1dGVQYXRoOiBzdHJpbmcsIHJlbGF0aXZlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxUPiB7XG4gICAgY29uc3QgY2FjaGVkID0gdGhpcy5nZXRDYWNoZWRFbGVtZW50QnlBYnNvbHV0ZVBhdGgoYWJzb2x1dGVQYXRoKTtcbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICByZXR1cm4gY2FjaGVkO1xuICAgIH1cblxuICAgIGNvbnN0IHJhdyA9IGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMucmVhZEVsZW1lbnRGaWxlKGFic29sdXRlUGF0aCwgdGhpcy5lbGVtZW50VHlwZSwge1xuICAgICAgc291cmNlOiBgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9LmxvYWRFbGVtZW50U25hcHNob3RgXG4gICAgfSk7XG4gICAgY29uc3QgcGFyc2VkID0gU2VjdXJlWWFtbFBhcnNlci5zYWZlTWF0dGVyKHJhdywgdW5kZWZpbmVkLCB7XG4gICAgICBjb250ZW50Q29udGV4dDogQmFzZUVsZW1lbnRNYW5hZ2VyLkVMRU1FTlRfVFlQRV9UT19DT05URVhUW3RoaXMuZWxlbWVudFR5cGVdLFxuICAgIH0pO1xuICAgIGNvbnN0IG1ldGFkYXRhID0gYXdhaXQgdGhpcy5wYXJzZU1ldGFkYXRhKHBhcnNlZC5kYXRhKTtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5jcmVhdGVFbGVtZW50KG1ldGFkYXRhLCBwYXJzZWQuY29udGVudCk7XG4gICAgdGhpcy5jYWNoZUVsZW1lbnQoZWxlbWVudCwgcmVsYXRpdmVQYXRoKTtcbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgc3RhbmRhcmRpemVkIGV2ZW50IHBheWxvYWQgZm9yIGVsZW1lbnQgbGlmZWN5Y2xlIGV2ZW50cy5cbiAgICpcbiAgICogVGhpcyBoZWxwZXIgaXMgYXZhaWxhYmxlIHRvIHN1YmNsYXNzZXMgdG8gZW5zdXJlIGNvbnNpc3RlbnQgZXZlbnQgcGF5bG9hZFxuICAgKiBzdHJ1Y3R1cmUgd2hlbiBlbWl0dGluZyBjdXN0b20gZXZlbnRzIHZpYSB0aGUgZGlzcGF0Y2hlciBnZXR0ZXIuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBFdmVudCBwYXJhbWV0ZXJzIGluY2x1ZGluZyBjb3JyZWxhdGlvbiBJRCwgZWxlbWVudCwgZmlsZSBwYXRoLCBhbmQgb3B0aW9uYWwgZXJyb3JcbiAgICogQHJldHVybnMgRnVsbHktZm9ybWVkIEVsZW1lbnRFdmVudFBheWxvYWQgcmVhZHkgZm9yIGVtaXNzaW9uXG4gICAqL1xuICBwcm90ZWN0ZWQgY3JlYXRlRXZlbnRQYXlsb2FkKHBhcmFtczoge1xuICAgIGNvcnJlbGF0aW9uSWQ6IHN0cmluZztcbiAgICBmaWxlUGF0aD86IHN0cmluZztcbiAgICBlbGVtZW50PzogVDtcbiAgICBlcnJvcj86IHVua25vd247XG4gIH0pOiBFbGVtZW50RXZlbnRQYXlsb2FkIHtcbiAgICBjb25zdCBlbGVtZW50SWQgPSBwYXJhbXMuZWxlbWVudD8uaWQ7XG4gICAgY29uc3QgZ2VuZXJhdGlvbiA9IGVsZW1lbnRJZCAhPT0gdW5kZWZpbmVkID8gdGhpcy5lbGVtZW50R2VuZXJhdGlvbnMuZ2V0KGVsZW1lbnRJZCkgOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvcnJlbGF0aW9uSWQ6IHBhcmFtcy5jb3JyZWxhdGlvbklkLFxuICAgICAgZWxlbWVudFR5cGU6IHRoaXMuZWxlbWVudFR5cGUsXG4gICAgICBlbGVtZW50SWQsXG4gICAgICBmaWxlUGF0aDogcGFyYW1zLmZpbGVQYXRoLFxuICAgICAgbWV0YWRhdGE6IEVsZW1lbnRFdmVudERpc3BhdGNoZXIuc25hcHNob3RNZXRhZGF0YShwYXJhbXMuZWxlbWVudCksXG4gICAgICBnZW5lcmF0aW9uLFxuICAgICAgZXJyb3I6IHBhcmFtcy5lcnJvclxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUV4dGVybmFsQ2hhbmdlKHJlbGF0aXZlUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy51bmNhY2hlQnlQYXRoKHJlbGF0aXZlUGF0aCk7XG4gICAgdGhpcy5zdG9yYWdlTGF5ZXIuaW52YWxpZGF0ZSgpO1xuICAgIC8vIENsZWFyIGVycm9yIHN1cHByZXNzaW9uIHNvIGEgY2hhbmdlZCBmaWxlIGdldHMgZnJlc2ggbG9nZ2luZ1xuICAgIHRoaXMuaW52YWxpZEVsZW1lbnRzLmRlbGV0ZShyZWxhdGl2ZVBhdGgpO1xuICAgIHRoaXMuc3VwcHJlc3NlZExvYWRQYXRocy5kZWxldGUocmVsYXRpdmVQYXRoKTtcbiAgICBjb25zdCBjb3JyZWxhdGlvbklkID0gcmFuZG9tVVVJRCgpO1xuICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyLmVtaXRBc3luYyhcbiAgICAgICdlbGVtZW50OmV4dGVybmFsLWNoYW5nZScsXG4gICAgICB0aGlzLmNyZWF0ZUV2ZW50UGF5bG9hZCh7IGNvcnJlbGF0aW9uSWQsIGZpbGVQYXRoOiByZWxhdGl2ZVBhdGggfSlcbiAgICApO1xuXG4gICAgaWYgKHRoaXMuYXV0b1JlbG9hZE9uRXh0ZXJuYWxDaGFuZ2UpIHtcbiAgICAgIHZvaWQgdGhpcy5sb2FkKHJlbGF0aXZlUGF0aCkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdBdXRvIHJlbG9hZCBhZnRlciBleHRlcm5hbCBjaGFuZ2UgZmFpbGVkJywge1xuICAgICAgICAgIGVsZW1lbnRUeXBlOiB0aGlzLmVsZW1lbnRUeXBlLFxuICAgICAgICAgIGZpbGVQYXRoOiByZWxhdGl2ZVBhdGgsXG4gICAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogZXJyb3JcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGVsZW1lbnQgdG8gYm90aCBjYWNoZXMgKGJpZGlyZWN0aW9uYWwgbWFwcGluZylcbiAgICogQHBhcmFtIGVsZW1lbnQgLSBFbGVtZW50IHRvIGNhY2hlXG4gICAqIEBwYXJhbSBmaWxlUGF0aCAtIEZpbGUgcGF0aCAocmVsYXRpdmUgb3IgYWJzb2x1dGUpXG4gICAqL1xuICBwcm90ZWN0ZWQgY2FjaGVFbGVtZW50KGVsZW1lbnQ6IFQsIGZpbGVQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSB0aGlzLnJlc29sdmVBYnNvbHV0ZVBhdGgoZmlsZVBhdGgpO1xuXG4gICAgLy8gQ2xlYXIgYW55IHN0YWxlIGNhY2hlIGVudHJpZXMgZm9yIHRoaXMgZmlsZXBhdGggYmVmb3JlIGFkZGluZyB0aGUgbmV3IG9uZS5cbiAgICAvLyBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIGdlbmVyYXRlSWQoKSBpbiBCYXNlRWxlbWVudC50cyBpbmNsdWRlcyBhIERhdGUubm93KClcbiAgICAvLyB0aW1lc3RhbXAsIGNhdXNpbmcgZWFjaCBsb2FkIGZyb20gZGlzayB0byBnZW5lcmF0ZSBhIGRpZmZlcmVudCBJRC4gV2l0aG91dCB0aGlzXG4gICAgLy8gY2xlYW51cCwgb2xkIElEcyByZW1haW4gaW4gdGhlIGNhY2hlIGFzIHN0YWxlIGRhdGEsIGxlYWRpbmcgdG8gaW5jb25zaXN0ZW50XG4gICAgLy8gcmVzdWx0cyBpbiBtZXRob2RzIGxpa2UgZmluZFBlcnNvbmEoKSBvciBsaXN0KCkuXG4gICAgY29uc3QgZXhpc3RpbmdJZCA9IHRoaXMuZmlsZVBhdGhUb0lkLmdldChhYnNvbHV0ZVBhdGgpO1xuICAgIGlmIChleGlzdGluZ0lkICYmIGV4aXN0aW5nSWQgIT09IGVsZW1lbnQuaWQpIHtcbiAgICAgIC8vIENsZWFyIHN0YWxlIGNhY2hlIGVudHJ5IHdoZW4gZWxlbWVudCBJRCBoYXMgY2hhbmdlZFxuICAgICAgdGhpcy5lbGVtZW50cy5kZWxldGUoZXhpc3RpbmdJZCk7XG4gICAgICB0aGlzLmVsZW1lbnRHZW5lcmF0aW9ucy5kZWxldGUoZXhpc3RpbmdJZCk7XG4gICAgfVxuXG4gICAgdGhpcy5lbGVtZW50cy5zZXQoZWxlbWVudC5pZCwgZWxlbWVudCk7XG4gICAgdGhpcy5maWxlUGF0aFRvSWQuc2V0KGFic29sdXRlUGF0aCwgZWxlbWVudC5pZCk7XG4gICAgY29uc3QgZ2VuZXJhdGlvbiA9ICsrdGhpcy5jYWNoZUdlbmVyYXRpb25Db3VudGVyO1xuICAgIHRoaXMuZWxlbWVudEdlbmVyYXRpb25zLnNldChlbGVtZW50LmlkLCBnZW5lcmF0aW9uKTtcblxuICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGguaXNBYnNvbHV0ZShmaWxlUGF0aClcbiAgICAgID8gcGF0aC5yZWxhdGl2ZSh0aGlzLmVsZW1lbnREaXIsIGZpbGVQYXRoKVxuICAgICAgOiBmaWxlUGF0aDtcblxuICAgIHRyeSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudCwgJ2ZpbGVuYW1lJywge1xuICAgICAgICB2YWx1ZTogcGF0aC5iYXNlbmFtZShyZWxhdGl2ZVBhdGgpLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9KTtcblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW1lbnQsICdmaWxlUGF0aCcsIHtcbiAgICAgICAgdmFsdWU6IHJlbGF0aXZlUGF0aCxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZygnRmFpbGVkIHRvIGF0dGFjaCBmaWxlbmFtZSBtZXRhZGF0YSB0byBlbGVtZW50Jywge1xuICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgICBlbGVtZW50SWQ6IGVsZW1lbnQuaWQsXG4gICAgICAgIGZpbGVQYXRoOiByZWxhdGl2ZVBhdGhcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JjZSBhIGZyZXNoIGRpc2sgc2NhbiBhbmQgZXZpY3QgYW55IG1vZGlmaWVkL3JlbW92ZWQgZW50cmllcyBmcm9tIHRoZVxuICAgKiBpbi1tZW1vcnkgTFJVIGNhY2hlLiBDYWxsIGJlZm9yZSBmaW5kQnlOYW1lKCkgd2hlbiBmcmVzaG5lc3MgaXMgY3JpdGljYWxcbiAgICogKGUuZy4gb24gZW5zZW1ibGUgYWN0aXZhdGlvbikgdG8gcGljayB1cCBleHRlcm5hbCBmaWxlIGNoYW5nZXMgdGhhdFxuICAgKiBvY2N1cnJlZCBzaW5jZSB0aGUgbGFzdCBzY2FuLCBldmVuIGlmIHRoZSBzY2FuIGNvb2xkb3duIGlzIHN0aWxsIGFjdGl2ZS5cbiAgICpcbiAgICogVW5saWtlIGxpc3QoKSwgdGhpcyBkb2VzIG5vdCBsb2FkIGFsbCBlbGVtZW50cyDigJQgaXQgb25seSBldmljdHMgc3RhbGUgb25lcy5cbiAgICogRml4ZXMgIzE4OTUgKGVuc2VtYmxlIGFjdGl2YXRpb24gc2VydmluZyBzdGFsZSBjYWNoZWQgZWxlbWVudCBsaXN0KS5cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBzY2FuQW5kRXZpY3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5zdG9yYWdlTGF5ZXIuaW52YWxpZGF0ZSgpOyAvLyBieXBhc3MgY29vbGRvd24gc28gdGhlIG5leHQgc2NhbiBoaXRzIGRpc2tcbiAgICB0cnkge1xuICAgICAgY29uc3QgZGlmZiA9IGF3YWl0IHRoaXMuc3RvcmFnZUxheWVyLnNjYW4oKTtcbiAgICAgIGZvciAoY29uc3QgcmVsUGF0aCBvZiBbLi4uZGlmZi5tb2RpZmllZCwgLi4uZGlmZi5yZW1vdmVkXSkge1xuICAgICAgICBjb25zdCBhYnNQYXRoID0gcGF0aC5qb2luKHRoaXMuZWxlbWVudERpciwgcmVsUGF0aCk7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nSWQgPSB0aGlzLmZpbGVQYXRoVG9JZC5nZXQoYWJzUGF0aCk7XG4gICAgICAgIGlmIChleGlzdGluZ0lkKSB7XG4gICAgICAgICAgdGhpcy5lbGVtZW50cy5kZWxldGUoZXhpc3RpbmdJZCk7XG4gICAgICAgICAgdGhpcy5maWxlUGF0aFRvSWQuZGVsZXRlKGFic1BhdGgpO1xuICAgICAgICAgIHRoaXMuZWxlbWVudEdlbmVyYXRpb25zLmRlbGV0ZShleGlzdGluZ0lkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggeyAvKiBub24tZmF0YWwg4oCUIGNhY2hlIG1heSBiZSBzbGlnaHRseSBzdGFsZSwgYnV0IGFjdGl2YXRpb24gcHJvY2VlZHMgKi8gfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYW4gZWxlbWVudCBmcm9tIGJvdGggY2FjaGVzIGJ5IGZpbGUgcGF0aFxuICAgKiBUaGlzIGlzIHRoZSBwcmVmZXJyZWQgbWV0aG9kIGZvciBkZWxldGlvbiB0byBhdm9pZCBzdGFsZSBjYWNoZSBlbnRyaWVzXG4gICAqIEBwYXJhbSBmaWxlUGF0aCAtIEZpbGUgcGF0aCAocmVsYXRpdmUgb3IgYWJzb2x1dGUpXG4gICAqL1xuICBwcm90ZWN0ZWQgdW5jYWNoZUJ5UGF0aChmaWxlUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgYWJzb2x1dGVQYXRoID0gdGhpcy5yZXNvbHZlQWJzb2x1dGVQYXRoKGZpbGVQYXRoKTtcbiAgICBjb25zdCBlbGVtZW50SWQgPSB0aGlzLmZpbGVQYXRoVG9JZC5nZXQoYWJzb2x1dGVQYXRoKTtcblxuICAgIGlmIChlbGVtZW50SWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5lbGVtZW50cy5kZWxldGUoZWxlbWVudElkKTtcbiAgICAgIHRoaXMuZmlsZVBhdGhUb0lkLmRlbGV0ZShhYnNvbHV0ZVBhdGgpO1xuICAgICAgdGhpcy5lbGVtZW50R2VuZXJhdGlvbnMuZGVsZXRlKGVsZW1lbnRJZCk7XG4gICAgICBsb2dnZXIuZGVidWcoYFVuY2FjaGVkIGVsZW1lbnQgJHtlbGVtZW50SWR9IGZyb20gJHthYnNvbHV0ZVBhdGh9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGFsbCBjYWNoZWQgZWxlbWVudHNcbiAgICovXG4gIGNsZWFyQ2FjaGUoKTogdm9pZCB7XG4gICAgdGhpcy5lbGVtZW50cy5jbGVhcigpO1xuICAgIHRoaXMuZmlsZVBhdGhUb0lkLmNsZWFyKCk7XG4gICAgdGhpcy5lbGVtZW50R2VuZXJhdGlvbnMuY2xlYXIoKTtcbiAgICB0aGlzLnN0b3JhZ2VMYXllci5jbGVhcigpO1xuICAgIHRoaXMuc3VwcHJlc3NlZExvYWRQYXRocy5jbGVhcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjYWNoZSBzdGF0aXN0aWNzIGZvciBkZWJ1Z2dpbmdcbiAgICogQHJldHVybnMgT2JqZWN0IHdpdGggY2FjaGUgc2l6ZSBtZXRyaWNzXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0Q2FjaGVTdGF0cygpOiB7IGVsZW1lbnRDb3VudDogbnVtYmVyOyBwYXRoTWFwcGluZ3M6IG51bWJlciB9IHtcbiAgICBjb25zdCBlbGVtZW50c1N0YXRzID0gdGhpcy5lbGVtZW50cy5nZXRTdGF0cygpO1xuICAgIGNvbnN0IHBhdGhTdGF0cyA9IHRoaXMuZmlsZVBhdGhUb0lkLmdldFN0YXRzKCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZWxlbWVudENvdW50OiBlbGVtZW50c1N0YXRzLnNpemUsXG4gICAgICBwYXRoTWFwcGluZ3M6IHBhdGhTdGF0cy5zaXplXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBvc2UgaW50ZXJuYWwgTFJVIGNhY2hlIGluc3RhbmNlcyBmb3IgbWV0cmljcyBjb2xsZWN0aW9uLlxuICAgKi9cbiAgcHVibGljIGdldE1ldHJpY3NDYWNoZXMoKTogQXJyYXk8eyBuYW1lOiBzdHJpbmc7IGluc3RhbmNlOiBMUlVDYWNoZTx1bmtub3duPiB9PiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHsgbmFtZTogYGVsZW1lbnRzOiR7dGhpcy5lbGVtZW50VHlwZX1gLCBpbnN0YW5jZTogdGhpcy5lbGVtZW50cyBhcyBMUlVDYWNoZTx1bmtub3duPiB9LFxuICAgICAgeyBuYW1lOiBgcGF0aEluZGV4OiR7dGhpcy5lbGVtZW50VHlwZX1gLCBpbnN0YW5jZTogdGhpcy5maWxlUGF0aFRvSWQgYXMgTFJVQ2FjaGU8dW5rbm93bj4gfSxcbiAgICBdO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3Bvc2Ugb2YgcmVzb3VyY2VzIGFuZCBjbGVhbnVwXG4gICAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRvIGFkZCB0aGVpciBvd24gY2xlYW51cCBsb2dpY1xuICAgKi9cbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubWVtb3J5QnVkZ2V0KSB7XG4gICAgICB0aGlzLm1lbW9yeUJ1ZGdldC51bnJlZ2lzdGVyKHRoaXMuZWxlbWVudHMpO1xuICAgICAgdGhpcy5tZW1vcnlCdWRnZXQudW5yZWdpc3Rlcih0aGlzLmZpbGVQYXRoVG9JZCk7XG4gICAgfVxuICAgIHRoaXMuZWxlbWVudHMuY2xlYXIoKTtcbiAgICB0aGlzLmZpbGVQYXRoVG9JZC5jbGVhcigpO1xuICAgIHRoaXMuZWxlbWVudEdlbmVyYXRpb25zLmNsZWFyKCk7XG4gICAgdGhpcy5zdG9yYWdlTGF5ZXIuY2xlYXIoKTtcbiAgICB0aGlzLndhdGNoZXJDbGVhbnVwPy4oKTtcbiAgICB0aGlzLndhdGNoZXJDbGVhbnVwID0gdW5kZWZpbmVkO1xuICAgIGxvZ2dlci5kZWJ1ZyhgJHt0aGlzLmdldEVsZW1lbnRMYWJlbENhcGl0YWxpemVkKCl9TWFuYWdlciBkaXNwb3NlZCBhbmQgY2FjaGVzIGNsZWFyZWRgKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEZJTEVOQU1FIE5PUk1BTElaQVRJT04gTUVUSE9EU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBOb3JtYWxpemUgYSBuYW1lIHRvIGtlYmFiLWNhc2UgZm9yIGNvbnNpc3RlbnQgZmlsZW5hbWUgZm9ybWF0dGluZy5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgcHJvdmlkZXMgdW5pZmllZCBmaWxlbmFtZSBub3JtYWxpemF0aW9uIGFjcm9zcyBhbGwgZWxlbWVudCBtYW5hZ2VycyxcbiAgICogZW5zdXJpbmcgY29uc2lzdGVudCBuYW1pbmcgcmVnYXJkbGVzcyBvZiB0aGUgaW5wdXQgZm9ybWF0IChDYW1lbENhc2UsIHNwYWNlcyxcbiAgICogdW5kZXJzY29yZXMsIG1peGVkIGNhc2UsIGV0Yy4pLlxuICAgKlxuICAgKiBUcmFuc2Zvcm1hdGlvbnMgYXBwbGllZCAoaW4gb3JkZXIpOlxuICAgKiAxLiBJbnNlcnQgaHlwaGVucyBiZXR3ZWVuIGNhbWVsQ2FzZSBib3VuZGFyaWVzIChNeU5hbWUgLT4gTXktTmFtZSlcbiAgICogMi4gUmVwbGFjZSBzcGFjZXMgYW5kIHVuZGVyc2NvcmVzIHdpdGggaHlwaGVuc1xuICAgKiAzLiBDb252ZXJ0IHRvIGxvd2VyY2FzZVxuICAgKiA0LiBTdHJpcCBpbnZhbGlkIGNoYXJhY3RlcnMgKGtlZXAgb25seSBhLXosIDAtOSwgLSlcbiAgICogNS4gQ29sbGFwc2UgbXVsdGlwbGUgY29uc2VjdXRpdmUgaHlwaGVuc1xuICAgKiA2LiBUcmltIGxlYWRpbmcvdHJhaWxpbmcgaHlwaGVuc1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBub3JtYWxpemVGaWxlbmFtZShcIkNSVURWLUFnZW50LURlbHRhXCIpIC8vIFwiY3J1ZHYtYWdlbnQtZGVsdGFcIlxuICAgKiBub3JtYWxpemVGaWxlbmFtZShcIkNyZWF0aXZlIFdyaXRlclwiKSAgIC8vIFwiY3JlYXRpdmUtd3JpdGVyXCJcbiAgICogbm9ybWFsaXplRmlsZW5hbWUoXCJDYW1lbENhc2VOYW1lXCIpICAgICAvLyBcImNhbWVsLWNhc2UtbmFtZVwiXG4gICAqIG5vcm1hbGl6ZUZpbGVuYW1lKFwibXlfc2tpbGxfbmFtZVwiKSAgICAgLy8gXCJteS1za2lsbC1uYW1lXCJcbiAgICogbm9ybWFsaXplRmlsZW5hbWUoXCJTcGVjaWFsQENoYXJzIVwiKSAgICAvLyBcInNwZWNpYWwtY2hhcnNcIlxuICAgKiBub3JtYWxpemVGaWxlbmFtZShcIi0tbGVhZGluZy1hbmQtdHJhaWxpbmctLVwiKSAvLyBcImxlYWRpbmctYW5kLXRyYWlsaW5nXCJcbiAgICpcbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgZWxlbWVudCBuYW1lIHRvIG5vcm1hbGl6ZVxuICAgKiBAcmV0dXJucyBOb3JtYWxpemVkIGtlYmFiLWNhc2UgZmlsZW5hbWUgKHdpdGhvdXQgZXh0ZW5zaW9uKVxuICAgKi9cbiAgcHJvdGVjdGVkIG5vcm1hbGl6ZUZpbGVuYW1lKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFuYW1lIHx8IG5hbWUudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuICd1bm5hbWVkJztcbiAgICB9XG5cbiAgICByZXR1cm4gbmFtZVxuICAgICAgLy8gU3RlcCAxOiBJbnNlcnQgaHlwaGVucyBiZXR3ZWVuIGNhbWVsQ2FzZSBib3VuZGFyaWVzIChsb3dlcmNhc2UgZm9sbG93ZWQgYnkgdXBwZXJjYXNlKVxuICAgICAgLnJlcGxhY2UoLyhbYS16XSkoW0EtWl0pL2csICckMS0kMicpXG4gICAgICAvLyBTdGVwIDI6IFJlcGxhY2Ugc3BhY2VzIGFuZCB1bmRlcnNjb3JlcyB3aXRoIGh5cGhlbnNcbiAgICAgIC5yZXBsYWNlKC9bXFxzX10rL2csICctJylcbiAgICAgIC8vIFN0ZXAgMzogQ29udmVydCB0byBsb3dlcmNhc2VcbiAgICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgICAvLyBTdGVwIDQ6IFN0cmlwIGludmFsaWQgY2hhcmFjdGVycyAoa2VlcCBvbmx5IGFscGhhbnVtZXJpYyBhbmQgaHlwaGVucylcbiAgICAgIC5yZXBsYWNlKC9bXmEtejAtOS1dL2csICctJylcbiAgICAgIC8vIFN0ZXAgNTogQ29sbGFwc2UgbXVsdGlwbGUgY29uc2VjdXRpdmUgaHlwaGVuc1xuICAgICAgLnJlcGxhY2UoLy0rL2csICctJylcbiAgICAgIC8vIFN0ZXAgNjogVHJpbSBsZWFkaW5nIGFuZCB0cmFpbGluZyBoeXBoZW5zXG4gICAgICAucmVwbGFjZSgvXi0rfC0rJC9nLCAnJyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBzdGFuZGFyZGl6ZWQgZmlsZW5hbWUgZm9yIGFuIGVsZW1lbnQuXG4gICAqXG4gICAqIE5vcm1hbGl6ZXMgdGhlIGVsZW1lbnQgbmFtZSAoaGFuZGxpbmcgQ2FtZWxDYXNlLCBzcGFjZXMsIHVuZGVyc2NvcmVzLCBldGMuKVxuICAgKiBhbmQgYXBwZW5kcyB0aGUgZmlsZSBleHRlbnNpb24uIFRoZSBkaXJlY3Rvcnkgc3RydWN0dXJlIChwZXJzb25hcy8sIHNraWxscy8sIGV0Yy4pXG4gICAqIGFscmVhZHkgcHJvdmlkZXMgdHlwZSBjb250ZXh0LCBzbyB0aGUgdHlwZSBpcyBOT1QgaW5jbHVkZWQgaW4gdGhlIGZpbGVuYW1lLlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBlbGVtZW50IG5hbWUgdG8gY29udmVydCB0byBhIGZpbGVuYW1lXG4gICAqIEByZXR1cm5zIFRoZSBzdGFuZGFyZGl6ZWQgZmlsZW5hbWUgKGUuZy4sIFwiY29kZS1yZXZpZXcubWRcIilcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogZ2V0RWxlbWVudEZpbGVuYW1lKFwiQ29kZSBSZXZpZXdcIikgICAgICAgICAvLyDihpIgXCJjb2RlLXJldmlldy5tZFwiXG4gICAqIGdldEVsZW1lbnRGaWxlbmFtZShcIkRlYnVnIERldGVjdGl2ZVwiKSAgICAgLy8g4oaSIFwiZGVidWctZGV0ZWN0aXZlLm1kXCJcbiAgICogZ2V0RWxlbWVudEZpbGVuYW1lKFwiQnVnUmVwb3J0XCIpICAgICAgICAgICAvLyDihpIgXCJidWctcmVwb3J0Lm1kXCIgKENhbWVsQ2FzZSBzcGxpdClcbiAgICogZ2V0RWxlbWVudEZpbGVuYW1lKFwiZml4LXBlcnNvbmEtaGVscGVyXCIpICAvLyDihpIgXCJmaXgtcGVyc29uYS1oZWxwZXIubWRcIiAobm8gbWFuZ2xpbmcpXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0RWxlbWVudEZpbGVuYW1lKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3Qgbm9ybWFsaXplZE5hbWUgPSB0aGlzLm5vcm1hbGl6ZUZpbGVuYW1lKG5hbWUpIHx8ICd1bm5hbWVkJztcbiAgICBjb25zdCBleHRlbnNpb24gPSB0aGlzLmdldEZpbGVFeHRlbnNpb24oKTtcbiAgICByZXR1cm4gYCR7bm9ybWFsaXplZE5hbWV9JHtleHRlbnNpb259YDtcbiAgfVxuXG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQUJTVFJBQ1QgTUVUSE9EUyAtIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnRcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogUGFyc2UgYW5kIHZhbGlkYXRlIG1ldGFkYXRhIGZyb20gZnJvbnRtYXR0ZXJcbiAgICogU3ViY2xhc3NlcyBpbXBsZW1lbnQgZWxlbWVudC1zcGVjaWZpYyB2YWxpZGF0aW9uIGxvZ2ljXG4gICAqXG4gICAqIEBwYXJhbSBkYXRhIC0gUmF3IG1ldGFkYXRhIGZyb20gWUFNTCBmcm9udG1hdHRlclxuICAgKiBAcmV0dXJucyBWYWxpZGF0ZWQgYW5kIHR5cGVkIG1ldGFkYXRhXG4gICAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgcGFyc2VNZXRhZGF0YShkYXRhOiBhbnkpOiBQcm9taXNlPFRbJ21ldGFkYXRhJ10+O1xuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgRWxlbWVudFZhbGlkYXRvciB2aWEgVmFsaWRhdGlvblJlZ2lzdHJ5IGluc3RlYWQuXG4gICAqIFdpbGwgYmUgcmVtb3ZlZCBpbiBuZXh0IG1ham9yIHZlcnNpb24uXG4gICAqL1xuICBhc3luYyB2YWxpZGF0ZU1ldGFkYXRhKG1ldGFkYXRhOiBhbnksIF9zdHJpY3Q/OiBib29sZWFuKTogUHJvbWlzZTxpbXBvcnQoJy4uLy4uL3V0aWxzL3ZhbGlkYXRpb24vRmllbGRWYWxpZGF0b3IuanMnKS5WYWxpZGF0aW9uRXJyb3JbXT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMudmFsaWRhdG9yLnZhbGlkYXRlTWV0YWRhdGEobWV0YWRhdGEpO1xuICAgIHJldHVybiByZXN1bHQuZXJyb3JzLm1hcChlID0+ICh7IGZpZWxkOiAnZ2VuZXJhbCcsIG1lc3NhZ2U6IGUgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBlbGVtZW50IGluc3RhbmNlIGZyb20gbWV0YWRhdGEgYW5kIGNvbnRlbnRcbiAgICogU3ViY2xhc3NlcyBpbXBsZW1lbnQgZWxlbWVudC1zcGVjaWZpYyBjb25zdHJ1Y3Rpb25cbiAgICpcbiAgICogQHBhcmFtIG1ldGFkYXRhIC0gVmFsaWRhdGVkIG1ldGFkYXRhXG4gICAqIEBwYXJhbSBjb250ZW50IC0gRWxlbWVudCBjb250ZW50IChpbnN0cnVjdGlvbnMsIHRlbXBsYXRlLCBldGMuKVxuICAgKiBAcmV0dXJucyBOZXcgZWxlbWVudCBpbnN0YW5jZVxuICAgKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGNyZWF0ZUVsZW1lbnQobWV0YWRhdGE6IFRbJ21ldGFkYXRhJ10sIGNvbnRlbnQ6IHN0cmluZyk6IFQ7XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSBhbiBlbGVtZW50IHRvIGZpbGUgY29udGVudFxuICAgKiBTdWJjbGFzc2VzIGNhbiBjdXN0b21pemUgc2VyaWFsaXphdGlvbiBmb3JtYXRcbiAgICpcbiAgICogQHBhcmFtIGVsZW1lbnQgLSBFbGVtZW50IHRvIHNlcmlhbGl6ZVxuICAgKiBAcmV0dXJucyBGaWxlIGNvbnRlbnQgKHVzdWFsbHkgbWFya2Rvd24gd2l0aCBmcm9udG1hdHRlcilcbiAgICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBzZXJpYWxpemVFbGVtZW50KGVsZW1lbnQ6IFQpOiBQcm9taXNlPHN0cmluZz47XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZmlsZSBleHRlbnNpb24gZm9yIHRoaXMgZWxlbWVudCB0eXBlXG4gICAqIE1vc3QgZWxlbWVudHMgdXNlIC5tZCwgYnV0IHN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlXG4gICAqL1xuICBhYnN0cmFjdCBnZXRGaWxlRXh0ZW5zaW9uKCk6IHN0cmluZztcblxuICAvKipcbiAgICogSW1wb3J0IGFuIGVsZW1lbnQgZnJvbSBleHRlcm5hbCBmb3JtYXRcbiAgICogU3ViY2xhc3NlcyBpbXBsZW1lbnQgZm9ybWF0LXNwZWNpZmljIGltcG9ydCBsb2dpY1xuICAgKi9cbiAgYWJzdHJhY3QgaW1wb3J0RWxlbWVudChkYXRhOiBzdHJpbmcsIGZvcm1hdD86ICdqc29uJyB8ICd5YW1sJyB8ICdtYXJrZG93bicpOiBQcm9taXNlPFQ+O1xuXG4gIC8qKlxuICAgKiBFeHBvcnQgYW4gZWxlbWVudCB0byBleHRlcm5hbCBmb3JtYXRcbiAgICogU3ViY2xhc3NlcyBpbXBsZW1lbnQgZm9ybWF0LXNwZWNpZmljIGV4cG9ydCBsb2dpY1xuICAgKi9cbiAgYWJzdHJhY3QgZXhwb3J0RWxlbWVudChlbGVtZW50OiBULCBmb3JtYXQ/OiAnanNvbicgfCAneWFtbCcgfCAnbWFya2Rvd24nKTogUHJvbWlzZTxzdHJpbmc+O1xufVxuIl19
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EnsembleManager.d.ts","sourceRoot":"","sources":["../../../src/elements/ensembles/EnsembleManager.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"EnsembleManager.d.ts","sourceRoot":"","sources":["../../../src/elements/ensembles/EnsembleManager.ts"],"names":[],"mappings":"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"}
|