@magic-xpa/engine 4.801.0-dev481.306 → 4.801.0-dev481.309
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/esm2020/src/ClientManager.mjs +2 -11
- package/esm2020/src/CommandsTable.mjs +12 -13
- package/esm2020/src/CurrentClientVersion.mjs +2 -2
- package/esm2020/src/GUIManager.mjs +1 -2
- package/esm2020/src/GuiEventsProcessor.mjs +2 -19
- package/esm2020/src/commands/ClientToServer/CommandFactory.mjs +35 -35
- package/esm2020/src/commands/ClientToServer/ComputeEventCommand.mjs +1 -1
- package/esm2020/src/commands/ClientToServer/ContextTimeoutResetCommand.mjs +7 -7
- package/esm2020/src/commands/ClientToServer/QueryCommand.mjs +1 -1
- package/esm2020/src/commands/ClientToServer/RecomputeCommand.mjs +2 -2
- package/esm2020/src/commands/ServerToClient/ClientTargetedCommandBase.mjs +1 -1
- package/esm2020/src/commands/ServerToClient/EnhancedVerifyCommand.mjs +1 -1
- package/esm2020/src/commands/ServerToClient/OpenURLCommand.mjs +1 -2
- package/esm2020/src/commands/ServerToClient/ResetLocateCommand.mjs +5 -5
- package/esm2020/src/commands/ServerToClient/VerifyCommand.mjs +1 -3
- package/esm2020/src/communications/InteractiveCommunicationsFailureHandler.mjs +1 -1
- package/esm2020/src/data/DataSourceIdKey.mjs +1 -9
- package/esm2020/src/data/DataView.mjs +52 -54
- package/esm2020/src/data/DvCache.mjs +4 -29
- package/esm2020/src/env/Environment.mjs +2 -5
- package/esm2020/src/env/LanguageData.mjs +1 -2
- package/esm2020/src/event/ActionManager.mjs +2 -5
- package/esm2020/src/event/Event.mjs +249 -355
- package/esm2020/src/event/EventHandler.mjs +1 -2
- package/esm2020/src/event/EventHandlerPosition.mjs +1 -2
- package/esm2020/src/event/EventsManager.mjs +21 -43
- package/esm2020/src/exp/ExpressionEvaluator.mjs +1 -6
- package/esm2020/src/gui/MgControl.mjs +1 -3
- package/esm2020/src/gui/MgForm.mjs +1 -2
- package/esm2020/src/http/client/HttpClientBase.mjs +1 -17
- package/esm2020/src/remote/RemoteCommandsProcessor.mjs +1 -10
- package/esm2020/src/rt/DataviewHeaders.mjs +2 -6
- package/esm2020/src/rt/DataviewHeadersSaxHandler.mjs +1 -2
- package/esm2020/src/rt/LastFocusedManager.mjs +1 -5
- package/esm2020/src/rt/Operation.mjs +2 -12
- package/esm2020/src/tasks/Task.mjs +3 -17
- package/esm2020/src/util/FlowMonitorQueue.mjs +1 -14
- package/esm2020/src/util/MgPriorityBlockingQueue.mjs +1 -3
- package/fesm2015/magic-xpa-engine.mjs +516 -799
- package/fesm2015/magic-xpa-engine.mjs.map +1 -1
- package/fesm2020/magic-xpa-engine.mjs +509 -789
- package/fesm2020/magic-xpa-engine.mjs.map +1 -1
- package/package.json +4 -4
- package/src/ClientManager.d.ts +0 -3
- package/src/CommandsTable.d.ts +5 -5
- package/src/GuiEventsProcessor.d.ts +0 -2
- package/src/commands/ClientToServer/CommandFactory.d.ts +35 -35
- package/src/commands/ClientToServer/ContextTimeoutResetCommand.d.ts +2 -2
- package/src/commands/ServerToClient/ResetLocateCommand.d.ts +2 -2
- package/src/commands/ServerToClient/VerifyCommand.d.ts +0 -1
- package/src/data/DataSourceIdKey.d.ts +0 -5
- package/src/data/DataView.d.ts +0 -1
- package/src/data/DvCache.d.ts +2 -6
- package/src/env/Environment.d.ts +0 -2
- package/src/event/ActionManager.d.ts +1 -3
- package/src/event/Event.d.ts +5 -22
- package/src/event/EventsManager.d.ts +1 -5
- package/src/http/client/HttpClientBase.d.ts +0 -2
- package/src/remote/RemoteCommandsProcessor.d.ts +0 -4
- package/src/rt/DataviewHeaders.d.ts +1 -3
- package/src/rt/Operation.d.ts +0 -4
- package/src/util/FlowMonitorQueue.d.ts +0 -11
|
@@ -449,7 +449,6 @@ export class EventHandler {
|
|
|
449
449
|
this._task.leaveLoop();
|
|
450
450
|
break;
|
|
451
451
|
case ConstInterface.MG_OPER_BLOCK:
|
|
452
|
-
let startBlockIdx = execFlowIdx;
|
|
453
452
|
if (!oper.getExecOnServer() || (returnedFromServer && oper.getServerId() < nextOperIdx)) {
|
|
454
453
|
this._task.setUseLoopStack(true);
|
|
455
454
|
if (!returnedFromServer || oper.getServerId() >= nextOperIdx)
|
|
@@ -770,4 +769,4 @@ export class RetVals {
|
|
|
770
769
|
this.BlockIfReturnedFromServer = inBlockIfReturnedFromServer;
|
|
771
770
|
}
|
|
772
771
|
}
|
|
773
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXZlbnRIYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZW5naW5lL3NyYy9ldmVudC9FdmVudEhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLG9CQUFvQixFQUFFLFNBQVMsRUFBUSxPQUFPLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxpQkFBaUIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ2hJLE9BQU8sRUFDTCxRQUFRLEVBQ1IsU0FBUyxFQUNULGlCQUFpQixFQUNqQixNQUFNLEVBQ04sZ0JBQWdCLEVBRWhCLHFCQUFxQixFQUNyQixZQUFZLEVBQ1osU0FBUyxFQUNWLE1BQU0sa0JBQWtCLENBQUM7QUFFMUIsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUM5QixPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDNUMsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBS3BELE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBRTFELE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUdsRCxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFHekMsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQ2pELE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQzdELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzlELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUMsdUJBQXVCLEVBQUMsTUFBTSxtQ0FBbUMsQ0FBQztBQUUxRSxNQUFNLE9BQU8sWUFBWTtJQXNCdkI7UUFyQlEsZ0JBQVcsR0FBYSxJQUFJLFFB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QUMseUJBQXlCLEdBQUcsS0FBSyxDQUFDO0lBQ3pDLENBQUM7SUFRTyxhQUFhLENBQUMsT0FBZSxFQUFFLG9CQUE2QixFQUFFLDJCQUFvQztRQUN4RyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN2QixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUNwQixJQUFJLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQztRQUMzQixJQUFJLENBQUMsa0JBQWtCLEdBQUcsb0JBQW9CLENBQUM7UUFDL0MsSUFBSSxDQUFDLHlCQUF5QixHQUFHLDJCQUEyQixDQUFDO0lBQy9ELENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QXBwbGljYXRpb25FeGNlcHRpb24sIEV4Y2VwdGlvbiwgTGlzdCwgTlN0cmluZywgUmVmUGFyYW0sIFN0cmluZ0J1aWxkZXIsIGlzTnVsbE9yVW5kZWZpbmVkfSBmcm9tIFwiQG1hZ2ljLXhwYS9tc2NvcmVsaWJcIjtcclxuaW1wb3J0IHtcclxuICBCcmtTY29wZSxcclxuICBDb25zdGFudHMsXHJcbiAgSW50ZXJuYWxJbnRlcmZhY2UsXHJcbiAgTG9nZ2VyLFxyXG4gIExvZ2dlcl9Mb2dMZXZlbHMsXHJcbiAgU3RvcmFnZUF0dHJpYnV0ZSxcclxuICBTdG9yYWdlQXR0cmlidXRlQ2hlY2ssXHJcbiAgWE1MQ29uc3RhbnRzLFxyXG4gIFhtbFBhcnNlclxyXG59IGZyb20gXCJAbWFnaWMteHBhL3V0aWxzXCI7XHJcbmltcG9ydCB7RXhwVmFsLCBNYW5hZ2VyfSBmcm9tIFwiQG1hZ2ljLXhwYS9ndWlcIjtcclxuaW1wb3J0IHtFdmVudH0gZnJvbSBcIi4vRXZlbnRcIjtcclxuaW1wb3J0IHtGaWVsZEJhc2V9IGZyb20gXCIuLi9kYXRhL0ZpZWxkQmFzZVwiO1xyXG5pbXBvcnQge09wZXJhdGlvblRhYmxlfSBmcm9tIFwiLi4vcnQvT3BlcmF0aW9uVGFibGVcIjtcclxuaW1wb3J0IHtBcmd1bWVudH0gZnJvbSBcIi4uL3J0L0FyZ3VtZW50XCI7XHJcbmltcG9ydCB7QXJndW1lbnRzTGlzdH0gZnJvbSBcIi4uL3J0L0FyZ3VtZW50c0xpc3RcIjtcclxuaW1wb3J0IHtNZ0NvbnRyb2x9IGZyb20gXCIuLi9ndWkvTWdDb250cm9sXCI7XHJcbmltcG9ydCB7T3BlcmF0aW9ufSBmcm9tIFwiLi4vcnQvT3BlcmF0aW9uXCI7XHJcbmltcG9ydCB7Rmxvd01vbml0b3JRdWV1ZX0gZnJvbSBcIi4uL3V0aWwvRmxvd01vbml0b3JRdWV1ZVwiO1xyXG5pbXBvcnQge01HRGF0YX0gZnJvbSBcIi4uL3Rhc2tzL01HRGF0YVwiO1xyXG5pbXBvcnQge1NlcnZlckVycm9yfSBmcm9tIFwiLi4vcmVtb3RlL1NlcnZlckVycm9yXCI7XHJcbmltcG9ydCB7UnVuVGltZUV2ZW50fSBmcm9tIFwiLi9SdW5UaW1lRXZlbnRcIjtcclxuaW1wb3J0IHtNZ0Zvcm19IGZyb20gXCIuLi9ndWkvTWdGb3JtXCI7XHJcbmltcG9ydCB7WWVzTm9FeHB9IGZyb20gXCIuLi9leHAvWWVzTm9FeHBcIjtcclxuaW1wb3J0IHtUYXNrfSBmcm9tIFwiLi4vdGFza3MvVGFza1wiO1xyXG5pbXBvcnQge0RhdGFWaWV3fSBmcm9tIFwiLi4vZGF0YS9EYXRhVmlld1wiO1xyXG5pbXBvcnQge0NvbnN0SW50ZXJmYWNlfSBmcm9tIFwiLi4vQ29uc3RJbnRlcmZhY2VcIjtcclxuaW1wb3J0IHtGbG93TW9uaXRvckludGVyZmFjZX0gZnJvbSBcIi4uL0Zsb3dNb25pdG9ySW50ZXJmYWNlXCI7XHJcbmltcG9ydCB7IExhc3RGb2N1c2VkTWFuYWdlciB9IGZyb20gXCIuLi9ydC9MYXN0Rm9jdXNlZE1hbmFnZXJcIjtcclxuaW1wb3J0IHsgQWNjZXNzSGVscGVyIH0gZnJvbSBcIi4uL0FjY2Vzc0hlbHBlclwiO1xyXG5pbXBvcnQge1JlbW90ZUNvbW1hbmRzUHJvY2Vzc29yfSBmcm9tIFwiLi4vcmVtb3RlL1JlbW90ZUNvbW1hbmRzUHJvY2Vzc29yXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgRXZlbnRIYW5kbGVyIHtcclxuICBwcml2YXRlIF9lbmFibGVkRXhwOiBZZXNOb0V4cCA9IG5ldyBZZXNOb0V4cCh0cnVlKTsgLy8gZGVmYXVsdCBpcyB0cnVlIGFsd2F5c1xyXG4gIHByaXZhdGUgX29wZXJhdGlvblRhYjogT3BlcmF0aW9uVGFibGUgPSBudWxsO1xyXG4gIHByaXZhdGUgX3Byb3BhZ2F0ZUV4cDogWWVzTm9FeHAgPSBuZXcgWWVzTm9FeHAodHJ1ZSk7XHJcbiAgcHJpdmF0ZSBfaXNIYW5kbGVyT25Gb3JtOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfY3RybDogTWdDb250cm9sID0gbnVsbDtcclxuICBwcml2YXRlIF9jdHJsTmFtZTogc3RyaW5nID0gbnVsbDtcclxuICBwcml2YXRlIF9kdkxlbjogbnVtYmVyID0gMDsgLy8gVGhlIOKAnGR2cG9zwoFFY29udGFpbnMgdGhlIG51bWJlciBvZiBmaWVsZHMgc2VsZWN0ZWQgaW4gdGhlIGhhbmRsZXJcclxuICBwcml2YXRlIF9kdlBvczogbnVtYmVyID0gMDsgLy8gYW5kIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZmllbGQgb2YgaXQgaW4gdGhlIERhdGF2aWV3LlxyXG4gIHByaXZhdGUgX2V2dDogRXZlbnQgPSBudWxsO1xyXG4gIHByaXZhdGUgX2hhbmRsZWRCeUNsaWVudDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2hhbmRsZXJGbGQ6IEZpZWxkQmFzZSA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfaGFzUGFyYW1ldGVyczogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2lkOiBudW1iZXIgPSAwO1xyXG4gIHByaXZhdGUgX2xldmVsOiBzdHJpbmcgPSAnXFwwJzsgLy8gQ29udHJvbCB8IEhhbmRsZXIgfCBSZWNvcmQgfCBUYXNrIHwgVmFyaWFibGVcclxuICBwcml2YXRlIF9zY29wZTogQnJrU2NvcGUgPSBudWxsOyAvLyBUYXNrfFN1YnRhc2t8R2xvYmFsXHJcbiAgcHJpdmF0ZSBfdGFzazogVGFzayA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfdGFza01nZElEOiBudW1iZXIgPSAtMTtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIENUT1JcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgdGhpcy5fb3BlcmF0aW9uVGFiID0gbmV3IE9wZXJhdGlvblRhYmxlKCk7XHJcbiAgfVxyXG5cclxuICBnZXRDdHJsTmFtZSgpIDogc3RyaW5ne1xyXG4gICAgcmV0dXJuIHRoaXMuX2N0cmxOYW1lO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHBhcnNlIHRoZSBldmVudCBoYW5kbGVyIGFuZCBpdHMgc3ViLXN0cnVjdHVyZXNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGZpbGxEYXRhKHRhc2tSZWY6IFRhc2ssIHBhcnNlcjogWG1sUGFyc2VyKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fdGFzayA9PT0gbnVsbCkge1xyXG4gICAgICB0aGlzLl90YXNrID0gdGFza1JlZjtcclxuICAgICAgdGhpcy5fdGFza01nZElEID0gdGhpcy5fdGFzay5nZXRNZ2RJRCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHdoaWxlICh0aGlzLmluaXRJbm5lck9iamVjdHMocGFyc2VyLCBwYXJzZXIuZ2V0TmV4dFRhZygpKSkge1xyXG4gICAgfVxyXG4gICAgbGV0IGRhdGFWaWV3OiBEYXRhVmlldyA9IDxEYXRhVmlldz50aGlzLl90YXNrLkRhdGFWaWV3O1xyXG4gICAgdGhpcy5faGFzUGFyYW1ldGVycyA9IGRhdGFWaWV3LlBhcmFtZXRlcnNFeGlzdCh0aGlzLl9kdlBvcywgdGhpcy5fZHZMZW4pO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGluaXRpYWxpemluZyBvZiBpbm5lciBvYmplY3RzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGluaXRJbm5lck9iamVjdHMocGFyc2VyOiBYbWxQYXJzZXIsIGZvdW5kVGFnTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcblxyXG4gICAgaWYgKGZvdW5kVGFnTmFtZSA9PT0gbnVsbClcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIGlmIChmb3VuZFRhZ05hbWUgPT09IENvbnN0SW50ZXJmYWNlLk1HX1RBR19IQU5ETEVSKVxyXG4gICAgICB0aGlzLmluaXRJbm5lckVsZW1lbnRzKHBhcnNlciwgdGhpcy5fdGFzayk7XHJcblxyXG4gICAgZWxzZSBpZiAoZm91bmRUYWdOYW1lID09PSBDb25zdEludGVyZmFjZS5NR19UQUdfT1BFUilcclxuICAgICAgdGhpcy5fb3BlcmF0aW9uVGFiLmZpbGxEYXRhKHRoaXMuX3Rhc2ssIHRoaXMsIHBhcnNlcik7XHJcblxyXG4gICAgZWxzZSBpZiAoZm91bmRUYWdOYW1lID09PSBDb25zdEludGVyZmFjZS5NR19UQUdfRVZFTlQgJiYgdGhpcy5fZXZ0ID09PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuX2V2dCA9IG5ldyBFdmVudCgpO1xyXG4gICAgICB0aGlzLl9ldnQuZmlsbERhdGEocGFyc2VyLCB0aGlzLl90YXNrKTtcclxuICAgICAgaWYgKHRoaXMuX2V2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfVElNRVIgfHxcclxuICAgICAgICAodGhpcy5fZXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9VU0VSICYmIHRoaXMuX2V2dC5nZXRVc2VyRXZlbnRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfVElNRVIpKVxyXG4gICAgICAgIHRoaXMuX3Rhc2suZ2V0TUdEYXRhKCkuYWRkVGltZXJIYW5kbGVyKHRoaXMpO1xyXG5cclxuICAgICAgLy8gZm9yIGVuYWJsZSBNR19BQ1RfWk9PTSBhY3Rpb25cclxuICAgICAgLy8gMS4gaGFuZGxlciBvbiB6b29tIGFjdGlvbi5cclxuICAgICAgLy8gMi4gaGFuZGxlciBvbiBhIHVzZXIgZGVmaW5lZCBoYW5kbGVyIHdpdGggYSB0cmlnZ2VyIG9mIHpvb20gYWN0aW9uLlxyXG4gICAgICBpZiAoKCh0aGlzLl9ldnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0lOVEVSTkFMICYmIHRoaXMuX2V2dC5nZXRJbnRlcm5hbENvZGUoKSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1pPT00pIHx8ICh0aGlzLl9ldnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX1VTRVIgJiYgdGhpcy5fZXZ0LmdldFVzZXJFdmVudCgpICE9PSBudWxsICYmIHRoaXMuX2V2dC5nZXRVc2VyRXZlbnRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfSU5URVJOQUwgJiYgdGhpcy5fZXZ0LmdldFVzZXJFdmVudCgpLmdldEludGVybmFsQ29kZSgpID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfWk9PTSkpICYmICF0aGlzLl90YXNrLmdldEVuYWJsZVpvb21IYW5kbGVyKCkpIHtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2hhbmRsZXJGbGQgIT09IG51bGwpXHJcbiAgICAgICAgICB0aGlzLl9oYW5kbGVyRmxkLnNldEhhc1pvb21IYW5kbGVyKCk7XHJcblxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuX2N0cmwgIT09IG51bGwpXHJcbiAgICAgICAgICB0aGlzLl9jdHJsLkhhc1pvb21IYW5kbGVyID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgdGhpcy5fdGFzay5zZXRFbmFibGVab29tSGFuZGxlcigpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChmb3VuZFRhZ05hbWUgPT09ICcvJyArIENvbnN0SW50ZXJmYWNlLk1HX1RBR19IQU5ETEVSKSB7XHJcbiAgICAgIHBhcnNlci5zZXRDdXJySW5kZXgyRW5kT2ZUYWcoKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coXCJ0aGVyZSBpcyBubyBzdWNoIHRhZyBpbiBFdmVudEhhbmRsZXIuaW5pdElubmVyT2JqZWN0cygpIFwiICsgZm91bmRUYWdOYW1lKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgSW5pdGlhbGl6aW5nIG9mIGlubmVyIGF0dHJpYnV0ZXMgb2YgPGhhbmRsZXI+IHRhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0YXNrUmVmXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIGluaXRJbm5lckVsZW1lbnRzKHBhcnNlcjogWG1sUGFyc2VyLCB0YXNrUmVmOiBUYXNrKTogdm9pZCB7XHJcbiAgICBsZXQgZW5kQ29udGV4dDogbnVtYmVyID0gcGFyc2VyLmdldFhNTGRhdGEoKS5pbmRleE9mKCBYTUxDb25zdGFudHMuVEFHX0NMT1NFLCBwYXJzZXIuZ2V0Q3VyckluZGV4KCkpO1xyXG4gICAgaWYgKGVuZENvbnRleHQgIT09IC0xICYmIGVuZENvbnRleHQgPCBwYXJzZXIuZ2V0WE1MZGF0YSgpLmxlbmd0aCkge1xyXG4gICAgICAvLyBsYXN0IHBvc2l0aW9uIG9mIGl0cyB0YWdcclxuICAgICAgbGV0IHRhZzogc3RyaW5nID0gcGFyc2VyLmdldFhNTHN1YnN0cmluZyhlbmRDb250ZXh0KTtcclxuICAgICAgcGFyc2VyLmFkZDJDdXJySW5kZXgodGFnLmluZGV4T2YoIENvbnN0SW50ZXJmYWNlLk1HX1RBR19IQU5ETEVSKSArIENvbnN0SW50ZXJmYWNlLk1HX1RBR19IQU5ETEVSLmxlbmd0aCk7XHJcblxyXG4gICAgICBsZXQgdG9rZW5zVmVjdG9yOiBMaXN0PHN0cmluZz4gPSBYbWxQYXJzZXIuZ2V0VG9rZW5zKHBhcnNlci5nZXRYTUxzdWJzdHJpbmcoZW5kQ29udGV4dCksIFhNTENvbnN0YW50cy5YTUxfQVRUUl9ERUxJTSk7XHJcbiAgICAgIHRoaXMuaW5pdEVsZW1lbnRzKHRva2Vuc1ZlY3RvciwgdGFza1JlZik7XHJcbiAgICAgIHBhcnNlci5zZXRDdXJySW5kZXgoKytlbmRDb250ZXh0KTsgLy8gdG8gZGVsZXRlIFwiPlwiIHRvb1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coXCJpbiBIYW5kbGVyLkZpbGxEYXRhKCkgb3V0IG9mIHN0cmluZyBib3VuZHNcIik7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgTWFrZSBpbml0aWFsaXphdGlvbiBvZiBwcml2YXRlIGVsZW1lbnRzIGJ5IGZvdW5kIHRva2Vuc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0b2tlbnNWZWN0b3JcIj5mb3VuZCB0b2tlbnMsIHdoaWNoIGNvbnNpc3QgYXR0cmlidXRlL3ZhbHVlIG9mIGV2ZXJ5IGZvdW5kXHRlbGVtZW50IDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0YXNrUmVmXCI+IDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBpbml0RWxlbWVudHModG9rZW5zVmVjdG9yOiBMaXN0PHN0cmluZz4sIHRhc2tSZWY6IFRhc2spOiB2b2lkIHtcclxuICAgIGZvciAobGV0IGo6IG51bWJlciA9IDA7IGogPCB0b2tlbnNWZWN0b3IubGVuZ3RoOyBqICs9IDIpIHtcclxuICAgICAgbGV0IGF0dHJpYnV0ZTogc3RyaW5nID0gKHRva2Vuc1ZlY3Rvci5nZXRfSXRlbShqKSk7XHJcbiAgICAgIGxldCB2YWx1ZVN0cjogc3RyaW5nID0gKHRva2Vuc1ZlY3Rvci5nZXRfSXRlbShqICsgMSkpO1xyXG5cclxuICAgICAgc3dpdGNoIChhdHRyaWJ1dGUpIHtcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfSEFORExFREJZOlxyXG4gICAgICAgICAgdGhpcy5faGFuZGxlZEJ5Q2xpZW50ID0gKHZhbHVlU3RyLnRvVXBwZXJDYXNlKCkgPT09IFwiQ1wiLnRvVXBwZXJDYXNlKCkpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfSUQ6XHJcbiAgICAgICAgICB0aGlzLl9pZCA9IFhtbFBhcnNlci5nZXRJbnQodmFsdWVTdHIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9MRVZFTDpcclxuICAgICAgICAgIHRoaXMuX2xldmVsID0gdmFsdWVTdHJbMF07XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX09CSkVDVDpcclxuICAgICAgICAgIGxldCB2YWx1ZVN0cmluZ0N0cmxOYW1lOiBzdHJpbmcgPSBYbWxQYXJzZXIudW5lc2NhcGUodmFsdWVTdHIpO1xyXG4gICAgICAgICAgdGhpcy5fY3RybE5hbWUgPSBYbWxQYXJzZXIudW5lc2NhcGUodmFsdWVTdHJpbmdDdHJsTmFtZSkudG9VcHBlckNhc2UoKTsgLy8gcmVsZXZhbnQgZm9yIHVzZXIgaGFuZGxlcnMgb25seVxyXG4gICAgICAgICAgdGhpcy5jYWxjdWxhdGVDdHJsRnJvbUNvbnRyb2xOYW1lKHRhc2tSZWYpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9WQVJJQUJMRTpcclxuICAgICAgICAgIHRoaXMuX2hhbmRsZXJGbGQgPSA8RmllbGRCYXNlPnRoaXMuX3Rhc2suRGF0YVZpZXcuZ2V0RmllbGQoWG1sUGFyc2VyLmdldEludCh2YWx1ZVN0cikpO1xyXG4gICAgICAgICAgdGhpcy5faGFuZGxlckZsZC5zZXRIYXNDaGFuZ2VFdmVudCgpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9TQ09QRTpcclxuICAgICAgICAgIHRoaXMuX3Njb3BlID0gPEJya1Njb3BlPnZhbHVlU3RyWzBdO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9QUk9QQUdBVEU6XHJcbiAgICAgICAgICB0aGlzLl9wcm9wYWdhdGVFeHAuc2V0VmFsKHRhc2tSZWYsIHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfRU5BQkxFRDpcclxuICAgICAgICAgIHRoaXMuX2VuYWJsZWRFeHAuc2V0VmFsKHRhc2tSZWYsIHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfRFZQT1M6XHJcbiAgICAgICAgICBsZXQgaTogbnVtYmVyID0gdmFsdWVTdHIuaW5kZXhPZihcIixcIik7XHJcbiAgICAgICAgICBpZiAoaSA+IC0xKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2R2TGVuID0gWG1sUGFyc2VyLmdldEludCh2YWx1ZVN0ci5zdWJzdHIoMCwgaSkpO1xyXG4gICAgICAgICAgICB0aGlzLl9kdlBvcyA9IFhtbFBhcnNlci5nZXRJbnQodmFsdWVTdHIuc3Vic3RyKGkgKyAxKSk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGZsZElkeDogbnVtYmVyID0gdGhpcy5fZHZQb3M7IGZsZElkeCA8IHRoaXMuX2R2UG9zICsgdGhpcy5fZHZMZW47IGZsZElkeCsrKSB7XHJcbiAgICAgICAgICAgICAgbGV0IGZpZWxkOiBGaWVsZEJhc2UgPSAoPEZpZWxkQmFzZT50aGlzLl90YXNrLkRhdGFWaWV3LmdldEZpZWxkKGZsZElkeCkpO1xyXG4gICAgICAgICAgICAgIGZpZWxkLklzRXZlbnRIYW5kbGVyRmllbGQgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0hBTkRMRVJfT05GT1JNOlxyXG4gICAgICAgICAgdGhpcy5faXNIYW5kbGVyT25Gb3JtID0gWG1sUGFyc2VyLmdldEJvb2xlYW4odmFsdWVTdHIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coXCJUaGVyZSBpcyBubyBzdWNoIHRhZyBpbiBFdmVudEhhbmRsZXIgY2xhc3MuIEluc2VydCBjYXNlIHRvIEV2ZW50SGFuZGxlci5pbml0RWxlbWVudHMgZm9yIFwiICsgYXR0cmlidXRlKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBjYWxjdWxhdGUgdGhlIGN0cmwgcHJvcGVydHkgZnJvbSBjdHJsIG5hbWUgcHJvcGVydHlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRhc2tSZWZcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInZhbHVlU3RyaW5nQ3RybE5hbWVcIj48L3BhcmFtPlxyXG5cclxuICBjYWxjdWxhdGVDdHJsRnJvbUNvbnRyb2xOYW1lKHRhc2tSZWY6IFRhc2spOiB2b2lkIHtcclxuICAgIGlmICghTlN0cmluZy5Jc051bGxPckVtcHR5KHRoaXMuX2N0cmxOYW1lKSkge1xyXG4gICAgICB0aGlzLl9jdHJsID0gKCh0YXNrUmVmLmdldEZvcm0oKSAhPT0gbnVsbCkgPyAoPE1nRm9ybT50YXNrUmVmLmdldEZvcm0oKSkuZ2V0Q3RybEJ5Q3RybE5hbWUodGhpcy5fY3RybE5hbWUpIDogbnVsbCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2hlY2sgaWYgdGhpcyBldmVudCBoYW5kbGVyIGlzIGEgc3BlY2lmaWMgaGFuZGxlciBvZiBhbiBldmVudFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJydEV2dFwiPnRoZSBldmVudCB0byBjaGVjazwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBib29sZWFuIHRydWUgaWYgdGhlIGV2ZW50cyBtYXRjaDwvcmV0dXJucz5cclxuICBpc1NwZWNpZmljSGFuZGxlck9mKHJ0RXZ0OiBSdW5UaW1lRXZlbnQpOiBib29sZWFuIHtcclxuXHJcbiAgICBpZiAodGhpcy5fY3RybCA9PT0gbnVsbCAmJiB0aGlzLl9jdHJsTmFtZSA9PT0gbnVsbCAmJiB0aGlzLl9oYW5kbGVyRmxkID09PSBudWxsICYmICF0aGlzLl9pc0hhbmRsZXJPbkZvcm0pXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAvLyBjaGVjayB0aGUgdmFsaWRpdHkgb2YgdGhlIHNjb3BlXHJcbiAgICBpZiAodGhpcy5fc2NvcGUgPT09IEJya1Njb3BlLlRhc2sgJiYgdGhpcy5fdGFzayAhPT0gcnRFdnQuZ2V0VGFzaygpKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgLy8gaWYgdGhlIGhhbmRsZXJzIGV2ZW50IGFuZCB0aGUgY2hlY2tlZCBldmVudCBhcmUgZXF1YWwgYW5kXHJcbiAgICAvLyB0aGUgaGFuZGxlciBoYW5kbGVzIHRoZSBjb250cm9sIGF0dGFjaGVkIHRvIHRoZSBjaGVja2VkIGV2ZW50LCByZXR1cm4gdHJ1ZVxyXG4gICAgLy8gY29tcGFyZSBjb250cm9sIG5hbWUgd2l0aCB0aGUgbmFtZSBvZiB0aGUgY29udHJvbCBpbiB0aGUgZXZlbnRcclxuICAgIGlmICh0aGlzLl9ldnQuZXF1YWxzKHJ0RXZ0KSkge1xyXG4gICAgICAvLyBWYXJpYWJsZSBjaGFuZ2UgaGFuZGxlcnMgZG8gbm90IGhhdmUgY29udHJvbCBuYW1lcy4gT25seSBmaWVsZHMgbmVlZCB0byBiZSBjb21wYXJlZFxyXG4gICAgICBpZiAodGhpcy5faGFuZGxlckZsZCAhPT0gbnVsbCkge1xyXG4gICAgICAgIHJldHVybiAodGhpcy5faGFuZGxlckZsZCA9PT0gcnRFdnQuZ2V0RmxkKCkpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChydEV2dC5Db250cm9sICE9PSBudWxsICYmICF0aGlzLl9pc0hhbmRsZXJPbkZvcm0pIHtcclxuICAgICAgICBsZXQgZXZlbnRDdHJsTmFtZTogc3RyaW5nID0gcnRFdnQuQ29udHJvbC5nZXRDb250cm9sTmFtZUZvckhhbmRsZXJTZWFyY2goKTtcclxuICAgICAgICBpZiAoZXZlbnRDdHJsTmFtZSAhPT0gbnVsbCAmJiB0aGlzLl9jdHJsTmFtZS50b0xvd2VyQ2FzZSgpID09PSBldmVudEN0cmxOYW1lLnRvTG93ZXJDYXNlKCkpXHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmIChydEV2dC5Db250cm9sID09PSBudWxsICYmIHRoaXMuX2lzSGFuZGxlck9uRm9ybSlcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2hlY2sgaWYgdGhpcyBldmVudCBoYW5kbGVyIGlzIGEgbm9uLXNwZWNpZmljIG9yIGdsb2JhbCBoYW5kbGVyIG9mIGFuIGV2ZW50XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJ0RXZ0XCI+dGhlIGV2ZW50IHRvIGNoZWNrXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBib29sZWFuIHRydWUgaWYgdGhlIGV2ZW50cyBtYXRjaFxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgaXNOb25TcGVjaWZpY0hhbmRsZXJPZihydEV2dDogUnVuVGltZUV2ZW50KTogYm9vbGVhbiB7XHJcblxyXG4gICAgLy8gaWYgdGhlIGhhbmRsZXIgaGFuZGxlcyBhIGNvbnRyb2wgcmV0dXJuIGZhbHNlXHJcbiAgICBpZiAodGhpcy5fY3RybCAhPT0gbnVsbCB8fCB0aGlzLl9jdHJsTmFtZSAhPT0gbnVsbCB8fCB0aGlzLl9oYW5kbGVyRmxkICE9PSBudWxsIHx8IHRoaXMuX2lzSGFuZGxlck9uRm9ybSlcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgLy8gY2hlY2sgdGhlIHZhbGlkaXR5IG9mIHRoZSBzY29wZVxyXG4gICAgaWYgKHRoaXMuX3Njb3BlID09PSBCcmtTY29wZS5UYXNrICYmICB0aGlzLl90YXNrICE9PSBydEV2dC5nZXRUYXNrKCkgJiYgcnRFdnQuZ2V0VHlwZSgpICE9PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX1RJTUVSKVxyXG4gIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBpZiAodGhpcy5fc2NvcGUgPT09IEJya1Njb3BlLkdsb2JhbCAmJiB0aGlzLl90YXNrICE9PSBydEV2dC5nZXRUYXNrKCkpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAvLyBpZiB0aGUgaGFuZGxlcnMgZXZlbnQgYW5kIHRoZSBjaGVja2VkIGV2ZW50IGFyZSBlcXVhbCByZXR1cm4gdHJ1ZVxyXG4gICAgaWYgKHRoaXMuX2V2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfVVNFUiAmJiB0aGlzLl9ldnQuZ2V0VXNlckV2ZW50VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX05PVElOSVRFRCkge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIHRoaXMuX2V2dC5maW5kVXNlckV2ZW50KCk7XHJcbiAgICAgIH1cclxuICAgICAgY2F0Y2ggKGFwcGxpY2F0aW9uRXhjZXB0aW9uKSB7XHJcbiAgICAgICAgaWYgKGFwcGxpY2F0aW9uRXhjZXB0aW9uIGluc3RhbmNlb2YgQXBwbGljYXRpb25FeGNlcHRpb24pIHtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgdGhyb3cgYXBwbGljYXRpb25FeGNlcHRpb247XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLl9ldnQuZXF1YWxzKHJ0RXZ0KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjaGVjayBpZiB0aGlzIGV2ZW50IGhhbmRsZXIgaXMgYSBnbG9iYWwgaGFuZGxlciBvZiBhbiBldmVudFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJydEV2dFwiPnRoZSBldmVudCB0byBjaGVja1xyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gYm9vbGVhbiB0cnVlIGlmIHRoZSBldmVudHMgbWF0Y2hcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIGlzR2xvYmFsSGFuZGxlck9mKHJ0RXZ0OiBSdW5UaW1lRXZlbnQpOiBib29sZWFuIHtcclxuICAgIC8vIGNoZWNrIHRoZSB2YWxpZGl0eSBvZiB0aGUgc2NvcGVcclxuICAgIGlmICh0aGlzLl9zY29wZSAhPT0gQnJrU2NvcGUuR2xvYmFsKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgLy8gaWYgdGhlIGhhbmRsZXIgaGFuZGxlcyBhIGNvbnRyb2wgcmV0dXJuIGZhbHNlXHJcbiAgICBpZiAodGhpcy5fY3RybCAhPSBudWxsIHx8IHRoaXMuX2N0cmxOYW1lICE9IG51bGwgfHwgdGhpcy5faGFuZGxlckZsZCAhPSBudWxsIHx8IHRoaXMuX2lzSGFuZGxlck9uRm9ybSlcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIC8vIGlmIHRoZSBoYW5kbGVycyBldmVudCBhbmQgdGhlIGNoZWNrZWQgZXZlbnQgYXJlIGVxdWFsLCByZXR1cm4gdHJ1ZVxyXG4gICAgcmV0dXJuIHRoaXMuX2V2dC5lcXVhbHMocnRFdnQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNoZWNrIGlmIHRoaXMgZXZlbnQgaGFuZGxlciBpcyBhIHNwZWNpZmljIGdsb2JhbCBoYW5kbGVyIG9mIGFuIGV2ZW50XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJ0RXZ0XCI+dGhlIGV2ZW50IHRvIGNoZWNrXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBib29sZWFuIHRydWUgaWYgdGhlIGV2ZW50cyBtYXRjaFxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgaXNHbG9iYWxTcGVjaWZpY0hhbmRsZXJPZihydEV2dDogUnVuVGltZUV2ZW50KTogYm9vbGVhbiB7XHJcbiAgICAvLyBjaGVjayB0aGUgdmFsaWRpdHkgb2YgdGhlIHNjb3BlXHJcbiAgICBpZiAodGhpcy5fc2NvcGUgIT09IEJya1Njb3BlLkdsb2JhbClcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIGlmICh0aGlzLl9jdHJsID09IG51bGwgJiYgdGhpcy5fY3RybE5hbWUgPT0gbnVsbCAmJiB0aGlzLl9oYW5kbGVyRmxkID09IG51bGwpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAvLyBpZiB0aGUgaGFuZGxlcnMgZXZlbnQgYW5kIHRoZSBjaGVja2VkIGV2ZW50IGFyZSBlcXVhbCwgcmV0dXJuIHRydWVcclxuICAgIHJldHVybiAodGhpcy5fY3RybE5hbWUgIT0gbnVsbCAmJiB0aGlzLl9ldnQuZXF1YWxzKHJ0RXZ0KSAmJlxyXG4gICAgICBOU3RyaW5nLkVxdWFscyh0aGlzLl9jdHJsTmFtZSwgcnRFdnQuQ29udHJvbC5OYW1lLCB0cnVlKSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZXhlY3V0ZSB0aGUgZXZlbnQgaGFuZGxlclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJydEV2dFwiPnRoZSBldmVudCBvbiB3aGljaCB0aGUgaGFuZGxlciBpcyBleGVjdXRlZFxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicmV0dXJuZWRGcm9tU2VydmVyXCI+aW5kaWNhdGVzIHdoZXRoZXIgd2UgcmV0dXJuZWQgZnJvbSB0aGUgc2VydmVyIGFuZFxyXG4gIC8vLyAgIHRoZXJlZm9yZSBtaWdodCBub3QgbmVlZCB0byBjaGVjayB0aGUgZW5hYmxlZCBjb25kaXRpb25cclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImVuYWJsZWRDbmRDaGVja2VkQW5kVHJ1ZVwiPmluZGljYXRlcyB0aGF0IHRoZSBlbmFibGVkIGNvbmRpdGlvbiB3YXMgYWxyZWFkeSBjaGVja2VkIGFuZCB0aGVyZSdzIG5vXHJcbiAgLy8vICAgbmVlZCB0byByZS1jaGVjayBpdCAoYmVjYXVzZSBpdCBtaWdodCBiZSBmYWxzZSBub3csIGJ1dCB3ZSBzdGlsbCBuZWVkIHRvXHJcbiAgLy8vICAgZXhlY3V0ZSB0aGUgaGFuZGxlcilcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IGJvb2xlYW4gdGhpcyBpcyB0aGUgcmV0dXJuIGNvZGUgb2YgdGhlIGhhbmRsZXIsIGlmIHRydWUgdGhlbiB0aGUgZXZlbnRzXHJcbiAgLy8vICAgbWFuYWdlciBtdXN0IGNvbnRpbnVlIHNlYXJjaGluZyBmb3IgdGhlIG5leHQgZXZlbnQgaGFuZGxlciBmb3IgdGhlIGV2ZW50XHJcbiAgLy8vIDwvcmV0dXJucz5cclxuIGFzeW5jIGV4ZWN1dGUocnRFdnQ6IFJ1blRpbWVFdmVudCwgcmV0dXJuZWRGcm9tU2VydmVyOiBib29sZWFuLCBlbmFibGVkQ25kQ2hlY2tlZEFuZFRydWU6IGJvb2xlYW4pOiBQcm9taXNlPFJldFZhbHM+IHtcclxuXHJcbiAgICBsZXQgY3RybDogTWdDb250cm9sID0gbnVsbDtcclxuICAgIGxldCByZXRWYWw6IGJvb2xlYW47XHJcbiAgICBsZXQgZGVwdGg6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgdGFza0VuZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IGJya0xldmVsOiBzdHJpbmcgPSB0aGlzLl90YXNrLmdldEJya0xldmVsKCk7XHJcbiAgICBsZXQgYnJrTGV2ZWxJbmRleDogbnVtYmVyID0gdGhpcy5fdGFzay5nZXRCcmtMZXZlbEluZGV4KCk7XHJcbiAgICBsZXQgaW5pdGlhbExvb3BTdGFja1NpemU6IG51bWJlciA9IDA7XHJcblxyXG4gICAgLy8gc2V0IGxldmVsIGZvciBMRVZFTCBmdW5jdGlvblxyXG4gICAgaWYgKHRhc2tFbmQgIT09IG51bGwgJiYgdGhpcy5fZXZ0LmdldFR5cGUoKSAhPT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9FWFBSRVNTSU9OICYmICh0aGlzLl9ldnQuZ2V0VHlwZSgpICE9PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX1VTRVIgfHwgKHRoaXMuX2V2dC5nZXRVc2VyRXZlbnQoKS5nZXRUeXBlKCkgIT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfRVhQUkVTU0lPTiAmJiB0aGlzLl9ldnQuZ2V0VXNlckV2ZW50KCkuZ2V0VHlwZSgpICE9PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX1RJTUVSKSkpIHtcclxuICAgICAgLy8gVW5saWtlIGEgaGFuZGxlciwgdGhlIHVzZXIgZnVuY3Rpb24gc2hvdWxkIG5vdCBjaGFuZ2UgdGhlIGxldmVsIG9mIHRoZSB0YXNrLlxyXG4gICAgICBpZiAodGhpcy5fZXZ0LmdldFR5cGUoKSAhPT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9VU0VSX0ZVTkMpXHJcbiAgICAgICAgdGhpcy5fdGFzay5zZXRCcmtMZXZlbChydEV2dC5nZXRCcmtMZXZlbCgpLCB0aGlzLl9pZCk7XHJcblxyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLl90YXNrLnNldEJya0xldmVsKHRoaXMuX2V2dC5nZXRCcmtMZXZlbCgpLCB0aGlzLl9pZCk7XHJcblxyXG4gICAgbGV0IGFyZ3M6IEFyZ3VtZW50c0xpc3QgPSBydEV2dC5nZXRBcmdMaXN0KCk7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgbGV0IGZsb3dNb25pdG9yOiBGbG93TW9uaXRvclF1ZXVlID0gRmxvd01vbml0b3JRdWV1ZS5JbnN0YW5jZTtcclxuXHJcbiAgICAgIC8vIFJvdXRlIGV2ZW50IGNhbiBvbmx5IGJlIGhhbmRsZWQgaW4gYSB0YXNrIHdoaWNoIGlzIG9wZW5lZCBhcyByb3V0ZXIgbGluayBvciB0aGUgcm9vdCB0YXNrLlxyXG4gICAgICBpZiAocnRFdnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0lOVEVSTkFMICYmIHJ0RXZ0LmdldEludGVybmFsQ29kZSgpID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfV0VCQ0xJRU5UX1JPVVRFKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl90YXNrLklzUm91dGUoKSAmJiB0aGlzLl90YXNrICE9PSBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuU3RhcnR1cE1nRGF0YS5nZXRGaXJzdFRhc2soKSkge1xyXG4gICAgICAgICAgcmV0dXJuIG5ldyBSZXRWYWxzKHRydWUsIHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gY2hlY2sgaWYgdGhlIGhhbmRsZXIgaXMgZW5hYmxlZC4gaWYgbm90LCByZXR1cm4gdHJ1ZSB0byBjb250aW51ZSBzZWFyY2hpbmdcclxuICAgICAgLy8gZm9yIHRoZSBuZXh0IGV2ZW50IGhhbmRsZXJcclxuICAgICAgbGV0IG5leHRPcGVySWR4OiBudW1iZXIgPSAtMTtcclxuICAgICAgaWYgKHJldHVybmVkRnJvbVNlcnZlcikge1xyXG4gICAgICAgIC8vIGlmIHdlIHJldHVybmVkIGZyb20gdGhlIHNlcnZlciAtIHdlIG5lZWQgdG8gY2hlY2sgaWYgdGhlIG5leHQgb3BlcmF0aW9uIGlzIG9uIHRoZSBjdXJyZW50XHJcbiAgICAgICAgLy8gaGFuZGxlciAodXNpbmcgYSBjYWxsIHRvIGdldE5leHRPcGVySWR4KCkgd2l0aCBmYWxzZSBpbiB0aGUgY2xlYXJXaGVuRm91bmQgcGFyYW1ldGVyKVxyXG4gICAgICAgIC8vIGFuZCBpZiBpdCBpcyAtIGRvIG5vdCBjaGVjayB0aGUgZW5hYmxlZCBjb25kaXRpb24sIGJlY2F1c2UgaXQgbWlnaHQgaGF2ZSBjaGFuZ2VkXHJcbiAgICAgICAgLy8gc2luY2UgaXQgd2FzIGV2YWx1YXRlZCBvbiB0aGUgc2VydmVyLiB3ZSBuZWVkIHRvIGdvIGludG8gdGhpcyBoYW5kbGVyIGV2ZW4gaWYgaXQgaXMgbm90XHJcbiAgICAgICAgLy8gY3VycmVudGx5IGVuYWJsZWRcclxuICAgICAgICBuZXh0T3BlcklkeCA9IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmdldE5leHRPcGVySWR4KHRoaXMuX29wZXJhdGlvblRhYi5nZXRPcGVyYXRpb24oMCksIGZhbHNlKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAobmV4dE9wZXJJZHggPT09IC0xICYmICFlbmFibGVkQ25kQ2hlY2tlZEFuZFRydWUgJiYgIWF3YWl0IHRoaXMuaXNFbmFibGVkKCkpXHJcbiAgICAgICAgcmV0dXJuIG5ldyBSZXRWYWxzKHRydWUsIGZhbHNlKTtcclxuXHJcbiAgICAgIC8vIGNoZWNrIHRoZSBzY29wZSBmb3IgRXhwcmVzc2lvbiBhbmQgVGltZXIgaGFuZGxlcnNcclxuICAgICAgaWYgKHRoaXMuX3Njb3BlID09PSBCcmtTY29wZS5UYXNrICYmIChydEV2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfVElNRVIgfHwgcnRFdnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0VYUFJFU1NJT04pKSB7XHJcbiAgICAgICAgbGV0IGN1cnJUYXNrOiBUYXNrID0gTGFzdEZvY3VzZWRNYW5hZ2VyLkluc3RhbmNlLmdldExhc3RGb2N1c2VkVGFzaygpO1xyXG4gICAgICAgIGlmICh0aGlzLl90YXNrICE9PSBjdXJyVGFzaylcclxuICAgICAgICAgIHJldHVybiBuZXcgUmV0VmFscyh0cnVlLCB0cnVlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCF0aGlzLl9oYW5kbGVkQnlDbGllbnQpIHtcclxuICAgICAgICAvLyByZXR1cm4gZmFsc2UgdG8gc3RvcCBzZWFyY2hpbmcgZm9yIHRoZSBtb3JlIGhhbmRsZXJzIGJlY2F1c2VcclxuICAgICAgICAvLyB0aGUgc2VydmVyIGhhZCB0YWtlbiBjYXJlIG9mIGFsbCBvZiB0aGVtXHJcbiAgICAgICAgcmV0dXJuIG5ldyBSZXRWYWxzKGZhbHNlLCB0cnVlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHJ0RXZ0LmdldFR5cGUoKSAhPT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9VU0VSICYmICFhd2FpdCB0aGlzLl9ldnQuZGF0YUV2ZW50SXNUcnVlKCkpXHJcbiAgICAgICAgcmV0dXJuIG5ldyBSZXRWYWxzKGZhbHNlLCB0cnVlKTtcclxuXHJcbiAgICAgIGlmIChydEV2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfSU5URVJOQUwgJiYgcnRFdnQuZ2V0SW50ZXJuYWxDb2RlKCkgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQVNLX1NVRkZJWClcclxuICAgICAgICB0YXNrRW5kID0gdHJ1ZTtcclxuXHJcbiAgICAgIGlmIChydEV2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfSU5URVJOQUwpIHtcclxuICAgICAgICBzd2l0Y2ggKHJ0RXZ0LmdldEludGVybmFsQ29kZSgpKSB7XHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYOlxyXG4gICAgICAgICAgICBmbG93TW9uaXRvci5hZGRUYXNrRmxvd1JlYyhJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCwgRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX1NUQVJULCAgdGhpcy5fdGFzay5HZXRUYXNrRGV0YWlscygpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYOlxyXG4gICAgICAgICAgICBmbG93TW9uaXRvci5hZGRUYXNrRmxvd1JlYyhJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCwgRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX1NUQVJULCAgdGhpcy5fdGFzay5HZXRUYXNrRGV0YWlscygpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9TVUZGSVg6XHJcbiAgICAgICAgICAgIGZsb3dNb25pdG9yLmFkZFRhc2tGbG93Q3RybChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9TVUZGSVgsIHJ0RXZ0LkNvbnRyb2wuTmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9TVEFSVCwgIHRoaXMuX3Rhc2suR2V0VGFza0RldGFpbHMoKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfUFJFRklYOlxyXG4gICAgICAgICAgICBmbG93TW9uaXRvci5hZGRUYXNrRmxvd0N0cmwoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfUFJFRklYLCBydEV2dC5Db250cm9sLk5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbG93TW9uaXRvckludGVyZmFjZS5GTFdNVFJfU1RBUlQsICB0aGlzLl90YXNrLkdldFRhc2tEZXRhaWxzKCkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9WQVJJQUJMRTpcclxuICAgICAgICAgICAgZmxvd01vbml0b3IuYWRkVGFza0Zsb3dGbGQoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1ZBUklBQkxFLCBydEV2dC5nZXRGbGQoKS5nZXROYW1lKCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9TVEFSVCwgIHRoaXMuX3Rhc2suR2V0VGFza0RldGFpbHMoKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfVkVSSUZJQ0FUSU9OOlxyXG4gICAgICAgICAgICBmbG93TW9uaXRvci5hZGRUYXNrRmxvd0N0cmwoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfVkVSSUZJQ0FUSU9OLFxyXG4gICAgICAgICAgICAgIHJ0RXZ0LkNvbnRyb2wuTmFtZSwgRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX1NUQVJULCB0aGlzLl90YXNrLkdldFRhc2tEZXRhaWxzKCkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQVNLX1BSRUZJWDpcclxuICAgICAgICAgICAgZmxvd01vbml0b3IuYWRkVGFza0Zsb3dSZWMoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RBU0tfUFJFRklYLCBGbG93TW9uaXRvckludGVyZmFjZS5GTFdNVFJfU1RBUlQsICB0aGlzLl90YXNrLkdldFRhc2tEZXRhaWxzKCkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQVNLX1NVRkZJWDpcclxuICAgICAgICAgICAgZmxvd01vbml0b3IuYWRkVGFza0Zsb3dSZWMoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RBU0tfU1VGRklYLCBGbG93TW9uaXRvckludGVyZmFjZS5GTFdNVFJfU1RBUlQsIHRoaXMuX3Rhc2suR2V0VGFza0RldGFpbHMoKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIGZsb3dNb25pdG9yLmFkZFRhc2tGbG93SGFuZGxlcih0aGlzLl9ldnQuZ2V0QnJrTGV2ZWwodHJ1ZSksIEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9TVEFSVCwgdGhpcy5fdGFzay5HZXRUYXNrRGV0YWlscygpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBmbG93TW9uaXRvci5hZGRUYXNrRmxvd0hhbmRsZXIodGhpcy5fZXZ0LmdldEJya0xldmVsKHRydWUpLCBGbG93TW9uaXRvckludGVyZmFjZS5GTFdNVFJfU1RBUlQsIHRoaXMuX3Rhc2suR2V0VGFza0RldGFpbHMoKSk7XHJcblxyXG4gICAgICB0cnkge1xyXG5cclxuICAgICAgICBpZiAodGFza0VuZCAhPT0gbnVsbClcclxuICAgICAgICAgIGN0cmwgPSA8TWdDb250cm9sPnJ0RXZ0LkNvbnRyb2w7XHJcblxyXG4gICAgICAgIGxldCBtZ2RJRDogbnVtYmVyID0gQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLmN1cnJNZ2RJRDtcclxuICAgICAgICBsZXQgaXNDaGFuZ2VkQ3VyclduZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgIGxldCBpc0NoYW5nZWRDdXJyV25kUmVmOiBSZWZQYXJhbTxib29sZWFuPiA9IG5ldyBSZWZQYXJhbShpc0NoYW5nZWRDdXJyV25kKTtcclxuXHJcblxyXG4gICAgICAgIC8vIGZvciB0aW1lciBldmVudHMgY2hlY2sgaWYgdGhlIHRhc2sgb2YgdGhlIGV2ZW50IGlzIGluIHRoZVxyXG4gICAgICAgIC8vIGN1cnJlbnQgd2luZG93IGFuZCBpZiBub3QgdGhlbiBjaGFuZ2UgdGhlIGN1cnJlbnQgd2luZG93XHJcbiAgICAgICAgLy8gdGVtcG9yYXJpbHkgdGlsbCB0aGUgaGFuZGxlciBmaW5pc2hlc1xyXG4gICAgICAgIGlmICh0aGlzLl9ldnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX1RJTUVSICYmIG1nZElEICE9PSBydEV2dC5nZXRNZ2RJRCgpKSB7XHJcbiAgICAgICAgICAvLyBzZXQgbnVtYmVyIG9mIHdpbmRvdyBmb3IgdGltZXIgZXZlbnRcclxuICAgICAgICAgIEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5jdXJyTWdkSUQgPSBydEV2dC5nZXRNZ2RJRCgpO1xyXG4gICAgICAgICAgaXNDaGFuZ2VkQ3VyclduZFJlZi52YWx1ZSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBwdXQgaW5pdGlhbCB2YWx1ZXMgdG8gdGhlIGxvY2FsIHZhcmlhYmxlc1xyXG4gICAgICAgIGF3YWl0IHRoaXMucmVzZXRMb2NhbFZhcmlhYmxlcyhhcmdzKTtcclxuXHJcbiAgICAgICAgaW5pdGlhbExvb3BTdGFja1NpemUgPSB0aGlzLl90YXNrLmdldExvb3BTdGFja1NpemUoKTtcclxuICAgICAgICBsZXQgcmV0VmFsczogUmV0VmFscyA9IG51bGw7XHJcbiAgICAgICAgaWYgKHRoaXMuX29wZXJhdGlvblRhYi5nZXRTaXplKCkgPiAwKVxyXG4gICAgICAgICAgcmV0VmFscyA9IGF3YWl0IHRoaXMuZXhlY3V0ZU9wZXJhdGlvbnMoMCwgdGhpcy5fb3BlcmF0aW9uVGFiLmdldFNpemUoKSAtIDEsIHRhc2tFbmQsIG1nZElELCBkZXB0aCwgaXNDaGFuZ2VkQ3VyclduZFJlZiwgZmFsc2UsIGZhbHNlLCAtMSk7XHJcblxyXG4gICAgICAgIGlzQ2hhbmdlZEN1cnJXbmQgPSBpc0NoYW5nZWRDdXJyV25kUmVmLnZhbHVlO1xyXG5cclxuICAgICAgICBpZiAocmV0VmFscyAhPT0gbnVsbClcclxuICAgICAgICAgIHJldHVybiByZXRWYWxzO1xyXG5cclxuICAgICAgICAvLyBjaGVjayB0aGUgZW5kdGFzayBjb25kaXRpb24gb25jZSBhZ2FpbiBhdCB0aGUgZW5kIG9mIHRoZSBoYW5kbGVyXHJcbiAgICAgICAgaWYgKCF0YXNrRW5kKVxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5fdGFzay5ldmFsRW5kQ29uZChDb25zdEludGVyZmFjZS5FTkRfQ09ORF9FVkFMX0lNTUlESUFURSk7XHJcblxyXG4gICAgICAgIC8vIGNoYW5nZSBjdXJyZW50IHdpbmRvdyBiYWNrIGlmIGl0IHdhcyBjaGFuZ2VkIGZvciBUaW1lclxyXG4gICAgICAgIGlmIChpc0NoYW5nZWRDdXJyV25kKSB7XHJcbiAgICAgICAgICBsZXQgb2xkTWdkOiBNR0RhdGEgPSBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuZ2V0TUdEYXRhKG1nZElEKTtcclxuICAgICAgICAgIGlmIChvbGRNZ2QgIT09IG51bGwgJiYgIW9sZE1nZC5Jc0Fib3J0aW5nKVxyXG4gICAgICAgICAgICBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuY3Vyck1nZElEID0gbWdkSUQ7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIC8vIGVuZCB3aGlsZSBvcGVyYXRpb24gYmxvY2tcclxuICAgICAgY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgU2VydmVyRXJyb3IpIHtcclxuICAgICAgICAgIGlmIChMb2dnZXIuSW5zdGFuY2UuTG9nTGV2ZWwgIT09IExvZ2dlcl9Mb2dMZXZlbHMuQmFzaWMpXHJcbiAgICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nKGV4KTtcclxuICAgICAgICAgIHRocm93IGV4O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChleCBpbnN0YW5jZW9mIEV4Y2VwdGlvbikge1xyXG4gICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2coZXgpO1xyXG4gICAgICAgICAgcmV0dXJuIG5ldyBSZXRWYWxzKGZhbHNlLCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgdGhyb3cgZXg7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZpbmFsbHkge1xyXG4gICAgICAgIC8vIGdldCB0aGUgcHJvcGFnYXRlIHZhbHVlXHJcbiAgICAgICAgcmV0VmFsID0gYXdhaXQgdGhpcy5fcHJvcGFnYXRlRXhwLmdldFZhbCgpO1xyXG5cclxuICAgICAgICAvLyByZW1vdmUgbG9vcCBjb3VudGVycyB0aGF0IHdlcmUgbGVmdCB1bnVzZWQgaW4gdGhlIHN0YWNrIGR1ZSB0byBsZWF2aW5nXHJcbiAgICAgICAgLy8gdGhlIGhhbmRsZXIgb24gXCJzdG9wRXhlY3V0aW9uKCkgPT0gdHJ1ZVwiXHJcbiAgICAgICAgbGV0IGN1cnJMb29wU3RhY2tTaXplOiBudW1iZXIgPSB0aGlzLl90YXNrLmdldExvb3BTdGFja1NpemUoKTtcclxuICAgICAgICBmb3IgKDsgY3Vyckxvb3BTdGFja1NpemUgPiBpbml0aWFsTG9vcFN0YWNrU2l6ZTsgY3Vyckxvb3BTdGFja1NpemUgPSBjdXJyTG9vcFN0YWNrU2l6ZS0tKVxyXG4gICAgICAgICAgdGhpcy5fdGFzay5wb3BMb29wQ291bnRlcigpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBhZnRlciBleGVjdXRpbmcgdGhlIG9wZXJhdGlvbnMgdXBkYXRlIHRoZSBhcmd1bWVudHMgYmFjayBhbmQgcmVjb21wdXRlXHJcbiAgICAgIGlmIChhcmdzICE9PSBudWxsKVxyXG4gICAgICAgIGF3YWl0IHRoaXMuZ2V0QXJnVmFsc0Zyb21GbGRzKGFyZ3MpO1xyXG5cclxuICAgICAgaWYgKHJ0RXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9JTlRFUk5BTCkge1xyXG4gICAgICAgIHN3aXRjaCAocnRFdnQuZ2V0SW50ZXJuYWxDb2RlKCkpIHtcclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVg6XHJcbiAgICAgICAgICAgIGZsb3dNb25pdG9yLmFkZFRhc2tGbG93UmVjKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYLCBGbG93TW9uaXRvckludGVyZmFjZS5GTFdNVFJfRU5ELCB0aGlzLl90YXNrLkdldFRhc2tEZXRhaWxzKCkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYOlxyXG4gICAgICAgICAgICBmbG93TW9uaXRvci5hZGRUYXNrRmxvd1JlYyhJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCwgRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX0VORCwgdGhpcy5fdGFzay5HZXRUYXNrRGV0YWlscygpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEFTS19QUkVGSVg6XHJcbiAgICAgICAgICAgIGZsb3dNb25pdG9yLmFkZFRhc2tGbG93UmVjKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQVNLX1BSRUZJWCwgRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX0VORCwgdGhpcy5fdGFzay5HZXRUYXNrRGV0YWlscygpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEFTS19TVUZGSVg6XHJcbiAgICAgICAgICAgIGZsb3dNb25pdG9yLmFkZFRhc2tGbG93UmVjKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQVNLX1NVRkZJWCwgRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX0VORCwgdGhpcy5fdGFzay5HZXRUYXNrRGV0YWlscygpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9TVUZGSVg6XHJcbiAgICAgICAgICAgIGZsb3dNb25pdG9yLmFkZFRhc2tGbG93Q3RybChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9TVUZGSVgsIGN0cmwuTmFtZSwgRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX0VORCwgdGhpcy5fdGFzay5HZXRUYXNrRGV0YWlscygpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9QUkVGSVg6XHJcbiAgICAgICAgICAgIGZsb3dNb25pdG9yLmFkZFRhc2tGbG93Q3RybChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9QUkVGSVgsIGN0cmwuTmFtZSwgRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX0VORCwgdGhpcy5fdGFzay5HZXRUYXNrRGV0YWlscygpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVkFSSUFCTEU6XHJcbiAgICAgICAgICAgIGZsb3dNb25pdG9yLmFkZFRhc2tGbG93RmxkKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9WQVJJQUJMRSwgcnRFdnQuZ2V0RmxkKCkuZ2V0TmFtZSgpLCBGbG93TW9uaXRvckludGVyZmFjZS5GTFdNVFJfRU5ELCB0aGlzLl90YXNrLkdldFRhc2tEZXRhaWxzKCkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1ZFUklGSUNBVElPTjpcclxuICAgICAgICAgICAgZmxvd01vbml0b3IuYWRkVGFza0Zsb3dDdHJsKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1ZFUklGSUNBVElPTiwgY3RybC5OYW1lLCBGbG93TW9uaXRvckludGVyZmFjZS5GTFdNVFJfRU5ELCB0aGlzLl90YXNrLkdldFRhc2tEZXRhaWxzKCkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICBmbG93TW9uaXRvci5hZGRUYXNrRmxvd0hhbmRsZXIodGhpcy5fZXZ0LmdldEJya0xldmVsKHRydWUpLCBGbG93TW9uaXRvckludGVyZmFjZS5GTFdNVFJfRU5ELCB0aGlzLl90YXNrLkdldFRhc2tEZXRhaWxzKCkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZVxyXG4gICAgICAgIGZsb3dNb25pdG9yLmFkZFRhc2tGbG93SGFuZGxlcih0aGlzLl9ldnQuZ2V0QnJrTGV2ZWwodHJ1ZSksIDEsIHRoaXMuX3Rhc2suR2V0VGFza0RldGFpbHMoKSk7XHJcbiAgICB9XHJcbiAgICBmaW5hbGx5IHtcclxuICAgICAgLy8gcmVzdG9yaW5nICB0aGUgb3JpZ2luYWwgYnJlYWsgbGV2ZWwgc3RhdGUgYW5kIGN1cnJlbnQgZXhlY3V0aW5nIGNvbnRyb2wgaW5kZXhcclxuICAgICAgdGhpcy5fdGFzay5zZXRCcmtMZXZlbChicmtMZXZlbCwgYnJrTGV2ZWxJbmRleCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV3IFJldFZhbHMocmV0VmFsLCB0cnVlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBleGVjdXRlIHRoZSBvcGVyYXRpb25zIHN0YXJ0aW5nIGZyb20gZnJvbUlkeCBhbmQgZW5kaW5nIGF0IGVuZElkeC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgYXN5bmMgZXhlY3V0ZU9wZXJhdGlvbnMoZnJvbUlkeDogbnVtYmVyLCB0b0lkeDogbnVtYmVyLCB0YXNrRW5kOiBib29sZWFuLCBtZ2RJRDogbnVtYmVyLCBkZXB0aDogbnVtYmVyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNDaGFuZ2VkQ3VyclduZFJlZjogUmVmUGFyYW08Ym9vbGVhbj4sIGluQmxvY2tJZjogYm9vbGVhbiwgaW5SZXR1cm5lZEZyb21TZXJ2ZXI6IGJvb2xlYW4sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk5leHRPcGVySWR4OiBudW1iZXIpOiBQcm9taXNlIDxSZXRWYWxzPiB7XHJcbiAgICBsZXQgb3BlcjogT3BlcmF0aW9uO1xyXG4gICAgbGV0IG9wZXJUeXBlOiBudW1iZXI7XHJcbiAgICBsZXQgbmV4dE9wZXJJZHg6IG51bWJlciA9IC0xO1xyXG4gICAgbGV0IHJldHVybmVkRnJvbVNlcnZlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IG1nZDogTUdEYXRhID0gdGhpcy5fdGFzay5nZXRNR0RhdGEoKTtcclxuICAgIGxldCBleGVjRmxvd0lkeDogbnVtYmVyID0gZnJvbUlkeDtcclxuICAgIGxldCByZXR2YWxzOiBSZXRWYWxzO1xyXG4gICAgbGV0IGJsb2NrSWZSZXR1cm5lZEZyb21TZXJ2ZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBleGVjdXRlQmxvY2s6IGJvb2xlYW47XHJcbiAgICBsZXQgYmxvY2tMb29wRXhlY29uU2VydmVyOiBib29sZWFuO1xyXG4gICAgbGV0IGZsb3dNb25pdG9yOiBGbG93TW9uaXRvclF1ZXVlID0gRmxvd01vbml0b3JRdWV1ZS5JbnN0YW5jZTtcclxuICAgIGxldCByb3V0ZU9wZXJhdGlvbkV4ZWN1dGVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKCFpblJldHVybmVkRnJvbVNlcnZlcikge1xyXG4gICAgICAvLyB3ZSBuZWVkIHRvIGNoZWNrIGlmIHRoZSBzZXJ2ZXIgYWxyZWFkeSBzdGFydGVkIHJ1bm5pbmcgdGhpcyBoYW5kbGVyXHJcbiAgICAgIG9wZXIgPSB0aGlzLl9vcGVyYXRpb25UYWIuZ2V0T3BlcmF0aW9uKGV4ZWNGbG93SWR4KTtcclxuICAgICAgbmV4dE9wZXJJZHggPSBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5nZXROZXh0T3BlcklkeChvcGVyLCB0cnVlKTtcclxuICAgICAgaWYgKG5leHRPcGVySWR4ID4gLTEpIHtcclxuICAgICAgICByZXR1cm5lZEZyb21TZXJ2ZXIgPSB0cnVlO1xyXG4gICAgICAgIGlmIChpbkJsb2NrSWYpXHJcbiAgICAgICAgICBibG9ja0lmUmV0dXJuZWRGcm9tU2VydmVyID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHJldHVybmVkRnJvbVNlcnZlciA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHJldHVybmVkRnJvbVNlcnZlciA9IGluUmV0dXJuZWRGcm9tU2VydmVyO1xyXG4gICAgICBuZXh0T3BlcklkeCA9IGluTmV4dE9wZXJJZHg7XHJcbiAgICB9XHJcblxyXG4gICAgZm9yICg7IGV4ZWNGbG93SWR4IDw9IHRvSWR4ICYmXHJcbiAgICAgICAgICAgKCFBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKSAmJlxyXG4gICAgICAgICAgICFtZ2QuSXNBYm9ydGluZyAmJiAhcm91dGVPcGVyYXRpb25FeGVjdXRlZDtcclxuICAgICAgICAgICBleGVjRmxvd0lkeCArPSAxKSB7XHJcbiAgICAgIGlmIChpbkJsb2NrSWYgJiYgYmxvY2tJZlJldHVybmVkRnJvbVNlcnZlciAmJiB0aGlzLl9vcGVyYXRpb25UYWIuZ2V0T3BlcmF0aW9uKHRvSWR4KS5nZXRTZXJ2ZXJJZCgpIDwgbmV4dE9wZXJJZHgpXHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBvcGVyID0gdGhpcy5fb3BlcmF0aW9uVGFiLmdldE9wZXJhdGlvbihleGVjRmxvd0lkeCk7XHJcblxyXG4gICAgICBvcGVyVHlwZSA9IG9wZXIuZ2V0VHlwZSgpO1xyXG5cclxuICAgICAgYmxvY2tJZlJldHVybmVkRnJvbVNlcnZlciA9IGZhbHNlO1xyXG5cclxuICAgICAgLy8gSWYgRGVsYXlDb21tYW5kRXhlY3V0aW9uID0gdHJ1ZSwgaXQgbWVhbnMgd2UgYXJlIGhlcmUgVFMgb2YgY2xvc2luZyB0YXNrLlxyXG4gICAgICAvLyBTbywgc2V0IGZpcnN0IG9wZXJhdGlvbiBvZiBoYW5kbGVyIGFzIHNlcnZlci4gcmV0dXJuIGJhY2suXHJcbiAgICAgIGlmIChSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5HZXRJbnN0YW5jZSgpLkRlbGF5Q29tbWFuZEV4ZWN1dGlvbikge1xyXG4gICAgICAgIHRoaXMuX3Rhc2suc2V0VXNlTG9vcFN0YWNrKGRlcHRoID4gMCk7XHJcbiAgICAgICAgYXdhaXQgb3Blci5vcGVyU2VydmVyKG51bGwpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBza2lwIHRvIHRoZSBjb3JyZWN0IG9wZXJhdGlvbiBhZnRlciByZXR1cm5pbmcgZnJvbSB0aGUgc2VydmVyXHJcbiAgICAgIGlmIChyZXR1cm5lZEZyb21TZXJ2ZXIgJiYgb3Blci5nZXRTZXJ2ZXJJZCgpIDwgbmV4dE9wZXJJZHgpXHJcbiAgICAgICAgaWYgKG9wZXJUeXBlICE9PSBDb25zdEludGVyZmFjZS5NR19PUEVSX0JMT0NLKVxyXG4gICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5fb3BlcmF0aW9uVGFiLmdldE9wZXJhdGlvbihvcGVyLmdldEJsb2NrRW5kKCkpLmdldFNlcnZlcklkKCkgPCBuZXh0T3BlcklkeClcclxuICAgICAgICAgIGNvbnRpbnVlO1xyXG5cclxuICAgICAgaWYgKCF0YXNrRW5kKVxyXG4gICAgICAgIGF3YWl0IHRoaXMuX3Rhc2suZXZhbEVuZENvbmQoQ29uc3RJbnRlcmZhY2UuRU5EX0NPTkRfRVZBTF9JTU1JRElBVEUpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuX3Rhc2tNZ2RJRCAhPT0gbWdkSUQpXHJcbiAgICAgICAgaXNDaGFuZ2VkQ3VyclduZFJlZi52YWx1ZSA9IHRydWU7XHJcblxyXG4gICAgICBpZiAoIXRoaXMuX3Rhc2suaXNNYWluUHJvZygpICYmIHRoaXMuX3Rhc2suaXNPcGVuV2luKCkpXHJcbiAgICAgICAgQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLmN1cnJNZ2RJRCA9IHRoaXMuX3Rhc2tNZ2RJRDtcclxuXHJcbiAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkNoZWNrQW5kU2hvd1NwaW5uZXIodHJ1ZSk7XHJcblxyXG4gICAgICBzd2l0Y2ggKG9wZXJUeXBlKSB7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19PUEVSX1ZFUklGWTpcclxuICAgICAgICAgIC8vIGlmIHRydWUgcmV0dXJuZWQgdGhlbiB0aGUgdmVyaWZ5IGNvbmRpdGlvbiB3YXMgdHJ1ZSBhbmQgdGhlIG1vZGUgaXMgRXJyb3JcclxuICAgICAgICAgIGlmIChhd2FpdCBvcGVyLmV4ZWN1dGUocmV0dXJuZWRGcm9tU2VydmVyKSkge1xyXG4gICAgICAgICAgICBpZiAoISh0aGlzLl90YXNrLmdldEJya0xldmVsKCkgPT09IFwiVFNcIikpIHtcclxuICAgICAgICAgICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5zZXRTdG9wRXhlY3V0aW9uKHRydWUpO1xyXG5cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX3Rhc2suZ2V0SW5SZWNvcmRTdWZmaXgoKSAmJiB0aGlzLl90YXNrLmdldExldmVsKCkgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spXHJcbiAgICAgICAgICAgICAgdGhpcy5fdGFzay5zZXRMZXZlbChDb25zdGFudHMuVEFTS19MRVZFTF9SRUNPUkQpO1xyXG4gICAgICAgICAgICAvLyBRQ1IgIzk5NTEwOCAtIHZlcmlmeSBlcnJvciBpbiBSUyBzaG91bGRuJ3QgdHJpZ2dlciBSUFxyXG4gICAgICAgICAgICAvKlxyXG4gICAgICAgICAgICAgKiBpZiB3ZSBhcmUgaW4gdGhlIHJldmVydCBtb2RlLCBkb250IHN0b3AgaW1tZWRpYXRlbHkuXHJcbiAgICAgICAgICAgICAqIGV4ZWN1dGUgdGhlIG9wZXJhdGlvbnMgb2YgdGhlIGhhbmRsZXIgaW4gdGhlIHJldmVyc2Ugb3JkZXIgYW5kIHRoZW4gc3RvcC5cclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmV0VmFscyhmYWxzZSwgdHJ1ZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19PUEVSX0xPT1A6XHJcbiAgICAgICAgICAvLyBvbiBnZXR0aW5nIGEgQmxvY2tMb29wLCBleGVjdXRlIHRoZSBsb29wIGZvciB0aGUgbnVtYmVyIG9mIHRpbWVzIGludGVuZGVkLFxyXG4gICAgICAgICAgLy8gYW5kIHRoZW4gbW92ZSB0byBCbG9ja0VuZC5cclxuICAgICAgICAgIHRoaXMuX3Rhc2suZW50ZXJMb29wKCk7XHJcbiAgICAgICAgICB0aGlzLl90YXNrLmluY3JlYXNlTG9vcENvdW50ZXIoKTtcclxuICAgICAgICAgIHRoaXMuX3Rhc2suc2V0VXNlTG9vcFN0YWNrKHRydWUpO1xyXG5cclxuICAgICAgICAgIGF3YWl0IGZsb3dNb25pdG9yLmFkZEZsb3dGaWVsZE9wZXJhdGlvbihvcGVyLCB0cnVlLCB0aGlzLl90YXNrLkdldFRhc2tEZXRhaWxzKCkpO1xyXG5cclxuICAgICAgICAgIGJsb2NrTG9vcEV4ZWNvblNlcnZlciA9IGZhbHNlO1xyXG4gICAgICAgICAgaWYgKCFvcGVyLmdldEV4ZWNPblNlcnZlcigpKSB7XHJcbiAgICAgICAgICAgIC8vIGV4ZWN1dGUgdGhlIGxvb3AgZm9yIHRoZSBudW1iZXIgb2YgdGltZXMgaW50ZW5kZWRcclxuICAgICAgICAgICAgd2hpbGUgKGF3YWl0IG9wZXIuZXhlY3V0ZShmYWxzZSkpIHtcclxuICAgICAgICAgICAgICAvLyBjYWxsIGV4ZWN1dGVPcGVyYXRpb25zKCkgdG8gZXhlY3V0ZSB0aGUgb3BlcmF0aW9ucyB3aXRoaW4gYSBCbG9ja0xvb3BcclxuICAgICAgICAgICAgICByZXR2YWxzID0gYXdhaXQgdGhpcy5leGVjdXRlT3BlcmF0aW9ucyhleGVjRmxvd0lkeCArIDEsIG9wZXIuZ2V0QmxvY2tDbG9zZSgpIC0gMSwgdGFza0VuZCwgbWdkSUQsIGRlcHRoICsgMSxcclxuICAgICAgICAgICAgICAgIGlzQ2hhbmdlZEN1cnJXbmRSZWYsIGZhbHNlLCBmYWxzZSwgLTEpO1xyXG4gICAgICAgICAgICAgIGlmIChyZXR2YWxzICE9PSBudWxsKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbHM7XHJcblxyXG4gICAgICAgICAgICAgIC8vIGlmIHdlIGdldCBhIHJldmVydCBpbnNpZGUgYSBsb29wLCBicmVhayB0aGUgbG9vcFxyXG4gICAgICAgICAgICAgIGlmICgobWdkLklzQWJvcnRpbmcgfHwgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSkpXHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgdGhpcy5fdGFzay5pbmNyZWFzZUxvb3BDb3VudGVyKCk7XHJcbiAgICAgICAgICAgICAgdGhpcy5fdGFzay5zZXRVc2VMb29wU3RhY2sodHJ1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoYXdhaXQgb3Blci5leGVjdXRlKGZhbHNlKSlcclxuICAgICAgICAgICAgICBibG9ja0xvb3BFeGVjb25TZXJ2ZXIgPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKCFibG9ja0xvb3BFeGVjb25TZXJ2ZXIpXHJcbiAgICAgICAgICAvKlxyXG4gICAgICAgICAgICogT25jZSB3ZSBmaW5pc2ggZXhlY3V0aW5nIHRoZSBsb29wLFxyXG4gICAgICAgICAgICogaWYgd2UgYXJlIG1vdmluZyBpbiB0aGUgZm9yd2FyZCBkaXJlY3Rpb24sIG1vdmUgdG8gQmxvY2tFbmQuXHJcbiAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgZXhlY0Zsb3dJZHggPSBvcGVyLmdldEJsb2NrRW5kKCkgLSAxO1xyXG4gICAgICAgICAgdGhpcy5fdGFzay5sZWF2ZUxvb3AoKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX09QRVJfQkxPQ0s6XHJcbiAgICAgICAgICAvLyBvbiBnZXR0aW5nIGEgQmxvY2sgSUYsIGV4ZWN1dGUgdGhlIGV4ZWN1dGFibGUgYmxvY2sgKGlmIG9yIGVsc2UpXHJcbiAgICAgICAgICAvLyBhbmQgdGhlbiBtb3ZlIHRvIEJsb2NrRW5kLlxyXG4gICAgICAgICAgbGV0IHN0YXJ0QmxvY2tJZHg6IG51bWJlciA9IGV4ZWNGbG93SWR4O1xyXG4gICAgICAgICAgaWYgKCFvcGVyLmdldEV4ZWNPblNlcnZlcigpIHx8IChyZXR1cm5lZEZyb21TZXJ2ZXIgJiYgb3Blci5nZXRTZXJ2ZXJJZCgpIDwgbmV4dE9wZXJJZHgpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3Rhc2suc2V0VXNlTG9vcFN0YWNrKHRydWUpO1xyXG4gICAgICAgICAgICBpZiAoIXJldHVybmVkRnJvbVNlcnZlciB8fCBvcGVyLmdldFNlcnZlcklkKCkgPj0gbmV4dE9wZXJJZHgpXHJcbiAgICAgICAgICAgIC8vIGdldCB0aGUgZXhlY3V0YWJsZSBibG9jayBiZXR3ZWVuIEJsb2NrIElGIGFuZCBCbG9jayBFTkRcclxuICAgICAgICAgICAgICBleGVjRmxvd0lkeCA9IGF3YWl0IHRoaXMuZ2V0U2lnbmlmaWNhbnRCbG9jayhleGVjRmxvd0lkeCwgb3Blci5nZXRCbG9ja0VuZCgpKTtcclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgIGV4ZWNGbG93SWR4ID0gdGhpcy5nZXRTdGFydEJsb2NrSWZJZHhCeU9wZXIoZXhlY0Zsb3dJZHgsIG5leHRPcGVySWR4KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl90YXNrLnNldFVzZUxvb3BTdGFjayhkZXB0aCA+IDApO1xyXG4gICAgICAgICAgICBhd2FpdCBvcGVyLm9wZXJTZXJ2ZXIobnVsbCk7XHJcbiAgICAgICAgICAgIG5leHRPcGVySWR4ID0gQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuZ2V0TmV4dE9wZXJJZHgob3BlciwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIGlmIChuZXh0T3BlcklkeCA+IC0xKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuZWRGcm9tU2VydmVyID0gdHJ1ZTtcclxuICAgICAgICAgICAgICBpZiAoaW5CbG9ja0lmKVxyXG4gICAgICAgICAgICAgICAgYmxvY2tJZlJldHVybmVkRnJvbVNlcnZlciA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICAgIGlmIChuZXh0T3BlcklkeCA8IHRoaXMuX29wZXJhdGlvblRhYi5nZXRPcGVyYXRpb24ob3Blci5nZXRCbG9ja0VuZCgpKS5nZXRTZXJ2ZXJJZCgpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBmaW5kIHRoZSBzaWduaWZpY2FudCBibG9jayBpbiB3aGljaCB0aGUgbmV4dCBvcGVyYXRpb24gaXNcclxuICAgICAgICAgICAgICAgIHdoaWxlICh0aGlzLl9vcGVyYXRpb25UYWIuZ2V0T3BlcmF0aW9uKG9wZXIuZ2V0QmxvY2tDbG9zZSgpKS5nZXRTZXJ2ZXJJZCgpIDwgbmV4dE9wZXJJZHgpIHtcclxuICAgICAgICAgICAgICAgICAgZXhlY0Zsb3dJZHggPSBvcGVyLmdldEJsb2NrQ2xvc2UoKTtcclxuICAgICAgICAgICAgICAgICAgb3BlciA9IHRoaXMuX29wZXJhdGlvblRhYi5nZXRPcGVyYXRpb24oZXhlY0Zsb3dJZHgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICByZXR1cm5lZEZyb21TZXJ2ZXIgPSBmYWxzZTtcclxuICAgICAgICAgICAgICBleGVjRmxvd0lkeCA9IC0xO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoZXhlY0Zsb3dJZHggIT09IC0xKSB7XHJcbiAgICAgICAgICAgIGV4ZWN1dGVCbG9jayA9IHRydWU7XHJcbiAgICAgICAgICAgIG9wZXIgPSB0aGlzLl9vcGVyYXRpb25UYWIuZ2V0T3BlcmF0aW9uKGV4ZWNGbG93SWR4KTtcclxuXHJcbiAgICAgICAgICAgIGlmIChyZXR1cm5lZEZyb21TZXJ2ZXIpIHtcclxuICAgICAgICAgICAgICBpZiAodGhpcy5fb3BlcmF0aW9uVGFiLmdldE9wZXJhdGlvbihvcGVyLmdldEJsb2NrQ2xvc2UoKSkuZ2V0U2VydmVySWQoKSA8PSBuZXh0T3BlcklkeCkge1xyXG4gICAgICAgICAgICAgICAgZXhlY3V0ZUJsb2NrID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBibG9ja0lmUmV0dXJuZWRGcm9tU2VydmVyID0gdHJ1ZTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChleGVjdXRlQmxvY2spIHtcclxuICAgICAgICAgICAgICAvLyBjYWxsIGV4ZWN1dGVPcGVyYXRpb25zKCkgdG8gZXhlY3V0ZSB0aGUgb3BlcmF0aW9ucyBpbiB0aGUgZXhlY3V0YWJsZSBibG9ja1xyXG4gICAgICAgICAgICAgIHJldHZhbHMgPSBhd2FpdCB0aGlzLmV4ZWN1dGVPcGVyYXRpb25zKGV4ZWNGbG93SWR4ICsgMSwgb3Blci5nZXRCbG9ja0Nsb3NlKCkgLSAxLCB0YXNrRW5kLCBtZ2RJRCwgZGVwdGggKyAxLFxyXG4gICAgICAgICAgICAgICAgaXNDaGFuZ2VkQ3VyclduZFJlZiwgdHJ1ZSwgcmV0dXJuZWRGcm9tU2VydmVyLCBuZXh0T3BlcklkeCk7XHJcbiAgICAgICAgICAgICAgaWYgKHJldHZhbHMgIT09IG51bGwpXHJcbiAgICAgICAgICAgICAgICBpZiAoIXJldHZhbHMuUmV0dXJuZWRGcm9tU2VydmVyKVxyXG4gICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFscztcclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICByZXR1cm5lZEZyb21TZXJ2ZXIgPSByZXR2YWxzLlJldHVybmVkRnJvbVNlcnZlcjtcclxuICAgICAgICAgICAgICAgICAgbmV4dE9wZXJJZHggPSByZXR2YWxzLk5leHRPcGVySWR4O1xyXG4gICAgICAgICAgICAgICAgICBibG9ja0lmUmV0dXJuZWRGcm9tU2VydmVyID0gcmV0dmFscy5CbG9ja0lmUmV0dXJuZWRGcm9tU2VydmVyO1xyXG4gICAgICAgICAgICAgICAgICBleGVjRmxvd0lkeCA9IG9wZXIuZ2V0QmxvY2tFbmQoKSAtIDE7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLypcclxuICAgICAgICAgICAqIE9uY2Ugd2UgZmluaXNoIGV4ZWN1dGluZyB0aGUgYmxvY2ssXHJcbiAgICAgICAgICAgKiBpZiB3ZSBhcmUgbW92aW5nIGluIHRoZSBmb3J3YXJkIGRpcmVjdGlvbiwgbW92ZSB0byBCbG9ja0VuZC5cclxuICAgICAgICAgICAqIG90aGVyd2lzZSwgbW92ZSB0byBCbG9jayBJRlxyXG4gICAgICAgICAgICovXHJcbiAgICAgICAgICBleGVjRmxvd0lkeCA9IG9wZXIuZ2V0QmxvY2tFbmQoKSAtIDE7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19PUEVSX0VOREJMT0NLOlxyXG4gICAgICAgICAgYXdhaXQgZmxvd01vbml0b3IuYWRkRmxvd0ZpZWxkT3BlcmF0aW9uKG9wZXIsIHRydWUsIHRoaXMuX3Rhc2suR2V0VGFza0RldGFpbHMoKSk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19PUEVSX0NBTEw6XHJcbiAgICAgICAgICB0aGlzLl90YXNrLnNldFVzZUxvb3BTdGFjayhkZXB0aCA+IDApO1xyXG4gICAgICAgICAgLy8gaWYgZmFsc2UgaXMgcmV0dXJuZWQsIGl0IG1lYW5zIHRoYXQgYSByb3V0ZSBvcGVyYXRpb24gd2FzIGV4ZWN1dGVkLlxyXG4gICAgICAgICAgcm91dGVPcGVyYXRpb25FeGVjdXRlZCA9IGF3YWl0IG9wZXIuZXhlY3V0ZShyZXR1cm5lZEZyb21TZXJ2ZXIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAvLyB0aGUgcmVzdCBvZiB0aGUgb3BlcmF0aW9ucyAodGhvc2UgdGhhdCBkbyBub3QgYWZmZWN0IHRoZSBmbG93KVxyXG4gICAgICAgICAgdGhpcy5fdGFzay5zZXRVc2VMb29wU3RhY2soZGVwdGggPiAwKTtcclxuICAgICAgICAgIGF3YWl0IG9wZXIuZXhlY3V0ZShyZXR1cm5lZEZyb21TZXJ2ZXIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIGlmIHRoZSBzZXJ2ZXIgaGF2ZSBleGVjdXRlZCBhIGJsb2NrIG9mIG9wZXJhdGlvbnMgdGhlbiBnZXQgdGhlIG5leHRcclxuICAgICAgLy8gb3BlcmF0aW9uIGluZGV4XHJcbiAgICAgIGlmICghYmxvY2tJZlJldHVybmVkRnJvbVNlcnZlcikge1xyXG4gICAgICAgIG5leHRPcGVySWR4ID0gQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuZ2V0TmV4dE9wZXJJZHgob3BlciwgdHJ1ZSk7XHJcbiAgICAgICAgaWYgKG5leHRPcGVySWR4ID4gLTEpIHtcclxuICAgICAgICAgIHJldHVybmVkRnJvbVNlcnZlciA9IHRydWU7XHJcbiAgICAgICAgICBpZiAoaW5CbG9ja0lmKVxyXG4gICAgICAgICAgICBibG9ja0lmUmV0dXJuZWRGcm9tU2VydmVyID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSByZXR1cm5lZEZyb21TZXJ2ZXIgPSBmYWxzZTtcclxuICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICBpZiAocm91dGVPcGVyYXRpb25FeGVjdXRlZClcclxuICAgICAgcmV0dmFscyA9IG5ldyBSZXRWYWxzKGZhbHNlLCB0cnVlKTtcclxuICAgIGVsc2UgaWYgKGJsb2NrSWZSZXR1cm5lZEZyb21TZXJ2ZXIpXHJcbiAgICAgIHJldHZhbHMgPSBuZXcgUmV0VmFscyhuZXh0T3BlcklkeCwgcmV0dXJuZWRGcm9tU2VydmVyLCBibG9ja0lmUmV0dXJuZWRGcm9tU2VydmVyKTtcclxuICAgIGVsc2VcclxuICAgICAgcmV0dmFscyA9IG51bGw7XHJcbiAgICByZXR1cm4gcmV0dmFscztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIGV4ZWN1dGFibGUgQmxvY2sgKElGIG9yIEVMU0UpXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInN0YXJ0QmxvY2tJZHhcIj50aGUgaW5kZXggb2YgdGhlIEJsb2NrIElGPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImVuZElkeFwiPnRoZSBCbG9jayBFbmQgSW5kZXggb2YgdGhlIEJsb2NrIElGPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+VGhlIGluZGV4IG9mIHRoZSBibG9jayAoSUYgb3IgRUxTRSBvciBuZXh0IEVMU0UgLi4uKXRoYXQgY2FuIGJlIGV4ZWN1dGVkLlxyXG4gIC8vLyAgIElmIG5vIGJsb2NrcyBjYW4gYmUgZXhlY3V0ZWQsIHJldHVybiAtMVxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBhc3luYyBnZXRTaWduaWZpY2FudEJsb2NrKHN0YXJ0QmxvY2tJZHg6IG51bWJlciwgZW5kSWR4OiBudW1iZXIpOiBQcm9taXNlPG51bWJlcj4ge1xyXG4gICAgbGV0IHJldElkeDogbnVtYmVyID0gLTE7XHJcblxyXG4gICAgd2hpbGUgKHN0YXJ0QmxvY2tJZHggPCBlbmRJZHgpIHtcclxuICAgICAgbGV0IG9wZXI6IE9wZXJhdGlvbiA9IHRoaXMuX29wZXJhdGlvblRhYi5nZXRPcGVyYXRpb24oc3RhcnRCbG9ja0lkeCk7XHJcbiAgICAgIGxldCBvcGVyVHlwZTogbnVtYmVyID0gb3Blci5nZXRUeXBlKCk7XHJcblxyXG4gICAgICBpZiAob3BlclR5cGUgIT09IENvbnN0SW50ZXJmYWNlLk1HX09QRVJfQkxPQ0sgJiYgb3BlclR5cGUgIT09IENvbnN0SW50ZXJmYWNlLk1HX09QRVJfRUxTRSAmJiBvcGVyVHlwZSAhPT0gQ29uc3RJbnRlcmZhY2UuTUdfT1BFUl9TRVJWRVIpXHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBpZiAoYXdhaXQgb3Blci5leGVjdXRlKGZhbHNlKSkge1xyXG4gICAgICAgIHJldElkeCA9IHN0YXJ0QmxvY2tJZHg7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZVxyXG4gICAgICAgIHN0YXJ0QmxvY2tJZHggPSBvcGVyLmdldEJsb2NrQ2xvc2UoKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXRJZHg7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSBpZHggb2YgdGhlIEJsb2NrIElGXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImVuZElkeFwiPi0tLSB0aGUgaW5kZXggb2YgdGhlIEJsb2NrIEVuZFxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gLS0tIFRoZSBpbmRleCBvZiB0aGUgYmxvY2sgSUYgd2hvc2UgQmxvY2tFbmQgSWR4IG1hdGNoZXMgd2l0aCB0aGUgZW5kSWR4XHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBwcml2YXRlIGdldFN0YXJ0QmxvY2tJZHhCeUVuZChlbmRJZHg6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBsZXQgcmV0SWR4OiBudW1iZXIgPSAtMTtcclxuICAgIGxldCBmb3VuZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IGo6IG51bWJlcjtcclxuICAgIGZvciAoaiA9IGVuZElkeCAtIDE7IGogPj0gMCAmJiAhZm91bmQ7IGotLSkge1xyXG4gICAgICBsZXQgb3BlcjogT3BlcmF0aW9uID0gdGhpcy5fb3BlcmF0aW9uVGFiLmdldE9wZXJhdGlvbihqKTtcclxuICAgICAgbGV0IG9wZXJUeXBlOiBudW1iZXIgPSBvcGVyLmdldFR5cGUoKTtcclxuXHJcbiAgICAgIGlmIChvcGVyVHlwZSA9PT0gQ29uc3RJbnRlcmZhY2UuTUdfT1BFUl9CTE9DSyB8fCBvcGVyVHlwZSA9PT0gQ29uc3RJbnRlcmZhY2UuTUdfT1BFUl9MT09QKSB7XHJcbiAgICAgICAgaWYgKG9wZXIuZ2V0QmxvY2tFbmQoKSA9PT0gZW5kSWR4KSB7XHJcbiAgICAgICAgICByZXRJZHggPSBqO1xyXG4gICAgICAgICAgZm91bmQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJldElkeDtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSBpZHggb2YgdGhlIEJsb2NrIElGXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImVsc2VJZHhcIj4tLS0gdGhlIGluZGV4IG9mIHRoZSBCbG9jayBFbHNlXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiAtLS0gVGhlIGluZGV4IG9mIHRoZSBibG9jayBJRiB3aG9zZSBCbG9ja0VuZCBJZHggbWF0Y2hlcyB3aXRoIHRoZSBlbmRJZHhcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgZ2V0U3RhcnRCbG9ja0lkeEJ5RWxzZShlbHNlSWR4OiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgbGV0IHJldElkeDogbnVtYmVyID0gLTE7XHJcbiAgICBsZXQgZm91bmQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBlbHNlQmxvY2tFbmQ6IG51bWJlciA9IHRoaXMuX29wZXJhdGlvblRhYi5nZXRPcGVyYXRpb24oZWxzZUlkeCkuZ2V0QmxvY2tFbmQoKTtcclxuICAgIGxldCBqOiBudW1iZXI7XHJcbiAgICBmb3IgKGogPSBlbHNlSWR4IC0gMTsgaiA+PSAwICYmICFmb3VuZDsgai0tKSB7XHJcbiAgICAgIGxldCBvcGVyOiBPcGVyYXRpb24gPSB0aGlzLl9vcGVyYXRpb25UYWIuZ2V0T3BlcmF0aW9uKGopO1xyXG4gICAgICBsZXQgb3BlclR5cGU6IG51bWJlciA9IG9wZXIuZ2V0VHlwZSgpO1xyXG5cclxuICAgICAgaWYgKG9wZXJUeXBlID09PSBDb25zdEludGVyZmFjZS5NR19PUEVSX0JMT0NLKSB7XHJcbiAgICAgICAgaWYgKG9wZXIuZ2V0QmxvY2tFbmQoKSA9PT0gZWxzZUJsb2NrRW5kKSB7XHJcbiAgICAgICAgICByZXRJZHggPSBqO1xyXG4gICAgICAgICAgZm91bmQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJldElkeDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIGluZGV4IG9mIHRoZSBCbG9jayBJRiBvciBFbHNlIGFjY29yZGluZyB0byB0aGUgaW5kZXggb2Ygb25lIG9mIHRoZSBvZiBvcGVyYXRpb25zIGluIGl0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImJsb2NrT3BlcklkeFwiPi0tLSBpbmRleCBvZiB0aGUgaWYgYmxvY2sgZm9yIHdoaWNoIHdlIGhhdmUgdG8gZmluZCB0aGUgYXBwcm9wcmlhdGUgYmxvY2sgdG8gZXhlY3V0ZVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic3J2ck9wZXJJZHhcIj4tLS0gdGhlIHNlcnZlciBpZCBvZiB0aGUgbmV4dCBvcGVyYXRpb24gd2hpY2ggdGhlIGNsaWVudCBzaG91bGQgZXhlY3V0ZVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gLS0tIFRoZSBpbmRleCBvZiB0aGUgYmxvY2sgSUYgb3IgRWxzZSB3aGljaCBob2xkIHRoZSBvcGVyYXRpb24gd2hpY2ggb3BlcklkeCBpcyBpdHMgaW5kZXhcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgZ2V0U3RhcnRCbG9ja0lmSWR4QnlPcGVyKGJsb2NrT3BlcklkeDogbnVtYmVyLCBzcnZyT3BlcklkeDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGxldCByZXRJZHg6IG51bWJlciA9IC0xO1xyXG4gICAgbGV0IGZvdW5kOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgajogbnVtYmVyID0gdGhpcy5fb3BlcmF0aW9uVGFiLnNlcnZlcklkMm9wZXJJZHgoc3J2ck9wZXJJZHgsIGJsb2NrT3BlcklkeCkgLSAxO1xyXG5cclxuICAgIGlmIChqID09PSAtMikge1xyXG4gICAgICBqID0gdGhpcy5fb3BlcmF0aW9uVGFiLnNlcnZlcklkMkZvbGxvd2luZ09wZXJJZHgoc3J2ck9wZXJJZHgsIGJsb2NrT3BlcklkeCkgLSAxO1xyXG4gICAgfVxyXG5cclxuICAgIHdoaWxlIChqID49IDAgJiYgIWZvdW5kKSB7XHJcbiAgICAgIGxldCBvcGVyOiBPcGVyYXRpb24gPSB0aGlzLl9vcGVyYXRpb25UYWIuZ2V0T3BlcmF0aW9uKGopO1xyXG4gICAgICBsZXQgb3BlclR5cGU6IG51bWJlciA9IG9wZXIuZ2V0VHlwZSgpO1xyXG4gICAgICBpZiAob3BlclR5cGUgPT09IENvbnN0SW50ZXJmYWNlLk1HX09QRVJfQkxPQ0spIHtcclxuICAgICAgICBpZiAoaiA9PT0gYmxvY2tPcGVySWR4KSB7XHJcbiAgICAgICAgICByZXRJZHggPSBqO1xyXG4gICAgICAgICAgZm91bmQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBqLS07XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAob3BlclR5cGUgPT09IENvbnN0SW50ZXJmYWNlLk1HX09QRVJfRUxTRSkge1xyXG4gICAgICAgIGxldCBibG9ja1N0cnQ6IG51bWJlciA9IHRoaXMuZ2V0U3RhcnRCbG9ja0lkeEJ5RWxzZShqKTtcclxuICAgICAgICBpZiAoYmxvY2tTdHJ0ID09PSBibG9ja09wZXJJZHgpIHtcclxuICAgICAgICAgIHJldElkeCA9IGo7XHJcbiAgICAgICAgICBmb3VuZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIGogPSBibG9ja1N0cnQgLSAxO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKG9wZXJUeXBlID09PSBDb25zdEludGVyZmFjZS5NR19PUEVSX0VOREJMT0NLKVxyXG4gICAgICAgIGogPSB0aGlzLmdldFN0YXJ0QmxvY2tJZHhCeUVuZChqKSAtIDE7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBqLS07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmV0SWR4O1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIGxldmVsXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRMZXZlbCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX2xldmVsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0aGUgZXZlbnQgb2YgdGhpcyBoYW5kbGVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRFdmVudCgpOiBFdmVudCB7XHJcbiAgICByZXR1cm4gdGhpcy5fZXZ0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgSWQgb2YgdGhlIGV2ZW50IGhhbmRsZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldElkKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5faWQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSBjb250cm9sIG9mIHRoZSBldmVudCBoYW5kbGVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRTdGF0aWNDdHJsKCk6IE1nQ29udHJvbCB7XHJcbiAgICByZXR1cm4gdGhpcy5fY3RybDtcclxuICB9XHJcblxyXG4gIGdldFJ1blRpbWVDdHJsKCk6IE1nQ29udHJvbCB7XHJcbiAgICByZXR1cm4gPE1nQ29udHJvbD5BY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5nZXRMYXN0UnRFdmVudCgpLkNvbnRyb2w7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIHRoZSBoYW5kbGVyIGlzIGVuYWJsZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIGlzRW5hYmxlZCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIHJldHVybiBhd2FpdCB0aGlzLl9lbmFibGVkRXhwLmdldFZhbCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlc2V0IHRoZSB2YWx1ZXMgb2YgdGhlIGxvY2FsIHZhcmlhYmxlcyB1c2luZyB0aGUgYXJndW1lbnQgdmFsdWVzIG9yIHRoZSBkZWZhdWx0XHJcbiAgLy8vICAgdmFsdWVzIG9yIHRoZSBpbml0IGV4cHJlc3Npb25cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiYXJnc1wiPnRoZSBhcmd1bWVudHMgbGlzdCA8L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgcmVzZXRMb2NhbFZhcmlhYmxlcyhhcmdzOiBBcmd1bWVudHNMaXN0KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgZHY6IERhdGFWaWV3ID0gPERhdGFWaWV3PnRoaXMuX3Rhc2suRGF0YVZpZXc7XHJcbiAgICBsZXQgYXJnSWR4OiBudW1iZXIgPSAwO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGZvciAobGV0IGZpZWxkSWR4OiBudW1iZXIgPSB0aGlzLl9kdlBvczsgZmllbGRJZHggPCB0aGlzLl9kdlBvcyArIHRoaXMuX2R2TGVuOyBmaWVsZElkeCsrKSB7XHJcbiAgICAgICAgbGV0IGFGaWVsZDogRmllbGRCYXNlID0gPEZpZWxkQmFzZT5kdi5nZXRGaWVsZChmaWVsZElkeCk7XHJcbiAgICAgICAgbGV0IHZhcklzUGFybTogYm9vbGVhbiA9ICF0aGlzLl9oYXNQYXJhbWV0ZXJzIHx8IGFGaWVsZC5pc1BhcmFtKCk7XHJcblxyXG4gICAgICAgIC8vIGNoZWNrIGlmIHRoZSBmaWVsZCBzaG91bGQgZ2V0IGl0cyB2YWx1ZSBmcm9tIGFuIGFyZ3VtZW50XHJcbiAgICAgICAgaWYgKChhcmdzICE9PSBudWxsICYmIGFyZ0lkeCA8IGFyZ3MuZ2V0U2l6ZSgpKSAmJiB2YXJJc1Bhcm0pIHtcclxuICAgICAgICAgIGlmICghYXJncy5nZXRBcmcoYXJnSWR4KS5za2lwQXJnKCkpIHtcclxuICAgICAgICAgICAgYXdhaXQgYXJncy5nZXRBcmcoYXJnSWR4KS5zZXRWYWx1ZVRvRmllbGQoYUZpZWxkKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBhRmllbGQuaW52YWxpZGF0ZSh0cnVlLCBGaWVsZEJhc2UuQ0xFQVJfRkxBR1MpO1xyXG4gICAgICAgICAgICBhd2FpdCBhRmllbGQuY29tcHV0ZShmYWxzZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBhcmdJZHgrKztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBhRmllbGQuaW52YWxpZGF0ZSh0cnVlLCBGaWVsZEJhc2UuQ0xFQVJfRkxBR1MpO1xyXG4gICAgICAgICAgYXdhaXQgYUZpZWxkLmNvbXB1dGUoZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBhd2FpdCBhRmllbGQudXBkYXRlRGlzcGxheSgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXhjZXB0aW9uKSB7XHJcbiAgICAgIHRocm93IGV4Y2VwdGlvbjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdGhlIHJlc3VsdCB2YWx1ZXMgdG8gdGhlIGZpZWxkIGFyZ3VtZW50c1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJhcmdzXCI+dGhlIGFyZ3VtZW50cyBsaXN0IDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBnZXRBcmdWYWxzRnJvbUZsZHMoYXJnczogQXJndW1lbnRzTGlzdCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGR2OiBEYXRhVmlldyA9IDxEYXRhVmlldz50aGlzLl90YXNrLkRhdGFWaWV3O1xyXG4gICAgbGV0IGs6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgajogbnVtYmVyO1xyXG5cclxuICAgIGZvciAoaiA9IHRoaXMuX2R2UG9zOyBqIDwgdGhpcy5fZHZQb3MgKyB0aGlzLl9kdkxlbiAmJiBrIDwgYXJncy5nZXRTaXplKCk7IGorKykge1xyXG4gICAgICBsZXQgYUZpZWxkOiBGaWVsZEJhc2UgPSA8RmllbGRCYXNlPmR2LmdldEZpZWxkKGopO1xyXG4gICAgICBpZiAoIXRoaXMuX2hhc1BhcmFtZXRlcnMgfHwgYUZpZWxkLmlzUGFyYW0oKSkge1xyXG4gICAgICAgIGxldCBhcmc6IEFyZ3VtZW50ID0gYXJncy5nZXRBcmcoayk7XHJcbiAgICAgICAgaWYgKGFyZy5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkFSR19UWVBFX0ZJRUxEKSB7XHJcbiAgICAgICAgICAvLyB1cGRhdGUgdGhlIGZpZWxkIHZhbHVlIGZyb20gdGhlIHRoZSBQYXJhbVxyXG4gICAgICAgICAgbGV0IGFyZ0ZsZDogRmllbGRCYXNlID0gPEZpZWxkQmFzZT5hcmcuZ2V0RmllbGQoKTtcclxuXHJcbiAgICAgICAgICAvLyBBIGhhbmRsZXIgY2FuIGJlIGNhbGxlZCBlaXRoZXIgZnJvbSB0aGUgc2FtZSB0YXNrIChvZiB0aGUgaGFuZGxlcikgb3IgZnJvbSBhXHJcbiAgICAgICAgICAvLyB0YXNrIGxvd2VyIGRvd24gaW4gdGhlIGhpZXJhcmNoeS5cclxuICAgICAgICAgIC8vIEhlcmUgd2UgYXJlIGNvcHlpbmcgdmFsdWUgZnJvbSB0aGUgaGFuZGxlciB0YXNrIHRvIHRoZSBpbnZva2VyIHRhc2suXHJcbiAgICAgICAgICAvLyBDb3B5aW5nIHNob3VsZCBub3QgYmUgZG9uZSBpZiBhbnkgb25lIG9mIHRoZSB0YXNrIGlzIGFib3J0aW5nLlxyXG4gICAgICAgICAgLy8gQnV0IGNoZWNraW5nIG9ubHkgdGhlIGludm9rZXIgdGFzaydzIGlzQWJvcnRpbmcgaXMgc3VmZmljaWVudCBoZXJlIGJlY2F1c2UsXHJcbiAgICAgICAgICAvLyBpdCB3aWxsIGJlIHRydWUgZXZlbiBpZiB0aGUgaGFuZGxlciB0YXNrIGlzIGFib3J0aW5nLlxyXG4gICAgICAgICAgaWYgKGFyZ0ZsZC5nZXRUYXNrKCkgIT09IG51bGwgJiYgISg8VGFzaz5hcmdGbGQuZ2V0VGFzaygpKS5pc0Fib3J0aW5nKCkpIHtcclxuICAgICAgICAgICAgbGV0IHZhbDogc3RyaW5nID0gYUZpZWxkLmdldFZhbHVlKGZhbHNlKTtcclxuICAgICAgICAgICAgYXdhaXQgYXJnRmxkLnNldFZhbHVlQW5kU3RhcnRSZWNvbXB1dGUodmFsLCBhRmllbGQuaXNOdWxsKCksIHRydWUsIGFGaWVsZC5pc01vZGlmaWVkKCksIGZhbHNlKTtcclxuICAgICAgICAgICAgYXdhaXQgYXJnRmxkLnVwZGF0ZURpc3BsYXkoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaysrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgaGFuZGxlcidzIHRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldFRhc2soKTogVGFzayB7XHJcbiAgICByZXR1cm4gdGhpcy5fdGFzaztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVycyBleHBlY3RlZCBieSB0aGUgaGFuZGxlclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXJnc01hdGNoKEV4cF9wYXJhbXM6IEV4cFZhbFtdKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgYXJnc01hdGNoZWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgbGV0IGR2OiBEYXRhVmlldyA9IDxEYXRhVmlldz50aGlzLl90YXNrLkRhdGFWaWV3O1xyXG4gICAgbGV0IGo6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgcGFyYW1Db3VudDogbnVtYmVyID0gMDtcclxuXHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSB0aGlzLl9kdlBvczsgaSA8IHRoaXMuX2R2UG9zICsgdGhpcy5fZHZMZW47IGkrKykge1xyXG4gICAgICBsZXQgZmllbGQ6IEZpZWxkQmFzZSA9IDxGaWVsZEJhc2U+ZHYuZ2V0RmllbGQoaSk7XHJcbiAgICAgIGlmIChmaWVsZC5pc1BhcmFtKCkpIHtcclxuICAgICAgICBwYXJhbUNvdW50Kys7XHJcbiAgICAgICAgaWYgKGogPCBFeHBfcGFyYW1zLmxlbmd0aCkge1xyXG4gICAgICAgICAgbGV0IGZpZWxkQXR0cjogU3RvcmFnZUF0dHJpYnV0ZSA9IGZpZWxkLmdldFR5cGUoKTtcclxuICAgICAgICAgIGxldCBhcmdBdHRyOiBTdG9yYWdlQXR0cmlidXRlID0gRXhwX3BhcmFtc1tqXS5BdHRyO1xyXG5cclxuXHJcbiAgICAgICAgICAvLyBhcmd1bWVudCBhbmQgcGFyYW1ldGVyIHdpbGwgbm90IG1hdGNoIGlmIDpcclxuICAgICAgICAgIC8vIDEuIFRoZXkgYXJlIG5vdCBvZiB0aGUgc2FtZSB0eXBlXHJcbiAgICAgICAgICAvLyAyLiBUaGV5IENhbm5vdCBiZSBjYXN0IChhbHBoYSBjYW4gYmUgY2FzdCB0byB1bmljb2RlKVxyXG4gICAgICAgICAgLy8gMy4gQWxsIHRob3NlIGFwcGx5IGlmIHRoZSBwYXJhbWV0ZXIgaXMgbm90IG51bGwuIGlmIHRoZSBwYXJhbSB2YWwgaXMgbnVsbCBpdCBjYW4gZ28gaW50byBhbnkgdHlwZSBvZiBwYXJhbWV0ZXIuXHJcbiAgICAgICAgICBpZiAoIUV4cF9wYXJhbXNbal0uSXNOdWxsICYmICFTdG9yYWdlQXR0cmlidXRlQ2hlY2suaXNUaGVTYW1lVHlwZShmaWVsZEF0dHIsIGFyZ0F0dHIpICYmICFTdG9yYWdlQXR0cmlidXRlQ2hlY2suU3RvcmFnZUZsZEFscGhhVW5pY29kZU9yQmxvYihmaWVsZEF0dHIsIGFyZ0F0dHIpKSB7XHJcbiAgICAgICAgICAgIGFyZ3NNYXRjaGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaisrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChwYXJhbUNvdW50ICE9PSBFeHBfcGFyYW1zLmxlbmd0aCkge1xyXG4gICAgICBhcmdzTWF0Y2hlZCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFyZ3NNYXRjaGVkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIE9wZXJhdGlvblRhYmxlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRPcGVyYXRpb25UYWIoKTogT3BlcmF0aW9uVGFibGUge1xyXG4gICAgcmV0dXJuIHRoaXMuX29wZXJhdGlvblRhYjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gSW4gY2FzZSBvZiBDb250cm9sIGhlYWRlcnMsIHJldHVybiBjb250cm9sIG5hbWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldENvbnRyb2xOYW1lRm9yQ29udHJvbEhlYWRlcigpOiBzdHJpbmcge1xyXG4gICAgaWYodGhpcy5nZXRFdmVudCgpLmdldFR5cGUoKSA9PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0lOVEVSTkFMKSB7XHJcblxyXG4gICAgICAvLyBSZXR1cm4gdGhlIGNvbnRyb2wgbmFtZSBmb3IgQ29udHJvbCBIZWFkZXJzXHJcbiAgICAgIGlmICh0aGlzLmdldEV2ZW50KCkuaXNDb250cm9sSGVhZGVyKCkgJiYgIWlzTnVsbE9yVW5kZWZpbmVkKHRoaXMuX2N0cmwpKVxyXG4gICAgICAgIHJldHVybiB0aGlzLmdldEN0cmxOYW1lKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gTlN0cmluZy5FbXB0eTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gSW4gY2FzZSBvZiBWYXJpYWJsZSBoZWFkZXJzLCByZXR1cm4gZmllbGQgbmFtZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0VmFyTmFtZUZvclZhcmlhYmxlSGVhZGVyKCk6IHN0cmluZyB7XHJcbiAgICAvLyBSZXR1cm4gdGhlIEZpZWxkIG5hbWUgZm9yIFZhcmlhYmxlIEhlYWRlcnNcclxuICAgaWYgKHRoaXMuZ2V0RXZlbnQoKS5pc1ZhcmlhYmxlSGVhZGVyKCkgJiYgIWlzTnVsbE9yVW5kZWZpbmVkKHRoaXMuX2hhbmRsZXJGbGQpKVxyXG4gICAgICByZXR1cm4gdGhpcy5faGFuZGxlckZsZC5nZXRWYXJOYW1lKCkudG9VcHBlckNhc2UoKTtcclxuXHJcbiAgIHJldHVybiBOU3RyaW5nLkVtcHR5O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBSZXR1cm4gdGhlIGV2ZW50IGhhbmRsZXIgaW5mb3JtYXRpb24gdG8gYmUgZGlzcGxheWVkIGluIGNhc2Ugb2YgJ1JlcXVlc3RJbmZvJyBsb2cgbGV2ZWxcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldEV2ZW50SGFuZGxlckluZm8oKTogc3RyaW5nIHtcclxuICAgIGxldCBldmVudERlc2NyaXB0aW9uOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuXHJcbiAgICB0aGlzLmdldEV2ZW50KCkuQXBwZW5kRGVzY3JpcHRpb24oZXZlbnREZXNjcmlwdGlvbik7XHJcblxyXG4gICAgLy8gQXBwZW5kIGNvbnRyb2wvdmFyaWFibGUgbmFtZSBpbiBDb250cm9sL1ZhcmlhYmxlIGhlYWRlcnNcclxuICAgIGxldCBoZWFkZXJBZGRpdGlvbmFsSW5mbzogc3RyaW5nID0gdGhpcy5nZXRDb250cm9sTmFtZUZvckNvbnRyb2xIZWFkZXIoKSArIHRoaXMuZ2V0VmFyTmFtZUZvclZhcmlhYmxlSGVhZGVyKCk7XHJcblxyXG4gICAgZXZlbnREZXNjcmlwdGlvbi5BcHBlbmQoaGVhZGVyQWRkaXRpb25hbEluZm8pO1xyXG5cclxuICAgIC8vIEZvciBzb21lIGhlYWRlcnMgbGlrZSBSUC9UUCwgdGhlIGV2ZW50IGRlc2NyaXB0aW9uIGlzIGVtcHR5LlxyXG4gICAgLy8gRm9yIG90aGVycyBlbXB0eSBzcGFjZSBzaG91bGQgYmUgYWRkZWQgYmV0d2VlbiBldmVudCB0eXBlIGFuZCBkZXNjcmlwdGlvbi5cclxuICAgIC8vIFRoaXMgaXMgZG9uZSB0byBhdm9pZCB1bm5lY2Vzc2FyeSBibGFuayBzcGFjZSBhdCB0aGUgZW5kIG9mIHRoZSBldmVudCBoYW5kbGVyIHR5cGVcclxuICAgIGlmKCFOU3RyaW5nLklzTnVsbE9yRW1wdHkoZXZlbnREZXNjcmlwdGlvbi50b1N0cmluZygpKSlcclxuICAgICAgZXZlbnREZXNjcmlwdGlvbiA9IG5ldyBTdHJpbmdCdWlsZGVyKCcgJyArIGV2ZW50RGVzY3JpcHRpb24udG9TdHJpbmcoKSwgZXZlbnREZXNjcmlwdGlvbi50b1N0cmluZygpLmxlbmd0aCArIDEpO1xyXG5cclxuICAgIHJldHVybiBOU3RyaW5nLkZvcm1hdChcIkhhbmRsZXIgezB9ezF9XCIsIHRoaXMuZ2V0RXZlbnQoKS5nZXRFdmVudFR5cGUoKSwgZXZlbnREZXNjcmlwdGlvbik7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2hlY2sgaXMgdGFzayBzY29wZSBpcyBhcHByb3ByaWF0ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpc1NhbWVUYXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGNoZWNrVGFza1Njb3BlKGlzU2FtZVRhc2s6IGJvb2xlYW4pOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLl9zY29wZSA9PT0gQnJrU2NvcGUuVGFzayAmJiAhaXNTYW1lVGFzaylcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICB0b1N0cmluZygpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIE5TdHJpbmcuRm9ybWF0KFwiKEhhbmRsZXIgZm9yIHswfSBvbiB0YXNrIHsxfSwgc2NvcGUgezJ9KVwiLCB0aGlzLl9ldnQsIHRoaXMuX3Rhc2ssIHRoaXMuX3Njb3BlKTtcclxuICB9XHJcbn1cclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuLy8vICAgdXNlZCB0byByZXR1cm4gdGhlIHJlc3VsdHMgb2YgdGhlIGV4ZWN1dGUoKSBtZXRob2RcclxuLy8vIDwvc3VtbWFyeT5cclxuZXhwb3J0IGNsYXNzIFJldFZhbHMgIHtcclxuICBCbG9ja0lmUmV0dXJuZWRGcm9tU2VydmVyOiBib29sZWFuID0gZmFsc2U7XHJcbiAgRW5hYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIE5leHRPcGVySWR4OiBudW1iZXIgPSAwO1xyXG4gIFByb3BhZ2F0ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIFJldHVybmVkRnJvbVNlcnZlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihwOiBib29sZWFuLCBlOiBib29sZWFuKTtcclxuICBjb25zdHJ1Y3RvcihvcGVySWR4OiBudW1iZXIsIGluUmV0dXJuZWRGcm9tU2VydmVyOiBib29sZWFuLCBpbkJsb2NrSWZSZXR1cm5lZEZyb21TZXJ2ZXI6IGJvb2xlYW4pO1xyXG4gIGNvbnN0cnVjdG9yKHBPck9wZXJJZHg6IGFueSwgZU9ySW5SZXR1cm5lZEZyb21TZXJ2ZXI6IGJvb2xlYW4sIGluQmxvY2tJZlJldHVybmVkRnJvbVNlcnZlcj86IGJvb2xlYW4pIHtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyKVxyXG4gICAgICB0aGlzLmNvbnN0cnVjdG9yXzAocE9yT3BlcklkeCwgZU9ySW5SZXR1cm5lZEZyb21TZXJ2ZXIpO1xyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLmNvbnN0cnVjdG9yXzEocE9yT3BlcklkeCwgZU9ySW5SZXR1cm5lZEZyb21TZXJ2ZXIsIGluQmxvY2tJZlJldHVybmVkRnJvbVNlcnZlcik7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwXCI+cHJvcGFnYXRlIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJlXCI+ZW5hYmxlZCA8L3BhcmFtPlxyXG4gIHByaXZhdGUgY29uc3RydWN0b3JfMChwOiBib29sZWFuLCBlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLlByb3BhZ2F0ZSA9IHA7XHJcbiAgICB0aGlzLkVuYWJsZWQgPSBlO1xyXG4gICAgdGhpcy5OZXh0T3BlcklkeCA9IDA7XHJcbiAgICB0aGlzLlJldHVybmVkRnJvbVNlcnZlciA9IGZhbHNlO1xyXG4gICAgdGhpcy5CbG9ja0lmUmV0dXJuZWRGcm9tU2VydmVyID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJvcGVySWR4XCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpblJldHVybmVkRnJvbVNlcnZlclwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaW5CbG9ja0lmUmV0dXJuZWRGcm9tU2VydmVyXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIGNvbnN0cnVjdG9yXzEob3BlcklkeDogbnVtYmVyLCBpblJldHVybmVkRnJvbVNlcnZlcjogYm9vbGVhbiwgaW5CbG9ja0lmUmV0dXJuZWRGcm9tU2VydmVyOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLlByb3BhZ2F0ZSA9IGZhbHNlO1xyXG4gICAgdGhpcy5FbmFibGVkID0gdHJ1ZTtcclxuICAgIHRoaXMuTmV4dE9wZXJJZHggPSBvcGVySWR4O1xyXG4gICAgdGhpcy5SZXR1cm5lZEZyb21TZXJ2ZXIgPSBpblJldHVybmVkRnJvbVNlcnZlcjtcclxuICAgIHRoaXMuQmxvY2tJZlJldHVybmVkRnJvbVNlcnZlciA9IGluQmxvY2tJZlJldHVybmVkRnJvbVNlcnZlcjtcclxuICB9XHJcbn1cclxuXHJcbiJdfQ==
|
|
772
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXZlbnRIYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZW5naW5lL3NyYy9ldmVudC9FdmVudEhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLG9CQUFvQixFQUFFLFNBQVMsRUFBUSxPQUFPLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxpQkFBaUIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ2hJLE9BQU8sRUFDTCxRQUFRLEVBQ1IsU0FBUyxFQUNULGlCQUFpQixFQUNqQixNQUFNLEVBQ04sZ0JBQWdCLEVBRWhCLHFCQUFxQixFQUNyQixZQUFZLEVBQ1osU0FBUyxFQUNWLE1BQU0sa0JBQWtCLENBQUM7QUFFMUIsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUM5QixPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDNUMsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBS3BELE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBRTFELE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUdsRCxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFHekMsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQ2pELE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQzdELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzlELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUMsdUJBQXVCLEVBQUMsTUFBTSxtQ0FBbUMsQ0FBQztBQUUxRSxNQUFNLE9BQU8sWUFBWTtJQXNCdkI7UUFyQlEsZ0JBQVcsR0FBYSxJQUFJLFFB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QUFDO0lBUU8sYUFBYSxDQUFDLE9BQWUsRUFBRSxvQkFBNkIsRUFBRSwyQkFBb0M7UUFDeEcsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDcEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUM7UUFDM0IsSUFBSSxDQUFDLGtCQUFrQixHQUFHLG9CQUFvQixDQUFDO1FBQy9DLElBQUksQ0FBQyx5QkFBeUIsR0FBRywyQkFBMkIsQ0FBQztJQUMvRCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0FwcGxpY2F0aW9uRXhjZXB0aW9uLCBFeGNlcHRpb24sIExpc3QsIE5TdHJpbmcsIFJlZlBhcmFtLCBTdHJpbmdCdWlsZGVyLCBpc051bGxPclVuZGVmaW5lZH0gZnJvbSBcIkBtYWdpYy14cGEvbXNjb3JlbGliXCI7XHJcbmltcG9ydCB7XHJcbiAgQnJrU2NvcGUsXHJcbiAgQ29uc3RhbnRzLFxyXG4gIEludGVybmFsSW50ZXJmYWNlLFxyXG4gIExvZ2dlcixcclxuICBMb2dnZXJfTG9nTGV2ZWxzLFxyXG4gIFN0b3JhZ2VBdHRyaWJ1dGUsXHJcbiAgU3RvcmFnZUF0dHJpYnV0ZUNoZWNrLFxyXG4gIFhNTENvbnN0YW50cyxcclxuICBYbWxQYXJzZXJcclxufSBmcm9tIFwiQG1hZ2ljLXhwYS91dGlsc1wiO1xyXG5pbXBvcnQge0V4cFZhbH0gZnJvbSBcIkBtYWdpYy14cGEvZ3VpXCI7XHJcbmltcG9ydCB7RXZlbnR9IGZyb20gXCIuL0V2ZW50XCI7XHJcbmltcG9ydCB7RmllbGRCYXNlfSBmcm9tIFwiLi4vZGF0YS9GaWVsZEJhc2VcIjtcclxuaW1wb3J0IHtPcGVyYXRpb25UYWJsZX0gZnJvbSBcIi4uL3J0L09wZXJhdGlvblRhYmxlXCI7XHJcbmltcG9ydCB7QXJndW1lbnR9IGZyb20gXCIuLi9ydC9Bcmd1bWVudFwiO1xyXG5pbXBvcnQge0FyZ3VtZW50c0xpc3R9IGZyb20gXCIuLi9ydC9Bcmd1bWVudHNMaXN0XCI7XHJcbmltcG9ydCB7TWdDb250cm9sfSBmcm9tIFwiLi4vZ3VpL01nQ29udHJvbFwiO1xyXG5pbXBvcnQge09wZXJhdGlvbn0gZnJvbSBcIi4uL3J0L09wZXJhdGlvblwiO1xyXG5pbXBvcnQge0Zsb3dNb25pdG9yUXVldWV9IGZyb20gXCIuLi91dGlsL0Zsb3dNb25pdG9yUXVldWVcIjtcclxuaW1wb3J0IHtNR0RhdGF9IGZyb20gXCIuLi90YXNrcy9NR0RhdGFcIjtcclxuaW1wb3J0IHtTZXJ2ZXJFcnJvcn0gZnJvbSBcIi4uL3JlbW90ZS9TZXJ2ZXJFcnJvclwiO1xyXG5pbXBvcnQge1J1blRpbWVFdmVudH0gZnJvbSBcIi4vUnVuVGltZUV2ZW50XCI7XHJcbmltcG9ydCB7TWdGb3JtfSBmcm9tIFwiLi4vZ3VpL01nRm9ybVwiO1xyXG5pbXBvcnQge1llc05vRXhwfSBmcm9tIFwiLi4vZXhwL1llc05vRXhwXCI7XHJcbmltcG9ydCB7VGFza30gZnJvbSBcIi4uL3Rhc2tzL1Rhc2tcIjtcclxuaW1wb3J0IHtEYXRhVmlld30gZnJvbSBcIi4uL2RhdGEvRGF0YVZpZXdcIjtcclxuaW1wb3J0IHtDb25zdEludGVyZmFjZX0gZnJvbSBcIi4uL0NvbnN0SW50ZXJmYWNlXCI7XHJcbmltcG9ydCB7Rmxvd01vbml0b3JJbnRlcmZhY2V9IGZyb20gXCIuLi9GbG93TW9uaXRvckludGVyZmFjZVwiO1xyXG5pbXBvcnQgeyBMYXN0Rm9jdXNlZE1hbmFnZXIgfSBmcm9tIFwiLi4vcnQvTGFzdEZvY3VzZWRNYW5hZ2VyXCI7XHJcbmltcG9ydCB7IEFjY2Vzc0hlbHBlciB9IGZyb20gXCIuLi9BY2Nlc3NIZWxwZXJcIjtcclxuaW1wb3J0IHtSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvcn0gZnJvbSBcIi4uL3JlbW90ZS9SZW1vdGVDb21tYW5kc1Byb2Nlc3NvclwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEV2ZW50SGFuZGxlciB7XHJcbiAgcHJpdmF0ZSBfZW5hYmxlZEV4cDogWWVzTm9FeHAgPSBuZXcgWWVzTm9FeHAodHJ1ZSk7IC8vIGRlZmF1bHQgaXMgdHJ1ZSBhbHdheXNcclxuICBwcml2YXRlIF9vcGVyYXRpb25UYWI6IE9wZXJhdGlvblRhYmxlID0gbnVsbDtcclxuICBwcml2YXRlIF9wcm9wYWdhdGVFeHA6IFllc05vRXhwID0gbmV3IFllc05vRXhwKHRydWUpO1xyXG4gIHByaXZhdGUgX2lzSGFuZGxlck9uRm9ybTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2N0cmw6IE1nQ29udHJvbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfY3RybE5hbWU6IHN0cmluZyA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfZHZMZW46IG51bWJlciA9IDA7IC8vIFRoZSDigJxkdnBvc8KBRWNvbnRhaW5zIHRoZSBudW1iZXIgb2YgZmllbGRzIHNlbGVjdGVkIGluIHRoZSBoYW5kbGVyXHJcbiAgcHJpdmF0ZSBfZHZQb3M6IG51bWJlciA9IDA7IC8vIGFuZCB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGZpZWxkIG9mIGl0IGluIHRoZSBEYXRhdmlldy5cclxuICBwcml2YXRlIF9ldnQ6IEV2ZW50ID0gbnVsbDtcclxuICBwcml2YXRlIF9oYW5kbGVkQnlDbGllbnQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9oYW5kbGVyRmxkOiBGaWVsZEJhc2UgPSBudWxsO1xyXG4gIHByaXZhdGUgX2hhc1BhcmFtZXRlcnM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9pZDogbnVtYmVyID0gMDtcclxuICBwcml2YXRlIF9sZXZlbDogc3RyaW5nID0gJ1xcMCc7IC8vIENvbnRyb2wgfCBIYW5kbGVyIHwgUmVjb3JkIHwgVGFzayB8IFZhcmlhYmxlXHJcbiAgcHJpdmF0ZSBfc2NvcGU6IEJya1Njb3BlID0gbnVsbDsgLy8gVGFza3xTdWJ0YXNrfEdsb2JhbFxyXG4gIHByaXZhdGUgX3Rhc2s6IFRhc2sgPSBudWxsO1xyXG4gIHByaXZhdGUgX3Rhc2tNZ2RJRDogbnVtYmVyID0gLTE7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBDVE9SXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHRoaXMuX29wZXJhdGlvblRhYiA9IG5ldyBPcGVyYXRpb25UYWJsZSgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0Q3RybE5hbWUoKSA6IHN0cmluZ3tcclxuICAgIHJldHVybiB0aGlzLl9jdHJsTmFtZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwYXJzZSB0aGUgZXZlbnQgaGFuZGxlciBhbmQgaXRzIHN1Yi1zdHJ1Y3R1cmVzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBmaWxsRGF0YSh0YXNrUmVmOiBUYXNrLCBwYXJzZXI6IFhtbFBhcnNlcik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3Rhc2sgPT09IG51bGwpIHtcclxuICAgICAgdGhpcy5fdGFzayA9IHRhc2tSZWY7XHJcbiAgICAgIHRoaXMuX3Rhc2tNZ2RJRCA9IHRoaXMuX3Rhc2suZ2V0TWdkSUQoKTtcclxuICAgIH1cclxuXHJcbiAgICB3aGlsZSAodGhpcy5pbml0SW5uZXJPYmplY3RzKHBhcnNlciwgcGFyc2VyLmdldE5leHRUYWcoKSkpIHtcclxuICAgIH1cclxuICAgIGxldCBkYXRhVmlldzogRGF0YVZpZXcgPSA8RGF0YVZpZXc+dGhpcy5fdGFzay5EYXRhVmlldztcclxuICAgIHRoaXMuX2hhc1BhcmFtZXRlcnMgPSBkYXRhVmlldy5QYXJhbWV0ZXJzRXhpc3QodGhpcy5fZHZQb3MsIHRoaXMuX2R2TGVuKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBpbml0aWFsaXppbmcgb2YgaW5uZXIgb2JqZWN0c1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBpbml0SW5uZXJPYmplY3RzKHBhcnNlcjogWG1sUGFyc2VyLCBmb3VuZFRhZ05hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG5cclxuICAgIGlmIChmb3VuZFRhZ05hbWUgPT09IG51bGwpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBpZiAoZm91bmRUYWdOYW1lID09PSBDb25zdEludGVyZmFjZS5NR19UQUdfSEFORExFUilcclxuICAgICAgdGhpcy5pbml0SW5uZXJFbGVtZW50cyhwYXJzZXIsIHRoaXMuX3Rhc2spO1xyXG5cclxuICAgIGVsc2UgaWYgKGZvdW5kVGFnTmFtZSA9PT0gQ29uc3RJbnRlcmZhY2UuTUdfVEFHX09QRVIpXHJcbiAgICAgIHRoaXMuX29wZXJhdGlvblRhYi5maWxsRGF0YSh0aGlzLl90YXNrLCB0aGlzLCBwYXJzZXIpO1xyXG5cclxuICAgIGVsc2UgaWYgKGZvdW5kVGFnTmFtZSA9PT0gQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0VWRU5UICYmIHRoaXMuX2V2dCA9PT0gbnVsbCkge1xyXG4gICAgICB0aGlzLl9ldnQgPSBuZXcgRXZlbnQoKTtcclxuICAgICAgdGhpcy5fZXZ0LmZpbGxEYXRhKHBhcnNlciwgdGhpcy5fdGFzayk7XHJcbiAgICAgIGlmICh0aGlzLl9ldnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX1RJTUVSIHx8XHJcbiAgICAgICAgKHRoaXMuX2V2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfVVNFUiAmJiB0aGlzLl9ldnQuZ2V0VXNlckV2ZW50VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX1RJTUVSKSlcclxuICAgICAgICB0aGlzLl90YXNrLmdldE1HRGF0YSgpLmFkZFRpbWVySGFuZGxlcih0aGlzKTtcclxuXHJcbiAgICAgIC8vIGZvciBlbmFibGUgTUdfQUNUX1pPT00gYWN0aW9uXHJcbiAgICAgIC8vIDEuIGhhbmRsZXIgb24gem9vbSBhY3Rpb24uXHJcbiAgICAgIC8vIDIuIGhhbmRsZXIgb24gYSB1c2VyIGRlZmluZWQgaGFuZGxlciB3aXRoIGEgdHJpZ2dlciBvZiB6b29tIGFjdGlvbi5cclxuICAgICAgaWYgKCgodGhpcy5fZXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9JTlRFUk5BTCAmJiB0aGlzLl9ldnQuZ2V0SW50ZXJuYWxDb2RlKCkgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9aT09NKSB8fCAodGhpcy5fZXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9VU0VSICYmIHRoaXMuX2V2dC5nZXRVc2VyRXZlbnQoKSAhPT0gbnVsbCAmJiB0aGlzLl9ldnQuZ2V0VXNlckV2ZW50VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0lOVEVSTkFMICYmIHRoaXMuX2V2dC5nZXRVc2VyRXZlbnQoKS5nZXRJbnRlcm5hbENvZGUoKSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1pPT00pKSAmJiAhdGhpcy5fdGFzay5nZXRFbmFibGVab29tSGFuZGxlcigpKSB7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9oYW5kbGVyRmxkICE9PSBudWxsKVxyXG4gICAgICAgICAgdGhpcy5faGFuZGxlckZsZC5zZXRIYXNab29tSGFuZGxlcigpO1xyXG5cclxuICAgICAgICBlbHNlIGlmICh0aGlzLl9jdHJsICE9PSBudWxsKVxyXG4gICAgICAgICAgdGhpcy5fY3RybC5IYXNab29tSGFuZGxlciA9IHRydWU7XHJcblxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHRoaXMuX3Rhc2suc2V0RW5hYmxlWm9vbUhhbmRsZXIoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoZm91bmRUYWdOYW1lID09PSAnLycgKyBDb25zdEludGVyZmFjZS5NR19UQUdfSEFORExFUikge1xyXG4gICAgICBwYXJzZXIuc2V0Q3VyckluZGV4MkVuZE9mVGFnKCk7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKFwidGhlcmUgaXMgbm8gc3VjaCB0YWcgaW4gRXZlbnRIYW5kbGVyLmluaXRJbm5lck9iamVjdHMoKSBcIiArIGZvdW5kVGFnTmFtZSk7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEluaXRpYWxpemluZyBvZiBpbm5lciBhdHRyaWJ1dGVzIG9mIDxoYW5kbGVyPiB0YWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFza1JlZlwiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBpbml0SW5uZXJFbGVtZW50cyhwYXJzZXI6IFhtbFBhcnNlciwgdGFza1JlZjogVGFzayk6IHZvaWQge1xyXG4gICAgbGV0IGVuZENvbnRleHQ6IG51bWJlciA9IHBhcnNlci5nZXRYTUxkYXRhKCkuaW5kZXhPZiggWE1MQ29uc3RhbnRzLlRBR19DTE9TRSwgcGFyc2VyLmdldEN1cnJJbmRleCgpKTtcclxuICAgIGlmIChlbmRDb250ZXh0ICE9PSAtMSAmJiBlbmRDb250ZXh0IDwgcGFyc2VyLmdldFhNTGRhdGEoKS5sZW5ndGgpIHtcclxuICAgICAgLy8gbGFzdCBwb3NpdGlvbiBvZiBpdHMgdGFnXHJcbiAgICAgIGxldCB0YWc6IHN0cmluZyA9IHBhcnNlci5nZXRYTUxzdWJzdHJpbmcoZW5kQ29udGV4dCk7XHJcbiAgICAgIHBhcnNlci5hZGQyQ3VyckluZGV4KHRhZy5pbmRleE9mKCBDb25zdEludGVyZmFjZS5NR19UQUdfSEFORExFUikgKyBDb25zdEludGVyZmFjZS5NR19UQUdfSEFORExFUi5sZW5ndGgpO1xyXG5cclxuICAgICAgbGV0IHRva2Vuc1ZlY3RvcjogTGlzdDxzdHJpbmc+ID0gWG1sUGFyc2VyLmdldFRva2VucyhwYXJzZXIuZ2V0WE1Mc3Vic3RyaW5nKGVuZENvbnRleHQpLCBYTUxDb25zdGFudHMuWE1MX0FUVFJfREVMSU0pO1xyXG4gICAgICB0aGlzLmluaXRFbGVtZW50cyh0b2tlbnNWZWN0b3IsIHRhc2tSZWYpO1xyXG4gICAgICBwYXJzZXIuc2V0Q3VyckluZGV4KCsrZW5kQ29udGV4dCk7IC8vIHRvIGRlbGV0ZSBcIj5cIiB0b29cclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKFwiaW4gSGFuZGxlci5GaWxsRGF0YSgpIG91dCBvZiBzdHJpbmcgYm91bmRzXCIpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIE1ha2UgaW5pdGlhbGl6YXRpb24gb2YgcHJpdmF0ZSBlbGVtZW50cyBieSBmb3VuZCB0b2tlbnNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidG9rZW5zVmVjdG9yXCI+Zm91bmQgdG9rZW5zLCB3aGljaCBjb25zaXN0IGF0dHJpYnV0ZS92YWx1ZSBvZiBldmVyeSBmb3VuZFx0ZWxlbWVudCA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFza1JlZlwiPiA8L3BhcmFtPlxyXG4gIHByaXZhdGUgaW5pdEVsZW1lbnRzKHRva2Vuc1ZlY3RvcjogTGlzdDxzdHJpbmc+LCB0YXNrUmVmOiBUYXNrKTogdm9pZCB7XHJcbiAgICBmb3IgKGxldCBqOiBudW1iZXIgPSAwOyBqIDwgdG9rZW5zVmVjdG9yLmxlbmd0aDsgaiArPSAyKSB7XHJcbiAgICAgIGxldCBhdHRyaWJ1dGU6IHN0cmluZyA9ICh0b2tlbnNWZWN0b3IuZ2V0X0l0ZW0oaikpO1xyXG4gICAgICBsZXQgdmFsdWVTdHI6IHN0cmluZyA9ICh0b2tlbnNWZWN0b3IuZ2V0X0l0ZW0oaiArIDEpKTtcclxuXHJcbiAgICAgIHN3aXRjaCAoYXR0cmlidXRlKSB7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0hBTkRMRURCWTpcclxuICAgICAgICAgIHRoaXMuX2hhbmRsZWRCeUNsaWVudCA9ICh2YWx1ZVN0ci50b1VwcGVyQ2FzZSgpID09PSBcIkNcIi50b1VwcGVyQ2FzZSgpKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX0lEOlxyXG4gICAgICAgICAgdGhpcy5faWQgPSBYbWxQYXJzZXIuZ2V0SW50KHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfTEVWRUw6XHJcbiAgICAgICAgICB0aGlzLl9sZXZlbCA9IHZhbHVlU3RyWzBdO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9PQkpFQ1Q6XHJcbiAgICAgICAgICBsZXQgdmFsdWVTdHJpbmdDdHJsTmFtZTogc3RyaW5nID0gWG1sUGFyc2VyLnVuZXNjYXBlKHZhbHVlU3RyKTtcclxuICAgICAgICAgIHRoaXMuX2N0cmxOYW1lID0gWG1sUGFyc2VyLnVuZXNjYXBlKHZhbHVlU3RyaW5nQ3RybE5hbWUpLnRvVXBwZXJDYXNlKCk7IC8vIHJlbGV2YW50IGZvciB1c2VyIGhhbmRsZXJzIG9ubHlcclxuICAgICAgICAgIHRoaXMuY2FsY3VsYXRlQ3RybEZyb21Db250cm9sTmFtZSh0YXNrUmVmKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfVkFSSUFCTEU6XHJcbiAgICAgICAgICB0aGlzLl9oYW5kbGVyRmxkID0gPEZpZWxkQmFzZT50aGlzLl90YXNrLkRhdGFWaWV3LmdldEZpZWxkKFhtbFBhcnNlci5nZXRJbnQodmFsdWVTdHIpKTtcclxuICAgICAgICAgIHRoaXMuX2hhbmRsZXJGbGQuc2V0SGFzQ2hhbmdlRXZlbnQoKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfU0NPUEU6XHJcbiAgICAgICAgICB0aGlzLl9zY29wZSA9IDxCcmtTY29wZT52YWx1ZVN0clswXTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfUFJPUEFHQVRFOlxyXG4gICAgICAgICAgdGhpcy5fcHJvcGFnYXRlRXhwLnNldFZhbCh0YXNrUmVmLCB2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0VOQUJMRUQ6XHJcbiAgICAgICAgICB0aGlzLl9lbmFibGVkRXhwLnNldFZhbCh0YXNrUmVmLCB2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0RWUE9TOlxyXG4gICAgICAgICAgbGV0IGk6IG51bWJlciA9IHZhbHVlU3RyLmluZGV4T2YoXCIsXCIpO1xyXG4gICAgICAgICAgaWYgKGkgPiAtMSkge1xyXG4gICAgICAgICAgICB0aGlzLl9kdkxlbiA9IFhtbFBhcnNlci5nZXRJbnQodmFsdWVTdHIuc3Vic3RyKDAsIGkpKTtcclxuICAgICAgICAgICAgdGhpcy5fZHZQb3MgPSBYbWxQYXJzZXIuZ2V0SW50KHZhbHVlU3RyLnN1YnN0cihpICsgMSkpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBmbGRJZHg6IG51bWJlciA9IHRoaXMuX2R2UG9zOyBmbGRJZHggPCB0aGlzLl9kdlBvcyArIHRoaXMuX2R2TGVuOyBmbGRJZHgrKykge1xyXG4gICAgICAgICAgICAgIGxldCBmaWVsZDogRmllbGRCYXNlID0gKDxGaWVsZEJhc2U+dGhpcy5fdGFzay5EYXRhVmlldy5nZXRGaWVsZChmbGRJZHgpKTtcclxuICAgICAgICAgICAgICBmaWVsZC5Jc0V2ZW50SGFuZGxlckZpZWxkID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9IQU5ETEVSX09ORk9STTpcclxuICAgICAgICAgIHRoaXMuX2lzSGFuZGxlck9uRm9ybSA9IFhtbFBhcnNlci5nZXRCb29sZWFuKHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKFwiVGhlcmUgaXMgbm8gc3VjaCB0YWcgaW4gRXZlbnRIYW5kbGVyIGNsYXNzLiBJbnNlcnQgY2FzZSB0byBFdmVudEhhbmRsZXIuaW5pdEVsZW1lbnRzIGZvciBcIiArIGF0dHJpYnV0ZSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuICAvLy8gY2FsY3VsYXRlIHRoZSBjdHJsIHByb3BlcnR5IGZyb20gY3RybCBuYW1lIHByb3BlcnR5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0YXNrUmVmXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ2YWx1ZVN0cmluZ0N0cmxOYW1lXCI+PC9wYXJhbT5cclxuXHJcbiAgY2FsY3VsYXRlQ3RybEZyb21Db250cm9sTmFtZSh0YXNrUmVmOiBUYXNrKTogdm9pZCB7XHJcbiAgICBpZiAoIU5TdHJpbmcuSXNOdWxsT3JFbXB0eSh0aGlzLl9jdHJsTmFtZSkpIHtcclxuICAgICAgdGhpcy5fY3RybCA9ICgodGFza1JlZi5nZXRGb3JtKCkgIT09IG51bGwpID8gKDxNZ0Zvcm0+dGFza1JlZi5nZXRGb3JtKCkpLmdldEN0cmxCeUN0cmxOYW1lKHRoaXMuX2N0cmxOYW1lKSA6IG51bGwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNoZWNrIGlmIHRoaXMgZXZlbnQgaGFuZGxlciBpcyBhIHNwZWNpZmljIGhhbmRsZXIgb2YgYW4gZXZlbnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicnRFdnRcIj50aGUgZXZlbnQgdG8gY2hlY2s8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gYm9vbGVhbiB0cnVlIGlmIHRoZSBldmVudHMgbWF0Y2g8L3JldHVybnM+XHJcbiAgaXNTcGVjaWZpY0hhbmRsZXJPZihydEV2dDogUnVuVGltZUV2ZW50KTogYm9vbGVhbiB7XHJcblxyXG4gICAgaWYgKHRoaXMuX2N0cmwgPT09IG51bGwgJiYgdGhpcy5fY3RybE5hbWUgPT09IG51bGwgJiYgdGhpcy5faGFuZGxlckZsZCA9PT0gbnVsbCAmJiAhdGhpcy5faXNIYW5kbGVyT25Gb3JtKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgLy8gY2hlY2sgdGhlIHZhbGlkaXR5IG9mIHRoZSBzY29wZVxyXG4gICAgaWYgKHRoaXMuX3Njb3BlID09PSBCcmtTY29wZS5UYXNrICYmIHRoaXMuX3Rhc2sgIT09IHJ0RXZ0LmdldFRhc2soKSlcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIC8vIGlmIHRoZSBoYW5kbGVycyBldmVudCBhbmQgdGhlIGNoZWNrZWQgZXZlbnQgYXJlIGVxdWFsIGFuZFxyXG4gICAgLy8gdGhlIGhhbmRsZXIgaGFuZGxlcyB0aGUgY29udHJvbCBhdHRhY2hlZCB0byB0aGUgY2hlY2tlZCBldmVudCwgcmV0dXJuIHRydWVcclxuICAgIC8vIGNvbXBhcmUgY29udHJvbCBuYW1lIHdpdGggdGhlIG5hbWUgb2YgdGhlIGNvbnRyb2wgaW4gdGhlIGV2ZW50XHJcbiAgICBpZiAodGhpcy5fZXZ0LmVxdWFscyhydEV2dCkpIHtcclxuICAgICAgLy8gVmFyaWFibGUgY2hhbmdlIGhhbmRsZXJzIGRvIG5vdCBoYXZlIGNvbnRyb2wgbmFtZXMuIE9ubHkgZmllbGRzIG5lZWQgdG8gYmUgY29tcGFyZWRcclxuICAgICAgaWYgKHRoaXMuX2hhbmRsZXJGbGQgIT09IG51bGwpIHtcclxuICAgICAgICByZXR1cm4gKHRoaXMuX2hhbmRsZXJGbGQgPT09IHJ0RXZ0LmdldEZsZCgpKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAocnRFdnQuQ29udHJvbCAhPT0gbnVsbCAmJiAhdGhpcy5faXNIYW5kbGVyT25Gb3JtKSB7XHJcbiAgICAgICAgbGV0IGV2ZW50Q3RybE5hbWU6IHN0cmluZyA9IHJ0RXZ0LkNvbnRyb2wuZ2V0Q29udHJvbE5hbWVGb3JIYW5kbGVyU2VhcmNoKCk7XHJcbiAgICAgICAgaWYgKGV2ZW50Q3RybE5hbWUgIT09IG51bGwgJiYgdGhpcy5fY3RybE5hbWUudG9Mb3dlckNhc2UoKSA9PT0gZXZlbnRDdHJsTmFtZS50b0xvd2VyQ2FzZSgpKVxyXG4gICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAocnRFdnQuQ29udHJvbCA9PT0gbnVsbCAmJiB0aGlzLl9pc0hhbmRsZXJPbkZvcm0pXHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNoZWNrIGlmIHRoaXMgZXZlbnQgaGFuZGxlciBpcyBhIG5vbi1zcGVjaWZpYyBvciBnbG9iYWwgaGFuZGxlciBvZiBhbiBldmVudFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJydEV2dFwiPnRoZSBldmVudCB0byBjaGVja1xyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gYm9vbGVhbiB0cnVlIGlmIHRoZSBldmVudHMgbWF0Y2hcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIGlzTm9uU3BlY2lmaWNIYW5kbGVyT2YocnRFdnQ6IFJ1blRpbWVFdmVudCk6IGJvb2xlYW4ge1xyXG5cclxuICAgIC8vIGlmIHRoZSBoYW5kbGVyIGhhbmRsZXMgYSBjb250cm9sIHJldHVybiBmYWxzZVxyXG4gICAgaWYgKHRoaXMuX2N0cmwgIT09IG51bGwgfHwgdGhpcy5fY3RybE5hbWUgIT09IG51bGwgfHwgdGhpcy5faGFuZGxlckZsZCAhPT0gbnVsbCB8fCB0aGlzLl9pc0hhbmRsZXJPbkZvcm0pXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIC8vIGNoZWNrIHRoZSB2YWxpZGl0eSBvZiB0aGUgc2NvcGVcclxuICAgIGlmICh0aGlzLl9zY29wZSA9PT0gQnJrU2NvcGUuVGFzayAmJiAgdGhpcy5fdGFzayAhPT0gcnRFdnQuZ2V0VGFzaygpICYmIHJ0RXZ0LmdldFR5cGUoKSAhPT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9USU1FUilcclxuICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgaWYgKHRoaXMuX3Njb3BlID09PSBCcmtTY29wZS5HbG9iYWwgJiYgdGhpcy5fdGFzayAhPT0gcnRFdnQuZ2V0VGFzaygpKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgLy8gaWYgdGhlIGhhbmRsZXJzIGV2ZW50IGFuZCB0aGUgY2hlY2tlZCBldmVudCBhcmUgZXF1YWwgcmV0dXJuIHRydWVcclxuICAgIGlmICh0aGlzLl9ldnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX1VTRVIgJiYgdGhpcy5fZXZ0LmdldFVzZXJFdmVudFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9OT1RJTklURUQpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICB0aGlzLl9ldnQuZmluZFVzZXJFdmVudCgpO1xyXG4gICAgICB9XHJcbiAgICAgIGNhdGNoIChhcHBsaWNhdGlvbkV4Y2VwdGlvbikge1xyXG4gICAgICAgIGlmIChhcHBsaWNhdGlvbkV4Y2VwdGlvbiBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uRXhjZXB0aW9uKSB7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHRocm93IGFwcGxpY2F0aW9uRXhjZXB0aW9uO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5fZXZ0LmVxdWFscyhydEV2dCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2hlY2sgaWYgdGhpcyBldmVudCBoYW5kbGVyIGlzIGEgZ2xvYmFsIGhhbmRsZXIgb2YgYW4gZXZlbnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicnRFdnRcIj50aGUgZXZlbnQgdG8gY2hlY2tcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IGJvb2xlYW4gdHJ1ZSBpZiB0aGUgZXZlbnRzIG1hdGNoXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBpc0dsb2JhbEhhbmRsZXJPZihydEV2dDogUnVuVGltZUV2ZW50KTogYm9vbGVhbiB7XHJcbiAgICAvLyBjaGVjayB0aGUgdmFsaWRpdHkgb2YgdGhlIHNjb3BlXHJcbiAgICBpZiAodGhpcy5fc2NvcGUgIT09IEJya1Njb3BlLkdsb2JhbClcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIC8vIGlmIHRoZSBoYW5kbGVyIGhhbmRsZXMgYSBjb250cm9sIHJldHVybiBmYWxzZVxyXG4gICAgaWYgKHRoaXMuX2N0cmwgIT0gbnVsbCB8fCB0aGlzLl9jdHJsTmFtZSAhPSBudWxsIHx8IHRoaXMuX2hhbmRsZXJGbGQgIT0gbnVsbCB8fCB0aGlzLl9pc0hhbmRsZXJPbkZvcm0pXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAvLyBpZiB0aGUgaGFuZGxlcnMgZXZlbnQgYW5kIHRoZSBjaGVja2VkIGV2ZW50IGFyZSBlcXVhbCwgcmV0dXJuIHRydWVcclxuICAgIHJldHVybiB0aGlzLl9ldnQuZXF1YWxzKHJ0RXZ0KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjaGVjayBpZiB0aGlzIGV2ZW50IGhhbmRsZXIgaXMgYSBzcGVjaWZpYyBnbG9iYWwgaGFuZGxlciBvZiBhbiBldmVudFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJydEV2dFwiPnRoZSBldmVudCB0byBjaGVja1xyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gYm9vbGVhbiB0cnVlIGlmIHRoZSBldmVudHMgbWF0Y2hcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIGlzR2xvYmFsU3BlY2lmaWNIYW5kbGVyT2YocnRFdnQ6IFJ1blRpbWVFdmVudCk6IGJvb2xlYW4ge1xyXG4gICAgLy8gY2hlY2sgdGhlIHZhbGlkaXR5IG9mIHRoZSBzY29wZVxyXG4gICAgaWYgKHRoaXMuX3Njb3BlICE9PSBCcmtTY29wZS5HbG9iYWwpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBpZiAodGhpcy5fY3RybCA9PSBudWxsICYmIHRoaXMuX2N0cmxOYW1lID09IG51bGwgJiYgdGhpcy5faGFuZGxlckZsZCA9PSBudWxsKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgLy8gaWYgdGhlIGhhbmRsZXJzIGV2ZW50IGFuZCB0aGUgY2hlY2tlZCBldmVudCBhcmUgZXF1YWwsIHJldHVybiB0cnVlXHJcbiAgICByZXR1cm4gKHRoaXMuX2N0cmxOYW1lICE9IG51bGwgJiYgdGhpcy5fZXZ0LmVxdWFscyhydEV2dCkgJiZcclxuICAgICAgTlN0cmluZy5FcXVhbHModGhpcy5fY3RybE5hbWUsIHJ0RXZ0LkNvbnRyb2wuTmFtZSwgdHJ1ZSkpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGV4ZWN1dGUgdGhlIGV2ZW50IGhhbmRsZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicnRFdnRcIj50aGUgZXZlbnQgb24gd2hpY2ggdGhlIGhhbmRsZXIgaXMgZXhlY3V0ZWRcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJldHVybmVkRnJvbVNlcnZlclwiPmluZGljYXRlcyB3aGV0aGVyIHdlIHJldHVybmVkIGZyb20gdGhlIHNlcnZlciBhbmRcclxuICAvLy8gICB0aGVyZWZvcmUgbWlnaHQgbm90IG5lZWQgdG8gY2hlY2sgdGhlIGVuYWJsZWQgY29uZGl0aW9uXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJlbmFibGVkQ25kQ2hlY2tlZEFuZFRydWVcIj5pbmRpY2F0ZXMgdGhhdCB0aGUgZW5hYmxlZCBjb25kaXRpb24gd2FzIGFscmVhZHkgY2hlY2tlZCBhbmQgdGhlcmUncyBub1xyXG4gIC8vLyAgIG5lZWQgdG8gcmUtY2hlY2sgaXQgKGJlY2F1c2UgaXQgbWlnaHQgYmUgZmFsc2Ugbm93LCBidXQgd2Ugc3RpbGwgbmVlZCB0b1xyXG4gIC8vLyAgIGV4ZWN1dGUgdGhlIGhhbmRsZXIpXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBib29sZWFuIHRoaXMgaXMgdGhlIHJldHVybiBjb2RlIG9mIHRoZSBoYW5kbGVyLCBpZiB0cnVlIHRoZW4gdGhlIGV2ZW50c1xyXG4gIC8vLyAgIG1hbmFnZXIgbXVzdCBjb250aW51ZSBzZWFyY2hpbmcgZm9yIHRoZSBuZXh0IGV2ZW50IGhhbmRsZXIgZm9yIHRoZSBldmVudFxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiBhc3luYyBleGVjdXRlKHJ0RXZ0OiBSdW5UaW1lRXZlbnQsIHJldHVybmVkRnJvbVNlcnZlcjogYm9vbGVhbiwgZW5hYmxlZENuZENoZWNrZWRBbmRUcnVlOiBib29sZWFuKTogUHJvbWlzZTxSZXRWYWxzPiB7XHJcblxyXG4gICAgbGV0IGN0cmw6IE1nQ29udHJvbCA9IG51bGw7XHJcbiAgICBsZXQgcmV0VmFsOiBib29sZWFuO1xyXG4gICAgbGV0IGRlcHRoOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IHRhc2tFbmQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBicmtMZXZlbDogc3RyaW5nID0gdGhpcy5fdGFzay5nZXRCcmtMZXZlbCgpO1xyXG4gICAgbGV0IGJya0xldmVsSW5kZXg6IG51bWJlciA9IHRoaXMuX3Rhc2suZ2V0QnJrTGV2ZWxJbmRleCgpO1xyXG4gICAgbGV0IGluaXRpYWxMb29wU3RhY2tTaXplOiBudW1iZXIgPSAwO1xyXG5cclxuICAgIC8vIHNldCBsZXZlbCBmb3IgTEVWRUwgZnVuY3Rpb25cclxuICAgIGlmICh0YXNrRW5kICE9PSBudWxsICYmIHRoaXMuX2V2dC5nZXRUeXBlKCkgIT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfRVhQUkVTU0lPTiAmJiAodGhpcy5fZXZ0LmdldFR5cGUoKSAhPT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9VU0VSIHx8ICh0aGlzLl9ldnQuZ2V0VXNlckV2ZW50KCkuZ2V0VHlwZSgpICE9PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0VYUFJFU1NJT04gJiYgdGhpcy5fZXZ0LmdldFVzZXJFdmVudCgpLmdldFR5cGUoKSAhPT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9USU1FUikpKSB7XHJcbiAgICAgIC8vIFVubGlrZSBhIGhhbmRsZXIsIHRoZSB1c2VyIGZ1bmN0aW9uIHNob3VsZCBub3QgY2hhbmdlIHRoZSBsZXZlbCBvZiB0aGUgdGFzay5cclxuICAgICAgaWYgKHRoaXMuX2V2dC5nZXRUeXBlKCkgIT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfVVNFUl9GVU5DKVxyXG4gICAgICAgIHRoaXMuX3Rhc2suc2V0QnJrTGV2ZWwocnRFdnQuZ2V0QnJrTGV2ZWwoKSwgdGhpcy5faWQpO1xyXG5cclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgdGhpcy5fdGFzay5zZXRCcmtMZXZlbCh0aGlzLl9ldnQuZ2V0QnJrTGV2ZWwoKSwgdGhpcy5faWQpO1xyXG5cclxuICAgIGxldCBhcmdzOiBBcmd1bWVudHNMaXN0ID0gcnRFdnQuZ2V0QXJnTGlzdCgpO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGxldCBmbG93TW9uaXRvcjogRmxvd01vbml0b3JRdWV1ZSA9IEZsb3dNb25pdG9yUXVldWUuSW5zdGFuY2U7XHJcblxyXG4gICAgICAvLyBSb3V0ZSBldmVudCBjYW4gb25seSBiZSBoYW5kbGVkIGluIGEgdGFzayB3aGljaCBpcyBvcGVuZWQgYXMgcm91dGVyIGxpbmsgb3IgdGhlIHJvb3QgdGFzay5cclxuICAgICAgaWYgKHJ0RXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9JTlRFUk5BTCAmJiBydEV2dC5nZXRJbnRlcm5hbENvZGUoKSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1dFQkNMSUVOVF9ST1VURSkge1xyXG4gICAgICAgIGlmICghdGhpcy5fdGFzay5Jc1JvdXRlKCkgJiYgdGhpcy5fdGFzayAhPT0gQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLlN0YXJ0dXBNZ0RhdGEuZ2V0Rmlyc3RUYXNrKCkpIHtcclxuICAgICAgICAgIHJldHVybiBuZXcgUmV0VmFscyh0cnVlLCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIGNoZWNrIGlmIHRoZSBoYW5kbGVyIGlzIGVuYWJsZWQuIGlmIG5vdCwgcmV0dXJuIHRydWUgdG8gY29udGludWUgc2VhcmNoaW5nXHJcbiAgICAgIC8vIGZvciB0aGUgbmV4dCBldmVudCBoYW5kbGVyXHJcbiAgICAgIGxldCBuZXh0T3BlcklkeDogbnVtYmVyID0gLTE7XHJcbiAgICAgIGlmIChyZXR1cm5lZEZyb21TZXJ2ZXIpIHtcclxuICAgICAgICAvLyBpZiB3ZSByZXR1cm5lZCBmcm9tIHRoZSBzZXJ2ZXIgLSB3ZSBuZWVkIHRvIGNoZWNrIGlmIHRoZSBuZXh0IG9wZXJhdGlvbiBpcyBvbiB0aGUgY3VycmVudFxyXG4gICAgICAgIC8vIGhhbmRsZXIgKHVzaW5nIGEgY2FsbCB0byBnZXROZXh0T3BlcklkeCgpIHdpdGggZmFsc2UgaW4gdGhlIGNsZWFyV2hlbkZvdW5kIHBhcmFtZXRlcilcclxuICAgICAgICAvLyBhbmQgaWYgaXQgaXMgLSBkbyBub3QgY2hlY2sgdGhlIGVuYWJsZWQgY29uZGl0aW9uLCBiZWNhdXNlIGl0IG1pZ2h0IGhhdmUgY2hhbmdlZFxyXG4gICAgICAgIC8vIHNpbmNlIGl0IHdhcyBldmFsdWF0ZWQgb24gdGhlIHNlcnZlci4gd2UgbmVlZCB0byBnbyBpbnRvIHRoaXMgaGFuZGxlciBldmVuIGlmIGl0IGlzIG5vdFxyXG4gICAgICAgIC8vIGN1cnJlbnRseSBlbmFibGVkXHJcbiAgICAgICAgbmV4dE9wZXJJZHggPSBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5nZXROZXh0T3BlcklkeCh0aGlzLl9vcGVyYXRpb25UYWIuZ2V0T3BlcmF0aW9uKDApLCBmYWxzZSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG5leHRPcGVySWR4ID09PSAtMSAmJiAhZW5hYmxlZENuZENoZWNrZWRBbmRUcnVlICYmICFhd2FpdCB0aGlzLmlzRW5hYmxlZCgpKVxyXG4gICAgICAgIHJldHVybiBuZXcgUmV0VmFscyh0cnVlLCBmYWxzZSk7XHJcblxyXG4gICAgICAvLyBjaGVjayB0aGUgc2NvcGUgZm9yIEV4cHJlc3Npb24gYW5kIFRpbWVyIGhhbmRsZXJzXHJcbiAgICAgIGlmICh0aGlzLl9zY29wZSA9PT0gQnJrU2NvcGUuVGFzayAmJiAocnRFdnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX1RJTUVSIHx8IHJ0RXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9FWFBSRVNTSU9OKSkge1xyXG4gICAgICAgIGxldCBjdXJyVGFzazogVGFzayA9IExhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKTtcclxuICAgICAgICBpZiAodGhpcy5fdGFzayAhPT0gY3VyclRhc2spXHJcbiAgICAgICAgICByZXR1cm4gbmV3IFJldFZhbHModHJ1ZSwgdHJ1ZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghdGhpcy5faGFuZGxlZEJ5Q2xpZW50KSB7XHJcbiAgICAgICAgLy8gcmV0dXJuIGZhbHNlIHRvIHN0b3Agc2VhcmNoaW5nIGZvciB0aGUgbW9yZSBoYW5kbGVycyBiZWNhdXNlXHJcbiAgICAgICAgLy8gdGhlIHNlcnZlciBoYWQgdGFrZW4gY2FyZSBvZiBhbGwgb2YgdGhlbVxyXG4gICAgICAgIHJldHVybiBuZXcgUmV0VmFscyhmYWxzZSwgdHJ1ZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChydEV2dC5nZXRUeXBlKCkgIT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfVVNFUiAmJiAhYXdhaXQgdGhpcy5fZXZ0LmRhdGFFdmVudElzVHJ1ZSgpKVxyXG4gICAgICAgIHJldHVybiBuZXcgUmV0VmFscyhmYWxzZSwgdHJ1ZSk7XHJcblxyXG4gICAgICBpZiAocnRFdnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0lOVEVSTkFMICYmIHJ0RXZ0LmdldEludGVybmFsQ29kZSgpID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEFTS19TVUZGSVgpXHJcbiAgICAgICAgdGFza0VuZCA9IHRydWU7XHJcblxyXG4gICAgICBpZiAocnRFdnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0lOVEVSTkFMKSB7XHJcbiAgICAgICAgc3dpdGNoIChydEV2dC5nZXRJbnRlcm5hbENvZGUoKSkge1xyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWDpcclxuICAgICAgICAgICAgZmxvd01vbml0b3IuYWRkVGFza0Zsb3dSZWMoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgsIEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9TVEFSVCwgIHRoaXMuX3Rhc2suR2V0VGFza0RldGFpbHMoKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWDpcclxuICAgICAgICAgICAgZmxvd01vbml0b3IuYWRkVGFza0Zsb3dSZWMoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgsIEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9TVEFSVCwgIHRoaXMuX3Rhc2suR2V0VGFza0RldGFpbHMoKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfU1VGRklYOlxyXG4gICAgICAgICAgICBmbG93TW9uaXRvci5hZGRUYXNrRmxvd0N0cmwoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfU1VGRklYLCBydEV2dC5Db250cm9sLk5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbG93TW9uaXRvckludGVyZmFjZS5GTFdNVFJfU1RBUlQsICB0aGlzLl90YXNrLkdldFRhc2tEZXRhaWxzKCkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1BSRUZJWDpcclxuICAgICAgICAgICAgZmxvd01vbml0b3IuYWRkVGFza0Zsb3dDdHJsKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1BSRUZJWCwgcnRFdnQuQ29udHJvbC5OYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX1NUQVJULCAgdGhpcy5fdGFzay5HZXRUYXNrRGV0YWlscygpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVkFSSUFCTEU6XHJcbiAgICAgICAgICAgIGZsb3dNb25pdG9yLmFkZFRhc2tGbG93RmxkKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9WQVJJQUJMRSwgcnRFdnQuZ2V0RmxkKCkuZ2V0TmFtZSgpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbG93TW9uaXRvckludGVyZmFjZS5GTFdNVFJfU1RBUlQsICB0aGlzLl90YXNrLkdldFRhc2tEZXRhaWxzKCkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1ZFUklGSUNBVElPTjpcclxuICAgICAgICAgICAgZmxvd01vbml0b3IuYWRkVGFza0Zsb3dDdHJsKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1ZFUklGSUNBVElPTixcclxuICAgICAgICAgICAgICBydEV2dC5Db250cm9sLk5hbWUsIEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9TVEFSVCwgdGhpcy5fdGFzay5HZXRUYXNrRGV0YWlscygpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEFTS19QUkVGSVg6XHJcbiAgICAgICAgICAgIGZsb3dNb25pdG9yLmFkZFRhc2tGbG93UmVjKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQVNLX1BSRUZJWCwgRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX1NUQVJULCAgdGhpcy5fdGFzay5HZXRUYXNrRGV0YWlscygpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEFTS19TVUZGSVg6XHJcbiAgICAgICAgICAgIGZsb3dNb25pdG9yLmFkZFRhc2tGbG93UmVjKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQVNLX1NVRkZJWCwgRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX1NUQVJULCB0aGlzLl90YXNrLkdldFRhc2tEZXRhaWxzKCkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICBmbG93TW9uaXRvci5hZGRUYXNrRmxvd0hhbmRsZXIodGhpcy5fZXZ0LmdldEJya0xldmVsKHRydWUpLCBGbG93TW9uaXRvckludGVyZmFjZS5GTFdNVFJfU1RBUlQsIHRoaXMuX3Rhc2suR2V0VGFza0RldGFpbHMoKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlXHJcbiAgICAgICAgZmxvd01vbml0b3IuYWRkVGFza0Zsb3dIYW5kbGVyKHRoaXMuX2V2dC5nZXRCcmtMZXZlbCh0cnVlKSwgRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX1NUQVJULCB0aGlzLl90YXNrLkdldFRhc2tEZXRhaWxzKCkpO1xyXG5cclxuICAgICAgdHJ5IHtcclxuXHJcbiAgICAgICAgaWYgKHRhc2tFbmQgIT09IG51bGwpXHJcbiAgICAgICAgICBjdHJsID0gPE1nQ29udHJvbD5ydEV2dC5Db250cm9sO1xyXG5cclxuICAgICAgICBsZXQgbWdkSUQ6IG51bWJlciA9IEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5jdXJyTWdkSUQ7XHJcbiAgICAgICAgbGV0IGlzQ2hhbmdlZEN1cnJXbmQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgICAgICBsZXQgaXNDaGFuZ2VkQ3VyclduZFJlZjogUmVmUGFyYW08Ym9vbGVhbj4gPSBuZXcgUmVmUGFyYW0oaXNDaGFuZ2VkQ3VyclduZCk7XHJcblxyXG5cclxuICAgICAgICAvLyBmb3IgdGltZXIgZXZlbnRzIGNoZWNrIGlmIHRoZSB0YXNrIG9mIHRoZSBldmVudCBpcyBpbiB0aGVcclxuICAgICAgICAvLyBjdXJyZW50IHdpbmRvdyBhbmQgaWYgbm90IHRoZW4gY2hhbmdlIHRoZSBjdXJyZW50IHdpbmRvd1xyXG4gICAgICAgIC8vIHRlbXBvcmFyaWx5IHRpbGwgdGhlIGhhbmRsZXIgZmluaXNoZXNcclxuICAgICAgICBpZiAodGhpcy5fZXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9USU1FUiAmJiBtZ2RJRCAhPT0gcnRFdnQuZ2V0TWdkSUQoKSkge1xyXG4gICAgICAgICAgLy8gc2V0IG51bWJlciBvZiB3aW5kb3cgZm9yIHRpbWVyIGV2ZW50XHJcbiAgICAgICAgICBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuY3Vyck1nZElEID0gcnRFdnQuZ2V0TWdkSUQoKTtcclxuICAgICAgICAgIGlzQ2hhbmdlZEN1cnJXbmRSZWYudmFsdWUgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gcHV0IGluaXRpYWwgdmFsdWVzIHRvIHRoZSBsb2NhbCB2YXJpYWJsZXNcclxuICAgICAgICBhd2FpdCB0aGlzLnJlc2V0TG9jYWxWYXJpYWJsZXMoYXJncyk7XHJcblxyXG4gICAgICAgIGluaXRpYWxMb29wU3RhY2tTaXplID0gdGhpcy5fdGFzay5nZXRMb29wU3RhY2tTaXplKCk7XHJcbiAgICAgICAgbGV0IHJldFZhbHM6IFJldFZhbHMgPSBudWxsO1xyXG4gICAgICAgIGlmICh0aGlzLl9vcGVyYXRpb25UYWIuZ2V0U2l6ZSgpID4gMClcclxuICAgICAgICAgIHJldFZhbHMgPSBhd2FpdCB0aGlzLmV4ZWN1dGVPcGVyYXRpb25zKDAsIHRoaXMuX29wZXJhdGlvblRhYi5nZXRTaXplKCkgLSAxLCB0YXNrRW5kLCBtZ2RJRCwgZGVwdGgsIGlzQ2hhbmdlZEN1cnJXbmRSZWYsIGZhbHNlLCBmYWxzZSwgLTEpO1xyXG5cclxuICAgICAgICBpc0NoYW5nZWRDdXJyV25kID0gaXNDaGFuZ2VkQ3VyclduZFJlZi52YWx1ZTtcclxuXHJcbiAgICAgICAgaWYgKHJldFZhbHMgIT09IG51bGwpXHJcbiAgICAgICAgICByZXR1cm4gcmV0VmFscztcclxuXHJcbiAgICAgICAgLy8gY2hlY2sgdGhlIGVuZHRhc2sgY29uZGl0aW9uIG9uY2UgYWdhaW4gYXQgdGhlIGVuZCBvZiB0aGUgaGFuZGxlclxyXG4gICAgICAgIGlmICghdGFza0VuZClcclxuICAgICAgICAgIGF3YWl0IHRoaXMuX3Rhc2suZXZhbEVuZENvbmQoQ29uc3RJbnRlcmZhY2UuRU5EX0NPTkRfRVZBTF9JTU1JRElBVEUpO1xyXG5cclxuICAgICAgICAvLyBjaGFuZ2UgY3VycmVudCB3aW5kb3cgYmFjayBpZiBpdCB3YXMgY2hhbmdlZCBmb3IgVGltZXJcclxuICAgICAgICBpZiAoaXNDaGFuZ2VkQ3VyclduZCkge1xyXG4gICAgICAgICAgbGV0IG9sZE1nZDogTUdEYXRhID0gQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLmdldE1HRGF0YShtZ2RJRCk7XHJcbiAgICAgICAgICBpZiAob2xkTWdkICE9PSBudWxsICYmICFvbGRNZ2QuSXNBYm9ydGluZylcclxuICAgICAgICAgICAgQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLmN1cnJNZ2RJRCA9IG1nZElEO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICAvLyBlbmQgd2hpbGUgb3BlcmF0aW9uIGJsb2NrXHJcbiAgICAgIGNhdGNoIChleCkge1xyXG4gICAgICAgIGlmIChleCBpbnN0YW5jZW9mIFNlcnZlckVycm9yKSB7XHJcbiAgICAgICAgICBpZiAoTG9nZ2VyLkluc3RhbmNlLkxvZ0xldmVsICE9PSBMb2dnZXJfTG9nTGV2ZWxzLkJhc2ljKVxyXG4gICAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZyhleCk7XHJcbiAgICAgICAgICB0aHJvdyBleDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoZXggaW5zdGFuY2VvZiBFeGNlcHRpb24pIHtcclxuICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nKGV4KTtcclxuICAgICAgICAgIHJldHVybiBuZXcgUmV0VmFscyhmYWxzZSwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHRocm93IGV4O1xyXG4gICAgICB9XHJcblxyXG4gICAgICBmaW5hbGx5IHtcclxuICAgICAgICAvLyBnZXQgdGhlIHByb3BhZ2F0ZSB2YWx1ZVxyXG4gICAgICAgIHJldFZhbCA9IGF3YWl0IHRoaXMuX3Byb3BhZ2F0ZUV4cC5nZXRWYWwoKTtcclxuXHJcbiAgICAgICAgLy8gcmVtb3ZlIGxvb3AgY291bnRlcnMgdGhhdCB3ZXJlIGxlZnQgdW51c2VkIGluIHRoZSBzdGFjayBkdWUgdG8gbGVhdmluZ1xyXG4gICAgICAgIC8vIHRoZSBoYW5kbGVyIG9uIFwic3RvcEV4ZWN1dGlvbigpID09IHRydWVcIlxyXG4gICAgICAgIGxldCBjdXJyTG9vcFN0YWNrU2l6ZTogbnVtYmVyID0gdGhpcy5fdGFzay5nZXRMb29wU3RhY2tTaXplKCk7XHJcbiAgICAgICAgZm9yICg7IGN1cnJMb29wU3RhY2tTaXplID4gaW5pdGlhbExvb3BTdGFja1NpemU7IGN1cnJMb29wU3RhY2tTaXplID0gY3Vyckxvb3BTdGFja1NpemUtLSlcclxuICAgICAgICAgIHRoaXMuX3Rhc2sucG9wTG9vcENvdW50ZXIoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gYWZ0ZXIgZXhlY3V0aW5nIHRoZSBvcGVyYXRpb25zIHVwZGF0ZSB0aGUgYXJndW1lbnRzIGJhY2sgYW5kIHJlY29tcHV0ZVxyXG4gICAgICBpZiAoYXJncyAhPT0gbnVsbClcclxuICAgICAgICBhd2FpdCB0aGlzLmdldEFyZ1ZhbHNGcm9tRmxkcyhhcmdzKTtcclxuXHJcbiAgICAgIGlmIChydEV2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfSU5URVJOQUwpIHtcclxuICAgICAgICBzd2l0Y2ggKHJ0RXZ0LmdldEludGVybmFsQ29kZSgpKSB7XHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYOlxyXG4gICAgICAgICAgICBmbG93TW9uaXRvci5hZGRUYXNrRmxvd1JlYyhJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCwgRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX0VORCwgdGhpcy5fdGFzay5HZXRUYXNrRGV0YWlscygpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWDpcclxuICAgICAgICAgICAgZmxvd01vbml0b3IuYWRkVGFza0Zsb3dSZWMoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgsIEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9FTkQsIHRoaXMuX3Rhc2suR2V0VGFza0RldGFpbHMoKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RBU0tfUFJFRklYOlxyXG4gICAgICAgICAgICBmbG93TW9uaXRvci5hZGRUYXNrRmxvd1JlYyhJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEFTS19QUkVGSVgsIEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9FTkQsIHRoaXMuX3Rhc2suR2V0VGFza0RldGFpbHMoKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RBU0tfU1VGRklYOlxyXG4gICAgICAgICAgICBmbG93TW9uaXRvci5hZGRUYXNrRmxvd1JlYyhJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEFTS19TVUZGSVgsIEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9FTkQsIHRoaXMuX3Rhc2suR2V0VGFza0RldGFpbHMoKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfU1VGRklYOlxyXG4gICAgICAgICAgICBmbG93TW9uaXRvci5hZGRUYXNrRmxvd0N0cmwoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfU1VGRklYLCBjdHJsLk5hbWUsIEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9FTkQsIHRoaXMuX3Rhc2suR2V0VGFza0RldGFpbHMoKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfUFJFRklYOlxyXG4gICAgICAgICAgICBmbG93TW9uaXRvci5hZGRUYXNrRmxvd0N0cmwoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfUFJFRklYLCBjdHJsLk5hbWUsIEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9FTkQsIHRoaXMuX3Rhc2suR2V0VGFza0RldGFpbHMoKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1ZBUklBQkxFOlxyXG4gICAgICAgICAgICBmbG93TW9uaXRvci5hZGRUYXNrRmxvd0ZsZChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVkFSSUFCTEUsIHJ0RXZ0LmdldEZsZCgpLmdldE5hbWUoKSwgRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX0VORCwgdGhpcy5fdGFzay5HZXRUYXNrRGV0YWlscygpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9WRVJJRklDQVRJT046XHJcbiAgICAgICAgICAgIGZsb3dNb25pdG9yLmFkZFRhc2tGbG93Q3RybChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9WRVJJRklDQVRJT04sIGN0cmwuTmFtZSwgRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX0VORCwgdGhpcy5fdGFzay5HZXRUYXNrRGV0YWlscygpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgZmxvd01vbml0b3IuYWRkVGFza0Zsb3dIYW5kbGVyKHRoaXMuX2V2dC5nZXRCcmtMZXZlbCh0cnVlKSwgRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX0VORCwgdGhpcy5fdGFzay5HZXRUYXNrRGV0YWlscygpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBmbG93TW9uaXRvci5hZGRUYXNrRmxvd0hhbmRsZXIodGhpcy5fZXZ0LmdldEJya0xldmVsKHRydWUpLCAxLCB0aGlzLl90YXNrLkdldFRhc2tEZXRhaWxzKCkpO1xyXG4gICAgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgIC8vIHJlc3RvcmluZyAgdGhlIG9yaWdpbmFsIGJyZWFrIGxldmVsIHN0YXRlIGFuZCBjdXJyZW50IGV4ZWN1dGluZyBjb250cm9sIGluZGV4XHJcbiAgICAgIHRoaXMuX3Rhc2suc2V0QnJrTGV2ZWwoYnJrTGV2ZWwsIGJya0xldmVsSW5kZXgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ldyBSZXRWYWxzKHJldFZhbCwgdHJ1ZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZXhlY3V0ZSB0aGUgb3BlcmF0aW9ucyBzdGFydGluZyBmcm9tIGZyb21JZHggYW5kIGVuZGluZyBhdCBlbmRJZHguXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVPcGVyYXRpb25zKGZyb21JZHg6IG51bWJlciwgdG9JZHg6IG51bWJlciwgdGFza0VuZDogYm9vbGVhbiwgbWdkSUQ6IG51bWJlciwgZGVwdGg6IG51bWJlcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQ2hhbmdlZEN1cnJXbmRSZWY6IFJlZlBhcmFtPGJvb2xlYW4+LCBpbkJsb2NrSWY6IGJvb2xlYW4sIGluUmV0dXJuZWRGcm9tU2VydmVyOiBib29sZWFuLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5OZXh0T3BlcklkeDogbnVtYmVyKTogUHJvbWlzZSA8UmV0VmFscz4ge1xyXG4gICAgbGV0IG9wZXI6IE9wZXJhdGlvbjtcclxuICAgIGxldCBvcGVyVHlwZTogbnVtYmVyO1xyXG4gICAgbGV0IG5leHRPcGVySWR4OiBudW1iZXIgPSAtMTtcclxuICAgIGxldCByZXR1cm5lZEZyb21TZXJ2ZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBtZ2Q6IE1HRGF0YSA9IHRoaXMuX3Rhc2suZ2V0TUdEYXRhKCk7XHJcbiAgICBsZXQgZXhlY0Zsb3dJZHg6IG51bWJlciA9IGZyb21JZHg7XHJcbiAgICBsZXQgcmV0dmFsczogUmV0VmFscztcclxuICAgIGxldCBibG9ja0lmUmV0dXJuZWRGcm9tU2VydmVyOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgZXhlY3V0ZUJsb2NrOiBib29sZWFuO1xyXG4gICAgbGV0IGJsb2NrTG9vcEV4ZWNvblNlcnZlcjogYm9vbGVhbjtcclxuICAgIGxldCBmbG93TW9uaXRvcjogRmxvd01vbml0b3JRdWV1ZSA9IEZsb3dNb25pdG9yUXVldWUuSW5zdGFuY2U7XHJcbiAgICBsZXQgcm91dGVPcGVyYXRpb25FeGVjdXRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIGlmICghaW5SZXR1cm5lZEZyb21TZXJ2ZXIpIHtcclxuICAgICAgLy8gd2UgbmVlZCB0byBjaGVjayBpZiB0aGUgc2VydmVyIGFscmVhZHkgc3RhcnRlZCBydW5uaW5nIHRoaXMgaGFuZGxlclxyXG4gICAgICBvcGVyID0gdGhpcy5fb3BlcmF0aW9uVGFiLmdldE9wZXJhdGlvbihleGVjRmxvd0lkeCk7XHJcbiAgICAgIG5leHRPcGVySWR4ID0gQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuZ2V0TmV4dE9wZXJJZHgob3BlciwgdHJ1ZSk7XHJcbiAgICAgIGlmIChuZXh0T3BlcklkeCA+IC0xKSB7XHJcbiAgICAgICAgcmV0dXJuZWRGcm9tU2VydmVyID0gdHJ1ZTtcclxuICAgICAgICBpZiAoaW5CbG9ja0lmKVxyXG4gICAgICAgICAgYmxvY2tJZlJldHVybmVkRnJvbVNlcnZlciA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSByZXR1cm5lZEZyb21TZXJ2ZXIgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICByZXR1cm5lZEZyb21TZXJ2ZXIgPSBpblJldHVybmVkRnJvbVNlcnZlcjtcclxuICAgICAgbmV4dE9wZXJJZHggPSBpbk5leHRPcGVySWR4O1xyXG4gICAgfVxyXG5cclxuICAgIGZvciAoOyBleGVjRmxvd0lkeCA8PSB0b0lkeCAmJlxyXG4gICAgICAgICAgICghQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSkgJiZcclxuICAgICAgICAgICAhbWdkLklzQWJvcnRpbmcgJiYgIXJvdXRlT3BlcmF0aW9uRXhlY3V0ZWQ7XHJcbiAgICAgICAgICAgZXhlY0Zsb3dJZHggKz0gMSkge1xyXG4gICAgICBpZiAoaW5CbG9ja0lmICYmIGJsb2NrSWZSZXR1cm5lZEZyb21TZXJ2ZXIgJiYgdGhpcy5fb3BlcmF0aW9uVGFiLmdldE9wZXJhdGlvbih0b0lkeCkuZ2V0U2VydmVySWQoKSA8IG5leHRPcGVySWR4KVxyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgb3BlciA9IHRoaXMuX29wZXJhdGlvblRhYi5nZXRPcGVyYXRpb24oZXhlY0Zsb3dJZHgpO1xyXG5cclxuICAgICAgb3BlclR5cGUgPSBvcGVyLmdldFR5cGUoKTtcclxuXHJcbiAgICAgIGJsb2NrSWZSZXR1cm5lZEZyb21TZXJ2ZXIgPSBmYWxzZTtcclxuXHJcbiAgICAgIC8vIElmIERlbGF5Q29tbWFuZEV4ZWN1dGlvbiA9IHRydWUsIGl0IG1lYW5zIHdlIGFyZSBoZXJlIFRTIG9mIGNsb3NpbmcgdGFzay5cclxuICAgICAgLy8gU28sIHNldCBmaXJzdCBvcGVyYXRpb24gb2YgaGFuZGxlciBhcyBzZXJ2ZXIuIHJldHVybiBiYWNrLlxyXG4gICAgICBpZiAoUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuR2V0SW5zdGFuY2UoKS5EZWxheUNvbW1hbmRFeGVjdXRpb24pIHtcclxuICAgICAgICB0aGlzLl90YXNrLnNldFVzZUxvb3BTdGFjayhkZXB0aCA+IDApO1xyXG4gICAgICAgIGF3YWl0IG9wZXIub3BlclNlcnZlcihudWxsKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gc2tpcCB0byB0aGUgY29ycmVjdCBvcGVyYXRpb24gYWZ0ZXIgcmV0dXJuaW5nIGZyb20gdGhlIHNlcnZlclxyXG4gICAgICBpZiAocmV0dXJuZWRGcm9tU2VydmVyICYmIG9wZXIuZ2V0U2VydmVySWQoKSA8IG5leHRPcGVySWR4KVxyXG4gICAgICAgIGlmIChvcGVyVHlwZSAhPT0gQ29uc3RJbnRlcmZhY2UuTUdfT1BFUl9CTE9DSylcclxuICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuX29wZXJhdGlvblRhYi5nZXRPcGVyYXRpb24ob3Blci5nZXRCbG9ja0VuZCgpKS5nZXRTZXJ2ZXJJZCgpIDwgbmV4dE9wZXJJZHgpXHJcbiAgICAgICAgICBjb250aW51ZTtcclxuXHJcbiAgICAgIGlmICghdGFza0VuZClcclxuICAgICAgICBhd2FpdCB0aGlzLl90YXNrLmV2YWxFbmRDb25kKENvbnN0SW50ZXJmYWNlLkVORF9DT05EX0VWQUxfSU1NSURJQVRFKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLl90YXNrTWdkSUQgIT09IG1nZElEKVxyXG4gICAgICAgIGlzQ2hhbmdlZEN1cnJXbmRSZWYudmFsdWUgPSB0cnVlO1xyXG5cclxuICAgICAgaWYgKCF0aGlzLl90YXNrLmlzTWFpblByb2coKSAmJiB0aGlzLl90YXNrLmlzT3BlbldpbigpKVxyXG4gICAgICAgIEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5jdXJyTWdkSUQgPSB0aGlzLl90YXNrTWdkSUQ7XHJcblxyXG4gICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5DaGVja0FuZFNob3dTcGlubmVyKHRydWUpO1xyXG5cclxuICAgICAgc3dpdGNoIChvcGVyVHlwZSkge1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfT1BFUl9WRVJJRlk6XHJcbiAgICAgICAgICAvLyBpZiB0cnVlIHJldHVybmVkIHRoZW4gdGhlIHZlcmlmeSBjb25kaXRpb24gd2FzIHRydWUgYW5kIHRoZSBtb2RlIGlzIEVycm9yXHJcbiAgICAgICAgICBpZiAoYXdhaXQgb3Blci5leGVjdXRlKHJldHVybmVkRnJvbVNlcnZlcikpIHtcclxuICAgICAgICAgICAgaWYgKCEodGhpcy5fdGFzay5nZXRCcmtMZXZlbCgpID09PSBcIlRTXCIpKSB7XHJcbiAgICAgICAgICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuc2V0U3RvcEV4ZWN1dGlvbih0cnVlKTtcclxuXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl90YXNrLmdldEluUmVjb3JkU3VmZml4KCkgJiYgdGhpcy5fdGFzay5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKVxyXG4gICAgICAgICAgICAgIHRoaXMuX3Rhc2suc2V0TGV2ZWwoQ29uc3RhbnRzLlRBU0tfTEVWRUxfUkVDT1JEKTtcclxuICAgICAgICAgICAgLy8gUUNSICM5OTUxMDggLSB2ZXJpZnkgZXJyb3IgaW4gUlMgc2hvdWxkbid0IHRyaWdnZXIgUlBcclxuICAgICAgICAgICAgLypcclxuICAgICAgICAgICAgICogaWYgd2UgYXJlIGluIHRoZSByZXZlcnQgbW9kZSwgZG9udCBzdG9wIGltbWVkaWF0ZWx5LlxyXG4gICAgICAgICAgICAgKiBleGVjdXRlIHRoZSBvcGVyYXRpb25zIG9mIHRoZSBoYW5kbGVyIGluIHRoZSByZXZlcnNlIG9yZGVyIGFuZCB0aGVuIHN0b3AuXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFJldFZhbHMoZmFsc2UsIHRydWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfT1BFUl9MT09QOlxyXG4gICAgICAgICAgLy8gb24gZ2V0dGluZyBhIEJsb2NrTG9vcCwgZXhlY3V0ZSB0aGUgbG9vcCBmb3IgdGhlIG51bWJlciBvZiB0aW1lcyBpbnRlbmRlZCxcclxuICAgICAgICAgIC8vIGFuZCB0aGVuIG1vdmUgdG8gQmxvY2tFbmQuXHJcbiAgICAgICAgICB0aGlzLl90YXNrLmVudGVyTG9vcCgpO1xyXG4gICAgICAgICAgdGhpcy5fdGFzay5pbmNyZWFzZUxvb3BDb3VudGVyKCk7XHJcbiAgICAgICAgICB0aGlzLl90YXNrLnNldFVzZUxvb3BTdGFjayh0cnVlKTtcclxuXHJcbiAgICAgICAgICBhd2FpdCBmbG93TW9uaXRvci5hZGRGbG93RmllbGRPcGVyYXRpb24ob3BlciwgdHJ1ZSwgdGhpcy5fdGFzay5HZXRUYXNrRGV0YWlscygpKTtcclxuXHJcbiAgICAgICAgICBibG9ja0xvb3BFeGVjb25TZXJ2ZXIgPSBmYWxzZTtcclxuICAgICAgICAgIGlmICghb3Blci5nZXRFeGVjT25TZXJ2ZXIoKSkge1xyXG4gICAgICAgICAgICAvLyBleGVjdXRlIHRoZSBsb29wIGZvciB0aGUgbnVtYmVyIG9mIHRpbWVzIGludGVuZGVkXHJcbiAgICAgICAgICAgIHdoaWxlIChhd2FpdCBvcGVyLmV4ZWN1dGUoZmFsc2UpKSB7XHJcbiAgICAgICAgICAgICAgLy8gY2FsbCBleGVjdXRlT3BlcmF0aW9ucygpIHRvIGV4ZWN1dGUgdGhlIG9wZXJhdGlvbnMgd2l0aGluIGEgQmxvY2tMb29wXHJcbiAgICAgICAgICAgICAgcmV0dmFscyA9IGF3YWl0IHRoaXMuZXhlY3V0ZU9wZXJhdGlvbnMoZXhlY0Zsb3dJZHggKyAxLCBvcGVyLmdldEJsb2NrQ2xvc2UoKSAtIDEsIHRhc2tFbmQsIG1nZElELCBkZXB0aCArIDEsXHJcbiAgICAgICAgICAgICAgICBpc0NoYW5nZWRDdXJyV25kUmVmLCBmYWxzZSwgZmFsc2UsIC0xKTtcclxuICAgICAgICAgICAgICBpZiAocmV0dmFscyAhPT0gbnVsbClcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWxzO1xyXG5cclxuICAgICAgICAgICAgICAvLyBpZiB3ZSBnZXQgYSByZXZlcnQgaW5zaWRlIGEgbG9vcCwgYnJlYWsgdGhlIGxvb3BcclxuICAgICAgICAgICAgICBpZiAoKG1nZC5Jc0Fib3J0aW5nIHx8IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpKVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICAgIHRoaXMuX3Rhc2suaW5jcmVhc2VMb29wQ291bnRlcigpO1xyXG4gICAgICAgICAgICAgIHRoaXMuX3Rhc2suc2V0VXNlTG9vcFN0YWNrKHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGF3YWl0IG9wZXIuZXhlY3V0ZShmYWxzZSkpXHJcbiAgICAgICAgICAgICAgYmxvY2tMb29wRXhlY29uU2VydmVyID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmICghYmxvY2tMb29wRXhlY29uU2VydmVyKVxyXG4gICAgICAgICAgLypcclxuICAgICAgICAgICAqIE9uY2Ugd2UgZmluaXNoIGV4ZWN1dGluZyB0aGUgbG9vcCxcclxuICAgICAgICAgICAqIGlmIHdlIGFyZSBtb3ZpbmcgaW4gdGhlIGZvcndhcmQgZGlyZWN0aW9uLCBtb3ZlIHRvIEJsb2NrRW5kLlxyXG4gICAgICAgICAgICovXHJcbiAgICAgICAgICAgIGV4ZWNGbG93SWR4ID0gb3Blci5nZXRCbG9ja0VuZCgpIC0gMTtcclxuICAgICAgICAgIHRoaXMuX3Rhc2subGVhdmVMb29wKCk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19PUEVSX0JMT0NLOlxyXG4gICAgICAgICAgLy8gb24gZ2V0dGluZyBhIEJsb2NrIElGLCBleGVjdXRlIHRoZSBleGVjdXRhYmxlIGJsb2NrIChpZiBvciBlbHNlKVxyXG4gICAgICAgICAgLy8gYW5kIHRoZW4gbW92ZSB0byBCbG9ja0VuZC5cclxuICAgICAgICAgIGlmICghb3Blci5nZXRFeGVjT25TZXJ2ZXIoKSB8fCAocmV0dXJuZWRGcm9tU2VydmVyICYmIG9wZXIuZ2V0U2VydmVySWQoKSA8IG5leHRPcGVySWR4KSkge1xyXG4gICAgICAgICAgICB0aGlzLl90YXNrLnNldFVzZUxvb3BTdGFjayh0cnVlKTtcclxuICAgICAgICAgICAgaWYgKCFyZXR1cm5lZEZyb21TZXJ2ZXIgfHwgb3Blci5nZXRTZXJ2ZXJJZCgpID49IG5leHRPcGVySWR4KVxyXG4gICAgICAgICAgICAvLyBnZXQgdGhlIGV4ZWN1dGFibGUgYmxvY2sgYmV0d2VlbiBCbG9jayBJRiBhbmQgQmxvY2sgRU5EXHJcbiAgICAgICAgICAgICAgZXhlY0Zsb3dJZHggPSBhd2FpdCB0aGlzLmdldFNpZ25pZmljYW50QmxvY2soZXhlY0Zsb3dJZHgsIG9wZXIuZ2V0QmxvY2tFbmQoKSk7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICBleGVjRmxvd0lkeCA9IHRoaXMuZ2V0U3RhcnRCbG9ja0lmSWR4QnlPcGVyKGV4ZWNGbG93SWR4LCBuZXh0T3BlcklkeCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fdGFzay5zZXRVc2VMb29wU3RhY2soZGVwdGggPiAwKTtcclxuICAgICAgICAgICAgYXdhaXQgb3Blci5vcGVyU2VydmVyKG51bGwpO1xyXG4gICAgICAgICAgICBuZXh0T3BlcklkeCA9IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmdldE5leHRPcGVySWR4KG9wZXIsIHRydWUpO1xyXG4gICAgICAgICAgICBpZiAobmV4dE9wZXJJZHggPiAtMSkge1xyXG4gICAgICAgICAgICAgIHJldHVybmVkRnJvbVNlcnZlciA9IHRydWU7XHJcbiAgICAgICAgICAgICAgaWYgKGluQmxvY2tJZilcclxuICAgICAgICAgICAgICAgIGJsb2NrSWZSZXR1cm5lZEZyb21TZXJ2ZXIgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgICBpZiAobmV4dE9wZXJJZHggPCB0aGlzLl9vcGVyYXRpb25UYWIuZ2V0T3BlcmF0aW9uKG9wZXIuZ2V0QmxvY2tFbmQoKSkuZ2V0U2VydmVySWQoKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gZmluZCB0aGUgc2lnbmlmaWNhbnQgYmxvY2sgaW4gd2hpY2ggdGhlIG5leHQgb3BlcmF0aW9uIGlzXHJcbiAgICAgICAgICAgICAgICB3aGlsZSAodGhpcy5fb3BlcmF0aW9uVGFiLmdldE9wZXJhdGlvbihvcGVyLmdldEJsb2NrQ2xvc2UoKSkuZ2V0U2VydmVySWQoKSA8IG5leHRPcGVySWR4KSB7XHJcbiAgICAgICAgICAgICAgICAgIGV4ZWNGbG93SWR4ID0gb3Blci5nZXRCbG9ja0Nsb3NlKCk7XHJcbiAgICAgICAgICAgICAgICAgIG9wZXIgPSB0aGlzLl9vcGVyYXRpb25UYWIuZ2V0T3BlcmF0aW9uKGV4ZWNGbG93SWR4KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuZWRGcm9tU2VydmVyID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgZXhlY0Zsb3dJZHggPSAtMTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKGV4ZWNGbG93SWR4ICE9PSAtMSkge1xyXG4gICAgICAgICAgICBleGVjdXRlQmxvY2sgPSB0cnVlO1xyXG4gICAgICAgICAgICBvcGVyID0gdGhpcy5fb3BlcmF0aW9uVGFiLmdldE9wZXJhdGlvbihleGVjRmxvd0lkeCk7XHJcblxyXG4gICAgICAgICAgICBpZiAocmV0dXJuZWRGcm9tU2VydmVyKSB7XHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuX29wZXJhdGlvblRhYi5nZXRPcGVyYXRpb24ob3Blci5nZXRCbG9ja0Nsb3NlKCkpLmdldFNlcnZlcklkKCkgPD0gbmV4dE9wZXJJZHgpIHtcclxuICAgICAgICAgICAgICAgIGV4ZWN1dGVCbG9jayA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgYmxvY2tJZlJldHVybmVkRnJvbVNlcnZlciA9IHRydWU7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoZXhlY3V0ZUJsb2NrKSB7XHJcbiAgICAgICAgICAgICAgLy8gY2FsbCBleGVjdXRlT3BlcmF0aW9ucygpIHRvIGV4ZWN1dGUgdGhlIG9wZXJhdGlvbnMgaW4gdGhlIGV4ZWN1dGFibGUgYmxvY2tcclxuICAgICAgICAgICAgICByZXR2YWxzID0gYXdhaXQgdGhpcy5leGVjdXRlT3BlcmF0aW9ucyhleGVjRmxvd0lkeCArIDEsIG9wZXIuZ2V0QmxvY2tDbG9zZSgpIC0gMSwgdGFza0VuZCwgbWdkSUQsIGRlcHRoICsgMSxcclxuICAgICAgICAgICAgICAgIGlzQ2hhbmdlZEN1cnJXbmRSZWYsIHRydWUsIHJldHVybmVkRnJvbVNlcnZlciwgbmV4dE9wZXJJZHgpO1xyXG4gICAgICAgICAgICAgIGlmIChyZXR2YWxzICE9PSBudWxsKVxyXG4gICAgICAgICAgICAgICAgaWYgKCFyZXR2YWxzLlJldHVybmVkRnJvbVNlcnZlcilcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbHM7XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuZWRGcm9tU2VydmVyID0gcmV0dmFscy5SZXR1cm5lZEZyb21TZXJ2ZXI7XHJcbiAgICAgICAgICAgICAgICAgIG5leHRPcGVySWR4ID0gcmV0dmFscy5OZXh0T3BlcklkeDtcclxuICAgICAgICAgICAgICAgICAgYmxvY2tJZlJldHVybmVkRnJvbVNlcnZlciA9IHJldHZhbHMuQmxvY2tJZlJldHVybmVkRnJvbVNlcnZlcjtcclxuICAgICAgICAgICAgICAgICAgZXhlY0Zsb3dJZHggPSBvcGVyLmdldEJsb2NrRW5kKCkgLSAxO1xyXG4gICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8qXHJcbiAgICAgICAgICAgKiBPbmNlIHdlIGZpbmlzaCBleGVjdXRpbmcgdGhlIGJsb2NrLFxyXG4gICAgICAgICAgICogaWYgd2UgYXJlIG1vdmluZyBpbiB0aGUgZm9yd2FyZCBkaXJlY3Rpb24sIG1vdmUgdG8gQmxvY2tFbmQuXHJcbiAgICAgICAgICAgKiBvdGhlcndpc2UsIG1vdmUgdG8gQmxvY2sgSUZcclxuICAgICAgICAgICAqL1xyXG4gICAgICAgICAgZXhlY0Zsb3dJZHggPSBvcGVyLmdldEJsb2NrRW5kKCkgLSAxO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfT1BFUl9FTkRCTE9DSzpcclxuICAgICAgICAgIGF3YWl0IGZsb3dNb25pdG9yLmFkZEZsb3dGaWVsZE9wZXJhdGlvbihvcGVyLCB0cnVlLCB0aGlzLl90YXNrLkdldFRhc2tEZXRhaWxzKCkpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfT1BFUl9DQUxMOlxyXG4gICAgICAgICAgdGhpcy5fdGFzay5zZXRVc2VMb29wU3RhY2soZGVwdGggPiAwKTtcclxuICAgICAgICAgIC8vIGlmIGZhbHNlIGlzIHJldHVybmVkLCBpdCBtZWFucyB0aGF0IGEgcm91dGUgb3BlcmF0aW9uIHdhcyBleGVjdXRlZC5cclxuICAgICAgICAgIHJvdXRlT3BlcmF0aW9uRXhlY3V0ZWQgPSBhd2FpdCBvcGVyLmV4ZWN1dGUocmV0dXJuZWRGcm9tU2VydmVyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgLy8gdGhlIHJlc3Qgb2YgdGhlIG9wZXJhdGlvbnMgKHRob3NlIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgZmxvdylcclxuICAgICAgICAgIHRoaXMuX3Rhc2suc2V0VXNlTG9vcFN0YWNrKGRlcHRoID4gMCk7XHJcbiAgICAgICAgICBhd2FpdCBvcGVyLmV4ZWN1dGUocmV0dXJuZWRGcm9tU2VydmVyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBpZiB0aGUgc2VydmVyIGhhdmUgZXhlY3V0ZWQgYSBibG9jayBvZiBvcGVyYXRpb25zIHRoZW4gZ2V0IHRoZSBuZXh0XHJcbiAgICAgIC8vIG9wZXJhdGlvbiBpbmRleFxyXG4gICAgICBpZiAoIWJsb2NrSWZSZXR1cm5lZEZyb21TZXJ2ZXIpIHtcclxuICAgICAgICBuZXh0T3BlcklkeCA9IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmdldE5leHRPcGVySWR4KG9wZXIsIHRydWUpO1xyXG4gICAgICAgIGlmIChuZXh0T3BlcklkeCA+IC0xKSB7XHJcbiAgICAgICAgICByZXR1cm5lZEZyb21TZXJ2ZXIgPSB0cnVlO1xyXG4gICAgICAgICAgaWYgKGluQmxvY2tJZilcclxuICAgICAgICAgICAgYmxvY2tJZlJldHVybmVkRnJvbVNlcnZlciA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgcmV0dXJuZWRGcm9tU2VydmVyID0gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHJvdXRlT3BlcmF0aW9uRXhlY3V0ZWQpXHJcbiAgICAgIHJldHZhbHMgPSBuZXcgUmV0VmFscyhmYWxzZSwgdHJ1ZSk7XHJcbiAgICBlbHNlIGlmIChibG9ja0lmUmV0dXJuZWRGcm9tU2VydmVyKVxyXG4gICAgICByZXR2YWxzID0gbmV3IFJldFZhbHMobmV4dE9wZXJJZHgsIHJldHVybmVkRnJvbVNlcnZlciwgYmxvY2tJZlJldHVybmVkRnJvbVNlcnZlcik7XHJcbiAgICBlbHNlXHJcbiAgICAgIHJldHZhbHMgPSBudWxsO1xyXG4gICAgcmV0dXJuIHJldHZhbHM7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSBleGVjdXRhYmxlIEJsb2NrIChJRiBvciBFTFNFKVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzdGFydEJsb2NrSWR4XCI+dGhlIGluZGV4IG9mIHRoZSBCbG9jayBJRjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJlbmRJZHhcIj50aGUgQmxvY2sgRW5kIEluZGV4IG9mIHRoZSBCbG9jayBJRjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPlRoZSBpbmRleCBvZiB0aGUgYmxvY2sgKElGIG9yIEVMU0Ugb3IgbmV4dCBFTFNFIC4uLil0aGF0IGNhbiBiZSBleGVjdXRlZC5cclxuICAvLy8gICBJZiBubyBibG9ja3MgY2FuIGJlIGV4ZWN1dGVkLCByZXR1cm4gLTFcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgYXN5bmMgZ2V0U2lnbmlmaWNhbnRCbG9jayhzdGFydEJsb2NrSWR4OiBudW1iZXIsIGVuZElkeDogbnVtYmVyKTogUHJvbWlzZTxudW1iZXI+IHtcclxuICAgIGxldCByZXRJZHg6IG51bWJlciA9IC0xO1xyXG5cclxuICAgIHdoaWxlIChzdGFydEJsb2NrSWR4IDwgZW5kSWR4KSB7XHJcbiAgICAgIGxldCBvcGVyOiBPcGVyYXRpb24gPSB0aGlzLl9vcGVyYXRpb25UYWIuZ2V0T3BlcmF0aW9uKHN0YXJ0QmxvY2tJZHgpO1xyXG4gICAgICBsZXQgb3BlclR5cGU6IG51bWJlciA9IG9wZXIuZ2V0VHlwZSgpO1xyXG5cclxuICAgICAgaWYgKG9wZXJUeXBlICE9PSBDb25zdEludGVyZmFjZS5NR19PUEVSX0JMT0NLICYmIG9wZXJUeXBlICE9PSBDb25zdEludGVyZmFjZS5NR19PUEVSX0VMU0UgJiYgb3BlclR5cGUgIT09IENvbnN0SW50ZXJmYWNlLk1HX09QRVJfU0VSVkVSKVxyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgaWYgKGF3YWl0IG9wZXIuZXhlY3V0ZShmYWxzZSkpIHtcclxuICAgICAgICByZXRJZHggPSBzdGFydEJsb2NrSWR4O1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBzdGFydEJsb2NrSWR4ID0gb3Blci5nZXRCbG9ja0Nsb3NlKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmV0SWR4O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgaWR4IG9mIHRoZSBCbG9jayBJRlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJlbmRJZHhcIj4tLS0gdGhlIGluZGV4IG9mIHRoZSBCbG9jayBFbmRcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IC0tLSBUaGUgaW5kZXggb2YgdGhlIGJsb2NrIElGIHdob3NlIEJsb2NrRW5kIElkeCBtYXRjaGVzIHdpdGggdGhlIGVuZElkeFxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBnZXRTdGFydEJsb2NrSWR4QnlFbmQoZW5kSWR4OiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgbGV0IHJldElkeDogbnVtYmVyID0gLTE7XHJcbiAgICBsZXQgZm91bmQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBqOiBudW1iZXI7XHJcbiAgICBmb3IgKGogPSBlbmRJZHggLSAxOyBqID49IDAgJiYgIWZvdW5kOyBqLS0pIHtcclxuICAgICAgbGV0IG9wZXI6IE9wZXJhdGlvbiA9IHRoaXMuX29wZXJhdGlvblRhYi5nZXRPcGVyYXRpb24oaik7XHJcbiAgICAgIGxldCBvcGVyVHlwZTogbnVtYmVyID0gb3Blci5nZXRUeXBlKCk7XHJcblxyXG4gICAgICBpZiAob3BlclR5cGUgPT09IENvbnN0SW50ZXJmYWNlLk1HX09QRVJfQkxPQ0sgfHwgb3BlclR5cGUgPT09IENvbnN0SW50ZXJmYWNlLk1HX09QRVJfTE9PUCkge1xyXG4gICAgICAgIGlmIChvcGVyLmdldEJsb2NrRW5kKCkgPT09IGVuZElkeCkge1xyXG4gICAgICAgICAgcmV0SWR4ID0gajtcclxuICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiByZXRJZHg7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgaWR4IG9mIHRoZSBCbG9jayBJRlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJlbHNlSWR4XCI+LS0tIHRoZSBpbmRleCBvZiB0aGUgQmxvY2sgRWxzZVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gLS0tIFRoZSBpbmRleCBvZiB0aGUgYmxvY2sgSUYgd2hvc2UgQmxvY2tFbmQgSWR4IG1hdGNoZXMgd2l0aCB0aGUgZW5kSWR4XHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBwcml2YXRlIGdldFN0YXJ0QmxvY2tJZHhCeUVsc2UoZWxzZUlkeDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGxldCByZXRJZHg6IG51bWJlciA9IC0xO1xyXG4gICAgbGV0IGZvdW5kOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgZWxzZUJsb2NrRW5kOiBudW1iZXIgPSB0aGlzLl9vcGVyYXRpb25UYWIuZ2V0T3BlcmF0aW9uKGVsc2VJZHgpLmdldEJsb2NrRW5kKCk7XHJcbiAgICBsZXQgajogbnVtYmVyO1xyXG4gICAgZm9yIChqID0gZWxzZUlkeCAtIDE7IGogPj0gMCAmJiAhZm91bmQ7IGotLSkge1xyXG4gICAgICBsZXQgb3BlcjogT3BlcmF0aW9uID0gdGhpcy5fb3BlcmF0aW9uVGFiLmdldE9wZXJhdGlvbihqKTtcclxuICAgICAgbGV0IG9wZXJUeXBlOiBudW1iZXIgPSBvcGVyLmdldFR5cGUoKTtcclxuXHJcbiAgICAgIGlmIChvcGVyVHlwZSA9PT0gQ29uc3RJbnRlcmZhY2UuTUdfT1BFUl9CTE9DSykge1xyXG4gICAgICAgIGlmIChvcGVyLmdldEJsb2NrRW5kKCkgPT09IGVsc2VCbG9ja0VuZCkge1xyXG4gICAgICAgICAgcmV0SWR4ID0gajtcclxuICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiByZXRJZHg7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSBpbmRleCBvZiB0aGUgQmxvY2sgSUYgb3IgRWxzZSBhY2NvcmRpbmcgdG8gdGhlIGluZGV4IG9mIG9uZSBvZiB0aGUgb2Ygb3BlcmF0aW9ucyBpbiBpdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJibG9ja09wZXJJZHhcIj4tLS0gaW5kZXggb2YgdGhlIGlmIGJsb2NrIGZvciB3aGljaCB3ZSBoYXZlIHRvIGZpbmQgdGhlIGFwcHJvcHJpYXRlIGJsb2NrIHRvIGV4ZWN1dGVcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInNydnJPcGVySWR4XCI+LS0tIHRoZSBzZXJ2ZXIgaWQgb2YgdGhlIG5leHQgb3BlcmF0aW9uIHdoaWNoIHRoZSBjbGllbnQgc2hvdWxkIGV4ZWN1dGVcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IC0tLSBUaGUgaW5kZXggb2YgdGhlIGJsb2NrIElGIG9yIEVsc2Ugd2hpY2ggaG9sZCB0aGUgb3BlcmF0aW9uIHdoaWNoIG9wZXJJZHggaXMgaXRzIGluZGV4XHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBwcml2YXRlIGdldFN0YXJ0QmxvY2tJZklkeEJ5T3BlcihibG9ja09wZXJJZHg6IG51bWJlciwgc3J2ck9wZXJJZHg6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBsZXQgcmV0SWR4OiBudW1iZXIgPSAtMTtcclxuICAgIGxldCBmb3VuZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IGo6IG51bWJlciA9IHRoaXMuX29wZXJhdGlvblRhYi5zZXJ2ZXJJZDJvcGVySWR4KHNydnJPcGVySWR4LCBibG9ja09wZXJJZHgpIC0gMTtcclxuXHJcbiAgICBpZiAoaiA9PT0gLTIpIHtcclxuICAgICAgaiA9IHRoaXMuX29wZXJhdGlvblRhYi5zZXJ2ZXJJZDJGb2xsb3dpbmdPcGVySWR4KHNydnJPcGVySWR4LCBibG9ja09wZXJJZHgpIC0gMTtcclxuICAgIH1cclxuXHJcbiAgICB3aGlsZSAoaiA+PSAwICYmICFmb3VuZCkge1xyXG4gICAgICBsZXQgb3BlcjogT3BlcmF0aW9uID0gdGhpcy5fb3BlcmF0aW9uVGFiLmdldE9wZXJhdGlvbihqKTtcclxuICAgICAgbGV0IG9wZXJUeXBlOiBudW1iZXIgPSBvcGVyLmdldFR5cGUoKTtcclxuICAgICAgaWYgKG9wZXJUeXBlID09PSBDb25zdEludGVyZmFjZS5NR19PUEVSX0JMT0NLKSB7XHJcbiAgICAgICAgaWYgKGogPT09IGJsb2NrT3BlcklkeCkge1xyXG4gICAgICAgICAgcmV0SWR4ID0gajtcclxuICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgai0tO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKG9wZXJUeXBlID09PSBDb25zdEludGVyZmFjZS5NR19PUEVSX0VMU0UpIHtcclxuICAgICAgICBsZXQgYmxvY2tTdHJ0OiBudW1iZXIgPSB0aGlzLmdldFN0YXJ0QmxvY2tJZHhCeUVsc2Uoaik7XHJcbiAgICAgICAgaWYgKGJsb2NrU3RydCA9PT0gYmxvY2tPcGVySWR4KSB7XHJcbiAgICAgICAgICByZXRJZHggPSBqO1xyXG4gICAgICAgICAgZm91bmQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBqID0gYmxvY2tTdHJ0IC0gMTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmIChvcGVyVHlwZSA9PT0gQ29uc3RJbnRlcmZhY2UuTUdfT1BFUl9FTkRCTE9DSylcclxuICAgICAgICBqID0gdGhpcy5nZXRTdGFydEJsb2NrSWR4QnlFbmQoaikgLSAxO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgai0tO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJldElkeDtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSBsZXZlbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0TGV2ZWwoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9sZXZlbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdGhlIGV2ZW50IG9mIHRoaXMgaGFuZGxlclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0RXZlbnQoKTogRXZlbnQge1xyXG4gICAgcmV0dXJuIHRoaXMuX2V2dDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIElkIG9mIHRoZSBldmVudCBoYW5kbGVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRJZCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgY29udHJvbCBvZiB0aGUgZXZlbnQgaGFuZGxlclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0U3RhdGljQ3RybCgpOiBNZ0NvbnRyb2wge1xyXG4gICAgcmV0dXJuIHRoaXMuX2N0cmw7XHJcbiAgfVxyXG5cclxuICBnZXRSdW5UaW1lQ3RybCgpOiBNZ0NvbnRyb2wge1xyXG4gICAgcmV0dXJuIDxNZ0NvbnRyb2w+QWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuZ2V0TGFzdFJ0RXZlbnQoKS5Db250cm9sO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiB0aGUgaGFuZGxlciBpcyBlbmFibGVkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyBpc0VuYWJsZWQoKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fZW5hYmxlZEV4cC5nZXRWYWwoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXNldCB0aGUgdmFsdWVzIG9mIHRoZSBsb2NhbCB2YXJpYWJsZXMgdXNpbmcgdGhlIGFyZ3VtZW50IHZhbHVlcyBvciB0aGUgZGVmYXVsdFxyXG4gIC8vLyAgIHZhbHVlcyBvciB0aGUgaW5pdCBleHByZXNzaW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImFyZ3NcIj50aGUgYXJndW1lbnRzIGxpc3QgPC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIHJlc2V0TG9jYWxWYXJpYWJsZXMoYXJnczogQXJndW1lbnRzTGlzdCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGR2OiBEYXRhVmlldyA9IDxEYXRhVmlldz50aGlzLl90YXNrLkRhdGFWaWV3O1xyXG4gICAgbGV0IGFyZ0lkeDogbnVtYmVyID0gMDtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBmb3IgKGxldCBmaWVsZElkeDogbnVtYmVyID0gdGhpcy5fZHZQb3M7IGZpZWxkSWR4IDwgdGhpcy5fZHZQb3MgKyB0aGlzLl9kdkxlbjsgZmllbGRJZHgrKykge1xyXG4gICAgICAgIGxldCBhRmllbGQ6IEZpZWxkQmFzZSA9IDxGaWVsZEJhc2U+ZHYuZ2V0RmllbGQoZmllbGRJZHgpO1xyXG4gICAgICAgIGxldCB2YXJJc1Bhcm06IGJvb2xlYW4gPSAhdGhpcy5faGFzUGFyYW1ldGVycyB8fCBhRmllbGQuaXNQYXJhbSgpO1xyXG5cclxuICAgICAgICAvLyBjaGVjayBpZiB0aGUgZmllbGQgc2hvdWxkIGdldCBpdHMgdmFsdWUgZnJvbSBhbiBhcmd1bWVudFxyXG4gICAgICAgIGlmICgoYXJncyAhPT0gbnVsbCAmJiBhcmdJZHggPCBhcmdzLmdldFNpemUoKSkgJiYgdmFySXNQYXJtKSB7XHJcbiAgICAgICAgICBpZiAoIWFyZ3MuZ2V0QXJnKGFyZ0lkeCkuc2tpcEFyZygpKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IGFyZ3MuZ2V0QXJnKGFyZ0lkeCkuc2V0VmFsdWVUb0ZpZWxkKGFGaWVsZCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgYUZpZWxkLmludmFsaWRhdGUodHJ1ZSwgRmllbGRCYXNlLkNMRUFSX0ZMQUdTKTtcclxuICAgICAgICAgICAgYXdhaXQgYUZpZWxkLmNvbXB1dGUoZmFsc2UpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYXJnSWR4Kys7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgYUZpZWxkLmludmFsaWRhdGUodHJ1ZSwgRmllbGRCYXNlLkNMRUFSX0ZMQUdTKTtcclxuICAgICAgICAgIGF3YWl0IGFGaWVsZC5jb21wdXRlKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYXdhaXQgYUZpZWxkLnVwZGF0ZURpc3BsYXkoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGV4Y2VwdGlvbikge1xyXG4gICAgICB0aHJvdyBleGNlcHRpb247XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIHRoZSByZXN1bHQgdmFsdWVzIHRvIHRoZSBmaWVsZCBhcmd1bWVudHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiYXJnc1wiPnRoZSBhcmd1bWVudHMgbGlzdCA8L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgZ2V0QXJnVmFsc0Zyb21GbGRzKGFyZ3M6IEFyZ3VtZW50c0xpc3QpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBkdjogRGF0YVZpZXcgPSA8RGF0YVZpZXc+dGhpcy5fdGFzay5EYXRhVmlldztcclxuICAgIGxldCBrOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IGo6IG51bWJlcjtcclxuXHJcbiAgICBmb3IgKGogPSB0aGlzLl9kdlBvczsgaiA8IHRoaXMuX2R2UG9zICsgdGhpcy5fZHZMZW4gJiYgayA8IGFyZ3MuZ2V0U2l6ZSgpOyBqKyspIHtcclxuICAgICAgbGV0IGFGaWVsZDogRmllbGRCYXNlID0gPEZpZWxkQmFzZT5kdi5nZXRGaWVsZChqKTtcclxuICAgICAgaWYgKCF0aGlzLl9oYXNQYXJhbWV0ZXJzIHx8IGFGaWVsZC5pc1BhcmFtKCkpIHtcclxuICAgICAgICBsZXQgYXJnOiBBcmd1bWVudCA9IGFyZ3MuZ2V0QXJnKGspO1xyXG4gICAgICAgIGlmIChhcmcuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5BUkdfVFlQRV9GSUVMRCkge1xyXG4gICAgICAgICAgLy8gdXBkYXRlIHRoZSBmaWVsZCB2YWx1ZSBmcm9tIHRoZSB0aGUgUGFyYW1cclxuICAgICAgICAgIGxldCBhcmdGbGQ6IEZpZWxkQmFzZSA9IDxGaWVsZEJhc2U+YXJnLmdldEZpZWxkKCk7XHJcblxyXG4gICAgICAgICAgLy8gQSBoYW5kbGVyIGNhbiBiZSBjYWxsZWQgZWl0aGVyIGZyb20gdGhlIHNhbWUgdGFzayAob2YgdGhlIGhhbmRsZXIpIG9yIGZyb20gYVxyXG4gICAgICAgICAgLy8gdGFzayBsb3dlciBkb3duIGluIHRoZSBoaWVyYXJjaHkuXHJcbiAgICAgICAgICAvLyBIZXJlIHdlIGFyZSBjb3B5aW5nIHZhbHVlIGZyb20gdGhlIGhhbmRsZXIgdGFzayB0byB0aGUgaW52b2tlciB0YXNrLlxyXG4gICAgICAgICAgLy8gQ29weWluZyBzaG91bGQgbm90IGJlIGRvbmUgaWYgYW55IG9uZSBvZiB0aGUgdGFzayBpcyBhYm9ydGluZy5cclxuICAgICAgICAgIC8vIEJ1dCBjaGVja2luZyBvbmx5IHRoZSBpbnZva2VyIHRhc2sncyBpc0Fib3J0aW5nIGlzIHN1ZmZpY2llbnQgaGVyZSBiZWNhdXNlLFxyXG4gICAgICAgICAgLy8gaXQgd2lsbCBiZSB0cnVlIGV2ZW4gaWYgdGhlIGhhbmRsZXIgdGFzayBpcyBhYm9ydGluZy5cclxuICAgICAgICAgIGlmIChhcmdGbGQuZ2V0VGFzaygpICE9PSBudWxsICYmICEoPFRhc2s+YXJnRmxkLmdldFRhc2soKSkuaXNBYm9ydGluZygpKSB7XHJcbiAgICAgICAgICAgIGxldCB2YWw6IHN0cmluZyA9IGFGaWVsZC5nZXRWYWx1ZShmYWxzZSk7XHJcbiAgICAgICAgICAgIGF3YWl0IGFyZ0ZsZC5zZXRWYWx1ZUFuZFN0YXJ0UmVjb21wdXRlKHZhbCwgYUZpZWxkLmlzTnVsbCgpLCB0cnVlLCBhRmllbGQuaXNNb2RpZmllZCgpLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIGF3YWl0IGFyZ0ZsZC51cGRhdGVEaXNwbGF5KCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGsrKztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIGhhbmRsZXIncyB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRUYXNrKCk6IFRhc2sge1xyXG4gICAgcmV0dXJuIHRoaXMuX3Rhc2s7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMgZXhwZWN0ZWQgYnkgdGhlIGhhbmRsZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFyZ3NNYXRjaChFeHBfcGFyYW1zOiBFeHBWYWxbXSk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGFyZ3NNYXRjaGVkOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIGxldCBkdjogRGF0YVZpZXcgPSA8RGF0YVZpZXc+dGhpcy5fdGFzay5EYXRhVmlldztcclxuICAgIGxldCBqOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IHBhcmFtQ291bnQ6IG51bWJlciA9IDA7XHJcblxyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gdGhpcy5fZHZQb3M7IGkgPCB0aGlzLl9kdlBvcyArIHRoaXMuX2R2TGVuOyBpKyspIHtcclxuICAgICAgbGV0IGZpZWxkOiBGaWVsZEJhc2UgPSA8RmllbGRCYXNlPmR2LmdldEZpZWxkKGkpO1xyXG4gICAgICBpZiAoZmllbGQuaXNQYXJhbSgpKSB7XHJcbiAgICAgICAgcGFyYW1Db3VudCsrO1xyXG4gICAgICAgIGlmIChqIDwgRXhwX3BhcmFtcy5sZW5ndGgpIHtcclxuICAgICAgICAgIGxldCBmaWVsZEF0dHI6IFN0b3JhZ2VBdHRyaWJ1dGUgPSBmaWVsZC5nZXRUeXBlKCk7XHJcbiAgICAgICAgICBsZXQgYXJnQXR0cjogU3RvcmFnZUF0dHJpYnV0ZSA9IEV4cF9wYXJhbXNbal0uQXR0cjtcclxuXHJcblxyXG4gICAgICAgICAgLy8gYXJndW1lbnQgYW5kIHBhcmFtZXRlciB3aWxsIG5vdCBtYXRjaCBpZiA6XHJcbiAgICAgICAgICAvLyAxLiBUaGV5IGFyZSBub3Qgb2YgdGhlIHNhbWUgdHlwZVxyXG4gICAgICAgICAgLy8gMi4gVGhleSBDYW5ub3QgYmUgY2FzdCAoYWxwaGEgY2FuIGJlIGNhc3QgdG8gdW5pY29kZSlcclxuICAgICAgICAgIC8vIDMuIEFsbCB0aG9zZSBhcHBseSBpZiB0aGUgcGFyYW1ldGVyIGlzIG5vdCBudWxsLiBpZiB0aGUgcGFyYW0gdmFsIGlzIG51bGwgaXQgY2FuIGdvIGludG8gYW55IHR5cGUgb2YgcGFyYW1ldGVyLlxyXG4gICAgICAgICAgaWYgKCFFeHBfcGFyYW1zW2pdLklzTnVsbCAmJiAhU3RvcmFnZUF0dHJpYnV0ZUNoZWNrLmlzVGhlU2FtZVR5cGUoZmllbGRBdHRyLCBhcmdBdHRyKSAmJiAhU3RvcmFnZUF0dHJpYnV0ZUNoZWNrLlN0b3JhZ2VGbGRBbHBoYVVuaWNvZGVPckJsb2IoZmllbGRBdHRyLCBhcmdBdHRyKSkge1xyXG4gICAgICAgICAgICBhcmdzTWF0Y2hlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGorKztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAocGFyYW1Db3VudCAhPT0gRXhwX3BhcmFtcy5sZW5ndGgpIHtcclxuICAgICAgYXJnc01hdGNoZWQgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiBhcmdzTWF0Y2hlZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBPcGVyYXRpb25UYWJsZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0T3BlcmF0aW9uVGFiKCk6IE9wZXJhdGlvblRhYmxlIHtcclxuICAgIHJldHVybiB0aGlzLl9vcGVyYXRpb25UYWI7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEluIGNhc2Ugb2YgQ29udHJvbCBoZWFkZXJzLCByZXR1cm4gY29udHJvbCBuYW1lXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRDb250cm9sTmFtZUZvckNvbnRyb2xIZWFkZXIoKTogc3RyaW5nIHtcclxuICAgIGlmKHRoaXMuZ2V0RXZlbnQoKS5nZXRUeXBlKCkgPT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9JTlRFUk5BTCkge1xyXG5cclxuICAgICAgLy8gUmV0dXJuIHRoZSBjb250cm9sIG5hbWUgZm9yIENvbnRyb2wgSGVhZGVyc1xyXG4gICAgICBpZiAodGhpcy5nZXRFdmVudCgpLmlzQ29udHJvbEhlYWRlcigpICYmICFpc051bGxPclVuZGVmaW5lZCh0aGlzLl9jdHJsKSlcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRDdHJsTmFtZSgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIE5TdHJpbmcuRW1wdHk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEluIGNhc2Ugb2YgVmFyaWFibGUgaGVhZGVycywgcmV0dXJuIGZpZWxkIG5hbWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldFZhck5hbWVGb3JWYXJpYWJsZUhlYWRlcigpOiBzdHJpbmcge1xyXG4gICAgLy8gUmV0dXJuIHRoZSBGaWVsZCBuYW1lIGZvciBWYXJpYWJsZSBIZWFkZXJzXHJcbiAgIGlmICh0aGlzLmdldEV2ZW50KCkuaXNWYXJpYWJsZUhlYWRlcigpICYmICFpc051bGxPclVuZGVmaW5lZCh0aGlzLl9oYW5kbGVyRmxkKSlcclxuICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZXJGbGQuZ2V0VmFyTmFtZSgpLnRvVXBwZXJDYXNlKCk7XHJcblxyXG4gICByZXR1cm4gTlN0cmluZy5FbXB0eTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gUmV0dXJuIHRoZSBldmVudCBoYW5kbGVyIGluZm9ybWF0aW9uIHRvIGJlIGRpc3BsYXllZCBpbiBjYXNlIG9mICdSZXF1ZXN0SW5mbycgbG9nIGxldmVsXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRFdmVudEhhbmRsZXJJbmZvKCk6IHN0cmluZyB7XHJcbiAgICBsZXQgZXZlbnREZXNjcmlwdGlvbjogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7XHJcblxyXG4gICAgdGhpcy5nZXRFdmVudCgpLkFwcGVuZERlc2NyaXB0aW9uKGV2ZW50RGVzY3JpcHRpb24pO1xyXG5cclxuICAgIC8vIEFwcGVuZCBjb250cm9sL3ZhcmlhYmxlIG5hbWUgaW4gQ29udHJvbC9WYXJpYWJsZSBoZWFkZXJzXHJcbiAgICBsZXQgaGVhZGVyQWRkaXRpb25hbEluZm86IHN0cmluZyA9IHRoaXMuZ2V0Q29udHJvbE5hbWVGb3JDb250cm9sSGVhZGVyKCkgKyB0aGlzLmdldFZhck5hbWVGb3JWYXJpYWJsZUhlYWRlcigpO1xyXG5cclxuICAgIGV2ZW50RGVzY3JpcHRpb24uQXBwZW5kKGhlYWRlckFkZGl0aW9uYWxJbmZvKTtcclxuXHJcbiAgICAvLyBGb3Igc29tZSBoZWFkZXJzIGxpa2UgUlAvVFAsIHRoZSBldmVudCBkZXNjcmlwdGlvbiBpcyBlbXB0eS5cclxuICAgIC8vIEZvciBvdGhlcnMgZW1wdHkgc3BhY2Ugc2hvdWxkIGJlIGFkZGVkIGJldHdlZW4gZXZlbnQgdHlwZSBhbmQgZGVzY3JpcHRpb24uXHJcbiAgICAvLyBUaGlzIGlzIGRvbmUgdG8gYXZvaWQgdW5uZWNlc3NhcnkgYmxhbmsgc3BhY2UgYXQgdGhlIGVuZCBvZiB0aGUgZXZlbnQgaGFuZGxlciB0eXBlXHJcbiAgICBpZighTlN0cmluZy5Jc051bGxPckVtcHR5KGV2ZW50RGVzY3JpcHRpb24udG9TdHJpbmcoKSkpXHJcbiAgICAgIGV2ZW50RGVzY3JpcHRpb24gPSBuZXcgU3RyaW5nQnVpbGRlcignICcgKyBldmVudERlc2NyaXB0aW9uLnRvU3RyaW5nKCksIGV2ZW50RGVzY3JpcHRpb24udG9TdHJpbmcoKS5sZW5ndGggKyAxKTtcclxuXHJcbiAgICByZXR1cm4gTlN0cmluZy5Gb3JtYXQoXCJIYW5kbGVyIHswfXsxfVwiLCB0aGlzLmdldEV2ZW50KCkuZ2V0RXZlbnRUeXBlKCksIGV2ZW50RGVzY3JpcHRpb24pO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNoZWNrIGlzIHRhc2sgc2NvcGUgaXMgYXBwcm9wcmlhdGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaXNTYW1lVGFza1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBjaGVja1Rhc2tTY29wZShpc1NhbWVUYXNrOiBib29sZWFuKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5fc2NvcGUgPT09IEJya1Njb3BlLlRhc2sgJiYgIWlzU2FtZVRhc2spXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBOU3RyaW5nLkZvcm1hdChcIihIYW5kbGVyIGZvciB7MH0gb24gdGFzayB7MX0sIHNjb3BlIHsyfSlcIiwgdGhpcy5fZXZ0LCB0aGlzLl90YXNrLCB0aGlzLl9zY29wZSk7XHJcbiAgfVxyXG59XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbi8vLyAgIHVzZWQgdG8gcmV0dXJuIHRoZSByZXN1bHRzIG9mIHRoZSBleGVjdXRlKCkgbWV0aG9kXHJcbi8vLyA8L3N1bW1hcnk+XHJcbmV4cG9ydCBjbGFzcyBSZXRWYWxzICB7XHJcbiAgQmxvY2tJZlJldHVybmVkRnJvbVNlcnZlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEVuYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBOZXh0T3BlcklkeDogbnVtYmVyID0gMDtcclxuICBQcm9wYWdhdGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBSZXR1cm5lZEZyb21TZXJ2ZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgY29uc3RydWN0b3IocDogYm9vbGVhbiwgZTogYm9vbGVhbik7XHJcbiAgY29uc3RydWN0b3Iob3BlcklkeDogbnVtYmVyLCBpblJldHVybmVkRnJvbVNlcnZlcjogYm9vbGVhbiwgaW5CbG9ja0lmUmV0dXJuZWRGcm9tU2VydmVyOiBib29sZWFuKTtcclxuICBjb25zdHJ1Y3RvcihwT3JPcGVySWR4OiBhbnksIGVPckluUmV0dXJuZWRGcm9tU2VydmVyOiBib29sZWFuLCBpbkJsb2NrSWZSZXR1cm5lZEZyb21TZXJ2ZXI/OiBib29sZWFuKSB7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMilcclxuICAgICAgdGhpcy5jb25zdHJ1Y3Rvcl8wKHBPck9wZXJJZHgsIGVPckluUmV0dXJuZWRGcm9tU2VydmVyKTtcclxuICAgIGVsc2VcclxuICAgICAgdGhpcy5jb25zdHJ1Y3Rvcl8xKHBPck9wZXJJZHgsIGVPckluUmV0dXJuZWRGcm9tU2VydmVyLCBpbkJsb2NrSWZSZXR1cm5lZEZyb21TZXJ2ZXIpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicFwiPnByb3BhZ2F0ZSA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZVwiPmVuYWJsZWQgPC9wYXJhbT5cclxuICBwcml2YXRlIGNvbnN0cnVjdG9yXzAocDogYm9vbGVhbiwgZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5Qcm9wYWdhdGUgPSBwO1xyXG4gICAgdGhpcy5FbmFibGVkID0gZTtcclxuICAgIHRoaXMuTmV4dE9wZXJJZHggPSAwO1xyXG4gICAgdGhpcy5SZXR1cm5lZEZyb21TZXJ2ZXIgPSBmYWxzZTtcclxuICAgIHRoaXMuQmxvY2tJZlJldHVybmVkRnJvbVNlcnZlciA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwib3BlcklkeFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaW5SZXR1cm5lZEZyb21TZXJ2ZXJcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImluQmxvY2tJZlJldHVybmVkRnJvbVNlcnZlclwiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcl8xKG9wZXJJZHg6IG51bWJlciwgaW5SZXR1cm5lZEZyb21TZXJ2ZXI6IGJvb2xlYW4sIGluQmxvY2tJZlJldHVybmVkRnJvbVNlcnZlcjogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5Qcm9wYWdhdGUgPSBmYWxzZTtcclxuICAgIHRoaXMuRW5hYmxlZCA9IHRydWU7XHJcbiAgICB0aGlzLk5leHRPcGVySWR4ID0gb3BlcklkeDtcclxuICAgIHRoaXMuUmV0dXJuZWRGcm9tU2VydmVyID0gaW5SZXR1cm5lZEZyb21TZXJ2ZXI7XHJcbiAgICB0aGlzLkJsb2NrSWZSZXR1cm5lZEZyb21TZXJ2ZXIgPSBpbkJsb2NrSWZSZXR1cm5lZEZyb21TZXJ2ZXI7XHJcbiAgfVxyXG59XHJcblxyXG4iXX0=
|