@magic-xpa/engine 4.1100.0-dev4110.19 → 4.1100.0-dev4110.190
Sign up to get free protection for your applications and to get access to all the features.
- package/{esm2020 → esm2022}/index.mjs +188 -188
- package/{esm2020 → esm2022}/magic-xpa-engine.mjs +1 -1
- package/esm2022/src/AccessHelper.mjs +15 -0
- package/esm2022/src/ClientManager.mjs +399 -0
- package/esm2022/src/CommandsProcessorBase.mjs +56 -0
- package/esm2022/src/CommandsProcessorManager.mjs +26 -0
- package/esm2022/src/CommandsTable.mjs +162 -0
- package/esm2022/src/ConstInterface.mjs +516 -0
- package/{esm2020 → esm2022}/src/CurrentClientVersion.mjs +2 -2
- package/esm2022/src/FlowMonitorInterface.mjs +16 -0
- package/esm2022/src/GUIManager.mjs +62 -0
- package/esm2022/src/GlobalCommandsManager.mjs +34 -0
- package/esm2022/src/GuiEventsProcessor.mjs +154 -0
- package/{esm2020 → esm2022}/src/ICommandsTable.mjs +1 -1
- package/esm2022/src/ServerConfig.mjs +118 -0
- package/{esm2020 → esm2022}/src/bridge/IGuiEvent.mjs +19 -19
- package/{esm2020 → esm2022}/src/bridge/MagicBridge.mjs +40 -40
- package/esm2022/src/commands/ClientOriginatedCommandTaskTag.mjs +12 -0
- package/{esm2020 → esm2022}/src/commands/ClientToServer/AddUserLocateDataViewCommand.mjs +8 -8
- package/{esm2020 → esm2022}/src/commands/ClientToServer/AddUserRangeDataviewCommand.mjs +9 -9
- package/{esm2020 → esm2022}/src/commands/ClientToServer/AddUserSortDataViewCommand.mjs +9 -9
- package/{esm2020 → esm2022}/src/commands/ClientToServer/BrowserEscEventCommand.mjs +23 -23
- package/{esm2020 → esm2022}/src/commands/ClientToServer/ClientOriginatedCommand.mjs +14 -14
- package/esm2022/src/commands/ClientToServer/ClientOriginatedCommandSerializer.mjs +60 -0
- package/{esm2020 → esm2022}/src/commands/ClientToServer/ColumnSortEventCommand.mjs +26 -26
- package/esm2022/src/commands/ClientToServer/CommandFactory.mjs +260 -0
- package/esm2022/src/commands/ClientToServer/CommandSerializationHelper.mjs +67 -0
- package/{esm2020 → esm2022}/src/commands/ClientToServer/ComputeEventCommand.mjs +23 -23
- package/{esm2020 → esm2022}/src/commands/ClientToServer/ContextTerminationEventCommand.mjs +20 -20
- package/{esm2020 → esm2022}/src/commands/ClientToServer/ContextTimeoutResetCommand.mjs +19 -19
- package/{esm2020 → esm2022}/src/commands/ClientToServer/ControlItemsRefreshCommand.mjs +8 -8
- package/esm2022/src/commands/ClientToServer/DataViewOutputCommand.mjs +13 -0
- package/{esm2020 → esm2022}/src/commands/ClientToServer/DataviewCommand.mjs +44 -44
- package/esm2022/src/commands/ClientToServer/EvaluateCommand.mjs +37 -0
- package/esm2022/src/commands/ClientToServer/EventCommand.mjs +40 -0
- package/esm2022/src/commands/ClientToServer/ExecOperCommand.mjs +67 -0
- package/esm2022/src/commands/ClientToServer/FetchDataControlValuesEventCommand.mjs +22 -0
- package/{esm2020 → esm2022}/src/commands/ClientToServer/GlobalParamsQueryCommand.mjs +10 -10
- package/{esm2020 → esm2022}/src/commands/ClientToServer/ICommandTaskTag.mjs +1 -1
- package/{esm2020 → esm2022}/src/commands/ClientToServer/IndexChangeEventCommand.mjs +21 -21
- package/esm2022/src/commands/ClientToServer/IniputForceWriteCommand.mjs +23 -0
- package/{esm2020 → esm2022}/src/commands/ClientToServer/NonReversibleExitEventCommand.mjs +23 -23
- package/{esm2020 → esm2022}/src/commands/ClientToServer/QueryCommand.mjs +20 -20
- package/esm2022/src/commands/ClientToServer/RecomputeCommand.mjs +27 -0
- package/esm2022/src/commands/ClientToServer/RefreshEventCommand.mjs +27 -0
- package/esm2022/src/commands/ClientToServer/RefreshScreenEventCommand.mjs +24 -0
- package/esm2022/src/commands/ClientToServer/RollbackEventCommand.mjs +40 -0
- package/{esm2020 → esm2022}/src/commands/ClientToServer/SelectProgramCommand.mjs +14 -14
- package/{esm2020 → esm2022}/src/commands/ClientToServer/SetTransactionStateDataviewCommand.mjs +9 -9
- package/{esm2020 → esm2022}/src/commands/ClientToServer/SubformOpenEventCommand.mjs +21 -21
- package/esm2022/src/commands/ClientToServer/SubformRefreshEventCommand.mjs +24 -0
- package/esm2022/src/commands/ClientToServer/TransactionCommand.mjs +30 -0
- package/{esm2020 → esm2022}/src/commands/ClientToServer/UnloadCommand.mjs +14 -14
- package/esm2022/src/commands/ClientToServer/WriteMessageToServerLogCommand.mjs +18 -0
- package/esm2022/src/commands/DataViewCommandBase.mjs +8 -0
- package/{esm2020 → esm2022}/src/commands/IClientCommand.mjs +1 -1
- package/esm2022/src/commands/IClientTargetedCommand.mjs +13 -0
- package/{esm2020 → esm2022}/src/commands/IClientToServerCommandInfo.mjs +1 -1
- package/esm2022/src/commands/ServerToClient/AbortCommand.mjs +65 -0
- package/{esm2020 → esm2022}/src/commands/ServerToClient/AddLocateCommand.mjs +21 -21
- package/esm2022/src/commands/ServerToClient/AddRangeCommand.mjs +62 -0
- package/esm2022/src/commands/ServerToClient/AddSortCommand.mjs +33 -0
- package/esm2022/src/commands/ServerToClient/ClientRefreshCommand.mjs +25 -0
- package/esm2022/src/commands/ServerToClient/ClientTargetedCommandBase.mjs +24 -0
- package/esm2022/src/commands/ServerToClient/EnhancedVerifyCommand.mjs +45 -0
- package/esm2022/src/commands/ServerToClient/OpenURLCommand.mjs +221 -0
- package/{esm2020 → esm2022}/src/commands/ServerToClient/ResetLocateCommand.mjs +14 -14
- package/{esm2020 → esm2022}/src/commands/ServerToClient/ResetRangeCommand.mjs +14 -14
- package/{esm2020 → esm2022}/src/commands/ServerToClient/ResetSortCommand.mjs +14 -14
- package/esm2022/src/commands/ServerToClient/ResultCommand.mjs +37 -0
- package/esm2022/src/commands/ServerToClient/VerifyCommand.mjs +83 -0
- package/esm2022/src/commands/ServerToClient/XMLBasedCommandBuilder.mjs +132 -0
- package/{esm2020 → esm2022}/src/communications/IConnectionStateManager.mjs +1 -1
- package/esm2022/src/communications/InteractiveCommunicationsFailureHandler.mjs +15 -0
- package/{esm2020 → esm2022}/src/data/DataSourceIdKey.mjs +2 -2
- package/esm2022/src/data/DataView.mjs +1613 -0
- package/{esm2020 → esm2022}/src/data/DataViewBase.mjs +3 -3
- package/esm2022/src/data/DataviewManager.mjs +28 -0
- package/esm2022/src/data/DataviewManagerBase.mjs +15 -0
- package/esm2022/src/data/DvCache.mjs +67 -0
- package/esm2022/src/data/Field.mjs +646 -0
- package/esm2022/src/data/FieldBase.mjs +15 -0
- package/esm2022/src/data/FieldsTable.mjs +103 -0
- package/{esm2020 → esm2022}/src/data/IRecordsTable.mjs +1 -1
- package/esm2022/src/data/Key.mjs +88 -0
- package/esm2022/src/data/Record.mjs +866 -0
- package/{esm2020 → esm2022}/src/data/RecordOutOfDataViewException.mjs +15 -15
- package/esm2022/src/data/RecordsTable.mjs +267 -0
- package/esm2022/src/data/TaskTransactionManager.mjs +103 -0
- package/esm2022/src/data/XMLBasedDcValuesBuilder.mjs +74 -0
- package/{esm2020 → esm2022}/src/enums.mjs +23 -23
- package/esm2022/src/env/EnvVariablesTable.mjs +340 -0
- package/esm2022/src/env/Environment.mjs +487 -0
- package/{esm2020 → esm2022}/src/env/ILanguageData.mjs +1 -1
- package/esm2022/src/env/LanguageData.mjs +226 -0
- package/esm2022/src/env/MirrorString.mjs +65 -0
- package/esm2022/src/event/ActionManager.mjs +91 -0
- package/esm2022/src/event/Event.mjs +1333 -0
- package/esm2022/src/event/EventHandler.mjs +766 -0
- package/esm2022/src/event/EventHandlerPosition.mjs +204 -0
- package/esm2022/src/event/EventsManager.mjs +2975 -0
- package/{esm2020 → esm2022}/src/event/IEventsManager.mjs +6 -6
- package/esm2022/src/event/RunTimeEvent.mjs +392 -0
- package/{esm2020 → esm2022}/src/event/RunTimeEventBase.mjs +3 -3
- package/esm2022/src/event/UserEventsTable.mjs +47 -0
- package/esm2022/src/exp/ExpTable.mjs +57 -0
- package/esm2022/src/exp/Expression.mjs +200 -0
- package/esm2022/src/exp/ExpressionDict.mjs +727 -0
- package/esm2022/src/exp/ExpressionEvaluator.mjs +4206 -0
- package/esm2022/src/exp/ExpressionLocalJpn.mjs +314 -0
- package/esm2022/src/exp/GlobalParamsTable.mjs +85 -0
- package/esm2022/src/exp/YesNoExp.mjs +36 -0
- package/esm2022/src/gui/CreatedFormVector.mjs +23 -0
- package/esm2022/src/gui/FormsTable.mjs +66 -0
- package/esm2022/src/gui/MgControl.mjs +363 -0
- package/esm2022/src/gui/MgForm.mjs +1181 -0
- package/esm2022/src/http/HttpManager.mjs +97 -0
- package/esm2022/src/http/client/HttpClientAsync.mjs +68 -0
- package/esm2022/src/http/client/HttpClientBase.mjs +132 -0
- package/esm2022/src/http/client/HttpClientEvents.mjs +39 -0
- package/esm2022/src/http/client/HttpClientSync.mjs +42 -0
- package/esm2022/src/http/client/HttpUtility.mjs +84 -0
- package/{esm2020 → esm2022}/src/http/client/ICommunicationsFailureHandler.mjs +1 -1
- package/esm2022/src/remote/AddUserLocateRemoteDataViewCommand.mjs +18 -0
- package/esm2022/src/remote/AddUserRangeRemoteDataViewCommand.mjs +18 -0
- package/esm2022/src/remote/AddUserSortRemoteDataViewCommand.mjs +18 -0
- package/esm2022/src/remote/RemoteCommandsProcessor.mjs +882 -0
- package/esm2022/src/remote/RemoteControlItemsRefreshCommand.mjs +25 -0
- package/esm2022/src/remote/RemoteDataViewCommandBase.mjs +24 -0
- package/esm2022/src/remote/RemoteDataViewCommandFactory.mjs +61 -0
- package/{esm2020 → esm2022}/src/remote/RemoteDataViewCommandUpdateNonModifiable.mjs +15 -15
- package/{esm2020 → esm2022}/src/remote/RemoteDataviewManager.mjs +17 -17
- package/{esm2020 → esm2022}/src/remote/RemoteInitDataViewCommand.mjs +10 -10
- package/esm2022/src/remote/ResetUserLocateRemoteDataviewCommand.mjs +17 -0
- package/{esm2020 → esm2022}/src/remote/ResetUserRangeRemoteDataviewCommand.mjs +12 -12
- package/esm2022/src/remote/ResetUserSortRemoteDataviewCommand.mjs +16 -0
- package/esm2022/src/remote/ServerError.mjs +40 -0
- package/esm2022/src/remote/SetTransactionStateRemoteDataViewCommand.mjs +20 -0
- package/esm2022/src/rt/Argument.mjs +265 -0
- package/esm2022/src/rt/ArgumentsList.mjs +103 -0
- package/esm2022/src/rt/Boundary.mjs +152 -0
- package/esm2022/src/rt/CompMainPrgTable.mjs +63 -0
- package/{esm2020 → esm2022}/src/rt/DataviewHeaderBase.mjs +98 -96
- package/{esm2020 → esm2022}/src/rt/DataviewHeaderFactory.mjs +6 -6
- package/esm2022/src/rt/DataviewHeaders.mjs +53 -0
- package/esm2022/src/rt/DataviewHeadersSaxHandler.mjs +38 -0
- package/esm2022/src/rt/ExecutionStack.mjs +94 -0
- package/{esm2020 → esm2022}/src/rt/ExecutionStackEntry.mjs +17 -17
- package/esm2022/src/rt/HandlersTable.mjs +96 -0
- package/{esm2020 → esm2022}/src/rt/IDataSourceViewDefinition.mjs +1 -1
- package/{esm2020 → esm2022}/src/rt/IDataviewHeader.mjs +1 -1
- package/{esm2020 → esm2022}/src/rt/IResultValue.mjs +1 -1
- package/esm2022/src/rt/LastFocusedManager.mjs +65 -0
- package/esm2022/src/rt/Operation.mjs +735 -0
- package/esm2022/src/rt/OperationTable.mjs +67 -0
- package/esm2022/src/rt/Recompute.mjs +355 -0
- package/esm2022/src/rt/RecomputeTable.mjs +63 -0
- package/esm2022/src/rt/RemoteDataviewHeader.mjs +108 -0
- package/esm2022/src/rt/ResultValue.mjs +10 -0
- package/esm2022/src/rt/TableCache.mjs +177 -0
- package/esm2022/src/rt/TableCacheManager.mjs +67 -0
- package/esm2022/src/rt/Transaction.mjs +53 -0
- package/esm2022/src/security/UserDetails.mjs +71 -0
- package/{esm2020 → esm2022}/src/tasks/IMGDataCollection.mjs +1 -1
- package/esm2022/src/tasks/MGData.mjs +552 -0
- package/esm2022/src/tasks/MGDataCollection.mjs +252 -0
- package/esm2022/src/tasks/RCTimer.mjs +63 -0
- package/esm2022/src/tasks/RemoteTaskService.mjs +45 -0
- package/esm2022/src/tasks/Task.mjs +2497 -0
- package/esm2022/src/tasks/TaskBase.mjs +83 -0
- package/esm2022/src/tasks/TaskServiceBase.mjs +25 -0
- package/esm2022/src/tasks/TasksTable.mjs +80 -0
- package/esm2022/src/tasks/sort/Sort.mjs +5 -0
- package/esm2022/src/tasks/sort/SortCollection.mjs +67 -0
- package/esm2022/src/util/ConstUtils.mjs +14 -0
- package/esm2022/src/util/FlowMonitorQueue.mjs +451 -0
- package/esm2022/src/util/HeapSort.mjs +70 -0
- package/{esm2020 → esm2022}/src/util/IMirrorXML.mjs +1 -1
- package/{esm2020 → esm2022}/src/util/IServerConfig.mjs +1 -1
- package/{esm2020 → esm2022}/src/util/MgBlockingQueue.mjs +1 -1
- package/esm2022/src/util/MgPriorityBlockingQueue.mjs +74 -0
- package/esm2022/src/util/MgPriorityQueue.mjs +66 -0
- package/{esm2020 → esm2022}/src/util/ParamParseResult.mjs +7 -7
- package/esm2022/src/util/PrmMap.mjs +152 -0
- package/esm2022/src/util/ReturnResult.mjs +46 -0
- package/esm2022/src/util/ReturnResultBase.mjs +18 -0
- package/esm2022/src/util/Scrambler.mjs +89 -0
- package/esm2022/src/util/UniqueIDUtils.mjs +13 -0
- package/esm2022/src/util/cookie.service.mjs +92 -0
- package/{fesm2020 → fesm2022}/magic-xpa-engine.mjs +29713 -29693
- package/fesm2022/magic-xpa-engine.mjs.map +1 -0
- package/index.d.ts +187 -187
- package/package.json +8 -14
- package/src/AccessHelper.d.ts +20 -20
- package/src/ClientManager.d.ts +32 -32
- package/src/CommandsProcessorBase.d.ts +23 -23
- package/src/CommandsProcessorManager.d.ts +6 -6
- package/src/CommandsTable.d.ts +22 -22
- package/src/ConstInterface.d.ts +515 -515
- package/src/CurrentClientVersion.d.ts +1 -1
- package/src/FlowMonitorInterface.d.ts +15 -15
- package/src/GUIManager.d.ts +17 -17
- package/src/GlobalCommandsManager.d.ts +17 -17
- package/src/GuiEventsProcessor.d.ts +24 -24
- package/src/ICommandsTable.d.ts +9 -9
- package/src/ServerConfig.d.ts +34 -34
- package/src/bridge/IGuiEvent.d.ts +19 -19
- package/src/bridge/MagicBridge.d.ts +16 -16
- package/src/commands/ClientOriginatedCommandTaskTag.d.ts +8 -8
- package/src/commands/ClientToServer/AddUserLocateDataViewCommand.d.ts +4 -4
- package/src/commands/ClientToServer/AddUserRangeDataviewCommand.d.ts +6 -6
- package/src/commands/ClientToServer/AddUserSortDataViewCommand.d.ts +6 -6
- package/src/commands/ClientToServer/BrowserEscEventCommand.d.ts +8 -8
- package/src/commands/ClientToServer/ClientOriginatedCommand.d.ts +8 -8
- package/src/commands/ClientToServer/ClientOriginatedCommandSerializer.d.ts +6 -6
- package/src/commands/ClientToServer/ColumnSortEventCommand.d.ts +10 -10
- package/src/commands/ClientToServer/CommandFactory.d.ts +64 -64
- package/src/commands/ClientToServer/CommandSerializationHelper.d.ts +20 -20
- package/src/commands/ClientToServer/ComputeEventCommand.d.ts +8 -8
- package/src/commands/ClientToServer/ContextTerminationEventCommand.d.ts +7 -7
- package/src/commands/ClientToServer/ContextTimeoutResetCommand.d.ts +7 -7
- package/src/commands/ClientToServer/ControlItemsRefreshCommand.d.ts +6 -6
- package/src/commands/ClientToServer/DataViewOutputCommand.d.ts +9 -9
- package/src/commands/ClientToServer/DataviewCommand.d.ts +32 -32
- package/src/commands/ClientToServer/EvaluateCommand.d.ts +15 -15
- package/src/commands/ClientToServer/EventCommand.d.ts +15 -15
- package/src/commands/ClientToServer/ExecOperCommand.d.ts +23 -23
- package/src/commands/ClientToServer/FetchDataControlValuesEventCommand.d.ts +8 -8
- package/src/commands/ClientToServer/GlobalParamsQueryCommand.d.ts +5 -5
- package/src/commands/ClientToServer/ICommandTaskTag.d.ts +3 -3
- package/src/commands/ClientToServer/IndexChangeEventCommand.d.ts +8 -8
- package/src/commands/ClientToServer/IniputForceWriteCommand.d.ts +10 -10
- package/src/commands/ClientToServer/NonReversibleExitEventCommand.d.ts +8 -8
- package/src/commands/ClientToServer/QueryCommand.d.ts +8 -8
- package/src/commands/ClientToServer/RecomputeCommand.d.ts +11 -11
- package/src/commands/ClientToServer/RefreshEventCommand.d.ts +12 -12
- package/src/commands/ClientToServer/RefreshScreenEventCommand.d.ts +10 -10
- package/src/commands/ClientToServer/RollbackEventCommand.d.ts +14 -14
- package/src/commands/ClientToServer/SelectProgramCommand.d.ts +6 -6
- package/src/commands/ClientToServer/SetTransactionStateDataviewCommand.d.ts +5 -5
- package/src/commands/ClientToServer/SubformOpenEventCommand.d.ts +8 -8
- package/src/commands/ClientToServer/SubformRefreshEventCommand.d.ts +9 -9
- package/src/commands/ClientToServer/TransactionCommand.d.ts +12 -12
- package/src/commands/ClientToServer/UnloadCommand.d.ts +7 -7
- package/src/commands/ClientToServer/WriteMessageToServerLogCommand.d.ts +6 -6
- package/src/commands/DataViewCommandBase.d.ts +6 -6
- package/src/commands/IClientCommand.d.ts +2 -2
- package/src/commands/IClientTargetedCommand.d.ts +12 -12
- package/src/commands/IClientToServerCommandInfo.d.ts +3 -3
- package/src/commands/ServerToClient/AbortCommand.d.ts +11 -11
- package/src/commands/ServerToClient/AddLocateCommand.d.ts +6 -6
- package/src/commands/ServerToClient/AddRangeCommand.d.ts +10 -10
- package/src/commands/ServerToClient/AddSortCommand.d.ts +9 -9
- package/src/commands/ServerToClient/ClientRefreshCommand.d.ts +7 -7
- package/src/commands/ServerToClient/ClientTargetedCommandBase.d.ts +12 -12
- package/src/commands/ServerToClient/EnhancedVerifyCommand.d.ts +13 -13
- package/src/commands/ServerToClient/OpenURLCommand.d.ts +21 -21
- package/src/commands/ServerToClient/ResetLocateCommand.d.ts +6 -6
- package/src/commands/ServerToClient/ResetRangeCommand.d.ts +6 -6
- package/src/commands/ServerToClient/ResetSortCommand.d.ts +6 -6
- package/src/commands/ServerToClient/ResultCommand.d.ts +10 -10
- package/src/commands/ServerToClient/VerifyCommand.d.ts +17 -17
- package/src/commands/ServerToClient/XMLBasedCommandBuilder.d.ts +11 -11
- package/src/communications/IConnectionStateManager.d.ts +4 -4
- package/src/communications/InteractiveCommunicationsFailureHandler.d.ts +6 -6
- package/src/data/DataSourceIdKey.d.ts +2 -2
- package/src/data/DataView.d.ts +162 -162
- package/src/data/DataViewBase.d.ts +12 -12
- package/src/data/DataviewManager.d.ts +14 -14
- package/src/data/DataviewManagerBase.d.ts +11 -11
- package/src/data/DvCache.d.ts +15 -15
- package/src/data/Field.d.ts +103 -103
- package/src/data/FieldBase.d.ts +23 -23
- package/src/data/FieldsTable.d.ts +27 -27
- package/src/data/IRecordsTable.d.ts +7 -7
- package/src/data/Key.d.ts +15 -15
- package/src/data/Record.d.ts +156 -156
- package/src/data/RecordOutOfDataViewException.d.ts +10 -10
- package/src/data/RecordsTable.d.ts +38 -38
- package/src/data/TaskTransactionManager.d.ts +17 -17
- package/src/data/XMLBasedDcValuesBuilder.d.ts +11 -11
- package/src/enums.d.ts +21 -21
- package/src/env/EnvVariablesTable.d.ts +17 -17
- package/src/env/Environment.d.ts +118 -118
- package/src/env/ILanguageData.d.ts +3 -3
- package/src/env/LanguageData.d.ts +20 -20
- package/src/env/MirrorString.d.ts +15 -15
- package/src/event/ActionManager.d.ts +14 -14
- package/src/event/Event.d.ts +79 -79
- package/src/event/EventHandler.d.ts +66 -66
- package/src/event/EventHandlerPosition.d.ts +25 -25
- package/src/event/EventsManager.d.ts +204 -204
- package/src/event/IEventsManager.d.ts +77 -77
- package/src/event/RunTimeEvent.d.ts +123 -123
- package/src/event/RunTimeEventBase.d.ts +5 -5
- package/src/event/UserEventsTable.d.ts +11 -11
- package/src/exp/ExpTable.d.ts +11 -11
- package/src/exp/Expression.d.ts +37 -37
- package/src/exp/ExpressionDict.d.ts +12 -12
- package/src/exp/ExpressionEvaluator.d.ts +198 -198
- package/src/exp/ExpressionLocalJpn.d.ts +18 -18
- package/src/exp/GlobalParamsTable.d.ts +19 -19
- package/src/exp/YesNoExp.d.ts +9 -9
- package/src/gui/CreatedFormVector.d.ts +10 -10
- package/src/gui/FormsTable.d.ts +15 -15
- package/src/gui/MgControl.d.ts +60 -60
- package/src/gui/MgForm.d.ts +93 -93
- package/src/http/HttpManager.d.ts +25 -25
- package/src/http/client/HttpClientAsync.d.ts +16 -16
- package/src/http/client/HttpClientBase.d.ts +30 -30
- package/src/http/client/HttpClientEvents.d.ts +18 -18
- package/src/http/client/HttpClientSync.d.ts +17 -17
- package/src/http/client/HttpUtility.d.ts +10 -10
- package/src/http/client/ICommunicationsFailureHandler.d.ts +5 -5
- package/src/remote/AddUserLocateRemoteDataViewCommand.d.ts +8 -8
- package/src/remote/AddUserRangeRemoteDataViewCommand.d.ts +8 -8
- package/src/remote/AddUserSortRemoteDataViewCommand.d.ts +8 -8
- package/src/remote/RemoteCommandsProcessor.d.ts +51 -51
- package/src/remote/RemoteControlItemsRefreshCommand.d.ts +8 -8
- package/src/remote/RemoteDataViewCommandBase.d.ts +10 -10
- package/src/remote/RemoteDataViewCommandFactory.d.ts +6 -6
- package/src/remote/RemoteDataViewCommandUpdateNonModifiable.d.ts +8 -8
- package/src/remote/RemoteDataviewManager.d.ts +9 -9
- package/src/remote/RemoteInitDataViewCommand.d.ts +7 -7
- package/src/remote/ResetUserLocateRemoteDataviewCommand.d.ts +7 -7
- package/src/remote/ResetUserRangeRemoteDataviewCommand.d.ts +7 -7
- package/src/remote/ResetUserSortRemoteDataviewCommand.d.ts +7 -7
- package/src/remote/ServerError.d.ts +16 -16
- package/src/remote/SetTransactionStateRemoteDataViewCommand.d.ts +8 -8
- package/src/rt/Argument.d.ts +36 -36
- package/src/rt/ArgumentsList.d.ts +24 -24
- package/src/rt/Boundary.d.ts +27 -27
- package/src/rt/CompMainPrgTable.d.ts +10 -10
- package/src/rt/DataviewHeaderBase.d.ts +34 -34
- package/src/rt/DataviewHeaderFactory.d.ts +5 -5
- package/src/rt/DataviewHeaders.d.ts +12 -12
- package/src/rt/DataviewHeadersSaxHandler.d.ts +10 -10
- package/src/rt/ExecutionStack.d.ts +22 -22
- package/src/rt/ExecutionStackEntry.d.ts +7 -7
- package/src/rt/HandlersTable.d.ts +19 -19
- package/src/rt/IDataSourceViewDefinition.d.ts +6 -6
- package/src/rt/IDataviewHeader.d.ts +10 -10
- package/src/rt/IResultValue.d.ts +4 -4
- package/src/rt/LastFocusedManager.d.ts +23 -23
- package/src/rt/Operation.d.ts +97 -97
- package/src/rt/OperationTable.d.ts +15 -15
- package/src/rt/Recompute.d.ts +41 -41
- package/src/rt/RecomputeTable.d.ts +9 -9
- package/src/rt/RemoteDataviewHeader.d.ts +14 -14
- package/src/rt/ResultValue.d.ts +7 -7
- package/src/rt/TableCache.d.ts +29 -29
- package/src/rt/TableCacheManager.d.ts +10 -10
- package/src/rt/Transaction.d.ts +23 -23
- package/src/security/UserDetails.d.ts +16 -16
- package/src/tasks/IMGDataCollection.d.ts +26 -26
- package/src/tasks/MGData.d.ts +63 -63
- package/src/tasks/MGDataCollection.d.ts +42 -42
- package/src/tasks/RCTimer.d.ts +13 -13
- package/src/tasks/RemoteTaskService.d.ts +16 -16
- package/src/tasks/Task.d.ts +312 -312
- package/src/tasks/TaskBase.d.ts +123 -123
- package/src/tasks/TaskServiceBase.d.ts +16 -16
- package/src/tasks/TasksTable.d.ts +21 -21
- package/src/tasks/sort/Sort.d.ts +4 -4
- package/src/tasks/sort/SortCollection.d.ts +11 -11
- package/src/util/ConstUtils.d.ts +3 -3
- package/src/util/FlowMonitorQueue.d.ts +70 -70
- package/src/util/HeapSort.d.ts +6 -6
- package/src/util/IMirrorXML.d.ts +6 -6
- package/src/util/IServerConfig.d.ts +11 -11
- package/src/util/MgBlockingQueue.d.ts +5 -5
- package/src/util/MgPriorityBlockingQueue.d.ts +17 -17
- package/src/util/MgPriorityQueue.d.ts +13 -13
- package/src/util/ParamParseResult.d.ts +6 -6
- package/src/util/PrmMap.d.ts +28 -28
- package/src/util/ReturnResult.d.ts +18 -18
- package/src/util/ReturnResultBase.d.ts +11 -11
- package/src/util/Scrambler.d.ts +10 -10
- package/src/util/UniqueIDUtils.d.ts +4 -4
- package/src/util/cookie.service.d.ts +8 -8
- package/esm2020/src/AccessHelper.mjs +0 -9
- package/esm2020/src/ClientManager.mjs +0 -399
- package/esm2020/src/CommandsProcessorBase.mjs +0 -58
- package/esm2020/src/CommandsProcessorManager.mjs +0 -26
- package/esm2020/src/CommandsTable.mjs +0 -162
- package/esm2020/src/ConstInterface.mjs +0 -516
- package/esm2020/src/FlowMonitorInterface.mjs +0 -16
- package/esm2020/src/GUIManager.mjs +0 -62
- package/esm2020/src/GlobalCommandsManager.mjs +0 -34
- package/esm2020/src/GuiEventsProcessor.mjs +0 -154
- package/esm2020/src/ServerConfig.mjs +0 -117
- package/esm2020/src/commands/ClientOriginatedCommandTaskTag.mjs +0 -11
- package/esm2020/src/commands/ClientToServer/ClientOriginatedCommandSerializer.mjs +0 -60
- package/esm2020/src/commands/ClientToServer/CommandFactory.mjs +0 -260
- package/esm2020/src/commands/ClientToServer/CommandSerializationHelper.mjs +0 -69
- package/esm2020/src/commands/ClientToServer/DataViewOutputCommand.mjs +0 -13
- package/esm2020/src/commands/ClientToServer/EvaluateCommand.mjs +0 -36
- package/esm2020/src/commands/ClientToServer/EventCommand.mjs +0 -40
- package/esm2020/src/commands/ClientToServer/ExecOperCommand.mjs +0 -67
- package/esm2020/src/commands/ClientToServer/FetchDataControlValuesEventCommand.mjs +0 -22
- package/esm2020/src/commands/ClientToServer/IniputForceWriteCommand.mjs +0 -23
- package/esm2020/src/commands/ClientToServer/RecomputeCommand.mjs +0 -27
- package/esm2020/src/commands/ClientToServer/RefreshEventCommand.mjs +0 -27
- package/esm2020/src/commands/ClientToServer/RefreshScreenEventCommand.mjs +0 -24
- package/esm2020/src/commands/ClientToServer/RollbackEventCommand.mjs +0 -39
- package/esm2020/src/commands/ClientToServer/SubformRefreshEventCommand.mjs +0 -24
- package/esm2020/src/commands/ClientToServer/TransactionCommand.mjs +0 -28
- package/esm2020/src/commands/ClientToServer/WriteMessageToServerLogCommand.mjs +0 -18
- package/esm2020/src/commands/DataViewCommandBase.mjs +0 -10
- package/esm2020/src/commands/IClientTargetedCommand.mjs +0 -9
- package/esm2020/src/commands/ServerToClient/AbortCommand.mjs +0 -65
- package/esm2020/src/commands/ServerToClient/AddRangeCommand.mjs +0 -62
- package/esm2020/src/commands/ServerToClient/AddSortCommand.mjs +0 -33
- package/esm2020/src/commands/ServerToClient/ClientRefreshCommand.mjs +0 -25
- package/esm2020/src/commands/ServerToClient/ClientTargetedCommandBase.mjs +0 -27
- package/esm2020/src/commands/ServerToClient/EnhancedVerifyCommand.mjs +0 -45
- package/esm2020/src/commands/ServerToClient/OpenURLCommand.mjs +0 -221
- package/esm2020/src/commands/ServerToClient/ResultCommand.mjs +0 -37
- package/esm2020/src/commands/ServerToClient/VerifyCommand.mjs +0 -83
- package/esm2020/src/commands/ServerToClient/XMLBasedCommandBuilder.mjs +0 -132
- package/esm2020/src/communications/InteractiveCommunicationsFailureHandler.mjs +0 -17
- package/esm2020/src/data/DataView.mjs +0 -1610
- package/esm2020/src/data/DataviewManager.mjs +0 -28
- package/esm2020/src/data/DataviewManagerBase.mjs +0 -15
- package/esm2020/src/data/DvCache.mjs +0 -67
- package/esm2020/src/data/Field.mjs +0 -646
- package/esm2020/src/data/FieldBase.mjs +0 -18
- package/esm2020/src/data/FieldsTable.mjs +0 -103
- package/esm2020/src/data/Key.mjs +0 -88
- package/esm2020/src/data/Record.mjs +0 -846
- package/esm2020/src/data/RecordsTable.mjs +0 -267
- package/esm2020/src/data/TaskTransactionManager.mjs +0 -103
- package/esm2020/src/data/XMLBasedDcValuesBuilder.mjs +0 -74
- package/esm2020/src/env/EnvVariablesTable.mjs +0 -340
- package/esm2020/src/env/Environment.mjs +0 -489
- package/esm2020/src/env/LanguageData.mjs +0 -226
- package/esm2020/src/env/MirrorString.mjs +0 -65
- package/esm2020/src/event/ActionManager.mjs +0 -91
- package/esm2020/src/event/Event.mjs +0 -1333
- package/esm2020/src/event/EventHandler.mjs +0 -766
- package/esm2020/src/event/EventHandlerPosition.mjs +0 -204
- package/esm2020/src/event/EventsManager.mjs +0 -2975
- package/esm2020/src/event/RunTimeEvent.mjs +0 -392
- package/esm2020/src/event/UserEventsTable.mjs +0 -47
- package/esm2020/src/exp/ExpTable.mjs +0 -59
- package/esm2020/src/exp/Expression.mjs +0 -200
- package/esm2020/src/exp/ExpressionDict.mjs +0 -727
- package/esm2020/src/exp/ExpressionEvaluator.mjs +0 -4212
- package/esm2020/src/exp/ExpressionLocalJpn.mjs +0 -314
- package/esm2020/src/exp/GlobalParamsTable.mjs +0 -85
- package/esm2020/src/exp/YesNoExp.mjs +0 -36
- package/esm2020/src/gui/CreatedFormVector.mjs +0 -23
- package/esm2020/src/gui/FormsTable.mjs +0 -66
- package/esm2020/src/gui/MgControl.mjs +0 -353
- package/esm2020/src/gui/MgForm.mjs +0 -1181
- package/esm2020/src/http/HttpManager.mjs +0 -97
- package/esm2020/src/http/client/HttpClientAsync.mjs +0 -67
- package/esm2020/src/http/client/HttpClientBase.mjs +0 -132
- package/esm2020/src/http/client/HttpClientEvents.mjs +0 -39
- package/esm2020/src/http/client/HttpClientSync.mjs +0 -42
- package/esm2020/src/http/client/HttpUtility.mjs +0 -84
- package/esm2020/src/remote/AddUserLocateRemoteDataViewCommand.mjs +0 -18
- package/esm2020/src/remote/AddUserRangeRemoteDataViewCommand.mjs +0 -18
- package/esm2020/src/remote/AddUserSortRemoteDataViewCommand.mjs +0 -18
- package/esm2020/src/remote/RemoteCommandsProcessor.mjs +0 -880
- package/esm2020/src/remote/RemoteControlItemsRefreshCommand.mjs +0 -25
- package/esm2020/src/remote/RemoteDataViewCommandBase.mjs +0 -24
- package/esm2020/src/remote/RemoteDataViewCommandFactory.mjs +0 -61
- package/esm2020/src/remote/ResetUserLocateRemoteDataviewCommand.mjs +0 -17
- package/esm2020/src/remote/ResetUserSortRemoteDataviewCommand.mjs +0 -16
- package/esm2020/src/remote/ServerError.mjs +0 -40
- package/esm2020/src/remote/SetTransactionStateRemoteDataViewCommand.mjs +0 -20
- package/esm2020/src/rt/Argument.mjs +0 -265
- package/esm2020/src/rt/ArgumentsList.mjs +0 -103
- package/esm2020/src/rt/Boundary.mjs +0 -152
- package/esm2020/src/rt/CompMainPrgTable.mjs +0 -65
- package/esm2020/src/rt/DataviewHeaders.mjs +0 -53
- package/esm2020/src/rt/DataviewHeadersSaxHandler.mjs +0 -38
- package/esm2020/src/rt/ExecutionStack.mjs +0 -94
- package/esm2020/src/rt/HandlersTable.mjs +0 -96
- package/esm2020/src/rt/LastFocusedManager.mjs +0 -67
- package/esm2020/src/rt/Operation.mjs +0 -735
- package/esm2020/src/rt/OperationTable.mjs +0 -67
- package/esm2020/src/rt/Recompute.mjs +0 -355
- package/esm2020/src/rt/RecomputeTable.mjs +0 -63
- package/esm2020/src/rt/RemoteDataviewHeader.mjs +0 -108
- package/esm2020/src/rt/ResultValue.mjs +0 -12
- package/esm2020/src/rt/TableCache.mjs +0 -177
- package/esm2020/src/rt/TableCacheManager.mjs +0 -67
- package/esm2020/src/rt/Transaction.mjs +0 -53
- package/esm2020/src/security/UserDetails.mjs +0 -71
- package/esm2020/src/tasks/MGData.mjs +0 -552
- package/esm2020/src/tasks/MGDataCollection.mjs +0 -252
- package/esm2020/src/tasks/RCTimer.mjs +0 -63
- package/esm2020/src/tasks/RemoteTaskService.mjs +0 -45
- package/esm2020/src/tasks/Task.mjs +0 -2495
- package/esm2020/src/tasks/TaskBase.mjs +0 -87
- package/esm2020/src/tasks/TaskServiceBase.mjs +0 -25
- package/esm2020/src/tasks/TasksTable.mjs +0 -80
- package/esm2020/src/tasks/sort/Sort.mjs +0 -7
- package/esm2020/src/tasks/sort/SortCollection.mjs +0 -67
- package/esm2020/src/util/ConstUtils.mjs +0 -14
- package/esm2020/src/util/FlowMonitorQueue.mjs +0 -453
- package/esm2020/src/util/HeapSort.mjs +0 -70
- package/esm2020/src/util/MgPriorityBlockingQueue.mjs +0 -74
- package/esm2020/src/util/MgPriorityQueue.mjs +0 -66
- package/esm2020/src/util/PrmMap.mjs +0 -151
- package/esm2020/src/util/ReturnResult.mjs +0 -46
- package/esm2020/src/util/ReturnResultBase.mjs +0 -18
- package/esm2020/src/util/Scrambler.mjs +0 -89
- package/esm2020/src/util/UniqueIDUtils.mjs +0 -12
- package/esm2020/src/util/cookie.service.mjs +0 -92
- package/fesm2015/magic-xpa-engine.mjs +0 -30835
- package/fesm2015/magic-xpa-engine.mjs.map +0 -1
- package/fesm2020/magic-xpa-engine.mjs.map +0 -1
@@ -0,0 +1,552 @@
|
|
1
|
+
import { HandlersTable } from "../rt/HandlersTable";
|
2
|
+
import { TasksTable } from "./TasksTable";
|
3
|
+
import { CompMainPrgTable } from "../rt/CompMainPrgTable";
|
4
|
+
import { Task } from "./Task";
|
5
|
+
import { Logger, XMLConstants, XmlParser } from "@magic-xpa/utils";
|
6
|
+
import { RecomputeTable } from "../rt/RecomputeTable";
|
7
|
+
import { Debug, NNumber } from "@magic-xpa/mscorelib";
|
8
|
+
import { RuntimeContextBase } from "@magic-xpa/gui";
|
9
|
+
import { GUIManager } from "../GUIManager";
|
10
|
+
import { HttpManager } from "../http/HttpManager";
|
11
|
+
import { FlowMonitorQueue } from "../util/FlowMonitorQueue";
|
12
|
+
import { RunTimeEvent } from "../event/RunTimeEvent";
|
13
|
+
import { ConstInterface } from "../ConstInterface";
|
14
|
+
import { LanguageData } from "../env/LanguageData";
|
15
|
+
import { EnvParamsTable } from "../env/EnvVariablesTable";
|
16
|
+
import { GlobalParams } from "../exp/GlobalParamsTable";
|
17
|
+
import { Environment } from "../env/Environment";
|
18
|
+
import { GlobalCommandsManager } from "../GlobalCommandsManager";
|
19
|
+
import { ServerConfig } from "../ServerConfig";
|
20
|
+
import { AccessHelper } from "../AccessHelper";
|
21
|
+
import { UserDetails } from "../security/UserDetails";
|
22
|
+
import { RemoteCommandsProcessor } from "../remote/RemoteCommandsProcessor";
|
23
|
+
export class MGData {
|
24
|
+
_expHandlers = null;
|
25
|
+
_id = 0;
|
26
|
+
_parent = null;
|
27
|
+
_mprgTab = null;
|
28
|
+
_tasksTab = null;
|
29
|
+
_timerHandlers = null;
|
30
|
+
_timersStarted = false;
|
31
|
+
forceModal = false;
|
32
|
+
CmdsToClient = null;
|
33
|
+
CmdsToServer = null;
|
34
|
+
IsModal = false;
|
35
|
+
IsAborting = false;
|
36
|
+
get ForceModal() {
|
37
|
+
return this.forceModal;
|
38
|
+
}
|
39
|
+
constructor(toClient, toServer, id, parent, isModal, forceModal) {
|
40
|
+
this.CmdsToServer = toClient;
|
41
|
+
this.CmdsToClient = toServer;
|
42
|
+
if (arguments.length === 5)
|
43
|
+
this.constructor_0(id, parent, isModal);
|
44
|
+
else
|
45
|
+
this.constructor_1(id, parent, isModal, forceModal);
|
46
|
+
}
|
47
|
+
constructor_0(id, parent, isModal) {
|
48
|
+
this._timerHandlers = new HandlersTable();
|
49
|
+
this._expHandlers = new HandlersTable();
|
50
|
+
this._mprgTab = new TasksTable();
|
51
|
+
this._tasksTab = new TasksTable();
|
52
|
+
this._id = id;
|
53
|
+
this._parent = parent;
|
54
|
+
if (AccessHelper.eventsManager.getCompMainPrgTab() === null) {
|
55
|
+
let compMainPrgTab = new CompMainPrgTable();
|
56
|
+
AccessHelper.eventsManager.setCompMainPrgTab(compMainPrgTab);
|
57
|
+
}
|
58
|
+
this.IsModal = isModal;
|
59
|
+
}
|
60
|
+
constructor_1(id, parent, isModal, forceModal) {
|
61
|
+
this.constructor_0(id, parent, isModal);
|
62
|
+
this.forceModal = forceModal;
|
63
|
+
}
|
64
|
+
GetId() {
|
65
|
+
return this._id;
|
66
|
+
}
|
67
|
+
AlreadyMovedToFirstControl() {
|
68
|
+
let alreadyMoved = false;
|
69
|
+
let tasksCount = this.getTasksCount();
|
70
|
+
for (let i = 0; i < tasksCount; i = i + 1) {
|
71
|
+
let mgForm = this.getTask(i).getForm();
|
72
|
+
if (mgForm !== null && mgForm.MovedToFirstControl) {
|
73
|
+
alreadyMoved = true;
|
74
|
+
break;
|
75
|
+
}
|
76
|
+
}
|
77
|
+
return alreadyMoved;
|
78
|
+
}
|
79
|
+
StartTimers() {
|
80
|
+
if (this._timerHandlers !== null && !this._timersStarted) {
|
81
|
+
this._timerHandlers.startTimers(this);
|
82
|
+
this._timersStarted = true;
|
83
|
+
}
|
84
|
+
}
|
85
|
+
async fillData(openingTaskDetails, parser) {
|
86
|
+
let canContinue;
|
87
|
+
do {
|
88
|
+
let nextTag = parser.getNextTag();
|
89
|
+
canContinue = await this.initInnerObjects(parser, nextTag, openingTaskDetails);
|
90
|
+
} while (canContinue);
|
91
|
+
Logger.Instance.WriteDevToLog("MGData.FillData(): THE END of the parsing " + parser.getCurrIndex() + " characters");
|
92
|
+
}
|
93
|
+
async initInnerObjects(parser, foundTagName, openingTaskDetails) {
|
94
|
+
if (foundTagName == null)
|
95
|
+
return false;
|
96
|
+
switch (foundTagName) {
|
97
|
+
case XMLConstants.MG_TAG_XML:
|
98
|
+
parser.setCurrIndex(parser.getXMLdata().indexOf(XMLConstants.TAG_CLOSE, parser.getCurrIndex()) + 1);
|
99
|
+
break;
|
100
|
+
case ConstInterface.MG_TAG_DATAVIEW:
|
101
|
+
if (!await this.insertDataView(parser)) {
|
102
|
+
let endContext = parser.getXMLdata().indexOf('/' + ConstInterface.MG_TAG_DATAVIEW, parser.getCurrIndex());
|
103
|
+
parser.setCurrIndex(endContext);
|
104
|
+
parser.setCurrIndex2EndOfTag();
|
105
|
+
}
|
106
|
+
break;
|
107
|
+
case ConstInterface.MG_TAG_COMPLETE_DV:
|
108
|
+
{
|
109
|
+
let task = null;
|
110
|
+
let endContext = parser.getXMLdata().indexOf(XMLConstants.TAG_CLOSE, parser.getCurrIndex());
|
111
|
+
let index = parser.getXMLdata().indexOf(ConstInterface.MG_TAG_COMPLETE_DV, parser.getCurrIndex()) + ConstInterface.MG_TAG_COMPLETE_DV.length;
|
112
|
+
let tokensVector = XmlParser.getTokens(parser.getXMLdata().substr(index, endContext - index), '"');
|
113
|
+
let attribute = (tokensVector.get_Item(0));
|
114
|
+
let valueStr;
|
115
|
+
if (attribute === XMLConstants.MG_ATTR_TASKID) {
|
116
|
+
valueStr = (tokensVector.get_Item(1));
|
117
|
+
let taskId = valueStr;
|
118
|
+
if (this.getTask(taskId) === null)
|
119
|
+
task = AccessHelper.mgDataTable.GetTaskByID(taskId);
|
120
|
+
else
|
121
|
+
task = this.getTask(taskId);
|
122
|
+
}
|
123
|
+
let start = endContext + 1;
|
124
|
+
endContext = parser.getXMLdata().indexOf(XMLConstants.END_TAG + ConstInterface.MG_TAG_COMPLETE_DV, parser.getCurrIndex());
|
125
|
+
let dataViewContent = parser.getXMLdata().substr(start, endContext - start);
|
126
|
+
task.dataViewContent = dataViewContent;
|
127
|
+
parser.setCurrIndex(endContext);
|
128
|
+
parser.setCurrIndex2EndOfTag();
|
129
|
+
}
|
130
|
+
break;
|
131
|
+
case ConstInterface.MG_TAG_CONTEXT: {
|
132
|
+
let endContext = parser.getXMLdata().indexOf(XMLConstants.TAG_TERM, parser.getCurrIndex());
|
133
|
+
if (endContext !== -1 && endContext < parser.getXMLdata().length) {
|
134
|
+
let tag = parser.getXMLsubstring(endContext);
|
135
|
+
parser.add2CurrIndex(tag.indexOf(ConstInterface.MG_TAG_CONTEXT) + ConstInterface.MG_TAG_CONTEXT.length);
|
136
|
+
parser.setCurrIndex(endContext + XMLConstants.TAG_TERM.length);
|
137
|
+
}
|
138
|
+
break;
|
139
|
+
}
|
140
|
+
case XMLConstants.MG_TAG_RECOMPUTE:
|
141
|
+
let recompTab = new RecomputeTable();
|
142
|
+
recompTab.fillData(parser);
|
143
|
+
break;
|
144
|
+
case ConstInterface.MG_TAG_COMMAND:
|
145
|
+
Logger.Instance.WriteDevToLog("goes to command");
|
146
|
+
this.CmdsToClient.fillData(parser);
|
147
|
+
break;
|
148
|
+
case ConstInterface.MG_TAG_LANGUAGE:
|
149
|
+
Logger.Instance.WriteDevToLog("goes to language data");
|
150
|
+
await LanguageData.Instance.fillData(parser);
|
151
|
+
break;
|
152
|
+
case ConstInterface.MG_TAG_KBDMAP_URL:
|
153
|
+
Logger.Instance.WriteDevToLog("goes to keyBoard");
|
154
|
+
await Environment.Instance.fillFromUrl(foundTagName, parser);
|
155
|
+
break;
|
156
|
+
case ConstInterface.MG_TAG_KBDMAP:
|
157
|
+
break;
|
158
|
+
case ConstInterface.MG_TAG_COMPMAINPRG:
|
159
|
+
Logger.Instance.WriteDevToLog("goes to compmainprg");
|
160
|
+
AccessHelper.eventsManager.getCompMainPrgTab().fillData(parser);
|
161
|
+
break;
|
162
|
+
case ConstInterface.MG_TAG_EVENTS_QUEUE:
|
163
|
+
Logger.Instance.WriteDevToLog("goes to eventsqueue");
|
164
|
+
this.fillEventsQueue(parser);
|
165
|
+
break;
|
166
|
+
case ConstInterface.MG_TAG_TASKURL:
|
167
|
+
await Task.ProcessTaskURL();
|
168
|
+
break;
|
169
|
+
case XMLConstants.MG_TAG_TASK:
|
170
|
+
Logger.Instance.WriteDevToLog("goes to task");
|
171
|
+
let taskCountBefore = this._mprgTab.getSize();
|
172
|
+
await this._mprgTab.fillData(this, openingTaskDetails, parser);
|
173
|
+
if (this._id !== 0) {
|
174
|
+
let taskCountAfter = this._mprgTab.getSize();
|
175
|
+
let mgd0 = AccessHelper.mgDataTable.getMGData(0);
|
176
|
+
for (let taskIndex = taskCountBefore; taskIndex < taskCountAfter; taskIndex++) {
|
177
|
+
let newTask = this._mprgTab.getTask(taskIndex);
|
178
|
+
if (newTask.isMainProg() && mgd0._mprgTab.getTask(newTask.getTaskTag()) == null) {
|
179
|
+
mgd0._mprgTab.addTask(newTask);
|
180
|
+
mgd0.addTask(newTask);
|
181
|
+
}
|
182
|
+
}
|
183
|
+
}
|
184
|
+
break;
|
185
|
+
case ConstInterface.MG_TAG_ENV:
|
186
|
+
Logger.Instance.WriteDevToLog("goes to environment");
|
187
|
+
Environment.Instance.fillData(parser);
|
188
|
+
break;
|
189
|
+
case ConstInterface.MG_TAG_FLWMTR_CONFIG:
|
190
|
+
FlowMonitorQueue.Instance.fillData(parser);
|
191
|
+
break;
|
192
|
+
case XMLConstants.MG_TAG_XML_END:
|
193
|
+
parser.setCurrIndex2EndOfTag();
|
194
|
+
return false;
|
195
|
+
case ConstInterface.MG_TAG_USER_DETAILS:
|
196
|
+
UserDetails.Instance.fillData(parser);
|
197
|
+
break;
|
198
|
+
case ConstInterface.MG_TAG_DBH_REAL_IDXS:
|
199
|
+
parser.SkipXMLElement();
|
200
|
+
break;
|
201
|
+
case ConstInterface.MG_TAG_GLOBALPARAMSCHANGES:
|
202
|
+
Logger.Instance.WriteDevToLog("applying global params changes from the server (Set/GetParams)");
|
203
|
+
GlobalParams.Instance.fillData(parser);
|
204
|
+
break;
|
205
|
+
case ConstInterface.MG_TAG_GLOBALPARAMS:
|
206
|
+
Logger.Instance.WriteDevToLog("processing base64 encoded image of all global params from the server");
|
207
|
+
this.fillGlobalParams(parser);
|
208
|
+
break;
|
209
|
+
case ConstInterface.MG_TAG_ENV_PARAM_URL:
|
210
|
+
Logger.Instance.WriteDevToLog("goes to env params name ");
|
211
|
+
await Environment.Instance.fillFromUrl(foundTagName, parser);
|
212
|
+
break;
|
213
|
+
case ConstInterface.MG_TAG_ENV_PARAM:
|
214
|
+
Logger.Instance.WriteDevToLog("goes to env params name ");
|
215
|
+
EnvParamsTable.Instance.fillData(parser);
|
216
|
+
break;
|
217
|
+
case ConstInterface.MG_TAG_CONTEXT_ID:
|
218
|
+
{
|
219
|
+
let ctxId;
|
220
|
+
let ctxEndIdx;
|
221
|
+
parser.setCurrIndex(parser.getXMLdata().indexOf(XMLConstants.TAG_CLOSE, parser.getCurrIndex()) + 1);
|
222
|
+
ctxEndIdx = parser.getXMLdata().indexOf(XMLConstants.TAG_OPEN, parser.getCurrIndex());
|
223
|
+
ctxId = parser.getXMLsubstring(ctxEndIdx).trim();
|
224
|
+
parser.setCurrIndex(ctxEndIdx);
|
225
|
+
parser.setCurrIndex2EndOfTag();
|
226
|
+
RuntimeContextBase.Instance.ContextID = ctxId;
|
227
|
+
}
|
228
|
+
break;
|
229
|
+
case ConstInterface.MG_TAG_SESSION_ID:
|
230
|
+
let sessionIdEndIdx;
|
231
|
+
parser.setCurrIndex(parser.getXMLdata().indexOf(XMLConstants.TAG_CLOSE, parser.getCurrIndex()) + 1);
|
232
|
+
sessionIdEndIdx = parser.getXMLdata().indexOf(XMLConstants.TAG_OPEN, parser.getCurrIndex());
|
233
|
+
RemoteCommandsProcessor.GetInstance().SessionId = parser.getXMLsubstring(sessionIdEndIdx).trim();
|
234
|
+
parser.setCurrIndex(sessionIdEndIdx);
|
235
|
+
parser.setCurrIndex2EndOfTag();
|
236
|
+
break;
|
237
|
+
case ConstInterface.MG_TAG_HTTP_COMMUNICATION_TIMEOUT:
|
238
|
+
{
|
239
|
+
let httpCommunicationTimeout;
|
240
|
+
let httpCommunicationTimeoutIdx;
|
241
|
+
parser.setCurrIndex(parser.getXMLdata().indexOf(XMLConstants.TAG_CLOSE, parser.getCurrIndex()) + 1);
|
242
|
+
httpCommunicationTimeoutIdx = parser.getXMLdata().indexOf(XMLConstants.TAG_OPEN, parser.getCurrIndex());
|
243
|
+
httpCommunicationTimeout = NNumber.Parse(parser.getXMLsubstring(httpCommunicationTimeoutIdx));
|
244
|
+
parser.setCurrIndex(httpCommunicationTimeoutIdx);
|
245
|
+
parser.setCurrIndex2EndOfTag();
|
246
|
+
HttpManager.GetInstance().HttpCommunicationTimeoutMS = httpCommunicationTimeout * 1000;
|
247
|
+
}
|
248
|
+
break;
|
249
|
+
case ConstInterface.MG_TAG_DATABASE_URL:
|
250
|
+
case ConstInterface.MG_TAG_DATABASES_HEADER:
|
251
|
+
case ConstInterface.MG_TAG_TASKDEFINITION_IDS_URL:
|
252
|
+
case ConstInterface.MG_TAG_DBH_DATA_IDS_URL:
|
253
|
+
case ConstInterface.MG_TAG_DBHS_END:
|
254
|
+
case ConstInterface.MG_TAG_OFFLINE_SNIPPETS_URL:
|
255
|
+
parser.SkipXMLElement();
|
256
|
+
break;
|
257
|
+
case ConstInterface.MG_TAG_DBHS:
|
258
|
+
case ConstInterface.MG_TAG_STARTUP_PROGRAM:
|
259
|
+
parser.ReadContentOfCurrentElement();
|
260
|
+
break;
|
261
|
+
case XMLConstants.MG_TAG_MENUS_OPEN:
|
262
|
+
break;
|
263
|
+
default:
|
264
|
+
Logger.Instance.WriteExceptionToLogWithMsg("There is no such tag name in MGData, add case to MGData.initInnerObjects and case to while of MGData.FillData " + foundTagName);
|
265
|
+
return false;
|
266
|
+
}
|
267
|
+
return true;
|
268
|
+
}
|
269
|
+
async insertDataView(parser) {
|
270
|
+
let task = null;
|
271
|
+
let endContext = parser.getXMLdata().indexOf(XMLConstants.TAG_CLOSE, parser.getCurrIndex());
|
272
|
+
let index = parser.getXMLdata().indexOf(ConstInterface.MG_TAG_DATAVIEW, parser.getCurrIndex()) + ConstInterface.MG_TAG_DATAVIEW.length;
|
273
|
+
let tokensVector = XmlParser.getTokens(parser.getXMLdata().substr(index, endContext - index), '"');
|
274
|
+
let invalidate = false;
|
275
|
+
for (let i = 0; i < tokensVector.length; i = i + 2) {
|
276
|
+
let attribute = tokensVector.get_Item(i);
|
277
|
+
if (attribute === XMLConstants.MG_ATTR_TASKID) {
|
278
|
+
let valueStr = tokensVector.get_Item(i + 1);
|
279
|
+
let taskId = valueStr;
|
280
|
+
task = (this.getTask(taskId) || AccessHelper.mgDataTable.GetTaskByID(taskId));
|
281
|
+
}
|
282
|
+
if (attribute === ConstInterface.MG_ATTR_INVALIDATE) {
|
283
|
+
let valueStr = tokensVector.get_Item(i + 1);
|
284
|
+
invalidate = XmlParser.getBoolean(valueStr);
|
285
|
+
break;
|
286
|
+
}
|
287
|
+
}
|
288
|
+
let result;
|
289
|
+
if (task !== null) {
|
290
|
+
await task.insertRecordTable(invalidate, parser);
|
291
|
+
result = true;
|
292
|
+
}
|
293
|
+
else {
|
294
|
+
result = false;
|
295
|
+
}
|
296
|
+
return result;
|
297
|
+
}
|
298
|
+
addTask(newTask) {
|
299
|
+
this._tasksTab.addTask(newTask);
|
300
|
+
}
|
301
|
+
removeTask(task) {
|
302
|
+
this._tasksTab.removeTask(task);
|
303
|
+
this._mprgTab.removeTask(task);
|
304
|
+
}
|
305
|
+
getTasksCount() {
|
306
|
+
let result;
|
307
|
+
if (this._tasksTab !== null) {
|
308
|
+
result = this._tasksTab.getSize();
|
309
|
+
}
|
310
|
+
else {
|
311
|
+
result = 0;
|
312
|
+
}
|
313
|
+
return result;
|
314
|
+
}
|
315
|
+
getTask(taskIdOrIdx) {
|
316
|
+
if (arguments.length === 1 && (taskIdOrIdx === null || typeof taskIdOrIdx === "undefined" || taskIdOrIdx.constructor === String)) {
|
317
|
+
return this.getTask_0(taskIdOrIdx);
|
318
|
+
}
|
319
|
+
return this.getTask_1(taskIdOrIdx);
|
320
|
+
}
|
321
|
+
getTask_0(taskId) {
|
322
|
+
let result;
|
323
|
+
if (this._tasksTab !== null && typeof this._tasksTab !== "undefined") {
|
324
|
+
result = this._tasksTab.getTask(taskId);
|
325
|
+
}
|
326
|
+
else {
|
327
|
+
result = null;
|
328
|
+
}
|
329
|
+
return result;
|
330
|
+
}
|
331
|
+
getTask_1(idx) {
|
332
|
+
return this._tasksTab.getTask(idx);
|
333
|
+
}
|
334
|
+
async buildXML(message, serializeTasks) {
|
335
|
+
if (this.CmdsToServer !== null) {
|
336
|
+
this.CmdsToServer.buildXML(message);
|
337
|
+
}
|
338
|
+
if (serializeTasks && this._tasksTab !== null) {
|
339
|
+
await this._tasksTab.buildXML(message);
|
340
|
+
}
|
341
|
+
}
|
342
|
+
getFirstTask() {
|
343
|
+
let task = null;
|
344
|
+
let MDIFrameTask = null;
|
345
|
+
for (let i = 0; i < this._tasksTab.getSize(); i = i + 1) {
|
346
|
+
task = this._tasksTab.getTask(i);
|
347
|
+
if (!task.isMainProg()) {
|
348
|
+
break;
|
349
|
+
}
|
350
|
+
task = null;
|
351
|
+
}
|
352
|
+
if (task === null && this._id === 0) {
|
353
|
+
task = MDIFrameTask;
|
354
|
+
}
|
355
|
+
return task;
|
356
|
+
}
|
357
|
+
getMainProg(ctlIdx) {
|
358
|
+
for (let i = 0; i < this._mprgTab.getSize(); i = i + 1) {
|
359
|
+
let task = this._mprgTab.getTask(i);
|
360
|
+
if (task.getCtlIdx() === ctlIdx && task.isMainProg()) {
|
361
|
+
return task;
|
362
|
+
}
|
363
|
+
}
|
364
|
+
return null;
|
365
|
+
}
|
366
|
+
getNextMainProg(ctlIdx) {
|
367
|
+
let compMainPrgTab = AccessHelper.eventsManager.getCompMainPrgTab();
|
368
|
+
let currSearchIndex = compMainPrgTab.getIndexOf(ctlIdx);
|
369
|
+
let nextCtlIdx = compMainPrgTab.getCtlIdx(currSearchIndex + 1);
|
370
|
+
let result;
|
371
|
+
if (nextCtlIdx === -1) {
|
372
|
+
result = null;
|
373
|
+
}
|
374
|
+
else {
|
375
|
+
result = this.getMainProg(nextCtlIdx);
|
376
|
+
}
|
377
|
+
return result;
|
378
|
+
}
|
379
|
+
clientTransactionCacheExists() {
|
380
|
+
let task;
|
381
|
+
for (let i = 0; i < this._tasksTab.getSize(); i = i + 1) {
|
382
|
+
task = this._tasksTab.getTask(i);
|
383
|
+
if (!task.isMainProg() && task.DataView.modifiedRecordsNumber() > 0) {
|
384
|
+
return true;
|
385
|
+
}
|
386
|
+
}
|
387
|
+
return false;
|
388
|
+
}
|
389
|
+
serverTransactionCacheExists() {
|
390
|
+
let task;
|
391
|
+
for (let i = 0; i < this._tasksTab.getSize(); i = i + 1) {
|
392
|
+
task = this._tasksTab.getTask(i);
|
393
|
+
if (!task.isMainProg() && !task.DataView.ServerTransactionCacheEmpty) {
|
394
|
+
return true;
|
395
|
+
}
|
396
|
+
}
|
397
|
+
return false;
|
398
|
+
}
|
399
|
+
getTaskByTaskDefinitionID(taskDefinitionID) {
|
400
|
+
let task;
|
401
|
+
for (let i = 0; i < this._tasksTab.getSize(); i = i + 1) {
|
402
|
+
task = this._tasksTab.getTask(i);
|
403
|
+
if (task.TaskDefinitionId.Equals(taskDefinitionID)) {
|
404
|
+
return task;
|
405
|
+
}
|
406
|
+
}
|
407
|
+
return null;
|
408
|
+
}
|
409
|
+
getTimerHandlers() {
|
410
|
+
return this._timerHandlers;
|
411
|
+
}
|
412
|
+
addTimerHandler(handler) {
|
413
|
+
this._timerHandlers.add(handler);
|
414
|
+
}
|
415
|
+
removeTimerHandler(task) {
|
416
|
+
for (let i = 0; i < this._timerHandlers.getSize();) {
|
417
|
+
let timerTask = this._timerHandlers.getHandler(i).getTask();
|
418
|
+
if (timerTask.isDescendentOf(task) && timerTask.getMGData() === this)
|
419
|
+
this._timerHandlers.remove(i);
|
420
|
+
else
|
421
|
+
i++;
|
422
|
+
}
|
423
|
+
}
|
424
|
+
removeExpressionHandler(task) {
|
425
|
+
for (let i = 0; i < this._expHandlers.getSize();) {
|
426
|
+
let timerTask = this._expHandlers.getHandler(i).getTask();
|
427
|
+
if (timerTask.isDescendentOf(task) && timerTask.getMGData() === this)
|
428
|
+
this._expHandlers.remove(i);
|
429
|
+
else
|
430
|
+
i++;
|
431
|
+
}
|
432
|
+
}
|
433
|
+
getExpHandlers() {
|
434
|
+
return this._expHandlers;
|
435
|
+
}
|
436
|
+
addExpHandler(handler, idx) {
|
437
|
+
this._expHandlers.insertAfter(handler, idx);
|
438
|
+
}
|
439
|
+
changeTimers(oldTimers, newTimers) {
|
440
|
+
let i = 0;
|
441
|
+
let j = 0;
|
442
|
+
let guiManager = GUIManager.Instance;
|
443
|
+
oldTimers.sort();
|
444
|
+
newTimers.sort();
|
445
|
+
while (i < oldTimers.length && j < newTimers.length) {
|
446
|
+
if (oldTimers.get_Item(i) > newTimers.get_Item(j)) {
|
447
|
+
guiManager.startTimer(this, newTimers.get_Item(j), false);
|
448
|
+
j = j + 1;
|
449
|
+
}
|
450
|
+
else {
|
451
|
+
if (oldTimers.get_Item(i) < newTimers.get_Item(j)) {
|
452
|
+
guiManager.stopTimer(this, oldTimers.get_Item(i), false);
|
453
|
+
i = i + 1;
|
454
|
+
}
|
455
|
+
else {
|
456
|
+
i = i + 1;
|
457
|
+
j = j + 1;
|
458
|
+
}
|
459
|
+
}
|
460
|
+
}
|
461
|
+
while (i < oldTimers.length) {
|
462
|
+
guiManager.stopTimer(this, oldTimers.get_Item(i), false);
|
463
|
+
i = i + 1;
|
464
|
+
}
|
465
|
+
while (j < newTimers.length) {
|
466
|
+
guiManager.startTimer(this, newTimers.get_Item(j), false);
|
467
|
+
j = j + 1;
|
468
|
+
}
|
469
|
+
}
|
470
|
+
fillEventsQueue(parser) {
|
471
|
+
while (this.initEvents(parser, parser.getNextTag())) {
|
472
|
+
}
|
473
|
+
}
|
474
|
+
initEvents(parser, foundTagName) {
|
475
|
+
let result;
|
476
|
+
if (foundTagName === null) {
|
477
|
+
result = false;
|
478
|
+
}
|
479
|
+
else {
|
480
|
+
if (foundTagName === ConstInterface.MG_TAG_EVENT) {
|
481
|
+
let evt = new RunTimeEvent(null);
|
482
|
+
evt.fillData(parser, null);
|
483
|
+
evt.convertParamsToArgs();
|
484
|
+
evt.setTask(null);
|
485
|
+
evt.setFromServer();
|
486
|
+
AccessHelper.eventsManager.addToTail(evt);
|
487
|
+
}
|
488
|
+
else {
|
489
|
+
if (foundTagName === ConstInterface.MG_TAG_EVENTS_QUEUE) {
|
490
|
+
parser.setCurrIndex(parser.getXMLdata().indexOf(">", parser.getCurrIndex()) + 1);
|
491
|
+
}
|
492
|
+
else {
|
493
|
+
if (foundTagName === "/" + ConstInterface.MG_TAG_EVENTS_QUEUE) {
|
494
|
+
parser.setCurrIndex2EndOfTag();
|
495
|
+
result = false;
|
496
|
+
return result;
|
497
|
+
}
|
498
|
+
Logger.Instance.WriteExceptionToLogWithMsg("There is no such tag in EventsQueue: " + foundTagName);
|
499
|
+
result = false;
|
500
|
+
return result;
|
501
|
+
}
|
502
|
+
}
|
503
|
+
result = true;
|
504
|
+
}
|
505
|
+
return result;
|
506
|
+
}
|
507
|
+
isMainWindow() {
|
508
|
+
return this._parent === null;
|
509
|
+
}
|
510
|
+
getParentMGdata() {
|
511
|
+
return this._parent;
|
512
|
+
}
|
513
|
+
abort() {
|
514
|
+
this.IsAborting = true;
|
515
|
+
}
|
516
|
+
copyUnframedCmds() {
|
517
|
+
let unframedCmds = GlobalCommandsManager.Instance.getUnframedCmds();
|
518
|
+
for (let i = 0; i < unframedCmds.length; i = i + 1) {
|
519
|
+
this.CmdsToClient.Add(unframedCmds.get_Item(i));
|
520
|
+
}
|
521
|
+
unframedCmds.SetSize(0);
|
522
|
+
}
|
523
|
+
getValidAncestor() {
|
524
|
+
return this._parent;
|
525
|
+
}
|
526
|
+
getMaxCtlIdx() {
|
527
|
+
let rc = 0;
|
528
|
+
for (let i = 0; i < this._tasksTab.getSize(); i = i + 1) {
|
529
|
+
let task = this._tasksTab.getTask(i);
|
530
|
+
if (task !== null) {
|
531
|
+
rc = Math.max(rc, task.getCtlIdx());
|
532
|
+
}
|
533
|
+
}
|
534
|
+
return rc;
|
535
|
+
}
|
536
|
+
fillGlobalParams(parser) {
|
537
|
+
let XMLdata = parser.getXMLdata();
|
538
|
+
let endContext = parser.getXMLdata().indexOf(XMLConstants.TAG_TERM, parser.getCurrIndex());
|
539
|
+
if (endContext !== -1 && endContext < XMLdata.length) {
|
540
|
+
let tag = parser.getXMLsubstring(endContext);
|
541
|
+
parser.add2CurrIndex(tag.indexOf(ConstInterface.MG_TAG_GLOBALPARAMS) + ConstInterface.MG_TAG_GLOBALPARAMS.length);
|
542
|
+
let tokens = XmlParser.getTokens(RuntimeContextBase.Instance.Parser.getXMLsubstring(endContext), XMLConstants.XML_ATTR_DELIM);
|
543
|
+
Debug.Assert(tokens.get_Item(0) === XMLConstants.MG_ATTR_VALUE);
|
544
|
+
ServerConfig.Instance.setGlobalParams(tokens.get_Item(1));
|
545
|
+
endContext = XMLdata.indexOf(XMLConstants.TAG_OPEN, endContext);
|
546
|
+
if (endContext === -1)
|
547
|
+
endContext = XMLdata.length;
|
548
|
+
parser.setCurrIndex(endContext);
|
549
|
+
}
|
550
|
+
}
|
551
|
+
}
|
552
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTUdEYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZW5naW5lL3NyYy90YXNrcy9NR0RhdGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ2xELE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFFeEMsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFFeEQsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUU1QixPQUFPLEVBQUMsTUFBTSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRSxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDcEQsT0FBTyxFQUFDLEtBQUssRUFBUSxPQUFPLEVBQWdCLE1BQU0sc0JBQXNCLENBQUM7QUFDekUsT0FBTyxFQUFDLGtCQUFrQixFQUFtQixNQUFNLGdCQUFnQixDQUFDO0FBRXBFLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFekMsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ2hELE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQzFELE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUNuRCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDakQsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ2pELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUN4RCxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDdEQsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLG9CQUFvQixDQUFD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RSxVQUFVLENBQUMsQ0FBQztZQUNoRSxJQUFJLFVBQVUsS0FBSyxDQUFDLENBQUM7Z0JBQ25CLFVBQVUsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDO1lBRTlCLE1BQU0sQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDbEMsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SGFuZGxlcnNUYWJsZX0gZnJvbSBcIi4uL3J0L0hhbmRsZXJzVGFibGVcIjtcclxuaW1wb3J0IHtUYXNrc1RhYmxlfSBmcm9tIFwiLi9UYXNrc1RhYmxlXCI7XHJcbmltcG9ydCB7SUNvbW1hbmRzVGFibGV9IGZyb20gXCIuLi9JQ29tbWFuZHNUYWJsZVwiO1xyXG5pbXBvcnQge0NvbXBNYWluUHJnVGFibGV9IGZyb20gXCIuLi9ydC9Db21wTWFpblByZ1RhYmxlXCI7XHJcbmltcG9ydCB7TWdGb3JtfSBmcm9tIFwiLi4vZ3VpL01nRm9ybVwiO1xyXG5pbXBvcnQge1Rhc2t9IGZyb20gXCIuL1Rhc2tcIjtcclxuaW1wb3J0IHtPcGVuaW5nVGFza0RldGFpbHN9IGZyb20gXCIuL1Rhc2tCYXNlXCI7XHJcbmltcG9ydCB7TG9nZ2VyLCBYTUxDb25zdGFudHMsIFhtbFBhcnNlcn0gZnJvbSBcIkBtYWdpYy14cGEvdXRpbHNcIjtcclxuaW1wb3J0IHtSZWNvbXB1dGVUYWJsZX0gZnJvbSBcIi4uL3J0L1JlY29tcHV0ZVRhYmxlXCI7XHJcbmltcG9ydCB7RGVidWcsIExpc3QsIE5OdW1iZXIsIFN0cmluZ0J1aWxkZXJ9IGZyb20gXCJAbWFnaWMteHBhL21zY29yZWxpYlwiO1xyXG5pbXBvcnQge1J1bnRpbWVDb250ZXh0QmFzZSwgVGFza0RlZmluaXRpb25JZH0gZnJvbSBcIkBtYWdpYy14cGEvZ3VpXCI7XHJcbmltcG9ydCB7RXZlbnRIYW5kbGVyfSBmcm9tIFwiLi4vZXZlbnQvRXZlbnRIYW5kbGVyXCI7XHJcbmltcG9ydCB7R1VJTWFuYWdlcn0gZnJvbSBcIi4uL0dVSU1hbmFnZXJcIjtcclxuaW1wb3J0IHtJQ2xpZW50Q29tbWFuZH0gZnJvbSBcIi4uL2NvbW1hbmRzL0lDbGllbnRDb21tYW5kXCI7XHJcbmltcG9ydCB7SHR0cE1hbmFnZXJ9IGZyb20gXCIuLi9odHRwL0h0dHBNYW5hZ2VyXCI7XHJcbmltcG9ydCB7Rmxvd01vbml0b3JRdWV1ZX0gZnJvbSBcIi4uL3V0aWwvRmxvd01vbml0b3JRdWV1ZVwiO1xyXG5pbXBvcnQge1J1blRpbWVFdmVudH0gZnJvbSBcIi4uL2V2ZW50L1J1blRpbWVFdmVudFwiO1xyXG5pbXBvcnQge0NvbnN0SW50ZXJmYWNlfSBmcm9tIFwiLi4vQ29uc3RJbnRlcmZhY2VcIjtcclxuaW1wb3J0IHtMYW5ndWFnZURhdGF9IGZyb20gXCIuLi9lbnYvTGFuZ3VhZ2VEYXRhXCI7XHJcbmltcG9ydCB7RW52UGFyYW1zVGFibGV9IGZyb20gXCIuLi9lbnYvRW52VmFyaWFibGVzVGFibGVcIjtcclxuaW1wb3J0IHtHbG9iYWxQYXJhbXN9IGZyb20gXCIuLi9leHAvR2xvYmFsUGFyYW1zVGFibGVcIjtcclxuaW1wb3J0IHtFbnZpcm9ubWVudH0gZnJvbSBcIi4uL2Vudi9FbnZpcm9ubWVudFwiO1xyXG5pbXBvcnQge0dsb2JhbENvbW1hbmRzTWFuYWdlcn0gZnJvbSBcIi4uL0dsb2JhbENvbW1hbmRzTWFuYWdlclwiO1xyXG5pbXBvcnQge1NlcnZlckNvbmZpZ30gZnJvbSBcIi4uL1NlcnZlckNvbmZpZ1wiO1xyXG5pbXBvcnQge0FjY2Vzc0hlbHBlcn0gZnJvbSBcIi4uL0FjY2Vzc0hlbHBlclwiO1xyXG5pbXBvcnQge1VzZXJEZXRhaWxzfSBmcm9tIFwiLi4vc2VjdXJpdHkvVXNlckRldGFpbHNcIjtcclxuaW1wb3J0IHtSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvcn0gZnJvbSBcIi4uL3JlbW90ZS9SZW1vdGVDb21tYW5kc1Byb2Nlc3NvclwiO1xyXG5pbXBvcnQge0RhdGFWaWV3fSBmcm9tIFwiLi4vLi5cIjtcclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuLy8vICAgUmVwcmVzZW50cyBhbGwgZGV0YWlscyByZWxldmFudCB0byBhIHNwZWNpZmljIHRhc2sgLSByZWxhdGVkIHRhc2tzLCBjb21tYW5kcywgaGFuZGxlcnMsIGV0Yy4uXHJcbi8vLyA8L3N1bW1hcnk+XHJcbmV4cG9ydCBjbGFzcyBNR0RhdGEge1xyXG4gIHByaXZhdGUgX2V4cEhhbmRsZXJzOiBIYW5kbGVyc1RhYmxlID0gbnVsbDtcclxuICBwcml2YXRlIF9pZDogbnVtYmVyID0gMDtcclxuICBwcml2YXRlIF9wYXJlbnQ6IE1HRGF0YSA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfbXByZ1RhYjogVGFza3NUYWJsZSA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfdGFza3NUYWI6IFRhc2tzVGFibGUgPSBudWxsO1xyXG4gIHByaXZhdGUgX3RpbWVySGFuZGxlcnM6IEhhbmRsZXJzVGFibGUgPSBudWxsO1xyXG4gIHByaXZhdGUgX3RpbWVyc1N0YXJ0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIGZvcmNlTW9kYWw6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBDbWRzVG9DbGllbnQ6IElDb21tYW5kc1RhYmxlID0gbnVsbDtcclxuICBDbWRzVG9TZXJ2ZXI6IElDb21tYW5kc1RhYmxlID0gbnVsbDtcclxuICBJc01vZGFsOiBib29sZWFuID0gZmFsc2U7XHJcbiAgSXNBYm9ydGluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBnZXQgRm9yY2VNb2RhbCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmZvcmNlTW9kYWw7XHJcbiAgfVxyXG5cclxuXHJcbiAgY29uc3RydWN0b3IodG9DbGllbnQ6IElDb21tYW5kc1RhYmxlLCB0b1NlcnZlcjogSUNvbW1hbmRzVGFibGUsIGlkOiBudW1iZXIsIHBhcmVudDogTUdEYXRhLCBpc01vZGFsOiBib29sZWFuKTtcclxuICBjb25zdHJ1Y3Rvcih0b0NsaWVudDogSUNvbW1hbmRzVGFibGUsIHRvU2VydmVyOiBJQ29tbWFuZHNUYWJsZSwgaWQ6IG51bWJlciwgcGFyZW50OiBNR0RhdGEsIGlzTW9kYWw6IGJvb2xlYW4sIGZvcmNlTW9kYWw6IGJvb2xlYW4pO1xyXG4gIGNvbnN0cnVjdG9yKHRvQ2xpZW50OiBJQ29tbWFuZHNUYWJsZSwgdG9TZXJ2ZXI6IElDb21tYW5kc1RhYmxlLCBpZDogbnVtYmVyLCBwYXJlbnQ6IE1HRGF0YSwgaXNNb2RhbDogYm9vbGVhbiwgZm9yY2VNb2RhbD86IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuQ21kc1RvU2VydmVyID0gdG9DbGllbnQ7XHJcbiAgICB0aGlzLkNtZHNUb0NsaWVudCA9IHRvU2VydmVyO1xyXG5cclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSA1KVxyXG4gICAgICB0aGlzLmNvbnN0cnVjdG9yXzAoaWQsIHBhcmVudCwgaXNNb2RhbCk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuY29uc3RydWN0b3JfMShpZCwgcGFyZW50LCBpc01vZGFsLCBmb3JjZU1vZGFsKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBDVE9SXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlkXCI+dGhlIGlkIG9mIHRoaXMgbWdkYXRhIG9iamVjdDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwYXJlbnRcIj50aGUgcGFyZW50IE1HRGF0YTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpc01vZGFsXCI+dHJ1ZSBmb3IgbW9kYWwgd2luZG93czwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcl8wKGlkOiBudW1iZXIsIHBhcmVudDogTUdEYXRhLCBpc01vZGFsOiBib29sZWFuKTogdm9pZCB7XHJcblxyXG4gICAgdGhpcy5fdGltZXJIYW5kbGVycyA9IG5ldyBIYW5kbGVyc1RhYmxlKCk7XHJcbiAgICB0aGlzLl9leHBIYW5kbGVycyA9IG5ldyBIYW5kbGVyc1RhYmxlKCk7XHJcbiAgICB0aGlzLl9tcHJnVGFiID0gbmV3IFRhc2tzVGFibGUoKTtcclxuICAgIHRoaXMuX3Rhc2tzVGFiID0gbmV3IFRhc2tzVGFibGUoKTtcclxuICAgIHRoaXMuX2lkID0gaWQ7XHJcbiAgICB0aGlzLl9wYXJlbnQgPSBwYXJlbnQ7XHJcbiAgICBpZiAoQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuZ2V0Q29tcE1haW5QcmdUYWIoKSA9PT0gbnVsbCkge1xyXG4gICAgICBsZXQgY29tcE1haW5QcmdUYWI6IENvbXBNYWluUHJnVGFibGUgPSBuZXcgQ29tcE1haW5QcmdUYWJsZSgpO1xyXG4gICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5zZXRDb21wTWFpblByZ1RhYihjb21wTWFpblByZ1RhYik7XHJcbiAgICB9XHJcbiAgICB0aGlzLklzTW9kYWwgPSBpc01vZGFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBDVE9SIHRvIGJlIHVzZWQgd2hlbiBydW5uaW5nIG9mZmxpbmUgdGFza3MgLSBob2xkIHRoZSBjb21tYW5kIHRvIGVuYWJsZSByaWdodCBzZXR0aW5nIG9mIG1vZGFsaXR5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpZFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicGFyZW50XCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpc01vZGFsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJmb3JjZU1vZGFsXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIGNvbnN0cnVjdG9yXzEoaWQ6IG51bWJlciwgcGFyZW50OiBNR0RhdGEsIGlzTW9kYWw6IGJvb2xlYW4sIGZvcmNlTW9kYWw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuY29uc3RydWN0b3JfMChpZCwgcGFyZW50LCBpc01vZGFsKTtcclxuICAgIHRoaXMuZm9yY2VNb2RhbCA9IGZvcmNlTW9kYWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgaWQgb2YgdGhpcyBNR0RhdGEgb2JqZWN0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBHZXRJZCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFJldHVybnMgdHJ1ZSBpZiBhbHJlYWR5IG1vdmVkIHRvIHRoZSBmaXJzdCBjb250cm9sIG9uIG9uZSBvZiB0aGUgTWdEYXRhXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBBbHJlYWR5TW92ZWRUb0ZpcnN0Q29udHJvbCgpOiBib29sZWFuIHtcclxuICAgIGxldCBhbHJlYWR5TW92ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCB0YXNrc0NvdW50OiBudW1iZXIgPSB0aGlzLmdldFRhc2tzQ291bnQoKTtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0YXNrc0NvdW50OyBpID0gaSArIDEpIHtcclxuICAgICAgbGV0IG1nRm9ybTogTWdGb3JtID0gPE1nRm9ybT50aGlzLmdldFRhc2soaSkuZ2V0Rm9ybSgpO1xyXG4gICAgICBpZiAobWdGb3JtICE9PSBudWxsICYmIG1nRm9ybS5Nb3ZlZFRvRmlyc3RDb250cm9sKSB7XHJcbiAgICAgICAgYWxyZWFkeU1vdmVkID0gdHJ1ZTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFscmVhZHlNb3ZlZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzdGFydCB0aGUgdGltZXJzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBTdGFydFRpbWVycygpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl90aW1lckhhbmRsZXJzICE9PSBudWxsICYmICF0aGlzLl90aW1lcnNTdGFydGVkKSB7XHJcbiAgICAgIHRoaXMuX3RpbWVySGFuZGxlcnMuc3RhcnRUaW1lcnModGhpcyk7XHJcbiAgICAgIHRoaXMuX3RpbWVyc1N0YXJ0ZWQgPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEZ1bmN0aW9uIGZvciBmaWxsaW5nIG93biBmaWVsZHMsIGFsbG9jYXRlIG1lbW9yeSBmb3IgaW5uZXIgb2JqZWN0cy4gUGFyc2luZyB0aGUgaW5wdXQgU3RyaW5nLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgZmlsbERhdGEob3BlbmluZ1Rhc2tEZXRhaWxzOiBPcGVuaW5nVGFza0RldGFpbHMsIHBhcnNlcjogWG1sUGFyc2VyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAvLyBUbyBhdm9pZCB0aGUgbmVlZCB0byBzZW5kIGRhdGEgdGhhdCBzZXRzIGRlZmF1bHQgdmFsdWVzLCB3ZSdsbCBhc3N1bWUgd2Ugd2FudCB0aGUgZGVmYXVsdCB2YWx1ZXNcclxuICAgIC8vIHVubGVzcyBkaWZmZXJlbnQgaW5mbyB3YXMgc2VudC4gaS5lLiBpZiB0aGUgcmVsZXZhbnQgdGFncyBhcmUgbm90IGluIHRoZSBYTUwsIHNldCB0aGUgZGVmYXVsdCB2YWx1ZXMuXHJcbiAgICBsZXQgY2FuQ29udGludWU6IGJvb2xlYW47XHJcbiAgICBkbyB7XHJcbiAgICAgIGxldCBuZXh0VGFnOiBzdHJpbmcgPSBwYXJzZXIuZ2V0TmV4dFRhZygpO1xyXG4gICAgICBjYW5Db250aW51ZSA9IGF3YWl0IHRoaXMuaW5pdElubmVyT2JqZWN0cyhwYXJzZXIsIG5leHRUYWcsIG9wZW5pbmdUYXNrRGV0YWlscyk7XHJcbiAgICB9XHJcbiAgICB3aGlsZSAoY2FuQ29udGludWUpO1xyXG4gICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coXCJNR0RhdGEuRmlsbERhdGEoKTogVEhFIEVORCBvZiB0aGUgcGFyc2luZyBcIiArIHBhcnNlci5nZXRDdXJySW5kZXgoKSArIFwiIGNoYXJhY3RlcnNcIik7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgVG8gYWxsb2NhdGUgYW5kIGZpbGwgaW5uZXIgb2JqZWN0cyBvZiB0aGUgY2xhc3NcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZm91bmRUYWdOYW1lXCI+cG9zc2libGUgdGFnIG5hbWUsIG5hbWUgb2Ygb2JqZWN0LCB3aGljaCBuZWVkIGJlIGFsbG9jYXRlZDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwib3BlbmluZ1Rhc2tEZXRhaWxzXCI+YWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvZiBvcGVuaW5nIHRhc2s8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4geG1sUGFyc2VyLmdldEN1cnJJbmRleCgpLCB0aGUgZm91bmQgb2JqZWN0IHRhZyBhbmQgQUxMIGl0cyBzdWJ0YWdzIGZpbmlzaDwvcmV0dXJucz5cclxuICBwcml2YXRlIGFzeW5jIGluaXRJbm5lck9iamVjdHMocGFyc2VyOiBYbWxQYXJzZXIsIGZvdW5kVGFnTmFtZTogc3RyaW5nLCBvcGVuaW5nVGFza0RldGFpbHM6IE9wZW5pbmdUYXNrRGV0YWlscyk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgaWYgKGZvdW5kVGFnTmFtZSA9PSBudWxsKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICBzd2l0Y2ggKGZvdW5kVGFnTmFtZSkge1xyXG4gICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19UQUdfWE1MOlxyXG4gICAgICAgIHBhcnNlci5zZXRDdXJySW5kZXgocGFyc2VyLmdldFhNTGRhdGEoKS5pbmRleE9mKFhNTENvbnN0YW50cy5UQUdfQ0xPU0UsIHBhcnNlci5nZXRDdXJySW5kZXgoKSkgKyAxKTsgLy8gZG9cclxuICAgICAgICAvLyBub3RoaW5nXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0RBVEFWSUVXOlxyXG4gICAgICAgIGlmICghIGF3YWl0IHRoaXMuaW5zZXJ0RGF0YVZpZXcocGFyc2VyKSkge1xyXG4gICAgICAgICAgLy8gdGhlIHRhc2sgb2YgaW5zZXJ0IGRhdGEgdmlldyBub3QgZm91bmQgLT4gc2V0IHBhcnNlcnMgY291bnRlciB0byB0aGVcclxuICAgICAgICAgIC8vIGVuZCBvZiB0aGUgZGF0YSB2aWV3XHJcbiAgICAgICAgICAvLyB0aGUgZGF0YSB2aWV3LCBnb3QgZnJvbSBzZXJ2ZXIgYW5kIHRoZXJlIGlzIG5vIHRhc2sgdG8gdGhlIGRhdGEgdmlldyAsIHlldC5cclxuICAgICAgICAgIGxldCBlbmRDb250ZXh0OiBudW1iZXIgPSBwYXJzZXIuZ2V0WE1MZGF0YSgpLmluZGV4T2YoJy8nICsgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0RBVEFWSUVXLFxyXG4gICAgICAgICAgICBwYXJzZXIuZ2V0Q3VyckluZGV4KCkpO1xyXG4gICAgICAgICAgcGFyc2VyLnNldEN1cnJJbmRleChlbmRDb250ZXh0KTtcclxuICAgICAgICAgIHBhcnNlci5zZXRDdXJySW5kZXgyRW5kT2ZUYWcoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0NPTVBMRVRFX0RWOiB7XHJcbiAgICAgICAgbGV0IHRhc2s6IFRhc2sgPSBudWxsO1xyXG4gICAgICAgIGxldCBlbmRDb250ZXh0OiBudW1iZXIgPSBwYXJzZXIuZ2V0WE1MZGF0YSgpLmluZGV4T2YoWE1MQ29uc3RhbnRzLlRBR19DTE9TRSwgcGFyc2VyLmdldEN1cnJJbmRleCgpKTtcclxuICAgICAgICBsZXQgaW5kZXg6IG51bWJlciA9IHBhcnNlci5nZXRYTUxkYXRhKCkuaW5kZXhPZihDb25zdEludGVyZmFjZS5NR19UQUdfQ09NUExFVEVfRFYsIHBhcnNlci5nZXRDdXJySW5kZXgoKSkgKyBDb25zdEludGVyZmFjZS5NR19UQUdfQ09NUExFVEVfRFYubGVuZ3RoO1xyXG4gICAgICAgIGxldCB0b2tlbnNWZWN0b3I6IExpc3Q8c3RyaW5nPiA9IFhtbFBhcnNlci5nZXRUb2tlbnMocGFyc2VyLmdldFhNTGRhdGEoKS5zdWJzdHIoaW5kZXgsIGVuZENvbnRleHQgLSBpbmRleCksICdcIicpO1xyXG4gICAgICAgIGxldCBhdHRyaWJ1dGU6IHN0cmluZyA9ICh0b2tlbnNWZWN0b3IuZ2V0X0l0ZW0oMCkpO1xyXG4gICAgICAgIGxldCB2YWx1ZVN0cjogc3RyaW5nO1xyXG4gICAgICAgIGlmIChhdHRyaWJ1dGUgPT09IFhNTENvbnN0YW50cy5NR19BVFRSX1RBU0tJRCkge1xyXG4gICAgICAgICAgdmFsdWVTdHIgPSAodG9rZW5zVmVjdG9yLmdldF9JdGVtKDEpKTtcclxuICAgICAgICAgIGxldCB0YXNrSWQ6IHN0cmluZyA9IHZhbHVlU3RyO1xyXG4gICAgICAgICAgaWYgKHRoaXMuZ2V0VGFzayh0YXNrSWQpID09PSBudWxsKVxyXG4gICAgICAgICAgICB0YXNrID0gPFRhc2s+QWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLkdldFRhc2tCeUlEKHRhc2tJZCk7XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRhc2sgPSB0aGlzLmdldFRhc2sodGFza0lkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHN0YXJ0OiBudW1iZXIgPSBlbmRDb250ZXh0ICsgMTtcclxuICAgICAgICBlbmRDb250ZXh0ID0gcGFyc2VyLmdldFhNTGRhdGEoKS5pbmRleE9mKFhNTENvbnN0YW50cy5FTkRfVEFHICsgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0NPTVBMRVRFX0RWLFxyXG4gICAgICAgICAgcGFyc2VyLmdldEN1cnJJbmRleCgpKTtcclxuICAgICAgICBsZXQgZGF0YVZpZXdDb250ZW50OiBzdHJpbmcgPSBwYXJzZXIuZ2V0WE1MZGF0YSgpLnN1YnN0cihzdGFydCwgZW5kQ29udGV4dCAtIHN0YXJ0KTtcclxuICAgICAgICB0YXNrLmRhdGFWaWV3Q29udGVudCA9IGRhdGFWaWV3Q29udGVudDtcclxuICAgICAgICBwYXJzZXIuc2V0Q3VyckluZGV4KGVuZENvbnRleHQpO1xyXG4gICAgICAgIHBhcnNlci5zZXRDdXJySW5kZXgyRW5kT2ZUYWcoKTtcclxuICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX1RBR19DT05URVhUOiB7XHJcbiAgICAgICAgbGV0IGVuZENvbnRleHQ6IG51bWJlciA9IHBhcnNlci5nZXRYTUxkYXRhKCkuaW5kZXhPZihYTUxDb25zdGFudHMuVEFHX1RFUk0sIHBhcnNlci5nZXRDdXJySW5kZXgoKSk7XHJcbiAgICAgICAgaWYgKGVuZENvbnRleHQgIT09IC0xICYmIGVuZENvbnRleHQgPCBwYXJzZXIuZ2V0WE1MZGF0YSgpLmxlbmd0aCkge1xyXG4gICAgICAgICAgbGV0IHRhZzogc3RyaW5nID0gcGFyc2VyLmdldFhNTHN1YnN0cmluZyhlbmRDb250ZXh0KTtcclxuICAgICAgICAgIHBhcnNlci5hZGQyQ3VyckluZGV4KHRhZy5pbmRleE9mKENvbnN0SW50ZXJmYWNlLk1HX1RBR19DT05URVhUKSArIENvbnN0SW50ZXJmYWNlLk1HX1RBR19DT05URVhULmxlbmd0aCk7XHJcbiAgICAgICAgICBwYXJzZXIuc2V0Q3VyckluZGV4KGVuZENvbnRleHQgKyBYTUxDb25zdGFudHMuVEFHX1RFUk0ubGVuZ3RoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfVEFHX1JFQ09NUFVURTpcclxuICAgICAgICBsZXQgcmVjb21wVGFiID0gbmV3IFJlY29tcHV0ZVRhYmxlKCk7XHJcbiAgICAgICAgcmVjb21wVGFiLmZpbGxEYXRhKHBhcnNlcik7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0NPTU1BTkQ6XHJcbiAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coXCJnb2VzIHRvIGNvbW1hbmRcIik7XHJcbiAgICAgICAgdGhpcy5DbWRzVG9DbGllbnQuZmlsbERhdGEocGFyc2VyKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19UQUdfTEFOR1VBR0U6XHJcbiAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coXCJnb2VzIHRvIGxhbmd1YWdlIGRhdGFcIik7XHJcbiAgICAgICAgYXdhaXQgTGFuZ3VhZ2VEYXRhLkluc3RhbmNlLmZpbGxEYXRhKHBhcnNlcik7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0tCRE1BUF9VUkw6XHJcbiAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coXCJnb2VzIHRvIGtleUJvYXJkXCIpO1xyXG4gICAgICAgIGF3YWl0IEVudmlyb25tZW50Lkluc3RhbmNlLmZpbGxGcm9tVXJsKGZvdW5kVGFnTmFtZSwgcGFyc2VyKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19UQUdfS0JETUFQOlxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX1RBR19DT01QTUFJTlBSRzpcclxuICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhcImdvZXMgdG8gY29tcG1haW5wcmdcIik7XHJcbiAgICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuZ2V0Q29tcE1haW5QcmdUYWIoKS5maWxsRGF0YShwYXJzZXIpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX1RBR19FVkVOVFNfUVVFVUU6XHJcbiAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coXCJnb2VzIHRvIGV2ZW50c3F1ZXVlXCIpO1xyXG4gICAgICAgIHRoaXMuZmlsbEV2ZW50c1F1ZXVlKHBhcnNlcik7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX1RBU0tVUkw6XHJcbiAgICAgICAgYXdhaXQgVGFzay5Qcm9jZXNzVGFza1VSTCgpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19UQUdfVEFTSzpcclxuICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhcImdvZXMgdG8gdGFza1wiKTtcclxuICAgICAgICBsZXQgdGFza0NvdW50QmVmb3JlOiBudW1iZXIgPSB0aGlzLl9tcHJnVGFiLmdldFNpemUoKTtcclxuICAgICAgICBhd2FpdCB0aGlzLl9tcHJnVGFiLmZpbGxEYXRhKHRoaXMsIG9wZW5pbmdUYXNrRGV0YWlscywgcGFyc2VyKTtcclxuICAgICAgICAvLyBRQ1IgIzc1OTkxMTogbXByZyBtdXN0IGJlbG9uZyB0byB0aGUgbWFpbiBhcHBsaWNhdGlvbidzIE1HRGF0YS5cclxuICAgICAgICAvLyBUaGlzIGVuc3VyZXMgaXQgd2lsbCBub3QgYmUgZGlzY2FyZGVkIHVudGlsIHRoZSBlbmQgb2YgZXhlY3V0aW9uLlxyXG4gICAgICAgIC8vIFRoZXJlIGNvdWxkIGJlIG1vcmUgdGhlbiAxIG1wcmdzIHRoYXQgYXJlIGFkZGVkIChRY3IgIzE2ODU0OSlcclxuICAgICAgICBpZiAodGhpcy5faWQgIT09IDApIHtcclxuICAgICAgICAgIGxldCB0YXNrQ291bnRBZnRlcjogbnVtYmVyID0gdGhpcy5fbXByZ1RhYi5nZXRTaXplKCk7XHJcbiAgICAgICAgICBsZXQgbWdkMDogTUdEYXRhID0gQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLmdldE1HRGF0YSgwKTtcclxuICAgICAgICAgIC8vIGNoZWNrIGFsbCB0aGUgbmV3IG1haW4gcHJncy5cclxuICAgICAgICAgIGZvciAobGV0IHRhc2tJbmRleDogbnVtYmVyID0gdGFza0NvdW50QmVmb3JlOyB0YXNrSW5kZXggPCB0YXNrQ291bnRBZnRlcjsgdGFza0luZGV4KyspIHtcclxuICAgICAgICAgICAgbGV0IG5ld1Rhc2s6IFRhc2sgPSA8VGFzaz50aGlzLl9tcHJnVGFiLmdldFRhc2sodGFza0luZGV4KTtcclxuICAgICAgICAgICAgaWYgKG5ld1Rhc2suaXNNYWluUHJvZygpICYmIG1nZDAuX21wcmdUYWIuZ2V0VGFzayhuZXdUYXNrLmdldFRhc2tUYWcoKSkgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgIG1nZDAuX21wcmdUYWIuYWRkVGFzayhuZXdUYXNrKTtcclxuICAgICAgICAgICAgICBtZ2QwLmFkZFRhc2sobmV3VGFzayk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0VOVjpcclxuICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhcImdvZXMgdG8gZW52aXJvbm1lbnRcIik7XHJcbiAgICAgICAgRW52aXJvbm1lbnQuSW5zdGFuY2UuZmlsbERhdGEocGFyc2VyKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19UQUdfRkxXTVRSX0NPTkZJRzpcclxuICAgICAgICBGbG93TW9uaXRvclF1ZXVlLkluc3RhbmNlLmZpbGxEYXRhKHBhcnNlcik7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX1RBR19YTUxfRU5EOlxyXG4gICAgICAgIHBhcnNlci5zZXRDdXJySW5kZXgyRW5kT2ZUYWcoKTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX1RBR19VU0VSX0RFVEFJTFM6XHJcbiAgICAgICAgVXNlckRldGFpbHMuSW5zdGFuY2UuZmlsbERhdGEocGFyc2VyKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0RCSF9SRUFMX0lEWFM6XHJcbiAgICAgICAgLy8gV2ViY2xpZW50IFRPRE8gOiByZW1vdmUgc2VyaWFsaXphdGlvbiBvZiB0aGlzIGZyb20gc2VydmVyXHJcbiAgICAgICAgcGFyc2VyLlNraXBYTUxFbGVtZW50KCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0dMT0JBTFBBUkFNU0NIQU5HRVM6XHJcbiAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coXCJhcHBseWluZyBnbG9iYWwgcGFyYW1zIGNoYW5nZXMgZnJvbSB0aGUgc2VydmVyIChTZXQvR2V0UGFyYW1zKVwiKTtcclxuICAgICAgICBHbG9iYWxQYXJhbXMuSW5zdGFuY2UuZmlsbERhdGEocGFyc2VyKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19UQUdfR0xPQkFMUEFSQU1TOlxyXG4gICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKFwicHJvY2Vzc2luZyBiYXNlNjQgZW5jb2RlZCBpbWFnZSBvZiBhbGwgZ2xvYmFsIHBhcmFtcyBmcm9tIHRoZSBzZXJ2ZXJcIik7XHJcbiAgICAgICAgdGhpcy5maWxsR2xvYmFsUGFyYW1zKHBhcnNlcik7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0VOVl9QQVJBTV9VUkw6XHJcbiAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coXCJnb2VzIHRvIGVudiBwYXJhbXMgbmFtZSBcIik7XHJcbiAgICAgICAgYXdhaXQgRW52aXJvbm1lbnQuSW5zdGFuY2UuZmlsbEZyb21VcmwoZm91bmRUYWdOYW1lLCBwYXJzZXIpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX1RBR19FTlZfUEFSQU06XHJcbiAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coXCJnb2VzIHRvIGVudiBwYXJhbXMgbmFtZSBcIik7XHJcbiAgICAgICAgRW52UGFyYW1zVGFibGUuSW5zdGFuY2UuZmlsbERhdGEocGFyc2VyKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19UQUdfQ09OVEVYVF9JRDoge1xyXG4gICAgICAgIGxldCBjdHhJZDogc3RyaW5nO1xyXG4gICAgICAgIGxldCBjdHhFbmRJZHg6IG51bWJlcjtcclxuICAgICAgICBwYXJzZXIuc2V0Q3VyckluZGV4KHBhcnNlci5nZXRYTUxkYXRhKCkuaW5kZXhPZihYTUxDb25zdGFudHMuVEFHX0NMT1NFLCBwYXJzZXIuZ2V0Q3VyckluZGV4KCkpICsgMSk7XHJcbiAgICAgICAgY3R4RW5kSWR4ID0gcGFyc2VyLmdldFhNTGRhdGEoKS5pbmRleE9mKFhNTENvbnN0YW50cy5UQUdfT1BFTiwgcGFyc2VyLmdldEN1cnJJbmRleCgpKTtcclxuICAgICAgICBjdHhJZCA9IHBhcnNlci5nZXRYTUxzdWJzdHJpbmcoY3R4RW5kSWR4KS50cmltKCk7XHJcbiAgICAgICAgcGFyc2VyLnNldEN1cnJJbmRleChjdHhFbmRJZHgpO1xyXG4gICAgICAgIHBhcnNlci5zZXRDdXJySW5kZXgyRW5kT2ZUYWcoKTtcclxuICAgICAgICBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuQ29udGV4dElEID0gY3R4SWQ7XHJcbiAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19UQUdfU0VTU0lPTl9JRDpcclxuICAgICAgICAvLyBwYXJzZSBzZXNzaW9uIGlkIHJlY2VpdmVkIGluIDFzdCByZXNwb25zZSBmcm9tIHNlcnZlciBmb3Igb2ZmbGluZSBjbGllbnRcclxuICAgICAgICAvLyBhbmQgc2F2ZSBzZXNzaW9uaWQgb24gY2xpZW50LlxyXG4gICAgICAgIGxldCBzZXNzaW9uSWRFbmRJZHg6IG51bWJlcjtcclxuICAgICAgICBwYXJzZXIuc2V0Q3VyckluZGV4KHBhcnNlci5nZXRYTUxkYXRhKCkuaW5kZXhPZihYTUxDb25zdGFudHMuVEFHX0NMT1NFLCBwYXJzZXIuZ2V0Q3VyckluZGV4KCkpICsgMSk7XHJcbiAgICAgICAgc2Vzc2lvbklkRW5kSWR4ID0gcGFyc2VyLmdldFhNTGRhdGEoKS5pbmRleE9mKFhNTENvbnN0YW50cy5UQUdfT1BFTiwgcGFyc2VyLmdldEN1cnJJbmRleCgpKTtcclxuICAgICAgICBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5HZXRJbnN0YW5jZSgpLlNlc3Npb25JZCA9IHBhcnNlci5nZXRYTUxzdWJzdHJpbmcoc2Vzc2lvbklkRW5kSWR4KS50cmltKCk7XHJcbiAgICAgICAgcGFyc2VyLnNldEN1cnJJbmRleChzZXNzaW9uSWRFbmRJZHgpO1xyXG4gICAgICAgIHBhcnNlci5zZXRDdXJySW5kZXgyRW5kT2ZUYWcoKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19UQUdfSFRUUF9DT01NVU5JQ0FUSU9OX1RJTUVPVVQ6IHtcclxuICAgICAgICBsZXQgaHR0cENvbW11bmljYXRpb25UaW1lb3V0OiBudW1iZXI7IC8vIGNvbW11bmljYXRpb24tbGV2ZWwgdGltZW91dCAoaS5lLiB0aGUgYWNjZXNzIHRvIHRoZSB3ZWIgc2VydmVyLCBOT1QgdGhlIGVudGlyZSByZXF1ZXN0L3Jlc3BvbnNlIHJvdW5kLXRyaXApLCBpbiBzZWNvbmRzLlxyXG4gICAgICAgIGxldCBodHRwQ29tbXVuaWNhdGlvblRpbWVvdXRJZHg6IG51bWJlcjtcclxuICAgICAgICBwYXJzZXIuc2V0Q3VyckluZGV4KHBhcnNlci5nZXRYTUxkYXRhKCkuaW5kZXhPZihYTUxDb25zdGFudHMuVEFHX0NMT1NFLCBwYXJzZXIuZ2V0Q3VyckluZGV4KCkpICsgMSk7XHJcbiAgICAgICAgaHR0cENvbW11bmljYXRpb25UaW1lb3V0SWR4ID0gcGFyc2VyLmdldFhNTGRhdGEoKS5pbmRleE9mKFhNTENvbnN0YW50cy5UQUdfT1BFTiwgcGFyc2VyLmdldEN1cnJJbmRleCgpKTtcclxuICAgICAgICBodHRwQ29tbXVuaWNhdGlvblRpbWVvdXQgPSBOTnVtYmVyLlBhcnNlKHBhcnNlci5nZXRYTUxzdWJzdHJpbmcoaHR0cENvbW11bmljYXRpb25UaW1lb3V0SWR4KSk7XHJcbiAgICAgICAgcGFyc2VyLnNldEN1cnJJbmRleChodHRwQ29tbXVuaWNhdGlvblRpbWVvdXRJZHgpO1xyXG4gICAgICAgIHBhcnNlci5zZXRDdXJySW5kZXgyRW5kT2ZUYWcoKTtcclxuICAgICAgICBIdHRwTWFuYWdlci5HZXRJbnN0YW5jZSgpLkh0dHBDb21tdW5pY2F0aW9uVGltZW91dE1TID0gaHR0cENvbW11bmljYXRpb25UaW1lb3V0ICogMTAwMDtcclxuICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX1RBR19EQVRBQkFTRV9VUkw6XHJcbiAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0RBVEFCQVNFU19IRUFERVI6XHJcbiAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX1RBU0tERUZJTklUSU9OX0lEU19VUkw6XHJcbiAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0RCSF9EQVRBX0lEU19VUkw6XHJcbiAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0RCSFNfRU5EOlxyXG4gICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX1RBR19PRkZMSU5FX1NOSVBQRVRTX1VSTDpcclxuICAgICAgICAvLyBUT0RPOiBzZXJ2ZXIgc2hvdWxkIG5vdCBzZXJpYWxpemUgdGhlc2UgZWxlbWVudHMuXHJcbiAgICAgICAgcGFyc2VyLlNraXBYTUxFbGVtZW50KCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX1RBR19EQkhTOlxyXG4gICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX1RBR19TVEFSVFVQX1BST0dSQU06XHJcbiAgICAgICAgLy8gVE9ETzogc2VydmVyIHNob3VsZCBub3Qgc2VyaWFsaXplIHRoZXNlIGVsZW1lbnRzLlxyXG4gICAgICAgIHBhcnNlci5SZWFkQ29udGVudE9mQ3VycmVudEVsZW1lbnQoKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX1RBR19NRU5VU19PUEVOOlxyXG4gICAgICAgIC8vIFRPRE8gLSBub3QgdG8gc2VyaWFsaXplIFtTdG9yeSAxNTQ1NDddXHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nV2l0aE1zZyhcIlRoZXJlIGlzIG5vIHN1Y2ggdGFnIG5hbWUgaW4gTUdEYXRhLCBhZGQgY2FzZSB0byBNR0RhdGEuaW5pdElubmVyT2JqZWN0cyBhbmQgY2FzZSB0byB3aGlsZSBvZiBNR0RhdGEuRmlsbERhdGEgIFwiICsgZm91bmRUYWdOYW1lKTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBJbnNlcnQgUmVjb3JkcyBUYWJsZSB0byBEYXRhVmlldyBvZiB0aGUgdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiBpZiB0aGUgdGFzayBvZiBkYXRhdmlldyBmb3VuZDwvcmV0dXJucz5cclxuICBwcml2YXRlIGFzeW5jIGluc2VydERhdGFWaWV3KHBhcnNlcjogWG1sUGFyc2VyKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgdGFzazogVGFzayA9IG51bGw7XHJcbiAgICBsZXQgZW5kQ29udGV4dDogbnVtYmVyID0gcGFyc2VyLmdldFhNTGRhdGEoKS5pbmRleE9mKFhNTENvbnN0YW50cy5UQUdfQ0xPU0UsIHBhcnNlci5nZXRDdXJySW5kZXgoKSk7XHJcbiAgICBsZXQgaW5kZXg6IG51bWJlciA9IHBhcnNlci5nZXRYTUxkYXRhKCkuaW5kZXhPZihDb25zdEludGVyZmFjZS5NR19UQUdfREFUQVZJRVcsIHBhcnNlci5nZXRDdXJySW5kZXgoKSkgKyBDb25zdEludGVyZmFjZS5NR19UQUdfREFUQVZJRVcubGVuZ3RoO1xyXG4gICAgbGV0IHRva2Vuc1ZlY3RvcjogTGlzdDxzdHJpbmc+ID0gWG1sUGFyc2VyLmdldFRva2VucyhwYXJzZXIuZ2V0WE1MZGF0YSgpLnN1YnN0cihpbmRleCwgZW5kQ29udGV4dCAtIGluZGV4KSwgJ1wiJykvKidcIicqLztcclxuICAgIGxldCBpbnZhbGlkYXRlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAvLyBsb29rIGZvciB0aGUgdGFzayBpZFxyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRva2Vuc1ZlY3Rvci5sZW5ndGg7IGkgPSBpICsgMikge1xyXG4gICAgICBsZXQgYXR0cmlidXRlOiBzdHJpbmcgPSB0b2tlbnNWZWN0b3IuZ2V0X0l0ZW0oaSk7XHJcbiAgICAgIGlmIChhdHRyaWJ1dGUgPT09IFhNTENvbnN0YW50cy5NR19BVFRSX1RBU0tJRCkge1xyXG4gICAgICAgIGxldCB2YWx1ZVN0cjogc3RyaW5nID0gdG9rZW5zVmVjdG9yLmdldF9JdGVtKGkgKyAxKTtcclxuICAgICAgICBsZXQgdGFza0lkOiBzdHJpbmcgPSB2YWx1ZVN0cjtcclxuICAgICAgICB0YXNrID0gKHRoaXMuZ2V0VGFzayh0YXNrSWQpIHx8ICg8VGFzaz5BY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuR2V0VGFza0J5SUQodGFza0lkKSkpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChhdHRyaWJ1dGUgPT09IENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfSU5WQUxJREFURSkge1xyXG4gICAgICAgIGxldCB2YWx1ZVN0cjogc3RyaW5nID0gdG9rZW5zVmVjdG9yLmdldF9JdGVtKGkgKyAxKTtcclxuICAgICAgICBpbnZhbGlkYXRlID0gWG1sUGFyc2VyLmdldEJvb2xlYW4odmFsdWVTdHIpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBsZXQgcmVzdWx0OiBib29sZWFuO1xyXG4gICAgaWYgKHRhc2sgIT09IG51bGwpIHtcclxuICAgICAgLy8gYWRkIHRoZSByZWNvcmRzIGFuZCB1cGRhdGUgdGhlIGN1cnJlbnQgcmVjb3JkIGluIHRoZSBkYXRhdmlld1xyXG4gICAgICBhd2FpdCB0YXNrLmluc2VydFJlY29yZFRhYmxlKGludmFsaWRhdGUsIHBhcnNlcik7XHJcbiAgICAgIHJlc3VsdCA9IHRydWU7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgcmVzdWx0ID0gZmFsc2U7IC8vIHRoZSB0YXNrIG5vdCBmb3VuZFxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBhZGQgdGFzayB0byB0YXNrVGFiXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm5ld1Rhc2tcIj50byBiZSBhZGRlZDwvcGFyYW0+XHJcbiAgYWRkVGFzayhuZXdUYXNrOiBUYXNrKTogdm9pZCB7XHJcbiAgICB0aGlzLl90YXNrc1RhYi5hZGRUYXNrKG5ld1Rhc2spO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlbW92ZSBhIHRhc2sgZnJvbSB0aGUgdGFza3MgdGFibGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFza1wiPjwvcGFyYW0+XHJcbiAgcmVtb3ZlVGFzayh0YXNrOiBUYXNrKTogdm9pZCB7XHJcbiAgICB0aGlzLl90YXNrc1RhYi5yZW1vdmVUYXNrKHRhc2spO1xyXG4gICAgdGhpcy5fbXByZ1RhYi5yZW1vdmVUYXNrKHRhc2spO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIG51bWJlciBvZiB0YXNrcyBpbiB0aGUgdGFza3MgdGFibGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgZ2V0VGFza3NDb3VudCgpOiBudW1iZXIge1xyXG4gICAgbGV0IHJlc3VsdDogbnVtYmVyO1xyXG4gICAgaWYgKHRoaXMuX3Rhc2tzVGFiICE9PSBudWxsKSB7XHJcbiAgICAgIHJlc3VsdCA9IHRoaXMuX3Rhc2tzVGFiLmdldFNpemUoKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICByZXN1bHQgPSAwO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIGdldFRhc2sodGFza0lkOiBzdHJpbmcpOiBUYXNrO1xyXG4gIGdldFRhc2soaWR4OiBudW1iZXIpOiBUYXNrO1xyXG4gIGdldFRhc2sodGFza0lkT3JJZHg6IGFueSk6IFRhc2sge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEgJiYgKHRhc2tJZE9ySWR4ID09PSBudWxsIHx8IHR5cGVvZiB0YXNrSWRPcklkeCA9PT0gXCJ1bmRlZmluZWRcIiB8fCB0YXNrSWRPcklkeC5jb25zdHJ1Y3RvciA9PT0gU3RyaW5nKSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5nZXRUYXNrXzAodGFza0lkT3JJZHgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuZ2V0VGFza18xKHRhc2tJZE9ySWR4KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIGEgdGFzayBieSBpdHMgaWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFza0lkXCI+dGFzayBJRDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBnZXRUYXNrXzAodGFza0lkOiBzdHJpbmcpOiBUYXNrIHtcclxuICAgIGxldCByZXN1bHQ6IFRhc2s7XHJcbiAgICBpZiAodGhpcy5fdGFza3NUYWIgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuX3Rhc2tzVGFiICE9PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgIHJlc3VsdCA9IDxUYXNrPnRoaXMuX3Rhc2tzVGFiLmdldFRhc2sodGFza0lkKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICByZXN1bHQgPSBudWxsO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIGEgdGFzayBieSBpdHMgaW5kZXggaW4gdGhlIHRhc2tzIHRhYmxlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlkeFwiPmluZGV4IG9mIHRoZSB0YXNrIGluIHRoZSB0YXNrcyB0YWJsZTwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBnZXRUYXNrXzEoaWR4OiBudW1iZXIpOiBUYXNrIHtcclxuICAgIHJldHVybiA8VGFzaz50aGlzLl90YXNrc1RhYi5nZXRUYXNrKGlkeCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYnVpbGQgWE1MIHN0cmluZyBvZiB0aGUgTUdEYXRhIG9iamVjdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibWVzc2FnZVwiPmEgbWVzc2FnZSBiZWluZyBwcmVwYXJlZC48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInNlcmlhbGl6ZVRhc2tzXCI+aWYgdHJ1ZSwgdGFza3MgaW4gdGhlIGN1cnJlbnQgZXhlY3V0aW9uIHdpbGwgYWxzbyBiZSBzZXJpYWxpemVkLjwvcGFyYW0+XHJcbiAgYXN5bmMgYnVpbGRYTUwobWVzc2FnZTogU3RyaW5nQnVpbGRlciwgc2VyaWFsaXplVGFza3M6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0aGlzLkNtZHNUb1NlcnZlciAhPT0gbnVsbCkge1xyXG4gICAgICB0aGlzLkNtZHNUb1NlcnZlci5idWlsZFhNTChtZXNzYWdlKTtcclxuICAgIH1cclxuICAgIGlmIChzZXJpYWxpemVUYXNrcyAmJiB0aGlzLl90YXNrc1RhYiAhPT0gbnVsbCkge1xyXG4gICAgICBhd2FpdCB0aGlzLl90YXNrc1RhYi5idWlsZFhNTChtZXNzYWdlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIGZpcnN0IHRhc2sgd2hpY2ggaXMgbm90IGEgbWFpbiBwcm9ncmFtIGluIHRoZSB0YXNrIHRhYmxlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRGaXJzdFRhc2soKTogVGFzayB7XHJcbiAgICBsZXQgdGFzazogVGFzayA9IG51bGw7XHJcbiAgICBsZXQgTURJRnJhbWVUYXNrOiBUYXNrID0gbnVsbDtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLl90YXNrc1RhYi5nZXRTaXplKCk7IGkgPSBpICsgMSkge1xyXG4gICAgICB0YXNrID0gPFRhc2s+dGhpcy5fdGFza3NUYWIuZ2V0VGFzayhpKTtcclxuICAgICAgaWYgKCF0YXNrLmlzTWFpblByb2coKSkge1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0YXNrID0gbnVsbDtcclxuICAgIH1cclxuICAgIGlmICh0YXNrID09PSBudWxsICYmIHRoaXMuX2lkID09PSAwKSB7XHJcbiAgICAgIHRhc2sgPSBNRElGcmFtZVRhc2s7IC8vIHJldHVybiBNREkgZnJhbWUgcHJvZ3JhbVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRhc2s7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IGEgbWFpbiBwcm9ncmFtIG9mIGEgY29tcG9uZW50IGJ5IGl0cyBjdGwgaWR4XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0bElkeFwiPnRoZSBjdGwgaWR4PC9wYXJhbT5cclxuICBnZXRNYWluUHJvZyhjdGxJZHg6IG51bWJlcik6IFRhc2sge1xyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuX21wcmdUYWIuZ2V0U2l6ZSgpOyBpID0gaSArIDEpIHtcclxuICAgICAgbGV0IHRhc2s6IFRhc2sgPSA8VGFzaz50aGlzLl9tcHJnVGFiLmdldFRhc2soaSk7XHJcbiAgICAgIGlmICh0YXNrLmdldEN0bElkeCgpID09PSBjdGxJZHggJiYgdGFzay5pc01haW5Qcm9nKCkpIHtcclxuICAgICAgICByZXR1cm4gdGFzaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgbmV4dCBtYWluIHByb2dyYW0gaW4gdGhlIHNlYXJjaCBvcmRlciBBRlRFUiB0aGUgY3RsSWR4XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0bElkeFwiPnRoZSBjdXJyZW50IGN0bCBpZHg8L3BhcmFtPlxyXG4gIGdldE5leHRNYWluUHJvZyhjdGxJZHg6IG51bWJlcik6IFRhc2sge1xyXG4gICAgbGV0IGNvbXBNYWluUHJnVGFiOiBDb21wTWFpblByZ1RhYmxlID0gQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuZ2V0Q29tcE1haW5QcmdUYWIoKTtcclxuICAgIGxldCBjdXJyU2VhcmNoSW5kZXg6IG51bWJlciA9IGNvbXBNYWluUHJnVGFiLmdldEluZGV4T2YoY3RsSWR4KTtcclxuICAgIGxldCBuZXh0Q3RsSWR4OiBudW1iZXIgPSBjb21wTWFpblByZ1RhYi5nZXRDdGxJZHgoY3VyclNlYXJjaEluZGV4ICsgMSk7XHJcbiAgICBsZXQgcmVzdWx0OiBUYXNrO1xyXG4gICAgaWYgKG5leHRDdGxJZHggPT09IC0xKSB7XHJcbiAgICAgIHJlc3VsdCA9IG51bGw7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgcmVzdWx0ID0gdGhpcy5nZXRNYWluUHJvZyhuZXh0Q3RsSWR4KTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB3aGV0aGVyIGFueSBvZiB0aGUgdGFzayBoYXMgcGVuZGluZyBjbGllbnQgc2lkZSB0cmFuc2FjdGlvbiBjYWNoZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgY2xpZW50VHJhbnNhY3Rpb25DYWNoZUV4aXN0cygpOiBib29sZWFuIHtcclxuICAgIGxldCB0YXNrOiBUYXNrO1xyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuX3Rhc2tzVGFiLmdldFNpemUoKTsgaSA9IGkgKyAxKSB7XHJcbiAgICAgIHRhc2sgPSA8VGFzaz50aGlzLl90YXNrc1RhYi5nZXRUYXNrKGkpO1xyXG4gICAgICBpZiAoIXRhc2suaXNNYWluUHJvZygpICYmICg8RGF0YVZpZXc+dGFzay5EYXRhVmlldykubW9kaWZpZWRSZWNvcmRzTnVtYmVyKCkgPiAwKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgd2hldGhlciBhbnkgb2YgdGhlIHRhc2sgaGFzIHBlbmRpbmcgc2VydmVyIHNpZGVcclxuICAvLy8gICB0cmFuc2FjdGlvbiBjYWNoZSB3aGljaCBpcyBub3QgeWV0IGNvbW1pdHRlZCB0byBEQlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2VydmVyVHJhbnNhY3Rpb25DYWNoZUV4aXN0cygpOiBib29sZWFuIHtcclxuICAgIGxldCB0YXNrOiBUYXNrO1xyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuX3Rhc2tzVGFiLmdldFNpemUoKTsgaSA9IGkgKyAxKSB7XHJcbiAgICAgIHRhc2sgPSA8VGFzaz50aGlzLl90YXNrc1RhYi5nZXRUYXNrKGkpO1xyXG4gICAgICBpZiAoIXRhc2suaXNNYWluUHJvZygpICYmICEoPERhdGFWaWV3PnRhc2suRGF0YVZpZXcpLlNlcnZlclRyYW5zYWN0aW9uQ2FjaGVFbXB0eSkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNlYXJjaCB0YXNrIHRoYXQgbWF0Y2hlcyBieSBUYXNrRGVmaW5pdGlvbklkLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0VGFza0J5VGFza0RlZmluaXRpb25JRCh0YXNrRGVmaW5pdGlvbklEOiBUYXNrRGVmaW5pdGlvbklkKTogVGFzayB7XHJcbiAgICBsZXQgdGFzazogVGFzaztcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLl90YXNrc1RhYi5nZXRTaXplKCk7IGkgPSBpICsgMSkge1xyXG4gICAgICB0YXNrID0gPFRhc2s+dGhpcy5fdGFza3NUYWIuZ2V0VGFzayhpKTtcclxuICAgICAgaWYgKHRhc2suVGFza0RlZmluaXRpb25JZC5FcXVhbHModGFza0RlZmluaXRpb25JRCkpIHtcclxuICAgICAgICByZXR1cm4gdGFzaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSB0aW1lciBldmVudCBoYW5kbGVyc1xyXG4gIGdldFRpbWVySGFuZGxlcnMoKTogSGFuZGxlcnNUYWJsZSB7XHJcbiAgICByZXR1cm4gdGhpcy5fdGltZXJIYW5kbGVycztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBhZGQgYSB0aW1lciBldmVudCBoYW5kbGVyIHRvIHRoZSB0aW1lciBldmVudCBoYW5kbGVycyB0YWJsZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJoYW5kbGVyXCI+YSByZWZlcmVuY2UgdG8gYSB0aW1lciBldmVudCBoYW5kbGVyPC9wYXJhbT5cclxuICBhZGRUaW1lckhhbmRsZXIoaGFuZGxlcjogRXZlbnRIYW5kbGVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl90aW1lckhhbmRsZXJzLmFkZChoYW5kbGVyKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZW1vdmVzIHRpbWVyIGhhbmRsZXJzIGZvciB0aGUgc3BlY2lmaWMgdGFza1xyXG4gIC8vLyAgIGl0IGlzIG5lZWRlZCBmb3IgZGVzdGluYXRpb24gY2FsbCBmb3IgZXhpdCBmcm9tIHRoZSBwcmV2aW91cyBzdWJmb3JtXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICByZW1vdmVUaW1lckhhbmRsZXIodGFzazogVGFzayk6IHZvaWQge1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl90aW1lckhhbmRsZXJzLmdldFNpemUoKTspIHtcclxuICAgICAgbGV0IHRpbWVyVGFzazogVGFzayA9IHRoaXMuX3RpbWVySGFuZGxlcnMuZ2V0SGFuZGxlcihpKS5nZXRUYXNrKCk7XHJcbiAgICAgIGlmICh0aW1lclRhc2suaXNEZXNjZW5kZW50T2YodGFzaykgJiYgdGltZXJUYXNrLmdldE1HRGF0YSgpID09PSB0aGlzKVxyXG4gICAgICAgIHRoaXMuX3RpbWVySGFuZGxlcnMucmVtb3ZlKGkpO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgaSsrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlbW92ZXMgZXhwcmVzc2lvbiBoYW5kbGVycyBmb3IgdGhlIHNwZWNpZmljIHRhc2tcclxuICAvLy8gICBpdCBpcyBuZWVkZWQgZm9yIGRlc3RpbmF0aW9uIGNhbGwgZm9yIGV4aXQgZnJvbSB0aGUgcHJldmlvdXMgc3ViZm9ybVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcmVtb3ZlRXhwcmVzc2lvbkhhbmRsZXIodGFzazogVGFzayk6IHZvaWQge1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9leHBIYW5kbGVycy5nZXRTaXplKCk7KSB7XHJcbiAgICAgIGxldCB0aW1lclRhc2s6IFRhc2sgPSB0aGlzLl9leHBIYW5kbGVycy5nZXRIYW5kbGVyKGkpLmdldFRhc2soKTtcclxuICAgICAgaWYgKHRpbWVyVGFzay5pc0Rlc2NlbmRlbnRPZih0YXNrKSAmJiB0aW1lclRhc2suZ2V0TUdEYXRhKCkgPT09IHRoaXMpXHJcbiAgICAgICAgdGhpcy5fZXhwSGFuZGxlcnMucmVtb3ZlKGkpO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgaSsrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgZXhwcmVzc2lvbiBldmVudCBoYW5kbGVyc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0RXhwSGFuZGxlcnMoKTogSGFuZGxlcnNUYWJsZSB7XHJcbiAgICByZXR1cm4gdGhpcy5fZXhwSGFuZGxlcnM7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYWRkIGEgZXhwcmVzc2lvbiBldmVudCBoYW5kbGVyIHRvIHRoZSBleHByZXNzaW9uIGV2ZW50IGhhbmRsZXJzIHRhYmxlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImhhbmRsZXJcIj5hIHJlZmVyZW5jZSB0byBhbiBleHByZXNzaW9uIGV2ZW50IGhhbmRsZXI8L3BhcmFtPlxyXG4gIGFkZEV4cEhhbmRsZXIoaGFuZGxlcjogRXZlbnRIYW5kbGVyLCBpZHg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5fZXhwSGFuZGxlcnMuaW5zZXJ0QWZ0ZXIoaGFuZGxlciwgaWR4KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzdG9wcyB0aW1lcnMgdGhhdCBhbHJlYWR5IG5vIG5lZWRlZCBhbmQgc3RhcnQgbmV3IHRpbWVyc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJvbGRUaW1lcnNcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibmV3VGltZXJzXCI+PC9wYXJhbT5cclxuICBjaGFuZ2VUaW1lcnMob2xkVGltZXJzOiBMaXN0PG51bWJlcj4sIG5ld1RpbWVyczogTGlzdDxudW1iZXI+KTogdm9pZCB7XHJcbiAgICBsZXQgaTogbnVtYmVyID0gMDtcclxuICAgIGxldCBqOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IGd1aU1hbmFnZXI6IEdVSU1hbmFnZXIgPSBHVUlNYW5hZ2VyLkluc3RhbmNlO1xyXG4gICAgb2xkVGltZXJzLnNvcnQoKTtcclxuICAgIG5ld1RpbWVycy5zb3J0KCk7XHJcbiAgICB3aGlsZSAoaSA8IG9sZFRpbWVycy5sZW5ndGggJiYgaiA8IG5ld1RpbWVycy5sZW5ndGgpIHtcclxuICAgICAgaWYgKG9sZFRpbWVycy5nZXRfSXRlbShpKSA+IG5ld1RpbWVycy5nZXRfSXRlbShqKSkge1xyXG4gICAgICAgIGd1aU1hbmFnZXIuc3RhcnRUaW1lcih0aGlzLCBuZXdUaW1lcnMuZ2V0X0l0ZW0oaiksIGZhbHNlKTtcclxuICAgICAgICBqID0gaiArIDE7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgaWYgKG9sZFRpbWVycy5nZXRfSXRlbShpKSA8IG5ld1RpbWVycy5nZXRfSXRlbShqKSkge1xyXG4gICAgICAgICAgZ3VpTWFuYWdlci5zdG9wVGltZXIodGhpcywgb2xkVGltZXJzLmdldF9JdGVtKGkpLCBmYWxzZSk7XHJcbiAgICAgICAgICBpID0gaSArIDE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgaSA9IGkgKyAxO1xyXG4gICAgICAgICAgaiA9IGogKyAxO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgd2hpbGUgKGkgPCBvbGRUaW1lcnMubGVuZ3RoKSB7XHJcbiAgICAgIGd1aU1hbmFnZXIuc3RvcFRpbWVyKHRoaXMsIG9sZFRpbWVycy5nZXRfSXRlbShpKSwgZmFsc2UpO1xyXG4gICAgICBpID0gaSArIDE7XHJcbiAgICB9XHJcbiAgICB3aGlsZSAoaiA8IG5ld1RpbWVycy5sZW5ndGgpIHtcclxuICAgICAgZ3VpTWFuYWdlci5zdGFydFRpbWVyKHRoaXMsIG5ld1RpbWVycy5nZXRfSXRlbShqKSwgZmFsc2UpO1xyXG4gICAgICBqID0gaiArIDE7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYWRkIGRhdGEgZnJvbSA8ZXZlbnRzcXVldWU+IHRhZyB0byB0aGUgZXZlbnRzIHF1ZXVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGZpbGxFdmVudHNRdWV1ZShwYXJzZXI6IFhtbFBhcnNlcik6IHZvaWQge1xyXG4gICAgd2hpbGUgKHRoaXMuaW5pdEV2ZW50cyhwYXJzZXIsIHBhcnNlci5nZXROZXh0VGFnKCkpKSB7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYWRkIFJ1biBUaW1lIEV2ZW50cyB0byB0aGUgZXZlbnRzIHF1ZXVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZvdW5kVGFnTmFtZVwiPnBvc3NpYmxlIHRhZyBuYW1lLCBuYW1lIG9mIG9iamVjdCwgd2hpY2ggbmVlZCBiZSBhbGxvY2F0ZWQ8L3BhcmFtPlxyXG4gIHByaXZhdGUgaW5pdEV2ZW50cyhwYXJzZXI6IFhtbFBhcnNlciwgZm91bmRUYWdOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGxldCByZXN1bHQ6IGJvb2xlYW47XHJcbiAgICBpZiAoZm91bmRUYWdOYW1lID09PSBudWxsKSB7XHJcbiAgICAgIHJlc3VsdCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmIChmb3VuZFRhZ05hbWUgPT09IENvbnN0SW50ZXJmYWNlLk1HX1RBR19FVkVOVCkge1xyXG4gICAgICAgIGxldCBldnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQobnVsbCk7XHJcbiAgICAgICAgZXZ0LmZpbGxEYXRhKHBhcnNlciwgbnVsbCk7XHJcbiAgICAgICAgZXZ0LmNvbnZlcnRQYXJhbXNUb0FyZ3MoKTtcclxuICAgICAgICBldnQuc2V0VGFzayhudWxsKTtcclxuICAgICAgICBldnQuc2V0RnJvbVNlcnZlcigpO1xyXG4gICAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmFkZFRvVGFpbChldnQpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGlmIChmb3VuZFRhZ05hbWUgPT09IENvbnN0SW50ZXJmYWNlLk1HX1RBR19FVkVOVFNfUVVFVUUpIHtcclxuICAgICAgICAgIHBhcnNlci5zZXRDdXJySW5kZXgocGFyc2VyLmdldFhNTGRhdGEoKS5pbmRleE9mKFwiPlwiLCBwYXJzZXIuZ2V0Q3VyckluZGV4KCkpICsgMSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgaWYgKGZvdW5kVGFnTmFtZSA9PT0gXCIvXCIgKyBDb25zdEludGVyZmFjZS5NR19UQUdfRVZFTlRTX1FVRVVFKSB7XHJcbiAgICAgICAgICAgIHBhcnNlci5zZXRDdXJySW5kZXgyRW5kT2ZUYWcoKTtcclxuICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coXCJUaGVyZSBpcyBubyBzdWNoIHRhZyBpbiBFdmVudHNRdWV1ZTogXCIgKyBmb3VuZFRhZ05hbWUpO1xyXG4gICAgICAgICAgcmVzdWx0ID0gZmFsc2U7XHJcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXN1bHQgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgZm9yIHRoZSBtYWluIHdpbmRvd3MgTUdEYXRhXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpc01haW5XaW5kb3coKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50ID09PSBudWxsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIHBhcmVudCBNR0RkYXRhIG9mIHRoaXMgTUdEYXRhIChtaWdodCBiZSBudWxsKVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0UGFyZW50TUdkYXRhKCk6IE1HRGF0YSB7XHJcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgYWJvcnRpbmcgZmxhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYWJvcnQoKTogdm9pZCB7XHJcbiAgICB0aGlzLklzQWJvcnRpbmcgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGFkZCBhbGwgY29tbWFuZHMgd2hpY2ggYXJlIG5vdCBhdHRhY2hlZCB0byBhbnkgd2luZG93IGludG8gdGhlIGN1cnJlbnQgd2luZG93XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBjb3B5VW5mcmFtZWRDbWRzKCk6IHZvaWQge1xyXG4gICAgbGV0IHVuZnJhbWVkQ21kczogTGlzdDxJQ2xpZW50Q29tbWFuZD4gPSBHbG9iYWxDb21tYW5kc01hbmFnZXIuSW5zdGFuY2UuZ2V0VW5mcmFtZWRDbWRzKCk7XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdW5mcmFtZWRDbWRzLmxlbmd0aDsgaSA9IGkgKyAxKSB7XHJcbiAgICAgIHRoaXMuQ21kc1RvQ2xpZW50LkFkZCh1bmZyYW1lZENtZHMuZ2V0X0l0ZW0oaSkpO1xyXG4gICAgfVxyXG4gICAgdW5mcmFtZWRDbWRzLlNldFNpemUoMCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyBhbiBhbmNlc3RvciBvZiB0aGlzIE1HRGF0YSBvYmplY3Qgd2hpY2ggaXMgbm90IHBlbmRpbmcgdW5sb2FkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRWYWxpZEFuY2VzdG9yKCk6IE1HRGF0YSB7XHJcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50O1xyXG4gIH1cclxuXHJcbiAgZ2V0TWF4Q3RsSWR4KCk6IG51bWJlciB7XHJcbiAgICBsZXQgcmM6IG51bWJlciA9IDA7XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5fdGFza3NUYWIuZ2V0U2l6ZSgpOyBpID0gaSArIDEpIHtcclxuICAgICAgbGV0IHRhc2s6IFRhc2sgPSA8VGFzaz50aGlzLl90YXNrc1RhYi5nZXRUYXNrKGkpO1xyXG4gICAgICBpZiAodGFzayAhPT0gbnVsbCkge1xyXG4gICAgICAgIHJjID0gTWF0aC5tYXgocmMsIHRhc2suZ2V0Q3RsSWR4KCkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmM7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IHNhdmUgdGhlIGdsb2JhbCBwYXJhbXMgKG9uZSBiYXNlNjQgZW5jb2RlZCB2YWx1ZSkgdGhhdCB3YXMgcGFzc2VkIGZyb20gdGhlIHJ1bnRpbWUtZW5naW5lIHRvIHRoZSByaWNoLWNsaWVudDwvc3VtbWFyeT5cclxuICBmaWxsR2xvYmFsUGFyYW1zKHBhcnNlcjogWG1sUGFyc2VyKTogdm9pZCB7XHJcbiAgICBsZXQgWE1MZGF0YTogc3RyaW5nID0gcGFyc2VyLmdldFhNTGRhdGEoKTtcclxuICAgIGxldCBlbmRDb250ZXh0OiBudW1iZXIgPSBwYXJzZXIuZ2V0WE1MZGF0YSgpLmluZGV4T2YoWE1MQ29uc3RhbnRzLlRBR19URVJNLCBwYXJzZXIuZ2V0Q3VyckluZGV4KCkpO1xyXG5cclxuICAgIGlmIChlbmRDb250ZXh0ICE9PSAtMSAmJiBlbmRDb250ZXh0IDwgWE1MZGF0YS5sZW5ndGgpIHtcclxuICAgICAgLy8gZmluZCBsYXN0IHBvc2l0aW9uIG9mIGl0cyB0YWdcclxuICAgICAgbGV0IHRhZzogc3RyaW5nID0gcGFyc2VyLmdldFhNTHN1YnN0cmluZyhlbmRDb250ZXh0KTtcclxuICAgICAgcGFyc2VyLmFkZDJDdXJySW5kZXgodGFnLmluZGV4T2YoQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0dMT0JBTFBBUkFNUykgKyBDb25zdEludGVyZmFjZS5NR19UQUdfR0xPQkFMUEFSQU1TLmxlbmd0aCk7XHJcblxyXG4gICAgICBsZXQgdG9rZW5zOiBMaXN0PHN0cmluZz4gPSBYbWxQYXJzZXIuZ2V0VG9rZW5zKFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5QYXJzZXIuZ2V0WE1Mc3Vic3RyaW5nKGVuZENvbnRleHQpLCBYTUxDb25zdGFudHMuWE1MX0FUVFJfREVMSU0pO1xyXG5cclxuICAgICAgRGVidWcuQXNzZXJ0KHRva2Vucy5nZXRfSXRlbSgwKSA9PT0gWE1MQ29uc3RhbnRzLk1HX0FUVFJfVkFMVUUpO1xyXG4gICAgICBTZXJ2ZXJDb25maWcuSW5zdGFuY2Uuc2V0R2xvYmFsUGFyYW1zKHRva2Vucy5nZXRfSXRlbSgxKSk7XHJcblxyXG4gICAgICBlbmRDb250ZXh0ID0gWE1MZGF0YS5pbmRleE9mKFhNTENvbnN0YW50cy5UQUdfT1BFTiwgZW5kQ29udGV4dCk7XHJcbiAgICAgIGlmIChlbmRDb250ZXh0ID09PSAtMSlcclxuICAgICAgICBlbmRDb250ZXh0ID0gWE1MZGF0YS5sZW5ndGg7XHJcblxyXG4gICAgICBwYXJzZXIuc2V0Q3VyckluZGV4KGVuZENvbnRleHQpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=
|