@magic-xpa/engine 4.800.0-dev480.94 → 4.801.0-dev000.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/index.mjs +190 -0
- package/{esm2015/magic-xpa-engine.js → esm2020/magic-xpa-engine.mjs} +0 -0
- package/esm2020/src/AccessHelper.mjs +3 -0
- package/esm2020/src/ClientManager.mjs +403 -0
- package/esm2020/src/CommandsProcessorBase.mjs +58 -0
- package/esm2020/src/CommandsProcessorManager.mjs +26 -0
- package/esm2020/src/CommandsTable.mjs +163 -0
- package/esm2020/src/ConstInterface.mjs +729 -0
- package/{esm2015/src/CurrentClientVersion.js → esm2020/src/CurrentClientVersion.mjs} +2 -2
- package/{esm2015/src/FlowMonitorInterface.js → esm2020/src/FlowMonitorInterface.mjs} +0 -0
- package/esm2020/src/GUIManager.mjs +63 -0
- package/{esm2015/src/GlobalCommandsManager.js → esm2020/src/GlobalCommandsManager.mjs} +0 -0
- package/esm2020/src/GuiEventsProcessor.mjs +171 -0
- package/{esm2015/src/ICommandsTable.js → esm2020/src/ICommandsTable.mjs} +1 -0
- package/{esm2015/src/ServerConfig.js → esm2020/src/ServerConfig.mjs} +0 -0
- package/{esm2015/src/bridge/IGuiEvent.js → esm2020/src/bridge/IGuiEvent.mjs} +0 -0
- package/esm2020/src/bridge/MagicBridge.mjs +41 -0
- package/{esm2015/src/commands/ClientOriginatedCommandTaskTag.js → esm2020/src/commands/ClientOriginatedCommandTaskTag.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/AddUserLocateDataViewCommand.js → esm2020/src/commands/ClientToServer/AddUserLocateDataViewCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/AddUserRangeDataviewCommand.js → esm2020/src/commands/ClientToServer/AddUserRangeDataviewCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/AddUserSortDataViewCommand.js → esm2020/src/commands/ClientToServer/AddUserSortDataViewCommand.mjs} +0 -0
- package/esm2020/src/commands/ClientToServer/BrowserEscEventCommand.mjs +23 -0
- package/esm2020/src/commands/ClientToServer/ClientOriginatedCommand.mjs +15 -0
- package/esm2020/src/commands/ClientToServer/ClientOriginatedCommandSerializer.mjs +60 -0
- package/esm2020/src/commands/ClientToServer/ColumnSortEventCommand.mjs +26 -0
- package/esm2020/src/commands/ClientToServer/CommandFactory.mjs +278 -0
- package/{esm2015/src/commands/ClientToServer/CommandSerializationHelper.js → esm2020/src/commands/ClientToServer/CommandSerializationHelper.mjs} +0 -0
- package/esm2020/src/commands/ClientToServer/ComputeEventCommand.mjs +23 -0
- package/esm2020/src/commands/ClientToServer/ContextTerminationEventCommand.mjs +21 -0
- package/esm2020/src/commands/ClientToServer/ContextTimeoutResetCommand.mjs +20 -0
- package/{esm2015/src/commands/ClientToServer/ControlItemsRefreshCommand.js → esm2020/src/commands/ClientToServer/ControlItemsRefreshCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/DataViewOutputCommand.js → esm2020/src/commands/ClientToServer/DataViewOutputCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/DataviewCommand.js → esm2020/src/commands/ClientToServer/DataviewCommand.mjs} +2 -2
- package/esm2020/src/commands/ClientToServer/EvaluateCommand.mjs +36 -0
- package/esm2020/src/commands/ClientToServer/EventCommand.mjs +40 -0
- package/esm2020/src/commands/ClientToServer/ExecOperCommand.mjs +67 -0
- package/esm2020/src/commands/ClientToServer/FetchDataControlValuesEventCommand.mjs +22 -0
- package/{esm2015/src/commands/ClientToServer/GlobalParamsQueryCommand.js → esm2020/src/commands/ClientToServer/GlobalParamsQueryCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/ICommandTaskTag.js → esm2020/src/commands/ClientToServer/ICommandTaskTag.mjs} +1 -0
- package/esm2020/src/commands/ClientToServer/IndexChangeEventCommand.mjs +21 -0
- package/esm2020/src/commands/ClientToServer/IniputForceWriteCommand.mjs +23 -0
- package/esm2020/src/commands/ClientToServer/NonReversibleExitEventCommand.mjs +23 -0
- package/esm2020/src/commands/ClientToServer/QueryCommand.mjs +21 -0
- package/esm2020/src/commands/ClientToServer/RecomputeCommand.mjs +27 -0
- package/esm2020/src/commands/ClientToServer/RefreshEventCommand.mjs +27 -0
- package/esm2020/src/commands/ClientToServer/RefreshScreenEventCommand.mjs +24 -0
- package/esm2020/src/commands/ClientToServer/RollbackEventCommand.mjs +39 -0
- package/esm2020/src/commands/ClientToServer/SelectProgramCommand.mjs +15 -0
- package/{esm2015/src/commands/ClientToServer/SetTransactionStateDataviewCommand.js → esm2020/src/commands/ClientToServer/SetTransactionStateDataviewCommand.mjs} +0 -0
- package/esm2020/src/commands/ClientToServer/SubformOpenEventCommand.mjs +21 -0
- package/esm2020/src/commands/ClientToServer/SubformRefreshEventCommand.mjs +24 -0
- package/esm2020/src/commands/ClientToServer/TransactionCommand.mjs +28 -0
- package/{esm2015/src/commands/ClientToServer/UnloadCommand.js → esm2020/src/commands/ClientToServer/UnloadCommand.mjs} +0 -0
- package/esm2020/src/commands/ClientToServer/WriteMessageToServerLogCommand.mjs +18 -0
- package/esm2020/src/commands/DataViewCommandBase.mjs +10 -0
- package/{esm2015/src/commands/IClientCommand.js → esm2020/src/commands/IClientCommand.mjs} +1 -0
- package/esm2020/src/commands/IClientTargetedCommand.mjs +9 -0
- package/{esm2015/src/commands/IClientToServerCommandInfo.js → esm2020/src/commands/IClientToServerCommandInfo.mjs} +1 -0
- package/esm2020/src/commands/ServerToClient/AbortCommand.mjs +65 -0
- package/esm2020/src/commands/ServerToClient/AddLocateCommand.mjs +22 -0
- package/esm2020/src/commands/ServerToClient/AddRangeCommand.mjs +62 -0
- package/esm2020/src/commands/ServerToClient/AddSortCommand.mjs +33 -0
- package/{esm2015/src/commands/ServerToClient/ClientRefreshCommand.js → esm2020/src/commands/ServerToClient/ClientRefreshCommand.mjs} +14 -17
- package/esm2020/src/commands/ServerToClient/ClientTargetedCommandBase.mjs +27 -0
- package/esm2020/src/commands/ServerToClient/EnhancedVerifyCommand.mjs +45 -0
- package/esm2020/src/commands/ServerToClient/OpenURLCommand.mjs +222 -0
- package/esm2020/src/commands/ServerToClient/ResetLocateCommand.mjs +15 -0
- package/esm2020/src/commands/ServerToClient/ResetRangeCommand.mjs +15 -0
- package/esm2020/src/commands/ServerToClient/ResetSortCommand.mjs +15 -0
- package/esm2020/src/commands/ServerToClient/ResultCommand.mjs +37 -0
- package/esm2020/src/commands/ServerToClient/VerifyCommand.mjs +85 -0
- package/{esm2015/src/commands/ServerToClient/XMLBasedCommandBuilder.js → esm2020/src/commands/ServerToClient/XMLBasedCommandBuilder.mjs} +0 -0
- package/{esm2015/src/communications/IConnectionStateManager.js → esm2020/src/communications/IConnectionStateManager.mjs} +1 -0
- package/esm2020/src/communications/InteractiveCommunicationsFailureHandler.mjs +17 -0
- package/{esm2015/src/data/DataSourceIdKey.js → esm2020/src/data/DataSourceIdKey.mjs} +0 -0
- package/esm2020/src/data/DataView.mjs +1634 -0
- package/{esm2015/src/data/DataViewBase.js → esm2020/src/data/DataViewBase.mjs} +0 -0
- package/esm2020/src/data/DataviewManager.mjs +28 -0
- package/esm2020/src/data/DataviewManagerBase.mjs +15 -0
- package/{esm2015/src/data/DvCache.js → esm2020/src/data/DvCache.mjs} +0 -0
- package/esm2020/src/data/Field.mjs +645 -0
- package/esm2020/src/data/FieldBase.mjs +18 -0
- package/{esm2015/src/data/FieldsTable.js → esm2020/src/data/FieldsTable.mjs} +0 -0
- package/{esm2015/src/data/IRecordsTable.js → esm2020/src/data/IRecordsTable.mjs} +1 -0
- package/{esm2015/src/data/Key.js → esm2020/src/data/Key.mjs} +0 -0
- package/esm2020/src/data/Record.mjs +846 -0
- package/{esm2015/src/data/RecordOutOfDataViewException.js → esm2020/src/data/RecordOutOfDataViewException.mjs} +0 -0
- package/esm2020/src/data/RecordsTable.mjs +267 -0
- package/esm2020/src/data/TaskTransactionManager.mjs +103 -0
- package/esm2020/src/data/XMLBasedDcValuesBuilder.mjs +74 -0
- package/{esm2015/src/enums.js → esm2020/src/enums.mjs} +0 -0
- package/esm2020/src/env/EnvVariablesTable.mjs +340 -0
- package/esm2020/src/env/Environment.mjs +554 -0
- package/{esm2015/src/env/ILanguageData.js → esm2020/src/env/ILanguageData.mjs} +1 -0
- package/esm2020/src/env/LanguageData.mjs +222 -0
- package/esm2020/src/env/MirrorString.mjs +66 -0
- package/esm2020/src/event/ActionManager.mjs +94 -0
- package/esm2020/src/event/Event.mjs +1436 -0
- package/esm2020/src/event/EventHandler.mjs +773 -0
- package/esm2020/src/event/EventHandlerPosition.mjs +201 -0
- package/esm2020/src/event/EventsManager.mjs +2983 -0
- package/esm2020/src/event/IEventsManager.mjs +7 -0
- package/esm2020/src/event/RunTimeEvent.mjs +406 -0
- package/{esm2015/src/event/RunTimeEventBase.js → esm2020/src/event/RunTimeEventBase.mjs} +0 -0
- package/{esm2015/src/event/UserEventsTable.js → esm2020/src/event/UserEventsTable.mjs} +0 -0
- package/{esm2015/src/exp/ExpTable.js → esm2020/src/exp/ExpTable.mjs} +0 -0
- package/esm2020/src/exp/Expression.mjs +200 -0
- package/{esm2015/src/exp/ExpressionDict.js → esm2020/src/exp/ExpressionDict.mjs} +3 -1
- package/esm2020/src/exp/ExpressionEvaluator.mjs +4373 -0
- package/esm2020/src/exp/ExpressionLocalJpn.mjs +314 -0
- package/esm2020/src/exp/GlobalParamsTable.mjs +85 -0
- package/esm2020/src/exp/YesNoExp.mjs +41 -0
- package/{esm2015/src/gui/CreatedFormVector.js → esm2020/src/gui/CreatedFormVector.mjs} +0 -0
- package/esm2020/src/gui/FormsTable.mjs +66 -0
- package/esm2020/src/gui/MgControl.mjs +357 -0
- package/esm2020/src/gui/MgForm.mjs +1195 -0
- package/esm2020/src/http/HttpManager.mjs +97 -0
- package/esm2020/src/http/client/HttpClientAsync.mjs +67 -0
- package/esm2020/src/http/client/HttpClientBase.mjs +148 -0
- package/{esm2015/src/http/client/HttpClientEvents.js → esm2020/src/http/client/HttpClientEvents.mjs} +0 -0
- package/esm2020/src/http/client/HttpClientSync.mjs +42 -0
- package/{esm2015/src/http/client/HttpUtility.js → esm2020/src/http/client/HttpUtility.mjs} +0 -0
- package/{esm2015/src/http/client/ICommunicationsFailureHandler.js → esm2020/src/http/client/ICommunicationsFailureHandler.mjs} +1 -0
- package/esm2020/src/remote/AddUserLocateRemoteDataViewCommand.mjs +18 -0
- package/esm2020/src/remote/AddUserRangeRemoteDataViewCommand.mjs +18 -0
- package/esm2020/src/remote/AddUserSortRemoteDataViewCommand.mjs +18 -0
- package/esm2020/src/remote/RemoteCommandsProcessor.mjs +872 -0
- package/esm2020/src/remote/RemoteControlItemsRefreshCommand.mjs +25 -0
- package/esm2020/src/remote/RemoteDataViewCommandBase.mjs +24 -0
- package/{esm2015/src/remote/RemoteDataViewCommandFactory.js → esm2020/src/remote/RemoteDataViewCommandFactory.mjs} +0 -0
- package/esm2020/src/remote/RemoteDataViewCommandUpdateNonModifiable.mjs +16 -0
- package/esm2020/src/remote/RemoteDataviewManager.mjs +17 -0
- package/esm2020/src/remote/RemoteInitDataViewCommand.mjs +11 -0
- package/esm2020/src/remote/ResetUserLocateRemoteDataviewCommand.mjs +17 -0
- package/esm2020/src/remote/ResetUserRangeRemoteDataviewCommand.mjs +13 -0
- package/esm2020/src/remote/ResetUserSortRemoteDataviewCommand.mjs +16 -0
- package/esm2020/src/remote/ServerError.mjs +44 -0
- package/{esm2015/src/remote/SetTransactionStateRemoteDataViewCommand.js → esm2020/src/remote/SetTransactionStateRemoteDataViewCommand.mjs} +8 -11
- package/esm2020/src/rt/Argument.mjs +274 -0
- package/esm2020/src/rt/ArgumentsList.mjs +103 -0
- package/esm2020/src/rt/Boundary.mjs +158 -0
- package/{esm2015/src/rt/CompMainPrgTable.js → esm2020/src/rt/CompMainPrgTable.mjs} +0 -0
- package/esm2020/src/rt/DataviewHeaderBase.mjs +96 -0
- package/esm2020/src/rt/DataviewHeaderFactory.mjs +7 -0
- package/{esm2015/src/rt/DataviewHeaders.js → esm2020/src/rt/DataviewHeaders.mjs} +0 -0
- package/esm2020/src/rt/DataviewHeadersSaxHandler.mjs +39 -0
- package/{esm2015/src/rt/ExecutionStack.js → esm2020/src/rt/ExecutionStack.mjs} +0 -0
- package/{esm2015/src/rt/ExecutionStackEntry.js → esm2020/src/rt/ExecutionStackEntry.mjs} +0 -0
- package/{esm2015/src/rt/HandlersTable.js → esm2020/src/rt/HandlersTable.mjs} +0 -0
- package/{esm2015/src/rt/IDataSourceViewDefinition.js → esm2020/src/rt/IDataSourceViewDefinition.mjs} +1 -0
- package/{esm2015/src/rt/IDataviewHeader.js → esm2020/src/rt/IDataviewHeader.mjs} +1 -0
- package/{esm2015/src/rt/IResultValue.js → esm2020/src/rt/IResultValue.mjs} +1 -0
- package/{esm2015/src/rt/LastFocusedManager.js → esm2020/src/rt/LastFocusedManager.mjs} +0 -0
- package/esm2020/src/rt/Operation.mjs +745 -0
- package/{esm2015/src/rt/OperationTable.js → esm2020/src/rt/OperationTable.mjs} +0 -0
- package/esm2020/src/rt/Recompute.mjs +355 -0
- package/{esm2015/src/rt/RecomputeTable.js → esm2020/src/rt/RecomputeTable.mjs} +0 -0
- package/esm2020/src/rt/RemoteDataviewHeader.mjs +105 -0
- package/{esm2015/src/rt/ResultValue.js → esm2020/src/rt/ResultValue.mjs} +0 -0
- package/esm2020/src/rt/TableCache.mjs +177 -0
- package/esm2020/src/rt/TableCacheManager.mjs +67 -0
- package/esm2020/src/rt/Transaction.mjs +54 -0
- package/{esm2015/src/security/UserDetails.js → esm2020/src/security/UserDetails.mjs} +0 -0
- package/{esm2015/src/tasks/IMGDataCollection.js → esm2020/src/tasks/IMGDataCollection.mjs} +1 -0
- package/esm2020/src/tasks/MGData.mjs +552 -0
- package/esm2020/src/tasks/MGDataCollection.mjs +259 -0
- package/{esm2015/src/tasks/MenusDeserializer.js → esm2020/src/tasks/MenusDeserializer.mjs} +0 -0
- package/{esm2015/src/tasks/RCTimer.js → esm2020/src/tasks/RCTimer.mjs} +0 -0
- package/esm2020/src/tasks/RemoteTaskService.mjs +45 -0
- package/esm2020/src/tasks/Task.mjs +2501 -0
- package/{esm2015/src/tasks/TaskBase.js → esm2020/src/tasks/TaskBase.mjs} +22 -1
- package/esm2020/src/tasks/TaskServiceBase.mjs +25 -0
- package/esm2020/src/tasks/TasksTable.mjs +80 -0
- package/{esm2015/src/tasks/sort/Sort.js → esm2020/src/tasks/sort/Sort.mjs} +0 -0
- package/esm2020/src/tasks/sort/SortCollection.mjs +72 -0
- package/{esm2015/src/util/ConstUtils.js → esm2020/src/util/ConstUtils.mjs} +0 -0
- package/{esm2015/src/util/FlowMonitorQueue.js → esm2020/src/util/FlowMonitorQueue.mjs} +15 -18
- package/{esm2015/src/util/HeapSort.js → esm2020/src/util/HeapSort.mjs} +0 -0
- package/{esm2015/src/util/IMirrorXML.js → esm2020/src/util/IMirrorXML.mjs} +2 -1
- package/{esm2015/src/util/IServerConfig.js → esm2020/src/util/IServerConfig.mjs} +1 -0
- package/{esm2015/src/util/MgBlockingQueue.js → esm2020/src/util/MgBlockingQueue.mjs} +1 -0
- package/esm2020/src/util/MgPriorityBlockingQueue.mjs +76 -0
- package/{esm2015/src/util/MgPriorityQueue.js → esm2020/src/util/MgPriorityQueue.mjs} +0 -0
- package/esm2020/src/util/ParamParseResult.mjs +8 -0
- package/esm2020/src/util/PrmMap.mjs +151 -0
- package/esm2020/src/util/Process.mjs +7 -0
- package/esm2020/src/util/ReturnResult.mjs +46 -0
- package/{esm2015/src/util/ReturnResultBase.js → esm2020/src/util/ReturnResultBase.mjs} +0 -0
- package/{esm2015/src/util/Scrambler.js → esm2020/src/util/Scrambler.mjs} +0 -0
- package/{esm2015/src/util/UniqueIDUtils.js → esm2020/src/util/UniqueIDUtils.mjs} +0 -0
- package/{esm2015/src/util/cookie.service.js → esm2020/src/util/cookie.service.mjs} +0 -0
- package/fesm2015/{magic-xpa-engine.js → magic-xpa-engine.mjs} +613 -420
- package/fesm2015/magic-xpa-engine.mjs.map +1 -0
- package/fesm2020/magic-xpa-engine.mjs +30705 -0
- package/fesm2020/magic-xpa-engine.mjs.map +1 -0
- package/index.d.ts +3 -0
- package/package.json +27 -13
- package/src/AccessHelper.d.ts +1 -1
- package/src/CommandsProcessorBase.d.ts +3 -3
- package/src/ConstInterface.d.ts +6 -2
- package/src/GuiEventsProcessor.d.ts +1 -1
- package/src/commands/ClientToServer/BrowserEscEventCommand.d.ts +1 -2
- package/src/commands/ClientToServer/ClientOriginatedCommand.d.ts +1 -2
- package/src/commands/ClientToServer/ColumnSortEventCommand.d.ts +1 -2
- package/src/commands/ClientToServer/CommandFactory.d.ts +1 -0
- package/src/commands/ClientToServer/ComputeEventCommand.d.ts +1 -2
- package/src/commands/ClientToServer/ContextTerminationEventCommand.d.ts +1 -2
- package/src/commands/ClientToServer/ContextTimeoutResetCommand.d.ts +1 -2
- package/src/commands/ClientToServer/DataviewCommand.d.ts +1 -2
- package/src/commands/ClientToServer/EvaluateCommand.d.ts +1 -2
- package/src/commands/ClientToServer/EventCommand.d.ts +1 -2
- package/src/commands/ClientToServer/ExecOperCommand.d.ts +3 -3
- package/src/commands/ClientToServer/FetchDataControlValuesEventCommand.d.ts +1 -2
- package/src/commands/ClientToServer/IndexChangeEventCommand.d.ts +1 -2
- package/src/commands/ClientToServer/IniputForceWriteCommand.d.ts +1 -2
- package/src/commands/ClientToServer/NonReversibleExitEventCommand.d.ts +1 -2
- package/src/commands/ClientToServer/QueryCommand.d.ts +1 -2
- package/src/commands/ClientToServer/RecomputeCommand.d.ts +1 -2
- package/src/commands/ClientToServer/RefreshEventCommand.d.ts +1 -2
- package/src/commands/ClientToServer/RefreshScreenEventCommand.d.ts +1 -2
- package/src/commands/ClientToServer/RollbackEventCommand.d.ts +1 -2
- package/src/commands/ClientToServer/SelectProgramCommand.d.ts +6 -0
- package/src/commands/ClientToServer/SubformOpenEventCommand.d.ts +1 -2
- package/src/commands/ClientToServer/SubformRefreshEventCommand.d.ts +1 -2
- package/src/commands/ClientToServer/TransactionCommand.d.ts +1 -2
- package/src/commands/ClientToServer/WriteMessageToServerLogCommand.d.ts +1 -2
- package/src/commands/DataViewCommandBase.d.ts +2 -2
- package/src/commands/IClientTargetedCommand.d.ts +1 -1
- package/src/commands/ServerToClient/ClientTargetedCommandBase.d.ts +1 -1
- package/src/commands/ServerToClient/EnhancedVerifyCommand.d.ts +0 -1
- package/src/data/FieldBase.d.ts +3 -3
- package/src/data/Record.d.ts +2 -9
- package/src/data/RecordsTable.d.ts +1 -2
- package/src/data/XMLBasedDcValuesBuilder.d.ts +1 -1
- package/src/env/EnvVariablesTable.d.ts +2 -15
- package/src/env/Environment.d.ts +3 -3
- package/src/env/MirrorString.d.ts +15 -0
- package/src/event/Event.d.ts +0 -3
- package/src/event/EventsManager.d.ts +18 -9
- package/src/event/IEventsManager.d.ts +6 -6
- package/src/exp/ExpressionEvaluator.d.ts +3 -2
- package/src/exp/ExpressionLocalJpn.d.ts +2 -2
- package/src/exp/GlobalParamsTable.d.ts +2 -1
- package/src/gui/MgControl.d.ts +0 -2
- package/src/gui/MgForm.d.ts +5 -5
- package/src/http/client/HttpClientAsync.d.ts +2 -2
- package/src/http/client/HttpClientBase.d.ts +3 -3
- package/src/http/client/HttpClientSync.d.ts +2 -2
- package/src/remote/RemoteCommandsProcessor.d.ts +1 -1
- package/src/rt/DataviewHeaderBase.d.ts +2 -2
- package/src/rt/DataviewHeaderFactory.d.ts +1 -1
- package/src/rt/Operation.d.ts +3 -4
- package/src/rt/RemoteDataviewHeader.d.ts +1 -2
- package/src/rt/Transaction.d.ts +1 -1
- package/src/tasks/MGData.d.ts +2 -0
- package/src/tasks/MGDataCollection.d.ts +1 -0
- package/src/tasks/RemoteTaskService.d.ts +2 -3
- package/src/tasks/Task.d.ts +1 -2
- package/src/tasks/TaskBase.d.ts +7 -7
- package/src/tasks/TaskServiceBase.d.ts +2 -4
- package/src/tasks/sort/SortCollection.d.ts +2 -3
- package/src/util/FlowMonitorQueue.d.ts +1 -1
- package/src/util/IMirrorXML.d.ts +1 -1
- package/src/util/ParamParseResult.d.ts +6 -0
- package/src/util/PrmMap.d.ts +1 -6
- package/src/util/Process.d.ts +1 -1
- package/bundles/magic-xpa-engine.umd.js +0 -37878
- package/bundles/magic-xpa-engine.umd.js.map +0 -1
- package/bundles/magic-xpa-engine.umd.min.js +0 -16
- package/bundles/magic-xpa-engine.umd.min.js.map +0 -1
- package/esm2015/index.js +0 -187
- package/esm2015/src/AccessHelper.js +0 -3
- package/esm2015/src/ClientManager.js +0 -412
- package/esm2015/src/CommandsProcessorBase.js +0 -54
- package/esm2015/src/CommandsProcessorManager.js +0 -31
- package/esm2015/src/CommandsTable.js +0 -166
- package/esm2015/src/ConstInterface.js +0 -725
- package/esm2015/src/GUIManager.js +0 -72
- package/esm2015/src/GuiEventsProcessor.js +0 -171
- package/esm2015/src/bridge/MagicBridge.js +0 -44
- package/esm2015/src/commands/ClientToServer/BrowserEscEventCommand.js +0 -24
- package/esm2015/src/commands/ClientToServer/ClientOriginatedCommand.js +0 -15
- package/esm2015/src/commands/ClientToServer/ClientOriginatedCommandSerializer.js +0 -60
- package/esm2015/src/commands/ClientToServer/ColumnSortEventCommand.js +0 -26
- package/esm2015/src/commands/ClientToServer/CommandFactory.js +0 -269
- package/esm2015/src/commands/ClientToServer/ComputeEventCommand.js +0 -23
- package/esm2015/src/commands/ClientToServer/ContextTerminationEventCommand.js +0 -21
- package/esm2015/src/commands/ClientToServer/ContextTimeoutResetCommand.js +0 -20
- package/esm2015/src/commands/ClientToServer/EvaluateCommand.js +0 -36
- package/esm2015/src/commands/ClientToServer/EventCommand.js +0 -40
- package/esm2015/src/commands/ClientToServer/ExecOperCommand.js +0 -64
- package/esm2015/src/commands/ClientToServer/FetchDataControlValuesEventCommand.js +0 -22
- package/esm2015/src/commands/ClientToServer/IndexChangeEventCommand.js +0 -21
- package/esm2015/src/commands/ClientToServer/IniputForceWriteCommand.js +0 -23
- package/esm2015/src/commands/ClientToServer/NonReversibleExitEventCommand.js +0 -23
- package/esm2015/src/commands/ClientToServer/QueryCommand.js +0 -21
- package/esm2015/src/commands/ClientToServer/RecomputeCommand.js +0 -27
- package/esm2015/src/commands/ClientToServer/RefreshEventCommand.js +0 -27
- package/esm2015/src/commands/ClientToServer/RefreshScreenEventCommand.js +0 -24
- package/esm2015/src/commands/ClientToServer/RollbackEventCommand.js +0 -39
- package/esm2015/src/commands/ClientToServer/SubformOpenEventCommand.js +0 -21
- package/esm2015/src/commands/ClientToServer/SubformRefreshEventCommand.js +0 -24
- package/esm2015/src/commands/ClientToServer/TransactionCommand.js +0 -28
- package/esm2015/src/commands/ClientToServer/WriteMessageToServerLogCommand.js +0 -18
- package/esm2015/src/commands/DataViewCommandBase.js +0 -6
- package/esm2015/src/commands/IClientTargetedCommand.js +0 -6
- package/esm2015/src/commands/ServerToClient/AbortCommand.js +0 -68
- package/esm2015/src/commands/ServerToClient/AddLocateCommand.js +0 -25
- package/esm2015/src/commands/ServerToClient/AddRangeCommand.js +0 -65
- package/esm2015/src/commands/ServerToClient/AddSortCommand.js +0 -36
- package/esm2015/src/commands/ServerToClient/ClientTargetedCommandBase.js +0 -24
- package/esm2015/src/commands/ServerToClient/EnhancedVerifyCommand.js +0 -54
- package/esm2015/src/commands/ServerToClient/OpenURLCommand.js +0 -225
- package/esm2015/src/commands/ServerToClient/ResetLocateCommand.js +0 -18
- package/esm2015/src/commands/ServerToClient/ResetRangeCommand.js +0 -18
- package/esm2015/src/commands/ServerToClient/ResetSortCommand.js +0 -18
- package/esm2015/src/commands/ServerToClient/ResultCommand.js +0 -40
- package/esm2015/src/commands/ServerToClient/VerifyCommand.js +0 -88
- package/esm2015/src/communications/InteractiveCommunicationsFailureHandler.js +0 -20
- package/esm2015/src/data/DataView.js +0 -1693
- package/esm2015/src/data/DataviewManager.js +0 -31
- package/esm2015/src/data/DataviewManagerBase.js +0 -18
- package/esm2015/src/data/Field.js +0 -672
- package/esm2015/src/data/FieldBase.js +0 -9
- package/esm2015/src/data/Record.js +0 -914
- package/esm2015/src/data/RecordsTable.js +0 -267
- package/esm2015/src/data/TaskTransactionManager.js +0 -110
- package/esm2015/src/data/XMLBasedDcValuesBuilder.js +0 -74
- package/esm2015/src/env/EnvVariablesTable.js +0 -408
- package/esm2015/src/env/Environment.js +0 -553
- package/esm2015/src/env/LanguageData.js +0 -230
- package/esm2015/src/event/ActionManager.js +0 -93
- package/esm2015/src/event/Event.js +0 -1449
- package/esm2015/src/event/EventHandler.js +0 -781
- package/esm2015/src/event/EventHandlerPosition.js +0 -201
- package/esm2015/src/event/EventsManager.js +0 -3007
- package/esm2015/src/event/IEventsManager.js +0 -7
- package/esm2015/src/event/RunTimeEvent.js +0 -406
- package/esm2015/src/exp/Expression.js +0 -209
- package/esm2015/src/exp/ExpressionEvaluator.js +0 -4430
- package/esm2015/src/exp/ExpressionLocalJpn.js +0 -314
- package/esm2015/src/exp/GlobalParamsTable.js +0 -84
- package/esm2015/src/exp/YesNoExp.js +0 -44
- package/esm2015/src/gui/FormsTable.js +0 -73
- package/esm2015/src/gui/MgControl.js +0 -438
- package/esm2015/src/gui/MgForm.js +0 -1300
- package/esm2015/src/http/HttpManager.js +0 -100
- package/esm2015/src/http/client/HttpClientAsync.js +0 -72
- package/esm2015/src/http/client/HttpClientBase.js +0 -148
- package/esm2015/src/http/client/HttpClientSync.js +0 -47
- package/esm2015/src/remote/AddUserLocateRemoteDataViewCommand.js +0 -21
- package/esm2015/src/remote/AddUserRangeRemoteDataViewCommand.js +0 -21
- package/esm2015/src/remote/AddUserSortRemoteDataViewCommand.js +0 -21
- package/esm2015/src/remote/RemoteCommandsProcessor.js +0 -876
- package/esm2015/src/remote/RemoteControlItemsRefreshCommand.js +0 -28
- package/esm2015/src/remote/RemoteDataViewCommandBase.js +0 -27
- package/esm2015/src/remote/RemoteDataViewCommandUpdateNonModifiable.js +0 -19
- package/esm2015/src/remote/RemoteDataviewManager.js +0 -23
- package/esm2015/src/remote/RemoteInitDataViewCommand.js +0 -14
- package/esm2015/src/remote/ResetUserLocateRemoteDataviewCommand.js +0 -20
- package/esm2015/src/remote/ResetUserRangeRemoteDataviewCommand.js +0 -16
- package/esm2015/src/remote/ResetUserSortRemoteDataviewCommand.js +0 -19
- package/esm2015/src/remote/ServerError.js +0 -45
- package/esm2015/src/rt/Argument.js +0 -281
- package/esm2015/src/rt/ArgumentsList.js +0 -108
- package/esm2015/src/rt/Boundary.js +0 -161
- package/esm2015/src/rt/DataviewHeaderBase.js +0 -96
- package/esm2015/src/rt/DataviewHeaderFactory.js +0 -7
- package/esm2015/src/rt/DataviewHeadersSaxHandler.js +0 -40
- package/esm2015/src/rt/Operation.js +0 -792
- package/esm2015/src/rt/Recompute.js +0 -372
- package/esm2015/src/rt/RemoteDataviewHeader.js +0 -114
- package/esm2015/src/rt/TableCache.js +0 -182
- package/esm2015/src/rt/TableCacheManager.js +0 -70
- package/esm2015/src/rt/Transaction.js +0 -54
- package/esm2015/src/tasks/MGData.js +0 -551
- package/esm2015/src/tasks/MGDataCollection.js +0 -260
- package/esm2015/src/tasks/RemoteTaskService.js +0 -45
- package/esm2015/src/tasks/Task.js +0 -2593
- package/esm2015/src/tasks/TaskServiceBase.js +0 -30
- package/esm2015/src/tasks/TasksTable.js +0 -87
- package/esm2015/src/tasks/sort/SortCollection.js +0 -72
- package/esm2015/src/util/MgPriorityBlockingQueue.js +0 -79
- package/esm2015/src/util/PrmMap.js +0 -147
- package/esm2015/src/util/Process.js +0 -7
- package/esm2015/src/util/ReturnResult.js +0 -46
- package/fesm2015/magic-xpa-engine.js.map +0 -1
|
@@ -1,2593 +0,0 @@
|
|
|
1
|
-
import { __awaiter } from "tslib";
|
|
2
|
-
import { Debug, HashUtils, List, NNumber, NString, RefParam, Stack, StringBuilder } from '@magic-xpa/mscorelib';
|
|
3
|
-
import { Constants, InternalInterface, Logger, Logger_LogLevels, StorageAttribute, StrUtil, WindowType, XMLConstants, XmlParser } from '@magic-xpa/utils';
|
|
4
|
-
import { Commands, DataModificationTypes, DisplayConvertor, GuiDataCollection, Manager, NUM_TYPE, PIC, PropInterface, RecordUtils, RuntimeContextBase, Styles, TaskDefinitionId, Events, Helps } from '@magic-xpa/gui';
|
|
5
|
-
import { DataView } from '../data/DataView';
|
|
6
|
-
import { DvCache } from '../data/DvCache';
|
|
7
|
-
import { DataViewCommandType } from '../commands/ClientToServer/DataviewCommand';
|
|
8
|
-
import { CommandsProcessorBase_SendingInstruction } from '../CommandsProcessorBase';
|
|
9
|
-
import { TaskServiceBase } from './TaskServiceBase';
|
|
10
|
-
import { TaskTransactionManager } from '../data/TaskTransactionManager';
|
|
11
|
-
import { DataviewManager } from '../data/DataviewManager';
|
|
12
|
-
import { SortCollection } from './sort/SortCollection';
|
|
13
|
-
import { MgForm } from '../gui/MgForm';
|
|
14
|
-
import { RemoteTaskService } from './RemoteTaskService';
|
|
15
|
-
import { ReturnResult } from '../util/ReturnResult';
|
|
16
|
-
import { RunTimeEvent } from '../event/RunTimeEvent';
|
|
17
|
-
import { CommandFactory } from '../commands/ClientToServer/CommandFactory';
|
|
18
|
-
import { DataviewHeaders } from '../rt/DataviewHeaders';
|
|
19
|
-
import { Transaction } from '../rt/Transaction';
|
|
20
|
-
import { TasksTable } from './TasksTable';
|
|
21
|
-
import { HandlersTable } from '../rt/HandlersTable';
|
|
22
|
-
import { RecomputeTable } from '../rt/RecomputeTable';
|
|
23
|
-
import { ExpTable } from '../exp/ExpTable';
|
|
24
|
-
import { UserEventsTable } from '../event/UserEventsTable';
|
|
25
|
-
import { FormsTable } from '../gui/FormsTable';
|
|
26
|
-
import { FlowMonitorQueue } from '../util/FlowMonitorQueue';
|
|
27
|
-
import { ActionManager } from '../event/ActionManager';
|
|
28
|
-
import { ConstInterface } from '../ConstInterface';
|
|
29
|
-
import { GUIManager } from '../GUIManager';
|
|
30
|
-
import { CommandsProcessorManager } from '../CommandsProcessorManager';
|
|
31
|
-
import { EventSubType } from '../enums';
|
|
32
|
-
import { OpeningTaskDetails, Task_SubformExecModeEnum, TaskBase } from './TaskBase';
|
|
33
|
-
import { LanguageData } from '../env/LanguageData';
|
|
34
|
-
import { Environment } from '../env/Environment';
|
|
35
|
-
import { LastFocusedManager } from '../rt/LastFocusedManager';
|
|
36
|
-
import { GlobalCommandsManager } from '../GlobalCommandsManager';
|
|
37
|
-
import { EventsAllowedType } from '../event/IEventsManager';
|
|
38
|
-
import { AccessHelper } from '../AccessHelper';
|
|
39
|
-
import { isNullOrUndefined } from 'util';
|
|
40
|
-
import { MGDataCollection } from './MGDataCollection';
|
|
41
|
-
import { RemoteCommandsProcessor } from "../remote/RemoteCommandsProcessor";
|
|
42
|
-
import { EventHandlerPosition } from '../event/EventHandlerPosition';
|
|
43
|
-
export var Task_Flow;
|
|
44
|
-
(function (Task_Flow) {
|
|
45
|
-
Task_Flow[Task_Flow["NONE"] = 0] = "NONE";
|
|
46
|
-
Task_Flow[Task_Flow["STEP"] = 1] = "STEP";
|
|
47
|
-
Task_Flow[Task_Flow["FAST"] = 2] = "FAST";
|
|
48
|
-
})(Task_Flow || (Task_Flow = {}));
|
|
49
|
-
export var Task_Direction;
|
|
50
|
-
(function (Task_Direction) {
|
|
51
|
-
Task_Direction[Task_Direction["BACK"] = -1] = "BACK";
|
|
52
|
-
Task_Direction[Task_Direction["NONE"] = 0] = "NONE";
|
|
53
|
-
Task_Direction[Task_Direction["FORE"] = 1] = "FORE";
|
|
54
|
-
})(Task_Direction || (Task_Direction = {}));
|
|
55
|
-
var FlowModeDir;
|
|
56
|
-
(function (FlowModeDir) {
|
|
57
|
-
FlowModeDir["NONE"] = " ";
|
|
58
|
-
FlowModeDir["FAST_BACKWARD"] = "R";
|
|
59
|
-
FlowModeDir["FAST_FORWARD"] = "F";
|
|
60
|
-
FlowModeDir["STEP_BACKWARD"] = "P";
|
|
61
|
-
FlowModeDir["STEP_FORWARD"] = "N";
|
|
62
|
-
})(FlowModeDir || (FlowModeDir = {}));
|
|
63
|
-
export class Task extends TaskBase {
|
|
64
|
-
constructor(parent) {
|
|
65
|
-
super();
|
|
66
|
-
this._dvCache = null;
|
|
67
|
-
this._mgData = null;
|
|
68
|
-
this._aborting = false;
|
|
69
|
-
this._bExecEndTask = false;
|
|
70
|
-
this._isStarted = false;
|
|
71
|
-
this._evalOldValues = false;
|
|
72
|
-
this._inRecordSuffix = false;
|
|
73
|
-
this._cancelWasRaised = false;
|
|
74
|
-
this._counter = 0;
|
|
75
|
-
this._currStartProgLevel = 0;
|
|
76
|
-
this._destinationSubform = false;
|
|
77
|
-
this._enableZoomHandler = false;
|
|
78
|
-
this._firstRecordCycle = false;
|
|
79
|
-
this._originalTaskMode = ' ';
|
|
80
|
-
this._inCreateLine = false;
|
|
81
|
-
this.InSelect = false;
|
|
82
|
-
this.InStartProcess = false;
|
|
83
|
-
this._isDestinationCall = false;
|
|
84
|
-
this._knownToServer = true;
|
|
85
|
-
this._loopStack = null;
|
|
86
|
-
this.DelayCommandExecution = false;
|
|
87
|
-
this._parentTask = null;
|
|
88
|
-
this.ContextTask = null;
|
|
89
|
-
this._triggeringTask = null;
|
|
90
|
-
this.PathParentTask = null;
|
|
91
|
-
this._preventControlChange = false;
|
|
92
|
-
this._preventRecordSuffix = false;
|
|
93
|
-
this._taskPath = null;
|
|
94
|
-
this._tryingToCommit = false;
|
|
95
|
-
this._useLoopStack = false;
|
|
96
|
-
this._inProcessingTopMostEndTaskSaved = false;
|
|
97
|
-
this.InHandleActCancel = false;
|
|
98
|
-
this.RuntimeSorts = null;
|
|
99
|
-
this.VewFirst = 0;
|
|
100
|
-
this.dataViewContent = null;
|
|
101
|
-
this.PerformParentRecordPrefix = false;
|
|
102
|
-
this.ModeAsParent = false;
|
|
103
|
-
this.TaskTransactionManager = null;
|
|
104
|
-
this.ExecuteClientSubformRefresh = false;
|
|
105
|
-
this.InCommonHandlerBeforeRP = false;
|
|
106
|
-
this._taskService = null;
|
|
107
|
-
this.hasLocate = false;
|
|
108
|
-
this.taskDefinitionId = null;
|
|
109
|
-
this.ArgumentsList = null;
|
|
110
|
-
this.ConfirmUpdateNo = false;
|
|
111
|
-
this.DataSynced = false;
|
|
112
|
-
this.UniqueSort = null;
|
|
113
|
-
this.RefreshOnVars = null;
|
|
114
|
-
this.DvPosDescriptor = null;
|
|
115
|
-
this.SubTasks = null;
|
|
116
|
-
this.ExpTab = null;
|
|
117
|
-
this.UserEvtTab = null;
|
|
118
|
-
this.DataviewHeadersTable = null;
|
|
119
|
-
this.HandlersTab = null;
|
|
120
|
-
this._forms = null;
|
|
121
|
-
this.Name = null;
|
|
122
|
-
this.PublicName = null;
|
|
123
|
-
this.TaskSuffixExecuted = false;
|
|
124
|
-
this.RetrunValueExp = 0;
|
|
125
|
-
this.SubformControl = null;
|
|
126
|
-
if (isNullOrUndefined(parent)) {
|
|
127
|
-
this.constructor_0();
|
|
128
|
-
return;
|
|
129
|
-
}
|
|
130
|
-
this.constructor_1(parent);
|
|
131
|
-
}
|
|
132
|
-
get ParentTask() {
|
|
133
|
-
return this._parentTask;
|
|
134
|
-
}
|
|
135
|
-
set TryingToCommit(value) {
|
|
136
|
-
this._tryingToCommit = value;
|
|
137
|
-
}
|
|
138
|
-
get TryingToCommit() {
|
|
139
|
-
return this._tryingToCommit;
|
|
140
|
-
}
|
|
141
|
-
get TaskService() {
|
|
142
|
-
if (this._taskService == null)
|
|
143
|
-
this._taskService = new RemoteTaskService();
|
|
144
|
-
return this._taskService;
|
|
145
|
-
}
|
|
146
|
-
static get CommandsProcessor() {
|
|
147
|
-
return CommandsProcessorManager.GetCommandsProcessor();
|
|
148
|
-
}
|
|
149
|
-
get LogicalStudioParentTask() {
|
|
150
|
-
if (this.StudioParentTask === null && !super.isMainProg()) {
|
|
151
|
-
return GuiDataCollection.MGDataTable.GetMainProgByCtlIdx(this.ContextID, this._ctlIdx);
|
|
152
|
-
}
|
|
153
|
-
return this.StudioParentTask;
|
|
154
|
-
}
|
|
155
|
-
get KnownToServer() {
|
|
156
|
-
return this._knownToServer;
|
|
157
|
-
}
|
|
158
|
-
set Transaction(value) {
|
|
159
|
-
this.DataviewManager.CurrentDataviewManager.Transaction = value;
|
|
160
|
-
}
|
|
161
|
-
get Transaction() {
|
|
162
|
-
return this.DataviewManager.CurrentDataviewManager.Transaction;
|
|
163
|
-
}
|
|
164
|
-
get TaskDefinitionId() {
|
|
165
|
-
if (this.taskDefinitionId === null) {
|
|
166
|
-
this.taskDefinitionId = new TaskDefinitionId(this._ctlIdx, this.ProgramIsn, this.TaskIsn, this._isPrg);
|
|
167
|
-
}
|
|
168
|
-
return this.taskDefinitionId;
|
|
169
|
-
}
|
|
170
|
-
static get IsBlockingBatch() {
|
|
171
|
-
return false;
|
|
172
|
-
}
|
|
173
|
-
constructor_0() {
|
|
174
|
-
this.ActionManager = new ActionManager(this);
|
|
175
|
-
this.DataView = new DataView(this);
|
|
176
|
-
this._flowMonitor = FlowMonitorQueue.Instance;
|
|
177
|
-
this.ContextTask = this;
|
|
178
|
-
this._dvCache = new DvCache(this);
|
|
179
|
-
this.PerformParentRecordPrefix = true;
|
|
180
|
-
this.DataviewManager = new DataviewManager(this);
|
|
181
|
-
this.allowRemoteCmdExecution = true;
|
|
182
|
-
this.TaskTransactionManager = new TaskTransactionManager(this);
|
|
183
|
-
}
|
|
184
|
-
Init() {
|
|
185
|
-
this.DataView.Init();
|
|
186
|
-
}
|
|
187
|
-
constructor_1(parent) {
|
|
188
|
-
this.constructor_0();
|
|
189
|
-
this.PathParentTask = parent;
|
|
190
|
-
this._parentTask = parent;
|
|
191
|
-
this._triggeringTask = null;
|
|
192
|
-
this.buildTaskPath();
|
|
193
|
-
}
|
|
194
|
-
static CreateTask() {
|
|
195
|
-
let task = new Task();
|
|
196
|
-
task.Init();
|
|
197
|
-
return task;
|
|
198
|
-
}
|
|
199
|
-
isAborting() {
|
|
200
|
-
return this._aborting;
|
|
201
|
-
}
|
|
202
|
-
buildTaskPath() {
|
|
203
|
-
this._taskPath = new List();
|
|
204
|
-
if (this._parentTask._taskPath !== null)
|
|
205
|
-
this._taskPath.AddRange(this._parentTask._taskPath.GetEnumerator());
|
|
206
|
-
this._taskPath.push(this);
|
|
207
|
-
}
|
|
208
|
-
fillData(mgd, openingTaskDetails) {
|
|
209
|
-
const _super = Object.create(null, {
|
|
210
|
-
isMainProg: { get: () => super.isMainProg }
|
|
211
|
-
});
|
|
212
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
213
|
-
if (!_super.isMainProg.call(this)) {
|
|
214
|
-
if (this._parentTask === null && openingTaskDetails.CallingTask !== null) {
|
|
215
|
-
this._parentTask = openingTaskDetails.CallingTask;
|
|
216
|
-
this.buildTaskPath();
|
|
217
|
-
openingTaskDetails.CallingTask.addSubTask(this);
|
|
218
|
-
}
|
|
219
|
-
if (this.PathParentTask === null && openingTaskDetails.PathParentTask !== null) {
|
|
220
|
-
this.PathParentTask = openingTaskDetails.PathParentTask;
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
if (this._parentTask !== null && this._parentTask.getEnableZoomHandler()) {
|
|
224
|
-
this.setEnableZoomHandler();
|
|
225
|
-
}
|
|
226
|
-
this._mgData = mgd;
|
|
227
|
-
this.fillAttributes();
|
|
228
|
-
this._mgData.addTask(this);
|
|
229
|
-
let parentForm = (this._parentTask !== null) ? this._parentTask.getForm() : null;
|
|
230
|
-
while (yield this.initInnerObjects(RuntimeContextBase.Instance.Parser.getNextTag(), parentForm)) {
|
|
231
|
-
}
|
|
232
|
-
this.TaskTransactionManager.PrepareTransactionProperties(this.DataviewManager.RemoteDataviewManager.Transaction, false);
|
|
233
|
-
this.HandleTriggerTask();
|
|
234
|
-
this.HandlePreviouslyActiveTaskId();
|
|
235
|
-
this.CheckAndSetSubForm();
|
|
236
|
-
if (this.IsSubForm) {
|
|
237
|
-
let subFormCtrl = this.getParent().getForm().getSubFormCtrlForTask(this._taskTag);
|
|
238
|
-
if (subFormCtrl !== null) {
|
|
239
|
-
subFormCtrl.setSubformTaskId(this._taskTag);
|
|
240
|
-
}
|
|
241
|
-
if (this.Form !== null) {
|
|
242
|
-
this.Form.setSubFormCtrl(subFormCtrl);
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
});
|
|
246
|
-
}
|
|
247
|
-
HandlePreviouslyActiveTaskId() {
|
|
248
|
-
if (this._parentTask !== null && this._parentTask.GetContextTask() !== null && this._mgData !== this._parentTask.getMGData())
|
|
249
|
-
this.PreviouslyActiveTaskId = (this._parentTask.GetContextTask()).getTaskTag();
|
|
250
|
-
else if (this._parentTask !== null)
|
|
251
|
-
this.PreviouslyActiveTaskId = this._parentTask.getTaskTag();
|
|
252
|
-
}
|
|
253
|
-
HandleTriggerTask() {
|
|
254
|
-
this._triggeringTask = this._parentTask;
|
|
255
|
-
}
|
|
256
|
-
FillTaskTables(taskTablesData) {
|
|
257
|
-
if (arguments.length === 1) {
|
|
258
|
-
this.FillTaskTables_0(taskTablesData);
|
|
259
|
-
return;
|
|
260
|
-
}
|
|
261
|
-
this.FillTaskTables_1();
|
|
262
|
-
}
|
|
263
|
-
FillTaskTables_0(taskTablesData) {
|
|
264
|
-
}
|
|
265
|
-
fillAttributes() {
|
|
266
|
-
let parser = RuntimeContextBase.Instance.Parser;
|
|
267
|
-
let endContext = parser.getXMLdata().indexOf(XMLConstants.TAG_CLOSE, parser.getCurrIndex());
|
|
268
|
-
if (endContext !== -1 && endContext < parser.getXMLdata().length) {
|
|
269
|
-
super.fillAttributes(parser);
|
|
270
|
-
if (super.isMainProg())
|
|
271
|
-
this._mgData = AccessHelper.mgDataTable.getMGData(0);
|
|
272
|
-
}
|
|
273
|
-
else {
|
|
274
|
-
Logger.Instance.WriteExceptionToLogWithMsg("in Task.fillAttributes() out of string bounds");
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
setAttribute(attribute, valueStr) {
|
|
278
|
-
let isTagProcessed;
|
|
279
|
-
isTagProcessed = super.setAttribute(attribute, valueStr);
|
|
280
|
-
if (!isTagProcessed) {
|
|
281
|
-
isTagProcessed = true;
|
|
282
|
-
switch (attribute) {
|
|
283
|
-
case ConstInterface.MG_ATTR_REFRESHON:
|
|
284
|
-
if (!(valueStr.trim() === ""))
|
|
285
|
-
this.SetRefreshOnVars(valueStr);
|
|
286
|
-
break;
|
|
287
|
-
case XMLConstants.MG_ATTR_NAME:
|
|
288
|
-
this.Name = valueStr;
|
|
289
|
-
break;
|
|
290
|
-
case ConstInterface.MG_ATTR_DVPOS_DEC:
|
|
291
|
-
if (!(valueStr.trim() === ""))
|
|
292
|
-
this.setDescriptor(valueStr);
|
|
293
|
-
break;
|
|
294
|
-
case ConstInterface.MG_ATTR_HAS_LOCATE:
|
|
295
|
-
this.hasLocate = true;
|
|
296
|
-
break;
|
|
297
|
-
case ConstInterface.MG_ATTR_AS_PARENT:
|
|
298
|
-
this.ModeAsParent = true;
|
|
299
|
-
break;
|
|
300
|
-
case ConstInterface.MG_ATTR_TASK_UNIQUE_SORT:
|
|
301
|
-
this.UniqueSort = valueStr[0];
|
|
302
|
-
break;
|
|
303
|
-
case ConstInterface.MG_ATTR_TRANS_ID:
|
|
304
|
-
this.setRemoteTransaction(valueStr);
|
|
305
|
-
break;
|
|
306
|
-
case ConstInterface.MG_ATTR_PUBLIC:
|
|
307
|
-
this.PublicName = XmlParser.unescape(valueStr);
|
|
308
|
-
break;
|
|
309
|
-
case XMLConstants.MG_ATTR_IS_OFFLINE:
|
|
310
|
-
this.IsOffline = XmlParser.getBoolean(valueStr);
|
|
311
|
-
break;
|
|
312
|
-
case XMLConstants.MG_ATTR_RETURN_VALUE_EXP:
|
|
313
|
-
this.RetrunValueExp = XmlParser.getInt(valueStr);
|
|
314
|
-
break;
|
|
315
|
-
case XMLConstants.MG_ATTR_MENUS_FILE_NAME:
|
|
316
|
-
break;
|
|
317
|
-
default:
|
|
318
|
-
isTagProcessed = false;
|
|
319
|
-
break;
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
|
-
if (!isTagProcessed)
|
|
323
|
-
Logger.Instance.WriteExceptionToLogWithMsg(NString.Format("Unrecognized attribute: '{0}'", attribute));
|
|
324
|
-
return true;
|
|
325
|
-
}
|
|
326
|
-
initInnerObjects(foundTagName, parentForm) {
|
|
327
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
328
|
-
if (foundTagName == null)
|
|
329
|
-
return false;
|
|
330
|
-
let parser = RuntimeContextBase.Instance.Parser;
|
|
331
|
-
switch (foundTagName) {
|
|
332
|
-
case XMLConstants.MG_TAG_HELPTABLE:
|
|
333
|
-
if (this._helpTab == null)
|
|
334
|
-
this._helpTab = new Helps();
|
|
335
|
-
if (Events.ShouldLog(Logger_LogLevels.Development))
|
|
336
|
-
Events.WriteDevToLog(NString.Format("{0} ...", foundTagName));
|
|
337
|
-
this._helpTab.fillData(parser);
|
|
338
|
-
break;
|
|
339
|
-
case XMLConstants.MG_TAG_DVHEADER:
|
|
340
|
-
if (Events.ShouldLog(Logger_LogLevels.Development))
|
|
341
|
-
Events.WriteDevToLog(NString.Format("{0} ...", foundTagName));
|
|
342
|
-
this.DataView.fillHeaderData(parser);
|
|
343
|
-
break;
|
|
344
|
-
case XMLConstants.MG_TAG_PROP:
|
|
345
|
-
this._propTab.fillData(this, 'T', parser);
|
|
346
|
-
break;
|
|
347
|
-
case XMLConstants.MG_TAG_FORM:
|
|
348
|
-
this.Form = this.FormInitData(parentForm);
|
|
349
|
-
break;
|
|
350
|
-
case XMLConstants.MG_ATTR_MENU_CONTENT:
|
|
351
|
-
break;
|
|
352
|
-
case "assemblies":
|
|
353
|
-
let start = parser.getCurrIndex();
|
|
354
|
-
let endContext = parser.getXMLdata().indexOf('/assemblies', parser.getCurrIndex());
|
|
355
|
-
parser.setCurrIndex(endContext);
|
|
356
|
-
parser.setCurrIndex2EndOfTag();
|
|
357
|
-
break;
|
|
358
|
-
case XMLConstants.MG_TAG_FORMS:
|
|
359
|
-
this._forms = new FormsTable(this, parentForm);
|
|
360
|
-
Logger.Instance.WriteDevToLog(NString.Format("{0} ...", foundTagName));
|
|
361
|
-
yield this._forms.fillData();
|
|
362
|
-
break;
|
|
363
|
-
case XMLConstants.MG_TAG_TASK:
|
|
364
|
-
if (this.SubTasks == null)
|
|
365
|
-
this.SubTasks = new TasksTable();
|
|
366
|
-
let subtask = new Task(this);
|
|
367
|
-
subtask.Init();
|
|
368
|
-
this.SubTasks.addTask(subtask);
|
|
369
|
-
let mgd = this._mgData;
|
|
370
|
-
if (this.isMainProg())
|
|
371
|
-
mgd = AccessHelper.mgDataTable.GetMGDataForStartupProgram();
|
|
372
|
-
yield subtask.fillData(mgd, new OpeningTaskDetails());
|
|
373
|
-
break;
|
|
374
|
-
case ConstInterface.MG_TAG_TASKURL:
|
|
375
|
-
yield Task.ProcessTaskURL();
|
|
376
|
-
break;
|
|
377
|
-
case ConstInterface.MG_TAG_EXPTABLE:
|
|
378
|
-
if (this.ExpTab == null)
|
|
379
|
-
this.ExpTab = new ExpTable();
|
|
380
|
-
Logger.Instance.WriteDevToLog("goes to exp");
|
|
381
|
-
this.ExpTab.fillData(this, parser);
|
|
382
|
-
break;
|
|
383
|
-
case ConstInterface.MG_TAG_USER_EVENTS:
|
|
384
|
-
if (this.UserEvtTab == null)
|
|
385
|
-
this.UserEvtTab = new UserEventsTable();
|
|
386
|
-
Logger.Instance.WriteDevToLog("goes to user event tab");
|
|
387
|
-
this.UserEvtTab.fillData(this, parser);
|
|
388
|
-
break;
|
|
389
|
-
case ConstInterface.MG_TAG_LINKS:
|
|
390
|
-
this.DataviewHeadersTable = new DataviewHeaders(this);
|
|
391
|
-
this.DataviewHeadersTable.fillData(parser);
|
|
392
|
-
break;
|
|
393
|
-
case ConstInterface.MG_TAG_SORTS:
|
|
394
|
-
this.RuntimeSorts = new SortCollection();
|
|
395
|
-
this.RuntimeSorts.fillData(this, parser);
|
|
396
|
-
break;
|
|
397
|
-
case ConstInterface.MG_TAG_TASK_TABLES:
|
|
398
|
-
this.FillTaskTables();
|
|
399
|
-
break;
|
|
400
|
-
case XMLConstants.MG_TAG_RECOMPUTE:
|
|
401
|
-
Logger.Instance.WriteDevToLog("goes to recompute");
|
|
402
|
-
this.RecomputeFillData(parser);
|
|
403
|
-
break;
|
|
404
|
-
case ConstInterface.MG_TAG_EVENTHANDLERS:
|
|
405
|
-
Logger.Instance.WriteDevToLog("goes to eventhandlers");
|
|
406
|
-
if (this.HandlersTab == null)
|
|
407
|
-
this.HandlersTab = new HandlersTable();
|
|
408
|
-
this.HandlersTab.fillData(this, parser);
|
|
409
|
-
this.addExpHandlersToMGData();
|
|
410
|
-
break;
|
|
411
|
-
default:
|
|
412
|
-
if (foundTagName === ("/" + XMLConstants.MG_TAG_TASK)) {
|
|
413
|
-
RuntimeContextBase.Instance.Parser.setCurrIndex2EndOfTag();
|
|
414
|
-
return false;
|
|
415
|
-
}
|
|
416
|
-
else {
|
|
417
|
-
Logger.Instance.WriteDevToLog("There is no such tag in Task.initInnerObjects . Enter case for " + foundTagName);
|
|
418
|
-
return false;
|
|
419
|
-
}
|
|
420
|
-
}
|
|
421
|
-
return true;
|
|
422
|
-
});
|
|
423
|
-
}
|
|
424
|
-
RecomputeFillData(parser) {
|
|
425
|
-
let recomputeTable = new RecomputeTable();
|
|
426
|
-
recomputeTable.fillData_1(this.DataView, this, parser);
|
|
427
|
-
}
|
|
428
|
-
FillTaskTables_1() {
|
|
429
|
-
let parser = RuntimeContextBase.Instance.Parser;
|
|
430
|
-
let endContext = parser.getXMLdata().indexOf(ConstInterface.MG_TAG_TASK_TABLES_END, parser.getCurrIndex());
|
|
431
|
-
endContext = parser.getXMLdata().indexOf(XMLConstants.TAG_CLOSE, endContext) + XMLConstants.TAG_CLOSE.length;
|
|
432
|
-
let taskTablesData = parser.getXMLsubstring(endContext);
|
|
433
|
-
this.FillTaskTables(taskTablesData);
|
|
434
|
-
parser.setCurrIndex(endContext);
|
|
435
|
-
}
|
|
436
|
-
addExpHandlersToMGData() {
|
|
437
|
-
let idx = 0;
|
|
438
|
-
for (let i = this.HandlersTab.getSize() - 1; i >= 0; i--) {
|
|
439
|
-
let handler = this.HandlersTab.getHandler(i);
|
|
440
|
-
let evt = handler.getEvent();
|
|
441
|
-
if (evt.getType() === ConstInterface.EVENT_TYPE_EXPRESSION ||
|
|
442
|
-
(evt.getType() === ConstInterface.EVENT_TYPE_USER && evt.getUserEventType() === ConstInterface.EVENT_TYPE_EXPRESSION)) {
|
|
443
|
-
this._mgData.addExpHandler(handler, idx);
|
|
444
|
-
idx++;
|
|
445
|
-
}
|
|
446
|
-
}
|
|
447
|
-
}
|
|
448
|
-
SetRefreshOnVars(variables) {
|
|
449
|
-
let strTok = StrUtil.tokenize(variables, ",");
|
|
450
|
-
let fldNum;
|
|
451
|
-
let intVals = new List();
|
|
452
|
-
let i;
|
|
453
|
-
for (i = 0; i < strTok.length; i++) {
|
|
454
|
-
fldNum = NNumber.Parse(strTok[i]);
|
|
455
|
-
intVals.push(fldNum);
|
|
456
|
-
}
|
|
457
|
-
this.RefreshOnVars = new Array(intVals.length);
|
|
458
|
-
for (i = 0; i < intVals.length; i++) {
|
|
459
|
-
fldNum = intVals.get_Item(i);
|
|
460
|
-
this.RefreshOnVars[i] = fldNum;
|
|
461
|
-
}
|
|
462
|
-
}
|
|
463
|
-
setDataSynced(synced) {
|
|
464
|
-
this.DataSynced = synced;
|
|
465
|
-
}
|
|
466
|
-
getField(fldName) {
|
|
467
|
-
return this.DataView.getFieldByName(fldName);
|
|
468
|
-
}
|
|
469
|
-
getExpById(id) {
|
|
470
|
-
if (this.ExpTab !== null)
|
|
471
|
-
return this.ExpTab.getExpById(id);
|
|
472
|
-
else
|
|
473
|
-
Logger.Instance.WriteExceptionToLogWithMsg("in Task.GetExpById(): no expression table");
|
|
474
|
-
return null;
|
|
475
|
-
}
|
|
476
|
-
getExpObjectById(id) {
|
|
477
|
-
return this.getExpById(id);
|
|
478
|
-
}
|
|
479
|
-
GetExpressionStorage(expId) {
|
|
480
|
-
let result = null;
|
|
481
|
-
if (expId > 0) {
|
|
482
|
-
let expById = this.getExpById(expId);
|
|
483
|
-
Debug.Assert(expById !== null);
|
|
484
|
-
result = expById.GetStorageAttribute();
|
|
485
|
-
}
|
|
486
|
-
return result;
|
|
487
|
-
}
|
|
488
|
-
CalculateExpression(expId, resType, length, contentTypeUnicode, resCellType) {
|
|
489
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
490
|
-
let result = null;
|
|
491
|
-
if (expId > 0) {
|
|
492
|
-
let expById = this.getExpById(expId);
|
|
493
|
-
Debug.Assert(expById !== null);
|
|
494
|
-
result = yield expById.evaluateWithResultTypeAndLength(resType, length);
|
|
495
|
-
}
|
|
496
|
-
return result;
|
|
497
|
-
});
|
|
498
|
-
}
|
|
499
|
-
insertRecordTable(invalidate, parser) {
|
|
500
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
501
|
-
if (yield this.isCached()) {
|
|
502
|
-
let firstTime = this.DataView.getFirstDv();
|
|
503
|
-
if (!firstTime && invalidate) {
|
|
504
|
-
if (!this.hasLocate) {
|
|
505
|
-
if (this.DataView.IncludesFirst()) {
|
|
506
|
-
if (!this.DataView.getChanged())
|
|
507
|
-
this._dvCache.putInCache(this.DataView.replicate());
|
|
508
|
-
else
|
|
509
|
-
this._dvCache.removeDvFromCache(this.DataView.getDvPosValue(), true);
|
|
510
|
-
}
|
|
511
|
-
}
|
|
512
|
-
else
|
|
513
|
-
this.locatePutInCache();
|
|
514
|
-
}
|
|
515
|
-
}
|
|
516
|
-
yield this.DataView.fillData(parser);
|
|
517
|
-
if (invalidate)
|
|
518
|
-
this.DataView.setChanged(false);
|
|
519
|
-
});
|
|
520
|
-
}
|
|
521
|
-
getHandlersTab() {
|
|
522
|
-
return this.HandlersTab;
|
|
523
|
-
}
|
|
524
|
-
buildXML(message) {
|
|
525
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
526
|
-
this.IsAfterRetryBeforeBuildXML = this.getAfterRetry();
|
|
527
|
-
if (this.KnownToServer && !this.IsOffline) {
|
|
528
|
-
message.Append(XMLConstants.START_TAG + XMLConstants.MG_TAG_TASK);
|
|
529
|
-
message.Append(" " + XMLConstants.MG_ATTR_TASKID + "=\"" + this.getTaskTag() + "\"");
|
|
530
|
-
message.Append(" " + ConstInterface.MG_ATTR_TASK_MAINLEVEL + "=\"" + this.getMainLevel() + "\"");
|
|
531
|
-
message.Append(XMLConstants.TAG_CLOSE);
|
|
532
|
-
yield this.DataView.buildXML(message);
|
|
533
|
-
if (this.Form != null && this.Form.Opened)
|
|
534
|
-
message.Append(this.Form.GetHiddenControlListXML());
|
|
535
|
-
message.Append("\n </" + XMLConstants.MG_TAG_TASK + XMLConstants.TAG_CLOSE);
|
|
536
|
-
}
|
|
537
|
-
});
|
|
538
|
-
}
|
|
539
|
-
buildXMLForRngs(message, UserRanges, locate) {
|
|
540
|
-
let i;
|
|
541
|
-
let fld;
|
|
542
|
-
let cellAttr = StorageAttribute.SKIP;
|
|
543
|
-
let toBase64 = (Environment.Instance.GetDebugLevel() <= 1);
|
|
544
|
-
message.Append(XMLConstants.TAG_CLOSE);
|
|
545
|
-
for (i = 0; i < UserRanges.length; i++) {
|
|
546
|
-
message.Append(XMLConstants.START_TAG + ConstInterface.USER_RNG);
|
|
547
|
-
let rng = UserRanges.get_Item(i);
|
|
548
|
-
message.Append(" " + XMLConstants.MG_TAG_FLD + "=\"" + rng.veeIdx + "\"");
|
|
549
|
-
fld = this.DataView.getField(rng.veeIdx - 1);
|
|
550
|
-
let fldAttr = fld.getType();
|
|
551
|
-
if (rng.nullMin)
|
|
552
|
-
message.Append(" " + ConstInterface.NULL_MIN_RNG + "=\"1\"");
|
|
553
|
-
if (!rng.discardMin && rng.min != null) {
|
|
554
|
-
let val = RecordUtils.itemValToXML(rng.min, fldAttr, cellAttr, toBase64);
|
|
555
|
-
message.Append(" " + ConstInterface.MIN_RNG + "=\"" + val + "\"");
|
|
556
|
-
}
|
|
557
|
-
if (rng.nullMax)
|
|
558
|
-
message.Append(" " + ConstInterface.NULL_MAX_RNG + "=\"1\"");
|
|
559
|
-
if (!rng.discardMax && rng.max != null) {
|
|
560
|
-
let val = RecordUtils.itemValToXML(rng.max, fldAttr, cellAttr, toBase64);
|
|
561
|
-
message.Append(" " + ConstInterface.MAX_RNG + "=\"" + val + "\"");
|
|
562
|
-
}
|
|
563
|
-
message.Append(XMLConstants.TAG_TERM);
|
|
564
|
-
}
|
|
565
|
-
if (locate)
|
|
566
|
-
message.Append(XMLConstants.END_TAG + ConstInterface.USER_LOCATES + XMLConstants.TAG_CLOSE);
|
|
567
|
-
else
|
|
568
|
-
message.Append(XMLConstants.END_TAG + ConstInterface.USER_RANGES + XMLConstants.TAG_CLOSE);
|
|
569
|
-
}
|
|
570
|
-
buildXMLForSorts(message) {
|
|
571
|
-
if (this.UserSorts != null && this.UserSorts.length > 0) {
|
|
572
|
-
let i;
|
|
573
|
-
for (i = 0; i < this.UserSorts.length; i++) {
|
|
574
|
-
message.Append(XMLConstants.TAG_CLOSE);
|
|
575
|
-
let srt = this.UserSorts.get_Item(i);
|
|
576
|
-
message.Append(XMLConstants.START_TAG + ConstInterface.SORT);
|
|
577
|
-
message.Append(" " + XMLConstants.MG_TAG_FLD + "=\"" + srt.fldIdx + "\"");
|
|
578
|
-
if (srt.dir)
|
|
579
|
-
message.Append(" " + ConstInterface.MG_ATTR_DIR + "=\"1\"");
|
|
580
|
-
message.Append(XMLConstants.TAG_TERM);
|
|
581
|
-
}
|
|
582
|
-
this.UserSorts.Clear();
|
|
583
|
-
this.UserSorts = null;
|
|
584
|
-
message.Append(XMLConstants.END_TAG + ConstInterface.MG_TAG_SORTS + XMLConstants.TAG_CLOSE);
|
|
585
|
-
}
|
|
586
|
-
}
|
|
587
|
-
getUserEvent(idx) {
|
|
588
|
-
Debug.Assert(this.UserEvtTab !== null);
|
|
589
|
-
let retEvent = null;
|
|
590
|
-
if (this.UserEvtTab !== null)
|
|
591
|
-
retEvent = this.UserEvtTab.getEvent(idx);
|
|
592
|
-
return retEvent;
|
|
593
|
-
}
|
|
594
|
-
SetMoveToFirstControl(moveToFirstControl) {
|
|
595
|
-
if (moveToFirstControl || !this.IsSubForm) {
|
|
596
|
-
if (this.Form !== null) {
|
|
597
|
-
let alreadyMoved = this.Form.alreadyMovedToFirstControl();
|
|
598
|
-
if (!alreadyMoved)
|
|
599
|
-
this.Form.MovedToFirstControl = true;
|
|
600
|
-
}
|
|
601
|
-
}
|
|
602
|
-
}
|
|
603
|
-
Start(moveToFirstControl, callByDestSubForm) {
|
|
604
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
605
|
-
let nonInteractiveTask = null;
|
|
606
|
-
if (!this._isStarted) {
|
|
607
|
-
this._isStarted = true;
|
|
608
|
-
this.InitializeExecution();
|
|
609
|
-
this.InStartProcess = true;
|
|
610
|
-
let result = yield this.Setup();
|
|
611
|
-
if (!result.Success)
|
|
612
|
-
return null;
|
|
613
|
-
this._inProcessingTopMostEndTaskSaved = AccessHelper.eventsManager.getProcessingTopMostEndTask();
|
|
614
|
-
AccessHelper.eventsManager.setProcessingTopMostEndTask(false);
|
|
615
|
-
yield this.EnableActions();
|
|
616
|
-
result = yield this.InitializeForm(moveToFirstControl);
|
|
617
|
-
if (!result.Success)
|
|
618
|
-
return null;
|
|
619
|
-
if (!this.IsInteractive && !this._isMainPrg)
|
|
620
|
-
nonInteractiveTask = this;
|
|
621
|
-
this.DataViewWasRetrieved = true;
|
|
622
|
-
let subTasks = this.SubTasks;
|
|
623
|
-
if (this.isMainProg())
|
|
624
|
-
this.SubTasks = null;
|
|
625
|
-
if (this.isMainProg())
|
|
626
|
-
this.SubTasks = subTasks;
|
|
627
|
-
if (!result.Success)
|
|
628
|
-
return null;
|
|
629
|
-
if (this._aborting)
|
|
630
|
-
return null;
|
|
631
|
-
let dataViewCommand = CommandFactory.CreateDataViewCommand(this.getTaskTag(), DataViewCommandType.FirstChunk);
|
|
632
|
-
result = yield this.DataviewManager.Execute(dataViewCommand);
|
|
633
|
-
if (!result.Success)
|
|
634
|
-
return null;
|
|
635
|
-
this.ResumeSubformLayout();
|
|
636
|
-
}
|
|
637
|
-
nonInteractiveTask = yield this.StartSubTasks(moveToFirstControl, nonInteractiveTask, callByDestSubForm);
|
|
638
|
-
this.InStartProcess = false;
|
|
639
|
-
return nonInteractiveTask;
|
|
640
|
-
});
|
|
641
|
-
}
|
|
642
|
-
CanResumeSubformLayout() {
|
|
643
|
-
return this.DataViewWasRetrieved;
|
|
644
|
-
}
|
|
645
|
-
InitializeExecution() {
|
|
646
|
-
super.setBrkLevel(ConstInterface.BRK_LEVEL_REC_MAIN, -1);
|
|
647
|
-
this._firstRecordCycle = true;
|
|
648
|
-
this._currStartProgLevel = ((this.IsSubForm && this.getParent().getForm().alreadyMovedToFirstControl())
|
|
649
|
-
? this.getParent()._currStartProgLevel
|
|
650
|
-
: Task.StartProgLevel);
|
|
651
|
-
}
|
|
652
|
-
InitializeForm(moveToFirstControl) {
|
|
653
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
654
|
-
if (this.Form !== null) {
|
|
655
|
-
this.SetMoveToFirstControl(moveToFirstControl);
|
|
656
|
-
AccessHelper.eventsManager.pushNewExecStacks();
|
|
657
|
-
this.routeParams = this.DataView.GetRouteParams();
|
|
658
|
-
yield this.InitForm();
|
|
659
|
-
AccessHelper.eventsManager.popNewExecStacks();
|
|
660
|
-
this.getMGData().StartTimers();
|
|
661
|
-
Commands.beginInvoke();
|
|
662
|
-
}
|
|
663
|
-
return new ReturnResult();
|
|
664
|
-
});
|
|
665
|
-
}
|
|
666
|
-
StartSubTasks(moveToFirstControl, nonInteractiveTask, callByDestSubForm) {
|
|
667
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
668
|
-
if (this.hasSubTasks()) {
|
|
669
|
-
for (let i = 0; i < this.SubTasks.getSize(); i = i + 1) {
|
|
670
|
-
let task = this.SubTasks.getTask(i);
|
|
671
|
-
let tmpNonInteractiveTask = yield task.Start(moveToFirstControl, callByDestSubForm);
|
|
672
|
-
if (nonInteractiveTask === null)
|
|
673
|
-
nonInteractiveTask = tmpNonInteractiveTask;
|
|
674
|
-
else if (tmpNonInteractiveTask !== null)
|
|
675
|
-
Debug.Assert(false, "more than 1 non interactive in task.start");
|
|
676
|
-
}
|
|
677
|
-
}
|
|
678
|
-
return nonInteractiveTask;
|
|
679
|
-
});
|
|
680
|
-
}
|
|
681
|
-
EnableActions() {
|
|
682
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
683
|
-
let actList = ActionManager.actEnabled;
|
|
684
|
-
this.ActionManager.enableList(actList, true, false);
|
|
685
|
-
if (this.IsSubForm)
|
|
686
|
-
this.ActionManager.enable(InternalInterface.MG_ACT_POST_REFRESH_BY_PARENT, true);
|
|
687
|
-
if (this.Form != null && (yield this.Form.getDefaultButton(false)) != null)
|
|
688
|
-
this.ActionManager.enable(InternalInterface.MG_ACT_DEFAULT_BUTTON, true);
|
|
689
|
-
yield this.enableModes();
|
|
690
|
-
if (yield this.checkProp(PropInterface.PROP_TYPE_SELECTION, false)) {
|
|
691
|
-
if ((yield ((this.Form.getProp(PropInterface.PROP_TYPE_DEFAULT_BUTTON))).getValue()) !== "") {
|
|
692
|
-
let defaultButtonName = yield (this.Form.getProp(PropInterface.PROP_TYPE_DEFAULT_BUTTON)).getValue();
|
|
693
|
-
let ctrl = this.Form.getCtrlByCtrlName(defaultButtonName);
|
|
694
|
-
let aRtEvt = new RunTimeEvent(ctrl);
|
|
695
|
-
if (aRtEvt.getType() === ConstInterface.EVENT_TYPE_INTERNAL &&
|
|
696
|
-
aRtEvt.getInternalCode() === InternalInterface.MG_ACT_SELECT)
|
|
697
|
-
this.ActionManager.enable(InternalInterface.MG_ACT_SELECT, true);
|
|
698
|
-
}
|
|
699
|
-
else
|
|
700
|
-
this.ActionManager.enable(InternalInterface.MG_ACT_SELECT, true);
|
|
701
|
-
}
|
|
702
|
-
let enablePrintdata = yield this.checkProp(PropInterface.PROP_TYPE_PRINT_DATA, false);
|
|
703
|
-
this.ActionManager.enable(InternalInterface.MG_ACT_PRINT_DATA, enablePrintdata);
|
|
704
|
-
if (this.getEnableZoomHandler())
|
|
705
|
-
this.ActionManager.enable(InternalInterface.MG_ACT_ZOOM, true);
|
|
706
|
-
});
|
|
707
|
-
}
|
|
708
|
-
ShowError(text) {
|
|
709
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
710
|
-
let mlsTransText = LanguageData.Instance.translate(text);
|
|
711
|
-
let mlsTransTitle = LanguageData.Instance.translate(ConstInterface.ERROR_STRING);
|
|
712
|
-
yield GUIManager.Instance.MessageBox(mlsTransTitle, mlsTransText, Styles.MSGBOX_ICON_ERROR | Styles.MSGBOX_BUTTON_OK);
|
|
713
|
-
});
|
|
714
|
-
}
|
|
715
|
-
EndTaskOnError(result, displayError) {
|
|
716
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
717
|
-
if (!result.Success && !this.isAborting()) {
|
|
718
|
-
if (this.InStartProcess) {
|
|
719
|
-
yield this.endTask(false, false, false);
|
|
720
|
-
if (displayError)
|
|
721
|
-
yield this.ShowError(result.ErrorDescription);
|
|
722
|
-
this.InStartProcess = false;
|
|
723
|
-
return true;
|
|
724
|
-
}
|
|
725
|
-
else {
|
|
726
|
-
if (displayError)
|
|
727
|
-
yield this.ShowError(result.ErrorDescription);
|
|
728
|
-
yield AccessHelper.eventsManager.handleInternalEventWithTask(this, InternalInterface.MG_ACT_EXIT);
|
|
729
|
-
}
|
|
730
|
-
}
|
|
731
|
-
return false;
|
|
732
|
-
});
|
|
733
|
-
}
|
|
734
|
-
Setup() {
|
|
735
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
736
|
-
let result;
|
|
737
|
-
this.TaskService.InitTaskPrefixExecutedFlag(this);
|
|
738
|
-
this.TaskSuffixExecuted = false;
|
|
739
|
-
TaskServiceBase.CreateFirstRecord(this);
|
|
740
|
-
let dataViewCommand = CommandFactory.CreateDataViewCommand(this.getTaskTag(), DataViewCommandType.Init);
|
|
741
|
-
result = yield this.DataviewManager.Execute(dataViewCommand);
|
|
742
|
-
if (!result.Success)
|
|
743
|
-
return result;
|
|
744
|
-
if (result.Success) {
|
|
745
|
-
let commands = GlobalCommandsManager.Instance.getCommandsExecutedAfterTaskStarted();
|
|
746
|
-
for (let cmdIdx = 0; cmdIdx < commands.length; cmdIdx++) {
|
|
747
|
-
let command = (commands.get_Item(cmdIdx));
|
|
748
|
-
if (command.TaskTag === this.getTaskTag()) {
|
|
749
|
-
yield command.Execute(null);
|
|
750
|
-
GlobalCommandsManager.Instance.removeCommandsExecutedAfterTaskStarted(command);
|
|
751
|
-
}
|
|
752
|
-
}
|
|
753
|
-
dataViewCommand = CommandFactory.CreateDataViewCommand(this.getTaskTag(), DataViewCommandType.Prepare);
|
|
754
|
-
result = yield this.DataviewManager.Execute(dataViewCommand);
|
|
755
|
-
}
|
|
756
|
-
if (result.Success) {
|
|
757
|
-
result = this.TaskService.PrepareTask(this);
|
|
758
|
-
if (!result.Success)
|
|
759
|
-
yield this.EndTaskOnError(result, true);
|
|
760
|
-
}
|
|
761
|
-
if (result.Success) {
|
|
762
|
-
dataViewCommand = CommandFactory.CreateDataViewCommand(this.getTaskTag(), DataViewCommandType.InitDataControlViews);
|
|
763
|
-
result = yield this.DataviewManager.Execute(dataViewCommand);
|
|
764
|
-
}
|
|
765
|
-
return result;
|
|
766
|
-
});
|
|
767
|
-
}
|
|
768
|
-
doFirstRecordCycle() {
|
|
769
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
770
|
-
if (!this._isMainPrg) {
|
|
771
|
-
AccessHelper.eventsManager.pushNewExecStacks();
|
|
772
|
-
this.SubformExecMode = Task_SubformExecModeEnum.FIRST_TIME;
|
|
773
|
-
yield AccessHelper.eventsManager.handleInternalEventWithTaskAndSubformRefresh(this, InternalInterface.MG_ACT_REC_PREFIX, this.IsSubForm);
|
|
774
|
-
if (!AccessHelper.eventsManager.GetStopExecutionFlag()) {
|
|
775
|
-
if (this.IsSubForm) {
|
|
776
|
-
if (this.hasSubTasks())
|
|
777
|
-
for (let i = 0; i < this.SubTasks.getSize(); i++) {
|
|
778
|
-
let subTask = this.SubTasks.getTask(i);
|
|
779
|
-
if (subTask.IsSubForm) {
|
|
780
|
-
subTask.getForm().IgnoreFirstRecordCycle = true;
|
|
781
|
-
yield subTask.doFirstRecordCycle();
|
|
782
|
-
}
|
|
783
|
-
}
|
|
784
|
-
yield AccessHelper.eventsManager.handleInternalEventWithTask(this, InternalInterface.MG_ACT_REC_SUFFIX);
|
|
785
|
-
}
|
|
786
|
-
}
|
|
787
|
-
this.SubformExecMode = Task_SubformExecModeEnum.SET_FOCUS;
|
|
788
|
-
AccessHelper.eventsManager.popNewExecStacks();
|
|
789
|
-
}
|
|
790
|
-
});
|
|
791
|
-
}
|
|
792
|
-
CheckAndSetSubForm() {
|
|
793
|
-
this.IsSubForm = (!super.isMainProg() && this !== this._mgData.getFirstTask());
|
|
794
|
-
}
|
|
795
|
-
IsRoute() {
|
|
796
|
-
return (this.RouterPath != null);
|
|
797
|
-
}
|
|
798
|
-
stop() {
|
|
799
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
800
|
-
let task;
|
|
801
|
-
let form = this.getForm();
|
|
802
|
-
if (this._aborting)
|
|
803
|
-
return;
|
|
804
|
-
if (this.hasSubTasks()) {
|
|
805
|
-
while ((task = this.SubTasks.getTask(0)) != null) {
|
|
806
|
-
task.setDestinationSubform(this._destinationSubform);
|
|
807
|
-
yield task.stop();
|
|
808
|
-
}
|
|
809
|
-
}
|
|
810
|
-
if (!this._isMainPrg)
|
|
811
|
-
this._aborting = true;
|
|
812
|
-
if (this._parentTask != null) {
|
|
813
|
-
this._parentTask.removeSubTask(this);
|
|
814
|
-
if (this.IsSubForm) {
|
|
815
|
-
let oldTimers = new List(), newTimers = new List();
|
|
816
|
-
let mgd = this.getMGData();
|
|
817
|
-
if (mgd.getTimerHandlers() != null)
|
|
818
|
-
oldTimers = mgd.getTimerHandlers().getTimersVector();
|
|
819
|
-
mgd.removeTimerHandler(this);
|
|
820
|
-
mgd.removeExpressionHandler(this);
|
|
821
|
-
if (mgd.getTimerHandlers() != null)
|
|
822
|
-
newTimers = mgd.getTimerHandlers().getTimersVector();
|
|
823
|
-
mgd.changeTimers(oldTimers, newTimers);
|
|
824
|
-
mgd.removeTask(this);
|
|
825
|
-
GUIManager.Instance.abort(this.getForm());
|
|
826
|
-
}
|
|
827
|
-
}
|
|
828
|
-
this.AbortTransaction();
|
|
829
|
-
if (this.getClickedControl() != null)
|
|
830
|
-
RuntimeContextBase.Instance.CurrentClickedCtrl = null;
|
|
831
|
-
if (this.Form != null)
|
|
832
|
-
this.Form.removeRefsToCtrls();
|
|
833
|
-
if (this.IsSubForm) {
|
|
834
|
-
let subForm = this.Form.getSubFormCtrl();
|
|
835
|
-
subForm.setSubformTaskId(null);
|
|
836
|
-
subForm.initSubformTask();
|
|
837
|
-
if (LastFocusedManager.Instance.getLastFocusedTask() === this)
|
|
838
|
-
LastFocusedManager.Instance.setLastFocusedTask(this._parentTask);
|
|
839
|
-
if (subForm.SubformLoaded)
|
|
840
|
-
yield (subForm.getProp(PropInterface.PROP_TYPE_VISIBLE)).RefreshDisplay(true);
|
|
841
|
-
}
|
|
842
|
-
let clearDataViewCommand = CommandFactory.CreateDataViewCommand(this.getTaskTag(), DataViewCommandType.Clear);
|
|
843
|
-
yield this.DataviewManager.Execute(clearDataViewCommand);
|
|
844
|
-
});
|
|
845
|
-
}
|
|
846
|
-
abort() {
|
|
847
|
-
this.getMGData().abort();
|
|
848
|
-
}
|
|
849
|
-
hasSubTasks() {
|
|
850
|
-
return this.SubTasks !== null && this.SubTasks.getSize() > 0;
|
|
851
|
-
}
|
|
852
|
-
getTaskDepth(byParentOrder) {
|
|
853
|
-
if (byParentOrder)
|
|
854
|
-
return this.getTaskDepth_(byParentOrder);
|
|
855
|
-
let depth = this.GetContextTask().getTaskDepth_(byParentOrder);
|
|
856
|
-
if (this.isMainProg() && this.getCtlIdx() !== ConstInterface.TOP_LEVEL_CONTAINER)
|
|
857
|
-
depth = depth + 1;
|
|
858
|
-
return depth;
|
|
859
|
-
}
|
|
860
|
-
getTaskDepth_(byParentOrder) {
|
|
861
|
-
let tmpTask = this.getTriggeringTask();
|
|
862
|
-
if (tmpTask == null || byParentOrder)
|
|
863
|
-
if (this._parentTask == null)
|
|
864
|
-
return 1;
|
|
865
|
-
else {
|
|
866
|
-
if (byParentOrder && this.getCtlIdx() !== this._parentTask.getCtlIdx())
|
|
867
|
-
return 2 + this._parentTask.getTaskDepth_(byParentOrder);
|
|
868
|
-
return 1 + this._parentTask.getTaskDepth_(byParentOrder);
|
|
869
|
-
}
|
|
870
|
-
return 1 + (tmpTask).getTaskDepth_(byParentOrder);
|
|
871
|
-
}
|
|
872
|
-
GetTaskAncestor(generation) {
|
|
873
|
-
return this.getTaskAncestor_(generation);
|
|
874
|
-
}
|
|
875
|
-
getTaskAncestor_(generation) {
|
|
876
|
-
let retTask = null;
|
|
877
|
-
if (generation === 0)
|
|
878
|
-
retTask = this;
|
|
879
|
-
else {
|
|
880
|
-
let tmpTask = this.getTriggeringTask();
|
|
881
|
-
if (tmpTask === null)
|
|
882
|
-
tmpTask = this._parentTask;
|
|
883
|
-
if (tmpTask !== null)
|
|
884
|
-
retTask = tmpTask.getTaskAncestor_(--generation);
|
|
885
|
-
}
|
|
886
|
-
return retTask;
|
|
887
|
-
}
|
|
888
|
-
GetTaskDepth() {
|
|
889
|
-
return this.getTaskDepth(false);
|
|
890
|
-
}
|
|
891
|
-
pathContains(task) {
|
|
892
|
-
return this._taskPath.Contains(task);
|
|
893
|
-
}
|
|
894
|
-
SetContextTask(context) {
|
|
895
|
-
this.ContextTask = context;
|
|
896
|
-
}
|
|
897
|
-
GetContextTask() {
|
|
898
|
-
let currRec = (this.DataView.getCurrRec());
|
|
899
|
-
if (this.InStartProcess
|
|
900
|
-
|| currRec !== null && (currRec.InCompute || currRec.InRecompute)
|
|
901
|
-
|| this.Form !== null && this.Form.inRefreshDisplay())
|
|
902
|
-
return this;
|
|
903
|
-
return this.ContextTask;
|
|
904
|
-
}
|
|
905
|
-
getTriggeringTask() {
|
|
906
|
-
if (this._triggeringTask !== null && this._triggeringTask.getMGData().IsAborting)
|
|
907
|
-
this._triggeringTask = this._parentTask;
|
|
908
|
-
return this._triggeringTask;
|
|
909
|
-
}
|
|
910
|
-
setLastParkedCtrl(ctrl) {
|
|
911
|
-
super.setLastParkedCtrl(ctrl);
|
|
912
|
-
LastFocusedManager.setLastFocusedControl(this, ctrl);
|
|
913
|
-
}
|
|
914
|
-
queryTaskPath() {
|
|
915
|
-
let insertedNames = 0;
|
|
916
|
-
let result = new StringBuilder(7936);
|
|
917
|
-
let treeRoute = new Array(this.getTaskDepth(false));
|
|
918
|
-
this.pathToRoot(treeRoute, false);
|
|
919
|
-
for (let tsk = treeRoute.length - 1; tsk >= 0; tsk--) {
|
|
920
|
-
let currTsk = treeRoute[tsk];
|
|
921
|
-
if (currTsk.isMainProg())
|
|
922
|
-
continue;
|
|
923
|
-
let nameProp = currTsk.getProp(PropInterface.PROP_TYPE_NAME);
|
|
924
|
-
if (nameProp == null)
|
|
925
|
-
continue;
|
|
926
|
-
let name = nameProp.GetComputedValue();
|
|
927
|
-
if (!NString.IsNullOrEmpty(name)) {
|
|
928
|
-
if (insertedNames++ !== 0)
|
|
929
|
-
result.Append(';');
|
|
930
|
-
result.Append(name);
|
|
931
|
-
}
|
|
932
|
-
}
|
|
933
|
-
return result;
|
|
934
|
-
}
|
|
935
|
-
ctl_itm_2_parent_vee(itm) {
|
|
936
|
-
let currTsk;
|
|
937
|
-
let currItm = 0;
|
|
938
|
-
let lastItm = 0;
|
|
939
|
-
let treeRoute = new Array(this.getTaskDepth(true));
|
|
940
|
-
this.pathToRoot(treeRoute, true);
|
|
941
|
-
for (let tsk = treeRoute.length - 1; tsk >= 0; tsk--) {
|
|
942
|
-
currTsk = treeRoute[tsk];
|
|
943
|
-
currItm += currTsk.DataView.GetFieldsTab().getSize();
|
|
944
|
-
if (itm < currItm) {
|
|
945
|
-
itm -= lastItm;
|
|
946
|
-
return currTsk.DataView.getField(itm);
|
|
947
|
-
}
|
|
948
|
-
lastItm = currItm;
|
|
949
|
-
}
|
|
950
|
-
return null;
|
|
951
|
-
}
|
|
952
|
-
GetControlIDFromVarItem(item) {
|
|
953
|
-
let currTask;
|
|
954
|
-
let currItem = 0;
|
|
955
|
-
let lastItem = 0;
|
|
956
|
-
let noOfControlsBeforeCurrTask = 0;
|
|
957
|
-
let treeRoute = new Array(this.getTaskDepth(true));
|
|
958
|
-
this.pathToRoot(treeRoute, true);
|
|
959
|
-
for (let task = treeRoute.length - 1; task >= 0; task--) {
|
|
960
|
-
currTask = treeRoute[task];
|
|
961
|
-
currItem += currTask.DataView.GetFieldsTab().getSize();
|
|
962
|
-
if (item < currItem) {
|
|
963
|
-
item -= lastItem;
|
|
964
|
-
let field = currTask.DataView.getField(item);
|
|
965
|
-
if (field.getCtrl() != null)
|
|
966
|
-
return noOfControlsBeforeCurrTask = noOfControlsBeforeCurrTask + currTask.Form.getControlIdx(field.getCtrl()) + 1;
|
|
967
|
-
return 0;
|
|
968
|
-
}
|
|
969
|
-
if (currTask.Form != null)
|
|
970
|
-
noOfControlsBeforeCurrTask += currTask.Form.getCtrlCount();
|
|
971
|
-
lastItem = currItem;
|
|
972
|
-
}
|
|
973
|
-
return 0;
|
|
974
|
-
}
|
|
975
|
-
GetControlFromControlID(controlID, parent) {
|
|
976
|
-
let control = null;
|
|
977
|
-
parent.value = -1;
|
|
978
|
-
if (controlID >= 0) {
|
|
979
|
-
let currTask = null;
|
|
980
|
-
let callerTask = null;
|
|
981
|
-
let noOfControlsInCurrtask = 0;
|
|
982
|
-
let noOfControlsBeforeCurrTask = 0;
|
|
983
|
-
let controlIdx = 0;
|
|
984
|
-
let treeRoute = new Array(this.getTaskDepth(true));
|
|
985
|
-
this.pathToRoot(treeRoute, true);
|
|
986
|
-
for (let task = treeRoute.length - 1; task >= 0; task--) {
|
|
987
|
-
currTask = treeRoute[task];
|
|
988
|
-
if (currTask.Form != null) {
|
|
989
|
-
noOfControlsInCurrtask = currTask.Form.getCtrlCount();
|
|
990
|
-
if (controlID < (noOfControlsBeforeCurrTask + noOfControlsInCurrtask)) {
|
|
991
|
-
controlIdx = controlID - noOfControlsBeforeCurrTask;
|
|
992
|
-
control = currTask.Form.CtrlTab.getCtrl(controlIdx);
|
|
993
|
-
callerTask = currTask;
|
|
994
|
-
break;
|
|
995
|
-
}
|
|
996
|
-
noOfControlsBeforeCurrTask += noOfControlsInCurrtask;
|
|
997
|
-
}
|
|
998
|
-
}
|
|
999
|
-
if (control != null) {
|
|
1000
|
-
parent.value = 0;
|
|
1001
|
-
let prevCtlIdx = treeRoute[0].TaskDefinitionId.CtlIndex;
|
|
1002
|
-
for (let task = 0; task < treeRoute.length - 1; task++) {
|
|
1003
|
-
currTask = treeRoute[task];
|
|
1004
|
-
if (prevCtlIdx !== currTask.TaskDefinitionId.CtlIndex)
|
|
1005
|
-
parent.value++;
|
|
1006
|
-
if (callerTask.TaskDefinitionId.CtlIndex === currTask.TaskDefinitionId.CtlIndex)
|
|
1007
|
-
break;
|
|
1008
|
-
prevCtlIdx = currTask.TaskDefinitionId.CtlIndex;
|
|
1009
|
-
}
|
|
1010
|
-
}
|
|
1011
|
-
}
|
|
1012
|
-
return control;
|
|
1013
|
-
}
|
|
1014
|
-
ctl_itm_4_parent_vee(parent, vee) {
|
|
1015
|
-
let tsk;
|
|
1016
|
-
let depth = this.getTaskDepth(true);
|
|
1017
|
-
if (parent !== TaskBase.MAIN_PRG_PARENT_ID && depth <= parent)
|
|
1018
|
-
return vee;
|
|
1019
|
-
let treeRoute = new Array(depth);
|
|
1020
|
-
if (vee !== 0) {
|
|
1021
|
-
this.pathToRoot(treeRoute, true);
|
|
1022
|
-
let indOfParentInTaskTree = this.getIndOfParentInTaskTree(parent, treeRoute);
|
|
1023
|
-
let i;
|
|
1024
|
-
for (i = treeRoute.length - 1; i > indOfParentInTaskTree; i--) {
|
|
1025
|
-
tsk = treeRoute[i];
|
|
1026
|
-
vee += tsk.DataView.GetFieldsTab().getSize();
|
|
1027
|
-
}
|
|
1028
|
-
}
|
|
1029
|
-
return vee;
|
|
1030
|
-
}
|
|
1031
|
-
getIndOfParentInTaskTree(parent, taskTree) {
|
|
1032
|
-
let indOfParentInTaskTree = 0;
|
|
1033
|
-
if (parent === TaskBase.MAIN_PRG_PARENT_ID) {
|
|
1034
|
-
for (let i = 1; i < taskTree.length; i = i + 1) {
|
|
1035
|
-
if (taskTree[i].isMainProg() && this._ctlIdx === taskTree[i].getCtlIdx()) {
|
|
1036
|
-
indOfParentInTaskTree = i;
|
|
1037
|
-
break;
|
|
1038
|
-
}
|
|
1039
|
-
}
|
|
1040
|
-
}
|
|
1041
|
-
else
|
|
1042
|
-
indOfParentInTaskTree = parent;
|
|
1043
|
-
return indOfParentInTaskTree;
|
|
1044
|
-
}
|
|
1045
|
-
getFieldByName(fldName) {
|
|
1046
|
-
return (this.GetContextTask()).getFieldByName_(fldName);
|
|
1047
|
-
}
|
|
1048
|
-
getFieldByName_(fldName) {
|
|
1049
|
-
let tmpTask;
|
|
1050
|
-
if (fldName == null)
|
|
1051
|
-
return null;
|
|
1052
|
-
let fld = this.getField(fldName);
|
|
1053
|
-
if (fld == null) {
|
|
1054
|
-
tmpTask = this.getTriggeringTask() != null ? this.getTriggeringTask() : this._parentTask;
|
|
1055
|
-
if (tmpTask != null) {
|
|
1056
|
-
if (!this.isMainProg() && this.getCtlIdx() !== tmpTask.getCtlIdx()) {
|
|
1057
|
-
let mainPrg = AccessHelper.mgDataTable.GetMainProgByCtlIdx(-1, this.getCtlIdx());
|
|
1058
|
-
fld = mainPrg.getFieldByName_(fldName);
|
|
1059
|
-
}
|
|
1060
|
-
if (fld == null)
|
|
1061
|
-
fld = tmpTask.getFieldByName_(fldName);
|
|
1062
|
-
}
|
|
1063
|
-
}
|
|
1064
|
-
return fld;
|
|
1065
|
-
}
|
|
1066
|
-
getIndexOfFieldByName(fldName) {
|
|
1067
|
-
let depth = this.getTaskDepth(true);
|
|
1068
|
-
let index = 0;
|
|
1069
|
-
let fld = this.getFieldByName(fldName);
|
|
1070
|
-
let fldTab;
|
|
1071
|
-
if (fld == null)
|
|
1072
|
-
return 0;
|
|
1073
|
-
let treeRoute = new Array(depth);
|
|
1074
|
-
this.pathToRoot(treeRoute, true);
|
|
1075
|
-
for (let curr = depth - 1; curr >= 0; curr--) {
|
|
1076
|
-
let currTask = treeRoute[curr];
|
|
1077
|
-
if (currTask === fld.getTask()) {
|
|
1078
|
-
curr = fld.getId();
|
|
1079
|
-
index += ++curr;
|
|
1080
|
-
break;
|
|
1081
|
-
}
|
|
1082
|
-
fldTab = currTask.DataView.GetFieldsTab();
|
|
1083
|
-
index += fldTab.getSize();
|
|
1084
|
-
}
|
|
1085
|
-
return index;
|
|
1086
|
-
}
|
|
1087
|
-
pathToRoot(path, byParentOrder) {
|
|
1088
|
-
let task = (byParentOrder ? this : this.GetContextTask());
|
|
1089
|
-
for (let i = 0; i < path.length; i++) {
|
|
1090
|
-
path[i] = task;
|
|
1091
|
-
let ctlIdx = task.getCtlIdx();
|
|
1092
|
-
let tmpTask = byParentOrder ? null : task.getTriggeringTask();
|
|
1093
|
-
if (tmpTask != null)
|
|
1094
|
-
task = tmpTask;
|
|
1095
|
-
else {
|
|
1096
|
-
task = task.getParent();
|
|
1097
|
-
if (task == null) {
|
|
1098
|
-
if (!byParentOrder && this.isMainProg() && this.getCtlIdx() !== ConstInterface.TOP_LEVEL_CONTAINER)
|
|
1099
|
-
path[i + 1] = this;
|
|
1100
|
-
break;
|
|
1101
|
-
}
|
|
1102
|
-
if (byParentOrder && ctlIdx !== task.getCtlIdx())
|
|
1103
|
-
path[++i] = AccessHelper.mgDataTable.GetMainProgByCtlIdx(-1, ctlIdx);
|
|
1104
|
-
}
|
|
1105
|
-
}
|
|
1106
|
-
}
|
|
1107
|
-
shouldBeRefreshed() {
|
|
1108
|
-
let dataView = this._parentTask.DataView;
|
|
1109
|
-
let result = false;
|
|
1110
|
-
if (this._parentTask === null || dataView.isPrevCurrRecNull() ||
|
|
1111
|
-
(this.RefreshOnVars !== null && !dataView.currEqualsPrev(this.RefreshOnVars)))
|
|
1112
|
-
result = true;
|
|
1113
|
-
return result;
|
|
1114
|
-
}
|
|
1115
|
-
CheckRefreshSubTasks() {
|
|
1116
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1117
|
-
let ret = false;
|
|
1118
|
-
if (this._enteredRecLevel) {
|
|
1119
|
-
let subformsToRefresh = yield this.GetSubformsToRefresh();
|
|
1120
|
-
if (subformsToRefresh.length > 0)
|
|
1121
|
-
ret = true;
|
|
1122
|
-
}
|
|
1123
|
-
return ret;
|
|
1124
|
-
});
|
|
1125
|
-
}
|
|
1126
|
-
GetSubTasks() {
|
|
1127
|
-
let subTasks = new List();
|
|
1128
|
-
if (this.hasSubTasks()) {
|
|
1129
|
-
for (let i = 0; i < this.SubTasks.getSize(); i = i + 1)
|
|
1130
|
-
subTasks.push(this.SubTasks.getTask(i));
|
|
1131
|
-
}
|
|
1132
|
-
return subTasks;
|
|
1133
|
-
}
|
|
1134
|
-
GetSubformsToRefresh() {
|
|
1135
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1136
|
-
let subTasks = this.GetSubTasks();
|
|
1137
|
-
let subTasksToRefresh = new List();
|
|
1138
|
-
for (let i = 0; i < subTasks.length; i++) {
|
|
1139
|
-
let subTask = subTasks.get_Item(i);
|
|
1140
|
-
if (yield this.ShouldRefreshSubformTask(subTask))
|
|
1141
|
-
subTasksToRefresh.push(subTask);
|
|
1142
|
-
}
|
|
1143
|
-
return subTasksToRefresh;
|
|
1144
|
-
});
|
|
1145
|
-
}
|
|
1146
|
-
ShouldRefreshSubformTask(subTask) {
|
|
1147
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1148
|
-
let refresh = false;
|
|
1149
|
-
let subformCtrl = subTask.getForm().getSubFormCtrl();
|
|
1150
|
-
subTask.DoSubformPrefixSuffix = false;
|
|
1151
|
-
if (subformCtrl != null && !subTask.InSelect && subTask.AfterFirstRecordPrefix) {
|
|
1152
|
-
let parentMode = this.getMode();
|
|
1153
|
-
let modeProperty = (parentMode === Constants.TASK_MODE_QUERY ? PropInterface.PROP_TYPE_ALLOW_QUERY
|
|
1154
|
-
: parentMode === Constants.TASK_MODE_MODIFY
|
|
1155
|
-
? PropInterface.PROP_TYPE_ALLOW_MODIFY
|
|
1156
|
-
: PropInterface.PROP_TYPE_ALLOW_CREATE);
|
|
1157
|
-
if (subTask.ModeAsParent && parentMode !== subTask.getMode() &&
|
|
1158
|
-
this.getLevel() === Constants.TASK_LEVEL_RECORD &&
|
|
1159
|
-
(yield (subTask.getProp(PropInterface.PROP_TYPE_ALLOW_OPTION)).getValueBoolean()) &&
|
|
1160
|
-
(yield subTask.checkProp(modeProperty, true))) {
|
|
1161
|
-
if (!subformCtrl.isVisible() &&
|
|
1162
|
-
!(yield subformCtrl.checkProp(PropInterface.PROP_TYPE_REFRESH_WHEN_HIDDEN, false))) {
|
|
1163
|
-
subformCtrl.RefreshOnVisible = true;
|
|
1164
|
-
refresh = false;
|
|
1165
|
-
}
|
|
1166
|
-
else
|
|
1167
|
-
refresh = true;
|
|
1168
|
-
yield subTask.SetModeAsParent(parentMode);
|
|
1169
|
-
}
|
|
1170
|
-
else {
|
|
1171
|
-
refresh = (yield subformCtrl.checkProp(PropInterface.PROP_TYPE_AUTO_REFRESH, true)) && subTask.shouldBeRefreshed();
|
|
1172
|
-
if (refresh) {
|
|
1173
|
-
if (!subformCtrl.isVisible() &&
|
|
1174
|
-
!(yield subformCtrl.checkProp(PropInterface.PROP_TYPE_REFRESH_WHEN_HIDDEN, false))) {
|
|
1175
|
-
subformCtrl.RefreshOnVisible = true;
|
|
1176
|
-
refresh = false;
|
|
1177
|
-
}
|
|
1178
|
-
}
|
|
1179
|
-
}
|
|
1180
|
-
if (refresh)
|
|
1181
|
-
subTask.DoSubformPrefixSuffix = true;
|
|
1182
|
-
}
|
|
1183
|
-
return refresh;
|
|
1184
|
-
});
|
|
1185
|
-
}
|
|
1186
|
-
SetModeAsParent(parentMode) {
|
|
1187
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1188
|
-
yield this.enableModes();
|
|
1189
|
-
if (parentMode === Constants.TASK_MODE_CREATE) {
|
|
1190
|
-
let cmd = CommandFactory.CreateEventCommand(this.getTaskTag(), InternalInterface.MG_ACT_RTO_CREATE);
|
|
1191
|
-
yield this.DataviewManager.Execute(cmd);
|
|
1192
|
-
}
|
|
1193
|
-
else if (this.getMode() === Constants.TASK_MODE_CREATE) {
|
|
1194
|
-
this.setPreventRecordSuffix(true);
|
|
1195
|
-
this.setPreventControlChange(true);
|
|
1196
|
-
yield AccessHelper.eventsManager.handleInternalEventWithTask(this, InternalInterface.MG_ACT_RT_REFRESH_VIEW);
|
|
1197
|
-
this.setPreventRecordSuffix(false);
|
|
1198
|
-
this.setPreventControlChange(false);
|
|
1199
|
-
let subTaskDv = this.DataView;
|
|
1200
|
-
if (!subTaskDv.isEmpty() && (subTaskDv.getCurrRec()).getMode() !== DataModificationTypes.Insert)
|
|
1201
|
-
this.setMode(parentMode);
|
|
1202
|
-
else
|
|
1203
|
-
this.setMode(Constants.TASK_MODE_CREATE);
|
|
1204
|
-
yield this.getForm().RefreshDisplay(Constants.TASK_REFRESH_CURR_REC);
|
|
1205
|
-
}
|
|
1206
|
-
else
|
|
1207
|
-
this.setMode(parentMode);
|
|
1208
|
-
this.setOriginalTaskMode(parentMode);
|
|
1209
|
-
yield this.setCreateDeleteActsEnableState();
|
|
1210
|
-
});
|
|
1211
|
-
}
|
|
1212
|
-
doSubformRecPrefixSuffix() {
|
|
1213
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1214
|
-
let subTasks = this.GetSubTasks();
|
|
1215
|
-
for (let i = 0; i < subTasks.length; i++) {
|
|
1216
|
-
let subTask = subTasks.get_Item(i);
|
|
1217
|
-
if (subTask.DoSubformPrefixSuffix) {
|
|
1218
|
-
yield AccessHelper.eventsManager.handleInternalEventWithTaskAndSubformRefresh(subTask, InternalInterface.MG_ACT_REC_PREFIX, true);
|
|
1219
|
-
if (!AccessHelper.eventsManager.GetStopExecutionFlag())
|
|
1220
|
-
yield AccessHelper.eventsManager.handleInternalEventWithTask(subTask, InternalInterface.MG_ACT_REC_SUFFIX);
|
|
1221
|
-
}
|
|
1222
|
-
}
|
|
1223
|
-
});
|
|
1224
|
-
}
|
|
1225
|
-
CleanDoSubformPrefixSuffix() {
|
|
1226
|
-
let subTasks = this.GetSubTasks();
|
|
1227
|
-
for (let i = 0; i < subTasks.length; i++) {
|
|
1228
|
-
let subTask = subTasks.get_Item(i);
|
|
1229
|
-
subTask.DoSubformPrefixSuffix = false;
|
|
1230
|
-
}
|
|
1231
|
-
}
|
|
1232
|
-
mustConfirmInDeleteMode() {
|
|
1233
|
-
let prop = this.getProp(PropInterface.PROP_TYPE_CONFIRM_UPDATE);
|
|
1234
|
-
return !prop.isExpression();
|
|
1235
|
-
}
|
|
1236
|
-
addSubTask(subTask) {
|
|
1237
|
-
if (this.SubTasks === null)
|
|
1238
|
-
this.SubTasks = new TasksTable();
|
|
1239
|
-
this.SubTasks.addTask(subTask);
|
|
1240
|
-
}
|
|
1241
|
-
removeSubTask(subTask) {
|
|
1242
|
-
if (this.SubTasks !== null)
|
|
1243
|
-
this.SubTasks.removeTask(subTask);
|
|
1244
|
-
}
|
|
1245
|
-
setTransactionFailed(val) {
|
|
1246
|
-
this._transactionFailed = val;
|
|
1247
|
-
if (!val)
|
|
1248
|
-
this.TransactionErrorHandlingsRetry = null;
|
|
1249
|
-
}
|
|
1250
|
-
transactionFailed(level) {
|
|
1251
|
-
if (level === ConstInterface.TRANS_NONE ||
|
|
1252
|
-
(this.Transaction != null && this.Transaction.getLevel() === level))
|
|
1253
|
-
return this._transactionFailed;
|
|
1254
|
-
else if (level === ConstInterface.TRANS_NONE ||
|
|
1255
|
-
(this.TransactionErrorHandlingsRetry != null && this.TransactionErrorHandlingsRetry.getLevel() === level))
|
|
1256
|
-
return this._transactionFailed;
|
|
1257
|
-
return false;
|
|
1258
|
-
}
|
|
1259
|
-
setAfterRetry(val) {
|
|
1260
|
-
if (this.Transaction != null)
|
|
1261
|
-
this.Transaction.setAfterRetry(val);
|
|
1262
|
-
else if (this.TransactionErrorHandlingsRetry != null) {
|
|
1263
|
-
if (val === ConstInterface.RECOVERY_NONE)
|
|
1264
|
-
this.TransactionErrorHandlingsRetry = null;
|
|
1265
|
-
else
|
|
1266
|
-
this.TransactionErrorHandlingsRetry.setAfterRetry(val);
|
|
1267
|
-
}
|
|
1268
|
-
}
|
|
1269
|
-
getAfterRetry(recovery) {
|
|
1270
|
-
if (arguments.length === 0) {
|
|
1271
|
-
return this.getAfterRetry_0();
|
|
1272
|
-
}
|
|
1273
|
-
return this.getAfterRetry_1(recovery);
|
|
1274
|
-
}
|
|
1275
|
-
getAfterRetry_0() {
|
|
1276
|
-
if (this.Transaction != null)
|
|
1277
|
-
return this.Transaction.getAfterRetry();
|
|
1278
|
-
else if (this.TransactionErrorHandlingsRetry != null)
|
|
1279
|
-
return this.TransactionErrorHandlingsRetry.getAfterRetry();
|
|
1280
|
-
return false;
|
|
1281
|
-
}
|
|
1282
|
-
getAfterRetry_1(recovery) {
|
|
1283
|
-
if (this.Transaction != null)
|
|
1284
|
-
return this.Transaction.getAfterRetry(recovery);
|
|
1285
|
-
else if (this.TransactionErrorHandlingsRetry != null)
|
|
1286
|
-
return this.TransactionErrorHandlingsRetry.getAfterRetry(recovery);
|
|
1287
|
-
return false;
|
|
1288
|
-
}
|
|
1289
|
-
getExecEndTask() {
|
|
1290
|
-
return this._bExecEndTask;
|
|
1291
|
-
}
|
|
1292
|
-
resetExecEndTask() {
|
|
1293
|
-
this._bExecEndTask = false;
|
|
1294
|
-
}
|
|
1295
|
-
setExecEndTask() {
|
|
1296
|
-
this._bExecEndTask = true;
|
|
1297
|
-
}
|
|
1298
|
-
evalEndCond(mode) {
|
|
1299
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1300
|
-
let endTaskCondProp;
|
|
1301
|
-
let evalEndCondProp = this.getProp(PropInterface.PROP_TYPE_EVAL_END_CONDITION);
|
|
1302
|
-
if (this.InEndTask)
|
|
1303
|
-
return false;
|
|
1304
|
-
if (this._bExecEndTask)
|
|
1305
|
-
return true;
|
|
1306
|
-
if (evalEndCondProp != null && (NString.Compare(yield evalEndCondProp.getValue(), ConstInterface.END_COND_EVAL_IMMIDIATE, true) === 0 || ((yield evalEndCondProp.getValue()).toLowerCase() === mode.toLowerCase()))) {
|
|
1307
|
-
endTaskCondProp = this.getProp(PropInterface.PROP_TYPE_END_CONDITION);
|
|
1308
|
-
if (endTaskCondProp == null)
|
|
1309
|
-
return false;
|
|
1310
|
-
let endTask = yield endTaskCondProp.getValue();
|
|
1311
|
-
if (DisplayConvertor.toBoolean(endTask)) {
|
|
1312
|
-
this._bExecEndTask = true;
|
|
1313
|
-
return true;
|
|
1314
|
-
}
|
|
1315
|
-
return false;
|
|
1316
|
-
}
|
|
1317
|
-
return false;
|
|
1318
|
-
});
|
|
1319
|
-
}
|
|
1320
|
-
setTryingToStop(val) {
|
|
1321
|
-
if (this.hasSubTasks()) {
|
|
1322
|
-
for (let i = 0; i < this.SubTasks.getSize(); i = i + 1) {
|
|
1323
|
-
let task = this.SubTasks.getTask(i);
|
|
1324
|
-
task.setTryingToStop(val);
|
|
1325
|
-
}
|
|
1326
|
-
}
|
|
1327
|
-
this.IsTryingToStop = val;
|
|
1328
|
-
}
|
|
1329
|
-
getInRecordSuffix() {
|
|
1330
|
-
return this._inRecordSuffix;
|
|
1331
|
-
}
|
|
1332
|
-
setInRecordSuffix(bValue) {
|
|
1333
|
-
if (bValue !== this._inRecordSuffix) {
|
|
1334
|
-
this._inRecordSuffix = bValue;
|
|
1335
|
-
return true;
|
|
1336
|
-
}
|
|
1337
|
-
return false;
|
|
1338
|
-
}
|
|
1339
|
-
setEvalOldValues(bFlag) {
|
|
1340
|
-
if (bFlag !== this._evalOldValues) {
|
|
1341
|
-
this._evalOldValues = bFlag;
|
|
1342
|
-
return true;
|
|
1343
|
-
}
|
|
1344
|
-
return false;
|
|
1345
|
-
}
|
|
1346
|
-
getEvalOldValues() {
|
|
1347
|
-
return this._evalOldValues;
|
|
1348
|
-
}
|
|
1349
|
-
endTask(reversibleExit, onlyDescs, dueToVerifyError, subformDestination) {
|
|
1350
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1351
|
-
if (isNullOrUndefined(subformDestination))
|
|
1352
|
-
return yield this.endTask_1(reversibleExit, onlyDescs, false, dueToVerifyError);
|
|
1353
|
-
else
|
|
1354
|
-
return yield this.endTask_1(reversibleExit, onlyDescs, subformDestination, dueToVerifyError);
|
|
1355
|
-
});
|
|
1356
|
-
}
|
|
1357
|
-
endTask_1(reversibleExit, onlyDescs, subformDestination, dueToVerifyError) {
|
|
1358
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1359
|
-
let succeeded = true;
|
|
1360
|
-
let closedSubForm = false;
|
|
1361
|
-
let subTask;
|
|
1362
|
-
let mgdTab = AccessHelper.mgDataTable;
|
|
1363
|
-
if ((this.IsSubForm && !subformDestination) && !this._parentTask.InEndTask) {
|
|
1364
|
-
succeeded = yield this._parentTask.endTask(reversibleExit, onlyDescs, dueToVerifyError);
|
|
1365
|
-
}
|
|
1366
|
-
else if (!this.isAborting() && !this.InEndTask) {
|
|
1367
|
-
try {
|
|
1368
|
-
this.InEndTask = true;
|
|
1369
|
-
if ((MGDataCollection.Instance.StartupMgData.getFirstTask().InEndTask && MGDataCollection.Instance.StartupMgData.getFirstTask().ClosingFormUI) && AccessHelper.eventsManager.GetStopExecutionFlag()) {
|
|
1370
|
-
let cmd = CommandFactory.CreateUnloadCommand();
|
|
1371
|
-
MGDataCollection.Instance.getMGData(0).CmdsToServer.Add(cmd);
|
|
1372
|
-
yield CommandsProcessorManager.GetCommandsProcessor().Execute(CommandsProcessorBase_SendingInstruction.TASKS_AND_COMMANDS);
|
|
1373
|
-
return;
|
|
1374
|
-
}
|
|
1375
|
-
if (!this.IsTryingToStop)
|
|
1376
|
-
this.setTryingToStop(true);
|
|
1377
|
-
let i;
|
|
1378
|
-
if (reversibleExit) {
|
|
1379
|
-
if (this.hasSubTasks()) {
|
|
1380
|
-
if (!RemoteCommandsProcessor.GetInstance().DelayCommandExecution) {
|
|
1381
|
-
let pendingTransactions = true;
|
|
1382
|
-
let clientOperExist = this.CheckIfClientOperationExistsInSubformTasks(this, InternalInterface.MG_ACT_TASK_SUFFIX);
|
|
1383
|
-
if (!clientOperExist) {
|
|
1384
|
-
clientOperExist = this.CheckIfClientOperationExistsInSubformTasks(this, InternalInterface.MG_ACT_REC_SUFFIX);
|
|
1385
|
-
if (!clientOperExist)
|
|
1386
|
-
pendingTransactions = this.CheckIfPendingTransactions(this);
|
|
1387
|
-
}
|
|
1388
|
-
if (!clientOperExist && !pendingTransactions) {
|
|
1389
|
-
this.allowRemoteCmdExecution = false;
|
|
1390
|
-
this.SetServerSideTaskSuffix(this);
|
|
1391
|
-
RemoteCommandsProcessor.GetInstance().DelayCommandExecution = true;
|
|
1392
|
-
}
|
|
1393
|
-
}
|
|
1394
|
-
else
|
|
1395
|
-
this.SetServerSideTaskSuffix(this);
|
|
1396
|
-
for (i = 0; i < this.SubTasks.getSize() && succeeded; i++) {
|
|
1397
|
-
subTask = this.SubTasks.getTask(i);
|
|
1398
|
-
closedSubForm = closedSubForm || subTask.IsSubForm;
|
|
1399
|
-
yield AccessHelper.eventsManager.handleInternalEventWithTask(subTask, InternalInterface.MG_ACT_EXIT);
|
|
1400
|
-
succeeded = (!AccessHelper.eventsManager.GetStopExecutionFlag() || dueToVerifyError);
|
|
1401
|
-
}
|
|
1402
|
-
}
|
|
1403
|
-
if (this === mgdTab.StartupMgData.getFirstTask()) {
|
|
1404
|
-
for (i = mgdTab.getSize() - 1; i > 0 && succeeded; i--) {
|
|
1405
|
-
if (mgdTab.getMGData(i) != null) {
|
|
1406
|
-
yield AccessHelper.eventsManager.handleInternalEventWithTask(mgdTab.getMGData(i).getFirstTask(), InternalInterface.MG_ACT_EXIT);
|
|
1407
|
-
succeeded = (!AccessHelper.eventsManager.GetStopExecutionFlag() || dueToVerifyError);
|
|
1408
|
-
}
|
|
1409
|
-
}
|
|
1410
|
-
}
|
|
1411
|
-
}
|
|
1412
|
-
if (succeeded) {
|
|
1413
|
-
if (reversibleExit && !dueToVerifyError) {
|
|
1414
|
-
let forceSuffix = yield this.checkProp(PropInterface.PROP_TYPE_FORCE_SUFFIX, false);
|
|
1415
|
-
if (!this.IsInteractive && forceSuffix === true && this.getMode() === Constants.TASK_MODE_CREATE)
|
|
1416
|
-
this.setProp(PropInterface.PROP_TYPE_FORCE_SUFFIX, "0");
|
|
1417
|
-
yield AccessHelper.eventsManager.handleInternalEventWithTask(this, InternalInterface.MG_ACT_REC_SUFFIX);
|
|
1418
|
-
if (!this.IsInteractive && forceSuffix === true && this.getMode() === Constants.TASK_MODE_CREATE)
|
|
1419
|
-
this.setProp(PropInterface.PROP_TYPE_FORCE_SUFFIX, "1");
|
|
1420
|
-
}
|
|
1421
|
-
succeeded = (!AccessHelper.eventsManager.GetStopExecutionFlag() || dueToVerifyError);
|
|
1422
|
-
if (succeeded && !onlyDescs)
|
|
1423
|
-
this.HandleTransactionInfo();
|
|
1424
|
-
let preTskSuffix = succeeded;
|
|
1425
|
-
if (succeeded && !onlyDescs && reversibleExit && !dueToVerifyError &&
|
|
1426
|
-
(!this.IsSubForm || subformDestination) &&
|
|
1427
|
-
this.TaskPrefixExecuted && !this.TaskSuffixExecuted)
|
|
1428
|
-
succeeded = yield this.handleTaskSuffix(true);
|
|
1429
|
-
if (reversibleExit && this.hasSubTasks())
|
|
1430
|
-
for (i = 0; i < this.SubTasks.getSize(); i++) {
|
|
1431
|
-
subTask = this.SubTasks.getTask(i);
|
|
1432
|
-
if (!subTask.IsSubForm)
|
|
1433
|
-
yield AccessHelper.eventsManager.handleNonReversibleEvent(subTask, InternalInterface.MG_ACT_EXIT);
|
|
1434
|
-
}
|
|
1435
|
-
if (reversibleExit)
|
|
1436
|
-
succeeded = (!AccessHelper.eventsManager.GetStopExecutionFlag() || dueToVerifyError);
|
|
1437
|
-
if (preTskSuffix)
|
|
1438
|
-
AccessHelper.eventsManager.setStopExecution(false);
|
|
1439
|
-
this.setAfterRetry(ConstInterface.RECOVERY_NONE);
|
|
1440
|
-
if (!this.isAborting() && succeeded && !onlyDescs) {
|
|
1441
|
-
if (reversibleExit) {
|
|
1442
|
-
this.setTransactionFailed(false);
|
|
1443
|
-
yield this.TaskTransactionManager.checkAndCommit(false, ConstInterface.TRANS_TASK_PREFIX, false);
|
|
1444
|
-
succeeded = (!AccessHelper.eventsManager.GetStopExecutionFlag() || dueToVerifyError) && !this.isAborting() && !this.transactionFailed(ConstInterface.TRANS_TASK_PREFIX);
|
|
1445
|
-
}
|
|
1446
|
-
this.setAfterRetry(ConstInterface.RECOVERY_NONE);
|
|
1447
|
-
if (succeeded) {
|
|
1448
|
-
if (!this.allowRemoteCmdExecution) {
|
|
1449
|
-
this.allowRemoteCmdExecution = true;
|
|
1450
|
-
RemoteCommandsProcessor.GetInstance().DelayCommandExecution = false;
|
|
1451
|
-
}
|
|
1452
|
-
else if (this.DelayCommandExecution) {
|
|
1453
|
-
this.DelayCommandExecution = false;
|
|
1454
|
-
RemoteCommandsProcessor.GetInstance().DelayCommandExecution = true;
|
|
1455
|
-
}
|
|
1456
|
-
let baseMgd = AccessHelper.mgDataTable.StartupMgData;
|
|
1457
|
-
if (reversibleExit && baseMgd.getFirstTask().getTaskTag() === this.getTaskTag()) {
|
|
1458
|
-
AccessHelper.eventsManager.setProcessingTopMostEndTask(true);
|
|
1459
|
-
yield AccessHelper.eventsManager.handleEvents(baseMgd, 0);
|
|
1460
|
-
AccessHelper.eventsManager.setProcessingTopMostEndTask(false);
|
|
1461
|
-
if (this.isAborting())
|
|
1462
|
-
return true;
|
|
1463
|
-
}
|
|
1464
|
-
yield TaskServiceBase.Exit(this, reversibleExit, subformDestination);
|
|
1465
|
-
if (this._parentTask != null && this._parentTask.isMainProg()) {
|
|
1466
|
-
let mgd = AccessHelper.mgDataTable.getMGData(0);
|
|
1467
|
-
let mainPrgTask = mgd.getMainProg(0);
|
|
1468
|
-
let rootTask = AccessHelper.mgDataTable.StartupMgData.getFirstTask();
|
|
1469
|
-
let endMainPrg = yield mainPrgTask.checkProp(PropInterface.PROP_TYPE_END_CONDITION, false);
|
|
1470
|
-
if (this !== rootTask && endMainPrg) {
|
|
1471
|
-
let rtEvt = new RunTimeEvent(rootTask);
|
|
1472
|
-
rtEvt.setInternal(InternalInterface.MG_ACT_CLOSE);
|
|
1473
|
-
rtEvt.setCtrl(null);
|
|
1474
|
-
rtEvt.setArgList(null);
|
|
1475
|
-
AccessHelper.eventsManager.addToTail(rtEvt);
|
|
1476
|
-
}
|
|
1477
|
-
}
|
|
1478
|
-
MgForm.CreatedForms.remove(this.Form);
|
|
1479
|
-
}
|
|
1480
|
-
}
|
|
1481
|
-
}
|
|
1482
|
-
}
|
|
1483
|
-
finally {
|
|
1484
|
-
if (!this.IsSubForm || subformDestination)
|
|
1485
|
-
this.handleFinallyEndTask(succeeded, reversibleExit);
|
|
1486
|
-
}
|
|
1487
|
-
}
|
|
1488
|
-
else if (this.InEndTask)
|
|
1489
|
-
succeeded = false;
|
|
1490
|
-
AccessHelper.eventsManager.setProcessingTopMostEndTask(this._inProcessingTopMostEndTaskSaved);
|
|
1491
|
-
return succeeded;
|
|
1492
|
-
});
|
|
1493
|
-
}
|
|
1494
|
-
SetServerSideTaskSuffix(task) {
|
|
1495
|
-
let clientOperationExist = false;
|
|
1496
|
-
var rtEvt = new RunTimeEvent(task);
|
|
1497
|
-
rtEvt.setInternal(InternalInterface.MG_ACT_TASK_SUFFIX);
|
|
1498
|
-
let handler = null;
|
|
1499
|
-
var evtHanPos = new EventHandlerPosition();
|
|
1500
|
-
evtHanPos.init(rtEvt);
|
|
1501
|
-
handler = evtHanPos.getNext();
|
|
1502
|
-
if (handler != null) {
|
|
1503
|
-
for (let i = 0; i < handler.getOperationTab().getSize(); i++) {
|
|
1504
|
-
let oper = handler.getOperationTab().getOperation(i);
|
|
1505
|
-
oper.setExecOnServer(true);
|
|
1506
|
-
}
|
|
1507
|
-
}
|
|
1508
|
-
if (task.hasSubTasks()) {
|
|
1509
|
-
for (let i = 0; i < task.GetSubTasks().length; i++) {
|
|
1510
|
-
let subTask = task.SubTasks.getTask(i);
|
|
1511
|
-
this.SetServerSideTaskSuffix(subTask);
|
|
1512
|
-
}
|
|
1513
|
-
}
|
|
1514
|
-
}
|
|
1515
|
-
CheckIfClientOperationExistsInSubformTasks(task, eventCode) {
|
|
1516
|
-
let clientOperationExist = false;
|
|
1517
|
-
var rtEvt = new RunTimeEvent(task);
|
|
1518
|
-
rtEvt.setInternal(eventCode);
|
|
1519
|
-
let handler = null;
|
|
1520
|
-
var evtHanPos = new EventHandlerPosition();
|
|
1521
|
-
evtHanPos.init(rtEvt);
|
|
1522
|
-
handler = evtHanPos.getNext();
|
|
1523
|
-
let pendingTransactions = false;
|
|
1524
|
-
if (eventCode == InternalInterface.MG_ACT_REC_SUFFIX) {
|
|
1525
|
-
let currRecord = task.DataView.getCurrRec();
|
|
1526
|
-
if (task.DataView.modifiedRecordsNumber() > 0 || (currRecord != null && currRecord.Modified))
|
|
1527
|
-
pendingTransactions = true;
|
|
1528
|
-
}
|
|
1529
|
-
if (handler != null && pendingTransactions == true) {
|
|
1530
|
-
let cnt = handler.getOperationTab().getSize();
|
|
1531
|
-
for (let i = 0; i < cnt; i++) {
|
|
1532
|
-
let oper = handler.getOperationTab().getOperation(i);
|
|
1533
|
-
if (oper.getExecOnClient()) {
|
|
1534
|
-
clientOperationExist = true;
|
|
1535
|
-
break;
|
|
1536
|
-
}
|
|
1537
|
-
}
|
|
1538
|
-
}
|
|
1539
|
-
if (!clientOperationExist && task.hasSubTasks()) {
|
|
1540
|
-
for (let i = 0; (!clientOperationExist && i < task.getSubTasks().getSize()); i++) {
|
|
1541
|
-
let subTask = task.SubTasks.getTask(i);
|
|
1542
|
-
clientOperationExist = this.CheckIfClientOperationExistsInSubformTasks(subTask, eventCode);
|
|
1543
|
-
}
|
|
1544
|
-
}
|
|
1545
|
-
return clientOperationExist;
|
|
1546
|
-
}
|
|
1547
|
-
CheckIfPendingTransactions(task) {
|
|
1548
|
-
let pendingTransactions = false;
|
|
1549
|
-
let currRecord = task.DataView.getCurrRec();
|
|
1550
|
-
if (task.DataView.modifiedRecordsNumber() > 0 || (currRecord != null && currRecord.Modified))
|
|
1551
|
-
pendingTransactions = true;
|
|
1552
|
-
if (!pendingTransactions && task.hasSubTasks()) {
|
|
1553
|
-
for (let i = 0; (!pendingTransactions && i < task.getSubTasks().getSize()); i++) {
|
|
1554
|
-
let subTask = task.SubTasks.getTask(i);
|
|
1555
|
-
pendingTransactions = this.CheckIfPendingTransactions(subTask);
|
|
1556
|
-
}
|
|
1557
|
-
}
|
|
1558
|
-
return pendingTransactions;
|
|
1559
|
-
}
|
|
1560
|
-
HandleTransactionInfo() {
|
|
1561
|
-
let transaction = this.DataviewManager.RemoteDataviewManager.Transaction;
|
|
1562
|
-
if (transaction !== null && transaction.isOwner(this) && transaction.getLevel() === 'P') {
|
|
1563
|
-
this.DataviewManager.RemoteDataviewManager.Transaction = null;
|
|
1564
|
-
this.DataView.setTransCleared();
|
|
1565
|
-
}
|
|
1566
|
-
}
|
|
1567
|
-
Exit(reversibleExit, subformDestination) {
|
|
1568
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1569
|
-
let cmd = reversibleExit ?
|
|
1570
|
-
CommandFactory.CreateBrowserEscEventCommand(this.getTaskTag(), subformDestination) :
|
|
1571
|
-
CommandFactory.CreateNonReversibleExitCommand(this.getTaskTag(), subformDestination);
|
|
1572
|
-
this._mgData.CmdsToServer.Add(cmd);
|
|
1573
|
-
if (!subformDestination) {
|
|
1574
|
-
try {
|
|
1575
|
-
if (this.getTaskTag() == MGDataCollection.Instance.StartupMgData.getFirstTask().getTaskTag() ||
|
|
1576
|
-
!(MGDataCollection.Instance.StartupMgData.getFirstTask().InEndTask && MGDataCollection.Instance.StartupMgData.getFirstTask().ClosingFormUI))
|
|
1577
|
-
yield Task.CommandsProcessor.Execute(CommandsProcessorBase_SendingInstruction.TASKS_AND_COMMANDS);
|
|
1578
|
-
}
|
|
1579
|
-
catch (err) {
|
|
1580
|
-
if (this.isMainProg()) {
|
|
1581
|
-
this._mgData.CmdsToServer.Add(cmd);
|
|
1582
|
-
}
|
|
1583
|
-
else
|
|
1584
|
-
throw err;
|
|
1585
|
-
}
|
|
1586
|
-
}
|
|
1587
|
-
});
|
|
1588
|
-
}
|
|
1589
|
-
handleFinallyEndTask(succeeded, reversibleExit) {
|
|
1590
|
-
let subTask;
|
|
1591
|
-
if (this.hasSubTasks()) {
|
|
1592
|
-
for (let i = 0; i < this.SubTasks.getSize(); i++) {
|
|
1593
|
-
subTask = this.SubTasks.getTask(i);
|
|
1594
|
-
subTask.handleFinallyEndTask(succeeded, reversibleExit);
|
|
1595
|
-
}
|
|
1596
|
-
}
|
|
1597
|
-
this.InEndTask = false;
|
|
1598
|
-
if (succeeded)
|
|
1599
|
-
this._isStarted = false;
|
|
1600
|
-
if (!succeeded && reversibleExit && this.IsTryingToStop)
|
|
1601
|
-
this.setTryingToStop(false);
|
|
1602
|
-
}
|
|
1603
|
-
handleTaskSuffix(withSubTasks) {
|
|
1604
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1605
|
-
let succeeded = true;
|
|
1606
|
-
let subTask;
|
|
1607
|
-
if (withSubTasks) {
|
|
1608
|
-
if (this.hasSubTasks()) {
|
|
1609
|
-
for (let i = 0; i < this.SubTasks.getSize() && succeeded; i++) {
|
|
1610
|
-
subTask = this.SubTasks.getTask(i);
|
|
1611
|
-
succeeded = yield subTask.handleTaskSuffix(withSubTasks);
|
|
1612
|
-
}
|
|
1613
|
-
}
|
|
1614
|
-
}
|
|
1615
|
-
if (succeeded)
|
|
1616
|
-
yield AccessHelper.eventsManager.handleInternalEventWithTask(this, InternalInterface.MG_ACT_TASK_SUFFIX);
|
|
1617
|
-
succeeded = !AccessHelper.eventsManager.GetStopExecutionFlag();
|
|
1618
|
-
this.TaskSuffixExecuted = true;
|
|
1619
|
-
return succeeded;
|
|
1620
|
-
});
|
|
1621
|
-
}
|
|
1622
|
-
setInCreateLine(inCreateLine) {
|
|
1623
|
-
this._inCreateLine = inCreateLine;
|
|
1624
|
-
}
|
|
1625
|
-
getInCreateLine() {
|
|
1626
|
-
return this._inCreateLine;
|
|
1627
|
-
}
|
|
1628
|
-
handleEventOnSlaveTasks(internalEvtCode) {
|
|
1629
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1630
|
-
let i;
|
|
1631
|
-
let task = null;
|
|
1632
|
-
let failureTask = null;
|
|
1633
|
-
let mgdTab = AccessHelper.mgDataTable;
|
|
1634
|
-
let triggeredTasks = mgdTab.getTriggeredTasks(this);
|
|
1635
|
-
let orphans = null;
|
|
1636
|
-
let sameTrans;
|
|
1637
|
-
let hasSlaves = false;
|
|
1638
|
-
let isOwner = this.Transaction != null && this.Transaction.isOwner(this);
|
|
1639
|
-
if (isOwner) {
|
|
1640
|
-
AccessHelper.eventsManager.setEventScopeTrans();
|
|
1641
|
-
orphans = new List();
|
|
1642
|
-
mgdTab.startTasksIteration();
|
|
1643
|
-
while ((task = mgdTab.getNextTask()) != null) {
|
|
1644
|
-
sameTrans = task.Transaction != null && this.Transaction.getTransId() === task.Transaction.getTransId();
|
|
1645
|
-
if (task !== this && sameTrans && task.PreviouslyActiveTaskId != null && mgdTab.GetTaskByID(task.PreviouslyActiveTaskId) == null)
|
|
1646
|
-
orphans.push(task);
|
|
1647
|
-
}
|
|
1648
|
-
}
|
|
1649
|
-
let scopeTrans = AccessHelper.eventsManager.isEventScopeTrans();
|
|
1650
|
-
for (i = 0; i < triggeredTasks.length && !AccessHelper.eventsManager.GetStopExecutionFlag(); i++) {
|
|
1651
|
-
task = triggeredTasks.get_Item(i);
|
|
1652
|
-
sameTrans = this.Transaction != null && task.Transaction != null && this.Transaction.getTransId() === task.Transaction.getTransId();
|
|
1653
|
-
if (!task.IsSubForm && (scopeTrans && sameTrans) && task.isStarted()) {
|
|
1654
|
-
if (task.getForm().FormRefreshed && internalEvtCode === InternalInterface.MG_ACT_REC_PREFIX && task.getLevel() === Constants.TASK_LEVEL_TASK)
|
|
1655
|
-
yield task.DataView.currRecCompute(false);
|
|
1656
|
-
yield AccessHelper.eventsManager.handleInternalEventWithTask(task, internalEvtCode);
|
|
1657
|
-
hasSlaves = true;
|
|
1658
|
-
}
|
|
1659
|
-
}
|
|
1660
|
-
for (; isOwner && i < orphans.length && !AccessHelper.eventsManager.GetStopExecutionFlag(); i++) {
|
|
1661
|
-
task = orphans.get_Item(i);
|
|
1662
|
-
if (task.getForm().FormRefreshed && internalEvtCode === InternalInterface.MG_ACT_REC_PREFIX && task.getLevel() === Constants.TASK_LEVEL_TASK)
|
|
1663
|
-
yield task.DataView.currRecCompute(false);
|
|
1664
|
-
yield AccessHelper.eventsManager.handleInternalEventWithTask(task, internalEvtCode);
|
|
1665
|
-
hasSlaves = true;
|
|
1666
|
-
}
|
|
1667
|
-
if (hasSlaves && AccessHelper.eventsManager.GetStopExecutionFlag())
|
|
1668
|
-
failureTask = task;
|
|
1669
|
-
if (isOwner)
|
|
1670
|
-
AccessHelper.eventsManager.clearEventScope();
|
|
1671
|
-
return failureTask;
|
|
1672
|
-
});
|
|
1673
|
-
}
|
|
1674
|
-
enableRecordActions() {
|
|
1675
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1676
|
-
let dataview = this.DataView;
|
|
1677
|
-
yield this.setCreateDeleteActsEnableState();
|
|
1678
|
-
if (dataview.IncludesFirst() || dataview.IsOneWayKey) {
|
|
1679
|
-
if (dataview.isEmptyDataview() || dataview.getCurrRecIdx() === 0) {
|
|
1680
|
-
this.ActionManager.enable(InternalInterface.MG_ACT_TBL_PRVLINE, false);
|
|
1681
|
-
if (dataview.IsOneWayKey)
|
|
1682
|
-
this.ActionManager.enable(InternalInterface.MG_ACT_TBL_BEGTBL, true);
|
|
1683
|
-
else
|
|
1684
|
-
this.ActionManager.enable(InternalInterface.MG_ACT_TBL_BEGTBL, false);
|
|
1685
|
-
if (this.Form.isScreenMode())
|
|
1686
|
-
this.ActionManager.enable(InternalInterface.MG_ACT_TBL_PRVPAGE, false);
|
|
1687
|
-
}
|
|
1688
|
-
else {
|
|
1689
|
-
this.ActionManager.enable(InternalInterface.MG_ACT_TBL_PRVLINE, true);
|
|
1690
|
-
this.ActionManager.enable(InternalInterface.MG_ACT_TBL_BEGTBL, true);
|
|
1691
|
-
if (this.Form.isScreenMode())
|
|
1692
|
-
this.ActionManager.enable(InternalInterface.MG_ACT_TBL_PRVPAGE, true);
|
|
1693
|
-
}
|
|
1694
|
-
if (!this.Form.isScreenMode())
|
|
1695
|
-
if (dataview.isEmptyDataview() || (dataview.getCurrRecIdx() === 0) || (dataview.getTopRecIdx() === 0))
|
|
1696
|
-
this.ActionManager.enable(InternalInterface.MG_ACT_TBL_PRVPAGE, false);
|
|
1697
|
-
else
|
|
1698
|
-
this.ActionManager.enable(InternalInterface.MG_ACT_TBL_PRVPAGE, true);
|
|
1699
|
-
}
|
|
1700
|
-
else {
|
|
1701
|
-
this.ActionManager.enable(InternalInterface.MG_ACT_TBL_BEGTBL, true);
|
|
1702
|
-
this.ActionManager.enable(InternalInterface.MG_ACT_TBL_PRVPAGE, true);
|
|
1703
|
-
this.ActionManager.enable(InternalInterface.MG_ACT_TBL_PRVLINE, true);
|
|
1704
|
-
}
|
|
1705
|
-
if (dataview.IncludesLast()) {
|
|
1706
|
-
if (((this.getMode() === Constants.TASK_MODE_QUERY) || dataview.isEmptyDataview() ||
|
|
1707
|
-
((this.getMode() === Constants.TASK_MODE_MODIFY) &&
|
|
1708
|
-
(!Environment.Instance.allowCreateInModifyMode(this.getCompIdx()) ||
|
|
1709
|
-
!(yield this.checkProp(PropInterface.PROP_TYPE_ALLOW_CREATE, true))))) && (dataview.getCurrRecIdx() + 1) === dataview.getSize()) {
|
|
1710
|
-
this.ActionManager.enable(InternalInterface.MG_ACT_TBL_NXTLINE, false);
|
|
1711
|
-
this.ActionManager.enable(InternalInterface.MG_ACT_TBL_ENDTBL, false);
|
|
1712
|
-
if (this.Form.isScreenMode())
|
|
1713
|
-
this.ActionManager.enable(InternalInterface.MG_ACT_TBL_NXTPAGE, false);
|
|
1714
|
-
}
|
|
1715
|
-
else {
|
|
1716
|
-
this.ActionManager.enable(InternalInterface.MG_ACT_TBL_NXTLINE, true);
|
|
1717
|
-
this.ActionManager.enable(InternalInterface.MG_ACT_TBL_ENDTBL, true);
|
|
1718
|
-
if (this.Form.isScreenMode())
|
|
1719
|
-
this.ActionManager.enable(InternalInterface.MG_ACT_TBL_NXTPAGE, true);
|
|
1720
|
-
}
|
|
1721
|
-
if (!this.Form.isScreenMode()) {
|
|
1722
|
-
if (dataview.isEmptyDataview() || ((dataview.getSize() - dataview.getTopRecIdx()) <= this.Form.getRowsInPage()))
|
|
1723
|
-
this.ActionManager.enable(InternalInterface.MG_ACT_TBL_NXTPAGE, false);
|
|
1724
|
-
else
|
|
1725
|
-
this.ActionManager.enable(InternalInterface.MG_ACT_TBL_NXTPAGE, true);
|
|
1726
|
-
}
|
|
1727
|
-
}
|
|
1728
|
-
else {
|
|
1729
|
-
this.ActionManager.enable(InternalInterface.MG_ACT_TBL_NXTLINE, true);
|
|
1730
|
-
this.ActionManager.enable(InternalInterface.MG_ACT_TBL_NXTPAGE, true);
|
|
1731
|
-
this.ActionManager.enable(InternalInterface.MG_ACT_TBL_ENDTBL, true);
|
|
1732
|
-
}
|
|
1733
|
-
if (dataview.isEmptyDataview())
|
|
1734
|
-
this.ActionManager.enable(InternalInterface.MG_ACT_CANCEL, false);
|
|
1735
|
-
else
|
|
1736
|
-
this.ActionManager.enable(InternalInterface.MG_ACT_CANCEL, true);
|
|
1737
|
-
this.ActionManager.enable(InternalInterface.MG_ACT_ENTER_ROW_EDITING, true);
|
|
1738
|
-
this.ActionManager.enable(InternalInterface.MG_ACT_NO_PROG_EXE_RIGHTS, true);
|
|
1739
|
-
});
|
|
1740
|
-
}
|
|
1741
|
-
isStarted() {
|
|
1742
|
-
return this._isStarted;
|
|
1743
|
-
}
|
|
1744
|
-
getSubTasks() {
|
|
1745
|
-
return this.SubTasks;
|
|
1746
|
-
}
|
|
1747
|
-
refreshesOn(fldId) {
|
|
1748
|
-
let result = false;
|
|
1749
|
-
for (let i = 0; !result && this.RefreshOnVars !== null && i < this.RefreshOnVars.length; i++) {
|
|
1750
|
-
result = (this.RefreshOnVars[i] === fldId);
|
|
1751
|
-
}
|
|
1752
|
-
return result;
|
|
1753
|
-
}
|
|
1754
|
-
AbortTransaction() {
|
|
1755
|
-
this.DataviewManager.RemoteDataviewManager.Transaction = null;
|
|
1756
|
-
}
|
|
1757
|
-
setPreventRecordSuffix(val) {
|
|
1758
|
-
this._preventRecordSuffix = val;
|
|
1759
|
-
}
|
|
1760
|
-
getPreventRecordSuffix() {
|
|
1761
|
-
return this._preventRecordSuffix;
|
|
1762
|
-
}
|
|
1763
|
-
setPreventControlChange(val) {
|
|
1764
|
-
this._preventControlChange = val;
|
|
1765
|
-
}
|
|
1766
|
-
getPreventControlChange() {
|
|
1767
|
-
return this._preventControlChange;
|
|
1768
|
-
}
|
|
1769
|
-
resetKnownToServer() {
|
|
1770
|
-
this._knownToServer = false;
|
|
1771
|
-
}
|
|
1772
|
-
evaluateDescriptor() {
|
|
1773
|
-
let result = "";
|
|
1774
|
-
let res;
|
|
1775
|
-
if (this.DvPosDescriptor == null)
|
|
1776
|
-
return HashUtils.GetHashCode(result);
|
|
1777
|
-
let first = true;
|
|
1778
|
-
for (let i = 0; i < this.DvPosDescriptor.length; i++) {
|
|
1779
|
-
if (!first)
|
|
1780
|
-
result += ";";
|
|
1781
|
-
let currentCell = this.DvPosDescriptor.get_Item(i);
|
|
1782
|
-
let currentTag = currentCell[0];
|
|
1783
|
-
let currentVeeIdx = NNumber.Parse(currentCell[1]);
|
|
1784
|
-
let currentTask = AccessHelper.mgDataTable.GetTaskByID(currentTag);
|
|
1785
|
-
let currentField = currentTask.DataView.getField(currentVeeIdx);
|
|
1786
|
-
let dispVal = currentField.getDispValue();
|
|
1787
|
-
if (currentField.isNull())
|
|
1788
|
-
dispVal = "";
|
|
1789
|
-
let pic;
|
|
1790
|
-
switch (currentField.getType()) {
|
|
1791
|
-
case StorageAttribute.BOOLEAN:
|
|
1792
|
-
case StorageAttribute.ALPHA:
|
|
1793
|
-
case StorageAttribute.UNICODE:
|
|
1794
|
-
case StorageAttribute.BLOB:
|
|
1795
|
-
case StorageAttribute.BLOB_VECTOR:
|
|
1796
|
-
result += dispVal;
|
|
1797
|
-
break;
|
|
1798
|
-
case StorageAttribute.DATE:
|
|
1799
|
-
case StorageAttribute.TIME:
|
|
1800
|
-
if (dispVal !== "") {
|
|
1801
|
-
pic = new PIC(currentField.getPicture(), currentField.getType(), 0);
|
|
1802
|
-
let conv = DisplayConvertor.Instance;
|
|
1803
|
-
result += conv.mg2disp(dispVal, "", pic, false, this.getCompIdx(), false);
|
|
1804
|
-
}
|
|
1805
|
-
break;
|
|
1806
|
-
case StorageAttribute.NUMERIC:
|
|
1807
|
-
if (dispVal !== "") {
|
|
1808
|
-
res = new NUM_TYPE(dispVal);
|
|
1809
|
-
pic = new PIC(currentField.getPicture(), currentField.getType(), 0);
|
|
1810
|
-
result += res.to_a(pic);
|
|
1811
|
-
}
|
|
1812
|
-
break;
|
|
1813
|
-
}
|
|
1814
|
-
first = false;
|
|
1815
|
-
}
|
|
1816
|
-
let tmpStr2 = StrUtil.stringToHexaDump(result, 4);
|
|
1817
|
-
return HashUtils.GetHashCode(tmpStr2);
|
|
1818
|
-
}
|
|
1819
|
-
setDescriptor(newDesc) {
|
|
1820
|
-
if (!(newDesc.trim() === "")) {
|
|
1821
|
-
let desc = StrUtil.tokenize(newDesc, ";");
|
|
1822
|
-
this.DvPosDescriptor = new List();
|
|
1823
|
-
for (let i = 0; i < desc.length; i = i + 1) {
|
|
1824
|
-
let cell = new Array(2);
|
|
1825
|
-
let tagVeePair = StrUtil.tokenize(desc[i], ",");
|
|
1826
|
-
cell[0] = tagVeePair[0];
|
|
1827
|
-
cell[1] = tagVeePair[1];
|
|
1828
|
-
this.DvPosDescriptor.push(cell);
|
|
1829
|
-
}
|
|
1830
|
-
}
|
|
1831
|
-
}
|
|
1832
|
-
getTaskCache() {
|
|
1833
|
-
return this._dvCache;
|
|
1834
|
-
}
|
|
1835
|
-
prepareCache(ignoreCurr) {
|
|
1836
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1837
|
-
let success = true;
|
|
1838
|
-
if (!ignoreCurr) {
|
|
1839
|
-
if (yield this.isCached()) {
|
|
1840
|
-
if (this.DataView.getChanged()) {
|
|
1841
|
-
this._dvCache.removeDvFromCache(this.DataView.getDvPosValue(), true);
|
|
1842
|
-
success = false;
|
|
1843
|
-
}
|
|
1844
|
-
}
|
|
1845
|
-
else {
|
|
1846
|
-
if (this.IsSubForm && !(yield this.isCached())) {
|
|
1847
|
-
success = false;
|
|
1848
|
-
}
|
|
1849
|
-
}
|
|
1850
|
-
}
|
|
1851
|
-
let curretTask;
|
|
1852
|
-
if (this.hasSubTasks()) {
|
|
1853
|
-
for (let i = 0; i < this.SubTasks.getSize(); i = i + 1) {
|
|
1854
|
-
curretTask = this.SubTasks.getTask(i);
|
|
1855
|
-
if (!(yield curretTask.prepareCache(false))) {
|
|
1856
|
-
success = false;
|
|
1857
|
-
}
|
|
1858
|
-
}
|
|
1859
|
-
}
|
|
1860
|
-
return success;
|
|
1861
|
-
});
|
|
1862
|
-
}
|
|
1863
|
-
testAndSet(ignoreCurr) {
|
|
1864
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1865
|
-
if (!ignoreCurr && (yield this.isCached())) {
|
|
1866
|
-
let requestedDv = this.evaluateDescriptor();
|
|
1867
|
-
if (requestedDv !== this.DataView.getDvPosValue()) {
|
|
1868
|
-
let fromCache = this._dvCache.getCachedDataView(requestedDv);
|
|
1869
|
-
if (fromCache == null)
|
|
1870
|
-
return false;
|
|
1871
|
-
yield this.changeDv(fromCache);
|
|
1872
|
-
}
|
|
1873
|
-
this.DoSubformPrefixSuffix = true;
|
|
1874
|
-
}
|
|
1875
|
-
if (this.hasSubTasks()) {
|
|
1876
|
-
for (let i = 0; i < this.SubTasks.getSize(); i++) {
|
|
1877
|
-
if (!(yield this.SubTasks.getTask(i).testAndSet(false)))
|
|
1878
|
-
return false;
|
|
1879
|
-
}
|
|
1880
|
-
}
|
|
1881
|
-
return true;
|
|
1882
|
-
});
|
|
1883
|
-
}
|
|
1884
|
-
changeDv(fromCache) {
|
|
1885
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1886
|
-
let dataview = this.DataView;
|
|
1887
|
-
if (!this.hasLocate) {
|
|
1888
|
-
if (!dataview.getChanged() && dataview.IncludesFirst())
|
|
1889
|
-
this._dvCache.putInCache(dataview.replicate());
|
|
1890
|
-
}
|
|
1891
|
-
else
|
|
1892
|
-
this.locatePutInCache();
|
|
1893
|
-
yield dataview.setSameAs(fromCache);
|
|
1894
|
-
dataview.takeFldValsFromCurrRec();
|
|
1895
|
-
this.Form.SetTableItemsCount(0, true);
|
|
1896
|
-
this.Form.setTableItemsCount(false);
|
|
1897
|
-
yield this.Form.RefreshDisplay(Constants.TASK_REFRESH_FORM);
|
|
1898
|
-
this.setOriginalTaskMode(this.getMode());
|
|
1899
|
-
});
|
|
1900
|
-
}
|
|
1901
|
-
setOriginalTaskMode(originalTaskMode) {
|
|
1902
|
-
this._originalTaskMode = originalTaskMode.charAt(0);
|
|
1903
|
-
}
|
|
1904
|
-
getOriginalTaskMode() {
|
|
1905
|
-
return this._originalTaskMode;
|
|
1906
|
-
}
|
|
1907
|
-
isCached() {
|
|
1908
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1909
|
-
return this.IsSubForm && (yield this.Form.getSubFormCtrl().checkProp(PropInterface.PROP_TYPE_IS_CACHED, false));
|
|
1910
|
-
});
|
|
1911
|
-
}
|
|
1912
|
-
locatePutInCache() {
|
|
1913
|
-
let cached = this._dvCache.getCachedDataView(this.DataView.getDvPosValue());
|
|
1914
|
-
if (cached != null) {
|
|
1915
|
-
if (this.DataView.checkFirst(cached.getLocateFirstRec()) && !this.DataView.getChanged()) {
|
|
1916
|
-
this.DataView.setLocateFirstRec(cached.getLocateFirstRec());
|
|
1917
|
-
this._dvCache.putInCache(this.DataView.replicate());
|
|
1918
|
-
}
|
|
1919
|
-
else
|
|
1920
|
-
this._dvCache.removeDvFromCache(this.DataView.getDvPosValue(), true);
|
|
1921
|
-
}
|
|
1922
|
-
else {
|
|
1923
|
-
if (!this.DataView.getChanged())
|
|
1924
|
-
this._dvCache.putInCache(this.DataView.replicate());
|
|
1925
|
-
}
|
|
1926
|
-
}
|
|
1927
|
-
HasLoacte() {
|
|
1928
|
-
return this.hasLocate;
|
|
1929
|
-
}
|
|
1930
|
-
setRemoteTransaction(transId) {
|
|
1931
|
-
let mgdTab = AccessHelper.mgDataTable;
|
|
1932
|
-
let transTask;
|
|
1933
|
-
let isFind = false;
|
|
1934
|
-
mgdTab.startTasksIteration();
|
|
1935
|
-
while ((transTask = mgdTab.getNextTask()) != null) {
|
|
1936
|
-
if (transTask.DataviewManager.RemoteDataviewManager.Transaction != null &&
|
|
1937
|
-
transTask.DataviewManager.RemoteDataviewManager.Transaction.getTransId() === transId) {
|
|
1938
|
-
isFind = true;
|
|
1939
|
-
break;
|
|
1940
|
-
}
|
|
1941
|
-
}
|
|
1942
|
-
this.DataviewManager.RemoteDataviewManager.Transaction = (isFind ?
|
|
1943
|
-
transTask.DataviewManager.RemoteDataviewManager.Transaction :
|
|
1944
|
-
new Transaction(this, transId, false));
|
|
1945
|
-
}
|
|
1946
|
-
setTransOwnerTask() {
|
|
1947
|
-
this.Transaction.setOwnerTask(this);
|
|
1948
|
-
this.Transaction.setTransBegin('T');
|
|
1949
|
-
}
|
|
1950
|
-
getLoopCounter() {
|
|
1951
|
-
let result = 0;
|
|
1952
|
-
if (this._useLoopStack && this._loopStack !== null && !(this._loopStack.count() === 0)) {
|
|
1953
|
-
result = this._loopStack.peek();
|
|
1954
|
-
}
|
|
1955
|
-
return result;
|
|
1956
|
-
}
|
|
1957
|
-
enterLoop() {
|
|
1958
|
-
if (this._loopStack === null)
|
|
1959
|
-
this._loopStack = new Stack();
|
|
1960
|
-
this._loopStack.push(0);
|
|
1961
|
-
}
|
|
1962
|
-
leaveLoop() {
|
|
1963
|
-
this.popLoopCounter();
|
|
1964
|
-
}
|
|
1965
|
-
popLoopCounter() {
|
|
1966
|
-
let result = 0;
|
|
1967
|
-
if (this._loopStack !== null && !(this._loopStack.count() === 0))
|
|
1968
|
-
result = this._loopStack.pop();
|
|
1969
|
-
return result;
|
|
1970
|
-
}
|
|
1971
|
-
increaseLoopCounter() {
|
|
1972
|
-
this._loopStack.push(this.popLoopCounter() + 1);
|
|
1973
|
-
}
|
|
1974
|
-
getLoopStackSize() {
|
|
1975
|
-
if (this._loopStack !== null)
|
|
1976
|
-
return this._loopStack.count();
|
|
1977
|
-
return 0;
|
|
1978
|
-
}
|
|
1979
|
-
setUseLoopStack(val) {
|
|
1980
|
-
this._useLoopStack = val;
|
|
1981
|
-
}
|
|
1982
|
-
getDataviewHeaders() {
|
|
1983
|
-
return this.DataviewHeadersTable;
|
|
1984
|
-
}
|
|
1985
|
-
isFirstRecordCycle(Value_) {
|
|
1986
|
-
if (arguments.length === 0) {
|
|
1987
|
-
return this.isFirstRecordCycle_0();
|
|
1988
|
-
}
|
|
1989
|
-
return this.isFirstRecordCycle_1(Value_);
|
|
1990
|
-
}
|
|
1991
|
-
isFirstRecordCycle_0() {
|
|
1992
|
-
return this._firstRecordCycle;
|
|
1993
|
-
}
|
|
1994
|
-
isFirstRecordCycle_1(Value_) {
|
|
1995
|
-
this._firstRecordCycle = Value_;
|
|
1996
|
-
}
|
|
1997
|
-
getPublicName() {
|
|
1998
|
-
return this.PublicName;
|
|
1999
|
-
}
|
|
2000
|
-
isAllowEvents() {
|
|
2001
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
2002
|
-
let prop = this.getProp(PropInterface.PROP_TYPE_TASK_PROPERTIES_ALLOW_EVENTS);
|
|
2003
|
-
return yield prop.getValueBoolean();
|
|
2004
|
-
});
|
|
2005
|
-
}
|
|
2006
|
-
getExternalTaskId() {
|
|
2007
|
-
let taskId = "";
|
|
2008
|
-
let prop = this.getProp(PropInterface.PROP_TYPE_TASK_ID);
|
|
2009
|
-
if (prop != null)
|
|
2010
|
-
taskId = prop.GetComputedValue();
|
|
2011
|
-
return taskId;
|
|
2012
|
-
}
|
|
2013
|
-
isTransactionOwner() {
|
|
2014
|
-
let isTransOwner = false;
|
|
2015
|
-
if (this.Transaction != null && this.Transaction.isOwner(this))
|
|
2016
|
-
isTransOwner = true;
|
|
2017
|
-
return isTransOwner;
|
|
2018
|
-
}
|
|
2019
|
-
isTransactionOnLevel(level) {
|
|
2020
|
-
return this.isTransactionOwner() && this.Transaction.getLevel() === level;
|
|
2021
|
-
}
|
|
2022
|
-
isProgram() {
|
|
2023
|
-
return this._isPrg;
|
|
2024
|
-
}
|
|
2025
|
-
enableModes() {
|
|
2026
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
2027
|
-
let enable = yield this.checkProp(PropInterface.PROP_TYPE_ALLOW_MODIFY, true);
|
|
2028
|
-
this.ActionManager.enable(InternalInterface.MG_ACT_RTO_MODIFY, enable);
|
|
2029
|
-
enable = yield this.checkProp(PropInterface.PROP_TYPE_ALLOW_CREATE, true);
|
|
2030
|
-
this.ActionManager.enable(InternalInterface.MG_ACT_RTO_CREATE, enable);
|
|
2031
|
-
enable = yield this.checkProp(PropInterface.PROP_TYPE_ALLOW_QUERY, true);
|
|
2032
|
-
this.ActionManager.enable(InternalInterface.MG_ACT_RTO_QUERY, enable);
|
|
2033
|
-
enable = yield this.checkProp(PropInterface.PROP_TYPE_ALLOW_RANGE, true);
|
|
2034
|
-
this.ActionManager.enable(InternalInterface.MG_ACT_RTO_RANGE, enable);
|
|
2035
|
-
enable = yield this.checkProp(PropInterface.PROP_TYPE_ALLOW_LOCATE, true);
|
|
2036
|
-
this.ActionManager.enable(InternalInterface.MG_ACT_RTO_LOCATE, enable);
|
|
2037
|
-
this.ActionManager.enable(InternalInterface.MG_ACT_RTO_SEARCH, enable);
|
|
2038
|
-
enable = yield this.checkProp(PropInterface.PROP_TYPE_ALLOW_SORT, true);
|
|
2039
|
-
this.ActionManager.enable(InternalInterface.MG_ACT_SORT_RECORDS, enable);
|
|
2040
|
-
enable = yield this.checkProp(PropInterface.PROP_TYPE_TASK_PROPERTIES_ALLOW_INDEX, true);
|
|
2041
|
-
this.ActionManager.enable(InternalInterface.MG_ACT_VIEW_BY_KEY, enable);
|
|
2042
|
-
});
|
|
2043
|
-
}
|
|
2044
|
-
setEnableZoomHandler() {
|
|
2045
|
-
this._enableZoomHandler = true;
|
|
2046
|
-
}
|
|
2047
|
-
getEnableZoomHandler() {
|
|
2048
|
-
return this._enableZoomHandler;
|
|
2049
|
-
}
|
|
2050
|
-
isDestinationSubform() {
|
|
2051
|
-
return this._destinationSubform;
|
|
2052
|
-
}
|
|
2053
|
-
setDestinationSubform(destinationSubform) {
|
|
2054
|
-
this._destinationSubform = destinationSubform;
|
|
2055
|
-
}
|
|
2056
|
-
getIsDestinationCall() {
|
|
2057
|
-
return this._isDestinationCall;
|
|
2058
|
-
}
|
|
2059
|
-
setIsDestinationCall(isDestinationCall) {
|
|
2060
|
-
this._isDestinationCall = isDestinationCall;
|
|
2061
|
-
}
|
|
2062
|
-
setCancelWasRaised(val) {
|
|
2063
|
-
this._cancelWasRaised = val;
|
|
2064
|
-
}
|
|
2065
|
-
cancelWasRaised() {
|
|
2066
|
-
return this._cancelWasRaised;
|
|
2067
|
-
}
|
|
2068
|
-
enableCreateActs(val) {
|
|
2069
|
-
this.ActionManager.enable(InternalInterface.MG_ACT_CRELINE, val);
|
|
2070
|
-
this.ActionManager.enable(InternalInterface.MG_ACT_CRELINE_ABOVE, (this.getForm().HasTable()) ? val : false);
|
|
2071
|
-
}
|
|
2072
|
-
setCreateDeleteActsEnableState() {
|
|
2073
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
2074
|
-
if (!(this.DataView).isEmptyDataview() && (yield this.checkProp(PropInterface.PROP_TYPE_ALLOW_DELETE, true)) &&
|
|
2075
|
-
this.getMode() === Constants.TASK_MODE_MODIFY && this.DataView.HasMainTable)
|
|
2076
|
-
this.ActionManager.enable(InternalInterface.MG_ACT_DELLINE, true);
|
|
2077
|
-
else
|
|
2078
|
-
this.ActionManager.enable(InternalInterface.MG_ACT_DELLINE, false);
|
|
2079
|
-
if ((yield this.checkProp(PropInterface.PROP_TYPE_ALLOW_CREATE, true)) &&
|
|
2080
|
-
(this.DataView.HasMainTable &&
|
|
2081
|
-
(this.getMode() === Constants.TASK_MODE_MODIFY && Environment.Instance.allowCreateInModifyMode(this.getCompIdx())) ||
|
|
2082
|
-
(this.getMode() === Constants.TASK_MODE_CREATE)))
|
|
2083
|
-
this.enableCreateActs(true);
|
|
2084
|
-
else
|
|
2085
|
-
this.enableCreateActs(false);
|
|
2086
|
-
});
|
|
2087
|
-
}
|
|
2088
|
-
setEmptyDataview(emptyDataview) {
|
|
2089
|
-
this.DataView.setEmptyDataview(emptyDataview);
|
|
2090
|
-
}
|
|
2091
|
-
getName() {
|
|
2092
|
-
return this.Name;
|
|
2093
|
-
}
|
|
2094
|
-
emptyDataviewOpen(subformRefresh) {
|
|
2095
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
2096
|
-
if (this.getLevel() === Constants.TASK_LEVEL_TASK) {
|
|
2097
|
-
this.ActionManager.enable(InternalInterface.MG_ACT_EMPTY_DATAVIEW, true);
|
|
2098
|
-
if (this.IsSubForm) {
|
|
2099
|
-
let rtEvnt = AccessHelper.eventsManager.getLastRtEvent();
|
|
2100
|
-
if ((rtEvnt != null && rtEvnt.getInternalCode() == InternalInterface.MG_ACT_RT_REFRESH_VIEW) || subformRefresh) {
|
|
2101
|
-
let rtEvt = new RunTimeEvent(this);
|
|
2102
|
-
rtEvt.setInternal(InternalInterface.MG_ACT_EMPTY_DATAVIEW);
|
|
2103
|
-
rtEvt.SetEventSubType(EventSubType.Normal);
|
|
2104
|
-
yield AccessHelper.eventsManager.handleEvent(rtEvt, false);
|
|
2105
|
-
}
|
|
2106
|
-
}
|
|
2107
|
-
else
|
|
2108
|
-
AccessHelper.eventsManager.addInternalEventWithItaskAndCode(this, InternalInterface.MG_ACT_EMPTY_DATAVIEW);
|
|
2109
|
-
this.setLevel(Constants.TASK_LEVEL_RECORD);
|
|
2110
|
-
if (this.SubformExecMode !== Task_SubformExecModeEnum.FIRST_TIME && subformRefresh && (yield this.CheckRefreshSubTasks())) {
|
|
2111
|
-
yield this.DataView.computeSubForms();
|
|
2112
|
-
yield this.doSubformRecPrefixSuffix();
|
|
2113
|
-
}
|
|
2114
|
-
yield this.enableRecordActions();
|
|
2115
|
-
this.ActionManager.enable(InternalInterface.MG_ACT_RT_REFRESH_RECORD, false);
|
|
2116
|
-
this.ActionManager.enable(InternalInterface.MG_ACT_RT_REFRESH_SCREEN, false);
|
|
2117
|
-
}
|
|
2118
|
-
});
|
|
2119
|
-
}
|
|
2120
|
-
emptyDataviewClose() {
|
|
2121
|
-
this.ActionManager.enable(InternalInterface.MG_ACT_EMPTY_DATAVIEW, false);
|
|
2122
|
-
this.setLevel(Constants.TASK_LEVEL_TASK);
|
|
2123
|
-
this.ActionManager.enable(InternalInterface.MG_ACT_RT_REFRESH_RECORD, true);
|
|
2124
|
-
this.ActionManager.enable(InternalInterface.MG_ACT_RT_REFRESH_SCREEN, true);
|
|
2125
|
-
}
|
|
2126
|
-
SubformRefresh(subformTask, explicitSubformRefresh) {
|
|
2127
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
2128
|
-
let currTask = LastFocusedManager.Instance.getLastFocusedTask();
|
|
2129
|
-
let isInside = yield subformTask.ExecuteNestedRS(currTask);
|
|
2130
|
-
if (AccessHelper.eventsManager.GetStopExecutionFlag())
|
|
2131
|
-
return;
|
|
2132
|
-
if (subformTask.getLevel() !== Constants.TASK_LEVEL_TASK && !AccessHelper.eventsManager.GetStopExecutionFlag()) {
|
|
2133
|
-
AccessHelper.eventsManager.pushNewExecStacks();
|
|
2134
|
-
yield AccessHelper.eventsManager.handleInternalEventWithTaskAndSubformRefresh(subformTask, InternalInterface.MG_ACT_REC_SUFFIX, true);
|
|
2135
|
-
AccessHelper.eventsManager.popNewExecStacks();
|
|
2136
|
-
isInside = true;
|
|
2137
|
-
if (AccessHelper.eventsManager.GetStopExecutionFlag())
|
|
2138
|
-
return;
|
|
2139
|
-
}
|
|
2140
|
-
let cmd = CommandFactory.CreateSubformRefreshCommand(this.getTaskTag(), subformTask.getTaskTag(), explicitSubformRefresh);
|
|
2141
|
-
yield subformTask.DataviewManager.Execute(cmd);
|
|
2142
|
-
if (subformTask.isAborting())
|
|
2143
|
-
return;
|
|
2144
|
-
if (explicitSubformRefresh) {
|
|
2145
|
-
AccessHelper.eventsManager.pushNewExecStacks();
|
|
2146
|
-
let performParentRecordPrefixOrg = subformTask.PerformParentRecordPrefix;
|
|
2147
|
-
subformTask.PerformParentRecordPrefix = false;
|
|
2148
|
-
yield AccessHelper.eventsManager.handleInternalEventWithTaskAndSubformRefresh(subformTask, InternalInterface.MG_ACT_REC_PREFIX, true);
|
|
2149
|
-
subformTask.PerformParentRecordPrefix = performParentRecordPrefixOrg;
|
|
2150
|
-
AccessHelper.eventsManager.popNewExecStacks();
|
|
2151
|
-
if (AccessHelper.eventsManager.GetStopExecutionFlag())
|
|
2152
|
-
return;
|
|
2153
|
-
}
|
|
2154
|
-
if (isInside) {
|
|
2155
|
-
}
|
|
2156
|
-
else {
|
|
2157
|
-
if (!AccessHelper.eventsManager.GetStopExecutionFlag()) {
|
|
2158
|
-
if (explicitSubformRefresh) {
|
|
2159
|
-
yield AccessHelper.eventsManager.handleInternalEventWithTask(subformTask, InternalInterface.MG_ACT_REC_SUFFIX);
|
|
2160
|
-
if (currTask != null)
|
|
2161
|
-
currTask.DataView.setPrevCurrRec();
|
|
2162
|
-
subformTask.DoSubformPrefixSuffix = false;
|
|
2163
|
-
}
|
|
2164
|
-
}
|
|
2165
|
-
}
|
|
2166
|
-
});
|
|
2167
|
-
}
|
|
2168
|
-
ExecuteNestedRS(lastTask) {
|
|
2169
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
2170
|
-
let isExecuteNestedRS = false;
|
|
2171
|
-
if (lastTask == null)
|
|
2172
|
-
return isExecuteNestedRS;
|
|
2173
|
-
if (this.getLevel() !== Constants.TASK_LEVEL_TASK && lastTask.getMgdID() !== this.getMgdID())
|
|
2174
|
-
return isExecuteNestedRS;
|
|
2175
|
-
for (let task = lastTask; task !== this && task.pathContains(this) && task.getLevel() !== Constants.TASK_LEVEL_TASK; task = task.getParent()) {
|
|
2176
|
-
AccessHelper.eventsManager.pushNewExecStacks();
|
|
2177
|
-
yield AccessHelper.eventsManager.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_SUFFIX);
|
|
2178
|
-
AccessHelper.eventsManager.popNewExecStacks();
|
|
2179
|
-
isExecuteNestedRS = true;
|
|
2180
|
-
}
|
|
2181
|
-
return isExecuteNestedRS;
|
|
2182
|
-
});
|
|
2183
|
-
}
|
|
2184
|
-
execSubformRecSuffix(newTask) {
|
|
2185
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
2186
|
-
let subfTask;
|
|
2187
|
-
let i, idx = 0;
|
|
2188
|
-
for (i = this._taskPath.length; i > 0; i--) {
|
|
2189
|
-
subfTask = this._taskPath.get_Item(i - 1);
|
|
2190
|
-
if (!newTask._taskPath.Contains(subfTask)) {
|
|
2191
|
-
yield AccessHelper.eventsManager.handleInternalEventWithTask(subfTask, InternalInterface.MG_ACT_REC_SUFFIX);
|
|
2192
|
-
if (AccessHelper.eventsManager.GetStopExecutionFlag())
|
|
2193
|
-
break;
|
|
2194
|
-
if (subfTask.getMode() === Constants.TASK_MODE_CREATE && !(subfTask.DataView.getCurrRec()).isNewRec())
|
|
2195
|
-
subfTask.setMode(Constants.TASK_MODE_MODIFY);
|
|
2196
|
-
}
|
|
2197
|
-
else {
|
|
2198
|
-
idx = newTask._taskPath.indexOf(subfTask);
|
|
2199
|
-
break;
|
|
2200
|
-
}
|
|
2201
|
-
}
|
|
2202
|
-
Debug.Assert(i > 0);
|
|
2203
|
-
return idx;
|
|
2204
|
-
});
|
|
2205
|
-
}
|
|
2206
|
-
getCounter() {
|
|
2207
|
-
return this._counter;
|
|
2208
|
-
}
|
|
2209
|
-
increaseCounter() {
|
|
2210
|
-
this._counter = this._counter + 1;
|
|
2211
|
-
}
|
|
2212
|
-
setCounter(cnt) {
|
|
2213
|
-
this._counter = cnt;
|
|
2214
|
-
}
|
|
2215
|
-
isCurrentStartProgLevel() {
|
|
2216
|
-
return this._currStartProgLevel === Task.StartProgLevel;
|
|
2217
|
-
}
|
|
2218
|
-
static isMainProgramField(fieldStr) {
|
|
2219
|
-
let Field = XmlParser.getTokens(fieldStr, ',');
|
|
2220
|
-
let mainProgField = false;
|
|
2221
|
-
if (Field.length === 2) {
|
|
2222
|
-
let parent = NNumber.Parse(Field.get_Item(0));
|
|
2223
|
-
if (parent === TaskBase.MAIN_PRG_PARENT_ID)
|
|
2224
|
-
mainProgField = true;
|
|
2225
|
-
}
|
|
2226
|
-
return mainProgField;
|
|
2227
|
-
}
|
|
2228
|
-
getTaskInfo() {
|
|
2229
|
-
let taskName = (this.getProp(PropInterface.PROP_TYPE_NAME)).GetComputedValue();
|
|
2230
|
-
return NString.Format('{0} {1}', this.isProgram() ? 'Program' : 'Subtask', taskName);
|
|
2231
|
-
}
|
|
2232
|
-
toString() {
|
|
2233
|
-
return NString.Format("(task {0}-\"{1}\"{2})", this._taskTag, this.Name, super.isMainProg() ? (" ctl " + this._ctlIdx) : "");
|
|
2234
|
-
}
|
|
2235
|
-
ConstructMgForm(alreadySetParentForm) {
|
|
2236
|
-
let form = new MgForm();
|
|
2237
|
-
let parentForm = (this.ParentTask != null ? this.ParentTask.getForm() : null);
|
|
2238
|
-
while (parentForm != null && !parentForm.getTask().isOpenWin()) {
|
|
2239
|
-
parentForm = parentForm.ParentForm;
|
|
2240
|
-
}
|
|
2241
|
-
form.ParentForm = parentForm;
|
|
2242
|
-
alreadySetParentForm.value = true;
|
|
2243
|
-
return form;
|
|
2244
|
-
}
|
|
2245
|
-
getMgdID() {
|
|
2246
|
-
return this._mgData.GetId();
|
|
2247
|
-
}
|
|
2248
|
-
getMGData() {
|
|
2249
|
-
return this._mgData;
|
|
2250
|
-
}
|
|
2251
|
-
RefreshDisplay() {
|
|
2252
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
2253
|
-
if (this.Form !== null && !this.isAborting() && this.isStarted()) {
|
|
2254
|
-
Logger.Instance.WriteDevToLog("Start task.RefreshDisplay()");
|
|
2255
|
-
if (this._refreshType !== Constants.TASK_REFRESH_NONE) {
|
|
2256
|
-
let form = this.Form;
|
|
2257
|
-
let wasRefreshed = yield form.RefreshDisplay(Constants.TASK_REFRESH_FORM);
|
|
2258
|
-
if (wasRefreshed) {
|
|
2259
|
-
this._refreshType = Constants.TASK_REFRESH_NONE;
|
|
2260
|
-
}
|
|
2261
|
-
}
|
|
2262
|
-
Logger.Instance.WriteDevToLog("End task.RefreshDisplay()");
|
|
2263
|
-
}
|
|
2264
|
-
});
|
|
2265
|
-
}
|
|
2266
|
-
getFieldDisplayValue(fieldDef, value, isNull) {
|
|
2267
|
-
value.value = fieldDef.getDispValue();
|
|
2268
|
-
isNull.value = fieldDef.isNull();
|
|
2269
|
-
}
|
|
2270
|
-
UpdateFieldValueAndStartRecompute(fieldDef, value, isNull) {
|
|
2271
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
2272
|
-
if (this.TaskPrefixExecuted) {
|
|
2273
|
-
yield fieldDef.setValueAndStartRecompute(value, isNull, true, false, false);
|
|
2274
|
-
}
|
|
2275
|
-
});
|
|
2276
|
-
}
|
|
2277
|
-
ShouldNonInteractiveChildBeModal() {
|
|
2278
|
-
return this.ShouldChildBeModal();
|
|
2279
|
-
}
|
|
2280
|
-
ShouldChildBeModal() {
|
|
2281
|
-
let childShouldBehaveAsModal = false;
|
|
2282
|
-
if ((this.Form.ConcreteWindowType === WindowType.Overlay) && this.getForm().Opened)
|
|
2283
|
-
childShouldBehaveAsModal = true;
|
|
2284
|
-
else if (!this.IsInteractive) {
|
|
2285
|
-
childShouldBehaveAsModal = true;
|
|
2286
|
-
}
|
|
2287
|
-
return childShouldBehaveAsModal;
|
|
2288
|
-
}
|
|
2289
|
-
getParent() {
|
|
2290
|
-
return this._parentTask;
|
|
2291
|
-
}
|
|
2292
|
-
isDescendentOf(chkTask) {
|
|
2293
|
-
if (chkTask === this)
|
|
2294
|
-
return true;
|
|
2295
|
-
else if (chkTask === null || this._parentTask === null)
|
|
2296
|
-
return false;
|
|
2297
|
-
return this._parentTask.isDescendentOf(chkTask);
|
|
2298
|
-
}
|
|
2299
|
-
GetSubformModalParentTask() {
|
|
2300
|
-
let currTask = this;
|
|
2301
|
-
while (currTask._parentTask != null && currTask._parentTask.getIsDestinationCall()) {
|
|
2302
|
-
let subformCtrl = (currTask._parentTask.getForm().getSubFormCtrl());
|
|
2303
|
-
if (subformCtrl.IsModal()) {
|
|
2304
|
-
return subformCtrl;
|
|
2305
|
-
}
|
|
2306
|
-
currTask = currTask._parentTask;
|
|
2307
|
-
}
|
|
2308
|
-
return null;
|
|
2309
|
-
}
|
|
2310
|
-
ShouldEvaluatePropertyLocally(propId) {
|
|
2311
|
-
return this.TaskService.ShouldEvaluatePropertyLocally(propId);
|
|
2312
|
-
}
|
|
2313
|
-
EnsureValidForm() {
|
|
2314
|
-
if (this._isMainPrg && this.Form !== null) {
|
|
2315
|
-
if (!this._openWin || !this.Form.isLegalForm) {
|
|
2316
|
-
this.Form = null;
|
|
2317
|
-
}
|
|
2318
|
-
}
|
|
2319
|
-
}
|
|
2320
|
-
ComputeMainDisplay() {
|
|
2321
|
-
let propMainDisplay = this.getProp(PropInterface.PROP_TYPE_MAIN_DISPLAY);
|
|
2322
|
-
let mainDisplayIndex = propMainDisplay.GetComputedValueInteger();
|
|
2323
|
-
mainDisplayIndex = this.GetRealMainDisplayIndexOnCurrentTask(mainDisplayIndex);
|
|
2324
|
-
this._forms.InitFormFromXmlString(mainDisplayIndex);
|
|
2325
|
-
this.EnsureValidForm();
|
|
2326
|
-
}
|
|
2327
|
-
PrepareTaskForm() {
|
|
2328
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
2329
|
-
yield TaskServiceBase.PreparePropOpenTaskWindow(this);
|
|
2330
|
-
return RemoteTaskService.PreparePropMainDisplay(this);
|
|
2331
|
-
});
|
|
2332
|
-
}
|
|
2333
|
-
FormIsLegal() {
|
|
2334
|
-
let isFormIsLegal = super.isMainProg();
|
|
2335
|
-
return isFormIsLegal || super.getForm().isLegalForm;
|
|
2336
|
-
}
|
|
2337
|
-
GetRealMainDisplayIndexOnDepth(mainDspIdx) {
|
|
2338
|
-
let task = this.LogicalStudioParentTask;
|
|
2339
|
-
while (task != null) {
|
|
2340
|
-
mainDspIdx += task._forms.Count;
|
|
2341
|
-
task = task.LogicalStudioParentTask;
|
|
2342
|
-
}
|
|
2343
|
-
return mainDspIdx;
|
|
2344
|
-
}
|
|
2345
|
-
GetRealMainDisplayIndexOnCurrentTask(mainDspIdx) {
|
|
2346
|
-
if (mainDspIdx > 1) {
|
|
2347
|
-
let task = this.LogicalStudioParentTask;
|
|
2348
|
-
while (task != null) {
|
|
2349
|
-
mainDspIdx -= task._forms.Count;
|
|
2350
|
-
task = task.LogicalStudioParentTask;
|
|
2351
|
-
}
|
|
2352
|
-
}
|
|
2353
|
-
return mainDspIdx;
|
|
2354
|
-
}
|
|
2355
|
-
GetAncestorTaskByTaskDefinitionId(findTaskDefinitionId) {
|
|
2356
|
-
let currentTask = this;
|
|
2357
|
-
if (findTaskDefinitionId.IsMainProgram())
|
|
2358
|
-
return GuiDataCollection.MGDataTable.GetMainProgByCtlIdx(this.ContextID, findTaskDefinitionId.CtlIndex);
|
|
2359
|
-
while (currentTask != null) {
|
|
2360
|
-
if (currentTask.TaskDefinitionId.Equals(findTaskDefinitionId))
|
|
2361
|
-
return currentTask;
|
|
2362
|
-
currentTask = currentTask._parentTask;
|
|
2363
|
-
}
|
|
2364
|
-
return null;
|
|
2365
|
-
}
|
|
2366
|
-
SetDataControlValuesReference(controlId, dcValuesId) {
|
|
2367
|
-
let ctrl = super.getForm().getCtrl(controlId);
|
|
2368
|
-
ctrl.setDcValId(dcValuesId);
|
|
2369
|
-
}
|
|
2370
|
-
DisplayMessageToStatusBar(text) {
|
|
2371
|
-
let taskToVerifyOn = this.GetContextTask();
|
|
2372
|
-
if (taskToVerifyOn.getForm() == null)
|
|
2373
|
-
taskToVerifyOn = LastFocusedManager.Instance.getLastFocusedTask();
|
|
2374
|
-
taskToVerifyOn.WriteToMessagePane(text, true);
|
|
2375
|
-
}
|
|
2376
|
-
isTableWithAbsolutesScrollbar() {
|
|
2377
|
-
let isTableWithAbsolutesScrollbar = false;
|
|
2378
|
-
if (this.getForm() != null)
|
|
2379
|
-
isTableWithAbsolutesScrollbar = this.getForm().isTableWithAbsoluteScrollbar();
|
|
2380
|
-
return isTableWithAbsolutesScrollbar;
|
|
2381
|
-
}
|
|
2382
|
-
GetTaskDetails() {
|
|
2383
|
-
let names = (this.getProp(PropInterface.PROP_TYPE_NAME)).GetComputedValue();
|
|
2384
|
-
let task = this;
|
|
2385
|
-
while (task.ParentTask !== null && !task.ParentTask.isMainProg()) {
|
|
2386
|
-
task = task.ParentTask;
|
|
2387
|
-
names = (task.getProp(PropInterface.PROP_TYPE_NAME)).GetComputedValue() + "." + names;
|
|
2388
|
-
}
|
|
2389
|
-
return names;
|
|
2390
|
-
}
|
|
2391
|
-
static ProcessTaskURL() {
|
|
2392
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
2393
|
-
let xmlData = RuntimeContextBase.Instance.Parser.getXMLdata();
|
|
2394
|
-
let endTaskUrlIdx = xmlData.indexOf(XMLConstants.TAG_CLOSE, RuntimeContextBase.Instance.Parser.getCurrIndex());
|
|
2395
|
-
Debug.Assert(endTaskUrlIdx !== -1 && endTaskUrlIdx < xmlData.length);
|
|
2396
|
-
let tag = RuntimeContextBase.Instance.Parser.getXMLsubstring(endTaskUrlIdx);
|
|
2397
|
-
RuntimeContextBase.Instance.Parser.add2CurrIndex(tag.indexOf(ConstInterface.MG_TAG_TASKURL) + ConstInterface.MG_TAG_TASKURL.length);
|
|
2398
|
-
let tokensVector = XmlParser.getTokens(RuntimeContextBase.Instance.Parser.getXMLsubstring(endTaskUrlIdx), XMLConstants.XML_ATTR_DELIM);
|
|
2399
|
-
let taskCacheURL = tokensVector.get_Item(1);
|
|
2400
|
-
let refListStr = tokensVector.get_Item(3);
|
|
2401
|
-
let taskContentOriginal = yield Task.CommandsProcessor.GetContent(taskCacheURL, true);
|
|
2402
|
-
let taskContentFinal = new StringBuilder(xmlData.substr(0, RuntimeContextBase.Instance.Parser.getCurrIndex() - (ConstInterface.MG_TAG_TASKURL.length + 1)), taskContentOriginal.length);
|
|
2403
|
-
let reflist = this.getReflist(refListStr, ';', true, -1);
|
|
2404
|
-
let refListIdx = 0;
|
|
2405
|
-
let currIdx = taskContentOriginal.indexOf("[:");
|
|
2406
|
-
let prevIdx = 0;
|
|
2407
|
-
while (currIdx !== -1) {
|
|
2408
|
-
taskContentFinal.Append(taskContentOriginal.substr(prevIdx, currIdx - prevIdx));
|
|
2409
|
-
taskContentFinal.Append(reflist.get_Item(refListIdx++));
|
|
2410
|
-
currIdx += 2;
|
|
2411
|
-
prevIdx = currIdx;
|
|
2412
|
-
currIdx = taskContentOriginal.indexOf("[:", prevIdx);
|
|
2413
|
-
}
|
|
2414
|
-
taskContentFinal.Append(taskContentOriginal.substr(prevIdx));
|
|
2415
|
-
taskContentFinal.Append(xmlData.substr(xmlData.indexOf(XMLConstants.TAG_CLOSE, endTaskUrlIdx + 1) + 1));
|
|
2416
|
-
xmlData = taskContentFinal.ToString();
|
|
2417
|
-
Logger.Instance.WriteDevToLog(NString.Format("{0} -------> {1}", taskCacheURL, xmlData));
|
|
2418
|
-
RuntimeContextBase.Instance.Parser.setXMLdata(xmlData);
|
|
2419
|
-
RuntimeContextBase.Instance.Parser.setCurrIndex(RuntimeContextBase.Instance.Parser.getCurrIndex() - (ConstInterface.MG_TAG_TASKURL.length + 1));
|
|
2420
|
-
});
|
|
2421
|
-
}
|
|
2422
|
-
static getReflist(data, delim, trunc, maxTokens) {
|
|
2423
|
-
let currStr = new StringBuilder();
|
|
2424
|
-
let list = new List();
|
|
2425
|
-
let tokensCnt = 0;
|
|
2426
|
-
for (let i = 1; i < data.length; i++) {
|
|
2427
|
-
let curr = data.charAt(i);
|
|
2428
|
-
if (curr !== '\\' && curr !== delim)
|
|
2429
|
-
currStr.Append(curr);
|
|
2430
|
-
else if (curr === delim) {
|
|
2431
|
-
list.push(currStr.ToString());
|
|
2432
|
-
currStr = new StringBuilder();
|
|
2433
|
-
tokensCnt++;
|
|
2434
|
-
if (tokensCnt === maxTokens)
|
|
2435
|
-
break;
|
|
2436
|
-
}
|
|
2437
|
-
else if (curr === '\\') {
|
|
2438
|
-
if (!trunc && data.charAt(i + 1) !== delim)
|
|
2439
|
-
currStr.Append(data.charAt(i));
|
|
2440
|
-
i++;
|
|
2441
|
-
currStr.Append(data.charAt(i));
|
|
2442
|
-
}
|
|
2443
|
-
}
|
|
2444
|
-
list.push(currStr.ToString());
|
|
2445
|
-
return list;
|
|
2446
|
-
}
|
|
2447
|
-
static StartProgram(callByDestSubForm, moveToFirstControl) {
|
|
2448
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
2449
|
-
let orgStopExecution = AccessHelper.eventsManager.GetStopExecutionFlag();
|
|
2450
|
-
let nonInteractiveTaskAlreadyExecuted = null;
|
|
2451
|
-
let allowEvents = AccessHelper.eventsManager.getAllowEvents();
|
|
2452
|
-
AccessHelper.eventsManager.setAllowEvents(EventsAllowedType.ALL);
|
|
2453
|
-
Logger.Instance.WriteDevToLog("Start \"startProg\"");
|
|
2454
|
-
Task.StartProgLevel++;
|
|
2455
|
-
AccessHelper.eventsManager.setStopExecution(false);
|
|
2456
|
-
nonInteractiveTaskAlreadyExecuted = yield this.ExecuteComponentMainPrograms(callByDestSubForm, moveToFirstControl);
|
|
2457
|
-
let nonInteractiveTaskAlreadyExecutedRef = new RefParam(nonInteractiveTaskAlreadyExecuted);
|
|
2458
|
-
let currentNonInteractiveTaskRef = new RefParam(null);
|
|
2459
|
-
yield Task.ExecuteMainProgram(0, callByDestSubForm, moveToFirstControl, nonInteractiveTaskAlreadyExecutedRef, currentNonInteractiveTaskRef, AccessHelper.mgDataTable);
|
|
2460
|
-
nonInteractiveTaskAlreadyExecuted = nonInteractiveTaskAlreadyExecutedRef.value;
|
|
2461
|
-
if (!Task._idleTimerStarted) {
|
|
2462
|
-
GUIManager.Instance.startTimer(AccessHelper.mgDataTable.getMGData(0), Environment.Instance.getIdleTime(0), true);
|
|
2463
|
-
Task._idleTimerStarted = true;
|
|
2464
|
-
}
|
|
2465
|
-
yield this.OpenForms(callByDestSubForm);
|
|
2466
|
-
yield this.DoFirstRecordCycle();
|
|
2467
|
-
yield this.MoveToFirstControls(callByDestSubForm);
|
|
2468
|
-
if (Task.StartProgLevel === 1) {
|
|
2469
|
-
let resetAllowEvents = false;
|
|
2470
|
-
let canExecuteEvents = true;
|
|
2471
|
-
if (nonInteractiveTaskAlreadyExecuted !== null && nonInteractiveTaskAlreadyExecuted.isStarted()) {
|
|
2472
|
-
resetAllowEvents = true;
|
|
2473
|
-
AccessHelper.eventsManager.setNonInteractiveAllowEvents(yield nonInteractiveTaskAlreadyExecuted.isAllowEvents(), nonInteractiveTaskAlreadyExecuted);
|
|
2474
|
-
canExecuteEvents = yield nonInteractiveTaskAlreadyExecuted.isAllowEvents();
|
|
2475
|
-
}
|
|
2476
|
-
if (LastFocusedManager.Instance.getLastFocusedTask() !== null && canExecuteEvents) {
|
|
2477
|
-
AccessHelper.eventsManager.pushNewExecStacks();
|
|
2478
|
-
yield AccessHelper.eventsManager.handleEvents(AccessHelper.mgDataTable.getCurrMGData(), 0);
|
|
2479
|
-
AccessHelper.eventsManager.popNewExecStacks();
|
|
2480
|
-
}
|
|
2481
|
-
if (resetAllowEvents)
|
|
2482
|
-
AccessHelper.eventsManager.setAllowEvents(allowEvents);
|
|
2483
|
-
}
|
|
2484
|
-
Task.StartProgLevel--;
|
|
2485
|
-
Logger.Instance.WriteDevToLog("End \"startProg\"");
|
|
2486
|
-
if (orgStopExecution && !AccessHelper.eventsManager.GetStopExecutionFlag())
|
|
2487
|
-
if (orgStopExecution && !AccessHelper.eventsManager.GetStopExecutionFlag())
|
|
2488
|
-
AccessHelper.eventsManager.setStopExecution(orgStopExecution);
|
|
2489
|
-
return nonInteractiveTaskAlreadyExecuted;
|
|
2490
|
-
});
|
|
2491
|
-
}
|
|
2492
|
-
static ExecuteComponentMainPrograms(callByDestSubForm, moveToFirstControl) {
|
|
2493
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
2494
|
-
let currentNonInteractiveTask = new RefParam(null);
|
|
2495
|
-
let nonInteractiveTaskAlreadyExecuted = new RefParam(null);
|
|
2496
|
-
let maxCtlIdx = AccessHelper.mgDataTable.getMGData(0).getMaxCtlIdx();
|
|
2497
|
-
for (let i = 1; i <= maxCtlIdx; i = i + 1) {
|
|
2498
|
-
let componentMainProgram = AccessHelper.mgDataTable.GetMainProgByCtlIdx(-1, i);
|
|
2499
|
-
if (componentMainProgram !== null)
|
|
2500
|
-
yield Task.ExecuteMainProgram(i, callByDestSubForm, moveToFirstControl, currentNonInteractiveTask, nonInteractiveTaskAlreadyExecuted, AccessHelper.mgDataTable);
|
|
2501
|
-
}
|
|
2502
|
-
return nonInteractiveTaskAlreadyExecuted.value;
|
|
2503
|
-
});
|
|
2504
|
-
}
|
|
2505
|
-
static ExecuteMainProgram(CtlIndex, callByDestSubForm, moveToFirstControl, currentNonInteractiveTask, nonInteractiveTaskAlreadyExecuted, mgDataTable) {
|
|
2506
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
2507
|
-
let mainProgramTask = mgDataTable.GetMainProgByCtlIdx(-1, CtlIndex);
|
|
2508
|
-
Logger.Instance.WriteDevToLog(NString.Format(" ClientManager.startProg: ctlIdx={0}, task={1}", CtlIndex, mainProgramTask));
|
|
2509
|
-
currentNonInteractiveTask.value = (yield mainProgramTask.Start(moveToFirstControl, callByDestSubForm));
|
|
2510
|
-
if (nonInteractiveTaskAlreadyExecuted.value === null)
|
|
2511
|
-
nonInteractiveTaskAlreadyExecuted.value = currentNonInteractiveTask.value;
|
|
2512
|
-
else if (currentNonInteractiveTask.value !== null) {
|
|
2513
|
-
Debug.Assert(false, "more than 1 non interactive tasks in startProg");
|
|
2514
|
-
}
|
|
2515
|
-
});
|
|
2516
|
-
}
|
|
2517
|
-
static OpenForms(callByDestSubForm) {
|
|
2518
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
2519
|
-
let createdForms = MgForm.CreatedForms;
|
|
2520
|
-
let outMostForm = null;
|
|
2521
|
-
if (createdForms.Count() > 0) {
|
|
2522
|
-
let i = 0;
|
|
2523
|
-
while (i < createdForms.Count()) {
|
|
2524
|
-
let mgForm = createdForms.get(i);
|
|
2525
|
-
let canOpen = false;
|
|
2526
|
-
if (mgForm.isSubForm()) {
|
|
2527
|
-
let opened = mgForm.getSubFormCtrl().getForm().Opened;
|
|
2528
|
-
if (opened) {
|
|
2529
|
-
canOpen = true;
|
|
2530
|
-
}
|
|
2531
|
-
}
|
|
2532
|
-
else {
|
|
2533
|
-
if (mgForm.getTask().isCurrentStartProgLevel()) {
|
|
2534
|
-
canOpen = true;
|
|
2535
|
-
}
|
|
2536
|
-
}
|
|
2537
|
-
if (canOpen) {
|
|
2538
|
-
Manager.OpenForm(mgForm);
|
|
2539
|
-
yield Manager.DoFirstRefreshTable(mgForm);
|
|
2540
|
-
}
|
|
2541
|
-
if (mgForm.Opened) {
|
|
2542
|
-
if (callByDestSubForm && mgForm.isSubForm())
|
|
2543
|
-
outMostForm = mgForm.getTopMostForm();
|
|
2544
|
-
createdForms.remove(mgForm);
|
|
2545
|
-
}
|
|
2546
|
-
else
|
|
2547
|
-
i++;
|
|
2548
|
-
}
|
|
2549
|
-
}
|
|
2550
|
-
});
|
|
2551
|
-
}
|
|
2552
|
-
static DoFirstRecordCycle() {
|
|
2553
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
2554
|
-
for (let i = 0; i < AccessHelper.mgDataTable.getSize(); i++) {
|
|
2555
|
-
let mgd = AccessHelper.mgDataTable.getMGData(i);
|
|
2556
|
-
if (mgd === null || mgd.IsAborting)
|
|
2557
|
-
continue;
|
|
2558
|
-
for (let j = 0; j < mgd.getTasksCount(); j++) {
|
|
2559
|
-
let task = mgd.getTask(j);
|
|
2560
|
-
if (task !== null) {
|
|
2561
|
-
let mgForm = task.getForm();
|
|
2562
|
-
if (mgForm !== null && task.isCurrentStartProgLevel() && !mgForm.IgnoreFirstRecordCycle) {
|
|
2563
|
-
mgForm.IgnoreFirstRecordCycle = true;
|
|
2564
|
-
yield task.doFirstRecordCycle();
|
|
2565
|
-
}
|
|
2566
|
-
}
|
|
2567
|
-
}
|
|
2568
|
-
}
|
|
2569
|
-
});
|
|
2570
|
-
}
|
|
2571
|
-
static MoveToFirstControls(callByDestSubForm) {
|
|
2572
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
2573
|
-
for (let i = 0; i < AccessHelper.mgDataTable.getSize(); i++) {
|
|
2574
|
-
let mgd = AccessHelper.mgDataTable.getMGData(i);
|
|
2575
|
-
if (mgd === null || mgd.IsAborting)
|
|
2576
|
-
continue;
|
|
2577
|
-
let tasksCount = mgd.getTasksCount();
|
|
2578
|
-
for (let j = 0; j < tasksCount; j++) {
|
|
2579
|
-
let task = mgd.getTask(j);
|
|
2580
|
-
let mgForm = task.getForm();
|
|
2581
|
-
if (task.isCurrentStartProgLevel() && mgForm !== null && mgForm.MovedToFirstControl) {
|
|
2582
|
-
mgForm.MovedToFirstControl = false;
|
|
2583
|
-
if (!callByDestSubForm)
|
|
2584
|
-
yield AccessHelper.eventsManager.HandleNonParkableControls(task);
|
|
2585
|
-
}
|
|
2586
|
-
}
|
|
2587
|
-
}
|
|
2588
|
-
});
|
|
2589
|
-
}
|
|
2590
|
-
}
|
|
2591
|
-
Task.StartProgLevel = 0;
|
|
2592
|
-
Task._idleTimerStarted = false;
|
|
2593
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGFzay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VuZ2luZS9zcmMvdGFza3MvVGFzay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNoSCxPQUFPLEVBQ0wsU0FBUyxFQUNULGlCQUFpQixFQUNqQixNQUFNLEVBQUUsZ0JBQWdCLEVBQ3hCLGdCQUFnQixFQUNoQixPQUFPLEVBRVAsVUFBVSxFQUNWLFlBQVksRUFDWixTQUFTLEVBQ1YsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQ0wsUUFBUSxFQUNSLHFCQUFxQixFQUNyQixnQkFBZ0IsRUFFaEIsaUJBQWlCLEVBRWpCLE9BQU8sRUFHUCxRQUFRLEVBQ1IsR0FBRyxFQUVILGFBQWEsRUFDYixXQUFXLEVBQ1gsa0JBQWtCLEVBQ2xCLE1BQU0sRUFDTixnQkFBZ0IsRUFDaEIsTUFBTSxFQUNOLEtBQUssRUFDTixNQUFNLGdCQUFnQixDQUFDO0FBRXhCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFMUMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDakYsT0FBTyxFQUF5Qix3Q0FBd0MsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNHLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUVwRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGNBQWMsRUFB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LE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUV2RSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUN6RSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUV0RSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUN6RSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUV0RSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUMxRSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUN2RSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUV2RSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUN4RSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxtQkFBbUIsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUV6RSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxxQ0FBcUMsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUN6RixJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMxRSxDQUFD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QixHQUFZLEtBQUssQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERlYnVnLCBIYXNoVXRpbHMsIExpc3QsIE5OdW1iZXIsIE5TdHJpbmcsIFJlZlBhcmFtLCBTdGFjaywgU3RyaW5nQnVpbGRlciB9IGZyb20gJ0BtYWdpYy14cGEvbXNjb3JlbGliJztcclxuaW1wb3J0IHtcclxuICBDb25zdGFudHMsXHJcbiAgSW50ZXJuYWxJbnRlcmZhY2UsXHJcbiAgTG9nZ2VyLCBMb2dnZXJfTG9nTGV2ZWxzLFxyXG4gIFN0b3JhZ2VBdHRyaWJ1dGUsXHJcbiAgU3RyVXRpbCxcclxuICBVbmlxdWVUc2tTb3J0LFxyXG4gIFdpbmRvd1R5cGUsXHJcbiAgWE1MQ29uc3RhbnRzLFxyXG4gIFhtbFBhcnNlclxyXG59IGZyb20gJ0BtYWdpYy14cGEvdXRpbHMnO1xyXG5pbXBvcnQge1xyXG4gIENvbW1hbmRzLFxyXG4gIERhdGFNb2RpZmljYXRpb25UeXBlcyxcclxuICBEaXNwbGF5Q29udmVydG9yLFxyXG4gIEZpZWxkRGVmLFxyXG4gIEd1aURhdGFDb2xsZWN0aW9uLFxyXG4gIElUYXNrLFxyXG4gIE1hbmFnZXIsXHJcbiAgTWdDb250cm9sQmFzZSxcclxuICBNZ0Zvcm1CYXNlLFxyXG4gIE5VTV9UWVBFLFxyXG4gIFBJQyxcclxuICBQcm9wZXJ0eSxcclxuICBQcm9wSW50ZXJmYWNlLFxyXG4gIFJlY29yZFV0aWxzLFxyXG4gIFJ1bnRpbWVDb250ZXh0QmFzZSxcclxuICBTdHlsZXMsXHJcbiAgVGFza0RlZmluaXRpb25JZCxcclxuICBFdmVudHMsXHJcbiAgSGVscHNcclxufSBmcm9tICdAbWFnaWMteHBhL2d1aSc7XHJcbmltcG9ydCB7IEV2ZW50IH0gZnJvbSAnLi4vZXZlbnQvRXZlbnQnO1xyXG5pbXBvcnQgeyBEYXRhVmlldyB9IGZyb20gJy4uL2RhdGEvRGF0YVZpZXcnO1xyXG5pbXBvcnQgeyBEdkNhY2hlIH0gZnJvbSAnLi4vZGF0YS9EdkNhY2hlJztcclxuaW1wb3J0IHsgTUdEYXRhIH0gZnJvbSAnLi9NR0RhdGEnO1xyXG5pbXBvcnQgeyBEYXRhVmlld0NvbW1hbmRUeXBlIH0gZnJvbSAnLi4vY29tbWFuZHMvQ2xpZW50VG9TZXJ2ZXIvRGF0YXZpZXdDb21tYW5kJztcclxuaW1wb3J0IHsgQ29tbWFuZHNQcm9jZXNzb3JCYXNlLCBDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2VuZGluZ0luc3RydWN0aW9uIH0gZnJvbSAnLi4vQ29tbWFuZHNQcm9jZXNzb3JCYXNlJztcclxuaW1wb3J0IHsgVGFza1NlcnZpY2VCYXNlIH0gZnJvbSAnLi9UYXNrU2VydmljZUJhc2UnO1xyXG5pbXBvcnQgeyBBcmd1bWVudHNMaXN0IH0gZnJvbSAnLi4vcnQvQXJndW1lbnRzTGlzdCc7XHJcbmltcG9ydCB7IFRhc2tUcmFuc2FjdGlvbk1hbmFnZXIgfSBmcm9tICcuLi9kYXRhL1Rhc2tUcmFuc2FjdGlvbk1hbmFnZXInO1xyXG5pbXBvcnQgeyBEYXRhdmlld01hbmFnZXIgfSBmcm9tICcuLi9kYXRhL0RhdGF2aWV3TWFuYWdlcic7XHJcbmltcG9ydCB7IFNvcnRDb2xsZWN0aW9uIH0gZnJvbSAnLi9zb3J0L1NvcnRDb2xsZWN0aW9uJztcclxuaW1wb3J0IHsgU29ydCB9IGZyb20gJy4vc29ydC9Tb3J0JztcclxuaW1wb3J0IHsgTWdGb3JtIH0gZnJvbSAnLi4vZ3VpL01nRm9ybSc7XHJcbmltcG9ydCB7IE1nQ29udHJvbCB9IGZyb20gJy4uL2d1aS9NZ0NvbnRyb2wnO1xyXG5pbXBvcnQgeyBSZW1vdGVUYXNrU2VydmljZSB9IGZyb20gJy4vUmVtb3RlVGFza1NlcnZpY2UnO1xyXG5pbXBvcnQgeyBSZXR1cm5SZXN1bHQgfSBmcm9tICcuLi91dGlsL1JldHVyblJlc3VsdCc7XHJcbmltcG9ydCB7IFJ1blRpbWVFdmVudCB9IGZyb20gJy4uL2V2ZW50L1J1blRpbWVFdmVudCc7XHJcbmltcG9ydCB7IElDbGllbnRDb21tYW5kIH0gZnJvbSAnLi4vY29tbWFuZHMvSUNsaWVudENvbW1hbmQnO1xyXG5pbXBvcnQgeyBDb21tYW5kRmFjdG9yeSB9IGZyb20gJy4uL2NvbW1hbmRzL0NsaWVudFRvU2VydmVyL0NvbW1hbmRGYWN0b3J5JztcclxuaW1wb3J0IHsgRGF0YXZpZXdIZWFkZXJzIH0gZnJvbSAnLi4vcnQvRGF0YXZpZXdIZWFkZXJzJztcclxuaW1wb3J0IHsgVHJhbnNhY3Rpb24gfSBmcm9tICcuLi9ydC9UcmFuc2FjdGlvbic7XHJcbmltcG9ydCB7IFRhc2tzVGFibGUgfSBmcm9tICcuL1Rhc2tzVGFibGUnO1xyXG5pbXBvcnQgeyBJQ2xpZW50VGFyZ2V0ZWRDb21tYW5kIH0gZnJvbSAnLi4vY29tbWFuZHMvSUNsaWVudFRhcmdldGVkQ29tbWFuZCc7XHJcbmltcG9ydCB7IEhhbmRsZXJzVGFibGUgfSBmcm9tICcuLi9ydC9IYW5kbGVyc1RhYmxlJztcclxuaW1wb3J0IHsgUmVjb21wdXRlVGFibGUgfSBmcm9tICcuLi9ydC9SZWNvbXB1dGVUYWJsZSc7XHJcbmltcG9ydCB7IEV4cFRhYmxlIH0gZnJvbSAnLi4vZXhwL0V4cFRhYmxlJztcclxuaW1wb3J0IHsgVXNlckV2ZW50c1RhYmxlIH0gZnJvbSAnLi4vZXZlbnQvVXNlckV2ZW50c1RhYmxlJztcclxuaW1wb3J0IHsgRm9ybXNUYWJsZSB9IGZyb20gJy4uL2d1aS9Gb3Jtc1RhYmxlJztcclxuaW1wb3J0IHsgRmxvd01vbml0b3JRdWV1ZSB9IGZyb20gJy4uL3V0aWwvRmxvd01vbml0b3JRdWV1ZSc7XHJcbmltcG9ydCB7IEZpZWxkIH0gZnJvbSAnLi4vZGF0YS9GaWVsZCc7XHJcbmltcG9ydCB7IEFjdGlvbk1hbmFnZXIgfSBmcm9tICcuLi9ldmVudC9BY3Rpb25NYW5hZ2VyJztcclxuaW1wb3J0IHsgQ29uc3RJbnRlcmZhY2UgfSBmcm9tICcuLi9Db25zdEludGVyZmFjZSc7XHJcbmltcG9ydCB7IEV2ZW50SGFuZGxlciB9IGZyb20gJy4uL2V2ZW50L0V2ZW50SGFuZGxlcic7XHJcbmltcG9ydCB7IEV4cHJlc3Npb24gfSBmcm9tICcuLi9leHAvRXhwcmVzc2lvbic7XHJcbmltcG9ydCB7IEZpZWxkc1RhYmxlRXh0IGFzIEZpZWxkc1RhYmxlIH0gZnJvbSAnLi4vZGF0YS9GaWVsZHNUYWJsZSc7XHJcbmltcG9ydCB7IEdVSU1hbmFnZXIgfSBmcm9tICcuLi9HVUlNYW5hZ2VyJztcclxuaW1wb3J0IHsgQ29tbWFuZHNQcm9jZXNzb3JNYW5hZ2VyIH0gZnJvbSAnLi4vQ29tbWFuZHNQcm9jZXNzb3JNYW5hZ2VyJztcclxuaW1wb3J0IHsgUmVjb3JkIH0gZnJvbSAnLi4vZGF0YS9SZWNvcmQnO1xyXG5pbXBvcnQgeyBFdmVudFN1YlR5cGUgfSBmcm9tICcuLi9lbnVtcyc7XHJcbmltcG9ydCB7IE9wZW5pbmdUYXNrRGV0YWlscywgVGFza19TdWJmb3JtRXhlY01vZGVFbnVtLCBUYXNrQmFzZSwgVXNlclJhbmdlIH0gZnJvbSAnLi9UYXNrQmFzZSc7XHJcbmltcG9ydCB7IExhbmd1YWdlRGF0YSB9IGZyb20gJy4uL2Vudi9MYW5ndWFnZURhdGEnO1xyXG5pbXBvcnQgeyBFbnZpcm9ubWVudCB9IGZyb20gJy4uL2Vudi9FbnZpcm9ubWVudCc7XHJcbmltcG9ydCB7IExhc3RGb2N1c2VkTWFuYWdlciB9IGZyb20gJy4uL3J0L0xhc3RGb2N1c2VkTWFuYWdlcic7XHJcbmltcG9ydCB7IEdsb2JhbENvbW1hbmRzTWFuYWdlciB9IGZyb20gJy4uL0dsb2JhbENvbW1hbmRzTWFuYWdlcic7XHJcbmltcG9ydCB7IEV2ZW50c0FsbG93ZWRUeXBlIH0gZnJvbSAnLi4vZXZlbnQvSUV2ZW50c01hbmFnZXInO1xyXG5pbXBvcnQgeyBDcmVhdGVkRm9ybVZlY3RvciB9IGZyb20gJy4uL2d1aS9DcmVhdGVkRm9ybVZlY3Rvcic7XHJcbmltcG9ydCB7IEFjY2Vzc0hlbHBlciB9IGZyb20gJy4uL0FjY2Vzc0hlbHBlcic7XHJcbmltcG9ydCB7IElNR0RhdGFDb2xsZWN0aW9uIH0gZnJvbSAnLi9JTUdEYXRhQ29sbGVjdGlvbic7XHJcbmltcG9ydCB7IGlzTnVsbE9yVW5kZWZpbmVkIH0gZnJvbSAndXRpbCc7XHJcbmltcG9ydCB7IE1HRGF0YUNvbGxlY3Rpb24gfSBmcm9tICcuL01HRGF0YUNvbGxlY3Rpb24nO1xyXG5pbXBvcnQgeyBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvcn0gZnJvbSBcIi4uL3JlbW90ZS9SZW1vdGVDb21tYW5kc1Byb2Nlc3NvclwiO1xyXG5pbXBvcnQgeyBFdmVudEhhbmRsZXJQb3NpdGlvbn0gZnJvbSAnLi4vZXZlbnQvRXZlbnRIYW5kbGVyUG9zaXRpb24nO1xyXG5cclxuZXhwb3J0IGVudW0gVGFza19GbG93IHtcclxuICBOT05FLFxyXG4gIFNURVAsXHJcbiAgRkFTVFxyXG59XHJcblxyXG5leHBvcnQgZW51bSBUYXNrX0RpcmVjdGlvbiB7XHJcbiAgQkFDSyA9IC0xLFxyXG4gIE5PTkUsXHJcbiAgRk9SRVxyXG59XHJcblxyXG5lbnVtIEZsb3dNb2RlRGlyIHtcclxuICBOT05FID0gJyAnLFxyXG4gIEZBU1RfQkFDS1dBUkQgPSAnUicsXHJcbiAgRkFTVF9GT1JXQVJEID0gJ0YnLFxyXG4gIFNURVBfQkFDS1dBUkQgPSAnUCcsXHJcbiAgU1RFUF9GT1JXQVJEID0gJ04nXHJcbn1cclxuXHJcbi8vIEBkeW5hbWljXHJcbmV4cG9ydCBjbGFzcyBUYXNrIGV4dGVuZHMgVGFza0Jhc2Uge1xyXG4gIHByaXZhdGUgX2R2Q2FjaGU6IER2Q2FjaGUgPSBudWxsO1xyXG4gIHByaXZhdGUgX21nRGF0YTogTUdEYXRhID0gbnVsbDtcclxuICBwcml2YXRlIF9hYm9ydGluZzogYm9vbGVhbiA9IGZhbHNlOyAgICAgICAgICAgICAgICAgICAvLyB0cnVlIGlmIGFuIGFib3J0IGNvbW1hbmQgd2FzIGV4ZWN1dGVkIGZvciB0aGlzIHRhc2sgb3Igb25lIG9mIGl0cyBhbmNlc3RvcnNcclxuICBwcml2YXRlIF9iRXhlY0VuZFRhc2s6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9pc1N0YXJ0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9ldmFsT2xkVmFsdWVzOiBib29sZWFuID0gZmFsc2U7ICAgICAgICAgICAgICAvLyBpbmRpY2F0ZXMgZm9yIHRoZSBnZXQgdmFsdWUgdG8gZ2V0IHRoZSBvbGQgdmFsdWUgb2YgdGhlIGZpZWxkXHJcbiAgcHJpdmF0ZSBfaW5SZWNvcmRTdWZmaXg6IGJvb2xlYW4gPSBmYWxzZTsgICAgICAgICAgICAgLy8gaW5kaWNhdGUgd2UgYXJlIGluIHJlY29yZCBzdWZmaXggKGhhbmRsZSBiZWZvcmUpXHJcbiAgcHJpdmF0ZSBfY2FuY2VsV2FzUmFpc2VkOiBib29sZWFuID0gZmFsc2U7ICAgICAgICAgICAgLy8gd2FzIGNhbmNlbC9xdWl0IGV2ZW50IHJhaXNlZCA/XHJcbiAgcHJpdmF0ZSBfY291bnRlcjogbnVtYmVyID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5jcmVhc2VzIG9ubHkgaW4gbm9uIGludGVydmFsIHRhc2tzLlxyXG4gIHByaXZhdGUgX2N1cnJTdGFydFByb2dMZXZlbDogbnVtYmVyID0gMDsgICAgICAgICAgICAgIC8vIHRoZSBsZXZlbCBvZiBzdGFydFByb2cgcmVxdWVzdCBpbiB3aGljaCB3ZSB0YXNrIGlzIHN0YXJ0ZWRcclxuICBwcml2YXRlIF9kZXN0aW5hdGlvblN1YmZvcm06IGJvb2xlYW4gPSBmYWxzZTsgICAgICAgICAvLyBpZiBUUlVFLCB0aGUgdGFzayBpcyBhIERlc3RpbmF0aW9uIFN1YmZvcm0gdGFza1xyXG4gIHByaXZhdGUgX2VuYWJsZVpvb21IYW5kbGVyOiBib29sZWFuID0gZmFsc2U7ICAgICAgICAgIC8vIGlmIFRSVUUsIHRoZXJlIGlzIGEgem9vbSBoYW5kbGVyIGZvciB0aGlzIGZpZWxkXHJcbiAgcHJpdmF0ZSBfZmlyc3RSZWNvcmRDeWNsZTogYm9vbGVhbiA9IGZhbHNlOyAgICAgICAgICAgLy8gaW5kaWNhdGVzIHdoZXRoZXIgd2UgYXJlIGluIHRoZSBmaXJzdCByZWNvcmQgY3ljbGVcclxuICBwcml2YXRlIF9vcmlnaW5hbFRhc2tNb2RlOiBzdHJpbmcgPSAnICc7XHJcbiAgcHJpdmF0ZSBfaW5DcmVhdGVMaW5lOiBib29sZWFuID0gZmFsc2U7ICAgICAgICAgICAgICAgLy8gaXMgdGhlIHRhc2sgaW50byBwcm9jZXNzaW5nIENSRUFURSBMSU5FXHJcbiAgcHVibGljIEluU2VsZWN0OiBib29sZWFuID0gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRydWUgd2hlbiB0aGUgdGFzayBpcyBleGVjdXRpbmcgYSBTRUxFQ1QgaW50ZXJuYWwgZXZlbnRcclxuICBwdWJsaWMgSW5TdGFydFByb2Nlc3M6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9pc0Rlc3RpbmF0aW9uQ2FsbDogYm9vbGVhbiA9IGZhbHNlOyAgICAgICAgICAvLyBpZiBUUlVFLCB0aGUgdGFzayBpcyBhIERlc3RpbmF0aW9uIFN1YmZvcm0gdGFzayBieSBjYWxsIG9wZXJhdGlvblxyXG4gIHByaXZhdGUgX2tub3duVG9TZXJ2ZXI6IGJvb2xlYW4gPSB0cnVlOyAgICAgICAgICAgICAgIC8vIEZhbHNlIGlmIHRoZSBzZXJ2ZXIgaGFzXHJcbiAgcHJpdmF0ZSBfbG9vcFN0YWNrOiBTdGFjazxudW1iZXI+ID0gbnVsbDtcclxuICBwcml2YXRlIGFsbG93UmVtb3RlQ21kRXhlY3V0aW9uOiBib29sZWFuO1xyXG4gIHB1YmxpYyBEZWxheUNvbW1hbmRFeGVjdXRpb246IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLy8vPHN1bW1hcnk+XHJcbiAgLy8vIFRoaXMgaXMgdGhlIHRhc2sgd2hpY2ggaW52b2tlZCB0aGUgaGFuZGxlciBjb250YWluaW5nIHRoZSBDYWxsIG9wZXJhdGlvbi5cclxuICAvLy8gVGhpcyBtZW1iZXIgaXMgdXNlZCBmb3Igc2VhcmNoaW5nIHRoZSB2YXJpYWJsZXMgbGlrZSBWYXJJbmRleCgpLCBldGNcclxuICAvLy88L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBfcGFyZW50VGFzazogVGFzayA9IG51bGw7XHJcblxyXG4gIHB1YmxpYyBnZXQgUGFyZW50VGFzaygpOiBUYXNrQmFzZSB7XHJcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50VGFzaztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBDb250ZXh0VGFzazogVGFzayA9IG51bGw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bmRlciBjb250ZXh0IG9mIHdoaWNoIHRhc2sgdGhpcyB0YXNrIGlzIGN1cnJlbnRseSBydW5uaW5nXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBUaGlzIGlzIHNhbWUgYXMgX3BhcmVudFRhc2sgZXhjZXB0IGZvciBNb2RhbCB0YXNrcy4gSW4gY2FzZSwgdGhlIGN1cnJlbnQgdGFzayBpcyBtb2RhbCwgX3RyaWdnZXJpbmdUYXNrIHJlZmVycyB0b1xyXG4gIC8vLyAgdGhlIHRhc2sgd2hpY2ggaW52b2tlZCB0aGUgaGFuZGxlciBvZiB0aGUgX3BhcmVudFRhc2suIFRoaXMgbWVtYmVyIGlzIHVzZWQgZm9yIGFsbCBnZW5lcmF0aW9uLWJhc2VkIGZ1bmN0aW9ucyBhbmQgUHJvZygpLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBfdHJpZ2dlcmluZ1Rhc2s6IFRhc2sgPSBudWxsOyAgICAgICAgICAgICAgICAgLy8gcmVmZXJlbmNlIHRvIHRoZSB0YXNrIHRoYXQgdHJpZ2dlcmVkIHRoZSBoYW5kbGVyIHdoaWNoIGNyZWF0ZWQgbWVcclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgVGhpcyBpcyB0aGUgdGFzayB3aGljaCBjb250YWluZWQgdGhlIENhbGwgb3BlcmF0aW9uLiBJZiB0aGUgdGFzayB3YXMgZXhlY3V0ZWQgd2l0aG91dCBjYWxsXHJcbiAgLy8vICAgb3BlcmF0aW9uIGVnLiB0aGUgTVAsIHRoZSBzdGFydHVwIHByb2dyYW0sIGV0Yy4sIGl0IHJlZmVycyB0byBpdHNlbGYuIFRoaXMgbWVtYmVyIHVzZWQgdG8gc2VhcmNoIGZvciB0aGUgZXZlbnQgaGFuZGxlcnNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHB1YmxpYyBQYXRoUGFyZW50VGFzazogVGFzayA9IG51bGw7XHJcblxyXG4gIHByaXZhdGUgX3ByZXZlbnRDb250cm9sQ2hhbmdlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfcHJldmVudFJlY29yZFN1ZmZpeDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX3Rhc2tQYXRoOiBMaXN0PFRhc2s+ID0gbnVsbDtcclxuXHJcbiAgLy8gcmV0dXJucyB0cnVlIGlmIHRoZSB0YXNrIGlzIGN1cnJlbnRseSB0cnlpbmcgdG8gY29tbWl0IGEgZHluYW1pY0RlZi50cmFuc2FjdGlvblxyXG4gIHByaXZhdGUgX3RyeWluZ1RvQ29tbWl0OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHNldCBUcnlpbmdUb0NvbW1pdCh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fdHJ5aW5nVG9Db21taXQgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIGdldCBUcnlpbmdUb0NvbW1pdCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl90cnlpbmdUb0NvbW1pdDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3VzZUxvb3BTdGFjazogYm9vbGVhbiA9IGZhbHNlOyAgICAgICAgICAgICAgIC8vIGluZGljYXRlcyB3aGV0aGVyIHRoZSBleHByZXNzaW9uIChMT09QQ09VTlRFUigpKSBpcyBpbiB0aGUgc2NvcGUgb2YgQmxvY2sgTG9vcC5cclxuICBwcml2YXRlIF9pblByb2Nlc3NpbmdUb3BNb3N0RW5kVGFza1NhdmVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHB1YmxpYyBJbkhhbmRsZUFjdENhbmNlbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBSdW50aW1lU29ydHM6IFNvcnRDb2xsZWN0aW9uID0gbnVsbDtcclxuICBwdWJsaWMgVmV3Rmlyc3Q6IG51bWJlciA9IDA7XHJcbiAgcHVibGljIGRhdGFWaWV3Q29udGVudDogc3RyaW5nID0gbnVsbDsgICAgICAgICAgICAgICAgLy8gZGF0YVZpZXdDb250ZW50IHJldHJpZXZlZCBieSBHZXREYXRhVmlld0NvbnRlbnQgY29tbWFuZC5cclxuICBwdWJsaWMgUGVyZm9ybVBhcmVudFJlY29yZFByZWZpeDogYm9vbGVhbiA9IGZhbHNlOyAgICAvLyBJbiByZWNvcmQgcHJlZml4IChjb21tb25IYW5kbGVyQmVmb3JlKSB3ZSBleGVjdXRlIHJlY29yZCBwcmVmaXggb2YgYWxsIGZhdGhlcnMuXHJcblxyXG4gIC8vIEJ1dCB3ZSBkbyBub3QgbmVlZCBpdCBpbiBhbGwgY2FzZXMuXHJcbiAgLy8gV2hlbiB3ZSByZXR1cm4gZnJvbSB0aGUgc2VydmVyIHdlIGRvIG5vdCBuZWVkIGl0LlxyXG4gIC8vIFdoZW4gd2UgY2xpY2sgb24gdGhlIG5lc3RlZCBzdWJmb3JtIHdlIG5lZWQgaXQuXHJcbiAgLy8gaWYgdHJ1ZSwgZG8gdGhlIHBhcmVudCBzdWJmb3JtIHJlY29yZCBwcmVmaXhcclxuXHJcbiAgLy8gLTEg4oCTIFRoZSB0YXNrIGlzIG5vdCBleGVjdXRlZCBhcyBhIHN1YmZvcm1cclxuICAvLyAgMCDigJMgVGhlIHRhc2sgaXMgZXhlY3V0ZWQgYnkgc2V0dGluZyB0aGUgZm9jdXMgb24gaXRcclxuICAvLyAgMSDigJMgVGhlIHN1YnRhc2sgaXMgZXhlY3V0ZWQgZm9yIHRoZSBmaXJzdCB0aW1lXHJcbiAgLy8gIDIg4oCTIFRoZSB0YXNrIGlzIGV4ZWN1dGVkIGJlY2F1c2UgdGhlIEF1dG9tYXRpYyBSZWZyZXNoIHByb3BlcnR5XHJcbiAgLy8gICAgICBvciB0aGUgU3ViZm9ybSBSZWZyZXNoIGV2ZW50IGhhcyBiZWVuIHRyaWdnZXJlZFxyXG4gIHB1YmxpYyBNb2RlQXNQYXJlbnQ6IGJvb2xlYW4gPSBmYWxzZTsgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSB0YXNrIG1vZGUgaXMgJ0FzIFBhcmVudCcgd2UgbmVlZCB0byBjYXJlIG91dCBpdCBzcGVjaWZpY2FsbHlcclxuICBwdWJsaWMgVGFza1RyYW5zYWN0aW9uTWFuYWdlcjogVGFza1RyYW5zYWN0aW9uTWFuYWdlciA9IG51bGw7XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEluZGljYXRlcyB0aGF0IHRoZSBzdWJmb3JtIG11c3QgYmUgcmVmcmVzaGVkIG9uIHRoZSBjbGllbnQuXHJcbiAgLy8vIFJlbGV2YW50IG9ubHkgZm9yIG5vbi1vZmZsaW5lIHdpdGggbG9jYWwgZGF0YS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHB1YmxpYyBFeGVjdXRlQ2xpZW50U3ViZm9ybVJlZnJlc2g6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBJbmRpY2F0ZXMgdGhhdCB0aGUgdGFzayBleGVjdXRlcyBDb21tb25IYW5kbGVyQmVmb3JlIG1ldGhvZC5cclxuICAvLy8gRm9yIHN1YmZvcm1zIHdlIGRvIG5vdCBleGVjdXRlIGl0J3MgUlAgaWYgdGhlIHBhcmVudCBkaWRuJ3QgZmluaXNoZWQgeWV0XHJcbiAgLy8vIGl0J3MgQ29tbWFuZEhhbmRsZXJCZWZvcmUgbWV0aG9kLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHVibGljIEluQ29tbW9uSGFuZGxlckJlZm9yZVJQOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gcmV0cmlldmUgYW5kIHJldHVybiBhIHNlcnZpY2Ugb2JqZWN0IGNvbnRhaW5pbmcgZnVuY3Rpb25hbGl0eSB0aGF0IGlzIGRpZmZlcmVudCBpbiB0aGUgdGFzayBsZXZlbCBiZXR3ZWVuIGNvbm5lY3RlZCBhbmQgb2ZmbGluZSBzdGF0ZXMuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIF90YXNrU2VydmljZTogVGFza1NlcnZpY2VCYXNlID0gbnVsbDtcclxuXHJcbiAgZ2V0IFRhc2tTZXJ2aWNlKCk6IFRhc2tTZXJ2aWNlQmFzZSB7XHJcbiAgICBpZiAodGhpcy5fdGFza1NlcnZpY2UgPT0gbnVsbClcclxuICAgICAgdGhpcy5fdGFza1NlcnZpY2UgPSBuZXcgUmVtb3RlVGFza1NlcnZpY2UoKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5fdGFza1NlcnZpY2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHJldHJpZXZlIGFuZCByZXR1cm4gYSBjb21tYW5kcyBwcm9jZXNzb3IgZGVwZW5kaW5nIG9uIHRhc2sgdHlwZSBhbmQgc3RhdGUuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzdGF0aWMgZ2V0IENvbW1hbmRzUHJvY2Vzc29yKCk6IENvbW1hbmRzUHJvY2Vzc29yQmFzZSB7XHJcbiAgICByZXR1cm4gQ29tbWFuZHNQcm9jZXNzb3JNYW5hZ2VyLkdldENvbW1hbmRzUHJvY2Vzc29yKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhc0xvY2F0ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgdGFza0RlZmluaXRpb25JZDogVGFza0RlZmluaXRpb25JZCA9IG51bGw7XHJcbiAgcHVibGljIEFyZ3VtZW50c0xpc3Q6IEFyZ3VtZW50c0xpc3QgPSBudWxsOyAgICAgICAgICAgLy8gb2ZmLWxpbmUgZXhlY3V0aW9uIC0gdGFzayBhcmd1bWVudCwgdG8gZW5hYmxlIHRoZSB1cGRhdGUgb2YgZmllbGQgdmFsdWVzXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gcGFyZW50IHRhc2sgb2YgdGhlIHN1YnRhc2sgYnkgdG9vbGtpdCB0cmVlIGluY2x1ZGUgdGhlIG1haW4gcHJvZ3JhbS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldCBMb2dpY2FsU3R1ZGlvUGFyZW50VGFzaygpOiBUYXNrIHtcclxuICAgIGlmICh0aGlzLlN0dWRpb1BhcmVudFRhc2sgPT09IG51bGwgJiYgIXN1cGVyLmlzTWFpblByb2coKSkge1xyXG4gICAgICByZXR1cm4gPFRhc2s+R3VpRGF0YUNvbGxlY3Rpb24uTUdEYXRhVGFibGUuR2V0TWFpblByb2dCeUN0bElkeCh0aGlzLkNvbnRleHRJRCwgdGhpcy5fY3RsSWR4KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gPFRhc2s+dGhpcy5TdHVkaW9QYXJlbnRUYXNrO1xyXG4gIH1cclxuXHJcbiAgZ2V0IEtub3duVG9TZXJ2ZXIoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fa25vd25Ub1NlcnZlcjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBDb25maXJtVXBkYXRlTm86IGJvb2xlYW4gPSBmYWxzZTsgICAgICAgICAgICAgICAgICAvLyBvbmx5IGZvciBjb25maXJtcyB1cGRhdGVcclxuICBwdWJsaWMgRGF0YVN5bmNlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBVbmlxdWVTb3J0OiBVbmlxdWVUc2tTb3J0ID0gbnVsbDtcclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gdGhlIHRyYW5zYWN0aW9uIG5lZWQgdG8gYmUgb24gdGhlIGRhdGEgdmlldyBtYW5hZ2VyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXQgVHJhbnNhY3Rpb24odmFsdWU6IFRyYW5zYWN0aW9uKSB7XHJcbiAgICB0aGlzLkRhdGF2aWV3TWFuYWdlci5DdXJyZW50RGF0YXZpZXdNYW5hZ2VyLlRyYW5zYWN0aW9uID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBnZXQgVHJhbnNhY3Rpb24oKTogVHJhbnNhY3Rpb24ge1xyXG4gICAgcmV0dXJuIHRoaXMuRGF0YXZpZXdNYW5hZ2VyLkN1cnJlbnREYXRhdmlld01hbmFnZXIuVHJhbnNhY3Rpb247XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgUmVmcmVzaE9uVmFyczogbnVtYmVyW10gPSBudWxsO1xyXG4gIHB1YmxpYyBEdlBvc0Rlc2NyaXB0b3I6IExpc3Q8c3RyaW5nW10+ID0gbnVsbDtcclxuICBwdWJsaWMgU3ViVGFza3M6IFRhc2tzVGFibGUgPSBudWxsO1xyXG4gIHB1YmxpYyBFeHBUYWI6IEV4cFRhYmxlID0gbnVsbDtcclxuICBwdWJsaWMgVXNlckV2dFRhYjogVXNlckV2ZW50c1RhYmxlID0gbnVsbDtcclxuICBwdWJsaWMgRGF0YXZpZXdIZWFkZXJzVGFibGU6IERhdGF2aWV3SGVhZGVycyA9IG51bGw7XHJcbiAgcHVibGljIEhhbmRsZXJzVGFiOiBIYW5kbGVyc1RhYmxlID0gbnVsbDtcclxuICBwdWJsaWMgX2Zvcm1zOiBGb3Jtc1RhYmxlID0gbnVsbDtcclxuICBwdWJsaWMgTmFtZTogc3RyaW5nID0gbnVsbDtcclxuICBwdWJsaWMgUHVibGljTmFtZTogc3RyaW5nID0gbnVsbDtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBpbmRpY2F0ZXMgd2hldGhlciB0aGUgdGFzayBzdWZmaXggd2FzIHBlcmZvcm1lZCBmb3IgdGhpcyB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwdWJsaWMgVGFza1N1ZmZpeEV4ZWN1dGVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIGdldCBUYXNrRGVmaW5pdGlvbklkKCk6IFRhc2tEZWZpbml0aW9uSWQge1xyXG4gICAgaWYgKHRoaXMudGFza0RlZmluaXRpb25JZCA9PT0gbnVsbCkge1xyXG4gICAgICB0aGlzLnRhc2tEZWZpbml0aW9uSWQgPSBuZXcgVGFza0RlZmluaXRpb25JZCh0aGlzLl9jdGxJZHgsIHRoaXMuUHJvZ3JhbUlzbiwgdGhpcy5UYXNrSXNuLCB0aGlzLl9pc1ByZyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy50YXNrRGVmaW5pdGlvbklkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIFJldHJ1blZhbHVlRXhwOiBudW1iZXIgPSAwO1xyXG4gIHB1YmxpYyBTdWJmb3JtQ29udHJvbDogTWdDb250cm9sID0gbnVsbDtcclxuXHJcbiAgc3RhdGljIFN0YXJ0UHJvZ0xldmVsOiBudW1iZXIgPSAwOyAgLy8gcmVjdXJzaXZlIGxldmVsIG9mIFwic3RhcnRQcm9nXCIgaW52b2NhdGlvbnNcclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgX2lkbGVUaW1lclN0YXJ0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgc3RhdGljIGdldCBJc0Jsb2NraW5nQmF0Y2goKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIENUT1JcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGNvbnN0cnVjdG9yKCk7XHJcbiAgY29uc3RydWN0b3IocGFyZW50OiBUYXNrKTtcclxuICBjb25zdHJ1Y3RvcihwYXJlbnQ/OiBUYXNrKSB7XHJcbiAgICBzdXBlcigpO1xyXG5cclxuICAgIGlmIChpc051bGxPclVuZGVmaW5lZChwYXJlbnQpKSB7XHJcbiAgICAgIHRoaXMuY29uc3RydWN0b3JfMCgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmNvbnN0cnVjdG9yXzEocGFyZW50KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29uc3RydWN0b3JfMCgpOiB2b2lkIHtcclxuICAgIHRoaXMuQWN0aW9uTWFuYWdlciA9IG5ldyBBY3Rpb25NYW5hZ2VyKHRoaXMpO1xyXG4gICAgdGhpcy5EYXRhVmlldyA9IG5ldyBEYXRhVmlldyh0aGlzKTtcclxuICAgIHRoaXMuX2Zsb3dNb25pdG9yID0gRmxvd01vbml0b3JRdWV1ZS5JbnN0YW5jZTtcclxuICAgIHRoaXMuQ29udGV4dFRhc2sgPSB0aGlzO1xyXG4gICAgdGhpcy5fZHZDYWNoZSA9IG5ldyBEdkNhY2hlKHRoaXMpO1xyXG4gICAgdGhpcy5QZXJmb3JtUGFyZW50UmVjb3JkUHJlZml4ID0gdHJ1ZTtcclxuICAgIHRoaXMuRGF0YXZpZXdNYW5hZ2VyID0gbmV3IERhdGF2aWV3TWFuYWdlcih0aGlzKTtcclxuICAgIHRoaXMuYWxsb3dSZW1vdGVDbWRFeGVjdXRpb24gPSB0cnVlO1xyXG4gICAgdGhpcy5UYXNrVHJhbnNhY3Rpb25NYW5hZ2VyID0gbmV3IFRhc2tUcmFuc2FjdGlvbk1hbmFnZXIodGhpcyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuRGF0YVZpZXcuSW5pdCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcl8xKHBhcmVudDogVGFzayk6IHZvaWQge1xyXG4gICAgdGhpcy5jb25zdHJ1Y3Rvcl8wKCk7XHJcbiAgICB0aGlzLlBhdGhQYXJlbnRUYXNrID0gcGFyZW50O1xyXG4gICAgdGhpcy5fcGFyZW50VGFzayA9IHBhcmVudDtcclxuICAgIHRoaXMuX3RyaWdnZXJpbmdUYXNrID0gbnVsbDtcclxuICAgIHRoaXMuYnVpbGRUYXNrUGF0aCgpO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIENyZWF0ZVRhc2soKTogVGFza0Jhc2Uge1xyXG4gICAgbGV0IHRhc2sgPSAgbmV3IFRhc2soKTtcclxuICAgIHRhc2suSW5pdCgpO1xyXG4gICAgcmV0dXJuIHRhc2s7XHJcbiAgfVxyXG5cclxuICAvLyBJVGFzayBNZW1iZXJzXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHRlbGxzIHdoZXRoZXIgdGhlIHRhc2sgaXMgYWJvcnRpbmdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGlzQWJvcnRpbmcoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fYWJvcnRpbmc7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJ1aWxkVGFza1BhdGgoKTogdm9pZCB7XHJcbiAgICB0aGlzLl90YXNrUGF0aCA9IG5ldyBMaXN0PFRhc2s+KCk7XHJcbiAgICBpZiAodGhpcy5fcGFyZW50VGFzay5fdGFza1BhdGggIT09IG51bGwpXHJcbiAgICAgIHRoaXMuX3Rhc2tQYXRoLkFkZFJhbmdlKHRoaXMuX3BhcmVudFRhc2suX3Rhc2tQYXRoLkdldEVudW1lcmF0b3IoKSk7XHJcbiAgICB0aGlzLl90YXNrUGF0aC5wdXNoKHRoaXMpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgdGFzayBkYXRhIGJ5IHBhcnNpbmcgdGhlIHhtbCBzdHJpbmdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibWdkXCI+cmVmZXJlbmNlIHRvIE1HRGF0YTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwib3BlbmluZ1Rhc2tEZXRhaWxzXCI+YWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvZiBvcGVuaW5nIHRhc2s8L3BhcmFtPlxyXG4gIGFzeW5jIGZpbGxEYXRhKG1nZDogTUdEYXRhLCBvcGVuaW5nVGFza0RldGFpbHM6IE9wZW5pbmdUYXNrRGV0YWlscyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgLy8gSWYgdGhpcyB0YXNrIHdhcyBvcGVuZWQgYnkgYW4gXCJvcGVuIHdpbmRvd1wiIGNvbW1hbmQgLSBjb25uZWN0IGhpbSB0byBpdHMgcGFyZW50XHJcbiAgICBpZiAoIXN1cGVyLmlzTWFpblByb2coKSkge1xyXG4gICAgICBpZiAodGhpcy5fcGFyZW50VGFzayA9PT0gbnVsbCAmJiBvcGVuaW5nVGFza0RldGFpbHMuQ2FsbGluZ1Rhc2sgIT09IG51bGwpIHtcclxuICAgICAgICB0aGlzLl9wYXJlbnRUYXNrID0gPFRhc2s+b3BlbmluZ1Rhc2tEZXRhaWxzLkNhbGxpbmdUYXNrO1xyXG4gICAgICAgIHRoaXMuYnVpbGRUYXNrUGF0aCgpO1xyXG4gICAgICAgICg8VGFzaz5vcGVuaW5nVGFza0RldGFpbHMuQ2FsbGluZ1Rhc2spLmFkZFN1YlRhc2sodGhpcyk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMuUGF0aFBhcmVudFRhc2sgPT09IG51bGwgJiYgb3BlbmluZ1Rhc2tEZXRhaWxzLlBhdGhQYXJlbnRUYXNrICE9PSBudWxsKSB7XHJcbiAgICAgICAgdGhpcy5QYXRoUGFyZW50VGFzayA9IDxUYXNrPm9wZW5pbmdUYXNrRGV0YWlscy5QYXRoUGFyZW50VGFzaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gZm9yIE1HX0FDVF9aT09NIGFjdGlvbiBlbmFibGVcclxuICAgIGlmICh0aGlzLl9wYXJlbnRUYXNrICE9PSBudWxsICYmIHRoaXMuX3BhcmVudFRhc2suZ2V0RW5hYmxlWm9vbUhhbmRsZXIoKSkge1xyXG4gICAgICB0aGlzLnNldEVuYWJsZVpvb21IYW5kbGVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fbWdEYXRhID0gbWdkO1xyXG4gICAgdGhpcy5maWxsQXR0cmlidXRlcygpO1xyXG5cclxuICAgIHRoaXMuX21nRGF0YS5hZGRUYXNrKHRoaXMpO1xyXG5cclxuICAgIGxldCBwYXJlbnRGb3JtOiBNZ0Zvcm1CYXNlID0gKHRoaXMuX3BhcmVudFRhc2sgIT09IG51bGwpID8gdGhpcy5fcGFyZW50VGFzay5nZXRGb3JtKCkgOiBudWxsO1xyXG5cclxuICAgIHdoaWxlIChhd2FpdCB0aGlzLmluaXRJbm5lck9iamVjdHMoUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLlBhcnNlci5nZXROZXh0VGFnKCksIHBhcmVudEZvcm0pKSB7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5UYXNrVHJhbnNhY3Rpb25NYW5hZ2VyLlByZXBhcmVUcmFuc2FjdGlvblByb3BlcnRpZXModGhpcy5EYXRhdmlld01hbmFnZXIuUmVtb3RlRGF0YXZpZXdNYW5hZ2VyLlRyYW5zYWN0aW9uLCBmYWxzZSk7XHJcblxyXG4gICAgdGhpcy5IYW5kbGVUcmlnZ2VyVGFzaygpO1xyXG4gICAgdGhpcy5IYW5kbGVQcmV2aW91c2x5QWN0aXZlVGFza0lkKCk7XHJcblxyXG4gICAgLy8gU2V0IGlzU3ViZm9ybSBmbGFnXHJcbiAgICB0aGlzLkNoZWNrQW5kU2V0U3ViRm9ybSgpO1xyXG5cclxuICAgIGlmICh0aGlzLklzU3ViRm9ybSkge1xyXG4gICAgICAvLyBnZXQgdGhlIHN1YmZvcm0gY29udHJvbCBmcm9tIHRoZSBwYXJlbnQgdGFza1xyXG4gICAgICBsZXQgc3ViRm9ybUN0cmw6IE1nQ29udHJvbCA9ICg8TWdGb3JtPnRoaXMuZ2V0UGFyZW50KCkuZ2V0Rm9ybSgpKS5nZXRTdWJGb3JtQ3RybEZvclRhc2sodGhpcy5fdGFza1RhZyk7XHJcbiAgICAgIGlmIChzdWJGb3JtQ3RybCAhPT0gbnVsbCkge1xyXG4gICAgICAgIHN1YkZvcm1DdHJsLnNldFN1YmZvcm1UYXNrSWQodGhpcy5fdGFza1RhZyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIHVwZGF0ZSB0aGUgZm9ybSB3aXRoIHRoZSBzdWJmb3JtIGNvbnRyb2wgZnJvbSB0aGUgcGFyZW50IHRhc2tcclxuICAgICAgaWYgKHRoaXMuRm9ybSAhPT0gbnVsbCkge1xyXG4gICAgICAgICg8TWdGb3JtPnRoaXMuRm9ybSkuc2V0U3ViRm9ybUN0cmwoc3ViRm9ybUN0cmwpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gaGFuZGxlIHRoZSBQcmV2aW91c2x5QWN0aXZlVGFza0lkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBIYW5kbGVQcmV2aW91c2x5QWN0aXZlVGFza0lkKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3BhcmVudFRhc2sgIT09IG51bGwgJiYgdGhpcy5fcGFyZW50VGFzay5HZXRDb250ZXh0VGFzaygpICE9PSBudWxsICYmIHRoaXMuX21nRGF0YSAhPT0gdGhpcy5fcGFyZW50VGFzay5nZXRNR0RhdGEoKSlcclxuICAgICAgdGhpcy5QcmV2aW91c2x5QWN0aXZlVGFza0lkID0gKHRoaXMuX3BhcmVudFRhc2suR2V0Q29udGV4dFRhc2soKSkuZ2V0VGFza1RhZygpO1xyXG4gICAgZWxzZSBpZiAodGhpcy5fcGFyZW50VGFzayAhPT0gbnVsbClcclxuICAgICAgdGhpcy5QcmV2aW91c2x5QWN0aXZlVGFza0lkID0gdGhpcy5fcGFyZW50VGFzay5nZXRUYXNrVGFnKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGhhbmRsZSB0aGUgdHJpZ2dlciB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBIYW5kbGVUcmlnZ2VyVGFzaygpOiB2b2lkIHtcclxuICAgIHRoaXMuX3RyaWdnZXJpbmdUYXNrID0gdGhpcy5fcGFyZW50VGFzaztcclxuICB9XHJcblxyXG4gIEZpbGxUYXNrVGFibGVzKHRhc2tUYWJsZXNEYXRhOiBzdHJpbmcpOiB2b2lkO1xyXG4gIEZpbGxUYXNrVGFibGVzKCk6IHZvaWQ7XHJcbiAgRmlsbFRhc2tUYWJsZXModGFza1RhYmxlc0RhdGE/OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgIHRoaXMuRmlsbFRhc2tUYWJsZXNfMCh0YXNrVGFibGVzRGF0YSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuRmlsbFRhc2tUYWJsZXNfMSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBGaWxsVGFza1RhYmxlc18wKHRhc2tUYWJsZXNEYXRhOiBzdHJpbmcpOiB2b2lkIHtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIHRhc2sgYXR0cmlidXRlc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZmlsbEF0dHJpYnV0ZXMoKTogdm9pZCB7XHJcbiAgICBsZXQgcGFyc2VyOiBYbWxQYXJzZXIgPSBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuUGFyc2VyO1xyXG4gICAgbGV0IGVuZENvbnRleHQ6IG51bWJlciA9IHBhcnNlci5nZXRYTUxkYXRhKCkuaW5kZXhPZihYTUxDb25zdGFudHMuVEFHX0NMT1NFLCBwYXJzZXIuZ2V0Q3VyckluZGV4KCkpO1xyXG4gICAgaWYgKGVuZENvbnRleHQgIT09IC0xICYmIGVuZENvbnRleHQgPCBwYXJzZXIuZ2V0WE1MZGF0YSgpLmxlbmd0aCkge1xyXG4gICAgICBzdXBlci5maWxsQXR0cmlidXRlcyhwYXJzZXIpO1xyXG5cclxuICAgICAgLy8gUUNSICM3NTk5MTE6IG1wcmcgbXVzdCBiZWxvbmcgdG8gdGhlIG1haW4gYXBwbGljYXRpb24ncyBNR0RhdGEuXHJcbiAgICAgIC8vIFRoaXMgZW5zdXJlcyBpdCB3aWxsIG5vdCBiZSBkaXNjYXJkZWQgdW50aWwgdGhlIGVuZCBvZiBleGVjdXRpb24uXHJcbiAgICAgIGlmIChzdXBlci5pc01haW5Qcm9nKCkpXHJcbiAgICAgICAgdGhpcy5fbWdEYXRhID0gQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLmdldE1HRGF0YSgwKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coXCJpbiBUYXNrLmZpbGxBdHRyaWJ1dGVzKCkgb3V0IG9mIHN0cmluZyBib3VuZHNcIik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSB0YXNrIGF0dHJpYnV0ZXNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHB1YmxpYyBzZXRBdHRyaWJ1dGUoYXR0cmlidXRlOiBzdHJpbmcsIHZhbHVlU3RyOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGxldCBpc1RhZ1Byb2Nlc3NlZDogYm9vbGVhbjtcclxuICAgIGlzVGFnUHJvY2Vzc2VkID0gc3VwZXIuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZSwgdmFsdWVTdHIpO1xyXG4gICAgaWYgKCFpc1RhZ1Byb2Nlc3NlZCkge1xyXG4gICAgICBpc1RhZ1Byb2Nlc3NlZCA9IHRydWU7XHJcbiAgICAgIHN3aXRjaCAoYXR0cmlidXRlKSB7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX1JFRlJFU0hPTjpcclxuICAgICAgICAgIGlmICghKHZhbHVlU3RyLnRyaW0oKSA9PT0gXCJcIikpXHJcbiAgICAgICAgICAgIHRoaXMuU2V0UmVmcmVzaE9uVmFycyh2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX05BTUU6XHJcbiAgICAgICAgICB0aGlzLk5hbWUgPSB2YWx1ZVN0cjtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9EVlBPU19ERUM6XHJcbiAgICAgICAgICBpZiAoISh2YWx1ZVN0ci50cmltKCkgPT09IFwiXCIpKVxyXG4gICAgICAgICAgICB0aGlzLnNldERlc2NyaXB0b3IodmFsdWVTdHIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0hBU19MT0NBVEU6XHJcbiAgICAgICAgICB0aGlzLmhhc0xvY2F0ZSA9IHRydWU7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfQVNfUEFSRU5UOlxyXG4gICAgICAgICAgdGhpcy5Nb2RlQXNQYXJlbnQgPSB0cnVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX1RBU0tfVU5JUVVFX1NPUlQ6XHJcbiAgICAgICAgICB0aGlzLlVuaXF1ZVNvcnQgPSA8VW5pcXVlVHNrU29ydD52YWx1ZVN0clswXTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9UUkFOU19JRDpcclxuICAgICAgICAgIHRoaXMuc2V0UmVtb3RlVHJhbnNhY3Rpb24odmFsdWVTdHIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX1BVQkxJQzpcclxuICAgICAgICAgIHRoaXMuUHVibGljTmFtZSA9IFhtbFBhcnNlci51bmVzY2FwZSh2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX0lTX09GRkxJTkU6XHJcbiAgICAgICAgICB0aGlzLklzT2ZmbGluZSA9IFhtbFBhcnNlci5nZXRCb29sZWFuKHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfUkVUVVJOX1ZBTFVFX0VYUDpcclxuICAgICAgICAgIHRoaXMuUmV0cnVuVmFsdWVFeHAgPSBYbWxQYXJzZXIuZ2V0SW50KHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfTUVOVVNfRklMRV9OQU1FOlxyXG4gICAgICAgICAgLy8gVE9ETyAtIG5vdCB0byBzZXJpYWxpemUgW1N0b3J5IDE1NDU0N11cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICBpc1RhZ1Byb2Nlc3NlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICghaXNUYWdQcm9jZXNzZWQpXHJcbiAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nV2l0aE1zZyhOU3RyaW5nLkZvcm1hdChcIlVucmVjb2duaXplZCBhdHRyaWJ1dGU6ICd7MH0nXCIsIGF0dHJpYnV0ZSkpO1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgVG8gYWxsb2NhdGUgYW5kIGZpbGwgaW5uZXIgb2JqZWN0cyBvZiB0aGUgY2xhc3NcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZm91bmRUYWdOYW1lXCI+cG9zc2libGUgdGFnIG5hbWUgLCBuYW1lIG9mIG9iamVjdCwgd2hpY2ggbmVlZCBiZSBhbGxvY2F0ZWQ8L3BhcmFtPlxyXG4gIGFzeW5jIGluaXRJbm5lck9iamVjdHMoZm91bmRUYWdOYW1lOiBzdHJpbmcsIHBhcmVudEZvcm06IE1nRm9ybUJhc2UpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGlmIChmb3VuZFRhZ05hbWUgPT0gbnVsbClcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgbGV0IHBhcnNlcjogWG1sUGFyc2VyID0gUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLlBhcnNlcjtcclxuICAgIHN3aXRjaCAoZm91bmRUYWdOYW1lKSB7XHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX1RBR19IRUxQVEFCTEU6XHJcbiAgICAgICAgaWYgKHRoaXMuX2hlbHBUYWIgPT0gbnVsbClcclxuICAgICAgICAgIHRoaXMuX2hlbHBUYWIgPSBuZXcgSGVscHMoKTtcclxuXHJcbiAgICAgICAgaWYgKEV2ZW50cy5TaG91bGRMb2coTG9nZ2VyX0xvZ0xldmVscy5EZXZlbG9wbWVudCkpXHJcbiAgICAgICAgICBFdmVudHMuV3JpdGVEZXZUb0xvZyhOU3RyaW5nLkZvcm1hdChcInswfSAuLi5cIiwgZm91bmRUYWdOYW1lKSk7XHJcblxyXG4gICAgICAgIHRoaXMuX2hlbHBUYWIuZmlsbERhdGEocGFyc2VyKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX1RBR19EVkhFQURFUjpcclxuICAgICAgICBpZiAoRXZlbnRzLlNob3VsZExvZyhMb2dnZXJfTG9nTGV2ZWxzLkRldmVsb3BtZW50KSlcclxuICAgICAgICAgIEV2ZW50cy5Xcml0ZURldlRvTG9nKE5TdHJpbmcuRm9ybWF0KFwiezB9IC4uLlwiLCBmb3VuZFRhZ05hbWUpKTtcclxuXHJcbiAgICAgICAgdGhpcy5EYXRhVmlldy5maWxsSGVhZGVyRGF0YShwYXJzZXIpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfVEFHX1BST1A6XHJcbiAgICAgICAgdGhpcy5fcHJvcFRhYi5maWxsRGF0YSh0aGlzLCAnVCcsIHBhcnNlcik7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19UQUdfRk9STTpcclxuICAgICAgICB0aGlzLkZvcm0gPSB0aGlzLkZvcm1Jbml0RGF0YShwYXJlbnRGb3JtKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfTUVOVV9DT05URU5UOlxyXG4gICAgICAgIC8vIFRPRE8gLSBub3QgdG8gc2VyaWFsaXplIFtTdG9yeSAxNTQ1NDddXHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFwiYXNzZW1ibGllc1wiOlxyXG4gICAgICAgIGxldCBzdGFydDogbnVtYmVyID0gcGFyc2VyLmdldEN1cnJJbmRleCgpO1xyXG4gICAgICAgIGxldCBlbmRDb250ZXh0ID0gcGFyc2VyLmdldFhNTGRhdGEoKS5pbmRleE9mKCcvYXNzZW1ibGllcycsIHBhcnNlci5nZXRDdXJySW5kZXgoKSk7XHJcbiAgICAgICAgcGFyc2VyLnNldEN1cnJJbmRleChlbmRDb250ZXh0KTtcclxuICAgICAgICBwYXJzZXIuc2V0Q3VyckluZGV4MkVuZE9mVGFnKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19UQUdfRk9STVM6XHJcbiAgICAgICAgdGhpcy5fZm9ybXMgPSBuZXcgRm9ybXNUYWJsZSh0aGlzLCBwYXJlbnRGb3JtKTtcclxuICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhOU3RyaW5nLkZvcm1hdChcInswfSAuLi5cIiwgZm91bmRUYWdOYW1lKSk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fZm9ybXMuZmlsbERhdGEoKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfVEFHX1RBU0s6XHJcbiAgICAgICAgaWYgKHRoaXMuU3ViVGFza3MgPT0gbnVsbClcclxuICAgICAgICAgIHRoaXMuU3ViVGFza3MgPSBuZXcgVGFza3NUYWJsZSgpO1xyXG4gICAgICAgIGxldCBzdWJ0YXNrID0gbmV3IFRhc2sodGhpcyk7XHJcbiAgICAgICAgc3VidGFzay5Jbml0KCk7XHJcbiAgICAgICAgdGhpcy5TdWJUYXNrcy5hZGRUYXNrKHN1YnRhc2spO1xyXG4gICAgICAgIGxldCBtZ2Q6IE1HRGF0YSA9IHRoaXMuX21nRGF0YTtcclxuICAgICAgICBpZiAodGhpcy5pc01haW5Qcm9nKCkpXHJcbiAgICAgICAgICBtZ2QgPSBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuR2V0TUdEYXRhRm9yU3RhcnR1cFByb2dyYW0oKTtcclxuICAgICAgICBhd2FpdCBzdWJ0YXNrLmZpbGxEYXRhKG1nZCwgbmV3IE9wZW5pbmdUYXNrRGV0YWlscygpKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19UQUdfVEFTS1VSTDpcclxuICAgICAgICBhd2FpdCBUYXNrLlByb2Nlc3NUYXNrVVJMKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0VYUFRBQkxFOlxyXG4gICAgICAgIGlmICh0aGlzLkV4cFRhYiA9PSBudWxsKVxyXG4gICAgICAgICAgdGhpcy5FeHBUYWIgPSBuZXcgRXhwVGFibGUoKTtcclxuICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhcImdvZXMgdG8gZXhwXCIpO1xyXG4gICAgICAgIHRoaXMuRXhwVGFiLmZpbGxEYXRhKHRoaXMsIHBhcnNlcik7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX1VTRVJfRVZFTlRTOlxyXG4gICAgICAgIGlmICh0aGlzLlVzZXJFdnRUYWIgPT0gbnVsbClcclxuICAgICAgICAgIHRoaXMuVXNlckV2dFRhYiA9IG5ldyBVc2VyRXZlbnRzVGFibGUoKTtcclxuICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhcImdvZXMgdG8gdXNlciBldmVudCB0YWJcIik7XHJcbiAgICAgICAgdGhpcy5Vc2VyRXZ0VGFiLmZpbGxEYXRhKHRoaXMsIHBhcnNlcik7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0xJTktTOlxyXG4gICAgICAgIHRoaXMuRGF0YXZpZXdIZWFkZXJzVGFibGUgPSBuZXcgRGF0YXZpZXdIZWFkZXJzKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuRGF0YXZpZXdIZWFkZXJzVGFibGUuZmlsbERhdGEocGFyc2VyKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19UQUdfU09SVFM6XHJcbiAgICAgICAgdGhpcy5SdW50aW1lU29ydHMgPSBuZXcgU29ydENvbGxlY3Rpb24oKTtcclxuICAgICAgICB0aGlzLlJ1bnRpbWVTb3J0cy5maWxsRGF0YSh0aGlzLCBwYXJzZXIpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX1RBR19UQVNLX1RBQkxFUzpcclxuICAgICAgICB0aGlzLkZpbGxUYXNrVGFibGVzKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX1RBR19SRUNPTVBVVEU6XHJcbiAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coXCJnb2VzIHRvIHJlY29tcHV0ZVwiKTtcclxuICAgICAgICB0aGlzLlJlY29tcHV0ZUZpbGxEYXRhKHBhcnNlcik7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0VWRU5USEFORExFUlM6XHJcbiAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coXCJnb2VzIHRvIGV2ZW50aGFuZGxlcnNcIik7XHJcbiAgICAgICAgaWYgKHRoaXMuSGFuZGxlcnNUYWIgPT0gbnVsbClcclxuICAgICAgICAgIHRoaXMuSGFuZGxlcnNUYWIgPSBuZXcgSGFuZGxlcnNUYWJsZSgpO1xyXG4gICAgICAgIHRoaXMuSGFuZGxlcnNUYWIuZmlsbERhdGEodGhpcywgcGFyc2VyKTtcclxuICAgICAgICB0aGlzLmFkZEV4cEhhbmRsZXJzVG9NR0RhdGEoKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBpZiAoZm91bmRUYWdOYW1lID09PSAoXCIvXCIgKyBYTUxDb25zdGFudHMuTUdfVEFHX1RBU0spKSB7XHJcbiAgICAgICAgICBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuUGFyc2VyLnNldEN1cnJJbmRleDJFbmRPZlRhZygpO1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKFwiVGhlcmUgaXMgbm8gc3VjaCB0YWcgaW4gVGFzay5pbml0SW5uZXJPYmplY3RzIC4gRW50ZXIgY2FzZSBmb3IgXCIgKyBmb3VuZFRhZ05hbWUpO1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgUmVjb21wdXRlRmlsbERhdGEocGFyc2VyOiBYbWxQYXJzZXIpOiB2b2lkIHtcclxuICAgIGxldCByZWNvbXB1dGVUYWJsZTogUmVjb21wdXRlVGFibGUgPSBuZXcgUmVjb21wdXRlVGFibGUoKTtcclxuICAgIHJlY29tcHV0ZVRhYmxlLmZpbGxEYXRhXzEoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcsIHRoaXMsIHBhcnNlcik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIEZpbGxUYXNrVGFibGVzXzEoKTogdm9pZCB7XHJcbiAgICBsZXQgcGFyc2VyOiBYbWxQYXJzZXIgPSBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuUGFyc2VyO1xyXG4gICAgLy8gR2V0IHRoZSBlbmQgb2YgdGhlIHRhc2sgdGFibGUgZWxlbWVudFxyXG4gICAgbGV0IGVuZENvbnRleHQ6IG51bWJlciA9IHBhcnNlci5nZXRYTUxkYXRhKCkuaW5kZXhPZihDb25zdEludGVyZmFjZS5NR19UQUdfVEFTS19UQUJMRVNfRU5ELCBwYXJzZXIuZ2V0Q3VyckluZGV4KCkpO1xyXG4gICAgZW5kQ29udGV4dCA9IHBhcnNlci5nZXRYTUxkYXRhKCkuaW5kZXhPZihYTUxDb25zdGFudHMuVEFHX0NMT1NFLCBlbmRDb250ZXh0KSArIFhNTENvbnN0YW50cy5UQUdfQ0xPU0UubGVuZ3RoO1xyXG4gICAgLy8gZ2V0IHRoZSB0YXNrIHRhYmxlIHhtbCBzdHJpbmdcclxuICAgIGxldCB0YXNrVGFibGVzRGF0YTogc3RyaW5nID0gcGFyc2VyLmdldFhNTHN1YnN0cmluZyhlbmRDb250ZXh0KTtcclxuICAgIHRoaXMuRmlsbFRhc2tUYWJsZXModGFza1RhYmxlc0RhdGEpO1xyXG4gICAgcGFyc2VyLnNldEN1cnJJbmRleChlbmRDb250ZXh0KTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYWRkIGhhbmRsZXJzIHRyaWdnZXJlZCBieSBleHByZXNzaW9ucyB0byBtZ2RhdGFcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgYWRkRXhwSGFuZGxlcnNUb01HRGF0YSgpOiB2b2lkIHtcclxuICAgIGxldCBpZHg6IG51bWJlciA9IDA7XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSB0aGlzLkhhbmRsZXJzVGFiLmdldFNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgIGxldCBoYW5kbGVyOiBFdmVudEhhbmRsZXIgPSB0aGlzLkhhbmRsZXJzVGFiLmdldEhhbmRsZXIoaSk7XHJcbiAgICAgIGxldCBldnQ6IEV2ZW50ID0gaGFuZGxlci5nZXRFdmVudCgpO1xyXG4gICAgICBpZiAoZXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9FWFBSRVNTSU9OIHx8XHJcbiAgICAgICAgKGV2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfVVNFUiAmJiBldnQuZ2V0VXNlckV2ZW50VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0VYUFJFU1NJT04pKSB7XHJcbiAgICAgICAgdGhpcy5fbWdEYXRhLmFkZEV4cEhhbmRsZXIoaGFuZGxlciwgaWR4KTtcclxuICAgICAgICBpZHgrKztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgcmVmcmVzaCBvbiB2YXJpYWJsZSBsaXN0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwdWJsaWMgU2V0UmVmcmVzaE9uVmFycyh2YXJpYWJsZXM6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgbGV0IHN0clRvazogc3RyaW5nW10gPSBTdHJVdGlsLnRva2VuaXplKHZhcmlhYmxlcywgXCIsXCIpO1xyXG4gICAgbGV0IGZsZE51bTogbnVtYmVyO1xyXG4gICAgbGV0IGludFZhbHMgPSBuZXcgTGlzdDxudW1iZXI+KCk7XHJcbiAgICBsZXQgaTogbnVtYmVyO1xyXG4gICAgZm9yIChpID0gMDsgaSA8IHN0clRvay5sZW5ndGg7IGkrKykge1xyXG4gICAgICBmbGROdW0gPSBOTnVtYmVyLlBhcnNlKHN0clRva1tpXSk7XHJcbiAgICAgIGludFZhbHMucHVzaChmbGROdW0pO1xyXG4gICAgfVxyXG4gICAgdGhpcy5SZWZyZXNoT25WYXJzID0gbmV3IEFycmF5KGludFZhbHMubGVuZ3RoKTtcclxuICAgIGZvciAoaSA9IDA7IGkgPCBpbnRWYWxzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGZsZE51bSA9IGludFZhbHMuZ2V0X0l0ZW0oaSk7XHJcbiAgICAgIHRoaXMuUmVmcmVzaE9uVmFyc1tpXSA9IGZsZE51bTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIERhdGFTeW5jZWQgcHJvcGVydHkgb2YgdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0RGF0YVN5bmNlZChzeW5jZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuRGF0YVN5bmNlZCA9IHN5bmNlZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgYSBmaWVsZCBieSBpdHMgbmFtZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmbGROYW1lXCI+b2YgdGhlIGZpZWxkPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRoZSBmaWVsZCBieSBpdHMgbmFtZTwvcmV0dXJucz5cclxuICBnZXRGaWVsZChmbGROYW1lOiBzdHJpbmcpOiBGaWVsZCB7XHJcbiAgICByZXR1cm4gKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5nZXRGaWVsZEJ5TmFtZShmbGROYW1lKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gYW4gZXhwcmVzc2lvbiBieSBpdHMgaWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWRcIj5pZCBvZiB0aGUgZXhwcmVzc2lvbjwvcGFyYW0+XHJcbiAgZ2V0RXhwQnlJZChpZDogbnVtYmVyKTogRXhwcmVzc2lvbiB7XHJcbiAgICBpZiAodGhpcy5FeHBUYWIgIT09IG51bGwpXHJcbiAgICAgIHJldHVybiB0aGlzLkV4cFRhYi5nZXRFeHBCeUlkKGlkKTtcclxuICAgIGVsc2VcclxuICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKFwiaW4gVGFzay5HZXRFeHBCeUlkKCk6IG5vIGV4cHJlc3Npb24gdGFibGVcIik7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIGdldEV4cE9iamVjdEJ5SWQoaWQ6IG51bWJlcik6IGFueSB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRFeHBCeUlkKGlkKTtcclxuICB9XHJcblxyXG4gIEdldEV4cHJlc3Npb25TdG9yYWdlKGV4cElkOiBudW1iZXIpOiBhbnkge1xyXG4gICAgbGV0IHJlc3VsdDogc3RyaW5nID0gbnVsbDtcclxuICAgIGlmIChleHBJZCA+IDApIHtcclxuICAgICAgbGV0IGV4cEJ5SWQ6IEV4cHJlc3Npb24gPSB0aGlzLmdldEV4cEJ5SWQoZXhwSWQpO1xyXG4gICAgICBEZWJ1Zy5Bc3NlcnQoZXhwQnlJZCAhPT0gbnVsbCk7XHJcbiAgICAgIHJlc3VsdCA9IGV4cEJ5SWQuR2V0U3RvcmFnZUF0dHJpYnV0ZSgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gQ2FsY3VsYXRlIGV4cHJlc2lvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZXhwSWRcIj5UaGUgZXhwcmVzc2lvbiB0byBldmFsdWF0ZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicmVzVHlwZVwiPlRoZSBleHBlY3RlZCByZXN1bHQgdHlwZS48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxlbmd0aFwiPlRoZSBleHBlY3RlZCBsZW5ndGggb2YgdGhlIHJlc3VsdC48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNvbnRlbnRUeXBlVW5pY29kZVwiPkRlbm90ZXMgd2hldGhlciB0aGUgcmVzdWx0IGlzIGV4cGVjdGVkIHRvIGJlIGEgdW5pY29kZSBzdHJpbmcuPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyZXNDZWxsVHlwZVwiPk5vdCB1c2VkLjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBhc3luYyBDYWxjdWxhdGVFeHByZXNzaW9uKGV4cElkOiBudW1iZXIsIHJlc1R5cGU6IFN0b3JhZ2VBdHRyaWJ1dGUsIGxlbmd0aDogbnVtYmVyLCBjb250ZW50VHlwZVVuaWNvZGU6IGJvb2xlYW4sIHJlc0NlbGxUeXBlOiBTdG9yYWdlQXR0cmlidXRlKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIGxldCByZXN1bHQ6IHN0cmluZyA9IG51bGw7XHJcbiAgICBpZiAoZXhwSWQgPiAwKSB7XHJcbiAgICAgIGxldCBleHBCeUlkOiBFeHByZXNzaW9uID0gdGhpcy5nZXRFeHBCeUlkKGV4cElkKTtcclxuICAgICAgRGVidWcuQXNzZXJ0KGV4cEJ5SWQgIT09IG51bGwpO1xyXG4gICAgICByZXN1bHQgPSBhd2FpdCBleHBCeUlkLmV2YWx1YXRlV2l0aFJlc3VsdFR5cGVBbmRMZW5ndGgocmVzVHlwZSwgbGVuZ3RoKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgSW5zZXJ0IFJlY29yZCBUYWJsZSB0byBkYXRhdmlldyBvZiB0aGUgdGFzayBpZiBpdCBjYW1lIGFmdGVyIGNsb3NpbmcgdGFzayB0YWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIGluc2VydFJlY29yZFRhYmxlKGludmFsaWRhdGU6IGJvb2xlYW4sIHBhcnNlcjogWG1sUGFyc2VyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAvLyBjaGVjayBjYWNoZSBsb2dpYyBvbmx5IGZvciBzdWItZm9ybXNcclxuICAgIGlmIChhd2FpdCB0aGlzLmlzQ2FjaGVkKCkpIHtcclxuICAgICAgbGV0IGZpcnN0VGltZTogYm9vbGVhbiA9ICg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuZ2V0Rmlyc3REdigpO1xyXG4gICAgICAvLyBpZiBpdCBpcyB0aGUgZmlyc3QgdGltZSB0aGUgdGFzayBnZXQgZHYgb3IgdGhlIG9sZCBkdiBpcyBub3QgaW52YWxpZGF0ZWQgb3JcclxuICAgICAgLy8gdGhlIG9sZCBkdiBkb2VzIG5vdCBpbmNsdWRlIHRoZSBmaXJzdCByZWNvcmQgZG8gbm90IHB1dCBpbiBjYWNoZVxyXG4gICAgICBpZiAoIWZpcnN0VGltZSAmJiBpbnZhbGlkYXRlKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmhhc0xvY2F0ZSkge1xyXG4gICAgICAgICAgLy8gdGhlIG9sZCBkLnYgd2FzIG5vdCB1cGRhdGVkIHB1dCBpdCBpbiBjYWNoZSAoaXRzIHJlcGxpY2F0ZSlcclxuICAgICAgICAgIGlmICgoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLkluY2x1ZGVzRmlyc3QoKSkge1xyXG4gICAgICAgICAgICBpZiAoISg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuZ2V0Q2hhbmdlZCgpKVxyXG4gICAgICAgICAgICAgIHRoaXMuX2R2Q2FjaGUucHV0SW5DYWNoZSgoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLnJlcGxpY2F0ZSgpKTtcclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgIHRoaXMuX2R2Q2FjaGUucmVtb3ZlRHZGcm9tQ2FjaGUoKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5nZXREdlBvc1ZhbHVlKCksIHRydWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHRoaXMubG9jYXRlUHV0SW5DYWNoZSgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBwYXJzZSB0aGUgbmV3IGRhdGF2aWV3XHJcbiAgICBhd2FpdCAoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLmZpbGxEYXRhKHBhcnNlcik7XHJcblxyXG4gICAgaWYgKGludmFsaWRhdGUpXHJcbiAgICAgICg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuc2V0Q2hhbmdlZChmYWxzZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSBoYW5kbGVycyB0YWJsZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0SGFuZGxlcnNUYWIoKTogSGFuZGxlcnNUYWJsZSB7XHJcbiAgICByZXR1cm4gdGhpcy5IYW5kbGVyc1RhYjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBidWlsZCB0aGUgWE1MIHN0cmluZyBmb3IgdGhlIGRhdGF2aWV3XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyBidWlsZFhNTChtZXNzYWdlOiBTdHJpbmdCdWlsZGVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLklzQWZ0ZXJSZXRyeUJlZm9yZUJ1aWxkWE1MID0gdGhpcy5nZXRBZnRlclJldHJ5KCk7XHJcbiAgICBpZiAodGhpcy5Lbm93blRvU2VydmVyICYmICF0aGlzLklzT2ZmbGluZSkge1xyXG4gICAgICBtZXNzYWdlLkFwcGVuZChYTUxDb25zdGFudHMuU1RBUlRfVEFHICsgWE1MQ29uc3RhbnRzLk1HX1RBR19UQVNLKTtcclxuICAgICAgbWVzc2FnZS5BcHBlbmQoXCIgXCIgKyBYTUxDb25zdGFudHMuTUdfQVRUUl9UQVNLSUQgKyBcIj1cXFwiXCIgKyB0aGlzLmdldFRhc2tUYWcoKSArIFwiXFxcIlwiKTtcclxuICAgICAgbWVzc2FnZS5BcHBlbmQoXCIgXCIgKyBDb25zdEludGVyZmFjZS5NR19BVFRSX1RBU0tfTUFJTkxFVkVMICsgXCI9XFxcIlwiICsgdGhpcy5nZXRNYWluTGV2ZWwoKSArIFwiXFxcIlwiKTtcclxuICAgICAgbWVzc2FnZS5BcHBlbmQoWE1MQ29uc3RhbnRzLlRBR19DTE9TRSk7XHJcbiAgICAgIGF3YWl0ICg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuYnVpbGRYTUwobWVzc2FnZSk7XHJcbiAgICAgIGlmICh0aGlzLkZvcm0gIT0gbnVsbCAmJiB0aGlzLkZvcm0uT3BlbmVkKVxyXG4gICAgICAgIG1lc3NhZ2UuQXBwZW5kKCg8TWdGb3JtPnRoaXMuRm9ybSkuR2V0SGlkZGVuQ29udHJvbExpc3RYTUwoKSk7XHJcbiAgICAgIG1lc3NhZ2UuQXBwZW5kKFwiXFxuICAgPC9cIiArIFhNTENvbnN0YW50cy5NR19UQUdfVEFTSyArIFhNTENvbnN0YW50cy5UQUdfQ0xPU0UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGJ1aWxkIHRoZSBYTUwgc3RyaW5nIGZvciB0aGUgcmFuZ2VzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBidWlsZFhNTEZvclJuZ3MobWVzc2FnZTogU3RyaW5nQnVpbGRlciwgVXNlclJhbmdlczogTGlzdDxVc2VyUmFuZ2U+LCBsb2NhdGU6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGxldCBpOiBudW1iZXI7XHJcbiAgICBsZXQgZmxkOiBGaWVsZDtcclxuICAgIGxldCBjZWxsQXR0cjogU3RvcmFnZUF0dHJpYnV0ZSA9IFN0b3JhZ2VBdHRyaWJ1dGUuU0tJUDtcclxuICAgIGxldCB0b0Jhc2U2NDogYm9vbGVhbiA9IChFbnZpcm9ubWVudC5JbnN0YW5jZS5HZXREZWJ1Z0xldmVsKCkgPD0gMSk7XHJcblxyXG4gICAgbWVzc2FnZS5BcHBlbmQoWE1MQ29uc3RhbnRzLlRBR19DTE9TRSk7XHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgVXNlclJhbmdlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBtZXNzYWdlLkFwcGVuZChYTUxDb25zdGFudHMuU1RBUlRfVEFHICsgQ29uc3RJbnRlcmZhY2UuVVNFUl9STkcpO1xyXG5cclxuICAgICAgbGV0IHJuZzogVXNlclJhbmdlID0gVXNlclJhbmdlcy5nZXRfSXRlbShpKTtcclxuXHJcbiAgICAgIG1lc3NhZ2UuQXBwZW5kKFwiIFwiICsgWE1MQ29uc3RhbnRzLk1HX1RBR19GTEQgKyBcIj1cXFwiXCIgKyBybmcudmVlSWR4ICsgXCJcXFwiXCIpO1xyXG5cclxuICAgICAgZmxkID0gPEZpZWxkPnRoaXMuRGF0YVZpZXcuZ2V0RmllbGQoPG51bWJlcj5ybmcudmVlSWR4IC0gMSk7XHJcbiAgICAgIGxldCBmbGRBdHRyOiBTdG9yYWdlQXR0cmlidXRlID0gZmxkLmdldFR5cGUoKTtcclxuXHJcbiAgICAgIGlmIChybmcubnVsbE1pbilcclxuICAgICAgICBtZXNzYWdlLkFwcGVuZChcIiBcIiArIENvbnN0SW50ZXJmYWNlLk5VTExfTUlOX1JORyArIFwiPVxcXCIxXFxcIlwiKTtcclxuXHJcbiAgICAgIGlmICghcm5nLmRpc2NhcmRNaW4gJiYgcm5nLm1pbiAhPSBudWxsKSB7XHJcbiAgICAgICAgbGV0IHZhbDogc3RyaW5nID0gUmVjb3JkVXRpbHMuaXRlbVZhbFRvWE1MKHJuZy5taW4sIGZsZEF0dHIsIGNlbGxBdHRyLCB0b0Jhc2U2NCk7XHJcbiAgICAgICAgbWVzc2FnZS5BcHBlbmQoXCIgXCIgKyBDb25zdEludGVyZmFjZS5NSU5fUk5HICsgXCI9XFxcIlwiICsgdmFsICsgXCJcXFwiXCIpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAocm5nLm51bGxNYXgpXHJcbiAgICAgICAgbWVzc2FnZS5BcHBlbmQoXCIgXCIgKyBDb25zdEludGVyZmFjZS5OVUxMX01BWF9STkcgKyBcIj1cXFwiMVxcXCJcIik7XHJcblxyXG4gICAgICBpZiAoIXJuZy5kaXNjYXJkTWF4ICYmIHJuZy5tYXggIT0gbnVsbCkge1xyXG4gICAgICAgIGxldCB2YWw6IHN0cmluZyA9IFJlY29yZFV0aWxzLml0ZW1WYWxUb1hNTChybmcubWF4LCBmbGRBdHRyLCBjZWxsQXR0ciwgdG9CYXNlNjQpO1xyXG4gICAgICAgIG1lc3NhZ2UuQXBwZW5kKFwiIFwiICsgQ29uc3RJbnRlcmZhY2UuTUFYX1JORyArIFwiPVxcXCJcIiArIHZhbCArIFwiXFxcIlwiKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgbWVzc2FnZS5BcHBlbmQoWE1MQ29uc3RhbnRzLlRBR19URVJNKTtcclxuICAgIH1cclxuICAgIGlmIChsb2NhdGUpXHJcbiAgICAgIG1lc3NhZ2UuQXBwZW5kKFhNTENvbnN0YW50cy5FTkRfVEFHICsgQ29uc3RJbnRlcmZhY2UuVVNFUl9MT0NBVEVTICsgWE1MQ29uc3RhbnRzLlRBR19DTE9TRSk7XHJcbiAgICBlbHNlXHJcbiAgICAgIG1lc3NhZ2UuQXBwZW5kKFhNTENvbnN0YW50cy5FTkRfVEFHICsgQ29uc3RJbnRlcmZhY2UuVVNFUl9SQU5HRVMgKyBYTUxDb25zdGFudHMuVEFHX0NMT1NFKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBidWlsZCB0aGUgWE1MIHN0cmluZyBmb3IgdGhlIHVzZXIgYWRkZWQgc29ydHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGJ1aWxkWE1MRm9yU29ydHMobWVzc2FnZTogU3RyaW5nQnVpbGRlcik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuVXNlclNvcnRzICE9IG51bGwgJiYgdGhpcy5Vc2VyU29ydHMubGVuZ3RoID4gMCkge1xyXG4gICAgICBsZXQgaTogbnVtYmVyO1xyXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5Vc2VyU29ydHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBtZXNzYWdlLkFwcGVuZChYTUxDb25zdGFudHMuVEFHX0NMT1NFKTtcclxuICAgICAgICBsZXQgc3J0OiBTb3J0ID0gdGhpcy5Vc2VyU29ydHMuZ2V0X0l0ZW0oaSk7XHJcblxyXG4gICAgICAgIG1lc3NhZ2UuQXBwZW5kKFhNTENvbnN0YW50cy5TVEFSVF9UQUcgKyBDb25zdEludGVyZmFjZS5TT1JUKTtcclxuICAgICAgICBtZXNzYWdlLkFwcGVuZChcIiBcIiArIFhNTENvbnN0YW50cy5NR19UQUdfRkxEICsgXCI9XFxcIlwiICsgc3J0LmZsZElkeCArIFwiXFxcIlwiKTtcclxuICAgICAgICBpZiAoc3J0LmRpcilcclxuICAgICAgICAgIG1lc3NhZ2UuQXBwZW5kKFwiIFwiICsgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9ESVIgKyBcIj1cXFwiMVxcXCJcIik7XHJcblxyXG4gICAgICAgIG1lc3NhZ2UuQXBwZW5kKFhNTENvbnN0YW50cy5UQUdfVEVSTSk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5Vc2VyU29ydHMuQ2xlYXIoKTtcclxuICAgICAgdGhpcy5Vc2VyU29ydHMgPSBudWxsO1xyXG4gICAgICBtZXNzYWdlLkFwcGVuZChYTUxDb25zdGFudHMuRU5EX1RBRyArIENvbnN0SW50ZXJmYWNlLk1HX1RBR19TT1JUUyArIFhNTENvbnN0YW50cy5UQUdfQ0xPU0UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgYSB1c2VyIGV2ZW50IGJ5IGl0cyBpbmRleFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpZHhcIj50aGUgaW5kZXggb2YgdGhlIHJlcXVlc3RlZCBldmVudDwvcGFyYW0+XHJcbiAgZ2V0VXNlckV2ZW50KGlkeDogbnVtYmVyKTogRXZlbnQge1xyXG4gICAgRGVidWcuQXNzZXJ0KHRoaXMuVXNlckV2dFRhYiAhPT0gbnVsbCk7XHJcbiAgICBsZXQgcmV0RXZlbnQ6IEV2ZW50ID0gbnVsbDtcclxuICAgIGlmICh0aGlzLlVzZXJFdnRUYWIgIT09IG51bGwpXHJcbiAgICAgIHJldEV2ZW50ID0gdGhpcy5Vc2VyRXZ0VGFiLmdldEV2ZW50KGlkeCk7XHJcbiAgICByZXR1cm4gcmV0RXZlbnQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IFNldCB0aGUgTW92ZVRvRmlyc3RDb250cm9sIGZsYWcgb24gdGhlIGZvcm0uIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtb3ZlVG9GaXJzdENvbnRyb2xcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgU2V0TW92ZVRvRmlyc3RDb250cm9sKG1vdmVUb0ZpcnN0Q29udHJvbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKG1vdmVUb0ZpcnN0Q29udHJvbCB8fCAhdGhpcy5Jc1N1YkZvcm0pIHtcclxuICAgICAgaWYgKHRoaXMuRm9ybSAhPT0gbnVsbCkge1xyXG4gICAgICAgIC8vIHRoaXMgaXMgYSBjYWxsIGRlc3RpbmF0aW9uLyBzdWJmb3JtIGNhbGxcclxuICAgICAgICAvLyBXZSBwZXJmb3JtIG1vdmUgdG8gZmlyc3QgY29udHJvbCBvbmx5IHRvIG9uZSBjb250cm9sIGZvcm0gcGVyIHJlcXVlc3QgLSB0aGUgZmlyc3Qgb25lIHRoYXQgd2UgcmVjZWl2ZVxyXG4gICAgICAgIGxldCBhbHJlYWR5TW92ZWQ6IGJvb2xlYW4gPSAoPE1nRm9ybT50aGlzLkZvcm0pLmFscmVhZHlNb3ZlZFRvRmlyc3RDb250cm9sKCk7XHJcbiAgICAgICAgaWYgKCFhbHJlYWR5TW92ZWQpXHJcbiAgICAgICAgICAoPE1nRm9ybT50aGlzLkZvcm0pLk1vdmVkVG9GaXJzdENvbnRyb2wgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc3RhcnQgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgdGFzayBhbmQgaXRzIHN1YlRhc2tzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyBTdGFydChtb3ZlVG9GaXJzdENvbnRyb2w6IGJvb2xlYW4sIGNhbGxCeURlc3RTdWJGb3JtOiBib29sZWFuKTogUHJvbWlzZTxJVGFzaz4ge1xyXG4gICAgbGV0IG5vbkludGVyYWN0aXZlVGFzazogVGFzayA9IG51bGw7XHJcblxyXG4gICAgaWYgKCF0aGlzLl9pc1N0YXJ0ZWQpIHtcclxuICAgICAgdGhpcy5faXNTdGFydGVkID0gdHJ1ZTtcclxuXHJcbiAgICAgIHRoaXMuSW5pdGlhbGl6ZUV4ZWN1dGlvbigpO1xyXG5cclxuICAgICAgdGhpcy5JblN0YXJ0UHJvY2VzcyA9IHRydWU7XHJcbiAgICAgIGxldCByZXN1bHQ6IFJldHVyblJlc3VsdCA9IGF3YWl0IHRoaXMuU2V0dXAoKTtcclxuXHJcbiAgICAgIC8vIHRhc2sgaW5pdGlhbGl6YXRpb24gZmFpbGVkIC0gY2xvc2UgdGhlIHRhc2tcclxuICAgICAgaWYgKCFyZXN1bHQuU3VjY2VzcylcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuXHJcbiAgICAgIHRoaXMuX2luUHJvY2Vzc2luZ1RvcE1vc3RFbmRUYXNrU2F2ZWQgPSBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5nZXRQcm9jZXNzaW5nVG9wTW9zdEVuZFRhc2soKTtcclxuICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuc2V0UHJvY2Vzc2luZ1RvcE1vc3RFbmRUYXNrKGZhbHNlKTtcclxuXHJcbiAgICAgIGF3YWl0IHRoaXMuRW5hYmxlQWN0aW9ucygpO1xyXG5cclxuICAgICAgcmVzdWx0ID0gYXdhaXQgdGhpcy5Jbml0aWFsaXplRm9ybShtb3ZlVG9GaXJzdENvbnRyb2wpO1xyXG5cclxuICAgICAgaWYgKCFyZXN1bHQuU3VjY2VzcylcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuXHJcbiAgICAgIGlmICghdGhpcy5Jc0ludGVyYWN0aXZlICYmICF0aGlzLl9pc01haW5QcmcpXHJcbiAgICAgICAgbm9uSW50ZXJhY3RpdmVUYXNrID0gdGhpcztcclxuXHJcbiAgICAgIHRoaXMuRGF0YVZpZXdXYXNSZXRyaWV2ZWQgPSB0cnVlO1xyXG5cclxuICAgICAgLy8gUUNSICMgMTY3MzMyIDpcclxuICAgICAgLy8gSWYgd2Ugc3RhcnQgcG9yZ3JhbSBQMSwgZm9yIHdoaWNoIE1QIGlzIHN0YXJ0ZWQuIE1QIGlzIGNhbGxpbmcgUDIgZnJvbSBpdCdzIFRQLiBTbywgd2hlbiBpdCBjYWxscyBQMlxyXG4gICAgICAvLyBhZ2FpbiBpdCBzdGFydHMgTVAsIGJ1dCBmcm9tIE1QIGl0IGFnYWluIHN0YXJ0cyBQMS4gYXMgUDEgaXMgaW4gaXQncyBzdWJ0YXNrIGFuZCBpdCBpcyBub3QgeWV0IHN0YXJ0ZWQuXHJcbiAgICAgIC8vIFNvLCBpdCdzIHdyb25nIHRvIHN0YXJ0IFAxIHdoaWxlIGV4ZWN1dGluZyBUUCBvZiBNUC4gSXQgc2hvdWxkIGV4ZWN1dGUgb25seSBQMi5cclxuICAgICAgLy8gU28sIGluIG9yZGVyIHRvIGF2b2lkIHRoaXMsIHNldCBNUCdzIHN1YnRhc2tzIHRvIG51bGwgYmVmb3JlIGVudGVyaW5nIFRQLiBhbmQgYWdhaW4gcmVzdG9yZSBpdCBiYWNrLCBpbiBvcmRlciB0b1xyXG4gICAgICAvLyBzdGFydCBQMSBwcm9wZXJseS5cclxuICAgICAgbGV0IHN1YlRhc2tzOiBUYXNrc1RhYmxlID0gdGhpcy5TdWJUYXNrcztcclxuICAgICAgaWYgKHRoaXMuaXNNYWluUHJvZygpKVxyXG4gICAgICAgIHRoaXMuU3ViVGFza3MgPSBudWxsO1xyXG4gICAgICBpZiAodGhpcy5pc01haW5Qcm9nKCkpXHJcbiAgICAgICAgdGhpcy5TdWJUYXNrcyA9IHN1YlRhc2tzO1xyXG5cclxuICAgICAgaWYgKCFyZXN1bHQuU3VjY2VzcylcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgaWYgKHRoaXMuX2Fib3J0aW5nKVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG5cclxuICAgICAgbGV0IGRhdGFWaWV3Q29tbWFuZDogSUNsaWVudENvbW1hbmQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVEYXRhVmlld0NvbW1hbmQodGhpcy5nZXRUYXNrVGFnKCksIERhdGFWaWV3Q29tbWFuZFR5cGUuRmlyc3RDaHVuayk7XHJcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMuRGF0YXZpZXdNYW5hZ2VyLkV4ZWN1dGUoZGF0YVZpZXdDb21tYW5kKTtcclxuXHJcbiAgICAgIGlmICghcmVzdWx0LlN1Y2Nlc3MpXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICB0aGlzLlJlc3VtZVN1YmZvcm1MYXlvdXQoKTtcclxuICAgIH1cclxuXHJcbiAgICBub25JbnRlcmFjdGl2ZVRhc2sgPSBhd2FpdCB0aGlzLlN0YXJ0U3ViVGFza3MobW92ZVRvRmlyc3RDb250cm9sLCBub25JbnRlcmFjdGl2ZVRhc2ssIGNhbGxCeURlc3RTdWJGb3JtKTtcclxuICAgIHRoaXMuSW5TdGFydFByb2Nlc3MgPSBmYWxzZTtcclxuICAgIHJldHVybiBub25JbnRlcmFjdGl2ZVRhc2s7XHJcbiAgfVxyXG5cclxuICBDYW5SZXN1bWVTdWJmb3JtTGF5b3V0KCk6IGJvb2xlYW4ge1xyXG4gICAgLy8gd2FpdCB0aWxsIHdlIHJldHJpdmUgZGF0YXZpZXcgKHJlbGV2YW50IGZvciBsb2NhbCkgYmVmb3JlIHJlc3VtaW5nIGxheW91dFxyXG4gICAgLy8gbnVtYmVyIG9mIHJlY29yZHMgYWZmZWN0IHZpc2liaWxpdHkgb2Ygc2Nyb2xsYmFyIGFuZCBpbml0aWFsIHRhYmxlIHBhY2VtZW50XHJcbiAgICByZXR1cm4gdGhpcy5EYXRhVmlld1dhc1JldHJpZXZlZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gSW5pdGlhbGl6ZSBleGVjdXRpb24tcmVsYXRlZCBzdHVmZi5cclxuICAvLy8gVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBPTkxZIGZyb20gVGFzay5TdGFydFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBJbml0aWFsaXplRXhlY3V0aW9uKCk6IHZvaWQge1xyXG4gICAgLy8gY3VycmVudGx5IHRoZSBpcyBubyBjb250cm9sIGV4ZWN1dGluZyB0aGVyZSBmb3IgdGhlXHJcbiAgICAvLyBjdXJyZW50IGV4ZWN1dGluZyBjb250cm9sIGluZGV4IGlzIHNldCB0byAtMVxyXG4gICAgc3VwZXIuc2V0QnJrTGV2ZWwoQ29uc3RJbnRlcmZhY2UuQlJLX0xFVkVMX1JFQ19NQUlOLCAtMSk7XHJcbiAgICB0aGlzLl9maXJzdFJlY29yZEN5Y2xlID0gdHJ1ZTsgICAgICAvLyBXaGlsZSBzdGFydGluZyBhIFRhc2ssIHNldCBmaXJzdFJlY29yZEN5Y2xlID0gVFJVRVxyXG5cclxuICAgIHRoaXMuX2N1cnJTdGFydFByb2dMZXZlbCA9ICgodGhpcy5Jc1N1YkZvcm0gJiYgKDxNZ0Zvcm0+dGhpcy5nZXRQYXJlbnQoKS5nZXRGb3JtKCkpLmFscmVhZHlNb3ZlZFRvRmlyc3RDb250cm9sKCkpXHJcbiAgICAgID8gKDxUYXNrPnRoaXMuZ2V0UGFyZW50KCkpLl9jdXJyU3RhcnRQcm9nTGV2ZWxcclxuICAgICAgOiBUYXNrLlN0YXJ0UHJvZ0xldmVsKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gaW5pdGlhbGl6ZSBmb3JtLXJlbGF0ZWQgc3R1ZmZcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1vdmVUb0ZpcnN0Q29udHJvbFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIGFzeW5jIEluaXRpYWxpemVGb3JtKG1vdmVUb0ZpcnN0Q29udHJvbDogYm9vbGVhbik6IFByb21pc2U8UmV0dXJuUmVzdWx0PiB7XHJcbiAgICBpZiAodGhpcy5Gb3JtICE9PSBudWxsKSB7XHJcbiAgICAgIC8vIHNldCBNb3ZlVG9GaXJzdENvbnRyb2wgZmxhZyBvbiB0aGUgZm9ybS5cclxuICAgICAgdGhpcy5TZXRNb3ZlVG9GaXJzdENvbnRyb2wobW92ZVRvRmlyc3RDb250cm9sKTtcclxuXHJcbiAgICAgIC8vIHRoZSBJbml0Rm9ybSBtaWdodCBjYXVzZSBleGVjdXRpb24gb2YgY29kZSAodmFyaWFibGUgY2hhbmdlKSBzbyB3ZSBzaG91bGQgZG8gaXQgd2l0aCBhIG5ldyBzZXJ2ZXIgZXhlY3V0aW9uIHN0YWNrXHJcbiAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnB1c2hOZXdFeGVjU3RhY2tzKCk7XHJcblxyXG4gICAgICB0aGlzLnJvdXRlUGFyYW1zID0gKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5HZXRSb3V0ZVBhcmFtcygpO1xyXG5cclxuICAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgY3VycmVudCB0YXNrJ3MgZm9ybS5cclxuICAgICAgYXdhaXQgdGhpcy5Jbml0Rm9ybSgpO1xyXG5cclxuICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIucG9wTmV3RXhlY1N0YWNrcygpO1xyXG5cclxuICAgICAgdGhpcy5nZXRNR0RhdGEoKS5TdGFydFRpbWVycygpO1xyXG4gICAgICBDb21tYW5kcy5iZWdpbkludm9rZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBuZXcgUmV0dXJuUmVzdWx0KCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHN0YXJ0IHN1YiB0YXNrcyBvZiB0aGlzIHRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1vdmVUb0ZpcnN0Q29udHJvbFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibm9uSW50ZXJhY3RpdmVUYXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgYXN5bmMgU3RhcnRTdWJUYXNrcyhtb3ZlVG9GaXJzdENvbnRyb2w6IGJvb2xlYW4sIG5vbkludGVyYWN0aXZlVGFzazogVGFzaywgY2FsbEJ5RGVzdFN1YkZvcm06IGJvb2xlYW4pOiBQcm9taXNlPFRhc2s+IHtcclxuICAgIGlmICh0aGlzLmhhc1N1YlRhc2tzKCkpIHtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuU3ViVGFza3MuZ2V0U2l6ZSgpOyBpID0gaSArIDEpIHtcclxuICAgICAgICBsZXQgdGFzazogVGFzayA9IDxUYXNrPnRoaXMuU3ViVGFza3MuZ2V0VGFzayhpKTtcclxuICAgICAgICBsZXQgdG1wTm9uSW50ZXJhY3RpdmVUYXNrOiBUYXNrID0gIDxUYXNrPiBhd2FpdCB0YXNrLlN0YXJ0KG1vdmVUb0ZpcnN0Q29udHJvbCwgY2FsbEJ5RGVzdFN1YkZvcm0pO1xyXG4gICAgICAgIGlmIChub25JbnRlcmFjdGl2ZVRhc2sgPT09IG51bGwpXHJcbiAgICAgICAgICBub25JbnRlcmFjdGl2ZVRhc2sgPSB0bXBOb25JbnRlcmFjdGl2ZVRhc2s7XHJcbiAgICAgICAgZWxzZSBpZiAodG1wTm9uSW50ZXJhY3RpdmVUYXNrICE9PSBudWxsKVxyXG4gICAgICAgICAgRGVidWcuQXNzZXJ0KGZhbHNlLCBcIm1vcmUgdGhhbiAxIG5vbiBpbnRlcmFjdGl2ZSBpbiB0YXNrLnN0YXJ0XCIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG5vbkludGVyYWN0aXZlVGFzaztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgRW5hYmxlQWN0aW9ucygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBhY3RMaXN0OiBudW1iZXJbXSA9IEFjdGlvbk1hbmFnZXIuYWN0RW5hYmxlZDtcclxuICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGVMaXN0KGFjdExpc3QsIHRydWUsIGZhbHNlKTtcclxuXHJcbiAgICBpZiAodGhpcy5Jc1N1YkZvcm0pXHJcbiAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1BPU1RfUkVGUkVTSF9CWV9QQVJFTlQsIHRydWUpO1xyXG5cclxuXHJcbiAgICAvLyB3aGVuIHdlIGhhdmUgZGVmYXVsdCBidXR0b24gdGhlbiBlbmFibGUgdGhlIGFjdGlvblxyXG4gICAgaWYgKHRoaXMuRm9ybSAhPSBudWxsICYmIGF3YWl0ICg8TWdGb3JtPnRoaXMuRm9ybSkuZ2V0RGVmYXVsdEJ1dHRvbihmYWxzZSkgIT0gbnVsbClcclxuICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfREVGQVVMVF9CVVRUT04sIHRydWUpO1xyXG5cclxuICAgIC8vIGVuYWJsZSBhY3Rpb25zIGRlcGVuZGluZyBvbiB0YXNrIHByb3BlcnRpZXNcclxuICAgIGF3YWl0IHRoaXMuZW5hYmxlTW9kZXMoKTtcclxuICAgIGlmIChhd2FpdCB0aGlzLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TRUxFQ1RJT04sIGZhbHNlKSkge1xyXG4gICAgICBpZiAoYXdhaXQoICh0aGlzLkZvcm0uZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9ERUZBVUxUX0JVVFRPTikpKS5nZXRWYWx1ZSgpICE9PSBcIlwiKSB7XHJcbiAgICAgICAgbGV0IGRlZmF1bHRCdXR0b25OYW1lOiBzdHJpbmcgPSAgYXdhaXQgKHRoaXMuRm9ybS5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0RFRkFVTFRfQlVUVE9OKSkuZ2V0VmFsdWUoKTtcclxuICAgICAgICBsZXQgY3RybDogTWdDb250cm9sID0gKDxNZ0Zvcm0+dGhpcy5Gb3JtKS5nZXRDdHJsQnlDdHJsTmFtZShkZWZhdWx0QnV0dG9uTmFtZSk7XHJcbiAgICAgICAgbGV0IGFSdEV2dCA9IG5ldyBSdW5UaW1lRXZlbnQoY3RybCk7XHJcbiAgICAgICAgaWYgKGFSdEV2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfSU5URVJOQUwgJiZcclxuICAgICAgICAgIGFSdEV2dC5nZXRJbnRlcm5hbENvZGUoKSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1NFTEVDVClcclxuICAgICAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1NFTEVDVCwgdHJ1ZSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9TRUxFQ1QsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBlbmFibGVQcmludGRhdGE6IGJvb2xlYW4gPSBhd2FpdCB0aGlzLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9QUklOVF9EQVRBLCBmYWxzZSk7XHJcbiAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9QUklOVF9EQVRBLCBlbmFibGVQcmludGRhdGEpO1xyXG5cclxuXHJcbiAgICBpZiAodGhpcy5nZXRFbmFibGVab29tSGFuZGxlcigpKVxyXG4gICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9aT09NLCB0cnVlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gc2hvdyBlcnJvciBvbiB0YXNrJ3MgZm9ybVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidGV4dFwiPjwvcGFyYW0+XHJcbiAgYXN5bmMgU2hvd0Vycm9yKHRleHQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IG1sc1RyYW5zVGV4dDogc3RyaW5nID0gTGFuZ3VhZ2VEYXRhLkluc3RhbmNlLnRyYW5zbGF0ZSh0ZXh0KTtcclxuICAgIGxldCBtbHNUcmFuc1RpdGxlOiBzdHJpbmcgPSBMYW5ndWFnZURhdGEuSW5zdGFuY2UudHJhbnNsYXRlKENvbnN0SW50ZXJmYWNlLkVSUk9SX1NUUklORyk7XHJcbiAgICAvLyBtbHMgPz8/XHJcbiAgICBhd2FpdCBHVUlNYW5hZ2VyLkluc3RhbmNlLk1lc3NhZ2VCb3gobWxzVHJhbnNUaXRsZSwgbWxzVHJhbnNUZXh0LCBTdHlsZXMuTVNHQk9YX0lDT05fRVJST1IgfCBTdHlsZXMuTVNHQk9YX0JVVFRPTl9PSyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGNoZWNrIHRoZSByZXN1bHQuIElmIGZhaWxlZCAtIGRpc3BsYXkgdGhlIGVycm9yIG1lc3NhZ2Vib3ggYW5kIGVuZCB0aGUgdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicmVzdWx0XCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGFzeW5jIEVuZFRhc2tPbkVycm9yKHJlc3VsdDogUmV0dXJuUmVzdWx0LCBkaXNwbGF5RXJyb3I6IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGlmICghcmVzdWx0LlN1Y2Nlc3MgJiYgIXRoaXMuaXNBYm9ydGluZygpKSB7XHJcbiAgICAgIGlmICh0aGlzLkluU3RhcnRQcm9jZXNzKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5lbmRUYXNrKGZhbHNlLCBmYWxzZSwgZmFsc2UpO1xyXG4gICAgICAgIGlmIChkaXNwbGF5RXJyb3IpXHJcbiAgICAgICAgICBhd2FpdCB0aGlzLlNob3dFcnJvcihyZXN1bHQuRXJyb3JEZXNjcmlwdGlvbik7XHJcbiAgICAgICAgdGhpcy5JblN0YXJ0UHJvY2VzcyA9IGZhbHNlO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGlmIChkaXNwbGF5RXJyb3IpXHJcbiAgICAgICAgICBhd2FpdCB0aGlzLlNob3dFcnJvcihyZXN1bHQuRXJyb3JEZXNjcmlwdGlvbik7XHJcbiAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRoaXMsIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FWElUKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBhc3luYyBTZXR1cCgpOiBQcm9taXNlPFJldHVyblJlc3VsdD4ge1xyXG4gICAgbGV0IHJlc3VsdDogUmV0dXJuUmVzdWx0O1xyXG4gICAgdGhpcy5UYXNrU2VydmljZS5Jbml0VGFza1ByZWZpeEV4ZWN1dGVkRmxhZyh0aGlzKTtcclxuICAgIHRoaXMuVGFza1N1ZmZpeEV4ZWN1dGVkID0gZmFsc2U7XHJcblxyXG4gICAgVGFza1NlcnZpY2VCYXNlLkNyZWF0ZUZpcnN0UmVjb3JkKHRoaXMpO1xyXG5cclxuICAgIC8vIGluaXQgZGF0YSB2aWV3XHJcbiAgICAvLyBOb3RlOiBFdmVuIGlmIHRoZSByZXN1bHRJbml0TW9kZSBpcyBmYWxzZSB3ZSBNVVNUIGluaXQgdGhlIGRhdGEgdmlld1xyXG4gICAgbGV0IGRhdGFWaWV3Q29tbWFuZDogSUNsaWVudENvbW1hbmQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVEYXRhVmlld0NvbW1hbmQodGhpcy5nZXRUYXNrVGFnKCksIERhdGFWaWV3Q29tbWFuZFR5cGUuSW5pdCk7XHJcbiAgICByZXN1bHQgPSBhd2FpdCB0aGlzLkRhdGF2aWV3TWFuYWdlci5FeGVjdXRlKGRhdGFWaWV3Q29tbWFuZCk7XHJcblxyXG4gICAgLy8gbmVlZCB0byBjaGVjayByZXN1bHQob2YgdGhlIGRhdGEgdmlldyBpbml0IGFuZCBpZiBub3Qgc3VjY2VzcyB0aGVuIHJldHVybiB0aGlzIGVycm9yXHJcbiAgICBpZiAoIXJlc3VsdC5TdWNjZXNzKVxyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG5cclxuICAgIGlmIChyZXN1bHQuU3VjY2Vzcykge1xyXG4gICAgICAvLyBFeGVjdXRlIHRoZSBjb21tYW5kLCB3aG9zZSBleGVjdXRpb24gd2FzIGRlbGF5ZWQgYmVjdWFzZSB0YXNrIHdhcyBub3Qgc3RhcnRlZC4gU28gRXhjdXRlIHRob3NlIGNvbW1hbmRzIGFmdGVyIHRhc2sgc3RhcnRlZC5cclxuICAgICAgbGV0IGNvbW1hbmRzOiBMaXN0PElDbGllbnRUYXJnZXRlZENvbW1hbmQ+ID0gR2xvYmFsQ29tbWFuZHNNYW5hZ2VyLkluc3RhbmNlLmdldENvbW1hbmRzRXhlY3V0ZWRBZnRlclRhc2tTdGFydGVkKCk7XHJcblxyXG4gICAgICBmb3IgKGxldCBjbWRJZHg6IG51bWJlciA9IDA7IGNtZElkeCA8IGNvbW1hbmRzLmxlbmd0aDsgY21kSWR4KyspIHtcclxuICAgICAgICBsZXQgY29tbWFuZDogSUNsaWVudFRhcmdldGVkQ29tbWFuZCA9IChjb21tYW5kcy5nZXRfSXRlbShjbWRJZHgpKTtcclxuICAgICAgICBpZiAoY29tbWFuZC5UYXNrVGFnID09PSB0aGlzLmdldFRhc2tUYWcoKSkge1xyXG4gICAgICAgICAgYXdhaXQgY29tbWFuZC5FeGVjdXRlKG51bGwpO1xyXG4gICAgICAgICAgR2xvYmFsQ29tbWFuZHNNYW5hZ2VyLkluc3RhbmNlLnJlbW92ZUNvbW1hbmRzRXhlY3V0ZWRBZnRlclRhc2tTdGFydGVkKGNvbW1hbmQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgZGF0YVZpZXdDb21tYW5kID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlRGF0YVZpZXdDb21tYW5kKHRoaXMuZ2V0VGFza1RhZygpLCBEYXRhVmlld0NvbW1hbmRUeXBlLlByZXBhcmUpO1xyXG4gICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLkRhdGF2aWV3TWFuYWdlci5FeGVjdXRlKGRhdGFWaWV3Q29tbWFuZCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHJlc3VsdC5TdWNjZXNzKSB7XHJcbiAgICAgIHJlc3VsdCA9IHRoaXMuVGFza1NlcnZpY2UuUHJlcGFyZVRhc2sodGhpcyk7XHJcbiAgICAgIGlmICghcmVzdWx0LlN1Y2Nlc3MpXHJcbiAgICAgICAgYXdhaXQgdGhpcy5FbmRUYXNrT25FcnJvcihyZXN1bHQsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChyZXN1bHQuU3VjY2Vzcykge1xyXG4gICAgICBkYXRhVmlld0NvbW1hbmQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVEYXRhVmlld0NvbW1hbmQodGhpcy5nZXRUYXNrVGFnKCksIERhdGFWaWV3Q29tbWFuZFR5cGUuSW5pdERhdGFDb250cm9sVmlld3MpO1xyXG4gICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLkRhdGF2aWV3TWFuYWdlci5FeGVjdXRlKGRhdGFWaWV3Q29tbWFuZCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZG8gZmlyc3QgcmVjb3JkIHByZWZpeCAmIHN1ZmZpeFxyXG4gIC8vLyAgIFRoaXMgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgb25seSBmb3IgY29ubmVjdGVkIHRhc2suXHJcbiAgLy8vICAgRm9yIG9mZmxpbmUgdGFzayB3ZSBydW4gRW50ZXJGaXJzdFJlY29yZCBmdW5jdGlvbi4gVGhlcmUgd2UgZXhlY3V0ZSBSUCBhbmQgb3BlbiBzdWJmb3Jtcy5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIGRvRmlyc3RSZWNvcmRDeWNsZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICghdGhpcy5faXNNYWluUHJnKSB7XHJcbiAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnB1c2hOZXdFeGVjU3RhY2tzKCk7XHJcbiAgICAgIHRoaXMuU3ViZm9ybUV4ZWNNb2RlID0gVGFza19TdWJmb3JtRXhlY01vZGVFbnVtLkZJUlNUX1RJTUU7XHJcbiAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFza0FuZFN1YmZvcm1SZWZyZXNoKHRoaXMsIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYLCB0aGlzLklzU3ViRm9ybSk7XHJcblxyXG4gICAgICBpZiAoIUFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpIHtcclxuICAgICAgICBpZiAodGhpcy5Jc1N1YkZvcm0pIHtcclxuICAgICAgICAgIGlmICh0aGlzLmhhc1N1YlRhc2tzKCkpXHJcbiAgICAgICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLlN1YlRhc2tzLmdldFNpemUoKTsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgbGV0IHN1YlRhc2s6IFRhc2sgPSA8VGFzaz50aGlzLlN1YlRhc2tzLmdldFRhc2soaSk7XHJcbiAgICAgICAgICAgICAgaWYgKHN1YlRhc2suSXNTdWJGb3JtKSB7XHJcbiAgICAgICAgICAgICAgICAoPE1nRm9ybT5zdWJUYXNrLmdldEZvcm0oKSkuSWdub3JlRmlyc3RSZWNvcmRDeWNsZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBzdWJUYXNrLmRvRmlyc3RSZWNvcmRDeWNsZSgpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRoaXMsIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuU3ViZm9ybUV4ZWNNb2RlID0gVGFza19TdWJmb3JtRXhlY01vZGVFbnVtLlNFVF9GT0NVUztcclxuICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIucG9wTmV3RXhlY1N0YWNrcygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiB0aGlzIHRhc2sgaXMgYSBzdWIgZm9ybSBieSBpdHMgbWdkIGRlZmluaXRpb24gKHVzZWQgb25seSB3aGlsZSBpbml0aWF0aW5nIHRhc2sgZm9yIHNldHRpbmcgaXNTdWJmb3JtKVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBDaGVja0FuZFNldFN1YkZvcm0oKTogdm9pZCB7XHJcbiAgICB0aGlzLklzU3ViRm9ybSA9ICghc3VwZXIuaXNNYWluUHJvZygpICYmIHRoaXMgIT09IHRoaXMuX21nRGF0YS5nZXRGaXJzdFRhc2soKSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgSXNSb3V0ZSgpIHtcclxuICAgIHJldHVybiAodGhpcy5Sb3V0ZXJQYXRoICE9IG51bGwpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHN0b3AgdGhlIGV4ZWN1dGlvbiBvZiBhIHByb2dyYW1cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIHN0b3AoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgdGFzazogVGFzaztcclxuICAgIGxldCBmb3JtOiBNZ0Zvcm1CYXNlID0gdGhpcy5nZXRGb3JtKCk7XHJcblxyXG4gICAgaWYgKHRoaXMuX2Fib3J0aW5nKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgaWYgKHRoaXMuaGFzU3ViVGFza3MoKSkge1xyXG4gICAgICB3aGlsZSAoKHRhc2sgPSA8VGFzaz50aGlzLlN1YlRhc2tzLmdldFRhc2soMCkpICE9IG51bGwpIHtcclxuICAgICAgICB0YXNrLnNldERlc3RpbmF0aW9uU3ViZm9ybSh0aGlzLl9kZXN0aW5hdGlvblN1YmZvcm0pO1xyXG4gICAgICAgIGF3YWl0IHRhc2suc3RvcCgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLl9pc01haW5QcmcpXHJcbiAgICAgIHRoaXMuX2Fib3J0aW5nID0gdHJ1ZTtcclxuXHJcbiAgICAvLyBpZiB0aGlzIHRhc2sgYW5kIGl0cyBwYXJlbnQgYXJlIGZyb20gZGlmZmVyZW50IE1HREFUQSBvYmplY3RzIHRoZW4gZGlzY29ubmVjdFxyXG4gICAgLy8gdGhlbSBieSByZW1vdmluZyB0aGUgcmVmZXJlbmNlIHRvIHRoaXMgdGFzayBmcm9tIGl0cyBwYXJlbnRcclxuICAgIGlmICh0aGlzLl9wYXJlbnRUYXNrICE9IG51bGwpIHtcclxuICAgICAgdGhpcy5fcGFyZW50VGFzay5yZW1vdmVTdWJUYXNrKHRoaXMpO1xyXG4gICAgICBpZiAodGhpcy5Jc1N1YkZvcm0pIHtcclxuICAgICAgICBsZXQgb2xkVGltZXJzOiBMaXN0PG51bWJlcj4gPSBuZXcgTGlzdDxudW1iZXI+KCksIG5ld1RpbWVycyA9IG5ldyBMaXN0PG51bWJlcj4oKTtcclxuICAgICAgICBsZXQgbWdkID0gdGhpcy5nZXRNR0RhdGEoKTtcclxuXHJcbiAgICAgICAgaWYgKG1nZC5nZXRUaW1lckhhbmRsZXJzKCkgIT0gbnVsbClcclxuICAgICAgICAgIG9sZFRpbWVycyA9IG1nZC5nZXRUaW1lckhhbmRsZXJzKCkuZ2V0VGltZXJzVmVjdG9yKCk7XHJcbiAgICAgICAgbWdkLnJlbW92ZVRpbWVySGFuZGxlcih0aGlzKTtcclxuICAgICAgICBtZ2QucmVtb3ZlRXhwcmVzc2lvbkhhbmRsZXIodGhpcyk7XHJcbiAgICAgICAgaWYgKG1nZC5nZXRUaW1lckhhbmRsZXJzKCkgIT0gbnVsbClcclxuICAgICAgICAgIG5ld1RpbWVycyA9IG1nZC5nZXRUaW1lckhhbmRsZXJzKCkuZ2V0VGltZXJzVmVjdG9yKCk7XHJcbiAgICAgICAgbWdkLmNoYW5nZVRpbWVycyhvbGRUaW1lcnMsIG5ld1RpbWVycyk7XHJcblxyXG4gICAgICAgIG1nZC5yZW1vdmVUYXNrKHRoaXMpO1xyXG4gICAgICAgIEdVSU1hbmFnZXIuSW5zdGFuY2UuYWJvcnQoPE1nRm9ybT50aGlzLmdldEZvcm0oKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLkFib3J0VHJhbnNhY3Rpb24oKTtcclxuXHJcbiAgICAvLyBJZiB0aGUgdGFzayBnb3QgY2xvc2VkIGR1ZSB0byBhIGNsaWNrIG9uIHNhbWUgdGFzaywgdGhlbiBzZXQgQ3VycmVudENsaWNrZWRDdHJsIHRvIG51bGxcclxuICAgIGlmICh0aGlzLmdldENsaWNrZWRDb250cm9sKCkgIT0gbnVsbClcclxuICAgICAgUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLkN1cnJlbnRDbGlja2VkQ3RybCA9IG51bGw7XHJcbiAgICBpZiAodGhpcy5Gb3JtICE9IG51bGwpXHJcbiAgICAgICg8TWdGb3JtPnRoaXMuRm9ybSkucmVtb3ZlUmVmc1RvQ3RybHMoKTtcclxuXHJcbiAgICBpZiAodGhpcy5Jc1N1YkZvcm0pIHtcclxuICAgICAgbGV0IHN1YkZvcm0gPSA8TWdDb250cm9sPnRoaXMuRm9ybS5nZXRTdWJGb3JtQ3RybCgpO1xyXG5cclxuICAgICAgc3ViRm9ybS5zZXRTdWJmb3JtVGFza0lkKG51bGwpO1xyXG4gICAgICBzdWJGb3JtLmluaXRTdWJmb3JtVGFzaygpO1xyXG5cclxuICAgICAgaWYgKExhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKSA9PT0gdGhpcylcclxuICAgICAgICBMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2Uuc2V0TGFzdEZvY3VzZWRUYXNrKHRoaXMuX3BhcmVudFRhc2spO1xyXG5cclxuICAgICAgLy8gUUNSICMzMTAxMTMuIElmIHRoZSBzdWJmb3JtIHRhc2sgZm9yIHdhcyBub3QgbG9hZGVkIHlldCwgZG8gbm90IHJlZnJlc2ggaXQuXHJcbiAgICAgIGlmIChzdWJGb3JtLlN1YmZvcm1Mb2FkZWQpXHJcbiAgICAgICAgYXdhaXQgKHN1YkZvcm0uZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9WSVNJQkxFKSkuUmVmcmVzaERpc3BsYXkodHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGNsZWFyRGF0YVZpZXdDb21tYW5kOiBJQ2xpZW50Q29tbWFuZCA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZURhdGFWaWV3Q29tbWFuZCh0aGlzLmdldFRhc2tUYWcoKSwgRGF0YVZpZXdDb21tYW5kVHlwZS5DbGVhcik7XHJcbiAgICBhd2FpdCB0aGlzLkRhdGF2aWV3TWFuYWdlci5FeGVjdXRlKGNsZWFyRGF0YVZpZXdDb21tYW5kKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gYWJvcnQgdGhlIE1nRGF0YSB0byB3aGljaCB0aGUgdGFzayBiZWxvbmdzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhYm9ydCgpOiB2b2lkIHtcclxuICAgIHRoaXMuZ2V0TUdEYXRhKCkuYWJvcnQoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgdGhlIHRhc2sgaGFzIHN1Yi10YXNrc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaGFzU3ViVGFza3MoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5TdWJUYXNrcyAhPT0gbnVsbCAmJiB0aGlzLlN1YlRhc2tzLmdldFNpemUoKSA+IDA7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQSBudW1iZXIsIDEtMjQsIHRoZSBjdXJyZW50IHRhc2sncyBkZXB0aCBpbiB0aGUgdGFzayBleGVjdXRpb24gaGllcmFyY2h5LlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJieVBhcmVudE9yZGVyXCI+aWYgdHJ1ZSwgd2UgdHJhdmVsIHRoZSBwYXJlbnRzLCBvdGhlcndpc2Ugd2UgdHJhdmVsIHRoZSB0cmlnZ2VyaW5nIHRhc2tzPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IGRlcHRoIG9mIHRoZSB0YXNrLCAxIGlmIGNhbGxlZCBmcm9tIHRoZSByb290IHRhc2s8L3JldHVybnM+XHJcbiAgZ2V0VGFza0RlcHRoKGJ5UGFyZW50T3JkZXI6IGJvb2xlYW4pOiBudW1iZXIge1xyXG4gICAgaWYgKGJ5UGFyZW50T3JkZXIpXHJcbiAgICAgIHJldHVybiB0aGlzLmdldFRhc2tEZXB0aF8oYnlQYXJlbnRPcmRlcik7XHJcblxyXG5cclxuICAgIGxldCBkZXB0aDogbnVtYmVyID0gKDxUYXNrPiB0aGlzLkdldENvbnRleHRUYXNrKCkpLmdldFRhc2tEZXB0aF8oYnlQYXJlbnRPcmRlcik7XHJcblxyXG4gICAgLy8gUUNSIDM2Njc0OCBpZiB3ZSBhcmUgaW4gYSBjb21wb25lbnQgaGFuZGxlciBhZGQgaXQgdG8gdGhlIHBhdGhcclxuICAgIGlmICh0aGlzLmlzTWFpblByb2coKSAmJiB0aGlzLmdldEN0bElkeCgpICE9PSBDb25zdEludGVyZmFjZS5UT1BfTEVWRUxfQ09OVEFJTkVSKVxyXG4gICAgICBkZXB0aCA9IGRlcHRoICsgMTtcclxuXHJcbiAgICByZXR1cm4gZGVwdGg7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgaGVscGVyIGZ1bmN0aW9uIHdoaWNoIGltcGxlbWVudHMgdGhlIGdldFRhc2tEZXB0aCByZWN1cnNpb24uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImJ5UGFyZW50T3JkZXJcIj5pZiB0cnVlLCB3ZSB0cmF2ZWwgdGhlIHBhcmVudHMsIG90aGVyd2lzZSB3ZSB0cmF2ZWwgdGhlIHRyaWdnZXJpbmcgdGFza3M8L3BhcmFtPlxyXG4gIHByaXZhdGUgZ2V0VGFza0RlcHRoXyhieVBhcmVudE9yZGVyOiBib29sZWFuKTogbnVtYmVyIHtcclxuICAgIGxldCB0bXBUYXNrOiBUYXNrID0gdGhpcy5nZXRUcmlnZ2VyaW5nVGFzaygpO1xyXG4gICAgaWYgKHRtcFRhc2sgPT0gbnVsbCB8fCBieVBhcmVudE9yZGVyKVxyXG4gICAgICBpZiAodGhpcy5fcGFyZW50VGFzayA9PSBudWxsKVxyXG4gICAgICAgIHJldHVybiAxO1xyXG4gICAgICBlbHNlIHtcclxuICAgICAgICAvKiBpZiB0aGUgY3RsSWR4IG9mIHRoZSBjdXJyZW50IHRhc2sgYW5kIHRoZSBwYXJlbnQgYXJlIGRpZmZlcmVudCwgICAqL1xyXG4gICAgICAgIC8qIHRoYXQgaXMgdGhlIGN1cnJlbnQgdGFzayBpcyBmcm9tIGEgY29tcG9uZW50LCBhZGQgdGhlIGNvbXBvbmVudCdzICovXHJcbiAgICAgICAgLyogTWFpbiBQcmcgYXMgd2VsbC4gKi9cclxuICAgICAgICBpZiAoYnlQYXJlbnRPcmRlciAmJiB0aGlzLmdldEN0bElkeCgpICE9PSB0aGlzLl9wYXJlbnRUYXNrLmdldEN0bElkeCgpKVxyXG4gICAgICAgICAgcmV0dXJuIDIgKyB0aGlzLl9wYXJlbnRUYXNrLmdldFRhc2tEZXB0aF8oYnlQYXJlbnRPcmRlcik7XHJcbiAgICAgICAgcmV0dXJuIDEgKyB0aGlzLl9wYXJlbnRUYXNrLmdldFRhc2tEZXB0aF8oYnlQYXJlbnRPcmRlcik7XHJcbiAgICAgIH1cclxuICAgIHJldHVybiAxICsgKHRtcFRhc2spLmdldFRhc2tEZXB0aF8oYnlQYXJlbnRPcmRlcik7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSBhbmNlc3RvciBvZiB0aGUgVGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJnZW5lcmF0aW9uXCI+b2YgdGhlIGFuY2VzdG9yIHRhc2s8L3BhcmFtPlxyXG4gIEdldFRhc2tBbmNlc3RvcihnZW5lcmF0aW9uOiBudW1iZXIpOiBJVGFzayB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRUYXNrQW5jZXN0b3JfKGdlbmVyYXRpb24pO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBnZXRUYXNrQW5jZXN0b3JfKGdlbmVyYXRpb246IG51bWJlcik6IElUYXNrIHtcclxuICAgIGxldCByZXRUYXNrOiBJVGFzayA9IG51bGw7XHJcblxyXG4gICAgaWYgKGdlbmVyYXRpb24gPT09IDApXHJcbiAgICAgIHJldFRhc2sgPSB0aGlzO1xyXG4gICAgZWxzZSB7XHJcbiAgICAgIGxldCB0bXBUYXNrOiBUYXNrID0gdGhpcy5nZXRUcmlnZ2VyaW5nVGFzaygpO1xyXG4gICAgICBpZiAodG1wVGFzayA9PT0gbnVsbClcclxuICAgICAgICB0bXBUYXNrID0gdGhpcy5fcGFyZW50VGFzaztcclxuICAgICAgaWYgKHRtcFRhc2sgIT09IG51bGwpXHJcbiAgICAgICAgcmV0VGFzayA9IHRtcFRhc2suZ2V0VGFza0FuY2VzdG9yXygtLWdlbmVyYXRpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXRUYXNrO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBSZXR1cm5zIHRhc2sgZGVwdGhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgR2V0VGFza0RlcHRoKCk6IG51bWJlcntcclxuICAgIHJldHVybiB0aGlzLmdldFRhc2tEZXB0aChmYWxzZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0YXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+dHJ1ZSBpZmYgdGhlIHBhdGggb2YgdGhlIGN1cnJlbnQgdGFzayBjb250YWlucyB0aGUgdGFzayBwYXNzZWQgYXMgcGFyYW1ldGVyPC9yZXR1cm5zPlxyXG4gIHBhdGhDb250YWlucyh0YXNrOiBUYXNrQmFzZSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3Rhc2tQYXRoLkNvbnRhaW5zKDxUYXNrPnRhc2spO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldHMgdGhlIGNvbnRleHQgdGFzayBvZiB0aGlzIHRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY29udGV4dFwiPnRoZSBuZXcgY29udGV4dCB0YXNrIG9mIHRoZSBjdXJyZW50IHRhc2s8L3BhcmFtPlxyXG4gIFNldENvbnRleHRUYXNrKGNvbnRleHQ6IFRhc2tCYXNlKTogdm9pZCB7XHJcbiAgICB0aGlzLkNvbnRleHRUYXNrID0gPFRhc2s+Y29udGV4dDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSB0YXNrIHdoaWNoIGlzIHRoZSBjb250ZXh0IG9mIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIGhhbmRsZXIuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBHZXRDb250ZXh0VGFzaygpOiBJVGFzayB7XHJcbiAgICBsZXQgY3VyclJlYzogUmVjb3JkID0gKCg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuZ2V0Q3VyclJlYygpKTtcclxuXHJcbiAgICBpZiAodGhpcy5JblN0YXJ0UHJvY2Vzc1xyXG4gICAgICB8fCBjdXJyUmVjICE9PSBudWxsICYmIChjdXJyUmVjLkluQ29tcHV0ZSB8fCBjdXJyUmVjLkluUmVjb21wdXRlKVxyXG4gICAgICB8fCB0aGlzLkZvcm0gIT09IG51bGwgJiYgdGhpcy5Gb3JtLmluUmVmcmVzaERpc3BsYXkoKSlcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuQ29udGV4dFRhc2s7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IGEgcmVmZXJlbmNlIHRvIHRoZSB0YXNrIHRoYXQgdHJpZ2dlcmVkIHRoZSBoYW5kbGVyIHdoaWNoIGNyZWF0ZWQgbWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldFRyaWdnZXJpbmdUYXNrKCk6IFRhc2sge1xyXG4gICAgLy8gVGhpcyBpcyBhIHNlbWkgcGF0Y2ggd2hpY2ggZml4ZXMgcHJvYmxlbXMgc3VjaCBhcyB0aGUgb25lcyBpbiBRQ1IgIzI5NjQyOFxyXG4gICAgLy8gV2hlbiBhIG1vZGFsIHRhc2sgZ2V0cyBvcGVuZWQsIGl0IG1pZ2h0IHNldCBpdHMgdHJpZ2dlcmluZyB0YXNrIHRvIGEgdGFza1xyXG4gICAgLy8gd2hvc2UgJ2Fib3J0JyBjb21tYW5kIGFycml2ZWQgYW5kIGlzIHBlbmRpbmcgZm9yIGV4ZWN1dGlvbi4gVW5kZXIgdGhlc2VcclxuICAgIC8vIGNpcmN1bXN0YW5jZXMsIHdlIG11c3QgY2hlY2sgZXZlcnkgYWNjZXNzIHRvIHRyaWdnZXJpbmdUYXNrIGFuZCBtYWtlIHN1cmVcclxuICAgIC8vIGl0IHBvaW50cyB0byBhIHZhbGlkIHRhc2suXHJcbiAgICBpZiAodGhpcy5fdHJpZ2dlcmluZ1Rhc2sgIT09IG51bGwgJiYgdGhpcy5fdHJpZ2dlcmluZ1Rhc2suZ2V0TUdEYXRhKCkuSXNBYm9ydGluZylcclxuICAgICAgdGhpcy5fdHJpZ2dlcmluZ1Rhc2sgPSB0aGlzLl9wYXJlbnRUYXNrO1xyXG5cclxuICAgIHJldHVybiB0aGlzLl90cmlnZ2VyaW5nVGFzaztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIGxhc3QgcGFya2VkIGNvbnRyb2wgaW4gdGhpcyB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj5sYXN0IGZvY3VzZWQgY29udHJvbDwvcGFyYW0+XHJcbiAgc2V0TGFzdFBhcmtlZEN0cmwoY3RybDogTWdDb250cm9sQmFzZSk6IHZvaWQge1xyXG4gICAgc3VwZXIuc2V0TGFzdFBhcmtlZEN0cmwoY3RybCk7XHJcbiAgICBMYXN0Rm9jdXNlZE1hbmFnZXIuc2V0TGFzdEZvY3VzZWRDb250cm9sKHRoaXMsIGN0cmwpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFF1ZXJ5IFRhc2sgUGF0aCBSZXR1cm5zIHRoZSB0YXNrIHBhdGggdGhhdCBsZWFkcyB0byB0aGUgY3VycmVudCB0YXNrLiBUaGUgcmVzdWx0aW5nIGFscGhhIHN0cmluZ1xyXG4gIC8vLyAgIGNvbnRhaW5zIHRoZSB0YXNrIG5hbWVzLCBhcyB3ZWxsIGFzIHRoZSBjdXJyZW50IG5hbWUgb2YgdGhlIHRhc2suIE5hbWVzIGFyZSBzZXBhcmF0ZWQgYnkgdGhlICc7J1xyXG4gIC8vLyAgIGNoYXJhY3Rlci4gRm9yIFBST0coKSB1c2luZy5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHF1ZXJ5VGFza1BhdGgoKTogU3RyaW5nQnVpbGRlciB7XHJcbiAgICBsZXQgaW5zZXJ0ZWROYW1lczogbnVtYmVyID0gMDsgICAgICAgIC8vIGhvdyBtYWNoIG5hbWVzIGluc2VydGVkIHRvIHRoZSBvdXRwdXQgc3RyaW5nXHJcbiAgICBsZXQgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIoNzkzNik7IC8vIDMxICogMjU2ICovXHJcbiAgICBsZXQgdHJlZVJvdXRlID0gbmV3IEFycmF5KHRoaXMuZ2V0VGFza0RlcHRoKGZhbHNlKSk7XHJcbiAgICB0aGlzLnBhdGhUb1Jvb3QodHJlZVJvdXRlLCBmYWxzZSk7XHJcbiAgICBmb3IgKGxldCB0c2s6IG51bWJlciA9IHRyZWVSb3V0ZS5sZW5ndGggLSAxOyB0c2sgPj0gMDsgdHNrLS0pIHtcclxuICAgICAgbGV0IGN1cnJUc2s6IFRhc2sgPSB0cmVlUm91dGVbdHNrXTtcclxuICAgICAgaWYgKGN1cnJUc2suaXNNYWluUHJvZygpKVxyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICBsZXQgbmFtZVByb3A6IFByb3BlcnR5ID0gY3VyclRzay5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX05BTUUpO1xyXG4gICAgICBpZiAobmFtZVByb3AgPT0gbnVsbClcclxuICAgICAgICBjb250aW51ZTtcclxuICAgICAgbGV0IG5hbWU6IHN0cmluZyA9IG5hbWVQcm9wLkdldENvbXB1dGVkVmFsdWUoKTtcclxuICAgICAgaWYgKCFOU3RyaW5nLklzTnVsbE9yRW1wdHkobmFtZSkpIHtcclxuICAgICAgICAvLyBpZiB0aGVyZSBpcyBvbmx5IDEgbmFtZSAtPiBkb24ndCBpbnNlcnQgJzsnXHJcbiAgICAgICAgLy8gYWZ0ZXIgbGFzdCBuYW1lIGRvbid0IGluc2VydCAnOycgdG9vLlxyXG4gICAgICAgIGlmIChpbnNlcnRlZE5hbWVzKysgIT09IDApXHJcbiAgICAgICAgICByZXN1bHQuQXBwZW5kKCc7Jyk7XHJcbiAgICAgICAgcmVzdWx0LkFwcGVuZChuYW1lKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBHZXQgRmllbGQgd2hpY2ggY29udGFpbiBpdGVtIG51bWJlciBpdG1cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGN0bF9pdG1fMl9wYXJlbnRfdmVlKGl0bTogbnVtYmVyKTogRmllbGQge1xyXG4gICAgbGV0IGN1cnJUc2s6IFRhc2s7XHJcbiAgICBsZXQgY3Vyckl0bTogbnVtYmVyID0gMDtcclxuICAgIGxldCBsYXN0SXRtOiBudW1iZXIgPSAwOyAgICAgIC8vIHN0YXJ0IG9mIHRoZSBmaWVsZCBpbiBmaWVsZGVUYWIgbnVtYmVyIGZvciBjaGVja2VkIHRhc2tcclxuICAgIC8vIHNhdmUgdGhlIHJvdXRlIHRvIHRoZSByb290IGluIHRoZSB0cmVlUm91dGUgYXJyYXlcclxuICAgIGxldCB0cmVlUm91dGUgPSBuZXcgQXJyYXkodGhpcy5nZXRUYXNrRGVwdGgodHJ1ZSkpO1xyXG4gICAgLy8gdGhlIHJvdXRlIHVwLCB0aGUgaW5zZXJ0IChvdXIgdGFzaykgaXMgWzBdLCBhbmQgZXhpdCAocm9vdCkgaXMgW3RyZWVSb3V0ZS5sZW5ndGgtMV1cclxuICAgIHRoaXMucGF0aFRvUm9vdCh0cmVlUm91dGUsIHRydWUpO1xyXG5cclxuICAgIGZvciAobGV0IHRzazogbnVtYmVyID0gdHJlZVJvdXRlLmxlbmd0aCAtIDE7IHRzayA+PSAwOyB0c2stLSkge1xyXG4gICAgICBjdXJyVHNrID0gdHJlZVJvdXRlW3Rza107XHJcblxyXG4gICAgICBjdXJySXRtICs9IGN1cnJUc2suRGF0YVZpZXcuR2V0RmllbGRzVGFiKCkuZ2V0U2l6ZSgpO1xyXG5cclxuICAgICAgLy8gZm91bmQgdGFzayB3aGljaCBjb250YWlucyB0aGUgbmVlZGVkIGZpZWxkXHJcbiAgICAgIGlmIChpdG0gPCBjdXJySXRtKSB7XHJcbiAgICAgICAgLy8gbnVtYmVyIG9mIEZpZWxkIGluIGZvdW5kIHRhc2tcclxuICAgICAgICBpdG0gLT0gbGFzdEl0bTtcclxuICAgICAgICByZXR1cm4gPEZpZWxkPmN1cnJUc2suRGF0YVZpZXcuZ2V0RmllbGQoaXRtKTtcclxuICAgICAgfVxyXG4gICAgICBsYXN0SXRtID0gY3Vyckl0bTtcclxuICAgIH1cclxuICAgIC8vIG5vdCBmb3VuZCB0aGUgZmllbGRcclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBHZXQgdGhlIGNvbnRyb2wgaWQgd2hpY2ggY29udGFpbiBmaWVsZCBhdHRhY2hlZCB0byBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpdGVtXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIEdldENvbnRyb2xJREZyb21WYXJJdGVtKGl0ZW06IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBsZXQgY3VyclRhc2s6IFRhc2s7XHJcbiAgICBsZXQgY3Vyckl0ZW06IG51bWJlciA9IDA7XHJcbiAgICBsZXQgbGFzdEl0ZW06IG51bWJlciA9IDA7ICAgLy8gc3RhcnQgb2YgdGhlIGZpZWxkIGluIGZpZWxkZVRhYiBudW1iZXIgZm9yIGNoZWNrZWQgdGFza1xyXG4gICAgbGV0IG5vT2ZDb250cm9sc0JlZm9yZUN1cnJUYXNrOiBudW1iZXIgPSAwO1xyXG5cclxuICAgIC8vIHNhdmUgdGhlIHJvdXRlIHRvIHRoZSByb290IGluIHRoZSB0cmVlUm91dGUgYXJyYXlcclxuICAgIGxldCB0cmVlUm91dGUgPSBuZXcgQXJyYXkodGhpcy5nZXRUYXNrRGVwdGgodHJ1ZSkpO1xyXG4gICAgLy8gdGhlIHJvdXRlIHVwLCB0aGUgaW5zZXJ0IChvdXIgdGFzaykgaXMgWzBdLCBhbmQgZXhpdCAocm9vdCkgaXMgW3RyZWVSb3V0ZS5sZW5ndGggLSAxXVxyXG4gICAgdGhpcy5wYXRoVG9Sb290KHRyZWVSb3V0ZSwgdHJ1ZSk7XHJcblxyXG4gICAgZm9yIChsZXQgdGFzazogbnVtYmVyID0gdHJlZVJvdXRlLmxlbmd0aCAtIDE7IHRhc2sgPj0gMDsgdGFzay0tKSB7XHJcbiAgICAgIGN1cnJUYXNrID0gdHJlZVJvdXRlW3Rhc2tdO1xyXG4gICAgICBjdXJySXRlbSArPSBjdXJyVGFzay5EYXRhVmlldy5HZXRGaWVsZHNUYWIoKS5nZXRTaXplKCk7XHJcblxyXG4gICAgICAvLyBGb3VuZCB0aGUgdGFzayB3aGljaCBjb250YWlucyB0aGUgbmVlZGVkIGNvbnRyb2wgJiBmaWVsZFxyXG4gICAgICBpZiAoaXRlbSA8IGN1cnJJdGVtKSB7XHJcbiAgICAgICAgLy8gTnVtYmVyIG9mIGZpZWxkcyBpbiBmb3VuZCB0YXNrXHJcbiAgICAgICAgaXRlbSAtPSBsYXN0SXRlbTtcclxuXHJcbiAgICAgICAgbGV0IGZpZWxkOiBGaWVsZCA9IDxGaWVsZD5jdXJyVGFzay5EYXRhVmlldy5nZXRGaWVsZChpdGVtKTtcclxuICAgICAgICBpZiAoZmllbGQuZ2V0Q3RybCgpICE9IG51bGwpXHJcbiAgICAgICAgICByZXR1cm4gbm9PZkNvbnRyb2xzQmVmb3JlQ3VyclRhc2sgPSBub09mQ29udHJvbHNCZWZvcmVDdXJyVGFzayArIGN1cnJUYXNrLkZvcm0uZ2V0Q29udHJvbElkeChmaWVsZC5nZXRDdHJsKCkpICsgMTtcclxuXHJcbiAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChjdXJyVGFzay5Gb3JtICE9IG51bGwpXHJcbiAgICAgICAgbm9PZkNvbnRyb2xzQmVmb3JlQ3VyclRhc2sgKz0gY3VyclRhc2suRm9ybS5nZXRDdHJsQ291bnQoKTtcclxuXHJcbiAgICAgIGxhc3RJdGVtID0gY3Vyckl0ZW07XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ29udHJvbCBhdHRhY2hlZCB0byB0aGUgdmFyaWFibGUgaW4gc2FtZSB0YXNrIG5vdCBmb3VuZFxyXG4gICAgcmV0dXJuIDA7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEdldCB0aGUgY29udHJvbCBmcm9tIGNvbnRyb2xJRFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY29udHJvbElEXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIEdldENvbnRyb2xGcm9tQ29udHJvbElEKGNvbnRyb2xJRDogbnVtYmVyLCBwYXJlbnQ6IFJlZlBhcmFtPG51bWJlcj4pOiBNZ0NvbnRyb2wge1xyXG4gICAgbGV0IGNvbnRyb2w6IE1nQ29udHJvbCA9IG51bGw7XHJcbiAgICBwYXJlbnQudmFsdWUgPSAtMTtcclxuXHJcbiAgICBpZiAoY29udHJvbElEID49IDApIHtcclxuICAgICAgbGV0IGN1cnJUYXNrOiBUYXNrID0gbnVsbDtcclxuICAgICAgbGV0IGNhbGxlclRhc2s6IFRhc2sgPSBudWxsO1xyXG4gICAgICBsZXQgbm9PZkNvbnRyb2xzSW5DdXJydGFzazogbnVtYmVyID0gMDtcclxuICAgICAgbGV0IG5vT2ZDb250cm9sc0JlZm9yZUN1cnJUYXNrOiBudW1iZXIgPSAwO1xyXG4gICAgICBsZXQgY29udHJvbElkeDogbnVtYmVyID0gMDtcclxuXHJcbiAgICAgIC8vIHNhdmUgdGhlIHJvdXRlIHRvIHRoZSByb290IGluIHRoZSB0cmVlUm91dGUgYXJyYXlcclxuICAgICAgbGV0IHRyZWVSb3V0ZSA9IG5ldyBBcnJheSh0aGlzLmdldFRhc2tEZXB0aCh0cnVlKSk7XHJcblxyXG4gICAgICAvLyB0aGUgcm91dGUgdXAsIHRoZSBpbnNlcnQgKG91ciB0YXNrKSBpcyBbMF0sIGFuZCBleGl0IChyb290KSBpcyBbdHJlZVJvdXRlLmxlbmd0aCAtIDFdXHJcbiAgICAgIHRoaXMucGF0aFRvUm9vdCh0cmVlUm91dGUsIHRydWUpO1xyXG5cclxuICAgICAgZm9yIChsZXQgdGFzazogbnVtYmVyID0gdHJlZVJvdXRlLmxlbmd0aCAtIDE7IHRhc2sgPj0gMDsgdGFzay0tKSB7XHJcblxyXG4gICAgICAgIGN1cnJUYXNrID0gdHJlZVJvdXRlW3Rhc2tdO1xyXG5cclxuICAgICAgICBpZiAoY3VyclRhc2suRm9ybSAhPSBudWxsKSB7XHJcbiAgICAgICAgICBub09mQ29udHJvbHNJbkN1cnJ0YXNrID0gY3VyclRhc2suRm9ybS5nZXRDdHJsQ291bnQoKTtcclxuXHJcbiAgICAgICAgICAvLyBGb3VuZCB0aGUgdGFzayB3aGljaCBjb250YWlucyB0aGUgbmVlZGVkIGNvbnRyb2xcclxuICAgICAgICAgIGlmIChjb250cm9sSUQgPCAobm9PZkNvbnRyb2xzQmVmb3JlQ3VyclRhc2sgKyBub09mQ29udHJvbHNJbkN1cnJ0YXNrKSkge1xyXG4gICAgICAgICAgICAvLyBJZHggb2YgdGhlIGNvbnRyb2wgaW4gY3VycmVudCB0YXNrXHJcbiAgICAgICAgICAgIGNvbnRyb2xJZHggPSBjb250cm9sSUQgLSBub09mQ29udHJvbHNCZWZvcmVDdXJyVGFzaztcclxuICAgICAgICAgICAgY29udHJvbCA9IDxNZ0NvbnRyb2w+Y3VyclRhc2suRm9ybS5DdHJsVGFiLmdldEN0cmwoY29udHJvbElkeCk7XHJcbiAgICAgICAgICAgIGNhbGxlclRhc2sgPSBjdXJyVGFzaztcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgbm9PZkNvbnRyb2xzQmVmb3JlQ3VyclRhc2sgKz0gbm9PZkNvbnRyb2xzSW5DdXJydGFzaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIEdldCBwYXJlbnRcclxuICAgICAgaWYgKGNvbnRyb2wgIT0gbnVsbCkge1xyXG4gICAgICAgIHBhcmVudC52YWx1ZSA9IDA7XHJcbiAgICAgICAgbGV0IHByZXZDdGxJZHg6IG51bWJlciA9IHRyZWVSb3V0ZVswXS5UYXNrRGVmaW5pdGlvbklkLkN0bEluZGV4O1xyXG5cclxuICAgICAgICBmb3IgKGxldCB0YXNrOiBudW1iZXIgPSAwOyB0YXNrIDwgdHJlZVJvdXRlLmxlbmd0aCAtIDE7IHRhc2srKykge1xyXG4gICAgICAgICAgY3VyclRhc2sgPSB0cmVlUm91dGVbdGFza107XHJcblxyXG4gICAgICAgICAgaWYgKHByZXZDdGxJZHggIT09IGN1cnJUYXNrLlRhc2tEZWZpbml0aW9uSWQuQ3RsSW5kZXgpXHJcbiAgICAgICAgICAgIHBhcmVudC52YWx1ZSsrO1xyXG5cclxuICAgICAgICAgIGlmIChjYWxsZXJUYXNrLlRhc2tEZWZpbml0aW9uSWQuQ3RsSW5kZXggPT09IGN1cnJUYXNrLlRhc2tEZWZpbml0aW9uSWQuQ3RsSW5kZXgpXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIHByZXZDdGxJZHggPSBjdXJyVGFzay5UYXNrRGVmaW5pdGlvbklkLkN0bEluZGV4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIENvbnRyb2wgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIENvbnRyb2xJRFxyXG4gICAgcmV0dXJuIGNvbnRyb2w7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBjdGxfaXRtXzRfcGFyZW50X3ZlZShwYXJlbnQ6IG51bWJlciwgdmVlOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgbGV0IHRzazogVGFzaztcclxuICAgIGxldCBkZXB0aDogbnVtYmVyID0gdGhpcy5nZXRUYXNrRGVwdGgodHJ1ZSk7XHJcblxyXG4gICAgaWYgKHBhcmVudCAhPT0gVGFza0Jhc2UuTUFJTl9QUkdfUEFSRU5UX0lEICYmIGRlcHRoIDw9IHBhcmVudClcclxuICAgICAgcmV0dXJuIHZlZTtcclxuXHJcbiAgICBsZXQgdHJlZVJvdXRlID0gbmV3IEFycmF5KGRlcHRoKTtcclxuXHJcbiAgICBpZiAodmVlICE9PSAwKSB7XHJcbiAgICAgIHRoaXMucGF0aFRvUm9vdCh0cmVlUm91dGUsIHRydWUpO1xyXG5cclxuICAgICAgLy8gZ2V0IHRoZSBpbmRleCBvZiBwYXJlbnQgaW4gdGhlIHRhc2sgdHJlZVxyXG4gICAgICBsZXQgaW5kT2ZQYXJlbnRJblRhc2tUcmVlOiBudW1iZXIgPSB0aGlzLmdldEluZE9mUGFyZW50SW5UYXNrVHJlZShwYXJlbnQsIHRyZWVSb3V0ZSk7XHJcblxyXG4gICAgICBsZXQgaTogbnVtYmVyO1xyXG4gICAgICBmb3IgKGkgPSB0cmVlUm91dGUubGVuZ3RoIC0gMTsgaSA+IGluZE9mUGFyZW50SW5UYXNrVHJlZTsgaS0tKSB7XHJcbiAgICAgICAgdHNrID0gdHJlZVJvdXRlW2ldO1xyXG4gICAgICAgIHZlZSArPSB0c2suRGF0YVZpZXcuR2V0RmllbGRzVGFiKCkuZ2V0U2l6ZSgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwYXJlbnRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFza1RyZWVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgZ2V0SW5kT2ZQYXJlbnRJblRhc2tUcmVlKHBhcmVudDogbnVtYmVyLCB0YXNrVHJlZTogVGFza1tdKTogbnVtYmVyIHtcclxuICAgIGxldCBpbmRPZlBhcmVudEluVGFza1RyZWU6IG51bWJlciA9IDA7XHJcbiAgICBpZiAocGFyZW50ID09PSBUYXNrQmFzZS5NQUlOX1BSR19QQVJFTlRfSUQpIHtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMTsgaSA8IHRhc2tUcmVlLmxlbmd0aDsgaSA9IGkgKyAxKSB7XHJcbiAgICAgICAgaWYgKHRhc2tUcmVlW2ldLmlzTWFpblByb2coKSAmJiB0aGlzLl9jdGxJZHggPT09IHRhc2tUcmVlW2ldLmdldEN0bElkeCgpKSB7XHJcbiAgICAgICAgICBpbmRPZlBhcmVudEluVGFza1RyZWUgPSBpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgIGluZE9mUGFyZW50SW5UYXNrVHJlZSA9IHBhcmVudDtcclxuXHJcbiAgICByZXR1cm4gaW5kT2ZQYXJlbnRJblRhc2tUcmVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGVudHJ5IHBvaW50IHRvIHRoZSByZWN1cnNpb24gaW5kdWNlZCBieSBnZXRGaWVsZEJ5TmFtZV8uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IGEgZmllbGQgd2hpY2ggYmVsb25ncyB0byBtZSBvciB0byBteSBwYXJlbnRzIHdpdGggdGhlIG1hdGNoaW5nIG5hbWU8L3JldHVybnM+XHJcbiAgZ2V0RmllbGRCeU5hbWUoZmxkTmFtZTogc3RyaW5nKTogRmllbGQge1xyXG4gICAgcmV0dXJuICg8VGFzaz4gKHRoaXMuR2V0Q29udGV4dFRhc2soKSkpLmdldEZpZWxkQnlOYW1lXyhmbGROYW1lKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBmaW5kIGZpZWxkIHdpdGggdGhlIG5hbWUgaW4gdGFzayBvciBpdHMgYW5jZXN0b3JzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZsZE5hbWVcIj5uYW1lLCB0aGUgbmFtZSBjYW4gYmUgZW1wdHkgc3RyaW5nIHRvbzwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBJZiB0aGUgdmFyaWFibGUgbmFtZSBpcyBub3QgZm91bmQgdGhlbiB0aGUgZnVuY3Rpb24gd2lsbCByZXR1cm4gTlVMTC48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBnZXRGaWVsZEJ5TmFtZV8oZmxkTmFtZTogc3RyaW5nKTogRmllbGR7XHJcbiAgICBsZXQgdG1wVGFzazogVGFzaztcclxuXHJcbiAgICBpZiAoZmxkTmFtZSA9PSBudWxsKVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIGxldCBmbGQ6IEZpZWxkID0gdGhpcy5nZXRGaWVsZChmbGROYW1lKTtcclxuXHJcbiAgICAvLyBpZiB0aGUgZmllbGQgaXMgbm90IG91cnMgLSByZWN1cnNpdmUgY2hlY2sgdGhlIGFuY2VzdG9yc1xyXG4gICAgaWYgKGZsZCA9PSBudWxsKSB7XHJcbiAgICAgIHRtcFRhc2sgPSB0aGlzLmdldFRyaWdnZXJpbmdUYXNrKCkgIT0gbnVsbCA/IHRoaXMuZ2V0VHJpZ2dlcmluZ1Rhc2soKSA6IHRoaXMuX3BhcmVudFRhc2s7XHJcblxyXG4gICAgICBpZiAodG1wVGFzayAhPSBudWxsKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzTWFpblByb2coKSAmJiB0aGlzLmdldEN0bElkeCgpICE9PSB0bXBUYXNrLmdldEN0bElkeCgpKSB7XHJcbiAgICAgICAgICBsZXQgbWFpblByZzogVGFzayA9IDxUYXNrPkFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5HZXRNYWluUHJvZ0J5Q3RsSWR4KC0xLCB0aGlzLmdldEN0bElkeCgpKTtcclxuICAgICAgICAgIGZsZCA9IG1haW5QcmcuZ2V0RmllbGRCeU5hbWVfKGZsZE5hbWUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGZsZCA9PSBudWxsKVxyXG4gICAgICAgICAgZmxkID0gdG1wVGFzay5nZXRGaWVsZEJ5TmFtZV8oZmxkTmFtZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmbGQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IGluZGV4IG9mIHRoZSBmaWVsZCBpbiB0aGUgdGFzayBvciBpdHMgYW5jZXN0b3JzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZsZE5hbWVcIj5uYW1lPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IElmIHRoZSB2YXJpYWJsZSBuYW1lIGlzIG5vdCBmb3VuZCB0aGVuIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gWmVyby48L3JldHVybnM+XHJcbiAgZ2V0SW5kZXhPZkZpZWxkQnlOYW1lKGZsZE5hbWU6IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICBsZXQgZGVwdGg6IG51bWJlciA9IHRoaXMuZ2V0VGFza0RlcHRoKHRydWUpO1xyXG4gICAgbGV0IGluZGV4OiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IGZsZDogRmllbGQgPSB0aGlzLmdldEZpZWxkQnlOYW1lKGZsZE5hbWUpO1xyXG4gICAgbGV0IGZsZFRhYjogRmllbGRzVGFibGU7XHJcblxyXG4gICAgaWYgKGZsZCA9PSBudWxsKVxyXG4gICAgICByZXR1cm4gMDtcclxuXHJcbiAgICBsZXQgdHJlZVJvdXRlID0gbmV3IEFycmF5KGRlcHRoKTtcclxuICAgIHRoaXMucGF0aFRvUm9vdCh0cmVlUm91dGUsIHRydWUpO1xyXG4gICAgZm9yIChsZXQgY3VycjogbnVtYmVyID0gZGVwdGggLSAxOyBjdXJyID49IDA7IGN1cnItLSkge1xyXG4gICAgICBsZXQgY3VyclRhc2s6IFRhc2sgPSB0cmVlUm91dGVbY3Vycl07XHJcbiAgICAgIGlmIChjdXJyVGFzayA9PT0gZmxkLmdldFRhc2soKSkge1xyXG4gICAgICAgIGN1cnIgPSBmbGQuZ2V0SWQoKTtcclxuICAgICAgICBpbmRleCArPSArK2N1cnI7ICAgICAgICAgLy8gc3RhcnQgaW5kZXggaW4gTWFnaWMgZnJvbSAxIGFuZCBub3QgZnJvbSAwXHJcbiAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgIC8vIGdldCBvdXQgb2YgdGhlIHRhc2sgdHJlZSAtIHRoZSBpbmRleCBpcyBmb3VuZFxyXG4gICAgICB9XHJcbiAgICAgIGZsZFRhYiA9IDxGaWVsZHNUYWJsZT5jdXJyVGFzay5EYXRhVmlldy5HZXRGaWVsZHNUYWIoKTtcclxuICAgICAgaW5kZXggKz0gZmxkVGFiLmdldFNpemUoKTtcclxuICAgIH1cclxuICAgIHJldHVybiBpbmRleDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjYWxjdWxhdGUgdGhlIHBhdGggZnJvbSB0aGlzIHRhc2sgdG8gdGhlIHJvb3Qgb2YgdGhlIHRhc2tzIHRyZWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicGF0aFwiPmFycmF5IG9mIHRhc2tzLCB0aGUgcm91dGUgdXAuIFRoZSAwIGl0ZW0gaXMgc3RhcnQgcG9pbnQgdGFzazwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJieVBhcmVudE9yZGVyXCI+aWYgdHJ1ZSwgd2UgdHJhdmVsIHRoZSBwYXJlbnRzLCBvdGhlcndpc2Ugd2UgdHJhdmVsIHRoZSB0cmlnZ2VyaW5nIHRhc2tzPC9wYXJhbT5cclxuICBwYXRoVG9Sb290KHBhdGg6IFRhc2tbXSwgYnlQYXJlbnRPcmRlcjogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgbGV0IHRhc2s6IFRhc2sgPSAoYnlQYXJlbnRPcmRlciA/IHRoaXMgOiA8VGFzaz4gdGhpcy5HZXRDb250ZXh0VGFzaygpKTtcclxuXHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykge1xyXG4gICAgICBwYXRoW2ldID0gdGFzaztcclxuICAgICAgbGV0IGN0bElkeDogbnVtYmVyID0gdGFzay5nZXRDdGxJZHgoKTtcclxuXHJcbiAgICAgIGxldCB0bXBUYXNrOiBUYXNrID0gYnlQYXJlbnRPcmRlciA/IG51bGwgOiB0YXNrLmdldFRyaWdnZXJpbmdUYXNrKCk7XHJcblxyXG4gICAgICBpZiAodG1wVGFzayAhPSBudWxsKVxyXG4gICAgICAgIHRhc2sgPSB0bXBUYXNrO1xyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0YXNrID0gPFRhc2s+dGFzay5nZXRQYXJlbnQoKTtcclxuXHJcbiAgICAgICAgaWYgKHRhc2sgPT0gbnVsbCkge1xyXG4gICAgICAgICAgLy8gUUNSIDM2Njc0OCBpZiB3ZSBhcmUgaW4gYSBjb21wb25lbnQgZ2xvYmFsIGhhbmRsZXIgYWRkIGl0IHRvIHRoZSBwYXRoXHJcbiAgICAgICAgICBpZiAoIWJ5UGFyZW50T3JkZXIgJiYgdGhpcy5pc01haW5Qcm9nKCkgJiYgdGhpcy5nZXRDdGxJZHgoKSAhPT0gQ29uc3RJbnRlcmZhY2UuVE9QX0xFVkVMX0NPTlRBSU5FUilcclxuICAgICAgICAgICAgcGF0aFtpICsgMV0gPSB0aGlzO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoYnlQYXJlbnRPcmRlciAmJiBjdGxJZHggIT09IHRhc2suZ2V0Q3RsSWR4KCkpXHJcbiAgICAgICAgICBwYXRoWysraV0gPSA8VGFzaz5BY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuR2V0TWFpblByb2dCeUN0bElkeCgtMSwgY3RsSWR4KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNoZWNrIGlmIHRoaXMgdGFzayBzaG91bGQgYmUgcmVmcmVzaGVkIC0gY29tcGFyZSB0aGUgXCJyZWZyZXNoIG9uXCIgZmllbGRzIG9mIHRoZSBjdXJyZW50IHJlY29yZCB0byB0aGVcclxuICAvLy8gICBwcmV2aW91cyByZWNvcmQgYW5kIGlmIGRpZmZlcmVudCB2YWx1ZXMgYXJlIGZvdW5kIHJldHVybnMgdHJ1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBzaG91bGRCZVJlZnJlc2hlZCgpOiBib29sZWFuIHtcclxuICAgIGxldCBkYXRhVmlldzogRGF0YVZpZXcgPSA8RGF0YVZpZXc+dGhpcy5fcGFyZW50VGFzay5EYXRhVmlldztcclxuICAgIGxldCByZXN1bHQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvLyBwcmV2Q3VyclJlYyBpcyBudWxsIG9ubHkgaWYgaXQgaXMgdGhlIGZpcnN0IHRpbWUgb3IgYWZ0ZXIgQ2FuY2VsLlxyXG4gICAgLy8gQWZ0ZXIgQ2FuY2VsIGluIHRoZSBwYXJlbnQgdGFzayBTdWJmb3JtIHJlZnJlc2ggbXVzdCBiZSBkb25lIGFsd2F5c1xyXG4gICAgaWYgKHRoaXMuX3BhcmVudFRhc2sgPT09IG51bGwgfHwgZGF0YVZpZXcuaXNQcmV2Q3VyclJlY051bGwoKSB8fFxyXG4gICAgICAodGhpcy5SZWZyZXNoT25WYXJzICE9PSBudWxsICYmICFkYXRhVmlldy5jdXJyRXF1YWxzUHJldih0aGlzLlJlZnJlc2hPblZhcnMpKSlcclxuICAgICAgcmVzdWx0ID0gdHJ1ZTtcclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiB0aGUgc3ViVGFza3MgKHN1YmZvcm1zKSBzaG91bGQgYmUgcmVmcmVzaGVkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyBDaGVja1JlZnJlc2hTdWJUYXNrcygpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCByZXQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvLyBkbyBub3QgcmVmcmVzaCBzdWJmb3JtcyBiZWZvcmUgdGhlIGZpcnN0IHJlY29yZCBwcmVmaXguIFRoZSBzZXJ2ZXIgc2VudCB1cyB0aGVpciBkYXRhdmlldyFcclxuICAgIGlmICh0aGlzLl9lbnRlcmVkUmVjTGV2ZWwpIHtcclxuICAgICAgbGV0IHN1YmZvcm1zVG9SZWZyZXNoOiBMaXN0PFRhc2s+ID0gYXdhaXQgdGhpcy5HZXRTdWJmb3Jtc1RvUmVmcmVzaCgpO1xyXG5cclxuICAgICAgaWYgKHN1YmZvcm1zVG9SZWZyZXNoLmxlbmd0aCA+IDApXHJcbiAgICAgICAgcmV0ID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEdldHMgYSBsaXN0IG9mIHN1YnRhc2tzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+YSBsaXN0IG9mIHN1YnRhc2tzPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgR2V0U3ViVGFza3MoKTogTGlzdDxUYXNrPiB7XHJcbiAgICBsZXQgc3ViVGFza3M6IExpc3Q8VGFzaz4gPSBuZXcgTGlzdDxUYXNrPigpO1xyXG5cclxuICAgIGlmICh0aGlzLmhhc1N1YlRhc2tzKCkpIHtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuU3ViVGFza3MuZ2V0U2l6ZSgpOyBpID0gaSArIDEpXHJcbiAgICAgICAgc3ViVGFza3MucHVzaCg8VGFzaz50aGlzLlN1YlRhc2tzLmdldFRhc2soaSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBzdWJUYXNrcztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gR2V0cyBhIGxpc3Qgb2YgdGhvc2Ugc3ViZm9ybXMgdGhhdCBtdXN0IGJlIHJlZnJlc2hlZC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz5saXN0IG9mIHN1YmZvcm1zIHRvIHJlZnJlc2g8L3JldHVybnM+XHJcbiAgYXN5bmMgR2V0U3ViZm9ybXNUb1JlZnJlc2goKTogUHJvbWlzZTxMaXN0PFRhc2s+PiB7XHJcbiAgICBsZXQgc3ViVGFza3M6IExpc3Q8VGFzaz4gPSB0aGlzLkdldFN1YlRhc2tzKCk7XHJcbiAgICBsZXQgc3ViVGFza3NUb1JlZnJlc2g6IExpc3Q8VGFzaz4gPSBuZXcgTGlzdDxUYXNrPigpO1xyXG5cclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBzdWJUYXNrcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgc3ViVGFzazogVGFzayA9IHN1YlRhc2tzLmdldF9JdGVtKGkpO1xyXG4gICAgICBpZiAoYXdhaXQgdGhpcy5TaG91bGRSZWZyZXNoU3ViZm9ybVRhc2soc3ViVGFzaykpXHJcbiAgICAgICAgc3ViVGFza3NUb1JlZnJlc2gucHVzaChzdWJUYXNrKVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBzdWJUYXNrc1RvUmVmcmVzaDtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIENoZWNrIGlmIHRoZSBzcGVjaWZpYyBzdWJmb3JtIG11c3QgYmUgcmVmcmVzaGVkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzdWJUYXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGFzeW5jIFNob3VsZFJlZnJlc2hTdWJmb3JtVGFzayhzdWJUYXNrOiBUYXNrKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgcmVmcmVzaDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IHN1YmZvcm1DdHJsOiBNZ0NvbnRyb2wgPSA8TWdDb250cm9sPnN1YlRhc2suZ2V0Rm9ybSgpLmdldFN1YkZvcm1DdHJsKCk7XHJcblxyXG4gICAgc3ViVGFzay5Eb1N1YmZvcm1QcmVmaXhTdWZmaXggPSBmYWxzZTtcclxuICAgIC8vIERlZmVjdCA3Njk3OS4gU3ViZm9ybSBjYW4gZXhlY3V0ZSByZWZyZXNoIG9ubHkgYWZ0ZXIgaXQgaGFzIFRhc2tWaWV3LlxyXG4gICAgaWYgKHN1YmZvcm1DdHJsICE9IG51bGwgJiYgIXN1YlRhc2suSW5TZWxlY3QgJiYgc3ViVGFzay5BZnRlckZpcnN0UmVjb3JkUHJlZml4KSB7XHJcbiAgICAgIGxldCBwYXJlbnRNb2RlOiBzdHJpbmcgPSB0aGlzLmdldE1vZGUoKTtcclxuICAgICAgbGV0IG1vZGVQcm9wZXJ0eTogbnVtYmVyID0gKHBhcmVudE1vZGUgPT09IENvbnN0YW50cy5UQVNLX01PREVfUVVFUlkgPyBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19RVUVSWVxyXG4gICAgICAgIDogcGFyZW50TW9kZSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9NT0RJRllcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19NT0RJRllcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19DUkVBVEUpO1xyXG5cclxuICAgICAgLy8gRm9yIGEgc3ViZm9ybSB3aXRoICdBc1BhcmVudCcgbW9kZSB3ZSBhbHNvIG11c3QgcmVmcmVzaCB0aGUgc3ViZm9ybVxyXG4gICAgICAvLyBhZnRlciB0aGUgcGFyZW50IHJlY29yZCBwcmVmaXguIElmIHRoZSBzcGVjaWZpYyBtb2RlIGlzIG5vdCBhbGxvd2VkXHJcbiAgICAgIC8vIHRoZSBzdWJmb3JtIGNvbnRpbnVlcyBpbiB0aGUgb2xkIG1vZGUuXHJcbiAgICAgIGlmIChzdWJUYXNrLk1vZGVBc1BhcmVudCAmJiBwYXJlbnRNb2RlICE9PSBzdWJUYXNrLmdldE1vZGUoKSAmJlxyXG4gICAgICAgIHRoaXMuZ2V0TGV2ZWwoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfUkVDT1JEICYmXHJcbiAgICAgICAgYXdhaXQgKHN1YlRhc2suZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19PUFRJT04pKS5nZXRWYWx1ZUJvb2xlYW4oKSAmJlxyXG4gICAgICAgIGF3YWl0IHN1YlRhc2suY2hlY2tQcm9wKG1vZGVQcm9wZXJ0eSwgdHJ1ZSkpIHtcclxuICAgICAgICBpZiAoIXN1YmZvcm1DdHJsLmlzVmlzaWJsZSgpICYmXHJcbiAgICAgICAgICAhYXdhaXQgc3ViZm9ybUN0cmwuY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1JFRlJFU0hfV0hFTl9ISURERU4sIGZhbHNlKSkge1xyXG4gICAgICAgICAgc3ViZm9ybUN0cmwuUmVmcmVzaE9uVmlzaWJsZSA9IHRydWU7XHJcbiAgICAgICAgICByZWZyZXNoID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHJlZnJlc2ggPSB0cnVlO1xyXG5cclxuICAgICAgICBhd2FpdCBzdWJUYXNrLlNldE1vZGVBc1BhcmVudChwYXJlbnRNb2RlKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICByZWZyZXNoID0gYXdhaXQgc3ViZm9ybUN0cmwuY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FVVE9fUkVGUkVTSCwgdHJ1ZSkgJiYgc3ViVGFzay5zaG91bGRCZVJlZnJlc2hlZCgpO1xyXG5cclxuICAgICAgICBpZiAocmVmcmVzaCkge1xyXG4gICAgICAgICAgaWYgKCFzdWJmb3JtQ3RybC5pc1Zpc2libGUoKSAmJlxyXG4gICAgICAgICAgICAhYXdhaXQgc3ViZm9ybUN0cmwuY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1JFRlJFU0hfV0hFTl9ISURERU4sIGZhbHNlKSkge1xyXG4gICAgICAgICAgICBzdWJmb3JtQ3RybC5SZWZyZXNoT25WaXNpYmxlID0gdHJ1ZTtcclxuICAgICAgICAgICAgcmVmcmVzaCA9IGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHJlZnJlc2gpXHJcbiAgICAgICAgc3ViVGFzay5Eb1N1YmZvcm1QcmVmaXhTdWZmaXggPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlZnJlc2g7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFNldHMgdGhlIHRhc2sgbW9kZSBhcyBwYXJlbnQgbW9kZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicGFyZW50TW9kZVwiPjwvcGFyYW0+XHJcbiAgYXN5bmMgU2V0TW9kZUFzUGFyZW50KHBhcmVudE1vZGU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5lbmFibGVNb2RlcygpO1xyXG5cclxuICAgIGlmIChwYXJlbnRNb2RlID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSkge1xyXG4gICAgICBsZXQgY21kOiBJQ2xpZW50Q29tbWFuZCA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZUV2ZW50Q29tbWFuZCh0aGlzLmdldFRhc2tUYWcoKSwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUT19DUkVBVEUpO1xyXG4gICAgICBhd2FpdCB0aGlzLkRhdGF2aWV3TWFuYWdlci5FeGVjdXRlKGNtZCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0aGlzLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpIHtcclxuICAgICAgdGhpcy5zZXRQcmV2ZW50UmVjb3JkU3VmZml4KHRydWUpO1xyXG4gICAgICB0aGlzLnNldFByZXZlbnRDb250cm9sQ2hhbmdlKHRydWUpO1xyXG4gICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGhpcywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1JFRlJFU0hfVklFVyk7XHJcbiAgICAgIHRoaXMuc2V0UHJldmVudFJlY29yZFN1ZmZpeChmYWxzZSk7XHJcbiAgICAgIHRoaXMuc2V0UHJldmVudENvbnRyb2xDaGFuZ2UoZmFsc2UpO1xyXG4gICAgICBsZXQgc3ViVGFza0R2OiBEYXRhVmlldyA9IDxEYXRhVmlldz50aGlzLkRhdGFWaWV3O1xyXG4gICAgICBpZiAoIXN1YlRhc2tEdi5pc0VtcHR5KCkgJiYgKHN1YlRhc2tEdi5nZXRDdXJyUmVjKCkpLmdldE1vZGUoKSAhPT0gRGF0YU1vZGlmaWNhdGlvblR5cGVzLkluc2VydClcclxuICAgICAgICB0aGlzLnNldE1vZGUocGFyZW50TW9kZSk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICB0aGlzLnNldE1vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpO1xyXG4gICAgICBhd2FpdCAoPE1nRm9ybT50aGlzLmdldEZvcm0oKSkuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9DVVJSX1JFQyk7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuc2V0TW9kZShwYXJlbnRNb2RlKTtcclxuXHJcbiAgICB0aGlzLnNldE9yaWdpbmFsVGFza01vZGUocGFyZW50TW9kZSk7XHJcbiAgICBhd2FpdCB0aGlzLnNldENyZWF0ZURlbGV0ZUFjdHNFbmFibGVTdGF0ZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8gYWZ0ZXIgY29tcHV0ZSBkbyBzdWJmb3JtIHRhc2sgcmVjb3JkIHByZWZpeCAmIHN1ZmZpeFxyXG4gIGFzeW5jIGRvU3ViZm9ybVJlY1ByZWZpeFN1ZmZpeCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBzdWJUYXNrczogTGlzdDxUYXNrPiA9IHRoaXMuR2V0U3ViVGFza3MoKTtcclxuXHJcblxyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHN1YlRhc2tzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBzdWJUYXNrOiBUYXNrID0gc3ViVGFza3MuZ2V0X0l0ZW0oaSk7XHJcbiAgICAgIGlmIChzdWJUYXNrLkRvU3ViZm9ybVByZWZpeFN1ZmZpeCkge1xyXG4gICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFza0FuZFN1YmZvcm1SZWZyZXNoKHN1YlRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYLCB0cnVlKTtcclxuICAgICAgICBpZiAoIUFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpXHJcbiAgICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2soc3ViVGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IENsZWFuIGZsYWcgZm9yIFN1YmZvcm0gcmVjb3JkIGN5Y2xlIDwvc3VtbWFyeT5cclxuICBDbGVhbkRvU3ViZm9ybVByZWZpeFN1ZmZpeCgpOiB2b2lkIHtcclxuICAgIGxldCBzdWJUYXNrczogTGlzdDxUYXNrPiA9IHRoaXMuR2V0U3ViVGFza3MoKTtcclxuXHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgc3ViVGFza3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IHN1YlRhc2s6IFRhc2sgPSBzdWJUYXNrcy5nZXRfSXRlbShpKTtcclxuICAgICAgc3ViVGFzay5Eb1N1YmZvcm1QcmVmaXhTdWZmaXggPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgdGhlIHRhc2sgbXVzdCBkaXNwbGF5IGNvbmZpcm1hdGlvbiB3aW5kb3cgcHJpb3IgdG8gZGVsZXRpbmcgYSByZWNvcmQuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBtdXN0Q29uZmlybUluRGVsZXRlTW9kZSgpOiBib29sZWFuIHtcclxuICAgIGxldCBwcm9wOiBQcm9wZXJ0eSA9IHRoaXMuZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DT05GSVJNX1VQREFURSk7XHJcblxyXG4gICAgLy8gQXMgc3RyYW5nZSBhcyBpdCBzb3VuZHMsIGlmIHRoZSBwcm9wZXJ0eSBpcyBhbiBleHByZXNzaW9uIHdoaWNoIGV2YWx1YXRlcyB0b1xyXG4gICAgLy8gRmFsc2UsIHRoZW4gbm8gbmVlZCB0byBkaXNwbGF5IGNvbmZpcm1hdGlvbi4uLlxyXG4gICAgcmV0dXJuICFwcm9wLmlzRXhwcmVzc2lvbigpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGFkZCBhIHN1Yi10YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInN1YlRhc2tcIj50aGUgc3ViIHRhc2sgdG8gYWRkPC9wYXJhbT5cclxuICBhZGRTdWJUYXNrKHN1YlRhc2s6IFRhc2spOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLlN1YlRhc2tzID09PSBudWxsKVxyXG4gICAgICB0aGlzLlN1YlRhc2tzID0gbmV3IFRhc2tzVGFibGUoKTtcclxuICAgIHRoaXMuU3ViVGFza3MuYWRkVGFzayhzdWJUYXNrKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZW1vdmUgb25lIG9mIHRoaXMgdGFza3Mgc3ViLXRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic3ViVGFza1wiPmEgcmVmZXJlbmNlIHRvIHRoZSBzdWItdGFzayB0byByZW1vdmU8L3BhcmFtPlxyXG4gIHJlbW92ZVN1YlRhc2soc3ViVGFzazogVGFzayk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuU3ViVGFza3MgIT09IG51bGwpXHJcbiAgICAgIHRoaXMuU3ViVGFza3MucmVtb3ZlVGFzayhzdWJUYXNrKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZHluYW1pY0RlZi50cmFuc2FjdGlvbiBmYWlsZWQgZmxhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ2YWxcIj50aGUgbmV3IHZhbHVlIG9mIHRoZSBmbGFnPC9wYXJhbT5cclxuICBzZXRUcmFuc2FjdGlvbkZhaWxlZCh2YWw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuX3RyYW5zYWN0aW9uRmFpbGVkID0gdmFsO1xyXG5cclxuICAgIGlmICghdmFsKVxyXG4gICAgICB0aGlzLlRyYW5zYWN0aW9uRXJyb3JIYW5kbGluZ3NSZXRyeSA9IG51bGw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIFwiZHluYW1pY0RlZi50cmFuc2FjdGlvbiBmYWlsZWRcIiBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImxldmVsXCI+aXMgdGhlIGR5bmFtaWNEZWYudHJhbnNhY3Rpb24gbGV2ZWwgd2UgYXJlIGludGVyZXN0ZWQgaW4gY2hlY2tpbmcuIFRSQU5TX05PTkUgLS0+IGNoZWNrIGZvciBhbnlcclxuICAvLy8gICBkeW5hbWljRGVmLnRyYW5zYWN0aW9uIGxldmVsIGZhaWx1cmUgVFJBTlNfUkVDT1JEL1RBU0tfUFJFRklYIC0tPiBjaGVjayBmb3IgYSBmYWlsdXJlIGluIHRoYXQgc3BlY2lmaWNcclxuICAvLy8gICBsZXZlbDwvcGFyYW0+XHJcbiAgdHJhbnNhY3Rpb25GYWlsZWQobGV2ZWw6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKGxldmVsID09PSBDb25zdEludGVyZmFjZS5UUkFOU19OT05FIHx8XHJcbiAgICAgICh0aGlzLlRyYW5zYWN0aW9uICE9IG51bGwgJiYgdGhpcy5UcmFuc2FjdGlvbi5nZXRMZXZlbCgpID09PSBsZXZlbCkpXHJcbiAgICAgIHJldHVybiB0aGlzLl90cmFuc2FjdGlvbkZhaWxlZDtcclxuICAgIGVsc2UgaWYgKGxldmVsID09PSBDb25zdEludGVyZmFjZS5UUkFOU19OT05FIHx8XHJcbiAgICAgICh0aGlzLlRyYW5zYWN0aW9uRXJyb3JIYW5kbGluZ3NSZXRyeSAhPSBudWxsICYmIHRoaXMuVHJhbnNhY3Rpb25FcnJvckhhbmRsaW5nc1JldHJ5LmdldExldmVsKCkgPT09IGxldmVsKSlcclxuICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zYWN0aW9uRmFpbGVkO1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgZmxhZyBvZiBhIGR5bmFtaWNEZWYudHJhbnNhY3Rpb24gcmV0cnkgb24gdGhlIHRhc2sncyBkeW5hbWljRGVmLnRyYW5zYWN0aW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbFwiPnZhbHVlIG9mIGZsYWc8L3BhcmFtPlxyXG4gIHNldEFmdGVyUmV0cnkodmFsOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLlRyYW5zYWN0aW9uICE9IG51bGwpXHJcbiAgICAgIHRoaXMuVHJhbnNhY3Rpb24uc2V0QWZ0ZXJSZXRyeSh2YWwpO1xyXG4gICAgZWxzZSBpZiAodGhpcy5UcmFuc2FjdGlvbkVycm9ySGFuZGxpbmdzUmV0cnkgIT0gbnVsbCkge1xyXG4gICAgICBpZiAodmFsID09PSBDb25zdEludGVyZmFjZS5SRUNPVkVSWV9OT05FKVxyXG4gICAgICAgIHRoaXMuVHJhbnNhY3Rpb25FcnJvckhhbmRsaW5nc1JldHJ5ID0gbnVsbDtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIHRoaXMuVHJhbnNhY3Rpb25FcnJvckhhbmRsaW5nc1JldHJ5LnNldEFmdGVyUmV0cnkodmFsKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldEFmdGVyUmV0cnkoKTogYm9vbGVhbjtcclxuICBnZXRBZnRlclJldHJ5KHJlY292ZXJ5OiBzdHJpbmcpOiBib29sZWFuO1xyXG4gIGdldEFmdGVyUmV0cnkocmVjb3Zlcnk/OiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmdldEFmdGVyUmV0cnlfMCgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuZ2V0QWZ0ZXJSZXRyeV8xKHJlY292ZXJ5KTtcclxuICB9XHJcblxyXG4gIC8vLyA8cmV0dXJucz4gdHJ1ZSBpZiB0aGlzIHRhc2sgaXMgcGFydCBvZiBhIGR5bmFtaWNEZWYudHJhbnNhY3Rpb24gY3VycmVudGx5IGJlaW5nIHJldHJpZWQ8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBnZXRBZnRlclJldHJ5XzAoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5UcmFuc2FjdGlvbiAhPSBudWxsKVxyXG4gICAgICByZXR1cm4gdGhpcy5UcmFuc2FjdGlvbi5nZXRBZnRlclJldHJ5KCk7XHJcbiAgICBlbHNlIGlmICh0aGlzLlRyYW5zYWN0aW9uRXJyb3JIYW5kbGluZ3NSZXRyeSAhPSBudWxsKVxyXG4gICAgICByZXR1cm4gdGhpcy5UcmFuc2FjdGlvbkVycm9ySGFuZGxpbmdzUmV0cnkuZ2V0QWZ0ZXJSZXRyeSgpO1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxyZXR1cm5zPiB0cnVlIGlmIHRoaXMgdGFzayBpcyBwYXJ0IG9mIGEgZHluYW1pY0RlZi50cmFuc2FjdGlvbiBjdXJyZW50bHkgYmVpbmcgcmV0cmllZCB3aXRoIGEgc3BlY2lmaWMgcmVjb3Zlcnk8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBnZXRBZnRlclJldHJ5XzEocmVjb3Zlcnk6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuVHJhbnNhY3Rpb24gIT0gbnVsbClcclxuICAgICAgcmV0dXJuIHRoaXMuVHJhbnNhY3Rpb24uZ2V0QWZ0ZXJSZXRyeShyZWNvdmVyeSk7XHJcbiAgICBlbHNlIGlmICh0aGlzLlRyYW5zYWN0aW9uRXJyb3JIYW5kbGluZ3NSZXRyeSAhPSBudWxsKVxyXG4gICAgICByZXR1cm4gdGhpcy5UcmFuc2FjdGlvbkVycm9ySGFuZGxpbmdzUmV0cnkuZ2V0QWZ0ZXJSZXRyeShyZWNvdmVyeSk7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSBFeGVjRW5kVGFzayBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHRoZSBfYkV4ZWNFbmRUYXNrIHZhbHVlPC9yZXR1cm5zPlxyXG4gIGdldEV4ZWNFbmRUYXNrKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2JFeGVjRW5kVGFzaztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXNldCB0aGUgXCJleGVjdXRlIGVuZCB0YXNrXCIgZmxhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcmVzZXRFeGVjRW5kVGFzaygpOiB2b2lkIHtcclxuICAgIHRoaXMuX2JFeGVjRW5kVGFzayA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlc2V0IHRoZSBcImV4ZWN1dGUgZW5kIHRhc2tcIiBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXRFeGVjRW5kVGFzaygpOiB2b2lkIHtcclxuICAgIHRoaXMuX2JFeGVjRW5kVGFzayA9IHRydWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgRXZhbHVhdGUgdGhlIGVuZCBjb25kaXRpb24gcHJvcGVydHlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibW9kZVwiPnRoZSBtb2RlIHRvIGNvbXBhcmUgdG88L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gc2hvdWxkIHdlIGV2YWx1YXRlIHRoZSBlbmQgY29uZGl0aW9uPzwvcmV0dXJucz5cclxuICBhc3luYyBldmFsRW5kQ29uZChtb2RlOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCBlbmRUYXNrQ29uZFByb3A6IFByb3BlcnR5O1xyXG4gICAgbGV0IGV2YWxFbmRDb25kUHJvcDogUHJvcGVydHkgPSB0aGlzLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRVZBTF9FTkRfQ09ORElUSU9OKTtcclxuXHJcbiAgICAvLyBEb250IGV2YWx1YXRlIGVuZCBjb25kaXRpb24gaWYgd2UgYXJlIGFscmVhZHkgY2xvc2luZyB0aGUgdGFza1xyXG4gICAgaWYgKHRoaXMuSW5FbmRUYXNrKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgaWYgKHRoaXMuX2JFeGVjRW5kVGFzaylcclxuICAgICAgcmV0dXJuIHRydWU7XHJcblxyXG4gICAgaWYgKGV2YWxFbmRDb25kUHJvcCAhPSBudWxsICYmICggTlN0cmluZy5Db21wYXJlKGF3YWl0IGV2YWxFbmRDb25kUHJvcC5nZXRWYWx1ZSgpLCBDb25zdEludGVyZmFjZS5FTkRfQ09ORF9FVkFMX0lNTUlESUFURSxcclxuICAgICAgICB0cnVlKSA9PT0gMCB8fCAoKGF3YWl0IGV2YWxFbmRDb25kUHJvcC5nZXRWYWx1ZSgpKS50b0xvd2VyQ2FzZSgpID09PSBtb2RlLnRvTG93ZXJDYXNlKCkpKSkge1xyXG4gICAgICAvLyBjaGVjayB0aGUgZW5kIGNvbmRpdGlvblxyXG4gICAgICBlbmRUYXNrQ29uZFByb3AgPSB0aGlzLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRU5EX0NPTkRJVElPTik7XHJcbiAgICAgIGlmIChlbmRUYXNrQ29uZFByb3AgPT0gbnVsbClcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIGxldCBlbmRUYXNrOiBzdHJpbmcgPSBhd2FpdCBlbmRUYXNrQ29uZFByb3AuZ2V0VmFsdWUoKTtcclxuICAgICAgLy8gc2lnbmFsIHdlIG5lZWQgdG8gcGVyZm9ybSBhbiBlbmQgdGFzayBhZnRlciB3ZSBnZXQgb3V0IG9mIHRoZSBsb29wXHJcbiAgICAgIGlmIChEaXNwbGF5Q29udmVydG9yLnRvQm9vbGVhbihlbmRUYXNrKSkge1xyXG4gICAgICAgIHRoaXMuX2JFeGVjRW5kVGFzayA9IHRydWU7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgXCJ0cnlpbmcgdG8gc3RvcFwiIGZsYWcgZm9yIHRoZSB0YXNrIGFuZCBpdCdzIHN1YlRhc2tzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbFwiPnRoZSB2YWx1ZSB0byB1c2UgZm9yIHRoZSBmbGFnPC9wYXJhbT5cclxuICBzZXRUcnlpbmdUb1N0b3AodmFsOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5oYXNTdWJUYXNrcygpKSB7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLlN1YlRhc2tzLmdldFNpemUoKTsgaSA9IGkgKyAxKSB7XHJcbiAgICAgICAgbGV0IHRhc2s6IFRhc2sgPSA8VGFzaz50aGlzLlN1YlRhc2tzLmdldFRhc2soaSk7XHJcbiAgICAgICAgdGFzay5zZXRUcnlpbmdUb1N0b3AodmFsKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5Jc1RyeWluZ1RvU3RvcCA9IHZhbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIGJJblJlY29yZFN1ZmZpeFxyXG4gIC8vLyA8L3N1bW1hcnlcclxuICBnZXRJblJlY29yZFN1ZmZpeCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pblJlY29yZFN1ZmZpeDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIGJJblJlY29yZFN1ZmZpeFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0SW5SZWNvcmRTdWZmaXgoYlZhbHVlOiBib29sZWFuKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoYlZhbHVlICE9PSB0aGlzLl9pblJlY29yZFN1ZmZpeCkge1xyXG4gICAgICB0aGlzLl9pblJlY29yZFN1ZmZpeCA9IGJWYWx1ZTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSBiRXZhbE9sZFZhbHVlcyBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImJGbGFnXCI+dHJ1ZS9mYWxzZSB2YWx1ZTwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0cnVlL2ZsYXNlIC0gdmFsdWUgdXBkYXRlZDwvcmV0dXJucz5cclxuICBzZXRFdmFsT2xkVmFsdWVzKGJGbGFnOiBib29sZWFuKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoYkZsYWcgIT09IHRoaXMuX2V2YWxPbGRWYWx1ZXMpIHtcclxuICAgICAgdGhpcy5fZXZhbE9sZFZhbHVlcyA9IGJGbGFnO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIGJFdmFsT2xkVmFsdWVzIHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHRydWUvZmFsc2UgLSBsb29rIGF0IG9sZCB2YWx1ZXMgd2hlbiBnZXR0aW5nIHRoZSBmaWVsZCB2YWx1ZTwvcmV0dXJucz5cclxuICBnZXRFdmFsT2xkVmFsdWVzKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2V2YWxPbGRWYWx1ZXM7XHJcbiAgfVxyXG5cclxuICAgYXN5bmMgZW5kVGFzayhyZXZlcnNpYmxlRXhpdDogYm9vbGVhbiwgb25seURlc2NzOiBib29sZWFuLCBkdWVUb1ZlcmlmeUVycm9yOiBib29sZWFuLCBzdWJmb3JtRGVzdGluYXRpb24/OiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBpZiAoaXNOdWxsT3JVbmRlZmluZWQoc3ViZm9ybURlc3RpbmF0aW9uKSlcclxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZW5kVGFza18xKHJldmVyc2libGVFeGl0LCBvbmx5RGVzY3MsIGZhbHNlLCBkdWVUb1ZlcmlmeUVycm9yKTtcclxuICAgIGVsc2VcclxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZW5kVGFza18xKHJldmVyc2libGVFeGl0LCBvbmx5RGVzY3MsIHN1YmZvcm1EZXN0aW5hdGlvbiwgZHVlVG9WZXJpZnlFcnJvcik7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIHN1Y2NlZWRlZCBpbiBlbmRpbmcgdGhlIHRhc2sgYW5kIGl0cyBzdWIgdGFza3NcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicmV2ZXJzaWJsZUV4aXRcIj5pZiB0cnVlIHRoZW4gdGhlIGV4aXQgaXMgcmV2ZXJzaWJsZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJvbmx5RGVzY3NcIj5pZiB0cnVlIHRoZW4gZW5kIG9ubHkgdGhlIHN1YiB0YXNrcyBhbmQgaGFuZGxlIHJlYyBzdWZmaXggZm9yIHRoaXMgdGFzazwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzdWJmb3JtRGVzdGluYXRpb25cIj5pZiB0cnVlIHRoZW4gZW5kIG9ubHkgdGhpcyB0YXNrPC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIGVuZFRhc2tfMShyZXZlcnNpYmxlRXhpdDogYm9vbGVhbiwgb25seURlc2NzOiBib29sZWFuLCBzdWJmb3JtRGVzdGluYXRpb246IGJvb2xlYW4sIGR1ZVRvVmVyaWZ5RXJyb3I6IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCBzdWNjZWVkZWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgbGV0IGNsb3NlZFN1YkZvcm06IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBzdWJUYXNrOiBUYXNrO1xyXG4gICAgbGV0IG1nZFRhYjogSU1HRGF0YUNvbGxlY3Rpb24gPSBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGU7XHJcblxyXG4gICAgaWYgKCh0aGlzLklzU3ViRm9ybSAmJiAhc3ViZm9ybURlc3RpbmF0aW9uKSAmJiAhdGhpcy5fcGFyZW50VGFzay5JbkVuZFRhc2spIHtcclxuICAgICAgLy8gaWYgdGhpcyB0YXNrIGlzIGEgc3ViZm9ybSBhbmQgaXRzIHBhcmVudCBpcyBub3QgdHJ5aW5nIHRvIHN0b3AgdGhlblxyXG4gICAgICAvLyBzdGFydCBzdG9wcGluZyB0aGUgdGFza3Mgc3ViIHRyZWUgZnJvbSB0aGUgcGFyZW50IGZvcm1cclxuICAgICAgc3VjY2VlZGVkID0gYXdhaXQgdGhpcy5fcGFyZW50VGFzay5lbmRUYXNrKHJldmVyc2libGVFeGl0LCBvbmx5RGVzY3MsIGR1ZVRvVmVyaWZ5RXJyb3IpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoIXRoaXMuaXNBYm9ydGluZygpICYmICF0aGlzLkluRW5kVGFzaykge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIHRoaXMuSW5FbmRUYXNrID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgLy8gSW4gY2FzZSBvZiBlcnJvciBhbmQgYnJvd3NlciBjbG9zZSwgaW50aW1hdGUgc2VydmVyIGFib3V0IGJyb3dzZXIgY2xvc2VcclxuICAgICAgICBpZigoTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5TdGFydHVwTWdEYXRhLmdldEZpcnN0VGFzaygpLkluRW5kVGFzayAmJiBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLlN0YXJ0dXBNZ0RhdGEuZ2V0Rmlyc3RUYXNrKCkuQ2xvc2luZ0Zvcm1VSSkgJiYgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICBsZXQgY21kOiBJQ2xpZW50Q29tbWFuZCA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZVVubG9hZENvbW1hbmQoKTtcclxuICAgICAgICAgIE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuZ2V0TUdEYXRhKDApLkNtZHNUb1NlcnZlci5BZGQoY21kKTtcclxuICAgICAgICAgIGF3YWl0IENvbW1hbmRzUHJvY2Vzc29yTWFuYWdlci5HZXRDb21tYW5kc1Byb2Nlc3NvcigpLkV4ZWN1dGUoQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1NlbmRpbmdJbnN0cnVjdGlvbi5UQVNLU19BTkRfQ09NTUFORFMpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLklzVHJ5aW5nVG9TdG9wKVxyXG4gICAgICAgICAgdGhpcy5zZXRUcnlpbmdUb1N0b3AodHJ1ZSk7XHJcblxyXG4gICAgICAgIC8vIGV4aXQgZnJvbSBzdWJUYXNrcyBpbiBhIHByZWZpeCBtYW5uZXJcclxuICAgICAgICBsZXQgaTogbnVtYmVyO1xyXG4gICAgICAgIGlmIChyZXZlcnNpYmxlRXhpdCkge1xyXG4gICAgICAgICAgLy8gZXhpdCBmcm9tIHRoZSBzdWIgdGFza3NcclxuICAgICAgICAgIGlmICh0aGlzLmhhc1N1YlRhc2tzKCkpIHtcclxuXHJcbiAgICAgICAgICAgIGlmICghUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuR2V0SW5zdGFuY2UoKS5EZWxheUNvbW1hbmRFeGVjdXRpb24pIHtcclxuICAgICAgICAgICAgICBsZXQgcGVuZGluZ1RyYW5zYWN0aW9uczogYm9vbGVhbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgbGV0IGNsaWVudE9wZXJFeGlzdDogYm9vbGVhbiA9IHRoaXMuQ2hlY2tJZkNsaWVudE9wZXJhdGlvbkV4aXN0c0luU3ViZm9ybVRhc2tzKHRoaXMsXHJcbiAgICAgICAgICAgICAgICBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEFTS19TVUZGSVgpO1xyXG4gICAgICAgICAgICAgIGlmICghY2xpZW50T3BlckV4aXN0KSB7XHJcbiAgICAgICAgICAgICAgICBjbGllbnRPcGVyRXhpc3QgPSB0aGlzLkNoZWNrSWZDbGllbnRPcGVyYXRpb25FeGlzdHNJblN1YmZvcm1UYXNrcyh0aGlzLFxyXG4gICAgICAgICAgICAgICAgICBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcbiAgICAgICAgICAgICAgaWYgKCFjbGllbnRPcGVyRXhpc3QpXHJcbiAgICAgICAgICAgICAgICAgIHBlbmRpbmdUcmFuc2FjdGlvbnMgPSB0aGlzLkNoZWNrSWZQZW5kaW5nVHJhbnNhY3Rpb25zKHRoaXMpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBpZiAoIWNsaWVudE9wZXJFeGlzdCAmJiAhcGVuZGluZ1RyYW5zYWN0aW9ucykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hbGxvd1JlbW90ZUNtZEV4ZWN1dGlvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5TZXRTZXJ2ZXJTaWRlVGFza1N1ZmZpeCh0aGlzKTtcclxuXHJcbiAgICAgICAgICAgICAgICBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5HZXRJbnN0YW5jZSgpLkRlbGF5Q29tbWFuZEV4ZWN1dGlvbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICB0aGlzLlNldFNlcnZlclNpZGVUYXNrU3VmZml4KHRoaXMpO1xyXG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5TdWJUYXNrcy5nZXRTaXplKCkgJiYgc3VjY2VlZGVkOyBpKyspIHtcclxuICAgICAgICAgICAgICBzdWJUYXNrID0gPFRhc2s+dGhpcy5TdWJUYXNrcy5nZXRUYXNrKGkpO1xyXG4gICAgICAgICAgICAgIGNsb3NlZFN1YkZvcm0gPSBjbG9zZWRTdWJGb3JtIHx8IHN1YlRhc2suSXNTdWJGb3JtO1xyXG4gICAgICAgICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayhzdWJUYXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRVhJVCk7XHJcbiAgICAgICAgICAgICAgc3VjY2VlZGVkID0gKCFBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpIHx8IGR1ZVRvVmVyaWZ5RXJyb3IpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy8gZXhpdCBmb3IgdGhlIGZpcnN0IHRhc2sgbXVzdCBlbmQgYWxsIHRhc2tzXHJcbiAgICAgICAgICBpZiAodGhpcyA9PT0gbWdkVGFiLlN0YXJ0dXBNZ0RhdGEuZ2V0Rmlyc3RUYXNrKCkpIHtcclxuICAgICAgICAgICAgZm9yIChpID0gbWdkVGFiLmdldFNpemUoKSAtIDE7IGkgPiAwICYmIHN1Y2NlZWRlZDsgaS0tKSB7XHJcbiAgICAgICAgICAgICAgaWYgKG1nZFRhYi5nZXRNR0RhdGEoaSkgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKG1nZFRhYi5nZXRNR0RhdGEoaSkuZ2V0Rmlyc3RUYXNrKCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VYSVQpO1xyXG4gICAgICAgICAgICAgICAgc3VjY2VlZGVkID0gKCFBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpIHx8IGR1ZVRvVmVyaWZ5RXJyb3IpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHN1Y2NlZWRlZCkge1xyXG4gICAgICAgICAgLy8gaWYgY2xvc2luZyB0aGUgc3ViIHRhc2tzIHdhcyBzdWNjZXNzZnVsIHRoZW4gZXhlY3V0ZSByZWNvcmQgc3VmZml4XHJcbiAgICAgICAgICBpZiAocmV2ZXJzaWJsZUV4aXQgJiYgIWR1ZVRvVmVyaWZ5RXJyb3IpIHtcclxuICAgICAgICAgICAgbGV0IGZvcmNlU3VmZml4OiBib29sZWFuID0gYXdhaXQgdGhpcy5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRk9SQ0VfU1VGRklYLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIC8vIGZvciBub24gaW50ZXJhY3RpdmUsIHR1cm4gb2ZmIHRoZSBmb3JjZSByZWNvcmQgc3VmZml4LFxyXG4gICAgICAgICAgICAvLyBvdGhlcndpc2UgYW4gdW53YW50ZWQgdXBkYXRlIG1pZ2h0IGJlIHNlbnQgd2hlbiB0YXNrIGVuZHMuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5Jc0ludGVyYWN0aXZlICYmIGZvcmNlU3VmZml4ID09PSB0cnVlICYmIHRoaXMuZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSlcclxuICAgICAgICAgICAgICB0aGlzLnNldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRk9SQ0VfU1VGRklYLCBcIjBcIik7XHJcblxyXG4gICAgICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGhpcywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG5cclxuICAgICAgICAgICAgLy8gcmVzdG9yZSB0aGUgZm9yY2Ugc3VmZml4LCBmb3IganVzdCBpbiBjYXNlLlxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuSXNJbnRlcmFjdGl2ZSAmJiBmb3JjZVN1ZmZpeCA9PT0gdHJ1ZSAmJiB0aGlzLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpXHJcbiAgICAgICAgICAgICAgdGhpcy5zZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0ZPUkNFX1NVRkZJWCwgXCIxXCIpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHN1Y2NlZWRlZCA9ICghQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSB8fCBkdWVUb1ZlcmlmeUVycm9yKTtcclxuXHJcbiAgICAgICAgICBpZiAoc3VjY2VlZGVkICYmICFvbmx5RGVzY3MpXHJcbiAgICAgICAgICAgIHRoaXMuSGFuZGxlVHJhbnNhY3Rpb25JbmZvKCk7XHJcblxyXG4gICAgICAgICAgbGV0IHByZVRza1N1ZmZpeDogYm9vbGVhbiA9IHN1Y2NlZWRlZDtcclxuXHJcbiAgICAgICAgICAvLyBub3cgcGVyZm9ybSB0YXNrIHN1ZmZpeFxyXG4gICAgICAgICAgaWYgKHN1Y2NlZWRlZCAmJiAhb25seURlc2NzICYmIHJldmVyc2libGVFeGl0ICYmICFkdWVUb1ZlcmlmeUVycm9yICYmXHJcbiAgICAgICAgICAgICghdGhpcy5Jc1N1YkZvcm0gfHwgc3ViZm9ybURlc3RpbmF0aW9uKSAmJlxyXG4gICAgICAgICAgICB0aGlzLlRhc2tQcmVmaXhFeGVjdXRlZCAmJiAhdGhpcy5UYXNrU3VmZml4RXhlY3V0ZWQpXHJcbiAgICAgICAgICAgIHN1Y2NlZWRlZCA9IGF3YWl0IHRoaXMuaGFuZGxlVGFza1N1ZmZpeCh0cnVlKTtcclxuXHJcbiAgICAgICAgICAvLyBEb24ndCBmb3JnZXQgdG8gZXhpdCBmcm9tIGFueSBzdWJUYXNrcyBvcGVuZWQgZHVyaW5nIHRoZSBsYXN0IHJlYy1zdWZmaXggb3IgdGFzayBzdWZmaXhcclxuICAgICAgICAgIGlmIChyZXZlcnNpYmxlRXhpdCAmJiB0aGlzLmhhc1N1YlRhc2tzKCkpXHJcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLlN1YlRhc2tzLmdldFNpemUoKTsgaSsrKSB7XHJcblxyXG4gICAgICAgICAgICAgIHN1YlRhc2sgPSA8VGFzaz50aGlzLlN1YlRhc2tzLmdldFRhc2soaSk7XHJcblxyXG4gICAgICAgICAgICAgIGlmICghc3ViVGFzay5Jc1N1YkZvcm0pXHJcbiAgICAgICAgICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVOb25SZXZlcnNpYmxlRXZlbnQoc3ViVGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VYSVQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy8gZG9udCBjb250aW51ZSB3aXRoIHRhc2sgZXhpdCBpZiBhIGRhdGEgZXJyb3Igb2NjdXJlZCBkdXJpbmcgdGFzayBzdWZmaXggKGUuZy4gcm9sbGJhY2soKSlcclxuICAgICAgICAgIGlmIChyZXZlcnNpYmxlRXhpdClcclxuICAgICAgICAgICAgc3VjY2VlZGVkID0gKCFBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpIHx8IGR1ZVRvVmVyaWZ5RXJyb3IpO1xyXG5cclxuICAgICAgICAgIC8vIHRhc2sgc3VmZml4IG9ubHkgc3RvcHMgZXhlY3V0aW9uIGZvciBjdXJyZW50IHRhc2ssIHdoaWNoIGlzIGJlaW5nIGNsb3NlZFxyXG4gICAgICAgICAgaWYgKHByZVRza1N1ZmZpeClcclxuICAgICAgICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuc2V0U3RvcEV4ZWN1dGlvbihmYWxzZSk7XHJcblxyXG4gICAgICAgICAgdGhpcy5zZXRBZnRlclJldHJ5KENvbnN0SW50ZXJmYWNlLlJFQ09WRVJZX05PTkUpO1xyXG5cclxuICAgICAgICAgIGlmICghdGhpcy5pc0Fib3J0aW5nKCkgJiYgc3VjY2VlZGVkICYmICFvbmx5RGVzY3MpIHtcclxuICAgICAgICAgICAgLy8gVHJ5IGNsb3NpbmcgYW55IHRhc2sgbGV2ZWwgZHluYW1pY0RlZi50cmFuc2FjdGlvblxyXG4gICAgICAgICAgICBpZiAocmV2ZXJzaWJsZUV4aXQpIHtcclxuICAgICAgICAgICAgICB0aGlzLnNldFRyYW5zYWN0aW9uRmFpbGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLlRhc2tUcmFuc2FjdGlvbk1hbmFnZXIuY2hlY2tBbmRDb21taXQoZmFsc2UsIENvbnN0SW50ZXJmYWNlLlRSQU5TX1RBU0tfUFJFRklYLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgc3VjY2VlZGVkID0gKCFBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpIHx8IGR1ZVRvVmVyaWZ5RXJyb3IpICYmICF0aGlzLmlzQWJvcnRpbmcoKSAmJiAhdGhpcy50cmFuc2FjdGlvbkZhaWxlZChDb25zdEludGVyZmFjZS5UUkFOU19UQVNLX1BSRUZJWCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuc2V0QWZ0ZXJSZXRyeShDb25zdEludGVyZmFjZS5SRUNPVkVSWV9OT05FKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChzdWNjZWVkZWQpIHtcclxuXHJcblxyXG4gICAgICAgICAgICAgIGlmICghdGhpcy5hbGxvd1JlbW90ZUNtZEV4ZWN1dGlvbikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hbGxvd1JlbW90ZUNtZEV4ZWN1dGlvbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5HZXRJbnN0YW5jZSgpLkRlbGF5Q29tbWFuZEV4ZWN1dGlvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLkRlbGF5Q29tbWFuZEV4ZWN1dGlvbil7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkRlbGF5Q29tbWFuZEV4ZWN1dGlvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuR2V0SW5zdGFuY2UoKS5EZWxheUNvbW1hbmRFeGVjdXRpb24gPSB0cnVlO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgbGV0IGJhc2VNZ2Q6IE1HRGF0YSA9IEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5TdGFydHVwTWdEYXRhO1xyXG4gICAgICAgICAgICAgIC8vIElmIHdlIGFyZSBjbG9zaW5nIHRoZSB0b3Btb3N0IHRhc2sgLSBkb250IGxvb3NlIGFueSBldmVudHMsIGxlZnQgaW4gdGhlIHF1ZXVlXHJcbiAgICAgICAgICAgICAgaWYgKHJldmVyc2libGVFeGl0ICYmIGJhc2VNZ2QuZ2V0Rmlyc3RUYXNrKCkuZ2V0VGFza1RhZygpID09PSB0aGlzLmdldFRhc2tUYWcoKSkge1xyXG4gICAgICAgICAgICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuc2V0UHJvY2Vzc2luZ1RvcE1vc3RFbmRUYXNrKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlRXZlbnRzKGJhc2VNZ2QsIDApO1xyXG4gICAgICAgICAgICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuc2V0UHJvY2Vzc2luZ1RvcE1vc3RFbmRUYXNrKGZhbHNlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyB2YXIgc3QgPSBuZXcgU2Vzc2lvblN0YXRpc3RpY3NGb3JtKCk7XHJcbiAgICAgICAgICAgICAgICAvLyBzdC5Xcml0ZVRvRmxvd01vbml0b3IoKEZsb3dNb25pdG9yUXVldWUpX2Zsb3dNb25pdG9yKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0Fib3J0aW5nKCkpXHJcbiAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgYXdhaXQgVGFza1NlcnZpY2VCYXNlLkV4aXQodGhpcywgcmV2ZXJzaWJsZUV4aXQsIHN1YmZvcm1EZXN0aW5hdGlvbik7XHJcblxyXG4gICAgICAgICAgICAgIC8vIFdoZW4gY2xvc2luZyBhIHRhc2sgd2hvc2UgcGFyZW50IGlzIGEgbWFpbiBwcm9ncmFtLCBjaGVjayB0aGUgbWFpbiBwcm9ncmFtJ3MgZW5kXHJcbiAgICAgICAgICAgICAgLy8gY29uZGl0aW9uXHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuX3BhcmVudFRhc2sgIT0gbnVsbCAmJiB0aGlzLl9wYXJlbnRUYXNrLmlzTWFpblByb2coKSkge1xyXG4gICAgICAgICAgICAgICAgbGV0IG1nZDogTUdEYXRhID0gQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLmdldE1HRGF0YSgwKTtcclxuICAgICAgICAgICAgICAgIGxldCBtYWluUHJnVGFzazogVGFzayA9IG1nZC5nZXRNYWluUHJvZygwKTtcclxuICAgICAgICAgICAgICAgIGxldCByb290VGFzazogVGFzayA9IEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5TdGFydHVwTWdEYXRhLmdldEZpcnN0VGFzaygpO1xyXG4gICAgICAgICAgICAgICAgbGV0IGVuZE1haW5Qcmc6IGJvb2xlYW4gPSBhd2FpdCBtYWluUHJnVGFzay5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRU5EX0NPTkRJVElPTiwgZmFsc2UpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIE5vIG5lZWQgdG8gZW5kIHRoZSByb290IHRhc2sgaWYgd2UgYXJlIGFscmVhZHkgZG9pbmcgaXQuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcyAhPT0gcm9vdFRhc2sgJiYgZW5kTWFpblByZykge1xyXG4gICAgICAgICAgICAgICAgICBsZXQgcnRFdnQgPSBuZXcgUnVuVGltZUV2ZW50KHJvb3RUYXNrKTtcclxuICAgICAgICAgICAgICAgICAgcnRFdnQuc2V0SW50ZXJuYWwoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NMT1NFKTtcclxuICAgICAgICAgICAgICAgICAgcnRFdnQuc2V0Q3RybChudWxsKTtcclxuICAgICAgICAgICAgICAgICAgcnRFdnQuc2V0QXJnTGlzdChudWxsKTtcclxuICAgICAgICAgICAgICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuYWRkVG9UYWlsKHJ0RXZ0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgTWdGb3JtLkNyZWF0ZWRGb3Jtcy5yZW1vdmUoPE1nRm9ybT50aGlzLkZvcm0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBmaW5hbGx5IHtcclxuICAgICAgICBpZiAoIXRoaXMuSXNTdWJGb3JtIHx8IHN1YmZvcm1EZXN0aW5hdGlvbilcclxuICAgICAgICAgIHRoaXMuaGFuZGxlRmluYWxseUVuZFRhc2soc3VjY2VlZGVkLCByZXZlcnNpYmxlRXhpdCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBRY3IgIzkxNDY0NSA6IHJldHVybiBmYWxzZSBpbiBhIHJlY3Vyc2l2ZSBjYWxsLlxyXG4gICAgLy8gb3RoZXJ3aXNlIGNvbW1vbkhhbmRsZXJBZnRlcihldmVudE1hbmFnZXIpIHdpbGwgbm90IGJlIGV4ZWN1dGVkIGlmIHRoZSBjYWxsIGlzIHJlY3Vyc2l2ZWx5IG1hZGUgZnJvbSBoYW5kbGVFdmVudC5cclxuICAgIC8vIGZvciBleGFtcGxlIDogdGFzayBjb25kIGZ1bGZpbGxlZC4gaGFuZGxlSW50ZXJuYWxFdmVudCh0aGlzLCBNR19BQ1RfUkVDX1NVRkZJWCkgaXMgY2FsbGVkLlxyXG4gICAgLy8gd2hpbGUgaW4gcmVjIHN1ZiBoYW5kbGVyLCBlbmRUYXNrIGlzIGNhbGxlZCBhZ2Fpbi4uaWYgd2UgcmV0dXJuIHRydWUgdGhlbiB0aGUgY29tbW9uSGFuZGxlckFmdGVyIGlzIG5vdCBleGVjdXRlZC5cclxuICAgIC8vIGlmIHRoZSByZWMgc3VmZml4IGhhbmRsZXIgZGlkIG5vdCBleGlzdCwgdGhlcmUgd2lsbCBiZSBubyBjYWxsIHRvIGVuZFRhc2sgYW5kIHRoZSBjb21tb25IYW5kbGVyQWZ0ZXIgd2lsbCBiZSBleGVjdXRlZC5cclxuICAgIC8vIFRoZSBuYW1lICdzdWNjZWVkZWQnIGlzIGEgYml0IG1pc2xlYWRpbmcuLml0cyBtb3JlIGxpa2UgJ2V4ZWN1dGVkJy4uYnV0IHdlIGRlY2lkZWQgdG8ga2VlcCBpdC5cclxuICAgIGVsc2UgaWYgKHRoaXMuSW5FbmRUYXNrKVxyXG4gICAgICBzdWNjZWVkZWQgPSBmYWxzZTtcclxuXHJcbiAgICAvLyByZXN0b3JlIHRoZSBmbGFnLlxyXG4gICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuc2V0UHJvY2Vzc2luZ1RvcE1vc3RFbmRUYXNrKHRoaXMuX2luUHJvY2Vzc2luZ1RvcE1vc3RFbmRUYXNrU2F2ZWQpO1xyXG5cclxuICAgIHJldHVybiBzdWNjZWVkZWQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFNldFNlcnZlclNpZGVUYXNrU3VmZml4KClcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRhc2tcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgU2V0U2VydmVyU2lkZVRhc2tTdWZmaXggKHRhc2sgOiBUYXNrKSA6IHZvaWRcclxuICB7XHJcbiAgICBsZXQgY2xpZW50T3BlcmF0aW9uRXhpc3Q6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHZhciBydEV2dCA9IG5ldyBSdW5UaW1lRXZlbnQodGFzayk7XHJcbiAgICBydEV2dC5zZXRJbnRlcm5hbChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEFTS19TVUZGSVgpO1xyXG5cclxuICAgIGxldCAgaGFuZGxlcjogRXZlbnRIYW5kbGVyID0gbnVsbDtcclxuICAgIC8vIGZpbmQgaWYgTUdfQUNUX1RBU0tfU1VGRklYIGhhbmRsZXIgZXhpc3RzP1xyXG4gICAgdmFyIGV2dEhhblBvcyA9IG5ldyBFdmVudEhhbmRsZXJQb3NpdGlvbigpO1xyXG4gICAgZXZ0SGFuUG9zLmluaXQocnRFdnQpO1xyXG4gICAgaGFuZGxlciA9IGV2dEhhblBvcy5nZXROZXh0KCk7XHJcblxyXG4gICAgaWYgKGhhbmRsZXIgIT0gbnVsbClcclxuICAgIHtcclxuICAgICAgZm9yIChsZXQgIGkgPSAwOyBpIDwgaGFuZGxlci5nZXRPcGVyYXRpb25UYWIoKS5nZXRTaXplKCk7IGkrKylcclxuICAgICAge1xyXG4gICAgICAgIGxldCBvcGVyID0gaGFuZGxlci5nZXRPcGVyYXRpb25UYWIoKS5nZXRPcGVyYXRpb24oaSk7XHJcbiAgICAgICAgb3Blci5zZXRFeGVjT25TZXJ2ZXIodHJ1ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0YXNrLmhhc1N1YlRhc2tzKCkpICAge1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhc2suR2V0U3ViVGFza3MoKS5sZW5ndGg7IGkrKylcclxuICAgICAge1xyXG4gICAgICAgIGxldCBzdWJUYXNrOiBUYXNrID0gPFRhc2s+dGFzay5TdWJUYXNrcy5nZXRUYXNrKGkpO1xyXG4gICAgICAgIHRoaXMuU2V0U2VydmVyU2lkZVRhc2tTdWZmaXgoc3ViVGFzayk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIENoZWNrSWZDbGllbnRPcGVyYXRpb25FeGlzdHNJblN1YmZvcm1UYXNrcygpXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0YXNrXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIENoZWNrSWZDbGllbnRPcGVyYXRpb25FeGlzdHNJblN1YmZvcm1UYXNrcyAodGFzazogVGFzaywgZXZlbnRDb2RlOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGxldCBjbGllbnRPcGVyYXRpb25FeGlzdCA9IGZhbHNlO1xyXG4gICAgdmFyIHJ0RXZ0ID0gbmV3IFJ1blRpbWVFdmVudCh0YXNrKTtcclxuICAgIHJ0RXZ0LnNldEludGVybmFsKGV2ZW50Q29kZSk7XHJcblxyXG4gICAgbGV0IGhhbmRsZXI6IEV2ZW50SGFuZGxlciA9IG51bGw7XHJcbiAgICAvLyBmaW5kIGlmIE1HX0FDVF9UQVNLX1NVRkZJWCAvIE1HX0FDVF9SRUNfU1VGRklYIGhhbmRsZXIgZXhpc3RzP1xyXG4gICAgdmFyIGV2dEhhblBvcyA9IG5ldyBFdmVudEhhbmRsZXJQb3NpdGlvbigpO1xyXG4gICAgZXZ0SGFuUG9zLmluaXQocnRFdnQpO1xyXG4gICAgaGFuZGxlciA9IGV2dEhhblBvcy5nZXROZXh0KCk7XHJcbiAgICBsZXQgcGVuZGluZ1RyYW5zYWN0aW9ucyA9IGZhbHNlO1xyXG4gICAgaWYgKGV2ZW50Q29kZSA9PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCkge1xyXG4gICAgICBsZXQgY3VyclJlY29yZCA9ICg8RGF0YVZpZXc+dGFzay5EYXRhVmlldykuZ2V0Q3VyclJlYygpO1xyXG4gICAgICBpZiAoKDxEYXRhVmlldz50YXNrLkRhdGFWaWV3KS5tb2RpZmllZFJlY29yZHNOdW1iZXIoKSA+IDAgfHwgKGN1cnJSZWNvcmQgIT0gbnVsbCAmJiBjdXJyUmVjb3JkLk1vZGlmaWVkKSlcclxuICAgICAgICBwZW5kaW5nVHJhbnNhY3Rpb25zID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoaGFuZGxlciAhPSBudWxsICYmIHBlbmRpbmdUcmFuc2FjdGlvbnMgPT0gdHJ1ZSkge1xyXG4gICAgICAgIGxldCBjbnQgPSBoYW5kbGVyLmdldE9wZXJhdGlvblRhYigpLmdldFNpemUoKTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjbnQ7IGkrKykge1xyXG4gICAgICAgICAgbGV0IG9wZXIgPSBoYW5kbGVyLmdldE9wZXJhdGlvblRhYigpLmdldE9wZXJhdGlvbihpKTtcclxuICAgICAgICAgIGlmIChvcGVyLmdldEV4ZWNPbkNsaWVudCgpKSB7XHJcbiAgICAgICAgICAgIGNsaWVudE9wZXJhdGlvbkV4aXN0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoIWNsaWVudE9wZXJhdGlvbkV4aXN0ICYmIHRhc2suaGFzU3ViVGFza3MoKSkge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyAoIWNsaWVudE9wZXJhdGlvbkV4aXN0ICYmIGkgPCB0YXNrLmdldFN1YlRhc2tzKCkuZ2V0U2l6ZSgpKTsgaSsrKSB7XHJcbiAgICAgICAgICBsZXQgc3ViVGFzayA9IDxUYXNrPnRhc2suU3ViVGFza3MuZ2V0VGFzayhpKTtcclxuICAgICAgICAgIGNsaWVudE9wZXJhdGlvbkV4aXN0ID0gdGhpcy5DaGVja0lmQ2xpZW50T3BlcmF0aW9uRXhpc3RzSW5TdWJmb3JtVGFza3Moc3ViVGFzaywgZXZlbnRDb2RlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBjbGllbnRPcGVyYXRpb25FeGlzdDtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIENoZWNrSWZQZW5kaW5nVHJhbnNhY3Rpb25zKClcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRhc2tcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgQ2hlY2tJZlBlbmRpbmdUcmFuc2FjdGlvbnModGFzayA6IFRhc2spOiBib29sZWFuXHJcbiAge1xyXG4gICAgbGV0IHBlbmRpbmdUcmFuc2FjdGlvbnMgPSBmYWxzZTtcclxuICAgIGxldCBjdXJyUmVjb3JkID0gICg8RGF0YVZpZXc+dGFzay5EYXRhVmlldykuZ2V0Q3VyclJlYygpO1xyXG4gICAgaWYgKCg8RGF0YVZpZXc+dGFzay5EYXRhVmlldykubW9kaWZpZWRSZWNvcmRzTnVtYmVyKCkgPiAwIHx8IChjdXJyUmVjb3JkICE9IG51bGwgJiYgY3VyclJlY29yZC5Nb2RpZmllZCkpXHJcbiAgICAgIHBlbmRpbmdUcmFuc2FjdGlvbnMgPSB0cnVlO1xyXG5cclxuICAgIGlmICghcGVuZGluZ1RyYW5zYWN0aW9ucyAmJiB0YXNrLmhhc1N1YlRhc2tzKCkpXHJcbiAgICB7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyAoIXBlbmRpbmdUcmFuc2FjdGlvbnMgJiYgaSA8IHRhc2suZ2V0U3ViVGFza3MoKS5nZXRTaXplKCkpOyBpKyspXHJcbiAgICAgIHtcclxuICAgICAgICBsZXQgc3ViVGFzayA9IDxUYXNrPnRhc2suU3ViVGFza3MuZ2V0VGFzayhpKTtcclxuICAgICAgICBwZW5kaW5nVHJhbnNhY3Rpb25zID0gdGhpcy5DaGVja0lmUGVuZGluZ1RyYW5zYWN0aW9ucyhzdWJUYXNrKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBwZW5kaW5nVHJhbnNhY3Rpb25zO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwib25seURlc2NzXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzdWNjZWVkZWRcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgSGFuZGxlVHJhbnNhY3Rpb25JbmZvKCk6IHZvaWQge1xyXG4gICAgLy8gd2hpbGUgcmVtb3RlIHRhc2sgd2l0aG91dCBsb2NhbCBkYXRhLCBoYXMgc3ViZm9ybSB0aGF0IGhhcyBsb2NhbCBkYXRhIDogUmVtb3RlIHRyYW5zYWN0aW9uIGlzIHNldCBvbiB0aGUgcGFyZW50IHRhc2sgYW5kIGxvY2FsIFRyYW5zYWN0aW9uIGlzIHNldCBvbiBzdWJmb3JtLlxyXG4gICAgLy8gVGhlIG1lbWJlciB0YXNrLlRyYW5zYWN0aW9uIGlzIGdldCB0aGUgRGF0YXZpZXdNYW5hZ2VyLkN1cnJlbnREYXRhdmlld01hbmFnZXIuVHJhbnNhY3Rpb25cclxuICAgIC8vIGZvciBzdWJmb3JtIDogIHRoZSBDdXJyZW50RGF0YXZpZXdNYW5hZ2VyIGlzIHRoZSBsb2NhbERhdGF2aWV3IHNvIHRoZSB0cmFuc2FjdGlvbiBpcyB0aGUgbG9jYWwgdHJhbnNhY3Rpb24gdGhhdCB0aGUgc3ViZm9ybSBpcyB0aGUgb3duZXIgYnV0IG5vdCB0aGUgb3duZXIgb2YgdGhlIHJlbW90ZSB0cmFuc2FjdGlvblxyXG4gICAgLy8gVGhlIG1ldGhvZCBzZXRUcmFuc0NsZWFyZWQoKSBuZWVkIHRvIGJlIGNhbGxlZCBvbmx5IGZvciByZW1vdGUgdHJhbnNhY3Rpb24gdGhhdCBpcyB0aGUgb3duZXIgdGFzayAuIChfdHJhbnNDbGVhcmVkIGlzIHNlbmQgdG8gdGhlIHNlcnZlciApXHJcblxyXG4gICAgLy8gY2hlY2sgdGhlIHJlbW90ZSB0cmFuc2FjdGlvblxyXG4gICAgbGV0IHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbiA9IHRoaXMuRGF0YXZpZXdNYW5hZ2VyLlJlbW90ZURhdGF2aWV3TWFuYWdlci5UcmFuc2FjdGlvbjtcclxuICAgIGlmICh0cmFuc2FjdGlvbiAhPT0gbnVsbCAmJiB0cmFuc2FjdGlvbi5pc093bmVyKHRoaXMpICYmIHRyYW5zYWN0aW9uLmdldExldmVsKCkgPT09ICdQJykge1xyXG4gICAgICB0aGlzLkRhdGF2aWV3TWFuYWdlci5SZW1vdGVEYXRhdmlld01hbmFnZXIuVHJhbnNhY3Rpb24gPSBudWxsO1xyXG4gICAgICAoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLnNldFRyYW5zQ2xlYXJlZCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBDcmVhdGVzIGV4aXQgY29tbWFuZCwgYWRkcyBpdCB0byBjb21tYW5kcyBmb3IgZXhlY3V0aW9uIGFuZCBleGVjdXRlIGl0IGlmIGl0J3MgbmVlZGVkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyZXZlcnNpYmxlRXhpdFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic3ViZm9ybURlc3RpbmF0aW9uXCI+PC9wYXJhbT5cclxuICBhc3luYyBFeGl0KHJldmVyc2libGVFeGl0OiBib29sZWFuLCBzdWJmb3JtRGVzdGluYXRpb246IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIC8vIGlmIHJlY29yZCBzdWZmaXggd2FzIHN1Y2Nlc3NmdWwgYW5kIHRoaXMgdGFzayBpcyBub3QgYSBzdWIgZm9ybVxyXG4gICAgLy8gdGhlbiBlbmQgdGhlIHRhc2sgYXQgdGhlIHNlcnZlciBzaWRlXHJcblxyXG4gICAgbGV0IGNtZDogSUNsaWVudENvbW1hbmQgPSByZXZlcnNpYmxlRXhpdCA/XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJQ2xpZW50Q29tbWFuZD5Db21tYW5kRmFjdG9yeS5DcmVhdGVCcm93c2VyRXNjRXZlbnRDb21tYW5kKHRoaXMuZ2V0VGFza1RhZygpLCBzdWJmb3JtRGVzdGluYXRpb24pIDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPElDbGllbnRDb21tYW5kPkNvbW1hbmRGYWN0b3J5LkNyZWF0ZU5vblJldmVyc2libGVFeGl0Q29tbWFuZCh0aGlzLmdldFRhc2tUYWcoKSwgc3ViZm9ybURlc3RpbmF0aW9uKTtcclxuXHJcbiAgICB0aGlzLl9tZ0RhdGEuQ21kc1RvU2VydmVyLkFkZChjbWQpO1xyXG4gICAgaWYgKCFzdWJmb3JtRGVzdGluYXRpb24pIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICAvLyBFeGVjdXRlIHRoZSBCcm93ZXJFc2NDb21tYW5kIGltbWVkaWF0ZWx5IG9ubHkgaWZcclxuICAgICAgICAvLyAxLiBJZiB3ZSBhcmUgdHJ5aW5nIHRvIGNsb3NlIHRoZSBicm93c2VyIGFuZCB0aGUgdG9wbW9zdCB0YXNrIGlzIGNsb3NpbmdcclxuICAgICAgICAvLyAyLiBJZiB1c2VyIGV4cGxpY2l0bHkgY2xvc2VzIHRoZSBjdXJyZW50IHRhc2sgKGxpa2UgY2xvc2luZyBvdmVybGF5KVxyXG4gICAgICAgIC8vIEZvciBhbGwgb3RoZXIgRXhpdCgpIGNvbW1hbmRzLCBqdXN0IGFkZCB0aGUgQnJvd3NlckVzY0NvbW1hbmQgdG8gQ21kc1RvU2VydmVyLlxyXG4gICAgICAgIGlmKHRoaXMuZ2V0VGFza1RhZygpID09IE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuU3RhcnR1cE1nRGF0YS5nZXRGaXJzdFRhc2soKS5nZXRUYXNrVGFnKCkgfHxcclxuICAgICAgICAgICAhKE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuU3RhcnR1cE1nRGF0YS5nZXRGaXJzdFRhc2soKS5JbkVuZFRhc2sgJiYgTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5TdGFydHVwTWdEYXRhLmdldEZpcnN0VGFzaygpLkNsb3NpbmdGb3JtVUkpKVxyXG4gICAgICAgICAgYXdhaXQgVGFzay5Db21tYW5kc1Byb2Nlc3Nvci5FeGVjdXRlKENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZW5kaW5nSW5zdHJ1Y3Rpb24uVEFTS1NfQU5EX0NPTU1BTkRTKTtcclxuICAgICAgfVxyXG4gICAgICBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgLy8gSWYgdGhlIGNsb3Npbmcgb2YgTWFpbiBQcm9ncmFtIGRpZG4ndCBzdWNjZWVkIG9uIHNlcnZlciwgY2xvc2UgaXQgaGVyZSAtLS0gb2Zjb3Vyc2UgaXRcclxuICAgICAgICAvLyBpbmNsdWRlcyB0aGUgZXhlY3V0aW9uIG9mIFRTIGFzIHdlbGwuXHJcbiAgICAgICAgaWYgKHRoaXMuaXNNYWluUHJvZygpKSB7XHJcbiAgICAgICAgICB0aGlzLl9tZ0RhdGEuQ21kc1RvU2VydmVyLkFkZChjbWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICB0aHJvdyBlcnI7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgUmVjdXJzaXZlIGZ1bmN0aW9uIGZvciBmaW5hbGx5IG9wZXJhdGlvbiBvZiBlbmRUYXNrIGZ1bmN0aW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInN1Y2NlZWRlZFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyZXZlcnNpYmxlRXhpdFwiPlxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIHByaXZhdGUgaGFuZGxlRmluYWxseUVuZFRhc2soc3VjY2VlZGVkOiBib29sZWFuLCByZXZlcnNpYmxlRXhpdDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgbGV0IHN1YlRhc2s6IFRhc2s7XHJcblxyXG4gICAgaWYgKHRoaXMuaGFzU3ViVGFza3MoKSkge1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5TdWJUYXNrcy5nZXRTaXplKCk7IGkrKykge1xyXG4gICAgICAgIHN1YlRhc2sgPSA8VGFzaz50aGlzLlN1YlRhc2tzLmdldFRhc2soaSk7XHJcbiAgICAgICAgc3ViVGFzay5oYW5kbGVGaW5hbGx5RW5kVGFzayhzdWNjZWVkZWQsIHJldmVyc2libGVFeGl0KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuSW5FbmRUYXNrID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKHN1Y2NlZWRlZClcclxuICAgICAgdGhpcy5faXNTdGFydGVkID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKCFzdWNjZWVkZWQgJiYgcmV2ZXJzaWJsZUV4aXQgJiYgdGhpcy5Jc1RyeWluZ1RvU3RvcClcclxuICAgICAgdGhpcy5zZXRUcnlpbmdUb1N0b3AoZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFJlY3Vyc2l2ZSBmdW5jdGlvbiBmb3IgVGFzayBQcmVmaXggZXhlY3V0aW9uIGZvciBhbGwgc3ViZm9ybXNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgYXN5bmMgaGFuZGxlVGFza1N1ZmZpeCh3aXRoU3ViVGFza3M6IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCBzdWNjZWVkZWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgbGV0IHN1YlRhc2s6IFRhc2s7XHJcblxyXG4gICAgaWYgKHdpdGhTdWJUYXNrcykge1xyXG4gICAgICBpZiAodGhpcy5oYXNTdWJUYXNrcygpKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuU3ViVGFza3MuZ2V0U2l6ZSgpICYmIHN1Y2NlZWRlZDsgaSsrKSB7XHJcbiAgICAgICAgICBzdWJUYXNrID0gPFRhc2s+dGhpcy5TdWJUYXNrcy5nZXRUYXNrKGkpO1xyXG4gICAgICAgICAgc3VjY2VlZGVkID0gYXdhaXQgc3ViVGFzay5oYW5kbGVUYXNrU3VmZml4KHdpdGhTdWJUYXNrcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHN1Y2NlZWRlZClcclxuICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRoaXMsIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQVNLX1NVRkZJWCk7XHJcbiAgICBzdWNjZWVkZWQgPSAhQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKTtcclxuICAgIHRoaXMuVGFza1N1ZmZpeEV4ZWN1dGVkID0gdHJ1ZTtcclxuICAgIHJldHVybiBzdWNjZWVkZWQ7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCBpZiB0aGUgdGFzayBpbnRvIGNyZWF0ZSBsaW5lIHByb2Nlc3Npbmcgb3Igbm90XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXRJbkNyZWF0ZUxpbmUoaW5DcmVhdGVMaW5lOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl9pbkNyZWF0ZUxpbmUgPSBpbkNyZWF0ZUxpbmU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IGlmIHRoZSB0YXNrIGlzIGludG8gQ3JlYXRlIGxpbmUgcHJvY2Vzc2luZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0SW5DcmVhdGVMaW5lKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2luQ3JlYXRlTGluZTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgaGFuZGxlIGFuIGludGVybmFsIGV2ZW50IG9uIHRoaXMgdGFza3Mgc2xhdmUgdGFza3MuIFNsYXZlIHRhc2tzIGFyZTogKDEpIElmIHRoaXMgdGFzayBpcyBhIGR5bmFtaWNEZWYudHJhbnNhY3Rpb25cclxuICAvLy8gICBvd25lciAtIGFsbCB0YXNrcyBwYXJ0aWNpcGF0aW5nIGluIHRoZSB0cmFuc2FjdGlvbnMgYXJlIGl0cyBzbGF2ZXMuICgyKSBJZiB0aGlzIHRhc2sgaXMgbm90IGFuIG93bmVyIC1cclxuICAvLy8gICBhbGwgaXRzIHN1YmZvcm1zIGFyZSBjb25zaWRlcmVkIHNsYXZlcy4gaWYgb25lIG9mIHRoZSBzdWIgdGFza3MgZmFpbGVkIGhhbmRsaW5nIHRoZSBldmVudCB0aGVuIGFcclxuICAvLy8gICByZWZlcmVuY2UgdG8gdGhhdCB0YXNrIGlzIHJldHVybmVkIG90aGVyd2lzZSB0aGUgcmV0dXJuZWQgdmFsdWUgaXMgbnVsbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpbnRlcm5hbEV2dENvZGVcIj50aGUgY29kZSBvZiB0aGUgaW50ZXJuYWwgZXZlbnQgdG8gaGFuZGxlPC9wYXJhbT5cclxuICBhc3luYyBoYW5kbGVFdmVudE9uU2xhdmVUYXNrcyhpbnRlcm5hbEV2dENvZGU6IG51bWJlcik6IFByb21pc2U8VGFzaz4ge1xyXG4gICAgbGV0IGk6IG51bWJlcjtcclxuICAgIGxldCB0YXNrOiBUYXNrID0gbnVsbDtcclxuICAgIGxldCBmYWlsdXJlVGFzazogVGFzayA9IG51bGw7XHJcbiAgICBsZXQgbWdkVGFiOiBJTUdEYXRhQ29sbGVjdGlvbiA9IEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZTtcclxuICAgIGxldCB0cmlnZ2VyZWRUYXNrczogTGlzdDxUYXNrQmFzZT4gPSBtZ2RUYWIuZ2V0VHJpZ2dlcmVkVGFza3ModGhpcyk7XHJcbiAgICBsZXQgb3JwaGFuczogTGlzdDxUYXNrPiA9IG51bGw7XHJcbiAgICBsZXQgc2FtZVRyYW5zOiBib29sZWFuO1xyXG4gICAgbGV0IGhhc1NsYXZlczogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IGlzT3duZXI6IGJvb2xlYW4gPSB0aGlzLlRyYW5zYWN0aW9uICE9IG51bGwgJiYgdGhpcy5UcmFuc2FjdGlvbi5pc093bmVyKHRoaXMpO1xyXG5cclxuICAgIC8vIGV2ZW50IG9uIHRyYW5zLW93bmVyIHNob3VsZCBiZSBwcm9wb2dhdGVkIHRvIGFsbCBvdGhlciB0YXNrcyBpbiB0aGUgZHluYW1pY0RlZi50cmFuc2FjdGlvbi5cclxuICAgIGlmIChpc093bmVyKSB7XHJcbiAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnNldEV2ZW50U2NvcGVUcmFucygpO1xyXG4gICAgICBvcnBoYW5zID0gbmV3IExpc3Q8VGFzaz4oKTtcclxuXHJcbiAgICAgIC8vIEluIGNhc2UgYSBjaGFuZ2Ugb2YgdHJhbnMtb3duZXJzaGlwIHByZXZpb3VzbHkgdG9vayBwbGFjZSwgdGhlcmUgbWlnaHQgYmUgdGFza3NcclxuICAgICAgLy8gd2hpY2ggYmVsb25nIHRvIHRoZSBjdXJyZW50IGR5bmFtaWNEZWYudHJhbnNhY3Rpb24gYnV0IHRoZWlyIHBhcmVudCBpcyBnb25lLiBUaGVzZSBhcmUgb3JwaGFuIHRhc2tzXHJcbiAgICAgIC8vIGFuZCB3ZSBuZWVkIHRvIHByb3BvZ2F0ZSB0aGUgZXZlbnQgdG8gdGhlbSB0b28uXHJcbiAgICAgIG1nZFRhYi5zdGFydFRhc2tzSXRlcmF0aW9uKCk7XHJcbiAgICAgIHdoaWxlICgodGFzayA9IDxUYXNrPm1nZFRhYi5nZXROZXh0VGFzaygpKSAhPSBudWxsKSB7XHJcbiAgICAgICAgc2FtZVRyYW5zID0gdGFzay5UcmFuc2FjdGlvbiAhPSBudWxsICYmIHRoaXMuVHJhbnNhY3Rpb24uZ2V0VHJhbnNJZCgpID09PSB0YXNrLlRyYW5zYWN0aW9uLmdldFRyYW5zSWQoKTtcclxuICAgICAgICBpZiAodGFzayAhPT0gdGhpcyAmJiBzYW1lVHJhbnMgJiYgdGFzay5QcmV2aW91c2x5QWN0aXZlVGFza0lkICE9IG51bGwgJiYgbWdkVGFiLkdldFRhc2tCeUlEKHRhc2suUHJldmlvdXNseUFjdGl2ZVRhc2tJZCkgPT0gbnVsbClcclxuICAgICAgICAgIG9ycGhhbnMucHVzaCh0YXNrKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGxldCBzY29wZVRyYW5zOiBib29sZWFuID0gQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaXNFdmVudFNjb3BlVHJhbnMoKTtcclxuXHJcbiAgICAvLyBQcm9wYWdhdGUgdGhlIGV2ZW50IGFjY29yZGluZyB0byB0aGUgc2NvcGUsIG9uIGFsbCB0YXNrcyB0cmlnZ2VyZWQgYnkgbWVcclxuICAgIGZvciAoaSA9IDA7IGkgPCB0cmlnZ2VyZWRUYXNrcy5sZW5ndGggJiYgIUFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCk7IGkrKykge1xyXG4gICAgICB0YXNrID0gPFRhc2s+dHJpZ2dlcmVkVGFza3MuZ2V0X0l0ZW0oaSk7XHJcbiAgICAgIHNhbWVUcmFucyA9IHRoaXMuVHJhbnNhY3Rpb24gIT0gbnVsbCAmJiB0YXNrLlRyYW5zYWN0aW9uICE9IG51bGwgJiYgdGhpcy5UcmFuc2FjdGlvbi5nZXRUcmFuc0lkKCkgPT09IHRhc2suVHJhbnNhY3Rpb24uZ2V0VHJhbnNJZCgpO1xyXG5cclxuICAgICAgaWYgKCF0YXNrLklzU3ViRm9ybSAmJiAoc2NvcGVUcmFucyAmJiBzYW1lVHJhbnMpICYmIHRhc2suaXNTdGFydGVkKCkpIHtcclxuICAgICAgICAvLyBRQ1IgNDM4NTMwIEd1YXJhbnRlZSB0aGF0IGJlZm9yZSBwcmVmaXggY29tcHV0ZSB3aWxsIGJlIGV4ZWN1dGVkXHJcbiAgICAgICAgaWYgKHRhc2suZ2V0Rm9ybSgpLkZvcm1SZWZyZXNoZWQgJiYgaW50ZXJuYWxFdnRDb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCAmJiB0YXNrLmdldExldmVsKCkgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spXHJcbiAgICAgICAgICBhd2FpdCAoPERhdGFWaWV3PnRhc2suRGF0YVZpZXcpLmN1cnJSZWNDb21wdXRlKGZhbHNlKTtcclxuICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgaW50ZXJuYWxFdnRDb2RlKTtcclxuICAgICAgICBoYXNTbGF2ZXMgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUHJvcGFnYXRlIHRoZSBldmVudCBvbiBvcnBoYW5zIHRvby5cclxuICAgIGZvciAoOyBpc093bmVyICYmIGkgPCBvcnBoYW5zLmxlbmd0aCAmJiAhQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKTsgaSsrKSB7XHJcbiAgICAgIHRhc2sgPSBvcnBoYW5zLmdldF9JdGVtKGkpO1xyXG5cclxuICAgICAgLy8gUUNSIDQzODUzMCBHdWFyYW50ZWUgdGhhdCBiZWZvcmUgcHJlZml4IGNvbXB1dGUgd2lsbCBiZSBleGVjdXRlZFxyXG4gICAgICBpZiAodGFzay5nZXRGb3JtKCkuRm9ybVJlZnJlc2hlZCAmJiBpbnRlcm5hbEV2dENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYICYmIHRhc2suZ2V0TGV2ZWwoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSylcclxuICAgICAgICBhd2FpdCAoPERhdGFWaWV3PnRhc2suRGF0YVZpZXcpLmN1cnJSZWNDb21wdXRlKGZhbHNlKTtcclxuICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIGludGVybmFsRXZ0Q29kZSk7XHJcbiAgICAgIGhhc1NsYXZlcyA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGhhc1NsYXZlcyAmJiBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKVxyXG4gICAgICBmYWlsdXJlVGFzayA9IHRhc2s7XHJcblxyXG4gICAgaWYgKGlzT3duZXIpXHJcbiAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmNsZWFyRXZlbnRTY29wZSgpO1xyXG5cclxuICAgIHJldHVybiBmYWlsdXJlVGFzaztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBlbmFibGUtZGlzYWJsZSBhY3Rpb25zIGZvciBhIHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgZW5hYmxlUmVjb3JkQWN0aW9ucygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBkYXRhdmlldzogRGF0YVZpZXcgPSA8RGF0YVZpZXc+dGhpcy5EYXRhVmlldztcclxuXHJcbiAgICBhd2FpdCB0aGlzLnNldENyZWF0ZURlbGV0ZUFjdHNFbmFibGVTdGF0ZSgpO1xyXG5cclxuICAgIGlmIChkYXRhdmlldy5JbmNsdWRlc0ZpcnN0KCkgfHwgZGF0YXZpZXcuSXNPbmVXYXlLZXkpIHtcclxuICAgICAgaWYgKGRhdGF2aWV3LmlzRW1wdHlEYXRhdmlldygpIHx8IGRhdGF2aWV3LmdldEN1cnJSZWNJZHgoKSA9PT0gMCkge1xyXG4gICAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9QUlZMSU5FLCBmYWxzZSk7XHJcbiAgICAgICAgaWYgKGRhdGF2aWV3LklzT25lV2F5S2V5KVxyXG4gICAgICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX0JFR1RCTCwgdHJ1ZSk7XHJcbiAgICAgICAgZWxzZSB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfQkVHVEJMLCBmYWxzZSk7XHJcbiAgICAgICAgaWYgKHRoaXMuRm9ybS5pc1NjcmVlbk1vZGUoKSlcclxuICAgICAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9QUlZQQUdFLCBmYWxzZSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX1BSVkxJTkUsIHRydWUpO1xyXG4gICAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9CRUdUQkwsIHRydWUpO1xyXG4gICAgICAgIGlmICh0aGlzLkZvcm0uaXNTY3JlZW5Nb2RlKCkpXHJcbiAgICAgICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfUFJWUEFHRSwgdHJ1ZSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCF0aGlzLkZvcm0uaXNTY3JlZW5Nb2RlKCkpXHJcbiAgICAgICAgaWYgKGRhdGF2aWV3LmlzRW1wdHlEYXRhdmlldygpIHx8IChkYXRhdmlldy5nZXRDdXJyUmVjSWR4KCkgPT09IDApIHx8IChkYXRhdmlldy5nZXRUb3BSZWNJZHgoKSA9PT0gMCkpXHJcbiAgICAgICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfUFJWUEFHRSwgZmFsc2UpO1xyXG4gICAgICAgIGVsc2UgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX1BSVlBBR0UsIHRydWUpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9CRUdUQkwsIHRydWUpO1xyXG4gICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfUFJWUEFHRSwgdHJ1ZSk7XHJcbiAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9QUlZMSU5FLCB0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZGF0YXZpZXcuSW5jbHVkZXNMYXN0KCkpIHtcclxuICAgICAgaWYgKCgodGhpcy5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfUVVFUlkpIHx8IGRhdGF2aWV3LmlzRW1wdHlEYXRhdmlldygpIHx8XHJcbiAgICAgICAgICAoKHRoaXMuZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX01PRElGWSkgJiZcclxuICAgICAgICAgICAgKCFFbnZpcm9ubWVudC5JbnN0YW5jZS5hbGxvd0NyZWF0ZUluTW9kaWZ5TW9kZSh0aGlzLmdldENvbXBJZHgoKSkgfHxcclxuICAgICAgICAgICAgICAhYXdhaXQgdGhpcy5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfQ1JFQVRFLCB0cnVlKSkpKSAmJiAoZGF0YXZpZXcuZ2V0Q3VyclJlY0lkeCgpICsgMSkgPT09IGRhdGF2aWV3LmdldFNpemUoKSkge1xyXG4gICAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9OWFRMSU5FLCBmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX0VORFRCTCwgZmFsc2UpO1xyXG4gICAgICAgIGlmICh0aGlzLkZvcm0uaXNTY3JlZW5Nb2RlKCkpXHJcbiAgICAgICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfTlhUUEFHRSwgZmFsc2UpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9OWFRMSU5FLCB0cnVlKTtcclxuICAgICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfRU5EVEJMLCB0cnVlKTtcclxuICAgICAgICBpZiAodGhpcy5Gb3JtLmlzU2NyZWVuTW9kZSgpKVxyXG4gICAgICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX05YVFBBR0UsIHRydWUpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoIXRoaXMuRm9ybS5pc1NjcmVlbk1vZGUoKSkge1xyXG4gICAgICAgIGlmIChkYXRhdmlldy5pc0VtcHR5RGF0YXZpZXcoKSB8fCAoKGRhdGF2aWV3LmdldFNpemUoKSAtIGRhdGF2aWV3LmdldFRvcFJlY0lkeCgpKSA8PSB0aGlzLkZvcm0uZ2V0Um93c0luUGFnZSgpKSlcclxuICAgICAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9OWFRQQUdFLCBmYWxzZSk7XHJcbiAgICAgICAgZWxzZSB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfTlhUUEFHRSwgdHJ1ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfTlhUTElORSwgdHJ1ZSk7XHJcbiAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9OWFRQQUdFLCB0cnVlKTtcclxuICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX0VORFRCTCwgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGRhdGF2aWV3LmlzRW1wdHlEYXRhdmlldygpKVxyXG4gICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DQU5DRUwsIGZhbHNlKTtcclxuICAgIGVsc2VcclxuICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ0FOQ0VMLCB0cnVlKTtcclxuXHJcbiAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FTlRFUl9ST1dfRURJVElORywgdHJ1ZSk7XHJcblxyXG4gICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfTk9fUFJPR19FWEVfUklHSFRTLCB0cnVlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgdGhlIHRhc2sgaXMgc3RhcnRlZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaXNTdGFydGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lzU3RhcnRlZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBzdWIgdGFza3MgdGFibGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldFN1YlRhc2tzKCk6IFRhc2tzVGFibGUge1xyXG4gICAgcmV0dXJuIHRoaXMuU3ViVGFza3M7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIHRoaXMgdGFza3MgcmVmcmVzaGVzIG9uIGEgY2hhbmdlIG9mIG9uZSBvZiBpdHMgcGFyZW50IGZpZWxkcyB3aXRoIHRoZSBnaXZlbiBpZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmbGRJZFwiPnRoZSBpZCBvZiB0aGUgcGFyZW50IGZpZWxkPC9wYXJhbT5cclxuICByZWZyZXNoZXNPbihmbGRJZDogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgcmVzdWx0OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgIXJlc3VsdCAmJiB0aGlzLlJlZnJlc2hPblZhcnMgIT09IG51bGwgJiYgaSA8IHRoaXMuUmVmcmVzaE9uVmFycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICByZXN1bHQgPSAodGhpcy5SZWZyZXNoT25WYXJzW2ldID09PSBmbGRJZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjbGVhciB0aGlzIHRhc2sgZnJvbSB0aGUgYWN0aXZlIHRyYW5zYWN0aW9ucyBhY2NvdW50XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIEFib3J0VHJhbnNhY3Rpb24oKTogdm9pZCB7XHJcbiAgICB0aGlzLkRhdGF2aWV3TWFuYWdlci5SZW1vdGVEYXRhdmlld01hbmFnZXIuVHJhbnNhY3Rpb24gPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB2YWx1ZSBvZiBwcmV2ZW50UmVjb3JkU3VmZml4IHRvIHZhbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ2YWxcIj50cnVlIGlmIHdlIGFscmVhZHkgcGVyZm9ybWVkIHJlY29yZCBzdWZmaXg8L3BhcmFtPlxyXG4gIHNldFByZXZlbnRSZWNvcmRTdWZmaXgodmFsOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl9wcmV2ZW50UmVjb3JkU3VmZml4ID0gdmFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB2YWx1ZSBvZiBwcmV2ZW50UmVjb3JkU3VmZml4XHJcbiAgLy8vIDwvc3VtbWFyeVxyXG4gIGdldFByZXZlbnRSZWNvcmRTdWZmaXgoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fcHJldmVudFJlY29yZFN1ZmZpeDtcclxuICB9XHJcblxyXG4gIHNldFByZXZlbnRDb250cm9sQ2hhbmdlKHZhbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5fcHJldmVudENvbnRyb2xDaGFuZ2UgPSB2YWw7XHJcbiAgfVxyXG5cclxuICBnZXRQcmV2ZW50Q29udHJvbENoYW5nZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9wcmV2ZW50Q29udHJvbENoYW5nZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzaWduYWwgdGhlIHNlcnZlciBjbG9zZWQgdGhpcyB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICByZXNldEtub3duVG9TZXJ2ZXIoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9rbm93blRvU2VydmVyID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgZHZQb3MgdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiLVwiPmV2YWx1YXRlcyB0aGUgZGVyY3JpcHRvciBhbmQgcmV0dXJuIHRoZSBub24taGF2ZSBkdlBvcyB2YWx1ZTwvcGFyYW0+XHJcbiAgZXZhbHVhdGVEZXNjcmlwdG9yKCk6IG51bWJlciB7XHJcbiAgICBsZXQgcmVzdWx0OiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgbGV0IHJlczogTlVNX1RZUEU7XHJcbiAgICBpZiAodGhpcy5EdlBvc0Rlc2NyaXB0b3IgPT0gbnVsbClcclxuICAgICAgcmV0dXJuIEhhc2hVdGlscy5HZXRIYXNoQ29kZShyZXN1bHQpO1xyXG5cclxuICAgIGxldCBmaXJzdDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgLy8gZ28gb3ZlciB0aGUgbGlzdCBvZiB0aGUgZGVzY3JpcHRvclxyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuRHZQb3NEZXNjcmlwdG9yLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmICghZmlyc3QpXHJcbiAgICAgICAgcmVzdWx0ICs9IFwiO1wiO1xyXG5cclxuICAgICAgbGV0IGN1cnJlbnRDZWxsOiBzdHJpbmdbXSA9IHRoaXMuRHZQb3NEZXNjcmlwdG9yLmdldF9JdGVtKGkpO1xyXG5cclxuICAgICAgLy8gcGFyc2UgdGhlIGN1cnJlbnQgdGFzayBhbmQgZmllbGQgbnVtYmVyXHJcbiAgICAgIGxldCBjdXJyZW50VGFnOiBzdHJpbmcgPSBjdXJyZW50Q2VsbFswXTtcclxuICAgICAgbGV0IGN1cnJlbnRWZWVJZHg6IG51bWJlciA9IE5OdW1iZXIuUGFyc2UoY3VycmVudENlbGxbMV0pO1xyXG4gICAgICBsZXQgY3VycmVudFRhc2sgPSA8VGFzaz5BY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuR2V0VGFza0J5SUQoY3VycmVudFRhZyk7XHJcbiAgICAgIGxldCBjdXJyZW50RmllbGQgPSA8RmllbGQ+Y3VycmVudFRhc2suRGF0YVZpZXcuZ2V0RmllbGQoY3VycmVudFZlZUlkeCk7XHJcbiAgICAgIGxldCBkaXNwVmFsOiBzdHJpbmcgPSBjdXJyZW50RmllbGQuZ2V0RGlzcFZhbHVlKCk7XHJcblxyXG4gICAgICAvLyBRQ1IgOTc4NTY2XHJcbiAgICAgIGlmIChjdXJyZW50RmllbGQuaXNOdWxsKCkpXHJcbiAgICAgICAgZGlzcFZhbCA9IFwiXCI7XHJcblxyXG4gICAgICAvLyBRQ1IgNzQzMjkwXHJcbiAgICAgIGxldCBwaWM6IFBJQztcclxuICAgICAgc3dpdGNoIChjdXJyZW50RmllbGQuZ2V0VHlwZSgpKSB7XHJcbiAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkJPT0xFQU46XHJcbiAgICAgICAgLy8gYm9vbGVhbiBpcyBzdG9yZWQgYXMgXCJvXCIgb3IgXCIxXCIgc28gd2UganVzdCBhZGQgdGhlbSBhcyB3ZVxyXG4gICAgICAgIC8vIGRvIGluIHRoZSBzZXJ2ZXJcclxuICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEE6XHJcbiAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREU6XHJcbiAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkJMT0I6XHJcbiAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkJMT0JfVkVDVE9SOlxyXG4gICAgICAgICAgcmVzdWx0ICs9IGRpc3BWYWw7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkRBVEU6XHJcbiAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLlRJTUU6XHJcbiAgICAgICAgICAvLyBRQ1IgNzQyOTY2IGRhdGUgYW5kIHRpbWUgc3BlY2lhbCB0cmVhdG1lbnRcclxuICAgICAgICAgIGlmIChkaXNwVmFsICE9PSBcIlwiKSB7XHJcbiAgICAgICAgICAgIHBpYyA9IG5ldyBQSUMoY3VycmVudEZpZWxkLmdldFBpY3R1cmUoKSwgY3VycmVudEZpZWxkLmdldFR5cGUoKSwgMCk7XHJcbiAgICAgICAgICAgIGxldCBjb252OiBEaXNwbGF5Q29udmVydG9yID0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZTtcclxuICAgICAgICAgICAgcmVzdWx0ICs9IGNvbnYubWcyZGlzcChkaXNwVmFsLCBcIlwiLCBwaWMsIGZhbHNlLCB0aGlzLmdldENvbXBJZHgoKSwgZmFsc2UpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDOlxyXG4gICAgICAgICAgLy8gUUNSIDU0MzIwNCB3aGVuIHRoZXJlIGlzIGFuIGVtcHR5IHN0cmluZyAoYWxwaGEpYXBwZW5kIG5vdGhpbmdcclxuICAgICAgICAgIGlmIChkaXNwVmFsICE9PSBcIlwiKSB7XHJcbiAgICAgICAgICAgIHJlcyA9IG5ldyBOVU1fVFlQRShkaXNwVmFsKTtcclxuICAgICAgICAgICAgcGljID0gbmV3IFBJQyhjdXJyZW50RmllbGQuZ2V0UGljdHVyZSgpLCBjdXJyZW50RmllbGQuZ2V0VHlwZSgpLCAwKTtcclxuICAgICAgICAgICAgcmVzdWx0ICs9IHJlcy50b19hKHBpYyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgZmlyc3QgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgdG1wU3RyMjogc3RyaW5nID0gU3RyVXRpbC5zdHJpbmdUb0hleGFEdW1wKHJlc3VsdCwgNCk7XHJcblxyXG4gICAgcmV0dXJuIEhhc2hVdGlscy5HZXRIYXNoQ29kZSh0bXBTdHIyKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBidWlsZHMgdGhlIGR2UG9zIGRlc2NyaXB0b3IgdmVjdG9yIGVhY2ggb2YgdGhlIGR2UG9zRGVzY3JpcHRvciB2ZWN0b3IgZWxlbWVudHMgaXMgYSBTdHJpbmcgYXJyYXkgb2Ygc2l6ZVxyXG4gIC8vLyAgIDIgaW4gdGhlIGZpcnN0IGNlbGwgb2YgZWFjaCBhcnJheSB3ZSBoYXZlIHRoZSB0YWcgYW5kIGluIHRoZSBzZWNvbmQgd2UgaGF2ZSB0aGUgdmVlIGlpbmRleFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0RGVzY3JpcHRvcihuZXdEZXNjOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmICghKG5ld0Rlc2MudHJpbSgpID09PSBcIlwiKSkge1xyXG4gICAgICBsZXQgZGVzYzogc3RyaW5nW10gPSBTdHJVdGlsLnRva2VuaXplKG5ld0Rlc2MsIFwiO1wiKTtcclxuICAgICAgdGhpcy5EdlBvc0Rlc2NyaXB0b3IgPSBuZXcgTGlzdDxzdHJpbmdbXT4oKTtcclxuXHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBkZXNjLmxlbmd0aDsgaSA9IGkgKyAxKSB7XHJcbiAgICAgICAgbGV0IGNlbGw6IHN0cmluZ1tdID0gbmV3IEFycmF5PHN0cmluZz4oMik7XHJcbiAgICAgICAgbGV0IHRhZ1ZlZVBhaXI6IHN0cmluZ1tdID0gU3RyVXRpbC50b2tlbml6ZShkZXNjW2ldLCBcIixcIik7XHJcbiAgICAgICAgY2VsbFswXSA9IHRhZ1ZlZVBhaXJbMF07XHJcbiAgICAgICAgY2VsbFsxXSA9IHRhZ1ZlZVBhaXJbMV07XHJcblxyXG4gICAgICAgIC8vIHB1dCB0aGUgY2VsbCB2YWx1ZSBpbnRvIHRoZSB2ZWN0b3JcclxuICAgICAgICB0aGlzLkR2UG9zRGVzY3JpcHRvci5wdXNoKGNlbGwpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgY2FjaGUgb2JqZWN0IG9mIHRoaXMgdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0VGFza0NhY2hlKCk6IER2Q2FjaGUge1xyXG4gICAgcmV0dXJuIHRoaXMuX2R2Q2FjaGU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcHJlcGFyZSBhbGwgc3ViLWZvcm0gdHJlZSdzIHRvIGVpdGhlciBnbyB0byBzZXJ2ZXIgKGFmdGVyIGRlbGV0aW5nIHJlbGV2YW50IGVudHJpZXMpIG9yIHRvIHRha2UgZC52IGZyb21cclxuICAvLy8gICBjYWNoZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiB0cnVlIGlmIGFsbCBzdWJmb3JtIGNhbiBkbyBuZWVkIHRvIGdvIHRvIHRoZSBzZXJ2ZXIgYmVjYXVzZSBvZiB1cGRhdGVzPC9yZXR1cm5zPlxyXG4gIGFzeW5jIHByZXBhcmVDYWNoZShpZ25vcmVDdXJyOiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgc3VjY2VzczogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgLy8gY2hlY2tpbmcgbXlzZWxmIGlmIGkgYW0gYSBzdWJmb3JtXHJcbiAgICBpZiAoIWlnbm9yZUN1cnIpIHtcclxuICAgICAgaWYgKGF3YWl0IHRoaXMuaXNDYWNoZWQoKSkge1xyXG4gICAgICAgIGlmICgoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLmdldENoYW5nZWQoKSkge1xyXG4gICAgICAgICAgLy8gaXMgdGhlIGN1cnJlbnQgdXBkYXRlIGRhdGF2aWV3IHdlcmUgcHJldmlvdXNseSB0YWtlbiBmcm9tIGNhY2hlXHJcbiAgICAgICAgICB0aGlzLl9kdkNhY2hlLnJlbW92ZUR2RnJvbUNhY2hlKCg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuZ2V0RHZQb3NWYWx1ZSgpLCB0cnVlKTtcclxuICAgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgLy8gY2hlY2tzIHRoYXQgaSBhbSBhIHN1YiBmb3JtIGJ1dCBpIGFtIG5vdCBjYWNoZWRcclxuICAgICAgICBpZiAodGhpcy5Jc1N1YkZvcm0gJiYgISBhd2FpdCB0aGlzLmlzQ2FjaGVkKCkpIHtcclxuICAgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBsZXQgY3VycmV0VGFzazogVGFzaztcclxuXHJcbiAgICAvLyBjaGVjayBhbGwgbXkgc3ViIGZvcm1zXHJcbiAgICBpZiAodGhpcy5oYXNTdWJUYXNrcygpKSB7XHJcbiAgICAgIC8vIHRoaXMgbG9vcCBtdXN0IHJ1biB0byBpdHMgZW5kIHNvIGFsbCB1cGRhdGVkIGQudiB3aWxsIGJlIGRlbGV0ZWRcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuU3ViVGFza3MuZ2V0U2l6ZSgpOyBpID0gaSArIDEpIHtcclxuICAgICAgICBjdXJyZXRUYXNrID0gPFRhc2s+dGhpcy5TdWJUYXNrcy5nZXRUYXNrKGkpO1xyXG4gICAgICAgIC8vIGlmIG9uZSBvZiBteSBzdWItZm9ybXMgbmVlZHMgdG8gZ28gdG8gdGhlIHNlcnZlciAtIHNvIGRvIGlcclxuICAgICAgICBpZiAoISBhd2FpdCBjdXJyZXRUYXNrLnByZXBhcmVDYWNoZShmYWxzZSkpIHtcclxuICAgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBzdWNjZXNzO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNoZWNrcyBpZiB3ZSBjYW4gdGFrZSB0aGUgZC52IG9mIHRoZSB0YXNrIGFuZCBhbGwgaGlzIHN1Yi1mb3JtcyBmcm9tIGNhY2hlIGlzIHdlIGNhbiAtIHRha2UgdGhlbSBhbmRcclxuICAvLy8gICByZXBsYWNlIHRoZW0gd2l0aCB0aGUgY3VycmVudCBkLnYgb2YgZWFjaCB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHRydWUgaWYgYWxsIGQudidzIHdlcmUgZm91bmQgYW5kIHNldDwvcmV0dXJucz5cclxuICBhc3luYyB0ZXN0QW5kU2V0KGlnbm9yZUN1cnI6IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIC8vIGNoZWNrIGN1cnJlbnQgdGFza1xyXG4gICAgaWYgKCFpZ25vcmVDdXJyICYmIGF3YWl0IHRoaXMuaXNDYWNoZWQoKSkge1xyXG4gICAgICBsZXQgcmVxdWVzdGVkRHY6IG51bWJlciA9IHRoaXMuZXZhbHVhdGVEZXNjcmlwdG9yKCk7XHJcblxyXG4gICAgICAvLyB0cnkgdG8gdGFrZSBmcm9tIGNhY2hlIG9ubHkgaWYgcmVxdWVzdGVkIGlzIG5vdCBjdXJyZW50XHJcbiAgICAgIGlmIChyZXF1ZXN0ZWREdiAhPT0gKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5nZXREdlBvc1ZhbHVlKCkpIHtcclxuICAgICAgICBsZXQgZnJvbUNhY2hlOiBEYXRhVmlldyA9IHRoaXMuX2R2Q2FjaGUuZ2V0Q2FjaGVkRGF0YVZpZXcocmVxdWVzdGVkRHYpO1xyXG4gICAgICAgIGlmIChmcm9tQ2FjaGUgPT0gbnVsbClcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICBhd2FpdCB0aGlzLmNoYW5nZUR2KGZyb21DYWNoZSk7ICAgICAvLyBjaGFuZ2VzIHRoZSBjdXJyZW50IGQudiB3aXRoIHRoZSBvbmUgdGFrZW4gZnJvbSBjYWNoZSBkbyBub3QgZm9yZ2V0IHRvXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlIGN1cnJlbnQgbmVlZHMgdG8gYmUgaW5zZXJ0ZWQgdG8gdGhlIGNhY2hlXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIFFDUiAjNDMwMDQ1LiBJbmRpY2F0ZSB0aGF0IFJQIG11c3QgYmUgZXhlY3V0ZWQgYWZ0ZXIgZ2V0IGZyb20gdGhlIGNhY2hlLlxyXG4gICAgICB0aGlzLkRvU3ViZm9ybVByZWZpeFN1ZmZpeCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gY2hlY2sgYWxsIHN1Yi1mb3JtcyB0YXNrc2RcclxuICAgIGlmICh0aGlzLmhhc1N1YlRhc2tzKCkpIHtcclxuICAgICAgLy8gdGhpcyBsb29wIGRvZXMgbm90IG5lZWQgdG8gcmVhY2ggaXRzIGVuZFxyXG4gICAgICAvLyB0aGUgbW9tZW50IG9uZSB0aGF0IG5lZWQgdG8gZ28gdG8gdGhlIHNlcnZlciBpcyBkaXNjb3ZlcmVkIGFsbCBuZWVkIHRvIGdvIGFsc29cclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuU3ViVGFza3MuZ2V0U2l6ZSgpOyBpKyspIHtcclxuICAgICAgICAvLyBkb2VzIHRoZSBpLXRoIHNvbiBuZWVkIHRvIGdvIHRvIHRoZSBzZXJ2ZXJcclxuICAgICAgICBpZiAoIWF3YWl0IHRoaXMuU3ViVGFza3MuZ2V0VGFzayhpKS50ZXN0QW5kU2V0KGZhbHNlKSlcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNoYW5nZXMgdGhlIGN1cnJlbnQgZC52IHdpdGggb25lIHRha2VuIGZyb20gY2FjaGUgaW4gdGhpcyBtZXRob2Qgd2UgZG8gbm90IGhhdmUgdG8gd29ycnkgYWJvdXQgdXBkYXRlc1xyXG4gIC8vLyAgIG9mIHRoZSBjdXJyZW50IGRhdGF2aWV3IHNpbmNlIHRoZSBtZXRob2QgaXMgb25seSBjYWxsZWQgZnJvbSB0ZXN0QW5kU2V0IHRoYXQgaW4gdHVybiBpcyBvbmx5IHVzZWQgYWZ0ZXJcclxuICAvLy8gICBhIFN1Y2Nlc3NmdWwgcnVuIHByYXByZUNhY2hlIHdoaWNoIGlzIHJlc3BvbnNpYmxlIGZvciBjaGVja2luZyBmb3IgdXBkYXRlcyBpbiB0aGUgY3VycmVudCBkYXRhdmlldyBvZlxyXG4gIC8vLyAgIGVhY2ggcmVsYXRlZCB0YXNrLiBob3dldmVyIHRvIGJlIG9uIHRoZSBzYWZlIHNpZGUgd2UgY2hlY2sgaXQgYW55d2F5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZyb21DYWNoZVwiPnRoZSBuZXcgZC52PC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIGNoYW5nZUR2KGZyb21DYWNoZTogRGF0YVZpZXcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBkYXRhdmlldzogRGF0YVZpZXcgPSA8RGF0YVZpZXc+dGhpcy5EYXRhVmlldztcclxuICAgIC8vIHRoZSBkYXRhIHZpZXcgd2UgcmVjZWl2ZSBpcyBDZXJ0YWlubHkgZnJvbSB0aGUgY2FjaGVcclxuXHJcbiAgICBpZiAoIXRoaXMuaGFzTG9jYXRlKSB7XHJcbiAgICAgIGlmICghZGF0YXZpZXcuZ2V0Q2hhbmdlZCgpICYmIGRhdGF2aWV3LkluY2x1ZGVzRmlyc3QoKSlcclxuICAgICAgICB0aGlzLl9kdkNhY2hlLnB1dEluQ2FjaGUoZGF0YXZpZXcucmVwbGljYXRlKCkpO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLmxvY2F0ZVB1dEluQ2FjaGUoKTtcclxuXHJcbiAgICAvLyBzZXQgdGhlIGRhdGEgdmlldyBmcm9tIHRoZSBjYWNoZSBhcyB0aGUgY3VycmVudFxyXG4gICAgYXdhaXQgZGF0YXZpZXcuc2V0U2FtZUFzKGZyb21DYWNoZSk7XHJcbiAgICBkYXRhdmlldy50YWtlRmxkVmFsc0Zyb21DdXJyUmVjKCk7XHJcblxyXG4gICAgdGhpcy5Gb3JtLlNldFRhYmxlSXRlbXNDb3VudCgwLCB0cnVlKTtcclxuICAgICg8TWdGb3JtPnRoaXMuRm9ybSkuc2V0VGFibGVJdGVtc0NvdW50KGZhbHNlKTtcclxuXHJcbiAgICBhd2FpdCAoPE1nRm9ybT50aGlzLkZvcm0pLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfRk9STSk7XHJcblxyXG4gICAgLy8gUUNSIDkyNDgwOTRcclxuICAgIHRoaXMuc2V0T3JpZ2luYWxUYXNrTW9kZSh0aGlzLmdldE1vZGUoKSk7XHJcbiAgfVxyXG5cclxuICBzZXRPcmlnaW5hbFRhc2tNb2RlKG9yaWdpbmFsVGFza01vZGU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5fb3JpZ2luYWxUYXNrTW9kZSA9IG9yaWdpbmFsVGFza01vZGUuY2hhckF0KDApO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgbW9kZSBvZiB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRPcmlnaW5hbFRhc2tNb2RlKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fb3JpZ2luYWxUYXNrTW9kZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBpcyBDYWNoZSBwcm9wZXJ0eSB2YWx1ZSBvZiB0aGUgc3ViIGZvcm0gY29udHJvbCB0aGlzIHRhc2sgQ29ycmVsYXRlcyB3aXRoIHRoaXMgbWV0aG9kXHJcbiAgLy8vICAgYWN0dWFsbHkgY29tYmluZXMgdHdvIHRlc3QgZmlyc3QgdGhhdCB0aGUgdGFzayBpcyBhIHN1YiBmb3JtIHNlY29uZCB0aGF0IHRoZSBzdWIgdGhhdCB0aGUgc3ViIGZvcm0gaGFzXHJcbiAgLy8vICAgdGhlIGlzIGNhY2hlZCBwcm9wZXJ0eSBzZXQgdG8geWVzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyBpc0NhY2hlZCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIHJldHVybiB0aGlzLklzU3ViRm9ybSAmJiBhd2FpdCAoPE1nQ29udHJvbEJhc2U+dGhpcy5Gb3JtLmdldFN1YkZvcm1DdHJsKCkpLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9JU19DQUNIRUQsIGZhbHNlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBkb2VzIHRoZSBpbnNlcnQgaW4gY2FjaGUgbG9naWMgaW4gY2FzZSB0aGUgdGFzayBoYXMgbG9jYXRlIGV4cHJlc3Npb25zXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGxvY2F0ZVB1dEluQ2FjaGUoKTogdm9pZCB7XHJcbiAgICBsZXQgY2FjaGVkOiBEYXRhVmlldyA9IHRoaXMuX2R2Q2FjaGUuZ2V0Q2FjaGVkRGF0YVZpZXcoKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5nZXREdlBvc1ZhbHVlKCkpO1xyXG5cclxuICAgIC8vIGlmIHRoaXMgZGF0YSB2aWV3IGhhcyBiZWVuIGluc2VydGVkIHRvIHRoZSBjYWNoZSBiZWZvcmVcclxuICAgIGlmIChjYWNoZWQgIT0gbnVsbCkge1xyXG4gICAgICBpZiAoKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5jaGVja0ZpcnN0KGNhY2hlZC5nZXRMb2NhdGVGaXJzdFJlYygpKSAmJiAhKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5nZXRDaGFuZ2VkKCkpIHtcclxuICAgICAgICAoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLnNldExvY2F0ZUZpcnN0UmVjKGNhY2hlZC5nZXRMb2NhdGVGaXJzdFJlYygpKTtcclxuICAgICAgICB0aGlzLl9kdkNhY2hlLnB1dEluQ2FjaGUoKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5yZXBsaWNhdGUoKSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZVxyXG4gICAgICAgIHRoaXMuX2R2Q2FjaGUucmVtb3ZlRHZGcm9tQ2FjaGUoKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5nZXREdlBvc1ZhbHVlKCksIHRydWUpO1xyXG4gICAgfVxyXG4gICAgLy8gcHV0IGl0IGluIHRoZSBjYWNoZSBpZiBpdCBpcyBub3QgdXBkYXRlZFxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmICghKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5nZXRDaGFuZ2VkKCkpXHJcbiAgICAgICAgdGhpcy5fZHZDYWNoZS5wdXRJbkNhY2hlKCg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykucmVwbGljYXRlKCkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIGhhc0xvY2F0ZSBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBIYXNMb2FjdGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5oYXNMb2NhdGU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgb3BlbnMgYSBuZXcgVHJhbnNhY3Rpb24gb3Igc2V0IHJlZmVyZW5jZSB0byB0aGUgZXhpc3RpbmcgVHJhbnNhY3Rpb25cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgc2V0UmVtb3RlVHJhbnNhY3Rpb24odHJhbnNJZDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBsZXQgbWdkVGFiOiBJTUdEYXRhQ29sbGVjdGlvbiA9IEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZTtcclxuICAgIGxldCB0cmFuc1Rhc2s6IFRhc2s7XHJcbiAgICBsZXQgaXNGaW5kOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgbWdkVGFiLnN0YXJ0VGFza3NJdGVyYXRpb24oKTtcclxuICAgIHdoaWxlICgodHJhbnNUYXNrID0gPFRhc2s+bWdkVGFiLmdldE5leHRUYXNrKCkpICE9IG51bGwpIHtcclxuICAgICAgLy8gdHJhbnNhY3Rpb24gbWlnaHQgYmUgbnVsbCB3aGVuIHRhc2sgaXMgYWJvcnRpbmcgYnV0IG5vdCB5ZXQgdW5sb2FkZWQuXHJcbiAgICAgIGlmICh0cmFuc1Rhc2suRGF0YXZpZXdNYW5hZ2VyLlJlbW90ZURhdGF2aWV3TWFuYWdlci5UcmFuc2FjdGlvbiAhPSBudWxsICYmXHJcbiAgICAgICAgdHJhbnNUYXNrLkRhdGF2aWV3TWFuYWdlci5SZW1vdGVEYXRhdmlld01hbmFnZXIuVHJhbnNhY3Rpb24uZ2V0VHJhbnNJZCgpID09PSB0cmFuc0lkKSB7XHJcbiAgICAgICAgaXNGaW5kID0gdHJ1ZTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuRGF0YXZpZXdNYW5hZ2VyLlJlbW90ZURhdGF2aWV3TWFuYWdlci5UcmFuc2FjdGlvbiA9IChpc0ZpbmQgP1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zVGFzay5EYXRhdmlld01hbmFnZXIuUmVtb3RlRGF0YXZpZXdNYW5hZ2VyLlRyYW5zYWN0aW9uIDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVHJhbnNhY3Rpb24odGhpcywgdHJhbnNJZCwgZmFsc2UpKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXRzIHRoZSBuZXcgVHJhbnNhY3Rpb24gT3duZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldFRyYW5zT3duZXJUYXNrKCk6IHZvaWQge1xyXG4gICAgdGhpcy5UcmFuc2FjdGlvbi5zZXRPd25lclRhc2sodGhpcyk7XHJcbiAgICB0aGlzLlRyYW5zYWN0aW9uLnNldFRyYW5zQmVnaW4oJ1QnKS8qJ1QnKi87XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGxvb3AgY291bnRlciBhY2NvcmRpbmcgdG8gdGhlIHRvcG1vc3QgdmFsdWUgaW4gdGhlIHN0YWNrIGFuZCB0aGUgc3RhdHVzIG9mIHRoZVxyXG4gIC8vLyAgIFwidXNlTG9vcFN0YWNrXCIgZmxhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0TG9vcENvdW50ZXIoKTogbnVtYmVyIHtcclxuICAgIGxldCByZXN1bHQ6IG51bWJlciA9IDA7XHJcbiAgICBpZiAodGhpcy5fdXNlTG9vcFN0YWNrICYmIHRoaXMuX2xvb3BTdGFjayAhPT0gbnVsbCAmJiAhKHRoaXMuX2xvb3BTdGFjay5jb3VudCgpID09PSAwKSkge1xyXG4gICAgICByZXN1bHQgPSA8bnVtYmVyPnRoaXMuX2xvb3BTdGFjay5wZWVrKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHB1c2hlcyB0aGUgdmFsdWUgMCBvbiB0aGUgdG9wIG9mIHRoZSBsb29wIHN0YWNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBlbnRlckxvb3AoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fbG9vcFN0YWNrID09PSBudWxsKVxyXG4gICAgICB0aGlzLl9sb29wU3RhY2sgPSBuZXcgU3RhY2soKTtcclxuXHJcbiAgICB0aGlzLl9sb29wU3RhY2sucHVzaCgwKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwb3BzIHRoZSB0b3Btb3N0IGVudHJ5IGZyb20gdGhlIGxvb3Agc3RhY2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGxlYXZlTG9vcCgpOiB2b2lkIHtcclxuICAgIHRoaXMucG9wTG9vcENvdW50ZXIoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwb3BzIHRoZSB2YWx1ZSBvZiB0aGUgbG9vcCBjb3VudGVyIGZyb20gdGhlIHN0YWNrIGFuZCByZXR1cm5zIGl0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwb3BMb29wQ291bnRlcigpOiBudW1iZXIge1xyXG4gICAgbGV0IHJlc3VsdDogbnVtYmVyID0gMDtcclxuXHJcbiAgICBpZiAodGhpcy5fbG9vcFN0YWNrICE9PSBudWxsICYmICEodGhpcy5fbG9vcFN0YWNrLmNvdW50KCkgPT09IDApKVxyXG4gICAgICByZXN1bHQgPSA8bnVtYmVyPnRoaXMuX2xvb3BTdGFjay5wb3AoKTtcclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGluY3JlYXNlcyB0aGUgdmFsdWUgYXQgdGhlIHRvcCBvZiB0aGUgbG9vcCBzdGFja1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaW5jcmVhc2VMb29wQ291bnRlcigpOiB2b2lkIHtcclxuICAgIHRoaXMuX2xvb3BTdGFjay5wdXNoKHRoaXMucG9wTG9vcENvdW50ZXIoKSArIDEpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBsb29wIHN0YWNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRMb29wU3RhY2tTaXplKCk6IG51bWJlciB7XHJcbiAgICBpZiAodGhpcy5fbG9vcFN0YWNrICE9PSBudWxsKVxyXG4gICAgICByZXR1cm4gdGhpcy5fbG9vcFN0YWNrLmNvdW50KCk7XHJcblxyXG4gICAgcmV0dXJuIDA7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSB2YWx1ZSBvZiB0aGUgXCJ1c2UgbG9vcCBzdGFja1wiIHZhcmlhYmxlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbFwiPnRoZSBuZXcgdmFsdWUgdG8gc2V0PC9wYXJhbT5cclxuICBzZXRVc2VMb29wU3RhY2sodmFsOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl91c2VMb29wU3RhY2sgPSB2YWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIHRoZSBsaW5rcyB0YWJsZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0RGF0YXZpZXdIZWFkZXJzKCk6IERhdGF2aWV3SGVhZGVycyB7XHJcbiAgICByZXR1cm4gdGhpcy5EYXRhdmlld0hlYWRlcnNUYWJsZTtcclxuICB9XHJcblxyXG4gIGlzRmlyc3RSZWNvcmRDeWNsZShWYWx1ZV8/OiBib29sZWFuKTogYW55IHtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmlzRmlyc3RSZWNvcmRDeWNsZV8wKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5pc0ZpcnN0UmVjb3JkQ3ljbGVfMShWYWx1ZV8pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc0ZpcnN0UmVjb3JkQ3ljbGVfMCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9maXJzdFJlY29yZEN5Y2xlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc0ZpcnN0UmVjb3JkQ3ljbGVfMShWYWx1ZV86IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuX2ZpcnN0UmVjb3JkQ3ljbGUgPSBWYWx1ZV87XHJcbiAgfVxyXG5cclxuICAvLy88c3VtbWFyeT5nZXQgdGhlIGludGVybmFsIG5hbWU8L3N1bW1hcnk+XHJcbiAgZ2V0UHVibGljTmFtZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuUHVibGljTmFtZTtcclxuICB9XHJcblxyXG4gIC8vLzxzdW1tYXJ5PmdldCB0aGUgQWxsb3dFdmVudHM8L3N1bW1hcnk+XHJcbiAgYXN5bmMgaXNBbGxvd0V2ZW50cygpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCBwcm9wOiBQcm9wZXJ0eSA9IHRoaXMuZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQVNLX1BST1BFUlRJRVNfQUxMT1dfRVZFTlRTKTtcclxuICAgIHJldHVybiBhd2FpdCBwcm9wLmdldFZhbHVlQm9vbGVhbigpO1xyXG4gIH1cclxuXHJcbiAgLy8vPHN1bW1hcnk+Z2V0IHRoZSB0YXNrIGlkPC9zdW1tYXJ5PlxyXG4gIGdldEV4dGVybmFsVGFza0lkKCk6IHN0cmluZyB7XHJcbiAgICBsZXQgdGFza0lkOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgbGV0IHByb3A6IFByb3BlcnR5ID0gdGhpcy5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfSUQpO1xyXG5cclxuICAgIGlmIChwcm9wICE9IG51bGwpXHJcbiAgICAgIHRhc2tJZCA9IHByb3AuR2V0Q29tcHV0ZWRWYWx1ZSgpO1xyXG5cclxuICAgIHJldHVybiB0YXNrSWQ7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgVFJVRSBpZiB0aGlzIHRhc2sgb3ducyBhIGR5bmFtaWNEZWYudHJhbnNhY3Rpb25cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGlzVHJhbnNhY3Rpb25Pd25lcigpOiBib29sZWFuIHtcclxuICAgIGxldCBpc1RyYW5zT3duZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBpZiAodGhpcy5UcmFuc2FjdGlvbiAhPSBudWxsICYmIHRoaXMuVHJhbnNhY3Rpb24uaXNPd25lcih0aGlzKSlcclxuICAgICAgaXNUcmFuc093bmVyID0gdHJ1ZTtcclxuXHJcbiAgICByZXR1cm4gaXNUcmFuc093bmVyO1xyXG4gIH1cclxuXHJcbiAgaXNUcmFuc2FjdGlvbk9uTGV2ZWwobGV2ZWw6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaXNUcmFuc2FjdGlvbk93bmVyKCkgJiYgdGhpcy5UcmFuc2FjdGlvbi5nZXRMZXZlbCgpID09PSBsZXZlbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgd2hldGhlciB0aGUgdGFzayBpcyB0aGUgUHJvZ3JhbSAoaS5lLiBub3QgYSBzdWJ0YXNrKVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaXNQcm9ncmFtKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lzUHJnO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGVuYWJsZS1kaXNhYmxlIGFjdGlvbnMgZm9yIHRhc2sgbW9kZXNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIGVuYWJsZU1vZGVzKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGVuYWJsZTogYm9vbGVhbiA9IGF3YWl0IHRoaXMuY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX01PRElGWSwgdHJ1ZSk7XHJcbiAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVE9fTU9ESUZZLCBlbmFibGUpO1xyXG5cclxuICAgIGVuYWJsZSA9IGF3YWl0IHRoaXMuY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX0NSRUFURSwgdHJ1ZSk7XHJcbiAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVE9fQ1JFQVRFLCBlbmFibGUpO1xyXG5cclxuICAgIGVuYWJsZSA9IGF3YWl0IHRoaXMuY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX1FVRVJZLCB0cnVlKTtcclxuICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUT19RVUVSWSwgZW5hYmxlKTtcclxuXHJcbiAgICBlbmFibGUgPSBhd2FpdCB0aGlzLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19SQU5HRSwgdHJ1ZSk7XHJcbiAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVE9fUkFOR0UsIGVuYWJsZSk7XHJcblxyXG4gICAgZW5hYmxlID0gYXdhaXQgdGhpcy5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfTE9DQVRFLCB0cnVlKTtcclxuICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUT19MT0NBVEUsIGVuYWJsZSk7XHJcbiAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVE9fU0VBUkNILCBlbmFibGUpO1xyXG5cclxuICAgIGVuYWJsZSA9IGF3YWl0IHRoaXMuY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX1NPUlQsIHRydWUpO1xyXG4gICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfU09SVF9SRUNPUkRTLCBlbmFibGUpO1xyXG5cclxuICAgIGVuYWJsZSA9IGF3YWl0IHRoaXMuY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfUFJPUEVSVElFU19BTExPV19JTkRFWCwgdHJ1ZSk7XHJcbiAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9WSUVXX0JZX0tFWSwgZW5hYmxlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgaGFzWm9vbUhhbmRsZXIgdG8gdHJ1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0RW5hYmxlWm9vbUhhbmRsZXIoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9lbmFibGVab29tSGFuZGxlciA9IHRydWU7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgaGFzWm9vbUhhbmRsZXJcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIGdldEVuYWJsZVpvb21IYW5kbGVyKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2VuYWJsZVpvb21IYW5kbGVyO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxyZXR1cm5zPiBpcyB0aGUgdGFzayBpcyBhIERlc3RpbmF0aW9uIFN1YmZvcm0gdGFzazwvcmV0dXJucz5cclxuICBpc0Rlc3RpbmF0aW9uU3ViZm9ybSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9kZXN0aW5hdGlvblN1YmZvcm07XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IGZvciBEZXN0aW5hdGlvbiBTdWJmb3JtIHRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGVzdGluYXRpb25TdWJmb3JtXCI+PC9wYXJhbT5cclxuICBzZXREZXN0aW5hdGlvblN1YmZvcm0oZGVzdGluYXRpb25TdWJmb3JtOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl9kZXN0aW5hdGlvblN1YmZvcm0gPSBkZXN0aW5hdGlvblN1YmZvcm07XHJcbiAgfVxyXG5cclxuICAvLy8gPHJldHVybnM+IGlzIHRoZSB0YXNrIGlzIGEgRGVzdGluYXRpb24gU3ViZm9ybSB0YXNrPC9yZXR1cm5zPlxyXG4gIGdldElzRGVzdGluYXRpb25DYWxsKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lzRGVzdGluYXRpb25DYWxsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCBmb3IgRGVzdGluYXRpb24gU3ViZm9ybSB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlzRGVzdGluYXRpb25DYWxsXCI+PC9wYXJhbT5cclxuICBzZXRJc0Rlc3RpbmF0aW9uQ2FsbChpc0Rlc3RpbmF0aW9uQ2FsbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5faXNEZXN0aW5hdGlvbkNhbGwgPSBpc0Rlc3RpbmF0aW9uQ2FsbDtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbFwiPlxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIHNldENhbmNlbFdhc1JhaXNlZCh2YWw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuX2NhbmNlbFdhc1JhaXNlZCA9IHZhbDtcclxuICB9XHJcblxyXG4gIC8vLyA8cmV0dXJucz5cclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIGNhbmNlbFdhc1JhaXNlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9jYW5jZWxXYXNSYWlzZWQ7XHJcbiAgfVxyXG5cclxuICBlbmFibGVDcmVhdGVBY3RzKHZhbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1JFTElORSwgdmFsKTtcclxuXHJcbiAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DUkVMSU5FX0FCT1ZFLCAgKHRoaXMuZ2V0Rm9ybSgpLkhhc1RhYmxlKCkgKSA/IHZhbCA6IGZhbHNlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXRzIGVuYWJsZS9kaXNhYmxlIHN0YXR1cyBvZiBjcmVhdGUgYW5kIGRlbGV0ZSBhY3Rpb25zXHJcbiAgLy8vIDwvc3VtbWFyeVxyXG4gIGFzeW5jIHNldENyZWF0ZURlbGV0ZUFjdHNFbmFibGVTdGF0ZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICghKHRoaXMuRGF0YVZpZXcpLmlzRW1wdHlEYXRhdmlldygpICYmIGF3YWl0IHRoaXMuY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX0RFTEVURSwgdHJ1ZSkgJiZcclxuICAgICAgdGhpcy5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfTU9ESUZZICYmICg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuSGFzTWFpblRhYmxlKVxyXG4gICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9ERUxMSU5FLCB0cnVlKTtcclxuICAgIGVsc2VcclxuICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfREVMTElORSwgZmFsc2UpO1xyXG5cclxuICAgIGlmICgoYXdhaXQgdGhpcy5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfQ1JFQVRFLCB0cnVlKSkgJiZcclxuICAgICAgKCg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuSGFzTWFpblRhYmxlICYmXHJcbiAgICAgICAgKHRoaXMuZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX01PRElGWSAmJiBFbnZpcm9ubWVudC5JbnN0YW5jZS5hbGxvd0NyZWF0ZUluTW9kaWZ5TW9kZSh0aGlzLmdldENvbXBJZHgoKSkpIHx8XHJcbiAgICAgICAgKHRoaXMuZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSkpKVxyXG4gICAgICB0aGlzLmVuYWJsZUNyZWF0ZUFjdHModHJ1ZSk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuZW5hYmxlQ3JlYXRlQWN0cyhmYWxzZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImVtcHR5RGF0YXZpZXdcIj50aGUgZW1wdHlEYXRhdmlldyB0byBzZXQgPC9wYXJhbT5cclxuICBzZXRFbXB0eURhdGF2aWV3KGVtcHR5RGF0YXZpZXc6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuRGF0YVZpZXcuc2V0RW1wdHlEYXRhdmlldyhlbXB0eURhdGF2aWV3KTtcclxuICB9XHJcblxyXG4gIC8vLyA8cmV0dXJucz4gPC9yZXR1cm5zPlxyXG4gIGdldE5hbWUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLk5hbWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgVGhpcyBmdW5jdGlvbiBpcyBleGVjdXRlZCB3aGVuIHRhc2sgc3RhcnRzIGl0cyBleGVjdXRpb24gaW4gRW1wdHkgRGF0YXZpZXcgbW9kZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgZW1wdHlEYXRhdmlld09wZW4oc3ViZm9ybVJlZnJlc2g6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIC8vIHRvIHByZXZlbnQgZG91YmxlIHByZWZpeCBvbiB0aGUgc2FtZSByZWNvcmRcclxuICAgIGlmICh0aGlzLmdldExldmVsKCkgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spIHtcclxuICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRU1QVFlfREFUQVZJRVcsIHRydWUpO1xyXG4gICAgICAvLyBpZiB0aGUgdGFzayBpcyBhIHN1YmZvcm0gYW5kIHN1YmZvcm0gcmVmcmVzaCBpcyBkb25lLCBzbyBleGVjdXRlIHRoZSBlbXB0eSBkYXRhdHZpZXcgaGFuZGxlcixcclxuICAgICAgLy8gaWYgdGhlIHRhc2sgaXMgbm90IGEgc3ViZm9ybSwgcHV0IHRoZSBlbXB0eSBkYXRhdmlldyBldmVudCBvbiB0aGUgcXVldWVcclxuICAgICAgaWYgKHRoaXMuSXNTdWJGb3JtKSB7XHJcbiAgICAgICAgbGV0IHJ0RXZudCA9IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmdldExhc3RSdEV2ZW50KCk7XHJcbiAgICAgICAgaWYgKChydEV2bnQgIT0gbnVsbCAmJiBydEV2bnQuZ2V0SW50ZXJuYWxDb2RlKCkgPT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1JFRlJFU0hfVklFVykgfHwgc3ViZm9ybVJlZnJlc2gpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KHRoaXMpO1xyXG4gICAgICAgICAgcnRFdnQuc2V0SW50ZXJuYWwoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VNUFRZX0RBVEFWSUVXKTtcclxuICAgICAgICAgIHJ0RXZ0LlNldEV2ZW50U3ViVHlwZShFdmVudFN1YlR5cGUuTm9ybWFsKTtcclxuICAgICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUV2ZW50KHJ0RXZ0LCBmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5hZGRJbnRlcm5hbEV2ZW50V2l0aEl0YXNrQW5kQ29kZSh0aGlzLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRU1QVFlfREFUQVZJRVcpO1xyXG5cclxuICAgICAgdGhpcy5zZXRMZXZlbChDb25zdGFudHMuVEFTS19MRVZFTF9SRUNPUkQpO1xyXG5cclxuICAgICAgLy8gZm9yIHN1YmZvcm0gbW9kZSAnQXNQYXJlbnQnLiBJZiB0aGUgcGFyZW50IHRhc2sgdGhhdCBpbiAnRW1wdHkgRGF0YXZpZXcnIHN0YXRlIGNoYW5nZXMgaXRzIG1vZGVcclxuICAgICAgLy8gdGhlIHN1YmZvcm0gYWxzbyBtdXN0IGNoYW5nZSBtb2RlLlxyXG4gICAgICAvLyBRQ1IgIzI4MTg2Mi4gSWYgdGhlIHN1YmZvcm0gdGFzayBpcyBvcGVuZWQgaW4gdGhlIGZpcnN0IHRpbWUgZG8gbm90IHJlZnJlc2ggaXQncyBzdWJmb3JtcyxcclxuICAgICAgLy8gYmVjYXVzZSB0aGV5J3ZlIHJlY2VpdmVkIHRoZWlyIGRhdGF2aWV3cyBhbHJlYWR5LlxyXG4gICAgICAvLyBXZSBtdXN0IHJlZnJlc2ggdGhlbSB3aGVuIHRoZSBzdWJmb3JtIHRhc2sgcGFzc2VzIHRvIGVtcHR5IERWLlxyXG4gICAgICBpZiAodGhpcy5TdWJmb3JtRXhlY01vZGUgIT09IFRhc2tfU3ViZm9ybUV4ZWNNb2RlRW51bS5GSVJTVF9USU1FICYmIHN1YmZvcm1SZWZyZXNoICYmIGF3YWl0IHRoaXMuQ2hlY2tSZWZyZXNoU3ViVGFza3MoKSkge1xyXG4gICAgICAgIGF3YWl0ICg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuY29tcHV0ZVN1YkZvcm1zKCk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5kb1N1YmZvcm1SZWNQcmVmaXhTdWZmaXgoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgYXdhaXQgdGhpcy5lbmFibGVSZWNvcmRBY3Rpb25zKCk7XHJcbiAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1JFRlJFU0hfUkVDT1JELCBmYWxzZSk7XHJcbiAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1JFRlJFU0hfU0NSRUVOLCBmYWxzZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgVGhpcyBmdW5jdGlvbiBpcyBleGVjdXRlZCB3aGVuIHRhc2sgZW5kcyBpdHMgZXhlY3V0aW9uIGluIEVtcHR5IERhdGF2aWV3IG1vZGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGVtcHR5RGF0YXZpZXdDbG9zZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VNUFRZX0RBVEFWSUVXLCBmYWxzZSk7XHJcbiAgICB0aGlzLnNldExldmVsKENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spO1xyXG5cclxuICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1JFRlJFU0hfUkVDT1JELCB0cnVlKTtcclxuICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1JFRlJFU0hfU0NSRUVOLCB0cnVlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInN1YmZvcm1UYXNrXCI+PC9wYXJhbT5cclxuICBhc3luYyBTdWJmb3JtUmVmcmVzaChzdWJmb3JtVGFzazogVGFza0Jhc2UsIGV4cGxpY2l0U3ViZm9ybVJlZnJlc2g6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBjdXJyVGFzazogVGFzayA9IExhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKTtcclxuICAgIGxldCBpc0luc2lkZTogYm9vbGVhbiA9IGF3YWl0ICg8VGFzaz5zdWJmb3JtVGFzaykuRXhlY3V0ZU5lc3RlZFJTKGN1cnJUYXNrKTtcclxuXHJcbiAgICBpZiAoQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSlcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIC8vIFFDUiAjNDM0NDY3LiBFeGVjdXRlIFJTIG9mIHRoZSBjdXJyZW50IHN1YmZvcm0gaWYgaXQncyB0aGUgY3VycmVudCAobGFzdCBmb2N1c2VkKSB0YXNrLlxyXG4gICAgaWYgKHN1YmZvcm1UYXNrLmdldExldmVsKCkgIT09IENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0sgJiYgIUFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpIHtcclxuICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIucHVzaE5ld0V4ZWNTdGFja3MoKTtcclxuICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrQW5kU3ViZm9ybVJlZnJlc2goc3ViZm9ybVRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYLCB0cnVlKTtcclxuICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIucG9wTmV3RXhlY1N0YWNrcygpO1xyXG4gICAgICBpc0luc2lkZSA9IHRydWU7XHJcblxyXG4gICAgICAvLyBEZWZlY3QgNzc0ODMuIERvIG5vdCBjb250aW51ZSBpZiB0aGUgcmVjb3JkIHN1ZmZpeCBleGVjdXRpb24gaXMgZmFpbGVkLlxyXG4gICAgICBpZiAoQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSlcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gY3JlYXRlIGNvbW1hbmQgZm9yIHRoZSBzZXJ2ZXJcclxuICAgIGxldCBjbWQ6IElDbGllbnRDb21tYW5kID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlU3ViZm9ybVJlZnJlc2hDb21tYW5kKHRoaXMuZ2V0VGFza1RhZygpLCBzdWJmb3JtVGFzay5nZXRUYXNrVGFnKCksIGV4cGxpY2l0U3ViZm9ybVJlZnJlc2gpO1xyXG4gICAgYXdhaXQgc3ViZm9ybVRhc2suRGF0YXZpZXdNYW5hZ2VyLkV4ZWN1dGUoY21kKTtcclxuICAgIGlmIChzdWJmb3JtVGFzay5pc0Fib3J0aW5nKCkpXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBpZiAoZXhwbGljaXRTdWJmb3JtUmVmcmVzaCkge1xyXG4gICAgICAvLyBRQ1IgIzQyOTExMi4gUHVzaCBleGVjdXRpb24gc3RhY2sgYmVmb3JlIFJQIGV4ZWN1dGlvbi5cclxuICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIucHVzaE5ld0V4ZWNTdGFja3MoKTtcclxuXHJcbiAgICAgIC8vIERlZmVjdCAjNzcwNDkuIERvIG5vdCBleGVjdXRlIHBhcmVudCBSUC4gV2UgbmVlZCBpdCBvbmx5IHdoZW4gY2xpY2sgb24gc3ViZm9ybXdhcyBkb25lLlxyXG4gICAgICBsZXQgcGVyZm9ybVBhcmVudFJlY29yZFByZWZpeE9yZzogYm9vbGVhbiA9ICg8VGFzaz5zdWJmb3JtVGFzaykuUGVyZm9ybVBhcmVudFJlY29yZFByZWZpeDtcclxuICAgICAgKDxUYXNrPnN1YmZvcm1UYXNrKS5QZXJmb3JtUGFyZW50UmVjb3JkUHJlZml4ID0gZmFsc2U7XHJcbiAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFza0FuZFN1YmZvcm1SZWZyZXNoKHN1YmZvcm1UYXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCwgdHJ1ZSk7XHJcbiAgICAgICg8VGFzaz5zdWJmb3JtVGFzaykuUGVyZm9ybVBhcmVudFJlY29yZFByZWZpeCA9IHBlcmZvcm1QYXJlbnRSZWNvcmRQcmVmaXhPcmc7XHJcbiAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnBvcE5ld0V4ZWNTdGFja3MoKTtcclxuICAgICAgaWYgKEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGlmIFN1YmZvcm1SZWZyZXNoIGV2ZW50IHRvIGl0c2VsZiBzbyB0aGUgY3Vyc29yIG11c3QgYmUgb24gdGhlIGZpcnN0IGNvbnRyb2wgb2YgdGhlIGN1cnJlbnQgcmVjb3JkXHJcbiAgICAvLyBhcyBmb3IgVmlld1JlZnJlc2ggZXZlbnQuXHJcbiAgICBpZiAoaXNJbnNpZGUpIHtcclxuICAgICAgLy8gRGVmZWN0IDExNTc5My4gY3VyclRhc2sgY2FuJ3QgYmUgbnVsbC5cclxuICAgICAgLy8gaWYgKCFBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpICYmICFzdWJmb3JtVGFzay5nZXRQcmV2ZW50Q29udHJvbENoYW5nZSgpICYmIGN1cnJUYXNrICE9IG51bGwpXHJcbiAgICAgIC8vICAgY3VyclRhc2subW92ZVRvRmlyc3RDdHJsKGZhbHNlKTtcclxuICAgICAgLy8gVE9ETzogVGFiYmluZyAmIEZvY3VzaW5nOiBIYW5kbGUgdGhpcyBzaXR1YXRpb25cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAoIUFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpIHtcclxuICAgICAgICBpZiAoZXhwbGljaXRTdWJmb3JtUmVmcmVzaCkge1xyXG4gICAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHN1YmZvcm1UYXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcbiAgICAgICAgICBpZiAoY3VyclRhc2sgIT0gbnVsbClcclxuICAgICAgICAgICAgKDxEYXRhVmlldz5jdXJyVGFzay5EYXRhVmlldykuc2V0UHJldkN1cnJSZWMoKTtcclxuICAgICAgICAgIHN1YmZvcm1UYXNrLkRvU3ViZm9ybVByZWZpeFN1ZmZpeCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBFeGVjdXRlcyBSZWNvcmQgU3VmZml4ZXMgb2YgYWxsIG5lc3RlZCBzdWJmb3JtcyBmcm9tIGJvdHRvbSB0byB0b3AuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzdWJmb3JtVGFza1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY3VyclRhc2tcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgYXN5bmMgRXhlY3V0ZU5lc3RlZFJTKGxhc3RUYXNrOiBUYXNrKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgaXNFeGVjdXRlTmVzdGVkUlM6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvLyBRQ1IgIzE2ODM0Mi4gQSBuZXcgdGFzayBpcyBzZXQgYXMgZm9jdXNlZCB0YXNrIGFmdGVyIHRoZSBmaXJzdCBDUC5cclxuICAgIC8vIFNvIGlmIGluIENQIFVwZGF0ZSBvcGVyYXRpb24gaXMgZXhlY3V0ZWQgY3VyclRhc2sgaXMgbnVsbC4gQnV0IHdlIG11c3QgcmVmcmVzaCB0aGUgc3ViZm9ybS5cclxuICAgIGlmIChsYXN0VGFzayA9PSBudWxsKVxyXG4gICAgICByZXR1cm4gaXNFeGVjdXRlTmVzdGVkUlM7XHJcblxyXG4gICAgLy8gRG8gbm90IGV4ZWN1dGUgc3ViZm9ybSByZWZyZXNoIHdoZW4gdGhlIGZvY3VzZWQgdGFzayBpcyBub3Qgb3BlbmVkIGFzIGEgc3ViZm9ybSAoaXQgd2FzIG9wZW5lZCBmcm9tIGNhbGwgb3BlcmF0aW9uKSxcclxuICAgIC8vIGJ1dCB0aGUgZm9jdXNlZCB0YXNrIGlzIGEgY2hpbGQgb2YgdGhlIHN1YmZvcm0gdGFzay4gU2VlIGZvciBleGFtcGxlIFFDUiAjNDMxODUwLlxyXG4gICAgaWYgKHRoaXMuZ2V0TGV2ZWwoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSyAmJiBsYXN0VGFzay5nZXRNZ2RJRCgpICE9PSB0aGlzLmdldE1nZElEKCkpXHJcbiAgICAgIHJldHVybiBpc0V4ZWN1dGVOZXN0ZWRSUztcclxuXHJcbiAgICBmb3IgKGxldCB0YXNrOiBUYXNrID0gbGFzdFRhc2s7IHRhc2sgIT09IHRoaXMgJiYgdGFzay5wYXRoQ29udGFpbnModGhpcykgJiYgdGFzay5nZXRMZXZlbCgpICE9PSBDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLOyB0YXNrID0gPFRhc2s+dGFzay5nZXRQYXJlbnQoKSkge1xyXG4gICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5wdXNoTmV3RXhlY1N0YWNrcygpO1xyXG4gICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG4gICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5wb3BOZXdFeGVjU3RhY2tzKCk7XHJcbiAgICAgIGlzRXhlY3V0ZU5lc3RlZFJTID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaXNFeGVjdXRlTmVzdGVkUlM7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGV4ZWN1dGUgUmVjIHN1ZmZpeCBmb3IgYWxsIG5lc3RlZCBzdWJmb3JtcyB1bnRpbGwgc3ViZm9ybSB0YXNrIHRoYXQgY29udGFpbnMgdGhlc2UgMiBzdWJmb3Jtc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJuZXdUYXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGFzeW5jIGV4ZWNTdWJmb3JtUmVjU3VmZml4KG5ld1Rhc2s6IFRhc2spOiBQcm9taXNlPG51bWJlcj4ge1xyXG4gICAgbGV0IHN1YmZUYXNrOiBUYXNrO1xyXG4gICAgbGV0IGk6IG51bWJlciwgaWR4ID0gMDtcclxuICAgIGZvciAoaSA9IHRoaXMuX3Rhc2tQYXRoLmxlbmd0aDsgaSA+IDA7IGktLSkge1xyXG4gICAgICBzdWJmVGFzayA9IHRoaXMuX3Rhc2tQYXRoLmdldF9JdGVtKGkgLSAxKTtcclxuICAgICAgaWYgKCFuZXdUYXNrLl90YXNrUGF0aC5Db250YWlucyhzdWJmVGFzaykpIHtcclxuICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2soc3ViZlRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKTtcclxuICAgICAgICBpZiAoQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSlcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAvLyBDaGFuZ2UgdGhlIENyZWF0ZSBtb2RlIHRvIE1vZGlmeSBpZiB0aGUgY3VycmVudCByZWNvcmQgaXMgbm90IGEgbmV3IHJlY29yZC5cclxuICAgICAgICAvLyBTbyB0aGUgbW9kZSBpcyBjaGFuZ2VkIG9ubHkgZm9yIHRoZSBmaXJzdCByZWNvcmQgdGhhdCB3YXMgbm90IGNoYW5nZWQuXHJcbiAgICAgICAgaWYgKHN1YmZUYXNrLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUgJiYgISgoPERhdGFWaWV3PnN1YmZUYXNrLkRhdGFWaWV3KS5nZXRDdXJyUmVjKCkpLmlzTmV3UmVjKCkpXHJcbiAgICAgICAgICBzdWJmVGFzay5zZXRNb2RlKENvbnN0YW50cy5UQVNLX01PREVfTU9ESUZZKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBpZHggPSBuZXdUYXNrLl90YXNrUGF0aC5pbmRleE9mKHN1YmZUYXNrKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgRGVidWcuQXNzZXJ0KGkgPiAwKTtcclxuICAgIHJldHVybiBpZHg7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSBjb3VudGVyIG9mIHRoZSB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+Y291bnRlcjwvcmV0dXJucz5cclxuICBnZXRDb3VudGVyKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fY291bnRlcjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBpbmNyZWFzZSB0aGUgdGFza3MgY291bnRlciBieSAxLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPmNvdW50ZXI8L3JldHVybnM+XHJcbiAgaW5jcmVhc2VDb3VudGVyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fY291bnRlciA9IHRoaXMuX2NvdW50ZXIgKyAxO1xyXG4gIH1cclxuXHJcbiAgc2V0Q291bnRlcihjbnQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5fY291bnRlciA9IGNudDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICAhIVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBpc0N1cnJlbnRTdGFydFByb2dMZXZlbCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9jdXJyU3RhcnRQcm9nTGV2ZWwgPT09IFRhc2suU3RhcnRQcm9nTGV2ZWw7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIENoZWNrIGlmIHJlZmVyZW5jZSB0byBtYWluIHByb2dyYW0gZmllbGRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZmllbGRTdHJcIj5hIHJlZmVyZW5jZSB0byB0aGUgZmllbGQ8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgc3RhdGljIGlzTWFpblByb2dyYW1GaWVsZChmaWVsZFN0cjogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgRmllbGQ6IExpc3Q8c3RyaW5nPiA9IFhtbFBhcnNlci5nZXRUb2tlbnMoZmllbGRTdHIsICcsJyk7XHJcbiAgICBsZXQgbWFpblByb2dGaWVsZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIGlmIChGaWVsZC5sZW5ndGggPT09IDIpIHtcclxuICAgICAgbGV0IHBhcmVudDogbnVtYmVyID0gTk51bWJlci5QYXJzZShGaWVsZC5nZXRfSXRlbSgwKSk7XHJcbiAgICAgIGlmIChwYXJlbnQgPT09IFRhc2tCYXNlLk1BSU5fUFJHX1BBUkVOVF9JRClcclxuICAgICAgICBtYWluUHJvZ0ZpZWxkID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbWFpblByb2dGaWVsZDtcclxuICB9XHJcblxyXG4gIGdldFRhc2tJbmZvKCk6IHN0cmluZyB7XHJcbiAgICAvLyBHZXQgdGhlIHRhc2sgbmFtZSB1c2luZyB0aGUgZ2V0UHJvcCgpIGFzIG5hbWUgaXMgb25seSBzZXJpYWxpemVkIGZvciBkZWJ1Z1xyXG4gICAgbGV0IHRhc2tOYW1lOiBzdHJpbmcgPSAodGhpcy5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX05BTUUpKS5HZXRDb21wdXRlZFZhbHVlKCk7XHJcbiAgICByZXR1cm4gTlN0cmluZy5Gb3JtYXQoJ3swfSB7MX0nLHRoaXMuaXNQcm9ncmFtKCkgPyAnUHJvZ3JhbSc6ICdTdWJ0YXNrJywgdGFza05hbWUpO1xyXG4gIH1cclxuXHJcbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBOU3RyaW5nLkZvcm1hdChcIih0YXNrIHswfS1cXFwiezF9XFxcInsyfSlcIiwgdGhpcy5fdGFza1RhZywgdGhpcy5OYW1lLCBzdXBlci5pc01haW5Qcm9nKCkgPyAoXCIgY3RsIFwiICsgdGhpcy5fY3RsSWR4KSA6IFwiXCIpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgQ29uc3RydWN0TWdGb3JtKGFscmVhZHlTZXRQYXJlbnRGb3JtOiBSZWZQYXJhbTxib29sZWFuPik6IE1nRm9ybUJhc2Uge1xyXG4gICAgbGV0IGZvcm06IE1nRm9ybSA9IG5ldyBNZ0Zvcm0oKTtcclxuICAgIGxldCBwYXJlbnRGb3JtOiBNZ0Zvcm1CYXNlID0gKHRoaXMuUGFyZW50VGFzayAhPSBudWxsID8gdGhpcy5QYXJlbnRUYXNrLmdldEZvcm0oKSA6IG51bGwpO1xyXG5cclxuICAgIC8vIFBhcmVudEZvcm0gb2YgYW55IGZvcm0gc2hvdWxkIGJlIGEgdmlzaWJsZSBvbmUuIEl0IG1pZ2h0IGhhcHBlbiB0aGF0IHRoZSBQYXJlbnRUYXNrXHJcbiAgICAvLyBpcyBhIG5vbi1pbnRlcmFjdGl2ZSB0YXNrIHdpdGggT3BlbldpbmRvdz1Oby4gSW4gdGhpcyBjYXNlLCB0aGUgUGFyZW50IG9mIHRoZSBub24taW50ZXJhY3RpdmVcclxuICAgIC8vIHRhc2ssIHNob3VsZCBiZSB0aGUgcGFyZW50IG9mIHRoZSBjdXJyZW50IGZvcm0uXHJcbiAgICB3aGlsZSAocGFyZW50Rm9ybSAhPSBudWxsICYmICFwYXJlbnRGb3JtLmdldFRhc2soKS5pc09wZW5XaW4oKSkge1xyXG4gICAgICBwYXJlbnRGb3JtID0gcGFyZW50Rm9ybS5QYXJlbnRGb3JtO1xyXG4gICAgfVxyXG5cclxuICAgIGZvcm0uUGFyZW50Rm9ybSA9IHBhcmVudEZvcm07XHJcbiAgICBhbHJlYWR5U2V0UGFyZW50Rm9ybS52YWx1ZSA9IHRydWU7XHJcbiAgICByZXR1cm4gZm9ybTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBtZ2RhdGEgSUQgdG8gd2hpY2ggdGFzayBiZWxvbmdzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRNZ2RJRCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX21nRGF0YS5HZXRJZCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCByZWZlcmVuY2UgdG8gY3VycmVudCBNR0RhdGFcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldE1HRGF0YSgpOiBNR0RhdGEge1xyXG4gICAgcmV0dXJuIHRoaXMuX21nRGF0YTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gcmVmcmVzaCB0aGUgZGlzcGxheSwgcGFpbnQgdGhlIGNvbnRyb2xzIGFuZCB0aGVpciBwcm9wZXJ0aWVzIGFnYWluIDwvc3VtbWFyeT5cclxuICBhc3luYyBSZWZyZXNoRGlzcGxheSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0aGlzLkZvcm0gIT09IG51bGwgJiYgIXRoaXMuaXNBYm9ydGluZygpICYmIHRoaXMuaXNTdGFydGVkKCkpIHtcclxuICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coXCJTdGFydCB0YXNrLlJlZnJlc2hEaXNwbGF5KClcIik7XHJcblxyXG4gICAgICAvLyByZWNvcmRzIGZyb20gdGhlIERhdGFWaWV3IGFuZCByZWZyZXNoZXMgdGhlIHJvd3MuXHJcbiAgICAgIC8vIE5vdywgVGFzay5SZWZyZXNoRGlzcGxheSgpIGlzIGNhbGxlZCBmcm9tIDIgcGxhY2VzOlxyXG4gICAgICAvLyAxLiB3aGlsZSBpbml0aW5nIHRoZSBmb3JtXHJcbiAgICAgIC8vIDIuIHdoZW4gY29taW5nIGJhY2sgZnJvbSBzZXJ2ZXJcclxuICAgICAgLy8gSW4gY2FzZSAjMSwgd2UgZG8gbm90IG5lZWQgdG8gcmVmcmVzaCB0aGUgdGFibGUgYXMgaXQgaXMgZG9uZSBmcm9tIGZpcnN0VGFibGVSZWZyZXNoKCkuXHJcbiAgICAgIC8vIENoZWNrIGlmIHRoaXMgY2FuIGJlIGVsaW1pbmF0ZWQuXHJcbiAgICAgIGlmICh0aGlzLl9yZWZyZXNoVHlwZSAhPT0gQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9OT05FKSB7XHJcbiAgICAgICAgbGV0IGZvcm06IE1nRm9ybSA9IDxNZ0Zvcm0+dGhpcy5Gb3JtO1xyXG4gICAgICAgIGxldCB3YXNSZWZyZXNoZWQ6IGJvb2xlYW4gPSBhd2FpdCBmb3JtLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfRk9STSk7XHJcbiAgICAgICAgaWYgKHdhc1JlZnJlc2hlZCkge1xyXG4gICAgICAgICAgdGhpcy5fcmVmcmVzaFR5cGUgPSBDb25zdGFudHMuVEFTS19SRUZSRVNIX05PTkU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKFwiRW5kIHRhc2suUmVmcmVzaERpc3BsYXkoKVwiKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gZ2V0IHRoZSB2YWx1ZSBvZiBhIGZpZWxkLiA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZmllbGREZWZcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInZhbHVlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpc051bGxcIj48L3BhcmFtPlxyXG4gIC8vIFRPRE8gc2FkaGFuIHJlbW92ZSB1bnVzZWRcclxuICAvLyBhc3luYyBnZXRGaWVsZFZhbHVlKGZpZWxkRGVmOiBGaWVsZERlZiwgdmFsdWU6IFJlZlBhcmFtPHN0cmluZz4sIGlzTnVsbDogUmVmUGFyYW08Ym9vbGVhbj4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAvLyAgIHZhbHVlLnZhbHVlID0gYXdhaXQgKDxGaWVsZD5maWVsZERlZikuZ2V0VmFsdWUoZmFsc2UpO1xyXG4gIC8vICAgaXNOdWxsLnZhbHVlID0gYXdhaXQgKDxGaWVsZD5maWVsZERlZikuaXNOdWxsKCk7XHJcbiAgLy8gfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IGdldCB0aGUgZGlzcGxheSB2YWx1ZSBvZiBhIGZpZWxkLiA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZmllbGREZWZcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInZhbHVlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpc051bGxcIj48L3BhcmFtPlxyXG4gIGdldEZpZWxkRGlzcGxheVZhbHVlKGZpZWxkRGVmOiBGaWVsZERlZiwgdmFsdWU6IFJlZlBhcmFtPHN0cmluZz4sIGlzTnVsbDogUmVmUGFyYW08Ym9vbGVhbj4pOiB2b2lkIHtcclxuICAgIHZhbHVlLnZhbHVlID0gKDxGaWVsZD5maWVsZERlZikuZ2V0RGlzcFZhbHVlKCk7XHJcbiAgICBpc051bGwudmFsdWUgPSAoPEZpZWxkPmZpZWxkRGVmKS5pc051bGwoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gdXBkYXRlcyB0aGUgZmllbGQncyB2YWx1ZSBhbmQgc3RhcnRzIHJlY29tcHV0ZS4gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImZpZWxkRGVmXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ2YWx1ZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaXNOdWxsXCI+PC9wYXJhbT5cclxuICBhc3luYyBVcGRhdGVGaWVsZFZhbHVlQW5kU3RhcnRSZWNvbXB1dGUoZmllbGREZWY6IEZpZWxkRGVmLCB2YWx1ZTogc3RyaW5nLCBpc051bGw6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0aGlzLlRhc2tQcmVmaXhFeGVjdXRlZCkge1xyXG4gICAgICBhd2FpdCAoPEZpZWxkPmZpZWxkRGVmKS5zZXRWYWx1ZUFuZFN0YXJ0UmVjb21wdXRlKHZhbHVlLCBpc051bGwsIHRydWUsIGZhbHNlLCBmYWxzZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEZvciBhIHJpY2hjbGllbnQgdGFza3MsIGNoZWNrIGlmIE5vbi1JbnRlcmFjdGl2ZSB0YXNrIGNoaWxkIHNob3VsZCBiZSBNb2RhbC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz50cnVlPC9yZXR1cm5zPlxyXG4gIFNob3VsZE5vbkludGVyYWN0aXZlQ2hpbGRCZU1vZGFsKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuU2hvdWxkQ2hpbGRCZU1vZGFsKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIENoZWNrIGlmIGEgdGFza3MgY2hpbGQgc2hvdWxkIGJlIG1vZGFsXHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgU2hvdWxkQ2hpbGRCZU1vZGFsKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGNoaWxkU2hvdWxkQmVoYXZlQXNNb2RhbDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8vIHdpbmRvdyBpcyBvcGVuZWQgYW5kIG9mIG1vZGFsIHR5cGUgKGRvZXNuJ3QgbWF0dGVyIGlmIGludGVyYWN0aXZlIG9yIG5vdClcclxuICAgIGlmICgodGhpcy5Gb3JtLkNvbmNyZXRlV2luZG93VHlwZSA9PT0gV2luZG93VHlwZS5PdmVybGF5KSAmJiB0aGlzLmdldEZvcm0oKS5PcGVuZWQpXHJcbiAgICAgIGNoaWxkU2hvdWxkQmVoYXZlQXNNb2RhbCA9IHRydWU7XHJcbiAgICBlbHNlIGlmICghdGhpcy5Jc0ludGVyYWN0aXZlKSB7XHJcbiAgICAgICAgY2hpbGRTaG91bGRCZWhhdmVBc01vZGFsID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBjaGlsZFNob3VsZEJlaGF2ZUFzTW9kYWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSBwYXJlbnQgdGFzayBvZiB0aGlzIHRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldFBhcmVudCgpOiBUYXNrQmFzZSB7XHJcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50VGFzaztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhpcyB0YXNrIGlzIHRoZSBjaGVja2VkIHRhc2sgb3IgYSBkZXNjZW5kYW50IG9mIGl0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpc0Rlc2NlbmRlbnRPZihjaGtUYXNrOiBUYXNrQmFzZSk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKGNoa1Rhc2sgPT09IHRoaXMpXHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgZWxzZSBpZiAoY2hrVGFzayA9PT0gbnVsbCB8fCB0aGlzLl9wYXJlbnRUYXNrID09PSBudWxsKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuX3BhcmVudFRhc2suaXNEZXNjZW5kZW50T2YoY2hrVGFzayk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyBzdWJmb3JtQ3RybCB3aGljaCBpcyBNb2RhbCBpbiBjdXJyZW50IHJ1bnRpbWUgdHJlZSBpZiB0aGVyZSBpcyBhbnk/LlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHVibGljIEdldFN1YmZvcm1Nb2RhbFBhcmVudFRhc2soKTogTWdDb250cm9sIHtcclxuICAgIGxldCBjdXJyVGFzazogVGFzayA9IHRoaXM7XHJcbiAgICB3aGlsZSAoY3VyclRhc2suX3BhcmVudFRhc2sgIT0gbnVsbCAmJiBjdXJyVGFzay5fcGFyZW50VGFzay5nZXRJc0Rlc3RpbmF0aW9uQ2FsbCgpKSB7XHJcbiAgICAgIGxldCBzdWJmb3JtQ3RybDogTWdDb250cm9sID0gPE1nQ29udHJvbD4oY3VyclRhc2suX3BhcmVudFRhc2suZ2V0Rm9ybSgpLmdldFN1YkZvcm1DdHJsKCkpO1xyXG4gICAgICBpZiAoc3ViZm9ybUN0cmwuSXNNb2RhbCgpKVxyXG4gICAgICB7XHJcbiAgICAgICAgcmV0dXJuIHN1YmZvcm1DdHJsO1xyXG4gICAgICB9XHJcbiAgICAgIGN1cnJUYXNrID0gY3VyclRhc2suX3BhcmVudFRhc2s7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHJldHVybiB0cnVlIGZvciByZW1vdGUgdGFzayBmb3IgZXhwcmVzc2lvbiB0aGF0IHdhcyBjb21wdXRlZCBvbmNlIG9uIHNlcnZlclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBTaG91bGRFdmFsdWF0ZVByb3BlcnR5TG9jYWxseShwcm9wSWQ6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuVGFza1NlcnZpY2UuU2hvdWxkRXZhbHVhdGVQcm9wZXJ0eUxvY2FsbHkocHJvcElkKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gVGhpcyBtZXRob2QgcnVucyBhY3Rpb25zIGFmdGVyIHRoZSAnZm9ybScgdGFnIGlzIGhhbmRsZWQuXHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBFbnN1cmVWYWxpZEZvcm0oKTogdm9pZCB7XHJcbiAgICAvLyBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBtZXRob2Q6XHJcbiAgICAvLyBJZiB0aGlzIHRhc2sgaXMgdGhlIG1haW4gcHJvZ3JhbSBhbmQgX29wZW5XaW4gZXZhbHVhdGVzIHRvICdmYWxzZScsIHRoZW5cclxuICAgIC8vIHByZXZlbnQgdGhlIGRpc3BsYXkgb2YgdGhlIGZvcm0sIGJ5IHNldHRpbmcgaXQgdG8gJ251bGwnLlxyXG4gICAgaWYgKHRoaXMuX2lzTWFpblByZyAmJiB0aGlzLkZvcm0gIT09IG51bGwpIHtcclxuICAgICAgaWYgKCF0aGlzLl9vcGVuV2luIHx8ICF0aGlzLkZvcm0uaXNMZWdhbEZvcm0pIHsgICAvLyBUaGlzIGNhbiBiZSBtZGkgZnJhbWVcclxuICAgICAgICB0aGlzLkZvcm0gPSBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGNvbXB1dGUgdGhlIG1haW4gZGlzcGxheSBvbmNlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIENvbXB1dGVNYWluRGlzcGxheSgpOiB2b2lkIHtcclxuICAgIGxldCBwcm9wTWFpbkRpc3BsYXk6IFByb3BlcnR5ID0gdGhpcy5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX01BSU5fRElTUExBWSk7XHJcbiAgICBsZXQgbWFpbkRpc3BsYXlJbmRleDogbnVtYmVyID0gcHJvcE1haW5EaXNwbGF5LkdldENvbXB1dGVkVmFsdWVJbnRlZ2VyKCk7XHJcblxyXG4gICAgbWFpbkRpc3BsYXlJbmRleCA9IHRoaXMuR2V0UmVhbE1haW5EaXNwbGF5SW5kZXhPbkN1cnJlbnRUYXNrKG1haW5EaXNwbGF5SW5kZXgpO1xyXG5cclxuICAgIHRoaXMuX2Zvcm1zLkluaXRGb3JtRnJvbVhtbFN0cmluZyhtYWluRGlzcGxheUluZGV4KTtcclxuICAgIHRoaXMuRW5zdXJlVmFsaWRGb3JtKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHByZXBhcmUgdGFzayBmb3JtXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyBQcmVwYXJlVGFza0Zvcm0oKTogUHJvbWlzZTxSZXR1cm5SZXN1bHQ+IHtcclxuICAgIGF3YWl0IFRhc2tTZXJ2aWNlQmFzZS5QcmVwYXJlUHJvcE9wZW5UYXNrV2luZG93KHRoaXMpO1xyXG4gICAgcmV0dXJuIFJlbW90ZVRhc2tTZXJ2aWNlLlByZXBhcmVQcm9wTWFpbkRpc3BsYXkodGhpcyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHJldHVybiB0cnVlIGlmIGZvcm0gaXMgbGVnYWxcclxuICAvLy8gd2UgYXJlIG5vdCBnZXQgdG8gdGhhdCBtZXRob2QgZm9yIG1haW4gZGlzcGxheSB0aGF0IG9wZW4gd2luZG93IGlzIGZhbHNlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIEZvcm1Jc0xlZ2FsKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGlzRm9ybUlzTGVnYWw6IGJvb2xlYW4gPSBzdXBlci5pc01haW5Qcm9nKCk7XHJcbiAgICByZXR1cm4gaXNGb3JtSXNMZWdhbCB8fCBzdXBlci5nZXRGb3JtKCkuaXNMZWdhbEZvcm07XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGdldCB0aGUgbWFpbiBkaXNwbGF5IG9uIHN0dWRpbyBkZXB0aFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibWFpbkRzcElkeFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBHZXRSZWFsTWFpbkRpc3BsYXlJbmRleE9uRGVwdGgobWFpbkRzcElkeDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGxldCB0YXNrOiBUYXNrID0gdGhpcy5Mb2dpY2FsU3R1ZGlvUGFyZW50VGFzaztcclxuXHJcbiAgICB3aGlsZSAodGFzayAhPSBudWxsKSB7XHJcbiAgICAgIG1haW5Ec3BJZHggKz0gdGFzay5fZm9ybXMuQ291bnQ7XHJcbiAgICAgIHRhc2sgPSB0YXNrLkxvZ2ljYWxTdHVkaW9QYXJlbnRUYXNrO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBtYWluRHNwSWR4O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBnZXQgdGhlIG1haW4gZGlzcGxheSBvbiBzdHVkaW8gZGVwdGhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1haW5Ec3BJZHhcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgR2V0UmVhbE1haW5EaXNwbGF5SW5kZXhPbkN1cnJlbnRUYXNrKG1haW5Ec3BJZHg6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBpZiAobWFpbkRzcElkeCA+IDEpIHtcclxuXHJcbiAgICAgIGxldCB0YXNrOiBUYXNrID0gdGhpcy5Mb2dpY2FsU3R1ZGlvUGFyZW50VGFzaztcclxuXHJcbiAgICAgIHdoaWxlICh0YXNrICE9IG51bGwpIHtcclxuICAgICAgICBtYWluRHNwSWR4IC09IHRhc2suX2Zvcm1zLkNvdW50O1xyXG4gICAgICAgIHRhc2sgPSB0YXNrLkxvZ2ljYWxTdHVkaW9QYXJlbnRUYXNrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG1haW5Ec3BJZHg7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGdldCBBbmNlc3RvciB0YXNrIChvbiBydW50aW1lIHRyZWUpIG9mIHRoZSBzZW5kIHRhc2sgZGVmaW5pdGlvbiBpZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZmluZFRhc2tEZWZpbml0aW9uSWRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgR2V0QW5jZXN0b3JUYXNrQnlUYXNrRGVmaW5pdGlvbklkKGZpbmRUYXNrRGVmaW5pdGlvbklkOiBUYXNrRGVmaW5pdGlvbklkKTogVGFzayB7XHJcbiAgICBsZXQgY3VycmVudFRhc2s6IFRhc2sgPSB0aGlzO1xyXG5cclxuICAgIC8vIEZpeGVkIGJ1ZyAjOjE3Mjk1OVxyXG4gICAgLy8gaWYgdGhlIGZpbmRUYXNrRGVmaW5pdGlvbklkIGlzIG1haW4gcHJvZ3JhbSAoY2FuIGJlIG9mIGNvbXBvbmVudCkgd2Ugd2lsbCBub3QgZm91bmQgaXQgaW4gdGhlIF9wYXJlbnRUYXNrXHJcbiAgICAvLyBzbyB3ZSB3aWxsIHRha2UgdGhlIHRhc2sgZnJvbSB0aGUgTUdEYXRhVGFibGVcclxuICAgIGlmIChmaW5kVGFza0RlZmluaXRpb25JZC5Jc01haW5Qcm9ncmFtKCkpXHJcbiAgICAgIHJldHVybiA8VGFzaz5HdWlEYXRhQ29sbGVjdGlvbi5NR0RhdGFUYWJsZS5HZXRNYWluUHJvZ0J5Q3RsSWR4KHRoaXMuQ29udGV4dElELCBmaW5kVGFza0RlZmluaXRpb25JZC5DdGxJbmRleCk7XHJcblxyXG4gICAgd2hpbGUgKGN1cnJlbnRUYXNrICE9IG51bGwpIHtcclxuICAgICAgaWYgKGN1cnJlbnRUYXNrLlRhc2tEZWZpbml0aW9uSWQuRXF1YWxzKGZpbmRUYXNrRGVmaW5pdGlvbklkKSlcclxuICAgICAgICByZXR1cm4gY3VycmVudFRhc2s7XHJcblxyXG4gICAgICBjdXJyZW50VGFzayA9IGN1cnJlbnRUYXNrLl9wYXJlbnRUYXNrO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgU2V0RGF0YUNvbnRyb2xWYWx1ZXNSZWZlcmVuY2UoY29udHJvbElkOiBudW1iZXIsIGRjVmFsdWVzSWQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgbGV0IGN0cmw6IE1nQ29udHJvbEJhc2UgPSBzdXBlci5nZXRGb3JtKCkuZ2V0Q3RybChjb250cm9sSWQpO1xyXG4gICAgY3RybC5zZXREY1ZhbElkKGRjVmFsdWVzSWQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBkaXNwbGF5IHRlc3Qgb24gc3RhdHVzIGJhclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidGFza1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidGV4dFwiPjwvcGFyYW0+XHJcbiAgRGlzcGxheU1lc3NhZ2VUb1N0YXR1c0Jhcih0ZXh0OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIC8vIFFjciAjNzk4MzExLiBpZiBzZXJ2ZXIgc2lkZSBoYWQgTVAgZG9pbmcgdmVyaWZ5IHRvIHBhbmUgYW5kIE1QIGhhcyBubyBmb3JtXHJcbiAgICAvLyB3ZSB3aWxsIGdldCBhbiBleGNlcHRpb24uIHNvIGluIGNhc2Ugb2Ygbm8gZm9ybSwgZ2V0IGl0IGZyb20gbGFzdCBmb2N1c2VkIHRhc2suXHJcbiAgICBsZXQgdGFza1RvVmVyaWZ5T246IFRhc2sgPSA8VGFzaz4gdGhpcy5HZXRDb250ZXh0VGFzaygpO1xyXG4gICAgaWYgKHRhc2tUb1ZlcmlmeU9uLmdldEZvcm0oKSA9PSBudWxsKVxyXG4gICAgICB0YXNrVG9WZXJpZnlPbiA9IExhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKTtcclxuXHJcbiAgICB0YXNrVG9WZXJpZnlPbi5Xcml0ZVRvTWVzc2FnZVBhbmUodGV4dCwgdHJ1ZSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgaXNUYWJsZVdpdGhBYnNvbHV0ZXNTY3JvbGxiYXIoKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgaXNUYWJsZVdpdGhBYnNvbHV0ZXNTY3JvbGxiYXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBpZiAodGhpcy5nZXRGb3JtKCkgIT0gbnVsbClcclxuICAgICAgaXNUYWJsZVdpdGhBYnNvbHV0ZXNTY3JvbGxiYXIgPSAoPE1nRm9ybT50aGlzLmdldEZvcm0oKSkuaXNUYWJsZVdpdGhBYnNvbHV0ZVNjcm9sbGJhcigpO1xyXG5cclxuICAgIHJldHVybiBpc1RhYmxlV2l0aEFic29sdXRlc1Njcm9sbGJhcjtcclxuICB9XHJcblxyXG4gIEdldFRhc2tEZXRhaWxzKCk6IHN0cmluZyB7XHJcbiAgICBsZXQgbmFtZXMgPSAgKHRoaXMuZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9OQU1FKSkuR2V0Q29tcHV0ZWRWYWx1ZSgpO1xyXG4gICAgbGV0IHRhc2s6IFRhc2sgPSB0aGlzO1xyXG4gICAgd2hpbGUgKHRhc2suUGFyZW50VGFzayAhPT0gbnVsbCAmJiAhdGFzay5QYXJlbnRUYXNrLmlzTWFpblByb2coKSkge1xyXG4gICAgICB0YXNrID0gPFRhc2s+dGFzay5QYXJlbnRUYXNrO1xyXG4gICAgICBuYW1lcyA9ICAodGFzay5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX05BTUUpKS5HZXRDb21wdXRlZFZhbHVlKCkgKyBcIi5cIiArIG5hbWVzO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBuYW1lcztcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+IHBhcnNlcyB0aGUgdGFza1VSTCB0YWdcclxuICAvLy8gZXZlcnkgdGFza1VSTCB0YWcgaXMgcmVwbGFjZWQgYnkgdGhlIGRhdGEgb2YgdGhlIHhtbCBpc2xhbmQgaXQgcmVmZXJzIHRvPC9zdW1tYXJ5PlxyXG4gIHN0YXRpYyBhc3luYyBQcm9jZXNzVGFza1VSTCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCB4bWxEYXRhOiBzdHJpbmcgPSBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuUGFyc2VyLmdldFhNTGRhdGEoKTtcclxuICAgIGxldCBlbmRUYXNrVXJsSWR4OiBudW1iZXIgPSB4bWxEYXRhLmluZGV4T2YoWE1MQ29uc3RhbnRzLlRBR19DTE9TRSwgUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLlBhcnNlci5nZXRDdXJySW5kZXgoKSk7XHJcbiAgICBEZWJ1Zy5Bc3NlcnQoZW5kVGFza1VybElkeCAhPT0gLTEgJiYgZW5kVGFza1VybElkeCA8IHhtbERhdGEubGVuZ3RoKTtcclxuXHJcbiAgICAvLyBleHRyYWN0IHRoZSB0YXNrIHVybCBhbmQgdGhlIHJlZiBsaXN0XHJcbiAgICBsZXQgdGFnOiBzdHJpbmcgPSBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuUGFyc2VyLmdldFhNTHN1YnN0cmluZyhlbmRUYXNrVXJsSWR4KTtcclxuICAgIFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5QYXJzZXIuYWRkMkN1cnJJbmRleCh0YWcuaW5kZXhPZihDb25zdEludGVyZmFjZS5NR19UQUdfVEFTS1VSTCkgKyBDb25zdEludGVyZmFjZS5NR19UQUdfVEFTS1VSTC5sZW5ndGgpO1xyXG5cclxuICAgIGxldCB0b2tlbnNWZWN0b3I6IExpc3Q8c3RyaW5nPiA9IFhtbFBhcnNlci5nZXRUb2tlbnMoUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLlBhcnNlci5nZXRYTUxzdWJzdHJpbmcoZW5kVGFza1VybElkeCksIFhNTENvbnN0YW50cy5YTUxfQVRUUl9ERUxJTSk7XHJcbiAgICBsZXQgdGFza0NhY2hlVVJMOiBzdHJpbmcgPSB0b2tlbnNWZWN0b3IuZ2V0X0l0ZW0oMSk7XHJcbiAgICBsZXQgcmVmTGlzdFN0cjogc3RyaW5nID0gdG9rZW5zVmVjdG9yLmdldF9JdGVtKDMpO1xyXG5cclxuICAgIC8vIGJyaW5nIHRoZSBkYXRhXHJcbiAgICBsZXQgdGFza0NvbnRlbnRPcmlnaW5hbDogc3RyaW5nID0gYXdhaXQgVGFzay5Db21tYW5kc1Byb2Nlc3Nvci5HZXRDb250ZW50KHRhc2tDYWNoZVVSTCwgdHJ1ZSk7XHJcblxyXG4gICAgLy8gcHJlZml4IHRoZSBvcmlnaW5hbCBkYXRhIHRpbGwgdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IDx0YXNrVVJMPlxyXG4gICAgbGV0IHRhc2tDb250ZW50RmluYWw6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcih4bWxEYXRhLnN1YnN0cigwLCBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuUGFyc2VyLmdldEN1cnJJbmRleCgpIC0gKENvbnN0SW50ZXJmYWNlLk1HX1RBR19UQVNLVVJMLmxlbmd0aCArIDEpKSwgdGFza0NvbnRlbnRPcmlnaW5hbC5sZW5ndGgpO1xyXG4gICAgLy8gdGhlIG51bWJlciBvZiB0b2tlbnMgaW4gcmVmTGlzdCBhbmQgdGhlIG51bWJlciBvZiBsb2NhdGlvbiBpbiB0aGUgeG1sIHRvIGJlIHJlcGxhY2VkIChpLmUuIHRoZSBwbGFjZXMgd2l0aCBbOikgc2hvdWxkIGJlIGVxdWFsXHJcbiAgICBsZXQgcmVmbGlzdDogTGlzdDxzdHJpbmc+ID0gdGhpcy5nZXRSZWZsaXN0KHJlZkxpc3RTdHIsICc7JywgdHJ1ZSwgLTEpO1xyXG4gICAgbGV0IHJlZkxpc3RJZHggPSAwO1xyXG5cclxuICAgIGxldCBjdXJySWR4OiBudW1iZXIgPSB0YXNrQ29udGVudE9yaWdpbmFsLmluZGV4T2YoXCJbOlwiKTtcclxuICAgIGxldCBwcmV2SWR4OiBudW1iZXIgPSAwO1xyXG4gICAgd2hpbGUgKGN1cnJJZHggIT09IC0xKSB7XHJcbiAgICAgIHRhc2tDb250ZW50RmluYWwuQXBwZW5kKHRhc2tDb250ZW50T3JpZ2luYWwuc3Vic3RyKHByZXZJZHgsIGN1cnJJZHggLSBwcmV2SWR4KSk7XHJcbiAgICAgIHRhc2tDb250ZW50RmluYWwuQXBwZW5kKHJlZmxpc3QuZ2V0X0l0ZW0ocmVmTGlzdElkeCsrKSk7XHJcbiAgICAgIGN1cnJJZHggKz0gMjtcclxuICAgICAgcHJldklkeCA9IGN1cnJJZHg7XHJcbiAgICAgIGN1cnJJZHggPSB0YXNrQ29udGVudE9yaWdpbmFsLmluZGV4T2YoXCJbOlwiLCBwcmV2SWR4KTtcclxuICAgIH1cclxuICAgIHRhc2tDb250ZW50RmluYWwuQXBwZW5kKHRhc2tDb250ZW50T3JpZ2luYWwuc3Vic3RyKHByZXZJZHgpKTtcclxuXHJcbiAgICAvLyBzdWZmaXggdGhlIHJlc3Qgb2YgdGhlIG9yaWdpbmFsIHhtbCBmcm9tIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgPC90YXNrVVJMPlxyXG4gICAgdGFza0NvbnRlbnRGaW5hbC5BcHBlbmQoeG1sRGF0YS5zdWJzdHIoeG1sRGF0YS5pbmRleE9mKFhNTENvbnN0YW50cy5UQUdfQ0xPU0UsIGVuZFRhc2tVcmxJZHggKyAxKSArIDEpKTtcclxuICAgIHhtbERhdGEgPSB0YXNrQ29udGVudEZpbmFsLlRvU3RyaW5nKCk7XHJcblxyXG4gICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJ7MH0gLS0tLS0tLT4gezF9XCIsIHRhc2tDYWNoZVVSTCwgeG1sRGF0YSkpO1xyXG5cclxuICAgIFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5QYXJzZXIuc2V0WE1MZGF0YSh4bWxEYXRhKTtcclxuICAgIFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5QYXJzZXIuc2V0Q3VyckluZGV4KFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5QYXJzZXIuZ2V0Q3VyckluZGV4KCkgLSAoQ29uc3RJbnRlcmZhY2UuTUdfVEFHX1RBU0tVUkwubGVuZ3RoICsgMSkpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBwYXJzZXMgdGhlIGRhdGEgYWNvcmRpbmcgdG8gdGhlIGRlbGltZXRlciBhbmQgdGhlIHJlZmxpc3QgZGVsaW1ldGVycyBsb2dpYzwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkZWxpbVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidHJ1bmNcIj5pZiB0cnVlIHRydWNhdGUgZmlyc3QgJ1xcXFwnIChpbiB1c2UgZm9yIGlzbGFuZCBkYXRhIHBhcnNpbmc8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1heFRva2Vuc1wiPmlmIC0xIGFsbCB0b2tlbnMgYXZpYWxhYmxlIGVsc2UgdGhlIG51bWJlciBvZiB0b2tlbnMgdG8gc2VhcmNoPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkYXRhXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIHN0YXRpYyBnZXRSZWZsaXN0KGRhdGE6IHN0cmluZywgZGVsaW06IHN0cmluZywgdHJ1bmM6IGJvb2xlYW4sIG1heFRva2VuczogbnVtYmVyKTogTGlzdDxzdHJpbmc+IHtcclxuICAgIGxldCBjdXJyU3RyOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuICAgIGxldCBsaXN0OiBMaXN0PHN0cmluZz4gPSBuZXcgTGlzdDxzdHJpbmc+KCk7XHJcbiAgICBsZXQgdG9rZW5zQ250OiBudW1iZXIgPSAwO1xyXG5cclxuICAgIC8vIHNpbmNlIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaXMgYWx3YXlzICc7JyB3ZSBzdGFydCBmcm9tIDFcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDE7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBjdXJyOiBzdHJpbmcgPSBkYXRhLmNoYXJBdChpKTtcclxuXHJcbiAgICAgIGlmIChjdXJyICE9PSAnXFxcXCcgJiYgY3VyciAhPT0gZGVsaW0pXHJcbiAgICAgICAgY3VyclN0ci5BcHBlbmQoY3Vycik7XHJcbiAgICAgIGVsc2UgaWYgKGN1cnIgPT09IGRlbGltKSB7XHJcbiAgICAgICAgbGlzdC5wdXNoKGN1cnJTdHIuVG9TdHJpbmcoKSk7XHJcbiAgICAgICAgY3VyclN0ciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7XHJcbiAgICAgICAgdG9rZW5zQ250Kys7XHJcblxyXG4gICAgICAgIGlmICh0b2tlbnNDbnQgPT09IG1heFRva2VucylcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKGN1cnIgPT09ICdcXFxcJykge1xyXG4gICAgICAgIC8vIHRoZSBmb3JtYXQgJ1xcXFxkZWxpbWl0ZXInIGlzIGFsd2F5cyB0cnVuY2F0ZWRcclxuICAgICAgICBpZiAoIXRydW5jICYmIGRhdGEuY2hhckF0KGkgKyAxKSAhPT0gZGVsaW0pXHJcbiAgICAgICAgICBjdXJyU3RyLkFwcGVuZChkYXRhLmNoYXJBdChpKSk7XHJcblxyXG4gICAgICAgIGkrKztcclxuICAgICAgICBjdXJyU3RyLkFwcGVuZChkYXRhLmNoYXJBdChpKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBhcHBlbmQgdGhlIGxhc3QgZWxlbWVudCBpbiB0aGUgcmVmIGxpc3RcclxuICAgIGxpc3QucHVzaChjdXJyU3RyLlRvU3RyaW5nKCkpO1xyXG5cclxuICAgIHJldHVybiBsaXN0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBzdGFydCB0aGUgZXhlY3V0aW9uIG9mIHRoZSBwcm9ncmFtIGFuZCBzZXQgZm9jdXMgdG8gdGhlIGZpcnN0IGNvbnRyb2wuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzdGF0aWMgYXN5bmMgU3RhcnRQcm9ncmFtKGNhbGxCeURlc3RTdWJGb3JtOiBib29sZWFuLCBtb3ZlVG9GaXJzdENvbnRyb2w6IGJvb2xlYW4pOiBQcm9taXNlPFRhc2s+IHtcclxuICAgIGxldCBvcmdTdG9wRXhlY3V0aW9uOiBib29sZWFuID0gQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKTtcclxuICAgIGxldCBub25JbnRlcmFjdGl2ZVRhc2tBbHJlYWR5RXhlY3V0ZWQ6IFRhc2sgPSBudWxsO1xyXG4gICAgbGV0IGFsbG93RXZlbnRzOiBFdmVudHNBbGxvd2VkVHlwZSA9IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmdldEFsbG93RXZlbnRzKCk7XHJcbiAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5zZXRBbGxvd0V2ZW50cyhFdmVudHNBbGxvd2VkVHlwZS5BTEwpO1xyXG5cclxuICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKFwiU3RhcnQgXFxcInN0YXJ0UHJvZ1xcXCJcIik7XHJcbiAgICBUYXNrLlN0YXJ0UHJvZ0xldmVsKys7XHJcbiAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5zZXRTdG9wRXhlY3V0aW9uKGZhbHNlKTsgLy8gUUNSICM3Njk3MzQgLSBub3RoaW5nIGNhbiBzdG9wIGEgdGFzayBmcm9tIHN0YXJ0aW5nIHVwLlxyXG5cclxuICAgIC8vIEZpeGVkIGJ1ZyAjMjgzNjQ3IGV4ZWN1dGUgY29tcG9uZW50cyBtYWluIHByb2dyYW1zIC0gIGluIHRoZSBzZXJ2ZXIgd2UgZXhlY3V0ZSB0aGUgc2FtZSBzZWUgaW5pLmNwcCBtZXRob2QgZXhlY3V0ZV9tYWluX3Byb2dzKClcclxuICAgIG5vbkludGVyYWN0aXZlVGFza0FscmVhZHlFeGVjdXRlZCA9IGF3YWl0IHRoaXMuRXhlY3V0ZUNvbXBvbmVudE1haW5Qcm9ncmFtcyhjYWxsQnlEZXN0U3ViRm9ybSwgbW92ZVRvRmlyc3RDb250cm9sKTtcclxuXHJcbiAgICAvLyBleGVjdXRlIGludGVybmFsIG1haW4gcHJvZ3JhbXNcclxuICAgIGxldCBub25JbnRlcmFjdGl2ZVRhc2tBbHJlYWR5RXhlY3V0ZWRSZWY6IFJlZlBhcmFtPFRhc2s+ID0gbmV3IFJlZlBhcmFtKG5vbkludGVyYWN0aXZlVGFza0FscmVhZHlFeGVjdXRlZCk7XHJcbiAgICBsZXQgY3VycmVudE5vbkludGVyYWN0aXZlVGFza1JlZjogUmVmUGFyYW08VGFzaz4gPSBuZXcgUmVmUGFyYW0obnVsbCk7XHJcbiAgICBhd2FpdCBUYXNrLkV4ZWN1dGVNYWluUHJvZ3JhbSgwLCBjYWxsQnlEZXN0U3ViRm9ybSwgbW92ZVRvRmlyc3RDb250cm9sLCBub25JbnRlcmFjdGl2ZVRhc2tBbHJlYWR5RXhlY3V0ZWRSZWYsIGN1cnJlbnROb25JbnRlcmFjdGl2ZVRhc2tSZWYsIEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZSk7XHJcbiAgICBub25JbnRlcmFjdGl2ZVRhc2tBbHJlYWR5RXhlY3V0ZWQgPSBub25JbnRlcmFjdGl2ZVRhc2tBbHJlYWR5RXhlY3V0ZWRSZWYudmFsdWU7XHJcblxyXG4gICAgaWYgKCFUYXNrLl9pZGxlVGltZXJTdGFydGVkKSB7XHJcbiAgICAgIEdVSU1hbmFnZXIuSW5zdGFuY2Uuc3RhcnRUaW1lcihBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuZ2V0TUdEYXRhKDApLCBFbnZpcm9ubWVudC5JbnN0YW5jZS5nZXRJZGxlVGltZSgwKSwgdHJ1ZSk7XHJcbiAgICAgIFRhc2suX2lkbGVUaW1lclN0YXJ0ZWQgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGF3YWl0IHRoaXMuT3BlbkZvcm1zKGNhbGxCeURlc3RTdWJGb3JtKTtcclxuICAgIGF3YWl0IHRoaXMuRG9GaXJzdFJlY29yZEN5Y2xlKCk7XHJcbiAgICBhd2FpdCB0aGlzLk1vdmVUb0ZpcnN0Q29udHJvbHMoY2FsbEJ5RGVzdFN1YkZvcm0pO1xyXG5cclxuXHJcbiAgICAvLyBIYW5kbGUgdGhlIGV2ZW50cyBvbmx5IHdoZW4gYWxsIHRoZSB0YXNrcyBhbmQgdGhlaXIgZm9ybXMgYXJlIG9wZW5lZC5cclxuICAgIGlmIChUYXNrLlN0YXJ0UHJvZ0xldmVsID09PSAxKSB7XHJcbiAgICAgIGxldCByZXNldEFsbG93RXZlbnRzOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgIGxldCBjYW5FeGVjdXRlRXZlbnRzOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICAgIC8vIHNldCB0aGUgd2l0aGluIG5vbiBpbnRlcmFjdGl2ZSBzaW5jZSB0aGUgaGFuZGxlRXZlbnRzIG1pZ2h0IHRyeSB0byBleGVjdXRlIGFuIGV2ZW50XHJcbiAgICAgIC8vIHRoYXQgd2FzIHJhaXNlZCBpbiB0aGUgMXN0IHJlYyBwcmVmIChhZGRlZCBpbiBtb3ZlVG9GaXJzdGNvbnRyb2xzKS5cclxuICAgICAgaWYgKG5vbkludGVyYWN0aXZlVGFza0FscmVhZHlFeGVjdXRlZCAhPT0gbnVsbCAmJiBub25JbnRlcmFjdGl2ZVRhc2tBbHJlYWR5RXhlY3V0ZWQuaXNTdGFydGVkKCkpIHtcclxuICAgICAgICByZXNldEFsbG93RXZlbnRzID0gdHJ1ZTtcclxuICAgICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5zZXROb25JbnRlcmFjdGl2ZUFsbG93RXZlbnRzKGF3YWl0IG5vbkludGVyYWN0aXZlVGFza0FscmVhZHlFeGVjdXRlZC5pc0FsbG93RXZlbnRzKCksIG5vbkludGVyYWN0aXZlVGFza0FscmVhZHlFeGVjdXRlZCk7XHJcblxyXG4gICAgICAgIC8vIG5vbiBpbnRlcmFjdGl2ZSB0YXNrIHdpdGggYWxsb3cgZXZlbnRzID0gTk8gaXMgYWJvdXQgdG8gcnVuLlxyXG4gICAgICAgIC8vIGRvbid0IHRyeSB0byBleGVjdXRlIHRoZSBldmVudHMgYmVmb3JlIGl0IHN0YXJ0cyBiZWNhdXNlIHRoZXkgd2lsbCBiZSBsb3N0LiAoIzEzODQ5MylcclxuICAgICAgICBjYW5FeGVjdXRlRXZlbnRzID0gYXdhaXQgIG5vbkludGVyYWN0aXZlVGFza0FscmVhZHlFeGVjdXRlZC5pc0FsbG93RXZlbnRzKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIGlmIHRoZSBpdCBpcyBhIHN1YmZvcm0gd2l0aCB2aXNpYmlsaXR5IGV4cHJlc3Npb24gZXZhbHVhdGVkIHRvIFRSVUUsXHJcbiAgICAgIC8vIHNvIGFmdGVyIHJldHVybiBmcm9tIHRoZSBzZXJ2ZXIgZG8gbm90IGV4ZWN1dGUgZXZlbnRzIGZyb20gdGhlIHF1ZXVlLlxyXG4gICAgICAvLyBUaGVzZSBldmVudHMgd2lsbCBiZSBleGVjdXRlZCBmcm9tIHRoZSAnc3RhcnRQcm9nJyBvZiB0aGUgcGFyZW50IHRhc2suXHJcbiAgICAgIGlmIChMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCkgIT09IG51bGwgJiYgY2FuRXhlY3V0ZUV2ZW50cykge1xyXG4gICAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnB1c2hOZXdFeGVjU3RhY2tzKCk7XHJcbiAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlRXZlbnRzKEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5nZXRDdXJyTUdEYXRhKCksIDApO1xyXG4gICAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnBvcE5ld0V4ZWNTdGFja3MoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gcmVzdG9yZS4ganVzdCB0byBiZSBvbiB0aGUgc2FmZSBzaWRlLiBpdCB3aWxsIGJlIHNldCBhZ2FpbiBvbmNlIGluIHRoZSBjb3JyZWN0IGV2ZW50c0xvb3AuXHJcbiAgICAgIGlmIChyZXNldEFsbG93RXZlbnRzKVxyXG4gICAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnNldEFsbG93RXZlbnRzKGFsbG93RXZlbnRzKTtcclxuICAgIH1cclxuXHJcbiAgICBUYXNrLlN0YXJ0UHJvZ0xldmVsLS07XHJcblxyXG4gICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coXCJFbmQgXFxcInN0YXJ0UHJvZ1xcXCJcIik7XHJcblxyXG4gICAgLy8gSWYgb3JpZ2luYWxseSB3ZSB3ZXJlIGluc3RydWN0ZWQgdG8gc3RvcCBldmVudHMgZXhlY3V0aW9uLCB0aGVuIHJlc3RvcmUgdGhpc1xyXG4gICAgaWYgKG9yZ1N0b3BFeGVjdXRpb24gJiYgIUFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpXHJcbiAgICAgIGlmIChvcmdTdG9wRXhlY3V0aW9uICYmICFBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKVxyXG4gICAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnNldFN0b3BFeGVjdXRpb24ob3JnU3RvcEV4ZWN1dGlvbik7XHJcblxyXG4gICAgcmV0dXJuIG5vbkludGVyYWN0aXZlVGFza0FscmVhZHlFeGVjdXRlZDtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGV4ZWN1dGUgY29tcG9uZW50J3MgbWFpbiBwcm9ncmFtXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjYWxsQnlEZXN0U3ViRm9ybVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibW92ZVRvRmlyc3RDb250cm9sXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+dGhlIG5vbiBpbnRlcmFjdGl2ZSB0YXNrIGlmIGFueSB0aGF0IGV4ZWN1dGVkPC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBhc3luYyBFeGVjdXRlQ29tcG9uZW50TWFpblByb2dyYW1zKGNhbGxCeURlc3RTdWJGb3JtOiBib29sZWFuLCBtb3ZlVG9GaXJzdENvbnRyb2w6IGJvb2xlYW4pOiBQcm9taXNlPFRhc2s+IHsgLy8gZ28gd2l0aCBTdGFydFByb2dyYW1cclxuICAgIGxldCBjdXJyZW50Tm9uSW50ZXJhY3RpdmVUYXNrOiBSZWZQYXJhbTxUYXNrPiA9IG5ldyBSZWZQYXJhbShudWxsKTtcclxuICAgIGxldCBub25JbnRlcmFjdGl2ZVRhc2tBbHJlYWR5RXhlY3V0ZWQ6IFJlZlBhcmFtPFRhc2s+ID0gbmV3IFJlZlBhcmFtKG51bGwpO1xyXG5cclxuICAgIGxldCBtYXhDdGxJZHg6IG51bWJlciA9IEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5nZXRNR0RhdGEoMCkuZ2V0TWF4Q3RsSWR4KCk7XHJcblxyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMTsgaSA8PSBtYXhDdGxJZHg7IGkgPSBpICsgMSkge1xyXG4gICAgICBsZXQgY29tcG9uZW50TWFpblByb2dyYW06IFRhc2sgPSA8VGFzaz5BY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuR2V0TWFpblByb2dCeUN0bElkeCgtMSwgaSk7XHJcblxyXG4gICAgICBpZiAoY29tcG9uZW50TWFpblByb2dyYW0gIT09IG51bGwpXHJcbiAgICAgICAgYXdhaXQgVGFzay5FeGVjdXRlTWFpblByb2dyYW0oaSwgY2FsbEJ5RGVzdFN1YkZvcm0sIG1vdmVUb0ZpcnN0Q29udHJvbCwgY3VycmVudE5vbkludGVyYWN0aXZlVGFzaywgbm9uSW50ZXJhY3RpdmVUYXNrQWxyZWFkeUV4ZWN1dGVkLCBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBub25JbnRlcmFjdGl2ZVRhc2tBbHJlYWR5RXhlY3V0ZWQudmFsdWU7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBleGVjdXRlIG1haW4gcHJvZ3JhbSBvZiBDdGxJbmRleFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiQ3RsSW5kZXhcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNhbGxCeURlc3RTdWJGb3JtXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtb3ZlVG9GaXJzdENvbnRyb2xcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN1cnJlbnROb25JbnRlcmFjdGl2ZVRhc2tcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm5vbkludGVyYWN0aXZlVGFza0FscmVhZHlFeGVjdXRlZFwiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgRXhlY3V0ZU1haW5Qcm9ncmFtKEN0bEluZGV4OiBudW1iZXIsIGNhbGxCeURlc3RTdWJGb3JtOiBib29sZWFuLCBtb3ZlVG9GaXJzdENvbnRyb2w6IGJvb2xlYW4sIGN1cnJlbnROb25JbnRlcmFjdGl2ZVRhc2s6IFJlZlBhcmFtPFRhc2s+LCBub25JbnRlcmFjdGl2ZVRhc2tBbHJlYWR5RXhlY3V0ZWQ6IFJlZlBhcmFtPFRhc2s+LCBtZ0RhdGFUYWJsZTogSU1HRGF0YUNvbGxlY3Rpb24pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBtYWluUHJvZ3JhbVRhc2s6IFRhc2sgPSA8VGFzaz5tZ0RhdGFUYWJsZS5HZXRNYWluUHJvZ0J5Q3RsSWR4KC0xLCBDdGxJbmRleCk7XHJcblxyXG4gICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coTlN0cmluZy5Gb3JtYXQoXCIgIENsaWVudE1hbmFnZXIuc3RhcnRQcm9nOiBjdGxJZHg9ezB9LCB0YXNrPXsxfVwiLCBDdGxJbmRleCwgbWFpblByb2dyYW1UYXNrKSk7XHJcblxyXG4gICAgY3VycmVudE5vbkludGVyYWN0aXZlVGFzay52YWx1ZSA9ICA8VGFzaz4oYXdhaXQgbWFpblByb2dyYW1UYXNrLlN0YXJ0KG1vdmVUb0ZpcnN0Q29udHJvbCwgY2FsbEJ5RGVzdFN1YkZvcm0pKTtcclxuICAgIGlmIChub25JbnRlcmFjdGl2ZVRhc2tBbHJlYWR5RXhlY3V0ZWQudmFsdWUgPT09IG51bGwpXHJcbiAgICAgIG5vbkludGVyYWN0aXZlVGFza0FscmVhZHlFeGVjdXRlZC52YWx1ZSA9IGN1cnJlbnROb25JbnRlcmFjdGl2ZVRhc2sudmFsdWU7XHJcbiAgICBlbHNlIGlmIChjdXJyZW50Tm9uSW50ZXJhY3RpdmVUYXNrLnZhbHVlICE9PSBudWxsKSB7XHJcbiAgICAgIERlYnVnLkFzc2VydChmYWxzZSwgXCJtb3JlIHRoYW4gMSBub24gaW50ZXJhY3RpdmUgdGFza3MgaW4gc3RhcnRQcm9nXCIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBPcGVuIGFsbCB0aGUgZm9ybSB0aGF0IGFyZSBwZW5kaW5nIGluIENyZWF0ZWRGb3JtcyB2ZWN0b3IuIDwvc3VtbWFyeT5cclxuICBzdGF0aWMgYXN5bmMgT3BlbkZvcm1zKGNhbGxCeURlc3RTdWJGb3JtOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgY3JlYXRlZEZvcm1zOiBDcmVhdGVkRm9ybVZlY3RvciA9IE1nRm9ybS5DcmVhdGVkRm9ybXM7XHJcbiAgICBsZXQgb3V0TW9zdEZvcm06IE1nRm9ybUJhc2UgPSBudWxsO1xyXG5cclxuICAgIGlmIChjcmVhdGVkRm9ybXMuQ291bnQoKSA+IDApIHtcclxuICAgICAgbGV0IGk6IG51bWJlciA9IDA7XHJcbiAgICAgIHdoaWxlIChpIDwgY3JlYXRlZEZvcm1zLkNvdW50KCkpIHtcclxuICAgICAgICBsZXQgbWdGb3JtOiBNZ0Zvcm0gPSBjcmVhdGVkRm9ybXMuZ2V0KGkpO1xyXG4gICAgICAgIGxldCBjYW5PcGVuOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8vIE9wZW4gYSBzdWJmb3JtIG9ubHkgaWYgaXRzIGNvbnRhaW5lciBmb3JtIGlzIE9wZW5lZC5cclxuICAgICAgICAvLyBpc0N1cnJlbnRTdGFydFByb2dMZXZlbCgpIGRvZXNuJ3QgZ28gd2VsbCBmb3Igc3ViZm9ybXMgKFFDUiAjOTE5MTE5KS5cclxuICAgICAgICBpZiAobWdGb3JtLmlzU3ViRm9ybSgpKSB7XHJcbiAgICAgICAgICBsZXQgb3BlbmVkOiBib29sZWFuID0gKDxNZ0Zvcm1CYXNlPm1nRm9ybS5nZXRTdWJGb3JtQ3RybCgpLmdldEZvcm0oKSkuT3BlbmVkO1xyXG4gICAgICAgICAgaWYgKG9wZW5lZCkge1xyXG4gICAgICAgICAgICBjYW5PcGVuID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBpZiAoKDxUYXNrPm1nRm9ybS5nZXRUYXNrKCkpLmlzQ3VycmVudFN0YXJ0UHJvZ0xldmVsKCkpIHtcclxuICAgICAgICAgICAgY2FuT3BlbiA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY2FuT3Blbikge1xyXG4gICAgICAgICAgTWFuYWdlci5PcGVuRm9ybShtZ0Zvcm0pO1xyXG4gICAgICAgICAgYXdhaXQgTWFuYWdlci5Eb0ZpcnN0UmVmcmVzaFRhYmxlKG1nRm9ybSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAobWdGb3JtLk9wZW5lZCkge1xyXG4gICAgICAgICAgaWYgKGNhbGxCeURlc3RTdWJGb3JtICYmIG1nRm9ybS5pc1N1YkZvcm0oKSlcclxuICAgICAgICAgICAgb3V0TW9zdEZvcm0gPSBtZ0Zvcm0uZ2V0VG9wTW9zdEZvcm0oKTtcclxuXHJcbiAgICAgICAgICBjcmVhdGVkRm9ybXMucmVtb3ZlKG1nRm9ybSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIGkrKztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBHb2VzIG92ZXIgZm9ybXMgaXMgY3JlYXRlZEZvcm1WZWMgYW5kIHBlcmZvcm1zIG1vdmUgdG8gZmlyc3QgcmVjb3JkIGN5Y2xlIGNvbnRyb2w8L3N1bW1hcnk+XHJcbiAgc3RhdGljIGFzeW5jIERvRmlyc3RSZWNvcmRDeWNsZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuXHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLmdldFNpemUoKTsgaSsrKSB7XHJcbiAgICAgIGxldCBtZ2Q6IE1HRGF0YSA9IEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5nZXRNR0RhdGEoaSk7XHJcbiAgICAgIGlmIChtZ2QgPT09IG51bGwgfHwgbWdkLklzQWJvcnRpbmcpXHJcbiAgICAgICAgY29udGludWU7XHJcblxyXG4gICAgICBmb3IgKGxldCBqOiBudW1iZXIgPSAwOyBqIDwgbWdkLmdldFRhc2tzQ291bnQoKTsgaisrKSB7XHJcbiAgICAgICAgbGV0IHRhc2s6IFRhc2sgPSBtZ2QuZ2V0VGFzayhqKTtcclxuXHJcbiAgICAgICAgaWYgKHRhc2sgIT09IG51bGwpIHtcclxuICAgICAgICAgIGxldCBtZ0Zvcm06IE1nRm9ybSA9IDxNZ0Zvcm0+dGFzay5nZXRGb3JtKCk7XHJcblxyXG4gICAgICAgICAgaWYgKG1nRm9ybSAhPT0gbnVsbCAmJiB0YXNrLmlzQ3VycmVudFN0YXJ0UHJvZ0xldmVsKCkgJiYgIW1nRm9ybS5JZ25vcmVGaXJzdFJlY29yZEN5Y2xlKSB7XHJcbiAgICAgICAgICAgIG1nRm9ybS5JZ25vcmVGaXJzdFJlY29yZEN5Y2xlID0gdHJ1ZTtcclxuICAgICAgICAgICAgYXdhaXQgdGFzay5kb0ZpcnN0UmVjb3JkQ3ljbGUoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gRm9yIGV2ZXJ5IG1nZGF0YSBwZXJmb3JtIG1vdmUgdG8gZmlyc3QgY29udHJvbCB0byB0aGUgZm9ybVxyXG4gIC8vLyB0aGF0IHdlIG1hcmtlZCBiZWZvcmUgd2l0aCBNb3ZlVG9GaXJzdENvbnRyb2wgZmxhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgTW92ZVRvRmlyc3RDb250cm9scyhjYWxsQnlEZXN0U3ViRm9ybTogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG5cclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuZ2V0U2l6ZSgpOyBpKyspIHtcclxuICAgICAgbGV0IG1nZDogTUdEYXRhID0gQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLmdldE1HRGF0YShpKTtcclxuXHJcbiAgICAgIGlmIChtZ2QgPT09IG51bGwgfHwgbWdkLklzQWJvcnRpbmcpXHJcbiAgICAgICAgY29udGludWU7XHJcblxyXG4gICAgICBsZXQgdGFza3NDb3VudDogbnVtYmVyID0gbWdkLmdldFRhc2tzQ291bnQoKTtcclxuICAgICAgZm9yIChsZXQgajogbnVtYmVyID0gMDsgaiA8IHRhc2tzQ291bnQ7IGorKykge1xyXG4gICAgICAgIGxldCB0YXNrOiBUYXNrID0gbWdkLmdldFRhc2soaik7XHJcbiAgICAgICAgbGV0IG1nRm9ybTogTWdGb3JtID0gPE1nRm9ybT50YXNrLmdldEZvcm0oKTtcclxuXHJcbiAgICAgICAgaWYgKHRhc2suaXNDdXJyZW50U3RhcnRQcm9nTGV2ZWwoKSAmJiBtZ0Zvcm0gIT09IG51bGwgJiYgbWdGb3JtLk1vdmVkVG9GaXJzdENvbnRyb2wpIHtcclxuICAgICAgICAgIG1nRm9ybS5Nb3ZlZFRvRmlyc3RDb250cm9sID0gZmFsc2U7XHJcbiAgICAgICAgICBpZiAoIWNhbGxCeURlc3RTdWJGb3JtKVxyXG4gICAgICAgICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkhhbmRsZU5vblBhcmthYmxlQ29udHJvbHModGFzayk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5cclxuXHJcbiJdfQ==
|