@magic-xpa/engine 4.1100.0-dev4110.98 → 4.1100.0
Sign up to get free protection for your applications and to get access to all the features.
- package/README.md +7 -7
- 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 +421 -0
- package/esm2022/src/CommandsProcessorBase.mjs +56 -0
- package/{esm2020 → esm2022}/src/CommandsProcessorManager.mjs +25 -25
- package/esm2022/src/CommandsTable.mjs +162 -0
- package/esm2022/src/ConstInterface.mjs +517 -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 +156 -0
- package/{esm2020 → esm2022}/src/ICommandsTable.mjs +1 -1
- package/esm2022/src/ServerConfig.mjs +122 -0
- package/{esm2020 → esm2022}/src/bridge/IGuiEvent.mjs +19 -19
- package/esm2022/src/bridge/MagicBridge.mjs +41 -0
- 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/esm2022/src/commands/ClientToServer/BrowserEscEventCommand.mjs +26 -0
- package/{esm2020 → esm2022}/src/commands/ClientToServer/ClientOriginatedCommand.mjs +14 -14
- package/{esm2020 → esm2022}/src/commands/ClientToServer/ClientOriginatedCommandSerializer.mjs +59 -59
- package/esm2022/src/commands/ClientToServer/ColumnSortEventCommand.mjs +29 -0
- package/esm2022/src/commands/ClientToServer/CommandFactory.mjs +261 -0
- package/esm2022/src/commands/ClientToServer/CommandSerializationHelper.mjs +67 -0
- package/esm2022/src/commands/ClientToServer/ComputeEventCommand.mjs +26 -0
- package/{esm2020 → esm2022}/src/commands/ClientToServer/ContextTerminationEventCommand.mjs +24 -21
- package/{esm2020 → esm2022}/src/commands/ClientToServer/ContextTimeoutResetCommand.mjs +23 -20
- 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 +40 -0
- package/{esm2020 → esm2022}/src/commands/ClientToServer/EventCommand.mjs +43 -40
- package/esm2022/src/commands/ClientToServer/ExecOperCommand.mjs +70 -0
- package/esm2022/src/commands/ClientToServer/FetchDataControlValuesEventCommand.mjs +25 -0
- package/{esm2020 → esm2022}/src/commands/ClientToServer/GlobalParamsQueryCommand.mjs +10 -10
- package/{esm2020 → esm2022}/src/commands/ClientToServer/ICommandTaskTag.mjs +1 -1
- package/esm2022/src/commands/ClientToServer/IndexChangeEventCommand.mjs +24 -0
- package/esm2022/src/commands/ClientToServer/IniputForceWriteCommand.mjs +26 -0
- package/{esm2020 → esm2022}/src/commands/ClientToServer/NonReversibleExitEventCommand.mjs +26 -23
- package/{esm2020 → esm2022}/src/commands/ClientToServer/QueryCommand.mjs +20 -20
- package/esm2022/src/commands/ClientToServer/RecomputeCommand.mjs +30 -0
- package/esm2022/src/commands/ClientToServer/RefreshEventCommand.mjs +30 -0
- package/esm2022/src/commands/ClientToServer/RefreshScreenEventCommand.mjs +27 -0
- package/esm2022/src/commands/ClientToServer/RollbackEventCommand.mjs +43 -0
- package/esm2022/src/commands/ClientToServer/SelectProgramCommand.mjs +19 -0
- package/{esm2020 → esm2022}/src/commands/ClientToServer/SetTransactionStateDataviewCommand.mjs +9 -9
- package/esm2022/src/commands/ClientToServer/SubformOpenEventCommand.mjs +24 -0
- package/esm2022/src/commands/ClientToServer/SubformRefreshEventCommand.mjs +27 -0
- package/esm2022/src/commands/ClientToServer/TransactionCommand.mjs +34 -0
- package/{esm2020 → esm2022}/src/commands/ClientToServer/UnloadCommand.mjs +18 -15
- 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 +2 -2
- package/esm2022/src/commands/ServerToClient/AbortCommand.mjs +65 -0
- package/{esm2020 → esm2022}/src/commands/ServerToClient/AddLocateCommand.mjs +21 -21
- package/{esm2020 → esm2022}/src/commands/ServerToClient/AddRangeCommand.mjs +62 -62
- package/{esm2020 → esm2022}/src/commands/ServerToClient/AddSortCommand.mjs +33 -33
- 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/{esm2020 → esm2022}/src/commands/ServerToClient/XMLBasedCommandBuilder.mjs +132 -132
- 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/{esm2020 → esm2022}/src/data/Key.mjs +88 -88
- package/esm2022/src/data/Record.mjs +880 -0
- package/{esm2020 → esm2022}/src/data/RecordOutOfDataViewException.mjs +15 -15
- package/esm2022/src/data/RecordsTable.mjs +267 -0
- package/{esm2020 → esm2022}/src/data/TaskTransactionManager.mjs +107 -103
- package/{esm2020 → esm2022}/src/data/XMLBasedDcValuesBuilder.mjs +74 -74
- 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 +227 -0
- package/{esm2020 → esm2022}/src/env/MirrorString.mjs +65 -65
- 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 +2988 -0
- package/{esm2020 → esm2022}/src/event/IEventsManager.mjs +6 -6
- package/esm2022/src/event/RunTimeEvent.mjs +399 -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/{esm2020 → esm2022}/src/exp/GlobalParamsTable.mjs +85 -85
- 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 +1224 -0
- package/esm2022/src/http/HttpManager.mjs +97 -0
- package/esm2022/src/http/client/HttpClientAsync.mjs +68 -0
- package/{esm2020 → esm2022}/src/http/client/HttpClientBase.mjs +132 -132
- 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/{esm2020 → esm2022}/src/remote/AddUserLocateRemoteDataViewCommand.mjs +18 -18
- package/{esm2020 → esm2022}/src/remote/AddUserRangeRemoteDataViewCommand.mjs +18 -18
- package/{esm2020 → esm2022}/src/remote/AddUserSortRemoteDataViewCommand.mjs +18 -18
- package/esm2022/src/remote/RemoteCommandsProcessor.mjs +883 -0
- package/{esm2020 → esm2022}/src/remote/RemoteControlItemsRefreshCommand.mjs +25 -25
- package/{esm2020 → esm2022}/src/remote/RemoteDataViewCommandBase.mjs +24 -24
- package/{esm2020 → esm2022}/src/remote/RemoteDataViewCommandFactory.mjs +60 -60
- 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/{esm2020 → esm2022}/src/remote/ResetUserLocateRemoteDataviewCommand.mjs +16 -16
- package/{esm2020 → esm2022}/src/remote/ResetUserRangeRemoteDataviewCommand.mjs +12 -12
- package/{esm2020 → esm2022}/src/remote/ResetUserSortRemoteDataviewCommand.mjs +15 -15
- package/esm2022/src/remote/ServerError.mjs +40 -0
- package/{esm2020 → esm2022}/src/remote/SetTransactionStateRemoteDataViewCommand.mjs +19 -19
- 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/esm2022/src/rt/DataviewHeaderBase.mjs +98 -0
- package/{esm2020 → esm2022}/src/rt/DataviewHeaderFactory.mjs +6 -6
- package/esm2022/src/rt/DataviewHeaders.mjs +53 -0
- package/{esm2020 → esm2022}/src/rt/DataviewHeadersSaxHandler.mjs +38 -38
- package/{esm2020 → esm2022}/src/rt/ExecutionStack.mjs +94 -94
- package/{esm2020 → esm2022}/src/rt/ExecutionStackEntry.mjs +17 -17
- package/{esm2020 → esm2022}/src/rt/HandlersTable.mjs +96 -96
- 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/{esm2020 → esm2022}/src/rt/RecomputeTable.mjs +62 -62
- package/{esm2020 → esm2022}/src/rt/RemoteDataviewHeader.mjs +108 -108
- 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/{esm2020 → esm2022}/src/tasks/RemoteTaskService.mjs +44 -44
- package/esm2022/src/tasks/Task.mjs +2499 -0
- package/esm2022/src/tasks/TaskBase.mjs +83 -0
- package/{esm2020 → esm2022}/src/tasks/TaskServiceBase.mjs +24 -24
- package/esm2022/src/tasks/TasksTable.mjs +80 -0
- package/esm2022/src/tasks/sort/Sort.mjs +5 -0
- package/{esm2020 → esm2022}/src/tasks/sort/SortCollection.mjs +67 -67
- package/{esm2020 → esm2022}/src/util/ConstUtils.mjs +13 -13
- package/esm2022/src/util/FlowMonitorQueue.mjs +451 -0
- package/{esm2020 → esm2022}/src/util/HeapSort.mjs +69 -69
- 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/{esm2020 → esm2022}/src/util/cookie.service.mjs +92 -92
- package/{fesm2020 → fesm2022}/magic-xpa-engine.mjs +29888 -29690
- 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 +35 -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 +516 -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 +35 -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 +9 -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 +11 -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 +9 -8
- package/src/commands/ClientToServer/ContextTerminationEventCommand.d.ts +8 -7
- package/src/commands/ClientToServer/ContextTimeoutResetCommand.d.ts +8 -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 +16 -15
- package/src/commands/ClientToServer/EventCommand.d.ts +16 -15
- package/src/commands/ClientToServer/ExecOperCommand.d.ts +24 -23
- package/src/commands/ClientToServer/FetchDataControlValuesEventCommand.d.ts +9 -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 +9 -8
- package/src/commands/ClientToServer/IniputForceWriteCommand.d.ts +11 -10
- package/src/commands/ClientToServer/NonReversibleExitEventCommand.d.ts +9 -8
- package/src/commands/ClientToServer/QueryCommand.d.ts +8 -8
- package/src/commands/ClientToServer/RecomputeCommand.d.ts +12 -11
- package/src/commands/ClientToServer/RefreshEventCommand.d.ts +13 -12
- package/src/commands/ClientToServer/RefreshScreenEventCommand.d.ts +11 -10
- package/src/commands/ClientToServer/RollbackEventCommand.d.ts +15 -14
- package/src/commands/ClientToServer/SelectProgramCommand.d.ts +7 -6
- package/src/commands/ClientToServer/SetTransactionStateDataviewCommand.d.ts +5 -5
- package/src/commands/ClientToServer/SubformOpenEventCommand.d.ts +9 -8
- package/src/commands/ClientToServer/SubformRefreshEventCommand.d.ts +10 -9
- package/src/commands/ClientToServer/TransactionCommand.d.ts +14 -12
- package/src/commands/ClientToServer/UnloadCommand.d.ts +8 -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 +4 -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 +157 -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 +205 -204
- package/src/event/IEventsManager.d.ts +77 -77
- package/src/event/RunTimeEvent.d.ts +126 -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 +96 -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/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/bridge/MagicBridge.mjs +0 -41
- package/esm2020/src/commands/ClientOriginatedCommandTaskTag.mjs +0 -11
- package/esm2020/src/commands/ClientToServer/BrowserEscEventCommand.mjs +0 -23
- package/esm2020/src/commands/ClientToServer/ColumnSortEventCommand.mjs +0 -26
- package/esm2020/src/commands/ClientToServer/CommandFactory.mjs +0 -260
- package/esm2020/src/commands/ClientToServer/CommandSerializationHelper.mjs +0 -69
- package/esm2020/src/commands/ClientToServer/ComputeEventCommand.mjs +0 -23
- package/esm2020/src/commands/ClientToServer/DataViewOutputCommand.mjs +0 -13
- package/esm2020/src/commands/ClientToServer/EvaluateCommand.mjs +0 -36
- package/esm2020/src/commands/ClientToServer/ExecOperCommand.mjs +0 -67
- package/esm2020/src/commands/ClientToServer/FetchDataControlValuesEventCommand.mjs +0 -22
- package/esm2020/src/commands/ClientToServer/IndexChangeEventCommand.mjs +0 -21
- 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/SelectProgramCommand.mjs +0 -15
- package/esm2020/src/commands/ClientToServer/SubformOpenEventCommand.mjs +0 -21
- 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/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/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/Record.mjs +0 -846
- package/esm2020/src/data/RecordsTable.mjs +0 -267
- 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/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 -4208
- package/esm2020/src/exp/ExpressionLocalJpn.mjs +0 -314
- 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/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/RemoteCommandsProcessor.mjs +0 -880
- package/esm2020/src/remote/ServerError.mjs +0 -40
- 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/DataviewHeaderBase.mjs +0 -96
- package/esm2020/src/rt/DataviewHeaders.mjs +0 -53
- 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/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/Task.mjs +0 -2496
- package/esm2020/src/tasks/TaskBase.mjs +0 -87
- package/esm2020/src/tasks/TasksTable.mjs +0 -80
- package/esm2020/src/tasks/sort/Sort.mjs +0 -7
- package/esm2020/src/util/FlowMonitorQueue.mjs +0 -453
- 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/fesm2015/magic-xpa-engine.mjs +0 -30837
- package/fesm2015/magic-xpa-engine.mjs.map +0 -1
- package/fesm2020/magic-xpa-engine.mjs.map +0 -1
@@ -1,453 +0,0 @@
|
|
1
|
-
import { BlobType, DisplayConvertor, PIC, VectorType } from '@magic-xpa/gui';
|
2
|
-
import { DateTime, NString, StringBuilder } from '@magic-xpa/mscorelib';
|
3
|
-
import { Constants, DateTimeUtils, InternalInterface, Logger, Queue, StorageAttribute, XMLConstants, XmlParser } from '@magic-xpa/utils';
|
4
|
-
import { FlowMonitorInterface } from '../FlowMonitorInterface';
|
5
|
-
import { ConstInterface } from '../ConstInterface';
|
6
|
-
export class FlowMonitorQueue {
|
7
|
-
constructor() {
|
8
|
-
this._queue = new Queue();
|
9
|
-
this._enabled = false;
|
10
|
-
this._isFlowOperation = false;
|
11
|
-
this._isRecompute = false;
|
12
|
-
this._isTask = false;
|
13
|
-
this._isTaskFlow = false;
|
14
|
-
this._isDataView = false;
|
15
|
-
this.ShouldSerialize = false;
|
16
|
-
this.padRight = (string, length, character = ' ') => {
|
17
|
-
let result = "";
|
18
|
-
let totalLength = length - string.length;
|
19
|
-
for (let i = 0; i < totalLength; i++) {
|
20
|
-
result = character + result;
|
21
|
-
}
|
22
|
-
result = result + string;
|
23
|
-
return result;
|
24
|
-
};
|
25
|
-
}
|
26
|
-
static get Instance() {
|
27
|
-
if (FlowMonitorQueue._instance === null)
|
28
|
-
FlowMonitorQueue._instance = new FlowMonitorQueue();
|
29
|
-
return FlowMonitorQueue._instance;
|
30
|
-
}
|
31
|
-
addTaskCngMode(newTaskMode, taskInfo) {
|
32
|
-
let info = "Task Mode Change - ";
|
33
|
-
if (this._enabled && this._isTask) {
|
34
|
-
let activityItem = new ActivityItem(this, FlowMonitorQueue.ACT_TASK, FlowMonitorInterface.FLWMTR_CHNG_MODE);
|
35
|
-
switch (newTaskMode) {
|
36
|
-
case Constants.TASK_MODE_MODIFY:
|
37
|
-
info += "Modify";
|
38
|
-
break;
|
39
|
-
case Constants.TASK_MODE_CREATE:
|
40
|
-
info += "Create";
|
41
|
-
break;
|
42
|
-
case Constants.TASK_MODE_DELETE:
|
43
|
-
info += "Delete";
|
44
|
-
break;
|
45
|
-
case Constants.TASK_MODE_QUERY:
|
46
|
-
info += "Query";
|
47
|
-
break;
|
48
|
-
default:
|
49
|
-
info = null;
|
50
|
-
break;
|
51
|
-
}
|
52
|
-
activityItem.setInfo(info);
|
53
|
-
this._queue.put(activityItem);
|
54
|
-
Logger.Instance.WriteSupportToLog(taskInfo + ": " + info, true);
|
55
|
-
}
|
56
|
-
}
|
57
|
-
fillData(parser) {
|
58
|
-
let endContext = parser.getXMLdata().indexOf("/>", parser.getCurrIndex());
|
59
|
-
if (endContext !== -1 && endContext < parser.getXMLdata().length) {
|
60
|
-
let tag = parser.getXMLsubstring(endContext);
|
61
|
-
parser.add2CurrIndex(tag.indexOf("flwmtr_config") + "flwmtr_config".length);
|
62
|
-
let tokens = XmlParser.getTokens(parser.getXMLsubstring(endContext), XMLConstants.XML_ATTR_DELIM);
|
63
|
-
Logger.Instance.WriteDevToLog("in FlowMonitorQueue.FillData: " + tokens.toString());
|
64
|
-
this.initElements(tokens);
|
65
|
-
parser.setCurrIndex(endContext + XMLConstants.TAG_TERM.length);
|
66
|
-
return;
|
67
|
-
}
|
68
|
-
Logger.Instance.WriteExceptionToLogWithMsg("in FlowMonitorQueue.FillData() out of string bounds");
|
69
|
-
}
|
70
|
-
initElements(tokensVector) {
|
71
|
-
for (let j = 0; j < tokensVector.length; j = j + 2) {
|
72
|
-
let attribute = tokensVector.get_Item(j);
|
73
|
-
let valueStr = tokensVector.get_Item(j + 1);
|
74
|
-
Logger.Instance.WriteDevToLog(attribute + " value: " + valueStr);
|
75
|
-
switch (attribute) {
|
76
|
-
case ConstInterface.MG_ATTR_TASK:
|
77
|
-
this._isTask = XmlParser.getBoolean(valueStr);
|
78
|
-
break;
|
79
|
-
case ConstInterface.MG_ATTR_TASKFLW:
|
80
|
-
this._isTaskFlow = XmlParser.getBoolean(valueStr);
|
81
|
-
break;
|
82
|
-
case ConstInterface.MG_TAG_DATAVIEW:
|
83
|
-
this._isDataView = XmlParser.getBoolean(valueStr);
|
84
|
-
break;
|
85
|
-
case ConstInterface.MG_ATTR_RECOMP:
|
86
|
-
this._isRecompute = XmlParser.getBoolean(valueStr);
|
87
|
-
break;
|
88
|
-
case ConstInterface.MG_ATTR_FLWOP:
|
89
|
-
this._isFlowOperation = XmlParser.getBoolean(valueStr);
|
90
|
-
break;
|
91
|
-
case ConstInterface.MG_ATTR_ENABLED:
|
92
|
-
this.enable(XmlParser.getBoolean(valueStr));
|
93
|
-
break;
|
94
|
-
default:
|
95
|
-
Logger.Instance.WriteExceptionToLogWithMsg("in FlowMonitorQueue.initElements(): unknown attribute: " + attribute);
|
96
|
-
break;
|
97
|
-
}
|
98
|
-
}
|
99
|
-
}
|
100
|
-
buildXML(message) {
|
101
|
-
if (!this._queue.isEmpty() && this.ShouldSerialize) {
|
102
|
-
message.Append(XMLConstants.START_TAG + ConstInterface.MG_TAG_FLWMTR_MSG + XMLConstants.TAG_CLOSE);
|
103
|
-
while (!this._queue.isEmpty()) {
|
104
|
-
let currAct = this._queue.get();
|
105
|
-
currAct.buildXML(message);
|
106
|
-
}
|
107
|
-
message.Append("</" + ConstInterface.MG_TAG_FLWMTR_MSG + XMLConstants.TAG_CLOSE);
|
108
|
-
}
|
109
|
-
}
|
110
|
-
isEmpty() {
|
111
|
-
return this._queue.isEmpty();
|
112
|
-
}
|
113
|
-
enable(value) {
|
114
|
-
let wasEnabled = this._enabled;
|
115
|
-
this._enabled = value;
|
116
|
-
this.ShouldSerialize = this._enabled;
|
117
|
-
return wasEnabled;
|
118
|
-
}
|
119
|
-
addTaskEvent(triggeredBy, state, taskInfo) {
|
120
|
-
if (this._enabled && this._isTask) {
|
121
|
-
let act = new ActivityItem(this, FlowMonitorQueue.ACT_TASK, FlowMonitorInterface.FLWMTR_EVENT);
|
122
|
-
let info;
|
123
|
-
switch (state) {
|
124
|
-
case FlowMonitorInterface.FLWMTR_START:
|
125
|
-
info = FlowMonitorQueue.S_EVENT_STR1 + triggeredBy + FlowMonitorQueue.S_EVENT_STR2;
|
126
|
-
break;
|
127
|
-
case FlowMonitorInterface.FLWMTR_END:
|
128
|
-
info = FlowMonitorQueue.E_EVENT_STR + triggeredBy;
|
129
|
-
break;
|
130
|
-
case FlowMonitorInterface.FLWMTR_PROPAGATE:
|
131
|
-
info = FlowMonitorQueue.S_EVENT_PROPAGATED;
|
132
|
-
break;
|
133
|
-
default:
|
134
|
-
info = null;
|
135
|
-
break;
|
136
|
-
}
|
137
|
-
act.setInfo(info);
|
138
|
-
this._queue.put(act);
|
139
|
-
Logger.Instance.WriteSupportToLog(taskInfo + ": " + info, true);
|
140
|
-
}
|
141
|
-
}
|
142
|
-
appendVirtualsAndParameters(currentValues) {
|
143
|
-
let act = new ActivityItem(this, FlowMonitorQueue.ACT_TASK_FLW, InternalInterface.MG_ACT_REC_PREFIX);
|
144
|
-
act.setInfo(currentValues);
|
145
|
-
this._queue.put(act);
|
146
|
-
}
|
147
|
-
addDataViewFlow(task) {
|
148
|
-
if (this._isDataView) {
|
149
|
-
let fldTab = task.DataView.GetFieldsTab();
|
150
|
-
let preparedDisplayString = "";
|
151
|
-
let finaldisplayData = "\n";
|
152
|
-
let fldValue;
|
153
|
-
let data = "";
|
154
|
-
for (let i = 0; i < fldTab.getSize(); i++) {
|
155
|
-
let fldDef = fldTab.getField(i);
|
156
|
-
if (!fldDef.IsEventHandlerField && (fldDef.IsVirtual && !fldDef.VirAsReal) || fldDef.isParam()) {
|
157
|
-
fldValue = fldDef.isNull() ? fldDef.getNullValue() : fldDef.getValue(true);
|
158
|
-
data = this.getFieldData(fldDef.getType(), fldValue, fldDef.getPicture(), fldDef.getCellsType(), task);
|
159
|
-
preparedDisplayString = this.PrepareDisplayString(fldDef.isParam(), fldDef.getVarName(), data, true);
|
160
|
-
finaldisplayData = finaldisplayData + preparedDisplayString + "\n";
|
161
|
-
}
|
162
|
-
}
|
163
|
-
this.appendVirtualsAndParameters(finaldisplayData);
|
164
|
-
}
|
165
|
-
}
|
166
|
-
getFieldData(Storagetype, data, picture, vecCellType, task) {
|
167
|
-
switch (Storagetype) {
|
168
|
-
case StorageAttribute.DOTNET:
|
169
|
-
data = FlowMonitorQueue.UNPRINTABLE_STR_LOG;
|
170
|
-
break;
|
171
|
-
case StorageAttribute.BLOB:
|
172
|
-
{
|
173
|
-
if (BlobType.isValidBlob(data)) {
|
174
|
-
let contentType = BlobType.getContentType(data);
|
175
|
-
if (contentType == BlobType.CONTENT_TYPE_ANSI || contentType == BlobType.CONTENT_TYPE_UNICODE)
|
176
|
-
data = data != null ? BlobType.getString(data) : "";
|
177
|
-
else
|
178
|
-
data = FlowMonitorQueue.UNPRINTABLE_STR_LOG;
|
179
|
-
}
|
180
|
-
else
|
181
|
-
data = "";
|
182
|
-
}
|
183
|
-
break;
|
184
|
-
case StorageAttribute.NUMERIC:
|
185
|
-
case StorageAttribute.DATE:
|
186
|
-
case StorageAttribute.TIME:
|
187
|
-
let conv = DisplayConvertor.Instance;
|
188
|
-
data = conv.mg2disp(data, " ", new PIC(picture, Storagetype, task.getCompIdx()), false, task.getCompIdx(), false);
|
189
|
-
break;
|
190
|
-
case StorageAttribute.BLOB_VECTOR:
|
191
|
-
let vecOutData;
|
192
|
-
if (data == null) {
|
193
|
-
vecOutData = "[]";
|
194
|
-
}
|
195
|
-
else {
|
196
|
-
let cellAtt = vecCellType;
|
197
|
-
let vector = new VectorType(data);
|
198
|
-
if (cellAtt == StorageAttribute.BLOB && !VectorType.validateBlobContents(data))
|
199
|
-
vecOutData = "[]";
|
200
|
-
else {
|
201
|
-
let vecSize = VectorType.getVecSize(data);
|
202
|
-
let cellPicture = (cellAtt == StorageAttribute.NUMERIC || cellAtt == StorageAttribute.DATE || cellAtt == StorageAttribute.TIME) ? PIC.buildPicture(cellAtt, vector.getVecCell(1), task.getCompIdx(), true).getFormat() : picture;
|
203
|
-
vecOutData = "[";
|
204
|
-
for (let i = 0; i < vecSize; i++) {
|
205
|
-
vecOutData += this.getFieldData(cellAtt, vector.getVecCell(i + 1), cellPicture, vecCellType, task);
|
206
|
-
vecOutData += i < vecSize - 1 ? "," : "]";
|
207
|
-
}
|
208
|
-
}
|
209
|
-
}
|
210
|
-
data = vecOutData;
|
211
|
-
break;
|
212
|
-
case StorageAttribute.BOOLEAN:
|
213
|
-
data = data == "1" ? "TRUE" : "FALSE";
|
214
|
-
break;
|
215
|
-
}
|
216
|
-
return data;
|
217
|
-
}
|
218
|
-
PrepareDisplayString(mode, name, valueContent, addDoubleQuotes) {
|
219
|
-
let str = "";
|
220
|
-
let finalStringToDisplay = "";
|
221
|
-
if (addDoubleQuotes)
|
222
|
-
finalStringToDisplay = finalStringToDisplay + "\"";
|
223
|
-
finalStringToDisplay = finalStringToDisplay + name;
|
224
|
-
if (addDoubleQuotes)
|
225
|
-
finalStringToDisplay = finalStringToDisplay + "\"";
|
226
|
-
let paddedName = this.padRight(name, 34);
|
227
|
-
let formatOfStringVirtual = `Virtual`;
|
228
|
-
let formatOfStringParameter = `Parameter`;
|
229
|
-
str = (mode ? formatOfStringParameter : formatOfStringVirtual) + " : " + `${paddedName}` + " : " + `${valueContent.trim()}`;
|
230
|
-
return str;
|
231
|
-
}
|
232
|
-
addTaskFlowRec(id, state, taskInfo) {
|
233
|
-
if (this._enabled && this._isTaskFlow) {
|
234
|
-
let info;
|
235
|
-
switch (id) {
|
236
|
-
case InternalInterface.MG_ACT_REC_PREFIX:
|
237
|
-
info = state === FlowMonitorInterface.FLWMTR_START
|
238
|
-
? FlowMonitorQueue.S_RECPRF_STR
|
239
|
-
: FlowMonitorQueue.E_RECPRF_STR;
|
240
|
-
id = FlowMonitorInterface.FLWMTR_PREFIX;
|
241
|
-
break;
|
242
|
-
case InternalInterface.MG_ACT_REC_SUFFIX:
|
243
|
-
info = state === FlowMonitorInterface.FLWMTR_START
|
244
|
-
? FlowMonitorQueue.S_RECSUF_STR
|
245
|
-
: FlowMonitorQueue.E_RECSUF_STR;
|
246
|
-
id = FlowMonitorInterface.FLWMTR_SUFFIX;
|
247
|
-
break;
|
248
|
-
case InternalInterface.MG_ACT_TASK_PREFIX:
|
249
|
-
info = state === FlowMonitorInterface.FLWMTR_START
|
250
|
-
? FlowMonitorQueue.S_TASKPRF_STR
|
251
|
-
: FlowMonitorQueue.E_TASKPRF_STR;
|
252
|
-
id = FlowMonitorInterface.FLWMTR_PREFIX;
|
253
|
-
break;
|
254
|
-
case InternalInterface.MG_ACT_TASK_SUFFIX:
|
255
|
-
info = state === FlowMonitorInterface.FLWMTR_START
|
256
|
-
? FlowMonitorQueue.S_TASKSUF_STR
|
257
|
-
: FlowMonitorQueue.E_TASKSUF_STR;
|
258
|
-
id = FlowMonitorInterface.FLWMTR_SUFFIX;
|
259
|
-
break;
|
260
|
-
default:
|
261
|
-
info = null;
|
262
|
-
break;
|
263
|
-
}
|
264
|
-
let act = new ActivityItem(this, FlowMonitorQueue.ACT_TASK_FLW, id);
|
265
|
-
act.setInfo(info);
|
266
|
-
this._queue.put(act);
|
267
|
-
Logger.Instance.WriteSupportToLog(taskInfo + ": " + info, true);
|
268
|
-
}
|
269
|
-
}
|
270
|
-
addTaskFlowFld(id, fldName, state, taskInfo) {
|
271
|
-
this.addTaskFlowCtrl(id, fldName, state, taskInfo);
|
272
|
-
}
|
273
|
-
addTaskFlowCtrl(id, ctrlName, state, taskInfo) {
|
274
|
-
if (this._enabled && this._isTaskFlow) {
|
275
|
-
let info;
|
276
|
-
switch (id) {
|
277
|
-
case InternalInterface.MG_ACT_VARIABLE:
|
278
|
-
info = state === FlowMonitorInterface.FLWMTR_START
|
279
|
-
? FlowMonitorQueue.S_VARIABLE_STR
|
280
|
-
: FlowMonitorQueue.E_VARIABLE_STR;
|
281
|
-
id = FlowMonitorInterface.FLWMTR_VARCHG_VALUE;
|
282
|
-
break;
|
283
|
-
case InternalInterface.MG_ACT_CTRL_PREFIX:
|
284
|
-
info = state === FlowMonitorInterface.FLWMTR_START
|
285
|
-
? FlowMonitorQueue.S_CTRLPRF_STR
|
286
|
-
: FlowMonitorQueue.E_CTRLPRF_STR;
|
287
|
-
id = FlowMonitorInterface.FLWMTR_CTRL_PREFIX;
|
288
|
-
break;
|
289
|
-
case InternalInterface.MG_ACT_CTRL_SUFFIX:
|
290
|
-
info = state === FlowMonitorInterface.FLWMTR_START
|
291
|
-
? FlowMonitorQueue.S_CTRLSUF_STR
|
292
|
-
: FlowMonitorQueue.E_CTRLSUF_STR;
|
293
|
-
id = FlowMonitorInterface.FLWMTR_CTRL_SUFFIX;
|
294
|
-
break;
|
295
|
-
case InternalInterface.MG_ACT_CTRL_VERIFICATION:
|
296
|
-
info = state === FlowMonitorInterface.FLWMTR_START
|
297
|
-
? FlowMonitorQueue.S_CTRLVER_STR
|
298
|
-
: FlowMonitorQueue.E_CTRLVER_STR;
|
299
|
-
id = FlowMonitorInterface.FLWMTR_CTRL_SUFFIX;
|
300
|
-
break;
|
301
|
-
default:
|
302
|
-
info = null;
|
303
|
-
break;
|
304
|
-
}
|
305
|
-
let act = new ActivityItem(this, FlowMonitorQueue.ACT_TASK_FLW, id);
|
306
|
-
if (info !== null) {
|
307
|
-
info = info + ctrlName;
|
308
|
-
if (id === FlowMonitorInterface.FLWMTR_VARCHG_VALUE && state === FlowMonitorInterface.FLWMTR_START)
|
309
|
-
info = info + FlowMonitorQueue.VARIABLE_REASON_STR;
|
310
|
-
act.setInfo(info);
|
311
|
-
Logger.Instance.WriteSupportToLog(taskInfo + ": " + info, true);
|
312
|
-
}
|
313
|
-
this._queue.put(act);
|
314
|
-
}
|
315
|
-
}
|
316
|
-
addTaskFlowHandler(handlerId, state, taskInfo) {
|
317
|
-
if (this._enabled && this._isTaskFlow) {
|
318
|
-
let act = new ActivityItem(this, FlowMonitorQueue.ACT_TASK_FLW, FlowMonitorInterface.FLWMTR_TSK_HANDLER);
|
319
|
-
let info;
|
320
|
-
switch (state) {
|
321
|
-
case FlowMonitorInterface.FLWMTR_START:
|
322
|
-
info = NString.Format(FlowMonitorQueue.S_HANDLER_STR, handlerId);
|
323
|
-
break;
|
324
|
-
case FlowMonitorInterface.FLWMTR_END:
|
325
|
-
info = NString.Format(FlowMonitorQueue.E_HANDLER_STR, handlerId);
|
326
|
-
break;
|
327
|
-
default:
|
328
|
-
info = null;
|
329
|
-
break;
|
330
|
-
}
|
331
|
-
if (info !== null) {
|
332
|
-
act.setInfo(info);
|
333
|
-
Logger.Instance.WriteSupportToLog(taskInfo + ": " + info, true);
|
334
|
-
}
|
335
|
-
this._queue.put(act);
|
336
|
-
}
|
337
|
-
}
|
338
|
-
addRecompute(triggeredByVarName, taskInfo) {
|
339
|
-
if (this._enabled && this._isRecompute) {
|
340
|
-
let act = new ActivityItem(this, FlowMonitorQueue.ACT_RECOMPUTE, FlowMonitorInterface.FLWMTR_RECOMP);
|
341
|
-
let info = FlowMonitorQueue.RECOMP_STR + triggeredByVarName;
|
342
|
-
act.setInfo(info);
|
343
|
-
this._queue.put(act);
|
344
|
-
Logger.Instance.WriteSupportToLog(taskInfo + ": " + info, true);
|
345
|
-
}
|
346
|
-
}
|
347
|
-
async addFlowFieldOperation(oper, bExecuted, taskInfo) {
|
348
|
-
if (this._enabled && this._isFlowOperation) {
|
349
|
-
let act = new ActivityItem(this, FlowMonitorQueue.ACT_FLW_OPER, FlowMonitorInterface.FLWMTR_DATA_OPER);
|
350
|
-
let buffer = new StringBuilder(FlowMonitorQueue.FLW_PERFIX);
|
351
|
-
await oper.AddFlowDescription(buffer);
|
352
|
-
buffer.Append(' ');
|
353
|
-
if (!bExecuted)
|
354
|
-
buffer.Append("[Not Executed]");
|
355
|
-
let info = buffer.ToString();
|
356
|
-
act.setInfo(info);
|
357
|
-
this._queue.put(act);
|
358
|
-
Logger.Instance.WriteSupportToLog(taskInfo + ": " + info, true);
|
359
|
-
}
|
360
|
-
}
|
361
|
-
addFlowOperationUpdate(state, taskInfo) {
|
362
|
-
if (this._enabled && this._isFlowOperation) {
|
363
|
-
let act = new ActivityItem(this, FlowMonitorQueue.ACT_FLW_OPER, FlowMonitorInterface.FLWMTR_DATA_OPER);
|
364
|
-
let info;
|
365
|
-
if (state === FlowMonitorInterface.FLWMTR_START)
|
366
|
-
info = "Starts Update";
|
367
|
-
else
|
368
|
-
info = "Ends Update";
|
369
|
-
act.setInfo(info);
|
370
|
-
this._queue.put(act);
|
371
|
-
Logger.Instance.WriteSupportToLog(taskInfo + ": " + info, true);
|
372
|
-
}
|
373
|
-
}
|
374
|
-
addFlowVerifyInfo(info, taskInfo) {
|
375
|
-
this.addFlowInfo(info, taskInfo);
|
376
|
-
}
|
377
|
-
addFlowInvokeOsInfo(info, taskInfo) {
|
378
|
-
this.addFlowInfo(info, taskInfo);
|
379
|
-
}
|
380
|
-
addFlowInfo(info, taskInfo) {
|
381
|
-
if (!this._enabled)
|
382
|
-
return;
|
383
|
-
let act = new ActivityItem(this, FlowMonitorQueue.ACT_FLW_OPER, FlowMonitorInterface.FLWMTR_DATA_OPER);
|
384
|
-
let buffer = new StringBuilder("");
|
385
|
-
if (!(info === "")) {
|
386
|
-
buffer.Append(" >> INFORMATION >> ");
|
387
|
-
buffer.Append(info);
|
388
|
-
}
|
389
|
-
let newInfo = buffer.ToString();
|
390
|
-
act.setInfo(newInfo);
|
391
|
-
this._queue.put(act);
|
392
|
-
Logger.Instance.WriteSupportToLog(taskInfo + ": " + newInfo, true);
|
393
|
-
}
|
394
|
-
}
|
395
|
-
FlowMonitorQueue._instance = null;
|
396
|
-
FlowMonitorQueue.UNPRINTABLE_STR_LOG = "#UNPRINTABLE#";
|
397
|
-
FlowMonitorQueue.S_EVENT_STR1 = ">>Starts ";
|
398
|
-
FlowMonitorQueue.S_EVENT_STR2 = " Event";
|
399
|
-
FlowMonitorQueue.S_EVENT_PROPAGATED = "Event was propagated";
|
400
|
-
FlowMonitorQueue.E_EVENT_STR = "<<Ends Event";
|
401
|
-
FlowMonitorQueue.S_RECPRF_STR = "Starts Record Prefix";
|
402
|
-
FlowMonitorQueue.E_RECPRF_STR = "Ends Record Prefix";
|
403
|
-
FlowMonitorQueue.S_RECSUF_STR = "Starts Record Suffix";
|
404
|
-
FlowMonitorQueue.E_RECSUF_STR = "Ends Record Suffix";
|
405
|
-
FlowMonitorQueue.S_TASKSUF_STR = "Starts Task Suffix";
|
406
|
-
FlowMonitorQueue.E_TASKSUF_STR = "Ends Task Suffix";
|
407
|
-
FlowMonitorQueue.S_TASKPRF_STR = "Starts Task Prefix";
|
408
|
-
FlowMonitorQueue.E_TASKPRF_STR = "Ends Task Prefix";
|
409
|
-
FlowMonitorQueue.S_CTRLPRF_STR = "Starts Control Prefix - ";
|
410
|
-
FlowMonitorQueue.E_CTRLPRF_STR = "Ends Control Prefix - ";
|
411
|
-
FlowMonitorQueue.S_CTRLSUF_STR = "Starts Control Suffix - ";
|
412
|
-
FlowMonitorQueue.E_CTRLSUF_STR = "Ends Control Suffix - ";
|
413
|
-
FlowMonitorQueue.S_HANDLER_STR = "Starts handling event {0}";
|
414
|
-
FlowMonitorQueue.E_HANDLER_STR = "Ends handling event {0}";
|
415
|
-
FlowMonitorQueue.S_CTRLVER_STR = "Starts Control Verification for Control - ";
|
416
|
-
FlowMonitorQueue.E_CTRLVER_STR = "Ends Control Verification for Control - ";
|
417
|
-
FlowMonitorQueue.RECOMP_STR = "Recomputes - ";
|
418
|
-
FlowMonitorQueue.S_VARIABLE_STR = "Starts Variable Change - ";
|
419
|
-
FlowMonitorQueue.E_VARIABLE_STR = "Ends Variable Change - ";
|
420
|
-
FlowMonitorQueue.VARIABLE_REASON_STR = " - Reason - Previous value";
|
421
|
-
FlowMonitorQueue.FLW_PERFIX = "Flow - ";
|
422
|
-
FlowMonitorQueue.ACT_TASK = 'T';
|
423
|
-
FlowMonitorQueue.ACT_TASK_FLW = 'F';
|
424
|
-
FlowMonitorQueue.ACT_RECOMPUTE = 'R';
|
425
|
-
FlowMonitorQueue.ACT_FLW_OPER = 'T';
|
426
|
-
FlowMonitorQueue.LongTimePattern = "HH:mm:ss:SSS";
|
427
|
-
class ActivityItem {
|
428
|
-
constructor(enclosingInstance, type, id) {
|
429
|
-
this._id = 0;
|
430
|
-
this._type = null;
|
431
|
-
this._info = null;
|
432
|
-
this._time = null;
|
433
|
-
this._type = type;
|
434
|
-
this._id = id;
|
435
|
-
this.setTime();
|
436
|
-
}
|
437
|
-
setTime() {
|
438
|
-
this._time = DateTimeUtils.ToString(DateTime.Now, FlowMonitorQueue.LongTimePattern, Logger.Instance);
|
439
|
-
}
|
440
|
-
setInfo(info_) {
|
441
|
-
this._info = ((info_ !== null) ? XmlParser.escape(info_) : info_);
|
442
|
-
}
|
443
|
-
buildXML(message) {
|
444
|
-
message.Append(XMLConstants.START_TAG + ConstInterface.MG_TAG_FLWMTR_ACT);
|
445
|
-
message.Append(" " + XMLConstants.MG_ATTR_TYPE + "=\"" + this._type + "\"");
|
446
|
-
message.Append(" " + XMLConstants.MG_ATTR_ID + "=\"" + this._id + "\"");
|
447
|
-
if (this._info != null)
|
448
|
-
message.Append(" " + ConstInterface.MG_ATTR_INFO + "=\"" + this._info + "\"");
|
449
|
-
message.Append(" " + ConstInterface.MG_ATTR_TIME + "=\"" + this._time + "\"");
|
450
|
-
message.Append(XMLConstants.TAG_TERM);
|
451
|
-
}
|
452
|
-
}
|
453
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvd01vbml0b3JRdWV1ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VuZ2luZS9zcmMvdXRpbC9GbG93TW9uaXRvclF1ZXVlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxRQUFRLEVBQUUsZ0JBQWdCLEVBQWtDLEdBQUcsRUFBRSxVQUFVLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzRyxPQUFPLEVBQUMsUUFBUSxFQUFRLE9BQU8sRUFBRSxhQUFhLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUM1RSxPQUFPLEVBQUMsU0FBUyxFQUFFLGFBQWEsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUV2SSxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUM3RCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFLakQsTUFBTSxPQUFPLGdCQUFnQjtJQUE3QjtRQXNDVSxXQUFNLEdBQXdCLElBQUksS0FBSyxFQUFnQixDQUFDO1FBQ3hELGFBQVEsR0FBWSxLQUFLLENBQUM7UUFDMUIscUJBQWdCLEdBQVksS0FBSyxDQUFDO1FBQ2xDLGlCQUFZLEdBQVksS0FBSyxDQUFDO1FBQzlCLFlBQU8sR0FBWSxLQUFLLENBQUM7UUFDekIsZ0JBQVcsR0FBWSxLQUFLLENBQUM7UUFDN0IsZ0JBQVcsR0FBWSxLQUFLLENBQUM7UUFDckMsb0JBQWUsR0FBWSxLQUFLLENBQUM7UUEyVHhCLGFBQVEsR0FBRyxDQUFDLE1BQWMsRUFBRSxNQUFjLEVBQUUsWUFBb0IsR0FBRyxFQUFVLEVBQUU7WUFDdEYsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO1lBQ2hCLElBQUksV0FBVyxHQUFHLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFD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ZSwgRGlzcGxheUNvbnZlcnRvciwgRmllbGRzVGFibGUsIElGbG93TW9uaXRvclF1ZXVlLCBQSUMsIFZlY3RvclR5cGV9IGZyb20gJ0BtYWdpYy14cGEvZ3VpJztcclxuaW1wb3J0IHtEYXRlVGltZSwgTGlzdCwgTlN0cmluZywgU3RyaW5nQnVpbGRlcn0gZnJvbSAnQG1hZ2ljLXhwYS9tc2NvcmVsaWInO1xyXG5pbXBvcnQge0NvbnN0YW50cywgRGF0ZVRpbWVVdGlscywgSW50ZXJuYWxJbnRlcmZhY2UsIExvZ2dlciwgUXVldWUsIFN0b3JhZ2VBdHRyaWJ1dGUsIFhNTENvbnN0YW50cywgWG1sUGFyc2VyfSBmcm9tICdAbWFnaWMteHBhL3V0aWxzJztcclxuaW1wb3J0IHtPcGVyYXRpb259IGZyb20gJy4uL3J0L09wZXJhdGlvbic7XHJcbmltcG9ydCB7Rmxvd01vbml0b3JJbnRlcmZhY2V9IGZyb20gJy4uL0Zsb3dNb25pdG9ySW50ZXJmYWNlJztcclxuaW1wb3J0IHtDb25zdEludGVyZmFjZX0gZnJvbSAnLi4vQ29uc3RJbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBUYXNrIH0gZnJvbSAnLi4vdGFza3MvVGFzayc7XHJcbmltcG9ydCB7IEZpZWxkIH0gZnJvbSAnLi4vZGF0YS9GaWVsZCc7XHJcblxyXG4vLyBAZHluYW1pY1xyXG5leHBvcnQgY2xhc3MgRmxvd01vbml0b3JRdWV1ZSBpbXBsZW1lbnRzIElGbG93TW9uaXRvclF1ZXVlIHtcclxuICBwcml2YXRlIHN0YXRpYyBfaW5zdGFuY2U6IEZsb3dNb25pdG9yUXVldWUgPSBudWxsO1xyXG4gIHByaXZhdGUgc3RhdGljIFVOUFJJTlRBQkxFX1NUUl9MT0c6IHN0cmluZyA9IFwiI1VOUFJJTlRBQkxFI1wiO1xyXG4gIHByaXZhdGUgc3RhdGljIFNfRVZFTlRfU1RSMTogc3RyaW5nID0gXCI+PlN0YXJ0cyBcIjtcclxuICBwcml2YXRlIHN0YXRpYyBTX0VWRU5UX1NUUjI6IHN0cmluZyA9IFwiIEV2ZW50XCI7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgU19FVkVOVF9QUk9QQUdBVEVEOiBzdHJpbmcgPSBcIkV2ZW50IHdhcyBwcm9wYWdhdGVkXCI7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgRV9FVkVOVF9TVFI6IHN0cmluZyA9IFwiPDxFbmRzIEV2ZW50XCI7XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIFNfUkVDUFJGX1NUUjogc3RyaW5nID0gXCJTdGFydHMgUmVjb3JkIFByZWZpeFwiO1xyXG4gIHByaXZhdGUgc3RhdGljIEVfUkVDUFJGX1NUUjogc3RyaW5nID0gXCJFbmRzIFJlY29yZCBQcmVmaXhcIjtcclxuICBwcml2YXRlIHN0YXRpYyBTX1JFQ1NVRl9TVFI6IHN0cmluZyA9IFwiU3RhcnRzIFJlY29yZCBTdWZmaXhcIjtcclxuICBwcml2YXRlIHN0YXRpYyBFX1JFQ1NVRl9TVFI6IHN0cmluZyA9IFwiRW5kcyBSZWNvcmQgU3VmZml4XCI7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgU19UQVNLU1VGX1NUUjogc3RyaW5nID0gXCJTdGFydHMgVGFzayBTdWZmaXhcIjtcclxuICBwcml2YXRlIHN0YXRpYyBFX1RBU0tTVUZfU1RSOiBzdHJpbmcgPSBcIkVuZHMgVGFzayBTdWZmaXhcIjtcclxuICBwcml2YXRlIHN0YXRpYyBTX1RBU0tQUkZfU1RSOiBzdHJpbmcgPSBcIlN0YXJ0cyBUYXNrIFByZWZpeFwiO1xyXG4gIHByaXZhdGUgc3RhdGljIEVfVEFTS1BSRl9TVFI6IHN0cmluZyA9IFwiRW5kcyBUYXNrIFByZWZpeFwiO1xyXG4gIHByaXZhdGUgc3RhdGljIFNfQ1RSTFBSRl9TVFI6IHN0cmluZyA9IFwiU3RhcnRzIENvbnRyb2wgUHJlZml4IC0gXCI7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgRV9DVFJMUFJGX1NUUjogc3RyaW5nID0gXCJFbmRzIENvbnRyb2wgUHJlZml4IC0gXCI7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgU19DVFJMU1VGX1NUUjogc3RyaW5nID0gXCJTdGFydHMgQ29udHJvbCBTdWZmaXggLSBcIjtcclxuICBwcml2YXRlIHN0YXRpYyBFX0NUUkxTVUZfU1RSOiBzdHJpbmcgPSBcIkVuZHMgQ29udHJvbCBTdWZmaXggLSBcIjtcclxuICBwcml2YXRlIHN0YXRpYyBTX0hBTkRMRVJfU1RSOiBzdHJpbmcgPSBcIlN0YXJ0cyBoYW5kbGluZyBldmVudCB7MH1cIjtcclxuICBwcml2YXRlIHN0YXRpYyBFX0hBTkRMRVJfU1RSOiBzdHJpbmcgPSBcIkVuZHMgaGFuZGxpbmcgZXZlbnQgezB9XCI7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgU19DVFJMVkVSX1NUUjogc3RyaW5nID0gXCJTdGFydHMgQ29udHJvbCBWZXJpZmljYXRpb24gZm9yIENvbnRyb2wgLSBcIjtcclxuICBwcml2YXRlIHN0YXRpYyBFX0NUUkxWRVJfU1RSOiBzdHJpbmcgPSBcIkVuZHMgQ29udHJvbCBWZXJpZmljYXRpb24gZm9yIENvbnRyb2wgLSBcIjtcclxuICBwcml2YXRlIHN0YXRpYyBSRUNPTVBfU1RSOiBzdHJpbmcgPSBcIlJlY29tcHV0ZXMgLSBcIjtcclxuICBwcml2YXRlIHN0YXRpYyBTX1ZBUklBQkxFX1NUUjogc3RyaW5nID0gXCJTdGFydHMgVmFyaWFibGUgQ2hhbmdlIC0gXCI7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgRV9WQVJJQUJMRV9TVFI6IHN0cmluZyA9IFwiRW5kcyBWYXJpYWJsZSBDaGFuZ2UgLSBcIjtcclxuICBwcml2YXRlIHN0YXRpYyBWQVJJQUJMRV9SRUFTT05fU1RSOiBzdHJpbmcgPSBcIiAtIFJlYXNvbiAtIFByZXZpb3VzIHZhbHVlXCI7XHJcblxyXG5cclxuICBwcml2YXRlIHN0YXRpYyBGTFdfUEVSRklYOiBzdHJpbmcgPSBcIkZsb3cgLSBcIjtcclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgQUNUX1RBU0s6IHN0cmluZyA9ICdUJztcclxuICBwcml2YXRlIHN0YXRpYyBBQ1RfVEFTS19GTFc6IHN0cmluZyA9ICdGJztcclxuICBwcml2YXRlIHN0YXRpYyBBQ1RfUkVDT01QVVRFOiBzdHJpbmcgPSAnUic7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgQUNUX0ZMV19PUEVSOiBzdHJpbmcgPSAnVCc7XHJcblxyXG4gIHN0YXRpYyBMb25nVGltZVBhdHRlcm4gPSBcIkhIOm1tOnNzOlNTU1wiO1xyXG4gIHByaXZhdGUgX3F1ZXVlOiBRdWV1ZTxBY3Rpdml0eUl0ZW0+ID0gbmV3IFF1ZXVlPEFjdGl2aXR5SXRlbT4oKTtcclxuICBwcml2YXRlIF9lbmFibGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfaXNGbG93T3BlcmF0aW9uOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfaXNSZWNvbXB1dGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9pc1Rhc2s6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9pc1Rhc2tGbG93OiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfaXNEYXRhVmlldzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIFNob3VsZFNlcmlhbGl6ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBzdGF0aWMgZ2V0IEluc3RhbmNlKCk6IEZsb3dNb25pdG9yUXVldWUge1xyXG4gICAgaWYgKEZsb3dNb25pdG9yUXVldWUuX2luc3RhbmNlID09PSBudWxsKVxyXG4gICAgICBGbG93TW9uaXRvclF1ZXVlLl9pbnN0YW5jZSA9IG5ldyBGbG93TW9uaXRvclF1ZXVlKCk7XHJcblxyXG4gICAgcmV0dXJuIEZsb3dNb25pdG9yUXVldWUuX2luc3RhbmNlO1xyXG4gIH1cclxuXHJcbiAgYWRkVGFza0NuZ01vZGUobmV3VGFza01vZGU6IHN0cmluZywgdGFza0luZm86IHN0cmluZyk6IHZvaWQge1xyXG4gICAgbGV0IGluZm86IHN0cmluZyA9IFwiVGFzayBNb2RlIENoYW5nZSAtIFwiO1xyXG4gICAgaWYgKHRoaXMuX2VuYWJsZWQgJiYgdGhpcy5faXNUYXNrKSB7XHJcbiAgICAgIGxldCBhY3Rpdml0eUl0ZW06IEFjdGl2aXR5SXRlbSA9IG5ldyBBY3Rpdml0eUl0ZW0odGhpcywgRmxvd01vbml0b3JRdWV1ZS5BQ1RfVEFTSywgRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX0NITkdfTU9ERSk7XHJcblxyXG4gICAgICBzd2l0Y2ggKG5ld1Rhc2tNb2RlKSB7XHJcbiAgICAgICAgY2FzZSBDb25zdGFudHMuVEFTS19NT0RFX01PRElGWTpcclxuICAgICAgICAgIGluZm8gKz0gXCJNb2RpZnlcIjtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgICAgY2FzZSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURTpcclxuICAgICAgICAgIGluZm8gKz0gXCJDcmVhdGVcIjtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgICAgY2FzZSBDb25zdGFudHMuVEFTS19NT0RFX0RFTEVURTpcclxuICAgICAgICAgIGluZm8gKz0gXCJEZWxldGVcIjtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgICAgY2FzZSBDb25zdGFudHMuVEFTS19NT0RFX1FVRVJZOlxyXG4gICAgICAgICAgaW5mbyArPSBcIlF1ZXJ5XCI7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICBpbmZvID0gbnVsbDtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBhY3Rpdml0eUl0ZW0uc2V0SW5mbyhpbmZvKTtcclxuICAgICAgdGhpcy5fcXVldWUucHV0KGFjdGl2aXR5SXRlbSk7XHJcblxyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVTdXBwb3J0VG9Mb2codGFza0luZm8gK1wiOiBcIiArIGluZm8sIHRydWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHBhcnNlIHRoZSBkYXRhXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBmaWxsRGF0YShwYXJzZXI6IFhtbFBhcnNlcik6IHZvaWQge1xyXG4gICAgbGV0IGVuZENvbnRleHQ6IG51bWJlciA9IHBhcnNlci5nZXRYTUxkYXRhKCkuaW5kZXhPZihcIi8+XCIsIHBhcnNlci5nZXRDdXJySW5kZXgoKSk7XHJcbiAgICBpZiAoZW5kQ29udGV4dCAhPT0gLTEgJiYgZW5kQ29udGV4dCA8IHBhcnNlci5nZXRYTUxkYXRhKCkubGVuZ3RoKSB7XHJcbiAgICAgIC8vIGZpbmQgbGFzdCBwb3NpdGlvbiBvZiBpdHMgdGFnXHJcbiAgICAgIGxldCB0YWc6IHN0cmluZyA9IHBhcnNlci5nZXRYTUxzdWJzdHJpbmcoZW5kQ29udGV4dCk7XHJcbiAgICAgIHBhcnNlci5hZGQyQ3VyckluZGV4KHRhZy5pbmRleE9mKFwiZmx3bXRyX2NvbmZpZ1wiKSArIFwiZmx3bXRyX2NvbmZpZ1wiLmxlbmd0aCk7XHJcblxyXG4gICAgICBsZXQgdG9rZW5zOiBMaXN0PHN0cmluZz4gPSBYbWxQYXJzZXIuZ2V0VG9rZW5zKHBhcnNlci5nZXRYTUxzdWJzdHJpbmcoZW5kQ29udGV4dCksIFhNTENvbnN0YW50cy5YTUxfQVRUUl9ERUxJTSk7XHJcbiAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKFwiaW4gRmxvd01vbml0b3JRdWV1ZS5GaWxsRGF0YTogXCIgKyB0b2tlbnMudG9TdHJpbmcoKSk7XHJcblxyXG4gICAgICB0aGlzLmluaXRFbGVtZW50cyh0b2tlbnMpO1xyXG4gICAgICBwYXJzZXIuc2V0Q3VyckluZGV4KGVuZENvbnRleHQgKyBYTUxDb25zdGFudHMuVEFHX1RFUk0ubGVuZ3RoKTsgLy8gdG8gZGVsZXRlIFwiLz5cIiB0b29cclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKFwiaW4gIEZsb3dNb25pdG9yUXVldWUuRmlsbERhdGEoKSBvdXQgb2Ygc3RyaW5nIGJvdW5kc1wiKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwYXJzZSB0aGUgWE1MIGRhdGFcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidG9rZW5zVmVjdG9yXCI+YXR0cmlidXRlL3ZhbHVlLy4uLmF0dHJpYnV0ZS92YWx1ZS8gdmVjdG9yPC9wYXJhbT5cclxuICBwcml2YXRlIGluaXRFbGVtZW50cyh0b2tlbnNWZWN0b3I6IExpc3Q8c3RyaW5nPik6IHZvaWQge1xyXG5cclxuICAgIGZvciAobGV0IGo6IG51bWJlciA9IDA7IGogPCB0b2tlbnNWZWN0b3IubGVuZ3RoOyBqID0gaiArIDIpIHtcclxuICAgICAgbGV0IGF0dHJpYnV0ZTogc3RyaW5nID0gPHN0cmluZz50b2tlbnNWZWN0b3IuZ2V0X0l0ZW0oaik7XHJcbiAgICAgIGxldCB2YWx1ZVN0cjogc3RyaW5nID0gPHN0cmluZz50b2tlbnNWZWN0b3IuZ2V0X0l0ZW0oaiArIDEpO1xyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhhdHRyaWJ1dGUgKyBcIiB2YWx1ZTogXCIgKyB2YWx1ZVN0cik7XHJcblxyXG4gICAgICBzd2l0Y2ggKGF0dHJpYnV0ZSkge1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9UQVNLOlxyXG4gICAgICAgICAgdGhpcy5faXNUYXNrID0gWG1sUGFyc2VyLmdldEJvb2xlYW4odmFsdWVTdHIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9UQVNLRkxXOlxyXG4gICAgICAgICAgdGhpcy5faXNUYXNrRmxvdyA9IFhtbFBhcnNlci5nZXRCb29sZWFuKHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX1RBR19EQVRBVklFVzpcclxuICAgICAgICAgIHRoaXMuX2lzRGF0YVZpZXcgPSBYbWxQYXJzZXIuZ2V0Qm9vbGVhbih2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX1JFQ09NUDpcclxuICAgICAgICAgIHRoaXMuX2lzUmVjb21wdXRlID0gWG1sUGFyc2VyLmdldEJvb2xlYW4odmFsdWVTdHIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9GTFdPUDpcclxuICAgICAgICAgIHRoaXMuX2lzRmxvd09wZXJhdGlvbiA9IFhtbFBhcnNlci5nZXRCb29sZWFuKHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfRU5BQkxFRDpcclxuICAgICAgICAgIHRoaXMuZW5hYmxlKFhtbFBhcnNlci5nZXRCb29sZWFuKHZhbHVlU3RyKSk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nV2l0aE1zZyhcImluIEZsb3dNb25pdG9yUXVldWUuaW5pdEVsZW1lbnRzKCk6IHVua25vd24gIGF0dHJpYnV0ZTogXCIgKyBhdHRyaWJ1dGUpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBidWlsZCBYTUwgYW5kIGVtcHR5IHRoZSBpbm5lciBxdWV1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYnVpbGRYTUwobWVzc2FnZTogU3RyaW5nQnVpbGRlcik6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLl9xdWV1ZS5pc0VtcHR5KCkgJiYgdGhpcy5TaG91bGRTZXJpYWxpemUpIHtcclxuICAgICAgbWVzc2FnZS5BcHBlbmQoWE1MQ29uc3RhbnRzLlNUQVJUX1RBRyArIENvbnN0SW50ZXJmYWNlLk1HX1RBR19GTFdNVFJfTVNHICsgWE1MQ29uc3RhbnRzLlRBR19DTE9TRSk7XHJcblxyXG4gICAgICB3aGlsZSAoIXRoaXMuX3F1ZXVlLmlzRW1wdHkoKSkge1xyXG4gICAgICAgIGxldCBjdXJyQWN0OiBBY3Rpdml0eUl0ZW0gPSA8QWN0aXZpdHlJdGVtPnRoaXMuX3F1ZXVlLmdldCgpO1xyXG4gICAgICAgIGN1cnJBY3QuYnVpbGRYTUwobWVzc2FnZSk7XHJcbiAgICAgIH0gLy8gZmlsbCBhY3Rpdml0aWVzXHJcblxyXG4gICAgICBtZXNzYWdlLkFwcGVuZChcIjwvXCIgKyBDb25zdEludGVyZmFjZS5NR19UQUdfRkxXTVRSX01TRyArIFhNTENvbnN0YW50cy5UQUdfQ0xPU0UpO1xyXG4gICAgfSAvLyB0aGUgcXVldWUgaXMgbm90IGVtcHR5XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgaXMgdGhlIEZsb3cgTW9uaXRvciBRdWV1ZSBlbXB0eVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaXNFbXB0eSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9xdWV1ZS5pc0VtcHR5KCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZW5hYmxlIHRoZSBmbG93IG1vbml0b3JcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz50aGUgcHJldmlvdXMgc3RhdGUgKGVuYWJsZWQvZGlzYWJsZWQpPC9yZXR1cm5zPlxyXG4gIGVuYWJsZSh2YWx1ZTogYm9vbGVhbik6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHdhc0VuYWJsZWQ6IGJvb2xlYW4gPSB0aGlzLl9lbmFibGVkO1xyXG4gICAgdGhpcy5fZW5hYmxlZCA9IHZhbHVlO1xyXG4gICAgdGhpcy5TaG91bGRTZXJpYWxpemUgPSB0aGlzLl9lbmFibGVkO1xyXG4gICAgcmV0dXJuIHdhc0VuYWJsZWQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYWRkIEFjdGl2aXRpZXMgdG8gdGhlIHF1ZXVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRyaWdnZXJlZEJ5XCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInN0YXRlXCI+b2YgdGhlIGV2ZW50IHRhc2sgYWN0aXZpdGllPC9wYXJhbT5cclxuICBhZGRUYXNrRXZlbnQodHJpZ2dlcmVkQnk6IHN0cmluZywgc3RhdGU6IG51bWJlciwgdGFza0luZm86IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX2VuYWJsZWQgJiYgdGhpcy5faXNUYXNrKSB7XHJcbiAgICAgIGxldCBhY3Q6IEFjdGl2aXR5SXRlbSA9IG5ldyBBY3Rpdml0eUl0ZW0odGhpcywgRmxvd01vbml0b3JRdWV1ZS5BQ1RfVEFTSywgRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX0VWRU5UKTtcclxuXHJcbiAgICAgIGxldCBpbmZvOiBzdHJpbmc7XHJcbiAgICAgIHN3aXRjaCAoc3RhdGUpIHtcclxuICAgICAgICBjYXNlIEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9TVEFSVDpcclxuICAgICAgICAgIGluZm8gPSBGbG93TW9uaXRvclF1ZXVlLlNfRVZFTlRfU1RSMSArIHRyaWdnZXJlZEJ5ICsgRmxvd01vbml0b3JRdWV1ZS5TX0VWRU5UX1NUUjI7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBGbG93TW9uaXRvckludGVyZmFjZS5GTFdNVFJfRU5EOlxyXG4gICAgICAgICAgaW5mbyA9IEZsb3dNb25pdG9yUXVldWUuRV9FVkVOVF9TVFIgKyB0cmlnZ2VyZWRCeTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9QUk9QQUdBVEU6XHJcbiAgICAgICAgICBpbmZvID0gRmxvd01vbml0b3JRdWV1ZS5TX0VWRU5UX1BST1BBR0FURUQ7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIGluZm8gPSBudWxsO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGFjdC5zZXRJbmZvKGluZm8pO1xyXG4gICAgICB0aGlzLl9xdWV1ZS5wdXQoYWN0KTtcclxuXHJcbiAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZVN1cHBvcnRUb0xvZyh0YXNrSW5mbyArXCI6IFwiICsgaW5mbywgdHJ1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFwcGVuZFZpcnR1YWxzQW5kUGFyYW1ldGVycyhjdXJyZW50VmFsdWVzOiBzdHJpbmcpIDogdm9pZFxyXG4gIHtcclxuICAgIGxldCBhY3Q6IEFjdGl2aXR5SXRlbSA9IG5ldyBBY3Rpdml0eUl0ZW0odGhpcywgRmxvd01vbml0b3JRdWV1ZS5BQ1RfVEFTS19GTFcsIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuICAgIGFjdC5zZXRJbmZvKGN1cnJlbnRWYWx1ZXMpO1xyXG4gICAgdGhpcy5fcXVldWUucHV0KGFjdCk7XHJcbiAgfVxyXG5cclxuICAvLyAvLy8gPHN1bW1hcnk+XHJcbiAgLy8gLy8vICAgYWRkIHZpcnR1YWwgYW5kIHBhcmFtZXRlciBpbmZvcm1hdGlvbiBhbmQgc2VuZCBpdCB0byBzZXJ2ZXIgb24gcmVjb3JkIHByZWZpeFxyXG4gIC8vIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8gLy8vIDxwYXJhbSBuYW1lID0gXCJ0YXNrXCI+XHJcbiAgLy8gLy8vIDwvcGFyYW0+XHJcbiAgYWRkRGF0YVZpZXdGbG93KHRhc2s6IFRhc2spIDogdm9pZFxyXG4gIHsgXHJcbiAgICAgIGlmICh0aGlzLl9pc0RhdGFWaWV3KVxyXG4gICAgICB7XHJcbiAgICAgICAgICBsZXQgZmxkVGFiOiBGaWVsZHNUYWJsZSA9IHRhc2suRGF0YVZpZXcuR2V0RmllbGRzVGFiKCk7XHJcbiAgICAgICAgICBsZXQgcHJlcGFyZWREaXNwbGF5U3RyaW5nOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgICAgICAgbGV0IGZpbmFsZGlzcGxheURhdGE6IHN0cmluZyA9IFwiXFxuXCI7XHJcbiAgICAgICAgICBsZXQgZmxkVmFsdWU6IHN0cmluZztcclxuICAgICAgICAgIGxldCBkYXRhOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGZsZFRhYi5nZXRTaXplKCk7IGkrKylcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBsZXQgZmxkRGVmOiBGaWVsZCA9IDxGaWVsZD5mbGRUYWIuZ2V0RmllbGQoaSk7XHJcbiAgICAgICAgICAgICAgaWYgKCFmbGREZWYuSXNFdmVudEhhbmRsZXJGaWVsZCAmJiAoZmxkRGVmLklzVmlydHVhbCAmJiAhZmxkRGVmLlZpckFzUmVhbCkgfHwgZmxkRGVmLmlzUGFyYW0oKSlcclxuICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgIGZsZFZhbHVlID0gZmxkRGVmLmlzTnVsbCgpID8gZmxkRGVmLmdldE51bGxWYWx1ZSgpIDogZmxkRGVmLmdldFZhbHVlKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICBkYXRhID0gdGhpcy5nZXRGaWVsZERhdGEoZmxkRGVmLmdldFR5cGUoKSwgZmxkVmFsdWUsIGZsZERlZi5nZXRQaWN0dXJlKCksIGZsZERlZi5nZXRDZWxsc1R5cGUoKSwgdGFzayk7XHJcbiAgICAgICAgICAgICAgICAgIHByZXBhcmVkRGlzcGxheVN0cmluZyA9IHRoaXMuUHJlcGFyZURpc3BsYXlTdHJpbmcoZmxkRGVmLmlzUGFyYW0oKSwgZmxkRGVmLmdldFZhck5hbWUoKSwgZGF0YSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgIGZpbmFsZGlzcGxheURhdGEgPSBmaW5hbGRpc3BsYXlEYXRhICsgcHJlcGFyZWREaXNwbGF5U3RyaW5nICsgXCJcXG5cIjtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLmFwcGVuZFZpcnR1YWxzQW5kUGFyYW1ldGVycyhmaW5hbGRpc3BsYXlEYXRhKTtcclxuICAgICAgfVxyXG4gICB9XHJcblxyXG4gIC8vIC8vLyA8c3VtbWFyeT5cclxuICAvLyAvLy8gICBHZXQgdmlydHVhbHMgYW5kIHBhcmFtZXRlciB2YWx1ZXMuXHJcbiAgLy8gLy8vIDwvc3VtbWFyeT5cclxuICAvLyAvLy8gPHBhcmFtIG5hbWUgPSBcIlN0b3JhZ2V0eXBlXCI+PC9wYXJhbT5cclxuICAvLyAvLy8gPHBhcmFtIG5hbWUgPSBcImRhdGFcIj48L3BhcmFtPlxyXG4gIC8vIC8vLyA8cGFyYW0gbmFtZSA9IFwicGljdHVyZVwiPjwvcGFyYW0+XHJcbiAgLy8gLy8vIDxwYXJhbSBuYW1lID0gXCJ2ZWNDZWxsVHlwZVwiPjwvcGFyYW0+XHJcbiAgLy8gLy8vIDxwYXJhbSBuYW1lID0gXCJ0YXNrXCI+PC9wYXJhbT5cclxuICAvLyAvLy8gPC9wYXJhbT5cclxuICBwcml2YXRlIGdldEZpZWxkRGF0YShTdG9yYWdldHlwZTogU3RvcmFnZUF0dHJpYnV0ZSwgZGF0YTogc3RyaW5nLCBwaWN0dXJlOiBzdHJpbmcsIHZlY0NlbGxUeXBlOiBTdG9yYWdlQXR0cmlidXRlLCB0YXNrOiBUYXNrKTogc3RyaW5nXHJcbiAge1xyXG4gICAgICBzd2l0Y2ggKFN0b3JhZ2V0eXBlKVxyXG4gICAgICB7XHJcbiAgICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuRE9UTkVUOlxyXG4gICAgICAgICAgICAgIGRhdGEgPSBGbG93TW9uaXRvclF1ZXVlLlVOUFJJTlRBQkxFX1NUUl9MT0c7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkJMT0I6XHJcbiAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYoQmxvYlR5cGUuaXNWYWxpZEJsb2IoZGF0YSkpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBjb250ZW50VHlwZTogc3RyaW5nID0gQmxvYlR5cGUuZ2V0Q29udGVudFR5cGUoZGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50VHlwZSA9PSBCbG9iVHlwZS5DT05URU5UX1RZUEVfQU5TSSB8fCBjb250ZW50VHlwZSA9PSBCbG9iVHlwZS5DT05URU5UX1RZUEVfVU5JQ09ERSlcclxuICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhICE9IG51bGwgPyBCbG9iVHlwZS5nZXRTdHJpbmcoZGF0YSkgOiBcIlwiO1xyXG4gICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gRmxvd01vbml0b3JRdWV1ZS5VTlBSSU5UQUJMRV9TVFJfTE9HO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICBkYXRhID0gXCJcIjtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUM6XHJcbiAgICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuREFURTpcclxuICAgICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5USU1FOlxyXG4gICAgICAgICAgICAgIGxldCBjb252OiBEaXNwbGF5Q29udmVydG9yPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlO1xyXG4gICAgICAgICAgICAgIGRhdGEgPSBjb252Lm1nMmRpc3AoZGF0YSwgXCIgXCIsIG5ldyBQSUMocGljdHVyZSwgU3RvcmFnZXR5cGUsIHRhc2suZ2V0Q29tcElkeCgpKSwgZmFsc2UsIHRhc2suZ2V0Q29tcElkeCgpLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkJMT0JfVkVDVE9SOlxyXG4gICAgICAgICAgICAgIGxldCB2ZWNPdXREYXRhOiBzdHJpbmc7XHJcbiAgICAgICAgICAgICAgaWYgKGRhdGEgPT0gbnVsbClcclxuICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgIHZlY091dERhdGEgPSBcIltdXCI7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBjZWxsQXR0OiBTdG9yYWdlQXR0cmlidXRlID0gdmVjQ2VsbFR5cGU7XHJcbiAgICAgICAgICAgICAgICAgIGxldCB2ZWN0b3I6IFZlY3RvclR5cGUgPSBuZXcgVmVjdG9yVHlwZShkYXRhKTtcclxuICAgICAgICAgICAgICAgICAgaWYgKGNlbGxBdHQgPT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CICYmICFWZWN0b3JUeXBlLnZhbGlkYXRlQmxvYkNvbnRlbnRzKGRhdGEpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgdmVjT3V0RGF0YSA9IFwiW11cIjtcclxuICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBsZXQgdmVjU2l6ZTogbnVtYmVyID0gVmVjdG9yVHlwZS5nZXRWZWNTaXplKGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgbGV0IGNlbGxQaWN0dXJlOiBzdHJpbmcgPSAoY2VsbEF0dCA9PSBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUMgfHwgY2VsbEF0dCA9PSBTdG9yYWdlQXR0cmlidXRlLkRBVEUgfHwgY2VsbEF0dCA9PSBTdG9yYWdlQXR0cmlidXRlLlRJTUUpID8gUElDLmJ1aWxkUGljdHVyZShjZWxsQXR0LCB2ZWN0b3IuZ2V0VmVjQ2VsbCgxKSwgdGFzay5nZXRDb21wSWR4KCksIHRydWUpLmdldEZvcm1hdCgpIDogcGljdHVyZTtcclxuICAgICAgICAgICAgICAgICAgICAgIHZlY091dERhdGEgPSBcIltcIjtcclxuICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgOiBudW1iZXIgPSAwOyBpIDwgdmVjU2l6ZTsgaSsrKVxyXG4gICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZlY091dERhdGEgKz0gdGhpcy5nZXRGaWVsZERhdGEoY2VsbEF0dCwgdmVjdG9yLmdldFZlY0NlbGwoaSArIDEpLCBjZWxsUGljdHVyZSwgdmVjQ2VsbFR5cGUsIHRhc2spO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZlY091dERhdGEgKz0gaSA8IHZlY1NpemUgLSAxID8gXCIsXCIgOiBcIl1cIjtcclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBkYXRhID0gdmVjT3V0RGF0YTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQk9PTEVBTjpcclxuICAgICAgICAgICAgICBkYXRhID0gZGF0YSA9PSBcIjFcIiA/IFwiVFJVRVwiIDogXCJGQUxTRVwiO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBkYXRhO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFByZXBhcmUgZGlzcGxheSBzdHJpbmcgdGhhdCB3aWxsIGJlIHNlbnQgdG8gdGhlIHNlcnZlciBvbiByZWNvcmQgcHJlZml4LlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJtb2RlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm5hbWVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidmFsdWVDb250ZW50XCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImFkZERvdWJsZVF1b3Rlc1wiPjwvcGFyYW0+XHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBQcmVwYXJlRGlzcGxheVN0cmluZyhtb2RlOiBib29sZWFuLCBuYW1lOiBzdHJpbmcsIHZhbHVlQ29udGVudDogc3RyaW5nLCBhZGREb3VibGVRdW90ZXM6IGJvb2xlYW4pOiBzdHJpbmdcclxuICB7XHJcbiAgICAgIGxldCAgc3RyOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgICBsZXQgZmluYWxTdHJpbmdUb0Rpc3BsYXk6IHN0cmluZyA9IFwiXCI7XHJcbiAgICAgIGlmIChhZGREb3VibGVRdW90ZXMpXHJcbiAgICAgICAgICBmaW5hbFN0cmluZ1RvRGlzcGxheSA9IGZpbmFsU3RyaW5nVG9EaXNwbGF5ICsgXCJcXFwiXCI7XHJcbiAgICAgIGZpbmFsU3RyaW5nVG9EaXNwbGF5ID0gZmluYWxTdHJpbmdUb0Rpc3BsYXkgKyBuYW1lO1xyXG4gICAgICBpZiAoYWRkRG91YmxlUXVvdGVzKVxyXG4gICAgICAgICAgZmluYWxTdHJpbmdUb0Rpc3BsYXkgPSBmaW5hbFN0cmluZ1RvRGlzcGxheSArIFwiXFxcIlwiO1xyXG5cclxuICAgICAgbGV0IHBhZGRlZE5hbWUgPSB0aGlzLnBhZFJpZ2h0KG5hbWUsMzQpO1xyXG4gICAgICBsZXQgZm9ybWF0T2ZTdHJpbmdWaXJ0dWFsOnN0cmluZyA9IGBWaXJ0dWFsYCA7Ly86ICR7cGFkZGVkTmFtZX0gOiAke3ZhbHVlQ29udGVudH1gO1xyXG4gICAgICBsZXQgZm9ybWF0T2ZTdHJpbmdQYXJhbWV0ZXI6IHN0cmluZyA9IGBQYXJhbWV0ZXJgOy8vYCA6ICR7cGFkZGVkTmFtZX0gOiAke3ZhbHVlQ29udGVudH1gO1xyXG4gICAgIFxyXG4gICAgICBzdHIgPSAobW9kZSA/IGZvcm1hdE9mU3RyaW5nUGFyYW1ldGVyIDogZm9ybWF0T2ZTdHJpbmdWaXJ0dWFsKSArIFwiIDogXCIgK2Ake3BhZGRlZE5hbWV9YCsgXCIgOiBcIitgJHt2YWx1ZUNvbnRlbnQudHJpbSgpfWA7XHJcblxyXG4gICAgICByZXR1cm4gc3RyO1xyXG4gIH1cclxuXHJcbiAgIHByaXZhdGUgcGFkUmlnaHQgPSAoc3RyaW5nOiBzdHJpbmcsIGxlbmd0aDogbnVtYmVyLCBjaGFyYWN0ZXI6IHN0cmluZyA9ICcgJyk6IHN0cmluZyA9PiB7XHJcbiAgICBsZXQgcmVzdWx0ID0gXCJcIjtcclxuICAgIGxldCB0b3RhbExlbmd0aCA9IGxlbmd0aCAtIHN0cmluZy5sZW5ndGg7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRvdGFsTGVuZ3RoOyBpKyspIHtcclxuICAgICAgcmVzdWx0ID0gY2hhcmFjdGVyICsgcmVzdWx0O1xyXG4gICAgfVxyXG4gICAgcmVzdWx0ID0gcmVzdWx0ICsgc3RyaW5nO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9O1xyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBhZGQgdGFzayBmbG93IGZvciByZWNvcmQgcHJlZml4IG9yIHN1Zml4XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlkXCI+aXMgRkxXTVRSX1BSRUZJWCBvciBGTFdNVFJfU1VGRklYXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzdGF0ZVwiPm9mIHRoZSBldmVudCB0YXNrIGFjdGl2aXRpZVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIGFkZFRhc2tGbG93UmVjKGlkOiBudW1iZXIsIHN0YXRlOiBudW1iZXIsIHRhc2tJbmZvOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9lbmFibGVkICYmIHRoaXMuX2lzVGFza0Zsb3cpIHtcclxuICAgICAgbGV0IGluZm86IHN0cmluZztcclxuXHJcbiAgICAgIHN3aXRjaCAoaWQpIHtcclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYOlxyXG4gICAgICAgICAgaW5mbyA9IHN0YXRlID09PSBGbG93TW9uaXRvckludGVyZmFjZS5GTFdNVFJfU1RBUlRcclxuICAgICAgICAgICAgPyBGbG93TW9uaXRvclF1ZXVlLlNfUkVDUFJGX1NUUlxyXG4gICAgICAgICAgICA6IEZsb3dNb25pdG9yUXVldWUuRV9SRUNQUkZfU1RSO1xyXG4gICAgICAgICAgaWQgPSBGbG93TW9uaXRvckludGVyZmFjZS5GTFdNVFJfUFJFRklYO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVg6XHJcbiAgICAgICAgICBpbmZvID0gc3RhdGUgPT09IEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9TVEFSVFxyXG4gICAgICAgICAgICA/IEZsb3dNb25pdG9yUXVldWUuU19SRUNTVUZfU1RSXHJcbiAgICAgICAgICAgIDogRmxvd01vbml0b3JRdWV1ZS5FX1JFQ1NVRl9TVFI7XHJcbiAgICAgICAgICBpZCA9IEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9TVUZGSVg7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEFTS19QUkVGSVg6XHJcbiAgICAgICAgICBpbmZvID0gc3RhdGUgPT09IEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9TVEFSVFxyXG4gICAgICAgICAgICA/IEZsb3dNb25pdG9yUXVldWUuU19UQVNLUFJGX1NUUlxyXG4gICAgICAgICAgICA6IEZsb3dNb25pdG9yUXVldWUuRV9UQVNLUFJGX1NUUjtcclxuICAgICAgICAgIGlkID0gRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX1BSRUZJWDtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQVNLX1NVRkZJWDpcclxuICAgICAgICAgIGluZm8gPSBzdGF0ZSA9PT0gRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX1NUQVJUXHJcbiAgICAgICAgICAgID8gRmxvd01vbml0b3JRdWV1ZS5TX1RBU0tTVUZfU1RSXHJcbiAgICAgICAgICAgIDogRmxvd01vbml0b3JRdWV1ZS5FX1RBU0tTVUZfU1RSO1xyXG4gICAgICAgICAgaWQgPSBGbG93TW9uaXRvckludGVyZmFjZS5GTFdNVFJfU1VGRklYO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICBpbmZvID0gbnVsbDtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgYWN0OiBBY3Rpdml0eUl0ZW0gPSBuZXcgQWN0aXZpdHlJdGVtKHRoaXMsIEZsb3dNb25pdG9yUXVldWUuQUNUX1RBU0tfRkxXLCBpZCk7XHJcbiAgICAgIGFjdC5zZXRJbmZvKGluZm8pO1xyXG4gICAgICB0aGlzLl9xdWV1ZS5wdXQoYWN0KTtcclxuXHJcbiAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZVN1cHBvcnRUb0xvZyh0YXNrSW5mbyArXCI6IFwiICsgaW5mbywgdHJ1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlkXCI+aXMgTUdfQUNUX1ZBUklBQkxFPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZsZE5hbWVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic3RhdGVcIj5vZiB0aGUgZXZlbnQgdGFzayBhY3Rpdml0aWU8L3BhcmFtPlxyXG4gIGFkZFRhc2tGbG93RmxkKGlkOiBudW1iZXIsIGZsZE5hbWU6IHN0cmluZywgc3RhdGU6IG51bWJlciwgdGFza0luZm86IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5hZGRUYXNrRmxvd0N0cmwoaWQsIGZsZE5hbWUsIHN0YXRlLCB0YXNrSW5mbyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlkXCI+aXMgRkxXTVRSX0NUUkxfUFJFRklYIG9yIEZMV01UUl9DVFJMX1NVRkZJWDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsTmFtZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzdGF0ZVwiPm9mIHRoZSBldmVudCB0YXNrIGFjdGl2aXRpZTwvcGFyYW0+XHJcbiAgYWRkVGFza0Zsb3dDdHJsKGlkOiBudW1iZXIsIGN0cmxOYW1lOiBzdHJpbmcsIHN0YXRlOiBudW1iZXIsIHRhc2tJbmZvOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9lbmFibGVkICYmIHRoaXMuX2lzVGFza0Zsb3cpIHtcclxuICAgICAgbGV0IGluZm86IHN0cmluZztcclxuXHJcbiAgICAgIHN3aXRjaCAoaWQpIHtcclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9WQVJJQUJMRTpcclxuICAgICAgICAgIGluZm8gPSBzdGF0ZSA9PT0gRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX1NUQVJUXHJcbiAgICAgICAgICAgID8gRmxvd01vbml0b3JRdWV1ZS5TX1ZBUklBQkxFX1NUUlxyXG4gICAgICAgICAgICA6IEZsb3dNb25pdG9yUXVldWUuRV9WQVJJQUJMRV9TVFI7XHJcbiAgICAgICAgICBpZCA9IEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9WQVJDSEdfVkFMVUU7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9QUkVGSVg6XHJcbiAgICAgICAgICBpbmZvID0gc3RhdGUgPT09IEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9TVEFSVFxyXG4gICAgICAgICAgICA/IEZsb3dNb25pdG9yUXVldWUuU19DVFJMUFJGX1NUUlxyXG4gICAgICAgICAgICA6IEZsb3dNb25pdG9yUXVldWUuRV9DVFJMUFJGX1NUUjtcclxuICAgICAgICAgIGlkID0gRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX0NUUkxfUFJFRklYO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1NVRkZJWDpcclxuICAgICAgICAgIGluZm8gPSBzdGF0ZSA9PT0gRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX1NUQVJUXHJcbiAgICAgICAgICAgID8gRmxvd01vbml0b3JRdWV1ZS5TX0NUUkxTVUZfU1RSXHJcbiAgICAgICAgICAgIDogRmxvd01vbml0b3JRdWV1ZS5FX0NUUkxTVUZfU1RSO1xyXG4gICAgICAgICAgaWQgPSBGbG93TW9uaXRvckludGVyZmFjZS5GTFdNVFJfQ1RSTF9TVUZGSVg7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9WRVJJRklDQVRJT046XHJcbiAgICAgICAgICBpbmZvID0gc3RhdGUgPT09IEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9TVEFSVFxyXG4gICAgICAgICAgICA/IEZsb3dNb25pdG9yUXVldWUuU19DVFJMVkVSX1NUUlxyXG4gICAgICAgICAgICA6IEZsb3dNb25pdG9yUXVldWUuRV9DVFJMVkVSX1NUUjtcclxuICAgICAgICAgIGlkID0gRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX0NUUkxfU1VGRklYO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICBpbmZvID0gbnVsbDtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgYWN0OiBBY3Rpdml0eUl0ZW0gPSBuZXcgQWN0aXZpdHlJdGVtKHRoaXMsIEZsb3dNb25pdG9yUXVldWUuQUNUX1RBU0tfRkxXLCBpZCk7XHJcbiAgICAgIGlmIChpbmZvICE9PSBudWxsKSB7XHJcbiAgICAgICAgaW5mbyA9IGluZm8gKyBjdHJsTmFtZTtcclxuICAgICAgICBpZiAoaWQgPT09IEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9WQVJDSEdfVkFMVUUgJiYgc3RhdGUgPT09IEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9TVEFSVClcclxuICAgICAgICAgIGluZm8gPSBpbmZvICsgRmxvd01vbml0b3JRdWV1ZS5WQVJJQUJMRV9SRUFTT05fU1RSO1xyXG4gICAgICAgIGFjdC5zZXRJbmZvKGluZm8pO1xyXG4gICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZVN1cHBvcnRUb0xvZyh0YXNrSW5mbyArXCI6IFwiICsgaW5mbywgdHJ1ZSk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5fcXVldWUucHV0KGFjdCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImhhbmRsZXJJZFwiPmlzaWQgb2YgdGhlIGhhbmRsZXJcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInN0YXRlXCI+b2YgdGhlIGV2ZW50IHRhc2sgYWN0aXZpdGllXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgYWRkVGFza0Zsb3dIYW5kbGVyKGhhbmRsZXJJZDogc3RyaW5nLCBzdGF0ZTogbnVtYmVyLCB0YXNrSW5mbzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fZW5hYmxlZCAmJiB0aGlzLl9pc1Rhc2tGbG93KSB7XHJcbiAgICAgIGxldCBhY3Q6IEFjdGl2aXR5SXRlbSA9IG5ldyBBY3Rpdml0eUl0ZW0odGhpcywgRmxvd01vbml0b3JRdWV1ZS5BQ1RfVEFTS19GTFcsIEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9UU0tfSEFORExFUik7XHJcbiAgICAgIGxldCBpbmZvOiBzdHJpbmc7XHJcblxyXG4gICAgICBzd2l0Y2ggKHN0YXRlKSB7XHJcbiAgICAgICAgY2FzZSBGbG93TW9uaXRvckludGVyZmFjZS5GTFdNVFJfU1RBUlQ6XHJcbiAgICAgICAgICBpbmZvID0gTlN0cmluZy5Gb3JtYXQoRmxvd01vbml0b3JRdWV1ZS5TX0hBTkRMRVJfU1RSLCBoYW5kbGVySWQpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX0VORDpcclxuICAgICAgICAgIGluZm8gPSBOU3RyaW5nLkZvcm1hdChGbG93TW9uaXRvclF1ZXVlLkVfSEFORExFUl9TVFIsIGhhbmRsZXJJZCk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIGluZm8gPSBudWxsO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChpbmZvICE9PSBudWxsKSB7XHJcbiAgICAgICAgLy8gQlJLX0xFVkVMX0hBTkRMRVJfSU5URVJOQUwsQlJLX0xFVkVMX0hBTkRMRVJfU1lTVEVNLEJSS19MRVZFTF9IQU5ETEVSX1RJTUVSXHJcbiAgICAgICAgLy8gQlJLX0xFVkVMX0hBTkRMRVJfRVhQUkVTU0lPTixCUktfTEVWRUxfSEFORExFUl9FUlJPUixCUktfTEVWRUxfSEFORExFUl9VU0VSXHJcbiAgICAgICAgYWN0LnNldEluZm8oaW5mbyk7XHJcbiAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlU3VwcG9ydFRvTG9nKHRhc2tJbmZvICtcIjogXCIgKyBpbmZvLCB0cnVlKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9xdWV1ZS5wdXQoYWN0KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidHJpZ2dlcmVkQnlWYXJOYW1lXCI+dmFyIG5hbWUgLCBoYXMgdHJpZ2dlcmVkIFJlY29tcHV0ZVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIGFkZFJlY29tcHV0ZSh0cmlnZ2VyZWRCeVZhck5hbWU6IHN0cmluZywgdGFza0luZm86IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX2VuYWJsZWQgJiYgdGhpcy5faXNSZWNvbXB1dGUpIHtcclxuICAgICAgbGV0IGFjdDogQWN0aXZpdHlJdGVtID0gbmV3IEFjdGl2aXR5SXRlbSh0aGlzLCBGbG93TW9uaXRvclF1ZXVlLkFDVF9SRUNPTVBVVEUsIEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9SRUNPTVApO1xyXG4gICAgICBsZXQgaW5mbyA9IEZsb3dNb25pdG9yUXVldWUuUkVDT01QX1NUUiArIHRyaWdnZXJlZEJ5VmFyTmFtZTtcclxuICAgICAgYWN0LnNldEluZm8oaW5mbyk7XHJcbiAgICAgIHRoaXMuX3F1ZXVlLnB1dChhY3QpO1xyXG5cclxuICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlU3VwcG9ydFRvTG9nKHRhc2tJbmZvICtcIjogXCIgKyBpbmZvLCB0cnVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBBZGQgYSBmaWVsZCBmbG93IG9wZXJhdGlvbiBhY3Rpdml0eSBpdGVtLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJvcGVyXCI+VGhlIG9wZXJhdGlvbiBiZWluZyBsb2dnZWQuPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImJFeGVjdXRlZFwiPldpbGwgdGhlIG9wZXJhdGlvbiBiZSBleGVjdXRlZC48L3BhcmFtPlxyXG4gIGFzeW5jIGFkZEZsb3dGaWVsZE9wZXJhdGlvbihvcGVyOiBPcGVyYXRpb24sIGJFeGVjdXRlZDogYm9vbGVhbiwgdGFza0luZm86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHRoaXMuX2VuYWJsZWQgJiYgdGhpcy5faXNGbG93T3BlcmF0aW9uKSB7XHJcbiAgICAgIGxldCBhY3Q6IEFjdGl2aXR5SXRlbSA9IG5ldyBBY3Rpdml0eUl0ZW0odGhpcywgRmxvd01vbml0b3JRdWV1ZS5BQ1RfRkxXX09QRVIsIEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9EQVRBX09QRVIpO1xyXG4gICAgICBsZXQgYnVmZmVyOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoRmxvd01vbml0b3JRdWV1ZS5GTFdfUEVSRklYKTtcclxuICAgICAgYXdhaXQgb3Blci5BZGRGbG93RGVzY3JpcHRpb24oYnVmZmVyKTtcclxuICAgICAgYnVmZmVyLkFwcGVuZCgnICcpO1xyXG5cclxuXHJcbiAgICAgIGlmICghYkV4ZWN1dGVkKVxyXG4gICAgICAgIGJ1ZmZlci5BcHBlbmQoXCJbTm90IEV4ZWN1dGVkXVwiKTtcclxuXHJcbiAgICAgIGxldCBpbmZvID0gYnVmZmVyLlRvU3RyaW5nKCk7XHJcbiAgICAgIGFjdC5zZXRJbmZvKGluZm8pO1xyXG4gICAgICB0aGlzLl9xdWV1ZS5wdXQoYWN0KTtcclxuXHJcbiAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZVN1cHBvcnRUb0xvZyh0YXNrSW5mbyArXCI6IFwiICsgaW5mbywgdHJ1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInN0YXRlXCI+b2YgdGhlIHVwZGF0ZVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIGFkZEZsb3dPcGVyYXRpb25VcGRhdGUoc3RhdGU6IG51bWJlciwgdGFza0luZm86IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX2VuYWJsZWQgJiYgdGhpcy5faXNGbG93T3BlcmF0aW9uKSB7XHJcbiAgICAgIGxldCBhY3Q6IEFjdGl2aXR5SXRlbSA9IG5ldyBBY3Rpdml0eUl0ZW0odGhpcywgRmxvd01vbml0b3JRdWV1ZS5BQ1RfRkxXX09QRVIsIEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9EQVRBX09QRVIpOyAvLyBNR19PUEVSX1VQREFURVxyXG4gICAgICBsZXQgaW5mbzogc3RyaW5nO1xyXG4gICAgICBpZiAoc3RhdGUgPT09IEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9TVEFSVClcclxuICAgICAgICBpbmZvID0gXCJTdGFydHMgVXBkYXRlXCI7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBpbmZvID0gIFwiRW5kcyBVcGRhdGVcIjtcclxuXHJcbiAgICAgIGFjdC5zZXRJbmZvKGluZm8pO1xyXG4gICAgICB0aGlzLl9xdWV1ZS5wdXQoYWN0KTtcclxuXHJcbiAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZVN1cHBvcnRUb0xvZyh0YXNrSW5mbyArXCI6IFwiICsgaW5mbywgdHJ1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImluZm9cIj5zdHJpbmcgcGFzc2VkIHRvIHN0YXR1cyBsaW5lIHZlcmlmeSBhY3Rpb248L3BhcmFtPlxyXG4gIGFkZEZsb3dWZXJpZnlJbmZvKGluZm86IHN0cmluZywgdGFza0luZm86IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5hZGRGbG93SW5mbyhpbmZvLCB0YXNrSW5mbyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImluZm9cIj5zdHJpbmcgYWRkZWQgdG8gZmxvdyBtb25pdG9yIHF1ZXVlIGZvciBJbnZva2VPczwvcGFyYW0+XHJcbiAgYWRkRmxvd0ludm9rZU9zSW5mbyhpbmZvOiBzdHJpbmcsIHRhc2tJbmZvOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuYWRkRmxvd0luZm8oaW5mbywgdGFza0luZm8pO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHVzZXIgc3RyaW5nIHBhc3NlZCB0byBzdGF0dXMgbGluZSBmb3IgYWN0aW9uc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpbmZvXCI+XHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhZGRGbG93SW5mbyhpbmZvOiBzdHJpbmcsIHRhc2tJbmZvOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5fZW5hYmxlZClcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIGxldCBhY3Q6IEFjdGl2aXR5SXRlbSA9IG5ldyBBY3Rpdml0eUl0ZW0odGhpcywgRmxvd01vbml0b3JRdWV1ZS5BQ1RfRkxXX09QRVIsIEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9EQVRBX09QRVIpO1xyXG4gICAgbGV0IGJ1ZmZlcjogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKFwiXCIpO1xyXG5cclxuICAgIGlmICghKGluZm8gPT09IFwiXCIpKSB7XHJcbiAgICAgIGJ1ZmZlci5BcHBlbmQoXCIgPj4gSU5GT1JNQVRJT04gPj4gXCIpO1xyXG4gICAgICBidWZmZXIuQXBwZW5kKGluZm8pO1xyXG4gICAgfVxyXG4gICAgbGV0IG5ld0luZm8gPSBidWZmZXIuVG9TdHJpbmcoKTtcclxuICAgIGFjdC5zZXRJbmZvKG5ld0luZm8pO1xyXG4gICAgdGhpcy5fcXVldWUucHV0KGFjdCk7XHJcblxyXG4gICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlU3VwcG9ydFRvTG9nKHRhc2tJbmZvICtcIjogXCIgKyBuZXdJbmZvLCB0cnVlKTtcclxuICB9XHJcbn1cclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuLy8vICAgYWxsIGluZm9ybWF0aW9uIGFib3V0IGN1cnJlbnQgQWN0aXZpdHlcclxuLy8vIDwvc3VtbWFyeT5cclxuY2xhc3MgQWN0aXZpdHlJdGVtIHtcclxuICBwcml2YXRlIF9pZDogbnVtYmVyID0gMDtcclxuICBwcml2YXRlIF90eXBlOiBzdHJpbmcgPSBudWxsOyAvLyBBQ1RZX1RBU0t8QUNUX1RBU0tfRkxXfEFDVF9EQVRBVklFV3xBQ1RfUkVDT01QVVRFfEFDVF9GTFdfT1BFUlxyXG4gIHByaXZhdGUgX2luZm86IHN0cmluZyA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfdGltZTogc3RyaW5nID0gbnVsbDtcclxuXHJcbiAgY29uc3RydWN0b3IoZW5jbG9zaW5nSW5zdGFuY2U6IEZsb3dNb25pdG9yUXVldWUsIHR5cGU6IHN0cmluZywgaWQ6IG51bWJlcikge1xyXG4gICAgdGhpcy5fdHlwZSA9IHR5cGU7XHJcbiAgICB0aGlzLl9pZCA9IGlkO1xyXG4gICAgdGhpcy5zZXRUaW1lKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2F2ZSBjdXJyZW50IHRpbWUgaW4gdGhlIG5lZWRlZCBmb3JtYXRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgc2V0VGltZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuX3RpbWUgPSBEYXRlVGltZVV0aWxzLlRvU3RyaW5nKERhdGVUaW1lLk5vdywgRmxvd01vbml0b3JRdWV1ZS5Mb25nVGltZVBhdHRlcm4sIExvZ2dlci5JbnN0YW5jZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IGFkZGVkIGluZm9ybWF0aW9uIGZvciB0aGUgYWN0aXZpdHlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldEluZm8oaW5mb186IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5faW5mbyA9ICgoaW5mb18gIT09IG51bGwpID8gWG1sUGFyc2VyLmVzY2FwZShpbmZvXykgOiBpbmZvXyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYnVpbGQgWE1MIHN0cmluZyBmb3IgdGhlIGFjdGl2aXR5IGl0ZW1cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGJ1aWxkWE1MKG1lc3NhZ2U6IFN0cmluZ0J1aWxkZXIpOiB2b2lkIHtcclxuICAgIG1lc3NhZ2UuQXBwZW5kKFhNTENvbnN0YW50cy5TVEFSVF9UQUcgKyBDb25zdEludGVyZmFjZS5NR19UQUdfRkxXTVRSX0FDVCk7XHJcbiAgICBtZXNzYWdlLkFwcGVuZChcIiBcIiArIFhNTENvbnN0YW50cy5NR19BVFRSX1RZUEUgKyBcIj1cXFwiXCIgKyB0aGlzLl90eXBlICsgXCJcXFwiXCIpO1xyXG4gICAgbWVzc2FnZS5BcHBlbmQoXCIgXCIgKyBYTUxDb25zdGFudHMuTUdfQVRUUl9JRCArIFwiPVxcXCJcIiArIHRoaXMuX2lkICsgXCJcXFwiXCIpO1xyXG4gICAgaWYgKHRoaXMuX2luZm8gIT0gbnVsbClcclxuICAgICAgbWVzc2FnZS5BcHBlbmQoXCIgXCIgKyBDb25zdEludGVyZmFjZS5NR19BVFRSX0lORk8gKyBcIj1cXFwiXCIgKyB0aGlzLl9pbmZvICsgXCJcXFwiXCIpO1xyXG4gICAgbWVzc2FnZS5BcHBlbmQoXCIgXCIgKyBDb25zdEludGVyZmFjZS5NR19BVFRSX1RJTUUgKyBcIj1cXFwiXCIgKyB0aGlzLl90aW1lICsgXCJcXFwiXCIpO1xyXG4gICAgbWVzc2FnZS5BcHBlbmQoWE1MQ29uc3RhbnRzLlRBR19URVJNKTtcclxuICB9XHJcbn1cclxuIl19
|