@magic-xpa/engine 4.1100.0-dev4110.252 → 4.1100.0-dev4110.256
Sign up to get free protection for your applications and to get access to all the features.
- package/esm2022/src/ClientManager.mjs +2 -2
- package/esm2022/src/CommandsProcessorBase.mjs +1 -1
- package/esm2022/src/CommandsProcessorManager.mjs +1 -1
- package/esm2022/src/CommandsTable.mjs +1 -1
- package/esm2022/src/CurrentClientVersion.mjs +2 -2
- package/esm2022/src/GUIManager.mjs +1 -1
- package/esm2022/src/GuiEventsProcessor.mjs +1 -1
- package/esm2022/src/ServerConfig.mjs +1 -1
- package/esm2022/src/commands/ClientToServer/ClientOriginatedCommandSerializer.mjs +1 -1
- package/esm2022/src/commands/ClientToServer/CommandFactory.mjs +1 -1
- package/esm2022/src/commands/ClientToServer/CommandSerializationHelper.mjs +1 -1
- package/esm2022/src/commands/ClientToServer/EvaluateCommand.mjs +1 -1
- package/esm2022/src/commands/ClientToServer/ExecOperCommand.mjs +1 -1
- package/esm2022/src/commands/ClientToServer/RollbackEventCommand.mjs +1 -1
- package/esm2022/src/commands/ServerToClient/AbortCommand.mjs +1 -1
- package/esm2022/src/commands/ServerToClient/AddRangeCommand.mjs +1 -1
- package/esm2022/src/commands/ServerToClient/AddSortCommand.mjs +1 -1
- package/esm2022/src/commands/ServerToClient/ClientRefreshCommand.mjs +1 -1
- package/esm2022/src/commands/ServerToClient/ClientTargetedCommandBase.mjs +1 -1
- package/esm2022/src/commands/ServerToClient/EnhancedVerifyCommand.mjs +1 -1
- package/esm2022/src/commands/ServerToClient/OpenURLCommand.mjs +1 -1
- package/esm2022/src/commands/ServerToClient/ResultCommand.mjs +1 -1
- package/esm2022/src/commands/ServerToClient/VerifyCommand.mjs +1 -1
- package/esm2022/src/commands/ServerToClient/XMLBasedCommandBuilder.mjs +1 -1
- package/esm2022/src/data/DataView.mjs +1 -1
- package/esm2022/src/data/DvCache.mjs +1 -1
- package/esm2022/src/data/Field.mjs +1 -1
- package/esm2022/src/data/FieldsTable.mjs +1 -1
- package/esm2022/src/data/Key.mjs +1 -1
- package/esm2022/src/data/Record.mjs +2 -2
- package/esm2022/src/data/RecordsTable.mjs +1 -1
- package/esm2022/src/data/TaskTransactionManager.mjs +1 -1
- package/esm2022/src/data/XMLBasedDcValuesBuilder.mjs +1 -1
- package/esm2022/src/env/EnvVariablesTable.mjs +1 -1
- package/esm2022/src/env/Environment.mjs +1 -1
- package/esm2022/src/env/LanguageData.mjs +1 -1
- package/esm2022/src/env/MirrorString.mjs +1 -1
- package/esm2022/src/event/ActionManager.mjs +1 -1
- package/esm2022/src/event/Event.mjs +1 -1
- package/esm2022/src/event/EventHandler.mjs +1 -1
- package/esm2022/src/event/EventHandlerPosition.mjs +1 -1
- package/esm2022/src/event/EventsManager.mjs +1 -1
- package/esm2022/src/event/RunTimeEvent.mjs +1 -1
- package/esm2022/src/event/UserEventsTable.mjs +1 -1
- package/esm2022/src/exp/ExpTable.mjs +1 -1
- package/esm2022/src/exp/Expression.mjs +1 -1
- package/esm2022/src/exp/ExpressionEvaluator.mjs +1 -1
- package/esm2022/src/exp/ExpressionLocalJpn.mjs +1 -1
- package/esm2022/src/exp/GlobalParamsTable.mjs +1 -1
- package/esm2022/src/exp/YesNoExp.mjs +1 -1
- package/esm2022/src/gui/FormsTable.mjs +1 -1
- package/esm2022/src/gui/MgControl.mjs +1 -1
- package/esm2022/src/gui/MgForm.mjs +1 -1
- package/esm2022/src/http/HttpManager.mjs +1 -1
- package/esm2022/src/http/client/HttpClientAsync.mjs +1 -1
- package/esm2022/src/http/client/HttpClientBase.mjs +1 -1
- package/esm2022/src/http/client/HttpClientEvents.mjs +1 -1
- package/esm2022/src/http/client/HttpClientSync.mjs +1 -1
- package/esm2022/src/http/client/HttpUtility.mjs +1 -1
- package/esm2022/src/remote/AddUserLocateRemoteDataViewCommand.mjs +1 -1
- package/esm2022/src/remote/AddUserRangeRemoteDataViewCommand.mjs +1 -1
- package/esm2022/src/remote/AddUserSortRemoteDataViewCommand.mjs +1 -1
- package/esm2022/src/remote/RemoteCommandsProcessor.mjs +1 -1
- package/esm2022/src/remote/RemoteControlItemsRefreshCommand.mjs +1 -1
- package/esm2022/src/remote/RemoteDataViewCommandBase.mjs +1 -1
- package/esm2022/src/remote/RemoteDataViewCommandFactory.mjs +1 -1
- package/esm2022/src/remote/ResetUserLocateRemoteDataviewCommand.mjs +1 -1
- package/esm2022/src/remote/ResetUserSortRemoteDataviewCommand.mjs +1 -1
- package/esm2022/src/remote/ServerError.mjs +1 -1
- package/esm2022/src/remote/SetTransactionStateRemoteDataViewCommand.mjs +1 -1
- package/esm2022/src/rt/Argument.mjs +1 -1
- package/esm2022/src/rt/ArgumentsList.mjs +1 -1
- package/esm2022/src/rt/Boundary.mjs +1 -1
- package/esm2022/src/rt/CompMainPrgTable.mjs +1 -1
- package/esm2022/src/rt/DataviewHeaderBase.mjs +1 -1
- package/esm2022/src/rt/DataviewHeaders.mjs +1 -1
- package/esm2022/src/rt/DataviewHeadersSaxHandler.mjs +1 -1
- package/esm2022/src/rt/ExecutionStack.mjs +1 -1
- package/esm2022/src/rt/HandlersTable.mjs +1 -1
- package/esm2022/src/rt/LastFocusedManager.mjs +1 -1
- package/esm2022/src/rt/Operation.mjs +1 -1
- package/esm2022/src/rt/OperationTable.mjs +1 -1
- package/esm2022/src/rt/Recompute.mjs +1 -1
- package/esm2022/src/rt/RecomputeTable.mjs +1 -1
- package/esm2022/src/rt/RemoteDataviewHeader.mjs +1 -1
- package/esm2022/src/rt/TableCache.mjs +1 -1
- package/esm2022/src/rt/TableCacheManager.mjs +1 -1
- package/esm2022/src/rt/Transaction.mjs +1 -1
- package/esm2022/src/security/UserDetails.mjs +1 -1
- package/esm2022/src/tasks/MGData.mjs +1 -1
- package/esm2022/src/tasks/MGDataCollection.mjs +1 -1
- package/esm2022/src/tasks/RCTimer.mjs +1 -1
- package/esm2022/src/tasks/RemoteTaskService.mjs +1 -1
- package/esm2022/src/tasks/Task.mjs +1 -1
- package/esm2022/src/tasks/TaskBase.mjs +1 -1
- package/esm2022/src/tasks/TaskServiceBase.mjs +1 -1
- package/esm2022/src/tasks/TasksTable.mjs +1 -1
- package/esm2022/src/tasks/sort/SortCollection.mjs +1 -1
- package/esm2022/src/util/ConstUtils.mjs +1 -1
- package/esm2022/src/util/FlowMonitorQueue.mjs +1 -1
- package/esm2022/src/util/HeapSort.mjs +1 -1
- package/esm2022/src/util/MgPriorityBlockingQueue.mjs +1 -1
- package/esm2022/src/util/MgPriorityQueue.mjs +1 -1
- package/esm2022/src/util/PrmMap.mjs +1 -1
- package/esm2022/src/util/Scrambler.mjs +1 -1
- package/esm2022/src/util/UniqueIDUtils.mjs +1 -1
- package/esm2022/src/util/cookie.service.mjs +1 -1
- package/fesm2022/magic-xpa-engine.mjs +3 -3
- package/fesm2022/magic-xpa-engine.mjs.map +1 -1
- package/package.json +4 -4
@@ -2985,4 +2985,4 @@ export class EventsManager {
|
|
2985
2985
|
this.isInViewRefresh = inViewRefresh;
|
2986
2986
|
}
|
2987
2987
|
}
|
2988
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXZlbnRzTWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VuZ2luZS9zcmMvZXZlbnQvRXZlbnRzTWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFNBQVMsRUFDVCxpQkFBaUIsRUFDakIsTUFBTSxFQUNOLGdCQUFnQixFQUNoQixhQUFhLEVBQ2IsSUFBSSxFQUNKLFlBQVksRUFDWixRQUFRLEVBQ1IsT0FBTyxFQUNQLGdCQUFnQixFQUNoQixPQUFPLEVBQ1AsV0FBVyxFQUNaLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFDLG9CQUFvQixFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxpQkFBaUIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQzNJLE9BQU8sRUFDTCxRQUFRLEVBQ1IsV0FBVyxFQUNYLHFCQUFxQixFQUNyQixNQUFNLEVBQ04sWUFBWSxFQUNaLFlBQVksRUFDWixjQUFjLEVBRWQsWUFBWSxFQUVaLE9BQU8sRUFHUCxTQUFTLEVBQ1QsYUFBYSxFQUNiLGtCQUFrQixFQUNsQixNQUFNLEVBQ04sZ0JBQWdCLEVBQ2pCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUN0QyxPQUFPLEVBQUMsaUNBQWlDLEVBQUMsTUFBTSxpREFBaUQsQ0FBQztBQUNsRyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDM0MsT0FBTyxFQUFDLHVCQUF1QixFQUFDLE1BQU0saUNBQWlDLENBQUM7QUFHeEUsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRzVDLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQzFE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UUFFRCxVQUFVLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFHRCxrQkFBa0IsQ0FBQyxXQUFtQjtRQUNwQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLGVBQWUsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUNwRSxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUdELHFCQUFxQixDQUFDLEVBQXdCO1FBQzVDLElBQUcsQ0FBQyxDQUFDLEVBQUUsWUFBWSxXQUFXLENBQUM7WUFDN0IsT0FBTyxJQUFJLENBQUM7UUFJZCxJQUFHLENBQWUsRUFBRyxDQUFDLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQyw0QkFBNEI7WUFDMUQsRUFBRyxDQUFDLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQyw4QkFBOEIsQ0FBQztZQUN6RSxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsU0FBUyxLQUFLLGtCQUFrQixDQUFDLFdBQVc7WUFDMUUsT0FBTyxLQUFLLENBQUM7UUFFZixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxrQkFBa0I7UUFDaEIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQzlCLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxhQUFzQjtRQUN2QyxJQUFJLENBQUMsZUFBZSxHQUFHLGFBQWEsQ0FBQztJQUN2QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb25zdGFudHMsXHJcbiAgRm9yY2VFeGl0LFxyXG4gIEludGVybmFsSW50ZXJmYWNlLFxyXG4gIExvZ2dlcixcclxuICBMb2dnZXJfTG9nTGV2ZWxzLFxyXG4gIE1nQ29udHJvbFR5cGUsXHJcbiAgTWlzYyxcclxuICBNc2dJbnRlcmZhY2UsXHJcbiAgUHJpb3JpdHksXHJcbiAgUmFpc2VBdCxcclxuICBTdG9yYWdlQXR0cmlidXRlLFxyXG4gIFN0clV0aWwsXHJcbiAgU3ViZm9ybVR5cGVcclxufSBmcm9tICdAbWFnaWMteHBhL3V0aWxzJztcclxuaW1wb3J0IHtBcHBsaWNhdGlvbkV4Y2VwdGlvbiwgSW50MzIsIExpc3QsIE5TdHJpbmcsIFJlZlBhcmFtLCBTdGFjaywgU3RyaW5nQnVpbGRlciwgVGhyZWFkLCBpc051bGxPclVuZGVmaW5lZH0gZnJvbSAnQG1hZ2ljLXhwYS9tc2NvcmVsaWInO1xyXG5pbXBvcnQge1xyXG4gIENvbW1hbmRzLFxyXG4gIENvbW1hbmRUeXBlLFxyXG4gIERhdGFNb2RpZmljYXRpb25UeXBlcyxcclxuICBFeHBWYWwsXHJcbiAgRm9jdXNNYW5hZ2VyLFxyXG4gIEd1aUNvbnN0YW50cyxcclxuICBHdWlFbnZpcm9ubWVudCxcclxuICBJVGFzayxcclxuICBLZXlib2FyZEl0ZW0sXHJcbiAgTGFzdEZvY3VzZWRWYWwsXHJcbiAgTWFuYWdlcixcclxuICBNZ0NvbnRyb2xCYXNlLFxyXG4gIE1nRm9ybUJhc2UsXHJcbiAgTW9kaWZpZXJzLFxyXG4gIFByb3BJbnRlcmZhY2UsXHJcbiAgUnVudGltZUNvbnRleHRCYXNlLFxyXG4gIFN0eWxlcyxcclxuICBUYXNrRGVmaW5pdGlvbklkXHJcbn0gZnJvbSAnQG1hZ2ljLXhwYS9ndWknO1xyXG5pbXBvcnQge0V2ZW50U3ViVHlwZX0gZnJvbSAnLi4vZW51bXMnO1xyXG5pbXBvcnQge1JvbGxiYWNrRXZlbnRDb21tYW5kX1JvbGxiYWNrVHlwZX0gZnJvbSAnLi4vY29tbWFuZHMvQ2xpZW50VG9TZXJ2ZXIvUm9sbGJhY2tFdmVudENvbW1hbmQnO1xyXG5pbXBvcnQge01nQ29udHJvbH0gZnJvbSAnLi4vZ3VpL01nQ29udHJvbCc7XHJcbmltcG9ydCB7TWdQcmlvcml0eUJsb2NraW5nUXVldWV9IGZyb20gJy4uL3V0aWwvTWdQcmlvcml0eUJsb2NraW5nUXVldWUnO1xyXG5pbXBvcnQge0NvbXBNYWluUHJnVGFibGV9IGZyb20gJy4uL3J0L0NvbXBNYWluUHJnVGFibGUnO1xyXG5pbXBvcnQge0ZpZWxkfSBmcm9tICcuLi9kYXRhL0ZpZWxkJztcclxuaW1wb3J0IHtSdW5UaW1lRXZlbnR9IGZyb20gJy4vUnVuVGltZUV2ZW50JztcclxuaW1wb3J0IHtNZ0Zvcm19IGZyb20gJy4uL2d1aS9NZ0Zvcm0nO1xyXG5pbXBvcnQge0V2ZW50SGFuZGxlciwgUmV0VmFsc30gZnJvbSAnLi9FdmVudEhhbmRsZXInO1xyXG5pbXBvcnQge0Zsb3dNb25pdG9yUXVldWV9IGZyb20gJy4uL3V0aWwvRmxvd01vbml0b3JRdWV1ZSc7XHJcbmltcG9ydCB7R1VJTWFuYWdlcn0gZnJvbSAnLi4vR1VJTWFuYWdlcic7XHJcbmltcG9ydCB7VGFza30gZnJvbSAnLi4vdGFza3MvVGFzayc7XHJcbmltcG9ydCB7VGFza19TdWJmb3JtRXhlY01vZGVFbnVtLCBUYXNrQmFzZX0gZnJvbSAnLi4vdGFza3MvVGFza0Jhc2UnO1xyXG5pbXBvcnQge0FyZ3VtZW50c0xpc3R9IGZyb20gJy4uL3J0L0FyZ3VtZW50c0xpc3QnO1xyXG5pbXBvcnQge01HRGF0YX0gZnJvbSAnLi4vdGFza3MvTUdEYXRhJztcclxuaW1wb3J0IHtIYW5kbGVyc1RhYmxlfSBmcm9tICcuLi9ydC9IYW5kbGVyc1RhYmxlJztcclxuaW1wb3J0IHtNR0RhdGFDb2xsZWN0aW9ufSBmcm9tICcuLi90YXNrcy9NR0RhdGFDb2xsZWN0aW9uJztcclxuaW1wb3J0IHtSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9ufSBmcm9tICcuLi9kYXRhL1JlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24nO1xyXG5pbXBvcnQge0NvbW1hbmRzUHJvY2Vzc29yQmFzZSwgQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1NlbmRpbmdJbnN0cnVjdGlvbn0gZnJvbSAnLi4vQ29tbWFuZHNQcm9jZXNzb3JCYXNlJztcclxuaW1wb3J0IHtDb21tYW5kc1RhYmxlfSBmcm9tICcuLi9Db21tYW5kc1RhYmxlJztcclxuaW1wb3J0IHtDb21tYW5kRmFjdG9yeX0gZnJvbSAnLi4vY29tbWFuZHMvQ2xpZW50VG9TZXJ2ZXIvQ29tbWFuZEZhY3RvcnknO1xyXG5pbXBvcnQge0lDbGllbnRDb21tYW5kfSBmcm9tICcuLi9jb21tYW5kcy9JQ2xpZW50Q29tbWFuZCc7XHJcbmltcG9ydCB7Q29tbWFuZHNQcm9jZXNzb3JNYW5hZ2VyfSBmcm9tICcuLi9Db21tYW5kc1Byb2Nlc3Nvck1hbmFnZXInO1xyXG5pbXBvcnQge09wZXJhdGlvbn0gZnJvbSAnLi4vcnQvT3BlcmF0aW9uJztcclxuaW1wb3J0IHtDbGllbnRSZWZyZXNoQ29tbWFuZH0gZnJvbSAnLi4vY29tbWFuZHMvU2VydmVyVG9DbGllbnQvQ2xpZW50UmVmcmVzaENvbW1hbmQnO1xyXG5pbXBvcnQge1JlbW90ZUNvbW1hbmRzUHJvY2Vzc29yfSBmcm9tICcuLi9yZW1vdGUvUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3InO1xyXG5pbXBvcnQge0V4ZWN1dGlvblN0YWNrfSBmcm9tICcuLi9ydC9FeGVjdXRpb25TdGFjayc7XHJcbmltcG9ydCB7RXhlY3V0aW9uU3RhY2tFbnRyeX0gZnJvbSAnLi4vcnQvRXhlY3V0aW9uU3RhY2tFbnRyeSc7XHJcbmltcG9ydCB7RXZlbnRIYW5kbGVyUG9zaXRpb259IGZyb20gJy4vRXZlbnRIYW5kbGVyUG9zaXRpb24nO1xyXG5pbXBvcnQge0RhdGFWaWV3fSBmcm9tICcuLi9kYXRhL0RhdGFWaWV3JztcclxuaW1wb3J0IHtFdmVudH0gZnJvbSAnLi9FdmVudCc7XHJcbmltcG9ydCB7UmVjb3JkfSBmcm9tICcuLi9kYXRhL1JlY29yZCc7XHJcbmltcG9ydCB7Q29uc3RJbnRlcmZhY2V9IGZyb20gJy4uL0NvbnN0SW50ZXJmYWNlJztcclxuaW1wb3J0IHtGbG93TW9uaXRvckludGVyZmFjZX0gZnJvbSAnLi4vRmxvd01vbml0b3JJbnRlcmZhY2UnO1xyXG5pbXBvcnQge0RhdGFWaWV3Q29tbWFuZFR5cGV9IGZyb20gJy4uL2NvbW1hbmRzL0NsaWVudFRvU2VydmVyL0RhdGF2aWV3Q29tbWFuZCc7XHJcbmltcG9ydCB7U2VydmVyRXJyb3J9IGZyb20gJy4uL3JlbW90ZS9TZXJ2ZXJFcnJvcic7XHJcbmltcG9ydCB7RW52aXJvbm1lbnR9IGZyb20gJy4uL2Vudi9FbnZpcm9ubWVudCc7XHJcbmltcG9ydCB7TGFzdEZvY3VzZWRNYW5hZ2VyfSBmcm9tICcuLi9ydC9MYXN0Rm9jdXNlZE1hbmFnZXInO1xyXG5pbXBvcnQge0V2ZW50c0FsbG93ZWRUeXBlLCBJRXZlbnRzTWFuYWdlcn0gZnJvbSAnLi9JRXZlbnRzTWFuYWdlcic7XHJcbmltcG9ydCB7TGFuZ3VhZ2VEYXRhfSBmcm9tICcuLi9lbnYvTGFuZ3VhZ2VEYXRhJztcclxuaW1wb3J0IHtTdWJqZWN0fSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHtDbGllbnRNYW5hZ2VyfSBmcm9tICcuLi9DbGllbnRNYW5hZ2VyJztcclxuaW1wb3J0IHtDb250ZXh0VGVybWluYXRpb25FdmVudENvbW1hbmR9IGZyb20gJy4uL2NvbW1hbmRzL0NsaWVudFRvU2VydmVyL0NvbnRleHRUZXJtaW5hdGlvbkV2ZW50Q29tbWFuZCc7XHJcbmltcG9ydCB7IENsZWFyRXZlbnRzT25TdG9wRXhlY3V0aW9uIH0gZnJvbSAnLi4vQWNjZXNzSGVscGVyJztcclxuXHJcblxyXG5lbnVtIEV2ZW50U2NvcGUge1xyXG4gIE5PTkUgPSAnICcsXHJcbiAgVFJBTlMgPSAnVCdcclxufVxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gICB0aGlzIGNsYXNzIG1hbmFnZSB0aGUgZXZlbnRzLCBwdXQgdGhlbSBpbiBhIHF1ZXVlIGFuZCBoYW5kbGUgdGhlbVxyXG4vLy8gPC9zdW1tYXJ5PlxyXG5leHBvcnQgY2xhc3MgRXZlbnRzTWFuYWdlciBpbXBsZW1lbnRzIElFdmVudHNNYW5hZ2VyIHtcclxuICAvLyBMT0NBTCBDT05TVEFOVFNcclxuICBwcml2YXRlIHN0YXRpYyBSRUFMX09OTFk6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIHByaXZhdGUgc3RhdGljIE1BWF9PUEVSOiBudW1iZXIgPSA5OTk5O1xyXG4gIHByaXZhdGUgc3RhdGljIHVzZXJHcmFudGVkRm9yQ29udGV4dEFjdGl2aXR5ID0gdHJ1ZTtcclxuICBwcml2YXRlIF9ldmVudHNRdWV1ZTogTWdQcmlvcml0eUJsb2NraW5nUXVldWUgPSBudWxsOyAvLyB0aGUgcXVldWUgb2YgZXZlbnRzIHRvIGV4ZWN1dGVcclxuICBwcml2YXRlIF9leGVjU3RhY2s6IFN0YWNrPEV4ZWN1dGlvblN0YWNrPiA9IG51bGw7IC8vIEV4ZWN1dGlvbiBzdGFjayBvZiByYWlzZSBldmVudCBvcGVyYXRpb24gb3IgY2FsbHMgdG8gdXNlclxyXG4gIHByaXZhdGUgX3J0RXZlbnRzOiBTdGFjazxSdW5UaW1lRXZlbnQ+ID0gbnVsbDsgLy8gQSBzdGFjayBvZiBpbi1wcm9jZXNzIHJ1bi10aW1lIGV2ZW50cyAodGhlIGxhc3Qgb25lIGlzIGF0IHRoZSB0b3ApLlxyXG4gIHByaXZhdGUgX3NlcnZlckV4ZWNTdGFjazogU3RhY2s8RXhlY3V0aW9uU3RhY2s+ID0gbnVsbDsgLy8gRXhlY3V0aW9uIHN0YWNrIG9mIEV4ZWN1dGlvbiBzdGFja3Mgb2Ygb3BlcmF0aW9ucyB0aGF0XHJcbiAgcHJpdmF0ZSBfYWxsb3dFdmVudHM6IEV2ZW50c0FsbG93ZWRUeXBlID0gRXZlbnRzQWxsb3dlZFR5cGUuQUxMO1xyXG4gIHByaXZhdGUgX2NvbXBNYWluUHJnVGFiOiBDb21wTWFpblByZ1RhYmxlID0gbnVsbDsgLy8gdGhlIG9yZGVyIG9mIGhhbmRsaW5nIG1haW4gcHJvZ3JhbXMgb2YgY29tcG9uZW50c1xyXG4gIHByaXZhdGUgX2N1cnJDdHJsOiBNZ0NvbnRyb2wgPSBudWxsO1xyXG4gIHByaXZhdGUgX2N1cnJGaWVsZDogRmllbGQgPSBudWxsOyAvLyBmb3IgZXZlcnkgZXZlbnQgZXhlY3V0ZWQgdGhpcyB2YXJpYWJsZSB3aWxsIGNvbnRhaW4gdGhlIGZpZWxkIGF0dGFjaGVkIHRvIHRoZSBjb250cm9sIG9uIHdoaWNoIHRoZSBldmVudCB3YXMgZmlyZWRcclxuICBwcml2YXRlIF9jdXJyS2JkSXRlbTogS2V5Ym9hcmRJdGVtID0gbnVsbDtcclxuICBwcml2YXRlIF9lbmRPZldvcms6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9ldmVudFNjb3BlOiBFdmVudFNjb3BlID0gRXZlbnRTY29wZS5OT05FOyAvLyBpbnN0cnVjdHMgaG93IHRvIHByb2Nlc3MgZXZlbnRzIHdoaWNoIGFyZSBwcm9wYWdhdGVkIHRvIHNsYXZlIHRhc2tzIGR1cmluZyBleGVjdXRpb24uXHJcbiAgcHJpdmF0ZSBfZm9yY2VFeGl0OiBGb3JjZUV4aXQgPSBGb3JjZUV4aXQuTm9uZTtcclxuICBwcml2YXRlIF9mb3JjZUV4aXRUYXNrOiBUYXNrID0gbnVsbDtcclxuICBwcml2YXRlIF9pZ25vcmVVbmtub3duQWJvcnQ6IGJvb2xlYW4gPSBmYWxzZTsgLy8gVFJVRSB3aGVuICdhYm9ydCcgY29tbWFuZHMgb24gdW5rbm93biB0YXNrcyBtYXkgYXJyaXZlXHJcbiAgcHJpdmF0ZSBfaW5pdGlhbGl6ZWQ6IGJvb2xlYW4gPSBmYWxzZTsgLy8gdXNlZCB0byBkZXRlY3QgcmUtaW5pdGlhbGl6YXRpb25cclxuICBwcml2YXRlIF9pc0hhbmRsaW5nRm9yY2VFeGl0OiBib29sZWFuID0gZmFsc2U7IC8vIGluZGljYXRlIHdlIGFyZSBjdXJyZW50bHkgaGFuZGxpbmcgYSBmb3JjZUV4aXQgcmVsYXRlZCBoYW5kbGVyXHJcbiAgcHJpdmF0ZSBfaXNOb25SZXZlcnNpYmxlRXhpdDogYm9vbGVhbiA9IGZhbHNlOyAvLyBpcyB0aGUgY29tbWFuZCBub25yZXZlcnNpYmxlXHJcbiAgcHJpdmF0ZSBfaXNJblJlY29yZEZsdXNoRXZlbnQ6IGJvb2xlYW4gPSBmYWxzZTsgLy8gdHJ1ZSBpZiBjdXJyZW50IGFjdCBpcyBNR19BQ1RfUlRfUkVGUkVTSF9SRUNPUkRcclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgY2xpZW50SW5hY3Rpdml0eVRpbWVyT04gPSBmYWxzZTtcclxuICBwcml2YXRlIHN0YXRpYyBjbGllbnRDb250ZXh0SW5hY3Rpdml0eVRpbWVyQWJvcnRlZCA9IGZhbHNlO1xyXG4gIHByaXZhdGUgbGFzdFNhdmVkUm91dGVFdmVudDogUnVuVGltZUV2ZW50ID0gbnVsbDtcclxuICAvLyB3YXMgc2VudCBmcm9tIHRoZSBzZXJ2ZXIuIHdlIG5lZWQgYSBzdGFjayBvZiBleGVjc3RhY2tzXHJcbiAgLy8gaGVyZSBiZWNhdXNlIHdlIG1pZ2h0IGNhbGwgYSBuZXcgcHJvZ3JhbSBiZWZvcmUgd2UgaGFuZGxlZFxyXG4gIC8vIHRoZSBwcmV2aW91cyBzZXJ2ZXIgZXhlYyBzdGFja1xyXG4gIHByaXZhdGUgX3N0b3BFeGVjdXRpb246IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9wcm9jZXNzaW5nVG9wTW9zdEVuZFRhc2s6IGJvb2xlYW4gPSBmYWxzZTsgLy8gaW5kaWNhdGlvbiB3aGV0aGVyIHdlIGFyZSBjdXJyZW50bHkgcHJvY2Vzc2luZyBldmVudHMgZnJvbSB0aGVcclxuICBwcml2YXRlIF9zdG9wRXhlY3V0aW9uQ3RybDogTWdDb250cm9sID0gbnVsbDsgLy8gaG9sZHMgdGhlIGN0cmwgb24gd2hpY2ggd2UgZ2V0IHRoZSBmaXJzdCBzdG9wIGV4ZWN1dGlvblxyXG5cclxuICBwdWJsaWMgZ3VpUGVuZGluZ0V2ZW50OiBhbnkgPSBudWxsO1xyXG4gIC8vIEtFWUJPQVJEIEVWRU5UUyBDT05TVEFOVFNcclxuICByZWFkb25seSBLQklfRE9XTjogS2V5Ym9hcmRJdGVtID0gbnVsbDtcclxuICByZWFkb25seSBLQklfVVA6IEtleWJvYXJkSXRlbSA9IG51bGw7XHJcblxyXG4gIC8vIENPTlRFWFQgVEVSTUlOQVRJT04gV0FSTklORyBDT05TVEFOVFNcclxuICByZWFkb25seSBjb25maXJtYXRpb25EaWFsb2dNc2c6IHN0cmluZyA9ICdUaGUgc2VydmVyIGNvbnRleHQgc2VydmluZyB0aGlzIGFwcGxpY2F0aW9uIGlzIGFib3V0IHRvIHRpbWUgb3V0LiBEbyB5b3Ugd2FudCB0byBjb250aW51ZSB5b3VyIHdvcms/JztcclxuICByZWFkb25seSBjb25maXJtYXRpb25EaWFsb2dUaXRsZTogc3RyaW5nID0gJ1Nlc3Npb24gaXMgYWJvdXQgdG8gYmUgdGVybWluYXRlZCEnO1xyXG5cclxuICBzdGF0aWMgSW5zdGFuY2U6IEV2ZW50c01hbmFnZXIgPSBuZXcgRXZlbnRzTWFuYWdlcigpO1xyXG5cclxuICBwcml2YXRlIF9sYXN0RmFpbGVkRm9jdXNlZENvbnRyb2w6IE1nQ29udHJvbEJhc2UgPSBudWxsO1xyXG5cclxuICBwcml2YXRlIGlzU3Bpbm5lclNob3duOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBpc0luVmlld1JlZnJlc2g6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgU3Bpbm5lclN0b3BwZWQ6IFN1YmplY3Q8bnVtYmVyPiA9IG5ldyBTdWJqZWN0KCk7XHJcblxyXG4gIHN0YXRpYyBjbGllbnRCdXN5VGltZVN0YXJ0ID0gMDtcclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcHJpdmF0ZSBDVE9SIHRvIHByZXZlbnQgaW5zdGFudGlhdGlvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHRoaXMuX3J0RXZlbnRzID0gbmV3IFN0YWNrKCk7XHJcblxyXG4gICAgdGhpcy5fZXZlbnRzUXVldWUgPSBuZXcgTWdQcmlvcml0eUJsb2NraW5nUXVldWUoKTtcclxuXHJcbiAgICB0aGlzLl9leGVjU3RhY2sgPSBuZXcgU3RhY2soKTtcclxuICAgIHRoaXMuX2V4ZWNTdGFjay5wdXNoKG5ldyBFeGVjdXRpb25TdGFjaygpKTtcclxuXHJcbiAgICB0aGlzLl9zZXJ2ZXJFeGVjU3RhY2sgPSBuZXcgU3RhY2soKTtcclxuICAgIHRoaXMuX3NlcnZlckV4ZWNTdGFjay5wdXNoKG51bGwpO1xyXG5cclxuXHJcbiAgICB0aGlzLktCSV9ET1dOID0gbmV3IEtleWJvYXJkSXRlbShHdWlDb25zdGFudHMuS0VZX0RPV04sIE1vZGlmaWVycy5NT0RJRklFUl9OT05FKTtcclxuICAgIHRoaXMuS0JJX1VQID0gbmV3IEtleWJvYXJkSXRlbShHdWlDb25zdGFudHMuS0VZX1VQLCBNb2RpZmllcnMuTU9ESUZJRVJfTk9ORSk7XHJcblxyXG4gIH1cclxuXHJcbiAgZ2V0UGVuZGluZ0d1aUV2ZW50KCk6IGFueSB7XHJcbiAgICByZXR1cm4gdGhpcy5ndWlQZW5kaW5nRXZlbnQ7XHJcbiAgfVxyXG5cclxuICBzZXRQZW5kaW5nR3VpRXZlbnQoZ3VpRXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5ndWlQZW5kaW5nRXZlbnQgPSBndWlFdmVudDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBhZGQgYW4gZXZlbnQgdG8gdGhlIGVuZCBvZiB0aGUgcXVldWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaXJ0RXZ0XCI+dGhlIGV2ZW50IHRvIGJlIGFkZGVkIDwvcGFyYW0+XHJcbiAgYWRkVG9UYWlsKHJ0RXZ0OiBSdW5UaW1lRXZlbnQpOiB2b2lkIHtcclxuICAgIC8vIGlmIGN1cnJlbnQgZXZlbnQgaXMgbm90IGlkbGUgdGltZSBldmVudCBjaGVjayBpZiB0aGVyZSBpcyBjbGllbnRJbmFjdGl2aXR5VGltZXIgcnVubmluZz9cclxuICAgIC8vIGlmIHNvICwgc3RvcCB0aGlzIGNsaWVudCBDb250ZXh0IGluYWN0aXZpdHkgdGltZXJcclxuICAgIGlmICghcnRFdnQuaXNJZGxlVGltZXIoKSkge1xyXG4gICAgICBpZiAoRXZlbnRzTWFuYWdlci5jbGllbnRJbmFjdGl2aXR5VGltZXJPTikge1xyXG4gICAgICAgIEV2ZW50c01hbmFnZXIuY2xpZW50Q29udGV4dEluYWN0aXZpdHlUaW1lckFib3J0ZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG5cclxuICAgICAgLy8gaWYgY2xpZW50IGlzIGlkbGUgYWZ0ZXIgcmVjcmVhdGluZyBjb250ZXh0ICwgdGhlbiBhZGQgbGFzdCBzYXZlZCByb3V0ZSBldmVudFxyXG4gICAgICBpZiAodGhpcy5nZXRMYXN0U2F2ZWRSb3V0ZUV2ZW50KCkgIT0gbnVsbCkge1xyXG4gICAgICAgIHRoaXMuYWRkVG9UYWlsKHRoaXMuZ2V0TGFzdFNhdmVkUm91dGVFdmVudCgpKTtcclxuICAgICAgICB0aGlzLnNldExhc3RTYXZlZFJvdXRlRXZlbnQobnVsbCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9ldmVudHNRdWV1ZS5wdXQocnRFdnQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGFkZCBhbiBrZXlib2FyZCBldmVudCB0byB0aGUgZW5kIG9mIHRoZSBxdWV1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJtZ0Zvcm1cIj5mb3JtIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJtZ0NvbnRyb2xcIj5jb250cm9sIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJtb2RpZmllclwiPm1vZGlmaWVyIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzdGFydFwiPnN0YXJ0IG9mIHNlbGVjdGVkIHRleHQgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImVuZFwiPmVuZCBvZiBzZWxlY3RlZCB0ZXh0ICA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGV4dFwiPnRleHQgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImltXCI+aW0gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlzQWN0Q2hhclwiPmlzIGtleWJvYXJkIGNoYXIgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInN1Z2dlc3RlZFZhbHVlXCI+c3VnZ2VzdGVkIHZhbHVlIGZvciBjaG9pY2UgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNvZGVcIj5jb2RlIHRvIGJlIGFkZGVkIGluIHRoZSBxdWV1ZSA8L3BhcmFtPlxyXG4gIEFkZEtleWJvYXJkRXZlbnQobWdGb3JtOiBNZ0Zvcm1CYXNlLCBtZ0NvbnRyb2w6IE1nQ29udHJvbEJhc2UsIG1vZGlmaWVyOiBNb2RpZmllcnMsIGtleUNvZGU6IG51bWJlciwgc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIsIHRleHQ6IHN0cmluZywgaXNBY3RDaGFyOiBib29sZWFuLCBzdWdnZXN0ZWRWYWx1ZTogc3RyaW5nLCBjb2RlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gKG1nQ29udHJvbCAhPT0gbnVsbCkgPyBuZXcgUnVuVGltZUV2ZW50KDxNZ0NvbnRyb2w+bWdDb250cm9sLCB0cnVlLCBmYWxzZSkgOiBuZXcgUnVuVGltZUV2ZW50KDxUYXNrPm1nRm9ybS5nZXRUYXNrKCksIHRydWUpO1xyXG5cclxuICAgIHJ0RXZ0LnNldEludGVybmFsKGNvZGUpO1xyXG5cclxuICAgIGxldCBuZXdLYkl0ZW06IEtleWJvYXJkSXRlbSA9IG5ldyBLZXlib2FyZEl0ZW0oa2V5Q29kZSwgbW9kaWZpZXIpO1xyXG5cclxuICAgIGlmIChpc0FjdENoYXIgJiYgKG1nQ29udHJvbCAhPT0gbnVsbCAmJiAobWdDb250cm9sLmlzVGV4dENvbnRyb2woKSkpKVxyXG4gICAgICBuZXdLYkl0ZW0uc2V0QWN0aW9uKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DSEFSKTtcclxuXHJcbiAgICBydEV2dC5zZXRLZXlib2FyZEl0ZW0obmV3S2JJdGVtKTtcclxuXHJcbiAgICBpZiAoY29kZSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfS0VZRE9XTikge1xyXG4gICAgICBydEV2dC5zZXRFZGl0UGFybXMoc3RhcnQsIGVuZCwgdGV4dCk7XHJcbiAgICB9IGVsc2VcclxuICAgICAgcnRFdnQuc2V0VmFsdWUoc3VnZ2VzdGVkVmFsdWUpO1xyXG5cclxuICAgIHRoaXMuYWRkVG9UYWlsKHJ0RXZ0KTtcclxuICAgIHJldHVybjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBRQ1IgNzYwMzgxIGlmIGFmdGVyIGhhbmRsaW5nIHRoZSBldmVudCB0aGUgY3VycmVudCBjb250cm9sIGlzIHVucGFya2FibGUgdHJ5XHJcbiAgLy8vICAgYW4gbW92ZSB0byB0aGUgbmV4dCBwYXJrYWJsZSBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyBjaGVja1BhcmthYmlsaXR5KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGN1cnJlbnQ6IE1nQ29udHJvbCA9IExhc3RGb2N1c2VkTWFuYWdlci5nZXRMYXN0Rm9jdXNlZENvbnRyb2woKTtcclxuXHJcbiAgICAvKiBRQ1IjIDkyNTQ2NC4gVGhlIHByb2JsZW0gd2FzIHRoYXQgb24gZGVsZXRpbmcgYSByZWNvcmQsIENTIG9mIHRoZSBjb250cm9sIGdldHMgZXhlY3V0ZWQuXHJcbiAgICAgKiBTbywgdGhlIHRhc2sncyBsZXZlbCBpcyBzZXQgdG8gVEFTSy4gVGhlbiB3ZSBnbyB0byBzZXJ2ZXIgYW4gb24gcmV0dXJuaW5nIGJhY2sgZnJvbSB0aGUgc2VydmVyLFxyXG4gICAgICogd2UgcmVmcmVzaCB0aGUgZm9ybS4gSGVyZSwgc2luY2UgdGhlIGxhc3QgcGFya2VkIGNvbnRyb2wgaS5lLiBcImZyb21cIiAobnVtZXJpYykgaXMgaGlkZGVuLFxyXG4gICAgICogd2UgdHJ5IHRvIHBhcmsgb24gdGhlIG5leHQgcGFya2FibGUgY29udHJvbCBmcm9tIFByb3BlcnR5LlJlZnJlc2hEaXNwbGF5KCkuIFRoaXMgbWFrZXMgdGhlXHJcbiAgICAgKiB0YXNrJ3MgbGV2ZWwgYXMgQ09OVFJPTC4gTm93LCB3ZSB0cnkgdG8gZXhlY3V0ZSBSUCwgYnV0IHNpbmNlIHRoZSBsZXZlbCBpcyBDT05UUk9MLFxyXG4gICAgICogd2UgZG8gbm90IGV4ZWN1dGUgaXQuIFRoZSBzb2x1dGlvbiBpcyB0aGF0IGNoZWNrUGFya2FiaWxpdHkoKSB3aGljaCBpcyBjYWxsZWQgZnJvbVxyXG4gICAgICogUHJvcGVydHkuUmVmcmVzaERpc3BsYXkoKSwgc2hvdWxkIHRyeSB0byBwYXJrIG9uIHRoZSBjb250cm9sIG9ubHkgaWYgdGhlIHRhc2sncyBsZXZlbCBpcyBDT05UUk9MLlxyXG4gICAgICovXHJcbiAgICBpZiAoY3VycmVudCAhPT0gbnVsbCAmJiAoY3VycmVudC5nZXRGb3JtKCkuZ2V0VGFzaygpKS5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9DT05UUk9MICYmICFhd2FpdCBjdXJyZW50LklzUGFya2FibGUoKSlcclxuICAgICAgYXdhaXQgdGhpcy5IYW5kbGVOb25QYXJrYWJsZUNvbnRyb2xzKGN1cnJlbnQuZ2V0Rm9ybSgpLmdldFRhc2soKSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBIYW5kbGVQYXJrYWJpbGl0eU9uUm93Q2hhbmdlKGl0YXNrOiBJVGFzayk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5IYW5kbGVOb25QYXJrYWJsZUNvbnRyb2xzKGl0YXNrKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBoYW5kbGUgc2l0dWF0aW9uIHdpdGggbm8gcGFya2FibGUgY29udHJvbHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaXRhc2tcIj48L3BhcmFtPlxyXG4gIGFzeW5jIEhhbmRsZU5vblBhcmthYmxlQ29udHJvbHMoaXRhc2s6IElUYXNrKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgdGFzazogVGFzayA9IDxUYXNrPml0YXNrO1xyXG4gICAgLy8gd2UgY2FuIG5vdCBzdGF5IGluIGNyZWF0ZSBtb2RlIHdpdGggbm8gcGFya2FibGUgY29udHJvbHNcclxuICAgIGlmICh0YXNrLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUgJiYgdGFzay5Jc0ludGVyYWN0aXZlKSB7XHJcbiAgICAgIGF3YWl0IHRhc2suZW5hYmxlTW9kZXMoKTtcclxuICAgICAgbGV0IG9sZE1vZGU6IHN0cmluZyA9IHRhc2suZ2V0T3JpZ2luYWxUYXNrTW9kZSgpO1xyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcbiAgICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKSB7XHJcbiAgICAgICAgaWYgKG9sZE1vZGUgIT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKSB7XHJcbiAgICAgICAgICB0YXNrLnNldE1vZGUob2xkTW9kZSk7XHJcbiAgICAgICAgICBhd2FpdCAoPERhdGFWaWV3PnRhc2suRGF0YVZpZXcpLmN1cnJSZWNDb21wdXRlKHRydWUpO1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG4gICAgICAgICAgYXdhaXQgKDxNZ0Zvcm0+dGFzay5nZXRGb3JtKCkpLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfQ1VSUl9SRUMpO1xyXG4gICAgICAgICAgdGFzay5zZXRMYXN0UGFya2VkQ3RybChudWxsKTtcclxuICAgICAgICAgIGF3YWl0IEZvY3VzTWFuYWdlci5TZXRGb2N1cyh0YXNrLCBudWxsLCAtMSwgdHJ1ZSk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIC8vIHdlIGNhbiBub3Qgc3RheSBpbiBjcmVhdGUgbW9kZSBvciBpbiBzdG9wIGV4ZWN1dGlvbiBzdGF0ZSB3aXRoIG5vIHBhcmthYmxlIGNvbnRyb2xzXHJcbiAgICAgIC8vIERvIG5vdCBnaXZlIHBhcmsgZXJyb3IsIGlmIHRhc2sgaXMgb3BlbmVkIGluIGNyZWF0ZSBtb2RlLiBUaGlzIGlzIHRlbXBvcmFyeSBjaGFuZ2UgZm9yIGN1c3RvbWVyIHByb2JsZW0uXHJcbiAgICAgIC8vdGhpcy5leGl0V2l0aEVycm9yKHRhc2ssIE1zZ0ludGVyZmFjZS5SVF9TVFJfQ1JTUl9DQU5UX1BBUkspO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFdoaWxlIGhhbmRsZSBub24tcGFya2FiaWxpdHkgY29uZGl0aW9uLCBlbnN1cmUgQ1MgaXMgY2FsbGVkIGZvciBjb250cm9sIGlmIGl0IGlzIGluIENvbnRyb2wgbGV2ZWwgdGhlbiBwYXJraW5nIGlzIHNldCBvbiBmb3JtLlxyXG4gICAgaWYgKHRhc2suZ2V0TGV2ZWwoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfQ09OVFJPTClcclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aE1nQ29udHJvbEJhc2UodGFzay5nZXRMYXN0UGFya2VkQ3RybCgpLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9TVUZGSVgpO1xyXG5cclxuICAgIHRhc2suc2V0TGFzdFBhcmtlZEN0cmwobnVsbCk7XHJcbiAgICBNZ0NvbnRyb2wuUmV0dXJuVG9DdHJsID0gbnVsbDtcclxuICAgIGF3YWl0IEZvY3VzTWFuYWdlci5TZXRGb2N1cyh0YXNrLCBudWxsLCAtMSwgdHJ1ZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgaGFuZGxlIGEgc2luZ2xlIGV2ZW50XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlydEV2dFwiPnRoZSBldmVudCB0byBwcm9jZXNzIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyZXR1cm5lZEZyb21TZXJ2ZXJcIj5pbmRpY2F0ZXMgd2hldGhlciB3ZSByZXR1cm5lZCBmcm9tIHRoZSBzZXJ2ZXIgLSB0byBiZSBwYXNzZWQgdG8gaGFuZGxlci5leGVjdXRlKCkgPC9wYXJhbT5cclxuICBhc3luYyBoYW5kbGVFdmVudChydEV2dDogUnVuVGltZUV2ZW50LCByZXR1cm5lZEZyb21TZXJ2ZXI6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBoYW5kbGVyOiBFdmVudEhhbmRsZXIgPSBudWxsO1xyXG4gICAgbGV0IHBvczogRXZlbnRIYW5kbGVyUG9zaXRpb24gPSBuZXcgRXZlbnRIYW5kbGVyUG9zaXRpb24oKTtcclxuICAgIGxldCB0YXNrOiBUYXNrID0gPFRhc2s+cnRFdnQuZ2V0VGFzaygpO1xyXG4gICAgbGV0IGN0cmw6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+dGFzay5nZXRMYXN0UGFya2VkQ3RybCgpO1xyXG4gICAgbGV0IGZvcmNlRXhpdERvbmU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBlbmRUYXNrRXJyb3I6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBvbGRSdEV2dDogUnVuVGltZUV2ZW50ID0gbnVsbDtcclxuICAgIGxldCBvbGRGb3JjZUV4aXQ6IEZvcmNlRXhpdCA9IHRoaXMuZ2V0Rm9yY2VFeGl0KCk7XHJcbiAgICBsZXQgb2xkRm9yY2VFeGl0VGFzazogVGFzayA9IHRoaXMuZ2V0Rm9yY2VFeGl0VGFzaygpO1xyXG4gICAgbGV0IG9sZElzSGFuZGxpbmdGb3JjZUV4aXQ6IGJvb2xlYW4gPSB0aGlzLl9pc0hhbmRsaW5nRm9yY2VFeGl0O1xyXG4gICAgbGV0IHJlc3RvcmVJc0ZvcmNlRXhpdDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IHJlc3RvcmVDdXJyQ3RybDogTWdDb250cm9sO1xyXG4gICAgbGV0IHJlc3RvcmVDdXJyRmllbGQ6IEZpZWxkID0gbnVsbDtcclxuXHJcbiAgICAvLyB0aGUgYWN0aW9uIG5lZWQgdG8gYmUgY2hlY2sgYWNjb3JkaW5nIHRvIHRoZSB0YXNrIG9uIHRoZSBldmVudC5cclxuICAgIC8vIElmIHRoZSBhY3Rpb24gaXMgaW50ZXJuYWwgKHVuZGVyIEFDVF9UT1QpLCBkbyBub3RoaW5nIGlmIGl0cyBkaXNhYmxlZCBvciBub3QgYWxsb3dlZC5cclxuICAgIGlmICgocnRFdnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0lOVEVSTkFMKSkge1xyXG4gICAgICAvLyBkbyBub3RoaW5nIGlmIGFjdGlvbiBpcyAxLiBub3QgZW5hYmxlZCAyLiB3YWl0ID09IG5vIGFuZCBldmVudHMgYXJlIG5vdCBhbGxvd2VkXHJcbiAgICAgIGlmIChydEV2dC5JbnRlcm5hbEV2ZW50IDwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RPVF9DTlQgJiYgKCF0YXNrLkFjdGlvbk1hbmFnZXIuaXNFbmFibGVkKHJ0RXZ0LkludGVybmFsRXZlbnQpIHx8ICghcnRFdnQuaXNJbW1lZGlhdGUoKSAmJiB0aGlzLk5vRXZlbnRzQWxsb3dlZCgpKSkpXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfSBlbHNlXHJcbiAgICAvLyBkbyB0aGUgaGFuZGxlcnMgd2hlbiAxLiB3YWl0ID09IHllcyBvciAyLiBldmVudHMgYXJlIGFsbG93ZWRcclxuICAgIGlmICghcnRFdnQuaXNJbW1lZGlhdGUoKSAmJiB0aGlzLk5vRXZlbnRzQWxsb3dlZCgpKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgcmVzdG9yZUN1cnJDdHJsID0gdGhpcy5fY3VyckN0cmw7XHJcbiAgICB0aGlzLl9jdXJyQ3RybCA9IGN0cmw7IC8vIHNhdmUgY3VycmVudCBjb250cm9sIGZvciBIQU5ETEVSX0NUUkwgZnVuY3Rpb25cclxuXHJcbiAgICBsZXQgcHJvcGFnYXRlOiBib29sZWFuID0gcnRFdnQuZ2V0VHlwZSgpICE9PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0lOVEVSTkFMIHx8IHJ0RXZ0LmdldEludGVybmFsQ29kZSgpIDwgMTAwMDtcclxuXHJcbiAgICB0cnkge1xyXG5cclxuICAgICAgdGhpcy5wdXNoUnRFdmVudChydEV2dCk7XHJcblxyXG4gICAgICBhd2FpdCB0aGlzLkNoZWNrQW5kU2hvd1NwaW5uZXIodHJ1ZSk7XHJcblxyXG4gICAgICAvLyBkbyBzb21lIGNvbW1vbiBwcm9jZXNzaW5nIGFuZCBpZiB0aGUgcmVzdWx0IGlzIHRydWUgdGhlbiBjb250aW51ZVxyXG4gICAgICAvLyB3aXRoIHRoZSB1c2VyIGRlZmluZWQgaGFuZGxlcnNcclxuICAgICAgbGV0IGJSY0JlZm9yZTogYm9vbGVhbiA9IGF3YWl0IHRoaXMuY29tbW9uSGFuZGxlckJlZm9yZShydEV2dCk7XHJcblxyXG4gICAgICByZXN0b3JlQ3VyckZpZWxkID0gdGhpcy5fY3VyckZpZWxkO1xyXG4gICAgICB0aGlzLl9jdXJyRmllbGQgPSA8RmllbGQ+dGFzay5nZXRDdXJyRmllbGQoKTtcclxuXHJcbiAgICAgIGlmIChiUmNCZWZvcmUpIHtcclxuICAgICAgICBwb3MuaW5pdChydEV2dCk7XHJcbiAgICAgICAgLy8gZ2V0IHRoZSBmaXJzdCBoYW5kbGVyIGZvciB0aGUgY3VycmVudCBldmVudFxyXG4gICAgICAgIGhhbmRsZXIgPSBwb3MuZ2V0TmV4dCgpO1xyXG5cclxuICAgICAgICBpZiAoaGFuZGxlciAhPT0gbnVsbCAmJiBoYW5kbGVyLmdldEV2ZW50KCkgIT09IG51bGwgJiYgaGFuZGxlci5nZXRFdmVudCgpLlVzZXJFdnQgIT09IG51bGwpXHJcbiAgICAgICAgICB0aGlzLnNldEZvcmNlRXhpdChoYW5kbGVyLmdldEV2ZW50KCkuVXNlckV2dC5Gb3JjZUV4aXQsIHRhc2spO1xyXG5cclxuICAgICAgICAvLyBleGVjdXRlIHRoZSBjaGFpbiBvZiBoYW5kbGVycyBmb3IgdGhlIGN1cnJlbnQgZXZlbnQuIHRoZSBleGVjdXRpb25cclxuICAgICAgICAvLyBjb250aW51ZXMgdGlsbCBhbiBldmVudCBoYW5kbGVyIHJldHVybnMgZmFsc2UuXHJcbiAgICAgICAgd2hpbGUgKGhhbmRsZXIgIT09IG51bGwpIHtcclxuICAgICAgICAgIGxldCBoYW5kbGVyQ29udGV4dFRhc2s6IFRhc2sgPSBudWxsO1xyXG4gICAgICAgICAgbGV0IHJ0RXZ0Q2hhbmdlZDogYm9vbGVhbjtcclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGxldCBlbmFibGVkQ25kQ2hlY2tlZEFuZFRydWU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIGEgaGFuZGxlciBjaGFuZ2UgdGhlIGhhbmRsZXIncyBjb250ZXh0IHRhc2sgdG8gdGhlIGV2ZW50J3MgdGFza1xyXG4gICAgICAgICAgICBoYW5kbGVyQ29udGV4dFRhc2sgPSA8VGFzaz5oYW5kbGVyLmdldFRhc2soKS5HZXRDb250ZXh0VGFzaygpO1xyXG4gICAgICAgICAgICBpZiAocnRFdnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0lOVEVSTkFMICYmIHJ0RXZ0LmdldEludGVybmFsQ29kZSgpID49IDEwMDAgJiYgcnRFdnQuZ2V0SW50ZXJuYWxDb2RlKCkgIT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9WQVJJQUJMRSlcclxuICAgICAgICAgICAgICBoYW5kbGVyLmdldFRhc2soKS5TZXRDb250ZXh0VGFzayhoYW5kbGVyLmdldFRhc2soKSk7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICBoYW5kbGVyLmdldFRhc2soKS5TZXRDb250ZXh0VGFzayhydEV2dC5nZXRUYXNrKCkpO1xyXG5cclxuICAgICAgICAgICAgLy8gdGhlcmUgaXMgbm8gbmVlZCB0byBoYW5kbGUgRm9yY2VFeGl0IGZvciBub24tdXNlciBldmVudHNcclxuICAgICAgICAgICAgaWYgKGhhbmRsZXIuZ2V0RXZlbnQoKS5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfVVNFUiAmJiBhd2FpdCBoYW5kbGVyLmlzRW5hYmxlZCgpKSB7XHJcbiAgICAgICAgICAgICAgZW5hYmxlZENuZENoZWNrZWRBbmRUcnVlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICB0aGlzLl9pc0hhbmRsaW5nRm9yY2VFeGl0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgcmVzdG9yZUlzRm9yY2VFeGl0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAvLyBoYW5kbGUgZm9yY2VFeGl0IG9ubHkgb25jZVxyXG4gICAgICAgICAgICAgIGlmIChhd2FpdCB0aGlzLmhhbmRsZUZvcmNlRXhpdEJlZm9yZShoYW5kbGVyLmdldEV2ZW50KCksIHJ0RXZ0KSkge1xyXG4gICAgICAgICAgICAgICAgZm9yY2VFeGl0RG9uZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgY3VycmVudCBydW4gdGltZSBldmVudCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgZXZlbnRcclxuICAgICAgICAgICAgLy8gb2YgdGhlIGhhbmRsZXJcclxuICAgICAgICAgICAgaWYgKHJ0RXZ0ICE9PSBoYW5kbGVyLmdldEV2ZW50KCkpIHtcclxuICAgICAgICAgICAgICAvLyB0aGUgbmV3IHJ1bnRpbWUgZXZlbnQgaXMgdGhhdCBvZiB0aGUgaGFuZGxlciBjb21iaW5lZCB3aXRoIHRoZVxyXG4gICAgICAgICAgICAgIC8vIGRhdGEgb2YgdGhlIGN1cnJlbnQgcnVudGltZSBldmVudC5cclxuICAgICAgICAgICAgICAvLyB0aGUgcHVycG9zZSBvZiB0aGlzIGlzIHRvIHByb3BhZ2F0ZSB0aGUgZXZlbnQgb2YgdGhlIGhhbmRsZXJcclxuICAgICAgICAgICAgICAvLyBpbiBwbGFjZSBvZiB0aGUgb3JpZ2luYWwgZXZlbnRcclxuICAgICAgICAgICAgICBvbGRSdEV2dCA9IHJ0RXZ0O1xyXG4gICAgICAgICAgICAgIHJ0RXZ0ID0gbmV3IFJ1blRpbWVFdmVudChoYW5kbGVyLmdldEV2ZW50KCksIHJ0RXZ0KTtcclxuICAgICAgICAgICAgICBydEV2dENoYW5nZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgICAvLyB0aGVyZSBpcyBhIG5ldyBydW50aW1lIGV2ZW50IHRvIGhhbmRsZSBzbyBwb3AgdGhlIG9sZCBvbmUgYW5kIHB1c2hcclxuICAgICAgICAgICAgICAvLyB0aGUgbmV3IG9uZSBpbnN0ZWFkLlxyXG4gICAgICAgICAgICAgIHRoaXMucG9wUnRFdmVudCgpO1xyXG4gICAgICAgICAgICAgIHRoaXMucHVzaFJ0RXZlbnQocnRFdnQpO1xyXG4gICAgICAgICAgICB9IGVsc2VcclxuICAgICAgICAgICAgICBydEV2dENoYW5nZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIGlmIChydEV2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfSU5URVJOQUwgJiYgcnRFdnQuZ2V0SW50ZXJuYWxDb2RlKCkgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKVxyXG4gICAgICAgICAgICAgIHJ0RXZ0LmdldFRhc2soKS5zZXRJblJlY29yZFN1ZmZpeCh0cnVlKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlRXZlbnRBcmd1bWVudHMocnRFdnQpO1xyXG4gICAgICAgICAgICBsZXQgaGFuZGxlclJldFZhbHM6IFJldFZhbHMgPSBhd2FpdCBoYW5kbGVyLmV4ZWN1dGUocnRFdnQsIHJldHVybmVkRnJvbVNlcnZlciwgZW5hYmxlZENuZENoZWNrZWRBbmRUcnVlKTtcclxuICAgICAgICAgICAgaWYgKHJ0RXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9JTlRFUk5BTCAmJiBydEV2dC5nZXRJbnRlcm5hbENvZGUoKSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpXHJcbiAgICAgICAgICAgICAgcnRFdnQuZ2V0VGFzaygpLnNldEluUmVjb3JkU3VmZml4KGZhbHNlKTtcclxuICAgICAgICAgICAgcHJvcGFnYXRlID0gaGFuZGxlclJldFZhbHMuUHJvcGFnYXRlO1xyXG4gICAgICAgICAgICBpZiAoIWhhbmRsZXJSZXRWYWxzLkVuYWJsZWQgJiYgcnRFdnRDaGFuZ2VkKSB7XHJcbiAgICAgICAgICAgICAgcnRFdnQgPSBvbGRSdEV2dDtcclxuICAgICAgICAgICAgICBvbGRSdEV2dCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgcnRFdnRDaGFuZ2VkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgLy8gdGhlcmUgaXMgYSBuZXcgcnVudGltZSBldmVudCB0byBoYW5kbGUgc28gcG9wIHRoZSBvbGQgb25lIGFuZCBwdXNoXHJcbiAgICAgICAgICAgICAgLy8gdGhlIG5ldyBvbmUgaW5zdGVhZC5cclxuICAgICAgICAgICAgICB0aGlzLnBvcFJ0RXZlbnQoKTtcclxuICAgICAgICAgICAgICB0aGlzLnB1c2hSdEV2ZW50KHJ0RXZ0KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gY2hlY2sgaWYgd2UgaGF2ZSBmdWxmaWxsZWQgdGhlIGVuZCBjb25kaXRpb25cclxuICAgICAgICAgICAgLy8gQWZ0ZXIgZXhlY3V0aW5nIGEgaGFuZGxlciwgYmVmb3JlIGVuZGluZyBhIHRhc2sgKGlmIHRoZSBlbmQgY29uZGl0aW9uIGlzIFRSVUUpLFxyXG4gICAgICAgICAgICAvLyB3ZSBzaG91bGQgY2hlY2sgaWYgdGhlIHRhc2sgaXMgbm90IGFscmVhZHkgY2xvc2VkLiBUaGlzIGNhbiBoYXBwZW4gbGlrZSBpbiBjYXNlXHJcbiAgICAgICAgICAgIC8vIG9mIFFDUiAjNzk2NDc2IC0tLSBhIG5vbi1pbnRlcmFjdGl2ZSB0YXNrIGhhcyBjYWxsZWQgYW4gaW50ZXJhY3RpdmUgdGFzayBmcm9tXHJcbiAgICAgICAgICAgIC8vIHRhc2sgc3VmZml4LiBOb3cgaWYgd2UgcHJlc3MgQWx0K0Y0LCB3ZSBnZXQgRVhJVF9TWVNURU0gYWN0LiBBbmQgc28gd2UgY2xvc2VcclxuICAgICAgICAgICAgLy8gYWxsIHRhc2tzIHN0YXJ0aW5nIGZyb20gTWFpbiBQcm9ncmFtLiBTbywgd2hlbiB3ZSBjb21lIG91dCBvZiB0aGUgVFMgaGFuZGxlclxyXG4gICAgICAgICAgICAvLyBleGVjdXRpb24sIHRoZSB0YXNrIGlzIGFscmVhZHkgY2xvc2VkLlxyXG4gICAgICAgICAgICAvLyBGb3IgT2ZmbGluZSA6IFRQIGlzIGV4ZWN1dGVkIGF0IGNsaWVudCBzaWRlLiBJZiB3ZSBhcmUgaW4gVGFzayBQcmVmaXgsIGRvbnQgY2hlY2sgZW5kVGFzayBjb25kaXRpb24gaGVyZS5cclxuICAgICAgICAgICAgaWYgKHJ0RXZ0LmdldEludGVybmFsQ29kZSgpICE9PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEFTS19QUkVGSVggJiYgdGFzay5pc1N0YXJ0ZWQoKSAmJiB0YXNrLmdldEV4ZWNFbmRUYXNrKCkpIHtcclxuICAgICAgICAgICAgICBlbmRUYXNrRXJyb3IgPSBhd2FpdCB0YXNrLmVuZFRhc2sodHJ1ZSwgZmFsc2UsIGZhbHNlKTtcclxuICAgICAgICAgICAgICBpZiAoZW5kVGFza0Vycm9yKVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpIHtcclxuICAgICAgICAgICAgICBpZiAoYXdhaXQgdGhpcy5oYW5kbGVTdG9wRXhlY3V0aW9uKHJ0RXZ0KSlcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgICAgICAvLyByZXN0b3JpbmcgdGhlIGNvbnRleHRcclxuICAgICAgICAgICAgaGFuZGxlci5nZXRUYXNrKCkuU2V0Q29udGV4dFRhc2soaGFuZGxlckNvbnRleHRUYXNrKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAoIXByb3BhZ2F0ZSlcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgaWYgKHJ0RXZ0Q2hhbmdlZClcclxuICAgICAgICAgICAgaGFuZGxlciA9IHBvcy5nZXROZXh0KHJ0RXZ0KTtcclxuICAgICAgICAgIC8vIGdldCB0aGUgbmV4dCBoYW5kbGVyIGZvciB0aGUgY3VycmVudCBldmVudFxyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICBoYW5kbGVyID0gcG9zLmdldE5leHQoKTtcclxuICAgICAgICAgIGlmIChoYW5kbGVyICE9PSBudWxsKVxyXG4gICAgICAgICAgICBGbG93TW9uaXRvclF1ZXVlLkluc3RhbmNlLmFkZFRhc2tFdmVudChydEV2dC5nZXRCcmtMZXZlbCh0cnVlKSwgRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX1BST1BBR0FURSwgdGFzay5HZXRUYXNrRGV0YWlscygpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHByb3BhZ2F0ZSAmJiAhZW5kVGFza0Vycm9yKVxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5jb21tb25IYW5kbGVyKHJ0RXZ0KTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoIWVuZFRhc2tFcnJvcikge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuY29tbW9uSGFuZGxlckFmdGVyKHJ0RXZ0LCBiUmNCZWZvcmUpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChmb3JjZUV4aXREb25lICYmIHRoaXMuX2lzSGFuZGxpbmdGb3JjZUV4aXQpIHtcclxuICAgICAgICB0aGlzLl9pc0hhbmRsaW5nRm9yY2VFeGl0ID0gZmFsc2U7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVGb3JjZUV4aXRBZnRlcihydEV2dCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5zZXRGb3JjZUV4aXQob2xkRm9yY2VFeGl0LCBvbGRGb3JjZUV4aXRUYXNrKTtcclxuICAgICAgaWYgKHJlc3RvcmVJc0ZvcmNlRXhpdClcclxuICAgICAgICB0aGlzLl9pc0hhbmRsaW5nRm9yY2VFeGl0ID0gb2xkSXNIYW5kbGluZ0ZvcmNlRXhpdDtcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIHRoaXMuX2N1cnJDdHJsID0gcmVzdG9yZUN1cnJDdHJsO1xyXG4gICAgICB0aGlzLl9jdXJyRmllbGQgPSByZXN0b3JlQ3VyckZpZWxkO1xyXG4gICAgICB0aGlzLnBvcFJ0RXZlbnQoKTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgLy8gdXBkYXRlIHRoZSBkaXNwbGF5XHJcbiAgICBHVUlNYW5hZ2VyLkluc3RhbmNlLmV4ZWNHdWlDb21tYW5kUXVldWUoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBUaGlzIG1ldGhvZCBzaW11bGF0ZXMgYWxsIGV2ZW50cyB0aGF0IGFyZSBpbiBzZWxlY3Rpb24gc2VxdWVuY2Ugc3RhcnRpbmcgZnJvbSBmb2N1cyBldmVudFxyXG4gIC8vLyAgIEl0IGlzIHVzZWQgaW4gOlxyXG4gIC8vLyAgIGFjdGlvbnMgQ1RSTCtUQUIgJiYgQ1RSTCtTSElGVCtUQUIgdGhhdCBtb3ZlIHVzIHRvIHRoZSBuZXh0L3ByZXZpb3VzIGl0ZW0gaW4gVGFiIGNvbnRyb2xcclxuICAvLy8gICBjbGljayBvciBhY2NlbGVyYXRvciBvbiBwdXNoIGJ1dHRvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJsaW5lXCI+Y3RybCBsaW5lPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInByb2R1Y2VDbGlja1wiPnRydWUgc2hvdWxkIHByb2R1Y2UgY2xpY2sgZXZlbnQ8L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgc2ltdWxhdGVTZWxlY3Rpb24oY3RybDogTWdDb250cm9sQmFzZSwgdmFsOiBhbnksIGxpbmU6IG51bWJlciwgcHJvZHVjZUNsaWNrOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgbWdDb250cm9sOiBNZ0NvbnRyb2wgPSA8TWdDb250cm9sPmN0cmw7XHJcbiAgICBsZXQgY3VyclRhc2s6IFRhc2sgPSA8VGFzaz5tZ0NvbnRyb2wuZ2V0Rm9ybSgpLmdldFRhc2soKTtcclxuICAgIGxldCBjYW5jZWxXYXNSYWlzZWQ6IGJvb2xlYW4gPSBjdXJyVGFzay5jYW5jZWxXYXNSYWlzZWQoKTtcclxuXHJcbiAgICAvLyBpZiAobWdDb250cm9sLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1RBQikge1xyXG4gICAgLy8gICBpZiAoIW1nQ29udHJvbC5pc01vZGlmaWFibGUoKSB8fCAhbWdDb250cm9sLklzUGFya2FibGUoKSkge1xyXG4gICAgLy8gICAgIG1nQ29udHJvbC5yZXN0b3JlT2xkVmFsdWUoKTtcclxuICAgIC8vICAgICBsZXQgbGFzdEZvY3VzZWRDb250cm9sOiBNZ0NvbnRyb2wgPSBHVUlNYW5hZ2VyLmdldExhc3RGb2N1c2VkQ29udHJvbCgpO1xyXG4gICAgLy8gICAgIGlmIChsYXN0Rm9jdXNlZENvbnRyb2wgIT09IG51bGwpXHJcbiAgICAvLyAgICAgICBNYW5hZ2VyLlNldEZvY3VzKGxhc3RGb2N1c2VkQ29udHJvbCwgLTEpO1xyXG4gICAgLy8gICAgIHJldHVybjtcclxuICAgIC8vICAgfVxyXG4gICAgLy8gfVxyXG5cclxuICAgIC8vIHdoZW4gYSBwdXNoIGJ1dHRvbiBpcyBhYm91dCB0byByYWlzZSBhICdDYW5jZWwnIG9yIGEgJ1F1aXQnIGV2ZW50LiB3ZSBkbyBub3Qgd2FudCB0byBzZXQgdGhlIG5ldyB2YWx1ZSB0byB0aGUgZmllbGQuXHJcbiAgICAvLyBUaGF0IHNldHRpbmcgbWlnaHQgY2F1c2UgYSByZWMgc3VmZml4IGFuZCBhIHZhcmlhYmxlIGNoYW5nZS5cclxuICAgIGlmIChtZ0NvbnRyb2wuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQlVUVE9OKSB7XHJcbiAgICAgIGxldCBhUnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQobWdDb250cm9sKTtcclxuICAgICAgbGV0IHJhaXNlQXQ6IFJhaXNlQXQgPSA8UmFpc2VBdD4oYXdhaXQgKG1nQ29udHJvbC5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1JBSVNFX0FUKSkuZ2V0VmFsdWVJbnQoKSk7XHJcbiAgICAgIGlmIChhUnRFdnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0lOVEVSTkFMICYmIChhUnRFdnQuSW50ZXJuYWxFdmVudCA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NBTkNFTCB8fCBhUnRFdnQuSW50ZXJuYWxFdmVudCA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1FVSVQpKSB7XHJcbiAgICAgICAgaWYgKHJhaXNlQXQgPT09IFJhaXNlQXQuVGFza0luRm9jdXMpXHJcbiAgICAgICAgICBjdXJyVGFzayA9IExhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKTtcclxuICAgICAgICBjYW5jZWxXYXNSYWlzZWQgPSBjdXJyVGFzay5jYW5jZWxXYXNSYWlzZWQoKTtcclxuICAgICAgICBjdXJyVGFzay5zZXRDYW5jZWxXYXNSYWlzZWQodHJ1ZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChyYWlzZUF0ID09PSBSYWlzZUF0LlRhc2tJbkZvY3VzKVxyXG4gICAgICAgIG1nQ29udHJvbC5zZXRSdEV2dFRhc2soTGFzdEZvY3VzZWRNYW5hZ2VyLkluc3RhbmNlLmdldExhc3RGb2N1c2VkVGFzaygpKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBmaXJzdCB3ZSBoYW5kbGUgZm9jdXNcclxuICAgIGF3YWl0IHRoaXMuaGFuZGxlRm9jdXMobWdDb250cm9sLCBsaW5lLCBwcm9kdWNlQ2xpY2ssIGZhbHNlKTtcclxuXHJcbiAgICBjdXJyVGFzay5zZXRDYW5jZWxXYXNSYWlzZWQoY2FuY2VsV2FzUmFpc2VkKTtcclxuXHJcbiAgICBpZiAodGhpcy5fc3RvcEV4ZWN1dGlvbilcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIC8vIFFDUiMgOTc0MDQ3IDogSWYgd2UgaGF2ZSBhIFB1c2ggQnV0dG9uIHdpdGggQWxsb3cgUGFya2luZyA9IE5vIGFuZCBmaWVsZCBpcyBhdHRhY2hlZCB0byBpdCwgZG9uJ3QgaGFuZGxlIHRoZSBldmVudC5cclxuICAgIC8vIFRoaXMgaXMgc2FtZSBhcyBvbmxpbmUuIEluIG9ubGluZSwgaWYgZmllbGQgaXMgbm90IGF0dGFjaGVkIHRvIG5vbiBwYXJrYWJsZSBwdXNoIEJ1dHRvbiwgd2UgaGFuZGxlIHRoZSBldmVudFxyXG4gICAgLy8gQnV0IGlmIGZpZWxkIGlzIGF0dGFjaGVkIHRvIGl0LCB3ZSBkb24ndCBoYW5kbGUgZXZlbnQuXHJcbiAgICAvLyBTbyBpZiBjb250cm9sIGlzIHB1c2ggYnV0dG9uLCBleGVjdXRlIGhhbmRsZUV2ZW50IG9ubHkgd2hlbiBmaWVsZCBpcyBub3QgYXR0YWNoZWQgb3IgUGFya29uQ0xpY2sgaXMgTm8gb3JcclxuICAgIC8vIFBhcmtvbkNMaWNrIGFuZCBhbGxvd3BhcmtpbmcgaXMgYm90aCBZZXNcclxuICAgIGxldCBjb250cm9sSXNQYXJrYWJsZTogYm9vbGVhbiA9IGF3YWl0IG1nQ29udHJvbC5Jc1BhcmthYmxlKCk7XHJcbiAgICBpZiAobWdDb250cm9sLlR5cGUgIT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0JVVFRPTiB8fCAobWdDb250cm9sLmdldEZpZWxkKCkgPT09IG51bGwgfHwgY29udHJvbElzUGFya2FibGUpKSB7XHJcblxyXG4gICAgICAvLyBRQ1IgIzMwMTY1Mi4gRm9yIG5vbi1wYXJrYWJsZSBidXR0b24gY29udHJvbCB3aXRoIGV2ZW50IHJhaXNlZCBhdCB0aGUgY29udGFpbmVyIHRhc2sgd2lsbCBiZSBjaGFuZ2VkIHNvXHJcbiAgICAgIC8vIHdoZW4gdGhlIGJ1dHRvbiBpcyBjbGlja2VkIHRoZW4gdGhlIHRhc2sgd2lsbCBnZXQgZm9jdXMuIChhcyBpbiBPbmxpbmUgYW5kIGFzIGlmIHRoZSBidXR0b24gd2FzIHBhcmthYmxlKS5cclxuICAgICAgLy8gVGhlIGZvY3VzIHdpbGwgYmUgb24gdGhlIGZpcnN0IGNvbnRyb2wuXHJcbiAgICAgIGlmIChtZ0NvbnRyb2wuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQlVUVE9OICYmICFjb250cm9sSXNQYXJrYWJsZSkge1xyXG4gICAgICAgIGxldCBzdWJmb3JtVGFzazogVGFzayA9IDxUYXNrPm1nQ29udHJvbC5nZXRGb3JtKCkuZ2V0VGFzaygpO1xyXG4gICAgICAgIGlmIChzdWJmb3JtVGFzay5Jc1N1YkZvcm0pIHtcclxuICAgICAgICAgIGN1cnJUYXNrID0gTGFzdEZvY3VzZWRNYW5hZ2VyLkluc3RhbmNlLmdldExhc3RGb2N1c2VkVGFzaygpO1xyXG4gICAgICAgICAgLy8gRGVmZWN0IDExNTQ3NC4gRm9yIHRoZSBzYW1lIHRhc2sgZG8gbm90IG1vdmUgdG8gdGhlIGZpcnN0IGNvbnRyb2wuXHJcbiAgICAgICAgICBpZiAoc3ViZm9ybVRhc2sgIT09IGN1cnJUYXNrICYmIHN1YmZvcm1UYXNrLnBhdGhDb250YWlucyhjdXJyVGFzaykpIHtcclxuXHJcbiAgICAgICAgICAgIGlmIChzdWJmb3JtVGFzay5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKSB7IC8vIFRPRE86IENoZWNrIGlmIHRoaXMgY29kZSBjYW4gYmUgbW92ZWQgdG8gSGFuZGxlTm9uUGFya2FibGVDb250cm9scygpXHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2soc3ViZm9ybVRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLkhhbmRsZU5vblBhcmthYmxlQ29udHJvbHMoc3ViZm9ybVRhc2spO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuXHJcbiAgICAgIC8vIHRoZW4gQUNUX0hJVCBpcyBzZW50XHJcbiAgICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudChtZ0NvbnRyb2wpO1xyXG4gICAgICBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuQ3VycmVudENsaWNrZWRDdHJsID0gbWdDb250cm9sO1xyXG4gICAgICBydEV2dC5zZXRJbnRlcm5hbChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9ISVQpO1xyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUV2ZW50KHJ0RXZ0LCBmYWxzZSk7XHJcbiAgICAgIGlmICh0aGlzLl9zdG9wRXhlY3V0aW9uKVxyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBhbmQgc2VsZWN0aW9uIGlzIGhhbmRsZWQgaW4gdGhlIGVuZCBpZiBwcmV2aW91cyBhY3Rpb25zIHN1Y2NlZWRlZFxyXG4gICAgaWYgKG1nQ29udHJvbC5UeXBlICE9PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9CVVRUT04pXHJcbiAgICAvLyBmb3IgYnV0dG9uXFxjaGVjayB3ZSBkbyBub3QgY2FsbCB0aGlzIHRvIHByZXZlbnQgcmVjdXJzaW9uXHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlU2VsZWN0aW9uKG1nQ29udHJvbCwgbGluZSwgdmFsKTtcclxuXHJcbiAgICBpZiAodGhpcy5fc3RvcEV4ZWN1dGlvbilcclxuICAgICAgcmV0dXJuO1xyXG4gICAgLy8gdGhlbiBtb3VzZSB1cFxyXG4gICAgYXdhaXQgdGhpcy5oYW5kbGVNb3VzZVVwKG1nQ29udHJvbCwgbGluZSwgcHJvZHVjZUNsaWNrKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gYWN0aXZhdGUgaGFuZGxlSW50ZXJuYWxFdmVudCB3aXRoIGlzUXVpdCA9IGZhbHNlPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIml0YXNrXCI+YSByZWZlcmVuY2UgdG8gdGhlIHRhc2s8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImV2ZW50Q29kZVwiPnRoZSBjb2RlIG9mIHRoZSBldmVudDwvcGFyYW0+XHJcbiAgYXN5bmMgaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKGl0YXNrOiBJVGFzaywgZXZlbnRDb2RlOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrQW5kU3ViZm9ybVJlZnJlc2goaXRhc2ssIGV2ZW50Q29kZSwgZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGFjdGl2YXRlIGhhbmRsZUludGVybmFsRXZlbnQgd2l0aCBpc1F1aXQgPSBmYWxzZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpdGFza1wiPmEgcmVmZXJlbmNlIHRvIHRoZSB0YXNrIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJldmVudENvZGVcIj50aGUgY29kZSBvZiB0aGUgZXZlbnQgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzdWJmb3JtUmVmcmVzaFwiPmlkZW50aWZpZXIgaWYgdGhlIGV2ZW50IGNhbGxlZCBieSBzdWJmb3JtIHJlZnJlc2g8L3BhcmFtPlxyXG4gIGFzeW5jIGhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFza0FuZFN1YmZvcm1SZWZyZXNoKGl0YXNrOiBJVGFzaywgZXZlbnRDb2RlOiBudW1iZXIsIHN1YmZvcm1SZWZyZXNoOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgdGFzazogVGFzayA9IDxUYXNrPml0YXNrO1xyXG5cclxuICAgIC8vIHNldCBTdWJmb3JtRXhlY01vZGUgKGZvciBTdWJmb3JtRXhlY01vZGUgZnVuY3Rpb24pIG9ubHkgaW4gcmVjb3JkIHByZWZpeC5cclxuICAgIC8vIFN1YmZvcm1FeGVjTW9kZSBpcyBjaGFuZ2VkIGluIHJlY29yZCBwcmVmaXggYW5kIGl0IGlzIHRoZSBzYW1lIHVudGlsIHRoZVxyXG4gICAgLy8gbmV4dCByZWNvcmQgcHJlZml4IGV4ZWN1dGlvbiwgYmVjYXVzZSB3ZSBkbyBub3Qgb3BlbiBhIHN1YmZvcm0gdGFzayBlYWNoIHRpbWVcclxuICAgIC8vIGluIFJDIGFzIGl0IGlzIGluIE9ubGluZS4gQnV0IHdoZW4gdGhlIHN1YmZvcm0gaXMgcmVmcmVzaGVkIGZyb20gdGhlIHBhcmVudFxyXG4gICAgLy8gaXRzIHJlY29yZCBwcmVmaXggJiBzdWZmaXggYXJlIGFsc28gZXhlY3V0ZWQuXHJcbiAgICBpZiAoZXZlbnRDb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCAmJiB0YXNrLklzU3ViRm9ybSAmJiB0YXNrLlN1YmZvcm1FeGVjTW9kZSAhPT0gVGFza19TdWJmb3JtRXhlY01vZGVFbnVtLkZJUlNUX1RJTUUpLy8gRklSU1RfVElNRSBpcyBzZXQgb25seSBvbmNlIGluXHJcbiAgICAvLyBkb0ZpcnN0UmVjb3JkQ3ljbGUuXHJcbiAgICB7XHJcbiAgICAgIHRhc2suU3ViZm9ybUV4ZWNNb2RlID0gKHN1YmZvcm1SZWZyZXNoID8gVGFza19TdWJmb3JtRXhlY01vZGVFbnVtLlJFRlJFU0ggOiBUYXNrX1N1YmZvcm1FeGVjTW9kZUVudW0uU0VUX0ZPQ1VTKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBmb3IgdGhlIHN1YmZvcm0gcmVmcmVzaCBpdCBpcyBuZWVkZWQgdG8gZXhlY3V0ZSBNR19BQ1RfUE9TVF9SRUZSRVNIX0JZX1BBUkVOVCBoYW5kbGVyIGJlZm9yZSBSRUNPUkRfUFJFRklYIGhhbmRsZXJcclxuICAgIGlmIChzdWJmb3JtUmVmcmVzaClcclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2soaXRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9QT1NUX1JFRlJFU0hfQllfUEFSRU5UKTtcclxuXHJcbiAgICBpZiAodGFzay5EYXRhVmlldy5pc0VtcHR5RGF0YXZpZXcoKSkge1xyXG4gICAgICBpZiAoZXZlbnRDb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCB8fCBldmVudENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKSB7XHJcbiAgICAgICAgaWYgKGV2ZW50Q29kZSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpXHJcbiAgICAgICAgICBhd2FpdCB0YXNrLmVtcHR5RGF0YXZpZXdPcGVuKHN1YmZvcm1SZWZyZXNoKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICB0YXNrLmVtcHR5RGF0YXZpZXdDbG9zZSgpO1xyXG5cclxuICAgICAgICBpZiAodGFzay5nZXRGb3JtKCkgIT09IG51bGwpIHtcclxuICAgICAgICAgIGlmIChldmVudENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKVxyXG4gICAgICAgICAgICBhd2FpdCAoPE1nRm9ybT50YXNrLmdldEZvcm0oKSkuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9DVVJSX1JFQyk7XHJcbiAgICAgICAgICB0YXNrLmdldEZvcm0oKS5TZWxlY3RSb3coKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZVxyXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrQW5kRXZlbnRTdWJ0eXBlKHRhc2ssIGV2ZW50Q29kZSwgRXZlbnRTdWJUeXBlLk5vcm1hbCk7XHJcbiAgICB9IGVsc2VcclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2tBbmRFdmVudFN1YnR5cGUodGFzaywgZXZlbnRDb2RlLCBFdmVudFN1YlR5cGUuTm9ybWFsKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBhY3RpdmF0ZSBoYW5kbGVJbnRlcm5hbEV2ZW50IHdpdGggaXNRdWl0ID0gZmFsc2VcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPmEgcmVmZXJlbmNlIHRvIHRoZSBjb250cm9sIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJldmVudENvZGVcIj50aGUgY29kZSBvZiB0aGUgZXZlbnQgPC9wYXJhbT5cclxuICBhc3luYyBoYW5kbGVJbnRlcm5hbEV2ZW50V2l0aE1nQ29udHJvbEJhc2UoY3RybDogTWdDb250cm9sQmFzZSwgZXZlbnRDb2RlOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhNZ0NvbnRyb2woPE1nQ29udHJvbD5jdHJsLCBldmVudENvZGUsIEV2ZW50U3ViVHlwZS5Ob3JtYWwpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIFwic3RvcCBleGVjdXRpb25cIiBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBHZXRTdG9wRXhlY3V0aW9uRmxhZygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9zdG9wRXhlY3V0aW9uO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0aGUgY3RybCBvbiB3aGljaCB3ZSBoYWQgYSBcInN0b3AgZXhlY3V0aW9uXCJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgZ2V0U3RvcEV4ZWN1dGlvbkN0cmwoKTogTWdDb250cm9sQmFzZSB7XHJcbiAgICByZXR1cm4gdGhpcy5fc3RvcEV4ZWN1dGlvbkN0cmw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgaW5pdGlhbGl6ZXMgdGhlIHN0YXRpYyBzZWN0aW9uIG9mIHRoZSBldmVudHMgbWFuYWdlci4gVXN1YWxseSBkb2VzIG5vdGhpbmcgYnV0IGluIHRoZVxyXG4gIC8vLyAgIGV2ZW50IG9mIGFwcGxldCByZS1sb2FkIChmb3IgZXhhbXBsZSwgYmVjYXVzZSBvZiBhIGJyb3dzZXIgcmVmcmVzaCkgaXQgaW5pdGlhbGl6ZXMgdGhlXHJcbiAgLy8vICAgc3RhdGljIHBhcnQgb2YgdGhpcyBjbGFzcy5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIEluaXQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5faW5pdGlhbGl6ZWQpIHtcclxuICAgICAgdGhpcy5faXNIYW5kbGluZ0ZvcmNlRXhpdCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLl9mb3JjZUV4aXQgPSBGb3JjZUV4aXQuTm9uZTtcclxuICAgICAgdGhpcy5fZm9yY2VFeGl0VGFzayA9IG51bGw7XHJcbiAgICAgIHRoaXMuX2N1cnJGaWVsZCA9IG51bGw7XHJcbiAgICAgIHRoaXMuc2V0RW5kT2ZXb3JrKHRydWUpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5faW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEFkZCBpbnRlcm5hbCBldmVudCB0byB0aGUgcXVldWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaXRhc2tcIj50YXNrPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNvZGVcIj5jb2RlIG9mIGludGVybmFsIGV2ZW50PC9wYXJhbT5cclxuICBhZGRJbnRlcm5hbEV2ZW50V2l0aEl0YXNrQW5kQ29kZShpdGFzazogSVRhc2ssIGNvZGU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5hZGRHdWlUcmlnZ2VyZWRFdmVudFdpdGhUYXNrQW5kQ29kZUFuZE9uTXVsdGlNYXJrKGl0YXNrLCBjb2RlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjb2RlXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGFkZEludGVybmFsRXZlbnRXaXRoQ3RybEFuZENvZGUoY3RybDogTWdDb250cm9sQmFzZSwgY29kZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQoPE1nQ29udHJvbD5jdHJsKTtcclxuICAgIHJ0RXZ0LnNldEludGVybmFsKGNvZGUpO1xyXG4gICAgdGhpcy5hZGRUb1RhaWwocnRFdnQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNvZGVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgYWRkSW50ZXJuYWxFdmVudFdpdGhDdHJsQW5kRGlzcGxheUxpbmVBbmRDb2RlKGN0cmw6IE1nQ29udHJvbEJhc2UsIERpc3BsYXlMaW5lOiBudW1iZXIsIGNvZGU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KDxNZ0NvbnRyb2w+Y3RybCwgRGlzcGxheUxpbmUsIGZhbHNlKTtcclxuICAgIHJ0RXZ0LnNldEludGVybmFsKGNvZGUpO1xyXG4gICAgdGhpcy5hZGRUb1RhaWwocnRFdnQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY3RybFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY29kZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicHJpb3JpdHlcIj48L3BhcmFtPlxyXG4gIGFkZEludGVybmFsRXZlbnRXaXRoQ3RybEFuZENvZGVBbmRQcmlvcml0eShjdHJsOiBNZ0NvbnRyb2xCYXNlLCBjb2RlOiBudW1iZXIsIHByaW9yaXR5OiBQcmlvcml0eSk6IHZvaWQge1xyXG4gICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KDxNZ0NvbnRyb2w+Y3RybCk7XHJcbiAgICBydEV2dC5zZXRJbnRlcm5hbChjb2RlKTtcclxuICAgIHJ0RXZ0LnNldFByaW9yaXR5KHByaW9yaXR5KTtcclxuICAgIHRoaXMuYWRkVG9UYWlsKHJ0RXZ0KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gYWRkIGd1aSB0cmlnZ2VyZWQgZXZlbnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIml0YXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjb2RlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJvbk11bHRpTWFya1wiPjwvcGFyYW0+XHJcbiAgYWRkR3VpVHJpZ2dlcmVkRXZlbnRXaXRoVGFza0FuZENvZGVBbmRPbk11bHRpTWFyayhpdGFzazogSVRhc2ssIGNvZGU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgbGV0IHRhc2s6IFRhc2sgPSA8VGFzaz5pdGFzaztcclxuICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudCh0YXNrKTtcclxuICAgIHJ0RXZ0LnNldEludGVybmFsKGNvZGUpO1xyXG4gICAgdGhpcy5hZGRUb1RhaWwocnRFdnQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyB3aWxsIGJlIHVzZWQgZm9yIG11bHRpbWFya2luZyBpbiB0aGUgZnV0dXJlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdHJsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjb2RlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsaW5lXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtb2RpZmllcnNcIj48L3BhcmFtPlxyXG4gIGFkZEd1aVRyaWdnZXJlZEV2ZW50V2l0aEN0cmxBbmRDb2RlQW5kTGluZUFuZE1vZGlmaWVyKGN0cmw6IE1nQ29udHJvbEJhc2UsIGNvZGU6IG51bWJlciwgbGluZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQoPE1nQ29udHJvbD5jdHJsLCBsaW5lLCBmYWxzZSk7XHJcbiAgICBydEV2dC5zZXRJbnRlcm5hbChjb2RlKTtcclxuICAgIHRoaXMuYWRkVG9UYWlsKHJ0RXZ0KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBBZGQgaW50ZXJuYWwgZXZlbnQgdGhhdCB3YXMgdHJpZ2dlcmVkIGJ5IEdVSSBxdWV1ZSAoaW5jbHVkZXMgdGltZXIgZXZlbnRzKSB0byB0aGUgcXVldWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFza1wiPmNvbnRyb2wgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNvZGVcIj5jb2RlIG9mIGludGVybmFsIGV2ZW50IDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJsaW5lXCI+bGluZSBpbiBhIHRhYmxlIGNvbnRyb2wgPC9wYXJhbT5cclxuICBhZGRHdWlUcmlnZ2VyZWRFdmVudFdpdGhUYXNrQW5kQ29kZUFuZExpbmUodGFzazogVGFzaywgY29kZTogbnVtYmVyLCBsaW5lOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGxldCB0c2s6IFRhc2sgPSBudWxsO1xyXG4gICAgaWYgKHRhc2sgIT09IG51bGwpXHJcbiAgICAgIHRzayA9IDxUYXNrPnRhc2s7XHJcblxyXG4gICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KHRzayk7XHJcbiAgICBydEV2dC5zZXRJbnRlcm5hbChjb2RlKTtcclxuICAgIHJ0RXZ0LkRpc3BsYXlMaW5lID0gbGluZTtcclxuICAgIHRoaXMuYWRkVG9UYWlsKHJ0RXZ0KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gaGFuZGxlIENvbHVtbiBDbGljayBldmVudCBvbiBDb2x1bW4gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImd1aUNvbHVtbkN0cmxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImRpcmVjdGlvblwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY29sdW1uSGVhZGVyXCI+PC9wYXJhbT5cclxuICBBZGRDb2x1bW5DbGlja0V2ZW50KGNvbHVtbkN0cmw6IE1nQ29udHJvbEJhc2UsIGRpcmVjdGlvbjogbnVtYmVyLCBjb2x1bW5IZWFkZXI6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KDxNZ0NvbnRyb2w+Y29sdW1uQ3RybCwgZGlyZWN0aW9uLCAwKTtcclxuICAgIHJ0RXZ0LnNldEludGVybmFsKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DT0xfQ0xJQ0spO1xyXG5cclxuICAgIC8vIFByZXBhcmUgYW4gYXJndW1lbnQgbGlzdCB3aXRoIGFyZ3VtZW50IGFzIGNvbHVtbkhlYWRlclN0cmluZy5cclxuICAgIGxldCBhcmdzTGlzdCA9IG5ldyBBcnJheTxFeHBWYWw+KCk7XHJcbiAgICBhcmdzTGlzdFswXSA9IG5ldyBFeHBWYWwoU3RvcmFnZUF0dHJpYnV0ZS5VTklDT0RFLCBmYWxzZSwgY29sdW1uSGVhZGVyKTtcclxuICAgIGxldCBhcmdzID0gbmV3IEFyZ3VtZW50c0xpc3QoYXJnc0xpc3QpO1xyXG4gICAgcnRFdnQuc2V0QXJnTGlzdChhcmdzKTtcclxuXHJcbiAgICB0aGlzLmFkZFRvVGFpbChydEV2dCk7XHJcbiAgfVxyXG5cclxuICBBZGRSb3V0ZUV2ZW50KHRhc2s6IElUYXNrLCBjb2RlOiBudW1iZXIsIHJvdXRlcnBhdGg6IHN0cmluZywgcm91dGVyT3V0bGV0TmFtZTogc3RyaW5nLCByb3V0ZVBhcmFtczogTGlzdDxhbnk+KSB7XHJcbiAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQoPFRhc2s+dGFzaywgdHJ1ZSk7XHJcbiAgICBydEV2dC5zZXRJbnRlcm5hbChjb2RlKTtcclxuXHJcbiAgICBsZXQgYXJnc0xpc3Q6IEV4cFZhbFtdID0gbmV3IEFycmF5PEV4cFZhbD4oMik7XHJcbiAgICBhcmdzTGlzdFswXSA9IG5ldyBFeHBWYWwoU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQSwgZmFsc2UsIHJvdXRlcnBhdGgpO1xyXG4gICAgaWYgKHJvdXRlck91dGxldE5hbWUgPT09IG51bGwpXHJcbiAgICAgIHJvdXRlck91dGxldE5hbWUgPSAnJztcclxuICAgIGFyZ3NMaXN0WzFdID0gbmV3IEV4cFZhbChTdG9yYWdlQXR0cmlidXRlLkFMUEhBLCBmYWxzZSwgcm91dGVyT3V0bGV0TmFtZSk7XHJcblxyXG4gICAgbGV0IGFyZ3MgPSBuZXcgQXJndW1lbnRzTGlzdChhcmdzTGlzdCk7XHJcbiAgICBydEV2dC5zZXRBcmdMaXN0KGFyZ3MpO1xyXG4gICAgcnRFdnQuc2V0Um91dGVQYXJhbUxpc3Qocm91dGVQYXJhbXMpO1xyXG5cclxuICAgIHRoaXMuYWRkVG9UYWlsKHJ0RXZ0KTtcclxuICB9XHJcblxyXG4gIEFkZFJvdXRlckNsb3NlZEV2ZW50KHRhc2s6IFRhc2spIHtcclxuICAgIGxldCBzdWJGb3JtQ29udHJvbDogTWdDb250cm9sQmFzZSA9IDxNZ0NvbnRyb2xCYXNlPnRhc2suZ2V0Rm9ybSgpLmdldFN1YkZvcm1DdHJsKCk7XHJcbiAgICBsZXQgcnRFdnQgPSBuZXcgUnVuVGltZUV2ZW50KDxUYXNrQmFzZT5zdWJGb3JtQ29udHJvbC5nZXRGb3JtKCkuZ2V0VGFzaygpLCB0cnVlKTtcclxuICAgIHJ0RXZ0LnNldEludGVybmFsKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9TVUJGT1JNX0NMT1NFKTtcclxuXHJcbiAgICBsZXQgYXJnc0xpc3Q6IEV4cFZhbFtdID0gbmV3IEFycmF5PEV4cFZhbD4oMSk7XHJcbiAgICBhcmdzTGlzdFswXSA9IG5ldyBFeHBWYWwoU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQSwgZmFsc2UsIHN1YkZvcm1Db250cm9sLmdldE5hbWUoKSk7XHJcblxyXG4gICAgbGV0IGFyZ3MgPSBuZXcgQXJndW1lbnRzTGlzdChhcmdzTGlzdCk7XHJcbiAgICBydEV2dC5zZXRBcmdMaXN0KGFyZ3MpO1xyXG4gICAgRXZlbnRzTWFuYWdlci5JbnN0YW5jZS5hZGRUb1RhaWwocnRFdnQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBhZGQgbGFzdCBzYXZlZCByb3V0ZSBldmVudCA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic3JjVGFza1N0clwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiYXJnTGlzdFN0clwiPjwvcGFyYW0+XHJcbiAgQWRkTGFzdFNhdmVkUm91dGVFdmVudChzcmNUYXNrOiBUYXNrLCBhcmdzOiBBcmd1bWVudHNMaXN0KSB7XHJcbiAgICBsZXQgcnRFdnQgPSBuZXcgUnVuVGltZUV2ZW50KDxUYXNrQmFzZT5MYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCksIHRydWUpO1xyXG4gICAgcnRFdnQuc2V0SW50ZXJuYWwoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1dFQkNMSUVOVF9ST1VURSk7XHJcblxyXG4gICAgaWYgKHNyY1Rhc2sgIT0gbnVsbCkge1xyXG4gICAgICBydEV2dC5zZXRUYXNrKHNyY1Rhc2spO1xyXG4gICAgICBpZiAoYXJncyAhPSBudWxsKSB7XHJcbiAgICAgICAgcnRFdnQuc2V0QXJnTGlzdChhcmdzKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnNldExhc3RTYXZlZFJvdXRlRXZlbnQocnRFdnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgQWRkIGludGVybmFsIGV2ZW50IHJvIHNldCB0aGUgdmFsdWUgb2YgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsXCI+IGNvbnRyb2wgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbHVlXCI+IHZhbHVlIG9mIGNvbnRyb2wgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJlZnJlc2hEaXNwbGF5XCI+IHJlZnJlc2ggZGlzcGxheSA8L3BhcmFtPlxyXG4gIEFkZEV4dGVybmFsVmFsdWVFdmVudChjdHJsOiBNZ0NvbnRyb2wsIHZhbHVlOiBhbnksIHJlZnJlc2hEaXNwbGF5OiBib29sZWFuKSB7XHJcbiAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQoY3RybCwgMCwgdHJ1ZSk7XHJcbiAgICBydEV2dC5zZXRJbnRlcm5hbChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfU0VUX0VYVEVSTkFMX1ZBTFVFKTtcclxuICAgIHJ0RXZ0LnNldFZhbHVlKHZhbHVlKTtcclxuXHJcbiAgICBsZXQgYXJnc0xpc3Q6IEV4cFZhbFtdID0gbmV3IEFycmF5PEV4cFZhbD4oMSk7XHJcbiAgICBhcmdzTGlzdFswXSA9IG5ldyBFeHBWYWwoU3RvcmFnZUF0dHJpYnV0ZS5CT09MRUFOLCBmYWxzZSwgcmVmcmVzaERpc3BsYXkgPyAnMScgOiAnMCcpO1xyXG4gICAgbGV0IGFyZ3MgPSBuZXcgQXJndW1lbnRzTGlzdChhcmdzTGlzdCk7XHJcbiAgICBydEV2dC5zZXRBcmdMaXN0KGFyZ3MpO1xyXG5cclxuICAgIHRoaXMuYWRkVG9UYWlsKHJ0RXZ0KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBBZGQgaW50ZXJuYWwgZXZlbnQgdGhhdCB3YXMgdHJpZ2dlcmVkIGJ5IEdVSSBxdWV1ZSAoaW5jbHVkZXMgdGltZXIgZXZlbnRzKSB0byB0aGUgcXVldWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPmNvbnRyb2wgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNvZGVcIj5jb2RlIG9mIGludGVybmFsIGV2ZW50IDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJsaW5lXCI+bGluZSBpbiBhIHRhYmxlIGNvbnRyb2wgPC9wYXJhbT5cclxuICBhZGRHdWlUcmlnZ2VyZWRFdmVudFdpdGhDdHJsQW5kQ29kZUFuZExpbmUoY3RybDogTWdDb250cm9sQmFzZSwgY29kZTogbnVtYmVyLCBsaW5lOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudChjdHJsLCBsaW5lLCB0cnVlKTtcclxuICAgIHJ0RXZ0LnNldEludGVybmFsKGNvZGUpO1xyXG4gICAgdGhpcy5hZGRUb1RhaWwocnRFdnQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEFkZCBpbnRlcm5hbCBldmVudCB0aGF0IHdhcyB0cmlnZ2VyZWQgYnkgR1VJIHF1ZXVlIChpbmNsdWRlcyB0aW1lciBldmVudHMpIHRvIHRoZSBxdWV1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsXCI+Y29udHJvbCA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibGluZVwiPnRoZSBsaW5lIGZvciBtdWx0aWxpbmUgY29udHJvbCA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY29kZVwiPmNvZGUgb2YgaW50ZXJuYWwgZXZlbnQgPC9wYXJhbT5cclxuICBhZGRHdWlUcmlnZ2VyZWRFdmVudFdpdGhDdHJsQW5kTGluZUFuZENvZGVBbmRJc1Byb2R1Y3RDbGljayhjdHJsOiBNZ0NvbnRyb2xCYXNlLCBjb2RlOiBudW1iZXIsIGxpbmU6IG51bWJlciwgaXNQcm9kdWNlQ2xpY2s6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudChjdHJsLCBsaW5lLCB0cnVlKTtcclxuICAgIHJ0RXZ0LnNldEludGVybmFsKGNvZGUpO1xyXG4gICAgcnRFdnQuc2V0UHJvZHVjZUNsaWNrKGlzUHJvZHVjZUNsaWNrKTtcclxuICAgIHRoaXMuYWRkVG9UYWlsKHJ0RXZ0KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBBZGQgaW50ZXJuYWwgZXZlbnQgdGhhdCB3YXMgdHJpZ2dlcmVkIGJ5IEdVSSBxdWV1ZSAoaW5jbHVkZXMgdGltZXIgZXZlbnRzKSB0byB0aGUgcXVldWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPmNvbnRyb2wgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNvZGVcIj5jb2RlIG9mIGludGVybmFsIGV2ZW50IDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJsaXN0XCI+PC9wYXJhbT5cclxuICBhZGRHdWlUcmlnZ2VyZWRFdmVudFdpdGhDdHJsQW5kQ29kZUFuZExpc3QoY3RybDogTWdDb250cm9sQmFzZSwgY29kZTogbnVtYmVyLCBsaXN0OiBMaXN0PE1nQ29udHJvbEJhc2U+KTogdm9pZCB7XHJcbiAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQoY3RybCwgbGlzdCwgdHJ1ZSk7XHJcbiAgICBydEV2dC5zZXRJbnRlcm5hbChjb2RlKTtcclxuICAgIHRoaXMuYWRkVG9UYWlsKHJ0RXZ0KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gQWRkIGludGVybmFsIGV2ZW50IHRoYXQgd2FzIHRyaWdnZXJlZCBieSBHVUkgcXVldWUgdG8gdGhlIHF1ZXVlIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRhc2tcIj5yZWZlcmVuY2UgdG8gdGhlIHRhc2sgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNvZGVcIj5jb2RlIG9mIGludGVybmFsIGV2ZW50IDwvcGFyYW0+XHJcbiAgYWRkR3VpVHJpZ2dlcmVkRXZlbnRXaXRoVGFza0FuZENvZGUodGFzazogSVRhc2ssIGNvZGU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KDxUYXNrPnRhc2ssIHRydWUpO1xyXG4gICAgcnRFdnQuc2V0SW50ZXJuYWwoY29kZSk7XHJcbiAgICB0aGlzLmFkZFRvVGFpbChydEV2dCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IEFkZCBpbnRlcm5hbCBldmVudCB0aGF0IHdhcyB0cmlnZ2VyZWQgYnkgR1VJIHF1ZXVlIHRvIHRoZSBxdWV1ZSA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidGFza1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY29kZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicmFpc2VkQnlcIj5yZWxldmFudCBvbmx5IGZvciBvbmxpbmUgKGZvciB3aGljaCBzdWJmb3JtIGFyZSBoYW5kbGVkIGFzIG9ycGhhbnMpPC9wYXJhbT5cclxuICBhZGRHdWlUcmlnZ2VyZWRFdmVudFRhc2tBbmRDb2RlQW5kUmFpc2VkQnkodGFzazogSVRhc2ssIGNvZGU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5hZGRHdWlUcmlnZ2VyZWRFdmVudFdpdGhUYXNrQW5kQ29kZSh0YXNrLCBjb2RlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBmaXJzdCBldmVudCBmcm9tIHRoZSBxdWV1ZSBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlcmVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgZ2V0RXZlbnQoKTogUnVuVGltZUV2ZW50IHtcclxuICAgIHJldHVybiA8UnVuVGltZUV2ZW50PnRoaXMuX2V2ZW50c1F1ZXVlLnBvbGwoKTtcclxuICB9XHJcblxyXG4gIGdldEZvcmNlRXhpdCgpOiBGb3JjZUV4aXQge1xyXG4gICAgcmV0dXJuIHRoaXMuX2ZvcmNlRXhpdDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0Rm9yY2VFeGl0KGZvcmNlRXhpdDogRm9yY2VFeGl0LCB0YXNrOiBUYXNrKTogdm9pZCB7XHJcbiAgICB0aGlzLl9mb3JjZUV4aXQgPSBmb3JjZUV4aXQ7XHJcbiAgICB0aGlzLnNldEZvcmNlRXhpdFRhc2sodGFzayk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEZvcmNlRXhpdFRhc2soKTogVGFzayB7XHJcbiAgICByZXR1cm4gdGhpcy5fZm9yY2VFeGl0VGFzaztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0Rm9yY2VFeGl0VGFzayh0YXNrOiBUYXNrKTogdm9pZCB7XHJcbiAgICB0aGlzLl9mb3JjZUV4aXRUYXNrID0gdGFzaztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIHJldHVybnMgdHJ1ZSBpZiB0aGUgRXZlbnRzTWFuYWdlciBpcyBjdXJyZW50bHkgaGFuZGxpbmcgYSB1c2VyIGV2ZW50IHdpdGhcclxuICAgKiBGb3JjZSBFeGl0ID0gJ1ByZS1SZWNvcmQgVXBkYXRlJ1xyXG4gICAqL1xyXG4gIGlzRm9yY2VFeGl0UHJlUmVjb3JkVXBkYXRlKHRhc2s6IFRhc2tCYXNlKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5faXNIYW5kbGluZ0ZvcmNlRXhpdCAmJiB0aGlzLmdldEZvcmNlRXhpdCgpID09PSBGb3JjZUV4aXQuUHJlUmVjb3JkVXBkYXRlICYmIHRhc2sgPT09IHRoaXMuZ2V0Rm9yY2VFeGl0VGFzaygpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBFeGVjdXRlIENsaWVudENvbnRleHRJbmFjdGl2aXR5IFRpbWVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyBFeGVjdXRlQ2xpZW50Q29udGV4dEluYWN0aXZpdHlUaW1lcigpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBzdGFydFRpbWUgPSBNaXNjLmdldFN5c3RlbU1pbGxpc2Vjb25kcygpO1xyXG5cclxuICAgIC8vIGNvbnZlcnQgdGVudGhzIG9mIHNlY29uZHMgdG8gbWlsbGlzZWNvbmRzLlxyXG4gICAgbGV0IGNsaWVudEN0eEluYWN0aXZpdHlUaW1lb3V0ID1cclxuICAgICAgRW52aXJvbm1lbnQuSW5zdGFuY2UuZ2V0Q2xpZW50Q29udGV4dEluYWN0aXZpdHlUaW1lb3V0KCkgKiAxMDA7XHJcblxyXG4gICAgRXZlbnRzTWFuYWdlci5jbGllbnRJbmFjdGl2aXR5VGltZXJPTiA9IHRydWU7XHJcbiAgICB3aGlsZSAoRXZlbnRzTWFuYWdlci5jbGllbnRJbmFjdGl2aXR5VGltZXJPTikge1xyXG4gICAgICBhd2FpdCBUaHJlYWQuU2xlZXAoMTAwMCk7XHJcbiAgICAgIHZhciB0aW1lTGFwc2VkID0gTWlzYy5nZXRTeXN0ZW1NaWxsaXNlY29uZHMoKSAtIHN0YXJ0VGltZTtcclxuICAgICAgaWYgKEV2ZW50c01hbmFnZXIuY2xpZW50Q29udGV4dEluYWN0aXZpdHlUaW1lckFib3J0ZWQgfHwgdGltZUxhcHNlZCA+PSBjbGllbnRDdHhJbmFjdGl2aXR5VGltZW91dCkge1xyXG4gICAgICAgIEV2ZW50c01hbmFnZXIuY2xpZW50SW5hY3Rpdml0eVRpbWVyT04gPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gU2hvdyBvciBoaWRlIHRoZSBzcGlubmVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInNob3dcIj4gPC9wYXJhbT5cclxuICBhc3luYyBDaGVja0FuZFNob3dTcGlubmVyKHNob3c6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBzZW5kQ29tbWFuZCA9IGZhbHNlO1xyXG5cclxuICAgIC8vIElmIHRoZSBjdXJyZW50IGV2ZW50IGlzIG9mIGxvd2VzdCBwcmlvcml0eSwgaXQgaXMgYWN0dWFsbHkgc2FmZSB0byBvcGVuIHVzZXIgaW50ZXJhY3Rpb24uXHJcbiAgICAvLyBTbywgc3RvcCB0aGUgc3Bpbm5lci5cclxuICAgIGlmICh0aGlzLmdldExhc3RSdEV2ZW50KCkgIT09IG51bGwgJiYgdGhpcy5nZXRMYXN0UnRFdmVudCgpLmdldFByaW9yaXR5KCkgPT09IFByaW9yaXR5LkxPV0VTVClcclxuICAgICAgc2hvdyA9IGZhbHNlO1xyXG5cclxuICAgIGlmIChzaG93ICE9IHRoaXMuaXNTcGlubmVyU2hvd24pIHtcclxuICAgICAgaWYgKHNob3cpIHtcclxuICAgICAgICAvLyBTaG93IHRoZSBzcGlubmVyIG9ubHkgaWYgdGhyZXNob2xkIGlzIHJlYWNoZWQuXHJcbiAgICAgICAgLy9Ub0RvOiBEZWZpbmUgYSBjb25zdCBmb3IgMTAwMC4gQWxzbyBtYWtlIGl0IGN1c3RvbWl6YWJsZSBmcm9tIGFuZ3VsYXIgYXBwXHJcbiAgICAgICAgaWYgKE1pc2MuZ2V0U3lzdGVtTWlsbGlzZWNvbmRzKCkgLSB0aGlzLkdldEV2ZW50VGltZSgpID4gMTAwMCkge1xyXG4gICAgICAgICAgc2VuZENvbW1hbmQgPSB0cnVlO1xyXG4gICAgICAgICAgRXZlbnRzTWFuYWdlci5jbGllbnRCdXN5VGltZVN0YXJ0ID0gTWlzYy5nZXRTeXN0ZW1NaWxsaXNlY29uZHMoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZVxyXG4gICAgICAgIHNlbmRDb21tYW5kID0gdHJ1ZTtcclxuXHJcbiAgICAgIGlmIChzZW5kQ29tbWFuZCkge1xyXG4gICAgICAgIENvbW1hbmRzLmFkZFNob3dTcGlubmVyKHNob3cpO1xyXG4gICAgICAgIENvbW1hbmRzLmJlZ2luSW52b2tlKCk7XHJcbiAgICAgICAgLy8gcmVsZWFzZSB0aGUgdGhyZWFkIHNvIHRoYXQgZnJhbWV3b3JrIGNhbiBzaG93L2hpZGUgdGhlIHNwaW5uZXJcclxuICAgICAgICBhd2FpdCBUaHJlYWQuU2xlZXAoNTApO1xyXG5cclxuICAgICAgICB0aGlzLmlzU3Bpbm5lclNob3duID0gc2hvdztcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmlzU3Bpbm5lclNob3duKSB7XHJcbiAgICAgICAgICAvLyB1cGRhdGUgdGhlIHRpbWUgZm9yIHdoaWNoIGNsaWVudCB3YXMgYnVzeVxyXG4gICAgICAgICAgbGV0IHRvdGFsQ2xpZW50QnVzeVRpbWUgPSBNaXNjLmdldFN5c3RlbU1pbGxpc2Vjb25kcygpIC0gRXZlbnRzTWFuYWdlci5jbGllbnRCdXN5VGltZVN0YXJ0O1xyXG4gICAgICAgICAgdGhpcy5TcGlubmVyU3RvcHBlZC5uZXh0KHRvdGFsQ2xpZW50QnVzeVRpbWUpO1xyXG4gICAgICAgICAgRXZlbnRzTWFuYWdlci5jbGllbnRCdXN5VGltZVN0YXJ0ID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBNYWluIGV2ZW50cyBsb29wLCBydW5zIGluIHdvcmtlciB0aHJlYWQgZm9yIG1haW4gd2luZG93IGFuZCBmb3IgZXZlcnlcclxuICAvLy8gICBtb2RhbCB3aW5kb3cgUmVzcG9uc2libGUgZm9yIGhhbmRsaW5nIGV2ZW50c1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJtZ0RhdGFcIj4gPC9wYXJhbT5cclxuICBhc3luYyBFdmVudHNMb29wKG1nRGF0YTogTUdEYXRhKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgc2F2ZWRBbGxvd0V2ZW50czogRXZlbnRzQWxsb3dlZFR5cGUgPSB0aGlzLmdldEFsbG93RXZlbnRzKCk7XHJcblxyXG4gICAgdGhpcy5zZXRBbGxvd0V2ZW50cyhFdmVudHNBbGxvd2VkVHlwZS5BTEwpO1xyXG5cclxuICAgIHRoaXMucHVzaE5ld0V4ZWNTdGFja3MoKTtcclxuXHJcbiAgICB3aGlsZSAoIW1nRGF0YS5Jc0Fib3J0aW5nKSB7XHJcbiAgICAgIC8vIEhpZGUgdGhlIHNwaW5uZXIgYmVmb3JlIG1vdmluZyB0byBpZGxlXHJcbiAgICAgIGF3YWl0IHRoaXMuQ2hlY2tBbmRTaG93U3Bpbm5lcihmYWxzZSk7XHJcblxyXG4gICAgICBhd2FpdCB0aGlzLl9ldmVudHNRdWV1ZS53YWl0Rm9yRWxlbWVudCgpO1xyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUV2ZW50cyhtZ0RhdGEsIDApO1xyXG5cclxuICAgICAgaWYgKCFtZ0RhdGEuSXNBYm9ydGluZylcclxuICAgICAgICBhd2FpdCB0aGlzLmNoZWNrUGFya2FiaWxpdHkoKTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5wb3BOZXdFeGVjU3RhY2tzKCk7XHJcbiAgICB0aGlzLnNldEFsbG93RXZlbnRzKHNhdmVkQWxsb3dFdmVudHMpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIE5vbiBpbnRlcmFjdGl2ZSBldmVudHMgbG9vcCwgcnVucyBpbiB3b3JrZXIgdGhyZWFkIGZvciBub24gaW50ZXJhY3RpdmUgdGFza3NcclxuICAvLy8gICBSZXNwb25zaWJsZSBmb3IgY3ljbGluZyBmb3J3YXJkIG9uIHJlY29yZHMgYW5kIGhhbmRsaW5nIGV2ZW50cy5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibWdEYXRhXCI+PC9wYXJhbT5cclxuICBhc3luYyBOb25JbnRlcmFjdGl2ZUV2ZW50c0xvb3AobWdEYXRhOiBNR0RhdGEsIHRhc2tCYXNlOiBUYXNrQmFzZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHRhc2s6IFRhc2sgPSA8VGFzaz50YXNrQmFzZTtcclxuICAgIGxldCBzYXZlZEFsbG93RXZlbnRzOiBFdmVudHNBbGxvd2VkVHlwZSA9IHRoaXMuZ2V0QWxsb3dFdmVudHMoKTtcclxuXHJcbiAgICB0aGlzLnNldE5vbkludGVyYWN0aXZlQWxsb3dFdmVudHMoYXdhaXQgdGFzay5pc0FsbG93RXZlbnRzKCkpO1xyXG5cclxuICAgIHRoaXMucHVzaE5ld0V4ZWNTdGFja3MoKTtcclxuXHJcbiAgICB3aGlsZSAoIW1nRGF0YS5Jc0Fib3J0aW5nKSB7XHJcbiAgICAgIGlmICh0YXNrLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9ERUxFVEUpXHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NZQ0xFX05FWFRfREVMRVRFX1JFQyk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1lDTEVfTkVYVF9SRUMpO1xyXG5cclxuICAgICAgYXdhaXQgVGhyZWFkLlNsZWVwKDEwKTtcclxuXHJcbiAgICAgIC8vIHBvbGwgb25seSAxIGV2ZW50LlxyXG4gICAgICBpZiAoIW1nRGF0YS5Jc0Fib3J0aW5nICYmIGF3YWl0IHRhc2suaXNBbGxvd0V2ZW50cygpKVxyXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRXZlbnRzKG1nRGF0YSwgMSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5wb3BOZXdFeGVjU3RhY2tzKCk7XHJcbiAgICB0aGlzLnNldEFsbG93RXZlbnRzKHNhdmVkQWxsb3dFdmVudHMpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgaGFuZGxlRXZlbnRzKGJhc2VNZ0RhdGE6IE1HRGF0YSwgZXZlbnRzVG9IYW5kbGVDbnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4gO1xyXG4gIGFzeW5jIGhhbmRsZUV2ZW50cyhoYW5kbGVyc1RhYjogSGFuZGxlcnNUYWJsZSwgcnRFdnQ6IFJ1blRpbWVFdmVudCk6IFByb21pc2U8dm9pZD4gO1xyXG4gIGFzeW5jIGhhbmRsZUV2ZW50cyhiYXNlTWdEYXRhT3JIYW5kbGVyc1RhYjogYW55LCBldmVudHNUb0hhbmRsZUNudE9yUnRFdnQ6IGFueSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKChiYXNlTWdEYXRhT3JIYW5kbGVyc1RhYiA9PT0gbnVsbCB8fCBiYXNlTWdEYXRhT3JIYW5kbGVyc1RhYiBpbnN0YW5jZW9mIE1HRGF0YSkgJiYgKGV2ZW50c1RvSGFuZGxlQ250T3JSdEV2dCA9PT0gbnVsbCB8fCBldmVudHNUb0hhbmRsZUNudE9yUnRFdnQuY29uc3RydWN0b3IgPT09IE51bWJlcikpIHtcclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVFdmVudHNfMChiYXNlTWdEYXRhT3JIYW5kbGVyc1RhYiwgZXZlbnRzVG9IYW5kbGVDbnRPclJ0RXZ0KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgYXdhaXQgdGhpcy5oYW5kbGVFdmVudHNfMShiYXNlTWdEYXRhT3JIYW5kbGVyc1RhYiwgZXZlbnRzVG9IYW5kbGVDbnRPclJ0RXZ0KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgYW5kIHJlbW92ZSBldmVudHMgZnJvbSB0aGUgcXVldWUgYW5kIGhhbmRsZSB0aGVtIG9uZSBieSBvbmUgdGlsbCB0aGUgcXVldWUgaXMgZW1wdHlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiYmFzZU1nRGF0YVwiPiBtZ2RhdGEgb2YgdGhlIHdpbmRvdyB0aGF0IG9wZW5lZGVkIHRoYXQgaGFiZGxlIGV2ZW50PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIkV2ZW50c1RvSGFuZGxlQ250XCI+PC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIGhhbmRsZUV2ZW50c18wKGJhc2VNZ0RhdGE6IE1HRGF0YSwgZXZlbnRzVG9IYW5kbGVDbnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHRhc2s6IFRhc2sgPSBudWxsO1xyXG4gICAgbGV0IGRlbHRhOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IGV2ZW50c1BvbGxlZENudDogbnVtYmVyID0gMDtcclxuXHJcbiAgICB0aGlzLnNldFN0b3BFeGVjdXRpb24oZmFsc2UpO1xyXG5cclxuICAgIC8vIGdldCBhbmQgcmVtb3ZlIGV2ZW50cyBmcm9tIHRoZSBxdWV1ZSB0aWxsIGl0cyBlbXB0eVxyXG4gICAgd2hpbGUgKCF0aGlzLl9ldmVudHNRdWV1ZS5pc0VtcHR5KCkgJiYgIXRoaXMuX3N0b3BFeGVjdXRpb24gJiYgKGV2ZW50c1RvSGFuZGxlQ250ID09PSAwIHx8IGV2ZW50c1BvbGxlZENudCA8IGV2ZW50c1RvSGFuZGxlQ250KSkge1xyXG4gICAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IHRoaXMuZ2V0RXZlbnQoKTtcclxuICAgICAgaWYgKHJ0RXZ0ICE9PSBudWxsICYmIHJ0RXZ0LmlzR3VpVHJpZ2dlcmVkRXZlbnQoKSkge1xyXG4gICAgICAgIGRlbHRhID0gTWlzYy5nZXRTeXN0ZW1NaWxsaXNlY29uZHMoKTtcclxuICAgICAgICB0aGlzLl9jdXJyS2JkSXRlbSA9IG51bGw7XHJcblxyXG4gICAgICAgIGxldCBibG9ja2VkQnlNb2RhbFdpbmRvdzogYm9vbGVhbiA9IHJ0RXZ0LmlzQmxvY2tlZEJ5TW9kYWxXaW5kb3coYmFzZU1nRGF0YSk7XHJcbiAgICAgICAgaWYgKGJsb2NrZWRCeU1vZGFsV2luZG93ICYmIHJ0RXZ0LmdldEludGVybmFsQ29kZSgpICE9PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVElNRVIpIC8vIFFDUiAjNzI2MTk4LCBldmVudHMgZnJvbSAuTkVUIG9iamVjdHMgd2hpY2ggYXJlIG5vdCBvbiBmb3JtXHJcbiAgICAgICAgLy8gc2hvdWxkIGJlIGhhbmRsZWQgb24gcGFyZW50IG9mIG1vZGFsIHdpbmRvdyBhbHNvXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBJZGxlIHRpbWVyLCB0aW1lciBldmVudHMgYW5kIGVuYWJsZS9kaXNhYmxlIGV2ZW50cyBzaG91bGQgbm90IGNoYW5nZSB0aGUgY3VycmVudCB3aW5kb3cuXHJcbiAgICAgICAgLy8gVGhpcyBpcyBiZWNhdXNlIHRoZSBjdXJyZW50IHdpbmRvdyBkZXRlcm1pbmVzIHRoZSBjdXJyZW50IHRhc2sgYW5kIGNoYW5naW5nIHRoZSB0YXNrXHJcbiAgICAgICAgLy8gY2F1c2VzIHNvbWUgdGFzay1zY29wZWQgZXZlbnRzIHRvIHJ1biBvbiBzdWItdGFza3MgYXMgd2VsbC5cclxuICAgICAgICBpZiAoIXJ0RXZ0LmlzSWRsZVRpbWVyKCkgJiYgIWJsb2NrZWRCeU1vZGFsV2luZG93ICYmIHJ0RXZ0LmdldEludGVybmFsQ29kZSgpICE9PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRU5BQkxFX0VWRU5UUyAmJiBydEV2dC5nZXRJbnRlcm5hbENvZGUoKSAhPT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0RJU0FCTEVfRVZFTlRTICYmIHJ0RXZ0LmdldFRhc2soKSAhPT0gbnVsbCAmJiAhcnRFdnQuZ2V0VGFzaygpLmdldE1HRGF0YSgpLklzQWJvcnRpbmcpIHtcclxuICAgICAgICAgIE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuY3Vyck1nZElEID0gcnRFdnQuZ2V0VGFzaygpLmdldE1HRGF0YSgpLkdldElkKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGxldCBjdXJyTWdkOiBNR0RhdGEgPSBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLmdldEN1cnJNR0RhdGEoKTtcclxuICAgICAgaWYgKGN1cnJNZ2QgIT09IG51bGwpIHtcclxuICAgICAgICB3aGlsZSAoY3Vyck1nZCAhPT0gbnVsbCAmJiBjdXJyTWdkLklzQWJvcnRpbmcpIHtcclxuICAgICAgICAgIGN1cnJNZ2QgPSBjdXJyTWdkLmdldFBhcmVudE1HZGF0YSgpO1xyXG4gICAgICAgICAgaWYgKGN1cnJNZ2QgIT09IG51bGwpXHJcbiAgICAgICAgICAgIE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuY3Vyck1nZElEID0gTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5nZXRNZ0RhdGFJZHgoY3Vyck1nZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8qIFFDUnMgIzc3NzIxNyAmICM5NDI5NjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXHJcbiAgICAgICAgLyogSXQgbWlnaHQgaGFwcGVuIHRoYXQgd2UgaGF2ZSByZW1vdmVkIHRoZSBNR0RhdGEgICAgKi9cclxuICAgICAgICAvKiBmcm9tIHRoZSBNR1RhYmxlIGluIE1hbmFnZXIuQ2xvc2VFdmVudCgpLiAgKi9cclxuICAgICAgICAvKiBJdCB3YXMgZG9uZSBmb3IgZml4aW5nIFFDUiMgMjk2Mjc3IHJlbGF0aW5nIHRvIG1lbSAqL1xyXG4gICAgICAgIC8qIGxlYWtzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXHJcbiAgICAgICAgLyogSW4gdGhhdCBjYXNlLCBtZ2Qgd291bGQgYmUgbnVsbCBoZXJlLiAgICAgICAgICAgICAgKi9cclxuICAgICAgICAvKiBJbiBzdWNoIGEgc2NlbmFyaW8sIHRha2UgdGhlIHBhcmVudCBtZ2QgZnJvbSB0aGUgICAqL1xyXG4gICAgICAgIC8qIHJlbGF0ZWQgdGFzayBhbmQgY29udGludWUgcHJvY2Vzc2luZyB0aGUgZXZlbnRzLiAgICovXHJcbiAgICAgICAgdGFzayA9IDxUYXNrPnJ0RXZ0LmdldFRhc2soKTtcclxuICAgICAgICB3aGlsZSAoY3Vyck1nZCA9PT0gbnVsbCAmJiB0YXNrICE9PSBudWxsICYmIHRhc2suZ2V0UGFyZW50KCkgIT09IG51bGwpIHtcclxuICAgICAgICAgIHRhc2sgPSA8VGFzaz50YXNrLmdldFBhcmVudCgpO1xyXG4gICAgICAgICAgY3Vyck1nZCA9IHRhc2suZ2V0TUdEYXRhKCk7XHJcbiAgICAgICAgICBpZiAoY3Vyck1nZC5Jc0Fib3J0aW5nKVxyXG4gICAgICAgICAgICBjdXJyTWdkID0gbnVsbDtcclxuXHJcbiAgICAgICAgICBpZiAoY3Vyck1nZCAhPT0gbnVsbClcclxuICAgICAgICAgICAgTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5jdXJyTWdkSUQgPSBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLmdldE1nRGF0YUlkeChjdXJyTWdkKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGN1cnJNZ2QgPT09IG51bGwpXHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBpZiAocnRFdnQuZ2V0VGFzaygpID09PSBudWxsKSB7XHJcbiAgICAgICAgdGFzayA9IExhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKTtcclxuICAgICAgICB3aGlsZSAodGFzayAhPT0gbnVsbCAmJiAodGFzay5pc0Fib3J0aW5nKCkgfHwgdGFzay5JbkVuZFRhc2spKVxyXG4gICAgICAgICAgdGFzayA9IDxUYXNrPnRhc2suZ2V0UGFyZW50KCk7XHJcblxyXG4gICAgICAgIGlmICh0YXNrICE9PSBudWxsKSB7XHJcbiAgICAgICAgICBydEV2dC5zZXRDdHJsKDxNZ0NvbnRyb2w+dGFzay5nZXRMYXN0UGFya2VkQ3RybCgpKTtcclxuICAgICAgICAgIHJ0RXZ0LnNldFRhc2sodGFzayk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2VcclxuICAgICAgICB0YXNrID0gPFRhc2s+cnRFdnQuZ2V0VGFzaygpO1xyXG5cclxuICAgICAgaWYgKHRhc2sgIT09IG51bGwpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUV2ZW50KHJ0RXZ0LCBmYWxzZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIEdVSU1hbmFnZXIuSW5zdGFuY2UuZXhlY0d1aUNvbW1hbmRRdWV1ZSgpO1xyXG4gICAgICB0aGlzLl9jdXJyQ3RybCA9IG51bGw7IC8vIGRlbGV0ZSBjdXJyZW50IHByb2Nlc3NlZCBjb250cm9sXHJcblxyXG4gICAgICBpZiAodGFzayAhPT0gbnVsbClcclxuICAgICAgICBhd2FpdCBUYXNrLkNvbW1hbmRzUHJvY2Vzc29yLlNlbmRNb25pdG9yT25seSgpO1xyXG4gICAgICBlbHNlIHtcclxuXHJcbiAgICAgICAgYXdhaXQgVGFzay5Db21tYW5kc1Byb2Nlc3Nvci5TZW5kTW9uaXRvck9ubHkoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHJ0RXZ0ICE9PSBudWxsICYmIHJ0RXZ0LmlzR3VpVHJpZ2dlcmVkRXZlbnQoKSkge1xyXG4gICAgICAgIC8vIGxvZ2dpbmcgZm9yIHBlcmZvcm1hbmNlXHJcbiAgICAgICAgaWYgKGRlbHRhID4gMCkge1xyXG4gICAgICAgICAgZGVsdGEgPSBNaXNjLmdldFN5c3RlbU1pbGxpc2Vjb25kcygpIC0gZGVsdGE7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBhZHZhbmNlIEV2ZW50c1BvbGxlZCBvbmx5IGlmIHRoZSBldmVudCBpcyBpbnRlcm5hbC4gb3RoZXJ3aXNlIGludGVybmFscyB0byBiZSBleGVjdXRlZCB3aWxsIGJlIG5ldmVyIHJlYWNoZWQgYnkgbm9uIGludGVyYWN0aXZlIHRhc2tzLlxyXG4gICAgICBpZiAoZXZlbnRzVG9IYW5kbGVDbnQgPiAwICYmIHJ0RXZ0ICE9PSBudWxsICYmIHJ0RXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9JTlRFUk5BTCAmJiBydEV2dC5JbnRlcm5hbEV2ZW50IDwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RPVF9DTlQpXHJcbiAgICAgICAgZXZlbnRzUG9sbGVkQ250Kys7XHJcbiAgICB9IC8vIHdoaWxlICghX2V2ZW50c1F1ZXVlLmlzRW1wdHkoKSAuLi5cclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgSGFuZGxlIHN0b3AgZXhlY3V0aW9uIHdoaWxlIGV4ZWN1dGluZyBhbnkgaGFuZGxlclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJydEV2dFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIGFzeW5jIGhhbmRsZVN0b3BFeGVjdXRpb24ocnRFdnQ6IFJ1blRpbWVFdmVudCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IHN0b3A6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBpZiAoIXRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSlcclxuICAgICAgcmV0dXJuIHN0b3A7XHJcblxyXG4gICAgbGV0IHRhc2s6IFRhc2sgPSA8VGFzaz5ydEV2dC5nZXRUYXNrKCk7XHJcbiAgICBsZXQgY3VyckN0cmw6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+cnRFdnQuQ29udHJvbDtcclxuICAgIGxldCBsYXN0UGFya2VkQ3RybDogTWdDb250cm9sID0gTGFzdEZvY3VzZWRNYW5hZ2VyLmdldExhc3RGb2N1c2VkQ29udHJvbCgpO1xyXG4gICAgbGV0IGVuZFRhc2tEdWVUb1ZlcmlmeUVycm9yOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBpZiAocnRFdnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0lOVEVSTkFMKSB7XHJcbiAgICAgIHN3aXRjaCAocnRFdnQuZ2V0SW50ZXJuYWxDb2RlKCkpIHtcclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQVNLX1BSRUZJWDpcclxuICAgICAgICAgIGVuZFRhc2tEdWVUb1ZlcmlmeUVycm9yID0gdHJ1ZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYOlxyXG4gICAgICAgICAgLy8gQW4gZXJyb3IgaW4gdGhlIHJlY29yZCBwcmVmaXggc2VuZHMgdXMgcmlnaHQgYmFjayB0byB0aGUgc3RhcnQgb2YgdGhlIHJlY29yZCBwcmVmaXguXHJcbiAgICAgICAgICAvLyBJdCBtaWdodCBjcmVhdGUgYW4gZW5kbGVzcyBsb29wIGJ1dCBpdCBpcyBPSyB0byBkbyBzby4gSXQgaXMgYSBkZXZlbG9wZXIgYnVnLlxyXG4gICAgICAgICAgZW5kVGFza0R1ZVRvVmVyaWZ5RXJyb3IgPSB0cnVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVg6XHJcbiAgICAgICAgICAvLyBpdCB3aWxsIGJlIGhhbmRsZWQgaW4gY29tbW9uaGFuZGxlcmFmdGVyXHJcbiAgICAgICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb25DdHJsKG51bGwpO1xyXG4gICAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uQ3RybCg8TWdDb250cm9sPnRhc2suZ2V0TGFzdFBhcmtlZEN0cmwoKSk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9QUkVGSVg6XHJcbiAgICAgICAgICAvLyBFcnJvciBtaWdodCBoYXZlIG9jY3VycmVkIGluIENQLlxyXG4gICAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uKGZhbHNlKTtcclxuICAgICAgICAgIHRhc2suSW5DdHJsUHJlZml4ID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgaWYgKGxhc3RQYXJrZWRDdHJsID09PSBudWxsKVxyXG4gICAgICAgICAgLy8gb25seSBmb3IgdGhlIGZpcnN0IHRpbWVcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgdGFzay5zZXRDdXJyRmllbGQobnVsbCk7XHJcblxyXG4gICAgICAgICAgICAvLyByZXNldCB0aGUgc3RvcCBleGVjdXRpb24gY3RybFxyXG4gICAgICAgICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb25DdHJsKG51bGwpO1xyXG4gICAgICAgICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb25DdHJsKGN1cnJDdHJsKTtcclxuXHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuSGFuZGxlTm9uUGFya2FibGVDb250cm9scyh0YXNrKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIENQIGdvdCBzdG9wIGV4ZWN1dGlvbiB3aGlsZSBleGVjdXRpbmcgdGhlIG9wZXJhdGlvbnMgaW4gdGhpcyBoYW5kbGVyIGFuZCBpcyBwYXJrYWJsZS5cclxuICAgICAgICAgICAgLy8gd2UgbW92ZSB0byB0aGUgTGFzdFBhcmthYmxlIGNvbnRyb2xcclxuXHJcbiAgICAgICAgICAgIHRhc2suc2V0Q3VyckZpZWxkKGxhc3RQYXJrZWRDdHJsLmdldEZpZWxkKCkpO1xyXG5cclxuICAgICAgICAgICAgYXdhaXQgRm9jdXNNYW5hZ2VyLlNldEZvY3VzKGxhc3RQYXJrZWRDdHJsLCAtMSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb24odHJ1ZSk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9TVUZGSVg6XHJcbiAgICAgICAgICAvLyBJdCBtdXN0IGJlIHNldCB0byBmYWxzZSBzbyB0aGF0IG5leHQgdGltZSBmb3IgZmFzdCBtb2RlIENTIG11c3QgYmUgZXhlY3V0ZWQuXHJcbiAgICAgICAgICBjdXJyQ3RybC5zZXRJbkNvbnRyb2xTdWZmaXgoZmFsc2UpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICB9XHJcbiAgICAgIGlmIChlbmRUYXNrRHVlVG9WZXJpZnlFcnJvcikge1xyXG4gICAgICAgIGF3YWl0IHRhc2suZW5kVGFzayh0cnVlLCBmYWxzZSwgdHJ1ZSk7XHJcbiAgICAgICAgc3RvcCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBzdG9wO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHRha2UgY2FyZSBvZiBcIkZvcmNlIEV4aXRcIiBiZWZvcmUgdGhlIGhhbmRsZXIgZXhlY3V0ZSBpdHMgb3BlcmF0aW9ucyByZXR1cm5zIHRydWVcclxuICAvLy8gICBpZiB0aGUgZm9yY2UgZXhpdCB3YXMgaGFuZGxlZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJldmVudFwiPnRoZSBldmVudCBvZiB0aGUgaGFuZGxlclxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicnRFdnRcIj50aGUgcnVuLXRpbWUgZXZlbnRcclxuICAvLy8gPC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIGhhbmRsZUZvcmNlRXhpdEJlZm9yZShldnQ6IEV2ZW50LCBydEV2dDogUnVuVGltZUV2ZW50KTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgZm9yY2VFeGl0OiBGb3JjZUV4aXQgPSBldnQuVXNlckV2dC5Gb3JjZUV4aXQ7XHJcbiAgICBsZXQgaXNOZXdSZWM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBvbGRJZHg6IG51bWJlciA9IDA7XHJcblxyXG4gICAgLy8gVE9ETzogY2hlY2sgdGhlIGVmZmVjdCBvZiByZW1vdmluZyBmb3JjZUV4aXQgPT09IDxGb3JjZUV4aXQ+MFxyXG4gICAgaWYgKGZvcmNlRXhpdCA9PT0gRm9yY2VFeGl0Lk5vbmUgfHwgcnRFdnQuaXNJbW1lZGlhdGUoKSlcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgdGhpcy5faXNIYW5kbGluZ0ZvcmNlRXhpdCA9IHRydWU7XHJcbiAgICBsZXQgdGFzazogVGFzayA9IDxUYXNrPnJ0RXZ0LmdldFRhc2soKTtcclxuICAgIGxldCBvbGRSZWM6IFJlY29yZCA9ICg8RGF0YVZpZXc+dGFzay5EYXRhVmlldykuZ2V0Q3VyclJlYygpO1xyXG4gICAgaWYgKG9sZFJlYyAhPT0gbnVsbCAmJiBvbGRSZWMuZ2V0TW9kZSgpID09PSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuSW5zZXJ0ICYmIG9sZFJlYy5pc05ld1JlYygpKSB7XHJcbiAgICAgIGlzTmV3UmVjID0gdHJ1ZTtcclxuICAgICAgb2xkSWR4ID0gb2xkUmVjLmdldElkKCk7XHJcbiAgICB9XHJcbiAgICBpZiAoZm9yY2VFeGl0ICE9PSBGb3JjZUV4aXQuRWRpdGluZyAmJiB0YXNrLmdldExldmVsKCkgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX0NPTlRST0wpIHtcclxuICAgICAgbGV0IGN0cmw6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+dGFzay5nZXRMYXN0UGFya2VkQ3RybCgpO1xyXG4gICAgICBpZiAoY3RybCAhPT0gbnVsbClcclxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoTWdDb250cm9sQmFzZShjdHJsLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9TVUZGSVgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFNob3VsZCB3ZSBleGl0IHRoZSByZWNvcmQ/XHJcbiAgICBpZiAoKGZvcmNlRXhpdCA9PT0gRm9yY2VFeGl0LlByZVJlY29yZFVwZGF0ZSB8fCBmb3JjZUV4aXQgPT09IEZvcmNlRXhpdC5Qb3N0UmVjb3JkVXBkYXRlKSAmJiB0YXNrLmdldExldmVsKCkgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX1JFQ09SRCkge1xyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcbiAgICAgIGlmICh0YXNrLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUgJiYgIXRoaXMuX3N0b3BFeGVjdXRpb24pXHJcbiAgICAgICAgdGFzay5zZXRNb2RlKENvbnN0YW50cy5UQVNLX01PREVfTU9ESUZZKTtcclxuICAgICAgbGV0IGN1cnJSZWM6IFJlY29yZCA9ICg8RGF0YVZpZXc+dGFzay5EYXRhVmlldykuZ2V0Q3VyclJlYygpO1xyXG4gICAgICAvLyBJZiB3ZSBmYWlsZWQgZXhpdGluZyBhIG5ld2x5IGNyZWF0ZWQgcmVjb3JkIC0gcmVzdG9yZSBpbnNlcnQgbW9kZSBvZiB0aGUgcmVjb3JkXHJcbiAgICAgIGlmIChjdXJyUmVjICE9PSBudWxsICYmIHRoaXMuX3N0b3BFeGVjdXRpb24gJiYgaXNOZXdSZWMgJiYgb2xkSWR4ID09PSBjdXJyUmVjLmdldElkKCkgJiYgdGFzay5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKSB7XHJcbiAgICAgICAgLy8gcmVzdG9yZSBpbnNlcnQgbW9kZSBvZiB0aGUgcmVjb3JkXHJcbiAgICAgICAgY3VyclJlYy5jbGVhck1vZGUoKTtcclxuICAgICAgICBjdXJyUmVjLnJlc3RhcnQoRGF0YU1vZGlmaWNhdGlvblR5cGVzLkluc2VydCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChmb3JjZUV4aXQgPT09IEZvcmNlRXhpdC5Qb3N0UmVjb3JkVXBkYXRlICYmICF0aGlzLl9zdG9wRXhlY3V0aW9uKSB7XHJcbiAgICAgIGlmICh0YXNrLmdldExldmVsKCkgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spXHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFFDUiAjMzAzNzYyIC0gYWRkaXRpb25hbCBzdXBwb3J0IGZvciBmb3JjZUV4aXQgPSBlZGl0aW5nXHJcbiAgICBpZiAoZm9yY2VFeGl0ID09PSBGb3JjZUV4aXQuRWRpdGluZykge1xyXG4gICAgICBsZXQgZXZ0Q3RybDogTWdDb250cm9sID0gPE1nQ29udHJvbD5ydEV2dC5Db250cm9sO1xyXG5cclxuICAgICAgaWYgKGV2dEN0cmwgIT09IG51bGwgJiYgZXZ0Q3RybC5nZXRGaWVsZCgpICE9PSBudWxsKSB7XHJcbiAgICAgICAgbGV0IGN0cmxWYWw6IHN0cmluZyA9IE1hbmFnZXIuR2V0Q3RybFZhbChldnRDdHJsKTtcclxuICAgICAgICAvLyB0ZXN0IHRoZSBuZXcgY29udHJvbCB2YWx1ZVxyXG4gICAgICAgIGF3YWl0IGV2dEN0cmwudmFsaWRhdGVBbmRTZXRWYWx1ZShjdHJsVmFsLCB0cnVlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdGFrZSBjYXJlIG9mIFwiRm9yY2UgRXhpdFwiIGFmdGVyIGhhbmRsaW5nIHRoZSBldmVudCA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJydEV2dFwiPnRoZSBydW4tdGltZSBldmVudCA8L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlRm9yY2VFeGl0QWZ0ZXIocnRFdnQ6IFJ1blRpbWVFdmVudCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGZvcmNlRXhpdDogRm9yY2VFeGl0ID0gcnRFdnQuVXNlckV2dC5Gb3JjZUV4aXQ7XHJcblxyXG4gICAgbGV0IHRhc2s6IFRhc2sgPSA8VGFzaz5ydEV2dC5nZXRUYXNrKCk7XHJcblxyXG4gICAgLy8gUUNSIzc3NjI5NTogZm9yIHByZSByZWNvcmQgdXBkYXRlLCBjb21taXQgdGhlIHJlY29yZCBhZnRlciBoYW5kbGVyJ3MgZXhlY3V0aW9uLlxyXG4gICAgaWYgKGZvcmNlRXhpdCA9PT0gRm9yY2VFeGl0LlByZVJlY29yZFVwZGF0ZSkge1xyXG4gICAgICBhd2FpdCB0aGlzLmNvbW1pdFJlY29yZCh0YXNrLCB0cnVlKTtcclxuICAgICAgaWYgKCF0YXNrLnRyYW5zYWN0aW9uRmFpbGVkKENvbnN0SW50ZXJmYWNlLlRSQU5TX1JFQ09SRF9QUkVGSVgpICYmICF0YXNrLmlzQWJvcnRpbmcoKSkge1xyXG4gICAgICAgIC8vIGNoZWNrIHdoZXRoZXIgdG8gZXZhbHVhdGUgdGhlIGVuZCBjb25kaXRpb24gYWZ0ZXIgdGhlIHJlY29yZCBzdWZmaXhcclxuICAgICAgICBpZiAoYXdhaXQgdGFzay5ldmFsRW5kQ29uZChDb25zdEludGVyZmFjZS5FTkRfQ09ORF9FVkFMX0FGVEVSKSlcclxuICAgICAgICAgIGF3YWl0IHRhc2suZW5kVGFzayh0cnVlLCBmYWxzZSwgZmFsc2UpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRm9yIHBvc3QtcmVjb3JkIHR5cGUgd2UgYWxyZWFkeSBkaWQgcmVjLXByZWZpeCBhbmQgY3RybCBwcmVmaXggaW4gdGhlIGhhbmRsZUZvcmNlRXhpdEJlZm9yZVxyXG4gICAgaWYgKGZvcmNlRXhpdCAhPT0gRm9yY2VFeGl0LlBvc3RSZWNvcmRVcGRhdGUpIHtcclxuICAgICAgdGFzayA9IDxUYXNrPnJ0RXZ0LmdldFRhc2soKTtcclxuICAgICAgaWYgKHRhc2suZ2V0TGV2ZWwoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSylcclxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICB9XHJcbiAgICBsZXQgY3RybDogTWdDb250cm9sID0gTGFzdEZvY3VzZWRNYW5hZ2VyLmdldExhc3RGb2N1c2VkQ29udHJvbCgpO1xyXG4gICAgaWYgKGN0cmwgIT09IG51bGwgJiYgZm9yY2VFeGl0ICE9PSBGb3JjZUV4aXQuRWRpdGluZykge1xyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoTWdDb250cm9sQmFzZShjdHJsLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9QUkVGSVgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFFDUiA4MDE4NzMgLSB1cGRhdGUgdGhlIGRpc3BsYXkgYWZ0ZXIgaGFuZGxlciBvZiBmb3JjZSBleGl0IGVkaXRpbmdcclxuICAgIGlmIChmb3JjZUV4aXQgPT09IEZvcmNlRXhpdC5FZGl0aW5nKSB7XHJcbiAgICAgIGxldCBldnRDdHJsOiBNZ0NvbnRyb2wgPSA8TWdDb250cm9sPnJ0RXZ0LkNvbnRyb2w7XHJcbiAgICAgIC8vIGlmIHRoZXJlIGlzIGEgY29udHJvbCB0aGF0IGlzIGF0dGFjaGVkIHRvIGEgZmllbGRcclxuICAgICAgaWYgKGV2dEN0cmwgIT09IG51bGwgJiYgZXZ0Q3RybC5nZXRGaWVsZCgpICE9PSBudWxsKVxyXG4gICAgICAgIGF3YWl0ICg8RmllbGQ+ZXZ0Q3RybC5nZXRGaWVsZCgpKS51cGRhdGVEaXNwbGF5KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYSBzcGVjaWFsIHJvdXRpbmUgdG8gaGFuZGxlIGRhdGEgYW5kIHRpbWVyIGV2ZW50c1xyXG4gIC8vLyAgIGl0IHJlY2VpdmVzIGEgSGFuZGxlcnNUYWJsZSBhbmQgZXhlY3V0ZSB0aGVtIG9uZSBieSBvbmVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaGFuZGxlcnNUYWJcIj50aGUgaGFuZGxlcnMgdGFibGU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicnRFdnRcIj5hIHJlZmVyZW5uY2UgdG8gdGhlIHRpbWVyIHJ1bnRpbWUgZXZlbnQgLSBmb3IgZXhwcmVzc2lvbiBldmVudHMgaXQgbXVzdCBiZSBudWxsPC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIGhhbmRsZUV2ZW50c18xKGhhbmRsZXJzVGFiOiBIYW5kbGVyc1RhYmxlLCBydEV2dDogUnVuVGltZUV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLnB1c2hSdEV2ZW50KHJ0RXZ0KTtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGhhbmRsZXJzVGFiLmdldFNpemUoKTsgaSsrKSB7XHJcbiAgICAgICAgbGV0IGhhbmRsZXI6IEV2ZW50SGFuZGxlciA9IGhhbmRsZXJzVGFiLmdldEhhbmRsZXIoaSk7XHJcbiAgICAgICAgLy8gdGhlIHJ0RXZ0IGlzIHVzZWQgdG8gcGFzcyB0aGUgY3RybCwgdGhlcmVmb3IgaXQgbXVzdCBiZSB2YWxpZCAobm90IG51bGwpXHJcbiAgICAgICAgaWYgKHJ0RXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9FWFBSRVNTSU9OIHx8IGhhbmRsZXIuaXNTcGVjaWZpY0hhbmRsZXJPZihydEV2dCkgfHwgaGFuZGxlci5pc05vblNwZWNpZmljSGFuZGxlck9mKHJ0RXZ0KSB8fCBoYW5kbGVyLmlzR2xvYmFsSGFuZGxlck9mKHJ0RXZ0KSkge1xyXG4gICAgICAgICAgYXdhaXQgaGFuZGxlci5leGVjdXRlKHJ0RXZ0LCBmYWxzZSwgZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgdGhpcy5wb3BSdEV2ZW50KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgVGFrZXMgY2FyZSBvZiBrZXlkb3duIEV2ZW50XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRhc2tcIj50YXNrPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj5jb250cm9sIHByZXNzZWQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwia2JkSXRlbVwiPmtleWJvcmQgaXRlbTwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVLZXlEb3duKHRhc2s6IFRhc2ssIGN0cmw6IE1nQ29udHJvbCwgZXZ0OiBSdW5UaW1lRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBrYmRJdGVtOiBLZXlib2FyZEl0ZW0gPSBldnQuZ2V0S2JkSXRtQWx3YXlzKCk7XHJcbiAgICBsZXQga2V5Q29kZTogbnVtYmVyID0ga2JkSXRlbS5nZXRLZXlDb2RlKCk7XHJcbiAgICB0aGlzLl9jdXJyS2JkSXRlbSA9IGtiZEl0ZW07XHJcblxyXG4gICAgLy8gSWYga2V5Ym9hcmQgYnVmZmVyaW5nIGlzIHJlc3BvbnNpYmxlIGZvciB0aGlzIGV2ZW50LCB3ZSBuZWVkIHRvIGZpbmQgdGhlIHJpZ2h0IGNvbnRyb2wgdG8gcmVjZWl2ZVxyXG4gICAgLy8gdGhpcyBldmVudFxyXG4gICAgaWYgKGV2dC5JZ25vcmVTcGVjaWZpZWRDb250cm9sKSB7XHJcbiAgICAgIGN0cmwgPSB0aGlzLmdldEN1cnJDdHJsKCk7XHJcbiAgICAgIHRhc2sgPSAoKChjdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkgaW5zdGFuY2VvZiBUYXNrKSA/IDxUYXNrPmN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKSA6IG51bGwpKTtcclxuICAgICAgLy8gVGhlIGNvbnRyb2wgcmVjZWl2aW5nIGtleXMgZnJvbSBrZXlib2FyZCBidWZmZXJpbmcgbXVzdCBiZSBhIHRleHRib3hcclxuICAgICAgaWYgKGN0cmwuVHlwZSAhPT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfVEVYVClcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coJ1N0YXJ0IGhhbmRsaW5nIEtFWURPV04gZXZlbnQuIEtleSBjb2RlOiAnICsga2V5Q29kZSk7XHJcblxyXG4gICAgdHJ5IHtcclxuXHJcbiAgICAgIC8vIERPV04gb3IgVVAgaW52b2tlZCBvbiBhIFNFTEVDVC9SQURJTyBjb250cm9sXHJcbiAgICAgIGlmICh0aGlzLl9jdXJyS2JkSXRlbS5lcXVhbHModGhpcy5LQklfRE9XTikgfHwgdGhpcy5fY3VycktiZEl0ZW0uZXF1YWxzKHRoaXMuS0JJX1VQKSkge1xyXG4gICAgICAgIGlmIChjdHJsICE9PSBudWxsICYmIChjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0xJU1QgfHwgY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9SQURJTykpXHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudCh0YXNrLCBjdHJsKTtcclxuICAgICAgcnRFdnQuc2V0U3lzdGVtKHRoaXMuX2N1cnJLYmRJdGVtKTtcclxuICAgICAgcnRFdnQuc2V0RWRpdFBhcm1zKGV2dC5nZXRTdGFydFNlbGVjdGlvbigpLCBldnQuZ2V0RW5kU2VsZWN0aW9uKCksIGV2dC5nZXRWYWx1ZSgpKTtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUV2ZW50KHJ0RXZ0LCBmYWxzZSk7XHJcbiAgICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3N0b3BFeGVjdXRpb24pIHtcclxuICAgICAgICAgIGxldCByZXR1cm5Ub0N0cmw6IE1nQ29udHJvbCA9IE1nQ29udHJvbC5SZXR1cm5Ub0N0cmw7XHJcbiAgICAgICAgICBpZiAocmV0dXJuVG9DdHJsICE9PSBudWxsICYmIE1nQ29udHJvbC52YWxpZFJldHVyblRvQ3RybCgpKVxyXG4gICAgICAgICAgICByZXR1cm5Ub0N0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKS5zZXRMYXN0UGFya2VkQ3RybChyZXR1cm5Ub0N0cmwpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBsZXQgbWdkOiBNR0RhdGEgPSBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLmdldEN1cnJNR0RhdGEoKTtcclxuICAgICAgLy8gY2hlY2sgaWYgdGhlIE1HRGF0YSBpcyBzdGlsbCBhbGl2ZSBhZnRlciBoYW5kbGluZyB0aGUgZXZlbnRzIGFib3ZlXHJcbiAgICAgIGlmIChtZ2QgIT09IG51bGwgJiYgIW1nZC5Jc0Fib3J0aW5nKVxyXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRXhwcmVzc2lvbkhhbmRsZXJzKCk7XHJcbiAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKCdFbmQgaGFuZGxpbmcgS0VZRE9XTiBldmVudC4gS2V5IGNvZGU6ICcgKyBrZXlDb2RlKTtcclxuICAgICAgLy8gaWYgYSBrZXkgd2FzIHByZXNzZWQgb24gdGFibGUgY2hpbGQsIG1ha2Ugc3VyZSB0aGF0IGlzIGlzIHZpc2libGVcclxuICAgICAgaWYgKGN0cmwgIT09IG51bGwgJiYgY3RybC5Jc1JlcGVhdGFibGUgJiYgY3RybCA9PT0gTWdDb250cm9sLlJldHVyblRvQ3RybCkge1xyXG4gICAgICAgIGF3YWl0ICg8TWdGb3JtPmN0cmwuZ2V0Rm9ybSgpKS5icmluZ1JlY29yZFRvUGFnZSgpO1xyXG4gICAgICB9XHJcbiAgICB9IGZpbmFsbHkge1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PkhhbmRsZSBTZWxlY3Rpb24gRXZlbnQ8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsXCI+Y29udHJvbDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJsaW5lXCI+bGluZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ2YWx1ZVwiPnZhbHVlPC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIGhhbmRsZVNlbGVjdGlvbihjdHJsOiBNZ0NvbnRyb2wsIGxpbmU6IG51bWJlciwgdmFsOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmIChjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1RBQiB8fCBjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0NIRUNLQk9YIHx8IGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfUkFESU8gfHwgY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9DT01CTyB8fCBjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0xJU1QpIHtcclxuICAgICAgbGV0IGNoZWNrRm9jdXM6IGJvb2xlYW4gPSAoY3RybC5UeXBlICE9PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9UQUIgJiYgY3RybC5UeXBlICE9PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9DSEVDS0JPWCk7XHJcbiAgICAgIGxldCBhbGxvd1NlbGVjdGlvbjogYm9vbGVhbiA9IChjaGVja0ZvY3VzID8gKGN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRMYXN0UGFya2VkQ3RybCgpID09PSBjdHJsKSA6IHRydWUpO1xyXG5cclxuICAgICAgaWYgKCFhbGxvd1NlbGVjdGlvbiB8fCAhY3RybC5pc01vZGlmaWFibGUoKSB8fCAhYXdhaXQgY3RybC5Jc1BhcmthYmxlKCkpXHJcbiAgICAgICAgYXdhaXQgY3RybC5yZXN0b3JlT2xkVmFsdWUoKTtcclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgaWYgKGN0cmwuaXNDaG9pY2VDb250cm9sKCkpXHJcbiAgICAgICAgICBDb21tYW5kcy5zZXRHZXRTdWdnZXN0ZWRWYWx1ZU9mQ2hvaWNlQ29udHJvbE9uVGFnRGF0YShjdHJsLCBjdHJsLklzUmVwZWF0YWJsZSA/IGxpbmUgOiAwLCB0cnVlKTtcclxuXHJcbiAgICAgICAgaWYgKGN0cmwuaXNEaWZmZXJlbnRWYWx1ZSh2YWwsIGN0cmwuSXNOdWxsLCB0cnVlKSkge1xyXG4gICAgICAgICAgLy8gIzkzMTU0NSAtIHZhciBjaGFuZ2UgbXVzdCBiZSBpbnZva2VkIGZpcnN0IGJlZm9yZSBjb250cm9sIHZlcmlmaWNhdGlvbi5cclxuICAgICAgICAgIGN0cmwuTW9kaWZpZWRCeVVzZXIgPSB0cnVlO1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVDdHJsTW9kaWZ5KGN0cmwsIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9TRUxFQ1RJT04pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGN0cmwuaXNDaG9pY2VDb250cm9sKCkpXHJcbiAgICAgICAgICBDb21tYW5kcy5zZXRHZXRTdWdnZXN0ZWRWYWx1ZU9mQ2hvaWNlQ29udHJvbE9uVGFnRGF0YShjdHJsLCBjdHJsLklzUmVwZWF0YWJsZSA/IGxpbmUgOiAwLCBmYWxzZSk7XHJcblxyXG4gICAgICAgIC8vIEZvciBtdWx0aXBsZSBzZWxlY3Rpb24gTGlzdEJveCB2YWx1ZSB0byBmaWVsZCBhbmQgY3RybCB3b3VsZCBiZSBzZXQgb24gbGVhdmluZ1xyXG4gICAgICAgIC8vIGNvbnRyb2wsIGJlZm9yZSBleGVjdXRpbmcgY29udHJvbCBzdWZmaXguIFNvIHZhcmlhYmxlIGNoYW5nZSBpbnRlcm5hbCBldmVudCB3b3VsZCBiZVxyXG4gICAgICAgIC8vIGhhbmRsZWQgYmVmb3JlIGV4ZWN1dGluZyBjb250cm9sIHN1ZmZpeC5cclxuICAgICAgICBpZiAoIWN0cmwuSXNNdWx0aXBsZVNlbGVjdGlvbkxpc3RCb3goKSlcclxuICAgICAgICAgIGF3YWl0IGN0cmwudmFsaWRhdGVBbmRTZXRWYWx1ZSh2YWwsIHRydWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgSGFuZGxlIE1vdXNlIFVwIEV2ZW50XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj5jb250b2xcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImxpbmVcIj5saW5lIG9mIG11bHRpbGluZSBjb250cm9sXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwcm9kdWNlQ2xpY2tcIj5pZiB0cnVlLCBwcm9kdWNlIGNsaWNrIGV2ZW50XHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVNb3VzZVVwKGN0cmw6IE1nQ29udHJvbCwgbGluZTogbnVtYmVyLCBwcm9kdWNlQ2xpY2s6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmIChjdHJsID09PSBudWxsKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgLy8gUUNSICMgNjE0NCBzZWUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIF9jdXJyQ2xpY2tlZFJhZGlvIG1lbWJlclxyXG4gICAgaWYgKGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfUkFESU8pXHJcbiAgICAgIFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5DdXJyZW50Q2xpY2tlZFJhZGlvID0gY3RybDtcclxuICAgIHRyeSB7XHJcbiAgICAgIGlmIChjdHJsLlR5cGUgIT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1RBQkxFKSB7XHJcbiAgICAgICAgaWYgKCFhd2FpdCBjdHJsLmNoZWNrUHJvcFdpdGhMaW5lKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0VOQUJMRUQsIHRydWUsIGxpbmUpKSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBjYW5Hb3RvQ3RybDogYm9vbGVhbiA9IHRoaXMuY2FuR29Ub0NvbnRyb2woY3RybCwgdHJ1ZSk7XHJcbiAgICAgICAgbGV0IFN0b3BGb2N1czogYm9vbGVhbiA9IGN0cmwuaXNGb2N1c2VkU3RvcEV4ZWN1dGlvbigpO1xyXG5cclxuICAgICAgICBsZXQgcmV0dXJuVG9DdHJsOiBNZ0NvbnRyb2wgPSBNZ0NvbnRyb2wuUmV0dXJuVG9DdHJsO1xyXG5cclxuICAgICAgICBpZiAoKCFjYW5Hb3RvQ3RybCB8fCAoKHRoaXMuX3N0b3BFeGVjdXRpb24gfHwgU3RvcEZvY3VzKSAmJiByZXR1cm5Ub0N0cmwgIT09IGN0cmwpKSAmJiByZXR1cm5Ub0N0cmwgIT09IG51bGwpIHtcclxuICAgICAgICAgIE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuY3Vyck1nZElEID0gKDxUYXNrPnJldHVyblRvQ3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpKS5nZXRNZ2RJRCgpO1xyXG4gICAgICAgICAgaWYgKHJldHVyblRvQ3RybC5Jc1JlcGVhdGFibGUpXHJcbiAgICAgICAgICAgIGF3YWl0ICg8TWdGb3JtPnJldHVyblRvQ3RybC5nZXRGb3JtKCkpLmJyaW5nUmVjb3JkVG9QYWdlKCk7XHJcbiAgICAgICAgICBhd2FpdCBGb2N1c01hbmFnZXIuU2V0Rm9jdXMocmV0dXJuVG9DdHJsLCAtMSk7XHJcbiAgICAgICAgICByZXR1cm5Ub0N0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKS5zZXRMYXN0UGFya2VkQ3RybChyZXR1cm5Ub0N0cmwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5fc3RvcEV4ZWN1dGlvbiB8fCBTdG9wRm9jdXMpXHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChwcm9kdWNlQ2xpY2sgJiYgKGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQlVUVE9OIHx8IGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQ0hFQ0tCT1ggfHwgY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9MSVNUKSkge1xyXG4gICAgICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudChjdHJsKTtcclxuICAgICAgICBydEV2dC5zZXRJbnRlcm5hbChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfV0VCX0NMSUNLKTtcclxuICAgICAgICB0aGlzLmFkZFRvVGFpbChydEV2dCk7XHJcbiAgICAgIH1cclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5DdXJyZW50Q2xpY2tlZFJhZGlvID0gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gIENoZWNrIGlmIGN0eCBpcyByZW1vdmVkIGZyb20gc2VydmVyLCBpZiBzbyBhbmQgY3VycmVudCBldmVudCBpcyByb3V0ZSBldmVudCAsIHRoZW4gc2F2ZSBpdFxyXG4gIC8vICB0byBleGVjdXRlIGFnYWluIHdoZW4gIHNlcnZlciBjdHggaXMgcmVjcmVhdGVkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBjaGVja0FuZFNhdmVSb3V0ZUV2ZW50SWZDdHhSZW1vdmVkRnJvbVNydnIoYVJ0RXZ0OiBhbnkpOiB2b2lkIHtcclxuXHJcbiAgICBpZiAoYVJ0RXZ0LmdldFR5cGUoKSA9PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0lOVEVSTkFMICYmIGFSdEV2dC5nZXRJbnRlcm5hbENvZGUoKSA9PVxyXG4gICAgICBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfV0VCQ0xJRU5UX1JPVVRFICYmIFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5SZW1vdmVkQ29udGV4dEZyb21TZXJ2ZXIpIHtcclxuICAgICAgdGhpcy5zZXRMYXN0U2F2ZWRSb3V0ZUV2ZW50KGFSdEV2dCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgSGFuZGxlIEZvY3VzIEV2ZW50XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibGluZVwiPmxpbmUgb2YgbXVsdGlsaW5lIGNvbnRyb2w8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwib25DbGlja1wiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVGb2N1cyhjdHJsOiBNZ0NvbnRyb2wsIGxpbmU6IG51bWJlciwgb25DbGljazogYm9vbGVhbiwgc2hvdWxkSGFuZGxlWm9vbTogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdHJ5IHtcclxuXHJcbiAgICAgIGlmIChjdHJsLmlzU3RhdGljKCkpXHJcbiAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgLy8gSWYgd2UgYXR0ZW1wdCB0byBwYXJrIG9uIGNvbnRyb2wgd2hlcmUgd2UgZG8gbm90IHdhbnQgdG8gYWxsb3cgdG8gcGFyayBsaWtlIGlmIGNvbnRyb2wgaGFzIGV4cHJlc3Npb24gb3IgcGFyZW50IHRhc2sgZmllbGQsIGRvIG5vdCBhbGxvdyB0byBmb2N1cyBvbiBpdC5cclxuICAgICAgLy8gU2V0IEZvY3VzIGJhY2sgdG8gbGFzdEZvY3VzZWRDb250cm9sLiBXZSBuZWVkIF9sYXN0RmFpbGVkRm9jdXNlZENvbnRyb2wgYXMgd2UgZ2V0IGZvY3VzIGV2ZW50IG9uIGEgY29udHJvbCB0d2ljZS4gU28gdG8gYXZvaWQgdG8gc2hvdyBlcnJvciBtdWx0aXBsZSB0aW1lcyxcclxuICAgICAgLy8gbWFpbnRhaW4gX2xhc3RGYWlsZWRGb2N1c2VkQ29udHJvbC5cclxuICAgICAgaWYgKGN0cmwgIT09IHRoaXMuX2xhc3RGYWlsZWRGb2N1c2VkQ29udHJvbCAmJiBjdHJsLkhhc0V4cE9yUGFyZW50VGFza0ZpZWxkKCkpIHtcclxuICAgICAgICAvLyBTaG93IGVycm9yIG9ubHkgZm9yIGNvbnRyb2xzIGhhdmluZyBEYXRhIHByb3BlcnR5IGFuZCBwYXJrYWJsZVxyXG4gICAgICAgIGlmIChjdHJsLmlzTGlzdEJveCgpIHx8IGN0cmwuaXNDaGVja0JveCgpIHx8IGN0cmwuaXNDb21ib0JveCgpIHx8IGN0cmwuaXNUZXh0Q29udHJvbCgpIHx8IGN0cmwuaXNSYWRpbygpIHx8IGN0cmwuaXNUYWJDb250cm9sKCkpIHtcclxuICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUVycm9yVG9Mb2coTlN0cmluZy5Gb3JtYXQoJ0NvbnRyb2wgZWl0aGVyIGhhcyBleHByZXNzaW9uIG9yIGhhcyBwYXJlbnQgdGFzayB2YXJpYWJsZSBhdHRhY2hlZCB0byBpdC4gRmFpbGVkIHRvIHBhcmsgb24gY29udHJvbCB3aXRoIG5hbWU6IHswfScsIGN0cmwuTmFtZSkpO1xyXG4gICAgICAgICAgLy8gRGVmZWN0IDE1MjcyODogVXNlIGxhc3QgZm9jdXNlZCB0YXNrIGluc3RlYWQgY29udHJvbCB0YXNrIGFzIGNvbnRyb2wgY2FuIGJlIGZyb20gc3ViZm9ybS5cclxuICAgICAgICAgIEZvY3VzTWFuYWdlci5TZXRGb2N1cyhMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCksIExhc3RGb2N1c2VkTWFuYWdlci5nZXRMYXN0Rm9jdXNlZENvbnRyb2woKSwgMCxcclxuICAgICAgICAgICAgTGFzdEZvY3VzZWRNYW5hZ2VyLmdldExhc3RGb2N1c2VkQ29udHJvbCgpID09PSBudWxsID8gdHJ1ZSA6IGZhbHNlKTtcclxuICAgICAgICAgIHRoaXMuX2xhc3RGYWlsZWRGb2N1c2VkQ29udHJvbCA9IGN0cmw7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLl9sYXN0RmFpbGVkRm9jdXNlZENvbnRyb2wgPSBudWxsO1xyXG5cclxuICAgICAgaWYgKG9uQ2xpY2spXHJcbiAgICAgICAgUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLkN1cnJlbnRDbGlja2VkQ3RybCA9IGN0cmw7XHJcblxyXG4gICAgICBsZXQgcHJldkN0cmw6IE1nQ29udHJvbCA9IExhc3RGb2N1c2VkTWFuYWdlci5nZXRMYXN0Rm9jdXNlZENvbnRyb2woKTtcclxuICAgICAgaWYgKGN0cmwgPT09IHByZXZDdHJsICYmICFjdHJsLmlzUmVwZWF0YWJsZSgpKSB7XHJcbiAgICAgICAgYXdhaXQgKDxNZ0Zvcm0+Y3RybC5nZXRGb3JtKCkpLmJyaW5nUmVjb3JkVG9QYWdlKCk7XHJcbiAgICAgICAgLy8gd2UgcmVjZWl2ZWQgZm9jdXMgdHdpY2VcclxuICAgICAgICBhd2FpdCB0aGlzLkhhbmRsZVpvb21JZk5lZWRlZChjdHJsLCBsaW5lLCBzaG91bGRIYW5kbGVab29tKTtcclxuICAgICAgICBsZXQgcnRFdm50OiBSdW5UaW1lRXZlbnQgPSB0aGlzLmdldExhc3RSdEV2ZW50KCk7XHJcbiAgICAgICAgaWYgKHJ0RXZudCAhPSBudWxsICYmIHJ0RXZudC5TaG91bGRIYW5kbGVab29tKVxyXG4gICAgICAgICAgRm9jdXNNYW5hZ2VyLlNldEZvY3VzKGN0cmwsIC0xKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vY2hlY2sgaWYgbGFzdCB0YXNrIGlzIG9wZW5lZCBpbiBNb2RhbCBTdWJmb3JtLCBpZiB5ZXMsIGNsb3NlIGl0IGJlZm9yZSBmb2N1c3Npbmcgb24gcGFyZW50IHRhc2sncyBjdHJsXHJcbiAgICAgIGxldCBwcmV2VGFzazogVGFzayA9IDxUYXNrPkxhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKTtcclxuXHJcblxyXG4gICAgICBpZiAoY3RybCA9PT0gbnVsbCB8fCBjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1RBQkxFKSB7XHJcbiAgICAgICAgaWYgKHByZXZDdHJsID09PSBudWxsKVxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5IYW5kbGVOb25QYXJrYWJsZUNvbnRyb2xzKGN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgY3VyclRhc2s6IFRhc2s7XHJcbiAgICAgIGlmICgoY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9CVVRUT04pICYmICg8UmFpc2VBdD4oYXdhaXQgKGN0cmwuZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9SQUlTRV9BVCkpLmdldFZhbHVlSW50KCkpID09PSBSYWlzZUF0LlRhc2tJbkZvY3VzKSlcclxuICAgICAgICBjdXJyVGFzayA9IHByZXZUYXNrO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgY3VyclRhc2sgPSA8VGFzaz5jdHJsLmdldEZvcm0oKS5nZXRUYXNrKCk7XHJcblxyXG4gICAgICBsZXQgY2FuR290b0N0cmw6IGJvb2xlYW4gPSB0aGlzLmNhbkdvVG9Db250cm9sKGN0cmwsIG9uQ2xpY2spO1xyXG5cclxuICAgICAgLy8gR28gdG8gdGhlIGNvbnRyb2wgLSBpbnNlcnQgcHJlZml4XHJcbiAgICAgIGlmIChjYW5Hb3RvQ3RybCkge1xyXG4gICAgICAgIC8vIE1vZGFsIHN1YmZvcm0gdGFzayBjbG9zaW5nIGhhcyBhbHJlYWR5IGJlZ3VuLiBEbyBub3QgaGFuZGxlIEhhbmRsZVN1YmZvcm1Nb2RhbGl0eSgpIGFnYWluLlxyXG4gICAgICAgIGlmICh0aGlzLmd1aVBlbmRpbmdFdmVudCAhPSBudWxsKVxyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGxldCBoYW5kbGVkID0gYXdhaXQgdGhpcy5IYW5kbGVTdWJmb3JtTW9kYWxpdHkoY3RybCwgcHJldlRhc2ssIGN1cnJUYXNrKTtcclxuICAgICAgICBpZiAoaGFuZGxlZClcclxuICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgbGV0IGV2ZW50TGluZTogbnVtYmVyID0gKGN0cmwuaXNSZXBlYXRhYmxlKCkgfHwgY3RybC5pc1JhZGlvKCkpID8gbGluZSA6IEludDMyLk1pblZhbHVlO1xyXG4gICAgICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudChjdHJsLCBldmVudExpbmUpO1xyXG4gICAgICAgIHJ0RXZ0LnNldEludGVybmFsKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1BSRUZJWCk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVFdmVudChydEV2dCwgZmFsc2UpO1xyXG4gICAgICB9IGVsc2UgaWYgKHByZXZDdHJsICE9PSBudWxsKSB7XHJcbiAgICAgICAgaWYgKCFwcmV2Q3RybC5pc01vZGlmaWFibGUoKSkge1xyXG4gICAgICAgICAgaWYgKHByZXZDdHJsLmlzQ2hvaWNlQ29udHJvbCgpKVxyXG4gICAgICAgICAgICBhd2FpdCBwcmV2Q3RybC5yZXN0b3JlT2xkVmFsdWUoKTtcclxuICAgICAgICB9IGVsc2UgaWYgKCFjdXJyVGFzay5jYW5jZWxXYXNSYWlzZWQoKSkge1xyXG4gICAgICAgICAgbGV0IG5ld1ZhbDogc3RyaW5nID0gTWFuYWdlci5HZXRDdHJsVmFsKHByZXZDdHJsKTtcclxuICAgICAgICAgIGlmICghYXdhaXQgcHJldkN0cmwudmFsaWRhdGVBbmRTZXRWYWx1ZShuZXdWYWwsIHRydWUpKVxyXG4gICAgICAgICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb24odHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIE1nQ29udHJvbC5SZXR1cm5Ub0N0cmwgPSBwcmV2Q3RybDtcclxuICAgICAgfSBlbHNlXHJcbiAgICAgICAgYXdhaXQgdGhpcy5IYW5kbGVOb25QYXJrYWJsZUNvbnRyb2xzKGN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKSk7XHJcblxyXG4gICAgICBpZiAoIXRoaXMuX3N0b3BFeGVjdXRpb24gJiYgTWdDb250cm9sLlJldHVyblRvQ3RybCA9PT0gY3RybCl7XHJcbiAgICAgICAgTGFzdEZvY3VzZWRNYW5hZ2VyLnNldExhc3RGb2N1c2VkQ29udHJvbCg8VGFza0Jhc2U+Y3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpLCBjdHJsKTtcclxuICAgICAgICBhd2FpdCB0aGlzLkhhbmRsZVpvb21JZk5lZWRlZChjdHJsLCBsaW5lLCBzaG91bGRIYW5kbGVab29tKTtcclxuICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICByZXR1cm47XHJcbiAgICB9IGZpbmFsbHkge1xyXG4gICAgICBjdHJsLnNldEZvY3VzZWRTdG9wRXhlY3V0aW9uKHRoaXMuX3N0b3BFeGVjdXRpb24pO1xyXG4gICAgICBpZiAodGhpcy5fc3RvcEV4ZWN1dGlvbikge1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIGxldCByZXR1cm5Ub0N0cmw6IE1nQ29udHJvbCA9IE1nQ29udHJvbC5SZXR1cm5Ub0N0cmw7XHJcblxyXG4gICAgICAgICAgaWYgKHJldHVyblRvQ3RybCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLmN1cnJNZ2RJRCA9ICg8VGFzaz5yZXR1cm5Ub0N0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKSkuZ2V0TWdkSUQoKTtcclxuICAgICAgICAgICAgYXdhaXQgRm9jdXNNYW5hZ2VyLlNldEZvY3VzKHJldHVyblRvQ3RybCwgLTEpO1xyXG4gICAgICAgICAgICByZXR1cm5Ub0N0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKS5zZXRMYXN0UGFya2VkQ3RybChyZXR1cm5Ub0N0cmwpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgSGFuZGxlIHN1YmZvcm0gbW9kYWxpdHkgYmVmb3IgZm91Y3NzaW5nIG9uIHBhcmVudCBjdHJsXHJcbiAgLy8vIDEuaWYgY3Vyc29yIGlzIHBhcmtlZCBvbiBtb2RhbCBzdWJmb3JtIHRhc2sgYW5kIHVzZXIgY2xpY2tzIG9uIGl0J3MgcGFyZW50IDogY2xvc2UgdGhlIHN1YmZvcm0gdGFzay5cclxuICAvLy8gMi5pZiBjdXJzb3IgaXMgcGFya2VkIG9uIG1vZGFsIHN1YmZvcm0gJ1MyJyB3aGljaCBpcyBvcGVuZWQgaW4gYW5vdGhlciBzdWJmb3JtIG1vZGFsICdTMScsIHRoZW4gY2xpY2tpbmcgb24gIHBhcmVudCdQMSdcclxuICAvLy8gd2lsbCBjbG9zZSBib3RoIFMyIGFuZCBTMS5cclxuICAvLy8gMy5pZiBjdXJzb3IgaXMgcGFya2VkIG9uIG5vbiBtb2RhbCBzdWJmb3JtICdTMicgd2hpY2ggaXMgb3BlbmVkIGluIHN1YmZvcm0gbW9kYWwgJ1MxJywgdGhlbiBjbGlja2luZyBvbiBTMSwgd2lsbCBub3QgY2xvc2UgUzJcclxuICAvLy8gYnV0IGNsaWNraW5nIG9uIFAxIHdpbGwgY2xvc2UgYm90aCBTMiBhbmQgUzEuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj5jdHJsIHRvIGJlIGZvY3Vzc2VkPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInByZXZUYXNrXCI+cHJldmlvdXMgdGFzayB3aGljaCB3YXMgaW4gZm9jdXM8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3VyclRhc2tcIj5jdXJyZW50IHRhc2sgd2hpY2ggaXMgdG8gYmUgZm9jdXNzZWQ8L3BhcmFtPlxyXG5cclxuICBwcml2YXRlIGFzeW5jIEhhbmRsZVN1YmZvcm1Nb2RhbGl0eShjdHJsOiBNZ0NvbnRyb2wsIHByZXZUYXNrOiBUYXNrLCBjdXJyVGFzazogVGFzayk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IGhhbmRsZWRTdWJmb3JtTW9kYWxpdHkgPSBmYWxzZTtcclxuXHJcbiAgICAvLyBldmFsdWF0ZSB0aGUgY29ycmVjdCBwcmV2VGFzayB0byBiZSBjbG9zZWQgaWYgaXQgaXMgTW9kYWwuXHJcbiAgICAvLyBpZiBuZXdseSBzdWJmb3JtIE1vZGFsIHRhc2sgaXMgb3BlbmVkIGFuZCBpdCBpcyBub3QgeWV0IGZvY3Vzc2VkLCBpbiB0aGF0IGNhc2UgY3VyciB0YXNrIGlzIHNhbWUgYXMgcHJldnRhc2suXHJcbiAgICAvLyBub3cgY2xpY2tpbmcgb24gaXQncyBwYXJlbnQgdGFzaywgc2hvdWxkIGNsb3NlIHRoZSBNb2RhbCBzdWJmb3JtIHRhc2tcclxuICAgIGxldCBsZW5ndGggPSBwcmV2VGFzay5nZXRNR0RhdGEoKS5nZXRUYXNrc0NvdW50KCk7XHJcbiAgICBsZXQgdG9wVGFzazogVGFzayA9IHByZXZUYXNrLmdldE1HRGF0YSgpLmdldFRhc2sobGVuZ3RoIC0gMSk7XHJcbiAgICBpZiAoY3VyclRhc2sgPT0gcHJldlRhc2sgfHwgcHJldlRhc2sgIT0gdG9wVGFzayAvKiBuZXN0ZWQgc3ViZm9ybSAqLykge1xyXG4gICAgICBpZiAodG9wVGFzayAhPSBudWxsICYmIHByZXZUYXNrICE9IHRvcFRhc2sgJiYgdG9wVGFzay5Jc1N1YkZvcm0pIHtcclxuICAgICAgICBsZXQgc3ViZm9ybUN0cmw6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+dG9wVGFzay5nZXRGb3JtKCkuZ2V0U3ViRm9ybUN0cmwoKTtcclxuICAgICAgICBpZiAoc3ViZm9ybUN0cmwuSXNNb2RhbCgpKVxyXG4gICAgICAgICAgcHJldlRhc2sgPSB0b3BUYXNrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gY2xvc2Ugc3ViZm9ybSB0YXNrIGlzIE1vZGFsIGlmIHRvIGJlIHBhcmtlZCBvbiBwYXJlbnQuXHJcbiAgICBpZiAocHJldlRhc2sgIT0gPFRhc2s+Y3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpICYmIHByZXZUYXNrLmdldElzRGVzdGluYXRpb25DYWxsKCkpIHtcclxuXHJcbiAgICAgIGlmICghY3VyclRhc2suaXNEZXNjZW5kZW50T2YocHJldlRhc2spKSB7XHJcbiAgICAgICAgbGV0IHN1YmZvcm1DdHJsOiBNZ0NvbnRyb2wgPSA8TWdDb250cm9sPnByZXZUYXNrLmdldEZvcm0oKS5nZXRTdWJGb3JtQ3RybCgpO1xyXG4gICAgICAgIGlmICghc3ViZm9ybUN0cmwuSXNNb2RhbCgpICYmICFjdXJyVGFzay5nZXRJc0Rlc3RpbmF0aW9uQ2FsbCgpKVxyXG4gICAgICAgICAgc3ViZm9ybUN0cmwgPSBwcmV2VGFzay5HZXRTdWJmb3JtTW9kYWxQYXJlbnRUYXNrKCk7XHJcbiAgICAgICAgaWYgKHN1YmZvcm1DdHJsICE9IG51bGwgJiYgKGN0cmwgIT0gc3ViZm9ybUN0cmwpICYmIHN1YmZvcm1DdHJsLklzTW9kYWwoKSkge1xyXG5cclxuICAgICAgICAgIGF3YWl0IHRoaXMucGVyZm9ybVN1YmZvcm1DbG9zZSg8TWdDb250cm9sPnN1YmZvcm1DdHJsKTtcclxuICAgICAgICAgIGlmICghdGhpcy5fc3RvcEV4ZWN1dGlvbilcclxuICAgICAgICAgICAgdGhpcy5ndWlQZW5kaW5nRXZlbnQgPSB0aGlzLmdldExhc3RSdEV2ZW50KCk7XHJcbiAgICAgICAgICBoYW5kbGVkU3ViZm9ybU1vZGFsaXR5ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaGFuZGxlZFN1YmZvcm1Nb2RhbGl0eTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gIENhbGxzIENvbnRyb2xzIFN1ZmZpeCB3aGVuIGZvY3VzIG9uIE5vbiBtYWdpYyBjb250cm9sIGkuZS4gY29udHJvbCB3aXRoIE1hZ2ljRHVtbXlDb250cm9sIGlzIHJlY2VpdmVkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj5jb250cm9sPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlRm9jdXNPbk5vbk1hZ2ljQ29udHJvbChjdHJsOiBNZ0NvbnRyb2wpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGF3YWl0IEV2ZW50c01hbmFnZXIuSW5zdGFuY2UuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhNZ0NvbnRyb2xCYXNlKGN0cmwsIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1NVRkZJWCk7XHJcbiAgICB9IGZpbmFsbHkge1xyXG4gICAgICBjdHJsLnNldEZvY3VzZWRTdG9wRXhlY3V0aW9uKHRoaXMuX3N0b3BFeGVjdXRpb24pO1xyXG4gICAgICBpZiAodGhpcy5fc3RvcEV4ZWN1dGlvbikge1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIGxldCByZXR1cm5Ub0N0cmw6IE1nQ29udHJvbCA9IE1nQ29udHJvbC5SZXR1cm5Ub0N0cmw7XHJcblxyXG4gICAgICAgICAgaWYgKHJldHVyblRvQ3RybCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLmN1cnJNZ2RJRCA9ICg8VGFzaz5yZXR1cm5Ub0N0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKSkuZ2V0TWdkSUQoKTtcclxuICAgICAgICAgICAgYXdhaXQgRm9jdXNNYW5hZ2VyLlNldEZvY3VzKHJldHVyblRvQ3RybCwgLTEpO1xyXG4gICAgICAgICAgICByZXR1cm5Ub0N0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKS5zZXRMYXN0UGFya2VkQ3RybChyZXR1cm5Ub0N0cmwpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyByYWlzZSB0aGUgem9vbSBldmVudCBmb3IgdGhlIGNvbnRyb2wsIGlmIHJlcXVpcmVkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdHJsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsaW5lXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzaG91bGRIYW5kbGVab29tXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIEhhbmRsZVpvb21JZk5lZWRlZChjdHJsOiBNZ0NvbnRyb2wsIGxpbmU6IG51bWJlciwgc2hvdWxkSGFuZGxlWm9vbTogYm9vbGVhbik6IFByb21pc2UgPHZvaWQ+e1xyXG4gICAgICBpZiAoc2hvdWxkSGFuZGxlWm9vbSlcclxuICAgICAge1xyXG4gICAgICAgIHZhciBydEV2dCA9IG5ldyBSdW5UaW1lRXZlbnQoY3RybCwgbGluZSwgdHJ1ZSk7XHJcbiAgICAgICAgcnRFdnQuc2V0SW50ZXJuYWwoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1pPT00pO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRXZlbnQocnRFdnQsIGZhbHNlKTtcclxuICAgICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiB3ZSBjYW4gZ28gdG8gdGhlIGNvbnRyb2wgYW5kIHRyeSB0byBwYXJrIG9uIGluXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj5jb250cm9sPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImxpbmVcIj5saW5lPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm9uQ2xpY2tcIj5yZWFsIGNsaWNrIGlzIHBlcmZvcm1lZCwgdGhpcyBub3QgY2xpY2sgc2ltdWxhdGlvbjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIGNhbkdvVG9Db250cm9sKGN0cmw6IE1nQ29udHJvbCwgb25DbGljazogYm9vbGVhbik6IGJvb2xlYW4ge1xyXG5cclxuICAgIGlmIChvbkNsaWNrICYmIChjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1NVQkZPUk0gfHwgY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9CUk9XU0VSKSlcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIC8vIFY5LjRTUDRkIGNoYW5nZSBvZiBiZWhhdmlvciAtIHdlIGRvIG5vdCBcImV4aXRcIiBmcm9tIHRoZSBjdXJyZW50IGN0cmxcclxuICAgIC8vIChpLmUuIG5vdCBwZXJmb3JtaW5nIGN0cmwgc3VmZml4IG9yIGN0cmwgdmVyaWZpY2F0aW9ucykgaWYgdGhlIHRhcmdldCBjdHJsXHJcbiAgICAvLyBpcyBJTUcgb3IgaHlwZXJ0ZXh0LlxyXG4gICAgbGV0IGNhbkdvdG9DdHJsOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIGxldCBjdXJyVGFzazogVGFzayA9IDxUYXNrPmN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKTtcclxuICAgIC8vIGlmIGNhbmNlbCBpcyByYWlzZWQgLCB0aGVuIGRvIG5vdCBnbyB0byBuZXh0IGNvbnRyb2wgYmVmb3JlIGhhbmRsaW5nIGNhbmNlbCBldmVudC5cclxuICAgIGxldCBsYXN0VGFzazogVGFzayA9IExhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKTtcclxuICAgIGlmICghY3VyclRhc2suSXNJbnRlcmFjdGl2ZSB8fCAobGFzdFRhc2sgIT0gbnVsbCAmJiBsYXN0VGFzay5nZXRMYXN0UGFya2VkQ3RybCgpICE9IG51bGwgJiZcclxuICAgICAgbGFzdFRhc2suY2FuY2VsV2FzUmFpc2VkKCkpKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgaWYgKGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfSU1BR0UgJiYgIWN0cmwuSXNSZXBlYXRhYmxlKVxyXG4gICAgICBjYW5Hb3RvQ3RybCA9IGZhbHNlO1xyXG5cclxuICAgIHJldHVybiBjYW5Hb3RvQ3RybDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBIYW5kbGUgVGltZXIgRXZlbnRzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImV2dFwiPnR1bnRpbWUgdGltZXIgZXZlbnQ8L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlVGltZXIoZXZ0OiBSdW5UaW1lRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGV2dC5zZXRUeXBlKENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfVElNRVIpO1xyXG4gICAgaWYgKGV2dC5pc0lkbGVUaW1lcigpKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRXhwcmVzc2lvbkhhbmRsZXJzKCk7XHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlQ29udGV4dEluYWN0aXZpdHlBbGVydChldnQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGV0IG1nZDogTUdEYXRhID0gTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5nZXRNR0RhdGEoZXZ0LmdldE1nZElEKCkpO1xyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUV2ZW50cyhtZ2QuZ2V0VGltZXJIYW5kbGVycygpLCBldnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBXaGVuIHRoZSBjb250ZXh0IGluYWN0aXZpdHkgdGltZW91dCBpcyBhYm91dCB0byBleHBpcmUsIHJhaXNlIGEgd2FybmluZyB0byB1c2VyXHJcbiAgLy8gICAgc28gdGhhdCB0aGUgc2Vzc2lvbiBjYW4gYmUgY29udGludWVkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImV2dFwiPnR1bnRpbWUgdGltZXIgZXZlbnQ8L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlQ29udGV4dEluYWN0aXZpdHlBbGVydChldnQ6IFJ1blRpbWVFdmVudCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHRpbWVOb3c6IG51bWJlciA9IE1pc2MuZ2V0U3lzdGVtTWlsbGlzZWNvbmRzKCk7XHJcbiAgICBsZXQgbWdkOiBNR0RhdGEgPSBldnQuZ2V0VGFzaygpLmdldE1HRGF0YSgpO1xyXG4gICAgbGV0IGxhc3RSZXF1ZXN0VGltZTogbnVtYmVyID0gUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuR2V0SW5zdGFuY2UoKS5HZXRMYXN0UmVxdWVzdFRpbWU7XHJcbiAgICBsZXQgY29udGV4dEluYWN0aXZpdHlUaW1lb3V0OiBudW1iZXIgPSBFbnZpcm9ubWVudC5JbnN0YW5jZS5nZXRDb250ZXh0SW5hY3Rpdml0eVRpbWVvdXQoKSAvIDEwO1xyXG4gICAgbGV0IGNvbnRleHRJbmFjdGl2aXR5V2FybmluZ1RpbWU6IG51bWJlciA9IEVudmlyb25tZW50Lkluc3RhbmNlLmdldENvbnRleHRJbmFjdGl2aXR5V2FybmluZ1RpbWUoKSAvIDEwO1xyXG5cclxuICAgIGxldCBpZGxlVGltZSA9ICh0aW1lTm93IC0gbGFzdFJlcXVlc3RUaW1lKSAvIDEwMDA7XHJcblxyXG4gICAgLy8gRGlzcGxheSB0aGUgY29uZmlybWF0aW9uIG9ubHkgZm9yIHZhbGlkIHRpbWVvdXRzXHJcbiAgICBpZiAoY29udGV4dEluYWN0aXZpdHlUaW1lb3V0ID09IDAgfHwgY29udGV4dEluYWN0aXZpdHlXYXJuaW5nVGltZSA9PSAwKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgaWYgKEV2ZW50c01hbmFnZXIudXNlckdyYW50ZWRGb3JDb250ZXh0QWN0aXZpdHkgJiYgaWRsZVRpbWUgPj0gKGNvbnRleHRJbmFjdGl2aXR5VGltZW91dCAtIGNvbnRleHRJbmFjdGl2aXR5V2FybmluZ1RpbWUpKSB7XHJcbiAgICAgIC8vIHJhaXNlIGFuIGFsZXJ0IHRvIG5vdGlmeSB1c2VyIHdoZW4gdGhlIGNvbnRleHQgaXMgYWJvdXQgdG8gYmUgdGVybWluYXRlZFxyXG4gICAgICAvLyBpZiB1c2VyIGNsaWNrcyBvbiBPSywgc2VuZCBkdW1teSByZXF1ZXN0IHRvIHNlcnZlci4gSWYgQ2FuY2VsIGlzIGNsaWNrZWQsIGRvIG5vdGhpbmcuXHJcbiAgICAgIGxldCB1c2VyQ29uZmlybWF0aW9uOiBudW1iZXIgPSBhd2FpdCBHVUlNYW5hZ2VyLkluc3RhbmNlLk1lc3NhZ2VCb3godGhpcy5jb25maXJtYXRpb25EaWFsb2dUaXRsZSwgdGhpcy5jb25maXJtYXRpb25EaWFsb2dNc2csIFN0eWxlcy5NU0dCT1hfQlVUVE9OX1lFU19OTyk7XHJcbiAgICAgIGlmICh1c2VyQ29uZmlybWF0aW9uID09IFN0eWxlcy5NU0dCT1hfUkVTVUxUX1lFUykge1xyXG4gICAgICAgIC8vIHNlbmQgcmVxdWVzdCB0byBzZXJ2ZXIgdG8gbWFyayB0aGUgY29udGV4dCBpbmFjdGl2aXR5IHRpbWVvdXQgdG8gemVyb1xyXG4gICAgICAgIGxldCBjbWQ6IElDbGllbnRDb21tYW5kID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlQ29udGV4dFRpbWVvdXRSZXNldEV2ZW50Q29tbWFuZCgpO1xyXG4gICAgICAgIG1nZC5DbWRzVG9TZXJ2ZXIuQWRkKGNtZCk7XHJcbiAgICAgICAgYXdhaXQgUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuR2V0SW5zdGFuY2UoKS5FeGVjdXRlKENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZW5kaW5nSW5zdHJ1Y3Rpb24uT05MWV9DT01NQU5EUyk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgRXZlbnRzTWFuYWdlci51c2VyR3JhbnRlZEZvckNvbnRleHRBY3Rpdml0eSA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcHJvY2VzcyBleHByZXNzaW9uIGhhbmRsZXJzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyBoYW5kbGVFeHByZXNzaW9uSGFuZGxlcnMoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQoTGFzdEZvY3VzZWRNYW5hZ2VyLkluc3RhbmNlLmdldExhc3RGb2N1c2VkVGFzaygpLCBMYXN0Rm9jdXNlZE1hbmFnZXIuZ2V0TGFzdEZvY3VzZWRDb250cm9sKCkpO1xyXG4gICAgcnRFdnQuc2V0RXhwcmVzc2lvbihudWxsKTtcclxuICAgIHJ0RXZ0LnNldE1haW5QcmdDcmVhdG9yKHJ0RXZ0LmdldFRhc2soKSk7XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5nZXRTaXplKCk7IGkrKykge1xyXG4gICAgICBsZXQgbWdkOiBNR0RhdGEgPSBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLmdldE1HRGF0YShpKTtcclxuICAgICAgaWYgKG1nZCAhPT0gbnVsbCAmJiAhbWdkLklzQWJvcnRpbmcpXHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVFdmVudHMobWdkLmdldEV4cEhhbmRsZXJzKCksIHJ0RXZ0KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXNpemUgb2YgcGFnZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsXCI+dGFibGU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicm93c0luUGFnZVwiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBoYW5kbGVSZXNpemUoY3RybDogTWdDb250cm9sLCByb3dzSW5QYWdlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgICg8TWdGb3JtPmN0cmwuZ2V0Rm9ybSgpKS5zZXRSb3dzSW5QYWdlKHJvd3NJblBhZ2UpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCBkYXRhIGZvciBSb3dcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPlxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic2VuZEFsbFwiPmlmIHRydWUsIHNlbmQgYWxsIHJlY29yZHNcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJvd1wiPlxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlUm93RGF0YUN1clBhZ2UodGFibGU6IE1nQ29udHJvbCwgZGVzaXJlZFRvcEluZGV4OiBudW1iZXIsIHNlbmRBbGw6IGJvb2xlYW4sIGxhc3RGb2N1c2VkVmFsOiBMYXN0Rm9jdXNlZFZhbCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGZvcm06IE1nRm9ybSA9IDxNZ0Zvcm0+dGFibGUuZ2V0Rm9ybSgpO1xyXG4gICAgYXdhaXQgZm9ybS5zZXRSb3dEYXRhKGRlc2lyZWRUb3BJbmRleCwgc2VuZEFsbCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdHJhbnNmZXJzIGRhdGEgdG8gR1VJIHRocmVhZCBpbiBmcmVlIHdvcmtlciB0aHJlYWQgdGltZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIGhhbmRsZVRyYW5zZmVyRGF0YVRvR3VpKGN0cmw6IE1nQ29udHJvbCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGZvcm06IE1nRm9ybSA9IDxNZ0Zvcm0+Y3RybC5nZXRGb3JtKCk7XHJcbiAgICBhd2FpdCBmb3JtLnRyYW5zZmVyRGF0YVRvR3VpKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgRmV0Y2hlcyB0aGUgY2h1bmsgZnJvbSBzZXJ2ZXIsXHJcbiAgLy8vICAgSWYgdGhlIGxhc3QgcmVjb3JkcyBpcyBub3QgeWV0IGZldGNoZWQgaXQgZmV0Y2hlcyB0aGUgbmV4dCBjaHVuayxcclxuICAvLy8gICBFbHNlLCBmZXRjaGVzIHRoZSBwcmV2aW91cyBjaHVua1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBhc3luYyBmZXRjaFJlY29yZHNBaGVhZEZyb21TZXJ2ZXIoY3RybDogTWdDb250cm9sKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgZm9ybTogTWdGb3JtID0gPE1nRm9ybT5jdHJsLmdldEZvcm0oKTtcclxuICAgIGF3YWl0IGZvcm0uRmV0Y2hSZWNvcmRzQWhlYWRGcm9tU2VydmVyKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgV2hlbiBpbnRlcm5hbCBhY3QgYXNrcyBmb3IgZW5hYmxlL2Rpc2FibGUgb2YgYW4gYWN0IGxpc3QuXHJcbiAgLy8vICAgY2FsbCBlbmFibGVMaXN0IHdpdGggb25seUlmQ2hhbmdlZCA9IHRydWUgdG8gbWluaW1pemUgY2FsbHMgdG9zIHJlZnJlc2guXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImVuYWJsZVwiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBoYW5kbGVFbmFibGVFdmVudHMoZXZ0OiBSdW5UaW1lRXZlbnQsIGVuYWJsZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgZXZ0LmdldFRhc2soKS5BY3Rpb25NYW5hZ2VyLmVuYWJsZUxpc3QoZXZ0LmdldEFjdEVuYWJsZUxpc3QoKSwgZW5hYmxlLCB0cnVlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBIYW5kbGVzIGNvbnRyb2wgUHJlZml4XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImV2dFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIGFzeW5jIGhhbmRsZUN0cmxQcmVmaXgoZXZ0OiBSdW5UaW1lRXZlbnQpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCB0YXNrOiBUYXNrID0gPFRhc2s+ZXZ0LmdldFRhc2soKTtcclxuICAgIGxldCBjdXJyQ2xpY2tlZEN0cmw6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+UnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLkN1cnJlbnRDbGlja2VkQ3RybDtcclxuICAgIGxldCBmb3JtOiBNZ0Zvcm0gPSA8TWdGb3JtPnRhc2suZ2V0Rm9ybSgpO1xyXG4gICAgbGV0IGRpc3BsYXlMaW5lOiBudW1iZXIgPSBldnQuZ2V0RGlzcGxheUxpbmUoKTtcclxuICAgIGxldCBjdHJsOiBNZ0NvbnRyb2wgPSA8TWdDb250cm9sPmV2dC5Db250cm9sO1xyXG5cclxuICAgIGlmIChmb3JtLmlzTGluZU1vZGUoKSkge1xyXG4gICAgICBpZiAoZGlzcGxheUxpbmUgPT09IEludDMyLk1pblZhbHVlIHx8IGN0cmwuaXNSYWRpbygpKVxyXG4gICAgICAgIGRpc3BsYXlMaW5lID0gZm9ybS5EaXNwbGF5TGluZTtcclxuICAgIH0gZWxzZVxyXG4gICAgICBkaXNwbGF5TGluZSA9IEludDMyLk1pblZhbHVlO1xyXG5cclxuICAgIGxldCBsYXN0UGFya2VkQ3RybDogTWdDb250cm9sID0gTGFzdEZvY3VzZWRNYW5hZ2VyLmdldExhc3RGb2N1c2VkQ29udHJvbCgpO1xyXG5cclxuICAgIC8vIHByZXZlbnQgZG91YmxlIHByZWZpeCBvbiB0aGUgc2FtZSBjb250cm9sXHJcbiAgICAvLyBGb3IgRmFzdCBNb2RlLCBDUyBpcyBleGVjdXRlZCBmcm9tIGhlcmUsIHdoZXJlYXMgZm9yIHN0ZXAgbW9kZSBpdCBpcyBkb25lXHJcbiAgICAvLyBpbiBtb3ZlSW5Sb3cuIHNvLCBmb3Igc3RlcCBtb2RlIGRvdWJsZSBleGVjdXRpb24gb2YgQ1MgbXVzdCBiZSBzdG9wcGVkLlxyXG4gICAgaWYgKGxhc3RQYXJrZWRDdHJsICE9PSBudWxsICYmICg8VGFzaz5sYXN0UGFya2VkQ3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpKS5nZXRNR0RhdGEoKS5HZXRJZCgpID09PSAoPFRhc2s+Y3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpKS5nZXRNR0RhdGEoKS5HZXRJZCgpICYmIGxhc3RQYXJrZWRDdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0TGV2ZWwoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfQ09OVFJPTCkge1xyXG4gICAgICBpZiAoKGN0cmwgIT09IGxhc3RQYXJrZWRDdHJsIHx8IChjdHJsLmlzUmVwZWF0YWJsZSgpICYmIGRpc3BsYXlMaW5lICE9PSBjdHJsLmdldERpc3BsYXlMaW5lKHRydWUpKSkgJiYgIWxhc3RQYXJrZWRDdHJsLmlzSW5Db250cm9sU3VmZml4KCkpXHJcbiAgICAgIC8vIFFDUiAjOTcwODA2XHJcbiAgICAgIHtcclxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoTWdDb250cm9sQmFzZShsYXN0UGFya2VkQ3RybCwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfU1VGRklYKTtcclxuICAgICAgICBpZiAodGhpcy5fc3RvcEV4ZWN1dGlvbikge1xyXG4gICAgICAgICAgaWYgKGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfTElTVCB8fCBjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1JBRElPIHx8IGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQ0hFQ0tCT1ggfHwgY3RybC5pc1RhYkNvbnRyb2woKSkge1xyXG4gICAgICAgICAgICBjdHJsLnJlc2V0UHJldlZhbCgpO1xyXG4gICAgICAgICAgICBhd2FpdCBjdHJsLlJlZnJlc2hEaXNwbGF5KCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvLyBUT0RPOiBGb2N1cyAmIFRhYmJpbmc6IEhhbmRsZSBQYXJraW5nIGluIHRoaXMgY2FzZS4gU2hvdWxkIG5vdCByZXR1cm4gZmFsc2UgaW4gc2NyZWVuIG1vZGVcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGlmICh0YXNrLkluQ3RybFByZWZpeClcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIHRhc2suSW5DdHJsUHJlZml4ID0gdHJ1ZTtcclxuXHJcbiAgICAvLyBtYWtlIHN1cmUgaXQgaGFzIG5vdCBjb21lIGFnYWluIHRocm91Z2ggbW92ZWlucm93LlxyXG4gICAgLy8gZWc6IGlmIGNsaWNrZWQgY3RybCBvbiBzdWJmb3JtIGlzIG5vbiBwYXJrYWJsZSwgZmlyc3QgdGltZSBpdCBleGVjdXRlcyBSUCBDViBmb3Igc3ViZm9ybXMgYW5kIHRoZW5cclxuICAgIC8vIGVudGVycyBtb3ZlaW5yb3cgZm9yIHBhcmthYmxlIGN0cmwuIHdlIHNob3VsZG5vdCBleGVjdXRlIHRoaXMgYmxvY2sgd2hlbiB3ZSBjb21lIGZvciBDUCBvZiBwYXJrYWJsZSBjdHJsLlxyXG4gICAgLy8gRm9yIHRhYiwgd2UgY29tZSBoZXJlIGRpcmVjdGx5IGZvciBwYXJrYWJsZSBjdHJsLCBhbmQgdGhpcyBibG9jayBtdXN0IGFsd2F5cyBleGVjdXRlIGlmIG9uIGRpZmYgZm9ybXMuXHJcbiAgICAvLyBpc1NvcnQgOiBpZiBjbGlja2VkIG9uIHRhYmxlIGhlYWRlciwgd2UgcGFyayBvbiBjb2xvbW4gY3RybCBhZnRlciBzb3J0LCBhbmQgd2UgbXVzdCBpbmNsdWRlIHN1YmZvcm1zXHJcbiAgICAvLyBpbiBleGVjdXRpbmcgQ1ZzXHJcblxyXG4gICAgLy8gVE9ETzogVGFiYmluZyAmIEZvY3VzaW5nOiBDaGVjayBnZXRMYXN0TW92ZUluUm93RGlyZWN0aW9uIGlzIHJlbGV2YW50LiBXaGlsZSBtb3ZpbmcgYmV0d2VlbiBjb250cm9scyBieSBUYWIgY29kZSBpbiBpZiBibG9jayB3YXMgbm90IGNhbGxlZC5cclxuICAgIC8vIEJ1dCBpdCB3YXMgY2FsbGVkIG9uIGNsaWNrIHRvIGFub3RoZXIgY29udHJvbC5cclxuICAgIC8vaWYgKHRhc2suZ2V0TGFzdE1vdmVJblJvd0RpcmVjdGlvbigpID09PSBDb25zdGFudHMuTU9WRV9ESVJFQ1RJT05fTk9ORSB8fCB0aGlzLl9pc1NvcnRpbmcpIHtcclxuXHJcbiAgICAvLyBJZiB0aGUgY3VycmVudCBjdHJsIGlzIG9uIGEgc3ViZm9ybSwgdGhlbiBleGVjdXRlIGluIHNlcXVlbmNlXHJcbiAgICAvLyAxLiBSUyBvZiBuZXN0ZWQgc3ViZm9ybXMgdW50aWwgc3ViZm9ybSB0YXNrIGNvbnRhaW5nIHRoZXNlIDIgc3ViZm9ybXMuIHdlIG11c3QgYWxzbyBleGVjdXRlIFJTIGlmIGNsaWNrZWRcclxuICAgIC8vICAgIGluIHN1YmZvcm0gYW5kIHBhcmtlZCBiYWNrIG9uIGEgY3RybCdzIHRhc2suICgjNzIyMTE1LSBjdXJyQ2xpY2tlZEN0cmwgYW5kIGN0cmwgc2hvdWxkIG5vdCBiZSBvbiBkaWZmZXJlbnQgd2luZG93KVxyXG4gICAgLy8gMi4gQ1YgZXhlY3V0aW9uIG9mIExhc3RQYXJrZWRDdHJsIHRpbGwgZW5kXHJcbiAgICAvLyAzLiBSUC1DVnMgZm9yIGFsbCBpbnRlcm1lZGlhdGUgc3ViZm9ybXNcclxuICAgIGxldCBwcmV2Q3RybDogTWdDb250cm9sID0gbGFzdFBhcmtlZEN0cmw7XHJcbiAgICBpZiAoY3VyckNsaWNrZWRDdHJsICE9PSBudWxsICYmICg8VGFzaz5jdXJyQ2xpY2tlZEN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKSkuZ2V0TWdkSUQoKSA9PT0gKDxUYXNrPmN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKSkuZ2V0TWdkSUQoKSAmJiBjdHJsLm9uRGlmZkZvcm0oY3VyckNsaWNrZWRDdHJsKSlcclxuICAgICAgcHJldkN0cmwgPSBjdXJyQ2xpY2tlZEN0cmw7XHJcblxyXG4gICAgaWYgKHByZXZDdHJsICE9PSBudWxsICYmIGN0cmwub25EaWZmRm9ybShwcmV2Q3RybCkpIHtcclxuICAgICAgLy8gUlMgb2YgbmVzdGVkIHN1YmZvcm1zIHVudGlsIHN1YmZvcm0gdGFzayBjb250YW5pbmcgdGhlc2UgMiBzdWJmb3Jtc1xyXG4gICAgICBsZXQgcHJldlRhc2s6IFRhc2sgPSA8VGFzaz5wcmV2Q3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpO1xyXG4gICAgICBhd2FpdCBwcmV2VGFzay5leGVjU3ViZm9ybVJlY1N1ZmZpeCg8VGFzaz5jdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkpO1xyXG4gICAgICBpZiAodGhpcy5fc3RvcEV4ZWN1dGlvbikge1xyXG4gICAgICAgIGlmIChjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0xJU1QgfHwgY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9SQURJTyB8fCBjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0NIRUNLQk9YIHx8IGN0cmwuaXNUYWJDb250cm9sKCkpIHtcclxuICAgICAgICAgIGN0cmwucmVzZXRQcmV2VmFsKCk7XHJcbiAgICAgICAgICBhd2FpdCBjdHJsLlJlZnJlc2hEaXNwbGF5KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRhc2suSW5DdHJsUHJlZml4ID0gZmFsc2U7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoY3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpLmlzQWJvcnRpbmcoKSkge1xyXG4gICAgICAgIHRhc2suSW5DdHJsUHJlZml4ID0gZmFsc2U7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBhd2FpdCBFdmVudHNNYW5hZ2VyLmRvU3luY0ZvclN1YmZvcm1QYXJlbnQodGFzayk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRXhlY3V0ZSBSUCBvZiB0aGUgY3VycmVudCB0YXNrIGJlZm9yZSBleGVjdXRpbmcgdGhlIENWcyBiZWZvcmUgJ2N0cmwnXHJcbiAgICBpZiAodGFzay5EYXRhVmlldy5pc0VtcHR5RGF0YXZpZXcoKSlcclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRhc2suU3ViZm9ybUV4ZWNNb2RlID0gVGFza19TdWJmb3JtRXhlY01vZGVFbnVtLlNFVF9GT0NVUztcclxuICAgICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KGN0cmwsIGRpc3BsYXlMaW5lKTtcclxuICAgICAgcnRFdnQuc2V0SW50ZXJuYWwoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUV2ZW50KHJ0RXZ0LCBmYWxzZSk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKSB7XHJcbiAgICAgIHRhc2suSW5DdHJsUHJlZml4ID0gZmFsc2U7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIC8vfVxyXG5cclxuICAgIC8vIFFDUiMgODA2MDE1OiBJZiB3ZSBoYXZlIGEgc2luZ2xlIGZpZWxkIHdpdGggYWxsb3cgcGFya2luZyA9IFllcyBhbmQgVGFiIEludG8gPSBObywgdGhlbiBvbiBwcmVzc2luZyB0YWIgaWYgY3Vyc29yIGlzIG5vdCBtb3ZlZCwgd2UgY29tZSB0b1xyXG4gICAgLy8gcGFyayBvbiBsYXN0UGFya2VkQ3RybCh3aGljaCBpcyBzYW1lIGFzIGN0cmwpIHNpbmNlIFRhYkludG8gaXMgbm90IGFsbG93ZWQuXHJcbiAgICAvLyBTbyB0byBhdmFvaWQgaW5maW5pdGUgcmVjdXJzaW9uLCB3ZSBzaG91bGQgbm90IGFnYWluIHRyeSB0byBwYXJrIG9uIGl0LlxyXG4gICAgaWYgKCFhd2FpdCBjdHJsLklzUGFya2FibGUoKSAmJiBjdHJsICE9PSBsYXN0UGFya2VkQ3RybCkge1xyXG4gICAgICB0YXNrLkluQ3RybFByZWZpeCA9IGZhbHNlO1xyXG5cclxuICAgICAgaWYgKGxhc3RQYXJrZWRDdHJsID09PSBudWxsIHx8ICFhd2FpdCBsYXN0UGFya2VkQ3RybC5pbnZva2UoKSlcclxuICAgICAgICBhd2FpdCB0aGlzLkhhbmRsZU5vblBhcmthYmxlQ29udHJvbHMoY3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpKTtcclxuXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVTdXBwb3J0VG9Mb2coTlN0cmluZy5Gb3JtYXQoJ3swfSBFbnRlcmluZyBjb250cm9sOiBjb250cm9sIHsxfSwgcm93IHsyfScsIHRhc2suR2V0VGFza0RldGFpbHMoKSwgY3RybC5OYW1lLCBkaXNwbGF5TGluZSA8IDAgPyAwIDogZGlzcGxheUxpbmUpLCB0cnVlKTtcclxuXHJcbiAgICAvLyBpZiB3ZSBoYXZlIGEgc3RvcCBleGVjdXRpb24gY3RybCwgd2UgbmVlZCB0byB1c2UgaXQgYXMgYSBzcmN0cmwsIG90aGVyd2lzZSB1c2VcclxuICAgIC8vIHRoZSBjdHJsIG9uIHdoaWNoIHdlIGV4ZWN1dGVkIGxhc3QgQ1MuXHJcblxyXG5cclxuICAgIHRhc2suc2V0TGV2ZWwoQ29uc3RhbnRzLlRBU0tfTEVWRUxfQ09OVFJPTCk7XHJcbiAgICBjdHJsLktleVN0cm9rZU9uID0gZmFsc2U7XHJcbiAgICBjdHJsLk1vZGlmaWVkQnlVc2VyID0gZmFsc2U7XHJcblxyXG4gICAgdGFzay5zZXRDdXJyRmllbGQoY3RybC5nZXRGaWVsZCgpKTtcclxuXHJcbiAgICBpZiAoY3RybC5Jc1JlcGVhdGFibGUpXHJcbiAgICAgIGF3YWl0IGZvcm0uYnJpbmdSZWNvcmRUb1BhZ2UoKTtcclxuXHJcbiAgICAvLyBlbmFibGUtZGlzYWJsZSBhY3Rpb25zIGZvciBTdWJmb3Jtc1xyXG4gICAgaWYgKGxhc3RQYXJrZWRDdHJsICE9PSBjdHJsKSB7XHJcbiAgICAgIGlmICgobGFzdFBhcmtlZEN0cmwgPT09IG51bGwgJiYgY3RybC5nZXRGb3JtKCkuaXNTdWJGb3JtKCkpIHx8IChsYXN0UGFya2VkQ3RybCAhPT0gbnVsbCAmJiAoY3RybC5nZXRGb3JtKCkuaXNTdWJGb3JtKCkgfHwgbGFzdFBhcmtlZEN0cmwuZ2V0Rm9ybSgpLmlzU3ViRm9ybSgpKSkpIHtcclxuICAgICAgICBsZXQgbGFzdFBhcmtlZFRhc2s6IFRhc2sgPSBudWxsO1xyXG4gICAgICAgIGlmIChsYXN0UGFya2VkQ3RybCAhPT0gbnVsbClcclxuICAgICAgICAgIGxhc3RQYXJrZWRUYXNrID0gPFRhc2s+bGFzdFBhcmtlZEN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKTtcclxuXHJcbiAgICAgICAgaWYgKGxhc3RQYXJrZWRUYXNrICE9PSB0YXNrKSB7XHJcbiAgICAgICAgICBsZXQgZmlyc3RUaW1lOiBib29sZWFuID0gdHJ1ZTtcclxuICAgICAgICAgIGxldCBpc1NvblN1YmZvcm06IGJvb2xlYW47XHJcbiAgICAgICAgICBsZXQgcGFyZW50VGFzazogVGFzaztcclxuXHJcbiAgICAgICAgICBpZiAobGFzdFBhcmtlZFRhc2sgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgaXNTb25TdWJmb3JtID0gbGFzdFBhcmtlZFRhc2suSXNTdWJGb3JtO1xyXG5cclxuICAgICAgICAgICAgZm9yIChwYXJlbnRUYXNrID0gbGFzdFBhcmtlZFRhc2s7IHBhcmVudFRhc2sgIT09IG51bGwgJiYgaXNTb25TdWJmb3JtOyBwYXJlbnRUYXNrID0gPFRhc2s+cGFyZW50VGFzay5nZXRQYXJlbnQoKSkge1xyXG4gICAgICAgICAgICAgIGlmICghZmlyc3RUaW1lKSB7XHJcbiAgICAgICAgICAgICAgICBpc1NvblN1YmZvcm0gPSBwYXJlbnRUYXNrLklzU3ViRm9ybTtcclxuICAgICAgICAgICAgICAgIHBhcmVudFRhc2suQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1pPT00sIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIHBhcmVudFRhc2suQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0RFTExJTkUsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIHBhcmVudFRhc2suZW5hYmxlQ3JlYXRlQWN0cyhmYWxzZSk7XHJcbiAgICAgICAgICAgICAgfSBlbHNlXHJcbiAgICAgICAgICAgICAgICBmaXJzdFRpbWUgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlzU29uU3ViZm9ybSA9IHRhc2suSXNTdWJGb3JtO1xyXG5cclxuICAgICAgICAgIGZvciAocGFyZW50VGFzayA9IDxUYXNrPnRhc2suZ2V0UGFyZW50KCk7IChwYXJlbnRUYXNrICE9PSBudWxsKSAmJiBpc1NvblN1YmZvcm07IHBhcmVudFRhc2sgPSA8VGFzaz5wYXJlbnRUYXNrLmdldFBhcmVudCgpKSB7XHJcbiAgICAgICAgICAgIGlzU29uU3ViZm9ybSA9IHBhcmVudFRhc2suSXNTdWJGb3JtO1xyXG4gICAgICAgICAgICBpZiAocGFyZW50VGFzay5nZXRFbmFibGVab29tSGFuZGxlcigpKVxyXG4gICAgICAgICAgICAgIHBhcmVudFRhc2suQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1pPT00sIHRydWUpO1xyXG4gICAgICAgICAgICBhd2FpdCBwYXJlbnRUYXNrLnNldENyZWF0ZURlbGV0ZUFjdHNFbmFibGVTdGF0ZSgpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vIFdoZW5ldmVyIHdlIGFyZSBtb3ZpbmcgYmV0d2VlbiB0YXNrcywgcmUtZXZhbHVhdGUgQWxsb3dNb2Rlcy5cclxuICAgICAgICAgIGF3YWl0IHRhc2suZW5hYmxlTW9kZXMoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBlbmFibGUgYWN0aW9ucyBhbmQgc3RhdGVzXHJcbiAgICBpZiAodGFzay5nZXRFbmFibGVab29tSGFuZGxlcigpIHx8IGN0cmwudXNlWm9vbUhhbmRsZXIoKSlcclxuICAgICAgdGFzay5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfWk9PTSwgdHJ1ZSk7XHJcblxyXG4gICAgaWYgKGN0cmwuaXNUZXh0Q29udHJvbCgpIHx8IGN0cmwuaXNDaG9pY2VDb250cm9sKCkpXHJcbiAgICAgIGN0cmwuU2V0S2V5Ym9hcmRMYW5ndWFnZSgpO1xyXG5cclxuICAgIGlmIChjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0JVVFRPTilcclxuICAgICAgdGFzay5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQlVUVE9OLCB0cnVlKTtcclxuICAgIGF3YWl0IHRhc2suc2V0Q3JlYXRlRGVsZXRlQWN0c0VuYWJsZVN0YXRlKCk7XHJcblxyXG4gICAgbGV0IGZpZWxkOiBGaWVsZCA9IDxGaWVsZD5jdHJsLmdldEZpZWxkKCk7XHJcbiAgICBpZiAoZmllbGQgIT09IG51bGwgJiYgZmllbGQuTnVsbEFsbG93ZWQgJiYgY3RybC5pc01vZGlmaWFibGUoKSAmJiBjdHJsLlR5cGUgIT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0JVVFRPTilcclxuICAgICAgdGFzay5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfRURUX05VTEwsIHRydWUpO1xyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBkbyBzb21lIGRlZmF1bHQgb3BlcmF0aW9ucyBmb3IgYW4gZXZlbnQgYW5kIHJldHVybiB0cnVlIHRvIHRlbGwgdGhlIGNhbGxlclxyXG4gIC8vLyAgIHRvIGNvbnRpbnVlIGhhbmRsaW5nIHRoZSBldmVudFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJldnRcIj50aGUgZXZlbnQgdG8gaGFuZGxlPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRlbGxzIHRoZSBjYWxsZXIgd2hldGhlciB0byBjb250aW51ZSBoYW5kbGluZyB0aGUgZXZlbnQ8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBhc3luYyBjb21tb25IYW5kbGVyQmVmb3JlKGV2dDogUnVuVGltZUV2ZW50KTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgZXZ0U2F2ZTogUnVuVGltZUV2ZW50ID0gZXZ0O1xyXG4gICAgbGV0IHRhc2s6IFRhc2sgPSA8VGFzaz5ldnQuZ2V0VGFzaygpO1xyXG4gICAgbGV0IHJlYzogUmVjb3JkID0gbnVsbDtcclxuICAgIGxldCBwcmV2UmVjOiBSZWNvcmQgPSBudWxsO1xyXG4gICAgbGV0IHZhbDogc3RyaW5nO1xyXG4gICAgbGV0IG9sZERpc3BsYXlMaW5lOiBudW1iZXIgPSBJbnQzMi5NaW5WYWx1ZTtcclxuXHJcbiAgICBpZiAodGhpcy5fc3RvcEV4ZWN1dGlvbilcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIGlmICh0YXNrLmlzQWJvcnRpbmcoKSlcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIGlmIChldnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX1NZU1RFTSkge1xyXG4gICAgICBsZXQgYWN0SWQ6IG51bWJlciA9IHRoaXMuZ2V0TWF0Y2hpbmdBY3Rpb24oZXZ0LmdldEtiZEl0bSgpKTtcclxuICAgICAgaWYgKGFjdElkICE9PSAwICYmIGV2dC5Db250cm9sICE9PSBudWxsKVxyXG4gICAgICAvLyAmJiBhY3RJZCAhPSBNR19BQ1RfU0VMRUNUKVxyXG4gICAgICB7XHJcbiAgICAgICAgZXZ0ID0gbmV3IFJ1blRpbWVFdmVudChldnQsIGV2dCk7XHJcbiAgICAgICAgZXZ0LnNldEludGVybmFsKGFjdElkKTtcclxuICAgICAgICBldnQuc2V0QXJnTGlzdChudWxsKTtcclxuICAgICAgICBsZXQgbWdDb250cm9sOiBNZ0NvbnRyb2wgPSA8TWdDb250cm9sPmV2dC5Db250cm9sO1xyXG4gICAgICAgIGV2dFNhdmUuc2V0Q3RybChtZ0NvbnRyb2wpO1xyXG4gICAgICAgIGlmIChtZ0NvbnRyb2wgPT09IG51bGwpXHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBRQ1IjIDkzOTI1MyAtIHdlIGhhdmUgdG8gcHJvY2VzcyBjb21tb25IYW5kbGVyQmVmb3JlIGV2ZW4gZm9yIGludGVybmFsIGV2ZW50IGNvbnZlcnRlZFxyXG4gICAgLy8gZnJvbSBzeXN0ZW0gRXZlbnRcclxuICAgIGlmIChldnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0lOVEVSTkFMKSB7XHJcbiAgICAgIGxldCBmb3JtOiBNZ0Zvcm0gPSA8TWdGb3JtPnRhc2suZ2V0Rm9ybSgpO1xyXG4gICAgICBsZXQgZGlzcGxheUxpbmU6IG51bWJlciA9IGV2dC5nZXREaXNwbGF5TGluZSgpO1xyXG4gICAgICBsZXQgZHY6IERhdGFWaWV3ID0gPERhdGFWaWV3PnRhc2suRGF0YVZpZXc7XHJcbiAgICAgIHJlYyA9IGR2LmdldEN1cnJSZWMoKTtcclxuXHJcbiAgICAgIGxldCBjdHJsOiBNZ0NvbnRyb2wgPSA8TWdDb250cm9sPmV2dC5Db250cm9sO1xyXG4gICAgICBsZXQgaW50RXZ0Q29kZTogbnVtYmVyID0gZXZ0LmdldEludGVybmFsQ29kZSgpO1xyXG5cclxuICAgICAgbGV0IGxhc3RGb2N1c2VkQ3RybDogTWdDb250cm9sID0gTGFzdEZvY3VzZWRNYW5hZ2VyLmdldExhc3RGb2N1c2VkQ29udHJvbCgpO1xyXG5cclxuICAgICAgLy8gZm9yIGludGVybmFsIGV2ZW50c1xyXG4gICAgICBzd2l0Y2ggKGludEV2dENvZGUpIHtcclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9aT09NOlxyXG4gICAgICAgICAgbGV0IGJvb2x2YWwgPSBhd2FpdCB0aGlzLnNlbGVjdFByb2coY3RybCk7XHJcbiAgICAgICAgICBpZiAoYm9vbHZhbClcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1dFQl9PTl9EQkxJQ0s6XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9GT0NVUzpcclxuICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRm9jdXMoY3RybCwgZGlzcGxheUxpbmUsIGV2dC5pc1Byb2R1Y2VDbGljaygpLCBldnQuU2hvdWxkSGFuZGxlWm9vbSk7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfRk9DVVNfT05fTk9OX01BR0lDX0NPTlRST0w6XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUZvY3VzT25Ob25NYWdpY0NvbnRyb2woY3RybCk7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfS0VZRE9XTjpcclxuICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlS2V5RG93bih0YXNrLCBjdHJsLCBldnQpO1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX01PVVNFVVA6XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZU1vdXNlVXAoY3RybCwgZGlzcGxheUxpbmUsIGV2dC5pc1Byb2R1Y2VDbGljaygpKTtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfU0VMRUNUSU9OOlxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5vbkFjdFNlbGVjdGlvbihjdHJsLCBmb3JtLCBldnQpO1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9USU1FUjpcclxuICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlVGltZXIoZXZ0KTtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVTSVpFOlxyXG4gICAgICAgICAgdGhpcy5oYW5kbGVSZXNpemUoY3RybCwgZGlzcGxheUxpbmUpO1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9ST1dfREFUQV9DVVJSX1BBR0U6XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZVJvd0RhdGFDdXJQYWdlKGN0cmwsIGRpc3BsYXlMaW5lLCBldnQuaXNTZW5kQWxsKCksIGV2dC5MYXN0Rm9jdXNlZFZhbCk7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0RWX1RPX0dVSTpcclxuICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlVHJhbnNmZXJEYXRhVG9HdWkoY3RybCk7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0ZFVENIX1JFQ09SRFNfQUhFQURfRlJPTV9TRVJWRVI6XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmZldGNoUmVjb3Jkc0FoZWFkRnJvbVNlcnZlcihjdHJsKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FTkFCTEVfRVZFTlRTOlxyXG4gICAgICAgICAgdGhpcy5oYW5kbGVFbmFibGVFdmVudHMoZXZ0LCB0cnVlKTtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRElTQUJMRV9FVkVOVFM6XHJcbiAgICAgICAgICB0aGlzLmhhbmRsZUVuYWJsZUV2ZW50cyhldnQsIGZhbHNlKTtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEFTS19QUkVGSVg6XHJcbiAgICAgICAgICB0YXNrLnNldExldmVsKENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RBU0tfU1VGRklYOlxyXG4gICAgICAgICAgdGFzay5zZXRMZXZlbChDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYOlxyXG4gICAgICAgICAgLy8gRGVmZWN0IDExNTkwMy4gRG8gbm90IGV4ZWN1dGUgUlAgaWYgdGhlIHN1YmZvcm0gcGFyZW50IHRhc2sgZGlkbid0IGZpbmlzaGVkIHlldFxyXG4gICAgICAgICAgLy8gaXQncyBDb21tb25IYW5kbGVyQmVmb3JlIGZvciBSUC5cclxuICAgICAgICAgIGlmICh0YXNrLklzU3ViRm9ybSAmJiAoPFRhc2s+dGFzay5nZXRQYXJlbnQoKSkuSW5Db21tb25IYW5kbGVyQmVmb3JlUlApXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgICAvLyBSZWNvdmVyeSBmcm9tIHRyYW5zYWN0aW9uIHJlc3RhcnQgd2FzIGNvbXBsZXRlZC4gV2UgbWF5IG5vdyBjbGVhciB0aGUgZmxhZ1xyXG4gICAgICAgICAgdGFzay5zZXRBZnRlclJldHJ5KENvbnN0SW50ZXJmYWNlLlJFQ09WRVJZX05PTkUpO1xyXG4gICAgICAgICAgdGFzay5EYXRhU3luY2VkID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgaWYgKCF0YXNrLmlzU3RhcnRlZCgpKVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG5cclxuICAgICAgICAgIC8vIGlmIHRoZSBmb3JtIGNvbnRhaW5zIGEgdGFibGUgYW5kIHRoZSBjb250cm9sIHdhcyBpbiB0aGUgdGFibGVcclxuICAgICAgICAgIC8vIG1vdmUgdG8gdGhlIG5ldyByb3dcclxuICAgICAgICAgIGlmIChmb3JtLmdldFJvd3NJblBhZ2UoKSA+IEludDMyLk1pblZhbHVlICYmIGRpc3BsYXlMaW5lID4gSW50MzIuTWluVmFsdWUpIHtcclxuICAgICAgICAgICAgLy8gZW5zdXJlIGEgdmFsaWQgcm93XHJcbiAgICAgICAgICAgIHdoaWxlICghZHYucmVjRXhpc3RzKGRpc3BsYXlMaW5lKSAmJiBkaXNwbGF5TGluZSA+IDApIHtcclxuICAgICAgICAgICAgICBkaXNwbGF5TGluZS0tO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChkaXNwbGF5TGluZSA+PSAwKSB7XHJcbiAgICAgICAgICAgICAgcHJldlJlYyA9IGR2LmdldEN1cnJSZWMoKTtcclxuICAgICAgICAgICAgICBsZXQgb2xkVGFza01vZGU6IHN0cmluZyA9IHRhc2suZ2V0TW9kZSgpO1xyXG4gICAgICAgICAgICAgIGxldCBvbGRSZWNJZDogbnVtYmVyID0gcHJldlJlYy5nZXRJZCgpO1xyXG5cclxuICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgb2xkRGlzcGxheUxpbmUgPSBmb3JtLkRpc3BsYXlMaW5lO1xyXG4gICAgICAgICAgICAgICAgLy8gb2xkRGlzcGxheUxpbmUgPSBmb3JtLmdldEN1cnJSb3coKVxyXG4gICAgICAgICAgICAgICAgZm9ybS5QcmV2RGlzcGxheUxpbmUgPSBvbGREaXNwbGF5TGluZTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGZvcm0uc2V0Q3VyclJvd0J5RGlzcGxheUxpbmUoZGlzcGxheUxpbmUsIHRydWUsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIC8vIHJlZnJlc2ggdGhlIGRpc3BsYXkgaWYgdGhlIHByZXZpb3VzIHJlY29yZCB3YXMgZGVsZXRlZCBvciBjYW5jZWxlZFxyXG4gICAgICAgICAgICAgICAgaWYgKHByZXZSZWMgIT0gbnVsbCAmJiAhZHYucmVjRXhpc3RzQnlJZChwcmV2UmVjLmdldElkKCkpKSB7XHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IGZvcm0uUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9UQUJMRSk7XHJcbiAgICAgICAgICAgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgcmVmcmVzaCBpcyBlc3NlbnRpYWwuIElmIGl0IGZhaWxzIGJlY2F1c2Ugb2YgYW5cclxuICAgICAgICAgICAgICAgICAgLy8gZXhjZXB0aW9uIHRoZW4gdGhlIG9sZCBjdXJyIHJvdyBpcyByZXN0b3JlZCAoaW4gdGhlIGNhdGNoXHJcbiAgICAgICAgICAgICAgICAgIC8vIHN0YXRlbWVudCkuIEl0IGNhbiBoYXBwZW4gd2hlbiB0aGUgdXNlciBjbGlja3Mgb24gYSBsaW5lIHdoaWNoXHJcbiAgICAgICAgICAgICAgICAgIC8vIGJlY29tZXMgYmxhbmsgZHVlIHRvIHRoZSBkZWxldGlvbiBvZiB0aGUgcHJldmlvdXMgcmVjb3JkLlxyXG4gICAgICAgICAgICAgICAgICBhd2FpdCBmb3JtLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfQ1VSUl9SRUMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmVjID0gZHYuZ2V0Q3VyclJlYygpO1xyXG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICBpZiAodGhpcy5fc3RvcEV4ZWN1dGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvbGRUYXNrTW9kZSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUgJiYgb2xkRGlzcGxheUxpbmUgPiAwICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAhZHYucmVjRXhpc3RzQnlJZChvbGRSZWNJZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGxldCBwcmV2TGluZTogbnVtYmVyID0gZm9ybS5nZXRQcmV2TGluZShvbGREaXNwbGF5TGluZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBmb3JtLnJlc3RvcmVPbGREaXNwbGF5TGluZShwcmV2TGluZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBmb3JtLnJlc3RvcmVPbGREaXNwbGF5TGluZShvbGREaXNwbGF5TGluZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZm9ybS5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0ZPUk0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbihmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgbGFzdEZvY3VzZWRDdHJsID0gPE1nQ29udHJvbD50YXNrLmdldExhc3RQYXJrZWRDdHJsKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGFzay5nZXRMYXN0UGFya2VkQ3RybCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChsYXN0Rm9jdXNlZEN0cmwgIT0gbnVsbClcclxuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGxhc3RGb2N1c2VkQ3RybC5pbnZva2UoKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb24odHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICB9IGVsc2VcclxuICAgICAgICAgICAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhlLlN0YWNrVHJhY2UpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHRocm93IGU7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2VcclxuICAgICAgICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25FeGNlcHRpb24oJ2luIEV2ZW50c01hbmFnZXIuY29tbW9uSGFuZGxlckJlZm9yZSgpOiBpbnZhbGlkIGxpbmUgbnVtYmVyOiAnICtcclxuICAgICAgICAgICAgICAgIGRpc3BsYXlMaW5lKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChyZWMgPT0gbnVsbClcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uRXhjZXB0aW9uKFxyXG4gICAgICAgICAgICAgICdpbiBFdmVudHNNYW5hZ2VyLmNvbW1vbkhhbmRsZXJCZWZvcmUoKTogbm8gY3VycmVudCByZWNvcmQgYXZhaWxhYmxlICEnKTtcclxuXHJcbiAgICAgICAgICAvLyBvbmx5IGZvciBub24gaW50ZXJhY3RpdmUgdGFza3MuIEluY3JlYXNlIHRoZSB0YXNrJ3MgY291bnRlciBmb3IgZXZlcnkgcmVjb3JkIHdlIHBhc3MuXHJcbiAgICAgICAgICAvLyBkbyBpdCBiZWZvcmUgdGhlIGV2YWxFbmRDb25kIHNpbmNlIGl0IG1pZ2h0IGluY2x1ZGUgY291bnRlcigwKS5cclxuICAgICAgICAgIC8vIGluY3JlYXNlIG9ubHkgaWYgZ29pbmcgaW50byB0aGUgcmVjIHByZWZpeC5cclxuICAgICAgICAgIGlmICghdGFzay5Jc0ludGVyYWN0aXZlICYmIHRhc2suZ2V0TGV2ZWwoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSylcclxuICAgICAgICAgICAgdGFzay5pbmNyZWFzZUNvdW50ZXIoKTtcclxuXHJcbiAgICAgICAgICAvLyBjaGVjayB0aGUgXCJ0YXNrIGVuZCBjb25kaXRpb25cIiBiZWZvcmUgZW50ZXJpbmcgdGhlIHJlY29yZFxyXG4gICAgICAgICAgaWYgKGF3YWl0IHRhc2suZXZhbEVuZENvbmQoQ29uc3RJbnRlcmZhY2UuRU5EX0NPTkRfRVZBTF9CRUZPUkUpKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRhc2suZW5kVGFzayh0cnVlLCBmYWxzZSwgZmFsc2UpO1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoZm9ybS5IYXNUYWJsZSgpKVxyXG4gICAgICAgICAgICBhd2FpdCBmb3JtLmJyaW5nUmVjb3JkVG9QYWdlKCk7XHJcblxyXG4gICAgICAgICAgLy8gdG8gcHJldmVudCBkb3VibGUgcHJlZml4IG9uIHRoZSBzYW1lIHJlY29yZFxyXG4gICAgICAgICAgaWYgKHRhc2suZ2V0TGV2ZWwoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSylcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICAgIGF3YWl0IGZvcm0uUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9DVVJSX1JFQyk7XHJcblxyXG4gICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coJ1JFQ09SRCBQUkVGSVg6ICcgKyB0YXNrLnF1ZXJ5VGFza1BhdGgoKSk7XHJcbiAgICAgICAgICAoZHYuZ2V0Q3VyclJlYygpKS5zZXRGb3JjZVNhdmVPcmcoZmFsc2UpO1xyXG4gICAgICAgICAgKGR2LmdldEN1cnJSZWMoKSkuU3luY2VkID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgZHYuc2F2ZU9yaWdpbmFsKCk7XHJcblxyXG4gICAgICAgICAgLy8gZG8gUmVjb3JkIFByZWZpeCBmb3IgYWxsIGZhdGhlcnMgdGhhdCB0aGVpciBSZWNvcmQgUHJlZml4IGlzIG5vdCBkb25lIGVhcmxpZXJcclxuICAgICAgICAgIGlmICh0YXNrLklzU3ViRm9ybSAmJiB0YXNrLlBlcmZvcm1QYXJlbnRSZWNvcmRQcmVmaXgpIHtcclxuICAgICAgICAgICAgbGV0IHBhcmVudFRhc2sgPSB0YXNrLmdldFBhcmVudCgpO1xyXG4gICAgICAgICAgICB3aGlsZSAocGFyZW50VGFzay5Jc1N1YkZvcm0pIHtcclxuICAgICAgICAgICAgICBpZiAocGFyZW50VGFzay5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayhwYXJlbnRUYXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnRUYXNrID0gcGFyZW50VGFzay5nZXRQYXJlbnQoKTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpXHJcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgIH0gZWxzZVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyBoYW5kbGUgc3ViLWZvcm1zXHJcbiAgICAgICAgICB0YXNrLkluQ29tbW9uSGFuZGxlckJlZm9yZVJQID0gdHJ1ZTtcclxuICAgICAgICAgIGlmIChhd2FpdCB0YXNrLkNoZWNrUmVmcmVzaFN1YlRhc2tzKCkpXHJcbiAgICAgICAgICAgIGF3YWl0IGR2LmNvbXB1dGVTdWJGb3JtcygpO1xyXG4gICAgICAgICAgdGFzay5JbkNvbW1vbkhhbmRsZXJCZWZvcmVSUCA9IGZhbHNlO1xyXG4gICAgICAgICAgdGFzay5zZXRMZXZlbChDb25zdGFudHMuVEFTS19MRVZFTF9SRUNPUkQpO1xyXG4gICAgICAgICAgLy8gZW5hYmxlLWRpc2FibGUgYWN0aW9ucyBmb3IgYSByZWNvcmRcclxuICAgICAgICAgIGF3YWl0IHRhc2suZW5hYmxlUmVjb3JkQWN0aW9ucygpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVg6XHJcbiAgICAgICAgICAvLyBGb3JjZSByZWNvcmQgc3VmZml4OlxyXG4gICAgICAgICAgbGV0IGZvcmNlU3VmZml4OiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgICAgICBsZXQgaXNTZWxlY3Rpb25UYWJsZTogYm9vbGVhbjtcclxuXHJcbiAgICAgICAgICB0YXNrLkNvbmZpcm1VcGRhdGVObyA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgIC8vIE5vIHJlY29yZCAtPiBubyBzdWZmaXhcclxuICAgICAgICAgIGlmIChyZWMgPT0gbnVsbClcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICAgIGZvcmNlU3VmZml4ID0gYXdhaXQgdGFzay5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRk9SQ0VfU1VGRklYLCBmYWxzZSk7XHJcblxyXG4gICAgICAgICAgLy8gZG8gbm90IGV4ZWN1dGUgdGhlIFwiYmVmb3JlIHJlY29yZCBzdWZmaXhcIiB3aGVuIGRlbGV0aW5nIHRoZSByZWNvcmQgYW5kXHJcbiAgICAgICAgICAvLyB0aGUgdGFzayBtb2RlIGlzIGRlbGV0ZSAodGhlIHNlY29uZCByb3VuZClcclxuICAgICAgICAgIGlmICgocmVjLk1vZGlmaWVkIHx8IGZvcmNlU3VmZml4KSAmJiByZWMuZ2V0TW9kZSgpID09PSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuRGVsZXRlICYmXHJcbiAgICAgICAgICAgIHRhc2suZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0RFTEVURSlcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcblxyXG4gICAgICAgICAgLy8gdG8gcHJldmVudCBkb3VibGUgc3VmZml4IG9uIHRoZSBzYW1lIHJlY29yZFxyXG4gICAgICAgICAgaWYgKHRhc2suZ2V0TGV2ZWwoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSylcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICAgIGlmICh0YXNrLmdldExldmVsKCkgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX0NPTlRST0wpIHtcclxuICAgICAgICAgICAgdGFzay5zZXRJblJlY29yZFN1ZmZpeCh0cnVlKTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aE1nQ29udHJvbEJhc2UodGFzay5nZXRMYXN0UGFya2VkQ3RybCgpLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9TVUZGSVgpO1xyXG4gICAgICAgICAgICB0YXNrLnNldEluUmVjb3JkU3VmZml4KGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3N0b3BFeGVjdXRpb24pXHJcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGF3YWl0IHRhc2suaGFuZGxlRXZlbnRPblNsYXZlVGFza3MoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG4gICAgICAgICAgaWYgKHRoaXMuX3N0b3BFeGVjdXRpb24pXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKCdSRUNPUkQgU1VGRklYOiAnICsgdGFzay5xdWVyeVRhc2tQYXRoKCkpO1xyXG5cclxuXHJcbiAgICAgICAgICAvLyBpbmRpY2F0ZSBuZXh0IHZlcmlmeUN0cmwgaXMgdGhlIGZpcnN0IGN0cmwgaW4gdGhlIHJlY29yZFxyXG5cclxuICAgICAgICAgIHRhc2suc2V0TGV2ZWwoQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSyk7XHJcblxyXG4gICAgICAgICAgaXNTZWxlY3Rpb25UYWJsZSA9IGF3YWl0IHRhc2suY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1NFTEVDVElPTiwgZmFsc2UpO1xyXG5cclxuICAgICAgICAgIC8vIFF1ZXJ5IG1vZGUgLT4gZG8gc3VmZml4IG9ubHkgaWYgd2UgZm9yY2UgaXQgb3Igc29tZWhvdyB0aGUgcmVjb3JkIHdhcyB1cGRhdGVkXHJcbiAgICAgICAgICBpZiAodGFzay5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfUVVFUlkgJiYgIWZvcmNlU3VmZml4ICYmICFyZWMuTW9kaWZpZWQgJiZcclxuICAgICAgICAgICAgIWlzU2VsZWN0aW9uVGFibGUpXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgICBpZiAoIXJlYy5Nb2RpZmllZCAmJiAhZm9yY2VTdWZmaXggJiYgKCFpc1NlbGVjdGlvblRhYmxlIHx8ICF0YXNrLkluU2VsZWN0KSkge1xyXG4gICAgICAgICAgICBpZiAocmVjLmdldE1vZGUoKSA9PT0gRGF0YU1vZGlmaWNhdGlvblR5cGVzLkRlbGV0ZSkge1xyXG4gICAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmV4ZWN1dGVDb250cm9sVmVyaWZpY2F0aW9uKHRhc2spO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAodGFzay5nZXRNb2RlKCkgIT09IENvbnN0YW50cy5UQVNLX01PREVfREVMRVRFICYmIHJlYy5Nb2RpZmllZCkge1xyXG4gICAgICAgICAgICBpZiAoIWF3YWl0IHRoaXMudXBkYXRlQ29uZmlybWVkKHRhc2spKVxyXG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBsZXQgc3RvcEV4ZWN1dGlvbjogYm9vbGVhbiA9ICFhd2FpdCB0aGlzLmV4ZWN1dGVDb250cm9sVmVyaWZpY2F0aW9uKHRhc2spO1xyXG4gICAgICAgICAgLy8gZG8gbm90IGNvbnRpbnVlIHByb2Nlc3NpbmcgUlMgaWYgQ1YgcmV0dXJucyBlcnJvclxyXG4gICAgICAgICAgaWYgKHN0b3BFeGVjdXRpb24pXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1BSRUZJWDpcclxuICAgICAgICAgIGlmIChhd2FpdCB0aGlzLmhhbmRsZUN0cmxQcmVmaXgoZXZ0KSlcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgLy8gZGlkIG5vdCBzdWNjZWVkIGluIGVudGVyaW5nIHRoZSBjdHJsXHJcbiAgICAgICAgICAgIGV2dC5Db250cm9sLkluQ29udHJvbCA9IGZhbHNlO1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NBTkNFTDpcclxuICAgICAgICAgIE1hbmFnZXIuQ2xlYW5NZXNzYWdlUGFuZSh0YXNrKTsgLy8gUUNSICMzNzEzMjFcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1NVRkZJWDpcclxuXHJcbiAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGEgc3RvcGV4ZWN1dGlvbiBjdHJsIHdlIHNob3VsZCBub3QgZXhlY3V0ZSBDUy5cclxuICAgICAgICAgIGlmIChjdHJsID09IG51bGwgfHwgdGhpcy5nZXRTdG9wRXhlY3V0aW9uQ3RybCgpICE9IG51bGwpXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgICAvLyB0byBwcmV2ZW50IGRvdWJsZSBzdWZmaXggb24gdGhlIHNhbWUgY29udHJvbFxyXG4gICAgICAgICAgaWYgKHRhc2suZ2V0TGV2ZWwoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfQ09OVFJPTClcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICAgIGlmICghY3RybC5pc1N1YmZvcm0oKSkge1xyXG4gICAgICAgICAgICB2YWwgPSBNYW5hZ2VyLkdldEN0cmxWYWwoY3RybCk7XHJcblxyXG4gICAgICAgICAgICAvLyBXZSBhcmUgcmVzZXR0aW5nIHRoZSBmbGFnIGFzIHdlIGFyZSBtb3ZpbmcgZnJvbSBvbmUgY29udHJvbCB0byBvdGhlciBjb250cm9sLlxyXG4gICAgICAgICAgICB0YXNrLkN1cnJlbnRFZGl0aW5nQ29udHJvbCA9IG51bGw7XHJcblxyXG4gICAgICAgICAgICAvLyB2YWxpZGF0ZSB0aGUgY29udHJvbHMgdmFsdWVcclxuICAgICAgICAgICAgLy8gRml4ZWQgYnVnICM6NzU4Nzg4LCB0aGUgYnJvd3NlciBjb250cm9sIHdpbGwgbm90IGJlIHVwZGF0ZSBmcm9tIHRoZSBmaWxlZC5cclxuICAgICAgICAgICAgLy8gUGF0Y2ggZm9yIFFDUiAjNzI5NzA2OlxyXG4gICAgICAgICAgICAvLyBNYWdpYyB0aHJlYWQgcHV0cyB0aGUgZm9sbG93aW5nIEdVSSBjb21tYW5kczpcclxuICAgICAgICAgICAgLy8gICAgUFJPUF9TRVRfSU1BR0VfRklMRV9OQU1FIHRvIHNldCB0aGUgaW1hZ2Ugb24gdGhlIEltYWdlIGNvbnRyb2wuXHJcbiAgICAgICAgICAgIC8vICAgIFBST1BfU0VUX1RFWFQgdG8gc2V0IHRoZSB0ZXh0IG9mIHRoZSBUZXh0Qm94IGNvbnRyb2wuXHJcbiAgICAgICAgICAgIC8vICAgIFNFVF9GT0NVUyB0byBmb2N1cyBvbiB0aGUgVGV4dEJveCBjb250cm9sLlxyXG4gICAgICAgICAgICAvLyBOb3csIHdoZW4gdGhlIGV4ZWN1dGlvbiBpcyBieSBGNywgaWYgdGhlIGZpbGUgaXMgbm90IHJldHJpZXZlZCBmcm9tIHRoZSBzZXJ2ZXJcclxuICAgICAgICAgICAgLy8gKGkuZS4gaWYgdGhlcmUgaXMgNDA0IGVycm9yKSwgSHR0cENsaWVudCByZS10cmllcyB0byBnZXQgdGhlIGZpbGUgZm9yIEhUVFB0aW1lb3V0LlxyXG4gICAgICAgICAgICAvLyBEdXJpbmcgdGhpcyB0aW1lIGFsbCB0aGUgR1VJIGV2ZW50cyBpbiBHdWlDb21tYW5kc1F1ZXVlIHJlbWFpbnMgcGVuZGluZyB1bmhhbmRsZWQuXHJcbiAgICAgICAgICAgIC8vIEluIHRoZSBtZWFuIHRpbWUsIE1hZ2ljIHRocmVhZCBleGVjdXRlcyB0aGUgRXhpdCBldmVudCBhbmQgZHVyaW5nIHRoaXMsIGl0IHRyaWVzXHJcbiAgICAgICAgICAgIC8vIHRvIGV4ZWN1dGUgdGhlIEN0cmwgU3VmZml4IG9mIHRoZSBUZXh0Qm94IGNvbnRyb2wuXHJcbiAgICAgICAgICAgIC8vIFNpbmNlIFNFVF9GT0NVUyBpcyBzdGlsbCBwZW5kaW5nIGluIHRoZSBxdWV1ZSwgdGhlIGxvZ2ljYWwgY29udHJvbCAoaWYgYWxsb3dUZXN0aW5nPU5vKVxyXG4gICAgICAgICAgICAvLyBpcyBub3QgbWFwcGVkIHdpdGggYW55IGFjdHVhbCB3aW5kb3dzIGNvbnRyb2wuXHJcbiAgICAgICAgICAgIC8vIE5vdyB3aGVuIHdlIHRyeSB0byBnZXQgdGhlIHZhbHVlIG9mIHRoaXMgbG9naWNhbCBjb250cm9sLCBMb2dpY2FsQ29udHJvbC5nZXRFZGl0b3JDb250cm9sKClcclxuICAgICAgICAgICAgLy8gcmV0dXJucyBudWxsIGFuZCBzbywgU3RhdGljVGV4dC5nZXRWYWx1ZSgpIHJldHVybnMgTG9naWNhbENvbnRyb2wuVGV4dCBpbnN0ZWFkIG9mIENvbnRyb2wuVGV4dFxyXG4gICAgICAgICAgICAvLyBCZWNhdXNlIFBST1BfU0VUX1RFWFQgaXMgYWxzbyBwZW5kaW5nLCBMb2dpY2FsQ29udHJvbC5UZXh0IGlzIG51bGwuXHJcbiAgICAgICAgICAgIC8vIEFuZCBzbyB0aGVyZSBpcyBhbiBleGNlcHRpb24gd2hlbiB1c2luZyBpdC5cclxuICAgICAgICAgICAgLy8gSWYgQWxsb3dUZXN0aW5nPVllcywgdGhlIHZhbCB3aWxsIGJlIGEgYmxhbmsgc3RyaW5nLiBTbywgdGhlcmUgaXMgbm8gY3Jhc2guXHJcbiAgICAgICAgICAgIC8vIEJ1dCBoZXJlIHdlIGhhdmUgYW5vdGhlciBwcm9ibGVtLiBTdXBwb3NlLCB0aGUgZmllbGQgaGFkIGFuIEluaXQgZXhwcmVzc2lvbi5cclxuICAgICAgICAgICAgLy8gTm93LCBNZ0NvbnRyb2wncyB2YWx1ZSB3b3VsZCBiZSB0aGUgaW5pdGVkIHZhbHVlIGFuZCB0aGUgdmFsIGlzIGEgYmxhbmsgc3RyaW5nLlxyXG4gICAgICAgICAgICAvLyBTbywgd2Ugd2lsbCBoYXZlIHZhcmlhYmxlIGNoYW5nZS5cclxuICAgICAgICAgICAgLy8gU2luY2UgdGhlIHByb2JsZW0gaXMgcmVsYXRlZCB0byBhIHZlcnkgc3BlY2lmaWMgc2NlbmFyaW8gLS0gd2hlbiB0aGUgaW1hZ2UgY29udHJvbCB3YXNcclxuICAgICAgICAgICAgLy8gdGhlIGZpcnN0IGRyb3BwZWQgY29udHJvbCBvbiB0aGUgZm9ybSwgaW1hZ2UgY2Fubm90IGJlIGFjY2Vzc2VkIGF0IHRoZSB0aW1lIG9mIHRhc2tcclxuICAgICAgICAgICAgLy8gbG9hZGluZyBhbmQgdGFzayBuZWVkcyB0byBiZSBjbG9zZWQsIHdlIGFyZSBwdXR0aW5nIGEgcGF0Y2ggaGVyZSBieSBjaGVja2luZyB2YWwgZm9yIE5VTEwuXHJcbiAgICAgICAgICAgIC8vIFRoZSBpZGVhbCBzb2x1dGlvbiB3b3VsZCBiZSAtLS0gaW5zdGVhZCBvZiBzZW5kaW5nIHRoZSBpbWFnZSBmaWxlIG5hbWUgZnJvbSBNYWdpYyB0aHJlYWRcclxuICAgICAgICAgICAgLy8gdG8gR3VpIHRocmVhZCBhbmQgbG9hZGluZyB0aGUgaW1hZ2UgZnJvbSB0aGUgR3VpIHRocmVhZCwgd2UgY2FuIGxvYWQgdGhlIGltYWdlIGZyb20gdGhlXHJcbiAgICAgICAgICAgIC8vIE1hZ2ljIHRocmVhZCAodXNpbmcgc3luYyBleGVjdXRpb24gaS5lLiB2aWEgR3VpSW50ZXJhY3RpdmUpIGFuZCBzZW5kIGl0IHRvIHRoZSBHdWkgdGhyZWFkLlxyXG4gICAgICAgICAgICBpZiAoIXRhc2suY2FuY2VsV2FzUmFpc2VkKCkgJiZcclxuICAgICAgICAgICAgICAoY3RybC5UeXBlICE9PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9CUk9XU0VSICYmICghaXNOdWxsT3JVbmRlZmluZWQoY3RybC5fZmllbGQpICYmIChjdHJsLl9maWVsZC5nZXRUeXBlKCkgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuREFURSB8fCBjdHJsLl9maWVsZC5nZXRUeXBlKCkgPT0gU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDKSB8fCB2YWwgIT09IG51bGwpICYmIHR5cGVvZiB2YWwgIT0gJ3VuZGVmaW5lZCcgJiZcclxuICAgICAgICAgICAgICAgICFhd2FpdCBjdHJsLnZhbGlkYXRlQW5kU2V0VmFsdWUodmFsLCB0cnVlKSkpIHtcclxuICAgICAgICAgICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb24odHJ1ZSk7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy8gd2hlbiBzdG9wIGV4ZWN1dGlvbiBpbiBvbiwgZG9uJ3QgY2xlYXIgdGhlIG1zZyBmcm9tIHN0YXR1cy5cclxuICAgICAgICAgIGlmICghdGhpcy5fc3RvcEV4ZWN1dGlvbilcclxuICAgICAgICAgICAgTWFuYWdlci5DbGVhbk1lc3NhZ2VQYW5lKHRhc2spO1xyXG5cclxuICAgICAgICAgIC8vIHJlc2V0IEluQ29udHJvbCBiZWZvcmUgZXhlY3V0aW5nIGNvbnRyb2wgdmVyaWZpY2F0aW9uXHJcbiAgICAgICAgICBjdHJsLkluQ29udHJvbCA9IGZhbHNlO1xyXG4gICAgICAgICAgY3RybC5DbGlwQm9hcmREYXRhRXhpc3RzID0gZmFsc2U7XHJcbiAgICAgICAgICBjdHJsLlZhbGlkYXRlQ29udHJvbCA9IHRydWU7XHJcbiAgICAgICAgICBjdHJsLnNldEluQ29udHJvbFN1ZmZpeCh0cnVlKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGV4ZWN1dGUgYSBzZWxlY3QgcHJvZ3JhbSBhbmQgcmV0dXJucyB0cnVlIGlmIHRoZSBwcm9ncmFtIHdhcyBleGVjdXRlZCAgPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN0cmxcIj50aGUgc291cmNlIGNvbnRyb2w8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInByb21wdFwiPmlmIHRydWUgdGhlbiB0aGUgY2FsbGVyIGlzIGV4ZWN1dGluZyB0aGUgY2FsbGVkIHByb2dyYW0gYXQgdGhlIGVuZCBvZiBjb250cm9sIHByZWZpeDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcm90ZWN0ZWQgYXN5bmMgc2VsZWN0UHJvZyhjdHJsOiBNZ0NvbnRyb2wpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCBjbWQ6IElDbGllbnRDb21tYW5kO1xyXG4gICAgbGV0IHZhbHVlOiBTdHJpbmc7XHJcbiAgICBsZXQgbWdWYWw6IHN0cmluZztcclxuICAgIGxldCBwcm9nRXhlY3V0ZWQgPSBmYWxzZTtcclxuICAgIGxldCB0YXNrID0gPFRhc2s+Y3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpO1xyXG5cclxuICAgIC8vIGNoZWNrIGlmIHRoZXJlIGlzIHNlbGVjdCBwcm9ncmFtIHRvIHRoZSBjb250cm9sXHJcbiAgICBpZiAoY3RybC5IYXNTZWxlY3RQcm9ncmFtKCkpIHtcclxuICAgICAgLy9jaGVjayBpZiB0aGUgY29udHJvbCBpcyBwYXJrYWJsZVxyXG4gICAgICBpZiAoY3RybC5Jc1BhcmthYmxlKCkpIHtcclxuXHJcbiAgICAgICAgdmFsdWUgPSBNYW5hZ2VyLkdldEN0cmxWYWwoY3RybCk7XHJcblxyXG4gICAgICAgIC8vIHZhbGlkYXRlIHRoZSBjb250cm9scyB2YWx1ZVxyXG4gICAgICAgIGlmICghY3RybC52YWxpZGF0ZUFuZFNldFZhbHVlKHZhbHVlLCBmYWxzZSkpXHJcbiAgICAgICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb24odHJ1ZSk7XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBsZXQgZW5jb2RlZFZhbDogc3RyaW5nID0gbnVsbDtcclxuICAgICAgICAgIG1nVmFsID0gYXdhaXQgY3RybC5nZXRNZ1ZhbHVlKHZhbHVlKTtcclxuICAgICAgICAgIHZhciByZWMgPSAoPERhdGFWaWV3PnRhc2suRGF0YVZpZXcpLmdldEN1cnJSZWMoKTtcclxuICAgICAgICAgIGVuY29kZWRWYWwgPSByZWMuZ2V0WE1MRm9yVmFsdWUoY3RybC5nZXRGaWVsZCgpLmdldElkKCksIG1nVmFsKTtcclxuICAgICAgICAgIGNtZCA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZVNlbGVjdFByb2dyYW1Db21tYW5kKHRhc2suZ2V0VGFza1RhZygpLCBudWxsLCBJbnQzMi5NaW5WYWx1ZSwgY3RybC5nZXREaXRJZHgoKSwgZW5jb2RlZFZhbCk7XHJcbiAgICAgICAgICB0YXNrLmdldE1HRGF0YSgpLkNtZHNUb1NlcnZlci5BZGQoY21kKTtcclxuXHJcbiAgICAgICAgICBsZXQgY29tbWFuZHNQcm9jZXNzb3JTZXJ2ZXI6IENvbW1hbmRzUHJvY2Vzc29yQmFzZSA9IENvbW1hbmRzUHJvY2Vzc29yTWFuYWdlci5HZXRDb21tYW5kc1Byb2Nlc3NvcigpO1xyXG4gICAgICAgICAgYXdhaXQgY29tbWFuZHNQcm9jZXNzb3JTZXJ2ZXIuRXhlY3V0ZShDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2VuZGluZ0luc3RydWN0aW9uLlRBU0tTX0FORF9DT01NQU5EUyk7XHJcblxyXG4gICAgICAgICAgcHJvZ0V4ZWN1dGVkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBwcm9nRXhlY3V0ZWQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVDb250cm9sVmVyaWZpY2F0aW9uKHRhc2s6IFRhc2spOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuXHJcbiAgICAvLyBjaGVjayBhbGwgaGFuZGxlcnMgaWYgaXQgaXMgY29udHJvbCB2ZXJpZmljYXRpb24uIEV4ZWN1dGUgYWxsIFNWIGhhbmRsZXJzXHJcbiAgICBsZXQgdGFibGU6IEhhbmRsZXJzVGFibGUgPSB0YXNrLmdldEhhbmRsZXJzVGFiKCk7XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGFibGUuZ2V0U2l6ZSgpOyBpKyspIHtcclxuICAgICAgbGV0IGhhbmRsZXI6IEV2ZW50SGFuZGxlciA9IHRhYmxlLmdldEhhbmRsZXIoaSk7XHJcbiAgICAgIGxldCBldnQ6IEV2ZW50ID0gaGFuZGxlci5nZXRFdmVudCgpO1xyXG4gICAgICBpZiAoZXZ0LmdldEludGVybmFsQ29kZSgpID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9WRVJJRklDQVRJT04pIHtcclxuICAgICAgICBsZXQgY29udHJvbDogTWdDb250cm9sID0gKCh0YXNrLmdldEZvcm0oKSAhPT0gbnVsbCkgPyAoPE1nRm9ybT50YXNrLmdldEZvcm0oKSkuZ2V0Q3RybEJ5Q3RybE5hbWUoaGFuZGxlci5nZXRDdHJsTmFtZSgpKSA6IG51bGwpO1xyXG4gICAgICAgIGlmICghaXNOdWxsT3JVbmRlZmluZWQoY29udHJvbCkpIHtcclxuICAgICAgICAgIGxldCBydW5UaW1lRXZlbnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQoY29udHJvbCk7XHJcbiAgICAgICAgICBydW5UaW1lRXZlbnQuc2V0SW50ZXJuYWwoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfVkVSSUZJQ0FUSU9OKTtcclxuICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRXZlbnQocnVuVGltZUV2ZW50LCBmYWxzZSk7XHJcbiAgICAgICAgICBpZiAodGhpcy5fc3RvcEV4ZWN1dGlvbikge1xyXG4gICAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBlcnJvciwgcGFyay9mb2N1cyBvbiB0aGlzIGNvbnRyb2wgd2hlcmUgZXJyb3Igb2NjdXJzIGluIENWIGV4ZWN1dGlvbi5cclxuICAgICAgICAgICAgTGFzdEZvY3VzZWRNYW5hZ2VyLnNldExhc3RGb2N1c2VkQ29udHJvbCh0YXNrLCBjb250cm9sKTtcclxuICAgICAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uQ3RybChudWxsKTtcclxuICAgICAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uQ3RybChjb250cm9sKTtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBvbkFjdFNlbGVjdGlvbihjdHJsOiBNZ0NvbnRyb2wsIGZvcm06IE1nRm9ybSwgZXZ0OiBSdW5UaW1lRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBkaXNwbGF5TGluZTogbnVtYmVyID0gZXZ0LmdldERpc3BsYXlMaW5lKCk7XHJcbiAgICBpZiAoZGlzcGxheUxpbmUgPT09IEludDMyLk1pblZhbHVlKVxyXG4gICAgICBkaXNwbGF5TGluZSA9IGZvcm0uRGlzcGxheUxpbmU7XHJcblxyXG4gICAgbGV0IHNpbXVsYXRlOiBib29sZWFuID0gY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9DSEVDS0JPWCB8fCBjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0xJU1QgfHwgY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9SQURJTyB8fCBjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0JVVFRPTiB8fCAoY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9UQUIgJiYgIWV2dC5pc1Byb2R1Y2VDbGljaygpKTtcclxuICAgIGlmIChzaW11bGF0ZSlcclxuICAgICAgYXdhaXQgdGhpcy5zaW11bGF0ZVNlbGVjdGlvbihjdHJsLCBldnQuZ2V0VmFsdWUoKSwgZGlzcGxheUxpbmUsIGV2dC5pc1Byb2R1Y2VDbGljaygpKTtcclxuICAgIGVsc2VcclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVTZWxlY3Rpb24oY3RybCwgZGlzcGxheUxpbmUsIGV2dC5nZXRWYWx1ZSgpKTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgSGFuZGxlIHRoZSBNR19BQ1RfU1VCRk9STV9DTE9TRVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmb3JtXCI+XHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJldnRcIj5cclxuICAvLy8gPC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIG9uU3ViZm9ybUNsb3NlKHRhc2s6IFRhc2ssIGV2dDogUnVuVGltZUV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XHJcblxyXG4gICAgaWYgKChldnQuZ2V0QXJnTGlzdCgpICE9IG51bGwpICYmIChldnQuZ2V0QXJnTGlzdCgpLmdldFNpemUoKSA9PT0gMSkpIHtcclxuICAgICAgbGV0IHN1YmZvcm1DdHJsOiBNZ0NvbnRyb2wgPSBudWxsO1xyXG4gICAgICBsZXQgY2xvc2luZ1N1YmZvcm1OYW1lOiBzdHJpbmcgPSBhd2FpdCBldnQuZ2V0QXJnTGlzdCgpLmdldEFyZ1ZhbHVlKDAsIFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEEsIDApO1xyXG5cclxuICAgICAgLy8gUUNSICMyODMxMTQuIEFyZ3VtZW50IG9mICdTdWJmb3JtIHJlZnJlc2ggZXZlbnQnIGNhbiBiZSBza2lwcGVkIG9yIG5vdCBleGlzdC5cclxuICAgICAgaWYgKGNsb3NpbmdTdWJmb3JtTmFtZSA9PSBudWxsKVxyXG4gICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgIC8vIFJTIG11c3QgYmUgZXhlY3V0ZWQgb25seSBpZiB0aGUgY3VycmVudCBzdWJmb3JtIGlzIHJlZnJlc2hlZC5cclxuICAgICAgLy8gSWYgaXRzIGJyb3RoZXIgaXMgcmVmcmVzaGVkIHdlIGRvIG5vdCBuZWVkIHRvIGV4ZWN1dGUgUlMgb2YgdGhlIGN1cnJlbnQgdGFzay5cclxuICAgICAgZm9yIChsZXQgcGFyZW50VGFzazogVGFzayA9IHRhc2s7IHBhcmVudFRhc2suZ2V0Rm9ybSgpICE9IG51bGwgJiYgcGFyZW50VGFzay5nZXRNZ2RJRCgpID09PSB0YXNrLmdldE1nZElEKCk7IHBhcmVudFRhc2sgPSA8VGFzaz5wYXJlbnRUYXNrLmdldFBhcmVudCgpKSB7XHJcbiAgICAgICAgc3ViZm9ybUN0cmwgPSA8TWdDb250cm9sPnBhcmVudFRhc2suZ2V0Rm9ybSgpLmdldEN0cmxCeU5hbWUoY2xvc2luZ1N1YmZvcm1OYW1lLnRyaW0oKSwgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfU1VCRk9STSk7XHJcbiAgICAgICAgaWYgKHN1YmZvcm1DdHJsICE9IG51bGwpIHtcclxuICAgICAgICAgIGxldCBzdWJmb3JtVGFzazogVGFzayA9IDxUYXNrPnN1YmZvcm1DdHJsLmdldFN1YmZvcm1UYXNrKCk7XHJcbiAgICAgICAgICAvLyBJZiB0aGUgc3ViZm9ybSB0YXNrIHdhcyBub3Qgb3BlbmVkIHlldCwgYnV0IHN1YmZvcm0gcmVmcmVzaCBpcyBkb25lLFxyXG4gICAgICAgICAgLy8gaXQncyBuZWVkZWQgdG8gb3BlbiB0aGUgc3ViZm9ybS4gUUNSICM0MTU5MTQuXHJcbiAgICAgICAgICBpZiAoc3ViZm9ybVRhc2sgIT0gbnVsbCAmJiAhc3ViZm9ybVRhc2suSXNSb3V0ZSgpKSB7XHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBlcmZvcm1TdWJmb3JtQ2xvc2Uoc3ViZm9ybUN0cmwpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHBlcmZvcm1TdWJmb3JtQ2xvc2UoKSAgIDogQ2xvc2VzIHRoZSBzdWJmb3JtIHRhc2sgb3BlbmVkIGluIHRoZSBzdWJmb3JtQ3RybFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzdWJmb3JtQ3RybFwiPlxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIHB1YmxpYyBhc3luYyBwZXJmb3JtU3ViZm9ybUNsb3NlKHN1YmZvcm1DdHJsOiBNZ0NvbnRyb2wpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBzdWJmb3JtVGFzazogVGFzayA9IDxUYXNrPnN1YmZvcm1DdHJsLmdldFN1YmZvcm1UYXNrKCk7XHJcbiAgICBsZXQgcGFyZW50VGFzazogVGFzayA9IDxUYXNrPnN1YmZvcm1DdHJsLmdldEZvcm0oKS5nZXRUYXNrKCk7XHJcblxyXG4gICAgbGV0IG1nZDogTUdEYXRhID0gc3ViZm9ybVRhc2suZ2V0TUdEYXRhKCk7XHJcbiAgICB0aGlzLnB1c2hOZXdFeGVjU3RhY2tzKCk7XHJcbiAgICBhd2FpdCBzdWJmb3JtVGFzay5lbmRUYXNrKHRydWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7XHJcbiAgICB0aGlzLnBvcE5ld0V4ZWNTdGFja3MoKTtcclxuICAgIGlmICghdGhpcy5fc3RvcEV4ZWN1dGlvbikge1xyXG4gICAgICBwYXJlbnRUYXNrLlRhc2tTZXJ2aWNlLlJlbW92ZVJlY29tcHV0ZXMocGFyZW50VGFzayk7XHJcbiAgICAgIGF3YWl0IHN1YmZvcm1UYXNrLnN0b3AoKTtcclxuXHJcbiAgICAgIHN1YmZvcm1DdHJsLnJlc2V0U3ViZm9ybVRhc2soKTtcclxuICAgICAgYXdhaXQgQ29tbWFuZHNQcm9jZXNzb3JNYW5hZ2VyLkdldENvbW1hbmRzUHJvY2Vzc29yKCkuRXhlY3V0ZShDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2VuZGluZ0luc3RydWN0aW9uLlRBU0tTX0FORF9DT01NQU5EUyk7XHJcbiAgICAgIENvbW1hbmRzLmFkZENsb3Nlc3ViZm9ybShDb21tYW5kVHlwZS5DTE9TRV9TVUJfRk9STSwgc3ViZm9ybUN0cmwsIHN1YmZvcm1UYXNrLmdldFRhc2tUYWcoKSwgKDxNZ0NvbnRyb2xCYXNlPnN1YmZvcm1DdHJsKS5nZXROYW1lKCksIHN1YmZvcm1UYXNrLmdldEZvcm0oKS5idWlsZEZvcm1OYW1lKCkpO1xyXG5cclxuICAgICAgLy8gU2V0IG1nZC5hYm9ydCgpLCBpbiBvcmRlciB0byBjbG9zZSBjdXJyZW50IGV2ZW50IGxvb3Agb2YgTW9kYWwgc3ViZm9ybS5cclxuICAgICAgLy8gYW5kIHJlc2V0IGl0IGJhY2sgdG8gZmFsc2Ugb25jZSBpdCBjb21lcyBvdXQgb2YgY3VycmVudCBldmVudHNsb29wKCkuXHJcbiAgICAgIGlmICgoPE1nQ29udHJvbEJhc2U+c3ViZm9ybUN0cmwpLklzTW9kYWwoKSlcclxuICAgICAgICBtZ2QuYWJvcnQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNhbGN1bGF0ZSBhcmd1bWVudHMgZm9yIGV2ZW50c1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJldnRcIj4gPC9wYXJhbT5cclxuICBwcml2YXRlIGNyZWF0ZUV2ZW50QXJndW1lbnRzKGV2dDogUnVuVGltZUV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoZXZ0LmdldEFyZ0xpc3QoKSA9PT0gbnVsbCkge1xyXG4gICAgICBpZiAoZXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9JTlRFUk5BTCkge1xyXG4gICAgICAgIHN3aXRjaCAoZXZ0LmdldEludGVybmFsQ29kZSgpKSB7XHJcbiAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRhc2tcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImRvU3VmZml4XCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGFzeW5jIERvVGFza0xldmVsUmVjb3JkU3VmZml4KHRhc2s6IFRhc2tCYXNlLCByZWZEb1N1ZmZpeDogUmVmUGFyYW08Ym9vbGVhbj4pOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCBzaG91bGRSZXR1cm46IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGlmICh0YXNrLmdldExldmVsKCkgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX1JFQ09SRCkge1xyXG4gICAgICByZWZEb1N1ZmZpeC52YWx1ZSA9IGZhbHNlO1xyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcbiAgICAgIGlmICh0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpXHJcbiAgICAgICAgc2hvdWxkUmV0dXJuID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gc2hvdWxkUmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidGFza1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZm9ybVwiPjwvcGFyYW0+XHJcbiAgYXN5bmMgRG9UYXNrTGV2ZWxSZWNvcmRQcmVmaXgodGFzazogVGFza0Jhc2UpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBkbyB0aGUgbWFnaWMgZGVmYXVsdCBvcGVyYXRpb25zIGFjY29yZGluZyB0byB0aGUgaW50ZXJuYWwgZXZlbnQgY29kZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJldnRcIj50aGUgZXZlbnQgdG8gaGFuZGxlIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0ZWxscyB0aGUgY2FsbGVyIHdoZXRoZXIgdG8gY29udGludWUgaGFuZGxpbmcgdGhlIGV2ZW50IDwvcmV0dXJucz5cclxuICBwcml2YXRlIGFzeW5jIGNvbW1vbkhhbmRsZXIoZXZ0OiBSdW5UaW1lRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCB0YXNrOiBUYXNrID0gPFRhc2s+ZXZ0LmdldFRhc2soKTtcclxuICAgIGxldCBtZ0RhdGE6IE1HRGF0YSA9IHRhc2suZ2V0TUdEYXRhKCk7XHJcbiAgICBsZXQgZm9ybTogTWdGb3JtID0gPE1nRm9ybT50YXNrLmdldEZvcm0oKTtcclxuICAgIGxldCBjdHJsOiBNZ0NvbnRyb2wgPSA8TWdDb250cm9sPmV2dC5Db250cm9sO1xyXG4gICAgbGV0IGxhc3RQYXJrZWRDdHJsOiBNZ0NvbnRyb2w7XHJcbiAgICBsZXQgZG9TdWZmaXg6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgbGV0IG9sZE1vZGU6IHN0cmluZztcclxuICAgIGxldCBzZXJ2ZXI6IENvbW1hbmRzUHJvY2Vzc29yQmFzZSA9IFRhc2suQ29tbWFuZHNQcm9jZXNzb3I7XHJcblxyXG4gICAgaWYgKHRoaXMuX3N0b3BFeGVjdXRpb24pXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICAvLyBpZiB0aGlzIGlzIGEgdXNlciBldmVudCB0aGF0IGNvbnZlcnRzIHRvIGEgc3lzdGVtIG9yIGludGVybmFsIGV2ZW4sIGNvbnZlcnQgaXRcclxuICAgIGlmIChldnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX1VTRVIpXHJcbiAgICAgIGV2dCA9IG5ldyBSdW5UaW1lRXZlbnQoZXZ0LmdldFVzZXJFdmVudCgpLCBldnQpO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMucHVzaFJ0RXZlbnQoZXZ0KTtcclxuXHJcbiAgICAgIGlmIChldnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX1NZU1RFTSkge1xyXG4gICAgICAgIGxldCBhY3RJZDogbnVtYmVyID0gdGhpcy5nZXRNYXRjaGluZ0FjdGlvbihldnQuZ2V0S2JkSXRtKCkpO1xyXG4gICAgICAgIGlmIChhY3RJZCAhPT0gMClcclxuICAgICAgICAvLyBoYW5kbGVkIGludGVybmFsbHlcclxuICAgICAgICB7XHJcbiAgICAgICAgICBldnQgPSBuZXcgUnVuVGltZUV2ZW50KGV2dCwgZXZ0KTtcclxuICAgICAgICAgIGV2dC5zZXRJbnRlcm5hbChhY3RJZCk7XHJcbiAgICAgICAgICBldnQuc2V0QXJnTGlzdChudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0vLyBlbmQgb2Ygc3lzdGVtIGV2ZW50cyBwcm9jZXNzaW5nXHJcblxyXG4gICAgICAvLyBleGVjdXRlIHRoZSBjb21tb24gaGFuZGxpbmcgb2YgaW50ZXJuYWwgZXZlbnRzIG9ubHkgaWYgdGhleSBhcmUgbm90IGltbWVkaWF0ZS5cclxuICAgICAgLy8gYW4gZXZlbnQgaXMgaW1tZWRpYXRlIHdoZW4gaXQgd2FzIHJhaXNlZCBieSBhIHJhaXNlIGV2ZW50IG9wZXJhdGlvbiB0aGF0IGl0c1xyXG4gICAgICAvLyB3YWl0IGNvbmRpdGlvbiBpcyB5ZXMgb3IgZXZhbHVhdGVzIHRvIHRydWUuXHJcbiAgICAgIGxldCBjbWQ6IElDbGllbnRDb21tYW5kO1xyXG4gICAgICBpZiAoZXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9JTlRFUk5BTCAmJiAhZXZ0LmlzSW1tZWRpYXRlKCkgJiYgdGhpcy5BY3RBbGxvd2VkKGV2dC5nZXRJbnRlcm5hbENvZGUoKSkgJiYgIXRoaXMuX3Byb2Nlc3NpbmdUb3BNb3N0RW5kVGFzaykge1xyXG4gICAgICAgIGxldCBjbWRzVG9TZXJ2ZXI6IENvbW1hbmRzVGFibGUgPSA8Q29tbWFuZHNUYWJsZT5tZ0RhdGEuQ21kc1RvU2VydmVyO1xyXG4gICAgICAgIGxldCBkdjogRGF0YVZpZXcgPSA8RGF0YVZpZXc+dGFzay5EYXRhVmlldztcclxuICAgICAgICBsZXQgcmVjOiBSZWNvcmQgPSBkdi5nZXRDdXJyUmVjKCk7XHJcblxyXG4gICAgICAgIGxldCBpbnRFdnRDb2RlOiBudW1iZXIgPSBldnQuZ2V0SW50ZXJuYWxDb2RlKCk7XHJcblxyXG4gICAgICAgIC8vIGZvciBpbnRlcm5hbCBldmVudHNcclxuICAgICAgICBzd2l0Y2ggKGludEV2dENvZGUpIHtcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9TVUJGT1JNX0NMT1NFOlxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLm9uU3ViZm9ybUNsb3NlKHRhc2ssIGV2dCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9CVVRUT046XHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX0hJVDpcclxuICAgICAgICAgICAgLy8gaWYgYnV0dG9uIGlzIG5vdCBwYXJrYWJsZSwgcmFpc2UgaXRzIGV2ZW50IG9ubHkgaWYgdGhlIGFjdGlvbiB3YXMgbm90IHRyaWdnZXJlZCBieSBndWkuXHJcbiAgICAgICAgICAgIC8vIGRpcmVjdCBjbGljayBvbiB0aGUgYnV0dG9uIHdpbGwgZ2V0IGhlcmUgYXMgY3RybCBoaXQgLCBidXQgaXMgbm90IHRyaWdnZXJlZCBieSBndWkgKGdvZXMgdmlhIHNlbGVjdGlvbiBldmVudCAxc3QpXHJcbiAgICAgICAgICAgIC8vIG90aGVyIGN0cmxfaGl0IGFjdGlvbnMgc2hvdWxkIGNvbnNpZGVyIHRoZSBwYXJrYWJpbGl0eVxyXG4gICAgICAgICAgICBpZiAoY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9CVVRUT04gJiZcclxuICAgICAgICAgICAgICAoaW50RXZ0Q29kZSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0JVVFRPTiB8fCAhZXZ0LmlzR3VpVHJpZ2dlcmVkRXZlbnQoKSB8fCBjdHJsLmlzUGFya2FibGUodHJ1ZSkpKSB7XHJcbiAgICAgICAgICAgICAgbGV0IGFSdEV2dCA9IG5ldyBSdW5UaW1lRXZlbnQoY3RybCk7XHJcbiAgICAgICAgICAgICAgaWYgKGN0cmwuZ2V0UnRFdnRUYXNrKCkgIT0gbnVsbClcclxuICAgICAgICAgICAgICAgIGFSdEV2dC5zZXRUYXNrKGN0cmwuZ2V0UnRFdnRUYXNrKCkpO1xyXG4gICAgICAgICAgICAgIGlmIChDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX05PTkUgIT09IGFSdEV2dC5nZXRUeXBlKCkpIHtcclxuICAgICAgICAgICAgICAgIGlmIChjdHJsLnVzZVpvb21IYW5kbGVyKCkpIHtcclxuICAgICAgICAgICAgICAgICAgbGV0IHRhc2tUb0VuYWJsZTogVGFzayA9IDxUYXNrPmFSdEV2dC5nZXRUYXNrKCk7XHJcbiAgICAgICAgICAgICAgICAgIGlmICh0YXNrVG9FbmFibGUgIT0gbnVsbClcclxuICAgICAgICAgICAgICAgICAgICB0YXNrVG9FbmFibGUuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1pPT00sIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYVJ0RXZ0LnNldEFyZ0xpc3QoY3RybC5BcmdMaXN0KTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGFSdEV2dC5zZXRQdWJsaWNOYW1lKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFkZFRvVGFpbChhUnRFdnQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja0FuZFNhdmVSb3V0ZUV2ZW50SWZDdHhSZW1vdmVkRnJvbVNydnIoYVJ0RXZ0KTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9UQUIpIHtcclxuICAgICAgICAgICAgICAvLyBGaXhlZCBidWcgIzcyNDE1MDogYXMgd2UgZG9pbmcgZm9yIG9ubGluZSBmb3IgdGFiIGNvbnRyb2wgd2Ugc2VuZCBBQ1RfWk9PTSAoQ2hvaWNlaW5wLmNwcCA6OkRpdEdldCgpKVxyXG4gICAgICAgICAgICAgIHRoaXMuYWRkSW50ZXJuYWxFdmVudFdpdGhDdHJsQW5kQ29kZShjdHJsLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfWk9PTSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9SQURJTykge1xyXG4gICAgICAgICAgICAgIGN0cmwuc2V0Q29udHJvbFRvRm9jdXMoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVE9HR0xFX0lOU0VSVDpcclxuICAgICAgICAgICAgUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLlRvZ2dsZUluc2VydE1vZGUoKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ0xPU0U6XHJcbiAgICAgICAgICAgIGxldCBydEV2dCA9IG5ldyBSdW5UaW1lRXZlbnQoZXZ0LCBldnQpO1xyXG4gICAgICAgICAgICBydEV2dC5zZXRJbnRlcm5hbChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRVhJVCk7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkVG9UYWlsKHJ0RXZ0KTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRVhJVDpcclxuICAgICAgICAgICAgLy8gaWYgJ2V4aXQnIGFjY2VwdGVkIG9uIE1ESSwgZXhpdCB0aGUgdG9wIG1vc3QgdGFzay4gc2FtZSBhcyB3aGVuIGV4aXRpbmcgdGhlIHN5c3RlbS5cclxuICAgICAgICAgICAgbGV0IHRhc2tUb0VuZDogVGFzayA9ICh0YXNrLmlzTWFpblByb2coKSA/IE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuU3RhcnR1cE1nRGF0YS5nZXRGaXJzdFRhc2soKSA6IHRhc2spO1xyXG4gICAgICAgICAgICBhd2FpdCB0YXNrVG9FbmQuZW5kVGFzayhldnQucmV2ZXJzaWJsZUV4aXQoKSwgZmFsc2UsIGV2dC5FeGl0RHVlVG9FcnJvcigpKTtcclxuXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VYSVRfU1lTVEVNOlxyXG4gICAgICAgICAgICAvLyBlbmQgdGhlIHRvcCBtb3N0IHRhc2sgd2l0aCBmb3JtLlxyXG4gICAgICAgICAgICBhd2FpdCBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLlN0YXJ0dXBNZ0RhdGEuZ2V0Rmlyc3RUYXNrKCkuZW5kVGFzayhldnQucmV2ZXJzaWJsZUV4aXQoKSwgZmFsc2UsXHJcbiAgICAgICAgICAgICAgZmFsc2UpO1xyXG4gICAgICAgICAgICAvLyBHZXRUb3BNb3N0VGFza1dpdGhGb3JtKHRhc2spLmVuZFRhc2soZXZ0LnJldmVyc2libGVFeGl0KCksIGZhbHNlLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9OWFRMSU5FOlxyXG4gICAgICAgICAgICBpZiAoZm9ybSAhPSBudWxsKVxyXG4gICAgICAgICAgICAgIGF3YWl0IGZvcm0ubW92ZUluVmlldyhDb25zdGFudHMuTU9WRV9VTklUX1JPVywgQ29uc3RhbnRzLk1PVkVfRElSRUNUSU9OX05FWFQpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfUFJWTElORTpcclxuICAgICAgICAgICAgaWYgKGZvcm0gIT0gbnVsbClcclxuICAgICAgICAgICAgICBhd2FpdCBmb3JtLm1vdmVJblZpZXcoQ29uc3RhbnRzLk1PVkVfVU5JVF9ST1csIENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9QUkVWKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX05YVFBBR0U6XHJcbiAgICAgICAgICAgIGlmIChmb3JtICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgYXdhaXQgZm9ybS5tb3ZlSW5WaWV3KENvbnN0YW50cy5NT1ZFX1VOSVRfUEFHRSwgQ29uc3RhbnRzLk1PVkVfRElSRUNUSU9OX05FWFQpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfUFJWUEFHRTpcclxuICAgICAgICAgICAgaWYgKGZvcm0gIT0gbnVsbClcclxuICAgICAgICAgICAgICBhd2FpdCBmb3JtLm1vdmVJblZpZXcoQ29uc3RhbnRzLk1PVkVfVU5JVF9QQUdFLCBDb25zdGFudHMuTU9WRV9ESVJFQ1RJT05fUFJFVik7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9CRUdQQUdFOlxyXG4gICAgICAgICAgICBpZiAoZm9ybSAhPSBudWxsKVxyXG4gICAgICAgICAgICAgIGF3YWl0IGZvcm0ubW92ZUluVmlldyhDb25zdGFudHMuTU9WRV9VTklUX1BBR0UsIENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9CRUdJTik7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9FTkRQQUdFOlxyXG4gICAgICAgICAgICBpZiAoZm9ybSAhPSBudWxsKVxyXG4gICAgICAgICAgICAgIGF3YWl0IGZvcm0ubW92ZUluVmlldyhDb25zdGFudHMuTU9WRV9VTklUX1BBR0UsIENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9FTkQpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfQkVHVEJMOlxyXG4gICAgICAgICAgICAvLyAjOTE4NTg4OiBJZiBjdHJsK2hvbWUvY3RybCtlbmQgcHJlc3NlZCB3aGVuIHBhcmtlZCBvbiBsaXN0Ym94XHJcbiAgICAgICAgICAgIC8vIHRoZW4gQmVnaW4gdGFibGUgZXZlbnQgc2hvdWxkIG5vdCBiZSBoYW5kbGVkLlxyXG4gICAgICAgICAgICBsYXN0UGFya2VkQ3RybCA9IDxNZ0NvbnRyb2w+dGFzay5nZXRMYXN0UGFya2VkQ3RybCgpO1xyXG4gICAgICAgICAgICBpZiAobGFzdFBhcmtlZEN0cmwgPT0gbnVsbCB8fCAhbGFzdFBhcmtlZEN0cmwuaXNMaXN0Qm94KCkpIHtcclxuICAgICAgICAgICAgICBpZiAoZm9ybSAhPSBudWxsKVxyXG4gICAgICAgICAgICAgICAgYXdhaXQgZm9ybS5tb3ZlSW5WaWV3KENvbnN0YW50cy5NT1ZFX1VOSVRfVEFCTEUsIENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9CRUdJTik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX0VORFRCTDpcclxuICAgICAgICAgICAgLy8gIzkxODU4ODogSWYgY3RybCtob21lL2N0cmwrZW5kIHByZXNzZWQgd2hlbiBwYXJrZWQgb24gbGlzdGJveFxyXG4gICAgICAgICAgICAvLyB0aGVuIEJlZ2luIHRhYmxlIGV2ZW50IHNob3VsZCBub3QgYmUgaGFuZGxlZC5cclxuICAgICAgICAgICAgbGFzdFBhcmtlZEN0cmwgPSA8TWdDb250cm9sPnRhc2suZ2V0TGFzdFBhcmtlZEN0cmwoKTtcclxuICAgICAgICAgICAgaWYgKGxhc3RQYXJrZWRDdHJsID09PSBudWxsIHx8ICFsYXN0UGFya2VkQ3RybC5pc0xpc3RCb3goKSkge1xyXG4gICAgICAgICAgICAgIGlmIChmb3JtICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgICBhd2FpdCBmb3JtLm1vdmVJblZpZXcoQ29uc3RhbnRzLk1PVkVfVU5JVF9UQUJMRSwgQ29uc3RhbnRzLk1PVkVfRElSRUNUSU9OX0VORCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfV0VCX09OX0RCTElDSzoge1xyXG4gICAgICAgICAgICAvLyBVbmxpa2UgT25saW5lLCBoZXJlIFNFTEVDVCBvciBaT09NIGNvbWVzIGFmdGVyIHRoZSBEQkNMSUNLLlxyXG4gICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIERCQ0xJQ0sgaGFuZGxlciB3aXRoIHByb3BvZ2F0ZSA9ICdOTycgLCB0aGVzZSBhY3Rpb25zIHdpbGwgbm90IGJlIHJhaXNlZC5cclxuICAgICAgICAgICAgbGV0IGN0cmxUeXBlOiBNZ0NvbnRyb2xUeXBlID0gY3RybC5UeXBlO1xyXG4gICAgICAgICAgICBsZXQgcHV0QWN0aW9uOiBudW1iZXIgPSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfTk9ORTtcclxuICAgICAgICAgICAgaWYgKGN0cmxUeXBlICE9PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9UQUJMRSAmJiBjdHJsVHlwZSAhPT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfTEFCRUwgJiZcclxuICAgICAgICAgICAgICBjdHJsVHlwZSAhPT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfSU1BR0UpIHtcclxuICAgICAgICAgICAgICBpZiAoY3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpLkFjdGlvbk1hbmFnZXIuaXNFbmFibGVkKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9TRUxFQ1QpKVxyXG4gICAgICAgICAgICAgICAgcHV0QWN0aW9uID0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1NFTEVDVDtcclxuICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChjdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkuQWN0aW9uTWFuYWdlci5pc0VuYWJsZWQoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1pPT00pKVxyXG4gICAgICAgICAgICAgICAgICBwdXRBY3Rpb24gPSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfWk9PTTtcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIGlmIChwdXRBY3Rpb24gIT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9OT05FKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRJbnRlcm5hbEV2ZW50V2l0aEN0cmxBbmRDb2RlKGN0cmwsIHB1dEFjdGlvbik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfREVMTElORTpcclxuICAgICAgICAgICAgaWYgKGF3YWl0IHRoaXMuSGFuZGxlQWN0aW9uRGVsbGluZSh0YXNrLCBkdiwgcmVjLCBmYWxzZSkpXHJcbiAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DUkVMSU5FOlxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1JFTElORV9BQk9WRTpcclxuICAgICAgICAgICAgaWYgKHRhc2suRGF0YVZpZXcuaXNFbXB0eURhdGF2aWV3KCkpIHtcclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLmdvdG9DcmVhdGVNb2RlKHRhc2spO1xyXG5cclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGFzay5nZXRJbkNyZWF0ZUxpbmUoKSlcclxuICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIHRhc2suc2V0SW5DcmVhdGVMaW5lKHRydWUpO1xyXG5cclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICBpZiAodGFzay5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9DT05UUk9MKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoTWdDb250cm9sQmFzZSh0YXNrLmdldExhc3RQYXJrZWRDdHJsKCksIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1NVRkZJWCk7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKVxyXG4gICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAvLyB2ZXJpZnkgdGhhdCB0aGUgY3VycmVudCByZWNvcmQgaXMgbm90IGFscmVhZHkgYSBuZXcgb25lXHJcbiAgICAgICAgICAgICAgaWYgKHRhc2suZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSAmJiByZWMgIT0gbnVsbCAmJiAhcmVjLk1vZGlmaWVkKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoYXdhaXQgdGFzay5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRk9SQ0VfU1VGRklYLCBmYWxzZSkpIHtcclxuICAgICAgICAgICAgICAgICAgZG9TdWZmaXggPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG4gICAgICAgICAgICAgICAgICBpZiAodGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpIHx8IHRhc2suaXNBYm9ydGluZygpKVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIHRhc2suc2V0TGV2ZWwoQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSyk7XHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpICYmIGZvcm0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIERlZmVjdCAxNTIzNTU6IFBhcmsgb24gbGFzdFBhcmtlZENvbnRyb2wgaWYgbmV4dFNjcmVlbiBldmVudCBvY2N1cnMgaWYgYWxyZWFkeSBpbiBjcmVhdGUgbW9kZSBhbmQgcmVjb3JkIG5vdCBtb2RpZmllZFxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBsYXN0UGFya2VkQ29udHJvbDogTWdDb250cm9sID0gPE1nQ29udHJvbD50YXNrLmdldExhc3RQYXJrZWRDdHJsKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RQYXJrZWRDb250cm9sICE9PSBudWxsKVxyXG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgbGFzdFBhcmtlZENvbnRyb2wuaW52b2tlKCk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBsZXQgcmVmRG9TdWZmaXg6IFJlZlBhcmFtPGJvb2xlYW4+ID0gbmV3IFJlZlBhcmFtKGRvU3VmZml4KTtcclxuICAgICAgICAgICAgICBpZiAoYXdhaXQgdGhpcy5Eb1Rhc2tMZXZlbFJlY29yZFN1ZmZpeCh0YXNrLCByZWZEb1N1ZmZpeCkpXHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgZG9TdWZmaXggPSByZWZEb1N1ZmZpeC52YWx1ZTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKGZvcm0gIT0gbnVsbCkge1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICgodGFzay5nZXRNb2RlKCkgIT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKSB8fCAhdGFzay5Db25maXJtVXBkYXRlTm8pXHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IGZvcm0uYWRkUmVjKGRvU3VmZml4LCBpbnRFdnRDb2RlID09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DUkVMSU5FX0FCT1ZFID8gdHJ1ZSA6IGZhbHNlKTtcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuRG9UYXNrTGV2ZWxSZWNvcmRQcmVmaXgodGFzayk7XHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5IYW5kbGVBY3RFbnRlclJvd0VkaXRpbmcodGFzayk7XHJcblxyXG4gICAgICAgICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgICAgICAgIHRhc2suc2V0SW5DcmVhdGVMaW5lKGZhbHNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DQU5DRUw6XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuSGFuZGxlQWN0Q2FuY2VsKGV2dCwgdGFzaywgZm9ybSwgY3RybCwgcmVjLCB0cnVlKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRU5URVJfUk9XX0VESVRJTkc6XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuSGFuZGxlQWN0RW50ZXJSb3dFZGl0aW5nKHRhc2spO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9RVUlUOlxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUVVJVCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUT19DUkVBVEU6XHJcbiAgICAgICAgICAgIGlmICh0YXNrLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUgfHxcclxuICAgICAgICAgICAgICBhd2FpdCAodGFzay5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX09QVElPTikpLmdldFZhbHVlQm9vbGVhbigpKSB7XHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5nb3RvQ3JlYXRlTW9kZSh0YXNrKTtcclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRPX1FVRVJZOlxyXG4gICAgICAgICAgICBpZiAodGFzay5nZXRNb2RlKCkgIT09IENvbnN0YW50cy5UQVNLX01PREVfUVVFUlkgJiZcclxuICAgICAgICAgICAgICAoYXdhaXQgKHRhc2suZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19PUFRJT04pKS5nZXRWYWx1ZUJvb2xlYW4oKSkgPT09IGZhbHNlKVxyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBhd2FpdCB0YXNrLmVuYWJsZU1vZGVzKCk7XHJcbiAgICAgICAgICAgIG9sZE1vZGUgPSB0YXNrLmdldE9yaWdpbmFsVGFza01vZGUoKTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSkge1xyXG4gICAgICAgICAgICAgIHRhc2suc2V0TW9kZShDb25zdGFudHMuVEFTS19NT0RFX1FVRVJZKTtcclxuICAgICAgICAgICAgICBpZiAob2xkTW9kZSAhPT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGR2LmN1cnJSZWNDb21wdXRlKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGN0cmwgIT0gbnVsbClcclxuICAgICAgICAgICAgICAgICAgYXdhaXQgY3RybC5pbnZva2UoKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGZvcm0uUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9DVVJSX1JFQyk7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIHdlIGFscmVhZHkgZXhlY3V0ZWQgcmVjb3JkIHN1ZmZpeCAtIHNvIHdlIG5lZWQgdG8gcHJldmVudCB0aGUgdmlldyByZWZyZXNoXHJcbiAgICAgICAgICAgICAgICAvLyBmcm9tIGV4ZWN1dGluZyBpdCBhZ2FpblxyXG4gICAgICAgICAgICAgICAgdGFzay5zZXRQcmV2ZW50UmVjb3JkU3VmZml4KHRydWUpO1xyXG4gICAgICAgICAgICAgICAgdGFzay5zZXRQcmV2ZW50Q29udHJvbENoYW5nZSh0cnVlKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9SRUZSRVNIX1ZJRVcpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGN0cmwgIT0gbnVsbClcclxuICAgICAgICAgICAgICAgICAgYXdhaXQgY3RybC5pbnZva2UoKTtcclxuICAgICAgICAgICAgICAgIHRhc2suc2V0UHJldmVudFJlY29yZFN1ZmZpeChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICB0YXNrLnNldFByZXZlbnRDb250cm9sQ2hhbmdlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIGlmICghZHYuaXNFbXB0eSgpICYmIChkdi5nZXRDdXJyUmVjKCkpLmdldE1vZGUoKSAhPT0gRGF0YU1vZGlmaWNhdGlvblR5cGVzLkluc2VydClcclxuICAgICAgICAgICAgICAgICAgdGFzay5zZXRNb2RlKENvbnN0YW50cy5UQVNLX01PREVfUVVFUlkpO1xyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICB0YXNrLnNldE1vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgZm9ybS5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0NVUlJfUkVDKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgdGFzay5zZXRPcmlnaW5hbFRhc2tNb2RlKENvbnN0YW50cy5UQVNLX01PREVfUVVFUlkpO1xyXG4gICAgICAgICAgICAgIGF3YWl0IHRhc2suc2V0Q3JlYXRlRGVsZXRlQWN0c0VuYWJsZVN0YXRlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRPX01PRElGWTpcclxuICAgICAgICAgICAgaWYgKHRhc2suZ2V0TW9kZSgpICE9PSBDb25zdGFudHMuVEFTS19NT0RFX01PRElGWSAmJlxyXG4gICAgICAgICAgICAgIChhd2FpdCAodGFzay5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX09QVElPTikpLmdldFZhbHVlQm9vbGVhbigpKSA9PT0gZmFsc2UpXHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGF3YWl0IHRhc2suZW5hYmxlTW9kZXMoKTtcclxuICAgICAgICAgICAgb2xkTW9kZSA9IHRhc2suZ2V0T3JpZ2luYWxUYXNrTW9kZSgpO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKSB7XHJcbiAgICAgICAgICAgICAgdGFzay5zZXRNb2RlKENvbnN0YW50cy5UQVNLX01PREVfTU9ESUZZKTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKG9sZE1vZGUgIT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBkdi5jdXJyUmVjQ29tcHV0ZSh0cnVlKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuICAgICAgICAgICAgICAgIGlmIChjdHJsICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IGN0cmwuaW52b2tlKCk7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIHdlIGFscmVhZHkgZXhlY3V0ZWQgcmVjb3JkIHN1ZmZpeCAtIHNvIHdlIG5lZWQgdG8gcHJldmVudCB0aGUgdmlldyByZWZyZXNoXHJcbiAgICAgICAgICAgICAgICAvLyBmcm9tIGV4ZWN1dGluZyBpdCBhZ2FpblxyXG4gICAgICAgICAgICAgICAgdGFzay5zZXRQcmV2ZW50UmVjb3JkU3VmZml4KHRydWUpO1xyXG4gICAgICAgICAgICAgICAgdGFzay5zZXRQcmV2ZW50Q29udHJvbENoYW5nZSh0cnVlKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9SRUZSRVNIX1ZJRVcpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGN0cmwgIT0gbnVsbClcclxuICAgICAgICAgICAgICAgICAgYXdhaXQgY3RybC5pbnZva2UoKTtcclxuICAgICAgICAgICAgICAgIHRhc2suc2V0UHJldmVudFJlY29yZFN1ZmZpeChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICB0YXNrLnNldFByZXZlbnRDb250cm9sQ2hhbmdlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIGlmICghZHYuaXNFbXB0eSgpICYmIChkdi5nZXRDdXJyUmVjKCkpLmdldE1vZGUoKSAhPT0gRGF0YU1vZGlmaWNhdGlvblR5cGVzLkluc2VydClcclxuICAgICAgICAgICAgICAgICAgdGFzay5zZXRNb2RlKENvbnN0YW50cy5UQVNLX01PREVfTU9ESUZZKTtcclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgdGFzay5zZXRNb2RlKENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGZvcm0uUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9DVVJSX1JFQyk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHRhc2suc2V0T3JpZ2luYWxUYXNrTW9kZShDb25zdGFudHMuVEFTS19NT0RFX01PRElGWSk7XHJcbiAgICAgICAgICAgICAgYXdhaXQgdGFzay5zZXRDcmVhdGVEZWxldGVBY3RzRW5hYmxlU3RhdGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9TRUxFQ1Q6XHJcbiAgICAgICAgICAgIC8qIHByZWZvcm0gcmVjIHN1ZmZpeCAqL1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgIHRhc2suSW5TZWxlY3QgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKTtcclxuICAgICAgICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICAgICAgICB0YXNrLkluU2VsZWN0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCF0aGlzLl9zdG9wRXhlY3V0aW9uKSB7XHJcbiAgICAgICAgICAgICAgLyogY2xvc2UgdGhlIHNlbGVjdGlvbiBwcm9ncmFtICovXHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VYSVQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9TVUJGT1JNX1JFRlJFU0g6XHJcbiAgICAgICAgICAgIGlmICgoZXZ0LmdldEFyZ0xpc3QoKSAhPSBudWxsKSAmJiAoZXZ0LmdldEFyZ0xpc3QoKS5nZXRTaXplKCkgPT09IDEpKSB7XHJcbiAgICAgICAgICAgICAgbGV0IHN1YmZvcm1DdHJsOiBNZ0NvbnRyb2wgPSBudWxsO1xyXG4gICAgICAgICAgICAgIGxldCBSZWZyZXNoZWRTdWJmb3JtTmFtZTogc3RyaW5nID0gYXdhaXQgZXZ0LmdldEFyZ0xpc3QoKS5nZXRBcmdWYWx1ZSgwLCBTdG9yYWdlQXR0cmlidXRlLkFMUEhBLCAwKTtcclxuXHJcbiAgICAgICAgICAgICAgLy8gUUNSICMyODMxMTQuIEFyZ3VtZW50IG9mICdTdWJmb3JtIHJlZnJlc2ggZXZlbnQnIGNhbiBiZSBza2lwcGVkIG9yIG5vdCBleGlzdC5cclxuICAgICAgICAgICAgICBpZiAoUmVmcmVzaGVkU3ViZm9ybU5hbWUgPT0gbnVsbClcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAvLyBSUyBtdXN0IGJlIGV4ZWN1dGVkIG9ubHkgaWYgdGhlIGN1cnJlbnQgc3ViZm9ybSBpcyByZWZyZXNoZWQuXHJcbiAgICAgICAgICAgICAgLy8gSWYgaXRzIGJyb3RoZXIgaXMgcmVmcmVzaGVkIHdlIGRvIG5vdCBuZWVkIHRvIGV4ZWN1dGUgUlMgb2YgdGhlIGN1cnJlbnQgdGFzay5cclxuICAgICAgICAgICAgICBmb3IgKGxldCBwYXJlbnRUYXNrOiBUYXNrID0gdGFzazsgcGFyZW50VGFzay5nZXRGb3JtKCkgIT0gbnVsbCAmJiBwYXJlbnRUYXNrLmdldE1nZElEKCkgPT09IHRhc2suZ2V0TWdkSUQoKTsgcGFyZW50VGFzayA9IDxUYXNrPnBhcmVudFRhc2suZ2V0UGFyZW50KCkpIHtcclxuICAgICAgICAgICAgICAgIHN1YmZvcm1DdHJsID0gPE1nQ29udHJvbD5wYXJlbnRUYXNrLmdldEZvcm0oKS5nZXRDdHJsQnlOYW1lKFJlZnJlc2hlZFN1YmZvcm1OYW1lLnRyaW0oKSwgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfU1VCRk9STSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoc3ViZm9ybUN0cmwgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICBsZXQgc3ViZm9ybVRhc2s6IFRhc2sgPSA8VGFzaz5zdWJmb3JtQ3RybC5nZXRTdWJmb3JtVGFzaygpO1xyXG4gICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgc3ViZm9ybSB0YXNrIHdhcyBub3Qgb3BlbmVkIHlldCwgYnV0IHN1YmZvcm0gcmVmcmVzaCBpcyBkb25lLFxyXG4gICAgICAgICAgICAgICAgICAvLyBpdCdzIG5lZWRlZCB0byBvcGVuIHRoZSBzdWJmb3JtLiBRQ1IgIzQxNTkxNC5cclxuICAgICAgICAgICAgICAgICAgaWYgKHN1YmZvcm1UYXNrID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBRQ1IgIzI4NzU2Mi4gT3BlbiB0aGUgc3ViZm9ybSB0YXNrIG9ubHkgaWYgdGhlIHN1YmZvcm0gY29udHJvbCBpcyBjb25uZWN0ZWQgdG8gdGhlIHRhc2suXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGF3YWl0IChzdWJmb3JtQ3RybC5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1NVQkZPUk1fVFlQRSkpLmdldFZhbHVlSW50KCkgIT09IFN1YmZvcm1UeXBlLk5vbmUpXHJcbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLk9wZW5TdWJmb3JtKHBhcmVudFRhc2ssIHN1YmZvcm1DdHJsKTtcclxuICAgICAgICAgICAgICAgICAgfSBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgcGFyZW50VGFzay5TdWJmb3JtUmVmcmVzaChzdWJmb3JtVGFzaywgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBpZiBpdCBpcyBTdWJmb3JtUmVmcmVzaCB0aGF0IHJldHVybmVkIGZyb20gdGhlIHNlcnZlciwgc28gc2VhcmNoIHRoZSB0YXNrIGFjY29yZGluZyB0byBpdHMgdGFzayBpZCAodGFnKVxyXG4gICAgICAgICAgICBlbHNlIGlmICgoZXZ0LmdldEFyZ0xpc3QoKSAhPSBudWxsKSAmJiAoZXZ0LmdldEFyZ0xpc3QoKS5nZXRTaXplKCkgPT09IDIpKSB7XHJcbiAgICAgICAgICAgICAgbGV0IHN1YmZvcm1UYXNrOiBUYXNrID0gdGFzaywgcGFyZW50VGFzaztcclxuICAgICAgICAgICAgICBsZXQgdGFza1RhZzogc3RyaW5nID0gYXdhaXQgZXZ0LmdldEFyZ0xpc3QoKS5nZXRBcmdWYWx1ZSgxLCBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUMsIDApO1xyXG5cclxuICAgICAgICAgICAgICB3aGlsZSAoc3ViZm9ybVRhc2suSXNTdWJGb3JtKSB7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnRUYXNrID0gc3ViZm9ybVRhc2suZ2V0UGFyZW50KCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoc3ViZm9ybVRhc2suZ2V0VGFza1RhZygpID09PSB0YXNrVGFnKSB7XHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IHBhcmVudFRhc2suU3ViZm9ybVJlZnJlc2goc3ViZm9ybVRhc2ssIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHN1YmZvcm1UYXNrID0gcGFyZW50VGFzaztcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfU1VCRk9STV9PUEVOOlxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLk9wZW5TdWJmb3JtKHRhc2ssIDxNZ0NvbnRyb2w+ZXZ0LkNvbnRyb2wpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVE9fU0VBUkNIOlxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKSB7XHJcbiAgICAgICAgICAgICAgY21kID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlRXZlbnRDb21tYW5kKHRhc2suZ2V0VGFza1RhZygpLCBpbnRFdnRDb2RlKTtcclxuICAgICAgICAgICAgICB0YXNrLmdldFRhc2tDYWNoZSgpLmNsZWFyQ2FjaGUoKTtcclxuICAgICAgICAgICAgICBhd2FpdCB0YXNrLkRhdGF2aWV3TWFuYWdlci5FeGVjdXRlKGNtZCk7XHJcblxyXG4gICAgICAgICAgICAgIC8vIEFmdGVyIHZpZXcgcmVmcmVzaCwgdGhlIHNlcnZlciBhbHdheXMgcmV0dXJucyBjdXJyIHJlYyBhcyBmaXJzdCByZWMuXHJcbiAgICAgICAgICAgICAgaWYgKCFmb3JtLmlzU2NyZWVuTW9kZSgpKSB7XHJcbiAgICAgICAgICAgICAgICBkdi5zZXRUb3BSZWNJZHgoMCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZm9ybS5IYXNUYWJsZSgpKSB7XHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IGZvcm0ucmVzdG9yZU9sZERpc3BsYXlMaW5lKGZvcm0ucmVjb3JkSWR4MkRpc3BsYXlMaW5lKGR2LmdldEN1cnJSZWNJZHgoKSkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG4gICAgICAgICAgICAgIGlmIChjdHJsICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgICBhd2FpdCBjdHJsLmludm9rZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1JFRlJFU0hfU0NSRUVOOlxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUkVGUkVTSF9WSUVXOlxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUkVGUkVTSF9SRUNPUkQ6XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlUmVmcmVzaEV2ZW50cyhldnQpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9BQ1RfQ0xPU0VfQVBQTDpcclxuICAgICAgICAgICAgY21kID1cclxuICAgICAgICAgICAgICBDb21tYW5kRmFjdG9yeS5DcmVhdGVFdmVudENvbW1hbmQoXHJcbiAgICAgICAgICAgICAgICBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLlN0YXJ0dXBNZ0RhdGEuZ2V0Rmlyc3RUYXNrKCkuZ2V0VGFza1RhZygpLFxyXG4gICAgICAgICAgICAgICAgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0JST1dTRVJfRVNDKTtcclxuICAgICAgICAgICAgY21kc1RvU2VydmVyLkFkZChjbWQpO1xyXG4gICAgICAgICAgICBhd2FpdCBzZXJ2ZXIuRXhlY3V0ZShDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2VuZGluZ0luc3RydWN0aW9uLlRBU0tTX0FORF9DT01NQU5EUyk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NPTlRFWFRfUkVNT1ZFOlxyXG5cclxuICAgICAgICAgICAgLy8gY2hlY2sgaWYgdHJhbnNhY3Rpb24gaXMgcGVuZGluZ1xyXG4gICAgICAgICAgICBsZXQgY3VyclJlY29yZCA9ICg8RGF0YVZpZXc+TGFzdEZvY3VzZWRNYW5hZ2VyLkluc3RhbmNlLmdldExhc3RGb2N1c2VkVGFzaygpLkRhdGFWaWV3KS5nZXRDdXJyUmVjKCk7XHJcbiAgICAgICAgICAgIGlmIChDbGllbnRNYW5hZ2VyLlRyYW5zQ2FjaGVFeGlzdHMoKSB8fCAoY3VyclJlY29yZCAhPSBudWxsICYmIGN1cnJSZWNvcmQuTW9kaWZpZWQpKSB7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1BlbmRpbmcgdHJhbnNhY3Rpb24vcmVjb3JkIGlzIG1vZGlmaWVkLCBkaXNjYXJkZWQgXFwnQ29udGV4dCBSZW1vdmVcXCcgZXZlbnQuJyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgLy8gSXMgdGhlcmUgY2xpZW50IGNvbnRleHQgaW5hY3Rpdml0eSB0aW1lb3V0P1xyXG4gICAgICAgICAgICAgIGlmIChFbnZpcm9ubWVudC5JbnN0YW5jZS5nZXRDbGllbnRDb250ZXh0SW5hY3Rpdml0eVRpbWVvdXQoKSA+IDApIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuRXhlY3V0ZUNsaWVudENvbnRleHRJbmFjdGl2aXR5VGltZXIoKTtcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIGlmICghRXZlbnRzTWFuYWdlci5jbGllbnRDb250ZXh0SW5hY3Rpdml0eVRpbWVyQWJvcnRlZCkge1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIGFkZCBhIGNvbW1hbmQgdG8gdGVybWluYXRlIGNvbnRleHQgYXQgc2VydmVyIHNpZGVcclxuICAgICAgICAgICAgICAgIGxldCBjb250ZXh0VGVybWluYXRpb25FdmVudENvbW1hbmQ6IENvbnRleHRUZXJtaW5hdGlvbkV2ZW50Q29tbWFuZFxyXG4gICAgICAgICAgICAgICAgICA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZUNvbnRleHRUZXJtaW5hdGlvbkV2ZW50Q29tbWFuZChNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLlN0YXJ0dXBNZ0RhdGEuZ2V0Rmlyc3RUYXNrKCkuZ2V0VGFza1RhZygpKTtcclxuICAgICAgICAgICAgICAgIE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuZ2V0Q3Vyck1HRGF0YSgpLkNtZHNUb1NlcnZlci5BZGQoPElDbGllbnRDb21tYW5kPmNvbnRleHRUZXJtaW5hdGlvbkV2ZW50Q29tbWFuZCk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gcmVzcG9uc2UgbmVlZCBub3QgdG8gYmUgaGFuZGxlZCBhcyB0aGUgd2UgYXJlIHRlcm1pbmF0aW5nIHRoZSBjb250ZXh0XHJcbiAgICAgICAgICAgICAgICBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5HZXRJbnN0YW5jZSgpLkV4ZWN1dGUoQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1NlbmRpbmdJbnN0cnVjdGlvbi5PTkxZX0NPTU1BTkRTKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnUmVtb3ZlZCBjb250ZXh0IGZyb20gc2VydmVyJyk7XHJcbiAgICAgICAgICAgICAgICAvLyBzZXQgZmxhZyB0byB0aGF0IGNvbnRleHQgaXMgcmVtb3ZlZCBmcm9tIHNlcnZlciBieSAnQ29udGV4dCBSZW1vdmUnIGV2ZW50XHJcbiAgICAgICAgICAgICAgICBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuUmVtb3ZpbmdDb250ZXh0RnJvbVNlcnZlciA9IHRydWU7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdEaXNjYXJkZWQgXFwnQ29udGV4dCBSZW1vdmVcXCcgZXZlbnQgYXMgdXNlciBldmVudCBvY2N1cnJlZC4nKTtcclxuICAgICAgICAgICAgICAgIEV2ZW50c01hbmFnZXIuY2xpZW50Q29udGV4dEluYWN0aXZpdHlUaW1lckFib3J0ZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1NFUlZFUl9URVJNSU5BVElPTjpcclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0RVTVBfRU5WSVJPTk1FTlQ6XHJcbiAgICAgICAgICAgIGNtZCA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZUV2ZW50Q29tbWFuZCh0YXNrLmdldFRhc2tUYWcoKSwgaW50RXZ0Q29kZSk7XHJcbiAgICAgICAgICAgIGNtZHNUb1NlcnZlci5BZGQoY21kKTtcclxuICAgICAgICAgICAgYXdhaXQgQ29tbWFuZHNQcm9jZXNzb3JNYW5hZ2VyLkdldENvbW1hbmRzUHJvY2Vzc29yKCkuRXhlY3V0ZShDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2VuZGluZ0luc3RydWN0aW9uLlRBU0tTX0FORF9DT01NQU5EUyk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX0VEVF9OVUxMOlxyXG4gICAgICAgICAgICBpZiAodGhpcy5fY3VyckZpZWxkICE9IG51bGwgJiYgdGhpcy5fY3VyckZpZWxkLk51bGxBbGxvd2VkKSB7XHJcbiAgICAgICAgICAgICAgLy8gdGhlIG5leHQgbGluZXMgaXMgYW4gaW1taXRhdGlvbiBvZiB0aGUgYmVoYXZpb3VyIG9mIGFuIG9ubGluZSBwcm9ncmFtOlxyXG4gICAgICAgICAgICAgIC8vIDEpIHRoZSByZWNvcmQgbXVzdCBiZSB1cGRhdGVkIGluIHRoaXMgZXZlbnRcclxuICAgICAgICAgICAgICAvLyAyKSBhIFwibmV4dCBmaWVsZFwiIGV2ZW50IGlzIHJhaXNlZFxyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuX2N1cnJGaWVsZC5zZXRWYWx1ZUFuZFN0YXJ0UmVjb21wdXRlKHRoaXMuX2N1cnJGaWVsZC5nZXRNYWdpY0RlZmF1bHRWYWx1ZSgpLCB0cnVlLCB0cnVlLCB0cnVlLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fY3VyckZpZWxkLnVwZGF0ZURpc3BsYXkoKTtcclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUk9MTEJBQ0s6XHJcbiAgICAgICAgICAgIC8vIGZvciBvZmZsaW5lIHdlIG5lZWQgdG8gY2FuY2VsIHRoZSBlZGl0IGFuZCB0aGVuIGdvIHJvbGxiYWNrIHRoZSB0cmFuc2FjdGlvbiwgdGhlIHNhbWUgd2UgZG9pbmcgZm9yIHJlbW92ZSB3aGlsZSByZXR1cm4gZnJvbSB0aGUgc2VydmVyXHJcbiAgICAgICAgICAgIC8vIHNlZSBkYXRhdmlldy5jcyBjYXNlIENvbnN0SW50ZXJmYWNlLlJFQ09WRVJZX1JPTExCQUNLOlxyXG4gICAgICAgICAgICAvLyBmb3Igb2ZmbGluZSB3ZSB3aWxsIG5vdCBnZXQgdG8gQ29uc3RJbnRlcmZhY2UuUkVDT1ZFUllfUk9MTEJBQ0tcclxuICAgICAgICAgICAgYXdhaXQgRXZlbnRzTWFuYWdlci5IYW5kbGVSb2xsYmFja0FjdGlvbih0YXNrLCBjbWRzVG9TZXJ2ZXIsIFJvbGxiYWNrRXZlbnRDb21tYW5kX1JvbGxiYWNrVHlwZS5ST0xMQkFDSyk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9PSzpcclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0lOREVYX0NIQU5HRTpcclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NPTF9TT1JUOlxyXG4gICAgICAgICAgICAvLyBjYW4gc29ydCBvbmx5IG9uIGNvbHVtbiB3aXRoIGFuIGF0dGFjaGVkIGZpZWxkLlxyXG4gICAgICAgICAgICAvLyBjYW4gY2hhbmdlIGluZGV4IG9ubHkgaWYgdGhlIGRhdGF2aWV3IGlzIHJlbW90ZS5cclxuICAgICAgICAgICAgaWYgKChpbnRFdnRDb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfSU5ERVhfQ0hBTkdFICYmIHRhc2suRGF0YXZpZXdNYW5hZ2VyLkhhc1JlbW90ZURhdGEpIHx8XHJcbiAgICAgICAgICAgICAgKGludEV2dENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DT0xfU09SVCAmJiBjdHJsLmdldEZpZWxkKCkgIT0gbnVsbCkpIHtcclxuICAgICAgICAgICAgICAvLyBRQ1IgIzI5NjMyNSAmIFFDUiAjNDMwMjg4LlxyXG4gICAgICAgICAgICAgIC8vIEV4ZWN1dGUgQ1Mgb2YgdGhlIGN1cnJlbnQgY29udHJvbCwgYmVjYXVzZSBpdCBjYW4gYmUgYSBwYXJhbWV0ZXIgZm9yIGEgc3ViZm9ybS5cclxuICAgICAgICAgICAgICAvLyBJZiBpdCdzIHZhbHVlIHdhcyBjaGFuZ2VkLCBDUyB3aWxsIHJlZnJlc2ggdGhlIHN1YmZvcm0gYmVmb3JlIHRoZSBzb3J0LlxyXG4gICAgICAgICAgICAgIGxldCBsYXN0Rm9jdXNlZFRhc2s6IFRhc2sgPSBMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCk7XHJcbiAgICAgICAgICAgICAgbGV0IGZvY3VzZWRDdHJsOiBNZ0NvbnRyb2wgPSBMYXN0Rm9jdXNlZE1hbmFnZXIuZ2V0TGFzdEZvY3VzZWRDb250cm9sKExhc3RGb2N1c2VkTWFuYWdlci5MYXN0Rm9jdXNNZ2RJRCk7XHJcbiAgICAgICAgICAgICAgaWYgKGZvY3VzZWRDdHJsICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoTWdDb250cm9sQmFzZShmb2N1c2VkQ3RybCwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfU1VGRklYKTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpXHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0YXNrLkV4ZWN1dGVOZXN0ZWRSUyhsYXN0Rm9jdXNlZFRhc2spO1xyXG5cclxuICAgICAgICAgICAgICAvLyBRQ1IgIzQzODc1My4gRXhlY3V0ZSBSUyBvZiB0aGUgc29ydGVkIHRhc2suXHJcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkgJiYgdGFzay5nZXRMZXZlbCgpICE9PSBDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKVxyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG5cclxuICAgICAgICAgICAgICBpZiAoIXRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSkge1xyXG4gICAgICAgICAgICAgICAgdGFzay5nZXRUYXNrQ2FjaGUoKS5jbGVhckNhY2hlKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGludEV2dENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9JTkRFWF9DSEFOR0UpIHtcclxuICAgICAgICAgICAgICAgICAgbGV0IHRhc2tGb3JtOiBNZ0Zvcm0gPSA8TWdGb3JtPnRhc2suZ2V0Rm9ybSgpO1xyXG4gICAgICAgICAgICAgICAgICBpZiAodGFza0Zvcm0uSGFzVGFibGUoKSlcclxuICAgICAgICAgICAgICAgICAgICBmb3JtLmNsZWFyVGFibGVDb2x1bW5Tb3J0TWFyayh0cnVlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgIGNtZCA9IGF3YWl0IENvbW1hbmRGYWN0b3J5LkNyZWF0ZUluZGV4Q2hhbmdlQ29tbWFuZCh0YXNrLmdldFRhc2tUYWcoKSwgKDxEYXRhVmlldz50YXNrLkRhdGFWaWV3KS5HZXRDdXJyZW50UmVjSWQoKSwgZXZ0LmdldEFyZ0xpc3QoKSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICBjbWQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVDb2x1bW5Tb3J0Q29tbWFuZCh0YXNrLmdldFRhc2tUYWcoKSwgZXZ0LkRpcmVjdGlvbiwgY3RybC5nZXREaXRJZHgoKSwgY3RybC5nZXRGaWVsZCgpLmdldElkKCksICg8RGF0YVZpZXc+dGFzay5EYXRhVmlldykuR2V0Q3VycmVudFJlY0lkKCkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGF3YWl0IHRhc2suRGF0YXZpZXdNYW5hZ2VyLkV4ZWN1dGUoY21kKTtcclxuICAgICAgICAgICAgICAgIGR2LnNldFRvcFJlY0lkeCgwKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGZvcm0ucmVzdG9yZU9sZERpc3BsYXlMaW5lKDApO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIFFDUidzICMxNjU4MTUgJiAjMjkxOTc0LiBJZiB0aGUgZm9jdXNlZCB0YXNrIGFuZCB0aGUgc29ydGVkIHRhc2sgaXMgdGhlIHNhbWUgdGFzayBvclxyXG4gICAgICAgICAgICAgICAgLy8gdGhlIGZvY3VzZWQgdGFzayBpcyBhIGNoaWxkIG9mIHRoZSBzb3J0ZWQgdGFzaywgZ28gdG8gdGhlIGZpcnN0IGNvbnRyb2wgaW4gdGhlIGZpcnN0IGxpbmUuXHJcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgZm9jdXNlZCB0YXNrIGlzIHRoZSBwYXJlbnQgdGFzaywgZG8gbm90IGxlYXZlIHRoZSBjdXJyZW50IGNvbnRyb2wuXHJcbiAgICAgICAgICAgICAgICBpZiAoISh0YXNrID09PSBMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCkgfHwgIXRhc2sucGF0aENvbnRhaW5zKExhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKSkpKSB7XHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkgJiYgIXRhc2suZ2V0UHJldmVudENvbnRyb2xDaGFuZ2UoKSlcclxuICAgICAgICAgICAgICAgICAgLy8gUUNSICM0Mjg2OTcuIEV4ZWN1dGUgUlMgb2YgYWxsIG5lc3RlZCBzdWJmb3Jtcy5cclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBsYXN0Rm9jdXNlZFRhc2suRXhlY3V0ZU5lc3RlZFJTKHRhc2spO1xyXG4gICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSAmJiBmb2N1c2VkQ3RybCAhPSBudWxsKVxyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGZvY3VzZWRDdHJsLmludm9rZSgpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlXHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuXHJcblxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DT0xfQ0xJQ0s6XHJcbiAgICAgICAgICAgIC8vIGNhbiBzb3J0IG9uIGNvbHVtbiBvbmx5IGlmIGV2ZW50IGlzIHJhaXNlZCBkdWUgdG8gY2xpY2sgYWN0aW9uXHJcbiAgICAgICAgICAgIC8vIGFuZCBhIGZpZWxkIGlzIGF0dGFjaGVkIHRvIGNvbHVtbi5cclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpICYmIGV2dC5pc0d1aVRyaWdnZXJlZEV2ZW50KCkgJiYgY3RybC5pc0NvbHVtblNvcnRhYmxlKCkpIHtcclxuICAgICAgICAgICAgICBsZXQgY29sdW1uQ2hpbGRDb250cm9sOiBNZ0NvbnRyb2wgPSA8TWdDb250cm9sPmN0cmwuZ2V0Q29sdW1uQ2hpbGRDb250cm9sKCk7XHJcbiAgICAgICAgICAgICAgaWYgKGNvbHVtbkNoaWxkQ29udHJvbCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBoYW5kbGUgU29ydCBvbiBDb2x1bW5cclxuICAgICAgICAgICAgICAgIGxldCBhUnRFdnQgPSBuZXcgUnVuVGltZUV2ZW50KGNvbHVtbkNoaWxkQ29udHJvbCwgZXZ0LkRpcmVjdGlvbiwgMCk7XHJcbiAgICAgICAgICAgICAgICBhUnRFdnQuc2V0SW50ZXJuYWwoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NPTF9TT1JUKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWRkVG9UYWlsKGFSdEV2dCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgLy8gZW5kIG9mIGludGVybmFsIGV2ZW50cyBwcm9jZXNzaW5nXHJcblxyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgdGhpcy5wb3BSdEV2ZW50KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKlxyXG4qIEhhbmRsZUFjdEVudGVyUm93RWRpdGluZ1xyXG4qIHN0YXJ0IHRoZSBlZGl0aW5nIG9uIHJvd1xyXG4qICovXHJcbiAgcHJpdmF0ZSBhc3luYyBIYW5kbGVBY3RFbnRlclJvd0VkaXRpbmcodGFzazogVGFzaykge1xyXG4gICAgaWYgKHRhc2suZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX1FVRVJZKVxyXG4gICAgICB0YXNrLldyaXRlVG9NZXNzYWdlUGFuZShgQ2Fubm90IGVudGVyIFJvdyBFZGl0aW5nIHdoZW4gaW4gUXVlcnkgTW9kZS5gKTtcclxuICAgIGVsc2Uge1xyXG4gICAgICBsZXQgbXlmb3JtOiBNZ0Zvcm0gPSA8TWdGb3JtPnRhc2suZ2V0Rm9ybSgpO1xyXG4gICAgICBhd2FpdCBteWZvcm0uc3RhcnRSb3dFZGl0aW5nKG15Zm9ybS5EaXNwbGF5TGluZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIEhhbmRsZVN0b3BSb3dFZGl0aW5nKHRhc2s6IFRhc2spIHtcclxuICAgIGxldCBteWZvcm06IE1nRm9ybSA9IDxNZ0Zvcm0+dGFzay5nZXRGb3JtKCk7XHJcbiAgICBhd2FpdCBteWZvcm0uc3RvcFJvd0VkaXRpbmcobXlmb3JtLkRpc3BsYXlMaW5lKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gQ3JlYXRlcyBhbmQgZXhlY3V0ZXMgc3ViZm9ybSBvcGVuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0YXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzdWJmb3JtQ29udHJvbFwiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBPcGVuU3ViZm9ybSh0YXNrOiBUYXNrLCBzdWJmb3JtQ29udHJvbDogTWdDb250cm9sKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0YXNrLlRhc2tTZXJ2aWNlLlJlbW92ZVJlY29tcHV0ZXModGFzayk7XHJcbiAgICBsZXQgY21kOiBJQ2xpZW50Q29tbWFuZCA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZVN1YmZvcm1PcGVuQ29tbWFuZCh0YXNrLmdldFRhc2tUYWcoKSwgc3ViZm9ybUNvbnRyb2wuZ2V0RGl0SWR4KCkpO1xyXG4gICAgdGFzay5nZXRNR0RhdGEoKS5DbWRzVG9TZXJ2ZXIuQWRkKGNtZCk7XHJcbiAgICBhd2FpdCBUYXNrLkNvbW1hbmRzUHJvY2Vzc29yLkV4ZWN1dGUoQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1NlbmRpbmdJbnN0cnVjdGlvbi5UQVNLU19BTkRfQ09NTUFORFMpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidGFza1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY21kc1RvU2VydmVyXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyb2xsYmFja1R5cGVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgSGFuZGxlUm9sbGJhY2tBY3Rpb24odGFzazogVGFzaywgY21kc1RvU2VydmVyOiBDb21tYW5kc1RhYmxlLCByb2xsYmFja1R5cGU6IFJvbGxiYWNrRXZlbnRDb21tYW5kX1JvbGxiYWNrVHlwZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGNvbW1hbmRzUHJvY2Vzc29yOiBDb21tYW5kc1Byb2Nlc3NvckJhc2UgPSBUYXNrLkNvbW1hbmRzUHJvY2Vzc29yO1xyXG4gICAgQ2xpZW50UmVmcmVzaENvbW1hbmQuQ2xpZW50SXNJblJvbGxiYWNrQ29tbWFuZCA9IHRydWU7XHJcbiAgICAvLyBmb3IgcmVtb3RlIHByb2dyYW0gOiAod2l0aFxcd2l0aG91dCBsb2NhbCBkYXRhKSB0aGUgcm9sbGJhY2sgZXZlbnQgaW4gdGhlIHNlcnZlciBNVVNUXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgYmUgZXhlY3V0ZSBvbiB0aGUgdGFzayB0aGF0IG9wZW4gdGhlIHRyYW5zYWN0aW9uXHJcbiAgICAvLyBmb3Igb2ZmbGluZSBwcm9ncmFtIHRoZSByb2xsYmFjayB0cmFuc2FjdGlvbiBuZWVkIHRvIGJlIGV4ZWN1dGUgb24gdGhlIHRhc2sgdGhhdCBvcGVuIHRoZSB0cmFuc2FjdGlvblxyXG4gICAgdGFzayA9IHRhc2suVGFza1NlcnZpY2UuR2V0T3duZXJUcmFuc2FjdGlvblRhc2sodGFzayk7XHJcblxyXG4gICAgbGV0IGNtZDogSUNsaWVudENvbW1hbmQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVSb2xsYmFja0V2ZW50Q29tbWFuZCh0YXNrLmdldFRhc2tUYWcoKSwgcm9sbGJhY2tUeXBlKTtcclxuICAgIGNtZHNUb1NlcnZlci5BZGQoY21kKTtcclxuICAgIGF3YWl0IGNvbW1hbmRzUHJvY2Vzc29yLkV4ZWN1dGUoQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1NlbmRpbmdJbnN0cnVjdGlvbi5UQVNLU19BTkRfQ09NTUFORFMpO1xyXG5cclxuICAgIENsaWVudFJlZnJlc2hDb21tYW5kLkNsaWVudElzSW5Sb2xsYmFja0NvbW1hbmQgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImV2dFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidGFza1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZm9ybVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY3RybFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicmVjXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsYXN0UGFya2VkQ3RybFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwib2xkUmVjTW9kZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwib2xkTW9kZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIGFzeW5jIEhhbmRsZUFjdENhbmNlbChldnQ6IFJ1blRpbWVFdmVudCwgdGFzazogVGFzaywgZm9ybTogTWdGb3JtLCBjdHJsOiBNZ0NvbnRyb2wsIHJlYzogUmVjb3JkLCBpc01HX0FDVF9DQU5DRUw6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIC8vIFByZXZlbnQgcmVjdXJzaXZlIG1vZGVcclxuICAgIC8vIGZpeGVkIGJ1Z3MgIzoyODU0OTgsIDI5NzQ1NVxcNDI3NzAzXFxcclxuICAgIGlmICh0YXNrLkluSGFuZGxlQWN0Q2FuY2VsKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgdGFzay5JbkhhbmRsZUFjdENhbmNlbCA9IHRydWU7XHJcblxyXG4gICAgbGV0IG9sZE1vZGU6IHN0cmluZyA9IHRhc2suZ2V0TW9kZSgpO1xyXG4gICAgbGV0IHNhdmVEaXNwbGF5TGluZSA9IHRhc2suZ2V0Rm9ybSgpLkRpc3BsYXlMaW5lO1xyXG5cclxuICAgIC8vIFdoZW4gZG8gd2Ugc2hvdyB0aGUgJ0NvbmZpcm0gQ2FuY2VsIHdpbmRvdycgPyB3aGVuIGFsbCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXBwbHk6XHJcbiAgICAvLyAxLiBUYXNrIG1vZGUgaXMgbm90IHF1ZXJ5XHJcbiAgICAvLyAyLiByZWMgaXMgbm90IFVwZGF0ZWQuIFVwZGF0ZWQgaXMgdHJ1ZSB3aGVuIHRoZXJlIHdhcyBhbiBVcGRhdGUgb3BlcmF0aW9uIHdpdGggJ2ZvcmNlIHVwZGF0ZScuIElmIGl0IGlzIHRydWUsIHRoZW4gdGhlcmUgaXMgbm8gbWVhbmluZyB0byBzaG93IHRoZVxyXG4gICAgLy8gICAgd2luZG93IHNpbmNlIHRoZSB1cGRhdGUgc3RheXMgYW55d2F5IChsaWtlIGluIG9ubGluZSB3aGVuIHdlIGdvIHRvIENhbmNlbFdhc1RyaWdnZXJlZCkuXHJcbiAgICAvLyAzLiBUaGVyZSBtdXN0IGJlIGEgbW9kaWZpY2F0aW9uLCBvdGhlcndpc2UgdGhlcmUgaXMgbm90aGluZyB0byBjYW5jZWwuIFNvIGVpdGhlciBNb2RpZmllZCBpcyB0cnVlLCBtZWFuaW5nIGEgZmllbGQgd2FzIG1vaWRmaWVkICwgb3JcclxuICAgIC8vICAgIExhc3RQYXJrZWRDdHJsKCkubW9kaWZpZWRCeVVzZXIoKSwgbWVhbmluZyB0aGF0IHdlIGFyZSBpbiB0aGUgbWlkZGxlIG9mIGNoYW5naW5nIHRoZSBmaWVsZCdzIHZhbHVlIChUaGUgbW9kaWZpZWQgaXMgZmFsc2UgdW50aWxsIHdlIGV4aXQgdGhlIGZpZWxkKS5cclxuICAgIC8vIENyZWF0ZSBtb2RlIGFsc28gZ29lcyBoZXJlIChyZWMgcmVtb3ZlZCBhbmQgbW9kZSBjaGFuZ2VzIHRvIG1vZGlmeSkgLCBidXQgYWxzbyB3aWxsIHNob3cgdGhlIGNvbmZpcm0gY2FuY2VsIG9ubHkgaWYgc29tZSBjaGFuZ2Ugd2FzIGRvbmUgdG8gdGhlIG5ldyByZWNvcmQuXHJcbiAgICBpZiAob2xkTW9kZSAhPT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9RVUVSWSAmJiAhcmVjLlVwZGF0ZWQpIHtcclxuICAgICAgaWYgKGlzTUdfQUNUX0NBTkNFTCkge1xyXG4gICAgICAgIGlmIChyZWMuTW9kaWZpZWQgfHwgKHRhc2suZ2V0TGFzdFBhcmtlZEN0cmwoKSAhPT0gbnVsbCAmJiB0YXNrLmdldExhc3RQYXJrZWRDdHJsKCkuTW9kaWZpZWRCeVVzZXIpKSB7XHJcbiAgICAgICAgICBpZiAoYXdhaXQgdGFzay5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQ09ORklSTV9DQU5DRUwsIGZhbHNlKSkge1xyXG4gICAgICAgICAgICBsZXQgY29uZmlybWVkID0gYXdhaXQgR1VJTWFuYWdlci5JbnN0YW5jZS5jb25maXJtX2Jvb2woTXNnSW50ZXJmYWNlLkNPTkZJUk1fU1RSX0NBTkNFTCk7XHJcbiAgICAgICAgICAgIGlmICghY29uZmlybWVkKSB7XHJcbiAgICAgICAgICAgICAgdGFzay5JbkhhbmRsZUFjdENhbmNlbCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IG9sZFJlY01vZGU6IERhdGFNb2RpZmljYXRpb25UeXBlcyA9IHJlYy5nZXRNb2RlKCk7XHJcblxyXG4gICAgICAvLyBTcGVjaWFsQ2FuY2VsT25DcmVhdGUgYmVoYXZpb3IgZm9yIEFsbG93RW1wdHlEYXRhVmlldyA9IFkgOiBXaGVuIHRoZXJlIGlzIHNpbmdsZSBuZXdseSBjcmVhdGVkIHJlY29yZFxyXG4gICAgICAvLyBleGlzdCBhbmQgdXNlciBjYW5jZWxzIGl0IGFuZCB0YXNrIGhhcyBBbGxvd0VtcHR5RGF0YVZpZXc9WVxyXG4gICAgICAvLyB0aGVuIGNoYW5nZSB0YXNrIG1vZGUgdG8gTW9kaWZ5IG1vZGUgc28gdGhhdCBzZXJ2ZXIgYWxsb3dzIHRoaXMgdGFzayB0byBlbnRlciBhZ2FpbiBpbiBFbXB0eURhdGFWaWV3IG1vZGUuXHJcbiAgICAgIGlmIChHdWlFbnZpcm9ubWVudC5FbnZpcm9ubWVudC5HZXRTcGVjaWFsQ2FuY2VsT25DcmVhdGUoKSAmJiB0YXNrLmdldE1vZGUoKSA9PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURVxyXG4gICAgICAgICYmIHRhc2suZ2V0T3JpZ2luYWxUYXNrTW9kZSgpID09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKSB7XHJcblxyXG4gICAgICAgIGxldCBlbmFibGU6IGJvb2xlYW4gPSBhd2FpdCB0YXNrLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19NT0RJRlksIHRydWUpO1xyXG5cclxuICAgICAgICBpZiAoZW5hYmxlKSB7XHJcbiAgICAgICAgICBsZXQgYWxsb3dFbXB0eURhdGFWaWV3OiBib29sZWFuID0gYXdhaXQgdGFzay5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfRU1QVFlfREFUQVZJRVcsIHRydWUpO1xyXG5cclxuICAgICAgICAgIGlmICgoPERhdGFWaWV3PnRhc2suRGF0YVZpZXcpLmdldFNpemUoKSA9PSAxICYmIGFsbG93RW1wdHlEYXRhVmlldykge1xyXG4gICAgICAgICAgICB0YXNrLnNldE1vZGUoJ00nKTtcclxuICAgICAgICAgICAgdGFzay5EYXRhVmlldy5zZXRFbXB0eURhdGF2aWV3KHRydWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGlzTUdfQUNUX0NBTkNFTCkge1xyXG4gICAgICAgIC8vIFdoZW4gY2FuY2VsaW5nLCB3ZSBoYXZlIHRvIHJvbGxiYWNrIHRoZSB0cmFuc2FjdGlvbi5cclxuICAgICAgICAvLyBVbmxlc3MgdGhlIGV2ZW50IGRvZXMgbm90IGFsbG93IHRvIHJvbGxiYWNrIGluIGNhbmNlbC4gVGhhdCBjYW4gaGFwcGVuIGlmIHRoZSBjYW5jZWwgd2FzIGluaXRpYXRlZCBieSB0aGUgc2VydmVyJ3MncyByb2xsYmFjay5cclxuICAgICAgICBpZiAodGFzay5pc1RyYW5zYWN0aW9uT25MZXZlbChDb25zdEludGVyZmFjZS5UUkFOU19SRUNPUkRfUFJFRklYKSAmJiBldnQuUm9sbGJhY2tJbkNhbmNlbCgpKSB7XHJcbiAgICAgICAgICBhd2FpdCBFdmVudHNNYW5hZ2VyLkhhbmRsZVJvbGxiYWNrQWN0aW9uKHRhc2ssIDxDb21tYW5kc1RhYmxlPnRhc2suZ2V0TUdEYXRhKCkuQ21kc1RvU2VydmVyLCBSb2xsYmFja0V2ZW50Q29tbWFuZF9Sb2xsYmFja1R5cGUuQ0FOQ0VMKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGF3YWl0IEV2ZW50c01hbmFnZXIuSGFuZGxlQ2FuY2VsRWRpdChldnQsIHRhc2ssIGZvcm0sIHJlYywgb2xkUmVjTW9kZSk7XHJcbiAgICB9XHJcbiAgICAvLyBRY3IgIzc0Nzg3MCBjYW5jZWwgc2hvdWxkIHBlcmZvcm0gdGhlIHJlY29yZCBwcmVmaXggaWYgbm90IHF1aXRpbmdcclxuICAgIGVsc2Uge1xyXG4gICAgICB0YXNrLnNldExldmVsKENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spO1xyXG5cclxuICAgICAgLy8gd2Ugcm9sbGJhY2sgYSBwYXJlbnQgdGFzayB3aGlsZSBmb2N1c2VkIG9uIHN1YmZvcm0vdGFzay4gV2UgZG8gbm90IHdhbnQgdGhlIGN0cmwgb24gdGhlIHN1YmZvcm0gdG8gZG8gY3RybCBzdWZmaXguXHJcbiAgICAgIGxldCBsYXN0Rm9jdXNlZENvbnRyb2w6IE1nQ29udHJvbCA9IExhc3RGb2N1c2VkTWFuYWdlci5nZXRMYXN0Rm9jdXNlZENvbnRyb2woKTtcclxuICAgICAgaWYgKGxhc3RGb2N1c2VkQ29udHJvbCAhPT0gbnVsbCkge1xyXG4gICAgICAgIGxhc3RGb2N1c2VkQ29udHJvbC5nZXRGb3JtKCkuZ2V0VGFzaygpLnNldExldmVsKENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICghZXZ0LmlzUXVpdCgpKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuSGFuZGxlUGFya2FiaWxpdHlPblJvd0NoYW5nZSh0YXNrKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFFDUiMgOTQxMjc3OiBJZiBDYW5jZWwgZXZlbnQgaXMgY2FsbGVkIGZyb20gUXVpdCBldmVudCwgdGhlbiBkb24ndCBleGVjdXRlIEV4aXQgZXZlbnRcclxuICAgIC8vIGlmIHVzZXIgaGFzIHByZXNzZWQgJ05vJyBvbiBDb25maXJtIGNhbmNlbCBib3guXHJcbiAgICBpZiAoZXZ0LmlzUXVpdCgpKVxyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoTWdDb250cm9sQmFzZShjdHJsLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRVhJVCk7XHJcblxyXG4gICAgLy8gcmVzZXQgaXNSb3dFZGl0aW5nXHJcbiAgICBhd2FpdCBmb3JtLnN0b3BSb3dFZGl0aW5nKHNhdmVEaXNwbGF5TGluZSk7XHJcblxyXG4gICAgdGFzay5JbkhhbmRsZUFjdENhbmNlbCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBjYW5jZWwgdGhlIGVkaXRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImV2dFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidGFza1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZm9ybVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicmVjXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJvbGRSZWNNb2RlXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIHN0YXRpYyBhc3luYyBIYW5kbGVDYW5jZWxFZGl0KGV2dDogUnVuVGltZUV2ZW50LCB0YXNrOiBUYXNrLCBmb3JtOiBNZ0Zvcm0sIHJlYzogUmVjb3JkLCBvbGRSZWNNb2RlOiBEYXRhTW9kaWZpY2F0aW9uVHlwZXMpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIC8vIGlmIHRoZSBzeW5jZWQgcmVjb3JkIChpLmUuIHRoZSByZWNvcmQgZnJvbSB0aGUgcGFyZW50IHRhc2sgb2YgdGhlIHN1YmZvcm0pIGJlZm9yZSBSb2xsYmFjayB3YXMgaW4gJ0luc2VydCcgbW9kZSxcclxuICAgIC8vIHNvIGl0IG11c3QgYmUgaW4gJ0luc2VydCcgbW9yZSBhZnRlciByZXR1cm4gZnJvbSB0aGUgc2VydmVyXHJcbiAgICBpZiAocmVjLlN5bmNlZCAmJiBvbGRSZWNNb2RlID09PSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuSW5zZXJ0KVxyXG4gICAgICByZWMuc2V0TW9kZShvbGRSZWNNb2RlKTtcclxuXHJcbiAgICBpZiAoZm9ybSAhPT0gbnVsbCkge1xyXG4gICAgICAvLyByZXNldCB0aGUgbGFzdCBwYXJrZWQgY29udHJvbFxyXG4gICAgICBpZiAodGFzay5nZXRMYXN0UGFya2VkQ3RybCgpICE9PSBudWxsKVxyXG4gICAgICAgIHRhc2suZ2V0TGFzdFBhcmtlZEN0cmwoKS5yZXNldFByZXZWYWwoKTtcclxuXHJcbiAgICAgIGF3YWl0IGZvcm0uY2FuY2VsRWRpdCh0cnVlLCBldnQuaXNRdWl0KCkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZXZ0XCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0YXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkdlwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicmVjXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJub25JbnRlcmFjdGl2ZURlbGV0ZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIGFzeW5jIEhhbmRsZUFjdGlvbkRlbGxpbmUodGFzazogVGFzaywgZHY6IERhdGFWaWV3LCByZWM6IFJlY29yZCwgbm9uSW50ZXJhY3RpdmVEZWxldGU6IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCBsYXN0UGFya2VkQ3RybDogTWdDb250cm9sO1xyXG4gICAgbGV0IG15Zm9ybTogTWdGb3JtID0gPE1nRm9ybT50YXNrLmdldEZvcm0oKTtcclxuICAgIGxldCBzYXZlSXNSb3dFZGl0aW5nID0gbXlmb3JtLmdldElzUm93RWRpdGluZ0Zyb21HdWkobXlmb3JtLkRpc3BsYXlMaW5lKTsgLy9Db21tYW5kcy5nZXRJc1JvdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aE1nQ29udHJvbEJhc2UobGFzdFBhcmtlZEN0cmwsIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1BSRUZJWCk7d0VkaXRpbmcoIHRhc2suZ2V0Rm9ybSgpLmdldE1haW5Db250cm9sKCksIHRhc2suZ2V0Rm9ybSgpLkRpc3BsYXlMaW5lKTsgICAgbGV0IG9sZFJlY01vZGU6IERhdGFNb2RpZmljYXRpb25UeXBlcztcclxuICAgIGxldCBvbGRSZWNNb2RlOiBEYXRhTW9kaWZpY2F0aW9uVHlwZXM7XHJcbiAgICBpZiAoYXdhaXQgdGFzay5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfREVMRVRFLCB0cnVlKSkge1xyXG4gICAgICBsYXN0UGFya2VkQ3RybCA9IDxNZ0NvbnRyb2w+dGFzay5nZXRMYXN0UGFya2VkQ3RybCgpO1xyXG4gICAgICBpZiAobGFzdFBhcmtlZEN0cmwgIT09IG51bGwpXHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aE1nQ29udHJvbEJhc2UobGFzdFBhcmtlZEN0cmwsIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1NVRkZJWCk7XHJcbiAgICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKSB7XHJcbiAgICAgICAgb2xkUmVjTW9kZSA9IHJlYy5nZXRNb2RlKCk7XHJcblxyXG4gICAgICAgIC8vIEZvcmNlIHRoZSBjaGFuZ2UgdG8gZGVsZXRlIG1vZGVcclxuICAgICAgICByZWMuY2xlYXJNb2RlKCk7XHJcbiAgICAgICAgcmVjLnNldE1vZGUoRGF0YU1vZGlmaWNhdGlvblR5cGVzLkRlbGV0ZSk7XHJcblxyXG4gICAgICAgIGlmIChvbGRSZWNNb2RlID09PSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuSW5zZXJ0KVxyXG4gICAgICAgICAgcmVjLnNldFNlbmRUb1NlcnZlcihmYWxzZSk7XHJcblxyXG4gICAgICAgIC8vIGV4ZWN1dGUgdGFzayBzdWZmaXggaW4gTW9kaWZ5IG1vZGUgb3Igd2hlbiB0aGVyZSBpcyAnZm9yY2UgcmVjb3JkIHN1ZmZpeCcuXHJcbiAgICAgICAgaWYgKHJlYy5Nb2RpZmllZCB8fCBhd2FpdCB0YXNrLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9GT1JDRV9TVUZGSVgsIGZhbHNlKSkge1xyXG4gICAgICAgICAgdGFzay5zZXRNb2RlKENvbnN0YW50cy5UQVNLX01PREVfTU9ESUZZKTtcclxuICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKTtcclxuICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHRoZSByZWNvcmQgc3VmZml4IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHlcclxuICAgICAgICAgIGlmICh0aGlzLl9zdG9wRXhlY3V0aW9uKSB7XHJcbiAgICAgICAgICAgIGlmICghcmVjLlNlbmRUb1NlcnZlcikge1xyXG4gICAgICAgICAgICAgIGF3YWl0IGR2LmFkZEN1cnJUb01vZGlmaWVkKCk7XHJcbiAgICAgICAgICAgICAgcmVjLnNldFNlbmRUb1NlcnZlcih0cnVlKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmVjLmNsZWFyTW9kZSgpO1xyXG4gICAgICAgICAgICByZWMuc2V0TW9kZShvbGRSZWNNb2RlKTtcclxuICAgICAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uKGZhbHNlKTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG4gICAgICAgICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb24odHJ1ZSk7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gZXhlY3V0ZSByZWNvcmQgc3VmZml4IGluIERlbGV0ZSBtb2RlXHJcbiAgICAgICAgLy8gc2V0IHRoZSBJbkRlbGV0ZVByb2Nlc3MgZmxhZyAsIHNvIHdlIHdpbGwgbm90IHRyeSB0byBzZW5kIHVwZGF0ZXMgb24gdGhlIHJlY29yZCBhZnRlclxyXG4gICAgICAgIC8vIHdlIGRlbGV0ZSBpdCBpbiB0aGUgY29tbW9uSGFuZGxlckFmdGVyIChyZWMgc3VmZml4KS5cclxuICAgICAgICByZWMuc2V0SW5EZWxldGVQcm9jZXNzKHRydWUpO1xyXG5cclxuICAgICAgICB0YXNrLnNldE1vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9ERUxFVEUpO1xyXG4gICAgICAgIC8vIG5vIGNvbmZpcm0gbWVzc2FnZSBkaWFsb2cgaWYgaW4gbm9uIGludGVyYWN0aXZlIGRlbGV0ZS5cclxuICAgICAgICBsZXQgc2tpcENvbmZpcm1EaWFsb2c6IGJvb2xlYW4gPSBub25JbnRlcmFjdGl2ZURlbGV0ZTtcclxuXHJcbiAgICAgICAgaWYgKCFza2lwQ29uZmlybURpYWxvZykge1xyXG4gICAgICAgICAgaWYgKHRhc2subXVzdENvbmZpcm1JbkRlbGV0ZU1vZGUoKSB8fCBhd2FpdCB0YXNrLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DT05GSVJNX1VQREFURSwgZmFsc2UpKSB7XHJcbiAgICAgICAgICAgIGxldCBjb25maXJtZWQ6IGJvb2xlYW4gPSBhd2FpdCBHVUlNYW5hZ2VyLkluc3RhbmNlLmNvbmZpcm1fYm9vbChNc2dJbnRlcmZhY2UuQ09ORklSTV9TVFJfREVMRVRFKTtcclxuICAgICAgICAgICAgaWYgKCFjb25maXJtZWQpIHtcclxuICAgICAgICAgICAgICByZWMuY2xlYXJNb2RlKCk7XHJcbiAgICAgICAgICAgICAgcmVjLnNldE1vZGUob2xkUmVjTW9kZSk7XHJcbiAgICAgICAgICAgICAgdGFzay5zZXRNb2RlKENvbnN0YW50cy5UQVNLX01PREVfTU9ESUZZKTtcclxuICAgICAgICAgICAgICBpZiAobGFzdFBhcmtlZEN0cmwgIT09IG51bGwpXHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoTWdDb250cm9sQmFzZShsYXN0UGFya2VkQ3RybCwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfUFJFRklYKTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKHNhdmVJc1Jvd0VkaXRpbmcpIHtcclxuICAgICAgICAgICAgICAgIGxldCBteWZvcm06IE1nRm9ybSA9IDxNZ0Zvcm0+dGFzay5nZXRGb3JtKCk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBteWZvcm0uc3RhcnRSb3dFZGl0aW5nKG15Zm9ybS5EaXNwbGF5TGluZSk7XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG4gICAgICAgIHJlYy5zZXRJbkRlbGV0ZVByb2Nlc3MoZmFsc2UpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fc3RvcEV4ZWN1dGlvbikge1xyXG4gICAgICAgICAgaWYgKCFyZWMuU2VuZFRvU2VydmVyKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IGR2LmFkZEN1cnJUb01vZGlmaWVkKCk7XHJcbiAgICAgICAgICAgIHJlYy5zZXRTZW5kVG9TZXJ2ZXIodHJ1ZSk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgcmVjLmNsZWFyTW9kZSgpO1xyXG4gICAgICAgICAgcmVjLnNldE1vZGUob2xkUmVjTW9kZSk7XHJcbiAgICAgICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb24oZmFsc2UpO1xyXG4gICAgICAgICAgdGFzay5zZXRNb2RlKENvbnN0YW50cy5UQVNLX01PREVfTU9ESUZZKTtcclxuICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuICAgICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbih0cnVlKTtcclxuXHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIElmIHdlJ3JlIGRlbGV0aW5nIGFuIGluc2VydGVkIHJlY29yZCwgdGhlIHNlcnZlciBpcyBub3QgYXdhcmUgb2YgaXRcclxuICAgICAgICAvLyBtYWtlIHN1cmUgdGhhdCB1cG9uIGRlbGV0ZSwgaXQgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIG1vZGlmaWVkIHJlYyBsaXN0XHJcbiAgICAgICAgaWYgKG9sZFJlY01vZGUgPT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5JbnNlcnQpIHtcclxuICAgICAgICAgIHJlYy5jbGVhck1vZGUoKTtcclxuICAgICAgICAgIHJlYy5zZXRNb2RlKG9sZFJlY01vZGUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IG5ld0N1cnJSZWM6IFJlY29yZCA9IGR2LmdldEN1cnJSZWMoKTtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIC8vIFFDUiAjNDM4MTc1OiB3aGVuIHRoZSB1c2VyIGRlbGV0ZXMgYSByZWNvcmQsIHdoaWNoIGlzIHRoZSBzaW5nbGVcclxuICAgICAgICAgIC8vIHJlY29yZCBpbiB0aGUgZHYsIHRoZW4gd2hlbiBpdHMgcmVjb3JkIHN1ZmZpeCBpcyBleGVjdXRlZCBhbmQgdGhlXHJcbiAgICAgICAgICAvLyBzZXJ2ZXIgc2VuZHMgYSBuZXcgcmVjb3JkIHRvIHRoZSBjbGllbnQgYW5kIHNldCBpdCB0byBiZSB0aGVcclxuICAgICAgICAgIC8vIGN1cnJlbnQgcmVjb3JkLlxyXG4gICAgICAgICAgLy8gVGhpcyBmaXggbWFrZXMgdGhlIGRlbGV0ZWQgcmVjb3JkIHRvIGJlIHRoZSBjdXJyZW50IGZvciBhXHJcbiAgICAgICAgICAvLyBtb21lbnQganVzdCB0byBkZWxldGUgaXQgZnJvbSB0aGUgY2xpZW50cyBjYWNoZS4gVGhlbiwgaXQgbWFrZXNcclxuICAgICAgICAgIC8vIHRoZSBuZXcgcmVjb3JkIHRvIGJlIHRoZSBjdXJyZW50IGFnYWluIGFuZCBlbnRlcnMgaW50byBjcmVhdGUgbW9kZS5cclxuICAgICAgICAgIC8vIEkgdGhpbmsgdGhhdCBhIGJldHRlciBzb2x1dGlvbiBpcyB0byBkZWNpZGUgd2hldGhlciB0aGUgY2xpZW50IGlzXHJcbiAgICAgICAgICAvLyByZXNwb25zaWJsZSBmb3IgYWRkaW5nIGEgbmV3IHJlY29yZCBvciB0aGUgc2VydmVyLCBhbmQgbWFrZSBzdXJlXHJcbiAgICAgICAgICAvLyB0aGF0IGl0IGlzIGRvbmUgc3lzdGVtd2lkZS5cclxuICAgICAgICAgIC8vIEVodWQgLSAxMC8wOS8yMDAxXHJcbiAgICAgICAgICBpZiAocmVjICE9PSBuZXdDdXJyUmVjKVxyXG4gICAgICAgICAgICBhd2FpdCBkdi5zZXRDdXJyUmVjKHJlYy5nZXRJZCgpLCBmYWxzZSk7XHJcblxyXG4gICAgICAgICAgLy8gbm8gbmVlZCB0byBkZWwgdGhlIGN1cnIgcmVjIGFuZCBwb3NpdGlvbiBvbiB0aGUgbmV4IHJlYyBpZiB0aGUgdGFzayBpcyBhYm9ydGluZy5cclxuICAgICAgICAgIC8vIFRoZSBkZWxDdXJyUmVjIG1heSBjYXVzZSBhIGNyYXNoIGlmIGl0IHRyaWVzIHRvIGdldCB0aGUgbmV4dCByZWMgZnJvbSB0aGUgbmV4dCBjaHVuay5cclxuICAgICAgICAgIGlmICghdGFzay5pc0Fib3J0aW5nKCkpXHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZGVsQ3VyclJlYyh0YXNrLCBmYWxzZSk7XHJcbiAgICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICAgIC8vIFFDUiAjNDM4MTc1IC0gZml4IGNvbnRpbnVlXHJcbiAgICAgICAgICBpZiAocmVjICE9PSBuZXdDdXJyUmVjKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IGR2LnNldEN1cnJSZWMobmV3Q3VyclJlYy5nZXRJZCgpLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIGlmIChkdi5nZXRTaXplKCkgPT09IDEpXHJcbiAgICAgICAgICAgICAgdGFzay5zZXRNb2RlKENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vIEluIGludGVyYWN0aXZlLCB0aGUgbW9kZSBtaWdodCBjaGFuZ2UgdG8gbW9kaWZ5IG9yIGNyZWF0ZS4gSG93ZXZlciwgZm9yIG5vbiBpbnRlcmFjdGl2ZSAoZGVsZXRlIG1vZGUpXHJcbiAgICAgICAgICAvLyB0aGUgbW9kZSBzaG91bGQgYmUgc2V0IGJhY2sgdG8gZGVsZXRlIGFuZCB3aWxsIGJlIHVzZWQgaW4gdGhlIG5leHQgcmVjb3JkIGN5Y2xlLlxyXG4gICAgICAgICAgaWYgKG5vbkludGVyYWN0aXZlRGVsZXRlKVxyXG4gICAgICAgICAgICB0YXNrLnNldE1vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9ERUxFVEUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGhhbmRsZSB2aWV3IHJlZnJlc2gsIHNjcmVlbiByZWZyZXNoIGFuZCByZWNvcmQgZmx1c2ggZXZlbnRzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImV2dFwiPnRoZSBldmVudCB0byBoYW5kbGUgd2l0aCBhbGwgaXRzIHByb3BlcnRpZXM8L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlUmVmcmVzaEV2ZW50cyhldnQ6IFJ1blRpbWVFdmVudCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHRhc2s6IFRhc2sgPSA8VGFzaz5ldnQuZ2V0VGFzaygpO1xyXG4gICAgbGV0IGZvcm06IE1nRm9ybSA9IDxNZ0Zvcm0+dGFzay5nZXRGb3JtKCk7XHJcbiAgICBsZXQgZHY6IERhdGFWaWV3ID0gPERhdGFWaWV3PnRhc2suRGF0YVZpZXc7XHJcbiAgICBsZXQgaW50RXZ0Q29kZTogbnVtYmVyID0gZXZ0LmdldEludGVybmFsQ29kZSgpO1xyXG4gICAgbGV0IGNtZDogSUNsaWVudENvbW1hbmQgPSBudWxsO1xyXG5cclxuICAgIGlmIChpbnRFdnRDb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUkVGUkVTSF9SRUNPUkQpXHJcbiAgICAgIHRoaXMuX2lzSW5SZWNvcmRGbHVzaEV2ZW50ID0gdHJ1ZTtcclxuICAgIC8vIGNoZWNrIGlmIHdlIHRyeSB0byB2aWV3IHJlZnJlc2ggd2l0aCBhbGxvd19tb2RpZnk9biBpbiBjcmVhdGUgbW9kZVxyXG4gICAgaWYgKGludEV2dENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9SRUZSRVNIX1ZJRVcgJiYgdGFzay5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFICYmICFhd2FpdCB0YXNrLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19NT0RJRlksIHRydWUpKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FWElUKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGF3YWl0IHRhc2suRXhlY3V0ZU5lc3RlZFJTKExhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKSk7XHJcbiAgICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpICYmICF0YXNrLkluRW5kVGFzayAmJiAhdGFzay5pc0Fib3J0aW5nKCkpIHtcclxuICAgICAgICBpZiAoaW50RXZ0Q29kZSAhPT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1JFRlJFU0hfU0NSRUVOKSB7XHJcbiAgICAgICAgICBsZXQgY3VycmVudFJvdzogbnVtYmVyID0gMDtcclxuICAgICAgICAgIGlmICghZXZ0LmdldFJlZnJlc2hUeXBlKCkpIHtcclxuICAgICAgICAgICAgaWYgKGV2dC5SdFZpZXdSZWZyZXNoVXNlQ3VycmVudFJvdygpICYmIHRhc2suSXNJbnRlcmFjdGl2ZSkge1xyXG4gICAgICAgICAgICAgIGN1cnJlbnRSb3cgPSBmb3JtLmdldEN1cnJSZWNQb3NJbkZvcm0oKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjbWQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVJbnRlcm5hbFJlZnJlc2hDb21tYW5kKHRhc2suZ2V0VGFza1RhZygpLCBpbnRFdnRDb2RlLCBkdi5DdXJyZW50UmVjSWQsIGN1cnJlbnRSb3cpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHRhc2suSXNJbnRlcmFjdGl2ZSlcclxuICAgICAgICAgICAgICBjdXJyZW50Um93ID0gZm9ybS5nZXRDdXJyUmVjUG9zSW5Gb3JtKCk7XHJcblxyXG4gICAgICAgICAgICBsZXQgcmVmZXRjaFJlY29yZDogYm9vbGVhbiA9IHRydWU7IC8vUmVmZXRjaCByZWNvcmQgZnJvbSBzZXJ2ZXIuXHJcbiAgICAgICAgICAgIGlmIChpbnRFdnRDb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUkVGUkVTSF9SRUNPUkQgJiYgZXZ0LmdldEFyZ0xpc3QoKSAhPT0gbnVsbCAmJiBldnQuZ2V0QXJnTGlzdCgpLmdldFNpemUoKSAhPT0gMCkge1xyXG4gICAgICAgICAgICAgIGxldCByZWZldGNoUmVjU3RyOiBzdHJpbmc7XHJcbiAgICAgICAgICAgICAgcmVmZXRjaFJlY1N0ciA9IGF3YWl0IGV2dC5nZXRBcmdMaXN0KCkuZ2V0QXJnVmFsdWUoMCwgU3RvcmFnZUF0dHJpYnV0ZS5CT09MRUFOLCAwKTtcclxuICAgICAgICAgICAgICByZWZldGNoUmVjb3JkID0gKGlzTnVsbE9yVW5kZWZpbmVkKHJlZmV0Y2hSZWNTdHIpIHx8IHJlZmV0Y2hSZWNTdHIgPT09ICcxJyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChyZWZldGNoUmVjb3JkKVxyXG4gICAgICAgICAgICAgIGNtZCA9IGF3YWl0IENvbW1hbmRGYWN0b3J5LkNyZWF0ZVJlYWxSZWZyZXNoQ29tbWFuZCh0YXNrLmdldFRhc2tUYWcoKSwgaW50RXZ0Q29kZSwgY3VycmVudFJvdywgZXZ0LmdldEFyZ0xpc3QoKSwgZHYuQ3VycmVudFJlY0lkKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gc2NyZWVuIHJlZnJlc2ggZXZlbnRcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGxldCBpZDogbnVtYmVyO1xyXG5cclxuICAgICAgICAgIGlmICh0YXNrLmdldEZvcm0oKSA9PT0gbnVsbClcclxuICAgICAgICAgICAgaWQgPSAwO1xyXG4gICAgICAgICAgZWxzZSBpZiAodGFzay5nZXRGb3JtKCkuaXNTY3JlZW5Nb2RlKCkpXHJcbiAgICAgICAgICAgIGlkID0gKCg8RGF0YVZpZXc+dGFzay5EYXRhVmlldykuZ2V0Q3VyclJlYygpKS5nZXRJZCgpO1xyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICBpZCA9ICg8RGF0YVZpZXc+dGFzay5EYXRhVmlldykuZ2V0UmVjQnlJZHgoKDxEYXRhVmlldz50YXNrLkRhdGFWaWV3KS5nZXRUb3BSZWNJZHgoKSkuZ2V0SWQoKTtcclxuXHJcbiAgICAgICAgICBjbWQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVTY3JlZW5SZWZyZXNoQ29tbWFuZCh0YXNrLmdldFRhc2tUYWcoKSwgaWQsIGR2LkN1cnJlbnRSZWNJZCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyByZWFsIHZpZXcgcmVmcmVzaCBjYXVzZXMgdGhlIGNhY2hlIG9mIHRoZSBjdXJyZW50IHN1YiBmb3JtIHRhc2sgdG8gYmUgY2xlYXJlZFxyXG4gICAgICAgIGlmIChpbnRFdnRDb2RlICE9PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUkVGUkVTSF9TQ1JFRU4pXHJcbiAgICAgICAgLy8gc2NyZWVuIHJlZnJlc2ggZG9lcyBub3QgY2xlYXIgdGhlIGNhY2hlXHJcbiAgICAgICAgICB0YXNrLmdldFRhc2tDYWNoZSgpLmNsZWFyQ2FjaGUoKTtcclxuXHJcbiAgICAgICAgaWYgKGNtZCAhPT0gbnVsbClcclxuICAgICAgICAgIGF3YWl0IHRhc2suRGF0YXZpZXdNYW5hZ2VyLkV4ZWN1dGUoY21kKTtcclxuXHJcbiAgICAgICAgdGhpcy5faXNJblJlY29yZEZsdXNoRXZlbnQgPSBmYWxzZTtcclxuICAgICAgICAvLyBRQ1IgIzI4OTIyMi4gRG8gbm90IGNvbnRpbnVlIHdpdGggUmVmcmVzaCBpZiB0aGUgdGFzayBtdXN0IGJlIGVuZGVkLlxyXG4gICAgICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpICYmICF0YXNrLkluRW5kVGFzayAmJiAhdGFzay5pc0Fib3J0aW5nKCkpIHtcclxuICAgICAgICAgIC8vIEFmdGVyIHZpZXcgcmVmcmVzaCwgdGhlIHNlcnZlciBhbHdheXMgcmV0dXJucyBjdXJyIHJlYyBhcyBmaXJzdCByZWMuXHJcbiAgICAgICAgICBpZiAoaW50RXZ0Q29kZSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1JFRlJFU0hfVklFVyAmJiAhZm9ybS5pc1NjcmVlbk1vZGUoKSkge1xyXG4gICAgICAgICAgICBkdi5zZXRUb3BSZWNJZHgoMCk7XHJcbiAgICAgICAgICAgIGlmIChmb3JtLkhhc1RhYmxlKCkpIHtcclxuICAgICAgICAgICAgICBmb3JtLmNsZWFyVGFibGVDb2x1bW5Tb3J0TWFyayh0cnVlKTtcclxuICAgICAgICAgICAgICBhd2FpdCBmb3JtLnJlc3RvcmVPbGREaXNwbGF5TGluZShmb3JtLnJlY29yZElkeDJEaXNwbGF5TGluZShkdi5nZXRDdXJyUmVjSWR4KCkpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vIEFmdGVyIHJlY29yZCBoYXMgYmVlbiBmbHVzaGVkIGl0IGlzIG5vdCBjb25zaWRlcmVkIGEgbmV3IHJlY29yZCBhbnltb3JlLlxyXG4gICAgICAgICAgaWYgKGludEV2dENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9SRUZSRVNIX1JFQ09SRCAmJiB0YXNrLmdldE1vZGUoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9RVUVSWSAmJiAhdGFzay5nZXRBZnRlclJldHJ5KCkpIHtcclxuICAgICAgICAgICAgaWYgKHRhc2suZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSkge1xyXG4gICAgICAgICAgICAgIHRhc2suc2V0TW9kZShDb25zdGFudHMuVEFTS19NT0RFX01PRElGWSk7XHJcbiAgICAgICAgICAgICAgKCg8RGF0YVZpZXc+dGFzay5EYXRhVmlldykuZ2V0Q3VyclJlYygpKS5zZXRPbGRSZWMoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBhd2FpdCBkdi5jdXJyUmVjQ29tcHV0ZSh0cnVlKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoaW50RXZ0Q29kZSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1JFRlJFU0hfU0NSRUVOICYmIHRhc2suZ2V0TW9kZSgpICE9PSBDb25zdGFudHMuVEFTS19NT0RFX1FVRVJZICYmICF0YXNrLmdldEFmdGVyUmV0cnkoKSkge1xyXG4gICAgICAgICAgICBhd2FpdCBkdi5jdXJyUmVjQ29tcHV0ZSh0cnVlKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyBRQ1IgIzQzMDA1OS4gSWYgdGhlIGZvY3VzZWQgdGFzayBhbmQgdGhlIHJlZnJlc2hlZCB0YXNrIGlzIHRoZSBzYW1lIHRhc2sgb3JcclxuICAgICAgICAgIC8vIHRoZSBmb2N1c2VkIHRhc2sgaXMgYSBjaGlsZCBvZiB0aGUgcmVmcmVzaGVkIHRhc2ssIGdvIHRvIHRoZSBmaXJzdCBjb250cm9sIGluIHRoZSBmaXJzdCBsaW5lLlxyXG4gICAgICAgICAgLy8gSWYgdGhlIGZvY3VzZWQgdGFzayBpcyB0aGUgcGFyZW50IHRhc2ssIGRvIG5vdCBsZWF2ZSB0aGUgY3VycmVudCBjb250cm9sLlxyXG4gICAgICAgICAgdGhpcy5zZXRJc0luVmlld1JlZnJlc2godHJ1ZSk7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICAgICAgICBpZiAoIXRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSAmJiAhdGFzay5nZXRQcmV2ZW50Q29udHJvbENoYW5nZSgpKSB7XHJcbiAgICAgICAgICAgIGlmICghKHRhc2sgPT09IExhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKSB8fCAhdGFzay5wYXRoQ29udGFpbnMoTGFzdEZvY3VzZWRNYW5hZ2VyLkluc3RhbmNlLmdldExhc3RGb2N1c2VkVGFzaygpKSkpXHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEdvIHRvIGNyZWF0ZSBtb2RlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRhc2tcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY21kc1wiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBnb3RvQ3JlYXRlTW9kZSh0YXNrOiBUYXNrKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgY21kOiBJQ2xpZW50Q29tbWFuZDtcclxuICAgIGF3YWl0IHRhc2suZW5hYmxlTW9kZXMoKTtcclxuICAgIC8vIFFDUiAjNDE3NzMzLiBFeGVjdXRlIFJTJ3Mgb2YgdGhlIG5lc3RlZCBzdWJmb3JtcyBpZiB0aGUgY3VycmVudCB0YXNrIGlzIG9uZSBvZiB0aGUgbmVzdGVkIHN1YmZvcm1zLlxyXG4gICAgYXdhaXQgdGFzay5FeGVjdXRlTmVzdGVkUlMoTGFzdEZvY3VzZWRNYW5hZ2VyLkluc3RhbmNlLmdldExhc3RGb2N1c2VkVGFzaygpKTtcclxuICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKVxyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcbiAgICBpZiAoIXRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSkge1xyXG4gICAgICBjbWQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVFdmVudENvbW1hbmQodGFzay5nZXRUYXNrVGFnKCksIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVE9fQ1JFQVRFKTtcclxuICAgICAgYXdhaXQgdGFzay5EYXRhdmlld01hbmFnZXIuRXhlY3V0ZShjbWQpO1xyXG4gICAgICBpZiAodGFzay5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKVxyXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuICAgICAgYXdhaXQgdGhpcy5IYW5kbGVOb25QYXJrYWJsZUNvbnRyb2xzKHRhc2spO1xyXG4gICAgICBhd2FpdCB0YXNrLnNldENyZWF0ZURlbGV0ZUFjdHNFbmFibGVTdGF0ZSgpO1xyXG4gICAgICB0YXNrLnNldE9yaWdpbmFsVGFza01vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpO1xyXG5cclxuICAgICAgYXdhaXQgdGhpcy5IYW5kbGVBY3RFbnRlclJvd0VkaXRpbmcodGFzayk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZG8gc29tZSBkZWZhdWx0IG9wZXJhdGlvbnMgZm9yIGFuIGV2ZW50IGFmdGVyIGFsbCB0aGUgaGFuZGxlcnMgZmluaXNoZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicmNCZWZvcmVcIj50aGUgUkMgcmV0dXJuZWQgZnJvbSB0aGUgY29tbW9uSGFuZGxlckJlZm9yZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwcm9wb2dhdGVcIj5pZiBldmVudCB3YXMgcHJvcG9nYXRlZDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJFdmVudFwiPnRoZSBldmVudCB0byBoYW5kbGU8L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgY29tbW9uSGFuZGxlckFmdGVyKGV2dDogUnVuVGltZUV2ZW50LCByY0JlZm9yZTogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHRhc2s6IFRhc2sgPSA8VGFzaz5ldnQuZ2V0VGFzaygpO1xyXG4gICAgbGV0IGR2OiBEYXRhVmlldztcclxuICAgIGxldCByZWM6IFJlY29yZCA9IG51bGw7XHJcbiAgICBsZXQgY3RybDogTWdDb250cm9sO1xyXG4gICAgbGV0IHJlY01vZGlmaWVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgcmVjTW9kZUlzRGVsZXRlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgZm9yY2VTdWZmaXg6IGJvb2xlYW47XHJcblxyXG4gICAgaWYgKHRoaXMuX3N0b3BFeGVjdXRpb24gJiYgZXZ0LmdldEludGVybmFsQ29kZSgpICE9PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCAmJiBldnQuZ2V0SW50ZXJuYWxDb2RlKCkgIT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1NVRkZJWClcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIGlmIChldnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0lOVEVSTkFMKSB7XHJcbiAgICAgIGR2ID0gPERhdGFWaWV3PnRhc2suRGF0YVZpZXc7XHJcbiAgICAgIHJlYyA9IGR2LmdldEN1cnJSZWMoKTtcclxuICAgICAgY3RybCA9IDxNZ0NvbnRyb2w+ZXZ0LkNvbnRyb2w7XHJcblxyXG4gICAgICBzd2l0Y2ggKGV2dC5nZXRJbnRlcm5hbENvZGUoKSkge1xyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVg6XHJcbiAgICAgICAgICBpZiAocmNCZWZvcmUpIHtcclxuICAgICAgICAgICAgLy8gaGFuZGxlIHJlY29yZCBwcmVmaXggZm9yIHRoZSBzdWIgdGFza3MgdG9vXHJcbiAgICAgICAgICAgIGlmIChhd2FpdCB0YXNrLkNoZWNrUmVmcmVzaFN1YlRhc2tzKCkpXHJcbiAgICAgICAgICAgICAgYXdhaXQgdGFzay5kb1N1YmZvcm1SZWNQcmVmaXhTdWZmaXgoKTtcclxuICAgICAgICAgICAgYXdhaXQgdGFzay5oYW5kbGVFdmVudE9uU2xhdmVUYXNrcyhJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICAgICAgICAgIGF3YWl0IHRhc2suZW5hYmxlTW9kZXMoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYOlxyXG4gICAgICAgICAgdGFzay5pc0ZpcnN0UmVjb3JkQ3ljbGUoZmFsc2UpO1xyXG4gICAgICAgICAgLy8gT25jZSBhcmUgcmVhZHkgdG8gZW5kIHRoZSBSUywgaXQgbWVhbnMgd2UgY2Fubm90IGJlIHRoZSBGSVJTVCByZWNvcmQgY3ljbGVcclxuICAgICAgICAgIGlmICh0YXNrLmdldFByZXZlbnRSZWNvcmRTdWZmaXgoKSkge1xyXG4gICAgICAgICAgICB0YXNrLnNldFByZXZlbnRSZWNvcmRTdWZmaXgoZmFsc2UpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy8gUUNSICMxMTU5NTEuIEV2ZW4gaWYgcmVjb3JkIHN1ZmZpeCBpcyBub3QgZXhlY3V0ZWQsIGluIHRoZSBuZXh0IHRpbWUgZG8gbm90IGV4ZWN1dGUgUlAgJiBSUyBvZiB0aGUgc3ViZm9ybS5cclxuICAgICAgICAgIHRhc2suRG9TdWJmb3JtUHJlZml4U3VmZml4ID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMuX3N0b3BFeGVjdXRpb24pIHtcclxuICAgICAgICAgICAgLy8gUUNSICM5ODQwMzE6IGlmIHRoZSBkZWxldGUgb3BlcmF0aW9uIGZhaWxlZCBkdWUgdG8gXCJ2ZXJpZnkgZXJyb3JcIlxyXG4gICAgICAgICAgICAvLyBpbiB0aGUgcmVjb3JkIHN1ZmZpeCB0aGVuIHRoZSByZWNvcmQgbW9kZSBtdXN0IGJlIGNsZWFyZWRcclxuICAgICAgICAgICAgaWYgKHJlYy5nZXRNb2RlKCkgPT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5EZWxldGUpXHJcbiAgICAgICAgICAgICAgcmVjLmNsZWFyTW9kZSgpO1xyXG4gICAgICAgICAgICAvLyBRY3IgNzgzMDM5IDogSWYgd2UgYXJlIGFscmVhZHkgaW4gY29udHJvbCBsZXZlbCBpdCBtZWFucyB0aGF0IGNvbnRyb2wgcHJlZml4IHdhcyBhbHJlYWR5IGRvbmUgb3IgdGhhdFxyXG4gICAgICAgICAgICAvLyBjb250cm9sIHN1ZmZpeCB3YXMgbm90IGRvbmUuIEVpdGhlciB3YXkgdGhlcmUgaXMgbm8gbmVlZCB0byBkbyBjb250cm9sIHByZWZpeCBhZ2Fpbi5cclxuICAgICAgICAgICAgaWYgKHRhc2suZ2V0TGV2ZWwoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfQ09OVFJPTCkge1xyXG4gICAgICAgICAgICAgIGxldCBsYXN0ID0gPE1nQ29udHJvbD50aGlzLmdldFN0b3BFeGVjdXRpb25DdHJsKCk7XHJcbiAgICAgICAgICAgICAgaWYgKGxhc3QgPT09IG51bGwpXHJcbiAgICAgICAgICAgICAgICBsYXN0ID0gPE1nQ29udHJvbD50YXNrLmdldExhc3RQYXJrZWRDdHJsKCk7XHJcblxyXG4gICAgICAgICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbihmYWxzZSk7XHJcbiAgICAgICAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uQ3RybChudWxsKTtcclxuXHJcbiAgICAgICAgICAgICAgLy8gUUNSIDQyNjI4MyBpcyB3ZSBoYXZlIGEgc3ViLWZvcm0gdGhhdCB3YXMgbmV2ZXIgYmVlbiBlbnRlcmVkXHJcbiAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIGNvbnRyb2wgbGV2ZWwgd2lsbCBub3QgYmUgZW50ZXJlZFxyXG4gICAgICAgICAgICAgIGlmIChsYXN0ICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIC8vIHdlIGRvbm90IHdhbnQgQ1MgdG8gYmUgY2FsbGVkIGFnYWluIGZyb20gQ1AgaW5jYXNlIG9mIHZlcmlmeSBlcnIgaW4gQ1ZcclxuICAgICAgICAgICAgICAgIHRhc2suc2V0TGV2ZWwoQ29uc3RhbnRzLlRBU0tfTEVWRUxfUkVDT1JEKTtcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgaW5DdHJsUHJlZml4OiBib29sZWFuID0gdGFzay5JbkN0cmxQcmVmaXg7XHJcbiAgICAgICAgICAgICAgICB0YXNrLkluQ3RybFByZWZpeCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aE1nQ29udHJvbEJhc2UobGFzdCwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfUFJFRklYKTtcclxuICAgICAgICAgICAgICAgIHRhc2suSW5DdHJsUHJlZml4ID0gaW5DdHJsUHJlZml4O1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgLy8gaW4gdGhlIGZ1dHVyZSBjaGVjayB0aGUgc3RvcEV4ZWN1dGlvbiBmbGFnIGhlcmUgdG9vIGFuZCBkaXNwbGF5IGFcclxuICAgICAgICAgICAgICAvLyBjb25maXJtIGNhbmNlbCBkaWFsb2cgdGhhdCB3aWxsIGNsb3NlIHRoZSBicm93c2VyIGlmIHRoZSB2YWx1ZSBpcyB0cnVlXHJcbiAgICAgICAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uKHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIERlZmVjdCAxNTI4NzE6IFdpdGggbmV3IHdheSBvZiBlZGl0aW5nIHJvdywgUlMgaXMgbm90IGZpcmVkIGluZmluaXRlbHksIGJ1dCByb3cgc2VsZWN0aW9uIGlzIHNoaWZ0ZWQgdG8gbmV3IHJvdy4gQWxzbyByb3cgbGVhdmVzIGVkaXRpbmcgbW9kZS5cclxuICAgICAgICAgICAgLy8gU28gZW5zdXJlIHJvdyBlZGl0aW5nIGlzIGxlZnQgd2hlbiB0aGVyZSBpcyBubyB2ZXJpZnkgZXJyb3IgYW5kIG5vdCB1bmNvbmRpdGlvbmFsbHkuXHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuSGFuZGxlU3RvcFJvd0VkaXRpbmcodGFzayk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKHJlYyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJlY01vZGlmaWVkID0gcmVjLk1vZGlmaWVkO1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuX3N0b3BFeGVjdXRpb24gJiYgcmVjLmlzQ2F1c2VJbnZhbGlkYXRpb24oKSkge1xyXG4gICAgICAgICAgICAgICg8TWdGb3JtPnRhc2suZ2V0Rm9ybSgpKS5pbnZhbGlkYXRlVGFibGUoKTtcclxuICAgICAgICAgICAgICByZWMuc2V0Q2F1c2VJbnZhbGlkYXRpb24oZmFsc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJlY01vZGVJc0RlbGV0ZSA9IChyZWMuZ2V0TW9kZSgpID09PSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuRGVsZXRlKTtcclxuXHJcbiAgICAgICAgICAgIGZvcmNlU3VmZml4ID0gYXdhaXQgdGFzay5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRk9SQ0VfU1VGRklYLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIC8vIGlmIHRoZSByZWNvcmQgaXMgZGVsZXRlZCB0aGVuIGV4ZWN1dGUgdGhlIFwicmVjIHN1ZmZpeCBhZnRlclwiIG9ubHlcclxuICAgICAgICAgICAgLy8gd2hlbiB0aGUgdGFzayBtb2RlIGlzIGRlbGV0ZSAoc2Vjb25kIHJvdW5kKVxyXG4gICAgICAgICAgICAvLyBpbkRlbGV0ZVByb2Nlc3MgOiBpZiB0aGVyZSBpcyBhbiAnRU5EIFRBU0sgQ09ORCcgd2Ugd2lsbCBoYXZlIGEgM3JkIGN5Y2xlIGluIHJlY29yZCBzdWZmaXgod2hlbiB1cGQrZGVsIG9yIGZvcmNlIHN1ZmYgKyBkZWwpLlxyXG4gICAgICAgICAgICAvLyAxc3QgY3ljbGUgOiB1cGRhZSBjeWNsZSAodGFzayBtb2RlIHdpbGwgYmUgdXBkYXRlKSwgMm5kIDogdGFzayBtb2RlIGlzIGRlbGV0ZSAsIHRoaXMgaXMgd2hlbiB3ZSBzZW5kIHRoZSBkZWxldGUgdG8gdGhlIHNlcnZlci5cclxuICAgICAgICAgICAgLy8gM3JkIC0gc3VmZml4IHRoYXQgaXMgY2FsbGVkIGZyb20gdGhlIGVuZFRhc2suIEluIHRoZSAzcmQgY3ljbGUgdGhlIHJlY01vZGVJc0RlbGV0ZSB3aWxsIGJlIGZhbHNlIGFsdGhvdWdoIHdlIGFyZSBzdGlsbCBpbiB0aGUgZGVsZXRlIHByb2Nlc3MgKHdlIGFscmVhZHkgc2VudCB0aGUgZGVsZXRlIG9wZXIpLlxyXG4gICAgICAgICAgICAvLyBBIGNvbWJpbmF0aW9uIG9mIGZvcmNlIHN1ZmZpeCArIGVuZCB0YXNrIGNvbmQgKyBkZWwgbGluZSAsIHdpbGwgY3Jhc2ggdGhlIHNlcnZlciBvbiB0aGUgM3JkIGN5Y2xlIHNpbmNlIHdlIHdpbGwgYXNrIGZvciB1cGRhdGUgb2ZmXHJcbiAgICAgICAgICAgIC8vIGEgcmVjb3JkIHRoYXQgdGhlIHNlcnZlciBoYWQgZGVsZXRlZCBvbiB0aGUgMm5kIGN5Y2xlLiBUaGF0IGl0IHdoeSB3ZSB1c2UgJ2luRGVsZXRlUHJvY2VzcycsIHNvIHdpbGwgd2lsbCBrbm93IG5vdFxyXG4gICAgICAgICAgICAvLyB0byBhZGQgdXBkYXRlIG9wZXIgb24gYW4gYWxyZWFkeSBkZWxldGVkIHJlY29yZC4gKFFjciAjNzkwMjgzKS5cclxuICAgICAgICAgICAgLy8gKiB0aGVyZSBpcyBzdGlsbCBhIHByb2JsZW0gaW4gJ3VwZGF0ZScgYW5kICdpbnNlcnQnIHdpdGggJ2VuZCB0YXNrIGNvbmQnICsgJ2ZvcmNlJyA6IGFuIGV4dHJhIHVwZGF0ZSB3aWxsIGJlIHNlbmRcclxuICAgICAgICAgICAgLy8gICB0byB0aGUgc2VydmVyIG9uIHRoZSByZWMgc3VmZml4IG9mIHRoZSBlbmQgdGFzay4gYnV0IGFwYXJ0IGZyb20gc2VydmVyIHVwZGF0ZSBpdCBjYXVzZXMgbm8gcmVhbCBwcm9ibGVtLlxyXG4gICAgICAgICAgICBpZiAocmVjTW9kZUlzRGVsZXRlICYmIHRhc2suZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0RFTEVURSB8fFxyXG4gICAgICAgICAgICAgICFyZWNNb2RlSXNEZWxldGUgJiYgIXJlYy5pbkRlbGV0ZVByb2Nlc3MoKSAmJiAocmVjTW9kaWZpZWQgfHwgZm9yY2VTdWZmaXgpKSB7XHJcbiAgICAgICAgICAgICAgcmVjLnNldE1vZGUoRGF0YU1vZGlmaWNhdGlvblR5cGVzLlVwZGF0ZSk7XHJcbiAgICAgICAgICAgICAgYXdhaXQgZHYuYWRkQ3VyclRvTW9kaWZpZWQoKTtcclxuICAgICAgICAgICAgICBkdi5zZXRDaGFuZ2VkKHRydWUpO1xyXG5cclxuICAgICAgICAgICAgICBpZiAocmVjTW9kaWZpZWQgJiYgdGFzay5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfUVVFUlkpIHtcclxuICAgICAgICAgICAgICAgIGlmIChyZWMucmVhbE1vZGlmaWVkKCkgJiZcclxuICAgICAgICAgICAgICAgICAgIUVudmlyb25tZW50Lkluc3RhbmNlLmFsbG93VXBkYXRlSW5RdWVyeU1vZGUodGFzay5nZXRDb21wSWR4KCkpKSB7XHJcbiAgICAgICAgICAgICAgICAgIC8vIGlmIHJlYWwgZmllbGRzIHdlcmUgbW9kaWZpZWRcclxuICAgICAgICAgICAgICAgICAgYXdhaXQgZHYuY2FuY2VsRWRpdChFdmVudHNNYW5hZ2VyLlJFQUxfT05MWSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICB0YXNrLldyaXRlVG9NZXNzYWdlUGFuZWJ5TXNnSWQoTXNnSW50ZXJmYWNlLlJUX1NUUl9VUERBVEVfSU5fUVVFUlkpO1xyXG4gICAgICAgICAgICAgICAgICBhd2FpdCAoPE1nRm9ybT50YXNrLmdldEZvcm0oKSkuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9DVVJSX1JFQyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyB3ZSBtdXN0IGNvbnRpbnVlIGhlcmUgYW5kIHRyeSB0byBjb21taXQgdGhlIHRyYW5zYWN0aW9uIGJlY2F1c2VcclxuICAgICAgICAgICAgICAgIC8vIHRoZXJlIG1pZ2h0IGJlIGFsc28gc29tZSBzdWIgdGFza3MgdG8gdGhpcyB0YXNrXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBRQ1IjNzc2Mjk1OiBmb3IgcHJlIHJlY29yZCB1cGRhdGUsIGNvbW1pdCB0aGUgcmVjb3JkIGFmdGVyIGhhbmRsZXIncyBleGVjdXRpb24uXHJcbiAgICAgICAgICAgIC8vIEZpeGVkIGJ1ZyAjOjMwNjkyOSwgRm9yY2VFeGl0UHJlIGlzIHJlbGV2YW50IG9ubHkgZm9yIHRoZSB0YXNrIHRoYXQgcmFpc2VkIHRoZSBldmVudFxyXG4gICAgICAgICAgICAvLyBzZWUgYWxzbyBidWcjOjI5Mjg3NlxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNGb3JjZUV4aXRQcmVSZWNvcmRVcGRhdGUodGFzaykgJiZcclxuICAgICAgICAgICAgICAvLyBEZWZlY3QgMTU0MDQ3IDogZG8gbm90IHRyeSBhbmQgY29tbWl0IGlmIHRhc2sgaXMgYWJvcnRpbmcgYW5kIHdhcyBhbHJlYWR5IHJlbW92ZWQgKG9yIGFsbCBNR0Qgd2FzIHJlbW92ZWQpLlxyXG4gICAgICAgICAgICAgICghdGFzay5pc0Fib3J0aW5nKCkgfHwgTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5HZXRUYXNrQnlJRCh0YXNrLmdldFRhc2tUYWcoKSkgIT0gbnVsbCkpIHtcclxuICAgICAgICAgICAgICBpZiAoKCFyZWNNb2RlSXNEZWxldGUgfHwgdGFzay5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfREVMRVRFKSlcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY29tbWl0UmVjb3JkKHRhc2ssIGV2dC5yZXZlcnNpYmxlRXhpdCgpKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCF0YXNrLnRyYW5zYWN0aW9uRmFpbGVkKENvbnN0SW50ZXJmYWNlLlRSQU5TX1JFQ09SRF9QUkVGSVgpICYmICF0YXNrLmlzQWJvcnRpbmcoKSkge1xyXG4gICAgICAgICAgICAgIC8vIGNoZWNrIHdoZXRoZXIgdG8gZXZhbHVhdGUgdGhlIGVuZCBjb25kaXRpb24gYWZ0ZXIgdGhlIHJlY29yZCBzdWZmaXhcclxuICAgICAgICAgICAgICAvLyBpbiBjYXNlIHRoZXJlIGFyZSAyIGN5Y2xlcyAodXBkYXRlL2ZvcmNlIHN1ZmZpeCArIGRlbGV0ZSksIGRvIHRoZSBlbmQgdGFzayBvbmx5IGluIHRoZSAybmQgY3ljbGUuXHJcbiAgICAgICAgICAgICAgaWYgKChyZWMuZ2V0TW9kZSgpID09PSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuRGVsZXRlICYmXHJcbiAgICAgICAgICAgICAgICB0YXNrLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9ERUxFVEUpIHx8XHJcbiAgICAgICAgICAgICAgICByZWMuZ2V0TW9kZSgpICE9PSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuRGVsZXRlKVxyXG4gICAgICAgICAgICAgICAgaWYgKGF3YWl0IHRhc2suZXZhbEVuZENvbmQoQ29uc3RJbnRlcmZhY2UuRU5EX0NPTkRfRVZBTF9BRlRFUikpXHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IHRhc2suZW5kVGFzayh0cnVlLCBmYWxzZSwgZmFsc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IC8vIHJlYyAhPSBudWxsXHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9QUkVGSVg6XHJcbiAgICAgICAgICBpZiAocmNCZWZvcmUpIHtcclxuICAgICAgICAgICAgLy8gY2hlY2sgcGFya2FiaWxpdHkgb25jZSBhZ2FpbiBhcyBwcm9wZXJ0eSBtaWdodCBoYXZlIGNoYW5nZWQgaW4gdGhlIGhhbmRsZXJcclxuICAgICAgICAgICAgLy8gOTI0MTEyIC0gaWdub3JlIGRpcmVjdGlvbiAoaWYgZmxhZyBzZXQpIGFzIHdlIGFyZSBmb3JjaW5nIHBhcmsgaW5zcGl0ZSBvZiBmYWlsZWQgZGlyZWN0aW9uXHJcbiAgICAgICAgICAgIC8vIFFDUiMgODA2MDE1OiBJZiB3ZSBoYXZlIGEgc2luZ2xlIGZpZWxkIHdpdGggYWxsb3cgcGFya2luZyA9IFllcyBhbmQgVGFiIEludG8gPSBObywgdGhlbiBvbiBwcmVzc2luZyB0YWIgaWYgY3Vyc29yIGlzIG5vdFxyXG4gICAgICAgICAgICAvLyBtb3ZlZCwgd2UgY29tZSB0byBwYXJrIG9uIGxhc3RQYXJrZWRDdHJsICh3aGljaCBpcyBzYW1lIGFzIGN0cmwpIHNpbmNlIFRhYkludG8gaXMgbm90IGFsbG93ZWQuXHJcbiAgICAgICAgICAgIC8vIFNvIHRvIGF2YW9pZCBpbmZpbml0ZSByZWN1cnNpb24sIHdlIHNob3VsZCBub3QgYWdhaW4gdHJ5IHRvIHBhcmsgb24gaXQuXHJcbiAgICAgICAgICAgIGlmIChhd2FpdCBjdHJsLklzUGFya2FibGUoKSB8fCBjdHJsID09PSBMYXN0Rm9jdXNlZE1hbmFnZXIuZ2V0TGFzdEZvY3VzZWRDb250cm9sKCkpIHtcclxuICAgICAgICAgICAgICAvLyBzZXQgSW5Db250cm9sIHRydWUgYWZ0ZXIgQ29udHJvbCBQcmVmaXhcclxuICAgICAgICAgICAgICBjdHJsLkluQ29udHJvbCA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICAgIGlmIChjdHJsLlNob3VsZFJlZnJlc2hPbkNvbnRyb2xFbnRlcigpKVxyXG4gICAgICAgICAgICAgICAgYXdhaXQgKDxGaWVsZD5jdHJsLmdldEZpZWxkKCkpLnVwZGF0ZURpc3BsYXkoKTtcclxuXHJcbiAgICAgICAgICAgICAgLy8gaWYgdGhpcyBjb2RlIGlzIHJlYWNoZWQgdGhlbiBldmVyeXRoaW5nIGlzIG9rIGluIHRoZSBjb250cm9sIHByZWZpeFxyXG4gICAgICAgICAgICAgIC8vIHVzZXIgaGFuZGxlci4gTm93LCBtb3ZlIHRoZSBmb2N1cyB0byB0aGUgY29udHJvbC5cclxuICAgICAgICAgICAgICB0YXNrLnNldExhc3RQYXJrZWRDdHJsKGN0cmwpO1xyXG4gICAgICAgICAgICAgIC8vIHdlIGhhdmUgcGFya2VkIG9uIGEgY3RybCBzZXQgY2xpY2tlZCBjdHJsIHRvIG51bGxcclxuICAgICAgICAgICAgICBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuQ3VycmVudENsaWNrZWRDdHJsID0gbnVsbDtcclxuXHJcbiAgICAgICAgICAgICAgLy8gdG8gdGFrZSBjYXJlIG9mIHRlbXBvcmFyeSBlZGl0b3JcclxuICAgICAgICAgICAgICAvLyBNYW5hZ2VyLnNldEZvY3VzKGN0cmwsIGN0cmwuZ2V0RGlzcGxheUxpbmUoZmFsc2UpKTtcclxuICAgICAgICAgICAgICBhd2FpdCBjdHJsLlNldEZvY3VzKGN0cmwsIGN0cmwuZ2V0RGlzcGxheUxpbmUoZmFsc2UpLCB0cnVlKTtcclxuICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHN1Y2Nlc3NmdWxseSBwYXJrZWQgb24gYSBjdHJsLCBzZXQgc2V0c3RvcGV4ZWN1dGlvbkN0cmwgdG8gbnVsbFxyXG4gICAgICAgICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbkN0cmwobnVsbCk7XHJcblxyXG4gICAgICAgICAgICAgIE1nQ29udHJvbC5SZXR1cm5Ub0N0cmwgPSBjdHJsO1xyXG4gICAgICAgICAgICAgIHRhc2suSW5DdHJsUHJlZml4ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgdGFzay5JbkN0cmxQcmVmaXggPSBmYWxzZTtcclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLkhhbmRsZU5vblBhcmthYmxlQ29udHJvbHMoY3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1NVRkZJWDpcclxuICAgICAgICAgIC8vIGRpc2FibGUgYWN0aW9ucyBhbmQgc3RhdGVzLiBkbyBpdCBvbmx5IGlmIHdlIGFyZSBnZXR0aW5nIG91dCBvZiB0aGUgY29udHJvbC5cclxuICAgICAgICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKSB7XHJcblxyXG4gICAgICAgICAgICBpZiAoY3RybC5pc0Nob2ljZUNvbnRyb2woKSkge1xyXG4gICAgICAgICAgICAgIGN0cmwuU2V0S2V5Ym9hcmRMYW5ndWFnZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0JVVFRPTilcclxuICAgICAgICAgICAgICB0YXNrLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9CVVRUT04sIGZhbHNlKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0YXNrLmdldEVuYWJsZVpvb21IYW5kbGVyKCkgfHwgY3RybC51c2Vab29tSGFuZGxlcigpKVxyXG4gICAgICAgICAgICAgIHRhc2suQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1pPT00sIGZhbHNlKTtcclxuICAgICAgICAgICAgdGFzay5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfRURUX05VTEwsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKHJjQmVmb3JlKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpIHtcclxuICAgICAgICAgICAgICAvLyBJZiBjb250cm9sIHN1ZmZpeCBnZXQgJ3N0b3AgZXhlY3V0aW9uJyAoZS5nLiB2ZXJpZnkgZXJyb3IpLCB0aGUgZm9jdXMgd2lsbCBiZSByZW1haW4gb24gY3VycmVudCBjb250cm9sLlxyXG4gICAgICAgICAgICAgIC8vIFNvIHNldCBJbkNvbnRyb2wgdG8gdHJ1ZVxyXG4gICAgICAgICAgICAgIGN0cmwuSW5Db250cm9sID0gdHJ1ZTtcclxuICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgICAgICAvLyBVcGRhdGUgZmllbGRzIHRoYXQgYXJlIGFzc2lnbmVkIHRvIGEgdGV4dCBjb250cm9sIGFuZCB3aXRoIHR5cGUgdGhhdCBoYXMgZGVmYXVsdCBkaXNwbGF5XHJcbiAgICAgICAgICAgIC8vIHZhbHVlIChudW1lcmljLCBkYXRlLCB0aW1lLCBsb2dpY2FsIGV0YylcclxuICAgICAgICAgICAgbGV0IGZsZDogRmllbGQgPSA8RmllbGQ+Y3RybC5nZXRGaWVsZCgpO1xyXG4gICAgICAgICAgICBpZiAoZmxkICE9IG51bGwgJiYgKGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfVEVYVCkpXHJcbiAgICAgICAgICAgICAgYXdhaXQgZmxkLnVwZGF0ZURpc3BsYXkoKTtcclxuXHJcbiAgICAgICAgICAgIHRhc2suc2V0TGV2ZWwoQ29uc3RhbnRzLlRBU0tfTEVWRUxfUkVDT1JEKTtcclxuICAgICAgICAgICAgY3RybC5zZXRJbkNvbnRyb2xTdWZmaXgoZmFsc2UpO1xyXG4gICAgICAgICAgICBjdHJsLklzSW50ZXJhY3RpdmVVcGRhdGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgaWYgKGN0cmwuUHJvcGVydHlFeGlzdHMoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQ1VTVE9NX1ZBTElEQVRPUlMpKVxyXG4gICAgICAgICAgICAgIGF3YWl0IGN0cmwuZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DVVNUT01fVkFMSURBVE9SUykuUmVmcmVzaERpc3BsYXkodHJ1ZSk7XHJcbiAgICAgICAgICAgIGN0cmwuVmFsaWRhdGVDb250cm9sID0gZmFsc2U7XHJcbiAgICAgICAgICAgIExhc3RGb2N1c2VkTWFuYWdlci5zZXRMYXN0Rm9jdXNlZENvbnRyb2wodGFzaywgbnVsbCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoYXdhaXQgdGFzay5ldmFsRW5kQ29uZChDb25zdEludGVyZmFjZS5FTkRfQ09ORF9FVkFMX0lNTUlESUFURSkpXHJcbiAgICAgICAgICAgICAgYXdhaXQgdGFzay5lbmRUYXNrKHRydWUsIGZhbHNlLCBmYWxzZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEFTS19QUkVGSVg6XHJcbiAgICAgICAgICB0YXNrLnNldExldmVsKENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RBU0tfU1VGRklYOlxyXG4gICAgICAgICAgdGFzay5zZXRMZXZlbChDb25zdGFudHMuVEFTS19MRVZFTF9OT05FKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAvLyBzaW11bGF0ZXMgdXNlciBhc2tpbmcgZm9yIHRoZSBuZXh0IHJlYy5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DWUNMRV9ORVhUX1JFQzpcclxuICAgICAgICAgIGxldCBmb3JtID0gPE1nRm9ybT50YXNrLmdldEZvcm0oKTtcclxuICAgICAgICAgIGlmICghdGFzay5pc01haW5Qcm9nKCkgJiYgZm9ybSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IGZvcm0ubW92ZUluVmlldyhmb3JtLmlzTGluZU1vZGUoKVxyXG4gICAgICAgICAgICAgID8gQ29uc3RhbnRzLk1PVkVfVU5JVF9ST1dcclxuICAgICAgICAgICAgICA6IENvbnN0YW50cy5NT1ZFX1VOSVRfUEFHRSxcclxuICAgICAgICAgICAgICBDb25zdGFudHMuTU9WRV9ESVJFQ1RJT05fTkVYVCk7XHJcbiAgICAgICAgICAgIC8vIGVuZCBvZiBkYXRhIHdpbGwgc2lnbmFsIHVzIHRvIGVuZCB0aGUgdGFzayAodW5sZXNzIGluIGNyZWF0ZSBtb2RlKS5cclxuICAgICAgICAgICAgaWYgKHRhc2suZ2V0RXhlY0VuZFRhc2soKSlcclxuICAgICAgICAgICAgICBhd2FpdCB0YXNrLmVuZFRhc2sodHJ1ZSwgZmFsc2UsIGZhbHNlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAvLyBkZWxldGUgcmVjb3JkIGluIG5vbiBpbnRlcmFjdGl2ZSB0YXNrXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1lDTEVfTkVYVF9ERUxFVEVfUkVDOlxyXG4gICAgICAgICAgLy8gY2hlY2sgZW1wdHkgZGF0YXZpZXcgYmVmb3JlIHRyeWluZyB0byBkZWxldGUsIGluIGNhc2UgdGFzayBzdGFydGVkIHdpdGggZW1wdHkgZGF0YXZpZXcuXHJcbiAgICAgICAgICBpZiAodGFzay5EYXRhVmlldy5pc0VtcHR5RGF0YXZpZXcoKSlcclxuICAgICAgICAgICAgKHRhc2spLnNldEV4ZWNFbmRUYXNrKCk7XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuSGFuZGxlQWN0aW9uRGVsbGluZSggdGFzaywgZHYsIHJlYywgdHJ1ZSk7XHJcblxyXG4gICAgICAgICAgLy8gZW5kIG9mIGRhdGEgd2lsbCBzaWduYWwgdXMgdG8gZW5kIHRoZSB0YXNrICh1bmxlc3MgaW4gY3JlYXRlIG1vZGUpLlxyXG4gICAgICAgICAgaWYgKHRhc2suZ2V0RXhlY0VuZFRhc2soKSlcclxuICAgICAgICAgICAgYXdhaXQgdGFzay5lbmRUYXNrKHRydWUsIGZhbHNlLCBmYWxzZSk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfU0VUX0VYVEVSTkFMX1ZBTFVFOlxyXG4gICAgICAgICAgbGV0IHJlZnJlc2hEaXNwbGF5IDogYm9vbGVhbiA9IGF3YWl0IGV2dC5nZXRBcmdMaXN0KCkuZ2V0QXJnVmFsdWUoMSwgU3RvcmFnZUF0dHJpYnV0ZS5CT09MRUFOLCAwKSA9PT0gJzEnID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgICAgICAgYXdhaXQgKDxNZ0NvbnRyb2w+Y3RybCkudmFsaWRhdGVBbmRTZXRWYWx1ZUlmQWxsb3dlZChldnQuZ2V0VmFsdWUoKSwgcmVmcmVzaERpc3BsYXkpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY3JlYXRlcyBhIG5vbiByZXZlcnNpYmxlIGV2ZW50IGFuZCBoYW5kbGUgaXRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFza1wiPmEgcmVmZXJlbmNlIHRvIHRoZSB0YXNrIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJldmVudENvZGVcIj50aGUgY29kZSBvZiB0aGUgZXZlbnQgPC9wYXJhbT5cclxuICBhc3luYyBoYW5kbGVOb25SZXZlcnNpYmxlRXZlbnQodGFzazogVGFza0Jhc2UsIGV2ZW50Q29kZTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQodGFzayk7XHJcbiAgICBsZXQgZXhpdENvbW1hbmQ6IGJvb2xlYW4gPSAoZXZlbnRDb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRVhJVCB8fCBldmVudENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DTE9TRSk7XHJcblxyXG4gICAgcnRFdnQuc2V0SW50ZXJuYWwoZXZlbnRDb2RlKTtcclxuXHJcbiAgICBpZiAoZXhpdENvbW1hbmQpXHJcbiAgICAgIHRoaXMuX2lzTm9uUmV2ZXJzaWJsZUV4aXQgPSB0cnVlO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIHJ0RXZ0LnNldE5vblJldmVyc2libGVFeGl0KCk7XHJcbiAgICAgIHJ0RXZ0LnNldEN0cmwoPE1nQ29udHJvbD50YXNrLmdldExhc3RQYXJrZWRDdHJsKCkpO1xyXG4gICAgICBydEV2dC5zZXRBcmdMaXN0KG51bGwpO1xyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUV2ZW50KHJ0RXZ0LCBmYWxzZSk7XHJcbiAgICB9IGZpbmFsbHkge1xyXG4gICAgICBpZiAoZXhpdENvbW1hbmQpXHJcbiAgICAgICAgdGhpcy5faXNOb25SZXZlcnNpYmxlRXhpdCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNyZWF0ZXMgYSBuZXcgaW50ZXJuYWwgRXZlbnQgYW5kIGhhbmRsZSBpdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0YXNrXCI+YSByZWZlcmVuY2UgdG8gdGhlIHRhc2s8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZXZlbnRDb2RlXCI+dGhlIGNvZGUgb2YgdGhlIGV2ZW50PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlzUXVpdFwiPmluZGljYXRlcyB3aGV0aGVyIE1HX0FDVF9DQU5DRUwgaXMgY2FsbGVkIGZyb20gTUdfQUNUX1JUX1FVSVQ8L3BhcmFtPlxyXG4gIGFzeW5jIGhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFza0FuZEV2ZW50U3VidHlwZSh0YXNrOiBUYXNrQmFzZSwgZXZlbnRDb2RlOiBudW1iZXIsIGV2ZW50U3ViVHlwZTogRXZlbnRTdWJUeXBlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgbGFzdFBhcmtlZEN0cmw6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+dGFzay5nZXRMYXN0UGFya2VkQ3RybCgpO1xyXG4gICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQ7XHJcblxyXG4gICAgaWYgKGV2ZW50Q29kZSA8IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UT1RfQ05UICYmIHRhc2sgIT0gbnVsbCAmJiAhKGV2ZW50U3ViVHlwZSA9PT0gRXZlbnRTdWJUeXBlLkNhbmNlbElzUXVpdCkgJiYgIXRhc2suQWN0aW9uTWFuYWdlci5pc0VuYWJsZWQoZXZlbnRDb2RlKSlcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIGlmIChsYXN0UGFya2VkQ3RybCAhPT0gbnVsbClcclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aE1nQ29udHJvbChsYXN0UGFya2VkQ3RybCwgZXZlbnRDb2RlLCBldmVudFN1YlR5cGUpO1xyXG5cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAoZXZlbnRDb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUVVJVClcclxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFza0FuZEV2ZW50U3VidHlwZSh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ0FOQ0VMLCBFdmVudFN1YlR5cGUuQ2FuY2VsSXNRdWl0KTtcclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgcnRFdnQgPSBuZXcgUnVuVGltZUV2ZW50KHRhc2spO1xyXG4gICAgICAgIHJ0RXZ0LnNldEludGVybmFsKGV2ZW50Q29kZSk7XHJcbiAgICAgICAgcnRFdnQuU2V0RXZlbnRTdWJUeXBlKGV2ZW50U3ViVHlwZSk7XHJcbiAgICAgICAgaWYgKEludGVybmFsSW50ZXJmYWNlLkJ1aWx0aW5FdmVudChldmVudENvZGUpKVxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVFdmVudChydEV2dCwgZmFsc2UpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIGF3YWl0IHRoaXMuY29tbW9uSGFuZGxlcihydEV2dCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjcmVhdGVzIGEgbmV3IGludGVybmFsIEV2ZW50IGFuZCBoYW5kbGUgaXRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPmEgcmVmZXJlbmNlIHRvIHRoZSBjb250cm9sPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImV2ZW50Q29kZVwiPnRoZSBjb2RlIG9mIHRoZSBldmVudDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpc1F1aXRcIj5pbmRpY2F0ZXMgd2hldGhlciBNR19BQ1RfQ0FOQ0VMIGlzIGNhbGxlZCBmcm9tIE1HX0FDVF9SVF9RVUlUPC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIGhhbmRsZUludGVybmFsRXZlbnRXaXRoTWdDb250cm9sKGN0cmw6IE1nQ29udHJvbCwgZXZlbnRDb2RlOiBudW1iZXIsIGV2ZW50U3ViVHlwZTogRXZlbnRTdWJUeXBlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudDtcclxuXHJcbiAgICBpZiAoZXZlbnRDb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUVVJVClcclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aE1nQ29udHJvbChjdHJsLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ0FOQ0VMLCBFdmVudFN1YlR5cGUuQ2FuY2VsSXNRdWl0KTtcclxuICAgIGVsc2Uge1xyXG4gICAgICBydEV2dCA9IG5ldyBSdW5UaW1lRXZlbnQoY3RybCk7XHJcbiAgICAgIHJ0RXZ0LnNldEludGVybmFsKGV2ZW50Q29kZSk7XHJcbiAgICAgIHJ0RXZ0LlNldEV2ZW50U3ViVHlwZShldmVudFN1YlR5cGUpOyAvLyAodXNlIGZvciBhY3RfY2FuY2VsICYgYWN0X3J0X3ZpZXdfcmVmcmVzaFxyXG4gICAgICAvLyBiYXNpY2FsbHkgTUdfQUNUX1ZJRVdfUkVGUkVTSCByZXByZXNlbnQgdGhlIHZpZXcgcmVmcmVzaCBldmVudCByYWlzZWQgYnkgdGhlIHVzZXJcclxuICAgICAgLy8gaG93ZXZlciB3ZSB1c2UgaW50ZXJuYWxseSBpbiB0aGUgY29kZSB0byByZWZyZXNoIHRoZSBkaXNwbGF5IChtYWlubHkgaW4gc3ViIGZvcm1zIHJlZnJlc2hlcylcclxuICAgICAgLy8gaW4gb3JkZXIgdGhlIGRpc3Rpbmd1aXNoIGJldHdlZW4gdGhlIHJlYWwgdXNlIGFuZCB0aGUgaW50ZXJuYWwgdXNlIHdlIHNldCB0aGlzIGZsYWcgdG8gZmFsc2VcclxuICAgICAgLy8gd2UgbmVlZCB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIHRoZSB0d28gc2luY2Ugd2UgbWFrZSBkaWZmZXJlbnQgYWN0aW9ucyB3aGVuIGNhY2hpbmcgYSBzdWJmb3JtXHJcbiAgICAgIGlmIChldmVudENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9SRUZSRVNIX1ZJRVcpXHJcbiAgICAgICAgcnRFdnQuc2V0SXNSZWFsUmVmcmVzaChmYWxzZSk7XHJcblxyXG4gICAgICBpZiAoSW50ZXJuYWxJbnRlcmZhY2UuQnVpbHRpbkV2ZW50KGV2ZW50Q29kZSkpXHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVFdmVudChydEV2dCwgZmFsc2UpO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgYXdhaXQgdGhpcy5jb21tb25IYW5kbGVyKHJ0RXZ0KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBjdXJyZW50IGZpZWxkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRDdXJyRmllbGQoKTogRmllbGQge1xyXG4gICAgcmV0dXJuIHRoaXMuX2N1cnJGaWVsZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIGN1cnJlbnQgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0Q3VyckN0cmwoKTogTWdDb250cm9sIHtcclxuICAgIHJldHVybiB0aGlzLl9jdXJyQ3RybDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBjdXJyZW50IHRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldEN1cnJUYXNrKCk6IFRhc2sge1xyXG4gICAgaWYgKHRoaXMuX2N1cnJGaWVsZCA9PSBudWxsKVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIHJldHVybiA8VGFzaz50aGlzLl9jdXJyRmllbGQuZ2V0VGFzaygpO1xyXG4gIH1cclxuXHJcbiAgc2V0U3RvcEV4ZWN1dGlvbihzdG9wOiBib29sZWFuKTogdm9pZDtcclxuICBzZXRTdG9wRXhlY3V0aW9uKHN0b3A6IGJvb2xlYW4sIGNsZWFyRXZlbnRzT25TdG9wRXhlY3V0aW9uIDogQ2xlYXJFdmVudHNPblN0b3BFeGVjdXRpb24pOiB2b2lkIDtcclxuICBzZXRTdG9wRXhlY3V0aW9uKHN0b3A6IGJvb2xlYW4sIGNsZWFyRXZlbnRzT25TdG9wRXhlY3V0aW9uPyA6IENsZWFyRXZlbnRzT25TdG9wRXhlY3V0aW9uKTogdm9pZCB7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSlcclxuICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uXzAoc3RvcCk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbl8xKHN0b3AsIGNsZWFyRXZlbnRzT25TdG9wRXhlY3V0aW9uKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIFwic3RvcCBleGVjdXRpb25cIiBmbGFnIHRvIHRydWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgc2V0U3RvcEV4ZWN1dGlvbl8wKHN0b3A6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbihzdG9wLCBDbGVhckV2ZW50c09uU3RvcEV4ZWN1dGlvbi5BTEwpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgXCJzdG9wIGV4ZWN1dGlvblwiIGZsYWcgdG8gdHJ1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBzZXRTdG9wRXhlY3V0aW9uXzEoc3RvcDogYm9vbGVhbiwgY2xlYXJFdmVudHNPblN0b3BFeGVjdXRpb246IENsZWFyRXZlbnRzT25TdG9wRXhlY3V0aW9uKTogdm9pZCB7XHJcbiAgICBpZiAoc3RvcClcclxuICAgICAgaWYgKGNsZWFyRXZlbnRzT25TdG9wRXhlY3V0aW9uID09IENsZWFyRXZlbnRzT25TdG9wRXhlY3V0aW9uLkFMTClcclxuICAgICAgICB0aGlzLl9ldmVudHNRdWV1ZS5jbGVhcigpO1xyXG4gICAgICBlbHNlIGlmKGNsZWFyRXZlbnRzT25TdG9wRXhlY3V0aW9uID09IENsZWFyRXZlbnRzT25TdG9wRXhlY3V0aW9uLlNFUlZFUikge1xyXG4gICAgICAgIGxldCB0bXBWZWMgPSBuZXcgTGlzdDxSdW5UaW1lRXZlbnQ+KCk7XHJcbiAgICAgICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQ7XHJcbiAgICAgICAgbGV0IGk6IG51bWJlcjtcclxuXHJcbiAgICAgICAgLy8gV2Ugd2VyZSByZXF1ZXN0ZWQgdG8gbGVhdmUgdGhlIFwic2VydmVyIGV2ZW50c1wiIGluIHRoZSBxdWV1ZS5cclxuICAgICAgICAvLyBEbyBpdCwgYnV0IGFsc28gcmVtb3ZlIHRoZSBcInByb3RlY3Rpb25cIiBmcm9tIHRoZXNlIGV2ZW50cyBzbyBuZXh0XHJcbiAgICAgICAgLy8gdGltZSB3ZSBuZWVkIHRvIGNsZWFyIHRoZSBxdWV1ZSB0aGV5IHdpbGwgYWxzbyBiZSBkZWxldGVkLlxyXG4gICAgICAgIHdoaWxlICghdGhpcy5fZXZlbnRzUXVldWUuaXNFbXB0eSgpKSB7XHJcbiAgICAgICAgICBydEV2dCA9IDxSdW5UaW1lRXZlbnQ+dGhpcy5fZXZlbnRzUXVldWUucG9sbCgpO1xyXG4gICAgICAgICAgaWYgKHJ0RXZ0LmlzRnJvbVNlcnZlcigpKSB7XHJcbiAgICAgICAgICAgIHJ0RXZ0LnJlc2V0RnJvbVNlcnZlcigpO1xyXG4gICAgICAgICAgICB0bXBWZWMucHVzaChydEV2dCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdG1wVmVjLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgICAgdGhpcy5fZXZlbnRzUXVldWUucHV0KHRtcFZlYy5nZXRfSXRlbShpKSk7XHJcbiAgICAgIH1cclxuICAgIHRoaXMuX3N0b3BFeGVjdXRpb24gPSBzdG9wO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgY3RybCBvbiB3aGljaCB3ZSBoYWQgYSBcInN0b3AgZXhlY3V0aW9uXCJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldFN0b3BFeGVjdXRpb25DdHJsKGN0cmw6IE1nQ29udHJvbCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3N0b3BFeGVjdXRpb25DdHJsID09PSBudWxsIHx8IGN0cmwgPT09IG51bGwpXHJcbiAgICAgIHRoaXMuX3N0b3BFeGVjdXRpb25DdHJsID0gY3RybDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBkZWxldGUgdGhlIGN1cnJlbnQgcmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRhc2tcIj50aGUgdGFzayB0byByZWZlciB0byA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaW5Gb3JjZURlbFwiPnRydWUgaWYgdGhlIGRlbGV0ZSBpcyBkb25lIGJlY2F1c2Ugb2YgZm9yY2UgZGVsZXRlIDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBkZWxDdXJyUmVjKHRhc2s6IFRhc2ssIGluRm9yY2VEZWw6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBkdjogRGF0YVZpZXcgPSA8RGF0YVZpZXc+dGFzay5EYXRhVmlldztcclxuXHJcbiAgICB0YXNrLnNldE1vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9NT0RJRlkpO1xyXG5cclxuICAgIC8vIGRlbGV0ZSB0aGUgcmVjb3JkIGFuZCBydW4gcmVjb3JkIHN1ZmZpeCBmb3IgdGhlIG5ldyBjdXJyZW50IHJlY29yZFxyXG4gICAgYXdhaXQgKDxNZ0Zvcm0+dGFzay5nZXRGb3JtKCkpLmRlbEN1cnJSZWMoKTtcclxuXHJcbiAgICAvLyBubyBjdXJyLXJlYyA9PT4gd2UgZGVsZXRlZCB0aGUgbGFzdCByZWNvcmQgYW5kIGZhaWxlZCB0byBjcmVhdGUgYSBuZXcgb25lIChlLmcuXHJcbiAgICAvLyBDUkVBVEUgbW9kZSBpcyBub3QgYWxsb3dlZCkgPT0+IGVuZCB0aGUgdGFzay4gQW4gZXhjZXB0aW9uIHRvIHRoZSBydWxlIGlzIHdoZW5cclxuICAgIC8vIHdlIGFyZSBhbHJlYWR5IGluIHRoZSBwcm9jZXNzIG9mIGNyZWF0aW5nIGEgcmVjb3JkLlxyXG4gICAgaWYgKCF0YXNrLkRhdGFWaWV3LmlzRW1wdHlEYXRhdmlldygpKSB7XHJcbiAgICAgIGlmIChkdi5nZXRDdXJyUmVjSWR4KCkgPj0gMCkge1xyXG4gICAgICAgIC8vIFFDUiAjNjU2NDk1OiBJZiB3ZSBnb3QgdG8gdGhpcyBwb2ludCBhbmQgdGhlIGN1cnJlbnQgcmVjb3JkIGlzIHN0aWxsIHRoZVxyXG4gICAgICAgIC8vIGRlbGV0ZWQgb25lIHRoZW4gdGhlIHJlY29yZCBwcmVmaXggd2lsbCBiZSBoYW5kbGVkIGVsc2V3aGVyZS5cclxuICAgICAgICBpZiAoKGR2LmdldEN1cnJSZWMoKSkuZ2V0TW9kZSgpICE9PSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuRGVsZXRlICYmICFpbkZvcmNlRGVsKSB7XHJcbiAgICAgICAgICBsZXQgY3RybDogTWdDb250cm9sID0gPE1nQ29udHJvbD50YXNrLmdldExhc3RQYXJrZWRDdHJsKCk7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICAgICAgICBpZiAoIXRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSlcclxuICAgICAgICAgICAgaWYgKGN0cmwgPT09IG51bGwpXHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5IYW5kbGVOb25QYXJrYWJsZUNvbnRyb2xzKHRhc2spO1xyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aE1nQ29udHJvbEJhc2UoY3RybCwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfUFJFRklYKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSBpZiAoIXRhc2suZ2V0SW5DcmVhdGVMaW5lKCkpXHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVOb25SZXZlcnNpYmxlRXZlbnQodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VYSVQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgYXdhaXQgdGhpcy5IYW5kbGVOb25QYXJrYWJsZUNvbnRyb2xzKHRhc2spO1xyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHByb2Nlc3MgdXNlcnMgY29uZmlybWF0aW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRhc2tcIj50byBjaGVjayBjb25maXJtIHVwZGF0ZTwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0cnVlIC0gcHJvY2VzcyBjb21tYW5kLCBmYWxzZSAtIHN0b3AgY29tbWFuZCBwcm9jZXNzaW5nPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgYXN5bmMgdXBkYXRlQ29uZmlybWVkKHRhc2s6IFRhc2spOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCBjb25maXJtOiBib29sZWFuO1xyXG4gICAgbGV0IGFuc3dlcjogc3RyaW5nO1xyXG4gICAgbGV0IGFuczogbnVtYmVyO1xyXG5cclxuICAgIGlmICh0YXNrID09IG51bGwpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBjb25maXJtID0gYXdhaXQgdGFzay5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQ09ORklSTV9VUERBVEUsIGZhbHNlKTtcclxuICAgIGlmICghdGhpcy5faXNJblJlY29yZEZsdXNoRXZlbnQgJiYgY29uZmlybSAmJiAhdGFzay5EYXRhU3luY2VkKSB7XHJcbiAgICAgIGFucyA9IGF3YWl0IEdVSU1hbmFnZXIuSW5zdGFuY2UuY29uZmlybShNc2dJbnRlcmZhY2UuQ1JGX1NUUl9DT05GX1VQRCxcclxuICAgICAgICBTdHlsZXMuTVNHQk9YX0lDT05fUVVFU1RJT04gfCBTdHlsZXMuTVNHQk9YX0JVVFRPTl9ZRVNfTk9fQ0FOQ0VMKTtcclxuICAgICAgaWYgKGFucyA9PT0gU3R5bGVzLk1TR0JPWF9SRVNVTFRfWUVTKVxyXG4gICAgICAgIGFuc3dlciA9ICdZJztcclxuICAgICAgLy8gWWVzXHJcbiAgICAgIGVsc2UgaWYgKGFucyA9PT0gU3R5bGVzLk1TR0JPWF9SRVNVTFRfTk8pXHJcbiAgICAgICAgYW5zd2VyID0gJ04nO1xyXG4gICAgICAvLyBOb1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgYW5zd2VyID0gJ0MnOyAvLyBDYW5jZWxcclxuICAgIH0gZWxzZVxyXG4gICAgICBhbnN3ZXIgPSAnWSc7XHJcblxyXG4gICAgc3dpdGNoIChhbnN3ZXIpIHtcclxuICAgICAgY2FzZSAnWSc6XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlICdOJzpcclxuICAgICAgICBhd2FpdCAoPE1nRm9ybT50YXNrLmdldEZvcm0oKSkuY2FuY2VsRWRpdChmYWxzZSwgZmFsc2UpO1xyXG4gICAgICAgIGF3YWl0ICg8TWdGb3JtPnRhc2suZ2V0Rm9ybSgpKS5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0NVUlJfUkVDKTtcclxuICAgICAgICB0YXNrLkNvbmZpcm1VcGRhdGVObyA9IHRydWU7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBub3QgY29udGludWUgcmVjb3JkIHN1ZmZpeFxyXG5cclxuICAgICAgY2FzZSAnQyc6XHJcbiAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uKHRydWUpO1xyXG4gICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbkN0cmwoTGFzdEZvY3VzZWRNYW5hZ2VyLmdldExhc3RGb2N1c2VkQ29udHJvbCgpKTtcclxuICAgICAgICBhd2FpdCBGb2N1c01hbmFnZXIuU2V0Rm9jdXMoTGFzdEZvY3VzZWRNYW5hZ2VyLmdldExhc3RGb2N1c2VkQ29udHJvbCgpLCAtMSk7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBzdG9wIGV2ZW50IHByb2Nlc3NpbmdcclxuXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKCdpbiBDbGllbnRNYW5hZ2VyLkluc3RhbmNlLnVwZGF0ZUNvbmZpcm1lZCgpIGlsbGVnYWwgY29uZmlybWF0aW9uIGNvZGU6ICcgK1xyXG4gICAgICAgICAgY29uZmlybSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBTZXQgdGhlIG9yZGVyIG9mIGhhbmRsaW5nIG1haW4gcHJvZ3JhbXMgb2YgY29tcG9uZW50c1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0Q29tcE1haW5QcmdUYWIoY29tcE1haW5QcmdUYWJsZTogQ29tcE1haW5QcmdUYWJsZSk6IHZvaWQge1xyXG4gICAgdGhpcy5fY29tcE1haW5QcmdUYWIgPSBjb21wTWFpblByZ1RhYmxlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCBlbmQgb2Ygd29yayBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXRFbmRPZldvcmsoZW5kT2ZXb3JrXzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5fZW5kT2ZXb3JrID0gZW5kT2ZXb3JrXztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgZW5kIG9mIHdvcmsgZmxhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0RW5kT2ZXb3JrKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2VuZE9mV29yaztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIG9yZGVyIG9mIGhhbmRsaW5nIG1haW4gcHJvZ3JhbXMgb2YgY29tcG9uZW50c1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0Q29tcE1haW5QcmdUYWIoKTogQ29tcE1haW5QcmdUYWJsZSB7XHJcbiAgICByZXR1cm4gdGhpcy5fY29tcE1haW5QcmdUYWI7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSByZXZlcnNpYmxlIGV4aXQgZmxhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaW5Ob25SZXZlcnNpYmxlRXhpdCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pc05vblJldmVyc2libGVFeGl0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHB1c2ggYSBydW50aW1lIGV2ZW50IHRvIHRoZSBzdGFja1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJydEV2dFwiPnRoZSBydW50aW1lIGV2ZW50IHRvIHB1c2ggb24gdGhlIHN0YWNrPC9wYXJhbT5cclxuICBwdXNoUnRFdmVudChydEV2dDogUnVuVGltZUV2ZW50KTogdm9pZCB7XHJcbiAgICB0aGlzLl9ydEV2ZW50cy5wdXNoKHJ0RXZ0KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwb3AgYSBydW50aW1lIGV2ZW50IGZyb20gdGhlIHN0YWNrIGFuZCByZXR1cm4gaXRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHBvcFJ0RXZlbnQoKTogUnVuVGltZUV2ZW50IHtcclxuICAgIGlmICh0aGlzLl9ydEV2ZW50cy5jb3VudCgpID09PSAwKVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIHJldHVybiA8UnVuVGltZUV2ZW50PnRoaXMuX3J0RXZlbnRzLnBvcCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHN0b3JlIHRoZSBsYXN0IHNhdmVkIHJvdXRlIGV2ZW50IG9uIGxvY2FsIHN0b3JhZ2UuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzdG9yZUxhc3RTYXZlZFJvdXRlRXZlbnRPbkxvY2FsU3RvcmFnZSgpOiB2b2lkXHJcbiAge1xyXG4gICAgbGV0IGRhdGFTdG9yYWdlID0gd2luZG93LmxvY2FsU3RvcmFnZTtcclxuICAgIGlmICh0aGlzLmdldExhc3RTYXZlZFJvdXRlRXZlbnQoKSAhPSBudWxsKVxyXG4gICAge1xyXG4gICAgICBsZXQgcnRFdnQgPSB0aGlzLmdldExhc3RTYXZlZFJvdXRlRXZlbnQoKTtcclxuXHJcbiAgICAgIGRhdGFTdG9yYWdlLnNldEl0ZW0oQ29uc3RJbnRlcmZhY2UuTEFTVF9ST1VURV9FVkVOVCwgJzEnKTtcclxuICAgICAgZGF0YVN0b3JhZ2Uuc2V0SXRlbShDb25zdEludGVyZmFjZS5MQVNUX1JPVVRFX0VWRU5UX1NSQ19UU0ssIEpTT04uc3RyaW5naWZ5KCg8VGFzaz5ydEV2dC5nZXRUYXNrKCkpLlRhc2tEZWZpbml0aW9uSWQpKTtcclxuXHJcbiAgICAgIGlmIChydEV2dC5nZXRBcmdMaXN0KCkuZ2V0U2l6ZSgpID4gMCkge1xyXG4gICAgICAgIGxldCBzdHI6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpO1xyXG4gICAgICAgIHJ0RXZ0LmdldEFyZ0xpc3QoKS5idWlsZFhNTChzdHIpO1xyXG4gICAgICAgIGRhdGFTdG9yYWdlLnNldEl0ZW0oQ29uc3RJbnRlcmZhY2UuTEFTVF9ST1VURV9FVkVOVF9BUkdfTElTVCwgIHN0ci50b1N0cmluZygpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlc3RvcmUgdGhlIGxhc3Qgc2F2ZWQgcm91dGUgZXZlbnQgZnJvbSBsb2NhbCBzdG9yYWdlLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcmVzdG9yZUxhc3RTYXZlZFJvdXRlRXZlbnRGcm9tTG9jYWxTdG9yYWdlKCk6IHZvaWRcclxuICB7XHJcbiAgICAvL2dldCByb3V0ZSBldmVudCBpZiBzdG9yZWQgb24gbG9jYWwgc3RvcmFnZVxyXG4gICAgbGV0IGRhdGFTdG9yYWdlID0gd2luZG93LmxvY2FsU3RvcmFnZTtcclxuXHJcbiAgICBsZXQgbGFzdFJvdXRlRXZlbnQgPSBkYXRhU3RvcmFnZS5nZXRJdGVtKENvbnN0SW50ZXJmYWNlLkxBU1RfUk9VVEVfRVZFTlQpO1xyXG5cclxuICAgIGlmIChsYXN0Um91dGVFdmVudCA9PT0gJzEnKSB7XHJcbiAgICAgIGxldCBzcmNUYXNrRGVmaW5pdGlvblN0ciA9IGRhdGFTdG9yYWdlLmdldEl0ZW0oQ29uc3RJbnRlcmZhY2UuTEFTVF9ST1VURV9FVkVOVF9TUkNfVFNLKTtcclxuICAgICAgbGV0IHJvdXRlQXJnTGlzdFN0ciA9IGRhdGFTdG9yYWdlLmdldEl0ZW0oQ29uc3RJbnRlcmZhY2UuTEFTVF9ST1VURV9FVkVOVF9BUkdfTElTVCk7XHJcblxyXG4gICAgICAvLyBwYXJzZSBzcmNUYXNrRGVmaW5pdGlvblN0ciBhbmQgcHJlcGFyZSB0YXNrRGVmaW5pdGlvbklkXHJcbiAgICAgIGxldCB0YXNrRGVmaW5pdGlvbklkID0gbmV3IFRhc2tEZWZpbml0aW9uSWQoKTtcclxuICAgICAgdGFza0RlZmluaXRpb25JZC5mcm9tSlNPTihzcmNUYXNrRGVmaW5pdGlvblN0cik7XHJcblxyXG4gICAgICAvL3NlYXJjaCBzb3VyY2UgdGFzayBpbiBuZXdseSBsb2FkZWQgdGFzayB0cmVlIGJ5IHRhc2tEZWZpbml0aW9uSWRcclxuICAgICAgbGV0IHNyY1Rhc2sgPSBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLmdldEN1cnJNR0RhdGEoKS5nZXRUYXNrQnlUYXNrRGVmaW5pdGlvbklEKHRhc2tEZWZpbml0aW9uSWQpO1xyXG4gICAgICBsZXQgYXJncyA9IG51bGw7XHJcbiAgICAgIGlmIChyb3V0ZUFyZ0xpc3RTdHIgIT0gbnVsbCkge1xyXG4gICAgICAgIGFyZ3MgPSBuZXcgQXJndW1lbnRzTGlzdCgpO1xyXG4gICAgICAgIGFyZ3MuZmlsbExpc3Qocm91dGVBcmdMaXN0U3RyLCBzcmNUYXNrKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgRXZlbnRzTWFuYWdlci5JbnN0YW5jZS5BZGRMYXN0U2F2ZWRSb3V0ZUV2ZW50KHNyY1Rhc2ssIGFyZ3MpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0aGUgbGFzdCBzYXZlZCByb3V0ZSBldmVudC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldExhc3RTYXZlZFJvdXRlRXZlbnQoKTogUnVuVGltZUV2ZW50IHtcclxuICAgICAgcmV0dXJuIHRoaXMubGFzdFNhdmVkUm91dGVFdmVudDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gIHNhdmUgdGhlIGxhc3Qgcm91dGUgZXZlbnQuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXRMYXN0U2F2ZWRSb3V0ZUV2ZW50IChydEV2dDpSdW5UaW1lRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmIChydEV2dCA9PSBudWxsKVxyXG4gICAgICB0aGlzLmxhc3RTYXZlZFJvdXRlRXZlbnQgPSBudWxsO1xyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLmxhc3RTYXZlZFJvdXRlRXZlbnQgPSBydEV2dC5yZXBsaWNhdGUoKTtcclxuICB9XHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0aGUgcnVudGltZSBldmVudCBsb2NhdGVkIG9uIHRoZSB0b3Agb2YgdGhlIHN0YWNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRMYXN0UnRFdmVudCgpOiBSdW5UaW1lRXZlbnQge1xyXG4gICAgaWYgKHRoaXMuX3J0RXZlbnRzLmNvdW50KCkgPT09IDApXHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgcmV0dXJuIDxSdW5UaW1lRXZlbnQ+dGhpcy5fcnRFdmVudHMucGVlaygpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgdmFsdWUgb2YgYSBmbGFnIHdoaWNoIGluZGljYXRlcyB3aGV0aGVyIHdlIHNob3VsZCBpZ25vcmUgdW5rbm93biBjb21tYW5kc1xyXG4gIC8vLyAgIGFycml2aW5nIGZyb20gdGhlIGVuZ2luZS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldElnbm9yZVVua25vd25BYm9ydCh2YWw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuX2lnbm9yZVVua25vd25BYm9ydCA9IHZhbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgXCJpZ25vcmUgdW5rbm93biBhYm9ydFwiIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGlnbm9yZVVua25vd25BYm9ydCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pZ25vcmVVbmtub3duQWJvcnQ7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlY292ZXIgZnJvbSBhIGZhaWx1cmUgdG8gb3ZlcmxheSBhIHRhc2suIFdoZW4gdGhlIHNlcnZlciBvcmRlcnMgdGhlIGNsaWVudCB0byBydW4gYVxyXG4gIC8vLyAgIG5ldyB0YXNrIGluIGEgZnJhbWUgd2hpY2ggYWxyZWFkeSBjb250YWlucyBhbiBhY3RpdmUgdGFzaywgdGhlIGNsaWVudCB0cmllcyB0byB0ZXJtIHRoZVxyXG4gIC8vLyAgIGV4aXN0aW5nIHRhc2sgYW5kIHJlcGxhY2UgaGltLiBXaGVuIHRoaXMgYWN0aW9uIGZhaWxzLCB0aGUgY2xpZW50IGhhcyB0byBhc2sgdGhlIHNlcnZlclxyXG4gIC8vLyAgIHRvIHRlcm1pbmF0ZSB0aGUgTkVXIFRBU0ssIGFuZCBpZ25vcmUgdGhlIG92ZXJsYXkgYWN0aW9uLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0YXNraWRcIj4tIHRoZSBpZCBvZiB0aGUgTkVXIFRBU0s8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibWdkXCI+ICAgLSB0aGUgTUdEYXRhIG9mIHRoZSBPTEQgVEFTSy48L3BhcmFtPlxyXG4gIGFzeW5jIGZhaWxUYXNrT3ZlcmxheSh0YXNrSWQ6IHN0cmluZywgbWdkOiBNR0RhdGEpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBjbWQ6IElDbGllbnRDb21tYW5kO1xyXG5cclxuICAgIGlmICh0YXNrSWQgIT09IG51bGwpIHtcclxuICAgICAgLy8gVGhlIHNlcnZlciB3aWxsIHJldHVybiB1cyAnYWJvcnQnIGNvbW1hbmRzIGZvciB0aGUgbmV3IHRhc2suIElnbm9yZSB0aGVtLCBzaW5jZSBpdCB3YXNudCBzdGFydGVkIHlldFxyXG4gICAgICB0aGlzLnNldElnbm9yZVVua25vd25BYm9ydCh0cnVlKTtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjbWQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVOb25SZXZlcnNpYmxlRXhpdENvbW1hbmQodGFza0lkLCBmYWxzZSk7XHJcbiAgICAgICAgbWdkLkNtZHNUb1NlcnZlci5BZGQoY21kKTtcclxuICAgICAgICBhd2FpdCBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5HZXRJbnN0YW5jZSgpLkV4ZWN1dGUoQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1NlbmRpbmdJbnN0cnVjdGlvbi5UQVNLU19BTkRfQ09NTUFORFMpO1xyXG4gICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgIHRoaXMuc2V0SWdub3JlVW5rbm93bkFib3J0KGZhbHNlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgVFJVRSBpZiBjdXJyZW50IGV2ZW50IHNob3VsZCBiZSBwcm9wb2d0YXRlZCB0byBhbGwgdGFza3MgaW4gYSBzcGVjaWZpYyB0cmFuc2FjdGlvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaXNFdmVudFNjb3BlVHJhbnMoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZXZlbnRTY29wZSA9PT0gRXZlbnRTY29wZS5UUkFOUztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgZXZlbnQgc2NvcGUgdG8gVFJBTlNBQ1RJT05cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldEV2ZW50U2NvcGVUcmFucygpOiB2b2lkIHtcclxuICAgIHRoaXMuX2V2ZW50U2NvcGUgPSBFdmVudFNjb3BlLlRSQU5TO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCBldmVudCBzY29wZSB0byBOT04gVFJBTlNBQ1RJT05cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGNsZWFyRXZlbnRTY29wZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuX2V2ZW50U2NvcGUgPSBFdmVudFNjb3BlLk5PTkU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRpbWUgb2YgZmlzdCBldmVudCBpbiBzZXF1ZW5jZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aW1lIG9mIGZpdHN0IGV2ZW50IGluIHNlcXVlbmNlPC9yZXR1cm5zPlxyXG4gIEdldEV2ZW50VGltZSgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2V2ZW50c1F1ZXVlLkdldFRpbWUoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFza1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJrYkl0bVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgbGFzdCBlbmFibGVkIGFjdGlvbiBmb3IgdGhlIHNwZWNpZmljIGtleSAoaW4ga2JJdGVtKTwvcmV0dXJucz5cclxuICAvLy8gPGNoZWNrQWNjZXNzS2V5SW5NZW51czo+ICBpZiB0byBjaGVjayB0aGUga2V5Ym9hcmQgaW4gdGhlIG1lbnUgPC9jaGVja0FjY2Vzc0tleUluTWVudXM6PlxyXG4gIHB1YmxpYyBnZXRNYXRjaGluZ0FjdGlvbiggIGtiSXRtOiBLZXlib2FyZEl0ZW0pOiBudW1iZXIge1xyXG5cclxuICAgIGxldCBhY3Q6IG51bWJlciA9IDA7XHJcbiAgICAvLyB3aGVuIG1lbnUgaXMgZGVmaW5lIHdpdGggbm8ga2V5Ym9hcmQgZGVmaW5lLCB0aGUga2JJdGVtIGlzIHJldHVybiBudWxsO1xyXG4gICAgaWYgKGtiSXRtID09IG51bGwpXHJcbiAgICAgIHJldHVybiBhY3Q7XHJcblxyXG5cclxuICAgIC8vIFRoZXJlIHdhcyBubyBrYmQgbWFwcGluZyB0aGUgdGhhdCBrZXksIGJ1dCBpdCBzdGlsbCBiZWxvbmdzIHRvIGFuIGFjdGlvbi5cclxuICAgIC8vIHNlZSBpZiB0aGUga2JJdG0gaG9sZCBhbiBhY3Rpb24gKG9yaWdpbmFsbHkgbWFkZSBmb3IgTUdfQUNUX0NIQVIpLlxyXG4gICAgaWYgKGFjdCA9PT0gMCkge1xyXG4gICAgICAvLyBpZiBtZW51IHdhcyBmb3VuZCBhbmQgaXQgaXMgaW50ZXJuYWwgZXZlbnQgcHV0IGFjdGlvbiB0byB0aGUgcXVldWUgb25seSBpZiB0aGVyZSB3YXMgbm8ga2JkIG1hcHBpbmcgdGhlIHRoYXQga2V5LlxyXG4gICAgICBpZiAoa2JJdG0uZ2V0QWN0aW9uKCkgIT09IDApXHJcbiAgICAgICAgYWN0ID0ga2JJdG0uZ2V0QWN0aW9uKCk7XHJcbiAgICAgIC8vIHRoaXMgaXMgb25seSBURU1QIGhhcmRjb2RlZC4gdGhlIGFjdGlvbiB3aWxsIG5lZWQgdG8gYmUgaW4gdGhlIGtleWJvYXJkIG1hcHBpbmdcclxuICAgICAgLy8gYWxzbyBhIGNoYW5nZSB0byB0aGUgb25saW5lIChpZiB0aW1lIHBlcm1pdHMpIGFsc28gdG8gdHVybiB0aGUgdG9nZ2xlIGluc2VydCBpbnRvIGFuIGFjdC5cclxuICAgICAgZWxzZSBpZiAoa2JJdG0uZ2V0S2V5Q29kZSgpID09PSA0NSAmJiBrYkl0bS5nZXRNb2RpZmllcigpID09PSBNb2RpZmllcnMuTU9ESUZJRVJfTk9ORSAmJiBrYkl0bS5nZXRTdGF0ZXMoKSA9PT0gMClcclxuICAgICAgICBhY3QgPSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVE9HR0xFX0lOU0VSVDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gKGFjdCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0dGVyIGZvciB0aGUgZXhlY1N0YWNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBzdGFjazwvcmV0dXJucz5cclxuICBnZXRFeGVjU3RhY2soKTogRXhlY3V0aW9uU3RhY2sge1xyXG4gICAgcmV0dXJuIDxFeGVjdXRpb25TdGFjaz50aGlzLl9leGVjU3RhY2sucGVlaygpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHB1c2hlcyBvbmUgZW50cnkgb2YgYW4gb3BlcmF0aW9uIGludG8gdGhlIGV4ZWN1dGlvbiBzdGFja1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0YXNrSWRcIj4tIHRoZSBpZCBvZiB0aGUgY3VycmVudCB0YXNrPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImhhbmRsZXJJZFwiPi0gdGhlIGlkIG9mIHRoZSBoYW5kbGVyIHdoaWNoIGhvbGRzIHRoZSByYWlzZSBldmVudCBjb21tYW5kIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJvcGVySWR4XCI+LSB0aGUgaWR4IG9mIHRoZSBjb21tYW5kIHdoaWNoIGNyZWF0ZWQgYW4gZXhlY3V0aW9uIHN0YWNrIGVudHJ5IChyYWlzZSBldmVudCBvZiBmdW5jdGlvbiBjYWxsKTwvcGFyYW0+XHJcbiAgcHVzaEV4ZWNTdGFjayh0YXNrSWQ6IHN0cmluZywgaGFuZGxlcklkOiBzdHJpbmcsIG9wZXJJZHg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgKDxFeGVjdXRpb25TdGFjaz50aGlzLl9leGVjU3RhY2sucGVlaygpKS5wdXNoKE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuZ2V0VGFza0lkQnlJZCh0YXNrSWQpLCBoYW5kbGVySWQsIG9wZXJJZHgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHBvcHMgb25lIGVudHJ5IGZyb20gdGhlIGV4ZWN1dGlvbiBzdGFjayAtIGFmdGVyIHRoZSBjb21wbGV0aW9uIG9mIGFuIG9wZXJhdGlvbiB3aGljaCBjYW4gaG9sZFxyXG4gIC8vLyAgIG90aGVyIG9wZXJhdGlvbnNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIGVudHJ5IHRoYXQgd2FzIHBvcHBlZDwvcmV0dXJucz5cclxuICBwb3BFeGVjU3RhY2soKTogRXhlY3V0aW9uU3RhY2tFbnRyeSB7XHJcbiAgICByZXR1cm4gKDxFeGVjdXRpb25TdGFjaz50aGlzLl9leGVjU3RhY2sucGVlaygpKS5wb3AoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwdXNoIGEgbmV3IGVudHJ5IHRvIHRoZSBzdGFjayBvZiBzZXJ2ZXIgZXhlYyBzdGFja3MgLSB0aGlzIGlzIHRvIGRlZmVyIG9wZXJhdGlvbnMgdGhhdCBzaG91bGQgbm90XHJcbiAgLy8vICAgZ2V0IGluZmx1ZW5jZXMgYnkgdGhlIGN1cnJlbnQgc2VydmVyIGV4ZWN1dGlvbiBzdGFjayAtIHdoZW4gcGVyZm9ybWluZyB0aGUgcmVjb3JkIHByZWZpeCBvZiBhIHRhc2tcclxuICAvLy8gICB0aGF0IHdhcyBqdXN0IHJldHVybmVkIGZyb20gdGhlIHNlcnZlciwgb3Igd2hlbiBjYWxsaW5nIGEgbW9kYWwgdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHVzaE5ld0V4ZWNTdGFja3MoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9zZXJ2ZXJFeGVjU3RhY2sucHVzaChudWxsKTtcclxuICAgIHRoaXMuX2V4ZWNTdGFjay5wdXNoKG5ldyBFeGVjdXRpb25TdGFjaygpKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwb3BzIHRoZSBuZXcgZW50cnkgZnJvbSB0aGUgc3RhY2sgb2Ygc2VydmVyIGV4ZWN1dGlvbiBzdGFja3Mgd2hlbiB0aGUgc2VxdWVuY2UgdGhhdCBuZWVkcyB0byBhdm9pZFxyXG4gIC8vLyAgIGN1cnJlbnQgc2VydmVyIGV4ZWN1dGlvbiBzdGFjayBoYXMgZW5kZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHBvcE5ld0V4ZWNTdGFja3MoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9zZXJ2ZXJFeGVjU3RhY2sucG9wKCk7XHJcbiAgICB0aGlzLl9leGVjU3RhY2sucG9wKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcHVzaGVzIGFuIGV4ZWN1dGlvbiBzdGFjayBlbnRyeSBpbnRvIHRoZSBzZXJ2ZXIgZXhlYyBzdGFja1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0YXNrSWRcIj4tIHRoZSBpZCBvZiB0aGUgdGFzayBpbiB0aGUgZW50cnk8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaGFuZGxlcklkXCI+LSBoYW5kbGVyIGlkIG9mIHRoZSBlbnRyeTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJvcGVySWR4XCI+LSBpZHggb2YgdGhlIG9wZXJhdGlvbiB3aGljaCB0aGUgZW50cnkgcmVmZXJzIHRvPC9wYXJhbT5cclxuICBwdXNoU2VydmVyRXhlY1N0YWNrKHRhc2tJZDogc3RyaW5nLCBoYW5kbGVySWQ6IHN0cmluZywgb3BlcklkeDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fc2VydmVyRXhlY1N0YWNrLnBlZWsoKSA9PT0gbnVsbCkge1xyXG4gICAgICB0aGlzLl9zZXJ2ZXJFeGVjU3RhY2sucG9wKCk7XHJcbiAgICAgIHRoaXMuX3NlcnZlckV4ZWNTdGFjay5wdXNoKG5ldyBFeGVjdXRpb25TdGFjaygpKTtcclxuICAgIH1cclxuXHJcbiAgICAoPEV4ZWN1dGlvblN0YWNrPnRoaXMuX3NlcnZlckV4ZWNTdGFjay5wZWVrKCkpLnB1c2godGFza0lkLCBoYW5kbGVySWQsIG9wZXJJZHgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNsZWFycyB0aGUgc2VydmVyIGV4ZWN1dGlvbiBzdGFjayBhZnRlciB3ZSBmb3VuZCB0aGUgY29ycmVjdCBuZXh0IG9wZXJhdGlvbiB0aGF0IHdlIG5lZWQgdG8gY29udGludWUgZnJvbVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgY2xlYXJTZXJ2ZXJFeGVjU3RhY2soKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fc2VydmVyRXhlY1N0YWNrLnBlZWsoKSAhPT0gbnVsbCkge1xyXG4gICAgICAoPEV4ZWN1dGlvblN0YWNrPnRoaXMuX3NlcnZlckV4ZWNTdGFjay5wZWVrKCkpLmNsZWFyKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV2ZXJzZSB0aGUgc2VydmVyIGV4ZWN1dGlvbiBzdGFjayAtIHdlIGdldCBpdCBmcm9tIHRoZSBzZXJ2ZXIgYW5kIHB1c2ggaXQgaW4gdGhlIHNhbWUgb3JkZXJcclxuICAvLy8gICBpdCBpcyB3cml0dGVuIGluIHRoZSBtZXNzYWdlLCB3aGljaCBhY3R1YWxseSBtZWFucyB3ZSBoYXZlIHRvIHJldmVyc2UgaXQgaW4gb3JkZXIgdG8gaGFuZGxlIGl0IGNvcnJlY3RseVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcmV2ZXJzZVNlcnZlckV4ZWNTdGFjaygpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9zZXJ2ZXJFeGVjU3RhY2sucGVlaygpICE9PSBudWxsKVxyXG4gICAgICAoPEV4ZWN1dGlvblN0YWNrPnRoaXMuX3NlcnZlckV4ZWNTdGFjay5wZWVrKCkpLnJldmVyc2UoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjYWxjdWxhdGUgYWNjb3JkaW5nIHRvIHRoZSBzZXJ2ZXIncyBleGVjdXRpb24gc3RhY2sgYW5kIHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBzdGFjayBvbiB0aGUgY2xpZW50ICtcclxuICAvLy8gICB0aGUgY3VycmVudCBvcGVyYXRpb24gd2hpY2ggd2UgYXJlIG9uLCB3aGljaCBpcyB0aGUgbmV4dCBvcGVyYXRpb24gdGhhdCB3ZSBuZWVkIHRvIGV4ZWN1dGVcclxuICAvLy8gICBpbiB0aGUgY3VycmVudCBoYW5kbGVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm9wZXJcIj4tIHRoZSBvcGVyYXRpb24gd2hpY2ggd2UgYXJlIGN1cnJlbnRseSBvbjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjbGVhcldoZW5Gb3VuZFwiPmluZGljYXRlcyB3aGV0aGVyIHdlIHNob3VsZCBjbGVhciB0aGUgc2VydmVyIHN0YWNrIHdoZW4gd2UgcmVhY2ggaXRzIGVuZCxcclxuICAvLy8gICBvciBpZiB3ZSBqdXN0IHVzaW5nIHRoaXMgbWV0aG9kIHRvIGNoZWNrIHdoYXQgdGhlIG5leHQgb3BlcmF0aW9uIGlzXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPnMgdGhlIG5leHQgb3BlcmF0aW9uIHRoYXQgc2hvdWxkIGJlIGV4ZWN1dGVkIGJ5IHRoZSBjbGllbnRcclxuICAvLy8gICBpZiBpdCByZXR1cm5zIC0xIHRoZW4gdGhlIGNsaWVudCBzaG91bGQgY29udGludWUgYXMgdXN1YWxcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIGdldE5leHRPcGVySWR4KG9wZXI6IE9wZXJhdGlvbiwgY2xlYXJXaGVuRm91bmQ6IGJvb2xlYW4pOiBudW1iZXIge1xyXG4gICAgbGV0IHRtcFNlcnZlckV4ZWNTdGFja0VudHJ5OiBFeGVjdXRpb25TdGFja0VudHJ5ID0gbnVsbDtcclxuICAgIGxldCBuZXh0T3BlcklkeDogbnVtYmVyID0gLTE7XHJcblxyXG4gICAgLy8gaWYgdGhlIHNlcnZlciBleGVjIHN0YWNrIGlzIGVtcHJ5IGl0IG1lYW5zIHdlIGRpZCBub3QgcmV0dXJuIGZyb20gdGhlIHNlcnZlcixcclxuICAgIC8vIHNvIHdlIGhhdmUgdG8gY29udGludWUgd2l0aCBleGVjdXRpbmcgdGhlIGZvbGxvd2luZyBvcGVyYXRpb24gaW4gdGhlIGN1cnJlbnQgaGFuZGxlciBhcyB1c3VhbFxyXG4gICAgaWYgKHRoaXMuX3NlcnZlckV4ZWNTdGFjay5jb3VudCgpICE9PSAwICYmIHRoaXMuX3NlcnZlckV4ZWNTdGFjay5wZWVrKCkgIT09IG51bGwgJiYgISg8RXhlY3V0aW9uU3RhY2s+dGhpcy5fc2VydmVyRXhlY1N0YWNrLnBlZWsoKSkuZW1wdHkoKSkge1xyXG4gICAgICAvLyBpZiB0aGUgc2VydmVyJ3MgZXhlYyBzdGFjayBpcyBkZWVwZXIgdGhhbiB0aGUgY2xpZW50J3MgLVxyXG4gICAgICAvLyB3ZSBuZWVkIHRvIGNoZWNrIHRoZSBlbnRyeSBpbiB0aGUgY2xpZW50J3Mgc3RhY2sgd2hpY2ggY29ycmVzcG9uZHMgdG8gdGhlIHNlcnZlcidzIHN0YWNrIHNpemVcclxuICAgICAgaWYgKCg8RXhlY3V0aW9uU3RhY2s+dGhpcy5fc2VydmVyRXhlY1N0YWNrLnBlZWsoKSkuc2l6ZSgpID4gKDxFeGVjdXRpb25TdGFjaz50aGlzLl9leGVjU3RhY2sucGVlaygpKS5zaXplKCkpIHtcclxuICAgICAgICAvLyB3ZSBjb3B5IHRoZSBzZXJ2ZXIncyBleGVjdXRpb24gc3RhY2sgYW5kIHBvcCBmcm9tIGl0IHVudGlsIHRoZSBzaXplIG9mIHRoZSBzZXJ2ZXJcclxuICAgICAgICAvLyBhbmQgdGhlIGNsaWVudCBpcyB0aGUgc2FtZVxyXG4gICAgICAgIGxldCB0bXBTZXJ2ZXJFeGVjU3RhY2s6IEV4ZWN1dGlvblN0YWNrID0gbmV3IEV4ZWN1dGlvblN0YWNrKDxFeGVjdXRpb25TdGFjaz50aGlzLl9zZXJ2ZXJFeGVjU3RhY2sucGVlaygpKTtcclxuICAgICAgICB3aGlsZSAodG1wU2VydmVyRXhlY1N0YWNrLnNpemUoKSA+ICg8RXhlY3V0aW9uU3RhY2s+dGhpcy5fZXhlY1N0YWNrLnBlZWsoKSkuc2l6ZSgpKSB7XHJcbiAgICAgICAgICB0bXBTZXJ2ZXJFeGVjU3RhY2tFbnRyeSA9IHRtcFNlcnZlckV4ZWNTdGFjay5wb3AoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGlmIGFsbCBlbnRyaWVzIGJlZm9yZSB0aGUgbGFzdCBvbmUgd2UgcG9wcGVkIGFyZSB0aGUgc2FtZSBhcyBpbiB0aGUgY2xpZW50IGFuZFxyXG4gICAgICAgIC8vIHRoZSBjdXJyZW50IGVudHJ5IGlzIG9uIHRoZSBzYW1lIGhhbmRsZXIgYXMgdGhlIHNlcnZlcidzIGxhc3QgZW50cnksXHJcbiAgICAgICAgLy8gYW5kIHRoZSBvcGVyYXRpb24gaXMgYWZ0ZXIgdGhlIGN1cnJlbnQgb3BlcmF0aW9uLFxyXG4gICAgICAgIC8vIHRoZW4gdGhpcyBlbnRyeSBpbiB0aGUgc2VydmVyIGluZGljYXRlcyB3aGljaCBpcyBvdXIgbmV4dCBvcGVyYXRpb25cclxuICAgICAgICBpZiAodGhpcy5fZXhlY1N0YWNrLnBlZWsoKS5FcXVhbHModG1wU2VydmVyRXhlY1N0YWNrKSAmJiB0bXBTZXJ2ZXJFeGVjU3RhY2tFbnRyeS5UYXNrSWQgPT09IG9wZXIuZ2V0VGFza1RhZygpICYmIHRtcFNlcnZlckV4ZWNTdGFja0VudHJ5LkhhbmRsZXJJZCA9PT0gb3Blci5nZXRIYW5kbGVySWQoKSAmJiB0bXBTZXJ2ZXJFeGVjU3RhY2tFbnRyeS5PcGVySWR4ID49IG9wZXIuZ2V0U2VydmVySWQoKSkge1xyXG4gICAgICAgICAgbmV4dE9wZXJJZHggPSB0bXBTZXJ2ZXJFeGVjU3RhY2tFbnRyeS5PcGVySWR4O1xyXG5cclxuICAgICAgICAgIC8vIGlmIHRoZSBzZXJ2ZXIgZXhlYyBzdGFjayBpcyBkZWVwZXIgdGhhbiB0aGUgY2xpZW50J3MgYnkgb25seSAxLFxyXG4gICAgICAgICAgLy8gd2hpY2ggbWVhbnMgd2UgYXJlIGNoZWNraW5nIHRoZSB0b3AgbW9zdCBlbnRyeSBvbiB0aGUgc2VydmVyJ3MgZXhlY3V0aW9uIHN0YWNrLFxyXG4gICAgICAgICAgLy8gdGhlIHdob2xlIHN0YWNrIGlzIHRoZSBzYW1lIG5vdywgc28gd2UgY2FuIGNsZWFyIHRoZSBzZXJ2ZXIncyBzdGFjayAtXHJcbiAgICAgICAgICAvLyB3ZSBnb3QgdG8gdGhlIHBvaW50IHdoaWNoIHdlIGFyZSBvbiB0aGUgZXhhY3Qgb3BlcmF0aW9uIHdoaWNoIHRoZSBzZXJ2ZXIgbGVmdCBleGVjdXRpb24uXHJcbiAgICAgICAgICBpZiAoY2xlYXJXaGVuRm91bmQgJiYgKDxFeGVjdXRpb25TdGFjaz50aGlzLl9zZXJ2ZXJFeGVjU3RhY2sucGVlaygpKS5zaXplKCkgPT09ICg8RXhlY3V0aW9uU3RhY2s+dGhpcy5fZXhlY1N0YWNrLnBlZWsoKSkuc2l6ZSgpICsgMSkge1xyXG4gICAgICAgICAgICAoPEV4ZWN1dGlvblN0YWNrPnRoaXMuX3NlcnZlckV4ZWNTdGFjay5wZWVrKCkpLmNsZWFyKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlXHJcbiAgICAgICAgICBuZXh0T3BlcklkeCA9IEV2ZW50c01hbmFnZXIuTUFYX09QRVI7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbmV4dE9wZXJJZHggPSBFdmVudHNNYW5hZ2VyLk1BWF9PUEVSO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV4dE9wZXJJZHg7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSBwcm9jZXNzaW5nVG9wTW9zdEVuZFRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaW5Qcm9jZXNzaW5nVG9wTW9zdEVuZFRhc2tcIj48L3BhcmFtPlxyXG4gIHNldFByb2Nlc3NpbmdUb3BNb3N0RW5kVGFzayhpblByb2Nlc3NpbmdUb3BNb3N0RW5kVGFzazogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5fcHJvY2Vzc2luZ1RvcE1vc3RFbmRUYXNrID0gaW5Qcm9jZXNzaW5nVG9wTW9zdEVuZFRhc2s7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgcHJvY2Vzc2luZ1RvcE1vc3RFbmRUYXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRQcm9jZXNzaW5nVG9wTW9zdEVuZFRhc2soKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fcHJvY2Vzc2luZ1RvcE1vc3RFbmRUYXNrO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgQWxsb3dFdmVudHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiQWxsb3dFdmVudHNcIj48L3BhcmFtPlxyXG4gIHNldEFsbG93RXZlbnRzKEFsbG93RXZlbnRzOiBFdmVudHNBbGxvd2VkVHlwZSk6IHZvaWQge1xyXG4gICAgdGhpcy5fYWxsb3dFdmVudHMgPSBBbGxvd0V2ZW50cztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIEFsbG93RXZlbnRzIGZvciBhIG5vbiBpbnRlcmFjdGl2ZSB0YXNrLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJBbGxvd0V2ZW50c1wiPjwvcGFyYW0+XHJcbiAgc2V0Tm9uSW50ZXJhY3RpdmVBbGxvd0V2ZW50cyhBbGxvd0V2ZW50czogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKEFsbG93RXZlbnRzKVxyXG5cclxuICAgICAgdGhpcy5fYWxsb3dFdmVudHMgPSBFdmVudHNBbGxvd2VkVHlwZS5OT05fSU5URVJBQ1RJVkU7XHJcbiAgICAvLyBRQ1IgIzgwMjQ5NSwgVGhlIEZvcm1zIENvbnRyb2xsZXIgbWVjaGFuaXNtIGlzIGRpc2FibGUgaWYgd2UgYXJlIGluIE5vbiBpbnRlcmFjdGl2ZSB0YXNrIHdpdGggQWxsb3dFdmVudHMgPSB0cnVlIGFuZCBPcGVuIFdpbmRvdyA9IHRydWVcclxuXHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuX2FsbG93RXZlbnRzID0gRXZlbnRzQWxsb3dlZFR5cGUuTk9ORTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIEFsbG93RXZlbnRzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIndpdGhpbk5vbkludGVyYWN0aXZlTG9vcFwiPjwvcGFyYW0+XHJcbiAgZ2V0QWxsb3dFdmVudHMoKTogRXZlbnRzQWxsb3dlZFR5cGUge1xyXG4gICAgcmV0dXJuIHRoaXMuX2FsbG93RXZlbnRzO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFJldHVybiBUUlVFIGlmIG5vIGV2ZW50cyBhcmUgYWxsb3dlZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBOb0V2ZW50c0FsbG93ZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fYWxsb3dFdmVudHMgPT09IEV2ZW50c0FsbG93ZWRUeXBlLk5PTkU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2hlY2sgYW5kIGV4ZWN1dGUgY29udHJvbCBtb2RpZnkgZXZlbnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJhY3RcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlQ3RybE1vZGlmeShjdHJsOiBNZ0NvbnRyb2wsIGFjdDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAvLyBpZiBjYW5ub3QgbW9kaWZ5LCBkbyBub3RoaW5nXHJcbiAgICBpZiAoY3RybCA9PSBudWxsIHx8ICFjdHJsLmlzTW9kaWZpYWJsZSgpKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgc3dpdGNoIChhY3QpIHtcclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfRURUX05VTEw6XHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfTU9ESUZZOlxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9TRUxFQ1RJT046XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudDtcclxuICAgIHJ0RXZ0ID0gbmV3IFJ1blRpbWVFdmVudChjdHJsKTtcclxuICAgIHJ0RXZ0LnNldEludGVybmFsKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX01PRElGWSk7XHJcbiAgICBhd2FpdCB0aGlzLmhhbmRsZUV2ZW50KHJ0RXZ0LCBmYWxzZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2hlY2sgaWYgYWN0aW9uIGlzIGFsbG93ZWQgYWNjb3JkaW5nIHRvIHRoZSBBbGxvd2VkRXZlbnRzIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiYWN0XCI+PC9wYXJhbT5cclxuICBwcml2YXRlIEFjdEFsbG93ZWQoYWN0OiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGxldCBhbGxvd2VkOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIHN3aXRjaCAodGhpcy5nZXRBbGxvd0V2ZW50cygpKSB7XHJcbiAgICAgIGNhc2UgRXZlbnRzQWxsb3dlZFR5cGUuQUxMOlxyXG4gICAgICAgIGFsbG93ZWQgPSB0cnVlO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBFdmVudHNBbGxvd2VkVHlwZS5OT05FOlxyXG4gICAgICAgIC8vIGFsbG93IGNyZWxpbmUgZXZlbiBpbiBhbGxvdz1uby4gd2UgaGF2ZSBubyBjaG9pY2UuIFJDIG1lY2hhbmlzbSBpcyBkaWZmZXJlbnQgdGhlbiBiYXRjaC4gaXQgdXNlcyBBQ1RfQ1JFQUxJTkVcclxuICAgICAgICAvLyB3aGVuIGluIGNyZWF0ZSBtb2RlLiBXZSB3aWxsIG5lZWQgdG8gY2hhbmdlIGl0IGluIHRoZSBmdXR1cmUgc28gdGhhdCB3aGVuIHVzZXIgcmFpc2VzIGNyZWxpbmUgZXZlbnQgaXQgd2lsbCBub3Qgd29yay4ganVzdCBpbnRlcm5hbGx5LlxyXG4gICAgICAgIGFsbG93ZWQgPSAoYWN0ID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1JFTElORSk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAvLyBPbmx5IHRoZSBmb2xsb3dpbmcgYWN0aW9ucyBhcmUgYWxsb3dlZCB3aGVuIHJ1bm5pbmcgaW5zaWRlIGEgbm9uIGludGVyYWN0aXZlIGxvb3Agd2hlbiBhbGxvdyBldmVudHMgPSBZRVMuXHJcbiAgICAgIGNhc2UgRXZlbnRzQWxsb3dlZFR5cGUuTk9OX0lOVEVSQUNUSVZFOlxyXG5cclxuICAgICAgICBzd2l0Y2ggKGFjdCkge1xyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRVhJVF9TWVNURU06XHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FWElUOlxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ0xPU0U6XHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DUkVMSU5FOlxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1JFTElORV9BQk9WRTpcclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JPTExCQUNLOlxyXG4gICAgICAgICAgICBhbGxvd2VkID0gdHJ1ZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgYWxsb3dlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGFsbG93ZWQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgVGhpcyBmdW5jdGlvbiBjb21taXRzIHRoZSByZWNvcmQgYW5kIHRoZW4gZGVwZW5kaW5nIG9uIHRoZSBzdWNjZXNzIG9yIGZhaWx1cmUgb2YgdHJhbnNhY3Rpb24sIGl0IHBlcmZvcm1zIG90aGVyIGFjdGlvbnMuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRhc2tcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaXNSZXZlcnNpYmxlRXhpdFwiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBjb21taXRSZWNvcmQodGFzazogVGFzaywgaXNSZXZlcnNpYmxlRXhpdDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGR2OiBEYXRhVmlldyA9IDxEYXRhVmlldz50YXNrLkRhdGFWaWV3O1xyXG4gICAgbGV0IHJlYzogUmVjb3JkID0gZHYuZ2V0Q3VyclJlYygpO1xyXG5cclxuICAgIGxldCBmb3JjZVN1ZmZpeDogYm9vbGVhbiA9IGF3YWl0IHRhc2suY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0ZPUkNFX1NVRkZJWCwgZmFsc2UpO1xyXG4gICAgbGV0IGlzU2VsZWN0aW9uVGFibGU6IGJvb2xlYW4gPSBhd2FpdCB0YXNrLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TRUxFQ1RJT04sIGZhbHNlKTtcclxuICAgIGxldCBpc05ld1JlYzogYm9vbGVhbiA9IHJlYy5pc05ld1JlYygpO1xyXG4gICAgbGV0IHNhdmVQcmV2Q3VyclJlYzogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBsZXQgcmVjTW9kaWZpZWQ6IGJvb2xlYW4gPSByZWMuTW9kaWZpZWQ7XHJcblxyXG4gICAgaWYgKCFkdi5yZWNJbk1vZGlmaWVkVGFiKHJlYy5nZXRJZCgpKSlcclxuICAgICAgcmVjLmNsZWFyRmxhZ3NIaXN0b3J5KCk7XHJcbiAgICBhd2FpdCB0YXNrLlRhc2tUcmFuc2FjdGlvbk1hbmFnZXIuY2hlY2tBbmRDb21taXQoaXNSZXZlcnNpYmxlRXhpdCwgQ29uc3RJbnRlcmZhY2UuVFJBTlNfUkVDT1JEX1BSRUZJWCwgdGFzay5Db25maXJtVXBkYXRlTm8pO1xyXG4gICAgaWYgKHRhc2sudHJhbnNhY3Rpb25GYWlsZWQoQ29uc3RJbnRlcmZhY2UuVFJBTlNfUkVDT1JEX1BSRUZJWCkpIHtcclxuICAgICAgLy8gb24gZmFpbHVyZSBvZiB0aGUgdHJhbnNhY3Rpb24gcmVlbnRlciB0aGUgcmVjb3JkIGxldmVsIGJ5XHJcbiAgICAgIC8vIGV4ZWN1dGluZyBcInJlY29yZCBwcmVmaXhcIiBmb3IgdGhlIHN1YmZvcm1zIHdoaWNoIGV4ZWN1dGVkXHJcbiAgICAgIC8vIHRoZSBzdWZmaXggc3VjY2Vzc2Z1bGx5XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgdGFzay5EYXRhU3luY2VkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb24oZmFsc2UpO1xyXG4gICAgICAgIGF3YWl0IHRhc2suaGFuZGxlRXZlbnRPblNsYXZlVGFza3MoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG4gICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbih0cnVlKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmICh0YXNrLmlzQWJvcnRpbmcoKSlcclxuICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uKHRydWUpO1xyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmIChyZWNNb2RpZmllZClcclxuICAgICAgICByZWMuc2V0TGF0ZUNvbXB1dGUodHJ1ZSk7XHJcblxyXG4gICAgICAvLyBRQ1IgNzgzMDcxIGlmIGFmdGVyIGNoZWNrQW5kQ29tbWl0IGFsbCBpZiBPLksuIHRoZVxyXG4gICAgICAvLyByZXR1cm4gdGhlIGxldmVsIGJhY2sgdG8gdGFzayBsZXZlbCBpbiBvcmRlciB0byBsZXQgcmVjX3ByZml4IHRvIGJlIGV4ZWN1dGVkLlxyXG4gICAgICAvLyBldmVuIHRob3VnaCB0aGUgdGFzayBsZXZlbCBzaG91bGQgYmUgVEFTS19MRVZFTF9UQVNLXHJcbiAgICAgIC8vIHRoZSBjaGVja0FuZENvbW1pdCBwcm9jZXNzIGNvdWxkIGhhdmUgY2hhbmdlIGl0XHJcbiAgICAgIGlmICghdGhpcy5fc3RvcEV4ZWN1dGlvbilcclxuICAgICAgICB0YXNrLnNldExldmVsKENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spO1xyXG5cclxuICAgICAgcmVjLnJlc2V0VXBkYXRlZCgpO1xyXG4gICAgICByZWMucmVzZXRNb2RpZmllZCgpO1xyXG5cclxuICAgICAgLy8gUUNSICM5ODMxNzg6IGNhbmNlbCB0aGUgcmVjb3JkIG9ubHkgYWZ0ZXIgdGhlIHRyYW5zYWN0aW9uXHJcbiAgICAgIC8vIGhhbmRsaW5nIHdhcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IGFuZCB0aGUgcmVjb3JkIHdhc24ndFxyXG4gICAgICAvLyBtb2RpZmllZFxyXG4gICAgICBpZiAoIXJlY01vZGlmaWVkICYmICFmb3JjZVN1ZmZpeCAmJiAoIWlzU2VsZWN0aW9uVGFibGUgfHwgIXRhc2suSW5TZWxlY3QpKSB7XHJcbiAgICAgICAgaWYgKGlzTmV3UmVjKSB7XHJcbiAgICAgICAgICAvLyBRQ1IgIzQyODk2NTogc2F2ZSB0aGUgcHJldmlvdXMgY3VycmVudCByZWNvcmQgQkVGT1JFXHJcbiAgICAgICAgICAvLyBcImNhbmNlbCBlZGl0XCIgc28gdGhlIGNvcnJlY3QgcmVjb3JkIGlzIHNhdmVkXHJcbiAgICAgICAgICBkdi5zZXRQcmV2Q3VyclJlYygpO1xyXG4gICAgICAgICAgc2F2ZVByZXZDdXJyUmVjID0gZmFsc2U7XHJcbiAgICAgICAgICByZWMuc2V0TmV3UmVjKCk7XHJcbiAgICAgICAgICBhd2FpdCAoPE1nRm9ybT50YXNrLmdldEZvcm0oKSkuY2FuY2VsRWRpdChmYWxzZSwgZmFsc2UpO1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5IYW5kbGVTdG9wUm93RWRpdGluZyh0YXNrKTtcclxuICAgICAgICB9IGVsc2UgaWYgKCFyZWMuZ2V0Rm9yY2VTYXZlT3JnKCkpXHJcbiAgICAgICAgICBhd2FpdCBkdi5jYW5jZWxFZGl0KEV2ZW50c01hbmFnZXIuUkVBTF9PTkxZLCB0cnVlKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBkdi5zYXZlT3JpZ2luYWwoKTtcclxuICAgICAgfVxyXG4gICAgICAvLyBRQ1IgIzk5NTIyMjogaWYgdGhlIHJlY29yZCB3YXMgbW9kaWZpZWQgdGhlbiBzYXZlIHRoZVxyXG4gICAgICAvLyBvcmlnaW5hbCByZWNvcmQgYWdhaW4gaW4gY2FzZSBhIHRhc2sgbGF2ZWwgdHJhbnNhY3Rpb25cclxuICAgICAgLy8gd2lsbCBmYWlsIHdpdGggcmV0cnkgc3RyYXRlZ3kuIEJlZm9yZSB0aGlzIGZpeCwgaWYgc3VjaFxyXG4gICAgICAvLyB0aGluZyBoYXBwZW5lZCBvbiBhIHJlY29yZCB3aGljaCB3YXNuJ3QgdGhlIGZpcnN0IHRoZW5cclxuICAgICAgLy8gdGhlIFwiYmVnaW4gdGFibGVcIiBldmVudCByYWlzZWQgYSByZWNvcmQgc3VmZml4IGV2ZW50IGFuZFxyXG4gICAgICAvLyBjYXVzZWQgXCJjYW5jZWwgZWRpdFwiLlxyXG4gICAgICBlbHNlXHJcbiAgICAgICAgZHYuc2F2ZU9yaWdpbmFsKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHNhdmVQcmV2Q3VyclJlYylcclxuICAgICAgZHYuc2V0UHJldkN1cnJSZWMoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjYWxsYmFjayBmb3IgaW5jcmVtZW50YWwgbG9jYXRlIHRpbWVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpbmNMb2NhdGVUaW1lckNCKHRhc2tPYmo6IGFueSk6IHZvaWQge1xyXG4gICAgbGV0IHRhc2s6IFRhc2sgPSB0YXNrT2JqO1xyXG4gICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KHRhc2ssIHRydWUpO1xyXG5cclxuICAgIHJ0RXZ0LnNldEludGVybmFsKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9JTkNSRU1FTlRBTF9MT0NBVEUpO1xyXG4gICAgcnRFdnQuc2V0TWFpblByZ0NyZWF0b3IodGFzayk7XHJcbiAgICBydEV2dC5zZXRDdHJsKDxNZ0NvbnRyb2w+dGFzay5nZXRMYXN0UGFya2VkQ3RybCgpKTtcclxuICAgIHRoaXMuYWRkVG9UYWlsKHJ0RXZ0KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFza1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIHN0YXRpYyBhc3luYyBkb1N5bmNGb3JTdWJmb3JtUGFyZW50KHRhc2s6IFRhc2spOiBQcm9taXNlPHZvaWQ+IHtcclxuXHJcbiAgICBsZXQgcGFyZW50VGFzazogVGFzayA9IDxUYXNrPnRhc2suZ2V0UGFyZW50KCk7XHJcbiAgICBsZXQgcGFyZW50RHYgPSA8RGF0YVZpZXc+cGFyZW50VGFzay5EYXRhVmlldztcclxuICAgIGxldCBwYXJlbnRSZWM6IFJlY29yZCA9IHBhcmVudER2LmdldEN1cnJSZWMoKTtcclxuXHJcbiAgICAvLyBkbyBub3QgdG91Y2ggdGhlIHBhcmVudCByZWNvcmQgaWYgdGhlIHBhcmVudCBkYXRhdmlldyBpcyAnZW1wdHkgZGF0YXZpZXcnLlxyXG4gICAgaWYgKHRhc2suSXNTdWJGb3JtICYmIHBhcmVudFJlYyAhPSBudWxsICYmIHBhcmVudFJlYy5Nb2RpZmllZCAmJiAhcGFyZW50RHYuaXNFbXB0eURhdGF2aWV3KCkpIHtcclxuICAgICAgcGFyZW50UmVjLnNldE1vZGUoRGF0YU1vZGlmaWNhdGlvblR5cGVzLlVwZGF0ZSk7XHJcbiAgICAgIGF3YWl0IHBhcmVudER2LmFkZEN1cnJUb01vZGlmaWVkKGZhbHNlKTtcclxuICAgICAgKChwYXJlbnREdi5nZXRDdXJyUmVjKCkpKS5TeW5jZWQgPSB0cnVlO1xyXG4gICAgICBwYXJlbnREdi5zZXRDaGFuZ2VkKHRydWUpO1xyXG4gICAgICBsZXQgZGF0YVZpZXdFeGVjdXRlTG9jYWxVcGRhdGVzQ29tbWFuZDogSUNsaWVudENvbW1hbmQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVEYXRhVmlld0NvbW1hbmQocGFyZW50VGFzay5nZXRUYXNrVGFnKCksIERhdGFWaWV3Q29tbWFuZFR5cGUuRXhlY3V0ZUxvY2FsVXBkYXRlcyk7XHJcbiAgICAgIGF3YWl0IHBhcmVudFRhc2suRGF0YXZpZXdNYW5hZ2VyLkV4ZWN1dGUoZGF0YVZpZXdFeGVjdXRlTG9jYWxVcGRhdGVzQ29tbWFuZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBQcm9jZXNzQWJvcnRpbmdFcnJvcihleDogQXBwbGljYXRpb25FeGNlcHRpb24pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBlTXNnOiBzdHJpbmc7XHJcbiAgICBsZXQgZXJyRm9yQ29uc29sZTogc3RyaW5nO1xyXG4gICAgbGV0IGVyckZvck1zZ0JveDogc3RyaW5nO1xyXG5cclxuICAgIGlmIChleCBpbnN0YW5jZW9mIFNlcnZlckVycm9yKVxyXG4gICAgICBlTXNnID0gKDxTZXJ2ZXJFcnJvcj5leCkuR2V0TWVzc2FnZSgpO1xyXG4gICAgZWxzZVxyXG4gICAgICBlTXNnID0gKChleC5NZXNzYWdlICE9PSBudWxsKSA/IGV4Lk1lc3NhZ2UgOiBleC5HZXRUeXBlKCkpO1xyXG5cclxuICAgIGVyckZvckNvbnNvbGUgPSBTdHJVdGlsLmdldENvbnNvbGVFcm9yU3RyaW5nKGVNc2cpO1xyXG4gICAgZXJyRm9yTXNnQm94ID0gU3RyVXRpbC5nZXRNc2dCb3hFcm9yU3RyaW5nKGVNc2cpO1xyXG5cclxuICAgIGlmIChleC5Jbm5lckV4Y2VwdGlvbiAhPT0gbnVsbClcclxuICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2coZXguSW5uZXJFeGNlcHRpb24sIGVyckZvckNvbnNvbGUpO1xyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmICghKGV4IGluc3RhbmNlb2YgU2VydmVyRXJyb3IpIHx8IExvZ2dlci5JbnN0YW5jZS5Mb2dMZXZlbCAhPT0gTG9nZ2VyX0xvZ0xldmVscy5CYXNpYykge1xyXG4gICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nV2l0aE1zZyhlcnJGb3JDb25zb2xlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFRPRE8gOiBoYW5kbGUgZXJyb3JzXHJcbiAgICBsZXQgc2VuZFVubG9hZFRvU2VydmVyOiBib29sZWFuID0gUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLkNvbnRleHRJRCAhPT0gUnVudGltZUNvbnRleHRCYXNlLm5vQ29udGV4dElkOyAgLy8gdW5sb2FkIHRoZSBjb250ZXh0IGluIHRoZSBzZXJ2ZXIgb25seSBpZiBhIGNvbnRleHQgd2FzIGNyZWF0ZWQgZHVyaW5nIHRoZSBjdXJyZW50IHNlc3Npb25cclxuXHJcbiAgICBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLmN1cnJNZ2RJRCA9IDA7XHJcblxyXG4gICAgbGV0IG1lc3NhZ2VTdHJpbmc6IHN0cmluZyA9IExhbmd1YWdlRGF0YS5JbnN0YW5jZS5nZXRDb25zdE1lc3NhZ2UoTXNnSW50ZXJmYWNlLkJSS1RBQl9TVFJfRVJST1IpO1xyXG5cclxuICAgIGxldCBzdHlsZTogbnVtYmVyID0gMTY7XHJcbiAgICBpZiAoZXguTWVzc2FnZS5zdGFydHNXaXRoKCc8SFRNTCcpKSB7XHJcbiAgICAgIHRoaXMucHJvY2Vzc0hUTUxDb250ZW50KGV4Lk1lc3NhZ2UpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gVE9ETzogdGVtcG9yYXJpbHkgc2hvdyB0aGUgbWVzc2FnZSBib3hcclxuICAgICAgLy8gaWRlYWxseSwgdGhlIGN1cnJlbnQgcGFnZSBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aCB0aGUgZXJyb3IgcGFnZVxyXG4gICAgICBpZiAodGhpcy5TaG93RXJyb3JJbk1lc3NhZ2VCb3goZXgpKSB7XHJcbiAgICAgICAgYXdhaXQgR1VJTWFuYWdlci5JbnN0YW5jZS5NZXNzYWdlQm94KG1lc3NhZ2VTdHJpbmcsIGVyckZvck1zZ0JveCwgc3R5bGUpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChleCBpbnN0YW5jZW9mIFNlcnZlckVycm9yKXtcclxuICAgICAgICBpZigoPFNlcnZlckVycm9yPmV4KS5HZXRDb2RlKCkgPT0gU2VydmVyRXJyb3IuRVJSX1dFQkNMSUVOVF9QUk9HUkFNX1JFTE9BREVEIHx8XHJcbiAgICAgICAgICAgKDxTZXJ2ZXJFcnJvcj5leCkuR2V0Q29kZSgpID09IFNlcnZlckVycm9yLkVSUl9FWEVDVVRFRF9QUk9HUkFNX0NIQU5HRUQpIHtcclxuICAgICAgICAgICBDb21tYW5kcy5hZGRHbG9iYWxDb21tYW5kKENvbW1hbmRUeXBlLlJFTE9BRF9QQUdFKTtcclxuICAgICAgICAgICAvLyBNdXN0IGNhbGwgYmVnaW5JbnZva2UgaGVyZTsgaW4gdGhlIGNhc2UgYSBuZXcgY29ubmVjdGlvbiB3YXMgcmVmdXNlZCwgdGhlIGJlZ2luSW52b2tlIGlzIG5ldmVyIGNhbGxlZCwgc28gd2VcclxuICAgICAgICAgICAvLyBuZWVkIHRvIG1ha2Ugc3VyZSBpdCBpcyBjYWxsZWQgaGVyZVxyXG4gICAgICAgICAgIENvbW1hbmRzLmJlZ2luSW52b2tlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVE9ETzogSG93IHRvIGNoZWNrIGlmIGl0IHdhcyBDb25uZWN0RmFpbHVyZSBvciBQcm90b2NvbEVycm9yP1xyXG4gICAgLy8gSW4gY2FzZSBpZiB3ZSBhcmUgYWJsZSB0byBjb25uZWN0IHRvIHRoZSBzZXJ2ZXIgaS5lLiBzdGF0dXMgaXMgQ29ubmVjdGlvbkZhaWx1cmVcclxuICAgIC8vIHRoZW4gdGhlcmUgaXMgbm8gcG9pbnQgaW4gc2VuZGluZyB1bmxvYWQgY29tbWFuZCwgYmVjYXVzZSBpdCB3aWxsIG5ldmVyIHN1Y2NlZWQgYW5kXHJcbiAgICAvLyB3ZSB3aWxsIGluIGluZmluaXRlIGxvb3AuXHJcbiAgICAvLyBsZXQgZmxhZzg6IGJvb2xlYW4gPSBleC5Jbm5lckV4Y2VwdGlvbiAhPT0gbnVsbCAmJiBleC5Jbm5lckV4Y2VwdGlvbi5HZXRUeXBlKCkuRnVsbE5hbWUgPT09IFwiU3lzdGVtLk5ldC5XZWJFeGNlcHRpb25cIjtcclxuICAgIC8vIGlmIChmbGFnOCkge1xyXG4gICAgLy8gICBsZXQgZXgyOiBXZWJFeGNlcHRpb24gPSA8V2ViRXhjZXB0aW9uPmV4LklubmVyRXhjZXB0aW9uO1xyXG4gICAgLy8gICBsZXQgZmxhZzk6IGJvb2xlYW4gPSBleDIuU3RhdHVzID09PSBXZWJFeGNlcHRpb25TdGF0dXMuQ29ubmVjdEZhaWx1cmUgfHwgZXgyLlN0YXR1cyA9PT0gV2ViRXhjZXB0aW9uU3RhdHVzLlByb3RvY29sRXJyb3I7XHJcbiAgICAvLyAgIGlmIChmbGFnOSkge1xyXG4gICAgLy8gICAgIHNlbmRVbmxvYWRUb1NlcnZlciA9IGZhbHNlO1xyXG4gICAgLy8gICB9XHJcbiAgICAvLyB9XHJcblxyXG4gICAgaWYgKGV4IGluc3RhbmNlb2YgU2VydmVyRXJyb3IpIHtcclxuICAgICAgLy8gSWYgdGhlIGNvbnRleHQgd2FzIG5vdCBmb3VuZCwgb3IgdGhlIHByb2dyYW0gaXMgcmVsb2FkZWQgYnkgdGhlIHNlcnZlciwgbm8gcG9pbnQgaW4gdHJ5aW5nIHRvIHVubG9hZCBpdFxyXG4gICAgICBpZiAoKDxTZXJ2ZXJFcnJvcj5leCkuR2V0Q29kZSgpID09PSBTZXJ2ZXJFcnJvci5FUlJfQ1RYX05PVF9GT1VORCB8fFxyXG4gICAgICAgICAgKDxTZXJ2ZXJFcnJvcj5leCkuR2V0Q29kZSgpID09PSBTZXJ2ZXJFcnJvci5FUlJfV0VCQ0xJRU5UX1BST0dSQU1fUkVMT0FERUQgfHxcclxuICAgICAgICAgICg8U2VydmVyRXJyb3I+ZXgpLkdldENvZGUoKSA9PT0gU2VydmVyRXJyb3IuRVJSX0VYRUNVVEVEX1BST0dSQU1fQ0hBTkdFRCkge1xyXG4gICAgICAgIHNlbmRVbmxvYWRUb1NlcnZlciA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHNlbmRVbmxvYWRUb1NlcnZlcikge1xyXG4gICAgICAvLyB0ZWxsIHRoZSBzZXJ2ZXIgdG8gY2xvc2UgdGhlIHJ1bnRpbWUuXHJcbiAgICAgIC8vIElmIHdlIHRlcm1pbmF0ZSBSVEUgYW5kIHRoZW4gY2xvc2UgUkMgd2luZG93IHRoZW4gYWxzbyB3ZSB3aWxsIGJlXHJcbiAgICAgIC8vIFByb2Nlc3NpbmcgQWJvcnQgZXJyb3IgaW4gdGhhdCBjYXNlIHNlcnZlciBpcyBhbHJlYWR5IGNsb3NlZCBzbyBjYXRjaCB0aGUgZXhjZXB0aW9uLlxyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGxldCBjbWQ6IElDbGllbnRDb21tYW5kID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlVW5sb2FkQ29tbWFuZCgpO1xyXG4gICAgICAgIE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuZ2V0TUdEYXRhKDApLkNtZHNUb1NlcnZlci5BZGQoY21kKTtcclxuICAgICAgICBhd2FpdCBDb21tYW5kc1Byb2Nlc3Nvck1hbmFnZXIuR2V0Q29tbWFuZHNQcm9jZXNzb3IoKS5FeGVjdXRlKENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZW5kaW5nSW5zdHJ1Y3Rpb24uVEFTS1NfQU5EX0NPTU1BTkRTKTtcclxuICAgICAgfSBjYXRjaCAoZXgzKSB7XHJcbiAgICAgICAgaWYgKGV4MyBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uRXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZyhleDMpO1xyXG4gICAgICAgIH0gZWxzZVxyXG4gICAgICAgICAgdGhyb3cgZXgzO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgR1VJTWFuYWdlci5JbnN0YW5jZS5hYm9ydCgpO1xyXG4gIH1cclxuXHJcblxyXG4gIHByb2Nlc3NIVE1MQ29udGVudChodG1sQ29udGVudDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBDb21tYW5kcy5hZGRTaG93SFRNTEVycm9yKENvbW1hbmRUeXBlLlNIT1dfSFRNTF9FUlJPUiwgaHRtbENvbnRlbnQpO1xyXG4gICAgQ29tbWFuZHMuYmVnaW5JbnZva2UoKTtcclxuICB9XHJcblxyXG4gIC8vIFRoaXMgbWV0aG9kIGRlY2lkZXMgaWYgdGhlIGVycm9yIGhhbmRsZWQgaW4gUHJvY2Vzc0Fib3J0aW5nRXJyb3Igd2lsbCBvcGVuIGEgbWVzc2FnZSBib3hcclxuICBTaG93RXJyb3JJbk1lc3NhZ2VCb3goZXg6IEFwcGxpY2F0aW9uRXhjZXB0aW9uKTogYm9vbGVhbiB7XHJcbiAgICBpZighKGV4IGluc3RhbmNlb2YgU2VydmVyRXJyb3IpKVxyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICAvLyBpZiBjaGFuZ2VzIGluIHRoZSBzdHVkaW8gY2F1c2UgYSByZWxvYWQsIHNob3cgdGhlIG1lc3NhZ2Vib3ggb25seSBpZiB0aGUgdXNlciB0cmllZCB0b1xyXG4gICAgLy8gY29udGludWUgd29ya2luZyB3aXRoIGFuIG9sZCBjb250ZXh0XHJcbiAgICBpZigoKDxTZXJ2ZXJFcnJvcj5leCkuR2V0Q29kZSgpID09IFNlcnZlckVycm9yLkVSUl9FWEVDVVRFRF9QUk9HUkFNX0NIQU5HRUQgfHxcclxuICAgICAgICg8U2VydmVyRXJyb3I+ZXgpLkdldENvZGUoKSA9PSBTZXJ2ZXJFcnJvci5FUlJfV0VCQ0xJRU5UX1BST0dSQU1fUkVMT0FERUQpICYmXHJcbiAgICAgICAgUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLkNvbnRleHRJRCA9PT0gUnVudGltZUNvbnRleHRCYXNlLm5vQ29udGV4dElkKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBnZXRJc0luVmlld1JlZnJlc2goKTogYm9vbGVhbntcclxuICAgIHJldHVybiB0aGlzLmlzSW5WaWV3UmVmcmVzaDtcclxuICB9XHJcblxyXG4gIHNldElzSW5WaWV3UmVmcmVzaChpblZpZXdSZWZyZXNoOiBib29sZWFuKTogdm9pZHtcclxuICAgIHRoaXMuaXNJblZpZXdSZWZyZXNoID0gaW5WaWV3UmVmcmVzaDtcclxuICB9XHJcbn1cclxuIl19
|
2988
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXZlbnRzTWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VuZ2luZS9zcmMvZXZlbnQvRXZlbnRzTWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFNBQVMsRUFDVCxpQkFBaUIsRUFDakIsTUFBTSxFQUNOLGdCQUFnQixFQUNoQixhQUFhLEVBQ2IsSUFBSSxFQUNKLFlBQVksRUFDWixRQUFRLEVBQ1IsT0FBTyxFQUNQLGdCQUFnQixFQUNoQixPQUFPLEVBQ1AsV0FBVyxFQUNaLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFDLG9CQUFvQixFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxpQkFBaUIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQzNJLE9BQU8sRUFDTCxRQUFRLEVBQ1IsV0FBVyxFQUNYLHFCQUFxQixFQUNyQixNQUFNLEVBQ04sWUFBWSxFQUNaLFlBQVksRUFDWixjQUFjLEVBRWQsWUFBWSxFQUVaLE9BQU8sRUFHUCxTQUFTLEVBQ1QsYUFBYSxFQUNiLGtCQUFrQixFQUNsQixNQUFNLEVBQ04sZ0JBQWdCLEVBQ2pCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUN0QyxPQUFPLEVBQUMsaUNBQWlDLEVBQUMsTUFBTSxpREFBaUQsQ0FBQztBQUNsRyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDM0MsT0FBTyxFQUFDLHVCQUF1QixFQUFDLE1BQU0saUNBQWlDLENBQUM7QUFHeEUsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRzVDLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQzFELE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNuQyxPQUFPLEVBQUMsd0JBQXdCLEVBQVcsTUFBTSxtQkFBbUIsQ0FBQztBQUNyRSxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDbEQsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRXZDLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBQzNELE9BQU8sRUFBQyw0QkFBNEIsRUFBQyxNQUFNLHNDQUFzQyxDQUFDO0FBQ2xGLE9BQU8sRUFBd0Isd0NBQXdDLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUV6RyxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sMkNBQTJDLENBQUM7QUFFekUsT0FBTyxFQUFDLHdCQUF3QixFQUFDLE1BQU0sNkJBQTZCLENBQUM7QUFFckUsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0saURBQWlELENBQUM7QUFDckYsT0FBTyxFQUFDLHVCQUF1QixFQUFDLE1BQU0sbUNBQW1DLENBQUM7QUFDMUUsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBRXBELE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBSTVELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRCxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUM3RCxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSw0Q0FBNEMsQ0FBQztBQUMvRSxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDbEQsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBQy9DLE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQzVELE9BQU8sRUFBQyxpQkFBaUIsRUFBaUIsTUFBTSxrQkFBa0IsQ0FBQztBQUNuRSxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDakQsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFFL0MsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFHN0QsSUFBSyxVQUdKO0FBSEQsV0FBSyxVQUFVO0lBQ2Isd0JBQVUsQ0FBQTtJQUNWLHlCQUFXLENBQUE7QUFDYixDQUFDLEVBSEksVUFBVSxLQUFWLFVBQVUsUUFHZDtBQUtELE1BQU0sT0FBTyxhQUFhO0lBRWhCLE1BQU0sQ0FBQyxTQUFTLEdBQVksSUFBSSxDQUFDO0lBQ2pDLE1BQU0sQ0FBQyxRQUFRLEdBQVcsSUFBSSxDQUFDO0lBQy9CLE1BQU0sQ0FBQyw2QkFBNkIsR0FBRyxJQUFJLENBQUM7SUFDNUMsWUFBWSxHQUE0QixJQUFJLENBQUM7SUFDN0MsVUFBVSxHQUEwQixJQUFJLENBQUM7SUFDekMsU0FBUyxHQUF3QixJQUFJLENBQUM7SUFDdEMsZ0JBQWdCLEdBQTBCLElBQUksQ0FBQztJQUMvQyxZQUFZLEdBQXNCLGlCQUFpQixDQUFDLEdBQUcsQ0FBQztJQUN4RCxlQUFlLEdBQXFCLElBQUksQ0FBQztJQUN6QyxTQUFTLEdBQWMsSUFBSSxDQUFDO0lBQzVCLFVBQVUsR0FBVSxJQUFJLENBQUM7SUFDekIsWUFBWSxHQUFpQixJQUFJLENBQUM7SUFDbEMsVUFBVSxHQUFZLEtBQUssQ0FBQztJQUM1QixXQUFXLEdBQWUsVUFBVSxDQUFDLElBQUksQ0FBQztJQUMxQyxVQUFVLEdBQWMsU0FBUyxDQUFDLElBQUksQ0FBQztJQUN2QyxjQUFjLEdBQVMsSUFBSSxDQUFDO0lBQzVCLG1CQUFtQixHQUFZLEtBQUssQ0FBQztJQUNyQyxZQUFZLEdBQVksS0FBSyxDQUFDO0lBQzlCLG9CQUFvQixHQUFZLEtBQUssQ0FBQztJQUN0QyxvQkFBb0IsR0FBWSxLQUFLLENBQUM7SUFDdEMscUJBQXFCLEdBQVksS0FBSyxDQUFDO0lBRXZDLE1BQU0sQ0FBQyx1QkFBdUIsR0FBRyxLQUFLLENBQUM7SUFDdkMsTUFBTSxDQUFDLG1DQUFtQyxHQUFHLEtBQUssQ0FBQztJQUNuRCxtQkFBbUIsR0FBaUIsSUFBSSxDQUFDO0lBSXpDLGNBQWMsR0FBWSxLQUFLLENBQUM7SUFDaEMseUJBQXlCLEdBQVksS0FBSyxDQUFDO0lBQzNDLGtCQUFrQixHQUFjLElBQUksQ0FBQztJQUV0QyxlQUFlLEdBQVEsSUFBSSxDQUFDO0lBRTFCLFFBQVEsR0FBaUIsSUFBSSxDQUFDO0lBQzlCLE1BQU0sR0FBaUIsSUFBSSxDQUFDO0lBRzVCLHFCQUFxQixHQUFXLHNHQUFzRyxDQUFDO0lBQ3ZJLHVCQUF1QixHQUFXLG9DQUFvQyxDQUFDO0lBRWhGLE1BQU0sQ0FBQyxRQUFRLEdBQWtCLElBQUksYUFBYSxFQUFFLENBQUM7SUFFN0MseUJBQXlCLEdBQWtCLElBQUksQ0FBQztJQUVoRCxjQUFjLEdBQVksS0FBSyxDQUFDO0lBQ2hDLGVBQWUsR0FBWSxLQUFLLENBQUM7SUFFekMsY0FBYyxHQUFvQixJQUFJLE9BQU8sRUFBRSxDQUFDO0lBRWhELE1BQU0sQ0FBQyxtQkFBbUIsR0FBRyxDQUFDLENBQUM7SUFJL0I7UUFDRSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7UUFFN0IsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLHVCQUF1QixFQUFFLENBQUM7UUFFbEQsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQzlCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksY0FBYyxFQUFFLENBQUMsQ0FBQztRQUUzQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUNwQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBR2pDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxZQUFZLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDakYsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUUvRSxDQUFDO0lBRUQsa0JBQWtCO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQztJQUM5QixDQUFDO0lBRUQsa0JBQWtCLENBQUMsUUFBYTtRQUM5QixJQUFJLENBQUMsZUFBZSxHQUFHLFFBQVEsQ0FBQztJQUNsQyxDQUFDO0lBTUQsU0FBUyxDQUFDLEtBQW1CO1FBRzNCLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLEVBQUU7WUFDeEIsSUFBSSxhQUFhLENBQUMsdUJBQXVCLEVBQUU7Z0JBQ3pDLGFBQWEsQ0FBQyxtQ0FBbUMsR0FBRyxJQUFJLENBQUM7YUFDMUQ7U0FDRjthQUFNO1lBR0wsSUFBSSxJQUFJLENBQUMsc0JBQXNCLEVBQUUsSUFBSSxJQUFJLEVBQUU7Z0JBQ3pDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUMsQ0FBQztnQkFDOUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ25DO1NBQ0Y7UUFFRCxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBZUQsZ0JBQWdCLENBQUMsTUFBa0IsRUFBRSxTQUF3QixFQUFFLFFBQW1CLEVBQUUsT0FBZSxFQUFFLEtBQWEsRUFBRSxHQUFXLEVBQUUsSUFBWSxFQUFFLFNBQWtCLEVBQUUsY0FBc0IsRUFBRSxJQUFZO1FBQ3JNLElBQUksS0FBSyxHQUFpQixDQUFDLFNBQVMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxZQUFZLENBQVksU0FBUyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxZQUFZLENBQU8sTUFBTSxDQUFDLE9BQU8sRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRXRKLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFeEIsSUFBSSxTQUFTLEdBQWlCLElBQUksWUFBWSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztRQUVsRSxJQUFJLFNBQVMsSUFBSSxDQUFDLFNBQVMsS0FBSyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztZQUNsRSxTQUFTLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRXJELEtBQUssQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFakMsSUFBSSxJQUFJLEtBQUssaUJBQWlCLENBQUMsbUJBQW1CLEVBQUU7WUFDbEQsS0FBSyxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ3RDOztZQUNDLEtBQUssQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUM7UUFFakMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QixPQUFPO0lBQ1QsQ0FBQztJQU1ELEtBQUssQ0FBQyxnQkFBZ0I7UUFDcEIsSUFBSSxPQUFPLEdBQWMsa0JBQWtCLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQVVwRSxJQUFJLE9BQU8sS0FBSyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsS0FBSyxTQUFTLENBQUMsa0JBQWtCLElBQUksQ0FBQyxNQUFNLE9BQU8sQ0FBQyxVQUFVLEVBQUU7WUFDOUgsTUFBTSxJQUFJLENBQUMseUJBQXlCLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUVELEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxLQUFZO1FBQzdDLE1BQU0sSUFBSSxDQUFDLHlCQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFNRCxLQUFLLENBQUMseUJBQXlCLENBQUMsS0FBWTtRQUMxQyxJQUFJLElBQUksR0FBZSxLQUFLLENBQUM7UUFFN0IsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssU0FBUyxDQUFDLGdCQUFnQixJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDdkUsTUFBTSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDekIsSUFBSSxPQUFPLEdBQVcsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDakQsTUFBTSxJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxFQUFFLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDbEYsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxFQUFFO2dCQUNoQyxJQUFJLE9BQU8sS0FBSyxTQUFTLENBQUMsZ0JBQWdCLEVBQUU7b0JBQzFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQ3RCLE1BQWlCLElBQUksQ0FBQyxRQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNyRCxNQUFNLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztvQkFDbEYsTUFBZSxJQUFJLENBQUMsT0FBTyxFQUFHLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO29CQUMvRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzdCLE1BQU0sWUFBWSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO29CQUNsRCxPQUFPO2lCQUNSO2FBQ0Y7U0FJRjtRQUdELElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLFNBQVMsQ0FBQyxrQkFBa0I7WUFDbEQsTUFBTSxJQUFJLENBQUMsb0NBQW9DLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLEVBQUUsaUJBQWlCLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUVsSCxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDN0IsU0FBUyxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDOUIsTUFBTSxZQUFZLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQU9ELEtBQUssQ0FBQyxXQUFXLENBQUMsS0FBbUIsRUFBRSxrQkFBMkI7UUFDaEUsSUFBSSxPQUFPLEdBQWlCLElBQUksQ0FBQztRQUNqQyxJQUFJLEdBQUcsR0FBeUIsSUFBSSxvQkFBb0IsRUFBRSxDQUFDO1FBQzNELElBQUksSUFBSSxHQUFlLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUN2QyxJQUFJLElBQUksR0FBeUIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDMUQsSUFBSSxhQUFhLEdBQVksS0FBSyxDQUFDO1FBQ25DLElBQUksWUFBWSxHQUFZLEtBQUssQ0FBQztRQUNsQyxJQUFJLFFBQVEsR0FBaUIsSUFBSSxDQUFDO1FBQ2xDLElBQUksWUFBWSxHQUFjLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNsRCxJQUFJLGdCQUFnQixHQUFTLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3JELElBQUksc0JBQXNCLEdBQVksSUFBSSxDQUFDLG9CQUFvQixDQUFDO1FBQ2hFLElBQUksa0JBQWtCLEdBQVksS0FBSyxDQUFDO1FBQ3hDLElBQUksZUFBMEIsQ0FBQztRQUMvQixJQUFJLGdCQUFnQixHQUFVLElBQUksQ0FBQztRQUluQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLGNBQWMsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBRTVELElBQUksS0FBSyxDQUFDLGFBQWEsR0FBRyxpQkFBaUIsQ0FBQyxjQUFjLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDO2dCQUNwSyxPQUFPO1NBQ1Y7YUFFRCxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDaEQsT0FBTztRQUVULGVBQWUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBRXRCLElBQUksU0FBUyxHQUFZLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxjQUFjLENBQUMsbUJBQW1CLElBQUksS0FBSyxDQUFDLGVBQWUsRUFBRSxHQUFHLElBQUksQ0FBQztRQUVsSCxJQUFJO1lBRUYsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUV4QixNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUlyQyxJQUFJLFNBQVMsR0FBWSxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUUvRCxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1lBQ25DLElBQUksQ0FBQyxVQUFVLEdBQVUsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBRTdDLElBQUksU0FBUyxFQUFFO2dCQUNiLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBRWhCLE9BQU8sR0FBRyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBRXhCLElBQUksT0FBTyxLQUFLLElBQUksSUFBSSxPQUFPLENBQUMsUUFBUSxFQUFFLEtBQUssSUFBSSxJQUFJLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxPQUFPLEtBQUssSUFBSTtvQkFDeEYsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFJaEUsT0FBTyxPQUFPLEtBQUssSUFBSSxFQUFFO29CQUN2QixJQUFJLGtCQUFrQixHQUFTLElBQUksQ0FBQztvQkFDcEMsSUFBSSxZQUFxQixDQUFDO29CQUMxQixJQUFJO3dCQUNGLElBQUksd0JBQXdCLEdBQVksS0FBSyxDQUFDO3dCQUc5QyxrQkFBa0IsR0FBUyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsY0FBYyxFQUFFLENBQUM7d0JBQzlELElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLGNBQWMsQ0FBQyxtQkFBbUIsSUFBSSxLQUFLLENBQUMsZUFBZSxFQUFFLElBQUksSUFBSSxJQUFJLEtBQUssQ0FBQyxlQUFlLEVBQUUsS0FBSyxpQkFBaUIsQ0FBQyxlQUFlOzRCQUM1SixPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDOzs0QkFFcEQsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQzt3QkFHcEQsSUFBSSxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsT0FBTyxFQUFFLEtBQUssY0FBYyxDQUFDLGVBQWUsSUFBSSxNQUFNLE9BQU8sQ0FBQyxTQUFTLEVBQUUsRUFBRTs0QkFDaEcsd0JBQXdCLEdBQUcsSUFBSSxDQUFDOzRCQUNoQyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsS0FBSyxDQUFDOzRCQUNsQyxrQkFBa0IsR0FBRyxJQUFJLENBQUM7NEJBRTFCLElBQUksTUFBTSxJQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxFQUFFLEtBQUssQ0FBQyxFQUFFO2dDQUMvRCxhQUFhLEdBQUcsSUFBSSxDQUFDOzZCQUN0Qjt5QkFDRjt3QkFJRCxJQUFJLEtBQUssS0FBSyxPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUU7NEJBS2hDLFFBQVEsR0FBRyxLQUFLLENBQUM7NEJBQ2pCLEtBQUssR0FBRyxJQUFJLFlBQVksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7NEJBQ3BELFlBQVksR0FBRyxJQUFJLENBQUM7NEJBSXBCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQzs0QkFDbEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQzt5QkFDekI7OzRCQUNDLFlBQVksR0FBRyxLQUFLLENBQUM7d0JBRXZCLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLGNBQWMsQ0FBQyxtQkFBbUIsSUFBSSxLQUFLLENBQUMsZUFBZSxFQUFFLEtBQUssaUJBQWlCLENBQUMsaUJBQWlCOzRCQUMzSCxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBRTFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDakMsSUFBSSxjQUFjLEdBQVksTUFBTSxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxrQkFBa0IsRUFBRSx3QkFBd0IsQ0FBQyxDQUFDO3dCQUN6RyxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxjQUFjLENBQUMsbUJBQW1CLElBQUksS0FBSyxDQUFDLGVBQWUsRUFBRSxLQUFLLGlCQUFpQixDQUFDLGlCQUFpQjs0QkFDM0gsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUMzQyxTQUFTLEdBQUcsY0FBYyxDQUFDLFNBQVMsQ0FBQzt3QkFDckMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLElBQUksWUFBWSxFQUFFOzRCQUMzQyxLQUFLLEdBQUcsUUFBUSxDQUFDOzRCQUNqQixRQUFRLEdBQUcsSUFBSSxDQUFDOzRCQUNoQixZQUFZLEdBQUcsS0FBSyxDQUFDOzRCQUdyQixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7NEJBQ2xCLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7eUJBQ3pCO3dCQVVELElBQUksS0FBSyxDQUFDLGVBQWUsRUFBRSxLQUFLLGlCQUFpQixDQUFDLGtCQUFrQixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUU7NEJBQ2pILFlBQVksR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQzs0QkFDdEQsSUFBSSxZQUFZO2dDQUNkLE1BQU07eUJBQ1Q7d0JBRUQsSUFBSSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsRUFBRTs0QkFDL0IsSUFBSSxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUM7Z0NBQ3ZDLE1BQU07eUJBQ1Q7cUJBQ0Y7NEJBQVM7d0JBRVIsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO3FCQUN0RDtvQkFFRCxJQUFJLENBQUMsU0FBUzt3QkFDWixNQUFNO29CQUVSLElBQUksWUFBWTt3QkFDZCxPQUFPLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQzs7d0JBRzdCLE9BQU8sR0FBRyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQzFCLElBQUksT0FBTyxLQUFLLElBQUk7d0JBQ2xCLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxvQkFBb0IsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztpQkFDakk7Z0JBQ0QsSUFBSSxTQUFTLElBQUksQ0FBQyxZQUFZO29CQUM1QixNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDbkM7WUFDRCxJQUFJLENBQUMsWUFBWSxFQUFFO2dCQUNqQixNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7YUFDakQ7WUFDRCxJQUFJLGFBQWEsSUFBSSxJQUFJLENBQUMsb0JBQW9CLEVBQUU7Z0JBQzlDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxLQUFLLENBQUM7Z0JBQ2xDLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ3hDO1lBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztZQUNsRCxJQUFJLGtCQUFrQjtnQkFDcEIsSUFBSSxDQUFDLG9CQUFvQixHQUFHLHNCQUFzQixDQUFDO1NBQ3REO2dCQUFTO1lBQ1IsSUFBSSxDQUFDLFNBQVMsR0FBRyxlQUFlLENBQUM7WUFDakMsSUFBSSxDQUFDLFVBQVUsR0FBRyxnQkFBZ0IsQ0FBQztZQUNuQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7U0FFbkI7UUFHRCxVQUFVLENBQUMsUUFBUSxDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFDNUMsQ0FBQztJQVlPLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxJQUFtQixFQUFFLEdBQVEsRUFBRSxJQUFZLEVBQUUsWUFBcUI7UUFDaEcsSUFBSSxTQUFTLEdBQXlCLElBQUksQ0FBQztRQUMzQyxJQUFJLFFBQVEsR0FBZSxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDekQsSUFBSSxlQUFlLEdBQVksUUFBUSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBYzFELElBQUksU0FBUyxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsZ0JBQWdCLEVBQUU7WUFDckQsSUFBSSxNQUFNLEdBQWlCLElBQUksWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3ZELElBQUksT0FBTyxHQUFxQixDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztZQUM1RyxJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUUsS0FBSyxjQUFjLENBQUMsbUJBQW1CLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxLQUFLLGlCQUFpQixDQUFDLGFBQWEsSUFBSSxNQUFNLENBQUMsYUFBYSxLQUFLLGlCQUFpQixDQUFDLGNBQWMsQ0FBQyxFQUFFO2dCQUN0TCxJQUFJLE9BQU8sS0FBSyxPQUFPLENBQUMsV0FBVztvQkFDakMsUUFBUSxHQUFHLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO2dCQUM5RCxlQUFlLEdBQUcsUUFBUSxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUM3QyxRQUFRLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDbkM7WUFFRCxJQUFJLE9BQU8sS0FBSyxPQUFPLENBQUMsV0FBVztnQkFDakMsU0FBUyxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO1NBQzVFO1FBR0QsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRTdELFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUU3QyxJQUFJLElBQUksQ0FBQyxjQUFjO1lBQ3JCLE9BQU87UUFPVCxJQUFJLGlCQUFpQixHQUFZLE1BQU0sU0FBUyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQzlELElBQUksU0FBUyxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsZ0JBQWdCLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLEtBQUssSUFBSSxJQUFJLGlCQUFpQixDQUFDLEVBQUU7WUFLN0csSUFBSSxTQUFTLENBQUMsSUFBSSxLQUFLLGFBQWEsQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDLGlCQUFpQixFQUFFO2dCQUMzRSxJQUFJLFdBQVcsR0FBZSxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQzVELElBQUksV0FBVyxDQUFDLFNBQVMsRUFBRTtvQkFDekIsUUFBUSxHQUFHLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO29CQUU1RCxJQUFJLFdBQVcsS0FBSyxRQUFRLElBQUksV0FBVyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsRUFBRTt3QkFFbEUsSUFBSSxXQUFXLENBQUMsUUFBUSxFQUFFLEtBQUssU0FBUyxDQUFDLGVBQWUsRUFBRTs0QkFDeEQsTUFBTSxJQUFJLENBQUMsMkJBQTJCLENBQUMsV0FBVyxFQUFFLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLENBQUM7eUJBQzFGO3dCQUNELE1BQU0sSUFBSSxDQUFDLHlCQUF5QixDQUFDLFdBQVcsQ0FBQyxDQUFDO3FCQUNuRDtpQkFDRjthQUNGO1lBSUQsSUFBSSxLQUFLLEdBQWlCLElBQUksWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3RELGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsR0FBRyxTQUFTLENBQUM7WUFDM0QsS0FBSyxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUNyRCxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3JDLElBQUksSUFBSSxDQUFDLGNBQWM7Z0JBQ3JCLE9BQU87U0FDVjtRQUdELElBQUksU0FBUyxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsZ0JBQWdCO1lBRW5ELE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBRW5ELElBQUksSUFBSSxDQUFDLGNBQWM7WUFDckIsT0FBTztRQUVULE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFLRCxLQUFLLENBQUMsMkJBQTJCLENBQUMsS0FBWSxFQUFFLFNBQWlCO1FBQy9ELE1BQU0sSUFBSSxDQUFDLDRDQUE0QyxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbkYsQ0FBQztJQVFELEtBQUssQ0FBQyw0Q0FBNEMsQ0FBQyxLQUFZLEVBQUUsU0FBaUIsRUFBRSxjQUF1QjtRQUN6RyxJQUFJLElBQUksR0FBZSxLQUFLLENBQUM7UUFPN0IsSUFBSSxTQUFTLEtBQUssaUJBQWlCLENBQUMsaUJBQWlCLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsZUFBZSxLQUFLLHdCQUF3QixDQUFDLFVBQVUsRUFFdkk7WUFDRSxJQUFJLENBQUMsZUFBZSxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyx3QkFBd0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLHdCQUF3QixDQUFDLFNBQVMsQ0FBQyxDQUFDO1NBQ2pIO1FBR0QsSUFBSSxjQUFjO1lBQ2hCLE1BQU0sSUFBSSxDQUFDLDJCQUEyQixDQUFDLEtBQUssRUFBRSxpQkFBaUIsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1FBRWpHLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQUUsRUFBRTtZQUNuQyxJQUFJLFNBQVMsS0FBSyxpQkFBaUIsQ0FBQyxpQkFBaUIsSUFBSSxTQUFTLEtBQUssaUJBQWlCLENBQUMsaUJBQWlCLEVBQUU7Z0JBQzFHLElBQUksU0FBUyxLQUFLLGlCQUFpQixDQUFDLGlCQUFpQjtvQkFDbkQsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsY0FBYyxDQUFDLENBQUM7O29CQUU3QyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztnQkFFNUIsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssSUFBSSxFQUFFO29CQUMzQixJQUFJLFNBQVMsS0FBSyxpQkFBaUIsQ0FBQyxpQkFBaUI7d0JBQ25ELE1BQWUsSUFBSSxDQUFDLE9BQU8sRUFBRyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMscUJBQXFCLENBQUMsQ0FBQztvQkFDakYsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDO2lCQUM1QjthQUNGOztnQkFDQyxNQUFNLElBQUksQ0FBQywwQ0FBMEMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUMvRjs7WUFDQyxNQUFNLElBQUksQ0FBQywwQ0FBMEMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNoRyxDQUFDO0lBT0QsS0FBSyxDQUFDLG9DQUFvQyxDQUFDLElBQW1CLEVBQUUsU0FBaUI7UUFDL0UsTUFBTSxJQUFJLENBQUMsZ0NBQWdDLENBQVksSUFBSSxFQUFFLFNBQVMsRUFBRSxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDL0YsQ0FBQztJQUtELG9CQUFvQjtRQUNsQixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUM7SUFDN0IsQ0FBQztJQUtPLG9CQUFvQjtRQUMxQixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztJQUNqQyxDQUFDO0lBT0QsSUFBSTtRQUNGLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNyQixJQUFJLENBQUMsb0JBQW9CLEdBQUcsS0FBSyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQztZQUNqQyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztZQUMzQixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztZQUN2QixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3pCO1FBQ0QsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7SUFDM0IsQ0FBQztJQU9ELGdDQUFnQyxDQUFDLEtBQVksRUFBRSxJQUFZO1FBQ3pELElBQUksQ0FBQyxpREFBaUQsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQU9ELCtCQUErQixDQUFDLElBQW1CLEVBQUUsSUFBWTtRQUMvRCxJQUFJLEtBQUssR0FBaUIsSUFBSSxZQUFZLENBQVksSUFBSSxDQUFDLENBQUM7UUFDNUQsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4QixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hCLENBQUM7SUFPRCw2Q0FBNkMsQ0FBQyxJQUFtQixFQUFFLFdBQW1CLEVBQUUsSUFBWTtRQUNsRyxJQUFJLEtBQUssR0FBaUIsSUFBSSxZQUFZLENBQVksSUFBSSxFQUFFLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNoRixLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQVFELDBDQUEwQyxDQUFDLElBQW1CLEVBQUUsSUFBWSxFQUFFLFFBQWtCO1FBQzlGLElBQUksS0FBSyxHQUFpQixJQUFJLFlBQVksQ0FBWSxJQUFJLENBQUMsQ0FBQztRQUM1RCxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hCLEtBQUssQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBUUQsaURBQWlELENBQUMsS0FBWSxFQUFFLElBQVk7UUFDMUUsSUFBSSxJQUFJLEdBQWUsS0FBSyxDQUFDO1FBQzdCLElBQUksS0FBSyxHQUFpQixJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqRCxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQVNELHFEQUFxRCxDQUFDLElBQW1CLEVBQUUsSUFBWSxFQUFFLElBQVk7UUFDbkcsSUFBSSxLQUFLLEdBQWlCLElBQUksWUFBWSxDQUFZLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDekUsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4QixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hCLENBQUM7SUFRRCwwQ0FBMEMsQ0FBQyxJQUFVLEVBQUUsSUFBWSxFQUFFLElBQVk7UUFDL0UsSUFBSSxHQUFHLEdBQVMsSUFBSSxDQUFDO1FBQ3JCLElBQUksSUFBSSxLQUFLLElBQUk7WUFDZixHQUFHLEdBQVMsSUFBSSxDQUFDO1FBRW5CLElBQUksS0FBSyxHQUFpQixJQUFJLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoRCxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hCLEtBQUssQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQU1ELG1CQUFtQixDQUFDLFVBQXlCLEVBQUUsU0FBaUIsRUFBRSxZQUFvQjtRQUNwRixJQUFJLEtBQUssR0FBaUIsSUFBSSxZQUFZLENBQVksVUFBVSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNoRixLQUFLLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFHdEQsSUFBSSxRQUFRLEdBQUcsSUFBSSxLQUFLLEVBQVUsQ0FBQztRQUNuQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQztRQUN4RSxJQUFJLElBQUksR0FBRyxJQUFJLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN2QyxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXZCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQUVELGFBQWEsQ0FBQyxJQUFXLEVBQUUsSUFBWSxFQUFFLFVBQWtCLEVBQUUsZ0JBQXdCLEVBQUUsV0FBc0I7UUFDM0csSUFBSSxLQUFLLEdBQWlCLElBQUksWUFBWSxDQUFPLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM3RCxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXhCLElBQUksUUFBUSxHQUFhLElBQUksS0FBSyxDQUFTLENBQUMsQ0FBQyxDQUFDO1FBQzlDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ3BFLElBQUksZ0JBQWdCLEtBQUssSUFBSTtZQUMzQixnQkFBZ0IsR0FBRyxFQUFFLENBQUM7UUFDeEIsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksTUFBTSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztRQUUxRSxJQUFJLElBQUksR0FBRyxJQUFJLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN2QyxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZCLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUVyQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxJQUFVO1FBQzdCLElBQUksY0FBYyxHQUFpQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDbkYsSUFBSSxLQUFLLEdBQUcsSUFBSSxZQUFZLENBQVcsY0FBYyxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2pGLEtBQUssQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUUxRCxJQUFJLFFBQVEsR0FBYSxJQUFJLEtBQUssQ0FBUyxDQUFDLENBQUMsQ0FBQztRQUM5QyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxjQUFjLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUVsRixJQUFJLElBQUksR0FBRyxJQUFJLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN2QyxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZCLGFBQWEsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFLRCxzQkFBc0IsQ0FBQyxPQUFhLEVBQUUsSUFBbUI7UUFDdkQsSUFBSSxLQUFLLEdBQUcsSUFBSSxZQUFZLENBQVcsa0JBQWtCLENBQUMsUUFBUSxDQUFDLGtCQUFrQixFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDL0YsS0FBSyxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBRTVELElBQUksT0FBTyxJQUFJLElBQUksRUFBRTtZQUNuQixLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3ZCLElBQUksSUFBSSxJQUFJLElBQUksRUFBRTtnQkFDaEIsS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUN4QjtZQUNELElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNwQztJQUNILENBQUM7SUFRRCxxQkFBcUIsQ0FBQyxJQUFlLEVBQUUsS0FBVSxFQUFFLGNBQXVCO1FBQ3hFLElBQUksS0FBSyxHQUFpQixJQUFJLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzFELEtBQUssQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMseUJBQXlCLENBQUMsQ0FBQztRQUMvRCxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXRCLElBQUksUUFBUSxHQUFhLElBQUksS0FBSyxDQUFTLENBQUMsQ0FBQyxDQUFDO1FBQzlDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0RixJQUFJLElBQUksR0FBRyxJQUFJLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN2QyxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXZCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQVFELDBDQUEwQyxDQUFDLElBQW1CLEVBQUUsSUFBWSxFQUFFLElBQVk7UUFDeEYsSUFBSSxLQUFLLEdBQWlCLElBQUksWUFBWSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDN0QsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4QixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hCLENBQUM7SUFRRCwyREFBMkQsQ0FBQyxJQUFtQixFQUFFLElBQVksRUFBRSxJQUFZLEVBQUUsY0FBdUI7UUFDbEksSUFBSSxLQUFLLEdBQWlCLElBQUksWUFBWSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDN0QsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4QixLQUFLLENBQUMsZUFBZSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQVFELDBDQUEwQyxDQUFDLElBQW1CLEVBQUUsSUFBWSxFQUFFLElBQXlCO1FBQ3JHLElBQUksS0FBSyxHQUFpQixJQUFJLFlBQVksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzdELEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBS0QsbUNBQW1DLENBQUMsSUFBVyxFQUFFLElBQVk7UUFDM0QsSUFBSSxLQUFLLEdBQWlCLElBQUksWUFBWSxDQUFPLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM3RCxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQU1ELDBDQUEwQyxDQUFDLElBQVcsRUFBRSxJQUFZO1FBQ2xFLElBQUksQ0FBQyxtQ0FBbUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUtPLFFBQVE7UUFDZCxPQUFxQixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2hELENBQUM7SUFFRCxZQUFZO1FBQ1YsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3pCLENBQUM7SUFFTyxZQUFZLENBQUMsU0FBb0IsRUFBRSxJQUFVO1FBQ25ELElBQUksQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDO1FBQzVCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRU8sZ0JBQWdCO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUM3QixDQUFDO0lBRU8sZ0JBQWdCLENBQUMsSUFBVTtRQUNqQyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztJQUM3QixDQUFDO0lBTUQsMEJBQTBCLENBQUMsSUFBYztRQUN2QyxPQUFPLElBQUksQ0FBQyxvQkFBb0IsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLEtBQUssU0FBUyxDQUFDLGVBQWUsSUFBSSxJQUFJLEtBQUssSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDNUgsQ0FBQztJQUtELEtBQUssQ0FBQyxtQ0FBbUM7UUFDdkMsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFHN0MsSUFBSSwwQkFBMEIsR0FDNUIsV0FBVyxDQUFDLFFBQVEsQ0FBQyxpQ0FBaUMsRUFBRSxHQUFHLEdBQUcsQ0FBQztRQUVqRSxhQUFhLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxDQUFDO1FBQzdDLE9BQU8sYUFBYSxDQUFDLHVCQUF1QixFQUFFO1lBQzVDLE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN6QixJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMscUJBQXFCLEVBQUUsR0FBRyxTQUFTLENBQUM7WUFDMUQsSUFBSSxhQUFhLENBQUMsbUNBQW1DLElBQUksVUFBVSxJQUFJLDBCQUEwQixFQUFFO2dCQUNqRyxhQUFhLENBQUMsdUJBQXVCLEdBQUcsS0FBSyxDQUFDO2FBQy9DO1NBQ0Y7SUFDSCxDQUFDO0lBT0QsS0FBSyxDQUFDLG1CQUFtQixDQUFDLElBQWE7UUFDckMsSUFBSSxXQUFXLEdBQUcsS0FBSyxDQUFDO1FBSXhCLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsV0FBVyxFQUFFLEtBQUssUUFBUSxDQUFDLE1BQU07WUFDM0YsSUFBSSxHQUFHLEtBQUssQ0FBQztRQUVmLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDL0IsSUFBSSxJQUFJLEVBQUU7Z0JBR1IsSUFBSSxJQUFJLENBQUMscUJBQXFCLEVBQUUsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLEdBQUcsSUFBSSxFQUFFO29CQUM3RCxXQUFXLEdBQUcsSUFBSSxDQUFDO29CQUNuQixhQUFhLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7aUJBQ2xFO2FBQ0Y7O2dCQUNDLFdBQVcsR0FBRyxJQUFJLENBQUM7WUFFckIsSUFBSSxXQUFXLEVBQUU7Z0JBQ2YsUUFBUSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDOUIsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUV2QixNQUFNLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBRXZCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO2dCQUUzQixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRTtvQkFFeEIsSUFBSSxtQkFBbUIsR0FBRyxJQUFJLENBQUMscUJBQXFCLEVBQUUsR0FBRyxhQUFhLENBQUMsbUJBQW1CLENBQUM7b0JBQzNGLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7b0JBQzlDLGFBQWEsQ0FBQyxtQkFBbUIsR0FBRyxDQUFDLENBQUM7aUJBQ3ZDO2FBQ0Y7U0FDRjtJQUNILENBQUM7SUFPRCxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQWM7UUFDN0IsSUFBSSxnQkFBZ0IsR0FBc0IsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBRWhFLElBQUksQ0FBQyxjQUFjLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFM0MsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFFekIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUU7WUFFekIsTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFdEMsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3pDLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFFbkMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVO2dCQUNwQixNQUFNLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1NBRWpDO1FBRUQsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFPRCxLQUFLLENBQUMsd0JBQXdCLENBQUMsTUFBYyxFQUFFLFFBQWtCO1FBQy9ELElBQUksSUFBSSxHQUFlLFFBQVEsQ0FBQztRQUNoQyxJQUFJLGdCQUFnQixHQUFzQixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFFaEUsSUFBSSxDQUFDLDRCQUE0QixDQUFDLE1BQU0sSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUM7UUFFOUQsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFFekIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUU7WUFDekIsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssU0FBUyxDQUFDLGdCQUFnQjtnQkFDL0MsTUFBTSxJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxFQUFFLGlCQUFpQixDQUFDLDRCQUE0QixDQUFDLENBQUM7O2dCQUU3RixNQUFNLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLENBQUMscUJBQXFCLENBQUMsQ0FBQztZQUV4RixNQUFNLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7WUFHdkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLElBQUksTUFBTSxJQUFJLENBQUMsYUFBYSxFQUFFO2dCQUNsRCxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ3RDO1FBRUQsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFJRCxLQUFLLENBQUMsWUFBWSxDQUFDLHVCQUE0QixFQUFFLHdCQUE2QjtRQUM1RSxJQUFJLENBQUMsdUJBQXVCLEtBQUssSUFBSSxJQUFJLHVCQUF1QixZQUFZLE1BQU0sQ0FBQyxJQUFJLENBQUMsd0JBQXdCLEtBQUssSUFBSSxJQUFJLHdCQUF3QixDQUFDLFdBQVcsS0FBSyxNQUFNLENBQUMsRUFBRTtZQUM3SyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsdUJBQXVCLEVBQUUsd0JBQXdCLENBQUMsQ0FBQztZQUM3RSxPQUFPO1NBQ1I7UUFDRCxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsdUJBQXVCLEVBQUUsd0JBQXdCLENBQUMsQ0FBQztJQUMvRSxDQUFDO0lBT08sS0FBSyxDQUFDLGNBQWMsQ0FBQyxVQUFrQixFQUFFLGlCQUF5QjtRQUN4RSxJQUFJLElBQUksR0FBUyxJQUFJLENBQUM7UUFDdEIsSUFBSSxLQUFLLEdBQVcsQ0FBQyxDQUFDO1FBQ3RCLElBQUksZUFBZSxHQUFXLENBQUMsQ0FBQztRQUVoQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFHN0IsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxJQUFJLENBQUMsaUJBQWlCLEtBQUssQ0FBQyxJQUFJLGVBQWUsR0FBRyxpQkFBaUIsQ0FBQyxFQUFFO1lBQy9ILElBQUksS0FBSyxHQUFpQixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDMUMsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsRUFBRSxFQUFFO2dCQUNqRCxLQUFLLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO2dCQUV6QixJQUFJLG9CQUFvQixHQUFZLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDN0UsSUFBSSxvQkFBb0IsSUFBSSxLQUFLLENBQUMsZUFBZSxFQUFFLEtBQUssaUJBQWlCLENBQUMsWUFBWSxFQUV0RjtvQkFDRSxTQUFTO2lCQUNWO2dCQUtELElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxvQkFBb0IsSUFBSSxLQUFLLENBQUMsZUFBZSxFQUFFLEtBQUssaUJBQWlCLENBQUMsb0JBQW9CLElBQUksS0FBSyxDQUFDLGVBQWUsRUFBRSxLQUFLLGlCQUFpQixDQUFDLHFCQUFxQixJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUMsVUFBVSxFQUFFO29CQUNyUSxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztpQkFDM0U7YUFDRjtZQUNELElBQUksT0FBTyxHQUFXLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNoRSxJQUFJLE9BQU8sS0FBSyxJQUFJLEVBQUU7Z0JBQ3BCLE9BQU8sT0FBTyxLQUFLLElBQUksSUFBSSxPQUFPLENBQUMsVUFBVSxFQUFFO29CQUM3QyxPQUFPLEdBQUcsT0FBTyxDQUFDLGVBQWUsRUFBRSxDQUFDO29CQUNwQyxJQUFJLE9BQU8sS0FBSyxJQUFJO3dCQUNsQixnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsU0FBUyxHQUFHLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7aUJBQ3pGO2FBQ0Y7aUJBQU07Z0JBU0wsSUFBSSxHQUFTLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDN0IsT0FBTyxPQUFPLEtBQUssSUFBSSxJQUFJLElBQUksS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxLQUFLLElBQUksRUFBRTtvQkFDckUsSUFBSSxHQUFTLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztvQkFDOUIsT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztvQkFDM0IsSUFBSSxPQUFPLENBQUMsVUFBVTt3QkFDcEIsT0FBTyxHQUFHLElBQUksQ0FBQztvQkFFakIsSUFBSSxPQUFPLEtBQUssSUFBSTt3QkFDbEIsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLFNBQVMsR0FBRyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2lCQUN6RjthQUNGO1lBQ0QsSUFBSSxPQUFPLEtBQUssSUFBSTtnQkFDbEIsTUFBTTtZQUVSLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLElBQUksRUFBRTtnQkFDNUIsSUFBSSxHQUFHLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO2dCQUN4RCxPQUFPLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQztvQkFDM0QsSUFBSSxHQUFTLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFFaEMsSUFBSSxJQUFJLEtBQUssSUFBSSxFQUFFO29CQUNqQixLQUFLLENBQUMsT0FBTyxDQUFZLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUM7b0JBQ25ELEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQ3JCO2FBQ0Y7O2dCQUNDLElBQUksR0FBUyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7WUFFL0IsSUFBSSxJQUFJLEtBQUssSUFBSSxFQUFFO2dCQUNqQixNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO2FBQ3RDO1lBRUQsVUFBVSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQzFDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1lBRXRCLElBQUksSUFBSSxLQUFLLElBQUk7Z0JBQ2YsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsZUFBZSxFQUFFLENBQUM7aUJBQzVDO2dCQUVILE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLGVBQWUsRUFBRSxDQUFDO2FBQ2hEO1lBRUQsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsRUFBRSxFQUFFO2dCQUVqRCxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUU7b0JBQ2IsS0FBSyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxHQUFHLEtBQUssQ0FBQztpQkFDOUM7YUFDRjtZQUdELElBQUksaUJBQWlCLEdBQUcsQ0FBQyxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLGNBQWMsQ0FBQyxtQkFBbUIsSUFBSSxLQUFLLENBQUMsYUFBYSxHQUFHLGlCQUFpQixDQUFDLGNBQWM7Z0JBQzdKLGVBQWUsRUFBRSxDQUFDO1NBQ3JCO0lBQ0gsQ0FBQztJQVFPLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxLQUFtQjtRQUNuRCxJQUFJLElBQUksR0FBWSxLQUFLLENBQUM7UUFFMUIsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtZQUM5QixPQUFPLElBQUksQ0FBQztRQUVkLElBQUksSUFBSSxHQUFlLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUN2QyxJQUFJLFFBQVEsR0FBeUIsS0FBSyxDQUFDLE9BQU8sQ0FBQztRQUNuRCxJQUFJLGNBQWMsR0FBYyxrQkFBa0IsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQzNFLElBQUksdUJBQXVCLEdBQVksS0FBSyxDQUFDO1FBQzdDLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLGNBQWMsQ0FBQyxtQkFBbUIsRUFBRTtZQUMxRCxRQUFRLEtBQUssQ0FBQyxlQUFlLEVBQUUsRUFBRTtnQkFDL0IsS0FBSyxpQkFBaUIsQ0FBQyxrQkFBa0I7b0JBQ3ZDLHVCQUF1QixHQUFHLElBQUksQ0FBQztvQkFDL0IsTUFBTTtnQkFFUixLQUFLLGlCQUFpQixDQUFDLGlCQUFpQjtvQkFHdEMsdUJBQXVCLEdBQUcsSUFBSSxDQUFDO29CQUMvQixNQUFNO2dCQUVSLEtBQUssaUJBQWlCLENBQUMsaUJBQWlCO29CQUV0QyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ2hDLElBQUksQ0FBQyxvQkFBb0IsQ0FBWSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDO29CQUMvRCxNQUFNO2dCQUVSLEtBQUssaUJBQWlCLENBQUMsa0JBQWtCO29CQUV2QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQzdCLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO29CQUUxQixJQUFJLGNBQWMsS0FBSyxJQUFJLEVBRTNCO3dCQUNFLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBR3hCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQzt3QkFDaEMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxDQUFDO3dCQUVwQyxNQUFNLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztxQkFDNUM7eUJBQU07d0JBSUwsSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQzt3QkFFN0MsTUFBTSxZQUFZLENBQUMsUUFBUSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO3FCQUNqRDtvQkFDRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzVCLE1BQU07Z0JBRVIsS0FBSyxpQkFBaUIsQ0FBQyxrQkFBa0I7b0JBRXZDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDbkMsTUFBTTthQUVUO1lBQ0QsSUFBSSx1QkFBdUIsRUFBRTtnQkFDM0IsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ3RDLElBQUksR0FBRyxJQUFJLENBQUM7YUFDYjtTQUNGO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBVU8sS0FBSyxDQUFDLHFCQUFxQixDQUFDLEdBQVUsRUFBRSxLQUFtQjtRQUNqRSxJQUFJLFNBQVMsR0FBYyxHQUFHLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQztRQUNqRCxJQUFJLFFBQVEsR0FBWSxLQUFLLENBQUM7UUFDOUIsSUFBSSxNQUFNLEdBQVcsQ0FBQyxDQUFDO1FBR3ZCLElBQUksU0FBUyxLQUFLLFNBQVMsQ0FBQyxJQUFJLElBQUksS0FBSyxDQUFDLFdBQVcsRUFBRTtZQUNyRCxPQUFPLEtBQUssQ0FBQztRQUNmLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUM7UUFDakMsSUFBSSxJQUFJLEdBQWUsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3ZDLElBQUksTUFBTSxHQUFzQixJQUFJLENBQUMsUUFBUyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQzVELElBQUksTUFBTSxLQUFLLElBQUksSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLEtBQUsscUJBQXFCLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUM3RixRQUFRLEdBQUcsSUFBSSxDQUFDO1lBQ2hCLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDekI7UUFDRCxJQUFJLFNBQVMsS0FBSyxTQUFTLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxTQUFTLENBQUMsa0JBQWtCLEVBQUU7WUFDdkYsSUFBSSxJQUFJLEdBQXlCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQzFELElBQUksSUFBSSxLQUFLLElBQUk7Z0JBQ2YsTUFBTSxJQUFJLENBQUMsb0NBQW9DLENBQUMsSUFBSSxFQUFFLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDLENBQUM7U0FDL0Y7UUFHRCxJQUFJLENBQUMsU0FBUyxLQUFLLFNBQVMsQ0FBQyxlQUFlLElBQUksU0FBUyxLQUFLLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxTQUFTLENBQUMsaUJBQWlCLEVBQUU7WUFDNUksTUFBTSxJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxFQUFFLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDbEYsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssU0FBUyxDQUFDLGdCQUFnQixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWM7Z0JBQ3ZFLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDM0MsSUFBSSxPQUFPLEdBQXNCLElBQUksQ0FBQyxRQUFTLENBQUMsVUFBVSxFQUFFLENBQUM7WUFFN0QsSUFBSSxPQUFPLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxjQUFjLElBQUksUUFBUSxJQUFJLE1BQU0sS0FBSyxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLFNBQVMsQ0FBQyxnQkFBZ0IsRUFBRTtnQkFFdEksT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUNwQixPQUFPLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQy9DO1NBQ0Y7UUFDRCxJQUFJLFNBQVMsS0FBSyxTQUFTLENBQUMsZ0JBQWdCLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ3BFLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLFNBQVMsQ0FBQyxlQUFlO2dCQUMvQyxNQUFNLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztTQUNyRjtRQUdELElBQUksU0FBUyxLQUFLLFNBQVMsQ0FBQyxPQUFPLEVBQUU7WUFDbkMsSUFBSSxPQUFPLEdBQXlCLEtBQUssQ0FBQyxPQUFPLENBQUM7WUFFbEQsSUFBSSxPQUFPLEtBQUssSUFBSSxJQUFJLE9BQU8sQ0FBQyxRQUFRLEVBQUUsS0FBSyxJQUFJLEVBQUU7Z0JBQ25ELElBQUksT0FBTyxHQUFXLE9BQU8sQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBRWxELE1BQU0sT0FBTyxDQUFDLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQzthQUNsRDtTQUNGO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBS08sS0FBSyxDQUFDLG9CQUFvQixDQUFDLEtBQW1CO1FBQ3BELElBQUksU0FBUyxHQUFjLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDO1FBRW5ELElBQUksSUFBSSxHQUFlLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUd2QyxJQUFJLFNBQVMsS0FBSyxTQUFTLENBQUMsZUFBZSxFQUFFO1lBQzNDLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDcEMsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRTtnQkFFckYsSUFBSSxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLG1CQUFtQixDQUFDO29CQUM1RCxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQzthQUMxQztTQUNGO1FBR0QsSUFBSSxTQUFTLEtBQUssU0FBUyxDQUFDLGdCQUFnQixFQUFFO1lBQzVDLElBQUksR0FBUyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDN0IsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssU0FBUyxDQUFDLGVBQWU7Z0JBQy9DLE1BQU0sSUFBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1NBQ3JGO1FBQ0QsSUFBSSxJQUFJLEdBQWMsa0JBQWtCLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUNqRSxJQUFJLElBQUksS0FBSyxJQUFJLElBQUksU0FBUyxLQUFLLFNBQVMsQ0FBQyxPQUFPLEVBQUU7WUFDcEQsTUFBTSxJQUFJLENBQUMsb0NBQW9DLENBQUMsSUFBSSxFQUFFLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDLENBQUM7U0FDN0Y7UUFHRCxJQUFJLFNBQVMsS0FBSyxTQUFTLENBQUMsT0FBTyxFQUFFO1lBQ25DLElBQUksT0FBTyxHQUF5QixLQUFLLENBQUMsT0FBTyxDQUFDO1lBRWxELElBQUksT0FBTyxLQUFLLElBQUksSUFBSSxPQUFPLENBQUMsUUFBUSxFQUFFLEtBQUssSUFBSTtnQkFDakQsTUFBYyxPQUFPLENBQUMsUUFBUSxFQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7U0FDckQ7SUFDSCxDQUFDO0lBUU8sS0FBSyxDQUFDLGNBQWMsQ0FBQyxXQUEwQixFQUFFLEtBQW1CO1FBQzFFLElBQUk7WUFDRixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3hCLEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxXQUFXLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3RELElBQUksT0FBTyxHQUFpQixXQUFXLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUV0RCxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxjQUFjLENBQUMscUJBQXFCLElBQUksT0FBTyxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxJQUFJLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsSUFBSSxPQUFPLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLEVBQUU7b0JBQy9LLE1BQU0sT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO2lCQUM1QzthQUNGO1NBQ0Y7Z0JBQVM7WUFDUixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7U0FDbkI7SUFDSCxDQUFDO0lBUU8sS0FBSyxDQUFDLGFBQWEsQ0FBQyxJQUFVLEVBQUUsSUFBZSxFQUFFLEdBQWlCO1FBQ3hFLElBQUksT0FBTyxHQUFpQixHQUFHLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDbEQsSUFBSSxPQUFPLEdBQVcsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQzNDLElBQUksQ0FBQyxZQUFZLEdBQUcsT0FBTyxDQUFDO1FBSTVCLElBQUksR0FBRyxDQUFDLHNCQUFzQixFQUFFO1lBQzlCLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDMUIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBRTlGLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsY0FBYztnQkFDNUMsT0FBTztTQUNWO1FBRUQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsMENBQTBDLEdBQUcsT0FBTyxDQUFDLENBQUM7UUFFcEYsSUFBSTtZQUdGLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDcEYsSUFBSSxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDLGVBQWUsQ0FBQztvQkFDOUcsT0FBTzthQUNWO1lBRUQsSUFBSSxLQUFLLEdBQWlCLElBQUksWUFBWSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztZQUN2RCxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNuQyxLQUFLLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLEdBQUcsQ0FBQyxlQUFlLEVBQUUsRUFBRSxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztZQUNuRixJQUFJO2dCQUNGLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7YUFDdEM7b0JBQVM7Z0JBQ1IsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO29CQUN2QixJQUFJLFlBQVksR0FBYyxTQUFTLENBQUMsWUFBWSxDQUFDO29CQUNyRCxJQUFJLFlBQVksS0FBSyxJQUFJLElBQUksU0FBUyxDQUFDLGlCQUFpQixFQUFFO3dCQUN4RCxZQUFZLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLENBQUM7aUJBQ3BFO2FBQ0Y7WUFDRCxJQUFJLEdBQUcsR0FBVyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFLENBQUM7WUFFNUQsSUFBSSxHQUFHLEtBQUssSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVU7Z0JBQ2pDLE1BQU0sSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7WUFDeEMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsd0NBQXdDLEdBQUcsT0FBTyxDQUFDLENBQUM7WUFFbEYsSUFBSSxJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxLQUFLLFNBQVMsQ0FBQyxZQUFZLEVBQUU7Z0JBQ3pFLE1BQWUsSUFBSSxDQUFDLE9BQU8sRUFBRyxDQUFDLGlCQUFpQixFQUFFLENBQUM7YUFDcEQ7U0FDRjtnQkFBUztTQUNUO0lBQ0gsQ0FBQztJQU1PLEtBQUssQ0FBQyxlQUFlLENBQUMsSUFBZSxFQUFFLElBQVksRUFBRSxHQUFRO1FBQ25FLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDLGtCQUFrQixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDLGVBQWUsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLGFBQWEsQ0FBQyxlQUFlLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsY0FBYyxFQUFFO1lBQzNPLElBQUksVUFBVSxHQUFZLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFDeEgsSUFBSSxjQUFjLEdBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLGlCQUFpQixFQUFFLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRTVHLElBQUksQ0FBQyxjQUFjLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ3JFLE1BQU0sSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO2lCQUMxQjtnQkFDSCxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUU7b0JBQ3hCLFFBQVEsQ0FBQyw0Q0FBNEMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBRWxHLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUFFO29CQUVqRCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztvQkFDM0IsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLGlCQUFpQixDQUFDLGdCQUFnQixDQUFDLENBQUM7aUJBQ3ZFO2dCQUVELElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtvQkFDeEIsUUFBUSxDQUFDLDRDQUE0QyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFLbkcsSUFBSSxDQUFDLElBQUksQ0FBQywwQkFBMEIsRUFBRTtvQkFDcEMsTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO2FBQzdDO1NBQ0Y7SUFDSCxDQUFDO0lBV08sS0FBSyxDQUFDLGFBQWEsQ0FBQyxJQUFlLEVBQUUsSUFBWSxFQUFFLFlBQXFCO1FBQzlFLElBQUksSUFBSSxLQUFLLElBQUk7WUFDZixPQUFPO1FBR1QsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLGFBQWEsQ0FBQyxlQUFlO1lBQzdDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUM7UUFDekQsSUFBSTtZQUNGLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsZUFBZSxFQUFFO2dCQUMvQyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLGlCQUFpQixFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRTtvQkFDOUUsT0FBTztpQkFDUjtnQkFDRCxJQUFJLFdBQVcsR0FBWSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDM0QsSUFBSSxTQUFTLEdBQVksSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7Z0JBRXZELElBQUksWUFBWSxHQUFjLFNBQVMsQ0FBQyxZQUFZLENBQUM7Z0JBRXJELElBQUksQ0FBQyxDQUFDLFdBQVcsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsSUFBSSxTQUFTLENBQUMsSUFBSSxZQUFZLEtBQUssSUFBSSxDQUFDLENBQUMsSUFBSSxZQUFZLEtBQUssSUFBSSxFQUFFO29CQUM1RyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsU0FBUyxHQUFVLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDMUYsSUFBSSxZQUFZLENBQUMsWUFBWTt3QkFDM0IsTUFBZSxZQUFZLENBQUMsT0FBTyxFQUFHLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztvQkFDN0QsTUFBTSxZQUFZLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUM5QyxZQUFZLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLENBQUM7aUJBQ2xFO2dCQUNELElBQUksSUFBSSxDQUFDLGNBQWMsSUFBSSxTQUFTO29CQUNsQyxPQUFPO2FBQ1Y7WUFFRCxJQUFJLFlBQVksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDLGdCQUFnQixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDLGtCQUFrQixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDLGNBQWMsQ0FBQyxFQUFFO2dCQUNsSyxJQUFJLEtBQUssR0FBaUIsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2pELEtBQUssQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDdEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUN2QjtTQUNGO2dCQUFTO1lBQ1Isa0JBQWtCLENBQUMsUUFBUSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQztTQUN4RDtJQUNILENBQUM7SUFNRCwwQ0FBMEMsQ0FBQyxNQUFXO1FBRXBELElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxJQUFJLGNBQWMsQ0FBQyxtQkFBbUIsSUFBSSxNQUFNLENBQUMsZUFBZSxFQUFFO1lBQ3BGLGlCQUFpQixDQUFDLHNCQUFzQixJQUFJLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyx3QkFBd0IsRUFBRTtZQUNsRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDckM7SUFDSCxDQUFDO0lBUU8sS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFlLEVBQUUsSUFBWSxFQUFFLE9BQWdCLEVBQUUsZ0JBQXlCO1FBQ2xHLElBQUk7WUFFRixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7Z0JBQ2pCLE9BQU87WUFLVCxJQUFJLElBQUksS0FBSyxJQUFJLENBQUMseUJBQXlCLElBQUksSUFBSSxDQUFDLHVCQUF1QixFQUFFLEVBQUU7Z0JBRTdFLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLEVBQUU7b0JBQy9ILE1BQU0sQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsb0hBQW9ILEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7b0JBRWpMLFlBQVksQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLGtCQUFrQixFQUFFLEVBQUUsa0JBQWtCLENBQUMscUJBQXFCLEVBQUUsRUFBRSxDQUFDLEVBQ25ILGtCQUFrQixDQUFDLHFCQUFxQixFQUFFLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUN0RSxJQUFJLENBQUMseUJBQXlCLEdBQUcsSUFBSSxDQUFDO29CQUN0QyxPQUFPO2lCQUNSO2FBQ0Y7WUFFRCxJQUFJLENBQUMseUJBQXlCLEdBQUcsSUFBSSxDQUFDO1lBRXRDLElBQUksT0FBTztnQkFDVCxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO1lBRXhELElBQUksUUFBUSxHQUFjLGtCQUFrQixDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDckUsSUFBSSxJQUFJLEtBQUssUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFO2dCQUM3QyxNQUFlLElBQUksQ0FBQyxPQUFPLEVBQUcsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2dCQUVuRCxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixDQUFDLENBQUM7Z0JBQzVELElBQUksTUFBTSxHQUFpQixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ2pELElBQUksTUFBTSxJQUFJLElBQUksSUFBSSxNQUFNLENBQUMsZ0JBQWdCO29CQUMzQyxZQUFZLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNsQyxPQUFPO2FBQ1I7WUFHRCxJQUFJLFFBQVEsR0FBZSxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUc1RSxJQUFJLElBQUksS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsZUFBZSxFQUFFO2dCQUNoRSxJQUFJLFFBQVEsS0FBSyxJQUFJO29CQUNuQixNQUFNLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztnQkFDakUsT0FBTzthQUNSO1lBRUQsSUFBSSxRQUFjLENBQUM7WUFDbkIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBSyxPQUFPLENBQUMsV0FBVyxDQUFDO2dCQUM3SixRQUFRLEdBQUcsUUFBUSxDQUFDOztnQkFFcEIsUUFBUSxHQUFTLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUU1QyxJQUFJLFdBQVcsR0FBWSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztZQUc5RCxJQUFJLFdBQVcsRUFBRTtnQkFFZixJQUFJLElBQUksQ0FBQyxlQUFlLElBQUksSUFBSTtvQkFDOUIsT0FBTztnQkFDVCxJQUFJLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUN6RSxJQUFJLE9BQU87b0JBQ1QsT0FBTztnQkFFVCxJQUFJLFNBQVMsR0FBVyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDO2dCQUN4RixJQUFJLEtBQUssR0FBaUIsSUFBSSxZQUFZLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO2dCQUM1RCxLQUFLLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDLENBQUM7Z0JBQ3hELE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7YUFDdEM7aUJBQU0sSUFBSSxRQUFRLEtBQUssSUFBSSxFQUFFO2dCQUM1QixJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxFQUFFO29CQUM1QixJQUFJLFFBQVEsQ0FBQyxlQUFlLEVBQUU7d0JBQzVCLE1BQU0sUUFBUSxDQUFDLGVBQWUsRUFBRSxDQUFDO2lCQUNwQztxQkFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsRUFBRSxFQUFFO29CQUN0QyxJQUFJLE1BQU0sR0FBVyxPQUFPLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUNsRCxJQUFJLENBQUMsTUFBTSxRQUFRLENBQUMsbUJBQW1CLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQzt3QkFDbkQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUMvQjtnQkFDRCxTQUFTLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQzthQUNuQzs7Z0JBQ0MsTUFBTSxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFFakUsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLElBQUksU0FBUyxDQUFDLFlBQVksS0FBSyxJQUFJLEVBQUM7Z0JBQzFELGtCQUFrQixDQUFDLHFCQUFxQixDQUFXLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDbkYsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO2FBQzdEO1lBRUQsT0FBTztTQUNSO2dCQUFTO1lBQ1IsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUNsRCxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUU7Z0JBQ3ZCO29CQUNFLElBQUksWUFBWSxHQUFjLFNBQVMsQ0FBQyxZQUFZLENBQUM7b0JBRXJELElBQUksWUFBWSxLQUFLLElBQUksRUFBRTt3QkFDekIsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLFNBQVMsR0FBVSxZQUFZLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7d0JBQzFGLE1BQU0sWUFBWSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDOUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxDQUFDO3FCQUNsRTtpQkFDRjthQUNGO1NBQ0Y7SUFDSCxDQUFDO0lBY08sS0FBSyxDQUFDLHFCQUFxQixDQUFDLElBQWUsRUFBRSxRQUFjLEVBQUUsUUFBYztRQUNqRixJQUFJLHNCQUFzQixHQUFHLEtBQUssQ0FBQztRQUtuQyxJQUFJLE1BQU0sR0FBRyxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDbEQsSUFBSSxPQUFPLEdBQVMsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDN0QsSUFBSSxRQUFRLElBQUksUUFBUSxJQUFJLFFBQVEsSUFBSSxPQUFPLEVBQXVCO1lBQ3BFLElBQUksT0FBTyxJQUFJLElBQUksSUFBSSxRQUFRLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxTQUFTLEVBQUU7Z0JBQy9ELElBQUksV0FBVyxHQUF5QixPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQzNFLElBQUksV0FBVyxDQUFDLE9BQU8sRUFBRTtvQkFDdkIsUUFBUSxHQUFHLE9BQU8sQ0FBQzthQUN0QjtTQUNGO1FBR0QsSUFBSSxRQUFRLElBQVUsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxJQUFJLFFBQVEsQ0FBQyxvQkFBb0IsRUFBRSxFQUFFO1lBRWpGLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxFQUFFO2dCQUN0QyxJQUFJLFdBQVcsR0FBeUIsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUM1RSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLG9CQUFvQixFQUFFO29CQUM1RCxXQUFXLEdBQUcsUUFBUSxDQUFDLHlCQUF5QixFQUFFLENBQUM7Z0JBQ3JELElBQUksV0FBVyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxXQUFXLENBQUMsSUFBSSxXQUFXLENBQUMsT0FBTyxFQUFFLEVBQUU7b0JBRXpFLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixDQUFZLFdBQVcsQ0FBQyxDQUFDO29CQUN2RCxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWM7d0JBQ3RCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO29CQUMvQyxzQkFBc0IsR0FBRyxJQUFJLENBQUM7aUJBQy9CO2FBQ0Y7U0FDRjtRQUVELE9BQU8sc0JBQXNCLENBQUM7SUFDaEMsQ0FBQztJQU9PLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxJQUFlO1FBQ3hELElBQUk7WUFDRixNQUFNLGFBQWEsQ0FBQyxRQUFRLENBQUMsb0NBQW9DLENBQUMsSUFBSSxFQUFFLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDLENBQUM7U0FDL0c7Z0JBQVM7WUFDUixJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ2xELElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtnQkFDdkI7b0JBQ0UsSUFBSSxZQUFZLEdBQWMsU0FBUyxDQUFDLFlBQVksQ0FBQztvQkFFckQsSUFBSSxZQUFZLEtBQUssSUFBSSxFQUFFO3dCQUN6QixnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsU0FBUyxHQUFVLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQzt3QkFDMUYsTUFBTSxZQUFZLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUM5QyxZQUFZLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLENBQUM7cUJBQ2xFO2lCQUNGO2FBQ0Y7U0FDRjtJQUNILENBQUM7SUFRTyxLQUFLLENBQUMsa0JBQWtCLENBQUMsSUFBZSxFQUFFLElBQVksRUFBRSxnQkFBeUI7UUFDckYsSUFBSSxnQkFBZ0IsRUFDcEI7WUFDRSxJQUFJLEtBQUssR0FBRyxJQUFJLFlBQVksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQy9DLEtBQUssQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDakQsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztTQUN0QztJQUNMLENBQUM7SUFTTyxjQUFjLENBQUMsSUFBZSxFQUFFLE9BQWdCO1FBRXRELElBQUksT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsaUJBQWlCLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsaUJBQWlCLENBQUM7WUFDN0csT0FBTyxLQUFLLENBQUM7UUFLZixJQUFJLFdBQVcsR0FBWSxJQUFJLENBQUM7UUFDaEMsSUFBSSxRQUFRLEdBQWUsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBRXBELElBQUksUUFBUSxHQUFTLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQ3RFLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksSUFBSSxRQUFRLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxJQUFJO1lBQ3RGLFFBQVEsQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUMzQixPQUFPLEtBQUssQ0FBQztRQUVmLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsZUFBZSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVk7WUFDbkUsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUV0QixPQUFPLFdBQVcsQ0FBQztJQUNyQixDQUFDO0lBTU8sS0FBSyxDQUFDLFdBQVcsQ0FBQyxHQUFpQjtRQUN6QyxHQUFHLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzdDLElBQUksR0FBRyxDQUFDLFdBQVcsRUFBRSxFQUFFO1lBQ3JCLE1BQU0sSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7WUFDdEMsTUFBTSxJQUFJLENBQUMsNEJBQTRCLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDOUM7YUFBTTtZQUNMLElBQUksR0FBRyxHQUFXLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDdEUsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1NBQ3REO0lBQ0gsQ0FBQztJQVFPLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxHQUFpQjtRQUMxRCxJQUFJLE9BQU8sR0FBVyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUNuRCxJQUFJLEdBQUcsR0FBVyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDNUMsSUFBSSxlQUFlLEdBQVcsdUJBQXVCLENBQUMsV0FBVyxFQUFFLENBQUMsa0JBQWtCLENBQUM7UUFDdkYsSUFBSSx3QkFBd0IsR0FBVyxXQUFXLENBQUMsUUFBUSxDQUFDLDJCQUEyQixFQUFFLEdBQUcsRUFBRSxDQUFDO1FBQy9GLElBQUksNEJBQTRCLEdBQVcsV0FBVyxDQUFDLFFBQVEsQ0FBQywrQkFBK0IsRUFBRSxHQUFHLEVBQUUsQ0FBQztRQUV2RyxJQUFJLFFBQVEsR0FBRyxDQUFDLE9BQU8sR0FBRyxlQUFlLENBQUMsR0FBRyxJQUFJLENBQUM7UUFHbEQsSUFBSSx3QkFBd0IsSUFBSSxDQUFDLElBQUksNEJBQTRCLElBQUksQ0FBQztZQUNwRSxPQUFPO1FBRVQsSUFBSSxhQUFhLENBQUMsNkJBQTZCLElBQUksUUFBUSxJQUFJLENBQUMsd0JBQXdCLEdBQUcsNEJBQTRCLENBQUMsRUFBRTtZQUd4SCxJQUFJLGdCQUFnQixHQUFXLE1BQU0sVUFBVSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLHVCQUF1QixFQUFFLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxNQUFNLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUMzSixJQUFJLGdCQUFnQixJQUFJLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRTtnQkFFaEQsSUFBSSxHQUFHLEdBQW1CLGNBQWMsQ0FBQyxxQ0FBcUMsRUFBRSxDQUFDO2dCQUNqRixHQUFHLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDMUIsTUFBTSx1QkFBdUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxPQUFPLENBQUMsd0NBQXdDLENBQUMsYUFBYSxDQUFDLENBQUM7YUFDN0c7aUJBQU07Z0JBQ0wsYUFBYSxDQUFDLDZCQUE2QixHQUFHLEtBQUssQ0FBQzthQUNyRDtTQUNGO0lBQ0gsQ0FBQztJQUtELEtBQUssQ0FBQyx3QkFBd0I7UUFDNUIsSUFBSSxLQUFLLEdBQWlCLElBQUksWUFBWSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLGtCQUFrQixDQUFDLHFCQUFxQixFQUFFLENBQUMsQ0FBQztRQUN6SSxLQUFLLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFCLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUN6QyxLQUFLLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3BFLElBQUksR0FBRyxHQUFXLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekQsSUFBSSxHQUFHLEtBQUssSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVU7Z0JBQ2pDLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDeEQ7SUFDSCxDQUFDO0lBT08sWUFBWSxDQUFDLElBQWUsRUFBRSxVQUFrQjtRQUM3QyxJQUFJLENBQUMsT0FBTyxFQUFHLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFXTyxLQUFLLENBQUMsb0JBQW9CLENBQUMsS0FBZ0IsRUFBRSxlQUF1QixFQUFFLE9BQWdCLEVBQUUsY0FBOEI7UUFDNUgsSUFBSSxJQUFJLEdBQW1CLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUMzQyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsZUFBZSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFNTyxLQUFLLENBQUMsdUJBQXVCLENBQUMsSUFBZTtRQUNuRCxJQUFJLElBQUksR0FBbUIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzFDLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDakMsQ0FBQztJQU9PLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxJQUFlO1FBQ3ZELElBQUksSUFBSSxHQUFtQixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDMUMsTUFBTSxJQUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztJQUMzQyxDQUFDO0lBT08sa0JBQWtCLENBQUMsR0FBaUIsRUFBRSxNQUFlO1FBQzNELEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztJQUMvRSxDQUFDO0lBT08sS0FBSyxDQUFDLGdCQUFnQixDQUFDLEdBQWlCO1FBQzlDLElBQUksSUFBSSxHQUFlLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNyQyxJQUFJLGVBQWUsR0FBeUIsa0JBQWtCLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFDO1FBQzNGLElBQUksSUFBSSxHQUFtQixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDMUMsSUFBSSxXQUFXLEdBQVcsR0FBRyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQy9DLElBQUksSUFBSSxHQUF5QixHQUFHLENBQUMsT0FBTyxDQUFDO1FBRTdDLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFO1lBQ3JCLElBQUksV0FBVyxLQUFLLEtBQUssQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtnQkFDbEQsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7U0FDbEM7O1lBQ0MsV0FBVyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUM7UUFFL0IsSUFBSSxjQUFjLEdBQWMsa0JBQWtCLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUszRSxJQUFJLGNBQWMsS0FBSyxJQUFJLElBQVcsY0FBYyxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRyxDQUFDLFNBQVMsRUFBRSxDQUFDLEtBQUssRUFBRSxLQUFZLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUcsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxjQUFjLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxFQUFFLEtBQUssU0FBUyxDQUFDLGtCQUFrQixFQUFFO1lBQ3hPLElBQUksQ0FBQyxJQUFJLEtBQUssY0FBYyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLFdBQVcsS0FBSyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxpQkFBaUIsRUFBRSxFQUUxSTtnQkFDRSxNQUFNLElBQUksQ0FBQyxvQ0FBb0MsQ0FBQyxjQUFjLEVBQUUsaUJBQWlCLENBQUMsa0JBQWtCLENBQUMsQ0FBQztnQkFDdEcsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO29CQUN2QixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLGFBQWEsQ0FBQyxlQUFlLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsa0JBQWtCLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFO3dCQUN0SyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7d0JBQ3BCLE1BQU0sSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO3FCQUM3QjtvQkFFRCxPQUFPLEtBQUssQ0FBQztpQkFDZDthQUNGOztnQkFDQyxPQUFPLEtBQUssQ0FBQztTQUNoQjtRQUNELElBQUksSUFBSSxDQUFDLFlBQVk7WUFDbkIsT0FBTyxLQUFLLENBQUM7UUFFZixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQWtCekIsSUFBSSxRQUFRLEdBQWMsY0FBYyxDQUFDO1FBQ3pDLElBQUksZUFBZSxLQUFLLElBQUksSUFBVyxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFHLENBQUMsUUFBUSxFQUFFLEtBQVksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRyxDQUFDLFFBQVEsRUFBRSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDO1lBQ3hLLFFBQVEsR0FBRyxlQUFlLENBQUM7UUFFN0IsSUFBSSxRQUFRLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFFbEQsSUFBSSxRQUFRLEdBQWUsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3hELE1BQU0sUUFBUSxDQUFDLG9CQUFvQixDQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ3BFLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtnQkFDdkIsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLGFBQWEsQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsZUFBZSxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDLGtCQUFrQixJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRTtvQkFDdEssSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO29CQUNwQixNQUFNLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztpQkFDN0I7Z0JBQ0QsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7Z0JBQzFCLE9BQU8sS0FBSyxDQUFDO2FBQ2Q7WUFFRCxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxVQUFVLEVBQUUsRUFBRTtnQkFDekMsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7Z0JBQzFCLE9BQU8sS0FBSyxDQUFDO2FBQ2Q7WUFFRCxNQUFNLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNsRDtRQUdELElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQUU7WUFDakMsTUFBTSxJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxFQUFFLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLENBQUM7YUFDL0U7WUFDSCxJQUFJLENBQUMsZUFBZSxHQUFHLHdCQUF3QixDQUFDLFNBQVMsQ0FBQztZQUMxRCxJQUFJLEtBQUssR0FBaUIsSUFBSSxZQUFZLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBQzlELEtBQUssQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUN2RCxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQ3RDO1FBQ0QsSUFBSSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsRUFBRTtZQUMvQixJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztZQUMxQixPQUFPLEtBQUssQ0FBQztTQUNkO1FBTUQsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLElBQUksS0FBSyxjQUFjLEVBQUU7WUFDdkQsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7WUFFMUIsSUFBSSxjQUFjLEtBQUssSUFBSSxJQUFJLENBQUMsTUFBTSxjQUFjLENBQUMsTUFBTSxFQUFFO2dCQUMzRCxNQUFNLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUVqRSxPQUFPLEtBQUssQ0FBQztTQUNkO1FBRUQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLDRDQUE0QyxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFNM0ssSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUM1QyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUN6QixJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztRQUU1QixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBRW5DLElBQUksSUFBSSxDQUFDLFlBQVk7WUFDbkIsTUFBTSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUdqQyxJQUFJLGNBQWMsS0FBSyxJQUFJLEVBQUU7WUFDM0IsSUFBSSxDQUFDLGNBQWMsS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLEtBQUssSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLFNBQVMsRUFBRSxJQUFJLGNBQWMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUU7Z0JBQ2hLLElBQUksY0FBYyxHQUFTLElBQUksQ0FBQztnQkFDaEMsSUFBSSxjQUFjLEtBQUssSUFBSTtvQkFDekIsY0FBYyxHQUFTLGNBQWMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFFNUQsSUFBSSxjQUFjLEtBQUssSUFBSSxFQUFFO29CQUMzQixJQUFJLFNBQVMsR0FBWSxJQUFJLENBQUM7b0JBQzlCLElBQUksWUFBcUIsQ0FBQztvQkFDMUIsSUFBSSxVQUFnQixDQUFDO29CQUVyQixJQUFJLGNBQWMsS0FBSyxJQUFJLEVBQUU7d0JBQzNCLFlBQVksR0FBRyxjQUFjLENBQUMsU0FBUyxDQUFDO3dCQUV4QyxLQUFLLFVBQVUsR0FBRyxjQUFjLEVBQUUsVUFBVSxLQUFLLElBQUksSUFBSSxZQUFZLEVBQUUsVUFBVSxHQUFTLFVBQVUsQ0FBQyxTQUFTLEVBQUUsRUFBRTs0QkFDaEgsSUFBSSxDQUFDLFNBQVMsRUFBRTtnQ0FDZCxZQUFZLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQztnQ0FDcEMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFDO2dDQUN0RSxVQUFVLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0NBQ3pFLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQzs2QkFDcEM7O2dDQUNDLFNBQVMsR0FBRyxLQUFLLENBQUM7eUJBQ3JCO3FCQUNGO29CQUVELFlBQVksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO29CQUU5QixLQUFLLFVBQVUsR0FBUyxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxVQUFVLEtBQUssSUFBSSxDQUFDLElBQUksWUFBWSxFQUFFLFVBQVUsR0FBUyxVQUFVLENBQUMsU0FBUyxFQUFFLEVBQUU7d0JBQzFILFlBQVksR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDO3dCQUNwQyxJQUFJLFVBQVUsQ0FBQyxvQkFBb0IsRUFBRTs0QkFDbkMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDO3dCQUN2RSxNQUFNLFVBQVUsQ0FBQyw4QkFBOEIsRUFBRSxDQUFDO3FCQUNuRDtvQkFHRCxNQUFNLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztpQkFDMUI7YUFDRjtTQUNGO1FBR0QsSUFBSSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ3RELElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUVqRSxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ2hELElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBRTdCLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsZ0JBQWdCO1lBQzlDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNuRSxNQUFNLElBQUksQ0FBQyw4QkFBOEIsRUFBRSxDQUFDO1FBRTVDLElBQUksS0FBSyxHQUFpQixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDMUMsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDLGdCQUFnQjtZQUM1RyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUV4RSxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFTTyxLQUFLLENBQUMsbUJBQW1CLENBQUMsR0FBaUI7UUFDakQsSUFBSSxPQUFPLEdBQWlCLEdBQUcsQ0FBQztRQUNoQyxJQUFJLElBQUksR0FBZSxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDckMsSUFBSSxHQUFHLEdBQVcsSUFBSSxDQUFDO1FBQ3ZCLElBQUksT0FBTyxHQUFXLElBQUksQ0FBQztRQUMzQixJQUFJLEdBQVcsQ0FBQztRQUNoQixJQUFJLGNBQWMsR0FBVyxLQUFLLENBQUMsUUFBUSxDQUFDO1FBRTVDLElBQUksSUFBSSxDQUFDLGNBQWM7WUFDckIsT0FBTyxLQUFLLENBQUM7UUFFZixJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDbkIsT0FBTyxLQUFLLENBQUM7UUFFZixJQUFJLEdBQUcsQ0FBQyxPQUFPLEVBQUUsS0FBSyxjQUFjLENBQUMsaUJBQWlCLEVBQUU7WUFDdEQsSUFBSSxLQUFLLEdBQVcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1lBQzVELElBQUksS0FBSyxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUMsT0FBTyxLQUFLLElBQUksRUFFdkM7Z0JBQ0UsR0FBRyxHQUFHLElBQUksWUFBWSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDakMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDdkIsR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDckIsSUFBSSxTQUFTLEdBQXlCLEdBQUcsQ0FBQyxPQUFPLENBQUM7Z0JBQ2xELE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQzNCLElBQUksU0FBUyxLQUFLLElBQUk7b0JBQ3BCLE9BQU8sS0FBSyxDQUFDO2FBQ2hCO1NBQ0Y7UUFJRCxJQUFJLEdBQUcsQ0FBQyxPQUFPLEVBQUUsS0FBSyxjQUFjLENBQUMsbUJBQW1CLEVBQUU7WUFDeEQsSUFBSSxJQUFJLEdBQW1CLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUMxQyxJQUFJLFdBQVcsR0FBVyxHQUFHLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDL0MsSUFBSSxFQUFFLEdBQXVCLElBQUksQ0FBQyxRQUFRLENBQUM7WUFDM0MsR0FBRyxHQUFHLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUV0QixJQUFJLElBQUksR0FBeUIsR0FBRyxDQUFDLE9BQU8sQ0FBQztZQUM3QyxJQUFJLFVBQVUsR0FBVyxHQUFHLENBQUMsZUFBZSxFQUFFLENBQUM7WUFFL0MsSUFBSSxlQUFlLEdBQWMsa0JBQWtCLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUc1RSxRQUFRLFVBQVUsRUFBRTtnQkFDbEIsS0FBSyxpQkFBaUIsQ0FBQyxXQUFXO29CQUNoQyxJQUFJLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzFDLElBQUksT0FBTzt3QkFDVCxPQUFPLEtBQUssQ0FBQztnQkFDakIsS0FBSyxpQkFBaUIsQ0FBQyxvQkFBb0I7b0JBQ3pDLE1BQU07Z0JBRVIsS0FBSyxpQkFBaUIsQ0FBQyxpQkFBaUI7b0JBQ3RDLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLEdBQUcsQ0FBQyxjQUFjLEVBQUUsRUFBRSxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztvQkFDdEYsT0FBTyxLQUFLLENBQUM7Z0JBRWYsS0FBSyxpQkFBaUIsQ0FBQyxzQ0FBc0M7b0JBQzNELE1BQU0sSUFBSSxDQUFDLDRCQUE0QixDQUFDLElBQUksQ0FBQyxDQUFDO29CQUM5QyxPQUFPLEtBQUssQ0FBQztnQkFFZixLQUFLLGlCQUFpQixDQUFDLG1CQUFtQjtvQkFDeEMsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7b0JBQzFDLE9BQU8sS0FBSyxDQUFDO2dCQUVmLEtBQUssaUJBQWlCLENBQUMsbUJBQW1CO29CQUN4QyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxHQUFHLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztvQkFDbEUsT0FBTyxLQUFLLENBQUM7Z0JBRWYsS0FBSyxpQkFBaUIsQ0FBQyxnQkFBZ0I7b0JBQ3JDLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO29CQUMzQyxPQUFPLEtBQUssQ0FBQztnQkFFZixLQUFLLGlCQUFpQixDQUFDLFlBQVk7b0JBQ2pDLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDNUIsT0FBTyxLQUFLLENBQUM7Z0JBRWYsS0FBSyxpQkFBaUIsQ0FBQyxhQUFhO29CQUNsQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQztvQkFDckMsT0FBTyxLQUFLLENBQUM7Z0JBRWYsS0FBSyxpQkFBaUIsQ0FBQyx5QkFBeUI7b0JBQzlDLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsR0FBRyxDQUFDLFNBQVMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztvQkFDeEYsT0FBTyxLQUFLLENBQUM7Z0JBRWYsS0FBSyxpQkFBaUIsQ0FBQyxnQkFBZ0I7b0JBQ3JDLE1BQU0sSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxDQUFDO29CQUN6QyxPQUFPLEtBQUssQ0FBQztnQkFFZixLQUFLLGlCQUFpQixDQUFDLHNDQUFzQztvQkFDM0QsTUFBTSxJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzdDLE1BQU07Z0JBRVIsS0FBSyxpQkFBaUIsQ0FBQyxvQkFBb0I7b0JBQ3pDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7b0JBQ25DLE9BQU8sS0FBSyxDQUFDO2dCQUVmLEtBQUssaUJBQWlCLENBQUMscUJBQXFCO29CQUMxQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO29CQUNwQyxPQUFPLEtBQUssQ0FBQztnQkFFZixLQUFLLGlCQUFpQixDQUFDLGtCQUFrQjtvQkFDdkMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUM7b0JBQ3pDLE1BQU07Z0JBRVIsS0FBSyxpQkFBaUIsQ0FBQyxrQkFBa0I7b0JBQ3ZDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDO29CQUN6QyxNQUFNO2dCQUVSLEtBQUssaUJBQWlCLENBQUMsaUJBQWlCO29CQUd0QyxJQUFJLElBQUksQ0FBQyxTQUFTLElBQVcsSUFBSSxDQUFDLFNBQVMsRUFBRyxDQUFDLHVCQUF1Qjt3QkFDcEUsT0FBTyxLQUFLLENBQUM7b0JBR2YsSUFBSSxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLENBQUM7b0JBQ2pELElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO29CQUV4QixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRTt3QkFDbkIsT0FBTyxLQUFLLENBQUM7b0JBS2YsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLEdBQUcsS0FBSyxDQUFDLFFBQVEsSUFBSSxXQUFXLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBRTt3QkFFekUsT0FBTyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLElBQUksV0FBVyxHQUFHLENBQUMsRUFBRTs0QkFDcEQsV0FBVyxFQUFFLENBQUM7eUJBQ2Y7d0JBQ0QsSUFBSSxXQUFXLElBQUksQ0FBQyxFQUFFOzRCQUNwQixPQUFPLEdBQUcsRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDOzRCQUMxQixJQUFJLFdBQVcsR0FBVyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7NEJBQ3pDLElBQUksUUFBUSxHQUFXLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQzs0QkFFdkMsSUFBSTtnQ0FDRixjQUFjLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztnQ0FFbEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxjQUFjLENBQUM7Z0NBQ3RDLE1BQU0sSUFBSSxDQUFDLHVCQUF1QixDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0NBRTdELElBQUksT0FBTyxJQUFJLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUU7b0NBQ3pELE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsa0JBQWtCLENBQUMsQ0FBQztvQ0FLeEQsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO2lDQUM1RDtnQ0FDRCxHQUFHLEdBQUcsRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDOzZCQUN2Qjs0QkFBQyxPQUFPLENBQUMsRUFBRTtnQ0FDVixJQUFJLENBQUMsWUFBWSw0QkFBNEIsRUFBRTtvQ0FDN0MsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO3dDQUN2QixJQUFJLFdBQVcsS0FBSyxTQUFTLENBQUMsZ0JBQWdCLElBQUksY0FBYyxHQUFHLENBQUM7NENBQ2xFLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsRUFBRTs0Q0FDN0IsSUFBSSxRQUFRLEdBQVcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsQ0FBQzs0Q0FDeEQsTUFBTSxJQUFJLENBQUMscUJBQXFCLENBQUMsUUFBUSxDQUFDLENBQUM7eUNBQzVDOzs0Q0FDQyxNQUFNLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxjQUFjLENBQUMsQ0FBQzt3Q0FDbkQsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO3dDQUN2RCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7d0NBQzdCLGVBQWUsR0FBYyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQzt3Q0FDdEQsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7d0NBQ3pCLElBQUksZUFBZSxJQUFJLElBQUk7NENBQ3pCLE1BQU0sZUFBZSxDQUFDLE1BQU0sRUFBRSxDQUFDO3dDQUNqQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7d0NBQzVCLE9BQU8sS0FBSyxDQUFDO3FDQUNkOzt3Q0FDQyxNQUFNLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUM7aUNBQy9DOztvQ0FBTSxNQUFNLENBQUMsQ0FBQzs2QkFDaEI7eUJBQ0Y7OzRCQUNDLE1BQU0sSUFBSSxvQkFBb0IsQ0FBQywrREFBK0Q7Z0NBQzVGLFdBQVcsQ0FBQyxDQUFDO3FCQUNsQjtvQkFDRCxJQUFJLEdBQUcsSUFBSSxJQUFJO3dCQUNiLE1BQU0sSUFBSSxvQkFBb0IsQ0FDNUIsdUVBQXVFLENBQUMsQ0FBQztvQkFLN0UsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLFNBQVMsQ0FBQyxlQUFlO3dCQUN0RSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7b0JBR3pCLElBQUksTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFO3dCQUMvRCxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQzt3QkFDdkMsT0FBTyxLQUFLLENBQUM7cUJBQ2Q7b0JBQ0QsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO3dCQUNqQixNQUFNLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO29CQUdqQyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxTQUFTLENBQUMsZUFBZTt3QkFDL0MsT0FBTyxLQUFLLENBQUM7b0JBRWYsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO29CQUUzRCxNQUFNLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztvQkFDeEUsQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ3pDLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztvQkFFakMsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDO29CQUdsQixJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLHlCQUF5QixFQUFFO3dCQUNwRCxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7d0JBQ2xDLE9BQU8sVUFBVSxDQUFDLFNBQVMsRUFBRTs0QkFDM0IsSUFBSSxVQUFVLENBQUMsUUFBUSxFQUFFLEtBQUssU0FBUyxDQUFDLGVBQWUsRUFBRTtnQ0FDdkQsTUFBTSxJQUFJLENBQUMsMkJBQTJCLENBQUMsVUFBVSxFQUFFLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLENBQUM7Z0NBQ3hGLFVBQVUsR0FBRyxVQUFVLENBQUMsU0FBUyxFQUFFLENBQUM7Z0NBQ3BDLElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFO29DQUM3QixNQUFNOzZCQUNUOztnQ0FDQyxNQUFNO3lCQUNUO3FCQUNGO29CQUdELElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUM7b0JBQ3BDLElBQUksTUFBTSxJQUFJLENBQUMsb0JBQW9CLEVBQUU7d0JBQ25DLE1BQU0sRUFBRSxDQUFDLGVBQWUsRUFBRSxDQUFDO29CQUM3QixJQUFJLENBQUMsdUJBQXVCLEdBQUcsS0FBSyxDQUFDO29CQUNyQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO29CQUUzQyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO29CQUNqQyxNQUFNO2dCQUVSLEtBQUssaUJBQWlCLENBQUMsaUJBQWlCO29CQUV0QyxJQUFJLFdBQVcsR0FBWSxLQUFLLENBQUM7b0JBQ2pDLElBQUksZ0JBQXlCLENBQUM7b0JBRTlCLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO29CQUc3QixJQUFJLEdBQUcsSUFBSSxJQUFJO3dCQUNiLE9BQU8sS0FBSyxDQUFDO29CQUVmLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLHNCQUFzQixFQUFFLEtBQUssQ0FBQyxDQUFDO29CQUloRixJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsSUFBSSxXQUFXLENBQUMsSUFBSSxHQUFHLENBQUMsT0FBTyxFQUFFLEtBQUsscUJBQXFCLENBQUMsTUFBTTt3QkFDakYsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLFNBQVMsQ0FBQyxnQkFBZ0I7d0JBQzdDLE9BQU8sSUFBSSxDQUFDO29CQUdkLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLFNBQVMsQ0FBQyxlQUFlO3dCQUMvQyxPQUFPLEtBQUssQ0FBQztvQkFFZixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxTQUFTLENBQUMsa0JBQWtCLEVBQUU7d0JBQ3BELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQzt3QkFDN0IsTUFBTSxJQUFJLENBQUMsb0NBQW9DLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLEVBQUUsaUJBQWlCLENBQUMsa0JBQWtCLENBQUMsQ0FBQzt3QkFDaEgsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUM5QixJQUFJLElBQUksQ0FBQyxjQUFjOzRCQUNyQixPQUFPLEtBQUssQ0FBQztxQkFDaEI7b0JBRUQsTUFBTSxJQUFJLENBQUMsdUJBQXVCLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztvQkFDeEUsSUFBSSxJQUFJLENBQUMsY0FBYzt3QkFDckIsT0FBTyxLQUFLLENBQUM7b0JBQ2YsTUFBTSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUM7b0JBS3hFLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDO29CQUV6QyxnQkFBZ0IsR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLG1CQUFtQixFQUFFLEtBQUssQ0FBQyxDQUFDO29CQUdsRixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxTQUFTLENBQUMsZUFBZSxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVE7d0JBQy9FLENBQUMsZ0JBQWdCO3dCQUNqQixPQUFPLEtBQUssQ0FBQztvQkFFZixJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLENBQUMsZ0JBQWdCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUU7d0JBQzFFLElBQUksR0FBRyxDQUFDLE9BQU8sRUFBRSxLQUFLLHFCQUFxQixDQUFDLE1BQU0sRUFBRTs0QkFDbEQsT0FBTyxNQUFNLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsQ0FBQzt5QkFDcEQ7d0JBQ0QsT0FBTyxLQUFLLENBQUM7cUJBQ2Q7b0JBRUQsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssU0FBUyxDQUFDLGdCQUFnQixJQUFJLEdBQUcsQ0FBQyxRQUFRLEVBQUU7d0JBQ2pFLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDOzRCQUNuQyxPQUFPLEtBQUssQ0FBQztxQkFDaEI7b0JBRUQsSUFBSSxhQUFhLEdBQVksQ0FBQyxNQUFNLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFFMUUsSUFBSSxhQUFhO3dCQUNmLE9BQU8sS0FBSyxDQUFDO29CQUNmLE1BQU07Z0JBRVIsS0FBSyxpQkFBaUIsQ0FBQyxrQkFBa0I7b0JBQ3ZDLElBQUksTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDO3dCQUNsQyxPQUFPLElBQUksQ0FBQzt5QkFDVDt3QkFFSCxHQUFHLENBQUMsT0FBTyxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7d0JBQzlCLE9BQU8sS0FBSyxDQUFDO3FCQUNkO2dCQUVILEtBQUssaUJBQWlCLENBQUMsYUFBYTtvQkFDbEMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO29CQUMvQixNQUFNO2dCQUVSLEtBQUssaUJBQWlCLENBQUMsa0JBQWtCO29CQUd2QyxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFLElBQUksSUFBSTt3QkFDckQsT0FBTyxLQUFLLENBQUM7b0JBR2YsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssU0FBUyxDQUFDLGtCQUFrQjt3QkFDbEQsT0FBTyxLQUFLLENBQUM7b0JBRWYsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRTt3QkFDckIsR0FBRyxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBRy9CLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUM7d0JBOEJsQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRTs0QkFDekIsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLGFBQWEsQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsS0FBSyxnQkFBZ0IsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsSUFBSSxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxHQUFHLEtBQUssSUFBSSxDQUFDLElBQUksT0FBTyxHQUFHLElBQUksV0FBVztnQ0FDeE8sQ0FBQyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRTs0QkFDL0MsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDOzRCQUM1QixPQUFPLEtBQUssQ0FBQzt5QkFDZDtxQkFDRjtvQkFHRCxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWM7d0JBQ3RCLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFHakMsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7b0JBQ3ZCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUM7b0JBQ2pDLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO29CQUM1QixJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzlCLE1BQU07YUFFVDtTQUNGO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBT1MsS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFlO1FBQ3hDLElBQUksR0FBbUIsQ0FBQztRQUN4QixJQUFJLEtBQWEsQ0FBQztRQUNsQixJQUFJLEtBQWEsQ0FBQztRQUNsQixJQUFJLFlBQVksR0FBRyxLQUFLLENBQUM7UUFDekIsSUFBSSxJQUFJLEdBQVMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBRzFDLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFLEVBQUU7WUFFM0IsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUU7Z0JBRXJCLEtBQUssR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUdqQyxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssRUFBRSxLQUFLLENBQUM7b0JBQ3pDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztxQkFDekI7b0JBQ0gsSUFBSSxVQUFVLEdBQVcsSUFBSSxDQUFDO29CQUM5QixLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUNyQyxJQUFJLEdBQUcsR0FBYyxJQUFJLENBQUMsUUFBUyxDQUFDLFVBQVUsRUFBRSxDQUFDO29CQUNqRCxVQUFVLEdBQUcsR0FBRyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7b0JBQ2hFLEdBQUcsR0FBRyxjQUFjLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxVQUFVLENBQUMsQ0FBQztvQkFDdkgsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBRXZDLElBQUksdUJBQXVCLEdBQTBCLHdCQUF3QixDQUFDLG9CQUFvQixFQUFFLENBQUM7b0JBQ3JHLE1BQU0sdUJBQXVCLENBQUMsT0FBTyxDQUFDLHdDQUF3QyxDQUFDLGtCQUFrQixDQUFDLENBQUM7b0JBRW5HLFlBQVksR0FBRyxJQUFJLENBQUM7aUJBQ3JCO2FBQ0Y7U0FDRjtRQUNELE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7SUFFTyxLQUFLLENBQUMsMEJBQTBCLENBQUMsSUFBVTtRQUdqRCxJQUFJLEtBQUssR0FBa0IsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ2pELEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDaEQsSUFBSSxPQUFPLEdBQWlCLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDaEQsSUFBSSxHQUFHLEdBQVUsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3BDLElBQUksR0FBRyxDQUFDLGVBQWUsRUFBRSxLQUFLLGlCQUFpQixDQUFDLHdCQUF3QixFQUFFO2dCQUN4RSxJQUFJLE9BQU8sR0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBVSxJQUFJLENBQUMsT0FBTyxFQUFHLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNoSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQy9CLElBQUksWUFBWSxHQUFpQixJQUFJLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDM0QsWUFBWSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO29CQUNyRSxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUFDO29CQUM1QyxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUU7d0JBRXZCLGtCQUFrQixDQUFDLHFCQUFxQixDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQzt3QkFDeEQsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUNoQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLENBQUM7d0JBQ25DLE9BQU8sS0FBSyxDQUFDO3FCQUNkO2lCQUNGO2FBQ0Y7U0FDRjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUdPLEtBQUssQ0FBQyxjQUFjLENBQUMsSUFBZSxFQUFFLElBQVksRUFBRSxHQUFpQjtRQUMzRSxJQUFJLFdBQVcsR0FBVyxHQUFHLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDL0MsSUFBSSxXQUFXLEtBQUssS0FBSyxDQUFDLFFBQVE7WUFDaEMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFFakMsSUFBSSxRQUFRLEdBQVksSUFBSSxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsa0JBQWtCLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDLGVBQWUsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLGFBQWEsQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDLGFBQWEsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO1FBQzVSLElBQUksUUFBUTtZQUNWLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsUUFBUSxFQUFFLEVBQUUsV0FBVyxFQUFFLEdBQUcsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDOztZQUV0RixNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBVU8sS0FBSyxDQUFDLGNBQWMsQ0FBQyxJQUFVLEVBQUUsR0FBaUI7UUFFeEQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRTtZQUNwRSxJQUFJLFdBQVcsR0FBYyxJQUFJLENBQUM7WUFDbEMsSUFBSSxrQkFBa0IsR0FBVyxNQUFNLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFLGdCQUFnQixDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztZQUdsRyxJQUFJLGtCQUFrQixJQUFJLElBQUk7Z0JBQzVCLE9BQU87WUFJVCxLQUFLLElBQUksVUFBVSxHQUFTLElBQUksRUFBRSxVQUFVLENBQUMsT0FBTyxFQUFFLElBQUksSUFBSSxJQUFJLFVBQVUsQ0FBQyxRQUFRLEVBQUUsS0FBSyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsVUFBVSxHQUFTLFVBQVUsQ0FBQyxTQUFTLEVBQUUsRUFBRTtnQkFDdEosV0FBVyxHQUFjLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxhQUFhLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLEVBQUUsYUFBYSxDQUFDLGlCQUFpQixDQUFDLENBQUM7Z0JBQ3hILElBQUksV0FBVyxJQUFJLElBQUksRUFBRTtvQkFDdkIsSUFBSSxXQUFXLEdBQWUsV0FBVyxDQUFDLGNBQWMsRUFBRSxDQUFDO29CQUczRCxJQUFJLFdBQVcsSUFBSSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLEVBQUU7d0JBQ2pEOzRCQUNFLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxDQUFDO3lCQUM3Qzt3QkFDRCxNQUFNO3FCQUNQO2lCQUNGO2FBQ0Y7U0FDRjtJQUNILENBQUM7SUFPTSxLQUFLLENBQUMsbUJBQW1CLENBQUMsV0FBc0I7UUFDckQsSUFBSSxXQUFXLEdBQWUsV0FBVyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQzNELElBQUksVUFBVSxHQUFlLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUU3RCxJQUFJLEdBQUcsR0FBVyxXQUFXLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDMUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDekIsTUFBTSxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ3hCLFVBQVUsQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDcEQsTUFBTSxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7WUFFekIsV0FBVyxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDL0IsTUFBTSx3QkFBd0IsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLE9BQU8sQ0FBQyx3Q0FBd0MsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQzNILFFBQVEsQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLGNBQWMsRUFBRSxXQUFXLEVBQUUsV0FBVyxDQUFDLFVBQVUsRUFBRSxFQUFrQixXQUFZLENBQUMsT0FBTyxFQUFFLEVBQUUsV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUM7WUFJM0ssSUFBb0IsV0FBWSxDQUFDLE9BQU8sRUFBRTtnQkFDeEMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQ2Y7SUFDSCxDQUFDO0lBUU8sb0JBQW9CLENBQUMsR0FBaUI7UUFDNUMsSUFBSSxHQUFHLENBQUMsVUFBVSxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQzdCLElBQUksR0FBRyxDQUFDLE9BQU8sRUFBRSxLQUFLLGNBQWMsQ0FBQyxtQkFBbUIsRUFBRTtnQkFDeEQsUUFBUSxHQUFHLENBQUMsZUFBZSxFQUFFLEVBQUU7b0JBQzdCO3dCQUNFLE1BQU07aUJBQ1Q7YUFDRjtTQUNGO0lBQ0gsQ0FBQztJQVFELEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxJQUFjLEVBQUUsV0FBOEI7UUFDMUUsSUFBSSxZQUFZLEdBQVksS0FBSyxDQUFDO1FBQ2xDLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLFNBQVMsQ0FBQyxpQkFBaUIsRUFBRTtZQUNuRCxXQUFXLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztZQUMxQixNQUFNLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUNsRixJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtnQkFDN0IsWUFBWSxHQUFHLElBQUksQ0FBQztTQUN2QjtRQUVELE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7SUFPRCxLQUFLLENBQUMsdUJBQXVCLENBQUMsSUFBYztRQUMxQyxJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLEVBQUU7WUFDaEMsTUFBTSxJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxFQUFFLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLENBQUM7U0FDbkY7SUFDSCxDQUFDO0lBT08sS0FBSyxDQUFDLGFBQWEsQ0FBQyxHQUFpQjtRQUMzQyxJQUFJLElBQUksR0FBZSxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDckMsSUFBSSxNQUFNLEdBQVcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3RDLElBQUksSUFBSSxHQUFtQixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDMUMsSUFBSSxJQUFJLEdBQXlCLEdBQUcsQ0FBQyxPQUFPLENBQUM7UUFDN0MsSUFBSSxjQUF5QixDQUFDO1FBQzlCLElBQUksUUFBUSxHQUFZLElBQUksQ0FBQztRQUM3QixJQUFJLE9BQWUsQ0FBQztRQUNwQixJQUFJLE1BQU0sR0FBMEIsSUFBSSxDQUFDLGlCQUFpQixDQUFDO1FBRTNELElBQUksSUFBSSxDQUFDLGNBQWM7WUFDckIsT0FBTztRQUdULElBQUksR0FBRyxDQUFDLE9BQU8sRUFBRSxLQUFLLGNBQWMsQ0FBQyxlQUFlO1lBQ2xELEdBQUcsR0FBRyxJQUFJLFlBQVksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFFbEQsSUFBSTtZQUNGLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7WUFFdEIsSUFBSSxHQUFHLENBQUMsT0FBTyxFQUFFLEtBQUssY0FBYyxDQUFDLGlCQUFpQixFQUFFO2dCQUN0RCxJQUFJLEtBQUssR0FBVyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7Z0JBQzVELElBQUksS0FBSyxLQUFLLENBQUMsRUFFZjtvQkFDRSxHQUFHLEdBQUcsSUFBSSxZQUFZLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO29CQUNqQyxHQUFHLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUN2QixHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUN0QjthQUNGO1lBS0QsSUFBSSxHQUFtQixDQUFDO1lBQ3hCLElBQUksR0FBRyxDQUFDLE9BQU8sRUFBRSxLQUFLLGNBQWMsQ0FBQyxtQkFBbUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLHlCQUF5QixFQUFFO2dCQUMzSixJQUFJLFlBQVksR0FBaUMsTUFBTSxDQUFDLFlBQVksQ0FBQztnQkFDckUsSUFBSSxFQUFFLEdBQXVCLElBQUksQ0FBQyxRQUFRLENBQUM7Z0JBQzNDLElBQUksR0FBRyxHQUFXLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFFbEMsSUFBSSxVQUFVLEdBQVcsR0FBRyxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUcvQyxRQUFRLFVBQVUsRUFBRTtvQkFFbEIsS0FBSyxpQkFBaUIsQ0FBQyxvQkFBb0I7d0JBQ3pDLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7d0JBQ3JDLE1BQU07b0JBR1IsS0FBSyxpQkFBaUIsQ0FBQyxhQUFhLENBQUM7b0JBQ3JDLEtBQUssaUJBQWlCLENBQUMsZUFBZTt3QkFJcEMsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLGFBQWEsQ0FBQyxnQkFBZ0I7NEJBQzlDLENBQUMsVUFBVSxLQUFLLGlCQUFpQixDQUFDLGFBQWEsSUFBSSxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRTs0QkFDekcsSUFBSSxNQUFNLEdBQUcsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7NEJBQ3BDLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLElBQUk7Z0NBQzdCLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7NEJBQ3RDLElBQUksY0FBYyxDQUFDLGVBQWUsS0FBSyxNQUFNLENBQUMsT0FBTyxFQUFFLEVBQUU7Z0NBQ3ZELElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFO29DQUN6QixJQUFJLFlBQVksR0FBZSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7b0NBQ2hELElBQUksWUFBWSxJQUFJLElBQUk7d0NBQ3RCLFlBQVksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztpQ0FDMUU7Z0NBQ0QsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7Z0NBQ2hDLE1BQU0sTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDO2dDQUM3QixJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dDQUN2QixJQUFJLENBQUMsMENBQTBDLENBQUMsTUFBTSxDQUFDLENBQUM7NkJBQ3pEO3lCQUNGOzZCQUFNLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsYUFBYSxFQUFFOzRCQUVwRCxJQUFJLENBQUMsK0JBQStCLENBQUMsSUFBSSxFQUFFLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxDQUFDO3lCQUMzRTs2QkFBTSxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDLGVBQWUsRUFBRTs0QkFDdEQsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7eUJBQzFCO3dCQUVELE1BQU07b0JBRVIsS0FBSyxpQkFBaUIsQ0FBQyxvQkFBb0I7d0JBQ3pDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO3dCQUMvQyxNQUFNO29CQUVSLEtBQUssaUJBQWlCLENBQUMsWUFBWTt3QkFDakMsSUFBSSxLQUFLLEdBQUcsSUFBSSxZQUFZLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO3dCQUN2QyxLQUFLLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxDQUFDO3dCQUNqRCxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUN0QixNQUFNO29CQUVSLEtBQUssaUJBQWlCLENBQUMsV0FBVzt3QkFFaEMsSUFBSSxTQUFTLEdBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUMxRyxNQUFNLFNBQVMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQzt3QkFFM0UsTUFBTTtvQkFFUixLQUFLLGlCQUFpQixDQUFDLGtCQUFrQjt3QkFFdkMsTUFBTSxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLEVBQUUsS0FBSyxFQUM5RixLQUFLLENBQUMsQ0FBQzt3QkFFVCxNQUFNO29CQUVSLEtBQUssaUJBQWlCLENBQUMsa0JBQWtCO3dCQUN2QyxJQUFJLElBQUksSUFBSSxJQUFJOzRCQUNkLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsYUFBYSxFQUFFLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO3dCQUNoRixNQUFNO29CQUVSLEtBQUssaUJBQWlCLENBQUMsa0JBQWtCO3dCQUN2QyxJQUFJLElBQUksSUFBSSxJQUFJOzRCQUNkLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsYUFBYSxFQUFFLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO3dCQUNoRixNQUFNO29CQUVSLEtBQUssaUJBQWlCLENBQUMsa0JBQWtCO3dCQUN2QyxJQUFJLElBQUksSUFBSSxJQUFJOzRCQUNkLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO3dCQUNqRixNQUFNO29CQUVSLEtBQUssaUJBQWlCLENBQUMsa0JBQWtCO3dCQUN2QyxJQUFJLElBQUksSUFBSSxJQUFJOzRCQUNkLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO3dCQUNqRixNQUFNO29CQUVSLEtBQUssaUJBQWlCLENBQUMsa0JBQWtCO3dCQUN2QyxJQUFJLElBQUksSUFBSSxJQUFJOzRCQUNkLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLFNBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO3dCQUNsRixNQUFNO29CQUVSLEtBQUssaUJBQWlCLENBQUMsa0JBQWtCO3dCQUN2QyxJQUFJLElBQUksSUFBSSxJQUFJOzRCQUNkLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO3dCQUNoRixNQUFNO29CQUVSLEtBQUssaUJBQWlCLENBQUMsaUJBQWlCO3dCQUd0QyxjQUFjLEdBQWMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7d0JBQ3JELElBQUksY0FBYyxJQUFJLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLEVBQUUsRUFBRTs0QkFDekQsSUFBSSxJQUFJLElBQUksSUFBSTtnQ0FDZCxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLGVBQWUsRUFBRSxTQUFTLENBQUMsb0JBQW9CLENBQUMsQ0FBQzt5QkFDcEY7d0JBQ0QsTUFBTTtvQkFFUixLQUFLLGlCQUFpQixDQUFDLGlCQUFpQjt3QkFHdEMsY0FBYyxHQUFjLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO3dCQUNyRCxJQUFJLGNBQWMsS0FBSyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxFQUFFLEVBQUU7NEJBQzFELElBQUksSUFBSSxJQUFJLElBQUk7Z0NBQ2QsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxlQUFlLEVBQUUsU0FBUyxDQUFDLGtCQUFrQixDQUFDLENBQUM7eUJBQ2xGO3dCQUNELE1BQU07b0JBRVIsS0FBSyxpQkFBaUIsQ0FBQyxvQkFBb0I7d0JBQUU7NEJBRzNDLElBQUksUUFBUSxHQUFrQixJQUFJLENBQUMsSUFBSSxDQUFDOzRCQUN4QyxJQUFJLFNBQVMsR0FBVyxpQkFBaUIsQ0FBQyxXQUFXLENBQUM7NEJBQ3RELElBQUksUUFBUSxLQUFLLGFBQWEsQ0FBQyxlQUFlLElBQUksUUFBUSxLQUFLLGFBQWEsQ0FBQyxlQUFlO2dDQUMxRixRQUFRLEtBQUssYUFBYSxDQUFDLGVBQWUsRUFBRTtnQ0FDNUMsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLENBQUM7b0NBQ25GLFNBQVMsR0FBRyxpQkFBaUIsQ0FBQyxhQUFhLENBQUM7cUNBQ3pDO29DQUNILElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDO3dDQUNqRixTQUFTLEdBQUcsaUJBQWlCLENBQUMsV0FBVyxDQUFDO2lDQUM3QztnQ0FFRCxJQUFJLFNBQVMsS0FBSyxpQkFBaUIsQ0FBQyxXQUFXO29DQUM3QyxJQUFJLENBQUMsK0JBQStCLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDOzZCQUN6RDt5QkFDRjt3QkFDQyxNQUFNO29CQUVSLEtBQUssaUJBQWlCLENBQUMsY0FBYzt3QkFDbkMsSUFBSSxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUM7NEJBQ3RELE9BQU87d0JBQ1QsTUFBTTtvQkFFUixLQUFLLGlCQUFpQixDQUFDLGNBQWMsQ0FBQztvQkFDdEMsS0FBSyxpQkFBaUIsQ0FBQyxvQkFBb0I7d0JBQ3pDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQUUsRUFBRTs0QkFDbkMsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDOzRCQUVoQyxNQUFNO3lCQUNQO3dCQUNELElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTs0QkFDeEIsTUFBTTt3QkFFUixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUUzQixJQUFJOzRCQUNGLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLFNBQVMsQ0FBQyxrQkFBa0IsRUFBRTtnQ0FDcEQsTUFBTSxJQUFJLENBQUMsb0NBQW9DLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLEVBQUUsaUJBQWlCLENBQUMsa0JBQWtCLENBQUMsQ0FBQztnQ0FDaEgsSUFBSSxJQUFJLENBQUMsb0JBQW9CLEVBQUU7b0NBQzdCLE9BQU87NkJBQ1Y7NEJBR0QsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssU0FBUyxDQUFDLGdCQUFnQixJQUFJLEdBQUcsSUFBSSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFO2dDQUNqRixJQUFJLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsc0JBQXNCLEVBQUUsS0FBSyxDQUFDLEVBQUU7b0NBQ3JFLFFBQVEsR0FBRyxLQUFLLENBQUM7b0NBQ2pCLE1BQU0sSUFBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO29DQUNsRixJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7d0NBQ2xELE9BQU87aUNBQ1Y7cUNBQU07b0NBQ0wsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUM7b0NBQ3pDLE1BQU0sSUFBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO29DQUVsRixJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLElBQUksSUFBSSxJQUFJLElBQUksRUFBRTt3Q0FFaEQsSUFBSSxpQkFBaUIsR0FBeUIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7d0NBQ3ZFLElBQUksaUJBQWlCLEtBQUssSUFBSTs0Q0FDNUIsTUFBTSxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQztxQ0FDcEM7b0NBQ0QsT0FBTztpQ0FDUjs2QkFDRjs0QkFDRCxJQUFJLFdBQVcsR0FBc0IsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7NEJBQzVELElBQUksTUFBTSxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQztnQ0FDdkQsT0FBTzs0QkFDVCxRQUFRLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQzs0QkFFN0IsSUFBSSxJQUFJLElBQUksSUFBSSxFQUFFO2dDQUVoQixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWU7b0NBQzFFLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsVUFBVSxJQUFJLGlCQUFpQixDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDOzZCQUNwRzs0QkFFRCxNQUFNLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsQ0FBQzs0QkFDekMsTUFBTSxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLENBQUM7eUJBRTNDO2dDQUFTOzRCQUNSLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7eUJBQzdCO3dCQUNELE1BQU07b0JBRVIsS0FBSyxpQkFBaUIsQ0FBQyxhQUFhO3dCQUNsQyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQzt3QkFDN0QsTUFBTTtvQkFFUixLQUFLLGlCQUFpQixDQUFDLHdCQUF3Qjt3QkFDN0MsTUFBTSxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQzFDLE1BQU07b0JBRVIsS0FBSyxpQkFBaUIsQ0FBQyxjQUFjO3dCQUNuQyxNQUFNLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLENBQUMsY0FBYyxDQUFDLENBQUM7d0JBQy9FLE1BQU07b0JBRVIsS0FBSyxpQkFBaUIsQ0FBQyxpQkFBaUI7d0JBQ3RDLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLFNBQVMsQ0FBQyxnQkFBZ0I7NEJBQy9DLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsZUFBZSxFQUFFLEVBQUU7NEJBQzlFLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQzt5QkFFakM7d0JBQ0QsTUFBTTtvQkFFUixLQUFLLGlCQUFpQixDQUFDLGdCQUFnQjt3QkFDckMsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssU0FBUyxDQUFDLGVBQWU7NEJBQzlDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxLQUFLLEtBQUs7NEJBQ3hGLE1BQU07d0JBQ1IsTUFBTSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7d0JBQ3pCLE9BQU8sR0FBRyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQzt3QkFDckMsTUFBTSxJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxFQUFFLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLENBQUM7d0JBQ2xGLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsRUFBRTs0QkFDaEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUM7NEJBQ3hDLElBQUksT0FBTyxLQUFLLFNBQVMsQ0FBQyxnQkFBZ0IsRUFBRTtnQ0FDMUMsTUFBTSxFQUFFLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO2dDQUM5QixNQUFNLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztnQ0FDbEYsSUFBSSxJQUFJLElBQUksSUFBSTtvQ0FDZCxNQUFNLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQ0FDdEIsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDOzZCQUM1RDtpQ0FBTTtnQ0FHTCxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQUM7Z0NBQ2xDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQ0FDbkMsTUFBTSxJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxFQUFFLGlCQUFpQixDQUFDLHNCQUFzQixDQUFDLENBQUM7Z0NBQ3ZGLElBQUksSUFBSSxJQUFJLElBQUk7b0NBQ2QsTUFBTSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7Z0NBQ3RCLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQ0FDbkMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxDQUFDO2dDQUNwQyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLEtBQUsscUJBQXFCLENBQUMsTUFBTTtvQ0FDL0UsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUM7O29DQUV4QyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dDQUMzQyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLHFCQUFxQixDQUFDLENBQUM7NkJBQzVEOzRCQUNELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUM7NEJBQ3BELE1BQU0sSUFBSSxDQUFDLDhCQUE4QixFQUFFLENBQUM7eUJBQzdDO3dCQUNELE1BQU07b0JBRVIsS0FBSyxpQkFBaUIsQ0FBQyxpQkFBaUI7d0JBQ3RDLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLFNBQVMsQ0FBQyxnQkFBZ0I7NEJBQy9DLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxLQUFLLEtBQUs7NEJBQ3hGLE1BQU07d0JBQ1IsTUFBTSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7d0JBQ3pCLE9BQU8sR0FBRyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQzt3QkFDckMsTUFBTSxJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxFQUFFLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLENBQUM7d0JBQ2xGLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsRUFBRTs0QkFDaEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsQ0FBQzs0QkFFekMsSUFBSSxPQUFPLEtBQUssU0FBUyxDQUFDLGdCQUFnQixFQUFFO2dDQUMxQyxNQUFNLEVBQUUsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7Z0NBQzlCLE1BQU0sSUFBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2dDQUNsRixJQUFJLElBQUksSUFBSSxJQUFJO29DQUNkLE1BQU0sSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDOzZCQUN2QjtpQ0FBTTtnQ0FHTCxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQUM7Z0NBQ2xDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQ0FDbkMsTUFBTSxJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxFQUFFLGlCQUFpQixDQUFDLHNCQUFzQixDQUFDLENBQUM7Z0NBQ3ZGLElBQUksSUFBSSxJQUFJLElBQUk7b0NBQ2QsTUFBTSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7Z0NBQ3RCLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQ0FDbkMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxDQUFDO2dDQUNwQyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLEtBQUsscUJBQXFCLENBQUMsTUFBTTtvQ0FDL0UsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsQ0FBQzs7b0NBRXpDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0NBQzNDLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMscUJBQXFCLENBQUMsQ0FBQzs2QkFDNUQ7NEJBQ0QsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDOzRCQUNyRCxNQUFNLElBQUksQ0FBQyw4QkFBOEIsRUFBRSxDQUFDO3lCQUM3Qzt3QkFDRCxNQUFNO29CQUVSLEtBQUssaUJBQWlCLENBQUMsYUFBYTt3QkFFbEMsSUFBSTs0QkFDRixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQzs0QkFDckIsTUFBTSxJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxFQUFFLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLENBQUM7eUJBQ25GO2dDQUFTOzRCQUNSLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO3lCQUN2Qjt3QkFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRTs0QkFFeEIsTUFBTSxJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxFQUFFLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxDQUFDO3lCQUM3RTt3QkFDRCxNQUFNO29CQUdSLEtBQUssaUJBQWlCLENBQUMsc0JBQXNCO3dCQUMzQyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFOzRCQUNwRSxJQUFJLFdBQVcsR0FBYyxJQUFJLENBQUM7NEJBQ2xDLElBQUksb0JBQW9CLEdBQVcsTUFBTSxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7NEJBR3BHLElBQUksb0JBQW9CLElBQUksSUFBSTtnQ0FDOUIsTUFBTTs0QkFJUixLQUFLLElBQUksVUFBVSxHQUFTLElBQUksRUFBRSxVQUFVLENBQUMsT0FBTyxFQUFFLElBQUksSUFBSSxJQUFJLFVBQVUsQ0FBQyxRQUFRLEVBQUUsS0FBSyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsVUFBVSxHQUFTLFVBQVUsQ0FBQyxTQUFTLEVBQUUsRUFBRTtnQ0FDdEosV0FBVyxHQUFjLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUMsSUFBSSxFQUFFLEVBQUUsYUFBYSxDQUFDLGlCQUFpQixDQUFDLENBQUM7Z0NBQzFILElBQUksV0FBVyxJQUFJLElBQUksRUFBRTtvQ0FDdkIsSUFBSSxXQUFXLEdBQWUsV0FBVyxDQUFDLGNBQWMsRUFBRSxDQUFDO29DQUczRCxJQUFJLFdBQVcsSUFBSSxJQUFJLEVBQUU7d0NBRXZCLElBQUksTUFBTSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsS0FBSyxXQUFXLENBQUMsSUFBSTs0Q0FDdEcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQztxQ0FDbkQ7O3dDQUNDLE1BQU0sVUFBVSxDQUFDLGNBQWMsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUM7b0NBQ3JELE1BQU07aUNBQ1A7NkJBQ0Y7eUJBQ0Y7NkJBRUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRTs0QkFDekUsSUFBSSxXQUFXLEdBQVMsSUFBSSxFQUFFLFVBQVUsQ0FBQzs0QkFDekMsSUFBSSxPQUFPLEdBQVcsTUFBTSxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7NEJBRXpGLE9BQU8sV0FBVyxDQUFDLFNBQVMsRUFBRTtnQ0FDNUIsVUFBVSxHQUFHLFdBQVcsQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQ0FDckMsSUFBSSxXQUFXLENBQUMsVUFBVSxFQUFFLEtBQUssT0FBTyxFQUFFO29DQUN4QyxNQUFNLFVBQVUsQ0FBQyxjQUFjLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDO29DQUNuRCxNQUFNO2lDQUNQO2dDQUNELFdBQVcsR0FBRyxVQUFVLENBQUM7NkJBQzFCO3lCQUNGO3dCQUNELE1BQU07b0JBRVIsS0FBSyxpQkFBaUIsQ0FBQyxtQkFBbUI7d0JBQ3hDLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQWEsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO3dCQUNyRCxNQUFNO29CQUVSLEtBQUssaUJBQWlCLENBQUMsaUJBQWlCO3dCQUN0QyxNQUFNLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsQ0FBQzt3QkFDbEYsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxFQUFFOzRCQUNoQyxHQUFHLEdBQUcsY0FBYyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxVQUFVLENBQUMsQ0FBQzs0QkFDdkUsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDOzRCQUNqQyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDOzRCQUd4QyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFO2dDQUN4QixFQUFFLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dDQUNuQixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRTtvQ0FDbkIsTUFBTSxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUM7aUNBQ2xGOzZCQUNGOzRCQUVELE1BQU0sSUFBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDOzRCQUNsRixJQUFJLElBQUksSUFBSSxJQUFJO2dDQUNkLE1BQU0sSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO3lCQUN2Qjt3QkFDRCxNQUFNO29CQUVSLEtBQUssaUJBQWlCLENBQUMsd0JBQXdCLENBQUM7b0JBQ2hELEtBQUssaUJBQWlCLENBQUMsc0JBQXNCLENBQUM7b0JBQzlDLEtBQUssaUJBQWlCLENBQUMsd0JBQXdCO3dCQUM3QyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsQ0FBQzt3QkFDcEMsTUFBTTtvQkFFUixLQUFLLGlCQUFpQixDQUFDLHFCQUFxQjt3QkFDMUMsR0FBRzs0QkFDRCxjQUFjLENBQUMsa0JBQWtCLENBQy9CLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLENBQUMsVUFBVSxFQUFFLEVBQ25FLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDLENBQUM7d0JBQzFDLFlBQVksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7d0JBQ3RCLE1BQU0sTUFBTSxDQUFDLE9BQU8sQ0FBQyx3Q0FBd0MsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO3dCQUNsRixNQUFNO29CQUVSLEtBQUssaUJBQWlCLENBQUMscUJBQXFCO3dCQUcxQyxJQUFJLFVBQVUsR0FBYyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxRQUFTLENBQUMsVUFBVSxFQUFFLENBQUM7d0JBQ3BHLElBQUksYUFBYSxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRTs0QkFDbkYsT0FBTyxDQUFDLEdBQUcsQ0FBQyw2RUFBNkUsQ0FBQyxDQUFDO3lCQUM1Rjs2QkFBTTs0QkFFTCxJQUFJLFdBQVcsQ0FBQyxRQUFRLENBQUMsaUNBQWlDLEVBQUUsR0FBRyxDQUFDLEVBQUU7Z0NBQ2hFLE1BQU0sSUFBSSxDQUFDLG1DQUFtQyxFQUFFLENBQUM7NkJBQ2xEOzRCQUVELElBQUksQ0FBQyxhQUFhLENBQUMsbUNBQW1DLEVBQUU7Z0NBR3RELElBQUksOEJBQThCLEdBQzlCLGNBQWMsQ0FBQyxvQ0FBb0MsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7Z0NBQzdILGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFpQiw4QkFBOEIsQ0FBQyxDQUFDO2dDQUczRyx1QkFBdUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxPQUFPLENBQUMsd0NBQXdDLENBQUMsYUFBYSxDQUFDLENBQUM7Z0NBRXRHLE9BQU8sQ0FBQyxHQUFHLENBQUMsNkJBQTZCLENBQUMsQ0FBQztnQ0FFM0Msa0JBQWtCLENBQUMsUUFBUSxDQUFDLHlCQUF5QixHQUFHLElBQUksQ0FBQzs2QkFDOUQ7aUNBQU07Z0NBQ0wsT0FBTyxDQUFDLEdBQUcsQ0FBQyw0REFBNEQsQ0FBQyxDQUFDO2dDQUMxRSxhQUFhLENBQUMsbUNBQW1DLEdBQUcsS0FBSyxDQUFDO2dDQUMxRCxNQUFNOzZCQUNQO3lCQUNGO3dCQUNELE1BQU07b0JBQ1IsS0FBSyxpQkFBaUIsQ0FBQyx5QkFBeUIsQ0FBQztvQkFDakQsS0FBSyxpQkFBaUIsQ0FBQyx1QkFBdUI7d0JBQzVDLEdBQUcsR0FBRyxjQUFjLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLFVBQVUsQ0FBQyxDQUFDO3dCQUN2RSxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO3dCQUN0QixNQUFNLHdCQUF3QixDQUFDLG9CQUFvQixFQUFFLENBQUMsT0FBTyxDQUFDLHdDQUF3QyxDQUFDLGtCQUFrQixDQUFDLENBQUM7d0JBQzNILE1BQU07b0JBRVIsS0FBSyxpQkFBaUIsQ0FBQyxrQkFBa0I7d0JBQ3ZDLElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUU7NEJBSTFELE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLG9CQUFvQixFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7NEJBQ2pILE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQUUsQ0FBQzt5QkFFdkM7d0JBQ0QsTUFBTTtvQkFFUixLQUFLLGlCQUFpQixDQUFDLGVBQWU7d0JBSXBDLE1BQU0sYUFBYSxDQUFDLG9CQUFvQixDQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsaUNBQWlDLENBQUMsUUFBUSxDQUFDLENBQUM7d0JBQ3pHLE1BQU07b0JBR1IsS0FBSyxpQkFBaUIsQ0FBQyxTQUFTLENBQUM7b0JBQ2pDLEtBQUssaUJBQWlCLENBQUMsbUJBQW1CLENBQUM7b0JBQzNDLEtBQUssaUJBQWlCLENBQUMsZUFBZTt3QkFHcEMsSUFBSSxDQUFDLFVBQVUsS0FBSyxpQkFBaUIsQ0FBQyxtQkFBbUIsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQzs0QkFDOUYsQ0FBQyxVQUFVLEtBQUssaUJBQWlCLENBQUMsZUFBZSxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxJQUFJLENBQUMsRUFBRTs0QkFJL0UsSUFBSSxlQUFlLEdBQVMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLGtCQUFrQixFQUFFLENBQUM7NEJBQzdFLElBQUksV0FBVyxHQUFjLGtCQUFrQixDQUFDLHFCQUFxQixDQUFDLGtCQUFrQixDQUFDLGNBQWMsQ0FBQyxDQUFDOzRCQUN6RyxJQUFJLFdBQVcsSUFBSSxJQUFJO2dDQUNyQixNQUFNLElBQUksQ0FBQyxvQ0FBb0MsQ0FBQyxXQUFXLEVBQUUsaUJBQWlCLENBQUMsa0JBQWtCLENBQUMsQ0FBQzs0QkFFckcsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtnQ0FDOUIsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQyxDQUFDOzRCQUc5QyxJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLFNBQVMsQ0FBQyxlQUFlO2dDQUMvRSxNQUFNLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsQ0FBQzs0QkFFcEYsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxFQUFFO2dDQUNoQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsVUFBVSxFQUFFLENBQUM7Z0NBRWpDLElBQUksVUFBVSxLQUFLLGlCQUFpQixDQUFDLG1CQUFtQixFQUFFO29DQUN4RCxJQUFJLFFBQVEsR0FBbUIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO29DQUM5QyxJQUFJLFFBQVEsQ0FBQyxRQUFRLEVBQUU7d0NBQ3JCLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQ0FFdEMsR0FBRyxHQUFHLE1BQU0sY0FBYyxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBYSxJQUFJLENBQUMsUUFBUyxDQUFDLGVBQWUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO2lDQUN2STtxQ0FBTTtvQ0FDTCxHQUFHLEdBQUcsY0FBYyxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxHQUFHLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQWEsSUFBSSxDQUFDLFFBQVMsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDO2lDQUN4SztnQ0FFRCxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dDQUN4QyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dDQUNuQixNQUFNLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQ0FLcEMsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDLEVBQUU7b0NBQ3hJLE1BQU0sSUFBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO29DQUNsRixJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsdUJBQXVCLEVBQUU7d0NBRWpFLE1BQU0sZUFBZSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQ0FDOUMsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLFdBQVcsSUFBSSxJQUFJO3dDQUNyRCxNQUFNLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztpQ0FDOUI7O29DQUNDLE1BQU0sSUFBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDOzZCQUdyRjt5QkFDRjt3QkFDRCxNQUFNO29CQUVSLEtBQUssaUJBQWlCLENBQUMsZ0JBQWdCO3dCQUlyQyxJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLElBQUksR0FBRyxDQUFDLG1CQUFtQixFQUFFLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFLEVBQUU7NEJBQ3hGLElBQUksa0JBQWtCLEdBQXlCLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDOzRCQUM1RSxJQUFJLGtCQUFrQixJQUFJLElBQUksRUFBRTtnQ0FFOUIsSUFBSSxNQUFNLEdBQUcsSUFBSSxZQUFZLENBQUMsa0JBQWtCLEVBQUUsR0FBRyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQ0FDcEUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsQ0FBQztnQ0FDdEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQzs2QkFDeEI7eUJBQ0Y7d0JBQ0QsTUFBTTtpQkFFVDthQUNGO1NBR0Y7Z0JBQVM7WUFDUixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7U0FDbkI7SUFDSCxDQUFDO0lBTU8sS0FBSyxDQUFDLHdCQUF3QixDQUFDLElBQVU7UUFDL0MsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssU0FBUyxDQUFDLGVBQWU7WUFDOUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLDhDQUE4QyxDQUFDLENBQUM7YUFDckU7WUFDSCxJQUFJLE1BQU0sR0FBbUIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzVDLE1BQU0sTUFBTSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDbEQ7SUFDSCxDQUFDO0lBRU8sS0FBSyxDQUFDLG9CQUFvQixDQUFDLElBQVU7UUFDM0MsSUFBSSxNQUFNLEdBQW1CLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUM1QyxNQUFNLE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFPTyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQVUsRUFBRSxjQUF5QjtRQUM3RCxJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hDLElBQUksR0FBRyxHQUFtQixjQUFjLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLGNBQWMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQ2pILElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZDLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyx3Q0FBd0MsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBQ3BHLENBQUM7SUFTTyxNQUFNLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLElBQVUsRUFBRSxZQUEyQixFQUFFLFlBQStDO1FBQ2hJLElBQUksaUJBQWlCLEdBQTBCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztRQUN0RSxvQkFBb0IsQ0FBQyx5QkFBeUIsR0FBRyxJQUFJLENBQUM7UUFJdEQsSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFdEQsSUFBSSxHQUFHLEdBQW1CLGNBQWMsQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDckcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0QixNQUFNLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyx3Q0FBd0MsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBRTdGLG9CQUFvQixDQUFDLHlCQUF5QixHQUFHLEtBQUssQ0FBQztJQUN6RCxDQUFDO0lBY08sS0FBSyxDQUFDLGVBQWUsQ0FBQyxHQUFpQixFQUFFLElBQVUsRUFBRSxJQUFZLEVBQUUsSUFBZSxFQUFFLEdBQVcsRUFBRSxlQUF3QjtRQUcvSCxJQUFJLElBQUksQ0FBQyxpQkFBaUI7WUFDeEIsT0FBTztRQUVULElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7UUFFOUIsSUFBSSxPQUFPLEdBQVcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3JDLElBQUksZUFBZSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxXQUFXLENBQUM7UUFTakQsSUFBSSxPQUFPLEtBQUssU0FBUyxDQUFDLGVBQWUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUU7WUFDekQsSUFBSSxlQUFlLEVBQUU7Z0JBQ25CLElBQUksR0FBRyxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxjQUFjLENBQUMsRUFBRTtvQkFDbEcsSUFBSSxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLHdCQUF3QixFQUFFLEtBQUssQ0FBQyxFQUFFO3dCQUN2RSxJQUFJLFNBQVMsR0FBRyxNQUFNLFVBQVUsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO3dCQUN4RixJQUFJLENBQUMsU0FBUyxFQUFFOzRCQUNkLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7NEJBQy9CLE9BQU87eUJBQ1I7cUJBQ0Y7aUJBQ0Y7YUFDRjtZQUVELElBQUksVUFBVSxHQUEwQixHQUFHLENBQUMsT0FBTyxFQUFFLENBQUM7WUFLdEQsSUFBSSxjQUFjLENBQUMsV0FBVyxDQUFDLHdCQUF3QixFQUFFLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLFNBQVMsQ0FBQyxnQkFBZ0I7bUJBQ3BHLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLFNBQVMsQ0FBQyxnQkFBZ0IsRUFBRTtnQkFFN0QsSUFBSSxNQUFNLEdBQVksTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFFdkYsSUFBSSxNQUFNLEVBQUU7b0JBQ1YsSUFBSSxrQkFBa0IsR0FBWSxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLDhCQUE4QixFQUFFLElBQUksQ0FBQyxDQUFDO29CQUUzRyxJQUFlLElBQUksQ0FBQyxRQUFTLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLGtCQUFrQixFQUFFO3dCQUNsRSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO3dCQUNsQixJQUFJLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO3FCQUN0QztpQkFDRjthQUNGO1lBRUQsSUFBSSxlQUFlLEVBQUU7Z0JBR25CLElBQUksSUFBSSxDQUFDLG9CQUFvQixDQUFDLGNBQWMsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFO29CQUMzRixNQUFNLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLEVBQWlCLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxZQUFZLEVBQUUsaUNBQWlDLENBQUMsTUFBTSxDQUFDLENBQUM7aUJBQ3hJO2FBQ0Y7WUFFRCxNQUFNLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsVUFBVSxDQUFDLENBQUM7U0FDeEU7YUFFSTtZQUNILElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBR3pDLElBQUksa0JBQWtCLEdBQWMsa0JBQWtCLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUMvRSxJQUFJLGtCQUFrQixLQUFLLElBQUksRUFBRTtnQkFDL0Isa0JBQWtCLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsQ0FBQzthQUM1RTtZQUNELElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLEVBQUU7Z0JBQ2pCLE1BQU0sSUFBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2dCQUNsRixNQUFNLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUMvQztTQUNGO1FBSUQsSUFBSSxHQUFHLENBQUMsTUFBTSxFQUFFO1lBQ2QsTUFBTSxJQUFJLENBQUMsb0NBQW9DLENBQUMsSUFBSSxFQUFFLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBR3ZGLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUUzQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO0lBQ2pDLENBQUM7SUFVTyxNQUFNLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEdBQWlCLEVBQUUsSUFBVSxFQUFFLElBQVksRUFBRSxHQUFXLEVBQUUsVUFBaUM7UUFHL0gsSUFBSSxHQUFHLENBQUMsTUFBTSxJQUFJLFVBQVUsS0FBSyxxQkFBcUIsQ0FBQyxNQUFNO1lBQzNELEdBQUcsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFMUIsSUFBSSxJQUFJLEtBQUssSUFBSSxFQUFFO1lBRWpCLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFLEtBQUssSUFBSTtnQkFDbkMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUMsWUFBWSxFQUFFLENBQUM7WUFFMUMsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztTQUMzQztJQUNILENBQUM7SUFXTyxLQUFLLENBQUMsbUJBQW1CLENBQUMsSUFBVSxFQUFFLEVBQVksRUFBRSxHQUFXLEVBQUUsb0JBQTZCO1FBQ3BHLElBQUksY0FBeUIsQ0FBQztRQUM5QixJQUFJLE1BQU0sR0FBbUIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzVDLElBQUksZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN6RSxJQUFJLFVBQWlDLENBQUM7UUFDdEMsSUFBSSxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLHNCQUFzQixFQUFFLElBQUksQ0FBQyxFQUFFO1lBQ3BFLGNBQWMsR0FBYyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUNyRCxJQUFJLGNBQWMsS0FBSyxJQUFJO2dCQUN6QixNQUFNLElBQUksQ0FBQyxvQ0FBb0MsQ0FBQyxjQUFjLEVBQUUsaUJBQWlCLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUN4RyxJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLEVBQUU7Z0JBQ2hDLFVBQVUsR0FBRyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBRzNCLEdBQUcsQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDaEIsR0FBRyxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFFMUMsSUFBSSxVQUFVLEtBQUsscUJBQXFCLENBQUMsTUFBTTtvQkFDN0MsR0FBRyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFHN0IsSUFBSSxHQUFHLENBQUMsUUFBUSxJQUFJLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsc0JBQXNCLEVBQUUsS0FBSyxDQUFDLEVBQUU7b0JBQ3JGLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLENBQUM7b0JBQ3pDLE1BQU0sSUFBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO29CQUVsRixJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUU7d0JBQ3ZCLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFOzRCQUNyQixNQUFNLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDOzRCQUM3QixHQUFHLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO3lCQUMzQjt3QkFFRCxHQUFHLENBQUMsU0FBUyxFQUFFLENBQUM7d0JBQ2hCLEdBQUcsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7d0JBQ3hCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDN0IsTUFBTSxJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxFQUFFLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLENBQUM7d0JBQ2xGLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQzt3QkFDNUIsT0FBTyxJQUFJLENBQUM7cUJBQ2I7aUJBQ0Y7Z0JBS0QsR0FBRyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUU3QixJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUV6QyxJQUFJLGlCQUFpQixHQUFZLG9CQUFvQixDQUFDO2dCQUV0RCxJQUFJLENBQUMsaUJBQWlCLEVBQUU7b0JBQ3RCLElBQUksSUFBSSxDQUFDLHVCQUF1QixFQUFFLElBQUksTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyx3QkFBd0IsRUFBRSxLQUFLLENBQUMsRUFBRTt3QkFDekcsSUFBSSxTQUFTLEdBQVksTUFBTSxVQUFVLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsa0JBQWtCLENBQUMsQ0FBQzt3QkFDakcsSUFBSSxDQUFDLFNBQVMsRUFBRTs0QkFDZCxHQUFHLENBQUMsU0FBUyxFQUFFLENBQUM7NEJBQ2hCLEdBQUcsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7NEJBQ3hCLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLENBQUM7NEJBQ3pDLElBQUksY0FBYyxLQUFLLElBQUk7Z0NBQ3pCLE1BQU0sSUFBSSxDQUFDLG9DQUFvQyxDQUFDLGNBQWMsRUFBRSxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDOzRCQUV4RyxJQUFJLGdCQUFnQixFQUFFO2dDQUNwQixJQUFJLE1BQU0sR0FBbUIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dDQUM1QyxNQUFNLE1BQU0sQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDOzZCQUNsRDs0QkFFRCxPQUFPLElBQUksQ0FBQzt5QkFDYjtxQkFDRjtpQkFDRjtnQkFFRCxNQUFNLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztnQkFDbEYsR0FBRyxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUU5QixJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUU7b0JBQ3ZCLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFO3dCQUNyQixNQUFNLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO3dCQUM3QixHQUFHLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO3FCQUMzQjtvQkFFRCxHQUFHLENBQUMsU0FBUyxFQUFFLENBQUM7b0JBQ2hCLEdBQUcsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7b0JBQ3hCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDN0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztvQkFDekMsTUFBTSxJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxFQUFFLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLENBQUM7b0JBQ2xGLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFFNUIsT0FBTyxJQUFJLENBQUM7aUJBQ2I7Z0JBSUQsSUFBSSxVQUFVLEtBQUsscUJBQXFCLENBQUMsTUFBTSxFQUFFO29CQUMvQyxHQUFHLENBQUMsU0FBUyxFQUFFLENBQUM7b0JBQ2hCLEdBQUcsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7aUJBQ3pCO2dCQUVELElBQUksVUFBVSxHQUFXLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFFekMsSUFBSTtvQkFZRixJQUFJLEdBQUcsS0FBSyxVQUFVO3dCQUNwQixNQUFNLEVBQUUsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO29CQUkxQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRTt3QkFDcEIsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztpQkFDdEM7d0JBQVM7b0JBRVIsSUFBSSxHQUFHLEtBQUssVUFBVSxFQUFFO3dCQUN0QixNQUFNLEVBQUUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO3dCQUMvQyxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDOzRCQUNwQixJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO3FCQUM1QztvQkFHRCxJQUFJLG9CQUFvQjt3QkFDdEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztpQkFDNUM7YUFDRjtTQUNGO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBTU8sS0FBSyxDQUFDLG1CQUFtQixDQUFDLEdBQWlCO1FBQ2pELElBQUksSUFBSSxHQUFlLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNyQyxJQUFJLElBQUksR0FBbUIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzFDLElBQUksRUFBRSxHQUF1QixJQUFJLENBQUMsUUFBUSxDQUFDO1FBQzNDLElBQUksVUFBVSxHQUFXLEdBQUcsQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUMvQyxJQUFJLEdBQUcsR0FBbUIsSUFBSSxDQUFDO1FBRS9CLElBQUksVUFBVSxLQUFLLGlCQUFpQixDQUFDLHdCQUF3QjtZQUMzRCxJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDO1FBRXBDLElBQUksVUFBVSxLQUFLLGlCQUFpQixDQUFDLHNCQUFzQixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxTQUFTLENBQUMsZ0JBQWdCLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLHNCQUFzQixFQUFFLElBQUksQ0FBQyxFQUFFO1lBQ2pMLE1BQU0sSUFBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUM3RTthQUFNO1lBQ0wsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUM7WUFDN0UsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxFQUFFO2dCQUNoQyxNQUFNLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsQ0FBQzthQUNuRjtZQUNELElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUU7Z0JBQ3pFLElBQUksVUFBVSxLQUFLLGlCQUFpQixDQUFDLHdCQUF3QixFQUFFO29CQUM3RCxJQUFJLFVBQVUsR0FBVyxDQUFDLENBQUM7b0JBQzNCLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLEVBQUU7d0JBQ3pCLElBQUksR0FBRyxDQUFDLDBCQUEwQixFQUFFLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTs0QkFDMUQsVUFBVSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO3lCQUN6Qzt3QkFDRCxHQUFHLEdBQUcsY0FBYyxDQUFDLDRCQUE0QixDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxVQUFVLEVBQUUsRUFBRSxDQUFDLFlBQVksRUFBRSxVQUFVLENBQUMsQ0FBQztxQkFDL0c7eUJBQU07d0JBQ0wsSUFBSSxJQUFJLENBQUMsYUFBYTs0QkFDcEIsVUFBVSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO3dCQUUxQyxJQUFJLGFBQWEsR0FBWSxJQUFJLENBQUM7d0JBQ2xDLElBQUksVUFBVSxLQUFLLGlCQUFpQixDQUFDLHdCQUF3QixJQUFJLEdBQUcsQ0FBQyxVQUFVLEVBQUUsS0FBSyxJQUFJLElBQUksR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsRUFBRTs0QkFDOUgsSUFBSSxhQUFxQixDQUFDOzRCQUMxQixhQUFhLEdBQUcsTUFBTSxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7NEJBQ25GLGFBQWEsR0FBRyxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxJQUFJLGFBQWEsS0FBSyxHQUFHLENBQUMsQ0FBQzt5QkFDN0U7d0JBRUQsSUFBSSxhQUFhOzRCQUNmLEdBQUcsR0FBRyxNQUFNLGNBQWMsQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxHQUFHLENBQUMsVUFBVSxFQUFFLEVBQUUsRUFBRSxDQUFDLFlBQVksQ0FBQyxDQUFDO3FCQUNySTtpQkFDRjtxQkFFSTtvQkFDSCxJQUFJLEVBQVUsQ0FBQztvQkFFZixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxJQUFJO3dCQUN6QixFQUFFLEdBQUcsQ0FBQyxDQUFDO3lCQUNKLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLFlBQVksRUFBRTt3QkFDcEMsRUFBRSxHQUFHLENBQVksSUFBSSxDQUFDLFFBQVMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDOzt3QkFFdEQsRUFBRSxHQUFjLElBQUksQ0FBQyxRQUFTLENBQUMsV0FBVyxDQUFZLElBQUksQ0FBQyxRQUFTLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztvQkFFL0YsR0FBRyxHQUFHLGNBQWMsQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQztpQkFDekY7Z0JBR0QsSUFBSSxVQUFVLEtBQUssaUJBQWlCLENBQUMsd0JBQXdCO29CQUUzRCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBRW5DLElBQUksR0FBRyxLQUFLLElBQUk7b0JBQ2QsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFFMUMsSUFBSSxDQUFDLHFCQUFxQixHQUFHLEtBQUssQ0FBQztnQkFFbkMsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRTtvQkFFekUsSUFBSSxVQUFVLEtBQUssaUJBQWlCLENBQUMsc0JBQXNCLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLEVBQUU7d0JBQ25GLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQ25CLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFOzRCQUNuQixJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLENBQUM7NEJBQ3BDLE1BQU0sSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDO3lCQUNsRjtxQkFDRjtvQkFHRCxJQUFJLFVBQVUsS0FBSyxpQkFBaUIsQ0FBQyx3QkFBd0IsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssU0FBUyxDQUFDLGVBQWUsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRTt3QkFDdEksSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssU0FBUyxDQUFDLGdCQUFnQixFQUFFOzRCQUNqRCxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDOzRCQUN6QyxDQUFZLElBQUksQ0FBQyxRQUFTLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQzt5QkFDdEQ7d0JBQ0QsTUFBTSxFQUFFLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO3FCQUMvQjt5QkFBTSxJQUFJLFVBQVUsS0FBSyxpQkFBaUIsQ0FBQyx3QkFBd0IsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssU0FBUyxDQUFDLGVBQWUsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRTt3QkFDN0ksTUFBTSxFQUFFLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO3FCQUMvQjtvQkFLRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzlCLE1BQU0sSUFBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO29CQUNsRixJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsRUFBRTt3QkFDbkUsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDOzRCQUN0SSxNQUFNLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztxQkFDckY7aUJBQ0Y7YUFDRjtTQUNGO0lBQ0gsQ0FBQztJQU9PLEtBQUssQ0FBQyxjQUFjLENBQUMsSUFBVTtRQUNyQyxJQUFJLEdBQW1CLENBQUM7UUFDeEIsTUFBTSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFekIsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUM7UUFDN0UsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtZQUM5QixNQUFNLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUNwRixJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLEVBQUU7WUFDaEMsR0FBRyxHQUFHLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUNoRyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3hDLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLFNBQVMsQ0FBQyxlQUFlO2dCQUMvQyxNQUFNLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUNwRixNQUFNLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMzQyxNQUFNLElBQUksQ0FBQyw4QkFBOEIsRUFBRSxDQUFDO1lBQzVDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUVyRCxNQUFNLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUMzQztJQUNILENBQUM7SUFRTyxLQUFLLENBQUMsa0JBQWtCLENBQUMsR0FBaUIsRUFBRSxRQUFpQjtRQUNuRSxJQUFJLElBQUksR0FBZSxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDckMsSUFBSSxFQUFZLENBQUM7UUFDakIsSUFBSSxHQUFHLEdBQVcsSUFBSSxDQUFDO1FBQ3ZCLElBQUksSUFBZSxDQUFDO1FBQ3BCLElBQUksV0FBVyxHQUFZLEtBQUssQ0FBQztRQUNqQyxJQUFJLGVBQWUsR0FBWSxLQUFLLENBQUM7UUFDckMsSUFBSSxXQUFvQixDQUFDO1FBRXpCLElBQUksSUFBSSxDQUFDLGNBQWMsSUFBSSxHQUFHLENBQUMsZUFBZSxFQUFFLEtBQUssaUJBQWlCLENBQUMsaUJBQWlCLElBQUksR0FBRyxDQUFDLGVBQWUsRUFBRSxLQUFLLGlCQUFpQixDQUFDLGtCQUFrQjtZQUN4SixPQUFPO1FBRVQsSUFBSSxHQUFHLENBQUMsT0FBTyxFQUFFLEtBQUssY0FBYyxDQUFDLG1CQUFtQixFQUFFO1lBQ3hELEVBQUUsR0FBYSxJQUFJLENBQUMsUUFBUSxDQUFDO1lBQzdCLEdBQUcsR0FBRyxFQUFFLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDdEIsSUFBSSxHQUFjLEdBQUcsQ0FBQyxPQUFPLENBQUM7WUFFOUIsUUFBUSxHQUFHLENBQUMsZUFBZSxFQUFFLEVBQUU7Z0JBQzdCLEtBQUssaUJBQWlCLENBQUMsaUJBQWlCO29CQUN0QyxJQUFJLFFBQVEsRUFBRTt3QkFFWixJQUFJLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixFQUFFOzRCQUNuQyxNQUFNLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO3dCQUN4QyxNQUFNLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO3dCQUN4RSxNQUFNLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztxQkFDMUI7b0JBQ0QsTUFBTTtnQkFFUixLQUFLLGlCQUFpQixDQUFDLGlCQUFpQjtvQkFDdEMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUUvQixJQUFJLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxFQUFFO3dCQUNqQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQ25DLE9BQU87cUJBQ1I7b0JBR0QsSUFBSSxDQUFDLHFCQUFxQixHQUFHLEtBQUssQ0FBQztvQkFFbkMsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO3dCQUd2QixJQUFJLEdBQUcsQ0FBQyxPQUFPLEVBQUUsS0FBSyxxQkFBcUIsQ0FBQyxNQUFNOzRCQUNoRCxHQUFHLENBQUMsU0FBUyxFQUFFLENBQUM7d0JBR2xCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLFNBQVMsQ0FBQyxrQkFBa0IsRUFBRTs0QkFDcEQsSUFBSSxJQUFJLEdBQWMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7NEJBQ2xELElBQUksSUFBSSxLQUFLLElBQUk7Z0NBQ2YsSUFBSSxHQUFjLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDOzRCQUU3QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7NEJBQzdCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQzs0QkFJaEMsSUFBSSxJQUFJLElBQUksSUFBSSxFQUFFO2dDQUVoQixJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2dDQUUzQyxJQUFJLFlBQVksR0FBWSxJQUFJLENBQUMsWUFBWSxDQUFDO2dDQUM5QyxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztnQ0FDMUIsTUFBTSxJQUFJLENBQUMsb0NBQW9DLENBQUMsSUFBSSxFQUFFLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDLENBQUM7Z0NBQzVGLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDOzZCQUNsQzs0QkFJRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7eUJBQzdCO3dCQUNELE9BQU87cUJBQ1I7eUJBQU07d0JBR0wsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7cUJBQ3ZDO29CQUVELElBQUksR0FBRyxJQUFJLElBQUksRUFBRTt3QkFDZixXQUFXLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQzt3QkFDM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLElBQUksR0FBRyxDQUFDLG1CQUFtQixFQUFFLEVBQUU7NEJBQzVDLElBQUksQ0FBQyxPQUFPLEVBQUcsQ0FBQyxlQUFlLEVBQUUsQ0FBQzs0QkFDM0MsR0FBRyxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFDO3lCQUNqQzt3QkFDRCxlQUFlLEdBQUcsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLEtBQUsscUJBQXFCLENBQUMsTUFBTSxDQUFDLENBQUM7d0JBRW5FLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLHNCQUFzQixFQUFFLEtBQUssQ0FBQyxDQUFDO3dCQVdoRixJQUFJLGVBQWUsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssU0FBUyxDQUFDLGdCQUFnQjs0QkFDbEUsQ0FBQyxlQUFlLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxXQUFXLElBQUksV0FBVyxDQUFDLEVBQUU7NEJBQzVFLEdBQUcsQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLENBQUM7NEJBQzFDLE1BQU0sRUFBRSxDQUFDLGlCQUFpQixFQUFFLENBQUM7NEJBQzdCLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7NEJBRXBCLElBQUksV0FBVyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxTQUFTLENBQUMsZUFBZSxFQUFFO2dDQUMvRCxJQUFJLEdBQUcsQ0FBQyxZQUFZLEVBQUU7b0NBQ3BCLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsRUFBRTtvQ0FFakUsTUFBTSxFQUFFLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7b0NBQ3BELElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxZQUFZLENBQUMsc0JBQXNCLENBQUMsQ0FBQztvQ0FDcEUsTUFBZSxJQUFJLENBQUMsT0FBTyxFQUFHLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO2lDQUNoRjs2QkFHRjt5QkFDRjt3QkFLRCxJQUFJLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQzs0QkFFeEMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxFQUFFOzRCQUMxRixJQUFJLENBQUMsQ0FBQyxlQUFlLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQztnQ0FDckUsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQzt5QkFDdkQ7d0JBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRTs0QkFHckYsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsS0FBSyxxQkFBcUIsQ0FBQyxNQUFNO2dDQUNqRCxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssU0FBUyxDQUFDLGdCQUFnQixDQUFDO2dDQUM5QyxHQUFHLENBQUMsT0FBTyxFQUFFLEtBQUsscUJBQXFCLENBQUMsTUFBTTtnQ0FDOUMsSUFBSSxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLG1CQUFtQixDQUFDO29DQUM1RCxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQzt5QkFDNUM7cUJBQ0Y7b0JBQ0QsTUFBTTtnQkFFUixLQUFLLGlCQUFpQixDQUFDLGtCQUFrQjtvQkFDdkMsSUFBSSxRQUFRLEVBQUU7d0JBTVosSUFBSSxNQUFNLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxJQUFJLEtBQUssa0JBQWtCLENBQUMscUJBQXFCLEVBQUUsRUFBRTs0QkFFbEYsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7NEJBRXRCLElBQUksSUFBSSxDQUFDLDJCQUEyQixFQUFFO2dDQUNwQyxNQUFjLElBQUksQ0FBQyxRQUFRLEVBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQzs0QkFJakQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDOzRCQUU3QixrQkFBa0IsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDOzRCQUl0RCxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7NEJBRTVELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQzs0QkFFaEMsU0FBUyxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7NEJBQzlCLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO3lCQUMzQjs2QkFBTTs0QkFDTCxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQzs0QkFDMUIsTUFBTSxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7eUJBQ2hFO3FCQUNGO29CQUVELE1BQU07Z0JBRVIsS0FBSyxpQkFBaUIsQ0FBQyxrQkFBa0I7b0JBRXZDLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsRUFBRTt3QkFFaEMsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLEVBQUU7NEJBQzFCLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO3lCQUM1Qjt3QkFDRCxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDLGdCQUFnQjs0QkFDOUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxDQUFDO3dCQUVwRSxJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUU7NEJBQ3RELElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FBQzt3QkFDbEUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxDQUFDLENBQUM7cUJBRXhFO29CQUVELElBQUksUUFBUSxFQUFFO3dCQUNaLElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFLEVBQUU7NEJBRy9CLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDOzRCQUN0QixPQUFPO3lCQUNSO3dCQUtELElBQUksR0FBRyxHQUFpQixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7d0JBQ3hDLElBQUksR0FBRyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDLGNBQWMsQ0FBQzs0QkFDN0QsTUFBTSxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7d0JBRTVCLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLENBQUM7d0JBQzNDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDL0IsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEtBQUssQ0FBQzt3QkFDakMsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQywyQkFBMkIsQ0FBQzs0QkFDaEUsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQzt3QkFDckYsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7d0JBQzdCLGtCQUFrQixDQUFDLHFCQUFxQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQzt3QkFFckQsSUFBSSxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLHVCQUF1QixDQUFDOzRCQUNoRSxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztxQkFDMUM7b0JBQ0QsTUFBTTtnQkFFUixLQUFLLGlCQUFpQixDQUFDLGtCQUFrQjtvQkFDdkMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUM7b0JBQ3pDLE1BQU07Z0JBRVIsS0FBSyxpQkFBaUIsQ0FBQyxrQkFBa0I7b0JBQ3ZDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDO29CQUN6QyxNQUFNO2dCQUdSLEtBQUssaUJBQWlCLENBQUMscUJBQXFCO29CQUMxQyxJQUFJLElBQUksR0FBVyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQ2xDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksSUFBSSxJQUFJLElBQUksRUFBRTt3QkFDdEMsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUU7NEJBQ3JDLENBQUMsQ0FBQyxTQUFTLENBQUMsYUFBYTs0QkFDekIsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxjQUFjLEVBQzFCLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO3dCQUVqQyxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUU7NEJBQ3ZCLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO3FCQUMxQztvQkFDRCxNQUFNO2dCQUdSLEtBQUssaUJBQWlCLENBQUMsNEJBQTRCO29CQUVqRCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxFQUFFO3dCQUNqQyxDQUFDLElBQUksQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDOzt3QkFFeEIsTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7b0JBR3ZELElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTt3QkFDdkIsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7b0JBQ3pDLE1BQU07Z0JBRVIsS0FBSyxpQkFBaUIsQ0FBQyx5QkFBeUI7b0JBQzlDLElBQUksY0FBYyxHQUFhLE1BQU0sR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQUUsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7b0JBQ3pILE1BQWtCLElBQUssQ0FBQyw0QkFBNEIsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLEVBQUUsY0FBYyxDQUFDLENBQUM7b0JBQ3JGLE1BQU07YUFFVDtTQUNGO0lBQ0gsQ0FBQztJQU9ELEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxJQUFjLEVBQUUsU0FBaUI7UUFDOUQsSUFBSSxLQUFLLEdBQWlCLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pELElBQUksV0FBVyxHQUFZLENBQUMsU0FBUyxLQUFLLGlCQUFpQixDQUFDLFdBQVcsSUFBSSxTQUFTLEtBQUssaUJBQWlCLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFekgsS0FBSyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUU3QixJQUFJLFdBQVc7WUFDYixJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDO1FBRW5DLElBQUk7WUFDRixLQUFLLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUM3QixLQUFLLENBQUMsT0FBTyxDQUFZLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUM7WUFDbkQsS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN2QixNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQ3RDO2dCQUFTO1lBQ1IsSUFBSSxXQUFXO2dCQUNiLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxLQUFLLENBQUM7U0FDckM7SUFDSCxDQUFDO0lBUUQsS0FBSyxDQUFDLDBDQUEwQyxDQUFDLElBQWMsRUFBRSxTQUFpQixFQUFFLFlBQTBCO1FBQzVHLElBQUksY0FBYyxHQUF5QixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUNwRSxJQUFJLEtBQW1CLENBQUM7UUFFeEIsSUFBSSxTQUFTLEdBQUcsaUJBQWlCLENBQUMsY0FBYyxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxDQUFDLFlBQVksS0FBSyxZQUFZLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUM7WUFDM0osT0FBTztRQUVULElBQUksY0FBYyxLQUFLLElBQUk7WUFDekIsTUFBTSxJQUFJLENBQUMsZ0NBQWdDLENBQUMsY0FBYyxFQUFFLFNBQVMsRUFBRSxZQUFZLENBQUMsQ0FBQzthQUVsRjtZQUNILElBQUksU0FBUyxLQUFLLGlCQUFpQixDQUFDLGNBQWM7Z0JBQ2hELE1BQU0sSUFBSSxDQUFDLDBDQUEwQyxDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxhQUFhLEVBQUUsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDO2lCQUNySDtnQkFDSCxLQUFLLEdBQUcsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQy9CLEtBQUssQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQzdCLEtBQUssQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQ3BDLElBQUksaUJBQWlCLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQztvQkFDM0MsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQzs7b0JBRXJDLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUNuQztTQUNGO0lBQ0gsQ0FBQztJQVFPLEtBQUssQ0FBQyxnQ0FBZ0MsQ0FBQyxJQUFlLEVBQUUsU0FBaUIsRUFBRSxZQUEwQjtRQUMzRyxJQUFJLEtBQW1CLENBQUM7UUFFeEIsSUFBSSxTQUFTLEtBQUssaUJBQWlCLENBQUMsY0FBYztZQUNoRCxNQUFNLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLENBQUMsYUFBYSxFQUFFLFlBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQzthQUMzRztZQUNILEtBQUssR0FBRyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMvQixLQUFLLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzdCLEtBQUssQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLENBQUM7WUFLcEMsSUFBSSxTQUFTLEtBQUssaUJBQWlCLENBQUMsc0JBQXNCO2dCQUN4RCxLQUFLLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFaEMsSUFBSSxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDO2dCQUMzQyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDOztnQkFFckMsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ25DO0lBQ0gsQ0FBQztJQUtELFlBQVk7UUFDVixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDekIsQ0FBQztJQUtELFdBQVc7UUFDVCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztJQUtELFdBQVc7UUFDVCxJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSTtZQUN6QixPQUFPLElBQUksQ0FBQztRQUNkLE9BQWEsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUN6QyxDQUFDO0lBSUQsZ0JBQWdCLENBQUMsSUFBYSxFQUFFLDBCQUF3RDtRQUN0RixJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUN4QixJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7O1lBRTlCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsMEJBQTBCLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBS08sa0JBQWtCLENBQUMsSUFBYTtRQUN0QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLDBCQUEwQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFLTyxrQkFBa0IsQ0FBQyxJQUFhLEVBQUUsMEJBQXNEO1FBQzlGLElBQUksSUFBSTtZQUNOLElBQUksMEJBQTBCLElBQUksMEJBQTBCLENBQUMsR0FBRztnQkFDOUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQztpQkFDdkIsSUFBRywwQkFBMEIsSUFBSSwwQkFBMEIsQ0FBQyxNQUFNLEVBQUU7Z0JBQ3ZFLElBQUksTUFBTSxHQUFHLElBQUksSUFBSSxFQUFnQixDQUFDO2dCQUN0QyxJQUFJLEtBQW1CLENBQUM7Z0JBQ3hCLElBQUksQ0FBUyxDQUFDO2dCQUtkLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxFQUFFO29CQUNuQyxLQUFLLEdBQWlCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7b0JBQy9DLElBQUksS0FBSyxDQUFDLFlBQVksRUFBRSxFQUFFO3dCQUN4QixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7d0JBQ3hCLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7cUJBQ3BCO2lCQUNGO2dCQUVELEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUU7b0JBQ2hDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUM3QztRQUNILElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO0lBQzdCLENBQUM7SUFLRCxvQkFBb0IsQ0FBQyxJQUFlO1FBQ2xDLElBQUksSUFBSSxDQUFDLGtCQUFrQixLQUFLLElBQUksSUFBSSxJQUFJLEtBQUssSUFBSTtZQUNuRCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO0lBQ25DLENBQUM7SUFPTyxLQUFLLENBQUMsVUFBVSxDQUFDLElBQVUsRUFBRSxVQUFtQjtRQUN0RCxJQUFJLEVBQUUsR0FBdUIsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUUzQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBR3pDLE1BQWUsSUFBSSxDQUFDLE9BQU8sRUFBRyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBSzVDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsRUFBRSxFQUFFO1lBQ3BDLElBQUksRUFBRSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsRUFBRTtnQkFHM0IsSUFBSSxDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxLQUFLLHFCQUFxQixDQUFDLE1BQU0sSUFBSSxDQUFDLFVBQVUsRUFBRTtvQkFDL0UsSUFBSSxJQUFJLEdBQXlCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO29CQUMxRCxNQUFNLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztvQkFDbEYsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRTt3QkFDOUIsSUFBSSxJQUFJLEtBQUssSUFBSTs0QkFDZixNQUFNLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsQ0FBQzs7NEJBRTNDLE1BQU0sSUFBSSxDQUFDLG9DQUFvQyxDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO2lCQUNqRzthQUNGO2lCQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFO2dCQUNoQyxNQUFNLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDNUU7YUFBTTtZQUNMLE1BQU0sSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzNDLE1BQU0sSUFBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1NBQ25GO0lBQ0gsQ0FBQztJQVFPLEtBQUssQ0FBQyxlQUFlLENBQUMsSUFBVTtRQUN0QyxJQUFJLE9BQWdCLENBQUM7UUFDckIsSUFBSSxNQUFjLENBQUM7UUFDbkIsSUFBSSxHQUFXLENBQUM7UUFFaEIsSUFBSSxJQUFJLElBQUksSUFBSTtZQUNkLE9BQU8sS0FBSyxDQUFDO1FBRWYsT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsd0JBQXdCLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDOUUsSUFBSSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsSUFBSSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQzlELEdBQUcsR0FBRyxNQUFNLFVBQVUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsRUFDbkUsTUFBTSxDQUFDLG9CQUFvQixHQUFHLE1BQU0sQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1lBQ3BFLElBQUksR0FBRyxLQUFLLE1BQU0sQ0FBQyxpQkFBaUI7Z0JBQ2xDLE1BQU0sR0FBRyxHQUFHLENBQUM7aUJBRVYsSUFBSSxHQUFHLEtBQUssTUFBTSxDQUFDLGdCQUFnQjtnQkFDdEMsTUFBTSxHQUFHLEdBQUcsQ0FBQzs7Z0JBR2IsTUFBTSxHQUFHLEdBQUcsQ0FBQztTQUNoQjs7WUFDQyxNQUFNLEdBQUcsR0FBRyxDQUFDO1FBRWYsUUFBUSxNQUFNLEVBQUU7WUFDZCxLQUFLLEdBQUc7Z0JBQ04sTUFBTTtZQUVSLEtBQUssR0FBRztnQkFDTixNQUFlLElBQUksQ0FBQyxPQUFPLEVBQUcsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUN4RCxNQUFlLElBQUksQ0FBQyxPQUFPLEVBQUcsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLHFCQUFxQixDQUFDLENBQUM7Z0JBQy9FLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO2dCQUM1QixPQUFPLEtBQUssQ0FBQztZQUVmLEtBQUssR0FBRztnQkFDTixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzVCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxrQkFBa0IsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLENBQUM7Z0JBQ3RFLE1BQU0sWUFBWSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxxQkFBcUIsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzVFLE9BQU8sS0FBSyxDQUFDO1lBRWY7Z0JBQ0UsTUFBTSxDQUFDLFFBQVEsQ0FBQywwQkFBMEIsQ0FBQyx5RUFBeUU7b0JBQ2xILE9BQU8sQ0FBQyxDQUFDO2dCQUNYLE1BQU07U0FDVDtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUtELGlCQUFpQixDQUFDLGdCQUFrQztRQUNsRCxJQUFJLENBQUMsZUFBZSxHQUFHLGdCQUFnQixDQUFDO0lBQzFDLENBQUM7SUFLRCxZQUFZLENBQUMsVUFBbUI7UUFDOUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7SUFDL0IsQ0FBQztJQUtELFlBQVk7UUFDVixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDekIsQ0FBQztJQUtELGlCQUFpQjtRQUNmLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQztJQUM5QixDQUFDO0lBS0QsbUJBQW1CO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDO0lBQ25DLENBQUM7SUFNRCxXQUFXLENBQUMsS0FBbUI7UUFDN0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUtELFVBQVU7UUFDUixJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQztZQUM5QixPQUFPLElBQUksQ0FBQztRQUNkLE9BQXFCLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDNUMsQ0FBQztJQUtELHNDQUFzQztRQUVwQyxJQUFJLFdBQVcsR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDO1FBQ3RDLElBQUksSUFBSSxDQUFDLHNCQUFzQixFQUFFLElBQUksSUFBSSxFQUN6QztZQUNFLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1lBRTFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLGdCQUFnQixFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQzFELFdBQVcsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLHdCQUF3QixFQUFFLElBQUksQ0FBQyxTQUFTLENBQVEsS0FBSyxDQUFDLE9BQU8sRUFBRyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQztZQUV2SCxJQUFJLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLEVBQUU7Z0JBQ3BDLElBQUksR0FBRyxHQUFrQixJQUFJLGFBQWEsRUFBRSxDQUFDO2dCQUM3QyxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNqQyxXQUFXLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyx5QkFBeUIsRUFBRyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQzthQUNoRjtTQUNGO0lBQ0gsQ0FBQztJQUtELDBDQUEwQztRQUd4QyxJQUFJLFdBQVcsR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDO1FBRXRDLElBQUksY0FBYyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFFMUUsSUFBSSxjQUFjLEtBQUssR0FBRyxFQUFFO1lBQzFCLElBQUksb0JBQW9CLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsd0JBQXdCLENBQUMsQ0FBQztZQUN4RixJQUFJLGVBQWUsR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1lBR3BGLElBQUksZ0JBQWdCLEdBQUcsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1lBQzlDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1lBR2hELElBQUksT0FBTyxHQUFHLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsQ0FBQyx5QkFBeUIsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ3BHLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQztZQUNoQixJQUFJLGVBQWUsSUFBSSxJQUFJLEVBQUU7Z0JBQzNCLElBQUksR0FBRyxJQUFJLGFBQWEsRUFBRSxDQUFDO2dCQUMzQixJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsRUFBRSxPQUFPLENBQUMsQ0FBQzthQUN6QztZQUVELGFBQWEsQ0FBQyxRQUFRLENBQUMsc0JBQXNCLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQzlEO0lBQ0gsQ0FBQztJQUtELHNCQUFzQjtRQUNsQixPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztJQUNwQyxDQUFDO0lBS0Qsc0JBQXNCLENBQUUsS0FBa0I7UUFDeEMsSUFBSSxLQUFLLElBQUksSUFBSTtZQUNmLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUM7O1lBRWhDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDakQsQ0FBQztJQUlELGNBQWM7UUFDWixJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQztZQUM5QixPQUFPLElBQUksQ0FBQztRQUNkLE9BQXFCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDN0MsQ0FBQztJQU1ELHFCQUFxQixDQUFDLEdBQVk7UUFDaEMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEdBQUcsQ0FBQztJQUNqQyxDQUFDO0lBS0Qsa0JBQWtCO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDO0lBQ2xDLENBQUM7SUFXRCxLQUFLLENBQUMsZUFBZSxDQUFDLE1BQWMsRUFBRSxHQUFXO1FBQy9DLElBQUksR0FBbUIsQ0FBQztRQUV4QixJQUFJLE1BQU0sS0FBSyxJQUFJLEVBQUU7WUFFbkIsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2pDLElBQUk7Z0JBQ0YsR0FBRyxHQUFHLGNBQWMsQ0FBQyw4QkFBOEIsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ25FLEdBQUcsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUMxQixNQUFNLHVCQUF1QixDQUFDLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQyx3Q0FBd0MsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO2FBQ2xIO29CQUFTO2dCQUNSLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUNuQztTQUNGO0lBQ0gsQ0FBQztJQUtELGlCQUFpQjtRQUNmLE9BQU8sSUFBSSxDQUFDLFdBQVcsS0FBSyxVQUFVLENBQUMsS0FBSyxDQUFDO0lBQy9DLENBQUM7SUFLRCxrQkFBa0I7UUFDaEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDO0lBQ3RDLENBQUM7SUFLRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDO0lBQ3JDLENBQUM7SUFNRCxZQUFZO1FBQ1YsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3JDLENBQUM7SUFNTSxpQkFBaUIsQ0FBRyxLQUFtQjtRQUU1QyxJQUFJLEdBQUcsR0FBVyxDQUFDLENBQUM7UUFFcEIsSUFBSSxLQUFLLElBQUksSUFBSTtZQUNmLE9BQU8sR0FBRyxDQUFDO1FBS2IsSUFBSSxHQUFHLEtBQUssQ0FBQyxFQUFFO1lBRWIsSUFBSSxLQUFLLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQztnQkFDekIsR0FBRyxHQUFHLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQztpQkFHckIsSUFBSSxLQUFLLENBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxJQUFJLEtBQUssQ0FBQyxXQUFXLEVBQUUsS0FBSyxTQUFTLENBQUMsYUFBYSxJQUFJLEtBQUssQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDO2dCQUM5RyxHQUFHLEdBQUcsaUJBQWlCLENBQUMsb0JBQW9CLENBQUM7U0FDaEQ7UUFFRCxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDZixDQUFDO0lBTUQsWUFBWTtRQUNWLE9BQXVCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDaEQsQ0FBQztJQVFELGFBQWEsQ0FBQyxNQUFjLEVBQUUsU0FBaUIsRUFBRSxPQUFlO1FBQzdDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFHLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3JILENBQUM7SUFPRCxZQUFZO1FBQ1YsT0FBd0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUN4RCxDQUFDO0lBT0QsaUJBQWlCO1FBQ2YsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLGNBQWMsRUFBRSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQU1ELGdCQUFnQjtRQUNkLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFRRCxtQkFBbUIsQ0FBQyxNQUFjLEVBQUUsU0FBaUIsRUFBRSxPQUFlO1FBQ3BFLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxLQUFLLElBQUksRUFBRTtZQUN6QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLGNBQWMsRUFBRSxDQUFDLENBQUM7U0FDbEQ7UUFFZ0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2xGLENBQUM7SUFLRCxvQkFBb0I7UUFDbEIsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ3hCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztTQUN4RDtJQUNILENBQUM7SUFNRCxzQkFBc0I7UUFDcEIsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLEtBQUssSUFBSTtZQUN0QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFHLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDN0QsQ0FBQztJQWNELGNBQWMsQ0FBQyxJQUFlLEVBQUUsY0FBdUI7UUFDckQsSUFBSSx1QkFBdUIsR0FBd0IsSUFBSSxDQUFDO1FBQ3hELElBQUksV0FBVyxHQUFXLENBQUMsQ0FBQyxDQUFDO1FBSTdCLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLEtBQUssSUFBSSxJQUFJLENBQWtCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUczSSxJQUFxQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFHLENBQUMsSUFBSSxFQUFFLEdBQW9CLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFHLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBRzNHLElBQUksa0JBQWtCLEdBQW1CLElBQUksY0FBYyxDQUFpQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDMUcsT0FBTyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsR0FBb0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRTtvQkFDbEYsdUJBQXVCLEdBQUcsa0JBQWtCLENBQUMsR0FBRyxFQUFFLENBQUM7aUJBQ3BEO2dCQU1ELElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsSUFBSSx1QkFBdUIsQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLHVCQUF1QixDQUFDLFNBQVMsS0FBSyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksdUJBQXVCLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRTtvQkFDbk8sV0FBVyxHQUFHLHVCQUF1QixDQUFDLE9BQU8sQ0FBQztvQkFNOUMsSUFBSSxjQUFjLElBQXFCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBc0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUU7d0JBQ2xILElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztxQkFDeEQ7aUJBQ0Y7O29CQUNDLFdBQVcsR0FBRyxhQUFhLENBQUMsUUFBUSxDQUFDO2FBQ3hDO2lCQUFNO2dCQUNMLFdBQVcsR0FBRyxhQUFhLENBQUMsUUFBUSxDQUFDO2FBQ3RDO1NBQ0Y7UUFDRCxPQUFPLFdBQVcsQ0FBQztJQUNyQixDQUFDO0lBTUQsMkJBQTJCLENBQUMsMEJBQW1DO1FBQzdELElBQUksQ0FBQyx5QkFBeUIsR0FBRywwQkFBMEIsQ0FBQztJQUM5RCxDQUFDO0lBTUQsMkJBQTJCO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLHlCQUF5QixDQUFDO0lBQ3hDLENBQUM7SUFNRCxjQUFjLENBQUMsV0FBOEI7UUFDM0MsSUFBSSxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUM7SUFDbEMsQ0FBQztJQU1ELDRCQUE0QixDQUFDLFdBQW9CO1FBQy9DLElBQUksV0FBVztZQUViLElBQUksQ0FBQyxZQUFZLEdBQUcsaUJBQWlCLENBQUMsZUFBZSxDQUFDOztZQUl0RCxJQUFJLENBQUMsWUFBWSxHQUFHLGlCQUFpQixDQUFDLElBQUksQ0FBQztJQUMvQyxDQUFDO0lBTUQsY0FBYztRQUNaLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUMzQixDQUFDO0lBTUQsZUFBZTtRQUNiLE9BQU8sSUFBSSxDQUFDLFlBQVksS0FBSyxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7SUFDdEQsQ0FBQztJQU9PLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFlLEVBQUUsR0FBVztRQUV6RCxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3RDLE9BQU87UUFFVCxRQUFRLEdBQUcsRUFBRTtZQUNYLEtBQUssaUJBQWlCLENBQUMsa0JBQWtCLENBQUM7WUFDMUMsS0FBSyxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQztZQUMxQyxLQUFLLGlCQUFpQixDQUFDLGdCQUFnQjtnQkFDckMsTUFBTTtZQUVSO2dCQUNFLE9BQU87U0FDVjtRQUVELElBQUksS0FBbUIsQ0FBQztRQUN4QixLQUFLLEdBQUcsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0IsS0FBSyxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ3hELE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQU1PLFVBQVUsQ0FBQyxHQUFXO1FBQzVCLElBQUksT0FBTyxHQUFZLElBQUksQ0FBQztRQUM1QixRQUFRLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBRTtZQUM3QixLQUFLLGlCQUFpQixDQUFDLEdBQUc7Z0JBQ3hCLE9BQU8sR0FBRyxJQUFJLENBQUM7Z0JBQ2YsTUFBTTtZQUVSLEtBQUssaUJBQWlCLENBQUMsSUFBSTtnQkFHekIsT0FBTyxHQUFHLENBQUMsR0FBRyxLQUFLLGlCQUFpQixDQUFDLGNBQWMsQ0FBQyxDQUFDO2dCQUNyRCxNQUFNO1lBR1IsS0FBSyxpQkFBaUIsQ0FBQyxlQUFlO2dCQUVwQyxRQUFRLEdBQUcsRUFBRTtvQkFDWCxLQUFLLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDO29CQUMxQyxLQUFLLGlCQUFpQixDQUFDLFdBQVcsQ0FBQztvQkFDbkMsS0FBSyxpQkFBaUIsQ0FBQyxZQUFZLENBQUM7b0JBQ3BDLEtBQUssaUJBQWlCLENBQUMsY0FBYyxDQUFDO29CQUN0QyxLQUFLLGlCQUFpQixDQUFDLG9CQUFvQixDQUFDO29CQUM1QyxLQUFLLGlCQUFpQixDQUFDLGVBQWU7d0JBQ3BDLE9BQU8sR0FBRyxJQUFJLENBQUM7d0JBQ2YsTUFBTTtvQkFFUjt3QkFDRSxPQUFPLEdBQUcsS0FBSyxDQUFDO3dCQUNoQixNQUFNO2lCQUNUO2dCQUNELE1BQU07U0FDVDtRQUVELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFPTyxLQUFLLENBQUMsWUFBWSxDQUFDLElBQVUsRUFBRSxnQkFBeUI7UUFDOUQsSUFBSSxFQUFFLEdBQXVCLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDM0MsSUFBSSxHQUFHLEdBQVcsRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRWxDLElBQUksV0FBVyxHQUFZLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsc0JBQXNCLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDN0YsSUFBSSxnQkFBZ0IsR0FBWSxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLG1CQUFtQixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQy9GLElBQUksUUFBUSxHQUFZLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN2QyxJQUFJLGVBQWUsR0FBWSxJQUFJLENBQUM7UUFDcEMsSUFBSSxXQUFXLEdBQVksR0FBRyxDQUFDLFFBQVEsQ0FBQztRQUV4QyxJQUFJLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNuQyxHQUFHLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUMxQixNQUFNLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLEVBQUUsY0FBYyxDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUM3SCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsbUJBQW1CLENBQUMsRUFBRTtZQUk5RCxJQUFJO2dCQUNGLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO2dCQUN2QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzdCLE1BQU0sSUFBSSxDQUFDLHVCQUF1QixDQUFDLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLENBQUM7YUFDekU7b0JBQVM7Z0JBQ1IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO2FBQzdCO1NBQ0Y7YUFBTSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDMUIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ3pCO1lBQ0gsSUFBSSxXQUFXO2dCQUNiLEdBQUcsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7WUFNM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjO2dCQUN0QixJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUUzQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDbkIsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBS3BCLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxDQUFDLGdCQUFnQixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFFBQVEsRUFBRTtvQkFHWixFQUFFLENBQUMsY0FBYyxFQUFFLENBQUM7b0JBQ3BCLGVBQWUsR0FBRyxLQUFLLENBQUM7b0JBQ3hCLEdBQUcsQ0FBQyxTQUFTLEVBQUUsQ0FBQztvQkFDaEIsTUFBZSxJQUFJLENBQUMsT0FBTyxFQUFHLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztvQkFDeEQsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQ3ZDO3FCQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxFQUFFO29CQUMvQixNQUFNLEVBQUUsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQzs7b0JBRW5ELEVBQUUsQ0FBQyxZQUFZLEVBQUUsQ0FBQzthQUNyQjs7Z0JBUUMsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDO1NBQ3JCO1FBRUQsSUFBSSxlQUFlO1lBQ2pCLEVBQUUsQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBS0QsZ0JBQWdCLENBQUMsT0FBWTtRQUMzQixJQUFJLElBQUksR0FBUyxPQUFPLENBQUM7UUFDekIsSUFBSSxLQUFLLEdBQWlCLElBQUksWUFBWSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUV2RCxLQUFLLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLHlCQUF5QixDQUFDLENBQUM7UUFDL0QsS0FBSyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlCLEtBQUssQ0FBQyxPQUFPLENBQVksSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQztRQUNuRCxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hCLENBQUM7SUFNTyxNQUFNLENBQUMsS0FBSyxDQUFDLHNCQUFzQixDQUFDLElBQVU7UUFFcEQsSUFBSSxVQUFVLEdBQWUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzlDLElBQUksUUFBUSxHQUFhLFVBQVUsQ0FBQyxRQUFRLENBQUM7UUFDN0MsSUFBSSxTQUFTLEdBQVcsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRzlDLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxTQUFTLElBQUksSUFBSSxJQUFJLFNBQVMsQ0FBQyxRQUFRLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxFQUFFLEVBQUU7WUFDNUYsU0FBUyxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNoRCxNQUFNLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN4QyxDQUFDLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1lBQ3hDLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDMUIsSUFBSSxrQ0FBa0MsR0FBbUIsY0FBYyxDQUFDLHFCQUFxQixDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsRUFBRSxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBQ2hLLE1BQU0sVUFBVSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsa0NBQWtDLENBQUMsQ0FBQztTQUM5RTtJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsb0JBQW9CLENBQUMsRUFBd0I7UUFDakQsSUFBSSxJQUFZLENBQUM7UUFDakIsSUFBSSxhQUFxQixDQUFDO1FBQzFCLElBQUksWUFBb0IsQ0FBQztRQUV6QixJQUFJLEVBQUUsWUFBWSxXQUFXO1lBQzNCLElBQUksR0FBaUIsRUFBRyxDQUFDLFVBQVUsRUFBRSxDQUFDOztZQUV0QyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBRTdELGFBQWEsR0FBRyxPQUFPLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkQsWUFBWSxHQUFHLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVqRCxJQUFJLEVBQUUsQ0FBQyxjQUFjLEtBQUssSUFBSTtZQUM1QixNQUFNLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLEVBQUUsQ0FBQyxjQUFjLEVBQUUsYUFBYSxDQUFDLENBQUM7YUFDbkU7WUFDSCxJQUFJLENBQUMsQ0FBQyxFQUFFLFlBQVksV0FBVyxDQUFDLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEtBQUssZ0JBQWdCLENBQUMsS0FBSyxFQUFFO2dCQUN2RixNQUFNLENBQUMsUUFBUSxDQUFDLDBCQUEwQixDQUFDLGFBQWEsQ0FBQyxDQUFDO2FBQzNEO1NBQ0Y7UUFHRCxJQUFJLGtCQUFrQixHQUFZLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxTQUFTLEtBQUssa0JBQWtCLENBQUMsV0FBVyxDQUFDO1FBRTNHLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBRXhDLElBQUksYUFBYSxHQUFXLFlBQVksQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBRWpHLElBQUksS0FBSyxHQUFXLEVBQUUsQ0FBQztRQUN2QixJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ2xDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDckM7YUFBTTtZQUdMLElBQUksSUFBSSxDQUFDLHFCQUFxQixDQUFDLEVBQUUsQ0FBQyxFQUFFO2dCQUNsQyxNQUFNLFVBQVUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFBRSxZQUFZLEVBQUUsS0FBSyxDQUFDLENBQUM7YUFDMUU7WUFDRCxJQUFJLEVBQUUsWUFBWSxXQUFXLEVBQUM7Z0JBQzVCLElBQWlCLEVBQUcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUMsOEJBQThCO29CQUMzRCxFQUFHLENBQUMsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDLDRCQUE0QixFQUFFO29CQUN6RSxRQUFRLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDO29CQUduRCxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7aUJBQ3pCO2FBQ0Y7U0FDRjtRQWVELElBQUksRUFBRSxZQUFZLFdBQVcsRUFBRTtZQUU3QixJQUFrQixFQUFHLENBQUMsT0FBTyxFQUFFLEtBQUssV0FBVyxDQUFDLGlCQUFpQjtnQkFDL0MsRUFBRyxDQUFDLE9BQU8sRUFBRSxLQUFLLFdBQVcsQ0FBQyw4QkFBOEI7Z0JBQzVELEVBQUcsQ0FBQyxPQUFPLEVBQUUsS0FBSyxXQUFXLENBQUMsNEJBQTRCLEVBQUU7Z0JBQzVFLGtCQUFrQixHQUFHLEtBQUssQ0FBQzthQUM1QjtTQUNGO1FBRUQsSUFBSSxrQkFBa0IsRUFBRTtZQUl0QixJQUFJO2dCQUNGLElBQUksR0FBRyxHQUFtQixjQUFjLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztnQkFDL0QsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUM3RCxNQUFNLHdCQUF3QixDQUFDLG9CQUFvQixFQUFFLENBQUMsT0FBTyxDQUFDLHdDQUF3QyxDQUFDLGtCQUFrQixDQUFDLENBQUM7YUFDNUg7WUFBQyxPQUFPLEdBQUcsRUFBRTtnQkFDWixJQUFJLEdBQUcsWUFBWSxvQkFBb0IsRUFBRTtvQkFDdkMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztpQkFDMUM7O29CQUNDLE1BQU0sR0FBRyxDQUFDO2FBQ2I7U0FDRjtRQUVELFVBQVUsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUdELGtCQUFrQixDQUFDLFdBQW1CO1FBQ3BDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsZUFBZSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ3BFLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBR0QscUJBQXFCLENBQUMsRUFBd0I7UUFDNUMsSUFBRyxDQUFDLENBQUMsRUFBRSxZQUFZLFdBQVcsQ0FBQztZQUM3QixPQUFPLElBQUksQ0FBQztRQUlkLElBQUcsQ0FBZSxFQUFHLENBQUMsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDLDRCQUE0QjtZQUMxRCxFQUFHLENBQUMsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDLDhCQUE4QixDQUFDO1lBQ3pFLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxTQUFTLEtBQUssa0JBQWtCLENBQUMsV0FBVztZQUMxRSxPQUFPLEtBQUssQ0FBQztRQUVmLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDOUIsQ0FBQztJQUVELGtCQUFrQixDQUFDLGFBQXNCO1FBQ3ZDLElBQUksQ0FBQyxlQUFlLEdBQUcsYUFBYSxDQUFDO0lBQ3ZDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbnN0YW50cyxcclxuICBGb3JjZUV4aXQsXHJcbiAgSW50ZXJuYWxJbnRlcmZhY2UsXHJcbiAgTG9nZ2VyLFxyXG4gIExvZ2dlcl9Mb2dMZXZlbHMsXHJcbiAgTWdDb250cm9sVHlwZSxcclxuICBNaXNjLFxyXG4gIE1zZ0ludGVyZmFjZSxcclxuICBQcmlvcml0eSxcclxuICBSYWlzZUF0LFxyXG4gIFN0b3JhZ2VBdHRyaWJ1dGUsXHJcbiAgU3RyVXRpbCxcclxuICBTdWJmb3JtVHlwZVxyXG59IGZyb20gJ0BtYWdpYy14cGEvdXRpbHMnO1xyXG5pbXBvcnQge0FwcGxpY2F0aW9uRXhjZXB0aW9uLCBJbnQzMiwgTGlzdCwgTlN0cmluZywgUmVmUGFyYW0sIFN0YWNrLCBTdHJpbmdCdWlsZGVyLCBUaHJlYWQsIGlzTnVsbE9yVW5kZWZpbmVkfSBmcm9tICdAbWFnaWMteHBhL21zY29yZWxpYic7XHJcbmltcG9ydCB7XHJcbiAgQ29tbWFuZHMsXHJcbiAgQ29tbWFuZFR5cGUsXHJcbiAgRGF0YU1vZGlmaWNhdGlvblR5cGVzLFxyXG4gIEV4cFZhbCxcclxuICBGb2N1c01hbmFnZXIsXHJcbiAgR3VpQ29uc3RhbnRzLFxyXG4gIEd1aUVudmlyb25tZW50LFxyXG4gIElUYXNrLFxyXG4gIEtleWJvYXJkSXRlbSxcclxuICBMYXN0Rm9jdXNlZFZhbCxcclxuICBNYW5hZ2VyLFxyXG4gIE1nQ29udHJvbEJhc2UsXHJcbiAgTWdGb3JtQmFzZSxcclxuICBNb2RpZmllcnMsXHJcbiAgUHJvcEludGVyZmFjZSxcclxuICBSdW50aW1lQ29udGV4dEJhc2UsXHJcbiAgU3R5bGVzLFxyXG4gIFRhc2tEZWZpbml0aW9uSWRcclxufSBmcm9tICdAbWFnaWMteHBhL2d1aSc7XHJcbmltcG9ydCB7RXZlbnRTdWJUeXBlfSBmcm9tICcuLi9lbnVtcyc7XHJcbmltcG9ydCB7Um9sbGJhY2tFdmVudENvbW1hbmRfUm9sbGJhY2tUeXBlfSBmcm9tICcuLi9jb21tYW5kcy9DbGllbnRUb1NlcnZlci9Sb2xsYmFja0V2ZW50Q29tbWFuZCc7XHJcbmltcG9ydCB7TWdDb250cm9sfSBmcm9tICcuLi9ndWkvTWdDb250cm9sJztcclxuaW1wb3J0IHtNZ1ByaW9yaXR5QmxvY2tpbmdRdWV1ZX0gZnJvbSAnLi4vdXRpbC9NZ1ByaW9yaXR5QmxvY2tpbmdRdWV1ZSc7XHJcbmltcG9ydCB7Q29tcE1haW5QcmdUYWJsZX0gZnJvbSAnLi4vcnQvQ29tcE1haW5QcmdUYWJsZSc7XHJcbmltcG9ydCB7RmllbGR9IGZyb20gJy4uL2RhdGEvRmllbGQnO1xyXG5pbXBvcnQge1J1blRpbWVFdmVudH0gZnJvbSAnLi9SdW5UaW1lRXZlbnQnO1xyXG5pbXBvcnQge01nRm9ybX0gZnJvbSAnLi4vZ3VpL01nRm9ybSc7XHJcbmltcG9ydCB7RXZlbnRIYW5kbGVyLCBSZXRWYWxzfSBmcm9tICcuL0V2ZW50SGFuZGxlcic7XHJcbmltcG9ydCB7Rmxvd01vbml0b3JRdWV1ZX0gZnJvbSAnLi4vdXRpbC9GbG93TW9uaXRvclF1ZXVlJztcclxuaW1wb3J0IHtHVUlNYW5hZ2VyfSBmcm9tICcuLi9HVUlNYW5hZ2VyJztcclxuaW1wb3J0IHtUYXNrfSBmcm9tICcuLi90YXNrcy9UYXNrJztcclxuaW1wb3J0IHtUYXNrX1N1YmZvcm1FeGVjTW9kZUVudW0sIFRhc2tCYXNlfSBmcm9tICcuLi90YXNrcy9UYXNrQmFzZSc7XHJcbmltcG9ydCB7QXJndW1lbnRzTGlzdH0gZnJvbSAnLi4vcnQvQXJndW1lbnRzTGlzdCc7XHJcbmltcG9ydCB7TUdEYXRhfSBmcm9tICcuLi90YXNrcy9NR0RhdGEnO1xyXG5pbXBvcnQge0hhbmRsZXJzVGFibGV9IGZyb20gJy4uL3J0L0hhbmRsZXJzVGFibGUnO1xyXG5pbXBvcnQge01HRGF0YUNvbGxlY3Rpb259IGZyb20gJy4uL3Rhc2tzL01HRGF0YUNvbGxlY3Rpb24nO1xyXG5pbXBvcnQge1JlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb259IGZyb20gJy4uL2RhdGEvUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbic7XHJcbmltcG9ydCB7Q29tbWFuZHNQcm9jZXNzb3JCYXNlLCBDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2VuZGluZ0luc3RydWN0aW9ufSBmcm9tICcuLi9Db21tYW5kc1Byb2Nlc3NvckJhc2UnO1xyXG5pbXBvcnQge0NvbW1hbmRzVGFibGV9IGZyb20gJy4uL0NvbW1hbmRzVGFibGUnO1xyXG5pbXBvcnQge0NvbW1hbmRGYWN0b3J5fSBmcm9tICcuLi9jb21tYW5kcy9DbGllbnRUb1NlcnZlci9Db21tYW5kRmFjdG9yeSc7XHJcbmltcG9ydCB7SUNsaWVudENvbW1hbmR9IGZyb20gJy4uL2NvbW1hbmRzL0lDbGllbnRDb21tYW5kJztcclxuaW1wb3J0IHtDb21tYW5kc1Byb2Nlc3Nvck1hbmFnZXJ9IGZyb20gJy4uL0NvbW1hbmRzUHJvY2Vzc29yTWFuYWdlcic7XHJcbmltcG9ydCB7T3BlcmF0aW9ufSBmcm9tICcuLi9ydC9PcGVyYXRpb24nO1xyXG5pbXBvcnQge0NsaWVudFJlZnJlc2hDb21tYW5kfSBmcm9tICcuLi9jb21tYW5kcy9TZXJ2ZXJUb0NsaWVudC9DbGllbnRSZWZyZXNoQ29tbWFuZCc7XHJcbmltcG9ydCB7UmVtb3RlQ29tbWFuZHNQcm9jZXNzb3J9IGZyb20gJy4uL3JlbW90ZS9SZW1vdGVDb21tYW5kc1Byb2Nlc3Nvcic7XHJcbmltcG9ydCB7RXhlY3V0aW9uU3RhY2t9IGZyb20gJy4uL3J0L0V4ZWN1dGlvblN0YWNrJztcclxuaW1wb3J0IHtFeGVjdXRpb25TdGFja0VudHJ5fSBmcm9tICcuLi9ydC9FeGVjdXRpb25TdGFja0VudHJ5JztcclxuaW1wb3J0IHtFdmVudEhhbmRsZXJQb3NpdGlvbn0gZnJvbSAnLi9FdmVudEhhbmRsZXJQb3NpdGlvbic7XHJcbmltcG9ydCB7RGF0YVZpZXd9IGZyb20gJy4uL2RhdGEvRGF0YVZpZXcnO1xyXG5pbXBvcnQge0V2ZW50fSBmcm9tICcuL0V2ZW50JztcclxuaW1wb3J0IHtSZWNvcmR9IGZyb20gJy4uL2RhdGEvUmVjb3JkJztcclxuaW1wb3J0IHtDb25zdEludGVyZmFjZX0gZnJvbSAnLi4vQ29uc3RJbnRlcmZhY2UnO1xyXG5pbXBvcnQge0Zsb3dNb25pdG9ySW50ZXJmYWNlfSBmcm9tICcuLi9GbG93TW9uaXRvckludGVyZmFjZSc7XHJcbmltcG9ydCB7RGF0YVZpZXdDb21tYW5kVHlwZX0gZnJvbSAnLi4vY29tbWFuZHMvQ2xpZW50VG9TZXJ2ZXIvRGF0YXZpZXdDb21tYW5kJztcclxuaW1wb3J0IHtTZXJ2ZXJFcnJvcn0gZnJvbSAnLi4vcmVtb3RlL1NlcnZlckVycm9yJztcclxuaW1wb3J0IHtFbnZpcm9ubWVudH0gZnJvbSAnLi4vZW52L0Vudmlyb25tZW50JztcclxuaW1wb3J0IHtMYXN0Rm9jdXNlZE1hbmFnZXJ9IGZyb20gJy4uL3J0L0xhc3RGb2N1c2VkTWFuYWdlcic7XHJcbmltcG9ydCB7RXZlbnRzQWxsb3dlZFR5cGUsIElFdmVudHNNYW5hZ2VyfSBmcm9tICcuL0lFdmVudHNNYW5hZ2VyJztcclxuaW1wb3J0IHtMYW5ndWFnZURhdGF9IGZyb20gJy4uL2Vudi9MYW5ndWFnZURhdGEnO1xyXG5pbXBvcnQge1N1YmplY3R9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQge0NsaWVudE1hbmFnZXJ9IGZyb20gJy4uL0NsaWVudE1hbmFnZXInO1xyXG5pbXBvcnQge0NvbnRleHRUZXJtaW5hdGlvbkV2ZW50Q29tbWFuZH0gZnJvbSAnLi4vY29tbWFuZHMvQ2xpZW50VG9TZXJ2ZXIvQ29udGV4dFRlcm1pbmF0aW9uRXZlbnRDb21tYW5kJztcclxuaW1wb3J0IHsgQ2xlYXJFdmVudHNPblN0b3BFeGVjdXRpb24gfSBmcm9tICcuLi9BY2Nlc3NIZWxwZXInO1xyXG5cclxuXHJcbmVudW0gRXZlbnRTY29wZSB7XHJcbiAgTk9ORSA9ICcgJyxcclxuICBUUkFOUyA9ICdUJ1xyXG59XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbi8vLyAgIHRoaXMgY2xhc3MgbWFuYWdlIHRoZSBldmVudHMsIHB1dCB0aGVtIGluIGEgcXVldWUgYW5kIGhhbmRsZSB0aGVtXHJcbi8vLyA8L3N1bW1hcnk+XHJcbmV4cG9ydCBjbGFzcyBFdmVudHNNYW5hZ2VyIGltcGxlbWVudHMgSUV2ZW50c01hbmFnZXIge1xyXG4gIC8vIExPQ0FMIENPTlNUQU5UU1xyXG4gIHByaXZhdGUgc3RhdGljIFJFQUxfT05MWTogYm9vbGVhbiA9IHRydWU7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgTUFYX09QRVI6IG51bWJlciA9IDk5OTk7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgdXNlckdyYW50ZWRGb3JDb250ZXh0QWN0aXZpdHkgPSB0cnVlO1xyXG4gIHByaXZhdGUgX2V2ZW50c1F1ZXVlOiBNZ1ByaW9yaXR5QmxvY2tpbmdRdWV1ZSA9IG51bGw7IC8vIHRoZSBxdWV1ZSBvZiBldmVudHMgdG8gZXhlY3V0ZVxyXG4gIHByaXZhdGUgX2V4ZWNTdGFjazogU3RhY2s8RXhlY3V0aW9uU3RhY2s+ID0gbnVsbDsgLy8gRXhlY3V0aW9uIHN0YWNrIG9mIHJhaXNlIGV2ZW50IG9wZXJhdGlvbiBvciBjYWxscyB0byB1c2VyXHJcbiAgcHJpdmF0ZSBfcnRFdmVudHM6IFN0YWNrPFJ1blRpbWVFdmVudD4gPSBudWxsOyAvLyBBIHN0YWNrIG9mIGluLXByb2Nlc3MgcnVuLXRpbWUgZXZlbnRzICh0aGUgbGFzdCBvbmUgaXMgYXQgdGhlIHRvcCkuXHJcbiAgcHJpdmF0ZSBfc2VydmVyRXhlY1N0YWNrOiBTdGFjazxFeGVjdXRpb25TdGFjaz4gPSBudWxsOyAvLyBFeGVjdXRpb24gc3RhY2sgb2YgRXhlY3V0aW9uIHN0YWNrcyBvZiBvcGVyYXRpb25zIHRoYXRcclxuICBwcml2YXRlIF9hbGxvd0V2ZW50czogRXZlbnRzQWxsb3dlZFR5cGUgPSBFdmVudHNBbGxvd2VkVHlwZS5BTEw7XHJcbiAgcHJpdmF0ZSBfY29tcE1haW5QcmdUYWI6IENvbXBNYWluUHJnVGFibGUgPSBudWxsOyAvLyB0aGUgb3JkZXIgb2YgaGFuZGxpbmcgbWFpbiBwcm9ncmFtcyBvZiBjb21wb25lbnRzXHJcbiAgcHJpdmF0ZSBfY3VyckN0cmw6IE1nQ29udHJvbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfY3VyckZpZWxkOiBGaWVsZCA9IG51bGw7IC8vIGZvciBldmVyeSBldmVudCBleGVjdXRlZCB0aGlzIHZhcmlhYmxlIHdpbGwgY29udGFpbiB0aGUgZmllbGQgYXR0YWNoZWQgdG8gdGhlIGNvbnRyb2wgb24gd2hpY2ggdGhlIGV2ZW50IHdhcyBmaXJlZFxyXG4gIHByaXZhdGUgX2N1cnJLYmRJdGVtOiBLZXlib2FyZEl0ZW0gPSBudWxsO1xyXG4gIHByaXZhdGUgX2VuZE9mV29yazogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2V2ZW50U2NvcGU6IEV2ZW50U2NvcGUgPSBFdmVudFNjb3BlLk5PTkU7IC8vIGluc3RydWN0cyBob3cgdG8gcHJvY2VzcyBldmVudHMgd2hpY2ggYXJlIHByb3BhZ2F0ZWQgdG8gc2xhdmUgdGFza3MgZHVyaW5nIGV4ZWN1dGlvbi5cclxuICBwcml2YXRlIF9mb3JjZUV4aXQ6IEZvcmNlRXhpdCA9IEZvcmNlRXhpdC5Ob25lO1xyXG4gIHByaXZhdGUgX2ZvcmNlRXhpdFRhc2s6IFRhc2sgPSBudWxsO1xyXG4gIHByaXZhdGUgX2lnbm9yZVVua25vd25BYm9ydDogYm9vbGVhbiA9IGZhbHNlOyAvLyBUUlVFIHdoZW4gJ2Fib3J0JyBjb21tYW5kcyBvbiB1bmtub3duIHRhc2tzIG1heSBhcnJpdmVcclxuICBwcml2YXRlIF9pbml0aWFsaXplZDogYm9vbGVhbiA9IGZhbHNlOyAvLyB1c2VkIHRvIGRldGVjdCByZS1pbml0aWFsaXphdGlvblxyXG4gIHByaXZhdGUgX2lzSGFuZGxpbmdGb3JjZUV4aXQ6IGJvb2xlYW4gPSBmYWxzZTsgLy8gaW5kaWNhdGUgd2UgYXJlIGN1cnJlbnRseSBoYW5kbGluZyBhIGZvcmNlRXhpdCByZWxhdGVkIGhhbmRsZXJcclxuICBwcml2YXRlIF9pc05vblJldmVyc2libGVFeGl0OiBib29sZWFuID0gZmFsc2U7IC8vIGlzIHRoZSBjb21tYW5kIG5vbnJldmVyc2libGVcclxuICBwcml2YXRlIF9pc0luUmVjb3JkRmx1c2hFdmVudDogYm9vbGVhbiA9IGZhbHNlOyAvLyB0cnVlIGlmIGN1cnJlbnQgYWN0IGlzIE1HX0FDVF9SVF9SRUZSRVNIX1JFQ09SRFxyXG5cclxuICBwcml2YXRlIHN0YXRpYyBjbGllbnRJbmFjdGl2aXR5VGltZXJPTiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgc3RhdGljIGNsaWVudENvbnRleHRJbmFjdGl2aXR5VGltZXJBYm9ydGVkID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBsYXN0U2F2ZWRSb3V0ZUV2ZW50OiBSdW5UaW1lRXZlbnQgPSBudWxsO1xyXG4gIC8vIHdhcyBzZW50IGZyb20gdGhlIHNlcnZlci4gd2UgbmVlZCBhIHN0YWNrIG9mIGV4ZWNzdGFja3NcclxuICAvLyBoZXJlIGJlY2F1c2Ugd2UgbWlnaHQgY2FsbCBhIG5ldyBwcm9ncmFtIGJlZm9yZSB3ZSBoYW5kbGVkXHJcbiAgLy8gdGhlIHByZXZpb3VzIHNlcnZlciBleGVjIHN0YWNrXHJcbiAgcHJpdmF0ZSBfc3RvcEV4ZWN1dGlvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX3Byb2Nlc3NpbmdUb3BNb3N0RW5kVGFzazogYm9vbGVhbiA9IGZhbHNlOyAvLyBpbmRpY2F0aW9uIHdoZXRoZXIgd2UgYXJlIGN1cnJlbnRseSBwcm9jZXNzaW5nIGV2ZW50cyBmcm9tIHRoZVxyXG4gIHByaXZhdGUgX3N0b3BFeGVjdXRpb25DdHJsOiBNZ0NvbnRyb2wgPSBudWxsOyAvLyBob2xkcyB0aGUgY3RybCBvbiB3aGljaCB3ZSBnZXQgdGhlIGZpcnN0IHN0b3AgZXhlY3V0aW9uXHJcblxyXG4gIHB1YmxpYyBndWlQZW5kaW5nRXZlbnQ6IGFueSA9IG51bGw7XHJcbiAgLy8gS0VZQk9BUkQgRVZFTlRTIENPTlNUQU5UU1xyXG4gIHJlYWRvbmx5IEtCSV9ET1dOOiBLZXlib2FyZEl0ZW0gPSBudWxsO1xyXG4gIHJlYWRvbmx5IEtCSV9VUDogS2V5Ym9hcmRJdGVtID0gbnVsbDtcclxuXHJcbiAgLy8gQ09OVEVYVCBURVJNSU5BVElPTiBXQVJOSU5HIENPTlNUQU5UU1xyXG4gIHJlYWRvbmx5IGNvbmZpcm1hdGlvbkRpYWxvZ01zZzogc3RyaW5nID0gJ1RoZSBzZXJ2ZXIgY29udGV4dCBzZXJ2aW5nIHRoaXMgYXBwbGljYXRpb24gaXMgYWJvdXQgdG8gdGltZSBvdXQuIERvIHlvdSB3YW50IHRvIGNvbnRpbnVlIHlvdXIgd29yaz8nO1xyXG4gIHJlYWRvbmx5IGNvbmZpcm1hdGlvbkRpYWxvZ1RpdGxlOiBzdHJpbmcgPSAnU2Vzc2lvbiBpcyBhYm91dCB0byBiZSB0ZXJtaW5hdGVkISc7XHJcblxyXG4gIHN0YXRpYyBJbnN0YW5jZTogRXZlbnRzTWFuYWdlciA9IG5ldyBFdmVudHNNYW5hZ2VyKCk7XHJcblxyXG4gIHByaXZhdGUgX2xhc3RGYWlsZWRGb2N1c2VkQ29udHJvbDogTWdDb250cm9sQmFzZSA9IG51bGw7XHJcblxyXG4gIHByaXZhdGUgaXNTcGlubmVyU2hvd246IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIGlzSW5WaWV3UmVmcmVzaDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBTcGlubmVyU3RvcHBlZDogU3ViamVjdDxudW1iZXI+ID0gbmV3IFN1YmplY3QoKTtcclxuXHJcbiAgc3RhdGljIGNsaWVudEJ1c3lUaW1lU3RhcnQgPSAwO1xyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwcml2YXRlIENUT1IgdG8gcHJldmVudCBpbnN0YW50aWF0aW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgdGhpcy5fcnRFdmVudHMgPSBuZXcgU3RhY2soKTtcclxuXHJcbiAgICB0aGlzLl9ldmVudHNRdWV1ZSA9IG5ldyBNZ1ByaW9yaXR5QmxvY2tpbmdRdWV1ZSgpO1xyXG5cclxuICAgIHRoaXMuX2V4ZWNTdGFjayA9IG5ldyBTdGFjaygpO1xyXG4gICAgdGhpcy5fZXhlY1N0YWNrLnB1c2gobmV3IEV4ZWN1dGlvblN0YWNrKCkpO1xyXG5cclxuICAgIHRoaXMuX3NlcnZlckV4ZWNTdGFjayA9IG5ldyBTdGFjaygpO1xyXG4gICAgdGhpcy5fc2VydmVyRXhlY1N0YWNrLnB1c2gobnVsbCk7XHJcblxyXG5cclxuICAgIHRoaXMuS0JJX0RPV04gPSBuZXcgS2V5Ym9hcmRJdGVtKEd1aUNvbnN0YW50cy5LRVlfRE9XTiwgTW9kaWZpZXJzLk1PRElGSUVSX05PTkUpO1xyXG4gICAgdGhpcy5LQklfVVAgPSBuZXcgS2V5Ym9hcmRJdGVtKEd1aUNvbnN0YW50cy5LRVlfVVAsIE1vZGlmaWVycy5NT0RJRklFUl9OT05FKTtcclxuXHJcbiAgfVxyXG5cclxuICBnZXRQZW5kaW5nR3VpRXZlbnQoKTogYW55IHtcclxuICAgIHJldHVybiB0aGlzLmd1aVBlbmRpbmdFdmVudDtcclxuICB9XHJcblxyXG4gIHNldFBlbmRpbmdHdWlFdmVudChndWlFdmVudDogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLmd1aVBlbmRpbmdFdmVudCA9IGd1aUV2ZW50O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGFkZCBhbiBldmVudCB0byB0aGUgZW5kIG9mIHRoZSBxdWV1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpcnRFdnRcIj50aGUgZXZlbnQgdG8gYmUgYWRkZWQgPC9wYXJhbT5cclxuICBhZGRUb1RhaWwocnRFdnQ6IFJ1blRpbWVFdmVudCk6IHZvaWQge1xyXG4gICAgLy8gaWYgY3VycmVudCBldmVudCBpcyBub3QgaWRsZSB0aW1lIGV2ZW50IGNoZWNrIGlmIHRoZXJlIGlzIGNsaWVudEluYWN0aXZpdHlUaW1lciBydW5uaW5nP1xyXG4gICAgLy8gaWYgc28gLCBzdG9wIHRoaXMgY2xpZW50IENvbnRleHQgaW5hY3Rpdml0eSB0aW1lclxyXG4gICAgaWYgKCFydEV2dC5pc0lkbGVUaW1lcigpKSB7XHJcbiAgICAgIGlmIChFdmVudHNNYW5hZ2VyLmNsaWVudEluYWN0aXZpdHlUaW1lck9OKSB7XHJcbiAgICAgICAgRXZlbnRzTWFuYWdlci5jbGllbnRDb250ZXh0SW5hY3Rpdml0eVRpbWVyQWJvcnRlZCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcblxyXG4gICAgICAvLyBpZiBjbGllbnQgaXMgaWRsZSBhZnRlciByZWNyZWF0aW5nIGNvbnRleHQgLCB0aGVuIGFkZCBsYXN0IHNhdmVkIHJvdXRlIGV2ZW50XHJcbiAgICAgIGlmICh0aGlzLmdldExhc3RTYXZlZFJvdXRlRXZlbnQoKSAhPSBudWxsKSB7XHJcbiAgICAgICAgdGhpcy5hZGRUb1RhaWwodGhpcy5nZXRMYXN0U2F2ZWRSb3V0ZUV2ZW50KCkpO1xyXG4gICAgICAgIHRoaXMuc2V0TGFzdFNhdmVkUm91dGVFdmVudChudWxsKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX2V2ZW50c1F1ZXVlLnB1dChydEV2dCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYWRkIGFuIGtleWJvYXJkIGV2ZW50IHRvIHRoZSBlbmQgb2YgdGhlIHF1ZXVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm1nRm9ybVwiPmZvcm0gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm1nQ29udHJvbFwiPmNvbnRyb2wgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm1vZGlmaWVyXCI+bW9kaWZpZXIgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInN0YXJ0XCI+c3RhcnQgb2Ygc2VsZWN0ZWQgdGV4dCA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZW5kXCI+ZW5kIG9mIHNlbGVjdGVkIHRleHQgIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0ZXh0XCI+dGV4dCA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaW1cIj5pbSA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaXNBY3RDaGFyXCI+aXMga2V5Ym9hcmQgY2hhciA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic3VnZ2VzdGVkVmFsdWVcIj5zdWdnZXN0ZWQgdmFsdWUgZm9yIGNob2ljZSA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY29kZVwiPmNvZGUgdG8gYmUgYWRkZWQgaW4gdGhlIHF1ZXVlIDwvcGFyYW0+XHJcbiAgQWRkS2V5Ym9hcmRFdmVudChtZ0Zvcm06IE1nRm9ybUJhc2UsIG1nQ29udHJvbDogTWdDb250cm9sQmFzZSwgbW9kaWZpZXI6IE1vZGlmaWVycywga2V5Q29kZTogbnVtYmVyLCBzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlciwgdGV4dDogc3RyaW5nLCBpc0FjdENoYXI6IGJvb2xlYW4sIHN1Z2dlc3RlZFZhbHVlOiBzdHJpbmcsIGNvZGU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSAobWdDb250cm9sICE9PSBudWxsKSA/IG5ldyBSdW5UaW1lRXZlbnQoPE1nQ29udHJvbD5tZ0NvbnRyb2wsIHRydWUsIGZhbHNlKSA6IG5ldyBSdW5UaW1lRXZlbnQoPFRhc2s+bWdGb3JtLmdldFRhc2soKSwgdHJ1ZSk7XHJcblxyXG4gICAgcnRFdnQuc2V0SW50ZXJuYWwoY29kZSk7XHJcblxyXG4gICAgbGV0IG5ld0tiSXRlbTogS2V5Ym9hcmRJdGVtID0gbmV3IEtleWJvYXJkSXRlbShrZXlDb2RlLCBtb2RpZmllcik7XHJcblxyXG4gICAgaWYgKGlzQWN0Q2hhciAmJiAobWdDb250cm9sICE9PSBudWxsICYmIChtZ0NvbnRyb2wuaXNUZXh0Q29udHJvbCgpKSkpXHJcbiAgICAgIG5ld0tiSXRlbS5zZXRBY3Rpb24oSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NIQVIpO1xyXG5cclxuICAgIHJ0RXZ0LnNldEtleWJvYXJkSXRlbShuZXdLYkl0ZW0pO1xyXG5cclxuICAgIGlmIChjb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9LRVlET1dOKSB7XHJcbiAgICAgIHJ0RXZ0LnNldEVkaXRQYXJtcyhzdGFydCwgZW5kLCB0ZXh0KTtcclxuICAgIH0gZWxzZVxyXG4gICAgICBydEV2dC5zZXRWYWx1ZShzdWdnZXN0ZWRWYWx1ZSk7XHJcblxyXG4gICAgdGhpcy5hZGRUb1RhaWwocnRFdnQpO1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFFDUiA3NjAzODEgaWYgYWZ0ZXIgaGFuZGxpbmcgdGhlIGV2ZW50IHRoZSBjdXJyZW50IGNvbnRyb2wgaXMgdW5wYXJrYWJsZSB0cnlcclxuICAvLy8gICBhbiBtb3ZlIHRvIHRoZSBuZXh0IHBhcmthYmxlIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIGNoZWNrUGFya2FiaWxpdHkoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgY3VycmVudDogTWdDb250cm9sID0gTGFzdEZvY3VzZWRNYW5hZ2VyLmdldExhc3RGb2N1c2VkQ29udHJvbCgpO1xyXG5cclxuICAgIC8qIFFDUiMgOTI1NDY0LiBUaGUgcHJvYmxlbSB3YXMgdGhhdCBvbiBkZWxldGluZyBhIHJlY29yZCwgQ1Mgb2YgdGhlIGNvbnRyb2wgZ2V0cyBleGVjdXRlZC5cclxuICAgICAqIFNvLCB0aGUgdGFzaydzIGxldmVsIGlzIHNldCB0byBUQVNLLiBUaGVuIHdlIGdvIHRvIHNlcnZlciBhbiBvbiByZXR1cm5pbmcgYmFjayBmcm9tIHRoZSBzZXJ2ZXIsXHJcbiAgICAgKiB3ZSByZWZyZXNoIHRoZSBmb3JtLiBIZXJlLCBzaW5jZSB0aGUgbGFzdCBwYXJrZWQgY29udHJvbCBpLmUuIFwiZnJvbVwiIChudW1lcmljKSBpcyBoaWRkZW4sXHJcbiAgICAgKiB3ZSB0cnkgdG8gcGFyayBvbiB0aGUgbmV4dCBwYXJrYWJsZSBjb250cm9sIGZyb20gUHJvcGVydHkuUmVmcmVzaERpc3BsYXkoKS4gVGhpcyBtYWtlcyB0aGVcclxuICAgICAqIHRhc2sncyBsZXZlbCBhcyBDT05UUk9MLiBOb3csIHdlIHRyeSB0byBleGVjdXRlIFJQLCBidXQgc2luY2UgdGhlIGxldmVsIGlzIENPTlRST0wsXHJcbiAgICAgKiB3ZSBkbyBub3QgZXhlY3V0ZSBpdC4gVGhlIHNvbHV0aW9uIGlzIHRoYXQgY2hlY2tQYXJrYWJpbGl0eSgpIHdoaWNoIGlzIGNhbGxlZCBmcm9tXHJcbiAgICAgKiBQcm9wZXJ0eS5SZWZyZXNoRGlzcGxheSgpLCBzaG91bGQgdHJ5IHRvIHBhcmsgb24gdGhlIGNvbnRyb2wgb25seSBpZiB0aGUgdGFzaydzIGxldmVsIGlzIENPTlRST0wuXHJcbiAgICAgKi9cclxuICAgIGlmIChjdXJyZW50ICE9PSBudWxsICYmIChjdXJyZW50LmdldEZvcm0oKS5nZXRUYXNrKCkpLmdldExldmVsKCkgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX0NPTlRST0wgJiYgIWF3YWl0IGN1cnJlbnQuSXNQYXJrYWJsZSgpKVxyXG4gICAgICBhd2FpdCB0aGlzLkhhbmRsZU5vblBhcmthYmxlQ29udHJvbHMoY3VycmVudC5nZXRGb3JtKCkuZ2V0VGFzaygpKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIEhhbmRsZVBhcmthYmlsaXR5T25Sb3dDaGFuZ2UoaXRhc2s6IElUYXNrKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBhd2FpdCB0aGlzLkhhbmRsZU5vblBhcmthYmxlQ29udHJvbHMoaXRhc2spO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGhhbmRsZSBzaXR1YXRpb24gd2l0aCBubyBwYXJrYWJsZSBjb250cm9sc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpdGFza1wiPjwvcGFyYW0+XHJcbiAgYXN5bmMgSGFuZGxlTm9uUGFya2FibGVDb250cm9scyhpdGFzazogSVRhc2spOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCB0YXNrOiBUYXNrID0gPFRhc2s+aXRhc2s7XHJcbiAgICAvLyB3ZSBjYW4gbm90IHN0YXkgaW4gY3JlYXRlIG1vZGUgd2l0aCBubyBwYXJrYWJsZSBjb250cm9sc1xyXG4gICAgaWYgKHRhc2suZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSAmJiB0YXNrLklzSW50ZXJhY3RpdmUpIHtcclxuICAgICAgYXdhaXQgdGFzay5lbmFibGVNb2RlcygpO1xyXG4gICAgICBsZXQgb2xkTW9kZTogc3RyaW5nID0gdGFzay5nZXRPcmlnaW5hbFRhc2tNb2RlKCk7XHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKTtcclxuICAgICAgaWYgKCF0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpIHtcclxuICAgICAgICBpZiAob2xkTW9kZSAhPT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpIHtcclxuICAgICAgICAgIHRhc2suc2V0TW9kZShvbGRNb2RlKTtcclxuICAgICAgICAgIGF3YWl0ICg8RGF0YVZpZXc+dGFzay5EYXRhVmlldykuY3VyclJlY0NvbXB1dGUodHJ1ZSk7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICAgICAgICBhd2FpdCAoPE1nRm9ybT50YXNrLmdldEZvcm0oKSkuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9DVVJSX1JFQyk7XHJcbiAgICAgICAgICB0YXNrLnNldExhc3RQYXJrZWRDdHJsKG51bGwpO1xyXG4gICAgICAgICAgYXdhaXQgRm9jdXNNYW5hZ2VyLlNldEZvY3VzKHRhc2ssIG51bGwsIC0xLCB0cnVlKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgLy8gd2UgY2FuIG5vdCBzdGF5IGluIGNyZWF0ZSBtb2RlIG9yIGluIHN0b3AgZXhlY3V0aW9uIHN0YXRlIHdpdGggbm8gcGFya2FibGUgY29udHJvbHNcclxuICAgICAgLy8gRG8gbm90IGdpdmUgcGFyayBlcnJvciwgaWYgdGFzayBpcyBvcGVuZWQgaW4gY3JlYXRlIG1vZGUuIFRoaXMgaXMgdGVtcG9yYXJ5IGNoYW5nZSBmb3IgY3VzdG9tZXIgcHJvYmxlbS5cclxuICAgICAgLy90aGlzLmV4aXRXaXRoRXJyb3IodGFzaywgTXNnSW50ZXJmYWNlLlJUX1NUUl9DUlNSX0NBTlRfUEFSSyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gV2hpbGUgaGFuZGxlIG5vbi1wYXJrYWJpbGl0eSBjb25kaXRpb24sIGVuc3VyZSBDUyBpcyBjYWxsZWQgZm9yIGNvbnRyb2wgaWYgaXQgaXMgaW4gQ29udHJvbCBsZXZlbCB0aGVuIHBhcmtpbmcgaXMgc2V0IG9uIGZvcm0uXHJcbiAgICBpZiAodGFzay5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9DT05UUk9MKVxyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoTWdDb250cm9sQmFzZSh0YXNrLmdldExhc3RQYXJrZWRDdHJsKCksIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1NVRkZJWCk7XHJcblxyXG4gICAgdGFzay5zZXRMYXN0UGFya2VkQ3RybChudWxsKTtcclxuICAgIE1nQ29udHJvbC5SZXR1cm5Ub0N0cmwgPSBudWxsO1xyXG4gICAgYXdhaXQgRm9jdXNNYW5hZ2VyLlNldEZvY3VzKHRhc2ssIG51bGwsIC0xLCB0cnVlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBoYW5kbGUgYSBzaW5nbGUgZXZlbnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaXJ0RXZ0XCI+dGhlIGV2ZW50IHRvIHByb2Nlc3MgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJldHVybmVkRnJvbVNlcnZlclwiPmluZGljYXRlcyB3aGV0aGVyIHdlIHJldHVybmVkIGZyb20gdGhlIHNlcnZlciAtIHRvIGJlIHBhc3NlZCB0byBoYW5kbGVyLmV4ZWN1dGUoKSA8L3BhcmFtPlxyXG4gIGFzeW5jIGhhbmRsZUV2ZW50KHJ0RXZ0OiBSdW5UaW1lRXZlbnQsIHJldHVybmVkRnJvbVNlcnZlcjogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGhhbmRsZXI6IEV2ZW50SGFuZGxlciA9IG51bGw7XHJcbiAgICBsZXQgcG9zOiBFdmVudEhhbmRsZXJQb3NpdGlvbiA9IG5ldyBFdmVudEhhbmRsZXJQb3NpdGlvbigpO1xyXG4gICAgbGV0IHRhc2s6IFRhc2sgPSA8VGFzaz5ydEV2dC5nZXRUYXNrKCk7XHJcbiAgICBsZXQgY3RybDogTWdDb250cm9sID0gPE1nQ29udHJvbD50YXNrLmdldExhc3RQYXJrZWRDdHJsKCk7XHJcbiAgICBsZXQgZm9yY2VFeGl0RG9uZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IGVuZFRhc2tFcnJvcjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IG9sZFJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBudWxsO1xyXG4gICAgbGV0IG9sZEZvcmNlRXhpdDogRm9yY2VFeGl0ID0gdGhpcy5nZXRGb3JjZUV4aXQoKTtcclxuICAgIGxldCBvbGRGb3JjZUV4aXRUYXNrOiBUYXNrID0gdGhpcy5nZXRGb3JjZUV4aXRUYXNrKCk7XHJcbiAgICBsZXQgb2xkSXNIYW5kbGluZ0ZvcmNlRXhpdDogYm9vbGVhbiA9IHRoaXMuX2lzSGFuZGxpbmdGb3JjZUV4aXQ7XHJcbiAgICBsZXQgcmVzdG9yZUlzRm9yY2VFeGl0OiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgcmVzdG9yZUN1cnJDdHJsOiBNZ0NvbnRyb2w7XHJcbiAgICBsZXQgcmVzdG9yZUN1cnJGaWVsZDogRmllbGQgPSBudWxsO1xyXG5cclxuICAgIC8vIHRoZSBhY3Rpb24gbmVlZCB0byBiZSBjaGVjayBhY2NvcmRpbmcgdG8gdGhlIHRhc2sgb24gdGhlIGV2ZW50LlxyXG4gICAgLy8gSWYgdGhlIGFjdGlvbiBpcyBpbnRlcm5hbCAodW5kZXIgQUNUX1RPVCksIGRvIG5vdGhpbmcgaWYgaXRzIGRpc2FibGVkIG9yIG5vdCBhbGxvd2VkLlxyXG4gICAgaWYgKChydEV2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfSU5URVJOQUwpKSB7XHJcbiAgICAgIC8vIGRvIG5vdGhpbmcgaWYgYWN0aW9uIGlzIDEuIG5vdCBlbmFibGVkIDIuIHdhaXQgPT0gbm8gYW5kIGV2ZW50cyBhcmUgbm90IGFsbG93ZWRcclxuICAgICAgaWYgKHJ0RXZ0LkludGVybmFsRXZlbnQgPCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVE9UX0NOVCAmJiAoIXRhc2suQWN0aW9uTWFuYWdlci5pc0VuYWJsZWQocnRFdnQuSW50ZXJuYWxFdmVudCkgfHwgKCFydEV2dC5pc0ltbWVkaWF0ZSgpICYmIHRoaXMuTm9FdmVudHNBbGxvd2VkKCkpKSlcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9IGVsc2VcclxuICAgIC8vIGRvIHRoZSBoYW5kbGVycyB3aGVuIDEuIHdhaXQgPT0geWVzIG9yIDIuIGV2ZW50cyBhcmUgYWxsb3dlZFxyXG4gICAgaWYgKCFydEV2dC5pc0ltbWVkaWF0ZSgpICYmIHRoaXMuTm9FdmVudHNBbGxvd2VkKCkpXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICByZXN0b3JlQ3VyckN0cmwgPSB0aGlzLl9jdXJyQ3RybDtcclxuICAgIHRoaXMuX2N1cnJDdHJsID0gY3RybDsgLy8gc2F2ZSBjdXJyZW50IGNvbnRyb2wgZm9yIEhBTkRMRVJfQ1RSTCBmdW5jdGlvblxyXG5cclxuICAgIGxldCBwcm9wYWdhdGU6IGJvb2xlYW4gPSBydEV2dC5nZXRUeXBlKCkgIT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfSU5URVJOQUwgfHwgcnRFdnQuZ2V0SW50ZXJuYWxDb2RlKCkgPCAxMDAwO1xyXG5cclxuICAgIHRyeSB7XHJcblxyXG4gICAgICB0aGlzLnB1c2hSdEV2ZW50KHJ0RXZ0KTtcclxuXHJcbiAgICAgIGF3YWl0IHRoaXMuQ2hlY2tBbmRTaG93U3Bpbm5lcih0cnVlKTtcclxuXHJcbiAgICAgIC8vIGRvIHNvbWUgY29tbW9uIHByb2Nlc3NpbmcgYW5kIGlmIHRoZSByZXN1bHQgaXMgdHJ1ZSB0aGVuIGNvbnRpbnVlXHJcbiAgICAgIC8vIHdpdGggdGhlIHVzZXIgZGVmaW5lZCBoYW5kbGVyc1xyXG4gICAgICBsZXQgYlJjQmVmb3JlOiBib29sZWFuID0gYXdhaXQgdGhpcy5jb21tb25IYW5kbGVyQmVmb3JlKHJ0RXZ0KTtcclxuXHJcbiAgICAgIHJlc3RvcmVDdXJyRmllbGQgPSB0aGlzLl9jdXJyRmllbGQ7XHJcbiAgICAgIHRoaXMuX2N1cnJGaWVsZCA9IDxGaWVsZD50YXNrLmdldEN1cnJGaWVsZCgpO1xyXG5cclxuICAgICAgaWYgKGJSY0JlZm9yZSkge1xyXG4gICAgICAgIHBvcy5pbml0KHJ0RXZ0KTtcclxuICAgICAgICAvLyBnZXQgdGhlIGZpcnN0IGhhbmRsZXIgZm9yIHRoZSBjdXJyZW50IGV2ZW50XHJcbiAgICAgICAgaGFuZGxlciA9IHBvcy5nZXROZXh0KCk7XHJcblxyXG4gICAgICAgIGlmIChoYW5kbGVyICE9PSBudWxsICYmIGhhbmRsZXIuZ2V0RXZlbnQoKSAhPT0gbnVsbCAmJiBoYW5kbGVyLmdldEV2ZW50KCkuVXNlckV2dCAhPT0gbnVsbClcclxuICAgICAgICAgIHRoaXMuc2V0Rm9yY2VFeGl0KGhhbmRsZXIuZ2V0RXZlbnQoKS5Vc2VyRXZ0LkZvcmNlRXhpdCwgdGFzayk7XHJcblxyXG4gICAgICAgIC8vIGV4ZWN1dGUgdGhlIGNoYWluIG9mIGhhbmRsZXJzIGZvciB0aGUgY3VycmVudCBldmVudC4gdGhlIGV4ZWN1dGlvblxyXG4gICAgICAgIC8vIGNvbnRpbnVlcyB0aWxsIGFuIGV2ZW50IGhhbmRsZXIgcmV0dXJucyBmYWxzZS5cclxuICAgICAgICB3aGlsZSAoaGFuZGxlciAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgbGV0IGhhbmRsZXJDb250ZXh0VGFzazogVGFzayA9IG51bGw7XHJcbiAgICAgICAgICBsZXQgcnRFdnRDaGFuZ2VkOiBib29sZWFuO1xyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgbGV0IGVuYWJsZWRDbmRDaGVja2VkQW5kVHJ1ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgYSBoYW5kbGVyIGNoYW5nZSB0aGUgaGFuZGxlcidzIGNvbnRleHQgdGFzayB0byB0aGUgZXZlbnQncyB0YXNrXHJcbiAgICAgICAgICAgIGhhbmRsZXJDb250ZXh0VGFzayA9IDxUYXNrPmhhbmRsZXIuZ2V0VGFzaygpLkdldENvbnRleHRUYXNrKCk7XHJcbiAgICAgICAgICAgIGlmIChydEV2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfSU5URVJOQUwgJiYgcnRFdnQuZ2V0SW50ZXJuYWxDb2RlKCkgPj0gMTAwMCAmJiBydEV2dC5nZXRJbnRlcm5hbENvZGUoKSAhPT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1ZBUklBQkxFKVxyXG4gICAgICAgICAgICAgIGhhbmRsZXIuZ2V0VGFzaygpLlNldENvbnRleHRUYXNrKGhhbmRsZXIuZ2V0VGFzaygpKTtcclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgIGhhbmRsZXIuZ2V0VGFzaygpLlNldENvbnRleHRUYXNrKHJ0RXZ0LmdldFRhc2soKSk7XHJcblxyXG4gICAgICAgICAgICAvLyB0aGVyZSBpcyBubyBuZWVkIHRvIGhhbmRsZSBGb3JjZUV4aXQgZm9yIG5vbi11c2VyIGV2ZW50c1xyXG4gICAgICAgICAgICBpZiAoaGFuZGxlci5nZXRFdmVudCgpLmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9VU0VSICYmIGF3YWl0IGhhbmRsZXIuaXNFbmFibGVkKCkpIHtcclxuICAgICAgICAgICAgICBlbmFibGVkQ25kQ2hlY2tlZEFuZFRydWUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIHRoaXMuX2lzSGFuZGxpbmdGb3JjZUV4aXQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICByZXN0b3JlSXNGb3JjZUV4aXQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIC8vIGhhbmRsZSBmb3JjZUV4aXQgb25seSBvbmNlXHJcbiAgICAgICAgICAgICAgaWYgKGF3YWl0IHRoaXMuaGFuZGxlRm9yY2VFeGl0QmVmb3JlKGhhbmRsZXIuZ2V0RXZlbnQoKSwgcnRFdnQpKSB7XHJcbiAgICAgICAgICAgICAgICBmb3JjZUV4aXREb25lID0gdHJ1ZTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZSBjdXJyZW50IHJ1biB0aW1lIGV2ZW50IGlzIGRpZmZlcmVudCBmcm9tIHRoZSBldmVudFxyXG4gICAgICAgICAgICAvLyBvZiB0aGUgaGFuZGxlclxyXG4gICAgICAgICAgICBpZiAocnRFdnQgIT09IGhhbmRsZXIuZ2V0RXZlbnQoKSkge1xyXG4gICAgICAgICAgICAgIC8vIHRoZSBuZXcgcnVudGltZSBldmVudCBpcyB0aGF0IG9mIHRoZSBoYW5kbGVyIGNvbWJpbmVkIHdpdGggdGhlXHJcbiAgICAgICAgICAgICAgLy8gZGF0YSBvZiB0aGUgY3VycmVudCBydW50aW1lIGV2ZW50LlxyXG4gICAgICAgICAgICAgIC8vIHRoZSBwdXJwb3NlIG9mIHRoaXMgaXMgdG8gcHJvcGFnYXRlIHRoZSBldmVudCBvZiB0aGUgaGFuZGxlclxyXG4gICAgICAgICAgICAgIC8vIGluIHBsYWNlIG9mIHRoZSBvcmlnaW5hbCBldmVudFxyXG4gICAgICAgICAgICAgIG9sZFJ0RXZ0ID0gcnRFdnQ7XHJcbiAgICAgICAgICAgICAgcnRFdnQgPSBuZXcgUnVuVGltZUV2ZW50KGhhbmRsZXIuZ2V0RXZlbnQoKSwgcnRFdnQpO1xyXG4gICAgICAgICAgICAgIHJ0RXZ0Q2hhbmdlZCA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICAgIC8vIHRoZXJlIGlzIGEgbmV3IHJ1bnRpbWUgZXZlbnQgdG8gaGFuZGxlIHNvIHBvcCB0aGUgb2xkIG9uZSBhbmQgcHVzaFxyXG4gICAgICAgICAgICAgIC8vIHRoZSBuZXcgb25lIGluc3RlYWQuXHJcbiAgICAgICAgICAgICAgdGhpcy5wb3BSdEV2ZW50KCk7XHJcbiAgICAgICAgICAgICAgdGhpcy5wdXNoUnRFdmVudChydEV2dCk7XHJcbiAgICAgICAgICAgIH0gZWxzZVxyXG4gICAgICAgICAgICAgIHJ0RXZ0Q2hhbmdlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgaWYgKHJ0RXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9JTlRFUk5BTCAmJiBydEV2dC5nZXRJbnRlcm5hbENvZGUoKSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpXHJcbiAgICAgICAgICAgICAgcnRFdnQuZ2V0VGFzaygpLnNldEluUmVjb3JkU3VmZml4KHRydWUpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5jcmVhdGVFdmVudEFyZ3VtZW50cyhydEV2dCk7XHJcbiAgICAgICAgICAgIGxldCBoYW5kbGVyUmV0VmFsczogUmV0VmFscyA9IGF3YWl0IGhhbmRsZXIuZXhlY3V0ZShydEV2dCwgcmV0dXJuZWRGcm9tU2VydmVyLCBlbmFibGVkQ25kQ2hlY2tlZEFuZFRydWUpO1xyXG4gICAgICAgICAgICBpZiAocnRFdnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0lOVEVSTkFMICYmIHJ0RXZ0LmdldEludGVybmFsQ29kZSgpID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWClcclxuICAgICAgICAgICAgICBydEV2dC5nZXRUYXNrKCkuc2V0SW5SZWNvcmRTdWZmaXgoZmFsc2UpO1xyXG4gICAgICAgICAgICBwcm9wYWdhdGUgPSBoYW5kbGVyUmV0VmFscy5Qcm9wYWdhdGU7XHJcbiAgICAgICAgICAgIGlmICghaGFuZGxlclJldFZhbHMuRW5hYmxlZCAmJiBydEV2dENoYW5nZWQpIHtcclxuICAgICAgICAgICAgICBydEV2dCA9IG9sZFJ0RXZ0O1xyXG4gICAgICAgICAgICAgIG9sZFJ0RXZ0ID0gbnVsbDtcclxuICAgICAgICAgICAgICBydEV2dENoYW5nZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAvLyB0aGVyZSBpcyBhIG5ldyBydW50aW1lIGV2ZW50IHRvIGhhbmRsZSBzbyBwb3AgdGhlIG9sZCBvbmUgYW5kIHB1c2hcclxuICAgICAgICAgICAgICAvLyB0aGUgbmV3IG9uZSBpbnN0ZWFkLlxyXG4gICAgICAgICAgICAgIHRoaXMucG9wUnRFdmVudCgpO1xyXG4gICAgICAgICAgICAgIHRoaXMucHVzaFJ0RXZlbnQocnRFdnQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBjaGVjayBpZiB3ZSBoYXZlIGZ1bGZpbGxlZCB0aGUgZW5kIGNvbmRpdGlvblxyXG4gICAgICAgICAgICAvLyBBZnRlciBleGVjdXRpbmcgYSBoYW5kbGVyLCBiZWZvcmUgZW5kaW5nIGEgdGFzayAoaWYgdGhlIGVuZCBjb25kaXRpb24gaXMgVFJVRSksXHJcbiAgICAgICAgICAgIC8vIHdlIHNob3VsZCBjaGVjayBpZiB0aGUgdGFzayBpcyBub3QgYWxyZWFkeSBjbG9zZWQuIFRoaXMgY2FuIGhhcHBlbiBsaWtlIGluIGNhc2VcclxuICAgICAgICAgICAgLy8gb2YgUUNSICM3OTY0NzYgLS0tIGEgbm9uLWludGVyYWN0aXZlIHRhc2sgaGFzIGNhbGxlZCBhbiBpbnRlcmFjdGl2ZSB0YXNrIGZyb21cclxuICAgICAgICAgICAgLy8gdGFzayBzdWZmaXguIE5vdyBpZiB3ZSBwcmVzcyBBbHQrRjQsIHdlIGdldCBFWElUX1NZU1RFTSBhY3QuIEFuZCBzbyB3ZSBjbG9zZVxyXG4gICAgICAgICAgICAvLyBhbGwgdGFza3Mgc3RhcnRpbmcgZnJvbSBNYWluIFByb2dyYW0uIFNvLCB3aGVuIHdlIGNvbWUgb3V0IG9mIHRoZSBUUyBoYW5kbGVyXHJcbiAgICAgICAgICAgIC8vIGV4ZWN1dGlvbiwgdGhlIHRhc2sgaXMgYWxyZWFkeSBjbG9zZWQuXHJcbiAgICAgICAgICAgIC8vIEZvciBPZmZsaW5lIDogVFAgaXMgZXhlY3V0ZWQgYXQgY2xpZW50IHNpZGUuIElmIHdlIGFyZSBpbiBUYXNrIFByZWZpeCwgZG9udCBjaGVjayBlbmRUYXNrIGNvbmRpdGlvbiBoZXJlLlxyXG4gICAgICAgICAgICBpZiAocnRFdnQuZ2V0SW50ZXJuYWxDb2RlKCkgIT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQVNLX1BSRUZJWCAmJiB0YXNrLmlzU3RhcnRlZCgpICYmIHRhc2suZ2V0RXhlY0VuZFRhc2soKSkge1xyXG4gICAgICAgICAgICAgIGVuZFRhc2tFcnJvciA9IGF3YWl0IHRhc2suZW5kVGFzayh0cnVlLCBmYWxzZSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgIGlmIChlbmRUYXNrRXJyb3IpXHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSkge1xyXG4gICAgICAgICAgICAgIGlmIChhd2FpdCB0aGlzLmhhbmRsZVN0b3BFeGVjdXRpb24ocnRFdnQpKVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgICAgIC8vIHJlc3RvcmluZyB0aGUgY29udGV4dFxyXG4gICAgICAgICAgICBoYW5kbGVyLmdldFRhc2soKS5TZXRDb250ZXh0VGFzayhoYW5kbGVyQ29udGV4dFRhc2spO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmICghcHJvcGFnYXRlKVxyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBpZiAocnRFdnRDaGFuZ2VkKVxyXG4gICAgICAgICAgICBoYW5kbGVyID0gcG9zLmdldE5leHQocnRFdnQpO1xyXG4gICAgICAgICAgLy8gZ2V0IHRoZSBuZXh0IGhhbmRsZXIgZm9yIHRoZSBjdXJyZW50IGV2ZW50XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIGhhbmRsZXIgPSBwb3MuZ2V0TmV4dCgpO1xyXG4gICAgICAgICAgaWYgKGhhbmRsZXIgIT09IG51bGwpXHJcbiAgICAgICAgICAgIEZsb3dNb25pdG9yUXVldWUuSW5zdGFuY2UuYWRkVGFza0V2ZW50KHJ0RXZ0LmdldEJya0xldmVsKHRydWUpLCBGbG93TW9uaXRvckludGVyZmFjZS5GTFdNVFJfUFJPUEFHQVRFLCB0YXNrLkdldFRhc2tEZXRhaWxzKCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocHJvcGFnYXRlICYmICFlbmRUYXNrRXJyb3IpXHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmNvbW1vbkhhbmRsZXIocnRFdnQpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICghZW5kVGFza0Vycm9yKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5jb21tb25IYW5kbGVyQWZ0ZXIocnRFdnQsIGJSY0JlZm9yZSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGZvcmNlRXhpdERvbmUgJiYgdGhpcy5faXNIYW5kbGluZ0ZvcmNlRXhpdCkge1xyXG4gICAgICAgIHRoaXMuX2lzSGFuZGxpbmdGb3JjZUV4aXQgPSBmYWxzZTtcclxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUZvcmNlRXhpdEFmdGVyKHJ0RXZ0KTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnNldEZvcmNlRXhpdChvbGRGb3JjZUV4aXQsIG9sZEZvcmNlRXhpdFRhc2spO1xyXG4gICAgICBpZiAocmVzdG9yZUlzRm9yY2VFeGl0KVxyXG4gICAgICAgIHRoaXMuX2lzSGFuZGxpbmdGb3JjZUV4aXQgPSBvbGRJc0hhbmRsaW5nRm9yY2VFeGl0O1xyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgdGhpcy5fY3VyckN0cmwgPSByZXN0b3JlQ3VyckN0cmw7XHJcbiAgICAgIHRoaXMuX2N1cnJGaWVsZCA9IHJlc3RvcmVDdXJyRmllbGQ7XHJcbiAgICAgIHRoaXMucG9wUnRFdmVudCgpO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICAvLyB1cGRhdGUgdGhlIGRpc3BsYXlcclxuICAgIEdVSU1hbmFnZXIuSW5zdGFuY2UuZXhlY0d1aUNvbW1hbmRRdWV1ZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFRoaXMgbWV0aG9kIHNpbXVsYXRlcyBhbGwgZXZlbnRzIHRoYXQgYXJlIGluIHNlbGVjdGlvbiBzZXF1ZW5jZSBzdGFydGluZyBmcm9tIGZvY3VzIGV2ZW50XHJcbiAgLy8vICAgSXQgaXMgdXNlZCBpbiA6XHJcbiAgLy8vICAgYWN0aW9ucyBDVFJMK1RBQiAmJiBDVFJMK1NISUZUK1RBQiB0aGF0IG1vdmUgdXMgdG8gdGhlIG5leHQvcHJldmlvdXMgaXRlbSBpbiBUYWIgY29udHJvbFxyXG4gIC8vLyAgIGNsaWNrIG9yIGFjY2VsZXJhdG9yIG9uIHB1c2ggYnV0dG9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidmFsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImxpbmVcIj5jdHJsIGxpbmU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicHJvZHVjZUNsaWNrXCI+dHJ1ZSBzaG91bGQgcHJvZHVjZSBjbGljayBldmVudDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBzaW11bGF0ZVNlbGVjdGlvbihjdHJsOiBNZ0NvbnRyb2xCYXNlLCB2YWw6IGFueSwgbGluZTogbnVtYmVyLCBwcm9kdWNlQ2xpY2s6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBtZ0NvbnRyb2w6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+Y3RybDtcclxuICAgIGxldCBjdXJyVGFzazogVGFzayA9IDxUYXNrPm1nQ29udHJvbC5nZXRGb3JtKCkuZ2V0VGFzaygpO1xyXG4gICAgbGV0IGNhbmNlbFdhc1JhaXNlZDogYm9vbGVhbiA9IGN1cnJUYXNrLmNhbmNlbFdhc1JhaXNlZCgpO1xyXG5cclxuICAgIC8vIGlmIChtZ0NvbnRyb2wuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfVEFCKSB7XHJcbiAgICAvLyAgIGlmICghbWdDb250cm9sLmlzTW9kaWZpYWJsZSgpIHx8ICFtZ0NvbnRyb2wuSXNQYXJrYWJsZSgpKSB7XHJcbiAgICAvLyAgICAgbWdDb250cm9sLnJlc3RvcmVPbGRWYWx1ZSgpO1xyXG4gICAgLy8gICAgIGxldCBsYXN0Rm9jdXNlZENvbnRyb2w6IE1nQ29udHJvbCA9IEdVSU1hbmFnZXIuZ2V0TGFzdEZvY3VzZWRDb250cm9sKCk7XHJcbiAgICAvLyAgICAgaWYgKGxhc3RGb2N1c2VkQ29udHJvbCAhPT0gbnVsbClcclxuICAgIC8vICAgICAgIE1hbmFnZXIuU2V0Rm9jdXMobGFzdEZvY3VzZWRDb250cm9sLCAtMSk7XHJcbiAgICAvLyAgICAgcmV0dXJuO1xyXG4gICAgLy8gICB9XHJcbiAgICAvLyB9XHJcblxyXG4gICAgLy8gd2hlbiBhIHB1c2ggYnV0dG9uIGlzIGFib3V0IHRvIHJhaXNlIGEgJ0NhbmNlbCcgb3IgYSAnUXVpdCcgZXZlbnQuIHdlIGRvIG5vdCB3YW50IHRvIHNldCB0aGUgbmV3IHZhbHVlIHRvIHRoZSBmaWVsZC5cclxuICAgIC8vIFRoYXQgc2V0dGluZyBtaWdodCBjYXVzZSBhIHJlYyBzdWZmaXggYW5kIGEgdmFyaWFibGUgY2hhbmdlLlxyXG4gICAgaWYgKG1nQ29udHJvbC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9CVVRUT04pIHtcclxuICAgICAgbGV0IGFSdEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudChtZ0NvbnRyb2wpO1xyXG4gICAgICBsZXQgcmFpc2VBdDogUmFpc2VBdCA9IDxSYWlzZUF0Pihhd2FpdCAobWdDb250cm9sLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUkFJU0VfQVQpKS5nZXRWYWx1ZUludCgpKTtcclxuICAgICAgaWYgKGFSdEV2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfSU5URVJOQUwgJiYgKGFSdEV2dC5JbnRlcm5hbEV2ZW50ID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ0FOQ0VMIHx8IGFSdEV2dC5JbnRlcm5hbEV2ZW50ID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUVVJVCkpIHtcclxuICAgICAgICBpZiAocmFpc2VBdCA9PT0gUmFpc2VBdC5UYXNrSW5Gb2N1cylcclxuICAgICAgICAgIGN1cnJUYXNrID0gTGFzdEZvY3VzZWRNYW5hZ2VyLkluc3RhbmNlLmdldExhc3RGb2N1c2VkVGFzaygpO1xyXG4gICAgICAgIGNhbmNlbFdhc1JhaXNlZCA9IGN1cnJUYXNrLmNhbmNlbFdhc1JhaXNlZCgpO1xyXG4gICAgICAgIGN1cnJUYXNrLnNldENhbmNlbFdhc1JhaXNlZCh0cnVlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHJhaXNlQXQgPT09IFJhaXNlQXQuVGFza0luRm9jdXMpXHJcbiAgICAgICAgbWdDb250cm9sLnNldFJ0RXZ0VGFzayhMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGZpcnN0IHdlIGhhbmRsZSBmb2N1c1xyXG4gICAgYXdhaXQgdGhpcy5oYW5kbGVGb2N1cyhtZ0NvbnRyb2wsIGxpbmUsIHByb2R1Y2VDbGljaywgZmFsc2UpO1xyXG5cclxuICAgIGN1cnJUYXNrLnNldENhbmNlbFdhc1JhaXNlZChjYW5jZWxXYXNSYWlzZWQpO1xyXG5cclxuICAgIGlmICh0aGlzLl9zdG9wRXhlY3V0aW9uKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgLy8gUUNSIyA5NzQwNDcgOiBJZiB3ZSBoYXZlIGEgUHVzaCBCdXR0b24gd2l0aCBBbGxvdyBQYXJraW5nID0gTm8gYW5kIGZpZWxkIGlzIGF0dGFjaGVkIHRvIGl0LCBkb24ndCBoYW5kbGUgdGhlIGV2ZW50LlxyXG4gICAgLy8gVGhpcyBpcyBzYW1lIGFzIG9ubGluZS4gSW4gb25saW5lLCBpZiBmaWVsZCBpcyBub3QgYXR0YWNoZWQgdG8gbm9uIHBhcmthYmxlIHB1c2ggQnV0dG9uLCB3ZSBoYW5kbGUgdGhlIGV2ZW50XHJcbiAgICAvLyBCdXQgaWYgZmllbGQgaXMgYXR0YWNoZWQgdG8gaXQsIHdlIGRvbid0IGhhbmRsZSBldmVudC5cclxuICAgIC8vIFNvIGlmIGNvbnRyb2wgaXMgcHVzaCBidXR0b24sIGV4ZWN1dGUgaGFuZGxlRXZlbnQgb25seSB3aGVuIGZpZWxkIGlzIG5vdCBhdHRhY2hlZCBvciBQYXJrb25DTGljayBpcyBObyBvclxyXG4gICAgLy8gUGFya29uQ0xpY2sgYW5kIGFsbG93cGFya2luZyBpcyBib3RoIFllc1xyXG4gICAgbGV0IGNvbnRyb2xJc1BhcmthYmxlOiBib29sZWFuID0gYXdhaXQgbWdDb250cm9sLklzUGFya2FibGUoKTtcclxuICAgIGlmIChtZ0NvbnRyb2wuVHlwZSAhPT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQlVUVE9OIHx8IChtZ0NvbnRyb2wuZ2V0RmllbGQoKSA9PT0gbnVsbCB8fCBjb250cm9sSXNQYXJrYWJsZSkpIHtcclxuXHJcbiAgICAgIC8vIFFDUiAjMzAxNjUyLiBGb3Igbm9uLXBhcmthYmxlIGJ1dHRvbiBjb250cm9sIHdpdGggZXZlbnQgcmFpc2VkIGF0IHRoZSBjb250YWluZXIgdGFzayB3aWxsIGJlIGNoYW5nZWQgc29cclxuICAgICAgLy8gd2hlbiB0aGUgYnV0dG9uIGlzIGNsaWNrZWQgdGhlbiB0aGUgdGFzayB3aWxsIGdldCBmb2N1cy4gKGFzIGluIE9ubGluZSBhbmQgYXMgaWYgdGhlIGJ1dHRvbiB3YXMgcGFya2FibGUpLlxyXG4gICAgICAvLyBUaGUgZm9jdXMgd2lsbCBiZSBvbiB0aGUgZmlyc3QgY29udHJvbC5cclxuICAgICAgaWYgKG1nQ29udHJvbC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9CVVRUT04gJiYgIWNvbnRyb2xJc1BhcmthYmxlKSB7XHJcbiAgICAgICAgbGV0IHN1YmZvcm1UYXNrOiBUYXNrID0gPFRhc2s+bWdDb250cm9sLmdldEZvcm0oKS5nZXRUYXNrKCk7XHJcbiAgICAgICAgaWYgKHN1YmZvcm1UYXNrLklzU3ViRm9ybSkge1xyXG4gICAgICAgICAgY3VyclRhc2sgPSBMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCk7XHJcbiAgICAgICAgICAvLyBEZWZlY3QgMTE1NDc0LiBGb3IgdGhlIHNhbWUgdGFzayBkbyBub3QgbW92ZSB0byB0aGUgZmlyc3QgY29udHJvbC5cclxuICAgICAgICAgIGlmIChzdWJmb3JtVGFzayAhPT0gY3VyclRhc2sgJiYgc3ViZm9ybVRhc2sucGF0aENvbnRhaW5zKGN1cnJUYXNrKSkge1xyXG5cclxuICAgICAgICAgICAgaWYgKHN1YmZvcm1UYXNrLmdldExldmVsKCkgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spIHsgLy8gVE9ETzogQ2hlY2sgaWYgdGhpcyBjb2RlIGNhbiBiZSBtb3ZlZCB0byBIYW5kbGVOb25QYXJrYWJsZUNvbnRyb2xzKClcclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayhzdWJmb3JtVGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuSGFuZGxlTm9uUGFya2FibGVDb250cm9scyhzdWJmb3JtVGFzayk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG5cclxuICAgICAgLy8gdGhlbiBBQ1RfSElUIGlzIHNlbnRcclxuICAgICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KG1nQ29udHJvbCk7XHJcbiAgICAgIFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5DdXJyZW50Q2xpY2tlZEN0cmwgPSBtZ0NvbnRyb2w7XHJcbiAgICAgIHJ0RXZ0LnNldEludGVybmFsKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX0hJVCk7XHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRXZlbnQocnRFdnQsIGZhbHNlKTtcclxuICAgICAgaWYgKHRoaXMuX3N0b3BFeGVjdXRpb24pXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGFuZCBzZWxlY3Rpb24gaXMgaGFuZGxlZCBpbiB0aGUgZW5kIGlmIHByZXZpb3VzIGFjdGlvbnMgc3VjY2VlZGVkXHJcbiAgICBpZiAobWdDb250cm9sLlR5cGUgIT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0JVVFRPTilcclxuICAgIC8vIGZvciBidXR0b25cXGNoZWNrIHdlIGRvIG5vdCBjYWxsIHRoaXMgdG8gcHJldmVudCByZWN1cnNpb25cclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVTZWxlY3Rpb24obWdDb250cm9sLCBsaW5lLCB2YWwpO1xyXG5cclxuICAgIGlmICh0aGlzLl9zdG9wRXhlY3V0aW9uKVxyXG4gICAgICByZXR1cm47XHJcbiAgICAvLyB0aGVuIG1vdXNlIHVwXHJcbiAgICBhd2FpdCB0aGlzLmhhbmRsZU1vdXNlVXAobWdDb250cm9sLCBsaW5lLCBwcm9kdWNlQ2xpY2spO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBhY3RpdmF0ZSBoYW5kbGVJbnRlcm5hbEV2ZW50IHdpdGggaXNRdWl0ID0gZmFsc2U8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaXRhc2tcIj5hIHJlZmVyZW5jZSB0byB0aGUgdGFzazwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZXZlbnRDb2RlXCI+dGhlIGNvZGUgb2YgdGhlIGV2ZW50PC9wYXJhbT5cclxuICBhc3luYyBoYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2soaXRhc2s6IElUYXNrLCBldmVudENvZGU6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2tBbmRTdWJmb3JtUmVmcmVzaChpdGFzaywgZXZlbnRDb2RlLCBmYWxzZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYWN0aXZhdGUgaGFuZGxlSW50ZXJuYWxFdmVudCB3aXRoIGlzUXVpdCA9IGZhbHNlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIml0YXNrXCI+YSByZWZlcmVuY2UgdG8gdGhlIHRhc2sgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImV2ZW50Q29kZVwiPnRoZSBjb2RlIG9mIHRoZSBldmVudCA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInN1YmZvcm1SZWZyZXNoXCI+aWRlbnRpZmllciBpZiB0aGUgZXZlbnQgY2FsbGVkIGJ5IHN1YmZvcm0gcmVmcmVzaDwvcGFyYW0+XHJcbiAgYXN5bmMgaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrQW5kU3ViZm9ybVJlZnJlc2goaXRhc2s6IElUYXNrLCBldmVudENvZGU6IG51bWJlciwgc3ViZm9ybVJlZnJlc2g6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCB0YXNrOiBUYXNrID0gPFRhc2s+aXRhc2s7XHJcblxyXG4gICAgLy8gc2V0IFN1YmZvcm1FeGVjTW9kZSAoZm9yIFN1YmZvcm1FeGVjTW9kZSBmdW5jdGlvbikgb25seSBpbiByZWNvcmQgcHJlZml4LlxyXG4gICAgLy8gU3ViZm9ybUV4ZWNNb2RlIGlzIGNoYW5nZWQgaW4gcmVjb3JkIHByZWZpeCBhbmQgaXQgaXMgdGhlIHNhbWUgdW50aWwgdGhlXHJcbiAgICAvLyBuZXh0IHJlY29yZCBwcmVmaXggZXhlY3V0aW9uLCBiZWNhdXNlIHdlIGRvIG5vdCBvcGVuIGEgc3ViZm9ybSB0YXNrIGVhY2ggdGltZVxyXG4gICAgLy8gaW4gUkMgYXMgaXQgaXMgaW4gT25saW5lLiBCdXQgd2hlbiB0aGUgc3ViZm9ybSBpcyByZWZyZXNoZWQgZnJvbSB0aGUgcGFyZW50XHJcbiAgICAvLyBpdHMgcmVjb3JkIHByZWZpeCAmIHN1ZmZpeCBhcmUgYWxzbyBleGVjdXRlZC5cclxuICAgIGlmIChldmVudENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYICYmIHRhc2suSXNTdWJGb3JtICYmIHRhc2suU3ViZm9ybUV4ZWNNb2RlICE9PSBUYXNrX1N1YmZvcm1FeGVjTW9kZUVudW0uRklSU1RfVElNRSkvLyBGSVJTVF9USU1FIGlzIHNldCBvbmx5IG9uY2UgaW5cclxuICAgIC8vIGRvRmlyc3RSZWNvcmRDeWNsZS5cclxuICAgIHtcclxuICAgICAgdGFzay5TdWJmb3JtRXhlY01vZGUgPSAoc3ViZm9ybVJlZnJlc2ggPyBUYXNrX1N1YmZvcm1FeGVjTW9kZUVudW0uUkVGUkVTSCA6IFRhc2tfU3ViZm9ybUV4ZWNNb2RlRW51bS5TRVRfRk9DVVMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGZvciB0aGUgc3ViZm9ybSByZWZyZXNoIGl0IGlzIG5lZWRlZCB0byBleGVjdXRlIE1HX0FDVF9QT1NUX1JFRlJFU0hfQllfUEFSRU5UIGhhbmRsZXIgYmVmb3JlIFJFQ09SRF9QUkVGSVggaGFuZGxlclxyXG4gICAgaWYgKHN1YmZvcm1SZWZyZXNoKVxyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayhpdGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1BPU1RfUkVGUkVTSF9CWV9QQVJFTlQpO1xyXG5cclxuICAgIGlmICh0YXNrLkRhdGFWaWV3LmlzRW1wdHlEYXRhdmlldygpKSB7XHJcbiAgICAgIGlmIChldmVudENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYIHx8IGV2ZW50Q29kZSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpIHtcclxuICAgICAgICBpZiAoZXZlbnRDb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWClcclxuICAgICAgICAgIGF3YWl0IHRhc2suZW1wdHlEYXRhdmlld09wZW4oc3ViZm9ybVJlZnJlc2gpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHRhc2suZW1wdHlEYXRhdmlld0Nsb3NlKCk7XHJcblxyXG4gICAgICAgIGlmICh0YXNrLmdldEZvcm0oKSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgaWYgKGV2ZW50Q29kZSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpXHJcbiAgICAgICAgICAgIGF3YWl0ICg8TWdGb3JtPnRhc2suZ2V0Rm9ybSgpKS5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0NVUlJfUkVDKTtcclxuICAgICAgICAgIHRhc2suZ2V0Rm9ybSgpLlNlbGVjdFJvdygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlXHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2tBbmRFdmVudFN1YnR5cGUodGFzaywgZXZlbnRDb2RlLCBFdmVudFN1YlR5cGUuTm9ybWFsKTtcclxuICAgIH0gZWxzZVxyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFza0FuZEV2ZW50U3VidHlwZSh0YXNrLCBldmVudENvZGUsIEV2ZW50U3ViVHlwZS5Ob3JtYWwpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGFjdGl2YXRlIGhhbmRsZUludGVybmFsRXZlbnQgd2l0aCBpc1F1aXQgPSBmYWxzZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsXCI+YSByZWZlcmVuY2UgdG8gdGhlIGNvbnRyb2wgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImV2ZW50Q29kZVwiPnRoZSBjb2RlIG9mIHRoZSBldmVudCA8L3BhcmFtPlxyXG4gIGFzeW5jIGhhbmRsZUludGVybmFsRXZlbnRXaXRoTWdDb250cm9sQmFzZShjdHJsOiBNZ0NvbnRyb2xCYXNlLCBldmVudENvZGU6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aE1nQ29udHJvbCg8TWdDb250cm9sPmN0cmwsIGV2ZW50Q29kZSwgRXZlbnRTdWJUeXBlLk5vcm1hbCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgXCJzdG9wIGV4ZWN1dGlvblwiIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIEdldFN0b3BFeGVjdXRpb25GbGFnKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3N0b3BFeGVjdXRpb247XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIHRoZSBjdHJsIG9uIHdoaWNoIHdlIGhhZCBhIFwic3RvcCBleGVjdXRpb25cIlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBnZXRTdG9wRXhlY3V0aW9uQ3RybCgpOiBNZ0NvbnRyb2xCYXNlIHtcclxuICAgIHJldHVybiB0aGlzLl9zdG9wRXhlY3V0aW9uQ3RybDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBpbml0aWFsaXplcyB0aGUgc3RhdGljIHNlY3Rpb24gb2YgdGhlIGV2ZW50cyBtYW5hZ2VyLiBVc3VhbGx5IGRvZXMgbm90aGluZyBidXQgaW4gdGhlXHJcbiAgLy8vICAgZXZlbnQgb2YgYXBwbGV0IHJlLWxvYWQgKGZvciBleGFtcGxlLCBiZWNhdXNlIG9mIGEgYnJvd3NlciByZWZyZXNoKSBpdCBpbml0aWFsaXplcyB0aGVcclxuICAvLy8gICBzdGF0aWMgcGFydCBvZiB0aGlzIGNsYXNzLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgSW5pdCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9pbml0aWFsaXplZCkge1xyXG4gICAgICB0aGlzLl9pc0hhbmRsaW5nRm9yY2VFeGl0ID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuX2ZvcmNlRXhpdCA9IEZvcmNlRXhpdC5Ob25lO1xyXG4gICAgICB0aGlzLl9mb3JjZUV4aXRUYXNrID0gbnVsbDtcclxuICAgICAgdGhpcy5fY3VyckZpZWxkID0gbnVsbDtcclxuICAgICAgdGhpcy5zZXRFbmRPZldvcmsodHJ1ZSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9pbml0aWFsaXplZCA9IHRydWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQWRkIGludGVybmFsIGV2ZW50IHRvIHRoZSBxdWV1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpdGFza1wiPnRhc2s8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY29kZVwiPmNvZGUgb2YgaW50ZXJuYWwgZXZlbnQ8L3BhcmFtPlxyXG4gIGFkZEludGVybmFsRXZlbnRXaXRoSXRhc2tBbmRDb2RlKGl0YXNrOiBJVGFzaywgY29kZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLmFkZEd1aVRyaWdnZXJlZEV2ZW50V2l0aFRhc2tBbmRDb2RlQW5kT25NdWx0aU1hcmsoaXRhc2ssIGNvZGUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNvZGVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgYWRkSW50ZXJuYWxFdmVudFdpdGhDdHJsQW5kQ29kZShjdHJsOiBNZ0NvbnRyb2xCYXNlLCBjb2RlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudCg8TWdDb250cm9sPmN0cmwpO1xyXG4gICAgcnRFdnQuc2V0SW50ZXJuYWwoY29kZSk7XHJcbiAgICB0aGlzLmFkZFRvVGFpbChydEV2dCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY29kZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBhZGRJbnRlcm5hbEV2ZW50V2l0aEN0cmxBbmREaXNwbGF5TGluZUFuZENvZGUoY3RybDogTWdDb250cm9sQmFzZSwgRGlzcGxheUxpbmU6IG51bWJlciwgY29kZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQoPE1nQ29udHJvbD5jdHJsLCBEaXNwbGF5TGluZSwgZmFsc2UpO1xyXG4gICAgcnRFdnQuc2V0SW50ZXJuYWwoY29kZSk7XHJcbiAgICB0aGlzLmFkZFRvVGFpbChydEV2dCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdHJsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjb2RlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJwcmlvcml0eVwiPjwvcGFyYW0+XHJcbiAgYWRkSW50ZXJuYWxFdmVudFdpdGhDdHJsQW5kQ29kZUFuZFByaW9yaXR5KGN0cmw6IE1nQ29udHJvbEJhc2UsIGNvZGU6IG51bWJlciwgcHJpb3JpdHk6IFByaW9yaXR5KTogdm9pZCB7XHJcbiAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQoPE1nQ29udHJvbD5jdHJsKTtcclxuICAgIHJ0RXZ0LnNldEludGVybmFsKGNvZGUpO1xyXG4gICAgcnRFdnQuc2V0UHJpb3JpdHkocHJpb3JpdHkpO1xyXG4gICAgdGhpcy5hZGRUb1RhaWwocnRFdnQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBhZGQgZ3VpIHRyaWdnZXJlZCBldmVudFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaXRhc2tcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNvZGVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm9uTXVsdGlNYXJrXCI+PC9wYXJhbT5cclxuICBhZGRHdWlUcmlnZ2VyZWRFdmVudFdpdGhUYXNrQW5kQ29kZUFuZE9uTXVsdGlNYXJrKGl0YXNrOiBJVGFzaywgY29kZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBsZXQgdGFzazogVGFzayA9IDxUYXNrPml0YXNrO1xyXG4gICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KHRhc2spO1xyXG4gICAgcnRFdnQuc2V0SW50ZXJuYWwoY29kZSk7XHJcbiAgICB0aGlzLmFkZFRvVGFpbChydEV2dCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHdpbGwgYmUgdXNlZCBmb3IgbXVsdGltYXJraW5nIGluIHRoZSBmdXR1cmVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN0cmxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNvZGVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxpbmVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1vZGlmaWVyc1wiPjwvcGFyYW0+XHJcbiAgYWRkR3VpVHJpZ2dlcmVkRXZlbnRXaXRoQ3RybEFuZENvZGVBbmRMaW5lQW5kTW9kaWZpZXIoY3RybDogTWdDb250cm9sQmFzZSwgY29kZTogbnVtYmVyLCBsaW5lOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudCg8TWdDb250cm9sPmN0cmwsIGxpbmUsIGZhbHNlKTtcclxuICAgIHJ0RXZ0LnNldEludGVybmFsKGNvZGUpO1xyXG4gICAgdGhpcy5hZGRUb1RhaWwocnRFdnQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEFkZCBpbnRlcm5hbCBldmVudCB0aGF0IHdhcyB0cmlnZ2VyZWQgYnkgR1VJIHF1ZXVlIChpbmNsdWRlcyB0aW1lciBldmVudHMpIHRvIHRoZSBxdWV1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0YXNrXCI+Y29udHJvbCA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY29kZVwiPmNvZGUgb2YgaW50ZXJuYWwgZXZlbnQgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImxpbmVcIj5saW5lIGluIGEgdGFibGUgY29udHJvbCA8L3BhcmFtPlxyXG4gIGFkZEd1aVRyaWdnZXJlZEV2ZW50V2l0aFRhc2tBbmRDb2RlQW5kTGluZSh0YXNrOiBUYXNrLCBjb2RlOiBudW1iZXIsIGxpbmU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgbGV0IHRzazogVGFzayA9IG51bGw7XHJcbiAgICBpZiAodGFzayAhPT0gbnVsbClcclxuICAgICAgdHNrID0gPFRhc2s+dGFzaztcclxuXHJcbiAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQodHNrKTtcclxuICAgIHJ0RXZ0LnNldEludGVybmFsKGNvZGUpO1xyXG4gICAgcnRFdnQuRGlzcGxheUxpbmUgPSBsaW5lO1xyXG4gICAgdGhpcy5hZGRUb1RhaWwocnRFdnQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBoYW5kbGUgQ29sdW1uIENsaWNrIGV2ZW50IG9uIENvbHVtbiA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZ3VpQ29sdW1uQ3RybFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZGlyZWN0aW9uXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjb2x1bW5IZWFkZXJcIj48L3BhcmFtPlxyXG4gIEFkZENvbHVtbkNsaWNrRXZlbnQoY29sdW1uQ3RybDogTWdDb250cm9sQmFzZSwgZGlyZWN0aW9uOiBudW1iZXIsIGNvbHVtbkhlYWRlcjogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQoPE1nQ29udHJvbD5jb2x1bW5DdHJsLCBkaXJlY3Rpb24sIDApO1xyXG4gICAgcnRFdnQuc2V0SW50ZXJuYWwoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NPTF9DTElDSyk7XHJcblxyXG4gICAgLy8gUHJlcGFyZSBhbiBhcmd1bWVudCBsaXN0IHdpdGggYXJndW1lbnQgYXMgY29sdW1uSGVhZGVyU3RyaW5nLlxyXG4gICAgbGV0IGFyZ3NMaXN0ID0gbmV3IEFycmF5PEV4cFZhbD4oKTtcclxuICAgIGFyZ3NMaXN0WzBdID0gbmV3IEV4cFZhbChTdG9yYWdlQXR0cmlidXRlLlVOSUNPREUsIGZhbHNlLCBjb2x1bW5IZWFkZXIpO1xyXG4gICAgbGV0IGFyZ3MgPSBuZXcgQXJndW1lbnRzTGlzdChhcmdzTGlzdCk7XHJcbiAgICBydEV2dC5zZXRBcmdMaXN0KGFyZ3MpO1xyXG5cclxuICAgIHRoaXMuYWRkVG9UYWlsKHJ0RXZ0KTtcclxuICB9XHJcblxyXG4gIEFkZFJvdXRlRXZlbnQodGFzazogSVRhc2ssIGNvZGU6IG51bWJlciwgcm91dGVycGF0aDogc3RyaW5nLCByb3V0ZXJPdXRsZXROYW1lOiBzdHJpbmcsIHJvdXRlUGFyYW1zOiBMaXN0PGFueT4pIHtcclxuICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudCg8VGFzaz50YXNrLCB0cnVlKTtcclxuICAgIHJ0RXZ0LnNldEludGVybmFsKGNvZGUpO1xyXG5cclxuICAgIGxldCBhcmdzTGlzdDogRXhwVmFsW10gPSBuZXcgQXJyYXk8RXhwVmFsPigyKTtcclxuICAgIGFyZ3NMaXN0WzBdID0gbmV3IEV4cFZhbChTdG9yYWdlQXR0cmlidXRlLkFMUEhBLCBmYWxzZSwgcm91dGVycGF0aCk7XHJcbiAgICBpZiAocm91dGVyT3V0bGV0TmFtZSA9PT0gbnVsbClcclxuICAgICAgcm91dGVyT3V0bGV0TmFtZSA9ICcnO1xyXG4gICAgYXJnc0xpc3RbMV0gPSBuZXcgRXhwVmFsKFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEEsIGZhbHNlLCByb3V0ZXJPdXRsZXROYW1lKTtcclxuXHJcbiAgICBsZXQgYXJncyA9IG5ldyBBcmd1bWVudHNMaXN0KGFyZ3NMaXN0KTtcclxuICAgIHJ0RXZ0LnNldEFyZ0xpc3QoYXJncyk7XHJcbiAgICBydEV2dC5zZXRSb3V0ZVBhcmFtTGlzdChyb3V0ZVBhcmFtcyk7XHJcblxyXG4gICAgdGhpcy5hZGRUb1RhaWwocnRFdnQpO1xyXG4gIH1cclxuXHJcbiAgQWRkUm91dGVyQ2xvc2VkRXZlbnQodGFzazogVGFzaykge1xyXG4gICAgbGV0IHN1YkZvcm1Db250cm9sOiBNZ0NvbnRyb2xCYXNlID0gPE1nQ29udHJvbEJhc2U+dGFzay5nZXRGb3JtKCkuZ2V0U3ViRm9ybUN0cmwoKTtcclxuICAgIGxldCBydEV2dCA9IG5ldyBSdW5UaW1lRXZlbnQoPFRhc2tCYXNlPnN1YkZvcm1Db250cm9sLmdldEZvcm0oKS5nZXRUYXNrKCksIHRydWUpO1xyXG4gICAgcnRFdnQuc2V0SW50ZXJuYWwoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1NVQkZPUk1fQ0xPU0UpO1xyXG5cclxuICAgIGxldCBhcmdzTGlzdDogRXhwVmFsW10gPSBuZXcgQXJyYXk8RXhwVmFsPigxKTtcclxuICAgIGFyZ3NMaXN0WzBdID0gbmV3IEV4cFZhbChTdG9yYWdlQXR0cmlidXRlLkFMUEhBLCBmYWxzZSwgc3ViRm9ybUNvbnRyb2wuZ2V0TmFtZSgpKTtcclxuXHJcbiAgICBsZXQgYXJncyA9IG5ldyBBcmd1bWVudHNMaXN0KGFyZ3NMaXN0KTtcclxuICAgIHJ0RXZ0LnNldEFyZ0xpc3QoYXJncyk7XHJcbiAgICBFdmVudHNNYW5hZ2VyLkluc3RhbmNlLmFkZFRvVGFpbChydEV2dCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IGFkZCBsYXN0IHNhdmVkIHJvdXRlIGV2ZW50IDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzcmNUYXNrU3RyXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJhcmdMaXN0U3RyXCI+PC9wYXJhbT5cclxuICBBZGRMYXN0U2F2ZWRSb3V0ZUV2ZW50KHNyY1Rhc2s6IFRhc2ssIGFyZ3M6IEFyZ3VtZW50c0xpc3QpIHtcclxuICAgIGxldCBydEV2dCA9IG5ldyBSdW5UaW1lRXZlbnQoPFRhc2tCYXNlPkxhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKSwgdHJ1ZSk7XHJcbiAgICBydEV2dC5zZXRJbnRlcm5hbChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfV0VCQ0xJRU5UX1JPVVRFKTtcclxuXHJcbiAgICBpZiAoc3JjVGFzayAhPSBudWxsKSB7XHJcbiAgICAgIHJ0RXZ0LnNldFRhc2soc3JjVGFzayk7XHJcbiAgICAgIGlmIChhcmdzICE9IG51bGwpIHtcclxuICAgICAgICBydEV2dC5zZXRBcmdMaXN0KGFyZ3MpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuc2V0TGFzdFNhdmVkUm91dGVFdmVudChydEV2dCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICBBZGQgaW50ZXJuYWwgZXZlbnQgcm8gc2V0IHRoZSB2YWx1ZSBvZiBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj4gY29udHJvbCA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidmFsdWVcIj4gdmFsdWUgb2YgY29udHJvbCA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicmVmcmVzaERpc3BsYXlcIj4gcmVmcmVzaCBkaXNwbGF5IDwvcGFyYW0+XHJcbiAgQWRkRXh0ZXJuYWxWYWx1ZUV2ZW50KGN0cmw6IE1nQ29udHJvbCwgdmFsdWU6IGFueSwgcmVmcmVzaERpc3BsYXk6IGJvb2xlYW4pIHtcclxuICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudChjdHJsLCAwLCB0cnVlKTtcclxuICAgIHJ0RXZ0LnNldEludGVybmFsKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9TRVRfRVhURVJOQUxfVkFMVUUpO1xyXG4gICAgcnRFdnQuc2V0VmFsdWUodmFsdWUpO1xyXG5cclxuICAgIGxldCBhcmdzTGlzdDogRXhwVmFsW10gPSBuZXcgQXJyYXk8RXhwVmFsPigxKTtcclxuICAgIGFyZ3NMaXN0WzBdID0gbmV3IEV4cFZhbChTdG9yYWdlQXR0cmlidXRlLkJPT0xFQU4sIGZhbHNlLCByZWZyZXNoRGlzcGxheSA/ICcxJyA6ICcwJyk7XHJcbiAgICBsZXQgYXJncyA9IG5ldyBBcmd1bWVudHNMaXN0KGFyZ3NMaXN0KTtcclxuICAgIHJ0RXZ0LnNldEFyZ0xpc3QoYXJncyk7XHJcblxyXG4gICAgdGhpcy5hZGRUb1RhaWwocnRFdnQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEFkZCBpbnRlcm5hbCBldmVudCB0aGF0IHdhcyB0cmlnZ2VyZWQgYnkgR1VJIHF1ZXVlIChpbmNsdWRlcyB0aW1lciBldmVudHMpIHRvIHRoZSBxdWV1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsXCI+Y29udHJvbCA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY29kZVwiPmNvZGUgb2YgaW50ZXJuYWwgZXZlbnQgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImxpbmVcIj5saW5lIGluIGEgdGFibGUgY29udHJvbCA8L3BhcmFtPlxyXG4gIGFkZEd1aVRyaWdnZXJlZEV2ZW50V2l0aEN0cmxBbmRDb2RlQW5kTGluZShjdHJsOiBNZ0NvbnRyb2xCYXNlLCBjb2RlOiBudW1iZXIsIGxpbmU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KGN0cmwsIGxpbmUsIHRydWUpO1xyXG4gICAgcnRFdnQuc2V0SW50ZXJuYWwoY29kZSk7XHJcbiAgICB0aGlzLmFkZFRvVGFpbChydEV2dCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQWRkIGludGVybmFsIGV2ZW50IHRoYXQgd2FzIHRyaWdnZXJlZCBieSBHVUkgcXVldWUgKGluY2x1ZGVzIHRpbWVyIGV2ZW50cykgdG8gdGhlIHF1ZXVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj5jb250cm9sIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJsaW5lXCI+dGhlIGxpbmUgZm9yIG11bHRpbGluZSBjb250cm9sIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjb2RlXCI+Y29kZSBvZiBpbnRlcm5hbCBldmVudCA8L3BhcmFtPlxyXG4gIGFkZEd1aVRyaWdnZXJlZEV2ZW50V2l0aEN0cmxBbmRMaW5lQW5kQ29kZUFuZElzUHJvZHVjdENsaWNrKGN0cmw6IE1nQ29udHJvbEJhc2UsIGNvZGU6IG51bWJlciwgbGluZTogbnVtYmVyLCBpc1Byb2R1Y2VDbGljazogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KGN0cmwsIGxpbmUsIHRydWUpO1xyXG4gICAgcnRFdnQuc2V0SW50ZXJuYWwoY29kZSk7XHJcbiAgICBydEV2dC5zZXRQcm9kdWNlQ2xpY2soaXNQcm9kdWNlQ2xpY2spO1xyXG4gICAgdGhpcy5hZGRUb1RhaWwocnRFdnQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEFkZCBpbnRlcm5hbCBldmVudCB0aGF0IHdhcyB0cmlnZ2VyZWQgYnkgR1VJIHF1ZXVlIChpbmNsdWRlcyB0aW1lciBldmVudHMpIHRvIHRoZSBxdWV1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsXCI+Y29udHJvbCA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY29kZVwiPmNvZGUgb2YgaW50ZXJuYWwgZXZlbnQgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImxpc3RcIj48L3BhcmFtPlxyXG4gIGFkZEd1aVRyaWdnZXJlZEV2ZW50V2l0aEN0cmxBbmRDb2RlQW5kTGlzdChjdHJsOiBNZ0NvbnRyb2xCYXNlLCBjb2RlOiBudW1iZXIsIGxpc3Q6IExpc3Q8TWdDb250cm9sQmFzZT4pOiB2b2lkIHtcclxuICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudChjdHJsLCBsaXN0LCB0cnVlKTtcclxuICAgIHJ0RXZ0LnNldEludGVybmFsKGNvZGUpO1xyXG4gICAgdGhpcy5hZGRUb1RhaWwocnRFdnQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBBZGQgaW50ZXJuYWwgZXZlbnQgdGhhdCB3YXMgdHJpZ2dlcmVkIGJ5IEdVSSBxdWV1ZSB0byB0aGUgcXVldWUgPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFza1wiPnJlZmVyZW5jZSB0byB0aGUgdGFzayA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY29kZVwiPmNvZGUgb2YgaW50ZXJuYWwgZXZlbnQgPC9wYXJhbT5cclxuICBhZGRHdWlUcmlnZ2VyZWRFdmVudFdpdGhUYXNrQW5kQ29kZSh0YXNrOiBJVGFzaywgY29kZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQoPFRhc2s+dGFzaywgdHJ1ZSk7XHJcbiAgICBydEV2dC5zZXRJbnRlcm5hbChjb2RlKTtcclxuICAgIHRoaXMuYWRkVG9UYWlsKHJ0RXZ0KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gQWRkIGludGVybmFsIGV2ZW50IHRoYXQgd2FzIHRyaWdnZXJlZCBieSBHVUkgcXVldWUgdG8gdGhlIHF1ZXVlIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0YXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjb2RlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyYWlzZWRCeVwiPnJlbGV2YW50IG9ubHkgZm9yIG9ubGluZSAoZm9yIHdoaWNoIHN1YmZvcm0gYXJlIGhhbmRsZWQgYXMgb3JwaGFucyk8L3BhcmFtPlxyXG4gIGFkZEd1aVRyaWdnZXJlZEV2ZW50VGFza0FuZENvZGVBbmRSYWlzZWRCeSh0YXNrOiBJVGFzaywgY29kZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLmFkZEd1aVRyaWdnZXJlZEV2ZW50V2l0aFRhc2tBbmRDb2RlKHRhc2ssIGNvZGUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIGZpcnN0IGV2ZW50IGZyb20gdGhlIHF1ZXVlIGFuZCByZW1vdmUgaXQgZnJvbSB0aGVyZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBnZXRFdmVudCgpOiBSdW5UaW1lRXZlbnQge1xyXG4gICAgcmV0dXJuIDxSdW5UaW1lRXZlbnQ+dGhpcy5fZXZlbnRzUXVldWUucG9sbCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0Rm9yY2VFeGl0KCk6IEZvcmNlRXhpdCB7XHJcbiAgICByZXR1cm4gdGhpcy5fZm9yY2VFeGl0O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRGb3JjZUV4aXQoZm9yY2VFeGl0OiBGb3JjZUV4aXQsIHRhc2s6IFRhc2spOiB2b2lkIHtcclxuICAgIHRoaXMuX2ZvcmNlRXhpdCA9IGZvcmNlRXhpdDtcclxuICAgIHRoaXMuc2V0Rm9yY2VFeGl0VGFzayh0YXNrKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0Rm9yY2VFeGl0VGFzaygpOiBUYXNrIHtcclxuICAgIHJldHVybiB0aGlzLl9mb3JjZUV4aXRUYXNrO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRGb3JjZUV4aXRUYXNrKHRhc2s6IFRhc2spOiB2b2lkIHtcclxuICAgIHRoaXMuX2ZvcmNlRXhpdFRhc2sgPSB0YXNrO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogcmV0dXJucyB0cnVlIGlmIHRoZSBFdmVudHNNYW5hZ2VyIGlzIGN1cnJlbnRseSBoYW5kbGluZyBhIHVzZXIgZXZlbnQgd2l0aFxyXG4gICAqIEZvcmNlIEV4aXQgPSAnUHJlLVJlY29yZCBVcGRhdGUnXHJcbiAgICovXHJcbiAgaXNGb3JjZUV4aXRQcmVSZWNvcmRVcGRhdGUodGFzazogVGFza0Jhc2UpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pc0hhbmRsaW5nRm9yY2VFeGl0ICYmIHRoaXMuZ2V0Rm9yY2VFeGl0KCkgPT09IEZvcmNlRXhpdC5QcmVSZWNvcmRVcGRhdGUgJiYgdGFzayA9PT0gdGhpcy5nZXRGb3JjZUV4aXRUYXNrKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEV4ZWN1dGUgQ2xpZW50Q29udGV4dEluYWN0aXZpdHkgVGltZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIEV4ZWN1dGVDbGllbnRDb250ZXh0SW5hY3Rpdml0eVRpbWVyKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHN0YXJ0VGltZSA9IE1pc2MuZ2V0U3lzdGVtTWlsbGlzZWNvbmRzKCk7XHJcblxyXG4gICAgLy8gY29udmVydCB0ZW50aHMgb2Ygc2Vjb25kcyB0byBtaWxsaXNlY29uZHMuXHJcbiAgICBsZXQgY2xpZW50Q3R4SW5hY3Rpdml0eVRpbWVvdXQgPVxyXG4gICAgICBFbnZpcm9ubWVudC5JbnN0YW5jZS5nZXRDbGllbnRDb250ZXh0SW5hY3Rpdml0eVRpbWVvdXQoKSAqIDEwMDtcclxuXHJcbiAgICBFdmVudHNNYW5hZ2VyLmNsaWVudEluYWN0aXZpdHlUaW1lck9OID0gdHJ1ZTtcclxuICAgIHdoaWxlIChFdmVudHNNYW5hZ2VyLmNsaWVudEluYWN0aXZpdHlUaW1lck9OKSB7XHJcbiAgICAgIGF3YWl0IFRocmVhZC5TbGVlcCgxMDAwKTtcclxuICAgICAgdmFyIHRpbWVMYXBzZWQgPSBNaXNjLmdldFN5c3RlbU1pbGxpc2Vjb25kcygpIC0gc3RhcnRUaW1lO1xyXG4gICAgICBpZiAoRXZlbnRzTWFuYWdlci5jbGllbnRDb250ZXh0SW5hY3Rpdml0eVRpbWVyQWJvcnRlZCB8fCB0aW1lTGFwc2VkID49IGNsaWVudEN0eEluYWN0aXZpdHlUaW1lb3V0KSB7XHJcbiAgICAgICAgRXZlbnRzTWFuYWdlci5jbGllbnRJbmFjdGl2aXR5VGltZXJPTiA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBTaG93IG9yIGhpZGUgdGhlIHNwaW5uZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic2hvd1wiPiA8L3BhcmFtPlxyXG4gIGFzeW5jIENoZWNrQW5kU2hvd1NwaW5uZXIoc2hvdzogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHNlbmRDb21tYW5kID0gZmFsc2U7XHJcblxyXG4gICAgLy8gSWYgdGhlIGN1cnJlbnQgZXZlbnQgaXMgb2YgbG93ZXN0IHByaW9yaXR5LCBpdCBpcyBhY3R1YWxseSBzYWZlIHRvIG9wZW4gdXNlciBpbnRlcmFjdGlvbi5cclxuICAgIC8vIFNvLCBzdG9wIHRoZSBzcGlubmVyLlxyXG4gICAgaWYgKHRoaXMuZ2V0TGFzdFJ0RXZlbnQoKSAhPT0gbnVsbCAmJiB0aGlzLmdldExhc3RSdEV2ZW50KCkuZ2V0UHJpb3JpdHkoKSA9PT0gUHJpb3JpdHkuTE9XRVNUKVxyXG4gICAgICBzaG93ID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKHNob3cgIT0gdGhpcy5pc1NwaW5uZXJTaG93bikge1xyXG4gICAgICBpZiAoc2hvdykge1xyXG4gICAgICAgIC8vIFNob3cgdGhlIHNwaW5uZXIgb25seSBpZiB0aHJlc2hvbGQgaXMgcmVhY2hlZC5cclxuICAgICAgICAvL1RvRG86IERlZmluZSBhIGNvbnN0IGZvciAxMDAwLiBBbHNvIG1ha2UgaXQgY3VzdG9taXphYmxlIGZyb20gYW5ndWxhciBhcHBcclxuICAgICAgICBpZiAoTWlzYy5nZXRTeXN0ZW1NaWxsaXNlY29uZHMoKSAtIHRoaXMuR2V0RXZlbnRUaW1lKCkgPiAxMDAwKSB7XHJcbiAgICAgICAgICBzZW5kQ29tbWFuZCA9IHRydWU7XHJcbiAgICAgICAgICBFdmVudHNNYW5hZ2VyLmNsaWVudEJ1c3lUaW1lU3RhcnQgPSBNaXNjLmdldFN5c3RlbU1pbGxpc2Vjb25kcygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlXHJcbiAgICAgICAgc2VuZENvbW1hbmQgPSB0cnVlO1xyXG5cclxuICAgICAgaWYgKHNlbmRDb21tYW5kKSB7XHJcbiAgICAgICAgQ29tbWFuZHMuYWRkU2hvd1NwaW5uZXIoc2hvdyk7XHJcbiAgICAgICAgQ29tbWFuZHMuYmVnaW5JbnZva2UoKTtcclxuICAgICAgICAvLyByZWxlYXNlIHRoZSB0aHJlYWQgc28gdGhhdCBmcmFtZXdvcmsgY2FuIHNob3cvaGlkZSB0aGUgc3Bpbm5lclxyXG4gICAgICAgIGF3YWl0IFRocmVhZC5TbGVlcCg1MCk7XHJcblxyXG4gICAgICAgIHRoaXMuaXNTcGlubmVyU2hvd24gPSBzaG93O1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuaXNTcGlubmVyU2hvd24pIHtcclxuICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgdGltZSBmb3Igd2hpY2ggY2xpZW50IHdhcyBidXN5XHJcbiAgICAgICAgICBsZXQgdG90YWxDbGllbnRCdXN5VGltZSA9IE1pc2MuZ2V0U3lzdGVtTWlsbGlzZWNvbmRzKCkgLSBFdmVudHNNYW5hZ2VyLmNsaWVudEJ1c3lUaW1lU3RhcnQ7XHJcbiAgICAgICAgICB0aGlzLlNwaW5uZXJTdG9wcGVkLm5leHQodG90YWxDbGllbnRCdXN5VGltZSk7XHJcbiAgICAgICAgICBFdmVudHNNYW5hZ2VyLmNsaWVudEJ1c3lUaW1lU3RhcnQgPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIE1haW4gZXZlbnRzIGxvb3AsIHJ1bnMgaW4gd29ya2VyIHRocmVhZCBmb3IgbWFpbiB3aW5kb3cgYW5kIGZvciBldmVyeVxyXG4gIC8vLyAgIG1vZGFsIHdpbmRvdyBSZXNwb25zaWJsZSBmb3IgaGFuZGxpbmcgZXZlbnRzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm1nRGF0YVwiPiA8L3BhcmFtPlxyXG4gIGFzeW5jIEV2ZW50c0xvb3AobWdEYXRhOiBNR0RhdGEpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBzYXZlZEFsbG93RXZlbnRzOiBFdmVudHNBbGxvd2VkVHlwZSA9IHRoaXMuZ2V0QWxsb3dFdmVudHMoKTtcclxuXHJcbiAgICB0aGlzLnNldEFsbG93RXZlbnRzKEV2ZW50c0FsbG93ZWRUeXBlLkFMTCk7XHJcblxyXG4gICAgdGhpcy5wdXNoTmV3RXhlY1N0YWNrcygpO1xyXG5cclxuICAgIHdoaWxlICghbWdEYXRhLklzQWJvcnRpbmcpIHtcclxuICAgICAgLy8gSGlkZSB0aGUgc3Bpbm5lciBiZWZvcmUgbW92aW5nIHRvIGlkbGVcclxuICAgICAgYXdhaXQgdGhpcy5DaGVja0FuZFNob3dTcGlubmVyKGZhbHNlKTtcclxuXHJcbiAgICAgIGF3YWl0IHRoaXMuX2V2ZW50c1F1ZXVlLndhaXRGb3JFbGVtZW50KCk7XHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRXZlbnRzKG1nRGF0YSwgMCk7XHJcblxyXG4gICAgICBpZiAoIW1nRGF0YS5Jc0Fib3J0aW5nKVxyXG4gICAgICAgIGF3YWl0IHRoaXMuY2hlY2tQYXJrYWJpbGl0eSgpO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnBvcE5ld0V4ZWNTdGFja3MoKTtcclxuICAgIHRoaXMuc2V0QWxsb3dFdmVudHMoc2F2ZWRBbGxvd0V2ZW50cyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgTm9uIGludGVyYWN0aXZlIGV2ZW50cyBsb29wLCBydW5zIGluIHdvcmtlciB0aHJlYWQgZm9yIG5vbiBpbnRlcmFjdGl2ZSB0YXNrc1xyXG4gIC8vLyAgIFJlc3BvbnNpYmxlIGZvciBjeWNsaW5nIGZvcndhcmQgb24gcmVjb3JkcyBhbmQgaGFuZGxpbmcgZXZlbnRzLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJtZ0RhdGFcIj48L3BhcmFtPlxyXG4gIGFzeW5jIE5vbkludGVyYWN0aXZlRXZlbnRzTG9vcChtZ0RhdGE6IE1HRGF0YSwgdGFza0Jhc2U6IFRhc2tCYXNlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgdGFzazogVGFzayA9IDxUYXNrPnRhc2tCYXNlO1xyXG4gICAgbGV0IHNhdmVkQWxsb3dFdmVudHM6IEV2ZW50c0FsbG93ZWRUeXBlID0gdGhpcy5nZXRBbGxvd0V2ZW50cygpO1xyXG5cclxuICAgIHRoaXMuc2V0Tm9uSW50ZXJhY3RpdmVBbGxvd0V2ZW50cyhhd2FpdCB0YXNrLmlzQWxsb3dFdmVudHMoKSk7XHJcblxyXG4gICAgdGhpcy5wdXNoTmV3RXhlY1N0YWNrcygpO1xyXG5cclxuICAgIHdoaWxlICghbWdEYXRhLklzQWJvcnRpbmcpIHtcclxuICAgICAgaWYgKHRhc2suZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0RFTEVURSlcclxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1lDTEVfTkVYVF9ERUxFVEVfUkVDKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DWUNMRV9ORVhUX1JFQyk7XHJcblxyXG4gICAgICBhd2FpdCBUaHJlYWQuU2xlZXAoMTApO1xyXG5cclxuICAgICAgLy8gcG9sbCBvbmx5IDEgZXZlbnQuXHJcbiAgICAgIGlmICghbWdEYXRhLklzQWJvcnRpbmcgJiYgYXdhaXQgdGFzay5pc0FsbG93RXZlbnRzKCkpXHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVFdmVudHMobWdEYXRhLCAxKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnBvcE5ld0V4ZWNTdGFja3MoKTtcclxuICAgIHRoaXMuc2V0QWxsb3dFdmVudHMoc2F2ZWRBbGxvd0V2ZW50cyk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBoYW5kbGVFdmVudHMoYmFzZU1nRGF0YTogTUdEYXRhLCBldmVudHNUb0hhbmRsZUNudDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiA7XHJcbiAgYXN5bmMgaGFuZGxlRXZlbnRzKGhhbmRsZXJzVGFiOiBIYW5kbGVyc1RhYmxlLCBydEV2dDogUnVuVGltZUV2ZW50KTogUHJvbWlzZTx2b2lkPiA7XHJcbiAgYXN5bmMgaGFuZGxlRXZlbnRzKGJhc2VNZ0RhdGFPckhhbmRsZXJzVGFiOiBhbnksIGV2ZW50c1RvSGFuZGxlQ250T3JSdEV2dDogYW55KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoKGJhc2VNZ0RhdGFPckhhbmRsZXJzVGFiID09PSBudWxsIHx8IGJhc2VNZ0RhdGFPckhhbmRsZXJzVGFiIGluc3RhbmNlb2YgTUdEYXRhKSAmJiAoZXZlbnRzVG9IYW5kbGVDbnRPclJ0RXZ0ID09PSBudWxsIHx8IGV2ZW50c1RvSGFuZGxlQ250T3JSdEV2dC5jb25zdHJ1Y3RvciA9PT0gTnVtYmVyKSkge1xyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUV2ZW50c18wKGJhc2VNZ0RhdGFPckhhbmRsZXJzVGFiLCBldmVudHNUb0hhbmRsZUNudE9yUnRFdnQpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBhd2FpdCB0aGlzLmhhbmRsZUV2ZW50c18xKGJhc2VNZ0RhdGFPckhhbmRsZXJzVGFiLCBldmVudHNUb0hhbmRsZUNudE9yUnRFdnQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCBhbmQgcmVtb3ZlIGV2ZW50cyBmcm9tIHRoZSBxdWV1ZSBhbmQgaGFuZGxlIHRoZW0gb25lIGJ5IG9uZSB0aWxsIHRoZSBxdWV1ZSBpcyBlbXB0eVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJiYXNlTWdEYXRhXCI+IG1nZGF0YSBvZiB0aGUgd2luZG93IHRoYXQgb3BlbmVkZWQgdGhhdCBoYWJkbGUgZXZlbnQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiRXZlbnRzVG9IYW5kbGVDbnRcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlRXZlbnRzXzAoYmFzZU1nRGF0YTogTUdEYXRhLCBldmVudHNUb0hhbmRsZUNudDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgdGFzazogVGFzayA9IG51bGw7XHJcbiAgICBsZXQgZGVsdGE6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgZXZlbnRzUG9sbGVkQ250OiBudW1iZXIgPSAwO1xyXG5cclxuICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbihmYWxzZSk7XHJcblxyXG4gICAgLy8gZ2V0IGFuZCByZW1vdmUgZXZlbnRzIGZyb20gdGhlIHF1ZXVlIHRpbGwgaXRzIGVtcHR5XHJcbiAgICB3aGlsZSAoIXRoaXMuX2V2ZW50c1F1ZXVlLmlzRW1wdHkoKSAmJiAhdGhpcy5fc3RvcEV4ZWN1dGlvbiAmJiAoZXZlbnRzVG9IYW5kbGVDbnQgPT09IDAgfHwgZXZlbnRzUG9sbGVkQ250IDwgZXZlbnRzVG9IYW5kbGVDbnQpKSB7XHJcbiAgICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gdGhpcy5nZXRFdmVudCgpO1xyXG4gICAgICBpZiAocnRFdnQgIT09IG51bGwgJiYgcnRFdnQuaXNHdWlUcmlnZ2VyZWRFdmVudCgpKSB7XHJcbiAgICAgICAgZGVsdGEgPSBNaXNjLmdldFN5c3RlbU1pbGxpc2Vjb25kcygpO1xyXG4gICAgICAgIHRoaXMuX2N1cnJLYmRJdGVtID0gbnVsbDtcclxuXHJcbiAgICAgICAgbGV0IGJsb2NrZWRCeU1vZGFsV2luZG93OiBib29sZWFuID0gcnRFdnQuaXNCbG9ja2VkQnlNb2RhbFdpbmRvdyhiYXNlTWdEYXRhKTtcclxuICAgICAgICBpZiAoYmxvY2tlZEJ5TW9kYWxXaW5kb3cgJiYgcnRFdnQuZ2V0SW50ZXJuYWxDb2RlKCkgIT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9USU1FUikgLy8gUUNSICM3MjYxOTgsIGV2ZW50cyBmcm9tIC5ORVQgb2JqZWN0cyB3aGljaCBhcmUgbm90IG9uIGZvcm1cclxuICAgICAgICAvLyBzaG91bGQgYmUgaGFuZGxlZCBvbiBwYXJlbnQgb2YgbW9kYWwgd2luZG93IGFsc29cclxuICAgICAgICB7XHJcbiAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIElkbGUgdGltZXIsIHRpbWVyIGV2ZW50cyBhbmQgZW5hYmxlL2Rpc2FibGUgZXZlbnRzIHNob3VsZCBub3QgY2hhbmdlIHRoZSBjdXJyZW50IHdpbmRvdy5cclxuICAgICAgICAvLyBUaGlzIGlzIGJlY2F1c2UgdGhlIGN1cnJlbnQgd2luZG93IGRldGVybWluZXMgdGhlIGN1cnJlbnQgdGFzayBhbmQgY2hhbmdpbmcgdGhlIHRhc2tcclxuICAgICAgICAvLyBjYXVzZXMgc29tZSB0YXNrLXNjb3BlZCBldmVudHMgdG8gcnVuIG9uIHN1Yi10YXNrcyBhcyB3ZWxsLlxyXG4gICAgICAgIGlmICghcnRFdnQuaXNJZGxlVGltZXIoKSAmJiAhYmxvY2tlZEJ5TW9kYWxXaW5kb3cgJiYgcnRFdnQuZ2V0SW50ZXJuYWxDb2RlKCkgIT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FTkFCTEVfRVZFTlRTICYmIHJ0RXZ0LmdldEludGVybmFsQ29kZSgpICE9PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRElTQUJMRV9FVkVOVFMgJiYgcnRFdnQuZ2V0VGFzaygpICE9PSBudWxsICYmICFydEV2dC5nZXRUYXNrKCkuZ2V0TUdEYXRhKCkuSXNBYm9ydGluZykge1xyXG4gICAgICAgICAgTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5jdXJyTWdkSUQgPSBydEV2dC5nZXRUYXNrKCkuZ2V0TUdEYXRhKCkuR2V0SWQoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgbGV0IGN1cnJNZ2Q6IE1HRGF0YSA9IE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuZ2V0Q3Vyck1HRGF0YSgpO1xyXG4gICAgICBpZiAoY3Vyck1nZCAhPT0gbnVsbCkge1xyXG4gICAgICAgIHdoaWxlIChjdXJyTWdkICE9PSBudWxsICYmIGN1cnJNZ2QuSXNBYm9ydGluZykge1xyXG4gICAgICAgICAgY3Vyck1nZCA9IGN1cnJNZ2QuZ2V0UGFyZW50TUdkYXRhKCk7XHJcbiAgICAgICAgICBpZiAoY3Vyck1nZCAhPT0gbnVsbClcclxuICAgICAgICAgICAgTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5jdXJyTWdkSUQgPSBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLmdldE1nRGF0YUlkeChjdXJyTWdkKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLyogUUNScyAjNzc3MjE3ICYgIzk0Mjk2OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cclxuICAgICAgICAvKiBJdCBtaWdodCBoYXBwZW4gdGhhdCB3ZSBoYXZlIHJlbW92ZWQgdGhlIE1HRGF0YSAgICAqL1xyXG4gICAgICAgIC8qIGZyb20gdGhlIE1HVGFibGUgaW4gTWFuYWdlci5DbG9zZUV2ZW50KCkuICAqL1xyXG4gICAgICAgIC8qIEl0IHdhcyBkb25lIGZvciBmaXhpbmcgUUNSIyAyOTYyNzcgcmVsYXRpbmcgdG8gbWVtICovXHJcbiAgICAgICAgLyogbGVha3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cclxuICAgICAgICAvKiBJbiB0aGF0IGNhc2UsIG1nZCB3b3VsZCBiZSBudWxsIGhlcmUuICAgICAgICAgICAgICAqL1xyXG4gICAgICAgIC8qIEluIHN1Y2ggYSBzY2VuYXJpbywgdGFrZSB0aGUgcGFyZW50IG1nZCBmcm9tIHRoZSAgICovXHJcbiAgICAgICAgLyogcmVsYXRlZCB0YXNrIGFuZCBjb250aW51ZSBwcm9jZXNzaW5nIHRoZSBldmVudHMuICAgKi9cclxuICAgICAgICB0YXNrID0gPFRhc2s+cnRFdnQuZ2V0VGFzaygpO1xyXG4gICAgICAgIHdoaWxlIChjdXJyTWdkID09PSBudWxsICYmIHRhc2sgIT09IG51bGwgJiYgdGFzay5nZXRQYXJlbnQoKSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgdGFzayA9IDxUYXNrPnRhc2suZ2V0UGFyZW50KCk7XHJcbiAgICAgICAgICBjdXJyTWdkID0gdGFzay5nZXRNR0RhdGEoKTtcclxuICAgICAgICAgIGlmIChjdXJyTWdkLklzQWJvcnRpbmcpXHJcbiAgICAgICAgICAgIGN1cnJNZ2QgPSBudWxsO1xyXG5cclxuICAgICAgICAgIGlmIChjdXJyTWdkICE9PSBudWxsKVxyXG4gICAgICAgICAgICBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLmN1cnJNZ2RJRCA9IE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuZ2V0TWdEYXRhSWR4KGN1cnJNZ2QpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAoY3Vyck1nZCA9PT0gbnVsbClcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGlmIChydEV2dC5nZXRUYXNrKCkgPT09IG51bGwpIHtcclxuICAgICAgICB0YXNrID0gTGFzdEZvY3VzZWRNYW5hZ2VyLkluc3RhbmNlLmdldExhc3RGb2N1c2VkVGFzaygpO1xyXG4gICAgICAgIHdoaWxlICh0YXNrICE9PSBudWxsICYmICh0YXNrLmlzQWJvcnRpbmcoKSB8fCB0YXNrLkluRW5kVGFzaykpXHJcbiAgICAgICAgICB0YXNrID0gPFRhc2s+dGFzay5nZXRQYXJlbnQoKTtcclxuXHJcbiAgICAgICAgaWYgKHRhc2sgIT09IG51bGwpIHtcclxuICAgICAgICAgIHJ0RXZ0LnNldEN0cmwoPE1nQ29udHJvbD50YXNrLmdldExhc3RQYXJrZWRDdHJsKCkpO1xyXG4gICAgICAgICAgcnRFdnQuc2V0VGFzayh0YXNrKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZVxyXG4gICAgICAgIHRhc2sgPSA8VGFzaz5ydEV2dC5nZXRUYXNrKCk7XHJcblxyXG4gICAgICBpZiAodGFzayAhPT0gbnVsbCkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRXZlbnQocnRFdnQsIGZhbHNlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgR1VJTWFuYWdlci5JbnN0YW5jZS5leGVjR3VpQ29tbWFuZFF1ZXVlKCk7XHJcbiAgICAgIHRoaXMuX2N1cnJDdHJsID0gbnVsbDsgLy8gZGVsZXRlIGN1cnJlbnQgcHJvY2Vzc2VkIGNvbnRyb2xcclxuXHJcbiAgICAgIGlmICh0YXNrICE9PSBudWxsKVxyXG4gICAgICAgIGF3YWl0IFRhc2suQ29tbWFuZHNQcm9jZXNzb3IuU2VuZE1vbml0b3JPbmx5KCk7XHJcbiAgICAgIGVsc2Uge1xyXG5cclxuICAgICAgICBhd2FpdCBUYXNrLkNvbW1hbmRzUHJvY2Vzc29yLlNlbmRNb25pdG9yT25seSgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAocnRFdnQgIT09IG51bGwgJiYgcnRFdnQuaXNHdWlUcmlnZ2VyZWRFdmVudCgpKSB7XHJcbiAgICAgICAgLy8gbG9nZ2luZyBmb3IgcGVyZm9ybWFuY2VcclxuICAgICAgICBpZiAoZGVsdGEgPiAwKSB7XHJcbiAgICAgICAgICBkZWx0YSA9IE1pc2MuZ2V0U3lzdGVtTWlsbGlzZWNvbmRzKCkgLSBkZWx0YTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIGFkdmFuY2UgRXZlbnRzUG9sbGVkIG9ubHkgaWYgdGhlIGV2ZW50IGlzIGludGVybmFsLiBvdGhlcndpc2UgaW50ZXJuYWxzIHRvIGJlIGV4ZWN1dGVkIHdpbGwgYmUgbmV2ZXIgcmVhY2hlZCBieSBub24gaW50ZXJhY3RpdmUgdGFza3MuXHJcbiAgICAgIGlmIChldmVudHNUb0hhbmRsZUNudCA+IDAgJiYgcnRFdnQgIT09IG51bGwgJiYgcnRFdnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0lOVEVSTkFMICYmIHJ0RXZ0LkludGVybmFsRXZlbnQgPCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVE9UX0NOVClcclxuICAgICAgICBldmVudHNQb2xsZWRDbnQrKztcclxuICAgIH0gLy8gd2hpbGUgKCFfZXZlbnRzUXVldWUuaXNFbXB0eSgpIC4uLlxyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBIYW5kbGUgc3RvcCBleGVjdXRpb24gd2hpbGUgZXhlY3V0aW5nIGFueSBoYW5kbGVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJ0RXZ0XCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlU3RvcEV4ZWN1dGlvbihydEV2dDogUnVuVGltZUV2ZW50KTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgc3RvcDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKVxyXG4gICAgICByZXR1cm4gc3RvcDtcclxuXHJcbiAgICBsZXQgdGFzazogVGFzayA9IDxUYXNrPnJ0RXZ0LmdldFRhc2soKTtcclxuICAgIGxldCBjdXJyQ3RybDogTWdDb250cm9sID0gPE1nQ29udHJvbD5ydEV2dC5Db250cm9sO1xyXG4gICAgbGV0IGxhc3RQYXJrZWRDdHJsOiBNZ0NvbnRyb2wgPSBMYXN0Rm9jdXNlZE1hbmFnZXIuZ2V0TGFzdEZvY3VzZWRDb250cm9sKCk7XHJcbiAgICBsZXQgZW5kVGFza0R1ZVRvVmVyaWZ5RXJyb3I6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGlmIChydEV2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfSU5URVJOQUwpIHtcclxuICAgICAgc3dpdGNoIChydEV2dC5nZXRJbnRlcm5hbENvZGUoKSkge1xyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RBU0tfUFJFRklYOlxyXG4gICAgICAgICAgZW5kVGFza0R1ZVRvVmVyaWZ5RXJyb3IgPSB0cnVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVg6XHJcbiAgICAgICAgICAvLyBBbiBlcnJvciBpbiB0aGUgcmVjb3JkIHByZWZpeCBzZW5kcyB1cyByaWdodCBiYWNrIHRvIHRoZSBzdGFydCBvZiB0aGUgcmVjb3JkIHByZWZpeC5cclxuICAgICAgICAgIC8vIEl0IG1pZ2h0IGNyZWF0ZSBhbiBlbmRsZXNzIGxvb3AgYnV0IGl0IGlzIE9LIHRvIGRvIHNvLiBJdCBpcyBhIGRldmVsb3BlciBidWcuXHJcbiAgICAgICAgICBlbmRUYXNrRHVlVG9WZXJpZnlFcnJvciA9IHRydWU7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWDpcclxuICAgICAgICAgIC8vIGl0IHdpbGwgYmUgaGFuZGxlZCBpbiBjb21tb25oYW5kbGVyYWZ0ZXJcclxuICAgICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbkN0cmwobnVsbCk7XHJcbiAgICAgICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb25DdHJsKDxNZ0NvbnRyb2w+dGFzay5nZXRMYXN0UGFya2VkQ3RybCgpKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1BSRUZJWDpcclxuICAgICAgICAgIC8vIEVycm9yIG1pZ2h0IGhhdmUgb2NjdXJyZWQgaW4gQ1AuXHJcbiAgICAgICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb24oZmFsc2UpO1xyXG4gICAgICAgICAgdGFzay5JbkN0cmxQcmVmaXggPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICBpZiAobGFzdFBhcmtlZEN0cmwgPT09IG51bGwpXHJcbiAgICAgICAgICAvLyBvbmx5IGZvciB0aGUgZmlyc3QgdGltZVxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICB0YXNrLnNldEN1cnJGaWVsZChudWxsKTtcclxuXHJcbiAgICAgICAgICAgIC8vIHJlc2V0IHRoZSBzdG9wIGV4ZWN1dGlvbiBjdHJsXHJcbiAgICAgICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbkN0cmwobnVsbCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbkN0cmwoY3VyckN0cmwpO1xyXG5cclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5IYW5kbGVOb25QYXJrYWJsZUNvbnRyb2xzKHRhc2spO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gQ1AgZ290IHN0b3AgZXhlY3V0aW9uIHdoaWxlIGV4ZWN1dGluZyB0aGUgb3BlcmF0aW9ucyBpbiB0aGlzIGhhbmRsZXIgYW5kIGlzIHBhcmthYmxlLlxyXG4gICAgICAgICAgICAvLyB3ZSBtb3ZlIHRvIHRoZSBMYXN0UGFya2FibGUgY29udHJvbFxyXG5cclxuICAgICAgICAgICAgdGFzay5zZXRDdXJyRmllbGQobGFzdFBhcmtlZEN0cmwuZ2V0RmllbGQoKSk7XHJcblxyXG4gICAgICAgICAgICBhd2FpdCBGb2N1c01hbmFnZXIuU2V0Rm9jdXMobGFzdFBhcmtlZEN0cmwsIC0xKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbih0cnVlKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1NVRkZJWDpcclxuICAgICAgICAgIC8vIEl0IG11c3QgYmUgc2V0IHRvIGZhbHNlIHNvIHRoYXQgbmV4dCB0aW1lIGZvciBmYXN0IG1vZGUgQ1MgbXVzdCBiZSBleGVjdXRlZC5cclxuICAgICAgICAgIGN1cnJDdHJsLnNldEluQ29udHJvbFN1ZmZpeChmYWxzZSk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIH1cclxuICAgICAgaWYgKGVuZFRhc2tEdWVUb1ZlcmlmeUVycm9yKSB7XHJcbiAgICAgICAgYXdhaXQgdGFzay5lbmRUYXNrKHRydWUsIGZhbHNlLCB0cnVlKTtcclxuICAgICAgICBzdG9wID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHN0b3A7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdGFrZSBjYXJlIG9mIFwiRm9yY2UgRXhpdFwiIGJlZm9yZSB0aGUgaGFuZGxlciBleGVjdXRlIGl0cyBvcGVyYXRpb25zIHJldHVybnMgdHJ1ZVxyXG4gIC8vLyAgIGlmIHRoZSBmb3JjZSBleGl0IHdhcyBoYW5kbGVkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImV2ZW50XCI+dGhlIGV2ZW50IG9mIHRoZSBoYW5kbGVyXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJydEV2dFwiPnRoZSBydW4tdGltZSBldmVudFxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlRm9yY2VFeGl0QmVmb3JlKGV2dDogRXZlbnQsIHJ0RXZ0OiBSdW5UaW1lRXZlbnQpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCBmb3JjZUV4aXQ6IEZvcmNlRXhpdCA9IGV2dC5Vc2VyRXZ0LkZvcmNlRXhpdDtcclxuICAgIGxldCBpc05ld1JlYzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IG9sZElkeDogbnVtYmVyID0gMDtcclxuXHJcbiAgICAvLyBUT0RPOiBjaGVjayB0aGUgZWZmZWN0IG9mIHJlbW92aW5nIGZvcmNlRXhpdCA9PT0gPEZvcmNlRXhpdD4wXHJcbiAgICBpZiAoZm9yY2VFeGl0ID09PSBGb3JjZUV4aXQuTm9uZSB8fCBydEV2dC5pc0ltbWVkaWF0ZSgpKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB0aGlzLl9pc0hhbmRsaW5nRm9yY2VFeGl0ID0gdHJ1ZTtcclxuICAgIGxldCB0YXNrOiBUYXNrID0gPFRhc2s+cnRFdnQuZ2V0VGFzaygpO1xyXG4gICAgbGV0IG9sZFJlYzogUmVjb3JkID0gKDxEYXRhVmlldz50YXNrLkRhdGFWaWV3KS5nZXRDdXJyUmVjKCk7XHJcbiAgICBpZiAob2xkUmVjICE9PSBudWxsICYmIG9sZFJlYy5nZXRNb2RlKCkgPT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5JbnNlcnQgJiYgb2xkUmVjLmlzTmV3UmVjKCkpIHtcclxuICAgICAgaXNOZXdSZWMgPSB0cnVlO1xyXG4gICAgICBvbGRJZHggPSBvbGRSZWMuZ2V0SWQoKTtcclxuICAgIH1cclxuICAgIGlmIChmb3JjZUV4aXQgIT09IEZvcmNlRXhpdC5FZGl0aW5nICYmIHRhc2suZ2V0TGV2ZWwoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfQ09OVFJPTCkge1xyXG4gICAgICBsZXQgY3RybDogTWdDb250cm9sID0gPE1nQ29udHJvbD50YXNrLmdldExhc3RQYXJrZWRDdHJsKCk7XHJcbiAgICAgIGlmIChjdHJsICE9PSBudWxsKVxyXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhNZ0NvbnRyb2xCYXNlKGN0cmwsIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1NVRkZJWCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gU2hvdWxkIHdlIGV4aXQgdGhlIHJlY29yZD9cclxuICAgIGlmICgoZm9yY2VFeGl0ID09PSBGb3JjZUV4aXQuUHJlUmVjb3JkVXBkYXRlIHx8IGZvcmNlRXhpdCA9PT0gRm9yY2VFeGl0LlBvc3RSZWNvcmRVcGRhdGUpICYmIHRhc2suZ2V0TGV2ZWwoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfUkVDT1JEKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKTtcclxuICAgICAgaWYgKHRhc2suZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSAmJiAhdGhpcy5fc3RvcEV4ZWN1dGlvbilcclxuICAgICAgICB0YXNrLnNldE1vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9NT0RJRlkpO1xyXG4gICAgICBsZXQgY3VyclJlYzogUmVjb3JkID0gKDxEYXRhVmlldz50YXNrLkRhdGFWaWV3KS5nZXRDdXJyUmVjKCk7XHJcbiAgICAgIC8vIElmIHdlIGZhaWxlZCBleGl0aW5nIGEgbmV3bHkgY3JlYXRlZCByZWNvcmQgLSByZXN0b3JlIGluc2VydCBtb2RlIG9mIHRoZSByZWNvcmRcclxuICAgICAgaWYgKGN1cnJSZWMgIT09IG51bGwgJiYgdGhpcy5fc3RvcEV4ZWN1dGlvbiAmJiBpc05ld1JlYyAmJiBvbGRJZHggPT09IGN1cnJSZWMuZ2V0SWQoKSAmJiB0YXNrLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpIHtcclxuICAgICAgICAvLyByZXN0b3JlIGluc2VydCBtb2RlIG9mIHRoZSByZWNvcmRcclxuICAgICAgICBjdXJyUmVjLmNsZWFyTW9kZSgpO1xyXG4gICAgICAgIGN1cnJSZWMucmVzdGFydChEYXRhTW9kaWZpY2F0aW9uVHlwZXMuSW5zZXJ0KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKGZvcmNlRXhpdCA9PT0gRm9yY2VFeGl0LlBvc3RSZWNvcmRVcGRhdGUgJiYgIXRoaXMuX3N0b3BFeGVjdXRpb24pIHtcclxuICAgICAgaWYgKHRhc2suZ2V0TGV2ZWwoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSylcclxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUUNSICMzMDM3NjIgLSBhZGRpdGlvbmFsIHN1cHBvcnQgZm9yIGZvcmNlRXhpdCA9IGVkaXRpbmdcclxuICAgIGlmIChmb3JjZUV4aXQgPT09IEZvcmNlRXhpdC5FZGl0aW5nKSB7XHJcbiAgICAgIGxldCBldnRDdHJsOiBNZ0NvbnRyb2wgPSA8TWdDb250cm9sPnJ0RXZ0LkNvbnRyb2w7XHJcblxyXG4gICAgICBpZiAoZXZ0Q3RybCAhPT0gbnVsbCAmJiBldnRDdHJsLmdldEZpZWxkKCkgIT09IG51bGwpIHtcclxuICAgICAgICBsZXQgY3RybFZhbDogc3RyaW5nID0gTWFuYWdlci5HZXRDdHJsVmFsKGV2dEN0cmwpO1xyXG4gICAgICAgIC8vIHRlc3QgdGhlIG5ldyBjb250cm9sIHZhbHVlXHJcbiAgICAgICAgYXdhaXQgZXZ0Q3RybC52YWxpZGF0ZUFuZFNldFZhbHVlKGN0cmxWYWwsIHRydWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB0YWtlIGNhcmUgb2YgXCJGb3JjZSBFeGl0XCIgYWZ0ZXIgaGFuZGxpbmcgdGhlIGV2ZW50IDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJ0RXZ0XCI+dGhlIHJ1bi10aW1lIGV2ZW50IDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVGb3JjZUV4aXRBZnRlcihydEV2dDogUnVuVGltZUV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgZm9yY2VFeGl0OiBGb3JjZUV4aXQgPSBydEV2dC5Vc2VyRXZ0LkZvcmNlRXhpdDtcclxuXHJcbiAgICBsZXQgdGFzazogVGFzayA9IDxUYXNrPnJ0RXZ0LmdldFRhc2soKTtcclxuXHJcbiAgICAvLyBRQ1IjNzc2Mjk1OiBmb3IgcHJlIHJlY29yZCB1cGRhdGUsIGNvbW1pdCB0aGUgcmVjb3JkIGFmdGVyIGhhbmRsZXIncyBleGVjdXRpb24uXHJcbiAgICBpZiAoZm9yY2VFeGl0ID09PSBGb3JjZUV4aXQuUHJlUmVjb3JkVXBkYXRlKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuY29tbWl0UmVjb3JkKHRhc2ssIHRydWUpO1xyXG4gICAgICBpZiAoIXRhc2sudHJhbnNhY3Rpb25GYWlsZWQoQ29uc3RJbnRlcmZhY2UuVFJBTlNfUkVDT1JEX1BSRUZJWCkgJiYgIXRhc2suaXNBYm9ydGluZygpKSB7XHJcbiAgICAgICAgLy8gY2hlY2sgd2hldGhlciB0byBldmFsdWF0ZSB0aGUgZW5kIGNvbmRpdGlvbiBhZnRlciB0aGUgcmVjb3JkIHN1ZmZpeFxyXG4gICAgICAgIGlmIChhd2FpdCB0YXNrLmV2YWxFbmRDb25kKENvbnN0SW50ZXJmYWNlLkVORF9DT05EX0VWQUxfQUZURVIpKVxyXG4gICAgICAgICAgYXdhaXQgdGFzay5lbmRUYXNrKHRydWUsIGZhbHNlLCBmYWxzZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBGb3IgcG9zdC1yZWNvcmQgdHlwZSB3ZSBhbHJlYWR5IGRpZCByZWMtcHJlZml4IGFuZCBjdHJsIHByZWZpeCBpbiB0aGUgaGFuZGxlRm9yY2VFeGl0QmVmb3JlXHJcbiAgICBpZiAoZm9yY2VFeGl0ICE9PSBGb3JjZUV4aXQuUG9zdFJlY29yZFVwZGF0ZSkge1xyXG4gICAgICB0YXNrID0gPFRhc2s+cnRFdnQuZ2V0VGFzaygpO1xyXG4gICAgICBpZiAodGFzay5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKVxyXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuICAgIH1cclxuICAgIGxldCBjdHJsOiBNZ0NvbnRyb2wgPSBMYXN0Rm9jdXNlZE1hbmFnZXIuZ2V0TGFzdEZvY3VzZWRDb250cm9sKCk7XHJcbiAgICBpZiAoY3RybCAhPT0gbnVsbCAmJiBmb3JjZUV4aXQgIT09IEZvcmNlRXhpdC5FZGl0aW5nKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhNZ0NvbnRyb2xCYXNlKGN0cmwsIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1BSRUZJWCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUUNSIDgwMTg3MyAtIHVwZGF0ZSB0aGUgZGlzcGxheSBhZnRlciBoYW5kbGVyIG9mIGZvcmNlIGV4aXQgZWRpdGluZ1xyXG4gICAgaWYgKGZvcmNlRXhpdCA9PT0gRm9yY2VFeGl0LkVkaXRpbmcpIHtcclxuICAgICAgbGV0IGV2dEN0cmw6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+cnRFdnQuQ29udHJvbDtcclxuICAgICAgLy8gaWYgdGhlcmUgaXMgYSBjb250cm9sIHRoYXQgaXMgYXR0YWNoZWQgdG8gYSBmaWVsZFxyXG4gICAgICBpZiAoZXZ0Q3RybCAhPT0gbnVsbCAmJiBldnRDdHJsLmdldEZpZWxkKCkgIT09IG51bGwpXHJcbiAgICAgICAgYXdhaXQgKDxGaWVsZD5ldnRDdHJsLmdldEZpZWxkKCkpLnVwZGF0ZURpc3BsYXkoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBhIHNwZWNpYWwgcm91dGluZSB0byBoYW5kbGUgZGF0YSBhbmQgdGltZXIgZXZlbnRzXHJcbiAgLy8vICAgaXQgcmVjZWl2ZXMgYSBIYW5kbGVyc1RhYmxlIGFuZCBleGVjdXRlIHRoZW0gb25lIGJ5IG9uZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJoYW5kbGVyc1RhYlwiPnRoZSBoYW5kbGVycyB0YWJsZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJydEV2dFwiPmEgcmVmZXJlbm5jZSB0byB0aGUgdGltZXIgcnVudGltZSBldmVudCAtIGZvciBleHByZXNzaW9uIGV2ZW50cyBpdCBtdXN0IGJlIG51bGw8L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlRXZlbnRzXzEoaGFuZGxlcnNUYWI6IEhhbmRsZXJzVGFibGUsIHJ0RXZ0OiBSdW5UaW1lRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMucHVzaFJ0RXZlbnQocnRFdnQpO1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgaGFuZGxlcnNUYWIuZ2V0U2l6ZSgpOyBpKyspIHtcclxuICAgICAgICBsZXQgaGFuZGxlcjogRXZlbnRIYW5kbGVyID0gaGFuZGxlcnNUYWIuZ2V0SGFuZGxlcihpKTtcclxuICAgICAgICAvLyB0aGUgcnRFdnQgaXMgdXNlZCB0byBwYXNzIHRoZSBjdHJsLCB0aGVyZWZvciBpdCBtdXN0IGJlIHZhbGlkIChub3QgbnVsbClcclxuICAgICAgICBpZiAocnRFdnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0VYUFJFU1NJT04gfHwgaGFuZGxlci5pc1NwZWNpZmljSGFuZGxlck9mKHJ0RXZ0KSB8fCBoYW5kbGVyLmlzTm9uU3BlY2lmaWNIYW5kbGVyT2YocnRFdnQpIHx8IGhhbmRsZXIuaXNHbG9iYWxIYW5kbGVyT2YocnRFdnQpKSB7XHJcbiAgICAgICAgICBhd2FpdCBoYW5kbGVyLmV4ZWN1dGUocnRFdnQsIGZhbHNlLCBmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGZpbmFsbHkge1xyXG4gICAgICB0aGlzLnBvcFJ0RXZlbnQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBUYWtlcyBjYXJlIG9mIGtleWRvd24gRXZlbnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFza1wiPnRhc2s8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPmNvbnRyb2wgcHJlc3NlZDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJrYmRJdGVtXCI+a2V5Ym9yZCBpdGVtPC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIGhhbmRsZUtleURvd24odGFzazogVGFzaywgY3RybDogTWdDb250cm9sLCBldnQ6IFJ1blRpbWVFdmVudCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGtiZEl0ZW06IEtleWJvYXJkSXRlbSA9IGV2dC5nZXRLYmRJdG1BbHdheXMoKTtcclxuICAgIGxldCBrZXlDb2RlOiBudW1iZXIgPSBrYmRJdGVtLmdldEtleUNvZGUoKTtcclxuICAgIHRoaXMuX2N1cnJLYmRJdGVtID0ga2JkSXRlbTtcclxuXHJcbiAgICAvLyBJZiBrZXlib2FyZCBidWZmZXJpbmcgaXMgcmVzcG9uc2libGUgZm9yIHRoaXMgZXZlbnQsIHdlIG5lZWQgdG8gZmluZCB0aGUgcmlnaHQgY29udHJvbCB0byByZWNlaXZlXHJcbiAgICAvLyB0aGlzIGV2ZW50XHJcbiAgICBpZiAoZXZ0Lklnbm9yZVNwZWNpZmllZENvbnRyb2wpIHtcclxuICAgICAgY3RybCA9IHRoaXMuZ2V0Q3VyckN0cmwoKTtcclxuICAgICAgdGFzayA9ICgoKGN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKSBpbnN0YW5jZW9mIFRhc2spID8gPFRhc2s+Y3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpIDogbnVsbCkpO1xyXG4gICAgICAvLyBUaGUgY29udHJvbCByZWNlaXZpbmcga2V5cyBmcm9tIGtleWJvYXJkIGJ1ZmZlcmluZyBtdXN0IGJlIGEgdGV4dGJveFxyXG4gICAgICBpZiAoY3RybC5UeXBlICE9PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9URVhUKVxyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZygnU3RhcnQgaGFuZGxpbmcgS0VZRE9XTiBldmVudC4gS2V5IGNvZGU6ICcgKyBrZXlDb2RlKTtcclxuXHJcbiAgICB0cnkge1xyXG5cclxuICAgICAgLy8gRE9XTiBvciBVUCBpbnZva2VkIG9uIGEgU0VMRUNUL1JBRElPIGNvbnRyb2xcclxuICAgICAgaWYgKHRoaXMuX2N1cnJLYmRJdGVtLmVxdWFscyh0aGlzLktCSV9ET1dOKSB8fCB0aGlzLl9jdXJyS2JkSXRlbS5lcXVhbHModGhpcy5LQklfVVApKSB7XHJcbiAgICAgICAgaWYgKGN0cmwgIT09IG51bGwgJiYgKGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfTElTVCB8fCBjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1JBRElPKSlcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KHRhc2ssIGN0cmwpO1xyXG4gICAgICBydEV2dC5zZXRTeXN0ZW0odGhpcy5fY3VycktiZEl0ZW0pO1xyXG4gICAgICBydEV2dC5zZXRFZGl0UGFybXMoZXZ0LmdldFN0YXJ0U2VsZWN0aW9uKCksIGV2dC5nZXRFbmRTZWxlY3Rpb24oKSwgZXZ0LmdldFZhbHVlKCkpO1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRXZlbnQocnRFdnQsIGZhbHNlKTtcclxuICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICBpZiAodGhpcy5fc3RvcEV4ZWN1dGlvbikge1xyXG4gICAgICAgICAgbGV0IHJldHVyblRvQ3RybDogTWdDb250cm9sID0gTWdDb250cm9sLlJldHVyblRvQ3RybDtcclxuICAgICAgICAgIGlmIChyZXR1cm5Ub0N0cmwgIT09IG51bGwgJiYgTWdDb250cm9sLnZhbGlkUmV0dXJuVG9DdHJsKCkpXHJcbiAgICAgICAgICAgIHJldHVyblRvQ3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpLnNldExhc3RQYXJrZWRDdHJsKHJldHVyblRvQ3RybCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGxldCBtZ2Q6IE1HRGF0YSA9IE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuZ2V0Q3Vyck1HRGF0YSgpO1xyXG4gICAgICAvLyBjaGVjayBpZiB0aGUgTUdEYXRhIGlzIHN0aWxsIGFsaXZlIGFmdGVyIGhhbmRsaW5nIHRoZSBldmVudHMgYWJvdmVcclxuICAgICAgaWYgKG1nZCAhPT0gbnVsbCAmJiAhbWdkLklzQWJvcnRpbmcpXHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVFeHByZXNzaW9uSGFuZGxlcnMoKTtcclxuICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coJ0VuZCBoYW5kbGluZyBLRVlET1dOIGV2ZW50LiBLZXkgY29kZTogJyArIGtleUNvZGUpO1xyXG4gICAgICAvLyBpZiBhIGtleSB3YXMgcHJlc3NlZCBvbiB0YWJsZSBjaGlsZCwgbWFrZSBzdXJlIHRoYXQgaXMgaXMgdmlzaWJsZVxyXG4gICAgICBpZiAoY3RybCAhPT0gbnVsbCAmJiBjdHJsLklzUmVwZWF0YWJsZSAmJiBjdHJsID09PSBNZ0NvbnRyb2wuUmV0dXJuVG9DdHJsKSB7XHJcbiAgICAgICAgYXdhaXQgKDxNZ0Zvcm0+Y3RybC5nZXRGb3JtKCkpLmJyaW5nUmVjb3JkVG9QYWdlKCk7XHJcbiAgICAgIH1cclxuICAgIH0gZmluYWxseSB7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+SGFuZGxlIFNlbGVjdGlvbiBFdmVudDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj5jb250cm9sPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImxpbmVcIj5saW5lPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbHVlXCI+dmFsdWU8L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlU2VsZWN0aW9uKGN0cmw6IE1nQ29udHJvbCwgbGluZTogbnVtYmVyLCB2YWw6IGFueSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfVEFCIHx8IGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQ0hFQ0tCT1ggfHwgY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9SQURJTyB8fCBjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0NPTUJPIHx8IGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfTElTVCkge1xyXG4gICAgICBsZXQgY2hlY2tGb2N1czogYm9vbGVhbiA9IChjdHJsLlR5cGUgIT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1RBQiAmJiBjdHJsLlR5cGUgIT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0NIRUNLQk9YKTtcclxuICAgICAgbGV0IGFsbG93U2VsZWN0aW9uOiBib29sZWFuID0gKGNoZWNrRm9jdXMgPyAoY3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldExhc3RQYXJrZWRDdHJsKCkgPT09IGN0cmwpIDogdHJ1ZSk7XHJcblxyXG4gICAgICBpZiAoIWFsbG93U2VsZWN0aW9uIHx8ICFjdHJsLmlzTW9kaWZpYWJsZSgpIHx8ICFhd2FpdCBjdHJsLklzUGFya2FibGUoKSlcclxuICAgICAgICBhd2FpdCBjdHJsLnJlc3RvcmVPbGRWYWx1ZSgpO1xyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBpZiAoY3RybC5pc0Nob2ljZUNvbnRyb2woKSlcclxuICAgICAgICAgIENvbW1hbmRzLnNldEdldFN1Z2dlc3RlZFZhbHVlT2ZDaG9pY2VDb250cm9sT25UYWdEYXRhKGN0cmwsIGN0cmwuSXNSZXBlYXRhYmxlID8gbGluZSA6IDAsIHRydWUpO1xyXG5cclxuICAgICAgICBpZiAoY3RybC5pc0RpZmZlcmVudFZhbHVlKHZhbCwgY3RybC5Jc051bGwsIHRydWUpKSB7XHJcbiAgICAgICAgICAvLyAjOTMxNTQ1IC0gdmFyIGNoYW5nZSBtdXN0IGJlIGludm9rZWQgZmlyc3QgYmVmb3JlIGNvbnRyb2wgdmVyaWZpY2F0aW9uLlxyXG4gICAgICAgICAgY3RybC5Nb2RpZmllZEJ5VXNlciA9IHRydWU7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUN0cmxNb2RpZnkoY3RybCwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1NFTEVDVElPTik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY3RybC5pc0Nob2ljZUNvbnRyb2woKSlcclxuICAgICAgICAgIENvbW1hbmRzLnNldEdldFN1Z2dlc3RlZFZhbHVlT2ZDaG9pY2VDb250cm9sT25UYWdEYXRhKGN0cmwsIGN0cmwuSXNSZXBlYXRhYmxlID8gbGluZSA6IDAsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgLy8gRm9yIG11bHRpcGxlIHNlbGVjdGlvbiBMaXN0Qm94IHZhbHVlIHRvIGZpZWxkIGFuZCBjdHJsIHdvdWxkIGJlIHNldCBvbiBsZWF2aW5nXHJcbiAgICAgICAgLy8gY29udHJvbCwgYmVmb3JlIGV4ZWN1dGluZyBjb250cm9sIHN1ZmZpeC4gU28gdmFyaWFibGUgY2hhbmdlIGludGVybmFsIGV2ZW50IHdvdWxkIGJlXHJcbiAgICAgICAgLy8gaGFuZGxlZCBiZWZvcmUgZXhlY3V0aW5nIGNvbnRyb2wgc3VmZml4LlxyXG4gICAgICAgIGlmICghY3RybC5Jc011bHRpcGxlU2VsZWN0aW9uTGlzdEJveCgpKVxyXG4gICAgICAgICAgYXdhaXQgY3RybC52YWxpZGF0ZUFuZFNldFZhbHVlKHZhbCwgdHJ1ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBIYW5kbGUgTW91c2UgVXAgRXZlbnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPmNvbnRvbFxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibGluZVwiPmxpbmUgb2YgbXVsdGlsaW5lIGNvbnRyb2xcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInByb2R1Y2VDbGlja1wiPmlmIHRydWUsIHByb2R1Y2UgY2xpY2sgZXZlbnRcclxuICAvLy8gPC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIGhhbmRsZU1vdXNlVXAoY3RybDogTWdDb250cm9sLCBsaW5lOiBudW1iZXIsIHByb2R1Y2VDbGljazogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKGN0cmwgPT09IG51bGwpXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICAvLyBRQ1IgIyA2MTQ0IHNlZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgX2N1cnJDbGlja2VkUmFkaW8gbWVtYmVyXHJcbiAgICBpZiAoY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9SQURJTylcclxuICAgICAgUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLkN1cnJlbnRDbGlja2VkUmFkaW8gPSBjdHJsO1xyXG4gICAgdHJ5IHtcclxuICAgICAgaWYgKGN0cmwuVHlwZSAhPT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfVEFCTEUpIHtcclxuICAgICAgICBpZiAoIWF3YWl0IGN0cmwuY2hlY2tQcm9wV2l0aExpbmUoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRU5BQkxFRCwgdHJ1ZSwgbGluZSkpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGNhbkdvdG9DdHJsOiBib29sZWFuID0gdGhpcy5jYW5Hb1RvQ29udHJvbChjdHJsLCB0cnVlKTtcclxuICAgICAgICBsZXQgU3RvcEZvY3VzOiBib29sZWFuID0gY3RybC5pc0ZvY3VzZWRTdG9wRXhlY3V0aW9uKCk7XHJcblxyXG4gICAgICAgIGxldCByZXR1cm5Ub0N0cmw6IE1nQ29udHJvbCA9IE1nQ29udHJvbC5SZXR1cm5Ub0N0cmw7XHJcblxyXG4gICAgICAgIGlmICgoIWNhbkdvdG9DdHJsIHx8ICgodGhpcy5fc3RvcEV4ZWN1dGlvbiB8fCBTdG9wRm9jdXMpICYmIHJldHVyblRvQ3RybCAhPT0gY3RybCkpICYmIHJldHVyblRvQ3RybCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5jdXJyTWdkSUQgPSAoPFRhc2s+cmV0dXJuVG9DdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkpLmdldE1nZElEKCk7XHJcbiAgICAgICAgICBpZiAocmV0dXJuVG9DdHJsLklzUmVwZWF0YWJsZSlcclxuICAgICAgICAgICAgYXdhaXQgKDxNZ0Zvcm0+cmV0dXJuVG9DdHJsLmdldEZvcm0oKSkuYnJpbmdSZWNvcmRUb1BhZ2UoKTtcclxuICAgICAgICAgIGF3YWl0IEZvY3VzTWFuYWdlci5TZXRGb2N1cyhyZXR1cm5Ub0N0cmwsIC0xKTtcclxuICAgICAgICAgIHJldHVyblRvQ3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpLnNldExhc3RQYXJrZWRDdHJsKHJldHVyblRvQ3RybCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLl9zdG9wRXhlY3V0aW9uIHx8IFN0b3BGb2N1cylcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHByb2R1Y2VDbGljayAmJiAoY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9CVVRUT04gfHwgY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9DSEVDS0JPWCB8fCBjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0xJU1QpKSB7XHJcbiAgICAgICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KGN0cmwpO1xyXG4gICAgICAgIHJ0RXZ0LnNldEludGVybmFsKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9XRUJfQ0xJQ0spO1xyXG4gICAgICAgIHRoaXMuYWRkVG9UYWlsKHJ0RXZ0KTtcclxuICAgICAgfVxyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLkN1cnJlbnRDbGlja2VkUmFkaW8gPSBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgQ2hlY2sgaWYgY3R4IGlzIHJlbW92ZWQgZnJvbSBzZXJ2ZXIsIGlmIHNvIGFuZCBjdXJyZW50IGV2ZW50IGlzIHJvdXRlIGV2ZW50ICwgdGhlbiBzYXZlIGl0XHJcbiAgLy8gIHRvIGV4ZWN1dGUgYWdhaW4gd2hlbiAgc2VydmVyIGN0eCBpcyByZWNyZWF0ZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGNoZWNrQW5kU2F2ZVJvdXRlRXZlbnRJZkN0eFJlbW92ZWRGcm9tU3J2cihhUnRFdnQ6IGFueSk6IHZvaWQge1xyXG5cclxuICAgIGlmIChhUnRFdnQuZ2V0VHlwZSgpID09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfSU5URVJOQUwgJiYgYVJ0RXZ0LmdldEludGVybmFsQ29kZSgpID09XHJcbiAgICAgIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9XRUJDTElFTlRfUk9VVEUgJiYgUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLlJlbW92ZWRDb250ZXh0RnJvbVNlcnZlcikge1xyXG4gICAgICB0aGlzLnNldExhc3RTYXZlZFJvdXRlRXZlbnQoYVJ0RXZ0KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBIYW5kbGUgRm9jdXMgRXZlbnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJsaW5lXCI+bGluZSBvZiBtdWx0aWxpbmUgY29udHJvbDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJvbkNsaWNrXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIGhhbmRsZUZvY3VzKGN0cmw6IE1nQ29udHJvbCwgbGluZTogbnVtYmVyLCBvbkNsaWNrOiBib29sZWFuLCBzaG91bGRIYW5kbGVab29tOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0cnkge1xyXG5cclxuICAgICAgaWYgKGN0cmwuaXNTdGF0aWMoKSlcclxuICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAvLyBJZiB3ZSBhdHRlbXB0IHRvIHBhcmsgb24gY29udHJvbCB3aGVyZSB3ZSBkbyBub3Qgd2FudCB0byBhbGxvdyB0byBwYXJrIGxpa2UgaWYgY29udHJvbCBoYXMgZXhwcmVzc2lvbiBvciBwYXJlbnQgdGFzayBmaWVsZCwgZG8gbm90IGFsbG93IHRvIGZvY3VzIG9uIGl0LlxyXG4gICAgICAvLyBTZXQgRm9jdXMgYmFjayB0byBsYXN0Rm9jdXNlZENvbnRyb2wuIFdlIG5lZWQgX2xhc3RGYWlsZWRGb2N1c2VkQ29udHJvbCBhcyB3ZSBnZXQgZm9jdXMgZXZlbnQgb24gYSBjb250cm9sIHR3aWNlLiBTbyB0byBhdm9pZCB0byBzaG93IGVycm9yIG11bHRpcGxlIHRpbWVzLFxyXG4gICAgICAvLyBtYWludGFpbiBfbGFzdEZhaWxlZEZvY3VzZWRDb250cm9sLlxyXG4gICAgICBpZiAoY3RybCAhPT0gdGhpcy5fbGFzdEZhaWxlZEZvY3VzZWRDb250cm9sICYmIGN0cmwuSGFzRXhwT3JQYXJlbnRUYXNrRmllbGQoKSkge1xyXG4gICAgICAgIC8vIFNob3cgZXJyb3Igb25seSBmb3IgY29udHJvbHMgaGF2aW5nIERhdGEgcHJvcGVydHkgYW5kIHBhcmthYmxlXHJcbiAgICAgICAgaWYgKGN0cmwuaXNMaXN0Qm94KCkgfHwgY3RybC5pc0NoZWNrQm94KCkgfHwgY3RybC5pc0NvbWJvQm94KCkgfHwgY3RybC5pc1RleHRDb250cm9sKCkgfHwgY3RybC5pc1JhZGlvKCkgfHwgY3RybC5pc1RhYkNvbnRyb2woKSkge1xyXG4gICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXJyb3JUb0xvZyhOU3RyaW5nLkZvcm1hdCgnQ29udHJvbCBlaXRoZXIgaGFzIGV4cHJlc3Npb24gb3IgaGFzIHBhcmVudCB0YXNrIHZhcmlhYmxlIGF0dGFjaGVkIHRvIGl0LiBGYWlsZWQgdG8gcGFyayBvbiBjb250cm9sIHdpdGggbmFtZTogezB9JywgY3RybC5OYW1lKSk7XHJcbiAgICAgICAgICAvLyBEZWZlY3QgMTUyNzI4OiBVc2UgbGFzdCBmb2N1c2VkIHRhc2sgaW5zdGVhZCBjb250cm9sIHRhc2sgYXMgY29udHJvbCBjYW4gYmUgZnJvbSBzdWJmb3JtLlxyXG4gICAgICAgICAgRm9jdXNNYW5hZ2VyLlNldEZvY3VzKExhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKSwgTGFzdEZvY3VzZWRNYW5hZ2VyLmdldExhc3RGb2N1c2VkQ29udHJvbCgpLCAwLFxyXG4gICAgICAgICAgICBMYXN0Rm9jdXNlZE1hbmFnZXIuZ2V0TGFzdEZvY3VzZWRDb250cm9sKCkgPT09IG51bGwgPyB0cnVlIDogZmFsc2UpO1xyXG4gICAgICAgICAgdGhpcy5fbGFzdEZhaWxlZEZvY3VzZWRDb250cm9sID0gY3RybDtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuX2xhc3RGYWlsZWRGb2N1c2VkQ29udHJvbCA9IG51bGw7XHJcblxyXG4gICAgICBpZiAob25DbGljaylcclxuICAgICAgICBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuQ3VycmVudENsaWNrZWRDdHJsID0gY3RybDtcclxuXHJcbiAgICAgIGxldCBwcmV2Q3RybDogTWdDb250cm9sID0gTGFzdEZvY3VzZWRNYW5hZ2VyLmdldExhc3RGb2N1c2VkQ29udHJvbCgpO1xyXG4gICAgICBpZiAoY3RybCA9PT0gcHJldkN0cmwgJiYgIWN0cmwuaXNSZXBlYXRhYmxlKCkpIHtcclxuICAgICAgICBhd2FpdCAoPE1nRm9ybT5jdHJsLmdldEZvcm0oKSkuYnJpbmdSZWNvcmRUb1BhZ2UoKTtcclxuICAgICAgICAvLyB3ZSByZWNlaXZlZCBmb2N1cyB0d2ljZVxyXG4gICAgICAgIGF3YWl0IHRoaXMuSGFuZGxlWm9vbUlmTmVlZGVkKGN0cmwsIGxpbmUsIHNob3VsZEhhbmRsZVpvb20pO1xyXG4gICAgICAgIGxldCBydEV2bnQ6IFJ1blRpbWVFdmVudCA9IHRoaXMuZ2V0TGFzdFJ0RXZlbnQoKTtcclxuICAgICAgICBpZiAocnRFdm50ICE9IG51bGwgJiYgcnRFdm50LlNob3VsZEhhbmRsZVpvb20pXHJcbiAgICAgICAgICBGb2N1c01hbmFnZXIuU2V0Rm9jdXMoY3RybCwgLTEpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy9jaGVjayBpZiBsYXN0IHRhc2sgaXMgb3BlbmVkIGluIE1vZGFsIFN1YmZvcm0sIGlmIHllcywgY2xvc2UgaXQgYmVmb3JlIGZvY3Vzc2luZyBvbiBwYXJlbnQgdGFzaydzIGN0cmxcclxuICAgICAgbGV0IHByZXZUYXNrOiBUYXNrID0gPFRhc2s+TGFzdEZvY3VzZWRNYW5hZ2VyLkluc3RhbmNlLmdldExhc3RGb2N1c2VkVGFzaygpO1xyXG5cclxuXHJcbiAgICAgIGlmIChjdHJsID09PSBudWxsIHx8IGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfVEFCTEUpIHtcclxuICAgICAgICBpZiAocHJldkN0cmwgPT09IG51bGwpXHJcbiAgICAgICAgICBhd2FpdCB0aGlzLkhhbmRsZU5vblBhcmthYmxlQ29udHJvbHMoY3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBjdXJyVGFzazogVGFzaztcclxuICAgICAgaWYgKChjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0JVVFRPTikgJiYgKDxSYWlzZUF0Pihhd2FpdCAoY3RybC5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1JBSVNFX0FUKSkuZ2V0VmFsdWVJbnQoKSkgPT09IFJhaXNlQXQuVGFza0luRm9jdXMpKVxyXG4gICAgICAgIGN1cnJUYXNrID0gcHJldlRhc2s7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBjdXJyVGFzayA9IDxUYXNrPmN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKTtcclxuXHJcbiAgICAgIGxldCBjYW5Hb3RvQ3RybDogYm9vbGVhbiA9IHRoaXMuY2FuR29Ub0NvbnRyb2woY3RybCwgb25DbGljayk7XHJcblxyXG4gICAgICAvLyBHbyB0byB0aGUgY29udHJvbCAtIGluc2VydCBwcmVmaXhcclxuICAgICAgaWYgKGNhbkdvdG9DdHJsKSB7XHJcbiAgICAgICAgLy8gTW9kYWwgc3ViZm9ybSB0YXNrIGNsb3NpbmcgaGFzIGFscmVhZHkgYmVndW4uIERvIG5vdCBoYW5kbGUgSGFuZGxlU3ViZm9ybU1vZGFsaXR5KCkgYWdhaW4uXHJcbiAgICAgICAgaWYgKHRoaXMuZ3VpUGVuZGluZ0V2ZW50ICE9IG51bGwpXHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgbGV0IGhhbmRsZWQgPSBhd2FpdCB0aGlzLkhhbmRsZVN1YmZvcm1Nb2RhbGl0eShjdHJsLCBwcmV2VGFzaywgY3VyclRhc2spO1xyXG4gICAgICAgIGlmIChoYW5kbGVkKVxyXG4gICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBsZXQgZXZlbnRMaW5lOiBudW1iZXIgPSAoY3RybC5pc1JlcGVhdGFibGUoKSB8fCBjdHJsLmlzUmFkaW8oKSkgPyBsaW5lIDogSW50MzIuTWluVmFsdWU7XHJcbiAgICAgICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KGN0cmwsIGV2ZW50TGluZSk7XHJcbiAgICAgICAgcnRFdnQuc2V0SW50ZXJuYWwoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfUFJFRklYKTtcclxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUV2ZW50KHJ0RXZ0LCBmYWxzZSk7XHJcbiAgICAgIH0gZWxzZSBpZiAocHJldkN0cmwgIT09IG51bGwpIHtcclxuICAgICAgICBpZiAoIXByZXZDdHJsLmlzTW9kaWZpYWJsZSgpKSB7XHJcbiAgICAgICAgICBpZiAocHJldkN0cmwuaXNDaG9pY2VDb250cm9sKCkpXHJcbiAgICAgICAgICAgIGF3YWl0IHByZXZDdHJsLnJlc3RvcmVPbGRWYWx1ZSgpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoIWN1cnJUYXNrLmNhbmNlbFdhc1JhaXNlZCgpKSB7XHJcbiAgICAgICAgICBsZXQgbmV3VmFsOiBzdHJpbmcgPSBNYW5hZ2VyLkdldEN0cmxWYWwocHJldkN0cmwpO1xyXG4gICAgICAgICAgaWYgKCFhd2FpdCBwcmV2Q3RybC52YWxpZGF0ZUFuZFNldFZhbHVlKG5ld1ZhbCwgdHJ1ZSkpXHJcbiAgICAgICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbih0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgTWdDb250cm9sLlJldHVyblRvQ3RybCA9IHByZXZDdHJsO1xyXG4gICAgICB9IGVsc2VcclxuICAgICAgICBhd2FpdCB0aGlzLkhhbmRsZU5vblBhcmthYmxlQ29udHJvbHMoY3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpKTtcclxuXHJcbiAgICAgIGlmICghdGhpcy5fc3RvcEV4ZWN1dGlvbiAmJiBNZ0NvbnRyb2wuUmV0dXJuVG9DdHJsID09PSBjdHJsKXtcclxuICAgICAgICBMYXN0Rm9jdXNlZE1hbmFnZXIuc2V0TGFzdEZvY3VzZWRDb250cm9sKDxUYXNrQmFzZT5jdHJsLmdldEZvcm0oKS5nZXRUYXNrKCksIGN0cmwpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuSGFuZGxlWm9vbUlmTmVlZGVkKGN0cmwsIGxpbmUsIHNob3VsZEhhbmRsZVpvb20pO1xyXG4gICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgIHJldHVybjtcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIGN0cmwuc2V0Rm9jdXNlZFN0b3BFeGVjdXRpb24odGhpcy5fc3RvcEV4ZWN1dGlvbik7XHJcbiAgICAgIGlmICh0aGlzLl9zdG9wRXhlY3V0aW9uKSB7XHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbGV0IHJldHVyblRvQ3RybDogTWdDb250cm9sID0gTWdDb250cm9sLlJldHVyblRvQ3RybDtcclxuXHJcbiAgICAgICAgICBpZiAocmV0dXJuVG9DdHJsICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuY3Vyck1nZElEID0gKDxUYXNrPnJldHVyblRvQ3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpKS5nZXRNZ2RJRCgpO1xyXG4gICAgICAgICAgICBhd2FpdCBGb2N1c01hbmFnZXIuU2V0Rm9jdXMocmV0dXJuVG9DdHJsLCAtMSk7XHJcbiAgICAgICAgICAgIHJldHVyblRvQ3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpLnNldExhc3RQYXJrZWRDdHJsKHJldHVyblRvQ3RybCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyA8c3VtbWFyeT5cclxuICAvLy8gICBIYW5kbGUgc3ViZm9ybSBtb2RhbGl0eSBiZWZvciBmb3Vjc3Npbmcgb24gcGFyZW50IGN0cmxcclxuICAvLy8gMS5pZiBjdXJzb3IgaXMgcGFya2VkIG9uIG1vZGFsIHN1YmZvcm0gdGFzayBhbmQgdXNlciBjbGlja3Mgb24gaXQncyBwYXJlbnQgOiBjbG9zZSB0aGUgc3ViZm9ybSB0YXNrLlxyXG4gIC8vLyAyLmlmIGN1cnNvciBpcyBwYXJrZWQgb24gbW9kYWwgc3ViZm9ybSAnUzInIHdoaWNoIGlzIG9wZW5lZCBpbiBhbm90aGVyIHN1YmZvcm0gbW9kYWwgJ1MxJywgdGhlbiBjbGlja2luZyBvbiAgcGFyZW50J1AxJ1xyXG4gIC8vLyB3aWxsIGNsb3NlIGJvdGggUzIgYW5kIFMxLlxyXG4gIC8vLyAzLmlmIGN1cnNvciBpcyBwYXJrZWQgb24gbm9uIG1vZGFsIHN1YmZvcm0gJ1MyJyB3aGljaCBpcyBvcGVuZWQgaW4gc3ViZm9ybSBtb2RhbCAnUzEnLCB0aGVuIGNsaWNraW5nIG9uIFMxLCB3aWxsIG5vdCBjbG9zZSBTMlxyXG4gIC8vLyBidXQgY2xpY2tpbmcgb24gUDEgd2lsbCBjbG9zZSBib3RoIFMyIGFuZCBTMS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPmN0cmwgdG8gYmUgZm9jdXNzZWQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicHJldlRhc2tcIj5wcmV2aW91cyB0YXNrIHdoaWNoIHdhcyBpbiBmb2N1czwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdXJyVGFza1wiPmN1cnJlbnQgdGFzayB3aGljaCBpcyB0byBiZSBmb2N1c3NlZDwvcGFyYW0+XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgSGFuZGxlU3ViZm9ybU1vZGFsaXR5KGN0cmw6IE1nQ29udHJvbCwgcHJldlRhc2s6IFRhc2ssIGN1cnJUYXNrOiBUYXNrKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgaGFuZGxlZFN1YmZvcm1Nb2RhbGl0eSA9IGZhbHNlO1xyXG5cclxuICAgIC8vIGV2YWx1YXRlIHRoZSBjb3JyZWN0IHByZXZUYXNrIHRvIGJlIGNsb3NlZCBpZiBpdCBpcyBNb2RhbC5cclxuICAgIC8vIGlmIG5ld2x5IHN1YmZvcm0gTW9kYWwgdGFzayBpcyBvcGVuZWQgYW5kIGl0IGlzIG5vdCB5ZXQgZm9jdXNzZWQsIGluIHRoYXQgY2FzZSBjdXJyIHRhc2sgaXMgc2FtZSBhcyBwcmV2dGFzay5cclxuICAgIC8vIG5vdyBjbGlja2luZyBvbiBpdCdzIHBhcmVudCB0YXNrLCBzaG91bGQgY2xvc2UgdGhlIE1vZGFsIHN1YmZvcm0gdGFza1xyXG4gICAgbGV0IGxlbmd0aCA9IHByZXZUYXNrLmdldE1HRGF0YSgpLmdldFRhc2tzQ291bnQoKTtcclxuICAgIGxldCB0b3BUYXNrOiBUYXNrID0gcHJldlRhc2suZ2V0TUdEYXRhKCkuZ2V0VGFzayhsZW5ndGggLSAxKTtcclxuICAgIGlmIChjdXJyVGFzayA9PSBwcmV2VGFzayB8fCBwcmV2VGFzayAhPSB0b3BUYXNrIC8qIG5lc3RlZCBzdWJmb3JtICovKSB7XHJcbiAgICAgIGlmICh0b3BUYXNrICE9IG51bGwgJiYgcHJldlRhc2sgIT0gdG9wVGFzayAmJiB0b3BUYXNrLklzU3ViRm9ybSkge1xyXG4gICAgICAgIGxldCBzdWJmb3JtQ3RybDogTWdDb250cm9sID0gPE1nQ29udHJvbD50b3BUYXNrLmdldEZvcm0oKS5nZXRTdWJGb3JtQ3RybCgpO1xyXG4gICAgICAgIGlmIChzdWJmb3JtQ3RybC5Jc01vZGFsKCkpXHJcbiAgICAgICAgICBwcmV2VGFzayA9IHRvcFRhc2s7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBjbG9zZSBzdWJmb3JtIHRhc2sgaXMgTW9kYWwgaWYgdG8gYmUgcGFya2VkIG9uIHBhcmVudC5cclxuICAgIGlmIChwcmV2VGFzayAhPSA8VGFzaz5jdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkgJiYgcHJldlRhc2suZ2V0SXNEZXN0aW5hdGlvbkNhbGwoKSkge1xyXG5cclxuICAgICAgaWYgKCFjdXJyVGFzay5pc0Rlc2NlbmRlbnRPZihwcmV2VGFzaykpIHtcclxuICAgICAgICBsZXQgc3ViZm9ybUN0cmw6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+cHJldlRhc2suZ2V0Rm9ybSgpLmdldFN1YkZvcm1DdHJsKCk7XHJcbiAgICAgICAgaWYgKCFzdWJmb3JtQ3RybC5Jc01vZGFsKCkgJiYgIWN1cnJUYXNrLmdldElzRGVzdGluYXRpb25DYWxsKCkpXHJcbiAgICAgICAgICBzdWJmb3JtQ3RybCA9IHByZXZUYXNrLkdldFN1YmZvcm1Nb2RhbFBhcmVudFRhc2soKTtcclxuICAgICAgICBpZiAoc3ViZm9ybUN0cmwgIT0gbnVsbCAmJiAoY3RybCAhPSBzdWJmb3JtQ3RybCkgJiYgc3ViZm9ybUN0cmwuSXNNb2RhbCgpKSB7XHJcblxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5wZXJmb3JtU3ViZm9ybUNsb3NlKDxNZ0NvbnRyb2w+c3ViZm9ybUN0cmwpO1xyXG4gICAgICAgICAgaWYgKCF0aGlzLl9zdG9wRXhlY3V0aW9uKVxyXG4gICAgICAgICAgICB0aGlzLmd1aVBlbmRpbmdFdmVudCA9IHRoaXMuZ2V0TGFzdFJ0RXZlbnQoKTtcclxuICAgICAgICAgIGhhbmRsZWRTdWJmb3JtTW9kYWxpdHkgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBoYW5kbGVkU3ViZm9ybU1vZGFsaXR5O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgQ2FsbHMgQ29udHJvbHMgU3VmZml4IHdoZW4gZm9jdXMgb24gTm9uIG1hZ2ljIGNvbnRyb2wgaS5lLiBjb250cm9sIHdpdGggTWFnaWNEdW1teUNvbnRyb2wgaXMgcmVjZWl2ZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPmNvbnRyb2w8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVGb2N1c09uTm9uTWFnaWNDb250cm9sKGN0cmw6IE1nQ29udHJvbCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgYXdhaXQgRXZlbnRzTWFuYWdlci5JbnN0YW5jZS5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aE1nQ29udHJvbEJhc2UoY3RybCwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfU1VGRklYKTtcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIGN0cmwuc2V0Rm9jdXNlZFN0b3BFeGVjdXRpb24odGhpcy5fc3RvcEV4ZWN1dGlvbik7XHJcbiAgICAgIGlmICh0aGlzLl9zdG9wRXhlY3V0aW9uKSB7XHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbGV0IHJldHVyblRvQ3RybDogTWdDb250cm9sID0gTWdDb250cm9sLlJldHVyblRvQ3RybDtcclxuXHJcbiAgICAgICAgICBpZiAocmV0dXJuVG9DdHJsICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuY3Vyck1nZElEID0gKDxUYXNrPnJldHVyblRvQ3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpKS5nZXRNZ2RJRCgpO1xyXG4gICAgICAgICAgICBhd2FpdCBGb2N1c01hbmFnZXIuU2V0Rm9jdXMocmV0dXJuVG9DdHJsLCAtMSk7XHJcbiAgICAgICAgICAgIHJldHVyblRvQ3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpLnNldExhc3RQYXJrZWRDdHJsKHJldHVyblRvQ3RybCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHJhaXNlIHRoZSB6b29tIGV2ZW50IGZvciB0aGUgY29udHJvbCwgaWYgcmVxdWlyZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN0cmxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxpbmVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInNob3VsZEhhbmRsZVpvb21cIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgSGFuZGxlWm9vbUlmTmVlZGVkKGN0cmw6IE1nQ29udHJvbCwgbGluZTogbnVtYmVyLCBzaG91bGRIYW5kbGVab29tOiBib29sZWFuKTogUHJvbWlzZSA8dm9pZD57XHJcbiAgICAgIGlmIChzaG91bGRIYW5kbGVab29tKVxyXG4gICAgICB7XHJcbiAgICAgICAgdmFyIHJ0RXZ0ID0gbmV3IFJ1blRpbWVFdmVudChjdHJsLCBsaW5lLCB0cnVlKTtcclxuICAgICAgICBydEV2dC5zZXRJbnRlcm5hbChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfWk9PTSk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVFdmVudChydEV2dCwgZmFsc2UpO1xyXG4gICAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIHdlIGNhbiBnbyB0byB0aGUgY29udHJvbCBhbmQgdHJ5IHRvIHBhcmsgb24gaW5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPmNvbnRyb2w8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibGluZVwiPmxpbmU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwib25DbGlja1wiPnJlYWwgY2xpY2sgaXMgcGVyZm9ybWVkLCB0aGlzIG5vdCBjbGljayBzaW11bGF0aW9uPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgY2FuR29Ub0NvbnRyb2woY3RybDogTWdDb250cm9sLCBvbkNsaWNrOiBib29sZWFuKTogYm9vbGVhbiB7XHJcblxyXG4gICAgaWYgKG9uQ2xpY2sgJiYgKGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfU1VCRk9STSB8fCBjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0JST1dTRVIpKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgLy8gVjkuNFNQNGQgY2hhbmdlIG9mIGJlaGF2aW9yIC0gd2UgZG8gbm90IFwiZXhpdFwiIGZyb20gdGhlIGN1cnJlbnQgY3RybFxyXG4gICAgLy8gKGkuZS4gbm90IHBlcmZvcm1pbmcgY3RybCBzdWZmaXggb3IgY3RybCB2ZXJpZmljYXRpb25zKSBpZiB0aGUgdGFyZ2V0IGN0cmxcclxuICAgIC8vIGlzIElNRyBvciBoeXBlcnRleHQuXHJcbiAgICBsZXQgY2FuR290b0N0cmw6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgbGV0IGN1cnJUYXNrOiBUYXNrID0gPFRhc2s+Y3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpO1xyXG4gICAgLy8gaWYgY2FuY2VsIGlzIHJhaXNlZCAsIHRoZW4gZG8gbm90IGdvIHRvIG5leHQgY29udHJvbCBiZWZvcmUgaGFuZGxpbmcgY2FuY2VsIGV2ZW50LlxyXG4gICAgbGV0IGxhc3RUYXNrOiBUYXNrID0gTGFzdEZvY3VzZWRNYW5hZ2VyLkluc3RhbmNlLmdldExhc3RGb2N1c2VkVGFzaygpO1xyXG4gICAgaWYgKCFjdXJyVGFzay5Jc0ludGVyYWN0aXZlIHx8IChsYXN0VGFzayAhPSBudWxsICYmIGxhc3RUYXNrLmdldExhc3RQYXJrZWRDdHJsKCkgIT0gbnVsbCAmJlxyXG4gICAgICBsYXN0VGFzay5jYW5jZWxXYXNSYWlzZWQoKSkpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBpZiAoY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9JTUFHRSAmJiAhY3RybC5Jc1JlcGVhdGFibGUpXHJcbiAgICAgIGNhbkdvdG9DdHJsID0gZmFsc2U7XHJcblxyXG4gICAgcmV0dXJuIGNhbkdvdG9DdHJsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEhhbmRsZSBUaW1lciBFdmVudHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZXZ0XCI+dHVudGltZSB0aW1lciBldmVudDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVUaW1lcihldnQ6IFJ1blRpbWVFdmVudCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgZXZ0LnNldFR5cGUoQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9USU1FUik7XHJcbiAgICBpZiAoZXZ0LmlzSWRsZVRpbWVyKCkpIHtcclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVFeHByZXNzaW9uSGFuZGxlcnMoKTtcclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVDb250ZXh0SW5hY3Rpdml0eUFsZXJ0KGV2dCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgbWdkOiBNR0RhdGEgPSBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLmdldE1HRGF0YShldnQuZ2V0TWdkSUQoKSk7XHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRXZlbnRzKG1nZC5nZXRUaW1lckhhbmRsZXJzKCksIGV2dCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFdoZW4gdGhlIGNvbnRleHQgaW5hY3Rpdml0eSB0aW1lb3V0IGlzIGFib3V0IHRvIGV4cGlyZSwgcmFpc2UgYSB3YXJuaW5nIHRvIHVzZXJcclxuICAvLyAgICBzbyB0aGF0IHRoZSBzZXNzaW9uIGNhbiBiZSBjb250aW51ZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZXZ0XCI+dHVudGltZSB0aW1lciBldmVudDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVDb250ZXh0SW5hY3Rpdml0eUFsZXJ0KGV2dDogUnVuVGltZUV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgdGltZU5vdzogbnVtYmVyID0gTWlzYy5nZXRTeXN0ZW1NaWxsaXNlY29uZHMoKTtcclxuICAgIGxldCBtZ2Q6IE1HRGF0YSA9IGV2dC5nZXRUYXNrKCkuZ2V0TUdEYXRhKCk7XHJcbiAgICBsZXQgbGFzdFJlcXVlc3RUaW1lOiBudW1iZXIgPSBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5HZXRJbnN0YW5jZSgpLkdldExhc3RSZXF1ZXN0VGltZTtcclxuICAgIGxldCBjb250ZXh0SW5hY3Rpdml0eVRpbWVvdXQ6IG51bWJlciA9IEVudmlyb25tZW50Lkluc3RhbmNlLmdldENvbnRleHRJbmFjdGl2aXR5VGltZW91dCgpIC8gMTA7XHJcbiAgICBsZXQgY29udGV4dEluYWN0aXZpdHlXYXJuaW5nVGltZTogbnVtYmVyID0gRW52aXJvbm1lbnQuSW5zdGFuY2UuZ2V0Q29udGV4dEluYWN0aXZpdHlXYXJuaW5nVGltZSgpIC8gMTA7XHJcblxyXG4gICAgbGV0IGlkbGVUaW1lID0gKHRpbWVOb3cgLSBsYXN0UmVxdWVzdFRpbWUpIC8gMTAwMDtcclxuXHJcbiAgICAvLyBEaXNwbGF5IHRoZSBjb25maXJtYXRpb24gb25seSBmb3IgdmFsaWQgdGltZW91dHNcclxuICAgIGlmIChjb250ZXh0SW5hY3Rpdml0eVRpbWVvdXQgPT0gMCB8fCBjb250ZXh0SW5hY3Rpdml0eVdhcm5pbmdUaW1lID09IDApXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBpZiAoRXZlbnRzTWFuYWdlci51c2VyR3JhbnRlZEZvckNvbnRleHRBY3Rpdml0eSAmJiBpZGxlVGltZSA+PSAoY29udGV4dEluYWN0aXZpdHlUaW1lb3V0IC0gY29udGV4dEluYWN0aXZpdHlXYXJuaW5nVGltZSkpIHtcclxuICAgICAgLy8gcmFpc2UgYW4gYWxlcnQgdG8gbm90aWZ5IHVzZXIgd2hlbiB0aGUgY29udGV4dCBpcyBhYm91dCB0byBiZSB0ZXJtaW5hdGVkXHJcbiAgICAgIC8vIGlmIHVzZXIgY2xpY2tzIG9uIE9LLCBzZW5kIGR1bW15IHJlcXVlc3QgdG8gc2VydmVyLiBJZiBDYW5jZWwgaXMgY2xpY2tlZCwgZG8gbm90aGluZy5cclxuICAgICAgbGV0IHVzZXJDb25maXJtYXRpb246IG51bWJlciA9IGF3YWl0IEdVSU1hbmFnZXIuSW5zdGFuY2UuTWVzc2FnZUJveCh0aGlzLmNvbmZpcm1hdGlvbkRpYWxvZ1RpdGxlLCB0aGlzLmNvbmZpcm1hdGlvbkRpYWxvZ01zZywgU3R5bGVzLk1TR0JPWF9CVVRUT05fWUVTX05PKTtcclxuICAgICAgaWYgKHVzZXJDb25maXJtYXRpb24gPT0gU3R5bGVzLk1TR0JPWF9SRVNVTFRfWUVTKSB7XHJcbiAgICAgICAgLy8gc2VuZCByZXF1ZXN0IHRvIHNlcnZlciB0byBtYXJrIHRoZSBjb250ZXh0IGluYWN0aXZpdHkgdGltZW91dCB0byB6ZXJvXHJcbiAgICAgICAgbGV0IGNtZDogSUNsaWVudENvbW1hbmQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVDb250ZXh0VGltZW91dFJlc2V0RXZlbnRDb21tYW5kKCk7XHJcbiAgICAgICAgbWdkLkNtZHNUb1NlcnZlci5BZGQoY21kKTtcclxuICAgICAgICBhd2FpdCBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5HZXRJbnN0YW5jZSgpLkV4ZWN1dGUoQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1NlbmRpbmdJbnN0cnVjdGlvbi5PTkxZX0NPTU1BTkRTKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBFdmVudHNNYW5hZ2VyLnVzZXJHcmFudGVkRm9yQ29udGV4dEFjdGl2aXR5ID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwcm9jZXNzIGV4cHJlc3Npb24gaGFuZGxlcnNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIGhhbmRsZUV4cHJlc3Npb25IYW5kbGVycygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudChMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCksIExhc3RGb2N1c2VkTWFuYWdlci5nZXRMYXN0Rm9jdXNlZENvbnRyb2woKSk7XHJcbiAgICBydEV2dC5zZXRFeHByZXNzaW9uKG51bGwpO1xyXG4gICAgcnRFdnQuc2V0TWFpblByZ0NyZWF0b3IocnRFdnQuZ2V0VGFzaygpKTtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLmdldFNpemUoKTsgaSsrKSB7XHJcbiAgICAgIGxldCBtZ2Q6IE1HRGF0YSA9IE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuZ2V0TUdEYXRhKGkpO1xyXG4gICAgICBpZiAobWdkICE9PSBudWxsICYmICFtZ2QuSXNBYm9ydGluZylcclxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUV2ZW50cyhtZ2QuZ2V0RXhwSGFuZGxlcnMoKSwgcnRFdnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlc2l6ZSBvZiBwYWdlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj50YWJsZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyb3dzSW5QYWdlXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIGhhbmRsZVJlc2l6ZShjdHJsOiBNZ0NvbnRyb2wsIHJvd3NJblBhZ2U6IG51bWJlcik6IHZvaWQge1xyXG4gICAgKDxNZ0Zvcm0+Y3RybC5nZXRGb3JtKCkpLnNldFJvd3NJblBhZ2Uocm93c0luUGFnZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IGRhdGEgZm9yIFJvd1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsXCI+XHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzZW5kQWxsXCI+aWYgdHJ1ZSwgc2VuZCBhbGwgcmVjb3Jkc1xyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicm93XCI+XHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVSb3dEYXRhQ3VyUGFnZSh0YWJsZTogTWdDb250cm9sLCBkZXNpcmVkVG9wSW5kZXg6IG51bWJlciwgc2VuZEFsbDogYm9vbGVhbiwgbGFzdEZvY3VzZWRWYWw6IExhc3RGb2N1c2VkVmFsKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgZm9ybTogTWdGb3JtID0gPE1nRm9ybT50YWJsZS5nZXRGb3JtKCk7XHJcbiAgICBhd2FpdCBmb3JtLnNldFJvd0RhdGEoZGVzaXJlZFRvcEluZGV4LCBzZW5kQWxsKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB0cmFuc2ZlcnMgZGF0YSB0byBHVUkgdGhyZWFkIGluIGZyZWUgd29ya2VyIHRocmVhZCB0aW1lXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlVHJhbnNmZXJEYXRhVG9HdWkoY3RybDogTWdDb250cm9sKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgZm9ybTogTWdGb3JtID0gPE1nRm9ybT5jdHJsLmdldEZvcm0oKTtcclxuICAgIGF3YWl0IGZvcm0udHJhbnNmZXJEYXRhVG9HdWkoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBGZXRjaGVzIHRoZSBjaHVuayBmcm9tIHNlcnZlcixcclxuICAvLy8gICBJZiB0aGUgbGFzdCByZWNvcmRzIGlzIG5vdCB5ZXQgZmV0Y2hlZCBpdCBmZXRjaGVzIHRoZSBuZXh0IGNodW5rLFxyXG4gIC8vLyAgIEVsc2UsIGZldGNoZXMgdGhlIHByZXZpb3VzIGNodW5rXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGFzeW5jIGZldGNoUmVjb3Jkc0FoZWFkRnJvbVNlcnZlcihjdHJsOiBNZ0NvbnRyb2wpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBmb3JtOiBNZ0Zvcm0gPSA8TWdGb3JtPmN0cmwuZ2V0Rm9ybSgpO1xyXG4gICAgYXdhaXQgZm9ybS5GZXRjaFJlY29yZHNBaGVhZEZyb21TZXJ2ZXIoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBXaGVuIGludGVybmFsIGFjdCBhc2tzIGZvciBlbmFibGUvZGlzYWJsZSBvZiBhbiBhY3QgbGlzdC5cclxuICAvLy8gICBjYWxsIGVuYWJsZUxpc3Qgd2l0aCBvbmx5SWZDaGFuZ2VkID0gdHJ1ZSB0byBtaW5pbWl6ZSBjYWxscyB0b3MgcmVmcmVzaC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZW5hYmxlXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIGhhbmRsZUVuYWJsZUV2ZW50cyhldnQ6IFJ1blRpbWVFdmVudCwgZW5hYmxlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBldnQuZ2V0VGFzaygpLkFjdGlvbk1hbmFnZXIuZW5hYmxlTGlzdChldnQuZ2V0QWN0RW5hYmxlTGlzdCgpLCBlbmFibGUsIHRydWUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEhhbmRsZXMgY29udHJvbCBQcmVmaXhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZXZ0XCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlQ3RybFByZWZpeChldnQ6IFJ1blRpbWVFdmVudCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IHRhc2s6IFRhc2sgPSA8VGFzaz5ldnQuZ2V0VGFzaygpO1xyXG4gICAgbGV0IGN1cnJDbGlja2VkQ3RybDogTWdDb250cm9sID0gPE1nQ29udHJvbD5SdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuQ3VycmVudENsaWNrZWRDdHJsO1xyXG4gICAgbGV0IGZvcm06IE1nRm9ybSA9IDxNZ0Zvcm0+dGFzay5nZXRGb3JtKCk7XHJcbiAgICBsZXQgZGlzcGxheUxpbmU6IG51bWJlciA9IGV2dC5nZXREaXNwbGF5TGluZSgpO1xyXG4gICAgbGV0IGN0cmw6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+ZXZ0LkNvbnRyb2w7XHJcblxyXG4gICAgaWYgKGZvcm0uaXNMaW5lTW9kZSgpKSB7XHJcbiAgICAgIGlmIChkaXNwbGF5TGluZSA9PT0gSW50MzIuTWluVmFsdWUgfHwgY3RybC5pc1JhZGlvKCkpXHJcbiAgICAgICAgZGlzcGxheUxpbmUgPSBmb3JtLkRpc3BsYXlMaW5lO1xyXG4gICAgfSBlbHNlXHJcbiAgICAgIGRpc3BsYXlMaW5lID0gSW50MzIuTWluVmFsdWU7XHJcblxyXG4gICAgbGV0IGxhc3RQYXJrZWRDdHJsOiBNZ0NvbnRyb2wgPSBMYXN0Rm9jdXNlZE1hbmFnZXIuZ2V0TGFzdEZvY3VzZWRDb250cm9sKCk7XHJcblxyXG4gICAgLy8gcHJldmVudCBkb3VibGUgcHJlZml4IG9uIHRoZSBzYW1lIGNvbnRyb2xcclxuICAgIC8vIEZvciBGYXN0IE1vZGUsIENTIGlzIGV4ZWN1dGVkIGZyb20gaGVyZSwgd2hlcmVhcyBmb3Igc3RlcCBtb2RlIGl0IGlzIGRvbmVcclxuICAgIC8vIGluIG1vdmVJblJvdy4gc28sIGZvciBzdGVwIG1vZGUgZG91YmxlIGV4ZWN1dGlvbiBvZiBDUyBtdXN0IGJlIHN0b3BwZWQuXHJcbiAgICBpZiAobGFzdFBhcmtlZEN0cmwgIT09IG51bGwgJiYgKDxUYXNrPmxhc3RQYXJrZWRDdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkpLmdldE1HRGF0YSgpLkdldElkKCkgPT09ICg8VGFzaz5jdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkpLmdldE1HRGF0YSgpLkdldElkKCkgJiYgbGFzdFBhcmtlZEN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9DT05UUk9MKSB7XHJcbiAgICAgIGlmICgoY3RybCAhPT0gbGFzdFBhcmtlZEN0cmwgfHwgKGN0cmwuaXNSZXBlYXRhYmxlKCkgJiYgZGlzcGxheUxpbmUgIT09IGN0cmwuZ2V0RGlzcGxheUxpbmUodHJ1ZSkpKSAmJiAhbGFzdFBhcmtlZEN0cmwuaXNJbkNvbnRyb2xTdWZmaXgoKSlcclxuICAgICAgLy8gUUNSICM5NzA4MDZcclxuICAgICAge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhNZ0NvbnRyb2xCYXNlKGxhc3RQYXJrZWRDdHJsLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9TVUZGSVgpO1xyXG4gICAgICAgIGlmICh0aGlzLl9zdG9wRXhlY3V0aW9uKSB7XHJcbiAgICAgICAgICBpZiAoY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9MSVNUIHx8IGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfUkFESU8gfHwgY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9DSEVDS0JPWCB8fCBjdHJsLmlzVGFiQ29udHJvbCgpKSB7XHJcbiAgICAgICAgICAgIGN0cmwucmVzZXRQcmV2VmFsKCk7XHJcbiAgICAgICAgICAgIGF3YWl0IGN0cmwuUmVmcmVzaERpc3BsYXkoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vIFRPRE86IEZvY3VzICYgVGFiYmluZzogSGFuZGxlIFBhcmtpbmcgaW4gdGhpcyBjYXNlLiBTaG91bGQgbm90IHJldHVybiBmYWxzZSBpbiBzY3JlZW4gbW9kZVxyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgaWYgKHRhc2suSW5DdHJsUHJlZml4KVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgdGFzay5JbkN0cmxQcmVmaXggPSB0cnVlO1xyXG5cclxuICAgIC8vIG1ha2Ugc3VyZSBpdCBoYXMgbm90IGNvbWUgYWdhaW4gdGhyb3VnaCBtb3ZlaW5yb3cuXHJcbiAgICAvLyBlZzogaWYgY2xpY2tlZCBjdHJsIG9uIHN1YmZvcm0gaXMgbm9uIHBhcmthYmxlLCBmaXJzdCB0aW1lIGl0IGV4ZWN1dGVzIFJQIENWIGZvciBzdWJmb3JtcyBhbmQgdGhlblxyXG4gICAgLy8gZW50ZXJzIG1vdmVpbnJvdyBmb3IgcGFya2FibGUgY3RybC4gd2Ugc2hvdWxkbm90IGV4ZWN1dGUgdGhpcyBibG9jayB3aGVuIHdlIGNvbWUgZm9yIENQIG9mIHBhcmthYmxlIGN0cmwuXHJcbiAgICAvLyBGb3IgdGFiLCB3ZSBjb21lIGhlcmUgZGlyZWN0bHkgZm9yIHBhcmthYmxlIGN0cmwsIGFuZCB0aGlzIGJsb2NrIG11c3QgYWx3YXlzIGV4ZWN1dGUgaWYgb24gZGlmZiBmb3Jtcy5cclxuICAgIC8vIGlzU29ydCA6IGlmIGNsaWNrZWQgb24gdGFibGUgaGVhZGVyLCB3ZSBwYXJrIG9uIGNvbG9tbiBjdHJsIGFmdGVyIHNvcnQsIGFuZCB3ZSBtdXN0IGluY2x1ZGUgc3ViZm9ybXNcclxuICAgIC8vIGluIGV4ZWN1dGluZyBDVnNcclxuXHJcbiAgICAvLyBUT0RPOiBUYWJiaW5nICYgRm9jdXNpbmc6IENoZWNrIGdldExhc3RNb3ZlSW5Sb3dEaXJlY3Rpb24gaXMgcmVsZXZhbnQuIFdoaWxlIG1vdmluZyBiZXR3ZWVuIGNvbnRyb2xzIGJ5IFRhYiBjb2RlIGluIGlmIGJsb2NrIHdhcyBub3QgY2FsbGVkLlxyXG4gICAgLy8gQnV0IGl0IHdhcyBjYWxsZWQgb24gY2xpY2sgdG8gYW5vdGhlciBjb250cm9sLlxyXG4gICAgLy9pZiAodGFzay5nZXRMYXN0TW92ZUluUm93RGlyZWN0aW9uKCkgPT09IENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9OT05FIHx8IHRoaXMuX2lzU29ydGluZykge1xyXG5cclxuICAgIC8vIElmIHRoZSBjdXJyZW50IGN0cmwgaXMgb24gYSBzdWJmb3JtLCB0aGVuIGV4ZWN1dGUgaW4gc2VxdWVuY2VcclxuICAgIC8vIDEuIFJTIG9mIG5lc3RlZCBzdWJmb3JtcyB1bnRpbCBzdWJmb3JtIHRhc2sgY29udGFpbmcgdGhlc2UgMiBzdWJmb3Jtcy4gd2UgbXVzdCBhbHNvIGV4ZWN1dGUgUlMgaWYgY2xpY2tlZFxyXG4gICAgLy8gICAgaW4gc3ViZm9ybSBhbmQgcGFya2VkIGJhY2sgb24gYSBjdHJsJ3MgdGFzay4gKCM3MjIxMTUtIGN1cnJDbGlja2VkQ3RybCBhbmQgY3RybCBzaG91bGQgbm90IGJlIG9uIGRpZmZlcmVudCB3aW5kb3cpXHJcbiAgICAvLyAyLiBDViBleGVjdXRpb24gb2YgTGFzdFBhcmtlZEN0cmwgdGlsbCBlbmRcclxuICAgIC8vIDMuIFJQLUNWcyBmb3IgYWxsIGludGVybWVkaWF0ZSBzdWJmb3Jtc1xyXG4gICAgbGV0IHByZXZDdHJsOiBNZ0NvbnRyb2wgPSBsYXN0UGFya2VkQ3RybDtcclxuICAgIGlmIChjdXJyQ2xpY2tlZEN0cmwgIT09IG51bGwgJiYgKDxUYXNrPmN1cnJDbGlja2VkQ3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpKS5nZXRNZ2RJRCgpID09PSAoPFRhc2s+Y3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpKS5nZXRNZ2RJRCgpICYmIGN0cmwub25EaWZmRm9ybShjdXJyQ2xpY2tlZEN0cmwpKVxyXG4gICAgICBwcmV2Q3RybCA9IGN1cnJDbGlja2VkQ3RybDtcclxuXHJcbiAgICBpZiAocHJldkN0cmwgIT09IG51bGwgJiYgY3RybC5vbkRpZmZGb3JtKHByZXZDdHJsKSkge1xyXG4gICAgICAvLyBSUyBvZiBuZXN0ZWQgc3ViZm9ybXMgdW50aWwgc3ViZm9ybSB0YXNrIGNvbnRhbmluZyB0aGVzZSAyIHN1YmZvcm1zXHJcbiAgICAgIGxldCBwcmV2VGFzazogVGFzayA9IDxUYXNrPnByZXZDdHJsLmdldEZvcm0oKS5nZXRUYXNrKCk7XHJcbiAgICAgIGF3YWl0IHByZXZUYXNrLmV4ZWNTdWJmb3JtUmVjU3VmZml4KDxUYXNrPmN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKSk7XHJcbiAgICAgIGlmICh0aGlzLl9zdG9wRXhlY3V0aW9uKSB7XHJcbiAgICAgICAgaWYgKGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfTElTVCB8fCBjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1JBRElPIHx8IGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQ0hFQ0tCT1ggfHwgY3RybC5pc1RhYkNvbnRyb2woKSkge1xyXG4gICAgICAgICAgY3RybC5yZXNldFByZXZWYWwoKTtcclxuICAgICAgICAgIGF3YWl0IGN0cmwuUmVmcmVzaERpc3BsYXkoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGFzay5JbkN0cmxQcmVmaXggPSBmYWxzZTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChjdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkuaXNBYm9ydGluZygpKSB7XHJcbiAgICAgICAgdGFzay5JbkN0cmxQcmVmaXggPSBmYWxzZTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGF3YWl0IEV2ZW50c01hbmFnZXIuZG9TeW5jRm9yU3ViZm9ybVBhcmVudCh0YXNrKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBFeGVjdXRlIFJQIG9mIHRoZSBjdXJyZW50IHRhc2sgYmVmb3JlIGV4ZWN1dGluZyB0aGUgQ1ZzIGJlZm9yZSAnY3RybCdcclxuICAgIGlmICh0YXNrLkRhdGFWaWV3LmlzRW1wdHlEYXRhdmlldygpKVxyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGFzay5TdWJmb3JtRXhlY01vZGUgPSBUYXNrX1N1YmZvcm1FeGVjTW9kZUVudW0uU0VUX0ZPQ1VTO1xyXG4gICAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQoY3RybCwgZGlzcGxheUxpbmUpO1xyXG4gICAgICBydEV2dC5zZXRJbnRlcm5hbChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRXZlbnQocnRFdnQsIGZhbHNlKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpIHtcclxuICAgICAgdGFzay5JbkN0cmxQcmVmaXggPSBmYWxzZTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgLy99XHJcblxyXG4gICAgLy8gUUNSIyA4MDYwMTU6IElmIHdlIGhhdmUgYSBzaW5nbGUgZmllbGQgd2l0aCBhbGxvdyBwYXJraW5nID0gWWVzIGFuZCBUYWIgSW50byA9IE5vLCB0aGVuIG9uIHByZXNzaW5nIHRhYiBpZiBjdXJzb3IgaXMgbm90IG1vdmVkLCB3ZSBjb21lIHRvXHJcbiAgICAvLyBwYXJrIG9uIGxhc3RQYXJrZWRDdHJsKHdoaWNoIGlzIHNhbWUgYXMgY3RybCkgc2luY2UgVGFiSW50byBpcyBub3QgYWxsb3dlZC5cclxuICAgIC8vIFNvIHRvIGF2YW9pZCBpbmZpbml0ZSByZWN1cnNpb24sIHdlIHNob3VsZCBub3QgYWdhaW4gdHJ5IHRvIHBhcmsgb24gaXQuXHJcbiAgICBpZiAoIWF3YWl0IGN0cmwuSXNQYXJrYWJsZSgpICYmIGN0cmwgIT09IGxhc3RQYXJrZWRDdHJsKSB7XHJcbiAgICAgIHRhc2suSW5DdHJsUHJlZml4ID0gZmFsc2U7XHJcblxyXG4gICAgICBpZiAobGFzdFBhcmtlZEN0cmwgPT09IG51bGwgfHwgIWF3YWl0IGxhc3RQYXJrZWRDdHJsLmludm9rZSgpKVxyXG4gICAgICAgIGF3YWl0IHRoaXMuSGFuZGxlTm9uUGFya2FibGVDb250cm9scyhjdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkpO1xyXG5cclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZVN1cHBvcnRUb0xvZyhOU3RyaW5nLkZvcm1hdCgnezB9IEVudGVyaW5nIGNvbnRyb2w6IGNvbnRyb2wgezF9LCByb3cgezJ9JywgdGFzay5HZXRUYXNrRGV0YWlscygpLCBjdHJsLk5hbWUsIGRpc3BsYXlMaW5lIDwgMCA/IDAgOiBkaXNwbGF5TGluZSksIHRydWUpO1xyXG5cclxuICAgIC8vIGlmIHdlIGhhdmUgYSBzdG9wIGV4ZWN1dGlvbiBjdHJsLCB3ZSBuZWVkIHRvIHVzZSBpdCBhcyBhIHNyY3RybCwgb3RoZXJ3aXNlIHVzZVxyXG4gICAgLy8gdGhlIGN0cmwgb24gd2hpY2ggd2UgZXhlY3V0ZWQgbGFzdCBDUy5cclxuXHJcblxyXG4gICAgdGFzay5zZXRMZXZlbChDb25zdGFudHMuVEFTS19MRVZFTF9DT05UUk9MKTtcclxuICAgIGN0cmwuS2V5U3Ryb2tlT24gPSBmYWxzZTtcclxuICAgIGN0cmwuTW9kaWZpZWRCeVVzZXIgPSBmYWxzZTtcclxuXHJcbiAgICB0YXNrLnNldEN1cnJGaWVsZChjdHJsLmdldEZpZWxkKCkpO1xyXG5cclxuICAgIGlmIChjdHJsLklzUmVwZWF0YWJsZSlcclxuICAgICAgYXdhaXQgZm9ybS5icmluZ1JlY29yZFRvUGFnZSgpO1xyXG5cclxuICAgIC8vIGVuYWJsZS1kaXNhYmxlIGFjdGlvbnMgZm9yIFN1YmZvcm1zXHJcbiAgICBpZiAobGFzdFBhcmtlZEN0cmwgIT09IGN0cmwpIHtcclxuICAgICAgaWYgKChsYXN0UGFya2VkQ3RybCA9PT0gbnVsbCAmJiBjdHJsLmdldEZvcm0oKS5pc1N1YkZvcm0oKSkgfHwgKGxhc3RQYXJrZWRDdHJsICE9PSBudWxsICYmIChjdHJsLmdldEZvcm0oKS5pc1N1YkZvcm0oKSB8fCBsYXN0UGFya2VkQ3RybC5nZXRGb3JtKCkuaXNTdWJGb3JtKCkpKSkge1xyXG4gICAgICAgIGxldCBsYXN0UGFya2VkVGFzazogVGFzayA9IG51bGw7XHJcbiAgICAgICAgaWYgKGxhc3RQYXJrZWRDdHJsICE9PSBudWxsKVxyXG4gICAgICAgICAgbGFzdFBhcmtlZFRhc2sgPSA8VGFzaz5sYXN0UGFya2VkQ3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpO1xyXG5cclxuICAgICAgICBpZiAobGFzdFBhcmtlZFRhc2sgIT09IHRhc2spIHtcclxuICAgICAgICAgIGxldCBmaXJzdFRpbWU6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgICAgICAgbGV0IGlzU29uU3ViZm9ybTogYm9vbGVhbjtcclxuICAgICAgICAgIGxldCBwYXJlbnRUYXNrOiBUYXNrO1xyXG5cclxuICAgICAgICAgIGlmIChsYXN0UGFya2VkVGFzayAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpc1NvblN1YmZvcm0gPSBsYXN0UGFya2VkVGFzay5Jc1N1YkZvcm07XHJcblxyXG4gICAgICAgICAgICBmb3IgKHBhcmVudFRhc2sgPSBsYXN0UGFya2VkVGFzazsgcGFyZW50VGFzayAhPT0gbnVsbCAmJiBpc1NvblN1YmZvcm07IHBhcmVudFRhc2sgPSA8VGFzaz5wYXJlbnRUYXNrLmdldFBhcmVudCgpKSB7XHJcbiAgICAgICAgICAgICAgaWYgKCFmaXJzdFRpbWUpIHtcclxuICAgICAgICAgICAgICAgIGlzU29uU3ViZm9ybSA9IHBhcmVudFRhc2suSXNTdWJGb3JtO1xyXG4gICAgICAgICAgICAgICAgcGFyZW50VGFzay5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfWk9PTSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgcGFyZW50VGFzay5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfREVMTElORSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgcGFyZW50VGFzay5lbmFibGVDcmVhdGVBY3RzKGZhbHNlKTtcclxuICAgICAgICAgICAgICB9IGVsc2VcclxuICAgICAgICAgICAgICAgIGZpcnN0VGltZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaXNTb25TdWJmb3JtID0gdGFzay5Jc1N1YkZvcm07XHJcblxyXG4gICAgICAgICAgZm9yIChwYXJlbnRUYXNrID0gPFRhc2s+dGFzay5nZXRQYXJlbnQoKTsgKHBhcmVudFRhc2sgIT09IG51bGwpICYmIGlzU29uU3ViZm9ybTsgcGFyZW50VGFzayA9IDxUYXNrPnBhcmVudFRhc2suZ2V0UGFyZW50KCkpIHtcclxuICAgICAgICAgICAgaXNTb25TdWJmb3JtID0gcGFyZW50VGFzay5Jc1N1YkZvcm07XHJcbiAgICAgICAgICAgIGlmIChwYXJlbnRUYXNrLmdldEVuYWJsZVpvb21IYW5kbGVyKCkpXHJcbiAgICAgICAgICAgICAgcGFyZW50VGFzay5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfWk9PTSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIGF3YWl0IHBhcmVudFRhc2suc2V0Q3JlYXRlRGVsZXRlQWN0c0VuYWJsZVN0YXRlKCk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy8gV2hlbmV2ZXIgd2UgYXJlIG1vdmluZyBiZXR3ZWVuIHRhc2tzLCByZS1ldmFsdWF0ZSBBbGxvd01vZGVzLlxyXG4gICAgICAgICAgYXdhaXQgdGFzay5lbmFibGVNb2RlcygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIGVuYWJsZSBhY3Rpb25zIGFuZCBzdGF0ZXNcclxuICAgIGlmICh0YXNrLmdldEVuYWJsZVpvb21IYW5kbGVyKCkgfHwgY3RybC51c2Vab29tSGFuZGxlcigpKVxyXG4gICAgICB0YXNrLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9aT09NLCB0cnVlKTtcclxuXHJcbiAgICBpZiAoY3RybC5pc1RleHRDb250cm9sKCkgfHwgY3RybC5pc0Nob2ljZUNvbnRyb2woKSlcclxuICAgICAgY3RybC5TZXRLZXlib2FyZExhbmd1YWdlKCk7XHJcblxyXG4gICAgaWYgKGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQlVUVE9OKVxyXG4gICAgICB0YXNrLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9CVVRUT04sIHRydWUpO1xyXG4gICAgYXdhaXQgdGFzay5zZXRDcmVhdGVEZWxldGVBY3RzRW5hYmxlU3RhdGUoKTtcclxuXHJcbiAgICBsZXQgZmllbGQ6IEZpZWxkID0gPEZpZWxkPmN0cmwuZ2V0RmllbGQoKTtcclxuICAgIGlmIChmaWVsZCAhPT0gbnVsbCAmJiBmaWVsZC5OdWxsQWxsb3dlZCAmJiBjdHJsLmlzTW9kaWZpYWJsZSgpICYmIGN0cmwuVHlwZSAhPT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQlVUVE9OKVxyXG4gICAgICB0YXNrLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9FRFRfTlVMTCwgdHJ1ZSk7XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGRvIHNvbWUgZGVmYXVsdCBvcGVyYXRpb25zIGZvciBhbiBldmVudCBhbmQgcmV0dXJuIHRydWUgdG8gdGVsbCB0aGUgY2FsbGVyXHJcbiAgLy8vICAgdG8gY29udGludWUgaGFuZGxpbmcgdGhlIGV2ZW50XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImV2dFwiPnRoZSBldmVudCB0byBoYW5kbGU8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGVsbHMgdGhlIGNhbGxlciB3aGV0aGVyIHRvIGNvbnRpbnVlIGhhbmRsaW5nIHRoZSBldmVudDwvcmV0dXJucz5cclxuICBwcml2YXRlIGFzeW5jIGNvbW1vbkhhbmRsZXJCZWZvcmUoZXZ0OiBSdW5UaW1lRXZlbnQpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCBldnRTYXZlOiBSdW5UaW1lRXZlbnQgPSBldnQ7XHJcbiAgICBsZXQgdGFzazogVGFzayA9IDxUYXNrPmV2dC5nZXRUYXNrKCk7XHJcbiAgICBsZXQgcmVjOiBSZWNvcmQgPSBudWxsO1xyXG4gICAgbGV0IHByZXZSZWM6IFJlY29yZCA9IG51bGw7XHJcbiAgICBsZXQgdmFsOiBzdHJpbmc7XHJcbiAgICBsZXQgb2xkRGlzcGxheUxpbmU6IG51bWJlciA9IEludDMyLk1pblZhbHVlO1xyXG5cclxuICAgIGlmICh0aGlzLl9zdG9wRXhlY3V0aW9uKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgaWYgKHRhc2suaXNBYm9ydGluZygpKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgaWYgKGV2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfU1lTVEVNKSB7XHJcbiAgICAgIGxldCBhY3RJZDogbnVtYmVyID0gdGhpcy5nZXRNYXRjaGluZ0FjdGlvbihldnQuZ2V0S2JkSXRtKCkpO1xyXG4gICAgICBpZiAoYWN0SWQgIT09IDAgJiYgZXZ0LkNvbnRyb2wgIT09IG51bGwpXHJcbiAgICAgIC8vICYmIGFjdElkICE9IE1HX0FDVF9TRUxFQ1QpXHJcbiAgICAgIHtcclxuICAgICAgICBldnQgPSBuZXcgUnVuVGltZUV2ZW50KGV2dCwgZXZ0KTtcclxuICAgICAgICBldnQuc2V0SW50ZXJuYWwoYWN0SWQpO1xyXG4gICAgICAgIGV2dC5zZXRBcmdMaXN0KG51bGwpO1xyXG4gICAgICAgIGxldCBtZ0NvbnRyb2w6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+ZXZ0LkNvbnRyb2w7XHJcbiAgICAgICAgZXZ0U2F2ZS5zZXRDdHJsKG1nQ29udHJvbCk7XHJcbiAgICAgICAgaWYgKG1nQ29udHJvbCA9PT0gbnVsbClcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFFDUiMgOTM5MjUzIC0gd2UgaGF2ZSB0byBwcm9jZXNzIGNvbW1vbkhhbmRsZXJCZWZvcmUgZXZlbiBmb3IgaW50ZXJuYWwgZXZlbnQgY29udmVydGVkXHJcbiAgICAvLyBmcm9tIHN5c3RlbSBFdmVudFxyXG4gICAgaWYgKGV2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfSU5URVJOQUwpIHtcclxuICAgICAgbGV0IGZvcm06IE1nRm9ybSA9IDxNZ0Zvcm0+dGFzay5nZXRGb3JtKCk7XHJcbiAgICAgIGxldCBkaXNwbGF5TGluZTogbnVtYmVyID0gZXZ0LmdldERpc3BsYXlMaW5lKCk7XHJcbiAgICAgIGxldCBkdjogRGF0YVZpZXcgPSA8RGF0YVZpZXc+dGFzay5EYXRhVmlldztcclxuICAgICAgcmVjID0gZHYuZ2V0Q3VyclJlYygpO1xyXG5cclxuICAgICAgbGV0IGN0cmw6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+ZXZ0LkNvbnRyb2w7XHJcbiAgICAgIGxldCBpbnRFdnRDb2RlOiBudW1iZXIgPSBldnQuZ2V0SW50ZXJuYWxDb2RlKCk7XHJcblxyXG4gICAgICBsZXQgbGFzdEZvY3VzZWRDdHJsOiBNZ0NvbnRyb2wgPSBMYXN0Rm9jdXNlZE1hbmFnZXIuZ2V0TGFzdEZvY3VzZWRDb250cm9sKCk7XHJcblxyXG4gICAgICAvLyBmb3IgaW50ZXJuYWwgZXZlbnRzXHJcbiAgICAgIHN3aXRjaCAoaW50RXZ0Q29kZSkge1xyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1pPT006XHJcbiAgICAgICAgICBsZXQgYm9vbHZhbCA9IGF3YWl0IHRoaXMuc2VsZWN0UHJvZyhjdHJsKTtcclxuICAgICAgICAgIGlmIChib29sdmFsKVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfV0VCX09OX0RCTElDSzpcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX0ZPQ1VTOlxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVGb2N1cyhjdHJsLCBkaXNwbGF5TGluZSwgZXZ0LmlzUHJvZHVjZUNsaWNrKCksIGV2dC5TaG91bGRIYW5kbGVab29tKTtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9GT0NVU19PTl9OT05fTUFHSUNfQ09OVFJPTDpcclxuICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRm9jdXNPbk5vbk1hZ2ljQ29udHJvbChjdHJsKTtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9LRVlET1dOOlxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVLZXlEb3duKHRhc2ssIGN0cmwsIGV2dCk7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfTU9VU0VVUDpcclxuICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlTW91c2VVcChjdHJsLCBkaXNwbGF5TGluZSwgZXZ0LmlzUHJvZHVjZUNsaWNrKCkpO1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9TRUxFQ1RJT046XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLm9uQWN0U2VsZWN0aW9uKGN0cmwsIGZvcm0sIGV2dCk7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RJTUVSOlxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVUaW1lcihldnQpO1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRVNJWkU6XHJcbiAgICAgICAgICB0aGlzLmhhbmRsZVJlc2l6ZShjdHJsLCBkaXNwbGF5TGluZSk7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JPV19EQVRBX0NVUlJfUEFHRTpcclxuICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlUm93RGF0YUN1clBhZ2UoY3RybCwgZGlzcGxheUxpbmUsIGV2dC5pc1NlbmRBbGwoKSwgZXZ0Lkxhc3RGb2N1c2VkVmFsKTtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRFZfVE9fR1VJOlxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVUcmFuc2ZlckRhdGFUb0d1aShjdHJsKTtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRkVUQ0hfUkVDT1JEU19BSEVBRF9GUk9NX1NFUlZFUjpcclxuICAgICAgICAgIGF3YWl0IHRoaXMuZmV0Y2hSZWNvcmRzQWhlYWRGcm9tU2VydmVyKGN0cmwpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VOQUJMRV9FVkVOVFM6XHJcbiAgICAgICAgICB0aGlzLmhhbmRsZUVuYWJsZUV2ZW50cyhldnQsIHRydWUpO1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9ESVNBQkxFX0VWRU5UUzpcclxuICAgICAgICAgIHRoaXMuaGFuZGxlRW5hYmxlRXZlbnRzKGV2dCwgZmFsc2UpO1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQVNLX1BSRUZJWDpcclxuICAgICAgICAgIHRhc2suc2V0TGV2ZWwoQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSyk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEFTS19TVUZGSVg6XHJcbiAgICAgICAgICB0YXNrLnNldExldmVsKENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVg6XHJcbiAgICAgICAgICAvLyBEZWZlY3QgMTE1OTAzLiBEbyBub3QgZXhlY3V0ZSBSUCBpZiB0aGUgc3ViZm9ybSBwYXJlbnQgdGFzayBkaWRuJ3QgZmluaXNoZWQgeWV0XHJcbiAgICAgICAgICAvLyBpdCdzIENvbW1vbkhhbmRsZXJCZWZvcmUgZm9yIFJQLlxyXG4gICAgICAgICAgaWYgKHRhc2suSXNTdWJGb3JtICYmICg8VGFzaz50YXNrLmdldFBhcmVudCgpKS5JbkNvbW1vbkhhbmRsZXJCZWZvcmVSUClcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICAgIC8vIFJlY292ZXJ5IGZyb20gdHJhbnNhY3Rpb24gcmVzdGFydCB3YXMgY29tcGxldGVkLiBXZSBtYXkgbm93IGNsZWFyIHRoZSBmbGFnXHJcbiAgICAgICAgICB0YXNrLnNldEFmdGVyUmV0cnkoQ29uc3RJbnRlcmZhY2UuUkVDT1ZFUllfTk9ORSk7XHJcbiAgICAgICAgICB0YXNrLkRhdGFTeW5jZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICBpZiAoIXRhc2suaXNTdGFydGVkKCkpXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcblxyXG4gICAgICAgICAgLy8gaWYgdGhlIGZvcm0gY29udGFpbnMgYSB0YWJsZSBhbmQgdGhlIGNvbnRyb2wgd2FzIGluIHRoZSB0YWJsZVxyXG4gICAgICAgICAgLy8gbW92ZSB0byB0aGUgbmV3IHJvd1xyXG4gICAgICAgICAgaWYgKGZvcm0uZ2V0Um93c0luUGFnZSgpID4gSW50MzIuTWluVmFsdWUgJiYgZGlzcGxheUxpbmUgPiBJbnQzMi5NaW5WYWx1ZSkge1xyXG4gICAgICAgICAgICAvLyBlbnN1cmUgYSB2YWxpZCByb3dcclxuICAgICAgICAgICAgd2hpbGUgKCFkdi5yZWNFeGlzdHMoZGlzcGxheUxpbmUpICYmIGRpc3BsYXlMaW5lID4gMCkge1xyXG4gICAgICAgICAgICAgIGRpc3BsYXlMaW5lLS07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGRpc3BsYXlMaW5lID49IDApIHtcclxuICAgICAgICAgICAgICBwcmV2UmVjID0gZHYuZ2V0Q3VyclJlYygpO1xyXG4gICAgICAgICAgICAgIGxldCBvbGRUYXNrTW9kZTogc3RyaW5nID0gdGFzay5nZXRNb2RlKCk7XHJcbiAgICAgICAgICAgICAgbGV0IG9sZFJlY0lkOiBudW1iZXIgPSBwcmV2UmVjLmdldElkKCk7XHJcblxyXG4gICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBvbGREaXNwbGF5TGluZSA9IGZvcm0uRGlzcGxheUxpbmU7XHJcbiAgICAgICAgICAgICAgICAvLyBvbGREaXNwbGF5TGluZSA9IGZvcm0uZ2V0Q3VyclJvdygpXHJcbiAgICAgICAgICAgICAgICBmb3JtLlByZXZEaXNwbGF5TGluZSA9IG9sZERpc3BsYXlMaW5lO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgZm9ybS5zZXRDdXJyUm93QnlEaXNwbGF5TGluZShkaXNwbGF5TGluZSwgdHJ1ZSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgLy8gcmVmcmVzaCB0aGUgZGlzcGxheSBpZiB0aGUgcHJldmlvdXMgcmVjb3JkIHdhcyBkZWxldGVkIG9yIGNhbmNlbGVkXHJcbiAgICAgICAgICAgICAgICBpZiAocHJldlJlYyAhPSBudWxsICYmICFkdi5yZWNFeGlzdHNCeUlkKHByZXZSZWMuZ2V0SWQoKSkpIHtcclxuICAgICAgICAgICAgICAgICAgYXdhaXQgZm9ybS5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX1RBQkxFKTtcclxuICAgICAgICAgICAgICAgICAgLy8gVGhlIGZvbGxvd2luZyByZWZyZXNoIGlzIGVzc2VudGlhbC4gSWYgaXQgZmFpbHMgYmVjYXVzZSBvZiBhblxyXG4gICAgICAgICAgICAgICAgICAvLyBleGNlcHRpb24gdGhlbiB0aGUgb2xkIGN1cnIgcm93IGlzIHJlc3RvcmVkIChpbiB0aGUgY2F0Y2hcclxuICAgICAgICAgICAgICAgICAgLy8gc3RhdGVtZW50KS4gSXQgY2FuIGhhcHBlbiB3aGVuIHRoZSB1c2VyIGNsaWNrcyBvbiBhIGxpbmUgd2hpY2hcclxuICAgICAgICAgICAgICAgICAgLy8gYmVjb21lcyBibGFuayBkdWUgdG8gdGhlIGRlbGV0aW9uIG9mIHRoZSBwcmV2aW91cyByZWNvcmQuXHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IGZvcm0uUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9DVVJSX1JFQyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZWMgPSBkdi5nZXRDdXJyUmVjKCk7XHJcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9zdG9wRXhlY3V0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9sZFRhc2tNb2RlID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSAmJiBvbGREaXNwbGF5TGluZSA+IDAgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICFkdi5yZWNFeGlzdHNCeUlkKG9sZFJlY0lkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgbGV0IHByZXZMaW5lOiBudW1iZXIgPSBmb3JtLmdldFByZXZMaW5lKG9sZERpc3BsYXlMaW5lKTtcclxuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGZvcm0ucmVzdG9yZU9sZERpc3BsYXlMaW5lKHByZXZMaW5lKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2VcclxuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGZvcm0ucmVzdG9yZU9sZERpc3BsYXlMaW5lKG9sZERpc3BsYXlMaW5lKTtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBmb3JtLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfRk9STSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICBsYXN0Rm9jdXNlZEN0cmwgPSA8TWdDb250cm9sPnRhc2suZ2V0TGFzdFBhcmtlZEN0cmwoKTtcclxuICAgICAgICAgICAgICAgICAgICB0YXNrLmdldExhc3RQYXJrZWRDdHJsKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RGb2N1c2VkQ3RybCAhPSBudWxsKVxyXG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgbGFzdEZvY3VzZWRDdHJsLmludm9rZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbih0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgIH0gZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKGUuU3RhY2tUcmFjZSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgdGhyb3cgZTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZVxyXG4gICAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbignaW4gRXZlbnRzTWFuYWdlci5jb21tb25IYW5kbGVyQmVmb3JlKCk6IGludmFsaWQgbGluZSBudW1iZXI6ICcgK1xyXG4gICAgICAgICAgICAgICAgZGlzcGxheUxpbmUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKHJlYyA9PSBudWxsKVxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25FeGNlcHRpb24oXHJcbiAgICAgICAgICAgICAgJ2luIEV2ZW50c01hbmFnZXIuY29tbW9uSGFuZGxlckJlZm9yZSgpOiBubyBjdXJyZW50IHJlY29yZCBhdmFpbGFibGUgIScpO1xyXG5cclxuICAgICAgICAgIC8vIG9ubHkgZm9yIG5vbiBpbnRlcmFjdGl2ZSB0YXNrcy4gSW5jcmVhc2UgdGhlIHRhc2sncyBjb3VudGVyIGZvciBldmVyeSByZWNvcmQgd2UgcGFzcy5cclxuICAgICAgICAgIC8vIGRvIGl0IGJlZm9yZSB0aGUgZXZhbEVuZENvbmQgc2luY2UgaXQgbWlnaHQgaW5jbHVkZSBjb3VudGVyKDApLlxyXG4gICAgICAgICAgLy8gaW5jcmVhc2Ugb25seSBpZiBnb2luZyBpbnRvIHRoZSByZWMgcHJlZml4LlxyXG4gICAgICAgICAgaWYgKCF0YXNrLklzSW50ZXJhY3RpdmUgJiYgdGFzay5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKVxyXG4gICAgICAgICAgICB0YXNrLmluY3JlYXNlQ291bnRlcigpO1xyXG5cclxuICAgICAgICAgIC8vIGNoZWNrIHRoZSBcInRhc2sgZW5kIGNvbmRpdGlvblwiIGJlZm9yZSBlbnRlcmluZyB0aGUgcmVjb3JkXHJcbiAgICAgICAgICBpZiAoYXdhaXQgdGFzay5ldmFsRW5kQ29uZChDb25zdEludGVyZmFjZS5FTkRfQ09ORF9FVkFMX0JFRk9SRSkpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGFzay5lbmRUYXNrKHRydWUsIGZhbHNlLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChmb3JtLkhhc1RhYmxlKCkpXHJcbiAgICAgICAgICAgIGF3YWl0IGZvcm0uYnJpbmdSZWNvcmRUb1BhZ2UoKTtcclxuXHJcbiAgICAgICAgICAvLyB0byBwcmV2ZW50IGRvdWJsZSBwcmVmaXggb24gdGhlIHNhbWUgcmVjb3JkXHJcbiAgICAgICAgICBpZiAodGFzay5nZXRMZXZlbCgpICE9PSBDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgICAgYXdhaXQgZm9ybS5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0NVUlJfUkVDKTtcclxuXHJcbiAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZygnUkVDT1JEIFBSRUZJWDogJyArIHRhc2sucXVlcnlUYXNrUGF0aCgpKTtcclxuICAgICAgICAgIChkdi5nZXRDdXJyUmVjKCkpLnNldEZvcmNlU2F2ZU9yZyhmYWxzZSk7XHJcbiAgICAgICAgICAoZHYuZ2V0Q3VyclJlYygpKS5TeW5jZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICBkdi5zYXZlT3JpZ2luYWwoKTtcclxuXHJcbiAgICAgICAgICAvLyBkbyBSZWNvcmQgUHJlZml4IGZvciBhbGwgZmF0aGVycyB0aGF0IHRoZWlyIFJlY29yZCBQcmVmaXggaXMgbm90IGRvbmUgZWFybGllclxyXG4gICAgICAgICAgaWYgKHRhc2suSXNTdWJGb3JtICYmIHRhc2suUGVyZm9ybVBhcmVudFJlY29yZFByZWZpeCkge1xyXG4gICAgICAgICAgICBsZXQgcGFyZW50VGFzayA9IHRhc2suZ2V0UGFyZW50KCk7XHJcbiAgICAgICAgICAgIHdoaWxlIChwYXJlbnRUYXNrLklzU3ViRm9ybSkge1xyXG4gICAgICAgICAgICAgIGlmIChwYXJlbnRUYXNrLmdldExldmVsKCkgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHBhcmVudFRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuICAgICAgICAgICAgICAgIHBhcmVudFRhc2sgPSBwYXJlbnRUYXNrLmdldFBhcmVudCgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSlcclxuICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgfSBlbHNlXHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vIGhhbmRsZSBzdWItZm9ybXNcclxuICAgICAgICAgIHRhc2suSW5Db21tb25IYW5kbGVyQmVmb3JlUlAgPSB0cnVlO1xyXG4gICAgICAgICAgaWYgKGF3YWl0IHRhc2suQ2hlY2tSZWZyZXNoU3ViVGFza3MoKSlcclxuICAgICAgICAgICAgYXdhaXQgZHYuY29tcHV0ZVN1YkZvcm1zKCk7XHJcbiAgICAgICAgICB0YXNrLkluQ29tbW9uSGFuZGxlckJlZm9yZVJQID0gZmFsc2U7XHJcbiAgICAgICAgICB0YXNrLnNldExldmVsKENvbnN0YW50cy5UQVNLX0xFVkVMX1JFQ09SRCk7XHJcbiAgICAgICAgICAvLyBlbmFibGUtZGlzYWJsZSBhY3Rpb25zIGZvciBhIHJlY29yZFxyXG4gICAgICAgICAgYXdhaXQgdGFzay5lbmFibGVSZWNvcmRBY3Rpb25zKCk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWDpcclxuICAgICAgICAgIC8vIEZvcmNlIHJlY29yZCBzdWZmaXg6XHJcbiAgICAgICAgICBsZXQgZm9yY2VTdWZmaXg6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgICAgICAgIGxldCBpc1NlbGVjdGlvblRhYmxlOiBib29sZWFuO1xyXG5cclxuICAgICAgICAgIHRhc2suQ29uZmlybVVwZGF0ZU5vID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgLy8gTm8gcmVjb3JkIC0+IG5vIHN1ZmZpeFxyXG4gICAgICAgICAgaWYgKHJlYyA9PSBudWxsKVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgICAgZm9yY2VTdWZmaXggPSBhd2FpdCB0YXNrLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9GT1JDRV9TVUZGSVgsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgICAvLyBkbyBub3QgZXhlY3V0ZSB0aGUgXCJiZWZvcmUgcmVjb3JkIHN1ZmZpeFwiIHdoZW4gZGVsZXRpbmcgdGhlIHJlY29yZCBhbmRcclxuICAgICAgICAgIC8vIHRoZSB0YXNrIG1vZGUgaXMgZGVsZXRlICh0aGUgc2Vjb25kIHJvdW5kKVxyXG4gICAgICAgICAgaWYgKChyZWMuTW9kaWZpZWQgfHwgZm9yY2VTdWZmaXgpICYmIHJlYy5nZXRNb2RlKCkgPT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5EZWxldGUgJiZcclxuICAgICAgICAgICAgdGFzay5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfREVMRVRFKVxyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAvLyB0byBwcmV2ZW50IGRvdWJsZSBzdWZmaXggb24gdGhlIHNhbWUgcmVjb3JkXHJcbiAgICAgICAgICBpZiAodGFzay5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgICAgaWYgKHRhc2suZ2V0TGV2ZWwoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfQ09OVFJPTCkge1xyXG4gICAgICAgICAgICB0YXNrLnNldEluUmVjb3JkU3VmZml4KHRydWUpO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoTWdDb250cm9sQmFzZSh0YXNrLmdldExhc3RQYXJrZWRDdHJsKCksIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1NVRkZJWCk7XHJcbiAgICAgICAgICAgIHRhc2suc2V0SW5SZWNvcmRTdWZmaXgoZmFsc2UpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fc3RvcEV4ZWN1dGlvbilcclxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgYXdhaXQgdGFzay5oYW5kbGVFdmVudE9uU2xhdmVUYXNrcyhJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcbiAgICAgICAgICBpZiAodGhpcy5fc3RvcEV4ZWN1dGlvbilcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coJ1JFQ09SRCBTVUZGSVg6ICcgKyB0YXNrLnF1ZXJ5VGFza1BhdGgoKSk7XHJcblxyXG5cclxuICAgICAgICAgIC8vIGluZGljYXRlIG5leHQgdmVyaWZ5Q3RybCBpcyB0aGUgZmlyc3QgY3RybCBpbiB0aGUgcmVjb3JkXHJcblxyXG4gICAgICAgICAgdGFzay5zZXRMZXZlbChDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKTtcclxuXHJcbiAgICAgICAgICBpc1NlbGVjdGlvblRhYmxlID0gYXdhaXQgdGFzay5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfU0VMRUNUSU9OLCBmYWxzZSk7XHJcblxyXG4gICAgICAgICAgLy8gUXVlcnkgbW9kZSAtPiBkbyBzdWZmaXggb25seSBpZiB3ZSBmb3JjZSBpdCBvciBzb21laG93IHRoZSByZWNvcmQgd2FzIHVwZGF0ZWRcclxuICAgICAgICAgIGlmICh0YXNrLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9RVUVSWSAmJiAhZm9yY2VTdWZmaXggJiYgIXJlYy5Nb2RpZmllZCAmJlxyXG4gICAgICAgICAgICAhaXNTZWxlY3Rpb25UYWJsZSlcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICAgIGlmICghcmVjLk1vZGlmaWVkICYmICFmb3JjZVN1ZmZpeCAmJiAoIWlzU2VsZWN0aW9uVGFibGUgfHwgIXRhc2suSW5TZWxlY3QpKSB7XHJcbiAgICAgICAgICAgIGlmIChyZWMuZ2V0TW9kZSgpID09PSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuRGVsZXRlKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZXhlY3V0ZUNvbnRyb2xWZXJpZmljYXRpb24odGFzayk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmICh0YXNrLmdldE1vZGUoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9ERUxFVEUgJiYgcmVjLk1vZGlmaWVkKSB7XHJcbiAgICAgICAgICAgIGlmICghYXdhaXQgdGhpcy51cGRhdGVDb25maXJtZWQodGFzaykpXHJcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGxldCBzdG9wRXhlY3V0aW9uOiBib29sZWFuID0gIWF3YWl0IHRoaXMuZXhlY3V0ZUNvbnRyb2xWZXJpZmljYXRpb24odGFzayk7XHJcbiAgICAgICAgICAvLyBkbyBub3QgY29udGludWUgcHJvY2Vzc2luZyBSUyBpZiBDViByZXR1cm5zIGVycm9yXHJcbiAgICAgICAgICBpZiAoc3RvcEV4ZWN1dGlvbilcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfUFJFRklYOlxyXG4gICAgICAgICAgaWYgKGF3YWl0IHRoaXMuaGFuZGxlQ3RybFByZWZpeChldnQpKVxyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBkaWQgbm90IHN1Y2NlZWQgaW4gZW50ZXJpbmcgdGhlIGN0cmxcclxuICAgICAgICAgICAgZXZ0LkNvbnRyb2wuSW5Db250cm9sID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ0FOQ0VMOlxyXG4gICAgICAgICAgTWFuYWdlci5DbGVhbk1lc3NhZ2VQYW5lKHRhc2spOyAvLyBRQ1IgIzM3MTMyMVxyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfU1VGRklYOlxyXG5cclxuICAgICAgICAgIC8vIGlmIHdlIGhhdmUgYSBzdG9wZXhlY3V0aW9uIGN0cmwgd2Ugc2hvdWxkIG5vdCBleGVjdXRlIENTLlxyXG4gICAgICAgICAgaWYgKGN0cmwgPT0gbnVsbCB8fCB0aGlzLmdldFN0b3BFeGVjdXRpb25DdHJsKCkgIT0gbnVsbClcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICAgIC8vIHRvIHByZXZlbnQgZG91YmxlIHN1ZmZpeCBvbiB0aGUgc2FtZSBjb250cm9sXHJcbiAgICAgICAgICBpZiAodGFzay5nZXRMZXZlbCgpICE9PSBDb25zdGFudHMuVEFTS19MRVZFTF9DT05UUk9MKVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgICAgaWYgKCFjdHJsLmlzU3ViZm9ybSgpKSB7XHJcbiAgICAgICAgICAgIHZhbCA9IE1hbmFnZXIuR2V0Q3RybFZhbChjdHJsKTtcclxuXHJcbiAgICAgICAgICAgIC8vIFdlIGFyZSByZXNldHRpbmcgdGhlIGZsYWcgYXMgd2UgYXJlIG1vdmluZyBmcm9tIG9uZSBjb250cm9sIHRvIG90aGVyIGNvbnRyb2wuXHJcbiAgICAgICAgICAgIHRhc2suQ3VycmVudEVkaXRpbmdDb250cm9sID0gbnVsbDtcclxuXHJcbiAgICAgICAgICAgIC8vIHZhbGlkYXRlIHRoZSBjb250cm9scyB2YWx1ZVxyXG4gICAgICAgICAgICAvLyBGaXhlZCBidWcgIzo3NTg3ODgsIHRoZSBicm93c2VyIGNvbnRyb2wgd2lsbCBub3QgYmUgdXBkYXRlIGZyb20gdGhlIGZpbGVkLlxyXG4gICAgICAgICAgICAvLyBQYXRjaCBmb3IgUUNSICM3Mjk3MDY6XHJcbiAgICAgICAgICAgIC8vIE1hZ2ljIHRocmVhZCBwdXRzIHRoZSBmb2xsb3dpbmcgR1VJIGNvbW1hbmRzOlxyXG4gICAgICAgICAgICAvLyAgICBQUk9QX1NFVF9JTUFHRV9GSUxFX05BTUUgdG8gc2V0IHRoZSBpbWFnZSBvbiB0aGUgSW1hZ2UgY29udHJvbC5cclxuICAgICAgICAgICAgLy8gICAgUFJPUF9TRVRfVEVYVCB0byBzZXQgdGhlIHRleHQgb2YgdGhlIFRleHRCb3ggY29udHJvbC5cclxuICAgICAgICAgICAgLy8gICAgU0VUX0ZPQ1VTIHRvIGZvY3VzIG9uIHRoZSBUZXh0Qm94IGNvbnRyb2wuXHJcbiAgICAgICAgICAgIC8vIE5vdywgd2hlbiB0aGUgZXhlY3V0aW9uIGlzIGJ5IEY3LCBpZiB0aGUgZmlsZSBpcyBub3QgcmV0cmlldmVkIGZyb20gdGhlIHNlcnZlclxyXG4gICAgICAgICAgICAvLyAoaS5lLiBpZiB0aGVyZSBpcyA0MDQgZXJyb3IpLCBIdHRwQ2xpZW50IHJlLXRyaWVzIHRvIGdldCB0aGUgZmlsZSBmb3IgSFRUUHRpbWVvdXQuXHJcbiAgICAgICAgICAgIC8vIER1cmluZyB0aGlzIHRpbWUgYWxsIHRoZSBHVUkgZXZlbnRzIGluIEd1aUNvbW1hbmRzUXVldWUgcmVtYWlucyBwZW5kaW5nIHVuaGFuZGxlZC5cclxuICAgICAgICAgICAgLy8gSW4gdGhlIG1lYW4gdGltZSwgTWFnaWMgdGhyZWFkIGV4ZWN1dGVzIHRoZSBFeGl0IGV2ZW50IGFuZCBkdXJpbmcgdGhpcywgaXQgdHJpZXNcclxuICAgICAgICAgICAgLy8gdG8gZXhlY3V0ZSB0aGUgQ3RybCBTdWZmaXggb2YgdGhlIFRleHRCb3ggY29udHJvbC5cclxuICAgICAgICAgICAgLy8gU2luY2UgU0VUX0ZPQ1VTIGlzIHN0aWxsIHBlbmRpbmcgaW4gdGhlIHF1ZXVlLCB0aGUgbG9naWNhbCBjb250cm9sIChpZiBhbGxvd1Rlc3Rpbmc9Tm8pXHJcbiAgICAgICAgICAgIC8vIGlzIG5vdCBtYXBwZWQgd2l0aCBhbnkgYWN0dWFsIHdpbmRvd3MgY29udHJvbC5cclxuICAgICAgICAgICAgLy8gTm93IHdoZW4gd2UgdHJ5IHRvIGdldCB0aGUgdmFsdWUgb2YgdGhpcyBsb2dpY2FsIGNvbnRyb2wsIExvZ2ljYWxDb250cm9sLmdldEVkaXRvckNvbnRyb2woKVxyXG4gICAgICAgICAgICAvLyByZXR1cm5zIG51bGwgYW5kIHNvLCBTdGF0aWNUZXh0LmdldFZhbHVlKCkgcmV0dXJucyBMb2dpY2FsQ29udHJvbC5UZXh0IGluc3RlYWQgb2YgQ29udHJvbC5UZXh0XHJcbiAgICAgICAgICAgIC8vIEJlY2F1c2UgUFJPUF9TRVRfVEVYVCBpcyBhbHNvIHBlbmRpbmcsIExvZ2ljYWxDb250cm9sLlRleHQgaXMgbnVsbC5cclxuICAgICAgICAgICAgLy8gQW5kIHNvIHRoZXJlIGlzIGFuIGV4Y2VwdGlvbiB3aGVuIHVzaW5nIGl0LlxyXG4gICAgICAgICAgICAvLyBJZiBBbGxvd1Rlc3Rpbmc9WWVzLCB0aGUgdmFsIHdpbGwgYmUgYSBibGFuayBzdHJpbmcuIFNvLCB0aGVyZSBpcyBubyBjcmFzaC5cclxuICAgICAgICAgICAgLy8gQnV0IGhlcmUgd2UgaGF2ZSBhbm90aGVyIHByb2JsZW0uIFN1cHBvc2UsIHRoZSBmaWVsZCBoYWQgYW4gSW5pdCBleHByZXNzaW9uLlxyXG4gICAgICAgICAgICAvLyBOb3csIE1nQ29udHJvbCdzIHZhbHVlIHdvdWxkIGJlIHRoZSBpbml0ZWQgdmFsdWUgYW5kIHRoZSB2YWwgaXMgYSBibGFuayBzdHJpbmcuXHJcbiAgICAgICAgICAgIC8vIFNvLCB3ZSB3aWxsIGhhdmUgdmFyaWFibGUgY2hhbmdlLlxyXG4gICAgICAgICAgICAvLyBTaW5jZSB0aGUgcHJvYmxlbSBpcyByZWxhdGVkIHRvIGEgdmVyeSBzcGVjaWZpYyBzY2VuYXJpbyAtLSB3aGVuIHRoZSBpbWFnZSBjb250cm9sIHdhc1xyXG4gICAgICAgICAgICAvLyB0aGUgZmlyc3QgZHJvcHBlZCBjb250cm9sIG9uIHRoZSBmb3JtLCBpbWFnZSBjYW5ub3QgYmUgYWNjZXNzZWQgYXQgdGhlIHRpbWUgb2YgdGFza1xyXG4gICAgICAgICAgICAvLyBsb2FkaW5nIGFuZCB0YXNrIG5lZWRzIHRvIGJlIGNsb3NlZCwgd2UgYXJlIHB1dHRpbmcgYSBwYXRjaCBoZXJlIGJ5IGNoZWNraW5nIHZhbCBmb3IgTlVMTC5cclxuICAgICAgICAgICAgLy8gVGhlIGlkZWFsIHNvbHV0aW9uIHdvdWxkIGJlIC0tLSBpbnN0ZWFkIG9mIHNlbmRpbmcgdGhlIGltYWdlIGZpbGUgbmFtZSBmcm9tIE1hZ2ljIHRocmVhZFxyXG4gICAgICAgICAgICAvLyB0byBHdWkgdGhyZWFkIGFuZCBsb2FkaW5nIHRoZSBpbWFnZSBmcm9tIHRoZSBHdWkgdGhyZWFkLCB3ZSBjYW4gbG9hZCB0aGUgaW1hZ2UgZnJvbSB0aGVcclxuICAgICAgICAgICAgLy8gTWFnaWMgdGhyZWFkICh1c2luZyBzeW5jIGV4ZWN1dGlvbiBpLmUuIHZpYSBHdWlJbnRlcmFjdGl2ZSkgYW5kIHNlbmQgaXQgdG8gdGhlIEd1aSB0aHJlYWQuXHJcbiAgICAgICAgICAgIGlmICghdGFzay5jYW5jZWxXYXNSYWlzZWQoKSAmJlxyXG4gICAgICAgICAgICAgIChjdHJsLlR5cGUgIT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0JST1dTRVIgJiYgKCFpc051bGxPclVuZGVmaW5lZChjdHJsLl9maWVsZCkgJiYgKGN0cmwuX2ZpZWxkLmdldFR5cGUoKSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5EQVRFIHx8IGN0cmwuX2ZpZWxkLmdldFR5cGUoKSA9PSBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUMpIHx8IHZhbCAhPT0gbnVsbCkgJiYgdHlwZW9mIHZhbCAhPSAndW5kZWZpbmVkJyAmJlxyXG4gICAgICAgICAgICAgICAgIWF3YWl0IGN0cmwudmFsaWRhdGVBbmRTZXRWYWx1ZSh2YWwsIHRydWUpKSkge1xyXG4gICAgICAgICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbih0cnVlKTtcclxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyB3aGVuIHN0b3AgZXhlY3V0aW9uIGluIG9uLCBkb24ndCBjbGVhciB0aGUgbXNnIGZyb20gc3RhdHVzLlxyXG4gICAgICAgICAgaWYgKCF0aGlzLl9zdG9wRXhlY3V0aW9uKVxyXG4gICAgICAgICAgICBNYW5hZ2VyLkNsZWFuTWVzc2FnZVBhbmUodGFzayk7XHJcblxyXG4gICAgICAgICAgLy8gcmVzZXQgSW5Db250cm9sIGJlZm9yZSBleGVjdXRpbmcgY29udHJvbCB2ZXJpZmljYXRpb25cclxuICAgICAgICAgIGN0cmwuSW5Db250cm9sID0gZmFsc2U7XHJcbiAgICAgICAgICBjdHJsLkNsaXBCb2FyZERhdGFFeGlzdHMgPSBmYWxzZTtcclxuICAgICAgICAgIGN0cmwuVmFsaWRhdGVDb250cm9sID0gdHJ1ZTtcclxuICAgICAgICAgIGN0cmwuc2V0SW5Db250cm9sU3VmZml4KHRydWUpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gZXhlY3V0ZSBhIHNlbGVjdCBwcm9ncmFtIGFuZCByZXR1cm5zIHRydWUgaWYgdGhlIHByb2dyYW0gd2FzIGV4ZWN1dGVkICA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY3RybFwiPnRoZSBzb3VyY2UgY29udHJvbDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicHJvbXB0XCI+aWYgdHJ1ZSB0aGVuIHRoZSBjYWxsZXIgaXMgZXhlY3V0aW5nIHRoZSBjYWxsZWQgcHJvZ3JhbSBhdCB0aGUgZW5kIG9mIGNvbnRyb2wgcHJlZml4PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByb3RlY3RlZCBhc3luYyBzZWxlY3RQcm9nKGN0cmw6IE1nQ29udHJvbCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IGNtZDogSUNsaWVudENvbW1hbmQ7XHJcbiAgICBsZXQgdmFsdWU6IFN0cmluZztcclxuICAgIGxldCBtZ1ZhbDogc3RyaW5nO1xyXG4gICAgbGV0IHByb2dFeGVjdXRlZCA9IGZhbHNlO1xyXG4gICAgbGV0IHRhc2sgPSA8VGFzaz5jdHJsLmdldEZvcm0oKS5nZXRUYXNrKCk7XHJcblxyXG4gICAgLy8gY2hlY2sgaWYgdGhlcmUgaXMgc2VsZWN0IHByb2dyYW0gdG8gdGhlIGNvbnRyb2xcclxuICAgIGlmIChjdHJsLkhhc1NlbGVjdFByb2dyYW0oKSkge1xyXG4gICAgICAvL2NoZWNrIGlmIHRoZSBjb250cm9sIGlzIHBhcmthYmxlXHJcbiAgICAgIGlmIChjdHJsLklzUGFya2FibGUoKSkge1xyXG5cclxuICAgICAgICB2YWx1ZSA9IE1hbmFnZXIuR2V0Q3RybFZhbChjdHJsKTtcclxuXHJcbiAgICAgICAgLy8gdmFsaWRhdGUgdGhlIGNvbnRyb2xzIHZhbHVlXHJcbiAgICAgICAgaWYgKCFjdHJsLnZhbGlkYXRlQW5kU2V0VmFsdWUodmFsdWUsIGZhbHNlKSlcclxuICAgICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbih0cnVlKTtcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGxldCBlbmNvZGVkVmFsOiBzdHJpbmcgPSBudWxsO1xyXG4gICAgICAgICAgbWdWYWwgPSBhd2FpdCBjdHJsLmdldE1nVmFsdWUodmFsdWUpO1xyXG4gICAgICAgICAgdmFyIHJlYyA9ICg8RGF0YVZpZXc+dGFzay5EYXRhVmlldykuZ2V0Q3VyclJlYygpO1xyXG4gICAgICAgICAgZW5jb2RlZFZhbCA9IHJlYy5nZXRYTUxGb3JWYWx1ZShjdHJsLmdldEZpZWxkKCkuZ2V0SWQoKSwgbWdWYWwpO1xyXG4gICAgICAgICAgY21kID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlU2VsZWN0UHJvZ3JhbUNvbW1hbmQodGFzay5nZXRUYXNrVGFnKCksIG51bGwsIEludDMyLk1pblZhbHVlLCBjdHJsLmdldERpdElkeCgpLCBlbmNvZGVkVmFsKTtcclxuICAgICAgICAgIHRhc2suZ2V0TUdEYXRhKCkuQ21kc1RvU2VydmVyLkFkZChjbWQpO1xyXG5cclxuICAgICAgICAgIGxldCBjb21tYW5kc1Byb2Nlc3NvclNlcnZlcjogQ29tbWFuZHNQcm9jZXNzb3JCYXNlID0gQ29tbWFuZHNQcm9jZXNzb3JNYW5hZ2VyLkdldENvbW1hbmRzUHJvY2Vzc29yKCk7XHJcbiAgICAgICAgICBhd2FpdCBjb21tYW5kc1Byb2Nlc3NvclNlcnZlci5FeGVjdXRlKENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZW5kaW5nSW5zdHJ1Y3Rpb24uVEFTS1NfQU5EX0NPTU1BTkRTKTtcclxuXHJcbiAgICAgICAgICBwcm9nRXhlY3V0ZWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHByb2dFeGVjdXRlZDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgZXhlY3V0ZUNvbnRyb2xWZXJpZmljYXRpb24odGFzazogVGFzayk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG5cclxuICAgIC8vIGNoZWNrIGFsbCBoYW5kbGVycyBpZiBpdCBpcyBjb250cm9sIHZlcmlmaWNhdGlvbi4gRXhlY3V0ZSBhbGwgU1YgaGFuZGxlcnNcclxuICAgIGxldCB0YWJsZTogSGFuZGxlcnNUYWJsZSA9IHRhc2suZ2V0SGFuZGxlcnNUYWIoKTtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0YWJsZS5nZXRTaXplKCk7IGkrKykge1xyXG4gICAgICBsZXQgaGFuZGxlcjogRXZlbnRIYW5kbGVyID0gdGFibGUuZ2V0SGFuZGxlcihpKTtcclxuICAgICAgbGV0IGV2dDogRXZlbnQgPSBoYW5kbGVyLmdldEV2ZW50KCk7XHJcbiAgICAgIGlmIChldnQuZ2V0SW50ZXJuYWxDb2RlKCkgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1ZFUklGSUNBVElPTikge1xyXG4gICAgICAgIGxldCBjb250cm9sOiBNZ0NvbnRyb2wgPSAoKHRhc2suZ2V0Rm9ybSgpICE9PSBudWxsKSA/ICg8TWdGb3JtPnRhc2suZ2V0Rm9ybSgpKS5nZXRDdHJsQnlDdHJsTmFtZShoYW5kbGVyLmdldEN0cmxOYW1lKCkpIDogbnVsbCk7XHJcbiAgICAgICAgaWYgKCFpc051bGxPclVuZGVmaW5lZChjb250cm9sKSkge1xyXG4gICAgICAgICAgbGV0IHJ1blRpbWVFdmVudDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudChjb250cm9sKTtcclxuICAgICAgICAgIHJ1blRpbWVFdmVudC5zZXRJbnRlcm5hbChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9WRVJJRklDQVRJT04pO1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVFdmVudChydW5UaW1lRXZlbnQsIGZhbHNlKTtcclxuICAgICAgICAgIGlmICh0aGlzLl9zdG9wRXhlY3V0aW9uKSB7XHJcbiAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIGVycm9yLCBwYXJrL2ZvY3VzIG9uIHRoaXMgY29udHJvbCB3aGVyZSBlcnJvciBvY2N1cnMgaW4gQ1YgZXhlY3V0aW9uLlxyXG4gICAgICAgICAgICBMYXN0Rm9jdXNlZE1hbmFnZXIuc2V0TGFzdEZvY3VzZWRDb250cm9sKHRhc2ssIGNvbnRyb2wpO1xyXG4gICAgICAgICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb25DdHJsKG51bGwpO1xyXG4gICAgICAgICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb25DdHJsKGNvbnRyb2wpO1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG5cclxuICBwcml2YXRlIGFzeW5jIG9uQWN0U2VsZWN0aW9uKGN0cmw6IE1nQ29udHJvbCwgZm9ybTogTWdGb3JtLCBldnQ6IFJ1blRpbWVFdmVudCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGRpc3BsYXlMaW5lOiBudW1iZXIgPSBldnQuZ2V0RGlzcGxheUxpbmUoKTtcclxuICAgIGlmIChkaXNwbGF5TGluZSA9PT0gSW50MzIuTWluVmFsdWUpXHJcbiAgICAgIGRpc3BsYXlMaW5lID0gZm9ybS5EaXNwbGF5TGluZTtcclxuXHJcbiAgICBsZXQgc2ltdWxhdGU6IGJvb2xlYW4gPSBjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0NIRUNLQk9YIHx8IGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfTElTVCB8fCBjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1JBRElPIHx8IGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQlVUVE9OIHx8IChjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1RBQiAmJiAhZXZ0LmlzUHJvZHVjZUNsaWNrKCkpO1xyXG4gICAgaWYgKHNpbXVsYXRlKVxyXG4gICAgICBhd2FpdCB0aGlzLnNpbXVsYXRlU2VsZWN0aW9uKGN0cmwsIGV2dC5nZXRWYWx1ZSgpLCBkaXNwbGF5TGluZSwgZXZ0LmlzUHJvZHVjZUNsaWNrKCkpO1xyXG4gICAgZWxzZVxyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZVNlbGVjdGlvbihjdHJsLCBkaXNwbGF5TGluZSwgZXZ0LmdldFZhbHVlKCkpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBIYW5kbGUgdGhlIE1HX0FDVF9TVUJGT1JNX0NMT1NFXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZvcm1cIj5cclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImV2dFwiPlxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgb25TdWJmb3JtQ2xvc2UodGFzazogVGFzaywgZXZ0OiBSdW5UaW1lRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcclxuXHJcbiAgICBpZiAoKGV2dC5nZXRBcmdMaXN0KCkgIT0gbnVsbCkgJiYgKGV2dC5nZXRBcmdMaXN0KCkuZ2V0U2l6ZSgpID09PSAxKSkge1xyXG4gICAgICBsZXQgc3ViZm9ybUN0cmw6IE1nQ29udHJvbCA9IG51bGw7XHJcbiAgICAgIGxldCBjbG9zaW5nU3ViZm9ybU5hbWU6IHN0cmluZyA9IGF3YWl0IGV2dC5nZXRBcmdMaXN0KCkuZ2V0QXJnVmFsdWUoMCwgU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQSwgMCk7XHJcblxyXG4gICAgICAvLyBRQ1IgIzI4MzExNC4gQXJndW1lbnQgb2YgJ1N1YmZvcm0gcmVmcmVzaCBldmVudCcgY2FuIGJlIHNraXBwZWQgb3Igbm90IGV4aXN0LlxyXG4gICAgICBpZiAoY2xvc2luZ1N1YmZvcm1OYW1lID09IG51bGwpXHJcbiAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgLy8gUlMgbXVzdCBiZSBleGVjdXRlZCBvbmx5IGlmIHRoZSBjdXJyZW50IHN1YmZvcm0gaXMgcmVmcmVzaGVkLlxyXG4gICAgICAvLyBJZiBpdHMgYnJvdGhlciBpcyByZWZyZXNoZWQgd2UgZG8gbm90IG5lZWQgdG8gZXhlY3V0ZSBSUyBvZiB0aGUgY3VycmVudCB0YXNrLlxyXG4gICAgICBmb3IgKGxldCBwYXJlbnRUYXNrOiBUYXNrID0gdGFzazsgcGFyZW50VGFzay5nZXRGb3JtKCkgIT0gbnVsbCAmJiBwYXJlbnRUYXNrLmdldE1nZElEKCkgPT09IHRhc2suZ2V0TWdkSUQoKTsgcGFyZW50VGFzayA9IDxUYXNrPnBhcmVudFRhc2suZ2V0UGFyZW50KCkpIHtcclxuICAgICAgICBzdWJmb3JtQ3RybCA9IDxNZ0NvbnRyb2w+cGFyZW50VGFzay5nZXRGb3JtKCkuZ2V0Q3RybEJ5TmFtZShjbG9zaW5nU3ViZm9ybU5hbWUudHJpbSgpLCBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9TVUJGT1JNKTtcclxuICAgICAgICBpZiAoc3ViZm9ybUN0cmwgIT0gbnVsbCkge1xyXG4gICAgICAgICAgbGV0IHN1YmZvcm1UYXNrOiBUYXNrID0gPFRhc2s+c3ViZm9ybUN0cmwuZ2V0U3ViZm9ybVRhc2soKTtcclxuICAgICAgICAgIC8vIElmIHRoZSBzdWJmb3JtIHRhc2sgd2FzIG5vdCBvcGVuZWQgeWV0LCBidXQgc3ViZm9ybSByZWZyZXNoIGlzIGRvbmUsXHJcbiAgICAgICAgICAvLyBpdCdzIG5lZWRlZCB0byBvcGVuIHRoZSBzdWJmb3JtLiBRQ1IgIzQxNTkxNC5cclxuICAgICAgICAgIGlmIChzdWJmb3JtVGFzayAhPSBudWxsICYmICFzdWJmb3JtVGFzay5Jc1JvdXRlKCkpIHtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMucGVyZm9ybVN1YmZvcm1DbG9zZShzdWJmb3JtQ3RybCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcGVyZm9ybVN1YmZvcm1DbG9zZSgpICAgOiBDbG9zZXMgdGhlIHN1YmZvcm0gdGFzayBvcGVuZWQgaW4gdGhlIHN1YmZvcm1DdHJsXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInN1YmZvcm1DdHJsXCI+XHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgcHVibGljIGFzeW5jIHBlcmZvcm1TdWJmb3JtQ2xvc2Uoc3ViZm9ybUN0cmw6IE1nQ29udHJvbCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHN1YmZvcm1UYXNrOiBUYXNrID0gPFRhc2s+c3ViZm9ybUN0cmwuZ2V0U3ViZm9ybVRhc2soKTtcclxuICAgIGxldCBwYXJlbnRUYXNrOiBUYXNrID0gPFRhc2s+c3ViZm9ybUN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKTtcclxuXHJcbiAgICBsZXQgbWdkOiBNR0RhdGEgPSBzdWJmb3JtVGFzay5nZXRNR0RhdGEoKTtcclxuICAgIHRoaXMucHVzaE5ld0V4ZWNTdGFja3MoKTtcclxuICAgIGF3YWl0IHN1YmZvcm1UYXNrLmVuZFRhc2sodHJ1ZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTtcclxuICAgIHRoaXMucG9wTmV3RXhlY1N0YWNrcygpO1xyXG4gICAgaWYgKCF0aGlzLl9zdG9wRXhlY3V0aW9uKSB7XHJcbiAgICAgIHBhcmVudFRhc2suVGFza1NlcnZpY2UuUmVtb3ZlUmVjb21wdXRlcyhwYXJlbnRUYXNrKTtcclxuICAgICAgYXdhaXQgc3ViZm9ybVRhc2suc3RvcCgpO1xyXG5cclxuICAgICAgc3ViZm9ybUN0cmwucmVzZXRTdWJmb3JtVGFzaygpO1xyXG4gICAgICBhd2FpdCBDb21tYW5kc1Byb2Nlc3Nvck1hbmFnZXIuR2V0Q29tbWFuZHNQcm9jZXNzb3IoKS5FeGVjdXRlKENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZW5kaW5nSW5zdHJ1Y3Rpb24uVEFTS1NfQU5EX0NPTU1BTkRTKTtcclxuICAgICAgQ29tbWFuZHMuYWRkQ2xvc2VzdWJmb3JtKENvbW1hbmRUeXBlLkNMT1NFX1NVQl9GT1JNLCBzdWJmb3JtQ3RybCwgc3ViZm9ybVRhc2suZ2V0VGFza1RhZygpLCAoPE1nQ29udHJvbEJhc2U+c3ViZm9ybUN0cmwpLmdldE5hbWUoKSwgc3ViZm9ybVRhc2suZ2V0Rm9ybSgpLmJ1aWxkRm9ybU5hbWUoKSk7XHJcblxyXG4gICAgICAvLyBTZXQgbWdkLmFib3J0KCksIGluIG9yZGVyIHRvIGNsb3NlIGN1cnJlbnQgZXZlbnQgbG9vcCBvZiBNb2RhbCBzdWJmb3JtLlxyXG4gICAgICAvLyBhbmQgcmVzZXQgaXQgYmFjayB0byBmYWxzZSBvbmNlIGl0IGNvbWVzIG91dCBvZiBjdXJyZW50IGV2ZW50c2xvb3AoKS5cclxuICAgICAgaWYgKCg8TWdDb250cm9sQmFzZT5zdWJmb3JtQ3RybCkuSXNNb2RhbCgpKVxyXG4gICAgICAgIG1nZC5hYm9ydCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2FsY3VsYXRlIGFyZ3VtZW50cyBmb3IgZXZlbnRzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImV2dFwiPiA8L3BhcmFtPlxyXG4gIHByaXZhdGUgY3JlYXRlRXZlbnRBcmd1bWVudHMoZXZ0OiBSdW5UaW1lRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmIChldnQuZ2V0QXJnTGlzdCgpID09PSBudWxsKSB7XHJcbiAgICAgIGlmIChldnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0lOVEVSTkFMKSB7XHJcbiAgICAgICAgc3dpdGNoIChldnQuZ2V0SW50ZXJuYWxDb2RlKCkpIHtcclxuICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidGFza1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZG9TdWZmaXhcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgYXN5bmMgRG9UYXNrTGV2ZWxSZWNvcmRTdWZmaXgodGFzazogVGFza0Jhc2UsIHJlZkRvU3VmZml4OiBSZWZQYXJhbTxib29sZWFuPik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IHNob3VsZFJldHVybjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgaWYgKHRhc2suZ2V0TGV2ZWwoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfUkVDT1JEKSB7XHJcbiAgICAgIHJlZkRvU3VmZml4LnZhbHVlID0gZmFsc2U7XHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKTtcclxuICAgICAgaWYgKHRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSlcclxuICAgICAgICBzaG91bGRSZXR1cm4gPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBzaG91bGRSZXR1cm47XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0YXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJmb3JtXCI+PC9wYXJhbT5cclxuICBhc3luYyBEb1Rhc2tMZXZlbFJlY29yZFByZWZpeCh0YXNrOiBUYXNrQmFzZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKCF0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpIHtcclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGRvIHRoZSBtYWdpYyBkZWZhdWx0IG9wZXJhdGlvbnMgYWNjb3JkaW5nIHRvIHRoZSBpbnRlcm5hbCBldmVudCBjb2RlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImV2dFwiPnRoZSBldmVudCB0byBoYW5kbGUgPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRlbGxzIHRoZSBjYWxsZXIgd2hldGhlciB0byBjb250aW51ZSBoYW5kbGluZyB0aGUgZXZlbnQgPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgYXN5bmMgY29tbW9uSGFuZGxlcihldnQ6IFJ1blRpbWVFdmVudCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHRhc2s6IFRhc2sgPSA8VGFzaz5ldnQuZ2V0VGFzaygpO1xyXG4gICAgbGV0IG1nRGF0YTogTUdEYXRhID0gdGFzay5nZXRNR0RhdGEoKTtcclxuICAgIGxldCBmb3JtOiBNZ0Zvcm0gPSA8TWdGb3JtPnRhc2suZ2V0Rm9ybSgpO1xyXG4gICAgbGV0IGN0cmw6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+ZXZ0LkNvbnRyb2w7XHJcbiAgICBsZXQgbGFzdFBhcmtlZEN0cmw6IE1nQ29udHJvbDtcclxuICAgIGxldCBkb1N1ZmZpeDogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBsZXQgb2xkTW9kZTogc3RyaW5nO1xyXG4gICAgbGV0IHNlcnZlcjogQ29tbWFuZHNQcm9jZXNzb3JCYXNlID0gVGFzay5Db21tYW5kc1Byb2Nlc3NvcjtcclxuXHJcbiAgICBpZiAodGhpcy5fc3RvcEV4ZWN1dGlvbilcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIC8vIGlmIHRoaXMgaXMgYSB1c2VyIGV2ZW50IHRoYXQgY29udmVydHMgdG8gYSBzeXN0ZW0gb3IgaW50ZXJuYWwgZXZlbiwgY29udmVydCBpdFxyXG4gICAgaWYgKGV2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfVVNFUilcclxuICAgICAgZXZ0ID0gbmV3IFJ1blRpbWVFdmVudChldnQuZ2V0VXNlckV2ZW50KCksIGV2dCk7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5wdXNoUnRFdmVudChldnQpO1xyXG5cclxuICAgICAgaWYgKGV2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfU1lTVEVNKSB7XHJcbiAgICAgICAgbGV0IGFjdElkOiBudW1iZXIgPSB0aGlzLmdldE1hdGNoaW5nQWN0aW9uKGV2dC5nZXRLYmRJdG0oKSk7XHJcbiAgICAgICAgaWYgKGFjdElkICE9PSAwKVxyXG4gICAgICAgIC8vIGhhbmRsZWQgaW50ZXJuYWxseVxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGV2dCA9IG5ldyBSdW5UaW1lRXZlbnQoZXZ0LCBldnQpO1xyXG4gICAgICAgICAgZXZ0LnNldEludGVybmFsKGFjdElkKTtcclxuICAgICAgICAgIGV2dC5zZXRBcmdMaXN0KG51bGwpO1xyXG4gICAgICAgIH1cclxuICAgICAgfS8vIGVuZCBvZiBzeXN0ZW0gZXZlbnRzIHByb2Nlc3NpbmdcclxuXHJcbiAgICAgIC8vIGV4ZWN1dGUgdGhlIGNvbW1vbiBoYW5kbGluZyBvZiBpbnRlcm5hbCBldmVudHMgb25seSBpZiB0aGV5IGFyZSBub3QgaW1tZWRpYXRlLlxyXG4gICAgICAvLyBhbiBldmVudCBpcyBpbW1lZGlhdGUgd2hlbiBpdCB3YXMgcmFpc2VkIGJ5IGEgcmFpc2UgZXZlbnQgb3BlcmF0aW9uIHRoYXQgaXRzXHJcbiAgICAgIC8vIHdhaXQgY29uZGl0aW9uIGlzIHllcyBvciBldmFsdWF0ZXMgdG8gdHJ1ZS5cclxuICAgICAgbGV0IGNtZDogSUNsaWVudENvbW1hbmQ7XHJcbiAgICAgIGlmIChldnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0lOVEVSTkFMICYmICFldnQuaXNJbW1lZGlhdGUoKSAmJiB0aGlzLkFjdEFsbG93ZWQoZXZ0LmdldEludGVybmFsQ29kZSgpKSAmJiAhdGhpcy5fcHJvY2Vzc2luZ1RvcE1vc3RFbmRUYXNrKSB7XHJcbiAgICAgICAgbGV0IGNtZHNUb1NlcnZlcjogQ29tbWFuZHNUYWJsZSA9IDxDb21tYW5kc1RhYmxlPm1nRGF0YS5DbWRzVG9TZXJ2ZXI7XHJcbiAgICAgICAgbGV0IGR2OiBEYXRhVmlldyA9IDxEYXRhVmlldz50YXNrLkRhdGFWaWV3O1xyXG4gICAgICAgIGxldCByZWM6IFJlY29yZCA9IGR2LmdldEN1cnJSZWMoKTtcclxuXHJcbiAgICAgICAgbGV0IGludEV2dENvZGU6IG51bWJlciA9IGV2dC5nZXRJbnRlcm5hbENvZGUoKTtcclxuXHJcbiAgICAgICAgLy8gZm9yIGludGVybmFsIGV2ZW50c1xyXG4gICAgICAgIHN3aXRjaCAoaW50RXZ0Q29kZSkge1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1NVQkZPUk1fQ0xPU0U6XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMub25TdWJmb3JtQ2xvc2UodGFzaywgZXZ0KTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0JVVFRPTjpcclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfSElUOlxyXG4gICAgICAgICAgICAvLyBpZiBidXR0b24gaXMgbm90IHBhcmthYmxlLCByYWlzZSBpdHMgZXZlbnQgb25seSBpZiB0aGUgYWN0aW9uIHdhcyBub3QgdHJpZ2dlcmVkIGJ5IGd1aS5cclxuICAgICAgICAgICAgLy8gZGlyZWN0IGNsaWNrIG9uIHRoZSBidXR0b24gd2lsbCBnZXQgaGVyZSBhcyBjdHJsIGhpdCAsIGJ1dCBpcyBub3QgdHJpZ2dlcmVkIGJ5IGd1aSAoZ29lcyB2aWEgc2VsZWN0aW9uIGV2ZW50IDFzdClcclxuICAgICAgICAgICAgLy8gb3RoZXIgY3RybF9oaXQgYWN0aW9ucyBzaG91bGQgY29uc2lkZXIgdGhlIHBhcmthYmlsaXR5XHJcbiAgICAgICAgICAgIGlmIChjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0JVVFRPTiAmJlxyXG4gICAgICAgICAgICAgIChpbnRFdnRDb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQlVUVE9OIHx8ICFldnQuaXNHdWlUcmlnZ2VyZWRFdmVudCgpIHx8IGN0cmwuaXNQYXJrYWJsZSh0cnVlKSkpIHtcclxuICAgICAgICAgICAgICBsZXQgYVJ0RXZ0ID0gbmV3IFJ1blRpbWVFdmVudChjdHJsKTtcclxuICAgICAgICAgICAgICBpZiAoY3RybC5nZXRSdEV2dFRhc2soKSAhPSBudWxsKVxyXG4gICAgICAgICAgICAgICAgYVJ0RXZ0LnNldFRhc2soY3RybC5nZXRSdEV2dFRhc2soKSk7XHJcbiAgICAgICAgICAgICAgaWYgKENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfTk9ORSAhPT0gYVJ0RXZ0LmdldFR5cGUoKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGN0cmwudXNlWm9vbUhhbmRsZXIoKSkge1xyXG4gICAgICAgICAgICAgICAgICBsZXQgdGFza1RvRW5hYmxlOiBUYXNrID0gPFRhc2s+YVJ0RXZ0LmdldFRhc2soKTtcclxuICAgICAgICAgICAgICAgICAgaWYgKHRhc2tUb0VuYWJsZSAhPSBudWxsKVxyXG4gICAgICAgICAgICAgICAgICAgIHRhc2tUb0VuYWJsZS5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfWk9PTSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBhUnRFdnQuc2V0QXJnTGlzdChjdHJsLkFyZ0xpc3QpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgYVJ0RXZ0LnNldFB1YmxpY05hbWUoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWRkVG9UYWlsKGFSdEV2dCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrQW5kU2F2ZVJvdXRlRXZlbnRJZkN0eFJlbW92ZWRGcm9tU3J2cihhUnRFdnQpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIGlmIChjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1RBQikge1xyXG4gICAgICAgICAgICAgIC8vIEZpeGVkIGJ1ZyAjNzI0MTUwOiBhcyB3ZSBkb2luZyBmb3Igb25saW5lIGZvciB0YWIgY29udHJvbCB3ZSBzZW5kIEFDVF9aT09NIChDaG9pY2VpbnAuY3BwIDo6RGl0R2V0KCkpXHJcbiAgICAgICAgICAgICAgdGhpcy5hZGRJbnRlcm5hbEV2ZW50V2l0aEN0cmxBbmRDb2RlKGN0cmwsIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9aT09NKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1JBRElPKSB7XHJcbiAgICAgICAgICAgICAgY3RybC5zZXRDb250cm9sVG9Gb2N1cygpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UT0dHTEVfSU5TRVJUOlxyXG4gICAgICAgICAgICBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuVG9nZ2xlSW5zZXJ0TW9kZSgpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DTE9TRTpcclxuICAgICAgICAgICAgbGV0IHJ0RXZ0ID0gbmV3IFJ1blRpbWVFdmVudChldnQsIGV2dCk7XHJcbiAgICAgICAgICAgIHJ0RXZ0LnNldEludGVybmFsKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FWElUKTtcclxuICAgICAgICAgICAgdGhpcy5hZGRUb1RhaWwocnRFdnQpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FWElUOlxyXG4gICAgICAgICAgICAvLyBpZiAnZXhpdCcgYWNjZXB0ZWQgb24gTURJLCBleGl0IHRoZSB0b3AgbW9zdCB0YXNrLiBzYW1lIGFzIHdoZW4gZXhpdGluZyB0aGUgc3lzdGVtLlxyXG4gICAgICAgICAgICBsZXQgdGFza1RvRW5kOiBUYXNrID0gKHRhc2suaXNNYWluUHJvZygpID8gTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5TdGFydHVwTWdEYXRhLmdldEZpcnN0VGFzaygpIDogdGFzayk7XHJcbiAgICAgICAgICAgIGF3YWl0IHRhc2tUb0VuZC5lbmRUYXNrKGV2dC5yZXZlcnNpYmxlRXhpdCgpLCBmYWxzZSwgZXZ0LkV4aXREdWVUb0Vycm9yKCkpO1xyXG5cclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRVhJVF9TWVNURU06XHJcbiAgICAgICAgICAgIC8vIGVuZCB0aGUgdG9wIG1vc3QgdGFzayB3aXRoIGZvcm0uXHJcbiAgICAgICAgICAgIGF3YWl0IE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuU3RhcnR1cE1nRGF0YS5nZXRGaXJzdFRhc2soKS5lbmRUYXNrKGV2dC5yZXZlcnNpYmxlRXhpdCgpLCBmYWxzZSxcclxuICAgICAgICAgICAgICBmYWxzZSk7XHJcbiAgICAgICAgICAgIC8vIEdldFRvcE1vc3RUYXNrV2l0aEZvcm0odGFzaykuZW5kVGFzayhldnQucmV2ZXJzaWJsZUV4aXQoKSwgZmFsc2UsIGZhbHNlKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX05YVExJTkU6XHJcbiAgICAgICAgICAgIGlmIChmb3JtICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgYXdhaXQgZm9ybS5tb3ZlSW5WaWV3KENvbnN0YW50cy5NT1ZFX1VOSVRfUk9XLCBDb25zdGFudHMuTU9WRV9ESVJFQ1RJT05fTkVYVCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9QUlZMSU5FOlxyXG4gICAgICAgICAgICBpZiAoZm9ybSAhPSBudWxsKVxyXG4gICAgICAgICAgICAgIGF3YWl0IGZvcm0ubW92ZUluVmlldyhDb25zdGFudHMuTU9WRV9VTklUX1JPVywgQ29uc3RhbnRzLk1PVkVfRElSRUNUSU9OX1BSRVYpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfTlhUUEFHRTpcclxuICAgICAgICAgICAgaWYgKGZvcm0gIT0gbnVsbClcclxuICAgICAgICAgICAgICBhd2FpdCBmb3JtLm1vdmVJblZpZXcoQ29uc3RhbnRzLk1PVkVfVU5JVF9QQUdFLCBDb25zdGFudHMuTU9WRV9ESVJFQ1RJT05fTkVYVCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9QUlZQQUdFOlxyXG4gICAgICAgICAgICBpZiAoZm9ybSAhPSBudWxsKVxyXG4gICAgICAgICAgICAgIGF3YWl0IGZvcm0ubW92ZUluVmlldyhDb25zdGFudHMuTU9WRV9VTklUX1BBR0UsIENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9QUkVWKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX0JFR1BBR0U6XHJcbiAgICAgICAgICAgIGlmIChmb3JtICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgYXdhaXQgZm9ybS5tb3ZlSW5WaWV3KENvbnN0YW50cy5NT1ZFX1VOSVRfUEFHRSwgQ29uc3RhbnRzLk1PVkVfRElSRUNUSU9OX0JFR0lOKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX0VORFBBR0U6XHJcbiAgICAgICAgICAgIGlmIChmb3JtICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgYXdhaXQgZm9ybS5tb3ZlSW5WaWV3KENvbnN0YW50cy5NT1ZFX1VOSVRfUEFHRSwgQ29uc3RhbnRzLk1PVkVfRElSRUNUSU9OX0VORCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9CRUdUQkw6XHJcbiAgICAgICAgICAgIC8vICM5MTg1ODg6IElmIGN0cmwraG9tZS9jdHJsK2VuZCBwcmVzc2VkIHdoZW4gcGFya2VkIG9uIGxpc3Rib3hcclxuICAgICAgICAgICAgLy8gdGhlbiBCZWdpbiB0YWJsZSBldmVudCBzaG91bGQgbm90IGJlIGhhbmRsZWQuXHJcbiAgICAgICAgICAgIGxhc3RQYXJrZWRDdHJsID0gPE1nQ29udHJvbD50YXNrLmdldExhc3RQYXJrZWRDdHJsKCk7XHJcbiAgICAgICAgICAgIGlmIChsYXN0UGFya2VkQ3RybCA9PSBudWxsIHx8ICFsYXN0UGFya2VkQ3RybC5pc0xpc3RCb3goKSkge1xyXG4gICAgICAgICAgICAgIGlmIChmb3JtICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgICBhd2FpdCBmb3JtLm1vdmVJblZpZXcoQ29uc3RhbnRzLk1PVkVfVU5JVF9UQUJMRSwgQ29uc3RhbnRzLk1PVkVfRElSRUNUSU9OX0JFR0lOKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfRU5EVEJMOlxyXG4gICAgICAgICAgICAvLyAjOTE4NTg4OiBJZiBjdHJsK2hvbWUvY3RybCtlbmQgcHJlc3NlZCB3aGVuIHBhcmtlZCBvbiBsaXN0Ym94XHJcbiAgICAgICAgICAgIC8vIHRoZW4gQmVnaW4gdGFibGUgZXZlbnQgc2hvdWxkIG5vdCBiZSBoYW5kbGVkLlxyXG4gICAgICAgICAgICBsYXN0UGFya2VkQ3RybCA9IDxNZ0NvbnRyb2w+dGFzay5nZXRMYXN0UGFya2VkQ3RybCgpO1xyXG4gICAgICAgICAgICBpZiAobGFzdFBhcmtlZEN0cmwgPT09IG51bGwgfHwgIWxhc3RQYXJrZWRDdHJsLmlzTGlzdEJveCgpKSB7XHJcbiAgICAgICAgICAgICAgaWYgKGZvcm0gIT0gbnVsbClcclxuICAgICAgICAgICAgICAgIGF3YWl0IGZvcm0ubW92ZUluVmlldyhDb25zdGFudHMuTU9WRV9VTklUX1RBQkxFLCBDb25zdGFudHMuTU9WRV9ESVJFQ1RJT05fRU5EKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9XRUJfT05fREJMSUNLOiB7XHJcbiAgICAgICAgICAgIC8vIFVubGlrZSBPbmxpbmUsIGhlcmUgU0VMRUNUIG9yIFpPT00gY29tZXMgYWZ0ZXIgdGhlIERCQ0xJQ0suXHJcbiAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGEgREJDTElDSyBoYW5kbGVyIHdpdGggcHJvcG9nYXRlID0gJ05PJyAsIHRoZXNlIGFjdGlvbnMgd2lsbCBub3QgYmUgcmFpc2VkLlxyXG4gICAgICAgICAgICBsZXQgY3RybFR5cGU6IE1nQ29udHJvbFR5cGUgPSBjdHJsLlR5cGU7XHJcbiAgICAgICAgICAgIGxldCBwdXRBY3Rpb246IG51bWJlciA9IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9OT05FO1xyXG4gICAgICAgICAgICBpZiAoY3RybFR5cGUgIT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1RBQkxFICYmIGN0cmxUeXBlICE9PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9MQUJFTCAmJlxyXG4gICAgICAgICAgICAgIGN0cmxUeXBlICE9PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9JTUFHRSkge1xyXG4gICAgICAgICAgICAgIGlmIChjdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkuQWN0aW9uTWFuYWdlci5pc0VuYWJsZWQoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1NFTEVDVCkpXHJcbiAgICAgICAgICAgICAgICBwdXRBY3Rpb24gPSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfU0VMRUNUO1xyXG4gICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKGN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKS5BY3Rpb25NYW5hZ2VyLmlzRW5hYmxlZChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfWk9PTSkpXHJcbiAgICAgICAgICAgICAgICAgIHB1dEFjdGlvbiA9IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9aT09NO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgaWYgKHB1dEFjdGlvbiAhPT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX05PTkUpXHJcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEludGVybmFsRXZlbnRXaXRoQ3RybEFuZENvZGUoY3RybCwgcHV0QWN0aW9uKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9ERUxMSU5FOlxyXG4gICAgICAgICAgICBpZiAoYXdhaXQgdGhpcy5IYW5kbGVBY3Rpb25EZWxsaW5lKHRhc2ssIGR2LCByZWMsIGZhbHNlKSlcclxuICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NSRUxJTkU6XHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DUkVMSU5FX0FCT1ZFOlxyXG4gICAgICAgICAgICBpZiAodGFzay5EYXRhVmlldy5pc0VtcHR5RGF0YXZpZXcoKSkge1xyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuZ290b0NyZWF0ZU1vZGUodGFzayk7XHJcblxyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0YXNrLmdldEluQ3JlYXRlTGluZSgpKVxyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgdGFzay5zZXRJbkNyZWF0ZUxpbmUodHJ1ZSk7XHJcblxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgIGlmICh0YXNrLmdldExldmVsKCkgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX0NPTlRST0wpIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhNZ0NvbnRyb2xCYXNlKHRhc2suZ2V0TGFzdFBhcmtlZEN0cmwoKSwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfU1VGRklYKTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpXHJcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIC8vIHZlcmlmeSB0aGF0IHRoZSBjdXJyZW50IHJlY29yZCBpcyBub3QgYWxyZWFkeSBhIG5ldyBvbmVcclxuICAgICAgICAgICAgICBpZiAodGFzay5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFICYmIHJlYyAhPSBudWxsICYmICFyZWMuTW9kaWZpZWQpIHtcclxuICAgICAgICAgICAgICAgIGlmIChhd2FpdCB0YXNrLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9GT1JDRV9TVUZGSVgsIGZhbHNlKSkge1xyXG4gICAgICAgICAgICAgICAgICBkb1N1ZmZpeCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcbiAgICAgICAgICAgICAgICAgIGlmICh0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkgfHwgdGFzay5pc0Fib3J0aW5nKCkpXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgdGFzay5zZXRMZXZlbChDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKTtcclxuICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkgJiYgZm9ybSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gRGVmZWN0IDE1MjM1NTogUGFyayBvbiBsYXN0UGFya2VkQ29udHJvbCBpZiBuZXh0U2NyZWVuIGV2ZW50IG9jY3VycyBpZiBhbHJlYWR5IGluIGNyZWF0ZSBtb2RlIGFuZCByZWNvcmQgbm90IG1vZGlmaWVkXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhc3RQYXJrZWRDb250cm9sOiBNZ0NvbnRyb2wgPSA8TWdDb250cm9sPnRhc2suZ2V0TGFzdFBhcmtlZEN0cmwoKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAobGFzdFBhcmtlZENvbnRyb2wgIT09IG51bGwpXHJcbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBsYXN0UGFya2VkQ29udHJvbC5pbnZva2UoKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGxldCByZWZEb1N1ZmZpeDogUmVmUGFyYW08Ym9vbGVhbj4gPSBuZXcgUmVmUGFyYW0oZG9TdWZmaXgpO1xyXG4gICAgICAgICAgICAgIGlmIChhd2FpdCB0aGlzLkRvVGFza0xldmVsUmVjb3JkU3VmZml4KHRhc2ssIHJlZkRvU3VmZml4KSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICBkb1N1ZmZpeCA9IHJlZkRvU3VmZml4LnZhbHVlO1xyXG5cclxuICAgICAgICAgICAgICBpZiAoZm9ybSAhPSBudWxsKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKCh0YXNrLmdldE1vZGUoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpIHx8ICF0YXNrLkNvbmZpcm1VcGRhdGVObylcclxuICAgICAgICAgICAgICAgICAgYXdhaXQgZm9ybS5hZGRSZWMoZG9TdWZmaXgsIGludEV2dENvZGUgPT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NSRUxJTkVfQUJPVkUgPyB0cnVlIDogZmFsc2UpO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5Eb1Rhc2tMZXZlbFJlY29yZFByZWZpeCh0YXNrKTtcclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLkhhbmRsZUFjdEVudGVyUm93RWRpdGluZyh0YXNrKTtcclxuXHJcbiAgICAgICAgICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgICAgICAgdGFzay5zZXRJbkNyZWF0ZUxpbmUoZmFsc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NBTkNFTDpcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5IYW5kbGVBY3RDYW5jZWwoZXZ0LCB0YXNrLCBmb3JtLCBjdHJsLCByZWMsIHRydWUpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FTlRFUl9ST1dfRURJVElORzpcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5IYW5kbGVBY3RFbnRlclJvd0VkaXRpbmcodGFzayk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1FVSVQ6XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9RVUlUKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRPX0NSRUFURTpcclxuICAgICAgICAgICAgaWYgKHRhc2suZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSB8fFxyXG4gICAgICAgICAgICAgIGF3YWl0ICh0YXNrLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfT1BUSU9OKSkuZ2V0VmFsdWVCb29sZWFuKCkpIHtcclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLmdvdG9DcmVhdGVNb2RlKHRhc2spO1xyXG5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVE9fUVVFUlk6XHJcbiAgICAgICAgICAgIGlmICh0YXNrLmdldE1vZGUoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9RVUVSWSAmJlxyXG4gICAgICAgICAgICAgIChhd2FpdCAodGFzay5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX09QVElPTikpLmdldFZhbHVlQm9vbGVhbigpKSA9PT0gZmFsc2UpXHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGF3YWl0IHRhc2suZW5hYmxlTW9kZXMoKTtcclxuICAgICAgICAgICAgb2xkTW9kZSA9IHRhc2suZ2V0T3JpZ2luYWxUYXNrTW9kZSgpO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKSB7XHJcbiAgICAgICAgICAgICAgdGFzay5zZXRNb2RlKENvbnN0YW50cy5UQVNLX01PREVfUVVFUlkpO1xyXG4gICAgICAgICAgICAgIGlmIChvbGRNb2RlICE9PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgZHYuY3VyclJlY0NvbXB1dGUodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoY3RybCAhPSBudWxsKVxyXG4gICAgICAgICAgICAgICAgICBhd2FpdCBjdHJsLmludm9rZSgpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgZm9ybS5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0NVUlJfUkVDKTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gd2UgYWxyZWFkeSBleGVjdXRlZCByZWNvcmQgc3VmZml4IC0gc28gd2UgbmVlZCB0byBwcmV2ZW50IHRoZSB2aWV3IHJlZnJlc2hcclxuICAgICAgICAgICAgICAgIC8vIGZyb20gZXhlY3V0aW5nIGl0IGFnYWluXHJcbiAgICAgICAgICAgICAgICB0YXNrLnNldFByZXZlbnRSZWNvcmRTdWZmaXgodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICB0YXNrLnNldFByZXZlbnRDb250cm9sQ2hhbmdlKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1JFRlJFU0hfVklFVyk7XHJcbiAgICAgICAgICAgICAgICBpZiAoY3RybCAhPSBudWxsKVxyXG4gICAgICAgICAgICAgICAgICBhd2FpdCBjdHJsLmludm9rZSgpO1xyXG4gICAgICAgICAgICAgICAgdGFzay5zZXRQcmV2ZW50UmVjb3JkU3VmZml4KGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIHRhc2suc2V0UHJldmVudENvbnRyb2xDaGFuZ2UoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFkdi5pc0VtcHR5KCkgJiYgKGR2LmdldEN1cnJSZWMoKSkuZ2V0TW9kZSgpICE9PSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuSW5zZXJ0KVxyXG4gICAgICAgICAgICAgICAgICB0YXNrLnNldE1vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9RVUVSWSk7XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgIHRhc2suc2V0TW9kZShDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBmb3JtLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfQ1VSUl9SRUMpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB0YXNrLnNldE9yaWdpbmFsVGFza01vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9RVUVSWSk7XHJcbiAgICAgICAgICAgICAgYXdhaXQgdGFzay5zZXRDcmVhdGVEZWxldGVBY3RzRW5hYmxlU3RhdGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVE9fTU9ESUZZOlxyXG4gICAgICAgICAgICBpZiAodGFzay5nZXRNb2RlKCkgIT09IENvbnN0YW50cy5UQVNLX01PREVfTU9ESUZZICYmXHJcbiAgICAgICAgICAgICAgKGF3YWl0ICh0YXNrLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfT1BUSU9OKSkuZ2V0VmFsdWVCb29sZWFuKCkpID09PSBmYWxzZSlcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgYXdhaXQgdGFzay5lbmFibGVNb2RlcygpO1xyXG4gICAgICAgICAgICBvbGRNb2RlID0gdGFzay5nZXRPcmlnaW5hbFRhc2tNb2RlKCk7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKTtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpIHtcclxuICAgICAgICAgICAgICB0YXNrLnNldE1vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9NT0RJRlkpO1xyXG5cclxuICAgICAgICAgICAgICBpZiAob2xkTW9kZSAhPT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGR2LmN1cnJSZWNDb21wdXRlKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGN0cmwgIT0gbnVsbClcclxuICAgICAgICAgICAgICAgICAgYXdhaXQgY3RybC5pbnZva2UoKTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gd2UgYWxyZWFkeSBleGVjdXRlZCByZWNvcmQgc3VmZml4IC0gc28gd2UgbmVlZCB0byBwcmV2ZW50IHRoZSB2aWV3IHJlZnJlc2hcclxuICAgICAgICAgICAgICAgIC8vIGZyb20gZXhlY3V0aW5nIGl0IGFnYWluXHJcbiAgICAgICAgICAgICAgICB0YXNrLnNldFByZXZlbnRSZWNvcmRTdWZmaXgodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICB0YXNrLnNldFByZXZlbnRDb250cm9sQ2hhbmdlKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1JFRlJFU0hfVklFVyk7XHJcbiAgICAgICAgICAgICAgICBpZiAoY3RybCAhPSBudWxsKVxyXG4gICAgICAgICAgICAgICAgICBhd2FpdCBjdHJsLmludm9rZSgpO1xyXG4gICAgICAgICAgICAgICAgdGFzay5zZXRQcmV2ZW50UmVjb3JkU3VmZml4KGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIHRhc2suc2V0UHJldmVudENvbnRyb2xDaGFuZ2UoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFkdi5pc0VtcHR5KCkgJiYgKGR2LmdldEN1cnJSZWMoKSkuZ2V0TW9kZSgpICE9PSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuSW5zZXJ0KVxyXG4gICAgICAgICAgICAgICAgICB0YXNrLnNldE1vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9NT0RJRlkpO1xyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICB0YXNrLnNldE1vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgZm9ybS5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0NVUlJfUkVDKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgdGFzay5zZXRPcmlnaW5hbFRhc2tNb2RlKENvbnN0YW50cy5UQVNLX01PREVfTU9ESUZZKTtcclxuICAgICAgICAgICAgICBhd2FpdCB0YXNrLnNldENyZWF0ZURlbGV0ZUFjdHNFbmFibGVTdGF0ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1NFTEVDVDpcclxuICAgICAgICAgICAgLyogcHJlZm9ybSByZWMgc3VmZml4ICovXHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgdGFzay5JblNlbGVjdCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG4gICAgICAgICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgICAgICAgIHRhc2suSW5TZWxlY3QgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuX3N0b3BFeGVjdXRpb24pIHtcclxuICAgICAgICAgICAgICAvKiBjbG9zZSB0aGUgc2VsZWN0aW9uIHByb2dyYW0gKi9cclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRVhJVCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1NVQkZPUk1fUkVGUkVTSDpcclxuICAgICAgICAgICAgaWYgKChldnQuZ2V0QXJnTGlzdCgpICE9IG51bGwpICYmIChldnQuZ2V0QXJnTGlzdCgpLmdldFNpemUoKSA9PT0gMSkpIHtcclxuICAgICAgICAgICAgICBsZXQgc3ViZm9ybUN0cmw6IE1nQ29udHJvbCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgbGV0IFJlZnJlc2hlZFN1YmZvcm1OYW1lOiBzdHJpbmcgPSBhd2FpdCBldnQuZ2V0QXJnTGlzdCgpLmdldEFyZ1ZhbHVlKDAsIFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEEsIDApO1xyXG5cclxuICAgICAgICAgICAgICAvLyBRQ1IgIzI4MzExNC4gQXJndW1lbnQgb2YgJ1N1YmZvcm0gcmVmcmVzaCBldmVudCcgY2FuIGJlIHNraXBwZWQgb3Igbm90IGV4aXN0LlxyXG4gICAgICAgICAgICAgIGlmIChSZWZyZXNoZWRTdWJmb3JtTmFtZSA9PSBudWxsKVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICAgIC8vIFJTIG11c3QgYmUgZXhlY3V0ZWQgb25seSBpZiB0aGUgY3VycmVudCBzdWJmb3JtIGlzIHJlZnJlc2hlZC5cclxuICAgICAgICAgICAgICAvLyBJZiBpdHMgYnJvdGhlciBpcyByZWZyZXNoZWQgd2UgZG8gbm90IG5lZWQgdG8gZXhlY3V0ZSBSUyBvZiB0aGUgY3VycmVudCB0YXNrLlxyXG4gICAgICAgICAgICAgIGZvciAobGV0IHBhcmVudFRhc2s6IFRhc2sgPSB0YXNrOyBwYXJlbnRUYXNrLmdldEZvcm0oKSAhPSBudWxsICYmIHBhcmVudFRhc2suZ2V0TWdkSUQoKSA9PT0gdGFzay5nZXRNZ2RJRCgpOyBwYXJlbnRUYXNrID0gPFRhc2s+cGFyZW50VGFzay5nZXRQYXJlbnQoKSkge1xyXG4gICAgICAgICAgICAgICAgc3ViZm9ybUN0cmwgPSA8TWdDb250cm9sPnBhcmVudFRhc2suZ2V0Rm9ybSgpLmdldEN0cmxCeU5hbWUoUmVmcmVzaGVkU3ViZm9ybU5hbWUudHJpbSgpLCBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9TVUJGT1JNKTtcclxuICAgICAgICAgICAgICAgIGlmIChzdWJmb3JtQ3RybCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBzdWJmb3JtVGFzazogVGFzayA9IDxUYXNrPnN1YmZvcm1DdHJsLmdldFN1YmZvcm1UYXNrKCk7XHJcbiAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBzdWJmb3JtIHRhc2sgd2FzIG5vdCBvcGVuZWQgeWV0LCBidXQgc3ViZm9ybSByZWZyZXNoIGlzIGRvbmUsXHJcbiAgICAgICAgICAgICAgICAgIC8vIGl0J3MgbmVlZGVkIHRvIG9wZW4gdGhlIHN1YmZvcm0uIFFDUiAjNDE1OTE0LlxyXG4gICAgICAgICAgICAgICAgICBpZiAoc3ViZm9ybVRhc2sgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFFDUiAjMjg3NTYyLiBPcGVuIHRoZSBzdWJmb3JtIHRhc2sgb25seSBpZiB0aGUgc3ViZm9ybSBjb250cm9sIGlzIGNvbm5lY3RlZCB0byB0aGUgdGFzay5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoYXdhaXQgKHN1YmZvcm1DdHJsLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfU1VCRk9STV9UWVBFKSkuZ2V0VmFsdWVJbnQoKSAhPT0gU3ViZm9ybVR5cGUuTm9uZSlcclxuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuT3BlblN1YmZvcm0ocGFyZW50VGFzaywgc3ViZm9ybUN0cmwpO1xyXG4gICAgICAgICAgICAgICAgICB9IGVsc2VcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBwYXJlbnRUYXNrLlN1YmZvcm1SZWZyZXNoKHN1YmZvcm1UYXNrLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIGlmIGl0IGlzIFN1YmZvcm1SZWZyZXNoIHRoYXQgcmV0dXJuZWQgZnJvbSB0aGUgc2VydmVyLCBzbyBzZWFyY2ggdGhlIHRhc2sgYWNjb3JkaW5nIHRvIGl0cyB0YXNrIGlkICh0YWcpXHJcbiAgICAgICAgICAgIGVsc2UgaWYgKChldnQuZ2V0QXJnTGlzdCgpICE9IG51bGwpICYmIChldnQuZ2V0QXJnTGlzdCgpLmdldFNpemUoKSA9PT0gMikpIHtcclxuICAgICAgICAgICAgICBsZXQgc3ViZm9ybVRhc2s6IFRhc2sgPSB0YXNrLCBwYXJlbnRUYXNrO1xyXG4gICAgICAgICAgICAgIGxldCB0YXNrVGFnOiBzdHJpbmcgPSBhd2FpdCBldnQuZ2V0QXJnTGlzdCgpLmdldEFyZ1ZhbHVlKDEsIFN0b3JhZ2VBdHRyaWJ1dGUuTlVNRVJJQywgMCk7XHJcblxyXG4gICAgICAgICAgICAgIHdoaWxlIChzdWJmb3JtVGFzay5Jc1N1YkZvcm0pIHtcclxuICAgICAgICAgICAgICAgIHBhcmVudFRhc2sgPSBzdWJmb3JtVGFzay5nZXRQYXJlbnQoKTtcclxuICAgICAgICAgICAgICAgIGlmIChzdWJmb3JtVGFzay5nZXRUYXNrVGFnKCkgPT09IHRhc2tUYWcpIHtcclxuICAgICAgICAgICAgICAgICAgYXdhaXQgcGFyZW50VGFzay5TdWJmb3JtUmVmcmVzaChzdWJmb3JtVGFzaywgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgc3ViZm9ybVRhc2sgPSBwYXJlbnRUYXNrO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9TVUJGT1JNX09QRU46XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuT3BlblN1YmZvcm0odGFzaywgPE1nQ29udHJvbD5ldnQuQ29udHJvbCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUT19TRUFSQ0g6XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKTtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpIHtcclxuICAgICAgICAgICAgICBjbWQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVFdmVudENvbW1hbmQodGFzay5nZXRUYXNrVGFnKCksIGludEV2dENvZGUpO1xyXG4gICAgICAgICAgICAgIHRhc2suZ2V0VGFza0NhY2hlKCkuY2xlYXJDYWNoZSgpO1xyXG4gICAgICAgICAgICAgIGF3YWl0IHRhc2suRGF0YXZpZXdNYW5hZ2VyLkV4ZWN1dGUoY21kKTtcclxuXHJcbiAgICAgICAgICAgICAgLy8gQWZ0ZXIgdmlldyByZWZyZXNoLCB0aGUgc2VydmVyIGFsd2F5cyByZXR1cm5zIGN1cnIgcmVjIGFzIGZpcnN0IHJlYy5cclxuICAgICAgICAgICAgICBpZiAoIWZvcm0uaXNTY3JlZW5Nb2RlKCkpIHtcclxuICAgICAgICAgICAgICAgIGR2LnNldFRvcFJlY0lkeCgwKTtcclxuICAgICAgICAgICAgICAgIGlmIChmb3JtLkhhc1RhYmxlKCkpIHtcclxuICAgICAgICAgICAgICAgICAgYXdhaXQgZm9ybS5yZXN0b3JlT2xkRGlzcGxheUxpbmUoZm9ybS5yZWNvcmRJZHgyRGlzcGxheUxpbmUoZHYuZ2V0Q3VyclJlY0lkeCgpKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICAgICAgICAgICAgaWYgKGN0cmwgIT0gbnVsbClcclxuICAgICAgICAgICAgICAgIGF3YWl0IGN0cmwuaW52b2tlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUkVGUkVTSF9TQ1JFRU46XHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9SRUZSRVNIX1ZJRVc6XHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9SRUZSRVNIX1JFQ09SRDpcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVSZWZyZXNoRXZlbnRzKGV2dCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0FDVF9DTE9TRV9BUFBMOlxyXG4gICAgICAgICAgICBjbWQgPVxyXG4gICAgICAgICAgICAgIENvbW1hbmRGYWN0b3J5LkNyZWF0ZUV2ZW50Q29tbWFuZChcclxuICAgICAgICAgICAgICAgIE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuU3RhcnR1cE1nRGF0YS5nZXRGaXJzdFRhc2soKS5nZXRUYXNrVGFnKCksXHJcbiAgICAgICAgICAgICAgICBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQlJPV1NFUl9FU0MpO1xyXG4gICAgICAgICAgICBjbWRzVG9TZXJ2ZXIuQWRkKGNtZCk7XHJcbiAgICAgICAgICAgIGF3YWl0IHNlcnZlci5FeGVjdXRlKENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZW5kaW5nSW5zdHJ1Y3Rpb24uVEFTS1NfQU5EX0NPTU1BTkRTKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ09OVEVYVF9SRU1PVkU6XHJcblxyXG4gICAgICAgICAgICAvLyBjaGVjayBpZiB0cmFuc2FjdGlvbiBpcyBwZW5kaW5nXHJcbiAgICAgICAgICAgIGxldCBjdXJyUmVjb3JkID0gKDxEYXRhVmlldz5MYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCkuRGF0YVZpZXcpLmdldEN1cnJSZWMoKTtcclxuICAgICAgICAgICAgaWYgKENsaWVudE1hbmFnZXIuVHJhbnNDYWNoZUV4aXN0cygpIHx8IChjdXJyUmVjb3JkICE9IG51bGwgJiYgY3VyclJlY29yZC5Nb2RpZmllZCkpIHtcclxuICAgICAgICAgICAgICBjb25zb2xlLmxvZygnUGVuZGluZyB0cmFuc2FjdGlvbi9yZWNvcmQgaXMgbW9kaWZpZWQsIGRpc2NhcmRlZCBcXCdDb250ZXh0IFJlbW92ZVxcJyBldmVudC4nKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAvLyBJcyB0aGVyZSBjbGllbnQgY29udGV4dCBpbmFjdGl2aXR5IHRpbWVvdXQ/XHJcbiAgICAgICAgICAgICAgaWYgKEVudmlyb25tZW50Lkluc3RhbmNlLmdldENsaWVudENvbnRleHRJbmFjdGl2aXR5VGltZW91dCgpID4gMCkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5FeGVjdXRlQ2xpZW50Q29udGV4dEluYWN0aXZpdHlUaW1lcigpO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgaWYgKCFFdmVudHNNYW5hZ2VyLmNsaWVudENvbnRleHRJbmFjdGl2aXR5VGltZXJBYm9ydGVkKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gYWRkIGEgY29tbWFuZCB0byB0ZXJtaW5hdGUgY29udGV4dCBhdCBzZXJ2ZXIgc2lkZVxyXG4gICAgICAgICAgICAgICAgbGV0IGNvbnRleHRUZXJtaW5hdGlvbkV2ZW50Q29tbWFuZDogQ29udGV4dFRlcm1pbmF0aW9uRXZlbnRDb21tYW5kXHJcbiAgICAgICAgICAgICAgICAgID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlQ29udGV4dFRlcm1pbmF0aW9uRXZlbnRDb21tYW5kKE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuU3RhcnR1cE1nRGF0YS5nZXRGaXJzdFRhc2soKS5nZXRUYXNrVGFnKCkpO1xyXG4gICAgICAgICAgICAgICAgTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5nZXRDdXJyTUdEYXRhKCkuQ21kc1RvU2VydmVyLkFkZCg8SUNsaWVudENvbW1hbmQ+Y29udGV4dFRlcm1pbmF0aW9uRXZlbnRDb21tYW5kKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyByZXNwb25zZSBuZWVkIG5vdCB0byBiZSBoYW5kbGVkIGFzIHRoZSB3ZSBhcmUgdGVybWluYXRpbmcgdGhlIGNvbnRleHRcclxuICAgICAgICAgICAgICAgIFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLkdldEluc3RhbmNlKCkuRXhlY3V0ZShDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2VuZGluZ0luc3RydWN0aW9uLk9OTFlfQ09NTUFORFMpO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdSZW1vdmVkIGNvbnRleHQgZnJvbSBzZXJ2ZXInKTtcclxuICAgICAgICAgICAgICAgIC8vIHNldCBmbGFnIHRvIHRoYXQgY29udGV4dCBpcyByZW1vdmVkIGZyb20gc2VydmVyIGJ5ICdDb250ZXh0IFJlbW92ZScgZXZlbnRcclxuICAgICAgICAgICAgICAgIFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5SZW1vdmluZ0NvbnRleHRGcm9tU2VydmVyID0gdHJ1ZTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0Rpc2NhcmRlZCBcXCdDb250ZXh0IFJlbW92ZVxcJyBldmVudCBhcyB1c2VyIGV2ZW50IG9jY3VycmVkLicpO1xyXG4gICAgICAgICAgICAgICAgRXZlbnRzTWFuYWdlci5jbGllbnRDb250ZXh0SW5hY3Rpdml0eVRpbWVyQWJvcnRlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfU0VSVkVSX1RFUk1JTkFUSU9OOlxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRFVNUF9FTlZJUk9OTUVOVDpcclxuICAgICAgICAgICAgY21kID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlRXZlbnRDb21tYW5kKHRhc2suZ2V0VGFza1RhZygpLCBpbnRFdnRDb2RlKTtcclxuICAgICAgICAgICAgY21kc1RvU2VydmVyLkFkZChjbWQpO1xyXG4gICAgICAgICAgICBhd2FpdCBDb21tYW5kc1Byb2Nlc3Nvck1hbmFnZXIuR2V0Q29tbWFuZHNQcm9jZXNzb3IoKS5FeGVjdXRlKENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZW5kaW5nSW5zdHJ1Y3Rpb24uVEFTS1NfQU5EX0NPTU1BTkRTKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfRURUX05VTEw6XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9jdXJyRmllbGQgIT0gbnVsbCAmJiB0aGlzLl9jdXJyRmllbGQuTnVsbEFsbG93ZWQpIHtcclxuICAgICAgICAgICAgICAvLyB0aGUgbmV4dCBsaW5lcyBpcyBhbiBpbW1pdGF0aW9uIG9mIHRoZSBiZWhhdmlvdXIgb2YgYW4gb25saW5lIHByb2dyYW06XHJcbiAgICAgICAgICAgICAgLy8gMSkgdGhlIHJlY29yZCBtdXN0IGJlIHVwZGF0ZWQgaW4gdGhpcyBldmVudFxyXG4gICAgICAgICAgICAgIC8vIDIpIGEgXCJuZXh0IGZpZWxkXCIgZXZlbnQgaXMgcmFpc2VkXHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fY3VyckZpZWxkLnNldFZhbHVlQW5kU3RhcnRSZWNvbXB1dGUodGhpcy5fY3VyckZpZWxkLmdldE1hZ2ljRGVmYXVsdFZhbHVlKCksIHRydWUsIHRydWUsIHRydWUsIGZhbHNlKTtcclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9jdXJyRmllbGQudXBkYXRlRGlzcGxheSgpO1xyXG5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9ST0xMQkFDSzpcclxuICAgICAgICAgICAgLy8gZm9yIG9mZmxpbmUgd2UgbmVlZCB0byBjYW5jZWwgdGhlIGVkaXQgYW5kIHRoZW4gZ28gcm9sbGJhY2sgdGhlIHRyYW5zYWN0aW9uLCB0aGUgc2FtZSB3ZSBkb2luZyBmb3IgcmVtb3ZlIHdoaWxlIHJldHVybiBmcm9tIHRoZSBzZXJ2ZXJcclxuICAgICAgICAgICAgLy8gc2VlIGRhdGF2aWV3LmNzIGNhc2UgQ29uc3RJbnRlcmZhY2UuUkVDT1ZFUllfUk9MTEJBQ0s6XHJcbiAgICAgICAgICAgIC8vIGZvciBvZmZsaW5lIHdlIHdpbGwgbm90IGdldCB0byBDb25zdEludGVyZmFjZS5SRUNPVkVSWV9ST0xMQkFDS1xyXG4gICAgICAgICAgICBhd2FpdCBFdmVudHNNYW5hZ2VyLkhhbmRsZVJvbGxiYWNrQWN0aW9uKHRhc2ssIGNtZHNUb1NlcnZlciwgUm9sbGJhY2tFdmVudENvbW1hbmRfUm9sbGJhY2tUeXBlLlJPTExCQUNLKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX09LOlxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfSU5ERVhfQ0hBTkdFOlxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ09MX1NPUlQ6XHJcbiAgICAgICAgICAgIC8vIGNhbiBzb3J0IG9ubHkgb24gY29sdW1uIHdpdGggYW4gYXR0YWNoZWQgZmllbGQuXHJcbiAgICAgICAgICAgIC8vIGNhbiBjaGFuZ2UgaW5kZXggb25seSBpZiB0aGUgZGF0YXZpZXcgaXMgcmVtb3RlLlxyXG4gICAgICAgICAgICBpZiAoKGludEV2dENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9JTkRFWF9DSEFOR0UgJiYgdGFzay5EYXRhdmlld01hbmFnZXIuSGFzUmVtb3RlRGF0YSkgfHxcclxuICAgICAgICAgICAgICAoaW50RXZ0Q29kZSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NPTF9TT1JUICYmIGN0cmwuZ2V0RmllbGQoKSAhPSBudWxsKSkge1xyXG4gICAgICAgICAgICAgIC8vIFFDUiAjMjk2MzI1ICYgUUNSICM0MzAyODguXHJcbiAgICAgICAgICAgICAgLy8gRXhlY3V0ZSBDUyBvZiB0aGUgY3VycmVudCBjb250cm9sLCBiZWNhdXNlIGl0IGNhbiBiZSBhIHBhcmFtZXRlciBmb3IgYSBzdWJmb3JtLlxyXG4gICAgICAgICAgICAgIC8vIElmIGl0J3MgdmFsdWUgd2FzIGNoYW5nZWQsIENTIHdpbGwgcmVmcmVzaCB0aGUgc3ViZm9ybSBiZWZvcmUgdGhlIHNvcnQuXHJcbiAgICAgICAgICAgICAgbGV0IGxhc3RGb2N1c2VkVGFzazogVGFzayA9IExhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKTtcclxuICAgICAgICAgICAgICBsZXQgZm9jdXNlZEN0cmw6IE1nQ29udHJvbCA9IExhc3RGb2N1c2VkTWFuYWdlci5nZXRMYXN0Rm9jdXNlZENvbnRyb2woTGFzdEZvY3VzZWRNYW5hZ2VyLkxhc3RGb2N1c01nZElEKTtcclxuICAgICAgICAgICAgICBpZiAoZm9jdXNlZEN0cmwgIT0gbnVsbClcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhNZ0NvbnRyb2xCYXNlKGZvY3VzZWRDdHJsLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9TVUZGSVgpO1xyXG5cclxuICAgICAgICAgICAgICBpZiAoIXRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSlcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRhc2suRXhlY3V0ZU5lc3RlZFJTKGxhc3RGb2N1c2VkVGFzayk7XHJcblxyXG4gICAgICAgICAgICAgIC8vIFFDUiAjNDM4NzUzLiBFeGVjdXRlIFJTIG9mIHRoZSBzb3J0ZWQgdGFzay5cclxuICAgICAgICAgICAgICBpZiAoIXRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSAmJiB0YXNrLmdldExldmVsKCkgIT09IENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spXHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcblxyXG4gICAgICAgICAgICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKSB7XHJcbiAgICAgICAgICAgICAgICB0YXNrLmdldFRhc2tDYWNoZSgpLmNsZWFyQ2FjaGUoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaW50RXZ0Q29kZSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0lOREVYX0NIQU5HRSkge1xyXG4gICAgICAgICAgICAgICAgICBsZXQgdGFza0Zvcm06IE1nRm9ybSA9IDxNZ0Zvcm0+dGFzay5nZXRGb3JtKCk7XHJcbiAgICAgICAgICAgICAgICAgIGlmICh0YXNrRm9ybS5IYXNUYWJsZSgpKVxyXG4gICAgICAgICAgICAgICAgICAgIGZvcm0uY2xlYXJUYWJsZUNvbHVtblNvcnRNYXJrKHRydWUpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgY21kID0gYXdhaXQgQ29tbWFuZEZhY3RvcnkuQ3JlYXRlSW5kZXhDaGFuZ2VDb21tYW5kKHRhc2suZ2V0VGFza1RhZygpLCAoPERhdGFWaWV3PnRhc2suRGF0YVZpZXcpLkdldEN1cnJlbnRSZWNJZCgpLCBldnQuZ2V0QXJnTGlzdCgpKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIGNtZCA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZUNvbHVtblNvcnRDb21tYW5kKHRhc2suZ2V0VGFza1RhZygpLCBldnQuRGlyZWN0aW9uLCBjdHJsLmdldERpdElkeCgpLCBjdHJsLmdldEZpZWxkKCkuZ2V0SWQoKSwgKDxEYXRhVmlldz50YXNrLkRhdGFWaWV3KS5HZXRDdXJyZW50UmVjSWQoKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGFzay5EYXRhdmlld01hbmFnZXIuRXhlY3V0ZShjbWQpO1xyXG4gICAgICAgICAgICAgICAgZHYuc2V0VG9wUmVjSWR4KDApO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgZm9ybS5yZXN0b3JlT2xkRGlzcGxheUxpbmUoMCk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gUUNSJ3MgIzE2NTgxNSAmICMyOTE5NzQuIElmIHRoZSBmb2N1c2VkIHRhc2sgYW5kIHRoZSBzb3J0ZWQgdGFzayBpcyB0aGUgc2FtZSB0YXNrIG9yXHJcbiAgICAgICAgICAgICAgICAvLyB0aGUgZm9jdXNlZCB0YXNrIGlzIGEgY2hpbGQgb2YgdGhlIHNvcnRlZCB0YXNrLCBnbyB0byB0aGUgZmlyc3QgY29udHJvbCBpbiB0aGUgZmlyc3QgbGluZS5cclxuICAgICAgICAgICAgICAgIC8vIElmIHRoZSBmb2N1c2VkIHRhc2sgaXMgdGhlIHBhcmVudCB0YXNrLCBkbyBub3QgbGVhdmUgdGhlIGN1cnJlbnQgY29udHJvbC5cclxuICAgICAgICAgICAgICAgIGlmICghKHRhc2sgPT09IExhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKSB8fCAhdGFzay5wYXRoQ29udGFpbnMoTGFzdEZvY3VzZWRNYW5hZ2VyLkluc3RhbmNlLmdldExhc3RGb2N1c2VkVGFzaygpKSkpIHtcclxuICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG4gICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSAmJiAhdGFzay5nZXRQcmV2ZW50Q29udHJvbENoYW5nZSgpKVxyXG4gICAgICAgICAgICAgICAgICAvLyBRQ1IgIzQyODY5Ny4gRXhlY3V0ZSBSUyBvZiBhbGwgbmVzdGVkIHN1YmZvcm1zLlxyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGxhc3RGb2N1c2VkVGFzay5FeGVjdXRlTmVzdGVkUlModGFzayk7XHJcbiAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpICYmIGZvY3VzZWRDdHJsICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZm9jdXNlZEN0cmwuaW52b2tlKCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2VcclxuICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG5cclxuXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NPTF9DTElDSzpcclxuICAgICAgICAgICAgLy8gY2FuIHNvcnQgb24gY29sdW1uIG9ubHkgaWYgZXZlbnQgaXMgcmFpc2VkIGR1ZSB0byBjbGljayBhY3Rpb25cclxuICAgICAgICAgICAgLy8gYW5kIGEgZmllbGQgaXMgYXR0YWNoZWQgdG8gY29sdW1uLlxyXG5cclxuICAgICAgICAgICAgaWYgKCF0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkgJiYgZXZ0LmlzR3VpVHJpZ2dlcmVkRXZlbnQoKSAmJiBjdHJsLmlzQ29sdW1uU29ydGFibGUoKSkge1xyXG4gICAgICAgICAgICAgIGxldCBjb2x1bW5DaGlsZENvbnRyb2w6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+Y3RybC5nZXRDb2x1bW5DaGlsZENvbnRyb2woKTtcclxuICAgICAgICAgICAgICBpZiAoY29sdW1uQ2hpbGRDb250cm9sICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBTb3J0IG9uIENvbHVtblxyXG4gICAgICAgICAgICAgICAgbGV0IGFSdEV2dCA9IG5ldyBSdW5UaW1lRXZlbnQoY29sdW1uQ2hpbGRDb250cm9sLCBldnQuRGlyZWN0aW9uLCAwKTtcclxuICAgICAgICAgICAgICAgIGFSdEV2dC5zZXRJbnRlcm5hbChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ09MX1NPUlQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRUb1RhaWwoYVJ0RXZ0KTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICAvLyBlbmQgb2YgaW50ZXJuYWwgZXZlbnRzIHByb2Nlc3NpbmdcclxuXHJcbiAgICB9IGZpbmFsbHkge1xyXG4gICAgICB0aGlzLnBvcFJ0RXZlbnQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qXHJcbiogSGFuZGxlQWN0RW50ZXJSb3dFZGl0aW5nXHJcbiogc3RhcnQgdGhlIGVkaXRpbmcgb24gcm93XHJcbiogKi9cclxuICBwcml2YXRlIGFzeW5jIEhhbmRsZUFjdEVudGVyUm93RWRpdGluZyh0YXNrOiBUYXNrKSB7XHJcbiAgICBpZiAodGFzay5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfUVVFUlkpXHJcbiAgICAgIHRhc2suV3JpdGVUb01lc3NhZ2VQYW5lKGBDYW5ub3QgZW50ZXIgUm93IEVkaXRpbmcgd2hlbiBpbiBRdWVyeSBNb2RlLmApO1xyXG4gICAgZWxzZSB7XHJcbiAgICAgIGxldCBteWZvcm06IE1nRm9ybSA9IDxNZ0Zvcm0+dGFzay5nZXRGb3JtKCk7XHJcbiAgICAgIGF3YWl0IG15Zm9ybS5zdGFydFJvd0VkaXRpbmcobXlmb3JtLkRpc3BsYXlMaW5lKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgSGFuZGxlU3RvcFJvd0VkaXRpbmcodGFzazogVGFzaykge1xyXG4gICAgbGV0IG15Zm9ybTogTWdGb3JtID0gPE1nRm9ybT50YXNrLmdldEZvcm0oKTtcclxuICAgIGF3YWl0IG15Zm9ybS5zdG9wUm93RWRpdGluZyhteWZvcm0uRGlzcGxheUxpbmUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBDcmVhdGVzIGFuZCBleGVjdXRlcyBzdWJmb3JtIG9wZW5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRhc2tcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInN1YmZvcm1Db250cm9sXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIE9wZW5TdWJmb3JtKHRhc2s6IFRhc2ssIHN1YmZvcm1Db250cm9sOiBNZ0NvbnRyb2wpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRhc2suVGFza1NlcnZpY2UuUmVtb3ZlUmVjb21wdXRlcyh0YXNrKTtcclxuICAgIGxldCBjbWQ6IElDbGllbnRDb21tYW5kID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlU3ViZm9ybU9wZW5Db21tYW5kKHRhc2suZ2V0VGFza1RhZygpLCBzdWJmb3JtQ29udHJvbC5nZXREaXRJZHgoKSk7XHJcbiAgICB0YXNrLmdldE1HRGF0YSgpLkNtZHNUb1NlcnZlci5BZGQoY21kKTtcclxuICAgIGF3YWl0IFRhc2suQ29tbWFuZHNQcm9jZXNzb3IuRXhlY3V0ZShDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2VuZGluZ0luc3RydWN0aW9uLlRBU0tTX0FORF9DT01NQU5EUyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0YXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjbWRzVG9TZXJ2ZXJcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInJvbGxiYWNrVHlwZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIHN0YXRpYyBhc3luYyBIYW5kbGVSb2xsYmFja0FjdGlvbih0YXNrOiBUYXNrLCBjbWRzVG9TZXJ2ZXI6IENvbW1hbmRzVGFibGUsIHJvbGxiYWNrVHlwZTogUm9sbGJhY2tFdmVudENvbW1hbmRfUm9sbGJhY2tUeXBlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgY29tbWFuZHNQcm9jZXNzb3I6IENvbW1hbmRzUHJvY2Vzc29yQmFzZSA9IFRhc2suQ29tbWFuZHNQcm9jZXNzb3I7XHJcbiAgICBDbGllbnRSZWZyZXNoQ29tbWFuZC5DbGllbnRJc0luUm9sbGJhY2tDb21tYW5kID0gdHJ1ZTtcclxuICAgIC8vIGZvciByZW1vdGUgcHJvZ3JhbSA6ICh3aXRoXFx3aXRob3V0IGxvY2FsIGRhdGEpIHRoZSByb2xsYmFjayBldmVudCBpbiB0aGUgc2VydmVyIE1VU1RcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICBiZSBleGVjdXRlIG9uIHRoZSB0YXNrIHRoYXQgb3BlbiB0aGUgdHJhbnNhY3Rpb25cclxuICAgIC8vIGZvciBvZmZsaW5lIHByb2dyYW0gdGhlIHJvbGxiYWNrIHRyYW5zYWN0aW9uIG5lZWQgdG8gYmUgZXhlY3V0ZSBvbiB0aGUgdGFzayB0aGF0IG9wZW4gdGhlIHRyYW5zYWN0aW9uXHJcbiAgICB0YXNrID0gdGFzay5UYXNrU2VydmljZS5HZXRPd25lclRyYW5zYWN0aW9uVGFzayh0YXNrKTtcclxuXHJcbiAgICBsZXQgY21kOiBJQ2xpZW50Q29tbWFuZCA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZVJvbGxiYWNrRXZlbnRDb21tYW5kKHRhc2suZ2V0VGFza1RhZygpLCByb2xsYmFja1R5cGUpO1xyXG4gICAgY21kc1RvU2VydmVyLkFkZChjbWQpO1xyXG4gICAgYXdhaXQgY29tbWFuZHNQcm9jZXNzb3IuRXhlY3V0ZShDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2VuZGluZ0luc3RydWN0aW9uLlRBU0tTX0FORF9DT01NQU5EUyk7XHJcblxyXG4gICAgQ2xpZW50UmVmcmVzaENvbW1hbmQuQ2xpZW50SXNJblJvbGxiYWNrQ29tbWFuZCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZXZ0XCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0YXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJmb3JtXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdHJsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyZWNcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxhc3RQYXJrZWRDdHJsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJvbGRSZWNNb2RlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJvbGRNb2RlXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgYXN5bmMgSGFuZGxlQWN0Q2FuY2VsKGV2dDogUnVuVGltZUV2ZW50LCB0YXNrOiBUYXNrLCBmb3JtOiBNZ0Zvcm0sIGN0cmw6IE1nQ29udHJvbCwgcmVjOiBSZWNvcmQsIGlzTUdfQUNUX0NBTkNFTDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgLy8gUHJldmVudCByZWN1cnNpdmUgbW9kZVxyXG4gICAgLy8gZml4ZWQgYnVncyAjOjI4NTQ5OCwgMjk3NDU1XFw0Mjc3MDNcXFxyXG4gICAgaWYgKHRhc2suSW5IYW5kbGVBY3RDYW5jZWwpXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICB0YXNrLkluSGFuZGxlQWN0Q2FuY2VsID0gdHJ1ZTtcclxuXHJcbiAgICBsZXQgb2xkTW9kZTogc3RyaW5nID0gdGFzay5nZXRNb2RlKCk7XHJcbiAgICBsZXQgc2F2ZURpc3BsYXlMaW5lID0gdGFzay5nZXRGb3JtKCkuRGlzcGxheUxpbmU7XHJcblxyXG4gICAgLy8gV2hlbiBkbyB3ZSBzaG93IHRoZSAnQ29uZmlybSBDYW5jZWwgd2luZG93JyA/IHdoZW4gYWxsIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcHBseTpcclxuICAgIC8vIDEuIFRhc2sgbW9kZSBpcyBub3QgcXVlcnlcclxuICAgIC8vIDIuIHJlYyBpcyBub3QgVXBkYXRlZC4gVXBkYXRlZCBpcyB0cnVlIHdoZW4gdGhlcmUgd2FzIGFuIFVwZGF0ZSBvcGVyYXRpb24gd2l0aCAnZm9yY2UgdXBkYXRlJy4gSWYgaXQgaXMgdHJ1ZSwgdGhlbiB0aGVyZSBpcyBubyBtZWFuaW5nIHRvIHNob3cgdGhlXHJcbiAgICAvLyAgICB3aW5kb3cgc2luY2UgdGhlIHVwZGF0ZSBzdGF5cyBhbnl3YXkgKGxpa2UgaW4gb25saW5lIHdoZW4gd2UgZ28gdG8gQ2FuY2VsV2FzVHJpZ2dlcmVkKS5cclxuICAgIC8vIDMuIFRoZXJlIG11c3QgYmUgYSBtb2RpZmljYXRpb24sIG90aGVyd2lzZSB0aGVyZSBpcyBub3RoaW5nIHRvIGNhbmNlbC4gU28gZWl0aGVyIE1vZGlmaWVkIGlzIHRydWUsIG1lYW5pbmcgYSBmaWVsZCB3YXMgbW9pZGZpZWQgLCBvclxyXG4gICAgLy8gICAgTGFzdFBhcmtlZEN0cmwoKS5tb2RpZmllZEJ5VXNlcigpLCBtZWFuaW5nIHRoYXQgd2UgYXJlIGluIHRoZSBtaWRkbGUgb2YgY2hhbmdpbmcgdGhlIGZpZWxkJ3MgdmFsdWUgKFRoZSBtb2RpZmllZCBpcyBmYWxzZSB1bnRpbGwgd2UgZXhpdCB0aGUgZmllbGQpLlxyXG4gICAgLy8gQ3JlYXRlIG1vZGUgYWxzbyBnb2VzIGhlcmUgKHJlYyByZW1vdmVkIGFuZCBtb2RlIGNoYW5nZXMgdG8gbW9kaWZ5KSAsIGJ1dCBhbHNvIHdpbGwgc2hvdyB0aGUgY29uZmlybSBjYW5jZWwgb25seSBpZiBzb21lIGNoYW5nZSB3YXMgZG9uZSB0byB0aGUgbmV3IHJlY29yZC5cclxuICAgIGlmIChvbGRNb2RlICE9PSBDb25zdGFudHMuVEFTS19NT0RFX1FVRVJZICYmICFyZWMuVXBkYXRlZCkge1xyXG4gICAgICBpZiAoaXNNR19BQ1RfQ0FOQ0VMKSB7XHJcbiAgICAgICAgaWYgKHJlYy5Nb2RpZmllZCB8fCAodGFzay5nZXRMYXN0UGFya2VkQ3RybCgpICE9PSBudWxsICYmIHRhc2suZ2V0TGFzdFBhcmtlZEN0cmwoKS5Nb2RpZmllZEJ5VXNlcikpIHtcclxuICAgICAgICAgIGlmIChhd2FpdCB0YXNrLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DT05GSVJNX0NBTkNFTCwgZmFsc2UpKSB7XHJcbiAgICAgICAgICAgIGxldCBjb25maXJtZWQgPSBhd2FpdCBHVUlNYW5hZ2VyLkluc3RhbmNlLmNvbmZpcm1fYm9vbChNc2dJbnRlcmZhY2UuQ09ORklSTV9TVFJfQ0FOQ0VMKTtcclxuICAgICAgICAgICAgaWYgKCFjb25maXJtZWQpIHtcclxuICAgICAgICAgICAgICB0YXNrLkluSGFuZGxlQWN0Q2FuY2VsID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgb2xkUmVjTW9kZTogRGF0YU1vZGlmaWNhdGlvblR5cGVzID0gcmVjLmdldE1vZGUoKTtcclxuXHJcbiAgICAgIC8vIFNwZWNpYWxDYW5jZWxPbkNyZWF0ZSBiZWhhdmlvciBmb3IgQWxsb3dFbXB0eURhdGFWaWV3ID0gWSA6IFdoZW4gdGhlcmUgaXMgc2luZ2xlIG5ld2x5IGNyZWF0ZWQgcmVjb3JkXHJcbiAgICAgIC8vIGV4aXN0IGFuZCB1c2VyIGNhbmNlbHMgaXQgYW5kIHRhc2sgaGFzIEFsbG93RW1wdHlEYXRhVmlldz1ZXHJcbiAgICAgIC8vIHRoZW4gY2hhbmdlIHRhc2sgbW9kZSB0byBNb2RpZnkgbW9kZSBzbyB0aGF0IHNlcnZlciBhbGxvd3MgdGhpcyB0YXNrIHRvIGVudGVyIGFnYWluIGluIEVtcHR5RGF0YVZpZXcgbW9kZS5cclxuICAgICAgaWYgKEd1aUVudmlyb25tZW50LkVudmlyb25tZW50LkdldFNwZWNpYWxDYW5jZWxPbkNyZWF0ZSgpICYmIHRhc2suZ2V0TW9kZSgpID09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFXHJcbiAgICAgICAgJiYgdGFzay5nZXRPcmlnaW5hbFRhc2tNb2RlKCkgPT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpIHtcclxuXHJcbiAgICAgICAgbGV0IGVuYWJsZTogYm9vbGVhbiA9IGF3YWl0IHRhc2suY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX01PRElGWSwgdHJ1ZSk7XHJcblxyXG4gICAgICAgIGlmIChlbmFibGUpIHtcclxuICAgICAgICAgIGxldCBhbGxvd0VtcHR5RGF0YVZpZXc6IGJvb2xlYW4gPSBhd2FpdCB0YXNrLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19FTVBUWV9EQVRBVklFVywgdHJ1ZSk7XHJcblxyXG4gICAgICAgICAgaWYgKCg8RGF0YVZpZXc+dGFzay5EYXRhVmlldykuZ2V0U2l6ZSgpID09IDEgJiYgYWxsb3dFbXB0eURhdGFWaWV3KSB7XHJcbiAgICAgICAgICAgIHRhc2suc2V0TW9kZSgnTScpO1xyXG4gICAgICAgICAgICB0YXNrLkRhdGFWaWV3LnNldEVtcHR5RGF0YXZpZXcodHJ1ZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoaXNNR19BQ1RfQ0FOQ0VMKSB7XHJcbiAgICAgICAgLy8gV2hlbiBjYW5jZWxpbmcsIHdlIGhhdmUgdG8gcm9sbGJhY2sgdGhlIHRyYW5zYWN0aW9uLlxyXG4gICAgICAgIC8vIFVubGVzcyB0aGUgZXZlbnQgZG9lcyBub3QgYWxsb3cgdG8gcm9sbGJhY2sgaW4gY2FuY2VsLiBUaGF0IGNhbiBoYXBwZW4gaWYgdGhlIGNhbmNlbCB3YXMgaW5pdGlhdGVkIGJ5IHRoZSBzZXJ2ZXIncydzIHJvbGxiYWNrLlxyXG4gICAgICAgIGlmICh0YXNrLmlzVHJhbnNhY3Rpb25PbkxldmVsKENvbnN0SW50ZXJmYWNlLlRSQU5TX1JFQ09SRF9QUkVGSVgpICYmIGV2dC5Sb2xsYmFja0luQ2FuY2VsKCkpIHtcclxuICAgICAgICAgIGF3YWl0IEV2ZW50c01hbmFnZXIuSGFuZGxlUm9sbGJhY2tBY3Rpb24odGFzaywgPENvbW1hbmRzVGFibGU+dGFzay5nZXRNR0RhdGEoKS5DbWRzVG9TZXJ2ZXIsIFJvbGxiYWNrRXZlbnRDb21tYW5kX1JvbGxiYWNrVHlwZS5DQU5DRUwpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgYXdhaXQgRXZlbnRzTWFuYWdlci5IYW5kbGVDYW5jZWxFZGl0KGV2dCwgdGFzaywgZm9ybSwgcmVjLCBvbGRSZWNNb2RlKTtcclxuICAgIH1cclxuICAgIC8vIFFjciAjNzQ3ODcwIGNhbmNlbCBzaG91bGQgcGVyZm9ybSB0aGUgcmVjb3JkIHByZWZpeCBpZiBub3QgcXVpdGluZ1xyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRhc2suc2V0TGV2ZWwoQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSyk7XHJcblxyXG4gICAgICAvLyB3ZSByb2xsYmFjayBhIHBhcmVudCB0YXNrIHdoaWxlIGZvY3VzZWQgb24gc3ViZm9ybS90YXNrLiBXZSBkbyBub3Qgd2FudCB0aGUgY3RybCBvbiB0aGUgc3ViZm9ybSB0byBkbyBjdHJsIHN1ZmZpeC5cclxuICAgICAgbGV0IGxhc3RGb2N1c2VkQ29udHJvbDogTWdDb250cm9sID0gTGFzdEZvY3VzZWRNYW5hZ2VyLmdldExhc3RGb2N1c2VkQ29udHJvbCgpO1xyXG4gICAgICBpZiAobGFzdEZvY3VzZWRDb250cm9sICE9PSBudWxsKSB7XHJcbiAgICAgICAgbGFzdEZvY3VzZWRDb250cm9sLmdldEZvcm0oKS5nZXRUYXNrKCkuc2V0TGV2ZWwoQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSyk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCFldnQuaXNRdWl0KCkpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5IYW5kbGVQYXJrYWJpbGl0eU9uUm93Q2hhbmdlKHRhc2spO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUUNSIyA5NDEyNzc6IElmIENhbmNlbCBldmVudCBpcyBjYWxsZWQgZnJvbSBRdWl0IGV2ZW50LCB0aGVuIGRvbid0IGV4ZWN1dGUgRXhpdCBldmVudFxyXG4gICAgLy8gaWYgdXNlciBoYXMgcHJlc3NlZCAnTm8nIG9uIENvbmZpcm0gY2FuY2VsIGJveC5cclxuICAgIGlmIChldnQuaXNRdWl0KCkpXHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhNZ0NvbnRyb2xCYXNlKGN0cmwsIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FWElUKTtcclxuXHJcbiAgICAvLyByZXNldCBpc1Jvd0VkaXRpbmdcclxuICAgIGF3YWl0IGZvcm0uc3RvcFJvd0VkaXRpbmcoc2F2ZURpc3BsYXlMaW5lKTtcclxuXHJcbiAgICB0YXNrLkluSGFuZGxlQWN0Q2FuY2VsID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGNhbmNlbCB0aGUgZWRpdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZXZ0XCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0YXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJmb3JtXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyZWNcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm9sZFJlY01vZGVcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgc3RhdGljIGFzeW5jIEhhbmRsZUNhbmNlbEVkaXQoZXZ0OiBSdW5UaW1lRXZlbnQsIHRhc2s6IFRhc2ssIGZvcm06IE1nRm9ybSwgcmVjOiBSZWNvcmQsIG9sZFJlY01vZGU6IERhdGFNb2RpZmljYXRpb25UeXBlcyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgLy8gaWYgdGhlIHN5bmNlZCByZWNvcmQgKGkuZS4gdGhlIHJlY29yZCBmcm9tIHRoZSBwYXJlbnQgdGFzayBvZiB0aGUgc3ViZm9ybSkgYmVmb3JlIFJvbGxiYWNrIHdhcyBpbiAnSW5zZXJ0JyBtb2RlLFxyXG4gICAgLy8gc28gaXQgbXVzdCBiZSBpbiAnSW5zZXJ0JyBtb3JlIGFmdGVyIHJldHVybiBmcm9tIHRoZSBzZXJ2ZXJcclxuICAgIGlmIChyZWMuU3luY2VkICYmIG9sZFJlY01vZGUgPT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5JbnNlcnQpXHJcbiAgICAgIHJlYy5zZXRNb2RlKG9sZFJlY01vZGUpO1xyXG5cclxuICAgIGlmIChmb3JtICE9PSBudWxsKSB7XHJcbiAgICAgIC8vIHJlc2V0IHRoZSBsYXN0IHBhcmtlZCBjb250cm9sXHJcbiAgICAgIGlmICh0YXNrLmdldExhc3RQYXJrZWRDdHJsKCkgIT09IG51bGwpXHJcbiAgICAgICAgdGFzay5nZXRMYXN0UGFya2VkQ3RybCgpLnJlc2V0UHJldlZhbCgpO1xyXG5cclxuICAgICAgYXdhaXQgZm9ybS5jYW5jZWxFZGl0KHRydWUsIGV2dC5pc1F1aXQoKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJldnRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRhc2tcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImR2XCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyZWNcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm5vbkludGVyYWN0aXZlRGVsZXRlXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgYXN5bmMgSGFuZGxlQWN0aW9uRGVsbGluZSh0YXNrOiBUYXNrLCBkdjogRGF0YVZpZXcsIHJlYzogUmVjb3JkLCBub25JbnRlcmFjdGl2ZURlbGV0ZTogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IGxhc3RQYXJrZWRDdHJsOiBNZ0NvbnRyb2w7XHJcbiAgICBsZXQgbXlmb3JtOiBNZ0Zvcm0gPSA8TWdGb3JtPnRhc2suZ2V0Rm9ybSgpO1xyXG4gICAgbGV0IHNhdmVJc1Jvd0VkaXRpbmcgPSBteWZvcm0uZ2V0SXNSb3dFZGl0aW5nRnJvbUd1aShteWZvcm0uRGlzcGxheUxpbmUpOyAvL0NvbW1hbmRzLmdldElzUm90aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoTWdDb250cm9sQmFzZShsYXN0UGFya2VkQ3RybCwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfUFJFRklYKTt3RWRpdGluZyggdGFzay5nZXRGb3JtKCkuZ2V0TWFpbkNvbnRyb2woKSwgdGFzay5nZXRGb3JtKCkuRGlzcGxheUxpbmUpOyAgICBsZXQgb2xkUmVjTW9kZTogRGF0YU1vZGlmaWNhdGlvblR5cGVzO1xyXG4gICAgbGV0IG9sZFJlY01vZGU6IERhdGFNb2RpZmljYXRpb25UeXBlcztcclxuICAgIGlmIChhd2FpdCB0YXNrLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19ERUxFVEUsIHRydWUpKSB7XHJcbiAgICAgIGxhc3RQYXJrZWRDdHJsID0gPE1nQ29udHJvbD50YXNrLmdldExhc3RQYXJrZWRDdHJsKCk7XHJcbiAgICAgIGlmIChsYXN0UGFya2VkQ3RybCAhPT0gbnVsbClcclxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoTWdDb250cm9sQmFzZShsYXN0UGFya2VkQ3RybCwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfU1VGRklYKTtcclxuICAgICAgaWYgKCF0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpIHtcclxuICAgICAgICBvbGRSZWNNb2RlID0gcmVjLmdldE1vZGUoKTtcclxuXHJcbiAgICAgICAgLy8gRm9yY2UgdGhlIGNoYW5nZSB0byBkZWxldGUgbW9kZVxyXG4gICAgICAgIHJlYy5jbGVhck1vZGUoKTtcclxuICAgICAgICByZWMuc2V0TW9kZShEYXRhTW9kaWZpY2F0aW9uVHlwZXMuRGVsZXRlKTtcclxuXHJcbiAgICAgICAgaWYgKG9sZFJlY01vZGUgPT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5JbnNlcnQpXHJcbiAgICAgICAgICByZWMuc2V0U2VuZFRvU2VydmVyKGZhbHNlKTtcclxuXHJcbiAgICAgICAgLy8gZXhlY3V0ZSB0YXNrIHN1ZmZpeCBpbiBNb2RpZnkgbW9kZSBvciB3aGVuIHRoZXJlIGlzICdmb3JjZSByZWNvcmQgc3VmZml4Jy5cclxuICAgICAgICBpZiAocmVjLk1vZGlmaWVkIHx8IGF3YWl0IHRhc2suY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0ZPUkNFX1NVRkZJWCwgZmFsc2UpKSB7XHJcbiAgICAgICAgICB0YXNrLnNldE1vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9NT0RJRlkpO1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG4gICAgICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgdGhlIHJlY29yZCBzdWZmaXggY29tcGxldGVkIHN1Y2Nlc3NmdWxseVxyXG4gICAgICAgICAgaWYgKHRoaXMuX3N0b3BFeGVjdXRpb24pIHtcclxuICAgICAgICAgICAgaWYgKCFyZWMuU2VuZFRvU2VydmVyKSB7XHJcbiAgICAgICAgICAgICAgYXdhaXQgZHYuYWRkQ3VyclRvTW9kaWZpZWQoKTtcclxuICAgICAgICAgICAgICByZWMuc2V0U2VuZFRvU2VydmVyKHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZWMuY2xlYXJNb2RlKCk7XHJcbiAgICAgICAgICAgIHJlYy5zZXRNb2RlKG9sZFJlY01vZGUpO1xyXG4gICAgICAgICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb24oZmFsc2UpO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbih0cnVlKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBleGVjdXRlIHJlY29yZCBzdWZmaXggaW4gRGVsZXRlIG1vZGVcclxuICAgICAgICAvLyBzZXQgdGhlIEluRGVsZXRlUHJvY2VzcyBmbGFnICwgc28gd2Ugd2lsbCBub3QgdHJ5IHRvIHNlbmQgdXBkYXRlcyBvbiB0aGUgcmVjb3JkIGFmdGVyXHJcbiAgICAgICAgLy8gd2UgZGVsZXRlIGl0IGluIHRoZSBjb21tb25IYW5kbGVyQWZ0ZXIgKHJlYyBzdWZmaXgpLlxyXG4gICAgICAgIHJlYy5zZXRJbkRlbGV0ZVByb2Nlc3ModHJ1ZSk7XHJcblxyXG4gICAgICAgIHRhc2suc2V0TW9kZShDb25zdGFudHMuVEFTS19NT0RFX0RFTEVURSk7XHJcbiAgICAgICAgLy8gbm8gY29uZmlybSBtZXNzYWdlIGRpYWxvZyBpZiBpbiBub24gaW50ZXJhY3RpdmUgZGVsZXRlLlxyXG4gICAgICAgIGxldCBza2lwQ29uZmlybURpYWxvZzogYm9vbGVhbiA9IG5vbkludGVyYWN0aXZlRGVsZXRlO1xyXG5cclxuICAgICAgICBpZiAoIXNraXBDb25maXJtRGlhbG9nKSB7XHJcbiAgICAgICAgICBpZiAodGFzay5tdXN0Q29uZmlybUluRGVsZXRlTW9kZSgpIHx8IGF3YWl0IHRhc2suY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0NPTkZJUk1fVVBEQVRFLCBmYWxzZSkpIHtcclxuICAgICAgICAgICAgbGV0IGNvbmZpcm1lZDogYm9vbGVhbiA9IGF3YWl0IEdVSU1hbmFnZXIuSW5zdGFuY2UuY29uZmlybV9ib29sKE1zZ0ludGVyZmFjZS5DT05GSVJNX1NUUl9ERUxFVEUpO1xyXG4gICAgICAgICAgICBpZiAoIWNvbmZpcm1lZCkge1xyXG4gICAgICAgICAgICAgIHJlYy5jbGVhck1vZGUoKTtcclxuICAgICAgICAgICAgICByZWMuc2V0TW9kZShvbGRSZWNNb2RlKTtcclxuICAgICAgICAgICAgICB0YXNrLnNldE1vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9NT0RJRlkpO1xyXG4gICAgICAgICAgICAgIGlmIChsYXN0UGFya2VkQ3RybCAhPT0gbnVsbClcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhNZ0NvbnRyb2xCYXNlKGxhc3RQYXJrZWRDdHJsLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9QUkVGSVgpO1xyXG5cclxuICAgICAgICAgICAgICBpZiAoc2F2ZUlzUm93RWRpdGluZykge1xyXG4gICAgICAgICAgICAgICAgbGV0IG15Zm9ybTogTWdGb3JtID0gPE1nRm9ybT50YXNrLmdldEZvcm0oKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IG15Zm9ybS5zdGFydFJvd0VkaXRpbmcobXlmb3JtLkRpc3BsYXlMaW5lKTtcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcbiAgICAgICAgcmVjLnNldEluRGVsZXRlUHJvY2VzcyhmYWxzZSk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9zdG9wRXhlY3V0aW9uKSB7XHJcbiAgICAgICAgICBpZiAoIXJlYy5TZW5kVG9TZXJ2ZXIpIHtcclxuICAgICAgICAgICAgYXdhaXQgZHYuYWRkQ3VyclRvTW9kaWZpZWQoKTtcclxuICAgICAgICAgICAgcmVjLnNldFNlbmRUb1NlcnZlcih0cnVlKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICByZWMuY2xlYXJNb2RlKCk7XHJcbiAgICAgICAgICByZWMuc2V0TW9kZShvbGRSZWNNb2RlKTtcclxuICAgICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbihmYWxzZSk7XHJcbiAgICAgICAgICB0YXNrLnNldE1vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9NT0RJRlkpO1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG4gICAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uKHRydWUpO1xyXG5cclxuICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gSWYgd2UncmUgZGVsZXRpbmcgYW4gaW5zZXJ0ZWQgcmVjb3JkLCB0aGUgc2VydmVyIGlzIG5vdCBhd2FyZSBvZiBpdFxyXG4gICAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHVwb24gZGVsZXRlLCBpdCB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgbW9kaWZpZWQgcmVjIGxpc3RcclxuICAgICAgICBpZiAob2xkUmVjTW9kZSA9PT0gRGF0YU1vZGlmaWNhdGlvblR5cGVzLkluc2VydCkge1xyXG4gICAgICAgICAgcmVjLmNsZWFyTW9kZSgpO1xyXG4gICAgICAgICAgcmVjLnNldE1vZGUob2xkUmVjTW9kZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgbmV3Q3VyclJlYzogUmVjb3JkID0gZHYuZ2V0Q3VyclJlYygpO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgLy8gUUNSICM0MzgxNzU6IHdoZW4gdGhlIHVzZXIgZGVsZXRlcyBhIHJlY29yZCwgd2hpY2ggaXMgdGhlIHNpbmdsZVxyXG4gICAgICAgICAgLy8gcmVjb3JkIGluIHRoZSBkdiwgdGhlbiB3aGVuIGl0cyByZWNvcmQgc3VmZml4IGlzIGV4ZWN1dGVkIGFuZCB0aGVcclxuICAgICAgICAgIC8vIHNlcnZlciBzZW5kcyBhIG5ldyByZWNvcmQgdG8gdGhlIGNsaWVudCBhbmQgc2V0IGl0IHRvIGJlIHRoZVxyXG4gICAgICAgICAgLy8gY3VycmVudCByZWNvcmQuXHJcbiAgICAgICAgICAvLyBUaGlzIGZpeCBtYWtlcyB0aGUgZGVsZXRlZCByZWNvcmQgdG8gYmUgdGhlIGN1cnJlbnQgZm9yIGFcclxuICAgICAgICAgIC8vIG1vbWVudCBqdXN0IHRvIGRlbGV0ZSBpdCBmcm9tIHRoZSBjbGllbnRzIGNhY2hlLiBUaGVuLCBpdCBtYWtlc1xyXG4gICAgICAgICAgLy8gdGhlIG5ldyByZWNvcmQgdG8gYmUgdGhlIGN1cnJlbnQgYWdhaW4gYW5kIGVudGVycyBpbnRvIGNyZWF0ZSBtb2RlLlxyXG4gICAgICAgICAgLy8gSSB0aGluayB0aGF0IGEgYmV0dGVyIHNvbHV0aW9uIGlzIHRvIGRlY2lkZSB3aGV0aGVyIHRoZSBjbGllbnQgaXNcclxuICAgICAgICAgIC8vIHJlc3BvbnNpYmxlIGZvciBhZGRpbmcgYSBuZXcgcmVjb3JkIG9yIHRoZSBzZXJ2ZXIsIGFuZCBtYWtlIHN1cmVcclxuICAgICAgICAgIC8vIHRoYXQgaXQgaXMgZG9uZSBzeXN0ZW13aWRlLlxyXG4gICAgICAgICAgLy8gRWh1ZCAtIDEwLzA5LzIwMDFcclxuICAgICAgICAgIGlmIChyZWMgIT09IG5ld0N1cnJSZWMpXHJcbiAgICAgICAgICAgIGF3YWl0IGR2LnNldEN1cnJSZWMocmVjLmdldElkKCksIGZhbHNlKTtcclxuXHJcbiAgICAgICAgICAvLyBubyBuZWVkIHRvIGRlbCB0aGUgY3VyciByZWMgYW5kIHBvc2l0aW9uIG9uIHRoZSBuZXggcmVjIGlmIHRoZSB0YXNrIGlzIGFib3J0aW5nLlxyXG4gICAgICAgICAgLy8gVGhlIGRlbEN1cnJSZWMgbWF5IGNhdXNlIGEgY3Jhc2ggaWYgaXQgdHJpZXMgdG8gZ2V0IHRoZSBuZXh0IHJlYyBmcm9tIHRoZSBuZXh0IGNodW5rLlxyXG4gICAgICAgICAgaWYgKCF0YXNrLmlzQWJvcnRpbmcoKSlcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5kZWxDdXJyUmVjKHRhc2ssIGZhbHNlKTtcclxuICAgICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgICAgLy8gUUNSICM0MzgxNzUgLSBmaXggY29udGludWVcclxuICAgICAgICAgIGlmIChyZWMgIT09IG5ld0N1cnJSZWMpIHtcclxuICAgICAgICAgICAgYXdhaXQgZHYuc2V0Q3VyclJlYyhuZXdDdXJyUmVjLmdldElkKCksIGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKGR2LmdldFNpemUoKSA9PT0gMSlcclxuICAgICAgICAgICAgICB0YXNrLnNldE1vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gSW4gaW50ZXJhY3RpdmUsIHRoZSBtb2RlIG1pZ2h0IGNoYW5nZSB0byBtb2RpZnkgb3IgY3JlYXRlLiBIb3dldmVyLCBmb3Igbm9uIGludGVyYWN0aXZlIChkZWxldGUgbW9kZSlcclxuICAgICAgICAgIC8vIHRoZSBtb2RlIHNob3VsZCBiZSBzZXQgYmFjayB0byBkZWxldGUgYW5kIHdpbGwgYmUgdXNlZCBpbiB0aGUgbmV4dCByZWNvcmQgY3ljbGUuXHJcbiAgICAgICAgICBpZiAobm9uSW50ZXJhY3RpdmVEZWxldGUpXHJcbiAgICAgICAgICAgIHRhc2suc2V0TW9kZShDb25zdGFudHMuVEFTS19NT0RFX0RFTEVURSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgaGFuZGxlIHZpZXcgcmVmcmVzaCwgc2NyZWVuIHJlZnJlc2ggYW5kIHJlY29yZCBmbHVzaCBldmVudHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZXZ0XCI+dGhlIGV2ZW50IHRvIGhhbmRsZSB3aXRoIGFsbCBpdHMgcHJvcGVydGllczwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVSZWZyZXNoRXZlbnRzKGV2dDogUnVuVGltZUV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgdGFzazogVGFzayA9IDxUYXNrPmV2dC5nZXRUYXNrKCk7XHJcbiAgICBsZXQgZm9ybTogTWdGb3JtID0gPE1nRm9ybT50YXNrLmdldEZvcm0oKTtcclxuICAgIGxldCBkdjogRGF0YVZpZXcgPSA8RGF0YVZpZXc+dGFzay5EYXRhVmlldztcclxuICAgIGxldCBpbnRFdnRDb2RlOiBudW1iZXIgPSBldnQuZ2V0SW50ZXJuYWxDb2RlKCk7XHJcbiAgICBsZXQgY21kOiBJQ2xpZW50Q29tbWFuZCA9IG51bGw7XHJcblxyXG4gICAgaWYgKGludEV2dENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9SRUZSRVNIX1JFQ09SRClcclxuICAgICAgdGhpcy5faXNJblJlY29yZEZsdXNoRXZlbnQgPSB0cnVlO1xyXG4gICAgLy8gY2hlY2sgaWYgd2UgdHJ5IHRvIHZpZXcgcmVmcmVzaCB3aXRoIGFsbG93X21vZGlmeT1uIGluIGNyZWF0ZSBtb2RlXHJcbiAgICBpZiAoaW50RXZ0Q29kZSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1JFRlJFU0hfVklFVyAmJiB0YXNrLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUgJiYgIWF3YWl0IHRhc2suY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX01PRElGWSwgdHJ1ZSkpIHtcclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VYSVQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgYXdhaXQgdGFzay5FeGVjdXRlTmVzdGVkUlMoTGFzdEZvY3VzZWRNYW5hZ2VyLkluc3RhbmNlLmdldExhc3RGb2N1c2VkVGFzaygpKTtcclxuICAgICAgaWYgKCF0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCF0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkgJiYgIXRhc2suSW5FbmRUYXNrICYmICF0YXNrLmlzQWJvcnRpbmcoKSkge1xyXG4gICAgICAgIGlmIChpbnRFdnRDb2RlICE9PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUkVGUkVTSF9TQ1JFRU4pIHtcclxuICAgICAgICAgIGxldCBjdXJyZW50Um93OiBudW1iZXIgPSAwO1xyXG4gICAgICAgICAgaWYgKCFldnQuZ2V0UmVmcmVzaFR5cGUoKSkge1xyXG4gICAgICAgICAgICBpZiAoZXZ0LlJ0Vmlld1JlZnJlc2hVc2VDdXJyZW50Um93KCkgJiYgdGFzay5Jc0ludGVyYWN0aXZlKSB7XHJcbiAgICAgICAgICAgICAgY3VycmVudFJvdyA9IGZvcm0uZ2V0Q3VyclJlY1Bvc0luRm9ybSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNtZCA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZUludGVybmFsUmVmcmVzaENvbW1hbmQodGFzay5nZXRUYXNrVGFnKCksIGludEV2dENvZGUsIGR2LkN1cnJlbnRSZWNJZCwgY3VycmVudFJvdyk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAodGFzay5Jc0ludGVyYWN0aXZlKVxyXG4gICAgICAgICAgICAgIGN1cnJlbnRSb3cgPSBmb3JtLmdldEN1cnJSZWNQb3NJbkZvcm0oKTtcclxuXHJcbiAgICAgICAgICAgIGxldCByZWZldGNoUmVjb3JkOiBib29sZWFuID0gdHJ1ZTsgLy9SZWZldGNoIHJlY29yZCBmcm9tIHNlcnZlci5cclxuICAgICAgICAgICAgaWYgKGludEV2dENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9SRUZSRVNIX1JFQ09SRCAmJiBldnQuZ2V0QXJnTGlzdCgpICE9PSBudWxsICYmIGV2dC5nZXRBcmdMaXN0KCkuZ2V0U2l6ZSgpICE9PSAwKSB7XHJcbiAgICAgICAgICAgICAgbGV0IHJlZmV0Y2hSZWNTdHI6IHN0cmluZztcclxuICAgICAgICAgICAgICByZWZldGNoUmVjU3RyID0gYXdhaXQgZXZ0LmdldEFyZ0xpc3QoKS5nZXRBcmdWYWx1ZSgwLCBTdG9yYWdlQXR0cmlidXRlLkJPT0xFQU4sIDApO1xyXG4gICAgICAgICAgICAgIHJlZmV0Y2hSZWNvcmQgPSAoaXNOdWxsT3JVbmRlZmluZWQocmVmZXRjaFJlY1N0cikgfHwgcmVmZXRjaFJlY1N0ciA9PT0gJzEnKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHJlZmV0Y2hSZWNvcmQpXHJcbiAgICAgICAgICAgICAgY21kID0gYXdhaXQgQ29tbWFuZEZhY3RvcnkuQ3JlYXRlUmVhbFJlZnJlc2hDb21tYW5kKHRhc2suZ2V0VGFza1RhZygpLCBpbnRFdnRDb2RlLCBjdXJyZW50Um93LCBldnQuZ2V0QXJnTGlzdCgpLCBkdi5DdXJyZW50UmVjSWQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBzY3JlZW4gcmVmcmVzaCBldmVudFxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgbGV0IGlkOiBudW1iZXI7XHJcblxyXG4gICAgICAgICAgaWYgKHRhc2suZ2V0Rm9ybSgpID09PSBudWxsKVxyXG4gICAgICAgICAgICBpZCA9IDA7XHJcbiAgICAgICAgICBlbHNlIGlmICh0YXNrLmdldEZvcm0oKS5pc1NjcmVlbk1vZGUoKSlcclxuICAgICAgICAgICAgaWQgPSAoKDxEYXRhVmlldz50YXNrLkRhdGFWaWV3KS5nZXRDdXJyUmVjKCkpLmdldElkKCk7XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIGlkID0gKDxEYXRhVmlldz50YXNrLkRhdGFWaWV3KS5nZXRSZWNCeUlkeCgoPERhdGFWaWV3PnRhc2suRGF0YVZpZXcpLmdldFRvcFJlY0lkeCgpKS5nZXRJZCgpO1xyXG5cclxuICAgICAgICAgIGNtZCA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZVNjcmVlblJlZnJlc2hDb21tYW5kKHRhc2suZ2V0VGFza1RhZygpLCBpZCwgZHYuQ3VycmVudFJlY0lkKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIHJlYWwgdmlldyByZWZyZXNoIGNhdXNlcyB0aGUgY2FjaGUgb2YgdGhlIGN1cnJlbnQgc3ViIGZvcm0gdGFzayB0byBiZSBjbGVhcmVkXHJcbiAgICAgICAgaWYgKGludEV2dENvZGUgIT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9SRUZSRVNIX1NDUkVFTilcclxuICAgICAgICAvLyBzY3JlZW4gcmVmcmVzaCBkb2VzIG5vdCBjbGVhciB0aGUgY2FjaGVcclxuICAgICAgICAgIHRhc2suZ2V0VGFza0NhY2hlKCkuY2xlYXJDYWNoZSgpO1xyXG5cclxuICAgICAgICBpZiAoY21kICE9PSBudWxsKVxyXG4gICAgICAgICAgYXdhaXQgdGFzay5EYXRhdmlld01hbmFnZXIuRXhlY3V0ZShjbWQpO1xyXG5cclxuICAgICAgICB0aGlzLl9pc0luUmVjb3JkRmx1c2hFdmVudCA9IGZhbHNlO1xyXG4gICAgICAgIC8vIFFDUiAjMjg5MjIyLiBEbyBub3QgY29udGludWUgd2l0aCBSZWZyZXNoIGlmIHRoZSB0YXNrIG11c3QgYmUgZW5kZWQuXHJcbiAgICAgICAgaWYgKCF0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkgJiYgIXRhc2suSW5FbmRUYXNrICYmICF0YXNrLmlzQWJvcnRpbmcoKSkge1xyXG4gICAgICAgICAgLy8gQWZ0ZXIgdmlldyByZWZyZXNoLCB0aGUgc2VydmVyIGFsd2F5cyByZXR1cm5zIGN1cnIgcmVjIGFzIGZpcnN0IHJlYy5cclxuICAgICAgICAgIGlmIChpbnRFdnRDb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUkVGUkVTSF9WSUVXICYmICFmb3JtLmlzU2NyZWVuTW9kZSgpKSB7XHJcbiAgICAgICAgICAgIGR2LnNldFRvcFJlY0lkeCgwKTtcclxuICAgICAgICAgICAgaWYgKGZvcm0uSGFzVGFibGUoKSkge1xyXG4gICAgICAgICAgICAgIGZvcm0uY2xlYXJUYWJsZUNvbHVtblNvcnRNYXJrKHRydWUpO1xyXG4gICAgICAgICAgICAgIGF3YWl0IGZvcm0ucmVzdG9yZU9sZERpc3BsYXlMaW5lKGZvcm0ucmVjb3JkSWR4MkRpc3BsYXlMaW5lKGR2LmdldEN1cnJSZWNJZHgoKSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy8gQWZ0ZXIgcmVjb3JkIGhhcyBiZWVuIGZsdXNoZWQgaXQgaXMgbm90IGNvbnNpZGVyZWQgYSBuZXcgcmVjb3JkIGFueW1vcmUuXHJcbiAgICAgICAgICBpZiAoaW50RXZ0Q29kZSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1JFRlJFU0hfUkVDT1JEICYmIHRhc2suZ2V0TW9kZSgpICE9PSBDb25zdGFudHMuVEFTS19NT0RFX1FVRVJZICYmICF0YXNrLmdldEFmdGVyUmV0cnkoKSkge1xyXG4gICAgICAgICAgICBpZiAodGFzay5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKSB7XHJcbiAgICAgICAgICAgICAgdGFzay5zZXRNb2RlKENvbnN0YW50cy5UQVNLX01PREVfTU9ESUZZKTtcclxuICAgICAgICAgICAgICAoKDxEYXRhVmlldz50YXNrLkRhdGFWaWV3KS5nZXRDdXJyUmVjKCkpLnNldE9sZFJlYygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGF3YWl0IGR2LmN1cnJSZWNDb21wdXRlKHRydWUpO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChpbnRFdnRDb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUkVGUkVTSF9TQ1JFRU4gJiYgdGFzay5nZXRNb2RlKCkgIT09IENvbnN0YW50cy5UQVNLX01PREVfUVVFUlkgJiYgIXRhc2suZ2V0QWZ0ZXJSZXRyeSgpKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IGR2LmN1cnJSZWNDb21wdXRlKHRydWUpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vIFFDUiAjNDMwMDU5LiBJZiB0aGUgZm9jdXNlZCB0YXNrIGFuZCB0aGUgcmVmcmVzaGVkIHRhc2sgaXMgdGhlIHNhbWUgdGFzayBvclxyXG4gICAgICAgICAgLy8gdGhlIGZvY3VzZWQgdGFzayBpcyBhIGNoaWxkIG9mIHRoZSByZWZyZXNoZWQgdGFzaywgZ28gdG8gdGhlIGZpcnN0IGNvbnRyb2wgaW4gdGhlIGZpcnN0IGxpbmUuXHJcbiAgICAgICAgICAvLyBJZiB0aGUgZm9jdXNlZCB0YXNrIGlzIHRoZSBwYXJlbnQgdGFzaywgZG8gbm90IGxlYXZlIHRoZSBjdXJyZW50IGNvbnRyb2wuXHJcbiAgICAgICAgICB0aGlzLnNldElzSW5WaWV3UmVmcmVzaCh0cnVlKTtcclxuICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuICAgICAgICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpICYmICF0YXNrLmdldFByZXZlbnRDb250cm9sQ2hhbmdlKCkpIHtcclxuICAgICAgICAgICAgaWYgKCEodGFzayA9PT0gTGFzdEZvY3VzZWRNYW5hZ2VyLkluc3RhbmNlLmdldExhc3RGb2N1c2VkVGFzaygpIHx8ICF0YXNrLnBhdGhDb250YWlucyhMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCkpKSlcclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgR28gdG8gY3JlYXRlIG1vZGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFza1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjbWRzXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIGdvdG9DcmVhdGVNb2RlKHRhc2s6IFRhc2spOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBjbWQ6IElDbGllbnRDb21tYW5kO1xyXG4gICAgYXdhaXQgdGFzay5lbmFibGVNb2RlcygpO1xyXG4gICAgLy8gUUNSICM0MTc3MzMuIEV4ZWN1dGUgUlMncyBvZiB0aGUgbmVzdGVkIHN1YmZvcm1zIGlmIHRoZSBjdXJyZW50IHRhc2sgaXMgb25lIG9mIHRoZSBuZXN0ZWQgc3ViZm9ybXMuXHJcbiAgICBhd2FpdCB0YXNrLkV4ZWN1dGVOZXN0ZWRSUyhMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCkpO1xyXG4gICAgaWYgKCF0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpXHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKTtcclxuICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKSB7XHJcbiAgICAgIGNtZCA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZUV2ZW50Q29tbWFuZCh0YXNrLmdldFRhc2tUYWcoKSwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUT19DUkVBVEUpO1xyXG4gICAgICBhd2FpdCB0YXNrLkRhdGF2aWV3TWFuYWdlci5FeGVjdXRlKGNtZCk7XHJcbiAgICAgIGlmICh0YXNrLmdldExldmVsKCkgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spXHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG4gICAgICBhd2FpdCB0aGlzLkhhbmRsZU5vblBhcmthYmxlQ29udHJvbHModGFzayk7XHJcbiAgICAgIGF3YWl0IHRhc2suc2V0Q3JlYXRlRGVsZXRlQWN0c0VuYWJsZVN0YXRlKCk7XHJcbiAgICAgIHRhc2suc2V0T3JpZ2luYWxUYXNrTW9kZShDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSk7XHJcblxyXG4gICAgICBhd2FpdCB0aGlzLkhhbmRsZUFjdEVudGVyUm93RWRpdGluZyh0YXNrKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBkbyBzb21lIGRlZmF1bHQgb3BlcmF0aW9ucyBmb3IgYW4gZXZlbnQgYWZ0ZXIgYWxsIHRoZSBoYW5kbGVycyBmaW5pc2hlZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyY0JlZm9yZVwiPnRoZSBSQyByZXR1cm5lZCBmcm9tIHRoZSBjb21tb25IYW5kbGVyQmVmb3JlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInByb3BvZ2F0ZVwiPmlmIGV2ZW50IHdhcyBwcm9wb2dhdGVkPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIkV2ZW50XCI+dGhlIGV2ZW50IHRvIGhhbmRsZTwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBjb21tb25IYW5kbGVyQWZ0ZXIoZXZ0OiBSdW5UaW1lRXZlbnQsIHJjQmVmb3JlOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgdGFzazogVGFzayA9IDxUYXNrPmV2dC5nZXRUYXNrKCk7XHJcbiAgICBsZXQgZHY6IERhdGFWaWV3O1xyXG4gICAgbGV0IHJlYzogUmVjb3JkID0gbnVsbDtcclxuICAgIGxldCBjdHJsOiBNZ0NvbnRyb2w7XHJcbiAgICBsZXQgcmVjTW9kaWZpZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCByZWNNb2RlSXNEZWxldGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBmb3JjZVN1ZmZpeDogYm9vbGVhbjtcclxuXHJcbiAgICBpZiAodGhpcy5fc3RvcEV4ZWN1dGlvbiAmJiBldnQuZ2V0SW50ZXJuYWxDb2RlKCkgIT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYICYmIGV2dC5nZXRJbnRlcm5hbENvZGUoKSAhPT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfU1VGRklYKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgaWYgKGV2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfSU5URVJOQUwpIHtcclxuICAgICAgZHYgPSA8RGF0YVZpZXc+dGFzay5EYXRhVmlldztcclxuICAgICAgcmVjID0gZHYuZ2V0Q3VyclJlYygpO1xyXG4gICAgICBjdHJsID0gPE1nQ29udHJvbD5ldnQuQ29udHJvbDtcclxuXHJcbiAgICAgIHN3aXRjaCAoZXZ0LmdldEludGVybmFsQ29kZSgpKSB7XHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWDpcclxuICAgICAgICAgIGlmIChyY0JlZm9yZSkge1xyXG4gICAgICAgICAgICAvLyBoYW5kbGUgcmVjb3JkIHByZWZpeCBmb3IgdGhlIHN1YiB0YXNrcyB0b29cclxuICAgICAgICAgICAgaWYgKGF3YWl0IHRhc2suQ2hlY2tSZWZyZXNoU3ViVGFza3MoKSlcclxuICAgICAgICAgICAgICBhd2FpdCB0YXNrLmRvU3ViZm9ybVJlY1ByZWZpeFN1ZmZpeCgpO1xyXG4gICAgICAgICAgICBhd2FpdCB0YXNrLmhhbmRsZUV2ZW50T25TbGF2ZVRhc2tzKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuICAgICAgICAgICAgYXdhaXQgdGFzay5lbmFibGVNb2RlcygpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVg6XHJcbiAgICAgICAgICB0YXNrLmlzRmlyc3RSZWNvcmRDeWNsZShmYWxzZSk7XHJcbiAgICAgICAgICAvLyBPbmNlIGFyZSByZWFkeSB0byBlbmQgdGhlIFJTLCBpdCBtZWFucyB3ZSBjYW5ub3QgYmUgdGhlIEZJUlNUIHJlY29yZCBjeWNsZVxyXG4gICAgICAgICAgaWYgKHRhc2suZ2V0UHJldmVudFJlY29yZFN1ZmZpeCgpKSB7XHJcbiAgICAgICAgICAgIHRhc2suc2V0UHJldmVudFJlY29yZFN1ZmZpeChmYWxzZSk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyBRQ1IgIzExNTk1MS4gRXZlbiBpZiByZWNvcmQgc3VmZml4IGlzIG5vdCBleGVjdXRlZCwgaW4gdGhlIG5leHQgdGltZSBkbyBub3QgZXhlY3V0ZSBSUCAmIFJTIG9mIHRoZSBzdWJmb3JtLlxyXG4gICAgICAgICAgdGFzay5Eb1N1YmZvcm1QcmVmaXhTdWZmaXggPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICBpZiAodGhpcy5fc3RvcEV4ZWN1dGlvbikge1xyXG4gICAgICAgICAgICAvLyBRQ1IgIzk4NDAzMTogaWYgdGhlIGRlbGV0ZSBvcGVyYXRpb24gZmFpbGVkIGR1ZSB0byBcInZlcmlmeSBlcnJvclwiXHJcbiAgICAgICAgICAgIC8vIGluIHRoZSByZWNvcmQgc3VmZml4IHRoZW4gdGhlIHJlY29yZCBtb2RlIG11c3QgYmUgY2xlYXJlZFxyXG4gICAgICAgICAgICBpZiAocmVjLmdldE1vZGUoKSA9PT0gRGF0YU1vZGlmaWNhdGlvblR5cGVzLkRlbGV0ZSlcclxuICAgICAgICAgICAgICByZWMuY2xlYXJNb2RlKCk7XHJcbiAgICAgICAgICAgIC8vIFFjciA3ODMwMzkgOiBJZiB3ZSBhcmUgYWxyZWFkeSBpbiBjb250cm9sIGxldmVsIGl0IG1lYW5zIHRoYXQgY29udHJvbCBwcmVmaXggd2FzIGFscmVhZHkgZG9uZSBvciB0aGF0XHJcbiAgICAgICAgICAgIC8vIGNvbnRyb2wgc3VmZml4IHdhcyBub3QgZG9uZS4gRWl0aGVyIHdheSB0aGVyZSBpcyBubyBuZWVkIHRvIGRvIGNvbnRyb2wgcHJlZml4IGFnYWluLlxyXG4gICAgICAgICAgICBpZiAodGFzay5nZXRMZXZlbCgpICE9PSBDb25zdGFudHMuVEFTS19MRVZFTF9DT05UUk9MKSB7XHJcbiAgICAgICAgICAgICAgbGV0IGxhc3QgPSA8TWdDb250cm9sPnRoaXMuZ2V0U3RvcEV4ZWN1dGlvbkN0cmwoKTtcclxuICAgICAgICAgICAgICBpZiAobGFzdCA9PT0gbnVsbClcclxuICAgICAgICAgICAgICAgIGxhc3QgPSA8TWdDb250cm9sPnRhc2suZ2V0TGFzdFBhcmtlZEN0cmwoKTtcclxuXHJcbiAgICAgICAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uKGZhbHNlKTtcclxuICAgICAgICAgICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb25DdHJsKG51bGwpO1xyXG5cclxuICAgICAgICAgICAgICAvLyBRQ1IgNDI2MjgzIGlzIHdlIGhhdmUgYSBzdWItZm9ybSB0aGF0IHdhcyBuZXZlciBiZWVuIGVudGVyZWRcclxuICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgY29udHJvbCBsZXZlbCB3aWxsIG5vdCBiZSBlbnRlcmVkXHJcbiAgICAgICAgICAgICAgaWYgKGxhc3QgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgLy8gd2UgZG9ub3Qgd2FudCBDUyB0byBiZSBjYWxsZWQgYWdhaW4gZnJvbSBDUCBpbmNhc2Ugb2YgdmVyaWZ5IGVyciBpbiBDVlxyXG4gICAgICAgICAgICAgICAgdGFzay5zZXRMZXZlbChDb25zdGFudHMuVEFTS19MRVZFTF9SRUNPUkQpO1xyXG5cclxuICAgICAgICAgICAgICAgIGxldCBpbkN0cmxQcmVmaXg6IGJvb2xlYW4gPSB0YXNrLkluQ3RybFByZWZpeDtcclxuICAgICAgICAgICAgICAgIHRhc2suSW5DdHJsUHJlZml4ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoTWdDb250cm9sQmFzZShsYXN0LCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9QUkVGSVgpO1xyXG4gICAgICAgICAgICAgICAgdGFzay5JbkN0cmxQcmVmaXggPSBpbkN0cmxQcmVmaXg7XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAvLyBpbiB0aGUgZnV0dXJlIGNoZWNrIHRoZSBzdG9wRXhlY3V0aW9uIGZsYWcgaGVyZSB0b28gYW5kIGRpc3BsYXkgYVxyXG4gICAgICAgICAgICAgIC8vIGNvbmZpcm0gY2FuY2VsIGRpYWxvZyB0aGF0IHdpbGwgY2xvc2UgdGhlIGJyb3dzZXIgaWYgdGhlIHZhbHVlIGlzIHRydWVcclxuICAgICAgICAgICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb24odHJ1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gRGVmZWN0IDE1Mjg3MTogV2l0aCBuZXcgd2F5IG9mIGVkaXRpbmcgcm93LCBSUyBpcyBub3QgZmlyZWQgaW5maW5pdGVseSwgYnV0IHJvdyBzZWxlY3Rpb24gaXMgc2hpZnRlZCB0byBuZXcgcm93LiBBbHNvIHJvdyBsZWF2ZXMgZWRpdGluZyBtb2RlLlxyXG4gICAgICAgICAgICAvLyBTbyBlbnN1cmUgcm93IGVkaXRpbmcgaXMgbGVmdCB3aGVuIHRoZXJlIGlzIG5vIHZlcmlmeSBlcnJvciBhbmQgbm90IHVuY29uZGl0aW9uYWxseS5cclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5IYW5kbGVTdG9wUm93RWRpdGluZyh0YXNrKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAocmVjICE9IG51bGwpIHtcclxuICAgICAgICAgICAgcmVjTW9kaWZpZWQgPSByZWMuTW9kaWZpZWQ7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5fc3RvcEV4ZWN1dGlvbiAmJiByZWMuaXNDYXVzZUludmFsaWRhdGlvbigpKSB7XHJcbiAgICAgICAgICAgICAgKDxNZ0Zvcm0+dGFzay5nZXRGb3JtKCkpLmludmFsaWRhdGVUYWJsZSgpO1xyXG4gICAgICAgICAgICAgIHJlYy5zZXRDYXVzZUludmFsaWRhdGlvbihmYWxzZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmVjTW9kZUlzRGVsZXRlID0gKHJlYy5nZXRNb2RlKCkgPT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5EZWxldGUpO1xyXG5cclxuICAgICAgICAgICAgZm9yY2VTdWZmaXggPSBhd2FpdCB0YXNrLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9GT1JDRV9TVUZGSVgsIGZhbHNlKTtcclxuICAgICAgICAgICAgLy8gaWYgdGhlIHJlY29yZCBpcyBkZWxldGVkIHRoZW4gZXhlY3V0ZSB0aGUgXCJyZWMgc3VmZml4IGFmdGVyXCIgb25seVxyXG4gICAgICAgICAgICAvLyB3aGVuIHRoZSB0YXNrIG1vZGUgaXMgZGVsZXRlIChzZWNvbmQgcm91bmQpXHJcbiAgICAgICAgICAgIC8vIGluRGVsZXRlUHJvY2VzcyA6IGlmIHRoZXJlIGlzIGFuICdFTkQgVEFTSyBDT05EJyB3ZSB3aWxsIGhhdmUgYSAzcmQgY3ljbGUgaW4gcmVjb3JkIHN1ZmZpeCh3aGVuIHVwZCtkZWwgb3IgZm9yY2Ugc3VmZiArIGRlbCkuXHJcbiAgICAgICAgICAgIC8vIDFzdCBjeWNsZSA6IHVwZGFlIGN5Y2xlICh0YXNrIG1vZGUgd2lsbCBiZSB1cGRhdGUpLCAybmQgOiB0YXNrIG1vZGUgaXMgZGVsZXRlICwgdGhpcyBpcyB3aGVuIHdlIHNlbmQgdGhlIGRlbGV0ZSB0byB0aGUgc2VydmVyLlxyXG4gICAgICAgICAgICAvLyAzcmQgLSBzdWZmaXggdGhhdCBpcyBjYWxsZWQgZnJvbSB0aGUgZW5kVGFzay4gSW4gdGhlIDNyZCBjeWNsZSB0aGUgcmVjTW9kZUlzRGVsZXRlIHdpbGwgYmUgZmFsc2UgYWx0aG91Z2ggd2UgYXJlIHN0aWxsIGluIHRoZSBkZWxldGUgcHJvY2VzcyAod2UgYWxyZWFkeSBzZW50IHRoZSBkZWxldGUgb3BlcikuXHJcbiAgICAgICAgICAgIC8vIEEgY29tYmluYXRpb24gb2YgZm9yY2Ugc3VmZml4ICsgZW5kIHRhc2sgY29uZCArIGRlbCBsaW5lICwgd2lsbCBjcmFzaCB0aGUgc2VydmVyIG9uIHRoZSAzcmQgY3ljbGUgc2luY2Ugd2Ugd2lsbCBhc2sgZm9yIHVwZGF0ZSBvZmZcclxuICAgICAgICAgICAgLy8gYSByZWNvcmQgdGhhdCB0aGUgc2VydmVyIGhhZCBkZWxldGVkIG9uIHRoZSAybmQgY3ljbGUuIFRoYXQgaXQgd2h5IHdlIHVzZSAnaW5EZWxldGVQcm9jZXNzJywgc28gd2lsbCB3aWxsIGtub3cgbm90XHJcbiAgICAgICAgICAgIC8vIHRvIGFkZCB1cGRhdGUgb3BlciBvbiBhbiBhbHJlYWR5IGRlbGV0ZWQgcmVjb3JkLiAoUWNyICM3OTAyODMpLlxyXG4gICAgICAgICAgICAvLyAqIHRoZXJlIGlzIHN0aWxsIGEgcHJvYmxlbSBpbiAndXBkYXRlJyBhbmQgJ2luc2VydCcgd2l0aCAnZW5kIHRhc2sgY29uZCcgKyAnZm9yY2UnIDogYW4gZXh0cmEgdXBkYXRlIHdpbGwgYmUgc2VuZFxyXG4gICAgICAgICAgICAvLyAgIHRvIHRoZSBzZXJ2ZXIgb24gdGhlIHJlYyBzdWZmaXggb2YgdGhlIGVuZCB0YXNrLiBidXQgYXBhcnQgZnJvbSBzZXJ2ZXIgdXBkYXRlIGl0IGNhdXNlcyBubyByZWFsIHByb2JsZW0uXHJcbiAgICAgICAgICAgIGlmIChyZWNNb2RlSXNEZWxldGUgJiYgdGFzay5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfREVMRVRFIHx8XHJcbiAgICAgICAgICAgICAgIXJlY01vZGVJc0RlbGV0ZSAmJiAhcmVjLmluRGVsZXRlUHJvY2VzcygpICYmIChyZWNNb2RpZmllZCB8fCBmb3JjZVN1ZmZpeCkpIHtcclxuICAgICAgICAgICAgICByZWMuc2V0TW9kZShEYXRhTW9kaWZpY2F0aW9uVHlwZXMuVXBkYXRlKTtcclxuICAgICAgICAgICAgICBhd2FpdCBkdi5hZGRDdXJyVG9Nb2RpZmllZCgpO1xyXG4gICAgICAgICAgICAgIGR2LnNldENoYW5nZWQodHJ1ZSk7XHJcblxyXG4gICAgICAgICAgICAgIGlmIChyZWNNb2RpZmllZCAmJiB0YXNrLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9RVUVSWSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlYy5yZWFsTW9kaWZpZWQoKSAmJlxyXG4gICAgICAgICAgICAgICAgICAhRW52aXJvbm1lbnQuSW5zdGFuY2UuYWxsb3dVcGRhdGVJblF1ZXJ5TW9kZSh0YXNrLmdldENvbXBJZHgoKSkpIHtcclxuICAgICAgICAgICAgICAgICAgLy8gaWYgcmVhbCBmaWVsZHMgd2VyZSBtb2RpZmllZFxyXG4gICAgICAgICAgICAgICAgICBhd2FpdCBkdi5jYW5jZWxFZGl0KEV2ZW50c01hbmFnZXIuUkVBTF9PTkxZLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgIHRhc2suV3JpdGVUb01lc3NhZ2VQYW5lYnlNc2dJZChNc2dJbnRlcmZhY2UuUlRfU1RSX1VQREFURV9JTl9RVUVSWSk7XHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0ICg8TWdGb3JtPnRhc2suZ2V0Rm9ybSgpKS5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0NVUlJfUkVDKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIHdlIG11c3QgY29udGludWUgaGVyZSBhbmQgdHJ5IHRvIGNvbW1pdCB0aGUgdHJhbnNhY3Rpb24gYmVjYXVzZVxyXG4gICAgICAgICAgICAgICAgLy8gdGhlcmUgbWlnaHQgYmUgYWxzbyBzb21lIHN1YiB0YXNrcyB0byB0aGlzIHRhc2tcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIFFDUiM3NzYyOTU6IGZvciBwcmUgcmVjb3JkIHVwZGF0ZSwgY29tbWl0IHRoZSByZWNvcmQgYWZ0ZXIgaGFuZGxlcidzIGV4ZWN1dGlvbi5cclxuICAgICAgICAgICAgLy8gRml4ZWQgYnVnICM6MzA2OTI5LCBGb3JjZUV4aXRQcmUgaXMgcmVsZXZhbnQgb25seSBmb3IgdGhlIHRhc2sgdGhhdCByYWlzZWQgdGhlIGV2ZW50XHJcbiAgICAgICAgICAgIC8vIHNlZSBhbHNvIGJ1ZyM6MjkyODc2XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5pc0ZvcmNlRXhpdFByZVJlY29yZFVwZGF0ZSh0YXNrKSAmJlxyXG4gICAgICAgICAgICAgIC8vIERlZmVjdCAxNTQwNDcgOiBkbyBub3QgdHJ5IGFuZCBjb21taXQgaWYgdGFzayBpcyBhYm9ydGluZyBhbmQgd2FzIGFscmVhZHkgcmVtb3ZlZCAob3IgYWxsIE1HRCB3YXMgcmVtb3ZlZCkuXHJcbiAgICAgICAgICAgICAgKCF0YXNrLmlzQWJvcnRpbmcoKSB8fCBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLkdldFRhc2tCeUlEKHRhc2suZ2V0VGFza1RhZygpKSAhPSBudWxsKSkge1xyXG4gICAgICAgICAgICAgIGlmICgoIXJlY01vZGVJc0RlbGV0ZSB8fCB0YXNrLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9ERUxFVEUpKVxyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jb21taXRSZWNvcmQodGFzaywgZXZ0LnJldmVyc2libGVFeGl0KCkpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIXRhc2sudHJhbnNhY3Rpb25GYWlsZWQoQ29uc3RJbnRlcmZhY2UuVFJBTlNfUkVDT1JEX1BSRUZJWCkgJiYgIXRhc2suaXNBYm9ydGluZygpKSB7XHJcbiAgICAgICAgICAgICAgLy8gY2hlY2sgd2hldGhlciB0byBldmFsdWF0ZSB0aGUgZW5kIGNvbmRpdGlvbiBhZnRlciB0aGUgcmVjb3JkIHN1ZmZpeFxyXG4gICAgICAgICAgICAgIC8vIGluIGNhc2UgdGhlcmUgYXJlIDIgY3ljbGVzICh1cGRhdGUvZm9yY2Ugc3VmZml4ICsgZGVsZXRlKSwgZG8gdGhlIGVuZCB0YXNrIG9ubHkgaW4gdGhlIDJuZCBjeWNsZS5cclxuICAgICAgICAgICAgICBpZiAoKHJlYy5nZXRNb2RlKCkgPT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5EZWxldGUgJiZcclxuICAgICAgICAgICAgICAgIHRhc2suZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0RFTEVURSkgfHxcclxuICAgICAgICAgICAgICAgIHJlYy5nZXRNb2RlKCkgIT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5EZWxldGUpXHJcbiAgICAgICAgICAgICAgICBpZiAoYXdhaXQgdGFzay5ldmFsRW5kQ29uZChDb25zdEludGVyZmFjZS5FTkRfQ09ORF9FVkFMX0FGVEVSKSlcclxuICAgICAgICAgICAgICAgICAgYXdhaXQgdGFzay5lbmRUYXNrKHRydWUsIGZhbHNlLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gLy8gcmVjICE9IG51bGxcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1BSRUZJWDpcclxuICAgICAgICAgIGlmIChyY0JlZm9yZSkge1xyXG4gICAgICAgICAgICAvLyBjaGVjayBwYXJrYWJpbGl0eSBvbmNlIGFnYWluIGFzIHByb3BlcnR5IG1pZ2h0IGhhdmUgY2hhbmdlZCBpbiB0aGUgaGFuZGxlclxyXG4gICAgICAgICAgICAvLyA5MjQxMTIgLSBpZ25vcmUgZGlyZWN0aW9uIChpZiBmbGFnIHNldCkgYXMgd2UgYXJlIGZvcmNpbmcgcGFyayBpbnNwaXRlIG9mIGZhaWxlZCBkaXJlY3Rpb25cclxuICAgICAgICAgICAgLy8gUUNSIyA4MDYwMTU6IElmIHdlIGhhdmUgYSBzaW5nbGUgZmllbGQgd2l0aCBhbGxvdyBwYXJraW5nID0gWWVzIGFuZCBUYWIgSW50byA9IE5vLCB0aGVuIG9uIHByZXNzaW5nIHRhYiBpZiBjdXJzb3IgaXMgbm90XHJcbiAgICAgICAgICAgIC8vIG1vdmVkLCB3ZSBjb21lIHRvIHBhcmsgb24gbGFzdFBhcmtlZEN0cmwgKHdoaWNoIGlzIHNhbWUgYXMgY3RybCkgc2luY2UgVGFiSW50byBpcyBub3QgYWxsb3dlZC5cclxuICAgICAgICAgICAgLy8gU28gdG8gYXZhb2lkIGluZmluaXRlIHJlY3Vyc2lvbiwgd2Ugc2hvdWxkIG5vdCBhZ2FpbiB0cnkgdG8gcGFyayBvbiBpdC5cclxuICAgICAgICAgICAgaWYgKGF3YWl0IGN0cmwuSXNQYXJrYWJsZSgpIHx8IGN0cmwgPT09IExhc3RGb2N1c2VkTWFuYWdlci5nZXRMYXN0Rm9jdXNlZENvbnRyb2woKSkge1xyXG4gICAgICAgICAgICAgIC8vIHNldCBJbkNvbnRyb2wgdHJ1ZSBhZnRlciBDb250cm9sIFByZWZpeFxyXG4gICAgICAgICAgICAgIGN0cmwuSW5Db250cm9sID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKGN0cmwuU2hvdWxkUmVmcmVzaE9uQ29udHJvbEVudGVyKCkpXHJcbiAgICAgICAgICAgICAgICBhd2FpdCAoPEZpZWxkPmN0cmwuZ2V0RmllbGQoKSkudXBkYXRlRGlzcGxheSgpO1xyXG5cclxuICAgICAgICAgICAgICAvLyBpZiB0aGlzIGNvZGUgaXMgcmVhY2hlZCB0aGVuIGV2ZXJ5dGhpbmcgaXMgb2sgaW4gdGhlIGNvbnRyb2wgcHJlZml4XHJcbiAgICAgICAgICAgICAgLy8gdXNlciBoYW5kbGVyLiBOb3csIG1vdmUgdGhlIGZvY3VzIHRvIHRoZSBjb250cm9sLlxyXG4gICAgICAgICAgICAgIHRhc2suc2V0TGFzdFBhcmtlZEN0cmwoY3RybCk7XHJcbiAgICAgICAgICAgICAgLy8gd2UgaGF2ZSBwYXJrZWQgb24gYSBjdHJsIHNldCBjbGlja2VkIGN0cmwgdG8gbnVsbFxyXG4gICAgICAgICAgICAgIFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5DdXJyZW50Q2xpY2tlZEN0cmwgPSBudWxsO1xyXG5cclxuICAgICAgICAgICAgICAvLyB0byB0YWtlIGNhcmUgb2YgdGVtcG9yYXJ5IGVkaXRvclxyXG4gICAgICAgICAgICAgIC8vIE1hbmFnZXIuc2V0Rm9jdXMoY3RybCwgY3RybC5nZXREaXNwbGF5TGluZShmYWxzZSkpO1xyXG4gICAgICAgICAgICAgIGF3YWl0IGN0cmwuU2V0Rm9jdXMoY3RybCwgY3RybC5nZXREaXNwbGF5TGluZShmYWxzZSksIHRydWUpO1xyXG4gICAgICAgICAgICAgIC8vIHdlIGhhdmUgc3VjY2Vzc2Z1bGx5IHBhcmtlZCBvbiBhIGN0cmwsIHNldCBzZXRzdG9wZXhlY3V0aW9uQ3RybCB0byBudWxsXHJcbiAgICAgICAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uQ3RybChudWxsKTtcclxuXHJcbiAgICAgICAgICAgICAgTWdDb250cm9sLlJldHVyblRvQ3RybCA9IGN0cmw7XHJcbiAgICAgICAgICAgICAgdGFzay5JbkN0cmxQcmVmaXggPSBmYWxzZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICB0YXNrLkluQ3RybFByZWZpeCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuSGFuZGxlTm9uUGFya2FibGVDb250cm9scyhjdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfU1VGRklYOlxyXG4gICAgICAgICAgLy8gZGlzYWJsZSBhY3Rpb25zIGFuZCBzdGF0ZXMuIGRvIGl0IG9ubHkgaWYgd2UgYXJlIGdldHRpbmcgb3V0IG9mIHRoZSBjb250cm9sLlxyXG4gICAgICAgICAgaWYgKCF0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpIHtcclxuXHJcbiAgICAgICAgICAgIGlmIChjdHJsLmlzQ2hvaWNlQ29udHJvbCgpKSB7XHJcbiAgICAgICAgICAgICAgY3RybC5TZXRLZXlib2FyZExhbmd1YWdlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQlVUVE9OKVxyXG4gICAgICAgICAgICAgIHRhc2suQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0JVVFRPTiwgZmFsc2UpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRhc2suZ2V0RW5hYmxlWm9vbUhhbmRsZXIoKSB8fCBjdHJsLnVzZVpvb21IYW5kbGVyKCkpXHJcbiAgICAgICAgICAgICAgdGFzay5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfWk9PTSwgZmFsc2UpO1xyXG4gICAgICAgICAgICB0YXNrLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9FRFRfTlVMTCwgZmFsc2UpO1xyXG5cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAocmNCZWZvcmUpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSkge1xyXG4gICAgICAgICAgICAgIC8vIElmIGNvbnRyb2wgc3VmZml4IGdldCAnc3RvcCBleGVjdXRpb24nIChlLmcuIHZlcmlmeSBlcnJvciksIHRoZSBmb2N1cyB3aWxsIGJlIHJlbWFpbiBvbiBjdXJyZW50IGNvbnRyb2wuXHJcbiAgICAgICAgICAgICAgLy8gU28gc2V0IEluQ29udHJvbCB0byB0cnVlXHJcbiAgICAgICAgICAgICAgY3RybC5JbkNvbnRyb2wgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgICAgIC8vIFVwZGF0ZSBmaWVsZHMgdGhhdCBhcmUgYXNzaWduZWQgdG8gYSB0ZXh0IGNvbnRyb2wgYW5kIHdpdGggdHlwZSB0aGF0IGhhcyBkZWZhdWx0IGRpc3BsYXlcclxuICAgICAgICAgICAgLy8gdmFsdWUgKG51bWVyaWMsIGRhdGUsIHRpbWUsIGxvZ2ljYWwgZXRjKVxyXG4gICAgICAgICAgICBsZXQgZmxkOiBGaWVsZCA9IDxGaWVsZD5jdHJsLmdldEZpZWxkKCk7XHJcbiAgICAgICAgICAgIGlmIChmbGQgIT0gbnVsbCAmJiAoY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9URVhUKSlcclxuICAgICAgICAgICAgICBhd2FpdCBmbGQudXBkYXRlRGlzcGxheSgpO1xyXG5cclxuICAgICAgICAgICAgdGFzay5zZXRMZXZlbChDb25zdGFudHMuVEFTS19MRVZFTF9SRUNPUkQpO1xyXG4gICAgICAgICAgICBjdHJsLnNldEluQ29udHJvbFN1ZmZpeChmYWxzZSk7XHJcbiAgICAgICAgICAgIGN0cmwuSXNJbnRlcmFjdGl2ZVVwZGF0ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICBpZiAoY3RybC5Qcm9wZXJ0eUV4aXN0cyhQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DVVNUT01fVkFMSURBVE9SUykpXHJcbiAgICAgICAgICAgICAgYXdhaXQgY3RybC5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0NVU1RPTV9WQUxJREFUT1JTKS5SZWZyZXNoRGlzcGxheSh0cnVlKTtcclxuICAgICAgICAgICAgY3RybC5WYWxpZGF0ZUNvbnRyb2wgPSBmYWxzZTtcclxuICAgICAgICAgICAgTGFzdEZvY3VzZWRNYW5hZ2VyLnNldExhc3RGb2N1c2VkQ29udHJvbCh0YXNrLCBudWxsKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChhd2FpdCB0YXNrLmV2YWxFbmRDb25kKENvbnN0SW50ZXJmYWNlLkVORF9DT05EX0VWQUxfSU1NSURJQVRFKSlcclxuICAgICAgICAgICAgICBhd2FpdCB0YXNrLmVuZFRhc2sodHJ1ZSwgZmFsc2UsIGZhbHNlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQVNLX1BSRUZJWDpcclxuICAgICAgICAgIHRhc2suc2V0TGV2ZWwoQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSyk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEFTS19TVUZGSVg6XHJcbiAgICAgICAgICB0YXNrLnNldExldmVsKENvbnN0YW50cy5UQVNLX0xFVkVMX05PTkUpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIC8vIHNpbXVsYXRlcyB1c2VyIGFza2luZyBmb3IgdGhlIG5leHQgcmVjLlxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NZQ0xFX05FWFRfUkVDOlxyXG4gICAgICAgICAgbGV0IGZvcm0gPSA8TWdGb3JtPnRhc2suZ2V0Rm9ybSgpO1xyXG4gICAgICAgICAgaWYgKCF0YXNrLmlzTWFpblByb2coKSAmJiBmb3JtICE9IG51bGwpIHtcclxuICAgICAgICAgICAgYXdhaXQgZm9ybS5tb3ZlSW5WaWV3KGZvcm0uaXNMaW5lTW9kZSgpXHJcbiAgICAgICAgICAgICAgPyBDb25zdGFudHMuTU9WRV9VTklUX1JPV1xyXG4gICAgICAgICAgICAgIDogQ29uc3RhbnRzLk1PVkVfVU5JVF9QQUdFLFxyXG4gICAgICAgICAgICAgIENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9ORVhUKTtcclxuICAgICAgICAgICAgLy8gZW5kIG9mIGRhdGEgd2lsbCBzaWduYWwgdXMgdG8gZW5kIHRoZSB0YXNrICh1bmxlc3MgaW4gY3JlYXRlIG1vZGUpLlxyXG4gICAgICAgICAgICBpZiAodGFzay5nZXRFeGVjRW5kVGFzaygpKVxyXG4gICAgICAgICAgICAgIGF3YWl0IHRhc2suZW5kVGFzayh0cnVlLCBmYWxzZSwgZmFsc2UpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIC8vIGRlbGV0ZSByZWNvcmQgaW4gbm9uIGludGVyYWN0aXZlIHRhc2tcclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DWUNMRV9ORVhUX0RFTEVURV9SRUM6XHJcbiAgICAgICAgICAvLyBjaGVjayBlbXB0eSBkYXRhdmlldyBiZWZvcmUgdHJ5aW5nIHRvIGRlbGV0ZSwgaW4gY2FzZSB0YXNrIHN0YXJ0ZWQgd2l0aCBlbXB0eSBkYXRhdmlldy5cclxuICAgICAgICAgIGlmICh0YXNrLkRhdGFWaWV3LmlzRW1wdHlEYXRhdmlldygpKVxyXG4gICAgICAgICAgICAodGFzaykuc2V0RXhlY0VuZFRhc2soKTtcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5IYW5kbGVBY3Rpb25EZWxsaW5lKCB0YXNrLCBkdiwgcmVjLCB0cnVlKTtcclxuXHJcbiAgICAgICAgICAvLyBlbmQgb2YgZGF0YSB3aWxsIHNpZ25hbCB1cyB0byBlbmQgdGhlIHRhc2sgKHVubGVzcyBpbiBjcmVhdGUgbW9kZSkuXHJcbiAgICAgICAgICBpZiAodGFzay5nZXRFeGVjRW5kVGFzaygpKVxyXG4gICAgICAgICAgICBhd2FpdCB0YXNrLmVuZFRhc2sodHJ1ZSwgZmFsc2UsIGZhbHNlKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9TRVRfRVhURVJOQUxfVkFMVUU6XHJcbiAgICAgICAgICBsZXQgcmVmcmVzaERpc3BsYXkgOiBib29sZWFuID0gYXdhaXQgZXZ0LmdldEFyZ0xpc3QoKS5nZXRBcmdWYWx1ZSgxLCBTdG9yYWdlQXR0cmlidXRlLkJPT0xFQU4sIDApID09PSAnMScgPyB0cnVlIDogZmFsc2U7XHJcbiAgICAgICAgICBhd2FpdCAoPE1nQ29udHJvbD5jdHJsKS52YWxpZGF0ZUFuZFNldFZhbHVlSWZBbGxvd2VkKGV2dC5nZXRWYWx1ZSgpLCByZWZyZXNoRGlzcGxheSk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjcmVhdGVzIGEgbm9uIHJldmVyc2libGUgZXZlbnQgYW5kIGhhbmRsZSBpdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0YXNrXCI+YSByZWZlcmVuY2UgdG8gdGhlIHRhc2sgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImV2ZW50Q29kZVwiPnRoZSBjb2RlIG9mIHRoZSBldmVudCA8L3BhcmFtPlxyXG4gIGFzeW5jIGhhbmRsZU5vblJldmVyc2libGVFdmVudCh0YXNrOiBUYXNrQmFzZSwgZXZlbnRDb2RlOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudCh0YXNrKTtcclxuICAgIGxldCBleGl0Q29tbWFuZDogYm9vbGVhbiA9IChldmVudENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FWElUIHx8IGV2ZW50Q29kZSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NMT1NFKTtcclxuXHJcbiAgICBydEV2dC5zZXRJbnRlcm5hbChldmVudENvZGUpO1xyXG5cclxuICAgIGlmIChleGl0Q29tbWFuZClcclxuICAgICAgdGhpcy5faXNOb25SZXZlcnNpYmxlRXhpdCA9IHRydWU7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgcnRFdnQuc2V0Tm9uUmV2ZXJzaWJsZUV4aXQoKTtcclxuICAgICAgcnRFdnQuc2V0Q3RybCg8TWdDb250cm9sPnRhc2suZ2V0TGFzdFBhcmtlZEN0cmwoKSk7XHJcbiAgICAgIHJ0RXZ0LnNldEFyZ0xpc3QobnVsbCk7XHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRXZlbnQocnRFdnQsIGZhbHNlKTtcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIGlmIChleGl0Q29tbWFuZClcclxuICAgICAgICB0aGlzLl9pc05vblJldmVyc2libGVFeGl0ID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY3JlYXRlcyBhIG5ldyBpbnRlcm5hbCBFdmVudCBhbmQgaGFuZGxlIGl0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRhc2tcIj5hIHJlZmVyZW5jZSB0byB0aGUgdGFzazwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJldmVudENvZGVcIj50aGUgY29kZSBvZiB0aGUgZXZlbnQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaXNRdWl0XCI+aW5kaWNhdGVzIHdoZXRoZXIgTUdfQUNUX0NBTkNFTCBpcyBjYWxsZWQgZnJvbSBNR19BQ1RfUlRfUVVJVDwvcGFyYW0+XHJcbiAgYXN5bmMgaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrQW5kRXZlbnRTdWJ0eXBlKHRhc2s6IFRhc2tCYXNlLCBldmVudENvZGU6IG51bWJlciwgZXZlbnRTdWJUeXBlOiBFdmVudFN1YlR5cGUpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBsYXN0UGFya2VkQ3RybDogTWdDb250cm9sID0gPE1nQ29udHJvbD50YXNrLmdldExhc3RQYXJrZWRDdHJsKCk7XHJcbiAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudDtcclxuXHJcbiAgICBpZiAoZXZlbnRDb2RlIDwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RPVF9DTlQgJiYgdGFzayAhPSBudWxsICYmICEoZXZlbnRTdWJUeXBlID09PSBFdmVudFN1YlR5cGUuQ2FuY2VsSXNRdWl0KSAmJiAhdGFzay5BY3Rpb25NYW5hZ2VyLmlzRW5hYmxlZChldmVudENvZGUpKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgaWYgKGxhc3RQYXJrZWRDdHJsICE9PSBudWxsKVxyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoTWdDb250cm9sKGxhc3RQYXJrZWRDdHJsLCBldmVudENvZGUsIGV2ZW50U3ViVHlwZSk7XHJcblxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmIChldmVudENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9RVUlUKVxyXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrQW5kRXZlbnRTdWJ0eXBlKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DQU5DRUwsIEV2ZW50U3ViVHlwZS5DYW5jZWxJc1F1aXQpO1xyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBydEV2dCA9IG5ldyBSdW5UaW1lRXZlbnQodGFzayk7XHJcbiAgICAgICAgcnRFdnQuc2V0SW50ZXJuYWwoZXZlbnRDb2RlKTtcclxuICAgICAgICBydEV2dC5TZXRFdmVudFN1YlR5cGUoZXZlbnRTdWJUeXBlKTtcclxuICAgICAgICBpZiAoSW50ZXJuYWxJbnRlcmZhY2UuQnVpbHRpbkV2ZW50KGV2ZW50Q29kZSkpXHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUV2ZW50KHJ0RXZ0LCBmYWxzZSk7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5jb21tb25IYW5kbGVyKHJ0RXZ0KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNyZWF0ZXMgYSBuZXcgaW50ZXJuYWwgRXZlbnQgYW5kIGhhbmRsZSBpdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsXCI+YSByZWZlcmVuY2UgdG8gdGhlIGNvbnRyb2w8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZXZlbnRDb2RlXCI+dGhlIGNvZGUgb2YgdGhlIGV2ZW50PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlzUXVpdFwiPmluZGljYXRlcyB3aGV0aGVyIE1HX0FDVF9DQU5DRUwgaXMgY2FsbGVkIGZyb20gTUdfQUNUX1JUX1FVSVQ8L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhNZ0NvbnRyb2woY3RybDogTWdDb250cm9sLCBldmVudENvZGU6IG51bWJlciwgZXZlbnRTdWJUeXBlOiBFdmVudFN1YlR5cGUpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50O1xyXG5cclxuICAgIGlmIChldmVudENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9RVUlUKVxyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoTWdDb250cm9sKGN0cmwsIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DQU5DRUwsIEV2ZW50U3ViVHlwZS5DYW5jZWxJc1F1aXQpO1xyXG4gICAgZWxzZSB7XHJcbiAgICAgIHJ0RXZ0ID0gbmV3IFJ1blRpbWVFdmVudChjdHJsKTtcclxuICAgICAgcnRFdnQuc2V0SW50ZXJuYWwoZXZlbnRDb2RlKTtcclxuICAgICAgcnRFdnQuU2V0RXZlbnRTdWJUeXBlKGV2ZW50U3ViVHlwZSk7IC8vICh1c2UgZm9yIGFjdF9jYW5jZWwgJiBhY3RfcnRfdmlld19yZWZyZXNoXHJcbiAgICAgIC8vIGJhc2ljYWxseSBNR19BQ1RfVklFV19SRUZSRVNIIHJlcHJlc2VudCB0aGUgdmlldyByZWZyZXNoIGV2ZW50IHJhaXNlZCBieSB0aGUgdXNlclxyXG4gICAgICAvLyBob3dldmVyIHdlIHVzZSBpbnRlcm5hbGx5IGluIHRoZSBjb2RlIHRvIHJlZnJlc2ggdGhlIGRpc3BsYXkgKG1haW5seSBpbiBzdWIgZm9ybXMgcmVmcmVzaGVzKVxyXG4gICAgICAvLyBpbiBvcmRlciB0aGUgZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGUgcmVhbCB1c2UgYW5kIHRoZSBpbnRlcm5hbCB1c2Ugd2Ugc2V0IHRoaXMgZmxhZyB0byBmYWxzZVxyXG4gICAgICAvLyB3ZSBuZWVkIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gdGhlIHR3byBzaW5jZSB3ZSBtYWtlIGRpZmZlcmVudCBhY3Rpb25zIHdoZW4gY2FjaGluZyBhIHN1YmZvcm1cclxuICAgICAgaWYgKGV2ZW50Q29kZSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1JFRlJFU0hfVklFVylcclxuICAgICAgICBydEV2dC5zZXRJc1JlYWxSZWZyZXNoKGZhbHNlKTtcclxuXHJcbiAgICAgIGlmIChJbnRlcm5hbEludGVyZmFjZS5CdWlsdGluRXZlbnQoZXZlbnRDb2RlKSlcclxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUV2ZW50KHJ0RXZ0LCBmYWxzZSk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBhd2FpdCB0aGlzLmNvbW1vbkhhbmRsZXIocnRFdnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIGN1cnJlbnQgZmllbGRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldEN1cnJGaWVsZCgpOiBGaWVsZCB7XHJcbiAgICByZXR1cm4gdGhpcy5fY3VyckZpZWxkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgY3VycmVudCBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRDdXJyQ3RybCgpOiBNZ0NvbnRyb2wge1xyXG4gICAgcmV0dXJuIHRoaXMuX2N1cnJDdHJsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIGN1cnJlbnQgdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0Q3VyclRhc2soKTogVGFzayB7XHJcbiAgICBpZiAodGhpcy5fY3VyckZpZWxkID09IG51bGwpXHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgcmV0dXJuIDxUYXNrPnRoaXMuX2N1cnJGaWVsZC5nZXRUYXNrKCk7XHJcbiAgfVxyXG5cclxuICBzZXRTdG9wRXhlY3V0aW9uKHN0b3A6IGJvb2xlYW4pOiB2b2lkO1xyXG4gIHNldFN0b3BFeGVjdXRpb24oc3RvcDogYm9vbGVhbiwgY2xlYXJFdmVudHNPblN0b3BFeGVjdXRpb24gOiBDbGVhckV2ZW50c09uU3RvcEV4ZWN1dGlvbik6IHZvaWQgO1xyXG4gIHNldFN0b3BFeGVjdXRpb24oc3RvcDogYm9vbGVhbiwgY2xlYXJFdmVudHNPblN0b3BFeGVjdXRpb24/IDogQ2xlYXJFdmVudHNPblN0b3BFeGVjdXRpb24pOiB2b2lkIHtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKVxyXG4gICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb25fMChzdG9wKTtcclxuICAgIGVsc2VcclxuICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uXzEoc3RvcCwgY2xlYXJFdmVudHNPblN0b3BFeGVjdXRpb24pO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgXCJzdG9wIGV4ZWN1dGlvblwiIGZsYWcgdG8gdHJ1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBzZXRTdG9wRXhlY3V0aW9uXzAoc3RvcDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uKHN0b3AsIENsZWFyRXZlbnRzT25TdG9wRXhlY3V0aW9uLkFMTCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSBcInN0b3AgZXhlY3V0aW9uXCIgZmxhZyB0byB0cnVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIHNldFN0b3BFeGVjdXRpb25fMShzdG9wOiBib29sZWFuLCBjbGVhckV2ZW50c09uU3RvcEV4ZWN1dGlvbjogQ2xlYXJFdmVudHNPblN0b3BFeGVjdXRpb24pOiB2b2lkIHtcclxuICAgIGlmIChzdG9wKVxyXG4gICAgICBpZiAoY2xlYXJFdmVudHNPblN0b3BFeGVjdXRpb24gPT0gQ2xlYXJFdmVudHNPblN0b3BFeGVjdXRpb24uQUxMKVxyXG4gICAgICAgIHRoaXMuX2V2ZW50c1F1ZXVlLmNsZWFyKCk7XHJcbiAgICAgIGVsc2UgaWYoY2xlYXJFdmVudHNPblN0b3BFeGVjdXRpb24gPT0gQ2xlYXJFdmVudHNPblN0b3BFeGVjdXRpb24uU0VSVkVSKSB7XHJcbiAgICAgICAgbGV0IHRtcFZlYyA9IG5ldyBMaXN0PFJ1blRpbWVFdmVudD4oKTtcclxuICAgICAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudDtcclxuICAgICAgICBsZXQgaTogbnVtYmVyO1xyXG5cclxuICAgICAgICAvLyBXZSB3ZXJlIHJlcXVlc3RlZCB0byBsZWF2ZSB0aGUgXCJzZXJ2ZXIgZXZlbnRzXCIgaW4gdGhlIHF1ZXVlLlxyXG4gICAgICAgIC8vIERvIGl0LCBidXQgYWxzbyByZW1vdmUgdGhlIFwicHJvdGVjdGlvblwiIGZyb20gdGhlc2UgZXZlbnRzIHNvIG5leHRcclxuICAgICAgICAvLyB0aW1lIHdlIG5lZWQgdG8gY2xlYXIgdGhlIHF1ZXVlIHRoZXkgd2lsbCBhbHNvIGJlIGRlbGV0ZWQuXHJcbiAgICAgICAgd2hpbGUgKCF0aGlzLl9ldmVudHNRdWV1ZS5pc0VtcHR5KCkpIHtcclxuICAgICAgICAgIHJ0RXZ0ID0gPFJ1blRpbWVFdmVudD50aGlzLl9ldmVudHNRdWV1ZS5wb2xsKCk7XHJcbiAgICAgICAgICBpZiAocnRFdnQuaXNGcm9tU2VydmVyKCkpIHtcclxuICAgICAgICAgICAgcnRFdnQucmVzZXRGcm9tU2VydmVyKCk7XHJcbiAgICAgICAgICAgIHRtcFZlYy5wdXNoKHJ0RXZ0KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCB0bXBWZWMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgICB0aGlzLl9ldmVudHNRdWV1ZS5wdXQodG1wVmVjLmdldF9JdGVtKGkpKTtcclxuICAgICAgfVxyXG4gICAgdGhpcy5fc3RvcEV4ZWN1dGlvbiA9IHN0b3A7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSBjdHJsIG9uIHdoaWNoIHdlIGhhZCBhIFwic3RvcCBleGVjdXRpb25cIlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0U3RvcEV4ZWN1dGlvbkN0cmwoY3RybDogTWdDb250cm9sKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fc3RvcEV4ZWN1dGlvbkN0cmwgPT09IG51bGwgfHwgY3RybCA9PT0gbnVsbClcclxuICAgICAgdGhpcy5fc3RvcEV4ZWN1dGlvbkN0cmwgPSBjdHJsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGRlbGV0ZSB0aGUgY3VycmVudCByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFza1wiPnRoZSB0YXNrIHRvIHJlZmVyIHRvIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpbkZvcmNlRGVsXCI+dHJ1ZSBpZiB0aGUgZGVsZXRlIGlzIGRvbmUgYmVjYXVzZSBvZiBmb3JjZSBkZWxldGUgPC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIGRlbEN1cnJSZWModGFzazogVGFzaywgaW5Gb3JjZURlbDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGR2OiBEYXRhVmlldyA9IDxEYXRhVmlldz50YXNrLkRhdGFWaWV3O1xyXG5cclxuICAgIHRhc2suc2V0TW9kZShDb25zdGFudHMuVEFTS19NT0RFX01PRElGWSk7XHJcblxyXG4gICAgLy8gZGVsZXRlIHRoZSByZWNvcmQgYW5kIHJ1biByZWNvcmQgc3VmZml4IGZvciB0aGUgbmV3IGN1cnJlbnQgcmVjb3JkXHJcbiAgICBhd2FpdCAoPE1nRm9ybT50YXNrLmdldEZvcm0oKSkuZGVsQ3VyclJlYygpO1xyXG5cclxuICAgIC8vIG5vIGN1cnItcmVjID09PiB3ZSBkZWxldGVkIHRoZSBsYXN0IHJlY29yZCBhbmQgZmFpbGVkIHRvIGNyZWF0ZSBhIG5ldyBvbmUgKGUuZy5cclxuICAgIC8vIENSRUFURSBtb2RlIGlzIG5vdCBhbGxvd2VkKSA9PT4gZW5kIHRoZSB0YXNrLiBBbiBleGNlcHRpb24gdG8gdGhlIHJ1bGUgaXMgd2hlblxyXG4gICAgLy8gd2UgYXJlIGFscmVhZHkgaW4gdGhlIHByb2Nlc3Mgb2YgY3JlYXRpbmcgYSByZWNvcmQuXHJcbiAgICBpZiAoIXRhc2suRGF0YVZpZXcuaXNFbXB0eURhdGF2aWV3KCkpIHtcclxuICAgICAgaWYgKGR2LmdldEN1cnJSZWNJZHgoKSA+PSAwKSB7XHJcbiAgICAgICAgLy8gUUNSICM2NTY0OTU6IElmIHdlIGdvdCB0byB0aGlzIHBvaW50IGFuZCB0aGUgY3VycmVudCByZWNvcmQgaXMgc3RpbGwgdGhlXHJcbiAgICAgICAgLy8gZGVsZXRlZCBvbmUgdGhlbiB0aGUgcmVjb3JkIHByZWZpeCB3aWxsIGJlIGhhbmRsZWQgZWxzZXdoZXJlLlxyXG4gICAgICAgIGlmICgoZHYuZ2V0Q3VyclJlYygpKS5nZXRNb2RlKCkgIT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5EZWxldGUgJiYgIWluRm9yY2VEZWwpIHtcclxuICAgICAgICAgIGxldCBjdHJsOiBNZ0NvbnRyb2wgPSA8TWdDb250cm9sPnRhc2suZ2V0TGFzdFBhcmtlZEN0cmwoKTtcclxuICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuICAgICAgICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKVxyXG4gICAgICAgICAgICBpZiAoY3RybCA9PT0gbnVsbClcclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLkhhbmRsZU5vblBhcmthYmxlQ29udHJvbHModGFzayk7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoTWdDb250cm9sQmFzZShjdHJsLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9QUkVGSVgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmICghdGFzay5nZXRJbkNyZWF0ZUxpbmUoKSlcclxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZU5vblJldmVyc2libGVFdmVudCh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRVhJVCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBhd2FpdCB0aGlzLkhhbmRsZU5vblBhcmthYmxlQ29udHJvbHModGFzayk7XHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcHJvY2VzcyB1c2VycyBjb25maXJtYXRpb25cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFza1wiPnRvIGNoZWNrIGNvbmZpcm0gdXBkYXRlPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRydWUgLSBwcm9jZXNzIGNvbW1hbmQsIGZhbHNlIC0gc3RvcCBjb21tYW5kIHByb2Nlc3Npbmc8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVDb25maXJtZWQodGFzazogVGFzayk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IGNvbmZpcm06IGJvb2xlYW47XHJcbiAgICBsZXQgYW5zd2VyOiBzdHJpbmc7XHJcbiAgICBsZXQgYW5zOiBudW1iZXI7XHJcblxyXG4gICAgaWYgKHRhc2sgPT0gbnVsbClcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIGNvbmZpcm0gPSBhd2FpdCB0YXNrLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DT05GSVJNX1VQREFURSwgZmFsc2UpO1xyXG4gICAgaWYgKCF0aGlzLl9pc0luUmVjb3JkRmx1c2hFdmVudCAmJiBjb25maXJtICYmICF0YXNrLkRhdGFTeW5jZWQpIHtcclxuICAgICAgYW5zID0gYXdhaXQgR1VJTWFuYWdlci5JbnN0YW5jZS5jb25maXJtKE1zZ0ludGVyZmFjZS5DUkZfU1RSX0NPTkZfVVBELFxyXG4gICAgICAgIFN0eWxlcy5NU0dCT1hfSUNPTl9RVUVTVElPTiB8IFN0eWxlcy5NU0dCT1hfQlVUVE9OX1lFU19OT19DQU5DRUwpO1xyXG4gICAgICBpZiAoYW5zID09PSBTdHlsZXMuTVNHQk9YX1JFU1VMVF9ZRVMpXHJcbiAgICAgICAgYW5zd2VyID0gJ1knO1xyXG4gICAgICAvLyBZZXNcclxuICAgICAgZWxzZSBpZiAoYW5zID09PSBTdHlsZXMuTVNHQk9YX1JFU1VMVF9OTylcclxuICAgICAgICBhbnN3ZXIgPSAnTic7XHJcbiAgICAgIC8vIE5vXHJcbiAgICAgIGVsc2VcclxuICAgICAgICBhbnN3ZXIgPSAnQyc7IC8vIENhbmNlbFxyXG4gICAgfSBlbHNlXHJcbiAgICAgIGFuc3dlciA9ICdZJztcclxuXHJcbiAgICBzd2l0Y2ggKGFuc3dlcikge1xyXG4gICAgICBjYXNlICdZJzpcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgJ04nOlxyXG4gICAgICAgIGF3YWl0ICg8TWdGb3JtPnRhc2suZ2V0Rm9ybSgpKS5jYW5jZWxFZGl0KGZhbHNlLCBmYWxzZSk7XHJcbiAgICAgICAgYXdhaXQgKDxNZ0Zvcm0+dGFzay5nZXRGb3JtKCkpLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfQ1VSUl9SRUMpO1xyXG4gICAgICAgIHRhc2suQ29uZmlybVVwZGF0ZU5vID0gdHJ1ZTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7IC8vIG5vdCBjb250aW51ZSByZWNvcmQgc3VmZml4XHJcblxyXG4gICAgICBjYXNlICdDJzpcclxuICAgICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb24odHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uQ3RybChMYXN0Rm9jdXNlZE1hbmFnZXIuZ2V0TGFzdEZvY3VzZWRDb250cm9sKCkpO1xyXG4gICAgICAgIGF3YWl0IEZvY3VzTWFuYWdlci5TZXRGb2N1cyhMYXN0Rm9jdXNlZE1hbmFnZXIuZ2V0TGFzdEZvY3VzZWRDb250cm9sKCksIC0xKTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7IC8vIHN0b3AgZXZlbnQgcHJvY2Vzc2luZ1xyXG5cclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coJ2luIENsaWVudE1hbmFnZXIuSW5zdGFuY2UudXBkYXRlQ29uZmlybWVkKCkgaWxsZWdhbCBjb25maXJtYXRpb24gY29kZTogJyArXHJcbiAgICAgICAgICBjb25maXJtKTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFNldCB0aGUgb3JkZXIgb2YgaGFuZGxpbmcgbWFpbiBwcm9ncmFtcyBvZiBjb21wb25lbnRzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXRDb21wTWFpblByZ1RhYihjb21wTWFpblByZ1RhYmxlOiBDb21wTWFpblByZ1RhYmxlKTogdm9pZCB7XHJcbiAgICB0aGlzLl9jb21wTWFpblByZ1RhYiA9IGNvbXBNYWluUHJnVGFibGU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IGVuZCBvZiB3b3JrIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldEVuZE9mV29yayhlbmRPZldvcmtfOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl9lbmRPZldvcmsgPSBlbmRPZldvcmtfO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCBlbmQgb2Ygd29yayBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRFbmRPZldvcmsoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZW5kT2ZXb3JrO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgb3JkZXIgb2YgaGFuZGxpbmcgbWFpbiBwcm9ncmFtcyBvZiBjb21wb25lbnRzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRDb21wTWFpblByZ1RhYigpOiBDb21wTWFpblByZ1RhYmxlIHtcclxuICAgIHJldHVybiB0aGlzLl9jb21wTWFpblByZ1RhYjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIHJldmVyc2libGUgZXhpdCBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpbk5vblJldmVyc2libGVFeGl0KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lzTm9uUmV2ZXJzaWJsZUV4aXQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcHVzaCBhIHJ1bnRpbWUgZXZlbnQgdG8gdGhlIHN0YWNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJ0RXZ0XCI+dGhlIHJ1bnRpbWUgZXZlbnQgdG8gcHVzaCBvbiB0aGUgc3RhY2s8L3BhcmFtPlxyXG4gIHB1c2hSdEV2ZW50KHJ0RXZ0OiBSdW5UaW1lRXZlbnQpOiB2b2lkIHtcclxuICAgIHRoaXMuX3J0RXZlbnRzLnB1c2gocnRFdnQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHBvcCBhIHJ1bnRpbWUgZXZlbnQgZnJvbSB0aGUgc3RhY2sgYW5kIHJldHVybiBpdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcG9wUnRFdmVudCgpOiBSdW5UaW1lRXZlbnQge1xyXG4gICAgaWYgKHRoaXMuX3J0RXZlbnRzLmNvdW50KCkgPT09IDApXHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgcmV0dXJuIDxSdW5UaW1lRXZlbnQ+dGhpcy5fcnRFdmVudHMucG9wKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc3RvcmUgdGhlIGxhc3Qgc2F2ZWQgcm91dGUgZXZlbnQgb24gbG9jYWwgc3RvcmFnZS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHN0b3JlTGFzdFNhdmVkUm91dGVFdmVudE9uTG9jYWxTdG9yYWdlKCk6IHZvaWRcclxuICB7XHJcbiAgICBsZXQgZGF0YVN0b3JhZ2UgPSB3aW5kb3cubG9jYWxTdG9yYWdlO1xyXG4gICAgaWYgKHRoaXMuZ2V0TGFzdFNhdmVkUm91dGVFdmVudCgpICE9IG51bGwpXHJcbiAgICB7XHJcbiAgICAgIGxldCBydEV2dCA9IHRoaXMuZ2V0TGFzdFNhdmVkUm91dGVFdmVudCgpO1xyXG5cclxuICAgICAgZGF0YVN0b3JhZ2Uuc2V0SXRlbShDb25zdEludGVyZmFjZS5MQVNUX1JPVVRFX0VWRU5ULCAnMScpO1xyXG4gICAgICBkYXRhU3RvcmFnZS5zZXRJdGVtKENvbnN0SW50ZXJmYWNlLkxBU1RfUk9VVEVfRVZFTlRfU1JDX1RTSywgSlNPTi5zdHJpbmdpZnkoKDxUYXNrPnJ0RXZ0LmdldFRhc2soKSkuVGFza0RlZmluaXRpb25JZCkpO1xyXG5cclxuICAgICAgaWYgKHJ0RXZ0LmdldEFyZ0xpc3QoKS5nZXRTaXplKCkgPiAwKSB7XHJcbiAgICAgICAgbGV0IHN0cjogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7XHJcbiAgICAgICAgcnRFdnQuZ2V0QXJnTGlzdCgpLmJ1aWxkWE1MKHN0cik7XHJcbiAgICAgICAgZGF0YVN0b3JhZ2Uuc2V0SXRlbShDb25zdEludGVyZmFjZS5MQVNUX1JPVVRFX0VWRU5UX0FSR19MSVNULCAgc3RyLnRvU3RyaW5nKCkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVzdG9yZSB0aGUgbGFzdCBzYXZlZCByb3V0ZSBldmVudCBmcm9tIGxvY2FsIHN0b3JhZ2UuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICByZXN0b3JlTGFzdFNhdmVkUm91dGVFdmVudEZyb21Mb2NhbFN0b3JhZ2UoKTogdm9pZFxyXG4gIHtcclxuICAgIC8vZ2V0IHJvdXRlIGV2ZW50IGlmIHN0b3JlZCBvbiBsb2NhbCBzdG9yYWdlXHJcbiAgICBsZXQgZGF0YVN0b3JhZ2UgPSB3aW5kb3cubG9jYWxTdG9yYWdlO1xyXG5cclxuICAgIGxldCBsYXN0Um91dGVFdmVudCA9IGRhdGFTdG9yYWdlLmdldEl0ZW0oQ29uc3RJbnRlcmZhY2UuTEFTVF9ST1VURV9FVkVOVCk7XHJcblxyXG4gICAgaWYgKGxhc3RSb3V0ZUV2ZW50ID09PSAnMScpIHtcclxuICAgICAgbGV0IHNyY1Rhc2tEZWZpbml0aW9uU3RyID0gZGF0YVN0b3JhZ2UuZ2V0SXRlbShDb25zdEludGVyZmFjZS5MQVNUX1JPVVRFX0VWRU5UX1NSQ19UU0spO1xyXG4gICAgICBsZXQgcm91dGVBcmdMaXN0U3RyID0gZGF0YVN0b3JhZ2UuZ2V0SXRlbShDb25zdEludGVyZmFjZS5MQVNUX1JPVVRFX0VWRU5UX0FSR19MSVNUKTtcclxuXHJcbiAgICAgIC8vIHBhcnNlIHNyY1Rhc2tEZWZpbml0aW9uU3RyIGFuZCBwcmVwYXJlIHRhc2tEZWZpbml0aW9uSWRcclxuICAgICAgbGV0IHRhc2tEZWZpbml0aW9uSWQgPSBuZXcgVGFza0RlZmluaXRpb25JZCgpO1xyXG4gICAgICB0YXNrRGVmaW5pdGlvbklkLmZyb21KU09OKHNyY1Rhc2tEZWZpbml0aW9uU3RyKTtcclxuXHJcbiAgICAgIC8vc2VhcmNoIHNvdXJjZSB0YXNrIGluIG5ld2x5IGxvYWRlZCB0YXNrIHRyZWUgYnkgdGFza0RlZmluaXRpb25JZFxyXG4gICAgICBsZXQgc3JjVGFzayA9IE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuZ2V0Q3Vyck1HRGF0YSgpLmdldFRhc2tCeVRhc2tEZWZpbml0aW9uSUQodGFza0RlZmluaXRpb25JZCk7XHJcbiAgICAgIGxldCBhcmdzID0gbnVsbDtcclxuICAgICAgaWYgKHJvdXRlQXJnTGlzdFN0ciAhPSBudWxsKSB7XHJcbiAgICAgICAgYXJncyA9IG5ldyBBcmd1bWVudHNMaXN0KCk7XHJcbiAgICAgICAgYXJncy5maWxsTGlzdChyb3V0ZUFyZ0xpc3RTdHIsIHNyY1Rhc2spO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBFdmVudHNNYW5hZ2VyLkluc3RhbmNlLkFkZExhc3RTYXZlZFJvdXRlRXZlbnQoc3JjVGFzaywgYXJncyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIHRoZSBsYXN0IHNhdmVkIHJvdXRlIGV2ZW50LlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0TGFzdFNhdmVkUm91dGVFdmVudCgpOiBSdW5UaW1lRXZlbnQge1xyXG4gICAgICByZXR1cm4gdGhpcy5sYXN0U2F2ZWRSb3V0ZUV2ZW50O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgc2F2ZSB0aGUgbGFzdCByb3V0ZSBldmVudC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldExhc3RTYXZlZFJvdXRlRXZlbnQgKHJ0RXZ0OlJ1blRpbWVFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKHJ0RXZ0ID09IG51bGwpXHJcbiAgICAgIHRoaXMubGFzdFNhdmVkUm91dGVFdmVudCA9IG51bGw7XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMubGFzdFNhdmVkUm91dGVFdmVudCA9IHJ0RXZ0LnJlcGxpY2F0ZSgpO1xyXG4gIH1cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIHRoZSBydW50aW1lIGV2ZW50IGxvY2F0ZWQgb24gdGhlIHRvcCBvZiB0aGUgc3RhY2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldExhc3RSdEV2ZW50KCk6IFJ1blRpbWVFdmVudCB7XHJcbiAgICBpZiAodGhpcy5fcnRFdmVudHMuY291bnQoKSA9PT0gMClcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICByZXR1cm4gPFJ1blRpbWVFdmVudD50aGlzLl9ydEV2ZW50cy5wZWVrKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSB2YWx1ZSBvZiBhIGZsYWcgd2hpY2ggaW5kaWNhdGVzIHdoZXRoZXIgd2Ugc2hvdWxkIGlnbm9yZSB1bmtub3duIGNvbW1hbmRzXHJcbiAgLy8vICAgYXJyaXZpbmcgZnJvbSB0aGUgZW5naW5lLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0SWdub3JlVW5rbm93bkFib3J0KHZhbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5faWdub3JlVW5rbm93bkFib3J0ID0gdmFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBcImlnbm9yZSB1bmtub3duIGFib3J0XCIgZmxhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaWdub3JlVW5rbm93bkFib3J0KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lnbm9yZVVua25vd25BYm9ydDtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVjb3ZlciBmcm9tIGEgZmFpbHVyZSB0byBvdmVybGF5IGEgdGFzay4gV2hlbiB0aGUgc2VydmVyIG9yZGVycyB0aGUgY2xpZW50IHRvIHJ1biBhXHJcbiAgLy8vICAgbmV3IHRhc2sgaW4gYSBmcmFtZSB3aGljaCBhbHJlYWR5IGNvbnRhaW5zIGFuIGFjdGl2ZSB0YXNrLCB0aGUgY2xpZW50IHRyaWVzIHRvIHRlcm0gdGhlXHJcbiAgLy8vICAgZXhpc3RpbmcgdGFzayBhbmQgcmVwbGFjZSBoaW0uIFdoZW4gdGhpcyBhY3Rpb24gZmFpbHMsIHRoZSBjbGllbnQgaGFzIHRvIGFzayB0aGUgc2VydmVyXHJcbiAgLy8vICAgdG8gdGVybWluYXRlIHRoZSBORVcgVEFTSywgYW5kIGlnbm9yZSB0aGUgb3ZlcmxheSBhY3Rpb24uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRhc2tpZFwiPi0gdGhlIGlkIG9mIHRoZSBORVcgVEFTSzwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJtZ2RcIj4gICAtIHRoZSBNR0RhdGEgb2YgdGhlIE9MRCBUQVNLLjwvcGFyYW0+XHJcbiAgYXN5bmMgZmFpbFRhc2tPdmVybGF5KHRhc2tJZDogc3RyaW5nLCBtZ2Q6IE1HRGF0YSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGNtZDogSUNsaWVudENvbW1hbmQ7XHJcblxyXG4gICAgaWYgKHRhc2tJZCAhPT0gbnVsbCkge1xyXG4gICAgICAvLyBUaGUgc2VydmVyIHdpbGwgcmV0dXJuIHVzICdhYm9ydCcgY29tbWFuZHMgZm9yIHRoZSBuZXcgdGFzay4gSWdub3JlIHRoZW0sIHNpbmNlIGl0IHdhc250IHN0YXJ0ZWQgeWV0XHJcbiAgICAgIHRoaXMuc2V0SWdub3JlVW5rbm93bkFib3J0KHRydWUpO1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNtZCA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZU5vblJldmVyc2libGVFeGl0Q29tbWFuZCh0YXNrSWQsIGZhbHNlKTtcclxuICAgICAgICBtZ2QuQ21kc1RvU2VydmVyLkFkZChjbWQpO1xyXG4gICAgICAgIGF3YWl0IFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLkdldEluc3RhbmNlKCkuRXhlY3V0ZShDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2VuZGluZ0luc3RydWN0aW9uLlRBU0tTX0FORF9DT01NQU5EUyk7XHJcbiAgICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgdGhpcy5zZXRJZ25vcmVVbmtub3duQWJvcnQoZmFsc2UpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyBUUlVFIGlmIGN1cnJlbnQgZXZlbnQgc2hvdWxkIGJlIHByb3BvZ3RhdGVkIHRvIGFsbCB0YXNrcyBpbiBhIHNwZWNpZmljIHRyYW5zYWN0aW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpc0V2ZW50U2NvcGVUcmFucygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9ldmVudFNjb3BlID09PSBFdmVudFNjb3BlLlRSQU5TO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCBldmVudCBzY29wZSB0byBUUkFOU0FDVElPTlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0RXZlbnRTY29wZVRyYW5zKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fZXZlbnRTY29wZSA9IEV2ZW50U2NvcGUuVFJBTlM7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IGV2ZW50IHNjb3BlIHRvIE5PTiBUUkFOU0FDVElPTlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgY2xlYXJFdmVudFNjb3BlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fZXZlbnRTY29wZSA9IEV2ZW50U2NvcGUuTk9ORTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGltZSBvZiBmaXN0IGV2ZW50IGluIHNlcXVlbmNlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHRpbWUgb2YgZml0c3QgZXZlbnQgaW4gc2VxdWVuY2U8L3JldHVybnM+XHJcbiAgR2V0RXZlbnRUaW1lKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fZXZlbnRzUXVldWUuR2V0VGltZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0YXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImtiSXRtXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRoZSBsYXN0IGVuYWJsZWQgYWN0aW9uIGZvciB0aGUgc3BlY2lmaWMga2V5IChpbiBrYkl0ZW0pPC9yZXR1cm5zPlxyXG4gIC8vLyA8Y2hlY2tBY2Nlc3NLZXlJbk1lbnVzOj4gIGlmIHRvIGNoZWNrIHRoZSBrZXlib2FyZCBpbiB0aGUgbWVudSA8L2NoZWNrQWNjZXNzS2V5SW5NZW51czo+XHJcbiAgcHVibGljIGdldE1hdGNoaW5nQWN0aW9uKCAga2JJdG06IEtleWJvYXJkSXRlbSk6IG51bWJlciB7XHJcblxyXG4gICAgbGV0IGFjdDogbnVtYmVyID0gMDtcclxuICAgIC8vIHdoZW4gbWVudSBpcyBkZWZpbmUgd2l0aCBubyBrZXlib2FyZCBkZWZpbmUsIHRoZSBrYkl0ZW0gaXMgcmV0dXJuIG51bGw7XHJcbiAgICBpZiAoa2JJdG0gPT0gbnVsbClcclxuICAgICAgcmV0dXJuIGFjdDtcclxuXHJcblxyXG4gICAgLy8gVGhlcmUgd2FzIG5vIGtiZCBtYXBwaW5nIHRoZSB0aGF0IGtleSwgYnV0IGl0IHN0aWxsIGJlbG9uZ3MgdG8gYW4gYWN0aW9uLlxyXG4gICAgLy8gc2VlIGlmIHRoZSBrYkl0bSBob2xkIGFuIGFjdGlvbiAob3JpZ2luYWxseSBtYWRlIGZvciBNR19BQ1RfQ0hBUikuXHJcbiAgICBpZiAoYWN0ID09PSAwKSB7XHJcbiAgICAgIC8vIGlmIG1lbnUgd2FzIGZvdW5kIGFuZCBpdCBpcyBpbnRlcm5hbCBldmVudCBwdXQgYWN0aW9uIHRvIHRoZSBxdWV1ZSBvbmx5IGlmIHRoZXJlIHdhcyBubyBrYmQgbWFwcGluZyB0aGUgdGhhdCBrZXkuXHJcbiAgICAgIGlmIChrYkl0bS5nZXRBY3Rpb24oKSAhPT0gMClcclxuICAgICAgICBhY3QgPSBrYkl0bS5nZXRBY3Rpb24oKTtcclxuICAgICAgLy8gdGhpcyBpcyBvbmx5IFRFTVAgaGFyZGNvZGVkLiB0aGUgYWN0aW9uIHdpbGwgbmVlZCB0byBiZSBpbiB0aGUga2V5Ym9hcmQgbWFwcGluZ1xyXG4gICAgICAvLyBhbHNvIGEgY2hhbmdlIHRvIHRoZSBvbmxpbmUgKGlmIHRpbWUgcGVybWl0cykgYWxzbyB0byB0dXJuIHRoZSB0b2dnbGUgaW5zZXJ0IGludG8gYW4gYWN0LlxyXG4gICAgICBlbHNlIGlmIChrYkl0bS5nZXRLZXlDb2RlKCkgPT09IDQ1ICYmIGtiSXRtLmdldE1vZGlmaWVyKCkgPT09IE1vZGlmaWVycy5NT0RJRklFUl9OT05FICYmIGtiSXRtLmdldFN0YXRlcygpID09PSAwKVxyXG4gICAgICAgIGFjdCA9IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UT0dHTEVfSU5TRVJUO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiAoYWN0KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXR0ZXIgZm9yIHRoZSBleGVjU3RhY2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIGN1cnJlbnQgZXhlY3V0aW9uIHN0YWNrPC9yZXR1cm5zPlxyXG4gIGdldEV4ZWNTdGFjaygpOiBFeGVjdXRpb25TdGFjayB7XHJcbiAgICByZXR1cm4gPEV4ZWN1dGlvblN0YWNrPnRoaXMuX2V4ZWNTdGFjay5wZWVrKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcHVzaGVzIG9uZSBlbnRyeSBvZiBhbiBvcGVyYXRpb24gaW50byB0aGUgZXhlY3V0aW9uIHN0YWNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRhc2tJZFwiPi0gdGhlIGlkIG9mIHRoZSBjdXJyZW50IHRhc2s8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaGFuZGxlcklkXCI+LSB0aGUgaWQgb2YgdGhlIGhhbmRsZXIgd2hpY2ggaG9sZHMgdGhlIHJhaXNlIGV2ZW50IGNvbW1hbmQgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm9wZXJJZHhcIj4tIHRoZSBpZHggb2YgdGhlIGNvbW1hbmQgd2hpY2ggY3JlYXRlZCBhbiBleGVjdXRpb24gc3RhY2sgZW50cnkgKHJhaXNlIGV2ZW50IG9mIGZ1bmN0aW9uIGNhbGwpPC9wYXJhbT5cclxuICBwdXNoRXhlY1N0YWNrKHRhc2tJZDogc3RyaW5nLCBoYW5kbGVySWQ6IHN0cmluZywgb3BlcklkeDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAoPEV4ZWN1dGlvblN0YWNrPnRoaXMuX2V4ZWNTdGFjay5wZWVrKCkpLnB1c2goTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5nZXRUYXNrSWRCeUlkKHRhc2tJZCksIGhhbmRsZXJJZCwgb3BlcklkeCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcG9wcyBvbmUgZW50cnkgZnJvbSB0aGUgZXhlY3V0aW9uIHN0YWNrIC0gYWZ0ZXIgdGhlIGNvbXBsZXRpb24gb2YgYW4gb3BlcmF0aW9uIHdoaWNoIGNhbiBob2xkXHJcbiAgLy8vICAgb3RoZXIgb3BlcmF0aW9uc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgZW50cnkgdGhhdCB3YXMgcG9wcGVkPC9yZXR1cm5zPlxyXG4gIHBvcEV4ZWNTdGFjaygpOiBFeGVjdXRpb25TdGFja0VudHJ5IHtcclxuICAgIHJldHVybiAoPEV4ZWN1dGlvblN0YWNrPnRoaXMuX2V4ZWNTdGFjay5wZWVrKCkpLnBvcCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHB1c2ggYSBuZXcgZW50cnkgdG8gdGhlIHN0YWNrIG9mIHNlcnZlciBleGVjIHN0YWNrcyAtIHRoaXMgaXMgdG8gZGVmZXIgb3BlcmF0aW9ucyB0aGF0IHNob3VsZCBub3RcclxuICAvLy8gICBnZXQgaW5mbHVlbmNlcyBieSB0aGUgY3VycmVudCBzZXJ2ZXIgZXhlY3V0aW9uIHN0YWNrIC0gd2hlbiBwZXJmb3JtaW5nIHRoZSByZWNvcmQgcHJlZml4IG9mIGEgdGFza1xyXG4gIC8vLyAgIHRoYXQgd2FzIGp1c3QgcmV0dXJuZWQgZnJvbSB0aGUgc2VydmVyLCBvciB3aGVuIGNhbGxpbmcgYSBtb2RhbCB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwdXNoTmV3RXhlY1N0YWNrcygpOiB2b2lkIHtcclxuICAgIHRoaXMuX3NlcnZlckV4ZWNTdGFjay5wdXNoKG51bGwpO1xyXG4gICAgdGhpcy5fZXhlY1N0YWNrLnB1c2gobmV3IEV4ZWN1dGlvblN0YWNrKCkpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHBvcHMgdGhlIG5ldyBlbnRyeSBmcm9tIHRoZSBzdGFjayBvZiBzZXJ2ZXIgZXhlY3V0aW9uIHN0YWNrcyB3aGVuIHRoZSBzZXF1ZW5jZSB0aGF0IG5lZWRzIHRvIGF2b2lkXHJcbiAgLy8vICAgY3VycmVudCBzZXJ2ZXIgZXhlY3V0aW9uIHN0YWNrIGhhcyBlbmRlZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcG9wTmV3RXhlY1N0YWNrcygpOiB2b2lkIHtcclxuICAgIHRoaXMuX3NlcnZlckV4ZWNTdGFjay5wb3AoKTtcclxuICAgIHRoaXMuX2V4ZWNTdGFjay5wb3AoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwdXNoZXMgYW4gZXhlY3V0aW9uIHN0YWNrIGVudHJ5IGludG8gdGhlIHNlcnZlciBleGVjIHN0YWNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRhc2tJZFwiPi0gdGhlIGlkIG9mIHRoZSB0YXNrIGluIHRoZSBlbnRyeTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJoYW5kbGVySWRcIj4tIGhhbmRsZXIgaWQgb2YgdGhlIGVudHJ5PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm9wZXJJZHhcIj4tIGlkeCBvZiB0aGUgb3BlcmF0aW9uIHdoaWNoIHRoZSBlbnRyeSByZWZlcnMgdG88L3BhcmFtPlxyXG4gIHB1c2hTZXJ2ZXJFeGVjU3RhY2sodGFza0lkOiBzdHJpbmcsIGhhbmRsZXJJZDogc3RyaW5nLCBvcGVySWR4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9zZXJ2ZXJFeGVjU3RhY2sucGVlaygpID09PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuX3NlcnZlckV4ZWNTdGFjay5wb3AoKTtcclxuICAgICAgdGhpcy5fc2VydmVyRXhlY1N0YWNrLnB1c2gobmV3IEV4ZWN1dGlvblN0YWNrKCkpO1xyXG4gICAgfVxyXG5cclxuICAgICg8RXhlY3V0aW9uU3RhY2s+dGhpcy5fc2VydmVyRXhlY1N0YWNrLnBlZWsoKSkucHVzaCh0YXNrSWQsIGhhbmRsZXJJZCwgb3BlcklkeCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2xlYXJzIHRoZSBzZXJ2ZXIgZXhlY3V0aW9uIHN0YWNrIGFmdGVyIHdlIGZvdW5kIHRoZSBjb3JyZWN0IG5leHQgb3BlcmF0aW9uIHRoYXQgd2UgbmVlZCB0byBjb250aW51ZSBmcm9tXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBjbGVhclNlcnZlckV4ZWNTdGFjaygpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9zZXJ2ZXJFeGVjU3RhY2sucGVlaygpICE9PSBudWxsKSB7XHJcbiAgICAgICg8RXhlY3V0aW9uU3RhY2s+dGhpcy5fc2VydmVyRXhlY1N0YWNrLnBlZWsoKSkuY2xlYXIoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXZlcnNlIHRoZSBzZXJ2ZXIgZXhlY3V0aW9uIHN0YWNrIC0gd2UgZ2V0IGl0IGZyb20gdGhlIHNlcnZlciBhbmQgcHVzaCBpdCBpbiB0aGUgc2FtZSBvcmRlclxyXG4gIC8vLyAgIGl0IGlzIHdyaXR0ZW4gaW4gdGhlIG1lc3NhZ2UsIHdoaWNoIGFjdHVhbGx5IG1lYW5zIHdlIGhhdmUgdG8gcmV2ZXJzZSBpdCBpbiBvcmRlciB0byBoYW5kbGUgaXQgY29ycmVjdGx5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICByZXZlcnNlU2VydmVyRXhlY1N0YWNrKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3NlcnZlckV4ZWNTdGFjay5wZWVrKCkgIT09IG51bGwpXHJcbiAgICAgICg8RXhlY3V0aW9uU3RhY2s+dGhpcy5fc2VydmVyRXhlY1N0YWNrLnBlZWsoKSkucmV2ZXJzZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNhbGN1bGF0ZSBhY2NvcmRpbmcgdG8gdGhlIHNlcnZlcidzIGV4ZWN1dGlvbiBzdGFjayBhbmQgdGhlIGN1cnJlbnQgZXhlY3V0aW9uIHN0YWNrIG9uIHRoZSBjbGllbnQgK1xyXG4gIC8vLyAgIHRoZSBjdXJyZW50IG9wZXJhdGlvbiB3aGljaCB3ZSBhcmUgb24sIHdoaWNoIGlzIHRoZSBuZXh0IG9wZXJhdGlvbiB0aGF0IHdlIG5lZWQgdG8gZXhlY3V0ZVxyXG4gIC8vLyAgIGluIHRoZSBjdXJyZW50IGhhbmRsZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwib3BlclwiPi0gdGhlIG9wZXJhdGlvbiB3aGljaCB3ZSBhcmUgY3VycmVudGx5IG9uPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNsZWFyV2hlbkZvdW5kXCI+aW5kaWNhdGVzIHdoZXRoZXIgd2Ugc2hvdWxkIGNsZWFyIHRoZSBzZXJ2ZXIgc3RhY2sgd2hlbiB3ZSByZWFjaCBpdHMgZW5kLFxyXG4gIC8vLyAgIG9yIGlmIHdlIGp1c3QgdXNpbmcgdGhpcyBtZXRob2QgdG8gY2hlY2sgd2hhdCB0aGUgbmV4dCBvcGVyYXRpb24gaXNcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+cyB0aGUgbmV4dCBvcGVyYXRpb24gdGhhdCBzaG91bGQgYmUgZXhlY3V0ZWQgYnkgdGhlIGNsaWVudFxyXG4gIC8vLyAgIGlmIGl0IHJldHVybnMgLTEgdGhlbiB0aGUgY2xpZW50IHNob3VsZCBjb250aW51ZSBhcyB1c3VhbFxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgZ2V0TmV4dE9wZXJJZHgob3BlcjogT3BlcmF0aW9uLCBjbGVhcldoZW5Gb3VuZDogYm9vbGVhbik6IG51bWJlciB7XHJcbiAgICBsZXQgdG1wU2VydmVyRXhlY1N0YWNrRW50cnk6IEV4ZWN1dGlvblN0YWNrRW50cnkgPSBudWxsO1xyXG4gICAgbGV0IG5leHRPcGVySWR4OiBudW1iZXIgPSAtMTtcclxuXHJcbiAgICAvLyBpZiB0aGUgc2VydmVyIGV4ZWMgc3RhY2sgaXMgZW1wcnkgaXQgbWVhbnMgd2UgZGlkIG5vdCByZXR1cm4gZnJvbSB0aGUgc2VydmVyLFxyXG4gICAgLy8gc28gd2UgaGF2ZSB0byBjb250aW51ZSB3aXRoIGV4ZWN1dGluZyB0aGUgZm9sbG93aW5nIG9wZXJhdGlvbiBpbiB0aGUgY3VycmVudCBoYW5kbGVyIGFzIHVzdWFsXHJcbiAgICBpZiAodGhpcy5fc2VydmVyRXhlY1N0YWNrLmNvdW50KCkgIT09IDAgJiYgdGhpcy5fc2VydmVyRXhlY1N0YWNrLnBlZWsoKSAhPT0gbnVsbCAmJiAhKDxFeGVjdXRpb25TdGFjaz50aGlzLl9zZXJ2ZXJFeGVjU3RhY2sucGVlaygpKS5lbXB0eSgpKSB7XHJcbiAgICAgIC8vIGlmIHRoZSBzZXJ2ZXIncyBleGVjIHN0YWNrIGlzIGRlZXBlciB0aGFuIHRoZSBjbGllbnQncyAtXHJcbiAgICAgIC8vIHdlIG5lZWQgdG8gY2hlY2sgdGhlIGVudHJ5IGluIHRoZSBjbGllbnQncyBzdGFjayB3aGljaCBjb3JyZXNwb25kcyB0byB0aGUgc2VydmVyJ3Mgc3RhY2sgc2l6ZVxyXG4gICAgICBpZiAoKDxFeGVjdXRpb25TdGFjaz50aGlzLl9zZXJ2ZXJFeGVjU3RhY2sucGVlaygpKS5zaXplKCkgPiAoPEV4ZWN1dGlvblN0YWNrPnRoaXMuX2V4ZWNTdGFjay5wZWVrKCkpLnNpemUoKSkge1xyXG4gICAgICAgIC8vIHdlIGNvcHkgdGhlIHNlcnZlcidzIGV4ZWN1dGlvbiBzdGFjayBhbmQgcG9wIGZyb20gaXQgdW50aWwgdGhlIHNpemUgb2YgdGhlIHNlcnZlclxyXG4gICAgICAgIC8vIGFuZCB0aGUgY2xpZW50IGlzIHRoZSBzYW1lXHJcbiAgICAgICAgbGV0IHRtcFNlcnZlckV4ZWNTdGFjazogRXhlY3V0aW9uU3RhY2sgPSBuZXcgRXhlY3V0aW9uU3RhY2soPEV4ZWN1dGlvblN0YWNrPnRoaXMuX3NlcnZlckV4ZWNTdGFjay5wZWVrKCkpO1xyXG4gICAgICAgIHdoaWxlICh0bXBTZXJ2ZXJFeGVjU3RhY2suc2l6ZSgpID4gKDxFeGVjdXRpb25TdGFjaz50aGlzLl9leGVjU3RhY2sucGVlaygpKS5zaXplKCkpIHtcclxuICAgICAgICAgIHRtcFNlcnZlckV4ZWNTdGFja0VudHJ5ID0gdG1wU2VydmVyRXhlY1N0YWNrLnBvcCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gaWYgYWxsIGVudHJpZXMgYmVmb3JlIHRoZSBsYXN0IG9uZSB3ZSBwb3BwZWQgYXJlIHRoZSBzYW1lIGFzIGluIHRoZSBjbGllbnQgYW5kXHJcbiAgICAgICAgLy8gdGhlIGN1cnJlbnQgZW50cnkgaXMgb24gdGhlIHNhbWUgaGFuZGxlciBhcyB0aGUgc2VydmVyJ3MgbGFzdCBlbnRyeSxcclxuICAgICAgICAvLyBhbmQgdGhlIG9wZXJhdGlvbiBpcyBhZnRlciB0aGUgY3VycmVudCBvcGVyYXRpb24sXHJcbiAgICAgICAgLy8gdGhlbiB0aGlzIGVudHJ5IGluIHRoZSBzZXJ2ZXIgaW5kaWNhdGVzIHdoaWNoIGlzIG91ciBuZXh0IG9wZXJhdGlvblxyXG4gICAgICAgIGlmICh0aGlzLl9leGVjU3RhY2sucGVlaygpLkVxdWFscyh0bXBTZXJ2ZXJFeGVjU3RhY2spICYmIHRtcFNlcnZlckV4ZWNTdGFja0VudHJ5LlRhc2tJZCA9PT0gb3Blci5nZXRUYXNrVGFnKCkgJiYgdG1wU2VydmVyRXhlY1N0YWNrRW50cnkuSGFuZGxlcklkID09PSBvcGVyLmdldEhhbmRsZXJJZCgpICYmIHRtcFNlcnZlckV4ZWNTdGFja0VudHJ5Lk9wZXJJZHggPj0gb3Blci5nZXRTZXJ2ZXJJZCgpKSB7XHJcbiAgICAgICAgICBuZXh0T3BlcklkeCA9IHRtcFNlcnZlckV4ZWNTdGFja0VudHJ5Lk9wZXJJZHg7XHJcblxyXG4gICAgICAgICAgLy8gaWYgdGhlIHNlcnZlciBleGVjIHN0YWNrIGlzIGRlZXBlciB0aGFuIHRoZSBjbGllbnQncyBieSBvbmx5IDEsXHJcbiAgICAgICAgICAvLyB3aGljaCBtZWFucyB3ZSBhcmUgY2hlY2tpbmcgdGhlIHRvcCBtb3N0IGVudHJ5IG9uIHRoZSBzZXJ2ZXIncyBleGVjdXRpb24gc3RhY2ssXHJcbiAgICAgICAgICAvLyB0aGUgd2hvbGUgc3RhY2sgaXMgdGhlIHNhbWUgbm93LCBzbyB3ZSBjYW4gY2xlYXIgdGhlIHNlcnZlcidzIHN0YWNrIC1cclxuICAgICAgICAgIC8vIHdlIGdvdCB0byB0aGUgcG9pbnQgd2hpY2ggd2UgYXJlIG9uIHRoZSBleGFjdCBvcGVyYXRpb24gd2hpY2ggdGhlIHNlcnZlciBsZWZ0IGV4ZWN1dGlvbi5cclxuICAgICAgICAgIGlmIChjbGVhcldoZW5Gb3VuZCAmJiAoPEV4ZWN1dGlvblN0YWNrPnRoaXMuX3NlcnZlckV4ZWNTdGFjay5wZWVrKCkpLnNpemUoKSA9PT0gKDxFeGVjdXRpb25TdGFjaz50aGlzLl9leGVjU3RhY2sucGVlaygpKS5zaXplKCkgKyAxKSB7XHJcbiAgICAgICAgICAgICg8RXhlY3V0aW9uU3RhY2s+dGhpcy5fc2VydmVyRXhlY1N0YWNrLnBlZWsoKSkuY2xlYXIoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2VcclxuICAgICAgICAgIG5leHRPcGVySWR4ID0gRXZlbnRzTWFuYWdlci5NQVhfT1BFUjtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBuZXh0T3BlcklkeCA9IEV2ZW50c01hbmFnZXIuTUFYX09QRVI7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBuZXh0T3BlcklkeDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIHByb2Nlc3NpbmdUb3BNb3N0RW5kVGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpblByb2Nlc3NpbmdUb3BNb3N0RW5kVGFza1wiPjwvcGFyYW0+XHJcbiAgc2V0UHJvY2Vzc2luZ1RvcE1vc3RFbmRUYXNrKGluUHJvY2Vzc2luZ1RvcE1vc3RFbmRUYXNrOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl9wcm9jZXNzaW5nVG9wTW9zdEVuZFRhc2sgPSBpblByb2Nlc3NpbmdUb3BNb3N0RW5kVGFzaztcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSBwcm9jZXNzaW5nVG9wTW9zdEVuZFRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldFByb2Nlc3NpbmdUb3BNb3N0RW5kVGFzaygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9wcm9jZXNzaW5nVG9wTW9zdEVuZFRhc2s7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSBBbGxvd0V2ZW50c1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJBbGxvd0V2ZW50c1wiPjwvcGFyYW0+XHJcbiAgc2V0QWxsb3dFdmVudHMoQWxsb3dFdmVudHM6IEV2ZW50c0FsbG93ZWRUeXBlKTogdm9pZCB7XHJcbiAgICB0aGlzLl9hbGxvd0V2ZW50cyA9IEFsbG93RXZlbnRzO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgQWxsb3dFdmVudHMgZm9yIGEgbm9uIGludGVyYWN0aXZlIHRhc2suXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIkFsbG93RXZlbnRzXCI+PC9wYXJhbT5cclxuICBzZXROb25JbnRlcmFjdGl2ZUFsbG93RXZlbnRzKEFsbG93RXZlbnRzOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAoQWxsb3dFdmVudHMpXHJcblxyXG4gICAgICB0aGlzLl9hbGxvd0V2ZW50cyA9IEV2ZW50c0FsbG93ZWRUeXBlLk5PTl9JTlRFUkFDVElWRTtcclxuICAgIC8vIFFDUiAjODAyNDk1LCBUaGUgRm9ybXMgQ29udHJvbGxlciBtZWNoYW5pc20gaXMgZGlzYWJsZSBpZiB3ZSBhcmUgaW4gTm9uIGludGVyYWN0aXZlIHRhc2sgd2l0aCBBbGxvd0V2ZW50cyA9IHRydWUgYW5kIE9wZW4gV2luZG93ID0gdHJ1ZVxyXG5cclxuICAgIGVsc2VcclxuICAgICAgdGhpcy5fYWxsb3dFdmVudHMgPSBFdmVudHNBbGxvd2VkVHlwZS5OT05FO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgQWxsb3dFdmVudHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwid2l0aGluTm9uSW50ZXJhY3RpdmVMb29wXCI+PC9wYXJhbT5cclxuICBnZXRBbGxvd0V2ZW50cygpOiBFdmVudHNBbGxvd2VkVHlwZSB7XHJcbiAgICByZXR1cm4gdGhpcy5fYWxsb3dFdmVudHM7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgUmV0dXJuIFRSVUUgaWYgbm8gZXZlbnRzIGFyZSBhbGxvd2VkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIE5vRXZlbnRzQWxsb3dlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9hbGxvd0V2ZW50cyA9PT0gRXZlbnRzQWxsb3dlZFR5cGUuTk9ORTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjaGVjayBhbmQgZXhlY3V0ZSBjb250cm9sIG1vZGlmeSBldmVudFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImFjdFwiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVDdHJsTW9kaWZ5KGN0cmw6IE1nQ29udHJvbCwgYWN0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIC8vIGlmIGNhbm5vdCBtb2RpZnksIGRvIG5vdGhpbmdcclxuICAgIGlmIChjdHJsID09IG51bGwgfHwgIWN0cmwuaXNNb2RpZmlhYmxlKCkpXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBzd2l0Y2ggKGFjdCkge1xyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9FRFRfTlVMTDpcclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9NT0RJRlk6XHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1NFTEVDVElPTjpcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50O1xyXG4gICAgcnRFdnQgPSBuZXcgUnVuVGltZUV2ZW50KGN0cmwpO1xyXG4gICAgcnRFdnQuc2V0SW50ZXJuYWwoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfTU9ESUZZKTtcclxuICAgIGF3YWl0IHRoaXMuaGFuZGxlRXZlbnQocnRFdnQsIGZhbHNlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjaGVjayBpZiBhY3Rpb24gaXMgYWxsb3dlZCBhY2NvcmRpbmcgdG8gdGhlIEFsbG93ZWRFdmVudHMgZmxhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJhY3RcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgQWN0QWxsb3dlZChhY3Q6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGFsbG93ZWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgc3dpdGNoICh0aGlzLmdldEFsbG93RXZlbnRzKCkpIHtcclxuICAgICAgY2FzZSBFdmVudHNBbGxvd2VkVHlwZS5BTEw6XHJcbiAgICAgICAgYWxsb3dlZCA9IHRydWU7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEV2ZW50c0FsbG93ZWRUeXBlLk5PTkU6XHJcbiAgICAgICAgLy8gYWxsb3cgY3JlbGluZSBldmVuIGluIGFsbG93PW5vLiB3ZSBoYXZlIG5vIGNob2ljZS4gUkMgbWVjaGFuaXNtIGlzIGRpZmZlcmVudCB0aGVuIGJhdGNoLiBpdCB1c2VzIEFDVF9DUkVBTElORVxyXG4gICAgICAgIC8vIHdoZW4gaW4gY3JlYXRlIG1vZGUuIFdlIHdpbGwgbmVlZCB0byBjaGFuZ2UgaXQgaW4gdGhlIGZ1dHVyZSBzbyB0aGF0IHdoZW4gdXNlciByYWlzZXMgY3JlbGluZSBldmVudCBpdCB3aWxsIG5vdCB3b3JrLiBqdXN0IGludGVybmFsbHkuXHJcbiAgICAgICAgYWxsb3dlZCA9IChhY3QgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DUkVMSU5FKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIC8vIE9ubHkgdGhlIGZvbGxvd2luZyBhY3Rpb25zIGFyZSBhbGxvd2VkIHdoZW4gcnVubmluZyBpbnNpZGUgYSBub24gaW50ZXJhY3RpdmUgbG9vcCB3aGVuIGFsbG93IGV2ZW50cyA9IFlFUy5cclxuICAgICAgY2FzZSBFdmVudHNBbGxvd2VkVHlwZS5OT05fSU5URVJBQ1RJVkU6XHJcblxyXG4gICAgICAgIHN3aXRjaCAoYWN0KSB7XHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FWElUX1NZU1RFTTpcclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VYSVQ6XHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DTE9TRTpcclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NSRUxJTkU6XHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DUkVMSU5FX0FCT1ZFOlxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUk9MTEJBQ0s6XHJcbiAgICAgICAgICAgIGFsbG93ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICBhbGxvd2VkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gYWxsb3dlZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBUaGlzIGZ1bmN0aW9uIGNvbW1pdHMgdGhlIHJlY29yZCBhbmQgdGhlbiBkZXBlbmRpbmcgb24gdGhlIHN1Y2Nlc3Mgb3IgZmFpbHVyZSBvZiB0cmFuc2FjdGlvbiwgaXQgcGVyZm9ybXMgb3RoZXIgYWN0aW9ucy5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFza1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpc1JldmVyc2libGVFeGl0XCI+PC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIGNvbW1pdFJlY29yZCh0YXNrOiBUYXNrLCBpc1JldmVyc2libGVFeGl0OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgZHY6IERhdGFWaWV3ID0gPERhdGFWaWV3PnRhc2suRGF0YVZpZXc7XHJcbiAgICBsZXQgcmVjOiBSZWNvcmQgPSBkdi5nZXRDdXJyUmVjKCk7XHJcblxyXG4gICAgbGV0IGZvcmNlU3VmZml4OiBib29sZWFuID0gYXdhaXQgdGFzay5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRk9SQ0VfU1VGRklYLCBmYWxzZSk7XHJcbiAgICBsZXQgaXNTZWxlY3Rpb25UYWJsZTogYm9vbGVhbiA9IGF3YWl0IHRhc2suY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1NFTEVDVElPTiwgZmFsc2UpO1xyXG4gICAgbGV0IGlzTmV3UmVjOiBib29sZWFuID0gcmVjLmlzTmV3UmVjKCk7XHJcbiAgICBsZXQgc2F2ZVByZXZDdXJyUmVjOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIGxldCByZWNNb2RpZmllZDogYm9vbGVhbiA9IHJlYy5Nb2RpZmllZDtcclxuXHJcbiAgICBpZiAoIWR2LnJlY0luTW9kaWZpZWRUYWIocmVjLmdldElkKCkpKVxyXG4gICAgICByZWMuY2xlYXJGbGFnc0hpc3RvcnkoKTtcclxuICAgIGF3YWl0IHRhc2suVGFza1RyYW5zYWN0aW9uTWFuYWdlci5jaGVja0FuZENvbW1pdChpc1JldmVyc2libGVFeGl0LCBDb25zdEludGVyZmFjZS5UUkFOU19SRUNPUkRfUFJFRklYLCB0YXNrLkNvbmZpcm1VcGRhdGVObyk7XHJcbiAgICBpZiAodGFzay50cmFuc2FjdGlvbkZhaWxlZChDb25zdEludGVyZmFjZS5UUkFOU19SRUNPUkRfUFJFRklYKSkge1xyXG4gICAgICAvLyBvbiBmYWlsdXJlIG9mIHRoZSB0cmFuc2FjdGlvbiByZWVudGVyIHRoZSByZWNvcmQgbGV2ZWwgYnlcclxuICAgICAgLy8gZXhlY3V0aW5nIFwicmVjb3JkIHByZWZpeFwiIGZvciB0aGUgc3ViZm9ybXMgd2hpY2ggZXhlY3V0ZWRcclxuICAgICAgLy8gdGhlIHN1ZmZpeCBzdWNjZXNzZnVsbHlcclxuICAgICAgdHJ5IHtcclxuICAgICAgICB0YXNrLkRhdGFTeW5jZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbihmYWxzZSk7XHJcbiAgICAgICAgYXdhaXQgdGFzay5oYW5kbGVFdmVudE9uU2xhdmVUYXNrcyhJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uKHRydWUpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKHRhc2suaXNBYm9ydGluZygpKVxyXG4gICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb24odHJ1ZSk7XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKHJlY01vZGlmaWVkKVxyXG4gICAgICAgIHJlYy5zZXRMYXRlQ29tcHV0ZSh0cnVlKTtcclxuXHJcbiAgICAgIC8vIFFDUiA3ODMwNzEgaWYgYWZ0ZXIgY2hlY2tBbmRDb21taXQgYWxsIGlmIE8uSy4gdGhlXHJcbiAgICAgIC8vIHJldHVybiB0aGUgbGV2ZWwgYmFjayB0byB0YXNrIGxldmVsIGluIG9yZGVyIHRvIGxldCByZWNfcHJmaXggdG8gYmUgZXhlY3V0ZWQuXHJcbiAgICAgIC8vIGV2ZW4gdGhvdWdoIHRoZSB0YXNrIGxldmVsIHNob3VsZCBiZSBUQVNLX0xFVkVMX1RBU0tcclxuICAgICAgLy8gdGhlIGNoZWNrQW5kQ29tbWl0IHByb2Nlc3MgY291bGQgaGF2ZSBjaGFuZ2UgaXRcclxuICAgICAgaWYgKCF0aGlzLl9zdG9wRXhlY3V0aW9uKVxyXG4gICAgICAgIHRhc2suc2V0TGV2ZWwoQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSyk7XHJcblxyXG4gICAgICByZWMucmVzZXRVcGRhdGVkKCk7XHJcbiAgICAgIHJlYy5yZXNldE1vZGlmaWVkKCk7XHJcblxyXG4gICAgICAvLyBRQ1IgIzk4MzE3ODogY2FuY2VsIHRoZSByZWNvcmQgb25seSBhZnRlciB0aGUgdHJhbnNhY3Rpb25cclxuICAgICAgLy8gaGFuZGxpbmcgd2FzIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgYW5kIHRoZSByZWNvcmQgd2Fzbid0XHJcbiAgICAgIC8vIG1vZGlmaWVkXHJcbiAgICAgIGlmICghcmVjTW9kaWZpZWQgJiYgIWZvcmNlU3VmZml4ICYmICghaXNTZWxlY3Rpb25UYWJsZSB8fCAhdGFzay5JblNlbGVjdCkpIHtcclxuICAgICAgICBpZiAoaXNOZXdSZWMpIHtcclxuICAgICAgICAgIC8vIFFDUiAjNDI4OTY1OiBzYXZlIHRoZSBwcmV2aW91cyBjdXJyZW50IHJlY29yZCBCRUZPUkVcclxuICAgICAgICAgIC8vIFwiY2FuY2VsIGVkaXRcIiBzbyB0aGUgY29ycmVjdCByZWNvcmQgaXMgc2F2ZWRcclxuICAgICAgICAgIGR2LnNldFByZXZDdXJyUmVjKCk7XHJcbiAgICAgICAgICBzYXZlUHJldkN1cnJSZWMgPSBmYWxzZTtcclxuICAgICAgICAgIHJlYy5zZXROZXdSZWMoKTtcclxuICAgICAgICAgIGF3YWl0ICg8TWdGb3JtPnRhc2suZ2V0Rm9ybSgpKS5jYW5jZWxFZGl0KGZhbHNlLCBmYWxzZSk7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLkhhbmRsZVN0b3BSb3dFZGl0aW5nKHRhc2spO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoIXJlYy5nZXRGb3JjZVNhdmVPcmcoKSlcclxuICAgICAgICAgIGF3YWl0IGR2LmNhbmNlbEVkaXQoRXZlbnRzTWFuYWdlci5SRUFMX09OTFksIHRydWUpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIGR2LnNhdmVPcmlnaW5hbCgpO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIFFDUiAjOTk1MjIyOiBpZiB0aGUgcmVjb3JkIHdhcyBtb2RpZmllZCB0aGVuIHNhdmUgdGhlXHJcbiAgICAgIC8vIG9yaWdpbmFsIHJlY29yZCBhZ2FpbiBpbiBjYXNlIGEgdGFzayBsYXZlbCB0cmFuc2FjdGlvblxyXG4gICAgICAvLyB3aWxsIGZhaWwgd2l0aCByZXRyeSBzdHJhdGVneS4gQmVmb3JlIHRoaXMgZml4LCBpZiBzdWNoXHJcbiAgICAgIC8vIHRoaW5nIGhhcHBlbmVkIG9uIGEgcmVjb3JkIHdoaWNoIHdhc24ndCB0aGUgZmlyc3QgdGhlblxyXG4gICAgICAvLyB0aGUgXCJiZWdpbiB0YWJsZVwiIGV2ZW50IHJhaXNlZCBhIHJlY29yZCBzdWZmaXggZXZlbnQgYW5kXHJcbiAgICAgIC8vIGNhdXNlZCBcImNhbmNlbCBlZGl0XCIuXHJcbiAgICAgIGVsc2VcclxuICAgICAgICBkdi5zYXZlT3JpZ2luYWwoKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoc2F2ZVByZXZDdXJyUmVjKVxyXG4gICAgICBkdi5zZXRQcmV2Q3VyclJlYygpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNhbGxiYWNrIGZvciBpbmNyZW1lbnRhbCBsb2NhdGUgdGltZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGluY0xvY2F0ZVRpbWVyQ0IodGFza09iajogYW55KTogdm9pZCB7XHJcbiAgICBsZXQgdGFzazogVGFzayA9IHRhc2tPYmo7XHJcbiAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQodGFzaywgdHJ1ZSk7XHJcblxyXG4gICAgcnRFdnQuc2V0SW50ZXJuYWwoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0lOQ1JFTUVOVEFMX0xPQ0FURSk7XHJcbiAgICBydEV2dC5zZXRNYWluUHJnQ3JlYXRvcih0YXNrKTtcclxuICAgIHJ0RXZ0LnNldEN0cmwoPE1nQ29udHJvbD50YXNrLmdldExhc3RQYXJrZWRDdHJsKCkpO1xyXG4gICAgdGhpcy5hZGRUb1RhaWwocnRFdnQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0YXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgc3RhdGljIGFzeW5jIGRvU3luY0ZvclN1YmZvcm1QYXJlbnQodGFzazogVGFzayk6IFByb21pc2U8dm9pZD4ge1xyXG5cclxuICAgIGxldCBwYXJlbnRUYXNrOiBUYXNrID0gPFRhc2s+dGFzay5nZXRQYXJlbnQoKTtcclxuICAgIGxldCBwYXJlbnREdiA9IDxEYXRhVmlldz5wYXJlbnRUYXNrLkRhdGFWaWV3O1xyXG4gICAgbGV0IHBhcmVudFJlYzogUmVjb3JkID0gcGFyZW50RHYuZ2V0Q3VyclJlYygpO1xyXG5cclxuICAgIC8vIGRvIG5vdCB0b3VjaCB0aGUgcGFyZW50IHJlY29yZCBpZiB0aGUgcGFyZW50IGRhdGF2aWV3IGlzICdlbXB0eSBkYXRhdmlldycuXHJcbiAgICBpZiAodGFzay5Jc1N1YkZvcm0gJiYgcGFyZW50UmVjICE9IG51bGwgJiYgcGFyZW50UmVjLk1vZGlmaWVkICYmICFwYXJlbnREdi5pc0VtcHR5RGF0YXZpZXcoKSkge1xyXG4gICAgICBwYXJlbnRSZWMuc2V0TW9kZShEYXRhTW9kaWZpY2F0aW9uVHlwZXMuVXBkYXRlKTtcclxuICAgICAgYXdhaXQgcGFyZW50RHYuYWRkQ3VyclRvTW9kaWZpZWQoZmFsc2UpO1xyXG4gICAgICAoKHBhcmVudER2LmdldEN1cnJSZWMoKSkpLlN5bmNlZCA9IHRydWU7XHJcbiAgICAgIHBhcmVudER2LnNldENoYW5nZWQodHJ1ZSk7XHJcbiAgICAgIGxldCBkYXRhVmlld0V4ZWN1dGVMb2NhbFVwZGF0ZXNDb21tYW5kOiBJQ2xpZW50Q29tbWFuZCA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZURhdGFWaWV3Q29tbWFuZChwYXJlbnRUYXNrLmdldFRhc2tUYWcoKSwgRGF0YVZpZXdDb21tYW5kVHlwZS5FeGVjdXRlTG9jYWxVcGRhdGVzKTtcclxuICAgICAgYXdhaXQgcGFyZW50VGFzay5EYXRhdmlld01hbmFnZXIuRXhlY3V0ZShkYXRhVmlld0V4ZWN1dGVMb2NhbFVwZGF0ZXNDb21tYW5kKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIFByb2Nlc3NBYm9ydGluZ0Vycm9yKGV4OiBBcHBsaWNhdGlvbkV4Y2VwdGlvbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGVNc2c6IHN0cmluZztcclxuICAgIGxldCBlcnJGb3JDb25zb2xlOiBzdHJpbmc7XHJcbiAgICBsZXQgZXJyRm9yTXNnQm94OiBzdHJpbmc7XHJcblxyXG4gICAgaWYgKGV4IGluc3RhbmNlb2YgU2VydmVyRXJyb3IpXHJcbiAgICAgIGVNc2cgPSAoPFNlcnZlckVycm9yPmV4KS5HZXRNZXNzYWdlKCk7XHJcbiAgICBlbHNlXHJcbiAgICAgIGVNc2cgPSAoKGV4Lk1lc3NhZ2UgIT09IG51bGwpID8gZXguTWVzc2FnZSA6IGV4LkdldFR5cGUoKSk7XHJcblxyXG4gICAgZXJyRm9yQ29uc29sZSA9IFN0clV0aWwuZ2V0Q29uc29sZUVyb3JTdHJpbmcoZU1zZyk7XHJcbiAgICBlcnJGb3JNc2dCb3ggPSBTdHJVdGlsLmdldE1zZ0JveEVyb3JTdHJpbmcoZU1zZyk7XHJcblxyXG4gICAgaWYgKGV4LklubmVyRXhjZXB0aW9uICE9PSBudWxsKVxyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZyhleC5Jbm5lckV4Y2VwdGlvbiwgZXJyRm9yQ29uc29sZSk7XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKCEoZXggaW5zdGFuY2VvZiBTZXJ2ZXJFcnJvcikgfHwgTG9nZ2VyLkluc3RhbmNlLkxvZ0xldmVsICE9PSBMb2dnZXJfTG9nTGV2ZWxzLkJhc2ljKSB7XHJcbiAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKGVyckZvckNvbnNvbGUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVE9ETyA6IGhhbmRsZSBlcnJvcnNcclxuICAgIGxldCBzZW5kVW5sb2FkVG9TZXJ2ZXI6IGJvb2xlYW4gPSBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuQ29udGV4dElEICE9PSBSdW50aW1lQ29udGV4dEJhc2Uubm9Db250ZXh0SWQ7ICAvLyB1bmxvYWQgdGhlIGNvbnRleHQgaW4gdGhlIHNlcnZlciBvbmx5IGlmIGEgY29udGV4dCB3YXMgY3JlYXRlZCBkdXJpbmcgdGhlIGN1cnJlbnQgc2Vzc2lvblxyXG5cclxuICAgIE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuY3Vyck1nZElEID0gMDtcclxuXHJcbiAgICBsZXQgbWVzc2FnZVN0cmluZzogc3RyaW5nID0gTGFuZ3VhZ2VEYXRhLkluc3RhbmNlLmdldENvbnN0TWVzc2FnZShNc2dJbnRlcmZhY2UuQlJLVEFCX1NUUl9FUlJPUik7XHJcblxyXG4gICAgbGV0IHN0eWxlOiBudW1iZXIgPSAxNjtcclxuICAgIGlmIChleC5NZXNzYWdlLnN0YXJ0c1dpdGgoJzxIVE1MJykpIHtcclxuICAgICAgdGhpcy5wcm9jZXNzSFRNTENvbnRlbnQoZXguTWVzc2FnZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBUT0RPOiB0ZW1wb3JhcmlseSBzaG93IHRoZSBtZXNzYWdlIGJveFxyXG4gICAgICAvLyBpZGVhbGx5LCB0aGUgY3VycmVudCBwYWdlIHNob3VsZCBiZSByZXBsYWNlZCB3aXRoIHRoZSBlcnJvciBwYWdlXHJcbiAgICAgIGlmICh0aGlzLlNob3dFcnJvckluTWVzc2FnZUJveChleCkpIHtcclxuICAgICAgICBhd2FpdCBHVUlNYW5hZ2VyLkluc3RhbmNlLk1lc3NhZ2VCb3gobWVzc2FnZVN0cmluZywgZXJyRm9yTXNnQm94LCBzdHlsZSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGV4IGluc3RhbmNlb2YgU2VydmVyRXJyb3Ipe1xyXG4gICAgICAgIGlmKCg8U2VydmVyRXJyb3I+ZXgpLkdldENvZGUoKSA9PSBTZXJ2ZXJFcnJvci5FUlJfV0VCQ0xJRU5UX1BST0dSQU1fUkVMT0FERUQgfHxcclxuICAgICAgICAgICAoPFNlcnZlckVycm9yPmV4KS5HZXRDb2RlKCkgPT0gU2VydmVyRXJyb3IuRVJSX0VYRUNVVEVEX1BST0dSQU1fQ0hBTkdFRCkge1xyXG4gICAgICAgICAgIENvbW1hbmRzLmFkZEdsb2JhbENvbW1hbmQoQ29tbWFuZFR5cGUuUkVMT0FEX1BBR0UpO1xyXG4gICAgICAgICAgIC8vIE11c3QgY2FsbCBiZWdpbkludm9rZSBoZXJlOyBpbiB0aGUgY2FzZSBhIG5ldyBjb25uZWN0aW9uIHdhcyByZWZ1c2VkLCB0aGUgYmVnaW5JbnZva2UgaXMgbmV2ZXIgY2FsbGVkLCBzbyB3ZVxyXG4gICAgICAgICAgIC8vIG5lZWQgdG8gbWFrZSBzdXJlIGl0IGlzIGNhbGxlZCBoZXJlXHJcbiAgICAgICAgICAgQ29tbWFuZHMuYmVnaW5JbnZva2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBUT0RPOiBIb3cgdG8gY2hlY2sgaWYgaXQgd2FzIENvbm5lY3RGYWlsdXJlIG9yIFByb3RvY29sRXJyb3I/XHJcbiAgICAvLyBJbiBjYXNlIGlmIHdlIGFyZSBhYmxlIHRvIGNvbm5lY3QgdG8gdGhlIHNlcnZlciBpLmUuIHN0YXR1cyBpcyBDb25uZWN0aW9uRmFpbHVyZVxyXG4gICAgLy8gdGhlbiB0aGVyZSBpcyBubyBwb2ludCBpbiBzZW5kaW5nIHVubG9hZCBjb21tYW5kLCBiZWNhdXNlIGl0IHdpbGwgbmV2ZXIgc3VjY2VlZCBhbmRcclxuICAgIC8vIHdlIHdpbGwgaW4gaW5maW5pdGUgbG9vcC5cclxuICAgIC8vIGxldCBmbGFnODogYm9vbGVhbiA9IGV4LklubmVyRXhjZXB0aW9uICE9PSBudWxsICYmIGV4LklubmVyRXhjZXB0aW9uLkdldFR5cGUoKS5GdWxsTmFtZSA9PT0gXCJTeXN0ZW0uTmV0LldlYkV4Y2VwdGlvblwiO1xyXG4gICAgLy8gaWYgKGZsYWc4KSB7XHJcbiAgICAvLyAgIGxldCBleDI6IFdlYkV4Y2VwdGlvbiA9IDxXZWJFeGNlcHRpb24+ZXguSW5uZXJFeGNlcHRpb247XHJcbiAgICAvLyAgIGxldCBmbGFnOTogYm9vbGVhbiA9IGV4Mi5TdGF0dXMgPT09IFdlYkV4Y2VwdGlvblN0YXR1cy5Db25uZWN0RmFpbHVyZSB8fCBleDIuU3RhdHVzID09PSBXZWJFeGNlcHRpb25TdGF0dXMuUHJvdG9jb2xFcnJvcjtcclxuICAgIC8vICAgaWYgKGZsYWc5KSB7XHJcbiAgICAvLyAgICAgc2VuZFVubG9hZFRvU2VydmVyID0gZmFsc2U7XHJcbiAgICAvLyAgIH1cclxuICAgIC8vIH1cclxuXHJcbiAgICBpZiAoZXggaW5zdGFuY2VvZiBTZXJ2ZXJFcnJvcikge1xyXG4gICAgICAvLyBJZiB0aGUgY29udGV4dCB3YXMgbm90IGZvdW5kLCBvciB0aGUgcHJvZ3JhbSBpcyByZWxvYWRlZCBieSB0aGUgc2VydmVyLCBubyBwb2ludCBpbiB0cnlpbmcgdG8gdW5sb2FkIGl0XHJcbiAgICAgIGlmICgoPFNlcnZlckVycm9yPmV4KS5HZXRDb2RlKCkgPT09IFNlcnZlckVycm9yLkVSUl9DVFhfTk9UX0ZPVU5EIHx8XHJcbiAgICAgICAgICAoPFNlcnZlckVycm9yPmV4KS5HZXRDb2RlKCkgPT09IFNlcnZlckVycm9yLkVSUl9XRUJDTElFTlRfUFJPR1JBTV9SRUxPQURFRCB8fFxyXG4gICAgICAgICAgKDxTZXJ2ZXJFcnJvcj5leCkuR2V0Q29kZSgpID09PSBTZXJ2ZXJFcnJvci5FUlJfRVhFQ1VURURfUFJPR1JBTV9DSEFOR0VEKSB7XHJcbiAgICAgICAgc2VuZFVubG9hZFRvU2VydmVyID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoc2VuZFVubG9hZFRvU2VydmVyKSB7XHJcbiAgICAgIC8vIHRlbGwgdGhlIHNlcnZlciB0byBjbG9zZSB0aGUgcnVudGltZS5cclxuICAgICAgLy8gSWYgd2UgdGVybWluYXRlIFJURSBhbmQgdGhlbiBjbG9zZSBSQyB3aW5kb3cgdGhlbiBhbHNvIHdlIHdpbGwgYmVcclxuICAgICAgLy8gUHJvY2Vzc2luZyBBYm9ydCBlcnJvciBpbiB0aGF0IGNhc2Ugc2VydmVyIGlzIGFscmVhZHkgY2xvc2VkIHNvIGNhdGNoIHRoZSBleGNlcHRpb24uXHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgbGV0IGNtZDogSUNsaWVudENvbW1hbmQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVVbmxvYWRDb21tYW5kKCk7XHJcbiAgICAgICAgTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5nZXRNR0RhdGEoMCkuQ21kc1RvU2VydmVyLkFkZChjbWQpO1xyXG4gICAgICAgIGF3YWl0IENvbW1hbmRzUHJvY2Vzc29yTWFuYWdlci5HZXRDb21tYW5kc1Byb2Nlc3NvcigpLkV4ZWN1dGUoQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1NlbmRpbmdJbnN0cnVjdGlvbi5UQVNLU19BTkRfQ09NTUFORFMpO1xyXG4gICAgICB9IGNhdGNoIChleDMpIHtcclxuICAgICAgICBpZiAoZXgzIGluc3RhbmNlb2YgQXBwbGljYXRpb25FeGNlcHRpb24pIHtcclxuICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nKGV4Myk7XHJcbiAgICAgICAgfSBlbHNlXHJcbiAgICAgICAgICB0aHJvdyBleDM7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBHVUlNYW5hZ2VyLkluc3RhbmNlLmFib3J0KCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgcHJvY2Vzc0hUTUxDb250ZW50KGh0bWxDb250ZW50OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIENvbW1hbmRzLmFkZFNob3dIVE1MRXJyb3IoQ29tbWFuZFR5cGUuU0hPV19IVE1MX0VSUk9SLCBodG1sQ29udGVudCk7XHJcbiAgICBDb21tYW5kcy5iZWdpbkludm9rZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8gVGhpcyBtZXRob2QgZGVjaWRlcyBpZiB0aGUgZXJyb3IgaGFuZGxlZCBpbiBQcm9jZXNzQWJvcnRpbmdFcnJvciB3aWxsIG9wZW4gYSBtZXNzYWdlIGJveFxyXG4gIFNob3dFcnJvckluTWVzc2FnZUJveChleDogQXBwbGljYXRpb25FeGNlcHRpb24pOiBib29sZWFuIHtcclxuICAgIGlmKCEoZXggaW5zdGFuY2VvZiBTZXJ2ZXJFcnJvcikpXHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG5cclxuICAgIC8vIGlmIGNoYW5nZXMgaW4gdGhlIHN0dWRpbyBjYXVzZSBhIHJlbG9hZCwgc2hvdyB0aGUgbWVzc2FnZWJveCBvbmx5IGlmIHRoZSB1c2VyIHRyaWVkIHRvXHJcbiAgICAvLyBjb250aW51ZSB3b3JraW5nIHdpdGggYW4gb2xkIGNvbnRleHRcclxuICAgIGlmKCgoPFNlcnZlckVycm9yPmV4KS5HZXRDb2RlKCkgPT0gU2VydmVyRXJyb3IuRVJSX0VYRUNVVEVEX1BST0dSQU1fQ0hBTkdFRCB8fFxyXG4gICAgICAgKDxTZXJ2ZXJFcnJvcj5leCkuR2V0Q29kZSgpID09IFNlcnZlckVycm9yLkVSUl9XRUJDTElFTlRfUFJPR1JBTV9SRUxPQURFRCkgJiZcclxuICAgICAgICBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuQ29udGV4dElEID09PSBSdW50aW1lQ29udGV4dEJhc2Uubm9Db250ZXh0SWQpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIGdldElzSW5WaWV3UmVmcmVzaCgpOiBib29sZWFue1xyXG4gICAgcmV0dXJuIHRoaXMuaXNJblZpZXdSZWZyZXNoO1xyXG4gIH1cclxuXHJcbiAgc2V0SXNJblZpZXdSZWZyZXNoKGluVmlld1JlZnJlc2g6IGJvb2xlYW4pOiB2b2lke1xyXG4gICAgdGhpcy5pc0luVmlld1JlZnJlc2ggPSBpblZpZXdSZWZyZXNoO1xyXG4gIH1cclxufVxyXG4iXX0=
|