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