@magic-xpa/engine 4.1100.0-dev4110.23 → 4.1100.0-dev4110.236
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 +416 -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 +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/{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 +227 -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 +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/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 +1224 -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 +880 -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 +2499 -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 +29797 -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 +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 +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 +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/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/bridge/MagicBridge.mjs +0 -41
- 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,866 @@
|
|
1
|
+
import { DataModificationTypes, EMPTY_DCREF, ExpVal, ObjectReferenceBase, ObjectReferencesCollection, RecordUtils } from '@magic-xpa/gui';
|
2
|
+
import { ApplicationException, Int32, ISO_8859_1_Encoding, NNumber, NString, RefParam, StringBuilder, isNullOrUndefined } from '@magic-xpa/mscorelib';
|
3
|
+
import { Base64, Constants, Logger, StorageAttribute, StorageAttributeCheck, StrUtil, UtilStrByteMode, XMLConstants, XmlParser } from '@magic-xpa/utils';
|
4
|
+
import { ExpressionEvaluator, NullValueException } from '../exp/ExpressionEvaluator';
|
5
|
+
import { ConstInterface } from '../ConstInterface';
|
6
|
+
import { Environment } from '../env/Environment';
|
7
|
+
import { DataViewBase } from './DataViewBase';
|
8
|
+
import { RemoteCommandsProcessor } from "../remote/RemoteCommandsProcessor";
|
9
|
+
export class Record {
|
10
|
+
static FLAG_NULL = (0x01);
|
11
|
+
static FLAG_INVALID = (0x02);
|
12
|
+
static FLAG_MODIFIED = (0x04);
|
13
|
+
static FLAG_UPDATED = (0x08);
|
14
|
+
static FLAG_CRSR_MODIFIED = (0x10);
|
15
|
+
static FLAG_VALUE_NOT_PASSED = (0x20);
|
16
|
+
static FLAG_MODIFIED_ATLEAST_ONCE = (0x40);
|
17
|
+
_id = Int32.MinValue;
|
18
|
+
dbViewRowIdx = 0;
|
19
|
+
_mode = DataModificationTypes.None;
|
20
|
+
_dcRefs = null;
|
21
|
+
_inCompute = false;
|
22
|
+
_inRecompute = false;
|
23
|
+
_newRec = false;
|
24
|
+
get InCompute() {
|
25
|
+
return this._inCompute;
|
26
|
+
}
|
27
|
+
get InRecompute() {
|
28
|
+
return this._inRecompute;
|
29
|
+
}
|
30
|
+
static INCREASE = true;
|
31
|
+
static DECREASE = false;
|
32
|
+
_tableCache;
|
33
|
+
_inDeleteProcess;
|
34
|
+
_addAfter;
|
35
|
+
_causeInvalidation;
|
36
|
+
_dbPosBase64Val;
|
37
|
+
_dataview = null;
|
38
|
+
_fieldsData;
|
39
|
+
_flags;
|
40
|
+
_flagsHistory;
|
41
|
+
_forceSaveOrg;
|
42
|
+
_hashKey;
|
43
|
+
_computed;
|
44
|
+
_lateCompute;
|
45
|
+
_linksFldsPos;
|
46
|
+
_modified;
|
47
|
+
_next;
|
48
|
+
_prev;
|
49
|
+
_sendToServer = true;
|
50
|
+
_updated;
|
51
|
+
InForceUpdate;
|
52
|
+
Synced;
|
53
|
+
ValueInBase64;
|
54
|
+
constructor(dvOrTableCacheOrCIdOrRecord, dataview) {
|
55
|
+
if (dvOrTableCacheOrCIdOrRecord instanceof Record)
|
56
|
+
Object.assign(this, dvOrTableCacheOrCIdOrRecord);
|
57
|
+
else if (arguments.length === 1)
|
58
|
+
this.constructor_0(dvOrTableCacheOrCIdOrRecord);
|
59
|
+
else
|
60
|
+
this.constructor_1(dvOrTableCacheOrCIdOrRecord, dataview);
|
61
|
+
}
|
62
|
+
constructor_0(dvOrTableCache) {
|
63
|
+
if (dvOrTableCache instanceof DataViewBase)
|
64
|
+
this._dataview = dvOrTableCache;
|
65
|
+
else
|
66
|
+
this._tableCache = dvOrTableCache;
|
67
|
+
this._fieldsData = new Array(this.getFieldsTab().getSize());
|
68
|
+
this._flags = new Uint8Array(this.getFieldsTab().getSize());
|
69
|
+
this._flagsHistory = new Uint8Array(this.getFieldsTab().getSize());
|
70
|
+
this._dcRefs = new ObjectReferencesCollection();
|
71
|
+
}
|
72
|
+
Initialize() {
|
73
|
+
for (let i = 0; i < this._flags.length; i = i + 1) {
|
74
|
+
let field = this.getFieldsTab().getField(i);
|
75
|
+
this._flags[i] = ((field.isNullDefault() || field.getType() === StorageAttribute.BLOB_VECTOR) ? Record.FLAG_NULL : 0);
|
76
|
+
if (this._dataview !== null && field.IsVirtual) {
|
77
|
+
let record = this._dataview.getCurrRec();
|
78
|
+
if (record != null && record.IsFldModifiedAtLeastOnce(i)) {
|
79
|
+
this.setFlag(i, Record.FLAG_MODIFIED_ATLEAST_ONCE);
|
80
|
+
}
|
81
|
+
}
|
82
|
+
this._flagsHistory[i] = this._flags[i];
|
83
|
+
}
|
84
|
+
this.setNewRec();
|
85
|
+
}
|
86
|
+
constructor_1(cId, dataview) {
|
87
|
+
this.constructor_0(dataview);
|
88
|
+
this.setId(cId);
|
89
|
+
}
|
90
|
+
get Modified() {
|
91
|
+
return this._modified;
|
92
|
+
}
|
93
|
+
get Updated() {
|
94
|
+
return this._updated;
|
95
|
+
}
|
96
|
+
get SendToServer() {
|
97
|
+
return this._sendToServer;
|
98
|
+
}
|
99
|
+
CompareTo(obj) {
|
100
|
+
let res = 0;
|
101
|
+
let compTo = obj;
|
102
|
+
let key = this._tableCache.GetKeyById(this._tableCache.GetCurrSortKey());
|
103
|
+
if (key != null) {
|
104
|
+
for (let i = 0; i < key.Columns.length; i++) {
|
105
|
+
let currFld = key.Columns.get_Item(i);
|
106
|
+
let currFldId = currFld.getId();
|
107
|
+
if (this.IsNull(currFldId) && compTo.IsNull(currFldId))
|
108
|
+
continue;
|
109
|
+
else if (this.IsNull(currFldId) && !compTo.IsNull(currFldId)) {
|
110
|
+
res = 1;
|
111
|
+
break;
|
112
|
+
}
|
113
|
+
else if (!this.IsNull(currFldId) && compTo.IsNull(currFldId)) {
|
114
|
+
res = -1;
|
115
|
+
break;
|
116
|
+
}
|
117
|
+
else {
|
118
|
+
try {
|
119
|
+
let first = new ExpVal(currFld.getType(), false, this.GetFieldValue(currFldId));
|
120
|
+
let second = new ExpVal(currFld.getType(), false, compTo.GetFieldValue(currFldId));
|
121
|
+
res = ExpressionEvaluator.val_cmp_any(first, second);
|
122
|
+
if (res !== 0)
|
123
|
+
break;
|
124
|
+
}
|
125
|
+
catch (err) {
|
126
|
+
if (err instanceof NullValueException)
|
127
|
+
Logger.Instance.WriteExceptionToLogWithMsg(" in Record.CompareTo null value was reached");
|
128
|
+
}
|
129
|
+
}
|
130
|
+
}
|
131
|
+
return res;
|
132
|
+
}
|
133
|
+
else {
|
134
|
+
res = -1;
|
135
|
+
return res;
|
136
|
+
}
|
137
|
+
}
|
138
|
+
getMode() {
|
139
|
+
return this._mode;
|
140
|
+
}
|
141
|
+
getId() {
|
142
|
+
return this._id;
|
143
|
+
}
|
144
|
+
isNewRec() {
|
145
|
+
return this._newRec;
|
146
|
+
}
|
147
|
+
getFieldDataXML(fldIdx, getOldVal) {
|
148
|
+
let fldVal;
|
149
|
+
if (!getOldVal)
|
150
|
+
fldVal = this.GetFieldValue(fldIdx);
|
151
|
+
else
|
152
|
+
fldVal = (this.getFieldsTab().getField(fldIdx)).getOriginalValue();
|
153
|
+
if (fldVal == null)
|
154
|
+
throw new ApplicationException("in Record.buildFieldsData() null field value!\nField id: " + fldIdx);
|
155
|
+
let tmpBuf = this.getXMLForValue(fldIdx, fldVal);
|
156
|
+
return XmlParser.escape(tmpBuf.toString()).toString();
|
157
|
+
}
|
158
|
+
getFieldsTab() {
|
159
|
+
if (this._dataview !== null)
|
160
|
+
return this._dataview.GetFieldsTab();
|
161
|
+
else
|
162
|
+
return this._tableCache.FldsTab;
|
163
|
+
}
|
164
|
+
setInitialFldVals(clobberedOnly, isNewRec) {
|
165
|
+
let i, size;
|
166
|
+
let fld = null;
|
167
|
+
size = this.getSizeFld(true);
|
168
|
+
for (i = 0; i < size; i++) {
|
169
|
+
if (this._fieldsData[i] === null || typeof this._fieldsData[i] === "undefined") {
|
170
|
+
fld = this.getFieldsTab().getField(i);
|
171
|
+
this._fieldsData[i] = fld.getNewRecValue(clobberedOnly);
|
172
|
+
if (isNewRec && fld.IsVirtual && !fld.isNull())
|
173
|
+
this.clearFlag(fld.getId(), Record.FLAG_NULL);
|
174
|
+
if (fld.IsVirtual && fld.getModifiedAtLeastOnce())
|
175
|
+
this.setFlag(fld.getId(), Record.FLAG_MODIFIED_ATLEAST_ONCE);
|
176
|
+
if (this._fieldsData[i] === null || typeof this._fieldsData[i] === "undefined")
|
177
|
+
this._fieldsData[i] = fld.getDefaultValue();
|
178
|
+
}
|
179
|
+
}
|
180
|
+
}
|
181
|
+
setId(cId) {
|
182
|
+
this._id = cId;
|
183
|
+
this._hashKey = this._id;
|
184
|
+
}
|
185
|
+
setDBViewRowIdx(rowId) {
|
186
|
+
this.dbViewRowIdx = rowId;
|
187
|
+
}
|
188
|
+
getDBViewRowIdx() {
|
189
|
+
return this.dbViewRowIdx;
|
190
|
+
}
|
191
|
+
fillData(parser) {
|
192
|
+
let isCurrRec = false;
|
193
|
+
let endContext = parser.getXMLdata().indexOf(XMLConstants.TAG_TERM, parser.getCurrIndex());
|
194
|
+
if (endContext !== -1 && endContext < parser.getXMLdata().length) {
|
195
|
+
let tag = parser.getXMLsubstring(endContext);
|
196
|
+
parser.add2CurrIndex(tag.indexOf(ConstInterface.MG_TAG_REC) + ConstInterface.MG_TAG_REC.length);
|
197
|
+
let tokensVector = XmlParser.getTokens(parser.getXMLsubstring(endContext), XMLConstants.XML_ATTR_DELIM);
|
198
|
+
isCurrRec = this.initElements(tokensVector);
|
199
|
+
parser.setCurrIndex(endContext + XMLConstants.TAG_TERM.length);
|
200
|
+
}
|
201
|
+
else
|
202
|
+
Logger.Instance.WriteExceptionToLogWithMsg("in Record.FillInnerData() out of bounds");
|
203
|
+
return isCurrRec;
|
204
|
+
}
|
205
|
+
initElements(tokensVector) {
|
206
|
+
let attribute, valueStr;
|
207
|
+
let recFieldsData = null;
|
208
|
+
let recFlags = null;
|
209
|
+
let j = 0;
|
210
|
+
let isCurrRec;
|
211
|
+
isCurrRec = this.peekIsCurrRec(tokensVector);
|
212
|
+
for (; j < tokensVector.length; j += 2) {
|
213
|
+
attribute = (tokensVector.get_Item(j));
|
214
|
+
valueStr = (tokensVector.get_Item(j + 1));
|
215
|
+
switch (attribute) {
|
216
|
+
case ConstInterface.MG_ATTR_MODE:
|
217
|
+
this._mode = valueStr[0];
|
218
|
+
break;
|
219
|
+
case XMLConstants.MG_ATTR_ID:
|
220
|
+
this.setId(XmlParser.getInt(valueStr));
|
221
|
+
break;
|
222
|
+
case XMLConstants.MG_ATTR_VB_VIEW_ROWIDX:
|
223
|
+
this.setDBViewRowIdx(XmlParser.getInt(valueStr));
|
224
|
+
break;
|
225
|
+
case XMLConstants.MG_ATTR_VALUE:
|
226
|
+
if (this.ValueInBase64) {
|
227
|
+
recFieldsData = Base64.decode(valueStr);
|
228
|
+
}
|
229
|
+
else {
|
230
|
+
recFieldsData = XmlParser.unescape(valueStr);
|
231
|
+
}
|
232
|
+
break;
|
233
|
+
case ConstInterface.MG_ATTR_CURR_REC:
|
234
|
+
{
|
235
|
+
}
|
236
|
+
break;
|
237
|
+
case ConstInterface.MG_ATTR_ADD_AFTER:
|
238
|
+
this._addAfter = XmlParser.getInt(valueStr);
|
239
|
+
break;
|
240
|
+
case ConstInterface.MG_ATTR_FLAGS:
|
241
|
+
recFlags = valueStr;
|
242
|
+
break;
|
243
|
+
case ConstInterface.MG_ATTR_MODIFIED:
|
244
|
+
this._modified = true;
|
245
|
+
break;
|
246
|
+
case ConstInterface.MG_ATTR_DC_REFS:
|
247
|
+
this.fillDCRef(valueStr);
|
248
|
+
break;
|
249
|
+
case ConstInterface.MG_ATTR_DBPOS:
|
250
|
+
this._dbPosBase64Val = valueStr;
|
251
|
+
break;
|
252
|
+
default:
|
253
|
+
Logger.Instance.WriteExceptionToLogWithMsg("in Record.initElements() unknown attribute: " + attribute);
|
254
|
+
break;
|
255
|
+
}
|
256
|
+
}
|
257
|
+
if (this.ValueInBase64) {
|
258
|
+
let fldValInBytes = ISO_8859_1_Encoding.ISO_8859_1.GetBytes(recFieldsData);
|
259
|
+
this.fillFieldsData(fldValInBytes, recFlags);
|
260
|
+
}
|
261
|
+
else {
|
262
|
+
this.fillFieldsData(recFieldsData, recFlags, isCurrRec);
|
263
|
+
}
|
264
|
+
return isCurrRec;
|
265
|
+
}
|
266
|
+
peekIsCurrRec(tokensVector) {
|
267
|
+
let attribute;
|
268
|
+
let valueStr;
|
269
|
+
for (let j = 0; j < tokensVector.length; j += 2) {
|
270
|
+
attribute = (tokensVector.get_Item(j));
|
271
|
+
if (attribute === ConstInterface.MG_ATTR_CURR_REC) {
|
272
|
+
valueStr = (tokensVector.get_Item(j + 1));
|
273
|
+
return XmlParser.getBoolean(valueStr);
|
274
|
+
}
|
275
|
+
}
|
276
|
+
return false;
|
277
|
+
}
|
278
|
+
fillFieldsData(fldValInBytesOrFldsVal, recFlags, isCurrRec) {
|
279
|
+
if (isNullOrUndefined(isCurrRec))
|
280
|
+
this.fillFieldsData_0();
|
281
|
+
else
|
282
|
+
this.fillFieldsData_1(fldValInBytesOrFldsVal, recFlags, isCurrRec);
|
283
|
+
}
|
284
|
+
fillFieldsData_0() {
|
285
|
+
}
|
286
|
+
fillFieldsData_1(fldsVal, recFlags, isCurrRec) {
|
287
|
+
let val = null;
|
288
|
+
let tmp = null;
|
289
|
+
let parsedLen = new RefParam(0);
|
290
|
+
let i, j = 0, from, size;
|
291
|
+
let currType;
|
292
|
+
let useHex;
|
293
|
+
let fld = null;
|
294
|
+
let valueNotPassed;
|
295
|
+
from = this.getFromFldIdx(isCurrRec);
|
296
|
+
size = this.getSizeFld(isCurrRec);
|
297
|
+
for (i = from; j < size; i++, j++) {
|
298
|
+
fld = this.getFieldsTab().getField(i);
|
299
|
+
currType = fld.getType();
|
300
|
+
useHex = (Environment.Instance.GetDebugLevel() > 1 ||
|
301
|
+
currType === StorageAttribute.ALPHA ||
|
302
|
+
currType === StorageAttribute.UNICODE ||
|
303
|
+
StorageAttributeCheck.isTypeLogical(currType));
|
304
|
+
if (recFlags[j] === '.')
|
305
|
+
this._flags[i] = 0;
|
306
|
+
else if (recFlags[j] === '/')
|
307
|
+
this._flags[i] = 1;
|
308
|
+
else {
|
309
|
+
tmp = recFlags.substr(j * 2, 2);
|
310
|
+
this._flags[i] = parseInt(tmp, 16);
|
311
|
+
}
|
312
|
+
valueNotPassed = Record.FLAG_VALUE_NOT_PASSED === (this._flags[i] & Record.FLAG_VALUE_NOT_PASSED);
|
313
|
+
this._flags[i] = this._flags[i] & ~Record.FLAG_VALUE_NOT_PASSED;
|
314
|
+
this._flagsHistory[i] = this._flags[i];
|
315
|
+
if (Record.FLAG_UPDATED === (this._flags[i] & Record.FLAG_UPDATED))
|
316
|
+
this._updated = true;
|
317
|
+
if (valueNotPassed) {
|
318
|
+
if (Record.FLAG_NULL === (this._flags[i] & Record.FLAG_NULL)) {
|
319
|
+
val = fld.getDefaultValue();
|
320
|
+
}
|
321
|
+
else {
|
322
|
+
val = this._dataview.getCurrRec().GetFieldValue(i);
|
323
|
+
}
|
324
|
+
}
|
325
|
+
else {
|
326
|
+
val = RecordUtils.deSerializeItemVal(fldsVal, currType, fld.getSize(), useHex, fld.getCellsType(), parsedLen);
|
327
|
+
fldsVal = fldsVal.substr(parsedLen.value);
|
328
|
+
}
|
329
|
+
this._fieldsData[i] = val;
|
330
|
+
}
|
331
|
+
this.setInitialFldVals(false, false);
|
332
|
+
}
|
333
|
+
fillDCRef(valueStr) {
|
334
|
+
if (!NString.IsNullOrEmpty(valueStr)) {
|
335
|
+
let couples = StrUtil.tokenize(valueStr, "$");
|
336
|
+
let size = couples.length;
|
337
|
+
for (let i = 0; i < size; i = i + 1) {
|
338
|
+
this._dcRefs.Add(DcValuesReference.Parse(couples[i], this._dataview));
|
339
|
+
}
|
340
|
+
}
|
341
|
+
}
|
342
|
+
buildFieldsData(message, isCurrRec, getOldVal) {
|
343
|
+
let tmpStr = new StringBuilder();
|
344
|
+
let from = this.getFromFldIdx(isCurrRec);
|
345
|
+
let size = this.getSizeFld(isCurrRec);
|
346
|
+
for (let i = from; i < from + size; i = i + 1) {
|
347
|
+
let fld = this.getFieldsTab().getField(i);
|
348
|
+
if (fld.IsExposedToClient === false)
|
349
|
+
this.setShrinkFlag(i);
|
350
|
+
if (Record.FLAG_VALUE_NOT_PASSED === (this._flags[i] & Record.FLAG_VALUE_NOT_PASSED))
|
351
|
+
continue;
|
352
|
+
tmpStr.Append(this.getFieldDataXML(i, getOldVal).toString());
|
353
|
+
}
|
354
|
+
if (tmpStr.Length === 0) {
|
355
|
+
tmpStr.Append(" ");
|
356
|
+
}
|
357
|
+
message.Append(tmpStr.ToString());
|
358
|
+
}
|
359
|
+
getXMLForValue(fldIdx, fldVal) {
|
360
|
+
let cellAttr = StorageAttribute.SKIP;
|
361
|
+
let fldAttr = this.getFieldsTab().getType(fldIdx);
|
362
|
+
if (fldAttr === StorageAttribute.BLOB_VECTOR)
|
363
|
+
cellAttr = this.getFieldsTab().getField(fldIdx).getCellsType();
|
364
|
+
let toBase64 = Environment.Instance.GetDebugLevel() <= 1;
|
365
|
+
return Record.serializeItemVal(fldVal, fldAttr, cellAttr, toBase64);
|
366
|
+
}
|
367
|
+
getFromFldIdx(isCurrRec) {
|
368
|
+
if (isCurrRec)
|
369
|
+
return 0;
|
370
|
+
else
|
371
|
+
return this.getFieldsTab().getRMIdx();
|
372
|
+
}
|
373
|
+
getSizeFld(isCurrRec) {
|
374
|
+
if (isCurrRec)
|
375
|
+
return this.getFieldsTab().getSize();
|
376
|
+
else
|
377
|
+
return this.getFieldsTab().getRMSize();
|
378
|
+
}
|
379
|
+
buildXML(message, isCurrRec, forceBuild) {
|
380
|
+
if (isNullOrUndefined(forceBuild))
|
381
|
+
this.buildXML_0(message, isCurrRec);
|
382
|
+
else
|
383
|
+
this.buildXML_1(message, isCurrRec, forceBuild);
|
384
|
+
}
|
385
|
+
buildXML_0(message, isCurrRec) {
|
386
|
+
this.buildXML_1(message, isCurrRec, false);
|
387
|
+
}
|
388
|
+
buildXML_1(message, isCurrRec, forceBuild) {
|
389
|
+
let recFlags;
|
390
|
+
let from, size, i;
|
391
|
+
let aFlag;
|
392
|
+
let hexFlag;
|
393
|
+
if (!forceBuild)
|
394
|
+
if (this._mode !== DataModificationTypes.Insert && this._mode !== DataModificationTypes.Update &&
|
395
|
+
this._mode !== DataModificationTypes.Delete && !isCurrRec)
|
396
|
+
return;
|
397
|
+
message.Append("\n <" + ConstInterface.MG_TAG_REC);
|
398
|
+
if (this._id > Int32.MinValue)
|
399
|
+
message.Append(" " + XMLConstants.MG_ATTR_ID + "=\"" + this._id + "\"");
|
400
|
+
message.Append(" " + ConstInterface.MG_ATTR_MODE + "=\"" + this._mode + "\"");
|
401
|
+
if (this._mode === DataModificationTypes.Insert && this._prev != null)
|
402
|
+
message.Append(" " + ConstInterface.MG_ATTR_ADD_AFTER + "=\"" + this._prev.getId() + "\"");
|
403
|
+
if (!forceBuild && !isCurrRec)
|
404
|
+
this.clearMode();
|
405
|
+
message.Append(" " + XMLConstants.MG_ATTR_VALUE + "=\"");
|
406
|
+
if (!forceBuild && isCurrRec)
|
407
|
+
this.setShrinkFlags();
|
408
|
+
let getOldVal;
|
409
|
+
if (this.Synced)
|
410
|
+
getOldVal = false;
|
411
|
+
else {
|
412
|
+
let task = this._dataview.getTask();
|
413
|
+
getOldVal = (!isCurrRec && (task.getLevel() === Constants.TASK_LEVEL_RECORD ||
|
414
|
+
task.getLevel() === Constants.TASK_LEVEL_CONTROL) &&
|
415
|
+
this._dataview.getCurrRec() != null && this._dataview.getCurrRec().getId() === this._id);
|
416
|
+
}
|
417
|
+
this.buildFieldsData(message, isCurrRec, getOldVal);
|
418
|
+
message.Append("\"");
|
419
|
+
recFlags = new StringBuilder();
|
420
|
+
from = this.getFromFldIdx(isCurrRec);
|
421
|
+
size = this.getSizeFld(isCurrRec);
|
422
|
+
for (i = from; i < from + size; i++) {
|
423
|
+
aFlag = this._flagsHistory[i];
|
424
|
+
aFlag = aFlag & Record.FLAG_CRSR_MODIFIED;
|
425
|
+
aFlag = aFlag | this._flags[i];
|
426
|
+
hexFlag = NNumber.ToString(aFlag, "X2");
|
427
|
+
recFlags.Append(hexFlag);
|
428
|
+
if (isCurrRec)
|
429
|
+
this._flags[i] = (this._flags[i] & ~Record.FLAG_VALUE_NOT_PASSED);
|
430
|
+
}
|
431
|
+
message.Append(" " + ConstInterface.MG_ATTR_FLAGS + "=\"" + recFlags.ToString() + "\"");
|
432
|
+
if (isCurrRec) {
|
433
|
+
message.Append(" " + ConstInterface.MG_ATTR_CURR_REC + "=\"1\"");
|
434
|
+
if (this.Modified)
|
435
|
+
message.Append(" " + ConstInterface.MG_ATTR_MODIFIED + "=\"1\"");
|
436
|
+
}
|
437
|
+
if (this._linksFldsPos != null)
|
438
|
+
message.Append(" " + ConstInterface.MG_ATTR_DBPOS + "=\"" + XmlParser.escape(this._linksFldsPos) + "\" ");
|
439
|
+
message.Append(XMLConstants.TAG_TERM);
|
440
|
+
}
|
441
|
+
setShrinkFlags() {
|
442
|
+
let i;
|
443
|
+
let size = this.getSizeFld(true);
|
444
|
+
let serverCurrRec = this._dataview.getServerCurrRec();
|
445
|
+
if (serverCurrRec == null)
|
446
|
+
return;
|
447
|
+
for (i = 0; i < size; i++) {
|
448
|
+
if (this.fldValsEqual(serverCurrRec, i) || (Record.FLAG_NULL === (this._flags[i] & Record.FLAG_NULL))) {
|
449
|
+
this._flags[i] = this._flags[i] | Record.FLAG_VALUE_NOT_PASSED;
|
450
|
+
}
|
451
|
+
}
|
452
|
+
}
|
453
|
+
setShrinkFlag(fldIdx) {
|
454
|
+
this._flags[fldIdx] |= Record.FLAG_VALUE_NOT_PASSED;
|
455
|
+
}
|
456
|
+
SetFieldValue(idx, isNull, value) {
|
457
|
+
let field = this.getFieldsTab().getField(idx);
|
458
|
+
field.UpdateNull(isNull, this);
|
459
|
+
value = this.CheckMgValue(value, isNull, field);
|
460
|
+
this._fieldsData[idx] = value;
|
461
|
+
field.takeValFromRec();
|
462
|
+
this.clearFlag(field.getId(), Record.FLAG_INVALID);
|
463
|
+
field.invalidate(true, false);
|
464
|
+
}
|
465
|
+
setFieldValue(fldIdx, mgVal, setRecordUpdated) {
|
466
|
+
let fld = this.getFieldsTab().getField(fldIdx);
|
467
|
+
if (fld.PrevIsNull() === fld.isNull() && mgVal === this.GetFieldValue(fldIdx))
|
468
|
+
return;
|
469
|
+
mgVal = this.CheckMgValue(mgVal, fld.isNull(), fld);
|
470
|
+
if (fldIdx >= 0 && fldIdx < this.getFieldsTab().getSize()) {
|
471
|
+
this._fieldsData[fldIdx] = mgVal;
|
472
|
+
if (setRecordUpdated) {
|
473
|
+
if (fld.PartOfDataview)
|
474
|
+
this._modified = true;
|
475
|
+
if (RemoteCommandsProcessor.GetInstance().DelayCommandExecution) {
|
476
|
+
RemoteCommandsProcessor.GetInstance().DelayCommandExecution = false;
|
477
|
+
this._dataview.getTask().DelayCommandExecution = true;
|
478
|
+
}
|
479
|
+
this._dataview.setChanged(true);
|
480
|
+
this.setMode(DataModificationTypes.Update);
|
481
|
+
}
|
482
|
+
}
|
483
|
+
else
|
484
|
+
Logger.Instance.WriteExceptionToLogWithMsg("in Record.setFieldValue() illegal field index: " + fldIdx);
|
485
|
+
}
|
486
|
+
CheckMgValue(mgVal, isNull, fld) {
|
487
|
+
if (mgVal === null || isNull) {
|
488
|
+
mgVal = fld.getNullValue();
|
489
|
+
if (mgVal === null)
|
490
|
+
mgVal = fld.getMagicDefaultValue();
|
491
|
+
}
|
492
|
+
let size = fld.getSize();
|
493
|
+
if (UtilStrByteMode.isLocaleDefLangDBCS() && fld.getType() !== StorageAttribute.UNICODE) {
|
494
|
+
if (mgVal !== null && UtilStrByteMode.lenB(mgVal) > size)
|
495
|
+
mgVal = UtilStrByteMode.leftB(mgVal, size);
|
496
|
+
}
|
497
|
+
else {
|
498
|
+
if (mgVal !== null && mgVal.length > size)
|
499
|
+
mgVal = mgVal.substr(0, size);
|
500
|
+
}
|
501
|
+
return mgVal;
|
502
|
+
}
|
503
|
+
setModified() {
|
504
|
+
this._modified = true;
|
505
|
+
}
|
506
|
+
resetModified() {
|
507
|
+
this._modified = false;
|
508
|
+
}
|
509
|
+
setUpdated() {
|
510
|
+
this._updated = true;
|
511
|
+
}
|
512
|
+
resetUpdated() {
|
513
|
+
this._updated = false;
|
514
|
+
}
|
515
|
+
GetFieldValue(fldIdx) {
|
516
|
+
let val = null;
|
517
|
+
if (fldIdx >= 0 && fldIdx < this._fieldsData.length)
|
518
|
+
val = this._fieldsData[fldIdx];
|
519
|
+
return val.toString();
|
520
|
+
}
|
521
|
+
replicate() {
|
522
|
+
let record = new Record(this);
|
523
|
+
record._fieldsData = this._fieldsData.slice();
|
524
|
+
record._flags = this._flags.subarray(0);
|
525
|
+
record._flagsHistory = this._flagsHistory.subarray(0);
|
526
|
+
record._dcRefs = this._dcRefs.Clone();
|
527
|
+
return record;
|
528
|
+
}
|
529
|
+
setSameAs(rec, realOnly, rId) {
|
530
|
+
if (arguments.length === 3)
|
531
|
+
this.setSameAs_0(rec, realOnly, rId);
|
532
|
+
else
|
533
|
+
this.setSameAs_1(rec, realOnly);
|
534
|
+
}
|
535
|
+
setSameAs_0(rec, realOnly, rId) {
|
536
|
+
this.setSameAs(rec, realOnly);
|
537
|
+
this.setId(rId);
|
538
|
+
}
|
539
|
+
setSameAs_1(rec, realOnly) {
|
540
|
+
this._id = rec._id;
|
541
|
+
this._hashKey = rec._hashKey;
|
542
|
+
if (!this._dataview.getTask().transactionFailed(ConstInterface.TRANS_RECORD_PREFIX))
|
543
|
+
this.setMode(rec._mode);
|
544
|
+
this._addAfter = rec._addAfter;
|
545
|
+
if (realOnly) {
|
546
|
+
for (let i = 0; i < this.getFieldsTab().getSize(); i = i + 1) {
|
547
|
+
let afield = rec.getFieldsTab().getField(i);
|
548
|
+
if (!afield.IsVirtual) {
|
549
|
+
this._fieldsData[i] = rec._fieldsData[i];
|
550
|
+
this._flags[i] = rec._flags[i];
|
551
|
+
this._flagsHistory[i] = rec._flagsHistory[i];
|
552
|
+
}
|
553
|
+
}
|
554
|
+
}
|
555
|
+
else {
|
556
|
+
this._fieldsData = rec._fieldsData;
|
557
|
+
this._flags = rec._flags;
|
558
|
+
this._flagsHistory = rec._flagsHistory;
|
559
|
+
}
|
560
|
+
this._modified = rec._modified;
|
561
|
+
this._dataview = rec._dataview;
|
562
|
+
this._computed = rec._computed;
|
563
|
+
this._updated = rec._updated;
|
564
|
+
this.setDcRefs(rec._dcRefs);
|
565
|
+
if (rec._next !== this) {
|
566
|
+
this._next = rec._next;
|
567
|
+
}
|
568
|
+
if (rec._prev !== this) {
|
569
|
+
this._prev = rec._prev;
|
570
|
+
}
|
571
|
+
}
|
572
|
+
IsNull(fldIdx) {
|
573
|
+
this.checkFlags(fldIdx);
|
574
|
+
return ((this._flags[fldIdx] & Record.FLAG_NULL) === Record.FLAG_NULL);
|
575
|
+
}
|
576
|
+
isLinkInvalid(fldIdx) {
|
577
|
+
this.checkFlags(fldIdx);
|
578
|
+
return ((this._flags[fldIdx] & Record.FLAG_INVALID) === Record.FLAG_INVALID);
|
579
|
+
}
|
580
|
+
isFldModified(fldIdx) {
|
581
|
+
this.checkFlags(fldIdx);
|
582
|
+
return ((this._flags[fldIdx] & Record.FLAG_MODIFIED) === Record.FLAG_MODIFIED);
|
583
|
+
}
|
584
|
+
IsFldModifiedAtLeastOnce(fldIdx) {
|
585
|
+
this.checkFlags(fldIdx);
|
586
|
+
return ((this._flags[fldIdx] & Record.FLAG_MODIFIED_ATLEAST_ONCE) === Record.FLAG_MODIFIED_ATLEAST_ONCE);
|
587
|
+
}
|
588
|
+
isFldUpdated(fldIdx) {
|
589
|
+
this.checkFlags(fldIdx);
|
590
|
+
return ((this._flags[fldIdx] & Record.FLAG_UPDATED) === Record.FLAG_UPDATED);
|
591
|
+
}
|
592
|
+
setFlag(fldIdx, aFlag) {
|
593
|
+
this.checkFlags(fldIdx);
|
594
|
+
this._flags[fldIdx] = this._flags[fldIdx] | aFlag;
|
595
|
+
if (aFlag === Record.FLAG_CRSR_MODIFIED)
|
596
|
+
this._flagsHistory[fldIdx] = this._flagsHistory[fldIdx] | aFlag;
|
597
|
+
}
|
598
|
+
clearFlag(fldIdx, aFlags) {
|
599
|
+
this.checkFlags(fldIdx);
|
600
|
+
this._flags[fldIdx] = this._flags[fldIdx] & ~aFlags;
|
601
|
+
}
|
602
|
+
clearFlagsHistory() {
|
603
|
+
for (let i = 0; i < this._flags.length; i = i + 1)
|
604
|
+
this._flagsHistory[i] = 0;
|
605
|
+
}
|
606
|
+
clearFlags(aFlags) {
|
607
|
+
for (let i = 0; i < this._flags.length; i = i + 1)
|
608
|
+
this.clearFlag(i, aFlags);
|
609
|
+
}
|
610
|
+
clearFlagsForRealOnly(aFlags) {
|
611
|
+
for (let i = 0; i < this._flags.length; i = i + 1) {
|
612
|
+
let field = this.getFieldsTab().getField(i);
|
613
|
+
if (!field.IsVirtual) {
|
614
|
+
this.clearFlag(i, aFlags);
|
615
|
+
}
|
616
|
+
}
|
617
|
+
}
|
618
|
+
clearHistoryFlag(fldIdx) {
|
619
|
+
if (this._flagsHistory !== null && fldIdx < this.getFieldsTab().getSize() && fldIdx >= 0) {
|
620
|
+
this._flagsHistory[fldIdx] = 0;
|
621
|
+
}
|
622
|
+
}
|
623
|
+
checkFlags(fldIdx) {
|
624
|
+
if (this._flags === null || fldIdx >= this.getFieldsTab().getSize() || fldIdx < 0) {
|
625
|
+
throw new ApplicationException("Cannot find flags");
|
626
|
+
}
|
627
|
+
}
|
628
|
+
restart(oldMode) {
|
629
|
+
let task = this._dataview.getTask();
|
630
|
+
if (oldMode === DataModificationTypes.None) {
|
631
|
+
let rec = this._dataview.getCurrRec();
|
632
|
+
let isCurrRec = (rec != null && rec.getId() === this._id);
|
633
|
+
if ((this._dataview.getTask()).getMode() === Constants.TASK_MODE_CREATE)
|
634
|
+
if (isCurrRec && !task.getAfterRetry() && task.TryingToCommit && !this._dataview.inRollback())
|
635
|
+
oldMode = DataModificationTypes.Update;
|
636
|
+
else
|
637
|
+
oldMode = DataModificationTypes.Insert;
|
638
|
+
else
|
639
|
+
oldMode = DataModificationTypes.Update;
|
640
|
+
}
|
641
|
+
this.setMode(oldMode);
|
642
|
+
if (oldMode === DataModificationTypes.Insert)
|
643
|
+
this.setNewRec();
|
644
|
+
}
|
645
|
+
setLateCompute(val) {
|
646
|
+
this._lateCompute = val;
|
647
|
+
}
|
648
|
+
lateCompute() {
|
649
|
+
return this._lateCompute;
|
650
|
+
}
|
651
|
+
setInDeleteProcess(val) {
|
652
|
+
this._inDeleteProcess = val;
|
653
|
+
}
|
654
|
+
inDeleteProcess() {
|
655
|
+
return this._inDeleteProcess;
|
656
|
+
}
|
657
|
+
removeRecFromDc() {
|
658
|
+
if (this._dcRefs !== null) {
|
659
|
+
this._dcRefs.Dispose();
|
660
|
+
}
|
661
|
+
}
|
662
|
+
isSameRecData(rec, currRec, checkOnlyParetOfDataview) {
|
663
|
+
let size = this.getSizeFld(currRec);
|
664
|
+
let start = this.getFromFldIdx(currRec);
|
665
|
+
let i;
|
666
|
+
let field;
|
667
|
+
if (this === rec)
|
668
|
+
return true;
|
669
|
+
try {
|
670
|
+
if (rec.getSizeFld(currRec) !== size)
|
671
|
+
return false;
|
672
|
+
if (rec.getFromFldIdx(currRec) !== start)
|
673
|
+
return false;
|
674
|
+
for (i = 0; i < start + size; i++) {
|
675
|
+
field = this.getFieldsTab().getField(i);
|
676
|
+
if (checkOnlyParetOfDataview && !field.PartOfDataview)
|
677
|
+
continue;
|
678
|
+
if (!this.fldValsEqual(rec, i))
|
679
|
+
return false;
|
680
|
+
}
|
681
|
+
}
|
682
|
+
catch (err) {
|
683
|
+
if (err instanceof ApplicationException)
|
684
|
+
return false;
|
685
|
+
throw err;
|
686
|
+
}
|
687
|
+
return true;
|
688
|
+
}
|
689
|
+
fldValsEqual(rec, fldIdx) {
|
690
|
+
let type = this.getFieldsTab().getField(fldIdx).getType();
|
691
|
+
return ExpressionEvaluator.mgValsEqual(this.GetFieldValue(fldIdx), this.IsNull(fldIdx), type, rec.GetFieldValue(fldIdx), rec.IsNull(fldIdx), type);
|
692
|
+
}
|
693
|
+
getHashKey() {
|
694
|
+
return this._hashKey;
|
695
|
+
}
|
696
|
+
setNextRec(nextRec) {
|
697
|
+
this._next = nextRec;
|
698
|
+
}
|
699
|
+
setPrevRec(prevRec) {
|
700
|
+
this._prev = prevRec;
|
701
|
+
}
|
702
|
+
getPrevRec() {
|
703
|
+
return this._prev;
|
704
|
+
}
|
705
|
+
getNextRec() {
|
706
|
+
return this._next;
|
707
|
+
}
|
708
|
+
getDcRefs() {
|
709
|
+
return this._dcRefs.Clone();
|
710
|
+
}
|
711
|
+
setDcRefs(newDcRefs) {
|
712
|
+
this.removeRecFromDc();
|
713
|
+
this._dcRefs = newDcRefs.Clone();
|
714
|
+
this.SetDcValueId();
|
715
|
+
}
|
716
|
+
realModified() {
|
717
|
+
let bRc = false;
|
718
|
+
let tabSize = this.getFieldsTab().getSize();
|
719
|
+
let j;
|
720
|
+
for (j = 0; j < tabSize; j++) {
|
721
|
+
if ((this._flags[j] & Record.FLAG_MODIFIED) === Record.FLAG_MODIFIED) {
|
722
|
+
if (!(this.getFieldsTab().getField(j).IsVirtual)) {
|
723
|
+
bRc = true;
|
724
|
+
break;
|
725
|
+
}
|
726
|
+
}
|
727
|
+
}
|
728
|
+
return bRc;
|
729
|
+
}
|
730
|
+
ToString() {
|
731
|
+
let str = new StringBuilder();
|
732
|
+
this.buildXML(str, (this._dataview.getCurrRec()).getId() === this._id, true);
|
733
|
+
return str.ToString();
|
734
|
+
}
|
735
|
+
setSendToServer(val) {
|
736
|
+
this._sendToServer = val;
|
737
|
+
}
|
738
|
+
getRecSize() {
|
739
|
+
let sum = 0;
|
740
|
+
for (let i = 0; i < this.getFieldsTab().getSize(); i = i + 1) {
|
741
|
+
let field = this.getFieldsTab().getField(i);
|
742
|
+
sum = sum + field.getSize();
|
743
|
+
}
|
744
|
+
return sum;
|
745
|
+
}
|
746
|
+
copyCrsrModifiedFlags(rec) {
|
747
|
+
let tabSize = this.getFieldsTab().getSize();
|
748
|
+
let j;
|
749
|
+
for (j = 0; j < tabSize; j++) {
|
750
|
+
this._flags[j] = rec._flags[j];
|
751
|
+
this._flags[j] = this._flags[j] & Record.FLAG_CRSR_MODIFIED;
|
752
|
+
}
|
753
|
+
}
|
754
|
+
getDbPosVal() {
|
755
|
+
return this._dbPosBase64Val;
|
756
|
+
}
|
757
|
+
buildLinksPosStr() {
|
758
|
+
let tbl = this._dataview.getTask().getDataviewHeaders();
|
759
|
+
if (tbl !== null) {
|
760
|
+
this._linksFldsPos = tbl.buildDbPosString();
|
761
|
+
}
|
762
|
+
}
|
763
|
+
setForceSaveOrg(val) {
|
764
|
+
this._forceSaveOrg = val;
|
765
|
+
}
|
766
|
+
getForceSaveOrg() {
|
767
|
+
return this._forceSaveOrg;
|
768
|
+
}
|
769
|
+
isCauseInvalidation() {
|
770
|
+
return this._causeInvalidation;
|
771
|
+
}
|
772
|
+
setCauseInvalidation(causeInvalidation) {
|
773
|
+
this._causeInvalidation = causeInvalidation;
|
774
|
+
}
|
775
|
+
isComputed() {
|
776
|
+
return this._computed;
|
777
|
+
}
|
778
|
+
setComputed(val) {
|
779
|
+
this._computed = val;
|
780
|
+
}
|
781
|
+
setInCompute(val) {
|
782
|
+
if (!val)
|
783
|
+
this.setComputed(true);
|
784
|
+
this._inCompute = val;
|
785
|
+
}
|
786
|
+
setInRecompute(val) {
|
787
|
+
this._inRecompute = val;
|
788
|
+
}
|
789
|
+
setMode(newMode) {
|
790
|
+
switch (newMode) {
|
791
|
+
case DataModificationTypes.None:
|
792
|
+
case DataModificationTypes.Insert:
|
793
|
+
case DataModificationTypes.Update:
|
794
|
+
case DataModificationTypes.Delete:
|
795
|
+
if (this._mode === DataModificationTypes.None ||
|
796
|
+
this._mode === DataModificationTypes.Update && newMode === DataModificationTypes.Delete)
|
797
|
+
this._mode = newMode;
|
798
|
+
break;
|
799
|
+
default:
|
800
|
+
Logger.Instance.WriteExceptionToLogWithMsg("in Record.setMode(): illegal mode: " + newMode);
|
801
|
+
break;
|
802
|
+
}
|
803
|
+
}
|
804
|
+
clearMode() {
|
805
|
+
this._mode = DataModificationTypes.None;
|
806
|
+
}
|
807
|
+
setOldRec() {
|
808
|
+
this._newRec = false;
|
809
|
+
}
|
810
|
+
setNewRec() {
|
811
|
+
this._newRec = true;
|
812
|
+
}
|
813
|
+
static serializeItemVal(itemVal, itemAttr, cellAttr, ToBase64) {
|
814
|
+
return RecordUtils.serializeItemVal(itemVal, itemAttr, cellAttr, ToBase64);
|
815
|
+
}
|
816
|
+
SetDcValueId() {
|
817
|
+
let form = this._dataview.getTask().getForm();
|
818
|
+
let mgControl = null;
|
819
|
+
if (form != null && this._dcRefs != null) {
|
820
|
+
this._dcRefs.Refs.forEach((dcRef) => {
|
821
|
+
mgControl = form.getCtrl(dcRef.ditIdx);
|
822
|
+
if (mgControl != null)
|
823
|
+
mgControl.setDcValId(dcRef.DcValues.getId());
|
824
|
+
});
|
825
|
+
}
|
826
|
+
}
|
827
|
+
resetDcValueId() {
|
828
|
+
let form = this._dataview.getTask().getForm();
|
829
|
+
let mgControl = null;
|
830
|
+
if (form != null && this._dcRefs != null) {
|
831
|
+
this._dcRefs.Refs.forEach(function (dcRef) {
|
832
|
+
mgControl = form.getCtrl(dcRef.ditIdx);
|
833
|
+
if (mgControl != null)
|
834
|
+
mgControl.setDcValId(EMPTY_DCREF);
|
835
|
+
});
|
836
|
+
}
|
837
|
+
}
|
838
|
+
AddDcValuesReference(controlId, dcValuesId) {
|
839
|
+
let dcValues = this._dataview.getDcValues(dcValuesId);
|
840
|
+
let dcRef = new DcValuesReference(controlId, dcValues);
|
841
|
+
if (this._dcRefs === null) {
|
842
|
+
this._dcRefs = new ObjectReferencesCollection();
|
843
|
+
}
|
844
|
+
this._dcRefs.Add(dcRef);
|
845
|
+
}
|
846
|
+
}
|
847
|
+
export class DcValuesReference extends ObjectReferenceBase {
|
848
|
+
ditIdx = 0;
|
849
|
+
get DcValues() {
|
850
|
+
return this.Referent;
|
851
|
+
}
|
852
|
+
constructor(controlId, referencedDcValues) {
|
853
|
+
super(referencedDcValues);
|
854
|
+
this.ditIdx = controlId;
|
855
|
+
}
|
856
|
+
Clone() {
|
857
|
+
return new DcValuesReference(this.ditIdx, this.Referent);
|
858
|
+
}
|
859
|
+
static Parse(couple, dcValuesOwner) {
|
860
|
+
let commaPos = couple.indexOf(",");
|
861
|
+
let controlId = NNumber.Parse(couple.substr(0, commaPos));
|
862
|
+
let dcId = NNumber.Parse(couple.substr(commaPos + 1));
|
863
|
+
return new DcValuesReference(controlId, dcValuesOwner.getDcValues(dcId));
|
864
|
+
}
|
865
|
+
}
|
866
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVjb3JkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZW5naW5lL3NyYy9kYXRhL1JlY29yZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wscUJBQXFCLEVBRXJCLFdBQVcsRUFDWCxNQUFNLEVBR04sbUJBQW1CLEVBQ25CLDBCQUEwQixFQUMxQixXQUFXLEVBQ1osTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQ0wsb0JBQW9CLEVBRXBCLEtBQUssRUFDTCxtQkFBbUIsRUFFbkIsT0FBTyxFQUNQLE9BQU8sRUFDUCxRQUFRLEVBQ1IsYUFBYSxFQUNiLGlCQUFpQixFQUNsQixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFDTCxNQUFNLEVBQ04sU0FBUyxFQUNULE1BQU0sRUFDTixnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3JCLE9BQU8sRUFDUCxlQUFlLEVBQ2YsWUFBWSxFQUNaLFNBQVMsRUFDVixNQUFNLGtCQUFrQixDQUFDO0FBSTFCLE9BQU8sRUFBQyxtQkFBbUIsRUFBRSxrQkFBa0IsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBTW5GLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUVqRCxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDL0MsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzVDLE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLG1DQUFtQyxDQUFDO0FBTzFFLE1BQU0sT0FBTyxNQUFNO0lBUVYsTUFBTSxDQUFDLFNBQVMsR0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRWxDLE1BQU0sQ0FBQyxZQUFZLEdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNyQyxNQUFNLENBQUMsYUFBYSxHQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdEMsTUFBTSxDQUFDLFlBQVks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QU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDbEUsSUFBSSxJQUFJLEdBQVcsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTlELE9BQU8sSUFBSSxpQkFBaUIsQ0FBQyxTQUFTLEVBQUUsYUFBYSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzNFLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgRGF0YU1vZGlmaWNhdGlvblR5cGVzLFxyXG4gIERjVmFsdWVzLFxyXG4gIEVNUFRZX0RDUkVGLFxyXG4gIEV4cFZhbCxcclxuICBGaWVsZERlZixcclxuICBJUmVjb3JkLFxyXG4gIE9iamVjdFJlZmVyZW5jZUJhc2UsXHJcbiAgT2JqZWN0UmVmZXJlbmNlc0NvbGxlY3Rpb24sXHJcbiAgUmVjb3JkVXRpbHNcclxufSBmcm9tICdAbWFnaWMteHBhL2d1aSc7XHJcbmltcG9ydCB7XHJcbiAgQXBwbGljYXRpb25FeGNlcHRpb24sXHJcbiAgSUNvbXBhcmFibGUsXHJcbiAgSW50MzIsXHJcbiAgSVNPXzg4NTlfMV9FbmNvZGluZyxcclxuICBMaXN0LFxyXG4gIE5OdW1iZXIsXHJcbiAgTlN0cmluZyxcclxuICBSZWZQYXJhbSxcclxuICBTdHJpbmdCdWlsZGVyLFxyXG4gIGlzTnVsbE9yVW5kZWZpbmVkXHJcbn0gZnJvbSAnQG1hZ2ljLXhwYS9tc2NvcmVsaWInO1xyXG5pbXBvcnQge1xyXG4gIEJhc2U2NCxcclxuICBDb25zdGFudHMsXHJcbiAgTG9nZ2VyLFxyXG4gIFN0b3JhZ2VBdHRyaWJ1dGUsXHJcbiAgU3RvcmFnZUF0dHJpYnV0ZUNoZWNrLFxyXG4gIFN0clV0aWwsXHJcbiAgVXRpbFN0ckJ5dGVNb2RlLFxyXG4gIFhNTENvbnN0YW50cyxcclxuICBYbWxQYXJzZXJcclxufSBmcm9tICdAbWFnaWMteHBhL3V0aWxzJztcclxuXHJcbmltcG9ydCB7RmllbGR9IGZyb20gJy4vRmllbGQnO1xyXG5pbXBvcnQge1RhYmxlQ2FjaGV9IGZyb20gJy4uL3J0L1RhYmxlQ2FjaGUnO1xyXG5pbXBvcnQge0V4cHJlc3Npb25FdmFsdWF0b3IsIE51bGxWYWx1ZUV4Y2VwdGlvbn0gZnJvbSAnLi4vZXhwL0V4cHJlc3Npb25FdmFsdWF0b3InO1xyXG5pbXBvcnQge0tleX0gZnJvbSAnLi9LZXknO1xyXG5pbXBvcnQge0ZpZWxkc1RhYmxlRXh0IGFzIEZpZWxkc1RhYmxlfSBmcm9tICcuL0ZpZWxkc1RhYmxlJztcclxuaW1wb3J0IHtUYXNrfSBmcm9tICcuLi90YXNrcy9UYXNrJztcclxuaW1wb3J0IHtNZ0NvbnRyb2x9IGZyb20gJy4uL2d1aS9NZ0NvbnRyb2wnO1xyXG5pbXBvcnQge01nRm9ybX0gZnJvbSAnLi4vZ3VpL01nRm9ybSc7XHJcbmltcG9ydCB7Q29uc3RJbnRlcmZhY2V9IGZyb20gJy4uL0NvbnN0SW50ZXJmYWNlJztcclxuaW1wb3J0IHtEYXRhdmlld0hlYWRlcnN9IGZyb20gJy4uL3J0L0RhdGF2aWV3SGVhZGVycyc7XHJcbmltcG9ydCB7RW52aXJvbm1lbnR9IGZyb20gJy4uL2Vudi9FbnZpcm9ubWVudCc7XHJcbmltcG9ydCB7RGF0YVZpZXdCYXNlfSBmcm9tICcuL0RhdGFWaWV3QmFzZSc7XHJcbmltcG9ydCB7UmVtb3RlQ29tbWFuZHNQcm9jZXNzb3J9IGZyb20gXCIuLi9yZW1vdGUvUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3JcIjtcclxuXHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbi8vLyAgIHRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIHJlY29yZCBvYmplY3RcclxuLy8vICAgaXQgcGFyc2VzIHRoZSA8cmVjLi4uPiB0YWdcclxuLy8vIDwvc3VtbWFyeT5cclxuZXhwb3J0IGNsYXNzIFJlY29yZCBpbXBsZW1lbnRzIElDb21wYXJhYmxlLCBJUmVjb3JkIHtcclxuICAvLyBBVFRFTlRJT04gISEhIHdoZW4geW91IGFkZC9tb2RpZnkvZGVsZXRlIGEgbWVtYmVyIHZhcmlhYmxlIGRvbid0IGZvcmdldCB0byB0YWtlIGNhcmVcclxuICAvLyBhYm91dCB0aGUgXCJzZXRTYW1lQXMoKVwiIGZ1bmN0aW9uXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBDT05TVEFOVFNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG5cclxuICBwdWJsaWMgc3RhdGljIEZMQUdfTlVMTDogbnVtYmVyID0gKDB4MDEpO1xyXG5cclxuICBwdWJsaWMgc3RhdGljIEZMQUdfSU5WQUxJRDogbnVtYmVyID0gKDB4MDIpO1xyXG4gIHB1YmxpYyBzdGF0aWMgRkxBR19NT0RJRklFRDogbnVtYmVyID0gKDB4MDQpO1xyXG4gIHB1YmxpYyBzdGF0aWMgRkxBR19VUERBVEVEOiBudW1iZXIgPSAoMHgwOCk7XHJcbiAgcHVibGljIHN0YXRpYyBGTEFHX0NSU1JfTU9ESUZJRUQ6IG51bWJlciA9ICgweDEwKTtcclxuICBwdWJsaWMgc3RhdGljIEZMQUdfVkFMVUVfTk9UX1BBU1NFRDogbnVtYmVyID0gKDB4MjApO1xyXG4gIHB1YmxpYyBzdGF0aWMgRkxBR19NT0RJRklFRF9BVExFQVNUX09OQ0U6IG51bWJlciA9ICgweDQwKTtcclxuXHJcbiAgcHJvdGVjdGVkIF9pZDogbnVtYmVyID0gSW50MzIuTWluVmFsdWU7XHJcbiAgcHJvdGVjdGVkIGRiVmlld1Jvd0lkeDogbnVtYmVyID0gMDtcclxuICBwcm90ZWN0ZWQgX21vZGU6IERhdGFNb2RpZmljYXRpb25UeXBlcyA9IERhdGFNb2RpZmljYXRpb25UeXBlcy5Ob25lO1xyXG5cclxuICBwcml2YXRlIF9kY1JlZnM6IE9iamVjdFJlZmVyZW5jZXNDb2xsZWN0aW9uID0gbnVsbDtcclxuICBfaW5Db21wdXRlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgX2luUmVjb21wdXRlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgX25ld1JlYzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBwdWJsaWMgZ2V0IEluQ29tcHV0ZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pbkNvbXB1dGU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IEluUmVjb21wdXRlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2luUmVjb21wdXRlO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHN0YXRpYyBJTkNSRUFTRTogYm9vbGVhbiA9IHRydWU7XHJcbiAgcHJvdGVjdGVkIHN0YXRpYyBERUNSRUFTRTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBwcm90ZWN0ZWQgX3RhYmxlQ2FjaGU6IFRhYmxlQ2FjaGU7IC8vIH1cclxuICAvLyB9IGZvciB1c2UgaWYgdGhlIHJlY29yZCBpcyBwYXJ0IG9mIHRhYmxlIGNhY2hlICh0aGVyZSBpcyBubyB3YXkgYm90aCBkdiBhbmQgdGFibGVjYWNoZSBhcmUgbm90IG51bGwgYXQgdGhlIHNhbWUgdGltZSAtXHJcblxyXG4gIHByb3RlY3RlZCBfaW5EZWxldGVQcm9jZXNzOiBib29sZWFuOyAvLyB3aWxsIGJlIHNldCB0byB0cnVlIGJlZm9yZSByZWMgc3VmZml4IGZyb20gZGVsbGluZS5cclxuICBwcm90ZWN0ZWQgX2FkZEFmdGVyOiBudW1iZXI7XHJcbiAgcHJvdGVjdGVkIF9jYXVzZUludmFsaWRhdGlvbjogYm9vbGVhbjsgLy8gRXhpdCBmcm9tIHRoaXMgcmVjb3JkIHdpbGwgY2F1c2UgaW52YWxpZGF0aW9uIG9mIGFsbCByb3dzIGluIHRhYmxlXHJcbiAgcHJvdGVjdGVkIF9kYlBvc0Jhc2U2NFZhbDogc3RyaW5nOyAvLyB1c2VkIG9ubHkgaW4gdGFibGUgY2FjaGUgcmVjb3JkcyBob2xkcyB0aGUgdGFibGVzIGRiX3BvcyB2YWx1ZSBpbiB0aGUgY3Vyc29yXHJcbiAgLy8gfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhleSBhcmUgTXV0dWFsbHkgZXhjbHVzaXZlKS5cclxuICBwcm90ZWN0ZWQgX2RhdGF2aWV3OiBEYXRhVmlld0Jhc2UgPSBudWxsO1xyXG4gIHByaXZhdGUgX2ZpZWxkc0RhdGE6IFN0cmluZ1tdO1xyXG4gIHByb3RlY3RlZCBfZmxhZ3M6IFVpbnQ4QXJyYXk7XHJcbiAgcHJvdGVjdGVkIF9mbGFnc0hpc3Rvcnk6IFVpbnQ4QXJyYXk7IC8vIEhpc3Rvcnkgb2YgZmxhZ3MsIHVzZWQgd2hlbiBjb250YWN0aW5nIHRoZSBzZXJ2ZXJcclxuICBwcm90ZWN0ZWQgX2ZvcmNlU2F2ZU9yZzogYm9vbGVhbjtcclxuICBwcm90ZWN0ZWQgX2hhc2hLZXk6IG51bWJlcjtcclxuXHJcbiAgcHJvdGVjdGVkIF9jb21wdXRlZDogYm9vbGVhbjtcclxuICBwcm90ZWN0ZWQgX2xhdGVDb21wdXRlOiBib29sZWFuOyAvLyB0aGlzIHJlY29yZCBtdXN0IGJlIGNvbXB1dGVkIG5leHQgdGltZSB3ZSBlbnRlciB0aGUgcmVjb3JkLCBidXQgbm90IGJlZm9yZVxyXG5cclxuICBwcm90ZWN0ZWQgX2xpbmtzRmxkc1Bvczogc3RyaW5nO1xyXG4gIHByb3RlY3RlZCBfbW9kaWZpZWQ6IGJvb2xlYW47XHJcblxyXG4gIHByb3RlY3RlZCBfbmV4dDogUmVjb3JkOyAgLy8gUG9pbnRzIHRvIHRoZSBuZXh0IHJlY29yZCwgd2hlbiBpdHMgcGFydCBvZiBhIGxpc3RcclxuICBwcm90ZWN0ZWQgX3ByZXY6IFJlY29yZDsgIC8vIFBvaW50cyB0byB0aGUgcHJldiByZWNvcmQsIHdoZW4gaXRzIHBhcnQgb2YgYSBsaXN0XHJcbiAgcHJvdGVjdGVkIF9zZW5kVG9TZXJ2ZXI6IGJvb2xlYW4gPSB0cnVlOyAvLyBJZiBmYWxzZSwgZG9uJ3Qgc2VuZCB0aGlzIHJlY29yZCB0byB0aGUgc2VydmVyLCBhcyBwYXJ0IG9mIHRoZSBtb2RpZmllZCBsaXN0XHJcbiAgcHJvdGVjdGVkIF91cGRhdGVkOiBib29sZWFuO1xyXG5cclxuICBwdWJsaWMgSW5Gb3JjZVVwZGF0ZTogYm9vbGVhbjtcclxuICBwdWJsaWMgU3luY2VkOiBib29sZWFuO1xyXG4gIHB1YmxpYyBWYWx1ZUluQmFzZTY0OiBib29sZWFuO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihkdk9yVGFibGVDYWNoZTogRGF0YVZpZXdCYXNlIHwgVGFibGVDYWNoZSk7XHJcbiAgY29uc3RydWN0b3IoY0lkOiBudW1iZXIsIGRhdGF2aWV3OiBEYXRhVmlld0Jhc2UpO1xyXG4gIGNvbnN0cnVjdG9yKFJlY29yZDogUmVjb3JkKTtcclxuICBjb25zdHJ1Y3Rvcihkdk9yVGFibGVDYWNoZU9yQ0lkT3JSZWNvcmQ6IGFueSwgZGF0YXZpZXc/OiBEYXRhVmlld0Jhc2UpXHJcbiAge1xyXG4gICAgaWYoZHZPclRhYmxlQ2FjaGVPckNJZE9yUmVjb3JkIGluc3RhbmNlb2YgIFJlY29yZClcclxuICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBkdk9yVGFibGVDYWNoZU9yQ0lkT3JSZWNvcmQpO1xyXG4gICAgZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSlcclxuICAgICAgdGhpcy5jb25zdHJ1Y3Rvcl8wKGR2T3JUYWJsZUNhY2hlT3JDSWRPclJlY29yZCk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuY29uc3RydWN0b3JfMShkdk9yVGFibGVDYWNoZU9yQ0lkT3JSZWNvcmQsIGRhdGF2aWV3KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjb25zdHJ1Y3RzIGEgbmV3IHJlY29yZCB0byBiZSB1c2VkIGJ5IHRoZSB0YWJsZSBjYWNoZSBvbmx5ISEhXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGNvbnN0cnVjdG9yXzAoZHZPclRhYmxlQ2FjaGU6IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKGR2T3JUYWJsZUNhY2hlIGluc3RhbmNlb2YgRGF0YVZpZXdCYXNlKVxyXG4gICAgICB0aGlzLl9kYXRhdmlldyA9IDxEYXRhVmlld0Jhc2U+ZHZPclRhYmxlQ2FjaGU7XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuX3RhYmxlQ2FjaGUgPSA8VGFibGVDYWNoZT5kdk9yVGFibGVDYWNoZTtcclxuXHJcbiAgICB0aGlzLl9maWVsZHNEYXRhID0gbmV3IEFycmF5PHN0cmluZz4odGhpcy5nZXRGaWVsZHNUYWIoKS5nZXRTaXplKCkpO1xyXG4gICAgdGhpcy5fZmxhZ3MgPSBuZXcgVWludDhBcnJheSh0aGlzLmdldEZpZWxkc1RhYigpLmdldFNpemUoKSk7XHJcbiAgICB0aGlzLl9mbGFnc0hpc3RvcnkgPSBuZXcgVWludDhBcnJheSh0aGlzLmdldEZpZWxkc1RhYigpLmdldFNpemUoKSk7XHJcbiAgICB0aGlzLl9kY1JlZnMgPSBuZXcgT2JqZWN0UmVmZXJlbmNlc0NvbGxlY3Rpb24oKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBJbml0aWFsaXplKCk6IHZvaWQge1xyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuX2ZsYWdzLmxlbmd0aDsgaSA9IGkgKyAxKSB7XHJcbiAgICAgIGxldCBmaWVsZDogRmllbGREZWYgPSB0aGlzLmdldEZpZWxkc1RhYigpLmdldEZpZWxkKGkpO1xyXG4gICAgICB0aGlzLl9mbGFnc1tpXSA9ICgoZmllbGQuaXNOdWxsRGVmYXVsdCgpIHx8IGZpZWxkLmdldFR5cGUoKSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CX1ZFQ1RPUikgPyBSZWNvcmQuRkxBR19OVUxMIDogMCk7XHJcblxyXG4gICAgICBpZiAodGhpcy5fZGF0YXZpZXcgIT09IG51bGwgJiYgKDxGaWVsZD5maWVsZCkuSXNWaXJ0dWFsKSB7XHJcbiAgICAgICAgbGV0IHJlY29yZDogUmVjb3JkID0gdGhpcy5fZGF0YXZpZXcuZ2V0Q3VyclJlYygpO1xyXG4gICAgICAgIGlmIChyZWNvcmQgIT0gbnVsbCAmJiByZWNvcmQuSXNGbGRNb2RpZmllZEF0TGVhc3RPbmNlKGkpKSB7XHJcbiAgICAgICAgICB0aGlzLnNldEZsYWcoaSwgUmVjb3JkLkZMQUdfTU9ESUZJRURfQVRMRUFTVF9PTkNFKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5fZmxhZ3NIaXN0b3J5W2ldID0gdGhpcy5fZmxhZ3NbaV07XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zZXROZXdSZWMoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBDVE9SXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNJZFwiPnRoZSBpZCBvZiB0aGUgcmVjb3JkPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZ0XCI+YSByZWZlcmVuY2UgdG8gdGhlIGZpZWxkcyB0YWJsZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbT4gIGNsb2JiZXJlZE9ubHkgaXMgdHJ1ZSBpZiB3ZSB3YW50IHRvIGluaXQgb25seSB0aGUgdmFsdWVzIG9mIHRoZSB2aXJ0dWFscyB3aXRoIG5vIGluaXQgZXhwcmVzc2lvbiA8L3BhcmFtPlxyXG4gIHByaXZhdGUgY29uc3RydWN0b3JfMShjSWQ6IG51bWJlciwgZGF0YXZpZXc6IERhdGFWaWV3QmFzZSk6IHZvaWQge1xyXG4gICAgdGhpcy5jb25zdHJ1Y3Rvcl8wKGRhdGF2aWV3KTtcclxuICAgIHRoaXMuc2V0SWQoY0lkKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgTW9kaWZpZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fbW9kaWZpZWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IFVwZGF0ZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fdXBkYXRlZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgU2VuZFRvU2VydmVyKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NlbmRUb1NlcnZlcjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBDb21wYXJlVG8ob2JqOiBPYmplY3QpOiBudW1iZXIge1xyXG4gICAgbGV0IHJlczogbnVtYmVyID0gMDtcclxuICAgIGxldCBjb21wVG8gPSA8UmVjb3JkPm9iajtcclxuXHJcbiAgICAvLyBnZXQgdGhlIGtleSBieSB3aGljaCB3ZSBhcmUgZG9pbmcgdGhlIENvbXBhcmlzb25cclxuICAgIGxldCBrZXk6IEtleSA9IHRoaXMuX3RhYmxlQ2FjaGUuR2V0S2V5QnlJZCh0aGlzLl90YWJsZUNhY2hlLkdldEN1cnJTb3J0S2V5KCkpO1xyXG5cclxuICAgIC8vIGlmIHRoZXJlIGlzIG5vIGtleSB0byBjb21wYXJlIGJ5IHRoZW4gdGhlIHJlY29yZHMgYXJlIHVuY29tcGFyYWJsZVxyXG4gICAgaWYgKGtleSAhPSBudWxsKSB7XHJcbiAgICAgIC8vIGFsbCB3ZSBuZWVkIGZyb20gdGhlIGtleSBpbiB0aGUgb3JkZXIgb2YgY29tcGFyaW5nIHRoZSB0aGUgcmVjb3JkIGZpZWxkc1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwga2V5LkNvbHVtbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBsZXQgY3VyckZsZCA9IGtleS5Db2x1bW5zLmdldF9JdGVtKGkpO1xyXG4gICAgICAgIGxldCBjdXJyRmxkSWQ6IG51bWJlciA9IGN1cnJGbGQuZ2V0SWQoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuSXNOdWxsKGN1cnJGbGRJZCkgJiYgY29tcFRvLklzTnVsbChjdXJyRmxkSWQpKVxyXG4gICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5Jc051bGwoY3VyckZsZElkKSAmJiAhY29tcFRvLklzTnVsbChjdXJyRmxkSWQpKSB7XHJcbiAgICAgICAgICAvLyBudWxsIGlzIHRoZSBncmVhdGVzdCB2YWx1ZSB0aGVyZWZvcmUgd2UgYXJlIHRoZSBncmVhdGVyXHJcbiAgICAgICAgICByZXMgPSAxO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKCF0aGlzLklzTnVsbChjdXJyRmxkSWQpICYmIGNvbXBUby5Jc051bGwoY3VyckZsZElkKSkge1xyXG4gICAgICAgICAgcmVzID0gLTE7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gYm90aCBhcmUgbm90IG51bGxcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGxldCBmaXJzdCA9IG5ldyBFeHBWYWwoY3VyckZsZC5nZXRUeXBlKCksIGZhbHNlLFxyXG4gICAgICAgICAgICAgIHRoaXMuR2V0RmllbGRWYWx1ZShjdXJyRmxkSWQpKTtcclxuICAgICAgICAgICAgbGV0IHNlY29uZCA9IG5ldyBFeHBWYWwoY3VyckZsZC5nZXRUeXBlKCksIGZhbHNlLFxyXG4gICAgICAgICAgICAgIGNvbXBUby5HZXRGaWVsZFZhbHVlKGN1cnJGbGRJZCkpO1xyXG5cclxuICAgICAgICAgICAgcmVzID0gRXhwcmVzc2lvbkV2YWx1YXRvci52YWxfY21wX2FueShmaXJzdCwgc2Vjb25kKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChyZXMgIT09IDApXHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBjYXRjaCAoZXJyKVxyXG4gICAgICAgICAgICAvLyBvbmUgb2YgdGhlIHZhbHVlcyB3ZSBhcmUgY29tcGFyaW5nIHVzaW5nIHZsX2NtcF9hbnkgIGlzIG51bGwgd2Ugc2hvdWxkIG5ldmVyIGdldCBoZXJlXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBOdWxsVmFsdWVFeGNlcHRpb24pXHJcbiAgICAgICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKFwiIGluIFJlY29yZC5Db21wYXJlVG8gbnVsbCB2YWx1ZSB3YXMgcmVhY2hlZFwiKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiByZXM7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgcmVzID0gLTE7XHJcbiAgICAgIHJldHVybiByZXM7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSBtb2RlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRNb2RlKCk6IERhdGFNb2RpZmljYXRpb25UeXBlcyB7XHJcbiAgICByZXR1cm4gdGhpcy5fbW9kZTtcclxuICB9XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSByZWNvcmQgaWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldElkKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5faWQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgYSBuZXcgcmVjb3JkIGp1c3QgY3JlYXRlZCBhbmQgbm8gcmVjb3JkIHN1ZmZpeCB3YXMgeWV0XHJcbiAgLy8vICAgcHJvY2Vzc2VkIG9uIGl0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpc05ld1JlYygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9uZXdSZWM7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYnVpbGQgdGhlIGZpZWxkIHZhbHVlIGZvciB0aGUgWE1MIHN0cmluZyBvZiB0aGlzIHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmbGRJZHhcIj5pbmRleCBvZiBmaWVsZDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIGdldEZpZWxkRGF0YVhNTChmbGRJZHg6IG51bWJlciwgZ2V0T2xkVmFsOiBib29sZWFuKTogc3RyaW5nIHtcclxuICAgIGxldCBmbGRWYWw6IHN0cmluZztcclxuXHJcbiAgICBpZiAoIWdldE9sZFZhbClcclxuICAgICAgZmxkVmFsID0gdGhpcy5HZXRGaWVsZFZhbHVlKGZsZElkeCk7XHJcbiAgICBlbHNlXHJcbiAgICAgIGZsZFZhbCA9ICg8RmllbGQ+KHRoaXMuZ2V0RmllbGRzVGFiKCkuZ2V0RmllbGQoZmxkSWR4KSkpLmdldE9yaWdpbmFsVmFsdWUoKTtcclxuICAgIGlmIChmbGRWYWwgPT0gbnVsbClcclxuICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uRXhjZXB0aW9uKFwiaW4gUmVjb3JkLmJ1aWxkRmllbGRzRGF0YSgpIG51bGwgZmllbGQgdmFsdWUhXFxuRmllbGQgaWQ6IFwiICsgZmxkSWR4KTtcclxuXHJcbiAgICBsZXQgdG1wQnVmOiBzdHJpbmcgPSB0aGlzLmdldFhNTEZvclZhbHVlKGZsZElkeCwgZmxkVmFsKTtcclxuICAgIHJldHVybiBYbWxQYXJzZXIuZXNjYXBlKHRtcEJ1Zi50b1N0cmluZygpKS50b1N0cmluZygpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBnZXQgZmllbGQgdGFibGUgZWl0aGVyIG9mIERhdGFWaWV3Um9vdCAoJ2R2SGVhZGVyJykgb3Igb2YgVGFibGVDYWNoZVxyXG4gIC8vLyBkdiBhbmQgdGFibGVDYWNoZSBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IGZpZWxkVGFibGUgPC9yZXR1cm5zPlxyXG4gIGdldEZpZWxkc1RhYigpOiBGaWVsZHNUYWJsZSB7XHJcbiAgICBpZiAodGhpcy5fZGF0YXZpZXcgIT09IG51bGwpXHJcbiAgICAgIHJldHVybiA8RmllbGRzVGFibGU+dGhpcy5fZGF0YXZpZXcuR2V0RmllbGRzVGFiKCk7XHJcblxyXG4gICAgZWxzZVxyXG4gICAgICByZXR1cm4gdGhpcy5fdGFibGVDYWNoZS5GbGRzVGFiO1xyXG4gIH1cclxuXHJcbiAgLy8gVE9ETyA6IGNoZWNrIGhvdyB0byBpbXBsZW1lbnQgZGVzdHJ1Y3RvcnNcclxuICAvLyB+UmVjb3JkKClcclxuICAvLyB7XHJcbiAgLy8gXHR0aGlzLnJlbW92ZVJlY0Zyb21EYygpO1xyXG4gIC8vIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgaW5pdGlhbCBmaWVsZCB2YWx1ZXMgZm9yIGZpZWxkcyB0aGF0IGhhcyBhIG51bGwgdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0+ICBjbG9iYmVyZWRPbmx5IGlzIHRydWUgaWYgd2Ugd2FudCB0byBpbml0IG9ubHkgdGhlIHZhbHVlcyBvZiB0aGUgdmlydHVhbHMgd2l0aCBubyBpbml0IGV4cHJlc3Npb24gPC9wYXJhbT5cclxuICBwdWJsaWMgc2V0SW5pdGlhbEZsZFZhbHMoY2xvYmJlcmVkT25seTogYm9vbGVhbiwgaXNOZXdSZWM6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGxldCBpOiBudW1iZXIsIHNpemU7XHJcbiAgICBsZXQgZmxkOiBGaWVsZCA9IG51bGw7XHJcbiAgICBzaXplID0gdGhpcy5nZXRTaXplRmxkKHRydWUpO1xyXG5cclxuICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHtcclxuICAgICAgLy8gcHV0IGluaXRpYWwgdmFsdWVzIHRvIHRoZSBmaWVsZHMgdXNpbmcgdGhlIE1hZ2ljIGRlZmF1bHQgdmFsdWVcclxuICAgICAgaWYgKHRoaXMuX2ZpZWxkc0RhdGFbaV0gPT09IG51bGwgfHwgdHlwZW9mIHRoaXMuX2ZpZWxkc0RhdGFbaV0gPT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICBmbGQgPSA8RmllbGQ+dGhpcy5nZXRGaWVsZHNUYWIoKS5nZXRGaWVsZChpKTtcclxuICAgICAgICB0aGlzLl9maWVsZHNEYXRhW2ldID0gZmxkLmdldE5ld1JlY1ZhbHVlKGNsb2JiZXJlZE9ubHkpO1xyXG5cclxuICAgICAgICBpZiAoaXNOZXdSZWMgJiYgZmxkLklzVmlydHVhbCAmJiAhZmxkLmlzTnVsbCgpKVxyXG4gICAgICAgICAgdGhpcy5jbGVhckZsYWcoZmxkLmdldElkKCksIFJlY29yZC5GTEFHX05VTEwpO1xyXG5cclxuICAgICAgICBpZiAoZmxkLklzVmlydHVhbCAmJiBmbGQuZ2V0TW9kaWZpZWRBdExlYXN0T25jZSgpKVxyXG4gICAgICAgICAgdGhpcy5zZXRGbGFnKGZsZC5nZXRJZCgpLCBSZWNvcmQuRkxBR19NT0RJRklFRF9BVExFQVNUX09OQ0UpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fZmllbGRzRGF0YVtpXSA9PT0gbnVsbCB8fCB0eXBlb2YgdGhpcy5fZmllbGRzRGF0YVtpXSA9PT0gXCJ1bmRlZmluZWRcIilcclxuICAgICAgICAgIHRoaXMuX2ZpZWxkc0RhdGFbaV0gPSBmbGQuZ2V0RGVmYXVsdFZhbHVlKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0cyB0aGUgaWQgb2YgdGhlIHJlY29yZCBhbmQgYW4gYXBwcm9wcmlhdGUgaGFzaCBrZXlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY0lkXCI+dGhlIGlkIG9mIHRoZSByZWNvcmQ8L3BhcmFtPlxyXG4gIHNldElkKGNJZDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl9pZCA9IGNJZDtcclxuICAgIHRoaXMuX2hhc2hLZXkgPSB0aGlzLl9pZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gc2V0cyB0aGUgZGJWaWV3Um93SWQgb2YgdGhlIHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjSWRcIj50aGUgaWQgb2YgdGhlIHJlY29yZDwvcGFyYW0+XHJcbiAgc2V0REJWaWV3Um93SWR4KHJvd0lkOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuZGJWaWV3Um93SWR4ID0gcm93SWQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHJldHVybiBkYlZpZXdSb3dJZCBvZiB0aGUgcmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNJZFwiPnRoZSBpZCBvZiB0aGUgcmVjb3JkPC9wYXJhbT5cclxuICBnZXREQlZpZXdSb3dJZHgoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLmRiVmlld1Jvd0lkeDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwYXJzZSBpbnB1dCBzdHJpbmcgYW5kIGZpbGwgaW5uZXIgZGF0YSAtIHJldHVybnMgdHJ1ZSB3aGVuIHRoZSByZWNvcmQgaXMgdGhlIGN1cnJlbnQgcmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBmaWxsRGF0YShwYXJzZXI6IFhtbFBhcnNlcik6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGlzQ3VyclJlYzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IGVuZENvbnRleHQ6IG51bWJlciA9IHBhcnNlci5nZXRYTUxkYXRhKCkuaW5kZXhPZihYTUxDb25zdGFudHMuVEFHX1RFUk0sIHBhcnNlci5nZXRDdXJySW5kZXgoKSk7XHJcblxyXG4gICAgaWYgKGVuZENvbnRleHQgIT09IC0xICYmIGVuZENvbnRleHQgPCBwYXJzZXIuZ2V0WE1MZGF0YSgpLmxlbmd0aCkge1xyXG4gICAgICAvLyBsYXN0IHBvc2l0aW9uIG9mIGl0cyB0YWdcclxuICAgICAgbGV0IHRhZzogU3RyaW5nID0gcGFyc2VyLmdldFhNTHN1YnN0cmluZyhlbmRDb250ZXh0KTtcclxuICAgICAgcGFyc2VyLmFkZDJDdXJySW5kZXgodGFnLmluZGV4T2YoQ29uc3RJbnRlcmZhY2UuTUdfVEFHX1JFQykgKyBDb25zdEludGVyZmFjZS5NR19UQUdfUkVDLmxlbmd0aCk7XHJcblxyXG4gICAgICBsZXQgdG9rZW5zVmVjdG9yOiBMaXN0PHN0cmluZz4gPSBYbWxQYXJzZXIuZ2V0VG9rZW5zKHBhcnNlci5nZXRYTUxzdWJzdHJpbmcoZW5kQ29udGV4dCksIFhNTENvbnN0YW50cy5YTUxfQVRUUl9ERUxJTSk7XHJcbiAgICAgIGlzQ3VyclJlYyA9IHRoaXMuaW5pdEVsZW1lbnRzKHRva2Vuc1ZlY3Rvcik7XHJcbiAgICAgIHBhcnNlci5zZXRDdXJySW5kZXgoZW5kQ29udGV4dCArIFhNTENvbnN0YW50cy5UQUdfVEVSTS5sZW5ndGgpO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coXCJpbiBSZWNvcmQuRmlsbElubmVyRGF0YSgpIG91dCBvZiBib3VuZHNcIik7XHJcbiAgICByZXR1cm4gaXNDdXJyUmVjO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHBhcnNlIHRoZSByZWNvcmQgLSByZXR1cm5zIHRydWUgd2hlbiB0aGUgcmVjb3JkIGlzIHRoZSBjdXJyZW50IHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0b2tlbnNWZWN0b3JcIj50aGUgYXR0cmlidXRlcyBhbmQgdGhlaXIgdmFsdWVzPC9wYXJhbT5cclxuICBwcm90ZWN0ZWQgaW5pdEVsZW1lbnRzKHRva2Vuc1ZlY3RvcjogTGlzdDxzdHJpbmc+KTogYm9vbGVhbiB7XHJcbiAgICBsZXQgYXR0cmlidXRlOiBTdHJpbmcsIHZhbHVlU3RyO1xyXG4gICAgbGV0IHJlY0ZpZWxkc0RhdGE6IHN0cmluZyA9IG51bGw7XHJcbiAgICBsZXQgcmVjRmxhZ3M6IHN0cmluZyA9IG51bGw7XHJcbiAgICBsZXQgajogbnVtYmVyID0gMDtcclxuICAgIGxldCBpc0N1cnJSZWM6IGJvb2xlYW47XHJcblxyXG4gICAgaXNDdXJyUmVjID0gdGhpcy5wZWVrSXNDdXJyUmVjKHRva2Vuc1ZlY3Rvcik7XHJcblxyXG4gICAgZm9yICg7IGogPCB0b2tlbnNWZWN0b3IubGVuZ3RoOyBqICs9IDIpIHtcclxuICAgICAgYXR0cmlidXRlID0gKHRva2Vuc1ZlY3Rvci5nZXRfSXRlbShqKSk7XHJcbiAgICAgIHZhbHVlU3RyID0gKHRva2Vuc1ZlY3Rvci5nZXRfSXRlbShqICsgMSkpO1xyXG5cclxuICAgICAgc3dpdGNoIChhdHRyaWJ1dGUpIHtcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfTU9ERTpcclxuICAgICAgICAgIHRoaXMuX21vZGUgPSA8RGF0YU1vZGlmaWNhdGlvblR5cGVzPnZhbHVlU3RyWzBdO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9JRDpcclxuICAgICAgICAgIHRoaXMuc2V0SWQoWG1sUGFyc2VyLmdldEludCh2YWx1ZVN0cikpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9WQl9WSUVXX1JPV0lEWDpcclxuICAgICAgICAgIHRoaXMuc2V0REJWaWV3Um93SWR4KFhtbFBhcnNlci5nZXRJbnQodmFsdWVTdHIpKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfVkFMVUU6XHJcbiAgICAgICAgICBpZiAodGhpcy5WYWx1ZUluQmFzZTY0KSB7XHJcbiAgICAgICAgICAgIHJlY0ZpZWxkc0RhdGEgPSBCYXNlNjQuZGVjb2RlKHZhbHVlU3RyKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZWNGaWVsZHNEYXRhID0gWG1sUGFyc2VyLnVuZXNjYXBlKHZhbHVlU3RyKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9DVVJSX1JFQzoge1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfQUREX0FGVEVSOlxyXG4gICAgICAgICAgdGhpcy5fYWRkQWZ0ZXIgPSBYbWxQYXJzZXIuZ2V0SW50KHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9GTEFHUzpcclxuICAgICAgICAgIHJlY0ZsYWdzID0gdmFsdWVTdHI7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfTU9ESUZJRUQ6XHJcbiAgICAgICAgICB0aGlzLl9tb2RpZmllZCA9IHRydWU7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfRENfUkVGUzpcclxuICAgICAgICAgIHRoaXMuZmlsbERDUmVmKHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9EQlBPUzpcclxuICAgICAgICAgIHRoaXMuX2RiUG9zQmFzZTY0VmFsID0gdmFsdWVTdHI7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKFwiaW4gUmVjb3JkLmluaXRFbGVtZW50cygpIHVua25vd24gYXR0cmlidXRlOiBcIiArIGF0dHJpYnV0ZSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuVmFsdWVJbkJhc2U2NCkge1xyXG4gICAgICBsZXQgZmxkVmFsSW5CeXRlczogVWludDhBcnJheSA9IElTT184ODU5XzFfRW5jb2RpbmcuSVNPXzg4NTlfMS5HZXRCeXRlcyhyZWNGaWVsZHNEYXRhKTtcclxuICAgICAgdGhpcy5maWxsRmllbGRzRGF0YShmbGRWYWxJbkJ5dGVzLCByZWNGbGFncyk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5maWxsRmllbGRzRGF0YShyZWNGaWVsZHNEYXRhLCByZWNGbGFncywgaXNDdXJyUmVjKTtcclxuICAgIH1cclxuICAgIHJldHVybiBpc0N1cnJSZWM7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcGVlayB0aGUgY3Vycl9yZWMgdmFsdWUgZnJvbSB0aGUgdGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRoZVwiPnRva2VucyBvZiB0aGUgYXR0cmlidXRlcyBhbmQgdmFsdWVzIGluIHRoZSB0YWc8L3BhcmFtPlxyXG4gIHByb3RlY3RlZCBwZWVrSXNDdXJyUmVjKHRva2Vuc1ZlY3RvcjogTGlzdDxzdHJpbmc+KTogYm9vbGVhbiB7XHJcbiAgICBsZXQgYXR0cmlidXRlOiBzdHJpbmc7XHJcbiAgICBsZXQgdmFsdWVTdHI6IHN0cmluZztcclxuXHJcbiAgICBmb3IgKGxldCBqOiBudW1iZXIgPSAwOyBqIDwgdG9rZW5zVmVjdG9yLmxlbmd0aDsgaiArPSAyKSB7XHJcbiAgICAgIGF0dHJpYnV0ZSA9ICh0b2tlbnNWZWN0b3IuZ2V0X0l0ZW0oaikpO1xyXG4gICAgICBpZiAoYXR0cmlidXRlID09PSBDb25zdEludGVyZmFjZS5NR19BVFRSX0NVUlJfUkVDKSB7XHJcbiAgICAgICAgdmFsdWVTdHIgPSAodG9rZW5zVmVjdG9yLmdldF9JdGVtKGogKyAxKSk7XHJcbiAgICAgICAgcmV0dXJuIFhtbFBhcnNlci5nZXRCb29sZWFuKHZhbHVlU3RyKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgZmlsbEZpZWxkc0RhdGEoZmxkVmFsSW5CeXRlczogVWludDhBcnJheSwgcmVjRmxhZ3M6IHN0cmluZyk6IHZvaWQ7XHJcbiAgZmlsbEZpZWxkc0RhdGEoZmxkc1ZhbDogc3RyaW5nLCByZWNGbGFnczogc3RyaW5nLCBpc0N1cnJSZWM6IGJvb2xlYW4pOiB2b2lkO1xyXG4gIGZpbGxGaWVsZHNEYXRhKGZsZFZhbEluQnl0ZXNPckZsZHNWYWw6IGFueSwgcmVjRmxhZ3M6IHN0cmluZywgaXNDdXJyUmVjPzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKGlzTnVsbE9yVW5kZWZpbmVkKGlzQ3VyclJlYykpXHJcbiAgICAgIHRoaXMuZmlsbEZpZWxkc0RhdGFfMCgpO1xyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLmZpbGxGaWVsZHNEYXRhXzEoZmxkVmFsSW5CeXRlc09yRmxkc1ZhbCwgcmVjRmxhZ3MsIGlzQ3VyclJlYyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZpbGxGaWVsZHNEYXRhXzAoKTogdm9pZCB7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgRmlsbCBGaWVsZHNEYXRhXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZsZHNWYWxcIj4tIHN0cmluZyBmb3IgcGFyc2luZzwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpc0N1cnJSZWNcIj50cnVlIGlmIHRoaXMgcmVjb3JkIGlzIHRoZSBjdXJyZW50IHJlY29yZDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBmaWxsRmllbGRzRGF0YV8xKGZsZHNWYWw6IHN0cmluZywgcmVjRmxhZ3M6IFN0cmluZywgaXNDdXJyUmVjOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBsZXQgdmFsOiBTdHJpbmcgPSBudWxsO1xyXG4gICAgbGV0IHRtcDogc3RyaW5nID0gbnVsbDtcclxuICAgIGxldCBwYXJzZWRMZW46IFJlZlBhcmFtPG51bWJlcj4gPSBuZXcgUmVmUGFyYW08bnVtYmVyPigwKTtcclxuICAgIGxldCBpOiBudW1iZXIsIGogPSAwLCBmcm9tLCBzaXplO1xyXG4gICAgbGV0IGN1cnJUeXBlOiBTdG9yYWdlQXR0cmlidXRlO1xyXG4gICAgbGV0IHVzZUhleDogYm9vbGVhbjtcclxuICAgIGxldCBmbGQ6IEZpZWxkRGVmID0gbnVsbDtcclxuICAgIGxldCB2YWx1ZU5vdFBhc3NlZDogYm9vbGVhbjtcclxuXHJcbiAgICBmcm9tID0gdGhpcy5nZXRGcm9tRmxkSWR4KGlzQ3VyclJlYyk7XHJcbiAgICBzaXplID0gdGhpcy5nZXRTaXplRmxkKGlzQ3VyclJlYyk7XHJcblxyXG4gICAgZm9yIChpID0gZnJvbTsgaiA8IHNpemU7IGkrKywgaisrKSB7XHJcbiAgICAgIGZsZCA9IHRoaXMuZ2V0RmllbGRzVGFiKCkuZ2V0RmllbGQoaSk7XHJcbiAgICAgIGN1cnJUeXBlID0gZmxkLmdldFR5cGUoKTtcclxuXHJcbiAgICAgIHVzZUhleCA9IChFbnZpcm9ubWVudC5JbnN0YW5jZS5HZXREZWJ1Z0xldmVsKCkgPiAxIHx8XHJcbiAgICAgICAgY3VyclR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEEgfHxcclxuICAgICAgICBjdXJyVHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5VTklDT0RFIHx8XHJcbiAgICAgICAgU3RvcmFnZUF0dHJpYnV0ZUNoZWNrLmlzVHlwZUxvZ2ljYWwoY3VyclR5cGUpKTtcclxuXHJcbiAgICAgIC8vIFFjciAjOTQwNDQzIDogT2xkIGZhc2hpb24gZmxhZ3MgYXJlIHN0aWxsIGJlaW5nIHVzZWQgYnkgcmVzaWRlbnQgdGFibGUuIFNvIGNoZWNrIHRoZW0gMXN0IGNveiB3ZSAgbWlnaHQgZ2V0IGV4Y2VwdGlvbiBvdGhlcndpc2UuXHJcbiAgICAgIC8vIFRoZSBmbGFncyBmb3IgcmVzaWRlbnQgYXJlIHZlcnkgc2ltcGxlLCBvbmx5IDIgb3B0aW9ucy4gJy4nID0gZmFsc2UsICcvJyA9IHRydWUuXHJcbiAgICAgIC8vIFdlIGtlZXAgdXNpbmcgaXQgZm9yIHJlc2lkZW50LCBzaW5jZSBpbiB0aGUgc2VydmVyIHNpZGUgd2UgZG8gbm90IGtub3cgaWYgd2UgYXJlIGNyZWF0aW5nIHRoZSB4bWwgZm9yIHJpY2hjbGllbnQgb3IgZm9yIEJDIGF0IHRoZSBjcmVhdGlvbiBzdGFnZS5cclxuICAgICAgLy8gU2luY2Ugd2UgY291bGRuJ3QgY3JlYXRlIGRpZmZlcmVudCBmbGFncyBmb3IgcmljaCwgd2Ugd2lsbCB1c2UgdGhlIG9sZCBmbGFncyBoZXJlLlxyXG5cclxuICAgICAgaWYgKHJlY0ZsYWdzW2pdID09PSAnLicpXHJcbiAgICAgICAgdGhpcy5fZmxhZ3NbaV0gPSAwO1xyXG4gICAgICBlbHNlIGlmIChyZWNGbGFnc1tqXSA9PT0gJy8nKVxyXG4gICAgICAgIHRoaXMuX2ZsYWdzW2ldID0gMTtcclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgLy8gRWFjaCBmbGFnIHdpbGwgYXBwZWFyIGluIHRoZSB4bWwgaW4gMiBjaGFycyByZXByZXNlbnRpbmcgaGV4IHZhbHVlIChcIjQyXCIgZm9yIDB4NDIpLlxyXG4gICAgICAgIHRtcCA9IHJlY0ZsYWdzLnN1YnN0cihqICogMiwgMik7XHJcbiAgICAgICAgdGhpcy5fZmxhZ3NbaV0gPSBwYXJzZUludCh0bXAsIDE2KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gc2F2ZSB0aGUgaW5kIHRoYXQgdGhlIHZhbHVlIHdhcyBub3QgcGFzc2VkIGZyb20gdGhlIHNlcnZlci5cclxuICAgICAgdmFsdWVOb3RQYXNzZWQgPSBSZWNvcmQuRkxBR19WQUxVRV9OT1RfUEFTU0VEID09PSAodGhpcy5fZmxhZ3NbaV0gJiBSZWNvcmQuRkxBR19WQUxVRV9OT1RfUEFTU0VEKTtcclxuICAgICAgdGhpcy5fZmxhZ3NbaV0gPSB0aGlzLl9mbGFnc1tpXSAmIH5SZWNvcmQuRkxBR19WQUxVRV9OT1RfUEFTU0VEO1xyXG5cclxuICAgICAgdGhpcy5fZmxhZ3NIaXN0b3J5W2ldID0gdGhpcy5fZmxhZ3NbaV07XHJcblxyXG4gICAgICBpZiAoUmVjb3JkLkZMQUdfVVBEQVRFRCA9PT0gKHRoaXMuX2ZsYWdzW2ldICYgUmVjb3JkLkZMQUdfVVBEQVRFRCkpXHJcbiAgICAgICAgdGhpcy5fdXBkYXRlZCA9IHRydWU7XHJcbiAgICAgIGlmICh2YWx1ZU5vdFBhc3NlZCkge1xyXG4gICAgICAgIGlmIChSZWNvcmQuRkxBR19OVUxMID09PSAodGhpcy5fZmxhZ3NbaV0gJiBSZWNvcmQuRkxBR19OVUxMKSkge1xyXG4gICAgICAgICAgLy8gbnVsbCBpbmQgaXMgb24sIGp1c3QgcHV0IGFueSB2YWx1ZSBpbiB0aGUgZmllbGQuXHJcbiAgICAgICAgICB2YWwgPSBmbGQuZ2V0RGVmYXVsdFZhbHVlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgLy8gY29weSB0aGUgZXhpc3RpbmcgdmFsdWUgZnJvbSB0aGUgZXhpc3RpbmcgY3VyciByZWMuXHJcbiAgICAgICAgICB2YWwgPSAoPFJlY29yZD4gdGhpcy5fZGF0YXZpZXcuZ2V0Q3VyclJlYygpKS5HZXRGaWVsZFZhbHVlKGkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB2YWwgPSBSZWNvcmRVdGlscy5kZVNlcmlhbGl6ZUl0ZW1WYWwoZmxkc1ZhbCwgY3VyclR5cGUsIGZsZC5nZXRTaXplKCksIHVzZUhleCwgZmxkLmdldENlbGxzVHlwZSgpLCBwYXJzZWRMZW4pO1xyXG4gICAgICAgIGZsZHNWYWwgPSBmbGRzVmFsLnN1YnN0cihwYXJzZWRMZW4udmFsdWUpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuX2ZpZWxkc0RhdGFbaV0gPSB2YWw7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zZXRJbml0aWFsRmxkVmFscyhmYWxzZSwgZmFsc2UpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBpbml0IGRjUmVmcyB2ZWN0b3IgYW5kIGluY3JlYXNlIHJlZmVyZW5jZSBjb3VudGVyIHRvIERhdGFWaWV3Um9vdC5jb3VudGVyQXJyYXlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidmFsdWVTdHJcIj5pbiBmb3JtIFwiZGl0X2lkeCxkY19pZCRkaXRfaWR4LGRjX2lkJC4uLlwiPC9wYXJhbT5cclxuICBmaWxsRENSZWYodmFsdWVTdHI6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKCFOU3RyaW5nLklzTnVsbE9yRW1wdHkodmFsdWVTdHIpKSB7XHJcbiAgICAgIGxldCBjb3VwbGVzOiBzdHJpbmdbXSA9IFN0clV0aWwudG9rZW5pemUodmFsdWVTdHIsIFwiJFwiKTtcclxuICAgICAgbGV0IHNpemU6IG51bWJlciA9IGNvdXBsZXMubGVuZ3RoO1xyXG5cclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHNpemU7IGkgPSBpICsgMSkge1xyXG4gICAgICAgIHRoaXMuX2RjUmVmcy5BZGQoRGNWYWx1ZXNSZWZlcmVuY2UuUGFyc2UoY291cGxlc1tpXSwgdGhpcy5fZGF0YXZpZXcpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGJ1aWxkIHRoZSBmaWVsZHMgdmFsdWUgZm9yIHRoZSBYTUwgc3RyaW5nIG9mIHRoaXMgcmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGJ1aWxkRmllbGRzRGF0YShtZXNzYWdlOiBTdHJpbmdCdWlsZGVyLCBpc0N1cnJSZWM6IGJvb2xlYW4sIGdldE9sZFZhbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgbGV0IHRtcFN0cjogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7XHJcblxyXG4gICAgbGV0IGZyb206IG51bWJlciA9IHRoaXMuZ2V0RnJvbUZsZElkeChpc0N1cnJSZWMpO1xyXG4gICAgbGV0IHNpemU6IG51bWJlciA9IHRoaXMuZ2V0U2l6ZUZsZChpc0N1cnJSZWMpO1xyXG5cclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IGZyb207IGkgPCBmcm9tICsgc2l6ZTsgaSA9IGkgKyAxKSB7XHJcblxyXG4gICAgICAvLyBEbyBub3Qgc2VyaWFsaXplIHRoZSBmaWVsZCB2YWx1ZSB3aGljaCBpcyBub3QgZXhwb3NlZCB0byBjbGllbnQuXHJcbiAgICAgIGxldCBmbGQ6IEZpZWxkID0gIDxGaWVsZD4gdGhpcy5nZXRGaWVsZHNUYWIoKS5nZXRGaWVsZChpKTtcclxuICAgICAgaWYgKGZsZC5Jc0V4cG9zZWRUb0NsaWVudCA9PT0gZmFsc2UpXHJcbiAgICAgICAgdGhpcy5zZXRTaHJpbmtGbGFnKGkpO1xyXG5cclxuICAgICAgLy8gZG8gbm90IHdyaXRlIHRoZSB2YWx1ZSBpZiB0aGUgc2hyaW5rIGZsYWcgaXMgb24uXHJcbiAgICAgIGlmIChSZWNvcmQuRkxBR19WQUxVRV9OT1RfUEFTU0VEID09PSAodGhpcy5fZmxhZ3NbaV0gJiBSZWNvcmQuRkxBR19WQUxVRV9OT1RfUEFTU0VEKSlcclxuICAgICAgICBjb250aW51ZTtcclxuXHJcbiAgICAgIHRtcFN0ci5BcHBlbmQodGhpcy5nZXRGaWVsZERhdGFYTUwoaSwgZ2V0T2xkVmFsKS50b1N0cmluZygpKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8gaWYgbm9uZSBvZiB0aGUgdmFsdWVzIGhhZCBjaGFuZ2VkLiBwYXNzIFwiIFwiIGluc3RlYWQgb2YgXCJcIi5cclxuICAgIGlmICh0bXBTdHIuTGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHRtcFN0ci5BcHBlbmQoXCIgXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIG1lc3NhZ2UuQXBwZW5kKHRtcFN0ci5Ub1N0cmluZygpKTtcclxuXHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJmbGRJZHhcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImZsZFZhbFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBnZXRYTUxGb3JWYWx1ZShmbGRJZHg6IG51bWJlciwgZmxkVmFsOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgbGV0IGNlbGxBdHRyOiBTdG9yYWdlQXR0cmlidXRlID0gU3RvcmFnZUF0dHJpYnV0ZS5TS0lQOyAvLyBjZWxsJ3MgYXR0cmlidXRlLCBpZiB0aGUgZmllbGQncyBhdHRyaWJ1dGUgaXMgYSB2ZWN0b3JcclxuICAgIGxldCBmbGRBdHRyOiBTdG9yYWdlQXR0cmlidXRlID0gdGhpcy5nZXRGaWVsZHNUYWIoKS5nZXRUeXBlKGZsZElkeCk7IC8vIGZpZWxkJ3MgYXR0cmlidXRlXHJcbiAgICBpZiAoZmxkQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CX1ZFQ1RPUilcclxuICAgICAgY2VsbEF0dHIgPSB0aGlzLmdldEZpZWxkc1RhYigpLmdldEZpZWxkKGZsZElkeCkuZ2V0Q2VsbHNUeXBlKCk7XHJcblxyXG4gICAgbGV0IHRvQmFzZTY0OiBib29sZWFuID0gRW52aXJvbm1lbnQuSW5zdGFuY2UuR2V0RGVidWdMZXZlbCgpIDw9IDE7XHJcbiAgICByZXR1cm4gUmVjb3JkLnNlcmlhbGl6ZUl0ZW1WYWwoZmxkVmFsLCBmbGRBdHRyLCBjZWxsQXR0ciwgdG9CYXNlNjQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBzdGFydGluZyBmaWVsZCBhY2NvcmRpbmcgdG8gdGhlIHR5cGUgb2YgcmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlzQ3VyclJlY1wiPnNob3VsZCBiZSB0cnVlIGZvciB0aGUgY3VycmVudCByZWM8L3BhcmFtPlxyXG4gIGdldEZyb21GbGRJZHgoaXNDdXJyUmVjOiBib29sZWFuKTogbnVtYmVyIHtcclxuICAgIGlmIChpc0N1cnJSZWMpXHJcbiAgICAgIHJldHVybiAwO1xyXG4gICAgZWxzZVxyXG4gICAgICByZXR1cm4gdGhpcy5nZXRGaWVsZHNUYWIoKS5nZXRSTUlkeCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIG51bWJlciBvZiBmaWVsZHMgYWNjb3JkaW5nIHRvIHRoZSB0eXBlIG9mIHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpc0N1cnJSZWNcIj5zaG91bGQgYmUgdHJ1ZSBmb3IgdGhlIGN1cnJlbnQgcmVjPC9wYXJhbT5cclxuICBnZXRTaXplRmxkKGlzQ3VyclJlYzogYm9vbGVhbik6IG51bWJlciB7XHJcbiAgICBpZiAoaXNDdXJyUmVjKVxyXG4gICAgICByZXR1cm4gdGhpcy5nZXRGaWVsZHNUYWIoKS5nZXRTaXplKCk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHJldHVybiB0aGlzLmdldEZpZWxkc1RhYigpLmdldFJNU2l6ZSgpO1xyXG4gIH1cclxuXHJcbiAgYnVpbGRYTUwobWVzc2FnZTogU3RyaW5nQnVpbGRlciwgaXNDdXJyUmVjOiBib29sZWFuKTogdm9pZDtcclxuICBidWlsZFhNTChtZXNzYWdlOiBTdHJpbmdCdWlsZGVyLCBpc0N1cnJSZWM6IGJvb2xlYW4sIGZvcmNlQnVpbGQ6IGJvb2xlYW4pOiB2b2lkO1xyXG4gIGJ1aWxkWE1MKG1lc3NhZ2U6IFN0cmluZ0J1aWxkZXIsIGlzQ3VyclJlYzogYm9vbGVhbiwgZm9yY2VCdWlsZD86IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmIChpc051bGxPclVuZGVmaW5lZChmb3JjZUJ1aWxkKSlcclxuICAgICAgdGhpcy5idWlsZFhNTF8wKG1lc3NhZ2UsIGlzQ3VyclJlYyk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuYnVpbGRYTUxfMShtZXNzYWdlLCBpc0N1cnJSZWMsIGZvcmNlQnVpbGQpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBidWlsZFhNTF8wKG1lc3NhZ2U6IFN0cmluZ0J1aWxkZXIsIGlzQ3VyclJlYzogYm9vbGVhbik6ICB2b2lkIHtcclxuICAgIHRoaXMuYnVpbGRYTUxfMShtZXNzYWdlLCBpc0N1cnJSZWMsIGZhbHNlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBidWlsZCB0aGUgWE1MIHN0cmluZyBvZiB0aGUgcmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm1lc3NhZ2VcIj50aGUgeG1sIG1lc3NhZ2UgdG8gYXBwZW5kIHRvPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlzQ3VyclJlY1wiPmluZGljYXRlIHRoaXMgcmVjb3JkIGFzIHRoZSBjdXJyZW50IHJlY29yZDwvcGFyYW0+XHJcbiAgcHJvdGVjdGVkIGJ1aWxkWE1MXzEobWVzc2FnZTogU3RyaW5nQnVpbGRlciwgaXNDdXJyUmVjOiBib29sZWFuLCBmb3JjZUJ1aWxkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBsZXQgcmVjRmxhZ3M6IFN0cmluZ0J1aWxkZXI7XHJcbiAgICBsZXQgZnJvbTogbnVtYmVyLCBzaXplLCBpO1xyXG4gICAgbGV0IGFGbGFnOiBudW1iZXI7XHJcbiAgICBsZXQgaGV4RmxhZzogc3RyaW5nO1xyXG5cclxuICAgIGlmICghZm9yY2VCdWlsZClcclxuICAgICAgaWYgKHRoaXMuX21vZGUgIT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5JbnNlcnQgJiYgdGhpcy5fbW9kZSAhPT0gRGF0YU1vZGlmaWNhdGlvblR5cGVzLlVwZGF0ZSAmJlxyXG4gICAgICAgIHRoaXMuX21vZGUgIT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5EZWxldGUgJiYgIWlzQ3VyclJlYylcclxuICAgICAgICByZXR1cm47XHJcblxyXG4gICAgbWVzc2FnZS5BcHBlbmQoXCJcXG4gICAgICAgICAgICA8XCIgKyBDb25zdEludGVyZmFjZS5NR19UQUdfUkVDKTtcclxuICAgIGlmICh0aGlzLl9pZCA+IEludDMyLk1pblZhbHVlKVxyXG4gICAgICBtZXNzYWdlLkFwcGVuZChcIiBcIiArIFhNTENvbnN0YW50cy5NR19BVFRSX0lEICsgXCI9XFxcIlwiICsgdGhpcy5faWQgKyBcIlxcXCJcIik7XHJcbiAgICBtZXNzYWdlLkFwcGVuZChcIiBcIiArIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfTU9ERSArIFwiPVxcXCJcIiArIDxzdHJpbmc+dGhpcy5fbW9kZSArIFwiXFxcIlwiKTtcclxuXHJcbiAgICBpZiAodGhpcy5fbW9kZSA9PT0gRGF0YU1vZGlmaWNhdGlvblR5cGVzLkluc2VydCAmJiB0aGlzLl9wcmV2ICE9IG51bGwpXHJcbiAgICAgIG1lc3NhZ2UuQXBwZW5kKFwiIFwiICsgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9BRERfQUZURVIgKyBcIj1cXFwiXCIgKyB0aGlzLl9wcmV2LmdldElkKCkgKyBcIlxcXCJcIik7XHJcblxyXG4gICAgLy8gY3VycmVudCByZWNvcmQncyBtb2RlIGlzIG5ldmVyIGNsZWFyZWQsIHRoZSB3aG9sZSByZWNvcmQgaXMgY2xlYXJlZCB3aGVuIHdlIG1vdmUgb24uXHJcbiAgICBpZiAoIWZvcmNlQnVpbGQgJiYgIWlzQ3VyclJlYylcclxuICAgICAgdGhpcy5jbGVhck1vZGUoKTtcclxuXHJcbiAgICBtZXNzYWdlLkFwcGVuZChcIiBcIiArIFhNTENvbnN0YW50cy5NR19BVFRSX1ZBTFVFICsgXCI9XFxcIlwiKTtcclxuXHJcbiAgICBpZiAoIWZvcmNlQnVpbGQgJiYgaXNDdXJyUmVjKVxyXG4gICAgICB0aGlzLnNldFNocmlua0ZsYWdzKCk7XHJcblxyXG4gICAgbGV0IGdldE9sZFZhbDogYm9vbGVhbjtcclxuICAgIGlmICh0aGlzLlN5bmNlZClcclxuICAgICAgZ2V0T2xkVmFsID0gZmFsc2U7XHJcbiAgICBlbHNlIHtcclxuICAgICAgbGV0IHRhc2s6IFRhc2sgPSA8VGFzaz50aGlzLl9kYXRhdmlldy5nZXRUYXNrKCk7XHJcbiAgICAgIGdldE9sZFZhbCA9ICghaXNDdXJyUmVjICYmICh0YXNrLmdldExldmVsKCkgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX1JFQ09SRCB8fFxyXG4gICAgICAgIHRhc2suZ2V0TGV2ZWwoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfQ09OVFJPTCkgJiZcclxuICAgICAgIHRoaXMuX2RhdGF2aWV3LmdldEN1cnJSZWMoKSAhPSBudWxsICYmICgoPFJlY29yZD4gdGhpcy5fZGF0YXZpZXcuZ2V0Q3VyclJlYygpKSkuZ2V0SWQoKSA9PT0gdGhpcy5faWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYnVpbGRGaWVsZHNEYXRhKG1lc3NhZ2UsIGlzQ3VyclJlYywgZ2V0T2xkVmFsKTtcclxuICAgIG1lc3NhZ2UuQXBwZW5kKFwiXFxcIlwiKTtcclxuICAgIHJlY0ZsYWdzID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuXHJcbiAgICBmcm9tID0gdGhpcy5nZXRGcm9tRmxkSWR4KGlzQ3VyclJlYyk7XHJcbiAgICBzaXplID0gdGhpcy5nZXRTaXplRmxkKGlzQ3VyclJlYyk7XHJcblxyXG4gICAgLy8gUUNSIDQ3OTY4Njogc2VuZCBGTEFHX0NSU1JfTU9EIGZyb20gdGhlIGhpc3RvcnksIHRodXMgbGV0IHRoZSBzZXJ2ZXIga25vdyBpZiBhIGZpZWxkXHJcbiAgICAvLyB3YXMgdXBkYXRlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHdlIHNlbnQgaXQgdG8gSVQgKGhlbmNlLCBhIERCTVMgYWN0aW9uIGlzIG5lZWRlZCkuXHJcbiAgICBmb3IgKGkgPSBmcm9tOyBpIDwgZnJvbSArIHNpemU7IGkrKykge1xyXG4gICAgICBhRmxhZyA9IHRoaXMuX2ZsYWdzSGlzdG9yeVtpXTtcclxuICAgICAgYUZsYWcgPSBhRmxhZyAmIFJlY29yZC5GTEFHX0NSU1JfTU9ESUZJRUQ7XHJcbiAgICAgIGFGbGFnID0gYUZsYWcgfCB0aGlzLl9mbGFnc1tpXTtcclxuXHJcbiAgICAgIC8vIEVhY2ggZmxhZyB3aWxsIGFwcGVhciBpbiB0aGUgeG1sIGluIDIgY2hhcnMgcmVwcmVzZW50aW5nIGhleCB2YWx1ZSAoXCI0MlwiIGZvciAweDQyKS5cclxuICAgICAgaGV4RmxhZyA9IE5OdW1iZXIuVG9TdHJpbmcoYUZsYWcsIFwiWDJcIik7XHJcbiAgICAgIHJlY0ZsYWdzLkFwcGVuZChoZXhGbGFnKTtcclxuXHJcbiAgICAgIC8vIGNsZWFyIHRoZSBzaHJpbmsgZmxhZ1xyXG4gICAgICBpZiAoaXNDdXJyUmVjKVxyXG4gICAgICAgIHRoaXMuX2ZsYWdzW2ldID0gPG51bWJlcj4odGhpcy5fZmxhZ3NbaV0gJiB+UmVjb3JkLkZMQUdfVkFMVUVfTk9UX1BBU1NFRCk7XHJcbiAgICB9XHJcblxyXG4gICAgbWVzc2FnZS5BcHBlbmQoXCIgXCIgKyBDb25zdEludGVyZmFjZS5NR19BVFRSX0ZMQUdTICsgXCI9XFxcIlwiICsgcmVjRmxhZ3MuVG9TdHJpbmcoKSArIFwiXFxcIlwiKTtcclxuXHJcbiAgICBpZiAoaXNDdXJyUmVjKSB7XHJcblxyXG4gICAgICBtZXNzYWdlLkFwcGVuZChcIiBcIiArIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfQ1VSUl9SRUMgKyBcIj1cXFwiMVxcXCJcIik7XHJcblxyXG4gICAgICBpZiAodGhpcy5Nb2RpZmllZClcclxuICAgICAgICBtZXNzYWdlLkFwcGVuZChcIiBcIiArIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfTU9ESUZJRUQgKyBcIj1cXFwiMVxcXCJcIik7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5fbGlua3NGbGRzUG9zICE9IG51bGwpXHJcbiAgICAgIG1lc3NhZ2UuQXBwZW5kKFwiIFwiICsgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9EQlBPUyArIFwiPVxcXCJcIiArIFhtbFBhcnNlci5lc2NhcGUodGhpcy5fbGlua3NGbGRzUG9zKSArIFwiXFxcIiBcIik7XHJcblxyXG4gICAgbWVzc2FnZS5BcHBlbmQoWE1MQ29uc3RhbnRzLlRBR19URVJNKTtcclxuICB9XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2NhbiB0aGUgcmVjb3JkIGFuZCBjb21wYXJlIGZpZWxkcyB3aXRoIHBhcmFsbGVsIHNlcnZlciBjdXJyIHJlYyxcclxuICAvLy8gICBzZXQgc2hyaW5rIGZsYWcgb24gaWYgZmllbGRzIGFyZSBlcXVhbC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG5cclxuICBwcm90ZWN0ZWQgc2V0U2hyaW5rRmxhZ3MoKTogdm9pZCB7XHJcbiAgICBsZXQgaTogbnVtYmVyO1xyXG4gICAgbGV0IHNpemU6IG51bWJlciA9IHRoaXMuZ2V0U2l6ZUZsZCh0cnVlKTtcclxuXHJcbiAgICBsZXQgc2VydmVyQ3VyclJlYzogUmVjb3JkID0gdGhpcy5fZGF0YXZpZXcuZ2V0U2VydmVyQ3VyclJlYygpO1xyXG4gICAgLy8gY2Fubm90IHNocmluayBpZiB3ZSBkbyBub3Qga25vdyB3aGF0IGN1cnIgcmVjIHRoZSBzZXJ2ZXIgaG9sZHMuXHJcbiAgICBpZiAoc2VydmVyQ3VyclJlYyA9PSBudWxsKVxyXG4gICAgICByZXR1cm47XHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7XHJcbiAgICAgIGlmICh0aGlzLmZsZFZhbHNFcXVhbChzZXJ2ZXJDdXJyUmVjLCBpKSB8fCAoUmVjb3JkLkZMQUdfTlVMTCA9PT0gKHRoaXMuX2ZsYWdzW2ldICYgUmVjb3JkLkZMQUdfTlVMTCkpKSB7XHJcbiAgICAgICAgdGhpcy5fZmxhZ3NbaV0gPSB0aGlzLl9mbGFnc1tpXSB8IFJlY29yZC5GTEFHX1ZBTFVFX05PVF9QQVNTRUQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHNldCBzaHJpbmsgZmxhZyBmb3Igc3BlY2lmaWMgZmllbGRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImZsZElkeFwiPjwvcGFyYW0+XHJcbiAgc2V0U2hyaW5rRmxhZyhmbGRJZHg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5fZmxhZ3NbZmxkSWR4XSB8PSBSZWNvcmQuRkxBR19WQUxVRV9OT1RfUEFTU0VEO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBzZXRzIGZpZWxkIHZhbHVlIHRvIGl0cyBvcmlnaW5hbCB2YWx1ZSBmcm9tIHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaWR4XCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ2YWx1ZVwiPjwvcGFyYW0+XHJcbiAgU2V0RmllbGRWYWx1ZShpZHg6IG51bWJlciwgaXNOdWxsOiBib29sZWFuLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBsZXQgZmllbGQ6IEZpZWxkID0gPEZpZWxkPnRoaXMuZ2V0RmllbGRzVGFiKCkuZ2V0RmllbGQoaWR4KTtcclxuICAgIGZpZWxkLlVwZGF0ZU51bGwoaXNOdWxsLCB0aGlzKTtcclxuXHJcbiAgICB2YWx1ZSA9IHRoaXMuQ2hlY2tNZ1ZhbHVlKHZhbHVlLCBpc051bGwsIGZpZWxkKTtcclxuICAgIHRoaXMuX2ZpZWxkc0RhdGFbaWR4XSA9IHZhbHVlO1xyXG4gICAgZmllbGQudGFrZVZhbEZyb21SZWMoKTtcclxuICAgIHRoaXMuY2xlYXJGbGFnKGZpZWxkLmdldElkKCksIFJlY29yZC5GTEFHX0lOVkFMSUQpO1xyXG4gICAgZmllbGQuaW52YWxpZGF0ZSh0cnVlLCBmYWxzZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IGZpZWxkIHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZsZElkeFwiPnRoZSBmaWVsZCBpbmRleDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJtZ1ZhbFwiPnRoZSBuZXcgdmFsdWUgb2YgdGhlIGZpZWxkLiBtdXN0IGJlIGluIHRoZSBpbnRlcm5hbCBzdG9yYWdlIGZvcm1hdDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzZXRSZWNvcmRVcGRhdGVkXCI+dGVsbHMgd2hldGhlciB0byBkZWZpbmUgdGhpcyByZWNvcmQgYXMgdXBkYXRlZDwvcGFyYW0+XHJcbiAgc2V0RmllbGRWYWx1ZShmbGRJZHg6IG51bWJlciwgbWdWYWw6IHN0cmluZywgc2V0UmVjb3JkVXBkYXRlZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgbGV0IGZsZDogRmllbGQgPSA8RmllbGQ+dGhpcy5nZXRGaWVsZHNUYWIoKS5nZXRGaWVsZChmbGRJZHgpO1xyXG5cclxuICAgIC8vIGRvbid0IGNoYW5nZSB2YWx1ZSB3aGVuIHJlZmVyZW5jZXMgYXJlIGVxdWFsIG9yIGlmIHRoZSB0YXNrIG1vZGUgaXMgUXVlcnlcclxuICAgIGlmIChmbGQuUHJldklzTnVsbCgpID09PSBmbGQuaXNOdWxsKCkgJiYgbWdWYWwgPT09IHRoaXMuR2V0RmllbGRWYWx1ZShmbGRJZHgpKVxyXG4gICAgICByZXR1cm47XHJcblxyXG5cclxuICAgIG1nVmFsID0gdGhpcy5DaGVja01nVmFsdWUobWdWYWwsIGZsZC5pc051bGwoKSwgZmxkKTtcclxuXHJcbiAgICBpZiAoZmxkSWR4ID49IDAgJiYgZmxkSWR4IDwgdGhpcy5nZXRGaWVsZHNUYWIoKS5nZXRTaXplKCkpIHtcclxuICAgICAgdGhpcy5fZmllbGRzRGF0YVtmbGRJZHhdID0gbWdWYWw7XHJcblxyXG4gICAgICAvLyBRQ1IgIzk4NjcxNTogVGhlIGZvbGxvd2luZyBzZXRGbGFnKCkgY2FsbCB3YXMgcmVtb3ZlZCB0byBzb2x2ZSB0aGUgYnVnLlxyXG4gICAgICAvLyBpdCBjYXVzZWQgbWFya2luZyBhIHZhcmlhYmxlIGFzIG1vZGlmaWVkIGV2ZW4gaWYgdGhlIGNoYW5nZSBpcyBkdWUgdG8gdGhlXHJcbiAgICAgIC8vIGNvbXB1dGUgb2YgdGhlIHJlY29yZC4gVGhlIEZMQUdfTU9ESUZJRUQgZmxhZyBpcyBzZXQgY29ycmVjdGx5IGluIHRoZVxyXG4gICAgICAvLyBGaWVsZC5zZXRWYWx1ZSgpIG1ldGhvZC5cclxuICAgICAgLy8gc2V0RmxhZyhmbGRJZHgsIEZMQUdfTU9ESUZJRUQpO1xyXG4gICAgICBpZiAoc2V0UmVjb3JkVXBkYXRlZCkge1xyXG4gICAgICAgIC8vIHNldCBtb2RpZnkgb25seSBpZiB0aGUgZmllbGQgaXMgcGFydCBvZiB0aGUgZGF0YXZpZXcuXHJcbiAgICAgICAgaWYgKGZsZC5QYXJ0T2ZEYXRhdmlldylcclxuICAgICAgICAgIHRoaXMuX21vZGlmaWVkID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgLy8gSWYgd2UgYXJlIGhlcmUgZHVlIHRvIHRhc2sgY2xvc2luZyAsIGFuZCBmb3VuZCB0aGF0IHRoZSBjdXJyZW50IHJlYydzIGZsZCBpcyB1cGRhdGVkXHJcbiAgICAgICAgLy8gdGhlbiBzZXQgUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuR2V0SW5zdGFuY2UoKS5EZWxheUNvbW1hbmRFeGVjdXRpb24gPSBmYWxzZVxyXG5cdFx0Ly8gU28gdGhhdCBjb21taXQgdHJhbnNhY3Rpb24gc2hvdWxkIGJlIGV4ZWN1dGVkIHNlcGFyYXRlbHkgYXQgc2VydmVyIHNpZGUuXHJcbiAgICAgICAgaWYgKFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLkdldEluc3RhbmNlKCkuRGVsYXlDb21tYW5kRXhlY3V0aW9uKSB7XHJcbiAgICAgICAgICBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5HZXRJbnN0YW5jZSgpLkRlbGF5Q29tbWFuZEV4ZWN1dGlvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgKDxUYXNrPnRoaXMuX2RhdGF2aWV3LmdldFRhc2soKSkuRGVsYXlDb21tYW5kRXhlY3V0aW9uID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fZGF0YXZpZXcuc2V0Q2hhbmdlZCh0cnVlKTtcclxuICAgICAgICB0aGlzLnNldE1vZGUoRGF0YU1vZGlmaWNhdGlvblR5cGVzLlVwZGF0ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKFwiaW4gUmVjb3JkLnNldEZpZWxkVmFsdWUoKSBpbGxlZ2FsIGZpZWxkIGluZGV4OiBcIiArIGZsZElkeCk7XHJcblxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBjaGVjayBtZ3ZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtZ1ZhbFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaXNOdWxsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJmbGRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgQ2hlY2tNZ1ZhbHVlKG1nVmFsOiBzdHJpbmcsIGlzTnVsbDogYm9vbGVhbiwgZmxkOiBGaWVsZCk6IHN0cmluZyB7XHJcbiAgICBpZiAobWdWYWwgPT09IG51bGwgfHwgaXNOdWxsKSB7XHJcbiAgICAgIG1nVmFsID0gZmxkLmdldE51bGxWYWx1ZSgpO1xyXG4gICAgICBpZiAobWdWYWwgPT09IG51bGwpXHJcbiAgICAgICAgbWdWYWwgPSBmbGQuZ2V0TWFnaWNEZWZhdWx0VmFsdWUoKTtcclxuXHJcbiAgICB9XHJcbiAgICBsZXQgc2l6ZTogbnVtYmVyID0gZmxkLmdldFNpemUoKTtcclxuXHJcbiAgICAvLyB0cnVuY2F0ZSB2YWx1ZXMgdGhhdCBhcmUgbG9uZ2VyIHRoYW4gdGhlIHN0b3JhZ2Ugc2l6ZVxyXG4gICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0xvY2FsZURlZkxhbmdEQkNTKCkgJiYgZmxkLmdldFR5cGUoKSAhPT0gU3RvcmFnZUF0dHJpYnV0ZS5VTklDT0RFKSB7XHJcbiAgICAgIC8vIGNvdW50IHRoZSBudW1iZXIgb2YgYnl0ZXMsIG5vdCBjaGFyYWN0ZXJzIChKUE46IERCQ1Mgc3VwcG9ydClcclxuICAgICAgaWYgKG1nVmFsICE9PSBudWxsICYmIFV0aWxTdHJCeXRlTW9kZS5sZW5CKG1nVmFsKSA+IHNpemUpXHJcbiAgICAgICAgbWdWYWwgPSBVdGlsU3RyQnl0ZU1vZGUubGVmdEIobWdWYWwsIHNpemUpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmIChtZ1ZhbCAhPT0gbnVsbCAmJiBtZ1ZhbC5sZW5ndGggPiBzaXplKVxyXG4gICAgICAgIG1nVmFsID0gbWdWYWwuc3Vic3RyKDAsIHNpemUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG1nVmFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgXCJtb2RpZmllZFwiIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldE1vZGlmaWVkKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fbW9kaWZpZWQgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlc2V0IHRoZSBcIm1vZGlmaWVkXCIgZmxhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcmVzZXRNb2RpZmllZCgpOiB2b2lkIHtcclxuICAgIHRoaXMuX21vZGlmaWVkID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSBcInVwZGF0ZWRcIiBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXRVcGRhdGVkKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fdXBkYXRlZCA9IHRydWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVzZXQgdGhlIFwibW9kaWZpZWRcIiBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICByZXNldFVwZGF0ZWQoKTogdm9pZCB7XHJcbiAgICB0aGlzLl91cGRhdGVkID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IGEgZmllbGQgdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZmxkSWR4XCI+dGhlIGZpZWxkIGluZGV4PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IFN0cmluZyB0aGUgZmllbGQgdmFsdWU8L3JldHVybnM+XHJcbiAgR2V0RmllbGRWYWx1ZShmbGRJZHg6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICBsZXQgdmFsOiBTdHJpbmcgPSBudWxsO1xyXG5cclxuICAgIGlmIChmbGRJZHggPj0gMCAmJiBmbGRJZHggPCB0aGlzLl9maWVsZHNEYXRhLmxlbmd0aClcclxuICAgICAgdmFsID0gdGhpcy5fZmllbGRzRGF0YVtmbGRJZHhdO1xyXG4gICAgcmV0dXJuIHZhbC50b1N0cmluZygpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgYSBjb3B5IG9mIHRoaXMgcmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICByZXBsaWNhdGUoKTogUmVjb3JkIHtcclxuICAgIGxldCByZWNvcmQ6IFJlY29yZCA9IG5ldyBSZWNvcmQodGhpcyk7XHJcbiAgICByZWNvcmQuX2ZpZWxkc0RhdGEgPSB0aGlzLl9maWVsZHNEYXRhLnNsaWNlKCk7XHJcbiAgICByZWNvcmQuX2ZsYWdzID0gdGhpcy5fZmxhZ3Muc3ViYXJyYXkoMCk7XHJcbiAgICByZWNvcmQuX2ZsYWdzSGlzdG9yeSA9IHRoaXMuX2ZsYWdzSGlzdG9yeS5zdWJhcnJheSgwKTtcclxuICAgIHJlY29yZC5fZGNSZWZzID0gdGhpcy5fZGNSZWZzLkNsb25lKCk7XHJcbiAgICByZXR1cm4gcmVjb3JkO1xyXG4gIH1cclxuXHJcbiAgc2V0U2FtZUFzKHJlYzogUmVjb3JkLCByZWFsT25seTogYm9vbGVhbiwgcklkOiBudW1iZXIpOiB2b2lkO1xyXG4gIHNldFNhbWVBcyhyZWM6IFJlY29yZCwgcmVhbE9ubHk6IGJvb2xlYW4pOiB2b2lkO1xyXG4gIHNldFNhbWVBcyhyZWM6IFJlY29yZCwgcmVhbE9ubHk6IGJvb2xlYW4sIHJJZD86IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMpXHJcbiAgICAgIHRoaXMuc2V0U2FtZUFzXzAocmVjLCByZWFsT25seSwgcklkKTtcclxuICAgIGVsc2VcclxuICAgICAgdGhpcy5zZXRTYW1lQXNfMShyZWMsIHJlYWxPbmx5KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIHZhbHVlIG9mIHRoZSBtZW1iZXIgdmFyaWFibGVzIG9mIHRoaXMgcmVjb3JkIHRvIGJlIHRoZSBzYW1lIGFzIHRob3NlXHJcbiAgLy8vICAgb2YgdGhlIGdpdmVuIHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyZWNcIj50aGUgc291cmNlIHJlY29yZDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJySWRcIj50aGUgbmV3IElkIG9mIHRoZSByZWNvcmQ8L3BhcmFtPlxyXG4gIHByaXZhdGUgc2V0U2FtZUFzXzAocmVjOiBSZWNvcmQsIHJlYWxPbmx5OiBib29sZWFuLCBySWQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5zZXRTYW1lQXMocmVjLCByZWFsT25seSk7XHJcbiAgICB0aGlzLnNldElkKHJJZCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSB2YWx1ZSBvZiB0aGUgbWVtYmVyIHZhcmlhYmxlcyBvZiB0aGlzIHJlY29yZCB0byBiZSB0aGUgc2FtZSBhcyB0aG9zZVxyXG4gIC8vLyAgIG9mIHRoZSBnaXZlbiByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicmVjXCI+dGhlIHNvdXJjZSByZWNvcmQ8L3BhcmFtPlxyXG4gIHByaXZhdGUgc2V0U2FtZUFzXzEocmVjOiBSZWNvcmQsIHJlYWxPbmx5OiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl9pZCA9IHJlYy5faWQ7XHJcbiAgICB0aGlzLl9oYXNoS2V5ID0gcmVjLl9oYXNoS2V5O1xyXG5cclxuICAgIGlmICghdGhpcy5fZGF0YXZpZXcuZ2V0VGFzaygpLnRyYW5zYWN0aW9uRmFpbGVkKENvbnN0SW50ZXJmYWNlLlRSQU5TX1JFQ09SRF9QUkVGSVgpLyonUCcqLylcclxuICAgICAgdGhpcy5zZXRNb2RlKHJlYy5fbW9kZSk7XHJcblxyXG4gICAgdGhpcy5fYWRkQWZ0ZXIgPSByZWMuX2FkZEFmdGVyO1xyXG5cclxuICAgIGlmIChyZWFsT25seSkge1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5nZXRGaWVsZHNUYWIoKS5nZXRTaXplKCk7IGkgPSBpICsgMSkge1xyXG4gICAgICAgIGxldCBhZmllbGQ6IEZpZWxkID0gPEZpZWxkPnJlYy5nZXRGaWVsZHNUYWIoKS5nZXRGaWVsZChpKTtcclxuICAgICAgICBpZiAoIWFmaWVsZC5Jc1ZpcnR1YWwpIHtcclxuICAgICAgICAgIHRoaXMuX2ZpZWxkc0RhdGFbaV0gPSByZWMuX2ZpZWxkc0RhdGFbaV07XHJcbiAgICAgICAgICB0aGlzLl9mbGFnc1tpXSA9IHJlYy5fZmxhZ3NbaV07XHJcbiAgICAgICAgICB0aGlzLl9mbGFnc0hpc3RvcnlbaV0gPSByZWMuX2ZsYWdzSGlzdG9yeVtpXTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLl9maWVsZHNEYXRhID0gcmVjLl9maWVsZHNEYXRhO1xyXG4gICAgICB0aGlzLl9mbGFncyA9IHJlYy5fZmxhZ3M7XHJcbiAgICAgIHRoaXMuX2ZsYWdzSGlzdG9yeSA9IHJlYy5fZmxhZ3NIaXN0b3J5O1xyXG4gICAgfVxyXG4gICAgdGhpcy5fbW9kaWZpZWQgPSByZWMuX21vZGlmaWVkO1xyXG4gICAgdGhpcy5fZGF0YXZpZXcgPSByZWMuX2RhdGF2aWV3O1xyXG4gICAgdGhpcy5fY29tcHV0ZWQgPSByZWMuX2NvbXB1dGVkO1xyXG4gICAgdGhpcy5fdXBkYXRlZCA9IHJlYy5fdXBkYXRlZDtcclxuICAgIHRoaXMuc2V0RGNSZWZzKHJlYy5fZGNSZWZzKTtcclxuXHJcbiAgICAvLyBRQ1IgIzQyMzU1MjogcGFydGlhbCBmaXggLSB3ZSBuZWVkIHRvIGdvIG92ZXIgYWxsIHRoZSByZWMubmV4dC9wcmV2IGFuZCBtYWtlIHN1cmUgdGhpcyByZWNvcmQgZG9lcyBub3QgYXBwZWFyXHJcbiAgICBpZiAocmVjLl9uZXh0ICE9PSB0aGlzKSB7XHJcbiAgICAgIHRoaXMuX25leHQgPSByZWMuX25leHQ7XHJcbiAgICB9XHJcbiAgICBpZiAocmVjLl9wcmV2ICE9PSB0aGlzKSB7XHJcbiAgICAgIHRoaXMuX3ByZXYgPSByZWMuX3ByZXY7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIGEgZmllbGQgaGFzIGEgbnVsbCB2YWx1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmbGRJZHhcIj50aGUgaW5kZXggb2YgdGhlIGZpZWxkIHRvIGNoZWNrPC9wYXJhbT5cclxuICBJc051bGwoZmxkSWR4OiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIHRoaXMuY2hlY2tGbGFncyhmbGRJZHgpO1xyXG4gICAgcmV0dXJuICgodGhpcy5fZmxhZ3NbZmxkSWR4XSAmIFJlY29yZC5GTEFHX05VTEwpID09PSBSZWNvcmQuRkxBR19OVUxMKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgYSBmaWVsZCBoYXMgYSBudWxsIHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZsZElkeFwiPnRoZSBpbmRleCBvZiB0aGUgZmllbGQgdG8gY2hlY2s8L3BhcmFtPlxyXG4gIGlzTGlua0ludmFsaWQoZmxkSWR4OiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIHRoaXMuY2hlY2tGbGFncyhmbGRJZHgpO1xyXG4gICAgcmV0dXJuICgodGhpcy5fZmxhZ3NbZmxkSWR4XSAmIFJlY29yZC5GTEFHX0lOVkFMSUQpID09PSBSZWNvcmQuRkxBR19JTlZBTElEKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgYSBmaWVsZCBoYXMgbW9kaWZpZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZmxkSWR4XCI+dGhlIGluZGV4IG9mIHRoZSBmaWVsZCB0byBjaGVjazwvcGFyYW0+XHJcbiAgaXNGbGRNb2RpZmllZChmbGRJZHg6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgdGhpcy5jaGVja0ZsYWdzKGZsZElkeCk7XHJcbiAgICByZXR1cm4gKCh0aGlzLl9mbGFnc1tmbGRJZHhdICYgUmVjb3JkLkZMQUdfTU9ESUZJRUQpID09PSBSZWNvcmQuRkxBR19NT0RJRklFRCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIGEgZmllbGQgaGFzIG1vZGlmaWVkIGF0IGxlYXN0IG9uY2VcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZmxkSWR4XCI+dGhlIGluZGV4IG9mIHRoZSBmaWVsZCB0byBjaGVjazwvcGFyYW0+XHJcbiAgSXNGbGRNb2RpZmllZEF0TGVhc3RPbmNlKGZsZElkeDogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICB0aGlzLmNoZWNrRmxhZ3MoZmxkSWR4KTtcclxuICAgIHJldHVybiAoKHRoaXMuX2ZsYWdzW2ZsZElkeF0gJiBSZWNvcmQuRkxBR19NT0RJRklFRF9BVExFQVNUX09OQ0UpID09PSBSZWNvcmQuRkxBR19NT0RJRklFRF9BVExFQVNUX09OQ0UpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiBhIGZpZWxkIGhhcyBtb2RpZmllZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmbGRJZHhcIj50aGUgaW5kZXggb2YgdGhlIGZpZWxkIHRvIGNoZWNrPC9wYXJhbT5cclxuICBpc0ZsZFVwZGF0ZWQoZmxkSWR4OiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIHRoaXMuY2hlY2tGbGFncyhmbGRJZHgpO1xyXG4gICAgcmV0dXJuICgodGhpcy5fZmxhZ3NbZmxkSWR4XSAmIFJlY29yZC5GTEFHX1VQREFURUQpID09PSBSZWNvcmQuRkxBR19VUERBVEVEKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgYSBmaWVsZCB0byBoYXZlIGEgbnVsbCB2YWx1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmbGRJZHhcIj50aGUgaW5kZXggb2YgdGhlIGZpZWxkPC9wYXJhbT5cclxuICBwdWJsaWMgc2V0RmxhZyhmbGRJZHg6IG51bWJlciwgYUZsYWc6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5jaGVja0ZsYWdzKGZsZElkeCk7XHJcbiAgICB0aGlzLl9mbGFnc1tmbGRJZHhdID0gdGhpcy5fZmxhZ3NbZmxkSWR4XSB8IGFGbGFnO1xyXG4gICAgLy8gTm90ZTogd2Ugb25seSBzZXQgdGhlIGhpc3RvcnkgZmxhZ3MuIFdlIGRvbnQgY2xlYXIgdGhlbSBoZXJlLiBXZSBvbmx5IGNsZWFyIHRoZW0gYWZ0ZXIgWE1MIHdhcyBkdW1wZWQuXHJcbiAgICBpZiAoYUZsYWcgPT09IFJlY29yZC5GTEFHX0NSU1JfTU9ESUZJRUQpXHJcbiAgICAgIHRoaXMuX2ZsYWdzSGlzdG9yeVtmbGRJZHhdID0gdGhpcy5fZmxhZ3NIaXN0b3J5W2ZsZElkeF0gfCBhRmxhZztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgYSBmaWVsZCB0byBoYXZlIGEgbm9uLW51bGwgdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZmxkSWR4XCI+dGhlIGluZGV4IG9mIHRoZSBmaWVsZDwvcGFyYW0+XHJcbiAgY2xlYXJGbGFnKGZsZElkeDogbnVtYmVyLCBhRmxhZ3M6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5jaGVja0ZsYWdzKGZsZElkeCk7XHJcbiAgICB0aGlzLl9mbGFnc1tmbGRJZHhdID0gdGhpcy5fZmxhZ3NbZmxkSWR4XSAmIH5hRmxhZ3M7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2xlYXIgdGhlIGZsYWdzIGhpc3RvcnkuIFRoaXMgc2hvdWxkIG9ubHkgYmUgZG9uZSBhZnRlciBhIGNvbW1pdC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGNsZWFyRmxhZ3NIaXN0b3J5KCk6IHZvaWQge1xyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuX2ZsYWdzLmxlbmd0aDsgaSA9IGkgKyAxKVxyXG4gICAgICB0aGlzLl9mbGFnc0hpc3RvcnlbaV0gPSAwO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNsZWFyIGZsYWcgZm9yIGFsbCBmaWVsZHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGNsZWFyRmxhZ3MoYUZsYWdzOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLl9mbGFncy5sZW5ndGg7IGkgPSBpICsgMSlcclxuICAgICAgdGhpcy5jbGVhckZsYWcoaSwgYUZsYWdzKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjbGVhciBmbGFnIGZvciBhbGwgcmVhbCBmaWVsZHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGNsZWFyRmxhZ3NGb3JSZWFsT25seShhRmxhZ3M6IG51bWJlcik6IHZvaWQge1xyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuX2ZsYWdzLmxlbmd0aDsgaSA9IGkgKyAxKSB7XHJcbiAgICAgIGxldCBmaWVsZDogRmllbGQgPSA8RmllbGQ+dGhpcy5nZXRGaWVsZHNUYWIoKS5nZXRGaWVsZChpKTtcclxuICAgICAgaWYgKCFmaWVsZC5Jc1ZpcnR1YWwpIHtcclxuICAgICAgICB0aGlzLmNsZWFyRmxhZyhpLCBhRmxhZ3MpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2xlYXIgYSBzcGVjaWZpYyBmaWVsZCBmbGFnIGZyb20gdGhlIGhpc3RvcnlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGNsZWFySGlzdG9yeUZsYWcoZmxkSWR4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9mbGFnc0hpc3RvcnkgIT09IG51bGwgJiYgZmxkSWR4IDwgdGhpcy5nZXRGaWVsZHNUYWIoKS5nZXRTaXplKCkgJiYgZmxkSWR4ID49IDApIHtcclxuICAgICAgdGhpcy5fZmxhZ3NIaXN0b3J5W2ZsZElkeF0gPSAwO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNoZWNrIHRoZSBleGlzdGVuY2Ugb2YgdGhlIGZsYWdzIGFuZCB0aGUgdmFsaWRpdHkgb2YgdGhlIGZpZWxkIGluZGV4XHJcbiAgLy8vICAgdGhyb3dzIGFuIGVycm9yIGluIGNhc2Ugb2YgYSBmYWlsdXJlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZsZElkeFwiPnRoZSBpbmRleCBvZiB0aGUgZmllbGQ8L3BhcmFtPlxyXG4gIGNoZWNrRmxhZ3MoZmxkSWR4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9mbGFncyA9PT0gbnVsbCB8fCBmbGRJZHggPj0gdGhpcy5nZXRGaWVsZHNUYWIoKS5nZXRTaXplKCkgfHwgZmxkSWR4IDwgMCkge1xyXG4gICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25FeGNlcHRpb24oXCJDYW5ub3QgZmluZCBmbGFnc1wiKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXN0YXJ0IHRoZSByZWNvcmQncyBzZXR0aW5ncy4gVGhpcyBtaWdodCBiZSBuZWVkZWQgYWZ0ZXIgYSBzZXJ2ZXIncyByb2xsYmFja1xyXG4gIC8vLyAgIG9yIHJlc3RhcnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwib2xkTW9kZVwiPnRoZSBvbGQgcmVjb3JkIG1vZGU8L3BhcmFtPlxyXG4gIHJlc3RhcnQob2xkTW9kZTogRGF0YU1vZGlmaWNhdGlvblR5cGVzKTogdm9pZCB7XHJcbiAgICBsZXQgdGFzazogVGFzayA9IDxUYXNrPnRoaXMuX2RhdGF2aWV3LmdldFRhc2soKTtcclxuXHJcbiAgICBpZiAob2xkTW9kZSA9PT0gRGF0YU1vZGlmaWNhdGlvblR5cGVzLk5vbmUpIHtcclxuICAgICAgbGV0IHJlYzogUmVjb3JkID0gdGhpcy5fZGF0YXZpZXcuZ2V0Q3VyclJlYygpO1xyXG4gICAgICBsZXQgaXNDdXJyUmVjOiBib29sZWFuID0gKHJlYyAhPSBudWxsICYmIHJlYy5nZXRJZCgpID09PSB0aGlzLl9pZCk7XHJcblxyXG4gICAgICBpZiAoKHRoaXMuX2RhdGF2aWV3LmdldFRhc2soKSkuZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSlcclxuICAgICAgICBpZiAoaXNDdXJyUmVjICYmICF0YXNrLmdldEFmdGVyUmV0cnkoKSAmJiB0YXNrLlRyeWluZ1RvQ29tbWl0ICYmICF0aGlzLl9kYXRhdmlldy5pblJvbGxiYWNrKCkpXHJcbiAgICAgICAgICBvbGRNb2RlID0gRGF0YU1vZGlmaWNhdGlvblR5cGVzLlVwZGF0ZTtcclxuICAgICAgICBlbHNlIG9sZE1vZGUgPSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuSW5zZXJ0O1xyXG5cclxuICAgICAgZWxzZSBvbGRNb2RlID0gRGF0YU1vZGlmaWNhdGlvblR5cGVzLlVwZGF0ZTtcclxuICAgIH1cclxuICAgIHRoaXMuc2V0TW9kZShvbGRNb2RlKTtcclxuICAgIGlmIChvbGRNb2RlID09PSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuSW5zZXJ0KVxyXG4gICAgICB0aGlzLnNldE5ld1JlYygpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldHMgdGhlIHZhbHVlIG9mIGxhdGVDb21wdXRlIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidmFsXCI+dGhlIG5ldyB2YWx1ZSBvZiB0aGUgZmxhZzwvcGFyYW0+XHJcbiAgc2V0TGF0ZUNvbXB1dGUodmFsOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl9sYXRlQ29tcHV0ZSA9IHZhbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBcImxhdGVDb21wdXRlXCIgZmxhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgbGF0ZUNvbXB1dGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fbGF0ZUNvbXB1dGU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFwiaW4gZGVsZXRlIHByb2Nlc3NcIiBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ2YWxcIj48L3BhcmFtPlxyXG4gIHNldEluRGVsZXRlUHJvY2Vzcyh2YWw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuX2luRGVsZXRlUHJvY2VzcyA9IHZhbDtcclxuICB9XHJcblxyXG4gIGluRGVsZXRlUHJvY2VzcygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pbkRlbGV0ZVByb2Nlc3M7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2FsbCB0aGlzIGZ1bmN0aW9uIHdoZW4gcmVtb3ZpbmcgdGhlIHJlY29yZCwgaXQgd2lsbCBkZWNyZWFzZSB0aGUgcmVmZXJlbmNlIGNvdW50XHJcbiAgLy8vICAgb2YgaXRzIGRhdGEgY29udHJvbHMgdG8gdGhlaXIgZGNWYWx1ZXNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHJlbW92ZVJlY0Zyb21EYygpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9kY1JlZnMgIT09IG51bGwpIHtcclxuICAgICAgdGhpcy5fZGNSZWZzLkRpc3Bvc2UoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjb21wYXJlIHRoZSBkYXRhIG9mIHRoaXMgcmVjb3JkIHdpdGggdGhlIGRhdGEgb2YgYSBkaWZmZXJlbnQgcmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJlY1wiPnRoZSBvdGhlciByZWNvcmQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3VyclJlY1wiPlRSVUUgaWYgd2UgYXJlIGNvbXBhcmluZyB0d28gJ2N1cnJlbnQgcmVjb3Jkcycgb3RoZXJ3aXNlIHNob3VsZCBiZSBmYWxzZS48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY2hlY2tPbmx5UGFyZXRPZkRhdGF2aWV3XCI+RkFMU0UgaWYgd2Ugd2FudCB0byBjaGVjayBhbGwgdGhlIGZpZWxkcyAsIGluY2x1ZGluZyB0aG9zZSB0aGF0IGFyZSBub3QgcGFydCBvZiBkYXRhIHZpZXcuPC9wYXJhbT5cclxuICBpc1NhbWVSZWNEYXRhKHJlYzogUmVjb3JkLCBjdXJyUmVjOiBib29sZWFuLCBjaGVja09ubHlQYXJldE9mRGF0YXZpZXc6IGJvb2xlYW4pOiBib29sZWFuIHtcclxuICAgIGxldCBzaXplOiBudW1iZXIgPSB0aGlzLmdldFNpemVGbGQoY3VyclJlYyk7XHJcbiAgICBsZXQgc3RhcnQ6IG51bWJlciA9IHRoaXMuZ2V0RnJvbUZsZElkeChjdXJyUmVjKTtcclxuICAgIGxldCBpOiBudW1iZXI7XHJcbiAgICBsZXQgZmllbGQ6IEZpZWxkO1xyXG5cclxuICAgIC8vIGNvbXBhcmUgcmVmZXJlbmNlc1xyXG4gICAgaWYgKHRoaXMgPT09IHJlYylcclxuICAgICAgcmV0dXJuIHRydWU7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgaWYgKHJlYy5nZXRTaXplRmxkKGN1cnJSZWMpICE9PSBzaXplKVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgIGlmIChyZWMuZ2V0RnJvbUZsZElkeChjdXJyUmVjKSAhPT0gc3RhcnQpXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgZm9yIChpID0gMDsgaSA8IHN0YXJ0ICsgc2l6ZTsgaSsrKSB7XHJcbiAgICAgICAgZmllbGQgPSA8RmllbGQ+dGhpcy5nZXRGaWVsZHNUYWIoKS5nZXRGaWVsZChpKTtcclxuXHJcbiAgICAgICAgaWYgKGNoZWNrT25seVBhcmV0T2ZEYXRhdmlldyAmJiAhZmllbGQuUGFydE9mRGF0YXZpZXcpXHJcbiAgICAgICAgICBjb250aW51ZTtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmZsZFZhbHNFcXVhbChyZWMsIGkpKVxyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXJyKSB7XHJcbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBBcHBsaWNhdGlvbkV4Y2VwdGlvbilcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIHRocm93ICBlcnI7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY29tcGFyZSB0d28gZmllbGQgdmFsdWVzIGJldHdlZW4gdGhpcyByZWNvcmQgYW5kIHRoZSBnaXZlbiByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicmVjXCI+dGhlIHJlY29yZCB0byBjb21wYXJlIHdpdGg8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZmxkSWR4XCI+dGhlIGluZGV4IG9mIHRoZSBmaWVsZCB0byBjb21wYXJlPC9wYXJhbT5cclxuICBmbGRWYWxzRXF1YWwocmVjOiBSZWNvcmQsIGZsZElkeDogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgdHlwZTogU3RvcmFnZUF0dHJpYnV0ZSA9IHRoaXMuZ2V0RmllbGRzVGFiKCkuZ2V0RmllbGQoZmxkSWR4KS5nZXRUeXBlKCk7XHJcbiAgICByZXR1cm4gRXhwcmVzc2lvbkV2YWx1YXRvci5tZ1ZhbHNFcXVhbCh0aGlzLkdldEZpZWxkVmFsdWUoZmxkSWR4KSwgdGhpcy5Jc051bGwoZmxkSWR4KSwgdHlwZSwgcmVjLkdldEZpZWxkVmFsdWUoZmxkSWR4KSwgcmVjLklzTnVsbChmbGRJZHgpLCB0eXBlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIGhhc2gga2V5IG9iamVjdCBvZiB0aGlzIHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0SGFzaEtleSgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2hhc2hLZXk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0cyB0aGUgcmVmZXJlbmNlIHRvIHRoZSByZWNvcmRzIGFmdGVyIHRoaXMgb25lLCBpbiBhIGxpc3Qgb2YgcmVjcy5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibmV4dFJlY1wiPmlzIHRoZSBuZXh0IHJlY29yZCAob3IgbnVsbCBmb3IgdGhlIGxhc3QgcmVjb3JkKTwvcGFyYW0+XHJcbiAgc2V0TmV4dFJlYyhuZXh0UmVjOiBSZWNvcmQpOiB2b2lkIHtcclxuICAgIHRoaXMuX25leHQgPSBuZXh0UmVjO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldHMgdGhlIHJlZmVyZW5jZSB0byB0aGUgcmVjb3JkcyBiZWZvcmUgdGhpcyBvbmUsIGluIGEgbGlzdCBvZiByZWNzLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwcmV2UmVjXCI+aXMgdGhlIHByZXZpb3VzIHJlY29yZCAob3IgbnVsbCBmb3IgdGhlIGZpcnN0IHJlY29yZCk8L3BhcmFtPlxyXG4gIHNldFByZXZSZWMocHJldlJlYzogUmVjb3JkKTogdm9pZCB7XHJcbiAgICB0aGlzLl9wcmV2ID0gcHJldlJlYztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdGhlIHJlY29yZCB3aG9zZSBsb2NhdGlvbiBpcyBiZWZvcmUgdGhpcyBvbmVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldFByZXZSZWMoKTogUmVjb3JkIHtcclxuICAgIHJldHVybiB0aGlzLl9wcmV2O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0aGUgcmVjb3JkIHdoaWNoIGZvbGxvd3MgdGhpcyBvbmVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldE5leHRSZWMoKTogUmVjb3JkIHtcclxuICAgIHJldHVybiB0aGlzLl9uZXh0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiBEY1JlZnNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldERjUmVmcygpOiBPYmplY3RSZWZlcmVuY2VzQ29sbGVjdGlvbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGNSZWZzLkNsb25lKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IERjUmVmc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0RGNSZWZzKG5ld0RjUmVmczogT2JqZWN0UmVmZXJlbmNlc0NvbGxlY3Rpb24pOiB2b2lkIHtcclxuICAgIHRoaXMucmVtb3ZlUmVjRnJvbURjKCk7XHJcbiAgICB0aGlzLl9kY1JlZnMgPSBuZXdEY1JlZnMuQ2xvbmUoKTtcclxuICAgIHRoaXMuU2V0RGNWYWx1ZUlkKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIG9uZSBvZiB0aGUgcmVhbCB2YXJpYWJsZXMgd2FzIG1vZGlmaWVkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICByZWFsTW9kaWZpZWQoKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgYlJjOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgdGFiU2l6ZTogbnVtYmVyID0gdGhpcy5nZXRGaWVsZHNUYWIoKS5nZXRTaXplKCk7XHJcbiAgICBsZXQgajogbnVtYmVyO1xyXG5cclxuICAgIGZvciAoaiA9IDA7IGogPCB0YWJTaXplOyBqKyspIHtcclxuICAgICAgLy8gZm9yIGV2ZXJ5IG1vZGlmaWVkIGZpZWxkIGNoZWNrIGlmIGl0IGlzIGEgcmVhbCBmaWVsZFxyXG4gICAgICBpZiAoKHRoaXMuX2ZsYWdzW2pdICYgUmVjb3JkLkZMQUdfTU9ESUZJRUQpID09PSBSZWNvcmQuRkxBR19NT0RJRklFRCkge1xyXG4gICAgICAgIGlmICghKCg8RmllbGQ+dGhpcy5nZXRGaWVsZHNUYWIoKS5nZXRGaWVsZChqKSkuSXNWaXJ0dWFsKSkge1xyXG4gICAgICAgICAgYlJjID0gdHJ1ZTsgLy8gaWYgYSByZWFsIG1vZGlmaWVkIGZpZWxkIHdhcyBmb3VuZCwgcmV0dXJuIHdpdGggdHJ1ZVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYlJjO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIHhtbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgcmVjb3JkIC0gdGhpcyBtZXRob2QgaXMgZGVmaW5lZCBzbyB3ZVxyXG4gIC8vLyAgIGNhbiB1c2UgdGhlIHJlY29yZCByZWZlcmVuY2UgaW4gYSBzdHJpbmcgY29uY2F0ZW5hdGlvbiBvcGVyYXRpb25zIGFuZCBwcmludCBjYWxsc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgVG9TdHJpbmcoKTogc3RyaW5nIHtcclxuICAgIGxldCBzdHI6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpO1xyXG4gICAgdGhpcy5idWlsZFhNTChzdHIsICh0aGlzLl9kYXRhdmlldy5nZXRDdXJyUmVjKCkpLmdldElkKCkgPT09IHRoaXMuX2lkLCB0cnVlKTtcclxuICAgIHJldHVybiBzdHIuVG9TdHJpbmcoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIHZhbHVlIG9mIHRoZSBzZW5kVG9TZXJ2ZXIgZmxhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0U2VuZFRvU2VydmVyKHZhbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5fc2VuZFRvU2VydmVyID0gdmFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0aGUgc2l6ZSBpbiBrYiBvZiB0aGUgcmVjb3JkcyBlLmkuIHRoZSBzdW0gb2YgYWxsIGZpZWxkcyBpbiB0aGUgcmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRSZWNTaXplKCk6IG51bWJlciB7XHJcbiAgICBsZXQgc3VtOiBudW1iZXIgPSAwO1xyXG5cclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLmdldEZpZWxkc1RhYigpLmdldFNpemUoKTsgaSA9IGkgKyAxKSB7XHJcbiAgICAgIGxldCBmaWVsZDogRmllbGQgPSA8RmllbGQ+dGhpcy5nZXRGaWVsZHNUYWIoKS5nZXRGaWVsZChpKTtcclxuICAgICAgc3VtID0gc3VtICsgZmllbGQuZ2V0U2l6ZSgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHN1bTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjb3B5IHRoZSBtb2RpZmllZCBjcnNyIGZsYWdzIGZyb20gYSBnaXZlbiByZWMuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJlY1wiPnRoZSBzb3VyY2UgcmVjb3JkPC9wYXJhbT5cclxuICBjb3B5Q3Jzck1vZGlmaWVkRmxhZ3MocmVjOiBSZWNvcmQpOiB2b2lkIHtcclxuICAgIGxldCB0YWJTaXplOiBudW1iZXIgPSB0aGlzLmdldEZpZWxkc1RhYigpLmdldFNpemUoKTtcclxuICAgIGxldCBqOiBudW1iZXI7XHJcblxyXG4gICAgZm9yIChqID0gMDsgaiA8IHRhYlNpemU7IGorKykge1xyXG4gICAgICB0aGlzLl9mbGFnc1tqXSA9IHJlYy5fZmxhZ3Nbal07XHJcbiAgICAgIHRoaXMuX2ZsYWdzW2pdID0gdGhpcy5fZmxhZ3Nbal0gJiBSZWNvcmQuRkxBR19DUlNSX01PRElGSUVEO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGZvciBhIHRhYmxlIGNhY2hlIHJlY29yZCByZXR1cm5zIHRoZSByZWNvcmQncyBkYl9wb3MgdmFsdWUgYXMgYSBiYXNlNjQgc3RyaW5nXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXREYlBvc1ZhbCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX2RiUG9zQmFzZTY0VmFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGJ1aWxkIHRoZSBzdHJpbmcgdGhhdCByZXByZXNlbnQgdGhlIGN1cnJlbnQgbGlua3MgZmllbGRzIGRiX3BvcyB2YWx1ZXNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGJ1aWxkTGlua3NQb3NTdHIoKTogdm9pZCB7XHJcbiAgICBsZXQgdGJsOiBEYXRhdmlld0hlYWRlcnMgPSAoPFRhc2s+dGhpcy5fZGF0YXZpZXcuZ2V0VGFzaygpKS5nZXREYXRhdmlld0hlYWRlcnMoKTtcclxuICAgIGlmICh0YmwgIT09IG51bGwpIHtcclxuICAgICAgdGhpcy5fbGlua3NGbGRzUG9zID0gdGJsLmJ1aWxkRGJQb3NTdHJpbmcoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldEZvcmNlU2F2ZU9yZyh2YWw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuX2ZvcmNlU2F2ZU9yZyA9IHZhbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSByZWxpbmtlZCBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRGb3JjZVNhdmVPcmcoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZm9yY2VTYXZlT3JnO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHRydWUsIGlmIGV4aXQgZnJvbSB0aGlzIHJlY29yZCB3aWxsIGNhdXNlIGludmFsaWRhdGlvbiBvZiB0aGUgdGFibGUgZHVlIHRvIHZpdHJ1YWwgcmVjb21wdXRlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGlzQ2F1c2VJbnZhbGlkYXRpb24oKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fY2F1c2VJbnZhbGlkYXRpb247XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgaWYgY2F1c2VJbnZhbGlkYXRpb24gaXMgdHJ1ZSwgIGV4aXQgZnJvbSB0aGlzIHJlY29yZCB3aWxsIGNhdXNlIGludmFsaWRhdGlvbiBvZiB0aGUgdGFibGUgZHVlIHRvIHZpdHJ1YWwgcmVjb21wdXRlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNhdXNlSW52YWxpZGF0aW9uXCI+PC9wYXJhbT5cclxuICBzZXRDYXVzZUludmFsaWRhdGlvbihjYXVzZUludmFsaWRhdGlvbjogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5fY2F1c2VJbnZhbGlkYXRpb24gPSBjYXVzZUludmFsaWRhdGlvbjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBcImNvbXB1dGVkXCIgZmxhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaXNDb21wdXRlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9jb21wdXRlZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIHZhbHVlIG9mIHRoZSBcImNvbXB1dGVkXCIgZmxhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ2YWxcIj50aGUgbmV3IHZhbHVlIG9mIHRoZSBmbGFnPC9wYXJhbT5cclxuICBzZXRDb21wdXRlZCh2YWw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuX2NvbXB1dGVkID0gdmFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgdmFsdWUgb2YgdGhlIFwiaW4gY29tcHV0ZVwiIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidmFsXCI+dGhlIG5ldyB2YWx1ZSBvZiB0aGUgZmxhZzwvcGFyYW0+XHJcbiAgc2V0SW5Db21wdXRlKHZhbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKCF2YWwpXHJcbiAgICAgIHRoaXMuc2V0Q29tcHV0ZWQodHJ1ZSk7XHJcbiAgICB0aGlzLl9pbkNvbXB1dGUgPSB2YWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSB2YWx1ZSBvZiB0aGUgXCJpbiByZWNvbXB1dGVcIiBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbFwiPnRoZSBuZXcgdmFsdWUgb2YgdGhlIGZsYWc8L3BhcmFtPlxyXG4gIHNldEluUmVjb21wdXRlKHZhbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5faW5SZWNvbXB1dGUgPSB2YWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSBtb2RlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm5ld01vZGVcIj50aGUgbmV3IG1vZGU6IENyZWF0ZWQsIE1vZGlmaWVkLCBEZWxldGVkPC9wYXJhbT5cclxuICBzZXRNb2RlKG5ld01vZGU6IERhdGFNb2RpZmljYXRpb25UeXBlcyk6IHZvaWQge1xyXG4gICAgc3dpdGNoIChuZXdNb2RlKSB7XHJcbiAgICAgIGNhc2UgRGF0YU1vZGlmaWNhdGlvblR5cGVzLk5vbmU6XHJcbiAgICAgIGNhc2UgRGF0YU1vZGlmaWNhdGlvblR5cGVzLkluc2VydDpcclxuICAgICAgY2FzZSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuVXBkYXRlOlxyXG4gICAgICBjYXNlIERhdGFNb2RpZmljYXRpb25UeXBlcy5EZWxldGU6XHJcbiAgICAgICAgaWYgKHRoaXMuX21vZGUgPT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5Ob25lIHx8XHJcbiAgICAgICAgICB0aGlzLl9tb2RlID09PSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuVXBkYXRlICYmIG5ld01vZGUgPT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5EZWxldGUpXHJcbiAgICAgICAgICB0aGlzLl9tb2RlID0gbmV3TW9kZTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coXCJpbiBSZWNvcmQuc2V0TW9kZSgpOiBpbGxlZ2FsIG1vZGU6IFwiICsgbmV3TW9kZSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSByZWNvcmQgbW9kZSB0byBcIm5vbmVcIlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgY2xlYXJNb2RlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fbW9kZSA9IERhdGFNb2RpZmljYXRpb25UeXBlcy5Ob25lO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHN3aXRjaCBvZmYgdGhlIG5ld1JlYyBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXRPbGRSZWMoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9uZXdSZWMgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzd2l0Y2ggb24gdGhlIG5ld1JlYyBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXROZXdSZWMoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9uZXdSZWMgPSB0cnVlO1xyXG4gIH1cclxuXHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2VyaWFsaXplIGFuIGl0ZW0gKGZpZWxkL2dsb2JhbCBwYXJhbS8uLi4pLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ2YWxcIj5pdGVtJ3MgdmFsdWU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaXRlbUF0dHJcIj5pdGVtJ3MgYXR0cmlidXRlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNlbGxBdHRyXCI+Y2VsbCdzIGF0dHJpYnV0ZSAtIHJlbGV2YW50IG9ubHkgaWYgJ2l0ZW1BdHRyJyBpcyB2ZWN0b3I8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiVG9CYXNlNjRcIj4+ZGVjaWRlIEJhc2U2NCBlbmNvZGluZyBpcyB0byBiZSBkb25lPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+c2VyaWFsaXplZCBpdGVtVmFsIDwvcmV0dXJucz5cclxuICBzdGF0aWMgc2VyaWFsaXplSXRlbVZhbChpdGVtVmFsOiBzdHJpbmcsIGl0ZW1BdHRyOiBTdG9yYWdlQXR0cmlidXRlLCBjZWxsQXR0cjogU3RvcmFnZUF0dHJpYnV0ZSwgVG9CYXNlNjQ6IGJvb2xlYW4pOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIFJlY29yZFV0aWxzLnNlcmlhbGl6ZUl0ZW1WYWwoaXRlbVZhbCwgaXRlbUF0dHIsIGNlbGxBdHRyLCBUb0Jhc2U2NCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHNldHMgRENWYWwgSWQgaW50byBNZ0NvbnRyb2xzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBTZXREY1ZhbHVlSWQoKTogdm9pZCB7XHJcbiAgICBsZXQgZm9ybTogTWdGb3JtID0gPE1nRm9ybT50aGlzLl9kYXRhdmlldy5nZXRUYXNrKCkuZ2V0Rm9ybSgpO1xyXG4gICAgbGV0IG1nQ29udHJvbDogTWdDb250cm9sID0gbnVsbDtcclxuXHJcbiAgICAvLyBpZiB0aGUgZm9ybSBkb2Vzbid0IGhhdmUgYW55IHNlbGVjdGlvbiBjb250cm9sLCBkY1JlZnMgd291bGQgYmUgbnVsbFxyXG4gICAgaWYgKGZvcm0gIT0gbnVsbCAmJiB0aGlzLl9kY1JlZnMgIT0gbnVsbCkge1xyXG5cclxuICAgICAgdGhpcy5fZGNSZWZzLlJlZnMuZm9yRWFjaCgoZGNSZWY6IERjVmFsdWVzUmVmZXJlbmNlKSA9PiB7XHJcbiAgICAgICAgbWdDb250cm9sID0gPE1nQ29udHJvbD5mb3JtLmdldEN0cmwoZGNSZWYuZGl0SWR4KTtcclxuICAgICAgICBpZiAobWdDb250cm9sICE9IG51bGwpXHJcbiAgICAgICAgICBtZ0NvbnRyb2wuc2V0RGNWYWxJZChkY1JlZi5EY1ZhbHVlcy5nZXRJZCgpKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHJlc2V0IHRoZSBEQ1ZhbCBJZCBpbiBNZ0NvbnRyb2xzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICByZXNldERjVmFsdWVJZCgpOiB2b2lkIHtcclxuICAgIGxldCBmb3JtOiBNZ0Zvcm0gPSA8TWdGb3JtPnRoaXMuX2RhdGF2aWV3LmdldFRhc2soKS5nZXRGb3JtKCk7XHJcbiAgICBsZXQgbWdDb250cm9sOiBNZ0NvbnRyb2wgPSBudWxsO1xyXG5cclxuICAgIC8vIGlmIHRoZSBmb3JtIGRvZXNuJ3QgaGF2ZSBhbnkgc2VsZWN0aW9uIGNvbnRyb2wsIGRjUmVmcyB3b3VsZCBiZSBudWxsXHJcbiAgICBpZiAoZm9ybSAhPSBudWxsICYmIHRoaXMuX2RjUmVmcyAhPSBudWxsKSB7XHJcbiAgICAgIHRoaXMuX2RjUmVmcy5SZWZzLmZvckVhY2goZnVuY3Rpb24gKGRjUmVmOiBEY1ZhbHVlc1JlZmVyZW5jZSkge1xyXG4gICAgICAgIG1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+Zm9ybS5nZXRDdHJsKGRjUmVmLmRpdElkeCk7XHJcbiAgICAgICAgaWYgKG1nQ29udHJvbCAhPSBudWxsKVxyXG4gICAgICAgICAgbWdDb250cm9sLnNldERjVmFsSWQoRU1QVFlfRENSRUYpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIEFkZERjVmFsdWVzUmVmZXJlbmNlKGNvbnRyb2xJZDogbnVtYmVyLCBkY1ZhbHVlc0lkOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGxldCBkY1ZhbHVlczogRGNWYWx1ZXMgPSB0aGlzLl9kYXRhdmlldy5nZXREY1ZhbHVlcyhkY1ZhbHVlc0lkKTtcclxuICAgIGxldCBkY1JlZjogRGNWYWx1ZXNSZWZlcmVuY2UgPSBuZXcgRGNWYWx1ZXNSZWZlcmVuY2UoY29udHJvbElkLCBkY1ZhbHVlcyk7XHJcbiAgICBpZiAodGhpcy5fZGNSZWZzID09PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuX2RjUmVmcyA9IG5ldyBPYmplY3RSZWZlcmVuY2VzQ29sbGVjdGlvbigpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fZGNSZWZzLkFkZChkY1JlZik7XHJcbiAgfVxyXG59XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbi8vLyBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBsaW5rIGJldHdlZW4gYSBkYXRhIGNvbnRyb2wgYW5kIGl0cyBEY1ZhbHVlcyBvYmplY3QuXHJcbi8vLyA8L3N1bW1hcnk+XHJcbmV4cG9ydCBjbGFzcyBEY1ZhbHVlc1JlZmVyZW5jZSBleHRlbmRzIE9iamVjdFJlZmVyZW5jZUJhc2Uge1xyXG4gIGRpdElkeDogbnVtYmVyID0gMDtcclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gR2V0cyB0aGUgcmVmZXJlbmNlZCBEY1ZhbHVlcy5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldCBEY1ZhbHVlcygpOiBEY1ZhbHVlcyB7XHJcbiAgICByZXR1cm4gPERjVmFsdWVzPnRoaXMuUmVmZXJlbnQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQ1RPUlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjb3VwbGVcIj5hIHN0cmluZyB0aGF0IHJlcHJlc2VudHMgdGhlIGRpdElkeCAmIGRjSWQgc2VwYXJhdGVkIGJ5IGEgY29tbWE8L3BhcmFtPlxyXG4gIGNvbnN0cnVjdG9yKGNvbnRyb2xJZDogbnVtYmVyLCByZWZlcmVuY2VkRGNWYWx1ZXM6IERjVmFsdWVzKSB7XHJcbiAgICBzdXBlcihyZWZlcmVuY2VkRGNWYWx1ZXMpO1xyXG4gICAgdGhpcy5kaXRJZHggPSBjb250cm9sSWQ7XHJcbiAgfVxyXG5cclxuICBDbG9uZSgpOiBPYmplY3RSZWZlcmVuY2VCYXNlIHtcclxuICAgIHJldHVybiBuZXcgRGNWYWx1ZXNSZWZlcmVuY2UodGhpcy5kaXRJZHgsIDxEY1ZhbHVlcz50aGlzLlJlZmVyZW50KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gQ3JlYXRlcyBhIG5ldyBEY1ZhbHVlc1JlZmVyZW5jZSBmcm9tIGEgc3RyaW5nIGNvbnRhaW5pbmcgdHdvIGludGVnZXJzLCB3aGVyZSB0aGVcclxuICAvLy8gZmlyc3QgaXMgdGhlIGluZGV4IG9mIHRoZSBjb250cm9sIGluIHRoZSBmb3JtIChkaXQgaW5kZXgpIGFuZCB0aGUgc2Vjb25kIGlzIHRoZVxyXG4gIC8vLyBEY1ZhbHVlcyBvYmplY3QgaWRlbnRpZmllci5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNvdXBsZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZGNWYWx1ZXNPd25lclwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBzdGF0aWMgUGFyc2UoY291cGxlOiBzdHJpbmcsIGRjVmFsdWVzT3duZXI6IERhdGFWaWV3QmFzZSk6IERjVmFsdWVzUmVmZXJlbmNlIHtcclxuICAgIGxldCBjb21tYVBvczogbnVtYmVyID0gY291cGxlLmluZGV4T2YoXCIsXCIpO1xyXG5cclxuICAgIGxldCBjb250cm9sSWQ6IG51bWJlciA9IE5OdW1iZXIuUGFyc2UoY291cGxlLnN1YnN0cigwLCBjb21tYVBvcykpO1xyXG4gICAgbGV0IGRjSWQ6IG51bWJlciA9IE5OdW1iZXIuUGFyc2UoY291cGxlLnN1YnN0cihjb21tYVBvcyArIDEpKTtcclxuXHJcbiAgICByZXR1cm4gbmV3IERjVmFsdWVzUmVmZXJlbmNlKGNvbnRyb2xJZCwgZGNWYWx1ZXNPd25lci5nZXREY1ZhbHVlcyhkY0lkKSk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|