@dollhousemcp/mcp-server 2.0.9 → 2.0.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/elements/ensembles/Ensemble.d.ts +9 -0
- package/dist/elements/ensembles/Ensemble.d.ts.map +1 -1
- package/dist/elements/ensembles/Ensemble.js +71 -4
- 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/mcp-aql/IntrospectionResolver.d.ts +57 -0
- package/dist/handlers/mcp-aql/IntrospectionResolver.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/IntrospectionResolver.js +181 -2
- package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts +8 -0
- package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/MCPAQLHandler.js +32 -6
- package/dist/handlers/mcp-aql/OperationRouter.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/OperationRouter.js +6 -1
- package/dist/handlers/mcp-aql/OperationSchema.d.ts +7 -0
- package/dist/handlers/mcp-aql/OperationSchema.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/OperationSchema.js +120 -8
- package/dist/handlers/mcp-aql/SchemaDispatcher.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/SchemaDispatcher.js +11 -1
- package/dist/handlers/mcp-aql/types.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/types.js +11 -1
- package/dist/index.js +19 -1
- package/dist/server/tools/MCPAQLTools.d.ts.map +1 -1
- package/dist/server/tools/MCPAQLTools.js +7 -1
- package/dist/web/public/app.js +118 -7
- package/dist/web/public/dollhouse-logo.png +0 -0
- package/dist/web/public/index.html +5 -2
- package/dist/web/public/logs.js +56 -1
- package/dist/web/public/metrics.js +32 -1
- package/dist/web/public/setup.css +79 -0
- package/dist/web/public/setup.js +90 -0
- package/dist/web/public/styles.css +3 -1
- package/dist/web/server.d.ts +1 -1
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +14 -3
- package/package.json +2 -2
- package/server.json +2 -2
|
@@ -925,9 +925,17 @@ export class Ensemble extends BaseElement {
|
|
|
925
925
|
this.instanceAccessTimes.set(elementName, Date.now());
|
|
926
926
|
}
|
|
927
927
|
const instance = this.elementInstances.get(elementName);
|
|
928
|
-
// Activate
|
|
929
|
-
|
|
930
|
-
|
|
928
|
+
// Activate via the type manager's activation method, which both sets the
|
|
929
|
+
// instance status AND registers the element in the manager's active set.
|
|
930
|
+
// Using instance.activate() alone only sets the status flag — the manager
|
|
931
|
+
// won't know the element is active, so get_active_elements returns nothing.
|
|
932
|
+
// @see Issue #1769 - Ensemble activation not registering with type managers
|
|
933
|
+
const activated = await this.activateViaManager(elementName, elementConfig.element_type, managers);
|
|
934
|
+
if (!activated) {
|
|
935
|
+
// Fallback: activate the instance directly if no manager available
|
|
936
|
+
if (instance.activate) {
|
|
937
|
+
await instance.activate();
|
|
938
|
+
}
|
|
931
939
|
}
|
|
932
940
|
// If this is a nested ensemble, call activateEnsemble with incremented depth
|
|
933
941
|
if (isNestedEnsemble && 'activateEnsemble' in instance && typeof instance.activateEnsemble === 'function') {
|
|
@@ -961,6 +969,65 @@ export class Ensemble extends BaseElement {
|
|
|
961
969
|
logger.error(`Failed to activate element ${elementName}:`, error);
|
|
962
970
|
}
|
|
963
971
|
}
|
|
972
|
+
/**
|
|
973
|
+
* Activate an element via its type manager's activation method.
|
|
974
|
+
* This registers the element in the manager's active set so that
|
|
975
|
+
* get_active_elements correctly reports it.
|
|
976
|
+
*
|
|
977
|
+
* @returns true if activation went through a manager, false if no manager available
|
|
978
|
+
* @see Issue #1769 - Ensemble activation not registering with type managers
|
|
979
|
+
*/
|
|
980
|
+
async activateViaManager(elementName, elementType, managers) {
|
|
981
|
+
const normalized = this.normalizeElementType(elementType);
|
|
982
|
+
switch (normalized) {
|
|
983
|
+
case 'skill': {
|
|
984
|
+
const mgr = managers.skillManager;
|
|
985
|
+
if (mgr?.activateSkill) {
|
|
986
|
+
await mgr.activateSkill(elementName);
|
|
987
|
+
return true;
|
|
988
|
+
}
|
|
989
|
+
return false;
|
|
990
|
+
}
|
|
991
|
+
case 'persona': {
|
|
992
|
+
const mgr = managers.personaManager;
|
|
993
|
+
if (mgr?.activatePersona) {
|
|
994
|
+
await mgr.activatePersona(elementName);
|
|
995
|
+
return true;
|
|
996
|
+
}
|
|
997
|
+
return false;
|
|
998
|
+
}
|
|
999
|
+
case 'agent': {
|
|
1000
|
+
const mgr = managers.agentManager;
|
|
1001
|
+
if (mgr?.activateAgent) {
|
|
1002
|
+
await mgr.activateAgent(elementName);
|
|
1003
|
+
return true;
|
|
1004
|
+
}
|
|
1005
|
+
return false;
|
|
1006
|
+
}
|
|
1007
|
+
case 'memory': {
|
|
1008
|
+
const mgr = managers.memoryManager;
|
|
1009
|
+
if (mgr?.activateMemory) {
|
|
1010
|
+
await mgr.activateMemory(elementName);
|
|
1011
|
+
return true;
|
|
1012
|
+
}
|
|
1013
|
+
return false;
|
|
1014
|
+
}
|
|
1015
|
+
case 'ensemble': {
|
|
1016
|
+
const mgr = managers.ensembleManager;
|
|
1017
|
+
if (mgr?.activateEnsemble) {
|
|
1018
|
+
await mgr.activateEnsemble(elementName);
|
|
1019
|
+
return true;
|
|
1020
|
+
}
|
|
1021
|
+
return false;
|
|
1022
|
+
}
|
|
1023
|
+
case 'template': {
|
|
1024
|
+
// Templates don't have activation state — just activate the instance
|
|
1025
|
+
return false;
|
|
1026
|
+
}
|
|
1027
|
+
default:
|
|
1028
|
+
return false;
|
|
1029
|
+
}
|
|
1030
|
+
}
|
|
964
1031
|
/**
|
|
965
1032
|
* Load an element instance from portfolio
|
|
966
1033
|
*/
|
|
@@ -1760,4 +1827,4 @@ export class Ensemble extends BaseElement {
|
|
|
1760
1827
|
return this.findElementByName(sanitizeInput(name, 100));
|
|
1761
1828
|
}
|
|
1762
1829
|
}
|
|
1763
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRW5zZW1ibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZWxlbWVudHMvZW5zZW1ibGVzL0Vuc2VtYmxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBRUgsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2hELE9BQU8sRUFLTCxhQUFhLEVBQ2QsTUFBTSwrQkFBK0IsQ0FBQztBQUN2QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFFekIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNwRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFXL0MsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixxQkFBcUIsRUFDckIsbUJBQW1CLEVBQ25CLGFBQWEsRUFDYix3QkFBd0IsRUFDeEIsZUFBZSxFQUNmLGlCQUFpQixFQUNqQiw0QkFBNEIsRUFDNUIsa0JBQWtCLEVBR25CLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEI7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxPQUFPLFFBQVMsU0FBUSxXQUFXO0lBRXZDLHFGQUFxRjtJQUVyRiw4REFBOEQ7SUFDdEQsUUFBUSxHQUFzQixFQUFFLENBQUM7SUFDakMsZ0JBQWdCLEdBQTBCLElBQUksR0FBRyxFQUFFLENBQUM7SUFDM0MsdUJBQXVCLEdBQUcsR0FBRyxDQUFDO0lBQ3ZDLG1CQUFtQixHQUF3QixJQUFJLEdBQUcsRUFBRSxDQUFDO0lBRTdELGlEQUFpRDtJQUN6QyxhQUFhLENBQWdCO0lBRXJDLG1CQUFtQjtJQUNYLG9C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TUFBTSxDQUFDO1FBQ1YsSUFBSSxDQUFDLGlCQUFpQixDQUFDLG1CQUFtQixJQUFJLFdBQVcsQ0FBQztRQUUxRCwwQkFBMEI7UUFDMUIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUMvQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsZUFBZSxFQUN0QyxZQUFZLENBQ2IsQ0FBQztRQUVGLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztJQUNyRCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksb0JBQW9CO1FBQ3pCLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQ3ZDLENBQUM7SUFFRDs7T0FFRztJQUNJLHVCQUF1QjtRQUM1QixPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxXQUFXO1FBQ2hCLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRUQ7O09BRUc7SUFDSSxVQUFVLENBQUMsSUFBWTtRQUM1QixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDMUQsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBFbnNlbWJsZSBFbGVtZW50IC0gT3JjaGVzdHJhdGVzIG11bHRpcGxlIGVsZW1lbnRzIHdvcmtpbmcgdG9nZXRoZXJcbiAqXG4gKiBFbnNlbWJsZXMgYWxsb3cgY29tYmluaW5nIG11bHRpcGxlIGVsZW1lbnRzIChwZXJzb25hcywgc2tpbGxzLCB0ZW1wbGF0ZXMsIGFnZW50cywgbWVtb3JpZXMpXG4gKiBpbnRvIGNvaGVzaXZlIHVuaXRzIHdpdGggY29udHJvbGxlZCBhY3RpdmF0aW9uLCBjb25mbGljdCByZXNvbHV0aW9uLCBhbmQgc2hhcmVkIGNvbnRleHQuXG4gKlxuICogQVJDSElURUNUVVJFOlxuICogLSBFeHRlbmRzIEJhc2VFbGVtZW50IGZvciBzdGFuZGFyZCBlbGVtZW50IGJlaGF2aW9yXG4gKiAtIFB1cmUgYnVzaW5lc3MgbG9naWMgKG5vIGZpbGUgb3BlcmF0aW9ucylcbiAqIC0gUG9ydGZvbGlvLWFnbm9zdGljIChQb3J0Zm9saW9NYW5hZ2VyIHBhc3NlZCB0byBhY3RpdmF0ZSgpKVxuICpcbiAqIFNFQ1VSSVRZIE1FQVNVUkVTOlxuICogMS4gQ2lyY3VsYXIgZGVwZW5kZW5jeSBkZXRlY3Rpb24gd2l0aCBERlMgYWxnb3JpdGhtXG4gKiAyLiBSZXNvdXJjZSBsaW1pdHMgKG1heCBlbGVtZW50cywgbmVzdGluZyBkZXB0aCwgYWN0aXZhdGlvbiB0aW1lKVxuICogMy4gSW5wdXQgc2FuaXRpemF0aW9uIGZvciBhbGwgdXNlci1wcm92aWRlZCBkYXRhXG4gKiA0LiBBY3RpdmF0aW9uIHRpbWVvdXQgcHJvdGVjdGlvblxuICogNS4gQ29udGV4dCBzaXplIGxpbWl0cyB0byBwcmV2ZW50IG1lbW9yeSBleGhhdXN0aW9uXG4gKiA2LiBBdWRpdCBsb2dnaW5nIGZvciBzZWN1cml0eSBldmVudHNcbiAqIDcuIENvbmRpdGlvbiB2YWxpZGF0aW9uIHRvIHByZXZlbnQgY29kZSBpbmplY3Rpb25cbiAqL1xuXG5pbXBvcnQgeyBCYXNlRWxlbWVudCB9IGZyb20gJy4uL0Jhc2VFbGVtZW50LmpzJztcbmltcG9ydCB7XG4gIElFbGVtZW50LFxuICBFbGVtZW50VmFsaWRhdGlvblJlc3VsdCxcbiAgVmFsaWRhdGlvbkVycm9yLFxuICBWYWxpZGF0aW9uV2FybmluZyxcbiAgRWxlbWVudFN0YXR1c1xufSBmcm9tICcuLi8uLi90eXBlcy9lbGVtZW50cy9pbmRleC5qcyc7XG5pbXBvcnQgeyBFbGVtZW50VHlwZSB9IGZyb20gJy4uLy4uL3BvcnRmb2xpby90eXBlcy5qcyc7XG5pbXBvcnQgKiBhcyB2bSBmcm9tICd2bSc7XG5pbXBvcnQgeyBQb3J0Zm9saW9NYW5hZ2VyIH0gZnJvbSAnLi4vLi4vcG9ydGZvbGlvL1BvcnRmb2xpb01hbmFnZXIuanMnO1xuaW1wb3J0IHsgc2FuaXRpemVJbnB1dCB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L0lucHV0VmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IFVuaWNvZGVWYWxpZGF0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS92YWxpZGF0b3JzL3VuaWNvZGVWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgU2VjdXJpdHlNb25pdG9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvc2VjdXJpdHlNb25pdG9yLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBNZXRhZGF0YVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9NZXRhZGF0YVNlcnZpY2UuanMnO1xuaW1wb3J0IHtcbiAgRW5zZW1ibGVNZXRhZGF0YSxcbiAgRW5zZW1ibGVFbGVtZW50LFxuICBTaGFyZWRDb250ZXh0LFxuICBFbnNlbWJsZUFjdGl2YXRpb25SZXN1bHQsXG4gIENvbnRleHRDb25mbGljdCxcbiAgQ2lyY3VsYXJEZXBlbmRlbmN5LFxuICBFbnNlbWJsZUFjdGl2YXRpb25NZXRyaWNzXG59IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHtcbiAgRU5TRU1CTEVfREVGQVVMVFMsXG4gIEFDVElWQVRJT05fU1RSQVRFR0lFUyxcbiAgQ09ORkxJQ1RfU1RSQVRFR0lFUyxcbiAgRUxFTUVOVF9ST0xFUyxcbiAgRU5TRU1CTEVfU0VDVVJJVFlfRVZFTlRTLFxuICBFTlNFTUJMRV9FUlJPUlMsXG4gIEVOU0VNQkxFX1BBVFRFUk5TLFxuICBEQU5HRVJPVVNfQ09ORElUSU9OX1BBVFRFUk5TLFxuICBnZXRFZmZlY3RpdmVMaW1pdHMsXG4gIEVuc2VtYmxlTGltaXRzQ29uZmlnLFxuICBSZXNvbHZlZEVuc2VtYmxlTGltaXRzXG59IGZyb20gJy4vY29uc3RhbnRzLmpzJztcblxuLyoqXG4gKiBFbnNlbWJsZSBjbGFzcyAtIE9yY2hlc3RyYXRlcyBtdWx0aXBsZSBlbGVtZW50cyBhcyBhIGNvaGVzaXZlIHVuaXRcbiAqXG4gKiBFeHRlbmRzIEJhc2VFbGVtZW50IHRvIGluaGVyaXQ6XG4gKiAtIFN0YW5kYXJkIHZhbGlkYXRpb25cbiAqIC0gU2VyaWFsaXphdGlvblxuICogLSBNZXRhZGF0YSBtYW5hZ2VtZW50XG4gKiAtIElEIGdlbmVyYXRpb25cbiAqIC0gU3RhdHVzIHRyYWNraW5nXG4gKi9cbmV4cG9ydCBjbGFzcyBFbnNlbWJsZSBleHRlbmRzIEJhc2VFbGVtZW50IGltcGxlbWVudHMgSUVsZW1lbnQge1xuICBwdWJsaWMgZGVjbGFyZSBtZXRhZGF0YTogRW5zZW1ibGVNZXRhZGF0YTtcbiAgLy8gaW5zdHJ1Y3Rpb25zIGFuZCBjb250ZW50IGluaGVyaXRlZCBmcm9tIEJhc2VFbGVtZW50ICh2Mi4wIGR1YWwtZmllbGQgYXJjaGl0ZWN0dXJlKVxuXG4gIC8vIEVsZW1lbnQgbWFuYWdlbWVudCAtIHVzaW5nIGFycmF5IGZvciBzaW5nbGUgc291cmNlIG9mIHRydXRoXG4gIHByaXZhdGUgZWxlbWVudHM6IEVuc2VtYmxlRWxlbWVudFtdID0gW107XG4gIHByaXZhdGUgZWxlbWVudEluc3RhbmNlczogTWFwPHN0cmluZywgSUVsZW1lbnQ+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIHJlYWRvbmx5IE1BWF9JTlNUQU5DRV9DQUNIRV9TSVpFID0gMTAwO1xuICBwcml2YXRlIGluc3RhbmNlQWNjZXNzVGltZXM6IE1hcDxzdHJpbmcsIG51bWJlcj4gPSBuZXcgTWFwKCk7XG5cbiAgLy8gU2hhcmVkIGNvbnRleHQgZm9yIGludGVyLWVsZW1lbnQgY29tbXVuaWNhdGlvblxuICBwcml2YXRlIHNoYXJlZENvbnRleHQ6IFNoYXJlZENvbnRleHQ7XG5cbiAgLy8gQWN0aXZhdGlvbiBzdGF0ZVxuICBwcml2YXRlIGFjdGl2YXRpb25JblByb2dyZXNzOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgbGFzdEFjdGl2YXRpb25SZXN1bHQ/OiBFbnNlbWJsZUFjdGl2YXRpb25SZXN1bHQ7XG5cbiAgLy8gQWN0aXZhdGlvbiBtZXRyaWNzIGZvciBwZXJmb3JtYW5jZSBtb25pdG9yaW5nXG4gIHByaXZhdGUgYWN0aXZhdGlvbk1ldHJpY3M6IEVuc2VtYmxlQWN0aXZhdGlvbk1ldHJpY3MgPSB7XG4gICAgdG90YWxBY3RpdmF0aW9uczogMCxcbiAgICBzdWNjZXNzZnVsQWN0aXZhdGlvbnM6IDAsXG4gICAgZmFpbGVkQWN0aXZhdGlvbnM6IDAsXG4gICAgYXZlcmFnZUR1cmF0aW9uOiAwLFxuICAgIG1pbkR1cmF0aW9uOiBJbmZpbml0eSxcbiAgICBtYXhEdXJhdGlvbjogMCxcbiAgICBuZXN0ZWRFbnNlbWJsZUNvdW50OiAwLFxuICAgIG1heE5lc3RpbmdEZXB0aDogMFxuICB9O1xuXG4gIC8vIENhY2hlZCBlZmZlY3RpdmUgbGltaXRzIChjb21wdXRlZCBvbmNlIHBlciBlbnNlbWJsZSwgcmVzcGVjdHMgcGVyLWVuc2VtYmxlIG92ZXJyaWRlcylcbiAgcHJpdmF0ZSBfZWZmZWN0aXZlTGltaXRzOiBSZXNvbHZlZEVuc2VtYmxlTGltaXRzIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIEdldCBlZmZlY3RpdmUgbGltaXRzIGZvciB0aGlzIGVuc2VtYmxlXG4gICAqXG4gICAqIFJlc29sdmVzIGxpbWl0cyBpbiBwcmlvcml0eSBvcmRlcjpcbiAgICogMS4gUGVyLWVuc2VtYmxlIG92ZXJyaWRlcyAoZnJvbSBtZXRhZGF0YS5yZXNvdXJjZUxpbWl0cylcbiAgICogMi4gR2xvYmFsIGNvbmZpZ3VyYXRpb24gKHNldEdsb2JhbEVuc2VtYmxlTGltaXRzKCkpXG4gICAqIDMuIEVudmlyb25tZW50IHZhcmlhYmxlcyAoRU5TRU1CTEVfTUFYXyopXG4gICAqIDQuIERlZmF1bHQgdmFsdWVzXG4gICAqXG4gICAqIFJlc3VsdHMgYXJlIGNhY2hlZCBmb3IgcGVyZm9ybWFuY2UuIENhbGwgaW52YWxpZGF0ZUxpbWl0c0NhY2hlKCkgdG8gcmVmcmVzaC5cbiAgICpcbiAgICogQHJldHVybnMgUmVzb2x2ZWQgbGltaXRzIG9iamVjdFxuICAgKi9cbiAgcHVibGljIGdldEVmZmVjdGl2ZUxpbWl0cygpOiBSZXNvbHZlZEVuc2VtYmxlTGltaXRzIHtcbiAgICBpZiAodGhpcy5fZWZmZWN0aXZlTGltaXRzID09PSBudWxsKSB7XG4gICAgICAvLyBDb252ZXJ0IFJlc291cmNlTGltaXRzIChwZXItZW5zZW1ibGUgQVBJKSB0byBFbnNlbWJsZUxpbWl0c0NvbmZpZyAoaW50ZXJuYWwgY29uZmlnIGZvcm1hdClcbiAgICAgIC8vXG4gICAgICAvLyBGaWVsZCBuYW1lIG1hcHBpbmcgKGhpc3RvcmljYWwgcmVhc29ucyAtIFJlc291cmNlTGltaXRzIHByZWRhdGVzIGNvbmZpZ3VyYWJsZSBsaW1pdHMpOlxuICAgICAgLy8gICBSZXNvdXJjZUxpbWl0cy5tYXhBY3RpdmVFbGVtZW50cyAgLT4gRW5zZW1ibGVMaW1pdHNDb25maWcubWF4RWxlbWVudHNcbiAgICAgIC8vICAgUmVzb3VyY2VMaW1pdHMubWF4RXhlY3V0aW9uVGltZU1zIC0+IEVuc2VtYmxlTGltaXRzQ29uZmlnLm1heEFjdGl2YXRpb25UaW1lXG4gICAgICAvLyAgIE90aGVyIGZpZWxkcyBoYXZlIG1hdGNoaW5nIG5hbWVzIChtYXhOZXN0aW5nRGVwdGgsIG1heENvbnRleHRTaXplLCBldGMuKVxuICAgICAgY29uc3Qgb3ZlcnJpZGVzOiBQYXJ0aWFsPEVuc2VtYmxlTGltaXRzQ29uZmlnPiA9IHt9O1xuICAgICAgY29uc3QgcmVzb3VyY2VMaW1pdHMgPSB0aGlzLm1ldGFkYXRhLnJlc291cmNlTGltaXRzO1xuXG4gICAgICBpZiAocmVzb3VyY2VMaW1pdHMpIHtcbiAgICAgICAgaWYgKHJlc291cmNlTGltaXRzLm1heEFjdGl2ZUVsZW1lbnRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBvdmVycmlkZXMubWF4RWxlbWVudHMgPSByZXNvdXJjZUxpbWl0cy5tYXhBY3RpdmVFbGVtZW50cztcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzb3VyY2VMaW1pdHMubWF4RXhlY3V0aW9uVGltZU1zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBvdmVycmlkZXMubWF4QWN0aXZhdGlvblRpbWUgPSByZXNvdXJjZUxpbWl0cy5tYXhFeGVjdXRpb25UaW1lTXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc291cmNlTGltaXRzLm1heE5lc3RpbmdEZXB0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgb3ZlcnJpZGVzLm1heE5lc3RpbmdEZXB0aCA9IHJlc291cmNlTGltaXRzLm1heE5lc3RpbmdEZXB0aDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzb3VyY2VMaW1pdHMubWF4Q29udGV4dFNpemUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIG92ZXJyaWRlcy5tYXhDb250ZXh0U2l6ZSA9IHJlc291cmNlTGltaXRzLm1heENvbnRleHRTaXplO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXNvdXJjZUxpbWl0cy5tYXhDb250ZXh0VmFsdWVTaXplICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBvdmVycmlkZXMubWF4Q29udGV4dFZhbHVlU2l6ZSA9IHJlc291cmNlTGltaXRzLm1heENvbnRleHRWYWx1ZVNpemU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc291cmNlTGltaXRzLm1heERlcGVuZGVuY2llcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgb3ZlcnJpZGVzLm1heERlcGVuZGVuY2llcyA9IHJlc291cmNlTGltaXRzLm1heERlcGVuZGVuY2llcztcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzb3VyY2VMaW1pdHMubWF4Q29uZGl0aW9uTGVuZ3RoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBvdmVycmlkZXMubWF4Q29uZGl0aW9uTGVuZ3RoID0gcmVzb3VyY2VMaW1pdHMubWF4Q29uZGl0aW9uTGVuZ3RoO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2VmZmVjdGl2ZUxpbWl0cyA9IGdldEVmZmVjdGl2ZUxpbWl0cyhvdmVycmlkZXMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZWZmZWN0aXZlTGltaXRzO1xuICB9XG5cbiAgLyoqXG4gICAqIEludmFsaWRhdGUgY2FjaGVkIGxpbWl0cyAoY2FsbCB3aGVuIHJlc291cmNlTGltaXRzIGNoYW5nZXMpXG4gICAqL1xuICBwdWJsaWMgaW52YWxpZGF0ZUxpbWl0c0NhY2hlKCk6IHZvaWQge1xuICAgIHRoaXMuX2VmZmVjdGl2ZUxpbWl0cyA9IG51bGw7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihtZXRhZGF0YTogUGFydGlhbDxFbnNlbWJsZU1ldGFkYXRhPiwgZWxlbWVudHM6IEVuc2VtYmxlRWxlbWVudFtdID0gW10sIG1ldGFkYXRhU2VydmljZTogTWV0YWRhdGFTZXJ2aWNlKSB7XG4gICAgLy8gU0VDVVJJVFk6IFNhbml0aXplIGFsbCBpbnB1dHNcbiAgICAvLyBOT1RFOiBXZSBwcmVzZXJ2ZSBlbXB0eSBzdHJpbmdzIHNvIHZhbGlkYXRpb24gY2FuIGNhdGNoIHRoZW1cbiAgICBjb25zdCBzYW5pdGl6ZWRNZXRhZGF0YTogUGFydGlhbDxFbnNlbWJsZU1ldGFkYXRhPiA9IHtcbiAgICAgIC4uLm1ldGFkYXRhLFxuICAgICAgbmFtZTogbWV0YWRhdGEubmFtZSAhPT0gdW5kZWZpbmVkID8gKFxuICAgICAgICBtZXRhZGF0YS5uYW1lID09PSAnJyA/ICcnIDogIC8vIFByZXNlcnZlIGVtcHR5IHN0cmluZyBmb3IgdmFsaWRhdGlvblxuICAgICAgICBzYW5pdGl6ZUlucHV0KFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKG1ldGFkYXRhLm5hbWUpLm5vcm1hbGl6ZWRDb250ZW50LCAxMDApXG4gICAgICApIDogdW5kZWZpbmVkLFxuICAgICAgZGVzY3JpcHRpb246IG1ldGFkYXRhLmRlc2NyaXB0aW9uICE9PSB1bmRlZmluZWQgPyAoXG4gICAgICAgIG1ldGFkYXRhLmRlc2NyaXB0aW9uID09PSAnJyA/ICcnIDogIC8vIFByZXNlcnZlIGVtcHR5IHN0cmluZyBmb3IgdmFsaWRhdGlvblxuICAgICAgICBzYW5pdGl6ZUlucHV0KFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKG1ldGFkYXRhLmRlc2NyaXB0aW9uKS5ub3JtYWxpemVkQ29udGVudCwgNTAwKVxuICAgICAgKSA6IHVuZGVmaW5lZFxuICAgIH07XG5cbiAgICAvLyBWYWxpZGF0ZSBhY3RpdmF0aW9uIHN0cmF0ZWd5XG4gICAgY29uc3Qgc3RyYXRlZ3kgPSBtZXRhZGF0YS5hY3RpdmF0aW9uU3RyYXRlZ3kgfHwgRU5TRU1CTEVfREVGQVVMVFMuQUNUSVZBVElPTl9TVFJBVEVHWTtcbiAgICBpZiAoIUFDVElWQVRJT05fU1RSQVRFR0lFUy5pbmNsdWRlcyhzdHJhdGVneSBhcyBhbnkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7RU5TRU1CTEVfRVJST1JTLklOVkFMSURfU1RSQVRFR1l9OiAke3N0cmF0ZWd5fS4gVmFsaWQgc3RyYXRlZ2llczogJHtBQ1RJVkFUSU9OX1NUUkFURUdJRVMuam9pbignLCAnKX1gKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBjb25mbGljdCByZXNvbHV0aW9uIHN0cmF0ZWd5XG4gICAgY29uc3QgY29uZmxpY3RSZXMgPSBtZXRhZGF0YS5jb25mbGljdFJlc29sdXRpb24gfHwgRU5TRU1CTEVfREVGQVVMVFMuQ09ORkxJQ1RfUkVTT0xVVElPTjtcbiAgICBpZiAoIUNPTkZMSUNUX1NUUkFURUdJRVMuaW5jbHVkZXMoY29uZmxpY3RSZXMgYXMgYW55KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke0VOU0VNQkxFX0VSUk9SUy5JTlZBTElEX0NPTkZMSUNUX1JFU09MVVRJT059OiAke2NvbmZsaWN0UmVzfS4gVmFsaWQgc3RyYXRlZ2llczogJHtDT05GTElDVF9TVFJBVEVHSUVTLmpvaW4oJywgJyl9YCk7XG4gICAgfVxuXG4gICAgLy8gQ2FsbCBCYXNlRWxlbWVudCBjb25zdHJ1Y3RvclxuICAgIHN1cGVyKEVsZW1lbnRUeXBlLkVOU0VNQkxFLCBzYW5pdGl6ZWRNZXRhZGF0YSwgbWV0YWRhdGFTZXJ2aWNlKTtcblxuICAgIC8vIEluaXRpYWxpemUgZW5zZW1ibGUtc3BlY2lmaWMgbWV0YWRhdGFcbiAgICAvLyBOT1RFOiBXZSByZXN0b3JlIHRoZSBvcmlnaW5hbCBuYW1lIGV2ZW4gaWYgZW1wdHksIHNvIHZhbGlkYXRpb24gY2FuIGNhdGNoIGl0XG4gICAgLy8gTk9URTogcmVzb3VyY2VMaW1pdHMgaXMgb3B0aW9uYWwgLSBwZXItZW5zZW1ibGUgb3ZlcnJpZGVzIGFyZSByZXNvbHZlZCB2aWEgZ2V0RWZmZWN0aXZlTGltaXRzKClcbiAgICB0aGlzLm1ldGFkYXRhID0ge1xuICAgICAgLi4udGhpcy5tZXRhZGF0YSxcbiAgICAgIG5hbWU6IHNhbml0aXplZE1ldGFkYXRhLm5hbWUgIT09IHVuZGVmaW5lZCA/IHNhbml0aXplZE1ldGFkYXRhLm5hbWUgOiB0aGlzLm1ldGFkYXRhLm5hbWUsXG4gICAgICBhY3RpdmF0aW9uU3RyYXRlZ3k6IHN0cmF0ZWd5LFxuICAgICAgY29uZmxpY3RSZXNvbHV0aW9uOiBjb25mbGljdFJlcyxcbiAgICAgIGNvbnRleHRTaGFyaW5nOiBtZXRhZGF0YS5jb250ZXh0U2hhcmluZyB8fCBFTlNFTUJMRV9ERUZBVUxUUy5DT05URVhUX1NIQVJJTkcsXG4gICAgICByZXNvdXJjZUxpbWl0czogbWV0YWRhdGEucmVzb3VyY2VMaW1pdHMsIC8vIE9wdGlvbmFsIHBlci1lbnNlbWJsZSBvdmVycmlkZXNcbiAgICAgIGFsbG93TmVzdGVkOiBtZXRhZGF0YS5hbGxvd05lc3RlZCA/PyBFTlNFTUJMRV9ERUZBVUxUUy5BTExPV19ORVNURUQsXG4gICAgICBtYXhOZXN0aW5nRGVwdGg6IG1ldGFkYXRhLm1heE5lc3RpbmdEZXB0aCB8fCBFTlNFTUJMRV9ERUZBVUxUUy5NQVhfTkVTVElOR19ERVBUSCxcbiAgICAgIGVsZW1lbnRzOiBbXVxuICAgIH0gYXMgRW5zZW1ibGVNZXRhZGF0YTtcblxuICAgIC8vIEluaXRpYWxpemUgc2hhcmVkIGNvbnRleHRcbiAgICB0aGlzLnNoYXJlZENvbnRleHQgPSB7XG4gICAgICB2YWx1ZXM6IG5ldyBNYXAoKSxcbiAgICAgIG93bmVyczogbmV3IE1hcCgpLFxuICAgICAgdGltZXN0YW1wczogbmV3IE1hcCgpXG4gICAgfTtcblxuICAgIC8vIEluaXRpYWxpemUgZXh0ZW5zaW9ucyBmb3IgdHJhY2tpbmdcbiAgICB0aGlzLmV4dGVuc2lvbnMgPSB7XG4gICAgICBlbGVtZW50Q291bnQ6IDAsXG4gICAgICBhY3RpdmF0aW9uU3RyYXRlZ3k6IHN0cmF0ZWd5LFxuICAgICAgY29uZmxpY3RSZXNvbHV0aW9uOiBjb25mbGljdFJlcyxcbiAgICAgIGxhc3RBY3RpdmF0aW9uOiBudWxsXG4gICAgfTtcblxuICAgIC8vIEFkZCBlbGVtZW50cyBmcm9tIG1ldGFkYXRhXG4gICAgaWYgKGVsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMubG9hZEVsZW1lbnRzRnJvbU1ldGFkYXRhKGVsZW1lbnRzKTtcbiAgICB9XG5cbiAgICAvLyBTRUNVUklUWTogTG9nIGVuc2VtYmxlIGNyZWF0aW9uXG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgdHlwZTogJ0VMRU1FTlRfQ1JFQVRFRCcsXG4gICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICBzb3VyY2U6ICdFbnNlbWJsZS5jb25zdHJ1Y3RvcicsXG4gICAgICBkZXRhaWxzOiBgRW5zZW1ibGUgY3JlYXRlZDogJHt0aGlzLm1ldGFkYXRhLm5hbWV9YCxcbiAgICAgIGFkZGl0aW9uYWxEYXRhOiB7XG4gICAgICAgIGVsZW1lbnRDb3VudDogdGhpcy5lbGVtZW50cy5sZW5ndGgsXG4gICAgICAgIGFjdGl2YXRpb25TdHJhdGVneTogdGhpcy5tZXRhZGF0YS5hY3RpdmF0aW9uU3RyYXRlZ3ksXG4gICAgICAgIGNvbmZsaWN0UmVzb2x1dGlvbjogdGhpcy5tZXRhZGF0YS5jb25mbGljdFJlc29sdXRpb25cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09IEFSUkFZIEhFTFBFUiBNRVRIT0RTID09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEZpbmQgYW4gZWxlbWVudCBieSBuYW1lIGluIHRoZSBlbGVtZW50cyBhcnJheVxuICAgKiBAcGFyYW0gbmFtZSAtIEVsZW1lbnQgbmFtZSB0byBzZWFyY2ggZm9yXG4gICAqIEByZXR1cm5zIEVsZW1lbnQgaWYgZm91bmQsIHVuZGVmaW5lZCBvdGhlcndpc2VcbiAgICovXG4gIHByaXZhdGUgZmluZEVsZW1lbnRCeU5hbWUobmFtZTogc3RyaW5nKTogRW5zZW1ibGVFbGVtZW50IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50cy5maW5kKGVsID0+IGVsLmVsZW1lbnRfbmFtZSA9PT0gbmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYW4gZWxlbWVudCBleGlzdHMgaW4gdGhlIGFycmF5XG4gICAqIEBwYXJhbSBuYW1lIC0gRWxlbWVudCBuYW1lIHRvIGNoZWNrXG4gICAqIEByZXR1cm5zIHRydWUgaWYgZWxlbWVudCBleGlzdHMsIGZhbHNlIG90aGVyd2lzZVxuICAgKi9cbiAgcHJpdmF0ZSBoYXNFbGVtZW50KG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmVsZW1lbnRzLnNvbWUoZWwgPT4gZWwuZWxlbWVudF9uYW1lID09PSBuYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYW4gZWxlbWVudCBmcm9tIHRoZSBhcnJheSBieSBuYW1lXG4gICAqIEBwYXJhbSBuYW1lIC0gRWxlbWVudCBuYW1lIHRvIHJlbW92ZVxuICAgKiBAcmV0dXJucyB0cnVlIGlmIGVsZW1lbnQgd2FzIHJlbW92ZWQsIGZhbHNlIGlmIG5vdCBmb3VuZFxuICAgKi9cbiAgcHJpdmF0ZSByZW1vdmVFbGVtZW50QnlOYW1lKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5lbGVtZW50cy5maW5kSW5kZXgoZWwgPT4gZWwuZWxlbWVudF9uYW1lID09PSBuYW1lKTtcbiAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICB0aGlzLmVsZW1lbnRzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBvciB1cGRhdGUgYW4gZWxlbWVudCBpbiB0aGUgYXJyYXlcbiAgICogQHBhcmFtIGVsZW1lbnQgLSBFbGVtZW50IHRvIGFkZCBvciB1cGRhdGVcbiAgICogQHJldHVybnMgdHJ1ZSBpZiBlbGVtZW50IHdhcyBhZGRlZCwgZmFsc2UgaWYgdXBkYXRlZFxuICAgKi9cbiAgcHJpdmF0ZSBzZXRFbGVtZW50KGVsZW1lbnQ6IEVuc2VtYmxlRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5lbGVtZW50cy5maW5kSW5kZXgoZWwgPT4gZWwuZWxlbWVudF9uYW1lID09PSBlbGVtZW50LmVsZW1lbnRfbmFtZSk7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgLy8gVXBkYXRlIGV4aXN0aW5nIGVsZW1lbnRcbiAgICAgIHRoaXMuZWxlbWVudHNbaW5kZXhdID0gZWxlbWVudDtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQWRkIG5ldyBlbGVtZW50XG4gICAgICB0aGlzLmVsZW1lbnRzLnB1c2goZWxlbWVudCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3luYyBlbGVtZW50cyBhcnJheSB0byBtZXRhZGF0YSAoc2luZ2xlIHNvdXJjZSBvZiB0cnV0aClcbiAgICovXG4gIHByaXZhdGUgc3luY0VsZW1lbnRzVG9NZXRhZGF0YSgpOiB2b2lkIHtcbiAgICB0aGlzLm1ldGFkYXRhLmVsZW1lbnRzID0gWy4uLnRoaXMuZWxlbWVudHNdO1xuICAgIHRoaXMuZXh0ZW5zaW9ucyEuZWxlbWVudENvdW50ID0gdGhpcy5lbGVtZW50cy5sZW5ndGg7XG4gIH1cblxuICAvKipcbiAgICogU3luYyB0aGUgaW50ZXJuYWwgZWxlbWVudHMgYXJyYXkgZnJvbSBtZXRhZGF0YS5lbGVtZW50c1xuICAgKlxuICAgKiBVc2UgdGhpcyBhZnRlciBtZXRhZGF0YS5lbGVtZW50cyBoYXMgYmVlbiBtb2RpZmllZCBleHRlcm5hbGx5XG4gICAqIChlLmcuLCB2aWEgZWRpdEVsZW1lbnQpIHRvIGVuc3VyZSBpbnRlcm5hbCBzdGF0ZSBpcyBjb25zaXN0ZW50LlxuICAgKi9cbiAgcHVibGljIHN5bmNFbGVtZW50c0Zyb21NZXRhZGF0YSgpOiB2b2lkIHtcbiAgICAvLyBDbGVhciBleGlzdGluZyBlbGVtZW50c1xuICAgIHRoaXMuZWxlbWVudHMgPSBbXTtcblxuICAgIC8vIElzc3VlICM2NTg6IERlZmVuc2l2ZSBndWFyZCDigJQgbWV0YWRhdGEuZWxlbWVudHMgbXVzdCBiZSBhbiBhcnJheS5cbiAgICAvLyBJZiBhIGRpY3QgbGVha2VkIHRocm91Z2ggKGUuZy4sIGZyb20gZGVlcE1lcmdlKSwgbG9nIHdhcm5pbmcgYW5kIGJhaWwgb3V0XG4gICAgLy8gcmF0aGVyIHRoYW4gc2lsZW50bHkgcHJvZHVjaW5nIGFuIGVtcHR5IGVsZW1lbnRzIGFycmF5LlxuICAgIGlmICghQXJyYXkuaXNBcnJheSh0aGlzLm1ldGFkYXRhLmVsZW1lbnRzKSkge1xuICAgICAgaWYgKHRoaXMubWV0YWRhdGEuZWxlbWVudHMgJiYgdHlwZW9mIHRoaXMubWV0YWRhdGEuZWxlbWVudHMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdbRW5zZW1ibGVdIG1ldGFkYXRhLmVsZW1lbnRzIGlzIG5vdCBhbiBhcnJheSDigJQgcG9zc2libGUgZGljdCBmb3JtYXQgbGVhay4gRWxlbWVudHMgd2lsbCBub3QgYmUgbG9hZGVkLicpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFJlbG9hZCBmcm9tIG1ldGFkYXRhXG4gICAgaWYgKHRoaXMubWV0YWRhdGEuZWxlbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5sb2FkRWxlbWVudHNGcm9tTWV0YWRhdGEodGhpcy5tZXRhZGF0YS5lbGVtZW50cyk7XG4gICAgfVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT0gRU5EIEFSUkFZIEhFTFBFUiBNRVRIT0RTID09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIExvYWQgZWxlbWVudCByZWZlcmVuY2VzIGZyb20gbWV0YWRhdGFcbiAgICogQ2FsbGVkIGR1cmluZyBjb25zdHJ1Y3Rpb24gdG8gcG9wdWxhdGUgZWxlbWVudHMgYXJyYXlcbiAgICovXG4gIHByaXZhdGUgbG9hZEVsZW1lbnRzRnJvbU1ldGFkYXRhKGVsZW1lbnRzOiBFbnNlbWJsZUVsZW1lbnRbXSk6IHZvaWQge1xuICAgIGNvbnN0IGxpbWl0cyA9IHRoaXMuZ2V0RWZmZWN0aXZlTGltaXRzKCk7XG5cbiAgICAvLyBTRUNVUklUWTogRW5mb3JjZSBlbGVtZW50IGxpbWl0XG4gICAgaWYgKGVsZW1lbnRzLmxlbmd0aCA+IGxpbWl0cy5NQVhfRUxFTUVOVFMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEVuc2VtYmxlIGNhbm5vdCBjb250YWluIG1vcmUgdGhhbiAke2xpbWl0cy5NQVhfRUxFTUVOVFN9IGVsZW1lbnRzIChhdHRlbXB0ZWQ6ICR7ZWxlbWVudHMubGVuZ3RofSlgXG4gICAgICApO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBlbGVtZW50c1tpXTtcblxuICAgICAgLy8gSXNzdWUgIzUwNzogVmFsaWRhdGUgZWFjaCBlbGVtZW50IGlzIGEgcGxhaW4gb2JqZWN0IGJlZm9yZSBhY2Nlc3NpbmcgcHJvcGVydGllcy5cbiAgICAgIC8vIFdoZW4gdXNlcnMgcGFzcyBzdHJpbmdzIChlLmcuLCBbXCJteS1za2lsbFwiXSkgaW5zdGVhZCBvZiBvYmplY3RzLCB0aGUgb2xkIGNvZGVcbiAgICAgIC8vIHByb2R1Y2VkIGNvbmZ1c2luZyBcIkVsZW1lbnQgJ3VuZGVmaW5lZCcgaGFzIG5vIGVsZW1lbnRfdHlwZVwiIGVycm9ycy5cbiAgICAgIGlmICh0eXBlb2YgZWxlbWVudCAhPT0gJ29iamVjdCcgfHwgZWxlbWVudCA9PT0gbnVsbCB8fCBBcnJheS5pc0FycmF5KGVsZW1lbnQpKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlVHlwZSA9IGVsZW1lbnQgPT09IG51bGwgPyAnbnVsbCcgOiBBcnJheS5pc0FycmF5KGVsZW1lbnQpID8gJ2FycmF5JyA6IHR5cGVvZiBlbGVtZW50O1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEVsZW1lbnQgYXQgaW5kZXggJHtpfSBpcyBhICR7dmFsdWVUeXBlfSAoXCIke1N0cmluZyhlbGVtZW50KS5zdWJzdHJpbmcoMCwgNTApfVwiKSwgYCArXG4gICAgICAgICAgYGJ1dCBtdXN0IGJlIGFuIG9iamVjdCB3aXRoIHsgZWxlbWVudF9uYW1lLCBlbGVtZW50X3R5cGUgfS4gYCArXG4gICAgICAgICAgYEV4YW1wbGU6IHsgZWxlbWVudF9uYW1lOiBcIm15LXNraWxsXCIsIGVsZW1lbnRfdHlwZTogXCJza2lsbFwiLCByb2xlOiBcInN1cHBvcnRcIiwgcHJpb3JpdHk6IDUwLCBhY3RpdmF0aW9uOiBcImFsd2F5c1wiIH1gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIE1pZ3JhdGUgbGVnYWN5IGZpZWxkIG5hbWVzOiBuYW1l4oaSZWxlbWVudF9uYW1lLCB0eXBl4oaSZWxlbWVudF90eXBlIChtaXJyb3JzXG4gICAgICAvLyBFbnNlbWJsZU1hbmFnZXIuY3JlYXRlKCkgbGluZXMgNTg2LTYwMiB0byBrZWVwIGNyZWF0ZSBhbmQgZWRpdCBwYXRocyBjb25zaXN0ZW50KVxuICAgICAgY29uc3QgZWxlbWVudE5hbWUgPSBlbGVtZW50LmVsZW1lbnRfbmFtZSB8fCAoZWxlbWVudCBhcyBhbnkpLm5hbWU7XG4gICAgICBjb25zdCBlbGVtZW50VHlwZSA9IGVsZW1lbnQuZWxlbWVudF90eXBlIHx8IChlbGVtZW50IGFzIGFueSkudHlwZTtcblxuICAgICAgLy8gSXNzdWUgIzQ2NjogUmVxdWlyZSBleHBsaWNpdCBlbGVtZW50X3R5cGUg4oCUIGNhbGxlcnMgbXVzdCByZXNvbHZlIHZpYSBwb3J0Zm9saW9cbiAgICAgIC8vIGxvb2t1cCAocmVzb2x2ZUVuc2VtYmxlRWxlbWVudFR5cGVzKSBiZWZvcmUgcmVhY2hpbmcgdGhpcyBtZXRob2QuXG4gICAgICBpZiAoIWVsZW1lbnRUeXBlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgRWxlbWVudCAnJHtlbGVtZW50TmFtZX0nIGhhcyBubyBlbGVtZW50X3R5cGUuIGAgK1xuICAgICAgICAgIGBQcm92aWRlIGVsZW1lbnRfdHlwZSBleHBsaWNpdGx5IG9yIGVuc3VyZSB0aGUgZWxlbWVudCBleGlzdHMgaW4gdGhlIHBvcnRmb2xpby5gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIFZhbGlkYXRlIGFuZCBzYW5pdGl6ZSBlbGVtZW50LCBhcHBseWluZyBkZWZhdWx0cyBmb3Igb3B0aW9uYWwgZmllbGRzXG4gICAgICBjb25zdCBzYW5pdGl6ZWQ6IEVuc2VtYmxlRWxlbWVudCA9IHtcbiAgICAgICAgZWxlbWVudF9uYW1lOiBzYW5pdGl6ZUlucHV0KGVsZW1lbnROYW1lLCAxMDApLFxuICAgICAgICBlbGVtZW50X3R5cGU6IHNhbml0aXplSW5wdXQoZWxlbWVudFR5cGUsIDUwKSxcbiAgICAgICAgcm9sZTogZWxlbWVudC5yb2xlIHx8IEVOU0VNQkxFX0RFRkFVTFRTLkVMRU1FTlRfUk9MRSxcbiAgICAgICAgcHJpb3JpdHk6IGVsZW1lbnQucHJpb3JpdHkgPz8gRU5TRU1CTEVfREVGQVVMVFMuUFJJT1JJVFksXG4gICAgICAgIGFjdGl2YXRpb246IGVsZW1lbnQuYWN0aXZhdGlvbiB8fCAnYWx3YXlzJyxcbiAgICAgICAgLy8gRG9uJ3QgdXNlIHNhbml0aXplSW5wdXQgZm9yIGNvbmRpdGlvbnMgKGl0IHJlbW92ZXMgPCA+IG9wZXJhdG9ycylcbiAgICAgICAgY29uZGl0aW9uOiBlbGVtZW50LmNvbmRpdGlvbiA/XG4gICAgICAgICAgZWxlbWVudC5jb25kaXRpb24udHJpbSgpLnN1YnN0cmluZygwLCBsaW1pdHMuTUFYX0NPTkRJVElPTl9MRU5HVEgpIDpcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIGRlcGVuZGVuY2llczogZWxlbWVudC5kZXBlbmRlbmNpZXM/Lm1hcChkZXAgPT4gc2FuaXRpemVJbnB1dChkZXAsIDEwMCkpLFxuICAgICAgICBwdXJwb3NlOiBlbGVtZW50LnB1cnBvc2UgP1xuICAgICAgICAgIHNhbml0aXplSW5wdXQoZWxlbWVudC5wdXJwb3NlLCA1MDApIDpcbiAgICAgICAgICB1bmRlZmluZWRcbiAgICAgIH07XG5cbiAgICAgIC8vIFZhbGlkYXRlIHJvbGVcbiAgICAgIGlmICghRUxFTUVOVF9ST0xFUy5pbmNsdWRlcyhzYW5pdGl6ZWQucm9sZSBhcyBhbnkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtFTlNFTUJMRV9FUlJPUlMuSU5WQUxJRF9FTEVNRU5UX1JPTEV9OiAke3Nhbml0aXplZC5yb2xlfS4gVmFsaWQgcm9sZXM6ICR7RUxFTUVOVF9ST0xFUy5qb2luKCcsICcpfWApO1xuICAgICAgfVxuXG4gICAgICAvLyBWYWxpZGF0ZSBlbGVtZW50IG5hbWUgcGF0dGVyblxuICAgICAgaWYgKCFFTlNFTUJMRV9QQVRURVJOUy5FTEVNRU5UX05BTUVfUEFUVEVSTi50ZXN0KHNhbml0aXplZC5lbGVtZW50X25hbWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBlbGVtZW50IG5hbWUgZm9ybWF0OiAke3Nhbml0aXplZC5lbGVtZW50X25hbWV9YCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2V0RWxlbWVudChzYW5pdGl6ZWQpO1xuICAgIH1cblxuICAgIHRoaXMuc3luY0VsZW1lbnRzVG9NZXRhZGF0YSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhbiBlbGVtZW50IHRvIHRoZSBlbnNlbWJsZVxuICAgKlxuICAgKiBAcGFyYW0gZWxlbWVudCAtIEVsZW1lbnQgY29uZmlndXJhdGlvbiB0byBhZGRcbiAgICogQHRocm93cyBFcnJvciBpZiBlbGVtZW50IHdvdWxkIGNyZWF0ZSBjaXJjdWxhciBkZXBlbmRlbmN5IG9yIGV4Y2VlZCBsaW1pdHNcbiAgICovXG4gIHB1YmxpYyBhZGRFbGVtZW50KGVsZW1lbnQ6IEVuc2VtYmxlRWxlbWVudCk6IHZvaWQge1xuICAgIGNvbnN0IGxpbWl0cyA9IHRoaXMuZ2V0RWZmZWN0aXZlTGltaXRzKCk7XG5cbiAgICAvLyBDaGVjayBlbGVtZW50IGxpbWl0ICh1c2VzIGNvbmZpZ3VyYWJsZSBsaW1pdHMpXG4gICAgaWYgKHRoaXMuZWxlbWVudHMubGVuZ3RoID49IGxpbWl0cy5NQVhfRUxFTUVOVFMpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogRU5TRU1CTEVfU0VDVVJJVFlfRVZFTlRTLlJFU09VUkNFX0xJTUlUX0VYQ0VFREVELFxuICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgIHNvdXJjZTogJ0Vuc2VtYmxlLmFkZEVsZW1lbnQnLFxuICAgICAgICBkZXRhaWxzOiBgTWF4aW11bSBlbGVtZW50cyAoJHtsaW1pdHMuTUFYX0VMRU1FTlRTfSkgZXhjZWVkZWRgXG4gICAgICB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRW5zZW1ibGUgY2Fubm90IGNvbnRhaW4gbW9yZSB0aGFuICR7bGltaXRzLk1BWF9FTEVNRU5UU30gZWxlbWVudHNgKTtcbiAgICB9XG5cbiAgICAvLyBTYW5pdGl6ZSBlbGVtZW50IG5hbWUgLSBmaXJzdCB1c2UgZ2VuZXJhbCBzYW5pdGl6YXRpb24sIHRoZW4gZW5mb3JjZSBwYXR0ZXJuXG4gICAgY29uc3Qgb3JpZ2luYWxOYW1lID0gZWxlbWVudC5lbGVtZW50X25hbWU7XG4gICAgbGV0IHNhbml0aXplZE5hbWUgPSBzYW5pdGl6ZUlucHV0KG9yaWdpbmFsTmFtZSwgMTAwKTtcblxuICAgIC8vIFJlbW92ZSBhbnkgY2hhcmFjdGVycyB0aGF0IGRvbid0IG1hdGNoIHRoZSBhbGxvd2VkIHBhdHRlcm5cbiAgICBjb25zdCBjbGVhbmVkTmFtZSA9IHNhbml0aXplZE5hbWUucmVwbGFjZSgvW15hLXpBLVowLTlfLV0vZywgJycpO1xuXG4gICAgLy8gQ2hlY2sgaWYgaW52YWxpZCBjaGFyYWN0ZXJzIHdlcmUgcmVtb3ZlZFxuICAgIGlmIChjbGVhbmVkTmFtZS5sZW5ndGggPCBvcmlnaW5hbE5hbWUubGVuZ3RoICYmIG9yaWdpbmFsTmFtZS5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBFbGVtZW50IG5hbWUgY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXJzLiBgICtcbiAgICAgICAgYE9ubHkgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMsIGh5cGhlbnMsIGFuZCB1bmRlcnNjb3JlcyBhcmUgYWxsb3dlZC4gYCArXG4gICAgICAgIGBJbnZhbGlkIG5hbWU6IFwiJHtvcmlnaW5hbE5hbWV9XCJgXG4gICAgICApO1xuICAgIH1cblxuICAgIHNhbml0aXplZE5hbWUgPSBjbGVhbmVkTmFtZTtcblxuICAgIC8vIFJlamVjdCBpZiBzYW5pdGl6YXRpb24gcmVzdWx0cyBpbiBlbXB0eSBuYW1lXG4gICAgaWYgKCFzYW5pdGl6ZWROYW1lIHx8IHNhbml0aXplZE5hbWUubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBFbGVtZW50IG5hbWUgaXMgZW1wdHkgb3IgY29udGFpbnMgb25seSBpbnZhbGlkIGNoYXJhY3RlcnM6IFwiJHtvcmlnaW5hbE5hbWV9XCJgXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEZpbmFsIHBhdHRlcm4gdmFsaWRhdGlvbiAoc2hvdWxkIGFsd2F5cyBwYXNzIGlmIGFib3ZlIGNoZWNrcyBwYXNzZWQpXG4gICAgaWYgKCFFTlNFTUJMRV9QQVRURVJOUy5FTEVNRU5UX05BTUVfUEFUVEVSTi50ZXN0KHNhbml0aXplZE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBFbGVtZW50IG5hbWUgZm9ybWF0IHZhbGlkYXRpb24gZmFpbGVkOiBcIiR7c2FuaXRpemVkTmFtZX1cIi4gYCArXG4gICAgICAgIGBUaGlzIHNob3VsZCBub3QgaGFwcGVuIC0gcGxlYXNlIHJlcG9ydCB0aGlzIGVycm9yLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIHNhbml0aXplZCBjb3B5IHRvIGF2b2lkIG11dGF0aW5nIHRoZSBpbnB1dFxuICAgIGNvbnN0IHNhbml0aXplZEVsZW1lbnQ6IEVuc2VtYmxlRWxlbWVudCA9IHtcbiAgICAgIGVsZW1lbnRfbmFtZTogc2FuaXRpemVkTmFtZSxcbiAgICAgIGVsZW1lbnRfdHlwZTogZWxlbWVudC5lbGVtZW50X3R5cGUsXG4gICAgICByb2xlOiBlbGVtZW50LnJvbGUsXG4gICAgICBwcmlvcml0eTogZWxlbWVudC5wcmlvcml0eSxcbiAgICAgIGFjdGl2YXRpb246IGVsZW1lbnQuYWN0aXZhdGlvblxuICAgIH07XG5cbiAgICAvLyBWYWxpZGF0ZSByb2xlXG4gICAgaWYgKCFFTEVNRU5UX1JPTEVTLmluY2x1ZGVzKHNhbml0aXplZEVsZW1lbnQucm9sZSBhcyBhbnkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7RU5TRU1CTEVfRVJST1JTLklOVkFMSURfRUxFTUVOVF9ST0xFfTogJHtzYW5pdGl6ZWRFbGVtZW50LnJvbGV9LiBWYWxpZCByb2xlczogJHtFTEVNRU5UX1JPTEVTLmpvaW4oJywgJyl9YCk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgYW5kIHNhbml0aXplIGFjdGl2YXRpb24gY29uZGl0aW9uIGlmIHByb3ZpZGVkXG4gICAgaWYgKGVsZW1lbnQuY29uZGl0aW9uKSB7XG4gICAgICAvLyBUcmltIGFuZCBlbmZvcmNlIGxlbmd0aCBsaW1pdCAoZG9uJ3QgdXNlIHNhbml0aXplSW5wdXQgYXMgaXQgcmVtb3ZlcyA8ID4gb3BlcmF0b3JzKVxuICAgICAgY29uc3QgY29uZGl0aW9uVG9WYWxpZGF0ZSA9IGVsZW1lbnQuY29uZGl0aW9uXG4gICAgICAgIC50cmltKClcbiAgICAgICAgLnN1YnN0cmluZygwLCBsaW1pdHMuTUFYX0NPTkRJVElPTl9MRU5HVEgpO1xuXG4gICAgICBpZiAoIXRoaXMuaXNWYWxpZENvbmRpdGlvbihjb25kaXRpb25Ub1ZhbGlkYXRlKSkge1xuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogRU5TRU1CTEVfU0VDVVJJVFlfRVZFTlRTLlNVU1BJQ0lPVVNfQ09ORElUSU9OLFxuICAgICAgICAgIHNldmVyaXR5OiAnSElHSCcsXG4gICAgICAgICAgc291cmNlOiAnRW5zZW1ibGUuYWRkRWxlbWVudCcsXG4gICAgICAgICAgZGV0YWlsczogYFN1c3BpY2lvdXMgYWN0aXZhdGlvbiBjb25kaXRpb246ICR7Y29uZGl0aW9uVG9WYWxpZGF0ZX1gXG4gICAgICAgIH0pO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYWN0aXZhdGlvbiBjb25kaXRpb24gc3ludGF4Jyk7XG4gICAgICB9XG4gICAgICBzYW5pdGl6ZWRFbGVtZW50LmNvbmRpdGlvbiA9IGNvbmRpdGlvblRvVmFsaWRhdGU7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgYW5kIHNhbml0aXplIGRlcGVuZGVuY2llc1xuICAgIGlmIChlbGVtZW50LmRlcGVuZGVuY2llcykge1xuICAgICAgLy8gVHJ1bmNhdGUgZGVwZW5kZW5jaWVzIGFycmF5IGlmIGl0IGV4Y2VlZHMgdGhlIGxpbWl0IChzZWN1cml0eTogcHJldmVudCByZXNvdXJjZSBleGhhdXN0aW9uKVxuICAgICAgbGV0IGRlcHMgPSBlbGVtZW50LmRlcGVuZGVuY2llcztcbiAgICAgIGlmIChkZXBzLmxlbmd0aCA+IGxpbWl0cy5NQVhfREVQRU5ERU5DSUVTKSB7XG4gICAgICAgIGRlcHMgPSBkZXBzLnNsaWNlKDAsIGxpbWl0cy5NQVhfREVQRU5ERU5DSUVTKTtcbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6IEVOU0VNQkxFX1NFQ1VSSVRZX0VWRU5UUy5SRVNPVVJDRV9MSU1JVF9FWENFRURFRCxcbiAgICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgICAgc291cmNlOiAnRW5zZW1ibGUuYWRkRWxlbWVudCcsXG4gICAgICAgICAgZGV0YWlsczogYERlcGVuZGVuY2llcyB0cnVuY2F0ZWQgZnJvbSAke2VsZW1lbnQuZGVwZW5kZW5jaWVzLmxlbmd0aH0gdG8gJHtsaW1pdHMuTUFYX0RFUEVOREVOQ0lFU31gXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBTYW5pdGl6ZSBlYWNoIGRlcGVuZGVuY3lcbiAgICAgIGNvbnN0IHNhbml0aXplZERlcHMgPSBkZXBzLm1hcChkZXAgPT4gc2FuaXRpemVJbnB1dChkZXAsIDEwMCkpO1xuICAgICAgc2FuaXRpemVkRWxlbWVudC5kZXBlbmRlbmNpZXMgPSBzYW5pdGl6ZWREZXBzO1xuXG4gICAgICAvLyBDaGVjayBmb3IgY2lyY3VsYXIgZGVwZW5kZW5jaWVzXG4gICAgICBpZiAodGhpcy53b3VsZENyZWF0ZUNpcmN1bGFyRGVwZW5kZW5jeShzYW5pdGl6ZWROYW1lLCBzYW5pdGl6ZWREZXBzKSkge1xuICAgICAgICBjb25zdCBjaXJjdWxhciA9IHRoaXMuZmluZENpcmN1bGFyRGVwZW5kZW5jeShzYW5pdGl6ZWROYW1lLCBzYW5pdGl6ZWREZXBzKTtcbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6IEVOU0VNQkxFX1NFQ1VSSVRZX0VWRU5UUy5DSVJDVUxBUl9ERVBFTkRFTkNZLFxuICAgICAgICAgIHNldmVyaXR5OiAnSElHSCcsXG4gICAgICAgICAgc291cmNlOiAnRW5zZW1ibGUuYWRkRWxlbWVudCcsXG4gICAgICAgICAgZGV0YWlsczogYENpcmN1bGFyIGRlcGVuZGVuY3kgZGV0ZWN0ZWQ6ICR7Y2lyY3VsYXIucGF0aC5qb2luKCcgLT4gJyl9YFxuICAgICAgICB9KTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke0VOU0VNQkxFX0VSUk9SUy5DSVJDVUxBUl9ERVBFTkRFTkNZfTogJHtjaXJjdWxhci5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFkZCBvcHRpb25hbCBwdXJwb3NlIGZpZWxkIGlmIHByb3ZpZGVkXG4gICAgaWYgKGVsZW1lbnQucHVycG9zZSkge1xuICAgICAgc2FuaXRpemVkRWxlbWVudC5wdXJwb3NlID0gc2FuaXRpemVJbnB1dChlbGVtZW50LnB1cnBvc2UsIDUwMCk7XG4gICAgfVxuXG4gICAgLy8gQWRkIHNhbml0aXplZCBlbGVtZW50IHRvIGFycmF5IChub3QgdGhlIG9yaWdpbmFsIHRvIGF2b2lkIHN0b3JpbmcgdW5zYW5pdGl6ZWQgZGF0YSlcbiAgICB0aGlzLnNldEVsZW1lbnQoc2FuaXRpemVkRWxlbWVudCk7XG4gICAgdGhpcy5zeW5jRWxlbWVudHNUb01ldGFkYXRhKCk7XG4gICAgdGhpcy5tYXJrRGlydHkoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgYW4gZWxlbWVudCdzIGNvbmZpZ3VyYXRpb24gaW4gdGhlIGVuc2VtYmxlXG4gICAqXG4gICAqIEBwYXJhbSBlbGVtZW50TmFtZSAtIE5hbWUgb2YgZWxlbWVudCB0byB1cGRhdGVcbiAgICogQHBhcmFtIHVwZGF0ZXMgLSBQYXJ0aWFsIGVsZW1lbnQgY29uZmlndXJhdGlvbiB0byBtZXJnZSB3aXRoIGV4aXN0aW5nXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgZWxlbWVudCBub3QgZm91bmQgb3IgYWN0aXZhdGlvbiBpbiBwcm9ncmVzc1xuICAgKi9cbiAgcHVibGljIHVwZGF0ZUVsZW1lbnQoXG4gICAgZWxlbWVudE5hbWU6IHN0cmluZyxcbiAgICB1cGRhdGVzOiBQYXJ0aWFsPEVuc2VtYmxlRWxlbWVudD5cbiAgKTogdm9pZCB7XG4gICAgLy8gUHJldmVudCB1cGRhdGVzIGR1cmluZyBhY3RpdmF0aW9uXG4gICAgaWYgKHRoaXMuYWN0aXZhdGlvbkluUHJvZ3Jlc3MpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHVwZGF0ZSBlbGVtZW50cyB3aGlsZSBlbnNlbWJsZSBhY3RpdmF0aW9uIGlzIGluIHByb2dyZXNzJyk7XG4gICAgfVxuXG4gICAgY29uc3QgbGltaXRzID0gdGhpcy5nZXRFZmZlY3RpdmVMaW1pdHMoKTtcbiAgICBjb25zdCBzYW5pdGl6ZWROYW1lID0gc2FuaXRpemVJbnB1dChlbGVtZW50TmFtZSwgMTAwKTtcblxuICAgIGlmICghdGhpcy5oYXNFbGVtZW50KHNhbml0aXplZE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoRU5TRU1CTEVfRVJST1JTLkVMRU1FTlRfTk9UX0ZPVU5EKTtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50RWxlbWVudCA9IHRoaXMuZmluZEVsZW1lbnRCeU5hbWUoc2FuaXRpemVkTmFtZSkhO1xuXG4gICAgLy8gU2FuaXRpemUgYW5kIHZhbGlkYXRlIHVwZGF0ZXNcbiAgICBjb25zdCBzYW5pdGl6ZWRVcGRhdGVzOiBQYXJ0aWFsPEVuc2VtYmxlRWxlbWVudD4gPSB7fTtcblxuICAgIGlmICh1cGRhdGVzLnJvbGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKCFFTEVNRU5UX1JPTEVTLmluY2x1ZGVzKHVwZGF0ZXMucm9sZSBhcyBhbnkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtFTlNFTUJMRV9FUlJPUlMuSU5WQUxJRF9FTEVNRU5UX1JPTEV9OiAke3VwZGF0ZXMucm9sZX0uIFZhbGlkIHJvbGVzOiAke0VMRU1FTlRfUk9MRVMuam9pbignLCAnKX1gKTtcbiAgICAgIH1cbiAgICAgIHNhbml0aXplZFVwZGF0ZXMucm9sZSA9IHVwZGF0ZXMucm9sZTtcbiAgICB9XG5cbiAgICBpZiAodXBkYXRlcy5wcmlvcml0eSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBzYW5pdGl6ZWRVcGRhdGVzLnByaW9yaXR5ID0gdXBkYXRlcy5wcmlvcml0eTtcbiAgICB9XG5cbiAgICBpZiAodXBkYXRlcy5hY3RpdmF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHNhbml0aXplZFVwZGF0ZXMuYWN0aXZhdGlvbiA9IHVwZGF0ZXMuYWN0aXZhdGlvbjtcbiAgICB9XG5cbiAgICBpZiAodXBkYXRlcy5jb25kaXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gVHJpbSBhbmQgZW5mb3JjZSBsZW5ndGggbGltaXQgKGRvbid0IHVzZSBzYW5pdGl6ZUlucHV0IGFzIGl0IHJlbW92ZXMgPCA+IG9wZXJhdG9ycylcbiAgICAgIGNvbnN0IGNvbmRpdGlvblRvVmFsaWRhdGUgPSB1cGRhdGVzLmNvbmRpdGlvblxuICAgICAgICAudHJpbSgpXG4gICAgICAgIC5zdWJzdHJpbmcoMCwgbGltaXRzLk1BWF9DT05ESVRJT05fTEVOR1RIKTtcblxuICAgICAgaWYgKCF0aGlzLmlzVmFsaWRDb25kaXRpb24oY29uZGl0aW9uVG9WYWxpZGF0ZSkpIHtcbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6IEVOU0VNQkxFX1NFQ1VSSVRZX0VWRU5UUy5TVVNQSUNJT1VTX0NPTkRJVElPTixcbiAgICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICAgIHNvdXJjZTogJ0Vuc2VtYmxlLnVwZGF0ZUVsZW1lbnQnLFxuICAgICAgICAgIGRldGFpbHM6IGBTdXNwaWNpb3VzIGFjdGl2YXRpb24gY29uZGl0aW9uOiAke2NvbmRpdGlvblRvVmFsaWRhdGV9YFxuICAgICAgICB9KTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGFjdGl2YXRpb24gY29uZGl0aW9uIHN5bnRheCcpO1xuICAgICAgfVxuICAgICAgc2FuaXRpemVkVXBkYXRlcy5jb25kaXRpb24gPSBjb25kaXRpb25Ub1ZhbGlkYXRlO1xuICAgIH1cblxuICAgIGlmICh1cGRhdGVzLmRlcGVuZGVuY2llcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBWYWxpZGF0ZSBkZXBlbmRlbmN5IGxpbWl0XG4gICAgICBsZXQgZGVwcyA9IHVwZGF0ZXMuZGVwZW5kZW5jaWVzO1xuICAgICAgaWYgKGRlcHMubGVuZ3RoID4gbGltaXRzLk1BWF9ERVBFTkRFTkNJRVMpIHtcbiAgICAgICAgZGVwcyA9IGRlcHMuc2xpY2UoMCwgbGltaXRzLk1BWF9ERVBFTkRFTkNJRVMpO1xuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogRU5TRU1CTEVfU0VDVVJJVFlfRVZFTlRTLlJFU09VUkNFX0xJTUlUX0VYQ0VFREVELFxuICAgICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgICBzb3VyY2U6ICdFbnNlbWJsZS51cGRhdGVFbGVtZW50JyxcbiAgICAgICAgICBkZXRhaWxzOiBgRGVwZW5kZW5jaWVzIHRydW5jYXRlZCBmcm9tICR7dXBkYXRlcy5kZXBlbmRlbmNpZXMubGVuZ3RofSB0byAke2xpbWl0cy5NQVhfREVQRU5ERU5DSUVTfWBcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNhbml0aXplIGRlcGVuZGVuY2llc1xuICAgICAgY29uc3Qgc2FuaXRpemVkRGVwcyA9IGRlcHMubWFwKGRlcCA9PiBzYW5pdGl6ZUlucHV0KGRlcCwgMTAwKSk7XG5cbiAgICAgIC8vIENoZWNrIGZvciBjaXJjdWxhciBkZXBlbmRlbmNpZXMgd2l0aCB1cGRhdGVkIGRlcGVuZGVuY2llc1xuICAgICAgaWYgKHRoaXMud291bGRDcmVhdGVDaXJjdWxhckRlcGVuZGVuY3koc2FuaXRpemVkTmFtZSwgc2FuaXRpemVkRGVwcykpIHtcbiAgICAgICAgY29uc3QgY2lyY3VsYXIgPSB0aGlzLmZpbmRDaXJjdWxhckRlcGVuZGVuY3koc2FuaXRpemVkTmFtZSwgc2FuaXRpemVkRGVwcyk7XG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiBFTlNFTUJMRV9TRUNVUklUWV9FVkVOVFMuQ0lSQ1VMQVJfREVQRU5ERU5DWSxcbiAgICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICAgIHNvdXJjZTogJ0Vuc2VtYmxlLnVwZGF0ZUVsZW1lbnQnLFxuICAgICAgICAgIGRldGFpbHM6IGBDaXJjdWxhciBkZXBlbmRlbmN5IGRldGVjdGVkOiAke2NpcmN1bGFyLnBhdGguam9pbignIC0+ICcpfWBcbiAgICAgICAgfSk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtFTlNFTUJMRV9FUlJPUlMuQ0lSQ1VMQVJfREVQRU5ERU5DWX06ICR7Y2lyY3VsYXIubWVzc2FnZX1gKTtcbiAgICAgIH1cblxuICAgICAgc2FuaXRpemVkVXBkYXRlcy5kZXBlbmRlbmNpZXMgPSBzYW5pdGl6ZWREZXBzO1xuICAgIH1cblxuICAgIGlmICh1cGRhdGVzLnB1cnBvc2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc2FuaXRpemVkVXBkYXRlcy5wdXJwb3NlID0gc2FuaXRpemVJbnB1dCh1cGRhdGVzLnB1cnBvc2UsIDUwMCk7XG4gICAgfVxuXG4gICAgLy8gTWVyZ2UgdXBkYXRlcyB3aXRoIGN1cnJlbnQgZWxlbWVudFxuICAgIGNvbnN0IHVwZGF0ZWRFbGVtZW50OiBFbnNlbWJsZUVsZW1lbnQgPSB7XG4gICAgICAuLi5jdXJyZW50RWxlbWVudCxcbiAgICAgIC4uLnNhbml0aXplZFVwZGF0ZXNcbiAgICB9O1xuXG4gICAgdGhpcy5zZXRFbGVtZW50KHVwZGF0ZWRFbGVtZW50KTtcbiAgICB0aGlzLnN5bmNFbGVtZW50c1RvTWV0YWRhdGEoKTtcbiAgICB0aGlzLm1hcmtEaXJ0eSgpO1xuXG4gICAgbG9nZ2VyLmRlYnVnKGBFbGVtZW50ICR7c2FuaXRpemVkTmFtZX0gdXBkYXRlZCBpbiBlbnNlbWJsZSAke3RoaXMuaWR9YCk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGFuIGVsZW1lbnQgZnJvbSB0aGUgZW5zZW1ibGVcbiAgICpcbiAgICogQHBhcmFtIGVsZW1lbnROYW1lIC0gTmFtZSBvZiBlbGVtZW50IHRvIHJlbW92ZVxuICAgKiBAdGhyb3dzIEVycm9yIGlmIGVsZW1lbnQgbm90IGZvdW5kIG9yIGFjdGl2YXRpb24gaW4gcHJvZ3Jlc3NcbiAgICovXG4gIHB1YmxpYyByZW1vdmVFbGVtZW50KGVsZW1lbnROYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAvLyBQcmV2ZW50IHJlbW92YWwgZHVyaW5nIGFjdGl2YXRpb25cbiAgICBpZiAodGhpcy5hY3RpdmF0aW9uSW5Qcm9ncmVzcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgcmVtb3ZlIGVsZW1lbnRzIHdoaWxlIGVuc2VtYmxlIGFjdGl2YXRpb24gaXMgaW4gcHJvZ3Jlc3MnKTtcbiAgICB9XG5cbiAgICBjb25zdCBzYW5pdGl6ZWROYW1lID0gc2FuaXRpemVJbnB1dChlbGVtZW50TmFtZSwgMTAwKTtcblxuICAgIGlmICghdGhpcy5oYXNFbGVtZW50KHNhbml0aXplZE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoRU5TRU1CTEVfRVJST1JTLkVMRU1FTlRfTk9UX0ZPVU5EKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBlbGVtZW50IGlzIGN1cnJlbnRseSBhY3RpdmVcbiAgICBpZiAodGhpcy5lbGVtZW50SW5zdGFuY2VzLmhhcyhzYW5pdGl6ZWROYW1lKSkge1xuICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgIGBSZW1vdmluZyBhY3RpdmUgZWxlbWVudCAnJHtzYW5pdGl6ZWROYW1lfScgZnJvbSBlbnNlbWJsZS4gYCArXG4gICAgICAgIGBDb25zaWRlciBkZWFjdGl2YXRpbmcgdGhlIGVuc2VtYmxlIGZpcnN0LmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGVsZW1lbnQgYW5kIGl0cyBpbnN0YW5jZVxuICAgIHRoaXMucmVtb3ZlRWxlbWVudEJ5TmFtZShzYW5pdGl6ZWROYW1lKTtcbiAgICB0aGlzLmVsZW1lbnRJbnN0YW5jZXMuZGVsZXRlKHNhbml0aXplZE5hbWUpO1xuXG4gICAgLy8gQ2xlYW4gdXAgZGVwZW5kZW5jaWVzIHBvaW50aW5nIHRvIHRoaXMgZWxlbWVudFxuICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiB0aGlzLmVsZW1lbnRzKSB7XG4gICAgICBpZiAoZWxlbWVudC5kZXBlbmRlbmNpZXM/LmluY2x1ZGVzKHNhbml0aXplZE5hbWUpKSB7XG4gICAgICAgIGVsZW1lbnQuZGVwZW5kZW5jaWVzID0gZWxlbWVudC5kZXBlbmRlbmNpZXMuZmlsdGVyKGRlcCA9PiBkZXAgIT09IHNhbml0aXplZE5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENsZWFuIHVwIHNoYXJlZCBjb250ZXh0IG93bmVkIGJ5IHRoaXMgZWxlbWVudFxuICAgIGZvciAoY29uc3QgW2tleSwgb3duZXJdIG9mIHRoaXMuc2hhcmVkQ29udGV4dC5vd25lcnMpIHtcbiAgICAgIGlmIChvd25lciA9PT0gc2FuaXRpemVkTmFtZSkge1xuICAgICAgICB0aGlzLnNoYXJlZENvbnRleHQudmFsdWVzLmRlbGV0ZShrZXkpO1xuICAgICAgICB0aGlzLnNoYXJlZENvbnRleHQub3duZXJzLmRlbGV0ZShrZXkpO1xuICAgICAgICB0aGlzLnNoYXJlZENvbnRleHQudGltZXN0YW1wcy5kZWxldGUoa2V5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnN5bmNFbGVtZW50c1RvTWV0YWRhdGEoKTtcbiAgICB0aGlzLm1hcmtEaXJ0eSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjdGl2YXRlIHRoZSBlbGVtZW50IChCYXNlRWxlbWVudCBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24pXG4gICAqIEZvciBlbnNlbWJsZXMsIHRoaXMgaXMgYSBuby1vcC4gVXNlIGFjdGl2YXRlRW5zZW1ibGUoKSBmb3IgZnVsbCBhY3RpdmF0aW9uLlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIGFzeW5jIGFjdGl2YXRlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuX3N0YXR1cyA9IEVsZW1lbnRTdGF0dXMuQUNUSVZFO1xuICAgIGxvZ2dlci5kZWJ1ZyhgRW5zZW1ibGUgJHt0aGlzLmlkfSBhY3RpdmF0ZWQgKHVzZSBhY3RpdmF0ZUVuc2VtYmxlKCkgZm9yIGZ1bGwgb3JjaGVzdHJhdGlvbilgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY3RpdmF0ZSB0aGUgZW5zZW1ibGUgYW5kIGFsbCBpdHMgZWxlbWVudHMgYmFzZWQgb24gc3RyYXRlZ3lcbiAgICpcbiAgICogQHBhcmFtIHBvcnRmb2xpb01hbmFnZXIgLSBQb3J0Zm9saW8gbWFuYWdlciBmb3IgbG9hZGluZyBlbGVtZW50IGluc3RhbmNlc1xuICAgKiBAcGFyYW0gbWFuYWdlcnMgLSBFbGVtZW50IG1hbmFnZXJzIGZvciBsb2FkaW5nIGRpZmZlcmVudCBlbGVtZW50IHR5cGVzXG4gICAqIEBwYXJhbSBuZXN0aW5nRGVwdGggLSBDdXJyZW50IG5lc3RpbmcgZGVwdGggKDAgZm9yIHRvcC1sZXZlbCwgaW5jcmVtZW50cyBmb3IgbmVzdGVkKVxuICAgKiBAcmV0dXJucyBBY3RpdmF0aW9uIHJlc3VsdCB3aXRoIHN1Y2Nlc3Mgc3RhdHVzIGFuZCBlbGVtZW50IHJlc3VsdHNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBhY3RpdmF0ZUVuc2VtYmxlKFxuICAgIHBvcnRmb2xpb01hbmFnZXI6IFBvcnRmb2xpb01hbmFnZXIsXG4gICAgbWFuYWdlcnM6IGltcG9ydCgnLi90eXBlcy5qcycpLkVsZW1lbnRNYW5hZ2VycyxcbiAgICBuZXN0aW5nRGVwdGg6IG51bWJlciA9IDBcbiAgKTogUHJvbWlzZTxFbnNlbWJsZUFjdGl2YXRpb25SZXN1bHQ+IHtcbiAgICBpZiAodGhpcy5hY3RpdmF0aW9uSW5Qcm9ncmVzcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBY3RpdmF0aW9uIGFscmVhZHkgaW4gcHJvZ3Jlc3MnKTtcbiAgICB9XG5cbiAgICB0aGlzLmFjdGl2YXRpb25JblByb2dyZXNzID0gdHJ1ZTtcbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IGxpbWl0cyA9IHRoaXMuZ2V0RWZmZWN0aXZlTGltaXRzKCk7XG4gICAgY29uc3QgdGltZW91dCA9IGxpbWl0cy5NQVhfQUNUSVZBVElPTl9USU1FO1xuXG4gICAgbGV0IHRpbWVvdXRIYW5kbGU6IE5vZGVKUy5UaW1lb3V0IHwgdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICAvLyBDcmVhdGUgdGltZW91dCBwcm9taXNlXG4gICAgICBjb25zdCB0aW1lb3V0UHJvbWlzZSA9IG5ldyBQcm9taXNlPG5ldmVyPigoXywgcmVqZWN0KSA9PiB7XG4gICAgICAgIHRpbWVvdXRIYW5kbGUgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKGBFbnNlbWJsZSBhY3RpdmF0aW9uIHRpbWVvdXQgYWZ0ZXIgJHt0aW1lb3V0fW1zYCkpO1xuICAgICAgICB9LCB0aW1lb3V0KTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBDcmVhdGUgYWN0aXZhdGlvbiBwcm9taXNlXG4gICAgICBjb25zdCBhY3RpdmF0aW9uUHJvbWlzZSA9IHRoaXMucGVyZm9ybUFjdGl2YXRpb24oXG4gICAgICAgIHBvcnRmb2xpb01hbmFnZXIsXG4gICAgICAgIG1hbmFnZXJzLFxuICAgICAgICBzdGFydFRpbWUsXG4gICAgICAgIG5lc3RpbmdEZXB0aFxuICAgICAgKTtcblxuICAgICAgLy8gUmFjZSBhY3RpdmF0aW9uIGFnYWluc3QgdGltZW91dFxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUHJvbWlzZS5yYWNlKFthY3RpdmF0aW9uUHJvbWlzZSwgdGltZW91dFByb21pc2VdKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuX3N0YXR1cyA9IEVsZW1lbnRTdGF0dXMuRVJST1I7XG5cbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogRU5TRU1CTEVfU0VDVVJJVFlfRVZFTlRTLkFDVElWQVRJT05fRkFJTEVELFxuICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICBzb3VyY2U6ICdFbnNlbWJsZS5hY3RpdmF0ZUVuc2VtYmxlJyxcbiAgICAgICAgZGV0YWlsczogYEFjdGl2YXRpb24gZmFpbGVkIGFmdGVyICR7RGF0ZS5ub3coKSAtIHN0YXJ0VGltZX1tczogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31gXG4gICAgICB9KTtcblxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmICh0aW1lb3V0SGFuZGxlKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SGFuZGxlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuYWN0aXZhdGlvbkluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIHRvIGNyZWF0ZSBzdHJ1Y3R1cmVkIGxvZyBjb250ZXh0IGZvciBlbnNlbWJsZSBvcGVyYXRpb25zXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGdldExvZ0NvbnRleHQoYWRkaXRpb25hbERhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVuc2VtYmxlSWQ6IHRoaXMuaWQsXG4gICAgICBlbnNlbWJsZU5hbWU6IHRoaXMubWV0YWRhdGEubmFtZSxcbiAgICAgIGVsZW1lbnRDb3VudDogdGhpcy5lbGVtZW50cy5sZW5ndGgsXG4gICAgICBhY3RpdmF0aW9uU3RyYXRlZ3k6IHRoaXMubWV0YWRhdGEuYWN0aXZhdGlvblN0cmF0ZWd5LFxuICAgICAgYWxsb3dOZXN0ZWQ6IHRoaXMubWV0YWRhdGEuYWxsb3dOZXN0ZWQsXG4gICAgICBtYXhOZXN0aW5nRGVwdGg6IHRoaXMubWV0YWRhdGEubWF4TmVzdGluZ0RlcHRoLFxuICAgICAgLi4uYWRkaXRpb25hbERhdGFcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm0gdGhlIGFjdHVhbCBhY3RpdmF0aW9uIGxvZ2ljXG4gICAqIEV4dHJhY3RlZCB0byBzZXBhcmF0ZSBtZXRob2QgZm9yIHRpbWVvdXQgaGFuZGxpbmdcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcGVyZm9ybUFjdGl2YXRpb24oXG4gICAgcG9ydGZvbGlvTWFuYWdlcjogUG9ydGZvbGlvTWFuYWdlcixcbiAgICBtYW5hZ2VyczogaW1wb3J0KCcuL3R5cGVzLmpzJykuRWxlbWVudE1hbmFnZXJzLFxuICAgIHN0YXJ0VGltZTogbnVtYmVyLFxuICAgIG5lc3RpbmdEZXB0aDogbnVtYmVyXG4gICk6IFByb21pc2U8RW5zZW1ibGVBY3RpdmF0aW9uUmVzdWx0PiB7XG4gICAgLy8gU2V0IHN0YXR1c1xuICAgIHRoaXMuX3N0YXR1cyA9IEVsZW1lbnRTdGF0dXMuQUNUSVZFO1xuXG4gICAgLy8gU3RydWN0dXJlZCBsb2dnaW5nOiBBY3RpdmF0aW9uIHN0YXJ0XG4gICAgbG9nZ2VyLmluZm8oJ0Vuc2VtYmxlIGFjdGl2YXRpb24gc3RhcnRlZCcsIHRoaXMuZ2V0TG9nQ29udGV4dCh7XG4gICAgICBzdHJhdGVneTogdGhpcy5tZXRhZGF0YS5hY3RpdmF0aW9uU3RyYXRlZ3ksXG4gICAgICB0b3RhbEVsZW1lbnRzOiB0aGlzLmVsZW1lbnRzLmxlbmd0aCxcbiAgICAgIHJlc291cmNlTGltaXRzOiB0aGlzLm1ldGFkYXRhLnJlc291cmNlTGltaXRzLFxuICAgICAgbmVzdGluZ0RlcHRoOiBuZXN0aW5nRGVwdGhcbiAgICB9KSk7XG5cbiAgICBjb25zdCByZXN1bHQ6IEVuc2VtYmxlQWN0aXZhdGlvblJlc3VsdCA9IHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICBhY3RpdmF0ZWRFbGVtZW50czogW10sXG4gICAgICBmYWlsZWRFbGVtZW50czogW10sXG4gICAgICBjb25mbGljdHM6IFtdLFxuICAgICAgdG90YWxEdXJhdGlvbjogMCxcbiAgICAgIGVsZW1lbnRSZXN1bHRzOiBbXVxuICAgIH07XG5cbiAgICAvLyBHZXQgYWN0aXZhdGlvbiBvcmRlciBiYXNlZCBvbiBzdHJhdGVneVxuICAgIGNvbnN0IGFjdGl2YXRpb25PcmRlciA9IHRoaXMuZ2V0QWN0aXZhdGlvbk9yZGVyKCk7XG5cbiAgICAvLyBBY3RpdmF0ZSBlbGVtZW50cyBhY2NvcmRpbmcgdG8gc3RyYXRlZ3lcbiAgICBzd2l0Y2ggKHRoaXMubWV0YWRhdGEuYWN0aXZhdGlvblN0cmF0ZWd5KSB7XG4gICAgICBjYXNlICdzZXF1ZW50aWFsJzpcbiAgICAgICAgYXdhaXQgdGhpcy5hY3RpdmF0ZVNlcXVlbnRpYWwoXG4gICAgICAgICAgYWN0aXZhdGlvbk9yZGVyLFxuICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICBwb3J0Zm9saW9NYW5hZ2VyLFxuICAgICAgICAgIG1hbmFnZXJzLFxuICAgICAgICAgIG5lc3RpbmdEZXB0aFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnYWxsJzpcbiAgICAgICAgYXdhaXQgdGhpcy5hY3RpdmF0ZUFsbChcbiAgICAgICAgICBhY3RpdmF0aW9uT3JkZXIsXG4gICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgIHBvcnRmb2xpb01hbmFnZXIsXG4gICAgICAgICAgbWFuYWdlcnMsXG4gICAgICAgICAgbmVzdGluZ0RlcHRoXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdwcmlvcml0eSc6XG4gICAgICAgIGF3YWl0IHRoaXMuYWN0aXZhdGVQcmlvcml0eShcbiAgICAgICAgICBhY3RpdmF0aW9uT3JkZXIsXG4gICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgIHBvcnRmb2xpb01hbmFnZXIsXG4gICAgICAgICAgbWFuYWdlcnMsXG4gICAgICAgICAgbmVzdGluZ0RlcHRoXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdjb25kaXRpb25hbCc6XG4gICAgICAgIGF3YWl0IHRoaXMuYWN0aXZhdGVDb25kaXRpb25hbChcbiAgICAgICAgICBhY3RpdmF0aW9uT3JkZXIsXG4gICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgIHBvcnRmb2xpb01hbmFnZXIsXG4gICAgICAgICAgbWFuYWdlcnMsXG4gICAgICAgICAgbmVzdGluZ0RlcHRoXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdsYXp5JzpcbiAgICAgICAgLy8gTGF6eSBhY3RpdmF0aW9uIGhhcHBlbnMgb24tZGVtYW5kLCBqdXN0IG1hcmsgYXMgcmVhZHlcbiAgICAgICAgbG9nZ2VyLmluZm8oYEVuc2VtYmxlICR7dGhpcy5pZH0gcmVhZHkgZm9yIGxhenkgYWN0aXZhdGlvbmApO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICByZXN1bHQudG90YWxEdXJhdGlvbiA9IERhdGUubm93KCkgLSBzdGFydFRpbWU7XG4gICAgdGhpcy5sYXN0QWN0aXZhdGlvblJlc3VsdCA9IHJlc3VsdDtcbiAgICB0aGlzLmV4dGVuc2lvbnMhLmxhc3RBY3RpdmF0aW9uID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuXG4gICAgLy8gQ291bnQgbmVzdGVkIGVuc2VtYmxlcyBpbiByZXN1bHRzXG4gICAgY29uc3QgbmVzdGVkRW5zZW1ibGVDb3VudCA9IHJlc3VsdC5hY3RpdmF0ZWRFbGVtZW50cy5maWx0ZXIobmFtZSA9PiB7XG4gICAgICBjb25zdCBlbGVtID0gdGhpcy5maW5kRWxlbWVudEJ5TmFtZShuYW1lKTtcbiAgICAgIHJldHVybiBlbGVtPy5lbGVtZW50X3R5cGUgPT09ICdlbnNlbWJsZSc7XG4gICAgfSkubGVuZ3RoO1xuXG4gICAgLy8gVXBkYXRlIGFjdGl2YXRpb24gbWV0cmljcyB3aXRoIGFjdHVhbCBuZXN0aW5nIGRlcHRoXG4gICAgdGhpcy51cGRhdGVBY3RpdmF0aW9uTWV0cmljcyhyZXN1bHQsIG5lc3RpbmdEZXB0aCk7XG5cbiAgICAvLyBMb2cgYWN0aXZhdGlvbiByZXN1bHRcbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiAnRUxFTUVOVF9DUkVBVEVEJywgIC8vIEdlbmVyaWMgZWxlbWVudCBldmVudCAoZW5zZW1ibGVzIGRvbid0IGhhdmUgY3VzdG9tIHNlY3VyaXR5IGV2ZW50IHR5cGVzIHlldClcbiAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgIHNvdXJjZTogJ0Vuc2VtYmxlLmFjdGl2YXRlJyxcbiAgICAgIGRldGFpbHM6IGBFbnNlbWJsZSAke3RoaXMubWV0YWRhdGEubmFtZX0gYWN0aXZhdGVkOiAke3Jlc3VsdC5hY3RpdmF0ZWRFbGVtZW50cy5sZW5ndGh9IGVsZW1lbnRzLCAke3Jlc3VsdC5mYWlsZWRFbGVtZW50cy5sZW5ndGh9IGZhaWx1cmVzYCxcbiAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgIG5lc3RlZEVuc2VtYmxlczogbmVzdGVkRW5zZW1ibGVDb3VudCxcbiAgICAgICAgZHVyYXRpb246IHJlc3VsdC50b3RhbER1cmF0aW9uLFxuICAgICAgICBtZXRyaWNzOiB0aGlzLmdldEFjdGl2YXRpb25NZXRyaWNzKClcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFN0cnVjdHVyZWQgbG9nZ2luZzogQWN0aXZhdGlvbiBjb21wbGV0ZSB3aXRoIG1ldHJpY3NcbiAgICBpZiAocmVzdWx0LmZhaWxlZEVsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGxvZ2dlci53YXJuKCdFbnNlbWJsZSBhY3RpdmF0aW9uIGNvbXBsZXRlZCB3aXRoIGZhaWx1cmVzJywgdGhpcy5nZXRMb2dDb250ZXh0KHtcbiAgICAgICAgYWN0aXZhdGVkQ291bnQ6IHJlc3VsdC5hY3RpdmF0ZWRFbGVtZW50cy5sZW5ndGgsXG4gICAgICAgIGZhaWxlZENvdW50OiByZXN1bHQuZmFpbGVkRWxlbWVudHMubGVuZ3RoLFxuICAgICAgICBmYWlsZWRFbGVtZW50czogcmVzdWx0LmZhaWxlZEVsZW1lbnRzLFxuICAgICAgICBuZXN0ZWRFbnNlbWJsZXM6IG5lc3RlZEVuc2VtYmxlQ291bnQsXG4gICAgICAgIGR1cmF0aW9uOiByZXN1bHQudG90YWxEdXJhdGlvbixcbiAgICAgICAgbWV0cmljczogdGhpcy5nZXRBY3RpdmF0aW9uTWV0cmljcygpXG4gICAgICB9KSk7XG4gICAgICByZXN1bHQuc3VjY2VzcyA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2dnZXIuaW5mbygnRW5zZW1ibGUgYWN0aXZhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5JywgdGhpcy5nZXRMb2dDb250ZXh0KHtcbiAgICAgICAgYWN0aXZhdGVkQ291bnQ6IHJlc3VsdC5hY3RpdmF0ZWRFbGVtZW50cy5sZW5ndGgsXG4gICAgICAgIG5lc3RlZEVuc2VtYmxlczogbmVzdGVkRW5zZW1ibGVDb3VudCxcbiAgICAgICAgZHVyYXRpb246IHJlc3VsdC50b3RhbER1cmF0aW9uLFxuICAgICAgICBhdmVyYWdlRWxlbWVudFRpbWU6IHJlc3VsdC50b3RhbER1cmF0aW9uIC8gTWF0aC5tYXgocmVzdWx0LmFjdGl2YXRlZEVsZW1lbnRzLmxlbmd0aCwgMSksXG4gICAgICAgIG1ldHJpY3M6IHRoaXMuZ2V0QWN0aXZhdGlvbk1ldHJpY3MoKVxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogRGVhY3RpdmF0ZSB0aGUgZW5zZW1ibGUgYW5kIGFsbCBpdHMgZWxlbWVudHNcbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBhc3luYyBkZWFjdGl2YXRlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuX3N0YXR1cyA9IEVsZW1lbnRTdGF0dXMuSU5BQ1RJVkU7XG5cbiAgICAvLyBEZWFjdGl2YXRlIGFsbCBlbGVtZW50IGluc3RhbmNlc1xuICAgIGNvbnN0IGRlYWN0aXZhdGlvblByb21pc2VzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgW2VsZW1lbnROYW1lLCBpbnN0YW5jZV0gb2YgdGhpcy5lbGVtZW50SW5zdGFuY2VzKSB7XG4gICAgICBpZiAoaW5zdGFuY2UuZGVhY3RpdmF0ZSkge1xuICAgICAgICBkZWFjdGl2YXRpb25Qcm9taXNlcy5wdXNoKFxuICAgICAgICAgIGluc3RhbmNlLmRlYWN0aXZhdGUoKS5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBkZWFjdGl2YXRlIGVsZW1lbnQgJHtlbGVtZW50TmFtZX06YCwgZXJyb3IpO1xuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoZGVhY3RpdmF0aW9uUHJvbWlzZXMpO1xuXG4gICAgLy8gQ2xlYXIgc2hhcmVkIGNvbnRleHRcbiAgICB0aGlzLnNoYXJlZENvbnRleHQudmFsdWVzLmNsZWFyKCk7XG4gICAgdGhpcy5zaGFyZWRDb250ZXh0Lm93bmVycy5jbGVhcigpO1xuICAgIHRoaXMuc2hhcmVkQ29udGV4dC50aW1lc3RhbXBzLmNsZWFyKCk7XG5cbiAgICBsb2dnZXIuaW5mbyhgRW5zZW1ibGUgJHt0aGlzLmlkfSBkZWFjdGl2YXRlZGApO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHRoZSBlbnNlbWJsZSBjb25maWd1cmF0aW9uXG4gICAqIE92ZXJyaWRlcyBCYXNlRWxlbWVudC52YWxpZGF0ZSgpIHRvIGFkZCBlbnNlbWJsZS1zcGVjaWZpYyBjaGVja3NcbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSB2YWxpZGF0ZSgpOiBFbGVtZW50VmFsaWRhdGlvblJlc3VsdCB7XG4gICAgLy8gQ2FsbCBiYXNlIHZhbGlkYXRpb24gZmlyc3RcbiAgICBjb25zdCByZXN1bHQgPSBzdXBlci52YWxpZGF0ZSgpO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBhcnJheXMgaWYgdGhleSBkb24ndCBleGlzdFxuICAgIGlmICghcmVzdWx0LmVycm9ycykgcmVzdWx0LmVycm9ycyA9IFtdO1xuICAgIGlmICghcmVzdWx0Lndhcm5pbmdzKSByZXN1bHQud2FybmluZ3MgPSBbXTtcblxuICAgIC8vIENoZWNrIGZvciBjaXJjdWxhciBkZXBlbmRlbmNpZXNcbiAgICBjb25zdCBjaXJjdWxhciA9IHRoaXMuZGV0ZWN0QWxsQ2lyY3VsYXJEZXBlbmRlbmNpZXMoKTtcbiAgICBpZiAoY2lyY3VsYXIubGVuZ3RoID4gMCkge1xuICAgICAgZm9yIChjb25zdCBjeWNsZSBvZiBjaXJjdWxhcikge1xuICAgICAgICByZXN1bHQuZXJyb3JzLnB1c2goe1xuICAgICAgICAgIGZpZWxkOiAnZGVwZW5kZW5jaWVzJyxcbiAgICAgICAgICBtZXNzYWdlOiBjeWNsZS5tZXNzYWdlLFxuICAgICAgICAgIHNldmVyaXR5OiAnaGlnaCdcbiAgICAgICAgfSBhcyBWYWxpZGF0aW9uRXJyb3IpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGVsZW1lbnQgY291bnRcbiAgICBpZiAodGhpcy5lbGVtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJlc3VsdC53YXJuaW5ncy5wdXNoKHtcbiAgICAgICAgZmllbGQ6ICdlbGVtZW50cycsXG4gICAgICAgIG1lc3NhZ2U6ICdFbnNlbWJsZSBoYXMgbm8gZWxlbWVudHMnLFxuICAgICAgICBzdWdnZXN0aW9uOiAnQWRkIGVsZW1lbnRzIHVzaW5nIGFkZEVsZW1lbnQoKScsXG4gICAgICAgIHNldmVyaXR5OiAnbG93J1xuICAgICAgfSBhcyBWYWxpZGF0aW9uV2FybmluZyk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIG9ycGhhbmVkIGRlcGVuZGVuY2llc1xuICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiB0aGlzLmVsZW1lbnRzKSB7XG4gICAgICBpZiAoZWxlbWVudC5kZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBkZXAgb2YgZWxlbWVudC5kZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgICBpZiAoIXRoaXMuaGFzRWxlbWVudChkZXApKSB7XG4gICAgICAgICAgICByZXN1bHQuZXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgICBmaWVsZDogYCR7ZWxlbWVudC5lbGVtZW50X25hbWV9LmRlcGVuZGVuY2llc2AsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6IGBEZXBlbmRlbmN5ICcke2RlcH0nIG5vdCBmb3VuZCBpbiBlbnNlbWJsZWAsXG4gICAgICAgICAgICAgIHNldmVyaXR5OiAnbWVkaXVtJ1xuICAgICAgICAgICAgfSBhcyBWYWxpZGF0aW9uRXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFVwZGF0ZSB2YWxpZCBmbGFnIGJhc2VkIG9uIGVycm9yc1xuICAgIHJlc3VsdC52YWxpZCA9IHJlc3VsdC5lcnJvcnMubGVuZ3RoID09PSAwO1xuXG4gICAgLy8gQ2xlYW4gdXAgZW1wdHkgYXJyYXlzXG4gICAgaWYgKHJlc3VsdC5lcnJvcnMubGVuZ3RoID09PSAwKSByZXN1bHQuZXJyb3JzID0gdW5kZWZpbmVkO1xuICAgIGlmIChyZXN1bHQud2FybmluZ3MubGVuZ3RoID09PSAwKSByZXN1bHQud2FybmluZ3MgPSB1bmRlZmluZWQ7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT0gUFJJVkFURSBNRVRIT0RTID09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIERldGVybWluZSBhY3RpdmF0aW9uIG9yZGVyIGJhc2VkIG9uIHN0cmF0ZWd5XG4gICAqL1xuICBwcml2YXRlIGdldEFjdGl2YXRpb25PcmRlcigpOiBzdHJpbmdbXSB7XG4gICAgc3dpdGNoICh0aGlzLm1ldGFkYXRhLmFjdGl2YXRpb25TdHJhdGVneSkge1xuICAgICAgY2FzZSAnc2VxdWVudGlhbCc6XG4gICAgICAgIC8vIFRvcG9sb2dpY2FsIHNvcnQgYmFzZWQgb24gZGVwZW5kZW5jaWVzXG4gICAgICAgIHJldHVybiB0aGlzLnRvcG9sb2dpY2FsU29ydCgpO1xuXG4gICAgICBjYXNlICdwcmlvcml0eSc6IHtcbiAgICAgICAgLy8gU29ydCBieSBwcmlvcml0eSAoaGlnaGVzdCBmaXJzdClcbiAgICAgICAgY29uc3QgcHJpb3JpdHlTb3J0ZWQgPSBbLi4udGhpcy5lbGVtZW50c11cbiAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYi5wcmlvcml0eSAtIGEucHJpb3JpdHkpO1xuICAgICAgICByZXR1cm4gcHJpb3JpdHlTb3J0ZWQubWFwKGVsID0+IGVsLmVsZW1lbnRfbmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ2FsbCc6XG4gICAgICBjYXNlICdjb25kaXRpb25hbCc6XG4gICAgICBjYXNlICdsYXp5JzpcbiAgICAgICAgLy8gQWxsIGVsZW1lbnRzLCBuYXR1cmFsIG9yZGVyXG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRzLm1hcChlbCA9PiBlbC5lbGVtZW50X25hbWUpO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50cy5tYXAoZWwgPT4gZWwuZWxlbWVudF9uYW1lKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVG9wb2xvZ2ljYWwgc29ydCBmb3IgZGVwZW5kZW5jeS1iYXNlZCBhY3RpdmF0aW9uIG9yZGVyXG4gICAqL1xuICBwcml2YXRlIHRvcG9sb2dpY2FsU29ydCgpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgdmlzaXRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGNvbnN0IG9yZGVyOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgY29uc3QgdmlzaXQgPSAoZWxlbWVudE5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKHZpc2l0ZWQuaGFzKGVsZW1lbnROYW1lKSkgcmV0dXJuO1xuICAgICAgdmlzaXRlZC5hZGQoZWxlbWVudE5hbWUpO1xuXG4gICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5maW5kRWxlbWVudEJ5TmFtZShlbGVtZW50TmFtZSk7XG4gICAgICBpZiAoZWxlbWVudD8uZGVwZW5kZW5jaWVzKSB7XG4gICAgICAgIGZvciAoY29uc3QgZGVwIG9mIGVsZW1lbnQuZGVwZW5kZW5jaWVzKSB7XG4gICAgICAgICAgaWYgKHRoaXMuaGFzRWxlbWVudChkZXApKSB7XG4gICAgICAgICAgICB2aXNpdChkZXApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBvcmRlci5wdXNoKGVsZW1lbnROYW1lKTtcbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCBlbGVtZW50IG9mIHRoaXMuZWxlbWVudHMpIHtcbiAgICAgIHZpc2l0KGVsZW1lbnQuZWxlbWVudF9uYW1lKTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3JkZXI7XG4gIH1cblxuICAvKipcbiAgICogQWN0aXZhdGUgZWxlbWVudHMgc2VxdWVudGlhbGx5IGluIGRlcGVuZGVuY3kgb3JkZXJcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYWN0aXZhdGVTZXF1ZW50aWFsKFxuICAgIG9yZGVyOiBzdHJpbmdbXSxcbiAgICByZXN1bHQ6IEVuc2VtYmxlQWN0aXZhdGlvblJlc3VsdCxcbiAgICBwb3J0Zm9saW9NYW5hZ2VyOiBQb3J0Zm9saW9NYW5hZ2VyLFxuICAgIG1hbmFnZXJzOiBpbXBvcnQoJy4vdHlwZXMuanMnKS5FbGVtZW50TWFuYWdlcnMsXG4gICAgbmVzdGluZ0RlcHRoOiBudW1iZXJcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgZm9yIChjb25zdCBlbGVtZW50TmFtZSBvZiBvcmRlcikge1xuICAgICAgYXdhaXQgdGhpcy5hY3RpdmF0ZVNpbmdsZUVsZW1lbnQoZWxlbWVudE5hbWUsIHJlc3VsdCwgcG9ydGZvbGlvTWFuYWdlciwgbWFuYWdlcnMsIG5lc3RpbmdEZXB0aCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFjdGl2YXRlIGFsbCBlbGVtZW50cyBzaW11bHRhbmVvdXNseVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBhY3RpdmF0ZUFsbChcbiAgICBvcmRlcjogc3RyaW5nW10sXG4gICAgcmVzdWx0OiBFbnNlbWJsZUFjdGl2YXRpb25SZXN1bHQsXG4gICAgcG9ydGZvbGlvTWFuYWdlcjogUG9ydGZvbGlvTWFuYWdlcixcbiAgICBtYW5hZ2VyczogaW1wb3J0KCcuL3R5cGVzLmpzJykuRWxlbWVudE1hbmFnZXJzLFxuICAgIG5lc3RpbmdEZXB0aDogbnVtYmVyXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGFjdGl2YXRpb25Qcm9taXNlcyA9IG9yZGVyLm1hcChlbGVtZW50TmFtZSA9PlxuICAgICAgdGhpcy5hY3RpdmF0ZVNpbmdsZUVsZW1lbnQoZWxlbWVudE5hbWUsIHJlc3VsdCwgcG9ydGZvbGlvTWFuYWdlciwgbWFuYWdlcnMsIG5lc3RpbmdEZXB0aClcbiAgICApO1xuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoYWN0aXZhdGlvblByb21pc2VzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY3RpdmF0ZSBlbGVtZW50cyBieSBwcmlvcml0eSAoaGlnaGVzdCBmaXJzdClcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYWN0aXZhdGVQcmlvcml0eShcbiAgICBvcmRlcjogc3RyaW5nW10sXG4gICAgcmVzdWx0OiBFbnNlbWJsZUFjdGl2YXRpb25SZXN1bHQsXG4gICAgcG9ydGZvbGlvTWFuYWdlcjogUG9ydGZvbGlvTWFuYWdlcixcbiAgICBtYW5hZ2VyczogaW1wb3J0KCcuL3R5cGVzLmpzJykuRWxlbWVudE1hbmFnZXJzLFxuICAgIG5lc3RpbmdEZXB0aDogbnVtYmVyXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIG9yZGVyIGlzIGFscmVhZHkgc29ydGVkIGJ5IHByaW9yaXR5IGZyb20gZ2V0QWN0aXZhdGlvbk9yZGVyKClcbiAgICBmb3IgKGNvbnN0IGVsZW1lbnROYW1lIG9mIG9yZGVyKSB7XG4gICAgICBhd2FpdCB0aGlzLmFjdGl2YXRlU2luZ2xlRWxlbWVudChlbGVtZW50TmFtZSwgcmVzdWx0LCBwb3J0Zm9saW9NYW5hZ2VyLCBtYW5hZ2VycywgbmVzdGluZ0RlcHRoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWN0aXZhdGUgZWxlbWVudHMgYmFzZWQgb24gY29uZGl0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBhY3RpdmF0ZUNvbmRpdGlvbmFsKFxuICAgIG9yZGVyOiBzdHJpbmdbXSxcbiAgICByZXN1bHQ6IEVuc2VtYmxlQWN0aXZhdGlvblJlc3VsdCxcbiAgICBwb3J0Zm9saW9NYW5hZ2VyOiBQb3J0Zm9saW9NYW5hZ2VyLFxuICAgIG1hbmFnZXJzOiBpbXBvcnQoJy4vdHlwZXMuanMnKS5FbGVtZW50TWFuYWdlcnMsXG4gICAgbmVzdGluZ0RlcHRoOiBudW1iZXJcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nZ2VyLndhcm4oXG4gICAgICBgQ29uZGl0aW9uYWwgYWN0aXZhdGlvbiBzdHJhdGVneSBzZWxlY3RlZCwgYnV0IGNvbmRpdGlvbiBldmFsdWF0aW9uIGAgK1xuICAgICAgYGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQuIEFsbCBjb25kaXRpb25hbCBlbGVtZW50cyB3aWxsIGJlIGFjdGl2YXRlZC5gXG4gICAgKTtcblxuICAgIC8vIFRyYWNrIGFjdGl2YXRpb24gc3RhcnQgdGltZSBmb3IgY29udGV4dCBidWlsZGluZ1xuICAgIGNvbnN0IGFjdGl2YXRpb25TdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuXG4gICAgZm9yIChjb25zdCBlbGVtZW50TmFtZSBvZiBvcmRlcikge1xuICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZmluZEVsZW1lbnRCeU5hbWUoZWxlbWVudE5hbWUpITtcblxuICAgICAgLy8gRGV0ZXJtaW5lIGlmIGVsZW1lbnQgc2hvdWxkIGJlIGFjdGl2YXRlZFxuICAgICAgbGV0IHNob3VsZEFjdGl2YXRlID0gZmFsc2U7XG5cbiAgICAgIGlmIChlbGVtZW50LmFjdGl2YXRpb24gPT09ICdhbHdheXMnKSB7XG4gICAgICAgIC8vIEFsd2F5cyBhY3RpdmF0ZSBlbGVtZW50cyB3aXRoICdhbHdheXMnIG1vZGVcbiAgICAgICAgc2hvdWxkQWN0aXZhdGUgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChlbGVtZW50LmFjdGl2YXRpb24gPT09ICdjb25kaXRpb25hbCcgJiYgZWxlbWVudC5jb25kaXRpb24pIHtcbiAgICAgICAgLy8gRXZhbHVhdGUgY29uZGl0aW9uIGZvciBjb25kaXRpb25hbCBlbGVtZW50c1xuICAgICAgICBzaG91bGRBY3RpdmF0ZSA9IHRoaXMuZXZhbHVhdGVDb25kaXRpb24oXG4gICAgICAgICAgZWxlbWVudC5jb25kaXRpb24sXG4gICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICBhY3RpdmF0aW9uU3RhcnRUaW1lLFxuICAgICAgICAgIHJlc3VsdFxuICAgICAgICApO1xuICAgICAgICBpZiAoIXNob3VsZEFjdGl2YXRlKSB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKGBTa2lwcGluZyAke2VsZW1lbnROYW1lfTogY29uZGl0aW9uIG5vdCBtZXRgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChlbGVtZW50LmFjdGl2YXRpb24gPT09ICdjb25kaXRpb25hbCcgJiYgIWVsZW1lbnQuY29uZGl0aW9uKSB7XG4gICAgICAgIC8vIENvbmRpdGlvbmFsIGVsZW1lbnRzIHdpdGhvdXQgYSBjb25kaXRpb24gZGVmYXVsdCB0byBhY3RpdmF0ZWRcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGAke2VsZW1lbnROYW1lfTogY29uZGl0aW9uYWwgYWN0aXZhdGlvbiB3aXRob3V0IGNvbmRpdGlvbiwgZGVmYXVsdGluZyB0byB0cnVlYCk7XG4gICAgICAgIHNob3VsZEFjdGl2YXRlID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5hY3RpdmF0aW9uID09PSAnb24tZGVtYW5kJykge1xuICAgICAgICAvLyBPbi1kZW1hbmQgZWxlbWVudHMgYXJlIG5vdCBhY3RpdmF0ZWQgYXV0b21hdGljYWxseSBpbiBjb25kaXRpb25hbCBzdHJhdGVneVxuICAgICAgICBsb2dnZXIuZGVidWcoYFNraXBwaW5nICR7ZWxlbWVudE5hbWV9OiBvbi1kZW1hbmQgYWN0aXZhdGlvbiBtb2RlYCk7XG4gICAgICAgIHNob3VsZEFjdGl2YXRlID0gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBEZWZhdWx0IGJlaGF2aW9yIGZvciB1bnNwZWNpZmllZCBhY3RpdmF0aW9uIG1vZGVcbiAgICAgICAgc2hvdWxkQWN0aXZhdGUgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2hvdWxkQWN0aXZhdGUpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5hY3RpdmF0ZVNpbmdsZUVsZW1lbnQoZWxlbWVudE5hbWUsIHJlc3VsdCwgcG9ydGZvbGlvTWFuYWdlciwgbWFuYWdlcnMsIG5lc3RpbmdEZXB0aCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFjdGl2YXRlIGEgc2luZ2xlIGVsZW1lbnQgYW5kIHRyYWNrIHJlc3VsdHNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYWN0aXZhdGVTaW5nbGVFbGVtZW50KFxuICAgIGVsZW1lbnROYW1lOiBzdHJpbmcsXG4gICAgcmVzdWx0OiBFbnNlbWJsZUFjdGl2YXRpb25SZXN1bHQsXG4gICAgcG9ydGZvbGlvTWFuYWdlcjogUG9ydGZvbGlvTWFuYWdlcixcbiAgICBtYW5hZ2VyczogaW1wb3J0KCcuL3R5cGVzLmpzJykuRWxlbWVudE1hbmFnZXJzLFxuICAgIG5lc3RpbmdEZXB0aDogbnVtYmVyXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgY29uc3QgZWxlbWVudENvbmZpZyA9IHRoaXMuZmluZEVsZW1lbnRCeU5hbWUoZWxlbWVudE5hbWUpITtcbiAgICBjb25zdCBpc05lc3RlZEVuc2VtYmxlID0gZWxlbWVudENvbmZpZy5lbGVtZW50X3R5cGUgPT09ICdlbnNlbWJsZSc7XG5cbiAgICB0cnkge1xuICAgICAgLy8gTG9hZCBlbGVtZW50IGluc3RhbmNlIGlmIG5vdCBhbHJlYWR5IGxvYWRlZFxuICAgICAgaWYgKCF0aGlzLmVsZW1lbnRJbnN0YW5jZXMuaGFzKGVsZW1lbnROYW1lKSkge1xuICAgICAgICBjb25zdCBpbnN0YW5jZSA9IGF3YWl0IHRoaXMubG9hZEVsZW1lbnRJbnN0YW5jZShlbGVtZW50Q29uZmlnLCBwb3J0Zm9saW9NYW5hZ2VyLCBtYW5hZ2Vycyk7XG4gICAgICAgIHRoaXMuZWxlbWVudEluc3RhbmNlcy5zZXQoZWxlbWVudE5hbWUsIGluc3RhbmNlKTtcbiAgICAgICAgdGhpcy5pbnN0YW5jZUFjY2Vzc1RpbWVzLnNldChlbGVtZW50TmFtZSwgRGF0ZS5ub3coKSk7XG5cbiAgICAgICAgLy8gRXZpY3QgaWYgY2FjaGUgaXMgdG9vIGxhcmdlXG4gICAgICAgIHRoaXMuZXZpY3RPbGRlc3RJbnN0YW5jZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVXBkYXRlIGFjY2VzcyB0aW1lXG4gICAgICAgIHRoaXMuaW5zdGFuY2VBY2Nlc3NUaW1lcy5zZXQoZWxlbWVudE5hbWUsIERhdGUubm93KCkpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBpbnN0YW5jZSA9IHRoaXMuZWxlbWVudEluc3RhbmNlcy5nZXQoZWxlbWVudE5hbWUpITtcblxuICAgICAgLy8gQWN0aXZhdGUgZWxlbWVudCBpZiBpdCBoYXMgYWN0aXZhdGUgbWV0aG9kXG4gICAgICBpZiAoaW5zdGFuY2UuYWN0aXZhdGUpIHtcbiAgICAgICAgYXdhaXQgaW5zdGFuY2UuYWN0aXZhdGUoKTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgdGhpcyBpcyBhIG5lc3RlZCBlbnNlbWJsZSwgY2FsbCBhY3RpdmF0ZUVuc2VtYmxlIHdpdGggaW5jcmVtZW50ZWQgZGVwdGhcbiAgICAgIGlmIChpc05lc3RlZEVuc2VtYmxlICYmICdhY3RpdmF0ZUVuc2VtYmxlJyBpbiBpbnN0YW5jZSAmJiB0eXBlb2YgaW5zdGFuY2UuYWN0aXZhdGVFbnNlbWJsZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBhd2FpdCAoaW5zdGFuY2UgYXMgYW55KS5hY3RpdmF0ZUVuc2VtYmxlKHBvcnRmb2xpb01hbmFnZXIsIG1hbmFnZXJzLCBuZXN0aW5nRGVwdGggKyAxKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZHVyYXRpb24gPSBEYXRlLm5vdygpIC0gc3RhcnRUaW1lO1xuICAgICAgcmVzdWx0LmFjdGl2YXRlZEVsZW1lbnRzLnB1c2goZWxlbWVudE5hbWUpO1xuICAgICAgcmVzdWx0LmVsZW1lbnRSZXN1bHRzLnB1c2goe1xuICAgICAgICBlbGVtZW50TmFtZSxcbiAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgZHVyYXRpb24sXG4gICAgICAgIGlzTmVzdGVkRW5zZW1ibGUsXG4gICAgICAgIG5lc3RpbmdEZXB0aDogaXNOZXN0ZWRFbnNlbWJsZSA/IG5lc3RpbmdEZXB0aCArIDEgOiBuZXN0aW5nRGVwdGhcbiAgICAgIH0pO1xuXG4gICAgICBsb2dnZXIuZGVidWcoYEVsZW1lbnQgJHtlbGVtZW50TmFtZX0gYWN0aXZhdGVkIGluICR7ZHVyYXRpb259bXNgLCB7XG4gICAgICAgIGlzTmVzdGVkRW5zZW1ibGUsXG4gICAgICAgIG5lc3RpbmdEZXB0aDogaXNOZXN0ZWRFbnNlbWJsZSA/IG5lc3RpbmdEZXB0aCArIDEgOiBuZXN0aW5nRGVwdGhcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBkdXJhdGlvbiA9IERhdGUubm93KCkgLSBzdGFydFRpbWU7XG4gICAgICByZXN1bHQuZmFpbGVkRWxlbWVudHMucHVzaChlbGVtZW50TmFtZSk7XG4gICAgICByZXN1bHQuZWxlbWVudFJlc3VsdHMucHVzaCh7XG4gICAgICAgIGVsZW1lbnROYW1lLFxuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgZHVyYXRpb24sXG4gICAgICAgIGVycm9yOiBlcnJvciBhcyBFcnJvcixcbiAgICAgICAgaXNOZXN0ZWRFbnNlbWJsZSxcbiAgICAgICAgbmVzdGluZ0RlcHRoOiBpc05lc3RlZEVuc2VtYmxlID8gbmVzdGluZ0RlcHRoICsgMSA6IG5lc3RpbmdEZXB0aFxuICAgICAgfSk7XG5cbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGFjdGl2YXRlIGVsZW1lbnQgJHtlbGVtZW50TmFtZX06YCwgZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIGFuIGVsZW1lbnQgaW5zdGFuY2UgZnJvbSBwb3J0Zm9saW9cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbG9hZEVsZW1lbnRJbnN0YW5jZShcbiAgICBlbGVtZW50OiBFbnNlbWJsZUVsZW1lbnQsXG4gICAgcG9ydGZvbGlvTWFuYWdlcjogUG9ydGZvbGlvTWFuYWdlcixcbiAgICBtYW5hZ2VyczogaW1wb3J0KCcuL3R5cGVzLmpzJykuRWxlbWVudE1hbmFnZXJzXG4gICk6IFByb21pc2U8SUVsZW1lbnQ+IHtcbiAgICBjb25zdCBlbGVtZW50VHlwZSA9IGVsZW1lbnQuZWxlbWVudF90eXBlLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgaXNOZXN0ZWRFbnNlbWJsZSA9IGVsZW1lbnRUeXBlID09PSAnZW5zZW1ibGUnIHx8IGVsZW1lbnRUeXBlID09PSAnZW5zZW1ibGVzJztcblxuICAgIC8vIFN0cnVjdHVyZWQgbG9nZ2luZzogRWxlbWVudCBsb2FkaW5nIHdpdGggbmVzdGluZyBkZXRlY3Rpb25cbiAgICBsb2dnZXIuZGVidWcoJ0xvYWRpbmcgZWxlbWVudCBmb3IgZW5zZW1ibGUnLCB0aGlzLmdldExvZ0NvbnRleHQoe1xuICAgICAgZWxlbWVudE5hbWU6IGVsZW1lbnQuZWxlbWVudF9uYW1lLFxuICAgICAgZWxlbWVudFR5cGU6IGVsZW1lbnRUeXBlLFxuICAgICAgaXNOZXN0ZWRFbnNlbWJsZSxcbiAgICAgIHJvbGU6IGVsZW1lbnQucm9sZSxcbiAgICAgIHByaW9yaXR5OiBlbGVtZW50LnByaW9yaXR5XG4gICAgfSkpO1xuXG4gICAgY29uc3Qgbm9ybWFsaXplZFR5cGUgPSB0aGlzLm5vcm1hbGl6ZUVsZW1lbnRUeXBlKGVsZW1lbnRUeXBlKTtcbiAgICBjb25zdCBtYW5hZ2VyID0gdGhpcy5nZXRNYW5hZ2VyRm9yVHlwZShub3JtYWxpemVkVHlwZSwgbWFuYWdlcnMpO1xuXG4gICAgaWYgKCFtYW5hZ2VyKSB7XG4gICAgICBjb25zdCBlbnNlbWJsZUNvbnRleHQgPSBgaW4gZW5zZW1ibGUgXCIke3RoaXMubWV0YWRhdGEubmFtZX1cIiAoJHt0aGlzLmlkfSlgO1xuICAgICAgY29uc3QgbmVzdGVkSGludCA9IG5vcm1hbGl6ZWRUeXBlID09PSAnZW5zZW1ibGUnXG4gICAgICAgID8gJ1xcbiAg4oaSIEZvciBuZXN0ZWQgZW5zZW1ibGVzLCBlbnN1cmUgRW5zZW1ibGVNYW5hZ2VyIGlzIHByb3ZpZGVkIGluIG1hbmFnZXJzIHBhcmFtZXRlcidcbiAgICAgICAgOiAnJztcblxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRmFpbGVkIHRvIGxvYWQgZWxlbWVudCBcIiR7ZWxlbWVudC5lbGVtZW50X25hbWV9XCIgb2YgdHlwZSBcIiR7bm9ybWFsaXplZFR5cGV9XCIgJHtlbnNlbWJsZUNvbnRleHR9LlxcbmAgK1xuICAgICAgICBgICBSZWFzb246IE5vIG1hbmFnZXIgYXZhaWxhYmxlIGZvciBlbGVtZW50IHR5cGUgXCIke25vcm1hbGl6ZWRUeXBlfVwiLlxcbmAgK1xuICAgICAgICBgICBBdmFpbGFibGUgbWFuYWdlcnM6ICR7dGhpcy5nZXRBdmFpbGFibGVNYW5hZ2VyVHlwZXMobWFuYWdlcnMpLmpvaW4oJywgJyl9JHtuZXN0ZWRIaW50fWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZmluZEVsZW1lbnRJbk1hbmFnZXIobWFuYWdlciwgZWxlbWVudC5lbGVtZW50X25hbWUsIG5vcm1hbGl6ZWRUeXBlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3JtYWxpemUgZWxlbWVudCB0eXBlIHRvIHNpbmd1bGFyIGZvcm1cbiAgICovXG4gIHByaXZhdGUgbm9ybWFsaXplRWxlbWVudFR5cGUodHlwZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCB0eXBlTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgJ3NraWxscyc6ICdza2lsbCcsXG4gICAgICAndGVtcGxhdGVzJzogJ3RlbXBsYXRlJyxcbiAgICAgICdhZ2VudHMnOiAnYWdlbnQnLFxuICAgICAgJ21lbW9yaWVzJzogJ21lbW9yeScsXG4gICAgICAncGVyc29uYXMnOiAncGVyc29uYScsXG4gICAgICAnZW5zZW1ibGVzJzogJ2Vuc2VtYmxlJ1xuICAgIH07XG5cbiAgICByZXR1cm4gdHlwZU1hcFt0eXBlXSB8fCB0eXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgYXBwcm9wcmlhdGUgbWFuYWdlciBmb3IgYW4gZWxlbWVudCB0eXBlXG4gICAqL1xuICBwcml2YXRlIGdldE1hbmFnZXJGb3JUeXBlKFxuICAgIHR5cGU6IHN0cmluZyxcbiAgICBtYW5hZ2VyczogaW1wb3J0KCcuL3R5cGVzLmpzJykuRWxlbWVudE1hbmFnZXJzXG4gICk6IGFueSB7XG4gICAgY29uc3QgbWFuYWdlck1hcDogUmVjb3JkPHN0cmluZywgYW55PiA9IHtcbiAgICAgICdza2lsbCc6IG1hbmFnZXJzLnNraWxsTWFuYWdlcixcbiAgICAgICd0ZW1wbGF0ZSc6IG1hbmFnZXJzLnRlbXBsYXRlTWFuYWdlcixcbiAgICAgICdhZ2VudCc6IG1hbmFnZXJzLmFnZW50TWFuYWdlcixcbiAgICAgICdtZW1vcnknOiBtYW5hZ2Vycy5tZW1vcnlNYW5hZ2VyLFxuICAgICAgJ3BlcnNvbmEnOiBtYW5hZ2Vycy5wZXJzb25hTWFuYWdlcixcbiAgICAgICdlbnNlbWJsZSc6IG1hbmFnZXJzLmVuc2VtYmxlTWFuYWdlclxuICAgIH07XG5cbiAgICByZXR1cm4gbWFuYWdlck1hcFt0eXBlXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbGlzdCBvZiBhdmFpbGFibGUgbWFuYWdlciB0eXBlc1xuICAgKi9cbiAgcHJpdmF0ZSBnZXRBdmFpbGFibGVNYW5hZ2VyVHlwZXMobWFuYWdlcnM6IGltcG9ydCgnLi90eXBlcy5qcycpLkVsZW1lbnRNYW5hZ2Vycyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBhdmFpbGFibGVUeXBlczogc3RyaW5nW10gPSBbXTtcblxuICAgIGlmIChtYW5hZ2Vycy5za2lsbE1hbmFnZXIpIGF2YWlsYWJsZVR5cGVzLnB1c2goJ3NraWxsJyk7XG4gICAgaWYgKG1hbmFnZXJzLnRlbXBsYXRlTWFuYWdlcikgYXZhaWxhYmxlVHlwZXMucHVzaCgndGVtcGxhdGUnKTtcbiAgICBpZiAobWFuYWdlcnMuYWdlbnRNYW5hZ2VyKSBhdmFpbGFibGVUeXBlcy5wdXNoKCdhZ2VudCcpO1xuICAgIGlmIChtYW5hZ2Vycy5tZW1vcnlNYW5hZ2VyKSBhdmFpbGFibGVUeXBlcy5wdXNoKCdtZW1vcnknKTtcbiAgICBpZiAobWFuYWdlcnMucGVyc29uYU1hbmFnZXIpIGF2YWlsYWJsZVR5cGVzLnB1c2goJ3BlcnNvbmEnKTtcbiAgICBpZiAobWFuYWdlcnMuZW5zZW1ibGVNYW5hZ2VyKSBhdmFpbGFibGVUeXBlcy5wdXNoKCdlbnNlbWJsZScpO1xuXG4gICAgcmV0dXJuIGF2YWlsYWJsZVR5cGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYW4gZWxlbWVudCBpbiB0aGUgbWFuYWdlciB1c2luZyBmdXp6eSBuYW1lIG1hdGNoaW5nXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZpbmRFbGVtZW50SW5NYW5hZ2VyKFxuICAgIG1hbmFnZXI6IGFueSxcbiAgICBlbGVtZW50TmFtZTogc3RyaW5nLFxuICAgIGVsZW1lbnRUeXBlOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxJRWxlbWVudD4ge1xuICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIFBlcnNvbmFNYW5hZ2VyIHdoaWNoIGhhcyBmaW5kUGVyc29uYSBtZXRob2RcbiAgICBpZiAoZWxlbWVudFR5cGUgPT09ICdwZXJzb25hJyAmJiBtYW5hZ2VyLmZpbmRQZXJzb25hKSB7XG4gICAgICBjb25zdCBwZXJzb25hID0gbWFuYWdlci5maW5kUGVyc29uYShlbGVtZW50TmFtZSk7XG4gICAgICBpZiAoIXBlcnNvbmEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMuY2FwaXRhbGl6ZUZpcnN0KGVsZW1lbnRUeXBlKX0gJyR7ZWxlbWVudE5hbWV9JyBub3QgZm91bmRgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwZXJzb25hIGFzIGFueTtcbiAgICB9XG5cbiAgICAvLyBTdGFuZGFyZCBoYW5kbGluZyBmb3Igb3RoZXIgbWFuYWdlcnMgd2l0aCBsaXN0KCkgbWV0aG9kXG4gICAgY29uc3QgZWxlbWVudHMgPSBhd2FpdCBtYW5hZ2VyLmxpc3QoKTtcbiAgICBjb25zdCBmb3VuZEVsZW1lbnQgPSBlbGVtZW50cy5maW5kKChlbDogYW55KSA9PlxuICAgICAgdGhpcy5tYXRjaGVzRWxlbWVudE5hbWUoZWwubWV0YWRhdGEubmFtZSwgZWxlbWVudE5hbWUpXG4gICAgKTtcblxuICAgIGlmICghZm91bmRFbGVtZW50KSB7XG4gICAgICBjb25zdCBhdmFpbGFibGVOYW1lcyA9IGVsZW1lbnRzLm1hcCgoZWw6IGFueSkgPT4gZWwubWV0YWRhdGEubmFtZSkuam9pbignLCAnKTtcbiAgICAgIGNvbnN0IGVuc2VtYmxlQ29udGV4dCA9IGBpbiBlbnNlbWJsZSBcIiR7dGhpcy5tZXRhZGF0YS5uYW1lfVwiYDtcbiAgICAgIGNvbnN0IG5lc3RlZEhpbnQgPSBlbGVtZW50VHlwZSA9PT0gJ2Vuc2VtYmxlJ1xuICAgICAgICA/IGBcXG4gIOKGkiBUaXA6IE5lc3RlZCBlbnNlbWJsZXMgbXVzdCBleGlzdCBpbiB0aGUgcG9ydGZvbGlvIGJlZm9yZSBiZWluZyByZWZlcmVuY2VkLmBcbiAgICAgICAgOiAnJztcblxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgJHt0aGlzLmNhcGl0YWxpemVGaXJzdChlbGVtZW50VHlwZSl9IFwiJHtlbGVtZW50TmFtZX1cIiBub3QgZm91bmQgJHtlbnNlbWJsZUNvbnRleHR9LlxcbmAgK1xuICAgICAgICBgICBBdmFpbGFibGUgJHtlbGVtZW50VHlwZX1zOiAke2F2YWlsYWJsZU5hbWVzIHx8ICcobm9uZSknfSR7bmVzdGVkSGludH1gXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBmb3VuZEVsZW1lbnQ7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgZWxlbWVudCBuYW1lIG1hdGNoZXMgdGFyZ2V0IHVzaW5nIGZ1enp5IG1hdGNoaW5nXG4gICAqIEhhbmRsZXMgZXhhY3QgbWF0Y2gsIHNsdWdpZmllZCBtYXRjaCwgYW5kIGJpZGlyZWN0aW9uYWwgc2x1ZyBtYXRjaGluZ1xuICAgKlxuICAgKiBTRUNVUklUWTogTm9ybWFsaXplcyBVbmljb2RlIHRvIHByZXZlbnQgY29tcG9zZWQgdnMgZGVjb21wb3NlZCBjaGFyYWN0ZXIgbWlzbWF0Y2hlcy5cbiAgICogVGhpcyBpcyBkZWZlbnNlLWluLWRlcHRoOyBlbGVtZW50IG5hbWVzIGFyZSBhbHJlYWR5IHZhbGlkYXRlZCBieSBFTEVNRU5UX05BTUVfUEFUVEVSTlxuICAgKiB3aGljaCBibG9ja3Mgbm9uLUFTQ0lJIGNoYXJhY3RlcnMuXG4gICAqXG4gICAqIEBwYXJhbSBhY3R1YWxOYW1lIC0gTmFtZSBmcm9tIGVsZW1lbnQgbWFuYWdlciAoZmlsZXN5c3RlbSlcbiAgICogQHBhcmFtIHRhcmdldE5hbWUgLSBOYW1lIGZyb20gZW5zZW1ibGUgY29uZmlndXJhdGlvbiAodXNlciBpbnB1dClcbiAgICogQHJldHVybnMgdHJ1ZSBpZiBuYW1lcyBtYXRjaCBleGFjdGx5IG9yIGFmdGVyIHNsdWdpZmljYXRpb25cbiAgICovXG4gIHByaXZhdGUgbWF0Y2hlc0VsZW1lbnROYW1lKGFjdHVhbE5hbWU6IHN0cmluZywgdGFyZ2V0TmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgLy8gTm9ybWFsaXplIFVuaWNvZGUgdG8gaGFuZGxlIGNvbXBvc2VkIHZzIGRlY29tcG9zZWQgY2hhcmFjdGVycyAoZGVmZW5zZS1pbi1kZXB0aClcbiAgICBjb25zdCBub3JtYWxpemVkQWN0dWFsID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUoYWN0dWFsTmFtZSkubm9ybWFsaXplZENvbnRlbnQ7XG4gICAgY29uc3Qgbm9ybWFsaXplZFRhcmdldCA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKHRhcmdldE5hbWUpLm5vcm1hbGl6ZWRDb250ZW50O1xuXG4gICAgY29uc3QgZXhhY3RNYXRjaCA9IG5vcm1hbGl6ZWRBY3R1YWwgPT09IG5vcm1hbGl6ZWRUYXJnZXQ7XG4gICAgY29uc3Qgc2x1Z2lmaWVkTWF0Y2ggPSBub3JtYWxpemVkQWN0dWFsLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXFxzKy9nLCAnLScpID09PSBub3JtYWxpemVkVGFyZ2V0O1xuICAgIGNvbnN0IHJldmVyc2VNYXRjaCA9IG5vcm1hbGl6ZWRUYXJnZXQudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cXHMrL2csICctJykgPT09XG4gICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZEFjdHVhbC50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1xccysvZywgJy0nKTtcblxuICAgIHJldHVybiBleGFjdE1hdGNoIHx8IHNsdWdpZmllZE1hdGNoIHx8IHJldmVyc2VNYXRjaDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXBpdGFsaXplIGZpcnN0IGxldHRlciBvZiBhIHN0cmluZ1xuICAgKi9cbiAgcHJpdmF0ZSBjYXBpdGFsaXplRmlyc3Qoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdHIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzdHIuc2xpY2UoMSk7XG4gIH1cblxuICAvKipcbiAgICogRXZpY3QgdGhlIG9sZGVzdCBhY2Nlc3NlZCBpbnN0YW5jZSBmcm9tIHRoZSBjYWNoZVxuICAgKiBJbXBsZW1lbnRzIExSVSAoTGVhc3QgUmVjZW50bHkgVXNlZCkgZXZpY3Rpb24gcG9saWN5XG4gICAqL1xuICBwcml2YXRlIGV2aWN0T2xkZXN0SW5zdGFuY2UoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZWxlbWVudEluc3RhbmNlcy5zaXplIDw9IHRoaXMuTUFYX0lOU1RBTkNFX0NBQ0hFX1NJWkUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBGaW5kIG9sZGVzdCBhY2Nlc3NlZCBpbnN0YW5jZVxuICAgIGxldCBvbGRlc3ROYW1lID0gJyc7XG4gICAgbGV0IG9sZGVzdFRpbWUgPSBEYXRlLm5vdygpO1xuXG4gICAgZm9yIChjb25zdCBbbmFtZSwgdGltZV0gb2YgdGhpcy5pbnN0YW5jZUFjY2Vzc1RpbWVzLmVudHJpZXMoKSkge1xuICAgICAgaWYgKHRpbWUgPCBvbGRlc3RUaW1lKSB7XG4gICAgICAgIG9sZGVzdFRpbWUgPSB0aW1lO1xuICAgICAgICBvbGRlc3ROYW1lID0gbmFtZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob2xkZXN0TmFtZSkge1xuICAgICAgdGhpcy5lbGVtZW50SW5zdGFuY2VzLmRlbGV0ZShvbGRlc3ROYW1lKTtcbiAgICAgIHRoaXMuaW5zdGFuY2VBY2Nlc3NUaW1lcy5kZWxldGUob2xkZXN0TmFtZSk7XG4gICAgICBsb2dnZXIuZGVidWcoYEV2aWN0ZWQgZWxlbWVudCBpbnN0YW5jZSBmcm9tIGNhY2hlOiAke29sZGVzdE5hbWV9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIHRoZSBlbGVtZW50IGluc3RhbmNlIGNhY2hlXG4gICAqIFVzZWZ1bCBmb3IgZnJlZWluZyBtZW1vcnkgb3IgZm9yY2luZyByZWxvYWQgb2YgZWxlbWVudHNcbiAgICovXG4gIHB1YmxpYyBjbGVhckluc3RhbmNlQ2FjaGUoKTogdm9pZCB7XG4gICAgY29uc3Qgc2l6ZSA9IHRoaXMuZWxlbWVudEluc3RhbmNlcy5zaXplO1xuICAgIHRoaXMuZWxlbWVudEluc3RhbmNlcy5jbGVhcigpO1xuICAgIHRoaXMuaW5zdGFuY2VBY2Nlc3NUaW1lcy5jbGVhcigpO1xuICAgIGxvZ2dlci5kZWJ1ZyhgQ2xlYXJlZCBpbnN0YW5jZSBjYWNoZSAoJHtzaXplfSBpbnN0YW5jZXMpYCk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYSB0eXBlLXNhZmUgY29udGV4dCBmb3IgY29uZGl0aW9uIGV2YWx1YXRpb25cbiAgICpcbiAgICogQ29uc3RydWN0cyBhIENvbmRpdGlvbkNvbnRleHQgb2JqZWN0IHdpdGggYWxsIHZhbHVlcyBuZWVkZWQgdG8gZXZhbHVhdGVcbiAgICogYW4gZWxlbWVudCdzIGFjdGl2YXRpb24gY29uZGl0aW9uLiBUaGUgY29udGV4dCBpcyBpbW11dGFibGUgYW5kIG9ubHlcbiAgICogZXhwb3NlcyBzYWZlLCByZWFkLW9ubHkgZGF0YS5cbiAgICpcbiAgICogU0VDVVJJVFkgR1VBUkFOVEVFUzpcbiAgICogLSBPbmx5IGV4cG9zZXMgZG9jdW1lbnRlZCwgc2FmZSBwcm9wZXJ0aWVzXG4gICAqIC0gTm8gYWNjZXNzIHRvIGVsZW1lbnQgaW5zdGFuY2VzIG9yIG1ldGhvZHNcbiAgICogLSBBbGwgbmVzdGVkIG9iamVjdHMgYXJlIHJlYWRvbmx5IChzaGFsbG93IGltbXV0YWJpbGl0eSlcbiAgICogLSBDb250ZXh0IHZhbHVlcyByZW1haW4gdHlwZS1jaGVja2VkIGFzIHVua25vd25cbiAgICogLSBObyBleHBvc3VyZSBvZiBpbnRlcm5hbCBlbnNlbWJsZSBzdGF0ZVxuICAgKlxuICAgKiBQRVJGT1JNQU5DRTpcbiAgICogLSBNaW5pbWFsIG9iamVjdCBhbGxvY2F0aW9uIChyZXVzZXMgbWFwcyB3aGVyZSBwb3NzaWJsZSlcbiAgICogLSBPKDEpIGxvb2t1cHMgZm9yIGVsZW1lbnQgYW5kIGNvbnRleHQgZGF0YVxuICAgKiAtIExhenkgY29tcHV0YXRpb24gb2YgcmVzb3VyY2UgbWV0cmljc1xuICAgKiAtIE5vIGRlZXAgY2xvbmluZyAodXNlcyByZWFkb25seSB0eXBlIGd1YXJkcylcbiAgICpcbiAgICogQHBhcmFtIGVsZW1lbnQgLSBUaGUgZWxlbWVudCB3aG9zZSBjb25kaXRpb24gaXMgYmVpbmcgZXZhbHVhdGVkXG4gICAqIEBwYXJhbSBhY3RpdmF0aW9uU3RhcnRUaW1lIC0gVGltZXN0YW1wIHdoZW4gZW5zZW1ibGUgYWN0aXZhdGlvbiBiZWdhblxuICAgKiBAcGFyYW0gcmVzdWx0IC0gQ3VycmVudCBhY3RpdmF0aW9uIHJlc3VsdCAoZm9yIHRyYWNraW5nIHByb2dyZXNzKVxuICAgKiBAcmV0dXJucyBDb250ZXh0IGJ1aWxkZXIgcmVzdWx0IHdpdGggY29udGV4dCBvYmplY3QgYW5kIG1ldGFkYXRhXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgY29udGV4dFJlc3VsdCA9IHRoaXMuYnVpbGRDb25kaXRpb25Db250ZXh0KFxuICAgKiAgIGVsZW1lbnRDb25maWcsXG4gICAqICAgc3RhcnRUaW1lLFxuICAgKiAgIGFjdGl2YXRpb25SZXN1bHRcbiAgICogKTtcbiAgICpcbiAgICogLy8gVXNlIGNvbnRleHQgaW4gZXZhbHVhdGlvblxuICAgKiBjb25zdCBzaG91bGRBY3RpdmF0ZSA9IGV2YWx1YXRlRXhwcmVzc2lvbihcbiAgICogICBlbGVtZW50LmNvbmRpdGlvbixcbiAgICogICBjb250ZXh0UmVzdWx0LmNvbnRleHRcbiAgICogKTtcbiAgICogYGBgXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkQ29uZGl0aW9uQ29udGV4dChcbiAgICBlbGVtZW50OiBFbnNlbWJsZUVsZW1lbnQsXG4gICAgYWN0aXZhdGlvblN0YXJ0VGltZTogbnVtYmVyLFxuICAgIHJlc3VsdDogRW5zZW1ibGVBY3RpdmF0aW9uUmVzdWx0XG4gICk6IGltcG9ydCgnLi90eXBlcy5qcycpLkNvbmRpdGlvbkNvbnRleHRSZXN1bHQge1xuICAgIGNvbnN0IHdhcm5pbmdzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IGxpbWl0cyA9IHRoaXMuZ2V0RWZmZWN0aXZlTGltaXRzKCk7XG5cbiAgICAvLyBCdWlsZCBzaGFyZWQgY29udGV4dCBvYmplY3QgKGNvbnZlcnQgTWFwIHRvIHBsYWluIG9iamVjdClcbiAgICBjb25zdCBjb250ZXh0VmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgIGNvbnN0IGNvbnRleHRPd25lcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHRoaXMuc2hhcmVkQ29udGV4dC52YWx1ZXMuZW50cmllcygpKSB7XG4gICAgICBjb250ZXh0VmFsdWVzW2tleV0gPSB2YWx1ZTtcbiAgICAgIGNvbnN0IG93bmVyID0gdGhpcy5zaGFyZWRDb250ZXh0Lm93bmVycy5nZXQoa2V5KTtcbiAgICAgIGlmIChvd25lcikge1xuICAgICAgICBjb250ZXh0T3duZXJzW2tleV0gPSBvd25lcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDYWxjdWxhdGUgcmVzb3VyY2UgdXNhZ2VcbiAgICBjb25zdCBleGVjdXRpb25UaW1lTXMgPSBEYXRlLm5vdygpIC0gYWN0aXZhdGlvblN0YXJ0VGltZTtcbiAgICBjb25zdCBjb250ZXh0U2l6ZSA9IHRoaXMuc2hhcmVkQ29udGV4dC52YWx1ZXMuc2l6ZTtcbiAgICBjb25zdCBjYWNoZWRJbnN0YW5jZXMgPSB0aGlzLmVsZW1lbnRJbnN0YW5jZXMuc2l6ZTtcblxuICAgIC8vIFdhcm4gaWYgYXBwcm9hY2hpbmcgcmVzb3VyY2UgbGltaXRzXG4gICAgaWYgKGNvbnRleHRTaXplID4gbGltaXRzLk1BWF9DT05URVhUX1NJWkUgKiAwLjgpIHtcbiAgICAgIHdhcm5pbmdzLnB1c2goXG4gICAgICAgIGBDb250ZXh0IHNpemUgKCR7Y29udGV4dFNpemV9KSBpcyBhcHByb2FjaGluZyBsaW1pdCAoJHtsaW1pdHMuTUFYX0NPTlRFWFRfU0laRX0pYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoZXhlY3V0aW9uVGltZU1zID4gbGltaXRzLk1BWF9BQ1RJVkFUSU9OX1RJTUUgKiAwLjgpIHtcbiAgICAgIHdhcm5pbmdzLnB1c2goXG4gICAgICAgIGBFeGVjdXRpb24gdGltZSAoJHtleGVjdXRpb25UaW1lTXN9bXMpIGlzIGFwcHJvYWNoaW5nIHRpbWVvdXRgXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEJ1aWxkIHRoZSBjb250ZXh0IG9iamVjdFxuICAgIGNvbnN0IGNvbnRleHQ6IGltcG9ydCgnLi90eXBlcy5qcycpLkNvbmRpdGlvbkNvbnRleHQgPSB7XG4gICAgICBlbGVtZW50OiB7XG4gICAgICAgIGVsZW1lbnRfbmFtZTogZWxlbWVudC5lbGVtZW50X25hbWUsXG4gICAgICAgIGVsZW1lbnRfdHlwZTogZWxlbWVudC5lbGVtZW50X3R5cGUsXG4gICAgICAgIHJvbGU6IGVsZW1lbnQucm9sZSxcbiAgICAgICAgcHJpb3JpdHk6IGVsZW1lbnQucHJpb3JpdHksXG4gICAgICAgIGFjdGl2YXRpb246IGVsZW1lbnQuYWN0aXZhdGlvbixcbiAgICAgICAgZGVwZW5kZW5jaWVzOiBlbGVtZW50LmRlcGVuZGVuY2llcyB8fCBbXSxcbiAgICAgICAgcHVycG9zZTogZWxlbWVudC5wdXJwb3NlXG4gICAgICB9LFxuICAgICAgY29udGV4dDogY29udGV4dFZhbHVlcyxcbiAgICAgIGNvbnRleHRPd25lcnM6IGNvbnRleHRPd25lcnMsXG4gICAgICBzdGF0ZToge1xuICAgICAgICBhY3RpdmF0ZWRDb3VudDogcmVzdWx0LmFjdGl2YXRlZEVsZW1lbnRzLmxlbmd0aCxcbiAgICAgICAgZmFpbGVkQ291bnQ6IHJlc3VsdC5mYWlsZWRFbGVtZW50cy5sZW5ndGgsXG4gICAgICAgIGFjdGl2YXRlZEVsZW1lbnRzOiBbLi4ucmVzdWx0LmFjdGl2YXRlZEVsZW1lbnRzXSxcbiAgICAgICAgZmFpbGVkRWxlbWVudHM6IFsuLi5yZXN1bHQuZmFpbGVkRWxlbWVudHNdLFxuICAgICAgICB0b3RhbEVsZW1lbnRzOiB0aGlzLmVsZW1lbnRzLmxlbmd0aFxuICAgICAgfSxcbiAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgIC8vIFJlc2VydmVkIGZvciBmdXR1cmUgZXhwYW5zaW9uXG4gICAgICAgIC8vIFdpbGwgaW5jbHVkZTogcnVudGltZSwgZXhlY3V0aW9uQ29udGV4dCwgY2FwYWJpbGl0aWVzLCBwZXJtaXNzaW9uc1xuICAgICAgfSxcbiAgICAgIHJlc291cmNlczoge1xuICAgICAgICBleGVjdXRpb25UaW1lTXMsXG4gICAgICAgIGNvbnRleHRTaXplLFxuICAgICAgICBjYWNoZWRJbnN0YW5jZXNcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRleHQsXG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCksXG4gICAgICB3YXJuaW5nczogd2FybmluZ3MubGVuZ3RoID4gMCA/IHdhcm5pbmdzIDogdW5kZWZpbmVkXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmFsdWF0ZSBhbiBhY3RpdmF0aW9uIGNvbmRpdGlvbiBpbiBhIHNlY3VyZSBWTSBzYW5kYm94XG4gICAqXG4gICAqIFNFQ1VSSVRZIElNUExFTUVOVEFUSU9OOlxuICAgKiBUaGlzIG1ldGhvZCBldmFsdWF0ZXMgdXNlci1wcm92aWRlZCBjb25kaXRpb25zIHVzaW5nIE5vZGUuanMgVk0gbW9kdWxlIHdpdGggbXVsdGlwbGVcbiAgICogbGF5ZXJzIG9mIGRlZmVuc2U6XG4gICAqXG4gICAqIDEuICoqU2FuZGJveGVkIEV4ZWN1dGlvbioqOiBVc2VzIHZtLmNyZWF0ZUNvbnRleHQoKSB3aXRoIGZyb3plbiBvYmplY3RzXG4gICAqICAgIC0gTm8gYWNjZXNzIHRvIHJlcXVpcmUsIHByb2Nlc3MsIGdsb2JhbCwgb3Igb3RoZXIgTm9kZS5qcyBBUElzXG4gICAqICAgIC0gQWxsIGNvbnRleHQgb2JqZWN0cyBhcmUgZGVlcGx5IGZyb3plbiAoaW1tdXRhYmxlKVxuICAgKiAgICAtIE5vIHByb3RvdHlwZSBjaGFpbiBhY2Nlc3MgdG8gcHJldmVudCBwb2xsdXRpb25cbiAgICpcbiAgICogMi4gKipUaW1lb3V0IFByb3RlY3Rpb24qKjogMTAwbXMgbWF4aW11bSBldmFsdWF0aW9uIHRpbWVcbiAgICogICAgLSBQcmV2ZW50cyBpbmZpbml0ZSBsb29wcyBhbmQgUmVEb1MgYXR0YWNrc1xuICAgKiAgICAtIFRlcm1pbmF0ZXMgbG9uZy1ydW5uaW5nIGV4cHJlc3Npb25zXG4gICAqXG4gICAqIDMuICoqSW5wdXQgVmFsaWRhdGlvbioqOiBQcmUtdmFsaWRhdGVkIGJ5IGlzVmFsaWRDb25kaXRpb24oKVxuICAgKiAgICAtIERhbmdlcm91cyBwYXR0ZXJucyBibG9ja2VkIChldmFsLCBGdW5jdGlvbiwgcmVxdWlyZSwgZXRjLilcbiAgICogICAgLSBPbmx5IHNhZmUgb3BlcmF0b3JzIGFsbG93ZWRcbiAgICogICAgLSBNYXhpbXVtIGxlbmd0aCBlbmZvcmNlZFxuICAgKlxuICAgKiA0LiAqKlR5cGUgU2FmZXR5Kio6IEVuZm9yY2VzIGJvb2xlYW4gcmV0dXJuIHZhbHVlc1xuICAgKiAgICAtIE5vbi1ib29sZWFuIHJlc3VsdHMgdHJlYXRlZCBhcyBmYWxzZVxuICAgKiAgICAtIFByZXZlbnRzIHNpZGUgZWZmZWN0cyBmcm9tIG5vbi1leHByZXNzaW9uIHN0YXRlbWVudHNcbiAgICpcbiAgICogNS4gKipFcnJvciBIYW5kbGluZyoqOiBGYWlsLXNlY3VyZSBwcmluY2lwbGVcbiAgICogICAgLSBFdmFsdWF0aW9uIGVycm9ycyByZXN1bHQgaW4gbm9uLWFjdGl2YXRpb24gKHJldHVybiBmYWxzZSlcbiAgICogICAgLSBBbGwgZmFpbHVyZXMgbG9nZ2VkIHRvIFNlY3VyaXR5TW9uaXRvclxuICAgKiAgICAtIE5vIGVycm9yIGRldGFpbHMgbGVha2VkIHRvIHVzZXJcbiAgICpcbiAgICogU1VQUE9SVEVEIEZFQVRVUkVTOlxuICAgKiAtIENvbnRleHQgdmFyaWFibGUgYWNjZXNzOiBjb250ZXh0LiosIGVsZW1lbnQuKiwgc3RhdGUuKiwgcmVzb3VyY2VzLiosIGVudmlyb25tZW50LipcbiAgICogLSBDb21wYXJpc29uIG9wZXJhdG9yczogPT0sICE9LCA9PT0sICE9PSwgPiwgPCwgPj0sIDw9XG4gICAqIC0gTG9naWNhbCBvcGVyYXRvcnM6ICYmLCB8fCwgIVxuICAgKiAtIFBhcmVudGhlc2VzIGZvciBncm91cGluZ1xuICAgKiAtIEFycmF5L29iamVjdCBwcm9wZXJ0eSBhY2Nlc3NcbiAgICpcbiAgICogRXhhbXBsZSB2YWxpZCBjb25kaXRpb25zOlxuICAgKiAtIFwiZWxlbWVudC5wcmlvcml0eSA+PSA4MFwiXG4gICAqIC0gXCJjb250ZXh0LnNlY3VyaXR5X3JldmlldyA9PT0gdHJ1ZVwiXG4gICAqIC0gXCJzdGF0ZS5hY3RpdmF0ZWRDb3VudCA+IDMgJiYgZWxlbWVudC5yb2xlID09PSAncHJpbWFyeSdcIlxuICAgKiAtIFwiY29udGV4dC5lbnZpcm9ubWVudCA9PT0gJ3Byb2R1Y3Rpb24nIHx8IGNvbnRleHQub3ZlcnJpZGVcIlxuICAgKlxuICAgKiBAcGFyYW0gY29uZGl0aW9uIC0gVGhlIGNvbmRpdGlvbiBzdHJpbmcgdG8gZXZhbHVhdGUgKHByZS12YWxpZGF0ZWQpXG4gICAqIEBwYXJhbSBlbGVtZW50IC0gVGhlIGVsZW1lbnQgd2hvc2UgY29uZGl0aW9uIGlzIGJlaW5nIGV2YWx1YXRlZFxuICAgKiBAcGFyYW0gYWN0aXZhdGlvblN0YXJ0VGltZSAtIFdoZW4gYWN0aXZhdGlvbiBiZWdhbiAoZm9yIHJlc291cmNlIHRyYWNraW5nKVxuICAgKiBAcGFyYW0gcmVzdWx0IC0gQ3VycmVudCBhY3RpdmF0aW9uIHJlc3VsdCAoZm9yIHN0YXRlIHRyYWNraW5nKVxuICAgKiBAcmV0dXJucyB0cnVlIGlmIGNvbmRpdGlvbiBldmFsdWF0ZXMgdG8gdHJ1ZSwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqIEBwcml2YXRlXG4gICAqIEBzZWN1cml0eSBNdWx0aXBsZSBkZWZlbnNlIGxheWVyczogc2FuZGJveCwgdGltZW91dCwgdmFsaWRhdGlvbiwgaW1tdXRhYmlsaXR5XG4gICAqL1xuICBwcml2YXRlIGV2YWx1YXRlQ29uZGl0aW9uKFxuICAgIGNvbmRpdGlvbjogc3RyaW5nLFxuICAgIGVsZW1lbnQ6IEVuc2VtYmxlRWxlbWVudCxcbiAgICBhY3RpdmF0aW9uU3RhcnRUaW1lOiBudW1iZXIsXG4gICAgcmVzdWx0OiBFbnNlbWJsZUFjdGl2YXRpb25SZXN1bHRcbiAgKTogYm9vbGVhbiB7XG4gICAgLy8gQnVpbGQgdHlwZS1zYWZlIGNvbnRleHRcbiAgICBjb25zdCBjb250ZXh0UmVzdWx0ID0gdGhpcy5idWlsZENvbmRpdGlvbkNvbnRleHQoXG4gICAgICBlbGVtZW50LFxuICAgICAgYWN0aXZhdGlvblN0YXJ0VGltZSxcbiAgICAgIHJlc3VsdFxuICAgICk7XG5cbiAgICAvLyBMb2cgd2FybmluZ3MgaWYgYW55XG4gICAgaWYgKGNvbnRleHRSZXN1bHQud2FybmluZ3MpIHtcbiAgICAgIGZvciAoY29uc3Qgd2FybmluZyBvZiBjb250ZXh0UmVzdWx0Lndhcm5pbmdzKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBDb250ZXh0IHdhcm5pbmcgZm9yICR7ZWxlbWVudC5lbGVtZW50X25hbWV9OiAke3dhcm5pbmd9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIENyZWF0ZSBmcm96ZW4gc2FuZGJveCBjb250ZXh0IHRvIHByZXZlbnQgbW9kaWZpY2F0aW9uXG4gICAgICAvLyBFeHBvc2UgZWxlbWVudCBwcm9wZXJ0aWVzIGF0IHRvcCBsZXZlbCBmb3IgY29udmVuaWVuY2UgKG1hdGNoZXMgcmVhbCBlbnNlbWJsZSB1c2FnZSlcbiAgICAgIGNvbnN0IHNhbmRib3ggPSBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgLy8gRWxlbWVudCBwcm9wZXJ0aWVzIGF0IHRvcCBsZXZlbCBmb3Igc2ltcGxlIGNvbmRpdGlvbnMgbGlrZSBcInByaW9yaXR5ID4gNDBcIlxuICAgICAgICAvLyBOb3RlOiBlbGVtZW50X25hbWUvZWxlbWVudF90eXBlIGFyZSB0aGUgY2Fub25pY2FsIG5hbWVzLCBidXQgd2UgYWxzbyBleHBvc2VcbiAgICAgICAgLy8gbmFtZS90eXBlIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nIGNvbmRpdGlvbnNcbiAgICAgICAgZWxlbWVudF9uYW1lOiBjb250ZXh0UmVzdWx0LmNvbnRleHQuZWxlbWVudC5lbGVtZW50X25hbWUsXG4gICAgICAgIGVsZW1lbnRfdHlwZTogY29udGV4dFJlc3VsdC5jb250ZXh0LmVsZW1lbnQuZWxlbWVudF90eXBlLFxuICAgICAgICBuYW1lOiBjb250ZXh0UmVzdWx0LmNvbnRleHQuZWxlbWVudC5lbGVtZW50X25hbWUsICAvLyBCYWNrd2FyZHMgY29tcGF0IGFsaWFzXG4gICAgICAgIHR5cGU6IGNvbnRleHRSZXN1bHQuY29udGV4dC5lbGVtZW50LmVsZW1lbnRfdHlwZSwgIC8vIEJhY2t3YXJkcyBjb21wYXQgYWxpYXNcbiAgICAgICAgcm9sZTogY29udGV4dFJlc3VsdC5jb250ZXh0LmVsZW1lbnQucm9sZSxcbiAgICAgICAgcHJpb3JpdHk6IGNvbnRleHRSZXN1bHQuY29udGV4dC5lbGVtZW50LnByaW9yaXR5LFxuICAgICAgICBhY3RpdmF0aW9uOiBjb250ZXh0UmVzdWx0LmNvbnRleHQuZWxlbWVudC5hY3RpdmF0aW9uLFxuICAgICAgICBkZXBlbmRlbmNpZXM6IE9iamVjdC5mcmVlemUoWy4uLihjb250ZXh0UmVzdWx0LmNvbnRleHQuZWxlbWVudC5kZXBlbmRlbmNpZXMgfHwgW10pXSksXG4gICAgICAgIHB1cnBvc2U6IGNvbnRleHRSZXN1bHQuY29udGV4dC5lbGVtZW50LnB1cnBvc2UsXG5cbiAgICAgICAgLy8gQWxzbyBpbmNsdWRlIG5lc3RlZCBlbGVtZW50IG9iamVjdCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgICAgICAgZWxlbWVudDogT2JqZWN0LmZyZWV6ZSh7IC4uLmNvbnRleHRSZXN1bHQuY29udGV4dC5lbGVtZW50IH0pLFxuXG4gICAgICAgIC8vIEZsYXR0ZW4gc2hhcmVkIGNvbnRleHQgdmFsdWVzIHRvIHRvcCBsZXZlbCAoYWxsb3dzIFwiZGF0YV9hdmFpbGFibGVcIiBpbnN0ZWFkIG9mIFwiY29udGV4dC5kYXRhX2F2YWlsYWJsZVwiKVxuICAgICAgICAuLi5jb250ZXh0UmVzdWx0LmNvbnRleHQuY29udGV4dCxcblxuICAgICAgICAvLyBBbHNvIGluY2x1ZGUgbmVzdGVkIGNvbnRleHQgb2JqZWN0IGZvciBjb21wbGV4IGFjY2VzcyBwYXR0ZXJuc1xuICAgICAgICBjb250ZXh0OiBPYmplY3QuZnJlZXplKHsgLi4uY29udGV4dFJlc3VsdC5jb250ZXh0LmNvbnRleHQgfSksXG5cbiAgICAgICAgLy8gQWN0aXZhdGlvbiBzdGF0ZSAocmVhZG9ubHkpXG4gICAgICAgIHN0YXRlOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgICAuLi5jb250ZXh0UmVzdWx0LmNvbnRleHQuc3RhdGUsXG4gICAgICAgICAgYWN0aXZhdGVkRWxlbWVudHM6IE9iamVjdC5mcmVlemUoWy4uLmNvbnRleHRSZXN1bHQuY29udGV4dC5zdGF0ZS5hY3RpdmF0ZWRFbGVtZW50c10pLFxuICAgICAgICAgIGZhaWxlZEVsZW1lbnRzOiBPYmplY3QuZnJlZXplKFsuLi5jb250ZXh0UmVzdWx0LmNvbnRleHQuc3RhdGUuZmFpbGVkRWxlbWVudHNdKVxuICAgICAgICB9KSxcblxuICAgICAgICAvLyBSZXNvdXJjZSB1c2FnZSAocmVhZG9ubHkpXG4gICAgICAgIHJlc291cmNlczogT2JqZWN0LmZyZWV6ZSh7IC4uLmNvbnRleHRSZXN1bHQuY29udGV4dC5yZXNvdXJjZXMgfSksXG5cbiAgICAgICAgLy8gRW52aXJvbm1lbnQgKHJlYWRvbmx5KVxuICAgICAgICBlbnZpcm9ubWVudDogY29udGV4dFJlc3VsdC5jb250ZXh0LmVudmlyb25tZW50XG4gICAgICAgICAgPyBPYmplY3QuZnJlZXplKHsgLi4uY29udGV4dFJlc3VsdC5jb250ZXh0LmVudmlyb25tZW50IH0pXG4gICAgICAgICAgOiBPYmplY3QuZnJlZXplKHt9KVxuICAgICAgfSk7XG5cbiAgICAgIC8vIENyZWF0ZSBWTSBjb250ZXh0IHdpdGggb25seSB0aGUgc2FuZGJveCAobm8gYWNjZXNzIHRvIHJlcXVpcmUsIHByb2Nlc3MsIGV0Yy4pXG4gICAgICBjb25zdCB2bUNvbnRleHQgPSB2bS5jcmVhdGVDb250ZXh0KHNhbmRib3gpO1xuXG4gICAgICAvLyBXcmFwIGNvbmRpdGlvbiBpbiBhbiBJSUZFIHRvIGVuc3VyZSBpdCByZXR1cm5zIGEgYm9vbGVhblxuICAgICAgLy8gVGhpcyBwcmV2ZW50cyB0aGUgY29uZGl0aW9uIGZyb20gYmVpbmcgYSBzdGF0ZW1lbnRcbiAgICAgIGNvbnN0IHdyYXBwZWRDb25kaXRpb24gPSBgKGZ1bmN0aW9uKCkgeyByZXR1cm4gKCR7Y29uZGl0aW9ufSk7IH0pKClgO1xuXG4gICAgICAvLyBFeGVjdXRlIHdpdGggdGltZW91dCBwcm90ZWN0aW9uXG4gICAgICBjb25zdCBzdGFydEV2YWxUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IGV2YWx1YXRpb25SZXN1bHQgPSB2bS5ydW5JbkNvbnRleHQod3JhcHBlZENvbmRpdGlvbiwgdm1Db250ZXh0LCB7XG4gICAgICAgIHRpbWVvdXQ6IDEwMCwgLy8gMTAwbXMgbWF4IGV2YWx1YXRpb24gdGltZVxuICAgICAgICBkaXNwbGF5RXJyb3JzOiBmYWxzZSxcbiAgICAgICAgYnJlYWtPblNpZ2ludDogdHJ1ZVxuICAgICAgfSk7XG4gICAgICBjb25zdCBldmFsRHVyYXRpb24gPSBEYXRlLm5vdygpIC0gc3RhcnRFdmFsVGltZTtcblxuICAgICAgLy8gTG9nIHN1Y2Nlc3NmdWwgZXZhbHVhdGlvblxuICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICBgQ29uZGl0aW9uIGV2YWx1YXRlZCBmb3IgJHtlbGVtZW50LmVsZW1lbnRfbmFtZX06IFwiJHtjb25kaXRpb259XCIgPT4gJHtldmFsdWF0aW9uUmVzdWx0fSAoJHtldmFsRHVyYXRpb259bXMpYFxuICAgICAgKTtcblxuICAgICAgLy8gRW5zdXJlIHJlc3VsdCBpcyBib29sZWFuXG4gICAgICBpZiAodHlwZW9mIGV2YWx1YXRpb25SZXN1bHQgIT09ICdib29sZWFuJykge1xuICAgICAgICBsb2dnZXIud2FybihcbiAgICAgICAgICBgQ29uZGl0aW9uIFwiJHtjb25kaXRpb259XCIgZm9yICR7ZWxlbWVudC5lbGVtZW50X25hbWV9IHJldHVybmVkIG5vbi1ib29sZWFuIHZhbHVlOiAke3R5cGVvZiBldmFsdWF0aW9uUmVzdWx0fS4gYCArXG4gICAgICAgICAgYFRyZWF0aW5nIGFzIGZhbHNlLmBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZXZhbHVhdGlvblJlc3VsdDtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBMb2cgc2VjdXJpdHkgZXZlbnQgZm9yIGV2YWx1YXRpb24gZmFpbHVyZVxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiBFTlNFTUJMRV9TRUNVUklUWV9FVkVOVFMuQ09ORElUSU9OX0VWQUxVQVRJT05fRkFJTEVELFxuICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgIHNvdXJjZTogJ0Vuc2VtYmxlLmV2YWx1YXRlQ29uZGl0aW9uJyxcbiAgICAgICAgZGV0YWlsczogYEZhaWxlZCB0byBldmFsdWF0ZSBjb25kaXRpb24gXCIke2NvbmRpdGlvbn1cIiBmb3IgZWxlbWVudCAke2VsZW1lbnQuZWxlbWVudF9uYW1lfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCxcbiAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICBlbnNlbWJsZU5hbWU6IHRoaXMubWV0YWRhdGEubmFtZSxcbiAgICAgICAgICBlbGVtZW50TmFtZTogZWxlbWVudC5lbGVtZW50X25hbWUsXG4gICAgICAgICAgY29uZGl0aW9uXG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gZXZhbHVhdGUgY29uZGl0aW9uIGZvciAke2VsZW1lbnQuZWxlbWVudF9uYW1lfTogJHtjb25kaXRpb259YCxcbiAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFN0cmluZyhlcnJvcikpXG4gICAgICApO1xuXG4gICAgICAvLyBGYWlsIHNlY3VyZWx5OiBldmFsdWF0aW9uIGVycm9ycyByZXN1bHQgaW4gbm9uLWFjdGl2YXRpb25cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBjb25kaXRpb24gc3ludGF4IGlzIHZhbGlkXG4gICAqXG4gICAqIFZhbGlkYXRlcyB0aGF0IGEgY29uZGl0aW9uOlxuICAgKiAxLiBNYXRjaGVzIHRoZSBzYWZlIGNoYXJhY3RlciBwYXR0ZXJuIChhbHBoYW51bWVyaWMsIG9wZXJhdG9ycywgZXRjLilcbiAgICogMi4gRG9lcyBub3QgY29udGFpbiBkYW5nZXJvdXMga2V5d29yZHMgb3Igb3BlcmF0b3JzXG4gICAqIDMuIElzIG5vdCBlbXB0eSBvciB3aGl0ZXNwYWNlLW9ubHlcbiAgICpcbiAgICogU0VDVVJJVFk6IE11bHRpLWxheWVyIHZhbGlkYXRpb24gYXBwcm9hY2hcbiAgICogLSBMYXllciAxOiBQb3NpdGl2ZSBwYXR0ZXJuIG1hdGNoIChDT05ESVRJT05fUEFUVEVSTikgYWxsb3dzIG9ubHkgc2FmZSBjaGFyYWN0ZXJzXG4gICAqIC0gTGF5ZXIgMjogTmVnYXRpdmUgcGF0dGVybiBtYXRjaCAoREFOR0VST1VTX0NPTkRJVElPTl9QQVRURVJOUykgYmxvY2tzIGNvZGUgaW5qZWN0aW9uXG4gICAqIC0gTGF5ZXIgMzogVk0gc2FuZGJveCB3aXRoIHRpbWVvdXQgZHVyaW5nIGV2YWx1YXRpb24gKHNlZSBldmFsdWF0ZUNvbmRpdGlvbilcbiAgICogVGhpcyBkZWZlbnNlLWluLWRlcHRoIHN0cmF0ZWd5IGVuc3VyZXMgY29uZGl0aW9ucyBjYW5ub3QgZXhlY3V0ZSBhcmJpdHJhcnkgY29kZVxuICAgKlxuICAgKiBAcGFyYW0gY29uZGl0aW9uIC0gVGhlIGNvbmRpdGlvbiBzdHJpbmcgdG8gdmFsaWRhdGVcbiAgICogQHJldHVybnMgdHJ1ZSBpZiBjb25kaXRpb24gaXMgc2FmZSwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqL1xuICBwcml2YXRlIGlzVmFsaWRDb25kaXRpb24oY29uZGl0aW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAvLyBDaGVjayBpZiBjb25kaXRpb24gbWF0Y2hlcyBzYWZlIGNoYXJhY3RlciBwYXR0ZXJuXG4gICAgaWYgKCFFTlNFTUJMRV9QQVRURVJOUy5DT05ESVRJT05fUEFUVEVSTi50ZXN0KGNvbmRpdGlvbikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgZGFuZ2Vyb3VzIHBhdHRlcm5zXG4gICAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIERBTkdFUk9VU19DT05ESVRJT05fUEFUVEVSTlMpIHtcbiAgICAgIGlmIChwYXR0ZXJuLnRlc3QoY29uZGl0aW9uKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYWRkaW5nIGFuIGVsZW1lbnQgd291bGQgY3JlYXRlIGEgY2lyY3VsYXIgZGVwZW5kZW5jeVxuICAgKi9cbiAgcHJpdmF0ZSB3b3VsZENyZWF0ZUNpcmN1bGFyRGVwZW5kZW5jeShcbiAgICBlbGVtZW50TmFtZTogc3RyaW5nLFxuICAgIGRlcGVuZGVuY2llczogc3RyaW5nW11cbiAgKTogYm9vbGVhbiB7XG4gICAgLy8gRmFzdCBwYXRoIDE6IE5vIGRlcGVuZGVuY2llcyA9IG5vIGN5Y2xlIHBvc3NpYmxlXG4gICAgaWYgKCFkZXBlbmRlbmNpZXMgfHwgZGVwZW5kZW5jaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIEZhc3QgcGF0aCAyOiBTZWxmLWRlcGVuZGVuY3lcbiAgICBpZiAoZGVwZW5kZW5jaWVzLmluY2x1ZGVzKGVsZW1lbnROYW1lKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gRmFzdCBwYXRoIDM6IENoZWNrIGlmIGFueSBkZXBlbmRlbmNpZXMgZG9uJ3QgZXhpc3QgeWV0XG4gICAgLy8gKGNhbid0IGNyZWF0ZSBjeWNsZSB3aXRoIG5vbi1leGlzdGVudCBlbGVtZW50cylcbiAgICBjb25zdCBhbGxEZXBzRXhpc3QgPSBkZXBlbmRlbmNpZXMuZXZlcnkoZGVwID0+IHRoaXMuaGFzRWxlbWVudChkZXApKTtcbiAgICBpZiAoIWFsbERlcHNFeGlzdCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIEZhc3QgcGF0aCA0OiBJZiB0aGlzIGlzIHRoZSBmaXJzdCBlbGVtZW50IHdpdGggZGVwZW5kZW5jaWVzLFxuICAgIC8vIGl0IGNhbm5vdCBjcmVhdGUgYSBjeWNsZVxuICAgIGNvbnN0IGhhc0V4aXN0aW5nRGVwZW5kZW5jaWVzID0gdGhpcy5lbGVtZW50c1xuICAgICAgLnNvbWUoZWwgPT4gZWwuZGVwZW5kZW5jaWVzICYmIGVsLmRlcGVuZGVuY2llcy5sZW5ndGggPiAwKTtcbiAgICBpZiAoIWhhc0V4aXN0aW5nRGVwZW5kZW5jaWVzKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gTm93IGRvIHRoZSBmdWxsIERGUyBjaGVjayAoZXhpc3RpbmcgaW1wbGVtZW50YXRpb24pXG4gICAgLy8gQ3JlYXRlIHRlbXBvcmFyeSBhcnJheSB3aXRoIG5ldy91cGRhdGVkIGVsZW1lbnRcbiAgICAvLyBGaWx0ZXIgb3V0IHRoZSBleGlzdGluZyBlbGVtZW50IGlmIHVwZGF0aW5nLCB0aGVuIGFkZCB0aGUgbmV3IHZlcnNpb25cbiAgICBjb25zdCB0ZW1wRWxlbWVudHMgPSBbXG4gICAgICAuLi50aGlzLmVsZW1lbnRzLmZpbHRlcihlbCA9PiBlbC5lbGVtZW50X25hbWUgIT09IGVsZW1lbnROYW1lKSxcbiAgICAgIHtcbiAgICAgICAgZWxlbWVudF9uYW1lOiBlbGVtZW50TmFtZSxcbiAgICAgICAgZWxlbWVudF90eXBlOiAndGVtcCcsXG4gICAgICAgIHJvbGU6ICdzdXBwb3J0JyxcbiAgICAgICAgcHJpb3JpdHk6IDUwLFxuICAgICAgICBhY3RpdmF0aW9uOiAnYWx3YXlzJyxcbiAgICAgICAgZGVwZW5kZW5jaWVzXG4gICAgICB9IGFzIEVuc2VtYmxlRWxlbWVudFxuICAgIF07XG5cbiAgICAvLyBIZWxwZXIgdG8gZmluZCBlbGVtZW50IGluIHRlbXAgYXJyYXlcbiAgICBjb25zdCBmaW5kVGVtcEVsZW1lbnQgPSAobmFtZTogc3RyaW5nKTogRW5zZW1ibGVFbGVtZW50IHwgdW5kZWZpbmVkID0+IHtcbiAgICAgIHJldHVybiB0ZW1wRWxlbWVudHMuZmluZChlbCA9PiBlbC5lbGVtZW50X25hbWUgPT09IG5hbWUpO1xuICAgIH07XG5cbiAgICBjb25zdCBoYXNUZW1wRWxlbWVudCA9IChuYW1lOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgICAgIHJldHVybiB0ZW1wRWxlbWVudHMuc29tZShlbCA9PiBlbC5lbGVtZW50X25hbWUgPT09IG5hbWUpO1xuICAgIH07XG5cbiAgICAvLyBDaGVjayBmb3IgY3ljbGVzIHVzaW5nIERGU1xuICAgIGNvbnN0IHZpc2l0ZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBjb25zdCByZWN1cnNpb25TdGFjayA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgY29uc3QgaGFzQ3ljbGUgPSAobm9kZTogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gICAgICB2aXNpdGVkLmFkZChub2RlKTtcbiAgICAgIHJlY3Vyc2lvblN0YWNrLmFkZChub2RlKTtcblxuICAgICAgY29uc3QgZWxlbWVudCA9IGZpbmRUZW1wRWxlbWVudChub2RlKTtcbiAgICAgIGlmIChlbGVtZW50Py5kZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBkZXAgb2YgZWxlbWVudC5kZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgICBpZiAoIWhhc1RlbXBFbGVtZW50KGRlcCkpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgaWYgKCF2aXNpdGVkLmhhcyhkZXApKSB7XG4gICAgICAgICAgICBpZiAoaGFzQ3ljbGUoZGVwKSkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfSBlbHNlIGlmIChyZWN1cnNpb25TdGFjay5oYXMoZGVwKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJlY3Vyc2lvblN0YWNrLmRlbGV0ZShub2RlKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGhhc0N5Y2xlKGVsZW1lbnROYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGNpcmN1bGFyIGRlcGVuZGVuY3kgcGF0aCBmb3IgZXJyb3IgcmVwb3J0aW5nXG4gICAqL1xuICBwcml2YXRlIGZpbmRDaXJjdWxhckRlcGVuZGVuY3koXG4gICAgZWxlbWVudE5hbWU6IHN0cmluZyxcbiAgICBkZXBlbmRlbmNpZXM6IHN0cmluZ1tdXG4gICk6IENpcmN1bGFyRGVwZW5kZW5jeSB7XG4gICAgY29uc3QgcGF0aDogc3RyaW5nW10gPSBbZWxlbWVudE5hbWVdO1xuXG4gICAgY29uc3QgZmluZEN5Y2xlID0gKGN1cnJlbnQ6IHN0cmluZywgdmlzaXRlZDogU2V0PHN0cmluZz4pOiBib29sZWFuID0+IHtcbiAgICAgIGlmICh2aXNpdGVkLmhhcyhjdXJyZW50KSkge1xuICAgICAgICAvLyBGb3VuZCB0aGUgY3ljbGVcbiAgICAgICAgY29uc3QgY3ljbGVTdGFydCA9IHBhdGguaW5kZXhPZihjdXJyZW50KTtcbiAgICAgICAgcmV0dXJuIGN5Y2xlU3RhcnQgPj0gMDtcbiAgICAgIH1cblxuICAgICAgdmlzaXRlZC5hZGQoY3VycmVudCk7XG4gICAgICBwYXRoLnB1c2goY3VycmVudCk7XG5cbiAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmZpbmRFbGVtZW50QnlOYW1lKGN1cnJlbnQpO1xuICAgICAgaWYgKGVsZW1lbnQ/LmRlcGVuZGVuY2llcykge1xuICAgICAgICBmb3IgKGNvbnN0IGRlcCBvZiBlbGVtZW50LmRlcGVuZGVuY2llcykge1xuICAgICAgICAgIGlmICh0aGlzLmhhc0VsZW1lbnQoZGVwKSkge1xuICAgICAgICAgICAgaWYgKGZpbmRDeWNsZShkZXAsIHZpc2l0ZWQpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcGF0aC5wb3AoKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCBkZXAgb2YgZGVwZW5kZW5jaWVzKSB7XG4gICAgICBpZiAodGhpcy5oYXNFbGVtZW50KGRlcCkpIHtcbiAgICAgICAgaWYgKGZpbmRDeWNsZShkZXAsIG5ldyBTZXQoKSkpIHtcbiAgICAgICAgICBwYXRoLnB1c2goZWxlbWVudE5hbWUpOyAvLyBDb21wbGV0ZSB0aGUgY3ljbGVcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBDaXJjdWxhciBkZXBlbmRlbmN5OiAke3BhdGguam9pbignIC0+ICcpfWBcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHBhdGg6IFtlbGVtZW50TmFtZV0sXG4gICAgICBtZXNzYWdlOiAnQ2lyY3VsYXIgZGVwZW5kZW5jeSBkZXRlY3RlZCdcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVjdCBhbGwgY2lyY3VsYXIgZGVwZW5kZW5jaWVzIGluIHRoZSBlbnNlbWJsZVxuICAgKi9cbiAgcHJpdmF0ZSBkZXRlY3RBbGxDaXJjdWxhckRlcGVuZGVuY2llcygpOiBDaXJjdWxhckRlcGVuZGVuY3lbXSB7XG4gICAgY29uc3QgY3ljbGVzOiBDaXJjdWxhckRlcGVuZGVuY3lbXSA9IFtdO1xuICAgIGNvbnN0IHZpc2l0ZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBjb25zdCByZWN1cnNpb25TdGFjayA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGNvbnN0IHBhdGhTdGFjazogc3RyaW5nW10gPSBbXTtcblxuICAgIGNvbnN0IGZpbmRDeWNsZXMgPSAobm9kZTogc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgICB2aXNpdGVkLmFkZChub2RlKTtcbiAgICAgIHJlY3Vyc2lvblN0YWNrLmFkZChub2RlKTtcbiAgICAgIHBhdGhTdGFjay5wdXNoKG5vZGUpO1xuXG4gICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5maW5kRWxlbWVudEJ5TmFtZShub2RlKTtcbiAgICAgIGlmIChlbGVtZW50Py5kZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBkZXAgb2YgZWxlbWVudC5kZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgICBpZiAoIXRoaXMuaGFzRWxlbWVudChkZXApKSBjb250aW51ZTtcblxuICAgICAgICAgIGlmICghdmlzaXRlZC5oYXMoZGVwKSkge1xuICAgICAgICAgICAgZmluZEN5Y2xlcyhkZXApO1xuICAgICAgICAgIH0gZWxzZSBpZiAocmVjdXJzaW9uU3RhY2suaGFzKGRlcCkpIHtcbiAgICAgICAgICAgIC8vIEZvdW5kIGEgY3ljbGVcbiAgICAgICAgICAgIGNvbnN0IGN5Y2xlU3RhcnQgPSBwYXRoU3RhY2suaW5kZXhPZihkZXApO1xuICAgICAgICAgICAgY29uc3QgY3ljbGVQYXRoID0gWy4uLnBhdGhTdGFjay5zbGljZShjeWNsZVN0YXJ0KSwgZGVwXTtcbiAgICAgICAgICAgIGN5Y2xlcy5wdXNoKHtcbiAgICAgICAgICAgICAgcGF0aDogY3ljbGVQYXRoLFxuICAgICAgICAgICAgICBtZXNzYWdlOiBgY2lyY3VsYXIgZGVwZW5kZW5jeTogJHtjeWNsZVBhdGguam9pbignIC0+ICcpfWBcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBwYXRoU3RhY2sucG9wKCk7XG4gICAgICByZWN1cnNpb25TdGFjay5kZWxldGUobm9kZSk7XG4gICAgfTtcblxuICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiB0aGlzLmVsZW1lbnRzKSB7XG4gICAgICBpZiAoIXZpc2l0ZWQuaGFzKGVsZW1lbnQuZWxlbWVudF9uYW1lKSkge1xuICAgICAgICBmaW5kQ3ljbGVzKGVsZW1lbnQuZWxlbWVudF9uYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY3ljbGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhIHZhbHVlIGluIHNoYXJlZCBjb250ZXh0XG4gICAqXG4gICAqIFNFQ1VSSVRZOiBTaXplIGxpbWl0cyBwcmV2ZW50IG1lbW9yeSBleGhhdXN0aW9uIGF0dGFja3NcbiAgICogLSBJbmRpdmlkdWFsIHZhbHVlIHNpemUgY2FwcGVkIGF0IE1BWF9DT05URVhUX1ZBTFVFX1NJWkUgKDEwS0IpXG4gICAqIC0gVG90YWwgY29udGV4dCBlbnRyaWVzIGNhcHBlZCBhdCBNQVhfQ09OVEVYVF9TSVpFICgxMDAwIGVudHJpZXMpXG4gICAqIC0gUHJldmVudHMgRG9TIHZpYSB1bmJvdW5kZWQgY29udGV4dCBncm93dGhcbiAgICogVGhlc2UgbGltaXRzIGFsbG93IGxlZ2l0aW1hdGUgdXNlIHdoaWxlIGJsb2NraW5nIG1hbGljaW91cyBwYXlsb2Fkc1xuICAgKlxuICAgKiBAcGFyYW0ga2V5IC0gQ29udGV4dCBrZXkgKHNhbml0aXplZClcbiAgICogQHBhcmFtIHZhbHVlIC0gVmFsdWUgdG8gc3RvcmUgKHNpemUtbGltaXRlZClcbiAgICogQHBhcmFtIG93bmVyRWxlbWVudE5hbWUgLSBFbGVtZW50IHNldHRpbmcgdGhpcyB2YWx1ZSAodmFsaWRhdGVkKVxuICAgKi9cbiAgcHVibGljIHNldENvbnRleHRWYWx1ZShrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIG93bmVyRWxlbWVudE5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHNhbml0aXplZEtleSA9IHNhbml0aXplSW5wdXQoa2V5LCAxMDApO1xuICAgIGNvbnN0IHNhbml0aXplZE93bmVyID0gc2FuaXRpemVJbnB1dChvd25lckVsZW1lbnROYW1lLCAxMDApO1xuICAgIGNvbnN0IGxpbWl0cyA9IHRoaXMuZ2V0RWZmZWN0aXZlTGltaXRzKCk7XG5cbiAgICAvLyBWYWxpZGF0ZSB0aGF0IG93bmVyIGVsZW1lbnQgZXhpc3RzIGluIHRoZSBlbnNlbWJsZVxuICAgIGlmICghdGhpcy5oYXNFbGVtZW50KHNhbml0aXplZE93bmVyKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgT3duZXIgZWxlbWVudCAnJHtzYW5pdGl6ZWRPd25lcn0nIG5vdCBmb3VuZCBpbiBlbnNlbWJsZS4gYCArXG4gICAgICAgIGBPbmx5IGVsZW1lbnRzIGluIHRoZSBlbnNlbWJsZSBjYW4gc2V0IGNvbnRleHQgdmFsdWVzLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgdmFsdWUgc2l6ZSB0byBwcmV2ZW50IG1lbW9yeSBleGhhdXN0aW9uXG4gICAgY29uc3QgdmFsdWVTaXplID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpLmxlbmd0aDtcbiAgICBpZiAodmFsdWVTaXplID4gbGltaXRzLk1BWF9DT05URVhUX1ZBTFVFX1NJWkUpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogRU5TRU1CTEVfU0VDVVJJVFlfRVZFTlRTLkNPTlRFWFRfVkFMVUVfVE9PX0xBUkdFLFxuICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgIHNvdXJjZTogJ0Vuc2VtYmxlLnNldENvbnRleHRWYWx1ZScsXG4gICAgICAgIGRldGFpbHM6IGBDb250ZXh0IHZhbHVlIHNpemUgKCR7dmFsdWVTaXplfSkgZXhjZWVkcyBsaW1pdCAoJHtsaW1pdHMuTUFYX0NPTlRFWFRfVkFMVUVfU0laRX0pYFxuICAgICAgfSk7XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENvbnRleHQgdmFsdWUgc2l6ZSAoJHt2YWx1ZVNpemV9IGJ5dGVzKSBleGNlZWRzIG1heGltdW0gYWxsb3dlZCBzaXplIGAgK1xuICAgICAgICBgKCR7bGltaXRzLk1BWF9DT05URVhUX1ZBTFVFX1NJWkV9IGJ5dGVzKWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgY29udGV4dCBzaXplIGxpbWl0XG4gICAgaWYgKHRoaXMuc2hhcmVkQ29udGV4dC52YWx1ZXMuc2l6ZSA+PSBsaW1pdHMuTUFYX0NPTlRFWFRfU0laRSkge1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiBFTlNFTUJMRV9TRUNVUklUWV9FVkVOVFMuQ09OVEVYVF9TSVpFX0VYQ0VFREVELFxuICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgIHNvdXJjZTogJ0Vuc2VtYmxlLnNldENvbnRleHRWYWx1ZScsXG4gICAgICAgIGRldGFpbHM6IGBDb250ZXh0IHNpemUgbGltaXQgZXhjZWVkZWQ6ICR7bGltaXRzLk1BWF9DT05URVhUX1NJWkV9YFxuICAgICAgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoRU5TRU1CTEVfRVJST1JTLkNPTlRFWFRfT1ZFUkZMT1cpO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGtleSBleGlzdHMgKHBvdGVudGlhbCBjb25mbGljdClcbiAgICBpZiAodGhpcy5zaGFyZWRDb250ZXh0LnZhbHVlcy5oYXMoc2FuaXRpemVkS2V5KSkge1xuICAgICAgY29uc3QgY3VycmVudE93bmVyID0gdGhpcy5zaGFyZWRDb250ZXh0Lm93bmVycy5nZXQoc2FuaXRpemVkS2V5KSE7XG4gICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB0aGlzLnNoYXJlZENvbnRleHQudmFsdWVzLmdldChzYW5pdGl6ZWRLZXkpO1xuXG4gICAgICAvLyBSZXNvbHZlIGNvbmZsaWN0IGJhc2VkIG9uIHN0cmF0ZWd5XG4gICAgICBjb25zdCByZXNvbHZlZFZhbHVlID0gdGhpcy5yZXNvbHZlQ29uZmxpY3QoXG4gICAgICAgIHNhbml0aXplZEtleSxcbiAgICAgICAgY3VycmVudFZhbHVlLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgY3VycmVudE93bmVyLFxuICAgICAgICBzYW5pdGl6ZWRPd25lclxuICAgICAgKTtcblxuICAgICAgdGhpcy5zaGFyZWRDb250ZXh0LnZhbHVlcy5zZXQoc2FuaXRpemVkS2V5LCByZXNvbHZlZFZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zaGFyZWRDb250ZXh0LnZhbHVlcy5zZXQoc2FuaXRpemVkS2V5LCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgdGhpcy5zaGFyZWRDb250ZXh0Lm93bmVycy5zZXQoc2FuaXRpemVkS2V5LCBzYW5pdGl6ZWRPd25lcik7XG4gICAgdGhpcy5zaGFyZWRDb250ZXh0LnRpbWVzdGFtcHMuc2V0KHNhbml0aXplZEtleSwgbmV3IERhdGUoKSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgdmFsdWUgZnJvbSBzaGFyZWQgY29udGV4dFxuICAgKi9cbiAgcHVibGljIGdldENvbnRleHRWYWx1ZShrZXk6IHN0cmluZyk6IHVua25vd24ge1xuICAgIGNvbnN0IHNhbml0aXplZEtleSA9IHNhbml0aXplSW5wdXQoa2V5LCAxMDApO1xuICAgIHJldHVybiB0aGlzLnNoYXJlZENvbnRleHQudmFsdWVzLmdldChzYW5pdGl6ZWRLZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGFsbCBvciBzcGVjaWZpYyBjb250ZXh0IHZhbHVlc1xuICAgKlxuICAgKiBAcGFyYW0gb3duZXJFbGVtZW50TmFtZSAtIE9wdGlvbmFsOiBvbmx5IGNsZWFyIHZhbHVlcyBvd25lZCBieSB0aGlzIGVsZW1lbnRcbiAgICogQHRocm93cyBFcnJvciBpZiB0cnlpbmcgdG8gY2xlYXIgZHVyaW5nIGFjdGl2YXRpb25cbiAgICovXG4gIHB1YmxpYyBjbGVhckNvbnRleHQob3duZXJFbGVtZW50TmFtZT86IHN0cmluZyk6IHZvaWQge1xuICAgIC8vIFByZXZlbnQgY2xlYXJpbmcgZHVyaW5nIGFjdGl2YXRpb25cbiAgICBpZiAodGhpcy5hY3RpdmF0aW9uSW5Qcm9ncmVzcykge1xuICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgICdBdHRlbXB0aW5nIHRvIGNsZWFyIGNvbnRleHQgZHVyaW5nIGVuc2VtYmxlIGFjdGl2YXRpb24uICcgK1xuICAgICAgICAnVGhpcyBvcGVyYXRpb24gd2lsbCBwcm9jZWVkIGJ1dCBtYXkgY2F1c2UgdW5leHBlY3RlZCBiZWhhdmlvci4nXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChvd25lckVsZW1lbnROYW1lKSB7XG4gICAgICBjb25zdCBzYW5pdGl6ZWRPd25lciA9IHNhbml0aXplSW5wdXQob3duZXJFbGVtZW50TmFtZSwgMTAwKTtcblxuICAgICAgLy8gVmFsaWRhdGUgb3duZXIgZXhpc3RzXG4gICAgICBpZiAoIXRoaXMuaGFzRWxlbWVudChzYW5pdGl6ZWRPd25lcikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBPd25lciBlbGVtZW50ICcke3Nhbml0aXplZE93bmVyfScgbm90IGZvdW5kIGluIGVuc2VtYmxlLiBgICtcbiAgICAgICAgICBgQ2Fubm90IGNsZWFyIGNvbnRleHQgZm9yIG5vbi1leGlzdGVudCBlbGVtZW50LmBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2xlYXIgb25seSB2YWx1ZXMgb3duZWQgYnkgdGhpcyBlbGVtZW50XG4gICAgICBsZXQgY2xlYXJlZENvdW50ID0gMDtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgb3duZXJdIG9mIHRoaXMuc2hhcmVkQ29udGV4dC5vd25lcnMpIHtcbiAgICAgICAgaWYgKG93bmVyID09PSBzYW5pdGl6ZWRPd25lcikge1xuICAgICAgICAgIHRoaXMuc2hhcmVkQ29udGV4dC52YWx1ZXMuZGVsZXRlKGtleSk7XG4gICAgICAgICAgdGhpcy5zaGFyZWRDb250ZXh0Lm93bmVycy5kZWxldGUoa2V5KTtcbiAgICAgICAgICB0aGlzLnNoYXJlZENvbnRleHQudGltZXN0YW1wcy5kZWxldGUoa2V5KTtcbiAgICAgICAgICBjbGVhcmVkQ291bnQrKztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsb2dnZXIuZGVidWcoYENsZWFyZWQgJHtjbGVhcmVkQ291bnR9IGNvbnRleHQgdmFsdWVzIG93bmVkIGJ5ICR7c2FuaXRpemVkT3duZXJ9YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENsZWFyIGFsbCBjb250ZXh0XG4gICAgICBjb25zdCB0b3RhbENvdW50ID0gdGhpcy5zaGFyZWRDb250ZXh0LnZhbHVlcy5zaXplO1xuICAgICAgdGhpcy5zaGFyZWRDb250ZXh0LnZhbHVlcy5jbGVhcigpO1xuICAgICAgdGhpcy5zaGFyZWRDb250ZXh0Lm93bmVycy5jbGVhcigpO1xuICAgICAgdGhpcy5zaGFyZWRDb250ZXh0LnRpbWVzdGFtcHMuY2xlYXIoKTtcblxuICAgICAgbG9nZ2VyLmluZm8oYENsZWFyZWQgYWxsIHNoYXJlZCBjb250ZXh0ICgke3RvdGFsQ291bnR9IHZhbHVlcylgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVHlwZSBndWFyZCB0byBjaGVjayBpZiBhIHZhbHVlIGlzIGEgcGxhaW4gb2JqZWN0IChub3QgbnVsbCwgbm90IGFycmF5KVxuICAgKi9cbiAgcHJpdmF0ZSBpc1BsYWluT2JqZWN0KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIHJldHVybiAoXG4gICAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgICAgIUFycmF5LmlzQXJyYXkodmFsdWUpICYmXG4gICAgICBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBPYmplY3RdJ1xuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBhIGNvbnRleHQgY29uZmxpY3QgYmFzZWQgb24gY29uZmlndXJlZCBzdHJhdGVneVxuICAgKi9cbiAgcHJpdmF0ZSByZXNvbHZlQ29uZmxpY3QoXG4gICAga2V5OiBzdHJpbmcsXG4gICAgY3VycmVudFZhbHVlOiB1bmtub3duLFxuICAgIG5ld1ZhbHVlOiB1bmtub3duLFxuICAgIGN1cnJlbnRPd25lcjogc3RyaW5nLFxuICAgIG5ld093bmVyOiBzdHJpbmdcbiAgKTogdW5rbm93biB7XG4gICAgY29uc3QgY29uZmxpY3Q6IENvbnRleHRDb25mbGljdCA9IHtcbiAgICAgIGtleSxcbiAgICAgIGN1cnJlbnRWYWx1ZSxcbiAgICAgIGN1cnJlbnRPd25lcixcbiAgICAgIG5ld1ZhbHVlLFxuICAgICAgbmV3T3duZXIsXG4gICAgICByZXNvbHZlZEJ5OiB0aGlzLm1ldGFkYXRhLmNvbmZsaWN0UmVzb2x1dGlvblxuICAgIH07XG5cbiAgICBzd2l0Y2ggKHRoaXMubWV0YWRhdGEuY29uZmxpY3RSZXNvbHV0aW9uKSB7XG4gICAgICBjYXNlICdsYXN0LXdyaXRlJzpcbiAgICAgICAgY29uZmxpY3QucmVzb2x1dGlvbiA9IG5ld1ZhbHVlO1xuICAgICAgICByZXR1cm4gbmV3VmFsdWU7XG5cbiAgICAgIGNhc2UgJ2ZpcnN0LXdyaXRlJzpcbiAgICAgICAgY29uZmxpY3QucmVzb2x1dGlvbiA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRWYWx1ZTtcblxuICAgICAgY2FzZSAncHJpb3JpdHknOiB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRFbGVtZW50ID0gdGhpcy5maW5kRWxlbWVudEJ5TmFtZShjdXJyZW50T3duZXIpO1xuICAgICAgICBjb25zdCBuZXdFbGVtZW50ID0gdGhpcy5maW5kRWxlbWVudEJ5TmFtZShuZXdPd25lcik7XG4gICAgICAgIGlmIChuZXdFbGVtZW50ICYmIGN1cnJlbnRFbGVtZW50KSB7XG4gICAgICAgICAgY29uZmxpY3QucmVzb2x1dGlvbiA9IG5ld0VsZW1lbnQucHJpb3JpdHkgPiBjdXJyZW50RWxlbWVudC5wcmlvcml0eSA/XG4gICAgICAgICAgICBuZXdWYWx1ZSA6IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICByZXR1cm4gY29uZmxpY3QucmVzb2x1dGlvbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3VmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ21lcmdlJzpcbiAgICAgICAgLy8gQXR0ZW1wdCB0byBtZXJnZSBpZiBib3RoIGFyZSBwbGFpbiBvYmplY3RzICh3aXRoIHR5cGUgZ3VhcmRzKVxuICAgICAgICBpZiAodGhpcy5pc1BsYWluT2JqZWN0KGN1cnJlbnRWYWx1ZSkgJiYgdGhpcy5pc1BsYWluT2JqZWN0KG5ld1ZhbHVlKSkge1xuICAgICAgICAgIC8vIFNFQ1VSSVRZOiBTcHJlYWQgb3BlcmF0b3IgaXMgc2FmZSBmcm9tIHByb3RvdHlwZSBwb2xsdXRpb25cbiAgICAgICAgICAvLyBfX3Byb3RvX18gYmVjb21lcyBhIHJlZ3VsYXIgcHJvcGVydHkga2V5LCBkb2VzIG5vdCBtb2RpZnkgT2JqZWN0LnByb3RvdHlwZVxuICAgICAgICAgIC8vIFNlZTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvT3BlcmF0b3JzL1NwcmVhZF9zeW50YXhcbiAgICAgICAgICAvLyBUZXN0ZWQ6IEFsbCBwcm90b3R5cGUgcG9sbHV0aW9uIGF0dGFjayB2ZWN0b3JzIGJsb2NrZWQgKHNlZSB0ZXN0cy9zZWN1cml0eS9lbnNlbWJsZS1zZWN1cml0eS1hdWRpdC50ZXN0LnRzKVxuICAgICAgICAgIGNvbmZsaWN0LnJlc29sdXRpb24gPSB7IC4uLmN1cnJlbnRWYWx1ZSwgLi4ubmV3VmFsdWUgfTtcbiAgICAgICAgICByZXR1cm4gY29uZmxpY3QucmVzb2x1dGlvbjtcbiAgICAgICAgfVxuICAgICAgICAvLyBGYWxsIGJhY2sgdG8gbGFzdC13cml0ZSBpZiBjYW4ndCBtZXJnZVxuICAgICAgICBjb25mbGljdC5yZXNvbHV0aW9uID0gbmV3VmFsdWU7XG4gICAgICAgIHJldHVybiBuZXdWYWx1ZTtcblxuICAgICAgY2FzZSAnZXJyb3InOlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYENvbnRleHQgY29uZmxpY3Qgb24ga2V5ICcke2tleX0nOiAke2N1cnJlbnRPd25lcn0gdnMgJHtuZXdPd25lcn1gXG4gICAgICAgICk7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBuZXdWYWx1ZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGFjdGl2YXRpb24gbWV0cmljcyBhZnRlciBhbiBhY3RpdmF0aW9uIGF0dGVtcHRcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgdXBkYXRlQWN0aXZhdGlvbk1ldHJpY3MocmVzdWx0OiBFbnNlbWJsZUFjdGl2YXRpb25SZXN1bHQsIG5lc3RpbmdEZXB0aDogbnVtYmVyID0gMCk6IHZvaWQge1xuICAgIGNvbnN0IGR1cmF0aW9uID0gcmVzdWx0LnRvdGFsRHVyYXRpb247XG5cbiAgICB0aGlzLmFjdGl2YXRpb25NZXRyaWNzLnRvdGFsQWN0aXZhdGlvbnMrKztcbiAgICBpZiAocmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgIHRoaXMuYWN0aXZhdGlvbk1ldHJpY3Muc3VjY2Vzc2Z1bEFjdGl2YXRpb25zKys7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYWN0aXZhdGlvbk1ldHJpY3MuZmFpbGVkQWN0aXZhdGlvbnMrKztcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgZHVyYXRpb24gc3RhdGlzdGljc1xuICAgIHRoaXMuYWN0aXZhdGlvbk1ldHJpY3MubWluRHVyYXRpb24gPSBNYXRoLm1pbih0aGlzLmFjdGl2YXRpb25NZXRyaWNzLm1pbkR1cmF0aW9uLCBkdXJhdGlvbik7XG4gICAgdGhpcy5hY3RpdmF0aW9uTWV0cmljcy5tYXhEdXJhdGlvbiA9IE1hdGgubWF4KHRoaXMuYWN0aXZhdGlvbk1ldHJpY3MubWF4RHVyYXRpb24sIGR1cmF0aW9uKTtcblxuICAgIC8vIFVwZGF0ZSBhdmVyYWdlIGR1cmF0aW9uIChydW5uaW5nIGF2ZXJhZ2UpXG4gICAgY29uc3QgcHJldkF2ZyA9IHRoaXMuYWN0aXZhdGlvbk1ldHJpY3MuYXZlcmFnZUR1cmF0aW9uO1xuICAgIGNvbnN0IHRvdGFsQ291bnQgPSB0aGlzLmFjdGl2YXRpb25NZXRyaWNzLnRvdGFsQWN0aXZhdGlvbnM7XG4gICAgdGhpcy5hY3RpdmF0aW9uTWV0cmljcy5hdmVyYWdlRHVyYXRpb24gPVxuICAgICAgKHByZXZBdmcgKiAodG90YWxDb3VudCAtIDEpICsgZHVyYXRpb24pIC8gdG90YWxDb3VudDtcblxuICAgIC8vIFRyYWNrIG5lc3RlZCBlbnNlbWJsZSBjb3VudFxuICAgIGNvbnN0IG5lc3RlZENvdW50ID0gcmVzdWx0LmFjdGl2YXRlZEVsZW1lbnRzLmZpbHRlcihuYW1lID0+IHtcbiAgICAgIGNvbnN0IGVsZW0gPSB0aGlzLmZpbmRFbGVtZW50QnlOYW1lKG5hbWUpO1xuICAgICAgcmV0dXJuIGVsZW0/LmVsZW1lbnRfdHlwZSA9PT0gJ2Vuc2VtYmxlJztcbiAgICB9KS5sZW5ndGg7XG4gICAgdGhpcy5hY3RpdmF0aW9uTWV0cmljcy5uZXN0ZWRFbnNlbWJsZUNvdW50ICs9IG5lc3RlZENvdW50O1xuXG4gICAgLy8gVHJhY2sgbWF4IG5lc3RpbmcgZGVwdGhcbiAgICB0aGlzLmFjdGl2YXRpb25NZXRyaWNzLm1heE5lc3RpbmdEZXB0aCA9IE1hdGgubWF4KFxuICAgICAgdGhpcy5hY3RpdmF0aW9uTWV0cmljcy5tYXhOZXN0aW5nRGVwdGgsXG4gICAgICBuZXN0aW5nRGVwdGhcbiAgICApO1xuXG4gICAgdGhpcy5hY3RpdmF0aW9uTWV0cmljcy5sYXN0QWN0aXZhdGlvbiA9IG5ldyBEYXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFjdGl2YXRpb24gbWV0cmljcyBmb3IgcGVyZm9ybWFuY2UgbW9uaXRvcmluZ1xuICAgKiBSZXR1cm5zIGEgc25hcHNob3Qgb2YgY3VycmVudCBtZXRyaWNzXG4gICAqL1xuICBwdWJsaWMgZ2V0QWN0aXZhdGlvbk1ldHJpY3MoKTogUmVhZG9ubHk8RW5zZW1ibGVBY3RpdmF0aW9uTWV0cmljcz4ge1xuICAgIHJldHVybiB7IC4uLnRoaXMuYWN0aXZhdGlvbk1ldHJpY3MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGxhc3QgYWN0aXZhdGlvbiByZXN1bHRcbiAgICovXG4gIHB1YmxpYyBnZXRMYXN0QWN0aXZhdGlvblJlc3VsdCgpOiBFbnNlbWJsZUFjdGl2YXRpb25SZXN1bHQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmxhc3RBY3RpdmF0aW9uUmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgZWxlbWVudHMgaW4gdGhlIGVuc2VtYmxlXG4gICAqL1xuICBwdWJsaWMgZ2V0RWxlbWVudHMoKTogRW5zZW1ibGVFbGVtZW50W10ge1xuICAgIHJldHVybiBbLi4udGhpcy5lbGVtZW50c107XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgc3BlY2lmaWMgZWxlbWVudCBieSBuYW1lXG4gICAqL1xuICBwdWJsaWMgZ2V0RWxlbWVudChuYW1lOiBzdHJpbmcpOiBFbnNlbWJsZUVsZW1lbnQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZpbmRFbGVtZW50QnlOYW1lKHNhbml0aXplSW5wdXQobmFtZSwgMTAwKSk7XG4gIH1cbn1cblxuLy8gUmUtZXhwb3J0IHR5cGVzIGZvciBjb252ZW5pZW5jZVxuZXhwb3J0IHR5cGUgeyBFbnNlbWJsZU1ldGFkYXRhLCBFbnNlbWJsZUVsZW1lbnQgfSBmcm9tICcuL3R5cGVzLmpzJztcbiJdfQ==
|
|
1830
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRW5zZW1ibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZWxlbWVudHMvZW5zZW1ibGVzL0Vuc2VtYmxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBRUgsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2hELE9BQU8sRUFLTCxhQUFhLEVBQ2QsTUFBTSwrQkFBK0IsQ0FBQztBQUN2QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFFekIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNwRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFXL0MsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixxQkFBcUIsRUFDckIsbUJBQW1CLEVBQ25CLGFBQWEsRUFDYix3QkFBd0IsRUFDeEIsZUFBZSxFQUNmLGlCQUFpQixFQUNqQiw0QkFBNEIsRUFDNUIsa0JBQWtCLEVBR25CLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEI7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxPQUFPLFFBQVMsU0FBUSxXQUFXO0lBRXZDLHFGQUFxRjtJQUVyRiw4REFBOEQ7SUFDdEQsUUFBUSxHQUFzQixFQUFFLENBQUM7SUFDakMsZ0JBQWdCLEdBQTBCLElBQUksR0FBRyxFQUFFLENBQUM7SUFDM0MsdUJBQXVCLEdBQUcsR0FBRyxDQUFDO0lBQ3ZDLG1CQUFtQixHQUF3QixJQUFJLEdBQUcsRUFBRSxDQUFDO0lBRTdELGlEQUFpRDtJQUN6QyxhQUFhLENBQWdCO0lBRXJDLG1CQUFtQjtJQUNYLG9C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QUksSUFBSSxFQUFFLENBQUM7SUFDckQsQ0FBQztJQUVEOzs7T0FHRztJQUNJLG9CQUFvQjtRQUN6QixPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBRUQ7O09BRUc7SUFDSSx1QkFBdUI7UUFDNUIsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUM7SUFDbkMsQ0FBQztJQUVEOztPQUVHO0lBQ0ksV0FBVztRQUNoQixPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksVUFBVSxDQUFDLElBQVk7UUFDNUIsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzFELENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRW5zZW1ibGUgRWxlbWVudCAtIE9yY2hlc3RyYXRlcyBtdWx0aXBsZSBlbGVtZW50cyB3b3JraW5nIHRvZ2V0aGVyXG4gKlxuICogRW5zZW1ibGVzIGFsbG93IGNvbWJpbmluZyBtdWx0aXBsZSBlbGVtZW50cyAocGVyc29uYXMsIHNraWxscywgdGVtcGxhdGVzLCBhZ2VudHMsIG1lbW9yaWVzKVxuICogaW50byBjb2hlc2l2ZSB1bml0cyB3aXRoIGNvbnRyb2xsZWQgYWN0aXZhdGlvbiwgY29uZmxpY3QgcmVzb2x1dGlvbiwgYW5kIHNoYXJlZCBjb250ZXh0LlxuICpcbiAqIEFSQ0hJVEVDVFVSRTpcbiAqIC0gRXh0ZW5kcyBCYXNlRWxlbWVudCBmb3Igc3RhbmRhcmQgZWxlbWVudCBiZWhhdmlvclxuICogLSBQdXJlIGJ1c2luZXNzIGxvZ2ljIChubyBmaWxlIG9wZXJhdGlvbnMpXG4gKiAtIFBvcnRmb2xpby1hZ25vc3RpYyAoUG9ydGZvbGlvTWFuYWdlciBwYXNzZWQgdG8gYWN0aXZhdGUoKSlcbiAqXG4gKiBTRUNVUklUWSBNRUFTVVJFUzpcbiAqIDEuIENpcmN1bGFyIGRlcGVuZGVuY3kgZGV0ZWN0aW9uIHdpdGggREZTIGFsZ29yaXRobVxuICogMi4gUmVzb3VyY2UgbGltaXRzIChtYXggZWxlbWVudHMsIG5lc3RpbmcgZGVwdGgsIGFjdGl2YXRpb24gdGltZSlcbiAqIDMuIElucHV0IHNhbml0aXphdGlvbiBmb3IgYWxsIHVzZXItcHJvdmlkZWQgZGF0YVxuICogNC4gQWN0aXZhdGlvbiB0aW1lb3V0IHByb3RlY3Rpb25cbiAqIDUuIENvbnRleHQgc2l6ZSBsaW1pdHMgdG8gcHJldmVudCBtZW1vcnkgZXhoYXVzdGlvblxuICogNi4gQXVkaXQgbG9nZ2luZyBmb3Igc2VjdXJpdHkgZXZlbnRzXG4gKiA3LiBDb25kaXRpb24gdmFsaWRhdGlvbiB0byBwcmV2ZW50IGNvZGUgaW5qZWN0aW9uXG4gKi9cblxuaW1wb3J0IHsgQmFzZUVsZW1lbnQgfSBmcm9tICcuLi9CYXNlRWxlbWVudC5qcyc7XG5pbXBvcnQge1xuICBJRWxlbWVudCxcbiAgRWxlbWVudFZhbGlkYXRpb25SZXN1bHQsXG4gIFZhbGlkYXRpb25FcnJvcixcbiAgVmFsaWRhdGlvbldhcm5pbmcsXG4gIEVsZW1lbnRTdGF0dXNcbn0gZnJvbSAnLi4vLi4vdHlwZXMvZWxlbWVudHMvaW5kZXguanMnO1xuaW1wb3J0IHsgRWxlbWVudFR5cGUgfSBmcm9tICcuLi8uLi9wb3J0Zm9saW8vdHlwZXMuanMnO1xuaW1wb3J0ICogYXMgdm0gZnJvbSAndm0nO1xuaW1wb3J0IHsgUG9ydGZvbGlvTWFuYWdlciB9IGZyb20gJy4uLy4uL3BvcnRmb2xpby9Qb3J0Zm9saW9NYW5hZ2VyLmpzJztcbmltcG9ydCB7IHNhbml0aXplSW5wdXQgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9JbnB1dFZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBVbmljb2RlVmFsaWRhdG9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvdmFsaWRhdG9ycy91bmljb2RlVmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IFNlY3VyaXR5TW9uaXRvciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L3NlY3VyaXR5TW9uaXRvci5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgTWV0YWRhdGFTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvTWV0YWRhdGFTZXJ2aWNlLmpzJztcbmltcG9ydCB7XG4gIEVuc2VtYmxlTWV0YWRhdGEsXG4gIEVuc2VtYmxlRWxlbWVudCxcbiAgU2hhcmVkQ29udGV4dCxcbiAgRW5zZW1ibGVBY3RpdmF0aW9uUmVzdWx0LFxuICBDb250ZXh0Q29uZmxpY3QsXG4gIENpcmN1bGFyRGVwZW5kZW5jeSxcbiAgRW5zZW1ibGVBY3RpdmF0aW9uTWV0cmljc1xufSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7XG4gIEVOU0VNQkxFX0RFRkFVTFRTLFxuICBBQ1RJVkFUSU9OX1NUUkFURUdJRVMsXG4gIENPTkZMSUNUX1NUUkFURUdJRVMsXG4gIEVMRU1FTlRfUk9MRVMsXG4gIEVOU0VNQkxFX1NFQ1VSSVRZX0VWRU5UUyxcbiAgRU5TRU1CTEVfRVJST1JTLFxuICBFTlNFTUJMRV9QQVRURVJOUyxcbiAgREFOR0VST1VTX0NPTkRJVElPTl9QQVRURVJOUyxcbiAgZ2V0RWZmZWN0aXZlTGltaXRzLFxuICBFbnNlbWJsZUxpbWl0c0NvbmZpZyxcbiAgUmVzb2x2ZWRFbnNlbWJsZUxpbWl0c1xufSBmcm9tICcuL2NvbnN0YW50cy5qcyc7XG5cbi8qKlxuICogRW5zZW1ibGUgY2xhc3MgLSBPcmNoZXN0cmF0ZXMgbXVsdGlwbGUgZWxlbWVudHMgYXMgYSBjb2hlc2l2ZSB1bml0XG4gKlxuICogRXh0ZW5kcyBCYXNlRWxlbWVudCB0byBpbmhlcml0OlxuICogLSBTdGFuZGFyZCB2YWxpZGF0aW9uXG4gKiAtIFNlcmlhbGl6YXRpb25cbiAqIC0gTWV0YWRhdGEgbWFuYWdlbWVudFxuICogLSBJRCBnZW5lcmF0aW9uXG4gKiAtIFN0YXR1cyB0cmFja2luZ1xuICovXG5leHBvcnQgY2xhc3MgRW5zZW1ibGUgZXh0ZW5kcyBCYXNlRWxlbWVudCBpbXBsZW1lbnRzIElFbGVtZW50IHtcbiAgcHVibGljIGRlY2xhcmUgbWV0YWRhdGE6IEVuc2VtYmxlTWV0YWRhdGE7XG4gIC8vIGluc3RydWN0aW9ucyBhbmQgY29udGVudCBpbmhlcml0ZWQgZnJvbSBCYXNlRWxlbWVudCAodjIuMCBkdWFsLWZpZWxkIGFyY2hpdGVjdHVyZSlcblxuICAvLyBFbGVtZW50IG1hbmFnZW1lbnQgLSB1c2luZyBhcnJheSBmb3Igc2luZ2xlIHNvdXJjZSBvZiB0cnV0aFxuICBwcml2YXRlIGVsZW1lbnRzOiBFbnNlbWJsZUVsZW1lbnRbXSA9IFtdO1xuICBwcml2YXRlIGVsZW1lbnRJbnN0YW5jZXM6IE1hcDxzdHJpbmcsIElFbGVtZW50PiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBNQVhfSU5TVEFOQ0VfQ0FDSEVfU0laRSA9IDEwMDtcbiAgcHJpdmF0ZSBpbnN0YW5jZUFjY2Vzc1RpbWVzOiBNYXA8c3RyaW5nLCBudW1iZXI+ID0gbmV3IE1hcCgpO1xuXG4gIC8vIFNoYXJlZCBjb250ZXh0IGZvciBpbnRlci1lbGVtZW50IGNvbW11bmljYXRpb25cbiAgcHJpdmF0ZSBzaGFyZWRDb250ZXh0OiBTaGFyZWRDb250ZXh0O1xuXG4gIC8vIEFjdGl2YXRpb24gc3RhdGVcbiAgcHJpdmF0ZSBhY3RpdmF0aW9uSW5Qcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIGxhc3RBY3RpdmF0aW9uUmVzdWx0PzogRW5zZW1ibGVBY3RpdmF0aW9uUmVzdWx0O1xuXG4gIC8vIEFjdGl2YXRpb24gbWV0cmljcyBmb3IgcGVyZm9ybWFuY2UgbW9uaXRvcmluZ1xuICBwcml2YXRlIGFjdGl2YXRpb25NZXRyaWNzOiBFbnNlbWJsZUFjdGl2YXRpb25NZXRyaWNzID0ge1xuICAgIHRvdGFsQWN0aXZhdGlvbnM6IDAsXG4gICAgc3VjY2Vzc2Z1bEFjdGl2YXRpb25zOiAwLFxuICAgIGZhaWxlZEFjdGl2YXRpb25zOiAwLFxuICAgIGF2ZXJhZ2VEdXJhdGlvbjogMCxcbiAgICBtaW5EdXJhdGlvbjogSW5maW5pdHksXG4gICAgbWF4RHVyYXRpb246IDAsXG4gICAgbmVzdGVkRW5zZW1ibGVDb3VudDogMCxcbiAgICBtYXhOZXN0aW5nRGVwdGg6IDBcbiAgfTtcblxuICAvLyBDYWNoZWQgZWZmZWN0aXZlIGxpbWl0cyAoY29tcHV0ZWQgb25jZSBwZXIgZW5zZW1ibGUsIHJlc3BlY3RzIHBlci1lbnNlbWJsZSBvdmVycmlkZXMpXG4gIHByaXZhdGUgX2VmZmVjdGl2ZUxpbWl0czogUmVzb2x2ZWRFbnNlbWJsZUxpbWl0cyB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBHZXQgZWZmZWN0aXZlIGxpbWl0cyBmb3IgdGhpcyBlbnNlbWJsZVxuICAgKlxuICAgKiBSZXNvbHZlcyBsaW1pdHMgaW4gcHJpb3JpdHkgb3JkZXI6XG4gICAqIDEuIFBlci1lbnNlbWJsZSBvdmVycmlkZXMgKGZyb20gbWV0YWRhdGEucmVzb3VyY2VMaW1pdHMpXG4gICAqIDIuIEdsb2JhbCBjb25maWd1cmF0aW9uIChzZXRHbG9iYWxFbnNlbWJsZUxpbWl0cygpKVxuICAgKiAzLiBFbnZpcm9ubWVudCB2YXJpYWJsZXMgKEVOU0VNQkxFX01BWF8qKVxuICAgKiA0LiBEZWZhdWx0IHZhbHVlc1xuICAgKlxuICAgKiBSZXN1bHRzIGFyZSBjYWNoZWQgZm9yIHBlcmZvcm1hbmNlLiBDYWxsIGludmFsaWRhdGVMaW1pdHNDYWNoZSgpIHRvIHJlZnJlc2guXG4gICAqXG4gICAqIEByZXR1cm5zIFJlc29sdmVkIGxpbWl0cyBvYmplY3RcbiAgICovXG4gIHB1YmxpYyBnZXRFZmZlY3RpdmVMaW1pdHMoKTogUmVzb2x2ZWRFbnNlbWJsZUxpbWl0cyB7XG4gICAgaWYgKHRoaXMuX2VmZmVjdGl2ZUxpbWl0cyA9PT0gbnVsbCkge1xuICAgICAgLy8gQ29udmVydCBSZXNvdXJjZUxpbWl0cyAocGVyLWVuc2VtYmxlIEFQSSkgdG8gRW5zZW1ibGVMaW1pdHNDb25maWcgKGludGVybmFsIGNvbmZpZyBmb3JtYXQpXG4gICAgICAvL1xuICAgICAgLy8gRmllbGQgbmFtZSBtYXBwaW5nIChoaXN0b3JpY2FsIHJlYXNvbnMgLSBSZXNvdXJjZUxpbWl0cyBwcmVkYXRlcyBjb25maWd1cmFibGUgbGltaXRzKTpcbiAgICAgIC8vICAgUmVzb3VyY2VMaW1pdHMubWF4QWN0aXZlRWxlbWVudHMgIC0+IEVuc2VtYmxlTGltaXRzQ29uZmlnLm1heEVsZW1lbnRzXG4gICAgICAvLyAgIFJlc291cmNlTGltaXRzLm1heEV4ZWN1dGlvblRpbWVNcyAtPiBFbnNlbWJsZUxpbWl0c0NvbmZpZy5tYXhBY3RpdmF0aW9uVGltZVxuICAgICAgLy8gICBPdGhlciBmaWVsZHMgaGF2ZSBtYXRjaGluZyBuYW1lcyAobWF4TmVzdGluZ0RlcHRoLCBtYXhDb250ZXh0U2l6ZSwgZXRjLilcbiAgICAgIGNvbnN0IG92ZXJyaWRlczogUGFydGlhbDxFbnNlbWJsZUxpbWl0c0NvbmZpZz4gPSB7fTtcbiAgICAgIGNvbnN0IHJlc291cmNlTGltaXRzID0gdGhpcy5tZXRhZGF0YS5yZXNvdXJjZUxpbWl0cztcblxuICAgICAgaWYgKHJlc291cmNlTGltaXRzKSB7XG4gICAgICAgIGlmIChyZXNvdXJjZUxpbWl0cy5tYXhBY3RpdmVFbGVtZW50cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgb3ZlcnJpZGVzLm1heEVsZW1lbnRzID0gcmVzb3VyY2VMaW1pdHMubWF4QWN0aXZlRWxlbWVudHM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc291cmNlTGltaXRzLm1heEV4ZWN1dGlvblRpbWVNcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgb3ZlcnJpZGVzLm1heEFjdGl2YXRpb25UaW1lID0gcmVzb3VyY2VMaW1pdHMubWF4RXhlY3V0aW9uVGltZU1zO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXNvdXJjZUxpbWl0cy5tYXhOZXN0aW5nRGVwdGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIG92ZXJyaWRlcy5tYXhOZXN0aW5nRGVwdGggPSByZXNvdXJjZUxpbWl0cy5tYXhOZXN0aW5nRGVwdGg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc291cmNlTGltaXRzLm1heENvbnRleHRTaXplICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBvdmVycmlkZXMubWF4Q29udGV4dFNpemUgPSByZXNvdXJjZUxpbWl0cy5tYXhDb250ZXh0U2l6ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzb3VyY2VMaW1pdHMubWF4Q29udGV4dFZhbHVlU2l6ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgb3ZlcnJpZGVzLm1heENvbnRleHRWYWx1ZVNpemUgPSByZXNvdXJjZUxpbWl0cy5tYXhDb250ZXh0VmFsdWVTaXplO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXNvdXJjZUxpbWl0cy5tYXhEZXBlbmRlbmNpZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIG92ZXJyaWRlcy5tYXhEZXBlbmRlbmNpZXMgPSByZXNvdXJjZUxpbWl0cy5tYXhEZXBlbmRlbmNpZXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc291cmNlTGltaXRzLm1heENvbmRpdGlvbkxlbmd0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgb3ZlcnJpZGVzLm1heENvbmRpdGlvbkxlbmd0aCA9IHJlc291cmNlTGltaXRzLm1heENvbmRpdGlvbkxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLl9lZmZlY3RpdmVMaW1pdHMgPSBnZXRFZmZlY3RpdmVMaW1pdHMob3ZlcnJpZGVzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2VmZmVjdGl2ZUxpbWl0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnZhbGlkYXRlIGNhY2hlZCBsaW1pdHMgKGNhbGwgd2hlbiByZXNvdXJjZUxpbWl0cyBjaGFuZ2VzKVxuICAgKi9cbiAgcHVibGljIGludmFsaWRhdGVMaW1pdHNDYWNoZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9lZmZlY3RpdmVMaW1pdHMgPSBudWxsO1xuICB9XG5cbiAgY29uc3RydWN0b3IobWV0YWRhdGE6IFBhcnRpYWw8RW5zZW1ibGVNZXRhZGF0YT4sIGVsZW1lbnRzOiBFbnNlbWJsZUVsZW1lbnRbXSA9IFtdLCBtZXRhZGF0YVNlcnZpY2U6IE1ldGFkYXRhU2VydmljZSkge1xuICAgIC8vIFNFQ1VSSVRZOiBTYW5pdGl6ZSBhbGwgaW5wdXRzXG4gICAgLy8gTk9URTogV2UgcHJlc2VydmUgZW1wdHkgc3RyaW5ncyBzbyB2YWxpZGF0aW9uIGNhbiBjYXRjaCB0aGVtXG4gICAgY29uc3Qgc2FuaXRpemVkTWV0YWRhdGE6IFBhcnRpYWw8RW5zZW1ibGVNZXRhZGF0YT4gPSB7XG4gICAgICAuLi5tZXRhZGF0YSxcbiAgICAgIG5hbWU6IG1ldGFkYXRhLm5hbWUgIT09IHVuZGVmaW5lZCA/IChcbiAgICAgICAgbWV0YWRhdGEubmFtZSA9PT0gJycgPyAnJyA6ICAvLyBQcmVzZXJ2ZSBlbXB0eSBzdHJpbmcgZm9yIHZhbGlkYXRpb25cbiAgICAgICAgc2FuaXRpemVJbnB1dChVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShtZXRhZGF0YS5uYW1lKS5ub3JtYWxpemVkQ29udGVudCwgMTAwKVxuICAgICAgKSA6IHVuZGVmaW5lZCxcbiAgICAgIGRlc2NyaXB0aW9uOiBtZXRhZGF0YS5kZXNjcmlwdGlvbiAhPT0gdW5kZWZpbmVkID8gKFxuICAgICAgICBtZXRhZGF0YS5kZXNjcmlwdGlvbiA9PT0gJycgPyAnJyA6ICAvLyBQcmVzZXJ2ZSBlbXB0eSBzdHJpbmcgZm9yIHZhbGlkYXRpb25cbiAgICAgICAgc2FuaXRpemVJbnB1dChVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShtZXRhZGF0YS5kZXNjcmlwdGlvbikubm9ybWFsaXplZENvbnRlbnQsIDUwMClcbiAgICAgICkgOiB1bmRlZmluZWRcbiAgICB9O1xuXG4gICAgLy8gVmFsaWRhdGUgYWN0aXZhdGlvbiBzdHJhdGVneVxuICAgIGNvbnN0IHN0cmF0ZWd5ID0gbWV0YWRhdGEuYWN0aXZhdGlvblN0cmF0ZWd5IHx8IEVOU0VNQkxFX0RFRkFVTFRTLkFDVElWQVRJT05fU1RSQVRFR1k7XG4gICAgaWYgKCFBQ1RJVkFUSU9OX1NUUkFURUdJRVMuaW5jbHVkZXMoc3RyYXRlZ3kgYXMgYW55KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke0VOU0VNQkxFX0VSUk9SUy5JTlZBTElEX1NUUkFURUdZfTogJHtzdHJhdGVneX0uIFZhbGlkIHN0cmF0ZWdpZXM6ICR7QUNUSVZBVElPTl9TVFJBVEVHSUVTLmpvaW4oJywgJyl9YCk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgY29uZmxpY3QgcmVzb2x1dGlvbiBzdHJhdGVneVxuICAgIGNvbnN0IGNvbmZsaWN0UmVzID0gbWV0YWRhdGEuY29uZmxpY3RSZXNvbHV0aW9uIHx8IEVOU0VNQkxFX0RFRkFVTFRTLkNPTkZMSUNUX1JFU09MVVRJT047XG4gICAgaWYgKCFDT05GTElDVF9TVFJBVEVHSUVTLmluY2x1ZGVzKGNvbmZsaWN0UmVzIGFzIGFueSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtFTlNFTUJMRV9FUlJPUlMuSU5WQUxJRF9DT05GTElDVF9SRVNPTFVUSU9OfTogJHtjb25mbGljdFJlc30uIFZhbGlkIHN0cmF0ZWdpZXM6ICR7Q09ORkxJQ1RfU1RSQVRFR0lFUy5qb2luKCcsICcpfWApO1xuICAgIH1cblxuICAgIC8vIENhbGwgQmFzZUVsZW1lbnQgY29uc3RydWN0b3JcbiAgICBzdXBlcihFbGVtZW50VHlwZS5FTlNFTUJMRSwgc2FuaXRpemVkTWV0YWRhdGEsIG1ldGFkYXRhU2VydmljZSk7XG5cbiAgICAvLyBJbml0aWFsaXplIGVuc2VtYmxlLXNwZWNpZmljIG1ldGFkYXRhXG4gICAgLy8gTk9URTogV2UgcmVzdG9yZSB0aGUgb3JpZ2luYWwgbmFtZSBldmVuIGlmIGVtcHR5LCBzbyB2YWxpZGF0aW9uIGNhbiBjYXRjaCBpdFxuICAgIC8vIE5PVEU6IHJlc291cmNlTGltaXRzIGlzIG9wdGlvbmFsIC0gcGVyLWVuc2VtYmxlIG92ZXJyaWRlcyBhcmUgcmVzb2x2ZWQgdmlhIGdldEVmZmVjdGl2ZUxpbWl0cygpXG4gICAgdGhpcy5tZXRhZGF0YSA9IHtcbiAgICAgIC4uLnRoaXMubWV0YWRhdGEsXG4gICAgICBuYW1lOiBzYW5pdGl6ZWRNZXRhZGF0YS5uYW1lICE9PSB1bmRlZmluZWQgPyBzYW5pdGl6ZWRNZXRhZGF0YS5uYW1lIDogdGhpcy5tZXRhZGF0YS5uYW1lLFxuICAgICAgYWN0aXZhdGlvblN0cmF0ZWd5OiBzdHJhdGVneSxcbiAgICAgIGNvbmZsaWN0UmVzb2x1dGlvbjogY29uZmxpY3RSZXMsXG4gICAgICBjb250ZXh0U2hhcmluZzogbWV0YWRhdGEuY29udGV4dFNoYXJpbmcgfHwgRU5TRU1CTEVfREVGQVVMVFMuQ09OVEVYVF9TSEFSSU5HLFxuICAgICAgcmVzb3VyY2VMaW1pdHM6IG1ldGFkYXRhLnJlc291cmNlTGltaXRzLCAvLyBPcHRpb25hbCBwZXItZW5zZW1ibGUgb3ZlcnJpZGVzXG4gICAgICBhbGxvd05lc3RlZDogbWV0YWRhdGEuYWxsb3dOZXN0ZWQgPz8gRU5TRU1CTEVfREVGQVVMVFMuQUxMT1dfTkVTVEVELFxuICAgICAgbWF4TmVzdGluZ0RlcHRoOiBtZXRhZGF0YS5tYXhOZXN0aW5nRGVwdGggfHwgRU5TRU1CTEVfREVGQVVMVFMuTUFYX05FU1RJTkdfREVQVEgsXG4gICAgICBlbGVtZW50czogW11cbiAgICB9IGFzIEVuc2VtYmxlTWV0YWRhdGE7XG5cbiAgICAvLyBJbml0aWFsaXplIHNoYXJlZCBjb250ZXh0XG4gICAgdGhpcy5zaGFyZWRDb250ZXh0ID0ge1xuICAgICAgdmFsdWVzOiBuZXcgTWFwKCksXG4gICAgICBvd25lcnM6IG5ldyBNYXAoKSxcbiAgICAgIHRpbWVzdGFtcHM6IG5ldyBNYXAoKVxuICAgIH07XG5cbiAgICAvLyBJbml0aWFsaXplIGV4dGVuc2lvbnMgZm9yIHRyYWNraW5nXG4gICAgdGhpcy5leHRlbnNpb25zID0ge1xuICAgICAgZWxlbWVudENvdW50OiAwLFxuICAgICAgYWN0aXZhdGlvblN0cmF0ZWd5OiBzdHJhdGVneSxcbiAgICAgIGNvbmZsaWN0UmVzb2x1dGlvbjogY29uZmxpY3RSZXMsXG4gICAgICBsYXN0QWN0aXZhdGlvbjogbnVsbFxuICAgIH07XG5cbiAgICAvLyBBZGQgZWxlbWVudHMgZnJvbSBtZXRhZGF0YVxuICAgIGlmIChlbGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmxvYWRFbGVtZW50c0Zyb21NZXRhZGF0YShlbGVtZW50cyk7XG4gICAgfVxuXG4gICAgLy8gU0VDVVJJVFk6IExvZyBlbnNlbWJsZSBjcmVhdGlvblxuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6ICdFTEVNRU5UX0NSRUFURUQnLFxuICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgc291cmNlOiAnRW5zZW1ibGUuY29uc3RydWN0b3InLFxuICAgICAgZGV0YWlsczogYEVuc2VtYmxlIGNyZWF0ZWQ6ICR7dGhpcy5tZXRhZGF0YS5uYW1lfWAsXG4gICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICBlbGVtZW50Q291bnQ6IHRoaXMuZWxlbWVudHMubGVuZ3RoLFxuICAgICAgICBhY3RpdmF0aW9uU3RyYXRlZ3k6IHRoaXMubWV0YWRhdGEuYWN0aXZhdGlvblN0cmF0ZWd5LFxuICAgICAgICBjb25mbGljdFJlc29sdXRpb246IHRoaXMubWV0YWRhdGEuY29uZmxpY3RSZXNvbHV0aW9uXG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PSBBUlJBWSBIRUxQRVIgTUVUSE9EUyA9PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBGaW5kIGFuIGVsZW1lbnQgYnkgbmFtZSBpbiB0aGUgZWxlbWVudHMgYXJyYXlcbiAgICogQHBhcmFtIG5hbWUgLSBFbGVtZW50IG5hbWUgdG8gc2VhcmNoIGZvclxuICAgKiBAcmV0dXJucyBFbGVtZW50IGlmIGZvdW5kLCB1bmRlZmluZWQgb3RoZXJ3aXNlXG4gICAqL1xuICBwcml2YXRlIGZpbmRFbGVtZW50QnlOYW1lKG5hbWU6IHN0cmluZyk6IEVuc2VtYmxlRWxlbWVudCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudHMuZmluZChlbCA9PiBlbC5lbGVtZW50X25hbWUgPT09IG5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGFuIGVsZW1lbnQgZXhpc3RzIGluIHRoZSBhcnJheVxuICAgKiBAcGFyYW0gbmFtZSAtIEVsZW1lbnQgbmFtZSB0byBjaGVja1xuICAgKiBAcmV0dXJucyB0cnVlIGlmIGVsZW1lbnQgZXhpc3RzLCBmYWxzZSBvdGhlcndpc2VcbiAgICovXG4gIHByaXZhdGUgaGFzRWxlbWVudChuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50cy5zb21lKGVsID0+IGVsLmVsZW1lbnRfbmFtZSA9PT0gbmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGFuIGVsZW1lbnQgZnJvbSB0aGUgYXJyYXkgYnkgbmFtZVxuICAgKiBAcGFyYW0gbmFtZSAtIEVsZW1lbnQgbmFtZSB0byByZW1vdmVcbiAgICogQHJldHVybnMgdHJ1ZSBpZiBlbGVtZW50IHdhcyByZW1vdmVkLCBmYWxzZSBpZiBub3QgZm91bmRcbiAgICovXG4gIHByaXZhdGUgcmVtb3ZlRWxlbWVudEJ5TmFtZShuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuZWxlbWVudHMuZmluZEluZGV4KGVsID0+IGVsLmVsZW1lbnRfbmFtZSA9PT0gbmFtZSk7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgdGhpcy5lbGVtZW50cy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgb3IgdXBkYXRlIGFuIGVsZW1lbnQgaW4gdGhlIGFycmF5XG4gICAqIEBwYXJhbSBlbGVtZW50IC0gRWxlbWVudCB0byBhZGQgb3IgdXBkYXRlXG4gICAqIEByZXR1cm5zIHRydWUgaWYgZWxlbWVudCB3YXMgYWRkZWQsIGZhbHNlIGlmIHVwZGF0ZWRcbiAgICovXG4gIHByaXZhdGUgc2V0RWxlbWVudChlbGVtZW50OiBFbnNlbWJsZUVsZW1lbnQpOiBib29sZWFuIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuZWxlbWVudHMuZmluZEluZGV4KGVsID0+IGVsLmVsZW1lbnRfbmFtZSA9PT0gZWxlbWVudC5lbGVtZW50X25hbWUpO1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIC8vIFVwZGF0ZSBleGlzdGluZyBlbGVtZW50XG4gICAgICB0aGlzLmVsZW1lbnRzW2luZGV4XSA9IGVsZW1lbnQ7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEFkZCBuZXcgZWxlbWVudFxuICAgICAgdGhpcy5lbGVtZW50cy5wdXNoKGVsZW1lbnQpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN5bmMgZWxlbWVudHMgYXJyYXkgdG8gbWV0YWRhdGEgKHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGgpXG4gICAqL1xuICBwcml2YXRlIHN5bmNFbGVtZW50c1RvTWV0YWRhdGEoKTogdm9pZCB7XG4gICAgdGhpcy5tZXRhZGF0YS5lbGVtZW50cyA9IFsuLi50aGlzLmVsZW1lbnRzXTtcbiAgICB0aGlzLmV4dGVuc2lvbnMhLmVsZW1lbnRDb3VudCA9IHRoaXMuZWxlbWVudHMubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIFN5bmMgdGhlIGludGVybmFsIGVsZW1lbnRzIGFycmF5IGZyb20gbWV0YWRhdGEuZWxlbWVudHNcbiAgICpcbiAgICogVXNlIHRoaXMgYWZ0ZXIgbWV0YWRhdGEuZWxlbWVudHMgaGFzIGJlZW4gbW9kaWZpZWQgZXh0ZXJuYWxseVxuICAgKiAoZS5nLiwgdmlhIGVkaXRFbGVtZW50KSB0byBlbnN1cmUgaW50ZXJuYWwgc3RhdGUgaXMgY29uc2lzdGVudC5cbiAgICovXG4gIHB1YmxpYyBzeW5jRWxlbWVudHNGcm9tTWV0YWRhdGEoKTogdm9pZCB7XG4gICAgLy8gQ2xlYXIgZXhpc3RpbmcgZWxlbWVudHNcbiAgICB0aGlzLmVsZW1lbnRzID0gW107XG5cbiAgICAvLyBJc3N1ZSAjNjU4OiBEZWZlbnNpdmUgZ3VhcmQg4oCUIG1ldGFkYXRhLmVsZW1lbnRzIG11c3QgYmUgYW4gYXJyYXkuXG4gICAgLy8gSWYgYSBkaWN0IGxlYWtlZCB0aHJvdWdoIChlLmcuLCBmcm9tIGRlZXBNZXJnZSksIGxvZyB3YXJuaW5nIGFuZCBiYWlsIG91dFxuICAgIC8vIHJhdGhlciB0aGFuIHNpbGVudGx5IHByb2R1Y2luZyBhbiBlbXB0eSBlbGVtZW50cyBhcnJheS5cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodGhpcy5tZXRhZGF0YS5lbGVtZW50cykpIHtcbiAgICAgIGlmICh0aGlzLm1ldGFkYXRhLmVsZW1lbnRzICYmIHR5cGVvZiB0aGlzLm1ldGFkYXRhLmVsZW1lbnRzID09PSAnb2JqZWN0Jykge1xuICAgICAgICBsb2dnZXIud2FybignW0Vuc2VtYmxlXSBtZXRhZGF0YS5lbGVtZW50cyBpcyBub3QgYW4gYXJyYXkg4oCUIHBvc3NpYmxlIGRpY3QgZm9ybWF0IGxlYWsuIEVsZW1lbnRzIHdpbGwgbm90IGJlIGxvYWRlZC4nKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBSZWxvYWQgZnJvbSBtZXRhZGF0YVxuICAgIGlmICh0aGlzLm1ldGFkYXRhLmVsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMubG9hZEVsZW1lbnRzRnJvbU1ldGFkYXRhKHRoaXMubWV0YWRhdGEuZWxlbWVudHMpO1xuICAgIH1cbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09IEVORCBBUlJBWSBIRUxQRVIgTUVUSE9EUyA9PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBMb2FkIGVsZW1lbnQgcmVmZXJlbmNlcyBmcm9tIG1ldGFkYXRhXG4gICAqIENhbGxlZCBkdXJpbmcgY29uc3RydWN0aW9uIHRvIHBvcHVsYXRlIGVsZW1lbnRzIGFycmF5XG4gICAqL1xuICBwcml2YXRlIGxvYWRFbGVtZW50c0Zyb21NZXRhZGF0YShlbGVtZW50czogRW5zZW1ibGVFbGVtZW50W10pOiB2b2lkIHtcbiAgICBjb25zdCBsaW1pdHMgPSB0aGlzLmdldEVmZmVjdGl2ZUxpbWl0cygpO1xuXG4gICAgLy8gU0VDVVJJVFk6IEVuZm9yY2UgZWxlbWVudCBsaW1pdFxuICAgIGlmIChlbGVtZW50cy5sZW5ndGggPiBsaW1pdHMuTUFYX0VMRU1FTlRTKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBFbnNlbWJsZSBjYW5ub3QgY29udGFpbiBtb3JlIHRoYW4gJHtsaW1pdHMuTUFYX0VMRU1FTlRTfSBlbGVtZW50cyAoYXR0ZW1wdGVkOiAke2VsZW1lbnRzLmxlbmd0aH0pYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gZWxlbWVudHNbaV07XG5cbiAgICAgIC8vIElzc3VlICM1MDc6IFZhbGlkYXRlIGVhY2ggZWxlbWVudCBpcyBhIHBsYWluIG9iamVjdCBiZWZvcmUgYWNjZXNzaW5nIHByb3BlcnRpZXMuXG4gICAgICAvLyBXaGVuIHVzZXJzIHBhc3Mgc3RyaW5ncyAoZS5nLiwgW1wibXktc2tpbGxcIl0pIGluc3RlYWQgb2Ygb2JqZWN0cywgdGhlIG9sZCBjb2RlXG4gICAgICAvLyBwcm9kdWNlZCBjb25mdXNpbmcgXCJFbGVtZW50ICd1bmRlZmluZWQnIGhhcyBubyBlbGVtZW50X3R5cGVcIiBlcnJvcnMuXG4gICAgICBpZiAodHlwZW9mIGVsZW1lbnQgIT09ICdvYmplY3QnIHx8IGVsZW1lbnQgPT09IG51bGwgfHwgQXJyYXkuaXNBcnJheShlbGVtZW50KSkge1xuICAgICAgICBjb25zdCB2YWx1ZVR5cGUgPSBlbGVtZW50ID09PSBudWxsID8gJ251bGwnIDogQXJyYXkuaXNBcnJheShlbGVtZW50KSA/ICdhcnJheScgOiB0eXBlb2YgZWxlbWVudDtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBFbGVtZW50IGF0IGluZGV4ICR7aX0gaXMgYSAke3ZhbHVlVHlwZX0gKFwiJHtTdHJpbmcoZWxlbWVudCkuc3Vic3RyaW5nKDAsIDUwKX1cIiksIGAgK1xuICAgICAgICAgIGBidXQgbXVzdCBiZSBhbiBvYmplY3Qgd2l0aCB7IGVsZW1lbnRfbmFtZSwgZWxlbWVudF90eXBlIH0uIGAgK1xuICAgICAgICAgIGBFeGFtcGxlOiB7IGVsZW1lbnRfbmFtZTogXCJteS1za2lsbFwiLCBlbGVtZW50X3R5cGU6IFwic2tpbGxcIiwgcm9sZTogXCJzdXBwb3J0XCIsIHByaW9yaXR5OiA1MCwgYWN0aXZhdGlvbjogXCJhbHdheXNcIiB9YFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBNaWdyYXRlIGxlZ2FjeSBmaWVsZCBuYW1lczogbmFtZeKGkmVsZW1lbnRfbmFtZSwgdHlwZeKGkmVsZW1lbnRfdHlwZSAobWlycm9yc1xuICAgICAgLy8gRW5zZW1ibGVNYW5hZ2VyLmNyZWF0ZSgpIGxpbmVzIDU4Ni02MDIgdG8ga2VlcCBjcmVhdGUgYW5kIGVkaXQgcGF0aHMgY29uc2lzdGVudClcbiAgICAgIGNvbnN0IGVsZW1lbnROYW1lID0gZWxlbWVudC5lbGVtZW50X25hbWUgfHwgKGVsZW1lbnQgYXMgYW55KS5uYW1lO1xuICAgICAgY29uc3QgZWxlbWVudFR5cGUgPSBlbGVtZW50LmVsZW1lbnRfdHlwZSB8fCAoZWxlbWVudCBhcyBhbnkpLnR5cGU7XG5cbiAgICAgIC8vIElzc3VlICM0NjY6IFJlcXVpcmUgZXhwbGljaXQgZWxlbWVudF90eXBlIOKAlCBjYWxsZXJzIG11c3QgcmVzb2x2ZSB2aWEgcG9ydGZvbGlvXG4gICAgICAvLyBsb29rdXAgKHJlc29sdmVFbnNlbWJsZUVsZW1lbnRUeXBlcykgYmVmb3JlIHJlYWNoaW5nIHRoaXMgbWV0aG9kLlxuICAgICAgaWYgKCFlbGVtZW50VHlwZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEVsZW1lbnQgJyR7ZWxlbWVudE5hbWV9JyBoYXMgbm8gZWxlbWVudF90eXBlLiBgICtcbiAgICAgICAgICBgUHJvdmlkZSBlbGVtZW50X3R5cGUgZXhwbGljaXRseSBvciBlbnN1cmUgdGhlIGVsZW1lbnQgZXhpc3RzIGluIHRoZSBwb3J0Zm9saW8uYFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBWYWxpZGF0ZSBhbmQgc2FuaXRpemUgZWxlbWVudCwgYXBwbHlpbmcgZGVmYXVsdHMgZm9yIG9wdGlvbmFsIGZpZWxkc1xuICAgICAgY29uc3Qgc2FuaXRpemVkOiBFbnNlbWJsZUVsZW1lbnQgPSB7XG4gICAgICAgIGVsZW1lbnRfbmFtZTogc2FuaXRpemVJbnB1dChlbGVtZW50TmFtZSwgMTAwKSxcbiAgICAgICAgZWxlbWVudF90eXBlOiBzYW5pdGl6ZUlucHV0KGVsZW1lbnRUeXBlLCA1MCksXG4gICAgICAgIHJvbGU6IGVsZW1lbnQucm9sZSB8fCBFTlNFTUJMRV9ERUZBVUxUUy5FTEVNRU5UX1JPTEUsXG4gICAgICAgIHByaW9yaXR5OiBlbGVtZW50LnByaW9yaXR5ID8/IEVOU0VNQkxFX0RFRkFVTFRTLlBSSU9SSVRZLFxuICAgICAgICBhY3RpdmF0aW9uOiBlbGVtZW50LmFjdGl2YXRpb24gfHwgJ2Fsd2F5cycsXG4gICAgICAgIC8vIERvbid0IHVzZSBzYW5pdGl6ZUlucHV0IGZvciBjb25kaXRpb25zIChpdCByZW1vdmVzIDwgPiBvcGVyYXRvcnMpXG4gICAgICAgIGNvbmRpdGlvbjogZWxlbWVudC5jb25kaXRpb24gP1xuICAgICAgICAgIGVsZW1lbnQuY29uZGl0aW9uLnRyaW0oKS5zdWJzdHJpbmcoMCwgbGltaXRzLk1BWF9DT05ESVRJT05fTEVOR1RIKSA6XG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICBkZXBlbmRlbmNpZXM6IGVsZW1lbnQuZGVwZW5kZW5jaWVzPy5tYXAoZGVwID0+IHNhbml0aXplSW5wdXQoZGVwLCAxMDApKSxcbiAgICAgICAgcHVycG9zZTogZWxlbWVudC5wdXJwb3NlID9cbiAgICAgICAgICBzYW5pdGl6ZUlucHV0KGVsZW1lbnQucHVycG9zZSwgNTAwKSA6XG4gICAgICAgICAgdW5kZWZpbmVkXG4gICAgICB9O1xuXG4gICAgICAvLyBWYWxpZGF0ZSByb2xlXG4gICAgICBpZiAoIUVMRU1FTlRfUk9MRVMuaW5jbHVkZXMoc2FuaXRpemVkLnJvbGUgYXMgYW55KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7RU5TRU1CTEVfRVJST1JTLklOVkFMSURfRUxFTUVOVF9ST0xFfTogJHtzYW5pdGl6ZWQucm9sZX0uIFZhbGlkIHJvbGVzOiAke0VMRU1FTlRfUk9MRVMuam9pbignLCAnKX1gKTtcbiAgICAgIH1cblxuICAgICAgLy8gVmFsaWRhdGUgZWxlbWVudCBuYW1lIHBhdHRlcm5cbiAgICAgIGlmICghRU5TRU1CTEVfUEFUVEVSTlMuRUxFTUVOVF9OQU1FX1BBVFRFUk4udGVzdChzYW5pdGl6ZWQuZWxlbWVudF9uYW1lKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZWxlbWVudCBuYW1lIGZvcm1hdDogJHtzYW5pdGl6ZWQuZWxlbWVudF9uYW1lfWApO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNldEVsZW1lbnQoc2FuaXRpemVkKTtcbiAgICB9XG5cbiAgICB0aGlzLnN5bmNFbGVtZW50c1RvTWV0YWRhdGEoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYW4gZWxlbWVudCB0byB0aGUgZW5zZW1ibGVcbiAgICpcbiAgICogQHBhcmFtIGVsZW1lbnQgLSBFbGVtZW50IGNvbmZpZ3VyYXRpb24gdG8gYWRkXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgZWxlbWVudCB3b3VsZCBjcmVhdGUgY2lyY3VsYXIgZGVwZW5kZW5jeSBvciBleGNlZWQgbGltaXRzXG4gICAqL1xuICBwdWJsaWMgYWRkRWxlbWVudChlbGVtZW50OiBFbnNlbWJsZUVsZW1lbnQpOiB2b2lkIHtcbiAgICBjb25zdCBsaW1pdHMgPSB0aGlzLmdldEVmZmVjdGl2ZUxpbWl0cygpO1xuXG4gICAgLy8gQ2hlY2sgZWxlbWVudCBsaW1pdCAodXNlcyBjb25maWd1cmFibGUgbGltaXRzKVxuICAgIGlmICh0aGlzLmVsZW1lbnRzLmxlbmd0aCA+PSBsaW1pdHMuTUFYX0VMRU1FTlRTKSB7XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6IEVOU0VNQkxFX1NFQ1VSSVRZX0VWRU5UUy5SRVNPVVJDRV9MSU1JVF9FWENFRURFRCxcbiAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICBzb3VyY2U6ICdFbnNlbWJsZS5hZGRFbGVtZW50JyxcbiAgICAgICAgZGV0YWlsczogYE1heGltdW0gZWxlbWVudHMgKCR7bGltaXRzLk1BWF9FTEVNRU5UU30pIGV4Y2VlZGVkYFxuICAgICAgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVuc2VtYmxlIGNhbm5vdCBjb250YWluIG1vcmUgdGhhbiAke2xpbWl0cy5NQVhfRUxFTUVOVFN9IGVsZW1lbnRzYCk7XG4gICAgfVxuXG4gICAgLy8gU2FuaXRpemUgZWxlbWVudCBuYW1lIC0gZmlyc3QgdXNlIGdlbmVyYWwgc2FuaXRpemF0aW9uLCB0aGVuIGVuZm9yY2UgcGF0dGVyblxuICAgIGNvbnN0IG9yaWdpbmFsTmFtZSA9IGVsZW1lbnQuZWxlbWVudF9uYW1lO1xuICAgIGxldCBzYW5pdGl6ZWROYW1lID0gc2FuaXRpemVJbnB1dChvcmlnaW5hbE5hbWUsIDEwMCk7XG5cbiAgICAvLyBSZW1vdmUgYW55IGNoYXJhY3RlcnMgdGhhdCBkb24ndCBtYXRjaCB0aGUgYWxsb3dlZCBwYXR0ZXJuXG4gICAgY29uc3QgY2xlYW5lZE5hbWUgPSBzYW5pdGl6ZWROYW1lLnJlcGxhY2UoL1teYS16QS1aMC05Xy1dL2csICcnKTtcblxuICAgIC8vIENoZWNrIGlmIGludmFsaWQgY2hhcmFjdGVycyB3ZXJlIHJlbW92ZWRcbiAgICBpZiAoY2xlYW5lZE5hbWUubGVuZ3RoIDwgb3JpZ2luYWxOYW1lLmxlbmd0aCAmJiBvcmlnaW5hbE5hbWUubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRWxlbWVudCBuYW1lIGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVycy4gYCArXG4gICAgICAgIGBPbmx5IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLCBoeXBoZW5zLCBhbmQgdW5kZXJzY29yZXMgYXJlIGFsbG93ZWQuIGAgK1xuICAgICAgICBgSW52YWxpZCBuYW1lOiBcIiR7b3JpZ2luYWxOYW1lfVwiYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBzYW5pdGl6ZWROYW1lID0gY2xlYW5lZE5hbWU7XG5cbiAgICAvLyBSZWplY3QgaWYgc2FuaXRpemF0aW9uIHJlc3VsdHMgaW4gZW1wdHkgbmFtZVxuICAgIGlmICghc2FuaXRpemVkTmFtZSB8fCBzYW5pdGl6ZWROYW1lLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRWxlbWVudCBuYW1lIGlzIGVtcHR5IG9yIGNvbnRhaW5zIG9ubHkgaW52YWxpZCBjaGFyYWN0ZXJzOiBcIiR7b3JpZ2luYWxOYW1lfVwiYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBGaW5hbCBwYXR0ZXJuIHZhbGlkYXRpb24gKHNob3VsZCBhbHdheXMgcGFzcyBpZiBhYm92ZSBjaGVja3MgcGFzc2VkKVxuICAgIGlmICghRU5TRU1CTEVfUEFUVEVSTlMuRUxFTUVOVF9OQU1FX1BBVFRFUk4udGVzdChzYW5pdGl6ZWROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRWxlbWVudCBuYW1lIGZvcm1hdCB2YWxpZGF0aW9uIGZhaWxlZDogXCIke3Nhbml0aXplZE5hbWV9XCIuIGAgK1xuICAgICAgICBgVGhpcyBzaG91bGQgbm90IGhhcHBlbiAtIHBsZWFzZSByZXBvcnQgdGhpcyBlcnJvci5gXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBzYW5pdGl6ZWQgY29weSB0byBhdm9pZCBtdXRhdGluZyB0aGUgaW5wdXRcbiAgICBjb25zdCBzYW5pdGl6ZWRFbGVtZW50OiBFbnNlbWJsZUVsZW1lbnQgPSB7XG4gICAgICBlbGVtZW50X25hbWU6IHNhbml0aXplZE5hbWUsXG4gICAgICBlbGVtZW50X3R5cGU6IGVsZW1lbnQuZWxlbWVudF90eXBlLFxuICAgICAgcm9sZTogZWxlbWVudC5yb2xlLFxuICAgICAgcHJpb3JpdHk6IGVsZW1lbnQucHJpb3JpdHksXG4gICAgICBhY3RpdmF0aW9uOiBlbGVtZW50LmFjdGl2YXRpb25cbiAgICB9O1xuXG4gICAgLy8gVmFsaWRhdGUgcm9sZVxuICAgIGlmICghRUxFTUVOVF9ST0xFUy5pbmNsdWRlcyhzYW5pdGl6ZWRFbGVtZW50LnJvbGUgYXMgYW55KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke0VOU0VNQkxFX0VSUk9SUy5JTlZBTElEX0VMRU1FTlRfUk9MRX06ICR7c2FuaXRpemVkRWxlbWVudC5yb2xlfS4gVmFsaWQgcm9sZXM6ICR7RUxFTUVOVF9ST0xFUy5qb2luKCcsICcpfWApO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGFuZCBzYW5pdGl6ZSBhY3RpdmF0aW9uIGNvbmRpdGlvbiBpZiBwcm92aWRlZFxuICAgIGlmIChlbGVtZW50LmNvbmRpdGlvbikge1xuICAgICAgLy8gVHJpbSBhbmQgZW5mb3JjZSBsZW5ndGggbGltaXQgKGRvbid0IHVzZSBzYW5pdGl6ZUlucHV0IGFzIGl0IHJlbW92ZXMgPCA+IG9wZXJhdG9ycylcbiAgICAgIGNvbnN0IGNvbmRpdGlvblRvVmFsaWRhdGUgPSBlbGVtZW50LmNvbmRpdGlvblxuICAgICAgICAudHJpbSgpXG4gICAgICAgIC5zdWJzdHJpbmcoMCwgbGltaXRzLk1BWF9DT05ESVRJT05fTEVOR1RIKTtcblxuICAgICAgaWYgKCF0aGlzLmlzVmFsaWRDb25kaXRpb24oY29uZGl0aW9uVG9WYWxpZGF0ZSkpIHtcbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6IEVOU0VNQkxFX1NFQ1VSSVRZX0VWRU5UUy5TVVNQSUNJT1VTX0NPTkRJVElPTixcbiAgICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICAgIHNvdXJjZTogJ0Vuc2VtYmxlLmFkZEVsZW1lbnQnLFxuICAgICAgICAgIGRldGFpbHM6IGBTdXNwaWNpb3VzIGFjdGl2YXRpb24gY29uZGl0aW9uOiAke2NvbmRpdGlvblRvVmFsaWRhdGV9YFxuICAgICAgICB9KTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGFjdGl2YXRpb24gY29uZGl0aW9uIHN5bnRheCcpO1xuICAgICAgfVxuICAgICAgc2FuaXRpemVkRWxlbWVudC5jb25kaXRpb24gPSBjb25kaXRpb25Ub1ZhbGlkYXRlO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGFuZCBzYW5pdGl6ZSBkZXBlbmRlbmNpZXNcbiAgICBpZiAoZWxlbWVudC5kZXBlbmRlbmNpZXMpIHtcbiAgICAgIC8vIFRydW5jYXRlIGRlcGVuZGVuY2llcyBhcnJheSBpZiBpdCBleGNlZWRzIHRoZSBsaW1pdCAoc2VjdXJpdHk6IHByZXZlbnQgcmVzb3VyY2UgZXhoYXVzdGlvbilcbiAgICAgIGxldCBkZXBzID0gZWxlbWVudC5kZXBlbmRlbmNpZXM7XG4gICAgICBpZiAoZGVwcy5sZW5ndGggPiBsaW1pdHMuTUFYX0RFUEVOREVOQ0lFUykge1xuICAgICAgICBkZXBzID0gZGVwcy5zbGljZSgwLCBsaW1pdHMuTUFYX0RFUEVOREVOQ0lFUyk7XG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiBFTlNFTUJMRV9TRUNVUklUWV9FVkVOVFMuUkVTT1VSQ0VfTElNSVRfRVhDRUVERUQsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICAgIHNvdXJjZTogJ0Vuc2VtYmxlLmFkZEVsZW1lbnQnLFxuICAgICAgICAgIGRldGFpbHM6IGBEZXBlbmRlbmNpZXMgdHJ1bmNhdGVkIGZyb20gJHtlbGVtZW50LmRlcGVuZGVuY2llcy5sZW5ndGh9IHRvICR7bGltaXRzLk1BWF9ERVBFTkRFTkNJRVN9YFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gU2FuaXRpemUgZWFjaCBkZXBlbmRlbmN5XG4gICAgICBjb25zdCBzYW5pdGl6ZWREZXBzID0gZGVwcy5tYXAoZGVwID0+IHNhbml0aXplSW5wdXQoZGVwLCAxMDApKTtcbiAgICAgIHNhbml0aXplZEVsZW1lbnQuZGVwZW5kZW5jaWVzID0gc2FuaXRpemVkRGVwcztcblxuICAgICAgLy8gQ2hlY2sgZm9yIGNpcmN1bGFyIGRlcGVuZGVuY2llc1xuICAgICAgaWYgKHRoaXMud291bGRDcmVhdGVDaXJjdWxhckRlcGVuZGVuY3koc2FuaXRpemVkTmFtZSwgc2FuaXRpemVkRGVwcykpIHtcbiAgICAgICAgY29uc3QgY2lyY3VsYXIgPSB0aGlzLmZpbmRDaXJjdWxhckRlcGVuZGVuY3koc2FuaXRpemVkTmFtZSwgc2FuaXRpemVkRGVwcyk7XG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiBFTlNFTUJMRV9TRUNVUklUWV9FVkVOVFMuQ0lSQ1VMQVJfREVQRU5ERU5DWSxcbiAgICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICAgIHNvdXJjZTogJ0Vuc2VtYmxlLmFkZEVsZW1lbnQnLFxuICAgICAgICAgIGRldGFpbHM6IGBDaXJjdWxhciBkZXBlbmRlbmN5IGRldGVjdGVkOiAke2NpcmN1bGFyLnBhdGguam9pbignIC0+ICcpfWBcbiAgICAgICAgfSk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtFTlNFTUJMRV9FUlJPUlMuQ0lSQ1VMQVJfREVQRU5ERU5DWX06ICR7Y2lyY3VsYXIubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBZGQgb3B0aW9uYWwgcHVycG9zZSBmaWVsZCBpZiBwcm92aWRlZFxuICAgIGlmIChlbGVtZW50LnB1cnBvc2UpIHtcbiAgICAgIHNhbml0aXplZEVsZW1lbnQucHVycG9zZSA9IHNhbml0aXplSW5wdXQoZWxlbWVudC5wdXJwb3NlLCA1MDApO1xuICAgIH1cblxuICAgIC8vIEFkZCBzYW5pdGl6ZWQgZWxlbWVudCB0byBhcnJheSAobm90IHRoZSBvcmlnaW5hbCB0byBhdm9pZCBzdG9yaW5nIHVuc2FuaXRpemVkIGRhdGEpXG4gICAgdGhpcy5zZXRFbGVtZW50KHNhbml0aXplZEVsZW1lbnQpO1xuICAgIHRoaXMuc3luY0VsZW1lbnRzVG9NZXRhZGF0YSgpO1xuICAgIHRoaXMubWFya0RpcnR5KCk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGFuIGVsZW1lbnQncyBjb25maWd1cmF0aW9uIGluIHRoZSBlbnNlbWJsZVxuICAgKlxuICAgKiBAcGFyYW0gZWxlbWVudE5hbWUgLSBOYW1lIG9mIGVsZW1lbnQgdG8gdXBkYXRlXG4gICAqIEBwYXJhbSB1cGRhdGVzIC0gUGFydGlhbCBlbGVtZW50IGNvbmZpZ3VyYXRpb24gdG8gbWVyZ2Ugd2l0aCBleGlzdGluZ1xuICAgKiBAdGhyb3dzIEVycm9yIGlmIGVsZW1lbnQgbm90IGZvdW5kIG9yIGFjdGl2YXRpb24gaW4gcHJvZ3Jlc3NcbiAgICovXG4gIHB1YmxpYyB1cGRhdGVFbGVtZW50KFxuICAgIGVsZW1lbnROYW1lOiBzdHJpbmcsXG4gICAgdXBkYXRlczogUGFydGlhbDxFbnNlbWJsZUVsZW1lbnQ+XG4gICk6IHZvaWQge1xuICAgIC8vIFByZXZlbnQgdXBkYXRlcyBkdXJpbmcgYWN0aXZhdGlvblxuICAgIGlmICh0aGlzLmFjdGl2YXRpb25JblByb2dyZXNzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCB1cGRhdGUgZWxlbWVudHMgd2hpbGUgZW5zZW1ibGUgYWN0aXZhdGlvbiBpcyBpbiBwcm9ncmVzcycpO1xuICAgIH1cblxuICAgIGNvbnN0IGxpbWl0cyA9IHRoaXMuZ2V0RWZmZWN0aXZlTGltaXRzKCk7XG4gICAgY29uc3Qgc2FuaXRpemVkTmFtZSA9IHNhbml0aXplSW5wdXQoZWxlbWVudE5hbWUsIDEwMCk7XG5cbiAgICBpZiAoIXRoaXMuaGFzRWxlbWVudChzYW5pdGl6ZWROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKEVOU0VNQkxFX0VSUk9SUy5FTEVNRU5UX05PVF9GT1VORCk7XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudEVsZW1lbnQgPSB0aGlzLmZpbmRFbGVtZW50QnlOYW1lKHNhbml0aXplZE5hbWUpITtcblxuICAgIC8vIFNhbml0aXplIGFuZCB2YWxpZGF0ZSB1cGRhdGVzXG4gICAgY29uc3Qgc2FuaXRpemVkVXBkYXRlczogUGFydGlhbDxFbnNlbWJsZUVsZW1lbnQ+ID0ge307XG5cbiAgICBpZiAodXBkYXRlcy5yb2xlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICghRUxFTUVOVF9ST0xFUy5pbmNsdWRlcyh1cGRhdGVzLnJvbGUgYXMgYW55KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7RU5TRU1CTEVfRVJST1JTLklOVkFMSURfRUxFTUVOVF9ST0xFfTogJHt1cGRhdGVzLnJvbGV9LiBWYWxpZCByb2xlczogJHtFTEVNRU5UX1JPTEVTLmpvaW4oJywgJyl9YCk7XG4gICAgICB9XG4gICAgICBzYW5pdGl6ZWRVcGRhdGVzLnJvbGUgPSB1cGRhdGVzLnJvbGU7XG4gICAgfVxuXG4gICAgaWYgKHVwZGF0ZXMucHJpb3JpdHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc2FuaXRpemVkVXBkYXRlcy5wcmlvcml0eSA9IHVwZGF0ZXMucHJpb3JpdHk7XG4gICAgfVxuXG4gICAgaWYgKHVwZGF0ZXMuYWN0aXZhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBzYW5pdGl6ZWRVcGRhdGVzLmFjdGl2YXRpb24gPSB1cGRhdGVzLmFjdGl2YXRpb247XG4gICAgfVxuXG4gICAgaWYgKHVwZGF0ZXMuY29uZGl0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIFRyaW0gYW5kIGVuZm9yY2UgbGVuZ3RoIGxpbWl0IChkb24ndCB1c2Ugc2FuaXRpemVJbnB1dCBhcyBpdCByZW1vdmVzIDwgPiBvcGVyYXRvcnMpXG4gICAgICBjb25zdCBjb25kaXRpb25Ub1ZhbGlkYXRlID0gdXBkYXRlcy5jb25kaXRpb25cbiAgICAgICAgLnRyaW0oKVxuICAgICAgICAuc3Vic3RyaW5nKDAsIGxpbWl0cy5NQVhfQ09ORElUSU9OX0xFTkdUSCk7XG5cbiAgICAgIGlmICghdGhpcy5pc1ZhbGlkQ29uZGl0aW9uKGNvbmRpdGlvblRvVmFsaWRhdGUpKSB7XG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiBFTlNFTUJMRV9TRUNVUklUWV9FVkVOVFMuU1VTUElDSU9VU19DT05ESVRJT04sXG4gICAgICAgICAgc2V2ZXJpdHk6ICdISUdIJyxcbiAgICAgICAgICBzb3VyY2U6ICdFbnNlbWJsZS51cGRhdGVFbGVtZW50JyxcbiAgICAgICAgICBkZXRhaWxzOiBgU3VzcGljaW91cyBhY3RpdmF0aW9uIGNvbmRpdGlvbjogJHtjb25kaXRpb25Ub1ZhbGlkYXRlfWBcbiAgICAgICAgfSk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhY3RpdmF0aW9uIGNvbmRpdGlvbiBzeW50YXgnKTtcbiAgICAgIH1cbiAgICAgIHNhbml0aXplZFVwZGF0ZXMuY29uZGl0aW9uID0gY29uZGl0aW9uVG9WYWxpZGF0ZTtcbiAgICB9XG5cbiAgICBpZiAodXBkYXRlcy5kZXBlbmRlbmNpZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gVmFsaWRhdGUgZGVwZW5kZW5jeSBsaW1pdFxuICAgICAgbGV0IGRlcHMgPSB1cGRhdGVzLmRlcGVuZGVuY2llcztcbiAgICAgIGlmIChkZXBzLmxlbmd0aCA+IGxpbWl0cy5NQVhfREVQRU5ERU5DSUVTKSB7XG4gICAgICAgIGRlcHMgPSBkZXBzLnNsaWNlKDAsIGxpbWl0cy5NQVhfREVQRU5ERU5DSUVTKTtcbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6IEVOU0VNQkxFX1NFQ1VSSVRZX0VWRU5UUy5SRVNPVVJDRV9MSU1JVF9FWENFRURFRCxcbiAgICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgICAgc291cmNlOiAnRW5zZW1ibGUudXBkYXRlRWxlbWVudCcsXG4gICAgICAgICAgZGV0YWlsczogYERlcGVuZGVuY2llcyB0cnVuY2F0ZWQgZnJvbSAke3VwZGF0ZXMuZGVwZW5kZW5jaWVzLmxlbmd0aH0gdG8gJHtsaW1pdHMuTUFYX0RFUEVOREVOQ0lFU31gXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBTYW5pdGl6ZSBkZXBlbmRlbmNpZXNcbiAgICAgIGNvbnN0IHNhbml0aXplZERlcHMgPSBkZXBzLm1hcChkZXAgPT4gc2FuaXRpemVJbnB1dChkZXAsIDEwMCkpO1xuXG4gICAgICAvLyBDaGVjayBmb3IgY2lyY3VsYXIgZGVwZW5kZW5jaWVzIHdpdGggdXBkYXRlZCBkZXBlbmRlbmNpZXNcbiAgICAgIGlmICh0aGlzLndvdWxkQ3JlYXRlQ2lyY3VsYXJEZXBlbmRlbmN5KHNhbml0aXplZE5hbWUsIHNhbml0aXplZERlcHMpKSB7XG4gICAgICAgIGNvbnN0IGNpcmN1bGFyID0gdGhpcy5maW5kQ2lyY3VsYXJEZXBlbmRlbmN5KHNhbml0aXplZE5hbWUsIHNhbml0aXplZERlcHMpO1xuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogRU5TRU1CTEVfU0VDVVJJVFlfRVZFTlRTLkNJUkNVTEFSX0RFUEVOREVOQ1ksXG4gICAgICAgICAgc2V2ZXJpdHk6ICdISUdIJyxcbiAgICAgICAgICBzb3VyY2U6ICdFbnNlbWJsZS51cGRhdGVFbGVtZW50JyxcbiAgICAgICAgICBkZXRhaWxzOiBgQ2lyY3VsYXIgZGVwZW5kZW5jeSBkZXRlY3RlZDogJHtjaXJjdWxhci5wYXRoLmpvaW4oJyAtPiAnKX1gXG4gICAgICAgIH0pO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7RU5TRU1CTEVfRVJST1JTLkNJUkNVTEFSX0RFUEVOREVOQ1l9OiAke2NpcmN1bGFyLm1lc3NhZ2V9YCk7XG4gICAgICB9XG5cbiAgICAgIHNhbml0aXplZFVwZGF0ZXMuZGVwZW5kZW5jaWVzID0gc2FuaXRpemVkRGVwcztcbiAgICB9XG5cbiAgICBpZiAodXBkYXRlcy5wdXJwb3NlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHNhbml0aXplZFVwZGF0ZXMucHVycG9zZSA9IHNhbml0aXplSW5wdXQodXBkYXRlcy5wdXJwb3NlLCA1MDApO1xuICAgIH1cblxuICAgIC8vIE1lcmdlIHVwZGF0ZXMgd2l0aCBjdXJyZW50IGVsZW1lbnRcbiAgICBjb25zdCB1cGRhdGVkRWxlbWVudDogRW5zZW1ibGVFbGVtZW50ID0ge1xuICAgICAgLi4uY3VycmVudEVsZW1lbnQsXG4gICAgICAuLi5zYW5pdGl6ZWRVcGRhdGVzXG4gICAgfTtcblxuICAgIHRoaXMuc2V0RWxlbWVudCh1cGRhdGVkRWxlbWVudCk7XG4gICAgdGhpcy5zeW5jRWxlbWVudHNUb01ldGFkYXRhKCk7XG4gICAgdGhpcy5tYXJrRGlydHkoKTtcblxuICAgIGxvZ2dlci5kZWJ1ZyhgRWxlbWVudCAke3Nhbml0aXplZE5hbWV9IHVwZGF0ZWQgaW4gZW5zZW1ibGUgJHt0aGlzLmlkfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhbiBlbGVtZW50IGZyb20gdGhlIGVuc2VtYmxlXG4gICAqXG4gICAqIEBwYXJhbSBlbGVtZW50TmFtZSAtIE5hbWUgb2YgZWxlbWVudCB0byByZW1vdmVcbiAgICogQHRocm93cyBFcnJvciBpZiBlbGVtZW50IG5vdCBmb3VuZCBvciBhY3RpdmF0aW9uIGluIHByb2dyZXNzXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlRWxlbWVudChlbGVtZW50TmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gUHJldmVudCByZW1vdmFsIGR1cmluZyBhY3RpdmF0aW9uXG4gICAgaWYgKHRoaXMuYWN0aXZhdGlvbkluUHJvZ3Jlc3MpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHJlbW92ZSBlbGVtZW50cyB3aGlsZSBlbnNlbWJsZSBhY3RpdmF0aW9uIGlzIGluIHByb2dyZXNzJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2FuaXRpemVkTmFtZSA9IHNhbml0aXplSW5wdXQoZWxlbWVudE5hbWUsIDEwMCk7XG5cbiAgICBpZiAoIXRoaXMuaGFzRWxlbWVudChzYW5pdGl6ZWROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKEVOU0VNQkxFX0VSUk9SUy5FTEVNRU5UX05PVF9GT1VORCk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgZWxlbWVudCBpcyBjdXJyZW50bHkgYWN0aXZlXG4gICAgaWYgKHRoaXMuZWxlbWVudEluc3RhbmNlcy5oYXMoc2FuaXRpemVkTmFtZSkpIHtcbiAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICBgUmVtb3ZpbmcgYWN0aXZlIGVsZW1lbnQgJyR7c2FuaXRpemVkTmFtZX0nIGZyb20gZW5zZW1ibGUuIGAgK1xuICAgICAgICBgQ29uc2lkZXIgZGVhY3RpdmF0aW5nIHRoZSBlbnNlbWJsZSBmaXJzdC5gXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSBlbGVtZW50IGFuZCBpdHMgaW5zdGFuY2VcbiAgICB0aGlzLnJlbW92ZUVsZW1lbnRCeU5hbWUoc2FuaXRpemVkTmFtZSk7XG4gICAgdGhpcy5lbGVtZW50SW5zdGFuY2VzLmRlbGV0ZShzYW5pdGl6ZWROYW1lKTtcblxuICAgIC8vIENsZWFuIHVwIGRlcGVuZGVuY2llcyBwb2ludGluZyB0byB0aGlzIGVsZW1lbnRcbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgdGhpcy5lbGVtZW50cykge1xuICAgICAgaWYgKGVsZW1lbnQuZGVwZW5kZW5jaWVzPy5pbmNsdWRlcyhzYW5pdGl6ZWROYW1lKSkge1xuICAgICAgICBlbGVtZW50LmRlcGVuZGVuY2llcyA9IGVsZW1lbnQuZGVwZW5kZW5jaWVzLmZpbHRlcihkZXAgPT4gZGVwICE9PSBzYW5pdGl6ZWROYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDbGVhbiB1cCBzaGFyZWQgY29udGV4dCBvd25lZCBieSB0aGlzIGVsZW1lbnRcbiAgICBmb3IgKGNvbnN0IFtrZXksIG93bmVyXSBvZiB0aGlzLnNoYXJlZENvbnRleHQub3duZXJzKSB7XG4gICAgICBpZiAob3duZXIgPT09IHNhbml0aXplZE5hbWUpIHtcbiAgICAgICAgdGhpcy5zaGFyZWRDb250ZXh0LnZhbHVlcy5kZWxldGUoa2V5KTtcbiAgICAgICAgdGhpcy5zaGFyZWRDb250ZXh0Lm93bmVycy5kZWxldGUoa2V5KTtcbiAgICAgICAgdGhpcy5zaGFyZWRDb250ZXh0LnRpbWVzdGFtcHMuZGVsZXRlKGtleSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5zeW5jRWxlbWVudHNUb01ldGFkYXRhKCk7XG4gICAgdGhpcy5tYXJrRGlydHkoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY3RpdmF0ZSB0aGUgZWxlbWVudCAoQmFzZUVsZW1lbnQgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uKVxuICAgKiBGb3IgZW5zZW1ibGVzLCB0aGlzIGlzIGEgbm8tb3AuIFVzZSBhY3RpdmF0ZUVuc2VtYmxlKCkgZm9yIGZ1bGwgYWN0aXZhdGlvbi5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBhc3luYyBhY3RpdmF0ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLl9zdGF0dXMgPSBFbGVtZW50U3RhdHVzLkFDVElWRTtcbiAgICBsb2dnZXIuZGVidWcoYEVuc2VtYmxlICR7dGhpcy5pZH0gYWN0aXZhdGVkICh1c2UgYWN0aXZhdGVFbnNlbWJsZSgpIGZvciBmdWxsIG9yY2hlc3RyYXRpb24pYCk7XG4gIH1cblxuICAvKipcbiAgICogQWN0aXZhdGUgdGhlIGVuc2VtYmxlIGFuZCBhbGwgaXRzIGVsZW1lbnRzIGJhc2VkIG9uIHN0cmF0ZWd5XG4gICAqXG4gICAqIEBwYXJhbSBwb3J0Zm9saW9NYW5hZ2VyIC0gUG9ydGZvbGlvIG1hbmFnZXIgZm9yIGxvYWRpbmcgZWxlbWVudCBpbnN0YW5jZXNcbiAgICogQHBhcmFtIG1hbmFnZXJzIC0gRWxlbWVudCBtYW5hZ2VycyBmb3IgbG9hZGluZyBkaWZmZXJlbnQgZWxlbWVudCB0eXBlc1xuICAgKiBAcGFyYW0gbmVzdGluZ0RlcHRoIC0gQ3VycmVudCBuZXN0aW5nIGRlcHRoICgwIGZvciB0b3AtbGV2ZWwsIGluY3JlbWVudHMgZm9yIG5lc3RlZClcbiAgICogQHJldHVybnMgQWN0aXZhdGlvbiByZXN1bHQgd2l0aCBzdWNjZXNzIHN0YXR1cyBhbmQgZWxlbWVudCByZXN1bHRzXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgYWN0aXZhdGVFbnNlbWJsZShcbiAgICBwb3J0Zm9saW9NYW5hZ2VyOiBQb3J0Zm9saW9NYW5hZ2VyLFxuICAgIG1hbmFnZXJzOiBpbXBvcnQoJy4vdHlwZXMuanMnKS5FbGVtZW50TWFuYWdlcnMsXG4gICAgbmVzdGluZ0RlcHRoOiBudW1iZXIgPSAwXG4gICk6IFByb21pc2U8RW5zZW1ibGVBY3RpdmF0aW9uUmVzdWx0PiB7XG4gICAgaWYgKHRoaXMuYWN0aXZhdGlvbkluUHJvZ3Jlc3MpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQWN0aXZhdGlvbiBhbHJlYWR5IGluIHByb2dyZXNzJyk7XG4gICAgfVxuXG4gICAgdGhpcy5hY3RpdmF0aW9uSW5Qcm9ncmVzcyA9IHRydWU7XG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBsaW1pdHMgPSB0aGlzLmdldEVmZmVjdGl2ZUxpbWl0cygpO1xuICAgIGNvbnN0IHRpbWVvdXQgPSBsaW1pdHMuTUFYX0FDVElWQVRJT05fVElNRTtcblxuICAgIGxldCB0aW1lb3V0SGFuZGxlOiBOb2RlSlMuVGltZW91dCB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgLy8gQ3JlYXRlIHRpbWVvdXQgcHJvbWlzZVxuICAgICAgY29uc3QgdGltZW91dFByb21pc2UgPSBuZXcgUHJvbWlzZTxuZXZlcj4oKF8sIHJlamVjdCkgPT4ge1xuICAgICAgICB0aW1lb3V0SGFuZGxlID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgRW5zZW1ibGUgYWN0aXZhdGlvbiB0aW1lb3V0IGFmdGVyICR7dGltZW91dH1tc2ApKTtcbiAgICAgICAgfSwgdGltZW91dCk7XG4gICAgICB9KTtcblxuICAgICAgLy8gQ3JlYXRlIGFjdGl2YXRpb24gcHJvbWlzZVxuICAgICAgY29uc3QgYWN0aXZhdGlvblByb21pc2UgPSB0aGlzLnBlcmZvcm1BY3RpdmF0aW9uKFxuICAgICAgICBwb3J0Zm9saW9NYW5hZ2VyLFxuICAgICAgICBtYW5hZ2VycyxcbiAgICAgICAgc3RhcnRUaW1lLFxuICAgICAgICBuZXN0aW5nRGVwdGhcbiAgICAgICk7XG5cbiAgICAgIC8vIFJhY2UgYWN0aXZhdGlvbiBhZ2FpbnN0IHRpbWVvdXRcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFByb21pc2UucmFjZShbYWN0aXZhdGlvblByb21pc2UsIHRpbWVvdXRQcm9taXNlXSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLl9zdGF0dXMgPSBFbGVtZW50U3RhdHVzLkVSUk9SO1xuXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6IEVOU0VNQkxFX1NFQ1VSSVRZX0VWRU5UUy5BQ1RJVkFUSU9OX0ZBSUxFRCxcbiAgICAgICAgc2V2ZXJpdHk6ICdISUdIJyxcbiAgICAgICAgc291cmNlOiAnRW5zZW1ibGUuYWN0aXZhdGVFbnNlbWJsZScsXG4gICAgICAgIGRldGFpbHM6IGBBY3RpdmF0aW9uIGZhaWxlZCBhZnRlciAke0RhdGUubm93KCkgLSBzdGFydFRpbWV9bXM6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YFxuICAgICAgfSk7XG5cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAodGltZW91dEhhbmRsZSkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dEhhbmRsZSk7XG4gICAgICB9XG4gICAgICB0aGlzLmFjdGl2YXRpb25JblByb2dyZXNzID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciB0byBjcmVhdGUgc3RydWN0dXJlZCBsb2cgY29udGV4dCBmb3IgZW5zZW1ibGUgb3BlcmF0aW9uc1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBnZXRMb2dDb250ZXh0KGFkZGl0aW9uYWxEYXRhPzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIHJldHVybiB7XG4gICAgICBlbnNlbWJsZUlkOiB0aGlzLmlkLFxuICAgICAgZW5zZW1ibGVOYW1lOiB0aGlzLm1ldGFkYXRhLm5hbWUsXG4gICAgICBlbGVtZW50Q291bnQ6IHRoaXMuZWxlbWVudHMubGVuZ3RoLFxuICAgICAgYWN0aXZhdGlvblN0cmF0ZWd5OiB0aGlzLm1ldGFkYXRhLmFjdGl2YXRpb25TdHJhdGVneSxcbiAgICAgIGFsbG93TmVzdGVkOiB0aGlzLm1ldGFkYXRhLmFsbG93TmVzdGVkLFxuICAgICAgbWF4TmVzdGluZ0RlcHRoOiB0aGlzLm1ldGFkYXRhLm1heE5lc3RpbmdEZXB0aCxcbiAgICAgIC4uLmFkZGl0aW9uYWxEYXRhXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtIHRoZSBhY3R1YWwgYWN0aXZhdGlvbiBsb2dpY1xuICAgKiBFeHRyYWN0ZWQgdG8gc2VwYXJhdGUgbWV0aG9kIGZvciB0aW1lb3V0IGhhbmRsaW5nXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHBlcmZvcm1BY3RpdmF0aW9uKFxuICAgIHBvcnRmb2xpb01hbmFnZXI6IFBvcnRmb2xpb01hbmFnZXIsXG4gICAgbWFuYWdlcnM6IGltcG9ydCgnLi90eXBlcy5qcycpLkVsZW1lbnRNYW5hZ2VycyxcbiAgICBzdGFydFRpbWU6IG51bWJlcixcbiAgICBuZXN0aW5nRGVwdGg6IG51bWJlclxuICApOiBQcm9taXNlPEVuc2VtYmxlQWN0aXZhdGlvblJlc3VsdD4ge1xuICAgIC8vIFNldCBzdGF0dXNcbiAgICB0aGlzLl9zdGF0dXMgPSBFbGVtZW50U3RhdHVzLkFDVElWRTtcblxuICAgIC8vIFN0cnVjdHVyZWQgbG9nZ2luZzogQWN0aXZhdGlvbiBzdGFydFxuICAgIGxvZ2dlci5pbmZvKCdFbnNlbWJsZSBhY3RpdmF0aW9uIHN0YXJ0ZWQnLCB0aGlzLmdldExvZ0NvbnRleHQoe1xuICAgICAgc3RyYXRlZ3k6IHRoaXMubWV0YWRhdGEuYWN0aXZhdGlvblN0cmF0ZWd5LFxuICAgICAgdG90YWxFbGVtZW50czogdGhpcy5lbGVtZW50cy5sZW5ndGgsXG4gICAgICByZXNvdXJjZUxpbWl0czogdGhpcy5tZXRhZGF0YS5yZXNvdXJjZUxpbWl0cyxcbiAgICAgIG5lc3RpbmdEZXB0aDogbmVzdGluZ0RlcHRoXG4gICAgfSkpO1xuXG4gICAgY29uc3QgcmVzdWx0OiBFbnNlbWJsZUFjdGl2YXRpb25SZXN1bHQgPSB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgYWN0aXZhdGVkRWxlbWVudHM6IFtdLFxuICAgICAgZmFpbGVkRWxlbWVudHM6IFtdLFxuICAgICAgY29uZmxpY3RzOiBbXSxcbiAgICAgIHRvdGFsRHVyYXRpb246IDAsXG4gICAgICBlbGVtZW50UmVzdWx0czogW11cbiAgICB9O1xuXG4gICAgLy8gR2V0IGFjdGl2YXRpb24gb3JkZXIgYmFzZWQgb24gc3RyYXRlZ3lcbiAgICBjb25zdCBhY3RpdmF0aW9uT3JkZXIgPSB0aGlzLmdldEFjdGl2YXRpb25PcmRlcigpO1xuXG4gICAgLy8gQWN0aXZhdGUgZWxlbWVudHMgYWNjb3JkaW5nIHRvIHN0cmF0ZWd5XG4gICAgc3dpdGNoICh0aGlzLm1ldGFkYXRhLmFjdGl2YXRpb25TdHJhdGVneSkge1xuICAgICAgY2FzZSAnc2VxdWVudGlhbCc6XG4gICAgICAgIGF3YWl0IHRoaXMuYWN0aXZhdGVTZXF1ZW50aWFsKFxuICAgICAgICAgIGFjdGl2YXRpb25PcmRlcixcbiAgICAgICAgICByZXN1bHQsXG4gICAgICAgICAgcG9ydGZvbGlvTWFuYWdlcixcbiAgICAgICAgICBtYW5hZ2VycyxcbiAgICAgICAgICBuZXN0aW5nRGVwdGhcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ2FsbCc6XG4gICAgICAgIGF3YWl0IHRoaXMuYWN0aXZhdGVBbGwoXG4gICAgICAgICAgYWN0aXZhdGlvbk9yZGVyLFxuICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICBwb3J0Zm9saW9NYW5hZ2VyLFxuICAgICAgICAgIG1hbmFnZXJzLFxuICAgICAgICAgIG5lc3RpbmdEZXB0aFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAncHJpb3JpdHknOlxuICAgICAgICBhd2FpdCB0aGlzLmFjdGl2YXRlUHJpb3JpdHkoXG4gICAgICAgICAgYWN0aXZhdGlvbk9yZGVyLFxuICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICBwb3J0Zm9saW9NYW5hZ2VyLFxuICAgICAgICAgIG1hbmFnZXJzLFxuICAgICAgICAgIG5lc3RpbmdEZXB0aFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnY29uZGl0aW9uYWwnOlxuICAgICAgICBhd2FpdCB0aGlzLmFjdGl2YXRlQ29uZGl0aW9uYWwoXG4gICAgICAgICAgYWN0aXZhdGlvbk9yZGVyLFxuICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICBwb3J0Zm9saW9NYW5hZ2VyLFxuICAgICAgICAgIG1hbmFnZXJzLFxuICAgICAgICAgIG5lc3RpbmdEZXB0aFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnbGF6eSc6XG4gICAgICAgIC8vIExhenkgYWN0aXZhdGlvbiBoYXBwZW5zIG9uLWRlbWFuZCwganVzdCBtYXJrIGFzIHJlYWR5XG4gICAgICAgIGxvZ2dlci5pbmZvKGBFbnNlbWJsZSAke3RoaXMuaWR9IHJlYWR5IGZvciBsYXp5IGFjdGl2YXRpb25gKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcmVzdWx0LnRvdGFsRHVyYXRpb24gPSBEYXRlLm5vdygpIC0gc3RhcnRUaW1lO1xuICAgIHRoaXMubGFzdEFjdGl2YXRpb25SZXN1bHQgPSByZXN1bHQ7XG4gICAgdGhpcy5leHRlbnNpb25zIS5sYXN0QWN0aXZhdGlvbiA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcblxuICAgIC8vIENvdW50IG5lc3RlZCBlbnNlbWJsZXMgaW4gcmVzdWx0c1xuICAgIGNvbnN0IG5lc3RlZEVuc2VtYmxlQ291bnQgPSByZXN1bHQuYWN0aXZhdGVkRWxlbWVudHMuZmlsdGVyKG5hbWUgPT4ge1xuICAgICAgY29uc3QgZWxlbSA9IHRoaXMuZmluZEVsZW1lbnRCeU5hbWUobmFtZSk7XG4gICAgICByZXR1cm4gZWxlbT8uZWxlbWVudF90eXBlID09PSAnZW5zZW1ibGUnO1xuICAgIH0pLmxlbmd0aDtcblxuICAgIC8vIFVwZGF0ZSBhY3RpdmF0aW9uIG1ldHJpY3Mgd2l0aCBhY3R1YWwgbmVzdGluZyBkZXB0aFxuICAgIHRoaXMudXBkYXRlQWN0aXZhdGlvbk1ldHJpY3MocmVzdWx0LCBuZXN0aW5nRGVwdGgpO1xuXG4gICAgLy8gTG9nIGFjdGl2YXRpb24gcmVzdWx0XG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgdHlwZTogJ0VMRU1FTlRfQ1JFQVRFRCcsICAvLyBHZW5lcmljIGVsZW1lbnQgZXZlbnQgKGVuc2VtYmxlcyBkb24ndCBoYXZlIGN1c3RvbSBzZWN1cml0eSBldmVudCB0eXBlcyB5ZXQpXG4gICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICBzb3VyY2U6ICdFbnNlbWJsZS5hY3RpdmF0ZScsXG4gICAgICBkZXRhaWxzOiBgRW5zZW1ibGUgJHt0aGlzLm1ldGFkYXRhLm5hbWV9IGFjdGl2YXRlZDogJHtyZXN1bHQuYWN0aXZhdGVkRWxlbWVudHMubGVuZ3RofSBlbGVtZW50cywgJHtyZXN1bHQuZmFpbGVkRWxlbWVudHMubGVuZ3RofSBmYWlsdXJlc2AsXG4gICAgICBtZXRhZGF0YToge1xuICAgICAgICBuZXN0ZWRFbnNlbWJsZXM6IG5lc3RlZEVuc2VtYmxlQ291bnQsXG4gICAgICAgIGR1cmF0aW9uOiByZXN1bHQudG90YWxEdXJhdGlvbixcbiAgICAgICAgbWV0cmljczogdGhpcy5nZXRBY3RpdmF0aW9uTWV0cmljcygpXG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBTdHJ1Y3R1cmVkIGxvZ2dpbmc6IEFjdGl2YXRpb24gY29tcGxldGUgd2l0aCBtZXRyaWNzXG4gICAgaWYgKHJlc3VsdC5mYWlsZWRFbGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICBsb2dnZXIud2FybignRW5zZW1ibGUgYWN0aXZhdGlvbiBjb21wbGV0ZWQgd2l0aCBmYWlsdXJlcycsIHRoaXMuZ2V0TG9nQ29udGV4dCh7XG4gICAgICAgIGFjdGl2YXRlZENvdW50OiByZXN1bHQuYWN0aXZhdGVkRWxlbWVudHMubGVuZ3RoLFxuICAgICAgICBmYWlsZWRDb3VudDogcmVzdWx0LmZhaWxlZEVsZW1lbnRzLmxlbmd0aCxcbiAgICAgICAgZmFpbGVkRWxlbWVudHM6IHJlc3VsdC5mYWlsZWRFbGVtZW50cyxcbiAgICAgICAgbmVzdGVkRW5zZW1ibGVzOiBuZXN0ZWRFbnNlbWJsZUNvdW50LFxuICAgICAgICBkdXJhdGlvbjogcmVzdWx0LnRvdGFsRHVyYXRpb24sXG4gICAgICAgIG1ldHJpY3M6IHRoaXMuZ2V0QWN0aXZhdGlvbk1ldHJpY3MoKVxuICAgICAgfSkpO1xuICAgICAgcmVzdWx0LnN1Y2Nlc3MgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nZ2VyLmluZm8oJ0Vuc2VtYmxlIGFjdGl2YXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseScsIHRoaXMuZ2V0TG9nQ29udGV4dCh7XG4gICAgICAgIGFjdGl2YXRlZENvdW50OiByZXN1bHQuYWN0aXZhdGVkRWxlbWVudHMubGVuZ3RoLFxuICAgICAgICBuZXN0ZWRFbnNlbWJsZXM6IG5lc3RlZEVuc2VtYmxlQ291bnQsXG4gICAgICAgIGR1cmF0aW9uOiByZXN1bHQudG90YWxEdXJhdGlvbixcbiAgICAgICAgYXZlcmFnZUVsZW1lbnRUaW1lOiByZXN1bHQudG90YWxEdXJhdGlvbiAvIE1hdGgubWF4KHJlc3VsdC5hY3RpdmF0ZWRFbGVtZW50cy5sZW5ndGgsIDEpLFxuICAgICAgICBtZXRyaWNzOiB0aGlzLmdldEFjdGl2YXRpb25NZXRyaWNzKClcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIERlYWN0aXZhdGUgdGhlIGVuc2VtYmxlIGFuZCBhbGwgaXRzIGVsZW1lbnRzXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgZGVhY3RpdmF0ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLl9zdGF0dXMgPSBFbGVtZW50U3RhdHVzLklOQUNUSVZFO1xuXG4gICAgLy8gRGVhY3RpdmF0ZSBhbGwgZWxlbWVudCBpbnN0YW5jZXNcbiAgICBjb25zdCBkZWFjdGl2YXRpb25Qcm9taXNlczogUHJvbWlzZTx2b2lkPltdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IFtlbGVtZW50TmFtZSwgaW5zdGFuY2VdIG9mIHRoaXMuZWxlbWVudEluc3RhbmNlcykge1xuICAgICAgaWYgKGluc3RhbmNlLmRlYWN0aXZhdGUpIHtcbiAgICAgICAgZGVhY3RpdmF0aW9uUHJvbWlzZXMucHVzaChcbiAgICAgICAgICBpbnN0YW5jZS5kZWFjdGl2YXRlKCkuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gZGVhY3RpdmF0ZSBlbGVtZW50ICR7ZWxlbWVudE5hbWV9OmAsIGVycm9yKTtcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IFByb21pc2UuYWxsKGRlYWN0aXZhdGlvblByb21pc2VzKTtcblxuICAgIC8vIENsZWFyIHNoYXJlZCBjb250ZXh0XG4gICAgdGhpcy5zaGFyZWRDb250ZXh0LnZhbHVlcy5jbGVhcigpO1xuICAgIHRoaXMuc2hhcmVkQ29udGV4dC5vd25lcnMuY2xlYXIoKTtcbiAgICB0aGlzLnNoYXJlZENvbnRleHQudGltZXN0YW1wcy5jbGVhcigpO1xuXG4gICAgbG9nZ2VyLmluZm8oYEVuc2VtYmxlICR7dGhpcy5pZH0gZGVhY3RpdmF0ZWRgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSB0aGUgZW5zZW1ibGUgY29uZmlndXJhdGlvblxuICAgKiBPdmVycmlkZXMgQmFzZUVsZW1lbnQudmFsaWRhdGUoKSB0byBhZGQgZW5zZW1ibGUtc3BlY2lmaWMgY2hlY2tzXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgdmFsaWRhdGUoKTogRWxlbWVudFZhbGlkYXRpb25SZXN1bHQge1xuICAgIC8vIENhbGwgYmFzZSB2YWxpZGF0aW9uIGZpcnN0XG4gICAgY29uc3QgcmVzdWx0ID0gc3VwZXIudmFsaWRhdGUoKTtcblxuICAgIC8vIEluaXRpYWxpemUgYXJyYXlzIGlmIHRoZXkgZG9uJ3QgZXhpc3RcbiAgICBpZiAoIXJlc3VsdC5lcnJvcnMpIHJlc3VsdC5lcnJvcnMgPSBbXTtcbiAgICBpZiAoIXJlc3VsdC53YXJuaW5ncykgcmVzdWx0Lndhcm5pbmdzID0gW107XG5cbiAgICAvLyBDaGVjayBmb3IgY2lyY3VsYXIgZGVwZW5kZW5jaWVzXG4gICAgY29uc3QgY2lyY3VsYXIgPSB0aGlzLmRldGVjdEFsbENpcmN1bGFyRGVwZW5kZW5jaWVzKCk7XG4gICAgaWYgKGNpcmN1bGFyLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAoY29uc3QgY3ljbGUgb2YgY2lyY3VsYXIpIHtcbiAgICAgICAgcmVzdWx0LmVycm9ycy5wdXNoKHtcbiAgICAgICAgICBmaWVsZDogJ2RlcGVuZGVuY2llcycsXG4gICAgICAgICAgbWVzc2FnZTogY3ljbGUubWVzc2FnZSxcbiAgICAgICAgICBzZXZlcml0eTogJ2hpZ2gnXG4gICAgICAgIH0gYXMgVmFsaWRhdGlvbkVycm9yKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBlbGVtZW50IGNvdW50XG4gICAgaWYgKHRoaXMuZWxlbWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXN1bHQud2FybmluZ3MucHVzaCh7XG4gICAgICAgIGZpZWxkOiAnZWxlbWVudHMnLFxuICAgICAgICBtZXNzYWdlOiAnRW5zZW1ibGUgaGFzIG5vIGVsZW1lbnRzJyxcbiAgICAgICAgc3VnZ2VzdGlvbjogJ0FkZCBlbGVtZW50cyB1c2luZyBhZGRFbGVtZW50KCknLFxuICAgICAgICBzZXZlcml0eTogJ2xvdydcbiAgICAgIH0gYXMgVmFsaWRhdGlvbldhcm5pbmcpO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBvcnBoYW5lZCBkZXBlbmRlbmNpZXNcbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgdGhpcy5lbGVtZW50cykge1xuICAgICAgaWYgKGVsZW1lbnQuZGVwZW5kZW5jaWVzKSB7XG4gICAgICAgIGZvciAoY29uc3QgZGVwIG9mIGVsZW1lbnQuZGVwZW5kZW5jaWVzKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmhhc0VsZW1lbnQoZGVwKSkge1xuICAgICAgICAgICAgcmVzdWx0LmVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgICAgZmllbGQ6IGAke2VsZW1lbnQuZWxlbWVudF9uYW1lfS5kZXBlbmRlbmNpZXNgLFxuICAgICAgICAgICAgICBtZXNzYWdlOiBgRGVwZW5kZW5jeSAnJHtkZXB9JyBub3QgZm91bmQgaW4gZW5zZW1ibGVgLFxuICAgICAgICAgICAgICBzZXZlcml0eTogJ21lZGl1bSdcbiAgICAgICAgICAgIH0gYXMgVmFsaWRhdGlvbkVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgdmFsaWQgZmxhZyBiYXNlZCBvbiBlcnJvcnNcbiAgICByZXN1bHQudmFsaWQgPSByZXN1bHQuZXJyb3JzLmxlbmd0aCA9PT0gMDtcblxuICAgIC8vIENsZWFuIHVwIGVtcHR5IGFycmF5c1xuICAgIGlmIChyZXN1bHQuZXJyb3JzLmxlbmd0aCA9PT0gMCkgcmVzdWx0LmVycm9ycyA9IHVuZGVmaW5lZDtcbiAgICBpZiAocmVzdWx0Lndhcm5pbmdzLmxlbmd0aCA9PT0gMCkgcmVzdWx0Lndhcm5pbmdzID0gdW5kZWZpbmVkO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09IFBSSVZBVEUgTUVUSE9EUyA9PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmUgYWN0aXZhdGlvbiBvcmRlciBiYXNlZCBvbiBzdHJhdGVneVxuICAgKi9cbiAgcHJpdmF0ZSBnZXRBY3RpdmF0aW9uT3JkZXIoKTogc3RyaW5nW10ge1xuICAgIHN3aXRjaCAodGhpcy5tZXRhZGF0YS5hY3RpdmF0aW9uU3RyYXRlZ3kpIHtcbiAgICAgIGNhc2UgJ3NlcXVlbnRpYWwnOlxuICAgICAgICAvLyBUb3BvbG9naWNhbCBzb3J0IGJhc2VkIG9uIGRlcGVuZGVuY2llc1xuICAgICAgICByZXR1cm4gdGhpcy50b3BvbG9naWNhbFNvcnQoKTtcblxuICAgICAgY2FzZSAncHJpb3JpdHknOiB7XG4gICAgICAgIC8vIFNvcnQgYnkgcHJpb3JpdHkgKGhpZ2hlc3QgZmlyc3QpXG4gICAgICAgIGNvbnN0IHByaW9yaXR5U29ydGVkID0gWy4uLnRoaXMuZWxlbWVudHNdXG4gICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGIucHJpb3JpdHkgLSBhLnByaW9yaXR5KTtcbiAgICAgICAgcmV0dXJuIHByaW9yaXR5U29ydGVkLm1hcChlbCA9PiBlbC5lbGVtZW50X25hbWUpO1xuICAgICAgfVxuXG4gICAgICBjYXNlICdhbGwnOlxuICAgICAgY2FzZSAnY29uZGl0aW9uYWwnOlxuICAgICAgY2FzZSAnbGF6eSc6XG4gICAgICAgIC8vIEFsbCBlbGVtZW50cywgbmF0dXJhbCBvcmRlclxuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50cy5tYXAoZWwgPT4gZWwuZWxlbWVudF9uYW1lKTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudHMubWFwKGVsID0+IGVsLmVsZW1lbnRfbmFtZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRvcG9sb2dpY2FsIHNvcnQgZm9yIGRlcGVuZGVuY3ktYmFzZWQgYWN0aXZhdGlvbiBvcmRlclxuICAgKi9cbiAgcHJpdmF0ZSB0b3BvbG9naWNhbFNvcnQoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHZpc2l0ZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBjb25zdCBvcmRlcjogc3RyaW5nW10gPSBbXTtcblxuICAgIGNvbnN0IHZpc2l0ID0gKGVsZW1lbnROYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgIGlmICh2aXNpdGVkLmhhcyhlbGVtZW50TmFtZSkpIHJldHVybjtcbiAgICAgIHZpc2l0ZWQuYWRkKGVsZW1lbnROYW1lKTtcblxuICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZmluZEVsZW1lbnRCeU5hbWUoZWxlbWVudE5hbWUpO1xuICAgICAgaWYgKGVsZW1lbnQ/LmRlcGVuZGVuY2llcykge1xuICAgICAgICBmb3IgKGNvbnN0IGRlcCBvZiBlbGVtZW50LmRlcGVuZGVuY2llcykge1xuICAgICAgICAgIGlmICh0aGlzLmhhc0VsZW1lbnQoZGVwKSkge1xuICAgICAgICAgICAgdmlzaXQoZGVwKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgb3JkZXIucHVzaChlbGVtZW50TmFtZSk7XG4gICAgfTtcblxuICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiB0aGlzLmVsZW1lbnRzKSB7XG4gICAgICB2aXNpdChlbGVtZW50LmVsZW1lbnRfbmFtZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9yZGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjdGl2YXRlIGVsZW1lbnRzIHNlcXVlbnRpYWxseSBpbiBkZXBlbmRlbmN5IG9yZGVyXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGFjdGl2YXRlU2VxdWVudGlhbChcbiAgICBvcmRlcjogc3RyaW5nW10sXG4gICAgcmVzdWx0OiBFbnNlbWJsZUFjdGl2YXRpb25SZXN1bHQsXG4gICAgcG9ydGZvbGlvTWFuYWdlcjogUG9ydGZvbGlvTWFuYWdlcixcbiAgICBtYW5hZ2VyczogaW1wb3J0KCcuL3R5cGVzLmpzJykuRWxlbWVudE1hbmFnZXJzLFxuICAgIG5lc3RpbmdEZXB0aDogbnVtYmVyXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGZvciAoY29uc3QgZWxlbWVudE5hbWUgb2Ygb3JkZXIpIHtcbiAgICAgIGF3YWl0IHRoaXMuYWN0aXZhdGVTaW5nbGVFbGVtZW50KGVsZW1lbnROYW1lLCByZXN1bHQsIHBvcnRmb2xpb01hbmFnZXIsIG1hbmFnZXJzLCBuZXN0aW5nRGVwdGgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBY3RpdmF0ZSBhbGwgZWxlbWVudHMgc2ltdWx0YW5lb3VzbHlcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYWN0aXZhdGVBbGwoXG4gICAgb3JkZXI6IHN0cmluZ1tdLFxuICAgIHJlc3VsdDogRW5zZW1ibGVBY3RpdmF0aW9uUmVzdWx0LFxuICAgIHBvcnRmb2xpb01hbmFnZXI6IFBvcnRmb2xpb01hbmFnZXIsXG4gICAgbWFuYWdlcnM6IGltcG9ydCgnLi90eXBlcy5qcycpLkVsZW1lbnRNYW5hZ2VycyxcbiAgICBuZXN0aW5nRGVwdGg6IG51bWJlclxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBhY3RpdmF0aW9uUHJvbWlzZXMgPSBvcmRlci5tYXAoZWxlbWVudE5hbWUgPT5cbiAgICAgIHRoaXMuYWN0aXZhdGVTaW5nbGVFbGVtZW50KGVsZW1lbnROYW1lLCByZXN1bHQsIHBvcnRmb2xpb01hbmFnZXIsIG1hbmFnZXJzLCBuZXN0aW5nRGVwdGgpXG4gICAgKTtcblxuICAgIGF3YWl0IFByb21pc2UuYWxsKGFjdGl2YXRpb25Qcm9taXNlcyk7XG4gIH1cblxuICAvKipcbiAgICogQWN0aXZhdGUgZWxlbWVudHMgYnkgcHJpb3JpdHkgKGhpZ2hlc3QgZmlyc3QpXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGFjdGl2YXRlUHJpb3JpdHkoXG4gICAgb3JkZXI6IHN0cmluZ1tdLFxuICAgIHJlc3VsdDogRW5zZW1ibGVBY3RpdmF0aW9uUmVzdWx0LFxuICAgIHBvcnRmb2xpb01hbmFnZXI6IFBvcnRmb2xpb01hbmFnZXIsXG4gICAgbWFuYWdlcnM6IGltcG9ydCgnLi90eXBlcy5qcycpLkVsZW1lbnRNYW5hZ2VycyxcbiAgICBuZXN0aW5nRGVwdGg6IG51bWJlclxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBvcmRlciBpcyBhbHJlYWR5IHNvcnRlZCBieSBwcmlvcml0eSBmcm9tIGdldEFjdGl2YXRpb25PcmRlcigpXG4gICAgZm9yIChjb25zdCBlbGVtZW50TmFtZSBvZiBvcmRlcikge1xuICAgICAgYXdhaXQgdGhpcy5hY3RpdmF0ZVNpbmdsZUVsZW1lbnQoZWxlbWVudE5hbWUsIHJlc3VsdCwgcG9ydGZvbGlvTWFuYWdlciwgbWFuYWdlcnMsIG5lc3RpbmdEZXB0aCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFjdGl2YXRlIGVsZW1lbnRzIGJhc2VkIG9uIGNvbmRpdGlvbnNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYWN0aXZhdGVDb25kaXRpb25hbChcbiAgICBvcmRlcjogc3RyaW5nW10sXG4gICAgcmVzdWx0OiBFbnNlbWJsZUFjdGl2YXRpb25SZXN1bHQsXG4gICAgcG9ydGZvbGlvTWFuYWdlcjogUG9ydGZvbGlvTWFuYWdlcixcbiAgICBtYW5hZ2VyczogaW1wb3J0KCcuL3R5cGVzLmpzJykuRWxlbWVudE1hbmFnZXJzLFxuICAgIG5lc3RpbmdEZXB0aDogbnVtYmVyXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxvZ2dlci53YXJuKFxuICAgICAgYENvbmRpdGlvbmFsIGFjdGl2YXRpb24gc3RyYXRlZ3kgc2VsZWN0ZWQsIGJ1dCBjb25kaXRpb24gZXZhbHVhdGlvbiBgICtcbiAgICAgIGBpcyBub3QgeWV0IGltcGxlbWVudGVkLiBBbGwgY29uZGl0aW9uYWwgZWxlbWVudHMgd2lsbCBiZSBhY3RpdmF0ZWQuYFxuICAgICk7XG5cbiAgICAvLyBUcmFjayBhY3RpdmF0aW9uIHN0YXJ0IHRpbWUgZm9yIGNvbnRleHQgYnVpbGRpbmdcbiAgICBjb25zdCBhY3RpdmF0aW9uU3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcblxuICAgIGZvciAoY29uc3QgZWxlbWVudE5hbWUgb2Ygb3JkZXIpIHtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmZpbmRFbGVtZW50QnlOYW1lKGVsZW1lbnROYW1lKSE7XG5cbiAgICAgIC8vIERldGVybWluZSBpZiBlbGVtZW50IHNob3VsZCBiZSBhY3RpdmF0ZWRcbiAgICAgIGxldCBzaG91bGRBY3RpdmF0ZSA9IGZhbHNlO1xuXG4gICAgICBpZiAoZWxlbWVudC5hY3RpdmF0aW9uID09PSAnYWx3YXlzJykge1xuICAgICAgICAvLyBBbHdheXMgYWN0aXZhdGUgZWxlbWVudHMgd2l0aCAnYWx3YXlzJyBtb2RlXG4gICAgICAgIHNob3VsZEFjdGl2YXRlID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5hY3RpdmF0aW9uID09PSAnY29uZGl0aW9uYWwnICYmIGVsZW1lbnQuY29uZGl0aW9uKSB7XG4gICAgICAgIC8vIEV2YWx1YXRlIGNvbmRpdGlvbiBmb3IgY29uZGl0aW9uYWwgZWxlbWVudHNcbiAgICAgICAgc2hvdWxkQWN0aXZhdGUgPSB0aGlzLmV2YWx1YXRlQ29uZGl0aW9uKFxuICAgICAgICAgIGVsZW1lbnQuY29uZGl0aW9uLFxuICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgYWN0aXZhdGlvblN0YXJ0VGltZSxcbiAgICAgICAgICByZXN1bHRcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFzaG91bGRBY3RpdmF0ZSkge1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgU2tpcHBpbmcgJHtlbGVtZW50TmFtZX06IGNvbmRpdGlvbiBub3QgbWV0YCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5hY3RpdmF0aW9uID09PSAnY29uZGl0aW9uYWwnICYmICFlbGVtZW50LmNvbmRpdGlvbikge1xuICAgICAgICAvLyBDb25kaXRpb25hbCBlbGVtZW50cyB3aXRob3V0IGEgY29uZGl0aW9uIGRlZmF1bHQgdG8gYWN0aXZhdGVkXG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgJHtlbGVtZW50TmFtZX06IGNvbmRpdGlvbmFsIGFjdGl2YXRpb24gd2l0aG91dCBjb25kaXRpb24sIGRlZmF1bHRpbmcgdG8gdHJ1ZWApO1xuICAgICAgICBzaG91bGRBY3RpdmF0ZSA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKGVsZW1lbnQuYWN0aXZhdGlvbiA9PT0gJ29uLWRlbWFuZCcpIHtcbiAgICAgICAgLy8gT24tZGVtYW5kIGVsZW1lbnRzIGFyZSBub3QgYWN0aXZhdGVkIGF1dG9tYXRpY2FsbHkgaW4gY29uZGl0aW9uYWwgc3RyYXRlZ3lcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBTa2lwcGluZyAke2VsZW1lbnROYW1lfTogb24tZGVtYW5kIGFjdGl2YXRpb24gbW9kZWApO1xuICAgICAgICBzaG91bGRBY3RpdmF0ZSA9IGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRGVmYXVsdCBiZWhhdmlvciBmb3IgdW5zcGVjaWZpZWQgYWN0aXZhdGlvbiBtb2RlXG4gICAgICAgIHNob3VsZEFjdGl2YXRlID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNob3VsZEFjdGl2YXRlKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYWN0aXZhdGVTaW5nbGVFbGVtZW50KGVsZW1lbnROYW1lLCByZXN1bHQsIHBvcnRmb2xpb01hbmFnZXIsIG1hbmFnZXJzLCBuZXN0aW5nRGVwdGgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBY3RpdmF0ZSBhIHNpbmdsZSBlbGVtZW50IGFuZCB0cmFjayByZXN1bHRzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGFjdGl2YXRlU2luZ2xlRWxlbWVudChcbiAgICBlbGVtZW50TmFtZTogc3RyaW5nLFxuICAgIHJlc3VsdDogRW5zZW1ibGVBY3RpdmF0aW9uUmVzdWx0LFxuICAgIHBvcnRmb2xpb01hbmFnZXI6IFBvcnRmb2xpb01hbmFnZXIsXG4gICAgbWFuYWdlcnM6IGltcG9ydCgnLi90eXBlcy5qcycpLkVsZW1lbnRNYW5hZ2VycyxcbiAgICBuZXN0aW5nRGVwdGg6IG51bWJlclxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IGVsZW1lbnRDb25maWcgPSB0aGlzLmZpbmRFbGVtZW50QnlOYW1lKGVsZW1lbnROYW1lKSE7XG4gICAgY29uc3QgaXNOZXN0ZWRFbnNlbWJsZSA9IGVsZW1lbnRDb25maWcuZWxlbWVudF90eXBlID09PSAnZW5zZW1ibGUnO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIExvYWQgZWxlbWVudCBpbnN0YW5jZSBpZiBub3QgYWxyZWFkeSBsb2FkZWRcbiAgICAgIGlmICghdGhpcy5lbGVtZW50SW5zdGFuY2VzLmhhcyhlbGVtZW50TmFtZSkpIHtcbiAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBhd2FpdCB0aGlzLmxvYWRFbGVtZW50SW5zdGFuY2UoZWxlbWVudENvbmZpZywgcG9ydGZvbGlvTWFuYWdlciwgbWFuYWdlcnMpO1xuICAgICAgICB0aGlzLmVsZW1lbnRJbnN0YW5jZXMuc2V0KGVsZW1lbnROYW1lLCBpbnN0YW5jZSk7XG4gICAgICAgIHRoaXMuaW5zdGFuY2VBY2Nlc3NUaW1lcy5zZXQoZWxlbWVudE5hbWUsIERhdGUubm93KCkpO1xuXG4gICAgICAgIC8vIEV2aWN0IGlmIGNhY2hlIGlzIHRvbyBsYXJnZVxuICAgICAgICB0aGlzLmV2aWN0T2xkZXN0SW5zdGFuY2UoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFVwZGF0ZSBhY2Nlc3MgdGltZVxuICAgICAgICB0aGlzLmluc3RhbmNlQWNjZXNzVGltZXMuc2V0KGVsZW1lbnROYW1lLCBEYXRlLm5vdygpKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaW5zdGFuY2UgPSB0aGlzLmVsZW1lbnRJbnN0YW5jZXMuZ2V0KGVsZW1lbnROYW1lKSE7XG5cbiAgICAgIC8vIEFjdGl2YXRlIHZpYSB0aGUgdHlwZSBtYW5hZ2VyJ3MgYWN0aXZhdGlvbiBtZXRob2QsIHdoaWNoIGJvdGggc2V0cyB0aGVcbiAgICAgIC8vIGluc3RhbmNlIHN0YXR1cyBBTkQgcmVnaXN0ZXJzIHRoZSBlbGVtZW50IGluIHRoZSBtYW5hZ2VyJ3MgYWN0aXZlIHNldC5cbiAgICAgIC8vIFVzaW5nIGluc3RhbmNlLmFjdGl2YXRlKCkgYWxvbmUgb25seSBzZXRzIHRoZSBzdGF0dXMgZmxhZyDigJQgdGhlIG1hbmFnZXJcbiAgICAgIC8vIHdvbid0IGtub3cgdGhlIGVsZW1lbnQgaXMgYWN0aXZlLCBzbyBnZXRfYWN0aXZlX2VsZW1lbnRzIHJldHVybnMgbm90aGluZy5cbiAgICAgIC8vIEBzZWUgSXNzdWUgIzE3NjkgLSBFbnNlbWJsZSBhY3RpdmF0aW9uIG5vdCByZWdpc3RlcmluZyB3aXRoIHR5cGUgbWFuYWdlcnNcbiAgICAgIGNvbnN0IGFjdGl2YXRlZCA9IGF3YWl0IHRoaXMuYWN0aXZhdGVWaWFNYW5hZ2VyKGVsZW1lbnROYW1lLCBlbGVtZW50Q29uZmlnLmVsZW1lbnRfdHlwZSwgbWFuYWdlcnMpO1xuICAgICAgaWYgKCFhY3RpdmF0ZWQpIHtcbiAgICAgICAgLy8gRmFsbGJhY2s6IGFjdGl2YXRlIHRoZSBpbnN0YW5jZSBkaXJlY3RseSBpZiBubyBtYW5hZ2VyIGF2YWlsYWJsZVxuICAgICAgICBpZiAoaW5zdGFuY2UuYWN0aXZhdGUpIHtcbiAgICAgICAgICBhd2FpdCBpbnN0YW5jZS5hY3RpdmF0ZSgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRoaXMgaXMgYSBuZXN0ZWQgZW5zZW1ibGUsIGNhbGwgYWN0aXZhdGVFbnNlbWJsZSB3aXRoIGluY3JlbWVudGVkIGRlcHRoXG4gICAgICBpZiAoaXNOZXN0ZWRFbnNlbWJsZSAmJiAnYWN0aXZhdGVFbnNlbWJsZScgaW4gaW5zdGFuY2UgJiYgdHlwZW9mIGluc3RhbmNlLmFjdGl2YXRlRW5zZW1ibGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgYXdhaXQgKGluc3RhbmNlIGFzIGFueSkuYWN0aXZhdGVFbnNlbWJsZShwb3J0Zm9saW9NYW5hZ2VyLCBtYW5hZ2VycywgbmVzdGluZ0RlcHRoICsgMSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGR1cmF0aW9uID0gRGF0ZS5ub3coKSAtIHN0YXJ0VGltZTtcbiAgICAgIHJlc3VsdC5hY3RpdmF0ZWRFbGVtZW50cy5wdXNoKGVsZW1lbnROYW1lKTtcbiAgICAgIHJlc3VsdC5lbGVtZW50UmVzdWx0cy5wdXNoKHtcbiAgICAgICAgZWxlbWVudE5hbWUsXG4gICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgIGR1cmF0aW9uLFxuICAgICAgICBpc05lc3RlZEVuc2VtYmxlLFxuICAgICAgICBuZXN0aW5nRGVwdGg6IGlzTmVzdGVkRW5zZW1ibGUgPyBuZXN0aW5nRGVwdGggKyAxIDogbmVzdGluZ0RlcHRoXG4gICAgICB9KTtcblxuICAgICAgbG9nZ2VyLmRlYnVnKGBFbGVtZW50ICR7ZWxlbWVudE5hbWV9IGFjdGl2YXRlZCBpbiAke2R1cmF0aW9ufW1zYCwge1xuICAgICAgICBpc05lc3RlZEVuc2VtYmxlLFxuICAgICAgICBuZXN0aW5nRGVwdGg6IGlzTmVzdGVkRW5zZW1ibGUgPyBuZXN0aW5nRGVwdGggKyAxIDogbmVzdGluZ0RlcHRoXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgZHVyYXRpb24gPSBEYXRlLm5vdygpIC0gc3RhcnRUaW1lO1xuICAgICAgcmVzdWx0LmZhaWxlZEVsZW1lbnRzLnB1c2goZWxlbWVudE5hbWUpO1xuICAgICAgcmVzdWx0LmVsZW1lbnRSZXN1bHRzLnB1c2goe1xuICAgICAgICBlbGVtZW50TmFtZSxcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIGR1cmF0aW9uLFxuICAgICAgICBlcnJvcjogZXJyb3IgYXMgRXJyb3IsXG4gICAgICAgIGlzTmVzdGVkRW5zZW1ibGUsXG4gICAgICAgIG5lc3RpbmdEZXB0aDogaXNOZXN0ZWRFbnNlbWJsZSA/IG5lc3RpbmdEZXB0aCArIDEgOiBuZXN0aW5nRGVwdGhcbiAgICAgIH0pO1xuXG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBhY3RpdmF0ZSBlbGVtZW50ICR7ZWxlbWVudE5hbWV9OmAsIGVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWN0aXZhdGUgYW4gZWxlbWVudCB2aWEgaXRzIHR5cGUgbWFuYWdlcidzIGFjdGl2YXRpb24gbWV0aG9kLlxuICAgKiBUaGlzIHJlZ2lzdGVycyB0aGUgZWxlbWVudCBpbiB0aGUgbWFuYWdlcidzIGFjdGl2ZSBzZXQgc28gdGhhdFxuICAgKiBnZXRfYWN0aXZlX2VsZW1lbnRzIGNvcnJlY3RseSByZXBvcnRzIGl0LlxuICAgKlxuICAgKiBAcmV0dXJucyB0cnVlIGlmIGFjdGl2YXRpb24gd2VudCB0aHJvdWdoIGEgbWFuYWdlciwgZmFsc2UgaWYgbm8gbWFuYWdlciBhdmFpbGFibGVcbiAgICogQHNlZSBJc3N1ZSAjMTc2OSAtIEVuc2VtYmxlIGFjdGl2YXRpb24gbm90IHJlZ2lzdGVyaW5nIHdpdGggdHlwZSBtYW5hZ2Vyc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBhY3RpdmF0ZVZpYU1hbmFnZXIoXG4gICAgZWxlbWVudE5hbWU6IHN0cmluZyxcbiAgICBlbGVtZW50VHlwZTogc3RyaW5nLFxuICAgIG1hbmFnZXJzOiBpbXBvcnQoJy4vdHlwZXMuanMnKS5FbGVtZW50TWFuYWdlcnNcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IHRoaXMubm9ybWFsaXplRWxlbWVudFR5cGUoZWxlbWVudFR5cGUpO1xuXG4gICAgc3dpdGNoIChub3JtYWxpemVkKSB7XG4gICAgICBjYXNlICdza2lsbCc6IHtcbiAgICAgICAgY29uc3QgbWdyID0gbWFuYWdlcnMuc2tpbGxNYW5hZ2VyIGFzIGFueTtcbiAgICAgICAgaWYgKG1ncj8uYWN0aXZhdGVTa2lsbCkgeyBhd2FpdCBtZ3IuYWN0aXZhdGVTa2lsbChlbGVtZW50TmFtZSk7IHJldHVybiB0cnVlOyB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3BlcnNvbmEnOiB7XG4gICAgICAgIGNvbnN0IG1nciA9IG1hbmFnZXJzLnBlcnNvbmFNYW5hZ2VyO1xuICAgICAgICBpZiAobWdyPy5hY3RpdmF0ZVBlcnNvbmEpIHsgYXdhaXQgbWdyLmFjdGl2YXRlUGVyc29uYShlbGVtZW50TmFtZSk7IHJldHVybiB0cnVlOyB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2FnZW50Jzoge1xuICAgICAgICBjb25zdCBtZ3IgPSBtYW5hZ2Vycy5hZ2VudE1hbmFnZXIgYXMgYW55O1xuICAgICAgICBpZiAobWdyPy5hY3RpdmF0ZUFnZW50KSB7IGF3YWl0IG1nci5hY3RpdmF0ZUFnZW50KGVsZW1lbnROYW1lKTsgcmV0dXJuIHRydWU7IH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgY2FzZSAnbWVtb3J5Jzoge1xuICAgICAgICBjb25zdCBtZ3IgPSBtYW5hZ2Vycy5tZW1vcnlNYW5hZ2VyIGFzIGFueTtcbiAgICAgICAgaWYgKG1ncj8uYWN0aXZhdGVNZW1vcnkpIHsgYXdhaXQgbWdyLmFjdGl2YXRlTWVtb3J5KGVsZW1lbnROYW1lKTsgcmV0dXJuIHRydWU7IH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgY2FzZSAnZW5zZW1ibGUnOiB7XG4gICAgICAgIGNvbnN0IG1nciA9IG1hbmFnZXJzLmVuc2VtYmxlTWFuYWdlciBhcyBhbnk7XG4gICAgICAgIGlmIChtZ3I/LmFjdGl2YXRlRW5zZW1ibGUpIHsgYXdhaXQgbWdyLmFjdGl2YXRlRW5zZW1ibGUoZWxlbWVudE5hbWUpOyByZXR1cm4gdHJ1ZTsgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBjYXNlICd0ZW1wbGF0ZSc6IHtcbiAgICAgICAgLy8gVGVtcGxhdGVzIGRvbid0IGhhdmUgYWN0aXZhdGlvbiBzdGF0ZSDigJQganVzdCBhY3RpdmF0ZSB0aGUgaW5zdGFuY2VcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIGFuIGVsZW1lbnQgaW5zdGFuY2UgZnJvbSBwb3J0Zm9saW9cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbG9hZEVsZW1lbnRJbnN0YW5jZShcbiAgICBlbGVtZW50OiBFbnNlbWJsZUVsZW1lbnQsXG4gICAgcG9ydGZvbGlvTWFuYWdlcjogUG9ydGZvbGlvTWFuYWdlcixcbiAgICBtYW5hZ2VyczogaW1wb3J0KCcuL3R5cGVzLmpzJykuRWxlbWVudE1hbmFnZXJzXG4gICk6IFByb21pc2U8SUVsZW1lbnQ+IHtcbiAgICBjb25zdCBlbGVtZW50VHlwZSA9IGVsZW1lbnQuZWxlbWVudF90eXBlLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgaXNOZXN0ZWRFbnNlbWJsZSA9IGVsZW1lbnRUeXBlID09PSAnZW5zZW1ibGUnIHx8IGVsZW1lbnRUeXBlID09PSAnZW5zZW1ibGVzJztcblxuICAgIC8vIFN0cnVjdHVyZWQgbG9nZ2luZzogRWxlbWVudCBsb2FkaW5nIHdpdGggbmVzdGluZyBkZXRlY3Rpb25cbiAgICBsb2dnZXIuZGVidWcoJ0xvYWRpbmcgZWxlbWVudCBmb3IgZW5zZW1ibGUnLCB0aGlzLmdldExvZ0NvbnRleHQoe1xuICAgICAgZWxlbWVudE5hbWU6IGVsZW1lbnQuZWxlbWVudF9uYW1lLFxuICAgICAgZWxlbWVudFR5cGU6IGVsZW1lbnRUeXBlLFxuICAgICAgaXNOZXN0ZWRFbnNlbWJsZSxcbiAgICAgIHJvbGU6IGVsZW1lbnQucm9sZSxcbiAgICAgIHByaW9yaXR5OiBlbGVtZW50LnByaW9yaXR5XG4gICAgfSkpO1xuXG4gICAgY29uc3Qgbm9ybWFsaXplZFR5cGUgPSB0aGlzLm5vcm1hbGl6ZUVsZW1lbnRUeXBlKGVsZW1lbnRUeXBlKTtcbiAgICBjb25zdCBtYW5hZ2VyID0gdGhpcy5nZXRNYW5hZ2VyRm9yVHlwZShub3JtYWxpemVkVHlwZSwgbWFuYWdlcnMpO1xuXG4gICAgaWYgKCFtYW5hZ2VyKSB7XG4gICAgICBjb25zdCBlbnNlbWJsZUNvbnRleHQgPSBgaW4gZW5zZW1ibGUgXCIke3RoaXMubWV0YWRhdGEubmFtZX1cIiAoJHt0aGlzLmlkfSlgO1xuICAgICAgY29uc3QgbmVzdGVkSGludCA9IG5vcm1hbGl6ZWRUeXBlID09PSAnZW5zZW1ibGUnXG4gICAgICAgID8gJ1xcbiAg4oaSIEZvciBuZXN0ZWQgZW5zZW1ibGVzLCBlbnN1cmUgRW5zZW1ibGVNYW5hZ2VyIGlzIHByb3ZpZGVkIGluIG1hbmFnZXJzIHBhcmFtZXRlcidcbiAgICAgICAgOiAnJztcblxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRmFpbGVkIHRvIGxvYWQgZWxlbWVudCBcIiR7ZWxlbWVudC5lbGVtZW50X25hbWV9XCIgb2YgdHlwZSBcIiR7bm9ybWFsaXplZFR5cGV9XCIgJHtlbnNlbWJsZUNvbnRleHR9LlxcbmAgK1xuICAgICAgICBgICBSZWFzb246IE5vIG1hbmFnZXIgYXZhaWxhYmxlIGZvciBlbGVtZW50IHR5cGUgXCIke25vcm1hbGl6ZWRUeXBlfVwiLlxcbmAgK1xuICAgICAgICBgICBBdmFpbGFibGUgbWFuYWdlcnM6ICR7dGhpcy5nZXRBdmFpbGFibGVNYW5hZ2VyVHlwZXMobWFuYWdlcnMpLmpvaW4oJywgJyl9JHtuZXN0ZWRIaW50fWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZmluZEVsZW1lbnRJbk1hbmFnZXIobWFuYWdlciwgZWxlbWVudC5lbGVtZW50X25hbWUsIG5vcm1hbGl6ZWRUeXBlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3JtYWxpemUgZWxlbWVudCB0eXBlIHRvIHNpbmd1bGFyIGZvcm1cbiAgICovXG4gIHByaXZhdGUgbm9ybWFsaXplRWxlbWVudFR5cGUodHlwZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCB0eXBlTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgJ3NraWxscyc6ICdza2lsbCcsXG4gICAgICAndGVtcGxhdGVzJzogJ3RlbXBsYXRlJyxcbiAgICAgICdhZ2VudHMnOiAnYWdlbnQnLFxuICAgICAgJ21lbW9yaWVzJzogJ21lbW9yeScsXG4gICAgICAncGVyc29uYXMnOiAncGVyc29uYScsXG4gICAgICAnZW5zZW1ibGVzJzogJ2Vuc2VtYmxlJ1xuICAgIH07XG5cbiAgICByZXR1cm4gdHlwZU1hcFt0eXBlXSB8fCB0eXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgYXBwcm9wcmlhdGUgbWFuYWdlciBmb3IgYW4gZWxlbWVudCB0eXBlXG4gICAqL1xuICBwcml2YXRlIGdldE1hbmFnZXJGb3JUeXBlKFxuICAgIHR5cGU6IHN0cmluZyxcbiAgICBtYW5hZ2VyczogaW1wb3J0KCcuL3R5cGVzLmpzJykuRWxlbWVudE1hbmFnZXJzXG4gICk6IGFueSB7XG4gICAgY29uc3QgbWFuYWdlck1hcDogUmVjb3JkPHN0cmluZywgYW55PiA9IHtcbiAgICAgICdza2lsbCc6IG1hbmFnZXJzLnNraWxsTWFuYWdlcixcbiAgICAgICd0ZW1wbGF0ZSc6IG1hbmFnZXJzLnRlbXBsYXRlTWFuYWdlcixcbiAgICAgICdhZ2VudCc6IG1hbmFnZXJzLmFnZW50TWFuYWdlcixcbiAgICAgICdtZW1vcnknOiBtYW5hZ2Vycy5tZW1vcnlNYW5hZ2VyLFxuICAgICAgJ3BlcnNvbmEnOiBtYW5hZ2Vycy5wZXJzb25hTWFuYWdlcixcbiAgICAgICdlbnNlbWJsZSc6IG1hbmFnZXJzLmVuc2VtYmxlTWFuYWdlclxuICAgIH07XG5cbiAgICByZXR1cm4gbWFuYWdlck1hcFt0eXBlXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbGlzdCBvZiBhdmFpbGFibGUgbWFuYWdlciB0eXBlc1xuICAgKi9cbiAgcHJpdmF0ZSBnZXRBdmFpbGFibGVNYW5hZ2VyVHlwZXMobWFuYWdlcnM6IGltcG9ydCgnLi90eXBlcy5qcycpLkVsZW1lbnRNYW5hZ2Vycyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBhdmFpbGFibGVUeXBlczogc3RyaW5nW10gPSBbXTtcblxuICAgIGlmIChtYW5hZ2Vycy5za2lsbE1hbmFnZXIpIGF2YWlsYWJsZVR5cGVzLnB1c2goJ3NraWxsJyk7XG4gICAgaWYgKG1hbmFnZXJzLnRlbXBsYXRlTWFuYWdlcikgYXZhaWxhYmxlVHlwZXMucHVzaCgndGVtcGxhdGUnKTtcbiAgICBpZiAobWFuYWdlcnMuYWdlbnRNYW5hZ2VyKSBhdmFpbGFibGVUeXBlcy5wdXNoKCdhZ2VudCcpO1xuICAgIGlmIChtYW5hZ2Vycy5tZW1vcnlNYW5hZ2VyKSBhdmFpbGFibGVUeXBlcy5wdXNoKCdtZW1vcnknKTtcbiAgICBpZiAobWFuYWdlcnMucGVyc29uYU1hbmFnZXIpIGF2YWlsYWJsZVR5cGVzLnB1c2goJ3BlcnNvbmEnKTtcbiAgICBpZiAobWFuYWdlcnMuZW5zZW1ibGVNYW5hZ2VyKSBhdmFpbGFibGVUeXBlcy5wdXNoKCdlbnNlbWJsZScpO1xuXG4gICAgcmV0dXJuIGF2YWlsYWJsZVR5cGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYW4gZWxlbWVudCBpbiB0aGUgbWFuYWdlciB1c2luZyBmdXp6eSBuYW1lIG1hdGNoaW5nXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZpbmRFbGVtZW50SW5NYW5hZ2VyKFxuICAgIG1hbmFnZXI6IGFueSxcbiAgICBlbGVtZW50TmFtZTogc3RyaW5nLFxuICAgIGVsZW1lbnRUeXBlOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxJRWxlbWVudD4ge1xuICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIFBlcnNvbmFNYW5hZ2VyIHdoaWNoIGhhcyBmaW5kUGVyc29uYSBtZXRob2RcbiAgICBpZiAoZWxlbWVudFR5cGUgPT09ICdwZXJzb25hJyAmJiBtYW5hZ2VyLmZpbmRQZXJzb25hKSB7XG4gICAgICBjb25zdCBwZXJzb25hID0gbWFuYWdlci5maW5kUGVyc29uYShlbGVtZW50TmFtZSk7XG4gICAgICBpZiAoIXBlcnNvbmEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMuY2FwaXRhbGl6ZUZpcnN0KGVsZW1lbnRUeXBlKX0gJyR7ZWxlbWVudE5hbWV9JyBub3QgZm91bmRgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwZXJzb25hIGFzIGFueTtcbiAgICB9XG5cbiAgICAvLyBTdGFuZGFyZCBoYW5kbGluZyBmb3Igb3RoZXIgbWFuYWdlcnMgd2l0aCBsaXN0KCkgbWV0aG9kXG4gICAgY29uc3QgZWxlbWVudHMgPSBhd2FpdCBtYW5hZ2VyLmxpc3QoKTtcbiAgICBjb25zdCBmb3VuZEVsZW1lbnQgPSBlbGVtZW50cy5maW5kKChlbDogYW55KSA9PlxuICAgICAgdGhpcy5tYXRjaGVzRWxlbWVudE5hbWUoZWwubWV0YWRhdGEubmFtZSwgZWxlbWVudE5hbWUpXG4gICAgKTtcblxuICAgIGlmICghZm91bmRFbGVtZW50KSB7XG4gICAgICBjb25zdCBhdmFpbGFibGVOYW1lcyA9IGVsZW1lbnRzLm1hcCgoZWw6IGFueSkgPT4gZWwubWV0YWRhdGEubmFtZSkuam9pbignLCAnKTtcbiAgICAgIGNvbnN0IGVuc2VtYmxlQ29udGV4dCA9IGBpbiBlbnNlbWJsZSBcIiR7dGhpcy5tZXRhZGF0YS5uYW1lfVwiYDtcbiAgICAgIGNvbnN0IG5lc3RlZEhpbnQgPSBlbGVtZW50VHlwZSA9PT0gJ2Vuc2VtYmxlJ1xuICAgICAgICA/IGBcXG4gIOKGkiBUaXA6IE5lc3RlZCBlbnNlbWJsZXMgbXVzdCBleGlzdCBpbiB0aGUgcG9ydGZvbGlvIGJlZm9yZSBiZWluZyByZWZlcmVuY2VkLmBcbiAgICAgICAgOiAnJztcblxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgJHt0aGlzLmNhcGl0YWxpemVGaXJzdChlbGVtZW50VHlwZSl9IFwiJHtlbGVtZW50TmFtZX1cIiBub3QgZm91bmQgJHtlbnNlbWJsZUNvbnRleHR9LlxcbmAgK1xuICAgICAgICBgICBBdmFpbGFibGUgJHtlbGVtZW50VHlwZX1zOiAke2F2YWlsYWJsZU5hbWVzIHx8ICcobm9uZSknfSR7bmVzdGVkSGludH1gXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBmb3VuZEVsZW1lbnQ7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgZWxlbWVudCBuYW1lIG1hdGNoZXMgdGFyZ2V0IHVzaW5nIGZ1enp5IG1hdGNoaW5nXG4gICAqIEhhbmRsZXMgZXhhY3QgbWF0Y2gsIHNsdWdpZmllZCBtYXRjaCwgYW5kIGJpZGlyZWN0aW9uYWwgc2x1ZyBtYXRjaGluZ1xuICAgKlxuICAgKiBTRUNVUklUWTogTm9ybWFsaXplcyBVbmljb2RlIHRvIHByZXZlbnQgY29tcG9zZWQgdnMgZGVjb21wb3NlZCBjaGFyYWN0ZXIgbWlzbWF0Y2hlcy5cbiAgICogVGhpcyBpcyBkZWZlbnNlLWluLWRlcHRoOyBlbGVtZW50IG5hbWVzIGFyZSBhbHJlYWR5IHZhbGlkYXRlZCBieSBFTEVNRU5UX05BTUVfUEFUVEVSTlxuICAgKiB3aGljaCBibG9ja3Mgbm9uLUFTQ0lJIGNoYXJhY3RlcnMuXG4gICAqXG4gICAqIEBwYXJhbSBhY3R1YWxOYW1lIC0gTmFtZSBmcm9tIGVsZW1lbnQgbWFuYWdlciAoZmlsZXN5c3RlbSlcbiAgICogQHBhcmFtIHRhcmdldE5hbWUgLSBOYW1lIGZyb20gZW5zZW1ibGUgY29uZmlndXJhdGlvbiAodXNlciBpbnB1dClcbiAgICogQHJldHVybnMgdHJ1ZSBpZiBuYW1lcyBtYXRjaCBleGFjdGx5IG9yIGFmdGVyIHNsdWdpZmljYXRpb25cbiAgICovXG4gIHByaXZhdGUgbWF0Y2hlc0VsZW1lbnROYW1lKGFjdHVhbE5hbWU6IHN0cmluZywgdGFyZ2V0TmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgLy8gTm9ybWFsaXplIFVuaWNvZGUgdG8gaGFuZGxlIGNvbXBvc2VkIHZzIGRlY29tcG9zZWQgY2hhcmFjdGVycyAoZGVmZW5zZS1pbi1kZXB0aClcbiAgICBjb25zdCBub3JtYWxpemVkQWN0dWFsID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUoYWN0dWFsTmFtZSkubm9ybWFsaXplZENvbnRlbnQ7XG4gICAgY29uc3Qgbm9ybWFsaXplZFRhcmdldCA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKHRhcmdldE5hbWUpLm5vcm1hbGl6ZWRDb250ZW50O1xuXG4gICAgY29uc3QgZXhhY3RNYXRjaCA9IG5vcm1hbGl6ZWRBY3R1YWwgPT09IG5vcm1hbGl6ZWRUYXJnZXQ7XG4gICAgY29uc3Qgc2x1Z2lmaWVkTWF0Y2ggPSBub3JtYWxpemVkQWN0dWFsLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXFxzKy9nLCAnLScpID09PSBub3JtYWxpemVkVGFyZ2V0O1xuICAgIGNvbnN0IHJldmVyc2VNYXRjaCA9IG5vcm1hbGl6ZWRUYXJnZXQudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cXHMrL2csICctJykgPT09XG4gICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZEFjdHVhbC50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1xccysvZywgJy0nKTtcblxuICAgIHJldHVybiBleGFjdE1hdGNoIHx8IHNsdWdpZmllZE1hdGNoIHx8IHJldmVyc2VNYXRjaDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXBpdGFsaXplIGZpcnN0IGxldHRlciBvZiBhIHN0cmluZ1xuICAgKi9cbiAgcHJpdmF0ZSBjYXBpdGFsaXplRmlyc3Qoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdHIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzdHIuc2xpY2UoMSk7XG4gIH1cblxuICAvKipcbiAgICogRXZpY3QgdGhlIG9sZGVzdCBhY2Nlc3NlZCBpbnN0YW5jZSBmcm9tIHRoZSBjYWNoZVxuICAgKiBJbXBsZW1lbnRzIExSVSAoTGVhc3QgUmVjZW50bHkgVXNlZCkgZXZpY3Rpb24gcG9saWN5XG4gICAqL1xuICBwcml2YXRlIGV2aWN0T2xkZXN0SW5zdGFuY2UoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZWxlbWVudEluc3RhbmNlcy5zaXplIDw9IHRoaXMuTUFYX0lOU1RBTkNFX0NBQ0hFX1NJWkUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBGaW5kIG9sZGVzdCBhY2Nlc3NlZCBpbnN0YW5jZVxuICAgIGxldCBvbGRlc3ROYW1lID0gJyc7XG4gICAgbGV0IG9sZGVzdFRpbWUgPSBEYXRlLm5vdygpO1xuXG4gICAgZm9yIChjb25zdCBbbmFtZSwgdGltZV0gb2YgdGhpcy5pbnN0YW5jZUFjY2Vzc1RpbWVzLmVudHJpZXMoKSkge1xuICAgICAgaWYgKHRpbWUgPCBvbGRlc3RUaW1lKSB7XG4gICAgICAgIG9sZGVzdFRpbWUgPSB0aW1lO1xuICAgICAgICBvbGRlc3ROYW1lID0gbmFtZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob2xkZXN0TmFtZSkge1xuICAgICAgdGhpcy5lbGVtZW50SW5zdGFuY2VzLmRlbGV0ZShvbGRlc3ROYW1lKTtcbiAgICAgIHRoaXMuaW5zdGFuY2VBY2Nlc3NUaW1lcy5kZWxldGUob2xkZXN0TmFtZSk7XG4gICAgICBsb2dnZXIuZGVidWcoYEV2aWN0ZWQgZWxlbWVudCBpbnN0YW5jZSBmcm9tIGNhY2hlOiAke29sZGVzdE5hbWV9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIHRoZSBlbGVtZW50IGluc3RhbmNlIGNhY2hlXG4gICAqIFVzZWZ1bCBmb3IgZnJlZWluZyBtZW1vcnkgb3IgZm9yY2luZyByZWxvYWQgb2YgZWxlbWVudHNcbiAgICovXG4gIHB1YmxpYyBjbGVhckluc3RhbmNlQ2FjaGUoKTogdm9pZCB7XG4gICAgY29uc3Qgc2l6ZSA9IHRoaXMuZWxlbWVudEluc3RhbmNlcy5zaXplO1xuICAgIHRoaXMuZWxlbWVudEluc3RhbmNlcy5jbGVhcigpO1xuICAgIHRoaXMuaW5zdGFuY2VBY2Nlc3NUaW1lcy5jbGVhcigpO1xuICAgIGxvZ2dlci5kZWJ1ZyhgQ2xlYXJlZCBpbnN0YW5jZSBjYWNoZSAoJHtzaXplfSBpbnN0YW5jZXMpYCk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYSB0eXBlLXNhZmUgY29udGV4dCBmb3IgY29uZGl0aW9uIGV2YWx1YXRpb25cbiAgICpcbiAgICogQ29uc3RydWN0cyBhIENvbmRpdGlvbkNvbnRleHQgb2JqZWN0IHdpdGggYWxsIHZhbHVlcyBuZWVkZWQgdG8gZXZhbHVhdGVcbiAgICogYW4gZWxlbWVudCdzIGFjdGl2YXRpb24gY29uZGl0aW9uLiBUaGUgY29udGV4dCBpcyBpbW11dGFibGUgYW5kIG9ubHlcbiAgICogZXhwb3NlcyBzYWZlLCByZWFkLW9ubHkgZGF0YS5cbiAgICpcbiAgICogU0VDVVJJVFkgR1VBUkFOVEVFUzpcbiAgICogLSBPbmx5IGV4cG9zZXMgZG9jdW1lbnRlZCwgc2FmZSBwcm9wZXJ0aWVzXG4gICAqIC0gTm8gYWNjZXNzIHRvIGVsZW1lbnQgaW5zdGFuY2VzIG9yIG1ldGhvZHNcbiAgICogLSBBbGwgbmVzdGVkIG9iamVjdHMgYXJlIHJlYWRvbmx5IChzaGFsbG93IGltbXV0YWJpbGl0eSlcbiAgICogLSBDb250ZXh0IHZhbHVlcyByZW1haW4gdHlwZS1jaGVja2VkIGFzIHVua25vd25cbiAgICogLSBObyBleHBvc3VyZSBvZiBpbnRlcm5hbCBlbnNlbWJsZSBzdGF0ZVxuICAgKlxuICAgKiBQRVJGT1JNQU5DRTpcbiAgICogLSBNaW5pbWFsIG9iamVjdCBhbGxvY2F0aW9uIChyZXVzZXMgbWFwcyB3aGVyZSBwb3NzaWJsZSlcbiAgICogLSBPKDEpIGxvb2t1cHMgZm9yIGVsZW1lbnQgYW5kIGNvbnRleHQgZGF0YVxuICAgKiAtIExhenkgY29tcHV0YXRpb24gb2YgcmVzb3VyY2UgbWV0cmljc1xuICAgKiAtIE5vIGRlZXAgY2xvbmluZyAodXNlcyByZWFkb25seSB0eXBlIGd1YXJkcylcbiAgICpcbiAgICogQHBhcmFtIGVsZW1lbnQgLSBUaGUgZWxlbWVudCB3aG9zZSBjb25kaXRpb24gaXMgYmVpbmcgZXZhbHVhdGVkXG4gICAqIEBwYXJhbSBhY3RpdmF0aW9uU3RhcnRUaW1lIC0gVGltZXN0YW1wIHdoZW4gZW5zZW1ibGUgYWN0aXZhdGlvbiBiZWdhblxuICAgKiBAcGFyYW0gcmVzdWx0IC0gQ3VycmVudCBhY3RpdmF0aW9uIHJlc3VsdCAoZm9yIHRyYWNraW5nIHByb2dyZXNzKVxuICAgKiBAcmV0dXJucyBDb250ZXh0IGJ1aWxkZXIgcmVzdWx0IHdpdGggY29udGV4dCBvYmplY3QgYW5kIG1ldGFkYXRhXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgY29udGV4dFJlc3VsdCA9IHRoaXMuYnVpbGRDb25kaXRpb25Db250ZXh0KFxuICAgKiAgIGVsZW1lbnRDb25maWcsXG4gICAqICAgc3RhcnRUaW1lLFxuICAgKiAgIGFjdGl2YXRpb25SZXN1bHRcbiAgICogKTtcbiAgICpcbiAgICogLy8gVXNlIGNvbnRleHQgaW4gZXZhbHVhdGlvblxuICAgKiBjb25zdCBzaG91bGRBY3RpdmF0ZSA9IGV2YWx1YXRlRXhwcmVzc2lvbihcbiAgICogICBlbGVtZW50LmNvbmRpdGlvbixcbiAgICogICBjb250ZXh0UmVzdWx0LmNvbnRleHRcbiAgICogKTtcbiAgICogYGBgXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkQ29uZGl0aW9uQ29udGV4dChcbiAgICBlbGVtZW50OiBFbnNlbWJsZUVsZW1lbnQsXG4gICAgYWN0aXZhdGlvblN0YXJ0VGltZTogbnVtYmVyLFxuICAgIHJlc3VsdDogRW5zZW1ibGVBY3RpdmF0aW9uUmVzdWx0XG4gICk6IGltcG9ydCgnLi90eXBlcy5qcycpLkNvbmRpdGlvbkNvbnRleHRSZXN1bHQge1xuICAgIGNvbnN0IHdhcm5pbmdzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IGxpbWl0cyA9IHRoaXMuZ2V0RWZmZWN0aXZlTGltaXRzKCk7XG5cbiAgICAvLyBCdWlsZCBzaGFyZWQgY29udGV4dCBvYmplY3QgKGNvbnZlcnQgTWFwIHRvIHBsYWluIG9iamVjdClcbiAgICBjb25zdCBjb250ZXh0VmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgIGNvbnN0IGNvbnRleHRPd25lcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHRoaXMuc2hhcmVkQ29udGV4dC52YWx1ZXMuZW50cmllcygpKSB7XG4gICAgICBjb250ZXh0VmFsdWVzW2tleV0gPSB2YWx1ZTtcbiAgICAgIGNvbnN0IG93bmVyID0gdGhpcy5zaGFyZWRDb250ZXh0Lm93bmVycy5nZXQoa2V5KTtcbiAgICAgIGlmIChvd25lcikge1xuICAgICAgICBjb250ZXh0T3duZXJzW2tleV0gPSBvd25lcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDYWxjdWxhdGUgcmVzb3VyY2UgdXNhZ2VcbiAgICBjb25zdCBleGVjdXRpb25UaW1lTXMgPSBEYXRlLm5vdygpIC0gYWN0aXZhdGlvblN0YXJ0VGltZTtcbiAgICBjb25zdCBjb250ZXh0U2l6ZSA9IHRoaXMuc2hhcmVkQ29udGV4dC52YWx1ZXMuc2l6ZTtcbiAgICBjb25zdCBjYWNoZWRJbnN0YW5jZXMgPSB0aGlzLmVsZW1lbnRJbnN0YW5jZXMuc2l6ZTtcblxuICAgIC8vIFdhcm4gaWYgYXBwcm9hY2hpbmcgcmVzb3VyY2UgbGltaXRzXG4gICAgaWYgKGNvbnRleHRTaXplID4gbGltaXRzLk1BWF9DT05URVhUX1NJWkUgKiAwLjgpIHtcbiAgICAgIHdhcm5pbmdzLnB1c2goXG4gICAgICAgIGBDb250ZXh0IHNpemUgKCR7Y29udGV4dFNpemV9KSBpcyBhcHByb2FjaGluZyBsaW1pdCAoJHtsaW1pdHMuTUFYX0NPTlRFWFRfU0laRX0pYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoZXhlY3V0aW9uVGltZU1zID4gbGltaXRzLk1BWF9BQ1RJVkFUSU9OX1RJTUUgKiAwLjgpIHtcbiAgICAgIHdhcm5pbmdzLnB1c2goXG4gICAgICAgIGBFeGVjdXRpb24gdGltZSAoJHtleGVjdXRpb25UaW1lTXN9bXMpIGlzIGFwcHJvYWNoaW5nIHRpbWVvdXRgXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEJ1aWxkIHRoZSBjb250ZXh0IG9iamVjdFxuICAgIGNvbnN0IGNvbnRleHQ6IGltcG9ydCgnLi90eXBlcy5qcycpLkNvbmRpdGlvbkNvbnRleHQgPSB7XG4gICAgICBlbGVtZW50OiB7XG4gICAgICAgIGVsZW1lbnRfbmFtZTogZWxlbWVudC5lbGVtZW50X25hbWUsXG4gICAgICAgIGVsZW1lbnRfdHlwZTogZWxlbWVudC5lbGVtZW50X3R5cGUsXG4gICAgICAgIHJvbGU6IGVsZW1lbnQucm9sZSxcbiAgICAgICAgcHJpb3JpdHk6IGVsZW1lbnQucHJpb3JpdHksXG4gICAgICAgIGFjdGl2YXRpb246IGVsZW1lbnQuYWN0aXZhdGlvbixcbiAgICAgICAgZGVwZW5kZW5jaWVzOiBlbGVtZW50LmRlcGVuZGVuY2llcyB8fCBbXSxcbiAgICAgICAgcHVycG9zZTogZWxlbWVudC5wdXJwb3NlXG4gICAgICB9LFxuICAgICAgY29udGV4dDogY29udGV4dFZhbHVlcyxcbiAgICAgIGNvbnRleHRPd25lcnM6IGNvbnRleHRPd25lcnMsXG4gICAgICBzdGF0ZToge1xuICAgICAgICBhY3RpdmF0ZWRDb3VudDogcmVzdWx0LmFjdGl2YXRlZEVsZW1lbnRzLmxlbmd0aCxcbiAgICAgICAgZmFpbGVkQ291bnQ6IHJlc3VsdC5mYWlsZWRFbGVtZW50cy5sZW5ndGgsXG4gICAgICAgIGFjdGl2YXRlZEVsZW1lbnRzOiBbLi4ucmVzdWx0LmFjdGl2YXRlZEVsZW1lbnRzXSxcbiAgICAgICAgZmFpbGVkRWxlbWVudHM6IFsuLi5yZXN1bHQuZmFpbGVkRWxlbWVudHNdLFxuICAgICAgICB0b3RhbEVsZW1lbnRzOiB0aGlzLmVsZW1lbnRzLmxlbmd0aFxuICAgICAgfSxcbiAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgIC8vIFJlc2VydmVkIGZvciBmdXR1cmUgZXhwYW5zaW9uXG4gICAgICAgIC8vIFdpbGwgaW5jbHVkZTogcnVudGltZSwgZXhlY3V0aW9uQ29udGV4dCwgY2FwYWJpbGl0aWVzLCBwZXJtaXNzaW9uc1xuICAgICAgfSxcbiAgICAgIHJlc291cmNlczoge1xuICAgICAgICBleGVjdXRpb25UaW1lTXMsXG4gICAgICAgIGNvbnRleHRTaXplLFxuICAgICAgICBjYWNoZWRJbnN0YW5jZXNcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRleHQsXG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCksXG4gICAgICB3YXJuaW5nczogd2FybmluZ3MubGVuZ3RoID4gMCA/IHdhcm5pbmdzIDogdW5kZWZpbmVkXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmFsdWF0ZSBhbiBhY3RpdmF0aW9uIGNvbmRpdGlvbiBpbiBhIHNlY3VyZSBWTSBzYW5kYm94XG4gICAqXG4gICAqIFNFQ1VSSVRZIElNUExFTUVOVEFUSU9OOlxuICAgKiBUaGlzIG1ldGhvZCBldmFsdWF0ZXMgdXNlci1wcm92aWRlZCBjb25kaXRpb25zIHVzaW5nIE5vZGUuanMgVk0gbW9kdWxlIHdpdGggbXVsdGlwbGVcbiAgICogbGF5ZXJzIG9mIGRlZmVuc2U6XG4gICAqXG4gICAqIDEuICoqU2FuZGJveGVkIEV4ZWN1dGlvbioqOiBVc2VzIHZtLmNyZWF0ZUNvbnRleHQoKSB3aXRoIGZyb3plbiBvYmplY3RzXG4gICAqICAgIC0gTm8gYWNjZXNzIHRvIHJlcXVpcmUsIHByb2Nlc3MsIGdsb2JhbCwgb3Igb3RoZXIgTm9kZS5qcyBBUElzXG4gICAqICAgIC0gQWxsIGNvbnRleHQgb2JqZWN0cyBhcmUgZGVlcGx5IGZyb3plbiAoaW1tdXRhYmxlKVxuICAgKiAgICAtIE5vIHByb3RvdHlwZSBjaGFpbiBhY2Nlc3MgdG8gcHJldmVudCBwb2xsdXRpb25cbiAgICpcbiAgICogMi4gKipUaW1lb3V0IFByb3RlY3Rpb24qKjogMTAwbXMgbWF4aW11bSBldmFsdWF0aW9uIHRpbWVcbiAgICogICAgLSBQcmV2ZW50cyBpbmZpbml0ZSBsb29wcyBhbmQgUmVEb1MgYXR0YWNrc1xuICAgKiAgICAtIFRlcm1pbmF0ZXMgbG9uZy1ydW5uaW5nIGV4cHJlc3Npb25zXG4gICAqXG4gICAqIDMuICoqSW5wdXQgVmFsaWRhdGlvbioqOiBQcmUtdmFsaWRhdGVkIGJ5IGlzVmFsaWRDb25kaXRpb24oKVxuICAgKiAgICAtIERhbmdlcm91cyBwYXR0ZXJucyBibG9ja2VkIChldmFsLCBGdW5jdGlvbiwgcmVxdWlyZSwgZXRjLilcbiAgICogICAgLSBPbmx5IHNhZmUgb3BlcmF0b3JzIGFsbG93ZWRcbiAgICogICAgLSBNYXhpbXVtIGxlbmd0aCBlbmZvcmNlZFxuICAgKlxuICAgKiA0LiAqKlR5cGUgU2FmZXR5Kio6IEVuZm9yY2VzIGJvb2xlYW4gcmV0dXJuIHZhbHVlc1xuICAgKiAgICAtIE5vbi1ib29sZWFuIHJlc3VsdHMgdHJlYXRlZCBhcyBmYWxzZVxuICAgKiAgICAtIFByZXZlbnRzIHNpZGUgZWZmZWN0cyBmcm9tIG5vbi1leHByZXNzaW9uIHN0YXRlbWVudHNcbiAgICpcbiAgICogNS4gKipFcnJvciBIYW5kbGluZyoqOiBGYWlsLXNlY3VyZSBwcmluY2lwbGVcbiAgICogICAgLSBFdmFsdWF0aW9uIGVycm9ycyByZXN1bHQgaW4gbm9uLWFjdGl2YXRpb24gKHJldHVybiBmYWxzZSlcbiAgICogICAgLSBBbGwgZmFpbHVyZXMgbG9nZ2VkIHRvIFNlY3VyaXR5TW9uaXRvclxuICAgKiAgICAtIE5vIGVycm9yIGRldGFpbHMgbGVha2VkIHRvIHVzZXJcbiAgICpcbiAgICogU1VQUE9SVEVEIEZFQVRVUkVTOlxuICAgKiAtIENvbnRleHQgdmFyaWFibGUgYWNjZXNzOiBjb250ZXh0LiosIGVsZW1lbnQuKiwgc3RhdGUuKiwgcmVzb3VyY2VzLiosIGVudmlyb25tZW50LipcbiAgICogLSBDb21wYXJpc29uIG9wZXJhdG9yczogPT0sICE9LCA9PT0sICE9PSwgPiwgPCwgPj0sIDw9XG4gICAqIC0gTG9naWNhbCBvcGVyYXRvcnM6ICYmLCB8fCwgIVxuICAgKiAtIFBhcmVudGhlc2VzIGZvciBncm91cGluZ1xuICAgKiAtIEFycmF5L29iamVjdCBwcm9wZXJ0eSBhY2Nlc3NcbiAgICpcbiAgICogRXhhbXBsZSB2YWxpZCBjb25kaXRpb25zOlxuICAgKiAtIFwiZWxlbWVudC5wcmlvcml0eSA+PSA4MFwiXG4gICAqIC0gXCJjb250ZXh0LnNlY3VyaXR5X3JldmlldyA9PT0gdHJ1ZVwiXG4gICAqIC0gXCJzdGF0ZS5hY3RpdmF0ZWRDb3VudCA+IDMgJiYgZWxlbWVudC5yb2xlID09PSAncHJpbWFyeSdcIlxuICAgKiAtIFwiY29udGV4dC5lbnZpcm9ubWVudCA9PT0gJ3Byb2R1Y3Rpb24nIHx8IGNvbnRleHQub3ZlcnJpZGVcIlxuICAgKlxuICAgKiBAcGFyYW0gY29uZGl0aW9uIC0gVGhlIGNvbmRpdGlvbiBzdHJpbmcgdG8gZXZhbHVhdGUgKHByZS12YWxpZGF0ZWQpXG4gICAqIEBwYXJhbSBlbGVtZW50IC0gVGhlIGVsZW1lbnQgd2hvc2UgY29uZGl0aW9uIGlzIGJlaW5nIGV2YWx1YXRlZFxuICAgKiBAcGFyYW0gYWN0aXZhdGlvblN0YXJ0VGltZSAtIFdoZW4gYWN0aXZhdGlvbiBiZWdhbiAoZm9yIHJlc291cmNlIHRyYWNraW5nKVxuICAgKiBAcGFyYW0gcmVzdWx0IC0gQ3VycmVudCBhY3RpdmF0aW9uIHJlc3VsdCAoZm9yIHN0YXRlIHRyYWNraW5nKVxuICAgKiBAcmV0dXJucyB0cnVlIGlmIGNvbmRpdGlvbiBldmFsdWF0ZXMgdG8gdHJ1ZSwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqIEBwcml2YXRlXG4gICAqIEBzZWN1cml0eSBNdWx0aXBsZSBkZWZlbnNlIGxheWVyczogc2FuZGJveCwgdGltZW91dCwgdmFsaWRhdGlvbiwgaW1tdXRhYmlsaXR5XG4gICAqL1xuICBwcml2YXRlIGV2YWx1YXRlQ29uZGl0aW9uKFxuICAgIGNvbmRpdGlvbjogc3RyaW5nLFxuICAgIGVsZW1lbnQ6IEVuc2VtYmxlRWxlbWVudCxcbiAgICBhY3RpdmF0aW9uU3RhcnRUaW1lOiBudW1iZXIsXG4gICAgcmVzdWx0OiBFbnNlbWJsZUFjdGl2YXRpb25SZXN1bHRcbiAgKTogYm9vbGVhbiB7XG4gICAgLy8gQnVpbGQgdHlwZS1zYWZlIGNvbnRleHRcbiAgICBjb25zdCBjb250ZXh0UmVzdWx0ID0gdGhpcy5idWlsZENvbmRpdGlvbkNvbnRleHQoXG4gICAgICBlbGVtZW50LFxuICAgICAgYWN0aXZhdGlvblN0YXJ0VGltZSxcbiAgICAgIHJlc3VsdFxuICAgICk7XG5cbiAgICAvLyBMb2cgd2FybmluZ3MgaWYgYW55XG4gICAgaWYgKGNvbnRleHRSZXN1bHQud2FybmluZ3MpIHtcbiAgICAgIGZvciAoY29uc3Qgd2FybmluZyBvZiBjb250ZXh0UmVzdWx0Lndhcm5pbmdzKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBDb250ZXh0IHdhcm5pbmcgZm9yICR7ZWxlbWVudC5lbGVtZW50X25hbWV9OiAke3dhcm5pbmd9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIENyZWF0ZSBmcm96ZW4gc2FuZGJveCBjb250ZXh0IHRvIHByZXZlbnQgbW9kaWZpY2F0aW9uXG4gICAgICAvLyBFeHBvc2UgZWxlbWVudCBwcm9wZXJ0aWVzIGF0IHRvcCBsZXZlbCBmb3IgY29udmVuaWVuY2UgKG1hdGNoZXMgcmVhbCBlbnNlbWJsZSB1c2FnZSlcbiAgICAgIGNvbnN0IHNhbmRib3ggPSBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgLy8gRWxlbWVudCBwcm9wZXJ0aWVzIGF0IHRvcCBsZXZlbCBmb3Igc2ltcGxlIGNvbmRpdGlvbnMgbGlrZSBcInByaW9yaXR5ID4gNDBcIlxuICAgICAgICAvLyBOb3RlOiBlbGVtZW50X25hbWUvZWxlbWVudF90eXBlIGFyZSB0aGUgY2Fub25pY2FsIG5hbWVzLCBidXQgd2UgYWxzbyBleHBvc2VcbiAgICAgICAgLy8gbmFtZS90eXBlIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nIGNvbmRpdGlvbnNcbiAgICAgICAgZWxlbWVudF9uYW1lOiBjb250ZXh0UmVzdWx0LmNvbnRleHQuZWxlbWVudC5lbGVtZW50X25hbWUsXG4gICAgICAgIGVsZW1lbnRfdHlwZTogY29udGV4dFJlc3VsdC5jb250ZXh0LmVsZW1lbnQuZWxlbWVudF90eXBlLFxuICAgICAgICBuYW1lOiBjb250ZXh0UmVzdWx0LmNvbnRleHQuZWxlbWVudC5lbGVtZW50X25hbWUsICAvLyBCYWNrd2FyZHMgY29tcGF0IGFsaWFzXG4gICAgICAgIHR5cGU6IGNvbnRleHRSZXN1bHQuY29udGV4dC5lbGVtZW50LmVsZW1lbnRfdHlwZSwgIC8vIEJhY2t3YXJkcyBjb21wYXQgYWxpYXNcbiAgICAgICAgcm9sZTogY29udGV4dFJlc3VsdC5jb250ZXh0LmVsZW1lbnQucm9sZSxcbiAgICAgICAgcHJpb3JpdHk6IGNvbnRleHRSZXN1bHQuY29udGV4dC5lbGVtZW50LnByaW9yaXR5LFxuICAgICAgICBhY3RpdmF0aW9uOiBjb250ZXh0UmVzdWx0LmNvbnRleHQuZWxlbWVudC5hY3RpdmF0aW9uLFxuICAgICAgICBkZXBlbmRlbmNpZXM6IE9iamVjdC5mcmVlemUoWy4uLihjb250ZXh0UmVzdWx0LmNvbnRleHQuZWxlbWVudC5kZXBlbmRlbmNpZXMgfHwgW10pXSksXG4gICAgICAgIHB1cnBvc2U6IGNvbnRleHRSZXN1bHQuY29udGV4dC5lbGVtZW50LnB1cnBvc2UsXG5cbiAgICAgICAgLy8gQWxzbyBpbmNsdWRlIG5lc3RlZCBlbGVtZW50IG9iamVjdCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgICAgICAgZWxlbWVudDogT2JqZWN0LmZyZWV6ZSh7IC4uLmNvbnRleHRSZXN1bHQuY29udGV4dC5lbGVtZW50IH0pLFxuXG4gICAgICAgIC8vIEZsYXR0ZW4gc2hhcmVkIGNvbnRleHQgdmFsdWVzIHRvIHRvcCBsZXZlbCAoYWxsb3dzIFwiZGF0YV9hdmFpbGFibGVcIiBpbnN0ZWFkIG9mIFwiY29udGV4dC5kYXRhX2F2YWlsYWJsZVwiKVxuICAgICAgICAuLi5jb250ZXh0UmVzdWx0LmNvbnRleHQuY29udGV4dCxcblxuICAgICAgICAvLyBBbHNvIGluY2x1ZGUgbmVzdGVkIGNvbnRleHQgb2JqZWN0IGZvciBjb21wbGV4IGFjY2VzcyBwYXR0ZXJuc1xuICAgICAgICBjb250ZXh0OiBPYmplY3QuZnJlZXplKHsgLi4uY29udGV4dFJlc3VsdC5jb250ZXh0LmNvbnRleHQgfSksXG5cbiAgICAgICAgLy8gQWN0aXZhdGlvbiBzdGF0ZSAocmVhZG9ubHkpXG4gICAgICAgIHN0YXRlOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgICAuLi5jb250ZXh0UmVzdWx0LmNvbnRleHQuc3RhdGUsXG4gICAgICAgICAgYWN0aXZhdGVkRWxlbWVudHM6IE9iamVjdC5mcmVlemUoWy4uLmNvbnRleHRSZXN1bHQuY29udGV4dC5zdGF0ZS5hY3RpdmF0ZWRFbGVtZW50c10pLFxuICAgICAgICAgIGZhaWxlZEVsZW1lbnRzOiBPYmplY3QuZnJlZXplKFsuLi5jb250ZXh0UmVzdWx0LmNvbnRleHQuc3RhdGUuZmFpbGVkRWxlbWVudHNdKVxuICAgICAgICB9KSxcblxuICAgICAgICAvLyBSZXNvdXJjZSB1c2FnZSAocmVhZG9ubHkpXG4gICAgICAgIHJlc291cmNlczogT2JqZWN0LmZyZWV6ZSh7IC4uLmNvbnRleHRSZXN1bHQuY29udGV4dC5yZXNvdXJjZXMgfSksXG5cbiAgICAgICAgLy8gRW52aXJvbm1lbnQgKHJlYWRvbmx5KVxuICAgICAgICBlbnZpcm9ubWVudDogY29udGV4dFJlc3VsdC5jb250ZXh0LmVudmlyb25tZW50XG4gICAgICAgICAgPyBPYmplY3QuZnJlZXplKHsgLi4uY29udGV4dFJlc3VsdC5jb250ZXh0LmVudmlyb25tZW50IH0pXG4gICAgICAgICAgOiBPYmplY3QuZnJlZXplKHt9KVxuICAgICAgfSk7XG5cbiAgICAgIC8vIENyZWF0ZSBWTSBjb250ZXh0IHdpdGggb25seSB0aGUgc2FuZGJveCAobm8gYWNjZXNzIHRvIHJlcXVpcmUsIHByb2Nlc3MsIGV0Yy4pXG4gICAgICBjb25zdCB2bUNvbnRleHQgPSB2bS5jcmVhdGVDb250ZXh0KHNhbmRib3gpO1xuXG4gICAgICAvLyBXcmFwIGNvbmRpdGlvbiBpbiBhbiBJSUZFIHRvIGVuc3VyZSBpdCByZXR1cm5zIGEgYm9vbGVhblxuICAgICAgLy8gVGhpcyBwcmV2ZW50cyB0aGUgY29uZGl0aW9uIGZyb20gYmVpbmcgYSBzdGF0ZW1lbnRcbiAgICAgIGNvbnN0IHdyYXBwZWRDb25kaXRpb24gPSBgKGZ1bmN0aW9uKCkgeyByZXR1cm4gKCR7Y29uZGl0aW9ufSk7IH0pKClgO1xuXG4gICAgICAvLyBFeGVjdXRlIHdpdGggdGltZW91dCBwcm90ZWN0aW9uXG4gICAgICBjb25zdCBzdGFydEV2YWxUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IGV2YWx1YXRpb25SZXN1bHQgPSB2bS5ydW5JbkNvbnRleHQod3JhcHBlZENvbmRpdGlvbiwgdm1Db250ZXh0LCB7XG4gICAgICAgIHRpbWVvdXQ6IDEwMCwgLy8gMTAwbXMgbWF4IGV2YWx1YXRpb24gdGltZVxuICAgICAgICBkaXNwbGF5RXJyb3JzOiBmYWxzZSxcbiAgICAgICAgYnJlYWtPblNpZ2ludDogdHJ1ZVxuICAgICAgfSk7XG4gICAgICBjb25zdCBldmFsRHVyYXRpb24gPSBEYXRlLm5vdygpIC0gc3RhcnRFdmFsVGltZTtcblxuICAgICAgLy8gTG9nIHN1Y2Nlc3NmdWwgZXZhbHVhdGlvblxuICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICBgQ29uZGl0aW9uIGV2YWx1YXRlZCBmb3IgJHtlbGVtZW50LmVsZW1lbnRfbmFtZX06IFwiJHtjb25kaXRpb259XCIgPT4gJHtldmFsdWF0aW9uUmVzdWx0fSAoJHtldmFsRHVyYXRpb259bXMpYFxuICAgICAgKTtcblxuICAgICAgLy8gRW5zdXJlIHJlc3VsdCBpcyBib29sZWFuXG4gICAgICBpZiAodHlwZW9mIGV2YWx1YXRpb25SZXN1bHQgIT09ICdib29sZWFuJykge1xuICAgICAgICBsb2dnZXIud2FybihcbiAgICAgICAgICBgQ29uZGl0aW9uIFwiJHtjb25kaXRpb259XCIgZm9yICR7ZWxlbWVudC5lbGVtZW50X25hbWV9IHJldHVybmVkIG5vbi1ib29sZWFuIHZhbHVlOiAke3R5cGVvZiBldmFsdWF0aW9uUmVzdWx0fS4gYCArXG4gICAgICAgICAgYFRyZWF0aW5nIGFzIGZhbHNlLmBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZXZhbHVhdGlvblJlc3VsdDtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBMb2cgc2VjdXJpdHkgZXZlbnQgZm9yIGV2YWx1YXRpb24gZmFpbHVyZVxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiBFTlNFTUJMRV9TRUNVUklUWV9FVkVOVFMuQ09ORElUSU9OX0VWQUxVQVRJT05fRkFJTEVELFxuICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgIHNvdXJjZTogJ0Vuc2VtYmxlLmV2YWx1YXRlQ29uZGl0aW9uJyxcbiAgICAgICAgZGV0YWlsczogYEZhaWxlZCB0byBldmFsdWF0ZSBjb25kaXRpb24gXCIke2NvbmRpdGlvbn1cIiBmb3IgZWxlbWVudCAke2VsZW1lbnQuZWxlbWVudF9uYW1lfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCxcbiAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICBlbnNlbWJsZU5hbWU6IHRoaXMubWV0YWRhdGEubmFtZSxcbiAgICAgICAgICBlbGVtZW50TmFtZTogZWxlbWVudC5lbGVtZW50X25hbWUsXG4gICAgICAgICAgY29uZGl0aW9uXG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gZXZhbHVhdGUgY29uZGl0aW9uIGZvciAke2VsZW1lbnQuZWxlbWVudF9uYW1lfTogJHtjb25kaXRpb259YCxcbiAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFN0cmluZyhlcnJvcikpXG4gICAgICApO1xuXG4gICAgICAvLyBGYWlsIHNlY3VyZWx5OiBldmFsdWF0aW9uIGVycm9ycyByZXN1bHQgaW4gbm9uLWFjdGl2YXRpb25cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBjb25kaXRpb24gc3ludGF4IGlzIHZhbGlkXG4gICAqXG4gICAqIFZhbGlkYXRlcyB0aGF0IGEgY29uZGl0aW9uOlxuICAgKiAxLiBNYXRjaGVzIHRoZSBzYWZlIGNoYXJhY3RlciBwYXR0ZXJuIChhbHBoYW51bWVyaWMsIG9wZXJhdG9ycywgZXRjLilcbiAgICogMi4gRG9lcyBub3QgY29udGFpbiBkYW5nZXJvdXMga2V5d29yZHMgb3Igb3BlcmF0b3JzXG4gICAqIDMuIElzIG5vdCBlbXB0eSBvciB3aGl0ZXNwYWNlLW9ubHlcbiAgICpcbiAgICogU0VDVVJJVFk6IE11bHRpLWxheWVyIHZhbGlkYXRpb24gYXBwcm9hY2hcbiAgICogLSBMYXllciAxOiBQb3NpdGl2ZSBwYXR0ZXJuIG1hdGNoIChDT05ESVRJT05fUEFUVEVSTikgYWxsb3dzIG9ubHkgc2FmZSBjaGFyYWN0ZXJzXG4gICAqIC0gTGF5ZXIgMjogTmVnYXRpdmUgcGF0dGVybiBtYXRjaCAoREFOR0VST1VTX0NPTkRJVElPTl9QQVRURVJOUykgYmxvY2tzIGNvZGUgaW5qZWN0aW9uXG4gICAqIC0gTGF5ZXIgMzogVk0gc2FuZGJveCB3aXRoIHRpbWVvdXQgZHVyaW5nIGV2YWx1YXRpb24gKHNlZSBldmFsdWF0ZUNvbmRpdGlvbilcbiAgICogVGhpcyBkZWZlbnNlLWluLWRlcHRoIHN0cmF0ZWd5IGVuc3VyZXMgY29uZGl0aW9ucyBjYW5ub3QgZXhlY3V0ZSBhcmJpdHJhcnkgY29kZVxuICAgKlxuICAgKiBAcGFyYW0gY29uZGl0aW9uIC0gVGhlIGNvbmRpdGlvbiBzdHJpbmcgdG8gdmFsaWRhdGVcbiAgICogQHJldHVybnMgdHJ1ZSBpZiBjb25kaXRpb24gaXMgc2FmZSwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqL1xuICBwcml2YXRlIGlzVmFsaWRDb25kaXRpb24oY29uZGl0aW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAvLyBDaGVjayBpZiBjb25kaXRpb24gbWF0Y2hlcyBzYWZlIGNoYXJhY3RlciBwYXR0ZXJuXG4gICAgaWYgKCFFTlNFTUJMRV9QQVRURVJOUy5DT05ESVRJT05fUEFUVEVSTi50ZXN0KGNvbmRpdGlvbikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgZGFuZ2Vyb3VzIHBhdHRlcm5zXG4gICAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIERBTkdFUk9VU19DT05ESVRJT05fUEFUVEVSTlMpIHtcbiAgICAgIGlmIChwYXR0ZXJuLnRlc3QoY29uZGl0aW9uKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYWRkaW5nIGFuIGVsZW1lbnQgd291bGQgY3JlYXRlIGEgY2lyY3VsYXIgZGVwZW5kZW5jeVxuICAgKi9cbiAgcHJpdmF0ZSB3b3VsZENyZWF0ZUNpcmN1bGFyRGVwZW5kZW5jeShcbiAgICBlbGVtZW50TmFtZTogc3RyaW5nLFxuICAgIGRlcGVuZGVuY2llczogc3RyaW5nW11cbiAgKTogYm9vbGVhbiB7XG4gICAgLy8gRmFzdCBwYXRoIDE6IE5vIGRlcGVuZGVuY2llcyA9IG5vIGN5Y2xlIHBvc3NpYmxlXG4gICAgaWYgKCFkZXBlbmRlbmNpZXMgfHwgZGVwZW5kZW5jaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIEZhc3QgcGF0aCAyOiBTZWxmLWRlcGVuZGVuY3lcbiAgICBpZiAoZGVwZW5kZW5jaWVzLmluY2x1ZGVzKGVsZW1lbnROYW1lKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gRmFzdCBwYXRoIDM6IENoZWNrIGlmIGFueSBkZXBlbmRlbmNpZXMgZG9uJ3QgZXhpc3QgeWV0XG4gICAgLy8gKGNhbid0IGNyZWF0ZSBjeWNsZSB3aXRoIG5vbi1leGlzdGVudCBlbGVtZW50cylcbiAgICBjb25zdCBhbGxEZXBzRXhpc3QgPSBkZXBlbmRlbmNpZXMuZXZlcnkoZGVwID0+IHRoaXMuaGFzRWxlbWVudChkZXApKTtcbiAgICBpZiAoIWFsbERlcHNFeGlzdCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIEZhc3QgcGF0aCA0OiBJZiB0aGlzIGlzIHRoZSBmaXJzdCBlbGVtZW50IHdpdGggZGVwZW5kZW5jaWVzLFxuICAgIC8vIGl0IGNhbm5vdCBjcmVhdGUgYSBjeWNsZVxuICAgIGNvbnN0IGhhc0V4aXN0aW5nRGVwZW5kZW5jaWVzID0gdGhpcy5lbGVtZW50c1xuICAgICAgLnNvbWUoZWwgPT4gZWwuZGVwZW5kZW5jaWVzICYmIGVsLmRlcGVuZGVuY2llcy5sZW5ndGggPiAwKTtcbiAgICBpZiAoIWhhc0V4aXN0aW5nRGVwZW5kZW5jaWVzKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gTm93IGRvIHRoZSBmdWxsIERGUyBjaGVjayAoZXhpc3RpbmcgaW1wbGVtZW50YXRpb24pXG4gICAgLy8gQ3JlYXRlIHRlbXBvcmFyeSBhcnJheSB3aXRoIG5ldy91cGRhdGVkIGVsZW1lbnRcbiAgICAvLyBGaWx0ZXIgb3V0IHRoZSBleGlzdGluZyBlbGVtZW50IGlmIHVwZGF0aW5nLCB0aGVuIGFkZCB0aGUgbmV3IHZlcnNpb25cbiAgICBjb25zdCB0ZW1wRWxlbWVudHMgPSBbXG4gICAgICAuLi50aGlzLmVsZW1lbnRzLmZpbHRlcihlbCA9PiBlbC5lbGVtZW50X25hbWUgIT09IGVsZW1lbnROYW1lKSxcbiAgICAgIHtcbiAgICAgICAgZWxlbWVudF9uYW1lOiBlbGVtZW50TmFtZSxcbiAgICAgICAgZWxlbWVudF90eXBlOiAndGVtcCcsXG4gICAgICAgIHJvbGU6ICdzdXBwb3J0JyxcbiAgICAgICAgcHJpb3JpdHk6IDUwLFxuICAgICAgICBhY3RpdmF0aW9uOiAnYWx3YXlzJyxcbiAgICAgICAgZGVwZW5kZW5jaWVzXG4gICAgICB9IGFzIEVuc2VtYmxlRWxlbWVudFxuICAgIF07XG5cbiAgICAvLyBIZWxwZXIgdG8gZmluZCBlbGVtZW50IGluIHRlbXAgYXJyYXlcbiAgICBjb25zdCBmaW5kVGVtcEVsZW1lbnQgPSAobmFtZTogc3RyaW5nKTogRW5zZW1ibGVFbGVtZW50IHwgdW5kZWZpbmVkID0+IHtcbiAgICAgIHJldHVybiB0ZW1wRWxlbWVudHMuZmluZChlbCA9PiBlbC5lbGVtZW50X25hbWUgPT09IG5hbWUpO1xuICAgIH07XG5cbiAgICBjb25zdCBoYXNUZW1wRWxlbWVudCA9IChuYW1lOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgICAgIHJldHVybiB0ZW1wRWxlbWVudHMuc29tZShlbCA9PiBlbC5lbGVtZW50X25hbWUgPT09IG5hbWUpO1xuICAgIH07XG5cbiAgICAvLyBDaGVjayBmb3IgY3ljbGVzIHVzaW5nIERGU1xuICAgIGNvbnN0IHZpc2l0ZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBjb25zdCByZWN1cnNpb25TdGFjayA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgY29uc3QgaGFzQ3ljbGUgPSAobm9kZTogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gICAgICB2aXNpdGVkLmFkZChub2RlKTtcbiAgICAgIHJlY3Vyc2lvblN0YWNrLmFkZChub2RlKTtcblxuICAgICAgY29uc3QgZWxlbWVudCA9IGZpbmRUZW1wRWxlbWVudChub2RlKTtcbiAgICAgIGlmIChlbGVtZW50Py5kZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBkZXAgb2YgZWxlbWVudC5kZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgICBpZiAoIWhhc1RlbXBFbGVtZW50KGRlcCkpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgaWYgKCF2aXNpdGVkLmhhcyhkZXApKSB7XG4gICAgICAgICAgICBpZiAoaGFzQ3ljbGUoZGVwKSkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfSBlbHNlIGlmIChyZWN1cnNpb25TdGFjay5oYXMoZGVwKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJlY3Vyc2lvblN0YWNrLmRlbGV0ZShub2RlKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGhhc0N5Y2xlKGVsZW1lbnROYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGNpcmN1bGFyIGRlcGVuZGVuY3kgcGF0aCBmb3IgZXJyb3IgcmVwb3J0aW5nXG4gICAqL1xuICBwcml2YXRlIGZpbmRDaXJjdWxhckRlcGVuZGVuY3koXG4gICAgZWxlbWVudE5hbWU6IHN0cmluZyxcbiAgICBkZXBlbmRlbmNpZXM6IHN0cmluZ1tdXG4gICk6IENpcmN1bGFyRGVwZW5kZW5jeSB7XG4gICAgY29uc3QgcGF0aDogc3RyaW5nW10gPSBbZWxlbWVudE5hbWVdO1xuXG4gICAgY29uc3QgZmluZEN5Y2xlID0gKGN1cnJlbnQ6IHN0cmluZywgdmlzaXRlZDogU2V0PHN0cmluZz4pOiBib29sZWFuID0+IHtcbiAgICAgIGlmICh2aXNpdGVkLmhhcyhjdXJyZW50KSkge1xuICAgICAgICAvLyBGb3VuZCB0aGUgY3ljbGVcbiAgICAgICAgY29uc3QgY3ljbGVTdGFydCA9IHBhdGguaW5kZXhPZihjdXJyZW50KTtcbiAgICAgICAgcmV0dXJuIGN5Y2xlU3RhcnQgPj0gMDtcbiAgICAgIH1cblxuICAgICAgdmlzaXRlZC5hZGQoY3VycmVudCk7XG4gICAgICBwYXRoLnB1c2goY3VycmVudCk7XG5cbiAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmZpbmRFbGVtZW50QnlOYW1lKGN1cnJlbnQpO1xuICAgICAgaWYgKGVsZW1lbnQ/LmRlcGVuZGVuY2llcykge1xuICAgICAgICBmb3IgKGNvbnN0IGRlcCBvZiBlbGVtZW50LmRlcGVuZGVuY2llcykge1xuICAgICAgICAgIGlmICh0aGlzLmhhc0VsZW1lbnQoZGVwKSkge1xuICAgICAgICAgICAgaWYgKGZpbmRDeWNsZShkZXAsIHZpc2l0ZWQpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcGF0aC5wb3AoKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCBkZXAgb2YgZGVwZW5kZW5jaWVzKSB7XG4gICAgICBpZiAodGhpcy5oYXNFbGVtZW50KGRlcCkpIHtcbiAgICAgICAgaWYgKGZpbmRDeWNsZShkZXAsIG5ldyBTZXQoKSkpIHtcbiAgICAgICAgICBwYXRoLnB1c2goZWxlbWVudE5hbWUpOyAvLyBDb21wbGV0ZSB0aGUgY3ljbGVcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBDaXJjdWxhciBkZXBlbmRlbmN5OiAke3BhdGguam9pbignIC0+ICcpfWBcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHBhdGg6IFtlbGVtZW50TmFtZV0sXG4gICAgICBtZXNzYWdlOiAnQ2lyY3VsYXIgZGVwZW5kZW5jeSBkZXRlY3RlZCdcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVjdCBhbGwgY2lyY3VsYXIgZGVwZW5kZW5jaWVzIGluIHRoZSBlbnNlbWJsZVxuICAgKi9cbiAgcHJpdmF0ZSBkZXRlY3RBbGxDaXJjdWxhckRlcGVuZGVuY2llcygpOiBDaXJjdWxhckRlcGVuZGVuY3lbXSB7XG4gICAgY29uc3QgY3ljbGVzOiBDaXJjdWxhckRlcGVuZGVuY3lbXSA9IFtdO1xuICAgIGNvbnN0IHZpc2l0ZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBjb25zdCByZWN1cnNpb25TdGFjayA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGNvbnN0IHBhdGhTdGFjazogc3RyaW5nW10gPSBbXTtcblxuICAgIGNvbnN0IGZpbmRDeWNsZXMgPSAobm9kZTogc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgICB2aXNpdGVkLmFkZChub2RlKTtcbiAgICAgIHJlY3Vyc2lvblN0YWNrLmFkZChub2RlKTtcbiAgICAgIHBhdGhTdGFjay5wdXNoKG5vZGUpO1xuXG4gICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5maW5kRWxlbWVudEJ5TmFtZShub2RlKTtcbiAgICAgIGlmIChlbGVtZW50Py5kZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBkZXAgb2YgZWxlbWVudC5kZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgICBpZiAoIXRoaXMuaGFzRWxlbWVudChkZXApKSBjb250aW51ZTtcblxuICAgICAgICAgIGlmICghdmlzaXRlZC5oYXMoZGVwKSkge1xuICAgICAgICAgICAgZmluZEN5Y2xlcyhkZXApO1xuICAgICAgICAgIH0gZWxzZSBpZiAocmVjdXJzaW9uU3RhY2suaGFzKGRlcCkpIHtcbiAgICAgICAgICAgIC8vIEZvdW5kIGEgY3ljbGVcbiAgICAgICAgICAgIGNvbnN0IGN5Y2xlU3RhcnQgPSBwYXRoU3RhY2suaW5kZXhPZihkZXApO1xuICAgICAgICAgICAgY29uc3QgY3ljbGVQYXRoID0gWy4uLnBhdGhTdGFjay5zbGljZShjeWNsZVN0YXJ0KSwgZGVwXTtcbiAgICAgICAgICAgIGN5Y2xlcy5wdXNoKHtcbiAgICAgICAgICAgICAgcGF0aDogY3ljbGVQYXRoLFxuICAgICAgICAgICAgICBtZXNzYWdlOiBgY2lyY3VsYXIgZGVwZW5kZW5jeTogJHtjeWNsZVBhdGguam9pbignIC0+ICcpfWBcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBwYXRoU3RhY2sucG9wKCk7XG4gICAgICByZWN1cnNpb25TdGFjay5kZWxldGUobm9kZSk7XG4gICAgfTtcblxuICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiB0aGlzLmVsZW1lbnRzKSB7XG4gICAgICBpZiAoIXZpc2l0ZWQuaGFzKGVsZW1lbnQuZWxlbWVudF9uYW1lKSkge1xuICAgICAgICBmaW5kQ3ljbGVzKGVsZW1lbnQuZWxlbWVudF9uYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY3ljbGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhIHZhbHVlIGluIHNoYXJlZCBjb250ZXh0XG4gICAqXG4gICAqIFNFQ1VSSVRZOiBTaXplIGxpbWl0cyBwcmV2ZW50IG1lbW9yeSBleGhhdXN0aW9uIGF0dGFja3NcbiAgICogLSBJbmRpdmlkdWFsIHZhbHVlIHNpemUgY2FwcGVkIGF0IE1BWF9DT05URVhUX1ZBTFVFX1NJWkUgKDEwS0IpXG4gICAqIC0gVG90YWwgY29udGV4dCBlbnRyaWVzIGNhcHBlZCBhdCBNQVhfQ09OVEVYVF9TSVpFICgxMDAwIGVudHJpZXMpXG4gICAqIC0gUHJldmVudHMgRG9TIHZpYSB1bmJvdW5kZWQgY29udGV4dCBncm93dGhcbiAgICogVGhlc2UgbGltaXRzIGFsbG93IGxlZ2l0aW1hdGUgdXNlIHdoaWxlIGJsb2NraW5nIG1hbGljaW91cyBwYXlsb2Fkc1xuICAgKlxuICAgKiBAcGFyYW0ga2V5IC0gQ29udGV4dCBrZXkgKHNhbml0aXplZClcbiAgICogQHBhcmFtIHZhbHVlIC0gVmFsdWUgdG8gc3RvcmUgKHNpemUtbGltaXRlZClcbiAgICogQHBhcmFtIG93bmVyRWxlbWVudE5hbWUgLSBFbGVtZW50IHNldHRpbmcgdGhpcyB2YWx1ZSAodmFsaWRhdGVkKVxuICAgKi9cbiAgcHVibGljIHNldENvbnRleHRWYWx1ZShrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIG93bmVyRWxlbWVudE5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHNhbml0aXplZEtleSA9IHNhbml0aXplSW5wdXQoa2V5LCAxMDApO1xuICAgIGNvbnN0IHNhbml0aXplZE93bmVyID0gc2FuaXRpemVJbnB1dChvd25lckVsZW1lbnROYW1lLCAxMDApO1xuICAgIGNvbnN0IGxpbWl0cyA9IHRoaXMuZ2V0RWZmZWN0aXZlTGltaXRzKCk7XG5cbiAgICAvLyBWYWxpZGF0ZSB0aGF0IG93bmVyIGVsZW1lbnQgZXhpc3RzIGluIHRoZSBlbnNlbWJsZVxuICAgIGlmICghdGhpcy5oYXNFbGVtZW50KHNhbml0aXplZE93bmVyKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgT3duZXIgZWxlbWVudCAnJHtzYW5pdGl6ZWRPd25lcn0nIG5vdCBmb3VuZCBpbiBlbnNlbWJsZS4gYCArXG4gICAgICAgIGBPbmx5IGVsZW1lbnRzIGluIHRoZSBlbnNlbWJsZSBjYW4gc2V0IGNvbnRleHQgdmFsdWVzLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgdmFsdWUgc2l6ZSB0byBwcmV2ZW50IG1lbW9yeSBleGhhdXN0aW9uXG4gICAgY29uc3QgdmFsdWVTaXplID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpLmxlbmd0aDtcbiAgICBpZiAodmFsdWVTaXplID4gbGltaXRzLk1BWF9DT05URVhUX1ZBTFVFX1NJWkUpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogRU5TRU1CTEVfU0VDVVJJVFlfRVZFTlRTLkNPTlRFWFRfVkFMVUVfVE9PX0xBUkdFLFxuICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgIHNvdXJjZTogJ0Vuc2VtYmxlLnNldENvbnRleHRWYWx1ZScsXG4gICAgICAgIGRldGFpbHM6IGBDb250ZXh0IHZhbHVlIHNpemUgKCR7dmFsdWVTaXplfSkgZXhjZWVkcyBsaW1pdCAoJHtsaW1pdHMuTUFYX0NPTlRFWFRfVkFMVUVfU0laRX0pYFxuICAgICAgfSk7XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENvbnRleHQgdmFsdWUgc2l6ZSAoJHt2YWx1ZVNpemV9IGJ5dGVzKSBleGNlZWRzIG1heGltdW0gYWxsb3dlZCBzaXplIGAgK1xuICAgICAgICBgKCR7bGltaXRzLk1BWF9DT05URVhUX1ZBTFVFX1NJWkV9IGJ5dGVzKWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgY29udGV4dCBzaXplIGxpbWl0XG4gICAgaWYgKHRoaXMuc2hhcmVkQ29udGV4dC52YWx1ZXMuc2l6ZSA+PSBsaW1pdHMuTUFYX0NPTlRFWFRfU0laRSkge1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiBFTlNFTUJMRV9TRUNVUklUWV9FVkVOVFMuQ09OVEVYVF9TSVpFX0VYQ0VFREVELFxuICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgIHNvdXJjZTogJ0Vuc2VtYmxlLnNldENvbnRleHRWYWx1ZScsXG4gICAgICAgIGRldGFpbHM6IGBDb250ZXh0IHNpemUgbGltaXQgZXhjZWVkZWQ6ICR7bGltaXRzLk1BWF9DT05URVhUX1NJWkV9YFxuICAgICAgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoRU5TRU1CTEVfRVJST1JTLkNPTlRFWFRfT1ZFUkZMT1cpO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGtleSBleGlzdHMgKHBvdGVudGlhbCBjb25mbGljdClcbiAgICBpZiAodGhpcy5zaGFyZWRDb250ZXh0LnZhbHVlcy5oYXMoc2FuaXRpemVkS2V5KSkge1xuICAgICAgY29uc3QgY3VycmVudE93bmVyID0gdGhpcy5zaGFyZWRDb250ZXh0Lm93bmVycy5nZXQoc2FuaXRpemVkS2V5KSE7XG4gICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB0aGlzLnNoYXJlZENvbnRleHQudmFsdWVzLmdldChzYW5pdGl6ZWRLZXkpO1xuXG4gICAgICAvLyBSZXNvbHZlIGNvbmZsaWN0IGJhc2VkIG9uIHN0cmF0ZWd5XG4gICAgICBjb25zdCByZXNvbHZlZFZhbHVlID0gdGhpcy5yZXNvbHZlQ29uZmxpY3QoXG4gICAgICAgIHNhbml0aXplZEtleSxcbiAgICAgICAgY3VycmVudFZhbHVlLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgY3VycmVudE93bmVyLFxuICAgICAgICBzYW5pdGl6ZWRPd25lclxuICAgICAgKTtcblxuICAgICAgdGhpcy5zaGFyZWRDb250ZXh0LnZhbHVlcy5zZXQoc2FuaXRpemVkS2V5LCByZXNvbHZlZFZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zaGFyZWRDb250ZXh0LnZhbHVlcy5zZXQoc2FuaXRpemVkS2V5LCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgdGhpcy5zaGFyZWRDb250ZXh0Lm93bmVycy5zZXQoc2FuaXRpemVkS2V5LCBzYW5pdGl6ZWRPd25lcik7XG4gICAgdGhpcy5zaGFyZWRDb250ZXh0LnRpbWVzdGFtcHMuc2V0KHNhbml0aXplZEtleSwgbmV3IERhdGUoKSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgdmFsdWUgZnJvbSBzaGFyZWQgY29udGV4dFxuICAgKi9cbiAgcHVibGljIGdldENvbnRleHRWYWx1ZShrZXk6IHN0cmluZyk6IHVua25vd24ge1xuICAgIGNvbnN0IHNhbml0aXplZEtleSA9IHNhbml0aXplSW5wdXQoa2V5LCAxMDApO1xuICAgIHJldHVybiB0aGlzLnNoYXJlZENvbnRleHQudmFsdWVzLmdldChzYW5pdGl6ZWRLZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGFsbCBvciBzcGVjaWZpYyBjb250ZXh0IHZhbHVlc1xuICAgKlxuICAgKiBAcGFyYW0gb3duZXJFbGVtZW50TmFtZSAtIE9wdGlvbmFsOiBvbmx5IGNsZWFyIHZhbHVlcyBvd25lZCBieSB0aGlzIGVsZW1lbnRcbiAgICogQHRocm93cyBFcnJvciBpZiB0cnlpbmcgdG8gY2xlYXIgZHVyaW5nIGFjdGl2YXRpb25cbiAgICovXG4gIHB1YmxpYyBjbGVhckNvbnRleHQob3duZXJFbGVtZW50TmFtZT86IHN0cmluZyk6IHZvaWQge1xuICAgIC8vIFByZXZlbnQgY2xlYXJpbmcgZHVyaW5nIGFjdGl2YXRpb25cbiAgICBpZiAodGhpcy5hY3RpdmF0aW9uSW5Qcm9ncmVzcykge1xuICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgICdBdHRlbXB0aW5nIHRvIGNsZWFyIGNvbnRleHQgZHVyaW5nIGVuc2VtYmxlIGFjdGl2YXRpb24uICcgK1xuICAgICAgICAnVGhpcyBvcGVyYXRpb24gd2lsbCBwcm9jZWVkIGJ1dCBtYXkgY2F1c2UgdW5leHBlY3RlZCBiZWhhdmlvci4nXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChvd25lckVsZW1lbnROYW1lKSB7XG4gICAgICBjb25zdCBzYW5pdGl6ZWRPd25lciA9IHNhbml0aXplSW5wdXQob3duZXJFbGVtZW50TmFtZSwgMTAwKTtcblxuICAgICAgLy8gVmFsaWRhdGUgb3duZXIgZXhpc3RzXG4gICAgICBpZiAoIXRoaXMuaGFzRWxlbWVudChzYW5pdGl6ZWRPd25lcikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBPd25lciBlbGVtZW50ICcke3Nhbml0aXplZE93bmVyfScgbm90IGZvdW5kIGluIGVuc2VtYmxlLiBgICtcbiAgICAgICAgICBgQ2Fubm90IGNsZWFyIGNvbnRleHQgZm9yIG5vbi1leGlzdGVudCBlbGVtZW50LmBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2xlYXIgb25seSB2YWx1ZXMgb3duZWQgYnkgdGhpcyBlbGVtZW50XG4gICAgICBsZXQgY2xlYXJlZENvdW50ID0gMDtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgb3duZXJdIG9mIHRoaXMuc2hhcmVkQ29udGV4dC5vd25lcnMpIHtcbiAgICAgICAgaWYgKG93bmVyID09PSBzYW5pdGl6ZWRPd25lcikge1xuICAgICAgICAgIHRoaXMuc2hhcmVkQ29udGV4dC52YWx1ZXMuZGVsZXRlKGtleSk7XG4gICAgICAgICAgdGhpcy5zaGFyZWRDb250ZXh0Lm93bmVycy5kZWxldGUoa2V5KTtcbiAgICAgICAgICB0aGlzLnNoYXJlZENvbnRleHQudGltZXN0YW1wcy5kZWxldGUoa2V5KTtcbiAgICAgICAgICBjbGVhcmVkQ291bnQrKztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsb2dnZXIuZGVidWcoYENsZWFyZWQgJHtjbGVhcmVkQ291bnR9IGNvbnRleHQgdmFsdWVzIG93bmVkIGJ5ICR7c2FuaXRpemVkT3duZXJ9YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENsZWFyIGFsbCBjb250ZXh0XG4gICAgICBjb25zdCB0b3RhbENvdW50ID0gdGhpcy5zaGFyZWRDb250ZXh0LnZhbHVlcy5zaXplO1xuICAgICAgdGhpcy5zaGFyZWRDb250ZXh0LnZhbHVlcy5jbGVhcigpO1xuICAgICAgdGhpcy5zaGFyZWRDb250ZXh0Lm93bmVycy5jbGVhcigpO1xuICAgICAgdGhpcy5zaGFyZWRDb250ZXh0LnRpbWVzdGFtcHMuY2xlYXIoKTtcblxuICAgICAgbG9nZ2VyLmluZm8oYENsZWFyZWQgYWxsIHNoYXJlZCBjb250ZXh0ICgke3RvdGFsQ291bnR9IHZhbHVlcylgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVHlwZSBndWFyZCB0byBjaGVjayBpZiBhIHZhbHVlIGlzIGEgcGxhaW4gb2JqZWN0IChub3QgbnVsbCwgbm90IGFycmF5KVxuICAgKi9cbiAgcHJpdmF0ZSBpc1BsYWluT2JqZWN0KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIHJldHVybiAoXG4gICAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgICAgIUFycmF5LmlzQXJyYXkodmFsdWUpICYmXG4gICAgICBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBPYmplY3RdJ1xuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBhIGNvbnRleHQgY29uZmxpY3QgYmFzZWQgb24gY29uZmlndXJlZCBzdHJhdGVneVxuICAgKi9cbiAgcHJpdmF0ZSByZXNvbHZlQ29uZmxpY3QoXG4gICAga2V5OiBzdHJpbmcsXG4gICAgY3VycmVudFZhbHVlOiB1bmtub3duLFxuICAgIG5ld1ZhbHVlOiB1bmtub3duLFxuICAgIGN1cnJlbnRPd25lcjogc3RyaW5nLFxuICAgIG5ld093bmVyOiBzdHJpbmdcbiAgKTogdW5rbm93biB7XG4gICAgY29uc3QgY29uZmxpY3Q6IENvbnRleHRDb25mbGljdCA9IHtcbiAgICAgIGtleSxcbiAgICAgIGN1cnJlbnRWYWx1ZSxcbiAgICAgIGN1cnJlbnRPd25lcixcbiAgICAgIG5ld1ZhbHVlLFxuICAgICAgbmV3T3duZXIsXG4gICAgICByZXNvbHZlZEJ5OiB0aGlzLm1ldGFkYXRhLmNvbmZsaWN0UmVzb2x1dGlvblxuICAgIH07XG5cbiAgICBzd2l0Y2ggKHRoaXMubWV0YWRhdGEuY29uZmxpY3RSZXNvbHV0aW9uKSB7XG4gICAgICBjYXNlICdsYXN0LXdyaXRlJzpcbiAgICAgICAgY29uZmxpY3QucmVzb2x1dGlvbiA9IG5ld1ZhbHVlO1xuICAgICAgICByZXR1cm4gbmV3VmFsdWU7XG5cbiAgICAgIGNhc2UgJ2ZpcnN0LXdyaXRlJzpcbiAgICAgICAgY29uZmxpY3QucmVzb2x1dGlvbiA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRWYWx1ZTtcblxuICAgICAgY2FzZSAncHJpb3JpdHknOiB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRFbGVtZW50ID0gdGhpcy5maW5kRWxlbWVudEJ5TmFtZShjdXJyZW50T3duZXIpO1xuICAgICAgICBjb25zdCBuZXdFbGVtZW50ID0gdGhpcy5maW5kRWxlbWVudEJ5TmFtZShuZXdPd25lcik7XG4gICAgICAgIGlmIChuZXdFbGVtZW50ICYmIGN1cnJlbnRFbGVtZW50KSB7XG4gICAgICAgICAgY29uZmxpY3QucmVzb2x1dGlvbiA9IG5ld0VsZW1lbnQucHJpb3JpdHkgPiBjdXJyZW50RWxlbWVudC5wcmlvcml0eSA/XG4gICAgICAgICAgICBuZXdWYWx1ZSA6IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICByZXR1cm4gY29uZmxpY3QucmVzb2x1dGlvbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3VmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ21lcmdlJzpcbiAgICAgICAgLy8gQXR0ZW1wdCB0byBtZXJnZSBpZiBib3RoIGFyZSBwbGFpbiBvYmplY3RzICh3aXRoIHR5cGUgZ3VhcmRzKVxuICAgICAgICBpZiAodGhpcy5pc1BsYWluT2JqZWN0KGN1cnJlbnRWYWx1ZSkgJiYgdGhpcy5pc1BsYWluT2JqZWN0KG5ld1ZhbHVlKSkge1xuICAgICAgICAgIC8vIFNFQ1VSSVRZOiBTcHJlYWQgb3BlcmF0b3IgaXMgc2FmZSBmcm9tIHByb3RvdHlwZSBwb2xsdXRpb25cbiAgICAgICAgICAvLyBfX3Byb3RvX18gYmVjb21lcyBhIHJlZ3VsYXIgcHJvcGVydHkga2V5LCBkb2VzIG5vdCBtb2RpZnkgT2JqZWN0LnByb3RvdHlwZVxuICAgICAgICAgIC8vIFNlZTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvT3BlcmF0b3JzL1NwcmVhZF9zeW50YXhcbiAgICAgICAgICAvLyBUZXN0ZWQ6IEFsbCBwcm90b3R5cGUgcG9sbHV0aW9uIGF0dGFjayB2ZWN0b3JzIGJsb2NrZWQgKHNlZSB0ZXN0cy9zZWN1cml0eS9lbnNlbWJsZS1zZWN1cml0eS1hdWRpdC50ZXN0LnRzKVxuICAgICAgICAgIGNvbmZsaWN0LnJlc29sdXRpb24gPSB7IC4uLmN1cnJlbnRWYWx1ZSwgLi4ubmV3VmFsdWUgfTtcbiAgICAgICAgICByZXR1cm4gY29uZmxpY3QucmVzb2x1dGlvbjtcbiAgICAgICAgfVxuICAgICAgICAvLyBGYWxsIGJhY2sgdG8gbGFzdC13cml0ZSBpZiBjYW4ndCBtZXJnZVxuICAgICAgICBjb25mbGljdC5yZXNvbHV0aW9uID0gbmV3VmFsdWU7XG4gICAgICAgIHJldHVybiBuZXdWYWx1ZTtcblxuICAgICAgY2FzZSAnZXJyb3InOlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYENvbnRleHQgY29uZmxpY3Qgb24ga2V5ICcke2tleX0nOiAke2N1cnJlbnRPd25lcn0gdnMgJHtuZXdPd25lcn1gXG4gICAgICAgICk7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBuZXdWYWx1ZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGFjdGl2YXRpb24gbWV0cmljcyBhZnRlciBhbiBhY3RpdmF0aW9uIGF0dGVtcHRcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgdXBkYXRlQWN0aXZhdGlvbk1ldHJpY3MocmVzdWx0OiBFbnNlbWJsZUFjdGl2YXRpb25SZXN1bHQsIG5lc3RpbmdEZXB0aDogbnVtYmVyID0gMCk6IHZvaWQge1xuICAgIGNvbnN0IGR1cmF0aW9uID0gcmVzdWx0LnRvdGFsRHVyYXRpb247XG5cbiAgICB0aGlzLmFjdGl2YXRpb25NZXRyaWNzLnRvdGFsQWN0aXZhdGlvbnMrKztcbiAgICBpZiAocmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgIHRoaXMuYWN0aXZhdGlvbk1ldHJpY3Muc3VjY2Vzc2Z1bEFjdGl2YXRpb25zKys7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYWN0aXZhdGlvbk1ldHJpY3MuZmFpbGVkQWN0aXZhdGlvbnMrKztcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgZHVyYXRpb24gc3RhdGlzdGljc1xuICAgIHRoaXMuYWN0aXZhdGlvbk1ldHJpY3MubWluRHVyYXRpb24gPSBNYXRoLm1pbih0aGlzLmFjdGl2YXRpb25NZXRyaWNzLm1pbkR1cmF0aW9uLCBkdXJhdGlvbik7XG4gICAgdGhpcy5hY3RpdmF0aW9uTWV0cmljcy5tYXhEdXJhdGlvbiA9IE1hdGgubWF4KHRoaXMuYWN0aXZhdGlvbk1ldHJpY3MubWF4RHVyYXRpb24sIGR1cmF0aW9uKTtcblxuICAgIC8vIFVwZGF0ZSBhdmVyYWdlIGR1cmF0aW9uIChydW5uaW5nIGF2ZXJhZ2UpXG4gICAgY29uc3QgcHJldkF2ZyA9IHRoaXMuYWN0aXZhdGlvbk1ldHJpY3MuYXZlcmFnZUR1cmF0aW9uO1xuICAgIGNvbnN0IHRvdGFsQ291bnQgPSB0aGlzLmFjdGl2YXRpb25NZXRyaWNzLnRvdGFsQWN0aXZhdGlvbnM7XG4gICAgdGhpcy5hY3RpdmF0aW9uTWV0cmljcy5hdmVyYWdlRHVyYXRpb24gPVxuICAgICAgKHByZXZBdmcgKiAodG90YWxDb3VudCAtIDEpICsgZHVyYXRpb24pIC8gdG90YWxDb3VudDtcblxuICAgIC8vIFRyYWNrIG5lc3RlZCBlbnNlbWJsZSBjb3VudFxuICAgIGNvbnN0IG5lc3RlZENvdW50ID0gcmVzdWx0LmFjdGl2YXRlZEVsZW1lbnRzLmZpbHRlcihuYW1lID0+IHtcbiAgICAgIGNvbnN0IGVsZW0gPSB0aGlzLmZpbmRFbGVtZW50QnlOYW1lKG5hbWUpO1xuICAgICAgcmV0dXJuIGVsZW0/LmVsZW1lbnRfdHlwZSA9PT0gJ2Vuc2VtYmxlJztcbiAgICB9KS5sZW5ndGg7XG4gICAgdGhpcy5hY3RpdmF0aW9uTWV0cmljcy5uZXN0ZWRFbnNlbWJsZUNvdW50ICs9IG5lc3RlZENvdW50O1xuXG4gICAgLy8gVHJhY2sgbWF4IG5lc3RpbmcgZGVwdGhcbiAgICB0aGlzLmFjdGl2YXRpb25NZXRyaWNzLm1heE5lc3RpbmdEZXB0aCA9IE1hdGgubWF4KFxuICAgICAgdGhpcy5hY3RpdmF0aW9uTWV0cmljcy5tYXhOZXN0aW5nRGVwdGgsXG4gICAgICBuZXN0aW5nRGVwdGhcbiAgICApO1xuXG4gICAgdGhpcy5hY3RpdmF0aW9uTWV0cmljcy5sYXN0QWN0aXZhdGlvbiA9IG5ldyBEYXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFjdGl2YXRpb24gbWV0cmljcyBmb3IgcGVyZm9ybWFuY2UgbW9uaXRvcmluZ1xuICAgKiBSZXR1cm5zIGEgc25hcHNob3Qgb2YgY3VycmVudCBtZXRyaWNzXG4gICAqL1xuICBwdWJsaWMgZ2V0QWN0aXZhdGlvbk1ldHJpY3MoKTogUmVhZG9ubHk8RW5zZW1ibGVBY3RpdmF0aW9uTWV0cmljcz4ge1xuICAgIHJldHVybiB7IC4uLnRoaXMuYWN0aXZhdGlvbk1ldHJpY3MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGxhc3QgYWN0aXZhdGlvbiByZXN1bHRcbiAgICovXG4gIHB1YmxpYyBnZXRMYXN0QWN0aXZhdGlvblJlc3VsdCgpOiBFbnNlbWJsZUFjdGl2YXRpb25SZXN1bHQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmxhc3RBY3RpdmF0aW9uUmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgZWxlbWVudHMgaW4gdGhlIGVuc2VtYmxlXG4gICAqL1xuICBwdWJsaWMgZ2V0RWxlbWVudHMoKTogRW5zZW1ibGVFbGVtZW50W10ge1xuICAgIHJldHVybiBbLi4udGhpcy5lbGVtZW50c107XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgc3BlY2lmaWMgZWxlbWVudCBieSBuYW1lXG4gICAqL1xuICBwdWJsaWMgZ2V0RWxlbWVudChuYW1lOiBzdHJpbmcpOiBFbnNlbWJsZUVsZW1lbnQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZpbmRFbGVtZW50QnlOYW1lKHNhbml0aXplSW5wdXQobmFtZSwgMTAwKSk7XG4gIH1cbn1cblxuLy8gUmUtZXhwb3J0IHR5cGVzIGZvciBjb252ZW5pZW5jZVxuZXhwb3J0IHR5cGUgeyBFbnNlbWJsZU1ldGFkYXRhLCBFbnNlbWJsZUVsZW1lbnQgfSBmcm9tICcuL3R5cGVzLmpzJztcbiJdfQ==
|