@magic-xpa/engine 4.800.0-dev480.217 → 4.800.0-dev480.219
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/bundles/magic-xpa-engine.umd.js +38 -3
- package/bundles/magic-xpa-engine.umd.js.map +1 -1
- package/bundles/magic-xpa-engine.umd.min.js +1 -1
- package/bundles/magic-xpa-engine.umd.min.js.map +1 -1
- package/esm2015/index.js +2 -1
- package/esm2015/src/CurrentClientVersion.js +2 -2
- package/esm2015/src/commands/ClientToServer/CommandFactory.js +15 -1
- package/esm2015/src/commands/ClientToServer/ExecOperCommand.js +4 -1
- package/esm2015/src/commands/ClientToServer/SelectProgramCommand.js +15 -0
- package/esm2015/src/event/EventsManager.js +2 -2
- package/esm2015/src/remote/RemoteCommandsProcessor.js +2 -2
- package/fesm2015/magic-xpa-engine.js +33 -4
- package/fesm2015/magic-xpa-engine.js.map +1 -1
- package/index.d.ts +1 -0
- package/package.json +4 -4
- package/src/commands/ClientToServer/CommandFactory.d.ts +1 -0
- package/src/commands/ClientToServer/ExecOperCommand.d.ts +2 -1
- package/src/commands/ClientToServer/SelectProgramCommand.d.ts +6 -0
|
@@ -267,7 +267,7 @@ export class RemoteCommandsProcessor extends CommandsProcessorBase {
|
|
|
267
267
|
if (cmdsToServer.getCmd(i) instanceof ExecOperCommand) {
|
|
268
268
|
let operCmd = currMGData.CmdsToServer.getCmd(i);
|
|
269
269
|
this._requestInfo.serverCallAt = operCmd.getCommandInfo();
|
|
270
|
-
this._requestInfo.runtimeTaskTree = this.GetTaskTree(operCmd.
|
|
270
|
+
this._requestInfo.runtimeTaskTree = this.GetTaskTree(operCmd.getTask());
|
|
271
271
|
operExecution = true;
|
|
272
272
|
break;
|
|
273
273
|
}
|
|
@@ -900,4 +900,4 @@ class ErrorMessageXml {
|
|
|
900
900
|
return expired;
|
|
901
901
|
}
|
|
902
902
|
}
|
|
903
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lbmdpbmUvc3JjL3JlbW90ZS9SZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNMLE1BQU0sRUFDTixVQUFVLEVBQ1YsTUFBTSxFQUNOLGdCQUFnQixFQUNoQixJQUFJLEVBQ0osWUFBWSxFQUNaLGFBQWEsRUFBRSxPQUFPLEVBQ3RCLFlBQVksRUFDYixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUN4RyxPQUFPLEVBQ3dCLFFBQVEsRUFBRSxNQUFNLEVBQUUsMkJBQTJCLEVBQUUsa0JBQWtCLEVBQy9GLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLDRDQUE0QyxDQUFDO0FBRTNFLE9BQU8sRUFDTCxxQkFBcUIsRUFDckIsd0NBQXdDLEVBQ3hDLGtDQUFrQyxFQUNuQyxNQUFNLDBCQUEwQixDQUFDO0FBQ2xDLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUNoRCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDakQsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQzVDLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFMUMsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGtCQUFrQixFQUFZLE1BQU0sbUJBQW1CLENBQUM7QUFDakUsT0FBTyxFQUFDLGlCQUFpQixFQUFFLFdBQVcsRUFBQyxNQUFN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Q0FBQyxZQUFZLENBQUMsd0JBQXdCLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQztZQUN2RyxFQUFFLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztZQUM5QyxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3BCLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDbEI7UUFFRCxPQUFPLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRU8sd0JBQXdCO1FBQzlCLElBQUksT0FBTyxHQUFZLEtBQUssQ0FBQztRQUM3QixJQUFJLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxDQUFDLEVBQUU7WUFDckMsSUFBSSxhQUFhLEdBQVcsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDekQsT0FBTyxHQUFHLENBQUMsQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztTQUM3RjtRQUNELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQmFzZTY0LFxyXG4gIEpTT05fVXRpbHMsXHJcbiAgTG9nZ2VyLFxyXG4gIExvZ2dlcl9Mb2dMZXZlbHMsXHJcbiAgTWlzYyxcclxuICBNc2dJbnRlcmZhY2UsXHJcbiAgT1NFbnZpcm9ubWVudCwgU3RyVXRpbCxcclxuICBYTUxDb25zdGFudHNcclxufSBmcm9tIFwiQG1hZ2ljLXhwYS91dGlsc1wiO1xyXG5pbXBvcnQge0RlYnVnLCBFbmNvZGluZywgTlN0cmluZywgUmVmUGFyYW0sIFN0cmluZ0J1aWxkZXIsIEV4Y2VwdGlvbiwgTGlzdH0gZnJvbSBcIkBtYWdpYy14cGEvbXNjb3JlbGliXCI7XHJcbmltcG9ydCB7XHJcbiAgQXV0aGVudGljYXRpb25EaWFsb2dIYW5kbGVyLCBDb21tYW5kcywgU3R5bGVzLCBVc2VybmFtZVBhc3N3b3JkQ3JlZGVudGlhbHMsIFJ1bnRpbWVDb250ZXh0QmFzZVxyXG59IGZyb20gXCJAbWFnaWMteHBhL2d1aVwiO1xyXG5pbXBvcnQge0V4ZWNPcGVyQ29tbWFuZH0gZnJvbSAnLi4vY29tbWFuZHMvQ2xpZW50VG9TZXJ2ZXIvRXhlY09wZXJDb21tYW5kJztcclxuaW1wb3J0IHtUYXNrfSBmcm9tICcuLi90YXNrcy9UYXNrJ1xyXG5pbXBvcnQge1xyXG4gIENvbW1hbmRzUHJvY2Vzc29yQmFzZSxcclxuICBDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2VuZGluZ0luc3RydWN0aW9uLFxyXG4gIENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZXNzaW9uU3RhZ2VcclxufSBmcm9tIFwiLi4vQ29tbWFuZHNQcm9jZXNzb3JCYXNlXCI7XHJcbmltcG9ydCB7SHR0cE1hbmFnZXJ9IGZyb20gXCIuLi9odHRwL0h0dHBNYW5hZ2VyXCI7XHJcbmltcG9ydCB7Q29uc3RJbnRlcmZhY2V9IGZyb20gXCIuLi9Db25zdEludGVyZmFjZVwiO1xyXG5pbXBvcnQge1NjcmFtYmxlcn0gZnJvbSBcIi4uL3V0aWwvU2NyYW1ibGVyXCI7XHJcbmltcG9ydCB7U2VydmVyRXJyb3J9IGZyb20gXCIuL1NlcnZlckVycm9yXCI7XHJcbmltcG9ydCB7SVJlc3VsdFZhbHVlfSBmcm9tIFwiLi4vcnQvSVJlc3VsdFZhbHVlXCI7XHJcbmltcG9ydCB7Rmxvd01vbml0b3JRdWV1ZX0gZnJvbSBcIi4uL3V0aWwvRmxvd01vbml0b3JRdWV1ZVwiO1xyXG5pbXBvcnQgeyBPcGVuaW5nVGFza0RldGFpbHMsIFRhc2tCYXNlIH0gZnJvbSBcIi4uL3Rhc2tzL1Rhc2tCYXNlXCI7XHJcbmltcG9ydCB7aXNOdWxsT3JVbmRlZmluZWQsIGlzVW5kZWZpbmVkfSBmcm9tIFwidXRpbFwiO1xyXG5pbXBvcnQge0h0dHBVdGlsaXR5fSBmcm9tIFwiLi4vaHR0cC9jbGllbnQvSHR0cFV0aWxpdHlcIjtcclxuaW1wb3J0IHtIdHRwQ2xpZW50RXZlbnRzfSBmcm9tIFwiLi4vaHR0cC9jbGllbnQvSHR0cENsaWVudEV2ZW50c1wiO1xyXG5pbXBvcnQgeyBTZXJ2ZXJDb25maWcgfSBmcm9tIFwiLi4vU2VydmVyQ29uZmlnXCI7XHJcbmltcG9ydCB7IE1HRGF0YSB9IGZyb20gXCIuLi90YXNrcy9NR0RhdGFcIjtcclxuaW1wb3J0IHsgQ29tbWFuZHNUYWJsZSB9IGZyb20gXCIuLi9Db21tYW5kc1RhYmxlXCI7XHJcbmltcG9ydCB7IEFjY2Vzc0hlbHBlciB9IGZyb20gXCIuLi9BY2Nlc3NIZWxwZXJcIjtcclxuaW1wb3J0IHtSZXF1ZXN0SW5mb30gZnJvbSBcIkBtYWdpYy14cGEvdXRpbHNcIjtcclxuaW1wb3J0IHtcclxuICBFbnZpcm9ubWVudCxcclxuICBFdmVudCwgRXZlbnRDb21tYW5kLCBFdmVudHNNYW5hZ2VyLCBHVUlNYW5hZ2VyLCBJQ2xpZW50Q29tbWFuZCxcclxuICBSdW5UaW1lRXZlbnRcclxufSBmcm9tIFwiLi4vLi4vXCI7XHJcbmltcG9ydCB7SUNsaWVudFRvU2VydmVyQ29tbWFuZEluZm99IGZyb20gXCIuLi9jb21tYW5kcy9JQ2xpZW50VG9TZXJ2ZXJDb21tYW5kSW5mb1wiO1xyXG5pbXBvcnQge01HRGF0YUNvbGxlY3Rpb259IGZyb20gXCIuLi90YXNrcy9NR0RhdGFDb2xsZWN0aW9uXCI7XHJcbmltcG9ydCB7U3Vic2NyaXB0aW9uLCB0aW1lcn0gZnJvbSBcInJ4anNcIjtcclxuXHJcbi8vLyA8c3VtbWFyeT4gUmVwcmVzZW50cyB0aGUgc3RhdHVzIG9mIGEgcmVxdWVzdCA8L3N1bW1hcnk+XHJcbmVudW0gIFJlcXVlc3RTdGF0dXNcclxue1xyXG4gIEhhbmRsZWQsIC8vdGhlIHJlcXVlc3Qgd2FzIHN1Y2Nlc3NmdWxseSBoYW5kbGVkLlxyXG4gIFJldHJ5LCAgIC8vdGhlIHJlcXVlc3Qgc2hvdWxkIGJlIHJlLXNlbnQuXHJcbiAgQWJvcnQgICAvL3RoZSByZXF1ZXN0IGNvdWxkIG5vdCBiZSBoYW5kbGVkIGFuZCBzaG91bGQgYmUgYWJvcnRlZC5cclxufVxyXG5cclxuLy8gQGR5bmFtaWNcclxuZXhwb3J0IGNsYXNzIFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yIGV4dGVuZHMgQ29tbWFuZHNQcm9jZXNzb3JCYXNlIHtcclxuICBzdGF0aWMgcmVhZG9ubHkgUkNfTk9fQ09OVEVYVF9JRDogc3RyaW5nID0gJy0xJztcclxuICBwcml2YXRlIHN0YXRpYyBfaW5zdGFuY2U6IFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yID0gbnVsbDtcclxuICBwdWJsaWMgc3RhdGljIElzU2Vzc2lvblJlSW5pdGlhbGl6aW5nID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgbGFzdEV4Y2VwdGlvbk1lc3NhZ2UgPSBudWxsO1xyXG4gIHByaXZhdGUgc3RhdGljIEluaXRpYWxVcmw6IHN0cmluZyA9IG51bGw7XHJcblxyXG4gIC8vIFRPRE8gLSBtb3ZlIGl0IHRvIGNsYXNzXHJcbiAgcHJpdmF0ZSBzdGF0aWMgcmVxdWVzdE51bWJlciA9IDA7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgdG90YWxUaW1lRm9ySFRUUFJlcXVlc3RzID0gMDtcclxuICBwcml2YXRlIHN0YXRpYyB0b3RhbFJlcXVlc3REYXRhTGVuZ3RoID0gMDtcclxuICBwcml2YXRlIHN0YXRpYyB0b3RhbFJlc3BvbnNlRGF0YUxlbmd0aCA9IDA7XHJcblxyXG4gIC8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbiAgLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuICAvLyAqKioqKioqKiBXaGVuIGNoYW5naW5nIFdFQl9DT01NVU5JQ0FUSU9OX1BST1RPQ09MX1ZFUlNJT04sIHBsZWFzZSBjaGFuZ2Ugb24gbW9iaWxlIHBsYXRmb3JtcyBhcyB3ZWxsOlxyXG4gIC8vICoqKioqKioqIFcxME06IFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLmNzXHJcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgV0VCX0NPTU1VTklDQVRJT05fUFJPVE9DT0xfVkVSU0lPTjogc3RyaW5nID0gXCIxNDAwMlwiO1xyXG4gIC8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbiAgLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuXHJcbiAgLy8gVE9ETzogQ2hlY2sgaWYgd2UgbmVlZCBfbG9nQWNjdW11bGF0b3IuXHJcbiAgLy8gcHJpdmF0ZSBfbG9nQWNjdW11bGF0b3I6IENsaWVudExvZ0FjY3VtdWxhdG9yID0gbnVsbDtcclxuXHJcbiAgcHJpdmF0ZSBfbGFzdFJlcXVlc3RUaW1lOiBudW1iZXIgPSAwOyAvLyB0aGUgdGltZSBvZiB0aGUgbGFzdCByZXF1ZXN0IHRvIHRoZSBzZXJ2ZXJcclxuXHJcbiAgU2VydmVyVXJsOiBzdHJpbmcgPSBudWxsO1xyXG4gIHByaXZhdGUgc3RhdGljIF9zaG91bGRTY3JhbWJsZUFuZFVuc2NyYW1ibGVNZXNzYWdlczogYm9vbGVhbiA9IGZhbHNlOyAvLyBzdGF0aWMgYmVjYXVzZSBpdCBpcyBpbml0aWFsaXplZCBiZWZvcmUgdGhlIGV4ZWN1dGlvbiBwcm9wcyBhcmUgYXZhaWxhYmxlXHJcblxyXG4gIHB1YmxpYyBTZXNzaW9uSWQ6IHN0cmluZztcclxuXHJcbiAgcHVibGljIERlbGF5Q29tbWFuZEV4ZWN1dGlvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX3JlcXVlc3RJbmZvID0gbmV3IFJlcXVlc3RJbmZvKCk7XHJcblxyXG4gIHN0YXRpYyBHZXRJbnN0YW5jZSgpOiBSZW1vdGVDb21tYW5kc1Byb2Nlc3NvciB7XHJcbiAgICBpZiAoUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuX2luc3RhbmNlID09PSBudWxsKSB7XHJcbiAgICAgIFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLl9pbnN0YW5jZSA9IG5ldyBSZW1vdGVDb21tYW5kc1Byb2Nlc3NvcigpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5faW5zdGFuY2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgc3VwZXIoKTtcclxuICAgIHRoaXMuU2VydmVyVXJsID0gU2VydmVyQ29uZmlnLkluc3RhbmNlLmdldFNlcnZlclVSTCgpO1xyXG5cclxuICAgIEh0dHBNYW5hZ2VyLkdldEluc3RhbmNlKCk7XHJcblxyXG4gICAgdGhpcy5SZWdpc3RlckRlbGVnYXRlcygpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBDaGVja3MgdGhhdCBzZXNzaW9uIGNvdW50ZXIgaXMgY29uc2VjdXRpdmUgZHVyaW5nIHRoZSBzZXNzaW9uIGFuZCBzZXRzIG5ldyB2YWx1ZS5cclxuICAvLy8gVGhlIG9ubHkgZXhjZXB0aW9uIGlzIGluIGNhc2UgdGhlIGNsaWVudCBzZW50IHRvIHRoZSBzZXJ2ZXIgQ29uc3RJbnRlcmZhY2UuU0VTU0lPTl9DT1VOVEVSX0NMT1NFX0NUWF9JTkRJQ0FUSU9OLFxyXG4gIC8vLyAgICB0aGUgc2VydmVyIGlzIGV4cGVjdGVkIHRvIHJldHVybiBDb25zdEludGVyZmFjZS5TRVNTSU9OX0NPVU5URVJfQ0xPU0VfQ1RYX0lORElDQVRJT04gaW4gcmVzcG9uc2UgKFJlcXVlc3RzU2VydmVyQmFzZTo6UHJvY2Vzc1JlcXVlc3QpLCB0byBhY2tub3dsZWRnZSB0aGUgcmVxdWVzdCB0byBjbG9zZSB0aGUgY29udGV4dC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm5ld1Nlc3Npb25Db3VudGVyXCI+ISEuPC9wYXJhbT5cclxuICBDaGVja0FuZFNldFNlc3Npb25Db3VudGVyKG5ld1Nlc3Npb25Db3VudGVyOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmIChuZXdTZXNzaW9uQ291bnRlciA9PT0gQ29uc3RJbnRlcmZhY2UuU0VTU0lPTl9DT1VOVEVSX0NMT1NFX0NUWF9JTkRJQ0FUSU9OKSB7XHJcbiAgICAgIERlYnVnLkFzc2VydCh0aGlzLkdldFNlc3Npb25Db3VudGVyKCkgPT09IENvbnN0SW50ZXJmYWNlLlNFU1NJT05fQ09VTlRFUl9DTE9TRV9DVFhfSU5ESUNBVElPTik7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgRGVidWcuQXNzZXJ0KG5ld1Nlc3Npb25Db3VudGVyID09PSB0aGlzLkdldFNlc3Npb25Db3VudGVyKCkgKyAxKTtcclxuICAgICAgdGhpcy5TZXRTZXNzaW9uQ291bnRlcihuZXdTZXNzaW9uQ291bnRlcik7XHJcbiAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZVNlcnZlclRvTG9nKE5TdHJpbmcuRm9ybWF0KFwiU2Vzc2lvbiBDb3VudGVyIC0tPiB7MH1cIiwgdGhpcy5fc2Vzc2lvbkNvdW50ZXIpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gWmVybyBzZXNzaW9uIGNvdW50ZXIgd2hlbiByZWluaXRpYWxpemluZyBzZXJ2ZXIgY29tbXVuaWNhdGlvbiBkZXRhaWxzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIENsZWFyU2Vzc2lvbkNvdW50ZXIoKTogdm9pZFxyXG4gIHtcclxuICAgIHRoaXMuX3Nlc3Npb25Db3VudGVyID0gMDtcclxuICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZVNlcnZlclRvTG9nKE5TdHJpbmcuRm9ybWF0KFwiU2Vzc2lvbiBDb3VudGVyIC0tPiB7MH1cIiwgdGhpcy5fc2Vzc2lvbkNvdW50ZXIpKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm5ld1Nlc3Npb25Db3VudGVyXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIFNldFNlc3Npb25Db3VudGVyKG5ld1Nlc3Npb25Db3VudGVyOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuX3Nlc3Npb25Db3VudGVyID0gbmV3U2Vzc2lvbkNvdW50ZXI7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IEdldExhc3RSZXF1ZXN0VGltZSgpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX2xhc3RSZXF1ZXN0VGltZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gUmVTdGFydFNlc3Npb25cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIFJlU3RhcnRTZXNzaW9uKCApOiBQcm9taXNlPHZvaWQ+IHtcclxuXHJcbiAgICBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5Jc1Nlc3Npb25SZUluaXRpYWxpemluZyA9IHRydWU7XHJcblxyXG4gICAgYXdhaXQgdGhpcy5TdG9yZVNlc3Npb25SZUluaXRpYWxpemluZ0RhdGFPbkxvY2FsU3RvcmFnZSgpO1xyXG4gICAgbGV0IG5hdmlnYXRlUm9vdFJvdXRlID0gZmFsc2U7XHJcbiAgICBpZiAoIVJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5SZW1vdmVkQ29udGV4dEZyb21TZXJ2ZXIpXHJcbiAgICAgIG5hdmlnYXRlUm9vdFJvdXRlID0gRW52aXJvbm1lbnQuSW5zdGFuY2UuZ2V0U3BlY2lhbFJvdXRlVG9Sb290UHJvZ09uQ29udGV4dFJlY3JlYXRpb24oKSA/IHRydWUgOiBmYWxzZTtcclxuICAgIENvbW1hbmRzLmFkZFJlZnJlc2hQYWdlKG5hdmlnYXRlUm9vdFJvdXRlLCBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5Jbml0aWFsVXJsKTtcclxuICAgIC8vc3RvcCB0aGUgZXhlY3V0aW9uIGJ5IHRocm93aW5nIGV4Y2VwdGlvbi5cclxuICAgIHRocm93IG5ldyBFeGNlcHRpb24oJycpO1xyXG5cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gU3RvcmVTZXNzaW9uUmVJbml0aWFsaXppbmdEYXRhT25Mb2NhbFN0b3JhZ2VcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIFN0b3JlU2Vzc2lvblJlSW5pdGlhbGl6aW5nRGF0YU9uTG9jYWxTdG9yYWdlICgpIDogUHJvbWlzZTx2b2lkPiB7XHJcblxyXG4gICAgbGV0IG1haW5QcmdWaWV3U3RyaW5nRm9yU2VydmVyID0gYXdhaXQgdGhpcy5CdWlsZFhNTEZvck1haW5Qcm9ncmFtRGF0YVZpZXcoKTtcclxuICAgIGxldCBnbG9iYWxQYXJhbXNTdHJpbmcgPSBBY2Nlc3NIZWxwZXIuZ2xvYmFsUGFyYW1zLm1pcnJvckFsbFRvWE1MKCk7XHJcblxyXG4gICAgLy8gc3RvcmUgbWFpblByZ1ZpZXdTdHJpbmdGb3JTZXJ2ZXIsIElzU2Vzc2lvblJlSW5pdGlhbGl6aW5nIGFuZCBnbG9iYWxQYXJhbXNTdHJpbmcgb24gbG9jYWxcclxuICAgIC8vIHN0b3JhZ2UgaW4gb3JkZXIgdG8gdXNlIGl0IGZvciBuZXh0IHNlc3Npb24uXHJcbiAgICBsZXQgZGF0YVN0b3JhZ2UgPSB3aW5kb3cubG9jYWxTdG9yYWdlO1xyXG4gICAgZGF0YVN0b3JhZ2Uuc2V0SXRlbShDb25zdEludGVyZmFjZS5JU19TRVNTSU9OX1JFSU5JVElBTElaSU5HLCBcInRydWVcIik7XHJcbiAgICBkYXRhU3RvcmFnZS5zZXRJdGVtKENvbnN0SW50ZXJmYWNlLk1BSU5fUFJPR19WSUVXLCBtYWluUHJnVmlld1N0cmluZ0ZvclNlcnZlci50b1N0cmluZygpKTtcclxuICAgIGRhdGFTdG9yYWdlLnNldEl0ZW0oQ29uc3RJbnRlcmZhY2UuR0xPQkFMX1BBUkFNX0xJU1QsIGdsb2JhbFBhcmFtc1N0cmluZyk7XHJcbiAgICBkYXRhU3RvcmFnZS5zZXRJdGVtKENvbnN0SW50ZXJmYWNlLkxBU1RfRVhDRVBUSU9OLCBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5sYXN0RXhjZXB0aW9uTWVzc2FnZSk7XHJcbiAgICBpZiAoUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLlJlbW92ZWRDb250ZXh0RnJvbVNlcnZlcilcclxuICAgICAgZGF0YVN0b3JhZ2Uuc2V0SXRlbShDb25zdEludGVyZmFjZS5DVFhfUkVNT1ZFRF9GUk9NX1NSVlIsIFwiMVwiKTtcclxuXHJcbiAgICBFdmVudHNNYW5hZ2VyLkluc3RhbmNlLnN0b3JlTGFzdFNhdmVkUm91dGVFdmVudE9uTG9jYWxTdG9yYWdlICgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBSZXN0b3JlU2Vzc2lvblJlSW5pdGlhbGl6aW5nRGF0YUZyb21Mb2NhbFN0b3JhZ2VcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIFJlc3RvcmVTZXNzaW9uUmVJbml0aWFsaXppbmdEYXRhRnJvbUxvY2FsU3RvcmFnZSAoa2V5OiBzdHJpbmcgKTpzdHJpbmcge1xyXG5cclxuICAgIGxldCBkYXRhU3RvcmFnZSA9IHdpbmRvdy5sb2NhbFN0b3JhZ2U7XHJcbiAgICBsZXQgdmFsID0gZGF0YVN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xyXG4gICAgcmV0dXJuIHZhbDtcclxuICB9XHJcblxyXG4gICAgLy8vIDxzdW1tYXJ5PlByZXBhcmUgYW5kIGV4ZWN1dGUgdGhlIDFzdCAmIDJuZCBoYW5kc2hha2UgcmVxdWVzdHM6XHJcbiAgLy8vIDFzdCByZXF1ZXN0OiAgVVRGOFRSQU5TPS4uJmFwcG5hbWU9Li4mcHJnbmFtZT0uLiZhcmd1bWVudHM9LUE8UmljaGNsaWVudD48UmVxdWVzdGluZ1ZlcnNpb25EZXRhaWxzPVwiLi5cIi8+PC9SaWNoY2xpZW50PlxyXG4gIC8vLyAgICAgcmVzcG9uc2U6IGluc3RydWN0aW9ucyB0byB0aGUgY2xpZW50IC0gd2hldGhlciB0byBkaXNwbGF5IGF1dGhlbnRpY2F0aW9uIGRpYWxvZywgdGhlIHNlcnZlcidzIHZlcnNpb24sIGFuZCBtb3JlIC4uXHJcbiAgLy8vICAgICAgICAgICAgICAgZS5nLiA8UmljaGNsaWVudHJlc3BvbnNlPjxDb250ZXh0SUQ+MTIwMzA4Nzg5NzI2MzcxMjAwPC9Db250ZXh0SUQ+PEVudmlyb25tZW50IElucHV0UGFzc3dvcmQ9XCJOXCIgU3lzdGVtTG9naW49XCJOXCIgU2NyYW1ibGVNZXNzYWdlcz1cIk5cIiBNYXhJbnRlcm5hbExvZ0xldmVsPVwiU2VydmVyI1wiIEh0dHBUaW1lb3V0PVwiMTBcIiBDbGllbnROZXR3b3JrUmVjb3ZlcnlJbnRlcnZhbD1cIjBcIiBGb3J3YXJkU2xhc2g9XCJ3ZWJcIi8+PC9SaWNoY2xpZW50cmVzcG9uc2U+XHJcbiAgLy8vIDJuZCByZXF1ZXN0OiBhdXRoZW50aWNhdGlvbiAob3B0aW9uYWwsIGRlcGVuZGluZyBvbiB0aGUgMXN0IHJlcXVlc3QpLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPnRydWUgb25seSBpZiB0aGUgY2xpZW50IHNob3VsZCBjb250aW51ZSB0byBzdGFydCB0aGUgYWN0dWFsIHByb2dyYW0gKGkuZS4gYWZ0ZXIgaGFuZHNoYWtlKS48L3JldHVybnM+XHJcbiAgYXN5bmMgU3RhcnRTZXNzaW9uKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IGF1dGhlbnRpY2F0aW9uQ2FuY2VsbGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgaGFuZHNoYWtlUmVzcG9uc2U6IEhhbmRzaGFrZVJlc3BvbnNlID0gbnVsbDtcclxuICAgIGxldCBkaWFsb2c6IEF1dGhlbnRpY2F0aW9uRGlhbG9nSGFuZGxlciA9IG51bGw7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgbGV0IGxhc3RUeXBlZFVzZXJJZDogc3RyaW5nID0gbnVsbDtcclxuXHJcbiAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgICAgLy8gMXN0IGhhbmRzaGFrZSByZXF1ZXN0OiBwcmVwYXJlIDFzdCBoYW5kc2hha2UgcmVxdWVzdCBhbmQgc2NyYW1ibGUgaXRcclxuICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgICBsZXQgaGFuZHNoYWtlSW5pdGlhbFRva2VuczogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7XHJcbiAgICAgIGhhbmRzaGFrZUluaXRpYWxUb2tlbnMuQXBwZW5kKENvbnN0SW50ZXJmYWNlLlVURjhUUkFOUyArXHJcbiAgICAgICAgQ29uc3RJbnRlcmZhY2UuUkVRX0FQUF9OQU1FICsgXCI9XCIgK1xyXG4gICAgICAgIEh0dHBVdGlsaXR5LlVybEVuY29kZShTZXJ2ZXJDb25maWcuSW5zdGFuY2UuZ2V0QXBwTmFtZSgpLCBFbmNvZGluZy5VVEY4KSk7XHJcblxyXG4gICAgICBoYW5kc2hha2VJbml0aWFsVG9rZW5zLkFwcGVuZChcIiZcIiArIENvbnN0SW50ZXJmYWNlLlJFUV9BUkdTICsgXCI9XCIgKyBDb25zdEludGVyZmFjZS5SRVFfQVJHX0FMUEhBICtcclxuICAgICAgXCI8UmljaGNsaWVudD48UmVxdWlyZXMgRW5jcnlwdGlvbktleT1cXFwiRmFsc2VcXFwiLz48UklBUHJvdG9jb2xWZXJzaW9uPVxcXCJcIiArIFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLldFQl9DT01NVU5JQ0FUSU9OX1BST1RPQ09MX1ZFUlNJT04gKyBcIlxcXCIvPjwvUmljaGNsaWVudD5cIik7XHJcblxyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhOU3RyaW5nLkZvcm1hdChcIkhhbmRzaGFrZSByZXF1ZXN0ICMxIChub3Qgc2NyYW1ibGVkKSA6IHswfVwiLFxyXG4gICAgICAgIHRoaXMuU2VydmVyVXJsICsgQ29uc3RJbnRlcmZhY2UuUkVRX0FSR19TVEFSVCArXHJcbiAgICAgICAgQ29uc3RJbnRlcmZhY2UuUkNfSU5ESUNBVElPTl9JTklUSUFMICsgaGFuZHNoYWtlSW5pdGlhbFRva2VucykpO1xyXG5cclxuICAgICAgbGV0IGhhbmRzaGFrZUluaXRpYWxVcmw6IHN0cmluZyA9IHRoaXMuU2VydmVyVXJsICsgQ29uc3RJbnRlcmZhY2UuUkVRX0FSR19TVEFSVCArXHJcbiAgICAgICAgQ29uc3RJbnRlcmZhY2UuUkNfSU5ESUNBVElPTl9JTklUSUFMICtcclxuICAgICAgICBDb25zdEludGVyZmFjZS5SQ19UT0tFTl9EQVRBICtcclxuICAgICAgICBIdHRwVXRpbGl0eS5VcmxFbmNvZGUoU2NyYW1ibGVyLlNjcmFtYmxlKGhhbmRzaGFrZUluaXRpYWxUb2tlbnMuVG9TdHJpbmcoKSksIEVuY29kaW5nLlVURjgpO1xyXG5cclxuICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlU2VydmVyTWVzc2FnZXNUb0xvZyhcIlwiKTtcclxuICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlU2VydmVyTWVzc2FnZXNUb0xvZyhOU3RyaW5nLkZvcm1hdChcIkhhbmRzaGFrZSByZXF1ZXN0ICMxOiB7MH1cIiwgaGFuZHNoYWtlSW5pdGlhbFVybCkpO1xyXG5cclxuICAgICAgLy8gSW5pdGlhbGl6ZSB0ZW1wIGN0eEdyb3VwIHdpdGggQ3R4R3JvdXAgZnJvbSBleGVjdXRpb24ucHJvcGVydGllc1xyXG4gICAgICBsZXQgY3R4R3JvdXA6IHN0cmluZyA9IFNlcnZlckNvbmZpZy5JbnN0YW5jZS5nZXRDdHhHcm91cCgpO1xyXG5cclxuICAgICAgd2hpbGUgKCFhdXRoZW50aWNhdGlvbkNhbmNlbGxlZCkge1xyXG4gICAgICAgIGxldCByZXF1ZXN0U3RhdHVzOiBSZWZQYXJhbTxSZXF1ZXN0U3RhdHVzPiA9IG5ldyBSZWZQYXJhbShSZXF1ZXN0U3RhdHVzLkhhbmRsZWQpO1xyXG4gICAgICAgIC8vIGV4ZWN1dGUgdGhlIDFzdCByZXF1ZXN0XHJcbiAgICAgICAgbGV0IHJlc3BvbnNlU3RyOiBzdHJpbmcgPSBhd2FpdCB0aGlzLkRpc3BhdGNoUmVxdWVzdChoYW5kc2hha2VJbml0aWFsVXJsLCBudWxsLCBDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2Vzc2lvblN0YWdlLkhBTkRTSEFLRSwgcmVxdWVzdFN0YXR1cyk7XHJcblxyXG4gICAgICAgIC8vIHByb2Nlc3MgdGhlIDFzdCByZXNwb25zZSAtIGNoZWNrIGlmIHRoZSByZXNwb25zZSBpcyBlcnJvciwgdW5zY3JhbWJsZSBhbmQgcGFyc2UgaXRcclxuICAgICAgICBpZiAoTlN0cmluZy5Jc051bGxPckVtcHR5KHJlc3BvbnNlU3RyKSkge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IFNlcnZlckVycm9yKFwiQ2xpZW50IGZhaWxlZCB0byBpbml0aWFsaXplIGEgc2Vzc2lvbi5cIiArIE9TRW52aXJvbm1lbnQuRW9sU2VxICtcclxuICAgICAgICAgICAgXCJFbXB0eSByZXNwb25zZSB3YXMgcmVjZWl2ZWQgZnJvbSB0aGUgd2ViIHNlcnZlci5cIiArIE9TRW52aXJvbm1lbnQuRW9sU2VxICsgT1NFbnZpcm9ubWVudC5Fb2xTZXEgKyB0aGlzLlNlcnZlclVybCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVTZXJ2ZXJNZXNzYWdlc1RvTG9nKE5TdHJpbmcuRm9ybWF0KFwiSGFuZHNoYWtlIHJlc3BvbnNlICMxOiB7MH1cIiwgcmVzcG9uc2VTdHIpKTtcclxuICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVTZXJ2ZXJNZXNzYWdlc1RvTG9nKFwiXCIpO1xyXG5cclxuICAgICAgICBoYW5kc2hha2VSZXNwb25zZSA9IG5ldyBIYW5kc2hha2VSZXNwb25zZShyZXNwb25zZVN0cik7XHJcblxyXG4gICAgICAgIFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5Db250ZXh0SUQgPSBoYW5kc2hha2VSZXNwb25zZS5Db250ZXh0SWQ7XHJcblxyXG4gICAgICAgIC8vIHNhdmUgc2Vzc2lvbiBpZCBvbiBjbGllbnQgd2hpY2ggaXMgcmVjZWl2ZWQgaW4gMXN0IHJlc3BvbnNlLlxyXG4gICAgICAgIHRoaXMuU2Vzc2lvbklkID0gaGFuZHNoYWtlUmVzcG9uc2UuR2V0U2Vzc2lvbklkO1xyXG5cclxuICAgICAgICBIdHRwTWFuYWdlci5HZXRJbnN0YW5jZSgpLkh0dHBDb21tdW5pY2F0aW9uVGltZW91dE1TID0gaGFuZHNoYWtlUmVzcG9uc2UuSHR0cFRpbWVvdXQgKiAxMDAwO1xyXG5cclxuICAgICAgICAvLyBEdXJpbmcgYXV0aGVudGljYXRpb24sIGlmIGF1dGhlbnRpY2F0aW9uIGZhaWxlZCB0aGVuIHNlcnZlciB1bmxvYWRzIGN0eCBhbmQgY3JlYXRlcyBuZXcgY3R4IGZvciBuZXh0IGF1dGhlbnRpY2F0aW9uIHJlcXVlc3QuXHJcbiAgICAgICAgLy8gU28gZXZlcnkgdGltZSBhZnRlciBhdXRoZW50aWNhdGlvbiBmYWlscyB3ZSByZWNlaXZlIG5ldyBjdHhpZCBmb3IgbmV4dCBhdXRoZW50aWNhdGlvbiByZXF1ZXN0LlxyXG4gICAgICAgIC8vIEhlbmNlIHRha2UgY3R4Z3JvdXAgaW4gbG9jYWwgdmFyaWFibGUgYW5kIHVwZGF0ZSBDbGllbnRNYW5hZ2VyIG9ubHkgYWZ0ZXIgYXV0aGVudGljYXRpb24gaXMgZG9uZS5cclxuICAgICAgICBpZiAoTlN0cmluZy5Jc051bGxPckVtcHR5KFNlcnZlckNvbmZpZy5JbnN0YW5jZS5nZXRDdHhHcm91cCgpKSkge1xyXG4gICAgICAgICAgY3R4R3JvdXAgPSBoYW5kc2hha2VSZXNwb25zZS5Db250ZXh0SWQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgICAgIC8vIDJuZCBoYW5kc2hha2UgcmVxdWVzdFxyXG4gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICAgICAgbGV0IGNyZWRlbnRpYWxzOiBVc2VybmFtZVBhc3N3b3JkQ3JlZGVudGlhbHMgPSBudWxsO1xyXG4gICAgICAgIGlmIChTZXJ2ZXJDb25maWcuSW5zdGFuY2UuZ2V0U2tpcEF1dGhlbnRpY2F0aW9uRGlhbG9nKCkpIHtcclxuICAgICAgICAgIC8vIHNraXAgYXV0aGVudGljYXRpb24gKHRvIHRoZSBydW50aW1lLWVuZ2luZSkgZGlhbG9nXHJcbiAgICAgICAgICBpZiAoU2VydmVyQ29uZmlnLkluc3RhbmNlLmdldFVzZXJuYW1lKCkgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgLy8gdXNlciB0aGUgdXNlcklkICYgcGFzc3dvcmQgdGhhdCB3ZXJlIHBhc3NlZCwgYW5kIHJlc2V0IHRoZW0gKHRoZXknbGwgYmUgc2V0IGJlbG93LCBpZiBhdXRoZW50aWNhdGVkIGJ5IHRoZSBydW50aW1lLWVuZ2luZSlcclxuICAgICAgICAgICAgY3JlZGVudGlhbHMgPSBuZXcgVXNlcm5hbWVQYXNzd29yZENyZWRlbnRpYWxzKFNlcnZlckNvbmZpZy5JbnN0YW5jZS5nZXRVc2VybmFtZSgpLCBTZXJ2ZXJDb25maWcuSW5zdGFuY2UuZ2V0UGFzc3dvcmQoKSk7XHJcbiAgICAgICAgICAgIFNlcnZlckNvbmZpZy5JbnN0YW5jZS5zZXRVc2VybmFtZShcIlwiKTtcclxuICAgICAgICAgICAgU2VydmVyQ29uZmlnLkluc3RhbmNlLnNldFBhc3N3b3JkKFwiXCIpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChoYW5kc2hha2VSZXNwb25zZS5JbnB1dFBhc3N3b3JkICYmIGhhbmRzaGFrZVJlc3BvbnNlLlN5c3RlbUxvZ2luICE9PSBIYW5kc2hha2VSZXNwb25zZS5TWVNURU1fTE9HSU5fQUQpIHtcclxuICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uICh0byB0aGUgcnVudGltZS1lbmdpbmUpIGRpYWxvZ1xyXG4gICAgICAgICAgaWYgKGxhc3RUeXBlZFVzZXJJZCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBsZXQgdGl0bGU6IHN0cmluZyA9IEFjY2Vzc0hlbHBlci5sYW5ndWFnZURhdGEuZ2V0Q29uc3RNZXNzYWdlKE1zZ0ludGVyZmFjZS5CUktUQUJfU1RSX0VSUk9SKTtcclxuICAgICAgICAgICAgbGV0IGVycm9yOiBzdHJpbmcgPSBBY2Nlc3NIZWxwZXIubGFuZ3VhZ2VEYXRhLmdldENvbnN0TWVzc2FnZShNc2dJbnRlcmZhY2UuVVNSSU5QX1NUUl9CQURQQVNTVyk7XHJcbiAgICAgICAgICAgIGF3YWl0IEdVSU1hbmFnZXIuSW5zdGFuY2UuTWVzc2FnZUJveCh0aXRsZSwgZXJyb3IsIFN0eWxlcy5NU0dCT1hfSUNPTl9FUlJPUiB8IFN0eWxlcy5NU0dCT1hfQlVUVE9OX09LKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgYXV0aGVudGljYXRpb24gZGlhbG9nXHJcbiAgICAgICAgICAvLyBsZXQgdXNlcklkOiBzdHJpbmcgPSBsYXN0VHlwZWRVc2VySWQ7XHJcbiAgICAgICAgICAvL1xyXG4gICAgICAgICAgLy8gaWYgKGRpYWxvZyA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgLy8gICBkaWFsb2cgPSBuZXcgQXV0aGVudGljYXRpb25EaWFsb2dIYW5kbGVyKHVzZXJJZCwgR2V0TG9nb25EaWFsb2dFeGVjUHJvcHMoKSk7XHJcbiAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAvLyBkaWFsb2cub3BlbkRpYWxvZygpO1xyXG5cclxuICAgICAgICAgIC8vIGNyZWRlbnRpYWxzID0gZGlhbG9nLmdldENyZWRlbnRpYWxzKCk7XHJcbiAgICAgICAgICAvLyBpZiAoY3JlZGVudGlhbHMgIT09IG51bGwpXHJcbiAgICAgICAgICAvLyAgIGxhc3RUeXBlZFVzZXJJZCA9IGNyZWRlbnRpYWxzLlVzZXJuYW1lO1xyXG4gICAgICAgICAgLy8gZWxzZVxyXG4gICAgICAgICAgLy8gICBhdXRoZW50aWNhdGlvbkNhbmNlbGxlZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBDb25zdEludGVyZmFjZS5TRVNTSU9OX0NPVU5URVJfQ0xPU0VfQ1RYX0lORElDQVRJT04gaW5zdHJ1Y3RzIHRoZSBzZXJ2ZXIgdG8gY2xvc2UgdGhlIGNvbnRleHQuXHJcbiAgICAgICAgLy8gKG5vdGU6IHVubG9hZGluZyBhIGNvbnRleHQgcG9zdCBoYW5kc2hha2Ugc2hvdWxkIGJlIGRvbmUgdXNpbmcgQ29tbWFuZC5jcmVhdGVVbmxvYWRDb21tYW5kKS5cclxuICAgICAgICBpZiAoYXV0aGVudGljYXRpb25DYW5jZWxsZWQpIHtcclxuICAgICAgICAgIHRoaXMuU2V0U2Vzc2lvbkNvdW50ZXIoQ29uc3RJbnRlcmZhY2UuU0VTU0lPTl9DT1VOVEVSX0NMT1NFX0NUWF9JTkRJQ0FUSU9OKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBoYW5kc2hha2VBdXRoVXJsOiBzdHJpbmcgPSB0aGlzLlByZXBhcmVBdXRoZW50aWNhdGlvblVybChoYW5kc2hha2VSZXNwb25zZS5Db250ZXh0SWQsIGN0eEdyb3VwLCB0aGlzLkdldFNlc3Npb25Db3VudGVyKCkpO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgaWYgKGNyZWRlbnRpYWxzICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGxldCBjcmVkZW50aWFsc1N0cjogc3RyaW5nID0gY3JlZGVudGlhbHMuVXNlcm5hbWUgKyBcIjpcIjtcclxuICAgICAgICAgICAgaWYgKCFOU3RyaW5nLklzTnVsbE9yRW1wdHkoY3JlZGVudGlhbHMuUGFzc3dvcmQpKSB7XHJcbiAgICAgICAgICAgICAgY3JlZGVudGlhbHNTdHIgPSBjcmVkZW50aWFsc1N0ciArIGNyZWRlbnRpYWxzLlBhc3N3b3JkICsgXCI6XCI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY3JlZGVudGlhbHNTdHIgKz0gaGFuZHNoYWtlUmVzcG9uc2UuQ29udGV4dElkO1xyXG4gICAgICAgICAgICBjcmVkZW50aWFsc1N0ciA9IFNjcmFtYmxlci5TY3JhbWJsZShjcmVkZW50aWFsc1N0cik7XHJcbiAgICAgICAgICAgIGNyZWRlbnRpYWxzU3RyID0gQmFzZTY0LmVuY29kZShjcmVkZW50aWFsc1N0ciwgdHJ1ZSwgRW5jb2RpbmcuVVRGOCk7XHJcbiAgICAgICAgICAgIGhhbmRzaGFrZUF1dGhVcmwgKz0gKFwiJlVTRVJOQU1FPVwiICsgSHR0cFV0aWxpdHkuVXJsRW5jb2RlKGNyZWRlbnRpYWxzU3RyLCBFbmNvZGluZy5VVEY4KSk7XHJcblxyXG4gICAgICAgICAgICAvLyBzZW5kIDJuZCBoYW5kc2hha2UgcmVxdWVzdCAtIHdpdGggYXV0aGVudGljYXRpb25cclxuICAgICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlU2VydmVyTWVzc2FnZXNUb0xvZyhOU3RyaW5nLkZvcm1hdChcIkhhbmRzaGFrZSByZXF1ZXN0ICMyOiB7MH1cIiwgaGFuZHNoYWtlQXV0aFVybCkpO1xyXG4gICAgICAgICAgICBsZXQgc3RhdHVzUmVxdWVzdDogUmVmUGFyYW08UmVxdWVzdFN0YXR1cz4gPSBuZXcgUmVmUGFyYW0oUmVxdWVzdFN0YXR1cy5IYW5kbGVkKTtcclxuICAgICAgICAgICAgcmVzcG9uc2VTdHIgPSBhd2FpdCB0aGlzLkRpc3BhdGNoUmVxdWVzdChoYW5kc2hha2VBdXRoVXJsLCBudWxsLCBDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2Vzc2lvblN0YWdlLkhBTkRTSEFLRSwgc3RhdHVzUmVxdWVzdCk7XHJcblxyXG4gICAgICAgICAgICAvLyB2ZXJpZnkgdGhhdCB0aGUgcmVzcG9uc2Ugd2Fzbid0IHJlcGxheWVkXHJcbiAgICAgICAgICAgIGlmIChyZXNwb25zZVN0ci5pbmRleE9mKGhhbmRzaGFrZVJlc3BvbnNlLkNvbnRleHRJZCkgPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZlckVycm9yKEFjY2Vzc0hlbHBlci5sYW5ndWFnZURhdGEuZ2V0Q29uc3RNZXNzYWdlKE1zZ0ludGVyZmFjZS5VU1JJTlBfU1RSX0JBRFBBU1NXKSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIFNlcnZlckNvbmZpZy5JbnN0YW5jZS5zZXRVc2VybmFtZShjcmVkZW50aWFscy5Vc2VybmFtZSk7XHJcbiAgICAgICAgICAgIFNlcnZlckNvbmZpZy5JbnN0YW5jZS5zZXRQYXNzd29yZChjcmVkZW50aWFscy5QYXNzd29yZCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IHJlcXVlc3RTdGF0dXM6IFJlZlBhcmFtPFJlcXVlc3RTdGF0dXM+ID0gbmV3IFJlZlBhcmFtKFJlcXVlc3RTdGF0dXMuSGFuZGxlZCk7XHJcbiAgICAgICAgICAgIC8vIHNlbmQgMm5kIGhhbmRzaGFrZSByZXF1ZXN0IC0gd2l0aG91dCBhdXRoZW50aWNhdGlvblxyXG4gICAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVTZXJ2ZXJNZXNzYWdlc1RvTG9nKE5TdHJpbmcuRm9ybWF0KFwiSGFuZHNoYWtlIHJlcXVlc3QgIzI6IHswfVwiLCBoYW5kc2hha2VBdXRoVXJsKSk7XHJcbiAgICAgICAgICAgIHJlc3BvbnNlU3RyID0gYXdhaXQgdGhpcy5EaXNwYXRjaFJlcXVlc3QoaGFuZHNoYWtlQXV0aFVybCwgbnVsbCwgQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1Nlc3Npb25TdGFnZS5IQU5EU0hBS0UsIHJlcXVlc3RTdGF0dXMpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlU2VydmVyTWVzc2FnZXNUb0xvZyhOU3RyaW5nLkZvcm1hdChcIkhhbmRzaGFrZSByZXNwb25zZSAjMjogezB9XCIsIHJlc3BvbnNlU3RyKSk7XHJcbiAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVTZXJ2ZXJNZXNzYWdlc1RvTG9nKFwiXCIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChleCkge1xyXG4gICAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgU2VydmVyRXJyb3IpIHtcclxuICAgICAgICAgICAgbGV0IHNlcnZlckVycm9yOiBTZXJ2ZXJFcnJvciA9IDxTZXJ2ZXJFcnJvcj5leDtcclxuICAgICAgICAgICAgaWYgKFNlcnZlckNvbmZpZy5JbnN0YW5jZS5nZXRTa2lwQXV0aGVudGljYXRpb25EaWFsb2coKSkge1xyXG4gICAgICAgICAgICAgIHN3aXRjaCAoc2VydmVyRXJyb3IuR2V0Q29kZSgpKVxyXG4gICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgU2VydmVyRXJyb3IuRVJSX0FDQ0VTU19ERU5JRUQ6XHJcbiAgICAgICAgICAgICAgICAvLyBFeHRlcm5hbCBBdXRoZW50aWNhdG9yIGF1dGhlbnRpY2F0ZWQgdGhlIHVzZXIsIGFjY2VzcyB0byB0aGUgYXBwbGljYXRpb24gd2Fzbid0IGF1dGhvcml6ZWQuXHJcbiAgICAgICAgICAgICAgICBjYXNlIFNlcnZlckVycm9yLkVSUl9BVVRIRU5USUNBVElPTjpcclxuICAgICAgICAgICAgICAgICAgLy8gRXh0ZXJuYWwgQXV0aGVudGljYXRvciBhdXRoZW50aWNhdGVkIHRoZSB1c2VyIGJ1dCBhcHBsaWNhdGlvbiBhdXRoZW50aWNhdGlvbiBmYWlsZWRcclxuICAgICAgICAgICAgICAgICAgU2VydmVyQ29uZmlnLkluc3RhbmNlLnNldFNraXBBdXRoZW50aWNhdGlvbkRpYWxvZyhmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgIHRocm93IHNlcnZlckVycm9yO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gdGhlIHNlc3Npb24gd2lsbCBuZXZlciBwcm92aWRlIGEgd2F5IHRvIGNoYW5nZSB0aGUgY3JlZGVudGlhbHMsIHRoZXJlZm9yZSBhYm9ydFxyXG4gICAgICAgICAgICBpZiAoIWhhbmRzaGFrZVJlc3BvbnNlLklucHV0UGFzc3dvcmQpXHJcbiAgICAgICAgICAgICAgdGhyb3cgc2VydmVyRXJyb3I7XHJcblxyXG4gICAgICAgICAgICAvLyBFcnJvci5JTkZfTk9fUkVTVUxUOlxyXG4gICAgICAgICAgICAvLyAgICBpZiBhdXRoZW50aWNhdGlvbiBkaWFsb2cgd2FzIGNhbmNlbGVkLCB0aGUgcmVxdWVzdCB3YXMgc2VudCBvbmx5IHRvIGNsb3NlIHRoZSBjb250ZXh0LFxyXG4gICAgICAgICAgICAvLyAgICBhbmQgdGhlIHNlcnZlciBpc24ndCBleHBlY3RlZCB0byByZXR1cm4gYSByZXNwb25zZVxyXG4gICAgICAgICAgICBpZiAoc2VydmVyRXJyb3IuR2V0Q29kZSgpICE9PSBTZXJ2ZXJFcnJvci5FUlJfQVVUSEVOVElDQVRJT04gJiZcclxuICAgICAgICAgICAgICAgICghYXV0aGVudGljYXRpb25DYW5jZWxsZWQgfHwgc2VydmVyRXJyb3IuR2V0Q29kZSgpICE9PSBTZXJ2ZXJFcnJvci5JTkZfTk9fUkVTVUxUKSkge1xyXG4gICAgICAgICAgICAgIHRocm93IHNlcnZlckVycm9yO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRocm93IGV4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gc3RvcmUgYW4gaW5kaWNhdGlvbiB0byBza2lwIGZ1dHVyZSBhdXRoZW50aWNhdGlvbiAoc2Vzc2lvbiByZXN0YXJ0LCBwYXJhbGxlbCBwcm9ncmFtKVxyXG4gICAgICBTZXJ2ZXJDb25maWcuSW5zdGFuY2Uuc2V0U2tpcEF1dGhlbnRpY2F0aW9uRGlhbG9nKHRydWUpO1xyXG5cclxuICAgICAgLy8gc2F2ZSBjb250ZXh0IGdyb3VwXHJcbiAgICAgIFNlcnZlckNvbmZpZy5JbnN0YW5jZS5zZXRDdHhHcm91cChjdHhHcm91cCk7XHJcblxyXG4gICAgICBpZiAoZGlhbG9nICE9PSBudWxsKVxyXG4gICAgICAgIGRpYWxvZy5jbG9zZURpYWxvZygpO1xyXG5cclxuICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICAgIC8vIHNldCBzZXNzaW9uIHByb3BlcnRpZXNcclxuICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICAgIFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLlNob3VsZFNjcmFtYmxlQW5kVW5zY3JhbWJsZU1lc3NhZ2VzID0gaGFuZHNoYWtlUmVzcG9uc2UuU2NyYW1ibGVNZXNzYWdlcztcclxuICAgICAgaWYgKExvZ2dlci5JbnN0YW5jZS5Mb2dMZXZlbCAhPT0gTG9nZ2VyX0xvZ0xldmVscy5CYXNpYykge1xyXG4gICAgICAgIC8vIG1heGltYWwgdmFsdWUgb2YgdGhlIEludGVybmFsTG9nTGV2ZWwgdGhhdCBjYW4gYmUgc2V0IGJ5IHRoZSBjbGllbnQuXHJcbiAgICAgICAgLy8gaWYgc2V0LCBpdCBjb250cm9scyB0aGUgbWF4aW1hbCB2YWx1ZTsgb3RoZXJ3aXNlLCBhbnkgbG9nIGxldmVsIGlzIGFsbG93ZWQuXHJcbiAgICAgICAgbGV0IG1heEludGVybmFsTG9nTGV2ZWw6IHN0cmluZyA9IGhhbmRzaGFrZVJlc3BvbnNlLk1heEludGVybmFsTG9nTGV2ZWw7XHJcbiAgICAgICAgaWYgKG1heEludGVybmFsTG9nTGV2ZWwgIT09IG51bGwpIHtcclxuICAgICAgICAgIGxldCBtYXhMb2dMZXZlbDogTG9nZ2VyX0xvZ0xldmVscyA9IHRoaXMucGFyc2VMb2dMZXZlbChtYXhJbnRlcm5hbExvZ0xldmVsKTtcclxuICAgICAgICAgIGlmIChtYXhMb2dMZXZlbCA8IExvZ2dlci5JbnN0YW5jZS5Mb2dMZXZlbCkge1xyXG4gICAgICAgICAgICAvLyB0ZXh0dWFsIHZhbHVlIChhcyBsb2FkZWQgZnJvbSB0aGUgZXhlY3V0aW9uIHByb3BlcnRpZXMpXHJcbiAgICAgICAgICAgIFNlcnZlckNvbmZpZy5JbnN0YW5jZS5zZXRJbnRlcm5hbExvZ0xldmVsKG1heEludGVybmFsTG9nTGV2ZWwpO1xyXG5cclxuICAgICAgICAgICAgLy8gc2V0IHRoZSBhY3R1YWwgbG9nIGxldmVsIHRvIHRoZSBsZXZlbCBhbGxvd2VkIGJ5IHRoZSBzZXJ2ZXJcclxuICAgICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlVG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJJbnRlcm5hbCBsb2cgbGV2ZWwgd2FzIHJlc3RyaWN0ZWQgdG8gJ3swfScgYnkgdGhlIE1hZ2ljIHhwYSBzZXJ2ZXIuXCIsIG1heEludGVybmFsTG9nTGV2ZWwpLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Mb2dMZXZlbCA9IG1heExvZ0xldmVsO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgICAvLyAzcmQgcmVxdWVzdDogRXhlY3V0ZXMgdGhlIGluaXRpYWwgcHJvZ3JhbSBpbiB0aGUgc2VydmVyLlxyXG4gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICAgIGlmICghYXV0aGVudGljYXRpb25DYW5jZWxsZWQpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLkV4ZWN1dGVJbml0aWFsUmVxdWVzdCgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXgpIHtcclxuICAgICAgaWYgKGV4IGluc3RhbmNlb2YgU2VydmVyRXJyb3IpXHJcbiAgICAgICAgdGhyb3cgZXg7XHJcblxyXG4gICAgICBpZiAoaXNOdWxsT3JVbmRlZmluZWQoZXguSW5uZXJFeGNlcHRpb24pKVxyXG4gICAgICAgIHRocm93ICBuZXcgU2VydmVyRXJyb3IoZXgubWVzc2FnZSwgbmV3IEV4Y2VwdGlvbihleCkpO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdGhyb3cgbmV3IFNlcnZlckVycm9yKGV4Lm1lc3NhZ2UsIGV4LklubmVyRXhjZXB0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gIWF1dGhlbnRpY2F0aW9uQ2FuY2VsbGVkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBwcmVwYXJlcyBoYW5kc2hha2UgcmVxdWVzdCB1cmwgZm9yIGF1dGhlbnRpY2F0aW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjb250ZXh0SWRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN0eEdyb3VwXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzZXNzaW9uQ291bnRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBQcmVwYXJlQXV0aGVudGljYXRpb25VcmwoY29udGV4dElkOiBzdHJpbmcsIGN0eEdyb3VwOiBzdHJpbmcsIHNlc3Npb25Db3VudDogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIGxldCBoYW5kc2hha2VBdXRoVXJsOiBzdHJpbmcgPSB0aGlzLlNlcnZlclVybCArIENvbnN0SW50ZXJmYWNlLlJFUV9BUkdfU1RBUlQgK1xyXG4gICAgICBDb25zdEludGVyZmFjZS5SQ19JTkRJQ0FUSU9OICsgQ29uc3RJbnRlcmZhY2UuVVRGOFRSQU5TICtcclxuICAgICAgQ29uc3RJbnRlcmZhY2UuUkNfVE9LRU5fQ1RYX0lEICsgY29udGV4dElkO1xyXG5cclxuICAgIGlmICghaXNOdWxsT3JVbmRlZmluZWQodGhpcy5TZXNzaW9uSWQpKVxyXG4gICAgICBoYW5kc2hha2VBdXRoVXJsICs9IChDb25zdEludGVyZmFjZS5SRVFfQVJHX1NFUEFSQVRPUiArICBDb25zdEludGVyZmFjZS5SQ19UT0tFTl9TRVNTSU9OX0lEICsgdGhpcy5TZXNzaW9uSWQpO1xyXG5cclxuICAgIGhhbmRzaGFrZUF1dGhVcmwgKz0gKENvbnN0SW50ZXJmYWNlLlJFUV9BUkdfU0VQQVJBVE9SICtcclxuICAgICAgICBDb25zdEludGVyZmFjZS5SQ19UT0tFTl9TRVNTSU9OX0NPVU5UICsgc2Vzc2lvbkNvdW50ICtcclxuICAgICAgICBDb25zdEludGVyZmFjZS5SRVFfQVJHX1NFUEFSQVRPUiArXHJcbiAgICAgICAgQ29uc3RJbnRlcmZhY2UuUkNfVE9LRU5fQ1RYX0dST1VQICsgY3R4R3JvdXAgK1xyXG4gICAgICAgIENvbnN0SW50ZXJmYWNlLlJFUV9BUkdfU0VQQVJBVE9SICtcclxuICAgICAgICBDb25zdEludGVyZmFjZS5SQ19BVVRIRU5USUNBVElPTl9SRVFVRVNUKTtcclxuXHJcbiAgICByZXR1cm4gaGFuZHNoYWtlQXV0aFVybDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gRXhlY3V0ZXMgdGhlIGluaXRpYWwgcHJvZ3JhbSBpbiB0aGUgc2VydmVyOlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBhc3luYyBFeGVjdXRlSW5pdGlhbFJlcXVlc3QoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAvLyBzZW5kIHRoZSBJTklUSUFMIHJlcXVlc3QgdG8gdGhlIHNlcnZlci5cclxuICAgIGF3YWl0IHRoaXMuRXhlY3V0ZV8xKENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZW5kaW5nSW5zdHJ1Y3Rpb24uVEFTS1NfQU5EX0NPTU1BTkRTLCBDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2Vzc2lvblN0YWdlLklOSVRJQUwsIG51bGwpO1xyXG4gIH1cclxuXHJcbiAgLy8gcHJpdmF0ZSBzdGF0aWMgR2V0TG9nb25EaWFsb2dFeGVjUHJvcHMoKTogRGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4ge1xyXG4gIC8vICAgbGV0IGRpY3Rpb25hcnk6IERpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+ID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+KCk7XHJcbiAgLy8gICBsZXQgdmFsdWU6IHN0cmluZyA9IENsaWVudE1hbmFnZXIuSW5zdGFuY2UuZ2V0TG9nb25XaW5kb3dUaXRsZSgpO1xyXG4gIC8vICAgbGV0IGZsYWc6IGJvb2xlYW4gPSBOU3RyaW5nLklzTnVsbE9yRW1wdHkodmFsdWUpO1xyXG4gIC8vICAgaWYgKGZsYWcpIHtcclxuICAvLyAgICAgdmFsdWUgPSBcIkxvZ29uIC0gXCIgKyBDbGllbnRNYW5hZ2VyLkluc3RhbmNlLmdldEFwcE5hbWUoKTtcclxuICAvLyAgIH1cclxuICAvLyAgIGRpY3Rpb25hcnkuQWRkKFwiTG9nb25XaW5kb3dUaXRsZVwiLCB2YWx1ZSk7XHJcbiAgLy8gICBsZXQgdGV4dDogc3RyaW5nID0gQ2xpZW50TWFuYWdlci5JbnN0YW5jZS5nZXRMb2dvbkdyb3VwVGl0bGUoKTtcclxuICAvLyAgIGxldCBmbGFnMjogYm9vbGVhbiA9ICFOU3RyaW5nLklzTnVsbE9yRW1wdHkodGV4dCk7XHJcbiAgLy8gICBpZiAoZmxhZzIpIHtcclxuICAvLyAgICAgdGV4dCA9ICgodGV4dC5sZW5ndGggPiA2MikgPyBOU3RyaW5nLlN1YnN0cmluZyh0ZXh0LCAwLCA2MikgOiB0ZXh0KTtcclxuICAvLyAgIH1cclxuICAvLyAgIGVsc2Uge1xyXG4gIC8vICAgICB0ZXh0ID0gXCJMb2dvbiBQYXJhbWV0ZXJzXCI7XHJcbiAgLy8gICB9XHJcbiAgLy8gICBkaWN0aW9uYXJ5LkFkZChcIkxvZ29uR3JvdXBUaXRsZVwiLCB0ZXh0KTtcclxuICAvLyAgIGxldCB0ZXh0Mjogc3RyaW5nID0gQ2xpZW50TWFuYWdlci5JbnN0YW5jZS5nZXRMb2dvbk1zZ0NhcHRpb24oKTtcclxuICAvLyAgIGxldCBmbGFnMzogYm9vbGVhbiA9ICFOU3RyaW5nLklzTnVsbE9yRW1wdHkodGV4dDIpO1xyXG4gIC8vICAgaWYgKGZsYWczKSB7XHJcbiAgLy8gICAgIHRleHQyID0gKCh0ZXh0Mi5sZW5ndGggPiA1NikgPyBOU3RyaW5nLlN1YnN0cmluZyh0ZXh0MiwgMCwgNTYpIDogdGV4dDIpO1xyXG4gIC8vICAgICBkaWN0aW9uYXJ5LkFkZChcIkxvZ29uTWVzc2FnZUNhcHRpb25cIiwgdGV4dDIpO1xyXG4gIC8vICAgfVxyXG4gIC8vICAgbGV0IGxvZ29uV2luZG93SWNvblVSTDogVXJpID0gQ2xpZW50TWFuYWdlci5JbnN0YW5jZS5nZXRMb2dvbldpbmRvd0ljb25VUkwoKTtcclxuICAvLyAgIGxldCBmbGFnNDogYm9vbGVhbiA9IFVyaS5vcF9JbmVxdWFsaXR5KGxvZ29uV2luZG93SWNvblVSTCwgbnVsbCkgJiYgIU5TdHJpbmcuSXNOdWxsT3JFbXB0eShsb2dvbldpbmRvd0ljb25VUkwuVG9TdHJpbmcoKSk7XHJcbiAgLy8gICBpZiAoZmxhZzQpIHtcclxuICAvLyAgICAgZGljdGlvbmFyeS5BZGQoXCJMb2dvbldpbmRvd0ljb25VUkxcIiwgbG9nb25XaW5kb3dJY29uVVJMLlRvU3RyaW5nKCkpO1xyXG4gIC8vICAgfVxyXG4gIC8vICAgbGV0IGxvZ29uV2luZG93SW1hZ2VVUkw6IFVyaSA9IENsaWVudE1hbmFnZXIuSW5zdGFuY2UuZ2V0TG9nb25XaW5kb3dJbWFnZVVSTCgpO1xyXG4gIC8vICAgbGV0IGZsYWc1OiBib29sZWFuID0gVXJpLm9wX0luZXF1YWxpdHkobG9nb25XaW5kb3dJbWFnZVVSTCwgbnVsbCkgJiYgIU5TdHJpbmcuSXNOdWxsT3JFbXB0eShsb2dvbldpbmRvd0ltYWdlVVJMLlRvU3RyaW5nKCkpO1xyXG4gIC8vICAgaWYgKGZsYWc1KSB7XHJcbiAgLy8gICAgIGRpY3Rpb25hcnkuQWRkKFwiTG9nb25JbWFnZVVSTFwiLCBsb2dvbldpbmRvd0ltYWdlVVJMLlRvU3RyaW5nKCkpO1xyXG4gIC8vICAgfVxyXG4gIC8vICAgbGV0IHRleHQzOiBzdHJpbmcgPSBDbGllbnRNYW5hZ2VyLkluc3RhbmNlLmdldExvZ29uVXNlcklkQ2FwdGlvbigpO1xyXG4gIC8vICAgbGV0IGZsYWc2OiBib29sZWFuID0gIU5TdHJpbmcuSXNOdWxsT3JFbXB0eSh0ZXh0Myk7XHJcbiAgLy8gICBpZiAoZmxhZzYpIHtcclxuICAvLyAgICAgdGV4dDMgPSAoKHRleHQzLmxlbmd0aCA+IDkpID8gTlN0cmluZy5TdWJzdHJpbmcodGV4dDMsIDAsIDkpIDogdGV4dDMpO1xyXG4gIC8vICAgICBkaWN0aW9uYXJ5LkFkZChcIkxvZ29uVXNlcklEQ2FwdGlvblwiLCB0ZXh0Myk7XHJcbiAgLy8gICB9XHJcbiAgLy8gICBsZXQgdGV4dDQ6IHN0cmluZyA9IENsaWVudE1hbmFnZXIuSW5zdGFuY2UuZ2V0TG9nb25QYXNzd29yZENhcHRpb24oKTtcclxuICAvLyAgIGxldCBmbGFnNzogYm9vbGVhbiA9ICFOU3RyaW5nLklzTnVsbE9yRW1wdHkodGV4dDQpO1xyXG4gIC8vICAgaWYgKGZsYWc3KSB7XHJcbiAgLy8gICAgIHRleHQ0ID0gKCh0ZXh0NC5sZW5ndGggPiA5KSA/IE5TdHJpbmcuU3Vic3RyaW5nKHRleHQ0LCAwLCA5KSA6IHRleHQ0KTtcclxuICAvLyAgICAgZGljdGlvbmFyeS5BZGQoXCJMb2dvblBhc3N3b3JkQ2FwdGlvblwiLCB0ZXh0NCk7XHJcbiAgLy8gICB9XHJcbiAgLy8gICBsZXQgbG9nb25PS0NhcHRpb246IHN0cmluZyA9IENsaWVudE1hbmFnZXIuSW5zdGFuY2UuZ2V0TG9nb25PS0NhcHRpb24oKTtcclxuICAvLyAgIGxldCBmbGFnODogYm9vbGVhbiA9ICFOU3RyaW5nLklzTnVsbE9yRW1wdHkobG9nb25PS0NhcHRpb24pO1xyXG4gIC8vICAgaWYgKGZsYWc4KSB7XHJcbiAgLy8gICAgIGRpY3Rpb25hcnkuQWRkKFwiTG9nb25PS0NhcHRpb25cIiwgbG9nb25PS0NhcHRpb24pO1xyXG4gIC8vICAgfVxyXG4gIC8vICAgbGV0IGxvZ29uQ2FuY2VsQ2FwdGlvbjogc3RyaW5nID0gQ2xpZW50TWFuYWdlci5JbnN0YW5jZS5nZXRMb2dvbkNhbmNlbENhcHRpb24oKTtcclxuICAvLyAgIGxldCBmbGFnOTogYm9vbGVhbiA9ICFOU3RyaW5nLklzTnVsbE9yRW1wdHkobG9nb25DYW5jZWxDYXB0aW9uKTtcclxuICAvLyAgIGlmIChmbGFnOSkge1xyXG4gIC8vICAgICBkaWN0aW9uYXJ5LkFkZChcIkxvZ29uQ2FuY2VsQ2FwdGlvblwiLCBsb2dvbkNhbmNlbENhcHRpb24pO1xyXG4gIC8vICAgfVxyXG4gIC8vICAgcmV0dXJuIGRpY3Rpb25hcnk7XHJcbiAgLy8gfVxyXG5cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gUmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgcnVudGltZSB0YXNrIHRyZWUgc3RydWN0dXJlIGJ5IGdvaW5nIHVwIGZyb20gdGhlIGN1cnJlbnQgdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBHZXRUYXNrVHJlZSh0YXNrOiBUYXNrKTogTGlzdDxzdHJpbmc+IHtcclxuICAgIGxldCB0YXNrVHJlZTogTGlzdDxzdHJpbmc+ID0gbmV3IExpc3Q8c3RyaW5nPigpO1xyXG5cclxuICAgIHdoaWxlKCFpc051bGxPclVuZGVmaW5lZCh0YXNrKSlcclxuICAgIHtcclxuICAgICAgdGFza1RyZWUucHVzaCh0YXNrLmdldFRhc2tJbmZvKCkpO1xyXG4gICAgICB0YXNrID0gPFRhc2s+dGFzay5nZXRQYXJlbnQoKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGFza1RyZWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFVwZGF0ZSB0aGUgcmVxdWVzdCBpbmZvIG9iamVjdCB1c2luZyBpbmZvcm1hdGlvbiBvYnRhaW5lZCBmcm9tIGN1cnJlbnQgb3BlcmF0aW9uIGJlaW5nIGV4ZWN1dGVkLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBhc3luYyBVcGRhdGVSZXF1ZXN0SW5mbygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBjdXJyTUdEYXRhOiBNR0RhdGEgPSBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuZ2V0Q3Vyck1HRGF0YSgpO1xyXG4gICAgbGV0IGV2ZW50c01hbmFnZXI6IEV2ZW50c01hbmFnZXIgPSA8RXZlbnRzTWFuYWdlcj5BY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlcjtcclxuICAgIGxldCBvcGVyRXhlY3V0aW9uOmJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBjbWRzVG9TZXJ2ZXI6IENvbW1hbmRzVGFibGUgPSA8Q29tbWFuZHNUYWJsZT5jdXJyTUdEYXRhLkNtZHNUb1NlcnZlcjtcclxuXHJcbiAgICBmb3IobGV0IGk9MDsgaTwgY21kc1RvU2VydmVyLmdldFNpemUoKTsgaSsrKVxyXG4gICAge1xyXG4gICAgICAvLyBXaGVuIHRoZSByZXF1ZXN0IGlzIGJlaW5nIHNlbnQgdG8gc2VydmVyIGR1ZSB0byBhbiBvcGVyYXRpb24gZXhlY3V0aW9uLCBnZXQgdGhlIGluZm9ybWF0aW9uIG9mIGN1cnJlbnQgb3BlcmF0aW9uIGZyb20gQ21kc1RvU2VydmVyXHJcbiAgICAgIGlmKGNtZHNUb1NlcnZlci5nZXRDbWQoaSkgaW5zdGFuY2VvZiBFeGVjT3BlckNvbW1hbmQpIHtcclxuICAgICAgICBsZXQgb3BlckNtZDpFeGVjT3BlckNvbW1hbmQgPSA8RXhlY09wZXJDb21tYW5kPig8Q29tbWFuZHNUYWJsZT5jdXJyTUdEYXRhLkNtZHNUb1NlcnZlcikuZ2V0Q21kKGkpO1xyXG5cclxuICAgICAgICB0aGlzLl9yZXF1ZXN0SW5mby5zZXJ2ZXJDYWxsQXQgPSBvcGVyQ21kLmdldENvbW1hbmRJbmZvKCk7XHJcblxyXG4gICAgICAgIHRoaXMuX3JlcXVlc3RJbmZvLnJ1bnRpbWVUYXNrVHJlZSA9IHRoaXMuR2V0VGFza1RyZWUob3BlckNtZC5PcGVyYXRpb24uVGFzayk7XHJcbiAgICAgICAgb3BlckV4ZWN1dGlvbiA9IHRydWU7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9yZXF1ZXN0SW5mby5leHRyYUluZm8uY29udGV4dElEID0gUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLkNvbnRleHRJRDtcclxuICAgIHRoaXMuX3JlcXVlc3RJbmZvLmV4dHJhSW5mby5zZXNzaW9uQ291bnRlciA9IHRoaXMuR2V0U2Vzc2lvbkNvdW50ZXIoKTtcclxuXHJcbiAgICAvLyBMb2cgaW5mb3JtYXRpb24gYWJvdXQgbWFnaWMgaW50ZXJuYWwgZXZlbnRzIGNhdXNpbmcgcmVxdWVzdHMgdG8gc2VydmVyXHJcbiAgICBpZighb3BlckV4ZWN1dGlvbilcclxuICAgIHtcclxuICAgICAgaWYoZXZlbnRzTWFuYWdlci5nZXRMYXN0UnRFdmVudCgpICE9IG51bGwgJiYgZXZlbnRzTWFuYWdlci5nZXRMYXN0UnRFdmVudCgpLkludGVybmFsRXZlbnQgIT0gMClcclxuICAgICAge1xyXG4gICAgICAgIGxldCBydEV2dDpSdW5UaW1lRXZlbnQgPSBldmVudHNNYW5hZ2VyLmdldExhc3RSdEV2ZW50KCk7XHJcbiAgICAgICAgdGhpcy5fcmVxdWVzdEluZm8ucnVudGltZVRhc2tUcmVlID0gdGhpcy5HZXRUYXNrVHJlZSg8VGFzaz5ydEV2dC5nZXRUYXNrKCkpO1xyXG5cclxuICAgICAgICAvLyByZXR1cm4gZGVzY3JpcHRpb24gYXMgcGVyIG5ldy9vbGQgaW50ZXJuYWwgZXZlbnQgZGVzY1xyXG4gICAgICAgIGxldCBldmVudERlc2NyaXB0aW9uOiBzdHJpbmcgPSAgcnRFdnQuaXNOZXdJbnRlcm5hbEV2ZW50KClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBOU3RyaW5nLlRyaW1FbmQocnRFdnQuZ2V0TmV3SW50ZXJuYWxFdmVudERlc2NyaXB0aW9uKCkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRXZlbnQuZ2V0SW50ZXJuYWxFdnREZXNjcmlwdGlvbihydEV2dC5JbnRlcm5hbEV2ZW50KTtcclxuXHJcblxyXG4gICAgICAgIC8vIGUuZy4gRXZlbnQgWzxOZXh0IENodW5rPl0gd2hpbGUgZXhlY3V0aW5nIFs8VmlldyBSZWZyZXNoPl1cclxuICAgICAgICBsZXQgY21kOiBJQ2xpZW50Q29tbWFuZCA9IGNtZHNUb1NlcnZlci5nZXRDbWQoY21kc1RvU2VydmVyLmdldFNpemUoKSAtIDEpO1xyXG4gICAgICAgIGlmKGNtZCBhcyBJQ2xpZW50VG9TZXJ2ZXJDb21tYW5kSW5mbykge1xyXG4gICAgICAgICAgbGV0IGNvbW1hbmRJbmZvOiBzdHJpbmcgPSBOU3RyaW5nLklzTnVsbE9yRW1wdHkoKDxJQ2xpZW50VG9TZXJ2ZXJDb21tYW5kSW5mbz5jbWQpLmdldENvbW1hbmRJbmZvKCkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBOU3RyaW5nLkVtcHR5XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoPElDbGllbnRUb1NlcnZlckNvbW1hbmRJbmZvPmNtZCkuZ2V0Q29tbWFuZEluZm8oKTtcclxuXHJcbiAgICAgICAgICAvLyBJbiBjYXNlIHRoZSBydW50aW1lIGV2ZW50IGFuZCBFdmVudCBjb21tYW5kIGFyZSBzYW1lLCBubyBuZWVkIHRvIGxvZyB0aGUgZXh0cmEgaW5mb3JtYXRpb25cclxuICAgICAgICAgIGlmKGNtZCBpbnN0YW5jZW9mIEV2ZW50Q29tbWFuZCAmJiBydEV2dC5JbnRlcm5hbEV2ZW50ID09ICg8RXZlbnRDb21tYW5kPmNtZCkuTWFnaWNFdmVudClcclxuICAgICAgICAgICAgZXZlbnREZXNjcmlwdGlvbiA9IE5TdHJpbmcuRW1wdHk7XHJcblxyXG4gICAgICAgICAgdGhpcy5fcmVxdWVzdEluZm8uc2VydmVyQ2FsbEF0ID0gICdFdmVudCAnICsgY29tbWFuZEluZm8gK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICghTlN0cmluZy5Jc051bGxPckVtcHR5KGV2ZW50RGVzY3JpcHRpb24pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gTlN0cmluZy5Gb3JtYXQoJyB3aGlsZSBleGVjdXRpbmcgW3swfV0nLCBldmVudERlc2NyaXB0aW9uKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IE5TdHJpbmcuRW1wdHkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBCdWlsZCB4bWwgZm9yIG1haW4gcHJvZyBkYXRhdmlldy4gcmVxdWlyZWQgZm9yIHJlLWluaXRpYWxpemluZyBzZXNzaW9uLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBhc3luYyBCdWlsZFhNTEZvck1haW5Qcm9ncmFtRGF0YVZpZXcoKTogUHJvbWlzZTxTdHJpbmc+XHJcbiAge1xyXG4gICAgbGV0IG1lc3NhZ2U6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpO1xyXG4gICAgbGV0IGZpcnN0TWdEYXRhOiBNR0RhdGEgPSBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLmdldE1HRGF0YSgwKTtcclxuICAgIGxldCBtYWluUHJnOiBUYXNrID0gZmlyc3RNZ0RhdGEuZ2V0TWFpblByb2coMCk7XHJcblxyXG4gICAgd2hpbGUgKG1haW5QcmcgIT0gbnVsbClcclxuICAgIHtcclxuICAgICAgYXdhaXQgbWFpblByZy5idWlsZFhNTChtZXNzYWdlKTtcclxuICAgICAgbWFpblByZyA9IGZpcnN0TWdEYXRhLmdldE5leHRNYWluUHJvZyhtYWluUHJnLmdldEN0bElkeCgpKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuU2hvdWxkU2NyYW1ibGVBbmRVbnNjcmFtYmxlTWVzc2FnZXMpXHJcbiAgICB7XHJcbiAgICAgIGxldCBzY3JhbWJsZWRDaGFuZ2VzOiBzdHJpbmcgPSBTY3JhbWJsZXIuU2NyYW1ibGUobWVzc2FnZS5Ub1N0cmluZygpKTtcclxuICAgICAgbWVzc2FnZSA9IG5ldyBTdHJpbmdCdWlsZGVyKHNjcmFtYmxlZENoYW5nZXMpO1xyXG4gICAgfVxyXG5cclxuICAgIG1lc3NhZ2UuSW5zZXJ0KDAsIFhNTENvbnN0YW50cy5NR19UQUdfT1BFTik7XHJcbiAgICBtZXNzYWdlLkFwcGVuZChYTUxDb25zdGFudHMuTUdfVEFHX1hNTF9FTkRfVEFHR0VEKTtcclxuXHJcbiAgICByZXR1cm4gbWVzc2FnZS5Ub1N0cmluZygpO1xyXG4gIH1cclxuXHJcblxyXG4gIGFzeW5jIEV4ZWN1dGVfMShzZW5kaW5nSW5zdHJ1Y3Rpb246IENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZW5kaW5nSW5zdHJ1Y3Rpb24sIHNlc3Npb25TdGFnZTogQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1Nlc3Npb25TdGFnZSwgcmVzOiBJUmVzdWx0VmFsdWUpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCByZXFCdWY6IHN0cmluZztcclxuICAgIGxldCBpc0luaXRpYWxDYWxsOiBib29sZWFuID0gc2Vzc2lvblN0YWdlID09PSBDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2Vzc2lvblN0YWdlLklOSVRJQUw7XHJcbiAgICBsZXQgZ2xvYmFsUGFyYW1zU3RyaW5nOiBzdHJpbmcgPSBudWxsO1xyXG5cclxuICAgIGlmICh0aGlzLkRlbGF5Q29tbWFuZEV4ZWN1dGlvbilcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIGlmKExvZ2dlci5JbnN0YW5jZS5Mb2dMZXZlbCA9PSBMb2dnZXJfTG9nTGV2ZWxzLlJlcXVlc3RJbmZvICYmICFpc0luaXRpYWxDYWxsKVxyXG4gICAgICBhd2FpdCB0aGlzLlVwZGF0ZVJlcXVlc3RJbmZvKCk7XHJcblxyXG4gICAgaWYgKGlzSW5pdGlhbENhbGwpIHtcclxuICAgICAgbGV0IHZhbCA9IHRoaXMuUmVzdG9yZVNlc3Npb25SZUluaXRpYWxpemluZ0RhdGFGcm9tTG9jYWxTdG9yYWdlKENvbnN0SW50ZXJmYWNlLklTX1NFU1NJT05fUkVJTklUSUFMSVpJTkcpO1xyXG4gICAgICBpZiAodmFsID09PSAndHJ1ZScpIHtcclxuICAgICAgICBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5Jc1Nlc3Npb25SZUluaXRpYWxpemluZyA9ICh2YWwgPT09IFwidHJ1ZVwiKSA/IHRydWUgOiBmYWxzZTtcclxuICAgICAgICBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5sYXN0RXhjZXB0aW9uTWVzc2FnZSA9IHRoaXMuUmVzdG9yZVNlc3Npb25SZUluaXRpYWxpemluZ0RhdGFGcm9tTG9jYWxTdG9yYWdlKENvbnN0SW50ZXJmYWNlLkxBU1RfRVhDRVBUSU9OKTtcclxuICAgICAgICBsZXQgY3R4UmVtb3ZlZCA9IHRoaXMuUmVzdG9yZVNlc3Npb25SZUluaXRpYWxpemluZ0RhdGFGcm9tTG9jYWxTdG9yYWdlKENvbnN0SW50ZXJmYWNlLkNUWF9SRU1PVkVEX0ZST01fU1JWUik7XHJcblxyXG4gICAgICAgIGlmIChjdHhSZW1vdmVkICE9PSAnMScpIHtcclxuICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUVycm9yVG9Mb2coUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IubGFzdEV4Y2VwdGlvbk1lc3NhZ2UpO1xyXG4gICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlVG9Mb2coXCJTZXNzaW9uIGlzIHJlaW5pdGlhbGl6aW5nLi4uXCIsIHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChzZW5kaW5nSW5zdHJ1Y3Rpb24gPT09IENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZW5kaW5nSW5zdHJ1Y3Rpb24uTk9fVEFTS1NfT1JfQ09NTUFORFMpXHJcbiAgICAgIHJlcUJ1ZiA9IG51bGw7XHJcbiAgICBlbHNlIHtcclxuICAgICAgcmVxQnVmID0gYXdhaXQgdGhpcy5QcmVwYXJlUmVxdWVzdChzZW5kaW5nSW5zdHJ1Y3Rpb24gPT09IENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZW5kaW5nSW5zdHJ1Y3Rpb24uVEFTS1NfQU5EX0NPTU1BTkRTKTtcclxuXHJcbiAgICAgIGlmIChSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5Jc1Nlc3Npb25SZUluaXRpYWxpemluZyB8fCAhaXNJbml0aWFsQ2FsbCkge1xyXG4gICAgICAgIGxldCBjaGFuZ2VzOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuICAgICAgICBsZXQgYnVmZmVyOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuICAgICAgICBpZiAoIVJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLklzU2Vzc2lvblJlSW5pdGlhbGl6aW5nKVxyXG4gICAgICAgICAgYnVmZmVyLkFwcGVuZChyZXFCdWYpO1xyXG5cclxuICAgICAgICAvLyBzZW5kIGFjdGl2aXR5IG1vbml0b3IgbG9ncyB0byB0aGUgc2VydmVyXHJcbiAgICAgICAgLy8gaWYgKHRoaXMuX2xvZ0FjY3VtdWxhdG9yICE9PSBudWxsICYmICF0aGlzLl9sb2dBY2N1bXVsYXRvci5FbXB0eSgpKVxyXG4gICAgICAgIC8vICAgYnVmZmVyLkFwcGVuZCh0aGlzLl9sb2dBY2N1bXVsYXRvci5SZWFkKCkpO1xyXG5cclxuICAgICAgICAvLyBzeW5jaHJvbml6ZSBjbGllbnQtc2lkZSBTZXRQYXJhbXMgYW5kIElOSVB1dCBkYXRhIHRvIHRoZSBzZXJ2ZXJcclxuICAgICAgICBpZiAoUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuSXNTZXNzaW9uUmVJbml0aWFsaXppbmcpXHJcbiAgICAgICAgICBnbG9iYWxQYXJhbXNTdHJpbmcgPSB0aGlzLlJlc3RvcmVTZXNzaW9uUmVJbml0aWFsaXppbmdEYXRhRnJvbUxvY2FsU3RvcmFnZShDb25zdEludGVyZmFjZS5HTE9CQUxfUEFSQU1fTElTVCk7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgZ2xvYmFsUGFyYW1zU3RyaW5nID0gQWNjZXNzSGVscGVyLmdsb2JhbFBhcmFtcy5taXJyb3JUb1hNTCgpO1xyXG4gICAgICAgIGNoYW5nZXMuQXBwZW5kKGdsb2JhbFBhcmFtc1N0cmluZyk7XHJcbiAgICAgICAgY2hhbmdlcy5BcHBlbmQoQWNjZXNzSGVscGVyLmVudlBhcmFtc1RhYmxlLm1pcnJvclRvWE1MKCkpO1xyXG5cclxuICAgICAgICAvLyBJZiB0aGVyZSBpcyBzdHVmZiB0byBzeW5jaHJvbml6ZSwgd3JhcCBpdCwgc2NyYW1ibGUgaXQgYW5kIGFkZCB0aGUgTUdEQVRBIGZsYWdcclxuICAgICAgICBpZiAoY2hhbmdlcy5MZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBjaGFuZ2VzLkluc2VydCgwLCBcIjxcIiArIENvbnN0SW50ZXJmYWNlLk1HX1RBR19FTlZfQ0hBTkdFUyArIFwiPlwiKTtcclxuICAgICAgICAgIGNoYW5nZXMuQXBwZW5kKFwiPC9cIiArIENvbnN0SW50ZXJmYWNlLk1HX1RBR19FTlZfQ0hBTkdFUyArIFwiPlwiKTtcclxuXHJcbiAgICAgICAgICBpZiAoUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuU2hvdWxkU2NyYW1ibGVBbmRVbnNjcmFtYmxlTWVzc2FnZXMpIHtcclxuICAgICAgICAgICAgbGV0IHNjcmFtYmxlZENoYW5nZXM6IHN0cmluZyA9IFNjcmFtYmxlci5TY3JhbWJsZShjaGFuZ2VzLlRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICBjaGFuZ2VzID0gbmV3IFN0cmluZ0J1aWxkZXIoc2NyYW1ibGVkQ2hhbmdlcyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBjaGFuZ2VzLkluc2VydCgwLCBYTUxDb25zdGFudHMuTUdfVEFHX09QRU4pO1xyXG4gICAgICAgICAgY2hhbmdlcy5BcHBlbmQoWE1MQ29uc3RhbnRzLk1HX1RBR19YTUxfRU5EX1RBR0dFRCk7XHJcblxyXG4gICAgICAgICAgYnVmZmVyLkFwcGVuZChjaGFuZ2VzLlRvU3RyaW5nKCkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmVxQnVmID0gYnVmZmVyLlRvU3RyaW5nKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBsZXQgcmVxdWVzdFN0YXR1czogUmVmUGFyYW08UmVxdWVzdFN0YXR1cz4gPSBuZXcgUmVmUGFyYW0oUmVxdWVzdFN0YXR1cy5IYW5kbGVkKTtcclxuICAgIGxldCByZXNwQnVmOiBzdHJpbmcgPSBudWxsO1xyXG5cclxuICAgIGlmIChSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5Jc1Nlc3Npb25SZUluaXRpYWxpemluZyApIHtcclxuICAgICAgcmVxQnVmID0gIHJlcUJ1ZiArIHRoaXMuUmVzdG9yZVNlc3Npb25SZUluaXRpYWxpemluZ0RhdGFGcm9tTG9jYWxTdG9yYWdlKENvbnN0SW50ZXJmYWNlLk1BSU5fUFJPR19WSUVXKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLlJlbW92ZWRDb250ZXh0RnJvbVNlcnZlcilcclxuICAgICAgcmVxdWVzdFN0YXR1cy52YWx1ZSA9IFJlcXVlc3RTdGF0dXMuUmV0cnk7IC8vdHJ5IHRvIHJlLXN0YXJ0IHNlc3Npb24gZmlyc3RcclxuICAgIGVsc2VcclxuICAgIHtcclxuICAgICAgaWYgKFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5SZW1vdmluZ0NvbnRleHRGcm9tU2VydmVyKVxyXG4gICAgICAgIFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5SZW1vdmVkQ29udGV4dEZyb21TZXJ2ZXIgPSB0cnVlO1xyXG5cclxuICAgICAgcmVzcEJ1ZiA9IGF3YWl0IHRoaXMuRGlzcGF0Y2hSZXF1ZXN0KHRoaXMuU2VydmVyVXJsLCByZXFCdWYsIHNlc3Npb25TdGFnZSwgcmVxdWVzdFN0YXR1cyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHJlcXVlc3RTdGF0dXMudmFsdWUgPT0gUmVxdWVzdFN0YXR1cy5SZXRyeSkge1xyXG4gICAgICBhd2FpdCB0aGlzLlJlU3RhcnRTZXNzaW9uKCk7XHJcbiAgICB9XHJcbiAgICBpZiAocmVzcEJ1ZiA9PSBudWxsKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgaWYgKGlzSW5pdGlhbENhbGwpXHJcbiAgICB7XHJcbiAgICAgIFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLkluaXRpYWxVcmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcclxuICAgICAgaWYgKFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLklzU2Vzc2lvblJlSW5pdGlhbGl6aW5nKSB7XHJcbiAgICAgICAgbGV0IGRhdGFTdG9yYWdlID0gd2luZG93LmxvY2FsU3RvcmFnZTtcclxuICAgICAgICBkYXRhU3RvcmFnZS5yZW1vdmVJdGVtKENvbnN0SW50ZXJmYWNlLklTX1NFU1NJT05fUkVJTklUSUFMSVpJTkcpO1xyXG4gICAgICAgIGRhdGFTdG9yYWdlLnJlbW92ZUl0ZW0oQ29uc3RJbnRlcmZhY2UuTUFJTl9QUk9HX1ZJRVcpO1xyXG4gICAgICAgIGRhdGFTdG9yYWdlLnJlbW92ZUl0ZW0oQ29uc3RJbnRlcmZhY2UuR0xPQkFMX1BBUkFNX0xJU1QpO1xyXG4gICAgICAgIGRhdGFTdG9yYWdlLnJlbW92ZUl0ZW0oQ29uc3RJbnRlcmZhY2UuTEFTVF9FWENFUFRJT04pO1xyXG5cclxuXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBGbG93TW9uaXRvclF1ZXVlLkluc3RhbmNlLmVuYWJsZShmYWxzZSk7XHJcbiAgICBhd2FpdCB0aGlzLlByb2Nlc3NSZXNwb25zZShyZXNwQnVmLCBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuY3Vyck1nZElELCBudWxsLCByZXMpO1xyXG5cclxuICAgIGlmIChSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5Jc1Nlc3Npb25SZUluaXRpYWxpemluZykge1xyXG4gICAgICBBY2Nlc3NIZWxwZXIuZ2xvYmFsUGFyYW1zLlJlc3RvcmVHbG9iYWxQYXJhbXMoZ2xvYmFsUGFyYW1zU3RyaW5nKTtcclxuXHJcbiAgICAgIGxldCBkYXRhU3RvcmFnZSA9IHdpbmRvdy5sb2NhbFN0b3JhZ2U7XHJcbiAgICAgIGxldCBjdHhSZW1vdmVkID0gZGF0YVN0b3JhZ2UuZ2V0SXRlbShDb25zdEludGVyZmFjZS5DVFhfUkVNT1ZFRF9GUk9NX1NSVlIpO1xyXG5cclxuICAgICAgaWYgKGN0eFJlbW92ZWQgPT09IFwiMVwiKSB7XHJcblxyXG4gICAgICBFdmVudHNNYW5hZ2VyLkluc3RhbmNlLnJlc3RvcmVMYXN0U2F2ZWRSb3V0ZUV2ZW50RnJvbUxvY2FsU3RvcmFnZSgpO1xyXG5cclxuICAgICAgZGF0YVN0b3JhZ2UucmVtb3ZlSXRlbShDb25zdEludGVyZmFjZS5DVFhfUkVNT1ZFRF9GUk9NX1NSVlIpO1xyXG4gICAgICBkYXRhU3RvcmFnZS5yZW1vdmVJdGVtKENvbnN0SW50ZXJmYWNlLkxBU1RfUk9VVEVfRVZFTlQpO1xyXG4gICAgICBkYXRhU3RvcmFnZS5yZW1vdmVJdGVtKENvbnN0SW50ZXJmYWNlLkxBU1RfUk9VVEVfRVZFTlRfU1JDX1RTSyk7XHJcbiAgICAgIGRhdGFTdG9yYWdlLnJlbW92ZUl0ZW0oQ29uc3RJbnRlcmZhY2UuTEFTVF9ST1VURV9FVkVOVF9BUkdfTElTVCk7XHJcbiAgICB9XHJcblxyXG4gICAgICBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5Jc1Nlc3Npb25SZUluaXRpYWxpemluZyA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgLy8gaWYgKGlzSW5pdGlhbENhbGwpIHtcclxuICAgIC8vICAgLy8gSWYgaXQgd2FzIGluaXRpYWwgY2FsbCwgd2Ugd2lsbCBzZW5kIGFsbCBwZW5kaW5nIGxvZ3MgKEZhaWxlZCBlYXJsaWVyIGV4ZWN1dGlvbiBzY2VuYXJpbylcclxuICAgIC8vICAgLy8gVGhleSB3aWxsIGJlIHNlbnQgaGVyZSwgYWZ0ZXIgZmlyc3QgcmVxdWVzdCBpcyBzZXJ2ZWQuXHJcbiAgICAvLyAgIGlmIChDbGllbnRNYW5hZ2VyLkluc3RhbmNlLmdldExvZ0NsaWVudFNlcXVlbmNlRm9yQWN0aXZpdHlNb25pdG9yKCkgJiYgQ2xpZW50TG9nQWNjdW11bGF0b3IuRXhpc3RpbmdMb2dzRm91bmQoKSkge1xyXG4gICAgLy8gICAgIGxldCBzdWNjZXNzOiBib29sZWFuID0gdGhpcy5TZW5kUGVuZGluZ0xvZ3NUb1NlcnZlcigpO1xyXG4gICAgLy9cclxuICAgIC8vICAgICAvLyBpZiB3ZSBoYXZlIHN1Y2Nlc3NmdWxseSBzZW50IHRoZSBwZW5kaW5nIGxvZ3MgZGVsZXRlIHRoZW1cclxuICAgIC8vICAgICBpZiAoc3VjY2Vzcykge1xyXG4gICAgLy8gICAgICAgUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuRGVsZXRlUGVuZGluZ0xvZ3MoKTtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyAgIH1cclxuICAgIC8vIH1cclxuICAgIC8vIGVsc2UgaWYgKHRoaXMuX2xvZ0FjY3VtdWxhdG9yICE9PSBudWxsICYmICF0aGlzLl9sb2dBY2N1bXVsYXRvci5FbXB0eSgpKSB7XHJcbiAgICAvLyAgIC8vIEFjY3VtdWxhdGVkIGxvZ3Mgd2VyZSBzZW50LCBzbyByZXNldCAoZGVsZXRlKSB0aGVtIG5vd1xyXG4gICAgLy8gICB0aGlzLl9sb2dBY2N1bXVsYXRvci5SZXNldCgpO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIC8vIHJlZnJlc2ggdGhlIGRpc3BsYXlzXHJcbiAgICBpZiAoc2VuZGluZ0luc3RydWN0aW9uID09PSBDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2VuZGluZ0luc3RydWN0aW9uLlRBU0tTX0FORF9DT01NQU5EUykge1xyXG4gICAgICBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuc3RhcnRUYXNrc0l0ZXJhdGlvbigpO1xyXG4gICAgICBsZXQgdGFzazogVGFza0Jhc2U7XHJcbiAgICAgIHdoaWxlICgodGFzayA9IDxUYXNrQmFzZT5BY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuZ2V0TmV4dFRhc2soKSkgIT09IG51bGwpIHtcclxuICAgICAgICBsZXQgZGF0YVZpZXdXYXNSZXRyaWV2ZWQ6IGJvb2xlYW4gPSB0YXNrLkRhdGFWaWV3V2FzUmV0cmlldmVkO1xyXG4gICAgICAgIGlmIChkYXRhVmlld1dhc1JldHJpZXZlZCkge1xyXG4gICAgICAgICAgYXdhaXQgdGFzay5SZWZyZXNoRGlzcGxheSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChpc0luaXRpYWxDYWxsKVxyXG4gICAgICBTZXJ2ZXJDb25maWcuSW5zdGFuY2Uuc2V0R2xvYmFsUGFyYW1zKG51bGwpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PnNlbmQgJ3JlcUJ1ZicgdG8gJ3VybCc7IHJlY2VpdmUgYSByZXNwb25zZS5cclxuICAvLy8gRm9yIE5vcm1hbC9Jbml0aWFsQ2FsbCByZXF1ZXN0cywgdGhlIHVybCBwb2ludHMgdG8gdGhlIHdlYi1yZXF1ZXN0ZXIuXHJcbiAgLy8vIFRoZSBvdGhlciBwYXJhbWV0ZXJzIGFuZCBkYXRhIGdvZXMgYXMgdGhlIGVuY29kZWQgYm9keS5cclxuICAvLy8gVGhpcyBtZWFucyB0aGF0IGl0IGlzIGEgUE9TVCByZXF1ZXN0LlxyXG4gIC8vLyBPbiB0aGUgb3RoZXIgaGFuZCwgSGFuZFNoYWtlIHJlcXVlc3QgaXMgYSBHRVQgcmVxdWVzdCBhbmQgc28gdGhlIHBhcmFtZXRlcnMgYXJlXHJcbiAgLy8vIHNlbnQgaW4gdGhlIFVSTCBpdHNlbGYuIEluIHRoaXMgY2FzZSwgZW5jb2RlZEJvZHkgaGFzIHRvIGJlIG51bGwuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ1cmxcIj5VUkwgdG8gYmUgYWNjZXNzZWQuPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyZXFCdWZcIj5kYXRhIHRvIGJlIHNlbnQgdG8gdGhlIHVybDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic2Vzc2lvblN0YWdlXCI+SEFORFNIQUtFIC8gSU5JVElBTCAvIE5PUk1BTC48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz5yZXNwb25zZTwvcmV0dXJucz5cclxuICAgcHJpdmF0ZSBhc3luYyBEaXNwYXRjaFJlcXVlc3QodXJsOiBzdHJpbmcsIHJlcUJ1Zjogc3RyaW5nLCBzZXNzaW9uU3RhZ2U6IENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZXNzaW9uU3RhZ2UsIHJlcXVlc3RTdGF0dXM6IFJlZlBhcmFtPFJlcXVlc3RTdGF0dXM+KTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIGxldCByZXNwb25zZTogc3RyaW5nID0gbnVsbDtcclxuICAgIGxldCBlbmNvZGVkQm9keTogc3RyaW5nID0gbnVsbDtcclxuICAgIHJlcXVlc3RTdGF0dXMudmFsdWUgPSBSZXF1ZXN0U3RhdHVzLkhhbmRsZWQ7XHJcblxyXG4gICAgaWYgKHVybCA9PT0gbnVsbCkge1xyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coXCJpbiBzZW5kTXNnVG9TcnZyKCkgdW5rbm93biBzZXJ2ZXJcIik7XHJcbiAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoc2Vzc2lvblN0YWdlICE9PSBDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2Vzc2lvblN0YWdlLkhBTkRTSEFLRSkge1xyXG4gICAgICBsZXQgdXJsU3VmZml4OiBzdHJpbmcgPSB0aGlzLkJ1aWxkVXJsU3VmZml4KHJlcUJ1ZiAhPT0gbnVsbCwgc2Vzc2lvblN0YWdlID09PSBDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2Vzc2lvblN0YWdlLklOSVRJQUwpO1xyXG4gICAgICBsZXQgcmVxQnVmRW5jb2RlZDogc3RyaW5nID0gSHR0cFV0aWxpdHkuVXJsRW5jb2RlKHJlcUJ1ZiwgRW5jb2RpbmcuVVRGOCk7XHJcbiAgICAgIGVuY29kZWRCb2R5ID0gdXJsU3VmZml4ICsgcmVxQnVmRW5jb2RlZDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgIHRyeSB7XHJcbiAgICAgICBpZiAoTG9nZ2VyLkluc3RhbmNlLlNob3VsZExvZ0V4dGVuZGVkU2VydmVyUmVsYXRlZE1lc3NhZ2VzKCkpXHJcbiAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZVNlcnZlck1lc3NhZ2VzVG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJNRVNTQUdFIFRPIFNFUlZFUjpcXG4gVVJMOiB7MH1cXG4gQk9EWTogezF9XCIsIHVybCwgZW5jb2RlZEJvZHkpKTtcclxuXHJcbiAgICAgICByZXNwb25zZSA9IGF3YWl0IHRoaXMuRXhlY3V0ZVJlcXVlc3QodXJsLCBlbmNvZGVkQm9keSk7XHJcblxyXG4gICAgICAgLyogcmVtb3ZlIHRoZSB1bndhbnRlZCBkYXRhIGJlZm9yZSB0aGUgTUdEQVRBIHRhZyAqL1xyXG4gICAgICAgaWYgKCFyZXNwb25zZS50b1VwcGVyQ2FzZSgpLnN0YXJ0c1dpdGgoXCI8SFRNTFwiKSkge1xyXG4gICAgICAgICBsZXQgc3RhcnRJZHg6IG51bWJlciA9IHJlc3BvbnNlLmluZGV4T2YoXCI8eG1sIGlkPVxcXCJNR0RBVEFcXFwiPlwiKTtcclxuICAgICAgICAgaWYgKHN0YXJ0SWR4ID4gMClcclxuICAgICAgICAgICByZXNwb25zZSA9IHJlc3BvbnNlLnN1YnN0cihzdGFydElkeCk7XHJcbiAgICAgICB9XHJcblxyXG4gICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlU2VydmVyTWVzc2FnZXNUb0xvZyhcIk1FU1NBR0UgRlJPTSBTRVJWRVI6IFwiICsgcmVzcG9uc2UpO1xyXG5cclxuICAgICAgIC8vIGhhbmRzaGFrZSByZXF1ZXN0cyBhcmUgYWx3YXlzIHNjcmFtYmxlZCAodGhlIHNjcmFtYmxpbmcgY2FuIGJlIGRpc2FibGVkIHN0YXJ0aW5nIGZyb20gdGhlIDNyZCByZXF1ZXN0KS5cclxuICAgICAgIGlmIChzZXNzaW9uU3RhZ2UgPT09IENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZXNzaW9uU3RhZ2UuSEFORFNIQUtFIHx8XHJcbiAgICAgICAgIChyZXNwb25zZS5sZW5ndGggPiAwICYmXHJcbiAgICAgICAgICAgUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuU2hvdWxkU2NyYW1ibGVBbmRVbnNjcmFtYmxlTWVzc2FnZXMgJiYgcmVzcG9uc2UgIT09IFwiPHhtbCBpZD1cXFwiTUdEQVRBXFxcIj5cXG48L3htbD5cIikpIHtcclxuICAgICAgICAgaWYgKHNlc3Npb25TdGFnZSA9PT0gQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1Nlc3Npb25TdGFnZS5IQU5EU0hBS0UpIHtcclxuICAgICAgICAgICAvLyBoYW5kc2hha2UgcmVxdWVzdHMgYXJlIGFsd2F5cyBzY3JhbWJsZWQuXHJcbiAgICAgICAgICAgRGVidWcuQXNzZXJ0KHJlc3BvbnNlLmxlbmd0aCA+IDAgJiYgcmVzcG9uc2VbMF0gIT09ICc8Jyk7XHJcbiAgICAgICAgIH1cclxuICAgICAgICAgcmVzcG9uc2UgPSBDb21tYW5kc1Byb2Nlc3NvckJhc2UuVW5TY3JhbWJsZShyZXNwb25zZSk7XHJcbiAgICAgICB9XHJcblxyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhcIk1FU1NBR0UgRlJPTSBTRVJWRVI6IChzaXplID0gXCIgKyByZXNwb25zZS5sZW5ndGggKyBcIilcIiArIE9TRW52aXJvbm1lbnQuRW9sU2VxICsgcmVzcG9uc2UpO1xyXG5cclxuICAgICAgdGhpcy5fbGFzdFJlcXVlc3RUaW1lID0gTWlzYy5nZXRTeXN0ZW1NaWxsaXNlY29uZHMoKTtcclxuICAgICB9XHJcbiAgICAgY2F0Y2ggKGV4KVxyXG4gICAgIHtcclxuICAgICAgIGlmIChleCBpbnN0YW5jZW9mIFNlcnZlckVycm9yKSB7XHJcbiAgICAgICAgIHJlcXVlc3RTdGF0dXMudmFsdWUgPSBSZXF1ZXN0U3RhdHVzLkFib3J0O1xyXG5cclxuXHJcbiAgICAgICAgIGlmIChzZXNzaW9uU3RhZ2UgPT0gQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1Nlc3Npb25TdGFnZS5OT1JNQUwpIHtcclxuICAgICAgICAgICAvLyBJZiBjb250ZXh0IGlzIG5vdCBmb3VuZCBhdCBzZXJ2ZXIgZHVlIHRvIGNyYXNoIG9yIHRocmVhZCBpcyBhYm9ydGVkIGR1ZSB0byBjcmFzaCxcclxuICAgICAgICAgICAvLyBjaGVjayBXZWJDbGllbnRSZWluaXRTZXNzaW9uLiBiYXNlZCBvbiB0aGUgZmxhZywgcmUtaW5pdGlhbGl6aW5nIHJlcXVlc3Qgc2hvdWxkIGJlIHNlbnQgdG8gY3JlYXRlXHJcbiAgICAgICAgICAgLy8gYSBuZXcgY29udGV4dCBhbmQgaXQgc2hvdWxkIGJlIGV4ZWN1dGVkIGluIHRoaXMgbmV3IGNvbnRleHQuXHJcbiAgICAgICAgICAgLy8gc28sIHNldCB0aGUgUmVxdWVzdFN0YXR1cyB0byBSZXRyeSBzbyB0aGF0IHRoZSBjbGllbnQgd2lsbCByZXNlbmQgcmVxdWVzdC5cclxuICAgICAgICAgICBpZiAoZXguR2V0Q29kZSgpID09IFNlcnZlckVycm9yLkVSUl9DVFhfTk9UX0ZPVU5EIHx8IGV4LkdldENvZGUoKSA9PSBTZXJ2ZXJFcnJvci5FUlJfVEhSRUFEX0FCT1JURUQpIHtcclxuICAgICAgICAgICAgIGlmIChSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuUmVtb3ZlZENvbnRleHRGcm9tU2VydmVyKSB7XHJcbiAgICAgICAgICAgICAgIHJlcXVlc3RTdGF0dXMudmFsdWUgPSBSZXF1ZXN0U3RhdHVzLlJldHJ5O1xyXG4gICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgIHN3aXRjaCAoRW52aXJvbm1lbnQuSW5zdGFuY2UuZ2V0V2ViQ2xpZW50UmVpbml0U2Vzc2lvbigpKSB7XHJcbiAgICAgICAgICAgICAgICAgY2FzZSAnWScgOlxyXG4gICAgICAgICAgICAgICAgICAgcmVxdWVzdFN0YXR1cy52YWx1ZSA9IFJlcXVlc3RTdGF0dXMuUmV0cnk7XHJcbiAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICBjYXNlICdBJzpcclxuICAgICAgICAgICAgICAgICAgIGxldCByZXR2YWwgPSBhd2FpdCBHVUlNYW5hZ2VyLkluc3RhbmNlLk1lc3NhZ2VCb3goXCJFcnJvclwiLCBcIlVua25vd24gZXJyb3Igb2NjdXJyZWQgYXQgc2VydmVyLXNpZGUuXCIgK1xyXG4gICAgICAgICAgICAgICAgICAgICBcIiBXb3VsZCB5b3UgbGlrZSB0byByZWluaXRpYWxpemUgdGhlIHNlc3Npb24/XCIsIFN0eWxlcy5NU0dCT1hfQlVUVE9OX1lFU19OTyk7XHJcbiAgICAgICAgICAgICAgICAgICByZXF1ZXN0U3RhdHVzLnZhbHVlID0gKHJldHZhbCA9PSBTdHlsZXMuTVNHQk9YX1JFU1VMVF9ZRVMpID8gUmVxdWVzdFN0YXR1cy5SZXRyeSA6IFJlcXVlc3RTdGF0dXMuQWJvcnQ7XHJcbiAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICBjYXNlICdOJzpcclxuICAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgcmVxdWVzdFN0YXR1cy52YWx1ZSA9IFJlcXVlc3RTdGF0dXMuQWJvcnQ7XHJcbiAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgaWYgKHJlcXVlc3RTdGF0dXMudmFsdWUgPT0gUmVxdWVzdFN0YXR1cy5BYm9ydClcclxuICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgRW52aXJvbm1lbnQuSW5zdGFuY2Uuc2V0V2ViQ2xpZW50UmVpbml0U2Vzc2lvbignTicpO1xyXG4gICAgICAgICAgICAgICB0aHJvdyAgZXg7XHJcbiAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgbGV0IGVyckZvckNvbnNvbGUgPSBTdHJVdGlsLmdldENvbnNvbGVFcm9yU3RyaW5nKGV4LkdldE1lc3NhZ2UoKSk7XHJcbiAgICAgICAgICAgICAgIFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLmxhc3RFeGNlcHRpb25NZXNzYWdlID0gXCJFeGNlcHRpb24gT2NjdXJlZCBhdCBzZXJ2ZXIgc2lkZSA6IFwiICsgZXguR2V0Q29kZSgpLnRvU3RyaW5nKCkgKyBcIiA6IFwiICsgZXJyRm9yQ29uc29sZTtcclxuICAgICAgICAgICAgICAgY29uc29sZS5sb2coUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IubGFzdEV4Y2VwdGlvbk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgfVxyXG4gICAgICAgICB9XHJcbiAgICAgICB9XHJcbiAgICAgICAvL0lmIGFueSBpdGVtcyBhcmUgc3RvcmVkIG9uIGxvY2FsIHN0b3JhZ2UgY2xlYXIgaXQgbm93IGFzIHNlc3Npb24gY2Fubm90IGNvbnRpbnVlZC5cclxuICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2UuY2xlYXIoKTtcclxuICAgICAgIHRocm93IGV4O1xyXG4gICAgIH1cclxuICAgIHJldHVybiByZXNwb25zZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gQ2hlY2tzIHRoZSByZXNwb25zZSBzdHJpbmcsIHRocm93cyBhbiBlcnJvciBpZiB0aGUgcmVzcG9uc2Ugc3RyaW5nIGNvbnRhaW5zXHJcbiAgLy8vIGFuIHhtbC9odG1sIGVycm9yPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInJlc3BvbnNlXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIEhhbmRsZUVycm9yUmVzcG9uc2UocmVzcG9uc2U6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdHJ5IHtcclxuICAgICAgLy8gZXJyb3IgcmVzcG9uc2VzIGFyZSBhbHdheXMgc2NyYW1ibGVkIGJ5IHRoZSB3ZWIgc2VydmVyLlxyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVTZXJ2ZXJNZXNzYWdlc1RvTG9nKFwiTUVTU0FHRSBGUk9NIFNFUlZFUjogXCIgKyByZXNwb25zZSk7XHJcbiAgICAgIHJlc3BvbnNlID0gQ29tbWFuZHNQcm9jZXNzb3JCYXNlLlVuU2NyYW1ibGUocmVzcG9uc2UpO1xyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVTZXJ2ZXJNZXNzYWdlc1RvTG9nKFwiTUVTU0FHRSBGUk9NIFNFUlZFUjogXCIgKyBTdHJVdGlsLmdldENvbnNvbGVFcm9yU3RyaW5nKHJlc3BvbnNlKSk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXgpIHtcclxuICAgIH1cclxuXHJcbiAgICBpZiAocmVzcG9uc2Uuc3RhcnRzV2l0aChcIjx4bWxlcnJcIikpIHtcclxuICAgICAgICBsZXQgZXJyb3JNZXNzYWdlWG1sOiBFcnJvck1lc3NhZ2VYbWwgPSBuZXcgRXJyb3JNZXNzYWdlWG1sKHJlc3BvbnNlLCB0aGlzLl9sYXN0UmVxdWVzdFRpbWUsIEFjY2Vzc0hlbHBlci5lbnZpcm9ubWVudC5nZXRDb250ZXh0SW5hY3Rpdml0eVRpbWVvdXQoKSk7XHJcbiAgICAgIHRocm93IG5ldyBTZXJ2ZXJFcnJvcihlcnJvck1lc3NhZ2VYbWwuR2V0TWVzc2FnZSgpLCBlcnJvck1lc3NhZ2VYbWwuR2V0Q29kZSgpKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHJlc3BvbnNlLnRvVXBwZXJDYXNlKCkuc3RhcnRzV2l0aChcIjxIVE1MXCIpKSB7XHJcbiAgICAgIHRocm93IG5ldyBTZXJ2ZXJFcnJvcihyZXNwb25zZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+c2VuZCAnZW5jb2RlZEJvZHknIHRvICd1cmwnIGFuZCByZWNlaXZlIGEgcmVzcG9uc2UuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ1cmxcIj5VUkwgdG8gYmUgYWNjZXNzZWQuPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJlbmNvZGVkQm9keVwiPkluIGNhc2Ugb2YgUE9TVCwgY29udGVudCB0byBiZSBzZW50IHRvIHNlcnZlci4gRm9yIG90aGVyIG1ldGhvZHMsIG51bGwuPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+dGhlIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlcjwvcmV0dXJucz5cclxuIHByaXZhdGUgYXN5bmMgRXhlY3V0ZVJlcXVlc3QodXJsOiBzdHJpbmcsIGVuY29kZWRCb2R5OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuR2V0Q29udGVudCh1cmwsIGZhbHNlLCBlbmNvZGVkQm9keSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBHZXRDb250ZW50KHJlcXVlc3RlZFVSTDogc3RyaW5nLCB1c2VDYWNoZTogYm9vbGVhbiwgcmVxdWVzdENvbnRlbnQ/OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgaWYgKGlzVW5kZWZpbmVkKHJlcXVlc3RDb250ZW50KSlcclxuICAgICAgcmVxdWVzdENvbnRlbnQgPSBudWxsO1xyXG5cclxuICAgIGxldCByZXNwb25zZVN0cjogc3RyaW5nO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIC8vIGlmIHJlbGF0aXZlLCBwcmVmaXggd2l0aCB0aGUgJ3Byb3RvY29sOi8vc2VydmVyLycgZnJvbSB3aGljaCB0aGUgcmljaC1jbGllbnQgd2FzIGFjdGl2YXRlZFxyXG4gICAgICBpZiAocmVxdWVzdGVkVVJMLnN0YXJ0c1dpdGgoXCIvXCIpKVxyXG4gICAgICAgIHJlcXVlc3RlZFVSTCA9IFNlcnZlckNvbmZpZy5JbnN0YW5jZS5nZXRQcm90b2NvbCgpICsgXCI6Ly9cIiArIFNlcnZlckNvbmZpZy5JbnN0YW5jZS5nZXRTZXJ2ZXIoKSArIHJlcXVlc3RlZFVSTDtcclxuXHJcbiAgICAgIHZhciBzcGlubmVyVGltZXIgPSB0aW1lcig1MCwgNTApO1xyXG4gICAgICB2YXIgc3Bpbm5lclRpbWVyU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gPSBzcGlubmVyVGltZXIuc3Vic2NyaWJlKHN0YXRlID0+IHtcclxuICAgICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5DaGVja0FuZFNob3dTcGlubmVyKHRydWUpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGxldCBpc0Vycm9yOiBSZWZQYXJhbTxib29sZWFuPiA9IG5ldyBSZWZQYXJhbShmYWxzZSk7XHJcblxyXG4gICAgICBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5yZXF1ZXN0TnVtYmVyKys7IC8vIGluY3JlYXNlIHRoZSBubyBvZiByZXF1ZXN0c1xyXG4gICAgICByZXNwb25zZVN0ciA9IGF3YWl0IEh0dHBNYW5hZ2VyLkdldEluc3RhbmNlKCkuR2V0Q29udGVudChyZXF1ZXN0ZWRVUkwsIHJlcXVlc3RDb250ZW50LCB1c2VDYWNoZSwgaXNFcnJvcik7XHJcbiAgICAgIFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLnRvdGFsUmVzcG9uc2VEYXRhTGVuZ3RoICs9IFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLnRvdGFsUmVzcG9uc2VEYXRhTGVuZ3RoICsgKCFpc051bGxPclVuZGVmaW5lZChyZXNwb25zZVN0cikgPyByZXNwb25zZVN0ci5sZW5ndGggOiAwKTtcclxuXHJcbiAgICAgIHNwaW5uZXJUaW1lclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgICBzcGlubmVyVGltZXJTdWJzY3JpcHRpb24gPSBudWxsO1xyXG5cclxuICAgICAgaWYgKGlzRXJyb3IudmFsdWUpIHtcclxuICAgICAgICB0aGlzLkhhbmRsZUVycm9yUmVzcG9uc2UocmVzcG9uc2VTdHIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXgpIHtcclxuICAgICAgLy8gZG9uJ3Qgd3JpdGUgc2VydmVyIGVycm9yIHRvIGxvZyB3aGVuIHRoZSBsb2cgbGV2ZWwgaXMgYmFzaWNcclxuICAgICAgaWYgKCEoZXggaW5zdGFuY2VvZiBTZXJ2ZXJFcnJvcikgfHwgTG9nZ2VyLkluc3RhbmNlLkxvZ0xldmVsICE9PSBMb2dnZXJfTG9nTGV2ZWxzLkJhc2ljKSB7XHJcbiAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2coZXgsIE5TdHJpbmcuRm9ybWF0KFwicmVxdWVzdGVkIFVSTCA9IFxcXCJ7MH1cXFwiXCIsIHJlcXVlc3RlZFVSTCkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyB0aGUgZXhjZXB0aW9uIHNob3VsZCBiZSB0aHJvd24gYW5kIHRoZSBjYWxsZXJzIHNob3VsZCBoYW5kbGUgaXQuXHJcbiAgICAgIGlmICghKGV4IGluc3RhbmNlb2YgU2VydmVyRXJyb3IpKSB7XHJcbiAgICAgICAgZXggPSBuZXcgU2VydmVyRXJyb3IoZXguTWVzc2FnZSwgZXguSW5uZXJFeGNlcHRpb24gPyBleC5Jbm5lckV4Y2VwdGlvbiA6IGV4KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhyb3cgZXg7XHJcbiAgICB9XHJcbiAgICBmaW5hbGx5IHtcclxuICAgICAgaWYgKHNwaW5uZXJUaW1lclN1YnNjcmlwdGlvbiAhPSBudWxsKVxyXG4gICAgICAgIHNwaW5uZXJUaW1lclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXNwb25zZVN0cjtcclxuICB9XHJcblxyXG5cclxuICBDbGllbnRBY3RpdmF0ZWQoZXhlY3V0aW9uVGltZSkge1xyXG5cclxuICAgIC8vIGxvZyB0aGUgdmFsdWVzIGFzIGNsaWVudCBpcyBhY3RpdmUgYWdhaW5cclxuICAgIC8vIFRPRE8gLSBmb3JtYXR0aW5nXHJcbiAgICAvLyBjb25zb2xlLmxvZygnTG9nZ2luZyBTdW1tYXJ5ICcgKyAnXFxuJyArXHJcbiAgICAvLyAgICdUb3RhbCBudW1iZXIgcmVxdWVzdHMgOiAnICsgUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IucmVxdWVzdE51bWJlciArICdcXG4nICtcclxuICAgIC8vICAgJ1RvdGFsIHRpbWUgbmVlZGVkIGZvciBodHRwIHJlcXVlc3RzIDogJyArIFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLnRvdGFsVGltZUZvckhUVFBSZXF1ZXN0cyArICcgbXMgJyArICdcXG4nICtcclxuICAgIC8vICAgJ1RvdGFsIHRpbWUgbmVlZGVkIGZvciBjbGllbnQgdG8gZ2V0IGFjdGl2ZSA6ICcgKyBleGVjdXRpb25UaW1lICsgJyBtcyAnICsgJ1xcbidcclxuICAgIC8vICk7XHJcbiAgICAvL1xyXG4gICAgLy8gLy8gVE9ETyAtIG1vdmUgaXQgdG8gbWV0aG9kXHJcbiAgICAvLyBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5yZXF1ZXN0TnVtYmVyID0gMDtcclxuICAgIC8vIFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLnRvdGFsVGltZUZvckhUVFBSZXF1ZXN0cyA9IDA7XHJcbiAgICAvLyBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci50b3RhbFJlcXVlc3REYXRhTGVuZ3RoID0gMDtcclxuICAgIC8vIFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLnRvdGFsUmVzcG9uc2VEYXRhTGVuZ3RoID0gMDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gV2hlbiBMb2dDbGllbnRTZXF1ZW5jZUZvckFjdGl2aXR5TW9uaXRvciA9IFkgd2Ugd2lsbCBiZSBrZWVwaW5nIHRoZSBsb2dzIGluIGZpbGUgYW5kIHNlbmQgdGhlIGZpbGUgd2l0aCBuZXh0XHJcbiAgLy8vIHNlcnZlciBhY2Nlc3MuIElmIGNsaWVudCBpcyBhYm5vcm1hbGx5IHRlcm1pbmF0ZWQgdGhlbiB0aGVyZSBjYW4gYmUgMSBvciBtb3JlIGZpbGVzIGNvbnRhaW5pbmcgbG9ncyBzaW5jZVxyXG4gIC8vLyBsYXN0IHNlcnZlciBhY2Nlc3MuTm93IHRoZXNlIGxvZ3Mgd2lsbCBiZSBzZW50IHRvIHNlcnZlciwgd2hlbiBuZXh0IHRpbWUgUkMgcHJvZ3JhbSBpcyBleGVjdXRlZCwuPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gSWYgc2VuZGluZyB3YXMgc3VjY2Vzc2Z1bDwvcmV0dXJucz5cclxuICAvLyAgIFRPRE86IEhhbmRsZSBwZW5kaW5nIGxvZ3MuXHJcbiAgLy8gcHJpdmF0ZSBTZW5kUGVuZGluZ0xvZ3NUb1NlcnZlcigpOiBib29sZWFuIHtcclxuICAvLyAgIGxldCBzdWNjZXNzOiBib29sZWFuID0gdHJ1ZTtcclxuICAvL1xyXG4gIC8vICAgVGhlIHBlbmRpbmcgbG9ncyBjYW5ub3QgYmUgcmVhZCBmcm9tIHRoZSBmaWxlIHN5c3RlbSBzaW5jZSBXZWJDbGllbnQgZG9lc24ndCBoYXZlIGFjY2VzcyB0byB0aGF0LlxyXG4gIC8vICAgTWF5YmUsIHRoZSBsb2dzIHNob3VsZCBiZSB3cml0dGVuIGludG8gTG9jYWxTdG9yYWdlIGFkIHJlYWQgZnJvbSB0aGVyZS5cclxuICAvL1xyXG4gIC8vICAgbGV0IHN0cmluZ0J1aWxkZXI6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigxMDAwKTtcclxuICAvLyAgIGxldCBmbG93TW9uaXRvcjogRmxvd01vbml0b3JRdWV1ZSA9IEZsb3dNb25pdG9yUXVldWUuSW5zdGFuY2U7XHJcbiAgLy9cclxuICAvLyAgIC8vIEdldCBpdGVyYXRvciB0byBuYW1lcyBvZiBsb2cgZmlsZXMuXHJcbiAgLy8gICBsZXQgZW51bWVyYXRvcjogSUVudW1lcmF0b3I8c3RyaW5nPiA9IENsaWVudExvZ0FjY3VtdWxhdG9yLkV4aXN0aW5nTG9nSXRlcmF0b3IoKTtcclxuICAvL1xyXG4gIC8vICAgLy8gd2hpbGUgdGhlcmUgYXJlIG1vcmUgZmlsZXNcclxuICAvLyAgIHdoaWxlIChlbnVtZXJhdG9yLk1vdmVOZXh0KCkpIHtcclxuICAvLyAgICAgLy8gVGFrZSBuZXh0IGZpbGUgbmFtZVxyXG4gIC8vICAgICBsZXQgbG9nTmFtZTogc3RyaW5nID0gZW51bWVyYXRvci5DdXJyZW50O1xyXG4gIC8vICAgICAvLyBQcmVwYXJlIHRoZSBoZWFkZXIgbGluZSAoQ2xpZW50IGxvZyBmaWxlIDogPENvbnRleHQgOiBYWFhYWFg+KSBhbmQgYWRkIGl0IHRvXHJcbiAgLy8gICAgIC8vIGZsb3cgbW9uaXRvciBidWlsZCBtb25pdG9yIG1lc3NhZ2VcclxuICAvLyAgICAgbGV0IGhlYWRlckxpbmU6IHN0cmluZyA9IENsaWVudExvZ0FjY3VtdWxhdG9yLkJ1aWxkTG9nSGVhZGVyTGluZShsb2dOYW1lKTtcclxuICAvLyAgICAgZmxvd01vbml0b3IuYWRkRmxvd1ZlcmlmeUluZm8oaGVhZGVyTGluZSk7XHJcbiAgLy8gICAgIGxldCBsb2dDdHhCdWY6IFN0cmluZ0J1aWxkZXIgPSBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5CdWlsZE1vbml0b3JNZXNzYWdlKCk7XHJcbiAgLy9cclxuICAvLyAgICAgbGV0IGZpbGVDb250ZW50czogc3RyaW5nID0gSGFuZGxlRmlsZXMucmVhZFRvU3RyaW5nKGxvZ05hbWUpO1xyXG4gIC8vICAgICBsb2dDdHhCdWYuQXBwZW5kKGZpbGVDb250ZW50cyk7XHJcbiAgLy8gICAgIHN0cmluZ0J1aWxkZXIuQXBwZW5kKGxvZ0N0eEJ1Zi5Ub1N0cmluZygpKTtcclxuICAvLyAgIH1cclxuICAvL1xyXG4gIC8vICAgbGV0IHJlc3BCdWY6IHN0cmluZyA9IG51bGw7XHJcbiAgLy9cclxuICAvLyAgIHRyeSB7XHJcbiAgLy8gICAgIHJlc3BCdWYgPSB0aGlzLkRpc3BhdGNoUmVxdWVzdCh0aGlzLlNlcnZlclVybCwgc3RyaW5nQnVpbGRlci5Ub1N0cmluZygpLCBDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2Vzc2lvblN0YWdlLk5PUk1BTCk7XHJcbiAgLy8gICB9XHJcbiAgLy8gICBjYXRjaCAoZXgpIHtcclxuICAvLyAgICAgLy8gZG8gbm90aGluZy4gaWYgc2VuZGluZyBsb2cgZmFpbHMsIHRoZXJlIGlzIG5vIGhhcm0uXHJcbiAgLy8gICB9XHJcbiAgLy9cclxuICAvLyAgIGlmIChyZXNwQnVmID09PSBudWxsKSB7XHJcbiAgLy8gICAgIHN1Y2Nlc3MgPSBmYWxzZTtcclxuICAvLyAgIH1cclxuICAvL1xyXG4gIC8vICAgcmV0dXJuIHN1Y2Nlc3M7XHJcbiAgLy8gfVxyXG5cclxuICAvLyBUT0RPOiBIYW5kbGUgcGVuZGluZyBsb2dzLlxyXG4gIC8vIHByaXZhdGUgc3RhdGljIERlbGV0ZVBlbmRpbmdMb2dzKCk6IHZvaWQge1xyXG4gIC8vICAgbGV0IGVudW1lcmF0b3I6IElFbnVtZXJhdG9yID0gQ2xpZW50TG9nQWNjdW11bGF0b3IuRXhpc3RpbmdMb2dJdGVyYXRvcigpO1xyXG4gIC8vICAgd2hpbGUgKGVudW1lcmF0b3IuTW92ZU5leHQoKSkge1xyXG4gIC8vICAgICBsZXQgZmlsZW5hbWU6IHN0cmluZyA9IDxzdHJpbmc+ZW51bWVyYXRvci5DdXJyZW50O1xyXG4gIC8vICAgICBIYW5kbGVGaWxlcy5kZWxldGVGaWxlKGZpbGVuYW1lKTtcclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gZ2V0IHRoZSBzdWZmaXggb2YgdGhlIFVSTCB0byBiZSBzZW50IHRvIHRoZSBzZXJ2ZXIuIFRoaXMgaW5jbHVkZXMgdGhlIENUWCwgU0VTU0lPTiBhbmQgREFUQSBwYXJhbWV0ZXJzLjwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJoYXNDb250ZW50XCI+aWYgdHJ1ZSwgdGhlIEhUVFAgREFUQSBwYXJhbWV0ZXIgY29udGFpbnMgc29tZXRoaW5nLjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaXNJbml0aWFsQ2FsbFwiPmlmIHRydWUgdGhlbiB0aGUgZ2VuZXJhdGVkIHN1ZmZpeCBoYXMgbm8gc3BlY2lmaWMgY29udGV4dCBkYXRhPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRoZSBVUkwgc3VmZml4IChpLmUuIFwiQ1RYPS4uLiZTRVNTSU9OPS4uLiZEQVRBPVwiPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgQnVpbGRVcmxTdWZmaXgoaGFzQ29udGVudDogYm9vbGVhbiwgaXNJbml0aWFsQ2FsbDogYm9vbGVhbik6IHN0cmluZyB7XHJcbiAgICBsZXQgcHJlZml4OiBzdHJpbmcgPSBDb25zdEludGVyZmFjZS5SQ19JTkRJQ0FUSU9OICsgQ29uc3RJbnRlcmZhY2UuUkNfVE9LRU5fQ1RYX0lEICsgUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLkNvbnRleHRJRDtcclxuXHJcbiAgICAvLyBBcHBlbmQgc2Vzc2lvbiBpZCBpbiB1cmwgb25seSB3aGVuIGl0IGlzIG5vdCBudWxsIG9yIGVtcHR5XHJcbiAgICAvLyBOT1RFOiBzZXNzaW9uIGlkIHdpbGwgYmUgc2VuZCBieSBzZXJ2ZXIgb25seSBmb3IgR1MgYXMgbWlkZGxld2FyZVxyXG4gICAgLy8gICAgICAgYW5kIHdoZW4gc2VwZWNpYWwgZmxhZyAoU3BlY2lhbFJJQUdlbmVyYXRlQW5kVmFsaWRhdGVTZXNzaW9uSUQpIGlzIG9uXHJcbiAgICAvLyAgICAgICBzbyBzZXNzaW9uIGlkIHdpbGwgYmUgbnVsbCBmb3IgYnJva2VyIG1pZGRsZXdhcmUgYW5kIHdoZW4gc3BlY2lhbCBmbGFnIGlzIE9GRi5cclxuICAgIGlmICghaXNOdWxsT3JVbmRlZmluZWQodGhpcy5TZXNzaW9uSWQpKVxyXG4gICAgICBwcmVmaXggKz0gKENvbnN0SW50ZXJmYWNlLlJFUV9BUkdfU0VQQVJBVE9SICsgQ29uc3RJbnRlcmZhY2UuUkNfVE9LRU5fU0VTU0lPTl9JRCArIHRoaXMuU2Vzc2lvbklkKTtcclxuXHJcbiAgICBpZiAoaXNJbml0aWFsQ2FsbCkge1xyXG4gICAgICAvLyBUT0RPOiBIb3cgdG8gZ2V0IGVudmlyb25tZW50IHZhcmlhYmxlcz9cclxuICAgICAgLy8gbGV0IGVudlZhcnM6IHN0cmluZyA9IENsaWVudE1hbmFnZXIuSW5zdGFuY2UuZ2V0RW52VmFycygpO1xyXG4gICAgICAvLyBpZiAoIU5TdHJpbmcuSXNOdWxsT3JFbXB0eShlbnZWYXJzKSkge1xyXG4gICAgICAvLyAgIC8vIGVudmlyb25tZW50IHZhcmlhYmxlczogRU5WMSxFTlYyLC4uIC0tPiAmRU5WMT12YWwxJkVOVjI9dmFsMi4uLlxyXG4gICAgICAvLyAgIGxldCBlbnZWYXJzVmVjOiBzdHJpbmdbXSA9IGVudlZhcnMuc3BsaXQoXCIsXCIpO1xyXG4gICAgICAvLyAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBlbnZWYXJzVmVjLmxlbmd0aDsgaSA9IGkgKyAxKSB7XHJcbiAgICAgIC8vICAgICBwcmVmaXggKz0gKFwiJlwiICsgZW52VmFyc1ZlY1tpXSArIFwiPVwiICsgT1NFbnZpcm9ubWVudC5nZXQoZW52VmFyc1ZlY1tpXSkpO1xyXG4gICAgICAvLyAgIH1cclxuICAgICAgLy8gfVxyXG4gICAgICBpZiAoUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuSXNTZXNzaW9uUmVJbml0aWFsaXppbmcpXHJcbiAgICAgICAgcHJlZml4ICs9IChDb25zdEludGVyZmFjZS5SRVFfQVJHX1NFUEFSQVRPUiArIENvbnN0SW50ZXJmYWNlLldFQkNMSUVOVF9SRUlOSVRJQUxJWkVfUkVRVUVTVCk7XHJcblxyXG4gICAgICBsZXQgZ2xvYmFsUGFyYW1zOiBzdHJpbmcgPSBTZXJ2ZXJDb25maWcuSW5zdGFuY2UuZ2V0R2xvYmFsUGFyYW1zKCk7XHJcbiAgICAgIGlmIChnbG9iYWxQYXJhbXMgIT09IG51bGwpIHtcclxuICAgICAgICBnbG9iYWxQYXJhbXMgPSBOU3RyaW5nLlJlcGxhY2UoZ2xvYmFsUGFyYW1zLCBcIitcIiwgXCIlMkJcIik7XHJcbiAgICAgICAgcHJlZml4ICs9IChcIiZcIiArIENvbnN0SW50ZXJmYWNlLk1HX1RBR19HTE9CQUxQQVJBTVMgKyBcIj1cIiArIGdsb2JhbFBhcmFtcyk7XHJcbiAgICAgIH1cclxuICAgIH0gLy8gaXNJbml0aWFsQ2FsbFxyXG5cclxuICAgIGlmIChoYXNDb250ZW50KSB7XHJcbiAgICAgIHByZWZpeCArPSAoXCImXCIgKyBDb25zdEludGVyZmFjZS5SQ19UT0tFTl9TRVNTSU9OX0NPVU5UICsgdGhpcy5HZXRTZXNzaW9uQ291bnRlcigpICtcclxuICAgICAgICBDb25zdEludGVyZmFjZS5SRVFfQVJHX1NFUEFSQVRPUiArIENvbnN0SW50ZXJmYWNlLlJDX1RPS0VOX0RBVEEpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBwcmVmaXg7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+c2VuZCBNb25pdG9yIG1lc3NhZ2luZyB0byB0aGUgc2VydmVyPC9zdW1tYXJ5PlxyXG4gIHB1YmxpYyBhc3luYyBTZW5kTW9uaXRvck9ubHkoKTogUHJvbWlzZTx2b2lkPlxyXG4gIHtcclxuICAgIGxldCBmbG93TW9uaXRvcjogRmxvd01vbml0b3JRdWV1ZSA9IEZsb3dNb25pdG9yUXVldWUuSW5zdGFuY2U7XHJcblxyXG4gICAgaWYgKEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZSA9PSBudWxsIHx8IEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5nZXRNR0RhdGEoMCkgPT0gbnVsbCB8fCBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuZ2V0TUdEYXRhKDApLklzQWJvcnRpbmcpXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBpZiAoIWZsb3dNb25pdG9yLmlzRW1wdHkoKSlcclxuICAgIHtcclxuICAgICAgLy8gYnVpbGQgb3V0IG1lc3NhZ2VcclxuICAgICAgbGV0IGJ1ZmZlcjogU3RyaW5nQnVpbGRlciA9IHRoaXMuQnVpbGRNb25pdG9yTWVzc2FnZSgpO1xyXG5cclxuICAgICAgLy8gSWYgY2xpZW50IHNlcXVlbmNlIGlzIHRvIGJlIGFjY3VtdWxhdGVkIHVudGlsIG5leHQgc2VydmVyIGFjY2Vzcy5cclxuICAgICAgbGV0IHNob3VsZEFjY3VtdWxhdGVDbGllbnRMb2c6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgICAgLy8gc2hvdWxkQWNjdW11bGF0ZUNsaWVudExvZyA9IENsaWVudE1hbmFnZXIuSW5zdGFuY2UuZ2V0TG9nQ2xpZW50U2VxdWVuY2VGb3JBY3Rpdml0eU1vbml0b3IoKTtcclxuICAgICAgLy8gaWYgKHNob3VsZEFjY3VtdWxhdGVDbGllbnRMb2cpIHtcclxuICAgICAgLy8gICBpZiAodGhpcy5fbG9nQWNjdW11bGF0b3IgPT0gbnVsbClcclxuICAgICAgLy8gICAgIHRoaXMuX2xvZ0FjY3VtdWxhdG9yID0gbmV3IENsaWVudExvZ0FjY3VtdWxhdG9yKENsaWVudE1hbmFnZXJSdW50aW1lLkluc3RhbmNlLlJ1bnRpbWVDdHguQ29udGV4dElEKTtcclxuICAgICAgLy9cclxuICAgICAgLy8gICAvLyBJZiB3ZSdyZSB1bmFibGUgdG8gb3BlbiB0aGUgZmlsZSwgZGVhY3RpdmF0ZSBsb2dnaW5nIGFjY3VtdWxhdGlvbixcclxuICAgICAgLy8gICAvLyAgICBhbmQgbGV0IHRoZSBtZXNzYWdlIGJlIHNlbnQgdG8gdGhlIHNlcnZlciBhcyBkb25lIHdpdGhvdXQgYWNjdW11bGF0ZWQgbG9nZ2luZ1xyXG4gICAgICAvLyAgIGlmICh0aGlzLl9sb2dBY2N1bXVsYXRvci5Jc0ZhaWxlZCgpKVxyXG4gICAgICAvLyAgICAgc2hvdWxkQWNjdW11bGF0ZUNsaWVudExvZyA9IGZhbHNlO1xyXG4gICAgICAvLyB9XHJcblxyXG4gICAgICBpZiAoc2hvdWxkQWNjdW11bGF0ZUNsaWVudExvZykge1xyXG4gICAgICAgIC8vIFdyaXRlIG1lc3NhZ2UgdG8gZmlsZS5cclxuICAgICAgICAvLyB0aGlzLl9sb2dBY2N1bXVsYXRvci5Xcml0ZShidWZmZXIuVG9TdHJpbmcoKSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIGxldCByZXF1ZXN0U3RhdHVzOiBSZWZQYXJhbTxSZXF1ZXN0U3RhdHVzPiA9IG5ldyBSZWZQYXJhbShSZXF1ZXN0U3RhdHVzLkhhbmRsZWQpO1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5EaXNwYXRjaFJlcXVlc3QodGhpcy5TZXJ2ZXJVcmwsIGJ1ZmZlci5Ub1N0cmluZygpLCBDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2Vzc2lvblN0YWdlLk5PUk1BTCwgcmVxdWVzdFN0YXR1cyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgIC8vIGRvIG5vdGhpbmcuIGlmIHNlbmRpbmcgbG9nIGZhaWxzLCB0aGVyZSBpcyBubyBoYXJtLlxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmJ1aWxkIEZsb3cgTW9uaXRvciBtZXNzYWdlPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgQnVpbGRNb25pdG9yTWVzc2FnZSgpOiBTdHJpbmdCdWlsZGVyIHtcclxuICAgIGxldCBidWZmZXI6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigxMDAwKTtcclxuICAgIGxldCBmbG93TW9uaXRvcjogRmxvd01vbml0b3JRdWV1ZSA9IEZsb3dNb25pdG9yUXVldWUuSW5zdGFuY2U7XHJcblxyXG4gICAgaWYgKCFSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5TaG91bGRTY3JhbWJsZUFuZFVuc2NyYW1ibGVNZXNzYWdlcykge1xyXG4gICAgICBidWZmZXIuQXBwZW5kKFhNTENvbnN0YW50cy5NR19UQUdfT1BFTik7XHJcbiAgICAgIGZsb3dNb25pdG9yLmJ1aWxkWE1MKGJ1ZmZlcik7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgZmxvd01vbml0b3IuYnVpbGRYTUwoYnVmZmVyKTtcclxuICAgICAgbGV0IHNjcmFtYmxlZE91dDogc3RyaW5nID0gU2NyYW1ibGVyLlNjcmFtYmxlKGJ1ZmZlci5Ub1N0cmluZygpKTtcclxuICAgICAgYnVmZmVyID0gbmV3IFN0cmluZ0J1aWxkZXIoMTAwMCk7XHJcbiAgICAgIGJ1ZmZlci5BcHBlbmQoWE1MQ29uc3RhbnRzLk1HX1RBR19PUEVOICsgc2NyYW1ibGVkT3V0KTtcclxuICAgIH1cclxuICAgIGJ1ZmZlci5BcHBlbmQoXCI8L1wiICsgWE1MQ29uc3RhbnRzLk1HX1RBR19YTUwgKyBYTUxDb25zdGFudHMuVEFHX0NMT1NFKTtcclxuXHJcbiAgICByZXR1cm4gYnVmZmVyO1xyXG4gIH1cclxuXHJcbiAgUmVnaXN0ZXJEZWxlZ2F0ZXMoKTogdm9pZCB7XHJcbiAgICBIdHRwQ2xpZW50RXZlbnRzLkdldFNlc3Npb25Db3VudGVyX0V2ZW50ID0gdGhpcy5HZXRTZXNzaW9uQ291bnRlci5iaW5kKHRoaXMpO1xyXG4gICAgSHR0cENsaWVudEV2ZW50cy5DaGVja0FuZFNldFNlc3Npb25Db3VudGVyX0V2ZW50ID0gdGhpcy5DaGVja0FuZFNldFNlc3Npb25Db3VudGVyLmJpbmQodGhpcyk7XHJcbiAgICBIdHRwQ2xpZW50RXZlbnRzLkNvbXB1dGVBbmRMb2dSZXF1ZXN0SW5mb19FdmVudCA9IHRoaXMuQ29tcHV0ZUFuZExvZ1JlcXVlc3RJbmZvLmJpbmQodGhpcyk7XHJcbiAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5TcGlubmVyU3RvcHBlZC5zdWJzY3JpYmUoY2xpZW50QnVzeVRpbWUgPT4gdGhpcy5DbGllbnRBY3RpdmF0ZWQoY2xpZW50QnVzeVRpbWUpKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gTG9nIHRoZSBjdXJyZW50IHJlcXVlc3QgaW5mb3JtYXRpb24gaW4gY29uc29sZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgQ29tcHV0ZUFuZExvZ1JlcXVlc3RJbmZvKGNvbnRlbnRMZW5ndGg6IG51bWJlciwgcm91bmRUcmlwOiBudW1iZXIsIGlzTG9nZ2luZ1Jlc3BvbnNlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZighaXNOdWxsT3JVbmRlZmluZWQodGhpcy5fcmVxdWVzdEluZm8uc2VydmVyQ2FsbEF0KSkge1xyXG5cclxuICAgICAgdGhpcy5fcmVxdWVzdEluZm8uZXh0cmFJbmZvLmNvbnRlbnRMZW5ndGggPSBjb250ZW50TGVuZ3RoO1xyXG4gICAgICB0aGlzLl9yZXF1ZXN0SW5mby5leHRyYUluZm8udGltZVN0YW1wID0gbmV3IERhdGUoKS50b1N0cmluZygpO1xyXG4gICAgICBsZXQgZXh0cmFNZXNzYWdlU3RyOiBzdHJpbmcgPSBpc0xvZ2dpbmdSZXNwb25zZT8gJ1Jlc3BvbnNlIOKktScgOiAnUmVxdWVzdCDipLUnO1xyXG5cclxuICAgICAgaWYgKGlzTG9nZ2luZ1Jlc3BvbnNlKSB7XHJcbiAgICAgICAgdGhpcy5fcmVxdWVzdEluZm8ucm91bmR0cmlwVGltZSA9IHJvdW5kVHJpcDtcclxuICAgICAgICBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci50b3RhbFRpbWVGb3JIVFRQUmVxdWVzdHMgKz0gcm91bmRUcmlwOyAvLyBhZGQgdGhlIHJlcXVlc3QgdGltZSB0byB0b3RhbCB0aW1lXHJcbiAgICAgIH0gZWxzZVxyXG4gICAgICAgIFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLnRvdGFsUmVxdWVzdERhdGFMZW5ndGggKz0gY29udGVudExlbmd0aDsgLy8gYWRkIHRoZSByZXF1ZXN0IGNvbnRlbnQgdG8gdG90YWwgdGltZVxyXG5cclxuXHJcbiAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZVJlcXVlc3RJbmZvVG9Mb2codGhpcy5fcmVxdWVzdEluZm8sIGV4dHJhTWVzc2FnZVN0cik7XHJcblxyXG4gICAgICAvLyBDbGVhciB0aGUgY2xpZW50IHNlc3Npb24gYWZ0ZXIgbG9nZ2luZyB0aGUgcmVzcG9uc2VcclxuICAgICAgaWYgKGlzTG9nZ2luZ1Jlc3BvbnNlKVxyXG4gICAgICAgIHRoaXMuX3JlcXVlc3RJbmZvLmNsZWFyKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFdoZW4gdHJ1ZSwgcmVxdWVzdHMgYXJlIHNjcmFtYmxlZCBhbmQgcmVzcG9uc2VzIGFyZSB1bnNjcmFtYmxlZC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHN0YXRpYyBzZXQgU2hvdWxkU2NyYW1ibGVBbmRVbnNjcmFtYmxlTWVzc2FnZXModmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLl9zaG91bGRTY3JhbWJsZUFuZFVuc2NyYW1ibGVNZXNzYWdlcyA9IHZhbHVlO1xyXG4gICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlU2VydmVyTWVzc2FnZXNUb0xvZyhOU3RyaW5nLkZvcm1hdChcIlNob3VsZFNjcmFtYmxlQW5kVW5zY3JhbWJsZU1lc3NhZ2VzLlNldDogezB9XCIsIHRoaXMuX3Nob3VsZFNjcmFtYmxlQW5kVW5zY3JhbWJsZU1lc3NhZ2VzKSk7XHJcbiAgfVxyXG4gIHN0YXRpYyBnZXQgU2hvdWxkU2NyYW1ibGVBbmRVbnNjcmFtYmxlTWVzc2FnZXMoKTogYm9vbGVhbiB7XHJcbiAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVTZXJ2ZXJNZXNzYWdlc1RvTG9nKE5TdHJpbmcuRm9ybWF0KFwiU2hvdWxkU2NyYW1ibGVBbmRVbnNjcmFtYmxlTWVzc2FnZXMuR2V0OiB7MH1cIiwgdGhpcy5fc2hvdWxkU2NyYW1ibGVBbmRVbnNjcmFtYmxlTWVzc2FnZXMpKTtcclxuICAgIHJldHVybiBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5fc2hvdWxkU2NyYW1ibGVBbmRVbnNjcmFtYmxlTWVzc2FnZXM7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PnBhcnNlIHRoZSBsb2cgbGV2ZWwgZnJvbSBhIHN0cmluZyB2YWx1ZTwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzdHJMb2dMZXZlbFwiPnN0cmluZyB2YWx1ZSBvZiB0aGUgbG9nIGxldmVsPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+bG9nIGxldmVsPC9yZXR1cm5zPlxyXG4gIHBhcnNlTG9nTGV2ZWwoc3RyTG9nTGV2ZWw6IHN0cmluZyk6IExvZ2dlcl9Mb2dMZXZlbHMge1xyXG4gICAgbGV0IGxvZ0xldmVsOiBMb2dnZXJfTG9nTGV2ZWxzID0gTG9nZ2VyX0xvZ0xldmVscy5Ob25lO1xyXG5cclxuICAgIGlmICghTlN0cmluZy5Jc051bGxPckVtcHR5KHN0ckxvZ0xldmVsKSkge1xyXG4gICAgICBpZiAoc3RyTG9nTGV2ZWwudG9VcHBlckNhc2UoKS5zdGFydHNXaXRoKCBcIlNFUlZFUlwiKSlcclxuICAgICAgICBsb2dMZXZlbCA9IHN0ckxvZ0xldmVsLmVuZHNXaXRoKFwiI1wiKSA/IExvZ2dlcl9Mb2dMZXZlbHMuU2VydmVyTWVzc2FnZXMgOiBMb2dnZXJfTG9nTGV2ZWxzLlNlcnZlcjsgLy8gb25seSByZXF1ZXN0cyB0byB0aGUgc2VydmVyXHJcbiAgICAgIGVsc2UgaWYgKHN0ckxvZ0xldmVsLnRvVXBwZXJDYXNlKCkuc3RhcnRzV2l0aChcIlNcIikgfHwgc3RyTG9nTGV2ZWwudG9VcHBlckNhc2UoKS5zdGFydHNXaXRoKFwiUVwiKSlcclxuICAgICAgICBsb2dMZXZlbCA9IExvZ2dlcl9Mb2dMZXZlbHMuU3VwcG9ydDtcclxuICAgICAgZWxzZSBpZiAoc3RyTG9nTGV2ZWwudG9VcHBlckNhc2UoKS5zdGFydHNXaXRoKFwiR1wiKSlcclxuICAgICAgICBsb2dMZXZlbCA9IExvZ2dlcl9Mb2dMZXZlbHMuR3VpO1xyXG4gICAgICBlbHNlIGlmIChzdHJMb2dMZXZlbC50b1VwcGVyQ2FzZSgpLnN0YXJ0c1dpdGgoXCJEXCIpKVxyXG4gICAgICAgIGxvZ0xldmVsID0gTG9nZ2VyX0xvZ0xldmVscy5EZXZlbG9wbWVudDtcclxuICAgICAgZWxzZSBpZiAoc3RyTG9nTGV2ZWwudG9VcHBlckNhc2UoKS5zdGFydHNXaXRoKFwiQlwiKSlcclxuICAgICAgICBsb2dMZXZlbCA9IExvZ2dlcl9Mb2dMZXZlbHMuQmFzaWM7XHJcbiAgICAgIGVsc2UgaWYgKHN0ckxvZ0xldmVsLnRvVXBwZXJDYXNlKCkuc3RhcnRzV2l0aChcIlJcIikpXHJcbiAgICAgICAgbG9nTGV2ZWwgPSBMb2dnZXJfTG9nTGV2ZWxzLlJlcXVlc3RJbmZvO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBsb2dMZXZlbDtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+IGJ1aWxkIHRoZSBYTUwgc3RyaW5nIG9mIHRoZSBkYXRhIHRoYXQgc2hvdWxkIGJlIHNlbnQgdG8gdGhlIHNlcnZlcjwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzZXJpYWxpemVUYXNrc1wiPmlmIHRydWUsIHRhc2tzIGluIHRoZSBjdXJyZW50IGV4ZWN1dGlvbiB3aWxsIGFsc28gYmUgc2VyaWFsaXplZC48L3BhcmFtPlxyXG4gIGFzeW5jIFByZXBhcmVSZXF1ZXN0KHNlcmlhbGl6ZVRhc2tzOiBib29sZWFuKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIGxldCB4bWxCdWY6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpO1xyXG4gICAgeG1sQnVmLkFwcGVuZChYTUxDb25zdGFudHMuTUdfVEFHX09QRU4pO1xyXG5cclxuICAgIC8vIHRoZSBjbGllbnQgbm8gbG9uZ2VyIHNlbmRzIChhbmQgZW1wdGllcykgdGhlIGV2ZW50IHF1ZXVlIHRvIHRoZSBzZXJ2ZXJcclxuICAgIC8vIHNpbmNlIHRoZSBzZXJ2ZXIgaGFzIG5vdGhpbmcgdXNlZnVsIHRvIGRvIHdpdGggdGhlIGNsaWVudCBwZW5kaW5nIGV2ZW50c1xyXG4gICAgaWYgKEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5nZXRDdXJyTUdEYXRhKCkgIT09IG51bGwpIHtcclxuICAgICAgbGV0IHhtbFVuc2NyYW1ibGVkOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLmJ1aWxkWE1MKHhtbFVuc2NyYW1ibGVkLCBzZXJpYWxpemVUYXNrcyk7XHJcblxyXG4gICAgICBpZiAoUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuU2hvdWxkU2NyYW1ibGVBbmRVbnNjcmFtYmxlTWVzc2FnZXMpXHJcbiAgICAgICAgeG1sQnVmLkFwcGVuZChTY3JhbWJsZXIuU2NyYW1ibGUoeG1sVW5zY3JhbWJsZWQuVG9TdHJpbmcoKSkpO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgeG1sQnVmLkFwcGVuZCh4bWxVbnNjcmFtYmxlZC5Ub1N0cmluZygpKTtcclxuICAgIH1cclxuICAgIHhtbEJ1Zi5BcHBlbmQoXCI8L1wiICsgWE1MQ29uc3RhbnRzLk1HX1RBR19YTUwgKyBYTUxDb25zdGFudHMuVEFHX0NMT1NFKTtcclxuXHJcbiAgICByZXR1cm4geG1sQnVmLlRvU3RyaW5nKCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PnBhcnNlIGEgcmVzcG9uc2UgKGZyb20gdGhlIFNlcnZlcikgYW5kIGV4ZWN1dGUgY29tbWFuZHMgaWYgcmV0dXJuZWQgd2l0aGluIHRoZSByZXNwb25zZS48L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicmVzcG9uc2VcIj4oWE1MIGZvcm1hdHRlZCkgcmVzcG9uc2UuPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdXJyTWdkSURcIj5udW1iZXIgb2Ygd2luZG93IGluIGdsb2JhbCBhcnJheTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwib3BlbmluZ1Rhc2tEZXRhaWxzXCI+YWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvZiBvcGVuaW5nIHRhc2s8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInJlc1wiPnJlc3VsdCB0byBiZSByZWFkIGZyb20gY29tbWFuZCByZXR1cm5lZCB3aXRpbiB0aGUgcmVzcG9uc2UuPC9wYXJhbT5cclxuICBhc3luYyBQcm9jZXNzUmVzcG9uc2UocmVzcG9uc2U6IHN0cmluZywgY3Vyck1nZElEOiBudW1iZXIsIG9wZW5pbmdUYXNrRGV0YWlsczogT3BlbmluZ1Rhc2tEZXRhaWxzLCByZXM6IElSZXN1bHRWYWx1ZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coXCI8LS0gUHJvY2Vzc1Jlc3BvbnNlIHN0YXJ0ZWQgLS0+XCIpO1xyXG4gICAgaWYob3BlbmluZ1Rhc2tEZXRhaWxzID09PSBudWxsKVxyXG4gICAgICBvcGVuaW5nVGFza0RldGFpbHMgPSBuZXcgT3BlbmluZ1Rhc2tEZXRhaWxzKCk7XHJcblxyXG4gICAgbGV0IHN5c3RlbU1pbGxpc2Vjb25kczogbnVtYmVyID0gTWlzYy5nZXRTeXN0ZW1NaWxsaXNlY29uZHMoKTtcclxuICAgIGlmIChyZXNwb25zZSA9PT0gbnVsbCB8fCByZXNwb25zZS50cmltKCkubGVuZ3RoID09PSAwKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLmN1cnJNZ2RJRCA9IGN1cnJNZ2RJRDtcclxuXHJcbiAgICBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuUGFyc2VyLnB1c2goKTsgLy8gYWxsb3cgcmVjdXJzaXZlIHBhcnNpbmdcclxuICAgIFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5QYXJzZXIuc2V0WE1MZGF0YShyZXNwb25zZSk7XHJcbiAgICBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuUGFyc2VyLnNldEN1cnJJbmRleCgwKTtcclxuXHJcbiAgICBsZXQgY3Vyck1HRGF0YTogTUdEYXRhID0gQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLmdldEN1cnJNR0RhdGEoKTtcclxuICAgIGF3YWl0IGN1cnJNR0RhdGEuZmlsbERhdGEob3BlbmluZ1Rhc2tEZXRhaWxzLCBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuUGFyc2VyKTtcclxuXHJcbiAgICAvLyBmcmVlIG1lbW9yeVxyXG4gICAgUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLlBhcnNlci5zZXRYTUxkYXRhKG51bGwpO1xyXG4gICAgUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLlBhcnNlci5wb3AoKTtcclxuXHJcbiAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhcIjwtLSBQcm9jZXNzUmVzcG9uc2UgZmluaXNoZWQgLS0+IChcIiArIChNaXNjLmdldFN5c3RlbU1pbGxpc2Vjb25kcygpIC0gc3lzdGVtTWlsbGlzZWNvbmRzKSArIFwiKVwiKTtcclxuICAgIC8vIGV4ZWN1dGUgdGhlIGNvbW1hbmRzIHRoYXQgd2VyZSByZXR1cm5lZCBpbiB0aGUgcmVzcG9uc2VcclxuICAgIGF3YWl0KDxDb21tYW5kc1RhYmxlPmN1cnJNR0RhdGEuQ21kc1RvQ2xpZW50KS5FeGVjdXRlKHJlcyk7XHJcbiAgICBhd2FpdCB0aGlzLlByb2Nlc3NSZWNvdmVyeSgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBwcm9jZXNzUmVjb3ZlcnlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIFByb2Nlc3NSZWNvdmVyeSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuXHJcbiAgICAvLyBRQ1IgIzc3MTAxMiAtIHByb2Nlc3MgZGF0YSBlcnJvciByZWNvdmVyeSBvbmx5IGFmdGVyIHRoZSBwYXJzaW5nIHByb2Nlc3MgaXMgb3Zlci5cclxuICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnB1c2hOZXdFeGVjU3RhY2tzKCk7XHJcbiAgICBhd2FpdCBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUucHJvY2Vzc1JlY292ZXJ5KCk7XHJcbiAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5wb3BOZXdFeGVjU3RhY2tzKCk7XHJcbiAgfVxyXG59XHJcblxyXG4vLy8gPHN1bW1hcnk+aGVscGVyIGNsYXNzOiBkZXRhaWxzIGZyb20gdGhlIHJ1bnRpbWUtZW5naW5lIC0gZW52aXJvbm1lbnQgdmFsdWVzLlxyXG4vLy8gSGFuZHNoYWtlIHJlc3BvbnNlOiA8UmljaGNsaWVudHJlc3BvbnNlPiA8Q29udGV4dElEPi4uLjwvQ29udGV4dElEPiA8RW52aXJvbm1lbnQgSW5wdXRQYXNzd29yZD1cIll8TlwiXHJcbi8vLyBTeXN0ZW1Mb2dpbj1cIkZ8TnxEfExcIiAvPiA8L1JpY2hjbGllbnRyZXNwb25zZT5cclxuLy8vIDwvc3VtbWFyeT5cclxuY2xhc3MgSGFuZHNoYWtlUmVzcG9uc2Uge1xyXG4gIHN0YXRpYyByZWFkb25seSBTWVNURU1fTE9HSU5fQUQ6IHN0cmluZyA9ICdEJztcclxuXHJcbiAgcHJpdmF0ZSBfc2NyYW1ibGVNZXNzYWdlczogYm9vbGVhbiA9IHRydWU7IC8vIHRydWUgaWYgbWVzc2FnZXMgc2hvdWxkIGJlIHNjcmFtYmxlZC91bnNjcmFtYmxlZCBieSB0aGUgY2xpZW50IGFuZCBzZXJ2ZXJcclxuICBnZXQgU2NyYW1ibGVNZXNzYWdlcygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9zY3JhbWJsZU1lc3NhZ2VzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY29udGV4dElkOiBzdHJpbmcgPSBudWxsO1xyXG4gIGdldCBDb250ZXh0SWQoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9jb250ZXh0SWQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9wcml2YXRlU2Vzc2lvbklkOiBzdHJpbmcgPSBudWxsO1xyXG4gIGdldCBHZXRTZXNzaW9uSWQoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9wcml2YXRlU2Vzc2lvbklkO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaW5wdXRQYXNzd29yZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGdldCBJbnB1dFBhc3N3b3JkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lucHV0UGFzc3dvcmQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9odHRwVGltZW91dDogbnVtYmVyID0gMDtcclxuICBnZXQgSHR0cFRpbWVvdXQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9odHRwVGltZW91dDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3N5c3RlbUxvZ2luOiBzdHJpbmcgPSBudWxsO1xyXG4gIGdldCBTeXN0ZW1Mb2dpbigpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX3N5c3RlbUxvZ2luO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfbWF4SW50ZXJuYWxMb2dMZXZlbDogc3RyaW5nID0gbnVsbDtcclxuICBnZXQgTWF4SW50ZXJuYWxMb2dMZXZlbCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX21heEludGVybmFsTG9nTGV2ZWw7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihyZXNwb25zZVhNTDogc3RyaW5nKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICBKU09OX1V0aWxzLkpTT05Gcm9tWE1MKHJlc3BvbnNlWE1MLCB0aGlzLkZpbGxGcm9tSlNPTi5iaW5kKHRoaXMpKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChleCkge1xyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZyhleCwgcmVzcG9uc2VYTUwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBGaWxsRnJvbUpTT04gKGVycm9yLCByZXN1bHQpOiB2b2lkIHtcclxuXHJcbiAgICAvLyBJZiB0aGVyZSB3YXMgYW4gZXJyb3IgaW4gcGFyc2luZyB0aGUgWE1MLFxyXG4gICAgaWYgKGVycm9yICE9IG51bGwpIHtcclxuICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHJlc3BvbnNlID0gcmVzdWx0WydSaWNoY2xpZW50cmVzcG9uc2UnXTtcclxuXHJcbiAgICBmb3IgKGxldCBlbGVtZW50TmFtZSBpbiByZXNwb25zZSkge1xyXG4gICAgICBpZiAocmVzcG9uc2UuaGFzT3duUHJvcGVydHkoZWxlbWVudE5hbWUpKSB7XHJcblxyXG4gICAgICAgIHN3aXRjaCAoZWxlbWVudE5hbWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgY2FzZSBcIkNvbnRleHRJRFwiOlxyXG4gICAgICAgICAgICB0aGlzLl9jb250ZXh0SWQgPSByZXNwb25zZVtlbGVtZW50TmFtZV1bMF07XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBcIlNlc3Npb25JRFwiOlxyXG4gICAgICAgICAgICB0aGlzLl9wcml2YXRlU2Vzc2lvbklkID0gcmVzcG9uc2VbZWxlbWVudE5hbWVdWzBdO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgXCJFbnZpcm9ubWVudFwiOlxyXG4gICAgICAgICAgICBsZXQgZW52QXR0cmlidXRlcyA9IHJlc3BvbnNlW1wiRW52aXJvbm1lbnRcIl1bMF1bJyQnXTtcclxuXHJcbiAgICAgICAgICAgIGlmICghaXNOdWxsT3JVbmRlZmluZWQoZW52QXR0cmlidXRlc1tcIlNjcmFtYmxlTWVzc2FnZXNcIl0pKSB7XHJcbiAgICAgICAgICAgICAgRGVidWcuQXNzZXJ0KGVudkF0dHJpYnV0ZXNbXCJTY3JhbWJsZU1lc3NhZ2VzXCJdID09PSBcIk5cIik7XHJcbiAgICAgICAgICAgICAgdGhpcy5fc2NyYW1ibGVNZXNzYWdlcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghaXNOdWxsT3JVbmRlZmluZWQoZW52QXR0cmlidXRlc1tcIk1heEludGVybmFsTG9nTGV2ZWxcIl0pKVxyXG4gICAgICAgICAgICAgIHRoaXMuX21heEludGVybmFsTG9nTGV2ZWwgPSBlbnZBdHRyaWJ1dGVzW1wiTWF4SW50ZXJuYWxMb2dMZXZlbFwiXTtcclxuICAgICAgICAgICAgaWYgKCFpc051bGxPclVuZGVmaW5lZChlbnZBdHRyaWJ1dGVzW1wiSW5wdXRQYXNzd29yZFwiXSkgJiYgZW52QXR0cmlidXRlc1tcIklucHV0UGFzc3dvcmRcIl0udG9Mb2NhbGVMb3dlckNhc2UoKSA9PT0gXCJ5XCIpXHJcbiAgICAgICAgICAgICAgdGhpcy5faW5wdXRQYXNzd29yZCA9IHRydWU7XHJcbiAgICAgICAgICAgIGlmICghaXNOdWxsT3JVbmRlZmluZWQoZW52QXR0cmlidXRlc1tcIlN5c3RlbUxvZ2luXCJdKSlcclxuICAgICAgICAgICAgICB0aGlzLl9zeXN0ZW1Mb2dpbiA9IGVudkF0dHJpYnV0ZXNbXCJTeXN0ZW1Mb2dpblwiXTtcclxuICAgICAgICAgICAgaWYgKCFpc051bGxPclVuZGVmaW5lZChlbnZBdHRyaWJ1dGVzW0NvbnN0SW50ZXJmYWNlLk1HX1RBR19IVFRQX0NPTU1VTklDQVRJT05fVElNRU9VVF0pKVxyXG4gICAgICAgICAgICAgIHRoaXMuX2h0dHBUaW1lb3V0ID0gK2VudkF0dHJpYnV0ZXNbQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0hUVFBfQ09NTVVOSUNBVElPTl9USU1FT1VUXTtcclxuICAgICAgICAgICAgaWYgKCFpc051bGxPclVuZGVmaW5lZChlbnZBdHRyaWJ1dGVzW1wiRm9yd2FyZFNsYXNoXCJdKSlcclxuICAgICAgICAgICAgICBBY2Nlc3NIZWxwZXIuZW52aXJvbm1lbnQuRm9yd2FyZFNsYXNoVXNhZ2UgPSBlbnZBdHRyaWJ1dGVzW1wiRm9yd2FyZFNsYXNoXCJdO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbi8vLyA8c3VtbWFyeT5UaGlzIGNsYXNzIGltcGxlbWVudHMgTWdTQVhIYW5kbGVySW50ZXJmYWNlLCB3aGljaCBtZWFucyB0aGF0IGl0IGRlZmluZXMgYWxsIHRoZSBcImNhbGxiYWNrXCJcclxuLy8vIG1ldGhvZHMgdGhhdCB0aGUgU0FYIHBhcnNlciB3aWxsIGludm9rZSB0byBub3RpZnkgdGhlIGFwcGxpY2F0aW9uLiBJbiB0aGlzIGV4YW1wbGUgd2Ugb3ZlcnJpZGUgdGhlXHJcbi8vLyBtZXRob2RzIHRoYXQgd2UgcmVxdWlyZS48L3N1bW1hcnk+XHJcbmNsYXNzIEVycm9yTWVzc2FnZVhtbCB7XHJcbiAgcHJpdmF0ZSBfbGFzdFJlcXVlc3RUaW1lOiBudW1iZXIgPSAwO1xyXG4gIGNvbnRleHRJbmFjdGl2aXR5VGltZW91dDogbnVtYmVyO1xyXG5cclxuICBwcml2YXRlIF9lcnJvck1lc3NhZ2U6IHN0cmluZyA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfZXJyb3JDb2RlOiBudW1iZXIgPSAwO1xyXG4gIHByaXZhdGUgX21pZGRsZXdhcmVBZGRyZXNzOiBzdHJpbmcgPSBudWxsO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgX3BhcnNpbmdGYWlsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgY29uc3RydWN0b3IoeG1sQ29udGVudDogc3RyaW5nLCBsYXN0UmVxdWVzdFRpbWU6IG51bWJlciwgY29udGV4dEluYWN0aXZpdHlUaW1lb3V0OiBudW1iZXIpIHtcclxuICAgIHRoaXMuX2xhc3RSZXF1ZXN0VGltZSA9IGxhc3RSZXF1ZXN0VGltZTtcclxuICAgIHRoaXMuY29udGV4dEluYWN0aXZpdHlUaW1lb3V0ID0gY29udGV4dEluYWN0aXZpdHlUaW1lb3V0O1xyXG4gICAgdHJ5IHtcclxuICAgICAgSlNPTl9VdGlscy5KU09ORnJvbVhNTCh4bWxDb250ZW50LCB0aGlzLkZpbGxGcm9tSlNPTi5iaW5kKHRoaXMpKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChleCkge1xyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZyhleCk7XHJcbiAgICAgIE1pc2MuV3JpdGVTdGFja1RyYWNlKGV4KTtcclxuICAgICAgdGhpcy5fcGFyc2luZ0ZhaWxlZCA9IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIEZpbGxGcm9tSlNPTiAoZXJyb3IsIHJlc3VsdCk6IHZvaWQge1xyXG5cclxuICAgIC8vIElmIHRoZXJlIHdhcyBhbiBlcnJvciBpbiBwYXJzaW5nIHRoZSBYTUwsXHJcbiAgICBpZiAoZXJyb3IgIT0gbnVsbCkge1xyXG4gICAgICB0aHJvdyBlcnJvcjtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgeG1sZXJyID0gcmVzdWx0Wyd4bWxlcnInXTtcclxuXHJcbiAgICBmb3IgKGxldCBlbGVtZW50TmFtZSBpbiB4bWxlcnIpIHtcclxuICAgICAgaWYgKHhtbGVyci5oYXNPd25Qcm9wZXJ0eShlbGVtZW50TmFtZSkpIHtcclxuICAgICAgICBzd2l0Y2ggKGVsZW1lbnROYW1lKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGNhc2UgXCJlcnJtc2dcIjpcclxuICAgICAgICAgICAgdGhpcy5fZXJyb3JNZXNzYWdlID0geG1sZXJyW2VsZW1lbnROYW1lXVswXTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIFwiZXJyY29kZVwiOlxyXG4gICAgICAgICAgICB0aGlzLl9lcnJvckNvZGUgPSArKHhtbGVycltlbGVtZW50TmFtZV0pO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgXCJzZXJ2ZXJcIjpcclxuICAgICAgICAgICAgdGhpcy5fbWlkZGxld2FyZUFkZHJlc3MgPSB4bWxlcnJbZWxlbWVudE5hbWVdWzBdO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgXCJhcHBuYW1lXCI6IC8vIGlnbm9yZWQgLSB0aGUgY2xpZW50IGxpc3RzIHRoaXMgdmFsdWUgZnJvbSB0aGUgZXhlY3V0aW9uIHByb3BlcnRpZXNcclxuICAgICAgICAgIGNhc2UgXCJwcmduYW1lXCI6IC8vIGlnbm9yZWQgLSB0aGUgY2xpZW50IGxpc3RzIHRoaXMgdmFsdWUgZnJvbSB0aGUgZXhlY3V0aW9uIHByb3BlcnRpZXNcclxuICAgICAgICAgIGNhc2UgXCJhcmd1bWVudHNcIjogLy8gaWdub3JlZFxyXG4gICAgICAgICAgY2FzZSBcInVzZXJuYW1lXCI6ICAvLyBpZ25vcmVkXHJcbiAgICAgICAgICBjYXNlIFwieG1sZXJyXCI6IC8vIGVuZCBvZiB0aGUgZXJyb3IgbWVzc2FnZVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nV2l0aE1zZyhOU3RyaW5nLkZvcm1hdChcIlVua25vd24gZWxlbWVudDogJ3swfSdcIiwgZWxlbWVudE5hbWUpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBHZXRDb2RlKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fZXJyb3JDb2RlO1xyXG4gIH1cclxuXHJcbiAgLy8gYnVpbGQgJiByZXR1cm4gYSBmb3JtYXR0ZWQgZXJyb3IgbWVzc2FnZVxyXG4gIEdldE1lc3NhZ2UoKTogc3RyaW5nIHtcclxuICAgIGxldCBzYjogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7XHJcblxyXG4gICAgaWYgKHRoaXMuX3BhcnNpbmdGYWlsZWQpIHtcclxuICAgICAgc2IuQXBwZW5kKEFjY2Vzc0hlbHBlci5sYW5ndWFnZURhdGEuZ2V0Q29uc3RNZXNzYWdlKE1zZ0ludGVyZmFjZS5SQ19TVFJfRjdfVU5FWFBFQ1RFRF9FUlIpKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBzd2l0Y2ggKHRoaXMuX2Vycm9yQ29kZSkge1xyXG4gICAgICAgIGNhc2UgU2VydmVyRXJyb3IuRVJSX0NUWF9OT1RfRk9VTkQ6XHJcbiAgICAgICAgICBpZiAodGhpcy5JbmFjdGl2aXR5VGltZW91dEV4cGlyZWQoKSlcclxuICAgICAgICAgICAgc2IuQXBwZW5kKE5TdHJpbmcuRm9ybWF0KFwiezB9ICh7MX0gezJ9KVwiLFxyXG4gICAgICAgICAgICAgIEFjY2Vzc0hlbHBlci5sYW5ndWFnZURhdGEuZ2V0Q29uc3RNZXNzYWdlKE1zZ0ludGVyZmFjZS5TVFJfRVJSX1NFU1NJT05fQ0xPU0VEX0lOQUNUSVZJVFkpLFxyXG4gICAgICAgICAgICAgIE1hdGguZmxvb3IodGhpcy5jb250ZXh0SW5hY3Rpdml0eVRpbWVvdXQgLyA2MDApLCAvLyBjb252ZXJzaW9uIGZyb20gMS8xMCBvZiBzZWNvbmRzIHRvIG1pbnV0ZXNcclxuICAgICAgICAgICAgICBBY2Nlc3NIZWxwZXIubGFuZ3VhZ2VEYXRhLmdldENvbnN0TWVzc2FnZShNc2dJbnRlcmZhY2UuU1RSX01JTlVURVMpKSk7XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHNiLkFwcGVuZChOU3RyaW5nLkZvcm1hdChcInswfSAoezF9KS5cIiwgQWNjZXNzSGVscGVyLmxhbmd1YWdlRGF0YS5nZXRDb25zdE1lc3NhZ2UoTXNnSW50ZXJmYWNlLlNUUl9FUlJfU0VTU0lPTl9DTE9TRUQpLCB0aGlzLl9lcnJvckNvZGUpKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFNlcnZlckVycm9yLkVSUl9XRUJDTElFTlRfUFJPR1JBTV9SRUxPQURFRDpcclxuICAgICAgICAgIHNiLkFwcGVuZChBY2Nlc3NIZWxwZXIubGFuZ3VhZ2VEYXRhLmdldENvbnN0TWVzc2FnZShNc2dJbnRlcmZhY2UuU1RSX0VSUl9XRUJDTElFTlRfUFJPR1JBTV9SRUxPQURFRCkpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgU2VydmVyRXJyb3IuRVJSX0VYRUNVVEVEX1BST0dSQU1fQ0hBTkdFRDpcclxuICAgICAgICAgIHNiLkFwcGVuZChBY2Nlc3NIZWxwZXIubGFuZ3VhZ2VEYXRhLmdldENvbnN0TWVzc2FnZShNc2dJbnRlcmZhY2UuU1RSX0VSUl9FWEVDVVRFRF9QUk9HUkFNX0NIQU5HRUQpKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFNlcnZlckVycm9yLkVSUl9BVVRIRU5USUNBVElPTjpcclxuICAgICAgICAgIHNiLkFwcGVuZChBY2Nlc3NIZWxwZXIubGFuZ3VhZ2VEYXRhLmdldENvbnN0TWVzc2FnZShNc2dJbnRlcmZhY2UuVVNSSU5QX1NUUl9CQURQQVNTVykpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgU2VydmVyRXJyb3IuRVJSX0FDQ0VTU19ERU5JRUQ6XHJcbiAgICAgICAgICBzYi5BcHBlbmQoQWNjZXNzSGVscGVyLmxhbmd1YWdlRGF0YS5nZXRDb25zdE1lc3NhZ2UoTXNnSW50ZXJmYWNlLlNUUl9FUlJfQVVUSE9SSVpBVElPTl9GQUlMVVJFKSk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIHNiLkFwcGVuZCh0aGlzLl9lcnJvck1lc3NhZ2UpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHNiLkFwcGVuZChPU0Vudmlyb25tZW50LkVvbFNlcSArIE9TRW52aXJvbm1lbnQuRW9sU2VxKTtcclxuXHJcbiAgICAgIGlmICghU2VydmVyQ29uZmlnLkluc3RhbmNlLlNob3VsZERpc3BsYXlHZW5lcmljRXJyb3IoKSkge1xyXG4gICAgICAgIHNiLkFwcGVuZChBY2Nlc3NIZWxwZXIubGFuZ3VhZ2VEYXRhLmdldENvbnN0TWVzc2FnZShNc2dJbnRlcmZhY2UuQlJPV1NFUl9PUFRfSU5GT19TRVJWRVJfU1RSKSArIFwiOiAgIFwiKTtcclxuICAgICAgICBzYi5BcHBlbmQoU2VydmVyQ29uZmlnLkluc3RhbmNlLmdldFNlcnZlcigpKTtcclxuICAgICAgICBpZiAoIU5TdHJpbmcuSXNOdWxsT3JFbXB0eSh0aGlzLl9taWRkbGV3YXJlQWRkcmVzcykpIHtcclxuICAgICAgICAgIHNiLkFwcGVuZChcIiAtLT4gXCIpO1xyXG4gICAgICAgICAgc2IuQXBwZW5kKHRoaXMuX21pZGRsZXdhcmVBZGRyZXNzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2IuQXBwZW5kKE9TRW52aXJvbm1lbnQuRW9sU2VxKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgc2IuQXBwZW5kKEFjY2Vzc0hlbHBlci5sYW5ndWFnZURhdGEuZ2V0Q29uc3RNZXNzYWdlKE1zZ0ludGVyZmFjZS5UQVNLUlVMRV9TVFJfQVBQTElDQVRJT04pICsgXCI6ICAgXFxcIlwiKTtcclxuICAgICAgc2IuQXBwZW5kKFNlcnZlckNvbmZpZy5JbnN0YW5jZS5nZXRBcHBOYW1lKCkpO1xyXG4gICAgICBzYi5BcHBlbmQoXCJcXFwiIChcXFwiXCIpO1xyXG4gICAgICBzYi5BcHBlbmQoXCJcXFwiKVwiKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gc2IuVG9TdHJpbmcoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgSW5hY3Rpdml0eVRpbWVvdXRFeHBpcmVkKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGV4cGlyZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLmNvbnRleHRJbmFjdGl2aXR5VGltZW91dCA+IDApIHtcclxuICAgICAgbGV0IGN1cnJUaW1lTWlsbGk6IG51bWJlciA9IE1pc2MuZ2V0U3lzdGVtTWlsbGlzZWNvbmRzKCk7XHJcbiAgICAgIGV4cGlyZWQgPSAoKGN1cnJUaW1lTWlsbGkgLSB0aGlzLl9sYXN0UmVxdWVzdFRpbWUpID4gKHRoaXMuY29udGV4dEluYWN0aXZpdHlUaW1lb3V0ICogMTAwKSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZXhwaXJlZDtcclxuICB9XHJcbn1cclxuXHJcbi8vIFRPRE86IEltcGxlbWVudCB0aGlzIGNsYXNzXHJcbi8vIGNsYXNzIENsaWVudExvZ0FjY3VtdWxhdG9yIHtcclxuLy9cclxuLy8gICBwcml2YXRlIHN0YXRpYyBDTElFTlRfTE9HX0hEUl9NU0c6IHN0cmluZyA9IFwiQ2xpZW50IGxvZyBmaWxlXCI7XHJcbi8vICAgcHJpdmF0ZSBzdGF0aWMgX2V4aXN0aW5nTG9nTmFtZXM6IExpc3Q8c3RyaW5nPiA9IG5ldyBMaXN0PHN0cmluZz4oKTtcclxuLy8gICBwcml2YXRlIF9jbGllbnRMb2dPczogU3RyZWFtV3JpdGVyID0gbnVsbDtcclxuLy8gICBwcml2YXRlIF9jb250ZXh0SWQ6IG51bWJlciA9IDA7XHJcbi8vICAgcHJpdmF0ZSBfZmFpbGVkOiBib29sZWFuID0gZmFsc2U7XHJcbi8vICAgcHJpdmF0ZSBfZmlsZU5hbWU6IHN0cmluZyA9IG51bGw7XHJcbi8vXHJcbi8vICAgY29uc3RydWN0b3IoY29udGV4dElEOiBudW1iZXIpIHtcclxuLy8gICAgIHRoaXMuX2NvbnRleHRJZCA9IGNvbnRleHRJRDtcclxuLy8gICAgIHRoaXMuX2ZpbGVOYW1lID0gdGhpcy5CdWlsZEZpbGVOYW1lKCk7XHJcbi8vICAgICB0aGlzLk9wZW5Gb3JXcml0ZSgpO1xyXG4vLyAgIH1cclxuLy9cclxuLy8gICBXcml0ZShidWZmZXI6IHN0cmluZyk6IHZvaWQge1xyXG4vLyAgICAgdHJ5IHtcclxuLy8gICAgICAgbGV0IGZsYWc6IGJvb2xlYW4gPSAhdGhpcy5fZmFpbGVkO1xyXG4vLyAgICAgICBpZiAoIWZsYWcpIHtcclxuLy8gICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oXCJDbGllbnRMb2dTZXF1ZW5jZSA6IExvZ2luZyBjbGllbnQgc2VxdWVuY2UgaXMgZGVhY3RpdmF0ZWRcIik7XHJcbi8vICAgICAgIH1cclxuLy8gICAgICAgbGV0IGZsYWcyOiBib29sZWFuID0gdGhpcy5PcGVuRm9yV3JpdGUoKTtcclxuLy8gICAgICAgaWYgKGZsYWcyKSB7XHJcbi8vICAgICAgICAgdGhpcy5fY2xpZW50TG9nT3MuV3JpdGUoYnVmZmVyKTtcclxuLy8gICAgICAgICB0aGlzLl9jbGllbnRMb2dPcy5DbG9zZSgpO1xyXG4vLyAgICAgICAgIHRoaXMuX2NsaWVudExvZ09zID0gbnVsbDtcclxuLy8gICAgICAgICB0aGlzLk9wZW5Gb3JXcml0ZSgpO1xyXG4vLyAgICAgICB9XHJcbi8vICAgICB9XHJcbi8vICAgICBjYXRjaCAoZXgpIHtcclxuLy8gICAgICAgaWYgKGV4IGluc3RhbmNlb2YgSU9FeGNlcHRpb24pIHtcclxuLy8gICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhleC5NZXNzYWdlKTtcclxuLy8gICAgICAgICBNaXNjLldyaXRlU3RhY2tUcmFjZShleCwgTkNvbnNvbGUuRXJyb3IpO1xyXG4vLyAgICAgICB9XHJcbi8vICAgICAgIGVsc2VcclxuLy8gICAgICAgICB0aHJvdyBleDtcclxuLy8gICAgIH1cclxuLy8gICB9XHJcbi8vXHJcbi8vICAgUmVhZCgpOiBzdHJpbmcge1xyXG4vLyAgICAgbGV0IHJlc3VsdDogc3RyaW5nID0gbnVsbDtcclxuLy8gICAgIHRyeSB7XHJcbi8vICAgICAgIGxldCBmbGFnOiBib29sZWFuID0gIXRoaXMuX2ZhaWxlZDtcclxuLy8gICAgICAgaWYgKCFmbGFnKSB7XHJcbi8vICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKFwiQ2xpZW50TG9nU2VxdWVuY2UgOiBMb2dpbmcgY2xpZW50IHNlcXVlbmNlIGlzIGRlYWN0aXZhdGVkXCIpO1xyXG4vLyAgICAgICB9XHJcbi8vICAgICAgIHRoaXMuX2NsaWVudExvZ09zLkNsb3NlKCk7XHJcbi8vICAgICAgIHRoaXMuX2NsaWVudExvZ09zID0gbnVsbDtcclxuLy8gICAgICAgcmVzdWx0ID0gSGFuZGxlRmlsZXMucmVhZFRvU3RyaW5nKHRoaXMuX2ZpbGVOYW1lLCBFbmNvZGluZy5EZWZhdWx0KTtcclxuLy8gICAgICAgdGhpcy5PcGVuRm9yV3JpdGUoKTtcclxuLy8gICAgIH1cclxuLy8gICAgIGNhdGNoIChleCkge1xyXG4vLyAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBJT0V4Y2VwdGlvbikge1xyXG4vLyAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKGV4Lk1lc3NhZ2UpO1xyXG4vLyAgICAgICAgIE1pc2MuV3JpdGVTdGFja1RyYWNlKGV4LCBOQ29uc29sZS5FcnJvcik7XHJcbi8vICAgICAgIH1cclxuLy8gICAgICAgZWxzZVxyXG4vLyAgICAgICAgIHRocm93IGV4O1xyXG4vLyAgICAgfVxyXG4vLyAgICAgcmV0dXJuIHJlc3VsdDtcclxuLy8gICB9XHJcbi8vXHJcbi8vICAgUmVzZXQoKTogdm9pZCB7XHJcbi8vICAgICB0cnkge1xyXG4vLyAgICAgICBsZXQgZmxhZzogYm9vbGVhbiA9ICF0aGlzLl9mYWlsZWQ7XHJcbi8vICAgICAgIGlmICghZmxhZykge1xyXG4vLyAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihcIkNsaWVudExvZ1NlcXVlbmNlIDogTG9naW5nIGNsaWVudCBzZXF1ZW5jZSBpcyBkZWFjdGl2YXRlZFwiKTtcclxuLy8gICAgICAgfVxyXG4vLyAgICAgICB0aGlzLl9jbGllbnRMb2dPcy5DbG9zZSgpO1xyXG4vLyAgICAgICB0aGlzLl9jbGllbnRMb2dPcyA9IG51bGw7XHJcbi8vICAgICAgIEhhbmRsZUZpbGVzLmRlbGV0ZUZpbGUodGhpcy5fZmlsZU5hbWUpO1xyXG4vLyAgICAgfVxyXG4vLyAgICAgY2F0Y2ggKGV4KSB7XHJcbi8vICAgICAgIGlmIChleCBpbnN0YW5jZW9mIElPRXhjZXB0aW9uKSB7XHJcbi8vICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2coZXgpO1xyXG4vLyAgICAgICB9XHJcbi8vICAgICAgIGVsc2VcclxuLy8gICAgICAgICB0aHJvdyBleDtcclxuLy8gICAgIH1cclxuLy8gICB9XHJcbi8vXHJcbi8vICAgc3RhdGljIEV4aXN0aW5nTG9nc0ZvdW5kKCk6IGJvb2xlYW4ge1xyXG4vLyAgICAgbGV0IHJlc3VsdDogYm9vbGVhbiA9IGZhbHNlO1xyXG4vLyAgICAgQ2xpZW50TG9nQWNjdW11bGF0b3IuQnVpbGRleGlzdGluZ0xvZ0xpc3QoKTtcclxuLy8gICAgIGxldCBmbGFnOiBib29sZWFuID0gQ2xpZW50TG9nQWNjdW11bGF0b3IuX2V4aXN0aW5nTG9nTmFtZXMgIT09IG51bGwgJiYgQ2xpZW50TG9nQWNjdW11bGF0b3IuX2V4aXN0aW5nTG9nTmFtZXMuQ291bnQgPiAwO1xyXG4vLyAgICAgaWYgKGZsYWcpIHtcclxuLy8gICAgICAgcmVzdWx0ID0gdHJ1ZTtcclxuLy8gICAgIH1cclxuLy8gICAgIHJldHVybiByZXN1bHQ7XHJcbi8vICAgfVxyXG4vL1xyXG4vLyAgIHN0YXRpYyBFeGlzdGluZ0xvZ0l0ZXJhdG9yKCk6IElFbnVtZXJhdG9yPHN0cmluZz4ge1xyXG4vLyAgICAgcmV0dXJuIENsaWVudExvZ0FjY3VtdWxhdG9yLl9leGlzdGluZ0xvZ05hbWVzLkdldEVudW1lcmF0b3IoKTtcclxuLy8gICB9XHJcbi8vXHJcbi8vICAgc3RhdGljIEJ1aWxkTG9nSGVhZGVyTGluZShsb2dOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4vLyAgICAgbGV0IHN0cmluZ0J1aWxkZXI6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcihcIkNsaWVudCBsb2cgZmlsZVwiKTtcclxuLy8gICAgIGxldCBzdHI6IHN0cmluZyA9IE5TdHJpbmcuU3Vic3RyaW5nKGxvZ05hbWUsIGxvZ05hbWUuTGFzdEluZGV4T2YoTk51bWJlci5Ub1N0cmluZyhQYXRoLkRpcmVjdG9yeVNlcGFyYXRvckNoYXIpICsgXCJDU1wiKSArIDMsIGxvZ05hbWUuTGFzdEluZGV4T2YoXCIubG9nXCIpIC0gKGxvZ05hbWUuTGFzdEluZGV4T2YoTk51bWJlci5Ub1N0cmluZyhQYXRoLkRpcmVjdG9yeVNlcGFyYXRvckNoYXIpICsgXCJDU1wiKSArIDMpKTtcclxuLy8gICAgIHN0cmluZ0J1aWxkZXIuQXBwZW5kKFwiIChDb250ZXh0IDogXCIpO1xyXG4vLyAgICAgc3RyaW5nQnVpbGRlci5BcHBlbmQoc3RyICsgXCIgKSBcIik7XHJcbi8vICAgICByZXR1cm4gc3RyaW5nQnVpbGRlci5Ub1N0cmluZygpO1xyXG4vLyAgIH1cclxuLy9cclxuLy8gICBFbXB0eSgpOiBib29sZWFuIHtcclxuLy8gICAgIHJldHVybiB0aGlzLl9mYWlsZWQgfHwgIUhhbmRsZUZpbGVzLmlzRXhpc3RzKHRoaXMuX2ZpbGVOYW1lKSB8fCBIYW5kbGVGaWxlcy5nZXRGaWxlU2l6ZSh0aGlzLl9maWxlTmFtZSkgPT09IDA7XHJcbi8vICAgfVxyXG4vL1xyXG4vLyAgIElzRmFpbGVkKCk6IGJvb2xlYW4ge1xyXG4vLyAgICAgcmV0dXJuIHRoaXMuX2ZhaWxlZDtcclxuLy8gICB9XHJcbi8vXHJcbi8vICAgcHJpdmF0ZSBzdGF0aWMgQnVpbGRleGlzdGluZ0xvZ0xpc3QoKTogdm9pZCB7XHJcbi8vICAgICBsZXQgZmxhZzogYm9vbGVhbiA9IENsaWVudExvZ0FjY3VtdWxhdG9yLl9leGlzdGluZ0xvZ05hbWVzICE9PSBudWxsICYmIENsaWVudExvZ0FjY3VtdWxhdG9yLl9leGlzdGluZ0xvZ05hbWVzLkNvdW50ID09PSAwO1xyXG4vLyAgICAgaWYgKGZsYWcpIHtcclxuLy8gICAgICAgbGV0IHBhdGg6IHN0cmluZyA9IFwiXCI7XHJcbi8vICAgICAgIENsaWVudExvZ0FjY3VtdWxhdG9yLl9leGlzdGluZ0xvZ05hbWVzLkFkZFJhbmdlKE5BcnJheS5Ub0VudW1lcmFibGUoRGlyZWN0b3J5LkdldEZpbGVzKHBhdGgsIFwiQ1MqLkxPR1wiKSkpO1xyXG4vLyAgICAgfVxyXG4vLyAgIH1cclxuLy9cclxuLy8gICBwcml2YXRlIE9wZW5Gb3JXcml0ZSgpOiBib29sZWFuIHtcclxuLy8gICAgIGxldCBmbGFnOiBib29sZWFuID0gdGhpcy5fY2xpZW50TG9nT3MgPT09IG51bGw7XHJcbi8vICAgICBpZiAoZmxhZykge1xyXG4vLyAgICAgICB0cnkge1xyXG4vLyAgICAgICAgIHRoaXMuX2NsaWVudExvZ09zID0gbmV3IFN0cmVhbVdyaXRlcih0aGlzLl9maWxlTmFtZSwgdHJ1ZSwgRW5jb2RpbmcuRGVmYXVsdCk7XHJcbi8vICAgICAgICAgdGhpcy5fZmFpbGVkID0gZmFsc2U7XHJcbi8vICAgICAgIH1cclxuLy8gICAgICAgY2F0Y2ggKGV4KSB7XHJcbi8vICAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgSU9FeGNlcHRpb24pIHtcclxuLy8gICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKFwiQ2xpZW50TG9nU2VxdWVuY2VzIDogXCIgKyBleC5NZXNzYWdlKTtcclxuLy8gICAgICAgICAgIHRoaXMuX2ZhaWxlZCA9IHRydWU7XHJcbi8vICAgICAgICAgICB0aGlzLl9jbGllbnRMb2dPcyA9IG51bGw7XHJcbi8vICAgICAgICAgICB0aGlzLl9jb250ZXh0SWQgPSAtMTtcclxuLy8gICAgICAgICAgIHRoaXMuX2ZpbGVOYW1lID0gbnVsbDtcclxuLy8gICAgICAgICB9XHJcbi8vICAgICAgICAgZWxzZVxyXG4vLyAgICAgICAgICAgdGhyb3cgZXg7XHJcbi8vICAgICAgIH1cclxuLy8gICAgIH1cclxuLy8gICAgIHJldHVybiAhdGhpcy5fZmFpbGVkO1xyXG4vLyAgIH1cclxuLy9cclxuLy8gICBwcml2YXRlIEJ1aWxkRmlsZU5hbWUoKTogc3RyaW5nIHtcclxuLy8gICAgIHJldHVybiBcIlwiO1xyXG4vLyAgIH1cclxuLy8gfVxyXG4iXX0=
|
|
903
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lbmdpbmUvc3JjL3JlbW90ZS9SZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNMLE1BQU0sRUFDTixVQUFVLEVBQ1YsTUFBTSxFQUNOLGdCQUFnQixFQUNoQixJQUFJLEVBQ0osWUFBWSxFQUNaLGFBQWEsRUFBRSxPQUFPLEVBQ3RCLFlBQVksRUFDYixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUN4RyxPQUFPLEVBQ3dCLFFBQVEsRUFBRSxNQUFNLEVBQUUsMkJBQTJCLEVBQUUsa0JBQWtCLEVBQy9GLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLDRDQUE0QyxDQUFDO0FBRTNFLE9BQU8sRUFDTCxxQkFBcUIsRUFDckIsd0NBQXdDLEVBQ3hDLGtDQUFrQyxFQUNuQyxNQUFNLDBCQUEwQixDQUFDO0FBQ2xDLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUNoRCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDakQsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQzVDLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFMUMsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGtCQUFrQixFQUFZLE1BQU0sbUJBQW1CLENBQUM7QUFDakUsT0FBTyxFQUFDLGlCQUFpQixFQUFFLFdBQVcsRUFBQyxNQUFN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WUFBWSxDQUFDLHdCQUF3QixDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUM7WUFDdkcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7WUFDOUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNwQixFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ2xCO1FBRUQsT0FBTyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUVPLHdCQUF3QjtRQUM5QixJQUFJLE9BQU8sR0FBWSxLQUFLLENBQUM7UUFDN0IsSUFBSSxJQUFJLENBQUMsd0JBQXdCLEdBQUcsQ0FBQyxFQUFFO1lBQ3JDLElBQUksYUFBYSxHQUFXLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBQ3pELE9BQU8sR0FBRyxDQUFDLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLHdCQUF3QixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDN0Y7UUFDRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIEJhc2U2NCxcclxuICBKU09OX1V0aWxzLFxyXG4gIExvZ2dlcixcclxuICBMb2dnZXJfTG9nTGV2ZWxzLFxyXG4gIE1pc2MsXHJcbiAgTXNnSW50ZXJmYWNlLFxyXG4gIE9TRW52aXJvbm1lbnQsIFN0clV0aWwsXHJcbiAgWE1MQ29uc3RhbnRzXHJcbn0gZnJvbSBcIkBtYWdpYy14cGEvdXRpbHNcIjtcclxuaW1wb3J0IHtEZWJ1ZywgRW5jb2RpbmcsIE5TdHJpbmcsIFJlZlBhcmFtLCBTdHJpbmdCdWlsZGVyLCBFeGNlcHRpb24sIExpc3R9IGZyb20gXCJAbWFnaWMteHBhL21zY29yZWxpYlwiO1xyXG5pbXBvcnQge1xyXG4gIEF1dGhlbnRpY2F0aW9uRGlhbG9nSGFuZGxlciwgQ29tbWFuZHMsIFN0eWxlcywgVXNlcm5hbWVQYXNzd29yZENyZWRlbnRpYWxzLCBSdW50aW1lQ29udGV4dEJhc2VcclxufSBmcm9tIFwiQG1hZ2ljLXhwYS9ndWlcIjtcclxuaW1wb3J0IHtFeGVjT3BlckNvbW1hbmR9IGZyb20gJy4uL2NvbW1hbmRzL0NsaWVudFRvU2VydmVyL0V4ZWNPcGVyQ29tbWFuZCc7XHJcbmltcG9ydCB7VGFza30gZnJvbSAnLi4vdGFza3MvVGFzaydcclxuaW1wb3J0IHtcclxuICBDb21tYW5kc1Byb2Nlc3NvckJhc2UsXHJcbiAgQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1NlbmRpbmdJbnN0cnVjdGlvbixcclxuICBDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2Vzc2lvblN0YWdlXHJcbn0gZnJvbSBcIi4uL0NvbW1hbmRzUHJvY2Vzc29yQmFzZVwiO1xyXG5pbXBvcnQge0h0dHBNYW5hZ2VyfSBmcm9tIFwiLi4vaHR0cC9IdHRwTWFuYWdlclwiO1xyXG5pbXBvcnQge0NvbnN0SW50ZXJmYWNlfSBmcm9tIFwiLi4vQ29uc3RJbnRlcmZhY2VcIjtcclxuaW1wb3J0IHtTY3JhbWJsZXJ9IGZyb20gXCIuLi91dGlsL1NjcmFtYmxlclwiO1xyXG5pbXBvcnQge1NlcnZlckVycm9yfSBmcm9tIFwiLi9TZXJ2ZXJFcnJvclwiO1xyXG5pbXBvcnQge0lSZXN1bHRWYWx1ZX0gZnJvbSBcIi4uL3J0L0lSZXN1bHRWYWx1ZVwiO1xyXG5pbXBvcnQge0Zsb3dNb25pdG9yUXVldWV9IGZyb20gXCIuLi91dGlsL0Zsb3dNb25pdG9yUXVldWVcIjtcclxuaW1wb3J0IHsgT3BlbmluZ1Rhc2tEZXRhaWxzLCBUYXNrQmFzZSB9IGZyb20gXCIuLi90YXNrcy9UYXNrQmFzZVwiO1xyXG5pbXBvcnQge2lzTnVsbE9yVW5kZWZpbmVkLCBpc1VuZGVmaW5lZH0gZnJvbSBcInV0aWxcIjtcclxuaW1wb3J0IHtIdHRwVXRpbGl0eX0gZnJvbSBcIi4uL2h0dHAvY2xpZW50L0h0dHBVdGlsaXR5XCI7XHJcbmltcG9ydCB7SHR0cENsaWVudEV2ZW50c30gZnJvbSBcIi4uL2h0dHAvY2xpZW50L0h0dHBDbGllbnRFdmVudHNcIjtcclxuaW1wb3J0IHsgU2VydmVyQ29uZmlnIH0gZnJvbSBcIi4uL1NlcnZlckNvbmZpZ1wiO1xyXG5pbXBvcnQgeyBNR0RhdGEgfSBmcm9tIFwiLi4vdGFza3MvTUdEYXRhXCI7XHJcbmltcG9ydCB7IENvbW1hbmRzVGFibGUgfSBmcm9tIFwiLi4vQ29tbWFuZHNUYWJsZVwiO1xyXG5pbXBvcnQgeyBBY2Nlc3NIZWxwZXIgfSBmcm9tIFwiLi4vQWNjZXNzSGVscGVyXCI7XHJcbmltcG9ydCB7UmVxdWVzdEluZm99IGZyb20gXCJAbWFnaWMteHBhL3V0aWxzXCI7XHJcbmltcG9ydCB7XHJcbiAgRW52aXJvbm1lbnQsXHJcbiAgRXZlbnQsIEV2ZW50Q29tbWFuZCwgRXZlbnRzTWFuYWdlciwgR1VJTWFuYWdlciwgSUNsaWVudENvbW1hbmQsXHJcbiAgUnVuVGltZUV2ZW50XHJcbn0gZnJvbSBcIi4uLy4uL1wiO1xyXG5pbXBvcnQge0lDbGllbnRUb1NlcnZlckNvbW1hbmRJbmZvfSBmcm9tIFwiLi4vY29tbWFuZHMvSUNsaWVudFRvU2VydmVyQ29tbWFuZEluZm9cIjtcclxuaW1wb3J0IHtNR0RhdGFDb2xsZWN0aW9ufSBmcm9tIFwiLi4vdGFza3MvTUdEYXRhQ29sbGVjdGlvblwiO1xyXG5pbXBvcnQge1N1YnNjcmlwdGlvbiwgdGltZXJ9IGZyb20gXCJyeGpzXCI7XHJcblxyXG4vLy8gPHN1bW1hcnk+IFJlcHJlc2VudHMgdGhlIHN0YXR1cyBvZiBhIHJlcXVlc3QgPC9zdW1tYXJ5PlxyXG5lbnVtICBSZXF1ZXN0U3RhdHVzXHJcbntcclxuICBIYW5kbGVkLCAvL3RoZSByZXF1ZXN0IHdhcyBzdWNjZXNzZnVsbHkgaGFuZGxlZC5cclxuICBSZXRyeSwgICAvL3RoZSByZXF1ZXN0IHNob3VsZCBiZSByZS1zZW50LlxyXG4gIEFib3J0ICAgLy90aGUgcmVxdWVzdCBjb3VsZCBub3QgYmUgaGFuZGxlZCBhbmQgc2hvdWxkIGJlIGFib3J0ZWQuXHJcbn1cclxuXHJcbi8vIEBkeW5hbWljXHJcbmV4cG9ydCBjbGFzcyBSZW1vdGVDb21tYW5kc1Byb2Nlc3NvciBleHRlbmRzIENvbW1hbmRzUHJvY2Vzc29yQmFzZSB7XHJcbiAgc3RhdGljIHJlYWRvbmx5IFJDX05PX0NPTlRFWFRfSUQ6IHN0cmluZyA9ICctMSc7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgX2luc3RhbmNlOiBSZW1vdGVDb21tYW5kc1Byb2Nlc3NvciA9IG51bGw7XHJcbiAgcHVibGljIHN0YXRpYyBJc1Nlc3Npb25SZUluaXRpYWxpemluZyA9IGZhbHNlO1xyXG4gIHByaXZhdGUgc3RhdGljIGxhc3RFeGNlcHRpb25NZXNzYWdlID0gbnVsbDtcclxuICBwcml2YXRlIHN0YXRpYyBJbml0aWFsVXJsOiBzdHJpbmcgPSBudWxsO1xyXG5cclxuICAvLyBUT0RPIC0gbW92ZSBpdCB0byBjbGFzc1xyXG4gIHByaXZhdGUgc3RhdGljIHJlcXVlc3ROdW1iZXIgPSAwO1xyXG4gIHByaXZhdGUgc3RhdGljIHRvdGFsVGltZUZvckhUVFBSZXF1ZXN0cyA9IDA7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgdG90YWxSZXF1ZXN0RGF0YUxlbmd0aCA9IDA7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgdG90YWxSZXNwb25zZURhdGFMZW5ndGggPSAwO1xyXG5cclxuICAvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG4gIC8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbiAgLy8gKioqKioqKiogV2hlbiBjaGFuZ2luZyBXRUJfQ09NTVVOSUNBVElPTl9QUk9UT0NPTF9WRVJTSU9OLCBwbGVhc2UgY2hhbmdlIG9uIG1vYmlsZSBwbGF0Zm9ybXMgYXMgd2VsbDpcclxuICAvLyAqKioqKioqKiBXMTBNOiBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5jc1xyXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFdFQl9DT01NVU5JQ0FUSU9OX1BST1RPQ09MX1ZFUlNJT046IHN0cmluZyA9IFwiMTQwMDJcIjtcclxuICAvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG4gIC8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcblxyXG4gIC8vIFRPRE86IENoZWNrIGlmIHdlIG5lZWQgX2xvZ0FjY3VtdWxhdG9yLlxyXG4gIC8vIHByaXZhdGUgX2xvZ0FjY3VtdWxhdG9yOiBDbGllbnRMb2dBY2N1bXVsYXRvciA9IG51bGw7XHJcblxyXG4gIHByaXZhdGUgX2xhc3RSZXF1ZXN0VGltZTogbnVtYmVyID0gMDsgLy8gdGhlIHRpbWUgb2YgdGhlIGxhc3QgcmVxdWVzdCB0byB0aGUgc2VydmVyXHJcblxyXG4gIFNlcnZlclVybDogc3RyaW5nID0gbnVsbDtcclxuICBwcml2YXRlIHN0YXRpYyBfc2hvdWxkU2NyYW1ibGVBbmRVbnNjcmFtYmxlTWVzc2FnZXM6IGJvb2xlYW4gPSBmYWxzZTsgLy8gc3RhdGljIGJlY2F1c2UgaXQgaXMgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoZSBleGVjdXRpb24gcHJvcHMgYXJlIGF2YWlsYWJsZVxyXG5cclxuICBwdWJsaWMgU2Vzc2lvbklkOiBzdHJpbmc7XHJcblxyXG4gIHB1YmxpYyBEZWxheUNvbW1hbmRFeGVjdXRpb246IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9yZXF1ZXN0SW5mbyA9IG5ldyBSZXF1ZXN0SW5mbygpO1xyXG5cclxuICBzdGF0aWMgR2V0SW5zdGFuY2UoKTogUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3Ige1xyXG4gICAgaWYgKFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLl9pbnN0YW5jZSA9PT0gbnVsbCkge1xyXG4gICAgICBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5faW5zdGFuY2UgPSBuZXcgUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IoKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuX2luc3RhbmNlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgICB0aGlzLlNlcnZlclVybCA9IFNlcnZlckNvbmZpZy5JbnN0YW5jZS5nZXRTZXJ2ZXJVUkwoKTtcclxuXHJcbiAgICBIdHRwTWFuYWdlci5HZXRJbnN0YW5jZSgpO1xyXG5cclxuICAgIHRoaXMuUmVnaXN0ZXJEZWxlZ2F0ZXMoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gQ2hlY2tzIHRoYXQgc2Vzc2lvbiBjb3VudGVyIGlzIGNvbnNlY3V0aXZlIGR1cmluZyB0aGUgc2Vzc2lvbiBhbmQgc2V0cyBuZXcgdmFsdWUuXHJcbiAgLy8vIFRoZSBvbmx5IGV4Y2VwdGlvbiBpcyBpbiBjYXNlIHRoZSBjbGllbnQgc2VudCB0byB0aGUgc2VydmVyIENvbnN0SW50ZXJmYWNlLlNFU1NJT05fQ09VTlRFUl9DTE9TRV9DVFhfSU5ESUNBVElPTixcclxuICAvLy8gICAgdGhlIHNlcnZlciBpcyBleHBlY3RlZCB0byByZXR1cm4gQ29uc3RJbnRlcmZhY2UuU0VTU0lPTl9DT1VOVEVSX0NMT1NFX0NUWF9JTkRJQ0FUSU9OIGluIHJlc3BvbnNlIChSZXF1ZXN0c1NlcnZlckJhc2U6OlByb2Nlc3NSZXF1ZXN0KSwgdG8gYWNrbm93bGVkZ2UgdGhlIHJlcXVlc3QgdG8gY2xvc2UgdGhlIGNvbnRleHQuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJuZXdTZXNzaW9uQ291bnRlclwiPiEhLjwvcGFyYW0+XHJcbiAgQ2hlY2tBbmRTZXRTZXNzaW9uQ291bnRlcihuZXdTZXNzaW9uQ291bnRlcjogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAobmV3U2Vzc2lvbkNvdW50ZXIgPT09IENvbnN0SW50ZXJmYWNlLlNFU1NJT05fQ09VTlRFUl9DTE9TRV9DVFhfSU5ESUNBVElPTikge1xyXG4gICAgICBEZWJ1Zy5Bc3NlcnQodGhpcy5HZXRTZXNzaW9uQ291bnRlcigpID09PSBDb25zdEludGVyZmFjZS5TRVNTSU9OX0NPVU5URVJfQ0xPU0VfQ1RYX0lORElDQVRJT04pO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIERlYnVnLkFzc2VydChuZXdTZXNzaW9uQ291bnRlciA9PT0gdGhpcy5HZXRTZXNzaW9uQ291bnRlcigpICsgMSk7XHJcbiAgICAgIHRoaXMuU2V0U2Vzc2lvbkNvdW50ZXIobmV3U2Vzc2lvbkNvdW50ZXIpO1xyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVTZXJ2ZXJUb0xvZyhOU3RyaW5nLkZvcm1hdChcIlNlc3Npb24gQ291bnRlciAtLT4gezB9XCIsIHRoaXMuX3Nlc3Npb25Db3VudGVyKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFplcm8gc2Vzc2lvbiBjb3VudGVyIHdoZW4gcmVpbml0aWFsaXppbmcgc2VydmVyIGNvbW11bmljYXRpb24gZGV0YWlsc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBDbGVhclNlc3Npb25Db3VudGVyKCk6IHZvaWRcclxuICB7XHJcbiAgICB0aGlzLl9zZXNzaW9uQ291bnRlciA9IDA7XHJcbiAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVTZXJ2ZXJUb0xvZyhOU3RyaW5nLkZvcm1hdChcIlNlc3Npb24gQ291bnRlciAtLT4gezB9XCIsIHRoaXMuX3Nlc3Npb25Db3VudGVyKSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJuZXdTZXNzaW9uQ291bnRlclwiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBTZXRTZXNzaW9uQ291bnRlcihuZXdTZXNzaW9uQ291bnRlcjogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl9zZXNzaW9uQ291bnRlciA9IG5ld1Nlc3Npb25Db3VudGVyO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBHZXRMYXN0UmVxdWVzdFRpbWUoKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl9sYXN0UmVxdWVzdFRpbWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFJlU3RhcnRTZXNzaW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyBSZVN0YXJ0U2Vzc2lvbiggKTogUHJvbWlzZTx2b2lkPiB7XHJcblxyXG4gICAgUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuSXNTZXNzaW9uUmVJbml0aWFsaXppbmcgPSB0cnVlO1xyXG5cclxuICAgIGF3YWl0IHRoaXMuU3RvcmVTZXNzaW9uUmVJbml0aWFsaXppbmdEYXRhT25Mb2NhbFN0b3JhZ2UoKTtcclxuICAgIGxldCBuYXZpZ2F0ZVJvb3RSb3V0ZSA9IGZhbHNlO1xyXG4gICAgaWYgKCFSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuUmVtb3ZlZENvbnRleHRGcm9tU2VydmVyKVxyXG4gICAgICBuYXZpZ2F0ZVJvb3RSb3V0ZSA9IEVudmlyb25tZW50Lkluc3RhbmNlLmdldFNwZWNpYWxSb3V0ZVRvUm9vdFByb2dPbkNvbnRleHRSZWNyZWF0aW9uKCkgPyB0cnVlIDogZmFsc2U7XHJcbiAgICBDb21tYW5kcy5hZGRSZWZyZXNoUGFnZShuYXZpZ2F0ZVJvb3RSb3V0ZSwgUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuSW5pdGlhbFVybCk7XHJcbiAgICAvL3N0b3AgdGhlIGV4ZWN1dGlvbiBieSB0aHJvd2luZyBleGNlcHRpb24uXHJcbiAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCcnKTtcclxuXHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFN0b3JlU2Vzc2lvblJlSW5pdGlhbGl6aW5nRGF0YU9uTG9jYWxTdG9yYWdlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyBTdG9yZVNlc3Npb25SZUluaXRpYWxpemluZ0RhdGFPbkxvY2FsU3RvcmFnZSAoKSA6IFByb21pc2U8dm9pZD4ge1xyXG5cclxuICAgIGxldCBtYWluUHJnVmlld1N0cmluZ0ZvclNlcnZlciA9IGF3YWl0IHRoaXMuQnVpbGRYTUxGb3JNYWluUHJvZ3JhbURhdGFWaWV3KCk7XHJcbiAgICBsZXQgZ2xvYmFsUGFyYW1zU3RyaW5nID0gQWNjZXNzSGVscGVyLmdsb2JhbFBhcmFtcy5taXJyb3JBbGxUb1hNTCgpO1xyXG5cclxuICAgIC8vIHN0b3JlIG1haW5QcmdWaWV3U3RyaW5nRm9yU2VydmVyLCBJc1Nlc3Npb25SZUluaXRpYWxpemluZyBhbmQgZ2xvYmFsUGFyYW1zU3RyaW5nIG9uIGxvY2FsXHJcbiAgICAvLyBzdG9yYWdlIGluIG9yZGVyIHRvIHVzZSBpdCBmb3IgbmV4dCBzZXNzaW9uLlxyXG4gICAgbGV0IGRhdGFTdG9yYWdlID0gd2luZG93LmxvY2FsU3RvcmFnZTtcclxuICAgIGRhdGFTdG9yYWdlLnNldEl0ZW0oQ29uc3RJbnRlcmZhY2UuSVNfU0VTU0lPTl9SRUlOSVRJQUxJWklORywgXCJ0cnVlXCIpO1xyXG4gICAgZGF0YVN0b3JhZ2Uuc2V0SXRlbShDb25zdEludGVyZmFjZS5NQUlOX1BST0dfVklFVywgbWFpblByZ1ZpZXdTdHJpbmdGb3JTZXJ2ZXIudG9TdHJpbmcoKSk7XHJcbiAgICBkYXRhU3RvcmFnZS5zZXRJdGVtKENvbnN0SW50ZXJmYWNlLkdMT0JBTF9QQVJBTV9MSVNULCBnbG9iYWxQYXJhbXNTdHJpbmcpO1xyXG4gICAgZGF0YVN0b3JhZ2Uuc2V0SXRlbShDb25zdEludGVyZmFjZS5MQVNUX0VYQ0VQVElPTiwgUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IubGFzdEV4Y2VwdGlvbk1lc3NhZ2UpO1xyXG4gICAgaWYgKFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5SZW1vdmVkQ29udGV4dEZyb21TZXJ2ZXIpXHJcbiAgICAgIGRhdGFTdG9yYWdlLnNldEl0ZW0oQ29uc3RJbnRlcmZhY2UuQ1RYX1JFTU9WRURfRlJPTV9TUlZSLCBcIjFcIik7XHJcblxyXG4gICAgRXZlbnRzTWFuYWdlci5JbnN0YW5jZS5zdG9yZUxhc3RTYXZlZFJvdXRlRXZlbnRPbkxvY2FsU3RvcmFnZSAoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gUmVzdG9yZVNlc3Npb25SZUluaXRpYWxpemluZ0RhdGFGcm9tTG9jYWxTdG9yYWdlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBSZXN0b3JlU2Vzc2lvblJlSW5pdGlhbGl6aW5nRGF0YUZyb21Mb2NhbFN0b3JhZ2UgKGtleTogc3RyaW5nICk6c3RyaW5nIHtcclxuXHJcbiAgICBsZXQgZGF0YVN0b3JhZ2UgPSB3aW5kb3cubG9jYWxTdG9yYWdlO1xyXG4gICAgbGV0IHZhbCA9IGRhdGFTdG9yYWdlLmdldEl0ZW0oa2V5KTtcclxuICAgIHJldHVybiB2YWw7XHJcbiAgfVxyXG5cclxuICAgIC8vLyA8c3VtbWFyeT5QcmVwYXJlIGFuZCBleGVjdXRlIHRoZSAxc3QgJiAybmQgaGFuZHNoYWtlIHJlcXVlc3RzOlxyXG4gIC8vLyAxc3QgcmVxdWVzdDogIFVURjhUUkFOUz0uLiZhcHBuYW1lPS4uJnByZ25hbWU9Li4mYXJndW1lbnRzPS1BPFJpY2hjbGllbnQ+PFJlcXVlc3RpbmdWZXJzaW9uRGV0YWlscz1cIi4uXCIvPjwvUmljaGNsaWVudD5cclxuICAvLy8gICAgIHJlc3BvbnNlOiBpbnN0cnVjdGlvbnMgdG8gdGhlIGNsaWVudCAtIHdoZXRoZXIgdG8gZGlzcGxheSBhdXRoZW50aWNhdGlvbiBkaWFsb2csIHRoZSBzZXJ2ZXIncyB2ZXJzaW9uLCBhbmQgbW9yZSAuLlxyXG4gIC8vLyAgICAgICAgICAgICAgIGUuZy4gPFJpY2hjbGllbnRyZXNwb25zZT48Q29udGV4dElEPjEyMDMwODc4OTcyNjM3MTIwMDwvQ29udGV4dElEPjxFbnZpcm9ubWVudCBJbnB1dFBhc3N3b3JkPVwiTlwiIFN5c3RlbUxvZ2luPVwiTlwiIFNjcmFtYmxlTWVzc2FnZXM9XCJOXCIgTWF4SW50ZXJuYWxMb2dMZXZlbD1cIlNlcnZlciNcIiBIdHRwVGltZW91dD1cIjEwXCIgQ2xpZW50TmV0d29ya1JlY292ZXJ5SW50ZXJ2YWw9XCIwXCIgRm9yd2FyZFNsYXNoPVwid2ViXCIvPjwvUmljaGNsaWVudHJlc3BvbnNlPlxyXG4gIC8vLyAybmQgcmVxdWVzdDogYXV0aGVudGljYXRpb24gKG9wdGlvbmFsLCBkZXBlbmRpbmcgb24gdGhlIDFzdCByZXF1ZXN0KS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz50cnVlIG9ubHkgaWYgdGhlIGNsaWVudCBzaG91bGQgY29udGludWUgdG8gc3RhcnQgdGhlIGFjdHVhbCBwcm9ncmFtIChpLmUuIGFmdGVyIGhhbmRzaGFrZSkuPC9yZXR1cm5zPlxyXG4gIGFzeW5jIFN0YXJ0U2Vzc2lvbigpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCBhdXRoZW50aWNhdGlvbkNhbmNlbGxlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IGhhbmRzaGFrZVJlc3BvbnNlOiBIYW5kc2hha2VSZXNwb25zZSA9IG51bGw7XHJcbiAgICBsZXQgZGlhbG9nOiBBdXRoZW50aWNhdGlvbkRpYWxvZ0hhbmRsZXIgPSBudWxsO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGxldCBsYXN0VHlwZWRVc2VySWQ6IHN0cmluZyA9IG51bGw7XHJcblxyXG4gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICAgIC8vIDFzdCBoYW5kc2hha2UgcmVxdWVzdDogcHJlcGFyZSAxc3QgaGFuZHNoYWtlIHJlcXVlc3QgYW5kIHNjcmFtYmxlIGl0XHJcbiAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgICAgbGV0IGhhbmRzaGFrZUluaXRpYWxUb2tlbnM6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpO1xyXG4gICAgICBoYW5kc2hha2VJbml0aWFsVG9rZW5zLkFwcGVuZChDb25zdEludGVyZmFjZS5VVEY4VFJBTlMgK1xyXG4gICAgICAgIENvbnN0SW50ZXJmYWNlLlJFUV9BUFBfTkFNRSArIFwiPVwiICtcclxuICAgICAgICBIdHRwVXRpbGl0eS5VcmxFbmNvZGUoU2VydmVyQ29uZmlnLkluc3RhbmNlLmdldEFwcE5hbWUoKSwgRW5jb2RpbmcuVVRGOCkpO1xyXG5cclxuICAgICAgaGFuZHNoYWtlSW5pdGlhbFRva2Vucy5BcHBlbmQoXCImXCIgKyBDb25zdEludGVyZmFjZS5SRVFfQVJHUyArIFwiPVwiICsgQ29uc3RJbnRlcmZhY2UuUkVRX0FSR19BTFBIQSArXHJcbiAgICAgIFwiPFJpY2hjbGllbnQ+PFJlcXVpcmVzIEVuY3J5cHRpb25LZXk9XFxcIkZhbHNlXFxcIi8+PFJJQVByb3RvY29sVmVyc2lvbj1cXFwiXCIgKyBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5XRUJfQ09NTVVOSUNBVElPTl9QUk9UT0NPTF9WRVJTSU9OICsgXCJcXFwiLz48L1JpY2hjbGllbnQ+XCIpO1xyXG5cclxuICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJIYW5kc2hha2UgcmVxdWVzdCAjMSAobm90IHNjcmFtYmxlZCkgOiB7MH1cIixcclxuICAgICAgICB0aGlzLlNlcnZlclVybCArIENvbnN0SW50ZXJmYWNlLlJFUV9BUkdfU1RBUlQgK1xyXG4gICAgICAgIENvbnN0SW50ZXJmYWNlLlJDX0lORElDQVRJT05fSU5JVElBTCArIGhhbmRzaGFrZUluaXRpYWxUb2tlbnMpKTtcclxuXHJcbiAgICAgIGxldCBoYW5kc2hha2VJbml0aWFsVXJsOiBzdHJpbmcgPSB0aGlzLlNlcnZlclVybCArIENvbnN0SW50ZXJmYWNlLlJFUV9BUkdfU1RBUlQgK1xyXG4gICAgICAgIENvbnN0SW50ZXJmYWNlLlJDX0lORElDQVRJT05fSU5JVElBTCArXHJcbiAgICAgICAgQ29uc3RJbnRlcmZhY2UuUkNfVE9LRU5fREFUQSArXHJcbiAgICAgICAgSHR0cFV0aWxpdHkuVXJsRW5jb2RlKFNjcmFtYmxlci5TY3JhbWJsZShoYW5kc2hha2VJbml0aWFsVG9rZW5zLlRvU3RyaW5nKCkpLCBFbmNvZGluZy5VVEY4KTtcclxuXHJcbiAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZVNlcnZlck1lc3NhZ2VzVG9Mb2coXCJcIik7XHJcbiAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZVNlcnZlck1lc3NhZ2VzVG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJIYW5kc2hha2UgcmVxdWVzdCAjMTogezB9XCIsIGhhbmRzaGFrZUluaXRpYWxVcmwpKTtcclxuXHJcbiAgICAgIC8vIEluaXRpYWxpemUgdGVtcCBjdHhHcm91cCB3aXRoIEN0eEdyb3VwIGZyb20gZXhlY3V0aW9uLnByb3BlcnRpZXNcclxuICAgICAgbGV0IGN0eEdyb3VwOiBzdHJpbmcgPSBTZXJ2ZXJDb25maWcuSW5zdGFuY2UuZ2V0Q3R4R3JvdXAoKTtcclxuXHJcbiAgICAgIHdoaWxlICghYXV0aGVudGljYXRpb25DYW5jZWxsZWQpIHtcclxuICAgICAgICBsZXQgcmVxdWVzdFN0YXR1czogUmVmUGFyYW08UmVxdWVzdFN0YXR1cz4gPSBuZXcgUmVmUGFyYW0oUmVxdWVzdFN0YXR1cy5IYW5kbGVkKTtcclxuICAgICAgICAvLyBleGVjdXRlIHRoZSAxc3QgcmVxdWVzdFxyXG4gICAgICAgIGxldCByZXNwb25zZVN0cjogc3RyaW5nID0gYXdhaXQgdGhpcy5EaXNwYXRjaFJlcXVlc3QoaGFuZHNoYWtlSW5pdGlhbFVybCwgbnVsbCwgQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1Nlc3Npb25TdGFnZS5IQU5EU0hBS0UsIHJlcXVlc3RTdGF0dXMpO1xyXG5cclxuICAgICAgICAvLyBwcm9jZXNzIHRoZSAxc3QgcmVzcG9uc2UgLSBjaGVjayBpZiB0aGUgcmVzcG9uc2UgaXMgZXJyb3IsIHVuc2NyYW1ibGUgYW5kIHBhcnNlIGl0XHJcbiAgICAgICAgaWYgKE5TdHJpbmcuSXNOdWxsT3JFbXB0eShyZXNwb25zZVN0cikpIHtcclxuICAgICAgICAgIHRocm93IG5ldyBTZXJ2ZXJFcnJvcihcIkNsaWVudCBmYWlsZWQgdG8gaW5pdGlhbGl6ZSBhIHNlc3Npb24uXCIgKyBPU0Vudmlyb25tZW50LkVvbFNlcSArXHJcbiAgICAgICAgICAgIFwiRW1wdHkgcmVzcG9uc2Ugd2FzIHJlY2VpdmVkIGZyb20gdGhlIHdlYiBzZXJ2ZXIuXCIgKyBPU0Vudmlyb25tZW50LkVvbFNlcSArIE9TRW52aXJvbm1lbnQuRW9sU2VxICsgdGhpcy5TZXJ2ZXJVcmwpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlU2VydmVyTWVzc2FnZXNUb0xvZyhOU3RyaW5nLkZvcm1hdChcIkhhbmRzaGFrZSByZXNwb25zZSAjMTogezB9XCIsIHJlc3BvbnNlU3RyKSk7XHJcbiAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlU2VydmVyTWVzc2FnZXNUb0xvZyhcIlwiKTtcclxuXHJcbiAgICAgICAgaGFuZHNoYWtlUmVzcG9uc2UgPSBuZXcgSGFuZHNoYWtlUmVzcG9uc2UocmVzcG9uc2VTdHIpO1xyXG5cclxuICAgICAgICBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuQ29udGV4dElEID0gaGFuZHNoYWtlUmVzcG9uc2UuQ29udGV4dElkO1xyXG5cclxuICAgICAgICAvLyBzYXZlIHNlc3Npb24gaWQgb24gY2xpZW50IHdoaWNoIGlzIHJlY2VpdmVkIGluIDFzdCByZXNwb25zZS5cclxuICAgICAgICB0aGlzLlNlc3Npb25JZCA9IGhhbmRzaGFrZVJlc3BvbnNlLkdldFNlc3Npb25JZDtcclxuXHJcbiAgICAgICAgSHR0cE1hbmFnZXIuR2V0SW5zdGFuY2UoKS5IdHRwQ29tbXVuaWNhdGlvblRpbWVvdXRNUyA9IGhhbmRzaGFrZVJlc3BvbnNlLkh0dHBUaW1lb3V0ICogMTAwMDtcclxuXHJcbiAgICAgICAgLy8gRHVyaW5nIGF1dGhlbnRpY2F0aW9uLCBpZiBhdXRoZW50aWNhdGlvbiBmYWlsZWQgdGhlbiBzZXJ2ZXIgdW5sb2FkcyBjdHggYW5kIGNyZWF0ZXMgbmV3IGN0eCBmb3IgbmV4dCBhdXRoZW50aWNhdGlvbiByZXF1ZXN0LlxyXG4gICAgICAgIC8vIFNvIGV2ZXJ5IHRpbWUgYWZ0ZXIgYXV0aGVudGljYXRpb24gZmFpbHMgd2UgcmVjZWl2ZSBuZXcgY3R4aWQgZm9yIG5leHQgYXV0aGVudGljYXRpb24gcmVxdWVzdC5cclxuICAgICAgICAvLyBIZW5jZSB0YWtlIGN0eGdyb3VwIGluIGxvY2FsIHZhcmlhYmxlIGFuZCB1cGRhdGUgQ2xpZW50TWFuYWdlciBvbmx5IGFmdGVyIGF1dGhlbnRpY2F0aW9uIGlzIGRvbmUuXHJcbiAgICAgICAgaWYgKE5TdHJpbmcuSXNOdWxsT3JFbXB0eShTZXJ2ZXJDb25maWcuSW5zdGFuY2UuZ2V0Q3R4R3JvdXAoKSkpIHtcclxuICAgICAgICAgIGN0eEdyb3VwID0gaGFuZHNoYWtlUmVzcG9uc2UuQ29udGV4dElkO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgICAgICAvLyAybmQgaGFuZHNoYWtlIHJlcXVlc3RcclxuICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgICAgIGxldCBjcmVkZW50aWFsczogVXNlcm5hbWVQYXNzd29yZENyZWRlbnRpYWxzID0gbnVsbDtcclxuICAgICAgICBpZiAoU2VydmVyQ29uZmlnLkluc3RhbmNlLmdldFNraXBBdXRoZW50aWNhdGlvbkRpYWxvZygpKSB7XHJcbiAgICAgICAgICAvLyBza2lwIGF1dGhlbnRpY2F0aW9uICh0byB0aGUgcnVudGltZS1lbmdpbmUpIGRpYWxvZ1xyXG4gICAgICAgICAgaWYgKFNlcnZlckNvbmZpZy5JbnN0YW5jZS5nZXRVc2VybmFtZSgpICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIC8vIHVzZXIgdGhlIHVzZXJJZCAmIHBhc3N3b3JkIHRoYXQgd2VyZSBwYXNzZWQsIGFuZCByZXNldCB0aGVtICh0aGV5J2xsIGJlIHNldCBiZWxvdywgaWYgYXV0aGVudGljYXRlZCBieSB0aGUgcnVudGltZS1lbmdpbmUpXHJcbiAgICAgICAgICAgIGNyZWRlbnRpYWxzID0gbmV3IFVzZXJuYW1lUGFzc3dvcmRDcmVkZW50aWFscyhTZXJ2ZXJDb25maWcuSW5zdGFuY2UuZ2V0VXNlcm5hbWUoKSwgU2VydmVyQ29uZmlnLkluc3RhbmNlLmdldFBhc3N3b3JkKCkpO1xyXG4gICAgICAgICAgICBTZXJ2ZXJDb25maWcuSW5zdGFuY2Uuc2V0VXNlcm5hbWUoXCJcIik7XHJcbiAgICAgICAgICAgIFNlcnZlckNvbmZpZy5JbnN0YW5jZS5zZXRQYXNzd29yZChcIlwiKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoaGFuZHNoYWtlUmVzcG9uc2UuSW5wdXRQYXNzd29yZCAmJiBoYW5kc2hha2VSZXNwb25zZS5TeXN0ZW1Mb2dpbiAhPT0gSGFuZHNoYWtlUmVzcG9uc2UuU1lTVEVNX0xPR0lOX0FEKSB7XHJcbiAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAodG8gdGhlIHJ1bnRpbWUtZW5naW5lKSBkaWFsb2dcclxuICAgICAgICAgIGlmIChsYXN0VHlwZWRVc2VySWQgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgbGV0IHRpdGxlOiBzdHJpbmcgPSBBY2Nlc3NIZWxwZXIubGFuZ3VhZ2VEYXRhLmdldENvbnN0TWVzc2FnZShNc2dJbnRlcmZhY2UuQlJLVEFCX1NUUl9FUlJPUik7XHJcbiAgICAgICAgICAgIGxldCBlcnJvcjogc3RyaW5nID0gQWNjZXNzSGVscGVyLmxhbmd1YWdlRGF0YS5nZXRDb25zdE1lc3NhZ2UoTXNnSW50ZXJmYWNlLlVTUklOUF9TVFJfQkFEUEFTU1cpO1xyXG4gICAgICAgICAgICBhd2FpdCBHVUlNYW5hZ2VyLkluc3RhbmNlLk1lc3NhZ2VCb3godGl0bGUsIGVycm9yLCBTdHlsZXMuTVNHQk9YX0lDT05fRVJST1IgfCBTdHlsZXMuTVNHQk9YX0JVVFRPTl9PSyk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IGF1dGhlbnRpY2F0aW9uIGRpYWxvZ1xyXG4gICAgICAgICAgLy8gbGV0IHVzZXJJZDogc3RyaW5nID0gbGFzdFR5cGVkVXNlcklkO1xyXG4gICAgICAgICAgLy9cclxuICAgICAgICAgIC8vIGlmIChkaWFsb2cgPT09IG51bGwpIHtcclxuICAgICAgICAgIC8vICAgZGlhbG9nID0gbmV3IEF1dGhlbnRpY2F0aW9uRGlhbG9nSGFuZGxlcih1c2VySWQsIEdldExvZ29uRGlhbG9nRXhlY1Byb3BzKCkpO1xyXG4gICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgLy8gZGlhbG9nLm9wZW5EaWFsb2coKTtcclxuXHJcbiAgICAgICAgICAvLyBjcmVkZW50aWFscyA9IGRpYWxvZy5nZXRDcmVkZW50aWFscygpO1xyXG4gICAgICAgICAgLy8gaWYgKGNyZWRlbnRpYWxzICE9PSBudWxsKVxyXG4gICAgICAgICAgLy8gICBsYXN0VHlwZWRVc2VySWQgPSBjcmVkZW50aWFscy5Vc2VybmFtZTtcclxuICAgICAgICAgIC8vIGVsc2VcclxuICAgICAgICAgIC8vICAgYXV0aGVudGljYXRpb25DYW5jZWxsZWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gQ29uc3RJbnRlcmZhY2UuU0VTU0lPTl9DT1VOVEVSX0NMT1NFX0NUWF9JTkRJQ0FUSU9OIGluc3RydWN0cyB0aGUgc2VydmVyIHRvIGNsb3NlIHRoZSBjb250ZXh0LlxyXG4gICAgICAgIC8vIChub3RlOiB1bmxvYWRpbmcgYSBjb250ZXh0IHBvc3QgaGFuZHNoYWtlIHNob3VsZCBiZSBkb25lIHVzaW5nIENvbW1hbmQuY3JlYXRlVW5sb2FkQ29tbWFuZCkuXHJcbiAgICAgICAgaWYgKGF1dGhlbnRpY2F0aW9uQ2FuY2VsbGVkKSB7XHJcbiAgICAgICAgICB0aGlzLlNldFNlc3Npb25Db3VudGVyKENvbnN0SW50ZXJmYWNlLlNFU1NJT05fQ09VTlRFUl9DTE9TRV9DVFhfSU5ESUNBVElPTik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgaGFuZHNoYWtlQXV0aFVybDogc3RyaW5nID0gdGhpcy5QcmVwYXJlQXV0aGVudGljYXRpb25VcmwoaGFuZHNoYWtlUmVzcG9uc2UuQ29udGV4dElkLCBjdHhHcm91cCwgdGhpcy5HZXRTZXNzaW9uQ291bnRlcigpKTtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIGlmIChjcmVkZW50aWFscyAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBsZXQgY3JlZGVudGlhbHNTdHI6IHN0cmluZyA9IGNyZWRlbnRpYWxzLlVzZXJuYW1lICsgXCI6XCI7XHJcbiAgICAgICAgICAgIGlmICghTlN0cmluZy5Jc051bGxPckVtcHR5KGNyZWRlbnRpYWxzLlBhc3N3b3JkKSkge1xyXG4gICAgICAgICAgICAgIGNyZWRlbnRpYWxzU3RyID0gY3JlZGVudGlhbHNTdHIgKyBjcmVkZW50aWFscy5QYXNzd29yZCArIFwiOlwiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNyZWRlbnRpYWxzU3RyICs9IGhhbmRzaGFrZVJlc3BvbnNlLkNvbnRleHRJZDtcclxuICAgICAgICAgICAgY3JlZGVudGlhbHNTdHIgPSBTY3JhbWJsZXIuU2NyYW1ibGUoY3JlZGVudGlhbHNTdHIpO1xyXG4gICAgICAgICAgICBjcmVkZW50aWFsc1N0ciA9IEJhc2U2NC5lbmNvZGUoY3JlZGVudGlhbHNTdHIsIHRydWUsIEVuY29kaW5nLlVURjgpO1xyXG4gICAgICAgICAgICBoYW5kc2hha2VBdXRoVXJsICs9IChcIiZVU0VSTkFNRT1cIiArIEh0dHBVdGlsaXR5LlVybEVuY29kZShjcmVkZW50aWFsc1N0ciwgRW5jb2RpbmcuVVRGOCkpO1xyXG5cclxuICAgICAgICAgICAgLy8gc2VuZCAybmQgaGFuZHNoYWtlIHJlcXVlc3QgLSB3aXRoIGF1dGhlbnRpY2F0aW9uXHJcbiAgICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZVNlcnZlck1lc3NhZ2VzVG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJIYW5kc2hha2UgcmVxdWVzdCAjMjogezB9XCIsIGhhbmRzaGFrZUF1dGhVcmwpKTtcclxuICAgICAgICAgICAgbGV0IHN0YXR1c1JlcXVlc3Q6IFJlZlBhcmFtPFJlcXVlc3RTdGF0dXM+ID0gbmV3IFJlZlBhcmFtKFJlcXVlc3RTdGF0dXMuSGFuZGxlZCk7XHJcbiAgICAgICAgICAgIHJlc3BvbnNlU3RyID0gYXdhaXQgdGhpcy5EaXNwYXRjaFJlcXVlc3QoaGFuZHNoYWtlQXV0aFVybCwgbnVsbCwgQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1Nlc3Npb25TdGFnZS5IQU5EU0hBS0UsIHN0YXR1c1JlcXVlc3QpO1xyXG5cclxuICAgICAgICAgICAgLy8gdmVyaWZ5IHRoYXQgdGhlIHJlc3BvbnNlIHdhc24ndCByZXBsYXllZFxyXG4gICAgICAgICAgICBpZiAocmVzcG9uc2VTdHIuaW5kZXhPZihoYW5kc2hha2VSZXNwb25zZS5Db250ZXh0SWQpID09PSAtMSkge1xyXG4gICAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2ZXJFcnJvcihBY2Nlc3NIZWxwZXIubGFuZ3VhZ2VEYXRhLmdldENvbnN0TWVzc2FnZShNc2dJbnRlcmZhY2UuVVNSSU5QX1NUUl9CQURQQVNTVykpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBTZXJ2ZXJDb25maWcuSW5zdGFuY2Uuc2V0VXNlcm5hbWUoY3JlZGVudGlhbHMuVXNlcm5hbWUpO1xyXG4gICAgICAgICAgICBTZXJ2ZXJDb25maWcuSW5zdGFuY2Uuc2V0UGFzc3dvcmQoY3JlZGVudGlhbHMuUGFzc3dvcmQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCByZXF1ZXN0U3RhdHVzOiBSZWZQYXJhbTxSZXF1ZXN0U3RhdHVzPiA9IG5ldyBSZWZQYXJhbShSZXF1ZXN0U3RhdHVzLkhhbmRsZWQpO1xyXG4gICAgICAgICAgICAvLyBzZW5kIDJuZCBoYW5kc2hha2UgcmVxdWVzdCAtIHdpdGhvdXQgYXV0aGVudGljYXRpb25cclxuICAgICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlU2VydmVyTWVzc2FnZXNUb0xvZyhOU3RyaW5nLkZvcm1hdChcIkhhbmRzaGFrZSByZXF1ZXN0ICMyOiB7MH1cIiwgaGFuZHNoYWtlQXV0aFVybCkpO1xyXG4gICAgICAgICAgICByZXNwb25zZVN0ciA9IGF3YWl0IHRoaXMuRGlzcGF0Y2hSZXF1ZXN0KGhhbmRzaGFrZUF1dGhVcmwsIG51bGwsIENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZXNzaW9uU3RhZ2UuSEFORFNIQUtFLCByZXF1ZXN0U3RhdHVzKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZVNlcnZlck1lc3NhZ2VzVG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJIYW5kc2hha2UgcmVzcG9uc2UgIzI6IHswfVwiLCByZXNwb25zZVN0cikpO1xyXG4gICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlU2VydmVyTWVzc2FnZXNUb0xvZyhcIlwiKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgIGlmIChleCBpbnN0YW5jZW9mIFNlcnZlckVycm9yKSB7XHJcbiAgICAgICAgICAgIGxldCBzZXJ2ZXJFcnJvcjogU2VydmVyRXJyb3IgPSA8U2VydmVyRXJyb3I+ZXg7XHJcbiAgICAgICAgICAgIGlmIChTZXJ2ZXJDb25maWcuSW5zdGFuY2UuZ2V0U2tpcEF1dGhlbnRpY2F0aW9uRGlhbG9nKCkpIHtcclxuICAgICAgICAgICAgICBzd2l0Y2ggKHNlcnZlckVycm9yLkdldENvZGUoKSlcclxuICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFNlcnZlckVycm9yLkVSUl9BQ0NFU1NfREVOSUVEOlxyXG4gICAgICAgICAgICAgICAgLy8gRXh0ZXJuYWwgQXV0aGVudGljYXRvciBhdXRoZW50aWNhdGVkIHRoZSB1c2VyLCBhY2Nlc3MgdG8gdGhlIGFwcGxpY2F0aW9uIHdhc24ndCBhdXRob3JpemVkLlxyXG4gICAgICAgICAgICAgICAgY2FzZSBTZXJ2ZXJFcnJvci5FUlJfQVVUSEVOVElDQVRJT046XHJcbiAgICAgICAgICAgICAgICAgIC8vIEV4dGVybmFsIEF1dGhlbnRpY2F0b3IgYXV0aGVudGljYXRlZCB0aGUgdXNlciBidXQgYXBwbGljYXRpb24gYXV0aGVudGljYXRpb24gZmFpbGVkXHJcbiAgICAgICAgICAgICAgICAgIFNlcnZlckNvbmZpZy5JbnN0YW5jZS5zZXRTa2lwQXV0aGVudGljYXRpb25EaWFsb2coZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICB0aHJvdyBzZXJ2ZXJFcnJvcjtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIHRoZSBzZXNzaW9uIHdpbGwgbmV2ZXIgcHJvdmlkZSBhIHdheSB0byBjaGFuZ2UgdGhlIGNyZWRlbnRpYWxzLCB0aGVyZWZvcmUgYWJvcnRcclxuICAgICAgICAgICAgaWYgKCFoYW5kc2hha2VSZXNwb25zZS5JbnB1dFBhc3N3b3JkKVxyXG4gICAgICAgICAgICAgIHRocm93IHNlcnZlckVycm9yO1xyXG5cclxuICAgICAgICAgICAgLy8gRXJyb3IuSU5GX05PX1JFU1VMVDpcclxuICAgICAgICAgICAgLy8gICAgaWYgYXV0aGVudGljYXRpb24gZGlhbG9nIHdhcyBjYW5jZWxlZCwgdGhlIHJlcXVlc3Qgd2FzIHNlbnQgb25seSB0byBjbG9zZSB0aGUgY29udGV4dCxcclxuICAgICAgICAgICAgLy8gICAgYW5kIHRoZSBzZXJ2ZXIgaXNuJ3QgZXhwZWN0ZWQgdG8gcmV0dXJuIGEgcmVzcG9uc2VcclxuICAgICAgICAgICAgaWYgKHNlcnZlckVycm9yLkdldENvZGUoKSAhPT0gU2VydmVyRXJyb3IuRVJSX0FVVEhFTlRJQ0FUSU9OICYmXHJcbiAgICAgICAgICAgICAgICAoIWF1dGhlbnRpY2F0aW9uQ2FuY2VsbGVkIHx8IHNlcnZlckVycm9yLkdldENvZGUoKSAhPT0gU2VydmVyRXJyb3IuSU5GX05PX1JFU1VMVCkpIHtcclxuICAgICAgICAgICAgICB0aHJvdyBzZXJ2ZXJFcnJvcjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB0aHJvdyBleDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIHN0b3JlIGFuIGluZGljYXRpb24gdG8gc2tpcCBmdXR1cmUgYXV0aGVudGljYXRpb24gKHNlc3Npb24gcmVzdGFydCwgcGFyYWxsZWwgcHJvZ3JhbSlcclxuICAgICAgU2VydmVyQ29uZmlnLkluc3RhbmNlLnNldFNraXBBdXRoZW50aWNhdGlvbkRpYWxvZyh0cnVlKTtcclxuXHJcbiAgICAgIC8vIHNhdmUgY29udGV4dCBncm91cFxyXG4gICAgICBTZXJ2ZXJDb25maWcuSW5zdGFuY2Uuc2V0Q3R4R3JvdXAoY3R4R3JvdXApO1xyXG5cclxuICAgICAgaWYgKGRpYWxvZyAhPT0gbnVsbClcclxuICAgICAgICBkaWFsb2cuY2xvc2VEaWFsb2coKTtcclxuXHJcbiAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgICAvLyBzZXQgc2Vzc2lvbiBwcm9wZXJ0aWVzXHJcbiAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgICBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5TaG91bGRTY3JhbWJsZUFuZFVuc2NyYW1ibGVNZXNzYWdlcyA9IGhhbmRzaGFrZVJlc3BvbnNlLlNjcmFtYmxlTWVzc2FnZXM7XHJcbiAgICAgIGlmIChMb2dnZXIuSW5zdGFuY2UuTG9nTGV2ZWwgIT09IExvZ2dlcl9Mb2dMZXZlbHMuQmFzaWMpIHtcclxuICAgICAgICAvLyBtYXhpbWFsIHZhbHVlIG9mIHRoZSBJbnRlcm5hbExvZ0xldmVsIHRoYXQgY2FuIGJlIHNldCBieSB0aGUgY2xpZW50LlxyXG4gICAgICAgIC8vIGlmIHNldCwgaXQgY29udHJvbHMgdGhlIG1heGltYWwgdmFsdWU7IG90aGVyd2lzZSwgYW55IGxvZyBsZXZlbCBpcyBhbGxvd2VkLlxyXG4gICAgICAgIGxldCBtYXhJbnRlcm5hbExvZ0xldmVsOiBzdHJpbmcgPSBoYW5kc2hha2VSZXNwb25zZS5NYXhJbnRlcm5hbExvZ0xldmVsO1xyXG4gICAgICAgIGlmIChtYXhJbnRlcm5hbExvZ0xldmVsICE9PSBudWxsKSB7XHJcbiAgICAgICAgICBsZXQgbWF4TG9nTGV2ZWw6IExvZ2dlcl9Mb2dMZXZlbHMgPSB0aGlzLnBhcnNlTG9nTGV2ZWwobWF4SW50ZXJuYWxMb2dMZXZlbCk7XHJcbiAgICAgICAgICBpZiAobWF4TG9nTGV2ZWwgPCBMb2dnZXIuSW5zdGFuY2UuTG9nTGV2ZWwpIHtcclxuICAgICAgICAgICAgLy8gdGV4dHVhbCB2YWx1ZSAoYXMgbG9hZGVkIGZyb20gdGhlIGV4ZWN1dGlvbiBwcm9wZXJ0aWVzKVxyXG4gICAgICAgICAgICBTZXJ2ZXJDb25maWcuSW5zdGFuY2Uuc2V0SW50ZXJuYWxMb2dMZXZlbChtYXhJbnRlcm5hbExvZ0xldmVsKTtcclxuXHJcbiAgICAgICAgICAgIC8vIHNldCB0aGUgYWN0dWFsIGxvZyBsZXZlbCB0byB0aGUgbGV2ZWwgYWxsb3dlZCBieSB0aGUgc2VydmVyXHJcbiAgICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZVRvTG9nKE5TdHJpbmcuRm9ybWF0KFwiSW50ZXJuYWwgbG9nIGxldmVsIHdhcyByZXN0cmljdGVkIHRvICd7MH0nIGJ5IHRoZSBNYWdpYyB4cGEgc2VydmVyLlwiLCBtYXhJbnRlcm5hbExvZ0xldmVsKSwgZmFsc2UpO1xyXG4gICAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuTG9nTGV2ZWwgPSBtYXhMb2dMZXZlbDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgICAgLy8gM3JkIHJlcXVlc3Q6IEV4ZWN1dGVzIHRoZSBpbml0aWFsIHByb2dyYW0gaW4gdGhlIHNlcnZlci5cclxuICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgICBpZiAoIWF1dGhlbnRpY2F0aW9uQ2FuY2VsbGVkKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5FeGVjdXRlSW5pdGlhbFJlcXVlc3QoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGV4KSB7XHJcbiAgICAgIGlmIChleCBpbnN0YW5jZW9mIFNlcnZlckVycm9yKVxyXG4gICAgICAgIHRocm93IGV4O1xyXG5cclxuICAgICAgaWYgKGlzTnVsbE9yVW5kZWZpbmVkKGV4LklubmVyRXhjZXB0aW9uKSlcclxuICAgICAgICB0aHJvdyAgbmV3IFNlcnZlckVycm9yKGV4Lm1lc3NhZ2UsIG5ldyBFeGNlcHRpb24oZXgpKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIHRocm93IG5ldyBTZXJ2ZXJFcnJvcihleC5tZXNzYWdlLCBleC5Jbm5lckV4Y2VwdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuICFhdXRoZW50aWNhdGlvbkNhbmNlbGxlZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gcHJlcGFyZXMgaGFuZHNoYWtlIHJlcXVlc3QgdXJsIGZvciBhdXRoZW50aWNhdGlvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY29udGV4dElkXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdHhHcm91cFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic2Vzc2lvbkNvdW50XCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgUHJlcGFyZUF1dGhlbnRpY2F0aW9uVXJsKGNvbnRleHRJZDogc3RyaW5nLCBjdHhHcm91cDogc3RyaW5nLCBzZXNzaW9uQ291bnQ6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICBsZXQgaGFuZHNoYWtlQXV0aFVybDogc3RyaW5nID0gdGhpcy5TZXJ2ZXJVcmwgKyBDb25zdEludGVyZmFjZS5SRVFfQVJHX1NUQVJUICtcclxuICAgICAgQ29uc3RJbnRlcmZhY2UuUkNfSU5ESUNBVElPTiArIENvbnN0SW50ZXJmYWNlLlVURjhUUkFOUyArXHJcbiAgICAgIENvbnN0SW50ZXJmYWNlLlJDX1RPS0VOX0NUWF9JRCArIGNvbnRleHRJZDtcclxuXHJcbiAgICBpZiAoIWlzTnVsbE9yVW5kZWZpbmVkKHRoaXMuU2Vzc2lvbklkKSlcclxuICAgICAgaGFuZHNoYWtlQXV0aFVybCArPSAoQ29uc3RJbnRlcmZhY2UuUkVRX0FSR19TRVBBUkFUT1IgKyAgQ29uc3RJbnRlcmZhY2UuUkNfVE9LRU5fU0VTU0lPTl9JRCArIHRoaXMuU2Vzc2lvbklkKTtcclxuXHJcbiAgICBoYW5kc2hha2VBdXRoVXJsICs9IChDb25zdEludGVyZmFjZS5SRVFfQVJHX1NFUEFSQVRPUiArXHJcbiAgICAgICAgQ29uc3RJbnRlcmZhY2UuUkNfVE9LRU5fU0VTU0lPTl9DT1VOVCArIHNlc3Npb25Db3VudCArXHJcbiAgICAgICAgQ29uc3RJbnRlcmZhY2UuUkVRX0FSR19TRVBBUkFUT1IgK1xyXG4gICAgICAgIENvbnN0SW50ZXJmYWNlLlJDX1RPS0VOX0NUWF9HUk9VUCArIGN0eEdyb3VwICtcclxuICAgICAgICBDb25zdEludGVyZmFjZS5SRVFfQVJHX1NFUEFSQVRPUiArXHJcbiAgICAgICAgQ29uc3RJbnRlcmZhY2UuUkNfQVVUSEVOVElDQVRJT05fUkVRVUVTVCk7XHJcblxyXG4gICAgcmV0dXJuIGhhbmRzaGFrZUF1dGhVcmw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEV4ZWN1dGVzIHRoZSBpbml0aWFsIHByb2dyYW0gaW4gdGhlIHNlcnZlcjpcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgYXN5bmMgRXhlY3V0ZUluaXRpYWxSZXF1ZXN0KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgLy8gc2VuZCB0aGUgSU5JVElBTCByZXF1ZXN0IHRvIHRoZSBzZXJ2ZXIuXHJcbiAgICBhd2FpdCB0aGlzLkV4ZWN1dGVfMShDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2VuZGluZ0luc3RydWN0aW9uLlRBU0tTX0FORF9DT01NQU5EUywgQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1Nlc3Npb25TdGFnZS5JTklUSUFMLCBudWxsKTtcclxuICB9XHJcblxyXG4gIC8vIHByaXZhdGUgc3RhdGljIEdldExvZ29uRGlhbG9nRXhlY1Byb3BzKCk6IERpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+IHtcclxuICAvLyAgIGxldCBkaWN0aW9uYXJ5OiBEaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPiA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPigpO1xyXG4gIC8vICAgbGV0IHZhbHVlOiBzdHJpbmcgPSBDbGllbnRNYW5hZ2VyLkluc3RhbmNlLmdldExvZ29uV2luZG93VGl0bGUoKTtcclxuICAvLyAgIGxldCBmbGFnOiBib29sZWFuID0gTlN0cmluZy5Jc051bGxPckVtcHR5KHZhbHVlKTtcclxuICAvLyAgIGlmIChmbGFnKSB7XHJcbiAgLy8gICAgIHZhbHVlID0gXCJMb2dvbiAtIFwiICsgQ2xpZW50TWFuYWdlci5JbnN0YW5jZS5nZXRBcHBOYW1lKCk7XHJcbiAgLy8gICB9XHJcbiAgLy8gICBkaWN0aW9uYXJ5LkFkZChcIkxvZ29uV2luZG93VGl0bGVcIiwgdmFsdWUpO1xyXG4gIC8vICAgbGV0IHRleHQ6IHN0cmluZyA9IENsaWVudE1hbmFnZXIuSW5zdGFuY2UuZ2V0TG9nb25Hcm91cFRpdGxlKCk7XHJcbiAgLy8gICBsZXQgZmxhZzI6IGJvb2xlYW4gPSAhTlN0cmluZy5Jc051bGxPckVtcHR5KHRleHQpO1xyXG4gIC8vICAgaWYgKGZsYWcyKSB7XHJcbiAgLy8gICAgIHRleHQgPSAoKHRleHQubGVuZ3RoID4gNjIpID8gTlN0cmluZy5TdWJzdHJpbmcodGV4dCwgMCwgNjIpIDogdGV4dCk7XHJcbiAgLy8gICB9XHJcbiAgLy8gICBlbHNlIHtcclxuICAvLyAgICAgdGV4dCA9IFwiTG9nb24gUGFyYW1ldGVyc1wiO1xyXG4gIC8vICAgfVxyXG4gIC8vICAgZGljdGlvbmFyeS5BZGQoXCJMb2dvbkdyb3VwVGl0bGVcIiwgdGV4dCk7XHJcbiAgLy8gICBsZXQgdGV4dDI6IHN0cmluZyA9IENsaWVudE1hbmFnZXIuSW5zdGFuY2UuZ2V0TG9nb25Nc2dDYXB0aW9uKCk7XHJcbiAgLy8gICBsZXQgZmxhZzM6IGJvb2xlYW4gPSAhTlN0cmluZy5Jc051bGxPckVtcHR5KHRleHQyKTtcclxuICAvLyAgIGlmIChmbGFnMykge1xyXG4gIC8vICAgICB0ZXh0MiA9ICgodGV4dDIubGVuZ3RoID4gNTYpID8gTlN0cmluZy5TdWJzdHJpbmcodGV4dDIsIDAsIDU2KSA6IHRleHQyKTtcclxuICAvLyAgICAgZGljdGlvbmFyeS5BZGQoXCJMb2dvbk1lc3NhZ2VDYXB0aW9uXCIsIHRleHQyKTtcclxuICAvLyAgIH1cclxuICAvLyAgIGxldCBsb2dvbldpbmRvd0ljb25VUkw6IFVyaSA9IENsaWVudE1hbmFnZXIuSW5zdGFuY2UuZ2V0TG9nb25XaW5kb3dJY29uVVJMKCk7XHJcbiAgLy8gICBsZXQgZmxhZzQ6IGJvb2xlYW4gPSBVcmkub3BfSW5lcXVhbGl0eShsb2dvbldpbmRvd0ljb25VUkwsIG51bGwpICYmICFOU3RyaW5nLklzTnVsbE9yRW1wdHkobG9nb25XaW5kb3dJY29uVVJMLlRvU3RyaW5nKCkpO1xyXG4gIC8vICAgaWYgKGZsYWc0KSB7XHJcbiAgLy8gICAgIGRpY3Rpb25hcnkuQWRkKFwiTG9nb25XaW5kb3dJY29uVVJMXCIsIGxvZ29uV2luZG93SWNvblVSTC5Ub1N0cmluZygpKTtcclxuICAvLyAgIH1cclxuICAvLyAgIGxldCBsb2dvbldpbmRvd0ltYWdlVVJMOiBVcmkgPSBDbGllbnRNYW5hZ2VyLkluc3RhbmNlLmdldExvZ29uV2luZG93SW1hZ2VVUkwoKTtcclxuICAvLyAgIGxldCBmbGFnNTogYm9vbGVhbiA9IFVyaS5vcF9JbmVxdWFsaXR5KGxvZ29uV2luZG93SW1hZ2VVUkwsIG51bGwpICYmICFOU3RyaW5nLklzTnVsbE9yRW1wdHkobG9nb25XaW5kb3dJbWFnZVVSTC5Ub1N0cmluZygpKTtcclxuICAvLyAgIGlmIChmbGFnNSkge1xyXG4gIC8vICAgICBkaWN0aW9uYXJ5LkFkZChcIkxvZ29uSW1hZ2VVUkxcIiwgbG9nb25XaW5kb3dJbWFnZVVSTC5Ub1N0cmluZygpKTtcclxuICAvLyAgIH1cclxuICAvLyAgIGxldCB0ZXh0Mzogc3RyaW5nID0gQ2xpZW50TWFuYWdlci5JbnN0YW5jZS5nZXRMb2dvblVzZXJJZENhcHRpb24oKTtcclxuICAvLyAgIGxldCBmbGFnNjogYm9vbGVhbiA9ICFOU3RyaW5nLklzTnVsbE9yRW1wdHkodGV4dDMpO1xyXG4gIC8vICAgaWYgKGZsYWc2KSB7XHJcbiAgLy8gICAgIHRleHQzID0gKCh0ZXh0My5sZW5ndGggPiA5KSA/IE5TdHJpbmcuU3Vic3RyaW5nKHRleHQzLCAwLCA5KSA6IHRleHQzKTtcclxuICAvLyAgICAgZGljdGlvbmFyeS5BZGQoXCJMb2dvblVzZXJJRENhcHRpb25cIiwgdGV4dDMpO1xyXG4gIC8vICAgfVxyXG4gIC8vICAgbGV0IHRleHQ0OiBzdHJpbmcgPSBDbGllbnRNYW5hZ2VyLkluc3RhbmNlLmdldExvZ29uUGFzc3dvcmRDYXB0aW9uKCk7XHJcbiAgLy8gICBsZXQgZmxhZzc6IGJvb2xlYW4gPSAhTlN0cmluZy5Jc051bGxPckVtcHR5KHRleHQ0KTtcclxuICAvLyAgIGlmIChmbGFnNykge1xyXG4gIC8vICAgICB0ZXh0NCA9ICgodGV4dDQubGVuZ3RoID4gOSkgPyBOU3RyaW5nLlN1YnN0cmluZyh0ZXh0NCwgMCwgOSkgOiB0ZXh0NCk7XHJcbiAgLy8gICAgIGRpY3Rpb25hcnkuQWRkKFwiTG9nb25QYXNzd29yZENhcHRpb25cIiwgdGV4dDQpO1xyXG4gIC8vICAgfVxyXG4gIC8vICAgbGV0IGxvZ29uT0tDYXB0aW9uOiBzdHJpbmcgPSBDbGllbnRNYW5hZ2VyLkluc3RhbmNlLmdldExvZ29uT0tDYXB0aW9uKCk7XHJcbiAgLy8gICBsZXQgZmxhZzg6IGJvb2xlYW4gPSAhTlN0cmluZy5Jc051bGxPckVtcHR5KGxvZ29uT0tDYXB0aW9uKTtcclxuICAvLyAgIGlmIChmbGFnOCkge1xyXG4gIC8vICAgICBkaWN0aW9uYXJ5LkFkZChcIkxvZ29uT0tDYXB0aW9uXCIsIGxvZ29uT0tDYXB0aW9uKTtcclxuICAvLyAgIH1cclxuICAvLyAgIGxldCBsb2dvbkNhbmNlbENhcHRpb246IHN0cmluZyA9IENsaWVudE1hbmFnZXIuSW5zdGFuY2UuZ2V0TG9nb25DYW5jZWxDYXB0aW9uKCk7XHJcbiAgLy8gICBsZXQgZmxhZzk6IGJvb2xlYW4gPSAhTlN0cmluZy5Jc051bGxPckVtcHR5KGxvZ29uQ2FuY2VsQ2FwdGlvbik7XHJcbiAgLy8gICBpZiAoZmxhZzkpIHtcclxuICAvLyAgICAgZGljdGlvbmFyeS5BZGQoXCJMb2dvbkNhbmNlbENhcHRpb25cIiwgbG9nb25DYW5jZWxDYXB0aW9uKTtcclxuICAvLyAgIH1cclxuICAvLyAgIHJldHVybiBkaWN0aW9uYXJ5O1xyXG4gIC8vIH1cclxuXHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHJ1bnRpbWUgdGFzayB0cmVlIHN0cnVjdHVyZSBieSBnb2luZyB1cCBmcm9tIHRoZSBjdXJyZW50IHRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgR2V0VGFza1RyZWUodGFzazogVGFzayk6IExpc3Q8c3RyaW5nPiB7XHJcbiAgICBsZXQgdGFza1RyZWU6IExpc3Q8c3RyaW5nPiA9IG5ldyBMaXN0PHN0cmluZz4oKTtcclxuXHJcbiAgICB3aGlsZSghaXNOdWxsT3JVbmRlZmluZWQodGFzaykpXHJcbiAgICB7XHJcbiAgICAgIHRhc2tUcmVlLnB1c2godGFzay5nZXRUYXNrSW5mbygpKTtcclxuICAgICAgdGFzayA9IDxUYXNrPnRhc2suZ2V0UGFyZW50KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRhc2tUcmVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBVcGRhdGUgdGhlIHJlcXVlc3QgaW5mbyBvYmplY3QgdXNpbmcgaW5mb3JtYXRpb24gb2J0YWluZWQgZnJvbSBjdXJyZW50IG9wZXJhdGlvbiBiZWluZyBleGVjdXRlZC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgYXN5bmMgVXBkYXRlUmVxdWVzdEluZm8oKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgY3Vyck1HRGF0YTogTUdEYXRhID0gQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLmdldEN1cnJNR0RhdGEoKTtcclxuICAgIGxldCBldmVudHNNYW5hZ2VyOiBFdmVudHNNYW5hZ2VyID0gPEV2ZW50c01hbmFnZXI+QWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXI7XHJcbiAgICBsZXQgb3BlckV4ZWN1dGlvbjpib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgY21kc1RvU2VydmVyOiBDb21tYW5kc1RhYmxlID0gPENvbW1hbmRzVGFibGU+Y3Vyck1HRGF0YS5DbWRzVG9TZXJ2ZXI7XHJcblxyXG4gICAgZm9yKGxldCBpPTA7IGk8IGNtZHNUb1NlcnZlci5nZXRTaXplKCk7IGkrKylcclxuICAgIHtcclxuICAgICAgLy8gV2hlbiB0aGUgcmVxdWVzdCBpcyBiZWluZyBzZW50IHRvIHNlcnZlciBkdWUgdG8gYW4gb3BlcmF0aW9uIGV4ZWN1dGlvbiwgZ2V0IHRoZSBpbmZvcm1hdGlvbiBvZiBjdXJyZW50IG9wZXJhdGlvbiBmcm9tIENtZHNUb1NlcnZlclxyXG4gICAgICBpZihjbWRzVG9TZXJ2ZXIuZ2V0Q21kKGkpIGluc3RhbmNlb2YgRXhlY09wZXJDb21tYW5kKSB7XHJcbiAgICAgICAgbGV0IG9wZXJDbWQ6RXhlY09wZXJDb21tYW5kID0gPEV4ZWNPcGVyQ29tbWFuZD4oPENvbW1hbmRzVGFibGU+Y3Vyck1HRGF0YS5DbWRzVG9TZXJ2ZXIpLmdldENtZChpKTtcclxuXHJcbiAgICAgICAgdGhpcy5fcmVxdWVzdEluZm8uc2VydmVyQ2FsbEF0ID0gb3BlckNtZC5nZXRDb21tYW5kSW5mbygpO1xyXG5cclxuICAgICAgICB0aGlzLl9yZXF1ZXN0SW5mby5ydW50aW1lVGFza1RyZWUgPSB0aGlzLkdldFRhc2tUcmVlKG9wZXJDbWQuZ2V0VGFzaygpKTtcclxuICAgICAgICBvcGVyRXhlY3V0aW9uID0gdHJ1ZTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX3JlcXVlc3RJbmZvLmV4dHJhSW5mby5jb250ZXh0SUQgPSBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuQ29udGV4dElEO1xyXG4gICAgdGhpcy5fcmVxdWVzdEluZm8uZXh0cmFJbmZvLnNlc3Npb25Db3VudGVyID0gdGhpcy5HZXRTZXNzaW9uQ291bnRlcigpO1xyXG5cclxuICAgIC8vIExvZyBpbmZvcm1hdGlvbiBhYm91dCBtYWdpYyBpbnRlcm5hbCBldmVudHMgY2F1c2luZyByZXF1ZXN0cyB0byBzZXJ2ZXJcclxuICAgIGlmKCFvcGVyRXhlY3V0aW9uKVxyXG4gICAge1xyXG4gICAgICBpZihldmVudHNNYW5hZ2VyLmdldExhc3RSdEV2ZW50KCkgIT0gbnVsbCAmJiBldmVudHNNYW5hZ2VyLmdldExhc3RSdEV2ZW50KCkuSW50ZXJuYWxFdmVudCAhPSAwKVxyXG4gICAgICB7XHJcbiAgICAgICAgbGV0IHJ0RXZ0OlJ1blRpbWVFdmVudCA9IGV2ZW50c01hbmFnZXIuZ2V0TGFzdFJ0RXZlbnQoKTtcclxuICAgICAgICB0aGlzLl9yZXF1ZXN0SW5mby5ydW50aW1lVGFza1RyZWUgPSB0aGlzLkdldFRhc2tUcmVlKDxUYXNrPnJ0RXZ0LmdldFRhc2soKSk7XHJcblxyXG4gICAgICAgIC8vIHJldHVybiBkZXNjcmlwdGlvbiBhcyBwZXIgbmV3L29sZCBpbnRlcm5hbCBldmVudCBkZXNjXHJcbiAgICAgICAgbGV0IGV2ZW50RGVzY3JpcHRpb246IHN0cmluZyA9ICBydEV2dC5pc05ld0ludGVybmFsRXZlbnQoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IE5TdHJpbmcuVHJpbUVuZChydEV2dC5nZXROZXdJbnRlcm5hbEV2ZW50RGVzY3JpcHRpb24oKSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBFdmVudC5nZXRJbnRlcm5hbEV2dERlc2NyaXB0aW9uKHJ0RXZ0LkludGVybmFsRXZlbnQpO1xyXG5cclxuXHJcbiAgICAgICAgLy8gZS5nLiBFdmVudCBbPE5leHQgQ2h1bms+XSB3aGlsZSBleGVjdXRpbmcgWzxWaWV3IFJlZnJlc2g+XVxyXG4gICAgICAgIGxldCBjbWQ6IElDbGllbnRDb21tYW5kID0gY21kc1RvU2VydmVyLmdldENtZChjbWRzVG9TZXJ2ZXIuZ2V0U2l6ZSgpIC0gMSk7XHJcbiAgICAgICAgaWYoY21kIGFzIElDbGllbnRUb1NlcnZlckNvbW1hbmRJbmZvKSB7XHJcbiAgICAgICAgICBsZXQgY29tbWFuZEluZm86IHN0cmluZyA9IE5TdHJpbmcuSXNOdWxsT3JFbXB0eSgoPElDbGllbnRUb1NlcnZlckNvbW1hbmRJbmZvPmNtZCkuZ2V0Q29tbWFuZEluZm8oKSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IE5TdHJpbmcuRW1wdHlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICg8SUNsaWVudFRvU2VydmVyQ29tbWFuZEluZm8+Y21kKS5nZXRDb21tYW5kSW5mbygpO1xyXG5cclxuICAgICAgICAgIC8vIEluIGNhc2UgdGhlIHJ1bnRpbWUgZXZlbnQgYW5kIEV2ZW50IGNvbW1hbmQgYXJlIHNhbWUsIG5vIG5lZWQgdG8gbG9nIHRoZSBleHRyYSBpbmZvcm1hdGlvblxyXG4gICAgICAgICAgaWYoY21kIGluc3RhbmNlb2YgRXZlbnRDb21tYW5kICYmIHJ0RXZ0LkludGVybmFsRXZlbnQgPT0gKDxFdmVudENvbW1hbmQ+Y21kKS5NYWdpY0V2ZW50KVxyXG4gICAgICAgICAgICBldmVudERlc2NyaXB0aW9uID0gTlN0cmluZy5FbXB0eTtcclxuXHJcbiAgICAgICAgICB0aGlzLl9yZXF1ZXN0SW5mby5zZXJ2ZXJDYWxsQXQgPSAgJ0V2ZW50ICcgKyBjb21tYW5kSW5mbyArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCFOU3RyaW5nLklzTnVsbE9yRW1wdHkoZXZlbnREZXNjcmlwdGlvbilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBOU3RyaW5nLkZvcm1hdCgnIHdoaWxlIGV4ZWN1dGluZyBbezB9XScsIGV2ZW50RGVzY3JpcHRpb24pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogTlN0cmluZy5FbXB0eSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEJ1aWxkIHhtbCBmb3IgbWFpbiBwcm9nIGRhdGF2aWV3LiByZXF1aXJlZCBmb3IgcmUtaW5pdGlhbGl6aW5nIHNlc3Npb24uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGFzeW5jIEJ1aWxkWE1MRm9yTWFpblByb2dyYW1EYXRhVmlldygpOiBQcm9taXNlPFN0cmluZz5cclxuICB7XHJcbiAgICBsZXQgbWVzc2FnZTogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7XHJcbiAgICBsZXQgZmlyc3RNZ0RhdGE6IE1HRGF0YSA9IE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuZ2V0TUdEYXRhKDApO1xyXG4gICAgbGV0IG1haW5Qcmc6IFRhc2sgPSBmaXJzdE1nRGF0YS5nZXRNYWluUHJvZygwKTtcclxuXHJcbiAgICB3aGlsZSAobWFpblByZyAhPSBudWxsKVxyXG4gICAge1xyXG4gICAgICBhd2FpdCBtYWluUHJnLmJ1aWxkWE1MKG1lc3NhZ2UpO1xyXG4gICAgICBtYWluUHJnID0gZmlyc3RNZ0RhdGEuZ2V0TmV4dE1haW5Qcm9nKG1haW5QcmcuZ2V0Q3RsSWR4KCkpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5TaG91bGRTY3JhbWJsZUFuZFVuc2NyYW1ibGVNZXNzYWdlcylcclxuICAgIHtcclxuICAgICAgbGV0IHNjcmFtYmxlZENoYW5nZXM6IHN0cmluZyA9IFNjcmFtYmxlci5TY3JhbWJsZShtZXNzYWdlLlRvU3RyaW5nKCkpO1xyXG4gICAgICBtZXNzYWdlID0gbmV3IFN0cmluZ0J1aWxkZXIoc2NyYW1ibGVkQ2hhbmdlcyk7XHJcbiAgICB9XHJcblxyXG4gICAgbWVzc2FnZS5JbnNlcnQoMCwgWE1MQ29uc3RhbnRzLk1HX1RBR19PUEVOKTtcclxuICAgIG1lc3NhZ2UuQXBwZW5kKFhNTENvbnN0YW50cy5NR19UQUdfWE1MX0VORF9UQUdHRUQpO1xyXG5cclxuICAgIHJldHVybiBtZXNzYWdlLlRvU3RyaW5nKCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgYXN5bmMgRXhlY3V0ZV8xKHNlbmRpbmdJbnN0cnVjdGlvbjogQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1NlbmRpbmdJbnN0cnVjdGlvbiwgc2Vzc2lvblN0YWdlOiBDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2Vzc2lvblN0YWdlLCByZXM6IElSZXN1bHRWYWx1ZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHJlcUJ1Zjogc3RyaW5nO1xyXG4gICAgbGV0IGlzSW5pdGlhbENhbGw6IGJvb2xlYW4gPSBzZXNzaW9uU3RhZ2UgPT09IENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZXNzaW9uU3RhZ2UuSU5JVElBTDtcclxuICAgIGxldCBnbG9iYWxQYXJhbXNTdHJpbmc6IHN0cmluZyA9IG51bGw7XHJcblxyXG4gICAgaWYgKHRoaXMuRGVsYXlDb21tYW5kRXhlY3V0aW9uKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgaWYoTG9nZ2VyLkluc3RhbmNlLkxvZ0xldmVsID09IExvZ2dlcl9Mb2dMZXZlbHMuUmVxdWVzdEluZm8gJiYgIWlzSW5pdGlhbENhbGwpXHJcbiAgICAgIGF3YWl0IHRoaXMuVXBkYXRlUmVxdWVzdEluZm8oKTtcclxuXHJcbiAgICBpZiAoaXNJbml0aWFsQ2FsbCkge1xyXG4gICAgICBsZXQgdmFsID0gdGhpcy5SZXN0b3JlU2Vzc2lvblJlSW5pdGlhbGl6aW5nRGF0YUZyb21Mb2NhbFN0b3JhZ2UoQ29uc3RJbnRlcmZhY2UuSVNfU0VTU0lPTl9SRUlOSVRJQUxJWklORyk7XHJcbiAgICAgIGlmICh2YWwgPT09ICd0cnVlJykge1xyXG4gICAgICAgIFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLklzU2Vzc2lvblJlSW5pdGlhbGl6aW5nID0gKHZhbCA9PT0gXCJ0cnVlXCIpID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgICAgIFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLmxhc3RFeGNlcHRpb25NZXNzYWdlID0gdGhpcy5SZXN0b3JlU2Vzc2lvblJlSW5pdGlhbGl6aW5nRGF0YUZyb21Mb2NhbFN0b3JhZ2UoQ29uc3RJbnRlcmZhY2UuTEFTVF9FWENFUFRJT04pO1xyXG4gICAgICAgIGxldCBjdHhSZW1vdmVkID0gdGhpcy5SZXN0b3JlU2Vzc2lvblJlSW5pdGlhbGl6aW5nRGF0YUZyb21Mb2NhbFN0b3JhZ2UoQ29uc3RJbnRlcmZhY2UuQ1RYX1JFTU9WRURfRlJPTV9TUlZSKTtcclxuXHJcbiAgICAgICAgaWYgKGN0eFJlbW92ZWQgIT09ICcxJykge1xyXG4gICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXJyb3JUb0xvZyhSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5sYXN0RXhjZXB0aW9uTWVzc2FnZSk7XHJcbiAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVUb0xvZyhcIlNlc3Npb24gaXMgcmVpbml0aWFsaXppbmcuLi5cIiwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHNlbmRpbmdJbnN0cnVjdGlvbiA9PT0gQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1NlbmRpbmdJbnN0cnVjdGlvbi5OT19UQVNLU19PUl9DT01NQU5EUylcclxuICAgICAgcmVxQnVmID0gbnVsbDtcclxuICAgIGVsc2Uge1xyXG4gICAgICByZXFCdWYgPSBhd2FpdCB0aGlzLlByZXBhcmVSZXF1ZXN0KHNlbmRpbmdJbnN0cnVjdGlvbiA9PT0gQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1NlbmRpbmdJbnN0cnVjdGlvbi5UQVNLU19BTkRfQ09NTUFORFMpO1xyXG5cclxuICAgICAgaWYgKFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLklzU2Vzc2lvblJlSW5pdGlhbGl6aW5nIHx8ICFpc0luaXRpYWxDYWxsKSB7XHJcbiAgICAgICAgbGV0IGNoYW5nZXM6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpO1xyXG4gICAgICAgIGxldCBidWZmZXI6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpO1xyXG4gICAgICAgIGlmICghUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuSXNTZXNzaW9uUmVJbml0aWFsaXppbmcpXHJcbiAgICAgICAgICBidWZmZXIuQXBwZW5kKHJlcUJ1Zik7XHJcblxyXG4gICAgICAgIC8vIHNlbmQgYWN0aXZpdHkgbW9uaXRvciBsb2dzIHRvIHRoZSBzZXJ2ZXJcclxuICAgICAgICAvLyBpZiAodGhpcy5fbG9nQWNjdW11bGF0b3IgIT09IG51bGwgJiYgIXRoaXMuX2xvZ0FjY3VtdWxhdG9yLkVtcHR5KCkpXHJcbiAgICAgICAgLy8gICBidWZmZXIuQXBwZW5kKHRoaXMuX2xvZ0FjY3VtdWxhdG9yLlJlYWQoKSk7XHJcblxyXG4gICAgICAgIC8vIHN5bmNocm9uaXplIGNsaWVudC1zaWRlIFNldFBhcmFtcyBhbmQgSU5JUHV0IGRhdGEgdG8gdGhlIHNlcnZlclxyXG4gICAgICAgIGlmIChSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5Jc1Nlc3Npb25SZUluaXRpYWxpemluZylcclxuICAgICAgICAgIGdsb2JhbFBhcmFtc1N0cmluZyA9IHRoaXMuUmVzdG9yZVNlc3Npb25SZUluaXRpYWxpemluZ0RhdGFGcm9tTG9jYWxTdG9yYWdlKENvbnN0SW50ZXJmYWNlLkdMT0JBTF9QQVJBTV9MSVNUKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBnbG9iYWxQYXJhbXNTdHJpbmcgPSBBY2Nlc3NIZWxwZXIuZ2xvYmFsUGFyYW1zLm1pcnJvclRvWE1MKCk7XHJcbiAgICAgICAgY2hhbmdlcy5BcHBlbmQoZ2xvYmFsUGFyYW1zU3RyaW5nKTtcclxuICAgICAgICBjaGFuZ2VzLkFwcGVuZChBY2Nlc3NIZWxwZXIuZW52UGFyYW1zVGFibGUubWlycm9yVG9YTUwoKSk7XHJcblxyXG4gICAgICAgIC8vIElmIHRoZXJlIGlzIHN0dWZmIHRvIHN5bmNocm9uaXplLCB3cmFwIGl0LCBzY3JhbWJsZSBpdCBhbmQgYWRkIHRoZSBNR0RBVEEgZmxhZ1xyXG4gICAgICAgIGlmIChjaGFuZ2VzLkxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIGNoYW5nZXMuSW5zZXJ0KDAsIFwiPFwiICsgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0VOVl9DSEFOR0VTICsgXCI+XCIpO1xyXG4gICAgICAgICAgY2hhbmdlcy5BcHBlbmQoXCI8L1wiICsgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0VOVl9DSEFOR0VTICsgXCI+XCIpO1xyXG5cclxuICAgICAgICAgIGlmIChSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5TaG91bGRTY3JhbWJsZUFuZFVuc2NyYW1ibGVNZXNzYWdlcykge1xyXG4gICAgICAgICAgICBsZXQgc2NyYW1ibGVkQ2hhbmdlczogc3RyaW5nID0gU2NyYW1ibGVyLlNjcmFtYmxlKGNoYW5nZXMuVG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgIGNoYW5nZXMgPSBuZXcgU3RyaW5nQnVpbGRlcihzY3JhbWJsZWRDaGFuZ2VzKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGNoYW5nZXMuSW5zZXJ0KDAsIFhNTENvbnN0YW50cy5NR19UQUdfT1BFTik7XHJcbiAgICAgICAgICBjaGFuZ2VzLkFwcGVuZChYTUxDb25zdGFudHMuTUdfVEFHX1hNTF9FTkRfVEFHR0VEKTtcclxuXHJcbiAgICAgICAgICBidWZmZXIuQXBwZW5kKGNoYW5nZXMuVG9TdHJpbmcoKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXFCdWYgPSBidWZmZXIuVG9TdHJpbmcoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGxldCByZXF1ZXN0U3RhdHVzOiBSZWZQYXJhbTxSZXF1ZXN0U3RhdHVzPiA9IG5ldyBSZWZQYXJhbShSZXF1ZXN0U3RhdHVzLkhhbmRsZWQpO1xyXG4gICAgbGV0IHJlc3BCdWY6IHN0cmluZyA9IG51bGw7XHJcblxyXG4gICAgaWYgKFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLklzU2Vzc2lvblJlSW5pdGlhbGl6aW5nICkge1xyXG4gICAgICByZXFCdWYgPSAgcmVxQnVmICsgdGhpcy5SZXN0b3JlU2Vzc2lvblJlSW5pdGlhbGl6aW5nRGF0YUZyb21Mb2NhbFN0b3JhZ2UoQ29uc3RJbnRlcmZhY2UuTUFJTl9QUk9HX1ZJRVcpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuUmVtb3ZlZENvbnRleHRGcm9tU2VydmVyKVxyXG4gICAgICByZXF1ZXN0U3RhdHVzLnZhbHVlID0gUmVxdWVzdFN0YXR1cy5SZXRyeTsgLy90cnkgdG8gcmUtc3RhcnQgc2Vzc2lvbiBmaXJzdFxyXG4gICAgZWxzZVxyXG4gICAge1xyXG4gICAgICBpZiAoUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLlJlbW92aW5nQ29udGV4dEZyb21TZXJ2ZXIpXHJcbiAgICAgICAgUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLlJlbW92ZWRDb250ZXh0RnJvbVNlcnZlciA9IHRydWU7XHJcblxyXG4gICAgICByZXNwQnVmID0gYXdhaXQgdGhpcy5EaXNwYXRjaFJlcXVlc3QodGhpcy5TZXJ2ZXJVcmwsIHJlcUJ1Ziwgc2Vzc2lvblN0YWdlLCByZXF1ZXN0U3RhdHVzKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAocmVxdWVzdFN0YXR1cy52YWx1ZSA9PSBSZXF1ZXN0U3RhdHVzLlJldHJ5KSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuUmVTdGFydFNlc3Npb24oKTtcclxuICAgIH1cclxuICAgIGlmIChyZXNwQnVmID09IG51bGwpXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBpZiAoaXNJbml0aWFsQ2FsbClcclxuICAgIHtcclxuICAgICAgUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuSW5pdGlhbFVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xyXG4gICAgICBpZiAoUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuSXNTZXNzaW9uUmVJbml0aWFsaXppbmcpIHtcclxuICAgICAgICBsZXQgZGF0YVN0b3JhZ2UgPSB3aW5kb3cubG9jYWxTdG9yYWdlO1xyXG4gICAgICAgIGRhdGFTdG9yYWdlLnJlbW92ZUl0ZW0oQ29uc3RJbnRlcmZhY2UuSVNfU0VTU0lPTl9SRUlOSVRJQUxJWklORyk7XHJcbiAgICAgICAgZGF0YVN0b3JhZ2UucmVtb3ZlSXRlbShDb25zdEludGVyZmFjZS5NQUlOX1BST0dfVklFVyk7XHJcbiAgICAgICAgZGF0YVN0b3JhZ2UucmVtb3ZlSXRlbShDb25zdEludGVyZmFjZS5HTE9CQUxfUEFSQU1fTElTVCk7XHJcbiAgICAgICAgZGF0YVN0b3JhZ2UucmVtb3ZlSXRlbShDb25zdEludGVyZmFjZS5MQVNUX0VYQ0VQVElPTik7XHJcblxyXG5cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIEZsb3dNb25pdG9yUXVldWUuSW5zdGFuY2UuZW5hYmxlKGZhbHNlKTtcclxuICAgIGF3YWl0IHRoaXMuUHJvY2Vzc1Jlc3BvbnNlKHJlc3BCdWYsIEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5jdXJyTWdkSUQsIG51bGwsIHJlcyk7XHJcblxyXG4gICAgaWYgKFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLklzU2Vzc2lvblJlSW5pdGlhbGl6aW5nKSB7XHJcbiAgICAgIEFjY2Vzc0hlbHBlci5nbG9iYWxQYXJhbXMuUmVzdG9yZUdsb2JhbFBhcmFtcyhnbG9iYWxQYXJhbXNTdHJpbmcpO1xyXG5cclxuICAgICAgbGV0IGRhdGFTdG9yYWdlID0gd2luZG93LmxvY2FsU3RvcmFnZTtcclxuICAgICAgbGV0IGN0eFJlbW92ZWQgPSBkYXRhU3RvcmFnZS5nZXRJdGVtKENvbnN0SW50ZXJmYWNlLkNUWF9SRU1PVkVEX0ZST01fU1JWUik7XHJcblxyXG4gICAgICBpZiAoY3R4UmVtb3ZlZCA9PT0gXCIxXCIpIHtcclxuXHJcbiAgICAgIEV2ZW50c01hbmFnZXIuSW5zdGFuY2UucmVzdG9yZUxhc3RTYXZlZFJvdXRlRXZlbnRGcm9tTG9jYWxTdG9yYWdlKCk7XHJcblxyXG4gICAgICBkYXRhU3RvcmFnZS5yZW1vdmVJdGVtKENvbnN0SW50ZXJmYWNlLkNUWF9SRU1PVkVEX0ZST01fU1JWUik7XHJcbiAgICAgIGRhdGFTdG9yYWdlLnJlbW92ZUl0ZW0oQ29uc3RJbnRlcmZhY2UuTEFTVF9ST1VURV9FVkVOVCk7XHJcbiAgICAgIGRhdGFTdG9yYWdlLnJlbW92ZUl0ZW0oQ29uc3RJbnRlcmZhY2UuTEFTVF9ST1VURV9FVkVOVF9TUkNfVFNLKTtcclxuICAgICAgZGF0YVN0b3JhZ2UucmVtb3ZlSXRlbShDb25zdEludGVyZmFjZS5MQVNUX1JPVVRFX0VWRU5UX0FSR19MSVNUKTtcclxuICAgIH1cclxuXHJcbiAgICAgIFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLklzU2Vzc2lvblJlSW5pdGlhbGl6aW5nID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICAvLyBpZiAoaXNJbml0aWFsQ2FsbCkge1xyXG4gICAgLy8gICAvLyBJZiBpdCB3YXMgaW5pdGlhbCBjYWxsLCB3ZSB3aWxsIHNlbmQgYWxsIHBlbmRpbmcgbG9ncyAoRmFpbGVkIGVhcmxpZXIgZXhlY3V0aW9uIHNjZW5hcmlvKVxyXG4gICAgLy8gICAvLyBUaGV5IHdpbGwgYmUgc2VudCBoZXJlLCBhZnRlciBmaXJzdCByZXF1ZXN0IGlzIHNlcnZlZC5cclxuICAgIC8vICAgaWYgKENsaWVudE1hbmFnZXIuSW5zdGFuY2UuZ2V0TG9nQ2xpZW50U2VxdWVuY2VGb3JBY3Rpdml0eU1vbml0b3IoKSAmJiBDbGllbnRMb2dBY2N1bXVsYXRvci5FeGlzdGluZ0xvZ3NGb3VuZCgpKSB7XHJcbiAgICAvLyAgICAgbGV0IHN1Y2Nlc3M6IGJvb2xlYW4gPSB0aGlzLlNlbmRQZW5kaW5nTG9nc1RvU2VydmVyKCk7XHJcbiAgICAvL1xyXG4gICAgLy8gICAgIC8vIGlmIHdlIGhhdmUgc3VjY2Vzc2Z1bGx5IHNlbnQgdGhlIHBlbmRpbmcgbG9ncyBkZWxldGUgdGhlbVxyXG4gICAgLy8gICAgIGlmIChzdWNjZXNzKSB7XHJcbiAgICAvLyAgICAgICBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5EZWxldGVQZW5kaW5nTG9ncygpO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vICAgfVxyXG4gICAgLy8gfVxyXG4gICAgLy8gZWxzZSBpZiAodGhpcy5fbG9nQWNjdW11bGF0b3IgIT09IG51bGwgJiYgIXRoaXMuX2xvZ0FjY3VtdWxhdG9yLkVtcHR5KCkpIHtcclxuICAgIC8vICAgLy8gQWNjdW11bGF0ZWQgbG9ncyB3ZXJlIHNlbnQsIHNvIHJlc2V0IChkZWxldGUpIHRoZW0gbm93XHJcbiAgICAvLyAgIHRoaXMuX2xvZ0FjY3VtdWxhdG9yLlJlc2V0KCk7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgLy8gcmVmcmVzaCB0aGUgZGlzcGxheXNcclxuICAgIGlmIChzZW5kaW5nSW5zdHJ1Y3Rpb24gPT09IENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZW5kaW5nSW5zdHJ1Y3Rpb24uVEFTS1NfQU5EX0NPTU1BTkRTKSB7XHJcbiAgICAgIEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5zdGFydFRhc2tzSXRlcmF0aW9uKCk7XHJcbiAgICAgIGxldCB0YXNrOiBUYXNrQmFzZTtcclxuICAgICAgd2hpbGUgKCh0YXNrID0gPFRhc2tCYXNlPkFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5nZXROZXh0VGFzaygpKSAhPT0gbnVsbCkge1xyXG4gICAgICAgIGxldCBkYXRhVmlld1dhc1JldHJpZXZlZDogYm9vbGVhbiA9IHRhc2suRGF0YVZpZXdXYXNSZXRyaWV2ZWQ7XHJcbiAgICAgICAgaWYgKGRhdGFWaWV3V2FzUmV0cmlldmVkKSB7XHJcbiAgICAgICAgICBhd2FpdCB0YXNrLlJlZnJlc2hEaXNwbGF5KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGlzSW5pdGlhbENhbGwpXHJcbiAgICAgIFNlcnZlckNvbmZpZy5JbnN0YW5jZS5zZXRHbG9iYWxQYXJhbXMobnVsbCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+c2VuZCAncmVxQnVmJyB0byAndXJsJzsgcmVjZWl2ZSBhIHJlc3BvbnNlLlxyXG4gIC8vLyBGb3IgTm9ybWFsL0luaXRpYWxDYWxsIHJlcXVlc3RzLCB0aGUgdXJsIHBvaW50cyB0byB0aGUgd2ViLXJlcXVlc3Rlci5cclxuICAvLy8gVGhlIG90aGVyIHBhcmFtZXRlcnMgYW5kIGRhdGEgZ29lcyBhcyB0aGUgZW5jb2RlZCBib2R5LlxyXG4gIC8vLyBUaGlzIG1lYW5zIHRoYXQgaXQgaXMgYSBQT1NUIHJlcXVlc3QuXHJcbiAgLy8vIE9uIHRoZSBvdGhlciBoYW5kLCBIYW5kU2hha2UgcmVxdWVzdCBpcyBhIEdFVCByZXF1ZXN0IGFuZCBzbyB0aGUgcGFyYW1ldGVycyBhcmVcclxuICAvLy8gc2VudCBpbiB0aGUgVVJMIGl0c2VsZi4gSW4gdGhpcyBjYXNlLCBlbmNvZGVkQm9keSBoYXMgdG8gYmUgbnVsbC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInVybFwiPlVSTCB0byBiZSBhY2Nlc3NlZC48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInJlcUJ1ZlwiPmRhdGEgdG8gYmUgc2VudCB0byB0aGUgdXJsPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzZXNzaW9uU3RhZ2VcIj5IQU5EU0hBS0UgLyBJTklUSUFMIC8gTk9STUFMLjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPnJlc3BvbnNlPC9yZXR1cm5zPlxyXG4gICBwcml2YXRlIGFzeW5jIERpc3BhdGNoUmVxdWVzdCh1cmw6IHN0cmluZywgcmVxQnVmOiBzdHJpbmcsIHNlc3Npb25TdGFnZTogQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1Nlc3Npb25TdGFnZSwgcmVxdWVzdFN0YXR1czogUmVmUGFyYW08UmVxdWVzdFN0YXR1cz4pOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgbGV0IHJlc3BvbnNlOiBzdHJpbmcgPSBudWxsO1xyXG4gICAgbGV0IGVuY29kZWRCb2R5OiBzdHJpbmcgPSBudWxsO1xyXG4gICAgcmVxdWVzdFN0YXR1cy52YWx1ZSA9IFJlcXVlc3RTdGF0dXMuSGFuZGxlZDtcclxuXHJcbiAgICBpZiAodXJsID09PSBudWxsKSB7XHJcbiAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nV2l0aE1zZyhcImluIHNlbmRNc2dUb1NydnIoKSB1bmtub3duIHNlcnZlclwiKTtcclxuICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChzZXNzaW9uU3RhZ2UgIT09IENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZXNzaW9uU3RhZ2UuSEFORFNIQUtFKSB7XHJcbiAgICAgIGxldCB1cmxTdWZmaXg6IHN0cmluZyA9IHRoaXMuQnVpbGRVcmxTdWZmaXgocmVxQnVmICE9PSBudWxsLCBzZXNzaW9uU3RhZ2UgPT09IENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZXNzaW9uU3RhZ2UuSU5JVElBTCk7XHJcbiAgICAgIGxldCByZXFCdWZFbmNvZGVkOiBzdHJpbmcgPSBIdHRwVXRpbGl0eS5VcmxFbmNvZGUocmVxQnVmLCBFbmNvZGluZy5VVEY4KTtcclxuICAgICAgZW5jb2RlZEJvZHkgPSB1cmxTdWZmaXggKyByZXFCdWZFbmNvZGVkO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAgdHJ5IHtcclxuICAgICAgIGlmIChMb2dnZXIuSW5zdGFuY2UuU2hvdWxkTG9nRXh0ZW5kZWRTZXJ2ZXJSZWxhdGVkTWVzc2FnZXMoKSlcclxuICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlU2VydmVyTWVzc2FnZXNUb0xvZyhOU3RyaW5nLkZvcm1hdChcIk1FU1NBR0UgVE8gU0VSVkVSOlxcbiBVUkw6IHswfVxcbiBCT0RZOiB7MX1cIiwgdXJsLCBlbmNvZGVkQm9keSkpO1xyXG5cclxuICAgICAgIHJlc3BvbnNlID0gYXdhaXQgdGhpcy5FeGVjdXRlUmVxdWVzdCh1cmwsIGVuY29kZWRCb2R5KTtcclxuXHJcbiAgICAgICAvKiByZW1vdmUgdGhlIHVud2FudGVkIGRhdGEgYmVmb3JlIHRoZSBNR0RBVEEgdGFnICovXHJcbiAgICAgICBpZiAoIXJlc3BvbnNlLnRvVXBwZXJDYXNlKCkuc3RhcnRzV2l0aChcIjxIVE1MXCIpKSB7XHJcbiAgICAgICAgIGxldCBzdGFydElkeDogbnVtYmVyID0gcmVzcG9uc2UuaW5kZXhPZihcIjx4bWwgaWQ9XFxcIk1HREFUQVxcXCI+XCIpO1xyXG4gICAgICAgICBpZiAoc3RhcnRJZHggPiAwKVxyXG4gICAgICAgICAgIHJlc3BvbnNlID0gcmVzcG9uc2Uuc3Vic3RyKHN0YXJ0SWR4KTtcclxuICAgICAgIH1cclxuXHJcbiAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVTZXJ2ZXJNZXNzYWdlc1RvTG9nKFwiTUVTU0FHRSBGUk9NIFNFUlZFUjogXCIgKyByZXNwb25zZSk7XHJcblxyXG4gICAgICAgLy8gaGFuZHNoYWtlIHJlcXVlc3RzIGFyZSBhbHdheXMgc2NyYW1ibGVkICh0aGUgc2NyYW1ibGluZyBjYW4gYmUgZGlzYWJsZWQgc3RhcnRpbmcgZnJvbSB0aGUgM3JkIHJlcXVlc3QpLlxyXG4gICAgICAgaWYgKHNlc3Npb25TdGFnZSA9PT0gQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1Nlc3Npb25TdGFnZS5IQU5EU0hBS0UgfHxcclxuICAgICAgICAgKHJlc3BvbnNlLmxlbmd0aCA+IDAgJiZcclxuICAgICAgICAgICBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5TaG91bGRTY3JhbWJsZUFuZFVuc2NyYW1ibGVNZXNzYWdlcyAmJiByZXNwb25zZSAhPT0gXCI8eG1sIGlkPVxcXCJNR0RBVEFcXFwiPlxcbjwveG1sPlwiKSkge1xyXG4gICAgICAgICBpZiAoc2Vzc2lvblN0YWdlID09PSBDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2Vzc2lvblN0YWdlLkhBTkRTSEFLRSkge1xyXG4gICAgICAgICAgIC8vIGhhbmRzaGFrZSByZXF1ZXN0cyBhcmUgYWx3YXlzIHNjcmFtYmxlZC5cclxuICAgICAgICAgICBEZWJ1Zy5Bc3NlcnQocmVzcG9uc2UubGVuZ3RoID4gMCAmJiByZXNwb25zZVswXSAhPT0gJzwnKTtcclxuICAgICAgICAgfVxyXG4gICAgICAgICByZXNwb25zZSA9IENvbW1hbmRzUHJvY2Vzc29yQmFzZS5VblNjcmFtYmxlKHJlc3BvbnNlKTtcclxuICAgICAgIH1cclxuXHJcbiAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKFwiTUVTU0FHRSBGUk9NIFNFUlZFUjogKHNpemUgPSBcIiArIHJlc3BvbnNlLmxlbmd0aCArIFwiKVwiICsgT1NFbnZpcm9ubWVudC5Fb2xTZXEgKyByZXNwb25zZSk7XHJcblxyXG4gICAgICB0aGlzLl9sYXN0UmVxdWVzdFRpbWUgPSBNaXNjLmdldFN5c3RlbU1pbGxpc2Vjb25kcygpO1xyXG4gICAgIH1cclxuICAgICBjYXRjaCAoZXgpXHJcbiAgICAge1xyXG4gICAgICAgaWYgKGV4IGluc3RhbmNlb2YgU2VydmVyRXJyb3IpIHtcclxuICAgICAgICAgcmVxdWVzdFN0YXR1cy52YWx1ZSA9IFJlcXVlc3RTdGF0dXMuQWJvcnQ7XHJcblxyXG5cclxuICAgICAgICAgaWYgKHNlc3Npb25TdGFnZSA9PSBDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2Vzc2lvblN0YWdlLk5PUk1BTCkge1xyXG4gICAgICAgICAgIC8vIElmIGNvbnRleHQgaXMgbm90IGZvdW5kIGF0IHNlcnZlciBkdWUgdG8gY3Jhc2ggb3IgdGhyZWFkIGlzIGFib3J0ZWQgZHVlIHRvIGNyYXNoLFxyXG4gICAgICAgICAgIC8vIGNoZWNrIFdlYkNsaWVudFJlaW5pdFNlc3Npb24uIGJhc2VkIG9uIHRoZSBmbGFnLCByZS1pbml0aWFsaXppbmcgcmVxdWVzdCBzaG91bGQgYmUgc2VudCB0byBjcmVhdGVcclxuICAgICAgICAgICAvLyBhIG5ldyBjb250ZXh0IGFuZCBpdCBzaG91bGQgYmUgZXhlY3V0ZWQgaW4gdGhpcyBuZXcgY29udGV4dC5cclxuICAgICAgICAgICAvLyBzbywgc2V0IHRoZSBSZXF1ZXN0U3RhdHVzIHRvIFJldHJ5IHNvIHRoYXQgdGhlIGNsaWVudCB3aWxsIHJlc2VuZCByZXF1ZXN0LlxyXG4gICAgICAgICAgIGlmIChleC5HZXRDb2RlKCkgPT0gU2VydmVyRXJyb3IuRVJSX0NUWF9OT1RfRk9VTkQgfHwgZXguR2V0Q29kZSgpID09IFNlcnZlckVycm9yLkVSUl9USFJFQURfQUJPUlRFRCkge1xyXG4gICAgICAgICAgICAgaWYgKFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5SZW1vdmVkQ29udGV4dEZyb21TZXJ2ZXIpIHtcclxuICAgICAgICAgICAgICAgcmVxdWVzdFN0YXR1cy52YWx1ZSA9IFJlcXVlc3RTdGF0dXMuUmV0cnk7XHJcbiAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgc3dpdGNoIChFbnZpcm9ubWVudC5JbnN0YW5jZS5nZXRXZWJDbGllbnRSZWluaXRTZXNzaW9uKCkpIHtcclxuICAgICAgICAgICAgICAgICBjYXNlICdZJyA6XHJcbiAgICAgICAgICAgICAgICAgICByZXF1ZXN0U3RhdHVzLnZhbHVlID0gUmVxdWVzdFN0YXR1cy5SZXRyeTtcclxuICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgIGNhc2UgJ0EnOlxyXG4gICAgICAgICAgICAgICAgICAgbGV0IHJldHZhbCA9IGF3YWl0IEdVSU1hbmFnZXIuSW5zdGFuY2UuTWVzc2FnZUJveChcIkVycm9yXCIsIFwiVW5rbm93biBlcnJvciBvY2N1cnJlZCBhdCBzZXJ2ZXItc2lkZS5cIiArXHJcbiAgICAgICAgICAgICAgICAgICAgIFwiIFdvdWxkIHlvdSBsaWtlIHRvIHJlaW5pdGlhbGl6ZSB0aGUgc2Vzc2lvbj9cIiwgU3R5bGVzLk1TR0JPWF9CVVRUT05fWUVTX05PKTtcclxuICAgICAgICAgICAgICAgICAgIHJlcXVlc3RTdGF0dXMudmFsdWUgPSAocmV0dmFsID09IFN0eWxlcy5NU0dCT1hfUkVTVUxUX1lFUykgPyBSZXF1ZXN0U3RhdHVzLlJldHJ5IDogUmVxdWVzdFN0YXR1cy5BYm9ydDtcclxuICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgIGNhc2UgJ04nOlxyXG4gICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICByZXF1ZXN0U3RhdHVzLnZhbHVlID0gUmVxdWVzdFN0YXR1cy5BYm9ydDtcclxuICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICBpZiAocmVxdWVzdFN0YXR1cy52YWx1ZSA9PSBSZXF1ZXN0U3RhdHVzLkFib3J0KVxyXG4gICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICBFbnZpcm9ubWVudC5JbnN0YW5jZS5zZXRXZWJDbGllbnRSZWluaXRTZXNzaW9uKCdOJyk7XHJcbiAgICAgICAgICAgICAgIHRocm93ICBleDtcclxuICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICBsZXQgZXJyRm9yQ29uc29sZSA9IFN0clV0aWwuZ2V0Q29uc29sZUVyb3JTdHJpbmcoZXguR2V0TWVzc2FnZSgpKTtcclxuICAgICAgICAgICAgICAgUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IubGFzdEV4Y2VwdGlvbk1lc3NhZ2UgPSBcIkV4Y2VwdGlvbiBPY2N1cmVkIGF0IHNlcnZlciBzaWRlIDogXCIgKyBleC5HZXRDb2RlKCkudG9TdHJpbmcoKSArIFwiIDogXCIgKyBlcnJGb3JDb25zb2xlO1xyXG4gICAgICAgICAgICAgICBjb25zb2xlLmxvZyhSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5sYXN0RXhjZXB0aW9uTWVzc2FnZSk7XHJcbiAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICB9XHJcbiAgICAgICAgIH1cclxuICAgICAgIH1cclxuICAgICAgIC8vSWYgYW55IGl0ZW1zIGFyZSBzdG9yZWQgb24gbG9jYWwgc3RvcmFnZSBjbGVhciBpdCBub3cgYXMgc2Vzc2lvbiBjYW5ub3QgY29udGludWVkLlxyXG4gICAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5jbGVhcigpO1xyXG4gICAgICAgdGhyb3cgZXg7XHJcbiAgICAgfVxyXG4gICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBDaGVja3MgdGhlIHJlc3BvbnNlIHN0cmluZywgdGhyb3dzIGFuIGVycm9yIGlmIHRoZSByZXNwb25zZSBzdHJpbmcgY29udGFpbnNcclxuICAvLy8gYW4geG1sL2h0bWwgZXJyb3I8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicmVzcG9uc2VcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgSGFuZGxlRXJyb3JSZXNwb25zZShyZXNwb25zZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0cnkge1xyXG4gICAgICAvLyBlcnJvciByZXNwb25zZXMgYXJlIGFsd2F5cyBzY3JhbWJsZWQgYnkgdGhlIHdlYiBzZXJ2ZXIuXHJcbiAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZVNlcnZlck1lc3NhZ2VzVG9Mb2coXCJNRVNTQUdFIEZST00gU0VSVkVSOiBcIiArIHJlc3BvbnNlKTtcclxuICAgICAgcmVzcG9uc2UgPSBDb21tYW5kc1Byb2Nlc3NvckJhc2UuVW5TY3JhbWJsZShyZXNwb25zZSk7XHJcbiAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZVNlcnZlck1lc3NhZ2VzVG9Mb2coXCJNRVNTQUdFIEZST00gU0VSVkVSOiBcIiArIFN0clV0aWwuZ2V0Q29uc29sZUVyb3JTdHJpbmcocmVzcG9uc2UpKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChleCkge1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChyZXNwb25zZS5zdGFydHNXaXRoKFwiPHhtbGVyclwiKSkge1xyXG4gICAgICAgIGxldCBlcnJvck1lc3NhZ2VYbWw6IEVycm9yTWVzc2FnZVhtbCA9IG5ldyBFcnJvck1lc3NhZ2VYbWwocmVzcG9uc2UsIHRoaXMuX2xhc3RSZXF1ZXN0VGltZSwgQWNjZXNzSGVscGVyLmVudmlyb25tZW50LmdldENvbnRleHRJbmFjdGl2aXR5VGltZW91dCgpKTtcclxuICAgICAgdGhyb3cgbmV3IFNlcnZlckVycm9yKGVycm9yTWVzc2FnZVhtbC5HZXRNZXNzYWdlKCksIGVycm9yTWVzc2FnZVhtbC5HZXRDb2RlKCkpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAocmVzcG9uc2UudG9VcHBlckNhc2UoKS5zdGFydHNXaXRoKFwiPEhUTUxcIikpIHtcclxuICAgICAgdGhyb3cgbmV3IFNlcnZlckVycm9yKHJlc3BvbnNlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5zZW5kICdlbmNvZGVkQm9keScgdG8gJ3VybCcgYW5kIHJlY2VpdmUgYSByZXNwb25zZS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInVybFwiPlVSTCB0byBiZSBhY2Nlc3NlZC48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImVuY29kZWRCb2R5XCI+SW4gY2FzZSBvZiBQT1NULCBjb250ZW50IHRvIGJlIHNlbnQgdG8gc2VydmVyLiBGb3Igb3RoZXIgbWV0aG9kcywgbnVsbC48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz50aGUgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyPC9yZXR1cm5zPlxyXG4gcHJpdmF0ZSBhc3luYyBFeGVjdXRlUmVxdWVzdCh1cmw6IHN0cmluZywgZW5jb2RlZEJvZHk6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5HZXRDb250ZW50KHVybCwgZmFsc2UsIGVuY29kZWRCb2R5KTtcclxuICB9XHJcblxyXG4gIGFzeW5jIEdldENvbnRlbnQocmVxdWVzdGVkVVJMOiBzdHJpbmcsIHVzZUNhY2hlOiBib29sZWFuLCByZXF1ZXN0Q29udGVudD86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICBpZiAoaXNVbmRlZmluZWQocmVxdWVzdENvbnRlbnQpKVxyXG4gICAgICByZXF1ZXN0Q29udGVudCA9IG51bGw7XHJcblxyXG4gICAgbGV0IHJlc3BvbnNlU3RyOiBzdHJpbmc7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgLy8gaWYgcmVsYXRpdmUsIHByZWZpeCB3aXRoIHRoZSAncHJvdG9jb2w6Ly9zZXJ2ZXIvJyBmcm9tIHdoaWNoIHRoZSByaWNoLWNsaWVudCB3YXMgYWN0aXZhdGVkXHJcbiAgICAgIGlmIChyZXF1ZXN0ZWRVUkwuc3RhcnRzV2l0aChcIi9cIikpXHJcbiAgICAgICAgcmVxdWVzdGVkVVJMID0gU2VydmVyQ29uZmlnLkluc3RhbmNlLmdldFByb3RvY29sKCkgKyBcIjovL1wiICsgU2VydmVyQ29uZmlnLkluc3RhbmNlLmdldFNlcnZlcigpICsgcmVxdWVzdGVkVVJMO1xyXG5cclxuICAgICAgdmFyIHNwaW5uZXJUaW1lciA9IHRpbWVyKDUwLCA1MCk7XHJcbiAgICAgIHZhciBzcGlubmVyVGltZXJTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiA9IHNwaW5uZXJUaW1lci5zdWJzY3JpYmUoc3RhdGUgPT4ge1xyXG4gICAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkNoZWNrQW5kU2hvd1NwaW5uZXIodHJ1ZSk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgbGV0IGlzRXJyb3I6IFJlZlBhcmFtPGJvb2xlYW4+ID0gbmV3IFJlZlBhcmFtKGZhbHNlKTtcclxuXHJcbiAgICAgIFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLnJlcXVlc3ROdW1iZXIrKzsgLy8gaW5jcmVhc2UgdGhlIG5vIG9mIHJlcXVlc3RzXHJcbiAgICAgIHJlc3BvbnNlU3RyID0gYXdhaXQgSHR0cE1hbmFnZXIuR2V0SW5zdGFuY2UoKS5HZXRDb250ZW50KHJlcXVlc3RlZFVSTCwgcmVxdWVzdENvbnRlbnQsIHVzZUNhY2hlLCBpc0Vycm9yKTtcclxuICAgICAgUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IudG90YWxSZXNwb25zZURhdGFMZW5ndGggKz0gUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IudG90YWxSZXNwb25zZURhdGFMZW5ndGggKyAoIWlzTnVsbE9yVW5kZWZpbmVkKHJlc3BvbnNlU3RyKSA/IHJlc3BvbnNlU3RyLmxlbmd0aCA6IDApO1xyXG5cclxuICAgICAgc3Bpbm5lclRpbWVyU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgIHNwaW5uZXJUaW1lclN1YnNjcmlwdGlvbiA9IG51bGw7XHJcblxyXG4gICAgICBpZiAoaXNFcnJvci52YWx1ZSkge1xyXG4gICAgICAgIHRoaXMuSGFuZGxlRXJyb3JSZXNwb25zZShyZXNwb25zZVN0cik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGNhdGNoIChleCkge1xyXG4gICAgICAvLyBkb24ndCB3cml0ZSBzZXJ2ZXIgZXJyb3IgdG8gbG9nIHdoZW4gdGhlIGxvZyBsZXZlbCBpcyBiYXNpY1xyXG4gICAgICBpZiAoIShleCBpbnN0YW5jZW9mIFNlcnZlckVycm9yKSB8fCBMb2dnZXIuSW5zdGFuY2UuTG9nTGV2ZWwgIT09IExvZ2dlcl9Mb2dMZXZlbHMuQmFzaWMpIHtcclxuICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZyhleCwgTlN0cmluZy5Gb3JtYXQoXCJyZXF1ZXN0ZWQgVVJMID0gXFxcInswfVxcXCJcIiwgcmVxdWVzdGVkVVJMKSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIHRoZSBleGNlcHRpb24gc2hvdWxkIGJlIHRocm93biBhbmQgdGhlIGNhbGxlcnMgc2hvdWxkIGhhbmRsZSBpdC5cclxuICAgICAgaWYgKCEoZXggaW5zdGFuY2VvZiBTZXJ2ZXJFcnJvcikpIHtcclxuICAgICAgICBleCA9IG5ldyBTZXJ2ZXJFcnJvcihleC5NZXNzYWdlLCBleC5Jbm5lckV4Y2VwdGlvbiA/IGV4LklubmVyRXhjZXB0aW9uIDogZXgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aHJvdyBleDtcclxuICAgIH1cclxuICAgIGZpbmFsbHkge1xyXG4gICAgICBpZiAoc3Bpbm5lclRpbWVyU3Vic2NyaXB0aW9uICE9IG51bGwpXHJcbiAgICAgICAgc3Bpbm5lclRpbWVyU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJlc3BvbnNlU3RyO1xyXG4gIH1cclxuXHJcblxyXG4gIENsaWVudEFjdGl2YXRlZChleGVjdXRpb25UaW1lKSB7XHJcblxyXG4gICAgLy8gbG9nIHRoZSB2YWx1ZXMgYXMgY2xpZW50IGlzIGFjdGl2ZSBhZ2FpblxyXG4gICAgLy8gVE9ETyAtIGZvcm1hdHRpbmdcclxuICAgIC8vIGNvbnNvbGUubG9nKCdMb2dnaW5nIFN1bW1hcnkgJyArICdcXG4nICtcclxuICAgIC8vICAgJ1RvdGFsIG51bWJlciByZXF1ZXN0cyA6ICcgKyBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5yZXF1ZXN0TnVtYmVyICsgJ1xcbicgK1xyXG4gICAgLy8gICAnVG90YWwgdGltZSBuZWVkZWQgZm9yIGh0dHAgcmVxdWVzdHMgOiAnICsgUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IudG90YWxUaW1lRm9ySFRUUFJlcXVlc3RzICsgJyBtcyAnICsgJ1xcbicgK1xyXG4gICAgLy8gICAnVG90YWwgdGltZSBuZWVkZWQgZm9yIGNsaWVudCB0byBnZXQgYWN0aXZlIDogJyArIGV4ZWN1dGlvblRpbWUgKyAnIG1zICcgKyAnXFxuJ1xyXG4gICAgLy8gKTtcclxuICAgIC8vXHJcbiAgICAvLyAvLyBUT0RPIC0gbW92ZSBpdCB0byBtZXRob2RcclxuICAgIC8vIFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLnJlcXVlc3ROdW1iZXIgPSAwO1xyXG4gICAgLy8gUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IudG90YWxUaW1lRm9ySFRUUFJlcXVlc3RzID0gMDtcclxuICAgIC8vIFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLnRvdGFsUmVxdWVzdERhdGFMZW5ndGggPSAwO1xyXG4gICAgLy8gUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IudG90YWxSZXNwb25zZURhdGFMZW5ndGggPSAwO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBXaGVuIExvZ0NsaWVudFNlcXVlbmNlRm9yQWN0aXZpdHlNb25pdG9yID0gWSB3ZSB3aWxsIGJlIGtlZXBpbmcgdGhlIGxvZ3MgaW4gZmlsZSBhbmQgc2VuZCB0aGUgZmlsZSB3aXRoIG5leHRcclxuICAvLy8gc2VydmVyIGFjY2Vzcy4gSWYgY2xpZW50IGlzIGFibm9ybWFsbHkgdGVybWluYXRlZCB0aGVuIHRoZXJlIGNhbiBiZSAxIG9yIG1vcmUgZmlsZXMgY29udGFpbmluZyBsb2dzIHNpbmNlXHJcbiAgLy8vIGxhc3Qgc2VydmVyIGFjY2Vzcy5Ob3cgdGhlc2UgbG9ncyB3aWxsIGJlIHNlbnQgdG8gc2VydmVyLCB3aGVuIG5leHQgdGltZSBSQyBwcm9ncmFtIGlzIGV4ZWN1dGVkLC48L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiBJZiBzZW5kaW5nIHdhcyBzdWNjZXNzZnVsPC9yZXR1cm5zPlxyXG4gIC8vICAgVE9ETzogSGFuZGxlIHBlbmRpbmcgbG9ncy5cclxuICAvLyBwcml2YXRlIFNlbmRQZW5kaW5nTG9nc1RvU2VydmVyKCk6IGJvb2xlYW4ge1xyXG4gIC8vICAgbGV0IHN1Y2Nlc3M6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIC8vXHJcbiAgLy8gICBUaGUgcGVuZGluZyBsb2dzIGNhbm5vdCBiZSByZWFkIGZyb20gdGhlIGZpbGUgc3lzdGVtIHNpbmNlIFdlYkNsaWVudCBkb2Vzbid0IGhhdmUgYWNjZXNzIHRvIHRoYXQuXHJcbiAgLy8gICBNYXliZSwgdGhlIGxvZ3Mgc2hvdWxkIGJlIHdyaXR0ZW4gaW50byBMb2NhbFN0b3JhZ2UgYWQgcmVhZCBmcm9tIHRoZXJlLlxyXG4gIC8vXHJcbiAgLy8gICBsZXQgc3RyaW5nQnVpbGRlcjogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKDEwMDApO1xyXG4gIC8vICAgbGV0IGZsb3dNb25pdG9yOiBGbG93TW9uaXRvclF1ZXVlID0gRmxvd01vbml0b3JRdWV1ZS5JbnN0YW5jZTtcclxuICAvL1xyXG4gIC8vICAgLy8gR2V0IGl0ZXJhdG9yIHRvIG5hbWVzIG9mIGxvZyBmaWxlcy5cclxuICAvLyAgIGxldCBlbnVtZXJhdG9yOiBJRW51bWVyYXRvcjxzdHJpbmc+ID0gQ2xpZW50TG9nQWNjdW11bGF0b3IuRXhpc3RpbmdMb2dJdGVyYXRvcigpO1xyXG4gIC8vXHJcbiAgLy8gICAvLyB3aGlsZSB0aGVyZSBhcmUgbW9yZSBmaWxlc1xyXG4gIC8vICAgd2hpbGUgKGVudW1lcmF0b3IuTW92ZU5leHQoKSkge1xyXG4gIC8vICAgICAvLyBUYWtlIG5leHQgZmlsZSBuYW1lXHJcbiAgLy8gICAgIGxldCBsb2dOYW1lOiBzdHJpbmcgPSBlbnVtZXJhdG9yLkN1cnJlbnQ7XHJcbiAgLy8gICAgIC8vIFByZXBhcmUgdGhlIGhlYWRlciBsaW5lIChDbGllbnQgbG9nIGZpbGUgOiA8Q29udGV4dCA6IFhYWFhYWD4pIGFuZCBhZGQgaXQgdG9cclxuICAvLyAgICAgLy8gZmxvdyBtb25pdG9yIGJ1aWxkIG1vbml0b3IgbWVzc2FnZVxyXG4gIC8vICAgICBsZXQgaGVhZGVyTGluZTogc3RyaW5nID0gQ2xpZW50TG9nQWNjdW11bGF0b3IuQnVpbGRMb2dIZWFkZXJMaW5lKGxvZ05hbWUpO1xyXG4gIC8vICAgICBmbG93TW9uaXRvci5hZGRGbG93VmVyaWZ5SW5mbyhoZWFkZXJMaW5lKTtcclxuICAvLyAgICAgbGV0IGxvZ0N0eEJ1ZjogU3RyaW5nQnVpbGRlciA9IFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLkJ1aWxkTW9uaXRvck1lc3NhZ2UoKTtcclxuICAvL1xyXG4gIC8vICAgICBsZXQgZmlsZUNvbnRlbnRzOiBzdHJpbmcgPSBIYW5kbGVGaWxlcy5yZWFkVG9TdHJpbmcobG9nTmFtZSk7XHJcbiAgLy8gICAgIGxvZ0N0eEJ1Zi5BcHBlbmQoZmlsZUNvbnRlbnRzKTtcclxuICAvLyAgICAgc3RyaW5nQnVpbGRlci5BcHBlbmQobG9nQ3R4QnVmLlRvU3RyaW5nKCkpO1xyXG4gIC8vICAgfVxyXG4gIC8vXHJcbiAgLy8gICBsZXQgcmVzcEJ1Zjogc3RyaW5nID0gbnVsbDtcclxuICAvL1xyXG4gIC8vICAgdHJ5IHtcclxuICAvLyAgICAgcmVzcEJ1ZiA9IHRoaXMuRGlzcGF0Y2hSZXF1ZXN0KHRoaXMuU2VydmVyVXJsLCBzdHJpbmdCdWlsZGVyLlRvU3RyaW5nKCksIENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZXNzaW9uU3RhZ2UuTk9STUFMKTtcclxuICAvLyAgIH1cclxuICAvLyAgIGNhdGNoIChleCkge1xyXG4gIC8vICAgICAvLyBkbyBub3RoaW5nLiBpZiBzZW5kaW5nIGxvZyBmYWlscywgdGhlcmUgaXMgbm8gaGFybS5cclxuICAvLyAgIH1cclxuICAvL1xyXG4gIC8vICAgaWYgKHJlc3BCdWYgPT09IG51bGwpIHtcclxuICAvLyAgICAgc3VjY2VzcyA9IGZhbHNlO1xyXG4gIC8vICAgfVxyXG4gIC8vXHJcbiAgLy8gICByZXR1cm4gc3VjY2VzcztcclxuICAvLyB9XHJcblxyXG4gIC8vIFRPRE86IEhhbmRsZSBwZW5kaW5nIGxvZ3MuXHJcbiAgLy8gcHJpdmF0ZSBzdGF0aWMgRGVsZXRlUGVuZGluZ0xvZ3MoKTogdm9pZCB7XHJcbiAgLy8gICBsZXQgZW51bWVyYXRvcjogSUVudW1lcmF0b3IgPSBDbGllbnRMb2dBY2N1bXVsYXRvci5FeGlzdGluZ0xvZ0l0ZXJhdG9yKCk7XHJcbiAgLy8gICB3aGlsZSAoZW51bWVyYXRvci5Nb3ZlTmV4dCgpKSB7XHJcbiAgLy8gICAgIGxldCBmaWxlbmFtZTogc3RyaW5nID0gPHN0cmluZz5lbnVtZXJhdG9yLkN1cnJlbnQ7XHJcbiAgLy8gICAgIEhhbmRsZUZpbGVzLmRlbGV0ZUZpbGUoZmlsZW5hbWUpO1xyXG4gIC8vICAgfVxyXG4gIC8vIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBnZXQgdGhlIHN1ZmZpeCBvZiB0aGUgVVJMIHRvIGJlIHNlbnQgdG8gdGhlIHNlcnZlci4gVGhpcyBpbmNsdWRlcyB0aGUgQ1RYLCBTRVNTSU9OIGFuZCBEQVRBIHBhcmFtZXRlcnMuPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImhhc0NvbnRlbnRcIj5pZiB0cnVlLCB0aGUgSFRUUCBEQVRBIHBhcmFtZXRlciBjb250YWlucyBzb21ldGhpbmcuPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpc0luaXRpYWxDYWxsXCI+aWYgdHJ1ZSB0aGVuIHRoZSBnZW5lcmF0ZWQgc3VmZml4IGhhcyBubyBzcGVjaWZpYyBjb250ZXh0IGRhdGE8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIFVSTCBzdWZmaXggKGkuZS4gXCJDVFg9Li4uJlNFU1NJT049Li4uJkRBVEE9XCI8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBCdWlsZFVybFN1ZmZpeChoYXNDb250ZW50OiBib29sZWFuLCBpc0luaXRpYWxDYWxsOiBib29sZWFuKTogc3RyaW5nIHtcclxuICAgIGxldCBwcmVmaXg6IHN0cmluZyA9IENvbnN0SW50ZXJmYWNlLlJDX0lORElDQVRJT04gKyBDb25zdEludGVyZmFjZS5SQ19UT0tFTl9DVFhfSUQgKyBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuQ29udGV4dElEO1xyXG5cclxuICAgIC8vIEFwcGVuZCBzZXNzaW9uIGlkIGluIHVybCBvbmx5IHdoZW4gaXQgaXMgbm90IG51bGwgb3IgZW1wdHlcclxuICAgIC8vIE5PVEU6IHNlc3Npb24gaWQgd2lsbCBiZSBzZW5kIGJ5IHNlcnZlciBvbmx5IGZvciBHUyBhcyBtaWRkbGV3YXJlXHJcbiAgICAvLyAgICAgICBhbmQgd2hlbiBzZXBlY2lhbCBmbGFnIChTcGVjaWFsUklBR2VuZXJhdGVBbmRWYWxpZGF0ZVNlc3Npb25JRCkgaXMgb25cclxuICAgIC8vICAgICAgIHNvIHNlc3Npb24gaWQgd2lsbCBiZSBudWxsIGZvciBicm9rZXIgbWlkZGxld2FyZSBhbmQgd2hlbiBzcGVjaWFsIGZsYWcgaXMgT0ZGLlxyXG4gICAgaWYgKCFpc051bGxPclVuZGVmaW5lZCh0aGlzLlNlc3Npb25JZCkpXHJcbiAgICAgIHByZWZpeCArPSAoQ29uc3RJbnRlcmZhY2UuUkVRX0FSR19TRVBBUkFUT1IgKyBDb25zdEludGVyZmFjZS5SQ19UT0tFTl9TRVNTSU9OX0lEICsgdGhpcy5TZXNzaW9uSWQpO1xyXG5cclxuICAgIGlmIChpc0luaXRpYWxDYWxsKSB7XHJcbiAgICAgIC8vIFRPRE86IEhvdyB0byBnZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzP1xyXG4gICAgICAvLyBsZXQgZW52VmFyczogc3RyaW5nID0gQ2xpZW50TWFuYWdlci5JbnN0YW5jZS5nZXRFbnZWYXJzKCk7XHJcbiAgICAgIC8vIGlmICghTlN0cmluZy5Jc051bGxPckVtcHR5KGVudlZhcnMpKSB7XHJcbiAgICAgIC8vICAgLy8gZW52aXJvbm1lbnQgdmFyaWFibGVzOiBFTlYxLEVOVjIsLi4gLS0+ICZFTlYxPXZhbDEmRU5WMj12YWwyLi4uXHJcbiAgICAgIC8vICAgbGV0IGVudlZhcnNWZWM6IHN0cmluZ1tdID0gZW52VmFycy5zcGxpdChcIixcIik7XHJcbiAgICAgIC8vICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGVudlZhcnNWZWMubGVuZ3RoOyBpID0gaSArIDEpIHtcclxuICAgICAgLy8gICAgIHByZWZpeCArPSAoXCImXCIgKyBlbnZWYXJzVmVjW2ldICsgXCI9XCIgKyBPU0Vudmlyb25tZW50LmdldChlbnZWYXJzVmVjW2ldKSk7XHJcbiAgICAgIC8vICAgfVxyXG4gICAgICAvLyB9XHJcbiAgICAgIGlmIChSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5Jc1Nlc3Npb25SZUluaXRpYWxpemluZylcclxuICAgICAgICBwcmVmaXggKz0gKENvbnN0SW50ZXJmYWNlLlJFUV9BUkdfU0VQQVJBVE9SICsgQ29uc3RJbnRlcmZhY2UuV0VCQ0xJRU5UX1JFSU5JVElBTElaRV9SRVFVRVNUKTtcclxuXHJcbiAgICAgIGxldCBnbG9iYWxQYXJhbXM6IHN0cmluZyA9IFNlcnZlckNvbmZpZy5JbnN0YW5jZS5nZXRHbG9iYWxQYXJhbXMoKTtcclxuICAgICAgaWYgKGdsb2JhbFBhcmFtcyAhPT0gbnVsbCkge1xyXG4gICAgICAgIGdsb2JhbFBhcmFtcyA9IE5TdHJpbmcuUmVwbGFjZShnbG9iYWxQYXJhbXMsIFwiK1wiLCBcIiUyQlwiKTtcclxuICAgICAgICBwcmVmaXggKz0gKFwiJlwiICsgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0dMT0JBTFBBUkFNUyArIFwiPVwiICsgZ2xvYmFsUGFyYW1zKTtcclxuICAgICAgfVxyXG4gICAgfSAvLyBpc0luaXRpYWxDYWxsXHJcblxyXG4gICAgaWYgKGhhc0NvbnRlbnQpIHtcclxuICAgICAgcHJlZml4ICs9IChcIiZcIiArIENvbnN0SW50ZXJmYWNlLlJDX1RPS0VOX1NFU1NJT05fQ09VTlQgKyB0aGlzLkdldFNlc3Npb25Db3VudGVyKCkgK1xyXG4gICAgICAgIENvbnN0SW50ZXJmYWNlLlJFUV9BUkdfU0VQQVJBVE9SICsgQ29uc3RJbnRlcmZhY2UuUkNfVE9LRU5fREFUQSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHByZWZpeDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5zZW5kIE1vbml0b3IgbWVzc2FnaW5nIHRvIHRoZSBzZXJ2ZXI8L3N1bW1hcnk+XHJcbiAgcHVibGljIGFzeW5jIFNlbmRNb25pdG9yT25seSgpOiBQcm9taXNlPHZvaWQ+XHJcbiAge1xyXG4gICAgbGV0IGZsb3dNb25pdG9yOiBGbG93TW9uaXRvclF1ZXVlID0gRmxvd01vbml0b3JRdWV1ZS5JbnN0YW5jZTtcclxuXHJcbiAgICBpZiAoQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlID09IG51bGwgfHwgQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLmdldE1HRGF0YSgwKSA9PSBudWxsIHx8IEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5nZXRNR0RhdGEoMCkuSXNBYm9ydGluZylcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIGlmICghZmxvd01vbml0b3IuaXNFbXB0eSgpKVxyXG4gICAge1xyXG4gICAgICAvLyBidWlsZCBvdXQgbWVzc2FnZVxyXG4gICAgICBsZXQgYnVmZmVyOiBTdHJpbmdCdWlsZGVyID0gdGhpcy5CdWlsZE1vbml0b3JNZXNzYWdlKCk7XHJcblxyXG4gICAgICAvLyBJZiBjbGllbnQgc2VxdWVuY2UgaXMgdG8gYmUgYWNjdW11bGF0ZWQgdW50aWwgbmV4dCBzZXJ2ZXIgYWNjZXNzLlxyXG4gICAgICBsZXQgc2hvdWxkQWNjdW11bGF0ZUNsaWVudExvZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAvLyBzaG91bGRBY2N1bXVsYXRlQ2xpZW50TG9nID0gQ2xpZW50TWFuYWdlci5JbnN0YW5jZS5nZXRMb2dDbGllbnRTZXF1ZW5jZUZvckFjdGl2aXR5TW9uaXRvcigpO1xyXG4gICAgICAvLyBpZiAoc2hvdWxkQWNjdW11bGF0ZUNsaWVudExvZykge1xyXG4gICAgICAvLyAgIGlmICh0aGlzLl9sb2dBY2N1bXVsYXRvciA9PSBudWxsKVxyXG4gICAgICAvLyAgICAgdGhpcy5fbG9nQWNjdW11bGF0b3IgPSBuZXcgQ2xpZW50TG9nQWNjdW11bGF0b3IoQ2xpZW50TWFuYWdlclJ1bnRpbWUuSW5zdGFuY2UuUnVudGltZUN0eC5Db250ZXh0SUQpO1xyXG4gICAgICAvL1xyXG4gICAgICAvLyAgIC8vIElmIHdlJ3JlIHVuYWJsZSB0byBvcGVuIHRoZSBmaWxlLCBkZWFjdGl2YXRlIGxvZ2dpbmcgYWNjdW11bGF0aW9uLFxyXG4gICAgICAvLyAgIC8vICAgIGFuZCBsZXQgdGhlIG1lc3NhZ2UgYmUgc2VudCB0byB0aGUgc2VydmVyIGFzIGRvbmUgd2l0aG91dCBhY2N1bXVsYXRlZCBsb2dnaW5nXHJcbiAgICAgIC8vICAgaWYgKHRoaXMuX2xvZ0FjY3VtdWxhdG9yLklzRmFpbGVkKCkpXHJcbiAgICAgIC8vICAgICBzaG91bGRBY2N1bXVsYXRlQ2xpZW50TG9nID0gZmFsc2U7XHJcbiAgICAgIC8vIH1cclxuXHJcbiAgICAgIGlmIChzaG91bGRBY2N1bXVsYXRlQ2xpZW50TG9nKSB7XHJcbiAgICAgICAgLy8gV3JpdGUgbWVzc2FnZSB0byBmaWxlLlxyXG4gICAgICAgIC8vIHRoaXMuX2xvZ0FjY3VtdWxhdG9yLldyaXRlKGJ1ZmZlci5Ub1N0cmluZygpKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgbGV0IHJlcXVlc3RTdGF0dXM6IFJlZlBhcmFtPFJlcXVlc3RTdGF0dXM+ID0gbmV3IFJlZlBhcmFtKFJlcXVlc3RTdGF0dXMuSGFuZGxlZCk7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLkRpc3BhdGNoUmVxdWVzdCh0aGlzLlNlcnZlclVybCwgYnVmZmVyLlRvU3RyaW5nKCksIENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZXNzaW9uU3RhZ2UuTk9STUFMLCByZXF1ZXN0U3RhdHVzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgLy8gZG8gbm90aGluZy4gaWYgc2VuZGluZyBsb2cgZmFpbHMsIHRoZXJlIGlzIG5vIGhhcm0uXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+YnVpbGQgRmxvdyBNb25pdG9yIG1lc3NhZ2U8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBCdWlsZE1vbml0b3JNZXNzYWdlKCk6IFN0cmluZ0J1aWxkZXIge1xyXG4gICAgbGV0IGJ1ZmZlcjogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKDEwMDApO1xyXG4gICAgbGV0IGZsb3dNb25pdG9yOiBGbG93TW9uaXRvclF1ZXVlID0gRmxvd01vbml0b3JRdWV1ZS5JbnN0YW5jZTtcclxuXHJcbiAgICBpZiAoIVJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLlNob3VsZFNjcmFtYmxlQW5kVW5zY3JhbWJsZU1lc3NhZ2VzKSB7XHJcbiAgICAgIGJ1ZmZlci5BcHBlbmQoWE1MQ29uc3RhbnRzLk1HX1RBR19PUEVOKTtcclxuICAgICAgZmxvd01vbml0b3IuYnVpbGRYTUwoYnVmZmVyKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBmbG93TW9uaXRvci5idWlsZFhNTChidWZmZXIpO1xyXG4gICAgICBsZXQgc2NyYW1ibGVkT3V0OiBzdHJpbmcgPSBTY3JhbWJsZXIuU2NyYW1ibGUoYnVmZmVyLlRvU3RyaW5nKCkpO1xyXG4gICAgICBidWZmZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigxMDAwKTtcclxuICAgICAgYnVmZmVyLkFwcGVuZChYTUxDb25zdGFudHMuTUdfVEFHX09QRU4gKyBzY3JhbWJsZWRPdXQpO1xyXG4gICAgfVxyXG4gICAgYnVmZmVyLkFwcGVuZChcIjwvXCIgKyBYTUxDb25zdGFudHMuTUdfVEFHX1hNTCArIFhNTENvbnN0YW50cy5UQUdfQ0xPU0UpO1xyXG5cclxuICAgIHJldHVybiBidWZmZXI7XHJcbiAgfVxyXG5cclxuICBSZWdpc3RlckRlbGVnYXRlcygpOiB2b2lkIHtcclxuICAgIEh0dHBDbGllbnRFdmVudHMuR2V0U2Vzc2lvbkNvdW50ZXJfRXZlbnQgPSB0aGlzLkdldFNlc3Npb25Db3VudGVyLmJpbmQodGhpcyk7XHJcbiAgICBIdHRwQ2xpZW50RXZlbnRzLkNoZWNrQW5kU2V0U2Vzc2lvbkNvdW50ZXJfRXZlbnQgPSB0aGlzLkNoZWNrQW5kU2V0U2Vzc2lvbkNvdW50ZXIuYmluZCh0aGlzKTtcclxuICAgIEh0dHBDbGllbnRFdmVudHMuQ29tcHV0ZUFuZExvZ1JlcXVlc3RJbmZvX0V2ZW50ID0gdGhpcy5Db21wdXRlQW5kTG9nUmVxdWVzdEluZm8uYmluZCh0aGlzKTtcclxuICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLlNwaW5uZXJTdG9wcGVkLnN1YnNjcmliZShjbGllbnRCdXN5VGltZSA9PiB0aGlzLkNsaWVudEFjdGl2YXRlZChjbGllbnRCdXN5VGltZSkpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBMb2cgdGhlIGN1cnJlbnQgcmVxdWVzdCBpbmZvcm1hdGlvbiBpbiBjb25zb2xlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBDb21wdXRlQW5kTG9nUmVxdWVzdEluZm8oY29udGVudExlbmd0aDogbnVtYmVyLCByb3VuZFRyaXA6IG51bWJlciwgaXNMb2dnaW5nUmVzcG9uc2U6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmKCFpc051bGxPclVuZGVmaW5lZCh0aGlzLl9yZXF1ZXN0SW5mby5zZXJ2ZXJDYWxsQXQpKSB7XHJcblxyXG4gICAgICB0aGlzLl9yZXF1ZXN0SW5mby5leHRyYUluZm8uY29udGVudExlbmd0aCA9IGNvbnRlbnRMZW5ndGg7XHJcbiAgICAgIHRoaXMuX3JlcXVlc3RJbmZvLmV4dHJhSW5mby50aW1lU3RhbXAgPSBuZXcgRGF0ZSgpLnRvU3RyaW5nKCk7XHJcbiAgICAgIGxldCBleHRyYU1lc3NhZ2VTdHI6IHN0cmluZyA9IGlzTG9nZ2luZ1Jlc3BvbnNlPyAnUmVzcG9uc2Ug4qS1JyA6ICdSZXF1ZXN0IOKktSc7XHJcblxyXG4gICAgICBpZiAoaXNMb2dnaW5nUmVzcG9uc2UpIHtcclxuICAgICAgICB0aGlzLl9yZXF1ZXN0SW5mby5yb3VuZHRyaXBUaW1lID0gcm91bmRUcmlwO1xyXG4gICAgICAgIFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLnRvdGFsVGltZUZvckhUVFBSZXF1ZXN0cyArPSByb3VuZFRyaXA7IC8vIGFkZCB0aGUgcmVxdWVzdCB0aW1lIHRvIHRvdGFsIHRpbWVcclxuICAgICAgfSBlbHNlXHJcbiAgICAgICAgUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IudG90YWxSZXF1ZXN0RGF0YUxlbmd0aCArPSBjb250ZW50TGVuZ3RoOyAvLyBhZGQgdGhlIHJlcXVlc3QgY29udGVudCB0byB0b3RhbCB0aW1lXHJcblxyXG5cclxuICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlUmVxdWVzdEluZm9Ub0xvZyh0aGlzLl9yZXF1ZXN0SW5mbywgZXh0cmFNZXNzYWdlU3RyKTtcclxuXHJcbiAgICAgIC8vIENsZWFyIHRoZSBjbGllbnQgc2Vzc2lvbiBhZnRlciBsb2dnaW5nIHRoZSByZXNwb25zZVxyXG4gICAgICBpZiAoaXNMb2dnaW5nUmVzcG9uc2UpXHJcbiAgICAgICAgdGhpcy5fcmVxdWVzdEluZm8uY2xlYXIoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gV2hlbiB0cnVlLCByZXF1ZXN0cyBhcmUgc2NyYW1ibGVkIGFuZCByZXNwb25zZXMgYXJlIHVuc2NyYW1ibGVkLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc3RhdGljIHNldCBTaG91bGRTY3JhbWJsZUFuZFVuc2NyYW1ibGVNZXNzYWdlcyh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuX3Nob3VsZFNjcmFtYmxlQW5kVW5zY3JhbWJsZU1lc3NhZ2VzID0gdmFsdWU7XHJcbiAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVTZXJ2ZXJNZXNzYWdlc1RvTG9nKE5TdHJpbmcuRm9ybWF0KFwiU2hvdWxkU2NyYW1ibGVBbmRVbnNjcmFtYmxlTWVzc2FnZXMuU2V0OiB7MH1cIiwgdGhpcy5fc2hvdWxkU2NyYW1ibGVBbmRVbnNjcmFtYmxlTWVzc2FnZXMpKTtcclxuICB9XHJcbiAgc3RhdGljIGdldCBTaG91bGRTY3JhbWJsZUFuZFVuc2NyYW1ibGVNZXNzYWdlcygpOiBib29sZWFuIHtcclxuICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZVNlcnZlck1lc3NhZ2VzVG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJTaG91bGRTY3JhbWJsZUFuZFVuc2NyYW1ibGVNZXNzYWdlcy5HZXQ6IHswfVwiLCB0aGlzLl9zaG91bGRTY3JhbWJsZUFuZFVuc2NyYW1ibGVNZXNzYWdlcykpO1xyXG4gICAgcmV0dXJuIFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLl9zaG91bGRTY3JhbWJsZUFuZFVuc2NyYW1ibGVNZXNzYWdlcztcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+cGFyc2UgdGhlIGxvZyBsZXZlbCBmcm9tIGEgc3RyaW5nIHZhbHVlPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInN0ckxvZ0xldmVsXCI+c3RyaW5nIHZhbHVlIG9mIHRoZSBsb2cgbGV2ZWw8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz5sb2cgbGV2ZWw8L3JldHVybnM+XHJcbiAgcGFyc2VMb2dMZXZlbChzdHJMb2dMZXZlbDogc3RyaW5nKTogTG9nZ2VyX0xvZ0xldmVscyB7XHJcbiAgICBsZXQgbG9nTGV2ZWw6IExvZ2dlcl9Mb2dMZXZlbHMgPSBMb2dnZXJfTG9nTGV2ZWxzLk5vbmU7XHJcblxyXG4gICAgaWYgKCFOU3RyaW5nLklzTnVsbE9yRW1wdHkoc3RyTG9nTGV2ZWwpKSB7XHJcbiAgICAgIGlmIChzdHJMb2dMZXZlbC50b1VwcGVyQ2FzZSgpLnN0YXJ0c1dpdGgoIFwiU0VSVkVSXCIpKVxyXG4gICAgICAgIGxvZ0xldmVsID0gc3RyTG9nTGV2ZWwuZW5kc1dpdGgoXCIjXCIpID8gTG9nZ2VyX0xvZ0xldmVscy5TZXJ2ZXJNZXNzYWdlcyA6IExvZ2dlcl9Mb2dMZXZlbHMuU2VydmVyOyAvLyBvbmx5IHJlcXVlc3RzIHRvIHRoZSBzZXJ2ZXJcclxuICAgICAgZWxzZSBpZiAoc3RyTG9nTGV2ZWwudG9VcHBlckNhc2UoKS5zdGFydHNXaXRoKFwiU1wiKSB8fCBzdHJMb2dMZXZlbC50b1VwcGVyQ2FzZSgpLnN0YXJ0c1dpdGgoXCJRXCIpKVxyXG4gICAgICAgIGxvZ0xldmVsID0gTG9nZ2VyX0xvZ0xldmVscy5TdXBwb3J0O1xyXG4gICAgICBlbHNlIGlmIChzdHJMb2dMZXZlbC50b1VwcGVyQ2FzZSgpLnN0YXJ0c1dpdGgoXCJHXCIpKVxyXG4gICAgICAgIGxvZ0xldmVsID0gTG9nZ2VyX0xvZ0xldmVscy5HdWk7XHJcbiAgICAgIGVsc2UgaWYgKHN0ckxvZ0xldmVsLnRvVXBwZXJDYXNlKCkuc3RhcnRzV2l0aChcIkRcIikpXHJcbiAgICAgICAgbG9nTGV2ZWwgPSBMb2dnZXJfTG9nTGV2ZWxzLkRldmVsb3BtZW50O1xyXG4gICAgICBlbHNlIGlmIChzdHJMb2dMZXZlbC50b1VwcGVyQ2FzZSgpLnN0YXJ0c1dpdGgoXCJCXCIpKVxyXG4gICAgICAgIGxvZ0xldmVsID0gTG9nZ2VyX0xvZ0xldmVscy5CYXNpYztcclxuICAgICAgZWxzZSBpZiAoc3RyTG9nTGV2ZWwudG9VcHBlckNhc2UoKS5zdGFydHNXaXRoKFwiUlwiKSlcclxuICAgICAgICBsb2dMZXZlbCA9IExvZ2dlcl9Mb2dMZXZlbHMuUmVxdWVzdEluZm87XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGxvZ0xldmVsO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gYnVpbGQgdGhlIFhNTCBzdHJpbmcgb2YgdGhlIGRhdGEgdGhhdCBzaG91bGQgYmUgc2VudCB0byB0aGUgc2VydmVyPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInNlcmlhbGl6ZVRhc2tzXCI+aWYgdHJ1ZSwgdGFza3MgaW4gdGhlIGN1cnJlbnQgZXhlY3V0aW9uIHdpbGwgYWxzbyBiZSBzZXJpYWxpemVkLjwvcGFyYW0+XHJcbiAgYXN5bmMgUHJlcGFyZVJlcXVlc3Qoc2VyaWFsaXplVGFza3M6IGJvb2xlYW4pOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgbGV0IHhtbEJ1ZjogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7XHJcbiAgICB4bWxCdWYuQXBwZW5kKFhNTENvbnN0YW50cy5NR19UQUdfT1BFTik7XHJcblxyXG4gICAgLy8gdGhlIGNsaWVudCBubyBsb25nZXIgc2VuZHMgKGFuZCBlbXB0aWVzKSB0aGUgZXZlbnQgcXVldWUgdG8gdGhlIHNlcnZlclxyXG4gICAgLy8gc2luY2UgdGhlIHNlcnZlciBoYXMgbm90aGluZyB1c2VmdWwgdG8gZG8gd2l0aCB0aGUgY2xpZW50IHBlbmRpbmcgZXZlbnRzXHJcbiAgICBpZiAoQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLmdldEN1cnJNR0RhdGEoKSAhPT0gbnVsbCkge1xyXG4gICAgICBsZXQgeG1sVW5zY3JhbWJsZWQ6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpO1xyXG4gICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuYnVpbGRYTUwoeG1sVW5zY3JhbWJsZWQsIHNlcmlhbGl6ZVRhc2tzKTtcclxuXHJcbiAgICAgIGlmIChSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5TaG91bGRTY3JhbWJsZUFuZFVuc2NyYW1ibGVNZXNzYWdlcylcclxuICAgICAgICB4bWxCdWYuQXBwZW5kKFNjcmFtYmxlci5TY3JhbWJsZSh4bWxVbnNjcmFtYmxlZC5Ub1N0cmluZygpKSk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICB4bWxCdWYuQXBwZW5kKHhtbFVuc2NyYW1ibGVkLlRvU3RyaW5nKCkpO1xyXG4gICAgfVxyXG4gICAgeG1sQnVmLkFwcGVuZChcIjwvXCIgKyBYTUxDb25zdGFudHMuTUdfVEFHX1hNTCArIFhNTENvbnN0YW50cy5UQUdfQ0xPU0UpO1xyXG5cclxuICAgIHJldHVybiB4bWxCdWYuVG9TdHJpbmcoKTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+cGFyc2UgYSByZXNwb25zZSAoZnJvbSB0aGUgU2VydmVyKSBhbmQgZXhlY3V0ZSBjb21tYW5kcyBpZiByZXR1cm5lZCB3aXRoaW4gdGhlIHJlc3BvbnNlLjwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyZXNwb25zZVwiPihYTUwgZm9ybWF0dGVkKSByZXNwb25zZS48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN1cnJNZ2RJRFwiPm51bWJlciBvZiB3aW5kb3cgaW4gZ2xvYmFsIGFycmF5PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJvcGVuaW5nVGFza0RldGFpbHNcIj5hZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9mIG9wZW5pbmcgdGFzazwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicmVzXCI+cmVzdWx0IHRvIGJlIHJlYWQgZnJvbSBjb21tYW5kIHJldHVybmVkIHdpdGluIHRoZSByZXNwb25zZS48L3BhcmFtPlxyXG4gIGFzeW5jIFByb2Nlc3NSZXNwb25zZShyZXNwb25zZTogc3RyaW5nLCBjdXJyTWdkSUQ6IG51bWJlciwgb3BlbmluZ1Rhc2tEZXRhaWxzOiBPcGVuaW5nVGFza0RldGFpbHMsIHJlczogSVJlc3VsdFZhbHVlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhcIjwtLSBQcm9jZXNzUmVzcG9uc2Ugc3RhcnRlZCAtLT5cIik7XHJcbiAgICBpZihvcGVuaW5nVGFza0RldGFpbHMgPT09IG51bGwpXHJcbiAgICAgIG9wZW5pbmdUYXNrRGV0YWlscyA9IG5ldyBPcGVuaW5nVGFza0RldGFpbHMoKTtcclxuXHJcbiAgICBsZXQgc3lzdGVtTWlsbGlzZWNvbmRzOiBudW1iZXIgPSBNaXNjLmdldFN5c3RlbU1pbGxpc2Vjb25kcygpO1xyXG4gICAgaWYgKHJlc3BvbnNlID09PSBudWxsIHx8IHJlc3BvbnNlLnRyaW0oKS5sZW5ndGggPT09IDApXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuY3Vyck1nZElEID0gY3Vyck1nZElEO1xyXG5cclxuICAgIFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5QYXJzZXIucHVzaCgpOyAvLyBhbGxvdyByZWN1cnNpdmUgcGFyc2luZ1xyXG4gICAgUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLlBhcnNlci5zZXRYTUxkYXRhKHJlc3BvbnNlKTtcclxuICAgIFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5QYXJzZXIuc2V0Q3VyckluZGV4KDApO1xyXG5cclxuICAgIGxldCBjdXJyTUdEYXRhOiBNR0RhdGEgPSBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuZ2V0Q3Vyck1HRGF0YSgpO1xyXG4gICAgYXdhaXQgY3Vyck1HRGF0YS5maWxsRGF0YShvcGVuaW5nVGFza0RldGFpbHMsIFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5QYXJzZXIpO1xyXG5cclxuICAgIC8vIGZyZWUgbWVtb3J5XHJcbiAgICBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuUGFyc2VyLnNldFhNTGRhdGEobnVsbCk7XHJcbiAgICBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuUGFyc2VyLnBvcCgpO1xyXG5cclxuICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKFwiPC0tIFByb2Nlc3NSZXNwb25zZSBmaW5pc2hlZCAtLT4gKFwiICsgKE1pc2MuZ2V0U3lzdGVtTWlsbGlzZWNvbmRzKCkgLSBzeXN0ZW1NaWxsaXNlY29uZHMpICsgXCIpXCIpO1xyXG4gICAgLy8gZXhlY3V0ZSB0aGUgY29tbWFuZHMgdGhhdCB3ZXJlIHJldHVybmVkIGluIHRoZSByZXNwb25zZVxyXG4gICAgYXdhaXQoPENvbW1hbmRzVGFibGU+Y3Vyck1HRGF0YS5DbWRzVG9DbGllbnQpLkV4ZWN1dGUocmVzKTtcclxuICAgIGF3YWl0IHRoaXMuUHJvY2Vzc1JlY292ZXJ5KCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHByb2Nlc3NSZWNvdmVyeVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgUHJvY2Vzc1JlY292ZXJ5KCk6IFByb21pc2U8dm9pZD4ge1xyXG5cclxuICAgIC8vIFFDUiAjNzcxMDEyIC0gcHJvY2VzcyBkYXRhIGVycm9yIHJlY292ZXJ5IG9ubHkgYWZ0ZXIgdGhlIHBhcnNpbmcgcHJvY2VzcyBpcyBvdmVyLlxyXG4gICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIucHVzaE5ld0V4ZWNTdGFja3MoKTtcclxuICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5wcm9jZXNzUmVjb3ZlcnkoKTtcclxuICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnBvcE5ld0V4ZWNTdGFja3MoKTtcclxuICB9XHJcbn1cclxuXHJcbi8vLyA8c3VtbWFyeT5oZWxwZXIgY2xhc3M6IGRldGFpbHMgZnJvbSB0aGUgcnVudGltZS1lbmdpbmUgLSBlbnZpcm9ubWVudCB2YWx1ZXMuXHJcbi8vLyBIYW5kc2hha2UgcmVzcG9uc2U6IDxSaWNoY2xpZW50cmVzcG9uc2U+IDxDb250ZXh0SUQ+Li4uPC9Db250ZXh0SUQ+IDxFbnZpcm9ubWVudCBJbnB1dFBhc3N3b3JkPVwiWXxOXCJcclxuLy8vIFN5c3RlbUxvZ2luPVwiRnxOfER8TFwiIC8+IDwvUmljaGNsaWVudHJlc3BvbnNlPlxyXG4vLy8gPC9zdW1tYXJ5PlxyXG5jbGFzcyBIYW5kc2hha2VSZXNwb25zZSB7XHJcbiAgc3RhdGljIHJlYWRvbmx5IFNZU1RFTV9MT0dJTl9BRDogc3RyaW5nID0gJ0QnO1xyXG5cclxuICBwcml2YXRlIF9zY3JhbWJsZU1lc3NhZ2VzOiBib29sZWFuID0gdHJ1ZTsgLy8gdHJ1ZSBpZiBtZXNzYWdlcyBzaG91bGQgYmUgc2NyYW1ibGVkL3Vuc2NyYW1ibGVkIGJ5IHRoZSBjbGllbnQgYW5kIHNlcnZlclxyXG4gIGdldCBTY3JhbWJsZU1lc3NhZ2VzKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NjcmFtYmxlTWVzc2FnZXM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jb250ZXh0SWQ6IHN0cmluZyA9IG51bGw7XHJcbiAgZ2V0IENvbnRleHRJZCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NvbnRleHRJZDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3ByaXZhdGVTZXNzaW9uSWQ6IHN0cmluZyA9IG51bGw7XHJcbiAgZ2V0IEdldFNlc3Npb25JZCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX3ByaXZhdGVTZXNzaW9uSWQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pbnB1dFBhc3N3b3JkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgZ2V0IElucHV0UGFzc3dvcmQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5faW5wdXRQYXNzd29yZDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2h0dHBUaW1lb3V0OiBudW1iZXIgPSAwO1xyXG4gIGdldCBIdHRwVGltZW91dCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2h0dHBUaW1lb3V0O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfc3lzdGVtTG9naW46IHN0cmluZyA9IG51bGw7XHJcbiAgZ2V0IFN5c3RlbUxvZ2luKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fc3lzdGVtTG9naW47XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9tYXhJbnRlcm5hbExvZ0xldmVsOiBzdHJpbmcgPSBudWxsO1xyXG4gIGdldCBNYXhJbnRlcm5hbExvZ0xldmVsKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fbWF4SW50ZXJuYWxMb2dMZXZlbDtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKHJlc3BvbnNlWE1MOiBzdHJpbmcpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIEpTT05fVXRpbHMuSlNPTkZyb21YTUwocmVzcG9uc2VYTUwsIHRoaXMuRmlsbEZyb21KU09OLmJpbmQodGhpcykpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGV4KSB7XHJcbiAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nKGV4LCByZXNwb25zZVhNTCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIEZpbGxGcm9tSlNPTiAoZXJyb3IsIHJlc3VsdCk6IHZvaWQge1xyXG5cclxuICAgIC8vIElmIHRoZXJlIHdhcyBhbiBlcnJvciBpbiBwYXJzaW5nIHRoZSBYTUwsXHJcbiAgICBpZiAoZXJyb3IgIT0gbnVsbCkge1xyXG4gICAgICB0aHJvdyBlcnJvcjtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgcmVzcG9uc2UgPSByZXN1bHRbJ1JpY2hjbGllbnRyZXNwb25zZSddO1xyXG5cclxuICAgIGZvciAobGV0IGVsZW1lbnROYW1lIGluIHJlc3BvbnNlKSB7XHJcbiAgICAgIGlmIChyZXNwb25zZS5oYXNPd25Qcm9wZXJ0eShlbGVtZW50TmFtZSkpIHtcclxuXHJcbiAgICAgICAgc3dpdGNoIChlbGVtZW50TmFtZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICBjYXNlIFwiQ29udGV4dElEXCI6XHJcbiAgICAgICAgICAgIHRoaXMuX2NvbnRleHRJZCA9IHJlc3BvbnNlW2VsZW1lbnROYW1lXVswXTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIFwiU2Vzc2lvbklEXCI6XHJcbiAgICAgICAgICAgIHRoaXMuX3ByaXZhdGVTZXNzaW9uSWQgPSByZXNwb25zZVtlbGVtZW50TmFtZV1bMF07XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBcIkVudmlyb25tZW50XCI6XHJcbiAgICAgICAgICAgIGxldCBlbnZBdHRyaWJ1dGVzID0gcmVzcG9uc2VbXCJFbnZpcm9ubWVudFwiXVswXVsnJCddO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFpc051bGxPclVuZGVmaW5lZChlbnZBdHRyaWJ1dGVzW1wiU2NyYW1ibGVNZXNzYWdlc1wiXSkpIHtcclxuICAgICAgICAgICAgICBEZWJ1Zy5Bc3NlcnQoZW52QXR0cmlidXRlc1tcIlNjcmFtYmxlTWVzc2FnZXNcIl0gPT09IFwiTlwiKTtcclxuICAgICAgICAgICAgICB0aGlzLl9zY3JhbWJsZU1lc3NhZ2VzID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCFpc051bGxPclVuZGVmaW5lZChlbnZBdHRyaWJ1dGVzW1wiTWF4SW50ZXJuYWxMb2dMZXZlbFwiXSkpXHJcbiAgICAgICAgICAgICAgdGhpcy5fbWF4SW50ZXJuYWxMb2dMZXZlbCA9IGVudkF0dHJpYnV0ZXNbXCJNYXhJbnRlcm5hbExvZ0xldmVsXCJdO1xyXG4gICAgICAgICAgICBpZiAoIWlzTnVsbE9yVW5kZWZpbmVkKGVudkF0dHJpYnV0ZXNbXCJJbnB1dFBhc3N3b3JkXCJdKSAmJiBlbnZBdHRyaWJ1dGVzW1wiSW5wdXRQYXNzd29yZFwiXS50b0xvY2FsZUxvd2VyQ2FzZSgpID09PSBcInlcIilcclxuICAgICAgICAgICAgICB0aGlzLl9pbnB1dFBhc3N3b3JkID0gdHJ1ZTtcclxuICAgICAgICAgICAgaWYgKCFpc051bGxPclVuZGVmaW5lZChlbnZBdHRyaWJ1dGVzW1wiU3lzdGVtTG9naW5cIl0pKVxyXG4gICAgICAgICAgICAgIHRoaXMuX3N5c3RlbUxvZ2luID0gZW52QXR0cmlidXRlc1tcIlN5c3RlbUxvZ2luXCJdO1xyXG4gICAgICAgICAgICBpZiAoIWlzTnVsbE9yVW5kZWZpbmVkKGVudkF0dHJpYnV0ZXNbQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0hUVFBfQ09NTVVOSUNBVElPTl9USU1FT1VUXSkpXHJcbiAgICAgICAgICAgICAgdGhpcy5faHR0cFRpbWVvdXQgPSArZW52QXR0cmlidXRlc1tDb25zdEludGVyZmFjZS5NR19UQUdfSFRUUF9DT01NVU5JQ0FUSU9OX1RJTUVPVVRdO1xyXG4gICAgICAgICAgICBpZiAoIWlzTnVsbE9yVW5kZWZpbmVkKGVudkF0dHJpYnV0ZXNbXCJGb3J3YXJkU2xhc2hcIl0pKVxyXG4gICAgICAgICAgICAgIEFjY2Vzc0hlbHBlci5lbnZpcm9ubWVudC5Gb3J3YXJkU2xhc2hVc2FnZSA9IGVudkF0dHJpYnV0ZXNbXCJGb3J3YXJkU2xhc2hcIl07XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuLy8vIDxzdW1tYXJ5PlRoaXMgY2xhc3MgaW1wbGVtZW50cyBNZ1NBWEhhbmRsZXJJbnRlcmZhY2UsIHdoaWNoIG1lYW5zIHRoYXQgaXQgZGVmaW5lcyBhbGwgdGhlIFwiY2FsbGJhY2tcIlxyXG4vLy8gbWV0aG9kcyB0aGF0IHRoZSBTQVggcGFyc2VyIHdpbGwgaW52b2tlIHRvIG5vdGlmeSB0aGUgYXBwbGljYXRpb24uIEluIHRoaXMgZXhhbXBsZSB3ZSBvdmVycmlkZSB0aGVcclxuLy8vIG1ldGhvZHMgdGhhdCB3ZSByZXF1aXJlLjwvc3VtbWFyeT5cclxuY2xhc3MgRXJyb3JNZXNzYWdlWG1sIHtcclxuICBwcml2YXRlIF9sYXN0UmVxdWVzdFRpbWU6IG51bWJlciA9IDA7XHJcbiAgY29udGV4dEluYWN0aXZpdHlUaW1lb3V0OiBudW1iZXI7XHJcblxyXG4gIHByaXZhdGUgX2Vycm9yTWVzc2FnZTogc3RyaW5nID0gbnVsbDtcclxuICBwcml2YXRlIF9lcnJvckNvZGU6IG51bWJlciA9IDA7XHJcbiAgcHJpdmF0ZSBfbWlkZGxld2FyZUFkZHJlc3M6IHN0cmluZyA9IG51bGw7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBfcGFyc2luZ0ZhaWxlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBjb25zdHJ1Y3Rvcih4bWxDb250ZW50OiBzdHJpbmcsIGxhc3RSZXF1ZXN0VGltZTogbnVtYmVyLCBjb250ZXh0SW5hY3Rpdml0eVRpbWVvdXQ6IG51bWJlcikge1xyXG4gICAgdGhpcy5fbGFzdFJlcXVlc3RUaW1lID0gbGFzdFJlcXVlc3RUaW1lO1xyXG4gICAgdGhpcy5jb250ZXh0SW5hY3Rpdml0eVRpbWVvdXQgPSBjb250ZXh0SW5hY3Rpdml0eVRpbWVvdXQ7XHJcbiAgICB0cnkge1xyXG4gICAgICBKU09OX1V0aWxzLkpTT05Gcm9tWE1MKHhtbENvbnRlbnQsIHRoaXMuRmlsbEZyb21KU09OLmJpbmQodGhpcykpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGV4KSB7XHJcbiAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nKGV4KTtcclxuICAgICAgTWlzYy5Xcml0ZVN0YWNrVHJhY2UoZXgpO1xyXG4gICAgICB0aGlzLl9wYXJzaW5nRmFpbGVkID0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgRmlsbEZyb21KU09OIChlcnJvciwgcmVzdWx0KTogdm9pZCB7XHJcblxyXG4gICAgLy8gSWYgdGhlcmUgd2FzIGFuIGVycm9yIGluIHBhcnNpbmcgdGhlIFhNTCxcclxuICAgIGlmIChlcnJvciAhPSBudWxsKSB7XHJcbiAgICAgIHRocm93IGVycm9yO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCB4bWxlcnIgPSByZXN1bHRbJ3htbGVyciddO1xyXG5cclxuICAgIGZvciAobGV0IGVsZW1lbnROYW1lIGluIHhtbGVycikge1xyXG4gICAgICBpZiAoeG1sZXJyLmhhc093blByb3BlcnR5KGVsZW1lbnROYW1lKSkge1xyXG4gICAgICAgIHN3aXRjaCAoZWxlbWVudE5hbWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgY2FzZSBcImVycm1zZ1wiOlxyXG4gICAgICAgICAgICB0aGlzLl9lcnJvck1lc3NhZ2UgPSB4bWxlcnJbZWxlbWVudE5hbWVdWzBdO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgXCJlcnJjb2RlXCI6XHJcbiAgICAgICAgICAgIHRoaXMuX2Vycm9yQ29kZSA9ICsoeG1sZXJyW2VsZW1lbnROYW1lXSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBcInNlcnZlclwiOlxyXG4gICAgICAgICAgICB0aGlzLl9taWRkbGV3YXJlQWRkcmVzcyA9IHhtbGVycltlbGVtZW50TmFtZV1bMF07XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBcImFwcG5hbWVcIjogLy8gaWdub3JlZCAtIHRoZSBjbGllbnQgbGlzdHMgdGhpcyB2YWx1ZSBmcm9tIHRoZSBleGVjdXRpb24gcHJvcGVydGllc1xyXG4gICAgICAgICAgY2FzZSBcInByZ25hbWVcIjogLy8gaWdub3JlZCAtIHRoZSBjbGllbnQgbGlzdHMgdGhpcyB2YWx1ZSBmcm9tIHRoZSBleGVjdXRpb24gcHJvcGVydGllc1xyXG4gICAgICAgICAgY2FzZSBcImFyZ3VtZW50c1wiOiAvLyBpZ25vcmVkXHJcbiAgICAgICAgICBjYXNlIFwidXNlcm5hbWVcIjogIC8vIGlnbm9yZWRcclxuICAgICAgICAgIGNhc2UgXCJ4bWxlcnJcIjogLy8gZW5kIG9mIHRoZSBlcnJvciBtZXNzYWdlXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKE5TdHJpbmcuRm9ybWF0KFwiVW5rbm93biBlbGVtZW50OiAnezB9J1wiLCBlbGVtZW50TmFtZSkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIEdldENvZGUoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9lcnJvckNvZGU7XHJcbiAgfVxyXG5cclxuICAvLyBidWlsZCAmIHJldHVybiBhIGZvcm1hdHRlZCBlcnJvciBtZXNzYWdlXHJcbiAgR2V0TWVzc2FnZSgpOiBzdHJpbmcge1xyXG4gICAgbGV0IHNiOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuXHJcbiAgICBpZiAodGhpcy5fcGFyc2luZ0ZhaWxlZCkge1xyXG4gICAgICBzYi5BcHBlbmQoQWNjZXNzSGVscGVyLmxhbmd1YWdlRGF0YS5nZXRDb25zdE1lc3NhZ2UoTXNnSW50ZXJmYWNlLlJDX1NUUl9GN19VTkVYUEVDVEVEX0VSUikpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHN3aXRjaCAodGhpcy5fZXJyb3JDb2RlKSB7XHJcbiAgICAgICAgY2FzZSBTZXJ2ZXJFcnJvci5FUlJfQ1RYX05PVF9GT1VORDpcclxuICAgICAgICAgIGlmICh0aGlzLkluYWN0aXZpdHlUaW1lb3V0RXhwaXJlZCgpKVxyXG4gICAgICAgICAgICBzYi5BcHBlbmQoTlN0cmluZy5Gb3JtYXQoXCJ7MH0gKHsxfSB7Mn0pXCIsXHJcbiAgICAgICAgICAgICAgQWNjZXNzSGVscGVyLmxhbmd1YWdlRGF0YS5nZXRDb25zdE1lc3NhZ2UoTXNnSW50ZXJmYWNlLlNUUl9FUlJfU0VTU0lPTl9DTE9TRURfSU5BQ1RJVklUWSksXHJcbiAgICAgICAgICAgICAgTWF0aC5mbG9vcih0aGlzLmNvbnRleHRJbmFjdGl2aXR5VGltZW91dCAvIDYwMCksIC8vIGNvbnZlcnNpb24gZnJvbSAxLzEwIG9mIHNlY29uZHMgdG8gbWludXRlc1xyXG4gICAgICAgICAgICAgIEFjY2Vzc0hlbHBlci5sYW5ndWFnZURhdGEuZ2V0Q29uc3RNZXNzYWdlKE1zZ0ludGVyZmFjZS5TVFJfTUlOVVRFUykpKTtcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgc2IuQXBwZW5kKE5TdHJpbmcuRm9ybWF0KFwiezB9ICh7MX0pLlwiLCBBY2Nlc3NIZWxwZXIubGFuZ3VhZ2VEYXRhLmdldENvbnN0TWVzc2FnZShNc2dJbnRlcmZhY2UuU1RSX0VSUl9TRVNTSU9OX0NMT1NFRCksIHRoaXMuX2Vycm9yQ29kZSkpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgU2VydmVyRXJyb3IuRVJSX1dFQkNMSUVOVF9QUk9HUkFNX1JFTE9BREVEOlxyXG4gICAgICAgICAgc2IuQXBwZW5kKEFjY2Vzc0hlbHBlci5sYW5ndWFnZURhdGEuZ2V0Q29uc3RNZXNzYWdlKE1zZ0ludGVyZmFjZS5TVFJfRVJSX1dFQkNMSUVOVF9QUk9HUkFNX1JFTE9BREVEKSk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBTZXJ2ZXJFcnJvci5FUlJfRVhFQ1VURURfUFJPR1JBTV9DSEFOR0VEOlxyXG4gICAgICAgICAgc2IuQXBwZW5kKEFjY2Vzc0hlbHBlci5sYW5ndWFnZURhdGEuZ2V0Q29uc3RNZXNzYWdlKE1zZ0ludGVyZmFjZS5TVFJfRVJSX0VYRUNVVEVEX1BST0dSQU1fQ0hBTkdFRCkpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgU2VydmVyRXJyb3IuRVJSX0FVVEhFTlRJQ0FUSU9OOlxyXG4gICAgICAgICAgc2IuQXBwZW5kKEFjY2Vzc0hlbHBlci5sYW5ndWFnZURhdGEuZ2V0Q29uc3RNZXNzYWdlKE1zZ0ludGVyZmFjZS5VU1JJTlBfU1RSX0JBRFBBU1NXKSk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBTZXJ2ZXJFcnJvci5FUlJfQUNDRVNTX0RFTklFRDpcclxuICAgICAgICAgIHNiLkFwcGVuZChBY2Nlc3NIZWxwZXIubGFuZ3VhZ2VEYXRhLmdldENvbnN0TWVzc2FnZShNc2dJbnRlcmZhY2UuU1RSX0VSUl9BVVRIT1JJWkFUSU9OX0ZBSUxVUkUpKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgc2IuQXBwZW5kKHRoaXMuX2Vycm9yTWVzc2FnZSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgc2IuQXBwZW5kKE9TRW52aXJvbm1lbnQuRW9sU2VxICsgT1NFbnZpcm9ubWVudC5Fb2xTZXEpO1xyXG5cclxuICAgICAgaWYgKCFTZXJ2ZXJDb25maWcuSW5zdGFuY2UuU2hvdWxkRGlzcGxheUdlbmVyaWNFcnJvcigpKSB7XHJcbiAgICAgICAgc2IuQXBwZW5kKEFjY2Vzc0hlbHBlci5sYW5ndWFnZURhdGEuZ2V0Q29uc3RNZXNzYWdlKE1zZ0ludGVyZmFjZS5CUk9XU0VSX09QVF9JTkZPX1NFUlZFUl9TVFIpICsgXCI6ICAgXCIpO1xyXG4gICAgICAgIHNiLkFwcGVuZChTZXJ2ZXJDb25maWcuSW5zdGFuY2UuZ2V0U2VydmVyKCkpO1xyXG4gICAgICAgIGlmICghTlN0cmluZy5Jc051bGxPckVtcHR5KHRoaXMuX21pZGRsZXdhcmVBZGRyZXNzKSkge1xyXG4gICAgICAgICAgc2IuQXBwZW5kKFwiIC0tPiBcIik7XHJcbiAgICAgICAgICBzYi5BcHBlbmQodGhpcy5fbWlkZGxld2FyZUFkZHJlc3MpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzYi5BcHBlbmQoT1NFbnZpcm9ubWVudC5Fb2xTZXEpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBzYi5BcHBlbmQoQWNjZXNzSGVscGVyLmxhbmd1YWdlRGF0YS5nZXRDb25zdE1lc3NhZ2UoTXNnSW50ZXJmYWNlLlRBU0tSVUxFX1NUUl9BUFBMSUNBVElPTikgKyBcIjogICBcXFwiXCIpO1xyXG4gICAgICBzYi5BcHBlbmQoU2VydmVyQ29uZmlnLkluc3RhbmNlLmdldEFwcE5hbWUoKSk7XHJcbiAgICAgIHNiLkFwcGVuZChcIlxcXCIgKFxcXCJcIik7XHJcbiAgICAgIHNiLkFwcGVuZChcIlxcXCIpXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBzYi5Ub1N0cmluZygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBJbmFjdGl2aXR5VGltZW91dEV4cGlyZWQoKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgZXhwaXJlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgaWYgKHRoaXMuY29udGV4dEluYWN0aXZpdHlUaW1lb3V0ID4gMCkge1xyXG4gICAgICBsZXQgY3VyclRpbWVNaWxsaTogbnVtYmVyID0gTWlzYy5nZXRTeXN0ZW1NaWxsaXNlY29uZHMoKTtcclxuICAgICAgZXhwaXJlZCA9ICgoY3VyclRpbWVNaWxsaSAtIHRoaXMuX2xhc3RSZXF1ZXN0VGltZSkgPiAodGhpcy5jb250ZXh0SW5hY3Rpdml0eVRpbWVvdXQgKiAxMDApKTtcclxuICAgIH1cclxuICAgIHJldHVybiBleHBpcmVkO1xyXG4gIH1cclxufVxyXG5cclxuLy8gVE9ETzogSW1wbGVtZW50IHRoaXMgY2xhc3NcclxuLy8gY2xhc3MgQ2xpZW50TG9nQWNjdW11bGF0b3Ige1xyXG4vL1xyXG4vLyAgIHByaXZhdGUgc3RhdGljIENMSUVOVF9MT0dfSERSX01TRzogc3RyaW5nID0gXCJDbGllbnQgbG9nIGZpbGVcIjtcclxuLy8gICBwcml2YXRlIHN0YXRpYyBfZXhpc3RpbmdMb2dOYW1lczogTGlzdDxzdHJpbmc+ID0gbmV3IExpc3Q8c3RyaW5nPigpO1xyXG4vLyAgIHByaXZhdGUgX2NsaWVudExvZ09zOiBTdHJlYW1Xcml0ZXIgPSBudWxsO1xyXG4vLyAgIHByaXZhdGUgX2NvbnRleHRJZDogbnVtYmVyID0gMDtcclxuLy8gICBwcml2YXRlIF9mYWlsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuLy8gICBwcml2YXRlIF9maWxlTmFtZTogc3RyaW5nID0gbnVsbDtcclxuLy9cclxuLy8gICBjb25zdHJ1Y3Rvcihjb250ZXh0SUQ6IG51bWJlcikge1xyXG4vLyAgICAgdGhpcy5fY29udGV4dElkID0gY29udGV4dElEO1xyXG4vLyAgICAgdGhpcy5fZmlsZU5hbWUgPSB0aGlzLkJ1aWxkRmlsZU5hbWUoKTtcclxuLy8gICAgIHRoaXMuT3BlbkZvcldyaXRlKCk7XHJcbi8vICAgfVxyXG4vL1xyXG4vLyAgIFdyaXRlKGJ1ZmZlcjogc3RyaW5nKTogdm9pZCB7XHJcbi8vICAgICB0cnkge1xyXG4vLyAgICAgICBsZXQgZmxhZzogYm9vbGVhbiA9ICF0aGlzLl9mYWlsZWQ7XHJcbi8vICAgICAgIGlmICghZmxhZykge1xyXG4vLyAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihcIkNsaWVudExvZ1NlcXVlbmNlIDogTG9naW5nIGNsaWVudCBzZXF1ZW5jZSBpcyBkZWFjdGl2YXRlZFwiKTtcclxuLy8gICAgICAgfVxyXG4vLyAgICAgICBsZXQgZmxhZzI6IGJvb2xlYW4gPSB0aGlzLk9wZW5Gb3JXcml0ZSgpO1xyXG4vLyAgICAgICBpZiAoZmxhZzIpIHtcclxuLy8gICAgICAgICB0aGlzLl9jbGllbnRMb2dPcy5Xcml0ZShidWZmZXIpO1xyXG4vLyAgICAgICAgIHRoaXMuX2NsaWVudExvZ09zLkNsb3NlKCk7XHJcbi8vICAgICAgICAgdGhpcy5fY2xpZW50TG9nT3MgPSBudWxsO1xyXG4vLyAgICAgICAgIHRoaXMuT3BlbkZvcldyaXRlKCk7XHJcbi8vICAgICAgIH1cclxuLy8gICAgIH1cclxuLy8gICAgIGNhdGNoIChleCkge1xyXG4vLyAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBJT0V4Y2VwdGlvbikge1xyXG4vLyAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKGV4Lk1lc3NhZ2UpO1xyXG4vLyAgICAgICAgIE1pc2MuV3JpdGVTdGFja1RyYWNlKGV4LCBOQ29uc29sZS5FcnJvcik7XHJcbi8vICAgICAgIH1cclxuLy8gICAgICAgZWxzZVxyXG4vLyAgICAgICAgIHRocm93IGV4O1xyXG4vLyAgICAgfVxyXG4vLyAgIH1cclxuLy9cclxuLy8gICBSZWFkKCk6IHN0cmluZyB7XHJcbi8vICAgICBsZXQgcmVzdWx0OiBzdHJpbmcgPSBudWxsO1xyXG4vLyAgICAgdHJ5IHtcclxuLy8gICAgICAgbGV0IGZsYWc6IGJvb2xlYW4gPSAhdGhpcy5fZmFpbGVkO1xyXG4vLyAgICAgICBpZiAoIWZsYWcpIHtcclxuLy8gICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oXCJDbGllbnRMb2dTZXF1ZW5jZSA6IExvZ2luZyBjbGllbnQgc2VxdWVuY2UgaXMgZGVhY3RpdmF0ZWRcIik7XHJcbi8vICAgICAgIH1cclxuLy8gICAgICAgdGhpcy5fY2xpZW50TG9nT3MuQ2xvc2UoKTtcclxuLy8gICAgICAgdGhpcy5fY2xpZW50TG9nT3MgPSBudWxsO1xyXG4vLyAgICAgICByZXN1bHQgPSBIYW5kbGVGaWxlcy5yZWFkVG9TdHJpbmcodGhpcy5fZmlsZU5hbWUsIEVuY29kaW5nLkRlZmF1bHQpO1xyXG4vLyAgICAgICB0aGlzLk9wZW5Gb3JXcml0ZSgpO1xyXG4vLyAgICAgfVxyXG4vLyAgICAgY2F0Y2ggKGV4KSB7XHJcbi8vICAgICAgIGlmIChleCBpbnN0YW5jZW9mIElPRXhjZXB0aW9uKSB7XHJcbi8vICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coZXguTWVzc2FnZSk7XHJcbi8vICAgICAgICAgTWlzYy5Xcml0ZVN0YWNrVHJhY2UoZXgsIE5Db25zb2xlLkVycm9yKTtcclxuLy8gICAgICAgfVxyXG4vLyAgICAgICBlbHNlXHJcbi8vICAgICAgICAgdGhyb3cgZXg7XHJcbi8vICAgICB9XHJcbi8vICAgICByZXR1cm4gcmVzdWx0O1xyXG4vLyAgIH1cclxuLy9cclxuLy8gICBSZXNldCgpOiB2b2lkIHtcclxuLy8gICAgIHRyeSB7XHJcbi8vICAgICAgIGxldCBmbGFnOiBib29sZWFuID0gIXRoaXMuX2ZhaWxlZDtcclxuLy8gICAgICAgaWYgKCFmbGFnKSB7XHJcbi8vICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKFwiQ2xpZW50TG9nU2VxdWVuY2UgOiBMb2dpbmcgY2xpZW50IHNlcXVlbmNlIGlzIGRlYWN0aXZhdGVkXCIpO1xyXG4vLyAgICAgICB9XHJcbi8vICAgICAgIHRoaXMuX2NsaWVudExvZ09zLkNsb3NlKCk7XHJcbi8vICAgICAgIHRoaXMuX2NsaWVudExvZ09zID0gbnVsbDtcclxuLy8gICAgICAgSGFuZGxlRmlsZXMuZGVsZXRlRmlsZSh0aGlzLl9maWxlTmFtZSk7XHJcbi8vICAgICB9XHJcbi8vICAgICBjYXRjaCAoZXgpIHtcclxuLy8gICAgICAgaWYgKGV4IGluc3RhbmNlb2YgSU9FeGNlcHRpb24pIHtcclxuLy8gICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZyhleCk7XHJcbi8vICAgICAgIH1cclxuLy8gICAgICAgZWxzZVxyXG4vLyAgICAgICAgIHRocm93IGV4O1xyXG4vLyAgICAgfVxyXG4vLyAgIH1cclxuLy9cclxuLy8gICBzdGF0aWMgRXhpc3RpbmdMb2dzRm91bmQoKTogYm9vbGVhbiB7XHJcbi8vICAgICBsZXQgcmVzdWx0OiBib29sZWFuID0gZmFsc2U7XHJcbi8vICAgICBDbGllbnRMb2dBY2N1bXVsYXRvci5CdWlsZGV4aXN0aW5nTG9nTGlzdCgpO1xyXG4vLyAgICAgbGV0IGZsYWc6IGJvb2xlYW4gPSBDbGllbnRMb2dBY2N1bXVsYXRvci5fZXhpc3RpbmdMb2dOYW1lcyAhPT0gbnVsbCAmJiBDbGllbnRMb2dBY2N1bXVsYXRvci5fZXhpc3RpbmdMb2dOYW1lcy5Db3VudCA+IDA7XHJcbi8vICAgICBpZiAoZmxhZykge1xyXG4vLyAgICAgICByZXN1bHQgPSB0cnVlO1xyXG4vLyAgICAgfVxyXG4vLyAgICAgcmV0dXJuIHJlc3VsdDtcclxuLy8gICB9XHJcbi8vXHJcbi8vICAgc3RhdGljIEV4aXN0aW5nTG9nSXRlcmF0b3IoKTogSUVudW1lcmF0b3I8c3RyaW5nPiB7XHJcbi8vICAgICByZXR1cm4gQ2xpZW50TG9nQWNjdW11bGF0b3IuX2V4aXN0aW5nTG9nTmFtZXMuR2V0RW51bWVyYXRvcigpO1xyXG4vLyAgIH1cclxuLy9cclxuLy8gICBzdGF0aWMgQnVpbGRMb2dIZWFkZXJMaW5lKGxvZ05hbWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbi8vICAgICBsZXQgc3RyaW5nQnVpbGRlcjogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKFwiQ2xpZW50IGxvZyBmaWxlXCIpO1xyXG4vLyAgICAgbGV0IHN0cjogc3RyaW5nID0gTlN0cmluZy5TdWJzdHJpbmcobG9nTmFtZSwgbG9nTmFtZS5MYXN0SW5kZXhPZihOTnVtYmVyLlRvU3RyaW5nKFBhdGguRGlyZWN0b3J5U2VwYXJhdG9yQ2hhcikgKyBcIkNTXCIpICsgMywgbG9nTmFtZS5MYXN0SW5kZXhPZihcIi5sb2dcIikgLSAobG9nTmFtZS5MYXN0SW5kZXhPZihOTnVtYmVyLlRvU3RyaW5nKFBhdGguRGlyZWN0b3J5U2VwYXJhdG9yQ2hhcikgKyBcIkNTXCIpICsgMykpO1xyXG4vLyAgICAgc3RyaW5nQnVpbGRlci5BcHBlbmQoXCIgKENvbnRleHQgOiBcIik7XHJcbi8vICAgICBzdHJpbmdCdWlsZGVyLkFwcGVuZChzdHIgKyBcIiApIFwiKTtcclxuLy8gICAgIHJldHVybiBzdHJpbmdCdWlsZGVyLlRvU3RyaW5nKCk7XHJcbi8vICAgfVxyXG4vL1xyXG4vLyAgIEVtcHR5KCk6IGJvb2xlYW4ge1xyXG4vLyAgICAgcmV0dXJuIHRoaXMuX2ZhaWxlZCB8fCAhSGFuZGxlRmlsZXMuaXNFeGlzdHModGhpcy5fZmlsZU5hbWUpIHx8IEhhbmRsZUZpbGVzLmdldEZpbGVTaXplKHRoaXMuX2ZpbGVOYW1lKSA9PT0gMDtcclxuLy8gICB9XHJcbi8vXHJcbi8vICAgSXNGYWlsZWQoKTogYm9vbGVhbiB7XHJcbi8vICAgICByZXR1cm4gdGhpcy5fZmFpbGVkO1xyXG4vLyAgIH1cclxuLy9cclxuLy8gICBwcml2YXRlIHN0YXRpYyBCdWlsZGV4aXN0aW5nTG9nTGlzdCgpOiB2b2lkIHtcclxuLy8gICAgIGxldCBmbGFnOiBib29sZWFuID0gQ2xpZW50TG9nQWNjdW11bGF0b3IuX2V4aXN0aW5nTG9nTmFtZXMgIT09IG51bGwgJiYgQ2xpZW50TG9nQWNjdW11bGF0b3IuX2V4aXN0aW5nTG9nTmFtZXMuQ291bnQgPT09IDA7XHJcbi8vICAgICBpZiAoZmxhZykge1xyXG4vLyAgICAgICBsZXQgcGF0aDogc3RyaW5nID0gXCJcIjtcclxuLy8gICAgICAgQ2xpZW50TG9nQWNjdW11bGF0b3IuX2V4aXN0aW5nTG9nTmFtZXMuQWRkUmFuZ2UoTkFycmF5LlRvRW51bWVyYWJsZShEaXJlY3RvcnkuR2V0RmlsZXMocGF0aCwgXCJDUyouTE9HXCIpKSk7XHJcbi8vICAgICB9XHJcbi8vICAgfVxyXG4vL1xyXG4vLyAgIHByaXZhdGUgT3BlbkZvcldyaXRlKCk6IGJvb2xlYW4ge1xyXG4vLyAgICAgbGV0IGZsYWc6IGJvb2xlYW4gPSB0aGlzLl9jbGllbnRMb2dPcyA9PT0gbnVsbDtcclxuLy8gICAgIGlmIChmbGFnKSB7XHJcbi8vICAgICAgIHRyeSB7XHJcbi8vICAgICAgICAgdGhpcy5fY2xpZW50TG9nT3MgPSBuZXcgU3RyZWFtV3JpdGVyKHRoaXMuX2ZpbGVOYW1lLCB0cnVlLCBFbmNvZGluZy5EZWZhdWx0KTtcclxuLy8gICAgICAgICB0aGlzLl9mYWlsZWQgPSBmYWxzZTtcclxuLy8gICAgICAgfVxyXG4vLyAgICAgICBjYXRjaCAoZXgpIHtcclxuLy8gICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBJT0V4Y2VwdGlvbikge1xyXG4vLyAgICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coXCJDbGllbnRMb2dTZXF1ZW5jZXMgOiBcIiArIGV4Lk1lc3NhZ2UpO1xyXG4vLyAgICAgICAgICAgdGhpcy5fZmFpbGVkID0gdHJ1ZTtcclxuLy8gICAgICAgICAgIHRoaXMuX2NsaWVudExvZ09zID0gbnVsbDtcclxuLy8gICAgICAgICAgIHRoaXMuX2NvbnRleHRJZCA9IC0xO1xyXG4vLyAgICAgICAgICAgdGhpcy5fZmlsZU5hbWUgPSBudWxsO1xyXG4vLyAgICAgICAgIH1cclxuLy8gICAgICAgICBlbHNlXHJcbi8vICAgICAgICAgICB0aHJvdyBleDtcclxuLy8gICAgICAgfVxyXG4vLyAgICAgfVxyXG4vLyAgICAgcmV0dXJuICF0aGlzLl9mYWlsZWQ7XHJcbi8vICAgfVxyXG4vL1xyXG4vLyAgIHByaXZhdGUgQnVpbGRGaWxlTmFtZSgpOiBzdHJpbmcge1xyXG4vLyAgICAgcmV0dXJuIFwiXCI7XHJcbi8vICAgfVxyXG4vLyB9XHJcbiJdfQ==
|